summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
Diffstat (limited to 'editor')
-rw-r--r--editor/SCsub96
-rw-r--r--editor/animation_bezier_editor.cpp213
-rw-r--r--editor/animation_bezier_editor.h12
-rw-r--r--editor/animation_track_editor.cpp1364
-rw-r--r--editor/animation_track_editor.h50
-rw-r--r--editor/animation_track_editor_plugins.cpp288
-rw-r--r--editor/animation_track_editor_plugins.h82
-rw-r--r--editor/array_property_edit.cpp52
-rw-r--r--editor/array_property_edit.h1
-rw-r--r--editor/audio_stream_preview.cpp22
-rw-r--r--editor/code_editor.cpp652
-rw-r--r--editor/code_editor.h35
-rw-r--r--editor/collada/SCsub5
-rw-r--r--editor/collada/collada.cpp2574
-rw-r--r--editor/collada/collada.h647
-rw-r--r--editor/connections_dialog.cpp428
-rw-r--r--editor/connections_dialog.h51
-rw-r--r--editor/create_dialog.cpp866
-rw-r--r--editor/create_dialog.h65
-rw-r--r--editor/debugger/SCsub5
-rw-r--r--editor/debugger/editor_debugger_inspector.cpp269
-rw-r--r--editor/debugger/editor_debugger_inspector.h97
-rw-r--r--editor/debugger/editor_debugger_node.cpp647
-rw-r--r--editor/debugger/editor_debugger_node.h195
-rw-r--r--editor/debugger/editor_debugger_server.cpp112
-rw-r--r--editor/debugger/editor_debugger_server.h58
-rw-r--r--editor/debugger/editor_debugger_tree.cpp268
-rw-r--r--editor/debugger/editor_debugger_tree.h73
-rw-r--r--editor/debugger/editor_network_profiler.cpp201
-rw-r--r--editor/debugger/editor_network_profiler.h72
-rw-r--r--editor/debugger/editor_performance_profiler.cpp394
-rw-r--r--editor/debugger/editor_performance_profiler.h90
-rw-r--r--editor/debugger/editor_profiler.cpp751
-rw-r--r--editor/debugger/editor_profiler.h173
-rw-r--r--editor/debugger/editor_visual_profiler.cpp822
-rw-r--r--editor/debugger/editor_visual_profiler.h152
-rw-r--r--editor/debugger/script_editor_debugger.cpp1762
-rw-r--r--editor/debugger/script_editor_debugger.h275
-rw-r--r--editor/dependency_editor.cpp168
-rw-r--r--editor/dependency_editor.h10
-rw-r--r--editor/dictionary_property_edit.cpp27
-rw-r--r--editor/doc/SCsub5
-rw-r--r--editor/doc/doc_data.cpp1213
-rw-r--r--editor/doc/doc_data.h117
-rw-r--r--editor/doc/doc_dump.cpp303
-rw-r--r--editor/doc/doc_dump.h41
-rw-r--r--editor/doc_data.cpp1250
-rw-r--r--editor/doc_data.h124
-rw-r--r--editor/editor_about.cpp59
-rw-r--r--editor/editor_about.h3
-rw-r--r--editor/editor_asset_installer.cpp93
-rw-r--r--editor/editor_asset_installer.h4
-rw-r--r--editor/editor_atlas_packer.cpp24
-rw-r--r--editor/editor_audio_buses.cpp360
-rw-r--r--editor/editor_audio_buses.h42
-rw-r--r--editor/editor_autoload_settings.cpp222
-rw-r--r--editor/editor_autoload_settings.h12
-rw-r--r--editor/editor_builders.py50
-rw-r--r--editor/editor_data.cpp354
-rw-r--r--editor/editor_data.h23
-rw-r--r--editor/editor_dir_dialog.cpp70
-rw-r--r--editor/editor_dir_dialog.h3
-rw-r--r--editor/editor_export.cpp608
-rw-r--r--editor/editor_export.h103
-rw-r--r--editor/editor_feature_profile.cpp186
-rw-r--r--editor/editor_feature_profile.h8
-rw-r--r--editor/editor_file_dialog.cpp653
-rw-r--r--editor/editor_file_dialog.h77
-rw-r--r--editor/editor_file_system.cpp386
-rw-r--r--editor/editor_file_system.h14
-rw-r--r--editor/editor_folding.cpp41
-rw-r--r--editor/editor_folding.h5
-rw-r--r--editor/editor_fonts.cpp8
-rw-r--r--editor/editor_help.cpp565
-rw-r--r--editor/editor_help.h20
-rw-r--r--editor/editor_help_search.cpp277
-rw-r--r--editor/editor_help_search.h9
-rw-r--r--editor/editor_inspector.cpp966
-rw-r--r--editor/editor_inspector.h42
-rw-r--r--editor/editor_layouts_dialog.cpp43
-rw-r--r--editor/editor_layouts_dialog.h5
-rw-r--r--editor/editor_log.cpp56
-rw-r--r--editor/editor_log.h16
-rw-r--r--editor/editor_network_profiler.cpp211
-rw-r--r--editor/editor_network_profiler.h72
-rw-r--r--editor/editor_node.cpp2318
-rw-r--r--editor/editor_node.h120
-rw-r--r--editor/editor_path.cpp64
-rw-r--r--editor/editor_path.h1
-rw-r--r--editor/editor_plugin.cpp298
-rw-r--r--editor/editor_plugin.h55
-rw-r--r--editor/editor_plugin_settings.cpp68
-rw-r--r--editor/editor_plugin_settings.h1
-rw-r--r--editor/editor_profiler.cpp785
-rw-r--r--editor/editor_profiler.h177
-rw-r--r--editor/editor_properties.cpp1453
-rw-r--r--editor/editor_properties.h134
-rw-r--r--editor/editor_properties_array_dict.cpp411
-rw-r--r--editor/editor_properties_array_dict.h21
-rw-r--r--editor/editor_resource_preview.cpp216
-rw-r--r--editor/editor_resource_preview.h20
-rw-r--r--editor/editor_run.cpp125
-rw-r--r--editor/editor_run.h16
-rw-r--r--editor/editor_run_native.cpp87
-rw-r--r--editor/editor_run_native.h15
-rw-r--r--editor/editor_run_script.cpp20
-rw-r--r--editor/editor_run_script.h1
-rw-r--r--editor/editor_scale.cpp3
-rw-r--r--editor/editor_sectioned_inspector.cpp102
-rw-r--r--editor/editor_sectioned_inspector.h3
-rw-r--r--editor/editor_settings.cpp325
-rw-r--r--editor/editor_settings.h45
-rw-r--r--editor/editor_spin_slider.cpp148
-rw-r--r--editor/editor_spin_slider.h5
-rw-r--r--editor/editor_sub_scene.cpp72
-rw-r--r--editor/editor_sub_scene.h4
-rw-r--r--editor/editor_themes.cpp153
-rw-r--r--editor/editor_themes.h4
-rw-r--r--editor/editor_translation_parser.cpp183
-rw-r--r--editor/editor_translation_parser.h73
-rw-r--r--editor/editor_vcs_interface.cpp30
-rw-r--r--editor/editor_vcs_interface.h1
-rw-r--r--editor/export_template_manager.cpp148
-rw-r--r--editor/export_template_manager.h6
-rw-r--r--editor/file_type_cache.cpp104
-rw-r--r--editor/file_type_cache.h57
-rw-r--r--editor/fileserver/SCsub2
-rw-r--r--editor/fileserver/editor_file_server.cpp36
-rw-r--r--editor/fileserver/editor_file_server.h4
-rw-r--r--editor/filesystem_dock.cpp554
-rw-r--r--editor/filesystem_dock.h22
-rw-r--r--editor/find_in_files.cpp254
-rw-r--r--editor/find_in_files.h32
-rw-r--r--editor/groups_editor.cpp165
-rw-r--r--editor/groups_editor.h11
-rw-r--r--editor/icons/2D.svg1
-rw-r--r--editor/icons/3D.svg1
-rw-r--r--editor/icons/AABB.svg1
-rw-r--r--editor/icons/AcceptDialog.svg1
-rw-r--r--editor/icons/ActionCopy.svg1
-rw-r--r--editor/icons/ActionCut.svg1
-rw-r--r--editor/icons/ActionPaste.svg1
-rw-r--r--editor/icons/Add.svg1
-rw-r--r--editor/icons/AddAtlasTile.svg1
-rw-r--r--editor/icons/AddAutotile.svg1
-rw-r--r--editor/icons/AddSingleTile.svg1
-rw-r--r--editor/icons/AddSplit.svg1
-rw-r--r--editor/icons/Anchor.svg1
-rw-r--r--editor/icons/AnimatedSprite2D.svg1
-rw-r--r--editor/icons/AnimatedSprite3D.svg1
-rw-r--r--editor/icons/AnimatedTexture.svg1
-rw-r--r--editor/icons/Animation.svg1
-rw-r--r--editor/icons/AnimationFilter.svg1
-rw-r--r--editor/icons/AnimationPlayer.svg1
-rw-r--r--editor/icons/AnimationTrackGroup.svg1
-rw-r--r--editor/icons/AnimationTrackList.svg1
-rw-r--r--editor/icons/AnimationTree.svg1
-rw-r--r--editor/icons/Area2D.svg1
-rw-r--r--editor/icons/Area3D.svg1
-rw-r--r--editor/icons/Array.svg1
-rw-r--r--editor/icons/ArrayMesh.svg1
-rw-r--r--editor/icons/ArrowDown.svg1
-rw-r--r--editor/icons/ArrowLeft.svg1
-rw-r--r--editor/icons/ArrowRight.svg1
-rw-r--r--editor/icons/ArrowUp.svg1
-rw-r--r--editor/icons/AssetLib.svg1
-rw-r--r--editor/icons/AtlasTexture.svg1
-rw-r--r--editor/icons/AudioBusBypass.svg1
-rw-r--r--editor/icons/AudioBusLayout.svg1
-rw-r--r--editor/icons/AudioBusMute.svg1
-rw-r--r--editor/icons/AudioBusSolo.svg1
-rw-r--r--editor/icons/AudioStreamOGGVorbis.svg1
-rw-r--r--editor/icons/AudioStreamPlayer.svg1
-rw-r--r--editor/icons/AudioStreamPlayer2D.svg1
-rw-r--r--editor/icons/AudioStreamPlayer3D.svg1
-rw-r--r--editor/icons/AudioStreamSample.svg1
-rw-r--r--editor/icons/AutoEnd.svg1
-rw-r--r--editor/icons/AutoKey.svg1
-rw-r--r--editor/icons/AutoPlay.svg1
-rw-r--r--editor/icons/AutoTriangle.svg1
-rw-r--r--editor/icons/Back.svg1
-rw-r--r--editor/icons/BackBufferCopy.svg1
-rw-r--r--editor/icons/Bake.svg1
-rw-r--r--editor/icons/BakedLightmap.svg1
-rw-r--r--editor/icons/BakedLightmapData.svg1
-rw-r--r--editor/icons/Basis.svg1
-rw-r--r--editor/icons/BezierHandlesBalanced.svg1
-rw-r--r--editor/icons/BezierHandlesFree.svg1
-rw-r--r--editor/icons/BezierHandlesMirror.svg1
-rw-r--r--editor/icons/BitMap.svg1
-rw-r--r--editor/icons/BitmapFont.svg1
-rw-r--r--editor/icons/Blend.svg1
-rw-r--r--editor/icons/Bone.svg1
-rw-r--r--editor/icons/Bone2D.svg1
-rw-r--r--editor/icons/BoneAttachment3D.svg1
-rw-r--r--editor/icons/BoneTrack.svg1
-rw-r--r--editor/icons/BoxShape3D.svg1
-rw-r--r--editor/icons/Bucket.svg1
-rw-r--r--editor/icons/BusVuEmpty.svg1
-rw-r--r--editor/icons/BusVuFrozen.svg1
-rw-r--r--editor/icons/BusVuFull.svg1
-rw-r--r--editor/icons/Button.svg1
-rw-r--r--editor/icons/ButtonGroup.svg1
-rw-r--r--editor/icons/CPUParticles2D.svg1
-rw-r--r--editor/icons/CPUParticles3D.svg1
-rw-r--r--editor/icons/Callable.svg5
-rw-r--r--editor/icons/Camera2D.svg1
-rw-r--r--editor/icons/Camera3D.svg1
-rw-r--r--editor/icons/CameraEffects.svg1
-rw-r--r--editor/icons/CameraTexture.svg1
-rw-r--r--editor/icons/CanvasItem.svg1
-rw-r--r--editor/icons/CanvasItemMaterial.svg1
-rw-r--r--editor/icons/CanvasItemShader.svg1
-rw-r--r--editor/icons/CanvasItemShaderGraph.svg1
-rw-r--r--editor/icons/CanvasLayer.svg1
-rw-r--r--editor/icons/CanvasModulate.svg1
-rw-r--r--editor/icons/CapsuleMesh.svg1
-rw-r--r--editor/icons/CapsuleShape2D.svg1
-rw-r--r--editor/icons/CapsuleShape3D.svg1
-rw-r--r--editor/icons/CenterContainer.svg1
-rw-r--r--editor/icons/CheckBox.svg1
-rw-r--r--editor/icons/CheckButton.svg1
-rw-r--r--editor/icons/Checkerboard.svg1
-rw-r--r--editor/icons/CircleShape2D.svg1
-rw-r--r--editor/icons/ClassList.svg1
-rw-r--r--editor/icons/Clear.svg1
-rw-r--r--editor/icons/ClippedCamera3D.svg1
-rw-r--r--editor/icons/Close.svg1
-rw-r--r--editor/icons/Collapse.svg1
-rw-r--r--editor/icons/CollisionPolygon2D.svg1
-rw-r--r--editor/icons/CollisionPolygon3D.svg1
-rw-r--r--editor/icons/CollisionShape2D.svg1
-rw-r--r--editor/icons/CollisionShape3D.svg1
-rw-r--r--editor/icons/Color.svg1
-rw-r--r--editor/icons/ColorPick.svg1
-rw-r--r--editor/icons/ColorPicker.svg1
-rw-r--r--editor/icons/ColorPickerButton.svg1
-rw-r--r--editor/icons/ColorRamp.svg1
-rw-r--r--editor/icons/ColorRect.svg1
-rw-r--r--editor/icons/ColorTrackVu.svg1
-rw-r--r--editor/icons/ConcavePolygonShape2D.svg1
-rw-r--r--editor/icons/ConcavePolygonShape3D.svg1
-rw-r--r--editor/icons/ConeTwistJoint3D.svg1
-rw-r--r--editor/icons/ConfirmationDialog.svg1
-rw-r--r--editor/icons/Container.svg1
-rw-r--r--editor/icons/Control.svg1
-rw-r--r--editor/icons/ControlAlignBottomCenter.svg1
-rw-r--r--editor/icons/ControlAlignBottomLeft.svg1
-rw-r--r--editor/icons/ControlAlignBottomRight.svg1
-rw-r--r--editor/icons/ControlAlignBottomWide.svg1
-rw-r--r--editor/icons/ControlAlignCenter.svg1
-rw-r--r--editor/icons/ControlAlignCenterLeft.svg1
-rw-r--r--editor/icons/ControlAlignCenterRight.svg1
-rw-r--r--editor/icons/ControlAlignLeftCenter.svg1
-rw-r--r--editor/icons/ControlAlignLeftWide.svg1
-rw-r--r--editor/icons/ControlAlignRightCenter.svg1
-rw-r--r--editor/icons/ControlAlignRightWide.svg1
-rw-r--r--editor/icons/ControlAlignTopCenter.svg1
-rw-r--r--editor/icons/ControlAlignTopLeft.svg1
-rw-r--r--editor/icons/ControlAlignTopRight.svg1
-rw-r--r--editor/icons/ControlAlignTopWide.svg1
-rw-r--r--editor/icons/ControlAlignWide.svg1
-rw-r--r--editor/icons/ControlHcenterWide.svg1
-rw-r--r--editor/icons/ControlLayout.svg1
-rw-r--r--editor/icons/ControlVcenterWide.svg1
-rw-r--r--editor/icons/ConvexPolygonShape2D.svg1
-rw-r--r--editor/icons/ConvexPolygonShape3D.svg1
-rw-r--r--editor/icons/CopyNodePath.svg1
-rw-r--r--editor/icons/CreateNewSceneFrom.svg1
-rw-r--r--editor/icons/CryptoKey.svg1
-rw-r--r--editor/icons/CubeMesh.svg1
-rw-r--r--editor/icons/Cubemap.svg1
-rw-r--r--editor/icons/CubemapArray.svg1
-rw-r--r--editor/icons/Curve.svg1
-rw-r--r--editor/icons/Curve2D.svg1
-rw-r--r--editor/icons/Curve3D.svg1
-rw-r--r--editor/icons/CurveClose.svg1
-rw-r--r--editor/icons/CurveConstant.svg1
-rw-r--r--editor/icons/CurveCreate.svg1
-rw-r--r--editor/icons/CurveCurve.svg1
-rw-r--r--editor/icons/CurveDelete.svg1
-rw-r--r--editor/icons/CurveEdit.svg1
-rw-r--r--editor/icons/CurveIn.svg1
-rw-r--r--editor/icons/CurveInOut.svg1
-rw-r--r--editor/icons/CurveLinear.svg1
-rw-r--r--editor/icons/CurveOut.svg1
-rw-r--r--editor/icons/CurveOutIn.svg1
-rw-r--r--editor/icons/CurveTexture.svg1
-rw-r--r--editor/icons/CylinderMesh.svg1
-rw-r--r--editor/icons/CylinderShape3D.svg1
-rw-r--r--editor/icons/DampedSpringJoint2D.svg1
-rw-r--r--editor/icons/Debug.svg1
-rw-r--r--editor/icons/DebugContinue.svg1
-rw-r--r--editor/icons/DebugNext.svg1
-rw-r--r--editor/icons/DebugSkipBreakpointsOff.svg1
-rw-r--r--editor/icons/DebugSkipBreakpointsOn.svg1
-rw-r--r--editor/icons/DebugStep.svg1
-rw-r--r--editor/icons/Decal.svg1
-rw-r--r--editor/icons/DefaultProjectIcon.svg1
-rw-r--r--editor/icons/DeleteSplit.svg1
-rw-r--r--editor/icons/Dictionary.svg1
-rw-r--r--editor/icons/DirectionalLight3D.svg1
-rw-r--r--editor/icons/DistractionFree.svg1
-rw-r--r--editor/icons/Duplicate.svg1
-rw-r--r--editor/icons/DynamicFont.svg1
-rw-r--r--editor/icons/DynamicFontData.svg1
-rw-r--r--editor/icons/Edit.svg1
-rw-r--r--editor/icons/EditBezier.svg1
-rw-r--r--editor/icons/EditInternal.svg1
-rw-r--r--editor/icons/EditKey.svg1
-rw-r--r--editor/icons/EditPivot.svg1
-rw-r--r--editor/icons/EditResource.svg1
-rw-r--r--editor/icons/Editor3DHandle.svg1
-rw-r--r--editor/icons/EditorControlAnchor.svg1
-rw-r--r--editor/icons/EditorCurveHandle.svg1
-rw-r--r--editor/icons/EditorFileDialog.svg1
-rw-r--r--editor/icons/EditorHandle.svg1
-rw-r--r--editor/icons/EditorHandleAdd.svg1
-rw-r--r--editor/icons/EditorInternalHandle.svg1
-rw-r--r--editor/icons/EditorPathSharpHandle.svg1
-rw-r--r--editor/icons/EditorPathSmoothHandle.svg1
-rw-r--r--editor/icons/EditorPivot.svg1
-rw-r--r--editor/icons/EditorPlugin.svg1
-rw-r--r--editor/icons/EditorPosition.svg1
-rw-r--r--editor/icons/EditorPositionPrevious.svg1
-rw-r--r--editor/icons/EditorPositionUnselected.svg1
-rw-r--r--editor/icons/Enum.svg1
-rw-r--r--editor/icons/Environment.svg1
-rw-r--r--editor/icons/Error.svg1
-rw-r--r--editor/icons/ErrorSign.svg1
-rw-r--r--editor/icons/ErrorWarning.svg1
-rw-r--r--editor/icons/ExpandBottomDock.svg1
-rw-r--r--editor/icons/Favorites.svg1
-rw-r--r--editor/icons/File.svg1
-rw-r--r--editor/icons/FileBigThumb.svg1
-rw-r--r--editor/icons/FileBroken.svg1
-rw-r--r--editor/icons/FileBrokenBigThumb.svg1
-rw-r--r--editor/icons/FileDead.svg1
-rw-r--r--editor/icons/FileDeadBigThumb.svg1
-rw-r--r--editor/icons/FileDeadMediumThumb.svg1
-rw-r--r--editor/icons/FileDialog.svg1
-rw-r--r--editor/icons/FileList.svg1
-rw-r--r--editor/icons/FileMediumThumb.svg1
-rw-r--r--editor/icons/FileThumbnail.svg1
-rw-r--r--editor/icons/Filesystem.svg1
-rw-r--r--editor/icons/FixedMaterial.svg1
-rw-r--r--editor/icons/FixedSpatialMaterial.svg1
-rw-r--r--editor/icons/Folder.svg1
-rw-r--r--editor/icons/FolderBigThumb.svg1
-rw-r--r--editor/icons/FolderMediumThumb.svg1
-rw-r--r--editor/icons/Font.svg1
-rw-r--r--editor/icons/Forward.svg1
-rw-r--r--editor/icons/GIProbe.svg1
-rw-r--r--editor/icons/GIProbeData.svg1
-rw-r--r--editor/icons/GPUParticles2D.svg1
-rw-r--r--editor/icons/GPUParticles3D.svg1
-rw-r--r--editor/icons/Generic6DOFJoint3D.svg1
-rw-r--r--editor/icons/Gizmo3DSamplePlayer.svg1
-rw-r--r--editor/icons/GizmoBakedLightmap.svg1
-rw-r--r--editor/icons/GizmoCPUParticles3D.svg1
-rw-r--r--editor/icons/GizmoCamera.svg1
-rw-r--r--editor/icons/GizmoDirectionalLight.svg1
-rw-r--r--editor/icons/GizmoGIProbe.svg1
-rw-r--r--editor/icons/GizmoGPUParticles3D.svg1
-rw-r--r--editor/icons/GizmoLight.svg1
-rw-r--r--editor/icons/GizmoListener.svg1
-rw-r--r--editor/icons/GizmoReflectionProbe.svg1
-rw-r--r--editor/icons/GizmoSpotLight.svg1
-rw-r--r--editor/icons/Godot.svg1
-rw-r--r--editor/icons/Gradient.svg1
-rw-r--r--editor/icons/GradientTexture.svg1
-rw-r--r--editor/icons/GraphEdit.svg1
-rw-r--r--editor/icons/GraphNode.svg1
-rw-r--r--editor/icons/Grid.svg1
-rw-r--r--editor/icons/GridContainer.svg1
-rw-r--r--editor/icons/GrooveJoint2D.svg1
-rw-r--r--editor/icons/Group.svg1
-rw-r--r--editor/icons/GroupViewport.svg1
-rw-r--r--editor/icons/Groups.svg1
-rw-r--r--editor/icons/GuiChecked.svg1
-rw-r--r--editor/icons/GuiClose.svg1
-rw-r--r--editor/icons/GuiCloseCustomizable.svg1
-rw-r--r--editor/icons/GuiDropdown.svg1
-rw-r--r--editor/icons/GuiEllipsis.svg1
-rw-r--r--editor/icons/GuiGraphNodePort.svg1
-rw-r--r--editor/icons/GuiHTick.svg1
-rw-r--r--editor/icons/GuiHsplitter.svg1
-rw-r--r--editor/icons/GuiMiniCheckerboard.svg1
-rw-r--r--editor/icons/GuiOptionArrow.svg1
-rw-r--r--editor/icons/GuiProgressBar.svg1
-rw-r--r--editor/icons/GuiProgressFill.svg1
-rw-r--r--editor/icons/GuiRadioChecked.svg1
-rw-r--r--editor/icons/GuiRadioUnchecked.svg1
-rw-r--r--editor/icons/GuiResizer.svg1
-rw-r--r--editor/icons/GuiScrollArrowLeft.svg1
-rw-r--r--editor/icons/GuiScrollArrowLeftHl.svg1
-rw-r--r--editor/icons/GuiScrollArrowRight.svg1
-rw-r--r--editor/icons/GuiScrollArrowRightHl.svg1
-rw-r--r--editor/icons/GuiScrollBg.svg1
-rw-r--r--editor/icons/GuiScrollGrabber.svg1
-rw-r--r--editor/icons/GuiScrollGrabberHl.svg1
-rw-r--r--editor/icons/GuiScrollGrabberPressed.svg1
-rw-r--r--editor/icons/GuiSliderGrabber.svg1
-rw-r--r--editor/icons/GuiSliderGrabberHl.svg1
-rw-r--r--editor/icons/GuiSpace.svg1
-rw-r--r--editor/icons/GuiSpinboxUpdown.svg1
-rw-r--r--editor/icons/GuiTab.svg1
-rw-r--r--editor/icons/GuiTabMenu.svg1
-rw-r--r--editor/icons/GuiTabMenuHl.svg1
-rw-r--r--editor/icons/GuiToggleOff.svg1
-rw-r--r--editor/icons/GuiToggleOn.svg1
-rw-r--r--editor/icons/GuiTreeArrowDown.svg1
-rw-r--r--editor/icons/GuiTreeArrowRight.svg1
-rw-r--r--editor/icons/GuiTreeArrowUp.svg1
-rw-r--r--editor/icons/GuiTreeUpdown.svg1
-rw-r--r--editor/icons/GuiUnchecked.svg1
-rw-r--r--editor/icons/GuiVTick.svg1
-rw-r--r--editor/icons/GuiViewportHdiagsplitter.svg1
-rw-r--r--editor/icons/GuiViewportVdiagsplitter.svg1
-rw-r--r--editor/icons/GuiViewportVhsplitter.svg1
-rw-r--r--editor/icons/GuiVisibilityHidden.svg1
-rw-r--r--editor/icons/GuiVisibilityVisible.svg1
-rw-r--r--editor/icons/GuiVisibilityXray.svg1
-rw-r--r--editor/icons/GuiVsplitBg.svg1
-rw-r--r--editor/icons/GuiVsplitter.svg1
-rw-r--r--editor/icons/HBoxContainer.svg1
-rw-r--r--editor/icons/HScrollBar.svg1
-rw-r--r--editor/icons/HSeparator.svg1
-rw-r--r--editor/icons/HSlider.svg1
-rw-r--r--editor/icons/HSplitContainer.svg1
-rw-r--r--editor/icons/HTTPRequest.svg1
-rw-r--r--editor/icons/Headphones.svg1
-rw-r--r--editor/icons/HeightMapShape3D.svg1
-rw-r--r--editor/icons/Help.svg1
-rw-r--r--editor/icons/HelpSearch.svg1
-rw-r--r--editor/icons/HingeJoint3D.svg1
-rw-r--r--editor/icons/History.svg1
-rw-r--r--editor/icons/Hsize.svg1
-rw-r--r--editor/icons/Image.svg1
-rw-r--r--editor/icons/ImageTexture.svg1
-rw-r--r--editor/icons/ImmediateGeometry3D.svg1
-rw-r--r--editor/icons/ImportCheck.svg1
-rw-r--r--editor/icons/ImportFail.svg1
-rw-r--r--editor/icons/InformationSign.svg1
-rw-r--r--editor/icons/InsertAfter.svg1
-rw-r--r--editor/icons/InsertBefore.svg1
-rw-r--r--editor/icons/Instance.svg1
-rw-r--r--editor/icons/InstanceOptions.svg1
-rw-r--r--editor/icons/InterpCubic.svg1
-rw-r--r--editor/icons/InterpLinear.svg1
-rw-r--r--editor/icons/InterpRaw.svg1
-rw-r--r--editor/icons/InterpWrapClamp.svg1
-rw-r--r--editor/icons/InterpWrapLoop.svg1
-rw-r--r--editor/icons/InverseKinematics.svg1
-rw-r--r--editor/icons/Issue.svg1
-rw-r--r--editor/icons/ItemList.svg1
-rw-r--r--editor/icons/JoyAxis.svg1
-rw-r--r--editor/icons/JoyButton.svg1
-rw-r--r--editor/icons/Joypad.svg1
-rw-r--r--editor/icons/Key.svg1
-rw-r--r--editor/icons/KeyAnimation.svg1
-rw-r--r--editor/icons/KeyAudio.svg1
-rw-r--r--editor/icons/KeyBezier.svg1
-rw-r--r--editor/icons/KeyBezierHandle.svg1
-rw-r--r--editor/icons/KeyBezierPoint.svg1
-rw-r--r--editor/icons/KeyBezierSelected.svg1
-rw-r--r--editor/icons/KeyCall.svg1
-rw-r--r--editor/icons/KeyHover.svg1
-rw-r--r--editor/icons/KeyInvalid.svg1
-rw-r--r--editor/icons/KeyNext.svg1
-rw-r--r--editor/icons/KeyPosition.svg1
-rw-r--r--editor/icons/KeyRotation.svg1
-rw-r--r--editor/icons/KeyScale.svg1
-rw-r--r--editor/icons/KeySelected.svg1
-rw-r--r--editor/icons/KeyValue.svg1
-rw-r--r--editor/icons/KeyXform.svg1
-rw-r--r--editor/icons/Keyboard.svg1
-rw-r--r--editor/icons/KeyboardPhysical.svg1
-rw-r--r--editor/icons/KinematicBody2D.svg1
-rw-r--r--editor/icons/KinematicBody3D.svg1
-rw-r--r--editor/icons/Label.svg1
-rw-r--r--editor/icons/LargeTexture.svg1
-rw-r--r--editor/icons/Light2D.svg1
-rw-r--r--editor/icons/LightOccluder2D.svg1
-rw-r--r--editor/icons/LightmapProbe.svg1
-rw-r--r--editor/icons/Line2D.svg1
-rw-r--r--editor/icons/LineEdit.svg1
-rw-r--r--editor/icons/LineShape2D.svg1
-rw-r--r--editor/icons/LinkButton.svg1
-rw-r--r--editor/icons/ListSelect.svg1
-rw-r--r--editor/icons/Listener3D.svg1
-rw-r--r--editor/icons/Load.svg1
-rw-r--r--editor/icons/Lock.svg1
-rw-r--r--editor/icons/LockViewport.svg1
-rw-r--r--editor/icons/Logo.svg1
-rw-r--r--editor/icons/Loop.svg1
-rw-r--r--editor/icons/LoopInterpolation.svg1
-rw-r--r--editor/icons/MainPlay.svg1
-rw-r--r--editor/icons/MarginContainer.svg1
-rw-r--r--editor/icons/MatchCase.svg1
-rw-r--r--editor/icons/MaterialPreviewCube.svg1
-rw-r--r--editor/icons/MaterialPreviewCubeOff.svg1
-rw-r--r--editor/icons/MaterialPreviewLight1.svg1
-rw-r--r--editor/icons/MaterialPreviewLight1Off.svg1
-rw-r--r--editor/icons/MaterialPreviewLight2.svg1
-rw-r--r--editor/icons/MaterialPreviewLight2Off.svg1
-rw-r--r--editor/icons/MaterialPreviewSphere.svg1
-rw-r--r--editor/icons/MaterialPreviewSphereOff.svg1
-rw-r--r--editor/icons/MemberConstant.svg1
-rw-r--r--editor/icons/MemberMethod.svg1
-rw-r--r--editor/icons/MemberProperty.svg1
-rw-r--r--editor/icons/MemberSignal.svg1
-rw-r--r--editor/icons/MemberTheme.svg1
-rw-r--r--editor/icons/MenuButton.svg1
-rw-r--r--editor/icons/Mesh.svg1
-rw-r--r--editor/icons/MeshInstance2D.svg1
-rw-r--r--editor/icons/MeshInstance3D.svg1
-rw-r--r--editor/icons/MeshLibrary.svg1
-rw-r--r--editor/icons/MeshTexture.svg1
-rw-r--r--editor/icons/MiniObject.svg1
-rw-r--r--editor/icons/MirrorX.svg1
-rw-r--r--editor/icons/MirrorY.svg1
-rw-r--r--editor/icons/Mouse.svg1
-rw-r--r--editor/icons/MoveDown.svg1
-rw-r--r--editor/icons/MoveLeft.svg1
-rw-r--r--editor/icons/MovePoint.svg1
-rw-r--r--editor/icons/MoveRight.svg1
-rw-r--r--editor/icons/MoveUp.svg1
-rw-r--r--editor/icons/MultiEdit.svg1
-rw-r--r--editor/icons/MultiLine.svg1
-rw-r--r--editor/icons/MultiMesh.svg1
-rw-r--r--editor/icons/MultiMeshInstance2D.svg1
-rw-r--r--editor/icons/MultiMeshInstance3D.svg1
-rw-r--r--editor/icons/Navigation2D.svg1
-rw-r--r--editor/icons/Navigation3D.svg1
-rw-r--r--editor/icons/NavigationAgent2D.svg1
-rw-r--r--editor/icons/NavigationAgent3D.svg1
-rw-r--r--editor/icons/NavigationMesh.svg1
-rw-r--r--editor/icons/NavigationObstacle2D.svg1
-rw-r--r--editor/icons/NavigationObstacle3D.svg1
-rw-r--r--editor/icons/NavigationPolygon.svg1
-rw-r--r--editor/icons/NavigationRegion2D.svg1
-rw-r--r--editor/icons/NavigationRegion3D.svg1
-rw-r--r--editor/icons/New.svg1
-rw-r--r--editor/icons/NewRoot.svg1
-rw-r--r--editor/icons/Nil.svg1
-rw-r--r--editor/icons/NinePatchRect.svg1
-rw-r--r--editor/icons/Node.svg1
-rw-r--r--editor/icons/Node2D.svg1
-rw-r--r--editor/icons/Node3D.svg1
-rw-r--r--editor/icons/NodePath.svg1
-rw-r--r--editor/icons/NodeWarning.svg1
-rw-r--r--editor/icons/NonFavorite.svg1
-rw-r--r--editor/icons/ORMMaterial3D.svg66
-rw-r--r--editor/icons/Object.svg1
-rw-r--r--editor/icons/OccluderPolygon2D.svg1
-rw-r--r--editor/icons/OmniLight3D.svg1
-rw-r--r--editor/icons/Onion.svg1
-rw-r--r--editor/icons/OptionButton.svg1
-rw-r--r--editor/icons/OverbrightIndicator.svg1
-rw-r--r--editor/icons/Override.svg1
-rw-r--r--editor/icons/PackedByteArray.svg1
-rw-r--r--editor/icons/PackedColorArray.svg1
-rw-r--r--editor/icons/PackedDataContainer.svg1
-rw-r--r--editor/icons/PackedFloat32Array.svg1
-rw-r--r--editor/icons/PackedFloat64Array.svg1
-rw-r--r--editor/icons/PackedInt32Array.svg1
-rw-r--r--editor/icons/PackedInt64Array.svg1
-rw-r--r--editor/icons/PackedScene.svg1
-rw-r--r--editor/icons/PackedStringArray.svg1
-rw-r--r--editor/icons/PackedVector2Array.svg1
-rw-r--r--editor/icons/PackedVector3Array.svg1
-rw-r--r--editor/icons/PaintVertex.svg1
-rw-r--r--editor/icons/Panel.svg1
-rw-r--r--editor/icons/PanelContainer.svg1
-rw-r--r--editor/icons/Panels1.svg1
-rw-r--r--editor/icons/Panels2.svg1
-rw-r--r--editor/icons/Panels2Alt.svg1
-rw-r--r--editor/icons/Panels3.svg1
-rw-r--r--editor/icons/Panels3Alt.svg1
-rw-r--r--editor/icons/Panels4.svg1
-rw-r--r--editor/icons/PanoramaSkyMaterial.svg1
-rw-r--r--editor/icons/ParallaxBackground.svg1
-rw-r--r--editor/icons/ParallaxLayer.svg1
-rw-r--r--editor/icons/ParticlesMaterial.svg1
-rw-r--r--editor/icons/Path2D.svg1
-rw-r--r--editor/icons/Path3D.svg1
-rw-r--r--editor/icons/PathFollow2D.svg1
-rw-r--r--editor/icons/PathFollow3D.svg1
-rw-r--r--editor/icons/Pause.svg1
-rw-r--r--editor/icons/PhysicalBone3D.svg1
-rw-r--r--editor/icons/PhysicalSkyMaterial.svg1
-rw-r--r--editor/icons/Pin.svg1
-rw-r--r--editor/icons/PinJoint2D.svg1
-rw-r--r--editor/icons/PinJoint3D.svg1
-rw-r--r--editor/icons/PinPressed.svg1
-rw-r--r--editor/icons/Plane.svg1
-rw-r--r--editor/icons/PlaneMesh.svg1
-rw-r--r--editor/icons/Play.svg1
-rw-r--r--editor/icons/PlayBackwards.svg1
-rw-r--r--editor/icons/PlayCustom.svg1
-rw-r--r--editor/icons/PlayOverlay.svg1
-rw-r--r--editor/icons/PlayScene.svg1
-rw-r--r--editor/icons/PlayStart.svg1
-rw-r--r--editor/icons/PlayStartBackwards.svg1
-rw-r--r--editor/icons/PlayTravel.svg1
-rw-r--r--editor/icons/PluginScript.svg1
-rw-r--r--editor/icons/PointMesh.svg1
-rw-r--r--editor/icons/Polygon2D.svg1
-rw-r--r--editor/icons/PolygonPathFinder.svg1
-rw-r--r--editor/icons/Popup.svg1
-rw-r--r--editor/icons/PopupMenu.svg1
-rw-r--r--editor/icons/PopupPanel.svg1
-rw-r--r--editor/icons/Portal.svg1
-rw-r--r--editor/icons/Position2D.svg1
-rw-r--r--editor/icons/Position3D.svg1
-rw-r--r--editor/icons/PrismMesh.svg1
-rw-r--r--editor/icons/ProceduralSkyMaterial.svg1
-rw-r--r--editor/icons/Progress1.svg1
-rw-r--r--editor/icons/Progress2.svg1
-rw-r--r--editor/icons/Progress3.svg1
-rw-r--r--editor/icons/Progress4.svg1
-rw-r--r--editor/icons/Progress5.svg1
-rw-r--r--editor/icons/Progress6.svg1
-rw-r--r--editor/icons/Progress7.svg1
-rw-r--r--editor/icons/Progress8.svg1
-rw-r--r--editor/icons/ProgressBar.svg1
-rw-r--r--editor/icons/ProjectIconLoading.svg1
-rw-r--r--editor/icons/ProximityGroup3D.svg1
-rw-r--r--editor/icons/ProxyTexture.svg1
-rw-r--r--editor/icons/Quad.svg1
-rw-r--r--editor/icons/QuadMesh.svg1
-rw-r--r--editor/icons/Quat.svg1
-rw-r--r--editor/icons/README.md15
-rw-r--r--editor/icons/RID.svg1
-rw-r--r--editor/icons/RayCast2D.svg1
-rw-r--r--editor/icons/RayCast3D.svg1
-rw-r--r--editor/icons/RayShape2D.svg1
-rw-r--r--editor/icons/RayShape3D.svg1
-rw-r--r--editor/icons/Rayito.svg1
-rw-r--r--editor/icons/Rect2.svg1
-rw-r--r--editor/icons/Rect2i.svg4
-rw-r--r--editor/icons/RectangleShape2D.svg1
-rw-r--r--editor/icons/ReferenceRect.svg1
-rw-r--r--editor/icons/ReflectionProbe.svg1
-rw-r--r--editor/icons/RegionEdit.svg1
-rw-r--r--editor/icons/Reload.svg1
-rw-r--r--editor/icons/ReloadSmall.svg1
-rw-r--r--editor/icons/RemoteTransform2D.svg1
-rw-r--r--editor/icons/RemoteTransform3D.svg1
-rw-r--r--editor/icons/Remove.svg1
-rw-r--r--editor/icons/RemoveInternal.svg1
-rw-r--r--editor/icons/Rename.svg1
-rw-r--r--editor/icons/Reparent.svg1
-rw-r--r--editor/icons/ReparentToNewNode.svg1
-rw-r--r--editor/icons/ResourcePreloader.svg1
-rw-r--r--editor/icons/RichTextEffect.svg1
-rw-r--r--editor/icons/RichTextLabel.svg1
-rw-r--r--editor/icons/RigidBody2D.svg1
-rw-r--r--editor/icons/RigidBody3D.svg1
-rw-r--r--editor/icons/Room.svg1
-rw-r--r--editor/icons/RoomBounds.svg1
-rw-r--r--editor/icons/RootMotionView.svg1
-rw-r--r--editor/icons/Rotate0.svg1
-rw-r--r--editor/icons/Rotate180.svg1
-rw-r--r--editor/icons/Rotate270.svg1
-rw-r--r--editor/icons/Rotate90.svg1
-rw-r--r--editor/icons/RotateLeft.svg1
-rw-r--r--editor/icons/RotateRight.svg1
-rw-r--r--editor/icons/Ruler.svg1
-rw-r--r--editor/icons/SCsub23
-rw-r--r--editor/icons/SampleLibrary.svg1
-rw-r--r--editor/icons/Save.svg1
-rw-r--r--editor/icons/Script.svg1
-rw-r--r--editor/icons/ScriptCreate.svg1
-rw-r--r--editor/icons/ScriptCreateDialog.svg1
-rw-r--r--editor/icons/ScriptExtend.svg1
-rw-r--r--editor/icons/ScriptRemove.svg1
-rw-r--r--editor/icons/ScrollContainer.svg1
-rw-r--r--editor/icons/Search.svg1
-rw-r--r--editor/icons/SegmentShape2D.svg1
-rw-r--r--editor/icons/Shader.svg1
-rw-r--r--editor/icons/ShaderGlobalsOverride.svg1
-rw-r--r--editor/icons/ShaderMaterial.svg1
-rw-r--r--editor/icons/Shortcut.svg1
-rw-r--r--editor/icons/Signal.svg1
-rw-r--r--editor/icons/Signals.svg1
-rw-r--r--editor/icons/SignalsAndGroups.svg1
-rw-r--r--editor/icons/Skeleton2D.svg1
-rw-r--r--editor/icons/Skeleton3D.svg1
-rw-r--r--editor/icons/SkeletonIK3D.svg1
-rw-r--r--editor/icons/Sky.svg1
-rw-r--r--editor/icons/SliderJoint3D.svg1
-rw-r--r--editor/icons/Slot.svg1
-rw-r--r--editor/icons/Snap.svg1
-rw-r--r--editor/icons/SnapGrid.svg1
-rw-r--r--editor/icons/SoftBody3D.svg1
-rw-r--r--editor/icons/Sort.svg1
-rw-r--r--editor/icons/SphereMesh.svg1
-rw-r--r--editor/icons/SphereShape3D.svg1
-rw-r--r--editor/icons/SpinBox.svg1
-rw-r--r--editor/icons/SpotLight3D.svg1
-rw-r--r--editor/icons/SpringArm3D.svg1
-rw-r--r--editor/icons/Sprite2D.svg1
-rw-r--r--editor/icons/Sprite3D.svg1
-rw-r--r--editor/icons/SpriteFrames.svg1
-rw-r--r--editor/icons/SpriteSheet.svg1
-rw-r--r--editor/icons/StandardMaterial3D.svg11
-rw-r--r--editor/icons/StaticBody2D.svg1
-rw-r--r--editor/icons/StaticBody3D.svg1
-rw-r--r--editor/icons/StatusError.svg1
-rw-r--r--editor/icons/StatusSuccess.svg1
-rw-r--r--editor/icons/StatusWarning.svg1
-rw-r--r--editor/icons/Stop.svg1
-rw-r--r--editor/icons/StreamTexture.svg1
-rw-r--r--editor/icons/String.svg1
-rw-r--r--editor/icons/StringName.svg4
-rw-r--r--editor/icons/StyleBoxEmpty.svg1
-rw-r--r--editor/icons/StyleBoxFlat.svg1
-rw-r--r--editor/icons/StyleBoxLine.svg1
-rw-r--r--editor/icons/StyleBoxTexture.svg1
-rw-r--r--editor/icons/SubViewport.svg1
-rw-r--r--editor/icons/SubViewportContainer.svg1
-rw-r--r--editor/icons/TabContainer.svg1
-rw-r--r--editor/icons/Tabs.svg1
-rw-r--r--editor/icons/TestCube.svg1
-rw-r--r--editor/icons/TextEdit.svg1
-rw-r--r--editor/icons/TextFile.svg1
-rw-r--r--editor/icons/Texture3D.svg1
-rw-r--r--editor/icons/TextureArray.svg1
-rw-r--r--editor/icons/TextureButton.svg1
-rw-r--r--editor/icons/TextureProgress.svg1
-rw-r--r--editor/icons/TextureRect.svg1
-rw-r--r--editor/icons/Theme.svg1
-rw-r--r--editor/icons/ThumbnailWait.svg1
-rw-r--r--editor/icons/TileMap.svg1
-rw-r--r--editor/icons/TileSet.svg1
-rw-r--r--editor/icons/Time.svg1
-rw-r--r--editor/icons/TimelineIndicator.svg1
-rw-r--r--editor/icons/Timer.svg1
-rw-r--r--editor/icons/ToolAddNode.svg1
-rw-r--r--editor/icons/ToolConnect.svg1
-rw-r--r--editor/icons/ToolMove.svg1
-rw-r--r--editor/icons/ToolPan.svg1
-rw-r--r--editor/icons/ToolRotate.svg1
-rw-r--r--editor/icons/ToolScale.svg1
-rw-r--r--editor/icons/ToolSelect.svg1
-rw-r--r--editor/icons/ToolTriangle.svg1
-rw-r--r--editor/icons/Tools.svg1
-rw-r--r--editor/icons/TouchScreenButton.svg1
-rw-r--r--editor/icons/TrackAddKey.svg1
-rw-r--r--editor/icons/TrackAddKeyHl.svg1
-rw-r--r--editor/icons/TrackCapture.svg1
-rw-r--r--editor/icons/TrackColor.svg61
-rw-r--r--editor/icons/TrackContinuous.svg1
-rw-r--r--editor/icons/TrackDiscrete.svg1
-rw-r--r--editor/icons/TrackTrigger.svg1
-rw-r--r--editor/icons/Transform.svg1
-rw-r--r--editor/icons/Transform2D.svg1
-rw-r--r--editor/icons/TransitionEnd.svg1
-rw-r--r--editor/icons/TransitionEndAuto.svg1
-rw-r--r--editor/icons/TransitionEndAutoBig.svg1
-rw-r--r--editor/icons/TransitionEndBig.svg1
-rw-r--r--editor/icons/TransitionImmediate.svg1
-rw-r--r--editor/icons/TransitionImmediateAuto.svg1
-rw-r--r--editor/icons/TransitionImmediateAutoBig.svg1
-rw-r--r--editor/icons/TransitionImmediateBig.svg1
-rw-r--r--editor/icons/TransitionSync.svg1
-rw-r--r--editor/icons/TransitionSyncAuto.svg1
-rw-r--r--editor/icons/TransitionSyncAutoBig.svg1
-rw-r--r--editor/icons/TransitionSyncBig.svg1
-rw-r--r--editor/icons/Translation.svg1
-rw-r--r--editor/icons/Transpose.svg1
-rw-r--r--editor/icons/Tree.svg1
-rw-r--r--editor/icons/Tween.svg1
-rw-r--r--editor/icons/Unbone.svg1
-rw-r--r--editor/icons/Ungroup.svg1
-rw-r--r--editor/icons/Unlock.svg1
-rw-r--r--editor/icons/UnpaintVertex.svg1
-rw-r--r--editor/icons/Uv.svg1
-rw-r--r--editor/icons/VBoxContainer.svg1
-rw-r--r--editor/icons/VScrollBar.svg1
-rw-r--r--editor/icons/VSeparator.svg1
-rw-r--r--editor/icons/VSlider.svg1
-rw-r--r--editor/icons/VSplitContainer.svg1
-rw-r--r--editor/icons/Variant.svg1
-rw-r--r--editor/icons/Vector2.svg1
-rw-r--r--editor/icons/Vector2i.svg5
-rw-r--r--editor/icons/Vector3.svg1
-rw-r--r--editor/icons/Vector3i.svg5
-rw-r--r--editor/icons/VehicleBody3D.svg1
-rw-r--r--editor/icons/VehicleWheel3D.svg1
-rw-r--r--editor/icons/VideoPlayer.svg1
-rw-r--r--editor/icons/Viewport.svg1
-rw-r--r--editor/icons/ViewportSpeed.svg1
-rw-r--r--editor/icons/ViewportTexture.svg1
-rw-r--r--editor/icons/ViewportZoom.svg1
-rw-r--r--editor/icons/VisibilityEnabler2D.svg1
-rw-r--r--editor/icons/VisibilityEnabler3D.svg1
-rw-r--r--editor/icons/VisibilityNotifier2D.svg1
-rw-r--r--editor/icons/VisibilityNotifier3D.svg1
-rw-r--r--editor/icons/VisualShader.svg1
-rw-r--r--editor/icons/VisualShaderPort.svg1
-rw-r--r--editor/icons/Warning.svg1
-rw-r--r--editor/icons/Window.svg1
-rw-r--r--editor/icons/World2D.svg1
-rw-r--r--editor/icons/World3D.svg1
-rw-r--r--editor/icons/WorldEnvironment.svg1
-rw-r--r--editor/icons/WorldMarginShape3D.svg1
-rw-r--r--editor/icons/X509Certificate.svg1
-rw-r--r--editor/icons/XRAnchor3D.svg1
-rw-r--r--editor/icons/XRCamera3D.svg1
-rw-r--r--editor/icons/XRController3D.svg1
-rw-r--r--editor/icons/XROrigin3D.svg1
-rw-r--r--editor/icons/YSort.svg1
-rw-r--r--editor/icons/Zoom.svg1
-rw-r--r--editor/icons/ZoomLess.svg1
-rw-r--r--editor/icons/ZoomMore.svg1
-rw-r--r--editor/icons/ZoomReset.svg1
-rw-r--r--editor/icons/bool.svg1
-rw-r--r--editor/icons/editor_icons_builders.py27
-rw-r--r--editor/icons/float.svg1
-rw-r--r--editor/icons/icon_2_d.svg1
-rw-r--r--editor/icons/icon_3_d.svg1
-rw-r--r--editor/icons/icon_GUI_checked.svg1
-rw-r--r--editor/icons/icon_GUI_dropdown.svg1
-rw-r--r--editor/icons/icon_GUI_ellipsis.svg1
-rw-r--r--editor/icons/icon_GUI_h_tick.svg1
-rw-r--r--editor/icons/icon_GUI_hsplitter.svg1
-rw-r--r--editor/icons/icon_GUI_mini_checkerboard.svg1
-rw-r--r--editor/icons/icon_GUI_option_arrow.svg1
-rw-r--r--editor/icons/icon_GUI_progress_bar.svg1
-rw-r--r--editor/icons/icon_GUI_progress_fill.svg1
-rw-r--r--editor/icons/icon_GUI_radio_checked.svg1
-rw-r--r--editor/icons/icon_GUI_radio_unchecked.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_arrow_left.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_arrow_left_hl.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_arrow_right.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_arrow_right_hl.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_bg.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_grabber.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_grabber_hl.svg1
-rw-r--r--editor/icons/icon_GUI_scroll_grabber_pressed.svg1
-rw-r--r--editor/icons/icon_GUI_slider_grabber.svg1
-rw-r--r--editor/icons/icon_GUI_slider_grabber_hl.svg1
-rw-r--r--editor/icons/icon_GUI_space.svg1
-rw-r--r--editor/icons/icon_GUI_spinbox_updown.svg1
-rw-r--r--editor/icons/icon_GUI_tab.svg1
-rw-r--r--editor/icons/icon_GUI_tab_menu.svg1
-rw-r--r--editor/icons/icon_GUI_tab_menu_hl.svg1
-rw-r--r--editor/icons/icon_GUI_toggle_off.svg1
-rw-r--r--editor/icons/icon_GUI_toggle_on.svg1
-rw-r--r--editor/icons/icon_GUI_tree_arrow_down.svg1
-rw-r--r--editor/icons/icon_GUI_tree_arrow_right.svg1
-rw-r--r--editor/icons/icon_GUI_tree_arrow_up.svg1
-rw-r--r--editor/icons/icon_GUI_tree_updown.svg1
-rw-r--r--editor/icons/icon_GUI_unchecked.svg1
-rw-r--r--editor/icons/icon_GUI_v_tick.svg1
-rw-r--r--editor/icons/icon_GUI_viewport_hdiagsplitter.svg1
-rw-r--r--editor/icons/icon_GUI_viewport_vdiagsplitter.svg1
-rw-r--r--editor/icons/icon_GUI_viewport_vhsplitter.svg1
-rw-r--r--editor/icons/icon_GUI_visibility_hidden.svg1
-rw-r--r--editor/icons/icon_GUI_visibility_visible.svg1
-rw-r--r--editor/icons/icon_GUI_visibility_xray.svg1
-rw-r--r--editor/icons/icon_GUI_vsplit_bg.svg1
-rw-r--r--editor/icons/icon_GUI_vsplitter.svg1
-rw-r--r--editor/icons/icon_a_a_b_b.svg1
-rw-r--r--editor/icons/icon_a_r_v_r_anchor.svg1
-rw-r--r--editor/icons/icon_a_r_v_r_camera.svg1
-rw-r--r--editor/icons/icon_a_r_v_r_controller.svg1
-rw-r--r--editor/icons/icon_a_r_v_r_origin.svg1
-rw-r--r--editor/icons/icon_accept_dialog.svg1
-rw-r--r--editor/icons/icon_action_copy.svg1
-rw-r--r--editor/icons/icon_action_cut.svg1
-rw-r--r--editor/icons/icon_action_paste.svg1
-rw-r--r--editor/icons/icon_add.svg1
-rw-r--r--editor/icons/icon_add_atlas_tile.svg1
-rw-r--r--editor/icons/icon_add_autotile.svg1
-rw-r--r--editor/icons/icon_add_single_tile.svg1
-rw-r--r--editor/icons/icon_add_split.svg1
-rw-r--r--editor/icons/icon_anchor.svg1
-rw-r--r--editor/icons/icon_animated_sprite.svg1
-rw-r--r--editor/icons/icon_animated_sprite_3d.svg1
-rw-r--r--editor/icons/icon_animated_texture.svg1
-rw-r--r--editor/icons/icon_animation.svg1
-rw-r--r--editor/icons/icon_animation_filter.svg1
-rw-r--r--editor/icons/icon_animation_player.svg1
-rw-r--r--editor/icons/icon_animation_track_group.svg1
-rw-r--r--editor/icons/icon_animation_track_list.svg1
-rw-r--r--editor/icons/icon_animation_tree.svg1
-rw-r--r--editor/icons/icon_animation_tree_player.svg1
-rw-r--r--editor/icons/icon_area.svg1
-rw-r--r--editor/icons/icon_area_2d.svg1
-rw-r--r--editor/icons/icon_array.svg1
-rw-r--r--editor/icons/icon_array_mesh.svg1
-rw-r--r--editor/icons/icon_arrow_down.svg1
-rw-r--r--editor/icons/icon_arrow_left.svg1
-rw-r--r--editor/icons/icon_arrow_right.svg1
-rw-r--r--editor/icons/icon_arrow_up.svg1
-rw-r--r--editor/icons/icon_asset_lib.svg1
-rw-r--r--editor/icons/icon_atlas_texture.svg1
-rw-r--r--editor/icons/icon_audio_bus_bypass.svg1
-rw-r--r--editor/icons/icon_audio_bus_layout.svg1
-rw-r--r--editor/icons/icon_audio_bus_mute.svg1
-rw-r--r--editor/icons/icon_audio_bus_solo.svg1
-rw-r--r--editor/icons/icon_audio_stream_o_g_g_vorbis.svg1
-rw-r--r--editor/icons/icon_audio_stream_player.svg1
-rw-r--r--editor/icons/icon_audio_stream_player_2_d.svg1
-rw-r--r--editor/icons/icon_audio_stream_player_3_d.svg1
-rw-r--r--editor/icons/icon_audio_stream_sample.svg1
-rw-r--r--editor/icons/icon_auto_end.svg1
-rw-r--r--editor/icons/icon_auto_key.svg1
-rw-r--r--editor/icons/icon_auto_play.svg1
-rw-r--r--editor/icons/icon_auto_triangle.svg1
-rw-r--r--editor/icons/icon_back.svg1
-rw-r--r--editor/icons/icon_back_buffer_copy.svg1
-rw-r--r--editor/icons/icon_bake.svg1
-rw-r--r--editor/icons/icon_baked_lightmap.svg1
-rw-r--r--editor/icons/icon_baked_lightmap_data.svg1
-rw-r--r--editor/icons/icon_basis.svg1
-rw-r--r--editor/icons/icon_bezier_handles_balanced.svg1
-rw-r--r--editor/icons/icon_bezier_handles_free.svg1
-rw-r--r--editor/icons/icon_bezier_handles_mirror.svg1
-rw-r--r--editor/icons/icon_bit_map.svg1
-rw-r--r--editor/icons/icon_bitmap_font.svg1
-rw-r--r--editor/icons/icon_blend.svg1
-rw-r--r--editor/icons/icon_bone.svg1
-rw-r--r--editor/icons/icon_bone_2_d.svg1
-rw-r--r--editor/icons/icon_bone_attachment.svg1
-rw-r--r--editor/icons/icon_bone_track.svg1
-rw-r--r--editor/icons/icon_bool.svg1
-rw-r--r--editor/icons/icon_box_shape.svg1
-rw-r--r--editor/icons/icon_bucket.svg1
-rw-r--r--editor/icons/icon_bus_vu_empty.svg1
-rw-r--r--editor/icons/icon_bus_vu_frozen.svg1
-rw-r--r--editor/icons/icon_bus_vu_full.svg1
-rw-r--r--editor/icons/icon_button.svg1
-rw-r--r--editor/icons/icon_button_group.svg1
-rw-r--r--editor/icons/icon_c_p_u_particles.svg1
-rw-r--r--editor/icons/icon_c_p_u_particles_2_d.svg1
-rw-r--r--editor/icons/icon_camera.svg1
-rw-r--r--editor/icons/icon_camera_2d.svg1
-rw-r--r--editor/icons/icon_camera_texture.svg1
-rw-r--r--editor/icons/icon_canvas_item.svg1
-rw-r--r--editor/icons/icon_canvas_item_material.svg1
-rw-r--r--editor/icons/icon_canvas_item_shader.svg1
-rw-r--r--editor/icons/icon_canvas_item_shader_graph.svg1
-rw-r--r--editor/icons/icon_canvas_layer.svg1
-rw-r--r--editor/icons/icon_canvas_modulate.svg1
-rw-r--r--editor/icons/icon_capsule_mesh.svg1
-rw-r--r--editor/icons/icon_capsule_shape.svg1
-rw-r--r--editor/icons/icon_capsule_shape_2d.svg1
-rw-r--r--editor/icons/icon_center_container.svg1
-rw-r--r--editor/icons/icon_check_box.svg1
-rw-r--r--editor/icons/icon_check_button.svg1
-rw-r--r--editor/icons/icon_checkerboard.svg1
-rw-r--r--editor/icons/icon_circle_shape_2d.svg1
-rw-r--r--editor/icons/icon_class_list.svg1
-rw-r--r--editor/icons/icon_clear.svg1
-rw-r--r--editor/icons/icon_clipped_camera.svg1
-rw-r--r--editor/icons/icon_close.svg1
-rw-r--r--editor/icons/icon_collapse.svg1
-rw-r--r--editor/icons/icon_collision_polygon.svg1
-rw-r--r--editor/icons/icon_collision_polygon_2d.svg1
-rw-r--r--editor/icons/icon_collision_shape.svg1
-rw-r--r--editor/icons/icon_collision_shape_2d.svg1
-rw-r--r--editor/icons/icon_color.svg1
-rw-r--r--editor/icons/icon_color_pick.svg1
-rw-r--r--editor/icons/icon_color_picker.svg1
-rw-r--r--editor/icons/icon_color_picker_button.svg1
-rw-r--r--editor/icons/icon_color_ramp.svg1
-rw-r--r--editor/icons/icon_color_rect.svg1
-rw-r--r--editor/icons/icon_color_track_vu.svg1
-rw-r--r--editor/icons/icon_concave_polygon_shape.svg1
-rw-r--r--editor/icons/icon_concave_polygon_shape_2d.svg1
-rw-r--r--editor/icons/icon_cone_twist_joint.svg1
-rw-r--r--editor/icons/icon_confirmation_dialog.svg1
-rw-r--r--editor/icons/icon_container.svg1
-rw-r--r--editor/icons/icon_control.svg1
-rw-r--r--editor/icons/icon_control_align_bottom_center.svg1
-rw-r--r--editor/icons/icon_control_align_bottom_left.svg1
-rw-r--r--editor/icons/icon_control_align_bottom_right.svg1
-rw-r--r--editor/icons/icon_control_align_bottom_wide.svg1
-rw-r--r--editor/icons/icon_control_align_center.svg1
-rw-r--r--editor/icons/icon_control_align_center_left.svg1
-rw-r--r--editor/icons/icon_control_align_center_right.svg1
-rw-r--r--editor/icons/icon_control_align_left_center.svg1
-rw-r--r--editor/icons/icon_control_align_left_wide.svg1
-rw-r--r--editor/icons/icon_control_align_right_center.svg1
-rw-r--r--editor/icons/icon_control_align_right_wide.svg1
-rw-r--r--editor/icons/icon_control_align_top_center.svg1
-rw-r--r--editor/icons/icon_control_align_top_left.svg1
-rw-r--r--editor/icons/icon_control_align_top_right.svg1
-rw-r--r--editor/icons/icon_control_align_top_wide.svg1
-rw-r--r--editor/icons/icon_control_align_wide.svg1
-rw-r--r--editor/icons/icon_control_hcenter_wide.svg1
-rw-r--r--editor/icons/icon_control_layout.svg1
-rw-r--r--editor/icons/icon_control_vcenter_wide.svg1
-rw-r--r--editor/icons/icon_convex_polygon_shape.svg1
-rw-r--r--editor/icons/icon_convex_polygon_shape_2d.svg1
-rw-r--r--editor/icons/icon_copy_node_path.svg1
-rw-r--r--editor/icons/icon_create_new_scene_from.svg1
-rw-r--r--editor/icons/icon_crosshair.svg1
-rw-r--r--editor/icons/icon_crypto_key.svg1
-rw-r--r--editor/icons/icon_cube_map.svg1
-rw-r--r--editor/icons/icon_cube_mesh.svg1
-rw-r--r--editor/icons/icon_curve.svg1
-rw-r--r--editor/icons/icon_curve_2d.svg1
-rw-r--r--editor/icons/icon_curve_3d.svg1
-rw-r--r--editor/icons/icon_curve_close.svg1
-rw-r--r--editor/icons/icon_curve_constant.svg1
-rw-r--r--editor/icons/icon_curve_create.svg1
-rw-r--r--editor/icons/icon_curve_curve.svg1
-rw-r--r--editor/icons/icon_curve_delete.svg1
-rw-r--r--editor/icons/icon_curve_edit.svg1
-rw-r--r--editor/icons/icon_curve_in.svg1
-rw-r--r--editor/icons/icon_curve_in_out.svg1
-rw-r--r--editor/icons/icon_curve_linear.svg1
-rw-r--r--editor/icons/icon_curve_out.svg1
-rw-r--r--editor/icons/icon_curve_out_in.svg1
-rw-r--r--editor/icons/icon_curve_texture.svg1
-rw-r--r--editor/icons/icon_cylinder_mesh.svg1
-rw-r--r--editor/icons/icon_cylinder_shape.svg1
-rw-r--r--editor/icons/icon_damped_spring_joint_2d.svg1
-rw-r--r--editor/icons/icon_debug.svg1
-rw-r--r--editor/icons/icon_debug_continue.svg1
-rw-r--r--editor/icons/icon_debug_next.svg1
-rw-r--r--editor/icons/icon_debug_skip_breakpoints_off.svg1
-rw-r--r--editor/icons/icon_debug_skip_breakpoints_on.svg1
-rw-r--r--editor/icons/icon_debug_step.svg1
-rw-r--r--editor/icons/icon_default_project_icon.svg1
-rw-r--r--editor/icons/icon_delete_split.svg1
-rw-r--r--editor/icons/icon_dictionary.svg1
-rw-r--r--editor/icons/icon_directional_light.svg1
-rw-r--r--editor/icons/icon_distraction_free.svg1
-rw-r--r--editor/icons/icon_duplicate.svg1
-rw-r--r--editor/icons/icon_dynamic_font.svg1
-rw-r--r--editor/icons/icon_dynamic_font_data.svg1
-rw-r--r--editor/icons/icon_edit.svg1
-rw-r--r--editor/icons/icon_edit_bezier.svg1
-rw-r--r--editor/icons/icon_edit_internal.svg1
-rw-r--r--editor/icons/icon_edit_key.svg1
-rw-r--r--editor/icons/icon_edit_pivot.svg1
-rw-r--r--editor/icons/icon_edit_resource.svg1
-rw-r--r--editor/icons/icon_editor_3d_handle.svg1
-rw-r--r--editor/icons/icon_editor_control_anchor.svg1
-rw-r--r--editor/icons/icon_editor_curve_handle.svg1
-rw-r--r--editor/icons/icon_editor_handle.svg1
-rw-r--r--editor/icons/icon_editor_handle_add.svg1
-rw-r--r--editor/icons/icon_editor_internal_handle.svg1
-rw-r--r--editor/icons/icon_editor_path_sharp_handle.svg1
-rw-r--r--editor/icons/icon_editor_path_smooth_handle.svg1
-rw-r--r--editor/icons/icon_editor_pivot.svg1
-rw-r--r--editor/icons/icon_editor_plugin.svg1
-rw-r--r--editor/icons/icon_editor_position.svg1
-rw-r--r--editor/icons/icon_editor_position_previous.svg1
-rw-r--r--editor/icons/icon_editor_position_unselected.svg1
-rw-r--r--editor/icons/icon_enum.svg1
-rw-r--r--editor/icons/icon_environment.svg1
-rw-r--r--editor/icons/icon_error.svg1
-rw-r--r--editor/icons/icon_error_sign.svg1
-rw-r--r--editor/icons/icon_expand_bottom_dock.svg1
-rw-r--r--editor/icons/icon_favorites.svg1
-rw-r--r--editor/icons/icon_file.svg1
-rw-r--r--editor/icons/icon_file_big_thumb.svg1
-rw-r--r--editor/icons/icon_file_broken.svg1
-rw-r--r--editor/icons/icon_file_broken_big_thumb.svg1
-rw-r--r--editor/icons/icon_file_dead.svg1
-rw-r--r--editor/icons/icon_file_dead_big_thumb.svg1
-rw-r--r--editor/icons/icon_file_dead_medium_thumb.svg1
-rw-r--r--editor/icons/icon_file_dialog.svg1
-rw-r--r--editor/icons/icon_file_list.svg1
-rw-r--r--editor/icons/icon_file_medium_thumb.svg1
-rw-r--r--editor/icons/icon_file_thumbnail.svg1
-rw-r--r--editor/icons/icon_filesystem.svg1
-rw-r--r--editor/icons/icon_fixed_material.svg1
-rw-r--r--editor/icons/icon_fixed_spatial_material.svg1
-rw-r--r--editor/icons/icon_float.svg1
-rw-r--r--editor/icons/icon_folder.svg1
-rw-r--r--editor/icons/icon_folder_big_thumb.svg1
-rw-r--r--editor/icons/icon_folder_medium_thumb.svg1
-rw-r--r--editor/icons/icon_font.svg1
-rw-r--r--editor/icons/icon_forward.svg1
-rw-r--r--editor/icons/icon_g_i_probe.svg1
-rw-r--r--editor/icons/icon_g_i_probe_data.svg1
-rw-r--r--editor/icons/icon_generic_6_d_o_f_joint.svg1
-rw-r--r--editor/icons/icon_gizmo_baked_lightmap.svg1
-rw-r--r--editor/icons/icon_gizmo_c_p_u_particles.svg1
-rw-r--r--editor/icons/icon_gizmo_camera.svg1
-rw-r--r--editor/icons/icon_gizmo_directional_light.svg1
-rw-r--r--editor/icons/icon_gizmo_g_i_probe.svg1
-rw-r--r--editor/icons/icon_gizmo_light.svg1
-rw-r--r--editor/icons/icon_gizmo_listener.svg1
-rw-r--r--editor/icons/icon_gizmo_particles.svg1
-rw-r--r--editor/icons/icon_gizmo_reflection_probe.svg1
-rw-r--r--editor/icons/icon_gizmo_spatial_sample_player.svg1
-rw-r--r--editor/icons/icon_gizmo_spatial_stream_player.svg1
-rw-r--r--editor/icons/icon_gizmo_spot_light.svg1
-rw-r--r--editor/icons/icon_godot.svg1
-rw-r--r--editor/icons/icon_godot_docs.svg1
-rw-r--r--editor/icons/icon_gradient.svg1
-rw-r--r--editor/icons/icon_gradient_texture.svg1
-rw-r--r--editor/icons/icon_graph_edit.svg1
-rw-r--r--editor/icons/icon_graph_node.svg1
-rw-r--r--editor/icons/icon_grid.svg1
-rw-r--r--editor/icons/icon_grid_container.svg1
-rw-r--r--editor/icons/icon_groove_joint_2d.svg1
-rw-r--r--editor/icons/icon_group.svg1
-rw-r--r--editor/icons/icon_group_viewport.svg1
-rw-r--r--editor/icons/icon_groups.svg1
-rw-r--r--editor/icons/icon_gui_close.svg1
-rw-r--r--editor/icons/icon_gui_close_customizable.svg1
-rw-r--r--editor/icons/icon_gui_graph_node_port.svg1
-rw-r--r--editor/icons/icon_gui_resizer.svg1
-rw-r--r--editor/icons/icon_h_box_container.svg1
-rw-r--r--editor/icons/icon_h_scroll_bar.svg1
-rw-r--r--editor/icons/icon_h_separator.svg1
-rw-r--r--editor/icons/icon_h_slider.svg1
-rw-r--r--editor/icons/icon_h_split_container.svg1
-rw-r--r--editor/icons/icon_h_t_t_p_request.svg1
-rw-r--r--editor/icons/icon_headphones.svg1
-rw-r--r--editor/icons/icon_height_map_shape.svg1
-rw-r--r--editor/icons/icon_help.svg1
-rw-r--r--editor/icons/icon_help_search.svg1
-rw-r--r--editor/icons/icon_hinge_joint.svg1
-rw-r--r--editor/icons/icon_history.svg1
-rw-r--r--editor/icons/icon_hsize.svg1
-rw-r--r--editor/icons/icon_image.svg1
-rw-r--r--editor/icons/icon_image_texture.svg1
-rw-r--r--editor/icons/icon_immediate_geometry.svg1
-rw-r--r--editor/icons/icon_import_check.svg1
-rw-r--r--editor/icons/icon_import_fail.svg1
-rw-r--r--editor/icons/icon_information_sign.svg1
-rw-r--r--editor/icons/icon_insert_after.svg1
-rw-r--r--editor/icons/icon_insert_before.svg1
-rw-r--r--editor/icons/icon_instance.svg1
-rw-r--r--editor/icons/icon_instance_options.svg1
-rw-r--r--editor/icons/icon_int.svg1
-rw-r--r--editor/icons/icon_interp_cubic.svg1
-rw-r--r--editor/icons/icon_interp_linear.svg1
-rw-r--r--editor/icons/icon_interp_raw.svg1
-rw-r--r--editor/icons/icon_interp_wrap_clamp.svg1
-rw-r--r--editor/icons/icon_interp_wrap_loop.svg1
-rw-r--r--editor/icons/icon_interpolated_camera.svg1
-rw-r--r--editor/icons/icon_inverse_kinematics.svg1
-rw-r--r--editor/icons/icon_issue.svg1
-rw-r--r--editor/icons/icon_item_list.svg1
-rw-r--r--editor/icons/icon_joy_axis.svg1
-rw-r--r--editor/icons/icon_joy_button.svg1
-rw-r--r--editor/icons/icon_joypad.svg1
-rw-r--r--editor/icons/icon_key.svg1
-rw-r--r--editor/icons/icon_key_animation.svg1
-rw-r--r--editor/icons/icon_key_audio.svg1
-rw-r--r--editor/icons/icon_key_bezier.svg1
-rw-r--r--editor/icons/icon_key_bezier_handle.svg1
-rw-r--r--editor/icons/icon_key_bezier_point.svg1
-rw-r--r--editor/icons/icon_key_bezier_selected.svg1
-rw-r--r--editor/icons/icon_key_call.svg1
-rw-r--r--editor/icons/icon_key_hover.svg1
-rw-r--r--editor/icons/icon_key_invalid.svg1
-rw-r--r--editor/icons/icon_key_next.svg1
-rw-r--r--editor/icons/icon_key_position.svg1
-rw-r--r--editor/icons/icon_key_rotation.svg1
-rw-r--r--editor/icons/icon_key_scale.svg1
-rw-r--r--editor/icons/icon_key_selected.svg1
-rw-r--r--editor/icons/icon_key_value.svg1
-rw-r--r--editor/icons/icon_key_xform.svg1
-rw-r--r--editor/icons/icon_keyboard.svg1
-rw-r--r--editor/icons/icon_kinematic_body.svg1
-rw-r--r--editor/icons/icon_kinematic_body_2d.svg1
-rw-r--r--editor/icons/icon_label.svg1
-rw-r--r--editor/icons/icon_large_texture.svg1
-rw-r--r--editor/icons/icon_light_2d.svg1
-rw-r--r--editor/icons/icon_light_occluder_2d.svg1
-rw-r--r--editor/icons/icon_line_2d.svg1
-rw-r--r--editor/icons/icon_line_edit.svg1
-rw-r--r--editor/icons/icon_line_shape_2d.svg1
-rw-r--r--editor/icons/icon_link_button.svg1
-rw-r--r--editor/icons/icon_list_select.svg1
-rw-r--r--editor/icons/icon_listener.svg1
-rw-r--r--editor/icons/icon_load.svg1
-rw-r--r--editor/icons/icon_lock.svg1
-rw-r--r--editor/icons/icon_lock_viewport.svg1
-rw-r--r--editor/icons/icon_logo.svg1
-rw-r--r--editor/icons/icon_loop.svg1
-rw-r--r--editor/icons/icon_loop_interpolation.svg1
-rw-r--r--editor/icons/icon_main_play.svg1
-rw-r--r--editor/icons/icon_margin_container.svg1
-rw-r--r--editor/icons/icon_match_case.svg1
-rw-r--r--editor/icons/icon_material_preview_cube.svg1
-rw-r--r--editor/icons/icon_material_preview_cube_off.svg1
-rw-r--r--editor/icons/icon_material_preview_light_1.svg1
-rw-r--r--editor/icons/icon_material_preview_light_1_off.svg1
-rw-r--r--editor/icons/icon_material_preview_light_2.svg1
-rw-r--r--editor/icons/icon_material_preview_light_2_off.svg1
-rw-r--r--editor/icons/icon_material_preview_sphere.svg1
-rw-r--r--editor/icons/icon_material_preview_sphere_off.svg1
-rw-r--r--editor/icons/icon_member_constant.svg1
-rw-r--r--editor/icons/icon_member_method.svg1
-rw-r--r--editor/icons/icon_member_property.svg1
-rw-r--r--editor/icons/icon_member_signal.svg1
-rw-r--r--editor/icons/icon_member_theme.svg1
-rw-r--r--editor/icons/icon_menu_button.svg1
-rw-r--r--editor/icons/icon_mesh.svg1
-rw-r--r--editor/icons/icon_mesh_instance.svg1
-rw-r--r--editor/icons/icon_mesh_instance_2d.svg1
-rw-r--r--editor/icons/icon_mesh_library.svg1
-rw-r--r--editor/icons/icon_mesh_texture.svg1
-rw-r--r--editor/icons/icon_mini_object.svg1
-rw-r--r--editor/icons/icon_mirror_x.svg1
-rw-r--r--editor/icons/icon_mirror_y.svg1
-rw-r--r--editor/icons/icon_mouse.svg1
-rw-r--r--editor/icons/icon_move_down.svg1
-rw-r--r--editor/icons/icon_move_left.svg1
-rw-r--r--editor/icons/icon_move_point.svg1
-rw-r--r--editor/icons/icon_move_right.svg1
-rw-r--r--editor/icons/icon_move_up.svg1
-rw-r--r--editor/icons/icon_multi_edit.svg1
-rw-r--r--editor/icons/icon_multi_line.svg1
-rw-r--r--editor/icons/icon_multi_mesh.svg1
-rw-r--r--editor/icons/icon_multi_mesh_instance.svg1
-rw-r--r--editor/icons/icon_multi_mesh_instance_2d.svg1
-rw-r--r--editor/icons/icon_navigation.svg1
-rw-r--r--editor/icons/icon_navigation_2d.svg1
-rw-r--r--editor/icons/icon_navigation_mesh.svg1
-rw-r--r--editor/icons/icon_navigation_mesh_instance.svg1
-rw-r--r--editor/icons/icon_navigation_polygon.svg1
-rw-r--r--editor/icons/icon_navigation_polygon_instance.svg1
-rw-r--r--editor/icons/icon_new.svg1
-rw-r--r--editor/icons/icon_new_root.svg1
-rw-r--r--editor/icons/icon_nil.svg1
-rw-r--r--editor/icons/icon_nine_patch_rect.svg1
-rw-r--r--editor/icons/icon_node.svg1
-rw-r--r--editor/icons/icon_node_2d.svg1
-rw-r--r--editor/icons/icon_node_path.svg1
-rw-r--r--editor/icons/icon_node_warning.svg1
-rw-r--r--editor/icons/icon_non_favorite.svg1
-rw-r--r--editor/icons/icon_object.svg1
-rw-r--r--editor/icons/icon_occluder_polygon_2d.svg1
-rw-r--r--editor/icons/icon_omni_light.svg1
-rw-r--r--editor/icons/icon_onion.svg1
-rw-r--r--editor/icons/icon_option_button.svg1
-rw-r--r--editor/icons/icon_overbright_indicator.svg1
-rw-r--r--editor/icons/icon_override.svg1
-rw-r--r--editor/icons/icon_packed_data_container.svg1
-rw-r--r--editor/icons/icon_packed_scene.svg1
-rw-r--r--editor/icons/icon_paint_vertex.svg1
-rw-r--r--editor/icons/icon_panel.svg1
-rw-r--r--editor/icons/icon_panel_container.svg1
-rw-r--r--editor/icons/icon_panels_1.svg1
-rw-r--r--editor/icons/icon_panels_2.svg1
-rw-r--r--editor/icons/icon_panels_2_alt.svg1
-rw-r--r--editor/icons/icon_panels_3.svg1
-rw-r--r--editor/icons/icon_panels_3_alt.svg1
-rw-r--r--editor/icons/icon_panels_4.svg1
-rw-r--r--editor/icons/icon_panorama_sky.svg1
-rw-r--r--editor/icons/icon_parallax_background.svg1
-rw-r--r--editor/icons/icon_parallax_layer.svg1
-rw-r--r--editor/icons/icon_particle_attractor_2d.svg1
-rw-r--r--editor/icons/icon_particles.svg1
-rw-r--r--editor/icons/icon_particles_2d.svg1
-rw-r--r--editor/icons/icon_particles_material.svg1
-rw-r--r--editor/icons/icon_path.svg1
-rw-r--r--editor/icons/icon_path_2d.svg1
-rw-r--r--editor/icons/icon_path_follow.svg1
-rw-r--r--editor/icons/icon_path_follow_2d.svg1
-rw-r--r--editor/icons/icon_pause.svg1
-rw-r--r--editor/icons/icon_physical_bone.svg1
-rw-r--r--editor/icons/icon_pin.svg1
-rw-r--r--editor/icons/icon_pin_joint.svg1
-rw-r--r--editor/icons/icon_pin_joint_2d.svg1
-rw-r--r--editor/icons/icon_pin_pressed.svg1
-rw-r--r--editor/icons/icon_plane.svg1
-rw-r--r--editor/icons/icon_plane_mesh.svg1
-rw-r--r--editor/icons/icon_plane_shape.svg1
-rw-r--r--editor/icons/icon_play.svg1
-rw-r--r--editor/icons/icon_play_backwards.svg1
-rw-r--r--editor/icons/icon_play_custom.svg1
-rw-r--r--editor/icons/icon_play_overlay.svg1
-rw-r--r--editor/icons/icon_play_scene.svg1
-rw-r--r--editor/icons/icon_play_start.svg1
-rw-r--r--editor/icons/icon_play_start_backwards.svg1
-rw-r--r--editor/icons/icon_play_travel.svg1
-rw-r--r--editor/icons/icon_plugin_script.svg1
-rw-r--r--editor/icons/icon_point_mesh.svg1
-rw-r--r--editor/icons/icon_polygon_2_d.svg1
-rw-r--r--editor/icons/icon_polygon_path_finder.svg1
-rw-r--r--editor/icons/icon_pool_byte_array.svg1
-rw-r--r--editor/icons/icon_pool_color_array.svg1
-rw-r--r--editor/icons/icon_pool_int_array.svg1
-rw-r--r--editor/icons/icon_pool_real_array.svg1
-rw-r--r--editor/icons/icon_pool_string_array.svg1
-rw-r--r--editor/icons/icon_pool_vector2_array.svg1
-rw-r--r--editor/icons/icon_pool_vector3_array.svg1
-rw-r--r--editor/icons/icon_popup.svg1
-rw-r--r--editor/icons/icon_popup_dialog.svg1
-rw-r--r--editor/icons/icon_popup_menu.svg1
-rw-r--r--editor/icons/icon_popup_panel.svg1
-rw-r--r--editor/icons/icon_portal.svg1
-rw-r--r--editor/icons/icon_position_2d.svg1
-rw-r--r--editor/icons/icon_position_3d.svg1
-rw-r--r--editor/icons/icon_prism_mesh.svg1
-rw-r--r--editor/icons/icon_procedural_sky.svg1
-rw-r--r--editor/icons/icon_progress_1.svg1
-rw-r--r--editor/icons/icon_progress_2.svg1
-rw-r--r--editor/icons/icon_progress_3.svg1
-rw-r--r--editor/icons/icon_progress_4.svg1
-rw-r--r--editor/icons/icon_progress_5.svg1
-rw-r--r--editor/icons/icon_progress_6.svg1
-rw-r--r--editor/icons/icon_progress_7.svg1
-rw-r--r--editor/icons/icon_progress_8.svg1
-rw-r--r--editor/icons/icon_progress_bar.svg1
-rw-r--r--editor/icons/icon_project_icon_loading.svg1
-rw-r--r--editor/icons/icon_proximity_group.svg1
-rw-r--r--editor/icons/icon_proxy_texture.svg1
-rw-r--r--editor/icons/icon_quad.svg1
-rw-r--r--editor/icons/icon_quad_mesh.svg1
-rw-r--r--editor/icons/icon_quat.svg1
-rw-r--r--editor/icons/icon_r_i_d.svg1
-rw-r--r--editor/icons/icon_ray_cast.svg1
-rw-r--r--editor/icons/icon_ray_cast_2d.svg1
-rw-r--r--editor/icons/icon_ray_shape.svg1
-rw-r--r--editor/icons/icon_ray_shape_2d.svg1
-rw-r--r--editor/icons/icon_rayito.svg1
-rw-r--r--editor/icons/icon_rect2.svg1
-rw-r--r--editor/icons/icon_rectangle_shape_2d.svg1
-rw-r--r--editor/icons/icon_reference_rect.svg1
-rw-r--r--editor/icons/icon_reflection_probe.svg1
-rw-r--r--editor/icons/icon_region_edit.svg1
-rw-r--r--editor/icons/icon_reload.svg1
-rw-r--r--editor/icons/icon_reload_small.svg1
-rw-r--r--editor/icons/icon_remote_transform.svg1
-rw-r--r--editor/icons/icon_remote_transform_2d.svg1
-rw-r--r--editor/icons/icon_remove.svg1
-rw-r--r--editor/icons/icon_remove_internal.svg1
-rw-r--r--editor/icons/icon_rename.svg1
-rw-r--r--editor/icons/icon_reparent.svg1
-rw-r--r--editor/icons/icon_reparent_to_new_node.svg1
-rw-r--r--editor/icons/icon_resource_preloader.svg1
-rw-r--r--editor/icons/icon_rich_text_effect.svg1
-rw-r--r--editor/icons/icon_rich_text_label.svg1
-rw-r--r--editor/icons/icon_rigid_body.svg1
-rw-r--r--editor/icons/icon_rigid_body_2d.svg1
-rw-r--r--editor/icons/icon_room.svg1
-rw-r--r--editor/icons/icon_room_bounds.svg1
-rw-r--r--editor/icons/icon_rotate_0.svg1
-rw-r--r--editor/icons/icon_rotate_180.svg1
-rw-r--r--editor/icons/icon_rotate_270.svg1
-rw-r--r--editor/icons/icon_rotate_90.svg1
-rw-r--r--editor/icons/icon_rotate_left.svg1
-rw-r--r--editor/icons/icon_rotate_right.svg1
-rw-r--r--editor/icons/icon_ruler.svg1
-rw-r--r--editor/icons/icon_sample_library.svg1
-rw-r--r--editor/icons/icon_save.svg1
-rw-r--r--editor/icons/icon_script.svg1
-rw-r--r--editor/icons/icon_script_create.svg1
-rw-r--r--editor/icons/icon_script_create_dialog.svg1
-rw-r--r--editor/icons/icon_script_extend.svg1
-rw-r--r--editor/icons/icon_script_remove.svg1
-rw-r--r--editor/icons/icon_scroll_container.svg1
-rw-r--r--editor/icons/icon_search.svg1
-rw-r--r--editor/icons/icon_segment_shape_2d.svg1
-rw-r--r--editor/icons/icon_shader.svg1
-rw-r--r--editor/icons/icon_shader_material.svg1
-rw-r--r--editor/icons/icon_short_cut.svg1
-rw-r--r--editor/icons/icon_signal.svg1
-rw-r--r--editor/icons/icon_signals.svg1
-rw-r--r--editor/icons/icon_signals_and_groups.svg1
-rw-r--r--editor/icons/icon_skeleton.svg1
-rw-r--r--editor/icons/icon_skeleton_2d.svg1
-rw-r--r--editor/icons/icon_skeleton_i_k.svg1
-rw-r--r--editor/icons/icon_slider_joint.svg1
-rw-r--r--editor/icons/icon_slot.svg1
-rw-r--r--editor/icons/icon_snap.svg1
-rw-r--r--editor/icons/icon_snap_grid.svg1
-rw-r--r--editor/icons/icon_soft_body.svg1
-rw-r--r--editor/icons/icon_sort.svg1
-rw-r--r--editor/icons/icon_spatial.svg1
-rw-r--r--editor/icons/icon_spatial_material.svg1
-rw-r--r--editor/icons/icon_sphere_mesh.svg1
-rw-r--r--editor/icons/icon_sphere_shape.svg1
-rw-r--r--editor/icons/icon_spin_box.svg1
-rw-r--r--editor/icons/icon_spot_light.svg1
-rw-r--r--editor/icons/icon_spring_arm.svg1
-rw-r--r--editor/icons/icon_sprite.svg1
-rw-r--r--editor/icons/icon_sprite_3d.svg1
-rw-r--r--editor/icons/icon_sprite_frames.svg1
-rw-r--r--editor/icons/icon_sprite_sheet.svg1
-rw-r--r--editor/icons/icon_static_body.svg1
-rw-r--r--editor/icons/icon_static_body_2d.svg1
-rw-r--r--editor/icons/icon_status_error.svg1
-rw-r--r--editor/icons/icon_status_success.svg1
-rw-r--r--editor/icons/icon_status_warning.svg1
-rw-r--r--editor/icons/icon_stop.svg1
-rw-r--r--editor/icons/icon_stream_texture.svg1
-rw-r--r--editor/icons/icon_string.svg1
-rw-r--r--editor/icons/icon_style_box_empty.svg1
-rw-r--r--editor/icons/icon_style_box_flat.svg1
-rw-r--r--editor/icons/icon_style_box_line.svg1
-rw-r--r--editor/icons/icon_style_box_texture.svg1
-rw-r--r--editor/icons/icon_tab_container.svg1
-rw-r--r--editor/icons/icon_tabs.svg1
-rw-r--r--editor/icons/icon_test_cube.svg1
-rw-r--r--editor/icons/icon_text_edit.svg1
-rw-r--r--editor/icons/icon_text_file.svg1
-rw-r--r--editor/icons/icon_texture_3_d.svg1
-rw-r--r--editor/icons/icon_texture_array.svg1
-rw-r--r--editor/icons/icon_texture_button.svg1
-rw-r--r--editor/icons/icon_texture_progress.svg1
-rw-r--r--editor/icons/icon_texture_rect.svg1
-rw-r--r--editor/icons/icon_theme.svg1
-rw-r--r--editor/icons/icon_thumbnail_wait.svg1
-rw-r--r--editor/icons/icon_tile_map.svg1
-rw-r--r--editor/icons/icon_tile_set.svg1
-rw-r--r--editor/icons/icon_time.svg1
-rw-r--r--editor/icons/icon_timeline_indicator.svg1
-rw-r--r--editor/icons/icon_timer.svg1
-rw-r--r--editor/icons/icon_tool_add_node.svg1
-rw-r--r--editor/icons/icon_tool_button.svg1
-rw-r--r--editor/icons/icon_tool_connect.svg1
-rw-r--r--editor/icons/icon_tool_move.svg1
-rw-r--r--editor/icons/icon_tool_pan.svg1
-rw-r--r--editor/icons/icon_tool_rotate.svg1
-rw-r--r--editor/icons/icon_tool_scale.svg1
-rw-r--r--editor/icons/icon_tool_select.svg1
-rw-r--r--editor/icons/icon_tool_triangle.svg1
-rw-r--r--editor/icons/icon_tools.svg1
-rw-r--r--editor/icons/icon_touch_screen_button.svg1
-rw-r--r--editor/icons/icon_track_add_key.svg1
-rw-r--r--editor/icons/icon_track_add_key_hl.svg1
-rw-r--r--editor/icons/icon_track_capture.svg1
-rw-r--r--editor/icons/icon_track_continuous.svg1
-rw-r--r--editor/icons/icon_track_discrete.svg1
-rw-r--r--editor/icons/icon_track_trigger.svg1
-rw-r--r--editor/icons/icon_transform.svg1
-rw-r--r--editor/icons/icon_transform_2_D.svg1
-rw-r--r--editor/icons/icon_transition_end.svg1
-rw-r--r--editor/icons/icon_transition_end_auto.svg1
-rw-r--r--editor/icons/icon_transition_end_auto_big.svg1
-rw-r--r--editor/icons/icon_transition_end_big.svg1
-rw-r--r--editor/icons/icon_transition_immediate.svg1
-rw-r--r--editor/icons/icon_transition_immediate_auto.svg1
-rw-r--r--editor/icons/icon_transition_immediate_auto_big.svg1
-rw-r--r--editor/icons/icon_transition_immediate_big.svg1
-rw-r--r--editor/icons/icon_transition_sync.svg1
-rw-r--r--editor/icons/icon_transition_sync_auto.svg1
-rw-r--r--editor/icons/icon_transition_sync_auto_big.svg1
-rw-r--r--editor/icons/icon_transition_sync_big.svg1
-rw-r--r--editor/icons/icon_translation.svg1
-rw-r--r--editor/icons/icon_transpose.svg1
-rw-r--r--editor/icons/icon_tree.svg1
-rw-r--r--editor/icons/icon_tween.svg1
-rw-r--r--editor/icons/icon_unbone.svg1
-rw-r--r--editor/icons/icon_ungroup.svg1
-rw-r--r--editor/icons/icon_unlock.svg1
-rw-r--r--editor/icons/icon_unpaint_vertex.svg1
-rw-r--r--editor/icons/icon_uv.svg1
-rw-r--r--editor/icons/icon_v_box_container.svg1
-rw-r--r--editor/icons/icon_v_scroll_bar.svg1
-rw-r--r--editor/icons/icon_v_separator.svg1
-rw-r--r--editor/icons/icon_v_slider.svg1
-rw-r--r--editor/icons/icon_v_split_container.svg1
-rw-r--r--editor/icons/icon_variant.svg1
-rw-r--r--editor/icons/icon_vector2.svg1
-rw-r--r--editor/icons/icon_vector3.svg1
-rw-r--r--editor/icons/icon_vehicle_body.svg1
-rw-r--r--editor/icons/icon_vehicle_wheel.svg1
-rw-r--r--editor/icons/icon_video_player.svg1
-rw-r--r--editor/icons/icon_viewport.svg1
-rw-r--r--editor/icons/icon_viewport_container.svg1
-rw-r--r--editor/icons/icon_viewport_speed.svg1
-rw-r--r--editor/icons/icon_viewport_texture.svg1
-rw-r--r--editor/icons/icon_viewport_zoom.svg1
-rw-r--r--editor/icons/icon_visibility_enabler.svg1
-rw-r--r--editor/icons/icon_visibility_enabler_2d.svg1
-rw-r--r--editor/icons/icon_visibility_notifier.svg1
-rw-r--r--editor/icons/icon_visibility_notifier_2d.svg1
-rw-r--r--editor/icons/icon_visual_shader.svg1
-rw-r--r--editor/icons/icon_visual_shader_port.svg1
-rw-r--r--editor/icons/icon_warning.svg1
-rw-r--r--editor/icons/icon_window_dialog.svg1
-rw-r--r--editor/icons/icon_world.svg1
-rw-r--r--editor/icons/icon_world_2d.svg1
-rw-r--r--editor/icons/icon_world_environment.svg1
-rw-r--r--editor/icons/icon_x509_certificate.svg1
-rw-r--r--editor/icons/icon_y_sort.svg1
-rw-r--r--editor/icons/icon_zoom.svg1
-rw-r--r--editor/icons/icon_zoom_less.svg1
-rw-r--r--editor/icons/icon_zoom_more.svg1
-rw-r--r--editor/icons/icon_zoom_reset.svg1
-rw-r--r--editor/icons/int.svg1
-rw-r--r--editor/import/SCsub2
-rw-r--r--editor/import/collada.cpp2407
-rw-r--r--editor/import/collada.h578
-rw-r--r--editor/import/editor_import_collada.cpp496
-rw-r--r--editor/import/editor_import_collada.h9
-rw-r--r--editor/import/editor_import_plugin.cpp5
-rw-r--r--editor/import/editor_import_plugin.h24
-rw-r--r--editor/import/editor_scene_importer_gltf.cpp705
-rw-r--r--editor/import/editor_scene_importer_gltf.h203
-rw-r--r--editor/import/resource_importer_bitmask.cpp18
-rw-r--r--editor/import/resource_importer_bitmask.h24
-rw-r--r--editor/import/resource_importer_csv.cpp8
-rw-r--r--editor/import/resource_importer_csv.h20
-rw-r--r--editor/import/resource_importer_csv_translation.cpp27
-rw-r--r--editor/import/resource_importer_csv_translation.h20
-rw-r--r--editor/import/resource_importer_image.cpp9
-rw-r--r--editor/import/resource_importer_image.h20
-rw-r--r--editor/import/resource_importer_layered_texture.cpp488
-rw-r--r--editor/import/resource_importer_layered_texture.h100
-rw-r--r--editor/import/resource_importer_obj.cpp95
-rw-r--r--editor/import/resource_importer_obj.h29
-rw-r--r--editor/import/resource_importer_scene.cpp623
-rw-r--r--editor/import/resource_importer_scene.h47
-rw-r--r--editor/import/resource_importer_shader_file.cpp118
-rw-r--r--editor/import/resource_importer_shader_file.h57
-rw-r--r--editor/import/resource_importer_texture.cpp555
-rw-r--r--editor/import/resource_importer_texture.h74
-rw-r--r--editor/import/resource_importer_texture_atlas.cpp71
-rw-r--r--editor/import/resource_importer_texture_atlas.h26
-rw-r--r--editor/import/resource_importer_wav.cpp53
-rw-r--r--editor/import/resource_importer_wav.h46
-rw-r--r--editor/import_dock.cpp165
-rw-r--r--editor/import_dock.h1
-rw-r--r--editor/input_map_editor.cpp1048
-rw-r--r--editor/input_map_editor.h107
-rw-r--r--editor/inspector_dock.cpp172
-rw-r--r--editor/inspector_dock.h16
-rw-r--r--editor/localization_editor.cpp794
-rw-r--r--editor/localization_editor.h103
-rw-r--r--editor/multi_node_edit.cpp41
-rw-r--r--editor/multi_node_edit.h1
-rw-r--r--editor/node_3d_editor_gizmos.cpp4688
-rw-r--r--editor/node_3d_editor_gizmos.h451
-rw-r--r--editor/node_dock.cpp30
-rw-r--r--editor/node_dock.h5
-rw-r--r--editor/pane_drag.cpp80
-rw-r--r--editor/pane_drag.h52
-rw-r--r--editor/plugin_config_dialog.cpp38
-rw-r--r--editor/plugin_config_dialog.h1
-rw-r--r--editor/plugins/SCsub2
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.cpp255
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.h48
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.cpp134
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.h17
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.cpp216
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.h19
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.cpp176
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.h7
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp593
-rw-r--r--editor/plugins/animation_player_editor_plugin.h27
-rw-r--r--editor/plugins/animation_state_machine_editor.cpp283
-rw-r--r--editor/plugins/animation_state_machine_editor.h18
-rw-r--r--editor/plugins/animation_tree_editor_plugin.cpp48
-rw-r--r--editor/plugins/animation_tree_editor_plugin.h14
-rw-r--r--editor/plugins/animation_tree_player_editor_plugin.cpp1451
-rw-r--r--editor/plugins/animation_tree_player_editor_plugin.h184
-rw-r--r--editor/plugins/asset_library_editor_plugin.cpp381
-rw-r--r--editor/plugins/asset_library_editor_plugin.h38
-rw-r--r--editor/plugins/audio_stream_editor_plugin.cpp79
-rw-r--r--editor/plugins/audio_stream_editor_plugin.h18
-rw-r--r--editor/plugins/baked_lightmap_editor_plugin.cpp86
-rw-r--r--editor/plugins/baked_lightmap_editor_plugin.h20
-rw-r--r--editor/plugins/camera_3d_editor_plugin.cpp116
-rw-r--r--editor/plugins/camera_3d_editor_plugin.h73
-rw-r--r--editor/plugins/camera_editor_plugin.cpp126
-rw-r--r--editor/plugins/camera_editor_plugin.h75
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp1477
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h116
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.cpp4
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.h6
-rw-r--r--editor/plugins/collision_polygon_3d_editor_plugin.cpp577
-rw-r--r--editor/plugins/collision_polygon_3d_editor_plugin.h116
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.cpp613
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.h119
-rw-r--r--editor/plugins/collision_shape_2d_editor_plugin.cpp74
-rw-r--r--editor/plugins/collision_shape_2d_editor_plugin.h18
-rw-r--r--editor/plugins/cpu_particles_2d_editor_plugin.cpp70
-rw-r--r--editor/plugins/cpu_particles_2d_editor_plugin.h11
-rw-r--r--editor/plugins/cpu_particles_3d_editor_plugin.cpp131
-rw-r--r--editor/plugins/cpu_particles_3d_editor_plugin.h83
-rw-r--r--editor/plugins/cpu_particles_editor_plugin.cpp154
-rw-r--r--editor/plugins/cpu_particles_editor_plugin.h86
-rw-r--r--editor/plugins/curve_editor_plugin.cpp135
-rw-r--r--editor/plugins/curve_editor_plugin.h12
-rw-r--r--editor/plugins/debugger_editor_plugin.cpp214
-rw-r--r--editor/plugins/debugger_editor_plugin.h71
-rw-r--r--editor/plugins/editor_debugger_plugin.cpp124
-rw-r--r--editor/plugins/editor_debugger_plugin.h64
-rw-r--r--editor/plugins/editor_preview_plugins.cpp405
-rw-r--r--editor/plugins/editor_preview_plugins.h46
-rw-r--r--editor/plugins/gi_probe_editor_plugin.cpp114
-rw-r--r--editor/plugins/gi_probe_editor_plugin.h19
-rw-r--r--editor/plugins/gpu_particles_2d_editor_plugin.cpp410
-rw-r--r--editor/plugins/gpu_particles_2d_editor_plugin.h99
-rw-r--r--editor/plugins/gpu_particles_3d_editor_plugin.cpp463
-rw-r--r--editor/plugins/gpu_particles_3d_editor_plugin.h118
-rw-r--r--editor/plugins/gradient_editor_plugin.cpp20
-rw-r--r--editor/plugins/gradient_editor_plugin.h9
-rw-r--r--editor/plugins/item_list_editor_plugin.cpp141
-rw-r--r--editor/plugins/item_list_editor_plugin.h118
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.cpp32
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.h20
-rw-r--r--editor/plugins/line_2d_editor_plugin.cpp8
-rw-r--r--editor/plugins/line_2d_editor_plugin.h14
-rw-r--r--editor/plugins/material_editor_plugin.cpp239
-rw-r--r--editor/plugins/material_editor_plugin.h79
-rw-r--r--editor/plugins/mesh_editor_plugin.cpp49
-rw-r--r--editor/plugins/mesh_editor_plugin.h32
-rw-r--r--editor/plugins/mesh_instance_3d_editor_plugin.cpp514
-rw-r--r--editor/plugins/mesh_instance_3d_editor_plugin.h102
-rw-r--r--editor/plugins/mesh_instance_editor_plugin.cpp499
-rw-r--r--editor/plugins/mesh_instance_editor_plugin.h104
-rw-r--r--editor/plugins/mesh_library_editor_plugin.cpp107
-rw-r--r--editor/plugins/mesh_library_editor_plugin.h12
-rw-r--r--editor/plugins/multimesh_editor_plugin.cpp117
-rw-r--r--editor/plugins/multimesh_editor_plugin.h20
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.cpp31
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.h26
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp6831
-rw-r--r--editor/plugins/node_3d_editor_plugin.h891
-rw-r--r--editor/plugins/packed_scene_translation_parser_plugin.cpp116
-rw-r--r--editor/plugins/packed_scene_translation_parser_plugin.h49
-rw-r--r--editor/plugins/particles_2d_editor_plugin.cpp440
-rw-r--r--editor/plugins/particles_2d_editor_plugin.h100
-rw-r--r--editor/plugins/particles_editor_plugin.cpp530
-rw-r--r--editor/plugins/particles_editor_plugin.h123
-rw-r--r--editor/plugins/path_2d_editor_plugin.cpp158
-rw-r--r--editor/plugins/path_2d_editor_plugin.h29
-rw-r--r--editor/plugins/path_3d_editor_plugin.cpp645
-rw-r--r--editor/plugins/path_3d_editor_plugin.h118
-rw-r--r--editor/plugins/path_editor_plugin.cpp657
-rw-r--r--editor/plugins/path_editor_plugin.h123
-rw-r--r--editor/plugins/physical_bone_3d_editor_plugin.cpp105
-rw-r--r--editor/plugins/physical_bone_3d_editor_plugin.h78
-rw-r--r--editor/plugins/physical_bone_plugin.cpp113
-rw-r--r--editor/plugins/physical_bone_plugin.h78
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp418
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.h36
-rw-r--r--editor/plugins/resource_preloader_editor_plugin.cpp100
-rw-r--r--editor/plugins/resource_preloader_editor_plugin.h12
-rw-r--r--editor/plugins/root_motion_editor_plugin.cpp52
-rw-r--r--editor/plugins/root_motion_editor_plugin.h10
-rw-r--r--editor/plugins/script_editor_plugin.cpp1300
-rw-r--r--editor/plugins/script_editor_plugin.h138
-rw-r--r--editor/plugins/script_text_editor.cpp1109
-rw-r--r--editor/plugins/script_text_editor.h139
-rw-r--r--editor/plugins/shader_editor_plugin.cpp316
-rw-r--r--editor/plugins/shader_editor_plugin.h30
-rw-r--r--editor/plugins/shader_file_editor_plugin.cpp324
-rw-r--r--editor/plugins/shader_file_editor_plugin.h92
-rw-r--r--editor/plugins/skeleton_2d_editor_plugin.cpp24
-rw-r--r--editor/plugins/skeleton_2d_editor_plugin.h12
-rw-r--r--editor/plugins/skeleton_3d_editor_plugin.cpp686
-rw-r--r--editor/plugins/skeleton_3d_editor_plugin.h208
-rw-r--r--editor/plugins/skeleton_editor_plugin.cpp194
-rw-r--r--editor/plugins/skeleton_editor_plugin.h96
-rw-r--r--editor/plugins/skeleton_ik_3d_editor_plugin.cpp95
-rw-r--r--editor/plugins/skeleton_ik_3d_editor_plugin.h63
-rw-r--r--editor/plugins/skeleton_ik_editor_plugin.cpp110
-rw-r--r--editor/plugins/skeleton_ik_editor_plugin.h65
-rw-r--r--editor/plugins/spatial_editor_plugin.cpp6412
-rw-r--r--editor/plugins/spatial_editor_plugin.h815
-rw-r--r--editor/plugins/sprite_2d_editor_plugin.cpp593
-rw-r--r--editor/plugins/sprite_2d_editor_plugin.h115
-rw-r--r--editor/plugins/sprite_editor_plugin.cpp615
-rw-r--r--editor/plugins/sprite_editor_plugin.h117
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.cpp562
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.h63
-rw-r--r--editor/plugins/style_box_editor_plugin.cpp25
-rw-r--r--editor/plugins/style_box_editor_plugin.h12
-rw-r--r--editor/plugins/text_editor.cpp312
-rw-r--r--editor/plugins/text_editor.h105
-rw-r--r--editor/plugins/texture_3d_editor_plugin.cpp213
-rw-r--r--editor/plugins/texture_3d_editor_plugin.h93
-rw-r--r--editor/plugins/texture_editor_plugin.cpp43
-rw-r--r--editor/plugins/texture_editor_plugin.h14
-rw-r--r--editor/plugins/texture_layered_editor_plugin.cpp278
-rw-r--r--editor/plugins/texture_layered_editor_plugin.h95
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp341
-rw-r--r--editor/plugins/texture_region_editor_plugin.h31
-rw-r--r--editor/plugins/theme_editor_plugin.cpp207
-rw-r--r--editor/plugins/theme_editor_plugin.h12
-rw-r--r--editor/plugins/tile_map_editor_plugin.cpp784
-rw-r--r--editor/plugins/tile_map_editor_plugin.h79
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp692
-rw-r--r--editor/plugins/tile_set_editor_plugin.h42
-rw-r--r--editor/plugins/version_control_editor_plugin.cpp136
-rw-r--r--editor/plugins/version_control_editor_plugin.h5
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp2758
-rw-r--r--editor/plugins/visual_shader_editor_plugin.h176
-rw-r--r--editor/pot_generator.cpp219
-rw-r--r--editor/pot_generator.h67
-rw-r--r--editor/progress_dialog.cpp59
-rw-r--r--editor/progress_dialog.h8
-rw-r--r--editor/project_export.cpp534
-rw-r--r--editor/project_export.h13
-rw-r--r--editor/project_manager.cpp1187
-rw-r--r--editor/project_manager.h84
-rw-r--r--editor/project_settings_editor.cpp2209
-rw-r--r--editor/project_settings_editor.h169
-rw-r--r--editor/property_editor.cpp622
-rw-r--r--editor/property_editor.h8
-rw-r--r--editor/property_selector.cpp259
-rw-r--r--editor/property_selector.h10
-rw-r--r--editor/pvrtc_compress.cpp21
-rw-r--r--editor/quick_open.cpp346
-rw-r--r--editor/quick_open.h37
-rw-r--r--editor/rename_dialog.cpp211
-rw-r--r--editor/rename_dialog.h14
-rw-r--r--editor/reparent_dialog.cpp31
-rw-r--r--editor/reparent_dialog.h1
-rw-r--r--editor/run_settings_dialog.cpp17
-rw-r--r--editor/run_settings_dialog.h1
-rw-r--r--editor/scene_tree_dock.cpp1056
-rw-r--r--editor/scene_tree_dock.h25
-rw-r--r--editor/scene_tree_editor.cpp543
-rw-r--r--editor/scene_tree_editor.h3
-rw-r--r--editor/script_create_dialog.cpp249
-rw-r--r--editor/script_create_dialog.h7
-rw-r--r--editor/script_editor_debugger.cpp2640
-rw-r--r--editor/script_editor_debugger.h293
-rw-r--r--editor/settings_config_dialog.cpp172
-rw-r--r--editor/settings_config_dialog.h8
-rw-r--r--editor/shader_globals_editor.cpp479
-rw-r--r--editor/shader_globals_editor.h67
-rw-r--r--editor/spatial_editor_gizmos.cpp4503
-rw-r--r--editor/spatial_editor_gizmos.h433
-rw-r--r--editor/translations/af.po432
-rw-r--r--editor/translations/ar.po5072
-rw-r--r--editor/translations/bg.po2144
-rw-r--r--editor/translations/bn.po514
-rw-r--r--editor/translations/ca.po1023
-rw-r--r--editor/translations/cs.po1292
-rw-r--r--editor/translations/da.po500
-rw-r--r--editor/translations/de.po797
-rw-r--r--editor/translations/de_CH.po12857
-rw-r--r--editor/translations/editor.pot384
-rw-r--r--editor/translations/el.po798
-rw-r--r--editor/translations/eo.po490
-rw-r--r--editor/translations/es.po916
-rw-r--r--editor/translations/es_AR.po584
-rw-r--r--editor/translations/et.po1467
-rw-r--r--editor/translations/eu.po1025
-rwxr-xr-xeditor/translations/extract.py254
-rw-r--r--editor/translations/fa.po1179
-rw-r--r--editor/translations/fi.po711
-rw-r--r--editor/translations/fil.po427
-rw-r--r--editor/translations/fr.po862
-rw-r--r--editor/translations/ga.po402
-rw-r--r--editor/translations/he.po1702
-rw-r--r--editor/translations/hi.po2155
-rw-r--r--editor/translations/hr.po406
-rw-r--r--editor/translations/hu.po3079
-rw-r--r--editor/translations/id.po1764
-rw-r--r--editor/translations/is.po404
-rw-r--r--editor/translations/it.po1104
-rw-r--r--editor/translations/ja.po1462
-rw-r--r--editor/translations/ka.po411
-rw-r--r--editor/translations/ko.po3068
-rw-r--r--editor/translations/lt.po574
-rw-r--r--editor/translations/lv.po1350
-rw-r--r--editor/translations/mi.po384
-rw-r--r--editor/translations/ml.po384
-rw-r--r--editor/translations/mr.po472
-rw-r--r--editor/translations/ms.po1564
-rw-r--r--editor/translations/nb.po719
-rw-r--r--editor/translations/nl.po729
-rw-r--r--editor/translations/or.po384
-rw-r--r--editor/translations/pl.po711
-rw-r--r--editor/translations/pr.po430
-rw-r--r--editor/translations/pt.po13968
-rw-r--r--editor/translations/pt_BR.po915
-rw-r--r--editor/translations/pt_PT.po13673
-rw-r--r--editor/translations/ro.po1376
-rw-r--r--editor/translations/ru.po963
-rw-r--r--editor/translations/si.po388
-rw-r--r--editor/translations/sk.po3069
-rw-r--r--editor/translations/sl.po525
-rw-r--r--editor/translations/sq.po472
-rw-r--r--editor/translations/sr_Cyrl.po3813
-rw-r--r--editor/translations/sr_Latn.po393
-rw-r--r--editor/translations/sv.po866
-rw-r--r--editor/translations/ta.po407
-rw-r--r--editor/translations/te.po397
-rw-r--r--editor/translations/th.po2847
-rw-r--r--editor/translations/tr.po1752
-rw-r--r--editor/translations/uk.po619
-rw-r--r--editor/translations/ur_PK.po413
-rw-r--r--editor/translations/vi.po1083
-rw-r--r--editor/translations/zh_CN.po805
-rw-r--r--editor/translations/zh_HK.po1032
-rw-r--r--editor/translations/zh_TW.po6214
1793 files changed, 114146 insertions, 109279 deletions
diff --git a/editor/SCsub b/editor/SCsub
index 2b560f68e8..a976c4ed12 100644
--- a/editor/SCsub
+++ b/editor/SCsub
@@ -1,91 +1,109 @@
#!/usr/bin/env python
-Import('env')
+Import("env")
env.editor_sources = []
import os
import os.path
-from platform_methods import run_in_subprocess
-from compat import open_utf8
+import glob
import editor_builders
def _make_doc_data_class_path(to_path):
# NOTE: It is safe to generate this file here, since this is still executed serially
- g = open_utf8(os.path.join(to_path, "doc_data_class_path.gen.h"), "w")
+ g = open(os.path.join(to_path, "doc_data_class_path.gen.h"), "w", encoding="utf-8")
g.write("static const int _doc_data_class_path_count = " + str(len(env.doc_class_path)) + ";\n")
g.write("struct _DocDataClassPath { const char* name; const char* path; };\n")
- g.write("static const _DocDataClassPath _doc_data_class_paths[" + str(len(env.doc_class_path) + 1) + "] = {\n");
+ g.write("static const _DocDataClassPath _doc_data_class_paths[" + str(len(env.doc_class_path) + 1) + "] = {\n")
for c in sorted(env.doc_class_path):
- g.write("\t{\"" + c + "\", \"" + env.doc_class_path[c] + "\"},\n")
- g.write("\t{NULL, NULL}\n")
+ g.write('\t{"' + c + '", "' + env.doc_class_path[c] + '"},\n')
+ g.write("\t{nullptr, nullptr}\n")
g.write("};\n")
g.close()
-if env['tools']:
+if env["tools"]:
# Register exporters
reg_exporters_inc = '#include "register_exporters.h"\n'
- reg_exporters = 'void register_exporters() {\n'
+ reg_exporters = "void register_exporters() {\n"
for e in env.platform_exporters:
env.add_source_files(env.editor_sources, "#platform/" + e + "/export/export.cpp")
- reg_exporters += '\tregister_' + e + '_exporter();\n'
+ reg_exporters += "\tregister_" + e + "_exporter();\n"
reg_exporters_inc += '#include "platform/' + e + '/export/export.h"\n'
- reg_exporters += '}\n'
+ reg_exporters += "}\n"
# NOTE: It is safe to generate this file here, since this is still executed serially
- with open_utf8("register_exporters.gen.cpp", "w") as f:
+ with open("register_exporters.gen.cpp", "w", encoding="utf-8") as f:
f.write(reg_exporters_inc)
f.write(reg_exporters)
- # API documentation
+ # Core API documentation.
docs = []
- doc_dirs = ["doc/classes"]
+ docs += Glob("#doc/classes/*.xml")
- for p in env.doc_class_path.values():
- if p not in doc_dirs:
- doc_dirs.append(p)
+ # Module API documentation.
+ module_dirs = []
+ for d in env.doc_class_path.values():
+ if d not in module_dirs:
+ module_dirs.append(d)
- for d in doc_dirs:
- try:
- for f in os.listdir(os.path.join(env.Dir('#').abspath, d)):
- docs.append("#" + os.path.join(d, f))
- except OSError:
- pass
+ for d in module_dirs:
+ if not os.path.isabs(d):
+ docs += Glob("#" + d + "/*.xml") # Built-in.
+ else:
+ docs += Glob(d + "/*.xml") # Custom.
- _make_doc_data_class_path(os.path.join(env.Dir('#').abspath, "editor/doc"))
+ _make_doc_data_class_path(os.path.join(env.Dir("#").abspath, "editor"))
docs = sorted(docs)
env.Depends("#editor/doc_data_compressed.gen.h", docs)
- env.CommandNoCache("#editor/doc_data_compressed.gen.h", docs, run_in_subprocess(editor_builders.make_doc_header))
+ env.CommandNoCache(
+ "#editor/doc_data_compressed.gen.h",
+ docs,
+ env.Run(editor_builders.make_doc_header, "Generating documentation header."),
+ )
- import glob
+ path = env.Dir(".").abspath
- path = env.Dir('.').abspath
-
- # Translations
+ # Editor translations
tlist = glob.glob(path + "/translations/*.po")
- env.Depends('#editor/translations.gen.h', tlist)
- env.CommandNoCache('#editor/translations.gen.h', tlist, run_in_subprocess(editor_builders.make_translations_header))
+ env.Depends("#editor/editor_translations.gen.h", tlist)
+ env.CommandNoCache(
+ "#editor/editor_translations.gen.h",
+ tlist,
+ env.Run(editor_builders.make_editor_translations_header, "Generating editor translations header."),
+ )
+
+ # Documentation translations
+ tlist = glob.glob(env.Dir("#doc").abspath + "/translations/*.po")
+ env.Depends("#editor/doc_translations.gen.h", tlist)
+ env.CommandNoCache(
+ "#editor/doc_translations.gen.h",
+ tlist,
+ env.Run(editor_builders.make_doc_translations_header, "Generating translations header."),
+ )
# Fonts
flist = glob.glob(path + "/../thirdparty/fonts/*.ttf")
flist.extend(glob.glob(path + "/../thirdparty/fonts/*.otf"))
flist.sort()
- env.Depends('#editor/builtin_fonts.gen.h', flist)
- env.CommandNoCache('#editor/builtin_fonts.gen.h', flist, run_in_subprocess(editor_builders.make_fonts_header))
+ env.Depends("#editor/builtin_fonts.gen.h", flist)
+ env.CommandNoCache(
+ "#editor/builtin_fonts.gen.h",
+ flist,
+ env.Run(editor_builders.make_fonts_header, "Generating builtin fonts header."),
+ )
env.add_source_files(env.editor_sources, "*.cpp")
- SConscript('collada/SCsub')
- SConscript('doc/SCsub')
- SConscript('fileserver/SCsub')
- SConscript('icons/SCsub')
- SConscript('import/SCsub')
- SConscript('plugins/SCsub')
+ SConscript("debugger/SCsub")
+ SConscript("fileserver/SCsub")
+ SConscript("icons/SCsub")
+ SConscript("import/SCsub")
+ SConscript("plugins/SCsub")
lib = env.add_library("editor", env.editor_sources)
env.Prepend(LIBS=[lib])
diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp
index af2760e82b..17b03fd479 100644
--- a/editor/animation_bezier_editor.cpp
+++ b/editor/animation_bezier_editor.cpp
@@ -31,6 +31,7 @@
#include "animation_bezier_editor.h"
#include "editor/editor_node.h"
+#include "editor_scale.h"
float AnimationBezierTrackEdit::_bezier_h_to_pixel(float p_h) {
float h = p_h;
@@ -51,7 +52,6 @@ static _FORCE_INLINE_ Vector2 _bezier_interp(real_t t, const Vector2 &start, con
}
void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
-
float scale = timeline->get_zoom_scale();
int limit = timeline->get_name_limit();
int right_limit = get_size().width - timeline->get_buttons_width();
@@ -69,11 +69,11 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
}
for (Map<float, int>::Element *E = key_order.front(); E; E = E->next()) {
-
int i = E->get();
- if (!E->next())
+ if (!E->next()) {
break;
+ }
int i_n = E->next()->get();
@@ -113,11 +113,13 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
int to_x = (offset_n - timeline->get_value()) * scale + limit;
int point_end = to_x;
- if (from_x > right_limit) //not visible
+ if (from_x > right_limit) { //not visible
continue;
+ }
- if (to_x < limit) //not visible
+ if (to_x < limit) { //not visible
continue;
+ }
from_x = MAX(from_x, limit);
to_x = MIN(to_x, right_limit);
@@ -127,7 +129,6 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
Vector2 prev_pos;
for (int j = from_x; j <= to_x; j++) {
-
float t = (j - limit) / scale + timeline->get_value();
float h;
@@ -144,7 +145,6 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
//narrow high and low as much as possible
for (int k = 0; k < iterations; k++) {
-
middle = (low + high) / 2;
Vector2 interp = _bezier_interp(middle, start, out_handle, in_handle, end);
@@ -162,7 +162,7 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
float c = (t - low_pos.x) / (high_pos.x - low_pos.x);
- h = low_pos.linear_interpolate(high_pos, c).y;
+ h = low_pos.lerp(high_pos, c).y;
}
h = _bezier_h_to_pixel(h);
@@ -183,72 +183,73 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
}
void AnimationBezierTrackEdit::_draw_line_clipped(const Vector2 &p_from, const Vector2 &p_to, const Color &p_color, int p_clip_left, int p_clip_right) {
-
Vector2 from = p_from;
Vector2 to = p_to;
- if (from.x == to.x)
+ if (from.x == to.x) {
return;
+ }
if (to.x < from.x) {
SWAP(to, from);
}
- if (to.x < p_clip_left)
+ if (to.x < p_clip_left) {
return;
+ }
- if (from.x > p_clip_right)
+ if (from.x > p_clip_right) {
return;
+ }
if (to.x > p_clip_right) {
float c = (p_clip_right - from.x) / (to.x - from.x);
- to = from.linear_interpolate(to, c);
+ to = from.lerp(to, c);
}
if (from.x < p_clip_left) {
float c = (p_clip_left - from.x) / (to.x - from.x);
- from = from.linear_interpolate(to, c);
+ from = from.lerp(to, c);
}
draw_line(from, to, p_color);
}
void AnimationBezierTrackEdit::_notification(int p_what) {
-
if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) {
- bezier_icon = get_icon("KeyBezierPoint", "EditorIcons");
- bezier_handle_icon = get_icon("KeyBezierHandle", "EditorIcons");
- selected_icon = get_icon("KeyBezierSelected", "EditorIcons");
+ bezier_icon = get_theme_icon("KeyBezierPoint", "EditorIcons");
+ bezier_handle_icon = get_theme_icon("KeyBezierHandle", "EditorIcons");
+ selected_icon = get_theme_icon("KeyBezierSelected", "EditorIcons");
if (handle_mode_option->get_item_count() == 0) {
- handle_mode_option->add_icon_item(get_icon("BezierHandlesFree", "EditorIcons"), TTR("Free"), HANDLE_MODE_FREE);
- handle_mode_option->add_icon_item(get_icon("BezierHandlesBalanced", "EditorIcons"), TTR("Balanced"), HANDLE_MODE_BALANCED);
- handle_mode_option->add_icon_item(get_icon("BezierHandlesMirror", "EditorIcons"), TTR("Mirror"), HANDLE_MODE_MIRROR);
+ handle_mode_option->add_icon_item(get_theme_icon("BezierHandlesFree", "EditorIcons"), TTR("Free"), HANDLE_MODE_FREE);
+ handle_mode_option->add_icon_item(get_theme_icon("BezierHandlesBalanced", "EditorIcons"), TTR("Balanced"), HANDLE_MODE_BALANCED);
+ handle_mode_option->add_icon_item(get_theme_icon("BezierHandlesMirror", "EditorIcons"), TTR("Mirror"), HANDLE_MODE_MIRROR);
}
}
if (p_what == NOTIFICATION_RESIZED) {
-
int right_limit = get_size().width - timeline->get_buttons_width();
- int hsep = get_constant("hseparation", "ItemList");
- int vsep = get_constant("vseparation", "ItemList");
+ int hsep = get_theme_constant("hseparation", "ItemList");
+ int vsep = get_theme_constant("vseparation", "ItemList");
handle_mode_option->set_position(Vector2(right_limit + hsep, get_size().height - handle_mode_option->get_combined_minimum_size().height - vsep));
handle_mode_option->set_size(Vector2(timeline->get_buttons_width() - hsep * 2, handle_mode_option->get_combined_minimum_size().height));
}
if (p_what == NOTIFICATION_DRAW) {
- if (animation.is_null())
+ if (animation.is_null()) {
return;
+ }
int limit = timeline->get_name_limit();
if (has_focus()) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
accent.a *= 0.7;
draw_rect(Rect2(Point2(), get_size()), accent, false);
}
- Ref<Font> font = get_font("font", "Label");
- Color color = get_color("font_color", "Label");
- int hsep = get_constant("hseparation", "ItemList");
- int vsep = get_constant("vseparation", "ItemList");
+ Ref<Font> font = get_theme_font("font", "Label");
+ Color color = get_theme_color("font_color", "Label");
+ int hsep = get_theme_constant("hseparation", "ItemList");
+ int vsep = get_theme_constant("vseparation", "ItemList");
Color linecolor = color;
linecolor.a = 0.2;
@@ -258,7 +259,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
draw_line(Point2(right_limit, 0), Point2(right_limit, get_size().height), linecolor);
- Ref<Texture> close_icon = get_icon("Close", "EditorIcons");
+ Ref<Texture2D> close_icon = get_theme_icon("Close", "EditorIcons");
close_icon_rect.position = Vector2(get_size().width - close_icon->get_width() - hsep, hsep);
close_icon_rect.size = close_icon->get_size();
@@ -277,7 +278,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
{
NodePath path = animation->track_get_path(track);
- Node *node = NULL;
+ Node *node = nullptr;
if (root && root->has_node(path)) {
node = root->get_node(path);
@@ -290,7 +291,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
if (node) {
int ofs = 0;
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(node, "Node");
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(node, "Node");
h = MAX(h, icon->get_height());
@@ -316,11 +317,13 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
subtracks.clear();
for (int i = 0; i < animation->get_track_count(); i++) {
- if (animation->track_get_type(i) != Animation::TYPE_BEZIER)
+ if (animation->track_get_type(i) != Animation::TYPE_BEZIER) {
continue;
+ }
String path = animation->track_get_path(i);
- if (!path.begins_with(base_path))
+ if (!path.begins_with(base_path)) {
continue; //another node
+ }
path = path.replace_first(base_path, "");
Color cc = color;
@@ -340,7 +343,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
subtracks[i] = rect;
} else {
- Color ac = get_color("accent_color", "Editor");
+ Color ac = get_theme_color("accent_color", "Editor");
ac.a = 0.5;
draw_rect(rect, ac);
}
@@ -349,7 +352,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
vofs += font->get_height() + vsep;
}
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
{ //guides
float min_left_scale = font->get_height() + vsep;
@@ -365,16 +368,15 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
bool first = true;
int prev_iv = 0;
for (int i = font->get_height(); i < get_size().height; i++) {
-
float ofs = get_size().height / 2 - i;
ofs *= v_zoom;
ofs += v_scroll;
int iv = int(ofs / scale);
- if (ofs < 0)
+ if (ofs < 0) {
iv -= 1;
+ }
if (!first && iv != prev_iv) {
-
Color lc = linecolor;
lc.a *= 0.5;
draw_line(Point2(limit, i), Point2(right_limit, i), lc);
@@ -391,13 +393,11 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
{ //draw OTHER curves
float scale = timeline->get_zoom_scale();
- Ref<Texture> point = get_icon("KeyValue", "EditorIcons");
+ Ref<Texture2D> point = get_theme_icon("KeyValue", "EditorIcons");
for (Map<int, Color>::Element *E = subtrack_colors.front(); E; E = E->next()) {
-
_draw_track(E->key(), E->get());
for (int i = 0; i < animation->track_get_key_count(E->key()); i++) {
-
float offset = animation->track_get_key_time(E->key(), i);
float value = animation->bezier_track_get_key_value(E->key(), i);
@@ -410,18 +410,16 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
}
//draw edited curve
- const Color highlight = get_color("highlight_color", "Editor");
+ const Color highlight = get_theme_color("highlight_color", "Editor");
_draw_track(track, highlight);
}
//draw editor handles
{
-
float scale = timeline->get_zoom_scale();
edit_points.clear();
for (int i = 0; i < animation->track_get_key_count(track); i++) {
-
float offset = animation->track_get_key_time(track, i);
float value = animation->bezier_track_get_key_value(track, i);
@@ -499,20 +497,20 @@ Ref<Animation> AnimationBezierTrackEdit::get_animation() const {
}
void AnimationBezierTrackEdit::set_animation_and_track(const Ref<Animation> &p_animation, int p_track) {
-
animation = p_animation;
track = p_track;
- if (is_connected("select_key", editor, "_key_selected"))
- disconnect("select_key", editor, "_key_selected");
- if (is_connected("deselect_key", editor, "_key_deselected"))
- disconnect("deselect_key", editor, "_key_deselected");
- connect("select_key", editor, "_key_selected", varray(p_track), CONNECT_DEFERRED);
- connect("deselect_key", editor, "_key_deselected", varray(p_track), CONNECT_DEFERRED);
+ if (is_connected_compat("select_key", editor, "_key_selected")) {
+ disconnect_compat("select_key", editor, "_key_selected");
+ }
+ if (is_connected_compat("deselect_key", editor, "_key_deselected")) {
+ disconnect_compat("deselect_key", editor, "_key_deselected");
+ }
+ connect_compat("select_key", editor, "_key_selected", varray(p_track), CONNECT_DEFERRED);
+ connect_compat("deselect_key", editor, "_key_deselected", varray(p_track), CONNECT_DEFERRED);
update();
}
Size2 AnimationBezierTrackEdit::get_minimum_size() const {
-
return Vector2(1, 1);
}
@@ -522,17 +520,18 @@ void AnimationBezierTrackEdit::set_undo_redo(UndoRedo *p_undo_redo) {
void AnimationBezierTrackEdit::set_timeline(AnimationTimelineEdit *p_timeline) {
timeline = p_timeline;
- timeline->connect("zoom_changed", this, "_zoom_changed");
+ timeline->connect("zoom_changed", callable_mp(this, &AnimationBezierTrackEdit::_zoom_changed));
}
+
void AnimationBezierTrackEdit::set_editor(AnimationTrackEditor *p_editor) {
editor = p_editor;
- connect("clear_selection", editor, "_clear_selection", varray(false));
+ connect_compat("clear_selection", editor, "_clear_selection", varray(false));
}
void AnimationBezierTrackEdit::_play_position_draw() {
-
- if (!animation.is_valid() || play_position_pos < 0)
+ if (!animation.is_valid() || play_position_pos < 0) {
return;
+ }
float scale = timeline->get_zoom_scale();
int h = get_size().height;
@@ -540,13 +539,12 @@ void AnimationBezierTrackEdit::_play_position_draw() {
int px = (-timeline->get_value() + play_position_pos) * scale + timeline->get_name_limit();
if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) {
- Color color = get_color("accent_color", "Editor");
- play_position->draw_line(Point2(px, 0), Point2(px, h), color);
+ Color color = get_theme_color("accent_color", "Editor");
+ play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(2 * EDSCALE));
}
}
void AnimationBezierTrackEdit::set_play_position(float p_pos) {
-
play_position_pos = p_pos;
play_position->update();
}
@@ -558,12 +556,13 @@ void AnimationBezierTrackEdit::update_play_position() {
void AnimationBezierTrackEdit::set_root(Node *p_root) {
root = p_root;
}
+
void AnimationBezierTrackEdit::_zoom_changed() {
update();
+ play_position->update();
}
String AnimationBezierTrackEdit::get_tooltip(const Point2 &p_pos) const {
-
return Control::get_tooltip(p_pos);
}
@@ -574,17 +573,17 @@ void AnimationBezierTrackEdit::_clear_selection() {
}
void AnimationBezierTrackEdit::_clear_selection_for_anim(const Ref<Animation> &p_anim) {
-
- if (!(animation == p_anim))
+ if (!(animation == p_anim)) {
return;
+ }
//selection.clear();
_clear_selection();
}
void AnimationBezierTrackEdit::_select_at_anim(const Ref<Animation> &p_anim, int p_track, float p_pos) {
-
- if (!(animation == p_anim))
+ if (!(animation == p_anim)) {
return;
+ }
int idx = animation->track_find_key(p_track, p_pos, true);
ERR_FAIL_COND(idx < 0);
@@ -595,7 +594,6 @@ void AnimationBezierTrackEdit::_select_at_anim(const Ref<Animation> &p_anim, int
}
void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
-
if (p_event->is_pressed()) {
if (ED_GET_SHORTCUT("animation_editor/duplicate_selection")->is_shortcut(p_event)) {
duplicate_selection();
@@ -636,7 +634,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (mb.is_valid() && mb->get_button_index() == BUTTON_MIDDLE) {
-
if (mb->is_pressed()) {
int x = mb->get_position().x - timeline->get_name_limit();
panning_timeline_from = x / timeline->get_zoom_scale();
@@ -648,7 +645,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
-
menu_insert_key = mb->get_position();
if (menu_insert_key.x >= timeline->get_name_limit() && menu_insert_key.x <= get_size().width - timeline->get_buttons_width()) {
Vector2 popup_pos = get_global_transform().xform(mb->get_position());
@@ -657,9 +653,9 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
menu->add_icon_item(bezier_icon, TTR("Insert Key Here"), MENU_KEY_INSERT);
if (selection.size()) {
menu->add_separator();
- menu->add_icon_item(get_icon("Duplicate", "EditorIcons"), TTR("Duplicate Selected Key(s)"), MENU_KEY_DUPLICATE);
+ menu->add_icon_item(get_theme_icon("Duplicate", "EditorIcons"), TTR("Duplicate Selected Key(s)"), MENU_KEY_DUPLICATE);
menu->add_separator();
- menu->add_icon_item(get_icon("Remove", "EditorIcons"), TTR("Delete Selected Key(s)"), MENU_KEY_DELETE);
+ menu->add_icon_item(get_theme_icon("Remove", "EditorIcons"), TTR("Delete Selected Key(s)"), MENU_KEY_DELETE);
}
menu->set_as_minsize();
@@ -669,7 +665,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
if (close_icon_rect.has_point(mb->get_position())) {
emit_signal("close_request");
return;
@@ -683,7 +678,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
for (int i = 0; i < edit_points.size(); i++) {
-
//first check point
//command makes it ignore the main point, so control point editors can be force-edited
//path 2D editing in the 3D and 2D editors works the same way
@@ -706,7 +700,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
select_single_attempt = i;
update();
} else {
-
moving_selection_attempt = true;
moving_selection = true;
moving_selection_from_key = i;
@@ -741,7 +734,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
//insert new point
if (mb->get_command() && mb->get_position().x >= timeline->get_name_limit() && mb->get_position().x < get_size().width - timeline->get_buttons_width()) {
-
Array new_point;
new_point.resize(5);
@@ -790,7 +782,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
if (box_selecting) {
//do actual select
if (!box_selecting_add) {
@@ -808,7 +799,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
Rect2 selection_rect(bs_from, bs_to - bs_from);
for (int i = 0; i < edit_points.size(); i++) {
-
if (edit_points[i].point_rect.intersects(selection_rect)) {
selection.insert(i);
}
@@ -822,7 +812,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
undo_redo->create_action(TTR("Move Bezier Points"));
undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, moving_handle_left);
undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, moving_handle_right);
@@ -835,7 +824,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
if (moving_selection) {
//combit it
@@ -844,20 +832,20 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
List<AnimMoveRestore> to_restore;
// 1-remove the keys
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
undo_redo->add_do_method(animation.ptr(), "track_remove_key", track, E->get());
}
// 2- remove overlapped keys
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
float newtime = editor->snap_time(animation->track_get_key_time(track, E->get()) + moving_selection_offset.x);
int idx = animation->track_find_key(track, newtime, true);
- if (idx == -1)
+ if (idx == -1) {
continue;
+ }
- if (selection.has(idx))
+ if (selection.has(idx)) {
continue; //already in selection, don't save
+ }
undo_redo->add_do_method(animation.ptr(), "track_remove_key_at_position", track, newtime);
AnimMoveRestore amr;
@@ -871,7 +859,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
// 3-move the keys (re insert them)
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
float newpos = editor->snap_time(animation->track_get_key_time(track, E->get()) + moving_selection_offset.x);
/*
if (newpos<0)
@@ -886,7 +873,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
// 4-(undo) remove inserted keys
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
float newpos = editor->snap_time(animation->track_get_key_time(track, E->get()) + moving_selection_offset.x);
/*
if (newpos<0)
@@ -897,14 +883,12 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
// 5-(undo) reinsert keys
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
float oldpos = animation->track_get_key_time(track, E->get());
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, oldpos, animation->track_get_key_value(track, E->get()), 1);
}
// 6-(undo) reinsert overlapped keys
for (List<AnimMoveRestore>::Element *E = to_restore.front(); E; E = E->next()) {
-
AnimMoveRestore &amr = E->get();
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", amr.track, amr.time, amr.key, 1);
}
@@ -915,7 +899,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
// 7-reselect
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
float oldpos = animation->track_get_key_time(track, E->get());
float newpos = editor->snap_time(oldpos + moving_selection_offset.x);
@@ -938,10 +921,12 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) {
v_scroll += mm->get_relative().y * v_zoom;
- if (v_scroll > 100000)
+ if (v_scroll > 100000) {
v_scroll = 100000;
- if (v_scroll < -100000)
+ }
+ if (v_scroll < -100000) {
v_scroll = -100000;
+ }
int x = mm->get_position().x - timeline->get_name_limit();
float ofs = x / timeline->get_zoom_scale();
@@ -951,7 +936,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
update();
}
if (moving_selection_attempt && mm.is_valid()) {
-
if (!moving_selection) {
moving_selection = true;
select_single_attempt = -1;
@@ -965,7 +949,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (box_selecting_attempt && mm.is_valid()) {
-
if (!box_selecting) {
box_selecting = true;
box_selecting_add = mm->get_shift();
@@ -981,7 +964,6 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (moving_handle != 0 && mm.is_valid()) {
-
float y = (get_size().height / 2 - mm->get_position().y) * v_zoom + v_scroll;
float x = ((mm->get_position().x - timeline->get_name_limit()) / timeline->get_zoom_scale()) + timeline->get_value();
@@ -1026,10 +1008,8 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
void AnimationBezierTrackEdit::_menu_selected(int p_index) {
-
switch (p_index) {
case MENU_KEY_INSERT: {
-
Array new_point;
new_point.resize(5);
@@ -1062,24 +1042,23 @@ void AnimationBezierTrackEdit::_menu_selected(int p_index) {
}
void AnimationBezierTrackEdit::duplicate_selection() {
-
- if (selection.size() == 0)
+ if (selection.size() == 0) {
return;
+ }
float top_time = 1e10;
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
float t = animation->track_get_key_time(track, E->get());
- if (t < top_time)
+ if (t < top_time) {
top_time = t;
+ }
}
undo_redo->create_action(TTR("Anim Duplicate Keys"));
- List<Pair<int, float> > new_selection_values;
+ List<Pair<int, float>> new_selection_values;
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
float t = animation->track_get_key_time(track, E->get());
float dst_time = t + (timeline->get_play_position() - top_time);
int existing_idx = animation->track_find_key(track, dst_time, true);
@@ -1093,7 +1072,6 @@ void AnimationBezierTrackEdit::duplicate_selection() {
new_selection_values.push_back(p);
if (existing_idx != -1) {
-
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, dst_time, animation->track_get_key_value(track, existing_idx), animation->track_get_key_transition(track, existing_idx));
}
}
@@ -1103,15 +1081,15 @@ void AnimationBezierTrackEdit::duplicate_selection() {
//reselect duplicated
selection.clear();
- for (List<Pair<int, float> >::Element *E = new_selection_values.front(); E; E = E->next()) {
-
+ for (List<Pair<int, float>>::Element *E = new_selection_values.front(); E; E = E->next()) {
int track = E->get().first;
float time = E->get().second;
int existing_idx = animation->track_find_key(track, time, true);
- if (existing_idx == -1)
+ if (existing_idx == -1) {
continue;
+ }
selection.insert(existing_idx);
}
@@ -1124,7 +1102,6 @@ void AnimationBezierTrackEdit::delete_selection() {
undo_redo->create_action(TTR("Anim Delete Keys"));
for (Set<int>::Element *E = selection.back(); E; E = E->prev()) {
-
undo_redo->add_do_method(animation.ptr(), "track_remove_key", track, E->get());
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, animation->track_get_key_time(track, E->get()), animation->track_get_key_value(track, E->get()), 1);
}
@@ -1140,36 +1117,32 @@ void AnimationBezierTrackEdit::set_block_animation_update_ptr(bool *p_block_ptr)
}
void AnimationBezierTrackEdit::_bind_methods() {
-
- ClassDB::bind_method("_zoom_changed", &AnimationBezierTrackEdit::_zoom_changed);
- ClassDB::bind_method("_menu_selected", &AnimationBezierTrackEdit::_menu_selected);
ClassDB::bind_method("_gui_input", &AnimationBezierTrackEdit::_gui_input);
- ClassDB::bind_method("_play_position_draw", &AnimationBezierTrackEdit::_play_position_draw);
ClassDB::bind_method("_clear_selection", &AnimationBezierTrackEdit::_clear_selection);
ClassDB::bind_method("_clear_selection_for_anim", &AnimationBezierTrackEdit::_clear_selection_for_anim);
ClassDB::bind_method("_select_at_anim", &AnimationBezierTrackEdit::_select_at_anim);
- ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::REAL, "position"), PropertyInfo(Variant::BOOL, "drag")));
+ ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag")));
ADD_SIGNAL(MethodInfo("remove_request", PropertyInfo(Variant::INT, "track")));
- ADD_SIGNAL(MethodInfo("insert_key", PropertyInfo(Variant::REAL, "ofs")));
+ ADD_SIGNAL(MethodInfo("insert_key", PropertyInfo(Variant::FLOAT, "ofs")));
ADD_SIGNAL(MethodInfo("select_key", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::BOOL, "single")));
ADD_SIGNAL(MethodInfo("deselect_key", PropertyInfo(Variant::INT, "index")));
ADD_SIGNAL(MethodInfo("clear_selection"));
ADD_SIGNAL(MethodInfo("close_request"));
ADD_SIGNAL(MethodInfo("move_selection_begin"));
- ADD_SIGNAL(MethodInfo("move_selection", PropertyInfo(Variant::REAL, "ofs")));
+ ADD_SIGNAL(MethodInfo("move_selection", PropertyInfo(Variant::FLOAT, "ofs")));
ADD_SIGNAL(MethodInfo("move_selection_commit"));
ADD_SIGNAL(MethodInfo("move_selection_cancel"));
}
AnimationBezierTrackEdit::AnimationBezierTrackEdit() {
- undo_redo = NULL;
- timeline = NULL;
- root = NULL;
- menu = NULL;
- block_animation_update_ptr = NULL;
+ undo_redo = nullptr;
+ timeline = nullptr;
+ root = nullptr;
+ menu = nullptr;
+ block_animation_update_ptr = nullptr;
moving_selection_attempt = false;
moving_selection = false;
@@ -1184,7 +1157,7 @@ AnimationBezierTrackEdit::AnimationBezierTrackEdit() {
play_position->set_mouse_filter(MOUSE_FILTER_PASS);
add_child(play_position);
play_position->set_anchors_and_margins_preset(PRESET_WIDE);
- play_position->connect("draw", this, "_play_position_draw");
+ play_position->connect("draw", callable_mp(this, &AnimationBezierTrackEdit::_play_position_draw));
set_focus_mode(FOCUS_CLICK);
v_scroll = 0;
@@ -1198,7 +1171,7 @@ AnimationBezierTrackEdit::AnimationBezierTrackEdit() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_menu_selected");
+ menu->connect("id_pressed", callable_mp(this, &AnimationBezierTrackEdit::_menu_selected));
//set_mouse_filter(MOUSE_FILTER_PASS); //scroll has to work too for selection
}
diff --git a/editor/animation_bezier_editor.h b/editor/animation_bezier_editor.h
index ef4e62231f..217393a3b3 100644
--- a/editor/animation_bezier_editor.h
+++ b/editor/animation_bezier_editor.h
@@ -34,7 +34,6 @@
#include "animation_track_editor.h"
class AnimationBezierTrackEdit : public Control {
-
GDCLASS(AnimationBezierTrackEdit, Control);
enum HandleMode {
@@ -63,9 +62,9 @@ class AnimationBezierTrackEdit : public Control {
Vector<Rect2> view_rects;
- Ref<Texture> bezier_icon;
- Ref<Texture> bezier_handle_icon;
- Ref<Texture> selected_icon;
+ Ref<Texture2D> bezier_icon;
+ Ref<Texture2D> bezier_handle_icon;
+ Ref<Texture2D> selected_icon;
Rect2 close_icon_rect;
@@ -112,7 +111,6 @@ class AnimationBezierTrackEdit : public Control {
Vector2 menu_insert_key;
struct AnimMoveRestore {
-
int track;
float time;
Variant key;
@@ -145,12 +143,12 @@ protected:
void _notification(int p_what);
public:
- virtual String get_tooltip(const Point2 &p_pos) const;
+ virtual String get_tooltip(const Point2 &p_pos) const override;
Ref<Animation> get_animation() const;
void set_animation_and_track(const Ref<Animation> &p_animation, int p_track);
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void set_undo_redo(UndoRedo *p_undo_redo);
void set_timeline(AnimationTimelineEdit *p_timeline);
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index e9719f8618..d569a2ca0a 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -31,17 +31,16 @@
#include "animation_track_editor.h"
#include "animation_track_editor_plugins.h"
-#include "core/os/input.h"
+#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "editor/animation_bezier_editor.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor_node.h"
#include "editor_scale.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "servers/audio/audio_stream.h"
class AnimationTrackKeyEdit : public Object {
-
GDCLASS(AnimationTrackKeyEdit, Object);
public:
@@ -56,7 +55,6 @@ public:
}
static void _bind_methods() {
-
ClassDB::bind_method("_update_obj", &AnimationTrackKeyEdit::_update_obj);
ClassDB::bind_method("_key_ofs_changed", &AnimationTrackKeyEdit::_key_ofs_changed);
ClassDB::bind_method("_hide_script_from_inspector", &AnimationTrackKeyEdit::_hide_script_from_inspector);
@@ -65,11 +63,11 @@ public:
}
void _fix_node_path(Variant &value) {
-
NodePath np = value;
- if (np == NodePath())
+ if (np == NodePath()) {
return;
+ }
Node *root = EditorNode::get_singleton()->get_tree()->get_root();
@@ -83,34 +81,33 @@ public:
}
void _update_obj(const Ref<Animation> &p_anim) {
-
- if (setting || animation != p_anim)
+ if (setting || animation != p_anim) {
return;
+ }
notify_change();
}
void _key_ofs_changed(const Ref<Animation> &p_anim, float from, float to) {
-
- if (animation != p_anim || from != key_ofs)
+ if (animation != p_anim || from != key_ofs) {
return;
+ }
key_ofs = to;
- if (setting)
+ if (setting) {
return;
+ }
notify_change();
}
bool _set(const StringName &p_name, const Variant &p_value) {
-
int key = animation->track_find_key(track, key_ofs, true);
ERR_FAIL_COND_V(key == -1, false);
String name = p_name;
if (name == "time" || name == "frame") {
-
float new_time = p_value;
if (name == "frame") {
@@ -121,8 +118,9 @@ public:
new_time /= fps;
}
- if (new_time == key_ofs)
+ if (new_time == key_ofs) {
return true;
+ }
int existing = animation->track_find_key(track, new_time, true);
@@ -151,7 +149,6 @@ public:
}
if (name == "easing") {
-
float val = p_value;
float prev_val = animation->track_get_key_transition(track, key);
setting = true;
@@ -167,9 +164,7 @@ public:
}
switch (animation->track_get_type(track)) {
-
case Animation::TYPE_TRANSFORM: {
-
Dictionary d_old = animation->track_get_key_value(track, key);
Dictionary d_new = d_old.duplicate();
d_new[p_name] = p_value;
@@ -185,9 +180,7 @@ public:
return true;
} break;
case Animation::TYPE_VALUE: {
-
if (name == "value") {
-
Variant value = p_value;
if (value.get_type() == Variant::NODE_PATH) {
@@ -208,7 +201,6 @@ public:
}
} break;
case Animation::TYPE_METHOD: {
-
Dictionary d_old = animation->track_get_key_value(track, key);
Dictionary d_new = d_old.duplicate();
@@ -216,16 +208,13 @@ public:
bool mergeable = false;
if (name == "name") {
-
d_new["method"] = p_value;
} else if (name == "arg_count") {
-
Vector<Variant> args = d_old["args"];
args.resize(p_value);
d_new["args"] = args;
change_notify_deserved = true;
} else if (name.begins_with("args/")) {
-
Vector<Variant> args = d_old["args"];
int idx = name.get_slice("/", 1).to_int();
ERR_FAIL_INDEX_V(idx, args.size(), false);
@@ -235,23 +224,20 @@ public:
Variant::Type t = Variant::Type(int(p_value));
if (t != args[idx].get_type()) {
- Variant::CallError err;
+ Callable::CallError err;
if (Variant::can_convert(args[idx].get_type(), t)) {
Variant old = args[idx];
Variant *ptrs[1] = { &old };
args.write[idx] = Variant::construct(t, (const Variant **)ptrs, 1, err);
} else {
-
- args.write[idx] = Variant::construct(t, NULL, 0, err);
+ args.write[idx] = Variant::construct(t, nullptr, 0, err);
}
change_notify_deserved = true;
d_new["args"] = args;
}
} else if (what == "value") {
-
Variant value = p_value;
if (value.get_type() == Variant::NODE_PATH) {
-
_fix_node_path(value);
}
@@ -261,10 +247,11 @@ public:
}
}
- if (mergeable)
+ if (mergeable) {
undo_redo->create_action(TTR("Anim Change Call"), UndoRedo::MERGE_ENDS);
- else
+ } else {
undo_redo->create_action(TTR("Anim Change Call"));
+ }
setting = true;
undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, d_new);
@@ -274,14 +261,13 @@ public:
undo_redo->commit_action();
setting = false;
- if (change_notify_deserved)
+ if (change_notify_deserved) {
notify_change();
+ }
return true;
} break;
case Animation::TYPE_BEZIER: {
-
if (name == "value") {
-
const Variant &value = p_value;
setting = true;
@@ -298,7 +284,6 @@ public:
}
if (name == "in_handle") {
-
const Variant &value = p_value;
setting = true;
@@ -315,7 +300,6 @@ public:
}
if (name == "out_handle") {
-
const Variant &value = p_value;
setting = true;
@@ -332,9 +316,7 @@ public:
}
} break;
case Animation::TYPE_AUDIO: {
-
if (name == "stream") {
-
Ref<AudioStream> stream = p_value;
setting = true;
@@ -351,7 +333,6 @@ public:
}
if (name == "start_offset") {
-
float value = p_value;
setting = true;
@@ -368,7 +349,6 @@ public:
}
if (name == "end_offset") {
-
float value = p_value;
setting = true;
@@ -385,9 +365,7 @@ public:
}
} break;
case Animation::TYPE_ANIMATION: {
-
if (name == "animation") {
-
StringName anim_name = p_value;
setting = true;
@@ -409,7 +387,6 @@ public:
}
bool _get(const StringName &p_name, Variant &r_ret) const {
-
int key = animation->track_find_key(track, key_ofs, true);
ERR_FAIL_COND_V(key == -1, false);
@@ -420,7 +397,6 @@ public:
}
if (name == "frame") {
-
float fps = animation->get_step();
if (fps > 0) {
fps = 1.0 / fps;
@@ -436,7 +412,6 @@ public:
switch (animation->track_get_type(track)) {
case Animation::TYPE_TRANSFORM: {
-
Dictionary d = animation->track_get_key_value(track, key);
ERR_FAIL_COND_V(!d.has(name), false);
r_ret = d[p_name];
@@ -444,7 +419,6 @@ public:
} break;
case Animation::TYPE_VALUE: {
-
if (name == "value") {
r_ret = animation->track_get_key_value(track, key);
return true;
@@ -452,11 +426,9 @@ public:
} break;
case Animation::TYPE_METHOD: {
-
Dictionary d = animation->track_get_key_value(track, key);
if (name == "name") {
-
ERR_FAIL_COND_V(!d.has("method"), false);
r_ret = d["method"];
return true;
@@ -472,7 +444,6 @@ public:
}
if (name.begins_with("args/")) {
-
int idx = name.get_slice("/", 1).to_int();
ERR_FAIL_INDEX_V(idx, args.size(), false);
@@ -490,7 +461,6 @@ public:
} break;
case Animation::TYPE_BEZIER: {
-
if (name == "value") {
r_ret = animation->bezier_track_get_key_value(track, key);
return true;
@@ -508,7 +478,6 @@ public:
} break;
case Animation::TYPE_AUDIO: {
-
if (name == "stream") {
r_ret = animation->audio_track_get_key_stream(track, key);
return true;
@@ -526,7 +495,6 @@ public:
} break;
case Animation::TYPE_ANIMATION: {
-
if (name == "animation") {
r_ret = animation->animation_track_get_key_animation(track, key);
return true;
@@ -538,9 +506,9 @@ public:
return false;
}
void _get_property_list(List<PropertyInfo> *p_list) const {
-
- if (animation.is_null())
+ if (animation.is_null()) {
return;
+ }
ERR_FAIL_INDEX(track, animation->get_track_count());
int key = animation->track_find_key(track, key_ofs, true);
@@ -548,31 +516,26 @@ public:
if (use_fps && animation->get_step() > 0) {
float max_frame = animation->get_length() / animation->get_step();
- p_list->push_back(PropertyInfo(Variant::REAL, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",1"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",1"));
} else {
- p_list->push_back(PropertyInfo(Variant::REAL, "time", PROPERTY_HINT_RANGE, "0," + rtos(animation->get_length()) + ",0.01"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "time", PROPERTY_HINT_RANGE, "0," + rtos(animation->get_length()) + ",0.01"));
}
switch (animation->track_get_type(track)) {
-
case Animation::TYPE_TRANSFORM: {
-
p_list->push_back(PropertyInfo(Variant::VECTOR3, "location"));
p_list->push_back(PropertyInfo(Variant::QUAT, "rotation"));
p_list->push_back(PropertyInfo(Variant::VECTOR3, "scale"));
} break;
case Animation::TYPE_VALUE: {
-
Variant v = animation->track_get_key_value(track, key);
if (hint.type != Variant::NIL) {
-
PropertyInfo pi = hint;
pi.name = "value";
p_list->push_back(pi);
} else {
-
PropertyHint hint = PROPERTY_HINT_NONE;
String hint_string;
@@ -580,20 +543,19 @@ public:
//could actually check the object property if exists..? yes i will!
Ref<Resource> res = v;
if (res.is_valid()) {
-
hint = PROPERTY_HINT_RESOURCE_TYPE;
hint_string = res->get_class();
}
}
- if (v.get_type() != Variant::NIL)
+ if (v.get_type() != Variant::NIL) {
p_list->push_back(PropertyInfo(v.get_type(), "value", hint, hint_string));
+ }
}
} break;
case Animation::TYPE_METHOD: {
-
- p_list->push_back(PropertyInfo(Variant::STRING, "name"));
+ p_list->push_back(PropertyInfo(Variant::STRING_NAME, "name"));
p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,5,1"));
Dictionary d = animation->track_get_key_value(track, key);
@@ -601,40 +563,36 @@ public:
Vector<Variant> args = d["args"];
String vtypes;
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
-
- if (i > 0)
+ if (i > 0) {
vtypes += ",";
+ }
vtypes += Variant::get_type_name(Variant::Type(i));
}
for (int i = 0; i < args.size(); i++) {
-
p_list->push_back(PropertyInfo(Variant::INT, "args/" + itos(i) + "/type", PROPERTY_HINT_ENUM, vtypes));
- if (args[i].get_type() != Variant::NIL)
+ if (args[i].get_type() != Variant::NIL) {
p_list->push_back(PropertyInfo(args[i].get_type(), "args/" + itos(i) + "/value"));
+ }
}
} break;
case Animation::TYPE_BEZIER: {
-
- p_list->push_back(PropertyInfo(Variant::REAL, "value"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "value"));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "in_handle"));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "out_handle"));
} break;
case Animation::TYPE_AUDIO: {
-
p_list->push_back(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"));
- p_list->push_back(PropertyInfo(Variant::REAL, "start_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
- p_list->push_back(PropertyInfo(Variant::REAL, "end_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "start_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "end_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
} break;
case Animation::TYPE_ANIMATION: {
-
String animations;
if (root_path && root_path->has_node(animation->track_get_path(track))) {
-
AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(root_path->get_node(animation->track_get_path(track)));
if (ap) {
List<StringName> anims;
@@ -654,13 +612,13 @@ public:
}
animations += "[stop]";
- p_list->push_back(PropertyInfo(Variant::STRING, "animation", PROPERTY_HINT_ENUM, animations));
+ p_list->push_back(PropertyInfo(Variant::STRING_NAME, "animation", PROPERTY_HINT_ENUM, animations));
} break;
}
if (animation->track_get_type(track) == Animation::TYPE_VALUE) {
- p_list->push_back(PropertyInfo(Variant::REAL, "easing", PROPERTY_HINT_EXP_EASING));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "easing", PROPERTY_HINT_EXP_EASING));
}
}
@@ -675,7 +633,6 @@ public:
bool use_fps;
void notify_change() {
-
_change_notify();
}
@@ -693,12 +650,11 @@ public:
key_ofs = 0;
track = -1;
setting = false;
- root_path = NULL;
+ root_path = nullptr;
}
};
class AnimationMultiTrackKeyEdit : public Object {
-
GDCLASS(AnimationMultiTrackKeyEdit, Object);
public:
@@ -713,7 +669,6 @@ public:
}
static void _bind_methods() {
-
ClassDB::bind_method("_update_obj", &AnimationMultiTrackKeyEdit::_update_obj);
ClassDB::bind_method("_key_ofs_changed", &AnimationMultiTrackKeyEdit::_key_ofs_changed);
ClassDB::bind_method("_hide_script_from_inspector", &AnimationMultiTrackKeyEdit::_hide_script_from_inspector);
@@ -722,11 +677,11 @@ public:
}
void _fix_node_path(Variant &value, NodePath &base) {
-
NodePath np = value;
- if (np == NodePath())
+ if (np == NodePath()) {
return;
+ }
Node *root = EditorNode::get_singleton()->get_tree()->get_root();
@@ -740,31 +695,33 @@ public:
}
void _update_obj(const Ref<Animation> &p_anim) {
-
- if (setting || animation != p_anim)
+ if (setting || animation != p_anim) {
return;
+ }
notify_change();
}
void _key_ofs_changed(const Ref<Animation> &p_anim, float from, float to) {
-
- if (animation != p_anim)
+ if (animation != p_anim) {
return;
+ }
- for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) {
-
+ for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
+ int key = 0;
for (List<float>::Element *F = E->value().front(); F; F = F->next()) {
-
float key_ofs = F->get();
- if (from != key_ofs)
+ if (from != key_ofs) {
+ key++;
continue;
+ }
int track = E->key();
- key_ofs_map[track][key_ofs] = to;
+ key_ofs_map[track][key] = to;
- if (setting)
+ if (setting) {
return;
+ }
notify_change();
@@ -774,21 +731,17 @@ public:
}
bool _set(const StringName &p_name, const Variant &p_value) {
-
bool update_obj = false;
bool change_notify_deserved = false;
- for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) {
-
+ for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
int track = E->key();
for (List<float>::Element *F = E->value().front(); F; F = F->next()) {
-
float key_ofs = F->get();
int key = animation->track_find_key(track, key_ofs, true);
ERR_FAIL_COND_V(key == -1, false);
String name = p_name;
if (name == "time" || name == "frame") {
-
float new_time = p_value;
if (name == "frame") {
@@ -822,7 +775,6 @@ public:
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, new_time, v, trans);
}
} else if (name == "easing") {
-
float val = p_value;
float prev_val = animation->track_get_key_transition(track, key);
@@ -836,9 +788,7 @@ public:
}
switch (animation->track_get_type(track)) {
-
case Animation::TYPE_TRANSFORM: {
-
Dictionary d_old = animation->track_get_key_value(track, key);
Dictionary d_new = d_old.duplicate();
d_new[p_name] = p_value;
@@ -852,9 +802,7 @@ public:
update_obj = true;
} break;
case Animation::TYPE_VALUE: {
-
if (name == "value") {
-
Variant value = p_value;
if (value.get_type() == Variant::NODE_PATH) {
@@ -872,23 +820,19 @@ public:
}
} break;
case Animation::TYPE_METHOD: {
-
Dictionary d_old = animation->track_get_key_value(track, key);
Dictionary d_new = d_old.duplicate();
bool mergeable = false;
if (name == "name") {
-
d_new["method"] = p_value;
} else if (name == "arg_count") {
-
Vector<Variant> args = d_old["args"];
args.resize(p_value);
d_new["args"] = args;
change_notify_deserved = true;
} else if (name.begins_with("args/")) {
-
Vector<Variant> args = d_old["args"];
int idx = name.get_slice("/", 1).to_int();
ERR_FAIL_INDEX_V(idx, args.size(), false);
@@ -898,23 +842,20 @@ public:
Variant::Type t = Variant::Type(int(p_value));
if (t != args[idx].get_type()) {
- Variant::CallError err;
+ Callable::CallError err;
if (Variant::can_convert(args[idx].get_type(), t)) {
Variant old = args[idx];
Variant *ptrs[1] = { &old };
args.write[idx] = Variant::construct(t, (const Variant **)ptrs, 1, err);
} else {
-
- args.write[idx] = Variant::construct(t, NULL, 0, err);
+ args.write[idx] = Variant::construct(t, nullptr, 0, err);
}
change_notify_deserved = true;
d_new["args"] = args;
}
} else if (what == "value") {
-
Variant value = p_value;
if (value.get_type() == Variant::NODE_PATH) {
-
_fix_node_path(value, base_map[track]);
}
@@ -927,10 +868,11 @@ public:
Variant prev = animation->track_get_key_value(track, key);
if (!setting) {
- if (mergeable)
+ if (mergeable) {
undo_redo->create_action(TTR("Anim Multi Change Call"), UndoRedo::MERGE_ENDS);
- else
+ } else {
undo_redo->create_action(TTR("Anim Multi Change Call"));
+ }
setting = true;
}
@@ -940,9 +882,7 @@ public:
update_obj = true;
} break;
case Animation::TYPE_BEZIER: {
-
if (name == "value") {
-
const Variant &value = p_value;
if (!setting) {
@@ -954,7 +894,6 @@ public:
undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_value", track, key, prev);
update_obj = true;
} else if (name == "in_handle") {
-
const Variant &value = p_value;
if (!setting) {
@@ -966,7 +905,6 @@ public:
undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", track, key, prev);
update_obj = true;
} else if (name == "out_handle") {
-
const Variant &value = p_value;
if (!setting) {
@@ -980,9 +918,7 @@ public:
}
} break;
case Animation::TYPE_AUDIO: {
-
if (name == "stream") {
-
Ref<AudioStream> stream = p_value;
if (!setting) {
@@ -994,7 +930,6 @@ public:
undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_stream", track, key, prev);
update_obj = true;
} else if (name == "start_offset") {
-
float value = p_value;
if (!setting) {
@@ -1006,7 +941,6 @@ public:
undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, prev);
update_obj = true;
} else if (name == "end_offset") {
-
float value = p_value;
if (!setting) {
@@ -1020,9 +954,7 @@ public:
}
} break;
case Animation::TYPE_ANIMATION: {
-
if (name == "animation") {
-
StringName anim_name = p_value;
if (!setting) {
@@ -1040,7 +972,6 @@ public:
}
if (setting) {
-
if (update_obj) {
undo_redo->add_do_method(this, "_update_obj", animation);
undo_redo->add_undo_method(this, "_update_obj", animation);
@@ -1049,8 +980,9 @@ public:
undo_redo->commit_action();
setting = false;
- if (change_notify_deserved)
+ if (change_notify_deserved) {
notify_change();
+ }
return true;
}
@@ -1059,12 +991,9 @@ public:
}
bool _get(const StringName &p_name, Variant &r_ret) const {
-
- for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) {
-
+ for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
int track = E->key();
for (List<float>::Element *F = E->value().front(); F; F = F->next()) {
-
float key_ofs = F->get();
int key = animation->track_find_key(track, key_ofs, true);
ERR_CONTINUE(key == -1);
@@ -1076,7 +1005,6 @@ public:
}
if (name == "frame") {
-
float fps = animation->get_step();
if (fps > 0) {
fps = 1.0 / fps;
@@ -1091,9 +1019,7 @@ public:
}
switch (animation->track_get_type(track)) {
-
case Animation::TYPE_TRANSFORM: {
-
Dictionary d = animation->track_get_key_value(track, key);
ERR_FAIL_COND_V(!d.has(name), false);
r_ret = d[p_name];
@@ -1101,7 +1027,6 @@ public:
} break;
case Animation::TYPE_VALUE: {
-
if (name == "value") {
r_ret = animation->track_get_key_value(track, key);
return true;
@@ -1109,11 +1034,9 @@ public:
} break;
case Animation::TYPE_METHOD: {
-
Dictionary d = animation->track_get_key_value(track, key);
if (name == "name") {
-
ERR_FAIL_COND_V(!d.has("method"), false);
r_ret = d["method"];
return true;
@@ -1124,13 +1047,11 @@ public:
Vector<Variant> args = d["args"];
if (name == "arg_count") {
-
r_ret = args.size();
return true;
}
if (name.begins_with("args/")) {
-
int idx = name.get_slice("/", 1).to_int();
ERR_FAIL_INDEX_V(idx, args.size(), false);
@@ -1148,7 +1069,6 @@ public:
} break;
case Animation::TYPE_BEZIER: {
-
if (name == "value") {
r_ret = animation->bezier_track_get_key_value(track, key);
return true;
@@ -1166,7 +1086,6 @@ public:
} break;
case Animation::TYPE_AUDIO: {
-
if (name == "stream") {
r_ret = animation->audio_track_get_key_stream(track, key);
return true;
@@ -1184,7 +1103,6 @@ public:
} break;
case Animation::TYPE_ANIMATION: {
-
if (name == "animation") {
r_ret = animation->animation_track_get_key_animation(track, key);
return true;
@@ -1198,9 +1116,9 @@ public:
return false;
}
void _get_property_list(List<PropertyInfo> *p_list) const {
-
- if (animation.is_null())
+ if (animation.is_null()) {
return;
+ }
int first_track = -1;
float first_key = -1.0;
@@ -1208,70 +1126,66 @@ public:
bool show_time = true;
bool same_track_type = true;
bool same_key_type = true;
- for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) {
-
+ for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) {
int track = E->key();
ERR_FAIL_INDEX(track, animation->get_track_count());
- if (first_track < 0)
+ if (first_track < 0) {
first_track = track;
+ }
- if (show_time && E->value().size() > 1)
+ if (show_time && E->value().size() > 1) {
show_time = false;
+ }
if (same_track_type) {
-
if (animation->track_get_type(first_track) != animation->track_get_type(track)) {
same_track_type = false;
same_key_type = false;
}
for (List<float>::Element *F = E->value().front(); F; F = F->next()) {
-
int key = animation->track_find_key(track, F->get(), true);
ERR_FAIL_COND(key == -1);
- if (first_key < 0)
+ if (first_key < 0) {
first_key = key;
+ }
- if (animation->track_get_key_value(first_track, first_key).get_type() != animation->track_get_key_value(track, key).get_type())
+ if (animation->track_get_key_value(first_track, first_key).get_type() != animation->track_get_key_value(track, key).get_type()) {
same_key_type = false;
+ }
}
}
}
if (show_time) {
-
if (use_fps && animation->get_step() > 0) {
float max_frame = animation->get_length() / animation->get_step();
- p_list->push_back(PropertyInfo(Variant::REAL, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",1"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",1"));
} else {
- p_list->push_back(PropertyInfo(Variant::REAL, "time", PROPERTY_HINT_RANGE, "0," + rtos(animation->get_length()) + ",0.01"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "time", PROPERTY_HINT_RANGE, "0," + rtos(animation->get_length()) + ",0.01"));
}
}
if (same_track_type) {
switch (animation->track_get_type(first_track)) {
-
case Animation::TYPE_TRANSFORM: {
-
p_list->push_back(PropertyInfo(Variant::VECTOR3, "location"));
p_list->push_back(PropertyInfo(Variant::QUAT, "rotation"));
p_list->push_back(PropertyInfo(Variant::VECTOR3, "scale"));
} break;
case Animation::TYPE_VALUE: {
-
- if (!same_key_type)
+ if (!same_key_type) {
break;
+ }
Variant v = animation->track_get_key_value(first_track, first_key);
if (hint.type != Variant::NIL) {
-
PropertyInfo pi = hint;
pi.name = "value";
p_list->push_back(pi);
} else {
-
PropertyHint hint = PROPERTY_HINT_NONE;
String hint_string;
@@ -1279,21 +1193,20 @@ public:
//could actually check the object property if exists..? yes i will!
Ref<Resource> res = v;
if (res.is_valid()) {
-
hint = PROPERTY_HINT_RESOURCE_TYPE;
hint_string = res->get_class();
}
}
- if (v.get_type() != Variant::NIL)
+ if (v.get_type() != Variant::NIL) {
p_list->push_back(PropertyInfo(v.get_type(), "value", hint, hint_string));
+ }
}
- p_list->push_back(PropertyInfo(Variant::REAL, "easing", PROPERTY_HINT_EXP_EASING));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "easing", PROPERTY_HINT_EXP_EASING));
} break;
case Animation::TYPE_METHOD: {
-
- p_list->push_back(PropertyInfo(Variant::STRING, "name"));
+ p_list->push_back(PropertyInfo(Variant::STRING_NAME, "name"));
p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,5,1"));
Dictionary d = animation->track_get_key_value(first_track, first_key);
@@ -1301,40 +1214,37 @@ public:
Vector<Variant> args = d["args"];
String vtypes;
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
-
- if (i > 0)
+ if (i > 0) {
vtypes += ",";
+ }
vtypes += Variant::get_type_name(Variant::Type(i));
}
for (int i = 0; i < args.size(); i++) {
-
p_list->push_back(PropertyInfo(Variant::INT, "args/" + itos(i) + "/type", PROPERTY_HINT_ENUM, vtypes));
- if (args[i].get_type() != Variant::NIL)
+ if (args[i].get_type() != Variant::NIL) {
p_list->push_back(PropertyInfo(args[i].get_type(), "args/" + itos(i) + "/value"));
+ }
}
} break;
case Animation::TYPE_BEZIER: {
-
- p_list->push_back(PropertyInfo(Variant::REAL, "value"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "value"));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "in_handle"));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "out_handle"));
} break;
case Animation::TYPE_AUDIO: {
-
p_list->push_back(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"));
- p_list->push_back(PropertyInfo(Variant::REAL, "start_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
- p_list->push_back(PropertyInfo(Variant::REAL, "end_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "start_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "end_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater"));
} break;
case Animation::TYPE_ANIMATION: {
-
- if (key_ofs_map.size() > 1)
+ if (key_ofs_map.size() > 1) {
break;
+ }
String animations;
if (root_path && root_path->has_node(animation->track_get_path(first_track))) {
-
AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(root_path->get_node(animation->track_get_path(first_track)));
if (ap) {
List<StringName> anims;
@@ -1354,7 +1264,7 @@ public:
}
animations += "[stop]";
- p_list->push_back(PropertyInfo(Variant::STRING, "animation", PROPERTY_HINT_ENUM, animations));
+ p_list->push_back(PropertyInfo(Variant::STRING_NAME, "animation", PROPERTY_HINT_ENUM, animations));
} break;
}
}
@@ -1362,7 +1272,7 @@ public:
Ref<Animation> animation;
- Map<int, List<float> > key_ofs_map;
+ Map<int, List<float>> key_ofs_map;
Map<int, NodePath> base_map;
PropertyInfo hint;
@@ -1373,7 +1283,6 @@ public:
UndoRedo *undo_redo;
void notify_change() {
-
_change_notify();
}
@@ -1389,20 +1298,18 @@ public:
AnimationMultiTrackKeyEdit() {
use_fps = false;
setting = false;
- root_path = NULL;
+ root_path = nullptr;
}
};
void AnimationTimelineEdit::_zoom_changed(double) {
-
update();
play_position->update();
emit_signal("zoom_changed");
}
float AnimationTimelineEdit::get_zoom_scale() const {
-
- float zv = zoom->get_value();
+ float zv = zoom->get_max() - zoom->get_value();
if (zv < 1) {
zv = 1.0 - zv;
return Math::pow(1.0f + zv, 8.0f) * 100;
@@ -1412,9 +1319,9 @@ float AnimationTimelineEdit::get_zoom_scale() const {
}
void AnimationTimelineEdit::_anim_length_changed(double p_new_len) {
-
- if (editing)
+ if (editing) {
return;
+ }
p_new_len = MAX(0.001, p_new_len);
if (use_fps && animation->get_step() > 0) {
@@ -1433,7 +1340,6 @@ void AnimationTimelineEdit::_anim_length_changed(double p_new_len) {
}
void AnimationTimelineEdit::_anim_loop_pressed() {
-
undo_redo->create_action(TTR("Change Animation Loop"));
undo_redo->add_do_method(animation.ptr(), "set_loop", loop->is_pressed());
undo_redo->add_undo_method(animation.ptr(), "set_loop", animation->has_loop());
@@ -1441,12 +1347,11 @@ void AnimationTimelineEdit::_anim_loop_pressed() {
}
int AnimationTimelineEdit::get_buttons_width() const {
-
- Ref<Texture> interp_mode = get_icon("TrackContinuous", "EditorIcons");
- Ref<Texture> interp_type = get_icon("InterpRaw", "EditorIcons");
- Ref<Texture> loop_type = get_icon("InterpWrapClamp", "EditorIcons");
- Ref<Texture> remove_icon = get_icon("Remove", "EditorIcons");
- Ref<Texture> down_icon = get_icon("select_arrow", "Tree");
+ Ref<Texture2D> interp_mode = get_theme_icon("TrackContinuous", "EditorIcons");
+ Ref<Texture2D> interp_type = get_theme_icon("InterpRaw", "EditorIcons");
+ Ref<Texture2D> loop_type = get_theme_icon("InterpWrapClamp", "EditorIcons");
+ Ref<Texture2D> remove_icon = get_theme_icon("Remove", "EditorIcons");
+ Ref<Texture2D> down_icon = get_theme_icon("select_arrow", "Tree");
int total_w = interp_mode->get_width() + interp_type->get_width() + loop_type->get_width() + remove_icon->get_width();
total_w += (down_icon->get_width() + 4 * EDSCALE) * 4;
@@ -1455,8 +1360,7 @@ int AnimationTimelineEdit::get_buttons_width() const {
}
int AnimationTimelineEdit::get_name_limit() const {
-
- Ref<Texture> hsize_icon = get_icon("Hsize", "EditorIcons");
+ Ref<Texture2D> hsize_icon = get_theme_icon("Hsize", "EditorIcons");
int limit = MAX(name_limit, add_track->get_minimum_size().width + hsize_icon->get_width());
@@ -1466,19 +1370,18 @@ int AnimationTimelineEdit::get_name_limit() const {
}
void AnimationTimelineEdit::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
- add_track->set_icon(get_icon("Add", "EditorIcons"));
- loop->set_icon(get_icon("Loop", "EditorIcons"));
- time_icon->set_texture(get_icon("Time", "EditorIcons"));
+ add_track->set_icon(get_theme_icon("Add", "EditorIcons"));
+ loop->set_icon(get_theme_icon("Loop", "EditorIcons"));
+ time_icon->set_texture(get_theme_icon("Time", "EditorIcons"));
add_track->get_popup()->clear();
- add_track->get_popup()->add_icon_item(get_icon("KeyValue", "EditorIcons"), TTR("Property Track"));
- add_track->get_popup()->add_icon_item(get_icon("KeyXform", "EditorIcons"), TTR("3D Transform Track"));
- add_track->get_popup()->add_icon_item(get_icon("KeyCall", "EditorIcons"), TTR("Call Method Track"));
- add_track->get_popup()->add_icon_item(get_icon("KeyBezier", "EditorIcons"), TTR("Bezier Curve Track"));
- add_track->get_popup()->add_icon_item(get_icon("KeyAudio", "EditorIcons"), TTR("Audio Playback Track"));
- add_track->get_popup()->add_icon_item(get_icon("KeyAnimation", "EditorIcons"), TTR("Animation Playback Track"));
+ add_track->get_popup()->add_icon_item(get_theme_icon("KeyValue", "EditorIcons"), TTR("Property Track"));
+ add_track->get_popup()->add_icon_item(get_theme_icon("KeyXform", "EditorIcons"), TTR("3D Transform Track"));
+ add_track->get_popup()->add_icon_item(get_theme_icon("KeyCall", "EditorIcons"), TTR("Call Method Track"));
+ add_track->get_popup()->add_icon_item(get_theme_icon("KeyBezier", "EditorIcons"), TTR("Bezier Curve Track"));
+ add_track->get_popup()->add_icon_item(get_theme_icon("KeyAudio", "EditorIcons"), TTR("Audio Playback Track"));
+ add_track->get_popup()->add_icon_item(get_theme_icon("KeyAnimation", "EditorIcons"), TTR("Animation Playback Track"));
}
if (p_what == NOTIFICATION_RESIZED) {
@@ -1487,24 +1390,25 @@ void AnimationTimelineEdit::_notification(int p_what) {
}
if (p_what == NOTIFICATION_DRAW) {
-
int key_range = get_size().width - get_buttons_width() - get_name_limit();
- if (!animation.is_valid())
+ if (!animation.is_valid()) {
return;
+ }
- Ref<Font> font = get_font("font", "Label");
- Color color = get_color("font_color", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
+ Color color = get_theme_color("font_color", "Label");
int zoomw = key_range;
float scale = get_zoom_scale();
int h = get_size().height;
float l = animation->get_length();
- if (l <= 0)
+ if (l <= 0) {
l = 0.001; //avoid crashor
+ }
- Ref<Texture> hsize_icon = get_icon("Hsize", "EditorIcons");
+ Ref<Texture2D> hsize_icon = get_theme_icon("Hsize", "EditorIcons");
hsize_rect = Rect2(get_name_limit() - hsize_icon->get_width() - 2 * EDSCALE, (get_size().height - hsize_icon->get_height()) / 2, hsize_icon->get_width(), hsize_icon->get_height());
draw_texture(hsize_icon, hsize_rect.position);
@@ -1512,24 +1416,24 @@ void AnimationTimelineEdit::_notification(int p_what) {
float time_min = 0;
float time_max = animation->get_length();
for (int i = 0; i < animation->get_track_count(); i++) {
-
if (animation->track_get_key_count(i) > 0) {
-
float beg = animation->track_get_key_time(i, 0);
/*if (animation->track_get_type(i) == Animation::TYPE_BEZIER) {
beg += animation->bezier_track_get_key_in_handle(i, 0).x;
}* not worth it since they have no use */
- if (beg < time_min)
+ if (beg < time_min) {
time_min = beg;
+ }
float end = animation->track_get_key_time(i, animation->track_get_key_count(i) - 1);
/*if (animation->track_get_type(i) == Animation::TYPE_BEZIER) {
end += animation->bezier_track_get_key_out_handle(i, animation->track_get_key_count(i) - 1).x;
} not worth it since they have no use */
- if (end > time_max)
+ if (end > time_max) {
time_max = end;
+ }
}
}
@@ -1545,7 +1449,6 @@ void AnimationTimelineEdit::_notification(int p_what) {
hscroll->show();
} else {
-
hscroll->hide();
}
}
@@ -1554,22 +1457,22 @@ void AnimationTimelineEdit::_notification(int p_what) {
int end_px = (l - get_value()) * scale;
int begin_px = -get_value() * scale;
- Color notimecol = get_color("dark_color_2", "Editor");
+ Color notimecol = get_theme_color("dark_color_2", "Editor");
Color timecolor = color;
timecolor.a = 0.2;
Color linecolor = color;
linecolor.a = 0.2;
{
-
draw_rect(Rect2(Point2(get_name_limit(), 0), Point2(zoomw - 1, h)), notimecol);
if (begin_px < zoomw && end_px > 0) {
-
- if (begin_px < 0)
+ if (begin_px < 0) {
begin_px = 0;
- if (end_px > zoomw)
+ }
+ if (end_px > zoomw) {
end_px = zoomw;
+ }
draw_rect(Rect2(Point2(get_name_limit() + begin_px, 0), Point2(end_px - begin_px - 1, h)), timecolor);
}
@@ -1595,37 +1498,35 @@ void AnimationTimelineEdit::_notification(int p_what) {
const int max_sc_width = String::num(max_sc).length() * max_digit_width;
while (!step_found) {
-
min = max_sc_width;
- if (decimals > 0)
+ if (decimals > 0) {
min += period_width + max_digit_width * decimals;
+ }
static const int _multp[3] = { 1, 2, 5 };
for (int i = 0; i < 3; i++) {
-
step = (_multp[i] * dec);
if (step * scale / SC_ADJ > min) {
step_found = true;
break;
}
}
- if (step_found)
+ if (step_found) {
break;
+ }
dec *= 10;
decimals--;
- if (decimals < 0)
+ if (decimals < 0) {
decimals = 0;
+ }
}
if (use_fps) {
-
float step_size = animation->get_step();
if (step_size > 0) {
-
int prev_frame_ofs = -10000000;
for (int i = 0; i < zoomw; i++) {
-
float pos = get_value() + double(i) / scale;
float prev = get_value() + (double(i) - 1.0) / scale;
@@ -1635,7 +1536,6 @@ void AnimationTimelineEdit::_notification(int p_what) {
bool sub = Math::floor(prev) == Math::floor(pos);
if (frame != prev_frame && i >= prev_frame_ofs) {
-
draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE));
draw_string(font, Point2(get_name_limit() + i + 3 * EDSCALE, (h - font->get_height()) / 2 + font->get_ascent()).floor(), itos(frame), sub ? color_time_dec : color_time_sec, zoomw - i);
@@ -1646,7 +1546,6 @@ void AnimationTimelineEdit::_notification(int p_what) {
} else {
for (int i = 0; i < zoomw; i++) {
-
float pos = get_value() + double(i) / scale;
float prev = get_value() + (double(i) - 1.0) / scale;
@@ -1655,7 +1554,6 @@ void AnimationTimelineEdit::_notification(int p_what) {
bool sub = (sc % SC_ADJ);
if ((sc / step) != (prev_sc / step) || (prev_sc < 0 && sc >= 0)) {
-
int scd = sc < 0 ? prev_sc : sc;
draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE));
draw_string(font, Point2(get_name_limit() + i + 3, (h - font->get_height()) / 2 + font->get_ascent()).floor(), String::num((scd - (scd % step)) / double(SC_ADJ), decimals), sub ? color_time_dec : color_time_sec, zoomw - i);
@@ -1683,11 +1581,10 @@ void AnimationTimelineEdit::set_animation(const Ref<Animation> &p_animation) {
}
Size2 AnimationTimelineEdit::get_minimum_size() const {
-
Size2 ms = add_track->get_minimum_size();
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
ms.height = MAX(ms.height, font->get_height());
- ms.width = get_buttons_width() + add_track->get_minimum_size().width + get_icon("Hsize", "EditorIcons")->get_width() + 2;
+ ms.width = get_buttons_width() + add_track->get_minimum_size().width + get_theme_icon("Hsize", "EditorIcons")->get_width() + 2;
return ms;
}
@@ -1697,11 +1594,10 @@ void AnimationTimelineEdit::set_undo_redo(UndoRedo *p_undo_redo) {
void AnimationTimelineEdit::set_zoom(Range *p_zoom) {
zoom = p_zoom;
- zoom->connect("value_changed", this, "_zoom_changed");
+ zoom->connect("value_changed", callable_mp(this, &AnimationTimelineEdit::_zoom_changed));
}
void AnimationTimelineEdit::set_play_position(float p_pos) {
-
play_position_pos = p_pos;
play_position->update();
}
@@ -1715,9 +1611,9 @@ void AnimationTimelineEdit::update_play_position() {
}
void AnimationTimelineEdit::update_values() {
-
- if (!animation.is_valid() || editing)
+ if (!animation.is_valid() || editing) {
return;
+ }
editing = true;
if (use_fps && animation->get_step() > 0) {
@@ -1727,7 +1623,7 @@ void AnimationTimelineEdit::update_values() {
time_icon->set_tooltip(TTR("Animation length (frames)"));
} else {
length->set_value(animation->get_length());
- length->set_step(0.01);
+ length->set_step(0.001);
length->set_tooltip(TTR("Animation length (seconds)"));
time_icon->set_tooltip(TTR("Animation length (seconds)"));
}
@@ -1736,9 +1632,9 @@ void AnimationTimelineEdit::update_values() {
}
void AnimationTimelineEdit::_play_position_draw() {
-
- if (!animation.is_valid() || play_position_pos < 0)
+ if (!animation.is_valid() || play_position_pos < 0) {
return;
+ }
float scale = get_zoom_scale();
int h = play_position->get_size().height;
@@ -1746,21 +1642,19 @@ void AnimationTimelineEdit::_play_position_draw() {
int px = (-get_value() + play_position_pos) * scale + get_name_limit();
if (px >= get_name_limit() && px < (play_position->get_size().width - get_buttons_width())) {
- Color color = get_color("accent_color", "Editor");
+ Color color = get_theme_color("accent_color", "Editor");
play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(2 * EDSCALE));
play_position->draw_texture(
- get_icon("TimelineIndicator", "EditorIcons"),
- Point2(px - get_icon("TimelineIndicator", "EditorIcons")->get_width() * 0.5, 0),
+ get_theme_icon("TimelineIndicator", "EditorIcons"),
+ Point2(px - get_theme_icon("TimelineIndicator", "EditorIcons")->get_width() * 0.5, 0),
color);
}
}
void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && hsize_rect.has_point(mb->get_position())) {
-
dragging_hsize = true;
dragging_hsize_from = mb->get_position().x;
dragging_hsize_at = name_limit;
@@ -1770,7 +1664,6 @@ void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) {
dragging_hsize = false;
}
if (mb.is_valid() && mb->get_position().x > get_name_limit() && mb->get_position().x < (get_size().width - get_buttons_width())) {
-
if (!panning_timeline && mb->get_button_index() == BUTTON_LEFT) {
int x = mb->get_position().x - get_name_limit();
@@ -1797,7 +1690,6 @@ void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid()) {
-
if (hsize_rect.has_point(mm->get_position())) {
// Change the cursor to indicate that the track name column's width can be adjusted
set_default_cursor_shape(Control::CURSOR_HSIZE);
@@ -1831,12 +1723,12 @@ void AnimationTimelineEdit::set_use_fps(bool p_use_fps) {
update_values();
update();
}
+
bool AnimationTimelineEdit::is_using_fps() const {
return use_fps;
}
void AnimationTimelineEdit::set_hscroll(HScrollBar *p_hscroll) {
-
hscroll = p_hscroll;
}
@@ -1845,33 +1737,27 @@ void AnimationTimelineEdit::_track_added(int p_track) {
}
void AnimationTimelineEdit::_bind_methods() {
- ClassDB::bind_method("_zoom_changed", &AnimationTimelineEdit::_zoom_changed);
- ClassDB::bind_method("_anim_length_changed", &AnimationTimelineEdit::_anim_length_changed);
- ClassDB::bind_method("_anim_loop_pressed", &AnimationTimelineEdit::_anim_loop_pressed);
- ClassDB::bind_method("_play_position_draw", &AnimationTimelineEdit::_play_position_draw);
ClassDB::bind_method("_gui_input", &AnimationTimelineEdit::_gui_input);
- ClassDB::bind_method("_track_added", &AnimationTimelineEdit::_track_added);
ADD_SIGNAL(MethodInfo("zoom_changed"));
ADD_SIGNAL(MethodInfo("name_limit_changed"));
- ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::REAL, "position"), PropertyInfo(Variant::BOOL, "drag")));
+ ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag")));
ADD_SIGNAL(MethodInfo("track_added", PropertyInfo(Variant::INT, "track")));
- ADD_SIGNAL(MethodInfo("length_changed", PropertyInfo(Variant::REAL, "size")));
+ ADD_SIGNAL(MethodInfo("length_changed", PropertyInfo(Variant::FLOAT, "size")));
}
AnimationTimelineEdit::AnimationTimelineEdit() {
-
use_fps = false;
editing = false;
name_limit = 150 * EDSCALE;
- zoom = NULL;
+ zoom = nullptr;
play_position_pos = 0;
play_position = memnew(Control);
play_position->set_mouse_filter(MOUSE_FILTER_PASS);
add_child(play_position);
play_position->set_anchors_and_margins_preset(PRESET_WIDE);
- play_position->connect("draw", this, "_play_position_draw");
+ play_position->connect("draw", callable_mp(this, &AnimationTimelineEdit::_play_position_draw));
add_track = memnew(MenuButton);
add_track->set_position(Vector2(0, 0));
@@ -1890,22 +1776,23 @@ AnimationTimelineEdit::AnimationTimelineEdit() {
length = memnew(EditorSpinSlider);
length->set_min(0.001);
length->set_max(36000);
- length->set_step(0.01);
+ length->set_step(0.001);
length->set_allow_greater(true);
length->set_custom_minimum_size(Vector2(70 * EDSCALE, 0));
length->set_hide_slider(true);
length->set_tooltip(TTR("Animation length (seconds)"));
- length->connect("value_changed", this, "_anim_length_changed");
+ length->connect("value_changed", callable_mp(this, &AnimationTimelineEdit::_anim_length_changed));
len_hb->add_child(length);
- loop = memnew(ToolButton);
+ loop = memnew(Button);
+ loop->set_flat(true);
loop->set_tooltip(TTR("Animation Looping"));
- loop->connect("pressed", this, "_anim_loop_pressed");
+ loop->connect("pressed", callable_mp(this, &AnimationTimelineEdit::_anim_loop_pressed));
loop->set_toggle_mode(true);
len_hb->add_child(loop);
add_child(len_hb);
add_track->hide();
- add_track->get_popup()->connect("index_pressed", this, "_track_added");
+ add_track->get_popup()->connect("index_pressed", callable_mp(this, &AnimationTimelineEdit::_track_added));
len_hb->hide();
panning_timeline = false;
@@ -1916,41 +1803,39 @@ AnimationTimelineEdit::AnimationTimelineEdit() {
////////////////////////////////////
void AnimationTrackEdit::_notification(int p_what) {
-
if (p_what == NOTIFICATION_DRAW) {
-
- if (animation.is_null())
+ if (animation.is_null()) {
return;
+ }
ERR_FAIL_INDEX(track, animation->get_track_count());
int limit = timeline->get_name_limit();
if (has_focus()) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
accent.a *= 0.7;
// Offside so the horizontal sides aren't cutoff.
draw_rect(Rect2(Point2(1 * EDSCALE, 0), get_size() - Size2(1 * EDSCALE, 0)), accent, false);
}
- Ref<Font> font = get_font("font", "Label");
- Color color = get_color("font_color", "Label");
- Ref<Texture> type_icons[6] = {
- get_icon("KeyValue", "EditorIcons"),
- get_icon("KeyXform", "EditorIcons"),
- get_icon("KeyCall", "EditorIcons"),
- get_icon("KeyBezier", "EditorIcons"),
- get_icon("KeyAudio", "EditorIcons"),
- get_icon("KeyAnimation", "EditorIcons")
+ Ref<Font> font = get_theme_font("font", "Label");
+ Color color = get_theme_color("font_color", "Label");
+ Ref<Texture2D> type_icons[6] = {
+ get_theme_icon("KeyValue", "EditorIcons"),
+ get_theme_icon("KeyXform", "EditorIcons"),
+ get_theme_icon("KeyCall", "EditorIcons"),
+ get_theme_icon("KeyBezier", "EditorIcons"),
+ get_theme_icon("KeyAudio", "EditorIcons"),
+ get_theme_icon("KeyAnimation", "EditorIcons")
};
- int hsep = get_constant("hseparation", "ItemList");
+ int hsep = get_theme_constant("hseparation", "ItemList");
Color linecolor = color;
linecolor.a = 0.2;
// NAMES AND ICONS //
{
-
- Ref<Texture> check = animation->track_is_enabled(track) ? get_icon("checked", "CheckBox") : get_icon("unchecked", "CheckBox");
+ Ref<Texture2D> check = animation->track_is_enabled(track) ? get_theme_icon("checked", "CheckBox") : get_theme_icon("unchecked", "CheckBox");
int ofs = in_group ? check->get_width() : 0; //not the best reference for margin but..
@@ -1958,12 +1843,12 @@ void AnimationTrackEdit::_notification(int p_what) {
draw_texture(check, check_rect.position);
ofs += check->get_width() + hsep;
- Ref<Texture> type_icon = type_icons[animation->track_get_type(track)];
+ Ref<Texture2D> type_icon = type_icons[animation->track_get_type(track)];
draw_texture(type_icon, Point2(ofs, int(get_size().height - type_icon->get_height()) / 2));
ofs += type_icon->get_width() + hsep;
NodePath path = animation->track_get_path(track);
- Node *node = NULL;
+ Node *node = nullptr;
if (root && root->has_node(path)) {
node = root->get_node(path);
}
@@ -1971,11 +1856,10 @@ void AnimationTrackEdit::_notification(int p_what) {
String text;
Color text_color = color;
if (node && EditorNode::get_singleton()->get_editor_selection()->is_selected(node)) {
- text_color = get_color("accent_color", "Editor");
+ text_color = get_theme_color("accent_color", "Editor");
}
if (in_group) {
-
if (animation->track_get_type(track) == Animation::TYPE_METHOD) {
text = TTR("Functions:");
} else if (animation->track_get_type(track) == Animation::TYPE_AUDIO) {
@@ -1987,7 +1871,7 @@ void AnimationTrackEdit::_notification(int p_what) {
}
text_color.a *= 0.7;
} else if (node) {
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(node, "Node");
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(node, "Node");
draw_texture(icon, Point2(ofs, int(get_size().height - icon->get_height()) / 2));
icon_cache = icon;
@@ -2022,14 +1906,12 @@ void AnimationTrackEdit::_notification(int p_what) {
int limit_end = get_size().width - timeline->get_buttons_width();
for (int i = 0; i < animation->track_get_key_count(track); i++) {
-
float offset = animation->track_get_key_time(track, i) - timeline->get_value();
if (editor->is_key_selected(track, i) && editor->is_moving_selection()) {
offset = editor->snap_time(offset + editor->get_moving_selection_offset(), true);
}
offset = offset * scale + limit;
if (i < animation->track_get_key_count(track) - 1) {
-
float offset_n = animation->track_get_key_time(track, i + 1) - timeline->get_value();
if (editor->is_key_selected(track, i + 1) && editor->is_moving_selection()) {
offset_n = editor->snap_time(offset_n + editor->get_moving_selection_offset());
@@ -2048,27 +1930,26 @@ void AnimationTrackEdit::_notification(int p_what) {
// BUTTONS //
{
-
- Ref<Texture> wrap_icon[2] = {
- get_icon("InterpWrapClamp", "EditorIcons"),
- get_icon("InterpWrapLoop", "EditorIcons"),
+ Ref<Texture2D> wrap_icon[2] = {
+ get_theme_icon("InterpWrapClamp", "EditorIcons"),
+ get_theme_icon("InterpWrapLoop", "EditorIcons"),
};
- Ref<Texture> interp_icon[3] = {
- get_icon("InterpRaw", "EditorIcons"),
- get_icon("InterpLinear", "EditorIcons"),
- get_icon("InterpCubic", "EditorIcons")
+ Ref<Texture2D> interp_icon[3] = {
+ get_theme_icon("InterpRaw", "EditorIcons"),
+ get_theme_icon("InterpLinear", "EditorIcons"),
+ get_theme_icon("InterpCubic", "EditorIcons")
};
- Ref<Texture> cont_icon[4] = {
- get_icon("TrackContinuous", "EditorIcons"),
- get_icon("TrackDiscrete", "EditorIcons"),
- get_icon("TrackTrigger", "EditorIcons"),
- get_icon("TrackCapture", "EditorIcons")
+ Ref<Texture2D> cont_icon[4] = {
+ get_theme_icon("TrackContinuous", "EditorIcons"),
+ get_theme_icon("TrackDiscrete", "EditorIcons"),
+ get_theme_icon("TrackTrigger", "EditorIcons"),
+ get_theme_icon("TrackCapture", "EditorIcons")
};
int ofs = get_size().width - timeline->get_buttons_width();
- Ref<Texture> down_icon = get_icon("select_arrow", "Tree");
+ Ref<Texture2D> down_icon = get_theme_icon("select_arrow", "Tree");
draw_line(Point2(ofs, 0), Point2(ofs, get_size().height), linecolor, Math::round(EDSCALE));
@@ -2084,7 +1965,7 @@ void AnimationTrackEdit::_notification(int p_what) {
update_mode = Animation::UPDATE_CONTINUOUS;
}
- Ref<Texture> update_icon = cont_icon[update_mode];
+ Ref<Texture2D> update_icon = cont_icon[update_mode];
update_mode_rect.position.x = ofs;
update_mode_rect.position.y = int(get_size().height - update_icon->get_height()) / 2;
@@ -2105,7 +1986,7 @@ void AnimationTrackEdit::_notification(int p_what) {
update_mode_rect.size.x += down_icon->get_width();
bezier_edit_rect = Rect2();
} else if (animation->track_get_type(track) == Animation::TYPE_BEZIER) {
- Ref<Texture> bezier_icon = get_icon("EditBezier", "EditorIcons");
+ Ref<Texture2D> bezier_icon = get_theme_icon("EditBezier", "EditorIcons");
update_mode_rect.size.x += down_icon->get_width();
bezier_edit_rect.position = update_mode_rect.position + (update_mode_rect.size - bezier_icon->get_size()) / 2;
bezier_edit_rect.size = bezier_icon->get_size();
@@ -2126,7 +2007,7 @@ void AnimationTrackEdit::_notification(int p_what) {
Animation::InterpolationType interp_mode = animation->track_get_interpolation_type(track);
- Ref<Texture> icon = interp_icon[interp_mode];
+ Ref<Texture2D> icon = interp_icon[interp_mode];
interp_mode_rect.position.x = ofs;
interp_mode_rect.position.y = int(get_size().height - icon->get_height()) / 2;
@@ -2159,7 +2040,7 @@ void AnimationTrackEdit::_notification(int p_what) {
bool loop_wrap = animation->track_get_interpolation_loop_wrap(track);
- Ref<Texture> icon = wrap_icon[loop_wrap ? 1 : 0];
+ Ref<Texture2D> icon = wrap_icon[loop_wrap ? 1 : 0];
loop_mode_rect.position.x = ofs;
loop_mode_rect.position.y = int(get_size().height - icon->get_height()) / 2;
@@ -2190,7 +2071,7 @@ void AnimationTrackEdit::_notification(int p_what) {
{
//erase
- Ref<Texture> icon = get_icon("Remove", "EditorIcons");
+ Ref<Texture2D> icon = get_theme_icon("Remove", "EditorIcons");
remove_rect.position.x = ofs + ((get_size().width - ofs) - icon->get_width()) / 2;
remove_rect.position.y = int(get_size().height - icon->get_height()) / 2;
@@ -2207,7 +2088,7 @@ void AnimationTrackEdit::_notification(int p_what) {
}
if (dropping_at != 0) {
- Color drop_color = get_color("accent_color", "Editor");
+ Color drop_color = get_theme_color("accent_color", "Editor");
if (dropping_at < 0) {
draw_line(Vector2(0, 0), Vector2(get_size().width, 0), drop_color, Math::round(EDSCALE));
} else {
@@ -2222,15 +2103,17 @@ void AnimationTrackEdit::_notification(int p_what) {
}
int AnimationTrackEdit::get_key_height() const {
- if (!animation.is_valid())
+ if (!animation.is_valid()) {
return 0;
+ }
return type_icon->get_height();
}
-Rect2 AnimationTrackEdit::get_key_rect(int p_index, float p_pixels_sec) {
- if (!animation.is_valid())
+Rect2 AnimationTrackEdit::get_key_rect(int p_index, float p_pixels_sec) {
+ if (!animation.is_valid()) {
return Rect2();
+ }
Rect2 rect = Rect2(-type_icon->get_width() / 2, 0, type_icon->get_width(), get_size().height);
//make it a big easier to click
@@ -2244,17 +2127,20 @@ bool AnimationTrackEdit::is_key_selectable_by_distance() const {
}
void AnimationTrackEdit::draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right) {
- if (p_next_x < p_clip_left)
+ if (p_next_x < p_clip_left) {
return;
- if (p_x > p_clip_right)
+ }
+ if (p_x > p_clip_right) {
return;
+ }
Variant current = animation->track_get_key_value(get_track(), p_index);
Variant next = animation->track_get_key_value(get_track(), p_index + 1);
- if (current != next)
+ if (current != next) {
return;
+ }
- Color color = get_color("font_color", "Label");
+ Color color = get_theme_color("font_color", "Label");
color.a = 0.5;
int from_x = MAX(p_x, p_clip_left);
@@ -2264,44 +2150,47 @@ void AnimationTrackEdit::draw_key_link(int p_index, float p_pixels_sec, int p_x,
}
void AnimationTrackEdit::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
-
- if (!animation.is_valid())
+ if (!animation.is_valid()) {
return;
+ }
- if (p_x < p_clip_left || p_x > p_clip_right)
+ if (p_x < p_clip_left || p_x > p_clip_right) {
return;
+ }
- Ref<Texture> icon_to_draw = p_selected ? selected_icon : type_icon;
+ Ref<Texture2D> icon_to_draw = p_selected ? selected_icon : type_icon;
// Override type icon for invalid value keys, unless selected.
if (!p_selected && animation->track_get_type(track) == Animation::TYPE_VALUE) {
const Variant &v = animation->track_get_key_value(track, p_index);
Variant::Type valid_type = Variant::NIL;
if (!_is_value_key_valid(v, valid_type)) {
- icon_to_draw = get_icon("KeyInvalid", "EditorIcons");
+ icon_to_draw = get_theme_icon("KeyInvalid", "EditorIcons");
}
}
Vector2 ofs(p_x - icon_to_draw->get_width() / 2, int(get_size().height - icon_to_draw->get_height()) / 2);
if (animation->track_get_type(track) == Animation::TYPE_METHOD) {
- Ref<Font> font = get_font("font", "Label");
- Color color = get_color("font_color", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
+ Color color = get_theme_color("font_color", "Label");
color.a = 0.5;
Dictionary d = animation->track_get_key_value(track, p_index);
String text;
- if (d.has("method"))
+ if (d.has("method")) {
text += String(d["method"]);
+ }
text += "(";
Vector<Variant> args;
- if (d.has("args"))
+ if (d.has("args")) {
args = d["args"];
+ }
for (int i = 0; i < args.size(); i++) {
-
- if (i > 0)
+ if (i > 0) {
text += ", ";
+ }
text += String(args[i]);
}
text += ")";
@@ -2317,14 +2206,15 @@ void AnimationTrackEdit::draw_key(int p_index, float p_pixels_sec, int p_x, bool
//helper
void AnimationTrackEdit::draw_rect_clipped(const Rect2 &p_rect, const Color &p_color, bool p_filled) {
-
int clip_left = timeline->get_name_limit();
int clip_right = get_size().width - timeline->get_buttons_width();
- if (p_rect.position.x > clip_right)
+ if (p_rect.position.x > clip_right) {
return;
- if (p_rect.position.x + p_rect.size.x < clip_left)
+ }
+ if (p_rect.position.x + p_rect.size.x < clip_left) {
return;
+ }
Rect2 clip = Rect2(clip_left, 0, clip_right - clip_left, get_size().height);
draw_rect(clip.clip(p_rect), p_color, p_filled);
}
@@ -2335,21 +2225,21 @@ void AnimationTrackEdit::draw_bg(int p_clip_left, int p_clip_right) {
void AnimationTrackEdit::draw_fg(int p_clip_left, int p_clip_right) {
}
-void AnimationTrackEdit::draw_texture_clipped(const Ref<Texture> &p_texture, const Vector2 &p_pos) {
-
+void AnimationTrackEdit::draw_texture_clipped(const Ref<Texture2D> &p_texture, const Vector2 &p_pos) {
draw_texture_region_clipped(p_texture, Rect2(p_pos, p_texture->get_size()), Rect2(Point2(), p_texture->get_size()));
}
-void AnimationTrackEdit::draw_texture_region_clipped(const Ref<Texture> &p_texture, const Rect2 &p_rect, const Rect2 &p_region) {
-
+void AnimationTrackEdit::draw_texture_region_clipped(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_region) {
int clip_left = timeline->get_name_limit();
int clip_right = get_size().width - timeline->get_buttons_width();
//clip left and right
- if (clip_left > p_rect.position.x + p_rect.size.x)
+ if (clip_left > p_rect.position.x + p_rect.size.x) {
return;
- if (clip_right < p_rect.position.x)
+ }
+ if (clip_right < p_rect.position.x) {
return;
+ }
Rect2 rect = p_rect;
Rect2 region = p_region;
@@ -2366,7 +2256,6 @@ void AnimationTrackEdit::draw_texture_region_clipped(const Ref<Texture> &p_textu
}
if (clip_right < rect.position.x + rect.size.x) {
-
int rect_pixels = rect.position.x + rect.size.x - clip_right;
int region_pixels = rect_pixels * region.size.x / rect.size.x;
@@ -2386,25 +2275,24 @@ Ref<Animation> AnimationTrackEdit::get_animation() const {
}
void AnimationTrackEdit::set_animation_and_track(const Ref<Animation> &p_animation, int p_track) {
-
animation = p_animation;
track = p_track;
update();
- Ref<Texture> type_icons[6] = {
- get_icon("KeyValue", "EditorIcons"),
- get_icon("KeyXform", "EditorIcons"),
- get_icon("KeyCall", "EditorIcons"),
- get_icon("KeyBezier", "EditorIcons"),
- get_icon("KeyAudio", "EditorIcons"),
- get_icon("KeyAnimation", "EditorIcons")
+ Ref<Texture2D> type_icons[6] = {
+ get_theme_icon("KeyValue", "EditorIcons"),
+ get_theme_icon("KeyXform", "EditorIcons"),
+ get_theme_icon("KeyCall", "EditorIcons"),
+ get_theme_icon("KeyBezier", "EditorIcons"),
+ get_theme_icon("KeyAudio", "EditorIcons"),
+ get_theme_icon("KeyAnimation", "EditorIcons")
};
ERR_FAIL_INDEX(track, animation->get_track_count());
node_path = animation->track_get_path(p_track);
type_icon = type_icons[animation->track_get_type(track)];
- selected_icon = get_icon("KeySelected", "EditorIcons");
+ selected_icon = get_theme_icon("KeySelected", "EditorIcons");
}
NodePath AnimationTrackEdit::get_path() const {
@@ -2412,10 +2300,9 @@ NodePath AnimationTrackEdit::get_path() const {
}
Size2 AnimationTrackEdit::get_minimum_size() const {
-
- Ref<Texture> texture = get_icon("Object", "EditorIcons");
- Ref<Font> font = get_font("font", "Label");
- int separation = get_constant("vseparation", "ItemList");
+ Ref<Texture2D> texture = get_theme_icon("Object", "EditorIcons");
+ Ref<Font> font = get_theme_font("font", "Label");
+ int separation = get_theme_constant("vseparation", "ItemList");
int max_h = MAX(texture->get_height(), font->get_height());
max_h = MAX(max_h, get_key_height());
@@ -2429,17 +2316,18 @@ void AnimationTrackEdit::set_undo_redo(UndoRedo *p_undo_redo) {
void AnimationTrackEdit::set_timeline(AnimationTimelineEdit *p_timeline) {
timeline = p_timeline;
- timeline->connect("zoom_changed", this, "_zoom_changed");
- timeline->connect("name_limit_changed", this, "_zoom_changed");
+ timeline->connect("zoom_changed", callable_mp(this, &AnimationTrackEdit::_zoom_changed));
+ timeline->connect("name_limit_changed", callable_mp(this, &AnimationTrackEdit::_zoom_changed));
}
+
void AnimationTrackEdit::set_editor(AnimationTrackEditor *p_editor) {
editor = p_editor;
}
void AnimationTrackEdit::_play_position_draw() {
-
- if (!animation.is_valid() || play_position_pos < 0)
+ if (!animation.is_valid() || play_position_pos < 0) {
return;
+ }
float scale = timeline->get_zoom_scale();
int h = get_size().height;
@@ -2447,13 +2335,12 @@ void AnimationTrackEdit::_play_position_draw() {
int px = (-timeline->get_value() + play_position_pos) * scale + timeline->get_name_limit();
if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) {
- Color color = get_color("accent_color", "Editor");
+ Color color = get_theme_color("accent_color", "Editor");
play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(2 * EDSCALE));
}
}
void AnimationTrackEdit::set_play_position(float p_pos) {
-
play_position_pos = p_pos;
play_position->update();
}
@@ -2476,15 +2363,19 @@ void AnimationTrackEdit::_path_entered(const String &p_text) {
undo_redo->add_do_method(animation.ptr(), "track_set_path", track, p_text);
undo_redo->add_undo_method(animation.ptr(), "track_set_path", track, animation->track_get_path(track));
undo_redo->commit_action();
+ path_popup->hide();
}
bool AnimationTrackEdit::_is_value_key_valid(const Variant &p_key_value, Variant::Type &r_valid_type) const {
+ if (root == nullptr) {
+ return false;
+ }
RES res;
Vector<StringName> leftover_path;
Node *node = root->get_node_and_resource(animation->track_get_path(track), res, leftover_path);
- Object *obj = NULL;
+ Object *obj = nullptr;
if (res.is_valid()) {
obj = res.ptr();
} else if (node) {
@@ -2500,7 +2391,6 @@ bool AnimationTrackEdit::_is_value_key_valid(const Variant &p_key_value, Variant
}
String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
-
if (check_rect.has_point(p_pos)) {
return TTR("Toggle this track on/off.");
}
@@ -2532,20 +2422,17 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
int limit_start_hitbox = limit - type_icon->get_width();
if (p_pos.x >= limit_start_hitbox && p_pos.x <= limit_end) {
-
int key_idx = -1;
float key_distance = 1e20;
// Select should happen in the opposite order of drawing for more accurate overlap select.
for (int i = animation->track_get_key_count(track) - 1; i >= 0; i--) {
-
Rect2 rect = const_cast<AnimationTrackEdit *>(this)->get_key_rect(i, timeline->get_zoom_scale());
float offset = animation->track_get_key_time(track, i) - timeline->get_value();
offset = offset * timeline->get_zoom_scale() + limit;
rect.position.x += offset;
if (rect.has_point(p_pos)) {
-
if (const_cast<AnimationTrackEdit *>(this)->is_key_selectable_by_distance()) {
float distance = ABS(offset - p_pos.x);
if (key_idx == -1 || distance < key_distance) {
@@ -2560,22 +2447,21 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
}
if (key_idx != -1) {
-
String text = TTR("Time (s): ") + rtos(animation->track_get_key_time(track, key_idx)) + "\n";
switch (animation->track_get_type(track)) {
-
case Animation::TYPE_TRANSFORM: {
-
Dictionary d = animation->track_get_key_value(track, key_idx);
- if (d.has("location"))
+ if (d.has("location")) {
text += "Pos: " + String(d["location"]) + "\n";
- if (d.has("rotation"))
+ }
+ if (d.has("rotation")) {
text += "Rot: " + String(d["rotation"]) + "\n";
- if (d.has("scale"))
+ }
+ if (d.has("scale")) {
text += "Scale: " + String(d["scale"]) + "\n";
+ }
} break;
case Animation::TYPE_VALUE: {
-
const Variant &v = animation->track_get_key_value(track, key_idx);
text += "Type: " + Variant::get_type_name(v.get_type()) + "\n";
Variant::Type valid_type = Variant::NIL;
@@ -2588,25 +2474,25 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
} break;
case Animation::TYPE_METHOD: {
-
Dictionary d = animation->track_get_key_value(track, key_idx);
- if (d.has("method"))
+ if (d.has("method")) {
text += String(d["method"]);
+ }
text += "(";
Vector<Variant> args;
- if (d.has("args"))
+ if (d.has("args")) {
args = d["args"];
+ }
for (int i = 0; i < args.size(); i++) {
-
- if (i > 0)
+ if (i > 0) {
text += ", ";
+ }
text += String(args[i]);
}
text += ")\n";
} break;
case Animation::TYPE_BEZIER: {
-
float h = animation->bezier_track_get_key_value(track, key_idx);
text += "Value: " + rtos(h) + "\n";
Vector2 ih = animation->bezier_track_get_key_in_handle(track, key_idx);
@@ -2615,7 +2501,6 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
text += "Out-Handle: " + oh + "\n";
} break;
case Animation::TYPE_AUDIO: {
-
String stream_name = "null";
RES stream = animation->audio_track_get_key_stream(track, key_idx);
if (stream.is_valid()) {
@@ -2635,7 +2520,6 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
text += "End (s): " + rtos(eo) + "\n";
} break;
case Animation::TYPE_ANIMATION: {
-
String name = animation->animation_track_get_key_animation(track, key_idx);
text += "Animation Clip: " + name + "\n";
} break;
@@ -2688,17 +2572,17 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_menu_selected");
+ menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
menu->clear();
- menu->add_icon_item(get_icon("TrackContinuous", "EditorIcons"), TTR("Continuous"), MENU_CALL_MODE_CONTINUOUS);
- menu->add_icon_item(get_icon("TrackDiscrete", "EditorIcons"), TTR("Discrete"), MENU_CALL_MODE_DISCRETE);
- menu->add_icon_item(get_icon("TrackTrigger", "EditorIcons"), TTR("Trigger"), MENU_CALL_MODE_TRIGGER);
- menu->add_icon_item(get_icon("TrackCapture", "EditorIcons"), TTR("Capture"), MENU_CALL_MODE_CAPTURE);
+ menu->add_icon_item(get_theme_icon("TrackContinuous", "EditorIcons"), TTR("Continuous"), MENU_CALL_MODE_CONTINUOUS);
+ menu->add_icon_item(get_theme_icon("TrackDiscrete", "EditorIcons"), TTR("Discrete"), MENU_CALL_MODE_DISCRETE);
+ menu->add_icon_item(get_theme_icon("TrackTrigger", "EditorIcons"), TTR("Trigger"), MENU_CALL_MODE_TRIGGER);
+ menu->add_icon_item(get_theme_icon("TrackCapture", "EditorIcons"), TTR("Capture"), MENU_CALL_MODE_CAPTURE);
menu->set_as_minsize();
- Vector2 popup_pos = get_global_position() + update_mode_rect.position + Vector2(0, update_mode_rect.size.height);
- menu->set_global_position(popup_pos);
+ Vector2 popup_pos = get_screen_position() + update_mode_rect.position + Vector2(0, update_mode_rect.size.height);
+ menu->set_position(popup_pos);
menu->popup();
accept_event();
}
@@ -2707,16 +2591,16 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_menu_selected");
+ menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
menu->clear();
- menu->add_icon_item(get_icon("InterpRaw", "EditorIcons"), TTR("Nearest"), MENU_INTERPOLATION_NEAREST);
- menu->add_icon_item(get_icon("InterpLinear", "EditorIcons"), TTR("Linear"), MENU_INTERPOLATION_LINEAR);
- menu->add_icon_item(get_icon("InterpCubic", "EditorIcons"), TTR("Cubic"), MENU_INTERPOLATION_CUBIC);
+ menu->add_icon_item(get_theme_icon("InterpRaw", "EditorIcons"), TTR("Nearest"), MENU_INTERPOLATION_NEAREST);
+ menu->add_icon_item(get_theme_icon("InterpLinear", "EditorIcons"), TTR("Linear"), MENU_INTERPOLATION_LINEAR);
+ menu->add_icon_item(get_theme_icon("InterpCubic", "EditorIcons"), TTR("Cubic"), MENU_INTERPOLATION_CUBIC);
menu->set_as_minsize();
- Vector2 popup_pos = get_global_position() + interp_mode_rect.position + Vector2(0, interp_mode_rect.size.height);
- menu->set_global_position(popup_pos);
+ Vector2 popup_pos = get_screen_position() + interp_mode_rect.position + Vector2(0, interp_mode_rect.size.height);
+ menu->set_position(popup_pos);
menu->popup();
accept_event();
}
@@ -2725,15 +2609,15 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_menu_selected");
+ menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
menu->clear();
- menu->add_icon_item(get_icon("InterpWrapClamp", "EditorIcons"), TTR("Clamp Loop Interp"), MENU_LOOP_CLAMP);
- menu->add_icon_item(get_icon("InterpWrapLoop", "EditorIcons"), TTR("Wrap Loop Interp"), MENU_LOOP_WRAP);
+ menu->add_icon_item(get_theme_icon("InterpWrapClamp", "EditorIcons"), TTR("Clamp Loop Interp"), MENU_LOOP_CLAMP);
+ menu->add_icon_item(get_theme_icon("InterpWrapLoop", "EditorIcons"), TTR("Wrap Loop Interp"), MENU_LOOP_WRAP);
menu->set_as_minsize();
- Vector2 popup_pos = get_global_position() + loop_mode_rect.position + Vector2(0, loop_mode_rect.size.height);
- menu->set_global_position(popup_pos);
+ Vector2 popup_pos = get_screen_position() + loop_mode_rect.position + Vector2(0, loop_mode_rect.size.height);
+ menu->set_position(popup_pos);
menu->popup();
accept_event();
}
@@ -2758,20 +2642,17 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
int limit_start_hitbox = limit - type_icon->get_width();
if (pos.x >= limit_start_hitbox && pos.x <= limit_end) {
-
int key_idx = -1;
float key_distance = 1e20;
// Select should happen in the opposite order of drawing for more accurate overlap select.
for (int i = animation->track_get_key_count(track) - 1; i >= 0; i--) {
-
Rect2 rect = get_key_rect(i, scale);
float offset = animation->track_get_key_time(track, i) - timeline->get_value();
offset = offset * scale + limit;
rect.position.x += offset;
if (rect.has_point(pos)) {
-
if (is_key_selectable_by_distance()) {
float distance = ABS(offset - pos.x);
if (key_idx == -1 || distance < key_distance) {
@@ -2820,21 +2701,21 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_menu_selected");
+ menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
menu->clear();
- menu->add_icon_item(get_icon("Key", "EditorIcons"), TTR("Insert Key"), MENU_KEY_INSERT);
+ menu->add_icon_item(get_theme_icon("Key", "EditorIcons"), TTR("Insert Key"), MENU_KEY_INSERT);
if (editor->is_selection_active()) {
menu->add_separator();
- menu->add_icon_item(get_icon("Duplicate", "EditorIcons"), TTR("Duplicate Key(s)"), MENU_KEY_DUPLICATE);
+ menu->add_icon_item(get_theme_icon("Duplicate", "EditorIcons"), TTR("Duplicate Key(s)"), MENU_KEY_DUPLICATE);
menu->add_separator();
- menu->add_icon_item(get_icon("Remove", "EditorIcons"), TTR("Delete Key(s)"), MENU_KEY_DELETE);
+ menu->add_icon_item(get_theme_icon("Remove", "EditorIcons"), TTR("Delete Key(s)"), MENU_KEY_DELETE);
}
menu->set_as_minsize();
- Vector2 popup_pos = get_global_transform().xform(get_local_mouse_position());
- menu->set_global_position(popup_pos);
+ Vector2 popup_pos = get_screen_transform().xform(get_local_mouse_position());
+ menu->set_position(popup_pos);
menu->popup();
insert_at_pos = offset + timeline->get_value();
@@ -2843,26 +2724,27 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && clicking_on_name) {
-
if (!path) {
+ path_popup = memnew(Popup);
+ path_popup->set_wrap_controls(true);
+ add_child(path_popup);
path = memnew(LineEdit);
- add_child(path);
- path->set_as_toplevel(true);
- path->connect("text_entered", this, "_path_entered");
+ path_popup->add_child(path);
+ path->set_anchors_and_margins_preset(PRESET_WIDE);
+ path->connect("text_entered", callable_mp(this, &AnimationTrackEdit::_path_entered));
}
path->set_text(animation->track_get_path(track));
- Vector2 theme_ofs = path->get_stylebox("normal", "LineEdit")->get_offset();
- path->set_position(get_global_position() + path_rect.position - theme_ofs);
- path->set_size(path_rect.size);
- path->show_modal();
+ Vector2 theme_ofs = path->get_theme_stylebox("normal", "LineEdit")->get_offset();
+ path_popup->set_position(get_screen_position() + path_rect.position - theme_ofs);
+ path_popup->set_size(path_rect.size);
+ path_popup->popup();
path->grab_focus();
path->set_cursor_position(path->get_text().length());
clicking_on_name = false;
}
if (mb.is_valid() && moving_selection_attempt) {
-
if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
moving_selection_attempt = false;
if (moving_selection) {
@@ -2875,7 +2757,6 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
if (moving_selection && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) {
-
moving_selection_attempt = false;
moving_selection = false;
emit_signal("move_selection_cancel");
@@ -2884,7 +2765,6 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT && moving_selection_attempt) {
-
if (!moving_selection) {
moving_selection = true;
emit_signal("move_selection_begin");
@@ -2896,9 +2776,9 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
}
Variant AnimationTrackEdit::get_drag_data(const Point2 &p_point) {
-
- if (!clicking_on_name)
+ if (!clicking_on_name) {
return Variant();
+ }
Dictionary drag_data;
drag_data["type"] = "animation_track";
@@ -2907,7 +2787,8 @@ Variant AnimationTrackEdit::get_drag_data(const Point2 &p_point) {
drag_data["group"] = base_path;
drag_data["index"] = track;
- ToolButton *tb = memnew(ToolButton);
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
tb->set_text(path_cache);
tb->set_icon(icon_cache);
set_drag_preview(tb);
@@ -2918,7 +2799,6 @@ Variant AnimationTrackEdit::get_drag_data(const Point2 &p_point) {
}
bool AnimationTrackEdit::can_drop_data(const Point2 &p_point, const Variant &p_data) const {
-
Dictionary d = p_data;
if (!d.has("type")) {
return false;
@@ -2949,8 +2829,8 @@ bool AnimationTrackEdit::can_drop_data(const Point2 &p_point, const Variant &p_d
return true;
}
-void AnimationTrackEdit::drop_data(const Point2 &p_point, const Variant &p_data) {
+void AnimationTrackEdit::drop_data(const Point2 &p_point, const Variant &p_data) {
Dictionary d = p_data;
if (!d.has("type")) {
return;
@@ -2980,13 +2860,11 @@ void AnimationTrackEdit::drop_data(const Point2 &p_point, const Variant &p_data)
}
void AnimationTrackEdit::_menu_selected(int p_index) {
-
switch (p_index) {
case MENU_CALL_MODE_CONTINUOUS:
case MENU_CALL_MODE_DISCRETE:
case MENU_CALL_MODE_TRIGGER:
case MENU_CALL_MODE_CAPTURE: {
-
Animation::UpdateMode update_mode = Animation::UpdateMode(p_index);
undo_redo->create_action(TTR("Change Animation Update Mode"));
undo_redo->add_do_method(animation.ptr(), "value_track_set_update_mode", track, update_mode);
@@ -2998,7 +2876,6 @@ void AnimationTrackEdit::_menu_selected(int p_index) {
case MENU_INTERPOLATION_NEAREST:
case MENU_INTERPOLATION_LINEAR:
case MENU_INTERPOLATION_CUBIC: {
-
Animation::InterpolationType interp_mode = Animation::InterpolationType(p_index - MENU_INTERPOLATION_NEAREST);
undo_redo->create_action(TTR("Change Animation Interpolation Mode"));
undo_redo->add_do_method(animation.ptr(), "track_set_interpolation_type", track, interp_mode);
@@ -3008,7 +2885,6 @@ void AnimationTrackEdit::_menu_selected(int p_index) {
} break;
case MENU_LOOP_WRAP:
case MENU_LOOP_CLAMP: {
-
bool loop_wrap = p_index == MENU_LOOP_WRAP;
undo_redo->create_action(TTR("Change Animation Loop Mode"));
undo_redo->add_do_method(animation.ptr(), "track_set_interpolation_loop_wrap", track, loop_wrap);
@@ -3037,6 +2913,7 @@ void AnimationTrackEdit::cancel_drop() {
update();
}
}
+
void AnimationTrackEdit::set_in_group(bool p_enable) {
in_group = p_enable;
update();
@@ -3050,39 +2927,34 @@ void AnimationTrackEdit::append_to_selection(const Rect2 &p_box, bool p_deselect
// Select should happen in the opposite order of drawing for more accurate overlap select.
for (int i = animation->track_get_key_count(track) - 1; i >= 0; i--) {
-
Rect2 rect = const_cast<AnimationTrackEdit *>(this)->get_key_rect(i, timeline->get_zoom_scale());
float offset = animation->track_get_key_time(track, i) - timeline->get_value();
offset = offset * timeline->get_zoom_scale() + timeline->get_name_limit();
rect.position.x += offset;
if (select_rect.intersects(rect)) {
- if (p_deselection)
+ if (p_deselection) {
emit_signal("deselect_key", i);
- else
+ } else {
emit_signal("select_key", i, false);
+ }
}
}
}
void AnimationTrackEdit::_bind_methods() {
-
- ClassDB::bind_method("_zoom_changed", &AnimationTrackEdit::_zoom_changed);
- ClassDB::bind_method("_menu_selected", &AnimationTrackEdit::_menu_selected);
ClassDB::bind_method("_gui_input", &AnimationTrackEdit::_gui_input);
- ClassDB::bind_method("_path_entered", &AnimationTrackEdit::_path_entered);
- ClassDB::bind_method("_play_position_draw", &AnimationTrackEdit::_play_position_draw);
- ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::REAL, "position"), PropertyInfo(Variant::BOOL, "drag")));
+ ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag")));
ADD_SIGNAL(MethodInfo("remove_request", PropertyInfo(Variant::INT, "track")));
ADD_SIGNAL(MethodInfo("dropped", PropertyInfo(Variant::INT, "from_track"), PropertyInfo(Variant::INT, "to_track")));
- ADD_SIGNAL(MethodInfo("insert_key", PropertyInfo(Variant::REAL, "ofs")));
+ ADD_SIGNAL(MethodInfo("insert_key", PropertyInfo(Variant::FLOAT, "ofs")));
ADD_SIGNAL(MethodInfo("select_key", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::BOOL, "single")));
ADD_SIGNAL(MethodInfo("deselect_key", PropertyInfo(Variant::INT, "index")));
ADD_SIGNAL(MethodInfo("bezier_edit"));
ADD_SIGNAL(MethodInfo("move_selection_begin"));
- ADD_SIGNAL(MethodInfo("move_selection", PropertyInfo(Variant::REAL, "ofs")));
+ ADD_SIGNAL(MethodInfo("move_selection", PropertyInfo(Variant::FLOAT, "ofs")));
ADD_SIGNAL(MethodInfo("move_selection_commit"));
ADD_SIGNAL(MethodInfo("move_selection_cancel"));
@@ -3092,11 +2964,12 @@ void AnimationTrackEdit::_bind_methods() {
}
AnimationTrackEdit::AnimationTrackEdit() {
- undo_redo = NULL;
- timeline = NULL;
- root = NULL;
- path = NULL;
- menu = NULL;
+ undo_redo = nullptr;
+ timeline = nullptr;
+ root = nullptr;
+ path = nullptr;
+ path_popup = nullptr;
+ menu = nullptr;
clicking_on_name = false;
dropping_at = 0;
@@ -3111,7 +2984,7 @@ AnimationTrackEdit::AnimationTrackEdit() {
play_position->set_mouse_filter(MOUSE_FILTER_PASS);
add_child(play_position);
play_position->set_anchors_and_margins_preset(PRESET_WIDE);
- play_position->connect("draw", this, "_play_position_draw");
+ play_position->connect("draw", callable_mp(this, &AnimationTrackEdit::_play_position_draw));
set_focus_mode(FOCUS_CLICK);
set_mouse_filter(MOUSE_FILTER_PASS); //scroll has to work too for selection
}
@@ -3138,44 +3011,42 @@ AnimationTrackEdit *AnimationTrackEditPlugin::create_value_track_edit(Object *p_
&args[5]
};
- Variant::CallError ce;
+ Callable::CallError ce;
return Object::cast_to<AnimationTrackEdit>(get_script_instance()->call("create_value_track_edit", (const Variant **)&argptrs, 6, ce).operator Object *());
}
- return NULL;
+ return nullptr;
}
AnimationTrackEdit *AnimationTrackEditPlugin::create_audio_track_edit() {
-
if (get_script_instance()) {
return Object::cast_to<AnimationTrackEdit>(get_script_instance()->call("create_audio_track_edit").operator Object *());
}
- return NULL;
+ return nullptr;
}
AnimationTrackEdit *AnimationTrackEditPlugin::create_animation_track_edit(Object *p_object) {
if (get_script_instance()) {
return Object::cast_to<AnimationTrackEdit>(get_script_instance()->call("create_animation_track_edit", p_object).operator Object *());
}
- return NULL;
+ return nullptr;
}
///////////////////////////////////////
void AnimationTrackEditGroup::_notification(int p_what) {
-
if (p_what == NOTIFICATION_DRAW) {
- Ref<Font> font = get_font("font", "Label");
- int separation = get_constant("hseparation", "ItemList");
- Color color = get_color("font_color", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
+ int separation = get_theme_constant("hseparation", "ItemList");
+ Color color = get_theme_color("font_color", "Label");
if (root && root->has_node(node)) {
Node *n = root->get_node(node);
if (n && EditorNode::get_singleton()->get_editor_selection()->is_selected(n)) {
- color = get_color("accent_color", "Editor");
+ color = get_theme_color("accent_color", "Editor");
}
}
- Color bgcol = get_color("dark_color_2", "Editor");
+ Color bgcol = get_theme_color("dark_color_2", "Editor");
bgcol.a *= 0.6;
draw_rect(Rect2(Point2(), get_size()), bgcol);
Color linecolor = color;
@@ -3193,13 +3064,13 @@ void AnimationTrackEditGroup::_notification(int p_what) {
int px = (-timeline->get_value() + timeline->get_play_position()) * timeline->get_zoom_scale() + timeline->get_name_limit();
if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_line(Point2(px, 0), Point2(px, get_size().height), accent, Math::round(2 * EDSCALE));
}
}
}
-void AnimationTrackEditGroup::set_type_and_name(const Ref<Texture> &p_type, const String &p_name, const NodePath &p_node) {
+void AnimationTrackEditGroup::set_type_and_name(const Ref<Texture2D> &p_type, const String &p_name, const NodePath &p_node) {
icon = p_type;
node_name = p_name;
node = p_node;
@@ -3208,17 +3079,16 @@ void AnimationTrackEditGroup::set_type_and_name(const Ref<Texture> &p_type, cons
}
Size2 AnimationTrackEditGroup::get_minimum_size() const {
-
- Ref<Font> font = get_font("font", "Label");
- int separation = get_constant("vseparation", "ItemList");
+ Ref<Font> font = get_theme_font("font", "Label");
+ int separation = get_theme_constant("vseparation", "ItemList");
return Vector2(0, MAX(font->get_height(), icon->get_height()) + separation);
}
void AnimationTrackEditGroup::set_timeline(AnimationTimelineEdit *p_timeline) {
timeline = p_timeline;
- timeline->connect("zoom_changed", this, "_zoom_changed");
- timeline->connect("name_limit_changed", this, "_zoom_changed");
+ timeline->connect("zoom_changed", callable_mp(this, &AnimationTrackEditGroup::_zoom_changed));
+ timeline->connect("name_limit_changed", callable_mp(this, &AnimationTrackEditGroup::_zoom_changed));
}
void AnimationTrackEditGroup::set_root(Node *p_root) {
@@ -3231,7 +3101,6 @@ void AnimationTrackEditGroup::_zoom_changed() {
}
void AnimationTrackEditGroup::_bind_methods() {
- ClassDB::bind_method("_zoom_changed", &AnimationTrackEditGroup::_zoom_changed);
}
AnimationTrackEditGroup::AnimationTrackEditGroup() {
@@ -3241,24 +3110,22 @@ AnimationTrackEditGroup::AnimationTrackEditGroup() {
//////////////////////////////////////
void AnimationTrackEditor::add_track_edit_plugin(const Ref<AnimationTrackEditPlugin> &p_plugin) {
-
- if (track_edit_plugins.find(p_plugin) != -1)
+ if (track_edit_plugins.find(p_plugin) != -1) {
return;
+ }
track_edit_plugins.push_back(p_plugin);
}
void AnimationTrackEditor::remove_track_edit_plugin(const Ref<AnimationTrackEditPlugin> &p_plugin) {
-
track_edit_plugins.erase(p_plugin);
}
void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim) {
-
if (animation != p_anim && _get_track_selected() >= 0) {
track_edits[_get_track_selected()]->release_focus();
}
if (animation.is_valid()) {
- animation->disconnect("changed", this, "_animation_changed");
+ animation->disconnect("changed", callable_mp(this, &AnimationTrackEditor::_animation_changed));
_clear_selection();
}
animation = p_anim;
@@ -3268,7 +3135,7 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim) {
_update_tracks();
if (animation.is_valid()) {
- animation->connect("changed", this, "_animation_changed");
+ animation->connect("changed", callable_mp(this, &AnimationTrackEditor::_animation_changed));
hscroll->show();
edit->set_disabled(false);
@@ -3301,47 +3168,47 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim) {
}
Ref<Animation> AnimationTrackEditor::get_current_animation() const {
-
return animation;
}
void AnimationTrackEditor::_root_removed(Node *p_root) {
- root = NULL;
+ root = nullptr;
}
void AnimationTrackEditor::set_root(Node *p_root) {
if (root) {
- root->disconnect("tree_exiting", this, "_root_removed");
+ root->disconnect("tree_exiting", callable_mp(this, &AnimationTrackEditor::_root_removed));
}
root = p_root;
if (root) {
- root->connect("tree_exiting", this, "_root_removed", make_binds(), CONNECT_ONESHOT);
+ root->connect("tree_exiting", callable_mp(this, &AnimationTrackEditor::_root_removed), make_binds(), CONNECT_ONESHOT);
}
_update_tracks();
}
Node *AnimationTrackEditor::get_root() const {
-
return root;
}
void AnimationTrackEditor::update_keying() {
bool keying_enabled = is_visible_in_tree() && animation.is_valid();
- if (keying_enabled == keying)
+ if (keying_enabled == keying) {
return;
+ }
keying = keying_enabled;
- //_update_menu();
+
emit_signal("keying_changed");
}
bool AnimationTrackEditor::has_keying() const {
return keying;
}
+
Dictionary AnimationTrackEditor::get_state() const {
Dictionary state;
state["fps_mode"] = timeline->is_using_fps();
@@ -3350,6 +3217,7 @@ Dictionary AnimationTrackEditor::get_state() const {
state["v_scroll"] = scroll->get_v_scrollbar()->get_value();
return state;
}
+
void AnimationTrackEditor::set_state(const Dictionary &p_state) {
if (p_state.has("fps_mode")) {
bool fps_mode = p_state["fps_mode"];
@@ -3385,22 +3253,18 @@ void AnimationTrackEditor::cleanup() {
}
void AnimationTrackEditor::_name_limit_changed() {
-
for (int i = 0; i < track_edits.size(); i++) {
track_edits[i]->update();
}
}
void AnimationTrackEditor::_timeline_changed(float p_new_pos, bool p_drag) {
-
emit_signal("timeline_changed", p_new_pos, p_drag);
}
void AnimationTrackEditor::_track_remove_request(int p_track) {
-
int idx = p_track;
if (idx >= 0 && idx < animation->get_track_count()) {
-
undo_redo->create_action(TTR("Remove Anim Track"));
undo_redo->add_do_method(this, "_clear_selection", false);
undo_redo->add_do_method(animation.ptr(), "remove_track", idx);
@@ -3409,7 +3273,6 @@ void AnimationTrackEditor::_track_remove_request(int p_track) {
// TODO interpolation.
for (int i = 0; i < animation->track_get_key_count(idx); i++) {
-
Variant v = animation->track_get_key_value(idx, i);
float time = animation->track_get_key_time(idx, i);
float trans = animation->track_get_key_transition(idx, i);
@@ -3428,14 +3291,13 @@ void AnimationTrackEditor::_track_remove_request(int p_track) {
}
void AnimationTrackEditor::_track_grab_focus(int p_track) {
-
// Don't steal focus if not working with the track editor.
- if (Object::cast_to<AnimationTrackEdit>(get_focus_owner()))
+ if (Object::cast_to<AnimationTrackEdit>(get_focus_owner())) {
track_edits[p_track]->grab_focus();
+ }
}
void AnimationTrackEditor::set_anim_pos(float p_pos) {
-
timeline->set_play_position(p_pos);
for (int i = 0; i < track_edits.size(); i++) {
track_edits[i]->set_play_position(p_pos);
@@ -3447,11 +3309,11 @@ void AnimationTrackEditor::set_anim_pos(float p_pos) {
}
void AnimationTrackEditor::_query_insert(const InsertData &p_id) {
-
if (insert_frame != Engine::get_singleton()->get_frames_drawn()) {
//clear insert list for the frame if frame changed
- if (insert_confirm->is_visible_in_tree())
+ if (insert_confirm->is_visible()) {
return; //do nothing
+ }
insert_data.clear();
insert_query = false;
}
@@ -3459,8 +3321,9 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) {
for (List<InsertData>::Element *E = insert_data.front(); E; E = E->next()) {
//prevent insertion of multiple tracks
- if (E->get().path == p_id.path)
+ if (E->get().path == p_id.path) {
return; //already inserted a track for this on this frame
+ }
}
insert_data.push_back(p_id);
@@ -3471,18 +3334,21 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) {
int num_tracks = 0;
bool all_bezier = true;
for (int i = 0; i < insert_data.size(); i++) {
- if (insert_data[i].type != Animation::TYPE_VALUE && insert_data[i].type != Animation::TYPE_BEZIER)
+ if (insert_data[i].type != Animation::TYPE_VALUE && insert_data[i].type != Animation::TYPE_BEZIER) {
all_bezier = false;
+ }
- if (insert_data[i].track_idx == -1)
+ if (insert_data[i].track_idx == -1) {
++num_tracks;
+ }
- if (insert_data[i].type != Animation::TYPE_VALUE)
+ if (insert_data[i].type != Animation::TYPE_VALUE) {
continue;
+ }
switch (insert_data[i].value.get_type()) {
case Variant::INT:
- case Variant::REAL:
+ case Variant::FLOAT:
case Variant::VECTOR2:
case Variant::VECTOR3:
case Variant::QUAT:
@@ -3496,14 +3362,15 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) {
}
}
- if (num_tracks == 1)
- insert_confirm_text->set_text(vformat(TTR("Create NEW track for %s and insert key?"), p_id.query));
- else
- insert_confirm_text->set_text(vformat(TTR("Create %d NEW tracks and insert keys?"), num_tracks));
+ if (num_tracks == 1) {
+ insert_confirm_text->set_text(vformat(TTR("Create new track for %s and insert key?"), p_id.query));
+ } else {
+ insert_confirm_text->set_text(vformat(TTR("Create %d new tracks and insert keys?"), num_tracks));
+ }
insert_confirm_bezier->set_visible(all_bezier);
insert_confirm->get_ok()->set_text(TTR("Create"));
- insert_confirm->popup_centered_minsize();
+ insert_confirm->popup_centered();
insert_query = true;
} else {
call_deferred("_insert_delay");
@@ -3519,7 +3386,6 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) {
}
void AnimationTrackEditor::_insert_delay() {
-
if (insert_query) {
//discard since it's entered into query mode
insert_queue = false;
@@ -3531,9 +3397,9 @@ void AnimationTrackEditor::_insert_delay() {
int last_track = animation->get_track_count();
bool advance = false;
while (insert_data.size()) {
-
- if (insert_data.front()->get().advance)
+ if (insert_data.front()->get().advance) {
advance = true;
+ }
last_track = _confirm_insert(insert_data.front()->get(), last_track);
insert_data.pop_front();
}
@@ -3542,43 +3408,48 @@ void AnimationTrackEditor::_insert_delay() {
if (advance) {
float step = animation->get_step();
- if (step == 0)
+ if (step == 0) {
step = 1;
+ }
float pos = timeline->get_play_position();
pos = Math::stepify(pos + step, step);
- if (pos > animation->get_length())
+ if (pos > animation->get_length()) {
pos = animation->get_length();
+ }
set_anim_pos(pos);
emit_signal("timeline_changed", pos, true);
}
insert_queue = false;
}
-void AnimationTrackEditor::insert_transform_key(Spatial *p_node, const String &p_sub, const Transform &p_xform) {
-
- if (!keying)
+void AnimationTrackEditor::insert_transform_key(Node3D *p_node, const String &p_sub, const Transform &p_xform) {
+ if (!keying) {
return;
- if (!animation.is_valid())
+ }
+ if (!animation.is_valid()) {
return;
+ }
ERR_FAIL_COND(!root);
//let's build a node path
String path = root->get_path_to(p_node);
- if (p_sub != "")
+ if (p_sub != "") {
path += ":" + p_sub;
+ }
NodePath np = path;
int track_idx = -1;
for (int i = 0; i < animation->get_track_count(); i++) {
-
- if (animation->track_get_type(i) != Animation::TYPE_TRANSFORM)
+ if (animation->track_get_type(i) != Animation::TYPE_TRANSFORM) {
continue;
- if (animation->track_get_path(i) != np)
+ }
+ if (animation->track_get_path(i) != np) {
continue;
+ }
track_idx = i;
break;
@@ -3600,12 +3471,10 @@ void AnimationTrackEditor::insert_transform_key(Spatial *p_node, const String &p
}
void AnimationTrackEditor::_insert_animation_key(NodePath p_path, const Variant &p_value) {
-
String path = p_path;
//animation property is a special case, always creates an animation track
for (int i = 0; i < animation->get_track_count(); i++) {
-
String np = animation->track_get_path(i);
if (path == np && animation->track_get_type(i) == Animation::TYPE_ANIMATION) {
@@ -3635,7 +3504,6 @@ void AnimationTrackEditor::_insert_animation_key(NodePath p_path, const Variant
}
void AnimationTrackEditor::insert_node_value_key(Node *p_node, const String &p_property, const Variant &p_value, bool p_only_if_exists) {
-
ERR_FAIL_COND(!root);
//let's build a node path
@@ -3654,7 +3522,6 @@ void AnimationTrackEditor::insert_node_value_key(Node *p_node, const String &p_p
EditorHistory *history = EditorNode::get_singleton()->get_editor_history();
for (int i = 1; i < history->get_path_size(); i++) {
-
String prop = history->get_path_property(i);
ERR_FAIL_COND(prop == "");
path += ":" + prop;
@@ -3669,10 +3536,10 @@ void AnimationTrackEditor::insert_node_value_key(Node *p_node, const String &p_p
bool inserted = false;
for (int i = 0; i < animation->get_track_count(); i++) {
-
if (animation->track_get_type(i) == Animation::TYPE_VALUE) {
- if (animation->track_get_path(i) != np)
+ if (animation->track_get_path(i) != np) {
continue;
+ }
InsertData id;
id.path = np;
@@ -3685,22 +3552,23 @@ void AnimationTrackEditor::insert_node_value_key(Node *p_node, const String &p_p
_query_insert(id);
inserted = true;
} else if (animation->track_get_type(i) == Animation::TYPE_BEZIER) {
-
Variant value;
String track_path = animation->track_get_path(i);
if (track_path == np) {
value = p_value; //all good
} else {
- int sep = track_path.find_last(":");
+ int sep = track_path.rfind(":");
if (sep != -1) {
String base_path = track_path.substr(0, sep);
if (base_path == np) {
String value_name = track_path.substr(sep + 1);
value = p_value.get(value_name);
- } else
+ } else {
continue;
- } else
+ }
+ } else {
continue;
+ }
}
InsertData id;
@@ -3716,8 +3584,9 @@ void AnimationTrackEditor::insert_node_value_key(Node *p_node, const String &p_p
}
}
- if (inserted || p_only_if_exists)
+ if (inserted || p_only_if_exists) {
return;
+ }
InsertData id;
id.path = np;
id.track_idx = -1;
@@ -3730,7 +3599,6 @@ void AnimationTrackEditor::insert_node_value_key(Node *p_node, const String &p_p
}
void AnimationTrackEditor::insert_value_key(const String &p_property, const Variant &p_value, bool p_advance) {
-
EditorHistory *history = EditorNode::get_singleton()->get_editor_history();
ERR_FAIL_COND(!root);
@@ -3753,7 +3621,6 @@ void AnimationTrackEditor::insert_value_key(const String &p_property, const Vari
}
for (int i = 1; i < history->get_path_size(); i++) {
-
String prop = history->get_path_property(i);
ERR_FAIL_COND(prop == "");
path += ":" + prop;
@@ -3768,10 +3635,10 @@ void AnimationTrackEditor::insert_value_key(const String &p_property, const Vari
bool inserted = false;
for (int i = 0; i < animation->get_track_count(); i++) {
-
if (animation->track_get_type(i) == Animation::TYPE_VALUE) {
- if (animation->track_get_path(i) != np)
+ if (animation->track_get_path(i) != np) {
continue;
+ }
InsertData id;
id.path = np;
@@ -3784,13 +3651,12 @@ void AnimationTrackEditor::insert_value_key(const String &p_property, const Vari
_query_insert(id);
inserted = true;
} else if (animation->track_get_type(i) == Animation::TYPE_BEZIER) {
-
Variant value;
if (animation->track_get_path(i) == np) {
value = p_value; //all good
} else {
String tpath = animation->track_get_path(i);
- int index = tpath.find_last(":");
+ int index = tpath.rfind(":");
if (NodePath(tpath.substr(0, index + 1)) == np) {
String subindex = tpath.substr(index + 1, tpath.length() - index);
value = p_value.get(subindex);
@@ -3826,12 +3692,10 @@ void AnimationTrackEditor::insert_value_key(const String &p_property, const Vari
}
void AnimationTrackEditor::_confirm_insert_list() {
-
undo_redo->create_action(TTR("Anim Create & Insert"));
int last_track = animation->get_track_count();
while (insert_data.size()) {
-
last_track = _confirm_insert(insert_data.front()->get(), last_track, insert_confirm_bezier->is_pressed());
insert_data.pop_front();
}
@@ -3840,7 +3704,6 @@ void AnimationTrackEditor::_confirm_insert_list() {
}
PropertyInfo AnimationTrackEditor::_find_hint_for_track(int p_idx, NodePath &r_base_path, Variant *r_current_val) {
-
r_base_path = NodePath();
ERR_FAIL_COND_V(!animation.is_valid(), PropertyInfo());
ERR_FAIL_INDEX_V(p_idx, animation->get_track_count(), PropertyInfo());
@@ -3895,7 +3758,6 @@ PropertyInfo AnimationTrackEditor::_find_hint_for_track(int p_idx, NodePath &r_b
property_info_base.get_property_list(&pinfo);
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
if (E->get().name == leftover_path[leftover_path.size() - 1]) {
return E->get();
}
@@ -3904,7 +3766,7 @@ PropertyInfo AnimationTrackEditor::_find_hint_for_track(int p_idx, NodePath &r_b
return PropertyInfo();
}
-static Vector<String> _get_bezier_subindices_for_type(Variant::Type p_type, bool *r_valid = NULL) {
+static Vector<String> _get_bezier_subindices_for_type(Variant::Type p_type, bool *r_valid = nullptr) {
Vector<String> subindices;
if (r_valid) {
*r_valid = true;
@@ -3913,7 +3775,7 @@ static Vector<String> _get_bezier_subindices_for_type(Variant::Type p_type, bool
case Variant::INT: {
subindices.push_back("");
} break;
- case Variant::REAL: {
+ case Variant::FLOAT: {
subindices.push_back("");
} break;
case Variant::VECTOR2: {
@@ -3954,13 +3816,12 @@ static Vector<String> _get_bezier_subindices_for_type(Variant::Type p_type, bool
}
int AnimationTrackEditor::_confirm_insert(InsertData p_id, int p_last_track, bool p_create_beziers) {
-
- if (p_last_track == -1)
+ if (p_last_track == -1) {
p_last_track = animation->get_track_count();
+ }
bool created = false;
if (p_id.track_idx < 0) {
-
if (p_create_beziers) {
bool valid;
Vector<String> subindices = _get_bezier_subindices_for_type(p_id.value.get_type(), &valid);
@@ -3991,7 +3852,7 @@ int AnimationTrackEditor::_confirm_insert(InsertData p_id, int p_last_track, boo
PropertyInfo h = _find_hint_for_track(animation->get_track_count() - 1, np);
animation->remove_track(animation->get_track_count() - 1); //hack
- if (h.type == Variant::REAL ||
+ if (h.type == Variant::FLOAT ||
h.type == Variant::VECTOR2 ||
h.type == Variant::RECT2 ||
h.type == Variant::VECTOR3 ||
@@ -4001,7 +3862,6 @@ int AnimationTrackEditor::_confirm_insert(InsertData p_id, int p_last_track, boo
h.type == Variant::PLANE ||
h.type == Variant::TRANSFORM2D ||
h.type == Variant::TRANSFORM) {
-
update_mode = Animation::UPDATE_CONTINUOUS;
}
@@ -4015,8 +3875,9 @@ int AnimationTrackEditor::_confirm_insert(InsertData p_id, int p_last_track, boo
undo_redo->add_do_method(animation.ptr(), "add_track", p_id.type);
undo_redo->add_do_method(animation.ptr(), "track_set_path", p_id.track_idx, p_id.path);
- if (p_id.type == Animation::TYPE_VALUE)
+ if (p_id.type == Animation::TYPE_VALUE) {
undo_redo->add_do_method(animation.ptr(), "value_track_set_update_mode", p_id.track_idx, update_mode);
+ }
} else {
undo_redo->create_action(TTR("Anim Insert Key"));
@@ -4026,14 +3887,11 @@ int AnimationTrackEditor::_confirm_insert(InsertData p_id, int p_last_track, boo
Variant value;
switch (p_id.type) {
-
case Animation::TYPE_VALUE: {
-
value = p_id.value;
} break;
case Animation::TYPE_TRANSFORM: {
-
Transform tr = p_id.value;
Dictionary d;
d["location"] = tr.origin;
@@ -4062,13 +3920,11 @@ int AnimationTrackEditor::_confirm_insert(InsertData p_id, int p_last_track, boo
undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_id.track_idx, time, value);
if (created) {
-
// Just remove the track.
undo_redo->add_undo_method(this, "_clear_selection", false);
undo_redo->add_undo_method(animation.ptr(), "remove_track", animation->get_track_count());
p_last_track++;
} else {
-
undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_position", p_id.track_idx, time);
int existing = animation->track_find_key(p_id.track_idx, time, true);
if (existing != -1) {
@@ -4084,12 +3940,10 @@ int AnimationTrackEditor::_confirm_insert(InsertData p_id, int p_last_track, boo
}
void AnimationTrackEditor::show_select_node_warning(bool p_show) {
-
info_message->set_visible(p_show);
}
bool AnimationTrackEditor::is_key_selected(int p_track, int p_key) const {
-
SelectedKey sk;
sk.key = p_key;
sk.track = p_track;
@@ -4106,7 +3960,6 @@ bool AnimationTrackEditor::is_snap_enabled() const {
}
void AnimationTrackEditor::_update_tracks() {
-
int selected = _get_track_selected();
while (track_vbox->get_child_count()) {
@@ -4116,8 +3969,9 @@ void AnimationTrackEditor::_update_tracks() {
track_edits.clear();
groups.clear();
- if (animation.is_null())
+ if (animation.is_null()) {
return;
+ }
Map<String, VBoxContainer *> group_sort;
@@ -4125,7 +3979,7 @@ void AnimationTrackEditor::_update_tracks() {
bool use_filter = selected_filter->is_pressed();
for (int i = 0; i < animation->get_track_count(); i++) {
- AnimationTrackEdit *track_edit = NULL;
+ AnimationTrackEdit *track_edit = nullptr;
//find hint and info for plugin
@@ -4144,7 +3998,6 @@ void AnimationTrackEditor::_update_tracks() {
}
if (animation->track_get_type(i) == Animation::TYPE_VALUE) {
-
NodePath path = animation->track_get_path(i);
if (root && root->has_node_and_resource(path)) {
@@ -4174,7 +4027,6 @@ void AnimationTrackEditor::_update_tracks() {
}
}
if (animation->track_get_type(i) == Animation::TYPE_AUDIO) {
-
for (int j = 0; j < track_edit_plugins.size(); j++) {
track_edit = track_edit_plugins.write[j]->create_audio_track_edit();
if (track_edit) {
@@ -4186,7 +4038,7 @@ void AnimationTrackEditor::_update_tracks() {
if (animation->track_get_type(i) == Animation::TYPE_ANIMATION) {
NodePath path = animation->track_get_path(i);
- Node *node = NULL;
+ Node *node = nullptr;
if (root && root->has_node(path)) {
node = root->get_node(path);
}
@@ -4201,7 +4053,7 @@ void AnimationTrackEditor::_update_tracks() {
}
}
- if (track_edit == NULL) {
+ if (track_edit == nullptr) {
//no valid plugin_found
track_edit = memnew(AnimationTrackEdit);
}
@@ -4214,7 +4066,7 @@ void AnimationTrackEditor::_update_tracks() {
if (!group_sort.has(base_path)) {
AnimationTrackEditGroup *g = memnew(AnimationTrackEditGroup);
- Ref<Texture> icon = get_icon("Node", "EditorIcons");
+ Ref<Texture2D> icon = get_theme_icon("Node", "EditorIcons");
String name = base_path;
String tooltip;
if (root && root->has_node(base_path)) {
@@ -4232,7 +4084,7 @@ void AnimationTrackEditor::_update_tracks() {
g->set_timeline(timeline);
groups.push_back(g);
VBoxContainer *vb = memnew(VBoxContainer);
- vb->add_constant_override("separation", 0);
+ vb->add_theme_constant_override("separation", 0);
vb->add_child(g);
track_vbox->add_child(vb);
group_sort[base_path] = vb;
@@ -4257,26 +4109,25 @@ void AnimationTrackEditor::_update_tracks() {
track_edit->grab_focus();
}
- track_edit->connect("timeline_changed", this, "_timeline_changed");
- track_edit->connect("remove_request", this, "_track_remove_request", varray(), CONNECT_DEFERRED);
- track_edit->connect("dropped", this, "_dropped_track", varray(), CONNECT_DEFERRED);
- track_edit->connect("insert_key", this, "_insert_key_from_track", varray(i), CONNECT_DEFERRED);
- track_edit->connect("select_key", this, "_key_selected", varray(i), CONNECT_DEFERRED);
- track_edit->connect("deselect_key", this, "_key_deselected", varray(i), CONNECT_DEFERRED);
- track_edit->connect("bezier_edit", this, "_bezier_edit", varray(i), CONNECT_DEFERRED);
- track_edit->connect("move_selection_begin", this, "_move_selection_begin");
- track_edit->connect("move_selection", this, "_move_selection");
- track_edit->connect("move_selection_commit", this, "_move_selection_commit");
- track_edit->connect("move_selection_cancel", this, "_move_selection_cancel");
+ track_edit->connect("timeline_changed", callable_mp(this, &AnimationTrackEditor::_timeline_changed));
+ track_edit->connect("remove_request", callable_mp(this, &AnimationTrackEditor::_track_remove_request), varray(), CONNECT_DEFERRED);
+ track_edit->connect("dropped", callable_mp(this, &AnimationTrackEditor::_dropped_track), varray(), CONNECT_DEFERRED);
+ track_edit->connect("insert_key", callable_mp(this, &AnimationTrackEditor::_insert_key_from_track), varray(i), CONNECT_DEFERRED);
+ track_edit->connect("select_key", callable_mp(this, &AnimationTrackEditor::_key_selected), varray(i), CONNECT_DEFERRED);
+ track_edit->connect("deselect_key", callable_mp(this, &AnimationTrackEditor::_key_deselected), varray(i), CONNECT_DEFERRED);
+ track_edit->connect("bezier_edit", callable_mp(this, &AnimationTrackEditor::_bezier_edit), varray(i), CONNECT_DEFERRED);
+ track_edit->connect("move_selection_begin", callable_mp(this, &AnimationTrackEditor::_move_selection_begin));
+ track_edit->connect("move_selection", callable_mp(this, &AnimationTrackEditor::_move_selection));
+ track_edit->connect("move_selection_commit", callable_mp(this, &AnimationTrackEditor::_move_selection_commit));
+ track_edit->connect("move_selection_cancel", callable_mp(this, &AnimationTrackEditor::_move_selection_cancel));
- track_edit->connect("duplicate_request", this, "_edit_menu_pressed", varray(EDIT_DUPLICATE_SELECTION), CONNECT_DEFERRED);
- track_edit->connect("duplicate_transpose_request", this, "_edit_menu_pressed", varray(EDIT_DUPLICATE_TRANSPOSED), CONNECT_DEFERRED);
- track_edit->connect("delete_request", this, "_edit_menu_pressed", varray(EDIT_DELETE_SELECTION), CONNECT_DEFERRED);
+ track_edit->connect("duplicate_request", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_DUPLICATE_SELECTION), CONNECT_DEFERRED);
+ track_edit->connect("duplicate_transpose_request", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_DUPLICATE_TRANSPOSED), CONNECT_DEFERRED);
+ track_edit->connect("delete_request", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_DELETE_SELECTION), CONNECT_DEFERRED);
}
}
void AnimationTrackEditor::_animation_changed() {
-
if (animation_changing_awaiting_update) {
return; //all will be updated, don't bother with anything
}
@@ -4284,10 +4135,11 @@ void AnimationTrackEditor::_animation_changed() {
if (key_edit && key_edit->setting) {
//if editing a key, just update the edited track, makes refresh less costly
if (key_edit->track < track_edits.size()) {
- if (animation->track_get_type(key_edit->track) == Animation::TYPE_BEZIER)
+ if (animation->track_get_type(key_edit->track) == Animation::TYPE_BEZIER) {
bezier_edit->update();
- else
+ } else {
track_edits[key_edit->track]->update();
+ }
}
return;
}
@@ -4297,7 +4149,6 @@ void AnimationTrackEditor::_animation_changed() {
}
void AnimationTrackEditor::_snap_mode_changed(int p_mode) {
-
timeline->set_use_fps(p_mode == 1);
if (key_edit) {
key_edit->set_use_fps(p_mode == 1);
@@ -4324,8 +4175,8 @@ void AnimationTrackEditor::_update_step_spinbox() {
step->set_block_signals(false);
}
-void AnimationTrackEditor::_animation_update() {
+void AnimationTrackEditor::_animation_update() {
timeline->update();
timeline->update_values();
@@ -4375,16 +4226,16 @@ MenuButton *AnimationTrackEditor::get_edit_menu() {
void AnimationTrackEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) {
- zoom_icon->set_texture(get_icon("Zoom", "EditorIcons"));
- snap->set_icon(get_icon("Snap", "EditorIcons"));
- view_group->set_icon(get_icon(view_group->is_pressed() ? "AnimationTrackList" : "AnimationTrackGroup", "EditorIcons"));
- selected_filter->set_icon(get_icon("AnimationFilter", "EditorIcons"));
- imported_anim_warning->set_icon(get_icon("NodeWarning", "EditorIcons"));
- main_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
+ zoom_icon->set_texture(get_theme_icon("Zoom", "EditorIcons"));
+ snap->set_icon(get_theme_icon("Snap", "EditorIcons"));
+ view_group->set_icon(get_theme_icon(view_group->is_pressed() ? "AnimationTrackList" : "AnimationTrackGroup", "EditorIcons"));
+ selected_filter->set_icon(get_theme_icon("AnimationFilter", "EditorIcons"));
+ imported_anim_warning->set_icon(get_theme_icon("NodeWarning", "EditorIcons"));
+ main_panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
}
if (p_what == NOTIFICATION_READY) {
- EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", this, "_selection_changed");
+ EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &AnimationTrackEditor::_selection_changed));
}
if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
@@ -4404,7 +4255,6 @@ void AnimationTrackEditor::_update_scroll(double) {
}
void AnimationTrackEditor::_update_step(double p_new_step) {
-
undo_redo->create_action(TTR("Change Animation Step"));
float step_value = p_new_step;
if (timeline->is_using_fps()) {
@@ -4421,7 +4271,6 @@ void AnimationTrackEditor::_update_step(double p_new_step) {
}
void AnimationTrackEditor::_update_length(double p_new_len) {
-
emit_signal("animation_len_changed", p_new_len);
}
@@ -4442,14 +4291,13 @@ void AnimationTrackEditor::_dropped_track(int p_from_track, int p_to_track) {
}
void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) {
-
ERR_FAIL_COND(!root);
Node *node = get_node(p_path);
ERR_FAIL_COND(!node);
NodePath path_to = root->get_path_to(node);
- if (adding_track_type == Animation::TYPE_TRANSFORM && !node->is_class("Spatial")) {
- EditorNode::get_singleton()->show_warning(TTR("Transform tracks only apply to Spatial-based nodes."));
+ if (adding_track_type == Animation::TYPE_TRANSFORM && !node->is_class("Node3D")) {
+ EditorNode::get_singleton()->show_warning(TTR("Transform tracks only apply to 3D-based nodes."));
return;
}
@@ -4461,7 +4309,6 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) {
} break;
case Animation::TYPE_TRANSFORM:
case Animation::TYPE_METHOD: {
-
undo_redo->create_action(TTR("Add Track"));
undo_redo->add_do_method(animation.ptr(), "add_track", adding_track_type);
undo_redo->add_do_method(animation.ptr(), "track_set_path", animation->get_track_count(), path_to);
@@ -4470,10 +4317,9 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) {
} break;
case Animation::TYPE_BEZIER: {
-
Vector<Variant::Type> filter;
filter.push_back(Variant::INT);
- filter.push_back(Variant::REAL);
+ filter.push_back(Variant::FLOAT);
filter.push_back(Variant::VECTOR2);
filter.push_back(Variant::VECTOR3);
filter.push_back(Variant::QUAT);
@@ -4485,7 +4331,6 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) {
prop_selector->select_property_from_instance(node);
} break;
case Animation::TYPE_AUDIO: {
-
if (!node->is_class("AudioStreamPlayer") && !node->is_class("AudioStreamPlayer2D") && !node->is_class("AudioStreamPlayer3D")) {
EditorNode::get_singleton()->show_warning(TTR("Audio tracks can only point to nodes of type:\n-AudioStreamPlayer\n-AudioStreamPlayer2D\n-AudioStreamPlayer3D"));
return;
@@ -4499,7 +4344,6 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) {
} break;
case Animation::TYPE_ANIMATION: {
-
if (!node->is_class("AnimationPlayer")) {
EditorNode::get_singleton()->show_warning(TTR("Animation tracks can only point to AnimationPlayer nodes."));
return;
@@ -4526,15 +4370,13 @@ void AnimationTrackEditor::_add_track(int p_type) {
return;
}
adding_track_type = p_type;
- pick_track->popup_centered_ratio();
+ pick_track->popup_scenetree_dialog();
}
void AnimationTrackEditor::_new_track_property_selected(String p_name) {
-
String full_path = String(adding_track_path) + ":" + p_name;
if (adding_track_type == Animation::TYPE_VALUE) {
-
Animation::UpdateMode update_mode = Animation::UPDATE_DISCRETE;
{
//hack
@@ -4543,7 +4385,7 @@ void AnimationTrackEditor::_new_track_property_selected(String p_name) {
animation->track_set_path(animation->get_track_count() - 1, full_path);
PropertyInfo h = _find_hint_for_track(animation->get_track_count() - 1, np);
animation->remove_track(animation->get_track_count() - 1); //hack
- if (h.type == Variant::REAL ||
+ if (h.type == Variant::FLOAT ||
h.type == Variant::VECTOR2 ||
h.type == Variant::RECT2 ||
h.type == Variant::VECTOR3 ||
@@ -4553,7 +4395,6 @@ void AnimationTrackEditor::_new_track_property_selected(String p_name) {
h.type == Variant::PLANE ||
h.type == Variant::TRANSFORM2D ||
h.type == Variant::TRANSFORM) {
-
update_mode = Animation::UPDATE_CONTINUOUS;
}
@@ -4597,7 +4438,6 @@ void AnimationTrackEditor::_new_track_property_selected(String p_name) {
}
void AnimationTrackEditor::_timeline_value_changed(double) {
-
timeline->update_play_position();
for (int i = 0; i < track_edits.size(); i++) {
@@ -4614,17 +4454,16 @@ void AnimationTrackEditor::_timeline_value_changed(double) {
}
int AnimationTrackEditor::_get_track_selected() {
-
for (int i = 0; i < track_edits.size(); i++) {
- if (track_edits[i]->has_focus())
+ if (track_edits[i]->has_focus()) {
return i;
+ }
}
return -1;
}
void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) {
-
ERR_FAIL_INDEX(p_track, animation->get_track_count());
if (snap->is_pressed() && step->get_value() != 0) {
@@ -4640,10 +4479,10 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) {
EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key."));
return;
}
- Spatial *base = Object::cast_to<Spatial>(root->get_node(animation->track_get_path(p_track)));
+ Node3D *base = Object::cast_to<Node3D>(root->get_node(animation->track_get_path(p_track)));
if (!base) {
- EditorNode::get_singleton()->show_warning(TTR("Track is not of type Spatial, can't insert key"));
+ EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key"));
return;
}
@@ -4660,7 +4499,6 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) {
} break;
case Animation::TYPE_VALUE: {
-
NodePath bp;
Variant value;
_find_hint_for_track(p_track, bp, &value);
@@ -4686,7 +4524,6 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) {
} break;
case Animation::TYPE_BEZIER: {
-
NodePath bp;
Variant value;
_find_hint_for_track(p_track, bp, &value);
@@ -4705,7 +4542,6 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) {
} break;
case Animation::TYPE_AUDIO: {
-
Dictionary ak;
ak["stream"] = RES();
ak["start_offset"] = 0;
@@ -4717,7 +4553,6 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) {
undo_redo->commit_action();
} break;
case Animation::TYPE_ANIMATION: {
-
StringName anim = "[stop]";
undo_redo->create_action(TTR("Add Track Key"));
@@ -4729,7 +4564,6 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) {
}
void AnimationTrackEditor::_add_method_key(const String &p_method) {
-
if (!root->has_node(animation->track_get_path(insert_key_from_track_call_track))) {
EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a method key."));
return;
@@ -4741,20 +4575,18 @@ void AnimationTrackEditor::_add_method_key(const String &p_method) {
for (List<MethodInfo>::Element *E = minfo.front(); E; E = E->next()) {
if (E->get().name == p_method) {
-
Dictionary d;
d["method"] = p_method;
Array params;
int first_defarg = E->get().arguments.size() - E->get().default_arguments.size();
for (int i = 0; i < E->get().arguments.size(); i++) {
-
if (i >= first_defarg) {
Variant arg = E->get().default_arguments[i - first_defarg];
params.push_back(arg);
} else {
- Variant::CallError ce;
- Variant arg = Variant::construct(E->get().arguments[i].type, NULL, 0, ce);
+ Callable::CallError ce;
+ Variant arg = Variant::construct(E->get().arguments[i].type, nullptr, 0, ce);
params.push_back(arg);
}
}
@@ -4773,7 +4605,6 @@ void AnimationTrackEditor::_add_method_key(const String &p_method) {
}
void AnimationTrackEditor::_key_selected(int p_key, bool p_single, int p_track) {
-
ERR_FAIL_INDEX(p_track, animation->get_track_count());
ERR_FAIL_INDEX(p_key, animation->track_get_key_count(p_track));
@@ -4797,7 +4628,6 @@ void AnimationTrackEditor::_key_selected(int p_key, bool p_single, int p_track)
}
void AnimationTrackEditor::_key_deselected(int p_key, int p_track) {
-
ERR_FAIL_INDEX(p_track, animation->get_track_count());
ERR_FAIL_INDEX(p_key, animation->track_get_key_count(p_track));
@@ -4828,7 +4658,6 @@ void AnimationTrackEditor::_move_selection(float p_offset) {
}
struct _AnimMoveRestore {
-
int track;
float time;
Variant key;
@@ -4840,26 +4669,25 @@ void AnimationTrackEditor::_clear_key_edit() {
if (key_edit) {
//if key edit is the object being inspected, remove it first
if (EditorNode::get_singleton()->get_inspector()->get_edited_object() == key_edit) {
- EditorNode::get_singleton()->push_item(NULL);
+ EditorNode::get_singleton()->push_item(nullptr);
}
//then actually delete it
memdelete(key_edit);
- key_edit = NULL;
+ key_edit = nullptr;
}
if (multi_key_edit) {
if (EditorNode::get_singleton()->get_inspector()->get_edited_object() == multi_key_edit) {
- EditorNode::get_singleton()->push_item(NULL);
+ EditorNode::get_singleton()->push_item(nullptr);
}
memdelete(multi_key_edit);
- multi_key_edit = NULL;
+ multi_key_edit = nullptr;
}
}
void AnimationTrackEditor::_clear_selection(bool p_update) {
-
selection.clear();
if (p_update) {
@@ -4872,13 +4700,12 @@ void AnimationTrackEditor::_clear_selection(bool p_update) {
}
void AnimationTrackEditor::_update_key_edit() {
-
_clear_key_edit();
- if (!animation.is_valid())
+ if (!animation.is_valid()) {
return;
+ }
if (selection.size() == 1) {
-
key_edit = memnew(AnimationTrackKeyEdit);
key_edit->animation = animation;
key_edit->track = selection.front()->key().track;
@@ -4895,18 +4722,17 @@ void AnimationTrackEditor::_update_key_edit() {
EditorNode::get_singleton()->push_item(key_edit);
} else if (selection.size() > 1) {
-
multi_key_edit = memnew(AnimationMultiTrackKeyEdit);
multi_key_edit->animation = animation;
- Map<int, List<float> > key_ofs_map;
+ Map<int, List<float>> key_ofs_map;
Map<int, NodePath> base_map;
int first_track = -1;
for (Map<SelectedKey, KeyInfo>::Element *E = selection.front(); E; E = E->next()) {
-
int track = E->key().track;
- if (first_track < 0)
+ if (first_track < 0) {
first_track = track;
+ }
if (!key_ofs_map.has(track)) {
key_ofs_map[track] = List<float>();
@@ -4930,17 +4756,17 @@ void AnimationTrackEditor::_update_key_edit() {
}
void AnimationTrackEditor::_clear_selection_for_anim(const Ref<Animation> &p_anim) {
-
- if (animation != p_anim)
+ if (animation != p_anim) {
return;
+ }
_clear_selection();
}
void AnimationTrackEditor::_select_at_anim(const Ref<Animation> &p_anim, int p_track, float p_pos) {
-
- if (animation != p_anim)
+ if (animation != p_anim) {
return;
+ }
int idx = animation->track_find_key(p_track, p_pos, true);
ERR_FAIL_COND(idx < 0);
@@ -4955,7 +4781,6 @@ void AnimationTrackEditor::_select_at_anim(const Ref<Animation> &p_anim, int p_t
}
void AnimationTrackEditor::_move_selection_commit() {
-
undo_redo->create_action(TTR("Anim Move Keys"));
List<_AnimMoveRestore> to_restore;
@@ -4963,21 +4788,21 @@ void AnimationTrackEditor::_move_selection_commit() {
float motion = moving_selection_offset;
// 1 - remove the keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->key().track, E->key().key);
}
// 2 - remove overlapped keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float newtime = snap_time(E->get().pos + motion);
int idx = animation->track_find_key(E->key().track, newtime, true);
- if (idx == -1)
+ if (idx == -1) {
continue;
+ }
SelectedKey sk;
sk.key = idx;
sk.track = E->key().track;
- if (selection.has(sk))
+ if (selection.has(sk)) {
continue; //already in selection, don't save
+ }
undo_redo->add_do_method(animation.ptr(), "track_remove_key_at_position", E->key().track, newtime);
_AnimMoveRestore amr;
@@ -4992,27 +4817,23 @@ void AnimationTrackEditor::_move_selection_commit() {
// 3 - move the keys (re insert them)
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float newpos = snap_time(E->get().pos + motion);
undo_redo->add_do_method(animation.ptr(), "track_insert_key", E->key().track, newpos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key));
}
// 4 - (undo) remove inserted keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float newpos = snap_time(E->get().pos + motion);
undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_position", E->key().track, newpos);
}
// 5 - (undo) reinsert keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->key().track, E->get().pos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key));
}
// 6 - (undo) reinsert overlapped keys
for (List<_AnimMoveRestore>::Element *E = to_restore.front(); E; E = E->next()) {
-
_AnimMoveRestore &amr = E->get();
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", amr.track, amr.time, amr.key, amr.transition);
}
@@ -5022,7 +4843,6 @@ void AnimationTrackEditor::_move_selection_commit() {
// 7 - reselect
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float oldpos = E->get().pos;
float newpos = snap_time(oldpos + motion);
@@ -5039,8 +4859,8 @@ void AnimationTrackEditor::_move_selection_commit() {
_update_key_edit();
}
-void AnimationTrackEditor::_move_selection_cancel() {
+void AnimationTrackEditor::_move_selection_cancel() {
moving_selection = false;
for (int i = 0; i < track_edits.size(); i++) {
track_edits[i]->update();
@@ -5050,29 +4870,26 @@ void AnimationTrackEditor::_move_selection_cancel() {
bool AnimationTrackEditor::is_moving_selection() const {
return moving_selection;
}
+
float AnimationTrackEditor::get_moving_selection_offset() const {
return moving_selection_offset;
}
void AnimationTrackEditor::_box_selection_draw() {
-
const Rect2 selection_rect = Rect2(Point2(), box_selection->get_size());
- box_selection->draw_rect(selection_rect, get_color("box_selection_fill_color", "Editor"));
- box_selection->draw_rect(selection_rect, get_color("box_selection_stroke_color", "Editor"), false, Math::round(EDSCALE));
+ box_selection->draw_rect(selection_rect, get_theme_color("box_selection_fill_color", "Editor"));
+ box_selection->draw_rect(selection_rect, get_theme_color("box_selection_stroke_color", "Editor"), false, Math::round(EDSCALE));
}
void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseButton> mb = p_event;
- if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_DOWN) {
-
+ if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_UP) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05);
scroll->accept_event();
}
- if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_UP) {
-
+ if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_DOWN) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05);
scroll->accept_event();
}
@@ -5083,11 +4900,9 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
box_selecting_from = scroll->get_global_transform().xform(mb->get_position());
box_select_rect = Rect2();
} else if (box_selecting) {
-
if (box_selection->is_visible_in_tree()) {
//only if moved
for (int i = 0; i < track_edits.size(); i++) {
-
Rect2 local_rect = box_select_rect;
local_rect.position -= track_edits[i]->get_global_position();
track_edits[i]->append_to_selection(local_rect, mb->get_command());
@@ -5108,12 +4923,10 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) {
-
timeline->set_value(timeline->get_value() - mm->get_relative().x / timeline->get_zoom_scale());
}
if (mm.is_valid() && box_selecting) {
-
if (!(mm->get_button_mask() & BUTTON_MASK_LEFT)) {
//no longer
box_selection->hide();
@@ -5160,7 +4973,6 @@ void AnimationTrackEditor::_cancel_bezier_edit() {
}
void AnimationTrackEditor::_bezier_edit(int p_for_track) {
-
_clear_selection(); //bezier probably wants to use a separate selection mode
bezier_edit->set_root(root);
bezier_edit->set_animation_and_track(animation, p_for_track);
@@ -5172,18 +4984,18 @@ void AnimationTrackEditor::_bezier_edit(int p_for_track) {
void AnimationTrackEditor::_anim_duplicate_keys(bool transpose) {
//duplicait!
if (selection.size() && animation.is_valid() && (!transpose || (_get_track_selected() >= 0 && _get_track_selected() < animation->get_track_count()))) {
-
int top_track = 0x7FFFFFFF;
float top_time = 1e10;
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
const SelectedKey &sk = E->key();
float t = animation->track_get_key_time(sk.track, sk.key);
- if (t < top_time)
+ if (t < top_time) {
top_time = t;
- if (sk.track < top_track)
+ }
+ if (sk.track < top_track) {
top_track = sk.track;
+ }
}
ERR_FAIL_COND(top_track == 0x7FFFFFFF || top_time == 1e10);
@@ -5193,10 +5005,9 @@ void AnimationTrackEditor::_anim_duplicate_keys(bool transpose) {
undo_redo->create_action(TTR("Anim Duplicate Keys"));
- List<Pair<int, float> > new_selection_values;
+ List<Pair<int, float>> new_selection_values;
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
const SelectedKey &sk = E->key();
float t = animation->track_get_key_time(sk.track, sk.key);
@@ -5204,11 +5015,13 @@ void AnimationTrackEditor::_anim_duplicate_keys(bool transpose) {
float dst_time = t + (timeline->get_play_position() - top_time);
int dst_track = sk.track + (start_track - top_track);
- if (dst_track < 0 || dst_track >= animation->get_track_count())
+ if (dst_track < 0 || dst_track >= animation->get_track_count()) {
continue;
+ }
- if (animation->track_get_type(dst_track) != animation->track_get_type(sk.track))
+ if (animation->track_get_type(dst_track) != animation->track_get_type(sk.track)) {
continue;
+ }
int existing_idx = animation->track_find_key(dst_track, dst_time, true);
@@ -5221,7 +5034,6 @@ void AnimationTrackEditor::_anim_duplicate_keys(bool transpose) {
new_selection_values.push_back(p);
if (existing_idx != -1) {
-
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", dst_track, dst_time, animation->track_get_key_value(dst_track, existing_idx), animation->track_get_key_transition(dst_track, existing_idx));
}
}
@@ -5231,15 +5043,15 @@ void AnimationTrackEditor::_anim_duplicate_keys(bool transpose) {
//reselect duplicated
Map<SelectedKey, KeyInfo> new_selection;
- for (List<Pair<int, float> >::Element *E = new_selection_values.front(); E; E = E->next()) {
-
+ for (List<Pair<int, float>>::Element *E = new_selection_values.front(); E; E = E->next()) {
int track = E->get().first;
float time = E->get().second;
int existing_idx = animation->track_find_key(track, time, true);
- if (existing_idx == -1)
+ if (existing_idx == -1) {
continue;
+ }
SelectedKey sk2;
sk2.track = track;
sk2.key = existing_idx;
@@ -5255,8 +5067,8 @@ void AnimationTrackEditor::_anim_duplicate_keys(bool transpose) {
_update_key_edit();
}
}
-void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
+void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
last_menu_track_opt = p_option;
switch (p_option) {
case EDIT_COPY_TRACKS: {
@@ -5264,19 +5076,18 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
TreeItem *troot = track_copy_select->create_item();
for (int i = 0; i < animation->get_track_count(); i++) {
-
NodePath path = animation->track_get_path(i);
- Node *node = NULL;
+ Node *node = nullptr;
if (root && root->has_node(path)) {
node = root->get_node(path);
}
String text;
- Ref<Texture> icon = get_icon("Node", "EditorIcons");
+ Ref<Texture2D> icon = get_theme_icon("Node", "EditorIcons");
if (node) {
- if (has_icon(node->get_class(), "EditorIcons")) {
- icon = get_icon(node->get_class(), "EditorIcons");
+ if (has_theme_icon(node->get_class(), "EditorIcons")) {
+ icon = get_theme_icon(node->get_class(), "EditorIcons");
}
text = node->get_name();
@@ -5296,10 +5107,18 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
}
switch (animation->track_get_type(i)) {
- case Animation::TYPE_TRANSFORM: text += " (Transform)"; break;
- case Animation::TYPE_METHOD: text += " (Methods)"; break;
- case Animation::TYPE_BEZIER: text += " (Bezier)"; break;
- case Animation::TYPE_AUDIO: text += " (Audio)"; break;
+ case Animation::TYPE_TRANSFORM:
+ text += " (Transform)";
+ break;
+ case Animation::TYPE_METHOD:
+ text += " (Methods)";
+ break;
+ case Animation::TYPE_BEZIER:
+ text += " (Bezier)";
+ break;
+ case Animation::TYPE_AUDIO:
+ text += " (Audio)";
+ break;
default: {
};
}
@@ -5316,14 +5135,12 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
it->set_metadata(0, md);
}
- track_copy_dialog->popup_centered_minsize(Size2(350, 500) * EDSCALE);
+ track_copy_dialog->popup_centered(Size2(350, 500) * EDSCALE);
} break;
case EDIT_COPY_TRACKS_CONFIRM: {
-
track_clipboard.clear();
TreeItem *root = track_copy_select->get_root();
if (root) {
-
TreeItem *it = root->get_children();
while (it) {
Dictionary md = it->get_metadata(0);
@@ -5353,7 +5170,6 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
}
} break;
case EDIT_PASTE_TRACKS: {
-
if (track_clipboard.size() == 0) {
EditorNode::get_singleton()->show_warning(TTR("Clipboard is empty"));
break;
@@ -5363,7 +5179,7 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
undo_redo->create_action(TTR("Paste Tracks"));
for (int i = 0; i < track_clipboard.size(); i++) {
undo_redo->add_do_method(animation.ptr(), "add_track", track_clipboard[i].track_type);
- Node *exists = NULL;
+ Node *exists = nullptr;
NodePath path = track_clipboard[i].base_path;
if (root) {
@@ -5399,8 +5215,9 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
scale_dialog->popup_centered(Size2(200, 100) * EDSCALE);
} break;
case EDIT_SCALE_CONFIRM: {
- if (selection.empty())
+ if (selection.empty()) {
return;
+ }
float from_t = 1e20;
float to_t = -1e20;
@@ -5409,10 +5226,12 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
for (Map<SelectedKey, KeyInfo>::Element *E = selection.front(); E; E = E->next()) {
float t = animation->track_get_key_time(E->key().track, E->key().key);
- if (t < from_t)
+ if (t < from_t) {
from_t = t;
- if (t > to_t)
+ }
+ if (t > to_t) {
to_t = t;
+ }
}
len = to_t - from_t;
@@ -5420,7 +5239,6 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
pivot = timeline->get_play_position();
} else {
-
pivot = from_t;
}
@@ -5435,21 +5253,21 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
// 1-remove the keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->key().track, E->key().key);
}
// 2- remove overlapped keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float newtime = (E->get().pos - from_t) * s + from_t;
int idx = animation->track_find_key(E->key().track, newtime, true);
- if (idx == -1)
+ if (idx == -1) {
continue;
+ }
SelectedKey sk;
sk.key = idx;
sk.track = E->key().track;
- if (selection.has(sk))
+ if (selection.has(sk)) {
continue; //already in selection, don't save
+ }
undo_redo->add_do_method(animation.ptr(), "track_remove_key_at_position", E->key().track, newtime);
_AnimMoveRestore amr;
@@ -5465,27 +5283,23 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
#define _NEW_POS(m_ofs) (((s > 0) ? m_ofs : from_t + (len - (m_ofs - from_t))) - pivot) * ABS(s) + from_t
// 3-move the keys (re insert them)
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float newpos = _NEW_POS(E->get().pos);
undo_redo->add_do_method(animation.ptr(), "track_insert_key", E->key().track, newpos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key));
}
// 4-(undo) remove inserted keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float newpos = _NEW_POS(E->get().pos);
undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_position", E->key().track, newpos);
}
// 5-(undo) reinsert keys
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->key().track, E->get().pos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key));
}
// 6-(undo) reinsert overlapped keys
for (List<_AnimMoveRestore>::Element *E = to_restore.front(); E; E = E->next()) {
-
_AnimMoveRestore &amr = E->get();
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", amr.track, amr.time, amr.key, amr.transition);
}
@@ -5495,18 +5309,17 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
// 7-reselect
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
float oldpos = E->get().pos;
float newpos = _NEW_POS(oldpos);
- if (newpos >= 0)
+ if (newpos >= 0) {
undo_redo->add_do_method(this, "_select_at_anim", animation, E->key().track, newpos);
+ }
undo_redo->add_undo_method(this, "_select_at_anim", animation, E->key().track, oldpos);
}
#undef _NEW_POS
undo_redo->commit_action();
} break;
case EDIT_DUPLICATE_SELECTION: {
-
if (bezier_edit->is_visible()) {
bezier_edit->duplicate_selection();
break;
@@ -5521,7 +5334,6 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
_anim_duplicate_keys(true);
} break;
case EDIT_DELETE_SELECTION: {
-
if (bezier_edit->is_visible()) {
bezier_edit->delete_selection();
break;
@@ -5531,7 +5343,6 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
undo_redo->create_action(TTR("Anim Delete Keys"));
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
-
undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->key().track, E->key().key);
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->key().track, E->get().pos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key));
}
@@ -5542,34 +5353,39 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
}
} break;
case EDIT_GOTO_NEXT_STEP: {
-
- if (animation.is_null())
+ if (animation.is_null()) {
break;
+ }
float step = animation->get_step();
- if (step == 0)
+ if (step == 0) {
step = 1;
+ }
float pos = timeline->get_play_position();
pos = Math::stepify(pos + step, step);
- if (pos > animation->get_length())
+ if (pos > animation->get_length()) {
pos = animation->get_length();
+ }
set_anim_pos(pos);
emit_signal("timeline_changed", pos, true);
} break;
case EDIT_GOTO_PREV_STEP: {
- if (animation.is_null())
+ if (animation.is_null()) {
break;
+ }
float step = animation->get_step();
- if (step == 0)
+ if (step == 0) {
step = 1;
+ }
float pos = timeline->get_play_position();
pos = Math::stepify(pos - step, step);
- if (pos < 0)
+ if (pos < 0) {
pos = 0;
+ }
set_anim_pos(pos);
emit_signal("timeline_changed", pos, true);
@@ -5585,7 +5401,7 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
} break;
case EDIT_CLEAN_UP_ANIMATION: {
- cleanup_dialog->popup_centered_minsize(Size2(300, 0) * EDSCALE);
+ cleanup_dialog->popup_centered(Size2(300, 0) * EDSCALE);
} break;
case EDIT_CLEAN_UP_ANIMATION_CONFIRM: {
@@ -5604,12 +5420,10 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
}
void AnimationTrackEditor::_cleanup_animation(Ref<Animation> p_animation) {
-
for (int i = 0; i < p_animation->get_track_count(); i++) {
-
bool prop_exists = false;
Variant::Type valid_type = Variant::NIL;
- Object *obj = NULL;
+ Object *obj = nullptr;
RES res;
Vector<StringName> leftover_path;
@@ -5627,17 +5441,16 @@ void AnimationTrackEditor::_cleanup_animation(Ref<Animation> p_animation) {
}
if (!obj && cleanup_tracks->is_pressed()) {
-
p_animation->remove_track(i);
i--;
continue;
}
- if (!prop_exists || p_animation->track_get_type(i) != Animation::TYPE_VALUE || !cleanup_keys->is_pressed())
+ if (!prop_exists || p_animation->track_get_type(i) != Animation::TYPE_VALUE || !cleanup_keys->is_pressed()) {
continue;
+ }
for (int j = 0; j < p_animation->track_get_key_count(i); j++) {
-
Variant v = p_animation->track_get_key_value(i, j);
if (!Variant::can_convert(v.get_type(), valid_type)) {
@@ -5657,13 +5470,11 @@ void AnimationTrackEditor::_cleanup_animation(Ref<Animation> p_animation) {
}
void AnimationTrackEditor::_view_group_toggle() {
-
_update_tracks();
- view_group->set_icon(get_icon(view_group->is_pressed() ? "AnimationTrackList" : "AnimationTrackGroup", "EditorIcons"));
+ view_group->set_icon(get_theme_icon(view_group->is_pressed() ? "AnimationTrackList" : "AnimationTrackGroup", "EditorIcons"));
}
bool AnimationTrackEditor::is_grouping_tracks() {
-
if (!view_group) {
return false;
}
@@ -5672,7 +5483,6 @@ bool AnimationTrackEditor::is_grouping_tracks() {
}
void AnimationTrackEditor::_selection_changed() {
-
if (selected_filter->is_pressed()) {
_update_tracks(); //needs updatin
} else {
@@ -5687,14 +5497,13 @@ void AnimationTrackEditor::_selection_changed() {
}
float AnimationTrackEditor::snap_time(float p_value, bool p_relative) {
-
if (is_snap_enabled()) {
-
double snap_increment;
- if (timeline->is_using_fps() && step->get_value() > 0)
+ if (timeline->is_using_fps() && step->get_value() > 0) {
snap_increment = 1.0 / step->get_value();
- else
+ } else {
snap_increment = step->get_value();
+ }
if (p_relative) {
double rel = Math::fmod(timeline->get_value(), snap_increment);
@@ -5707,23 +5516,23 @@ float AnimationTrackEditor::snap_time(float p_value, bool p_relative) {
return p_value;
}
-void AnimationTrackEditor::_show_imported_anim_warning() const {
-
+void AnimationTrackEditor::_show_imported_anim_warning() {
// It looks terrible on a single line but the TTR extractor doesn't support line breaks yet.
EditorNode::get_singleton()->show_warning(TTR("This animation belongs to an imported scene, so changes to imported tracks will not be saved.\n\nTo enable the ability to add custom tracks, navigate to the scene's import settings and set\n\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks\", then re-import.\nAlternatively, use an import preset that imports animations to separate files."),
TTR("Warning: Editing imported animation"));
}
void AnimationTrackEditor::_select_all_tracks_for_copy() {
-
TreeItem *track = track_copy_select->get_root()->get_children();
- if (!track)
+ if (!track) {
return;
+ }
bool all_selected = true;
while (track) {
- if (!track->is_checked(0))
+ if (!track->is_checked(0)) {
all_selected = false;
+ }
track = track->get_next();
}
@@ -5736,55 +5545,25 @@ void AnimationTrackEditor::_select_all_tracks_for_copy() {
}
void AnimationTrackEditor::_bind_methods() {
-
- ClassDB::bind_method("_animation_changed", &AnimationTrackEditor::_animation_changed);
ClassDB::bind_method("_animation_update", &AnimationTrackEditor::_animation_update);
- ClassDB::bind_method("_timeline_changed", &AnimationTrackEditor::_timeline_changed);
- ClassDB::bind_method("_track_remove_request", &AnimationTrackEditor::_track_remove_request);
ClassDB::bind_method("_track_grab_focus", &AnimationTrackEditor::_track_grab_focus);
- ClassDB::bind_method("_name_limit_changed", &AnimationTrackEditor::_name_limit_changed);
- ClassDB::bind_method("_update_scroll", &AnimationTrackEditor::_update_scroll);
ClassDB::bind_method("_update_tracks", &AnimationTrackEditor::_update_tracks);
- ClassDB::bind_method("_update_step", &AnimationTrackEditor::_update_step);
- ClassDB::bind_method("_update_length", &AnimationTrackEditor::_update_length);
- ClassDB::bind_method("_dropped_track", &AnimationTrackEditor::_dropped_track);
- ClassDB::bind_method("_add_track", &AnimationTrackEditor::_add_track);
- ClassDB::bind_method("_new_track_node_selected", &AnimationTrackEditor::_new_track_node_selected);
- ClassDB::bind_method("_new_track_property_selected", &AnimationTrackEditor::_new_track_property_selected);
- ClassDB::bind_method("_root_removed", &AnimationTrackEditor::_root_removed);
- ClassDB::bind_method("_confirm_insert_list", &AnimationTrackEditor::_confirm_insert_list);
ClassDB::bind_method("_insert_delay", &AnimationTrackEditor::_insert_delay);
- ClassDB::bind_method("_timeline_value_changed", &AnimationTrackEditor::_timeline_value_changed);
- ClassDB::bind_method("_insert_key_from_track", &AnimationTrackEditor::_insert_key_from_track);
- ClassDB::bind_method("_add_method_key", &AnimationTrackEditor::_add_method_key);
- ClassDB::bind_method("_key_selected", &AnimationTrackEditor::_key_selected);
- ClassDB::bind_method("_key_deselected", &AnimationTrackEditor::_key_deselected);
- ClassDB::bind_method("_clear_selection", &AnimationTrackEditor::_clear_selection);
- ClassDB::bind_method("_move_selection_begin", &AnimationTrackEditor::_move_selection_begin);
- ClassDB::bind_method("_move_selection", &AnimationTrackEditor::_move_selection);
- ClassDB::bind_method("_move_selection_commit", &AnimationTrackEditor::_move_selection_commit);
- ClassDB::bind_method("_move_selection_cancel", &AnimationTrackEditor::_move_selection_cancel);
ClassDB::bind_method("_clear_selection_for_anim", &AnimationTrackEditor::_clear_selection_for_anim);
ClassDB::bind_method("_select_at_anim", &AnimationTrackEditor::_select_at_anim);
- ClassDB::bind_method("_scroll_input", &AnimationTrackEditor::_scroll_input);
- ClassDB::bind_method("_box_selection_draw", &AnimationTrackEditor::_box_selection_draw);
- ClassDB::bind_method("_bezier_edit", &AnimationTrackEditor::_bezier_edit);
- ClassDB::bind_method("_cancel_bezier_edit", &AnimationTrackEditor::_cancel_bezier_edit);
- ClassDB::bind_method("_edit_menu_pressed", &AnimationTrackEditor::_edit_menu_pressed);
- ClassDB::bind_method("_view_group_toggle", &AnimationTrackEditor::_view_group_toggle);
- ClassDB::bind_method("_selection_changed", &AnimationTrackEditor::_selection_changed);
- ClassDB::bind_method("_snap_mode_changed", &AnimationTrackEditor::_snap_mode_changed);
- ClassDB::bind_method("_show_imported_anim_warning", &AnimationTrackEditor::_show_imported_anim_warning);
- ClassDB::bind_method("_select_all_tracks_for_copy", &AnimationTrackEditor::_select_all_tracks_for_copy);
-
- ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::REAL, "position"), PropertyInfo(Variant::BOOL, "drag")));
+
+ ClassDB::bind_method("_key_selected", &AnimationTrackEditor::_key_selected); // Still used by some connect_compat.
+ ClassDB::bind_method("_key_deselected", &AnimationTrackEditor::_key_deselected); // Still used by some connect_compat.
+ ClassDB::bind_method("_clear_selection", &AnimationTrackEditor::_clear_selection); // Still used by some connect_compat.
+
+ ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag")));
ADD_SIGNAL(MethodInfo("keying_changed"));
- ADD_SIGNAL(MethodInfo("animation_len_changed", PropertyInfo(Variant::REAL, "len")));
- ADD_SIGNAL(MethodInfo("animation_step_changed", PropertyInfo(Variant::REAL, "step")));
+ ADD_SIGNAL(MethodInfo("animation_len_changed", PropertyInfo(Variant::FLOAT, "len")));
+ ADD_SIGNAL(MethodInfo("animation_step_changed", PropertyInfo(Variant::FLOAT, "step")));
}
AnimationTrackEditor::AnimationTrackEditor() {
- root = NULL;
+ root = nullptr;
undo_redo = EditorNode::get_singleton()->get_undo_redo();
@@ -5799,7 +5578,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
timeline_scroll->add_child(timeline_vbox);
timeline_vbox->set_v_size_flags(SIZE_EXPAND_FILL);
timeline_vbox->set_h_size_flags(SIZE_EXPAND_FILL);
- timeline_vbox->add_constant_override("separation", 0);
+ timeline_vbox->add_theme_constant_override("separation", 0);
info_message = memnew(Label);
info_message->set_text(TTR("Select an AnimationPlayer node to create and edit animations."));
@@ -5813,11 +5592,11 @@ AnimationTrackEditor::AnimationTrackEditor() {
timeline = memnew(AnimationTimelineEdit);
timeline->set_undo_redo(undo_redo);
timeline_vbox->add_child(timeline);
- timeline->connect("timeline_changed", this, "_timeline_changed");
- timeline->connect("name_limit_changed", this, "_name_limit_changed");
- timeline->connect("track_added", this, "_add_track");
- timeline->connect("value_changed", this, "_timeline_value_changed");
- timeline->connect("length_changed", this, "_update_length");
+ timeline->connect("timeline_changed", callable_mp(this, &AnimationTrackEditor::_timeline_changed));
+ timeline->connect("name_limit_changed", callable_mp(this, &AnimationTrackEditor::_name_limit_changed));
+ timeline->connect("track_added", callable_mp(this, &AnimationTrackEditor::_add_track));
+ timeline->connect("value_changed", callable_mp(this, &AnimationTrackEditor::_timeline_value_changed));
+ timeline->connect("length_changed", callable_mp(this, &AnimationTrackEditor::_update_length));
scroll = memnew(ScrollContainer);
timeline_vbox->add_child(scroll);
@@ -5825,7 +5604,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
VScrollBar *sb = scroll->get_v_scrollbar();
scroll->remove_child(sb);
timeline_scroll->add_child(sb); //move here so timeline and tracks are always aligned
- scroll->connect("gui_input", this, "_scroll_input");
+ scroll->connect("gui_input", callable_mp(this, &AnimationTrackEditor::_scroll_input));
bezier_edit = memnew(AnimationBezierTrackEdit);
timeline_vbox->add_child(bezier_edit);
@@ -5834,14 +5613,14 @@ AnimationTrackEditor::AnimationTrackEditor() {
bezier_edit->set_timeline(timeline);
bezier_edit->hide();
bezier_edit->set_v_size_flags(SIZE_EXPAND_FILL);
- bezier_edit->connect("close_request", this, "_cancel_bezier_edit");
+ bezier_edit->connect("close_request", callable_mp(this, &AnimationTrackEditor::_cancel_bezier_edit));
timeline_vbox->set_custom_minimum_size(Size2(0, 150) * EDSCALE);
hscroll = memnew(HScrollBar);
hscroll->share(timeline);
hscroll->hide();
- hscroll->connect("value_changed", this, "_update_scroll");
+ hscroll->connect("value_changed", callable_mp(this, &AnimationTrackEditor::_update_scroll));
timeline_vbox->add_child(hscroll);
timeline->set_hscroll(hscroll);
@@ -5850,7 +5629,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
track_vbox->set_h_size_flags(SIZE_EXPAND_FILL);
scroll->set_enable_h_scroll(false);
scroll->set_enable_v_scroll(true);
- track_vbox->add_constant_override("separation", 0);
+ track_vbox->add_theme_constant_override("separation", 0);
HBoxContainer *bottom_hb = memnew(HBoxContainer);
add_child(bottom_hb);
@@ -5858,27 +5637,30 @@ AnimationTrackEditor::AnimationTrackEditor() {
imported_anim_warning = memnew(Button);
imported_anim_warning->hide();
imported_anim_warning->set_tooltip(TTR("Warning: Editing imported animation"));
- imported_anim_warning->connect("pressed", this, "_show_imported_anim_warning");
+ imported_anim_warning->connect("pressed", callable_mp(this, &AnimationTrackEditor::_show_imported_anim_warning));
bottom_hb->add_child(imported_anim_warning);
bottom_hb->add_spacer();
- selected_filter = memnew(ToolButton);
- selected_filter->connect("pressed", this, "_view_group_toggle"); //same function works the same
+ selected_filter = memnew(Button);
+ selected_filter->set_flat(true);
+ selected_filter->connect("pressed", callable_mp(this, &AnimationTrackEditor::_view_group_toggle)); //same function works the same
selected_filter->set_toggle_mode(true);
selected_filter->set_tooltip(TTR("Only show tracks from nodes selected in tree."));
bottom_hb->add_child(selected_filter);
- view_group = memnew(ToolButton);
- view_group->connect("pressed", this, "_view_group_toggle");
+ view_group = memnew(Button);
+ view_group->set_flat(true);
+ view_group->connect("pressed", callable_mp(this, &AnimationTrackEditor::_view_group_toggle));
view_group->set_toggle_mode(true);
view_group->set_tooltip(TTR("Group tracks by node or display them as plain list."));
bottom_hb->add_child(view_group);
bottom_hb->add_child(memnew(VSeparator));
- snap = memnew(ToolButton);
+ snap = memnew(Button);
+ snap->set_flat(true);
snap->set_text(TTR("Snap:") + " ");
bottom_hb->add_child(snap);
snap->set_disabled(true);
@@ -5893,14 +5675,14 @@ AnimationTrackEditor::AnimationTrackEditor() {
step->set_custom_minimum_size(Size2(100, 0) * EDSCALE);
step->set_tooltip(TTR("Animation step value."));
bottom_hb->add_child(step);
- step->connect("value_changed", this, "_update_step");
+ step->connect("value_changed", callable_mp(this, &AnimationTrackEditor::_update_step));
step->set_read_only(true);
snap_mode = memnew(OptionButton);
snap_mode->add_item(TTR("Seconds"));
snap_mode->add_item(TTR("FPS"));
bottom_hb->add_child(snap_mode);
- snap_mode->connect("item_selected", this, "_snap_mode_changed");
+ snap_mode->connect("item_selected", callable_mp(this, &AnimationTrackEditor::_snap_mode_changed));
snap_mode->set_disabled(true);
bottom_hb->add_child(memnew(VSeparator));
@@ -5945,19 +5727,19 @@ AnimationTrackEditor::AnimationTrackEditor() {
edit->get_popup()->add_item(TTR("Optimize Animation"), EDIT_OPTIMIZE_ANIMATION);
edit->get_popup()->add_item(TTR("Clean-Up Animation"), EDIT_CLEAN_UP_ANIMATION);
- edit->get_popup()->connect("id_pressed", this, "_edit_menu_pressed");
+ edit->get_popup()->connect("id_pressed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed));
pick_track = memnew(SceneTreeDialog);
add_child(pick_track);
- pick_track->set_title(TTR("Pick the node that will be animated:"));
- pick_track->connect("selected", this, "_new_track_node_selected");
+ pick_track->set_title(TTR("Pick a node to animate:"));
+ pick_track->connect("selected", callable_mp(this, &AnimationTrackEditor::_new_track_node_selected));
prop_selector = memnew(PropertySelector);
add_child(prop_selector);
- prop_selector->connect("selected", this, "_new_track_property_selected");
+ prop_selector->connect("selected", callable_mp(this, &AnimationTrackEditor::_new_track_property_selected));
method_selector = memnew(PropertySelector);
add_child(method_selector);
- method_selector->connect("selected", this, "_add_method_key");
+ method_selector->connect("selected", callable_mp(this, &AnimationTrackEditor::_add_method_key));
inserting = false;
insert_query = false;
@@ -5966,7 +5748,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
insert_confirm = memnew(ConfirmationDialog);
add_child(insert_confirm);
- insert_confirm->connect("confirmed", this, "_confirm_insert_list");
+ insert_confirm->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_confirm_insert_list));
VBoxContainer *icvb = memnew(VBoxContainer);
insert_confirm->add_child(icvb);
insert_confirm_text = memnew(Label);
@@ -5975,16 +5757,16 @@ AnimationTrackEditor::AnimationTrackEditor() {
insert_confirm_bezier->set_text(TTR("Use Bezier Curves"));
icvb->add_child(insert_confirm_bezier);
keying = false;
- moving_selection = 0;
- key_edit = NULL;
- multi_key_edit = NULL;
+ moving_selection = false;
+ key_edit = nullptr;
+ multi_key_edit = nullptr;
box_selection = memnew(Control);
add_child(box_selection);
box_selection->set_as_toplevel(true);
box_selection->set_mouse_filter(MOUSE_FILTER_IGNORE);
box_selection->hide();
- box_selection->connect("draw", this, "_box_selection_draw");
+ box_selection->connect("draw", callable_mp(this, &AnimationTrackEditor::_box_selection_draw));
box_selecting = false;
//default plugins
@@ -6022,7 +5804,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
optimize_max_angle->set_value(22);
optimize_dialog->get_ok()->set_text(TTR("Optimize"));
- optimize_dialog->connect("confirmed", this, "_edit_menu_pressed", varray(EDIT_CLEAN_UP_ANIMATION_CONFIRM));
+ optimize_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_CLEAN_UP_ANIMATION_CONFIRM));
//
@@ -6048,7 +5830,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
cleanup_dialog->set_title(TTR("Clean-Up Animation(s) (NO UNDO!)"));
cleanup_dialog->get_ok()->set_text(TTR("Clean-Up"));
- cleanup_dialog->connect("confirmed", this, "_edit_menu_pressed", varray(EDIT_CLEAN_UP_ANIMATION_CONFIRM));
+ cleanup_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_CLEAN_UP_ANIMATION_CONFIRM));
//
scale_dialog = memnew(ConfirmationDialog);
@@ -6060,7 +5842,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
scale->set_max(99999);
scale->set_step(0.001);
vbc->add_margin_child(TTR("Scale Ratio:"), scale);
- scale_dialog->connect("confirmed", this, "_edit_menu_pressed", varray(EDIT_SCALE_CONFIRM));
+ scale_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_SCALE_CONFIRM));
add_child(scale_dialog);
track_copy_dialog = memnew(ConfirmationDialog);
@@ -6073,7 +5855,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
Button *select_all_button = memnew(Button);
select_all_button->set_text(TTR("Select All/None"));
- select_all_button->connect("pressed", this, "_select_all_tracks_for_copy");
+ select_all_button->connect("pressed", callable_mp(this, &AnimationTrackEditor::_select_all_tracks_for_copy));
track_vbox->add_child(select_all_button);
track_copy_select = memnew(Tree);
@@ -6081,7 +5863,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
track_copy_select->set_v_size_flags(SIZE_EXPAND_FILL);
track_copy_select->set_hide_root(true);
track_vbox->add_child(track_copy_select);
- track_copy_dialog->connect("confirmed", this, "_edit_menu_pressed", varray(EDIT_COPY_TRACKS_CONFIRM));
+ track_copy_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_COPY_TRACKS_CONFIRM));
animation_changing_awaiting_update = false;
}
diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h
index 79abda2d49..a31ca892ef 100644
--- a/editor/animation_track_editor.h
+++ b/editor/animation_track_editor.h
@@ -44,7 +44,6 @@
#include "scene/gui/spin_box.h"
#include "scene/gui/tab_container.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
#include "scene/resources/animation.h"
#include "scene_tree_editor.h"
@@ -59,7 +58,7 @@ class AnimationTimelineEdit : public Range {
HBoxContainer *len_hb;
EditorSpinSlider *length;
- ToolButton *loop;
+ Button *loop;
TextureRect *time_icon;
MenuButton *add_track;
@@ -98,7 +97,7 @@ public:
float get_zoom_scale() const;
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void set_animation(const Ref<Animation> &p_animation);
void set_zoom(Range *p_zoom);
Range *get_zoom() const { return zoom; }
@@ -121,7 +120,6 @@ public:
class AnimationTrackEditor;
class AnimationTrackEdit : public Control {
-
GDCLASS(AnimationTrackEdit, Control);
enum {
@@ -140,6 +138,7 @@ class AnimationTrackEdit : public Control {
};
AnimationTimelineEdit *timeline;
UndoRedo *undo_redo;
+ Popup *path_popup;
LineEdit *path;
Node *root;
Control *play_position; //separate control used to draw so updates for only position changed are much faster
@@ -158,8 +157,8 @@ class AnimationTrackEdit : public Control {
Rect2 remove_rect;
Rect2 bezier_edit_rect;
- Ref<Texture> type_icon;
- Ref<Texture> selected_icon;
+ Ref<Texture2D> type_icon;
+ Ref<Texture2D> selected_icon;
PopupMenu *menu;
@@ -167,7 +166,7 @@ class AnimationTrackEdit : public Control {
void _zoom_changed();
- Ref<Texture> icon_cache;
+ Ref<Texture2D> icon_cache;
String path_cache;
void _menu_selected(int p_index);
@@ -193,11 +192,11 @@ protected:
virtual void _gui_input(const Ref<InputEvent> &p_event);
public:
- virtual Variant get_drag_data(const Point2 &p_point);
- virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
- virtual void drop_data(const Point2 &p_point, const Variant &p_data);
+ virtual Variant get_drag_data(const Point2 &p_point) override;
+ virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override;
+ virtual void drop_data(const Point2 &p_point, const Variant &p_data) override;
- virtual String get_tooltip(const Point2 &p_pos) const;
+ virtual String get_tooltip(const Point2 &p_pos) const override;
virtual int get_key_height() const;
virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
@@ -208,8 +207,8 @@ public:
virtual void draw_fg(int p_clip_left, int p_clip_right);
//helper
- void draw_texture_clipped(const Ref<Texture> &p_texture, const Vector2 &p_pos);
- void draw_texture_region_clipped(const Ref<Texture> &p_texture, const Rect2 &p_rect, const Rect2 &p_region);
+ void draw_texture_clipped(const Ref<Texture2D> &p_texture, const Vector2 &p_pos);
+ void draw_texture_region_clipped(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_region);
void draw_rect_clipped(const Rect2 &p_rect, const Color &p_color, bool p_filled = true);
int get_track() const;
@@ -219,7 +218,7 @@ public:
UndoRedo *get_undo_redo() const { return undo_redo; }
NodePath get_path() const;
void set_animation_and_track(const Ref<Animation> &p_animation, int p_track);
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void set_undo_redo(UndoRedo *p_undo_redo);
void set_timeline(AnimationTimelineEdit *p_timeline);
@@ -251,7 +250,7 @@ class AnimationBezierTrackEdit;
class AnimationTrackEditGroup : public Control {
GDCLASS(AnimationTrackEditGroup, Control);
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
String node_name;
NodePath node;
Node *root;
@@ -264,8 +263,8 @@ protected:
void _notification(int p_what);
public:
- void set_type_and_name(const Ref<Texture> &p_type, const String &p_name, const NodePath &p_node);
- virtual Size2 get_minimum_size() const;
+ void set_type_and_name(const Ref<Texture2D> &p_type, const String &p_name, const NodePath &p_node);
+ virtual Size2 get_minimum_size() const override;
void set_timeline(AnimationTimelineEdit *p_timeline);
void set_root(Node *p_root);
@@ -310,11 +309,11 @@ class AnimationTrackEditor : public VBoxContainer {
HSlider *zoom;
EditorSpinSlider *step;
TextureRect *zoom_icon;
- ToolButton *snap;
+ Button *snap;
OptionButton *snap_mode;
Button *imported_anim_warning;
- void _show_imported_anim_warning() const;
+ void _show_imported_anim_warning();
void _snap_mode_changed(int p_mode);
Vector<AnimationTrackEdit *> track_edits;
@@ -353,7 +352,6 @@ class AnimationTrackEditor : public VBoxContainer {
bool keying;
struct InsertData {
-
Animation::TrackType type;
NodePath path;
int track_idx;
@@ -378,7 +376,7 @@ class AnimationTrackEditor : public VBoxContainer {
void _root_removed(Node *p_root);
- PropertyInfo _find_hint_for_track(int p_idx, NodePath &r_base_path, Variant *r_current_val = NULL);
+ PropertyInfo _find_hint_for_track(int p_idx, NodePath &r_base_path, Variant *r_current_val = nullptr);
void _timeline_value_changed(double);
@@ -394,14 +392,12 @@ class AnimationTrackEditor : public VBoxContainer {
//selection
struct SelectedKey {
-
int track;
int key;
bool operator<(const SelectedKey &p_key) const { return track == p_key.track ? key < p_key.key : track < p_key.track; };
};
struct KeyInfo {
-
float pos;
};
@@ -430,7 +426,7 @@ class AnimationTrackEditor : public VBoxContainer {
Rect2 box_select_rect;
void _scroll_input(const Ref<InputEvent> &p_event);
- Vector<Ref<AnimationTrackEditPlugin> > track_edit_plugins;
+ Vector<Ref<AnimationTrackEditPlugin>> track_edit_plugins;
void _cancel_bezier_edit();
void _bezier_edit(int p_for_track);
@@ -460,8 +456,8 @@ class AnimationTrackEditor : public VBoxContainer {
void _anim_duplicate_keys(bool transpose);
void _view_group_toggle();
- ToolButton *view_group;
- ToolButton *selected_filter;
+ Button *view_group;
+ Button *selected_filter;
void _selection_changed();
@@ -512,7 +508,7 @@ public:
void set_anim_pos(float p_pos);
void insert_node_value_key(Node *p_node, const String &p_property, const Variant &p_value, bool p_only_if_exists = false);
void insert_value_key(const String &p_property, const Variant &p_value, bool p_advance);
- void insert_transform_key(Spatial *p_node, const String &p_sub, const Transform &p_xform);
+ void insert_transform_key(Node3D *p_node, const String &p_sub, const Transform &p_xform);
void show_select_node_warning(bool p_show);
diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp
index bb008e621e..9fc67000f9 100644
--- a/editor/animation_track_editor_plugins.cpp
+++ b/editor/animation_track_editor_plugins.cpp
@@ -33,45 +33,45 @@
#include "editor/audio_stream_preview.h"
#include "editor_resource_preview.h"
#include "editor_scale.h"
-#include "scene/2d/animated_sprite.h"
-#include "scene/2d/sprite.h"
+#include "scene/2d/animated_sprite_2d.h"
+#include "scene/2d/sprite_2d.h"
#include "scene/3d/sprite_3d.h"
#include "scene/animation/animation_player.h"
#include "servers/audio/audio_stream.h"
/// BOOL ///
int AnimationTrackEditBool::get_key_height() const {
-
- Ref<Texture> checked = get_icon("checked", "CheckBox");
+ Ref<Texture2D> checked = get_theme_icon("checked", "CheckBox");
return checked->get_height();
}
-Rect2 AnimationTrackEditBool::get_key_rect(int p_index, float p_pixels_sec) {
- Ref<Texture> checked = get_icon("checked", "CheckBox");
+Rect2 AnimationTrackEditBool::get_key_rect(int p_index, float p_pixels_sec) {
+ Ref<Texture2D> checked = get_theme_icon("checked", "CheckBox");
return Rect2(-checked->get_width() / 2, 0, checked->get_width(), get_size().height);
}
bool AnimationTrackEditBool::is_key_selectable_by_distance() const {
-
return false;
}
-void AnimationTrackEditBool::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
+void AnimationTrackEditBool::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
bool checked = get_animation()->track_get_key_value(get_track(), p_index);
- Ref<Texture> icon = get_icon(checked ? "checked" : "unchecked", "CheckBox");
+ Ref<Texture2D> icon = get_theme_icon(checked ? "checked" : "unchecked", "CheckBox");
Vector2 ofs(p_x - icon->get_width() / 2, int(get_size().height - icon->get_height()) / 2);
- if (ofs.x + icon->get_width() / 2 < p_clip_left)
+ if (ofs.x + icon->get_width() / 2 < p_clip_left) {
return;
+ }
- if (ofs.x + icon->get_width() / 2 > p_clip_right)
+ if (ofs.x + icon->get_width() / 2 > p_clip_right) {
return;
+ }
draw_texture(icon, ofs);
if (p_selected) {
- Color color = get_color("accent_color", "Editor");
+ Color color = get_theme_color("accent_color", "Editor");
draw_rect_clipped(Rect2(ofs, icon->get_size()), color, false);
}
}
@@ -79,46 +79,44 @@ void AnimationTrackEditBool::draw_key(int p_index, float p_pixels_sec, int p_x,
/// COLOR ///
int AnimationTrackEditColor::get_key_height() const {
-
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
return font->get_height() * 0.8;
}
-Rect2 AnimationTrackEditColor::get_key_rect(int p_index, float p_pixels_sec) {
- Ref<Font> font = get_font("font", "Label");
+Rect2 AnimationTrackEditColor::get_key_rect(int p_index, float p_pixels_sec) {
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
return Rect2(-fh / 2, 0, fh, get_size().height);
}
bool AnimationTrackEditColor::is_key_selectable_by_distance() const {
-
return false;
}
void AnimationTrackEditColor::draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right) {
-
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = (font->get_height() * 0.8);
int x_from = p_x + fh / 2 - 1;
int x_to = p_next_x - fh / 2 + 1;
fh /= 3;
- if (x_from > p_clip_right || x_to < p_clip_left)
+ if (x_from > p_clip_right || x_to < p_clip_left) {
return;
+ }
Color color = get_animation()->track_get_key_value(get_track(), p_index);
Color color_next = get_animation()->track_get_key_value(get_track(), p_index + 1);
if (x_from < p_clip_left) {
float c = float(p_clip_left - x_from) / (x_to - x_from);
- color = color.linear_interpolate(color_next, c);
+ color = color.lerp(color_next, c);
x_from = p_clip_left;
}
if (x_to > p_clip_right) {
float c = float(p_clip_right - x_from) / (x_to - x_from);
- color_next = color.linear_interpolate(color_next, c);
+ color_next = color.lerp(color_next, c);
x_to = p_clip_right;
}
@@ -143,10 +141,9 @@ void AnimationTrackEditColor::draw_key_link(int p_index, float p_pixels_sec, int
}
void AnimationTrackEditColor::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
-
Color color = get_animation()->track_get_key_value(get_track(), p_index);
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
Rect2 rect(Vector2(p_x - fh / 2, int(get_size().height - fh) / 2), Size2(fh, fh));
@@ -158,7 +155,7 @@ void AnimationTrackEditColor::draw_key(int p_index, float p_pixels_sec, int p_x,
draw_rect_clipped(rect, color);
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect_clipped(rect, accent, false);
}
}
@@ -166,11 +163,11 @@ void AnimationTrackEditColor::draw_key(int p_index, float p_pixels_sec, int p_x,
/// AUDIO ///
void AnimationTrackEditAudio::_preview_changed(ObjectID p_which) {
-
Object *object = ObjectDB::get_instance(id);
- if (!object)
+ if (!object) {
return;
+ }
Ref<AudioStream> stream = object->call("get_stream");
@@ -180,16 +177,15 @@ void AnimationTrackEditAudio::_preview_changed(ObjectID p_which) {
}
int AnimationTrackEditAudio::get_key_height() const {
-
if (!ObjectDB::get_instance(id)) {
return AnimationTrackEdit::get_key_height();
}
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
}
-Rect2 AnimationTrackEditAudio::get_key_rect(int p_index, float p_pixels_sec) {
+Rect2 AnimationTrackEditAudio::get_key_rect(int p_index, float p_pixels_sec) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -207,7 +203,6 @@ Rect2 AnimationTrackEditAudio::get_key_rect(int p_index, float p_pixels_sec) {
float len = stream->get_length();
if (len == 0) {
-
Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream);
len = preview->get_length();
}
@@ -218,18 +213,17 @@ Rect2 AnimationTrackEditAudio::get_key_rect(int p_index, float p_pixels_sec) {
return Rect2(0, 0, len * p_pixels_sec, get_size().height);
} else {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
return Rect2(0, 0, fh, get_size().height);
}
}
bool AnimationTrackEditAudio::is_key_selectable_by_distance() const {
-
return false;
}
-void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
+void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -261,11 +255,13 @@ void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x,
int pixel_begin = p_x;
int pixel_end = p_x + pixel_len;
- if (pixel_end < p_clip_left)
+ if (pixel_end < p_clip_left) {
return;
+ }
- if (pixel_begin > p_clip_right)
+ if (pixel_begin > p_clip_right) {
return;
+ }
int from_x = MAX(pixel_begin, p_clip_left);
int to_x = MIN(pixel_end, p_clip_right);
@@ -276,10 +272,11 @@ void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x,
to_x = MIN(limit_x, to_x);
}
- if (to_x <= from_x)
+ if (to_x <= from_x) {
return;
+ }
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
float fh = int(font->get_height() * 1.5);
Rect2 rect = Rect2(from_x, (get_size().height - fh) / 2, to_x - from_x, fh);
draw_rect(rect, Color(0.25, 0.25, 0.25));
@@ -289,7 +286,6 @@ void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x,
preview_len = preview->get_length();
for (int i = from_x; i < to_x; i++) {
-
float ofs = (i - pixel_begin) * preview_len / pixel_len;
float ofs_n = ((i + 1) - pixel_begin) * preview_len / pixel_len;
float max = preview->get_max(ofs, ofs_n) * 0.5 + 0.5;
@@ -303,53 +299,50 @@ void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x,
Vector<Color> color;
color.push_back(Color(0.75, 0.75, 0.75));
- VS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, color);
+ RS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, color);
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect(rect, accent, false);
}
} else {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
Rect2 rect(Vector2(p_x, int(get_size().height - fh) / 2), Size2(fh, fh));
- Color color = get_color("font_color", "Label");
+ Color color = get_theme_color("font_color", "Label");
draw_rect(rect, color);
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect(rect, accent, false);
}
}
}
void AnimationTrackEditAudio::set_node(Object *p_object) {
-
id = p_object->get_instance_id();
}
void AnimationTrackEditAudio::_bind_methods() {
- ClassDB::bind_method("_preview_changed", &AnimationTrackEditAudio::_preview_changed);
}
AnimationTrackEditAudio::AnimationTrackEditAudio() {
- AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", this, "_preview_changed");
+ AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", callable_mp(this, &AnimationTrackEditAudio::_preview_changed));
}
/// SPRITE FRAME / FRAME_COORDS ///
int AnimationTrackEditSpriteFrame::get_key_height() const {
-
if (!ObjectDB::get_instance(id)) {
return AnimationTrackEdit::get_key_height();
}
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 2);
}
-Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_sec) {
+Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_sec) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -358,9 +351,8 @@ Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_se
Size2 size;
- if (Object::cast_to<Sprite>(object) || Object::cast_to<Sprite3D>(object)) {
-
- Ref<Texture> texture = object->call("get_texture");
+ if (Object::cast_to<Sprite2D>(object) || Object::cast_to<Sprite3D>(object)) {
+ Ref<Texture2D> texture = object->call("get_texture");
if (!texture.is_valid()) {
return AnimationTrackEdit::get_key_rect(p_index, p_pixels_sec);
}
@@ -380,8 +372,7 @@ Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_se
if (vframes > 1) {
size.y /= vframes;
}
- } else if (Object::cast_to<AnimatedSprite>(object) || Object::cast_to<AnimatedSprite3D>(object)) {
-
+ } else if (Object::cast_to<AnimatedSprite2D>(object) || Object::cast_to<AnimatedSprite3D>(object)) {
Ref<SpriteFrames> sf = object->call("get_sprite_frames");
if (sf.is_null()) {
return AnimationTrackEdit::get_key_rect(p_index, p_pixels_sec);
@@ -404,7 +395,7 @@ Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_se
animation = get_animation()->track_get_key_value(animation_track, animaiton_index);
}
- Ref<Texture> texture = sf->get_frame(animation, frame);
+ Ref<Texture2D> texture = sf->get_frame(animation, frame);
if (!texture.is_valid()) {
return AnimationTrackEdit::get_key_rect(p_index, p_pixels_sec);
}
@@ -414,7 +405,7 @@ Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_se
size = size.floor();
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int height = int(font->get_height() * 2);
int width = height * size.width / size.height;
@@ -422,11 +413,10 @@ Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_se
}
bool AnimationTrackEditSpriteFrame::is_key_selectable_by_distance() const {
-
return false;
}
-void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
+void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -434,11 +424,10 @@ void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, in
return;
}
- Ref<Texture> texture;
+ Ref<Texture2D> texture;
Rect2 region;
- if (Object::cast_to<Sprite>(object) || Object::cast_to<Sprite3D>(object)) {
-
+ if (Object::cast_to<Sprite2D>(object) || Object::cast_to<Sprite3D>(object)) {
texture = object->call("get_texture");
if (!texture.is_valid()) {
AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right);
@@ -460,7 +449,6 @@ void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, in
region.size = texture->get_size();
if (bool(object->call("is_region"))) {
-
region = Rect2(object->call("get_region_rect"));
}
@@ -474,8 +462,7 @@ void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, in
region.position.x += region.size.x * coords.x;
region.position.y += region.size.y * coords.y;
- } else if (Object::cast_to<AnimatedSprite>(object) || Object::cast_to<AnimatedSprite3D>(object)) {
-
+ } else if (Object::cast_to<AnimatedSprite2D>(object) || Object::cast_to<AnimatedSprite3D>(object)) {
Ref<SpriteFrames> sf = object->call("get_sprite_frames");
if (sf.is_null()) {
AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right);
@@ -508,20 +495,22 @@ void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, in
region.size = texture->get_size();
}
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int height = int(font->get_height() * 2);
int width = height * region.size.width / region.size.height;
Rect2 rect(p_x, int(get_size().height - height) / 2, width, height);
- if (rect.position.x + rect.size.x < p_clip_left)
+ if (rect.position.x + rect.size.x < p_clip_left) {
return;
+ }
- if (rect.position.x > p_clip_right)
+ if (rect.position.x > p_clip_right) {
return;
+ }
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
Color bg = accent;
bg.a = 0.15;
@@ -535,28 +524,25 @@ void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, in
}
void AnimationTrackEditSpriteFrame::set_node(Object *p_object) {
-
id = p_object->get_instance_id();
}
void AnimationTrackEditSpriteFrame::set_as_coords() {
-
is_coords = true;
}
/// SUB ANIMATION ///
int AnimationTrackEditSubAnim::get_key_height() const {
-
if (!ObjectDB::get_instance(id)) {
return AnimationTrackEdit::get_key_height();
}
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
}
-Rect2 AnimationTrackEditSubAnim::get_key_rect(int p_index, float p_pixels_sec) {
+Rect2 AnimationTrackEditSubAnim::get_key_rect(int p_index, float p_pixels_sec) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -572,7 +558,6 @@ Rect2 AnimationTrackEditSubAnim::get_key_rect(int p_index, float p_pixels_sec) {
String anim = get_animation()->track_get_key_value(get_track(), p_index);
if (anim != "[stop]" && ap->has_animation(anim)) {
-
float len = ap->get_animation(anim)->get_length();
if (get_animation()->track_get_key_count(get_track()) > p_index + 1) {
@@ -581,18 +566,17 @@ Rect2 AnimationTrackEditSubAnim::get_key_rect(int p_index, float p_pixels_sec) {
return Rect2(0, 0, len * p_pixels_sec, get_size().height);
} else {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
return Rect2(0, 0, fh, get_size().height);
}
}
bool AnimationTrackEditSubAnim::is_key_selectable_by_distance() const {
-
return false;
}
-void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
+void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -610,7 +594,6 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
String anim = get_animation()->track_get_key_value(get_track(), p_index);
if (anim != "[stop]" && ap->has_animation(anim)) {
-
float len = ap->get_animation(anim)->get_length();
if (get_animation()->track_get_key_count(get_track()) > p_index + 1) {
@@ -622,24 +605,27 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
int pixel_begin = p_x;
int pixel_end = p_x + pixel_len;
- if (pixel_end < p_clip_left)
+ if (pixel_end < p_clip_left) {
return;
+ }
- if (pixel_begin > p_clip_right)
+ if (pixel_begin > p_clip_right) {
return;
+ }
int from_x = MAX(pixel_begin, p_clip_left);
int to_x = MIN(pixel_end, p_clip_right);
- if (to_x <= from_x)
+ if (to_x <= from_x) {
return;
+ }
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 1.5;
Rect2 rect(from_x, int(get_size().height - fh) / 2, to_x - from_x, fh);
- Color color = get_color("font_color", "Label");
+ Color color = get_theme_color("font_color", "Label");
Color bg = color;
bg.r = 1 - color.r;
bg.g = 1 - color.g;
@@ -652,18 +638,17 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
Ref<Animation> animation = ap->get_animation(anim);
for (int i = 0; i < animation->get_track_count(); i++) {
-
float h = (rect.size.height - 2) / animation->get_track_count();
int y = 2 + h * i + h / 2;
for (int j = 0; j < animation->track_get_key_count(i); j++) {
-
float ofs = animation->track_get_key_time(i, j);
int x = p_x + ofs * p_pixels_sec + 2;
- if (x < from_x || x >= (to_x - 4))
+ if (x < from_x || x >= (to_x - 4)) {
continue;
+ }
lines.push_back(Point2(x, y));
lines.push_back(Point2(x + 1, y));
@@ -674,7 +659,7 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
}
if (lines.size() > 2) {
- VS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, colorv);
+ RS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, colorv);
}
int limit = to_x - from_x - 4;
@@ -683,40 +668,37 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
}
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect(rect, accent, false);
}
} else {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
Rect2 rect(Vector2(p_x, int(get_size().height - fh) / 2), Size2(fh, fh));
- Color color = get_color("font_color", "Label");
+ Color color = get_theme_color("font_color", "Label");
draw_rect(rect, color);
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect(rect, accent, false);
}
}
}
void AnimationTrackEditSubAnim::set_node(Object *p_object) {
-
id = p_object->get_instance_id();
}
//// VOLUME DB ////
int AnimationTrackEditVolumeDB::get_key_height() const {
-
- Ref<Texture> volume_texture = get_icon("ColorTrackVu", "EditorIcons");
+ Ref<Texture2D> volume_texture = get_theme_icon("ColorTrackVu", "EditorIcons");
return volume_texture->get_height() * 1.2;
}
void AnimationTrackEditVolumeDB::draw_bg(int p_clip_left, int p_clip_right) {
-
- Ref<Texture> volume_texture = get_icon("ColorTrackVu", "EditorIcons");
+ Ref<Texture2D> volume_texture = get_theme_icon("ColorTrackVu", "EditorIcons");
int tex_h = volume_texture->get_height();
int y_from = (get_size().height - tex_h) / 2;
@@ -727,8 +709,7 @@ void AnimationTrackEditVolumeDB::draw_bg(int p_clip_left, int p_clip_right) {
}
void AnimationTrackEditVolumeDB::draw_fg(int p_clip_left, int p_clip_right) {
-
- Ref<Texture> volume_texture = get_icon("ColorTrackVu", "EditorIcons");
+ Ref<Texture2D> volume_texture = get_theme_icon("ColorTrackVu", "EditorIcons");
int tex_h = volume_texture->get_height();
int y_from = (get_size().height - tex_h) / 2;
int db0 = y_from + (24 / 80.0) * tex_h;
@@ -737,9 +718,9 @@ void AnimationTrackEditVolumeDB::draw_fg(int p_clip_left, int p_clip_right) {
}
void AnimationTrackEditVolumeDB::draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right) {
-
- if (p_x > p_clip_right || p_next_x < p_clip_left)
+ if (p_x > p_clip_right || p_next_x < p_clip_left) {
return;
+ }
float db = get_animation()->track_get_key_value(get_track(), p_index);
float db_n = get_animation()->track_get_key_value(get_track(), p_index + 1);
@@ -763,12 +744,12 @@ void AnimationTrackEditVolumeDB::draw_key_link(int p_index, float p_pixels_sec,
to_x = p_clip_right;
}
- Ref<Texture> volume_texture = get_icon("ColorTrackVu", "EditorIcons");
+ Ref<Texture2D> volume_texture = get_theme_icon("ColorTrackVu", "EditorIcons");
int tex_h = volume_texture->get_height();
int y_from = (get_size().height - tex_h) / 2;
- Color color = get_color("font_color", "Label");
+ Color color = get_theme_color("font_color", "Label");
color.a *= 0.7;
draw_line(Point2(from_x, y_from + h * tex_h), Point2(to_x, y_from + h_n * tex_h), color, 2);
@@ -779,7 +760,6 @@ void AnimationTrackEditVolumeDB::draw_key_link(int p_index, float p_pixels_sec,
/// AUDIO ///
void AnimationTrackEditTypeAudio::_preview_changed(ObjectID p_which) {
-
for (int i = 0; i < get_animation()->track_get_key_count(get_track()); i++) {
Ref<AudioStream> stream = get_animation()->audio_track_get_key_stream(get_track(), i);
if (stream.is_valid() && stream->get_instance_id() == p_which) {
@@ -790,12 +770,11 @@ void AnimationTrackEditTypeAudio::_preview_changed(ObjectID p_which) {
}
int AnimationTrackEditTypeAudio::get_key_height() const {
-
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
}
-Rect2 AnimationTrackEditTypeAudio::get_key_rect(int p_index, float p_pixels_sec) {
+Rect2 AnimationTrackEditTypeAudio::get_key_rect(int p_index, float p_pixels_sec) {
Ref<AudioStream> stream = get_animation()->audio_track_get_key_stream(get_track(), p_index);
if (!stream.is_valid()) {
@@ -808,7 +787,6 @@ Rect2 AnimationTrackEditTypeAudio::get_key_rect(int p_index, float p_pixels_sec)
float len = stream->get_length();
if (len == 0) {
-
Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream);
len = preview->get_length();
}
@@ -827,11 +805,10 @@ Rect2 AnimationTrackEditTypeAudio::get_key_rect(int p_index, float p_pixels_sec)
}
bool AnimationTrackEditTypeAudio::is_key_selectable_by_distance() const {
-
return false;
}
-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) {
+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()) {
@@ -846,16 +823,18 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int
float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale();
if (len_resizing_start) {
start_ofs += ofs_local;
- if (start_ofs < 0)
+ if (start_ofs < 0) {
start_ofs = 0;
+ }
} else {
end_ofs += ofs_local;
- if (end_ofs < 0)
+ if (end_ofs < 0) {
end_ofs = 0;
+ }
}
}
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
float fh = int(font->get_height() * 1.5);
float len = stream->get_length();
@@ -882,11 +861,13 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int
int pixel_begin = p_x;
int pixel_end = p_x + pixel_len;
- if (pixel_end < p_clip_left)
+ if (pixel_end < p_clip_left) {
return;
+ }
- if (pixel_begin > p_clip_right)
+ if (pixel_begin > p_clip_right) {
return;
+ }
int from_x = MAX(pixel_begin, p_clip_left);
int to_x = MIN(pixel_end, p_clip_right);
@@ -910,7 +891,6 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int
preview_len = preview->get_length();
for (int i = from_x; i < to_x; i++) {
-
float ofs = (i - pixel_begin) * preview_len / pixel_total_len;
float ofs_n = ((i + 1) - pixel_begin) * preview_len / pixel_total_len;
ofs += start_ofs;
@@ -927,9 +907,9 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int
Vector<Color> color;
color.push_back(Color(0.75, 0.75, 0.75));
- VS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, color);
+ RS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, color);
- Color cut_color = get_color("accent_color", "Editor");
+ Color cut_color = get_theme_color("accent_color", "Editor");
cut_color.a = 0.7;
if (start_ofs > 0 && pixel_begin > p_clip_left) {
draw_rect(Rect2(pixel_begin, rect.position.y, 1, rect.size.y), cut_color);
@@ -939,24 +919,21 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int
}
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect(rect, accent, false);
}
}
void AnimationTrackEditTypeAudio::_bind_methods() {
- ClassDB::bind_method("_preview_changed", &AnimationTrackEditTypeAudio::_preview_changed);
}
AnimationTrackEditTypeAudio::AnimationTrackEditTypeAudio() {
- AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", this, "_preview_changed");
+ AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", callable_mp(this, &AnimationTrackEditTypeAudio::_preview_changed));
len_resizing = false;
}
bool AnimationTrackEditTypeAudio::can_drop_data(const Point2 &p_point, const Variant &p_data) const {
-
if (p_point.x > get_timeline()->get_name_limit() && p_point.x < get_size().width - get_timeline()->get_buttons_width()) {
-
Dictionary drag_data = p_data;
if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
Ref<AudioStream> res = drag_data["resource"];
@@ -966,7 +943,6 @@ bool AnimationTrackEditTypeAudio::can_drop_data(const Point2 &p_point, const Var
}
if (drag_data.has("type") && String(drag_data["type"]) == "files") {
-
Vector<String> files = drag_data["files"];
if (files.size() == 1) {
@@ -981,16 +957,14 @@ bool AnimationTrackEditTypeAudio::can_drop_data(const Point2 &p_point, const Var
return AnimationTrackEdit::can_drop_data(p_point, p_data);
}
-void AnimationTrackEditTypeAudio::drop_data(const Point2 &p_point, const Variant &p_data) {
+void AnimationTrackEditTypeAudio::drop_data(const Point2 &p_point, const Variant &p_data) {
if (p_point.x > get_timeline()->get_name_limit() && p_point.x < get_size().width - get_timeline()->get_buttons_width()) {
-
Ref<AudioStream> stream;
Dictionary drag_data = p_data;
if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
stream = drag_data["resource"];
} else if (drag_data.has("type") && String(drag_data["type"]) == "files") {
-
Vector<String> files = drag_data["files"];
if (files.size() == 1) {
@@ -1000,7 +974,6 @@ void AnimationTrackEditTypeAudio::drop_data(const Point2 &p_point, const Variant
}
if (stream.is_valid()) {
-
int x = p_point.x - get_timeline()->get_name_limit();
float ofs = x / get_timeline()->get_zoom_scale();
ofs += get_timeline()->get_value();
@@ -1025,12 +998,10 @@ void AnimationTrackEditTypeAudio::drop_data(const Point2 &p_point, const Variant
}
void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseMotion> mm = p_event;
if (!len_resizing && mm.is_valid()) {
bool use_hsize_cursor = false;
for (int i = 0; i < get_animation()->track_get_key_count(get_track()); i++) {
-
Ref<AudioStream> stream = get_animation()->audio_track_get_key_stream(get_track(), i);
if (!stream.is_valid()) {
@@ -1088,7 +1059,6 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && get_default_cursor_shape() == CURSOR_HSIZE) {
-
len_resizing = true;
len_resizing_start = mb->get_shift();
len_resizing_from_px = mb->get_position().x;
@@ -1099,7 +1069,6 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) {
}
if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale();
if (len_resizing_start) {
float prev_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), len_resizing_index);
@@ -1130,16 +1099,15 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) {
/// SUB ANIMATION ///
int AnimationTrackEditTypeAnimation::get_key_height() const {
-
if (!ObjectDB::get_instance(id)) {
return AnimationTrackEdit::get_key_height();
}
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
}
-Rect2 AnimationTrackEditTypeAnimation::get_key_rect(int p_index, float p_pixels_sec) {
+Rect2 AnimationTrackEditTypeAnimation::get_key_rect(int p_index, float p_pixels_sec) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -1155,7 +1123,6 @@ Rect2 AnimationTrackEditTypeAnimation::get_key_rect(int p_index, float p_pixels_
String anim = get_animation()->animation_track_get_key_animation(get_track(), p_index);
if (anim != "[stop]" && ap->has_animation(anim)) {
-
float len = ap->get_animation(anim)->get_length();
if (get_animation()->track_get_key_count(get_track()) > p_index + 1) {
@@ -1164,18 +1131,17 @@ Rect2 AnimationTrackEditTypeAnimation::get_key_rect(int p_index, float p_pixels_
return Rect2(0, 0, len * p_pixels_sec, get_size().height);
} else {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
return Rect2(0, 0, fh, get_size().height);
}
}
bool AnimationTrackEditTypeAnimation::is_key_selectable_by_distance() const {
-
return false;
}
-void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
+void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) {
Object *object = ObjectDB::get_instance(id);
if (!object) {
@@ -1193,7 +1159,6 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
String anim = get_animation()->animation_track_get_key_animation(get_track(), p_index);
if (anim != "[stop]" && ap->has_animation(anim)) {
-
float len = ap->get_animation(anim)->get_length();
if (get_animation()->track_get_key_count(get_track()) > p_index + 1) {
@@ -1205,24 +1170,27 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
int pixel_begin = p_x;
int pixel_end = p_x + pixel_len;
- if (pixel_end < p_clip_left)
+ if (pixel_end < p_clip_left) {
return;
+ }
- if (pixel_begin > p_clip_right)
+ if (pixel_begin > p_clip_right) {
return;
+ }
int from_x = MAX(pixel_begin, p_clip_left);
int to_x = MIN(pixel_end, p_clip_right);
- if (to_x <= from_x)
+ if (to_x <= from_x) {
return;
+ }
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 1.5;
Rect2 rect(from_x, int(get_size().height - fh) / 2, to_x - from_x, fh);
- Color color = get_color("font_color", "Label");
+ Color color = get_theme_color("font_color", "Label");
Color bg = color;
bg.r = 1 - color.r;
bg.g = 1 - color.g;
@@ -1235,18 +1203,17 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
Ref<Animation> animation = ap->get_animation(anim);
for (int i = 0; i < animation->get_track_count(); i++) {
-
float h = (rect.size.height - 2) / animation->get_track_count();
int y = 2 + h * i + h / 2;
for (int j = 0; j < animation->track_get_key_count(i); j++) {
-
float ofs = animation->track_get_key_time(i, j);
int x = p_x + ofs * p_pixels_sec + 2;
- if (x < from_x || x >= (to_x - 4))
+ if (x < from_x || x >= (to_x - 4)) {
continue;
+ }
lines.push_back(Point2(x, y));
lines.push_back(Point2(x + 1, y));
@@ -1257,7 +1224,7 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
}
if (lines.size() > 2) {
- VS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, colorv);
+ RS::get_singleton()->canvas_item_add_multiline(get_canvas_item(), lines, colorv);
}
int limit = to_x - from_x - 4;
@@ -1266,26 +1233,25 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
}
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect(rect, accent, false);
}
} else {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
Rect2 rect(Vector2(p_x, int(get_size().height - fh) / 2), Size2(fh, fh));
- Color color = get_color("font_color", "Label");
+ Color color = get_theme_color("font_color", "Label");
draw_rect(rect, color);
if (p_selected) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
draw_rect(rect, accent, false);
}
}
}
void AnimationTrackEditTypeAnimation::set_node(Object *p_object) {
-
id = p_object->get_instance_id();
}
@@ -1294,23 +1260,19 @@ AnimationTrackEditTypeAnimation::AnimationTrackEditTypeAnimation() {
/////////
AnimationTrackEdit *AnimationTrackEditDefaultPlugin::create_value_track_edit(Object *p_object, Variant::Type p_type, const String &p_property, PropertyHint p_hint, const String &p_hint_string, int p_usage) {
-
if (p_property == "playing" && (p_object->is_class("AudioStreamPlayer") || p_object->is_class("AudioStreamPlayer2D") || p_object->is_class("AudioStreamPlayer3D"))) {
-
AnimationTrackEditAudio *audio = memnew(AnimationTrackEditAudio);
audio->set_node(p_object);
return audio;
}
- if (p_property == "frame" && (p_object->is_class("Sprite") || p_object->is_class("Sprite3D") || p_object->is_class("AnimatedSprite") || p_object->is_class("AnimatedSprite3D"))) {
-
+ if (p_property == "frame" && (p_object->is_class("Sprite2D") || p_object->is_class("Sprite3D") || p_object->is_class("AnimatedSprite2D") || p_object->is_class("AnimatedSprite3D"))) {
AnimationTrackEditSpriteFrame *sprite = memnew(AnimationTrackEditSpriteFrame);
sprite->set_node(p_object);
return sprite;
}
- if (p_property == "frame_coords" && (p_object->is_class("Sprite") || p_object->is_class("Sprite3D"))) {
-
+ if (p_property == "frame_coords" && (p_object->is_class("Sprite2D") || p_object->is_class("Sprite3D"))) {
AnimationTrackEditSpriteFrame *sprite = memnew(AnimationTrackEditSpriteFrame);
sprite->set_as_coords();
sprite->set_node(p_object);
@@ -1318,14 +1280,12 @@ AnimationTrackEdit *AnimationTrackEditDefaultPlugin::create_value_track_edit(Obj
}
if (p_property == "current_animation" && (p_object->is_class("AnimationPlayer"))) {
-
AnimationTrackEditSubAnim *player = memnew(AnimationTrackEditSubAnim);
player->set_node(p_object);
return player;
}
if (p_property == "volume_db") {
-
AnimationTrackEditVolumeDB *vu = memnew(AnimationTrackEditVolumeDB);
return vu;
}
@@ -1337,16 +1297,14 @@ AnimationTrackEdit *AnimationTrackEditDefaultPlugin::create_value_track_edit(Obj
return memnew(AnimationTrackEditColor);
}
- return NULL;
+ return nullptr;
}
AnimationTrackEdit *AnimationTrackEditDefaultPlugin::create_audio_track_edit() {
-
return memnew(AnimationTrackEditTypeAudio);
}
AnimationTrackEdit *AnimationTrackEditDefaultPlugin::create_animation_track_edit(Object *p_object) {
-
AnimationTrackEditTypeAnimation *an = memnew(AnimationTrackEditTypeAnimation);
an->set_node(p_object);
return an;
diff --git a/editor/animation_track_editor_plugins.h b/editor/animation_track_editor_plugins.h
index 4a21ca4d27..7c5d7ae04f 100644
--- a/editor/animation_track_editor_plugins.h
+++ b/editor/animation_track_editor_plugins.h
@@ -35,25 +35,25 @@
class AnimationTrackEditBool : public AnimationTrackEdit {
GDCLASS(AnimationTrackEditBool, AnimationTrackEdit);
- Ref<Texture> icon_checked;
- Ref<Texture> icon_unchecked;
+ Ref<Texture2D> icon_checked;
+ Ref<Texture2D> icon_unchecked;
public:
- virtual int get_key_height() const;
- virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
- virtual bool is_key_selectable_by_distance() const;
- virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right);
+ virtual int get_key_height() const override;
+ virtual Rect2 get_key_rect(int p_index, float p_pixels_sec) override;
+ virtual bool is_key_selectable_by_distance() const override;
+ virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) override;
};
class AnimationTrackEditColor : public AnimationTrackEdit {
GDCLASS(AnimationTrackEditColor, AnimationTrackEdit);
public:
- virtual int get_key_height() const;
- virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
- virtual bool is_key_selectable_by_distance() const;
- virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right);
- virtual void draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right);
+ virtual int get_key_height() const override;
+ virtual Rect2 get_key_rect(int p_index, float p_pixels_sec) override;
+ virtual bool is_key_selectable_by_distance() const override;
+ virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) override;
+ virtual void draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right) override;
};
class AnimationTrackEditAudio : public AnimationTrackEdit {
@@ -67,10 +67,10 @@ protected:
static void _bind_methods();
public:
- virtual int get_key_height() const;
- virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
- virtual bool is_key_selectable_by_distance() const;
- virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right);
+ virtual int get_key_height() const override;
+ virtual Rect2 get_key_rect(int p_index, float p_pixels_sec) override;
+ virtual bool is_key_selectable_by_distance() const override;
+ virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) override;
void set_node(Object *p_object);
@@ -84,10 +84,10 @@ class AnimationTrackEditSpriteFrame : public AnimationTrackEdit {
bool is_coords;
public:
- virtual int get_key_height() const;
- virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
- virtual bool is_key_selectable_by_distance() const;
- virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right);
+ virtual int get_key_height() const override;
+ virtual Rect2 get_key_rect(int p_index, float p_pixels_sec) override;
+ virtual bool is_key_selectable_by_distance() const override;
+ virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) override;
void set_node(Object *p_object);
void set_as_coords();
@@ -101,10 +101,10 @@ class AnimationTrackEditSubAnim : public AnimationTrackEdit {
ObjectID id;
public:
- virtual int get_key_height() const;
- virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
- virtual bool is_key_selectable_by_distance() const;
- virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right);
+ virtual int get_key_height() const override;
+ virtual Rect2 get_key_rect(int p_index, float p_pixels_sec) override;
+ virtual bool is_key_selectable_by_distance() const override;
+ virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) override;
void set_node(Object *p_object);
};
@@ -124,15 +124,15 @@ protected:
static void _bind_methods();
public:
- virtual void _gui_input(const Ref<InputEvent> &p_event);
+ virtual void _gui_input(const Ref<InputEvent> &p_event) override;
- virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
- virtual void drop_data(const Point2 &p_point, const Variant &p_data);
+ virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override;
+ virtual void drop_data(const Point2 &p_point, const Variant &p_data) override;
- virtual int get_key_height() const;
- virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
- virtual bool is_key_selectable_by_distance() const;
- virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right);
+ virtual int get_key_height() const override;
+ virtual Rect2 get_key_rect(int p_index, float p_pixels_sec) override;
+ virtual bool is_key_selectable_by_distance() const override;
+ virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) override;
AnimationTrackEditTypeAudio();
};
@@ -143,10 +143,10 @@ class AnimationTrackEditTypeAnimation : public AnimationTrackEdit {
ObjectID id;
public:
- virtual int get_key_height() const;
- virtual Rect2 get_key_rect(int p_index, float p_pixels_sec);
- virtual bool is_key_selectable_by_distance() const;
- virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right);
+ virtual int get_key_height() const override;
+ virtual Rect2 get_key_rect(int p_index, float p_pixels_sec) override;
+ virtual bool is_key_selectable_by_distance() const override;
+ virtual void draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) override;
void set_node(Object *p_object);
AnimationTrackEditTypeAnimation();
@@ -156,19 +156,19 @@ class AnimationTrackEditVolumeDB : public AnimationTrackEdit {
GDCLASS(AnimationTrackEditVolumeDB, AnimationTrackEdit);
public:
- virtual void draw_bg(int p_clip_left, int p_clip_right);
- virtual void draw_fg(int p_clip_left, int p_clip_right);
- virtual int get_key_height() const;
- virtual void draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right);
+ virtual void draw_bg(int p_clip_left, int p_clip_right) override;
+ virtual void draw_fg(int p_clip_left, int p_clip_right) override;
+ virtual int get_key_height() const override;
+ virtual void draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right) override;
};
class AnimationTrackEditDefaultPlugin : public AnimationTrackEditPlugin {
GDCLASS(AnimationTrackEditDefaultPlugin, AnimationTrackEditPlugin);
public:
- virtual AnimationTrackEdit *create_value_track_edit(Object *p_object, Variant::Type p_type, const String &p_property, PropertyHint p_hint, const String &p_hint_string, int p_usage);
- virtual AnimationTrackEdit *create_audio_track_edit();
- virtual AnimationTrackEdit *create_animation_track_edit(Object *p_object);
+ virtual AnimationTrackEdit *create_value_track_edit(Object *p_object, Variant::Type p_type, const String &p_property, PropertyHint p_hint, const String &p_hint_string, int p_usage) override;
+ virtual AnimationTrackEdit *create_audio_track_edit() override;
+ virtual AnimationTrackEdit *create_animation_track_edit(Object *p_object) override;
};
#endif // ANIMATION_TRACK_EDITOR_PLUGINS_H
diff --git a/editor/array_property_edit.cpp b/editor/array_property_edit.cpp
index 8cbc6a8dff..20f947e707 100644
--- a/editor/array_property_edit.cpp
+++ b/editor/array_property_edit.cpp
@@ -36,14 +36,14 @@
#define ITEMS_PER_PAGE 100
Variant ArrayPropertyEdit::get_array() const {
-
Object *o = ObjectDB::get_instance(obj);
- if (!o)
+ if (!o) {
return Array();
+ }
Variant arr = o->get(property);
if (!arr.is_array()) {
- Variant::CallError ce;
- arr = Variant::construct(default_type, NULL, 0, ce);
+ Callable::CallError ce;
+ arr = Variant::construct(default_type, nullptr, 0, ce);
}
return arr;
}
@@ -51,47 +51,45 @@ Variant ArrayPropertyEdit::get_array() const {
void ArrayPropertyEdit::_notif_change() {
_change_notify();
}
-void ArrayPropertyEdit::_notif_changev(const String &p_v) {
+void ArrayPropertyEdit::_notif_changev(const String &p_v) {
_change_notify(p_v.utf8().get_data());
}
void ArrayPropertyEdit::_set_size(int p_size) {
-
Variant arr = get_array();
arr.call("resize", p_size);
Object *o = ObjectDB::get_instance(obj);
- if (!o)
+ if (!o) {
return;
+ }
o->set(property, arr);
}
void ArrayPropertyEdit::_set_value(int p_idx, const Variant &p_value) {
-
Variant arr = get_array();
arr.set(p_idx, p_value);
Object *o = ObjectDB::get_instance(obj);
- if (!o)
+ if (!o) {
return;
+ }
o->set(property, arr);
}
bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) {
-
String pn = p_name;
if (pn.begins_with("array/")) {
-
if (pn == "array/size") {
-
Variant arr = get_array();
int size = arr.call("size");
int newsize = p_value;
- if (newsize == size)
+ if (newsize == size) {
return true;
+ }
UndoRedo *ur = EditorNode::get_undo_redo();
ur->create_action(TTR("Resize Array"));
@@ -102,15 +100,14 @@ bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) {
ur->add_undo_method(this, "_set_value", i, arr.get(i));
}
} else if (newsize > size) {
-
Variant init;
- Variant::CallError ce;
+ Callable::CallError ce;
Variant::Type new_type = subtype;
if (new_type == Variant::NIL && size) {
new_type = arr.get(size - 1).get_type();
}
if (new_type != Variant::NIL) {
- init = Variant::construct(new_type, NULL, 0, ce);
+ init = Variant::construct(new_type, nullptr, 0, ce);
for (int i = size; i < newsize; i++) {
ur->add_do_method(this, "_set_value", i, init);
}
@@ -128,7 +125,6 @@ bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) {
}
} else if (pn.begins_with("indices")) {
-
if (pn.find("_") != -1) {
//type
int idx = pn.get_slicec('/', 1).get_slicec('_', 0).to_int();
@@ -139,8 +135,8 @@ bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) {
Variant value = arr.get(idx);
if (value.get_type() != type && type >= 0 && type < Variant::VARIANT_MAX) {
- Variant::CallError ce;
- Variant new_value = Variant::construct(Variant::Type(type), NULL, 0, ce);
+ Callable::CallError ce;
+ Variant new_value = Variant::construct(Variant::Type(type), nullptr, 0, ce);
UndoRedo *ur = EditorNode::get_undo_redo();
ur->create_action(TTR("Change Array Value Type"));
@@ -173,13 +169,11 @@ bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) {
}
bool ArrayPropertyEdit::_get(const StringName &p_name, Variant &r_ret) const {
-
Variant arr = get_array();
//int size = arr.call("size");
String pn = p_name;
if (pn.begins_with("array/")) {
-
if (pn == "array/size") {
r_ret = arr.call("size");
return true;
@@ -189,14 +183,14 @@ bool ArrayPropertyEdit::_get(const StringName &p_name, Variant &r_ret) const {
return true;
}
} else if (pn.begins_with("indices")) {
-
if (pn.find("_") != -1) {
//type
int idx = pn.get_slicec('/', 1).get_slicec('_', 0).to_int();
bool valid;
r_ret = arr.get(idx, &valid);
- if (valid)
+ if (valid) {
r_ret = r_ret.get_type();
+ }
return valid;
} else {
@@ -216,21 +210,20 @@ bool ArrayPropertyEdit::_get(const StringName &p_name, Variant &r_ret) const {
}
void ArrayPropertyEdit::_get_property_list(List<PropertyInfo> *p_list) const {
-
Variant arr = get_array();
int size = arr.call("size");
p_list->push_back(PropertyInfo(Variant::INT, "array/size", PROPERTY_HINT_RANGE, "0,100000,1"));
int pages = size / ITEMS_PER_PAGE;
- if (pages > 0)
+ if (pages > 0) {
p_list->push_back(PropertyInfo(Variant::INT, "array/page", PROPERTY_HINT_RANGE, "0," + itos(pages) + ",1"));
+ }
int offset = page * ITEMS_PER_PAGE;
int items = MIN(size - offset, ITEMS_PER_PAGE);
for (int i = 0; i < items; i++) {
-
Variant v = arr.get(i + offset);
bool is_typed = arr.get_type() != Variant::ARRAY || subtype != Variant::NIL;
@@ -260,7 +253,6 @@ void ArrayPropertyEdit::_get_property_list(List<PropertyInfo> *p_list) const {
}
void ArrayPropertyEdit::edit(Object *p_obj, const StringName &p_prop, const String &p_hint_string, Variant::Type p_deftype) {
-
page = 0;
property = p_prop;
obj = p_obj->get_instance_id();
@@ -284,7 +276,6 @@ void ArrayPropertyEdit::edit(Object *p_obj, const StringName &p_prop, const Stri
}
Node *ArrayPropertyEdit::get_node() {
-
return Object::cast_to<Node>(ObjectDB::get_instance(obj));
}
@@ -293,7 +284,6 @@ bool ArrayPropertyEdit::_dont_undo_redo() {
}
void ArrayPropertyEdit::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_set_size"), &ArrayPropertyEdit::_set_size);
ClassDB::bind_method(D_METHOD("_set_value"), &ArrayPropertyEdit::_set_value);
ClassDB::bind_method(D_METHOD("_notif_change"), &ArrayPropertyEdit::_notif_change);
@@ -304,9 +294,9 @@ void ArrayPropertyEdit::_bind_methods() {
ArrayPropertyEdit::ArrayPropertyEdit() {
page = 0;
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
-
- if (i > 0)
+ if (i > 0) {
vtypes += ",";
+ }
vtypes += Variant::get_type_name(Variant::Type(i));
}
default_type = Variant::NIL;
diff --git a/editor/array_property_edit.h b/editor/array_property_edit.h
index 675b842128..d91701ccaf 100644
--- a/editor/array_property_edit.h
+++ b/editor/array_property_edit.h
@@ -34,7 +34,6 @@
#include "scene/main/node.h"
class ArrayPropertyEdit : public Reference {
-
GDCLASS(ArrayPropertyEdit, Reference);
int page;
diff --git a/editor/audio_stream_preview.cpp b/editor/audio_stream_preview.cpp
index 64d435a901..9e4e157c96 100644
--- a/editor/audio_stream_preview.cpp
+++ b/editor/audio_stream_preview.cpp
@@ -35,10 +35,11 @@
float AudioStreamPreview::get_length() const {
return length;
}
-float AudioStreamPreview::get_max(float p_time, float p_time_next) const {
- if (length == 0)
+float AudioStreamPreview::get_max(float p_time, float p_time_next) const {
+ if (length == 0) {
return 0;
+ }
int max = preview.size() / 2;
int time_from = p_time / length * max;
@@ -53,7 +54,6 @@ float AudioStreamPreview::get_max(float p_time, float p_time_next) const {
uint8_t vmax = 0;
for (int i = time_from; i < time_to; i++) {
-
uint8_t v = preview[i * 2 + 1];
if (i == 0 || v > vmax) {
vmax = v;
@@ -62,10 +62,11 @@ float AudioStreamPreview::get_max(float p_time, float p_time_next) const {
return (vmax / 255.0) * 2.0 - 1.0;
}
-float AudioStreamPreview::get_min(float p_time, float p_time_next) const {
- if (length == 0)
+float AudioStreamPreview::get_min(float p_time, float p_time_next) const {
+ if (length == 0) {
return 0;
+ }
int max = preview.size() / 2;
int time_from = p_time / length * max;
@@ -80,7 +81,6 @@ float AudioStreamPreview::get_min(float p_time, float p_time_next) const {
uint8_t vmin = 255;
for (int i = time_from; i < time_to; i++) {
-
uint8_t v = preview[i * 2];
if (i == 0 || v < vmin) {
vmin = v;
@@ -101,7 +101,6 @@ void AudioStreamPreviewGenerator::_update_emit(ObjectID p_id) {
}
void AudioStreamPreviewGenerator::_preview_thread(void *p_preview) {
-
Preview *preview = (Preview *)p_preview;
float muxbuff_chunk_s = 0.25;
@@ -117,7 +116,6 @@ void AudioStreamPreviewGenerator::_preview_thread(void *p_preview) {
preview->playback->start();
while (frames_todo) {
-
int ofs_write = uint64_t(frames_total - frames_todo) * uint64_t(preview->preview->preview.size() / 2) / uint64_t(frames_total);
int to_read = MIN(frames_todo, mixbuff_chunk_frames);
int to_write = uint64_t(to_read) * uint64_t(preview->preview->preview.size() / 2) / uint64_t(frames_total);
@@ -137,7 +135,6 @@ void AudioStreamPreviewGenerator::_preview_thread(void *p_preview) {
}
for (int j = from; j < to; j++) {
-
max = MAX(max, mix_chunk[j].l);
max = MAX(max, mix_chunk[j].r);
@@ -199,8 +196,9 @@ Ref<AudioStreamPreview> AudioStreamPreviewGenerator::generate_preview(const Ref<
preview->preview->preview = maxmin;
preview->preview->length = len_s;
- if (preview->playback.is_valid())
+ if (preview->playback.is_valid()) {
preview->thread = Thread::create(_preview_thread, preview);
+ }
return preview->preview;
}
@@ -212,7 +210,7 @@ void AudioStreamPreviewGenerator::_bind_methods() {
ADD_SIGNAL(MethodInfo("preview_updated", PropertyInfo(Variant::INT, "obj_id")));
}
-AudioStreamPreviewGenerator *AudioStreamPreviewGenerator::singleton = NULL;
+AudioStreamPreviewGenerator *AudioStreamPreviewGenerator::singleton = nullptr;
void AudioStreamPreviewGenerator::_notification(int p_what) {
if (p_what == NOTIFICATION_PROCESS) {
@@ -221,7 +219,7 @@ void AudioStreamPreviewGenerator::_notification(int p_what) {
if (!E->get().generating) {
if (E->get().thread) {
Thread::wait_to_finish(E->get().thread);
- E->get().thread = NULL;
+ E->get().thread = nullptr;
}
if (!ObjectDB::get_instance(E->key())) { //no longer in use, get rid of preview
to_erase.push_back(E->key());
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index e05ace53da..ede6dde239 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -30,7 +30,7 @@
#include "code_editor.h"
-#include "core/os/input.h"
+#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "core/string_builder.h"
#include "editor/editor_scale.h"
@@ -40,8 +40,7 @@
#include "scene/gui/separator.h"
#include "scene/resources/dynamic_font.h"
-void GotoLineDialog::popup_find_line(TextEdit *p_edit) {
-
+void GotoLineDialog::popup_find_line(CodeEdit *p_edit) {
text_editor = p_edit;
line->set_text(itos(text_editor->cursor_get_line()));
@@ -51,28 +50,26 @@ void GotoLineDialog::popup_find_line(TextEdit *p_edit) {
}
int GotoLineDialog::get_line() const {
-
return line->get_text().to_int();
}
void GotoLineDialog::ok_pressed() {
-
- if (get_line() < 1 || get_line() > text_editor->get_line_count())
+ if (get_line() < 1 || get_line() > text_editor->get_line_count()) {
return;
+ }
text_editor->unfold_line(get_line() - 1);
text_editor->cursor_set_line(get_line() - 1);
hide();
}
GotoLineDialog::GotoLineDialog() {
-
set_title(TTR("Go to Line"));
VBoxContainer *vbc = memnew(VBoxContainer);
- vbc->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, 8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -8 * EDSCALE);
add_child(vbc);
Label *l = memnew(Label);
@@ -82,84 +79,76 @@ GotoLineDialog::GotoLineDialog() {
line = memnew(LineEdit);
vbc->add_child(line);
register_text_enter(line);
- text_editor = NULL;
+ text_editor = nullptr;
set_hide_on_ok(false);
}
void FindReplaceBar::_notification(int p_what) {
-
if (p_what == NOTIFICATION_READY) {
-
- find_prev->set_icon(get_icon("MoveUp", "EditorIcons"));
- find_next->set_icon(get_icon("MoveDown", "EditorIcons"));
- hide_button->set_normal_texture(get_icon("Close", "EditorIcons"));
- hide_button->set_hover_texture(get_icon("Close", "EditorIcons"));
- hide_button->set_pressed_texture(get_icon("Close", "EditorIcons"));
+ find_prev->set_icon(get_theme_icon("MoveUp", "EditorIcons"));
+ find_next->set_icon(get_theme_icon("MoveDown", "EditorIcons"));
+ hide_button->set_normal_texture(get_theme_icon("Close", "EditorIcons"));
+ hide_button->set_hover_texture(get_theme_icon("Close", "EditorIcons"));
+ hide_button->set_pressed_texture(get_theme_icon("Close", "EditorIcons"));
hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size());
} else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
-
set_process_unhandled_input(is_visible_in_tree());
} else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-
- find_prev->set_icon(get_icon("MoveUp", "EditorIcons"));
- find_next->set_icon(get_icon("MoveDown", "EditorIcons"));
- hide_button->set_normal_texture(get_icon("Close", "EditorIcons"));
- hide_button->set_hover_texture(get_icon("Close", "EditorIcons"));
- hide_button->set_pressed_texture(get_icon("Close", "EditorIcons"));
+ find_prev->set_icon(get_theme_icon("MoveUp", "EditorIcons"));
+ find_next->set_icon(get_theme_icon("MoveDown", "EditorIcons"));
+ hide_button->set_normal_texture(get_theme_icon("Close", "EditorIcons"));
+ hide_button->set_hover_texture(get_theme_icon("Close", "EditorIcons"));
+ hide_button->set_pressed_texture(get_theme_icon("Close", "EditorIcons"));
hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size());
} else if (p_what == NOTIFICATION_THEME_CHANGED) {
- matches_label->add_color_override("font_color", results_count > 0 ? get_color("font_color", "Label") : get_color("error_color", "Editor"));
+ matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color("font_color", "Label") : get_theme_color("error_color", "Editor"));
}
}
void FindReplaceBar::_unhandled_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventKey> k = p_event;
- if (k.is_valid()) {
-
- if (k->is_pressed() && (text_edit->has_focus() || vbc_lineedit->is_a_parent_of(get_focus_owner()))) {
-
- bool accepted = true;
-
- switch (k->get_scancode()) {
-
- case KEY_ESCAPE: {
+ if (!k.is_valid() || !k->is_pressed()) {
+ return;
+ }
- _hide_bar();
- } break;
- default: {
+ Control *focus_owner = get_focus_owner();
+ if (text_editor->has_focus() || (focus_owner && vbc_lineedit->is_a_parent_of(focus_owner))) {
+ bool accepted = true;
- accepted = false;
- } break;
- }
+ switch (k->get_keycode()) {
+ case KEY_ESCAPE: {
+ _hide_bar();
+ } break;
+ default: {
+ accepted = false;
+ } break;
+ }
- if (accepted) {
- accept_event();
- }
+ if (accepted) {
+ accept_event();
}
}
}
bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col) {
-
int line, col;
String text = get_search_text();
- bool found = text_edit->search(text, p_flags, p_from_line, p_from_col, line, col);
+ bool found = text_editor->search(text, p_flags, p_from_line, p_from_col, line, col);
if (found) {
if (!preserve_cursor) {
- text_edit->unfold_line(line);
- text_edit->cursor_set_line(line, false);
- text_edit->cursor_set_column(col + text.length(), false);
- text_edit->center_viewport_to_cursor();
- text_edit->select(line, col, line, col + text.length());
+ text_editor->unfold_line(line);
+ text_editor->cursor_set_line(line, false);
+ text_editor->cursor_set_column(col + text.length(), false);
+ text_editor->center_viewport_to_cursor();
+ text_editor->select(line, col, line, col + text.length());
}
- text_edit->set_search_text(text);
- text_edit->set_search_flags(p_flags);
- text_edit->set_current_search_result(line, col);
+ text_editor->set_search_text(text);
+ text_editor->set_search_flags(p_flags);
+ text_editor->set_current_search_result(line, col);
result_line = line;
result_col = col;
@@ -169,9 +158,9 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col)
results_count = 0;
result_line = -1;
result_col = -1;
- text_edit->set_search_text("");
- text_edit->set_search_flags(p_flags);
- text_edit->set_current_search_result(line, col);
+ text_editor->set_search_text("");
+ text_editor->set_search_flags(p_flags);
+ text_editor->set_current_search_result(line, col);
}
_update_matches_label();
@@ -180,42 +169,67 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col)
}
void FindReplaceBar::_replace() {
+ bool selection_enabled = text_editor->is_selection_active();
+ Point2i selection_begin, selection_end;
+ if (selection_enabled) {
+ selection_begin = Point2i(text_editor->get_selection_from_line(), text_editor->get_selection_from_column());
+ selection_end = Point2i(text_editor->get_selection_to_line(), text_editor->get_selection_to_column());
+ }
- if (result_line != -1 && result_col != -1) {
- text_edit->begin_complex_operation();
+ String replace_text = get_replace_text();
+ int search_text_len = get_search_text().length();
- text_edit->unfold_line(result_line);
- text_edit->select(result_line, result_col, result_line, result_col + get_search_text().length());
- text_edit->insert_text_at_cursor(get_replace_text());
+ text_editor->begin_complex_operation();
+ if (selection_enabled && is_selection_only()) { // To restrict search_current() to selected region
+ text_editor->cursor_set_line(selection_begin.width);
+ text_editor->cursor_set_column(selection_begin.height);
+ }
- text_edit->end_complex_operation();
+ if (search_current()) {
+ text_editor->unfold_line(result_line);
+ text_editor->select(result_line, result_col, result_line, result_col + search_text_len);
- results_count = -1;
+ if (selection_enabled && is_selection_only()) {
+ Point2i match_from(result_line, result_col);
+ Point2i match_to(result_line, result_col + search_text_len);
+ if (!(match_from < selection_begin || match_to > selection_end)) {
+ text_editor->insert_text_at_cursor(replace_text);
+ if (match_to.x == selection_end.x) { // Adjust selection bounds if necessary
+ selection_end.y += replace_text.length() - search_text_len;
+ }
+ }
+ } else {
+ text_editor->insert_text_at_cursor(replace_text);
+ }
}
+ text_editor->end_complex_operation();
+ results_count = -1;
- if (!search_current()) {
- search_next();
+ if (selection_enabled && is_selection_only()) {
+ // Reselect in order to keep 'Replace' restricted to selection
+ text_editor->select(selection_begin.x, selection_begin.y, selection_end.x, selection_end.y);
+ } else {
+ text_editor->deselect();
}
}
void FindReplaceBar::_replace_all() {
-
- text_edit->disconnect("text_changed", this, "_editor_text_changed");
+ text_editor->disconnect("text_changed", callable_mp(this, &FindReplaceBar::_editor_text_changed));
// Line as x so it gets priority in comparison, column as y.
- Point2i orig_cursor(text_edit->cursor_get_line(), text_edit->cursor_get_column());
+ Point2i orig_cursor(text_editor->cursor_get_line(), text_editor->cursor_get_column());
Point2i prev_match = Point2(-1, -1);
- bool selection_enabled = text_edit->is_selection_active();
+ bool selection_enabled = text_editor->is_selection_active();
Point2i selection_begin, selection_end;
if (selection_enabled) {
- selection_begin = Point2i(text_edit->get_selection_from_line(), text_edit->get_selection_from_column());
- selection_end = Point2i(text_edit->get_selection_to_line(), text_edit->get_selection_to_column());
+ selection_begin = Point2i(text_editor->get_selection_from_line(), text_editor->get_selection_from_column());
+ selection_end = Point2i(text_editor->get_selection_to_line(), text_editor->get_selection_to_column());
}
- int vsval = text_edit->get_v_scroll();
+ int vsval = text_editor->get_v_scroll();
- text_edit->cursor_set_line(0);
- text_edit->cursor_set_column(0);
+ text_editor->cursor_set_line(0);
+ text_editor->cursor_set_column(0);
String replace_text = get_replace_text();
int search_text_len = get_search_text().length();
@@ -224,8 +238,12 @@ void FindReplaceBar::_replace_all() {
replace_all_mode = true;
- text_edit->begin_complex_operation();
+ text_editor->begin_complex_operation();
+ if (selection_enabled && is_selection_only()) {
+ text_editor->cursor_set_line(selection_begin.width);
+ text_editor->cursor_set_column(selection_begin.height);
+ }
if (search_current()) {
do {
// replace area
@@ -238,56 +256,59 @@ void FindReplaceBar::_replace_all() {
prev_match = Point2i(result_line, result_col + replace_text.length());
- text_edit->unfold_line(result_line);
- text_edit->select(result_line, result_col, result_line, match_to.y);
+ text_editor->unfold_line(result_line);
+ text_editor->select(result_line, result_col, result_line, match_to.y);
if (selection_enabled && is_selection_only()) {
if (match_from < selection_begin || match_to > selection_end) {
- continue;
+ break; // Done.
}
// Replace but adjust selection bounds.
- text_edit->insert_text_at_cursor(replace_text);
+ text_editor->insert_text_at_cursor(replace_text);
if (match_to.x == selection_end.x) {
selection_end.y += replace_text.length() - search_text_len;
}
} else {
// Just replace.
- text_edit->insert_text_at_cursor(replace_text);
+ text_editor->insert_text_at_cursor(replace_text);
}
rc++;
} while (search_next());
}
- text_edit->end_complex_operation();
+ text_editor->end_complex_operation();
replace_all_mode = false;
// Restore editor state (selection, cursor, scroll).
- text_edit->cursor_set_line(orig_cursor.x);
- text_edit->cursor_set_column(orig_cursor.y);
+ text_editor->cursor_set_line(orig_cursor.x);
+ text_editor->cursor_set_column(orig_cursor.y);
if (selection_enabled && is_selection_only()) {
// Reselect.
- text_edit->select(selection_begin.x, selection_begin.y, selection_end.x, selection_end.y);
+ text_editor->select(selection_begin.x, selection_begin.y, selection_end.x, selection_end.y);
} else {
- text_edit->deselect();
+ text_editor->deselect();
}
- text_edit->set_v_scroll(vsval);
- matches_label->add_color_override("font_color", rc > 0 ? get_color("font_color", "Label") : get_color("error_color", "Editor"));
+ text_editor->set_v_scroll(vsval);
+ matches_label->add_theme_color_override("font_color", rc > 0 ? get_theme_color("font_color", "Label") : get_theme_color("error_color", "Editor"));
matches_label->set_text(vformat(TTR("%d replaced."), rc));
- text_edit->call_deferred("connect", "text_changed", this, "_editor_text_changed");
+ text_editor->call_deferred("connect", "text_changed", Callable(this, "_editor_text_changed"));
results_count = -1;
}
void FindReplaceBar::_get_search_from(int &r_line, int &r_col) {
+ r_line = text_editor->cursor_get_line();
+ r_col = text_editor->cursor_get_column();
- r_line = text_edit->cursor_get_line();
- r_col = text_edit->cursor_get_column();
+ if (text_editor->is_selection_active() && is_selection_only()) {
+ return;
+ }
if (r_line == result_line && r_col >= result_col && r_col <= result_col + get_search_text().length()) {
r_col = result_col;
@@ -295,55 +316,63 @@ void FindReplaceBar::_get_search_from(int &r_line, int &r_col) {
}
void FindReplaceBar::_update_results_count() {
- if (results_count != -1)
+ if (results_count != -1) {
return;
+ }
results_count = 0;
String searched = get_search_text();
- if (searched.empty()) return;
+ if (searched.empty()) {
+ return;
+ }
- String full_text = text_edit->get_text();
+ String full_text = text_editor->get_text();
int from_pos = 0;
while (true) {
int pos = is_case_sensitive() ? full_text.find(searched, from_pos) : full_text.findn(searched, from_pos);
- if (pos == -1) break;
+ if (pos == -1) {
+ break;
+ }
+ int pos_subsequent = pos + searched.length();
if (is_whole_words()) {
- from_pos++; // Making sure we won't hit the same match next time, if we get out via a continue.
- if (pos > 0 && !is_symbol(full_text[pos - 1]))
+ from_pos = pos + 1; // Making sure we won't hit the same match next time, if we get out via a continue.
+ if (pos > 0 && !(is_symbol(full_text[pos - 1]) || full_text[pos - 1] == '\n')) {
continue;
- if (pos + searched.length() < full_text.length() && !is_symbol(full_text[pos + searched.length()]))
+ }
+ if (pos_subsequent < full_text.length() && !(is_symbol(full_text[pos_subsequent]) || full_text[pos_subsequent] == '\n')) {
continue;
+ }
}
results_count++;
- from_pos = pos + searched.length();
+ from_pos = pos_subsequent;
}
}
void FindReplaceBar::_update_matches_label() {
-
if (search_text->get_text().empty() || results_count == -1) {
matches_label->hide();
} else {
matches_label->show();
- matches_label->add_color_override("font_color", results_count > 0 ? get_color("font_color", "Label") : get_color("error_color", "Editor"));
+ matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color("font_color", "Label") : get_theme_color("error_color", "Editor"));
matches_label->set_text(vformat(results_count == 1 ? TTR("%d match.") : TTR("%d matches."), results_count));
}
}
bool FindReplaceBar::search_current() {
-
uint32_t flags = 0;
- if (is_whole_words())
+ if (is_whole_words()) {
flags |= TextEdit::SEARCH_WHOLE_WORDS;
- if (is_case_sensitive())
+ }
+ if (is_case_sensitive()) {
flags |= TextEdit::SEARCH_MATCH_CASE;
+ }
int line, col;
_get_search_from(line, col);
@@ -352,62 +381,70 @@ bool FindReplaceBar::search_current() {
}
bool FindReplaceBar::search_prev() {
-
- if (!is_visible())
+ if (!is_visible()) {
popup_search(true);
+ }
uint32_t flags = 0;
String text = get_search_text();
- if (is_whole_words())
+ if (is_whole_words()) {
flags |= TextEdit::SEARCH_WHOLE_WORDS;
- if (is_case_sensitive())
+ }
+ if (is_case_sensitive()) {
flags |= TextEdit::SEARCH_MATCH_CASE;
+ }
flags |= TextEdit::SEARCH_BACKWARDS;
int line, col;
_get_search_from(line, col);
- if (text_edit->is_selection_active())
+ if (text_editor->is_selection_active()) {
col--; // Skip currently selected word.
+ }
col -= text.length();
if (col < 0) {
line -= 1;
- if (line < 0)
- line = text_edit->get_line_count() - 1;
- col = text_edit->get_line(line).length();
+ if (line < 0) {
+ line = text_editor->get_line_count() - 1;
+ }
+ col = text_editor->get_line(line).length();
}
return _search(flags, line, col);
}
bool FindReplaceBar::search_next() {
-
- if (!is_visible())
+ if (!is_visible()) {
popup_search(true);
+ }
uint32_t flags = 0;
String text;
- if (replace_all_mode)
+ if (replace_all_mode) {
text = get_replace_text();
- else
+ } else {
text = get_search_text();
+ }
- if (is_whole_words())
+ if (is_whole_words()) {
flags |= TextEdit::SEARCH_WHOLE_WORDS;
- if (is_case_sensitive())
+ }
+ if (is_case_sensitive()) {
flags |= TextEdit::SEARCH_MATCH_CASE;
+ }
int line, col;
_get_search_from(line, col);
if (line == result_line && col == result_col) {
col += text.length();
- if (col > text_edit->get_line(line).length()) {
+ if (col > text_editor->get_line(line).length()) {
line += 1;
- if (line >= text_edit->get_line_count())
+ if (line >= text_editor->get_line_count()) {
line = 0;
+ }
col = 0;
}
}
@@ -416,21 +453,21 @@ bool FindReplaceBar::search_next() {
}
void FindReplaceBar::_hide_bar() {
+ if (replace_text->has_focus() || search_text->has_focus()) {
+ text_editor->grab_focus();
+ }
- if (replace_text->has_focus() || search_text->has_focus())
- text_edit->grab_focus();
-
- text_edit->set_search_text("");
+ text_editor->set_search_text("");
result_line = -1;
result_col = -1;
hide();
}
void FindReplaceBar::_show_search(bool p_focus_replace, bool p_show_only) {
-
show();
- if (p_show_only)
+ if (p_show_only) {
return;
+ }
if (p_focus_replace) {
search_text->deselect();
@@ -440,8 +477,8 @@ void FindReplaceBar::_show_search(bool p_focus_replace, bool p_show_only) {
search_text->call_deferred("grab_focus");
}
- if (text_edit->is_selection_active() && !selection_only->is_pressed()) {
- search_text->set_text(text_edit->get_selection_text());
+ if (text_editor->is_selection_active() && !selection_only->is_pressed()) {
+ search_text->set_text(text_editor->get_selection_text());
}
if (!get_search_text().empty()) {
@@ -460,7 +497,6 @@ void FindReplaceBar::_show_search(bool p_focus_replace, bool p_show_only) {
}
void FindReplaceBar::popup_search(bool p_show_only) {
-
replace_text->hide();
hbc_button_replace->hide();
hbc_option_replace->hide();
@@ -469,26 +505,23 @@ void FindReplaceBar::popup_search(bool p_show_only) {
}
void FindReplaceBar::popup_replace() {
-
if (!replace_text->is_visible_in_tree()) {
replace_text->show();
hbc_button_replace->show();
hbc_option_replace->show();
}
- selection_only->set_pressed((text_edit->is_selection_active() && text_edit->get_selection_from_line() < text_edit->get_selection_to_line()));
+ selection_only->set_pressed((text_editor->is_selection_active() && text_editor->get_selection_from_line() < text_editor->get_selection_to_line()));
- _show_search(is_visible() || text_edit->is_selection_active());
+ _show_search(is_visible() || text_editor->is_selection_active());
}
void FindReplaceBar::_search_options_changed(bool p_pressed) {
-
results_count = -1;
search_current();
}
void FindReplaceBar::_editor_text_changed() {
-
results_count = -1;
if (is_visible_in_tree()) {
preserve_cursor = true;
@@ -498,13 +531,11 @@ void FindReplaceBar::_editor_text_changed() {
}
void FindReplaceBar::_search_text_changed(const String &p_text) {
-
results_count = -1;
search_current();
}
void FindReplaceBar::_search_text_entered(const String &p_text) {
-
if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
search_prev();
} else {
@@ -513,72 +544,57 @@ void FindReplaceBar::_search_text_entered(const String &p_text) {
}
void FindReplaceBar::_replace_text_entered(const String &p_text) {
-
- if (selection_only->is_pressed() && text_edit->is_selection_active()) {
+ if (selection_only->is_pressed() && text_editor->is_selection_active()) {
_replace_all();
_hide_bar();
+ } else if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
+ _replace();
+ search_prev();
+ } else {
+ _replace();
}
}
String FindReplaceBar::get_search_text() const {
-
return search_text->get_text();
}
String FindReplaceBar::get_replace_text() const {
-
return replace_text->get_text();
}
bool FindReplaceBar::is_case_sensitive() const {
-
return case_sensitive->is_pressed();
}
bool FindReplaceBar::is_whole_words() const {
-
return whole_words->is_pressed();
}
bool FindReplaceBar::is_selection_only() const {
-
return selection_only->is_pressed();
}
void FindReplaceBar::set_error(const String &p_label) {
-
emit_signal("error", p_label);
}
-void FindReplaceBar::set_text_edit(TextEdit *p_text_edit) {
-
+void FindReplaceBar::set_text_edit(CodeEdit *p_text_edit) {
results_count = -1;
- text_edit = p_text_edit;
- text_edit->connect("text_changed", this, "_editor_text_changed");
+ text_editor = p_text_edit;
+ text_editor->connect("text_changed", callable_mp(this, &FindReplaceBar::_editor_text_changed));
}
void FindReplaceBar::_bind_methods() {
-
ClassDB::bind_method("_unhandled_input", &FindReplaceBar::_unhandled_input);
- ClassDB::bind_method("_editor_text_changed", &FindReplaceBar::_editor_text_changed);
- ClassDB::bind_method("_search_text_changed", &FindReplaceBar::_search_text_changed);
- ClassDB::bind_method("_search_text_entered", &FindReplaceBar::_search_text_entered);
- ClassDB::bind_method("_replace_text_entered", &FindReplaceBar::_replace_text_entered);
ClassDB::bind_method("_search_current", &FindReplaceBar::search_current);
- ClassDB::bind_method("_search_next", &FindReplaceBar::search_next);
- ClassDB::bind_method("_search_prev", &FindReplaceBar::search_prev);
- ClassDB::bind_method("_replace_pressed", &FindReplaceBar::_replace);
- ClassDB::bind_method("_replace_all_pressed", &FindReplaceBar::_replace_all);
- ClassDB::bind_method("_search_options_changed", &FindReplaceBar::_search_options_changed);
- ClassDB::bind_method("_hide_pressed", &FindReplaceBar::_hide_bar);
ADD_SIGNAL(MethodInfo("search"));
ADD_SIGNAL(MethodInfo("error"));
}
FindReplaceBar::FindReplaceBar() {
-
results_count = -1;
replace_all_mode = false;
preserve_cursor = false;
@@ -608,61 +624,63 @@ FindReplaceBar::FindReplaceBar() {
search_text = memnew(LineEdit);
vbc_lineedit->add_child(search_text);
search_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
- search_text->connect("text_changed", this, "_search_text_changed");
- search_text->connect("text_entered", this, "_search_text_entered");
+ search_text->connect("text_changed", callable_mp(this, &FindReplaceBar::_search_text_changed));
+ search_text->connect("text_entered", callable_mp(this, &FindReplaceBar::_search_text_entered));
matches_label = memnew(Label);
hbc_button_search->add_child(matches_label);
matches_label->hide();
- find_prev = memnew(ToolButton);
+ find_prev = memnew(Button);
+ find_prev->set_flat(true);
hbc_button_search->add_child(find_prev);
find_prev->set_focus_mode(FOCUS_NONE);
- find_prev->connect("pressed", this, "_search_prev");
+ find_prev->connect("pressed", callable_mp(this, &FindReplaceBar::search_prev));
- find_next = memnew(ToolButton);
+ find_next = memnew(Button);
+ find_next->set_flat(true);
hbc_button_search->add_child(find_next);
find_next->set_focus_mode(FOCUS_NONE);
- find_next->connect("pressed", this, "_search_next");
+ find_next->connect("pressed", callable_mp(this, &FindReplaceBar::search_next));
case_sensitive = memnew(CheckBox);
hbc_option_search->add_child(case_sensitive);
case_sensitive->set_text(TTR("Match Case"));
case_sensitive->set_focus_mode(FOCUS_NONE);
- case_sensitive->connect("toggled", this, "_search_options_changed");
+ case_sensitive->connect("toggled", callable_mp(this, &FindReplaceBar::_search_options_changed));
whole_words = memnew(CheckBox);
hbc_option_search->add_child(whole_words);
whole_words->set_text(TTR("Whole Words"));
whole_words->set_focus_mode(FOCUS_NONE);
- whole_words->connect("toggled", this, "_search_options_changed");
+ whole_words->connect("toggled", callable_mp(this, &FindReplaceBar::_search_options_changed));
// replace toolbar
replace_text = memnew(LineEdit);
vbc_lineedit->add_child(replace_text);
replace_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
- replace_text->connect("text_entered", this, "_replace_text_entered");
+ replace_text->connect("text_entered", callable_mp(this, &FindReplaceBar::_replace_text_entered));
replace = memnew(Button);
hbc_button_replace->add_child(replace);
replace->set_text(TTR("Replace"));
- replace->connect("pressed", this, "_replace_pressed");
+ replace->connect("pressed", callable_mp(this, &FindReplaceBar::_replace));
replace_all = memnew(Button);
hbc_button_replace->add_child(replace_all);
replace_all->set_text(TTR("Replace All"));
- replace_all->connect("pressed", this, "_replace_all_pressed");
+ replace_all->connect("pressed", callable_mp(this, &FindReplaceBar::_replace_all));
selection_only = memnew(CheckBox);
hbc_option_replace->add_child(selection_only);
selection_only->set_text(TTR("Selection Only"));
selection_only->set_focus_mode(FOCUS_NONE);
- selection_only->connect("toggled", this, "_search_options_changed");
+ selection_only->connect("toggled", callable_mp(this, &FindReplaceBar::_search_options_changed));
hide_button = memnew(TextureButton);
add_child(hide_button);
hide_button->set_focus_mode(FOCUS_NONE);
- hide_button->connect("pressed", this, "_hide_pressed");
+ hide_button->connect("pressed", callable_mp(this, &FindReplaceBar::_hide_bar));
hide_button->set_v_size_flags(SIZE_SHRINK_CENTER);
}
@@ -671,10 +689,10 @@ FindReplaceBar::FindReplaceBar() {
// This function should be used to handle shortcuts that could otherwise
// be handled too late if they weren't handled here.
void CodeTextEditor::_input(const Ref<InputEvent> &event) {
-
const Ref<InputEventKey> key_event = event;
- if (!key_event.is_valid() || !key_event->is_pressed())
+ if (!key_event.is_valid() || !key_event->is_pressed() || !text_editor->has_focus()) {
return;
+ }
if (ED_IS_SHORTCUT("script_text_editor/move_up", key_event)) {
move_lines_up();
@@ -686,16 +704,23 @@ void CodeTextEditor::_input(const Ref<InputEvent> &event) {
accept_event();
return;
}
+ if (ED_IS_SHORTCUT("script_text_editor/delete_line", key_event)) {
+ delete_lines();
+ accept_event();
+ return;
+ }
+ if (ED_IS_SHORTCUT("script_text_editor/clone_down", key_event)) {
+ clone_lines_down();
+ accept_event();
+ return;
+ }
}
void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid()) {
-
if (mb->is_pressed() && mb->get_command()) {
-
if (mb->get_button_index() == BUTTON_WHEEL_UP) {
_zoom_in();
} else if (mb->get_button_index() == BUTTON_WHEEL_DOWN) {
@@ -706,8 +731,7 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMagnifyGesture> magnify_gesture = p_event;
if (magnify_gesture.is_valid()) {
-
- Ref<DynamicFont> font = text_editor->get_font("font");
+ Ref<DynamicFont> font = text_editor->get_theme_font("font");
if (font.is_valid()) {
if (font->get_size() != (int)font_size) {
@@ -724,7 +748,6 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> k = p_event;
if (k.is_valid()) {
-
if (k->is_pressed()) {
if (ED_IS_SHORTCUT("script_editor/zoom_in", p_event)) {
_zoom_in();
@@ -750,12 +773,13 @@ void CodeTextEditor::_zoom_out() {
}
void CodeTextEditor::_zoom_changed() {
- if (font_resize_timer->get_time_left() == 0)
+ if (font_resize_timer->get_time_left() == 0) {
font_resize_timer->start();
+ }
}
void CodeTextEditor::_reset_zoom() {
- Ref<DynamicFont> font = text_editor->get_font("font"); // Reset source font size to default.
+ Ref<DynamicFont> font = text_editor->get_theme_font("font"); // Reset source font size to default.
if (font.is_valid()) {
EditorSettings::get_singleton()->set("interface/editor/code_font_size", 14);
@@ -764,7 +788,6 @@ void CodeTextEditor::_reset_zoom() {
}
void CodeTextEditor::_line_col_changed() {
-
String line = text_editor->get_line(text_editor->cursor_get_line());
int positional_column = 0;
@@ -787,7 +810,6 @@ void CodeTextEditor::_line_col_changed() {
}
void CodeTextEditor::_text_changed() {
-
if (text_editor->is_insert_text_operation()) {
code_complete_timer->start();
}
@@ -796,13 +818,13 @@ void CodeTextEditor::_text_changed() {
}
void CodeTextEditor::_code_complete_timer_timeout() {
- if (!is_visible_in_tree())
+ if (!is_visible_in_tree()) {
return;
+ }
text_editor->query_code_comple();
}
void CodeTextEditor::_complete_request() {
-
List<ScriptCodeCompletionOption> entries;
String ctext = text_editor->get_text_for_completion();
_code_complete_script(ctext, &entries);
@@ -810,69 +832,75 @@ void CodeTextEditor::_complete_request() {
if (code_complete_func) {
code_complete_func(code_complete_ud, ctext, &entries, forced);
}
- if (entries.size() == 0)
+ if (entries.size() == 0) {
return;
+ }
for (List<ScriptCodeCompletionOption>::Element *E = entries.front(); E; E = E->next()) {
- E->get().icon = _get_completion_icon(E->get());
+ ScriptCodeCompletionOption *e = &E->get();
+ e->icon = _get_completion_icon(*e);
+ e->font_color = completion_font_color;
+ if (e->insert_text.begins_with("\"") || e->insert_text.begins_with("\'")) {
+ e->font_color = completion_string_color;
+ } else if (e->insert_text.begins_with("#") || e->insert_text.begins_with("//")) {
+ e->font_color = completion_comment_color;
+ }
}
text_editor->code_complete(entries, forced);
}
-Ref<Texture> CodeTextEditor::_get_completion_icon(const ScriptCodeCompletionOption &p_option) {
- Ref<Texture> tex;
+Ref<Texture2D> CodeTextEditor::_get_completion_icon(const ScriptCodeCompletionOption &p_option) {
+ Ref<Texture2D> tex;
switch (p_option.kind) {
case ScriptCodeCompletionOption::KIND_CLASS: {
- if (has_icon(p_option.display, "EditorIcons")) {
- tex = get_icon(p_option.display, "EditorIcons");
+ if (has_theme_icon(p_option.display, "EditorIcons")) {
+ tex = get_theme_icon(p_option.display, "EditorIcons");
} else {
- tex = get_icon("Object", "EditorIcons");
+ tex = get_theme_icon("Object", "EditorIcons");
}
} break;
case ScriptCodeCompletionOption::KIND_ENUM:
- tex = get_icon("Enum", "EditorIcons");
+ tex = get_theme_icon("Enum", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_FILE_PATH:
- tex = get_icon("File", "EditorIcons");
+ tex = get_theme_icon("File", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_NODE_PATH:
- tex = get_icon("NodePath", "EditorIcons");
+ tex = get_theme_icon("NodePath", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_VARIABLE:
- tex = get_icon("Variant", "EditorIcons");
+ tex = get_theme_icon("Variant", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_CONSTANT:
- tex = get_icon("MemberConstant", "EditorIcons");
+ tex = get_theme_icon("MemberConstant", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_MEMBER:
- tex = get_icon("MemberProperty", "EditorIcons");
+ tex = get_theme_icon("MemberProperty", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_SIGNAL:
- tex = get_icon("MemberSignal", "EditorIcons");
+ tex = get_theme_icon("MemberSignal", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_FUNCTION:
- tex = get_icon("MemberMethod", "EditorIcons");
+ tex = get_theme_icon("MemberMethod", "EditorIcons");
break;
case ScriptCodeCompletionOption::KIND_PLAIN_TEXT:
- tex = get_icon("CubeMesh", "EditorIcons");
+ tex = get_theme_icon("CubeMesh", "EditorIcons");
break;
default:
- tex = get_icon("String", "EditorIcons");
+ tex = get_theme_icon("String", "EditorIcons");
break;
}
return tex;
}
void CodeTextEditor::_font_resize_timeout() {
-
if (_add_font_size(font_resize_val)) {
font_resize_val = 0;
}
}
bool CodeTextEditor::_add_font_size(int p_delta) {
-
- Ref<DynamicFont> font = text_editor->get_font("font");
+ Ref<DynamicFont> font = text_editor->get_theme_font("font");
if (font.is_valid()) {
int new_size = CLAMP(font->get_size() + p_delta, 8 * EDSCALE, 96 * EDSCALE);
@@ -889,8 +917,10 @@ bool CodeTextEditor::_add_font_size(int p_delta) {
}
void CodeTextEditor::update_editor_settings() {
+ completion_font_color = EDITOR_GET("text_editor/highlighting/completion_font_color");
+ completion_string_color = EDITOR_GET("text_editor/highlighting/string_color");
+ completion_comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
- text_editor->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
text_editor->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_all_occurrences"));
text_editor->set_highlight_current_line(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_current_line"));
text_editor->set_indent_using_spaces(EditorSettings::get_singleton()->get("text_editor/indent/type"));
@@ -902,16 +932,15 @@ void CodeTextEditor::update_editor_settings() {
text_editor->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/navigation/v_scroll_speed"));
text_editor->set_draw_minimap(EditorSettings::get_singleton()->get("text_editor/navigation/show_minimap"));
text_editor->set_minimap_width((int)EditorSettings::get_singleton()->get("text_editor/navigation/minimap_width") * EDSCALE);
- text_editor->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_numbers"));
+ text_editor->set_draw_line_numbers(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_numbers"));
text_editor->set_line_numbers_zero_padded(EditorSettings::get_singleton()->get("text_editor/appearance/line_numbers_zero_padded"));
- text_editor->set_bookmark_gutter_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/show_bookmark_gutter"));
- text_editor->set_breakpoint_gutter_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/show_breakpoint_gutter"));
- text_editor->set_draw_info_gutter(EditorSettings::get_singleton()->get("text_editor/appearance/show_info_gutter"));
+ text_editor->set_draw_bookmarks_gutter(EditorSettings::get_singleton()->get("text_editor/appearance/show_bookmark_gutter"));
text_editor->set_hiding_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/code_folding"));
text_editor->set_draw_fold_gutter(EditorSettings::get_singleton()->get("text_editor/appearance/code_folding"));
text_editor->set_wrap_enabled(EditorSettings::get_singleton()->get("text_editor/appearance/word_wrap"));
- text_editor->set_show_line_length_guideline(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_length_guideline"));
- text_editor->set_line_length_guideline_column(EditorSettings::get_singleton()->get("text_editor/appearance/line_length_guideline_column"));
+ text_editor->set_show_line_length_guidelines(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_length_guidelines"));
+ text_editor->set_line_length_guideline_soft_column(EditorSettings::get_singleton()->get("text_editor/appearance/line_length_guideline_soft_column"));
+ text_editor->set_line_length_guideline_hard_column(EditorSettings::get_singleton()->get("text_editor/appearance/line_length_guideline_hard_column"));
text_editor->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/cursor/scroll_past_end_of_file"));
text_editor->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
text_editor->cursor_set_blink_enabled(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink"));
@@ -924,7 +953,6 @@ void CodeTextEditor::trim_trailing_whitespace() {
for (int i = 0; i < text_editor->get_line_count(); i++) {
String line = text_editor->get_line(i);
if (line.ends_with(" ") || line.ends_with("\t")) {
-
if (!trimed_whitespace) {
text_editor->begin_complex_operation();
trimed_whitespace = true;
@@ -1072,10 +1100,12 @@ void CodeTextEditor::convert_case(CaseStyle p_case) {
for (int i = begin; i <= end; i++) {
int len = text_editor->get_line(i).length();
- if (i == end)
+ if (i == end) {
len = end_col;
- if (i == begin)
+ }
+ if (i == begin) {
len -= begin_col;
+ }
String new_line = text_editor->get_line(i).substr(i == begin ? begin_col : 0, len);
switch (p_case) {
@@ -1113,8 +1143,9 @@ void CodeTextEditor::move_lines_up() {
int line_id = i;
int next_id = i - 1;
- if (line_id == 0 || next_id < 0)
+ if (line_id == 0 || next_id < 0) {
return;
+ }
text_editor->unfold_line(line_id);
text_editor->unfold_line(next_id);
@@ -1129,8 +1160,9 @@ void CodeTextEditor::move_lines_up() {
int line_id = text_editor->cursor_get_line();
int next_id = line_id - 1;
- if (line_id == 0 || next_id < 0)
+ if (line_id == 0 || next_id < 0) {
return;
+ }
text_editor->unfold_line(line_id);
text_editor->unfold_line(next_id);
@@ -1154,8 +1186,9 @@ void CodeTextEditor::move_lines_down() {
int line_id = i;
int next_id = i + 1;
- if (line_id == text_editor->get_line_count() - 1 || next_id > text_editor->get_line_count())
+ if (line_id == text_editor->get_line_count() - 1 || next_id > text_editor->get_line_count()) {
return;
+ }
text_editor->unfold_line(line_id);
text_editor->unfold_line(next_id);
@@ -1170,8 +1203,9 @@ void CodeTextEditor::move_lines_down() {
int line_id = text_editor->cursor_get_line();
int next_id = line_id + 1;
- if (line_id == text_editor->get_line_count() - 1 || next_id > text_editor->get_line_count())
+ if (line_id == text_editor->get_line_count() - 1 || next_id > text_editor->get_line_count()) {
return;
+ }
text_editor->unfold_line(line_id);
text_editor->unfold_line(next_id);
@@ -1251,7 +1285,7 @@ void CodeTextEditor::clone_lines_down() {
text_editor->cursor_set_line(cursor_new_line);
text_editor->cursor_set_column(cursor_new_column);
if (selection_active) {
- text_editor->select(to_line, to_column, 2 * to_line - from_line, 2 * to_column - from_column);
+ text_editor->select(to_line, to_column, 2 * to_line - from_line, to_line == from_line ? 2 * to_column - from_column : to_column);
}
text_editor->end_complex_operation();
@@ -1265,8 +1299,9 @@ void CodeTextEditor::toggle_inline_comment(const String &delimiter) {
int end = text_editor->get_selection_to_line();
// End of selection ends on the first column of the last line, ignore it.
- if (text_editor->get_selection_to_column() == 0)
+ if (text_editor->get_selection_to_column() == 0) {
end -= 1;
+ }
int col_to = text_editor->get_selection_to_column();
int cursor_pos = text_editor->cursor_get_column();
@@ -1298,14 +1333,17 @@ void CodeTextEditor::toggle_inline_comment(const String &delimiter) {
int offset = (is_commented ? -1 : 1) * delimiter.length();
int col_from = text_editor->get_selection_from_column() > 0 ? text_editor->get_selection_from_column() + offset : 0;
- if (is_commented && text_editor->cursor_get_column() == text_editor->get_line(text_editor->cursor_get_line()).length() + 1)
+ if (is_commented && text_editor->cursor_get_column() == text_editor->get_line(text_editor->cursor_get_line()).length() + 1) {
cursor_pos += 1;
+ }
- if (text_editor->get_selection_to_column() != 0 && col_to != text_editor->get_line(text_editor->get_selection_to_line()).length() + 1)
+ if (text_editor->get_selection_to_column() != 0 && col_to != text_editor->get_line(text_editor->get_selection_to_line()).length() + 1) {
col_to += offset;
+ }
- if (text_editor->cursor_get_column() != 0)
+ if (text_editor->cursor_get_column() != 0) {
cursor_pos += offset;
+ }
text_editor->select(begin, col_from, text_editor->get_selection_to_line(), col_to);
text_editor->cursor_set_column(cursor_pos);
@@ -1350,11 +1388,11 @@ void CodeTextEditor::goto_line_centered(int p_line) {
}
void CodeTextEditor::set_executing_line(int p_line) {
- text_editor->set_executing_line(p_line);
+ text_editor->set_line_as_executing(p_line, true);
}
void CodeTextEditor::clear_executing_line() {
- text_editor->clear_executing_line();
+ text_editor->clear_executing_lines();
}
Variant CodeTextEditor::get_edit_state() {
@@ -1365,8 +1403,8 @@ Variant CodeTextEditor::get_edit_state() {
state["column"] = text_editor->cursor_get_column();
state["row"] = text_editor->cursor_get_line();
- state["selection"] = get_text_edit()->is_selection_active();
- if (get_text_edit()->is_selection_active()) {
+ state["selection"] = get_text_editor()->is_selection_active();
+ if (get_text_editor()->is_selection_active()) {
state["selection_from_line"] = text_editor->get_selection_from_line();
state["selection_from_column"] = text_editor->get_selection_from_column();
state["selection_to_line"] = text_editor->get_selection_to_line();
@@ -1374,14 +1412,11 @@ Variant CodeTextEditor::get_edit_state() {
}
state["folded_lines"] = text_editor->get_folded_lines();
- state["breakpoints"] = text_editor->get_breakpoints_array();
- state["bookmarks"] = text_editor->get_bookmarks_array();
+ state["breakpoints"] = text_editor->get_breakpointed_lines();
+ state["bookmarks"] = text_editor->get_bookmarked_lines();
- state["syntax_highlighter"] = TTR("Standard");
- SyntaxHighlighter *syntax_highlighter = text_editor->_get_syntax_highlighting();
- if (syntax_highlighter) {
- state["syntax_highlighter"] = syntax_highlighter->get_name();
- }
+ Ref<EditorSyntaxHighlighter> syntax_highlighter = text_editor->get_syntax_highlighter();
+ state["syntax_highlighter"] = syntax_highlighter->_get_name();
return state;
}
@@ -1416,15 +1451,12 @@ void CodeTextEditor::set_edit_state(const Variant &p_state) {
if (state.has("bookmarks")) {
Array bookmarks = state["bookmarks"];
for (int i = 0; i < bookmarks.size(); i++) {
- text_editor->set_line_as_bookmark(bookmarks[i], true);
+ text_editor->set_line_as_bookmarked(bookmarks[i], true);
}
}
-
- text_editor->grab_focus();
}
void CodeTextEditor::set_error(const String &p_error) {
-
error->set_text(p_error);
if (p_error != "") {
error->set_default_cursor_shape(CURSOR_POINTING_HAND);
@@ -1447,24 +1479,23 @@ void CodeTextEditor::goto_error() {
}
void CodeTextEditor::_update_font() {
+ text_editor->add_theme_font_override("font", get_theme_font("source", "EditorFonts"));
- text_editor->add_font_override("font", get_font("source", "EditorFonts"));
+ error->add_theme_font_override("font", get_theme_font("status_source", "EditorFonts"));
+ error->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
- error->add_font_override("font", get_font("status_source", "EditorFonts"));
- error->add_color_override("font_color", get_color("error_color", "Editor"));
-
- Ref<Font> status_bar_font = get_font("status_source", "EditorFonts");
- error->add_font_override("font", status_bar_font);
+ Ref<Font> status_bar_font = get_theme_font("status_source", "EditorFonts");
+ error->add_theme_font_override("font", status_bar_font);
int count = status_bar->get_child_count();
for (int i = 0; i < count; i++) {
Control *n = Object::cast_to<Control>(status_bar->get_child(i));
- if (n)
- n->add_font_override("font", status_bar_font);
+ if (n) {
+ n->add_theme_font_override("font", status_bar_font);
+ }
}
}
void CodeTextEditor::_on_settings_change() {
-
_update_font();
font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
@@ -1510,18 +1541,17 @@ void CodeTextEditor::_set_show_warnings_panel(bool p_show) {
}
void CodeTextEditor::_toggle_scripts_pressed() {
- toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->toggle_scripts_panel() ? get_icon("Back", "EditorIcons") : get_icon("Forward", "EditorIcons"));
+ toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->toggle_scripts_panel() ? get_theme_icon("Back", "EditorIcons") : get_theme_icon("Forward", "EditorIcons"));
}
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() == BUTTON_LEFT) {
- emit_signal("error_pressed");
+ goto_error();
}
}
void CodeTextEditor::_notification(int p_what) {
-
switch (p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
_load_theme_settings();
@@ -1534,8 +1564,8 @@ void CodeTextEditor::_notification(int p_what) {
_update_font();
} break;
case NOTIFICATION_ENTER_TREE: {
- warning_button->set_icon(get_icon("NodeWarning", "EditorIcons"));
- add_constant_override("separation", 4 * EDSCALE);
+ warning_button->set_icon(get_theme_icon("NodeWarning", "EditorIcons"));
+ add_theme_constant_override("separation", 4 * EDSCALE);
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
if (toggle_scripts_button->is_visible()) {
@@ -1552,35 +1582,33 @@ void CodeTextEditor::set_warning_nb(int p_warning_nb) {
warning_count_label->set_text(itos(p_warning_nb));
warning_count_label->set_visible(p_warning_nb > 0);
warning_button->set_visible(p_warning_nb > 0);
- if (!p_warning_nb)
+ if (!p_warning_nb) {
_set_show_warnings_panel(false);
+ }
}
void CodeTextEditor::toggle_bookmark() {
-
int line = text_editor->cursor_get_line();
- text_editor->set_line_as_bookmark(line, !text_editor->is_line_set_as_bookmark(line));
+ text_editor->set_line_as_bookmarked(line, !text_editor->is_line_bookmarked(line));
}
void CodeTextEditor::goto_next_bookmark() {
-
- List<int> bmarks;
- text_editor->get_bookmarks(&bmarks);
+ Array bmarks = text_editor->get_bookmarked_lines();
if (bmarks.size() <= 0) {
return;
}
int line = text_editor->cursor_get_line();
- if (line >= bmarks[bmarks.size() - 1]) {
+ if (line >= (int)bmarks[bmarks.size() - 1]) {
text_editor->unfold_line(bmarks[0]);
text_editor->cursor_set_line(bmarks[0]);
text_editor->center_viewport_to_cursor();
} else {
- for (List<int>::Element *E = bmarks.front(); E; E = E->next()) {
- int bline = E->get();
- if (bline > line) {
- text_editor->unfold_line(bline);
- text_editor->cursor_set_line(bline);
+ for (int i = 0; i < bmarks.size(); i++) {
+ int bmark_line = bmarks[i];
+ if (bmark_line > line) {
+ text_editor->unfold_line(bmark_line);
+ text_editor->cursor_set_line(bmark_line);
text_editor->center_viewport_to_cursor();
return;
}
@@ -1589,24 +1617,22 @@ void CodeTextEditor::goto_next_bookmark() {
}
void CodeTextEditor::goto_prev_bookmark() {
-
- List<int> bmarks;
- text_editor->get_bookmarks(&bmarks);
+ Array bmarks = text_editor->get_bookmarked_lines();
if (bmarks.size() <= 0) {
return;
}
int line = text_editor->cursor_get_line();
- if (line <= bmarks[0]) {
+ if (line <= (int)bmarks[0]) {
text_editor->unfold_line(bmarks[bmarks.size() - 1]);
text_editor->cursor_set_line(bmarks[bmarks.size() - 1]);
text_editor->center_viewport_to_cursor();
} else {
- for (List<int>::Element *E = bmarks.back(); E; E = E->prev()) {
- int bline = E->get();
- if (bline < line) {
- text_editor->unfold_line(bline);
- text_editor->cursor_set_line(bline);
+ for (int i = bmarks.size(); i >= 0; i--) {
+ int bmark_line = bmarks[i];
+ if (bmark_line < line) {
+ text_editor->unfold_line(bmark_line);
+ text_editor->cursor_set_line(bmark_line);
text_editor->center_viewport_to_cursor();
return;
}
@@ -1615,35 +1641,15 @@ void CodeTextEditor::goto_prev_bookmark() {
}
void CodeTextEditor::remove_all_bookmarks() {
-
- List<int> bmarks;
- text_editor->get_bookmarks(&bmarks);
-
- for (List<int>::Element *E = bmarks.front(); E; E = E->next()) {
- text_editor->set_line_as_bookmark(E->get(), false);
- }
+ text_editor->clear_bookmarked_lines();
}
void CodeTextEditor::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_input"), &CodeTextEditor::_input);
- ClassDB::bind_method("_text_editor_gui_input", &CodeTextEditor::_text_editor_gui_input);
- ClassDB::bind_method("_line_col_changed", &CodeTextEditor::_line_col_changed);
- ClassDB::bind_method("_text_changed", &CodeTextEditor::_text_changed);
- ClassDB::bind_method("_on_settings_change", &CodeTextEditor::_on_settings_change);
- ClassDB::bind_method("_text_changed_idle_timeout", &CodeTextEditor::_text_changed_idle_timeout);
- ClassDB::bind_method("_code_complete_timer_timeout", &CodeTextEditor::_code_complete_timer_timeout);
- ClassDB::bind_method("_complete_request", &CodeTextEditor::_complete_request);
- ClassDB::bind_method("_font_resize_timeout", &CodeTextEditor::_font_resize_timeout);
- ClassDB::bind_method("_error_pressed", &CodeTextEditor::_error_pressed);
- ClassDB::bind_method("_toggle_scripts_pressed", &CodeTextEditor::_toggle_scripts_pressed);
- ClassDB::bind_method("_warning_button_pressed", &CodeTextEditor::_warning_button_pressed);
- ClassDB::bind_method("_warning_label_gui_input", &CodeTextEditor::_warning_label_gui_input);
ADD_SIGNAL(MethodInfo("validate_script"));
ADD_SIGNAL(MethodInfo("load_theme_settings"));
ADD_SIGNAL(MethodInfo("show_warnings_panel"));
- ADD_SIGNAL(MethodInfo("error_pressed"));
}
void CodeTextEditor::set_code_complete_func(CodeTextEditorCodeCompleteFunc p_code_complete_func, void *p_ud) {
@@ -1656,18 +1662,17 @@ void CodeTextEditor::show_toggle_scripts_button() {
}
void CodeTextEditor::update_toggle_scripts_button() {
- toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->is_scripts_panel_toggled() ? get_icon("Back", "EditorIcons") : get_icon("Forward", "EditorIcons"));
+ toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->is_scripts_panel_toggled() ? get_theme_icon("Back", "EditorIcons") : get_theme_icon("Forward", "EditorIcons"));
toggle_scripts_button->set_tooltip(TTR("Toggle Scripts Panel") + " (" + ED_GET_SHORTCUT("script_editor/toggle_scripts_panel")->get_as_text() + ")");
}
CodeTextEditor::CodeTextEditor() {
-
- code_complete_func = NULL;
+ code_complete_func = nullptr;
ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL);
ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS);
ED_SHORTCUT("script_editor/reset_zoom", TTR("Reset Zoom"), KEY_MASK_CMD | KEY_0);
- text_editor = memnew(TextEdit);
+ text_editor = memnew(CodeEdit);
add_child(text_editor);
text_editor->set_v_size_flags(SIZE_EXPAND_FILL);
@@ -1679,7 +1684,7 @@ CodeTextEditor::CodeTextEditor() {
find_replace_bar->set_text_edit(text_editor);
- text_editor->set_show_line_numbers(true);
+ text_editor->set_draw_line_numbers(true);
text_editor->set_brace_matching(true);
text_editor->set_auto_indent(true);
@@ -1701,8 +1706,9 @@ CodeTextEditor::CodeTextEditor() {
error_line = 0;
error_column = 0;
- toggle_scripts_button = memnew(ToolButton);
- toggle_scripts_button->connect("pressed", this, "_toggle_scripts_pressed");
+ toggle_scripts_button = memnew(Button);
+ toggle_scripts_button->set_flat(true);
+ toggle_scripts_button->connect("pressed", callable_mp(this, &CodeTextEditor::_toggle_scripts_pressed));
status_bar->add_child(toggle_scripts_button);
toggle_scripts_button->hide();
@@ -1717,15 +1723,16 @@ CodeTextEditor::CodeTextEditor() {
scroll->add_child(error);
error->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
error->set_mouse_filter(MOUSE_FILTER_STOP);
- error->connect("gui_input", this, "_error_pressed");
- find_replace_bar->connect("error", error, "set_text");
+ error->connect("gui_input", callable_mp(this, &CodeTextEditor::_error_pressed));
+ find_replace_bar->connect("error", callable_mp(error, &Label::set_text));
// Warnings
- warning_button = memnew(ToolButton);
+ warning_button = memnew(Button);
+ warning_button->set_flat(true);
status_bar->add_child(warning_button);
warning_button->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
warning_button->set_default_cursor_shape(CURSOR_POINTING_HAND);
- warning_button->connect("pressed", this, "_warning_button_pressed");
+ warning_button->connect("pressed", callable_mp(this, &CodeTextEditor::_warning_button_pressed));
warning_button->set_tooltip(TTR("Warnings"));
warning_count_label = memnew(Label);
@@ -1735,9 +1742,9 @@ CodeTextEditor::CodeTextEditor() {
warning_count_label->set_default_cursor_shape(CURSOR_POINTING_HAND);
warning_count_label->set_mouse_filter(MOUSE_FILTER_STOP);
warning_count_label->set_tooltip(TTR("Warnings"));
- warning_count_label->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("warning_color", "Editor"));
- warning_count_label->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
- warning_count_label->connect("gui_input", this, "_warning_label_gui_input");
+ warning_count_label->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("warning_color", "Editor"));
+ warning_count_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
+ warning_count_label->connect("gui_input", callable_mp(this, &CodeTextEditor::_warning_label_gui_input));
is_warnings_panel_opened = false;
set_warning_nb(0);
@@ -1746,24 +1753,25 @@ CodeTextEditor::CodeTextEditor() {
line_and_col_txt = memnew(Label);
status_bar->add_child(line_and_col_txt);
line_and_col_txt->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
- line_and_col_txt->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+ line_and_col_txt->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
line_and_col_txt->set_tooltip(TTR("Line and column numbers."));
line_and_col_txt->set_mouse_filter(MOUSE_FILTER_STOP);
- text_editor->connect("gui_input", this, "_text_editor_gui_input");
- text_editor->connect("cursor_changed", this, "_line_col_changed");
- text_editor->connect("text_changed", this, "_text_changed");
- text_editor->connect("request_completion", this, "_complete_request");
+ text_editor->connect("gui_input", callable_mp(this, &CodeTextEditor::_text_editor_gui_input));
+ text_editor->connect("cursor_changed", callable_mp(this, &CodeTextEditor::_line_col_changed));
+ text_editor->connect("text_changed", callable_mp(this, &CodeTextEditor::_text_changed));
+ text_editor->connect("request_completion", callable_mp(this, &CodeTextEditor::_complete_request));
Vector<String> cs;
cs.push_back(".");
cs.push_back(",");
cs.push_back("(");
cs.push_back("=");
cs.push_back("$");
+ cs.push_back("@");
text_editor->set_completion(true, cs);
- idle->connect("timeout", this, "_text_changed_idle_timeout");
+ idle->connect("timeout", callable_mp(this, &CodeTextEditor::_text_changed_idle_timeout));
- code_complete_timer->connect("timeout", this, "_code_complete_timer_timeout");
+ code_complete_timer->connect("timeout", callable_mp(this, &CodeTextEditor::_code_complete_timer_timeout));
font_resize_val = 0;
font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
@@ -1771,7 +1779,7 @@ CodeTextEditor::CodeTextEditor() {
add_child(font_resize_timer);
font_resize_timer->set_one_shot(true);
font_resize_timer->set_wait_time(0.07);
- font_resize_timer->connect("timeout", this, "_font_resize_timeout");
+ font_resize_timer->connect("timeout", callable_mp(this, &CodeTextEditor::_font_resize_timeout));
- EditorSettings::get_singleton()->connect("settings_changed", this, "_on_settings_change");
+ EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &CodeTextEditor::_on_settings_change));
}
diff --git a/editor/code_editor.h b/editor/code_editor.h
index fc06407166..b38170cbf5 100644
--- a/editor/code_editor.h
+++ b/editor/code_editor.h
@@ -34,39 +34,36 @@
#include "editor/editor_plugin.h"
#include "scene/gui/check_box.h"
#include "scene/gui/check_button.h"
+#include "scene/gui/code_edit.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/line_edit.h"
-#include "scene/gui/text_edit.h"
-#include "scene/gui/tool_button.h"
#include "scene/main/timer.h"
class GotoLineDialog : public ConfirmationDialog {
-
GDCLASS(GotoLineDialog, ConfirmationDialog);
Label *line_label;
LineEdit *line;
- TextEdit *text_editor;
+ CodeEdit *text_editor;
- virtual void ok_pressed();
+ virtual void ok_pressed() override;
public:
- void popup_find_line(TextEdit *p_edit);
+ void popup_find_line(CodeEdit *p_edit);
int get_line() const;
- void set_text_editor(TextEdit *p_text_editor);
+ void set_text_editor(CodeEdit *p_text_editor);
GotoLineDialog();
};
class FindReplaceBar : public HBoxContainer {
-
GDCLASS(FindReplaceBar, HBoxContainer);
LineEdit *search_text;
Label *matches_label;
- ToolButton *find_prev;
- ToolButton *find_next;
+ Button *find_prev;
+ Button *find_next;
CheckBox *case_sensitive;
CheckBox *whole_words;
TextureButton *hide_button;
@@ -80,7 +77,7 @@ class FindReplaceBar : public HBoxContainer {
HBoxContainer *hbc_button_replace;
HBoxContainer *hbc_option_replace;
- TextEdit *text_edit;
+ CodeEdit *text_editor;
int result_line;
int result_col;
@@ -123,7 +120,7 @@ public:
bool is_selection_only() const;
void set_error(const String &p_label);
- void set_text_edit(TextEdit *p_text_edit);
+ void set_text_edit(CodeEdit *p_text_edit);
void popup_search(bool p_show_only = false);
void popup_replace();
@@ -138,15 +135,14 @@ public:
typedef void (*CodeTextEditorCodeCompleteFunc)(void *p_ud, const String &p_code, List<ScriptCodeCompletionOption> *r_options, bool &r_forced);
class CodeTextEditor : public VBoxContainer {
-
GDCLASS(CodeTextEditor, VBoxContainer);
- TextEdit *text_editor;
+ CodeEdit *text_editor;
FindReplaceBar *find_replace_bar;
HBoxContainer *status_bar;
- ToolButton *toggle_scripts_button;
- ToolButton *warning_button;
+ Button *toggle_scripts_button;
+ Button *warning_button;
Label *warning_count_label;
Label *line_and_col_txt;
@@ -167,7 +163,7 @@ class CodeTextEditor : public VBoxContainer {
void _update_font();
void _complete_request();
- Ref<Texture> _get_completion_icon(const ScriptCodeCompletionOption &p_option);
+ Ref<Texture2D> _get_completion_icon(const ScriptCodeCompletionOption &p_option);
void _font_resize_timeout();
bool _add_font_size(int p_delta);
@@ -178,6 +174,9 @@ class CodeTextEditor : public VBoxContainer {
void _zoom_changed();
void _reset_zoom();
+ Color completion_font_color;
+ Color completion_string_color;
+ Color completion_comment_color;
CodeTextEditorCodeCompleteFunc code_complete_func;
void *code_complete_ud;
@@ -241,7 +240,7 @@ public:
void set_error(const String &p_error);
void set_error_pos(int p_line, int p_column);
void update_line_and_column() { _line_col_changed(); }
- TextEdit *get_text_edit() { return text_editor; }
+ CodeEdit *get_text_editor() { return text_editor; }
FindReplaceBar *get_find_replace_bar() { return find_replace_bar; }
virtual void apply_code() {}
void goto_error();
diff --git a/editor/collada/SCsub b/editor/collada/SCsub
deleted file mode 100644
index 2b1e889fb0..0000000000
--- a/editor/collada/SCsub
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-
-Import('env')
-
-env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/collada/collada.cpp b/editor/collada/collada.cpp
deleted file mode 100644
index 231173e459..0000000000
--- a/editor/collada/collada.cpp
+++ /dev/null
@@ -1,2574 +0,0 @@
-/*************************************************************************/
-/* collada.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "collada.h"
-
-#include <stdio.h>
-
-//#define DEBUG_DEFAULT_ANIMATION
-//#define DEBUG_COLLADA
-#ifdef DEBUG_COLLADA
-#define COLLADA_PRINT(m_what) print_line(m_what)
-#else
-#define COLLADA_PRINT(m_what)
-#endif
-
-#define COLLADA_IMPORT_SCALE_SCENE
-
-/* HELPERS */
-
-String Collada::Effect::get_texture_path(const String &p_source, Collada &state) const {
-
- const String &image = p_source;
- ERR_FAIL_COND_V(!state.state.image_map.has(image), "");
- return state.state.image_map[image].path;
-}
-
-Transform Collada::get_root_transform() const {
-
- Transform unit_scale_transform;
-#ifndef COLLADA_IMPORT_SCALE_SCENE
- unit_scale_transform.scale(Vector3(state.unit_scale, state.unit_scale, state.unit_scale));
-#endif
- return unit_scale_transform;
-}
-
-void Collada::Vertex::fix_unit_scale(Collada &state) {
-#ifdef COLLADA_IMPORT_SCALE_SCENE
- vertex *= state.state.unit_scale;
-#endif
-}
-
-static String _uri_to_id(const String &p_uri) {
-
- if (p_uri.begins_with("#"))
- return p_uri.substr(1, p_uri.size() - 1);
- else
- return p_uri;
-}
-
-/** HELPER FUNCTIONS **/
-
-Transform Collada::fix_transform(const Transform &p_transform) {
-
- Transform tr = p_transform;
-
-#ifndef NO_UP_AXIS_SWAP
-
- if (state.up_axis != Vector3::AXIS_Y) {
-
- for (int i = 0; i < 3; i++)
- SWAP(tr.basis[1][i], tr.basis[state.up_axis][i]);
- for (int i = 0; i < 3; i++)
- SWAP(tr.basis[i][1], tr.basis[i][state.up_axis]);
-
- SWAP(tr.origin[1], tr.origin[state.up_axis]);
-
- tr.basis[state.up_axis][0] = -tr.basis[state.up_axis][0];
- tr.basis[state.up_axis][1] = -tr.basis[state.up_axis][1];
- tr.basis[0][state.up_axis] = -tr.basis[0][state.up_axis];
- tr.basis[1][state.up_axis] = -tr.basis[1][state.up_axis];
- tr.origin[state.up_axis] = -tr.origin[state.up_axis];
- }
-#endif
-
- //tr.scale(Vector3(state.unit_scale.unit_scale.unit_scale));
- return tr;
- //return state.matrix_fix * p_transform;
-}
-
-static Transform _read_transform_from_array(const Vector<float> &array, int ofs = 0) {
-
- Transform tr;
- // i wonder why collada matrices are transposed, given that's opposed to opengl..
- tr.basis.elements[0][0] = array[0 + ofs];
- tr.basis.elements[0][1] = array[1 + ofs];
- tr.basis.elements[0][2] = array[2 + ofs];
- tr.basis.elements[1][0] = array[4 + ofs];
- tr.basis.elements[1][1] = array[5 + ofs];
- tr.basis.elements[1][2] = array[6 + ofs];
- tr.basis.elements[2][0] = array[8 + ofs];
- tr.basis.elements[2][1] = array[9 + ofs];
- tr.basis.elements[2][2] = array[10 + ofs];
- tr.origin.x = array[3 + ofs];
- tr.origin.y = array[7 + ofs];
- tr.origin.z = array[11 + ofs];
- return tr;
-}
-
-/* STRUCTURES */
-
-Transform Collada::Node::compute_transform(Collada &state) const {
-
- Transform xform;
-
- for (int i = 0; i < xform_list.size(); i++) {
-
- Transform xform_step;
- const XForm &xf = xform_list[i];
- switch (xf.op) {
-
- case XForm::OP_ROTATE: {
- if (xf.data.size() >= 4) {
-
- xform_step.rotate(Vector3(xf.data[0], xf.data[1], xf.data[2]), Math::deg2rad(xf.data[3]));
- }
- } break;
- case XForm::OP_SCALE: {
-
- if (xf.data.size() >= 3) {
-
- xform_step.scale(Vector3(xf.data[0], xf.data[1], xf.data[2]));
- }
-
- } break;
- case XForm::OP_TRANSLATE: {
-
- if (xf.data.size() >= 3) {
-
- xform_step.origin = Vector3(xf.data[0], xf.data[1], xf.data[2]);
- }
-
- } break;
- case XForm::OP_MATRIX: {
-
- if (xf.data.size() >= 16) {
- xform_step = _read_transform_from_array(xf.data, 0);
- }
-
- } break;
- default: {
- }
- }
-
- xform = xform * xform_step;
- }
-
-#ifdef COLLADA_IMPORT_SCALE_SCENE
- xform.origin *= state.state.unit_scale;
-#endif
- return xform;
-}
-
-Transform Collada::Node::get_transform() const {
-
- return default_transform;
-}
-
-Transform Collada::Node::get_global_transform() const {
-
- if (parent)
- return parent->get_global_transform() * default_transform;
- else
- return default_transform;
-}
-
-Vector<float> Collada::AnimationTrack::get_value_at_time(float p_time) const {
-
- ERR_FAIL_COND_V(keys.size() == 0, Vector<float>());
- int i = 0;
-
- for (i = 0; i < keys.size(); i++) {
-
- if (keys[i].time > p_time)
- break;
- }
-
- if (i == 0)
- return keys[0].data;
- if (i == keys.size())
- return keys[keys.size() - 1].data;
-
- switch (keys[i].interp_type) {
-
- case INTERP_BEZIER: //wait for bezier
- case INTERP_LINEAR: {
-
- float c = (p_time - keys[i - 1].time) / (keys[i].time - keys[i - 1].time);
-
- if (keys[i].data.size() == 16) {
- //interpolate a matrix
- Transform src = _read_transform_from_array(keys[i - 1].data);
- Transform dst = _read_transform_from_array(keys[i].data);
-
- Transform interp = c < 0.001 ? src : src.interpolate_with(dst, c);
-
- Vector<float> ret;
- ret.resize(16);
- Transform tr;
- // i wonder why collada matrices are transposed, given that's opposed to opengl..
- ret.write[0] = interp.basis.elements[0][0];
- ret.write[1] = interp.basis.elements[0][1];
- ret.write[2] = interp.basis.elements[0][2];
- ret.write[4] = interp.basis.elements[1][0];
- ret.write[5] = interp.basis.elements[1][1];
- ret.write[6] = interp.basis.elements[1][2];
- ret.write[8] = interp.basis.elements[2][0];
- ret.write[9] = interp.basis.elements[2][1];
- ret.write[10] = interp.basis.elements[2][2];
- ret.write[3] = interp.origin.x;
- ret.write[7] = interp.origin.y;
- ret.write[11] = interp.origin.z;
- ret.write[12] = 0;
- ret.write[13] = 0;
- ret.write[14] = 0;
- ret.write[15] = 1;
-
- return ret;
- } else {
-
- Vector<float> dest;
- dest.resize(keys[i].data.size());
- for (int j = 0; j < dest.size(); j++) {
-
- dest.write[j] = keys[i].data[j] * c + keys[i - 1].data[j] * (1.0 - c);
- }
- return dest;
- //interpolate one by one
- }
- } break;
- }
-
- ERR_FAIL_V(Vector<float>());
-}
-
-void Collada::_parse_asset(XMLParser &parser) {
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
-
- if (name == "up_axis") {
-
- parser.read();
- if (parser.get_node_data() == "X_UP")
- state.up_axis = Vector3::AXIS_X;
- if (parser.get_node_data() == "Y_UP")
- state.up_axis = Vector3::AXIS_Y;
- if (parser.get_node_data() == "Z_UP")
- state.up_axis = Vector3::AXIS_Z;
-
- COLLADA_PRINT("up axis: " + parser.get_node_data());
- } else if (name == "unit") {
-
- state.unit_scale = parser.get_attribute_value("meter").to_double();
- COLLADA_PRINT("unit scale: " + rtos(state.unit_scale));
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "asset")
- break; //end of <asset>
- }
-}
-
-void Collada::_parse_image(XMLParser &parser) {
-
- String id = parser.get_attribute_value("id");
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- Image image;
-
- if (state.version < State::Version(1, 4, 0)) {
- /* <1.4 */
- String path = parser.get_attribute_value("source").strip_edges();
- if (path.find("://") == -1 && path.is_rel_path()) {
- // path is relative to file being loaded, so convert to a resource path
- image.path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path.percent_decode()));
- }
- } else {
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
-
- if (name == "init_from") {
-
- parser.read();
- String path = parser.get_node_data().strip_edges().percent_decode();
-
- if (path.find("://") == -1 && path.is_rel_path()) {
- // path is relative to file being loaded, so convert to a resource path
- path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path));
-
- } else if (path.find("file:///") == 0) {
- path = path.replace_first("file:///", "");
- path = ProjectSettings::get_singleton()->localize_path(path);
- }
-
- image.path = path;
-
- } else if (name == "data") {
-
- ERR_PRINT("COLLADA Embedded image data not supported!");
-
- } else if (name == "extra" && !parser.is_empty())
- parser.skip_section();
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "image")
- break; //end of <asset>
- }
- }
-
- state.image_map[id] = image;
-}
-
-void Collada::_parse_material(XMLParser &parser) {
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- Material material;
-
- String id = parser.get_attribute_value("id");
- if (parser.has_attribute("name"))
- material.name = parser.get_attribute_value("name");
-
- if (state.version < State::Version(1, 4, 0)) {
- /* <1.4 */
- ERR_PRINT("Collada Materials < 1.4 are not supported (yet)");
- } else {
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT && parser.get_node_name() == "instance_effect") {
-
- material.instance_effect = _uri_to_id(parser.get_attribute_value("url"));
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "material")
- break; //end of <asset>
- }
- }
-
- state.material_map[id] = material;
-}
-
-//! reads floats from inside of xml element until end of xml element
-Vector<float> Collada::_read_float_array(XMLParser &parser) {
-
- if (parser.is_empty())
- return Vector<float>();
-
- Vector<String> splitters;
- splitters.push_back(" ");
- splitters.push_back("\n");
- splitters.push_back("\r");
- splitters.push_back("\t");
-
- Vector<float> array;
- while (parser.read() == OK) {
- // TODO: check for comments inside the element
- // and ignore them.
-
- if (parser.get_node_type() == XMLParser::NODE_TEXT) {
- // parse float data
- String str = parser.get_node_data();
- array = str.split_floats_mk(splitters, false);
- //array=str.split_floats(" ",false);
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
- break; // end parsing text
- }
-
- return array;
-}
-
-Vector<String> Collada::_read_string_array(XMLParser &parser) {
-
- if (parser.is_empty())
- return Vector<String>();
-
- Vector<String> array;
- while (parser.read() == OK) {
- // TODO: check for comments inside the element
- // and ignore them.
-
- if (parser.get_node_type() == XMLParser::NODE_TEXT) {
- // parse String data
- String str = parser.get_node_data();
- array = str.split_spaces();
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
- break; // end parsing text
- }
-
- return array;
-}
-
-Transform Collada::_read_transform(XMLParser &parser) {
-
- if (parser.is_empty())
- return Transform();
-
- Vector<String> array;
- while (parser.read() == OK) {
- // TODO: check for comments inside the element
- // and ignore them.
-
- if (parser.get_node_type() == XMLParser::NODE_TEXT) {
- // parse float data
- String str = parser.get_node_data();
- array = str.split_spaces();
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
- break; // end parsing text
- }
-
- ERR_FAIL_COND_V(array.size() != 16, Transform());
- Vector<float> farr;
- farr.resize(16);
- for (int i = 0; i < 16; i++) {
- farr.write[i] = array[i].to_double();
- }
-
- return _read_transform_from_array(farr);
-}
-
-String Collada::_read_empty_draw_type(XMLParser &parser) {
-
- String empty_draw_type = "";
-
- if (parser.is_empty())
- return empty_draw_type;
-
- while (parser.read() == OK) {
- if (parser.get_node_type() == XMLParser::NODE_TEXT) {
- empty_draw_type = parser.get_node_data();
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
- break; // end parsing text
- }
- return empty_draw_type;
-}
-
-Variant Collada::_parse_param(XMLParser &parser) {
-
- if (parser.is_empty())
- return Variant();
-
- String from = parser.get_node_name();
- Variant data;
-
- while (parser.read() == OK) {
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "float") {
-
- parser.read();
- if (parser.get_node_type() == XMLParser::NODE_TEXT) {
-
- data = parser.get_node_data().to_double();
- }
- } else if (parser.get_node_name() == "float2") {
-
- Vector<float> v2 = _read_float_array(parser);
-
- if (v2.size() >= 2) {
-
- data = Vector2(v2[0], v2[1]);
- }
- } else if (parser.get_node_name() == "float3") {
-
- Vector<float> v3 = _read_float_array(parser);
-
- if (v3.size() >= 3) {
-
- data = Vector3(v3[0], v3[1], v3[2]);
- }
- } else if (parser.get_node_name() == "float4") {
-
- Vector<float> v4 = _read_float_array(parser);
-
- if (v4.size() >= 4) {
-
- data = Color(v4[0], v4[1], v4[2], v4[3]);
- }
- } else if (parser.get_node_name() == "sampler2D") {
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "source") {
-
- parser.read();
-
- if (parser.get_node_type() == XMLParser::NODE_TEXT) {
-
- data = parser.get_node_data();
- }
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "sampler2D")
- break;
- }
- } else if (parser.get_node_name() == "surface") {
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "init_from") {
-
- parser.read();
-
- if (parser.get_node_type() == XMLParser::NODE_TEXT) {
-
- data = parser.get_node_data();
- }
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "surface")
- break;
- }
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == from)
- break;
- }
-
- COLLADA_PRINT("newparam ending " + parser.get_node_name());
- return data;
-}
-
-void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &id) {
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- // first come the tags we descend, but ignore the top-levels
-
- COLLADA_PRINT("node name: " + parser.get_node_name());
-
- if (!parser.is_empty() && (parser.get_node_name() == "profile_COMMON" || parser.get_node_name() == "technique" || parser.get_node_name() == "extra")) {
-
- _parse_effect_material(parser, effect, id); // try again
-
- } else if (parser.get_node_name() == "newparam") {
- String name = parser.get_attribute_value("sid");
- Variant value = _parse_param(parser);
- effect.params[name] = value;
- COLLADA_PRINT("param: " + name + " value:" + String(value));
-
- } else if (parser.get_node_name() == "constant" ||
- parser.get_node_name() == "lambert" ||
- parser.get_node_name() == "phong" ||
- parser.get_node_name() == "blinn") {
-
- COLLADA_PRINT("shade model: " + parser.get_node_name());
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String what = parser.get_node_name();
-
- if (what == "emission" ||
- what == "diffuse" ||
- what == "specular" ||
- what == "reflective") {
-
- // color or texture types
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "color") {
-
- Vector<float> colorarr = _read_float_array(parser);
- COLLADA_PRINT("colorarr size: " + rtos(colorarr.size()));
-
- if (colorarr.size() >= 3) {
-
- // alpha strangely not alright? maybe it needs to be multiplied by value as a channel intensity
- Color color(colorarr[0], colorarr[1], colorarr[2], 1.0);
- if (what == "diffuse")
- effect.diffuse.color = color;
- if (what == "specular")
- effect.specular.color = color;
- if (what == "emission")
- effect.emission.color = color;
-
- COLLADA_PRINT(what + " color: " + color);
- }
-
- } else if (parser.get_node_name() == "texture") {
-
- String sampler = parser.get_attribute_value("texture");
- if (!effect.params.has(sampler)) {
- ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
- } else {
- String surface = effect.params[sampler];
-
- if (!effect.params.has(surface)) {
- ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data());
- } else {
- String uri = effect.params[surface];
-
- if (what == "diffuse") {
- effect.diffuse.texture = uri;
- } else if (what == "specular") {
- effect.specular.texture = uri;
- } else if (what == "emission") {
- effect.emission.texture = uri;
- } else if (what == "bump") {
- if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
- WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
- }
-
- effect.bump.texture = uri;
- }
-
- COLLADA_PRINT(what + " texture: " + uri);
- }
- }
- } else if (!parser.is_empty())
- parser.skip_section();
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == what)
- break;
- }
-
- } else if (what == "shininess") {
- effect.shininess = _parse_param(parser);
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && (parser.get_node_name() == "constant" ||
- parser.get_node_name() == "lambert" ||
- parser.get_node_name() == "phong" ||
- parser.get_node_name() == "blinn"))
- break;
- }
- } else if (parser.get_node_name() == "double_sided" || parser.get_node_name() == "show_double_sided") { // colladamax / google earth
-
- // 3DS Max / Google Earth double sided extension
- parser.read();
- effect.found_double_sided = true;
- effect.double_sided = parser.get_node_data().to_int();
- COLLADA_PRINT("double sided: " + itos(parser.get_node_data().to_int()));
- } else if (parser.get_node_name() == "unshaded") {
- parser.read();
- effect.unshaded = parser.get_node_data().to_int();
- } else if (parser.get_node_name() == "bump") {
-
- // color or texture types
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "texture") {
-
- String sampler = parser.get_attribute_value("texture");
- if (!effect.params.has(sampler)) {
- ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
- } else {
- String surface = effect.params[sampler];
-
- if (!effect.params.has(surface)) {
- ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data());
- } else {
- String uri = effect.params[surface];
-
- if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
- WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
- }
-
- effect.bump.texture = uri;
- COLLADA_PRINT(" bump: " + uri);
- }
- }
- } else if (!parser.is_empty())
- parser.skip_section();
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "bump")
- break;
- }
-
- } else if (!parser.is_empty())
- parser.skip_section();
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END &&
- (parser.get_node_name() == "effect" ||
- parser.get_node_name() == "profile_COMMON" ||
- parser.get_node_name() == "technique" ||
- parser.get_node_name() == "extra"))
- break;
- }
-}
-
-void Collada::_parse_effect(XMLParser &parser) {
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- String id = parser.get_attribute_value("id");
-
- Effect effect;
- if (parser.has_attribute("name"))
- effect.name = parser.get_attribute_value("name");
- _parse_effect_material(parser, effect, id);
-
- state.effect_map[id] = effect;
-
- COLLADA_PRINT("Effect ID:" + id);
-}
-
-void Collada::_parse_camera(XMLParser &parser) {
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- String id = parser.get_attribute_value("id");
-
- state.camera_data_map[id] = CameraData();
- CameraData &camera = state.camera_data_map[id];
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
-
- if (name == "perspective") {
-
- camera.mode = CameraData::MODE_PERSPECTIVE;
- } else if (name == "orthographic") {
-
- camera.mode = CameraData::MODE_ORTHOGONAL;
- } else if (name == "xfov") {
-
- parser.read();
- camera.perspective.x_fov = parser.get_node_data().to_double();
-
- } else if (name == "yfov") {
-
- parser.read();
- camera.perspective.y_fov = parser.get_node_data().to_double();
- } else if (name == "xmag") {
-
- parser.read();
- camera.orthogonal.x_mag = parser.get_node_data().to_double();
-
- } else if (name == "ymag") {
-
- parser.read();
- camera.orthogonal.y_mag = parser.get_node_data().to_double();
- } else if (name == "aspect_ratio") {
-
- parser.read();
- camera.aspect = parser.get_node_data().to_double();
-
- } else if (name == "znear") {
-
- parser.read();
- camera.z_near = parser.get_node_data().to_double();
-
- } else if (name == "zfar") {
-
- parser.read();
- camera.z_far = parser.get_node_data().to_double();
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "camera")
- break; //end of <asset>
- }
-
- COLLADA_PRINT("Camera ID:" + id);
-}
-
-void Collada::_parse_light(XMLParser &parser) {
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- String id = parser.get_attribute_value("id");
-
- state.light_data_map[id] = LightData();
- LightData &light = state.light_data_map[id];
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
-
- if (name == "ambient") {
-
- light.mode = LightData::MODE_AMBIENT;
- } else if (name == "directional") {
-
- light.mode = LightData::MODE_DIRECTIONAL;
- } else if (name == "point") {
-
- light.mode = LightData::MODE_OMNI;
- } else if (name == "spot") {
-
- light.mode = LightData::MODE_SPOT;
- } else if (name == "color") {
-
- parser.read();
- Vector<float> colorarr = _read_float_array(parser);
- COLLADA_PRINT("colorarr size: " + rtos(colorarr.size()));
-
- if (colorarr.size() >= 4) {
- // alpha strangely not alright? maybe it needs to be multiplied by value as a channel intensity
- Color color(colorarr[0], colorarr[1], colorarr[2], 1.0);
- light.color = color;
- }
-
- } else if (name == "constant_attenuation") {
-
- parser.read();
- light.constant_att = parser.get_node_data().to_double();
- } else if (name == "linear_attenuation") {
-
- parser.read();
- light.linear_att = parser.get_node_data().to_double();
- } else if (name == "quadratic_attenuation") {
-
- parser.read();
- light.quad_att = parser.get_node_data().to_double();
- } else if (name == "falloff_angle") {
-
- parser.read();
- light.spot_angle = parser.get_node_data().to_double();
-
- } else if (name == "falloff_exponent") {
-
- parser.read();
- light.spot_exp = parser.get_node_data().to_double();
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "light")
- break; //end of <asset>
- }
-
- COLLADA_PRINT("Light ID:" + id);
-}
-
-void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_name) {
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- //load everything into a pre dictionary
-
- state.curve_data_map[p_id] = CurveData();
-
- CurveData &curvedata = state.curve_data_map[p_id];
- curvedata.name = p_name;
-
- COLLADA_PRINT("curve name: " + p_name);
-
- String current_source;
- // handles geometry node and the curve children in this loop
- // read sources with arrays and accessor for each curve
- if (parser.is_empty()) {
- return;
- }
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String section = parser.get_node_name();
-
- if (section == "source") {
-
- String id = parser.get_attribute_value("id");
- curvedata.sources[id] = CurveData::Source();
- current_source = id;
- COLLADA_PRINT("source data: " + id);
-
- } else if (section == "float_array" || section == "array") {
- // create a new array and read it.
- if (curvedata.sources.has(current_source)) {
-
- curvedata.sources[current_source].array = _read_float_array(parser);
- COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values.");
- }
- } else if (section == "Name_array") {
- // create a new array and read it.
- if (curvedata.sources.has(current_source)) {
-
- curvedata.sources[current_source].sarray = _read_string_array(parser);
- COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values.");
- }
-
- } else if (section == "technique_common") {
- //skip it
- } else if (section == "accessor") { // child of source (below a technique tag)
-
- if (curvedata.sources.has(current_source)) {
- curvedata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
- COLLADA_PRINT("section: " + current_source + " stride " + itos(curvedata.sources[current_source].stride));
- }
- } else if (section == "control_vertices") {
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "input") {
-
- String semantic = parser.get_attribute_value("semantic");
- String source = _uri_to_id(parser.get_attribute_value("source"));
-
- curvedata.control_vertices[semantic] = source;
-
- COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
- break;
- }
-
- } else if (!parser.is_empty()) {
-
- parser.skip_section();
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "spline")
- break;
- }
-}
-
-void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name) {
-
- if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
- if (!parser.is_empty())
- parser.skip_section();
- return;
- }
-
- //load everything into a pre dictionary
-
- state.mesh_data_map[p_id] = MeshData();
-
- MeshData &meshdata = state.mesh_data_map[p_id];
- meshdata.name = p_name;
-
- COLLADA_PRINT("mesh name: " + p_name);
-
- String current_source;
- // handles geometry node and the mesh children in this loop
- // read sources with arrays and accessor for each mesh
- if (parser.is_empty()) {
- return;
- }
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String section = parser.get_node_name();
-
- if (section == "source") {
-
- String id = parser.get_attribute_value("id");
- meshdata.sources[id] = MeshData::Source();
- current_source = id;
- COLLADA_PRINT("source data: " + id);
-
- } else if (section == "float_array" || section == "array") {
- // create a new array and read it.
- if (meshdata.sources.has(current_source)) {
-
- meshdata.sources[current_source].array = _read_float_array(parser);
- COLLADA_PRINT("section: " + current_source + " read " + itos(meshdata.sources[current_source].array.size()) + " values.");
- }
- } else if (section == "technique_common") {
- //skip it
- } else if (section == "accessor") { // child of source (below a technique tag)
-
- if (meshdata.sources.has(current_source)) {
- meshdata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
- COLLADA_PRINT("section: " + current_source + " stride " + itos(meshdata.sources[current_source].stride));
- }
- } else if (section == "vertices") {
-
- MeshData::Vertices vert;
- String id = parser.get_attribute_value("id");
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "input") {
-
- String semantic = parser.get_attribute_value("semantic");
- String source = _uri_to_id(parser.get_attribute_value("source"));
-
- vert.sources[semantic] = source;
-
- COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
- break;
- }
-
- meshdata.vertices[id] = vert;
-
- } else if (section == "triangles" || section == "polylist" || section == "polygons") {
-
- bool polygons = (section == "polygons");
- if (polygons) {
- WARN_PRINT("Primitive type \"polygons\" is not well supported (concave shapes may fail). To ensure that the geometry is properly imported, please re-export using \"triangles\" or \"polylist\".");
- }
- MeshData::Primitives prim;
-
- if (parser.has_attribute("material"))
- prim.material = parser.get_attribute_value("material");
- prim.count = parser.get_attribute_value("count").to_int();
- prim.vertex_size = 0;
- int last_ref = 0;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "input") {
-
- String semantic = parser.get_attribute_value("semantic");
- String source = _uri_to_id(parser.get_attribute_value("source"));
-
- if (semantic == "TEXCOORD") {
- /*
- if (parser.has_attribute("set"))// a texcoord
- semantic+=parser.get_attribute_value("set");
- else
- semantic="TEXCOORD0";*/
- semantic = "TEXCOORD" + itos(last_ref++);
- }
- int offset = parser.get_attribute_value("offset").to_int();
-
- MeshData::Primitives::SourceRef sref;
- sref.source = source;
- sref.offset = offset;
- prim.sources[semantic] = sref;
- prim.vertex_size = MAX(prim.vertex_size, offset + 1);
-
- COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset));
-
- } else if (parser.get_node_name() == "p") { //indices
-
- Vector<float> values = _read_float_array(parser);
- if (polygons) {
-
- ERR_CONTINUE(prim.vertex_size == 0);
- prim.polygons.push_back(values.size() / prim.vertex_size);
- int from = prim.indices.size();
- prim.indices.resize(from + values.size());
- for (int i = 0; i < values.size(); i++)
- prim.indices.write[from + i] = values[i];
-
- } else if (prim.vertex_size > 0) {
- prim.indices = values;
- }
-
- COLLADA_PRINT("read " + itos(values.size()) + " index values");
-
- } else if (parser.get_node_name() == "vcount") { // primitive
-
- Vector<float> values = _read_float_array(parser);
- prim.polygons = values;
- COLLADA_PRINT("read " + itos(values.size()) + " polygon values");
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
- break;
- }
-
- meshdata.primitives.push_back(prim);
-
- } else if (parser.get_node_name() == "double_sided") {
-
- parser.read();
- meshdata.found_double_sided = true;
- meshdata.double_sided = parser.get_node_data().to_int();
-
- } else if (parser.get_node_name() == "polygons") {
- ERR_PRINT("Primitive type \"polygons\" not supported, re-export using \"polylist\" or \"triangles\".");
- } else if (!parser.is_empty()) {
-
- parser.skip_section();
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "mesh")
- break;
- }
-}
-
-void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
-
- state.skin_controller_data_map[p_id] = SkinControllerData();
- SkinControllerData &skindata = state.skin_controller_data_map[p_id];
-
- skindata.base = _uri_to_id(parser.get_attribute_value("source"));
-
- String current_source;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String section = parser.get_node_name();
-
- if (section == "bind_shape_matrix") {
-
- skindata.bind_shape = _read_transform(parser);
-#ifdef COLLADA_IMPORT_SCALE_SCENE
- skindata.bind_shape.origin *= state.unit_scale;
-
-#endif
- COLLADA_PRINT("skeleton bind shape transform: " + skindata.bind_shape);
-
- } else if (section == "source") {
-
- String id = parser.get_attribute_value("id");
- skindata.sources[id] = SkinControllerData::Source();
- current_source = id;
- COLLADA_PRINT("source data: " + id);
-
- } else if (section == "float_array" || section == "array") {
- // create a new array and read it.
- if (skindata.sources.has(current_source)) {
-
- skindata.sources[current_source].array = _read_float_array(parser);
- COLLADA_PRINT("section: " + current_source + " read " + itos(skindata.sources[current_source].array.size()) + " values.");
- }
- } else if (section == "Name_array" || section == "IDREF_array") {
- // create a new array and read it.
-
- if (section == "IDREF_array")
- skindata.use_idrefs = true;
- if (skindata.sources.has(current_source)) {
-
- skindata.sources[current_source].sarray = _read_string_array(parser);
- if (section == "IDREF_array") {
- Vector<String> sa = skindata.sources[current_source].sarray;
- for (int i = 0; i < sa.size(); i++)
- state.idref_joints.insert(sa[i]);
- }
- COLLADA_PRINT("section: " + current_source + " read " + itos(skindata.sources[current_source].array.size()) + " values.");
- }
- } else if (section == "technique_common") {
- //skip it
- } else if (section == "accessor") { // child of source (below a technique tag)
-
- if (skindata.sources.has(current_source)) {
-
- int stride = 1;
- if (parser.has_attribute("stride"))
- stride = parser.get_attribute_value("stride").to_int();
-
- skindata.sources[current_source].stride = stride;
- COLLADA_PRINT("section: " + current_source + " stride " + itos(skindata.sources[current_source].stride));
- }
-
- } else if (section == "joints") {
-
- SkinControllerData::Joints joint;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "input") {
-
- String semantic = parser.get_attribute_value("semantic");
- String source = _uri_to_id(parser.get_attribute_value("source"));
-
- joint.sources[semantic] = source;
-
- COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
- break;
- }
-
- skindata.joints = joint;
-
- } else if (section == "vertex_weights") {
-
- SkinControllerData::Weights weights;
-
- weights.count = parser.get_attribute_value("count").to_int();
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "input") {
-
- String semantic = parser.get_attribute_value("semantic");
- String source = _uri_to_id(parser.get_attribute_value("source"));
-
- int offset = parser.get_attribute_value("offset").to_int();
-
- SkinControllerData::Weights::SourceRef sref;
- sref.source = source;
- sref.offset = offset;
- weights.sources[semantic] = sref;
-
- COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset));
-
- } else if (parser.get_node_name() == "v") { //indices
-
- Vector<float> values = _read_float_array(parser);
- weights.indices = values;
- COLLADA_PRINT("read " + itos(values.size()) + " index values");
-
- } else if (parser.get_node_name() == "vcount") { // weightsitive
-
- Vector<float> values = _read_float_array(parser);
- weights.sets = values;
- COLLADA_PRINT("read " + itos(values.size()) + " polygon values");
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
- break;
- }
-
- skindata.weights = weights;
- }
- /*
- else if (!parser.is_empty())
- parser.skip_section();
- */
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "skin")
- break;
- }
-
- /* STORE REST MATRICES */
-
- Vector<Transform> rests;
- ERR_FAIL_COND(!skindata.joints.sources.has("JOINT"));
- ERR_FAIL_COND(!skindata.joints.sources.has("INV_BIND_MATRIX"));
-
- String joint_arr = skindata.joints.sources["JOINT"];
- String ibm = skindata.joints.sources["INV_BIND_MATRIX"];
-
- ERR_FAIL_COND(!skindata.sources.has(joint_arr));
- ERR_FAIL_COND(!skindata.sources.has(ibm));
-
- SkinControllerData::Source &joint_source = skindata.sources[joint_arr];
- SkinControllerData::Source &ibm_source = skindata.sources[ibm];
-
- ERR_FAIL_COND(joint_source.sarray.size() != ibm_source.array.size() / 16);
-
- for (int i = 0; i < joint_source.sarray.size(); i++) {
-
- String name = joint_source.sarray[i];
- Transform xform = _read_transform_from_array(ibm_source.array, i * 16); //<- this is a mistake, it must be applied to vertices
- xform.affine_invert(); // inverse for rest, because it's an inverse
-#ifdef COLLADA_IMPORT_SCALE_SCENE
- xform.origin *= state.unit_scale;
-#endif
- skindata.bone_rest_map[name] = xform;
- }
-}
-
-void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
-
- state.morph_controller_data_map[p_id] = MorphControllerData();
- MorphControllerData &morphdata = state.morph_controller_data_map[p_id];
-
- morphdata.mesh = _uri_to_id(parser.get_attribute_value("source"));
- morphdata.mode = parser.get_attribute_value("method");
- String current_source;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String section = parser.get_node_name();
-
- if (section == "source") {
-
- String id = parser.get_attribute_value("id");
- morphdata.sources[id] = MorphControllerData::Source();
- current_source = id;
- COLLADA_PRINT("source data: " + id);
-
- } else if (section == "float_array" || section == "array") {
- // create a new array and read it.
- if (morphdata.sources.has(current_source)) {
-
- morphdata.sources[current_source].array = _read_float_array(parser);
- COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values.");
- }
- } else if (section == "Name_array" || section == "IDREF_array") {
- // create a new array and read it.
-
- /*
- if (section=="IDREF_array")
- morphdata.use_idrefs=true;
- */
- if (morphdata.sources.has(current_source)) {
-
- morphdata.sources[current_source].sarray = _read_string_array(parser);
- /*
- if (section=="IDREF_array") {
- Vector<String> sa = morphdata.sources[current_source].sarray;
- for(int i=0;i<sa.size();i++)
- state.idref_joints.insert(sa[i]);
- }*/
- COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values.");
- }
- } else if (section == "technique_common") {
- //skip it
- } else if (section == "accessor") { // child of source (below a technique tag)
-
- if (morphdata.sources.has(current_source)) {
-
- int stride = 1;
- if (parser.has_attribute("stride"))
- stride = parser.get_attribute_value("stride").to_int();
-
- morphdata.sources[current_source].stride = stride;
- COLLADA_PRINT("section: " + current_source + " stride " + itos(morphdata.sources[current_source].stride));
- }
-
- } else if (section == "targets") {
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "input") {
-
- String semantic = parser.get_attribute_value("semantic");
- String source = _uri_to_id(parser.get_attribute_value("source"));
-
- morphdata.targets[semantic] = source;
-
- COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
- break;
- }
- }
- /*
- else if (!parser.is_empty())
- parser.skip_section();
- */
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "morph")
- break;
- }
-
- if (morphdata.targets.has("MORPH_WEIGHT")) {
-
- state.morph_name_map[morphdata.targets["MORPH_WEIGHT"]] = p_id;
- }
-}
-
-void Collada::_parse_controller(XMLParser &parser) {
-
- String id = parser.get_attribute_value("id");
-
- if (parser.is_empty()) {
- return;
- }
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String section = parser.get_node_name();
-
- if (section == "skin") {
- _parse_skin_controller(parser, id);
- } else if (section == "morph") {
- _parse_morph_controller(parser, id);
- }
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "controller")
- break;
- }
-}
-
-Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) {
-
- String type = parser.get_node_name();
- NodeGeometry *geom = memnew(NodeGeometry);
- geom->controller = type == "instance_controller";
- geom->source = _uri_to_id(parser.get_attribute_value_safe("url"));
-
- if (parser.is_empty()) //nothing else to parse...
- return geom;
- // try to find also many materials and skeletons!
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "instance_material") {
-
- String symbol = parser.get_attribute_value("symbol");
- String target = _uri_to_id(parser.get_attribute_value("target"));
-
- NodeGeometry::Material mat;
- mat.target = target;
- geom->material_map[symbol] = mat;
- COLLADA_PRINT("uses material: '" + target + "' on primitive'" + symbol + "'");
- } else if (parser.get_node_name() == "skeleton") {
-
- parser.read();
- String uri = _uri_to_id(parser.get_node_data());
- if (uri != "") {
- geom->skeletons.push_back(uri);
- }
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == type)
- break;
- }
-
- if (geom->controller) {
-
- if (geom->skeletons.empty()) {
- //XSI style
-
- if (state.skin_controller_data_map.has(geom->source)) {
- SkinControllerData *skin = &state.skin_controller_data_map[geom->source];
- //case where skeletons reference bones with IDREF (XSI)
- ERR_FAIL_COND_V(!skin->joints.sources.has("JOINT"), geom);
- String joint_arr = skin->joints.sources["JOINT"];
- ERR_FAIL_COND_V(!skin->sources.has(joint_arr), geom);
- Collada::SkinControllerData::Source &joint_source = skin->sources[joint_arr];
- geom->skeletons = joint_source.sarray; //quite crazy, but should work.
- }
- }
- }
-
- return geom;
-}
-
-Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) {
-
- NodeCamera *cam = memnew(NodeCamera);
- cam->camera = _uri_to_id(parser.get_attribute_value_safe("url"));
-
- if (state.up_axis == Vector3::AXIS_Z) //collada weirdness
- cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
-
- if (parser.is_empty()) //nothing else to parse...
- return cam;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_camera")
- break;
- }
-
- return cam;
-}
-
-Collada::Node *Collada::_parse_visual_instance_light(XMLParser &parser) {
-
- NodeLight *cam = memnew(NodeLight);
- cam->light = _uri_to_id(parser.get_attribute_value_safe("url"));
-
- if (state.up_axis == Vector3::AXIS_Z) //collada weirdness
- cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
-
- if (parser.is_empty()) //nothing else to parse...
- return cam;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_light")
- break;
- }
-
- return cam;
-}
-
-Collada::Node *Collada::_parse_visual_node_instance_data(XMLParser &parser) {
-
- String instance_type = parser.get_node_name();
-
- if (instance_type == "instance_geometry" || instance_type == "instance_controller") {
- return _parse_visual_instance_geometry(parser);
- } else if (instance_type == "instance_camera") {
-
- return _parse_visual_instance_camera(parser);
- } else if (instance_type == "instance_light") {
- return _parse_visual_instance_light(parser);
- }
-
- if (parser.is_empty()) //nothing else to parse...
- return NULL;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == instance_type)
- break;
- }
-
- return NULL;
-}
-
-Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
-
- String name;
-
- String id = parser.get_attribute_value_safe("id");
-
- bool found_name = false;
-
- if (id == "") {
-
- id = "%NODEID%" + itos(Math::rand());
-
- } else {
- found_name = true;
- }
-
- Vector<Node::XForm> xform_list;
- Vector<Node *> children;
-
- String empty_draw_type = "";
-
- Node *node = NULL;
-
- name = parser.has_attribute("name") ? parser.get_attribute_value_safe("name") : parser.get_attribute_value_safe("id");
- if (name == "") {
-
- name = id;
- } else {
- found_name = true;
- }
-
- if ((parser.has_attribute("type") && parser.get_attribute_value("type") == "JOINT") || state.idref_joints.has(name)) {
- // handle a bone
-
- NodeJoint *joint = memnew(NodeJoint);
-
- if (parser.has_attribute("sid")) { //bones may not have sid
- joint->sid = parser.get_attribute_value("sid");
- //state.bone_map[joint->sid]=joint;
- } else if (state.idref_joints.has(name)) {
- joint->sid = name; //kind of a cheat but..
- } else if (parser.has_attribute("name")) {
- joint->sid = parser.get_attribute_value_safe("name");
- }
-
- if (joint->sid != "") {
- state.sid_to_node_map[joint->sid] = id;
- }
-
- node = joint;
- }
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String section = parser.get_node_name();
-
- if (section == "translate") {
- Node::XForm xf;
- if (parser.has_attribute("sid")) {
- xf.id = parser.get_attribute_value("sid");
- }
- xf.op = Node::XForm::OP_TRANSLATE;
-
- Vector<float> xlt = _read_float_array(parser);
- xf.data = xlt;
- xform_list.push_back(xf);
-
- } else if (section == "rotate") {
- Node::XForm xf;
- if (parser.has_attribute("sid")) {
- xf.id = parser.get_attribute_value("sid");
- }
- xf.op = Node::XForm::OP_ROTATE;
-
- Vector<float> rot = _read_float_array(parser);
- xf.data = rot;
-
- xform_list.push_back(xf);
-
- } else if (section == "scale") {
- Node::XForm xf;
- if (parser.has_attribute("sid")) {
- xf.id = parser.get_attribute_value("sid");
- }
-
- xf.op = Node::XForm::OP_SCALE;
-
- Vector<float> scale = _read_float_array(parser);
-
- xf.data = scale;
-
- xform_list.push_back(xf);
-
- } else if (section == "matrix") {
- Node::XForm xf;
- if (parser.has_attribute("sid")) {
- xf.id = parser.get_attribute_value("sid");
- }
- xf.op = Node::XForm::OP_MATRIX;
-
- Vector<float> matrix = _read_float_array(parser);
-
- xf.data = matrix;
- String mtx;
- for (int i = 0; i < matrix.size(); i++)
- mtx += " " + rtos(matrix[i]);
-
- xform_list.push_back(xf);
-
- } else if (section == "visibility") {
- Node::XForm xf;
- if (parser.has_attribute("sid")) {
- xf.id = parser.get_attribute_value("sid");
- }
- xf.op = Node::XForm::OP_VISIBILITY;
-
- Vector<float> visible = _read_float_array(parser);
-
- xf.data = visible;
-
- xform_list.push_back(xf);
-
- } else if (section == "empty_draw_type") {
- empty_draw_type = _read_empty_draw_type(parser);
- } else if (section == "technique" || section == "extra") {
-
- } else if (section != "node") {
- //usually what defines the type of node
- if (section.begins_with("instance_")) {
-
- if (!node) {
-
- node = _parse_visual_node_instance_data(parser);
-
- } else {
- ERR_PRINT("Multiple instance_* not supported.");
- }
- }
-
- } else {
-
- /* Found a child node!! what to do..*/
-
- Node *child = _parse_visual_scene_node(parser);
- children.push_back(child);
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "node")
- break;
- }
-
- if (!node) {
-
- node = memnew(Node); //generic node, nothing of relevance found
- }
-
- node->noname = !found_name;
- node->xform_list = xform_list;
- node->children = children;
- for (int i = 0; i < children.size(); i++) {
- node->children[i]->parent = node;
- }
-
- node->name = name;
- node->id = id;
- node->empty_draw_type = empty_draw_type;
-
- if (node->children.size() == 1) {
- if (node->children[0]->noname && !node->noname) {
- node->children[0]->name = node->name;
- node->name = node->name + "-base";
- }
- }
-
- node->default_transform = node->compute_transform(*this);
- state.scene_map[id] = node;
-
- return node;
-}
-
-void Collada::_parse_visual_scene(XMLParser &parser) {
-
- String id = parser.get_attribute_value("id");
-
- if (parser.is_empty()) {
- return;
- }
-
- state.visual_scene_map[id] = VisualScene();
- VisualScene &vscene = state.visual_scene_map[id];
-
- if (parser.has_attribute("name"))
- vscene.name = parser.get_attribute_value("name");
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String section = parser.get_node_name();
-
- if (section == "node") {
- vscene.root_nodes.push_back(_parse_visual_scene_node(parser));
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "visual_scene")
- break;
- }
-
- COLLADA_PRINT("Scene ID:" + id);
-}
-
-void Collada::_parse_animation(XMLParser &parser) {
-
- if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) {
- if (!parser.is_empty())
- parser.skip_section();
-
- return;
- }
-
- Map<String, Vector<float> > float_sources;
- Map<String, Vector<String> > string_sources;
- Map<String, int> source_strides;
- Map<String, Map<String, String> > samplers;
- Map<String, Vector<String> > source_param_names;
- Map<String, Vector<String> > source_param_types;
-
- String id = "";
- if (parser.has_attribute("id"))
- id = parser.get_attribute_value("id");
-
- String current_source;
- String current_sampler;
- Vector<String> channel_sources;
- Vector<String> channel_targets;
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
- if (name == "source") {
-
- current_source = parser.get_attribute_value("id");
- source_param_names[current_source] = Vector<String>();
- source_param_types[current_source] = Vector<String>();
-
- } else if (name == "float_array") {
-
- if (current_source != "") {
- float_sources[current_source] = _read_float_array(parser);
- }
-
- } else if (name == "Name_array") {
-
- if (current_source != "") {
- string_sources[current_source] = _read_string_array(parser);
- }
- } else if (name == "accessor") {
-
- if (current_source != "" && parser.has_attribute("stride")) {
- source_strides[current_source] = parser.get_attribute_value("stride").to_int();
- }
- } else if (name == "sampler") {
-
- current_sampler = parser.get_attribute_value("id");
- samplers[current_sampler] = Map<String, String>();
- } else if (name == "param") {
-
- if (parser.has_attribute("name"))
- source_param_names[current_source].push_back(parser.get_attribute_value("name"));
- else
- source_param_names[current_source].push_back("");
-
- if (parser.has_attribute("type"))
- source_param_types[current_source].push_back(parser.get_attribute_value("type"));
- else
- source_param_types[current_source].push_back("");
-
- } else if (name == "input") {
-
- if (current_sampler != "") {
-
- samplers[current_sampler][parser.get_attribute_value("semantic")] = parser.get_attribute_value("source");
- }
-
- } else if (name == "channel") {
-
- channel_sources.push_back(parser.get_attribute_value("source"));
- channel_targets.push_back(parser.get_attribute_value("target"));
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation")
- break; //end of <asset>
- }
-
- for (int i = 0; i < channel_sources.size(); i++) {
-
- String source = _uri_to_id(channel_sources[i]);
- String target = channel_targets[i];
- ERR_CONTINUE(!samplers.has(source));
- Map<String, String> &sampler = samplers[source];
-
- ERR_CONTINUE(!sampler.has("INPUT")); //no input semantic? wtf?
- String input_id = _uri_to_id(sampler["INPUT"]);
- COLLADA_PRINT("input id is " + input_id);
- ERR_CONTINUE(!float_sources.has(input_id));
-
- ERR_CONTINUE(!sampler.has("OUTPUT"));
- String output_id = _uri_to_id(sampler["OUTPUT"]);
- ERR_CONTINUE(!float_sources.has(output_id));
-
- ERR_CONTINUE(!source_param_names.has(output_id));
-
- Vector<String> &names = source_param_names[output_id];
-
- for (int l = 0; l < names.size(); l++) {
-
- String name = names[l];
-
- Vector<float> &time_keys = float_sources[input_id];
- int key_count = time_keys.size();
-
- AnimationTrack track; //begin crating track
- track.id = id;
-
- track.keys.resize(key_count);
-
- for (int j = 0; j < key_count; j++) {
- track.keys.write[j].time = time_keys[j];
- state.animation_length = MAX(state.animation_length, time_keys[j]);
- }
-
- //now read actual values
-
- int stride = 1;
-
- if (source_strides.has(output_id))
- stride = source_strides[output_id];
- int output_len = stride / names.size();
-
- ERR_CONTINUE(output_len == 0);
- ERR_CONTINUE(!float_sources.has(output_id));
-
- Vector<float> &output = float_sources[output_id];
-
- ERR_CONTINUE_MSG((output.size() / stride) != key_count, "Wrong number of keys in output.");
-
- for (int j = 0; j < key_count; j++) {
- track.keys.write[j].data.resize(output_len);
- for (int k = 0; k < output_len; k++)
- track.keys.write[j].data.write[k] = output[l + j * stride + k]; //super weird but should work:
- }
-
- if (sampler.has("INTERPOLATION")) {
-
- String interp_id = _uri_to_id(sampler["INTERPOLATION"]);
- ERR_CONTINUE(!string_sources.has(interp_id));
- Vector<String> &interps = string_sources[interp_id];
- ERR_CONTINUE(interps.size() != key_count);
-
- for (int j = 0; j < key_count; j++) {
- if (interps[j] == "BEZIER")
- track.keys.write[j].interp_type = AnimationTrack::INTERP_BEZIER;
- else
- track.keys.write[j].interp_type = AnimationTrack::INTERP_LINEAR;
- }
- }
-
- if (sampler.has("IN_TANGENT") && sampler.has("OUT_TANGENT")) {
- //bezier control points..
- String intangent_id = _uri_to_id(sampler["IN_TANGENT"]);
- ERR_CONTINUE(!float_sources.has(intangent_id));
- Vector<float> &intangents = float_sources[intangent_id];
-
- ERR_CONTINUE(intangents.size() != key_count * 2 * names.size());
-
- String outangent_id = _uri_to_id(sampler["OUT_TANGENT"]);
- ERR_CONTINUE(!float_sources.has(outangent_id));
- Vector<float> &outangents = float_sources[outangent_id];
- ERR_CONTINUE(outangents.size() != key_count * 2 * names.size());
-
- for (int j = 0; j < key_count; j++) {
- track.keys.write[j].in_tangent = Vector2(intangents[j * 2 * names.size() + 0 + l * 2], intangents[j * 2 * names.size() + 1 + l * 2]);
- track.keys.write[j].out_tangent = Vector2(outangents[j * 2 * names.size() + 0 + l * 2], outangents[j * 2 * names.size() + 1 + l * 2]);
- }
- }
-
- if (target.find("/") != -1) { //transform component
- track.target = target.get_slicec('/', 0);
- track.param = target.get_slicec('/', 1);
- if (track.param.find(".") != -1)
- track.component = track.param.get_slice(".", 1).to_upper();
- track.param = track.param.get_slice(".", 0);
- if (names.size() > 1 && track.component == "") {
- //this is a guess because the collada spec is ambiguous here...
- //i suppose if you have many names (outputs) you can't use a component and i should abide to that.
- track.component = name;
- }
- } else {
- track.target = target;
- }
-
- state.animation_tracks.push_back(track);
-
- if (!state.referenced_tracks.has(target))
- state.referenced_tracks[target] = Vector<int>();
-
- state.referenced_tracks[target].push_back(state.animation_tracks.size() - 1);
-
- if (id != "") {
- if (!state.by_id_tracks.has(id))
- state.by_id_tracks[id] = Vector<int>();
-
- state.by_id_tracks[id].push_back(state.animation_tracks.size() - 1);
- }
-
- COLLADA_PRINT("loaded animation with " + itos(key_count) + " keys");
- }
- }
-}
-
-void Collada::_parse_animation_clip(XMLParser &parser) {
-
- if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) {
- if (!parser.is_empty())
- parser.skip_section();
-
- return;
- }
-
- AnimationClip clip;
-
- if (parser.has_attribute("name"))
- clip.name = parser.get_attribute_value("name");
- else if (parser.has_attribute("id"))
- clip.name = parser.get_attribute_value("id");
- if (parser.has_attribute("start"))
- clip.begin = parser.get_attribute_value("start").to_double();
- if (parser.has_attribute("end"))
- clip.end = parser.get_attribute_value("end").to_double();
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
- if (name == "instance_animation") {
-
- String url = _uri_to_id(parser.get_attribute_value("url"));
- clip.tracks.push_back(url);
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation_clip")
- break; //end of <asset>
- }
-
- state.animation_clips.push_back(clip);
-}
-
-void Collada::_parse_scene(XMLParser &parser) {
-
- if (parser.is_empty()) {
- return;
- }
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
-
- if (name == "instance_visual_scene") {
-
- state.root_visual_scene = _uri_to_id(parser.get_attribute_value("url"));
- } else if (name == "instance_physics_scene") {
-
- state.root_physics_scene = _uri_to_id(parser.get_attribute_value("url"));
- }
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "scene")
- break; //end of <asset>
- }
-}
-
-void Collada::_parse_library(XMLParser &parser) {
-
- if (parser.is_empty()) {
- return;
- }
-
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser.get_node_name();
- COLLADA_PRINT("library name is: " + name);
- if (name == "image") {
-
- _parse_image(parser);
- } else if (name == "material") {
-
- _parse_material(parser);
- } else if (name == "effect") {
-
- _parse_effect(parser);
- } else if (name == "camera") {
-
- _parse_camera(parser);
- } else if (name == "light") {
-
- _parse_light(parser);
- } else if (name == "geometry") {
-
- String id = parser.get_attribute_value("id");
- String name2 = parser.get_attribute_value_safe("name");
- while (parser.read() == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "mesh") {
- state.mesh_name_map[id] = (name2 != "") ? name2 : id;
- _parse_mesh_geometry(parser, id, name2);
- } else if (parser.get_node_name() == "spline") {
- state.mesh_name_map[id] = (name2 != "") ? name2 : id;
- _parse_curve_geometry(parser, id, name2);
- } else if (!parser.is_empty())
- parser.skip_section();
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "geometry")
- break;
- }
-
- } else if (name == "controller") {
-
- _parse_controller(parser);
- } else if (name == "animation") {
-
- _parse_animation(parser);
- } else if (name == "animation_clip") {
-
- _parse_animation_clip(parser);
- } else if (name == "visual_scene") {
-
- COLLADA_PRINT("visual scene");
- _parse_visual_scene(parser);
- } else if (!parser.is_empty())
- parser.skip_section();
-
- } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name().begins_with("library_"))
- break; //end of <asset>
- }
-}
-
-void Collada::_joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner) {
-
- if (p_node->type == Node::TYPE_JOINT) {
-
- NodeJoint *nj = static_cast<NodeJoint *>(p_node);
- nj->owner = p_owner;
-
- for (int i = 0; i < nj->children.size(); i++) {
-
- _joint_set_owner(nj->children.write[i], p_owner);
- }
- }
-}
-
-void Collada::_create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton) {
-
- Node *node = *p_node;
-
- if (node->type == Node::TYPE_JOINT) {
-
- if (!p_skeleton) {
-
- // ohohohoohoo it's a joint node, time to work!
- NodeSkeleton *sk = memnew(NodeSkeleton);
- *p_node = sk;
- sk->children.push_back(node);
- sk->parent = node->parent;
- node->parent = sk;
- p_skeleton = sk;
- }
-
- NodeJoint *nj = static_cast<NodeJoint *>(node);
- nj->owner = p_skeleton;
- } else {
- p_skeleton = NULL;
- }
-
- for (int i = 0; i < node->children.size(); i++) {
- _create_skeletons(&node->children.write[i], p_skeleton);
- }
-}
-
-bool Collada::_remove_node(Node *p_parent, Node *p_node) {
-
- for (int i = 0; i < p_parent->children.size(); i++) {
-
- if (p_parent->children[i] == p_node) {
- p_parent->children.remove(i);
- return true;
- }
- if (_remove_node(p_parent->children[i], p_node))
- return true;
- }
-
- return false;
-}
-
-void Collada::_remove_node(VisualScene *p_vscene, Node *p_node) {
-
- for (int i = 0; i < p_vscene->root_nodes.size(); i++) {
- if (p_vscene->root_nodes[i] == p_node) {
-
- p_vscene->root_nodes.remove(i);
- return;
- }
- if (_remove_node(p_vscene->root_nodes[i], p_node))
- return;
- }
-
- ERR_PRINT("ERROR: Not found node to remove?");
-}
-
-void Collada::_merge_skeletons(VisualScene *p_vscene, Node *p_node) {
-
- if (p_node->type == Node::TYPE_GEOMETRY) {
-
- NodeGeometry *gnode = static_cast<NodeGeometry *>(p_node);
- if (gnode->controller) {
-
- // recount skeletons used
- Set<NodeSkeleton *> skeletons;
-
- for (int i = 0; i < gnode->skeletons.size(); i++) {
-
- String nodeid = gnode->skeletons[i];
-
- ERR_CONTINUE(!state.scene_map.has(nodeid)); //weird, it should have it...
-
- NodeJoint *nj = SAFE_CAST<NodeJoint *>(state.scene_map[nodeid]);
- ERR_CONTINUE(!nj); //broken collada
- ERR_CONTINUE(!nj->owner); //weird, node should have a skeleton owner
-
- skeletons.insert(nj->owner);
- }
-
- if (skeletons.size() > 1) {
-
- //do the merger!!
- Set<NodeSkeleton *>::Element *E = skeletons.front();
- NodeSkeleton *base = E->get();
-
- for (E = E->next(); E; E = E->next()) {
-
- NodeSkeleton *merged = E->get();
- _remove_node(p_vscene, merged);
- for (int i = 0; i < merged->children.size(); i++) {
-
- _joint_set_owner(merged->children[i], base);
- base->children.push_back(merged->children[i]);
- merged->children[i]->parent = base;
- }
-
- merged->children.clear(); //take children from it
- memdelete(merged);
- }
- }
- }
- }
-
- for (int i = 0; i < p_node->children.size(); i++) {
- _merge_skeletons(p_vscene, p_node->children[i]);
- }
-}
-
-void Collada::_merge_skeletons2(VisualScene *p_vscene) {
-
- for (Map<String, SkinControllerData>::Element *E = state.skin_controller_data_map.front(); E; E = E->next()) {
-
- SkinControllerData &cd = E->get();
-
- NodeSkeleton *skeleton = NULL;
-
- for (Map<String, Transform>::Element *F = cd.bone_rest_map.front(); F; F = F->next()) {
-
- String name;
-
- if (!state.sid_to_node_map.has(F->key())) {
- continue;
- }
-
- name = state.sid_to_node_map[F->key()];
-
- ERR_CONTINUE(!state.scene_map.has(name));
-
- Node *node = state.scene_map[name];
- ERR_CONTINUE(node->type != Node::TYPE_JOINT);
-
- NodeSkeleton *sk = NULL;
-
- while (node && !sk) {
-
- if (node->type == Node::TYPE_SKELETON) {
- sk = static_cast<NodeSkeleton *>(node);
- }
- node = node->parent;
- }
-
- ERR_CONTINUE(!sk);
-
- if (!skeleton) {
- skeleton = sk;
- continue;
- }
-
- if (skeleton != sk) {
- //whoa.. wtf, merge.
- _remove_node(p_vscene, sk);
- for (int i = 0; i < sk->children.size(); i++) {
-
- _joint_set_owner(sk->children[i], skeleton);
- skeleton->children.push_back(sk->children[i]);
- sk->children[i]->parent = skeleton;
- }
-
- sk->children.clear(); //take children from it
- memdelete(sk);
- }
- }
- }
-}
-
-bool Collada::_optimize_skeletons(VisualScene *p_vscene, Node *p_node) {
-
- Node *node = p_node;
-
- if (node->type == Node::TYPE_SKELETON && node->parent && node->parent->type == Node::TYPE_NODE && node->parent->children.size() == 1) {
- //replace parent by this...
- Node *parent = node->parent;
-
- //i wonder if this is alright.. i think it is since created skeleton (first joint) is already animated by bone..
- node->id = parent->id;
- node->name = parent->name;
- node->xform_list = parent->xform_list;
- node->default_transform = parent->default_transform;
-
- state.scene_map[node->id] = node;
- node->parent = parent->parent;
-
- if (parent->parent) {
- Node *gp = parent->parent;
- bool found = false;
- for (int i = 0; i < gp->children.size(); i++) {
-
- if (gp->children[i] == parent) {
- gp->children.write[i] = node;
- found = true;
- break;
- }
- }
- if (!found) {
- ERR_PRINT("BUG");
- }
- } else {
-
- bool found = false;
-
- for (int i = 0; i < p_vscene->root_nodes.size(); i++) {
-
- if (p_vscene->root_nodes[i] == parent) {
-
- p_vscene->root_nodes.write[i] = node;
- found = true;
- break;
- }
- }
- if (!found) {
- ERR_PRINT("BUG");
- }
- }
-
- parent->children.clear();
- memdelete(parent);
- return true;
- }
-
- for (int i = 0; i < node->children.size(); i++) {
-
- if (_optimize_skeletons(p_vscene, node->children[i]))
- return false; //stop processing, go up
- }
-
- return false;
-}
-
-bool Collada::_move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, List<Node *> *p_mgeom) {
-
- // Bind Shape Matrix scales the bones and makes them gigantic, so the matrix then shrinks the model?
- // Solution: apply the Bind Shape Matrix to the VERTICES, and if the object comes scaled, it seems to be left alone!
-
- if (p_node->type == Node::TYPE_GEOMETRY) {
-
- NodeGeometry *ng = static_cast<NodeGeometry *>(p_node);
- if (ng->ignore_anim)
- return false; //already made child of skeleton and processeg
-
- if (ng->controller && ng->skeletons.size()) {
-
- String nodeid = ng->skeletons[0];
-
- ERR_FAIL_COND_V(!state.scene_map.has(nodeid), false); //weird, it should have it...
- NodeJoint *nj = SAFE_CAST<NodeJoint *>(state.scene_map[nodeid]);
- ERR_FAIL_COND_V(!nj, false);
- ERR_FAIL_COND_V(!nj->owner, false); //weird, node should have a skeleton owner
-
- NodeSkeleton *sk = nj->owner;
-
- Node *p = sk->parent;
- bool node_is_parent_of_skeleton = false;
-
- while (p) {
- if (p == p_node) {
- node_is_parent_of_skeleton = true;
- break;
- }
- p = p->parent; // try again
- }
-
- ERR_FAIL_COND_V(node_is_parent_of_skeleton, false);
-
- //this should be correct
- ERR_FAIL_COND_V(!state.skin_controller_data_map.has(ng->source), false);
- SkinControllerData &skin = state.skin_controller_data_map[ng->source];
- Transform skel_inv = sk->get_global_transform().affine_inverse();
- p_node->default_transform = skel_inv * (skin.bind_shape /* p_node->get_global_transform()*/); // i honestly have no idea what to do with a previous model xform.. most exporters ignore it
-
- //make rests relative to the skeleton (they seem to be always relative to world)
- for (Map<String, Transform>::Element *E = skin.bone_rest_map.front(); E; E = E->next()) {
-
- E->get() = skel_inv * E->get(); //make the bone rest local to the skeleton
- state.bone_rest_map[E->key()] = E->get(); // make it remember where the bone is globally, now that it's relative
- }
-
- //but most exporters seem to work only if i do this..
- //p_node->default_transform = p_node->get_global_transform();
-
- //p_node->default_transform=Transform(); //this seems to be correct, because bind shape makes the object local to the skeleton
- p_node->ignore_anim = true; // collada may animate this later, if it does, then this is not supported (redo your original asset and don't animate the base mesh)
- p_node->parent = sk;
- //sk->children.push_back(0,p_node); //avoid INFINITE loop
- p_mgeom->push_back(p_node);
- return true;
- }
- }
-
- for (int i = 0; i < p_node->children.size(); i++) {
-
- if (_move_geometry_to_skeletons(p_vscene, p_node->children[i], p_mgeom)) {
- p_node->children.remove(i);
- i--;
- }
- }
-
- return false;
-}
-
-void Collada::_find_morph_nodes(VisualScene *p_vscene, Node *p_node) {
-
- if (p_node->type == Node::TYPE_GEOMETRY) {
-
- NodeGeometry *nj = static_cast<NodeGeometry *>(p_node);
-
- if (nj->controller) {
-
- String base = nj->source;
-
- while (base != "" && !state.mesh_data_map.has(base)) {
-
- if (state.skin_controller_data_map.has(base)) {
-
- SkinControllerData &sk = state.skin_controller_data_map[base];
- base = sk.base;
- } else if (state.morph_controller_data_map.has(base)) {
-
- state.morph_ownership_map[base] = nj->id;
- break;
- } else {
- ERR_FAIL_MSG("Invalid scene.");
- }
- }
- }
- }
-
- for (int i = 0; i < p_node->children.size(); i++) {
-
- _find_morph_nodes(p_vscene, p_node->children[i]);
- }
-}
-
-void Collada::_optimize() {
-
- for (Map<String, VisualScene>::Element *E = state.visual_scene_map.front(); E; E = E->next()) {
-
- VisualScene &vs = E->get();
- for (int i = 0; i < vs.root_nodes.size(); i++) {
- _create_skeletons(&vs.root_nodes.write[i]);
- }
-
- for (int i = 0; i < vs.root_nodes.size(); i++) {
- _merge_skeletons(&vs, vs.root_nodes[i]);
- }
-
- _merge_skeletons2(&vs);
-
- for (int i = 0; i < vs.root_nodes.size(); i++) {
- _optimize_skeletons(&vs, vs.root_nodes[i]);
- }
-
- for (int i = 0; i < vs.root_nodes.size(); i++) {
-
- List<Node *> mgeom;
- if (_move_geometry_to_skeletons(&vs, vs.root_nodes[i], &mgeom)) {
- vs.root_nodes.remove(i);
- i--;
- }
-
- while (!mgeom.empty()) {
-
- Node *n = mgeom.front()->get();
- n->parent->children.push_back(n);
- mgeom.pop_front();
- }
- }
-
- for (int i = 0; i < vs.root_nodes.size(); i++) {
- _find_morph_nodes(&vs, vs.root_nodes[i]);
- }
- }
-}
-
-int Collada::get_uv_channel(String p_name) {
-
- if (!channel_map.has(p_name)) {
-
- ERR_FAIL_COND_V(channel_map.size() == 2, 0);
-
- channel_map[p_name] = channel_map.size();
- }
-
- return channel_map[p_name];
-}
-
-Error Collada::load(const String &p_path, int p_flags) {
-
- Ref<XMLParser> parserr = memnew(XMLParser);
- XMLParser &parser = *parserr.ptr();
- Error err = parser.open(p_path);
- ERR_FAIL_COND_V_MSG(err, err, "Cannot open Collada file '" + p_path + "'.");
-
- state.local_path = ProjectSettings::get_singleton()->localize_path(p_path);
- state.import_flags = p_flags;
- /* Skip headers */
- while ((err = parser.read()) == OK) {
-
- if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser.get_node_name() == "COLLADA") {
- break;
- } else if (!parser.is_empty())
- parser.skip_section(); // unknown section, likely headers
- }
- }
-
- ERR_FAIL_COND_V_MSG(err != OK, ERR_FILE_CORRUPT, "Corrupted Collada file '" + p_path + "'.");
-
- /* Start loading Collada */
-
- {
- //version
- String version = parser.get_attribute_value("version");
- state.version.major = version.get_slice(".", 0).to_int();
- state.version.minor = version.get_slice(".", 1).to_int();
- state.version.rev = version.get_slice(".", 2).to_int();
- COLLADA_PRINT("Collada VERSION: " + version);
- }
-
- while ((err = parser.read()) == OK) {
-
- /* Read all the main sections.. */
-
- if (parser.get_node_type() != XMLParser::NODE_ELEMENT)
- continue; //no idea what this may be, but skipping anyway
-
- String section = parser.get_node_name();
-
- COLLADA_PRINT("section: " + section);
-
- if (section == "asset") {
- _parse_asset(parser);
-
- } else if (section.begins_with("library_")) {
-
- _parse_library(parser);
- } else if (section == "scene") {
-
- _parse_scene(parser);
- } else if (!parser.is_empty()) {
- parser.skip_section(); // unknown section, likely headers
- }
- }
-
- _optimize();
- return OK;
-}
-
-Collada::Collada() {
-}
diff --git a/editor/collada/collada.h b/editor/collada/collada.h
deleted file mode 100644
index 10ed42260b..0000000000
--- a/editor/collada/collada.h
+++ /dev/null
@@ -1,647 +0,0 @@
-/*************************************************************************/
-/* collada.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef COLLADA_H
-#define COLLADA_H
-
-#include "core/io/xml_parser.h"
-#include "core/map.h"
-#include "core/project_settings.h"
-#include "scene/resources/material.h"
-
-class Collada {
-public:
- enum ImportFlags {
- IMPORT_FLAG_SCENE = 1,
- IMPORT_FLAG_ANIMATION = 2
- };
-
- struct Image {
-
- String path;
- };
-
- struct Material {
-
- String name;
- String instance_effect;
- };
-
- struct Effect {
-
- String name;
- Map<String, Variant> params;
-
- struct Channel {
-
- int uv_idx;
- String texture;
- Color color;
- Channel() { uv_idx = 0; }
- };
-
- Channel diffuse, specular, emission, bump;
- float shininess;
- bool found_double_sided;
- bool double_sided;
- bool unshaded;
-
- String get_texture_path(const String &p_source, Collada &state) const;
-
- Effect() {
- diffuse.color = Color(1, 1, 1, 1);
- double_sided = true;
- found_double_sided = false;
- shininess = 40;
- unshaded = false;
- }
- };
-
- struct CameraData {
-
- enum Mode {
- MODE_PERSPECTIVE,
- MODE_ORTHOGONAL
- };
-
- Mode mode;
-
- union {
- struct {
- float x_fov;
- float y_fov;
- } perspective;
- struct {
- float x_mag;
- float y_mag;
- } orthogonal;
- };
-
- float aspect;
- float z_near;
- float z_far;
-
- CameraData() :
- mode(MODE_PERSPECTIVE),
- aspect(1),
- z_near(0.1),
- z_far(100) {
- perspective.x_fov = 0;
- perspective.y_fov = 0;
- }
- };
-
- struct LightData {
-
- enum Mode {
- MODE_AMBIENT,
- MODE_DIRECTIONAL,
- MODE_OMNI,
- MODE_SPOT
- };
-
- Mode mode;
-
- Color color;
-
- float constant_att;
- float linear_att;
- float quad_att;
-
- float spot_angle;
- float spot_exp;
-
- LightData() :
- mode(MODE_AMBIENT),
- color(Color(1, 1, 1, 1)),
- constant_att(0),
- linear_att(0),
- quad_att(0),
- spot_angle(45),
- spot_exp(1) {
- }
- };
-
- struct MeshData {
-
- String name;
- struct Source {
-
- Vector<float> array;
- int stride;
- };
-
- Map<String, Source> sources;
-
- struct Vertices {
-
- Map<String, String> sources;
- };
-
- Map<String, Vertices> vertices;
-
- struct Primitives {
-
- struct SourceRef {
-
- String source;
- int offset;
- };
-
- String material;
- Map<String, SourceRef> sources;
- Vector<float> polygons;
- Vector<float> indices;
- int count;
- int vertex_size;
- };
-
- Vector<Primitives> primitives;
-
- bool found_double_sided;
- bool double_sided;
-
- MeshData() {
- found_double_sided = false;
- double_sided = true;
- }
- };
-
- struct CurveData {
-
- String name;
- bool closed;
-
- struct Source {
-
- Vector<String> sarray;
- Vector<float> array;
- int stride;
- };
-
- Map<String, Source> sources;
-
- Map<String, String> control_vertices;
-
- CurveData() {
-
- closed = false;
- }
- };
- struct SkinControllerData {
-
- String base;
- bool use_idrefs;
-
- Transform bind_shape;
-
- struct Source {
-
- Vector<String> sarray; //maybe for names
- Vector<float> array;
- int stride;
- Source() {
- stride = 1;
- }
- };
-
- Map<String, Source> sources;
-
- struct Joints {
-
- Map<String, String> sources;
- } joints;
-
- struct Weights {
-
- struct SourceRef {
-
- String source;
- int offset;
- };
-
- String material;
- Map<String, SourceRef> sources;
- Vector<float> sets;
- Vector<float> indices;
- int count;
- } weights;
-
- Map<String, Transform> bone_rest_map;
-
- SkinControllerData() { use_idrefs = false; }
- };
-
- struct MorphControllerData {
-
- String mesh;
- String mode;
-
- struct Source {
-
- int stride;
- Vector<String> sarray; //maybe for names
- Vector<float> array;
- Source() { stride = 1; }
- };
-
- Map<String, Source> sources;
-
- Map<String, String> targets;
- MorphControllerData() {}
- };
-
- struct Vertex {
-
- int idx;
- Vector3 vertex;
- Vector3 normal;
- Vector3 uv;
- Vector3 uv2;
- Plane tangent;
- Color color;
- int uid;
- struct Weight {
- int bone_idx;
- float weight;
- bool operator<(const Weight w) const { return weight > w.weight; } //heaviest first
- };
-
- Vector<Weight> weights;
-
- void fix_weights() {
-
- weights.sort();
- if (weights.size() > 4) {
- //cap to 4 and make weights add up 1
- weights.resize(4);
- float total = 0;
- for (int i = 0; i < 4; i++)
- total += weights[i].weight;
- if (total)
- for (int i = 0; i < 4; i++)
- weights.write[i].weight /= total;
- }
- }
-
- void fix_unit_scale(Collada &state);
-
- bool operator<(const Vertex &p_vert) const {
-
- if (uid == p_vert.uid) {
- if (vertex == p_vert.vertex) {
- if (normal == p_vert.normal) {
- if (uv == p_vert.uv) {
- if (uv2 == p_vert.uv2) {
-
- if (!weights.empty() || !p_vert.weights.empty()) {
-
- if (weights.size() == p_vert.weights.size()) {
-
- for (int i = 0; i < weights.size(); i++) {
- if (weights[i].bone_idx != p_vert.weights[i].bone_idx)
- return weights[i].bone_idx < p_vert.weights[i].bone_idx;
-
- if (weights[i].weight != p_vert.weights[i].weight)
- return weights[i].weight < p_vert.weights[i].weight;
- }
- } else {
- return weights.size() < p_vert.weights.size();
- }
- }
-
- return (color < p_vert.color);
- } else
- return (uv2 < p_vert.uv2);
- } else
- return (uv < p_vert.uv);
- } else
- return (normal < p_vert.normal);
- } else
- return vertex < p_vert.vertex;
- } else
- return uid < p_vert.uid;
- }
-
- Vertex() {
- uid = 0;
- idx = 0;
- }
- };
- struct Node {
-
- enum Type {
-
- TYPE_NODE,
- TYPE_JOINT,
- TYPE_SKELETON, //this bone is not collada, it's added afterwards as optimization
- TYPE_LIGHT,
- TYPE_CAMERA,
- TYPE_GEOMETRY
- };
-
- struct XForm {
-
- enum Op {
- OP_ROTATE,
- OP_SCALE,
- OP_TRANSLATE,
- OP_MATRIX,
- OP_VISIBILITY
- };
-
- String id;
- Op op;
- Vector<float> data;
- };
-
- Type type;
-
- String name;
- String id;
- String empty_draw_type;
- bool noname;
- Vector<XForm> xform_list;
- Transform default_transform;
- Transform post_transform;
- Vector<Node *> children;
-
- Node *parent;
-
- Transform compute_transform(Collada &state) const;
- Transform get_global_transform() const;
- Transform get_transform() const;
-
- bool ignore_anim;
-
- Node() {
- noname = false;
- type = TYPE_NODE;
- parent = NULL;
- ignore_anim = false;
- }
- virtual ~Node() {
- for (int i = 0; i < children.size(); i++)
- memdelete(children[i]);
- };
- };
-
- struct NodeSkeleton : public Node {
-
- NodeSkeleton() { type = TYPE_SKELETON; }
- };
-
- struct NodeJoint : public Node {
-
- NodeSkeleton *owner;
- String sid;
- NodeJoint() {
- type = TYPE_JOINT;
- owner = NULL;
- }
- };
-
- struct NodeGeometry : public Node {
-
- bool controller;
- String source;
-
- struct Material {
- String target;
- };
-
- Map<String, Material> material_map;
- Vector<String> skeletons;
-
- NodeGeometry() { type = TYPE_GEOMETRY; }
- };
-
- struct NodeCamera : public Node {
-
- String camera;
-
- NodeCamera() { type = TYPE_CAMERA; }
- };
-
- struct NodeLight : public Node {
-
- String light;
-
- NodeLight() { type = TYPE_LIGHT; }
- };
-
- struct VisualScene {
-
- String name;
- Vector<Node *> root_nodes;
-
- ~VisualScene() {
- for (int i = 0; i < root_nodes.size(); i++)
- memdelete(root_nodes[i]);
- }
- };
-
- struct AnimationClip {
-
- String name;
- float begin;
- float end;
- Vector<String> tracks;
-
- AnimationClip() {
- begin = 0;
- end = 1;
- }
- };
-
- struct AnimationTrack {
-
- String id;
- String target;
- String param;
- String component;
- bool property;
-
- enum InterpolationType {
- INTERP_LINEAR,
- INTERP_BEZIER
- };
-
- struct Key {
-
- enum Type {
- TYPE_FLOAT,
- TYPE_MATRIX
- };
-
- float time;
- Vector<float> data;
- Point2 in_tangent;
- Point2 out_tangent;
- InterpolationType interp_type;
-
- Key() { interp_type = INTERP_LINEAR; }
- };
-
- Vector<float> get_value_at_time(float p_time) const;
-
- Vector<Key> keys;
-
- AnimationTrack() { property = false; }
- };
-
- /****************/
- /* IMPORT STATE */
- /****************/
-
- struct State {
-
- int import_flags;
-
- float unit_scale;
- Vector3::Axis up_axis;
- bool z_up;
-
- struct Version {
-
- int major, minor, rev;
-
- bool operator<(const Version &p_ver) const { return (major == p_ver.major) ? ((minor == p_ver.minor) ? (rev < p_ver.rev) : minor < p_ver.minor) : major < p_ver.major; }
- Version(int p_major = 0, int p_minor = 0, int p_rev = 0) {
- major = p_major;
- minor = p_minor;
- rev = p_rev;
- }
- } version;
-
- Map<String, CameraData> camera_data_map;
- Map<String, MeshData> mesh_data_map;
- Map<String, LightData> light_data_map;
- Map<String, CurveData> curve_data_map;
-
- Map<String, String> mesh_name_map;
- Map<String, String> morph_name_map;
- Map<String, String> morph_ownership_map;
- Map<String, SkinControllerData> skin_controller_data_map;
- Map<String, MorphControllerData> morph_controller_data_map;
-
- Map<String, Image> image_map;
- Map<String, Material> material_map;
- Map<String, Effect> effect_map;
-
- Map<String, VisualScene> visual_scene_map;
- Map<String, Node *> scene_map;
- Set<String> idref_joints;
- Map<String, String> sid_to_node_map;
- //Map<String,NodeJoint*> bone_map;
-
- Map<String, Transform> bone_rest_map;
-
- String local_path;
- String root_visual_scene;
- String root_physics_scene;
-
- Vector<AnimationClip> animation_clips;
- Vector<AnimationTrack> animation_tracks;
- Map<String, Vector<int> > referenced_tracks;
- Map<String, Vector<int> > by_id_tracks;
-
- float animation_length;
-
- State() :
- import_flags(0),
- unit_scale(1.0),
- up_axis(Vector3::AXIS_Y),
- animation_length(0) {
- }
- } state;
-
- Error load(const String &p_path, int p_flags = 0);
-
- Collada();
-
- Transform fix_transform(const Transform &p_transform);
-
- Transform get_root_transform() const;
-
- int get_uv_channel(String p_name);
-
-private: // private stuff
- Map<String, int> channel_map;
-
- void _parse_asset(XMLParser &parser);
- void _parse_image(XMLParser &parser);
- void _parse_material(XMLParser &parser);
- void _parse_effect_material(XMLParser &parser, Effect &effect, String &id);
- void _parse_effect(XMLParser &parser);
- void _parse_camera(XMLParser &parser);
- void _parse_light(XMLParser &parser);
- void _parse_animation_clip(XMLParser &parser);
-
- void _parse_mesh_geometry(XMLParser &parser, String p_id, String p_name);
- void _parse_curve_geometry(XMLParser &parser, String p_id, String p_name);
-
- void _parse_skin_controller(XMLParser &parser, String p_id);
- void _parse_morph_controller(XMLParser &parser, String p_id);
- void _parse_controller(XMLParser &parser);
-
- Node *_parse_visual_instance_geometry(XMLParser &parser);
- Node *_parse_visual_instance_camera(XMLParser &parser);
- Node *_parse_visual_instance_light(XMLParser &parser);
-
- Node *_parse_visual_node_instance_data(XMLParser &parser);
- Node *_parse_visual_scene_node(XMLParser &parser);
- void _parse_visual_scene(XMLParser &parser);
-
- void _parse_animation(XMLParser &parser);
- void _parse_scene(XMLParser &parser);
- void _parse_library(XMLParser &parser);
-
- Variant _parse_param(XMLParser &parser);
- Vector<float> _read_float_array(XMLParser &parser);
- Vector<String> _read_string_array(XMLParser &parser);
- Transform _read_transform(XMLParser &parser);
- String _read_empty_draw_type(XMLParser &parser);
-
- void _joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner);
- void _create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton = NULL);
- void _find_morph_nodes(VisualScene *p_vscene, Node *p_node);
- bool _remove_node(Node *p_parent, Node *p_node);
- void _remove_node(VisualScene *p_vscene, Node *p_node);
- void _merge_skeletons2(VisualScene *p_vscene);
- void _merge_skeletons(VisualScene *p_vscene, Node *p_node);
- bool _optimize_skeletons(VisualScene *p_vscene, Node *p_node);
-
- bool _move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, List<Node *> *p_mgeom);
-
- void _optimize();
-};
-
-#endif // COLLADA_H
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
index 1853133bc7..d1661fd7b3 100644
--- a/editor/connections_dialog.cpp
+++ b/editor/connections_dialog.cpp
@@ -40,67 +40,63 @@
static Node *_find_first_script(Node *p_root, Node *p_node) {
if (p_node != p_root && p_node->get_owner() != p_root) {
- return NULL;
+ return nullptr;
}
if (!p_node->get_script().is_null()) {
return p_node;
}
for (int i = 0; i < p_node->get_child_count(); i++) {
-
Node *ret = _find_first_script(p_root, p_node->get_child(i));
if (ret) {
return ret;
}
}
- return NULL;
+ return nullptr;
}
class ConnectDialogBinds : public Object {
-
GDCLASS(ConnectDialogBinds, Object);
public:
Vector<Variant> params;
bool _set(const StringName &p_name, const Variant &p_value) {
-
String name = p_name;
if (name.begins_with("bind/")) {
int which = name.get_slice("/", 1).to_int() - 1;
ERR_FAIL_INDEX_V(which, params.size(), false);
params.write[which] = p_value;
- } else
+ } else {
return false;
+ }
return true;
}
bool _get(const StringName &p_name, Variant &r_ret) const {
-
String name = p_name;
if (name.begins_with("bind/")) {
int which = name.get_slice("/", 1).to_int() - 1;
ERR_FAIL_INDEX_V(which, params.size(), false);
r_ret = params[which];
- } else
+ } else {
return false;
+ }
return true;
}
void _get_property_list(List<PropertyInfo> *p_list) const {
-
for (int i = 0; i < params.size(); i++) {
p_list->push_back(PropertyInfo(params[i].get_type(), "bind/" + itos(i + 1)));
}
}
void notify_changed() {
-
_change_notify();
}
@@ -112,17 +108,28 @@ public:
* Signal automatically called by parent dialog.
*/
void ConnectDialog::ok_pressed() {
+ String method_name = dst_method->get_text();
- if (dst_method->get_text() == "") {
+ if (method_name == "") {
error->set_text(TTR("Method in target node must be specified."));
- error->popup_centered_minsize();
+ error->popup_centered();
return;
}
+
+ if (!method_name.strip_edges().is_valid_identifier()) {
+ error->set_text(TTR("Method name must be a valid identifier."));
+ error->popup_centered();
+ return;
+ }
+
Node *target = tree->get_selected();
+ if (!target) {
+ return; // Nothing selected in the tree, not an error.
+ }
if (target->get_script().is_null()) {
- if (!target->has_method(dst_method->get_text())) {
+ if (!target->has_method(method_name)) {
error->set_text(TTR("Target method not found. Specify a valid method or attach a script to the target node."));
- error->popup_centered_minsize();
+ error->popup_centered();
return;
}
}
@@ -131,59 +138,85 @@ void ConnectDialog::ok_pressed() {
}
void ConnectDialog::_cancel_pressed() {
-
hide();
}
+void ConnectDialog::_item_activated() {
+ _ok_pressed(); // From AcceptDialog.
+}
+
+void ConnectDialog::_text_entered(const String &p_text) {
+ _ok_pressed(); // From AcceptDialog.
+}
+
/*
* Called each time a target node is selected within the target node tree.
*/
void ConnectDialog::_tree_node_selected() {
-
Node *current = tree->get_selected();
- if (!current)
+ if (!current) {
return;
+ }
dst_path = source->get_path_to(current);
_update_ok_enabled();
}
/*
- * Called each time a target node is activated within the target node tree.
- */
-void ConnectDialog::_tree_item_activated() {
-
- if (!get_ok()->is_disabled()) {
- get_ok()->emit_signal("pressed");
- }
-}
-
-/*
* Adds a new parameter bind to connection.
*/
void ConnectDialog::_add_bind() {
-
- if (cdbinds->params.size() >= VARIANT_ARG_MAX)
+ if (cdbinds->params.size() >= VARIANT_ARG_MAX) {
return;
+ }
Variant::Type vt = (Variant::Type)type_list->get_item_id(type_list->get_selected());
Variant value;
switch (vt) {
- case Variant::BOOL: value = false; break;
- case Variant::INT: value = 0; break;
- case Variant::REAL: value = 0.0; break;
- case Variant::STRING: value = ""; break;
- case Variant::VECTOR2: value = Vector2(); break;
- case Variant::RECT2: value = Rect2(); break;
- case Variant::VECTOR3: value = Vector3(); break;
- case Variant::PLANE: value = Plane(); break;
- case Variant::QUAT: value = Quat(); break;
- case Variant::AABB: value = AABB(); break;
- case Variant::BASIS: value = Basis(); break;
- case Variant::TRANSFORM: value = Transform(); break;
- case Variant::COLOR: value = Color(); break;
+ case Variant::BOOL:
+ value = false;
+ break;
+ case Variant::INT:
+ value = 0;
+ break;
+ case Variant::FLOAT:
+ value = 0.0;
+ break;
+ case Variant::STRING:
+ value = "";
+ break;
+ case Variant::STRING_NAME:
+ value = "";
+ break;
+ case Variant::VECTOR2:
+ value = Vector2();
+ break;
+ case Variant::RECT2:
+ value = Rect2();
+ break;
+ case Variant::VECTOR3:
+ value = Vector3();
+ break;
+ case Variant::PLANE:
+ value = Plane();
+ break;
+ case Variant::QUAT:
+ value = Quat();
+ break;
+ case Variant::AABB:
+ value = AABB();
+ break;
+ case Variant::BASIS:
+ value = Basis();
+ break;
+ case Variant::TRANSFORM:
+ value = Transform();
+ break;
+ case Variant::COLOR:
+ value = Color();
+ break;
default: {
ERR_FAIL();
} break;
@@ -199,10 +232,10 @@ void ConnectDialog::_add_bind() {
* Remove parameter bind from connection.
*/
void ConnectDialog::_remove_bind() {
-
String st = bind_editor->get_selected_path();
- if (st == "")
+ if (st == "") {
return;
+ }
int idx = st.get_slice("/", 1).to_int() - 1;
ERR_FAIL_INDEX(idx, cdbinds->params.size());
@@ -215,7 +248,6 @@ void ConnectDialog::_remove_bind() {
* node is selected and valid in the selected mode.
*/
void ConnectDialog::_update_ok_enabled() {
-
Node *target = tree->get_selected();
if (target == nullptr) {
@@ -232,70 +264,55 @@ void ConnectDialog::_update_ok_enabled() {
}
void ConnectDialog::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
bind_editor->edit(cdbinds);
}
}
void ConnectDialog::_bind_methods() {
-
- ClassDB::bind_method("_advanced_pressed", &ConnectDialog::_advanced_pressed);
ClassDB::bind_method("_cancel", &ConnectDialog::_cancel_pressed);
- ClassDB::bind_method("_tree_node_selected", &ConnectDialog::_tree_node_selected);
- ClassDB::bind_method("_tree_item_activated", &ConnectDialog::_tree_item_activated);
- ClassDB::bind_method("_add_bind", &ConnectDialog::_add_bind);
- ClassDB::bind_method("_remove_bind", &ConnectDialog::_remove_bind);
ClassDB::bind_method("_update_ok_enabled", &ConnectDialog::_update_ok_enabled);
ADD_SIGNAL(MethodInfo("connected"));
}
Node *ConnectDialog::get_source() const {
-
return source;
}
StringName ConnectDialog::get_signal_name() const {
-
return signal;
}
NodePath ConnectDialog::get_dst_path() const {
-
return dst_path;
}
void ConnectDialog::set_dst_node(Node *p_node) {
-
tree->set_selected(p_node);
}
StringName ConnectDialog::get_dst_method_name() const {
-
String txt = dst_method->get_text();
- if (txt.find("(") != -1)
+ if (txt.find("(") != -1) {
txt = txt.left(txt.find("(")).strip_edges();
+ }
return txt;
}
void ConnectDialog::set_dst_method(const StringName &p_method) {
-
dst_method->set_text(p_method);
}
Vector<Variant> ConnectDialog::get_binds() const {
-
return cdbinds->params;
}
bool ConnectDialog::get_deferred() const {
-
return deferred->is_pressed();
}
bool ConnectDialog::get_oneshot() const {
-
return oneshot->is_pressed();
}
@@ -303,7 +320,6 @@ bool ConnectDialog::get_oneshot() const {
* Returns true if ConnectDialog is being used to edit an existing connection.
*/
bool ConnectDialog::is_editing() const {
-
return bEditMode;
}
@@ -312,14 +328,13 @@ bool ConnectDialog::is_editing() const {
* If creating a connection from scratch, sensible defaults are used.
* If editing an existing connection, previous data is retained.
*/
-void ConnectDialog::init(Connection c, bool bEdit) {
-
+void ConnectDialog::init(ConnectionData c, bool bEdit) {
set_hide_on_ok(false);
source = static_cast<Node *>(c.source);
signal = c.signal;
- tree->set_selected(NULL);
+ tree->set_selected(nullptr);
tree->set_marked(source, true);
if (c.target) {
@@ -343,26 +358,25 @@ void ConnectDialog::init(Connection c, bool bEdit) {
}
void ConnectDialog::popup_dialog(const String &p_for_signal) {
-
from_signal->set_text(p_for_signal);
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
- if (!advanced->is_pressed())
+ error_label->add_theme_color_override("font_color", error_label->get_theme_color("error_color", "Editor"));
+ if (!advanced->is_pressed()) {
error_label->set_visible(!_find_first_script(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root()));
+ }
popup_centered();
}
void ConnectDialog::_advanced_pressed() {
-
if (advanced->is_pressed()) {
- set_custom_minimum_size(Size2(900, 500) * EDSCALE);
+ set_min_size(Size2(900, 500) * EDSCALE);
connect_to_label->set_text(TTR("Connect to Node:"));
tree->set_connect_to_script_mode(false);
vbc_right->show();
error_label->hide();
} else {
- set_custom_minimum_size(Size2(600, 500) * EDSCALE);
+ set_min_size(Size2(600, 500) * EDSCALE);
set_size(Size2());
connect_to_label->set_text(TTR("Connect to Script:"));
tree->set_connect_to_script_mode(true);
@@ -373,23 +387,22 @@ void ConnectDialog::_advanced_pressed() {
_update_ok_enabled();
- set_position((get_viewport_rect().size - get_custom_minimum_size()) / 2);
+ popup_centered();
}
ConnectDialog::ConnectDialog() {
-
- set_custom_minimum_size(Size2(600, 500) * EDSCALE);
+ set_min_size(Size2(600, 500) * EDSCALE);
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
HBoxContainer *main_hb = memnew(HBoxContainer);
vbc->add_child(main_hb);
- main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ main_hb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
VBoxContainer *vbc_left = memnew(VBoxContainer);
main_hb->add_child(vbc_left);
- vbc_left->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc_left->set_h_size_flags(Control::SIZE_EXPAND_FILL);
from_signal = memnew(LineEdit);
from_signal->set_editable(false);
@@ -397,8 +410,8 @@ ConnectDialog::ConnectDialog() {
tree = memnew(SceneTreeEditor(false));
tree->set_connecting_signal(true);
- tree->get_scene_tree()->connect("item_activated", this, "_tree_item_activated");
- tree->connect("node_selected", this, "_tree_node_selected");
+ tree->get_scene_tree()->connect("item_activated", callable_mp(this, &ConnectDialog::_item_activated));
+ tree->connect("node_selected", callable_mp(this, &ConnectDialog::_tree_node_selected));
tree->set_connect_to_script_mode(true);
Node *mc = vbc_left->add_margin_child(TTR("Connect to Script:"), tree, true);
@@ -411,18 +424,19 @@ ConnectDialog::ConnectDialog() {
vbc_right = memnew(VBoxContainer);
main_hb->add_child(vbc_right);
- vbc_right->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc_right->set_h_size_flags(Control::SIZE_EXPAND_FILL);
vbc_right->hide();
HBoxContainer *add_bind_hb = memnew(HBoxContainer);
type_list = memnew(OptionButton);
- type_list->set_h_size_flags(SIZE_EXPAND_FILL);
+ type_list->set_h_size_flags(Control::SIZE_EXPAND_FILL);
add_bind_hb->add_child(type_list);
type_list->add_item("bool", Variant::BOOL);
type_list->add_item("int", Variant::INT);
- type_list->add_item("real", Variant::REAL);
+ type_list->add_item("real", Variant::FLOAT);
type_list->add_item("String", Variant::STRING);
+ type_list->add_item("StringName", Variant::STRING_NAME);
type_list->add_item("Vector2", Variant::VECTOR2);
type_list->add_item("Rect2", Variant::RECT2);
type_list->add_item("Vector3", Variant::VECTOR3);
@@ -437,12 +451,12 @@ ConnectDialog::ConnectDialog() {
Button *add_bind = memnew(Button);
add_bind->set_text(TTR("Add"));
add_bind_hb->add_child(add_bind);
- add_bind->connect("pressed", this, "_add_bind");
+ add_bind->connect("pressed", callable_mp(this, &ConnectDialog::_add_bind));
Button *del_bind = memnew(Button);
del_bind->set_text(TTR("Remove"));
add_bind_hb->add_child(del_bind);
- del_bind->connect("pressed", this, "_remove_bind");
+ del_bind->connect("pressed", callable_mp(this, &ConnectDialog::_remove_bind));
vbc_right->add_margin_child(TTR("Add Extra Call Argument:"), add_bind_hb);
@@ -454,19 +468,14 @@ ConnectDialog::ConnectDialog() {
vbc_left->add_margin_child(TTR("Receiver Method:"), dstm_hb);
dst_method = memnew(LineEdit);
- dst_method->set_h_size_flags(SIZE_EXPAND_FILL);
- dst_method->connect("text_entered", this, "_builtin_text_entered");
+ dst_method->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ dst_method->connect("text_entered", callable_mp(this, &ConnectDialog::_text_entered));
dstm_hb->add_child(dst_method);
advanced = memnew(CheckButton);
dstm_hb->add_child(advanced);
advanced->set_text(TTR("Advanced"));
- advanced->connect("pressed", this, "_advanced_pressed");
-
- // Add spacing so the tree and inspector are the same size.
- Control *spacing = memnew(Control);
- spacing->set_custom_minimum_size(Size2(0, 4) * EDSCALE);
- vbc_right->add_child(spacing);
+ advanced->connect("pressed", callable_mp(this, &ConnectDialog::_advanced_pressed));
deferred = memnew(CheckBox);
deferred->set_h_size_flags(0);
@@ -480,8 +489,6 @@ ConnectDialog::ConnectDialog() {
oneshot->set_tooltip(TTR("Disconnects the signal after its first emission."));
vbc_right->add_child(oneshot);
- set_as_toplevel(true);
-
cdbinds = memnew(ConnectDialogBinds);
error = memnew(AcceptDialog);
@@ -492,7 +499,6 @@ ConnectDialog::ConnectDialog() {
}
ConnectDialog::~ConnectDialog() {
-
memdelete(cdbinds);
}
@@ -500,32 +506,32 @@ ConnectDialog::~ConnectDialog() {
// Originally copied and adapted from EditorProperty, try to keep style in sync.
Control *ConnectionsDockTree::make_custom_tooltip(const String &p_text) const {
-
EditorHelpBit *help_bit = memnew(EditorHelpBit);
- help_bit->add_style_override("panel", get_stylebox("panel", "TooltipPanel"));
+ help_bit->add_theme_style_override("panel", get_theme_stylebox("panel", "TooltipPanel"));
help_bit->get_rich_text()->set_fixed_size_to_width(360 * EDSCALE);
String text = TTR("Signal:") + " [u][b]" + p_text.get_slice("::", 0) + "[/b][/u]";
text += p_text.get_slice("::", 1).strip_edges() + "\n";
text += p_text.get_slice("::", 2).strip_edges();
- help_bit->set_text(text);
help_bit->call_deferred("set_text", text); //hack so it uses proper theme once inside scene
return help_bit;
}
struct _ConnectionsDockMethodInfoSort {
-
_FORCE_INLINE_ bool operator()(const MethodInfo &a, const MethodInfo &b) const {
return a.name < b.name;
}
};
+void ConnectionsDock::_filter_changed(const String &p_text) {
+ update_tree();
+}
+
/*
* Post-ConnectDialog callback for creating/editing connections.
* Creates or edits connections based on state of the ConnectDialog when "Connect" is pressed.
*/
void ConnectionsDock::_make_or_edit_connection() {
-
TreeItem *it = tree->get_selected();
ERR_FAIL_COND(!it);
@@ -533,7 +539,7 @@ void ConnectionsDock::_make_or_edit_connection() {
Node *target = selectedNode->get_node(dst_path);
ERR_FAIL_COND(!target);
- Connection cToMake;
+ ConnectDialog::ConnectionData cToMake;
cToMake.source = connect_dialog->get_source();
cToMake.target = target;
cToMake.signal = connect_dialog->get_signal_name();
@@ -563,12 +569,12 @@ void ConnectionsDock::_make_or_edit_connection() {
add_script_function = !found_inherited_function;
}
- PoolStringArray script_function_args;
+ PackedStringArray script_function_args;
if (add_script_function) {
// Pick up args here before "it" is deleted by update_tree.
script_function_args = it->get_metadata(0).operator Dictionary()["args"];
for (int i = 0; i < cToMake.binds.size(); i++) {
- script_function_args.append("extra_arg_" + itos(i) + ":" + Variant::get_type_name(cToMake.binds[i].get_type()));
+ script_function_args.push_back("extra_arg_" + itos(i) + ":" + Variant::get_type_name(cToMake.binds[i].get_type()));
}
}
@@ -580,7 +586,7 @@ void ConnectionsDock::_make_or_edit_connection() {
}
// IMPORTANT NOTE: _disconnect and _connect cause an update_tree, which will delete the object "it" is pointing to.
- it = NULL;
+ it = nullptr;
if (add_script_function) {
editor->emit_signal("script_add_function_request", target, cToMake.method, script_function_args);
@@ -593,18 +599,20 @@ void ConnectionsDock::_make_or_edit_connection() {
/*
* Creates single connection w/ undo-redo functionality.
*/
-void ConnectionsDock::_connect(Connection cToMake) {
-
+void ConnectionsDock::_connect(ConnectDialog::ConnectionData cToMake) {
Node *source = static_cast<Node *>(cToMake.source);
Node *target = static_cast<Node *>(cToMake.target);
- if (!source || !target)
+ if (!source || !target) {
return;
+ }
undo_redo->create_action(vformat(TTR("Connect '%s' to '%s'"), String(cToMake.signal), String(cToMake.method)));
- undo_redo->add_do_method(source, "connect", cToMake.signal, target, cToMake.method, cToMake.binds, cToMake.flags);
- undo_redo->add_undo_method(source, "disconnect", cToMake.signal, target, cToMake.method);
+ Callable c(target, cToMake.method);
+
+ undo_redo->add_do_method(source, "connect", cToMake.signal, c, cToMake.binds, cToMake.flags);
+ undo_redo->add_undo_method(source, "disconnect", cToMake.signal, c);
undo_redo->add_do_method(this, "update_tree");
undo_redo->add_undo_method(this, "update_tree");
undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
@@ -617,14 +625,15 @@ void ConnectionsDock::_connect(Connection cToMake) {
* Break single connection w/ undo-redo functionality.
*/
void ConnectionsDock::_disconnect(TreeItem &item) {
+ Connection cd = item.get_metadata(0);
+ ConnectDialog::ConnectionData c = cd;
- Connection c = item.get_metadata(0);
ERR_FAIL_COND(c.source != selectedNode); // Shouldn't happen but... Bugcheck.
undo_redo->create_action(vformat(TTR("Disconnect '%s' from '%s'"), c.signal, c.method));
- undo_redo->add_do_method(selectedNode, "disconnect", c.signal, c.target, c.method);
- undo_redo->add_undo_method(selectedNode, "connect", c.signal, c.target, c.method, c.binds, c.flags);
+ undo_redo->add_do_method(selectedNode, "disconnect", c.signal, Callable(c.target, c.method));
+ undo_redo->add_undo_method(selectedNode, "connect", c.signal, Callable(c.target, c.method), c.binds, c.flags);
undo_redo->add_do_method(this, "update_tree");
undo_redo->add_undo_method(this, "update_tree");
undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); // To force redraw of scene tree.
@@ -638,20 +647,21 @@ void ConnectionsDock::_disconnect(TreeItem &item) {
* Can undo-redo as a single action.
*/
void ConnectionsDock::_disconnect_all() {
-
TreeItem *item = tree->get_selected();
- if (!_is_item_signal(*item))
+ if (!_is_item_signal(*item)) {
return;
+ }
TreeItem *child = item->get_children();
String signalName = item->get_metadata(0).operator Dictionary()["name"];
undo_redo->create_action(vformat(TTR("Disconnect all from signal: '%s'"), signalName));
while (child) {
- Connection c = child->get_metadata(0);
- undo_redo->add_do_method(selectedNode, "disconnect", c.signal, c.target, c.method);
- undo_redo->add_undo_method(selectedNode, "connect", c.signal, c.target, c.method, c.binds, c.flags);
+ Connection cd = child->get_metadata(0);
+ ConnectDialog::ConnectionData c = cd;
+ undo_redo->add_do_method(selectedNode, "disconnect", c.signal, Callable(c.target, c.method));
+ undo_redo->add_undo_method(selectedNode, "connect", c.signal, Callable(c.target, c.method), c.binds, c.flags);
child = child->get_next();
}
@@ -664,7 +674,6 @@ void ConnectionsDock::_disconnect_all() {
}
void ConnectionsDock::_tree_item_selected() {
-
TreeItem *item = tree->get_selected();
if (!item) { // Unlikely. Disable button just in case.
connect_button->set_text(TTR("Connect..."));
@@ -682,8 +691,9 @@ void ConnectionsDock::_tree_item_activated() { // "Activation" on double-click.
TreeItem *item = tree->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
if (_is_item_signal(*item)) {
_open_connection_dialog(*item);
@@ -693,7 +703,6 @@ void ConnectionsDock::_tree_item_activated() { // "Activation" on double-click.
}
bool ConnectionsDock::_is_item_signal(TreeItem &item) {
-
return (item.get_parent() == tree->get_root() || item.get_parent()->get_parent() == tree->get_root());
}
@@ -701,12 +710,11 @@ bool ConnectionsDock::_is_item_signal(TreeItem &item) {
* Open connection dialog with TreeItem data to CREATE a brand-new connection.
*/
void ConnectionsDock::_open_connection_dialog(TreeItem &item) {
-
String signal = item.get_metadata(0).operator Dictionary()["name"];
const String &signalname = signal;
String midname = selectedNode->get_name();
for (int i = 0; i < midname.length(); i++) { //TODO: Regex filter may be cleaner.
- CharType c = midname[i];
+ char32_t c = midname[i];
if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_')) {
if (c == ' ') {
// Replace spaces with underlines.
@@ -728,7 +736,7 @@ void ConnectionsDock::_open_connection_dialog(TreeItem &item) {
StringName dst_method = "_on_" + midname + "_" + signal;
- Connection c;
+ ConnectDialog::ConnectionData c;
c.source = selectedNode;
c.signal = StringName(signalname);
c.target = dst_node;
@@ -741,14 +749,14 @@ void ConnectionsDock::_open_connection_dialog(TreeItem &item) {
/*
* Open connection dialog with Connection data to EDIT an existing connection.
*/
-void ConnectionsDock::_open_connection_dialog(Connection cToEdit) {
-
+void ConnectionsDock::_open_connection_dialog(ConnectDialog::ConnectionData cToEdit) {
Node *src = static_cast<Node *>(cToEdit.source);
Node *dst = static_cast<Node *>(cToEdit.target);
if (src && dst) {
+ const String &signalname = cToEdit.signal;
connect_dialog->set_title(TTR("Edit Connection:") + cToEdit.signal);
- connect_dialog->popup_centered();
+ connect_dialog->popup_dialog(signalname);
connect_dialog->init(cToEdit, true);
}
}
@@ -757,20 +765,23 @@ void ConnectionsDock::_open_connection_dialog(Connection cToEdit) {
* Open slot method location in script editor.
*/
void ConnectionsDock::_go_to_script(TreeItem &item) {
-
- if (_is_item_signal(item))
+ if (_is_item_signal(item)) {
return;
+ }
- Connection c = item.get_metadata(0);
+ Connection cd = item.get_metadata(0);
+ ConnectDialog::ConnectionData c = cd;
ERR_FAIL_COND(c.source != selectedNode); //shouldn't happen but...bugcheck
- if (!c.target)
+ if (!c.target) {
return;
+ }
Ref<Script> script = c.target->get_script();
- if (script.is_null())
+ if (script.is_null()) {
return;
+ }
if (script.is_valid() && ScriptEditor::get_singleton()->script_goto_method(script, c.method)) {
editor->call("_editor_select", EditorNode::EDITOR_SCRIPT);
@@ -778,11 +789,11 @@ void ConnectionsDock::_go_to_script(TreeItem &item) {
}
void ConnectionsDock::_handle_signal_menu_option(int option) {
-
TreeItem *item = tree->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
switch (option) {
case CONNECT: {
@@ -797,11 +808,11 @@ void ConnectionsDock::_handle_signal_menu_option(int option) {
}
void ConnectionsDock::_handle_slot_menu_option(int option) {
-
TreeItem *item = tree->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
switch (option) {
case EDIT: {
@@ -819,11 +830,11 @@ void ConnectionsDock::_handle_slot_menu_option(int option) {
}
void ConnectionsDock::_rmb_pressed(Vector2 position) {
-
TreeItem *item = tree->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
Vector2 global_position = tree->get_global_position() + position;
@@ -837,12 +848,10 @@ void ConnectionsDock::_rmb_pressed(Vector2 position) {
}
void ConnectionsDock::_close() {
-
hide();
}
void ConnectionsDock::_connect_pressed() {
-
TreeItem *item = tree->get_selected();
if (!item) {
connect_button->set_disabled(true);
@@ -858,38 +867,26 @@ void ConnectionsDock::_connect_pressed() {
}
void ConnectionsDock::_notification(int p_what) {
-
if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
update_tree();
}
}
void ConnectionsDock::_bind_methods() {
-
- ClassDB::bind_method("_make_or_edit_connection", &ConnectionsDock::_make_or_edit_connection);
- ClassDB::bind_method("_disconnect_all", &ConnectionsDock::_disconnect_all);
- ClassDB::bind_method("_tree_item_selected", &ConnectionsDock::_tree_item_selected);
- ClassDB::bind_method("_tree_item_activated", &ConnectionsDock::_tree_item_activated);
- ClassDB::bind_method("_handle_signal_menu_option", &ConnectionsDock::_handle_signal_menu_option);
- ClassDB::bind_method("_handle_slot_menu_option", &ConnectionsDock::_handle_slot_menu_option);
- ClassDB::bind_method("_rmb_pressed", &ConnectionsDock::_rmb_pressed);
- ClassDB::bind_method("_close", &ConnectionsDock::_close);
- ClassDB::bind_method("_connect_pressed", &ConnectionsDock::_connect_pressed);
ClassDB::bind_method("update_tree", &ConnectionsDock::update_tree);
}
void ConnectionsDock::set_node(Node *p_node) {
-
selectedNode = p_node;
update_tree();
}
void ConnectionsDock::update_tree() {
-
tree->clear();
- if (!selectedNode)
+ if (!selectedNode) {
return;
+ }
TreeItem *root = tree->create_item();
@@ -901,64 +898,69 @@ void ConnectionsDock::update_tree() {
StringName base = selectedNode->get_class();
while (base) {
-
List<MethodInfo> node_signals2;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
String name;
if (!did_script) {
-
+ // Get script signals (including signals from any base scripts).
Ref<Script> scr = selectedNode->get_script();
if (scr.is_valid()) {
scr->get_script_signal_list(&node_signals2);
- if (scr->get_path().is_resource_file())
+ if (scr->get_path().is_resource_file()) {
name = scr->get_path().get_file();
- else
+ } else {
name = scr->get_class();
+ }
- if (has_icon(scr->get_class(), "EditorIcons")) {
- icon = get_icon(scr->get_class(), "EditorIcons");
+ if (has_theme_icon(scr->get_class(), "EditorIcons")) {
+ icon = get_theme_icon(scr->get_class(), "EditorIcons");
}
}
} else {
-
ClassDB::get_signal_list(base, &node_signals2, true);
- if (has_icon(base, "EditorIcons")) {
- icon = get_icon(base, "EditorIcons");
+ if (has_theme_icon(base, "EditorIcons")) {
+ icon = get_theme_icon(base, "EditorIcons");
}
name = base;
}
if (!icon.is_valid()) {
- icon = get_icon("Object", "EditorIcons");
+ icon = get_theme_icon("Object", "EditorIcons");
}
- TreeItem *pitem = NULL;
+ TreeItem *section_item = nullptr;
+ // Create subsections.
if (node_signals2.size()) {
- pitem = tree->create_item(root);
- pitem->set_text(0, name);
- pitem->set_icon(0, icon);
- pitem->set_selectable(0, false);
- pitem->set_editable(0, false);
- pitem->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
+ section_item = tree->create_item(root);
+ section_item->set_text(0, name);
+ section_item->set_icon(0, icon);
+ section_item->set_selectable(0, false);
+ section_item->set_editable(0, false);
+ section_item->set_custom_bg_color(0, get_theme_color("prop_subsection", "Editor"));
node_signals2.sort();
}
for (List<MethodInfo>::Element *E = node_signals2.front(); E; E = E->next()) {
-
MethodInfo &mi = E->get();
StringName signal_name = mi.name;
String signaldesc = "(";
- PoolStringArray argnames;
+ PackedStringArray argnames;
+
+ String filter_text = search_box->get_text();
+ if (!filter_text.is_subsequence_ofi(signal_name)) {
+ continue;
+ }
+
if (mi.arguments.size()) {
for (int i = 0; i < mi.arguments.size(); i++) {
-
PropertyInfo &pi = mi.arguments[i];
- if (i > 0)
+ if (i > 0) {
signaldesc += ", ";
+ }
String tname = "var";
if (pi.type == Variant::OBJECT && pi.class_name != StringName()) {
tname = pi.class_name.operator String();
@@ -971,20 +973,21 @@ void ConnectionsDock::update_tree() {
}
signaldesc += ")";
- TreeItem *item = tree->create_item(pitem);
- item->set_text(0, String(signal_name) + signaldesc);
+ // Create the children of the subsection - the actual list of signals.
+ TreeItem *signal_item = tree->create_item(section_item);
+ signal_item->set_text(0, String(signal_name) + signaldesc);
Dictionary sinfo;
sinfo["name"] = signal_name;
sinfo["args"] = argnames;
- item->set_metadata(0, sinfo);
- item->set_icon(0, get_icon("Signal", "EditorIcons"));
+ signal_item->set_metadata(0, sinfo);
+ signal_item->set_icon(0, get_theme_icon("Signal", "EditorIcons"));
// Set tooltip with the signal's documentation.
{
String descr;
bool found = false;
- Map<StringName, Map<StringName, String> >::Element *G = descr_cache.find(base);
+ Map<StringName, Map<StringName, String>>::Element *G = descr_cache.find(base);
if (G) {
Map<StringName, String>::Element *F = G->get().find(signal_name);
if (F) {
@@ -999,7 +1002,7 @@ void ConnectionsDock::update_tree() {
while (F && descr == String()) {
for (int i = 0; i < F->get().signals.size(); i++) {
if (F->get().signals[i].name == signal_name.operator String()) {
- descr = F->get().signals[i].description.strip_edges();
+ descr = DTR(F->get().signals[i].description);
break;
}
}
@@ -1013,7 +1016,7 @@ void ConnectionsDock::update_tree() {
}
// "::" separators used in make_custom_tooltip for formatting.
- item->set_tooltip(0, String(signal_name) + "::" + signaldesc + "::" + descr);
+ signal_item->set_tooltip(0, String(signal_name) + "::" + signaldesc + "::" + descr);
}
// List existing connections
@@ -1021,36 +1024,40 @@ void ConnectionsDock::update_tree() {
selectedNode->get_signal_connection_list(signal_name, &connections);
for (List<Object::Connection>::Element *F = connections.front(); F; F = F->next()) {
-
- Object::Connection &c = F->get();
- if (!(c.flags & CONNECT_PERSIST))
+ Connection cn = F->get();
+ if (!(cn.flags & CONNECT_PERSIST)) {
continue;
+ }
+ ConnectDialog::ConnectionData c = cn;
Node *target = Object::cast_to<Node>(c.target);
- if (!target)
+ if (!target) {
continue;
+ }
String path = String(selectedNode->get_path_to(target)) + " :: " + c.method + "()";
- if (c.flags & CONNECT_DEFERRED)
+ if (c.flags & CONNECT_DEFERRED) {
path += " (deferred)";
- if (c.flags & CONNECT_ONESHOT)
+ }
+ if (c.flags & CONNECT_ONESHOT) {
path += " (oneshot)";
+ }
if (c.binds.size()) {
-
path += " binds(";
for (int i = 0; i < c.binds.size(); i++) {
-
- if (i > 0)
+ if (i > 0) {
path += ", ";
+ }
path += c.binds[i].operator String();
}
path += ")";
}
- TreeItem *item2 = tree->create_item(item);
- item2->set_text(0, path);
- item2->set_metadata(0, c);
- item2->set_icon(0, get_icon("Slot", "EditorIcons"));
+ TreeItem *connection_item = tree->create_item(signal_item);
+ connection_item->set_text(0, path);
+ Connection cd = c;
+ connection_item->set_metadata(0, cd);
+ connection_item->set_icon(0, get_theme_icon("Slot", "EditorIcons"));
}
}
@@ -1066,18 +1073,25 @@ void ConnectionsDock::update_tree() {
}
ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
-
editor = p_editor;
set_name(TTR("Signals"));
VBoxContainer *vbc = this;
+ search_box = memnew(LineEdit);
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ search_box->set_placeholder(TTR("Filter signals"));
+ search_box->set_right_icon(get_theme_icon("Search", "EditorIcons"));
+ search_box->set_clear_button_enabled(true);
+ search_box->connect("text_changed", callable_mp(this, &ConnectionsDock::_filter_changed));
+ vbc->add_child(search_box);
+
tree = memnew(ConnectionsDockTree);
tree->set_columns(1);
tree->set_select_mode(Tree::SELECT_ROW);
tree->set_hide_root(true);
vbc->add_child(tree);
- tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
tree->set_allow_rmb_select(true);
connect_button = memnew(Button);
@@ -1085,37 +1099,35 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
vbc->add_child(hb);
hb->add_spacer();
hb->add_child(connect_button);
- connect_button->connect("pressed", this, "_connect_pressed");
+ connect_button->connect("pressed", callable_mp(this, &ConnectionsDock::_connect_pressed));
connect_dialog = memnew(ConnectDialog);
- connect_dialog->set_as_toplevel(true);
add_child(connect_dialog);
disconnect_all_dialog = memnew(ConfirmationDialog);
- disconnect_all_dialog->set_as_toplevel(true);
add_child(disconnect_all_dialog);
- disconnect_all_dialog->connect("confirmed", this, "_disconnect_all");
+ disconnect_all_dialog->connect("confirmed", callable_mp(this, &ConnectionsDock::_disconnect_all));
disconnect_all_dialog->set_text(TTR("Are you sure you want to remove all connections from this signal?"));
signal_menu = memnew(PopupMenu);
add_child(signal_menu);
- signal_menu->connect("id_pressed", this, "_handle_signal_menu_option");
+ signal_menu->connect("id_pressed", callable_mp(this, &ConnectionsDock::_handle_signal_menu_option));
signal_menu->add_item(TTR("Connect..."), CONNECT);
signal_menu->add_item(TTR("Disconnect All"), DISCONNECT_ALL);
slot_menu = memnew(PopupMenu);
add_child(slot_menu);
- slot_menu->connect("id_pressed", this, "_handle_slot_menu_option");
+ slot_menu->connect("id_pressed", callable_mp(this, &ConnectionsDock::_handle_slot_menu_option));
slot_menu->add_item(TTR("Edit..."), EDIT);
slot_menu->add_item(TTR("Go To Method"), GO_TO_SCRIPT);
slot_menu->add_item(TTR("Disconnect"), DISCONNECT);
- connect_dialog->connect("connected", this, "_make_or_edit_connection");
- tree->connect("item_selected", this, "_tree_item_selected");
- tree->connect("item_activated", this, "_tree_item_activated");
- tree->connect("item_rmb_selected", this, "_rmb_pressed");
+ connect_dialog->connect("connected", callable_mp(this, &ConnectionsDock::_make_or_edit_connection));
+ tree->connect("item_selected", callable_mp(this, &ConnectionsDock::_tree_item_selected));
+ tree->connect("item_activated", callable_mp(this, &ConnectionsDock::_tree_item_activated));
+ tree->connect("item_rmb_selected", callable_mp(this, &ConnectionsDock::_rmb_pressed));
- add_constant_override("separation", 3 * EDSCALE);
+ add_theme_constant_override("separation", 3 * EDSCALE);
}
ConnectionsDock::~ConnectionsDock() {
diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h
index c30413953a..48fdb91f5a 100644
--- a/editor/connections_dialog.h
+++ b/editor/connections_dialog.h
@@ -50,9 +50,38 @@ class PopupMenu;
class ConnectDialogBinds;
class ConnectDialog : public ConfirmationDialog {
-
GDCLASS(ConnectDialog, ConfirmationDialog);
+public:
+ struct ConnectionData {
+ Node *source = nullptr;
+ Node *target = nullptr;
+ StringName signal;
+ StringName method;
+ uint32_t flags = 0;
+ Vector<Variant> binds;
+
+ ConnectionData() {
+ }
+ ConnectionData(const Connection &p_connection) {
+ source = Object::cast_to<Node>(p_connection.signal.get_object());
+ signal = p_connection.signal.get_name();
+ target = Object::cast_to<Node>(p_connection.callable.get_object());
+ method = p_connection.callable.get_method();
+ flags = p_connection.flags;
+ binds = p_connection.binds;
+ }
+ operator Connection() {
+ Connection c;
+ c.signal = ::Signal(source, signal);
+ c.callable = Callable(target, method);
+ c.flags = flags;
+ c.binds = binds;
+ return c;
+ }
+ };
+
+private:
Label *connect_to_label;
LineEdit *from_signal;
Node *source;
@@ -73,10 +102,11 @@ class ConnectDialog : public ConfirmationDialog {
Label *error_label;
- void ok_pressed();
+ void ok_pressed() override;
void _cancel_pressed();
+ void _item_activated();
+ void _text_entered(const String &_text);
void _tree_node_selected();
- void _tree_item_activated();
void _add_bind();
void _remove_bind();
void _advanced_pressed();
@@ -99,7 +129,7 @@ public:
bool get_oneshot() const;
bool is_editing() const;
- void init(Connection c, bool bEdit = false);
+ void init(ConnectionData c, bool bEdit = false);
void popup_dialog(const String &p_for_signal);
ConnectDialog();
@@ -111,12 +141,10 @@ public:
// Custom Tree needed to use a RichTextLabel as tooltip control
// when display signal documentation.
class ConnectionsDockTree : public Tree {
-
virtual Control *make_custom_tooltip(const String &p_text) const;
};
class ConnectionsDock : public VBoxContainer {
-
GDCLASS(ConnectionsDock, VBoxContainer);
//Right-click Pop-up Menu Options.
@@ -141,11 +169,14 @@ class ConnectionsDock : public VBoxContainer {
PopupMenu *signal_menu;
PopupMenu *slot_menu;
UndoRedo *undo_redo;
+ LineEdit *search_box;
+
+ Map<StringName, Map<StringName, String>> descr_cache;
- Map<StringName, Map<StringName, String> > descr_cache;
+ void _filter_changed(const String &p_text);
void _make_or_edit_connection();
- void _connect(Connection cToMake);
+ void _connect(ConnectDialog::ConnectionData cToMake);
void _disconnect(TreeItem &item);
void _disconnect_all();
@@ -154,7 +185,7 @@ class ConnectionsDock : public VBoxContainer {
bool _is_item_signal(TreeItem &item);
void _open_connection_dialog(TreeItem &item);
- void _open_connection_dialog(Connection cToEdit);
+ void _open_connection_dialog(ConnectDialog::ConnectionData cToEdit);
void _go_to_script(TreeItem &item);
void _handle_signal_menu_option(int option);
@@ -172,7 +203,7 @@ public:
void set_node(Node *p_node);
void update_tree();
- ConnectionsDock(EditorNode *p_editor = NULL);
+ ConnectionsDock(EditorNode *p_editor = nullptr);
~ConnectionsDock();
};
diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp
index 4adb3844bc..1e3dc01112 100644
--- a/editor/create_dialog.cpp
+++ b/editor/create_dialog.cpp
@@ -32,70 +32,15 @@
#include "core/class_db.h"
#include "core/os/keyboard.h"
-#include "core/print_string.h"
#include "editor_feature_profile.h"
-#include "editor_help.h"
#include "editor_node.h"
#include "editor_scale.h"
#include "editor_settings.h"
-#include "scene/gui/box_container.h"
void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode, const String &p_select_type) {
+ _fill_type_list();
- type_list.clear();
- ClassDB::get_class_list(&type_list);
- ScriptServer::get_global_class_list(&type_list);
- type_list.sort_custom<StringName::AlphCompare>();
-
- recent->clear();
-
- FileAccess *f = FileAccess::open(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("create_recent." + base_type), FileAccess::READ);
-
- if (f) {
-
- TreeItem *root = recent->create_item();
-
- while (!f->eof_reached()) {
- String l = f->get_line().strip_edges();
- String name = l.split(" ")[0];
- if ((ClassDB::class_exists(name) || ScriptServer::is_global_class(name)) && !_is_class_disabled_by_feature_profile(name)) {
- TreeItem *ti = recent->create_item(root);
- ti->set_text(0, l);
- ti->set_icon(0, EditorNode::get_singleton()->get_class_icon(l, base_type));
- }
- }
-
- memdelete(f);
- }
-
- favorites->clear();
-
- f = FileAccess::open(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("favorites." + base_type), FileAccess::READ);
-
- favorite_list.clear();
-
- if (f) {
-
- while (!f->eof_reached()) {
- String l = f->get_line().strip_edges();
-
- if (l != String()) {
- favorite_list.push_back(l);
- }
- }
-
- memdelete(f);
- }
-
- _save_and_update_favorite_list();
-
- // Restore valid window bounds or pop up at default size.
- Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", Rect2());
- if (saved_size != Rect2()) {
- popup(saved_size);
- } else {
- popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
- }
+ icon_fallback = search_options->has_theme_icon(base_type, "EditorIcons") ? base_type : "Object";
if (p_dont_clear) {
search_box->select_all();
@@ -103,349 +48,288 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode, const St
search_box->clear();
}
- search_box->grab_focus();
+ if (p_replace_mode) {
+ search_box->set_text(p_select_type);
+ }
+ search_box->grab_focus();
_update_search();
- is_replace_mode = p_replace_mode;
-
if (p_replace_mode) {
- select_type(p_select_type);
set_title(vformat(TTR("Change %s Type"), base_type));
get_ok()->set_text(TTR("Change"));
} else {
set_title(vformat(TTR("Create New %s"), base_type));
get_ok()->set_text(TTR("Create"));
}
-}
-
-void CreateDialog::_text_changed(const String &p_newtext) {
- _update_search();
-}
-
-void CreateDialog::_sbox_input(const Ref<InputEvent> &p_ie) {
-
- Ref<InputEventKey> k = p_ie;
- if (k.is_valid() && (k->get_scancode() == KEY_UP ||
- k->get_scancode() == KEY_DOWN ||
- k->get_scancode() == KEY_PAGEUP ||
- k->get_scancode() == KEY_PAGEDOWN)) {
+ _load_favorites_and_history();
+ _save_and_update_favorite_list();
- search_options->call("_gui_input", k);
- search_box->accept_event();
+ // Restore valid window bounds or pop up at default size.
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
+ } else {
+ popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
}
}
-void CreateDialog::add_type(const String &p_type, HashMap<String, TreeItem *> &p_types, TreeItem *p_root, TreeItem **to_select) {
-
- if (p_types.has(p_type))
- return;
+void CreateDialog::_fill_type_list() {
+ List<StringName> complete_type_list;
+ ClassDB::get_class_list(&complete_type_list);
+ ScriptServer::get_global_class_list(&complete_type_list);
- bool cpp_type = ClassDB::class_exists(p_type);
EditorData &ed = EditorNode::get_editor_data();
- if (p_type == base_type)
- return;
-
- if (cpp_type) {
- if (!ClassDB::is_parent_class(p_type, base_type))
- return;
- } else {
- if (!search_loaded_scripts.has(p_type)) {
- search_loaded_scripts[p_type] = ed.script_class_load_script(p_type);
- }
-
- if (!ScriptServer::is_global_class(p_type) || !ed.script_class_is_parent(p_type, base_type))
- return;
-
- String script_path = ScriptServer::get_global_class_path(p_type);
- if (script_path.find("res://addons/", 0) != -1) {
- if (!EditorNode::get_singleton()->is_addon_plugin_enabled(script_path.get_slicec('/', 3)))
- return;
- }
- }
-
- String inherits = cpp_type ? ClassDB::get_parent_class(p_type) : ed.script_class_get_base(p_type);
-
- TreeItem *parent = p_root;
-
- if (inherits.length()) {
-
- if (!p_types.has(inherits)) {
-
- add_type(inherits, p_types, p_root, to_select);
- }
-
- if (p_types.has(inherits))
- parent = p_types[inherits];
- else if (ScriptServer::is_global_class(inherits))
- return;
- }
-
- bool can_instance = (cpp_type && ClassDB::can_instance(p_type)) || ScriptServer::is_global_class(p_type);
+ for (List<StringName>::Element *I = complete_type_list.front(); I; I = I->next()) {
+ String type = I->get();
+ if (!_should_hide_type(type)) {
+ type_list.push_back(type);
- TreeItem *item = search_options->create_item(parent);
- if (cpp_type) {
- item->set_text(0, p_type);
- } else {
- item->set_metadata(0, p_type);
- item->set_text(0, p_type + " (" + ScriptServer::get_global_class_path(p_type).get_file() + ")");
- }
- if (!can_instance) {
- item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
- item->set_selectable(0, false);
- } else if (!(*to_select && (*to_select)->get_text(0) == search_box->get_text())) {
- String search_term = search_box->get_text().to_lower();
-
- // if the node name matches exactly as the search, the node should be selected.
- // this also fixes when the user clicks on recent nodes.
- if (p_type.to_lower() == search_term) {
- *to_select = item;
- } else {
- bool current_type_prefered = _is_type_prefered(p_type);
- bool selected_type_prefered = *to_select ? _is_type_prefered((*to_select)->get_text(0).split(" ")[0]) : false;
-
- bool is_subsequence_of_type = search_box->get_text().is_subsequence_ofi(p_type);
- bool is_substring_of_type = p_type.to_lower().find(search_term) >= 0;
- bool is_substring_of_selected = false;
- bool is_subsequence_of_selected = false;
- bool is_selected_equal = false;
-
- if (*to_select) {
- String name = (*to_select)->get_text(0).split(" ")[0].to_lower();
- is_substring_of_selected = name.find(search_term) >= 0;
- is_subsequence_of_selected = search_term.is_subsequence_of(name);
- is_selected_equal = name == search_term;
+ if (!ed.get_custom_types().has(type)) {
+ continue;
}
- if (is_subsequence_of_type && !is_selected_equal) {
- if (is_substring_of_type) {
- if (!is_substring_of_selected || (current_type_prefered && !selected_type_prefered)) {
- *to_select = item;
- }
- } else {
- // substring results weigh more than subsequences, so let's make sure we don't override them
- if (!is_substring_of_selected) {
- if (!is_subsequence_of_selected || (current_type_prefered && !selected_type_prefered)) {
- *to_select = item;
- }
- }
- }
+ const Vector<EditorData::CustomType> &ct = ed.get_custom_types()[type];
+ for (int i = 0; i < ct.size(); i++) {
+ custom_type_parents[ct[i].name] = type;
+ custom_type_indices[ct[i].name] = i;
+ type_list.push_back(ct[i].name);
}
}
}
+ type_list.sort_custom<StringName::AlphCompare>();
+}
- if (bool(EditorSettings::get_singleton()->get("docks/scene_tree/start_create_dialog_fully_expanded"))) {
- item->set_collapsed(false);
- } else {
- // don't collapse search results
- bool collapse = (search_box->get_text() == "");
- // don't collapse the root node
- collapse &= (item != p_root);
- // don't collapse abstract nodes on the first tree level
- collapse &= ((parent != p_root) || (can_instance));
- item->set_collapsed(collapse);
+bool CreateDialog::_is_type_preferred(const String &p_type) const {
+ if (ClassDB::class_exists(p_type)) {
+ return ClassDB::is_parent_class(p_type, preferred_search_result_type);
}
- const String &description = EditorHelp::get_doc_data()->class_list[p_type].brief_description;
- item->set_tooltip(0, description);
+ return EditorNode::get_editor_data().script_class_is_parent(p_type, preferred_search_result_type);
+}
- item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, base_type));
+bool CreateDialog::_is_class_disabled_by_feature_profile(const StringName &p_class) const {
+ Ref<EditorFeatureProfile> profile = EditorFeatureProfileManager::get_singleton()->get_current_profile();
- p_types[p_type] = item;
+ return !profile.is_null() && profile->is_class_disabled(p_class);
}
-bool CreateDialog::_is_type_prefered(const String &type) {
- bool cpp_type = ClassDB::class_exists(type);
- EditorData &ed = EditorNode::get_editor_data();
-
- if (cpp_type) {
- return ClassDB::is_parent_class(type, preferred_search_result_type);
+bool CreateDialog::_should_hide_type(const String &p_type) const {
+ if (_is_class_disabled_by_feature_profile(p_type)) {
+ return true;
}
- return ed.script_class_is_parent(type, preferred_search_result_type);
-}
-bool CreateDialog::_is_class_disabled_by_feature_profile(const StringName &p_class) {
+ if (base_type == "Node" && p_type.begins_with("Editor")) {
+ return true; // Do not show editor nodes.
+ }
- Ref<EditorFeatureProfile> profile = EditorFeatureProfileManager::get_singleton()->get_current_profile();
- if (profile.is_null()) {
- return false;
+ if (p_type == base_type) {
+ return true; // Root is already added.
}
- return profile->is_class_disabled(p_class);
-}
+ if (ClassDB::class_exists(p_type)) {
+ if (!ClassDB::can_instance(p_type)) {
+ return true; // Can't create abstract class.
+ }
-void CreateDialog::select_type(const String &p_type) {
+ if (!ClassDB::is_parent_class(p_type, base_type)) {
+ return true; // Wrong inheritance.
+ }
- TreeItem *to_select;
- if (search_options_types.has(p_type)) {
- to_select = search_options_types[p_type];
+ for (Set<StringName>::Element *E = type_blacklist.front(); E; E = E->next()) {
+ if (ClassDB::is_parent_class(p_type, E->get())) {
+ return true; // Parent type is blacklisted.
+ }
+ }
} else {
- to_select = search_options->get_root();
- }
+ if (!EditorNode::get_editor_data().script_class_is_parent(p_type, base_type)) {
+ return true; // Wrong inheritance.
+ }
+ if (!ScriptServer::is_global_class(p_type)) {
+ return true;
+ }
- // uncollapse from selected type to top level
- // TODO: should this be in tree?
- TreeItem *cur = to_select;
- while (cur) {
- cur->set_collapsed(false);
- cur = cur->get_parent();
+ String script_path = ScriptServer::get_global_class_path(p_type);
+ if (script_path.begins_with("res://addons/")) {
+ if (!EditorNode::get_singleton()->is_addon_plugin_enabled(script_path.get_slicec('/', 3))) {
+ return true; // Plugin is not enabled.
+ }
+ }
}
- to_select->select(0);
-
- search_options->scroll_to_item(to_select);
+ return false;
}
void CreateDialog::_update_search() {
search_options->clear();
- favorite->set_disabled(true);
-
- help_bit->set_text("");
-
search_options_types.clear();
TreeItem *root = search_options->create_item();
- EditorData &ed = EditorNode::get_editor_data();
-
root->set_text(0, base_type);
- if (has_icon(base_type, "EditorIcons")) {
- root->set_icon(0, get_icon(base_type, "EditorIcons"));
- }
+ root->set_icon(0, search_options->get_theme_icon(icon_fallback, "EditorIcons"));
+ search_options_types[base_type] = root;
- TreeItem *to_select = search_box->get_text() == base_type ? root : NULL;
+ const String search_text = search_box->get_text();
+ bool empty_search = search_text == "";
+ // Filter all candidate results.
+ Vector<String> candidates;
for (List<StringName>::Element *I = type_list.front(); I; I = I->next()) {
-
- String type = I->get();
-
- if (_is_class_disabled_by_feature_profile(type)) {
- continue;
+ if (empty_search || search_text.is_subsequence_ofi(I->get())) {
+ candidates.push_back(I->get());
}
- bool cpp_type = ClassDB::class_exists(type);
+ }
- if (base_type == "Node" && type.begins_with("Editor"))
- continue; // do not show editor nodes
+ // Build the type tree.
+ for (int i = 0; i < candidates.size(); i++) {
+ _add_type(candidates[i], ClassDB::class_exists(candidates[i]));
+ }
- if (cpp_type && !ClassDB::can_instance(type))
- continue; // can't create what can't be instanced
+ // Select the best result.
+ if (empty_search) {
+ select_type(base_type);
+ } else if (candidates.size() > 0) {
+ select_type(_top_result(candidates, search_text));
+ } else {
+ favorite->set_disabled(true);
+ help_bit->set_text("");
+ get_ok()->set_disabled(true);
+ search_options->deselect_all();
+ }
+}
- if (cpp_type) {
- bool skip = false;
+void CreateDialog::_add_type(const String &p_type, bool p_cpp_type) {
+ if (search_options_types.has(p_type)) {
+ return;
+ }
- for (Set<StringName>::Element *E = type_blacklist.front(); E && !skip; E = E->next()) {
- if (ClassDB::is_parent_class(type, E->get()))
- skip = true;
- }
- if (skip)
- continue;
- }
+ String inherits;
+ if (p_cpp_type) {
+ inherits = ClassDB::get_parent_class(p_type);
+ } else if (ScriptServer::is_global_class(p_type)) {
+ inherits = EditorNode::get_editor_data().script_class_get_base(p_type);
+ } else {
+ inherits = custom_type_parents[p_type];
+ }
- if (search_box->get_text() == "") {
- add_type(type, search_options_types, root, &to_select);
- } else {
+ _add_type(inherits, p_cpp_type || ClassDB::class_exists(inherits));
- bool found = false;
- String type2 = type;
+ TreeItem *item = search_options->create_item(search_options_types[inherits]);
+ search_options_types[p_type] = item;
+ _configure_search_option_item(item, p_type, p_cpp_type);
+}
- if (!cpp_type && !search_loaded_scripts.has(type)) {
- search_loaded_scripts[type] = ed.script_class_load_script(type);
- }
+void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String &p_type, const bool p_cpp_type) {
+ bool script_type = ScriptServer::is_global_class(p_type);
+ if (p_cpp_type) {
+ r_item->set_text(0, p_type);
+ } else if (script_type) {
+ r_item->set_metadata(0, p_type);
+ r_item->set_text(0, p_type + " (" + ScriptServer::get_global_class_path(p_type).get_file() + ")");
+ } else {
+ r_item->set_metadata(0, custom_type_parents[p_type]);
+ r_item->set_text(0, p_type);
+ }
- while (type2 != "" && (cpp_type ? ClassDB::is_parent_class(type2, base_type) : ed.script_class_is_parent(type2, base_type)) && type2 != base_type) {
- if (search_box->get_text().is_subsequence_ofi(type2)) {
+ bool can_instance = (p_cpp_type && ClassDB::can_instance(p_type)) || !p_cpp_type;
+ if (!can_instance) {
+ r_item->set_custom_color(0, search_options->get_theme_color("disabled_font_color", "Editor"));
+ r_item->set_selectable(0, false);
+ }
- found = true;
- break;
- }
+ if (search_box->get_text() != "") {
+ r_item->set_collapsed(false);
+ } else {
+ // Don't collapse the root node or an abstract node on the first tree level.
+ bool should_collapse = p_type != base_type && (r_item->get_parent()->get_text(0) != base_type || can_instance);
- type2 = cpp_type ? ClassDB::get_parent_class(type2) : ed.script_class_get_base(type2);
+ if (should_collapse && bool(EditorSettings::get_singleton()->get("docks/scene_tree/start_create_dialog_fully_expanded"))) {
+ should_collapse = false; // Collapse all nodes anyway.
+ }
+ r_item->set_collapsed(should_collapse);
+ }
- if (!cpp_type && !search_loaded_scripts.has(type2)) {
- search_loaded_scripts[type2] = ed.script_class_load_script(type2);
- }
- }
+ const String &description = DTR(EditorHelp::get_doc_data()->class_list[p_type].brief_description);
+ r_item->set_tooltip(0, description);
+ r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback));
- if (found) {
- add_type(type, search_options_types, root, &to_select);
- }
+ if (!p_cpp_type && !script_type) {
+ Ref<Texture2D> icon = EditorNode::get_editor_data().get_custom_types()[custom_type_parents[p_type]][custom_type_indices[p_type]].icon;
+ if (icon.is_valid()) {
+ r_item->set_icon(0, icon);
}
+ }
+}
- if (EditorNode::get_editor_data().get_custom_types().has(type) && ClassDB::is_parent_class(type, base_type)) {
- //there are custom types based on this... cool.
+String CreateDialog::_top_result(const Vector<String> p_candidates, const String &p_search_text) const {
+ float highest_score = 0;
+ int highest_index = 0;
+ for (int i = 0; i < p_candidates.size(); i++) {
+ float score = _score_type(p_candidates[i].get_slicec(' ', 0), p_search_text);
+ if (score > highest_score) {
+ highest_score = score;
+ highest_index = i;
+ }
+ }
- const Vector<EditorData::CustomType> &ct = EditorNode::get_editor_data().get_custom_types()[type];
- for (int i = 0; i < ct.size(); i++) {
+ return p_candidates[highest_index];
+}
- bool show = search_box->get_text().is_subsequence_ofi(ct[i].name);
+float CreateDialog::_score_type(const String &p_type, const String &p_search) const {
+ float inverse_length = 1.f / float(p_type.length());
- if (!show)
- continue;
+ // Favor types where search term is a substring close to the start of the type.
+ float w = 0.5f;
+ int pos = p_type.findn(p_search);
+ float score = (pos > -1) ? 1.0f - w * MIN(1, 3 * pos * inverse_length) : MAX(0.f, .9f - w);
- if (!search_options_types.has(type))
- add_type(type, search_options_types, root, &to_select);
+ // Favor shorter items: they resemble the search term more.
+ w = 0.1f;
+ score *= (1 - w) + w * (p_search.length() * inverse_length);
- TreeItem *ti;
- if (search_options_types.has(type))
- ti = search_options_types[type];
- else
- ti = search_options->get_root();
+ score *= _is_type_preferred(p_type) ? 1.0f : 0.8f;
- TreeItem *item = search_options->create_item(ti);
- item->set_metadata(0, type);
- item->set_text(0, ct[i].name);
- if (ct[i].icon.is_valid()) {
- item->set_icon(0, ct[i].icon);
- }
+ // Add score for being a favorite type.
+ score *= (favorite_list.find(p_type) > -1) ? 1.0f : 0.7f;
- if (!to_select || ct[i].name == search_box->get_text()) {
- to_select = item;
- }
- }
+ // Look through at most 5 recent items
+ bool in_recent = false;
+ for (int i = 0; i < MIN(5, recent->get_item_count()); i++) {
+ if (recent->get_item_text(i) == p_type) {
+ in_recent = true;
+ break;
}
}
+ score *= in_recent ? 1.0f : 0.8f;
- if (search_box->get_text() == "") {
- to_select = root;
- }
-
- if (to_select) {
- to_select->select(0);
- search_options->scroll_to_item(to_select);
- favorite->set_disabled(false);
- favorite->set_pressed(favorite_list.find(to_select->get_text(0)) != -1);
- }
+ return score;
+}
- get_ok()->set_disabled(root->get_children() == NULL);
+void CreateDialog::_cleanup() {
+ type_list.clear();
+ favorite_list.clear();
+ favorites->clear();
+ recent->clear();
+ custom_type_parents.clear();
+ custom_type_indices.clear();
}
void CreateDialog::_confirmed() {
-
- TreeItem *ti = search_options->get_selected();
- if (!ti)
+ String selected_item = get_selected_type();
+ if (selected_item == String()) {
return;
+ }
FileAccess *f = FileAccess::open(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("create_recent." + base_type), FileAccess::WRITE);
-
if (f) {
- f->store_line(get_selected_type());
- TreeItem *t = recent->get_root();
- if (t)
- t = t->get_children();
- int count = 0;
- while (t) {
- if (t->get_text(0) != get_selected_type()) {
-
- f->store_line(t->get_text(0));
- }
+ f->store_line(selected_item);
- if (count > 32) {
- //limit it to 32 entries..
- break;
+ for (int i = 0; i < MIN(32, recent->get_item_count()); i++) {
+ if (recent->get_item_text(i) != selected_item) {
+ f->store_line(recent->get_item_text(i));
}
- t = t->get_next();
- count++;
}
memdelete(f);
@@ -453,119 +337,134 @@ void CreateDialog::_confirmed() {
emit_signal("create");
hide();
+ _cleanup();
}
-void CreateDialog::_notification(int p_what) {
+void CreateDialog::_text_changed(const String &p_newtext) {
+ _update_search();
+}
+
+void CreateDialog::_sbox_input(const Ref<InputEvent> &p_ie) {
+ Ref<InputEventKey> k = p_ie;
+ if (k.is_valid()) {
+ switch (k->get_keycode()) {
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_PAGEUP:
+ case KEY_PAGEDOWN: {
+ search_options->call("_gui_input", k);
+ search_box->accept_event();
+ } break;
+ }
+ }
+}
+void CreateDialog::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- connect("confirmed", this, "_confirmed");
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
+ connect("confirmed", callable_mp(this, &CreateDialog::_confirmed));
+ search_box->set_right_icon(search_options->get_theme_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
- favorite->set_icon(get_icon("Favorites", "EditorIcons"));
+ favorite->set_icon(search_options->get_theme_icon("Favorites", "EditorIcons"));
} break;
case NOTIFICATION_EXIT_TREE: {
- disconnect("confirmed", this, "_confirmed");
+ disconnect("confirmed", callable_mp(this, &CreateDialog::_confirmed));
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
- if (is_visible_in_tree()) {
+ if (is_visible()) {
search_box->call_deferred("grab_focus"); // still not visible
search_box->select_all();
+ } else {
+ EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", Rect2(get_position(), get_size()));
}
} break;
- case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", get_rect());
- search_loaded_scripts.clear();
- } break;
}
}
-void CreateDialog::set_base_type(const String &p_base) {
-
- base_type = p_base;
- if (is_replace_mode)
- set_title(vformat(TTR("Change %s Type"), p_base));
- else
- set_title(vformat(TTR("Create New %s"), p_base));
-
- _update_search();
-}
+void CreateDialog::select_type(const String &p_type) {
+ if (!search_options_types.has(p_type)) {
+ return;
+ }
-String CreateDialog::get_base_type() const {
+ TreeItem *to_select = search_options_types[p_type];
+ to_select->select(0);
+ search_options->scroll_to_item(to_select);
- return base_type;
-}
+ if (EditorHelp::get_doc_data()->class_list.has(p_type)) {
+ help_bit->set_text(DTR(EditorHelp::get_doc_data()->class_list[p_type].brief_description));
+ }
-void CreateDialog::set_preferred_search_result_type(const String &p_preferred_type) {
- preferred_search_result_type = p_preferred_type;
+ favorite->set_disabled(false);
+ favorite->set_pressed(favorite_list.find(p_type) != -1);
+ get_ok()->set_disabled(false);
}
-String CreateDialog::get_preferred_search_result_type() {
-
- return preferred_search_result_type;
-}
String CreateDialog::get_selected_type() {
-
TreeItem *selected = search_options->get_selected();
- if (selected)
- return selected->get_text(0);
- else
+ if (!selected) {
return String();
+ }
+
+ return selected->get_text(0);
}
Object *CreateDialog::instance_selected() {
-
TreeItem *selected = search_options->get_selected();
- if (selected) {
-
- Variant md = selected->get_metadata(0);
-
- String custom;
- if (md.get_type() != Variant::NIL)
- custom = md;
+ if (!selected) {
+ return nullptr;
+ }
- if (custom != String()) {
- if (ScriptServer::is_global_class(custom)) {
- Object *obj = EditorNode::get_editor_data().script_class_instance(custom);
- Node *n = Object::cast_to<Node>(obj);
- if (n)
- n->set_name(custom);
- return obj;
+ Variant md = selected->get_metadata(0);
+ Object *obj = nullptr;
+ if (md.get_type() != Variant::NIL) {
+ String custom = md;
+ if (ScriptServer::is_global_class(custom)) {
+ obj = EditorNode::get_editor_data().script_class_instance(custom);
+ Node *n = Object::cast_to<Node>(obj);
+ if (n) {
+ n->set_name(custom);
}
- return EditorNode::get_editor_data().instance_custom_type(selected->get_text(0), custom);
} else {
- return ClassDB::instance(selected->get_text(0));
+ obj = EditorNode::get_editor_data().instance_custom_type(selected->get_text(0), custom);
}
+ } else {
+ obj = ClassDB::instance(selected->get_text(0));
}
- return NULL;
-}
-
-void CreateDialog::_item_selected() {
+ // Check if any Object-type property should be instantiated.
+ List<PropertyInfo> pinfo;
+ obj->get_property_list(&pinfo);
- TreeItem *item = search_options->get_selected();
- if (!item)
- return;
-
- String name = item->get_text(0);
+ for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
+ PropertyInfo pi = E->get();
+ if (pi.type == Variant::OBJECT && pi.usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) {
+ Object *prop = ClassDB::instance(pi.class_name);
+ obj->set(pi.name, prop);
+ }
+ }
- favorite->set_disabled(false);
- favorite->set_pressed(favorite_list.find(name) != -1);
+ return obj;
+}
- if (!EditorHelp::get_doc_data()->class_list.has(name))
- return;
+void CreateDialog::_item_selected() {
+ String name = get_selected_type();
+ select_type(name);
+}
- help_bit->set_text(EditorHelp::get_doc_data()->class_list[name].brief_description);
+void CreateDialog::_hide_requested() {
+ _cancel_pressed(); // From AcceptDialog.
+}
- get_ok()->set_disabled(false);
+void CreateDialog::cancel_pressed() {
+ _cleanup();
}
void CreateDialog::_favorite_toggled() {
-
TreeItem *item = search_options->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
String name = item->get_text(0);
@@ -580,85 +479,45 @@ void CreateDialog::_favorite_toggled() {
_save_and_update_favorite_list();
}
-void CreateDialog::_save_favorite_list() {
-
- FileAccess *f = FileAccess::open(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("favorites." + base_type), FileAccess::WRITE);
-
- if (f) {
-
- for (int i = 0; i < favorite_list.size(); i++) {
- String l = favorite_list[i];
- String name = l.split(" ")[0];
- if (!(ClassDB::class_exists(name) || ScriptServer::is_global_class(name)))
- continue;
- f->store_line(l);
- }
- memdelete(f);
- }
-}
-
-void CreateDialog::_update_favorite_list() {
-
- favorites->clear();
- TreeItem *root = favorites->create_item();
- for (int i = 0; i < favorite_list.size(); i++) {
- String l = favorite_list[i];
- String name = l.split(" ")[0];
- if (!((ClassDB::class_exists(name) || ScriptServer::is_global_class(name)) && !_is_class_disabled_by_feature_profile(name)))
- continue;
- TreeItem *ti = favorites->create_item(root);
- ti->set_text(0, l);
- ti->set_icon(0, EditorNode::get_singleton()->get_class_icon(l, base_type));
- }
- emit_signal("favorites_updated");
-}
-
-void CreateDialog::_history_selected() {
-
- TreeItem *item = recent->get_selected();
- if (!item)
- return;
-
- search_box->set_text(item->get_text(0).get_slicec(' ', 0));
+void CreateDialog::_history_selected(int p_idx) {
+ search_box->set_text(recent->get_item_text(p_idx).get_slicec(' ', 0));
favorites->deselect_all();
_update_search();
}
void CreateDialog::_favorite_selected() {
-
TreeItem *item = favorites->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
search_box->set_text(item->get_text(0).get_slicec(' ', 0));
- recent->deselect_all();
+ recent->unselect_all();
_update_search();
}
-void CreateDialog::_history_activated() {
-
- _history_selected();
+void CreateDialog::_history_activated(int p_idx) {
+ _history_selected(p_idx);
_confirmed();
}
void CreateDialog::_favorite_activated() {
-
_favorite_selected();
_confirmed();
}
Variant CreateDialog::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
TreeItem *ti = favorites->get_item_at_position(p_point);
if (ti) {
Dictionary d;
d["type"] = "create_favorite_drag";
d["class"] = ti->get_text(0);
- ToolButton *tb = memnew(ToolButton);
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
tb->set_icon(ti->get_icon(0));
tb->set_text(ti->get_text(0));
- set_drag_preview(tb);
+ favorites->set_drag_preview(tb);
return d;
}
@@ -667,7 +526,6 @@ Variant CreateDialog::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
}
bool CreateDialog::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary d = p_data;
if (d.has("type") && String(d["type"]) == "create_favorite_drag") {
favorites->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
@@ -676,26 +534,29 @@ bool CreateDialog::can_drop_data_fw(const Point2 &p_point, const Variant &p_data
return false;
}
-void CreateDialog::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+void CreateDialog::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
Dictionary d = p_data;
TreeItem *ti = favorites->get_item_at_position(p_point);
- if (!ti)
+ if (!ti) {
return;
+ }
String drop_at = ti->get_text(0);
int ds = favorites->get_drop_section_at_position(p_point);
int drop_idx = favorite_list.find(drop_at);
- if (drop_idx < 0)
+ if (drop_idx < 0) {
return;
+ }
String type = d["class"];
int from_idx = favorite_list.find(type);
- if (from_idx < 0)
+ if (from_idx < 0) {
return;
+ }
if (drop_idx == from_idx) {
ds = -1; //cause it will be gone
@@ -719,21 +580,64 @@ void CreateDialog::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co
}
void CreateDialog::_save_and_update_favorite_list() {
- _save_favorite_list();
- _update_favorite_list();
+ favorites->clear();
+ TreeItem *root = favorites->create_item();
+
+ FileAccess *f = FileAccess::open(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("favorites." + base_type), FileAccess::WRITE);
+ if (f) {
+ for (int i = 0; i < favorite_list.size(); i++) {
+ String l = favorite_list[i];
+ String name = l.get_slicec(' ', 0);
+ if (!(ClassDB::class_exists(name) || ScriptServer::is_global_class(name))) {
+ continue;
+ }
+ f->store_line(l);
+
+ if (_is_class_disabled_by_feature_profile(name)) {
+ continue;
+ }
+
+ TreeItem *ti = favorites->create_item(root);
+ ti->set_text(0, l);
+ ti->set_icon(0, EditorNode::get_singleton()->get_class_icon(name, icon_fallback));
+ }
+ memdelete(f);
+ }
+
+ emit_signal("favorites_updated");
}
-void CreateDialog::_bind_methods() {
+void CreateDialog::_load_favorites_and_history() {
+ String dir = EditorSettings::get_singleton()->get_project_settings_dir();
+ FileAccess *f = FileAccess::open(dir.plus_file("create_recent." + base_type), FileAccess::READ);
+ if (f) {
+ while (!f->eof_reached()) {
+ String l = f->get_line().strip_edges();
+ String name = l.get_slicec(' ', 0);
+
+ if ((ClassDB::class_exists(name) || ScriptServer::is_global_class(name)) && !_is_class_disabled_by_feature_profile(name)) {
+ recent->add_item(l, EditorNode::get_singleton()->get_class_icon(name, icon_fallback));
+ }
+ }
+
+ memdelete(f);
+ }
- ClassDB::bind_method(D_METHOD("_text_changed"), &CreateDialog::_text_changed);
- ClassDB::bind_method(D_METHOD("_confirmed"), &CreateDialog::_confirmed);
- ClassDB::bind_method(D_METHOD("_sbox_input"), &CreateDialog::_sbox_input);
- ClassDB::bind_method(D_METHOD("_item_selected"), &CreateDialog::_item_selected);
- ClassDB::bind_method(D_METHOD("_favorite_toggled"), &CreateDialog::_favorite_toggled);
- ClassDB::bind_method(D_METHOD("_history_selected"), &CreateDialog::_history_selected);
- ClassDB::bind_method(D_METHOD("_favorite_selected"), &CreateDialog::_favorite_selected);
- ClassDB::bind_method(D_METHOD("_history_activated"), &CreateDialog::_history_activated);
- ClassDB::bind_method(D_METHOD("_favorite_activated"), &CreateDialog::_favorite_activated);
+ f = FileAccess::open(dir.plus_file("favorites." + base_type), FileAccess::READ);
+ if (f) {
+ while (!f->eof_reached()) {
+ String l = f->get_line().strip_edges();
+
+ if (l != String()) {
+ favorite_list.push_back(l);
+ }
+ }
+
+ memdelete(f);
+ }
+}
+
+void CreateDialog::_bind_methods() {
ClassDB::bind_method(D_METHOD("_save_and_update_favorite_list"), &CreateDialog::_save_and_update_favorite_list);
ClassDB::bind_method("get_drag_data_fw", &CreateDialog::get_drag_data_fw);
@@ -745,10 +649,11 @@ void CreateDialog::_bind_methods() {
}
CreateDialog::CreateDialog() {
+ base_type = "Object";
+ preferred_search_result_type = "";
- is_replace_mode = false;
-
- set_resizable(true);
+ type_blacklist.insert("PluginScript"); // PluginScript must be initialized before use, which is not possible here.
+ type_blacklist.insert("ScriptCreateDialog"); // This is an exposed editor Node that doesn't have an Editor prefix.
HSplitContainer *hsc = memnew(HSplitContainer);
add_child(hsc);
@@ -757,64 +662,65 @@ CreateDialog::CreateDialog() {
hsc->add_child(vsc);
VBoxContainer *fav_vb = memnew(VBoxContainer);
- vsc->add_child(fav_vb);
fav_vb->set_custom_minimum_size(Size2(150, 100) * EDSCALE);
- fav_vb->set_v_size_flags(SIZE_EXPAND_FILL);
+ fav_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ vsc->add_child(fav_vb);
favorites = memnew(Tree);
- fav_vb->add_margin_child(TTR("Favorites:"), favorites, true);
favorites->set_hide_root(true);
favorites->set_hide_folding(true);
favorites->set_allow_reselect(true);
- favorites->connect("cell_selected", this, "_favorite_selected");
- favorites->connect("item_activated", this, "_favorite_activated");
- favorites->set_drag_forwarding(this);
- favorites->add_constant_override("draw_guides", 1);
+ favorites->connect("cell_selected", callable_mp(this, &CreateDialog::_favorite_selected));
+ favorites->connect("item_activated", callable_mp(this, &CreateDialog::_favorite_activated));
+ favorites->add_theme_constant_override("draw_guides", 1);
+#ifndef _MSC_VER
+#warning cannot forward drag data to a non control, must be fixed
+#endif
+ //favorites->set_drag_forwarding(this);
+ fav_vb->add_margin_child(TTR("Favorites:"), favorites, true);
VBoxContainer *rec_vb = memnew(VBoxContainer);
vsc->add_child(rec_vb);
rec_vb->set_custom_minimum_size(Size2(150, 100) * EDSCALE);
- rec_vb->set_v_size_flags(SIZE_EXPAND_FILL);
+ rec_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- recent = memnew(Tree);
+ recent = memnew(ItemList);
rec_vb->add_margin_child(TTR("Recent:"), recent, true);
- recent->set_hide_root(true);
- recent->set_hide_folding(true);
recent->set_allow_reselect(true);
- recent->connect("cell_selected", this, "_history_selected");
- recent->connect("item_activated", this, "_history_activated");
- recent->add_constant_override("draw_guides", 1);
+ recent->connect("item_selected", callable_mp(this, &CreateDialog::_history_selected));
+ recent->connect("item_activated", callable_mp(this, &CreateDialog::_history_activated));
+ recent->add_theme_constant_override("draw_guides", 1);
VBoxContainer *vbc = memnew(VBoxContainer);
- hsc->add_child(vbc);
vbc->set_custom_minimum_size(Size2(300, 0) * EDSCALE);
- vbc->set_h_size_flags(SIZE_EXPAND_FILL);
- HBoxContainer *search_hb = memnew(HBoxContainer);
+ vbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hsc->add_child(vbc);
+
search_box = memnew(LineEdit);
- search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ search_box->connect("text_changed", callable_mp(this, &CreateDialog::_text_changed));
+ search_box->connect("gui_input", callable_mp(this, &CreateDialog::_sbox_input));
+
+ HBoxContainer *search_hb = memnew(HBoxContainer);
search_hb->add_child(search_box);
+
favorite = memnew(Button);
favorite->set_flat(true);
favorite->set_toggle_mode(true);
+ favorite->set_tooltip(TTR("(Un)favorite selected item."));
+ favorite->connect("pressed", callable_mp(this, &CreateDialog::_favorite_toggled));
search_hb->add_child(favorite);
- favorite->connect("pressed", this, "_favorite_toggled");
vbc->add_margin_child(TTR("Search:"), search_hb);
- search_box->connect("text_changed", this, "_text_changed");
- search_box->connect("gui_input", this, "_sbox_input");
+
search_options = memnew(Tree);
+ search_options->connect("item_activated", callable_mp(this, &CreateDialog::_confirmed));
+ search_options->connect("cell_selected", callable_mp(this, &CreateDialog::_item_selected));
vbc->add_margin_child(TTR("Matches:"), search_options, true);
- get_ok()->set_disabled(true);
- register_text_enter(search_box);
- set_hide_on_ok(false);
- search_options->connect("item_activated", this, "_confirmed");
- search_options->connect("cell_selected", this, "_item_selected");
- base_type = "Object";
- preferred_search_result_type = "";
help_bit = memnew(EditorHelpBit);
+ help_bit->connect("request_hide", callable_mp(this, &CreateDialog::_hide_requested));
vbc->add_margin_child(TTR("Description:"), help_bit);
- help_bit->connect("request_hide", this, "_closed");
- type_blacklist.insert("PluginScript"); // PluginScript must be initialized before use, which is not possible here
- type_blacklist.insert("ScriptCreateDialog"); // This is an exposed editor Node that doesn't have an Editor prefix.
+ register_text_enter(search_box);
+ set_hide_on_ok(false);
}
diff --git a/editor/create_dialog.h b/editor/create_dialog.h
index 94ff1b5bb2..75a317275a 100644
--- a/editor/create_dialog.h
+++ b/editor/create_dialog.h
@@ -35,60 +35,65 @@
#include "scene/gui/button.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/item_list.h"
-#include "scene/gui/label.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/tree.h"
class CreateDialog : public ConfirmationDialog {
-
GDCLASS(CreateDialog, ConfirmationDialog);
- Vector<String> favorite_list;
- Tree *favorites;
- Tree *recent;
-
- Button *favorite;
LineEdit *search_box;
Tree *search_options;
- HashMap<String, TreeItem *> search_options_types;
- HashMap<String, RES> search_loaded_scripts;
- bool is_replace_mode;
+
String base_type;
+ String icon_fallback;
String preferred_search_result_type;
+
+ Button *favorite;
+ Vector<String> favorite_list;
+ Tree *favorites;
+ ItemList *recent;
EditorHelpBit *help_bit;
+
+ HashMap<String, TreeItem *> search_options_types;
+ HashMap<String, String> custom_type_parents;
+ HashMap<String, int> custom_type_indices;
List<StringName> type_list;
Set<StringName> type_blacklist;
- void _item_selected();
-
void _update_search();
- void _update_favorite_list();
- void _save_favorite_list();
- void _favorite_toggled();
+ bool _should_hide_type(const String &p_type) const;
+ void _add_type(const String &p_current, bool p_cpp_type);
+ void _configure_search_option_item(TreeItem *r_item, const String &p_type, const bool p_cpp_type);
+ String _top_result(const Vector<String> p_candidates, const String &p_search_text) const;
+ float _score_type(const String &p_type, const String &p_search) const;
+ bool _is_type_preferred(const String &p_type) const;
- void _history_selected();
- void _favorite_selected();
-
- void _history_activated();
- void _favorite_activated();
+ void _fill_type_list();
+ void _cleanup();
void _sbox_input(const Ref<InputEvent> &p_ie);
+ void _text_changed(const String &p_newtext);
+ void select_type(const String &p_type);
+ void _item_selected();
+ void _hide_requested();
void _confirmed();
- void _text_changed(const String &p_newtext);
+ virtual void cancel_pressed() override;
- Ref<Texture> _get_editor_icon(const String &p_type) const;
+ void _favorite_toggled();
- void add_type(const String &p_type, HashMap<String, TreeItem *> &p_types, TreeItem *p_root, TreeItem **to_select);
+ void _history_selected(int p_idx);
+ void _favorite_selected();
- void select_type(const String &p_type);
+ void _history_activated(int p_idx);
+ void _favorite_activated();
Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
- bool _is_class_disabled_by_feature_profile(const StringName &p_class);
- bool _is_type_prefered(const String &type);
+ bool _is_class_disabled_by_feature_profile(const StringName &p_class) const;
+ void _load_favorites_and_history();
protected:
void _notification(int p_what);
@@ -100,11 +105,11 @@ public:
Object *instance_selected();
String get_selected_type();
- void set_base_type(const String &p_base);
- String get_base_type() const;
+ void set_base_type(const String &p_base) { base_type = p_base; }
+ String get_base_type() const { return base_type; }
- void set_preferred_search_result_type(const String &p_preferred_type);
- String get_preferred_search_result_type();
+ void set_preferred_search_result_type(const String &p_preferred_type) { preferred_search_result_type = p_preferred_type; }
+ String get_preferred_search_result_type() { return preferred_search_result_type; }
void popup_create(bool p_dont_clear, bool p_replace_mode = false, const String &p_select_type = "Node");
diff --git a/editor/debugger/SCsub b/editor/debugger/SCsub
new file mode 100644
index 0000000000..359d04e5df
--- /dev/null
+++ b/editor/debugger/SCsub
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+Import("env")
+
+env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/debugger/editor_debugger_inspector.cpp b/editor/debugger/editor_debugger_inspector.cpp
new file mode 100644
index 0000000000..dcd7220ed0
--- /dev/null
+++ b/editor/debugger/editor_debugger_inspector.cpp
@@ -0,0 +1,269 @@
+/*************************************************************************/
+/* editor_debugger_inspector.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_debugger_inspector.h"
+
+#include "core/debugger/debugger_marshalls.h"
+#include "core/io/marshalls.h"
+#include "editor/editor_node.h"
+#include "scene/debugger/scene_debugger.h"
+
+bool EditorDebuggerRemoteObject::_set(const StringName &p_name, const Variant &p_value) {
+ if (!editable || !prop_values.has(p_name) || String(p_name).begins_with("Constants/")) {
+ return false;
+ }
+
+ prop_values[p_name] = p_value;
+ emit_signal("value_edited", remote_object_id, p_name, p_value);
+ return true;
+}
+
+bool EditorDebuggerRemoteObject::_get(const StringName &p_name, Variant &r_ret) const {
+ if (!prop_values.has(p_name)) {
+ return false;
+ }
+
+ r_ret = prop_values[p_name];
+ return true;
+}
+
+void EditorDebuggerRemoteObject::_get_property_list(List<PropertyInfo> *p_list) const {
+ p_list->clear(); //sorry, no want category
+ for (const List<PropertyInfo>::Element *E = prop_list.front(); E; E = E->next()) {
+ p_list->push_back(E->get());
+ }
+}
+
+String EditorDebuggerRemoteObject::get_title() {
+ if (remote_object_id.is_valid()) {
+ return TTR("Remote ") + String(type_name) + ": " + itos(remote_object_id);
+ } else {
+ return "<null>";
+ }
+}
+
+Variant EditorDebuggerRemoteObject::get_variant(const StringName &p_name) {
+ Variant var;
+ _get(p_name, var);
+ return var;
+}
+
+void EditorDebuggerRemoteObject::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("get_title"), &EditorDebuggerRemoteObject::get_title);
+ ClassDB::bind_method(D_METHOD("get_variant"), &EditorDebuggerRemoteObject::get_variant);
+ ClassDB::bind_method(D_METHOD("clear"), &EditorDebuggerRemoteObject::clear);
+ ClassDB::bind_method(D_METHOD("get_remote_object_id"), &EditorDebuggerRemoteObject::get_remote_object_id);
+
+ ADD_SIGNAL(MethodInfo("value_edited", PropertyInfo(Variant::INT, "object_id"), PropertyInfo(Variant::STRING, "property"), PropertyInfo("value")));
+}
+
+EditorDebuggerInspector::EditorDebuggerInspector() {
+ variables = memnew(EditorDebuggerRemoteObject);
+ variables->editable = false;
+}
+
+EditorDebuggerInspector::~EditorDebuggerInspector() {
+ clear_cache();
+ memdelete(variables);
+}
+
+void EditorDebuggerInspector::_bind_methods() {
+ ADD_SIGNAL(MethodInfo("object_selected", PropertyInfo(Variant::INT, "id")));
+ ADD_SIGNAL(MethodInfo("object_edited", PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::STRING, "property"), PropertyInfo("value")));
+ ADD_SIGNAL(MethodInfo("object_property_updated", PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::STRING, "property")));
+}
+
+void EditorDebuggerInspector::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_POSTINITIALIZE:
+ connect("object_id_selected", callable_mp(this, &EditorDebuggerInspector::_object_selected));
+ break;
+ case NOTIFICATION_ENTER_TREE:
+ edit(variables);
+ break;
+ default:
+ break;
+ }
+}
+
+void EditorDebuggerInspector::_object_edited(ObjectID p_id, const String &p_prop, const Variant &p_value) {
+ emit_signal("object_edited", p_id, p_prop, p_value);
+}
+
+void EditorDebuggerInspector::_object_selected(ObjectID p_object) {
+ emit_signal("object_selected", p_object);
+}
+
+ObjectID EditorDebuggerInspector::add_object(const Array &p_arr) {
+ EditorDebuggerRemoteObject *debugObj = nullptr;
+
+ SceneDebuggerObject obj;
+ obj.deserialize(p_arr);
+ ERR_FAIL_COND_V(obj.id.is_null(), ObjectID());
+
+ if (remote_objects.has(obj.id)) {
+ debugObj = remote_objects[obj.id];
+ } else {
+ debugObj = memnew(EditorDebuggerRemoteObject);
+ debugObj->remote_object_id = obj.id;
+ debugObj->type_name = obj.class_name;
+ remote_objects[obj.id] = debugObj;
+ debugObj->connect("value_edited", callable_mp(this, &EditorDebuggerInspector::_object_edited));
+ }
+
+ int old_prop_size = debugObj->prop_list.size();
+
+ debugObj->prop_list.clear();
+ int new_props_added = 0;
+ Set<String> changed;
+ for (int i = 0; i < obj.properties.size(); i++) {
+ PropertyInfo &pinfo = obj.properties[i].first;
+ Variant &var = obj.properties[i].second;
+
+ if (pinfo.type == Variant::OBJECT) {
+ if (var.get_type() == Variant::STRING) {
+ String path = var;
+ if (path.find("::") != -1) {
+ // built-in resource
+ String base_path = path.get_slice("::", 0);
+ RES dependency = ResourceLoader::load(base_path);
+ if (dependency.is_valid()) {
+ remote_dependencies.insert(dependency);
+ }
+ }
+ var = ResourceLoader::load(path);
+
+ if (pinfo.hint_string == "Script") {
+ if (debugObj->get_script() != var) {
+ debugObj->set_script(REF());
+ Ref<Script> script(var);
+ if (!script.is_null()) {
+ ScriptInstance *script_instance = script->placeholder_instance_create(debugObj);
+ debugObj->set_script_and_instance(var, script_instance);
+ }
+ }
+ }
+ }
+ }
+
+ //always add the property, since props may have been added or removed
+ debugObj->prop_list.push_back(pinfo);
+
+ if (!debugObj->prop_values.has(pinfo.name)) {
+ new_props_added++;
+ debugObj->prop_values[pinfo.name] = var;
+ } else {
+ if (bool(Variant::evaluate(Variant::OP_NOT_EQUAL, debugObj->prop_values[pinfo.name], var))) {
+ debugObj->prop_values[pinfo.name] = var;
+ changed.insert(pinfo.name);
+ }
+ }
+ }
+
+ if (old_prop_size == debugObj->prop_list.size() && new_props_added == 0) {
+ //only some may have changed, if so, then update those, if exist
+ for (Set<String>::Element *E = changed.front(); E; E = E->next()) {
+ emit_signal("object_property_updated", debugObj->remote_object_id, E->get());
+ }
+ } else {
+ //full update, because props were added or removed
+ debugObj->update();
+ }
+ return obj.id;
+}
+
+void EditorDebuggerInspector::clear_cache() {
+ for (Map<ObjectID, EditorDebuggerRemoteObject *>::Element *E = remote_objects.front(); E; E = E->next()) {
+ EditorNode *editor = EditorNode::get_singleton();
+ if (editor->get_editor_history()->get_current() == E->value()->get_instance_id()) {
+ editor->push_item(nullptr);
+ }
+ memdelete(E->value());
+ }
+ remote_objects.clear();
+ remote_dependencies.clear();
+}
+
+Object *EditorDebuggerInspector::get_object(ObjectID p_id) {
+ if (remote_objects.has(p_id)) {
+ return remote_objects[p_id];
+ }
+ return nullptr;
+}
+
+void EditorDebuggerInspector::add_stack_variable(const Array &p_array) {
+ DebuggerMarshalls::ScriptStackVariable var;
+ var.deserialize(p_array);
+ String n = var.name;
+ Variant v = var.value;
+
+ PropertyHint h = PROPERTY_HINT_NONE;
+ String hs = String();
+
+ if (v.get_type() == Variant::OBJECT) {
+ v = Object::cast_to<EncodedObjectAsID>(v)->get_object_id();
+ h = PROPERTY_HINT_OBJECT_ID;
+ hs = "Object";
+ }
+ String type;
+ switch (var.type) {
+ case 0:
+ type = "Locals/";
+ break;
+ case 1:
+ type = "Members/";
+ break;
+ case 2:
+ type = "Globals/";
+ break;
+ default:
+ type = "Unknown/";
+ }
+
+ PropertyInfo pinfo;
+ pinfo.name = type + n;
+ pinfo.type = v.get_type();
+ pinfo.hint = h;
+ pinfo.hint_string = hs;
+
+ variables->prop_list.push_back(pinfo);
+ variables->prop_values[type + n] = v;
+ variables->update();
+ edit(variables);
+}
+
+void EditorDebuggerInspector::clear_stack_variables() {
+ variables->clear();
+ variables->update();
+}
+
+String EditorDebuggerInspector::get_stack_variable(const String &p_var) {
+ return variables->get_variant(p_var);
+}
diff --git a/editor/debugger/editor_debugger_inspector.h b/editor/debugger/editor_debugger_inspector.h
new file mode 100644
index 0000000000..7d13a4c362
--- /dev/null
+++ b/editor/debugger/editor_debugger_inspector.h
@@ -0,0 +1,97 @@
+/*************************************************************************/
+/* editor_debugger_inspector.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_DEBUGGER_INSPECTOR_H
+#define EDITOR_DEBUGGER_INSPECTOR_H
+#include "editor/editor_inspector.h"
+
+class EditorDebuggerRemoteObject : public Object {
+ GDCLASS(EditorDebuggerRemoteObject, Object);
+
+protected:
+ bool _set(const StringName &p_name, const Variant &p_value);
+ bool _get(const StringName &p_name, Variant &r_ret) const;
+ void _get_property_list(List<PropertyInfo> *p_list) const;
+ static void _bind_methods();
+
+public:
+ bool editable = false;
+ ObjectID remote_object_id;
+ String type_name;
+ List<PropertyInfo> prop_list;
+ Map<StringName, Variant> prop_values;
+
+ ObjectID get_remote_object_id() { return remote_object_id; };
+ String get_title();
+
+ Variant get_variant(const StringName &p_name);
+
+ void clear() {
+ prop_list.clear();
+ prop_values.clear();
+ }
+
+ void update() { _change_notify(); }
+
+ EditorDebuggerRemoteObject() {}
+};
+
+class EditorDebuggerInspector : public EditorInspector {
+ GDCLASS(EditorDebuggerInspector, EditorInspector);
+
+private:
+ ObjectID inspected_object_id;
+ Map<ObjectID, EditorDebuggerRemoteObject *> remote_objects;
+ Set<RES> remote_dependencies;
+ EditorDebuggerRemoteObject *variables;
+
+ void _object_selected(ObjectID p_object);
+ void _object_edited(ObjectID p_id, const String &p_prop, const Variant &p_value);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ EditorDebuggerInspector();
+ ~EditorDebuggerInspector();
+
+ // Remote Object cache
+ ObjectID add_object(const Array &p_arr);
+ Object *get_object(ObjectID p_id);
+ void clear_cache();
+
+ // Stack Dump variables
+ String get_stack_variable(const String &p_var);
+ void add_stack_variable(const Array &p_arr);
+ void clear_stack_variables();
+};
+
+#endif // EDITOR_DEBUGGER_INSPECTOR_H
diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp
new file mode 100644
index 0000000000..b461ac4f35
--- /dev/null
+++ b/editor/debugger/editor_debugger_node.cpp
@@ -0,0 +1,647 @@
+/*************************************************************************/
+/* editor_debugger_node.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_debugger_node.h"
+
+#include "editor/debugger/editor_debugger_tree.h"
+#include "editor/debugger/script_editor_debugger.h"
+#include "editor/editor_log.h"
+#include "editor/editor_node.h"
+#include "editor/plugins/editor_debugger_plugin.h"
+#include "editor/plugins/script_editor_plugin.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/tab_container.h"
+
+template <typename Func>
+void _for_all(TabContainer *p_node, const Func &p_func) {
+ for (int i = 0; i < p_node->get_tab_count(); i++) {
+ ScriptEditorDebugger *dbg = Object::cast_to<ScriptEditorDebugger>(p_node->get_tab_control(i));
+ ERR_FAIL_COND(!dbg);
+ p_func(dbg);
+ }
+}
+
+EditorDebuggerNode *EditorDebuggerNode::singleton = nullptr;
+
+EditorDebuggerNode::EditorDebuggerNode() {
+ if (!singleton) {
+ singleton = this;
+ }
+
+ add_theme_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT));
+ add_theme_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT));
+
+ tabs = memnew(TabContainer);
+ tabs->set_tab_align(TabContainer::ALIGN_LEFT);
+ tabs->set_tabs_visible(false);
+ tabs->connect("tab_changed", callable_mp(this, &EditorDebuggerNode::_debugger_changed));
+ add_child(tabs);
+
+ Ref<StyleBoxEmpty> empty;
+ empty.instance();
+ tabs->add_theme_style_override("panel", empty);
+
+ auto_switch_remote_scene_tree = EDITOR_DEF("debugger/auto_switch_to_remote_scene_tree", false);
+ _add_debugger();
+
+ // Remote scene tree
+ remote_scene_tree = memnew(EditorDebuggerTree);
+ remote_scene_tree->connect("object_selected", callable_mp(this, &EditorDebuggerNode::_remote_object_requested));
+ remote_scene_tree->connect("save_node", callable_mp(this, &EditorDebuggerNode::_save_node_requested));
+ EditorNode::get_singleton()->get_scene_tree_dock()->add_remote_tree_editor(remote_scene_tree);
+ EditorNode::get_singleton()->get_scene_tree_dock()->connect("remote_tree_selected", callable_mp(this, &EditorDebuggerNode::request_remote_tree));
+
+ remote_scene_tree_timeout = EDITOR_DEF("debugger/remote_scene_tree_refresh_interval", 1.0);
+ inspect_edited_object_timeout = EDITOR_DEF("debugger/remote_inspect_refresh_interval", 0.2);
+
+ EditorNode *editor = EditorNode::get_singleton();
+ editor->get_undo_redo()->set_method_notify_callback(_method_changeds, this);
+ editor->get_undo_redo()->set_property_notify_callback(_property_changeds, this);
+ editor->get_pause_button()->connect("pressed", callable_mp(this, &EditorDebuggerNode::_paused));
+}
+
+ScriptEditorDebugger *EditorDebuggerNode::_add_debugger() {
+ ScriptEditorDebugger *node = memnew(ScriptEditorDebugger(EditorNode::get_singleton()));
+
+ int id = tabs->get_tab_count();
+ node->connect("stop_requested", callable_mp(this, &EditorDebuggerNode::_debugger_wants_stop), varray(id));
+ node->connect("stopped", callable_mp(this, &EditorDebuggerNode::_debugger_stopped), varray(id));
+ node->connect("stack_frame_selected", callable_mp(this, &EditorDebuggerNode::_stack_frame_selected), varray(id));
+ node->connect("error_selected", callable_mp(this, &EditorDebuggerNode::_error_selected), varray(id));
+ node->connect("clear_execution", callable_mp(this, &EditorDebuggerNode::_clear_execution));
+ node->connect("breaked", callable_mp(this, &EditorDebuggerNode::_breaked), varray(id));
+ node->connect("remote_tree_updated", callable_mp(this, &EditorDebuggerNode::_remote_tree_updated), varray(id));
+ node->connect("remote_object_updated", callable_mp(this, &EditorDebuggerNode::_remote_object_updated), varray(id));
+ node->connect("remote_object_property_updated", callable_mp(this, &EditorDebuggerNode::_remote_object_property_updated), varray(id));
+ node->connect("remote_object_requested", callable_mp(this, &EditorDebuggerNode::_remote_object_requested), varray(id));
+
+ if (tabs->get_tab_count() > 0) {
+ get_debugger(0)->clear_style();
+ }
+
+ tabs->add_child(node);
+
+ node->set_name("Session " + itos(tabs->get_tab_count()));
+ if (tabs->get_tab_count() > 1) {
+ node->clear_style();
+ tabs->set_tabs_visible(true);
+ tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("DebuggerPanel", "EditorStyles"));
+ }
+
+ if (!debugger_plugins.empty()) {
+ for (Set<Ref<Script>>::Element *i = debugger_plugins.front(); i; i = i->next()) {
+ node->add_debugger_plugin(i->get());
+ }
+ }
+
+ return node;
+}
+
+void EditorDebuggerNode::_stack_frame_selected(int p_debugger) {
+ const ScriptEditorDebugger *dbg = get_debugger(p_debugger);
+ ERR_FAIL_COND(!dbg);
+ if (dbg != get_current_debugger()) {
+ return;
+ }
+ _text_editor_stack_goto(dbg);
+}
+
+void EditorDebuggerNode::_error_selected(const String &p_file, int p_line, int p_debugger) {
+ Ref<Script> s = ResourceLoader::load(p_file);
+ emit_signal("goto_script_line", s, p_line - 1);
+}
+
+void EditorDebuggerNode::_text_editor_stack_goto(const ScriptEditorDebugger *p_debugger) {
+ const String file = p_debugger->get_stack_script_file();
+ if (file.empty()) {
+ return;
+ }
+ stack_script = ResourceLoader::load(file);
+ const int line = p_debugger->get_stack_script_line() - 1;
+ emit_signal("goto_script_line", stack_script, line);
+ emit_signal("set_execution", stack_script, line);
+ stack_script.unref(); // Why?!?
+}
+
+void EditorDebuggerNode::_bind_methods() {
+ // LiveDebug.
+ ClassDB::bind_method("live_debug_create_node", &EditorDebuggerNode::live_debug_create_node);
+ ClassDB::bind_method("live_debug_instance_node", &EditorDebuggerNode::live_debug_instance_node);
+ ClassDB::bind_method("live_debug_remove_node", &EditorDebuggerNode::live_debug_remove_node);
+ ClassDB::bind_method("live_debug_remove_and_keep_node", &EditorDebuggerNode::live_debug_remove_and_keep_node);
+ ClassDB::bind_method("live_debug_restore_node", &EditorDebuggerNode::live_debug_restore_node);
+ ClassDB::bind_method("live_debug_duplicate_node", &EditorDebuggerNode::live_debug_duplicate_node);
+ ClassDB::bind_method("live_debug_reparent_node", &EditorDebuggerNode::live_debug_reparent_node);
+
+ ADD_SIGNAL(MethodInfo("goto_script_line"));
+ ADD_SIGNAL(MethodInfo("set_execution", PropertyInfo("script"), PropertyInfo(Variant::INT, "line")));
+ ADD_SIGNAL(MethodInfo("clear_execution", PropertyInfo("script")));
+ ADD_SIGNAL(MethodInfo("breaked", PropertyInfo(Variant::BOOL, "reallydid"), PropertyInfo(Variant::BOOL, "can_debug")));
+}
+
+EditorDebuggerRemoteObject *EditorDebuggerNode::get_inspected_remote_object() {
+ return Object::cast_to<EditorDebuggerRemoteObject>(ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_history()->get_current()));
+}
+
+ScriptEditorDebugger *EditorDebuggerNode::get_debugger(int p_id) const {
+ return Object::cast_to<ScriptEditorDebugger>(tabs->get_tab_control(p_id));
+}
+
+ScriptEditorDebugger *EditorDebuggerNode::get_current_debugger() const {
+ return Object::cast_to<ScriptEditorDebugger>(tabs->get_tab_control(tabs->get_current_tab()));
+}
+
+ScriptEditorDebugger *EditorDebuggerNode::get_default_debugger() const {
+ return Object::cast_to<ScriptEditorDebugger>(tabs->get_tab_control(0));
+}
+
+Error EditorDebuggerNode::start(const String &p_protocol) {
+ stop();
+ if (EDITOR_GET("run/output/always_open_output_on_play")) {
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(EditorNode::get_log());
+ } else {
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
+ }
+
+ server = Ref<EditorDebuggerServer>(EditorDebuggerServer::create(p_protocol));
+ const Error err = server->start();
+ if (err != OK) {
+ return err;
+ }
+ set_process(true);
+ EditorNode::get_log()->add_message("--- Debugging process started ---", EditorLog::MSG_TYPE_EDITOR);
+ return OK;
+}
+
+void EditorDebuggerNode::stop() {
+ if (server.is_valid()) {
+ server->stop();
+ EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR);
+ server.unref();
+ }
+ // Also close all debugging sessions.
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ if (dbg->is_session_active()) {
+ dbg->stop();
+ }
+ });
+ _break_state_changed();
+ if (hide_on_stop) {
+ if (is_visible_in_tree()) {
+ EditorNode::get_singleton()->hide_bottom_panel();
+ }
+ }
+ breakpoints.clear();
+ set_process(false);
+}
+
+void EditorDebuggerNode::_notification(int p_what) {
+ switch (p_what) {
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ if (tabs->get_tab_count() > 1) {
+ add_theme_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT));
+ add_theme_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT));
+
+ tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("DebuggerPanel", "EditorStyles"));
+ }
+ } break;
+ default:
+ break;
+ }
+
+ if (p_what != NOTIFICATION_PROCESS || !server.is_valid()) {
+ return;
+ }
+
+ if (!server.is_valid() || !server->is_active()) {
+ stop();
+ return;
+ }
+ server->poll();
+
+ // Errors and warnings
+ int error_count = 0;
+ int warning_count = 0;
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ error_count += dbg->get_error_count();
+ warning_count += dbg->get_warning_count();
+ });
+
+ if (error_count != last_error_count || warning_count != last_warning_count) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->update_tabs();
+ });
+
+ if (error_count == 0 && warning_count == 0) {
+ debugger_button->set_text(TTR("Debugger"));
+ debugger_button->set_icon(Ref<Texture2D>());
+ } else {
+ debugger_button->set_text(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")");
+ if (error_count >= 1 && warning_count >= 1) {
+ debugger_button->set_icon(get_theme_icon("ErrorWarning", "EditorIcons"));
+ } else if (error_count >= 1) {
+ debugger_button->set_icon(get_theme_icon("Error", "EditorIcons"));
+ } else {
+ debugger_button->set_icon(get_theme_icon("Warning", "EditorIcons"));
+ }
+ }
+ last_error_count = error_count;
+ last_warning_count = warning_count;
+ }
+
+ // Remote scene tree update
+ remote_scene_tree_timeout -= get_process_delta_time();
+ if (remote_scene_tree_timeout < 0) {
+ remote_scene_tree_timeout = EditorSettings::get_singleton()->get("debugger/remote_scene_tree_refresh_interval");
+ if (remote_scene_tree->is_visible_in_tree()) {
+ get_current_debugger()->request_remote_tree();
+ }
+ }
+
+ // Remote inspector update
+ inspect_edited_object_timeout -= get_process_delta_time();
+ if (inspect_edited_object_timeout < 0) {
+ inspect_edited_object_timeout = EditorSettings::get_singleton()->get("debugger/remote_inspect_refresh_interval");
+ if (EditorDebuggerRemoteObject *obj = get_inspected_remote_object()) {
+ get_current_debugger()->request_remote_object(obj->remote_object_id);
+ }
+ }
+
+ // Take connections.
+ if (server->is_connection_available()) {
+ ScriptEditorDebugger *debugger = nullptr;
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ if (debugger || dbg->is_session_active()) {
+ return;
+ }
+ debugger = dbg;
+ });
+ if (debugger == nullptr) {
+ if (tabs->get_tab_count() <= 4) { // Max 4 debugging sessions active.
+ debugger = _add_debugger();
+ } else {
+ // We already have too many sessions, disconnecting new clients to prevent them from hanging.
+ server->take_connection()->close();
+ return; // Can't add, stop here.
+ }
+ }
+
+ EditorNode::get_singleton()->get_pause_button()->set_disabled(false);
+ // Switch to remote tree view if so desired.
+ auto_switch_remote_scene_tree = (bool)EditorSettings::get_singleton()->get("debugger/auto_switch_to_remote_scene_tree");
+ if (auto_switch_remote_scene_tree) {
+ EditorNode::get_singleton()->get_scene_tree_dock()->show_remote_tree();
+ }
+ // Good to go.
+ EditorNode::get_singleton()->get_scene_tree_dock()->show_tab_buttons();
+ debugger->set_editor_remote_tree(remote_scene_tree);
+ debugger->start(server->take_connection());
+ // Send breakpoints.
+ for (Map<Breakpoint, bool>::Element *E = breakpoints.front(); E; E = E->next()) {
+ const Breakpoint &bp = E->key();
+ debugger->set_breakpoint(bp.source, bp.line, E->get());
+ } // Will arrive too late, how does the regular run work?
+
+ debugger->update_live_edit_root();
+ }
+}
+
+void EditorDebuggerNode::_debugger_stopped(int p_id) {
+ ScriptEditorDebugger *dbg = get_debugger(p_id);
+ ERR_FAIL_COND(!dbg);
+
+ bool found = false;
+ _for_all(tabs, [&](ScriptEditorDebugger *p_debugger) {
+ if (p_debugger->is_session_active()) {
+ found = true;
+ }
+ });
+ if (!found) {
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
+ EditorNode::get_singleton()->get_pause_button()->set_disabled(true);
+ EditorNode::get_singleton()->get_scene_tree_dock()->hide_remote_tree();
+ EditorNode::get_singleton()->get_scene_tree_dock()->hide_tab_buttons();
+ EditorNode::get_singleton()->notify_all_debug_sessions_exited();
+ }
+}
+
+void EditorDebuggerNode::_debugger_wants_stop(int p_id) {
+ // Ask editor to kill PID.
+ int pid = get_debugger(p_id)->get_remote_pid();
+ if (pid) {
+ EditorNode::get_singleton()->call_deferred("stop_child_process", pid);
+ }
+}
+
+void EditorDebuggerNode::_debugger_changed(int p_tab) {
+ if (get_inspected_remote_object()) {
+ // Clear inspected object, you can only inspect objects in selected debugger.
+ // Hopefully, in the future, we will have one inspector per debugger.
+ EditorNode::get_singleton()->push_item(nullptr);
+ }
+ if (remote_scene_tree->is_visible_in_tree()) {
+ get_current_debugger()->request_remote_tree();
+ }
+ if (get_current_debugger()->is_breaked()) {
+ _text_editor_stack_goto(get_current_debugger());
+ }
+}
+
+void EditorDebuggerNode::set_script_debug_button(MenuButton *p_button) {
+ script_menu = p_button;
+ script_menu->set_text(TTR("Debug"));
+ script_menu->set_switch_on_hover(true);
+ PopupMenu *p = script_menu->get_popup();
+ p->add_shortcut(ED_GET_SHORTCUT("debugger/step_into"), DEBUG_STEP);
+ p->add_shortcut(ED_GET_SHORTCUT("debugger/step_over"), DEBUG_NEXT);
+ p->add_separator();
+ p->add_shortcut(ED_GET_SHORTCUT("debugger/break"), DEBUG_BREAK);
+ p->add_shortcut(ED_GET_SHORTCUT("debugger/continue"), DEBUG_CONTINUE);
+ p->add_separator();
+ p->add_check_shortcut(ED_GET_SHORTCUT("debugger/keep_debugger_open"), DEBUG_SHOW_KEEP_OPEN);
+ p->add_check_shortcut(ED_GET_SHORTCUT("debugger/debug_with_external_editor"), DEBUG_WITH_EXTERNAL_EDITOR);
+ p->connect("id_pressed", callable_mp(this, &EditorDebuggerNode::_menu_option));
+
+ _break_state_changed();
+ script_menu->show();
+}
+
+void EditorDebuggerNode::_break_state_changed() {
+ const bool breaked = get_current_debugger()->is_breaked();
+ const bool can_debug = get_current_debugger()->is_debuggable();
+ if (breaked) { // Show debugger.
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
+ }
+
+ // Update script menu.
+ if (!script_menu) {
+ return;
+ }
+ PopupMenu *p = script_menu->get_popup();
+ p->set_item_disabled(p->get_item_index(DEBUG_NEXT), !(breaked && can_debug));
+ p->set_item_disabled(p->get_item_index(DEBUG_STEP), !(breaked && can_debug));
+ p->set_item_disabled(p->get_item_index(DEBUG_BREAK), breaked);
+ p->set_item_disabled(p->get_item_index(DEBUG_CONTINUE), !breaked);
+}
+
+void EditorDebuggerNode::_menu_option(int p_id) {
+ switch (p_id) {
+ case DEBUG_NEXT: {
+ debug_next();
+ } break;
+ case DEBUG_STEP: {
+ debug_step();
+ } break;
+ case DEBUG_BREAK: {
+ debug_break();
+ } break;
+ case DEBUG_CONTINUE: {
+ debug_continue();
+ } break;
+
+ case DEBUG_SHOW_KEEP_OPEN: {
+ bool visible = script_menu->get_popup()->is_item_checked(script_menu->get_popup()->get_item_index(DEBUG_SHOW_KEEP_OPEN));
+ hide_on_stop = visible;
+ script_menu->get_popup()->set_item_checked(script_menu->get_popup()->get_item_index(DEBUG_SHOW_KEEP_OPEN), !visible);
+ } break;
+ case DEBUG_WITH_EXTERNAL_EDITOR: {
+ bool checked = !script_menu->get_popup()->is_item_checked(script_menu->get_popup()->get_item_index(DEBUG_WITH_EXTERNAL_EDITOR));
+ debug_with_external_editor = checked;
+ script_menu->get_popup()->set_item_checked(script_menu->get_popup()->get_item_index(DEBUG_WITH_EXTERNAL_EDITOR), checked);
+ } break;
+ }
+}
+
+void EditorDebuggerNode::_paused() {
+ const bool paused = EditorNode::get_singleton()->get_pause_button()->is_pressed();
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ if (paused && !dbg->is_breaked()) {
+ dbg->debug_break();
+ } else if (!paused && dbg->is_breaked()) {
+ dbg->debug_continue();
+ }
+ });
+}
+
+void EditorDebuggerNode::_breaked(bool p_breaked, bool p_can_debug, int p_debugger) {
+ if (get_current_debugger() != get_debugger(p_debugger)) {
+ if (!p_breaked) {
+ return;
+ }
+ tabs->set_current_tab(p_debugger);
+ }
+ _break_state_changed();
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(p_breaked);
+ emit_signal("breaked", p_breaked, p_can_debug);
+}
+
+bool EditorDebuggerNode::is_skip_breakpoints() const {
+ return get_default_debugger()->is_skip_breakpoints();
+}
+
+void EditorDebuggerNode::set_breakpoint(const String &p_path, int p_line, bool p_enabled) {
+ breakpoints[Breakpoint(p_path, p_line)] = p_enabled;
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->set_breakpoint(p_path, p_line, p_enabled);
+ });
+}
+
+void EditorDebuggerNode::reload_scripts() {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->reload_scripts();
+ });
+}
+
+void EditorDebuggerNode::debug_next() {
+ get_default_debugger()->debug_next();
+}
+
+void EditorDebuggerNode::debug_step() {
+ get_default_debugger()->debug_step();
+}
+
+void EditorDebuggerNode::debug_break() {
+ get_default_debugger()->debug_break();
+}
+
+void EditorDebuggerNode::debug_continue() {
+ get_default_debugger()->debug_continue();
+}
+
+String EditorDebuggerNode::get_var_value(const String &p_var) const {
+ return get_default_debugger()->get_var_value(p_var);
+}
+
+// LiveEdit/Inspector
+void EditorDebuggerNode::request_remote_tree() {
+ get_current_debugger()->request_remote_tree();
+}
+
+void EditorDebuggerNode::_remote_tree_updated(int p_debugger) {
+ if (p_debugger != tabs->get_current_tab()) {
+ return;
+ }
+ remote_scene_tree->clear();
+ remote_scene_tree->update_scene_tree(get_current_debugger()->get_remote_tree(), p_debugger);
+}
+
+void EditorDebuggerNode::_remote_object_updated(ObjectID p_id, int p_debugger) {
+ if (p_debugger != tabs->get_current_tab()) {
+ return;
+ }
+ if (EditorDebuggerRemoteObject *obj = get_inspected_remote_object()) {
+ if (obj->remote_object_id == p_id) {
+ return; // Already being edited
+ }
+ }
+
+ EditorNode::get_singleton()->push_item(get_current_debugger()->get_remote_object(p_id));
+}
+
+void EditorDebuggerNode::_remote_object_property_updated(ObjectID p_id, const String &p_property, int p_debugger) {
+ if (p_debugger != tabs->get_current_tab()) {
+ return;
+ }
+ if (EditorDebuggerRemoteObject *obj = get_inspected_remote_object()) {
+ if (obj->remote_object_id != p_id) {
+ return;
+ }
+ EditorNode::get_singleton()->get_inspector()->update_property(p_property);
+ }
+}
+
+void EditorDebuggerNode::_remote_object_requested(ObjectID p_id, int p_debugger) {
+ if (p_debugger != tabs->get_current_tab()) {
+ return;
+ }
+ inspect_edited_object_timeout = 0.7; // Temporarily disable timeout to avoid multiple requests.
+ get_current_debugger()->request_remote_object(p_id);
+}
+
+void EditorDebuggerNode::_save_node_requested(ObjectID p_id, const String &p_file, int p_debugger) {
+ if (p_debugger != tabs->get_current_tab()) {
+ return;
+ }
+ get_current_debugger()->save_node(p_id, p_file);
+}
+
+// Remote inspector/edit.
+void EditorDebuggerNode::_method_changeds(void *p_ud, Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE) {
+ if (!singleton) {
+ return;
+ }
+ _for_all(singleton->tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->_method_changed(p_base, p_name, VARIANT_ARG_PASS);
+ });
+}
+
+void EditorDebuggerNode::_property_changeds(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value) {
+ if (!singleton) {
+ return;
+ }
+ _for_all(singleton->tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->_property_changed(p_base, p_property, p_value);
+ });
+}
+
+// LiveDebug
+void EditorDebuggerNode::set_live_debugging(bool p_enabled) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->set_live_debugging(p_enabled);
+ });
+}
+
+void EditorDebuggerNode::update_live_edit_root() {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->update_live_edit_root();
+ });
+}
+
+void EditorDebuggerNode::live_debug_create_node(const NodePath &p_parent, const String &p_type, const String &p_name) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->live_debug_create_node(p_parent, p_type, p_name);
+ });
+}
+
+void EditorDebuggerNode::live_debug_instance_node(const NodePath &p_parent, const String &p_path, const String &p_name) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->live_debug_instance_node(p_parent, p_path, p_name);
+ });
+}
+
+void EditorDebuggerNode::live_debug_remove_node(const NodePath &p_at) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->live_debug_remove_node(p_at);
+ });
+}
+
+void EditorDebuggerNode::live_debug_remove_and_keep_node(const NodePath &p_at, ObjectID p_keep_id) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->live_debug_remove_and_keep_node(p_at, p_keep_id);
+ });
+}
+
+void EditorDebuggerNode::live_debug_restore_node(ObjectID p_id, const NodePath &p_at, int p_at_pos) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->live_debug_restore_node(p_id, p_at, p_at_pos);
+ });
+}
+
+void EditorDebuggerNode::live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->live_debug_duplicate_node(p_at, p_new_name);
+ });
+}
+
+void EditorDebuggerNode::live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos) {
+ _for_all(tabs, [&](ScriptEditorDebugger *dbg) {
+ dbg->live_debug_reparent_node(p_at, p_new_place, p_new_name, p_at_pos);
+ });
+}
+
+void EditorDebuggerNode::add_debugger_plugin(const Ref<Script> &p_script) {
+ ERR_FAIL_COND_MSG(debugger_plugins.has(p_script), "Debugger plugin already exists.");
+ ERR_FAIL_COND_MSG(p_script.is_null(), "Debugger plugin script is null");
+ ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) == "", "Debugger plugin script has error.");
+ ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) != "EditorDebuggerPlugin", "Base type of debugger plugin is not 'EditorDebuggerPlugin'.");
+ ERR_FAIL_COND_MSG(!p_script->is_tool(), "Debugger plugin script is not in tool mode.");
+ debugger_plugins.insert(p_script);
+ for (int i = 0; get_debugger(i); i++) {
+ get_debugger(i)->add_debugger_plugin(p_script);
+ }
+}
+
+void EditorDebuggerNode::remove_debugger_plugin(const Ref<Script> &p_script) {
+ ERR_FAIL_COND_MSG(!debugger_plugins.has(p_script), "Debugger plugin doesn't exists.");
+ debugger_plugins.erase(p_script);
+ for (int i = 0; get_debugger(i); i++) {
+ get_debugger(i)->remove_debugger_plugin(p_script);
+ }
+}
diff --git a/editor/debugger/editor_debugger_node.h b/editor/debugger/editor_debugger_node.h
new file mode 100644
index 0000000000..8d70a7f961
--- /dev/null
+++ b/editor/debugger/editor_debugger_node.h
@@ -0,0 +1,195 @@
+/*************************************************************************/
+/* editor_debugger_node.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_DEBUGGER_NODE_H
+#define EDITOR_DEBUGGER_NODE_H
+
+#include "editor/debugger/editor_debugger_server.h"
+#include "scene/gui/margin_container.h"
+
+class Button;
+class EditorDebuggerTree;
+class EditorDebuggerRemoteObject;
+class MenuButton;
+class ScriptEditorDebugger;
+class TabContainer;
+
+class EditorDebuggerNode : public MarginContainer {
+ GDCLASS(EditorDebuggerNode, MarginContainer);
+
+public:
+ enum CameraOverride {
+ OVERRIDE_NONE,
+ OVERRIDE_2D,
+ OVERRIDE_3D_1, // 3D Viewport 1
+ OVERRIDE_3D_2, // 3D Viewport 2
+ OVERRIDE_3D_3, // 3D Viewport 3
+ OVERRIDE_3D_4 // 3D Viewport 4
+ };
+
+private:
+ enum Options {
+ DEBUG_NEXT,
+ DEBUG_STEP,
+ DEBUG_BREAK,
+ DEBUG_CONTINUE,
+ DEBUG_SHOW_KEEP_OPEN,
+ DEBUG_WITH_EXTERNAL_EDITOR,
+ };
+
+ class Breakpoint {
+ public:
+ String source;
+ int line = 0;
+
+ bool operator<(const Breakpoint &p_b) const {
+ if (line == p_b.line) {
+ return source < p_b.source;
+ }
+ return line < p_b.line;
+ }
+
+ Breakpoint() {}
+
+ Breakpoint(const String &p_source, int p_line) {
+ line = p_line;
+ source = p_source;
+ }
+ };
+
+ Ref<EditorDebuggerServer> server;
+ TabContainer *tabs = nullptr;
+ Button *debugger_button = nullptr;
+ MenuButton *script_menu = nullptr;
+
+ Ref<Script> stack_script; // Why?!?
+
+ int last_error_count = 0;
+ int last_warning_count = 0;
+
+ float inspect_edited_object_timeout = 0;
+ EditorDebuggerTree *remote_scene_tree = nullptr;
+ float remote_scene_tree_timeout = 0.0;
+ bool auto_switch_remote_scene_tree = false;
+ bool debug_with_external_editor = false;
+ bool hide_on_stop = true;
+ CameraOverride camera_override = OVERRIDE_NONE;
+ Map<Breakpoint, bool> breakpoints;
+
+ Set<Ref<Script>> debugger_plugins;
+
+ ScriptEditorDebugger *_add_debugger();
+ EditorDebuggerRemoteObject *get_inspected_remote_object();
+
+ friend class DebuggerEditorPlugin;
+ static EditorDebuggerNode *singleton;
+ EditorDebuggerNode();
+
+protected:
+ void _debugger_stopped(int p_id);
+ void _debugger_wants_stop(int p_id);
+ void _debugger_changed(int p_tab);
+ void _remote_tree_updated(int p_debugger);
+ void _remote_object_updated(ObjectID p_id, int p_debugger);
+ void _remote_object_property_updated(ObjectID p_id, const String &p_property, int p_debugger);
+ void _remote_object_requested(ObjectID p_id, int p_debugger);
+ void _save_node_requested(ObjectID p_id, const String &p_file, int p_debugger);
+
+ void _clear_execution(REF p_script) {
+ emit_signal("clear_execution", p_script);
+ }
+
+ void _text_editor_stack_goto(const ScriptEditorDebugger *p_debugger);
+ void _stack_frame_selected(int p_debugger);
+ void _error_selected(const String &p_file, int p_line, int p_debugger);
+ void _breaked(bool p_breaked, bool p_can_debug, int p_debugger);
+ void _paused();
+ void _break_state_changed();
+ void _menu_option(int p_id);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ static EditorDebuggerNode *get_singleton() { return singleton; }
+
+ ScriptEditorDebugger *get_current_debugger() const;
+ ScriptEditorDebugger *get_default_debugger() const;
+ ScriptEditorDebugger *get_debugger(int p_debugger) const;
+
+ void debug_next();
+ void debug_step();
+ void debug_break();
+ void debug_continue();
+
+ void set_script_debug_button(MenuButton *p_button);
+
+ void set_tool_button(Button *p_button) {
+ debugger_button = p_button;
+ }
+
+ String get_var_value(const String &p_var) const;
+ Ref<Script> get_dump_stack_script() const { return stack_script; } // Why do we need this?
+
+ bool get_debug_with_external_editor() { return debug_with_external_editor; }
+
+ bool is_skip_breakpoints() const;
+ void set_breakpoint(const String &p_path, int p_line, bool p_enabled);
+ void reload_scripts();
+
+ // Remote inspector/edit.
+ void request_remote_tree();
+ static void _method_changeds(void *p_ud, Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE);
+ static void _property_changeds(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value);
+
+ // LiveDebug
+ void set_live_debugging(bool p_enabled);
+ void update_live_edit_root();
+ void live_debug_create_node(const NodePath &p_parent, const String &p_type, const String &p_name);
+ void live_debug_instance_node(const NodePath &p_parent, const String &p_path, const String &p_name);
+ void live_debug_remove_node(const NodePath &p_at);
+ void live_debug_remove_and_keep_node(const NodePath &p_at, ObjectID p_keep_id);
+ void live_debug_restore_node(ObjectID p_id, const NodePath &p_at, int p_at_pos);
+ void live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name);
+ void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos);
+
+ // Camera
+ void set_camera_override(CameraOverride p_override) { camera_override = p_override; }
+ CameraOverride get_camera_override() { return camera_override; }
+
+ Error start(const String &p_protocol = "tcp://");
+
+ void stop();
+
+ void add_debugger_plugin(const Ref<Script> &p_script);
+ void remove_debugger_plugin(const Ref<Script> &p_script);
+};
+#endif // EDITOR_DEBUGGER_NODE_H
diff --git a/editor/debugger/editor_debugger_server.cpp b/editor/debugger/editor_debugger_server.cpp
new file mode 100644
index 0000000000..0b655044a8
--- /dev/null
+++ b/editor/debugger/editor_debugger_server.cpp
@@ -0,0 +1,112 @@
+/*************************************************************************/
+/* editor_debugger_server.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_debugger_server.h"
+
+#include "core/io/marshalls.h"
+#include "core/io/tcp_server.h"
+#include "core/os/mutex.h"
+#include "core/os/thread.h"
+#include "editor/editor_log.h"
+#include "editor/editor_node.h"
+#include "editor/editor_settings.h"
+
+class EditorDebuggerServerTCP : public EditorDebuggerServer {
+private:
+ Ref<TCP_Server> server;
+
+public:
+ static EditorDebuggerServer *create(const String &p_protocol);
+ virtual void poll() {}
+ virtual Error start();
+ virtual void stop();
+ virtual bool is_active() const;
+ virtual bool is_connection_available() const;
+ virtual Ref<RemoteDebuggerPeer> take_connection();
+
+ EditorDebuggerServerTCP();
+};
+
+EditorDebuggerServer *EditorDebuggerServerTCP::create(const String &p_protocol) {
+ ERR_FAIL_COND_V(p_protocol != "tcp://", nullptr);
+ return memnew(EditorDebuggerServerTCP);
+}
+
+EditorDebuggerServerTCP::EditorDebuggerServerTCP() {
+ server.instance();
+}
+
+Error EditorDebuggerServerTCP::start() {
+ int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
+ const Error err = server->listen(remote_port);
+ if (err != OK) {
+ EditorNode::get_log()->add_message(String("Error listening on port ") + itos(remote_port), EditorLog::MSG_TYPE_ERROR);
+ return err;
+ }
+ return err;
+}
+
+void EditorDebuggerServerTCP::stop() {
+ server->stop();
+}
+
+bool EditorDebuggerServerTCP::is_active() const {
+ return server->is_listening();
+}
+
+bool EditorDebuggerServerTCP::is_connection_available() const {
+ return server->is_listening() && server->is_connection_available();
+}
+
+Ref<RemoteDebuggerPeer> EditorDebuggerServerTCP::take_connection() {
+ ERR_FAIL_COND_V(!is_connection_available(), Ref<RemoteDebuggerPeer>());
+ return memnew(RemoteDebuggerPeerTCP(server->take_connection()));
+}
+
+/// EditorDebuggerServer
+Map<StringName, EditorDebuggerServer::CreateServerFunc> EditorDebuggerServer::protocols;
+
+EditorDebuggerServer *EditorDebuggerServer::create(const String &p_protocol) {
+ ERR_FAIL_COND_V(!protocols.has(p_protocol), nullptr);
+ return protocols[p_protocol](p_protocol);
+}
+
+void EditorDebuggerServer::register_protocol_handler(const String &p_protocol, CreateServerFunc p_func) {
+ ERR_FAIL_COND(protocols.has(p_protocol));
+ protocols[p_protocol] = p_func;
+}
+
+void EditorDebuggerServer::initialize() {
+ register_protocol_handler("tcp://", EditorDebuggerServerTCP::create);
+}
+
+void EditorDebuggerServer::deinitialize() {
+ protocols.clear();
+}
diff --git a/editor/debugger/editor_debugger_server.h b/editor/debugger/editor_debugger_server.h
new file mode 100644
index 0000000000..10a9a232ab
--- /dev/null
+++ b/editor/debugger/editor_debugger_server.h
@@ -0,0 +1,58 @@
+/*************************************************************************/
+/* editor_debugger_server.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_DEBUGGER_CONNECTION_H
+#define EDITOR_DEBUGGER_CONNECTION_H
+
+#include "core/debugger/remote_debugger_peer.h"
+#include "core/reference.h"
+
+class EditorDebuggerServer : public Reference {
+public:
+ typedef EditorDebuggerServer *(*CreateServerFunc)(const String &p_uri);
+
+private:
+ static Map<StringName, CreateServerFunc> protocols;
+
+public:
+ static void initialize();
+ static void deinitialize();
+
+ static void register_protocol_handler(const String &p_protocol, CreateServerFunc p_func);
+ static EditorDebuggerServer *create(const String &p_protocol);
+ virtual void poll() = 0;
+ virtual Error start() = 0;
+ virtual void stop() = 0;
+ virtual bool is_active() const = 0;
+ virtual bool is_connection_available() const = 0;
+ virtual Ref<RemoteDebuggerPeer> take_connection() = 0;
+};
+
+#endif // EDITOR_DEBUGGER_CONNECTION_H
diff --git a/editor/debugger/editor_debugger_tree.cpp b/editor/debugger/editor_debugger_tree.cpp
new file mode 100644
index 0000000000..ebac9b3482
--- /dev/null
+++ b/editor/debugger/editor_debugger_tree.cpp
@@ -0,0 +1,268 @@
+/*************************************************************************/
+/* editor_debugger_tree.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_debugger_tree.h"
+
+#include "editor/editor_node.h"
+#include "scene/debugger/scene_debugger.h"
+#include "scene/resources/packed_scene.h"
+#include "servers/display_server.h"
+
+EditorDebuggerTree::EditorDebuggerTree() {
+ set_v_size_flags(SIZE_EXPAND_FILL);
+ set_allow_rmb_select(true);
+
+ // Popup
+ item_menu = memnew(PopupMenu);
+ item_menu->connect("id_pressed", callable_mp(this, &EditorDebuggerTree::_item_menu_id_pressed));
+ add_child(item_menu);
+
+ // File Dialog
+ file_dialog = memnew(EditorFileDialog);
+ file_dialog->connect("file_selected", callable_mp(this, &EditorDebuggerTree::_file_selected));
+ add_child(file_dialog);
+}
+
+void EditorDebuggerTree::_notification(int p_what) {
+ if (p_what == NOTIFICATION_POSTINITIALIZE) {
+ connect("cell_selected", callable_mp(this, &EditorDebuggerTree::_scene_tree_selected));
+ connect("item_collapsed", callable_mp(this, &EditorDebuggerTree::_scene_tree_folded));
+ connect("item_rmb_selected", callable_mp(this, &EditorDebuggerTree::_scene_tree_rmb_selected));
+ }
+}
+
+void EditorDebuggerTree::_bind_methods() {
+ ADD_SIGNAL(MethodInfo("object_selected", PropertyInfo(Variant::INT, "object_id"), PropertyInfo(Variant::INT, "debugger")));
+ ADD_SIGNAL(MethodInfo("save_node", PropertyInfo(Variant::INT, "object_id"), PropertyInfo(Variant::STRING, "filename"), PropertyInfo(Variant::INT, "debugger")));
+}
+
+void EditorDebuggerTree::_scene_tree_selected() {
+ if (updating_scene_tree) {
+ return;
+ }
+
+ TreeItem *item = get_selected();
+ if (!item) {
+ return;
+ }
+
+ inspected_object_id = uint64_t(item->get_metadata(0));
+
+ emit_signal("object_selected", inspected_object_id, debugger_id);
+}
+
+void EditorDebuggerTree::_scene_tree_folded(Object *p_obj) {
+ if (updating_scene_tree) {
+ return;
+ }
+ TreeItem *item = Object::cast_to<TreeItem>(p_obj);
+
+ if (!item) {
+ return;
+ }
+
+ ObjectID id = ObjectID(uint64_t(item->get_metadata(0)));
+ if (unfold_cache.has(id)) {
+ unfold_cache.erase(id);
+ } else {
+ unfold_cache.insert(id);
+ }
+}
+
+void EditorDebuggerTree::_scene_tree_rmb_selected(const Vector2 &p_position) {
+ TreeItem *item = get_item_at_position(p_position);
+ if (!item) {
+ return;
+ }
+
+ item->select(0);
+
+ item_menu->clear();
+ item_menu->add_icon_item(get_theme_icon("CreateNewSceneFrom", "EditorIcons"), TTR("Save Branch as Scene"), ITEM_MENU_SAVE_REMOTE_NODE);
+ item_menu->add_icon_item(get_theme_icon("CopyNodePath", "EditorIcons"), TTR("Copy Node Path"), ITEM_MENU_COPY_NODE_PATH);
+ item_menu->set_position(get_screen_transform().xform(get_local_mouse_position()));
+ item_menu->popup();
+}
+
+/// Populates inspect_scene_tree given data in nodes as a flat list, encoded depth first.
+///
+/// Given a nodes array like [R,A,B,C,D,E] the following Tree will be generated, assuming
+/// filter is an empty String, R and A child count are 2, B is 1 and C, D and E are 0.
+///
+/// R
+/// |-A
+/// | |-B
+/// | | |-C
+/// | |
+/// | |-D
+/// |
+/// |-E
+///
+void EditorDebuggerTree::update_scene_tree(const SceneDebuggerTree *p_tree, int p_debugger) {
+ updating_scene_tree = true;
+ const String last_path = get_selected_path();
+ const String filter = EditorNode::get_singleton()->get_scene_tree_dock()->get_filter();
+
+ // Nodes are in a flatten list, depth first. Use a stack of parents, avoid recursion.
+ List<Pair<TreeItem *, int>> parents;
+ for (int i = 0; i < p_tree->nodes.size(); i++) {
+ TreeItem *parent = nullptr;
+ if (parents.size()) { // Find last parent.
+ Pair<TreeItem *, int> &p = parents[0];
+ parent = p.first;
+ if (!(--p.second)) { // If no child left, remove it.
+ parents.pop_front();
+ }
+ }
+ // Add this node.
+ const SceneDebuggerTree::RemoteNode &node = p_tree->nodes[i];
+ TreeItem *item = create_item(parent);
+ item->set_text(0, node.name);
+ item->set_tooltip(0, TTR("Type:") + " " + node.type_name);
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_class_icon(node.type_name, "");
+ if (icon.is_valid()) {
+ item->set_icon(0, icon);
+ }
+ item->set_metadata(0, node.id);
+
+ // Set current item as collapsed if necessary (root is never collapsed)
+ if (parent) {
+ if (!unfold_cache.has(node.id)) {
+ item->set_collapsed(true);
+ }
+ }
+ // Select previously selected node.
+ if (debugger_id == p_debugger) { // Can use remote id.
+ if (node.id == inspected_object_id) {
+ item->select(0);
+ }
+ } else { // Must use path
+ if (last_path == _get_path(item)) {
+ updating_scene_tree = false; // Force emission of new selection
+ item->select(0);
+ updating_scene_tree = true;
+ }
+ }
+
+ // Add in front of the parents stack if children are expected.
+ if (node.child_count) {
+ parents.push_front(Pair<TreeItem *, int>(item, node.child_count));
+ } else {
+ // Apply filters.
+ while (parent) {
+ const bool had_siblings = item->get_prev() || item->get_next();
+ if (filter.is_subsequence_ofi(item->get_text(0))) {
+ break; // Filter matches, must survive.
+ }
+ parent->remove_child(item);
+ memdelete(item);
+ if (had_siblings) {
+ break; // Parent must survive.
+ }
+ item = parent;
+ parent = item->get_parent();
+ // Check if parent expects more children.
+ for (int j = 0; j < parents.size(); j++) {
+ if (parents[j].first == item) {
+ parent = nullptr;
+ break; // Might have more children.
+ }
+ }
+ }
+ }
+ }
+ debugger_id = p_debugger; // Needed by hook, could be avoided if every debugger had its own tree
+ updating_scene_tree = false;
+}
+
+String EditorDebuggerTree::get_selected_path() {
+ if (!get_selected()) {
+ return "";
+ }
+ return _get_path(get_selected());
+}
+
+String EditorDebuggerTree::_get_path(TreeItem *p_item) {
+ ERR_FAIL_COND_V(!p_item, "");
+
+ if (p_item->get_parent() == nullptr) {
+ return "/root";
+ }
+ String text = p_item->get_text(0);
+ TreeItem *cur = p_item->get_parent();
+ while (cur) {
+ text = cur->get_text(0) + "/" + text;
+ cur = cur->get_parent();
+ }
+ return "/" + text;
+}
+
+void EditorDebuggerTree::_item_menu_id_pressed(int p_option) {
+ switch (p_option) {
+ case ITEM_MENU_SAVE_REMOTE_NODE: {
+ file_dialog->set_access(EditorFileDialog::ACCESS_RESOURCES);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+
+ List<String> extensions;
+ Ref<PackedScene> sd = memnew(PackedScene);
+ ResourceSaver::get_recognized_extensions(sd, &extensions);
+ file_dialog->clear_filters();
+ for (int i = 0; i < extensions.size(); i++) {
+ file_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
+ }
+
+ file_dialog->popup_file_dialog();
+ } break;
+ case ITEM_MENU_COPY_NODE_PATH: {
+ String text = get_selected_path();
+ if (text.empty()) {
+ return;
+ } else if (text == "/root") {
+ text = ".";
+ } else {
+ text = text.replace("/root/", "");
+ int slash = text.find("/");
+ if (slash < 0) {
+ text = ".";
+ } else {
+ text = text.substr(slash + 1);
+ }
+ }
+ DisplayServer::get_singleton()->clipboard_set(text);
+ } break;
+ }
+}
+
+void EditorDebuggerTree::_file_selected(const String &p_file) {
+ if (inspected_object_id.is_null()) {
+ return;
+ }
+ emit_signal("save_node", inspected_object_id, p_file, debugger_id);
+}
diff --git a/editor/debugger/editor_debugger_tree.h b/editor/debugger/editor_debugger_tree.h
new file mode 100644
index 0000000000..5ec1423c07
--- /dev/null
+++ b/editor/debugger/editor_debugger_tree.h
@@ -0,0 +1,73 @@
+/*************************************************************************/
+/* editor_debugger_tree.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "scene/gui/tree.h"
+
+#ifndef EDITOR_DEBUGGER_TREE_H
+#define EDITOR_DEBUGGER_TREE_H
+
+class SceneDebuggerTree;
+class EditorFileDialog;
+
+class EditorDebuggerTree : public Tree {
+ GDCLASS(EditorDebuggerTree, Tree);
+
+private:
+ enum ItemMenu {
+ ITEM_MENU_SAVE_REMOTE_NODE,
+ ITEM_MENU_COPY_NODE_PATH,
+ };
+
+ ObjectID inspected_object_id;
+ int debugger_id = 0;
+ bool updating_scene_tree = false;
+ Set<ObjectID> unfold_cache;
+ PopupMenu *item_menu = nullptr;
+ EditorFileDialog *file_dialog = nullptr;
+
+ String _get_path(TreeItem *p_item);
+ void _scene_tree_folded(Object *p_obj);
+ void _scene_tree_selected();
+ void _scene_tree_rmb_selected(const Vector2 &p_position);
+ void _item_menu_id_pressed(int p_option);
+ void _file_selected(const String &p_file);
+
+protected:
+ static void _bind_methods();
+ void _notification(int p_what);
+
+public:
+ String get_selected_path();
+ ObjectID get_selected_object();
+ int get_current_debugger(); // Would love to have one tree for every debugger.
+ void update_scene_tree(const SceneDebuggerTree *p_tree, int p_debugger);
+ EditorDebuggerTree();
+};
+#endif // EDITOR_DEBUGGER_TREE_H
diff --git a/editor/debugger/editor_network_profiler.cpp b/editor/debugger/editor_network_profiler.cpp
new file mode 100644
index 0000000000..baa88bcdbc
--- /dev/null
+++ b/editor/debugger/editor_network_profiler.cpp
@@ -0,0 +1,201 @@
+/*************************************************************************/
+/* editor_network_profiler.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_network_profiler.h"
+
+#include "core/os/os.h"
+#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
+
+void EditorNetworkProfiler::_bind_methods() {
+ ADD_SIGNAL(MethodInfo("enable_profiling", PropertyInfo(Variant::BOOL, "enable")));
+}
+
+void EditorNetworkProfiler::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
+ activate->set_icon(get_theme_icon("Play", "EditorIcons"));
+ clear_button->set_icon(get_theme_icon("Clear", "EditorIcons"));
+ incoming_bandwidth_text->set_right_icon(get_theme_icon("ArrowDown", "EditorIcons"));
+ outgoing_bandwidth_text->set_right_icon(get_theme_icon("ArrowUp", "EditorIcons"));
+
+ // This needs to be done here to set the faded color when the profiler is first opened
+ incoming_bandwidth_text->add_theme_color_override("font_color_uneditable", get_theme_color("font_color", "Editor") * Color(1, 1, 1, 0.5));
+ outgoing_bandwidth_text->add_theme_color_override("font_color_uneditable", get_theme_color("font_color", "Editor") * Color(1, 1, 1, 0.5));
+ }
+}
+
+void EditorNetworkProfiler::_update_frame() {
+ counters_display->clear();
+
+ TreeItem *root = counters_display->create_item();
+
+ for (Map<ObjectID, DebuggerMarshalls::MultiplayerNodeInfo>::Element *E = nodes_data.front(); E; E = E->next()) {
+ TreeItem *node = counters_display->create_item(root);
+
+ for (int j = 0; j < counters_display->get_columns(); ++j) {
+ node->set_text_align(j, j > 0 ? TreeItem::ALIGN_RIGHT : TreeItem::ALIGN_LEFT);
+ }
+
+ node->set_text(0, E->get().node_path);
+ node->set_text(1, E->get().incoming_rpc == 0 ? "-" : itos(E->get().incoming_rpc));
+ node->set_text(2, E->get().incoming_rset == 0 ? "-" : itos(E->get().incoming_rset));
+ node->set_text(3, E->get().outgoing_rpc == 0 ? "-" : itos(E->get().outgoing_rpc));
+ node->set_text(4, E->get().outgoing_rset == 0 ? "-" : itos(E->get().outgoing_rset));
+ }
+}
+
+void EditorNetworkProfiler::_activate_pressed() {
+ if (activate->is_pressed()) {
+ activate->set_icon(get_theme_icon("Stop", "EditorIcons"));
+ activate->set_text(TTR("Stop"));
+ } else {
+ activate->set_icon(get_theme_icon("Play", "EditorIcons"));
+ activate->set_text(TTR("Start"));
+ }
+ emit_signal("enable_profiling", activate->is_pressed());
+}
+
+void EditorNetworkProfiler::_clear_pressed() {
+ nodes_data.clear();
+ set_bandwidth(0, 0);
+ if (frame_delay->is_stopped()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+}
+
+void EditorNetworkProfiler::add_node_frame_data(const DebuggerMarshalls::MultiplayerNodeInfo p_frame) {
+ if (!nodes_data.has(p_frame.node)) {
+ nodes_data.insert(p_frame.node, p_frame);
+ } else {
+ nodes_data[p_frame.node].incoming_rpc += p_frame.incoming_rpc;
+ nodes_data[p_frame.node].incoming_rset += p_frame.incoming_rset;
+ nodes_data[p_frame.node].outgoing_rpc += p_frame.outgoing_rpc;
+ nodes_data[p_frame.node].outgoing_rset += p_frame.outgoing_rset;
+ }
+
+ if (frame_delay->is_stopped()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+}
+
+void EditorNetworkProfiler::set_bandwidth(int p_incoming, int p_outgoing) {
+ incoming_bandwidth_text->set_text(vformat(TTR("%s/s"), String::humanize_size(p_incoming)));
+ outgoing_bandwidth_text->set_text(vformat(TTR("%s/s"), String::humanize_size(p_outgoing)));
+
+ // Make labels more prominent when the bandwidth is greater than 0 to attract user attention
+ incoming_bandwidth_text->add_theme_color_override(
+ "font_color_uneditable",
+ get_theme_color("font_color", "Editor") * Color(1, 1, 1, p_incoming > 0 ? 1 : 0.5));
+ outgoing_bandwidth_text->add_theme_color_override(
+ "font_color_uneditable",
+ get_theme_color("font_color", "Editor") * Color(1, 1, 1, p_outgoing > 0 ? 1 : 0.5));
+}
+
+bool EditorNetworkProfiler::is_profiling() {
+ return activate->is_pressed();
+}
+
+EditorNetworkProfiler::EditorNetworkProfiler() {
+ HBoxContainer *hb = memnew(HBoxContainer);
+ hb->add_theme_constant_override("separation", 8 * EDSCALE);
+ add_child(hb);
+
+ activate = memnew(Button);
+ activate->set_toggle_mode(true);
+ activate->set_text(TTR("Start"));
+ activate->connect("pressed", callable_mp(this, &EditorNetworkProfiler::_activate_pressed));
+ hb->add_child(activate);
+
+ clear_button = memnew(Button);
+ clear_button->set_text(TTR("Clear"));
+ clear_button->connect("pressed", callable_mp(this, &EditorNetworkProfiler::_clear_pressed));
+ hb->add_child(clear_button);
+
+ hb->add_spacer();
+
+ Label *lb = memnew(Label);
+ lb->set_text(TTR("Down"));
+ hb->add_child(lb);
+
+ incoming_bandwidth_text = memnew(LineEdit);
+ incoming_bandwidth_text->set_editable(false);
+ incoming_bandwidth_text->set_custom_minimum_size(Size2(120, 0) * EDSCALE);
+ incoming_bandwidth_text->set_align(LineEdit::Align::ALIGN_RIGHT);
+ hb->add_child(incoming_bandwidth_text);
+
+ Control *down_up_spacer = memnew(Control);
+ down_up_spacer->set_custom_minimum_size(Size2(30, 0) * EDSCALE);
+ hb->add_child(down_up_spacer);
+
+ lb = memnew(Label);
+ lb->set_text(TTR("Up"));
+ hb->add_child(lb);
+
+ outgoing_bandwidth_text = memnew(LineEdit);
+ outgoing_bandwidth_text->set_editable(false);
+ outgoing_bandwidth_text->set_custom_minimum_size(Size2(120, 0) * EDSCALE);
+ outgoing_bandwidth_text->set_align(LineEdit::Align::ALIGN_RIGHT);
+ hb->add_child(outgoing_bandwidth_text);
+
+ // Set initial texts in the incoming/outgoing bandwidth labels
+ set_bandwidth(0, 0);
+
+ counters_display = memnew(Tree);
+ counters_display->set_custom_minimum_size(Size2(300, 0) * EDSCALE);
+ counters_display->set_v_size_flags(SIZE_EXPAND_FILL);
+ counters_display->set_hide_folding(true);
+ counters_display->set_hide_root(true);
+ counters_display->set_columns(5);
+ counters_display->set_column_titles_visible(true);
+ counters_display->set_column_title(0, TTR("Node"));
+ counters_display->set_column_expand(0, true);
+ counters_display->set_column_min_width(0, 60 * EDSCALE);
+ counters_display->set_column_title(1, TTR("Incoming RPC"));
+ counters_display->set_column_expand(1, false);
+ counters_display->set_column_min_width(1, 120 * EDSCALE);
+ counters_display->set_column_title(2, TTR("Incoming RSET"));
+ counters_display->set_column_expand(2, false);
+ counters_display->set_column_min_width(2, 120 * EDSCALE);
+ counters_display->set_column_title(3, TTR("Outgoing RPC"));
+ counters_display->set_column_expand(3, false);
+ counters_display->set_column_min_width(3, 120 * EDSCALE);
+ counters_display->set_column_title(4, TTR("Outgoing RSET"));
+ counters_display->set_column_expand(4, false);
+ counters_display->set_column_min_width(4, 120 * EDSCALE);
+ add_child(counters_display);
+
+ frame_delay = memnew(Timer);
+ frame_delay->set_wait_time(0.1);
+ frame_delay->set_one_shot(true);
+ add_child(frame_delay);
+ frame_delay->connect("timeout", callable_mp(this, &EditorNetworkProfiler::_update_frame));
+}
diff --git a/editor/debugger/editor_network_profiler.h b/editor/debugger/editor_network_profiler.h
new file mode 100644
index 0000000000..cf65fb5316
--- /dev/null
+++ b/editor/debugger/editor_network_profiler.h
@@ -0,0 +1,72 @@
+/*************************************************************************/
+/* editor_network_profiler.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITORNETWORKPROFILER_H
+#define EDITORNETWORKPROFILER_H
+
+#include "core/debugger/debugger_marshalls.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
+#include "scene/gui/label.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/tree.h"
+
+class EditorNetworkProfiler : public VBoxContainer {
+ GDCLASS(EditorNetworkProfiler, VBoxContainer)
+
+private:
+ Button *activate;
+ Button *clear_button;
+ Tree *counters_display;
+ LineEdit *incoming_bandwidth_text;
+ LineEdit *outgoing_bandwidth_text;
+
+ Timer *frame_delay;
+
+ Map<ObjectID, DebuggerMarshalls::MultiplayerNodeInfo> nodes_data;
+
+ void _update_frame();
+
+ void _activate_pressed();
+ void _clear_pressed();
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void add_node_frame_data(const DebuggerMarshalls::MultiplayerNodeInfo p_frame);
+ void set_bandwidth(int p_incoming, int p_outgoing);
+ bool is_profiling();
+
+ EditorNetworkProfiler();
+};
+
+#endif //EDITORNETWORKPROFILER_H
diff --git a/editor/debugger/editor_performance_profiler.cpp b/editor/debugger/editor_performance_profiler.cpp
new file mode 100644
index 0000000000..47fe282758
--- /dev/null
+++ b/editor/debugger/editor_performance_profiler.cpp
@@ -0,0 +1,394 @@
+/*************************************************************************/
+/* editor_performance_profiler.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_performance_profiler.h"
+
+#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
+#include "main/performance.h"
+
+EditorPerformanceProfiler::Monitor::Monitor() {}
+
+EditorPerformanceProfiler::Monitor::Monitor(String p_name, String p_base, int p_frame_index, Performance::MonitorType p_type, TreeItem *p_item) {
+ type = p_type;
+ item = p_item;
+ frame_index = p_frame_index;
+ name = p_name;
+ base = p_base;
+}
+
+void EditorPerformanceProfiler::Monitor::update_value(float p_value) {
+ ERR_FAIL_COND(!item);
+ String label = EditorPerformanceProfiler::_create_label(p_value, type);
+ String tooltip = label;
+ switch (type) {
+ case Performance::MONITOR_TYPE_MEMORY: {
+ tooltip = label;
+ } break;
+ case Performance::MONITOR_TYPE_TIME: {
+ tooltip = label;
+ } break;
+ default: {
+ tooltip += " " + item->get_text(0);
+ } break;
+ }
+ item->set_text(1, label);
+ item->set_tooltip(1, tooltip);
+
+ if (p_value > max) {
+ max = p_value;
+ }
+}
+
+void EditorPerformanceProfiler::Monitor::reset() {
+ history.clear();
+ max = 0.0f;
+ if (item) {
+ item->set_text(1, "");
+ item->set_tooltip(1, "");
+ }
+}
+
+String EditorPerformanceProfiler::_create_label(float p_value, Performance::MonitorType p_type) {
+ switch (p_type) {
+ case Performance::MONITOR_TYPE_MEMORY: {
+ return String::humanize_size(p_value);
+ }
+ case Performance::MONITOR_TYPE_TIME: {
+ return rtos(p_value * 1000).pad_decimals(2) + " ms";
+ }
+ default: {
+ return rtos(p_value);
+ }
+ }
+}
+
+void EditorPerformanceProfiler::_monitor_select() {
+ monitor_draw->update();
+}
+
+void EditorPerformanceProfiler::_monitor_draw() {
+ Vector<StringName> active;
+ for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
+ if (i.value().item->is_checked(0)) {
+ active.push_back(i.key());
+ }
+ }
+
+ if (active.empty()) {
+ info_message->show();
+ return;
+ }
+
+ info_message->hide();
+
+ Ref<StyleBox> graph_style_box = get_theme_stylebox("normal", "TextEdit");
+ Ref<Font> graph_font = get_theme_font("font", "TextEdit");
+
+ int columns = int(Math::ceil(Math::sqrt(float(active.size()))));
+ int rows = int(Math::ceil(float(active.size()) / float(columns)));
+ if (active.size() == 1) {
+ rows = 1;
+ }
+ Size2i cell_size = Size2i(monitor_draw->get_size()) / Size2i(columns, rows);
+ float spacing = float(POINT_SEPARATION) / float(columns);
+ float value_multiplier = EditorSettings::get_singleton()->is_dark_theme() ? 1.4f : 0.55f;
+ float hue_shift = 1.0f / float(monitors.size());
+
+ for (int i = 0; i < active.size(); i++) {
+ Monitor &current = monitors[active[i]];
+ Rect2i rect(Point2i(i % columns, i / columns) * cell_size + Point2i(MARGIN, MARGIN), cell_size - Point2i(MARGIN, MARGIN) * 2);
+ monitor_draw->draw_style_box(graph_style_box, rect);
+
+ rect.position += graph_style_box->get_offset();
+ rect.size -= graph_style_box->get_minimum_size();
+ Color draw_color = get_theme_color("accent_color", "Editor");
+ draw_color.set_hsv(Math::fmod(hue_shift * float(current.frame_index), 0.9f), draw_color.get_s() * 0.9f, draw_color.get_v() * value_multiplier, 0.6f);
+ monitor_draw->draw_string(graph_font, rect.position + Point2(0, graph_font->get_ascent()), current.item->get_text(0), draw_color, rect.size.x);
+
+ draw_color.a = 0.9f;
+ float value_position = rect.size.width - graph_font->get_string_size(current.item->get_text(1)).width;
+ if (value_position < 0) {
+ value_position = 0;
+ }
+ monitor_draw->draw_string(graph_font, rect.position + Point2(value_position, graph_font->get_ascent()), current.item->get_text(1), draw_color, rect.size.x);
+
+ rect.position.y += graph_font->get_height();
+ rect.size.height -= graph_font->get_height();
+
+ int line_count = rect.size.height / (graph_font->get_height() * 2);
+ if (line_count > 5) {
+ line_count = 5;
+ }
+ if (line_count > 0) {
+ Color horizontal_line_color;
+ horizontal_line_color.set_hsv(draw_color.get_h(), draw_color.get_s() * 0.5f, draw_color.get_v() * 0.5f, 0.3f);
+ monitor_draw->draw_line(rect.position, rect.position + Vector2(rect.size.width, 0), horizontal_line_color, Math::round(EDSCALE));
+ monitor_draw->draw_string(graph_font, rect.position + Vector2(0, graph_font->get_ascent()), _create_label(current.max, current.type), horizontal_line_color, rect.size.width);
+
+ for (int j = 0; j < line_count; j++) {
+ Vector2 y_offset = Vector2(0, rect.size.height * (1.0f - float(j) / float(line_count)));
+ monitor_draw->draw_line(rect.position + y_offset, rect.position + Vector2(rect.size.width, 0) + y_offset, horizontal_line_color, Math::round(EDSCALE));
+ monitor_draw->draw_string(graph_font, rect.position - Vector2(0, graph_font->get_descent()) + y_offset, _create_label(current.max * float(j) / float(line_count), current.type), horizontal_line_color, rect.size.width);
+ }
+ }
+
+ float from = rect.size.width;
+ float prev = -1.0f;
+ int count = 0;
+ List<float>::Element *e = current.history.front();
+
+ while (from >= 0 && e) {
+ float m = current.max;
+ float h2 = 0;
+ if (m != 0) {
+ h2 = (e->get() / m);
+ }
+ h2 = (1.0f - h2) * float(rect.size.y);
+ if (e != current.history.front()) {
+ monitor_draw->draw_line(rect.position + Point2(from, h2), rect.position + Point2(from + spacing, prev), draw_color, Math::round(EDSCALE));
+ }
+
+ if (marker_key == active[i] && count == marker_frame) {
+ Color line_color;
+ line_color.set_hsv(draw_color.get_h(), draw_color.get_s() * 0.8f, draw_color.get_v(), 0.5f);
+ monitor_draw->draw_line(rect.position + Point2(from, 0), rect.position + Point2(from, rect.size.y), line_color, Math::round(EDSCALE));
+
+ String label = _create_label(e->get(), current.type);
+ Size2 size = graph_font->get_string_size(label);
+ Vector2 text_top_left_position = Vector2(from, h2) - (size + Vector2(MARKER_MARGIN, MARKER_MARGIN));
+ if (text_top_left_position.x < 0) {
+ text_top_left_position.x = from + MARKER_MARGIN;
+ }
+ if (text_top_left_position.y < 0) {
+ text_top_left_position.y = h2 + MARKER_MARGIN;
+ }
+ monitor_draw->draw_string(graph_font, rect.position + text_top_left_position + Point2(0, graph_font->get_ascent()), label, line_color, rect.size.x);
+ }
+ prev = h2;
+ e = e->next();
+ from -= spacing;
+ count++;
+ }
+ }
+}
+
+void EditorPerformanceProfiler::_build_monitor_tree() {
+ Set<StringName> monitor_checked;
+ for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
+ if (i.value().item && i.value().item->is_checked(0)) {
+ monitor_checked.insert(i.key());
+ }
+ }
+
+ base_map.clear();
+ monitor_tree->get_root()->clear_children();
+
+ for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
+ TreeItem *base = _get_monitor_base(i.value().base);
+ TreeItem *item = _create_monitor_item(i.value().name, base);
+ item->set_checked(0, monitor_checked.has(i.key()));
+ i.value().item = item;
+ if (!i.value().history.empty()) {
+ i.value().update_value(i.value().history.front()->get());
+ }
+ }
+}
+
+TreeItem *EditorPerformanceProfiler::_get_monitor_base(const StringName &p_base_name) {
+ if (base_map.has(p_base_name)) {
+ return base_map[p_base_name];
+ }
+
+ TreeItem *base = monitor_tree->create_item(monitor_tree->get_root());
+ base->set_text(0, p_base_name);
+ base->set_editable(0, false);
+ base->set_selectable(0, false);
+ base->set_expand_right(0, true);
+ base_map.insert(p_base_name, base);
+ return base;
+}
+
+TreeItem *EditorPerformanceProfiler::_create_monitor_item(const StringName &p_monitor_name, TreeItem *p_base) {
+ TreeItem *item = monitor_tree->create_item(p_base);
+ item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
+ item->set_editable(0, true);
+ item->set_selectable(0, false);
+ item->set_selectable(1, false);
+ item->set_text(0, p_monitor_name);
+ return item;
+}
+
+void EditorPerformanceProfiler::_marker_input(const Ref<InputEvent> &p_event) {
+ Ref<InputEventMouseButton> mb = p_event;
+ if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
+ Vector<StringName> active;
+ for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
+ if (i.value().item->is_checked(0)) {
+ active.push_back(i.key());
+ }
+ }
+ if (active.size() > 0) {
+ int columns = int(Math::ceil(Math::sqrt(float(active.size()))));
+ int rows = int(Math::ceil(float(active.size()) / float(columns)));
+ if (active.size() == 1) {
+ rows = 1;
+ }
+ Size2i cell_size = Size2i(monitor_draw->get_size()) / Size2i(columns, rows);
+ Vector2i index = mb->get_position() / cell_size;
+ Rect2i rect(index * cell_size + Point2i(MARGIN, MARGIN), cell_size - Point2i(MARGIN, MARGIN) * 2);
+ if (rect.has_point(mb->get_position())) {
+ if (index.x + index.y * columns < active.size()) {
+ marker_key = active[index.x + index.y * columns];
+ } else {
+ marker_key = "";
+ }
+ Ref<StyleBox> graph_style_box = get_theme_stylebox("normal", "TextEdit");
+ rect.position += graph_style_box->get_offset();
+ rect.size -= graph_style_box->get_minimum_size();
+ Vector2 point = mb->get_position() - rect.position;
+ if (point.x >= rect.size.x) {
+ marker_frame = 0;
+ } else {
+ int point_sep = 5;
+ float spacing = float(point_sep) / float(columns);
+ marker_frame = (rect.size.x - point.x) / spacing;
+ }
+ monitor_draw->update();
+ return;
+ }
+ }
+ marker_key = "";
+ monitor_draw->update();
+ }
+}
+
+void EditorPerformanceProfiler::reset() {
+ for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
+ if (String(i.key()).begins_with("custom:")) {
+ monitors.erase(i);
+ } else {
+ i.value().reset();
+ }
+ }
+
+ _build_monitor_tree();
+ marker_key = "";
+ marker_frame = 0;
+ monitor_draw->update();
+}
+
+void EditorPerformanceProfiler::update_monitors(const Vector<StringName> &p_names) {
+ OrderedHashMap<StringName, int> names;
+ for (int i = 0; i < p_names.size(); i++) {
+ names.insert("custom:" + p_names[i], Performance::MONITOR_MAX + i);
+ }
+
+ for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
+ if (String(i.key()).begins_with("custom:")) {
+ if (!names.has(i.key())) {
+ monitors.erase(i);
+ } else {
+ i.value().frame_index = names[i.key()];
+ names.erase(i.key());
+ }
+ }
+ }
+
+ for (OrderedHashMap<StringName, int>::Element i = names.front(); i; i = i.next()) {
+ String name = String(i.key()).replace_first("custom:", "");
+ String base = "Custom";
+ if (name.get_slice_count("/") == 2) {
+ base = name.get_slicec('/', 0);
+ name = name.get_slicec('/', 1);
+ }
+ monitors.insert(i.key(), Monitor(name, base, i.value(), Performance::MONITOR_TYPE_QUANTITY, nullptr));
+ }
+
+ _build_monitor_tree();
+}
+
+void EditorPerformanceProfiler::add_profile_frame(const Vector<float> &p_values) {
+ for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
+ float data = 0.0f;
+ if (i.value().frame_index >= 0 && i.value().frame_index < p_values.size()) {
+ data = p_values[i.value().frame_index];
+ }
+ i.value().history.push_front(data);
+ i.value().update_value(data);
+ }
+ marker_frame++;
+ monitor_draw->update();
+}
+
+List<float> *EditorPerformanceProfiler::get_monitor_data(const StringName &p_name) {
+ if (monitors.has(p_name)) {
+ return &monitors[p_name].history;
+ }
+ return nullptr;
+}
+
+EditorPerformanceProfiler::EditorPerformanceProfiler() {
+ set_name(TTR("Monitors"));
+ set_split_offset(340 * EDSCALE);
+
+ monitor_tree = memnew(Tree);
+ monitor_tree->set_columns(2);
+ monitor_tree->set_column_title(0, TTR("Monitor"));
+ monitor_tree->set_column_title(1, TTR("Value"));
+ monitor_tree->set_column_titles_visible(true);
+ monitor_tree->connect("item_edited", callable_mp(this, &EditorPerformanceProfiler::_monitor_select));
+ monitor_tree->create_item();
+ monitor_tree->set_hide_root(true);
+ add_child(monitor_tree);
+
+ monitor_draw = memnew(Control);
+ monitor_draw->set_clip_contents(true);
+ monitor_draw->connect("draw", callable_mp(this, &EditorPerformanceProfiler::_monitor_draw));
+ monitor_draw->connect("gui_input", callable_mp(this, &EditorPerformanceProfiler::_marker_input));
+ add_child(monitor_draw);
+
+ info_message = memnew(Label);
+ info_message->set_text(TTR("Pick one or more items from the list to display the graph."));
+ info_message->set_valign(Label::VALIGN_CENTER);
+ info_message->set_align(Label::ALIGN_CENTER);
+ info_message->set_autowrap(true);
+ info_message->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
+ info_message->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
+ monitor_draw->add_child(info_message);
+
+ for (int i = 0; i < Performance::MONITOR_MAX; i++) {
+ String base = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i)).get_slicec('/', 0).capitalize();
+ String name = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i)).get_slicec('/', 1).capitalize();
+ monitors.insert(Performance::get_singleton()->get_monitor_name(Performance::Monitor(i)), Monitor(name, base, i, Performance::get_singleton()->get_monitor_type(Performance::Monitor(i)), nullptr));
+ }
+
+ _build_monitor_tree();
+}
diff --git a/editor/debugger/editor_performance_profiler.h b/editor/debugger/editor_performance_profiler.h
new file mode 100644
index 0000000000..144dd34103
--- /dev/null
+++ b/editor/debugger/editor_performance_profiler.h
@@ -0,0 +1,90 @@
+/*************************************************************************/
+/* editor_performance_profiler.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_PERFORMANCE_PROFILER_H
+#define EDITOR_PERFORMANCE_PROFILER_H
+
+#include "core/map.h"
+#include "core/ordered_hash_map.h"
+#include "main/performance.h"
+#include "scene/gui/control.h"
+#include "scene/gui/label.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/tree.h"
+
+class EditorPerformanceProfiler : public HSplitContainer {
+ GDCLASS(EditorPerformanceProfiler, HSplitContainer);
+
+private:
+ class Monitor {
+ public:
+ String name;
+ String base;
+ List<float> history;
+ float max = 0.0f;
+ TreeItem *item = nullptr;
+ Performance::MonitorType type = Performance::MONITOR_TYPE_QUANTITY;
+ int frame_index = 0;
+
+ Monitor();
+ Monitor(String p_name, String p_base, int p_frame_index, Performance::MonitorType p_type, TreeItem *p_item);
+ void update_value(float p_value);
+ void reset();
+ };
+
+ OrderedHashMap<StringName, Monitor> monitors;
+
+ Map<StringName, TreeItem *> base_map;
+ Tree *monitor_tree;
+ Control *monitor_draw;
+ Label *info_message;
+ StringName marker_key;
+ int marker_frame;
+ const int MARGIN = 4;
+ const int POINT_SEPARATION = 5;
+ const int MARKER_MARGIN = 2;
+
+ static String _create_label(float p_value, Performance::MonitorType p_type);
+ void _monitor_select();
+ void _monitor_draw();
+ void _build_monitor_tree();
+ TreeItem *_get_monitor_base(const StringName &p_base_name);
+ TreeItem *_create_monitor_item(const StringName &p_monitor_name, TreeItem *p_base);
+ void _marker_input(const Ref<InputEvent> &p_event);
+
+public:
+ void reset();
+ void update_monitors(const Vector<StringName> &p_names);
+ void add_profile_frame(const Vector<float> &p_values);
+ List<float> *get_monitor_data(const StringName &p_name);
+ EditorPerformanceProfiler();
+};
+
+#endif // EDITOR_PERFORMANCE_PROFILER_H
diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp
new file mode 100644
index 0000000000..8bd21fff5c
--- /dev/null
+++ b/editor/debugger/editor_profiler.cpp
@@ -0,0 +1,751 @@
+/*************************************************************************/
+/* editor_profiler.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_profiler.h"
+
+#include "core/os/os.h"
+#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
+
+void EditorProfiler::_make_metric_ptrs(Metric &m) {
+ for (int i = 0; i < m.categories.size(); i++) {
+ m.category_ptrs[m.categories[i].signature] = &m.categories.write[i];
+ for (int j = 0; j < m.categories[i].items.size(); j++) {
+ m.item_ptrs[m.categories[i].items[j].signature] = &m.categories.write[i].items.write[j];
+ }
+ }
+}
+
+void EditorProfiler::add_frame_metric(const Metric &p_metric, bool p_final) {
+ ++last_metric;
+ if (last_metric >= frame_metrics.size()) {
+ last_metric = 0;
+ }
+
+ frame_metrics.write[last_metric] = p_metric;
+ _make_metric_ptrs(frame_metrics.write[last_metric]);
+
+ updating_frame = true;
+ cursor_metric_edit->set_max(frame_metrics[last_metric].frame_number);
+ cursor_metric_edit->set_min(MAX(frame_metrics[last_metric].frame_number - frame_metrics.size(), 0));
+
+ if (!seeking) {
+ cursor_metric_edit->set_value(frame_metrics[last_metric].frame_number);
+ if (hover_metric != -1) {
+ hover_metric++;
+ if (hover_metric >= frame_metrics.size()) {
+ hover_metric = 0;
+ }
+ }
+ }
+ updating_frame = false;
+
+ if (frame_delay->is_stopped()) {
+ frame_delay->set_wait_time(p_final ? 0.1 : 1);
+ frame_delay->start();
+ }
+
+ if (plot_delay->is_stopped()) {
+ plot_delay->set_wait_time(0.1);
+ plot_delay->start();
+ }
+}
+
+void EditorProfiler::clear() {
+ int metric_size = EditorSettings::get_singleton()->get("debugger/profiler_frame_history_size");
+ metric_size = CLAMP(metric_size, 60, 1024);
+ frame_metrics.clear();
+ frame_metrics.resize(metric_size);
+ last_metric = -1;
+ variables->clear();
+ plot_sigs.clear();
+ plot_sigs.insert("physics_frame_time");
+ plot_sigs.insert("category_frame_time");
+
+ updating_frame = true;
+ cursor_metric_edit->set_min(0);
+ cursor_metric_edit->set_max(100); // Doesn't make much sense, but we can't have min == max. Doesn't hurt.
+ cursor_metric_edit->set_value(0);
+ updating_frame = false;
+ hover_metric = -1;
+ seeking = false;
+}
+
+static String _get_percent_txt(float p_value, float p_total) {
+ if (p_total == 0) {
+ p_total = 0.00001;
+ }
+
+ return String::num((p_value / p_total) * 100, 1) + "%";
+}
+
+String EditorProfiler::_get_time_as_text(const Metric &m, float p_time, int p_calls) {
+ const int dmode = display_mode->get_selected();
+
+ if (dmode == DISPLAY_FRAME_TIME) {
+ return rtos(p_time * 1000).pad_decimals(2) + " ms";
+ } else if (dmode == DISPLAY_AVERAGE_TIME) {
+ if (p_calls == 0) {
+ return "0.00 ms";
+ } else {
+ return rtos((p_time / p_calls) * 1000).pad_decimals(2) + " ms";
+ }
+ } else if (dmode == DISPLAY_FRAME_PERCENT) {
+ return _get_percent_txt(p_time, m.frame_time);
+ } else if (dmode == DISPLAY_PHYSICS_FRAME_PERCENT) {
+ return _get_percent_txt(p_time, m.physics_frame_time);
+ }
+
+ return "err";
+}
+
+Color EditorProfiler::_get_color_from_signature(const StringName &p_signature) const {
+ Color bc = get_theme_color("error_color", "Editor");
+ double rot = ABS(double(p_signature.hash()) / double(0x7FFFFFFF));
+ Color c;
+ c.set_hsv(rot, bc.get_s(), bc.get_v());
+ return c.lerp(get_theme_color("base_color", "Editor"), 0.07);
+}
+
+void EditorProfiler::_item_edited() {
+ if (updating_frame) {
+ return;
+ }
+
+ TreeItem *item = variables->get_edited();
+ if (!item) {
+ return;
+ }
+ StringName signature = item->get_metadata(0);
+ bool checked = item->is_checked(0);
+
+ if (checked) {
+ plot_sigs.insert(signature);
+ } else {
+ plot_sigs.erase(signature);
+ }
+
+ if (!frame_delay->is_processing()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+
+ _update_plot();
+}
+
+void EditorProfiler::_update_plot() {
+ const int w = graph->get_size().width;
+ const int h = graph->get_size().height;
+ bool reset_texture = false;
+ const int desired_len = w * h * 4;
+
+ if (graph_image.size() != desired_len) {
+ reset_texture = true;
+ graph_image.resize(desired_len);
+ }
+
+ uint8_t *wr = graph_image.ptrw();
+ const Color background_color = get_theme_color("dark_color_2", "Editor");
+
+ // Clear the previous frame and set the background color.
+ for (int i = 0; i < desired_len; i += 4) {
+ wr[i + 0] = Math::fast_ftoi(background_color.r * 255);
+ wr[i + 1] = Math::fast_ftoi(background_color.g * 255);
+ wr[i + 2] = Math::fast_ftoi(background_color.b * 255);
+ wr[i + 3] = 255;
+ }
+
+ //find highest value
+
+ const bool use_self = display_time->get_selected() == DISPLAY_SELF_TIME;
+ float highest = 0;
+
+ for (int i = 0; i < frame_metrics.size(); i++) {
+ const Metric &m = frame_metrics[i];
+ if (!m.valid) {
+ continue;
+ }
+
+ for (Set<StringName>::Element *E = plot_sigs.front(); E; E = E->next()) {
+ const Map<StringName, Metric::Category *>::Element *F = m.category_ptrs.find(E->get());
+ if (F) {
+ highest = MAX(F->get()->total_time, highest);
+ }
+
+ const Map<StringName, Metric::Category::Item *>::Element *G = m.item_ptrs.find(E->get());
+ if (G) {
+ if (use_self) {
+ highest = MAX(G->get()->self, highest);
+ } else {
+ highest = MAX(G->get()->total, highest);
+ }
+ }
+ }
+ }
+
+ if (highest > 0) {
+ //means some data exists..
+ highest *= 1.2; //leave some upper room
+ graph_height = highest;
+
+ Vector<int> columnv;
+ columnv.resize(h * 4);
+
+ int *column = columnv.ptrw();
+
+ Map<StringName, int> plot_prev;
+ //Map<StringName,int> plot_max;
+
+ for (int i = 0; i < w; i++) {
+ for (int j = 0; j < h * 4; j++) {
+ column[j] = 0;
+ }
+
+ int current = i * frame_metrics.size() / w;
+ int next = (i + 1) * frame_metrics.size() / w;
+ if (next > frame_metrics.size()) {
+ next = frame_metrics.size();
+ }
+ if (next == current) {
+ next = current + 1; //just because for loop must work
+ }
+
+ for (Set<StringName>::Element *E = plot_sigs.front(); E; E = E->next()) {
+ int plot_pos = -1;
+
+ for (int j = current; j < next; j++) {
+ //wrap
+ int idx = last_metric + 1 + j;
+ while (idx >= frame_metrics.size()) {
+ idx -= frame_metrics.size();
+ }
+
+ //get
+ const Metric &m = frame_metrics[idx];
+ if (!m.valid) {
+ continue; //skip because invalid
+ }
+
+ float value = 0;
+
+ const Map<StringName, Metric::Category *>::Element *F = m.category_ptrs.find(E->get());
+ if (F) {
+ value = F->get()->total_time;
+ }
+
+ const Map<StringName, Metric::Category::Item *>::Element *G = m.item_ptrs.find(E->get());
+ if (G) {
+ if (use_self) {
+ value = G->get()->self;
+ } else {
+ value = G->get()->total;
+ }
+ }
+
+ plot_pos = MAX(CLAMP(int(value * h / highest), 0, h - 1), plot_pos);
+ }
+
+ int prev_plot = plot_pos;
+ Map<StringName, int>::Element *H = plot_prev.find(E->get());
+ if (H) {
+ prev_plot = H->get();
+ H->get() = plot_pos;
+ } else {
+ plot_prev[E->get()] = plot_pos;
+ }
+
+ if (plot_pos == -1 && prev_plot == -1) {
+ //don't bother drawing
+ continue;
+ }
+
+ if (prev_plot != -1 && plot_pos == -1) {
+ plot_pos = prev_plot;
+ }
+
+ if (prev_plot == -1 && plot_pos != -1) {
+ prev_plot = plot_pos;
+ }
+
+ plot_pos = h - plot_pos - 1;
+ prev_plot = h - prev_plot - 1;
+
+ if (prev_plot > plot_pos) {
+ SWAP(prev_plot, plot_pos);
+ }
+
+ Color col = _get_color_from_signature(E->get());
+
+ for (int j = prev_plot; j <= plot_pos; j++) {
+ column[j * 4 + 0] += Math::fast_ftoi(CLAMP(col.r * 255, 0, 255));
+ column[j * 4 + 1] += Math::fast_ftoi(CLAMP(col.g * 255, 0, 255));
+ column[j * 4 + 2] += Math::fast_ftoi(CLAMP(col.b * 255, 0, 255));
+ column[j * 4 + 3] += 1;
+ }
+ }
+
+ for (int j = 0; j < h * 4; j += 4) {
+ const int a = column[j + 3];
+ if (a > 0) {
+ column[j + 0] /= a;
+ column[j + 1] /= a;
+ column[j + 2] /= a;
+ }
+
+ const uint8_t red = uint8_t(column[j + 0]);
+ const uint8_t green = uint8_t(column[j + 1]);
+ const uint8_t blue = uint8_t(column[j + 2]);
+ const bool is_filled = red >= 1 || green >= 1 || blue >= 1;
+ const int widx = ((j >> 2) * w + i) * 4;
+
+ // If the pixel isn't filled by any profiler line, apply the background color instead.
+ wr[widx + 0] = is_filled ? red : Math::fast_ftoi(background_color.r * 255);
+ wr[widx + 1] = is_filled ? green : Math::fast_ftoi(background_color.g * 255);
+ wr[widx + 2] = is_filled ? blue : Math::fast_ftoi(background_color.b * 255);
+ wr[widx + 3] = 255;
+ }
+ }
+ }
+
+ Ref<Image> img;
+ img.instance();
+ img->create(w, h, false, Image::FORMAT_RGBA8, graph_image);
+
+ if (reset_texture) {
+ if (graph_texture.is_null()) {
+ graph_texture.instance();
+ }
+ graph_texture->create_from_image(img);
+ }
+
+ graph_texture->update(img, true);
+
+ graph->set_texture(graph_texture);
+ graph->update();
+}
+
+void EditorProfiler::_update_frame() {
+ int cursor_metric = _get_cursor_index();
+
+ ERR_FAIL_INDEX(cursor_metric, frame_metrics.size());
+
+ updating_frame = true;
+ variables->clear();
+
+ TreeItem *root = variables->create_item();
+ const Metric &m = frame_metrics[cursor_metric];
+
+ int dtime = display_time->get_selected();
+
+ for (int i = 0; i < m.categories.size(); i++) {
+ TreeItem *category = variables->create_item(root);
+ category->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
+ category->set_editable(0, true);
+ category->set_metadata(0, m.categories[i].signature);
+ category->set_text(0, String(m.categories[i].name));
+ category->set_text(1, _get_time_as_text(m, m.categories[i].total_time, 1));
+
+ if (plot_sigs.has(m.categories[i].signature)) {
+ category->set_checked(0, true);
+ category->set_custom_color(0, _get_color_from_signature(m.categories[i].signature));
+ }
+
+ for (int j = m.categories[i].items.size() - 1; j >= 0; j--) {
+ const Metric::Category::Item &it = m.categories[i].items[j];
+
+ TreeItem *item = variables->create_item(category);
+ item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
+ item->set_editable(0, true);
+ item->set_text(0, it.name);
+ item->set_metadata(0, it.signature);
+ item->set_metadata(1, it.script);
+ item->set_metadata(2, it.line);
+ item->set_text_align(2, TreeItem::ALIGN_RIGHT);
+ item->set_tooltip(0, it.script + ":" + itos(it.line));
+
+ float time = dtime == DISPLAY_SELF_TIME ? it.self : it.total;
+
+ item->set_text(1, _get_time_as_text(m, time, it.calls));
+
+ item->set_text(2, itos(it.calls));
+
+ if (plot_sigs.has(it.signature)) {
+ item->set_checked(0, true);
+ item->set_custom_color(0, _get_color_from_signature(it.signature));
+ }
+ }
+ }
+
+ updating_frame = false;
+}
+
+void EditorProfiler::_activate_pressed() {
+ if (activate->is_pressed()) {
+ activate->set_icon(get_theme_icon("Stop", "EditorIcons"));
+ activate->set_text(TTR("Stop"));
+ } else {
+ activate->set_icon(get_theme_icon("Play", "EditorIcons"));
+ activate->set_text(TTR("Start"));
+ }
+ emit_signal("enable_profiling", activate->is_pressed());
+}
+
+void EditorProfiler::_clear_pressed() {
+ clear();
+ _update_plot();
+}
+
+void EditorProfiler::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ activate->set_icon(get_theme_icon("Play", "EditorIcons"));
+ clear_button->set_icon(get_theme_icon("Clear", "EditorIcons"));
+ }
+}
+
+void EditorProfiler::_graph_tex_draw() {
+ if (last_metric < 0) {
+ return;
+ }
+ if (seeking) {
+ int max_frames = frame_metrics.size();
+ int frame = cursor_metric_edit->get_value() - (frame_metrics[last_metric].frame_number - max_frames + 1);
+ if (frame < 0) {
+ frame = 0;
+ }
+
+ int cur_x = frame * graph->get_size().x / max_frames;
+
+ graph->draw_line(Vector2(cur_x, 0), Vector2(cur_x, graph->get_size().y), Color(1, 1, 1, 0.8));
+ }
+
+ if (hover_metric != -1 && frame_metrics[hover_metric].valid) {
+ int max_frames = frame_metrics.size();
+ int frame = frame_metrics[hover_metric].frame_number - (frame_metrics[last_metric].frame_number - max_frames + 1);
+ if (frame < 0) {
+ frame = 0;
+ }
+
+ int cur_x = frame * graph->get_size().x / max_frames;
+
+ graph->draw_line(Vector2(cur_x, 0), Vector2(cur_x, graph->get_size().y), Color(1, 1, 1, 0.4));
+ }
+}
+
+void EditorProfiler::_graph_tex_mouse_exit() {
+ hover_metric = -1;
+ graph->update();
+}
+
+void EditorProfiler::_cursor_metric_changed(double) {
+ if (updating_frame) {
+ return;
+ }
+
+ graph->update();
+ _update_frame();
+}
+
+void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) {
+ if (last_metric < 0) {
+ return;
+ }
+
+ Ref<InputEventMouse> me = p_ev;
+ Ref<InputEventMouseButton> mb = p_ev;
+ Ref<InputEventMouseMotion> mm = p_ev;
+
+ if (
+ (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) ||
+ (mm.is_valid())) {
+ int x = me->get_position().x;
+ x = x * frame_metrics.size() / graph->get_size().width;
+
+ bool show_hover = x >= 0 && x < frame_metrics.size();
+
+ if (x < 0) {
+ x = 0;
+ }
+
+ if (x >= frame_metrics.size()) {
+ x = frame_metrics.size() - 1;
+ }
+
+ int metric = frame_metrics.size() - x - 1;
+ metric = last_metric - metric;
+ while (metric < 0) {
+ metric += frame_metrics.size();
+ }
+
+ if (show_hover) {
+ hover_metric = metric;
+
+ } else {
+ hover_metric = -1;
+ }
+
+ if (mb.is_valid() || mm->get_button_mask() & BUTTON_MASK_LEFT) {
+ //cursor_metric=x;
+ updating_frame = true;
+
+ //metric may be invalid, so look for closest metric that is valid, this makes snap feel better
+ bool valid = false;
+ for (int i = 0; i < frame_metrics.size(); i++) {
+ if (frame_metrics[metric].valid) {
+ valid = true;
+ break;
+ }
+
+ metric++;
+ if (metric >= frame_metrics.size()) {
+ metric = 0;
+ }
+ }
+
+ if (valid) {
+ cursor_metric_edit->set_value(frame_metrics[metric].frame_number);
+ }
+
+ updating_frame = false;
+
+ if (activate->is_pressed()) {
+ if (!seeking) {
+ emit_signal("break_request");
+ }
+ }
+
+ seeking = true;
+
+ if (!frame_delay->is_processing()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+ }
+
+ graph->update();
+ }
+}
+
+int EditorProfiler::_get_cursor_index() const {
+ if (last_metric < 0) {
+ return 0;
+ }
+ if (!frame_metrics[last_metric].valid) {
+ return 0;
+ }
+
+ int diff = (frame_metrics[last_metric].frame_number - cursor_metric_edit->get_value());
+
+ int idx = last_metric - diff;
+ while (idx < 0) {
+ idx += frame_metrics.size();
+ }
+
+ return idx;
+}
+
+void EditorProfiler::disable_seeking() {
+ seeking = false;
+ graph->update();
+}
+
+void EditorProfiler::_combo_changed(int) {
+ _update_frame();
+ _update_plot();
+}
+
+void EditorProfiler::_bind_methods() {
+ ADD_SIGNAL(MethodInfo("enable_profiling", PropertyInfo(Variant::BOOL, "enable")));
+ ADD_SIGNAL(MethodInfo("break_request"));
+}
+
+void EditorProfiler::set_enabled(bool p_enable) {
+ activate->set_disabled(!p_enable);
+}
+
+bool EditorProfiler::is_profiling() {
+ return activate->is_pressed();
+}
+
+Vector<Vector<String>> EditorProfiler::get_data_as_csv() const {
+ Vector<Vector<String>> res;
+
+ if (frame_metrics.empty()) {
+ return res;
+ }
+
+ // signatures
+ Vector<String> signatures;
+ const Vector<EditorProfiler::Metric::Category> &categories = frame_metrics[0].categories;
+
+ for (int j = 0; j < categories.size(); j++) {
+ const EditorProfiler::Metric::Category &c = categories[j];
+ signatures.push_back(c.signature);
+
+ for (int k = 0; k < c.items.size(); k++) {
+ signatures.push_back(c.items[k].signature);
+ }
+ }
+ res.push_back(signatures);
+
+ // values
+ Vector<String> values;
+ values.resize(signatures.size());
+
+ int index = last_metric;
+
+ for (int i = 0; i < frame_metrics.size(); i++) {
+ ++index;
+
+ if (index >= frame_metrics.size()) {
+ index = 0;
+ }
+
+ if (!frame_metrics[index].valid) {
+ continue;
+ }
+ int it = 0;
+ const Vector<EditorProfiler::Metric::Category> &frame_cat = frame_metrics[index].categories;
+
+ for (int j = 0; j < frame_cat.size(); j++) {
+ const EditorProfiler::Metric::Category &c = frame_cat[j];
+ values.write[it++] = String::num_real(c.total_time);
+
+ for (int k = 0; k < c.items.size(); k++) {
+ values.write[it++] = String::num_real(c.items[k].total);
+ }
+ }
+ res.push_back(values);
+ }
+
+ return res;
+}
+
+EditorProfiler::EditorProfiler() {
+ HBoxContainer *hb = memnew(HBoxContainer);
+ add_child(hb);
+ activate = memnew(Button);
+ activate->set_toggle_mode(true);
+ activate->set_text(TTR("Start"));
+ activate->connect("pressed", callable_mp(this, &EditorProfiler::_activate_pressed));
+ hb->add_child(activate);
+
+ clear_button = memnew(Button);
+ clear_button->set_text(TTR("Clear"));
+ clear_button->connect("pressed", callable_mp(this, &EditorProfiler::_clear_pressed));
+ hb->add_child(clear_button);
+
+ hb->add_child(memnew(Label(TTR("Measure:"))));
+
+ display_mode = memnew(OptionButton);
+ display_mode->add_item(TTR("Frame Time (sec)"));
+ display_mode->add_item(TTR("Average Time (sec)"));
+ display_mode->add_item(TTR("Frame %"));
+ display_mode->add_item(TTR("Physics Frame %"));
+ display_mode->connect("item_selected", callable_mp(this, &EditorProfiler::_combo_changed));
+
+ hb->add_child(display_mode);
+
+ hb->add_child(memnew(Label(TTR("Time:"))));
+
+ display_time = memnew(OptionButton);
+ display_time->add_item(TTR("Inclusive"));
+ display_time->add_item(TTR("Self"));
+ display_time->connect("item_selected", callable_mp(this, &EditorProfiler::_combo_changed));
+
+ hb->add_child(display_time);
+
+ hb->add_spacer();
+
+ hb->add_child(memnew(Label(TTR("Frame #:"))));
+
+ cursor_metric_edit = memnew(SpinBox);
+ cursor_metric_edit->set_h_size_flags(SIZE_FILL);
+ hb->add_child(cursor_metric_edit);
+ cursor_metric_edit->connect("value_changed", callable_mp(this, &EditorProfiler::_cursor_metric_changed));
+
+ hb->add_theme_constant_override("separation", 8 * EDSCALE);
+
+ h_split = memnew(HSplitContainer);
+ add_child(h_split);
+ h_split->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ variables = memnew(Tree);
+ variables->set_custom_minimum_size(Size2(320, 0) * EDSCALE);
+ variables->set_hide_folding(true);
+ h_split->add_child(variables);
+ variables->set_hide_root(true);
+ variables->set_columns(3);
+ variables->set_column_titles_visible(true);
+ variables->set_column_title(0, TTR("Name"));
+ variables->set_column_expand(0, true);
+ variables->set_column_min_width(0, 60 * EDSCALE);
+ variables->set_column_title(1, TTR("Time"));
+ variables->set_column_expand(1, false);
+ variables->set_column_min_width(1, 100 * EDSCALE);
+ variables->set_column_title(2, TTR("Calls"));
+ variables->set_column_expand(2, false);
+ variables->set_column_min_width(2, 60 * EDSCALE);
+ variables->connect("item_edited", callable_mp(this, &EditorProfiler::_item_edited));
+
+ graph = memnew(TextureRect);
+ graph->set_expand(true);
+ graph->set_mouse_filter(MOUSE_FILTER_STOP);
+ graph->connect("draw", callable_mp(this, &EditorProfiler::_graph_tex_draw));
+ graph->connect("gui_input", callable_mp(this, &EditorProfiler::_graph_tex_input));
+ graph->connect("mouse_exited", callable_mp(this, &EditorProfiler::_graph_tex_mouse_exit));
+
+ h_split->add_child(graph);
+ graph->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ int metric_size = CLAMP(int(EDITOR_DEF("debugger/profiler_frame_history_size", 600)), 60, 1024);
+ frame_metrics.resize(metric_size);
+ last_metric = -1;
+ hover_metric = -1;
+
+ EDITOR_DEF("debugger/profiler_frame_max_functions", 64);
+
+ frame_delay = memnew(Timer);
+ frame_delay->set_wait_time(0.1);
+ frame_delay->set_one_shot(true);
+ add_child(frame_delay);
+ frame_delay->connect("timeout", callable_mp(this, &EditorProfiler::_update_frame));
+
+ plot_delay = memnew(Timer);
+ plot_delay->set_wait_time(0.1);
+ plot_delay->set_one_shot(true);
+ add_child(plot_delay);
+ plot_delay->connect("timeout", callable_mp(this, &EditorProfiler::_update_plot));
+
+ plot_sigs.insert("physics_frame_time");
+ plot_sigs.insert("category_frame_time");
+
+ seeking = false;
+ graph_height = 1;
+}
diff --git a/editor/debugger/editor_profiler.h b/editor/debugger/editor_profiler.h
new file mode 100644
index 0000000000..aa2ef58db4
--- /dev/null
+++ b/editor/debugger/editor_profiler.h
@@ -0,0 +1,173 @@
+/*************************************************************************/
+/* editor_profiler.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITORPROFILER_H
+#define EDITORPROFILER_H
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
+#include "scene/gui/label.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/spin_box.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/tree.h"
+
+class EditorProfiler : public VBoxContainer {
+ GDCLASS(EditorProfiler, VBoxContainer);
+
+public:
+ struct Metric {
+ bool valid;
+
+ int frame_number;
+ float frame_time;
+ float idle_time;
+ float physics_time;
+ float physics_frame_time;
+
+ struct Category {
+ StringName signature;
+ String name;
+ float total_time; //total for category
+
+ struct Item {
+ StringName signature;
+ String name;
+ String script;
+ int line;
+ float self;
+ float total;
+ int calls;
+ };
+
+ Vector<Item> items;
+ };
+
+ Vector<Category> categories;
+
+ Map<StringName, Category *> category_ptrs;
+ Map<StringName, Category::Item *> item_ptrs;
+
+ Metric() {
+ valid = false;
+ frame_number = 0;
+ }
+ };
+
+ enum DisplayMode {
+ DISPLAY_FRAME_TIME,
+ DISPLAY_AVERAGE_TIME,
+ DISPLAY_FRAME_PERCENT,
+ DISPLAY_PHYSICS_FRAME_PERCENT,
+ };
+
+ enum DisplayTime {
+ DISPLAY_TOTAL_TIME,
+ DISPLAY_SELF_TIME,
+ };
+
+private:
+ Button *activate;
+ Button *clear_button;
+ TextureRect *graph;
+ Ref<ImageTexture> graph_texture;
+ Vector<uint8_t> graph_image;
+ Tree *variables;
+ HSplitContainer *h_split;
+
+ Set<StringName> plot_sigs;
+
+ OptionButton *display_mode;
+ OptionButton *display_time;
+
+ SpinBox *cursor_metric_edit;
+
+ Vector<Metric> frame_metrics;
+ int last_metric;
+
+ int max_functions;
+
+ bool updating_frame;
+
+ //int cursor_metric;
+ int hover_metric;
+
+ float graph_height;
+
+ bool seeking;
+
+ Timer *frame_delay;
+ Timer *plot_delay;
+
+ void _update_frame();
+
+ void _activate_pressed();
+ void _clear_pressed();
+
+ String _get_time_as_text(const Metric &m, float p_time, int p_calls);
+
+ void _make_metric_ptrs(Metric &m);
+ void _item_edited();
+
+ void _update_plot();
+
+ void _graph_tex_mouse_exit();
+
+ void _graph_tex_draw();
+ void _graph_tex_input(const Ref<InputEvent> &p_ev);
+
+ int _get_cursor_index() const;
+
+ Color _get_color_from_signature(const StringName &p_signature) const;
+
+ void _cursor_metric_changed(double);
+
+ void _combo_changed(int);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void add_frame_metric(const Metric &p_metric, bool p_final = false);
+ void set_enabled(bool p_enable);
+ bool is_profiling();
+ bool is_seeking() { return seeking; }
+ void disable_seeking();
+
+ void clear();
+
+ Vector<Vector<String>> get_data_as_csv() const;
+
+ EditorProfiler();
+};
+
+#endif // EDITORPROFILER_H
diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp
new file mode 100644
index 0000000000..81b42da08e
--- /dev/null
+++ b/editor/debugger/editor_visual_profiler.cpp
@@ -0,0 +1,822 @@
+/*************************************************************************/
+/* editor_visual_profiler.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_visual_profiler.h"
+
+#include "core/os/os.h"
+#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
+
+void EditorVisualProfiler::add_frame_metric(const Metric &p_metric) {
+ ++last_metric;
+ if (last_metric >= frame_metrics.size()) {
+ last_metric = 0;
+ }
+
+ frame_metrics.write[last_metric] = p_metric;
+ // _make_metric_ptrs(frame_metrics.write[last_metric]);
+
+ List<String> stack;
+ for (int i = 0; i < frame_metrics[last_metric].areas.size(); i++) {
+ String name = frame_metrics[last_metric].areas[i].name;
+ frame_metrics.write[last_metric].areas.write[i].color_cache = _get_color_from_signature(name);
+ String full_name;
+
+ if (name[0] == '<') {
+ stack.pop_back();
+ }
+
+ if (stack.size()) {
+ full_name = stack.back()->get() + name;
+ } else {
+ full_name = name;
+ }
+
+ if (name[0] == '>') {
+ stack.push_back(full_name + "/");
+ }
+
+ frame_metrics.write[last_metric].areas.write[i].fullpath_cache = full_name;
+ }
+
+ updating_frame = true;
+ cursor_metric_edit->set_max(frame_metrics[last_metric].frame_number);
+ cursor_metric_edit->set_min(MAX(frame_metrics[last_metric].frame_number - frame_metrics.size(), 0));
+
+ if (!seeking) {
+ cursor_metric_edit->set_value(frame_metrics[last_metric].frame_number);
+ if (hover_metric != -1) {
+ hover_metric++;
+ if (hover_metric >= frame_metrics.size()) {
+ hover_metric = 0;
+ }
+ }
+ }
+ updating_frame = false;
+
+ if (frame_delay->is_stopped()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+
+ if (plot_delay->is_stopped()) {
+ plot_delay->set_wait_time(0.1);
+ plot_delay->start();
+ }
+}
+
+void EditorVisualProfiler::clear() {
+ int metric_size = EditorSettings::get_singleton()->get("debugger/profiler_frame_history_size");
+ metric_size = CLAMP(metric_size, 60, 1024);
+ frame_metrics.clear();
+ frame_metrics.resize(metric_size);
+ last_metric = -1;
+ variables->clear();
+ //activate->set_pressed(false);
+
+ updating_frame = true;
+ cursor_metric_edit->set_min(0);
+ cursor_metric_edit->set_max(0);
+ cursor_metric_edit->set_value(0);
+ updating_frame = false;
+ hover_metric = -1;
+ seeking = false;
+}
+
+String EditorVisualProfiler::_get_time_as_text(float p_time) {
+ int dmode = display_mode->get_selected();
+
+ if (dmode == DISPLAY_FRAME_TIME) {
+ return rtos(p_time) + "ms";
+ } else if (dmode == DISPLAY_FRAME_PERCENT) {
+ return String::num(p_time * 100 / graph_limit, 2) + "%";
+ }
+
+ return "err";
+}
+
+Color EditorVisualProfiler::_get_color_from_signature(const StringName &p_signature) const {
+ Color bc = get_theme_color("error_color", "Editor");
+ double rot = ABS(double(p_signature.hash()) / double(0x7FFFFFFF));
+ Color c;
+ c.set_hsv(rot, bc.get_s(), bc.get_v());
+ return c.lerp(get_theme_color("base_color", "Editor"), 0.07);
+}
+
+void EditorVisualProfiler::_item_selected() {
+ if (updating_frame) {
+ return;
+ }
+
+ TreeItem *item = variables->get_selected();
+ if (!item) {
+ return;
+ }
+ selected_area = item->get_metadata(0);
+ _update_plot();
+}
+
+void EditorVisualProfiler::_update_plot() {
+ int w = graph->get_size().width;
+ int h = graph->get_size().height;
+
+ bool reset_texture = false;
+
+ int desired_len = w * h * 4;
+
+ if (graph_image.size() != desired_len) {
+ reset_texture = true;
+ graph_image.resize(desired_len);
+ }
+
+ uint8_t *wr = graph_image.ptrw();
+
+ //clear
+ for (int i = 0; i < desired_len; i += 4) {
+ wr[i + 0] = 0;
+ wr[i + 1] = 0;
+ wr[i + 2] = 0;
+ wr[i + 3] = 255;
+ }
+
+ //find highest value
+
+ float highest_cpu = 0;
+ float highest_gpu = 0;
+
+ for (int i = 0; i < frame_metrics.size(); i++) {
+ const Metric &m = frame_metrics[i];
+ if (!m.valid) {
+ continue;
+ }
+
+ if (m.areas.size()) {
+ highest_cpu = MAX(highest_cpu, m.areas[m.areas.size() - 1].cpu_time);
+ highest_gpu = MAX(highest_gpu, m.areas[m.areas.size() - 1].gpu_time);
+ }
+ }
+
+ if (highest_cpu > 0 || highest_gpu > 0) {
+ if (frame_relative->is_pressed()) {
+ highest_cpu = MAX(graph_limit, highest_cpu);
+ highest_gpu = MAX(graph_limit, highest_gpu);
+ }
+
+ if (linked->is_pressed()) {
+ float highest = MAX(highest_cpu, highest_gpu);
+ highest_cpu = highest_gpu = highest;
+ }
+
+ //means some data exists..
+ highest_cpu *= 1.2; //leave some upper room
+ highest_gpu *= 1.2; //leave some upper room
+ graph_height_cpu = highest_cpu;
+ graph_height_gpu = highest_gpu;
+
+ Vector<Color> columnv_cpu;
+ columnv_cpu.resize(h);
+ Color *column_cpu = columnv_cpu.ptrw();
+
+ Vector<Color> columnv_gpu;
+ columnv_gpu.resize(h);
+ Color *column_gpu = columnv_gpu.ptrw();
+
+ int half_w = w / 2;
+ for (int i = 0; i < half_w; i++) {
+ for (int j = 0; j < h; j++) {
+ column_cpu[j] = Color(0, 0, 0, 0);
+ column_gpu[j] = Color(0, 0, 0, 0);
+ }
+
+ int current = i * frame_metrics.size() / half_w;
+ int next = (i + 1) * frame_metrics.size() / half_w;
+ if (next > frame_metrics.size()) {
+ next = frame_metrics.size();
+ }
+ if (next == current) {
+ next = current + 1; //just because for loop must work
+ }
+
+ for (int j = current; j < next; j++) {
+ //wrap
+ int idx = last_metric + 1 + j;
+ while (idx >= frame_metrics.size()) {
+ idx -= frame_metrics.size();
+ }
+
+ int area_count = frame_metrics[idx].areas.size();
+ const Metric::Area *areas = frame_metrics[idx].areas.ptr();
+ int prev_cpu = 0;
+ int prev_gpu = 0;
+ for (int k = 1; k < area_count; k++) {
+ int ofs_cpu = int(areas[k].cpu_time * h / highest_cpu);
+ ofs_cpu = CLAMP(ofs_cpu, 0, h - 1);
+ Color color = selected_area == areas[k - 1].fullpath_cache ? Color(1, 1, 1, 1) : areas[k - 1].color_cache;
+
+ for (int l = prev_cpu; l < ofs_cpu; l++) {
+ column_cpu[h - l - 1] += color;
+ }
+ prev_cpu = ofs_cpu;
+
+ int ofs_gpu = int(areas[k].gpu_time * h / highest_gpu);
+ ofs_gpu = CLAMP(ofs_gpu, 0, h - 1);
+ for (int l = prev_gpu; l < ofs_gpu; l++) {
+ column_gpu[h - l - 1] += color;
+ }
+
+ prev_gpu = ofs_gpu;
+ }
+ }
+
+ //plot CPU
+ for (int j = 0; j < h; j++) {
+ uint8_t r, g, b;
+
+ if (column_cpu[j].a == 0) {
+ r = 0;
+ g = 0;
+ b = 0;
+ } else {
+ r = CLAMP((column_cpu[j].r / column_cpu[j].a) * 255.0, 0, 255);
+ g = CLAMP((column_cpu[j].g / column_cpu[j].a) * 255.0, 0, 255);
+ b = CLAMP((column_cpu[j].b / column_cpu[j].a) * 255.0, 0, 255);
+ }
+
+ int widx = (j * w + i) * 4;
+ wr[widx + 0] = r;
+ wr[widx + 1] = g;
+ wr[widx + 2] = b;
+ wr[widx + 3] = 255;
+ }
+ //plot GPU
+ for (int j = 0; j < h; j++) {
+ uint8_t r, g, b;
+
+ if (column_gpu[j].a == 0) {
+ r = 0;
+ g = 0;
+ b = 0;
+ } else {
+ r = CLAMP((column_gpu[j].r / column_gpu[j].a) * 255.0, 0, 255);
+ g = CLAMP((column_gpu[j].g / column_gpu[j].a) * 255.0, 0, 255);
+ b = CLAMP((column_gpu[j].b / column_gpu[j].a) * 255.0, 0, 255);
+ }
+
+ int widx = (j * w + w / 2 + i) * 4;
+ wr[widx + 0] = r;
+ wr[widx + 1] = g;
+ wr[widx + 2] = b;
+ wr[widx + 3] = 255;
+ }
+ }
+ }
+
+ Ref<Image> img;
+ img.instance();
+ img->create(w, h, false, Image::FORMAT_RGBA8, graph_image);
+
+ if (reset_texture) {
+ if (graph_texture.is_null()) {
+ graph_texture.instance();
+ }
+ graph_texture->create_from_image(img);
+ }
+
+ graph_texture->update(img, true);
+
+ graph->set_texture(graph_texture);
+ graph->update();
+}
+
+void EditorVisualProfiler::_update_frame(bool p_focus_selected) {
+ int cursor_metric = _get_cursor_index();
+
+ Ref<Texture> track_icon = get_theme_icon("TrackColor", "EditorIcons");
+
+ ERR_FAIL_INDEX(cursor_metric, frame_metrics.size());
+
+ updating_frame = true;
+ variables->clear();
+
+ TreeItem *root = variables->create_item();
+ const Metric &m = frame_metrics[cursor_metric];
+
+ List<TreeItem *> stack;
+ List<TreeItem *> categories;
+
+ TreeItem *ensure_selected = nullptr;
+
+ for (int i = 1; i < m.areas.size() - 1; i++) {
+ TreeItem *parent = stack.size() ? stack.back()->get() : root;
+
+ String name = m.areas[i].name;
+
+ float cpu_time = m.areas[i].cpu_time;
+ float gpu_time = m.areas[i].gpu_time;
+ if (i < m.areas.size() - 1) {
+ cpu_time = m.areas[i + 1].cpu_time - cpu_time;
+ gpu_time = m.areas[i + 1].gpu_time - gpu_time;
+ }
+
+ if (name.begins_with(">")) {
+ TreeItem *category = variables->create_item(parent);
+
+ stack.push_back(category);
+ categories.push_back(category);
+
+ name = name.substr(1, name.length());
+
+ category->set_text(0, name);
+ category->set_metadata(1, cpu_time);
+ category->set_metadata(2, gpu_time);
+ continue;
+ }
+
+ if (name.begins_with("<")) {
+ stack.pop_back();
+ continue;
+ }
+ TreeItem *category = variables->create_item(parent);
+
+ for (List<TreeItem *>::Element *E = stack.front(); E; E = E->next()) {
+ float total_cpu = E->get()->get_metadata(1);
+ float total_gpu = E->get()->get_metadata(2);
+ total_cpu += cpu_time;
+ total_gpu += gpu_time;
+ E->get()->set_metadata(1, cpu_time);
+ E->get()->set_metadata(2, gpu_time);
+ }
+
+ category->set_icon(0, track_icon);
+ category->set_icon_modulate(0, m.areas[i].color_cache);
+ category->set_selectable(0, true);
+ category->set_metadata(0, m.areas[i].fullpath_cache);
+ category->set_text(0, m.areas[i].name);
+ category->set_text(1, _get_time_as_text(cpu_time));
+ category->set_metadata(1, m.areas[i].cpu_time);
+ category->set_text(2, _get_time_as_text(gpu_time));
+ category->set_metadata(2, m.areas[i].gpu_time);
+
+ if (selected_area == m.areas[i].fullpath_cache) {
+ category->select(0);
+ if (p_focus_selected) {
+ ensure_selected = category;
+ }
+ }
+ }
+
+ for (List<TreeItem *>::Element *E = categories.front(); E; E = E->next()) {
+ float total_cpu = E->get()->get_metadata(1);
+ float total_gpu = E->get()->get_metadata(2);
+ E->get()->set_text(1, _get_time_as_text(total_cpu));
+ E->get()->set_text(2, _get_time_as_text(total_gpu));
+ }
+
+ if (ensure_selected) {
+ variables->ensure_cursor_is_visible();
+ }
+ updating_frame = false;
+}
+
+void EditorVisualProfiler::_activate_pressed() {
+ if (activate->is_pressed()) {
+ activate->set_icon(get_theme_icon("Stop", "EditorIcons"));
+ activate->set_text(TTR("Stop"));
+ _clear_pressed(); //always clear on start
+ } else {
+ activate->set_icon(get_theme_icon("Play", "EditorIcons"));
+ activate->set_text(TTR("Start"));
+ }
+ emit_signal("enable_profiling", activate->is_pressed());
+}
+
+void EditorVisualProfiler::_clear_pressed() {
+ clear();
+ _update_plot();
+}
+
+void EditorVisualProfiler::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ activate->set_icon(get_theme_icon("Play", "EditorIcons"));
+ clear_button->set_icon(get_theme_icon("Clear", "EditorIcons"));
+ }
+}
+
+void EditorVisualProfiler::_graph_tex_draw() {
+ if (last_metric < 0) {
+ return;
+ }
+ Ref<Font> font = get_theme_font("font", "Label");
+ if (seeking) {
+ int max_frames = frame_metrics.size();
+ int frame = cursor_metric_edit->get_value() - (frame_metrics[last_metric].frame_number - max_frames + 1);
+ if (frame < 0) {
+ frame = 0;
+ }
+
+ int half_width = graph->get_size().x / 2;
+ int cur_x = frame * half_width / max_frames;
+ //cur_x /= 2.0;
+
+ graph->draw_line(Vector2(cur_x, 0), Vector2(cur_x, graph->get_size().y), Color(1, 1, 1, 0.8));
+ graph->draw_line(Vector2(cur_x + half_width, 0), Vector2(cur_x + half_width, graph->get_size().y), Color(1, 1, 1, 0.8));
+ }
+
+ if (graph_height_cpu > 0) {
+ int frame_y = graph->get_size().y - graph_limit * graph->get_size().y / graph_height_cpu - 1;
+
+ int half_width = graph->get_size().x / 2;
+
+ graph->draw_line(Vector2(0, frame_y), Vector2(half_width, frame_y), Color(1, 1, 1, 0.3));
+
+ String limit_str = String::num(graph_limit, 2);
+ graph->draw_string(font, Vector2(half_width - font->get_string_size(limit_str).x - 2, frame_y - 2), limit_str, Color(1, 1, 1, 0.6));
+ }
+
+ if (graph_height_gpu > 0) {
+ int frame_y = graph->get_size().y - graph_limit * graph->get_size().y / graph_height_gpu - 1;
+
+ int half_width = graph->get_size().x / 2;
+
+ graph->draw_line(Vector2(half_width, frame_y), Vector2(graph->get_size().x, frame_y), Color(1, 1, 1, 0.3));
+
+ String limit_str = String::num(graph_limit, 2);
+ graph->draw_string(font, Vector2(half_width * 2 - font->get_string_size(limit_str).x - 2, frame_y - 2), limit_str, Color(1, 1, 1, 0.6));
+ }
+
+ graph->draw_string(font, Vector2(font->get_string_size("X").x, font->get_ascent() + 2), "CPU:", Color(1, 1, 1, 0.8));
+ graph->draw_string(font, Vector2(font->get_string_size("X").x + graph->get_size().width / 2, font->get_ascent() + 2), "GPU:", Color(1, 1, 1, 0.8));
+
+ /*
+ if (hover_metric != -1 && frame_metrics[hover_metric].valid) {
+
+ int max_frames = frame_metrics.size();
+ int frame = frame_metrics[hover_metric].frame_number - (frame_metrics[last_metric].frame_number - max_frames + 1);
+ if (frame < 0)
+ frame = 0;
+
+ int cur_x = frame * graph->get_size().x / max_frames;
+
+ graph->draw_line(Vector2(cur_x, 0), Vector2(cur_x, graph->get_size().y), Color(1, 1, 1, 0.4));
+ }
+*/
+}
+
+void EditorVisualProfiler::_graph_tex_mouse_exit() {
+ hover_metric = -1;
+ graph->update();
+}
+
+void EditorVisualProfiler::_cursor_metric_changed(double) {
+ if (updating_frame) {
+ return;
+ }
+
+ graph->update();
+ _update_frame();
+}
+
+void EditorVisualProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) {
+ if (last_metric < 0) {
+ return;
+ }
+
+ Ref<InputEventMouse> me = p_ev;
+ Ref<InputEventMouseButton> mb = p_ev;
+ Ref<InputEventMouseMotion> mm = p_ev;
+
+ if (
+ (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) ||
+ (mm.is_valid())) {
+ int half_w = graph->get_size().width / 2;
+ int x = me->get_position().x;
+ if (x > half_w) {
+ x -= half_w;
+ }
+ x = x * frame_metrics.size() / half_w;
+
+ bool show_hover = x >= 0 && x < frame_metrics.size();
+
+ if (x < 0) {
+ x = 0;
+ }
+
+ if (x >= frame_metrics.size()) {
+ x = frame_metrics.size() - 1;
+ }
+
+ int metric = frame_metrics.size() - x - 1;
+ metric = last_metric - metric;
+ while (metric < 0) {
+ metric += frame_metrics.size();
+ }
+
+ if (show_hover) {
+ hover_metric = metric;
+
+ } else {
+ hover_metric = -1;
+ }
+
+ if (mb.is_valid() || mm->get_button_mask() & BUTTON_MASK_LEFT) {
+ //cursor_metric=x;
+ updating_frame = true;
+
+ //metric may be invalid, so look for closest metric that is valid, this makes snap feel better
+ bool valid = false;
+ for (int i = 0; i < frame_metrics.size(); i++) {
+ if (frame_metrics[metric].valid) {
+ valid = true;
+ break;
+ }
+
+ metric++;
+ if (metric >= frame_metrics.size()) {
+ metric = 0;
+ }
+ }
+
+ if (!valid) {
+ return;
+ }
+
+ cursor_metric_edit->set_value(frame_metrics[metric].frame_number);
+
+ updating_frame = false;
+
+ if (activate->is_pressed()) {
+ if (!seeking) {
+ // Break request is not required, just stop profiling
+ }
+ }
+
+ seeking = true;
+
+ if (!frame_delay->is_processing()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+
+ bool touched_cpu = me->get_position().x < graph->get_size().width * 0.5;
+
+ const Metric::Area *areas = frame_metrics[metric].areas.ptr();
+ int area_count = frame_metrics[metric].areas.size();
+ float posy = (1.0 - (me->get_position().y / graph->get_size().height)) * (touched_cpu ? graph_height_cpu : graph_height_gpu);
+ int last_valid = -1;
+ bool found = false;
+ for (int i = 0; i < area_count - 1; i++) {
+ if (areas[i].name[0] != '<' && areas[i].name[0] != '>') {
+ last_valid = i;
+ }
+ float h = touched_cpu ? areas[i + 1].cpu_time : areas[i + 1].gpu_time;
+
+ if (h > posy) {
+ found = true;
+ break;
+ }
+ }
+
+ StringName area_found;
+ if (found && last_valid != -1) {
+ area_found = areas[last_valid].fullpath_cache;
+ }
+
+ if (area_found != selected_area) {
+ selected_area = area_found;
+ _update_frame(true);
+ _update_plot();
+ }
+ }
+
+ graph->update();
+ }
+}
+
+int EditorVisualProfiler::_get_cursor_index() const {
+ if (last_metric < 0) {
+ return 0;
+ }
+ if (!frame_metrics[last_metric].valid) {
+ return 0;
+ }
+
+ int diff = (frame_metrics[last_metric].frame_number - cursor_metric_edit->get_value());
+
+ int idx = last_metric - diff;
+ while (idx < 0) {
+ idx += frame_metrics.size();
+ }
+
+ return idx;
+}
+
+void EditorVisualProfiler::disable_seeking() {
+ seeking = false;
+ graph->update();
+}
+
+void EditorVisualProfiler::_combo_changed(int) {
+ _update_frame();
+ _update_plot();
+}
+
+void EditorVisualProfiler::_bind_methods() {
+ ADD_SIGNAL(MethodInfo("enable_profiling", PropertyInfo(Variant::BOOL, "enable")));
+}
+
+void EditorVisualProfiler::set_enabled(bool p_enable) {
+ activate->set_disabled(!p_enable);
+}
+
+bool EditorVisualProfiler::is_profiling() {
+ return activate->is_pressed();
+}
+
+Vector<Vector<String>> EditorVisualProfiler::get_data_as_csv() const {
+ Vector<Vector<String>> res;
+#if 0
+ if (frame_metrics.empty()) {
+ return res;
+ }
+
+ // signatures
+ Vector<String> signatures;
+ const Vector<EditorFrameProfiler::Metric::Category> &categories = frame_metrics[0].categories;
+
+ for (int j = 0; j < categories.size(); j++) {
+
+ const EditorFrameProfiler::Metric::Category &c = categories[j];
+ signatures.push_back(c.signature);
+
+ for (int k = 0; k < c.items.size(); k++) {
+ signatures.push_back(c.items[k].signature);
+ }
+ }
+ res.push_back(signatures);
+
+ // values
+ Vector<String> values;
+ values.resize(signatures.size());
+
+ int index = last_metric;
+
+ for (int i = 0; i < frame_metrics.size(); i++) {
+
+ ++index;
+
+ if (index >= frame_metrics.size()) {
+ index = 0;
+ }
+
+ if (!frame_metrics[index].valid) {
+ continue;
+ }
+ int it = 0;
+ const Vector<EditorFrameProfiler::Metric::Category> &frame_cat = frame_metrics[index].categories;
+
+ for (int j = 0; j < frame_cat.size(); j++) {
+
+ const EditorFrameProfiler::Metric::Category &c = frame_cat[j];
+ values.write[it++] = String::num_real(c.total_time);
+
+ for (int k = 0; k < c.items.size(); k++) {
+ values.write[it++] = String::num_real(c.items[k].total);
+ }
+ }
+ res.push_back(values);
+ }
+#endif
+ return res;
+}
+
+EditorVisualProfiler::EditorVisualProfiler() {
+ HBoxContainer *hb = memnew(HBoxContainer);
+ add_child(hb);
+ activate = memnew(Button);
+ activate->set_toggle_mode(true);
+ activate->set_text(TTR("Start"));
+ activate->connect("pressed", callable_mp(this, &EditorVisualProfiler::_activate_pressed));
+ hb->add_child(activate);
+
+ clear_button = memnew(Button);
+ clear_button->set_text(TTR("Clear"));
+ clear_button->connect("pressed", callable_mp(this, &EditorVisualProfiler::_clear_pressed));
+ hb->add_child(clear_button);
+
+ hb->add_child(memnew(Label(TTR("Measure:"))));
+
+ display_mode = memnew(OptionButton);
+ display_mode->add_item(TTR("Frame Time (msec)"));
+ display_mode->add_item(TTR("Frame %"));
+ display_mode->connect("item_selected", callable_mp(this, &EditorVisualProfiler::_combo_changed));
+
+ hb->add_child(display_mode);
+
+ frame_relative = memnew(CheckBox(TTR("Fit to Frame")));
+ frame_relative->set_pressed(true);
+ hb->add_child(frame_relative);
+ frame_relative->connect("pressed", callable_mp(this, &EditorVisualProfiler::_update_plot));
+ linked = memnew(CheckBox(TTR("Linked")));
+ linked->set_pressed(true);
+ hb->add_child(linked);
+ linked->connect("pressed", callable_mp(this, &EditorVisualProfiler::_update_plot));
+
+ hb->add_spacer();
+
+ hb->add_child(memnew(Label(TTR("Frame #:"))));
+
+ cursor_metric_edit = memnew(SpinBox);
+ cursor_metric_edit->set_h_size_flags(SIZE_FILL);
+ hb->add_child(cursor_metric_edit);
+ cursor_metric_edit->connect("value_changed", callable_mp(this, &EditorVisualProfiler::_cursor_metric_changed));
+
+ hb->add_theme_constant_override("separation", 8 * EDSCALE);
+
+ h_split = memnew(HSplitContainer);
+ add_child(h_split);
+ h_split->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ variables = memnew(Tree);
+ variables->set_custom_minimum_size(Size2(300, 0) * EDSCALE);
+ variables->set_hide_folding(true);
+ h_split->add_child(variables);
+ variables->set_hide_root(true);
+ variables->set_columns(3);
+ variables->set_column_titles_visible(true);
+ variables->set_column_title(0, TTR("Name"));
+ variables->set_column_expand(0, true);
+ variables->set_column_min_width(0, 60);
+ variables->set_column_title(1, TTR("CPU"));
+ variables->set_column_expand(1, false);
+ variables->set_column_min_width(1, 60 * EDSCALE);
+ variables->set_column_title(2, TTR("GPU"));
+ variables->set_column_expand(2, false);
+ variables->set_column_min_width(2, 60 * EDSCALE);
+ variables->connect("cell_selected", callable_mp(this, &EditorVisualProfiler::_item_selected));
+
+ graph = memnew(TextureRect);
+ graph->set_expand(true);
+ graph->set_mouse_filter(MOUSE_FILTER_STOP);
+ //graph->set_ignore_mouse(false);
+ graph->connect("draw", callable_mp(this, &EditorVisualProfiler::_graph_tex_draw));
+ graph->connect("gui_input", callable_mp(this, &EditorVisualProfiler::_graph_tex_input));
+ graph->connect("mouse_exited", callable_mp(this, &EditorVisualProfiler::_graph_tex_mouse_exit));
+
+ h_split->add_child(graph);
+ graph->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ int metric_size = CLAMP(int(EDITOR_DEF("debugger/profiler_frame_history_size", 600)), 60, 1024);
+ frame_metrics.resize(metric_size);
+ last_metric = -1;
+ //cursor_metric=-1;
+ hover_metric = -1;
+
+ //display_mode=DISPLAY_FRAME_TIME;
+
+ frame_delay = memnew(Timer);
+ frame_delay->set_wait_time(0.1);
+ frame_delay->set_one_shot(true);
+ add_child(frame_delay);
+ frame_delay->connect("timeout", callable_mp(this, &EditorVisualProfiler::_update_frame), make_binds(false));
+
+ plot_delay = memnew(Timer);
+ plot_delay->set_wait_time(0.1);
+ plot_delay->set_one_shot(true);
+ add_child(plot_delay);
+ plot_delay->connect("timeout", callable_mp(this, &EditorVisualProfiler::_update_plot));
+
+ seeking = false;
+ graph_height_cpu = 1;
+ graph_height_gpu = 1;
+
+ graph_limit = 1000 / 60.0;
+
+ //activate->set_disabled(true);
+}
diff --git a/editor/debugger/editor_visual_profiler.h b/editor/debugger/editor_visual_profiler.h
new file mode 100644
index 0000000000..3c1a55dc38
--- /dev/null
+++ b/editor/debugger/editor_visual_profiler.h
@@ -0,0 +1,152 @@
+/*************************************************************************/
+/* editor_visual_profiler.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_FRAME_PROFILER_H
+#define EDITOR_FRAME_PROFILER_H
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
+#include "scene/gui/check_box.h"
+#include "scene/gui/label.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/spin_box.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/tree.h"
+
+class EditorVisualProfiler : public VBoxContainer {
+ GDCLASS(EditorVisualProfiler, VBoxContainer);
+
+public:
+ struct Metric {
+ bool valid;
+
+ uint64_t frame_number;
+
+ struct Area {
+ String name;
+ Color color_cache;
+ StringName fullpath_cache;
+ float cpu_time = 0;
+ float gpu_time = 0;
+ };
+
+ Vector<Area> areas;
+
+ Metric() {
+ valid = false;
+ }
+ };
+
+ enum DisplayTimeMode {
+ DISPLAY_FRAME_TIME,
+ DISPLAY_FRAME_PERCENT,
+ };
+
+private:
+ Button *activate;
+ Button *clear_button;
+
+ TextureRect *graph;
+ Ref<ImageTexture> graph_texture;
+ Vector<uint8_t> graph_image;
+ Tree *variables;
+ HSplitContainer *h_split;
+ CheckBox *frame_relative;
+ CheckBox *linked;
+
+ OptionButton *display_mode;
+
+ SpinBox *cursor_metric_edit;
+
+ Vector<Metric> frame_metrics;
+ int last_metric;
+
+ StringName selected_area;
+
+ bool updating_frame;
+
+ //int cursor_metric;
+ int hover_metric;
+
+ float graph_height_cpu;
+ float graph_height_gpu;
+
+ float graph_limit;
+
+ bool seeking;
+
+ Timer *frame_delay;
+ Timer *plot_delay;
+
+ void _update_frame(bool p_focus_selected = false);
+
+ void _activate_pressed();
+ void _clear_pressed();
+
+ String _get_time_as_text(float p_time);
+
+ //void _make_metric_ptrs(Metric &m);
+ void _item_selected();
+
+ void _update_plot();
+
+ void _graph_tex_mouse_exit();
+
+ void _graph_tex_draw();
+ void _graph_tex_input(const Ref<InputEvent> &p_ev);
+
+ int _get_cursor_index() const;
+
+ Color _get_color_from_signature(const StringName &p_signature) const;
+
+ void _cursor_metric_changed(double);
+
+ void _combo_changed(int);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void add_frame_metric(const Metric &p_metric);
+ void set_enabled(bool p_enable);
+ bool is_profiling();
+ bool is_seeking() { return seeking; }
+ void disable_seeking();
+
+ void clear();
+
+ Vector<Vector<String>> get_data_as_csv() const;
+
+ EditorVisualProfiler();
+};
+
+#endif // EDITOR_FRAME_PROFILER_H
diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp
new file mode 100644
index 0000000000..1fca95b6da
--- /dev/null
+++ b/editor/debugger/script_editor_debugger.cpp
@@ -0,0 +1,1762 @@
+/*************************************************************************/
+/* script_editor_debugger.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "script_editor_debugger.h"
+
+#include "core/debugger/debugger_marshalls.h"
+#include "core/debugger/remote_debugger.h"
+#include "core/io/marshalls.h"
+#include "core/project_settings.h"
+#include "core/ustring.h"
+#include "editor/debugger/editor_network_profiler.h"
+#include "editor/debugger/editor_performance_profiler.h"
+#include "editor/debugger/editor_profiler.h"
+#include "editor/debugger/editor_visual_profiler.h"
+#include "editor/editor_log.h"
+#include "editor/editor_node.h"
+#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
+#include "editor/plugins/canvas_item_editor_plugin.h"
+#include "editor/plugins/editor_debugger_plugin.h"
+#include "editor/plugins/node_3d_editor_plugin.h"
+#include "editor/property_editor.h"
+#include "main/performance.h"
+#include "scene/3d/camera_3d.h"
+#include "scene/debugger/scene_debugger.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/label.h"
+#include "scene/gui/line_edit.h"
+#include "scene/gui/margin_container.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/gui/separator.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/texture_button.h"
+#include "scene/gui/tree.h"
+#include "scene/resources/packed_scene.h"
+#include "servers/display_server.h"
+
+using CameraOverride = EditorDebuggerNode::CameraOverride;
+
+void ScriptEditorDebugger::_put_msg(String p_message, Array p_data) {
+ if (is_session_active()) {
+ Array msg;
+ msg.push_back(p_message);
+ msg.push_back(p_data);
+ peer->put_message(msg);
+ }
+}
+
+void ScriptEditorDebugger::debug_copy() {
+ String msg = reason->get_text();
+ if (msg == "") {
+ return;
+ }
+ DisplayServer::get_singleton()->clipboard_set(msg);
+}
+
+void ScriptEditorDebugger::debug_skip_breakpoints() {
+ skip_breakpoints_value = !skip_breakpoints_value;
+ if (skip_breakpoints_value) {
+ skip_breakpoints->set_icon(get_theme_icon("DebugSkipBreakpointsOn", "EditorIcons"));
+ } else {
+ skip_breakpoints->set_icon(get_theme_icon("DebugSkipBreakpointsOff", "EditorIcons"));
+ }
+
+ Array msg;
+ msg.push_back(skip_breakpoints_value);
+ _put_msg("set_skip_breakpoints", msg);
+}
+
+void ScriptEditorDebugger::debug_next() {
+ ERR_FAIL_COND(!breaked);
+
+ _put_msg("next", Array());
+ _clear_execution();
+}
+
+void ScriptEditorDebugger::debug_step() {
+ ERR_FAIL_COND(!breaked);
+
+ _put_msg("step", Array());
+ _clear_execution();
+}
+
+void ScriptEditorDebugger::debug_break() {
+ ERR_FAIL_COND(breaked);
+
+ _put_msg("break", Array());
+}
+
+void ScriptEditorDebugger::debug_continue() {
+ ERR_FAIL_COND(!breaked);
+
+ // Allow focus stealing only if we actually run this client for security.
+ if (remote_pid && EditorNode::get_singleton()->has_child_process(remote_pid)) {
+ DisplayServer::get_singleton()->enable_for_stealing_focus(remote_pid);
+ }
+
+ _clear_execution();
+ _put_msg("continue", Array());
+}
+
+void ScriptEditorDebugger::update_tabs() {
+ if (error_count == 0 && warning_count == 0) {
+ errors_tab->set_name(TTR("Errors"));
+ tabs->set_tab_icon(errors_tab->get_index(), Ref<Texture2D>());
+ } else {
+ errors_tab->set_name(TTR("Errors") + " (" + itos(error_count + warning_count) + ")");
+ if (error_count >= 1 && warning_count >= 1) {
+ tabs->set_tab_icon(errors_tab->get_index(), get_theme_icon("ErrorWarning", "EditorIcons"));
+ } else if (error_count >= 1) {
+ tabs->set_tab_icon(errors_tab->get_index(), get_theme_icon("Error", "EditorIcons"));
+ } else {
+ tabs->set_tab_icon(errors_tab->get_index(), get_theme_icon("Warning", "EditorIcons"));
+ }
+ }
+}
+
+void ScriptEditorDebugger::clear_style() {
+ tabs->add_theme_style_override("panel", nullptr);
+}
+
+void ScriptEditorDebugger::save_node(ObjectID p_id, const String &p_file) {
+ Array msg;
+ msg.push_back(p_id);
+ msg.push_back(p_file);
+ _put_msg("scene:save_node", msg);
+}
+
+void ScriptEditorDebugger::_file_selected(const String &p_file) {
+ switch (file_dialog_purpose) {
+ case SAVE_MONITORS_CSV: {
+ Error err;
+ FileAccessRef file = FileAccess::open(p_file, FileAccess::WRITE, &err);
+
+ if (err != OK) {
+ ERR_PRINT("Failed to open " + p_file);
+ return;
+ }
+ Vector<String> line;
+ line.resize(Performance::MONITOR_MAX);
+
+ // signatures
+ for (int i = 0; i < Performance::MONITOR_MAX; i++) {
+ line.write[i] = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i));
+ }
+ file->store_csv_line(line);
+
+ // values
+ Vector<List<float>::Element *> iterators;
+ iterators.resize(Performance::MONITOR_MAX);
+ bool continue_iteration = false;
+ for (int i = 0; i < Performance::MONITOR_MAX; i++) {
+ iterators.write[i] = performance_profiler->get_monitor_data(Performance::get_singleton()->get_monitor_name(Performance::Monitor(i)))->back();
+ continue_iteration = continue_iteration || iterators[i];
+ }
+ while (continue_iteration) {
+ continue_iteration = false;
+ for (int i = 0; i < Performance::MONITOR_MAX; i++) {
+ if (iterators[i]) {
+ line.write[i] = String::num_real(iterators[i]->get());
+ iterators.write[i] = iterators[i]->prev();
+ } else {
+ line.write[i] = "";
+ }
+ continue_iteration = continue_iteration || iterators[i];
+ }
+ file->store_csv_line(line);
+ }
+ file->store_string("\n");
+
+ Vector<Vector<String>> profiler_data = profiler->get_data_as_csv();
+ for (int i = 0; i < profiler_data.size(); i++) {
+ file->store_csv_line(profiler_data[i]);
+ }
+ } break;
+ case SAVE_VRAM_CSV: {
+ Error err;
+ FileAccessRef file = FileAccess::open(p_file, FileAccess::WRITE, &err);
+
+ if (err != OK) {
+ ERR_PRINT("Failed to open " + p_file);
+ return;
+ }
+
+ Vector<String> headers;
+ headers.resize(vmem_tree->get_columns());
+ for (int i = 0; i < vmem_tree->get_columns(); ++i) {
+ headers.write[i] = vmem_tree->get_column_title(i);
+ }
+ file->store_csv_line(headers);
+
+ if (vmem_tree->get_root()) {
+ TreeItem *ti = vmem_tree->get_root()->get_children();
+ while (ti) {
+ Vector<String> values;
+ values.resize(vmem_tree->get_columns());
+ for (int i = 0; i < vmem_tree->get_columns(); ++i) {
+ values.write[i] = ti->get_text(i);
+ }
+ file->store_csv_line(values);
+
+ ti = ti->get_next();
+ }
+ }
+ } break;
+ }
+}
+
+void ScriptEditorDebugger::request_remote_tree() {
+ _put_msg("scene:request_scene_tree", Array());
+}
+
+const SceneDebuggerTree *ScriptEditorDebugger::get_remote_tree() {
+ return scene_tree;
+}
+
+void ScriptEditorDebugger::update_remote_object(ObjectID p_obj_id, const String &p_prop, const Variant &p_value) {
+ Array msg;
+ msg.push_back(p_obj_id);
+ msg.push_back(p_prop);
+ msg.push_back(p_value);
+ _put_msg("scene:set_object_property", msg);
+}
+
+void ScriptEditorDebugger::request_remote_object(ObjectID p_obj_id) {
+ ERR_FAIL_COND(p_obj_id.is_null());
+ Array msg;
+ msg.push_back(p_obj_id);
+ _put_msg("scene:inspect_object", msg);
+}
+
+Object *ScriptEditorDebugger::get_remote_object(ObjectID p_id) {
+ return inspector->get_object(p_id);
+}
+
+void ScriptEditorDebugger::_remote_object_selected(ObjectID p_id) {
+ emit_signal("remote_object_requested", p_id);
+}
+
+void ScriptEditorDebugger::_remote_object_edited(ObjectID p_id, const String &p_prop, const Variant &p_value) {
+ update_remote_object(p_id, p_prop, p_value);
+ request_remote_object(p_id);
+}
+
+void ScriptEditorDebugger::_remote_object_property_updated(ObjectID p_id, const String &p_property) {
+ emit_signal("remote_object_property_updated", p_id, p_property);
+}
+
+void ScriptEditorDebugger::_video_mem_request() {
+ _put_msg("core:memory", Array());
+}
+
+void ScriptEditorDebugger::_video_mem_export() {
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+ file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ file_dialog->clear_filters();
+ file_dialog_purpose = SAVE_VRAM_CSV;
+ file_dialog->popup_file_dialog();
+}
+
+Size2 ScriptEditorDebugger::get_minimum_size() const {
+ Size2 ms = MarginContainer::get_minimum_size();
+ ms.y = MAX(ms.y, 250 * EDSCALE);
+ return ms;
+}
+
+void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_data) {
+ if (p_msg == "debug_enter") {
+ _put_msg("get_stack_dump", Array());
+
+ ERR_FAIL_COND(p_data.size() != 2);
+ bool can_continue = p_data[0];
+ String error = p_data[1];
+ breaked = true;
+ can_debug = can_continue;
+ _update_buttons_state();
+ _set_reason_text(error, MESSAGE_ERROR);
+ emit_signal("breaked", true, can_continue);
+ DisplayServer::get_singleton()->window_move_to_foreground();
+ if (error != "") {
+ tabs->set_current_tab(0);
+ }
+ profiler->set_enabled(false);
+ inspector->clear_cache(); // Take a chance to force remote objects update.
+
+ } else if (p_msg == "debug_exit") {
+ breaked = false;
+ can_debug = false;
+ _clear_execution();
+ _update_buttons_state();
+ _set_reason_text(TTR("Execution resumed."), MESSAGE_SUCCESS);
+ emit_signal("breaked", false, false);
+ profiler->set_enabled(true);
+ profiler->disable_seeking();
+ } else if (p_msg == "set_pid") {
+ ERR_FAIL_COND(p_data.size() < 1);
+ remote_pid = p_data[0];
+ } else if (p_msg == "scene:click_ctrl") {
+ ERR_FAIL_COND(p_data.size() < 2);
+ clicked_ctrl->set_text(p_data[0]);
+ clicked_ctrl_type->set_text(p_data[1]);
+ } else if (p_msg == "scene:scene_tree") {
+ scene_tree->nodes.clear();
+ scene_tree->deserialize(p_data);
+ emit_signal("remote_tree_updated");
+ _update_buttons_state();
+ } else if (p_msg == "scene:inspect_object") {
+ ObjectID id = inspector->add_object(p_data);
+ if (id.is_valid()) {
+ emit_signal("remote_object_updated", id);
+ }
+ } else if (p_msg == "memory:usage") {
+ vmem_tree->clear();
+ TreeItem *root = vmem_tree->create_item();
+ DebuggerMarshalls::ResourceUsage usage;
+ usage.deserialize(p_data);
+
+ int total = 0;
+
+ for (List<DebuggerMarshalls::ResourceInfo>::Element *E = usage.infos.front(); E; E = E->next()) {
+ TreeItem *it = vmem_tree->create_item(root);
+ String type = E->get().type;
+ int bytes = E->get().vram;
+ it->set_text(0, E->get().path);
+ it->set_text(1, type);
+ it->set_text(2, E->get().format);
+ it->set_text(3, String::humanize_size(bytes));
+ total += bytes;
+
+ if (has_theme_icon(type, "EditorIcons")) {
+ it->set_icon(0, get_theme_icon(type, "EditorIcons"));
+ }
+ }
+
+ vmem_total->set_tooltip(TTR("Bytes:") + " " + itos(total));
+ vmem_total->set_text(String::humanize_size(total));
+
+ } else if (p_msg == "stack_dump") {
+ DebuggerMarshalls::ScriptStackDump stack;
+ stack.deserialize(p_data);
+
+ stack_dump->clear();
+ inspector->clear_stack_variables();
+ TreeItem *r = stack_dump->create_item();
+
+ for (int i = 0; i < stack.frames.size(); i++) {
+ TreeItem *s = stack_dump->create_item(r);
+ Dictionary d;
+ d["frame"] = i;
+ d["file"] = stack.frames[i].file;
+ d["function"] = stack.frames[i].func;
+ d["line"] = stack.frames[i].line;
+ s->set_metadata(0, d);
+
+ String line = itos(i) + " - " + String(d["file"]) + ":" + itos(d["line"]) + " - at function: " + d["function"];
+ s->set_text(0, line);
+
+ if (i == 0) {
+ s->select(0);
+ }
+ }
+ } else if (p_msg == "stack_frame_vars") {
+ inspector->clear_stack_variables();
+
+ } else if (p_msg == "stack_frame_var") {
+ inspector->add_stack_variable(p_data);
+
+ } else if (p_msg == "output") {
+ ERR_FAIL_COND(p_data.size() != 2);
+
+ ERR_FAIL_COND(p_data[0].get_type() != Variant::PACKED_STRING_ARRAY);
+ Vector<String> output_strings = p_data[0];
+
+ ERR_FAIL_COND(p_data[1].get_type() != Variant::PACKED_INT32_ARRAY);
+ Vector<int> output_types = p_data[1];
+
+ ERR_FAIL_COND(output_strings.size() != output_types.size());
+
+ for (int i = 0; i < output_strings.size(); i++) {
+ RemoteDebugger::MessageType type = (RemoteDebugger::MessageType)(int)(output_types[i]);
+ EditorLog::MessageType msg_type;
+ switch (type) {
+ case RemoteDebugger::MESSAGE_TYPE_LOG: {
+ msg_type = EditorLog::MSG_TYPE_STD;
+ } break;
+ case RemoteDebugger::MESSAGE_TYPE_ERROR: {
+ msg_type = EditorLog::MSG_TYPE_ERROR;
+ } break;
+ default: {
+ WARN_PRINT("Unhandled script debugger message type: " + itos(type));
+ msg_type = EditorLog::MSG_TYPE_STD;
+ } break;
+ }
+ EditorNode::get_log()->add_message(output_strings[i], msg_type);
+ }
+ } else if (p_msg == "performance:profile_frame") {
+ Vector<float> frame_data;
+ frame_data.resize(p_data.size());
+ for (int i = 0; i < p_data.size(); i++) {
+ frame_data.write[i] = p_data[i];
+ }
+ performance_profiler->add_profile_frame(frame_data);
+
+ } else if (p_msg == "visual:profile_frame") {
+ DebuggerMarshalls::VisualProfilerFrame frame;
+ frame.deserialize(p_data);
+
+ EditorVisualProfiler::Metric metric;
+ metric.areas.resize(frame.areas.size());
+ metric.frame_number = frame.frame_number;
+ metric.valid = true;
+
+ {
+ EditorVisualProfiler::Metric::Area *areas_ptr = metric.areas.ptrw();
+ for (int i = 0; i < frame.areas.size(); i++) {
+ areas_ptr[i].name = frame.areas[i].name;
+ areas_ptr[i].cpu_time = frame.areas[i].cpu_msec;
+ areas_ptr[i].gpu_time = frame.areas[i].gpu_msec;
+ }
+ }
+ visual_profiler->add_frame_metric(metric);
+
+ } else if (p_msg == "error") {
+ DebuggerMarshalls::OutputError oe;
+ ERR_FAIL_COND_MSG(oe.deserialize(p_data) == false, "Failed to deserialize error message");
+
+ // Format time.
+ Array time_vals;
+ time_vals.push_back(oe.hr);
+ time_vals.push_back(oe.min);
+ time_vals.push_back(oe.sec);
+ time_vals.push_back(oe.msec);
+ bool e;
+ String time = String("%d:%02d:%02d:%04d").sprintf(time_vals, &e);
+
+ // Rest of the error data.
+ bool source_is_project_file = oe.source_file.begins_with("res://");
+
+ // Metadata to highlight error line in scripts.
+ Array source_meta;
+ source_meta.push_back(oe.source_file);
+ source_meta.push_back(oe.source_line);
+
+ // Create error tree to display above error or warning details.
+ TreeItem *r = error_tree->get_root();
+ if (!r) {
+ r = error_tree->create_item();
+ }
+
+ // Also provide the relevant details as tooltip to quickly check without
+ // uncollapsing the tree.
+ String tooltip = oe.warning ? TTR("Warning:") : TTR("Error:");
+
+ TreeItem *error = error_tree->create_item(r);
+ error->set_collapsed(true);
+
+ error->set_icon(0, get_theme_icon(oe.warning ? "Warning" : "Error", "EditorIcons"));
+ error->set_text(0, time);
+ error->set_text_align(0, TreeItem::ALIGN_LEFT);
+
+ String error_title;
+ // Include method name, when given, in error title.
+ if (!oe.source_func.empty()) {
+ error_title += oe.source_func + ": ";
+ }
+ // If we have a (custom) error message, use it as title, and add a C++ Error
+ // item with the original error condition.
+ error_title += oe.error_descr.empty() ? oe.error : oe.error_descr;
+ error->set_text(1, error_title);
+ tooltip += " " + error_title + "\n";
+
+ if (!oe.error_descr.empty()) {
+ // Add item for C++ error condition.
+ TreeItem *cpp_cond = error_tree->create_item(error);
+ cpp_cond->set_text(0, "<" + TTR("C++ Error") + ">");
+ cpp_cond->set_text(1, oe.error);
+ cpp_cond->set_text_align(0, TreeItem::ALIGN_LEFT);
+ tooltip += TTR("C++ Error:") + " " + oe.error + "\n";
+ if (source_is_project_file) {
+ cpp_cond->set_metadata(0, source_meta);
+ }
+ }
+ Vector<uint8_t> v;
+ v.resize(100);
+
+ // Source of the error.
+ String source_txt = (source_is_project_file ? oe.source_file.get_file() : oe.source_file) + ":" + itos(oe.source_line);
+ if (!oe.source_func.empty()) {
+ source_txt += " @ " + oe.source_func + "()";
+ }
+
+ TreeItem *cpp_source = error_tree->create_item(error);
+ cpp_source->set_text(0, "<" + (source_is_project_file ? TTR("Source") : TTR("C++ Source")) + ">");
+ cpp_source->set_text(1, source_txt);
+ cpp_source->set_text_align(0, TreeItem::ALIGN_LEFT);
+ tooltip += (source_is_project_file ? TTR("Source:") : TTR("C++ Source:")) + " " + source_txt + "\n";
+
+ // Set metadata to highlight error line in scripts.
+ if (source_is_project_file) {
+ error->set_metadata(0, source_meta);
+ cpp_source->set_metadata(0, source_meta);
+ }
+
+ error->set_tooltip(0, tooltip);
+ error->set_tooltip(1, tooltip);
+
+ // Format stack trace.
+ // stack_items_count is the number of elements to parse, with 3 items per frame
+ // of the stack trace (script, method, line).
+ const ScriptLanguage::StackInfo *infos = oe.callstack.ptr();
+ for (unsigned int i = 0; i < (unsigned int)oe.callstack.size(); i++) {
+ TreeItem *stack_trace = error_tree->create_item(error);
+
+ Array meta;
+ meta.push_back(infos[i].file);
+ meta.push_back(infos[i].line);
+ stack_trace->set_metadata(0, meta);
+
+ if (i == 0) {
+ stack_trace->set_text(0, "<" + TTR("Stack Trace") + ">");
+ stack_trace->set_text_align(0, TreeItem::ALIGN_LEFT);
+ error->set_metadata(0, meta);
+ }
+ stack_trace->set_text(1, infos[i].file.get_file() + ":" + itos(infos[i].line) + " @ " + infos[i].func + "()");
+ }
+
+ if (oe.warning) {
+ warning_count++;
+ } else {
+ error_count++;
+ }
+
+ } else if (p_msg == "servers:function_signature") {
+ // Cache a profiler signature.
+ DebuggerMarshalls::ScriptFunctionSignature sig;
+ sig.deserialize(p_data);
+ profiler_signature[sig.id] = sig.name;
+
+ } else if (p_msg == "servers:profile_frame" || p_msg == "servers:profile_total") {
+ EditorProfiler::Metric metric;
+ DebuggerMarshalls::ServersProfilerFrame frame;
+ frame.deserialize(p_data);
+ metric.valid = true;
+ metric.frame_number = frame.frame_number;
+ metric.frame_time = frame.frame_time;
+ metric.idle_time = frame.idle_time;
+ metric.physics_time = frame.physics_time;
+ metric.physics_frame_time = frame.physics_frame_time;
+
+ if (frame.servers.size()) {
+ EditorProfiler::Metric::Category frame_time;
+ frame_time.signature = "category_frame_time";
+ frame_time.name = "Frame Time";
+ frame_time.total_time = metric.frame_time;
+
+ EditorProfiler::Metric::Category::Item item;
+ item.calls = 1;
+ item.line = 0;
+
+ item.name = "Physics Time";
+ item.total = metric.physics_time;
+ item.self = item.total;
+ item.signature = "physics_time";
+
+ frame_time.items.push_back(item);
+
+ item.name = "Idle Time";
+ item.total = metric.idle_time;
+ item.self = item.total;
+ item.signature = "idle_time";
+
+ frame_time.items.push_back(item);
+
+ item.name = "Physics Frame Time";
+ item.total = metric.physics_frame_time;
+ item.self = item.total;
+ item.signature = "physics_frame_time";
+
+ frame_time.items.push_back(item);
+
+ metric.categories.push_back(frame_time);
+ }
+
+ for (int i = 0; i < frame.servers.size(); i++) {
+ const DebuggerMarshalls::ServerInfo &srv = frame.servers[i];
+ EditorProfiler::Metric::Category c;
+ const String name = srv.name;
+ c.name = name.capitalize();
+ c.items.resize(srv.functions.size());
+ c.total_time = 0;
+ c.signature = "categ::" + name;
+ for (int j = 0; j < srv.functions.size(); j++) {
+ EditorProfiler::Metric::Category::Item item;
+ item.calls = 1;
+ item.line = 0;
+ item.name = srv.functions[j].name;
+ item.self = srv.functions[j].time;
+ item.total = item.self;
+ item.signature = "categ::" + name + "::" + item.name;
+ item.name = item.name.capitalize();
+ c.total_time += item.total;
+ c.items.write[j] = item;
+ }
+ metric.categories.push_back(c);
+ }
+
+ EditorProfiler::Metric::Category funcs;
+ funcs.total_time = frame.script_time;
+ funcs.items.resize(frame.script_functions.size());
+ funcs.name = "Script Functions";
+ funcs.signature = "script_functions";
+ for (int i = 0; i < frame.script_functions.size(); i++) {
+ int signature = frame.script_functions[i].sig_id;
+ int calls = frame.script_functions[i].call_count;
+ float total = frame.script_functions[i].total_time;
+ float self = frame.script_functions[i].self_time;
+
+ EditorProfiler::Metric::Category::Item item;
+ if (profiler_signature.has(signature)) {
+ item.signature = profiler_signature[signature];
+
+ String name = profiler_signature[signature];
+ Vector<String> strings = name.split("::");
+ if (strings.size() == 3) {
+ item.name = strings[2];
+ item.script = strings[0];
+ item.line = strings[1].to_int();
+ } else if (strings.size() == 4) { //Built-in scripts have an :: in their name
+ item.name = strings[3];
+ item.script = strings[0] + "::" + strings[1];
+ item.line = strings[2].to_int();
+ }
+
+ } else {
+ item.name = "SigErr " + itos(signature);
+ }
+
+ item.calls = calls;
+ item.self = self;
+ item.total = total;
+ funcs.items.write[i] = item;
+ }
+
+ metric.categories.push_back(funcs);
+
+ if (p_msg == "servers:profile_frame") {
+ profiler->add_frame_metric(metric, false);
+ } else {
+ profiler->add_frame_metric(metric, true);
+ }
+
+ } else if (p_msg == "network:profile_frame") {
+ DebuggerMarshalls::NetworkProfilerFrame frame;
+ frame.deserialize(p_data);
+ for (int i = 0; i < frame.infos.size(); i++) {
+ network_profiler->add_node_frame_data(frame.infos[i]);
+ }
+
+ } else if (p_msg == "network:bandwidth") {
+ ERR_FAIL_COND(p_data.size() < 2);
+ network_profiler->set_bandwidth(p_data[0], p_data[1]);
+
+ } else if (p_msg == "request_quit") {
+ emit_signal("stop_requested");
+ _stop_and_notify();
+
+ } else if (p_msg == "performance:profile_names") {
+ Vector<StringName> monitors;
+ monitors.resize(p_data.size());
+ for (int i = 0; i < p_data.size(); i++) {
+ ERR_FAIL_COND(p_data[i].get_type() != Variant::STRING_NAME);
+ monitors.set(i, p_data[i]);
+ }
+ performance_profiler->update_monitors(monitors);
+
+ } else {
+ int colon_index = p_msg.find_char(':');
+ ERR_FAIL_COND_MSG(colon_index < 1, "Invalid message received");
+
+ bool parsed = false;
+ const String cap = p_msg.substr(0, colon_index);
+ Map<StringName, Callable>::Element *element = captures.find(cap);
+ if (element) {
+ Callable &c = element->value();
+ ERR_FAIL_COND_MSG(c.is_null(), "Invalid callable registered: " + cap);
+ Variant cmd = p_msg.substr(colon_index + 1), data = p_data;
+ const Variant *args[2] = { &cmd, &data };
+ Variant retval;
+ Callable::CallError err;
+ c.call(args, 2, retval, err);
+ ERR_FAIL_COND_MSG(err.error != Callable::CallError::CALL_OK, "Error calling 'capture' to callable: " + Variant::get_callable_error_text(c, args, 2, err));
+ ERR_FAIL_COND_MSG(retval.get_type() != Variant::BOOL, "Error calling 'capture' to callable: " + String(c) + ". Return type is not bool.");
+ parsed = retval;
+ }
+
+ if (!parsed) {
+ WARN_PRINT("unknown message " + p_msg);
+ }
+ }
+}
+
+void ScriptEditorDebugger::_set_reason_text(const String &p_reason, MessageType p_type) {
+ switch (p_type) {
+ case MESSAGE_ERROR:
+ reason->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
+ break;
+ case MESSAGE_WARNING:
+ reason->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor"));
+ break;
+ default:
+ reason->add_theme_color_override("font_color", get_theme_color("success_color", "Editor"));
+ }
+ reason->set_text(p_reason);
+ reason->set_tooltip(p_reason.word_wrap(80));
+}
+
+void ScriptEditorDebugger::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ skip_breakpoints->set_icon(get_theme_icon("DebugSkipBreakpointsOff", "EditorIcons"));
+ copy->set_icon(get_theme_icon("ActionCopy", "EditorIcons"));
+
+ step->set_icon(get_theme_icon("DebugStep", "EditorIcons"));
+ next->set_icon(get_theme_icon("DebugNext", "EditorIcons"));
+ dobreak->set_icon(get_theme_icon("Pause", "EditorIcons"));
+ docontinue->set_icon(get_theme_icon("DebugContinue", "EditorIcons"));
+ le_set->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_live_edit_set));
+ le_clear->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_live_edit_clear));
+ error_tree->connect("item_selected", callable_mp(this, &ScriptEditorDebugger::_error_selected));
+ error_tree->connect("item_activated", callable_mp(this, &ScriptEditorDebugger::_error_activated));
+ vmem_refresh->set_icon(get_theme_icon("Reload", "EditorIcons"));
+ vmem_export->set_icon(get_theme_icon("Save", "EditorIcons"));
+
+ reason->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
+
+ } break;
+ case NOTIFICATION_PROCESS: {
+ if (is_session_active()) {
+ peer->poll();
+
+ if (camera_override == CameraOverride::OVERRIDE_2D) {
+ CanvasItemEditor *editor = CanvasItemEditor::get_singleton();
+
+ Dictionary state = editor->get_state();
+ float zoom = state["zoom"];
+ Point2 offset = state["ofs"];
+ Transform2D transform;
+
+ transform.scale_basis(Size2(zoom, zoom));
+ transform.elements[2] = -offset * zoom;
+
+ Array msg;
+ msg.push_back(transform);
+ _put_msg("scene:override_camera_2D:transform", msg);
+
+ } else if (camera_override >= CameraOverride::OVERRIDE_3D_1) {
+ int viewport_idx = camera_override - CameraOverride::OVERRIDE_3D_1;
+ Node3DEditorViewport *viewport = Node3DEditor::get_singleton()->get_editor_viewport(viewport_idx);
+ Camera3D *const cam = viewport->get_camera();
+
+ Array msg;
+ msg.push_back(cam->get_camera_transform());
+ if (cam->get_projection() == Camera3D::PROJECTION_ORTHOGONAL) {
+ msg.push_back(false);
+ msg.push_back(cam->get_size());
+ } else {
+ msg.push_back(true);
+ msg.push_back(cam->get_fov());
+ }
+ msg.push_back(cam->get_znear());
+ msg.push_back(cam->get_zfar());
+ _put_msg("scene:override_camera_3D:transform", msg);
+ }
+ }
+
+ const uint64_t until = OS::get_singleton()->get_ticks_msec() + 20;
+
+ while (peer.is_valid() && peer->has_message()) {
+ Array arr = peer->get_message();
+ if (arr.size() != 2 || arr[0].get_type() != Variant::STRING || arr[1].get_type() != Variant::ARRAY) {
+ _stop_and_notify();
+ ERR_FAIL_MSG("Invalid message format received from peer");
+ }
+ _parse_message(arr[0], arr[1]);
+
+ if (OS::get_singleton()->get_ticks_msec() > until) {
+ break;
+ }
+ }
+ if (!is_session_active()) {
+ _stop_and_notify();
+ break;
+ };
+ } break;
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ if (tabs->has_theme_stylebox_override("panel")) {
+ tabs->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox("DebuggerPanel", "EditorStyles"));
+ }
+
+ copy->set_icon(get_theme_icon("ActionCopy", "EditorIcons"));
+ step->set_icon(get_theme_icon("DebugStep", "EditorIcons"));
+ next->set_icon(get_theme_icon("DebugNext", "EditorIcons"));
+ dobreak->set_icon(get_theme_icon("Pause", "EditorIcons"));
+ docontinue->set_icon(get_theme_icon("DebugContinue", "EditorIcons"));
+ vmem_refresh->set_icon(get_theme_icon("Reload", "EditorIcons"));
+ vmem_export->set_icon(get_theme_icon("Save", "EditorIcons"));
+ } break;
+ }
+}
+
+void ScriptEditorDebugger::_clear_execution() {
+ TreeItem *ti = stack_dump->get_selected();
+ if (!ti) {
+ return;
+ }
+
+ Dictionary d = ti->get_metadata(0);
+
+ stack_script = ResourceLoader::load(d["file"]);
+ emit_signal("clear_execution", stack_script);
+ stack_script.unref();
+ stack_dump->clear();
+ inspector->clear_stack_variables();
+}
+
+void ScriptEditorDebugger::start(Ref<RemoteDebuggerPeer> p_peer) {
+ error_count = 0;
+ warning_count = 0;
+ stop();
+
+ peer = p_peer;
+ ERR_FAIL_COND(p_peer.is_null());
+
+ performance_profiler->reset();
+
+ set_process(true);
+ breaked = false;
+ can_debug = true;
+ camera_override = CameraOverride::OVERRIDE_NONE;
+
+ tabs->set_current_tab(0);
+ _set_reason_text(TTR("Debug session started."), MESSAGE_SUCCESS);
+ _update_buttons_state();
+ emit_signal("started");
+}
+
+void ScriptEditorDebugger::_update_buttons_state() {
+ const bool active = is_session_active();
+ const bool has_editor_tree = active && editor_remote_tree && editor_remote_tree->get_selected();
+ vmem_refresh->set_disabled(!active);
+ step->set_disabled(!active || !breaked || !can_debug);
+ next->set_disabled(!active || !breaked || !can_debug);
+ copy->set_disabled(!active || !breaked);
+ docontinue->set_disabled(!active || !breaked);
+ dobreak->set_disabled(!active || breaked);
+ le_clear->set_disabled(!active);
+ le_set->set_disabled(!has_editor_tree);
+}
+
+void ScriptEditorDebugger::_stop_and_notify() {
+ stop();
+ emit_signal("stopped");
+ _set_reason_text(TTR("Debug session closed."), MESSAGE_WARNING);
+}
+
+void ScriptEditorDebugger::stop() {
+ set_process(false);
+ breaked = false;
+ can_debug = false;
+ remote_pid = 0;
+ _clear_execution();
+
+ inspector->clear_cache();
+
+ if (peer.is_valid()) {
+ peer->close();
+ peer.unref();
+ reason->set_text("");
+ reason->set_tooltip("");
+ }
+
+ node_path_cache.clear();
+ res_path_cache.clear();
+ profiler_signature.clear();
+
+ inspector->edit(nullptr);
+ _update_buttons_state();
+}
+
+void ScriptEditorDebugger::_profiler_activate(bool p_enable, int p_type) {
+ Array data;
+ data.push_back(p_enable);
+ switch (p_type) {
+ case PROFILER_NETWORK:
+ _put_msg("profiler:network", data);
+ break;
+ case PROFILER_VISUAL:
+ _put_msg("profiler:visual", data);
+ break;
+ case PROFILER_SCRIPTS_SERVERS:
+ if (p_enable) {
+ // Clear old script signatures. (should we move all this into the profiler?)
+ profiler_signature.clear();
+ // Add max funcs options to request.
+ Array opts;
+ int max_funcs = EditorSettings::get_singleton()->get("debugger/profiler_frame_max_functions");
+ opts.push_back(CLAMP(max_funcs, 16, 512));
+ data.push_back(opts);
+ }
+ _put_msg("profiler:servers", data);
+ break;
+ default:
+ ERR_FAIL_MSG("Invalid profiler type");
+ }
+}
+
+void ScriptEditorDebugger::_profiler_seeked() {
+ if (breaked) {
+ return;
+ }
+ debug_break();
+}
+
+void ScriptEditorDebugger::_stack_dump_frame_selected() {
+ emit_signal("stack_frame_selected");
+
+ int frame = get_stack_script_frame();
+
+ if (is_session_active() && frame >= 0) {
+ Array msg;
+ msg.push_back(frame);
+ _put_msg("get_stack_frame_vars", msg);
+ } else {
+ inspector->edit(nullptr);
+ }
+}
+
+void ScriptEditorDebugger::_export_csv() {
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+ file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ file_dialog_purpose = SAVE_MONITORS_CSV;
+ file_dialog->popup_file_dialog();
+}
+
+String ScriptEditorDebugger::get_var_value(const String &p_var) const {
+ if (!breaked) {
+ return String();
+ }
+ return inspector->get_stack_variable(p_var);
+}
+
+int ScriptEditorDebugger::_get_node_path_cache(const NodePath &p_path) {
+ const int *r = node_path_cache.getptr(p_path);
+ if (r) {
+ return *r;
+ }
+
+ last_path_id++;
+
+ node_path_cache[p_path] = last_path_id;
+ Array msg;
+ msg.push_back(p_path);
+ msg.push_back(last_path_id);
+ _put_msg("scene:live_node_path", msg);
+
+ return last_path_id;
+}
+
+int ScriptEditorDebugger::_get_res_path_cache(const String &p_path) {
+ Map<String, int>::Element *E = res_path_cache.find(p_path);
+
+ if (E) {
+ return E->get();
+ }
+
+ last_path_id++;
+
+ res_path_cache[p_path] = last_path_id;
+ Array msg;
+ msg.push_back(p_path);
+ msg.push_back(last_path_id);
+ _put_msg("scene:live_res_path", msg);
+
+ return last_path_id;
+}
+
+void ScriptEditorDebugger::_method_changed(Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE) {
+ if (!p_base || !live_debug || !is_session_active() || !editor->get_edited_scene()) {
+ return;
+ }
+
+ Node *node = Object::cast_to<Node>(p_base);
+
+ VARIANT_ARGPTRS
+
+ for (int i = 0; i < VARIANT_ARG_MAX; i++) {
+ //no pointers, sorry
+ if (argptr[i] && (argptr[i]->get_type() == Variant::OBJECT || argptr[i]->get_type() == Variant::_RID)) {
+ return;
+ }
+ }
+
+ if (node) {
+ NodePath path = editor->get_edited_scene()->get_path_to(node);
+ int pathid = _get_node_path_cache(path);
+
+ Array msg;
+ msg.push_back(pathid);
+ msg.push_back(p_name);
+ for (int i = 0; i < VARIANT_ARG_MAX; i++) {
+ //no pointers, sorry
+ msg.push_back(*argptr[i]);
+ }
+ _put_msg("scene:live_node_call", msg);
+
+ return;
+ }
+
+ Resource *res = Object::cast_to<Resource>(p_base);
+
+ if (res && res->get_path() != String()) {
+ String respath = res->get_path();
+ int pathid = _get_res_path_cache(respath);
+
+ Array msg;
+ msg.push_back(pathid);
+ msg.push_back(p_name);
+ for (int i = 0; i < VARIANT_ARG_MAX; i++) {
+ //no pointers, sorry
+ msg.push_back(*argptr[i]);
+ }
+ _put_msg("scene:live_res_call", msg);
+
+ return;
+ }
+}
+
+void ScriptEditorDebugger::_property_changed(Object *p_base, const StringName &p_property, const Variant &p_value) {
+ if (!p_base || !live_debug || !editor->get_edited_scene()) {
+ return;
+ }
+
+ Node *node = Object::cast_to<Node>(p_base);
+
+ if (node) {
+ NodePath path = editor->get_edited_scene()->get_path_to(node);
+ int pathid = _get_node_path_cache(path);
+
+ if (p_value.is_ref()) {
+ Ref<Resource> res = p_value;
+ if (res.is_valid() && res->get_path() != String()) {
+ Array msg;
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(res->get_path());
+ _put_msg("scene:live_node_prop_res", msg);
+ }
+ } else {
+ Array msg;
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(p_value);
+ _put_msg("scene:live_node_prop", msg);
+ }
+
+ return;
+ }
+
+ Resource *res = Object::cast_to<Resource>(p_base);
+
+ if (res && res->get_path() != String()) {
+ String respath = res->get_path();
+ int pathid = _get_res_path_cache(respath);
+
+ if (p_value.is_ref()) {
+ Ref<Resource> res2 = p_value;
+ if (res2.is_valid() && res2->get_path() != String()) {
+ Array msg;
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(res2->get_path());
+ _put_msg("scene:live_res_prop_res", msg);
+ }
+ } else {
+ Array msg;
+ msg.push_back(pathid);
+ msg.push_back(p_property);
+ msg.push_back(p_value);
+ _put_msg("scene:live_res_prop", msg);
+ }
+
+ return;
+ }
+}
+
+String ScriptEditorDebugger::get_stack_script_file() const {
+ TreeItem *ti = stack_dump->get_selected();
+ if (!ti) {
+ return "";
+ }
+ Dictionary d = ti->get_metadata(0);
+ return d["file"];
+}
+
+int ScriptEditorDebugger::get_stack_script_line() const {
+ TreeItem *ti = stack_dump->get_selected();
+ if (!ti) {
+ return -1;
+ }
+ Dictionary d = ti->get_metadata(0);
+ return d["line"];
+}
+
+int ScriptEditorDebugger::get_stack_script_frame() const {
+ TreeItem *ti = stack_dump->get_selected();
+ if (!ti) {
+ return -1;
+ }
+ Dictionary d = ti->get_metadata(0);
+ return d["frame"];
+}
+
+void ScriptEditorDebugger::set_live_debugging(bool p_enable) {
+ live_debug = p_enable;
+}
+
+void ScriptEditorDebugger::_live_edit_set() {
+ if (!is_session_active() || !editor_remote_tree) {
+ return;
+ }
+
+ TreeItem *ti = editor_remote_tree->get_selected();
+ if (!ti) {
+ return;
+ }
+
+ String path;
+
+ while (ti) {
+ String lp = ti->get_text(0);
+ path = "/" + lp + path;
+ ti = ti->get_parent();
+ }
+
+ NodePath np = path;
+
+ editor->get_editor_data().set_edited_scene_live_edit_root(np);
+
+ update_live_edit_root();
+}
+
+void ScriptEditorDebugger::_live_edit_clear() {
+ NodePath np = NodePath("/root");
+ editor->get_editor_data().set_edited_scene_live_edit_root(np);
+
+ update_live_edit_root();
+}
+
+void ScriptEditorDebugger::update_live_edit_root() {
+ NodePath np = editor->get_editor_data().get_edited_scene_live_edit_root();
+
+ Array msg;
+ msg.push_back(np);
+ if (editor->get_edited_scene()) {
+ msg.push_back(editor->get_edited_scene()->get_filename());
+ } else {
+ msg.push_back("");
+ }
+ _put_msg("scene:live_set_root", msg);
+ live_edit_root->set_text(np);
+}
+
+void ScriptEditorDebugger::live_debug_create_node(const NodePath &p_parent, const String &p_type, const String &p_name) {
+ if (live_debug) {
+ Array msg;
+ msg.push_back(p_parent);
+ msg.push_back(p_type);
+ msg.push_back(p_name);
+ _put_msg("scene:live_create_node", msg);
+ }
+}
+
+void ScriptEditorDebugger::live_debug_instance_node(const NodePath &p_parent, const String &p_path, const String &p_name) {
+ if (live_debug) {
+ Array msg;
+ msg.push_back(p_parent);
+ msg.push_back(p_path);
+ msg.push_back(p_name);
+ _put_msg("scene:live_instance_node", msg);
+ }
+}
+
+void ScriptEditorDebugger::live_debug_remove_node(const NodePath &p_at) {
+ if (live_debug) {
+ Array msg;
+ msg.push_back(p_at);
+ _put_msg("scene:live_remove_node", msg);
+ }
+}
+
+void ScriptEditorDebugger::live_debug_remove_and_keep_node(const NodePath &p_at, ObjectID p_keep_id) {
+ if (live_debug) {
+ Array msg;
+ msg.push_back(p_at);
+ msg.push_back(p_keep_id);
+ _put_msg("scene:live_remove_and_keep_node", msg);
+ }
+}
+
+void ScriptEditorDebugger::live_debug_restore_node(ObjectID p_id, const NodePath &p_at, int p_at_pos) {
+ if (live_debug) {
+ Array msg;
+ msg.push_back(p_id);
+ msg.push_back(p_at);
+ msg.push_back(p_at_pos);
+ _put_msg("scene:live_restore_node", msg);
+ }
+}
+
+void ScriptEditorDebugger::live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name) {
+ if (live_debug) {
+ Array msg;
+ msg.push_back(p_at);
+ msg.push_back(p_new_name);
+ _put_msg("scene:live_duplicate_node", msg);
+ }
+}
+
+void ScriptEditorDebugger::live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos) {
+ if (live_debug) {
+ Array msg;
+ msg.push_back(p_at);
+ msg.push_back(p_new_place);
+ msg.push_back(p_new_name);
+ msg.push_back(p_at_pos);
+ _put_msg("scene:live_reparent_node", msg);
+ }
+}
+
+CameraOverride ScriptEditorDebugger::get_camera_override() const {
+ return camera_override;
+}
+
+void ScriptEditorDebugger::set_camera_override(CameraOverride p_override) {
+ if (p_override == CameraOverride::OVERRIDE_2D && camera_override != CameraOverride::OVERRIDE_2D) {
+ Array msg;
+ msg.push_back(true);
+ _put_msg("scene:override_camera_2D:set", msg);
+ } else if (p_override != CameraOverride::OVERRIDE_2D && camera_override == CameraOverride::OVERRIDE_2D) {
+ Array msg;
+ msg.push_back(false);
+ _put_msg("scene:override_camera_2D:set", msg);
+ } else if (p_override >= CameraOverride::OVERRIDE_3D_1 && camera_override < CameraOverride::OVERRIDE_3D_1) {
+ Array msg;
+ msg.push_back(true);
+ _put_msg("scene:override_camera_3D:set", msg);
+ } else if (p_override < CameraOverride::OVERRIDE_3D_1 && camera_override >= CameraOverride::OVERRIDE_3D_1) {
+ Array msg;
+ msg.push_back(false);
+ _put_msg("scene:override_camera_3D:set", msg);
+ }
+
+ camera_override = p_override;
+}
+
+void ScriptEditorDebugger::set_breakpoint(const String &p_path, int p_line, bool p_enabled) {
+ Array msg;
+ msg.push_back(p_path);
+ msg.push_back(p_line);
+ msg.push_back(p_enabled);
+ _put_msg("breakpoint", msg);
+}
+
+void ScriptEditorDebugger::reload_scripts() {
+ _put_msg("reload_scripts", Array());
+}
+
+bool ScriptEditorDebugger::is_skip_breakpoints() {
+ return skip_breakpoints_value;
+}
+
+void ScriptEditorDebugger::_error_activated() {
+ TreeItem *selected = error_tree->get_selected();
+
+ TreeItem *ci = selected->get_children();
+ if (ci) {
+ selected->set_collapsed(!selected->is_collapsed());
+ }
+}
+
+void ScriptEditorDebugger::_error_selected() {
+ TreeItem *selected = error_tree->get_selected();
+ Array meta = selected->get_metadata(0);
+ if (meta.size() == 0) {
+ return;
+ }
+
+ emit_signal("error_selected", String(meta[0]), int(meta[1]));
+}
+
+void ScriptEditorDebugger::_expand_errors_list() {
+ TreeItem *root = error_tree->get_root();
+ if (!root) {
+ return;
+ }
+
+ TreeItem *item = root->get_children();
+ while (item) {
+ item->set_collapsed(false);
+ item = item->get_next();
+ }
+}
+
+void ScriptEditorDebugger::_collapse_errors_list() {
+ TreeItem *root = error_tree->get_root();
+ if (!root) {
+ return;
+ }
+
+ TreeItem *item = root->get_children();
+ while (item) {
+ item->set_collapsed(true);
+ item = item->get_next();
+ }
+}
+
+void ScriptEditorDebugger::_clear_errors_list() {
+ error_tree->clear();
+ error_count = 0;
+ warning_count = 0;
+}
+
+// Right click on specific file(s) or folder(s).
+void ScriptEditorDebugger::_error_tree_item_rmb_selected(const Vector2 &p_pos) {
+ item_menu->clear();
+ item_menu->set_size(Size2(1, 1));
+
+ if (error_tree->is_anything_selected()) {
+ item_menu->add_icon_item(get_theme_icon("ActionCopy", "EditorIcons"), TTR("Copy Error"), 0);
+ }
+
+ if (item_menu->get_item_count() > 0) {
+ item_menu->set_position(error_tree->get_global_position() + p_pos);
+ item_menu->popup();
+ }
+}
+
+void ScriptEditorDebugger::_item_menu_id_pressed(int p_option) {
+ TreeItem *ti = error_tree->get_selected();
+ while (ti->get_parent() != error_tree->get_root()) {
+ ti = ti->get_parent();
+ }
+
+ String type;
+
+ if (ti->get_icon(0) == get_theme_icon("Warning", "EditorIcons")) {
+ type = "W ";
+ } else if (ti->get_icon(0) == get_theme_icon("Error", "EditorIcons")) {
+ type = "E ";
+ }
+
+ String text = ti->get_text(0) + " ";
+ int rpad_len = text.length();
+
+ text = type + text + ti->get_text(1) + "\n";
+ TreeItem *ci = ti->get_children();
+ while (ci) {
+ text += " " + ci->get_text(0).rpad(rpad_len) + ci->get_text(1) + "\n";
+ ci = ci->get_next();
+ }
+
+ DisplayServer::get_singleton()->clipboard_set(text);
+}
+
+void ScriptEditorDebugger::_tab_changed(int p_tab) {
+ if (tabs->get_tab_title(p_tab) == TTR("Video RAM")) {
+ // "Video RAM" tab was clicked, refresh the data it's displaying when entering the tab.
+ _video_mem_request();
+ }
+}
+
+void ScriptEditorDebugger::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("live_debug_create_node"), &ScriptEditorDebugger::live_debug_create_node);
+ ClassDB::bind_method(D_METHOD("live_debug_instance_node"), &ScriptEditorDebugger::live_debug_instance_node);
+ ClassDB::bind_method(D_METHOD("live_debug_remove_node"), &ScriptEditorDebugger::live_debug_remove_node);
+ ClassDB::bind_method(D_METHOD("live_debug_remove_and_keep_node"), &ScriptEditorDebugger::live_debug_remove_and_keep_node);
+ ClassDB::bind_method(D_METHOD("live_debug_restore_node"), &ScriptEditorDebugger::live_debug_restore_node);
+ ClassDB::bind_method(D_METHOD("live_debug_duplicate_node"), &ScriptEditorDebugger::live_debug_duplicate_node);
+ ClassDB::bind_method(D_METHOD("live_debug_reparent_node"), &ScriptEditorDebugger::live_debug_reparent_node);
+ ClassDB::bind_method(D_METHOD("request_remote_object", "id"), &ScriptEditorDebugger::request_remote_object);
+ ClassDB::bind_method(D_METHOD("update_remote_object", "id", "property", "value"), &ScriptEditorDebugger::update_remote_object);
+
+ ADD_SIGNAL(MethodInfo("started"));
+ ADD_SIGNAL(MethodInfo("stopped"));
+ ADD_SIGNAL(MethodInfo("stop_requested"));
+ ADD_SIGNAL(MethodInfo("stack_frame_selected", PropertyInfo(Variant::INT, "frame")));
+ ADD_SIGNAL(MethodInfo("error_selected", PropertyInfo(Variant::INT, "error")));
+ ADD_SIGNAL(MethodInfo("set_execution", PropertyInfo("script"), PropertyInfo(Variant::INT, "line")));
+ ADD_SIGNAL(MethodInfo("clear_execution", PropertyInfo("script")));
+ ADD_SIGNAL(MethodInfo("breaked", PropertyInfo(Variant::BOOL, "reallydid"), PropertyInfo(Variant::BOOL, "can_debug")));
+ ADD_SIGNAL(MethodInfo("remote_object_requested", PropertyInfo(Variant::INT, "id")));
+ ADD_SIGNAL(MethodInfo("remote_object_updated", PropertyInfo(Variant::INT, "id")));
+ ADD_SIGNAL(MethodInfo("remote_object_property_updated", PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::STRING, "property")));
+ ADD_SIGNAL(MethodInfo("remote_tree_updated"));
+}
+
+void ScriptEditorDebugger::add_debugger_plugin(const Ref<Script> &p_script) {
+ if (!debugger_plugins.has(p_script)) {
+ EditorDebuggerPlugin *plugin = memnew(EditorDebuggerPlugin());
+ plugin->attach_debugger(this);
+ plugin->set_script(p_script);
+ tabs->add_child(plugin);
+ debugger_plugins.insert(p_script, plugin);
+ }
+}
+
+void ScriptEditorDebugger::remove_debugger_plugin(const Ref<Script> &p_script) {
+ if (debugger_plugins.has(p_script)) {
+ tabs->remove_child(debugger_plugins[p_script]);
+ debugger_plugins[p_script]->detach_debugger(false);
+ memdelete(debugger_plugins[p_script]);
+ debugger_plugins.erase(p_script);
+ }
+}
+
+void ScriptEditorDebugger::send_message(const String &p_message, const Array &p_args) {
+ _put_msg(p_message, p_args);
+}
+
+void ScriptEditorDebugger::register_message_capture(const StringName &p_name, const Callable &p_callable) {
+ ERR_FAIL_COND_MSG(has_capture(p_name), "Capture already registered: " + p_name);
+ captures.insert(p_name, p_callable);
+}
+
+void ScriptEditorDebugger::unregister_message_capture(const StringName &p_name) {
+ ERR_FAIL_COND_MSG(!has_capture(p_name), "Capture not registered: " + p_name);
+ captures.erase(p_name);
+}
+
+bool ScriptEditorDebugger::has_capture(const StringName &p_name) {
+ return captures.has(p_name);
+}
+
+ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
+ editor = p_editor;
+
+ tabs = memnew(TabContainer);
+ tabs->set_tab_align(TabContainer::ALIGN_LEFT);
+ tabs->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox("DebuggerPanel", "EditorStyles"));
+ tabs->connect("tab_changed", callable_mp(this, &ScriptEditorDebugger::_tab_changed));
+
+ add_child(tabs);
+
+ { //debugger
+ VBoxContainer *vbc = memnew(VBoxContainer);
+ vbc->set_name(TTR("Debugger"));
+ Control *dbg = vbc;
+
+ HBoxContainer *hbc = memnew(HBoxContainer);
+ vbc->add_child(hbc);
+
+ reason = memnew(Label);
+ reason->set_text("");
+ hbc->add_child(reason);
+ reason->set_h_size_flags(SIZE_EXPAND_FILL);
+ reason->set_autowrap(true);
+ reason->set_max_lines_visible(3);
+ reason->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ hbc->add_child(memnew(VSeparator));
+
+ skip_breakpoints = memnew(Button);
+ skip_breakpoints->set_flat(true);
+ hbc->add_child(skip_breakpoints);
+ skip_breakpoints->set_tooltip(TTR("Skip Breakpoints"));
+ skip_breakpoints->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_skip_breakpoints));
+
+ hbc->add_child(memnew(VSeparator));
+
+ copy = memnew(Button);
+ copy->set_flat(true);
+ hbc->add_child(copy);
+ copy->set_tooltip(TTR("Copy Error"));
+ copy->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_copy));
+
+ hbc->add_child(memnew(VSeparator));
+
+ step = memnew(Button);
+ step->set_flat(true);
+ hbc->add_child(step);
+ step->set_tooltip(TTR("Step Into"));
+ step->set_shortcut(ED_GET_SHORTCUT("debugger/step_into"));
+ step->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_step));
+
+ next = memnew(Button);
+ next->set_flat(true);
+ hbc->add_child(next);
+ next->set_tooltip(TTR("Step Over"));
+ next->set_shortcut(ED_GET_SHORTCUT("debugger/step_over"));
+ next->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_next));
+
+ hbc->add_child(memnew(VSeparator));
+
+ dobreak = memnew(Button);
+ dobreak->set_flat(true);
+ hbc->add_child(dobreak);
+ dobreak->set_tooltip(TTR("Break"));
+ dobreak->set_shortcut(ED_GET_SHORTCUT("debugger/break"));
+ dobreak->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_break));
+
+ docontinue = memnew(Button);
+ docontinue->set_flat(true);
+ hbc->add_child(docontinue);
+ docontinue->set_tooltip(TTR("Continue"));
+ docontinue->set_shortcut(ED_GET_SHORTCUT("debugger/continue"));
+ docontinue->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_continue));
+
+ HSplitContainer *sc = memnew(HSplitContainer);
+ vbc->add_child(sc);
+ sc->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ stack_dump = memnew(Tree);
+ stack_dump->set_allow_reselect(true);
+ stack_dump->set_columns(1);
+ stack_dump->set_column_titles_visible(true);
+ stack_dump->set_column_title(0, TTR("Stack Frames"));
+ stack_dump->set_h_size_flags(SIZE_EXPAND_FILL);
+ stack_dump->set_hide_root(true);
+ stack_dump->connect("cell_selected", callable_mp(this, &ScriptEditorDebugger::_stack_dump_frame_selected));
+ sc->add_child(stack_dump);
+
+ inspector = memnew(EditorDebuggerInspector);
+ inspector->set_h_size_flags(SIZE_EXPAND_FILL);
+ inspector->set_enable_capitalize_paths(false);
+ inspector->set_read_only(true);
+ inspector->connect("object_selected", callable_mp(this, &ScriptEditorDebugger::_remote_object_selected));
+ inspector->connect("object_edited", callable_mp(this, &ScriptEditorDebugger::_remote_object_edited));
+ inspector->connect("object_property_updated", callable_mp(this, &ScriptEditorDebugger::_remote_object_property_updated));
+ sc->add_child(inspector);
+ tabs->add_child(dbg);
+ }
+
+ { //errors
+ errors_tab = memnew(VBoxContainer);
+ errors_tab->set_name(TTR("Errors"));
+
+ HBoxContainer *errhb = memnew(HBoxContainer);
+ errors_tab->add_child(errhb);
+
+ Button *expand_all = memnew(Button);
+ expand_all->set_text(TTR("Expand All"));
+ expand_all->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_expand_errors_list));
+ errhb->add_child(expand_all);
+
+ Button *collapse_all = memnew(Button);
+ collapse_all->set_text(TTR("Collapse All"));
+ collapse_all->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_collapse_errors_list));
+ errhb->add_child(collapse_all);
+
+ Control *space = memnew(Control);
+ space->set_h_size_flags(SIZE_EXPAND_FILL);
+ errhb->add_child(space);
+
+ clearbutton = memnew(Button);
+ clearbutton->set_text(TTR("Clear"));
+ clearbutton->set_h_size_flags(0);
+ clearbutton->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_clear_errors_list));
+ errhb->add_child(clearbutton);
+
+ error_tree = memnew(Tree);
+ error_tree->set_columns(2);
+
+ error_tree->set_column_expand(0, false);
+ error_tree->set_column_min_width(0, 140);
+
+ error_tree->set_column_expand(1, true);
+
+ error_tree->set_select_mode(Tree::SELECT_ROW);
+ error_tree->set_hide_root(true);
+ error_tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ error_tree->set_allow_rmb_select(true);
+ error_tree->connect("item_rmb_selected", callable_mp(this, &ScriptEditorDebugger::_error_tree_item_rmb_selected));
+ errors_tab->add_child(error_tree);
+
+ item_menu = memnew(PopupMenu);
+ item_menu->connect("id_pressed", callable_mp(this, &ScriptEditorDebugger::_item_menu_id_pressed));
+ error_tree->add_child(item_menu);
+
+ tabs->add_child(errors_tab);
+ }
+
+ { // File dialog
+ file_dialog = memnew(EditorFileDialog);
+ file_dialog->connect("file_selected", callable_mp(this, &ScriptEditorDebugger::_file_selected));
+ add_child(file_dialog);
+ }
+
+ { //profiler
+ profiler = memnew(EditorProfiler);
+ profiler->set_name(TTR("Profiler"));
+ tabs->add_child(profiler);
+ profiler->connect("enable_profiling", callable_mp(this, &ScriptEditorDebugger::_profiler_activate), varray(PROFILER_SCRIPTS_SERVERS));
+ profiler->connect("break_request", callable_mp(this, &ScriptEditorDebugger::_profiler_seeked));
+ }
+
+ { //frame profiler
+ visual_profiler = memnew(EditorVisualProfiler);
+ visual_profiler->set_name(TTR("Visual Profiler"));
+ tabs->add_child(visual_profiler);
+ visual_profiler->connect("enable_profiling", callable_mp(this, &ScriptEditorDebugger::_profiler_activate), varray(PROFILER_VISUAL));
+ }
+
+ { //network profiler
+ network_profiler = memnew(EditorNetworkProfiler);
+ network_profiler->set_name(TTR("Network Profiler"));
+ tabs->add_child(network_profiler);
+ network_profiler->connect("enable_profiling", callable_mp(this, &ScriptEditorDebugger::_profiler_activate), varray(PROFILER_NETWORK));
+ }
+
+ { //monitors
+ performance_profiler = memnew(EditorPerformanceProfiler);
+ tabs->add_child(performance_profiler);
+ }
+
+ { //vmem inspect
+ VBoxContainer *vmem_vb = memnew(VBoxContainer);
+ HBoxContainer *vmem_hb = memnew(HBoxContainer);
+ Label *vmlb = memnew(Label(TTR("List of Video Memory Usage by Resource:") + " "));
+ vmlb->set_h_size_flags(SIZE_EXPAND_FILL);
+ vmem_hb->add_child(vmlb);
+ vmem_hb->add_child(memnew(Label(TTR("Total:") + " ")));
+ vmem_total = memnew(LineEdit);
+ vmem_total->set_editable(false);
+ vmem_total->set_custom_minimum_size(Size2(100, 0) * EDSCALE);
+ vmem_hb->add_child(vmem_total);
+ vmem_refresh = memnew(Button);
+ vmem_refresh->set_flat(true);
+ vmem_hb->add_child(vmem_refresh);
+ vmem_export = memnew(Button);
+ vmem_export->set_flat(true);
+ vmem_export->set_tooltip(TTR("Export list to a CSV file"));
+ vmem_hb->add_child(vmem_export);
+ vmem_vb->add_child(vmem_hb);
+ vmem_refresh->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_video_mem_request));
+ vmem_export->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_video_mem_export));
+
+ VBoxContainer *vmmc = memnew(VBoxContainer);
+ vmem_tree = memnew(Tree);
+ vmem_tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ vmem_tree->set_h_size_flags(SIZE_EXPAND_FILL);
+ vmmc->add_child(vmem_tree);
+ vmmc->set_v_size_flags(SIZE_EXPAND_FILL);
+ vmem_vb->add_child(vmmc);
+
+ vmem_vb->set_name(TTR("Video RAM"));
+ vmem_tree->set_columns(4);
+ vmem_tree->set_column_titles_visible(true);
+ vmem_tree->set_column_title(0, TTR("Resource Path"));
+ vmem_tree->set_column_expand(0, true);
+ vmem_tree->set_column_expand(1, false);
+ vmem_tree->set_column_title(1, TTR("Type"));
+ vmem_tree->set_column_min_width(1, 100 * EDSCALE);
+ vmem_tree->set_column_expand(2, false);
+ vmem_tree->set_column_title(2, TTR("Format"));
+ vmem_tree->set_column_min_width(2, 150 * EDSCALE);
+ vmem_tree->set_column_expand(3, false);
+ vmem_tree->set_column_title(3, TTR("Usage"));
+ vmem_tree->set_column_min_width(3, 80 * EDSCALE);
+ vmem_tree->set_hide_root(true);
+
+ tabs->add_child(vmem_vb);
+ }
+
+ { // misc
+ VBoxContainer *misc = memnew(VBoxContainer);
+ misc->set_name(TTR("Misc"));
+ tabs->add_child(misc);
+
+ GridContainer *info_left = memnew(GridContainer);
+ info_left->set_columns(2);
+ misc->add_child(info_left);
+ clicked_ctrl = memnew(LineEdit);
+ clicked_ctrl->set_h_size_flags(SIZE_EXPAND_FILL);
+ info_left->add_child(memnew(Label(TTR("Clicked Control:"))));
+ info_left->add_child(clicked_ctrl);
+ clicked_ctrl_type = memnew(LineEdit);
+ info_left->add_child(memnew(Label(TTR("Clicked Control Type:"))));
+ info_left->add_child(clicked_ctrl_type);
+
+ scene_tree = memnew(SceneDebuggerTree);
+ live_edit_root = memnew(LineEdit);
+ live_edit_root->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ {
+ HBoxContainer *lehb = memnew(HBoxContainer);
+ Label *l = memnew(Label(TTR("Live Edit Root:")));
+ info_left->add_child(l);
+ lehb->add_child(live_edit_root);
+ le_set = memnew(Button(TTR("Set From Tree")));
+ lehb->add_child(le_set);
+ le_clear = memnew(Button(TTR("Clear")));
+ lehb->add_child(le_clear);
+ info_left->add_child(lehb);
+ }
+
+ misc->add_child(memnew(VSeparator));
+
+ HBoxContainer *buttons = memnew(HBoxContainer);
+
+ export_csv = memnew(Button(TTR("Export measures as CSV")));
+ export_csv->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_export_csv));
+ buttons->add_child(export_csv);
+
+ misc->add_child(buttons);
+ }
+
+ msgdialog = memnew(AcceptDialog);
+ add_child(msgdialog);
+
+ live_debug = true;
+ camera_override = CameraOverride::OVERRIDE_NONE;
+ last_path_id = false;
+ error_count = 0;
+ warning_count = 0;
+ _update_buttons_state();
+}
+
+ScriptEditorDebugger::~ScriptEditorDebugger() {
+ if (peer.is_valid()) {
+ peer->close();
+ peer.unref();
+ }
+ memdelete(scene_tree);
+}
diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h
new file mode 100644
index 0000000000..56b34e8e8c
--- /dev/null
+++ b/editor/debugger/script_editor_debugger.h
@@ -0,0 +1,275 @@
+/*************************************************************************/
+/* script_editor_debugger.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SCRIPT_EDITOR_DEBUGGER_H
+#define SCRIPT_EDITOR_DEBUGGER_H
+
+#include "core/os/os.h"
+#include "editor/debugger/editor_debugger_inspector.h"
+#include "editor/debugger/editor_debugger_node.h"
+#include "editor/debugger/editor_debugger_server.h"
+#include "editor/editor_file_dialog.h"
+#include "scene/gui/button.h"
+#include "scene/gui/margin_container.h"
+
+class Tree;
+class EditorNode;
+class LineEdit;
+class TabContainer;
+class RichTextLabel;
+class TextureButton;
+class AcceptDialog;
+class TreeItem;
+class HSplitContainer;
+class ItemList;
+class EditorProfiler;
+class EditorVisualProfiler;
+class EditorNetworkProfiler;
+class EditorPerformanceProfiler;
+class SceneDebuggerTree;
+class EditorDebuggerPlugin;
+
+class ScriptEditorDebugger : public MarginContainer {
+ GDCLASS(ScriptEditorDebugger, MarginContainer);
+
+ friend class EditorDebuggerNode;
+
+private:
+ enum MessageType {
+ MESSAGE_ERROR,
+ MESSAGE_WARNING,
+ MESSAGE_SUCCESS,
+ };
+
+ enum ProfilerType {
+ PROFILER_NETWORK,
+ PROFILER_VISUAL,
+ PROFILER_SCRIPTS_SERVERS
+ };
+
+ AcceptDialog *msgdialog;
+
+ LineEdit *clicked_ctrl;
+ LineEdit *clicked_ctrl_type;
+ LineEdit *live_edit_root;
+ Button *le_set;
+ Button *le_clear;
+ Button *export_csv;
+
+ VBoxContainer *errors_tab;
+ Tree *error_tree;
+ Button *clearbutton;
+ PopupMenu *item_menu;
+
+ EditorFileDialog *file_dialog;
+ enum FileDialogPurpose {
+ SAVE_MONITORS_CSV,
+ SAVE_VRAM_CSV,
+ };
+ FileDialogPurpose file_dialog_purpose;
+
+ int error_count;
+ int warning_count;
+
+ bool skip_breakpoints_value = false;
+ Ref<Script> stack_script;
+
+ TabContainer *tabs;
+
+ Label *reason;
+
+ Button *skip_breakpoints;
+ Button *copy;
+ Button *step;
+ Button *next;
+ Button *dobreak;
+ Button *docontinue;
+ // Reference to "Remote" tab in scene tree. Needed by _live_edit_set and buttons state.
+ // Each debugger should have it's tree in the future I guess.
+ const Tree *editor_remote_tree = nullptr;
+
+ Map<int, String> profiler_signature;
+
+ Tree *vmem_tree;
+ Button *vmem_refresh;
+ Button *vmem_export;
+ LineEdit *vmem_total;
+
+ Tree *stack_dump;
+ EditorDebuggerInspector *inspector;
+ SceneDebuggerTree *scene_tree;
+
+ Ref<RemoteDebuggerPeer> peer;
+
+ HashMap<NodePath, int> node_path_cache;
+ int last_path_id;
+ Map<String, int> res_path_cache;
+
+ EditorProfiler *profiler;
+ EditorVisualProfiler *visual_profiler;
+ EditorNetworkProfiler *network_profiler;
+ EditorPerformanceProfiler *performance_profiler;
+
+ EditorNode *editor;
+
+ OS::ProcessID remote_pid = 0;
+ bool breaked = false;
+ bool can_debug = false;
+
+ bool live_debug;
+
+ EditorDebuggerNode::CameraOverride camera_override;
+
+ Map<Ref<Script>, EditorDebuggerPlugin *> debugger_plugins;
+
+ Map<StringName, Callable> captures;
+
+ void _stack_dump_frame_selected();
+
+ void _file_selected(const String &p_file);
+ void _parse_message(const String &p_msg, const Array &p_data);
+ void _set_reason_text(const String &p_reason, MessageType p_type);
+ void _update_buttons_state();
+ void _remote_object_selected(ObjectID p_object);
+ void _remote_object_edited(ObjectID, const String &p_prop, const Variant &p_value);
+ void _remote_object_property_updated(ObjectID p_id, const String &p_property);
+
+ void _video_mem_request();
+ void _video_mem_export();
+
+ int _get_node_path_cache(const NodePath &p_path);
+
+ int _get_res_path_cache(const String &p_path);
+
+ void _live_edit_set();
+ void _live_edit_clear();
+
+ void _method_changed(Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE);
+ void _property_changed(Object *p_base, const StringName &p_property, const Variant &p_value);
+
+ void _error_activated();
+ void _error_selected();
+
+ void _expand_errors_list();
+ void _collapse_errors_list();
+
+ void _profiler_activate(bool p_enable, int p_profiler);
+ void _profiler_seeked();
+
+ void _clear_errors_list();
+
+ void _error_tree_item_rmb_selected(const Vector2 &p_pos);
+ void _item_menu_id_pressed(int p_option);
+ void _tab_changed(int p_tab);
+
+ void _put_msg(String p_message, Array p_data);
+ void _export_csv();
+
+ void _clear_execution();
+ void _stop_and_notify();
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void request_remote_object(ObjectID p_obj_id);
+ void update_remote_object(ObjectID p_obj_id, const String &p_prop, const Variant &p_value);
+ Object *get_remote_object(ObjectID p_id);
+
+ // Needed by _live_edit_set, buttons state.
+ void set_editor_remote_tree(const Tree *p_tree) { editor_remote_tree = p_tree; }
+
+ void request_remote_tree();
+ const SceneDebuggerTree *get_remote_tree();
+
+ void start(Ref<RemoteDebuggerPeer> p_peer);
+ void stop();
+
+ void debug_skip_breakpoints();
+ void debug_copy();
+
+ void debug_next();
+ void debug_step();
+ void debug_break();
+ void debug_continue();
+ bool is_breaked() const { return breaked; }
+ bool is_debuggable() const { return can_debug; }
+ bool is_session_active() { return peer.is_valid() && peer->is_peer_connected(); };
+ int get_remote_pid() const { return remote_pid; }
+
+ int get_error_count() const { return error_count; }
+ int get_warning_count() const { return warning_count; }
+ String get_stack_script_file() const;
+ int get_stack_script_line() const;
+ int get_stack_script_frame() const;
+
+ void update_tabs();
+ void clear_style();
+ String get_var_value(const String &p_var) const;
+
+ void save_node(ObjectID p_id, const String &p_file);
+ void set_live_debugging(bool p_enable);
+
+ void live_debug_create_node(const NodePath &p_parent, const String &p_type, const String &p_name);
+ void live_debug_instance_node(const NodePath &p_parent, const String &p_path, const String &p_name);
+ void live_debug_remove_node(const NodePath &p_at);
+ void live_debug_remove_and_keep_node(const NodePath &p_at, ObjectID p_keep_id);
+ void live_debug_restore_node(ObjectID p_id, const NodePath &p_at, int p_at_pos);
+ void live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name);
+ void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos);
+
+ EditorDebuggerNode::CameraOverride get_camera_override() const;
+ void set_camera_override(EditorDebuggerNode::CameraOverride p_override);
+
+ void set_breakpoint(const String &p_path, int p_line, bool p_enabled);
+
+ void update_live_edit_root();
+
+ void reload_scripts();
+
+ bool is_skip_breakpoints();
+
+ virtual Size2 get_minimum_size() const override;
+
+ void add_debugger_plugin(const Ref<Script> &p_script);
+ void remove_debugger_plugin(const Ref<Script> &p_script);
+
+ void send_message(const String &p_message, const Array &p_args);
+
+ void register_message_capture(const StringName &p_name, const Callable &p_callable);
+ void unregister_message_capture(const StringName &p_name);
+ bool has_capture(const StringName &p_name);
+
+ ScriptEditorDebugger(EditorNode *p_editor = nullptr);
+ ~ScriptEditorDebugger();
+};
+
+#endif // SCRIPT_EDITOR_DEBUGGER_H
diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp
index df957611cf..cbf39c209a 100644
--- a/editor/dependency_editor.cpp
+++ b/editor/dependency_editor.cpp
@@ -37,7 +37,6 @@
#include "scene/gui/margin_container.h"
void DependencyEditor::_searched(const String &p_path) {
-
Map<String, String> dep_rename;
dep_rename[replacing] = p_path;
@@ -48,7 +47,6 @@ void DependencyEditor::_searched(const String &p_path) {
}
void DependencyEditor::_load_pressed(Object *p_item, int p_cell, int p_button) {
-
TreeItem *ti = Object::cast_to<TreeItem>(p_item);
replacing = ti->get_text(1);
@@ -60,25 +58,23 @@ void DependencyEditor::_load_pressed(Object *p_item, int p_cell, int p_button) {
for (List<String>::Element *E = ext.front(); E; E = E->next()) {
search->add_filter("*" + E->get());
}
- search->popup_centered_ratio(0.65); // So it doesn't completely cover the dialog below it.
+ search->popup_file_dialog();
}
-void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String, Map<String, String> > &candidates) {
-
+void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String, Map<String, String>> &candidates) {
for (int i = 0; i < efsd->get_subdir_count(); i++) {
_fix_and_find(efsd->get_subdir(i), candidates);
}
for (int i = 0; i < efsd->get_file_count(); i++) {
-
String file = efsd->get_file(i);
- if (!candidates.has(file))
+ if (!candidates.has(file)) {
continue;
+ }
String path = efsd->get_file_path(i);
for (Map<String, String>::Element *E = candidates[file].front(); E; E = E->next()) {
-
if (E->get() == String()) {
E->get() = path;
continue;
@@ -100,7 +96,6 @@ void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String
int current_score = 0;
for (int j = 0; j < lostv.size(); j++) {
-
if (j < existingv.size() && lostv[j] == existingv[j]) {
existing_score++;
}
@@ -110,7 +105,6 @@ void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String
}
if (current_score > existing_score) {
-
//if it was the same, could track distance to new path but..
E->get() = path; //replace by more accurate
@@ -120,14 +114,13 @@ void DependencyEditor::_fix_and_find(EditorFileSystemDirectory *efsd, Map<String
}
void DependencyEditor::_fix_all() {
-
- if (!EditorFileSystem::get_singleton()->get_filesystem())
+ if (!EditorFileSystem::get_singleton()->get_filesystem()) {
return;
+ }
- Map<String, Map<String, String> > candidates;
+ Map<String, Map<String, String>> candidates;
for (List<String>::Element *E = missing.front(); E; E = E->next()) {
-
String base = E->get().get_file();
if (!candidates.has(base)) {
candidates[base] = Map<String, String>();
@@ -140,10 +133,8 @@ void DependencyEditor::_fix_all() {
Map<String, String> remaps;
- for (Map<String, Map<String, String> >::Element *E = candidates.front(); E; E = E->next()) {
-
+ for (Map<String, Map<String, String>>::Element *E = candidates.front(); E; E = E->next()) {
for (Map<String, String>::Element *F = E->get().front(); F; F = F->next()) {
-
if (F->get() != String()) {
remaps[F->key()] = F->get();
}
@@ -151,7 +142,6 @@ void DependencyEditor::_fix_all() {
}
if (remaps.size()) {
-
ResourceLoader::rename_dependencies(editing, remaps);
_update_list();
@@ -160,12 +150,10 @@ void DependencyEditor::_fix_all() {
}
void DependencyEditor::_update_file() {
-
EditorFileSystem::get_singleton()->update_file(editing);
}
void DependencyEditor::_update_list() {
-
List<String> deps;
ResourceLoader::get_dependencies(editing, &deps, true);
@@ -174,12 +162,11 @@ void DependencyEditor::_update_list() {
TreeItem *root = tree->create_item();
- Ref<Texture> folder = get_icon("folder", "FileDialog");
+ Ref<Texture2D> folder = tree->get_theme_icon("folder", "FileDialog");
bool broken = false;
for (List<String>::Element *E = deps.front(); E; E = E->next()) {
-
TreeItem *item = tree->create_item(root);
String n = E->get();
@@ -195,7 +182,7 @@ void DependencyEditor::_update_list() {
}
String name = path.get_file();
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(type);
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_class_icon(type);
item->set_text(0, name);
item->set_icon(0, icon);
item->set_metadata(0, type);
@@ -214,12 +201,11 @@ void DependencyEditor::_update_list() {
}
void DependencyEditor::edit(const String &p_path) {
-
editing = p_path;
set_title(TTR("Dependencies For:") + " " + p_path.get_file());
_update_list();
- popup_centered_ratio(0.7); // So it doesn't completely cover the dialog below it.
+ popup_centered_ratio(0.4);
if (EditorNode::get_singleton()->is_scene_open(p_path)) {
EditorNode::get_singleton()->show_warning(vformat(TTR("Scene '%s' is currently being edited.\nChanges will only take effect when reloaded."), p_path.get_file()));
@@ -229,14 +215,9 @@ void DependencyEditor::edit(const String &p_path) {
}
void DependencyEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_searched"), &DependencyEditor::_searched);
- ClassDB::bind_method(D_METHOD("_load_pressed"), &DependencyEditor::_load_pressed);
- ClassDB::bind_method(D_METHOD("_fix_all"), &DependencyEditor::_fix_all);
}
DependencyEditor::DependencyEditor() {
-
VBoxContainer *vb = memnew(VBoxContainer);
vb->set_name(TTR("Dependencies"));
add_child(vb);
@@ -247,7 +228,7 @@ DependencyEditor::DependencyEditor() {
tree->set_column_title(0, TTR("Resource"));
tree->set_column_title(1, TTR("Path"));
tree->set_hide_root(true);
- tree->connect("button_pressed", this, "_load_pressed");
+ tree->connect("button_pressed", callable_mp(this, &DependencyEditor::_load_pressed));
HBoxContainer *hbc = memnew(HBoxContainer);
Label *label = memnew(Label(TTR("Dependencies:")));
@@ -255,27 +236,26 @@ DependencyEditor::DependencyEditor() {
hbc->add_spacer();
fixdeps = memnew(Button(TTR("Fix Broken")));
hbc->add_child(fixdeps);
- fixdeps->connect("pressed", this, "_fix_all");
+ fixdeps->connect("pressed", callable_mp(this, &DependencyEditor::_fix_all));
vb->add_child(hbc);
MarginContainer *mc = memnew(MarginContainer);
- mc->set_v_size_flags(SIZE_EXPAND_FILL);
+ mc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
mc->add_child(tree);
vb->add_child(mc);
set_title(TTR("Dependency Editor"));
search = memnew(EditorFileDialog);
- search->connect("file_selected", this, "_searched");
- search->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ search->connect("file_selected", callable_mp(this, &DependencyEditor::_searched));
+ search->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
search->set_title(TTR("Search Replacement Resource:"));
add_child(search);
}
/////////////////////////////////////
void DependencyEditorOwners::_list_rmb_select(int p_item, const Vector2 &p_pos) {
-
file_options->clear();
file_options->set_size(Size2(1, 1));
if (p_item >= 0) {
@@ -287,7 +267,6 @@ void DependencyEditorOwners::_list_rmb_select(int p_item, const Vector2 &p_pos)
}
void DependencyEditorOwners::_select_file(int p_idx) {
-
String fpath = owners->get_item_text(p_idx);
if (ResourceLoader::get_resource_type(fpath) == "PackedScene") {
@@ -298,35 +277,30 @@ void DependencyEditorOwners::_select_file(int p_idx) {
}
void DependencyEditorOwners::_file_option(int p_option) {
-
switch (p_option) {
case FILE_OPEN: {
int idx = owners->get_current();
- if (idx < 0 || idx >= owners->get_item_count())
+ if (idx < 0 || idx >= owners->get_item_count()) {
break;
+ }
_select_file(idx);
} break;
}
}
void DependencyEditorOwners::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_list_rmb_select"), &DependencyEditorOwners::_list_rmb_select);
- ClassDB::bind_method(D_METHOD("_file_option"), &DependencyEditorOwners::_file_option);
- ClassDB::bind_method(D_METHOD("_select_file"), &DependencyEditorOwners::_select_file);
}
void DependencyEditorOwners::_fill_owners(EditorFileSystemDirectory *efsd) {
-
- if (!efsd)
+ if (!efsd) {
return;
+ }
for (int i = 0; i < efsd->get_subdir_count(); i++) {
_fill_owners(efsd->get_subdir(i));
}
for (int i = 0; i < efsd->get_file_count(); i++) {
-
Vector<String> deps = efsd->get_file_deps(i);
bool found = false;
for (int j = 0; j < deps.size(); j++) {
@@ -335,37 +309,36 @@ void DependencyEditorOwners::_fill_owners(EditorFileSystemDirectory *efsd) {
break;
}
}
- if (!found)
+ if (!found) {
continue;
+ }
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(efsd->get_file_type(i));
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_class_icon(efsd->get_file_type(i));
owners->add_item(efsd->get_file_path(i), icon);
}
}
void DependencyEditorOwners::show(const String &p_path) {
-
editing = p_path;
owners->clear();
_fill_owners(EditorFileSystem::get_singleton()->get_filesystem());
- popup_centered_ratio();
+ popup_centered_ratio(0.3);
set_title(TTR("Owners Of:") + " " + p_path.get_file());
}
DependencyEditorOwners::DependencyEditorOwners(EditorNode *p_editor) {
-
editor = p_editor;
file_options = memnew(PopupMenu);
add_child(file_options);
- file_options->connect("id_pressed", this, "_file_option");
+ file_options->connect("id_pressed", callable_mp(this, &DependencyEditorOwners::_file_option));
owners = memnew(ItemList);
owners->set_select_mode(ItemList::SELECT_SINGLE);
- owners->connect("item_rmb_selected", this, "_list_rmb_select");
- owners->connect("item_activated", this, "_select_file");
+ owners->connect("item_rmb_selected", callable_mp(this, &DependencyEditorOwners::_list_rmb_select));
+ owners->connect("item_activated", callable_mp(this, &DependencyEditorOwners::_select_file));
owners->set_allow_rmb_select(true);
add_child(owners);
}
@@ -373,8 +346,9 @@ DependencyEditorOwners::DependencyEditorOwners(EditorNode *p_editor) {
///////////////////////
void DependencyRemoveDialog::_find_files_in_removed_folder(EditorFileSystemDirectory *efsd, const String &p_folder) {
- if (!efsd)
+ if (!efsd) {
return;
+ }
for (int i = 0; i < efsd->get_subdir_count(); ++i) {
_find_files_in_removed_folder(efsd->get_subdir(i), p_folder);
@@ -387,8 +361,9 @@ void DependencyRemoveDialog::_find_files_in_removed_folder(EditorFileSystemDirec
}
void DependencyRemoveDialog::_find_all_removed_dependencies(EditorFileSystemDirectory *efsd, Vector<RemovedDependency> &p_removed) {
- if (!efsd)
+ if (!efsd) {
return;
+ }
for (int i = 0; i < efsd->get_subdir_count(); i++) {
_find_all_removed_dependencies(efsd->get_subdir(i), p_removed);
@@ -398,8 +373,9 @@ void DependencyRemoveDialog::_find_all_removed_dependencies(EditorFileSystemDire
const String path = efsd->get_file_path(i);
//It doesn't matter if a file we are about to delete will have some of its dependencies removed too
- if (all_remove_files.has(path))
+ if (all_remove_files.has(path)) {
continue;
+ }
Vector<String> all_deps = efsd->get_file_deps(i);
for (int j = 0; j < all_deps.size(); ++j) {
@@ -430,23 +406,23 @@ void DependencyRemoveDialog::_build_removed_dependency_tree(const Vector<Removed
if (!tree_items.has(rd.dependency_folder)) {
TreeItem *folder_item = owners->create_item(owners->get_root());
folder_item->set_text(0, rd.dependency_folder);
- folder_item->set_icon(0, get_icon("Folder", "EditorIcons"));
+ folder_item->set_icon(0, owners->get_theme_icon("Folder", "EditorIcons"));
tree_items[rd.dependency_folder] = folder_item;
}
TreeItem *dependency_item = owners->create_item(tree_items[rd.dependency_folder]);
dependency_item->set_text(0, rd.dependency);
- dependency_item->set_icon(0, get_icon("Warning", "EditorIcons"));
+ dependency_item->set_icon(0, owners->get_theme_icon("Warning", "EditorIcons"));
tree_items[rd.dependency] = dependency_item;
} else {
TreeItem *dependency_item = owners->create_item(owners->get_root());
dependency_item->set_text(0, rd.dependency);
- dependency_item->set_icon(0, get_icon("Warning", "EditorIcons"));
+ dependency_item->set_icon(0, owners->get_theme_icon("Warning", "EditorIcons"));
tree_items[rd.dependency] = dependency_item;
}
}
//List this file under this dependency
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(rd.file_type);
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_class_icon(rd.file_type);
TreeItem *file_item = owners->create_item(tree_items[rd.dependency]);
file_item->set_text(0, rd.file);
file_item->set_icon(0, icon);
@@ -487,7 +463,6 @@ void DependencyRemoveDialog::show(const Vector<String> &p_folders, const Vector<
}
void DependencyRemoveDialog::ok_pressed() {
-
for (int i = 0; i < files_to_delete.size(); ++i) {
if (ResourceCache::has(files_to_delete[i])) {
Resource *res = ResourceCache::get(files_to_delete[i]);
@@ -533,10 +508,10 @@ void DependencyRemoveDialog::ok_pressed() {
if (dirs_to_delete.size() == 0) {
// If we only deleted files we should only need to tell the file system about the files we touched.
- for (int i = 0; i < files_to_delete.size(); ++i)
+ for (int i = 0; i < files_to_delete.size(); ++i) {
EditorFileSystem::get_singleton()->update_file(files_to_delete[i]);
+ }
} else {
-
for (int i = 0; i < dirs_to_delete.size(); ++i) {
String path = OS::get_singleton()->get_resource_dir() + dirs_to_delete[i].replace_first("res://", "/");
print_verbose("Moving to trash: " + path);
@@ -557,11 +532,13 @@ void DependencyRemoveDialog::ok_pressed() {
for (int i = 0; i < previous_favorites.size(); ++i) {
if (previous_favorites[i].ends_with("/")) {
- if (dirs_to_delete.find(previous_favorites[i]) < 0)
+ if (dirs_to_delete.find(previous_favorites[i]) < 0) {
new_favorites.push_back(previous_favorites[i]);
+ }
} else {
- if (files_to_delete.find(previous_favorites[i]) < 0)
+ if (files_to_delete.find(previous_favorites[i]) < 0) {
new_favorites.push_back(previous_favorites[i]);
+ }
}
}
@@ -576,7 +553,6 @@ void DependencyRemoveDialog::_bind_methods() {
}
DependencyRemoveDialog::DependencyRemoveDialog() {
-
get_ok()->set_text(TTR("Remove"));
VBoxContainer *vb = memnew(VBoxContainer);
@@ -588,28 +564,27 @@ DependencyRemoveDialog::DependencyRemoveDialog() {
owners = memnew(Tree);
owners->set_hide_root(true);
vb->add_child(owners);
- owners->set_v_size_flags(SIZE_EXPAND_FILL);
+ owners->set_v_size_flags(Control::SIZE_EXPAND_FILL);
}
//////////////
void DependencyErrorDialog::show(Mode p_mode, const String &p_for_file, const Vector<String> &report) {
-
mode = p_mode;
for_file = p_for_file;
set_title(TTR("Error loading:") + " " + p_for_file.get_file());
files->clear();
- TreeItem *root = files->create_item(NULL);
+ TreeItem *root = files->create_item(nullptr);
for (int i = 0; i < report.size(); i++) {
-
String dep;
String type = "Object";
dep = report[i].get_slice("::", 0);
- if (report[i].get_slice_count("::") > 0)
+ if (report[i].get_slice_count("::") > 0) {
type = report[i].get_slice("::", 1);
+ }
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(type);
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_class_icon(type);
TreeItem *ti = files->create_item(root);
ti->set_text(0, dep);
@@ -620,7 +595,6 @@ void DependencyErrorDialog::show(Mode p_mode, const String &p_for_file, const Ve
}
void DependencyErrorDialog::ok_pressed() {
-
switch (mode) {
case MODE_SCENE:
EditorNode::get_singleton()->load_scene(for_file, true);
@@ -632,21 +606,19 @@ void DependencyErrorDialog::ok_pressed() {
}
void DependencyErrorDialog::custom_action(const String &) {
-
EditorNode::get_singleton()->fix_dependencies(for_file);
}
DependencyErrorDialog::DependencyErrorDialog() {
-
VBoxContainer *vb = memnew(VBoxContainer);
add_child(vb);
files = memnew(Tree);
files->set_hide_root(true);
vb->add_margin_child(TTR("Load failed due to missing dependencies:"), files, true);
- files->set_v_size_flags(SIZE_EXPAND_FILL);
+ files->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- set_custom_minimum_size(Size2(500, 220) * EDSCALE);
+ set_min_size(Size2(500, 220) * EDSCALE);
get_ok()->set_text(TTR("Open Anyway"));
get_cancel()->set_text(TTR("Close"));
@@ -662,31 +634,30 @@ DependencyErrorDialog::DependencyErrorDialog() {
//////////////////////////////////////////////////////////////////////
void OrphanResourcesDialog::ok_pressed() {
-
paths.clear();
_find_to_delete(files->get_root(), paths);
- if (paths.empty())
+ if (paths.empty()) {
return;
+ }
delete_confirm->set_text(vformat(TTR("Permanently delete %d item(s)? (No undo!)"), paths.size()));
- delete_confirm->popup_centered_clamped(delete_confirm->get_minimum_size());
+ delete_confirm->popup_centered();
}
bool OrphanResourcesDialog::_fill_owners(EditorFileSystemDirectory *efsd, HashMap<String, int> &refs, TreeItem *p_parent) {
-
- if (!efsd)
+ if (!efsd) {
return false;
+ }
bool has_children = false;
for (int i = 0; i < efsd->get_subdir_count(); i++) {
-
- TreeItem *dir_item = NULL;
+ TreeItem *dir_item = nullptr;
if (p_parent) {
dir_item = files->create_item(p_parent);
dir_item->set_text(0, efsd->get_subdir(i)->get_name());
- dir_item->set_icon(0, get_icon("folder", "FileDialog"));
+ dir_item->set_icon(0, files->get_theme_icon("folder", "FileDialog"));
}
bool children = _fill_owners(efsd->get_subdir(i), refs, dir_item);
@@ -700,17 +671,14 @@ bool OrphanResourcesDialog::_fill_owners(EditorFileSystemDirectory *efsd, HashMa
}
for (int i = 0; i < efsd->get_file_count(); i++) {
-
if (!p_parent) {
Vector<String> deps = efsd->get_file_deps(i);
for (int j = 0; j < deps.size(); j++) {
-
if (!refs.has(deps[j])) {
refs[deps[j]] = 1;
}
}
} else {
-
String path = efsd->get_file_path(i);
if (!refs.has(path)) {
TreeItem *ti = files->create_item(p_parent);
@@ -720,12 +688,12 @@ bool OrphanResourcesDialog::_fill_owners(EditorFileSystemDirectory *efsd, HashMa
String type = efsd->get_file_type(i);
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(type);
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_class_icon(type);
ti->set_icon(0, icon);
int ds = efsd->get_file_deps(i).size();
ti->set_text(1, itos(ds));
if (ds) {
- ti->add_button(1, get_icon("GuiVisibilityVisible", "EditorIcons"), -1, false, TTR("Show Dependencies"));
+ ti->add_button(1, files->get_theme_icon("GuiVisibilityVisible", "EditorIcons"), -1, false, TTR("Show Dependencies"));
}
ti->set_metadata(0, path);
has_children = true;
@@ -738,22 +706,19 @@ bool OrphanResourcesDialog::_fill_owners(EditorFileSystemDirectory *efsd, HashMa
void OrphanResourcesDialog::refresh() {
HashMap<String, int> refs;
- _fill_owners(EditorFileSystem::get_singleton()->get_filesystem(), refs, NULL);
+ _fill_owners(EditorFileSystem::get_singleton()->get_filesystem(), refs, nullptr);
files->clear();
TreeItem *root = files->create_item();
_fill_owners(EditorFileSystem::get_singleton()->get_filesystem(), refs, root);
}
void OrphanResourcesDialog::show() {
-
refresh();
- popup_centered_ratio();
+ popup_centered_ratio(0.4);
}
void OrphanResourcesDialog::_find_to_delete(TreeItem *p_item, List<String> &paths) {
-
while (p_item) {
-
if (p_item->get_cell_mode(0) == TreeItem::CELL_MODE_CHECK && p_item->is_checked(0)) {
paths.push_back(p_item->get_metadata(0));
}
@@ -767,10 +732,8 @@ void OrphanResourcesDialog::_find_to_delete(TreeItem *p_item, List<String> &path
}
void OrphanResourcesDialog::_delete_confirm() {
-
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
for (List<String>::Element *E = paths.front(); E; E = E->next()) {
-
da->remove(E->get());
EditorFileSystem::get_singleton()->update_file(E->get());
}
@@ -779,7 +742,6 @@ void OrphanResourcesDialog::_delete_confirm() {
}
void OrphanResourcesDialog::_button_pressed(Object *p_item, int p_column, int p_id) {
-
TreeItem *ti = Object::cast_to<TreeItem>(p_item);
String path = ti->get_metadata(0);
@@ -787,20 +749,16 @@ void OrphanResourcesDialog::_button_pressed(Object *p_item, int p_column, int p_
}
void OrphanResourcesDialog::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_delete_confirm"), &OrphanResourcesDialog::_delete_confirm);
- ClassDB::bind_method(D_METHOD("_button_pressed"), &OrphanResourcesDialog::_button_pressed);
}
OrphanResourcesDialog::OrphanResourcesDialog() {
-
set_title(TTR("Orphan Resource Explorer"));
delete_confirm = memnew(ConfirmationDialog);
get_ok()->set_text(TTR("Delete"));
add_child(delete_confirm);
dep_edit = memnew(DependencyEditor);
add_child(dep_edit);
- delete_confirm->connect("confirmed", this, "_delete_confirm");
+ delete_confirm->connect("confirmed", callable_mp(this, &OrphanResourcesDialog::_delete_confirm));
set_hide_on_ok(false);
VBoxContainer *vbc = memnew(VBoxContainer);
@@ -816,5 +774,5 @@ OrphanResourcesDialog::OrphanResourcesDialog() {
files->set_column_title(1, TTR("Owns"));
files->set_hide_root(true);
vbc->add_margin_child(TTR("Resources Without Explicit Ownership:"), files, true);
- files->connect("button_pressed", this, "_button_pressed");
+ files->connect("button_pressed", callable_mp(this, &OrphanResourcesDialog::_button_pressed));
}
diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h
index be8d34f406..5d2ae582e6 100644
--- a/editor/dependency_editor.h
+++ b/editor/dependency_editor.h
@@ -52,7 +52,7 @@ class DependencyEditor : public AcceptDialog {
String editing;
List<String> missing;
- void _fix_and_find(EditorFileSystemDirectory *efsd, Map<String, Map<String, String> > &candidates);
+ void _fix_and_find(EditorFileSystemDirectory *efsd, Map<String, Map<String, String>> &candidates);
void _searched(const String &p_path);
void _load_pressed(Object *p_item, int p_cell, int p_button);
@@ -123,7 +123,7 @@ class DependencyRemoveDialog : public ConfirmationDialog {
void _find_all_removed_dependencies(EditorFileSystemDirectory *efsd, Vector<RemovedDependency> &p_removed);
void _build_removed_dependency_tree(const Vector<RemovedDependency> &p_removed);
- void ok_pressed();
+ void ok_pressed() override;
static void _bind_methods();
@@ -147,8 +147,8 @@ private:
Button *fdep;
Label *text;
Tree *files;
- void ok_pressed();
- void custom_action(const String &);
+ void ok_pressed() override;
+ void custom_action(const String &) override;
public:
void show(Mode p_mode, const String &p_for_file, const Vector<String> &report);
@@ -161,7 +161,7 @@ class OrphanResourcesDialog : public ConfirmationDialog {
DependencyEditor *dep_edit;
Tree *files;
ConfirmationDialog *delete_confirm;
- void ok_pressed();
+ void ok_pressed() override;
bool _fill_owners(EditorFileSystemDirectory *efsd, HashMap<String, int> &refs, TreeItem *p_parent);
diff --git a/editor/dictionary_property_edit.cpp b/editor/dictionary_property_edit.cpp
index bb01fadb72..276cd12ded 100644
--- a/editor/dictionary_property_edit.cpp
+++ b/editor/dictionary_property_edit.cpp
@@ -40,34 +40,33 @@ void DictionaryPropertyEdit::_notif_changev(const String &p_v) {
}
void DictionaryPropertyEdit::_set_key(const Variant &p_old_key, const Variant &p_new_key) {
-
// TODO: Set key of a dictionary is not allowed yet
}
void DictionaryPropertyEdit::_set_value(const Variant &p_key, const Variant &p_value) {
-
Dictionary dict = get_dictionary();
dict[p_key] = p_value;
Object *o = ObjectDB::get_instance(obj);
- if (!o)
+ if (!o) {
return;
+ }
o->set(property, dict);
}
Variant DictionaryPropertyEdit::get_dictionary() const {
-
Object *o = ObjectDB::get_instance(obj);
- if (!o)
+ if (!o) {
return Dictionary();
+ }
Variant dict = o->get(property);
- if (dict.get_type() != Variant::DICTIONARY)
+ if (dict.get_type() != Variant::DICTIONARY) {
return Dictionary();
+ }
return dict;
}
void DictionaryPropertyEdit::_get_property_list(List<PropertyInfo> *p_list) const {
-
Dictionary dict = get_dictionary();
Array keys = dict.keys();
@@ -87,16 +86,15 @@ void DictionaryPropertyEdit::_get_property_list(List<PropertyInfo> *p_list) cons
}
void DictionaryPropertyEdit::edit(Object *p_obj, const StringName &p_prop) {
-
property = p_prop;
obj = p_obj->get_instance_id();
}
Node *DictionaryPropertyEdit::get_node() {
-
Object *o = ObjectDB::get_instance(obj);
- if (!o)
- return NULL;
+ if (!o) {
+ return nullptr;
+ }
return cast_to<Node>(o);
}
@@ -106,7 +104,6 @@ bool DictionaryPropertyEdit::_dont_undo_redo() {
}
void DictionaryPropertyEdit::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_set_key"), &DictionaryPropertyEdit::_set_key);
ClassDB::bind_method(D_METHOD("_set_value"), &DictionaryPropertyEdit::_set_value);
ClassDB::bind_method(D_METHOD("_notif_change"), &DictionaryPropertyEdit::_notif_change);
@@ -115,7 +112,6 @@ void DictionaryPropertyEdit::_bind_methods() {
}
bool DictionaryPropertyEdit::_set(const StringName &p_name, const Variant &p_value) {
-
Dictionary dict = get_dictionary();
Array keys = dict.keys();
keys.sort();
@@ -126,7 +122,6 @@ bool DictionaryPropertyEdit::_set(const StringName &p_name, const Variant &p_val
String type = pn.substr(slash + 2, pn.length());
int index = pn.substr(0, slash).to_int();
if (type == "key" && index < keys.size()) {
-
const Variant &key = keys[index];
UndoRedo *ur = EditorNode::get_undo_redo();
@@ -141,7 +136,6 @@ bool DictionaryPropertyEdit::_set(const StringName &p_name, const Variant &p_val
} else if (type == "value" && index < keys.size()) {
const Variant &key = keys[index];
if (dict.has(key)) {
-
Variant value = dict[key];
UndoRedo *ur = EditorNode::get_undo_redo();
@@ -161,7 +155,6 @@ bool DictionaryPropertyEdit::_set(const StringName &p_name, const Variant &p_val
}
bool DictionaryPropertyEdit::_get(const StringName &p_name, Variant &r_ret) const {
-
Dictionary dict = get_dictionary();
Array keys = dict.keys();
keys.sort();
@@ -170,7 +163,6 @@ bool DictionaryPropertyEdit::_get(const StringName &p_name, Variant &r_ret) cons
int slash = pn.find(": ");
if (slash != -1 && pn.length() > slash) {
-
String type = pn.substr(slash + 2, pn.length());
int index = pn.substr(0, slash).to_int();
@@ -190,5 +182,4 @@ bool DictionaryPropertyEdit::_get(const StringName &p_name, Variant &r_ret) cons
}
DictionaryPropertyEdit::DictionaryPropertyEdit() {
- obj = 0;
}
diff --git a/editor/doc/SCsub b/editor/doc/SCsub
deleted file mode 100644
index 2b1e889fb0..0000000000
--- a/editor/doc/SCsub
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-
-Import('env')
-
-env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp
deleted file mode 100644
index adfffe27ba..0000000000
--- a/editor/doc/doc_data.cpp
+++ /dev/null
@@ -1,1213 +0,0 @@
-/*************************************************************************/
-/* doc_data.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "doc_data.h"
-
-#include "core/engine.h"
-#include "core/global_constants.h"
-#include "core/io/compression.h"
-#include "core/io/marshalls.h"
-#include "core/os/dir_access.h"
-#include "core/project_settings.h"
-#include "core/script_language.h"
-#include "core/version.h"
-#include "scene/resources/theme.h"
-
-void DocData::merge_from(const DocData &p_data) {
-
- for (Map<String, ClassDoc>::Element *E = class_list.front(); E; E = E->next()) {
-
- ClassDoc &c = E->get();
-
- if (!p_data.class_list.has(c.name))
- continue;
-
- const ClassDoc &cf = p_data.class_list[c.name];
-
- c.description = cf.description;
- c.brief_description = cf.brief_description;
- c.tutorials = cf.tutorials;
-
- for (int i = 0; i < c.methods.size(); i++) {
-
- MethodDoc &m = c.methods.write[i];
-
- for (int j = 0; j < cf.methods.size(); j++) {
-
- if (cf.methods[j].name != m.name)
- continue;
- if (cf.methods[j].arguments.size() != m.arguments.size())
- continue;
- // since polymorphic functions are allowed we need to check the type of
- // the arguments so we make sure they are different.
- int arg_count = cf.methods[j].arguments.size();
- Vector<bool> arg_used;
- arg_used.resize(arg_count);
- for (int l = 0; l < arg_count; ++l)
- arg_used.write[l] = false;
- // also there is no guarantee that argument ordering will match, so we
- // have to check one by one so we make sure we have an exact match
- for (int k = 0; k < arg_count; ++k) {
- for (int l = 0; l < arg_count; ++l)
- if (cf.methods[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) {
- arg_used.write[l] = true;
- break;
- }
- }
- bool not_the_same = false;
- for (int l = 0; l < arg_count; ++l)
- if (!arg_used[l]) // at least one of the arguments was different
- not_the_same = true;
- if (not_the_same)
- continue;
-
- const MethodDoc &mf = cf.methods[j];
-
- m.description = mf.description;
- break;
- }
- }
-
- for (int i = 0; i < c.signals.size(); i++) {
-
- MethodDoc &m = c.signals.write[i];
-
- for (int j = 0; j < cf.signals.size(); j++) {
-
- if (cf.signals[j].name != m.name)
- continue;
- const MethodDoc &mf = cf.signals[j];
-
- m.description = mf.description;
- break;
- }
- }
-
- for (int i = 0; i < c.constants.size(); i++) {
-
- ConstantDoc &m = c.constants.write[i];
-
- for (int j = 0; j < cf.constants.size(); j++) {
-
- if (cf.constants[j].name != m.name)
- continue;
- const ConstantDoc &mf = cf.constants[j];
-
- m.description = mf.description;
- break;
- }
- }
-
- for (int i = 0; i < c.properties.size(); i++) {
-
- PropertyDoc &p = c.properties.write[i];
-
- for (int j = 0; j < cf.properties.size(); j++) {
-
- if (cf.properties[j].name != p.name)
- continue;
- const PropertyDoc &pf = cf.properties[j];
-
- p.description = pf.description;
- break;
- }
- }
-
- for (int i = 0; i < c.theme_properties.size(); i++) {
-
- PropertyDoc &p = c.theme_properties.write[i];
-
- for (int j = 0; j < cf.theme_properties.size(); j++) {
-
- if (cf.theme_properties[j].name != p.name)
- continue;
- const PropertyDoc &pf = cf.theme_properties[j];
-
- p.description = pf.description;
- break;
- }
- }
- }
-}
-
-void DocData::remove_from(const DocData &p_data) {
- for (Map<String, ClassDoc>::Element *E = p_data.class_list.front(); E; E = E->next()) {
- if (class_list.has(E->key()))
- class_list.erase(E->key());
- }
-}
-
-static void return_doc_from_retinfo(DocData::MethodDoc &p_method, const PropertyInfo &p_retinfo) {
-
- if (p_retinfo.type == Variant::INT && p_retinfo.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {
- p_method.return_enum = p_retinfo.class_name;
- if (p_method.return_enum.begins_with("_")) //proxy class
- p_method.return_enum = p_method.return_enum.substr(1, p_method.return_enum.length());
- p_method.return_type = "int";
- } else if (p_retinfo.class_name != StringName()) {
- p_method.return_type = p_retinfo.class_name;
- } else if (p_retinfo.hint == PROPERTY_HINT_RESOURCE_TYPE) {
- p_method.return_type = p_retinfo.hint_string;
- } else if (p_retinfo.type == Variant::NIL && p_retinfo.usage & PROPERTY_USAGE_NIL_IS_VARIANT) {
- p_method.return_type = "Variant";
- } else if (p_retinfo.type == Variant::NIL) {
- p_method.return_type = "void";
- } else {
- p_method.return_type = Variant::get_type_name(p_retinfo.type);
- }
-}
-
-static void argument_doc_from_arginfo(DocData::ArgumentDoc &p_argument, const PropertyInfo &p_arginfo) {
-
- p_argument.name = p_arginfo.name;
-
- if (p_arginfo.type == Variant::INT && p_arginfo.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {
- p_argument.enumeration = p_arginfo.class_name;
- if (p_argument.enumeration.begins_with("_")) //proxy class
- p_argument.enumeration = p_argument.enumeration.substr(1, p_argument.enumeration.length());
- p_argument.type = "int";
- } else if (p_arginfo.class_name != StringName()) {
- p_argument.type = p_arginfo.class_name;
- } else if (p_arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE) {
- p_argument.type = p_arginfo.hint_string;
- } else if (p_arginfo.type == Variant::NIL) {
- // Parameters cannot be void, so PROPERTY_USAGE_NIL_IS_VARIANT is not necessary
- p_argument.type = "Variant";
- } else {
- p_argument.type = Variant::get_type_name(p_arginfo.type);
- }
-}
-
-static Variant get_documentation_default_value(const StringName &p_class_name, const StringName &p_property_name, bool &r_default_value_valid) {
-
- Variant default_value = Variant();
- r_default_value_valid = false;
-
- if (ClassDB::can_instance(p_class_name)) {
- default_value = ClassDB::class_get_default_property_value(p_class_name, p_property_name, &r_default_value_valid);
- } else {
- // Cannot get default value of classes that can't be instanced
- List<StringName> inheriting_classes;
- ClassDB::get_direct_inheriters_from_class(p_class_name, &inheriting_classes);
- for (List<StringName>::Element *E2 = inheriting_classes.front(); E2; E2 = E2->next()) {
- if (ClassDB::can_instance(E2->get())) {
- default_value = ClassDB::class_get_default_property_value(E2->get(), p_property_name, &r_default_value_valid);
- if (r_default_value_valid)
- break;
- }
- }
- }
-
- return default_value;
-}
-
-void DocData::generate(bool p_basic_types) {
-
- List<StringName> classes;
- ClassDB::get_class_list(&classes);
- classes.sort_custom<StringName::AlphCompare>();
- // Move ProjectSettings, so that other classes can register properties there.
- classes.move_to_back(classes.find("ProjectSettings"));
-
- bool skip_setter_getter_methods = true;
-
- while (classes.size()) {
-
- Set<StringName> setters_getters;
-
- String name = classes.front()->get();
- String cname = name;
- if (cname.begins_with("_")) //proxy class
- cname = cname.substr(1, name.length());
-
- class_list[cname] = ClassDoc();
- ClassDoc &c = class_list[cname];
- c.name = cname;
- c.inherits = ClassDB::get_parent_class(name);
-
- List<PropertyInfo> properties;
- List<PropertyInfo> own_properties;
- if (name == "ProjectSettings") {
- //special case for project settings, so settings can be documented
- ProjectSettings::get_singleton()->get_property_list(&properties);
- own_properties = properties;
- } else {
- ClassDB::get_property_list(name, &properties);
- ClassDB::get_property_list(name, &own_properties, true);
- }
-
- List<PropertyInfo>::Element *EO = own_properties.front();
- for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
- bool inherited = EO == NULL;
- if (EO && EO->get() == E->get()) {
- inherited = false;
- EO = EO->next();
- }
-
- if (E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_INTERNAL)
- continue;
-
- PropertyDoc prop;
-
- prop.name = E->get().name;
-
- prop.overridden = inherited;
-
- bool default_value_valid = false;
- Variant default_value;
-
- if (name == "ProjectSettings") {
- // Special case for project settings, so that settings are not taken from the current project's settings
- if (E->get().name == "script" ||
- ProjectSettings::get_singleton()->get_order(E->get().name) >= ProjectSettings::NO_BUILTIN_ORDER_BASE) {
- continue;
- }
- if (E->get().usage & PROPERTY_USAGE_EDITOR) {
- default_value = ProjectSettings::get_singleton()->property_get_revert(E->get().name);
- default_value_valid = true;
- }
- } else {
- default_value = get_documentation_default_value(name, E->get().name, default_value_valid);
-
- if (inherited) {
- bool base_default_value_valid = false;
- Variant base_default_value = get_documentation_default_value(ClassDB::get_parent_class(name), E->get().name, base_default_value_valid);
- if (!default_value_valid || !base_default_value_valid || default_value == base_default_value)
- continue;
- }
- }
-
- if (default_value_valid && default_value.get_type() != Variant::OBJECT) {
- prop.default_value = default_value.get_construct_string().replace("\n", "");
- }
-
- StringName setter = ClassDB::get_property_setter(name, E->get().name);
- StringName getter = ClassDB::get_property_getter(name, E->get().name);
-
- prop.setter = setter;
- prop.getter = getter;
-
- bool found_type = false;
- if (getter != StringName()) {
- MethodBind *mb = ClassDB::get_method(name, getter);
- if (mb) {
- PropertyInfo retinfo = mb->get_return_info();
-
- found_type = true;
- if (retinfo.type == Variant::INT && retinfo.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {
- prop.enumeration = retinfo.class_name;
- prop.type = "int";
- } else if (retinfo.class_name != StringName()) {
- prop.type = retinfo.class_name;
- } else if (retinfo.hint == PROPERTY_HINT_RESOURCE_TYPE) {
-
- prop.type = retinfo.hint_string;
- } else if (retinfo.type == Variant::NIL && retinfo.usage & PROPERTY_USAGE_NIL_IS_VARIANT) {
-
- prop.type = "Variant";
- } else if (retinfo.type == Variant::NIL) {
- prop.type = "void";
- } else {
- prop.type = Variant::get_type_name(retinfo.type);
- }
- }
-
- setters_getters.insert(getter);
- }
-
- if (setter != StringName()) {
-
- setters_getters.insert(setter);
- }
-
- if (!found_type) {
-
- if (E->get().type == Variant::OBJECT && E->get().hint == PROPERTY_HINT_RESOURCE_TYPE)
- prop.type = E->get().hint_string;
- else
- prop.type = Variant::get_type_name(E->get().type);
- }
-
- c.properties.push_back(prop);
- }
-
- List<MethodInfo> method_list;
- ClassDB::get_method_list(name, &method_list, true);
- method_list.sort();
-
- for (List<MethodInfo>::Element *E = method_list.front(); E; E = E->next()) {
-
- if (E->get().name == "" || (E->get().name[0] == '_' && !(E->get().flags & METHOD_FLAG_VIRTUAL)))
- continue; //hidden, don't count
-
- if (skip_setter_getter_methods && setters_getters.has(E->get().name)) {
- // Don't skip parametric setters and getters, i.e. method which require
- // one or more parameters to define what property should be set or retrieved.
- // E.g. CPUParticles::set_param(Parameter param, float value).
- if (E->get().arguments.size() == 0 /* getter */ || (E->get().arguments.size() == 1 && E->get().return_val.type == Variant::NIL /* setter */)) {
- continue;
- }
- }
-
- MethodDoc method;
-
- method.name = E->get().name;
-
- if (E->get().flags & METHOD_FLAG_VIRTUAL)
- method.qualifiers = "virtual";
-
- if (E->get().flags & METHOD_FLAG_CONST) {
- if (method.qualifiers != "")
- method.qualifiers += " ";
- method.qualifiers += "const";
- } else if (E->get().flags & METHOD_FLAG_VARARG) {
- if (method.qualifiers != "")
- method.qualifiers += " ";
- method.qualifiers += "vararg";
- }
-
- for (int i = -1; i < E->get().arguments.size(); i++) {
-
- if (i == -1) {
-#ifdef DEBUG_METHODS_ENABLED
- return_doc_from_retinfo(method, E->get().return_val);
-#endif
- } else {
-
- const PropertyInfo &arginfo = E->get().arguments[i];
- ArgumentDoc argument;
- argument_doc_from_arginfo(argument, arginfo);
-
- int darg_idx = i - (E->get().arguments.size() - E->get().default_arguments.size());
- if (darg_idx >= 0) {
- Variant default_arg = E->get().default_arguments[darg_idx];
- argument.default_value = default_arg.get_construct_string();
- }
-
- method.arguments.push_back(argument);
- }
- }
-
- c.methods.push_back(method);
- }
-
- List<MethodInfo> signal_list;
- ClassDB::get_signal_list(name, &signal_list, true);
-
- if (signal_list.size()) {
-
- for (List<MethodInfo>::Element *EV = signal_list.front(); EV; EV = EV->next()) {
-
- MethodDoc signal;
- signal.name = EV->get().name;
- for (int i = 0; i < EV->get().arguments.size(); i++) {
-
- const PropertyInfo &arginfo = EV->get().arguments[i];
- ArgumentDoc argument;
- argument_doc_from_arginfo(argument, arginfo);
-
- signal.arguments.push_back(argument);
- }
-
- c.signals.push_back(signal);
- }
- }
-
- List<String> constant_list;
- ClassDB::get_integer_constant_list(name, &constant_list, true);
-
- for (List<String>::Element *E = constant_list.front(); E; E = E->next()) {
-
- ConstantDoc constant;
- constant.name = E->get();
- constant.value = itos(ClassDB::get_integer_constant(name, E->get()));
- constant.enumeration = ClassDB::get_integer_constant_enum(name, E->get());
- c.constants.push_back(constant);
- }
-
- //theme stuff
-
- {
- List<StringName> l;
- Theme::get_default()->get_constant_list(cname, &l);
- for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
-
- PropertyDoc pd;
- pd.name = E->get();
- pd.type = "int";
- pd.default_value = itos(Theme::get_default()->get_constant(E->get(), cname));
- c.theme_properties.push_back(pd);
- }
-
- l.clear();
- Theme::get_default()->get_color_list(cname, &l);
- for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
-
- PropertyDoc pd;
- pd.name = E->get();
- pd.type = "Color";
- pd.default_value = Variant(Theme::get_default()->get_color(E->get(), cname)).get_construct_string();
- c.theme_properties.push_back(pd);
- }
-
- l.clear();
- Theme::get_default()->get_icon_list(cname, &l);
- for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
-
- PropertyDoc pd;
- pd.name = E->get();
- pd.type = "Texture";
- c.theme_properties.push_back(pd);
- }
- l.clear();
- Theme::get_default()->get_font_list(cname, &l);
- for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
-
- PropertyDoc pd;
- pd.name = E->get();
- pd.type = "Font";
- c.theme_properties.push_back(pd);
- }
- l.clear();
- Theme::get_default()->get_stylebox_list(cname, &l);
- for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
-
- PropertyDoc pd;
- pd.name = E->get();
- pd.type = "StyleBox";
- c.theme_properties.push_back(pd);
- }
- }
-
- classes.pop_front();
- }
-
- {
- // So we can document the concept of Variant even if it's not a usable class per se.
- class_list["Variant"] = ClassDoc();
- class_list["Variant"].name = "Variant";
- }
-
- if (!p_basic_types)
- return;
-
- // Add Variant types.
- for (int i = 0; i < Variant::VARIANT_MAX; i++) {
- if (i == Variant::NIL)
- continue; // Not exposed outside of 'null', should not be in class list.
- if (i == Variant::OBJECT)
- continue; // Use the core type instead.
-
- String cname = Variant::get_type_name(Variant::Type(i));
-
- class_list[cname] = ClassDoc();
- ClassDoc &c = class_list[cname];
- c.name = cname;
-
- Variant::CallError cerror;
- Variant v = Variant::construct(Variant::Type(i), NULL, 0, cerror);
-
- List<MethodInfo> method_list;
- v.get_method_list(&method_list);
- method_list.sort();
- Variant::get_constructor_list(Variant::Type(i), &method_list);
-
- for (List<MethodInfo>::Element *E = method_list.front(); E; E = E->next()) {
-
- MethodInfo &mi = E->get();
- MethodDoc method;
-
- method.name = mi.name;
-
- for (int j = 0; j < mi.arguments.size(); j++) {
-
- PropertyInfo arginfo = mi.arguments[j];
- ArgumentDoc ad;
- argument_doc_from_arginfo(ad, mi.arguments[j]);
- ad.name = arginfo.name;
-
- int defarg = mi.default_arguments.size() - mi.arguments.size() + j;
- if (defarg >= 0)
- ad.default_value = mi.default_arguments[defarg];
-
- method.arguments.push_back(ad);
- }
-
- if (mi.return_val.type == Variant::NIL) {
- if (mi.return_val.name != "")
- method.return_type = "Variant";
- } else {
- method.return_type = Variant::get_type_name(mi.return_val.type);
- }
-
- c.methods.push_back(method);
- }
-
- List<PropertyInfo> properties;
- v.get_property_list(&properties);
- for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
-
- PropertyInfo pi = E->get();
- PropertyDoc property;
- property.name = pi.name;
- property.type = Variant::get_type_name(pi.type);
- property.default_value = v.get(pi.name).get_construct_string();
-
- c.properties.push_back(property);
- }
-
- List<StringName> constants;
- Variant::get_constants_for_type(Variant::Type(i), &constants);
-
- for (List<StringName>::Element *E = constants.front(); E; E = E->next()) {
-
- ConstantDoc constant;
- constant.name = E->get();
- Variant value = Variant::get_constant_value(Variant::Type(i), E->get());
- constant.value = value.get_type() == Variant::INT ? itos(value) : value.get_construct_string();
- c.constants.push_back(constant);
- }
- }
-
- //built in constants and functions
-
- {
-
- String cname = "@GlobalScope";
- class_list[cname] = ClassDoc();
- ClassDoc &c = class_list[cname];
- c.name = cname;
-
- for (int i = 0; i < GlobalConstants::get_global_constant_count(); i++) {
-
- ConstantDoc cd;
- cd.name = GlobalConstants::get_global_constant_name(i);
- cd.value = itos(GlobalConstants::get_global_constant_value(i));
- cd.enumeration = GlobalConstants::get_global_constant_enum(i);
- c.constants.push_back(cd);
- }
-
- List<Engine::Singleton> singletons;
- Engine::get_singleton()->get_singletons(&singletons);
-
- //servers (this is kind of hackish)
- for (List<Engine::Singleton>::Element *E = singletons.front(); E; E = E->next()) {
-
- PropertyDoc pd;
- Engine::Singleton &s = E->get();
- if (!s.ptr) {
- continue;
- }
- pd.name = s.name;
- pd.type = s.ptr->get_class();
- while (String(ClassDB::get_parent_class(pd.type)) != "Object")
- pd.type = ClassDB::get_parent_class(pd.type);
- if (pd.type.begins_with("_"))
- pd.type = pd.type.substr(1, pd.type.length());
- c.properties.push_back(pd);
- }
- }
-
- //built in script reference
-
- {
-
- for (int i = 0; i < ScriptServer::get_language_count(); i++) {
-
- ScriptLanguage *lang = ScriptServer::get_language(i);
- String cname = "@" + lang->get_name();
- class_list[cname] = ClassDoc();
- ClassDoc &c = class_list[cname];
- c.name = cname;
-
- List<MethodInfo> minfo;
-
- lang->get_public_functions(&minfo);
-
- for (List<MethodInfo>::Element *E = minfo.front(); E; E = E->next()) {
-
- MethodInfo &mi = E->get();
- MethodDoc md;
- md.name = mi.name;
-
- if (mi.flags & METHOD_FLAG_VARARG) {
- if (md.qualifiers != "")
- md.qualifiers += " ";
- md.qualifiers += "vararg";
- }
-
- return_doc_from_retinfo(md, mi.return_val);
-
- for (int j = 0; j < mi.arguments.size(); j++) {
-
- ArgumentDoc ad;
- argument_doc_from_arginfo(ad, mi.arguments[j]);
-
- int darg_idx = j - (mi.arguments.size() - mi.default_arguments.size());
-
- if (darg_idx >= 0) {
- Variant default_arg = E->get().default_arguments[darg_idx];
- ad.default_value = default_arg.get_construct_string();
- }
-
- md.arguments.push_back(ad);
- }
-
- c.methods.push_back(md);
- }
-
- List<Pair<String, Variant> > cinfo;
- lang->get_public_constants(&cinfo);
-
- for (List<Pair<String, Variant> >::Element *E = cinfo.front(); E; E = E->next()) {
-
- ConstantDoc cd;
- cd.name = E->get().first;
- cd.value = E->get().second;
- c.constants.push_back(cd);
- }
- }
- }
-}
-
-static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> &methods) {
-
- String section = parser->get_node_name();
- String element = section.substr(0, section.length() - 1);
-
- while (parser->read() == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
-
- if (parser->get_node_name() == element) {
-
- DocData::MethodDoc method;
- ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
- method.name = parser->get_attribute_value("name");
- if (parser->has_attribute("qualifiers"))
- method.qualifiers = parser->get_attribute_value("qualifiers");
-
- while (parser->read() == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name = parser->get_node_name();
- if (name == "return") {
-
- ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
- method.return_type = parser->get_attribute_value("type");
- if (parser->has_attribute("enum")) {
- method.return_enum = parser->get_attribute_value("enum");
- }
- } else if (name == "argument") {
-
- DocData::ArgumentDoc argument;
- ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
- argument.name = parser->get_attribute_value("name");
- ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
- argument.type = parser->get_attribute_value("type");
- if (parser->has_attribute("enum")) {
- argument.enumeration = parser->get_attribute_value("enum");
- }
-
- method.arguments.push_back(argument);
-
- } else if (name == "description") {
-
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- method.description = parser->get_node_data();
- }
-
- } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == element)
- break;
- }
-
- methods.push_back(method);
-
- } else {
- ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + parser->get_node_name() + ".");
- }
-
- } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == section)
- break;
- }
-
- return OK;
-}
-
-Error DocData::load_classes(const String &p_dir) {
-
- Error err;
- DirAccessRef da = DirAccess::open(p_dir, &err);
- if (!da) {
- return err;
- }
-
- da->list_dir_begin();
- String path;
- path = da->get_next();
- while (path != String()) {
- if (!da->current_is_dir() && path.ends_with("xml")) {
- Ref<XMLParser> parser = memnew(XMLParser);
- Error err2 = parser->open(p_dir.plus_file(path));
- if (err2)
- return err2;
-
- _load(parser);
- }
- path = da->get_next();
- }
-
- da->list_dir_end();
-
- return OK;
-}
-Error DocData::erase_classes(const String &p_dir) {
-
- Error err;
- DirAccessRef da = DirAccess::open(p_dir, &err);
- if (!da) {
- return err;
- }
-
- List<String> to_erase;
-
- da->list_dir_begin();
- String path;
- path = da->get_next();
- while (path != String()) {
- if (!da->current_is_dir() && path.ends_with("xml")) {
- to_erase.push_back(path);
- }
- path = da->get_next();
- }
- da->list_dir_end();
-
- while (to_erase.size()) {
- da->remove(to_erase.front()->get());
- to_erase.pop_front();
- }
-
- return OK;
-}
-Error DocData::_load(Ref<XMLParser> parser) {
-
- Error err = OK;
-
- while ((err = parser->read()) == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT && parser->get_node_name() == "?xml") {
- parser->skip_section();
- }
-
- if (parser->get_node_type() != XMLParser::NODE_ELEMENT)
- continue; //no idea what this may be, but skipping anyway
-
- ERR_FAIL_COND_V(parser->get_node_name() != "class", ERR_FILE_CORRUPT);
-
- ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
- String name = parser->get_attribute_value("name");
- class_list[name] = ClassDoc();
- ClassDoc &c = class_list[name];
-
- c.name = name;
- if (parser->has_attribute("inherits"))
- c.inherits = parser->get_attribute_value("inherits");
-
- while (parser->read() == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name2 = parser->get_node_name();
-
- if (name2 == "brief_description") {
-
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- c.brief_description = parser->get_node_data();
-
- } else if (name2 == "description") {
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- c.description = parser->get_node_data();
- } else if (name2 == "tutorials") {
- while (parser->read() == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name3 = parser->get_node_name();
-
- if (name3 == "link") {
-
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- c.tutorials.push_back(parser->get_node_data().strip_edges());
- } else {
- ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
- }
- } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "tutorials")
- break; // End of <tutorials>.
- }
- } else if (name2 == "methods") {
-
- Error err2 = _parse_methods(parser, c.methods);
- ERR_FAIL_COND_V(err2, err2);
-
- } else if (name2 == "signals") {
-
- Error err2 = _parse_methods(parser, c.signals);
- ERR_FAIL_COND_V(err2, err2);
- } else if (name2 == "members") {
-
- while (parser->read() == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name3 = parser->get_node_name();
-
- if (name3 == "member") {
-
- PropertyDoc prop2;
-
- ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
- prop2.name = parser->get_attribute_value("name");
- ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
- prop2.type = parser->get_attribute_value("type");
- if (parser->has_attribute("setter"))
- prop2.setter = parser->get_attribute_value("setter");
- if (parser->has_attribute("getter"))
- prop2.getter = parser->get_attribute_value("getter");
- if (parser->has_attribute("enum"))
- prop2.enumeration = parser->get_attribute_value("enum");
- if (!parser->is_empty()) {
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- prop2.description = parser->get_node_data();
- }
- c.properties.push_back(prop2);
- } else {
- ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
- }
-
- } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "members")
- break; // End of <members>.
- }
-
- } else if (name2 == "theme_items") {
-
- while (parser->read() == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name3 = parser->get_node_name();
-
- if (name3 == "theme_item") {
-
- PropertyDoc prop2;
-
- ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
- prop2.name = parser->get_attribute_value("name");
- ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
- prop2.type = parser->get_attribute_value("type");
- if (!parser->is_empty()) {
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- prop2.description = parser->get_node_data();
- }
- c.theme_properties.push_back(prop2);
- } else {
- ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
- }
-
- } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "theme_items")
- break; // End of <theme_items>.
- }
-
- } else if (name2 == "constants") {
-
- while (parser->read() == OK) {
-
- if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
-
- String name3 = parser->get_node_name();
-
- if (name3 == "constant") {
-
- ConstantDoc constant2;
- ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
- constant2.name = parser->get_attribute_value("name");
- ERR_FAIL_COND_V(!parser->has_attribute("value"), ERR_FILE_CORRUPT);
- constant2.value = parser->get_attribute_value("value");
- if (parser->has_attribute("enum")) {
- constant2.enumeration = parser->get_attribute_value("enum");
- }
- if (!parser->is_empty()) {
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- constant2.description = parser->get_node_data();
- }
- c.constants.push_back(constant2);
- } else {
- ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
- }
-
- } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "constants")
- break; // End of <constants>.
- }
-
- } else {
-
- ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name2 + ".");
- }
-
- } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "class")
- break; // End of <class>.
- }
- }
-
- return OK;
-}
-
-static void _write_string(FileAccess *f, int p_tablevel, const String &p_string) {
-
- if (p_string == "")
- return;
- String tab;
- for (int i = 0; i < p_tablevel; i++)
- tab += "\t";
- f->store_string(tab + p_string + "\n");
-}
-
-Error DocData::save_classes(const String &p_default_path, const Map<String, String> &p_class_path) {
-
- for (Map<String, ClassDoc>::Element *E = class_list.front(); E; E = E->next()) {
-
- ClassDoc &c = E->get();
-
- String save_path;
- if (p_class_path.has(c.name)) {
- save_path = p_class_path[c.name];
- } else {
- save_path = p_default_path;
- }
-
- Error err;
- String save_file = save_path.plus_file(c.name + ".xml");
- FileAccessRef f = FileAccess::open(save_file, FileAccess::WRITE, &err);
-
- ERR_CONTINUE_MSG(err != OK, "Can't write doc file: " + save_file + ".");
-
- _write_string(f, 0, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
-
- String header = "<class name=\"" + c.name + "\"";
- if (c.inherits != "")
- header += " inherits=\"" + c.inherits + "\"";
- header += String(" version=\"") + VERSION_NUMBER + "\"";
- header += ">";
- _write_string(f, 0, header);
-
- _write_string(f, 1, "<brief_description>");
- _write_string(f, 2, c.brief_description.strip_edges().xml_escape());
- _write_string(f, 1, "</brief_description>");
-
- _write_string(f, 1, "<description>");
- _write_string(f, 2, c.description.strip_edges().xml_escape());
- _write_string(f, 1, "</description>");
-
- _write_string(f, 1, "<tutorials>");
- for (int i = 0; i < c.tutorials.size(); i++) {
- _write_string(f, 2, "<link>" + c.tutorials.get(i).xml_escape() + "</link>");
- }
- _write_string(f, 1, "</tutorials>");
-
- _write_string(f, 1, "<methods>");
-
- c.methods.sort();
-
- for (int i = 0; i < c.methods.size(); i++) {
-
- const MethodDoc &m = c.methods[i];
-
- String qualifiers;
- if (m.qualifiers != "")
- qualifiers += " qualifiers=\"" + m.qualifiers.xml_escape() + "\"";
-
- _write_string(f, 2, "<method name=\"" + m.name + "\"" + qualifiers + ">");
-
- if (m.return_type != "") {
-
- String enum_text;
- if (m.return_enum != String()) {
- enum_text = " enum=\"" + m.return_enum + "\"";
- }
- _write_string(f, 3, "<return type=\"" + m.return_type + "\"" + enum_text + ">");
- _write_string(f, 3, "</return>");
- }
-
- for (int j = 0; j < m.arguments.size(); j++) {
-
- const ArgumentDoc &a = m.arguments[j];
-
- String enum_text;
- if (a.enumeration != String()) {
- enum_text = " enum=\"" + a.enumeration + "\"";
- }
-
- if (a.default_value != "")
- _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\"" + enum_text + " default=\"" + a.default_value.xml_escape(true) + "\">");
- else
- _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\"" + enum_text + ">");
-
- _write_string(f, 3, "</argument>");
- }
-
- _write_string(f, 3, "<description>");
- _write_string(f, 4, m.description.strip_edges().xml_escape());
- _write_string(f, 3, "</description>");
-
- _write_string(f, 2, "</method>");
- }
-
- _write_string(f, 1, "</methods>");
-
- if (c.properties.size()) {
- _write_string(f, 1, "<members>");
-
- c.properties.sort();
-
- for (int i = 0; i < c.properties.size(); i++) {
-
- String additional_attributes;
- if (c.properties[i].enumeration != String()) {
- additional_attributes += " enum=\"" + c.properties[i].enumeration + "\"";
- }
- if (c.properties[i].default_value != String()) {
- additional_attributes += " default=\"" + c.properties[i].default_value.xml_escape(true) + "\"";
- }
-
- const PropertyDoc &p = c.properties[i];
-
- if (c.properties[i].overridden) {
- _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\" override=\"true\"" + additional_attributes + " />");
- } else {
- _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\"" + additional_attributes + ">");
- _write_string(f, 3, p.description.strip_edges().xml_escape());
- _write_string(f, 2, "</member>");
- }
- }
- _write_string(f, 1, "</members>");
- }
-
- if (c.signals.size()) {
-
- c.signals.sort();
-
- _write_string(f, 1, "<signals>");
- for (int i = 0; i < c.signals.size(); i++) {
-
- const MethodDoc &m = c.signals[i];
- _write_string(f, 2, "<signal name=\"" + m.name + "\">");
- for (int j = 0; j < m.arguments.size(); j++) {
-
- const ArgumentDoc &a = m.arguments[j];
- _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\">");
- _write_string(f, 3, "</argument>");
- }
-
- _write_string(f, 3, "<description>");
- _write_string(f, 4, m.description.strip_edges().xml_escape());
- _write_string(f, 3, "</description>");
-
- _write_string(f, 2, "</signal>");
- }
-
- _write_string(f, 1, "</signals>");
- }
-
- _write_string(f, 1, "<constants>");
-
- for (int i = 0; i < c.constants.size(); i++) {
-
- const ConstantDoc &k = c.constants[i];
- if (k.enumeration != String()) {
- _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\">");
- } else {
- _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\">");
- }
- _write_string(f, 3, k.description.strip_edges().xml_escape());
- _write_string(f, 2, "</constant>");
- }
-
- _write_string(f, 1, "</constants>");
-
- if (c.theme_properties.size()) {
-
- c.theme_properties.sort();
-
- _write_string(f, 1, "<theme_items>");
- for (int i = 0; i < c.theme_properties.size(); i++) {
-
- const PropertyDoc &p = c.theme_properties[i];
-
- if (p.default_value != "")
- _write_string(f, 2, "<theme_item name=\"" + p.name + "\" type=\"" + p.type + "\" default=\"" + p.default_value.xml_escape(true) + "\">");
- else
- _write_string(f, 2, "<theme_item name=\"" + p.name + "\" type=\"" + p.type + "\">");
-
- _write_string(f, 3, p.description.strip_edges().xml_escape());
-
- _write_string(f, 2, "</theme_item>");
- }
- _write_string(f, 1, "</theme_items>");
- }
-
- _write_string(f, 0, "</class>");
- }
-
- return OK;
-}
-
-Error DocData::load_compressed(const uint8_t *p_data, int p_compressed_size, int p_uncompressed_size) {
-
- Vector<uint8_t> data;
- data.resize(p_uncompressed_size);
- Compression::decompress(data.ptrw(), p_uncompressed_size, p_data, p_compressed_size, Compression::MODE_DEFLATE);
- class_list.clear();
-
- Ref<XMLParser> parser = memnew(XMLParser);
- Error err = parser->open_buffer(data);
- if (err)
- return err;
-
- _load(parser);
-
- return OK;
-}
diff --git a/editor/doc/doc_data.h b/editor/doc/doc_data.h
deleted file mode 100644
index 073705f0b1..0000000000
--- a/editor/doc/doc_data.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*************************************************************************/
-/* doc_data.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef DOC_DATA_H
-#define DOC_DATA_H
-
-#include "core/io/xml_parser.h"
-#include "core/map.h"
-#include "core/variant.h"
-
-class DocData {
-public:
- struct ArgumentDoc {
-
- String name;
- String type;
- String enumeration;
- String default_value;
- };
-
- struct MethodDoc {
-
- String name;
- String return_type;
- String return_enum;
- String qualifiers;
- String description;
- Vector<ArgumentDoc> arguments;
- bool operator<(const MethodDoc &p_md) const {
- return name < p_md.name;
- }
- };
-
- struct ConstantDoc {
-
- String name;
- String value;
- String enumeration;
- String description;
- };
-
- struct PropertyDoc {
-
- String name;
- String type;
- String enumeration;
- String description;
- String setter, getter;
- String default_value;
- bool overridden;
- bool operator<(const PropertyDoc &p_prop) const {
- return name < p_prop.name;
- }
- PropertyDoc() {
- overridden = false;
- }
- };
-
- struct ClassDoc {
-
- String name;
- String inherits;
- String category;
- String brief_description;
- String description;
- Vector<String> tutorials;
- Vector<MethodDoc> methods;
- Vector<MethodDoc> signals;
- Vector<ConstantDoc> constants;
- Vector<PropertyDoc> properties;
- Vector<PropertyDoc> theme_properties;
- };
-
- String version;
-
- Map<String, ClassDoc> class_list;
- Error _load(Ref<XMLParser> parser);
-
-public:
- void merge_from(const DocData &p_data);
- void remove_from(const DocData &p_data);
- void generate(bool p_basic_types = false);
- Error load_classes(const String &p_dir);
- static Error erase_classes(const String &p_dir);
- Error save_classes(const String &p_default_path, const Map<String, String> &p_class_path);
-
- Error load_compressed(const uint8_t *p_data, int p_compressed_size, int p_uncompressed_size);
-};
-
-#endif // DOC_DATA_H
diff --git a/editor/doc/doc_dump.cpp b/editor/doc/doc_dump.cpp
deleted file mode 100644
index d7e1d257f2..0000000000
--- a/editor/doc/doc_dump.cpp
+++ /dev/null
@@ -1,303 +0,0 @@
-/*************************************************************************/
-/* doc_dump.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "doc_dump.h"
-
-#include "core/os/file_access.h"
-#include "core/version.h"
-#include "scene/main/node.h"
-
-static void _write_string(FileAccess *f, int p_tablevel, const String &p_string) {
-
- String tab;
- for (int i = 0; i < p_tablevel; i++)
- tab += "\t";
- f->store_string(tab + p_string + "\n");
-}
-
-struct _ConstantSort {
-
- String name;
- int value;
- bool operator<(const _ConstantSort &p_c) const {
-
- String left_a = name.find("_") == -1 ? name : name.substr(0, name.find("_"));
- String left_b = p_c.name.find("_") == -1 ? p_c.name : p_c.name.substr(0, p_c.name.find("_"));
- if (left_a == left_b)
- return value < p_c.value;
- else
- return left_a < left_b;
- }
-};
-
-static String _escape_string(const String &p_str) {
-
- String ret = p_str;
- ret = ret.replace("&", "&amp;");
- ret = ret.replace("<", "&gt;");
- ret = ret.replace(">", "&lt;");
- ret = ret.replace("'", "&apos;");
- ret = ret.replace("\"", "&quot;");
- for (char i = 1; i < 32; i++) {
-
- char chr[2] = { i, 0 };
- ret = ret.replace(chr, "&#" + String::num(i) + ";");
- }
- ret = ret.utf8();
- return ret;
-}
-void DocDump::dump(const String &p_file) {
-
- List<StringName> class_list;
- ClassDB::get_class_list(&class_list);
-
- class_list.sort_custom<StringName::AlphCompare>();
-
- FileAccess *f = FileAccess::open(p_file, FileAccess::WRITE);
-
- _write_string(f, 0, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
- _write_string(f, 0, String("<doc version=\"") + VERSION_NUMBER + "\" name=\"Engine Types\">");
-
- while (class_list.size()) {
-
- String name = class_list.front()->get();
-
- String header = "<class name=\"" + name + "\"";
- String inherits = ClassDB::get_parent_class(name);
- if (inherits != "")
- header += " inherits=\"" + inherits + "\"";
- _write_string(f, 0, header);
-
- _write_string(f, 1, "<brief_description>");
- _write_string(f, 1, "</brief_description>");
-
- _write_string(f, 1, "<description>");
- _write_string(f, 1, "</description>");
-
- _write_string(f, 1, "<methods>");
-
- List<MethodInfo> method_list;
- ClassDB::get_method_list(name, &method_list, true);
- method_list.sort();
-
- for (List<MethodInfo>::Element *E = method_list.front(); E; E = E->next()) {
- if (E->get().name == "" || E->get().name[0] == '_')
- continue; //hidden
-
- MethodBind *m = ClassDB::get_method(name, E->get().name);
-
- String qualifiers;
- if (E->get().flags & METHOD_FLAG_CONST)
- qualifiers += "qualifiers=\"const\"";
-
- _write_string(f, 2, "<method name=\"" + _escape_string(E->get().name) + "\" " + qualifiers + " >");
-
- for (int i = -1; i < E->get().arguments.size(); i++) {
-
- PropertyInfo arginfo;
-
- if (i == -1) {
-
- arginfo = E->get().return_val;
- String type_name = (arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE) ? arginfo.hint_string : Variant::get_type_name(arginfo.type);
-
- if (arginfo.type == Variant::NIL)
- continue;
- _write_string(f, 3, "<return type=\"" + type_name + "\">");
- } else {
-
- arginfo = E->get().arguments[i];
-
- String type_name;
-
- if (arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE)
- type_name = arginfo.hint_string;
- else if (arginfo.type == Variant::NIL)
- type_name = "Variant";
- else
- type_name = Variant::get_type_name(arginfo.type);
-
- if (m && m->has_default_argument(i)) {
- Variant default_arg = m->get_default_argument(i);
- String default_arg_text = String(_escape_string(m->get_default_argument(i)));
-
- switch (default_arg.get_type()) {
-
- case Variant::NIL:
- default_arg_text = "NULL";
- break;
- // atomic types
- case Variant::BOOL:
- if (bool(default_arg))
- default_arg_text = "true";
- else
- default_arg_text = "false";
- break;
- case Variant::INT:
- case Variant::REAL:
- //keep it
- break;
- case Variant::STRING:
- case Variant::NODE_PATH:
- default_arg_text = "\"" + default_arg_text + "\"";
- break;
- case Variant::TRANSFORM:
- if (default_arg.operator Transform() == Transform()) {
- default_arg_text = "";
- }
-
- default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")";
- break;
-
- case Variant::VECTOR2:
- case Variant::RECT2:
- case Variant::VECTOR3:
- case Variant::PLANE:
- case Variant::QUAT:
- case Variant::AABB:
- case Variant::BASIS:
- case Variant::COLOR:
- case Variant::POOL_BYTE_ARRAY:
- case Variant::POOL_INT_ARRAY:
- case Variant::POOL_REAL_ARRAY:
- case Variant::POOL_STRING_ARRAY:
- case Variant::POOL_VECTOR3_ARRAY:
- case Variant::POOL_COLOR_ARRAY:
- default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")";
- break;
- case Variant::OBJECT:
- case Variant::DICTIONARY: // 20
- case Variant::ARRAY:
- case Variant::_RID:
-
- default: {
- }
- }
-
- _write_string(f, 3, "<argument index=\"" + itos(i) + "\" name=\"" + _escape_string(arginfo.name) + "\" type=\"" + type_name + "\" default=\"" + _escape_string(default_arg_text) + "\">");
- } else
- _write_string(f, 3, "<argument index=\"" + itos(i) + "\" name=\"" + arginfo.name + "\" type=\"" + type_name + "\">");
- }
-
- String hint;
- switch (arginfo.hint) {
- case PROPERTY_HINT_DIR: hint = "A directory."; break;
- case PROPERTY_HINT_RANGE: hint = "Range - min: " + arginfo.hint_string.get_slice(",", 0) + " max: " + arginfo.hint_string.get_slice(",", 1) + " step: " + arginfo.hint_string.get_slice(",", 2); break;
- case PROPERTY_HINT_ENUM:
- hint = "Values: ";
- for (int j = 0; j < arginfo.hint_string.get_slice_count(","); j++) {
- if (j > 0) hint += ", ";
- hint += arginfo.hint_string.get_slice(",", j) + "=" + itos(j);
- }
- break;
- case PROPERTY_HINT_LENGTH: hint = "Length: " + arginfo.hint_string; break;
- case PROPERTY_HINT_FLAGS:
- hint = "Values: ";
- for (int j = 0; j < arginfo.hint_string.get_slice_count(","); j++) {
- if (j > 0) hint += ", ";
- hint += arginfo.hint_string.get_slice(",", j) + "=" + itos((uint64_t)1 << j);
- }
- break;
- case PROPERTY_HINT_FILE: hint = "A file:"; break;
- default: {
- }
- //case PROPERTY_HINT_RESOURCE_TYPE: hint="Type: "+arginfo.hint_string; break;
- };
- if (hint != "")
- _write_string(f, 4, hint);
-
- _write_string(f, 3, (i == -1) ? "</return>" : "</argument>");
- }
-
- _write_string(f, 3, "<description>");
- _write_string(f, 3, "</description>");
-
- _write_string(f, 2, "</method>");
- }
-
- _write_string(f, 1, "</methods>");
-
- List<MethodInfo> signal_list;
- ClassDB::get_signal_list(name, &signal_list, true);
-
- if (signal_list.size()) {
-
- _write_string(f, 1, "<signals>");
- for (List<MethodInfo>::Element *EV = signal_list.front(); EV; EV = EV->next()) {
-
- _write_string(f, 2, "<signal name=\"" + EV->get().name + "\">");
- for (int i = 0; i < EV->get().arguments.size(); i++) {
- PropertyInfo arginfo = EV->get().arguments[i];
- _write_string(f, 3, "<argument index=\"" + itos(i) + "\" name=\"" + arginfo.name + "\" type=\"" + Variant::get_type_name(arginfo.type) + "\">");
- _write_string(f, 3, "</argument>");
- }
- _write_string(f, 3, "<description>");
- _write_string(f, 3, "</description>");
-
- _write_string(f, 2, "</signal>");
- }
-
- _write_string(f, 1, "</signals>");
- }
-
- _write_string(f, 1, "<constants>");
-
- List<String> constant_list;
- ClassDB::get_integer_constant_list(name, &constant_list, true);
-
- /* constants are sorted in a special way */
-
- List<_ConstantSort> constant_sort;
-
- for (List<String>::Element *E = constant_list.front(); E; E = E->next()) {
- _ConstantSort cs;
- cs.name = E->get();
- cs.value = ClassDB::get_integer_constant(name, E->get());
- constant_sort.push_back(cs);
- }
-
- constant_sort.sort();
-
- for (List<_ConstantSort>::Element *E = constant_sort.front(); E; E = E->next()) {
-
- _write_string(f, 2, "<constant name=\"" + E->get().name + "\" value=\"" + itos(E->get().value) + "\">");
- _write_string(f, 2, "</constant>");
- }
-
- _write_string(f, 1, "</constants>");
- _write_string(f, 0, "</class>");
-
- class_list.erase(name);
- }
-
- _write_string(f, 0, "</doc>");
- f->close();
- memdelete(f);
-}
diff --git a/editor/doc/doc_dump.h b/editor/doc/doc_dump.h
deleted file mode 100644
index f8f1b6f805..0000000000
--- a/editor/doc/doc_dump.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*************************************************************************/
-/* doc_dump.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef DOC_DUMP_H
-#define DOC_DUMP_H
-
-#include "core/class_db.h"
-
-class DocDump {
-public:
- static void dump(const String &p_file);
-};
-
-#endif // DOC_DUMP_H
diff --git a/editor/doc_data.cpp b/editor/doc_data.cpp
new file mode 100644
index 0000000000..791b49319a
--- /dev/null
+++ b/editor/doc_data.cpp
@@ -0,0 +1,1250 @@
+/*************************************************************************/
+/* doc_data.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "doc_data.h"
+
+#include "core/engine.h"
+#include "core/global_constants.h"
+#include "core/io/compression.h"
+#include "core/io/marshalls.h"
+#include "core/os/dir_access.h"
+#include "core/project_settings.h"
+#include "core/script_language.h"
+#include "core/version.h"
+#include "scene/resources/theme.h"
+
+// Used for a hack preserving Mono properties on non-Mono builds.
+#include "modules/modules_enabled.gen.h"
+
+void DocData::merge_from(const DocData &p_data) {
+ for (Map<String, ClassDoc>::Element *E = class_list.front(); E; E = E->next()) {
+ ClassDoc &c = E->get();
+
+ if (!p_data.class_list.has(c.name)) {
+ continue;
+ }
+
+ const ClassDoc &cf = p_data.class_list[c.name];
+
+ c.description = cf.description;
+ c.brief_description = cf.brief_description;
+ c.tutorials = cf.tutorials;
+
+ for (int i = 0; i < c.methods.size(); i++) {
+ MethodDoc &m = c.methods.write[i];
+
+ for (int j = 0; j < cf.methods.size(); j++) {
+ if (cf.methods[j].name != m.name) {
+ continue;
+ }
+ if (cf.methods[j].arguments.size() != m.arguments.size()) {
+ continue;
+ }
+ // since polymorphic functions are allowed we need to check the type of
+ // the arguments so we make sure they are different.
+ int arg_count = cf.methods[j].arguments.size();
+ Vector<bool> arg_used;
+ arg_used.resize(arg_count);
+ for (int l = 0; l < arg_count; ++l) {
+ arg_used.write[l] = false;
+ }
+ // also there is no guarantee that argument ordering will match, so we
+ // have to check one by one so we make sure we have an exact match
+ for (int k = 0; k < arg_count; ++k) {
+ for (int l = 0; l < arg_count; ++l) {
+ if (cf.methods[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) {
+ arg_used.write[l] = true;
+ break;
+ }
+ }
+ }
+ bool not_the_same = false;
+ for (int l = 0; l < arg_count; ++l) {
+ if (!arg_used[l]) { // at least one of the arguments was different
+ not_the_same = true;
+ }
+ }
+ if (not_the_same) {
+ continue;
+ }
+
+ const MethodDoc &mf = cf.methods[j];
+
+ m.description = mf.description;
+ break;
+ }
+ }
+
+ for (int i = 0; i < c.signals.size(); i++) {
+ MethodDoc &m = c.signals.write[i];
+
+ for (int j = 0; j < cf.signals.size(); j++) {
+ if (cf.signals[j].name != m.name) {
+ continue;
+ }
+ const MethodDoc &mf = cf.signals[j];
+
+ m.description = mf.description;
+ break;
+ }
+ }
+
+ for (int i = 0; i < c.constants.size(); i++) {
+ ConstantDoc &m = c.constants.write[i];
+
+ for (int j = 0; j < cf.constants.size(); j++) {
+ if (cf.constants[j].name != m.name) {
+ continue;
+ }
+ const ConstantDoc &mf = cf.constants[j];
+
+ m.description = mf.description;
+ break;
+ }
+ }
+
+ for (int i = 0; i < c.properties.size(); i++) {
+ PropertyDoc &p = c.properties.write[i];
+
+ for (int j = 0; j < cf.properties.size(); j++) {
+ if (cf.properties[j].name != p.name) {
+ continue;
+ }
+ const PropertyDoc &pf = cf.properties[j];
+
+ p.description = pf.description;
+ break;
+ }
+ }
+
+ for (int i = 0; i < c.theme_properties.size(); i++) {
+ PropertyDoc &p = c.theme_properties.write[i];
+
+ for (int j = 0; j < cf.theme_properties.size(); j++) {
+ if (cf.theme_properties[j].name != p.name) {
+ continue;
+ }
+ const PropertyDoc &pf = cf.theme_properties[j];
+
+ p.description = pf.description;
+ break;
+ }
+ }
+
+#ifndef MODULE_MONO_ENABLED
+ // The Mono module defines some properties that we want to keep when
+ // re-generating docs with a non-Mono build, to prevent pointless diffs
+ // (and loss of descriptions) depending on the config of the doc writer.
+ // We use a horrible hack to force keeping the relevant properties,
+ // hardcoded below. At least it's an ad hoc hack... ¯\_(ツ)_/¯
+ // Don't show this to your kids.
+ if (c.name == "@GlobalScope") {
+ // Retrieve GodotSharp singleton.
+ for (int j = 0; j < cf.properties.size(); j++) {
+ if (cf.properties[j].name == "GodotSharp") {
+ c.properties.push_back(cf.properties[j]);
+ }
+ }
+ }
+#endif
+ }
+}
+
+void DocData::remove_from(const DocData &p_data) {
+ for (Map<String, ClassDoc>::Element *E = p_data.class_list.front(); E; E = E->next()) {
+ if (class_list.has(E->key())) {
+ class_list.erase(E->key());
+ }
+ }
+}
+
+static void return_doc_from_retinfo(DocData::MethodDoc &p_method, const PropertyInfo &p_retinfo) {
+ if (p_retinfo.type == Variant::INT && p_retinfo.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {
+ p_method.return_enum = p_retinfo.class_name;
+ if (p_method.return_enum.begins_with("_")) { //proxy class
+ p_method.return_enum = p_method.return_enum.substr(1, p_method.return_enum.length());
+ }
+ p_method.return_type = "int";
+ } else if (p_retinfo.class_name != StringName()) {
+ p_method.return_type = p_retinfo.class_name;
+ } else if (p_retinfo.type == Variant::ARRAY && p_retinfo.hint == PROPERTY_HINT_ARRAY_TYPE) {
+ p_method.return_type = p_retinfo.hint_string + "[]";
+ } else if (p_retinfo.hint == PROPERTY_HINT_RESOURCE_TYPE) {
+ p_method.return_type = p_retinfo.hint_string;
+ } else if (p_retinfo.type == Variant::NIL && p_retinfo.usage & PROPERTY_USAGE_NIL_IS_VARIANT) {
+ p_method.return_type = "Variant";
+ } else if (p_retinfo.type == Variant::NIL) {
+ p_method.return_type = "void";
+ } else {
+ p_method.return_type = Variant::get_type_name(p_retinfo.type);
+ }
+}
+
+static void argument_doc_from_arginfo(DocData::ArgumentDoc &p_argument, const PropertyInfo &p_arginfo) {
+ p_argument.name = p_arginfo.name;
+
+ if (p_arginfo.type == Variant::INT && p_arginfo.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {
+ p_argument.enumeration = p_arginfo.class_name;
+ if (p_argument.enumeration.begins_with("_")) { //proxy class
+ p_argument.enumeration = p_argument.enumeration.substr(1, p_argument.enumeration.length());
+ }
+ p_argument.type = "int";
+ } else if (p_arginfo.class_name != StringName()) {
+ p_argument.type = p_arginfo.class_name;
+ } else if (p_arginfo.type == Variant::ARRAY && p_arginfo.hint == PROPERTY_HINT_ARRAY_TYPE) {
+ p_argument.type = p_arginfo.hint_string + "[]";
+ } else if (p_arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE) {
+ p_argument.type = p_arginfo.hint_string;
+ } else if (p_arginfo.type == Variant::NIL) {
+ // Parameters cannot be void, so PROPERTY_USAGE_NIL_IS_VARIANT is not necessary
+ p_argument.type = "Variant";
+ } else {
+ p_argument.type = Variant::get_type_name(p_arginfo.type);
+ }
+}
+
+static Variant get_documentation_default_value(const StringName &p_class_name, const StringName &p_property_name, bool &r_default_value_valid) {
+ Variant default_value = Variant();
+ r_default_value_valid = false;
+
+ if (ClassDB::can_instance(p_class_name)) {
+ default_value = ClassDB::class_get_default_property_value(p_class_name, p_property_name, &r_default_value_valid);
+ } else {
+ // Cannot get default value of classes that can't be instanced
+ List<StringName> inheriting_classes;
+ ClassDB::get_direct_inheriters_from_class(p_class_name, &inheriting_classes);
+ for (List<StringName>::Element *E2 = inheriting_classes.front(); E2; E2 = E2->next()) {
+ if (ClassDB::can_instance(E2->get())) {
+ default_value = ClassDB::class_get_default_property_value(E2->get(), p_property_name, &r_default_value_valid);
+ if (r_default_value_valid) {
+ break;
+ }
+ }
+ }
+ }
+
+ return default_value;
+}
+
+void DocData::generate(bool p_basic_types) {
+ List<StringName> classes;
+ ClassDB::get_class_list(&classes);
+ classes.sort_custom<StringName::AlphCompare>();
+ // Move ProjectSettings, so that other classes can register properties there.
+ classes.move_to_back(classes.find("ProjectSettings"));
+
+ bool skip_setter_getter_methods = true;
+
+ while (classes.size()) {
+ Set<StringName> setters_getters;
+
+ String name = classes.front()->get();
+ if (!ClassDB::is_class_exposed(name)) {
+ print_verbose(vformat("Class '%s' is not exposed, skipping.", name));
+ classes.pop_front();
+ continue;
+ }
+
+ String cname = name;
+ if (cname.begins_with("_")) { //proxy class
+ cname = cname.substr(1, name.length());
+ }
+
+ class_list[cname] = ClassDoc();
+ ClassDoc &c = class_list[cname];
+ c.name = cname;
+ c.inherits = ClassDB::get_parent_class(name);
+
+ List<PropertyInfo> properties;
+ List<PropertyInfo> own_properties;
+ if (name == "ProjectSettings") {
+ //special case for project settings, so settings can be documented
+ ProjectSettings::get_singleton()->get_property_list(&properties);
+ own_properties = properties;
+ } else {
+ ClassDB::get_property_list(name, &properties);
+ ClassDB::get_property_list(name, &own_properties, true);
+ }
+
+ List<PropertyInfo>::Element *EO = own_properties.front();
+ for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
+ bool inherited = EO == nullptr;
+ if (EO && EO->get() == E->get()) {
+ inherited = false;
+ EO = EO->next();
+ }
+
+ if (E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_SUBGROUP || E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_INTERNAL) {
+ continue;
+ }
+
+ PropertyDoc prop;
+
+ prop.name = E->get().name;
+
+ prop.overridden = inherited;
+
+ bool default_value_valid = false;
+ Variant default_value;
+
+ if (name == "ProjectSettings") {
+ // Special case for project settings, so that settings are not taken from the current project's settings
+ if (E->get().name == "script" || !ProjectSettings::get_singleton()->is_builtin_setting(E->get().name)) {
+ continue;
+ }
+ if (E->get().usage & PROPERTY_USAGE_EDITOR) {
+ if (!ProjectSettings::get_singleton()->get_ignore_value_in_docs(E->get().name)) {
+ default_value = ProjectSettings::get_singleton()->property_get_revert(E->get().name);
+ default_value_valid = true;
+ }
+ }
+ } else {
+ default_value = get_documentation_default_value(name, E->get().name, default_value_valid);
+ if (inherited) {
+ bool base_default_value_valid = false;
+ Variant base_default_value = get_documentation_default_value(ClassDB::get_parent_class(name), E->get().name, base_default_value_valid);
+ if (!default_value_valid || !base_default_value_valid || default_value == base_default_value) {
+ continue;
+ }
+ }
+ }
+
+ //used to track uninitialized values using valgrind
+ //print_line("getting default value for " + String(name) + "." + String(E->get().name));
+ if (default_value_valid && default_value.get_type() != Variant::OBJECT) {
+ prop.default_value = default_value.get_construct_string().replace("\n", "");
+ }
+
+ StringName setter = ClassDB::get_property_setter(name, E->get().name);
+ StringName getter = ClassDB::get_property_getter(name, E->get().name);
+
+ prop.setter = setter;
+ prop.getter = getter;
+
+ bool found_type = false;
+ if (getter != StringName()) {
+ MethodBind *mb = ClassDB::get_method(name, getter);
+ if (mb) {
+ PropertyInfo retinfo = mb->get_return_info();
+
+ found_type = true;
+ if (retinfo.type == Variant::INT && retinfo.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {
+ prop.enumeration = retinfo.class_name;
+ prop.type = "int";
+ } else if (retinfo.class_name != StringName()) {
+ prop.type = retinfo.class_name;
+ } else if (retinfo.type == Variant::ARRAY && retinfo.hint == PROPERTY_HINT_ARRAY_TYPE) {
+ prop.type = retinfo.hint_string + "[]";
+ } else if (retinfo.hint == PROPERTY_HINT_RESOURCE_TYPE) {
+ prop.type = retinfo.hint_string;
+ } else if (retinfo.type == Variant::NIL && retinfo.usage & PROPERTY_USAGE_NIL_IS_VARIANT) {
+ prop.type = "Variant";
+ } else if (retinfo.type == Variant::NIL) {
+ prop.type = "void";
+ } else {
+ prop.type = Variant::get_type_name(retinfo.type);
+ }
+ }
+
+ setters_getters.insert(getter);
+ }
+
+ if (setter != StringName()) {
+ setters_getters.insert(setter);
+ }
+
+ if (!found_type) {
+ if (E->get().type == Variant::OBJECT && E->get().hint == PROPERTY_HINT_RESOURCE_TYPE) {
+ prop.type = E->get().hint_string;
+ } else {
+ prop.type = Variant::get_type_name(E->get().type);
+ }
+ }
+
+ c.properties.push_back(prop);
+ }
+
+ List<MethodInfo> method_list;
+ ClassDB::get_method_list(name, &method_list, true);
+ method_list.sort();
+
+ for (List<MethodInfo>::Element *E = method_list.front(); E; E = E->next()) {
+ if (E->get().name == "" || (E->get().name[0] == '_' && !(E->get().flags & METHOD_FLAG_VIRTUAL))) {
+ continue; //hidden, don't count
+ }
+
+ if (skip_setter_getter_methods && setters_getters.has(E->get().name)) {
+ // Don't skip parametric setters and getters, i.e. method which require
+ // one or more parameters to define what property should be set or retrieved.
+ // E.g. CPUParticles3D::set_param(Parameter param, float value).
+ if (E->get().arguments.size() == 0 /* getter */ || (E->get().arguments.size() == 1 && E->get().return_val.type == Variant::NIL /* setter */)) {
+ continue;
+ }
+ }
+
+ MethodDoc method;
+
+ method.name = E->get().name;
+
+ if (E->get().flags & METHOD_FLAG_VIRTUAL) {
+ method.qualifiers = "virtual";
+ }
+
+ if (E->get().flags & METHOD_FLAG_CONST) {
+ if (method.qualifiers != "") {
+ method.qualifiers += " ";
+ }
+ method.qualifiers += "const";
+ } else if (E->get().flags & METHOD_FLAG_VARARG) {
+ if (method.qualifiers != "") {
+ method.qualifiers += " ";
+ }
+ method.qualifiers += "vararg";
+ }
+
+ for (int i = -1; i < E->get().arguments.size(); i++) {
+ if (i == -1) {
+#ifdef DEBUG_METHODS_ENABLED
+ return_doc_from_retinfo(method, E->get().return_val);
+#endif
+ } else {
+ const PropertyInfo &arginfo = E->get().arguments[i];
+ ArgumentDoc argument;
+ argument_doc_from_arginfo(argument, arginfo);
+
+ int darg_idx = i - (E->get().arguments.size() - E->get().default_arguments.size());
+ if (darg_idx >= 0) {
+ Variant default_arg = E->get().default_arguments[darg_idx];
+ argument.default_value = default_arg.get_construct_string();
+ }
+
+ method.arguments.push_back(argument);
+ }
+ }
+
+ c.methods.push_back(method);
+ }
+
+ List<MethodInfo> signal_list;
+ ClassDB::get_signal_list(name, &signal_list, true);
+
+ if (signal_list.size()) {
+ for (List<MethodInfo>::Element *EV = signal_list.front(); EV; EV = EV->next()) {
+ MethodDoc signal;
+ signal.name = EV->get().name;
+ for (int i = 0; i < EV->get().arguments.size(); i++) {
+ const PropertyInfo &arginfo = EV->get().arguments[i];
+ ArgumentDoc argument;
+ argument_doc_from_arginfo(argument, arginfo);
+
+ signal.arguments.push_back(argument);
+ }
+
+ c.signals.push_back(signal);
+ }
+ }
+
+ List<String> constant_list;
+ ClassDB::get_integer_constant_list(name, &constant_list, true);
+
+ for (List<String>::Element *E = constant_list.front(); E; E = E->next()) {
+ ConstantDoc constant;
+ constant.name = E->get();
+ constant.value = itos(ClassDB::get_integer_constant(name, E->get()));
+ constant.is_value_valid = true;
+ constant.enumeration = ClassDB::get_integer_constant_enum(name, E->get());
+ c.constants.push_back(constant);
+ }
+
+ //theme stuff
+
+ {
+ List<StringName> l;
+ Theme::get_default()->get_constant_list(cname, &l);
+ for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
+ PropertyDoc pd;
+ pd.name = E->get();
+ pd.type = "int";
+ pd.default_value = itos(Theme::get_default()->get_constant(E->get(), cname));
+ c.theme_properties.push_back(pd);
+ }
+
+ l.clear();
+ Theme::get_default()->get_color_list(cname, &l);
+ for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
+ PropertyDoc pd;
+ pd.name = E->get();
+ pd.type = "Color";
+ pd.default_value = Variant(Theme::get_default()->get_color(E->get(), cname)).get_construct_string();
+ c.theme_properties.push_back(pd);
+ }
+
+ l.clear();
+ Theme::get_default()->get_icon_list(cname, &l);
+ for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
+ PropertyDoc pd;
+ pd.name = E->get();
+ pd.type = "Texture2D";
+ c.theme_properties.push_back(pd);
+ }
+ l.clear();
+ Theme::get_default()->get_font_list(cname, &l);
+ for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
+ PropertyDoc pd;
+ pd.name = E->get();
+ pd.type = "Font";
+ c.theme_properties.push_back(pd);
+ }
+ l.clear();
+ Theme::get_default()->get_stylebox_list(cname, &l);
+ for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
+ PropertyDoc pd;
+ pd.name = E->get();
+ pd.type = "StyleBox";
+ c.theme_properties.push_back(pd);
+ }
+ }
+
+ classes.pop_front();
+ }
+
+ {
+ // So we can document the concept of Variant even if it's not a usable class per se.
+ class_list["Variant"] = ClassDoc();
+ class_list["Variant"].name = "Variant";
+ }
+
+ if (!p_basic_types) {
+ return;
+ }
+
+ // Add Variant types.
+ for (int i = 0; i < Variant::VARIANT_MAX; i++) {
+ if (i == Variant::NIL) {
+ continue; // Not exposed outside of 'null', should not be in class list.
+ }
+ if (i == Variant::OBJECT) {
+ continue; // Use the core type instead.
+ }
+
+ String cname = Variant::get_type_name(Variant::Type(i));
+
+ class_list[cname] = ClassDoc();
+ ClassDoc &c = class_list[cname];
+ c.name = cname;
+
+ Callable::CallError cerror;
+ Variant v = Variant::construct(Variant::Type(i), nullptr, 0, cerror);
+
+ List<MethodInfo> method_list;
+ v.get_method_list(&method_list);
+ method_list.sort();
+ Variant::get_constructor_list(Variant::Type(i), &method_list);
+
+ for (List<MethodInfo>::Element *E = method_list.front(); E; E = E->next()) {
+ MethodInfo &mi = E->get();
+ MethodDoc method;
+
+ method.name = mi.name;
+
+ for (int j = 0; j < mi.arguments.size(); j++) {
+ PropertyInfo arginfo = mi.arguments[j];
+ ArgumentDoc ad;
+ argument_doc_from_arginfo(ad, mi.arguments[j]);
+ ad.name = arginfo.name;
+
+ int darg_idx = mi.default_arguments.size() - mi.arguments.size() + j;
+ if (darg_idx >= 0) {
+ Variant default_arg = mi.default_arguments[darg_idx];
+ ad.default_value = default_arg.get_construct_string();
+ }
+
+ method.arguments.push_back(ad);
+ }
+
+ return_doc_from_retinfo(method, mi.return_val);
+
+ if (mi.flags & METHOD_FLAG_VARARG) {
+ if (method.qualifiers != "") {
+ method.qualifiers += " ";
+ }
+ method.qualifiers += "vararg";
+ }
+
+ c.methods.push_back(method);
+ }
+
+ List<PropertyInfo> properties;
+ v.get_property_list(&properties);
+ for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
+ PropertyInfo pi = E->get();
+ PropertyDoc property;
+ property.name = pi.name;
+ property.type = Variant::get_type_name(pi.type);
+ property.default_value = v.get(pi.name).get_construct_string();
+
+ c.properties.push_back(property);
+ }
+
+ List<StringName> constants;
+ Variant::get_constants_for_type(Variant::Type(i), &constants);
+
+ for (List<StringName>::Element *E = constants.front(); E; E = E->next()) {
+ ConstantDoc constant;
+ constant.name = E->get();
+ Variant value = Variant::get_constant_value(Variant::Type(i), E->get());
+ constant.value = value.get_type() == Variant::INT ? itos(value) : value.get_construct_string();
+ constant.is_value_valid = true;
+ c.constants.push_back(constant);
+ }
+ }
+
+ //built in constants and functions
+
+ {
+ String cname = "@GlobalScope";
+ class_list[cname] = ClassDoc();
+ ClassDoc &c = class_list[cname];
+ c.name = cname;
+
+ for (int i = 0; i < GlobalConstants::get_global_constant_count(); i++) {
+ ConstantDoc cd;
+ cd.name = GlobalConstants::get_global_constant_name(i);
+ if (!GlobalConstants::get_ignore_value_in_docs(i)) {
+ cd.value = itos(GlobalConstants::get_global_constant_value(i));
+ cd.is_value_valid = true;
+ } else {
+ cd.is_value_valid = false;
+ }
+ cd.enumeration = GlobalConstants::get_global_constant_enum(i);
+ c.constants.push_back(cd);
+ }
+
+ List<Engine::Singleton> singletons;
+ Engine::get_singleton()->get_singletons(&singletons);
+
+ //servers (this is kind of hackish)
+ for (List<Engine::Singleton>::Element *E = singletons.front(); E; E = E->next()) {
+ PropertyDoc pd;
+ Engine::Singleton &s = E->get();
+ if (!s.ptr) {
+ continue;
+ }
+ pd.name = s.name;
+ pd.type = s.ptr->get_class();
+ while (String(ClassDB::get_parent_class(pd.type)) != "Object") {
+ pd.type = ClassDB::get_parent_class(pd.type);
+ }
+ if (pd.type.begins_with("_")) {
+ pd.type = pd.type.substr(1, pd.type.length());
+ }
+ c.properties.push_back(pd);
+ }
+ }
+
+ // Built-in script reference.
+ // We only add a doc entry for languages which actually define any built-in
+ // methods or constants.
+
+ {
+ for (int i = 0; i < ScriptServer::get_language_count(); i++) {
+ ScriptLanguage *lang = ScriptServer::get_language(i);
+ String cname = "@" + lang->get_name();
+ ClassDoc c;
+ c.name = cname;
+
+ // Get functions.
+ List<MethodInfo> minfo;
+ lang->get_public_functions(&minfo);
+
+ for (List<MethodInfo>::Element *E = minfo.front(); E; E = E->next()) {
+ MethodInfo &mi = E->get();
+ MethodDoc md;
+ md.name = mi.name;
+
+ if (mi.flags & METHOD_FLAG_VARARG) {
+ if (md.qualifiers != "") {
+ md.qualifiers += " ";
+ }
+ md.qualifiers += "vararg";
+ }
+
+ return_doc_from_retinfo(md, mi.return_val);
+
+ for (int j = 0; j < mi.arguments.size(); j++) {
+ ArgumentDoc ad;
+ argument_doc_from_arginfo(ad, mi.arguments[j]);
+
+ int darg_idx = j - (mi.arguments.size() - mi.default_arguments.size());
+ if (darg_idx >= 0) {
+ Variant default_arg = E->get().default_arguments[darg_idx];
+ ad.default_value = default_arg.get_construct_string();
+ }
+
+ md.arguments.push_back(ad);
+ }
+
+ c.methods.push_back(md);
+ }
+
+ // Get constants.
+ List<Pair<String, Variant>> cinfo;
+ lang->get_public_constants(&cinfo);
+
+ for (List<Pair<String, Variant>>::Element *E = cinfo.front(); E; E = E->next()) {
+ ConstantDoc cd;
+ cd.name = E->get().first;
+ cd.value = E->get().second;
+ cd.is_value_valid = true;
+ c.constants.push_back(cd);
+ }
+
+ // Skip adding the lang if it doesn't expose anything (e.g. C#).
+ if (c.methods.empty() && c.constants.empty()) {
+ continue;
+ }
+
+ class_list[cname] = c;
+ }
+ }
+}
+
+static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> &methods) {
+ String section = parser->get_node_name();
+ String element = section.substr(0, section.length() - 1);
+
+ while (parser->read() == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser->get_node_name() == element) {
+ DocData::MethodDoc method;
+ ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
+ method.name = parser->get_attribute_value("name");
+ if (parser->has_attribute("qualifiers")) {
+ method.qualifiers = parser->get_attribute_value("qualifiers");
+ }
+
+ while (parser->read() == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser->get_node_name();
+ if (name == "return") {
+ ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
+ method.return_type = parser->get_attribute_value("type");
+ if (parser->has_attribute("enum")) {
+ method.return_enum = parser->get_attribute_value("enum");
+ }
+ } else if (name == "argument") {
+ DocData::ArgumentDoc argument;
+ ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
+ argument.name = parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
+ argument.type = parser->get_attribute_value("type");
+ if (parser->has_attribute("enum")) {
+ argument.enumeration = parser->get_attribute_value("enum");
+ }
+
+ method.arguments.push_back(argument);
+
+ } else if (name == "description") {
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ method.description = parser->get_node_data();
+ }
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == element) {
+ break;
+ }
+ }
+
+ methods.push_back(method);
+
+ } else {
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + parser->get_node_name() + ".");
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == section) {
+ break;
+ }
+ }
+
+ return OK;
+}
+
+Error DocData::load_classes(const String &p_dir) {
+ Error err;
+ DirAccessRef da = DirAccess::open(p_dir, &err);
+ if (!da) {
+ return err;
+ }
+
+ da->list_dir_begin();
+ String path;
+ path = da->get_next();
+ while (path != String()) {
+ if (!da->current_is_dir() && path.ends_with("xml")) {
+ Ref<XMLParser> parser = memnew(XMLParser);
+ Error err2 = parser->open(p_dir.plus_file(path));
+ if (err2) {
+ return err2;
+ }
+
+ _load(parser);
+ }
+ path = da->get_next();
+ }
+
+ da->list_dir_end();
+
+ return OK;
+}
+
+Error DocData::erase_classes(const String &p_dir) {
+ Error err;
+ DirAccessRef da = DirAccess::open(p_dir, &err);
+ if (!da) {
+ return err;
+ }
+
+ List<String> to_erase;
+
+ da->list_dir_begin();
+ String path;
+ path = da->get_next();
+ while (path != String()) {
+ if (!da->current_is_dir() && path.ends_with("xml")) {
+ to_erase.push_back(path);
+ }
+ path = da->get_next();
+ }
+ da->list_dir_end();
+
+ while (to_erase.size()) {
+ da->remove(to_erase.front()->get());
+ to_erase.pop_front();
+ }
+
+ return OK;
+}
+
+Error DocData::_load(Ref<XMLParser> parser) {
+ Error err = OK;
+
+ while ((err = parser->read()) == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT && parser->get_node_name() == "?xml") {
+ parser->skip_section();
+ }
+
+ if (parser->get_node_type() != XMLParser::NODE_ELEMENT) {
+ continue; //no idea what this may be, but skipping anyway
+ }
+
+ ERR_FAIL_COND_V(parser->get_node_name() != "class", ERR_FILE_CORRUPT);
+
+ ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
+ String name = parser->get_attribute_value("name");
+ class_list[name] = ClassDoc();
+ ClassDoc &c = class_list[name];
+
+ c.name = name;
+ if (parser->has_attribute("inherits")) {
+ c.inherits = parser->get_attribute_value("inherits");
+ }
+
+ while (parser->read() == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name2 = parser->get_node_name();
+
+ if (name2 == "brief_description") {
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ c.brief_description = parser->get_node_data();
+ }
+
+ } else if (name2 == "description") {
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ c.description = parser->get_node_data();
+ }
+ } else if (name2 == "tutorials") {
+ while (parser->read() == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name3 = parser->get_node_name();
+
+ if (name3 == "link") {
+ TutorialDoc tutorial;
+ if (parser->has_attribute("title")) {
+ tutorial.title = parser->get_attribute_value("title");
+ }
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ tutorial.link = parser->get_node_data().strip_edges();
+ c.tutorials.push_back(tutorial);
+ }
+ } else {
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
+ }
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "tutorials") {
+ break; // End of <tutorials>.
+ }
+ }
+ } else if (name2 == "methods") {
+ Error err2 = _parse_methods(parser, c.methods);
+ ERR_FAIL_COND_V(err2, err2);
+
+ } else if (name2 == "signals") {
+ Error err2 = _parse_methods(parser, c.signals);
+ ERR_FAIL_COND_V(err2, err2);
+ } else if (name2 == "members") {
+ while (parser->read() == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name3 = parser->get_node_name();
+
+ if (name3 == "member") {
+ PropertyDoc prop2;
+
+ ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
+ prop2.name = parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
+ prop2.type = parser->get_attribute_value("type");
+ if (parser->has_attribute("setter")) {
+ prop2.setter = parser->get_attribute_value("setter");
+ }
+ if (parser->has_attribute("getter")) {
+ prop2.getter = parser->get_attribute_value("getter");
+ }
+ if (parser->has_attribute("enum")) {
+ prop2.enumeration = parser->get_attribute_value("enum");
+ }
+ if (!parser->is_empty()) {
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ prop2.description = parser->get_node_data();
+ }
+ }
+ c.properties.push_back(prop2);
+ } else {
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "members") {
+ break; // End of <members>.
+ }
+ }
+
+ } else if (name2 == "theme_items") {
+ while (parser->read() == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name3 = parser->get_node_name();
+
+ if (name3 == "theme_item") {
+ PropertyDoc prop2;
+
+ ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
+ prop2.name = parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("type"), ERR_FILE_CORRUPT);
+ prop2.type = parser->get_attribute_value("type");
+ if (!parser->is_empty()) {
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ prop2.description = parser->get_node_data();
+ }
+ }
+ c.theme_properties.push_back(prop2);
+ } else {
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "theme_items") {
+ break; // End of <theme_items>.
+ }
+ }
+
+ } else if (name2 == "constants") {
+ while (parser->read() == OK) {
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name3 = parser->get_node_name();
+
+ if (name3 == "constant") {
+ ConstantDoc constant2;
+ ERR_FAIL_COND_V(!parser->has_attribute("name"), ERR_FILE_CORRUPT);
+ constant2.name = parser->get_attribute_value("name");
+ ERR_FAIL_COND_V(!parser->has_attribute("value"), ERR_FILE_CORRUPT);
+ constant2.value = parser->get_attribute_value("value");
+ constant2.is_value_valid = true;
+ if (parser->has_attribute("enum")) {
+ constant2.enumeration = parser->get_attribute_value("enum");
+ }
+ if (!parser->is_empty()) {
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT) {
+ constant2.description = parser->get_node_data();
+ }
+ }
+ c.constants.push_back(constant2);
+ } else {
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name3 + ".");
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "constants") {
+ break; // End of <constants>.
+ }
+ }
+
+ } else {
+ ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + name2 + ".");
+ }
+
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "class") {
+ break; // End of <class>.
+ }
+ }
+ }
+
+ return OK;
+}
+
+static void _write_string(FileAccess *f, int p_tablevel, const String &p_string) {
+ if (p_string == "") {
+ return;
+ }
+ String tab;
+ for (int i = 0; i < p_tablevel; i++) {
+ tab += "\t";
+ }
+ f->store_string(tab + p_string + "\n");
+}
+
+Error DocData::save_classes(const String &p_default_path, const Map<String, String> &p_class_path) {
+ for (Map<String, ClassDoc>::Element *E = class_list.front(); E; E = E->next()) {
+ ClassDoc &c = E->get();
+
+ String save_path;
+ if (p_class_path.has(c.name)) {
+ save_path = p_class_path[c.name];
+ } else {
+ save_path = p_default_path;
+ }
+
+ Error err;
+ String save_file = save_path.plus_file(c.name + ".xml");
+ FileAccessRef f = FileAccess::open(save_file, FileAccess::WRITE, &err);
+
+ ERR_CONTINUE_MSG(err != OK, "Can't write doc file: " + save_file + ".");
+
+ _write_string(f, 0, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
+
+ String header = "<class name=\"" + c.name + "\"";
+ if (c.inherits != "") {
+ header += " inherits=\"" + c.inherits + "\"";
+ }
+ header += String(" version=\"") + VERSION_BRANCH + "\"";
+ header += ">";
+ _write_string(f, 0, header);
+
+ _write_string(f, 1, "<brief_description>");
+ _write_string(f, 2, c.brief_description.strip_edges().xml_escape());
+ _write_string(f, 1, "</brief_description>");
+
+ _write_string(f, 1, "<description>");
+ _write_string(f, 2, c.description.strip_edges().xml_escape());
+ _write_string(f, 1, "</description>");
+
+ _write_string(f, 1, "<tutorials>");
+ for (int i = 0; i < c.tutorials.size(); i++) {
+ TutorialDoc tutorial = c.tutorials.get(i);
+ String title_attribute = (!tutorial.title.empty()) ? " title=\"" + tutorial.title.xml_escape() + "\"" : "";
+ _write_string(f, 2, "<link" + title_attribute + ">" + tutorial.link.xml_escape() + "</link>");
+ }
+ _write_string(f, 1, "</tutorials>");
+
+ _write_string(f, 1, "<methods>");
+
+ c.methods.sort();
+
+ for (int i = 0; i < c.methods.size(); i++) {
+ const MethodDoc &m = c.methods[i];
+
+ String qualifiers;
+ if (m.qualifiers != "") {
+ qualifiers += " qualifiers=\"" + m.qualifiers.xml_escape() + "\"";
+ }
+
+ _write_string(f, 2, "<method name=\"" + m.name + "\"" + qualifiers + ">");
+
+ if (m.return_type != "") {
+ String enum_text;
+ if (m.return_enum != String()) {
+ enum_text = " enum=\"" + m.return_enum + "\"";
+ }
+ _write_string(f, 3, "<return type=\"" + m.return_type + "\"" + enum_text + ">");
+ _write_string(f, 3, "</return>");
+ }
+
+ for (int j = 0; j < m.arguments.size(); j++) {
+ const ArgumentDoc &a = m.arguments[j];
+
+ String enum_text;
+ if (a.enumeration != String()) {
+ enum_text = " enum=\"" + a.enumeration + "\"";
+ }
+
+ if (a.default_value != "") {
+ _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\"" + enum_text + " default=\"" + a.default_value.xml_escape(true) + "\">");
+ } else {
+ _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\"" + enum_text + ">");
+ }
+
+ _write_string(f, 3, "</argument>");
+ }
+
+ _write_string(f, 3, "<description>");
+ _write_string(f, 4, m.description.strip_edges().xml_escape());
+ _write_string(f, 3, "</description>");
+
+ _write_string(f, 2, "</method>");
+ }
+
+ _write_string(f, 1, "</methods>");
+
+ if (c.properties.size()) {
+ _write_string(f, 1, "<members>");
+
+ c.properties.sort();
+
+ for (int i = 0; i < c.properties.size(); i++) {
+ String additional_attributes;
+ if (c.properties[i].enumeration != String()) {
+ additional_attributes += " enum=\"" + c.properties[i].enumeration + "\"";
+ }
+ if (c.properties[i].default_value != String()) {
+ additional_attributes += " default=\"" + c.properties[i].default_value.xml_escape(true) + "\"";
+ }
+
+ const PropertyDoc &p = c.properties[i];
+
+ if (c.properties[i].overridden) {
+ _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\" override=\"true\"" + additional_attributes + " />");
+ } else {
+ _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\"" + additional_attributes + ">");
+ _write_string(f, 3, p.description.strip_edges().xml_escape());
+ _write_string(f, 2, "</member>");
+ }
+ }
+ _write_string(f, 1, "</members>");
+ }
+
+ if (c.signals.size()) {
+ c.signals.sort();
+
+ _write_string(f, 1, "<signals>");
+ for (int i = 0; i < c.signals.size(); i++) {
+ const MethodDoc &m = c.signals[i];
+ _write_string(f, 2, "<signal name=\"" + m.name + "\">");
+ for (int j = 0; j < m.arguments.size(); j++) {
+ const ArgumentDoc &a = m.arguments[j];
+ _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\">");
+ _write_string(f, 3, "</argument>");
+ }
+
+ _write_string(f, 3, "<description>");
+ _write_string(f, 4, m.description.strip_edges().xml_escape());
+ _write_string(f, 3, "</description>");
+
+ _write_string(f, 2, "</signal>");
+ }
+
+ _write_string(f, 1, "</signals>");
+ }
+
+ _write_string(f, 1, "<constants>");
+
+ for (int i = 0; i < c.constants.size(); i++) {
+ const ConstantDoc &k = c.constants[i];
+ if (k.is_value_valid) {
+ if (k.enumeration != String()) {
+ _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\">");
+ } else {
+ _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\">");
+ }
+ } else {
+ if (k.enumeration != String()) {
+ _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\" enum=\"" + k.enumeration + "\">");
+ } else {
+ _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\">");
+ }
+ }
+ _write_string(f, 3, k.description.strip_edges().xml_escape());
+ _write_string(f, 2, "</constant>");
+ }
+
+ _write_string(f, 1, "</constants>");
+
+ if (c.theme_properties.size()) {
+ c.theme_properties.sort();
+
+ _write_string(f, 1, "<theme_items>");
+ for (int i = 0; i < c.theme_properties.size(); i++) {
+ const PropertyDoc &p = c.theme_properties[i];
+
+ if (p.default_value != "") {
+ _write_string(f, 2, "<theme_item name=\"" + p.name + "\" type=\"" + p.type + "\" default=\"" + p.default_value.xml_escape(true) + "\">");
+ } else {
+ _write_string(f, 2, "<theme_item name=\"" + p.name + "\" type=\"" + p.type + "\">");
+ }
+
+ _write_string(f, 3, p.description.strip_edges().xml_escape());
+
+ _write_string(f, 2, "</theme_item>");
+ }
+ _write_string(f, 1, "</theme_items>");
+ }
+
+ _write_string(f, 0, "</class>");
+ }
+
+ return OK;
+}
+
+Error DocData::load_compressed(const uint8_t *p_data, int p_compressed_size, int p_uncompressed_size) {
+ Vector<uint8_t> data;
+ data.resize(p_uncompressed_size);
+ Compression::decompress(data.ptrw(), p_uncompressed_size, p_data, p_compressed_size, Compression::MODE_DEFLATE);
+ class_list.clear();
+
+ Ref<XMLParser> parser = memnew(XMLParser);
+ Error err = parser->open_buffer(data);
+ if (err) {
+ return err;
+ }
+
+ _load(parser);
+
+ return OK;
+}
diff --git a/editor/doc_data.h b/editor/doc_data.h
new file mode 100644
index 0000000000..a35cfb59c7
--- /dev/null
+++ b/editor/doc_data.h
@@ -0,0 +1,124 @@
+/*************************************************************************/
+/* doc_data.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef DOC_DATA_H
+#define DOC_DATA_H
+
+#include "core/io/xml_parser.h"
+#include "core/map.h"
+#include "core/variant.h"
+
+class DocData {
+public:
+ struct ArgumentDoc {
+ String name;
+ String type;
+ String enumeration;
+ String default_value;
+ bool operator<(const ArgumentDoc &p_arg) const {
+ return name < p_arg.name;
+ }
+ };
+
+ struct MethodDoc {
+ String name;
+ String return_type;
+ String return_enum;
+ String qualifiers;
+ String description;
+ Vector<ArgumentDoc> arguments;
+ bool operator<(const MethodDoc &p_method) const {
+ return name < p_method.name;
+ }
+ };
+
+ struct ConstantDoc {
+ String name;
+ String value;
+ bool is_value_valid;
+ String enumeration;
+ String description;
+ bool operator<(const ConstantDoc &p_const) const {
+ return name < p_const.name;
+ }
+ };
+
+ struct PropertyDoc {
+ String name;
+ String type;
+ String enumeration;
+ String description;
+ String setter, getter;
+ String default_value;
+ bool overridden = false;
+ bool operator<(const PropertyDoc &p_prop) const {
+ return name < p_prop.name;
+ }
+ };
+
+ struct TutorialDoc {
+ String link;
+ String title;
+ };
+
+ struct ClassDoc {
+ String name;
+ String inherits;
+ String category;
+ String brief_description;
+ String description;
+ Vector<TutorialDoc> tutorials;
+ Vector<MethodDoc> methods;
+ Vector<MethodDoc> signals;
+ Vector<ConstantDoc> constants;
+ Vector<PropertyDoc> properties;
+ Vector<PropertyDoc> theme_properties;
+ bool operator<(const ClassDoc &p_class) const {
+ return name < p_class.name;
+ }
+ };
+
+ String version;
+
+ Map<String, ClassDoc> class_list;
+ Error _load(Ref<XMLParser> parser);
+
+public:
+ void merge_from(const DocData &p_data);
+ void remove_from(const DocData &p_data);
+ void generate(bool p_basic_types = false);
+ Error load_classes(const String &p_dir);
+ static Error erase_classes(const String &p_dir);
+ Error save_classes(const String &p_default_path, const Map<String, String> &p_class_path);
+
+ Error load_compressed(const uint8_t *p_data, int p_compressed_size, int p_uncompressed_size);
+};
+
+#endif // DOC_DATA_H
diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp
index ba653017ef..cbde7d593a 100644
--- a/editor/editor_about.cpp
+++ b/editor/editor_about.cpp
@@ -37,43 +37,38 @@
#include "core/version.h"
#include "core/version_hash.gen.h"
-void EditorAbout::_notification(int p_what) {
+void EditorAbout::_theme_changed() {
+ Control *base = EditorNode::get_singleton()->get_gui_base();
+ Ref<Font> font = base->get_theme_font("source", "EditorFonts");
+ _tpl_text->add_theme_font_override("normal_font", font);
+ _tpl_text->add_theme_constant_override("line_separation", 6 * EDSCALE);
+ _license_text->add_theme_font_override("normal_font", font);
+ _license_text->add_theme_constant_override("line_separation", 6 * EDSCALE);
+ _logo->set_texture(base->get_theme_icon("Logo", "EditorIcons"));
+}
+void EditorAbout::_notification(int p_what) {
switch (p_what) {
-
- case NOTIFICATION_ENTER_TREE:
- case NOTIFICATION_THEME_CHANGED: {
-
- Control *base = EditorNode::get_singleton()->get_gui_base();
- Ref<Font> font = base->get_font("source", "EditorFonts");
- _tpl_text->add_font_override("normal_font", font);
- _tpl_text->add_constant_override("line_separation", 6 * EDSCALE);
- _license_text->add_font_override("normal_font", font);
- _license_text->add_constant_override("line_separation", 6 * EDSCALE);
- _logo->set_texture(base->get_icon("Logo", "EditorIcons"));
+ case NOTIFICATION_ENTER_TREE: {
+ _theme_changed();
} break;
}
}
void EditorAbout::_license_tree_selected() {
-
TreeItem *selected = _tpl_tree->get_selected();
_tpl_text->scroll_to_line(0);
_tpl_text->set_text(selected->get_metadata(0));
}
void EditorAbout::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_license_tree_selected"), &EditorAbout::_license_tree_selected);
}
TextureRect *EditorAbout::get_logo() const {
-
return _logo;
}
ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<String> &p_sections, const char *const *const p_src[], const int p_flag_single_column) {
-
ScrollContainer *sc = memnew(ScrollContainer);
sc->set_name(p_name);
sc->set_v_size_flags(Control::SIZE_EXPAND);
@@ -83,11 +78,9 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St
sc->add_child(vbc);
for (int i = 0; i < p_sections.size(); i++) {
-
bool single_column = p_flag_single_column & 1 << i;
const char *const *names_ptr = p_src[i];
if (*names_ptr) {
-
Label *lbl = memnew(Label);
lbl->set_text(p_sections[i]);
vbc->add_child(lbl);
@@ -97,9 +90,9 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St
il->set_same_column_width(true);
il->set_auto_height(true);
il->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
- il->add_constant_override("hseparation", 16 * EDSCALE);
+ il->add_theme_constant_override("hseparation", 16 * EDSCALE);
while (*names_ptr) {
- il->add_item(String::utf8(*names_ptr++), NULL, false);
+ il->add_item(String::utf8(*names_ptr++), nullptr, false);
}
il->set_max_columns(il->get_item_count() < 4 || single_column ? 1 : 16);
vbc->add_child(il);
@@ -114,16 +107,15 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St
}
EditorAbout::EditorAbout() {
-
set_title(TTR("Thanks from the Godot community!"));
set_hide_on_ok(true);
- set_resizable(true);
VBoxContainer *vbc = memnew(VBoxContainer);
+ vbc->connect("theme_changed", callable_mp(this, &EditorAbout::_theme_changed));
HBoxContainer *hbc = memnew(HBoxContainer);
hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hbc->set_alignment(BoxContainer::ALIGN_CENTER);
- hbc->add_constant_override("separation", 30 * EDSCALE);
+ hbc->add_theme_constant_override("separation", 30 * EDSCALE);
add_child(vbc);
vbc->add_child(hbc);
@@ -131,8 +123,9 @@ EditorAbout::EditorAbout() {
hbc->add_child(_logo);
String hash = String(VERSION_HASH);
- if (hash.length() != 0)
+ if (hash.length() != 0) {
hash = "." + hash.left(9);
+ }
Label *about_text = memnew(Label);
about_text->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
@@ -151,7 +144,10 @@ EditorAbout::EditorAbout() {
List<String> dev_sections;
dev_sections.push_back(TTR("Project Founders"));
dev_sections.push_back(TTR("Lead Developer"));
- dev_sections.push_back(TTR("Project Manager ")); // " " appended to distinguish between 'project supervisor' and 'project list'
+ // TRANSLATORS: This refers to a job title.
+ // The trailing space is used to distinguish with the project list application,
+ // you do not have to keep it in your translation.
+ dev_sections.push_back(TTR("Project Manager "));
dev_sections.push_back(TTR("Developers"));
const char *const *dev_src[] = { AUTHORS_FOUNDERS, AUTHORS_LEAD_DEVELOPERS,
AUTHORS_PROJECT_MANAGERS, AUTHORS_DEVELOPERS };
@@ -162,12 +158,15 @@ EditorAbout::EditorAbout() {
List<String> donor_sections;
donor_sections.push_back(TTR("Platinum Sponsors"));
donor_sections.push_back(TTR("Gold Sponsors"));
+ donor_sections.push_back(TTR("Silver Sponsors"));
+ donor_sections.push_back(TTR("Bronze Sponsors"));
donor_sections.push_back(TTR("Mini Sponsors"));
donor_sections.push_back(TTR("Gold Donors"));
donor_sections.push_back(TTR("Silver Donors"));
donor_sections.push_back(TTR("Bronze Donors"));
- const char *const *donor_src[] = { DONORS_SPONSOR_PLAT, DONORS_SPONSOR_GOLD,
- DONORS_SPONSOR_MINI, DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE };
+ const char *const *donor_src[] = { DONORS_SPONSOR_PLATINUM, DONORS_SPONSOR_GOLD,
+ DONORS_SPONSOR_SILVER, DONORS_SPONSOR_BRONZE, DONORS_SPONSOR_MINI,
+ DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE };
tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3));
// License
@@ -212,7 +211,6 @@ EditorAbout::EditorAbout() {
tpl_ti_lc->set_selectable(0, false);
String long_text = "";
for (int component_index = 0; component_index < COPYRIGHT_INFO_COUNT; component_index++) {
-
const ComponentCopyright &component = COPYRIGHT_INFO[component_index];
TreeItem *ti = _tpl_tree->create_item(tpl_ti_tp);
String component_name = component.name;
@@ -238,7 +236,6 @@ EditorAbout::EditorAbout() {
ti->set_metadata(0, text);
}
for (int i = 0; i < LICENSE_COUNT; i++) {
-
TreeItem *ti = _tpl_tree->create_item(tpl_ti_lc);
String licensename = String(LICENSE_NAMES[i]);
ti->set_text(0, licensename);
@@ -255,7 +252,7 @@ EditorAbout::EditorAbout() {
_tpl_text->set_v_size_flags(Control::SIZE_EXPAND_FILL);
tpl_hbc->add_child(_tpl_text);
- _tpl_tree->connect("item_selected", this, "_license_tree_selected");
+ _tpl_tree->connect("item_selected", callable_mp(this, &EditorAbout::_license_tree_selected));
tpl_ti_all->select(0);
_tpl_text->set_text(tpl_ti_all->get_metadata(0));
}
diff --git a/editor/editor_about.h b/editor/editor_about.h
index 51438ee953..ae4d9c73bf 100644
--- a/editor/editor_about.h
+++ b/editor/editor_about.h
@@ -45,7 +45,6 @@
#include "editor_scale.h"
class EditorAbout : public AcceptDialog {
-
GDCLASS(EditorAbout, AcceptDialog);
private:
@@ -57,6 +56,8 @@ private:
RichTextLabel *_tpl_text;
TextureRect *_logo;
+ void _theme_changed();
+
protected:
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp
index 86611bd20a..8aeeba52ed 100644
--- a/editor/editor_asset_installer.cpp
+++ b/editor/editor_asset_installer.cpp
@@ -37,7 +37,6 @@
#include "progress_dialog.h"
void EditorAssetInstaller::_update_subitems(TreeItem *p_item, bool p_check, bool p_first) {
-
if (p_check) {
if (p_item->get_custom_color(0) == Color()) {
p_item->set_checked(0, true);
@@ -55,19 +54,41 @@ void EditorAssetInstaller::_update_subitems(TreeItem *p_item, bool p_check, bool
}
}
-void EditorAssetInstaller::_item_edited() {
+void EditorAssetInstaller::_uncheck_parent(TreeItem *p_item) {
+ if (!p_item) {
+ return;
+ }
- if (updating)
+ bool any_checked = false;
+ TreeItem *item = p_item->get_children();
+ while (item) {
+ if (item->is_checked(0)) {
+ any_checked = true;
+ break;
+ }
+ item = item->get_next();
+ }
+
+ if (!any_checked) {
+ p_item->set_checked(0, false);
+ _uncheck_parent(p_item->get_parent());
+ }
+}
+
+void EditorAssetInstaller::_item_edited() {
+ if (updating) {
return;
+ }
TreeItem *item = tree->get_edited();
- if (!item)
+ if (!item) {
return;
+ }
String path = item->get_metadata(0);
updating = true;
- if (path == String()) { //a dir
+ if (path == String() || item == tree->get_root()) { //a dir or root
_update_subitems(item, item->is_checked(0), true);
}
@@ -76,21 +97,21 @@ void EditorAssetInstaller::_item_edited() {
item->set_checked(0, true);
item = item->get_parent();
}
+ } else {
+ _uncheck_parent(item->get_parent());
}
updating = false;
}
void EditorAssetInstaller::open(const String &p_path, int p_depth) {
-
package_path = p_path;
Set<String> files_sorted;
- FileAccess *src_f = NULL;
+ FileAccess *src_f = nullptr;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
unzFile pkg = unzOpen2(p_path.utf8().get_data(), &io);
if (!pkg) {
-
error->set_text(TTR("Error opening package file, not in ZIP format."));
return;
}
@@ -98,11 +119,10 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
int ret = unzGoToFirstFile(pkg);
while (ret == UNZ_OK) {
-
//get filename
unz_file_info info;
char fname[16384];
- unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0);
+ unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0);
String name = fname;
files_sorted.insert(name);
@@ -110,19 +130,19 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
ret = unzGoToNextFile(pkg);
}
- Map<String, Ref<Texture> > extension_guess;
+ Map<String, Ref<Texture2D>> extension_guess;
{
- extension_guess["png"] = get_icon("ImageTexture", "EditorIcons");
- extension_guess["jpg"] = get_icon("ImageTexture", "EditorIcons");
- extension_guess["atlastex"] = get_icon("AtlasTexture", "EditorIcons");
- extension_guess["scn"] = get_icon("PackedScene", "EditorIcons");
- extension_guess["tscn"] = get_icon("PackedScene", "EditorIcons");
- extension_guess["shader"] = get_icon("Shader", "EditorIcons");
- extension_guess["gd"] = get_icon("GDScript", "EditorIcons");
- extension_guess["vs"] = get_icon("VisualScript", "EditorIcons");
+ extension_guess["png"] = tree->get_theme_icon("ImageTexture", "EditorIcons");
+ extension_guess["jpg"] = tree->get_theme_icon("ImageTexture", "EditorIcons");
+ extension_guess["atlastex"] = tree->get_theme_icon("AtlasTexture", "EditorIcons");
+ extension_guess["scn"] = tree->get_theme_icon("PackedScene", "EditorIcons");
+ extension_guess["tscn"] = tree->get_theme_icon("PackedScene", "EditorIcons");
+ extension_guess["shader"] = tree->get_theme_icon("Shader", "EditorIcons");
+ extension_guess["gd"] = tree->get_theme_icon("GDScript", "EditorIcons");
+ extension_guess["vs"] = tree->get_theme_icon("VisualScript", "EditorIcons");
}
- Ref<Texture> generic_extension = get_icon("Object", "EditorIcons");
+ Ref<Texture2D> generic_extension = tree->get_theme_icon("Object", "EditorIcons");
unzClose(pkg);
@@ -131,13 +151,12 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
TreeItem *root = tree->create_item();
root->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
root->set_checked(0, true);
- root->set_icon(0, get_icon("folder", "FileDialog"));
+ root->set_icon(0, tree->get_theme_icon("folder", "FileDialog"));
root->set_text(0, "res://");
root->set_editable(0, true);
Map<String, TreeItem *> dir_map;
for (Set<String>::Element *E = files_sorted.front(); E; E = E->next()) {
-
String path = E->get();
int depth = p_depth;
bool skip = false;
@@ -151,8 +170,9 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
depth--;
}
- if (skip || path == String())
+ if (skip || path == String()) {
continue;
+ }
bool isdir = false;
@@ -162,7 +182,7 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
isdir = true;
}
- int pp = path.find_last("/");
+ int pp = path.rfind("/");
TreeItem *parent;
if (pp == -1) {
@@ -180,7 +200,7 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
if (isdir) {
dir_map[path] = ti;
ti->set_text(0, path.get_file() + "/");
- ti->set_icon(0, get_icon("folder", "FileDialog"));
+ ti->set_icon(0, tree->get_theme_icon("folder", "FileDialog"));
ti->set_metadata(0, String());
} else {
String file = path.get_file();
@@ -194,7 +214,7 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
String res_path = "res://" + path;
if (FileAccess::exists(res_path)) {
- ti->set_custom_color(0, get_color("error_color", "Editor"));
+ ti->set_custom_color(0, tree->get_theme_color("error_color", "Editor"));
ti->set_tooltip(0, vformat(TTR("%s (Already Exists)"), res_path));
ti->set_checked(0, false);
} else {
@@ -211,13 +231,11 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) {
}
void EditorAssetInstaller::ok_pressed() {
-
- FileAccess *src_f = NULL;
+ FileAccess *src_f = nullptr;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
unzFile pkg = unzOpen2(package_path.utf8().get_data(), &io);
if (!pkg) {
-
error->set_text(TTR("Error opening package file, not in ZIP format."));
return;
}
@@ -230,16 +248,14 @@ void EditorAssetInstaller::ok_pressed() {
int idx = 0;
while (ret == UNZ_OK) {
-
//get filename
unz_file_info info;
char fname[16384];
- ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0);
+ ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0);
String name = fname;
if (status_map.has(name) && status_map[name]->is_checked(0)) {
-
String path = status_map[name]->get_metadata(0);
if (path == String()) { // a dir
@@ -259,7 +275,6 @@ void EditorAssetInstaller::ok_pressed() {
memdelete(da);
} else {
-
Vector<uint8_t> data;
data.resize(info.uncompressed_size);
@@ -290,35 +305,33 @@ void EditorAssetInstaller::ok_pressed() {
if (failed_files.size()) {
String msg = TTR("The following files failed extraction from package:") + "\n\n";
for (int i = 0; i < failed_files.size(); i++) {
-
if (i > 15) {
msg += "\n" + vformat(TTR("And %s more files."), itos(failed_files.size() - i));
break;
}
msg += failed_files[i];
}
- if (EditorNode::get_singleton() != NULL)
+ if (EditorNode::get_singleton() != nullptr) {
EditorNode::get_singleton()->show_warning(msg);
+ }
} else {
- if (EditorNode::get_singleton() != NULL)
+ if (EditorNode::get_singleton() != nullptr) {
EditorNode::get_singleton()->show_warning(TTR("Package installed successfully!"), TTR("Success!"));
+ }
}
EditorFileSystem::get_singleton()->scan_changes();
}
void EditorAssetInstaller::_bind_methods() {
-
- ClassDB::bind_method("_item_edited", &EditorAssetInstaller::_item_edited);
}
EditorAssetInstaller::EditorAssetInstaller() {
-
VBoxContainer *vb = memnew(VBoxContainer);
add_child(vb);
tree = memnew(Tree);
vb->add_margin_child(TTR("Package Contents:"), tree, true);
- tree->connect("item_edited", this, "_item_edited");
+ tree->connect("item_edited", callable_mp(this, &EditorAssetInstaller::_item_edited));
error = memnew(AcceptDialog);
add_child(error);
diff --git a/editor/editor_asset_installer.h b/editor/editor_asset_installer.h
index 840e780264..e31cff8845 100644
--- a/editor/editor_asset_installer.h
+++ b/editor/editor_asset_installer.h
@@ -34,7 +34,6 @@
#include "scene/gui/dialogs.h"
#include "scene/gui/tree.h"
class EditorAssetInstaller : public ConfirmationDialog {
-
GDCLASS(EditorAssetInstaller, ConfirmationDialog);
Tree *tree;
@@ -43,8 +42,9 @@ class EditorAssetInstaller : public ConfirmationDialog {
Map<String, TreeItem *> status_map;
bool updating;
void _update_subitems(TreeItem *p_item, bool p_check, bool p_first = false);
+ void _uncheck_parent(TreeItem *p_item);
void _item_edited();
- virtual void ok_pressed();
+ virtual void ok_pressed() override;
protected:
static void _bind_methods();
diff --git a/editor/editor_atlas_packer.cpp b/editor/editor_atlas_packer.cpp
index d17b3bba4f..68abeb2cda 100644
--- a/editor/editor_atlas_packer.cpp
+++ b/editor/editor_atlas_packer.cpp
@@ -31,14 +31,12 @@
#include "editor_atlas_packer.h"
void EditorAtlasPacker::_plot_triangle(Ref<BitMap> p_bitmap, Vector2i *vertices) {
-
int width = p_bitmap->get_size().width;
int height = p_bitmap->get_size().height;
int x[3];
int y[3];
for (int j = 0; j < 3; j++) {
-
x[j] = vertices[j].x;
y[j] = vertices[j].y;
}
@@ -71,26 +69,25 @@ void EditorAtlasPacker::_plot_triangle(Ref<BitMap> p_bitmap, Vector2i *vertices)
}
for (int xi = (xf < width ? int(xf) : width - 1); xi >= (xt > 0 ? xt : 0); xi--) {
-
p_bitmap->set_bit(Point2(xi, yi), true);
}
}
xf += dx_far;
- if (yi < y[1])
+ if (yi < y[1]) {
xt += dx_upper;
- else
+ } else {
xt += dx_low;
+ }
}
}
-void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_height, int p_atlas_max_size, int p_cell_resolution) {
+void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_height, int p_atlas_max_size, int p_cell_resolution) {
int divide_by = MIN(64, p_cell_resolution);
Vector<PlottedBitmap> bitmaps;
int max_w = 0;
for (int i = 0; i < charts.size(); i++) {
-
const Chart &chart = charts[i];
//generate aabb
@@ -100,7 +97,6 @@ void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_h
const Vector2 *vertices = chart.vertices.ptr();
for (int j = 0; j < vertex_count; j++) {
-
if (j == 0) {
aabb.position = vertices[j];
} else {
@@ -118,7 +114,6 @@ void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_h
//plot triangles, using divisor
for (int j = 0; j < chart.faces.size(); j++) {
-
Vector2i v[3];
for (int k = 0; k < 3; k++) {
Vector2 vtx = chart.vertices[chart.faces[j].vertex[k]];
@@ -163,13 +158,14 @@ void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_h
bool found_pixel = false;
for (int lx = x - 1; lx < x + 2 && !found_pixel; lx++) {
for (int ly = y - 1; ly < y + 2 && !found_pixel; ly++) {
-
int px = lx - 1;
- if (px < 0 || px >= w)
+ if (px < 0 || px >= w) {
continue;
+ }
int py = ly - 1;
- if (py < 0 || py >= h)
+ if (py < 0 || py >= h) {
continue;
+ }
if (src_bitmap->get_bit(Vector2(px, py))) {
found_pixel = true;
@@ -177,7 +173,6 @@ void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_h
}
}
if (found_pixel) {
-
if (transpose) {
if (x > top_heights[y]) {
top_heights.write[y] = x;
@@ -231,7 +226,6 @@ void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_h
int *atlas_ptr = heights.ptrw();
for (int i = 0; i < bitmaps.size(); i++) {
-
int best_height = 0x7FFFFFFF;
int best_height_offset = -1;
int w = bitmaps[i].top_heights.size();
@@ -240,11 +234,9 @@ void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_h
const int *bottom_heights = bitmaps[i].bottom_heights.ptr();
for (int j = 0; j < atlas_w - w; j++) {
-
int height = 0;
for (int k = 0; k < w; k++) {
-
int pixmap_h = bottom_heights[k];
if (pixmap_h == -1) {
continue; //no pixel here, anything is fine
diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp
index 3f773c646a..adb09532eb 100644
--- a/editor/editor_audio_buses.cpp
+++ b/editor/editor_audio_buses.cpp
@@ -30,8 +30,8 @@
#include "editor_audio_buses.h"
+#include "core/input/input.h"
#include "core/io/resource_saver.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "editor_node.h"
#include "editor_scale.h"
@@ -40,10 +40,8 @@
#include "servers/audio_server.h"
void EditorAudioBus::_update_visible_channels() {
-
int i = 0;
for (; i < cc; i++) {
-
if (!channel[i].vu_l->is_visible()) {
channel[i].vu_l->show();
}
@@ -53,7 +51,6 @@ void EditorAudioBus::_update_visible_channels() {
}
for (; i < CHANNELS_MAX; i++) {
-
if (channel[i].vu_l->is_visible()) {
channel[i].vu_l->hide();
}
@@ -64,54 +61,50 @@ void EditorAudioBus::_update_visible_channels() {
}
void EditorAudioBus::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_READY: {
-
for (int i = 0; i < CHANNELS_MAX; i++) {
- channel[i].vu_l->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
- channel[i].vu_l->set_progress_texture(get_icon("BusVuFull", "EditorIcons"));
- channel[i].vu_r->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
- channel[i].vu_r->set_progress_texture(get_icon("BusVuFull", "EditorIcons"));
+ channel[i].vu_l->set_under_texture(get_theme_icon("BusVuEmpty", "EditorIcons"));
+ channel[i].vu_l->set_progress_texture(get_theme_icon("BusVuFull", "EditorIcons"));
+ channel[i].vu_r->set_under_texture(get_theme_icon("BusVuEmpty", "EditorIcons"));
+ channel[i].vu_r->set_progress_texture(get_theme_icon("BusVuFull", "EditorIcons"));
channel[i].prev_active = true;
}
- disabled_vu = get_icon("BusVuFrozen", "EditorIcons");
+ disabled_vu = get_theme_icon("BusVuFrozen", "EditorIcons");
Color solo_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1.0, 0.89, 0.22) : Color(1.0, 0.92, 0.44);
Color mute_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1.0, 0.16, 0.16) : Color(1.0, 0.44, 0.44);
Color bypass_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(0.13, 0.8, 1.0) : Color(0.44, 0.87, 1.0);
- solo->set_icon(get_icon("AudioBusSolo", "EditorIcons"));
- solo->add_color_override("icon_color_pressed", solo_color);
- mute->set_icon(get_icon("AudioBusMute", "EditorIcons"));
- mute->add_color_override("icon_color_pressed", mute_color);
- bypass->set_icon(get_icon("AudioBusBypass", "EditorIcons"));
- bypass->add_color_override("icon_color_pressed", bypass_color);
+ solo->set_icon(get_theme_icon("AudioBusSolo", "EditorIcons"));
+ solo->add_theme_color_override("icon_color_pressed", solo_color);
+ mute->set_icon(get_theme_icon("AudioBusMute", "EditorIcons"));
+ mute->add_theme_color_override("icon_color_pressed", mute_color);
+ bypass->set_icon(get_theme_icon("AudioBusBypass", "EditorIcons"));
+ bypass->add_theme_color_override("icon_color_pressed", bypass_color);
- bus_options->set_icon(get_icon("GuiTabMenu", "EditorIcons"));
+ bus_options->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons"));
update_bus();
set_process(true);
} break;
case NOTIFICATION_DRAW: {
-
if (is_master) {
- draw_style_box(get_stylebox("disabled", "Button"), Rect2(Vector2(), get_size()));
+ draw_style_box(get_theme_stylebox("disabled", "Button"), Rect2(Vector2(), get_size()));
} else if (has_focus()) {
- draw_style_box(get_stylebox("focus", "Button"), Rect2(Vector2(), get_size()));
+ draw_style_box(get_theme_stylebox("focus", "Button"), Rect2(Vector2(), get_size()));
} else {
- draw_style_box(get_stylebox("panel", "TabContainer"), Rect2(Vector2(), get_size()));
+ draw_style_box(get_theme_stylebox("panel", "TabContainer"), Rect2(Vector2(), get_size()));
}
if (get_index() != 0 && hovering_drop) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
accent.a *= 0.7;
draw_rect(Rect2(Point2(), get_size()), accent, false);
}
} break;
case NOTIFICATION_PROCESS: {
-
if (cc != AudioServer::get_singleton()->get_bus_channels(get_index())) {
cc = AudioServer::get_singleton()->get_bus_channels(get_index());
_update_visible_channels();
@@ -144,8 +137,8 @@ void EditorAudioBus::_notification(int p_what) {
if (activity_found != channel[i].prev_active) {
if (activity_found) {
- channel[i].vu_l->set_over_texture(Ref<Texture>());
- channel[i].vu_r->set_over_texture(Ref<Texture>());
+ channel[i].vu_l->set_over_texture(Ref<Texture2D>());
+ channel[i].vu_r->set_over_texture(Ref<Texture2D>());
} else {
channel[i].vu_l->set_over_texture(disabled_vu);
channel[i].vu_r->set_over_texture(disabled_vu);
@@ -156,7 +149,6 @@ void EditorAudioBus::_notification(int p_what) {
}
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
-
for (int i = 0; i < CHANNELS_MAX; i++) {
channel[i].peak_l = -100;
channel[i].peak_r = -100;
@@ -166,26 +158,24 @@ void EditorAudioBus::_notification(int p_what) {
set_process(is_visible_in_tree());
} break;
case NOTIFICATION_THEME_CHANGED: {
-
for (int i = 0; i < CHANNELS_MAX; i++) {
- channel[i].vu_l->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
- channel[i].vu_l->set_progress_texture(get_icon("BusVuFull", "EditorIcons"));
- channel[i].vu_r->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
- channel[i].vu_r->set_progress_texture(get_icon("BusVuFull", "EditorIcons"));
+ channel[i].vu_l->set_under_texture(get_theme_icon("BusVuEmpty", "EditorIcons"));
+ channel[i].vu_l->set_progress_texture(get_theme_icon("BusVuFull", "EditorIcons"));
+ channel[i].vu_r->set_under_texture(get_theme_icon("BusVuEmpty", "EditorIcons"));
+ channel[i].vu_r->set_progress_texture(get_theme_icon("BusVuFull", "EditorIcons"));
channel[i].prev_active = true;
}
- disabled_vu = get_icon("BusVuFrozen", "EditorIcons");
+ disabled_vu = get_theme_icon("BusVuFrozen", "EditorIcons");
- solo->set_icon(get_icon("AudioBusSolo", "EditorIcons"));
- mute->set_icon(get_icon("AudioBusMute", "EditorIcons"));
- bypass->set_icon(get_icon("AudioBusBypass", "EditorIcons"));
+ solo->set_icon(get_theme_icon("AudioBusSolo", "EditorIcons"));
+ mute->set_icon(get_theme_icon("AudioBusMute", "EditorIcons"));
+ bypass->set_icon(get_theme_icon("AudioBusBypass", "EditorIcons"));
- bus_options->set_icon(get_icon("GuiTabMenu", "EditorIcons"));
+ bus_options->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons"));
} break;
case NOTIFICATION_MOUSE_EXIT:
case NOTIFICATION_DRAG_END: {
-
if (hovering_drop) {
hovering_drop = false;
update();
@@ -195,7 +185,6 @@ void EditorAudioBus::_notification(int p_what) {
}
void EditorAudioBus::update_send() {
-
send->clear();
if (is_master) {
send->set_disabled(true);
@@ -218,9 +207,9 @@ void EditorAudioBus::update_send() {
}
void EditorAudioBus::update_bus() {
-
- if (updating_bus)
+ if (updating_bus) {
return;
+ }
updating_bus = true;
@@ -229,8 +218,9 @@ void EditorAudioBus::update_bus() {
float db_value = AudioServer::get_singleton()->get_bus_volume_db(index);
slider->set_value(_scaled_db_to_normalized_volume(db_value));
track_name->set_text(AudioServer::get_singleton()->get_bus_name(index));
- if (is_master)
+ if (is_master) {
track_name->set_editable(false);
+ }
solo->set_pressed(AudioServer::get_singleton()->is_bus_solo(index));
mute->set_pressed(AudioServer::get_singleton()->is_bus_mute(index));
@@ -240,7 +230,6 @@ void EditorAudioBus::update_bus() {
TreeItem *root = effects->create_item();
for (int i = 0; i < AudioServer::get_singleton()->get_bus_effect_count(index); i++) {
-
Ref<AudioEffect> afx = AudioServer::get_singleton()->get_bus_effect(index, i);
TreeItem *fx = effects->create_item(root);
@@ -263,18 +252,16 @@ void EditorAudioBus::update_bus() {
}
void EditorAudioBus::_name_changed(const String &p_new_name) {
-
- if (p_new_name == AudioServer::get_singleton()->get_bus_name(get_index()))
+ if (p_new_name == AudioServer::get_singleton()->get_bus_name(get_index())) {
return;
+ }
String attempt = p_new_name;
int attempts = 1;
while (true) {
-
bool name_free = true;
for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) {
-
if (AudioServer::get_singleton()->get_bus_name(i) == attempt) {
name_free = false;
break;
@@ -317,9 +304,9 @@ void EditorAudioBus::_name_changed(const String &p_new_name) {
}
void EditorAudioBus::_volume_changed(float p_normalized) {
-
- if (updating_bus)
+ if (updating_bus) {
return;
+ }
updating_bus = true;
@@ -384,7 +371,6 @@ float EditorAudioBus::_scaled_db_to_normalized_volume(float db) {
}
void EditorAudioBus::_show_value(float slider_value) {
-
float db;
if (Input::get_singleton()->is_key_pressed(KEY_CONTROL)) {
// Display the correct (snapped) value when holding Ctrl
@@ -415,7 +401,6 @@ void EditorAudioBus::_hide_value_preview() {
}
void EditorAudioBus::_solo_toggled() {
-
updating_bus = true;
UndoRedo *ur = EditorNode::get_undo_redo();
@@ -428,8 +413,8 @@ void EditorAudioBus::_solo_toggled() {
updating_bus = false;
}
-void EditorAudioBus::_mute_toggled() {
+void EditorAudioBus::_mute_toggled() {
updating_bus = true;
UndoRedo *ur = EditorNode::get_undo_redo();
@@ -442,8 +427,8 @@ void EditorAudioBus::_mute_toggled() {
updating_bus = false;
}
-void EditorAudioBus::_bypass_toggled() {
+void EditorAudioBus::_bypass_toggled() {
updating_bus = true;
UndoRedo *ur = EditorNode::get_undo_redo();
@@ -458,7 +443,6 @@ void EditorAudioBus::_bypass_toggled() {
}
void EditorAudioBus::_send_selected(int p_which) {
-
updating_bus = true;
UndoRedo *ur = EditorNode::get_undo_redo();
@@ -473,14 +457,13 @@ void EditorAudioBus::_send_selected(int p_which) {
}
void EditorAudioBus::_effect_selected() {
-
TreeItem *effect = effects->get_selected();
- if (!effect)
+ if (!effect) {
return;
+ }
updating_bus = true;
if (effect->get_metadata(0) != Variant()) {
-
int index = effect->get_metadata(0);
Ref<AudioEffect> effect2 = AudioServer::get_singleton()->get_bus_effect(get_index(), index);
if (effect2.is_valid()) {
@@ -492,13 +475,14 @@ void EditorAudioBus::_effect_selected() {
}
void EditorAudioBus::_effect_edited() {
-
- if (updating_bus)
+ if (updating_bus) {
return;
+ }
TreeItem *effect = effects->get_edited();
- if (!effect)
+ if (!effect) {
return;
+ }
if (effect->get_metadata(0) == Variant()) {
Rect2 area = effects->get_item_rect(effect);
@@ -523,9 +507,9 @@ void EditorAudioBus::_effect_edited() {
}
void EditorAudioBus::_effect_add(int p_which) {
-
- if (updating_bus)
+ if (updating_bus) {
return;
+ }
StringName name = effect_options->get_item_metadata(p_which);
@@ -547,24 +531,32 @@ void EditorAudioBus::_effect_add(int p_which) {
}
void EditorAudioBus::_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventKey> k = p_event;
- if (k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_DELETE && !k->is_echo()) {
+ if (k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) {
accept_event();
emit_signal("delete_request");
}
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->get_button_index() == 2 && mb->is_pressed()) {
-
Vector2 pos = Vector2(mb->get_position().x, mb->get_position().y);
bus_popup->set_position(get_global_position() + pos);
bus_popup->popup();
}
}
-void EditorAudioBus::_bus_popup_pressed(int p_option) {
+void EditorAudioBus::_unhandled_key_input(Ref<InputEvent> p_event) {
+ Ref<InputEventKey> k = p_event;
+ if (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == KEY_DELETE) {
+ TreeItem *current_effect = effects->get_selected();
+ if (current_effect && current_effect->get_metadata(0).get_type() == Variant::INT) {
+ _delete_effect_pressed(0);
+ accept_event();
+ }
+ }
+}
+void EditorAudioBus::_bus_popup_pressed(int p_option) {
if (p_option == 2) {
// Reset volume
emit_signal("vol_reset_request");
@@ -577,7 +569,6 @@ void EditorAudioBus::_bus_popup_pressed(int p_option) {
}
Variant EditorAudioBus::get_drag_data(const Point2 &p_point) {
-
if (get_index() == 0) {
return Variant();
}
@@ -586,7 +577,7 @@ Variant EditorAudioBus::get_drag_data(const Point2 &p_point) {
Panel *p = memnew(Panel);
c->add_child(p);
p->set_modulate(Color(1, 1, 1, 0.7));
- p->add_style_override("panel", get_stylebox("focus", "Button"));
+ p->add_theme_style_override("panel", get_theme_stylebox("focus", "Button"));
p->set_size(get_size());
p->set_position(-p_point);
set_drag_preview(c);
@@ -602,7 +593,6 @@ Variant EditorAudioBus::get_drag_data(const Point2 &p_point) {
}
bool EditorAudioBus::can_drop_data(const Point2 &p_point, const Variant &p_data) const {
-
if (get_index() == 0) {
return false;
}
@@ -617,13 +607,11 @@ bool EditorAudioBus::can_drop_data(const Point2 &p_point, const Variant &p_data)
}
void EditorAudioBus::drop_data(const Point2 &p_point, const Variant &p_data) {
-
Dictionary d = p_data;
emit_signal("dropped", d["index"], get_index());
}
Variant EditorAudioBus::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
TreeItem *item = effects->get_item_at_position(p_point);
if (!item) {
return Variant();
@@ -647,14 +635,15 @@ Variant EditorAudioBus::get_drag_data_fw(const Point2 &p_point, Control *p_from)
}
bool EditorAudioBus::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary d = p_data;
- if (!d.has("type") || String(d["type"]) != "audio_bus_effect")
+ if (!d.has("type") || String(d["type"]) != "audio_bus_effect") {
return false;
+ }
TreeItem *item = effects->get_item_at_position(p_point);
- if (!item)
+ if (!item) {
return false;
+ }
effects->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
@@ -662,12 +651,12 @@ bool EditorAudioBus::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
}
void EditorAudioBus::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
Dictionary d = p_data;
TreeItem *item = effects->get_item_at_position(p_point);
- if (!item)
+ if (!item) {
return;
+ }
int pos = effects->get_drop_section_at_position(p_point);
Variant md = item->get_metadata(0);
@@ -677,8 +666,9 @@ void EditorAudioBus::drop_data_fw(const Point2 &p_point, const Variant &p_data,
if (md.get_type() == Variant::INT) {
paste_at = md;
- if (pos > 0)
+ if (pos > 0) {
paste_at++;
+ }
if (bus == get_index() && paste_at > effect) {
paste_at--;
@@ -720,13 +710,14 @@ void EditorAudioBus::drop_data_fw(const Point2 &p_point, const Variant &p_data,
}
void EditorAudioBus::_delete_effect_pressed(int p_option) {
-
TreeItem *item = effects->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
- if (item->get_metadata(0).get_type() != Variant::INT)
+ if (item->get_metadata(0).get_type() != Variant::INT) {
return;
+ }
int index = item->get_metadata(0);
@@ -741,41 +732,27 @@ void EditorAudioBus::_delete_effect_pressed(int p_option) {
}
void EditorAudioBus::_effect_rmb(const Vector2 &p_pos) {
-
TreeItem *item = effects->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
- if (item->get_metadata(0).get_type() != Variant::INT)
+ if (item->get_metadata(0).get_type() != Variant::INT) {
return;
+ }
delete_effect_popup->set_position(get_global_mouse_position());
delete_effect_popup->popup();
}
void EditorAudioBus::_bind_methods() {
-
ClassDB::bind_method("update_bus", &EditorAudioBus::update_bus);
ClassDB::bind_method("update_send", &EditorAudioBus::update_send);
- ClassDB::bind_method("_name_changed", &EditorAudioBus::_name_changed);
- ClassDB::bind_method("_volume_changed", &EditorAudioBus::_volume_changed);
- ClassDB::bind_method("_show_value", &EditorAudioBus::_show_value);
- ClassDB::bind_method("_hide_value_preview", &EditorAudioBus::_hide_value_preview);
- ClassDB::bind_method("_solo_toggled", &EditorAudioBus::_solo_toggled);
- ClassDB::bind_method("_mute_toggled", &EditorAudioBus::_mute_toggled);
- ClassDB::bind_method("_bypass_toggled", &EditorAudioBus::_bypass_toggled);
- ClassDB::bind_method("_name_focus_exit", &EditorAudioBus::_name_focus_exit);
- ClassDB::bind_method("_send_selected", &EditorAudioBus::_send_selected);
- ClassDB::bind_method("_effect_edited", &EditorAudioBus::_effect_edited);
- ClassDB::bind_method("_effect_selected", &EditorAudioBus::_effect_selected);
- ClassDB::bind_method("_effect_add", &EditorAudioBus::_effect_add);
ClassDB::bind_method("_gui_input", &EditorAudioBus::_gui_input);
- ClassDB::bind_method("_bus_popup_pressed", &EditorAudioBus::_bus_popup_pressed);
+ ClassDB::bind_method("_unhandled_key_input", &EditorAudioBus::_unhandled_key_input);
ClassDB::bind_method("get_drag_data_fw", &EditorAudioBus::get_drag_data_fw);
ClassDB::bind_method("can_drop_data_fw", &EditorAudioBus::can_drop_data_fw);
ClassDB::bind_method("drop_data_fw", &EditorAudioBus::drop_data_fw);
- ClassDB::bind_method("_delete_effect_pressed", &EditorAudioBus::_delete_effect_pressed);
- ClassDB::bind_method("_effect_rmb", &EditorAudioBus::_effect_rmb);
ADD_SIGNAL(MethodInfo("duplicate_request"));
ADD_SIGNAL(MethodInfo("delete_request"));
@@ -785,7 +762,6 @@ void EditorAudioBus::_bind_methods() {
}
EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
-
buses = p_buses;
updating_bus = false;
is_master = p_is_master;
@@ -797,31 +773,35 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
add_child(vb);
set_v_size_flags(SIZE_EXPAND_FILL);
+ set_process_unhandled_key_input(true);
track_name = memnew(LineEdit);
- track_name->connect("text_entered", this, "_name_changed");
- track_name->connect("focus_exited", this, "_name_focus_exit");
+ track_name->connect("text_entered", callable_mp(this, &EditorAudioBus::_name_changed));
+ track_name->connect("focus_exited", callable_mp(this, &EditorAudioBus::_name_focus_exit));
vb->add_child(track_name);
HBoxContainer *hbc = memnew(HBoxContainer);
vb->add_child(hbc);
- solo = memnew(ToolButton);
+ solo = memnew(Button);
+ solo->set_flat(true);
solo->set_toggle_mode(true);
solo->set_tooltip(TTR("Solo"));
solo->set_focus_mode(FOCUS_NONE);
- solo->connect("pressed", this, "_solo_toggled");
+ solo->connect("pressed", callable_mp(this, &EditorAudioBus::_solo_toggled));
hbc->add_child(solo);
- mute = memnew(ToolButton);
+ mute = memnew(Button);
+ mute->set_flat(true);
mute->set_toggle_mode(true);
mute->set_tooltip(TTR("Mute"));
mute->set_focus_mode(FOCUS_NONE);
- mute->connect("pressed", this, "_mute_toggled");
+ mute->connect("pressed", callable_mp(this, &EditorAudioBus::_mute_toggled));
hbc->add_child(mute);
- bypass = memnew(ToolButton);
+ bypass = memnew(Button);
+ bypass->set_flat(true);
bypass->set_toggle_mode(true);
bypass->set_tooltip(TTR("Bypass"));
bypass->set_focus_mode(FOCUS_NONE);
- bypass->connect("pressed", this, "_bypass_toggled");
+ bypass->connect("pressed", callable_mp(this, &EditorAudioBus::_bypass_toggled));
hbc->add_child(bypass);
hbc->add_spacer();
@@ -834,10 +814,10 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
Ref<StyleBoxEmpty> sbempty = memnew(StyleBoxEmpty);
for (int i = 0; i < hbc->get_child_count(); i++) {
Control *child = Object::cast_to<Control>(hbc->get_child(i));
- child->add_style_override("normal", sbempty);
- child->add_style_override("hover", sbempty);
- child->add_style_override("focus", sbempty);
- child->add_style_override("pressed", sbempty);
+ child->add_theme_style_override("normal", sbempty);
+ child->add_theme_style_override("hover", sbempty);
+ child->add_theme_style_override("focus", sbempty);
+ child->add_theme_style_override("pressed", sbempty);
}
HSeparator *separator = memnew(HSeparator);
@@ -856,7 +836,6 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
HBoxContainer *audioprev_hbc = memnew(HBoxContainer);
audioprev_hbc->set_v_size_flags(SIZE_EXPAND_FILL);
audioprev_hbc->set_h_size_flags(SIZE_EXPAND_FILL);
- audioprev_hbc->set_mouse_filter(MOUSE_FILTER_PASS);
audio_value_preview_box->add_child(audioprev_hbc);
audio_value_preview_label = memnew(Label);
@@ -870,7 +849,7 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
audio_value_preview_box->set_as_toplevel(true);
Ref<StyleBoxFlat> panel_style = memnew(StyleBoxFlat);
panel_style->set_bg_color(Color(0.0f, 0.0f, 0.0f, 0.8f));
- audio_value_preview_box->add_style_override("panel", panel_style);
+ audio_value_preview_box->add_theme_style_override("panel", panel_style);
audio_value_preview_box->set_mouse_filter(MOUSE_FILTER_PASS);
audio_value_preview_box->hide();
@@ -879,9 +858,9 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
preview_timer->set_one_shot(true);
add_child(preview_timer);
- slider->connect("value_changed", this, "_volume_changed");
- slider->connect("value_changed", this, "_show_value");
- preview_timer->connect("timeout", this, "_hide_value_preview");
+ slider->connect("value_changed", callable_mp(this, &EditorAudioBus::_volume_changed));
+ slider->connect("value_changed", callable_mp(this, &EditorAudioBus::_show_value));
+ preview_timer->connect("timeout", callable_mp(this, &EditorAudioBus::_hide_value_preview));
hb->add_child(slider);
cc = 0;
@@ -919,33 +898,34 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
effects->set_hide_folding(true);
effects->set_v_size_flags(SIZE_EXPAND_FILL);
vb->add_child(effects);
- effects->connect("item_edited", this, "_effect_edited");
- effects->connect("cell_selected", this, "_effect_selected");
+ effects->connect("item_edited", callable_mp(this, &EditorAudioBus::_effect_edited));
+ effects->connect("cell_selected", callable_mp(this, &EditorAudioBus::_effect_selected));
effects->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
effects->set_drag_forwarding(this);
- effects->connect("item_rmb_selected", this, "_effect_rmb");
+ effects->connect("item_rmb_selected", callable_mp(this, &EditorAudioBus::_effect_rmb));
effects->set_allow_rmb_select(true);
effects->set_focus_mode(FOCUS_CLICK);
effects->set_allow_reselect(true);
send = memnew(OptionButton);
send->set_clip_text(true);
- send->connect("item_selected", this, "_send_selected");
+ send->connect("item_selected", callable_mp(this, &EditorAudioBus::_send_selected));
vb->add_child(send);
set_focus_mode(FOCUS_CLICK);
effect_options = memnew(PopupMenu);
- effect_options->connect("index_pressed", this, "_effect_add");
+ effect_options->connect("index_pressed", callable_mp(this, &EditorAudioBus::_effect_add));
add_child(effect_options);
List<StringName> effects;
ClassDB::get_inheriters_from_class("AudioEffect", &effects);
effects.sort_custom<StringName::AlphCompare>();
for (List<StringName>::Element *E = effects.front(); E; E = E->next()) {
- if (!ClassDB::can_instance(E->get()))
+ if (!ClassDB::can_instance(E->get())) {
continue;
+ }
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(E->get());
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_class_icon(E->get());
String name = E->get().operator String().replace("AudioEffect", "");
effect_options->add_item(name);
effect_options->set_item_metadata(effect_options->get_item_count() - 1, E->get());
@@ -957,28 +937,26 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
bus_popup->add_item(TTR("Delete"));
bus_popup->set_item_disabled(1, is_master);
bus_popup->add_item(TTR("Reset Volume"));
- bus_popup->connect("index_pressed", this, "_bus_popup_pressed");
+ bus_popup->connect("index_pressed", callable_mp(this, &EditorAudioBus::_bus_popup_pressed));
delete_effect_popup = memnew(PopupMenu);
delete_effect_popup->add_item(TTR("Delete Effect"));
add_child(delete_effect_popup);
- delete_effect_popup->connect("index_pressed", this, "_delete_effect_pressed");
+ delete_effect_popup->connect("index_pressed", callable_mp(this, &EditorAudioBus::_delete_effect_pressed));
}
void EditorAudioBusDrop::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_DRAW: {
- draw_style_box(get_stylebox("normal", "Button"), Rect2(Vector2(), get_size()));
+ draw_style_box(get_theme_stylebox("normal", "Button"), Rect2(Vector2(), get_size()));
if (hovering_drop) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
accent.a *= 0.7;
draw_rect(Rect2(Point2(), get_size()), accent, false);
}
} break;
case NOTIFICATION_MOUSE_ENTER: {
-
if (!hovering_drop) {
hovering_drop = true;
update();
@@ -986,7 +964,6 @@ void EditorAudioBusDrop::_notification(int p_what) {
} break;
case NOTIFICATION_MOUSE_EXIT:
case NOTIFICATION_DRAG_END: {
-
if (hovering_drop) {
hovering_drop = false;
update();
@@ -996,76 +973,64 @@ void EditorAudioBusDrop::_notification(int p_what) {
}
bool EditorAudioBusDrop::can_drop_data(const Point2 &p_point, const Variant &p_data) const {
-
Dictionary d = p_data;
return (d.has("type") && String(d["type"]) == "move_audio_bus");
}
void EditorAudioBusDrop::drop_data(const Point2 &p_point, const Variant &p_data) {
-
Dictionary d = p_data;
emit_signal("dropped", d["index"], AudioServer::get_singleton()->get_bus_count());
}
void EditorAudioBusDrop::_bind_methods() {
-
ADD_SIGNAL(MethodInfo("dropped"));
}
EditorAudioBusDrop::EditorAudioBusDrop() {
-
hovering_drop = false;
}
void EditorAudioBuses::_update_buses() {
-
while (bus_hb->get_child_count() > 0) {
memdelete(bus_hb->get_child(0));
}
- drop_end = NULL;
+ drop_end = nullptr;
for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) {
-
bool is_master = (i == 0);
EditorAudioBus *audio_bus = memnew(EditorAudioBus(this, is_master));
bus_hb->add_child(audio_bus);
- audio_bus->connect("delete_request", this, "_delete_bus", varray(audio_bus), CONNECT_DEFERRED);
- audio_bus->connect("duplicate_request", this, "_duplicate_bus", varray(), CONNECT_DEFERRED);
- audio_bus->connect("vol_reset_request", this, "_reset_bus_volume", varray(audio_bus), CONNECT_DEFERRED);
- audio_bus->connect("drop_end_request", this, "_request_drop_end");
- audio_bus->connect("dropped", this, "_drop_at_index", varray(), CONNECT_DEFERRED);
+ audio_bus->connect("delete_request", callable_mp(this, &EditorAudioBuses::_delete_bus), varray(audio_bus), CONNECT_DEFERRED);
+ audio_bus->connect("duplicate_request", callable_mp(this, &EditorAudioBuses::_duplicate_bus), varray(), CONNECT_DEFERRED);
+ audio_bus->connect("vol_reset_request", callable_mp(this, &EditorAudioBuses::_reset_bus_volume), varray(audio_bus), CONNECT_DEFERRED);
+ audio_bus->connect("drop_end_request", callable_mp(this, &EditorAudioBuses::_request_drop_end));
+ audio_bus->connect("dropped", callable_mp(this, &EditorAudioBuses::_drop_at_index), varray(), CONNECT_DEFERRED);
}
}
EditorAudioBuses *EditorAudioBuses::register_editor() {
-
EditorAudioBuses *audio_buses = memnew(EditorAudioBuses);
EditorNode::get_singleton()->add_bottom_panel_item(TTR("Audio"), audio_buses);
return audio_buses;
}
void EditorAudioBuses::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
-
- bus_scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ bus_scroll->add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
} break;
case NOTIFICATION_READY: {
-
_update_buses();
} break;
case NOTIFICATION_DRAG_END: {
-
if (drop_end) {
drop_end->queue_delete();
- drop_end = NULL;
+ drop_end = nullptr;
}
} break;
case NOTIFICATION_PROCESS: {
-
// Check if anything was edited.
bool edited = AudioServer::get_singleton()->is_edited();
for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) {
@@ -1088,7 +1053,6 @@ void EditorAudioBuses::_notification(int p_what) {
}
void EditorAudioBuses::_add_bus() {
-
UndoRedo *ur = EditorNode::get_undo_redo();
ur->create_action(TTR("Add Audio Bus"));
@@ -1100,22 +1064,20 @@ void EditorAudioBuses::_add_bus() {
}
void EditorAudioBuses::_update_bus(int p_index) {
-
- if (p_index >= bus_hb->get_child_count())
+ if (p_index >= bus_hb->get_child_count()) {
return;
+ }
bus_hb->get_child(p_index)->call("update_bus");
}
void EditorAudioBuses::_update_sends() {
-
for (int i = 0; i < bus_hb->get_child_count(); i++) {
bus_hb->get_child(i)->call("update_send");
}
}
void EditorAudioBuses::_delete_bus(Object *p_which) {
-
EditorAudioBus *bus = Object::cast_to<EditorAudioBus>(p_which);
int index = bus->get_index();
if (index == 0) {
@@ -1135,7 +1097,6 @@ void EditorAudioBuses::_delete_bus(Object *p_which) {
ur->add_undo_method(AudioServer::get_singleton(), "set_bus_mute", index, AudioServer::get_singleton()->is_bus_mute(index));
ur->add_undo_method(AudioServer::get_singleton(), "set_bus_bypass_effects", index, AudioServer::get_singleton()->is_bus_bypassing_effects(index));
for (int i = 0; i < AudioServer::get_singleton()->get_bus_effect_count(index); i++) {
-
ur->add_undo_method(AudioServer::get_singleton(), "add_bus_effect", index, AudioServer::get_singleton()->get_bus_effect(index, i));
ur->add_undo_method(AudioServer::get_singleton(), "set_bus_effect_enabled", index, i, AudioServer::get_singleton()->is_bus_effect_enabled(index, i));
}
@@ -1145,7 +1106,6 @@ void EditorAudioBuses::_delete_bus(Object *p_which) {
}
void EditorAudioBuses::_duplicate_bus(int p_which) {
-
int add_at_pos = p_which + 1;
UndoRedo *ur = EditorNode::get_undo_redo();
ur->create_action(TTR("Duplicate Audio Bus"));
@@ -1157,7 +1117,6 @@ void EditorAudioBuses::_duplicate_bus(int p_which) {
ur->add_do_method(AudioServer::get_singleton(), "set_bus_mute", add_at_pos, AudioServer::get_singleton()->is_bus_mute(p_which));
ur->add_do_method(AudioServer::get_singleton(), "set_bus_bypass_effects", add_at_pos, AudioServer::get_singleton()->is_bus_bypassing_effects(p_which));
for (int i = 0; i < AudioServer::get_singleton()->get_bus_effect_count(p_which); i++) {
-
ur->add_do_method(AudioServer::get_singleton(), "add_bus_effect", add_at_pos, AudioServer::get_singleton()->get_bus_effect(p_which, i));
ur->add_do_method(AudioServer::get_singleton(), "set_bus_effect_enabled", add_at_pos, i, AudioServer::get_singleton()->is_bus_effect_enabled(p_which, i));
}
@@ -1168,7 +1127,6 @@ void EditorAudioBuses::_duplicate_bus(int p_which) {
}
void EditorAudioBuses::_reset_bus_volume(Object *p_which) {
-
EditorAudioBus *bus = Object::cast_to<EditorAudioBus>(p_which);
int index = bus->get_index();
@@ -1182,18 +1140,16 @@ void EditorAudioBuses::_reset_bus_volume(Object *p_which) {
}
void EditorAudioBuses::_request_drop_end() {
-
if (!drop_end && bus_hb->get_child_count()) {
drop_end = memnew(EditorAudioBusDrop);
bus_hb->add_child(drop_end);
drop_end->set_custom_minimum_size(Object::cast_to<Control>(bus_hb->get_child(0))->get_size());
- drop_end->connect("dropped", this, "_drop_at_index", varray(), CONNECT_DEFERRED);
+ drop_end->connect("dropped", callable_mp(this, &EditorAudioBuses::_drop_at_index), varray(), CONNECT_DEFERRED);
}
}
void EditorAudioBuses::_drop_at_index(int p_bus, int p_index) {
-
UndoRedo *ur = EditorNode::get_undo_redo();
ur->create_action(TTR("Move Audio Bus"));
@@ -1208,45 +1164,39 @@ void EditorAudioBuses::_drop_at_index(int p_bus, int p_index) {
}
void EditorAudioBuses::_server_save() {
-
Ref<AudioBusLayout> state = AudioServer::get_singleton()->generate_bus_layout();
ResourceSaver::save(edited_path, state);
}
void EditorAudioBuses::_select_layout() {
-
EditorNode::get_singleton()->get_filesystem_dock()->select_file(edited_path);
}
void EditorAudioBuses::_save_as_layout() {
-
- file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
file_dialog->set_title(TTR("Save Audio Bus Layout As..."));
file_dialog->set_current_path(edited_path);
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
new_layout = false;
}
void EditorAudioBuses::_new_layout() {
-
- file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
file_dialog->set_title(TTR("Location for New Layout..."));
file_dialog->set_current_path(edited_path);
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
new_layout = true;
}
void EditorAudioBuses::_load_layout() {
-
- file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file_dialog->set_title(TTR("Open Audio Bus Layout"));
file_dialog->set_current_path(edited_path);
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
new_layout = false;
}
void EditorAudioBuses::_load_default_layout() {
-
String layout_path = ProjectSettings::get_singleton()->get("audio/default_bus_layout");
Ref<AudioBusLayout> state = ResourceLoader::load(layout_path, "", true);
@@ -1264,8 +1214,7 @@ void EditorAudioBuses::_load_default_layout() {
}
void EditorAudioBuses::_file_dialog_callback(const String &p_string) {
-
- if (file_dialog->get_mode() == EditorFileDialog::MODE_OPEN_FILE) {
+ if (file_dialog->get_file_mode() == EditorFileDialog::FILE_MODE_OPEN_FILE) {
Ref<AudioBusLayout> state = ResourceLoader::load(p_string, "", true);
if (state.is_null()) {
EditorNode::get_singleton()->show_warning(TTR("Invalid file, not an audio bus layout."));
@@ -1279,8 +1228,7 @@ void EditorAudioBuses::_file_dialog_callback(const String &p_string) {
EditorNode::get_singleton()->get_undo_redo()->clear_history();
call_deferred("_select_layout");
- } else if (file_dialog->get_mode() == EditorFileDialog::MODE_SAVE_FILE) {
-
+ } else if (file_dialog->get_file_mode() == EditorFileDialog::FILE_MODE_SAVE_FILE) {
if (new_layout) {
Ref<AudioBusLayout> empty_state;
empty_state.instance();
@@ -1303,29 +1251,14 @@ void EditorAudioBuses::_file_dialog_callback(const String &p_string) {
}
void EditorAudioBuses::_bind_methods() {
-
- ClassDB::bind_method("_add_bus", &EditorAudioBuses::_add_bus);
ClassDB::bind_method("_update_buses", &EditorAudioBuses::_update_buses);
ClassDB::bind_method("_update_bus", &EditorAudioBuses::_update_bus);
ClassDB::bind_method("_update_sends", &EditorAudioBuses::_update_sends);
- ClassDB::bind_method("_delete_bus", &EditorAudioBuses::_delete_bus);
- ClassDB::bind_method("_request_drop_end", &EditorAudioBuses::_request_drop_end);
- ClassDB::bind_method("_drop_at_index", &EditorAudioBuses::_drop_at_index);
- ClassDB::bind_method("_server_save", &EditorAudioBuses::_server_save);
ClassDB::bind_method("_select_layout", &EditorAudioBuses::_select_layout);
- ClassDB::bind_method("_save_as_layout", &EditorAudioBuses::_save_as_layout);
- ClassDB::bind_method("_load_layout", &EditorAudioBuses::_load_layout);
- ClassDB::bind_method("_load_default_layout", &EditorAudioBuses::_load_default_layout);
- ClassDB::bind_method("_new_layout", &EditorAudioBuses::_new_layout);
- ClassDB::bind_method("_duplicate_bus", &EditorAudioBuses::_duplicate_bus);
- ClassDB::bind_method("_reset_bus_volume", &EditorAudioBuses::_reset_bus_volume);
-
- ClassDB::bind_method("_file_dialog_callback", &EditorAudioBuses::_file_dialog_callback);
}
EditorAudioBuses::EditorAudioBuses() {
-
- drop_end = NULL;
+ drop_end = nullptr;
top_hb = memnew(HBoxContainer);
add_child(top_hb);
@@ -1340,7 +1273,7 @@ EditorAudioBuses::EditorAudioBuses() {
top_hb->add_child(add);
add->set_text(TTR("Add Bus"));
add->set_tooltip(TTR("Add a new Audio Bus to this layout."));
- add->connect("pressed", this, "_add_bus");
+ add->connect("pressed", callable_mp(this, &EditorAudioBuses::_add_bus));
VSeparator *separator = memnew(VSeparator);
top_hb->add_child(separator);
@@ -1349,25 +1282,25 @@ EditorAudioBuses::EditorAudioBuses() {
load->set_text(TTR("Load"));
load->set_tooltip(TTR("Load an existing Bus Layout."));
top_hb->add_child(load);
- load->connect("pressed", this, "_load_layout");
+ load->connect("pressed", callable_mp(this, &EditorAudioBuses::_load_layout));
save_as = memnew(Button);
save_as->set_text(TTR("Save As"));
save_as->set_tooltip(TTR("Save this Bus Layout to a file."));
top_hb->add_child(save_as);
- save_as->connect("pressed", this, "_save_as_layout");
+ save_as->connect("pressed", callable_mp(this, &EditorAudioBuses::_save_as_layout));
_default = memnew(Button);
_default->set_text(TTR("Load Default"));
_default->set_tooltip(TTR("Load the default Bus Layout."));
top_hb->add_child(_default);
- _default->connect("pressed", this, "_load_default_layout");
+ _default->connect("pressed", callable_mp(this, &EditorAudioBuses::_load_default_layout));
_new = memnew(Button);
_new->set_text(TTR("Create"));
_new->set_tooltip(TTR("Create a new Bus Layout."));
top_hb->add_child(_new);
- _new->connect("pressed", this, "_new_layout");
+ _new->connect("pressed", callable_mp(this, &EditorAudioBuses::_new_layout));
bus_scroll = memnew(ScrollContainer);
bus_scroll->set_v_size_flags(SIZE_EXPAND_FILL);
@@ -1382,7 +1315,7 @@ EditorAudioBuses::EditorAudioBuses() {
save_timer->set_wait_time(0.8);
save_timer->set_one_shot(true);
add_child(save_timer);
- save_timer->connect("timeout", this, "_server_save");
+ save_timer->connect("timeout", callable_mp(this, &EditorAudioBuses::_server_save));
set_v_size_flags(SIZE_EXPAND_FILL);
@@ -1395,13 +1328,12 @@ EditorAudioBuses::EditorAudioBuses() {
file_dialog->add_filter("*." + E->get() + "; Audio Bus Layout");
}
add_child(file_dialog);
- file_dialog->connect("file_selected", this, "_file_dialog_callback");
+ file_dialog->connect("file_selected", callable_mp(this, &EditorAudioBuses::_file_dialog_callback));
set_process(true);
}
void EditorAudioBuses::open_layout(const String &p_path) {
-
EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
Ref<AudioBusLayout> state = ResourceLoader::load(p_path, "", true);
@@ -1419,9 +1351,7 @@ void EditorAudioBuses::open_layout(const String &p_path) {
}
void AudioBusesEditorPlugin::edit(Object *p_node) {
-
if (Object::cast_to<AudioBusLayout>(p_node)) {
-
String path = Object::cast_to<AudioBusLayout>(p_node)->get_path();
if (path.is_resource_file()) {
audio_bus_editor->open_layout(path);
@@ -1430,15 +1360,13 @@ void AudioBusesEditorPlugin::edit(Object *p_node) {
}
bool AudioBusesEditorPlugin::handles(Object *p_node) const {
-
- return (Object::cast_to<AudioBusLayout>(p_node) != NULL);
+ return (Object::cast_to<AudioBusLayout>(p_node) != nullptr);
}
void AudioBusesEditorPlugin::make_visible(bool p_visible) {
}
AudioBusesEditorPlugin::AudioBusesEditorPlugin(EditorAudioBuses *p_node) {
-
audio_bus_editor = p_node;
}
@@ -1446,13 +1374,11 @@ AudioBusesEditorPlugin::~AudioBusesEditorPlugin() {
}
void EditorAudioMeterNotches::add_notch(float p_normalized_offset, float p_db_value, bool p_render_value) {
-
notches.push_back(AudioNotch(p_normalized_offset, p_db_value, p_render_value));
}
Size2 EditorAudioMeterNotches::get_minimum_size() const {
-
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
float font_height = font->get_height();
float width = 0;
@@ -1470,13 +1396,11 @@ Size2 EditorAudioMeterNotches::get_minimum_size() const {
}
void EditorAudioMeterNotches::_bind_methods() {
-
ClassDB::bind_method("add_notch", &EditorAudioMeterNotches::add_notch);
ClassDB::bind_method("_draw_audio_notches", &EditorAudioMeterNotches::_draw_audio_notches);
}
void EditorAudioMeterNotches::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_THEME_CHANGED: {
notch_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1, 1, 1) : Color(0, 0, 0);
@@ -1488,8 +1412,7 @@ void EditorAudioMeterNotches::_notification(int p_what) {
}
void EditorAudioMeterNotches::_draw_audio_notches() {
-
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
float font_height = font->get_height();
for (int i = 0; i < notches.size(); i++) {
@@ -1509,11 +1432,6 @@ void EditorAudioMeterNotches::_draw_audio_notches() {
}
}
-EditorAudioMeterNotches::EditorAudioMeterNotches() :
- line_length(5.0f),
- label_space(2.0f),
- btm_padding(9.0f),
- top_padding(5.0f) {
-
+EditorAudioMeterNotches::EditorAudioMeterNotches() {
notch_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1, 1, 1) : Color(0, 0, 0);
}
diff --git a/editor/editor_audio_buses.h b/editor/editor_audio_buses.h
index ef6f7e458f..b6cf1183b5 100644
--- a/editor/editor_audio_buses.h
+++ b/editor/editor_audio_buses.h
@@ -45,16 +45,14 @@
#include "scene/gui/slider.h"
#include "scene/gui/texture_progress.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
class EditorAudioBuses;
class EditorAudioBus : public PanelContainer {
-
GDCLASS(EditorAudioBus, PanelContainer);
- Ref<Texture> disabled_vu;
+ Ref<Texture2D> disabled_vu;
LineEdit *track_name;
MenuButton *bus_options;
VSlider *slider;
@@ -93,6 +91,7 @@ class EditorAudioBus : public PanelContainer {
mutable bool hovering_drop;
void _gui_input(const Ref<InputEvent> &p_event);
+ void _unhandled_key_input(Ref<InputEvent> p_event);
void _bus_popup_pressed(int p_option);
void _name_changed(const String &p_new_name);
@@ -113,9 +112,9 @@ class EditorAudioBus : public PanelContainer {
void _effect_rmb(const Vector2 &p_pos);
void _update_visible_channels();
- virtual Variant get_drag_data(const Point2 &p_point);
- virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
- virtual void drop_data(const Point2 &p_point, const Variant &p_data);
+ virtual Variant get_drag_data(const Point2 &p_point) override;
+ virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override;
+ virtual void drop_data(const Point2 &p_point, const Variant &p_data) override;
Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
@@ -133,15 +132,14 @@ public:
void update_bus();
void update_send();
- EditorAudioBus(EditorAudioBuses *p_buses = NULL, bool p_is_master = false);
+ EditorAudioBus(EditorAudioBuses *p_buses = nullptr, bool p_is_master = false);
};
class EditorAudioBusDrop : public Control {
-
GDCLASS(EditorAudioBusDrop, Control);
- virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
- virtual void drop_data(const Point2 &p_point, const Variant &p_data);
+ virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override;
+ virtual void drop_data(const Point2 &p_point, const Variant &p_data) override;
mutable bool hovering_drop;
@@ -154,7 +152,6 @@ public:
};
class EditorAudioBuses : public VBoxContainer {
-
GDCLASS(EditorAudioBuses, VBoxContainer);
HBoxContainer *top_hb;
@@ -233,7 +230,7 @@ private:
render_db_value = n.render_db_value;
}
- _FORCE_INLINE_ AudioNotch operator=(const EditorAudioMeterNotches::AudioNotch &n) {
+ _FORCE_INLINE_ AudioNotch &operator=(const EditorAudioMeterNotches::AudioNotch &n) {
relative_position = n.relative_position;
db_value = n.db_value;
render_db_value = n.render_db_value;
@@ -246,14 +243,14 @@ private:
List<AudioNotch> notches;
public:
- float line_length;
- float label_space;
- float btm_padding;
- float top_padding;
+ float line_length = 5.0f;
+ float label_space = 2.0f;
+ float btm_padding = 9.0f;
+ float top_padding = 5.0f;
Color notch_color;
void add_notch(float p_normalized_offset, float p_db_value, bool p_render_value = false);
- Size2 get_minimum_size() const;
+ Size2 get_minimum_size() const override;
private:
static void _bind_methods();
@@ -265,17 +262,16 @@ public:
};
class AudioBusesEditorPlugin : public EditorPlugin {
-
GDCLASS(AudioBusesEditorPlugin, EditorPlugin);
EditorAudioBuses *audio_bus_editor;
public:
- virtual String get_name() const { return "SampleLibrary"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_node);
- virtual bool handles(Object *p_node) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "SampleLibrary"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_node) override;
+ virtual bool handles(Object *p_node) const override;
+ virtual void make_visible(bool p_visible) override;
AudioBusesEditorPlugin(EditorAudioBuses *p_node);
~AudioBusesEditorPlugin();
diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp
index dba8c2ec8c..5d101ff2c2 100644
--- a/editor/editor_autoload_settings.cpp
+++ b/editor/editor_autoload_settings.cpp
@@ -35,23 +35,18 @@
#include "editor_node.h"
#include "editor_scale.h"
#include "project_settings_editor.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/resources/packed_scene.h"
#define PREVIEW_LIST_MAX_SIZE 10
void EditorAutoloadSettings::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
-
List<String> afn;
ResourceLoader::get_recognized_extensions_for_type("Script", &afn);
ResourceLoader::get_recognized_extensions_for_type("PackedScene", &afn);
- EditorFileDialog *file_dialog = autoload_add_path->get_file_dialog();
-
for (List<String>::Element *E = afn.front(); E; E = E->next()) {
-
file_dialog->add_filter("*." + E->get());
}
@@ -61,29 +56,34 @@ void EditorAutoloadSettings::_notification(int p_what) {
get_tree()->get_root()->call_deferred("add_child", info.node);
}
}
+ browse_button->set_icon(get_theme_icon("Folder", "EditorIcons"));
+ } else if (p_what == NOTIFICATION_THEME_CHANGED) {
+ browse_button->set_icon(get_theme_icon("Folder", "EditorIcons"));
}
}
bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, String *r_error) {
-
if (!p_name.is_valid_identifier()) {
- if (r_error)
+ if (r_error) {
*r_error = TTR("Invalid name.") + "\n" + TTR("Valid characters:") + " a-z, A-Z, 0-9 or _";
+ }
return false;
}
if (ClassDB::class_exists(p_name)) {
- if (r_error)
+ if (r_error) {
*r_error = TTR("Invalid name.") + "\n" + TTR("Must not collide with an existing engine class name.");
+ }
return false;
}
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
if (Variant::get_type_name(Variant::Type(i)) == p_name) {
- if (r_error)
+ if (r_error) {
*r_error = TTR("Invalid name.") + "\n" + TTR("Must not collide with an existing built-in type name.");
+ }
return false;
}
@@ -91,8 +91,9 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin
for (int i = 0; i < GlobalConstants::get_global_constant_count(); i++) {
if (GlobalConstants::get_global_constant_name(i) == p_name) {
- if (r_error)
+ if (r_error) {
*r_error = TTR("Invalid name.") + "\n" + TTR("Must not collide with an existing global constant name.");
+ }
return false;
}
@@ -103,8 +104,9 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin
ScriptServer::get_language(i)->get_reserved_words(&keywords);
for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
if (E->get() == p_name) {
- if (r_error)
+ if (r_error) {
*r_error = TTR("Invalid name.") + "\n" + TTR("Keyword cannot be used as an autoload name.");
+ }
return false;
}
@@ -115,28 +117,28 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin
}
void EditorAutoloadSettings::_autoload_add() {
-
- if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_line_edit()->get_text()))
- autoload_add_path->get_line_edit()->set_text("");
+ if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_text())) {
+ autoload_add_path->set_text("");
+ }
autoload_add_name->set_text("");
add_autoload->set_disabled(true);
}
void EditorAutoloadSettings::_autoload_selected() {
-
TreeItem *ti = tree->get_selected();
- if (!ti)
+ if (!ti) {
return;
+ }
selected_autoload = "autoload/" + ti->get_text(0);
}
void EditorAutoloadSettings::_autoload_edited() {
-
- if (updating_autoload)
+ if (updating_autoload) {
return;
+ }
TreeItem *ti = tree->get_edited();
int column = tree->get_edited_column();
@@ -147,8 +149,9 @@ void EditorAutoloadSettings::_autoload_edited() {
String name = ti->get_text(0);
String old_name = selected_autoload.get_slice("/", 1);
- if (name == old_name)
+ if (name == old_name) {
return;
+ }
String error;
if (!_autoload_name_is_valid(name, &error)) {
@@ -198,12 +201,14 @@ void EditorAutoloadSettings::_autoload_edited() {
int order = ProjectSettings::get_singleton()->get_order(base);
String path = ProjectSettings::get_singleton()->get(base);
- if (path.begins_with("*"))
+ if (path.begins_with("*")) {
path = path.substr(1, path.length());
+ }
// Singleton autoloads are represented with a leading "*" in their path.
- if (checked)
+ if (checked) {
path = "*" + path;
+ }
undo_redo->create_action(TTR("Toggle AutoLoad Globals"));
@@ -226,7 +231,6 @@ void EditorAutoloadSettings::_autoload_edited() {
}
void EditorAutoloadSettings::_autoload_button_pressed(Object *p_item, int p_column, int p_button) {
-
TreeItem *ti = Object::cast_to<TreeItem>(p_item);
String name = "autoload/" + ti->get_text(0);
@@ -239,8 +243,7 @@ void EditorAutoloadSettings::_autoload_button_pressed(Object *p_item, int p_colu
} break;
case BUTTON_MOVE_UP:
case BUTTON_MOVE_DOWN: {
-
- TreeItem *swap = NULL;
+ TreeItem *swap = nullptr;
if (p_button == BUTTON_MOVE_UP) {
swap = ti->get_prev();
@@ -248,8 +251,9 @@ void EditorAutoloadSettings::_autoload_button_pressed(Object *p_item, int p_colu
swap = ti->get_next();
}
- if (!swap)
+ if (!swap) {
return;
+ }
String swap_name = "autoload/" + swap->get_text(0);
@@ -273,7 +277,6 @@ void EditorAutoloadSettings::_autoload_button_pressed(Object *p_item, int p_colu
undo_redo->commit_action();
} break;
case BUTTON_DELETE: {
-
int order = ProjectSettings::get_singleton()->get_order(name);
undo_redo->create_action(TTR("Remove Autoload"));
@@ -297,8 +300,9 @@ void EditorAutoloadSettings::_autoload_button_pressed(Object *p_item, int p_colu
void EditorAutoloadSettings::_autoload_activated() {
TreeItem *ti = tree->get_selected();
- if (!ti)
+ if (!ti) {
return;
+ }
_autoload_open(ti->get_text(1));
}
@@ -312,7 +316,6 @@ void EditorAutoloadSettings::_autoload_open(const String &fpath) {
}
void EditorAutoloadSettings::_autoload_file_callback(const String &p_path) {
-
// Convert the file name to PascalCase, which is the convention for classes in GDScript.
const String class_name = p_path.get_file().get_basename().capitalize().replace(" ", "");
@@ -325,28 +328,25 @@ void EditorAutoloadSettings::_autoload_file_callback(const String &p_path) {
}
void EditorAutoloadSettings::_autoload_text_entered(const String p_name) {
-
- if (autoload_add_path->get_line_edit()->get_text() != "" && _autoload_name_is_valid(p_name, NULL)) {
+ if (autoload_add_path->get_text() != "" && _autoload_name_is_valid(p_name, nullptr)) {
_autoload_add();
}
}
void EditorAutoloadSettings::_autoload_path_text_changed(const String p_path) {
-
add_autoload->set_disabled(
- p_path == "" || !_autoload_name_is_valid(autoload_add_name->get_text(), NULL));
+ p_path == "" || !_autoload_name_is_valid(autoload_add_name->get_text(), nullptr));
}
void EditorAutoloadSettings::_autoload_text_changed(const String p_name) {
-
add_autoload->set_disabled(
- autoload_add_path->get_line_edit()->get_text() == "" || !_autoload_name_is_valid(p_name, NULL));
+ autoload_add_path->get_text() == "" || !_autoload_name_is_valid(p_name, nullptr));
}
Node *EditorAutoloadSettings::_create_autoload(const String &p_path) {
RES res = ResourceLoader::load(p_path);
- ERR_FAIL_COND_V_MSG(res.is_null(), NULL, "Can't autoload: " + p_path + ".");
- Node *n = NULL;
+ ERR_FAIL_COND_V_MSG(res.is_null(), nullptr, "Can't autoload: " + p_path + ".");
+ Node *n = nullptr;
if (res->is_class("PackedScene")) {
Ref<PackedScene> ps = res;
n = ps->instance();
@@ -354,25 +354,25 @@ Node *EditorAutoloadSettings::_create_autoload(const String &p_path) {
Ref<Script> s = res;
StringName ibt = s->get_instance_base_type();
bool valid_type = ClassDB::is_parent_class(ibt, "Node");
- ERR_FAIL_COND_V_MSG(!valid_type, NULL, "Script does not inherit a Node: " + p_path + ".");
+ ERR_FAIL_COND_V_MSG(!valid_type, nullptr, "Script does not inherit a Node: " + p_path + ".");
Object *obj = ClassDB::instance(ibt);
- ERR_FAIL_COND_V_MSG(obj == NULL, NULL, "Cannot instance script for autoload, expected 'Node' inheritance, got: " + String(ibt) + ".");
+ ERR_FAIL_COND_V_MSG(obj == nullptr, nullptr, "Cannot instance script for autoload, expected 'Node' inheritance, got: " + String(ibt) + ".");
n = Object::cast_to<Node>(obj);
- n->set_script(s.get_ref_ptr());
+ n->set_script(s);
}
- ERR_FAIL_COND_V_MSG(!n, NULL, "Path in autoload not a node or script: " + p_path + ".");
+ ERR_FAIL_COND_V_MSG(!n, nullptr, "Path in autoload not a node or script: " + p_path + ".");
return n;
}
void EditorAutoloadSettings::update_autoload() {
-
- if (updating_autoload)
+ if (updating_autoload) {
return;
+ }
updating_autoload = true;
@@ -393,17 +393,18 @@ void EditorAutoloadSettings::update_autoload() {
ProjectSettings::get_singleton()->get_property_list(&props);
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
-
const PropertyInfo &pi = E->get();
- if (!pi.name.begins_with("autoload/"))
+ if (!pi.name.begins_with("autoload/")) {
continue;
+ }
String name = pi.name.get_slice("/", 1);
String path = ProjectSettings::get_singleton()->get(pi.name);
- if (name.empty())
+ if (name.empty()) {
continue;
+ }
AutoLoadInfo info;
info.is_singleton = path.begins_with("*");
@@ -429,7 +430,7 @@ void EditorAutoloadSettings::update_autoload() {
to_remove.erase(name);
need_to_add = false;
} else {
- info.node = NULL;
+ info.node = nullptr;
}
}
}
@@ -452,10 +453,10 @@ void EditorAutoloadSettings::update_autoload() {
item->set_editable(2, true);
item->set_text(2, TTR("Enable"));
item->set_checked(2, info.is_singleton);
- item->add_button(3, get_icon("Load", "EditorIcons"), BUTTON_OPEN);
- item->add_button(3, get_icon("MoveUp", "EditorIcons"), BUTTON_MOVE_UP);
- item->add_button(3, get_icon("MoveDown", "EditorIcons"), BUTTON_MOVE_DOWN);
- item->add_button(3, get_icon("Remove", "EditorIcons"), BUTTON_DELETE);
+ item->add_button(3, get_theme_icon("Load", "EditorIcons"), BUTTON_OPEN);
+ item->add_button(3, get_theme_icon("MoveUp", "EditorIcons"), BUTTON_MOVE_UP);
+ item->add_button(3, get_theme_icon("MoveDown", "EditorIcons"), BUTTON_MOVE_DOWN);
+ item->add_button(3, get_theme_icon("Remove", "EditorIcons"), BUTTON_DELETE);
item->set_selectable(3, false);
}
@@ -474,8 +475,10 @@ void EditorAutoloadSettings::update_autoload() {
if (info.node) {
info.node->queue_delete();
- info.node = NULL;
+ info.node = nullptr;
}
+
+ ProjectSettings::get_singleton()->remove_autoload(info.name);
}
// Load new/changed autoloads
@@ -502,10 +505,16 @@ void EditorAutoloadSettings::update_autoload() {
}
}
+ ProjectSettings::AutoloadInfo prop_info;
+ prop_info.name = info->name;
+ prop_info.path = info->path;
+ prop_info.is_singleton = info->is_singleton;
+ ProjectSettings::get_singleton()->add_autoload(prop_info);
+
if (!info->in_editor && !info->is_singleton) {
// No reason to keep this node
memdelete(info->node);
- info->node = NULL;
+ info->node = nullptr;
}
}
@@ -517,21 +526,22 @@ void EditorAutoloadSettings::update_autoload() {
}
Variant EditorAutoloadSettings::get_drag_data_fw(const Point2 &p_point, Control *p_control) {
-
- if (autoload_cache.size() <= 1)
+ if (autoload_cache.size() <= 1) {
return false;
+ }
- PoolStringArray autoloads;
+ PackedStringArray autoloads;
- TreeItem *next = tree->get_next_selected(NULL);
+ TreeItem *next = tree->get_next_selected(nullptr);
while (next) {
autoloads.push_back(next->get_text(0));
next = tree->get_next_selected(next);
}
- if (autoloads.size() == 0 || autoloads.size() == autoload_cache.size())
+ if (autoloads.size() == 0 || autoloads.size() == autoload_cache.size()) {
return Variant();
+ }
VBoxContainer *preview = memnew(VBoxContainer);
@@ -555,19 +565,22 @@ Variant EditorAutoloadSettings::get_drag_data_fw(const Point2 &p_point, Control
}
bool EditorAutoloadSettings::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control) const {
- if (updating_autoload)
+ if (updating_autoload) {
return false;
+ }
Dictionary drop_data = p_data;
- if (!drop_data.has("type"))
+ if (!drop_data.has("type")) {
return false;
+ }
if (drop_data.has("type")) {
TreeItem *ti = tree->get_item_at_position(p_point);
- if (!ti)
+ if (!ti) {
return false;
+ }
int section = tree->get_drop_section_at_position(p_point);
@@ -578,16 +591,17 @@ bool EditorAutoloadSettings::can_drop_data_fw(const Point2 &p_point, const Varia
}
void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control) {
-
TreeItem *ti = tree->get_item_at_position(p_point);
- if (!ti)
+ if (!ti) {
return;
+ }
int section = tree->get_drop_section_at_position(p_point);
- if (section < -1)
+ if (section < -1) {
return;
+ }
String name;
bool move_to_back = false;
@@ -604,7 +618,7 @@ void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &
int order = ProjectSettings::get_singleton()->get_order("autoload/" + name);
AutoLoadInfo aux;
- List<AutoLoadInfo>::Element *E = NULL;
+ List<AutoLoadInfo>::Element *E = nullptr;
if (!move_to_back) {
aux.order = order;
@@ -612,7 +626,7 @@ void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &
}
Dictionary drop_data = p_data;
- PoolStringArray autoloads = drop_data["autoloads"];
+ PackedStringArray autoloads = drop_data["autoloads"];
Vector<int> orders;
orders.resize(autoload_cache.size());
@@ -664,23 +678,22 @@ void EditorAutoloadSettings::drop_data_fw(const Point2 &p_point, const Variant &
}
bool EditorAutoloadSettings::autoload_add(const String &p_name, const String &p_path) {
-
String name = p_name;
String error;
if (!_autoload_name_is_valid(name, &error)) {
- EditorNode::get_singleton()->show_warning(error);
+ EditorNode::get_singleton()->show_warning(TTR("Can't add autoload:") + "\n" + error);
return false;
}
const String &path = p_path;
if (!FileAccess::exists(path)) {
- EditorNode::get_singleton()->show_warning(TTR("Invalid path.") + "\n" + TTR("File does not exist."));
+ EditorNode::get_singleton()->show_warning(TTR("Can't add autoload:") + "\n" + vformat(TTR("%s is an invalid path. File does not exist."), path));
return false;
}
if (!path.begins_with("res://")) {
- EditorNode::get_singleton()->show_warning(TTR("Invalid path.") + "\n" + TTR("Not in resource path."));
+ EditorNode::get_singleton()->show_warning(TTR("Can't add autoload:") + "\n" + vformat(TTR("%s is an invalid path. Not in resource path (res://)."), path));
return false;
}
@@ -710,7 +723,6 @@ bool EditorAutoloadSettings::autoload_add(const String &p_name, const String &p_
}
void EditorAutoloadSettings::autoload_remove(const String &p_name) {
-
String name = "autoload/" + p_name;
UndoRedo *undo_redo = EditorNode::get_undo_redo();
@@ -735,17 +747,7 @@ void EditorAutoloadSettings::autoload_remove(const String &p_name) {
}
void EditorAutoloadSettings::_bind_methods() {
-
- ClassDB::bind_method("_autoload_add", &EditorAutoloadSettings::_autoload_add);
- ClassDB::bind_method("_autoload_selected", &EditorAutoloadSettings::_autoload_selected);
- ClassDB::bind_method("_autoload_edited", &EditorAutoloadSettings::_autoload_edited);
- ClassDB::bind_method("_autoload_button_pressed", &EditorAutoloadSettings::_autoload_button_pressed);
- ClassDB::bind_method("_autoload_activated", &EditorAutoloadSettings::_autoload_activated);
- ClassDB::bind_method("_autoload_path_text_changed", &EditorAutoloadSettings::_autoload_path_text_changed);
- ClassDB::bind_method("_autoload_text_entered", &EditorAutoloadSettings::_autoload_text_entered);
- ClassDB::bind_method("_autoload_text_changed", &EditorAutoloadSettings::_autoload_text_changed);
ClassDB::bind_method("_autoload_open", &EditorAutoloadSettings::_autoload_open);
- ClassDB::bind_method("_autoload_file_callback", &EditorAutoloadSettings::_autoload_file_callback);
ClassDB::bind_method("get_drag_data_fw", &EditorAutoloadSettings::get_drag_data_fw);
ClassDB::bind_method("can_drop_data_fw", &EditorAutoloadSettings::can_drop_data_fw);
@@ -759,22 +761,22 @@ void EditorAutoloadSettings::_bind_methods() {
}
EditorAutoloadSettings::EditorAutoloadSettings() {
-
// Make first cache
List<PropertyInfo> props;
ProjectSettings::get_singleton()->get_property_list(&props);
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
-
const PropertyInfo &pi = E->get();
- if (!pi.name.begins_with("autoload/"))
+ if (!pi.name.begins_with("autoload/")) {
continue;
+ }
String name = pi.name.get_slice("/", 1);
String path = ProjectSettings::get_singleton()->get(pi.name);
- if (name.empty())
+ if (name.empty()) {
continue;
+ }
AutoLoadInfo info;
info.is_singleton = path.begins_with("*");
@@ -814,9 +816,9 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
}
}
- if (!info.is_singleton && !info.in_editor && info.node != NULL) {
+ if (!info.is_singleton && !info.in_editor && info.node != nullptr) {
memdelete(info.node);
- info.node = NULL;
+ info.node = nullptr;
}
}
@@ -832,13 +834,24 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
l->set_text(TTR("Path:"));
hbc->add_child(l);
- autoload_add_path = memnew(EditorLineEditFileChooser);
- autoload_add_path->set_h_size_flags(SIZE_EXPAND_FILL);
- autoload_add_path->get_file_dialog()->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- autoload_add_path->get_file_dialog()->connect("file_selected", this, "_autoload_file_callback");
- autoload_add_path->get_line_edit()->connect("text_changed", this, "_autoload_path_text_changed");
-
+ autoload_add_path = memnew(LineEdit);
hbc->add_child(autoload_add_path);
+ autoload_add_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ autoload_add_path->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_path_text_changed));
+
+ browse_button = memnew(Button);
+ hbc->add_child(browse_button);
+ browse_button->connect("pressed", callable_mp(this, &EditorAutoloadSettings::_browse_autoload_add_path));
+
+ file_dialog = memnew(EditorFileDialog);
+ hbc->add_child(file_dialog);
+ file_dialog->connect("file_selected", callable_mp(this, &EditorAutoloadSettings::_set_autoload_add_path));
+ file_dialog->connect("dir_selected", callable_mp(this, &EditorAutoloadSettings::_set_autoload_add_path));
+ file_dialog->connect("files_selected", callable_mp(this, &EditorAutoloadSettings::_set_autoload_add_path));
+
+ hbc->set_h_size_flags(SIZE_EXPAND_FILL);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ file_dialog->connect("file_selected", callable_mp(this, &EditorAutoloadSettings::_autoload_file_callback));
l = memnew(Label);
l->set_text(TTR("Node Name:"));
@@ -846,13 +859,13 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
autoload_add_name = memnew(LineEdit);
autoload_add_name->set_h_size_flags(SIZE_EXPAND_FILL);
- autoload_add_name->connect("text_entered", this, "_autoload_text_entered");
- autoload_add_name->connect("text_changed", this, "_autoload_text_changed");
+ autoload_add_name->connect("text_entered", callable_mp(this, &EditorAutoloadSettings::_autoload_text_entered));
+ autoload_add_name->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_text_changed));
hbc->add_child(autoload_add_name);
add_autoload = memnew(Button);
add_autoload->set_text(TTR("Add"));
- add_autoload->connect("pressed", this, "_autoload_add");
+ add_autoload->connect("pressed", callable_mp(this, &EditorAutoloadSettings::_autoload_add));
// The button will be enabled once a valid name is entered (either automatically or manually).
add_autoload->set_disabled(true);
hbc->add_child(add_autoload);
@@ -882,10 +895,10 @@ EditorAutoloadSettings::EditorAutoloadSettings() {
tree->set_column_expand(3, false);
tree->set_column_min_width(3, 120 * EDSCALE);
- tree->connect("cell_selected", this, "_autoload_selected");
- tree->connect("item_edited", this, "_autoload_edited");
- tree->connect("button_pressed", this, "_autoload_button_pressed");
- tree->connect("item_activated", this, "_autoload_activated");
+ tree->connect("cell_selected", callable_mp(this, &EditorAutoloadSettings::_autoload_selected));
+ tree->connect("item_edited", callable_mp(this, &EditorAutoloadSettings::_autoload_edited));
+ tree->connect("button_pressed", callable_mp(this, &EditorAutoloadSettings::_autoload_button_pressed));
+ tree->connect("item_activated", callable_mp(this, &EditorAutoloadSettings::_autoload_activated));
tree->set_v_size_flags(SIZE_EXPAND_FILL);
add_child(tree, true);
@@ -899,3 +912,12 @@ EditorAutoloadSettings::~EditorAutoloadSettings() {
}
}
}
+
+void EditorAutoloadSettings::_set_autoload_add_path(const String &p_text) {
+ autoload_add_path->set_text(p_text);
+ autoload_add_path->emit_signal("text_entered", p_text);
+}
+
+void EditorAutoloadSettings::_browse_autoload_add_path() {
+ file_dialog->popup_file_dialog();
+}
diff --git a/editor/editor_autoload_settings.h b/editor/editor_autoload_settings.h
index 653a1b0a78..646fe3992c 100644
--- a/editor/editor_autoload_settings.h
+++ b/editor/editor_autoload_settings.h
@@ -36,7 +36,6 @@
#include "editor_file_dialog.h"
class EditorAutoloadSettings : public VBoxContainer {
-
GDCLASS(EditorAutoloadSettings, VBoxContainer);
enum {
@@ -63,7 +62,7 @@ class EditorAutoloadSettings : public VBoxContainer {
AutoLoadInfo() {
is_singleton = false;
in_editor = false;
- node = NULL;
+ node = nullptr;
}
};
@@ -74,11 +73,13 @@ class EditorAutoloadSettings : public VBoxContainer {
String selected_autoload;
Tree *tree;
- EditorLineEditFileChooser *autoload_add_path;
LineEdit *autoload_add_name;
Button *add_autoload;
+ LineEdit *autoload_add_path;
+ Button *browse_button;
+ EditorFileDialog *file_dialog;
- bool _autoload_name_is_valid(const String &p_name, String *r_error = NULL);
+ bool _autoload_name_is_valid(const String &p_name, String *r_error = nullptr);
void _autoload_add();
void _autoload_selected();
@@ -96,6 +97,9 @@ class EditorAutoloadSettings : public VBoxContainer {
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control) const;
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control);
+ void _set_autoload_add_path(const String &p_text);
+ void _browse_autoload_add_path();
+
protected:
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/editor_builders.py b/editor/editor_builders.py
index 910c53e2ff..86c5c87a68 100644
--- a/editor/editor_builders.py
+++ b/editor/editor_builders.py
@@ -6,26 +6,26 @@ All such functions are invoked in a subprocess on Windows to prevent build flaki
import os
import os.path
from platform_methods import subprocess_main
-from compat import encode_utf8, byte_to_str, open_utf8
def make_doc_header(target, source, env):
dst = target[0]
- g = open_utf8(dst, "w")
+ g = open(dst, "w", encoding="utf-8")
buf = ""
docbegin = ""
docend = ""
for src in source:
if not src.endswith(".xml"):
continue
- with open_utf8(src, "r") as f:
+ with open(src, "r", encoding="utf-8") as f:
content = f.read()
buf += content
- buf = encode_utf8(docbegin + buf + docend)
+ buf = (docbegin + buf + docend).encode("utf-8")
decomp_size = len(buf)
import zlib
+
buf = zlib.compress(buf)
g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
@@ -35,7 +35,7 @@ def make_doc_header(target, source, env):
g.write("static const int _doc_data_uncompressed_size = " + str(decomp_size) + ";\n")
g.write("static const unsigned char _doc_data_compressed[] = {\n")
for i in range(len(buf)):
- g.write("\t" + byte_to_str(buf[i]) + ",\n")
+ g.write("\t" + str(buf[i]) + ",\n")
g.write("};\n")
g.write("#endif")
@@ -47,16 +47,15 @@ def make_fonts_header(target, source, env):
dst = target[0]
- g = open_utf8(dst, "w")
+ g = open(dst, "w", encoding="utf-8")
g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
g.write("#ifndef _EDITOR_FONTS_H\n")
g.write("#define _EDITOR_FONTS_H\n")
# saving uncompressed, since freetype will reference from memory pointer
- xl_names = []
for i in range(len(source)):
- with open(source[i], "rb")as f:
+ with open(source[i], "rb") as f:
buf = f.read()
name = os.path.splitext(os.path.basename(source[i]))[0]
@@ -64,7 +63,7 @@ def make_fonts_header(target, source, env):
g.write("static const int _font_" + name + "_size = " + str(len(buf)) + ";\n")
g.write("static const unsigned char _font_" + name + "[] = {\n")
for j in range(len(buf)):
- g.write("\t" + byte_to_str(buf[j]) + ",\n")
+ g.write("\t" + str(buf[j]) + ",\n")
g.write("};\n")
@@ -73,15 +72,15 @@ def make_fonts_header(target, source, env):
g.close()
-def make_translations_header(target, source, env):
+def make_translations_header(target, source, env, category):
dst = target[0]
- g = open_utf8(dst, "w")
+ g = open(dst, "w", encoding="utf-8")
g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
- g.write("#ifndef _EDITOR_TRANSLATIONS_H\n")
- g.write("#define _EDITOR_TRANSLATIONS_H\n")
+ g.write("#ifndef _{}_TRANSLATIONS_H\n".format(category.upper()))
+ g.write("#define _{}_TRANSLATIONS_H\n".format(category.upper()))
import zlib
import os.path
@@ -96,29 +95,40 @@ def make_translations_header(target, source, env):
buf = zlib.compress(buf)
name = os.path.splitext(os.path.basename(sorted_paths[i]))[0]
- g.write("static const unsigned char _translation_" + name + "_compressed[] = {\n")
+ g.write("static const unsigned char _{}_translation_{}_compressed[] = {{\n".format(category, name))
for j in range(len(buf)):
- g.write("\t" + byte_to_str(buf[j]) + ",\n")
+ g.write("\t" + str(buf[j]) + ",\n")
g.write("};\n")
xl_names.append([name, len(buf), str(decomp_size)])
- g.write("struct EditorTranslationList {\n")
+ g.write("struct {}TranslationList {{\n".format(category.capitalize()))
g.write("\tconst char* lang;\n")
g.write("\tint comp_size;\n")
g.write("\tint uncomp_size;\n")
g.write("\tconst unsigned char* data;\n")
g.write("};\n\n")
- g.write("static EditorTranslationList _editor_translations[] = {\n")
+ g.write("static {}TranslationList _{}_translations[] = {{\n".format(category.capitalize(), category))
for x in xl_names:
- g.write("\t{ \"" + x[0] + "\", " + str(x[1]) + ", " + str(x[2]) + ", _translation_" + x[0] + "_compressed},\n")
- g.write("\t{NULL, 0, 0, NULL}\n")
+ g.write(
+ '\t{{ "{}", {}, {}, _{}_translation_{}_compressed }},\n'.format(x[0], str(x[1]), str(x[2]), category, x[0])
+ )
+ g.write("\t{nullptr, 0, 0, nullptr}\n")
g.write("};\n")
g.write("#endif")
g.close()
-if __name__ == '__main__':
+
+def make_editor_translations_header(target, source, env):
+ make_translations_header(target, source, env, "editor")
+
+
+def make_doc_translations_header(target, source, env):
+ make_translations_header(target, source, env, "doc")
+
+
+if __name__ == "__main__":
subprocess_main(globals())
diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp
index 0b43fd5ac0..5118ccacad 100644
--- a/editor/editor_data.cpp
+++ b/editor/editor_data.cpp
@@ -39,22 +39,23 @@
#include "scene/resources/packed_scene.h"
void EditorHistory::cleanup_history() {
-
for (int i = 0; i < history.size(); i++) {
-
bool fail = false;
for (int j = 0; j < history[i].path.size(); j++) {
- if (!history[i].path[j].ref.is_null())
+ if (!history[i].path[j].ref.is_null()) {
continue;
+ }
Object *obj = ObjectDB::get_instance(history[i].path[j].object);
if (obj) {
Node *n = Object::cast_to<Node>(obj);
- if (n && n->is_inside_tree())
+ if (n && n->is_inside_tree()) {
continue;
- if (!n) // Possibly still alive
+ }
+ if (!n) { // Possibly still alive
continue;
+ }
}
if (j <= history[i].level) {
@@ -74,18 +75,19 @@ void EditorHistory::cleanup_history() {
}
}
- if (current >= history.size())
+ if (current >= history.size()) {
current = history.size() - 1;
+ }
}
void EditorHistory::_add_object(ObjectID p_object, const String &p_property, int p_level_change, bool p_inspector_only) {
-
Object *obj = ObjectDB::get_instance(p_object);
ERR_FAIL_COND(!obj);
Reference *r = Object::cast_to<Reference>(obj);
Obj o;
- if (r)
+ if (r) {
o.ref = REF(r);
+ }
o.object = p_object;
o.property = p_property;
o.inspector_only = p_inspector_only;
@@ -122,127 +124,126 @@ void EditorHistory::_add_object(ObjectID p_object, const String &p_property, int
}
void EditorHistory::add_object_inspector_only(ObjectID p_object) {
-
_add_object(p_object, "", -1, true);
}
void EditorHistory::add_object(ObjectID p_object) {
-
_add_object(p_object, "", -1);
}
void EditorHistory::add_object(ObjectID p_object, const String &p_subprop) {
-
_add_object(p_object, p_subprop, -1);
}
void EditorHistory::add_object(ObjectID p_object, int p_relevel) {
-
_add_object(p_object, "", p_relevel);
}
int EditorHistory::get_history_len() {
return history.size();
}
+
int EditorHistory::get_history_pos() {
return current;
}
bool EditorHistory::is_history_obj_inspector_only(int p_obj) const {
-
ERR_FAIL_INDEX_V(p_obj, history.size(), false);
ERR_FAIL_INDEX_V(history[p_obj].level, history[p_obj].path.size(), false);
return history[p_obj].path[history[p_obj].level].inspector_only;
}
ObjectID EditorHistory::get_history_obj(int p_obj) const {
- ERR_FAIL_INDEX_V(p_obj, history.size(), 0);
- ERR_FAIL_INDEX_V(history[p_obj].level, history[p_obj].path.size(), 0);
+ ERR_FAIL_INDEX_V(p_obj, history.size(), ObjectID());
+ ERR_FAIL_INDEX_V(history[p_obj].level, history[p_obj].path.size(), ObjectID());
return history[p_obj].path[history[p_obj].level].object;
}
bool EditorHistory::is_at_beginning() const {
return current <= 0;
}
-bool EditorHistory::is_at_end() const {
+bool EditorHistory::is_at_end() const {
return ((current + 1) >= history.size());
}
bool EditorHistory::next() {
-
cleanup_history();
- if ((current + 1) < history.size())
+ if ((current + 1) < history.size()) {
current++;
- else
+ } else {
return false;
+ }
return true;
}
bool EditorHistory::previous() {
-
cleanup_history();
- if (current > 0)
+ if (current > 0) {
current--;
- else
+ } else {
return false;
+ }
return true;
}
bool EditorHistory::is_current_inspector_only() const {
-
- if (current < 0 || current >= history.size())
+ if (current < 0 || current >= history.size()) {
return false;
+ }
const History &h = history[current];
return h.path[h.level].inspector_only;
}
-ObjectID EditorHistory::get_current() {
- if (current < 0 || current >= history.size())
- return 0;
+ObjectID EditorHistory::get_current() {
+ if (current < 0 || current >= history.size()) {
+ return ObjectID();
+ }
History &h = history.write[current];
Object *obj = ObjectDB::get_instance(h.path[h.level].object);
- if (!obj)
- return 0;
+ if (!obj) {
+ return ObjectID();
+ }
return obj->get_instance_id();
}
int EditorHistory::get_path_size() const {
-
- if (current < 0 || current >= history.size())
+ if (current < 0 || current >= history.size()) {
return 0;
+ }
const History &h = history[current];
return h.path.size();
}
ObjectID EditorHistory::get_path_object(int p_index) const {
-
- if (current < 0 || current >= history.size())
- return 0;
+ if (current < 0 || current >= history.size()) {
+ return ObjectID();
+ }
const History &h = history[current];
- ERR_FAIL_INDEX_V(p_index, h.path.size(), 0);
+ ERR_FAIL_INDEX_V(p_index, h.path.size(), ObjectID());
Object *obj = ObjectDB::get_instance(h.path[p_index].object);
- if (!obj)
- return 0;
+ if (!obj) {
+ return ObjectID();
+ }
return obj->get_instance_id();
}
String EditorHistory::get_path_property(int p_index) const {
-
- if (current < 0 || current >= history.size())
+ if (current < 0 || current >= history.size()) {
return "";
+ }
const History &h = history[current];
@@ -252,41 +253,39 @@ String EditorHistory::get_path_property(int p_index) const {
}
void EditorHistory::clear() {
-
history.clear();
current = -1;
}
EditorHistory::EditorHistory() {
-
current = -1;
}
EditorPlugin *EditorData::get_editor(Object *p_object) {
-
- for (int i = 0; i < editor_plugins.size(); i++) {
-
- if (editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object))
+ // We need to iterate backwards so that we can check user-created plugins first.
+ // Otherwise, it would not be possible for plugins to handle CanvasItem and Spatial nodes.
+ for (int i = editor_plugins.size() - 1; i > -1; i--) {
+ if (editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object)) {
return editor_plugins[i];
+ }
}
- return NULL;
+ return nullptr;
}
EditorPlugin *EditorData::get_subeditor(Object *p_object) {
-
- for (int i = 0; i < editor_plugins.size(); i++) {
-
- if (!editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object))
+ for (int i = editor_plugins.size() - 1; i > -1; i--) {
+ if (!editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object)) {
return editor_plugins[i];
+ }
}
- return NULL;
+ return nullptr;
}
Vector<EditorPlugin *> EditorData::get_subeditors(Object *p_object) {
Vector<EditorPlugin *> sub_plugins;
- for (int i = 0; i < editor_plugins.size(); i++) {
+ for (int i = editor_plugins.size() - 1; i > -1; i--) {
if (!editor_plugins[i]->has_main_screen() && editor_plugins[i]->handles(p_object)) {
sub_plugins.push_back(editor_plugins[i]);
}
@@ -295,27 +294,25 @@ Vector<EditorPlugin *> EditorData::get_subeditors(Object *p_object) {
}
EditorPlugin *EditorData::get_editor(String p_name) {
-
- for (int i = 0; i < editor_plugins.size(); i++) {
-
- if (editor_plugins[i]->get_name() == p_name)
+ for (int i = editor_plugins.size() - 1; i > -1; i--) {
+ if (editor_plugins[i]->get_name() == p_name) {
return editor_plugins[i];
+ }
}
- return NULL;
+ return nullptr;
}
void EditorData::copy_object_params(Object *p_object) {
-
clipboard.clear();
List<PropertyInfo> pinfo;
p_object->get_property_list(&pinfo);
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
- if (!(E->get().usage & PROPERTY_USAGE_EDITOR) || E->get().name == "script" || E->get().name == "scripts")
+ if (!(E->get().usage & PROPERTY_USAGE_EDITOR) || E->get().name == "script" || E->get().name == "scripts") {
continue;
+ }
PropertyData pd;
pd.name = E->get().name;
@@ -325,21 +322,18 @@ void EditorData::copy_object_params(Object *p_object) {
}
void EditorData::get_editor_breakpoints(List<String> *p_breakpoints) {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->get_breakpoints(p_breakpoints);
}
}
Dictionary EditorData::get_editor_states() const {
-
Dictionary metadata;
for (int i = 0; i < editor_plugins.size(); i++) {
-
Dictionary state = editor_plugins[i]->get_state();
- if (state.empty())
+ if (state.empty()) {
continue;
+ }
metadata[editor_plugins[i]->get_name()] = state;
}
@@ -353,100 +347,85 @@ Dictionary EditorData::get_scene_editor_states(int p_idx) const {
}
void EditorData::set_editor_states(const Dictionary &p_states) {
-
List<Variant> keys;
p_states.get_key_list(&keys);
List<Variant>::Element *E = keys.front();
for (; E; E = E->next()) {
-
String name = E->get();
int idx = -1;
for (int i = 0; i < editor_plugins.size(); i++) {
-
if (editor_plugins[i]->get_name() == name) {
idx = i;
break;
}
}
- if (idx == -1)
+ if (idx == -1) {
continue;
+ }
editor_plugins[idx]->set_state(p_states[name]);
}
}
void EditorData::notify_edited_scene_changed() {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->edited_scene_changed();
editor_plugins[i]->notify_scene_changed(get_edited_scene_root());
}
}
void EditorData::notify_resource_saved(const Ref<Resource> &p_resource) {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->notify_resource_saved(p_resource);
}
}
void EditorData::clear_editor_states() {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->clear();
}
}
void EditorData::save_editor_external_data() {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->save_external_data();
}
}
void EditorData::apply_changes_in_editors() {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->apply_changes();
}
}
void EditorData::save_editor_global_states() {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->save_global_state();
}
}
void EditorData::restore_editor_global_states() {
-
for (int i = 0; i < editor_plugins.size(); i++) {
-
editor_plugins[i]->restore_global_state();
}
}
void EditorData::paste_object_params(Object *p_object) {
-
+ ERR_FAIL_NULL(p_object);
+ undo_redo.create_action(TTR("Paste Params"));
for (List<PropertyData>::Element *E = clipboard.front(); E; E = E->next()) {
-
- p_object->set(E->get().name, E->get().value);
+ String name = E->get().name;
+ undo_redo.add_do_property(p_object, name, E->get().value);
+ undo_redo.add_undo_property(p_object, name, p_object->get(name));
}
+ undo_redo.commit_action();
}
bool EditorData::call_build() {
-
bool result = true;
for (int i = 0; i < editor_plugins.size() && result; i++) {
-
result &= editor_plugins[i]->build();
}
@@ -454,18 +433,15 @@ bool EditorData::call_build() {
}
UndoRedo &EditorData::get_undo_redo() {
-
return undo_redo;
}
void EditorData::remove_editor_plugin(EditorPlugin *p_plugin) {
-
- p_plugin->undo_redo = NULL;
+ p_plugin->undo_redo = nullptr;
editor_plugins.erase(p_plugin);
}
void EditorData::add_editor_plugin(EditorPlugin *p_plugin) {
-
p_plugin->undo_redo = &undo_redo;
editor_plugins.push_back(p_plugin);
}
@@ -473,14 +449,13 @@ void EditorData::add_editor_plugin(EditorPlugin *p_plugin) {
int EditorData::get_editor_plugin_count() const {
return editor_plugins.size();
}
-EditorPlugin *EditorData::get_editor_plugin(int p_idx) {
- ERR_FAIL_INDEX_V(p_idx, editor_plugins.size(), NULL);
+EditorPlugin *EditorData::get_editor_plugin(int p_idx) {
+ ERR_FAIL_INDEX_V(p_idx, editor_plugins.size(), nullptr);
return editor_plugins[p_idx];
}
-void EditorData::add_custom_type(const String &p_type, const String &p_inherits, const Ref<Script> &p_script, const Ref<Texture> &p_icon) {
-
+void EditorData::add_custom_type(const String &p_type, const String &p_inherits, const Ref<Script> &p_script, const Ref<Texture2D> &p_icon) {
ERR_FAIL_COND_MSG(p_script.is_null(), "It's not a reference to a valid Script object.");
CustomType ct;
ct.name = p_type;
@@ -494,31 +469,27 @@ void EditorData::add_custom_type(const String &p_type, const String &p_inherits,
}
Object *EditorData::instance_custom_type(const String &p_type, const String &p_inherits) {
-
if (get_custom_types().has(p_inherits)) {
-
for (int i = 0; i < get_custom_types()[p_inherits].size(); i++) {
if (get_custom_types()[p_inherits][i].name == p_type) {
Ref<Script> script = get_custom_types()[p_inherits][i].script;
Object *ob = ClassDB::instance(p_inherits);
- ERR_FAIL_COND_V(!ob, NULL);
+ ERR_FAIL_COND_V(!ob, nullptr);
if (ob->is_class("Node")) {
ob->call("set_name", p_type);
}
- ob->set_script(script.get_ref_ptr());
+ ob->set_script(script);
return ob;
}
}
}
- return NULL;
+ return nullptr;
}
void EditorData::remove_custom_type(const String &p_type) {
-
- for (Map<String, Vector<CustomType> >::Element *E = custom_types.front(); E; E = E->next()) {
-
+ for (Map<String, Vector<CustomType>>::Element *E = custom_types.front(); E; E = E->next()) {
for (int i = 0; i < E->get().size(); i++) {
if (E->get()[i].name == p_type) {
E->get().remove(i);
@@ -532,28 +503,29 @@ void EditorData::remove_custom_type(const String &p_type) {
}
int EditorData::add_edited_scene(int p_at_pos) {
-
- if (p_at_pos < 0)
+ if (p_at_pos < 0) {
p_at_pos = edited_scene.size();
+ }
EditedScene es;
- es.root = NULL;
+ es.root = nullptr;
es.path = String();
es.history_current = -1;
es.version = 0;
es.live_edit_root = NodePath(String("/root"));
- if (p_at_pos == edited_scene.size())
+ if (p_at_pos == edited_scene.size()) {
edited_scene.push_back(es);
- else
+ } else {
edited_scene.insert(p_at_pos, es);
+ }
- if (current_edited_scene < 0)
+ if (current_edited_scene < 0) {
current_edited_scene = 0;
+ }
return p_at_pos;
}
void EditorData::move_edited_scene_index(int p_idx, int p_to_idx) {
-
ERR_FAIL_INDEX(p_idx, edited_scene.size());
ERR_FAIL_INDEX(p_to_idx, edited_scene.size());
SWAP(edited_scene.write[p_idx], edited_scene.write[p_to_idx]);
@@ -562,7 +534,6 @@ void EditorData::move_edited_scene_index(int p_idx, int p_to_idx) {
void EditorData::remove_scene(int p_idx) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
if (edited_scene[p_idx].root) {
-
for (int i = 0; i < editor_plugins.size(); i++) {
editor_plugins[i]->notify_scene_closed(edited_scene[p_idx].root->get_filename());
}
@@ -570,9 +541,9 @@ void EditorData::remove_scene(int p_idx) {
memdelete(edited_scene[p_idx].root);
}
- if (current_edited_scene > p_idx)
+ if (current_edited_scene > p_idx) {
current_edited_scene--;
- else if (current_edited_scene == p_idx && current_edited_scene > 0) {
+ } else if (current_edited_scene == p_idx && current_edited_scene > 0) {
current_edited_scene--;
}
@@ -580,7 +551,6 @@ void EditorData::remove_scene(int p_idx) {
}
bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, Set<String> &checked_paths) {
-
/*
if (p_root!=p_node && p_node->get_owner()!=p_root && !p_root->is_editable_instance(p_node->get_owner()))
return false;
@@ -598,7 +568,6 @@ bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, Set<String>
String path = ss->get_path();
if (!checked_paths.has(path)) {
-
uint64_t modified_time = FileAccess::get_modified_time(path);
if (modified_time != ss->get_last_modified_time()) {
return true; //external scene changed
@@ -609,20 +578,20 @@ bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, Set<String>
}
for (int i = 0; i < p_node->get_child_count(); i++) {
-
bool found = _find_updated_instances(p_root, p_node->get_child(i), checked_paths);
- if (found)
+ if (found) {
return true;
+ }
}
return false;
}
bool EditorData::check_and_update_scene(int p_idx) {
-
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), false);
- if (!edited_scene[p_idx].root)
+ if (!edited_scene[p_idx].root) {
return false;
+ }
Set<String> checked_scenes;
@@ -646,16 +615,18 @@ bool EditorData::check_and_update_scene(int p_idx) {
for (List<Node *>::Element *E = edited_scene.write[p_idx].selection.front(); E; E = E->next()) {
NodePath p = edited_scene[p_idx].root->get_path_to(E->get());
Node *new_node = new_scene->get_node(p);
- if (new_node)
+ if (new_node) {
new_selection.push_back(new_node);
+ }
}
new_scene->set_filename(edited_scene[p_idx].root->get_filename());
memdelete(edited_scene[p_idx].root);
edited_scene.write[p_idx].root = new_scene;
- if (new_scene->get_filename() != "")
+ if (new_scene->get_filename() != "") {
edited_scene.write[p_idx].path = new_scene->get_filename();
+ }
edited_scene.write[p_idx].selection = new_selection;
return true;
@@ -665,43 +636,42 @@ bool EditorData::check_and_update_scene(int p_idx) {
}
int EditorData::get_edited_scene() const {
-
return current_edited_scene;
}
-void EditorData::set_edited_scene(int p_idx) {
+void EditorData::set_edited_scene(int p_idx) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
current_edited_scene = p_idx;
//swap
}
+
Node *EditorData::get_edited_scene_root(int p_idx) {
if (p_idx < 0) {
- ERR_FAIL_INDEX_V(current_edited_scene, edited_scene.size(), NULL);
+ ERR_FAIL_INDEX_V(current_edited_scene, edited_scene.size(), nullptr);
return edited_scene[current_edited_scene].root;
} else {
- ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), NULL);
+ ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), nullptr);
return edited_scene[p_idx].root;
}
}
-void EditorData::set_edited_scene_root(Node *p_root) {
+void EditorData::set_edited_scene_root(Node *p_root) {
ERR_FAIL_INDEX(current_edited_scene, edited_scene.size());
edited_scene.write[current_edited_scene].root = p_root;
if (p_root) {
- if (p_root->get_filename() != "")
+ if (p_root->get_filename() != "") {
edited_scene.write[current_edited_scene].path = p_root->get_filename();
- else
+ } else {
p_root->set_filename(edited_scene[current_edited_scene].path);
+ }
}
}
int EditorData::get_edited_scene_count() const {
-
return edited_scene.size();
}
Vector<EditorData::EditedScene> EditorData::get_edited_scenes() const {
-
Vector<EditedScene> out_edited_scenes_list = Vector<EditedScene>();
for (int i = 0; i < edited_scene.size(); i++) {
@@ -722,24 +692,24 @@ void EditorData::set_edited_scene_version(uint64_t version, int p_scene_idx) {
}
uint64_t EditorData::get_edited_scene_version() const {
-
ERR_FAIL_INDEX_V(current_edited_scene, edited_scene.size(), 0);
return edited_scene[current_edited_scene].version;
}
+
uint64_t EditorData::get_scene_version(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), 0);
return edited_scene[p_idx].version;
}
String EditorData::get_scene_type(int p_idx) const {
-
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String());
- if (!edited_scene[p_idx].root)
+ if (!edited_scene[p_idx].root) {
return "";
+ }
return edited_scene[p_idx].root->get_class();
}
-void EditorData::move_edited_scene_to_index(int p_idx) {
+void EditorData::move_edited_scene_to_index(int p_idx) {
ERR_FAIL_INDEX(current_edited_scene, edited_scene.size());
ERR_FAIL_INDEX(p_idx, edited_scene.size());
@@ -750,10 +720,10 @@ void EditorData::move_edited_scene_to_index(int p_idx) {
}
Ref<Script> EditorData::get_scene_root_script(int p_idx) const {
-
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), Ref<Script>());
- if (!edited_scene[p_idx].root)
+ if (!edited_scene[p_idx].root) {
return Ref<Script>();
+ }
Ref<Script> s = edited_scene[p_idx].root->get_script();
if (!s.is_valid() && edited_scene[p_idx].root->get_child_count()) {
Node *n = edited_scene[p_idx].root->get_child(0);
@@ -767,10 +737,12 @@ Ref<Script> EditorData::get_scene_root_script(int p_idx) const {
String EditorData::get_scene_title(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String());
- if (!edited_scene[p_idx].root)
+ if (!edited_scene[p_idx].root) {
return TTR("[empty]");
- if (edited_scene[p_idx].root->get_filename() == "")
+ }
+ if (edited_scene[p_idx].root->get_filename() == "") {
return TTR("[unsaved]");
+ }
bool show_ext = EDITOR_DEF("interface/scene_tabs/show_extension", false);
String name = edited_scene[p_idx].root->get_filename().get_file();
if (!show_ext) {
@@ -780,24 +752,24 @@ String EditorData::get_scene_title(int p_idx) const {
}
void EditorData::set_scene_path(int p_idx, const String &p_path) {
-
ERR_FAIL_INDEX(p_idx, edited_scene.size());
edited_scene.write[p_idx].path = p_path;
- if (!edited_scene[p_idx].root)
+ if (!edited_scene[p_idx].root) {
return;
+ }
edited_scene[p_idx].root->set_filename(p_path);
}
String EditorData::get_scene_path(int p_idx) const {
-
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String());
if (edited_scene[p_idx].root) {
- if (edited_scene[p_idx].root->get_filename() == "")
+ if (edited_scene[p_idx].root->get_filename() == "") {
edited_scene[p_idx].root->set_filename(edited_scene[p_idx].path);
- else
+ } else {
return edited_scene[p_idx].root->get_filename();
+ }
}
return edited_scene[p_idx].path;
@@ -808,15 +780,14 @@ void EditorData::set_edited_scene_live_edit_root(const NodePath &p_root) {
edited_scene.write[current_edited_scene].live_edit_root = p_root;
}
-NodePath EditorData::get_edited_scene_live_edit_root() {
+NodePath EditorData::get_edited_scene_live_edit_root() {
ERR_FAIL_INDEX_V(current_edited_scene, edited_scene.size(), String());
return edited_scene[current_edited_scene].live_edit_root;
}
void EditorData::save_edited_scene_state(EditorSelection *p_selection, EditorHistory *p_history, const Dictionary &p_custom) {
-
ERR_FAIL_INDEX(current_edited_scene, edited_scene.size());
EditedScene &es = edited_scene.write[current_edited_scene];
@@ -845,7 +816,6 @@ Dictionary EditorData::restore_edited_scene_state(EditorSelection *p_selection,
}
void EditorData::clear_edited_scenes() {
-
for (int i = 0; i < edited_scene.size(); i++) {
if (edited_scene[i].root) {
memdelete(edited_scene[i].root);
@@ -867,8 +837,9 @@ void EditorData::get_plugin_window_layout(Ref<ConfigFile> p_layout) {
}
bool EditorData::script_class_is_parent(const String &p_class, const String &p_inherits) {
- if (!ScriptServer::is_global_class(p_class))
+ if (!ScriptServer::is_global_class(p_class)) {
return false;
+ }
String base = script_class_get_base(p_class);
Ref<Script> script = script_class_load_script(p_class);
Ref<Script> base_script = script->get_base_script();
@@ -888,10 +859,10 @@ bool EditorData::script_class_is_parent(const String &p_class, const String &p_i
}
StringName EditorData::script_class_get_base(const String &p_class) const {
-
Ref<Script> script = script_class_load_script(p_class);
- if (script.is_null())
+ if (script.is_null()) {
return StringName();
+ }
Ref<Script> base_script = script->get_base_script();
if (base_script.is_null()) {
@@ -906,18 +877,19 @@ Object *EditorData::script_class_instance(const String &p_class) {
Object *obj = ClassDB::instance(ScriptServer::get_global_class_native_base(p_class));
if (obj) {
Ref<Script> script = script_class_load_script(p_class);
- if (script.is_valid())
- obj->set_script(script.get_ref_ptr());
+ if (script.is_valid()) {
+ obj->set_script(script);
+ }
return obj;
}
}
- return NULL;
+ return nullptr;
}
Ref<Script> EditorData::script_class_load_script(const String &p_class) const {
-
- if (!ScriptServer::is_global_class(p_class))
+ if (!ScriptServer::is_global_class(p_class)) {
return Ref<Script>();
+ }
String path = ScriptServer::get_global_class_path(p_class);
return ResourceLoader::load(path, "Script");
@@ -928,15 +900,17 @@ void EditorData::script_class_set_icon_path(const String &p_class, const String
}
String EditorData::script_class_get_icon_path(const String &p_class) const {
- if (!ScriptServer::is_global_class(p_class))
+ if (!ScriptServer::is_global_class(p_class)) {
return String();
+ }
String current = p_class;
String ret = _script_class_icon_paths[current];
while (ret.empty()) {
current = script_class_get_base(current);
- if (!ScriptServer::is_global_class(current))
+ if (!ScriptServer::is_global_class(current)) {
return String();
+ }
ret = _script_class_icon_paths.has(current) ? _script_class_icon_paths[current] : String();
}
@@ -957,8 +931,9 @@ void EditorData::script_class_save_icon_paths() {
Dictionary d;
for (List<StringName>::Element *E = keys.front(); E; E = E->next()) {
- if (ScriptServer::is_global_class(E->get()))
+ if (ScriptServer::is_global_class(E->get())) {
d[E->get()] = _script_class_icon_paths[E->get()];
+ }
}
ProjectSettings::get_singleton()->set("_global_script_class_icons", d);
@@ -984,7 +959,6 @@ void EditorData::script_class_load_icon_paths() {
}
EditorData::EditorData() {
-
current_edited_scene = -1;
//load_imported_scenes_from_globals();
@@ -993,30 +967,30 @@ EditorData::EditorData() {
///////////
void EditorSelection::_node_removed(Node *p_node) {
-
- if (!selection.has(p_node))
+ if (!selection.has(p_node)) {
return;
+ }
Object *meta = selection[p_node];
- if (meta)
+ if (meta) {
memdelete(meta);
+ }
selection.erase(p_node);
changed = true;
nl_changed = true;
}
void EditorSelection::add_node(Node *p_node) {
-
ERR_FAIL_NULL(p_node);
ERR_FAIL_COND(!p_node->is_inside_tree());
- if (selection.has(p_node))
+ if (selection.has(p_node)) {
return;
+ }
changed = true;
nl_changed = true;
- Object *meta = NULL;
+ Object *meta = nullptr;
for (List<Object *>::Element *E = editor_plugins.front(); E; E = E->next()) {
-
meta = E->get()->call("_get_editor_data", p_node);
if (meta) {
break;
@@ -1024,50 +998,47 @@ void EditorSelection::add_node(Node *p_node) {
}
selection[p_node] = meta;
- p_node->connect("tree_exiting", this, "_node_removed", varray(p_node), CONNECT_ONESHOT);
+ p_node->connect("tree_exiting", callable_mp(this, &EditorSelection::_node_removed), varray(p_node), CONNECT_ONESHOT);
//emit_signal("selection_changed");
}
void EditorSelection::remove_node(Node *p_node) {
-
ERR_FAIL_NULL(p_node);
- if (!selection.has(p_node))
+ if (!selection.has(p_node)) {
return;
+ }
changed = true;
nl_changed = true;
Object *meta = selection[p_node];
- if (meta)
+ if (meta) {
memdelete(meta);
+ }
selection.erase(p_node);
- p_node->disconnect("tree_exiting", this, "_node_removed");
+ p_node->disconnect("tree_exiting", callable_mp(this, &EditorSelection::_node_removed));
//emit_signal("selection_changed");
}
-bool EditorSelection::is_selected(Node *p_node) const {
+bool EditorSelection::is_selected(Node *p_node) const {
return selection.has(p_node);
}
Array EditorSelection::_get_transformable_selected_nodes() {
-
Array ret;
for (List<Node *>::Element *E = selected_node_list.front(); E; E = E->next()) {
-
ret.push_back(E->get());
}
return ret;
}
-Array EditorSelection::get_selected_nodes() {
-
- Array ret;
+TypedArray<Node> EditorSelection::get_selected_nodes() {
+ TypedArray<Node> ret;
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
ret.push_back(E->key());
}
@@ -1075,8 +1046,6 @@ Array EditorSelection::get_selected_nodes() {
}
void EditorSelection::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_node_removed"), &EditorSelection::_node_removed);
ClassDB::bind_method(D_METHOD("clear"), &EditorSelection::clear);
ClassDB::bind_method(D_METHOD("add_node", "node"), &EditorSelection::add_node);
ClassDB::bind_method(D_METHOD("remove_node", "node"), &EditorSelection::remove_node);
@@ -1087,19 +1056,17 @@ void EditorSelection::_bind_methods() {
}
void EditorSelection::add_editor_plugin(Object *p_object) {
-
editor_plugins.push_back(p_object);
}
void EditorSelection::_update_nl() {
-
- if (!nl_changed)
+ if (!nl_changed) {
return;
+ }
selected_node_list.clear();
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
Node *parent = E->key();
parent = parent->get_parent();
bool skip = false;
@@ -1111,8 +1078,9 @@ void EditorSelection::_update_nl() {
parent = parent->get_parent();
}
- if (skip)
+ if (skip) {
continue;
+ }
selected_node_list.push_back(E->key());
}
@@ -1120,11 +1088,11 @@ void EditorSelection::_update_nl() {
}
void EditorSelection::update() {
-
_update_nl();
- if (!changed)
+ if (!changed) {
return;
+ }
changed = false;
if (!emitted) {
emitted = true;
@@ -1138,16 +1106,15 @@ void EditorSelection::_emit_change() {
}
List<Node *> &EditorSelection::get_selected_node_list() {
-
- if (changed)
+ if (changed) {
update();
- else
+ } else {
_update_nl();
+ }
return selected_node_list;
}
List<Node *> EditorSelection::get_full_selected_node_list() {
-
List<Node *> node_list;
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
node_list.push_back(E->key());
@@ -1157,23 +1124,20 @@ List<Node *> EditorSelection::get_full_selected_node_list() {
}
void EditorSelection::clear() {
-
while (!selection.empty()) {
-
remove_node(selection.front()->key());
}
changed = true;
nl_changed = true;
}
-EditorSelection::EditorSelection() {
+EditorSelection::EditorSelection() {
emitted = false;
changed = false;
nl_changed = false;
}
EditorSelection::~EditorSelection() {
-
clear();
}
diff --git a/editor/editor_data.h b/editor/editor_data.h
index 1b21ce4451..8083dde09c 100644
--- a/editor/editor_data.h
+++ b/editor/editor_data.h
@@ -39,14 +39,12 @@
#include "scene/resources/texture.h"
class EditorHistory {
-
enum {
HISTORY_MAX = 64
};
struct Obj {
-
REF ref;
ObjectID object;
String property;
@@ -54,7 +52,6 @@ class EditorHistory {
};
struct History {
-
Vector<Obj> path;
int level;
};
@@ -66,7 +63,6 @@ class EditorHistory {
//Vector<EditorPlugin*> editor_plugins;
struct PropertyData {
-
String name;
Variant value;
};
@@ -106,13 +102,11 @@ public:
class EditorSelection;
class EditorData {
-
public:
struct CustomType {
-
String name;
Ref<Script> script;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
};
struct EditedScene {
@@ -131,11 +125,10 @@ private:
Vector<EditorPlugin *> editor_plugins;
struct PropertyData {
-
String name;
Variant value;
};
- Map<String, Vector<CustomType> > custom_types;
+ Map<String, Vector<CustomType>> custom_types;
List<PropertyData> clipboard;
UndoRedo undo_redo;
@@ -178,10 +171,10 @@ public:
void save_editor_global_states();
void restore_editor_global_states();
- void add_custom_type(const String &p_type, const String &p_inherits, const Ref<Script> &p_script, const Ref<Texture> &p_icon);
+ void add_custom_type(const String &p_type, const String &p_inherits, const Ref<Script> &p_script, const Ref<Texture2D> &p_icon);
Object *instance_custom_type(const String &p_type, const String &p_inherits);
void remove_custom_type(const String &p_type);
- const Map<String, Vector<CustomType> > &get_custom_types() const { return custom_types; }
+ const Map<String, Vector<CustomType>> &get_custom_types() const { return custom_types; }
int add_edited_scene(int p_at_pos);
void move_edited_scene_index(int p_idx, int p_to_idx);
@@ -234,7 +227,6 @@ public:
};
class EditorSelection : public Object {
-
GDCLASS(EditorSelection, Object);
private:
@@ -257,15 +249,16 @@ protected:
static void _bind_methods();
public:
- Array get_selected_nodes();
+ TypedArray<Node> get_selected_nodes();
void add_node(Node *p_node);
void remove_node(Node *p_node);
bool is_selected(Node *) const;
template <class T>
T *get_node_editor_data(Node *p_node) {
- if (!selection.has(p_node))
- return NULL;
+ if (!selection.has(p_node)) {
+ return nullptr;
+ }
return Object::cast_to<T>(selection[p_node]);
}
diff --git a/editor/editor_dir_dialog.cpp b/editor/editor_dir_dialog.cpp
index 09e63f70b4..206fdef7c9 100644
--- a/editor/editor_dir_dialog.cpp
+++ b/editor/editor_dir_dialog.cpp
@@ -35,19 +35,19 @@
#include "editor/editor_file_system.h"
#include "editor/editor_settings.h"
#include "editor_scale.h"
-void EditorDirDialog::_update_dir(TreeItem *p_item, EditorFileSystemDirectory *p_dir, const String &p_select_path) {
+#include "servers/display_server.h"
+void EditorDirDialog::_update_dir(TreeItem *p_item, EditorFileSystemDirectory *p_dir, const String &p_select_path) {
updating = true;
String path = p_dir->get_path();
p_item->set_metadata(0, p_dir->get_path());
- p_item->set_icon(0, get_icon("Folder", "EditorIcons"));
+ p_item->set_icon(0, tree->get_theme_icon("Folder", "EditorIcons"));
if (!p_item->get_parent()) {
p_item->set_text(0, "res://");
} else {
-
if (!opened_paths.has(path) && (p_select_path == String() || !p_select_path.begins_with(path))) {
p_item->set_collapsed(true);
}
@@ -59,15 +59,13 @@ void EditorDirDialog::_update_dir(TreeItem *p_item, EditorFileSystemDirectory *p
//bool show_hidden = EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files");
updating = false;
for (int i = 0; i < p_dir->get_subdir_count(); i++) {
-
TreeItem *ti = tree->create_item(p_item);
_update_dir(ti, p_dir->get_subdir(i));
}
}
void EditorDirDialog::reload(const String &p_path) {
-
- if (!is_visible_in_tree()) {
+ if (!is_visible()) {
must_reload = true;
return;
}
@@ -80,51 +78,55 @@ void EditorDirDialog::reload(const String &p_path) {
}
void EditorDirDialog::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
- EditorFileSystem::get_singleton()->connect("filesystem_changed", this, "reload");
+ EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload), make_binds(""));
reload();
- if (!tree->is_connected("item_collapsed", this, "_item_collapsed")) {
- tree->connect("item_collapsed", this, "_item_collapsed", varray(), CONNECT_DEFERRED);
+ if (!tree->is_connected("item_collapsed", callable_mp(this, &EditorDirDialog::_item_collapsed))) {
+ tree->connect("item_collapsed", callable_mp(this, &EditorDirDialog::_item_collapsed), varray(), CONNECT_DEFERRED);
}
- if (!EditorFileSystem::get_singleton()->is_connected("filesystem_changed", this, "reload")) {
- EditorFileSystem::get_singleton()->connect("filesystem_changed", this, "reload");
+ if (!EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &EditorDirDialog::reload))) {
+ EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload), make_binds(""));
}
}
if (p_what == NOTIFICATION_EXIT_TREE) {
- if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", this, "reload")) {
- EditorFileSystem::get_singleton()->disconnect("filesystem_changed", this, "reload");
+ if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &EditorDirDialog::reload))) {
+ EditorFileSystem::get_singleton()->disconnect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload));
}
}
if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
- if (must_reload && is_visible_in_tree()) {
+ if (must_reload && is_visible()) {
reload();
}
}
}
void EditorDirDialog::_item_collapsed(Object *p_item) {
-
TreeItem *item = Object::cast_to<TreeItem>(p_item);
- if (updating)
+ if (updating) {
return;
+ }
- if (item->is_collapsed())
+ if (item->is_collapsed()) {
opened_paths.erase(item->get_metadata(0));
- else
+ } else {
opened_paths.insert(item->get_metadata(0));
+ }
}
-void EditorDirDialog::ok_pressed() {
+void EditorDirDialog::_item_activated() {
+ _ok_pressed(); // From AcceptDialog.
+}
+void EditorDirDialog::ok_pressed() {
TreeItem *ti = tree->get_selected();
- if (!ti)
+ if (!ti) {
return;
+ }
String dir = ti->get_metadata(0);
emit_signal("dir_selected", dir);
@@ -132,23 +134,22 @@ void EditorDirDialog::ok_pressed() {
}
void EditorDirDialog::_make_dir() {
-
TreeItem *ti = tree->get_selected();
if (!ti) {
mkdirerr->set_text(TTR("Please select a base directory first."));
- mkdirerr->popup_centered_minsize();
+ mkdirerr->popup_centered();
return;
}
- makedialog->popup_centered_minsize(Size2(250, 80));
+ makedialog->popup_centered(Size2(250, 80));
makedirname->grab_focus();
}
void EditorDirDialog::_make_dir_confirm() {
-
TreeItem *ti = tree->get_selected();
- if (!ti)
+ if (!ti) {
return;
+ }
String dir = ti->get_metadata(0);
@@ -157,7 +158,7 @@ void EditorDirDialog::_make_dir_confirm() {
Error err = d->make_dir(makedirname->get_text());
if (err != OK) {
- mkdirerr->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ mkdirerr->popup_centered(Size2(250, 80) * EDSCALE);
} else {
opened_paths.insert(dir);
//reload(dir.plus_file(makedirname->get_text()));
@@ -167,17 +168,10 @@ void EditorDirDialog::_make_dir_confirm() {
}
void EditorDirDialog::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_item_collapsed"), &EditorDirDialog::_item_collapsed);
- ClassDB::bind_method(D_METHOD("_make_dir"), &EditorDirDialog::_make_dir);
- ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &EditorDirDialog::_make_dir_confirm);
- ClassDB::bind_method(D_METHOD("reload"), &EditorDirDialog::reload, DEFVAL(""));
-
ADD_SIGNAL(MethodInfo("dir_selected", PropertyInfo(Variant::STRING, "dir")));
}
EditorDirDialog::EditorDirDialog() {
-
updating = false;
set_title(TTR("Choose a Directory"));
@@ -186,10 +180,10 @@ EditorDirDialog::EditorDirDialog() {
tree = memnew(Tree);
add_child(tree);
- tree->connect("item_activated", this, "_ok");
+ tree->connect("item_activated", callable_mp(this, &EditorDirDialog::_item_activated));
- makedir = add_button(TTR("Create Folder"), OS::get_singleton()->get_swap_ok_cancel(), "makedir");
- makedir->connect("pressed", this, "_make_dir");
+ makedir = add_button(TTR("Create Folder"), DisplayServer::get_singleton()->get_swap_cancel_ok(), "makedir");
+ makedir->connect("pressed", callable_mp(this, &EditorDirDialog::_make_dir));
makedialog = memnew(ConfirmationDialog);
makedialog->set_title(TTR("Create Folder"));
@@ -202,7 +196,7 @@ EditorDirDialog::EditorDirDialog() {
makedirname = memnew(LineEdit);
makevb->add_margin_child(TTR("Name:"), makedirname);
makedialog->register_text_enter(makedirname);
- makedialog->connect("confirmed", this, "_make_dir_confirm");
+ makedialog->connect("confirmed", callable_mp(this, &EditorDirDialog::_make_dir_confirm));
mkdirerr = memnew(AcceptDialog);
mkdirerr->set_text(TTR("Could not create folder."));
diff --git a/editor/editor_dir_dialog.h b/editor/editor_dir_dialog.h
index 44f6683034..b688e9dc06 100644
--- a/editor/editor_dir_dialog.h
+++ b/editor/editor_dir_dialog.h
@@ -50,12 +50,13 @@ class EditorDirDialog : public ConfirmationDialog {
bool updating;
void _item_collapsed(Object *p_item);
+ void _item_activated();
void _update_dir(TreeItem *p_item, EditorFileSystemDirectory *p_dir, const String &p_select_path = String());
void _make_dir();
void _make_dir_confirm();
- void ok_pressed();
+ void ok_pressed() override;
bool must_reload;
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index d66b386f93..1d7429eb64 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -32,6 +32,7 @@
#include "core/crypto/crypto_core.h"
#include "core/io/config_file.h"
+#include "core/io/file_access_encrypted.h"
#include "core/io/file_access_pack.h" // PACK_HEADER_MAGIC, PACK_FORMAT_VERSION
#include "core/io/resource_loader.h"
#include "core/io/resource_saver.h"
@@ -48,7 +49,6 @@
#include "scene/resources/resource_format_text.h"
static int _get_pad(int p_alignment, int p_n) {
-
int rest = p_n % p_alignment;
int pad = 0;
if (rest > 0) {
@@ -61,7 +61,6 @@ static int _get_pad(int p_alignment, int p_n) {
#define PCK_PADDING 16
bool EditorExportPreset::_set(const StringName &p_name, const Variant &p_value) {
-
if (values.has(p_name)) {
values[p_name] = p_value;
EditorExport::singleton->save_presets();
@@ -72,7 +71,6 @@ bool EditorExportPreset::_set(const StringName &p_name, const Variant &p_value)
}
bool EditorExportPreset::_get(const StringName &p_name, Variant &r_ret) const {
-
if (values.has(p_name)) {
r_ret = values[p_name];
return true;
@@ -82,9 +80,7 @@ bool EditorExportPreset::_get(const StringName &p_name, Variant &r_ret) const {
}
void EditorExportPreset::_get_property_list(List<PropertyInfo> *p_list) const {
-
for (const List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
-
if (platform->get_option_visibility(E->get().name, values)) {
p_list->push_back(E->get());
}
@@ -92,12 +88,22 @@ void EditorExportPreset::_get_property_list(List<PropertyInfo> *p_list) const {
}
Ref<EditorExportPlatform> EditorExportPreset::get_platform() const {
-
return platform;
}
-Vector<String> EditorExportPreset::get_files_to_export() const {
+void EditorExportPreset::update_files_to_export() {
+ Vector<String> to_remove;
+ for (Set<String>::Element *E = selected_files.front(); E; E = E->next()) {
+ if (!FileAccess::exists(E->get())) {
+ to_remove.push_back(E->get());
+ }
+ }
+ for (int i = 0; i < to_remove.size(); ++i) {
+ selected_files.erase(to_remove[i]);
+ }
+}
+Vector<String> EditorExportPreset::get_files_to_export() const {
Vector<String> files;
for (Set<String>::Element *E = selected_files.front(); E; E = E->next()) {
files.push_back(E->get());
@@ -115,18 +121,15 @@ String EditorExportPreset::get_name() const {
}
void EditorExportPreset::set_runnable(bool p_enable) {
-
runnable = p_enable;
EditorExport::singleton->save_presets();
}
bool EditorExportPreset::is_runnable() const {
-
return runnable;
}
void EditorExportPreset::set_export_filter(ExportFilter p_filter) {
-
export_filter = p_filter;
EditorExport::singleton->save_presets();
}
@@ -136,18 +139,15 @@ EditorExportPreset::ExportFilter EditorExportPreset::get_export_filter() const {
}
void EditorExportPreset::set_include_filter(const String &p_include) {
-
include_filter = p_include;
EditorExport::singleton->save_presets();
}
String EditorExportPreset::get_include_filter() const {
-
return include_filter;
}
void EditorExportPreset::set_export_path(const String &p_path) {
-
export_path = p_path;
/* NOTE(SonerSound): if there is a need to implement a PropertyHint that specifically indicates a relative path,
* this should be removed. */
@@ -159,23 +159,19 @@ void EditorExportPreset::set_export_path(const String &p_path) {
}
String EditorExportPreset::get_export_path() const {
-
return export_path;
}
void EditorExportPreset::set_exclude_filter(const String &p_exclude) {
-
exclude_filter = p_exclude;
EditorExport::singleton->save_presets();
}
String EditorExportPreset::get_exclude_filter() const {
-
return exclude_filter;
}
void EditorExportPreset::add_export_file(const String &p_path) {
-
selected_files.insert(p_path);
EditorExport::singleton->save_presets();
}
@@ -186,16 +182,15 @@ void EditorExportPreset::remove_export_file(const String &p_path) {
}
bool EditorExportPreset::has_export_file(const String &p_path) {
-
return selected_files.has(p_path);
}
void EditorExportPreset::add_patch(const String &p_path, int p_at_pos) {
-
- if (p_at_pos < 0)
+ if (p_at_pos < 0) {
patches.push_back(p_path);
- else
+ } else {
patches.insert(p_at_pos, p_path);
+ }
EditorExport::singleton->save_presets();
}
@@ -209,8 +204,8 @@ void EditorExportPreset::set_patch(int p_index, const String &p_path) {
patches.write[p_index] = p_path;
EditorExport::singleton->save_presets();
}
-String EditorExportPreset::get_patch(int p_index) {
+String EditorExportPreset::get_patch(int p_index) {
ERR_FAIL_INDEX_V(p_index, patches.size(), String());
return patches[p_index];
}
@@ -220,54 +215,77 @@ Vector<String> EditorExportPreset::get_patches() const {
}
void EditorExportPreset::set_custom_features(const String &p_custom_features) {
-
custom_features = p_custom_features;
EditorExport::singleton->save_presets();
}
String EditorExportPreset::get_custom_features() const {
-
return custom_features;
}
-void EditorExportPreset::set_script_export_mode(int p_mode) {
+void EditorExportPreset::set_enc_in_filter(const String &p_filter) {
+ enc_in_filters = p_filter;
+ EditorExport::singleton->save_presets();
+}
+
+String EditorExportPreset::get_enc_in_filter() const {
+ return enc_in_filters;
+}
+
+void EditorExportPreset::set_enc_ex_filter(const String &p_filter) {
+ enc_ex_filters = p_filter;
+ EditorExport::singleton->save_presets();
+}
+
+String EditorExportPreset::get_enc_ex_filter() const {
+ return enc_ex_filters;
+}
+
+void EditorExportPreset::set_enc_pck(bool p_enabled) {
+ enc_pck = p_enabled;
+ EditorExport::singleton->save_presets();
+}
+
+bool EditorExportPreset::get_enc_pck() const {
+ return enc_pck;
+}
+
+void EditorExportPreset::set_enc_directory(bool p_enabled) {
+ enc_directory = p_enabled;
+ EditorExport::singleton->save_presets();
+}
+
+bool EditorExportPreset::get_enc_directory() const {
+ return enc_directory;
+}
+void EditorExportPreset::set_script_export_mode(int p_mode) {
script_mode = p_mode;
EditorExport::singleton->save_presets();
}
int EditorExportPreset::get_script_export_mode() const {
-
return script_mode;
}
void EditorExportPreset::set_script_encryption_key(const String &p_key) {
-
script_key = p_key;
EditorExport::singleton->save_presets();
}
String EditorExportPreset::get_script_encryption_key() const {
-
return script_key;
}
-EditorExportPreset::EditorExportPreset() :
- export_filter(EXPORT_ALL_RESOURCES),
- export_path(""),
- runnable(false),
- script_mode(MODE_SCRIPT_COMPILED) {
-}
-
///////////////////////////////////
void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags) {
-
String host = EditorSettings::get_singleton()->get("network/debug/remote_host");
int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
- if (p_flags & DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST)
+ if (p_flags & DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST) {
host = "localhost";
+ }
if (p_flags & DEBUG_FLAG_DUMB_CLIENT) {
int port = EditorSettings::get_singleton()->get("filesystem/file_server/port");
@@ -281,23 +299,21 @@ void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags)
}
if (p_flags & DEBUG_FLAG_REMOTE_DEBUG) {
-
r_flags.push_back("--remote-debug");
- r_flags.push_back(host + ":" + String::num(remote_port));
+ r_flags.push_back(get_debug_protocol() + host + ":" + String::num(remote_port));
List<String> breakpoints;
ScriptEditor::get_singleton()->get_breakpoints(&breakpoints);
if (breakpoints.size()) {
-
r_flags.push_back("--breakpoints");
String bpoints;
for (const List<String>::Element *E = breakpoints.front(); E; E = E->next()) {
-
bpoints += E->get().replace(" ", "%20");
- if (E->next())
+ if (E->next()) {
bpoints += ",";
+ }
}
r_flags.push_back(bpoints);
@@ -305,31 +321,63 @@ void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags)
}
if (p_flags & DEBUG_FLAG_VIEW_COLLISONS) {
-
r_flags.push_back("--debug-collisions");
}
if (p_flags & DEBUG_FLAG_VIEW_NAVIGATION) {
-
r_flags.push_back("--debug-navigation");
}
}
-Error EditorExportPlatform::_save_pack_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total) {
-
+Error EditorExportPlatform::_save_pack_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key) {
PackData *pd = (PackData *)p_userdata;
SavedData sd;
sd.path_utf8 = p_path.utf8();
sd.ofs = pd->f->get_position();
sd.size = p_data.size();
+ sd.encrypted = false;
+
+ for (int i = 0; i < p_enc_in_filters.size(); ++i) {
+ if (p_path.matchn(p_enc_in_filters[i]) || p_path.replace("res://", "").matchn(p_enc_in_filters[i])) {
+ sd.encrypted = true;
+ break;
+ }
+ }
+
+ for (int i = 0; i < p_enc_ex_filters.size(); ++i) {
+ if (p_path.matchn(p_enc_ex_filters[i]) || p_path.replace("res://", "").matchn(p_enc_ex_filters[i])) {
+ sd.encrypted = false;
+ break;
+ }
+ }
+
+ FileAccessEncrypted *fae = nullptr;
+ FileAccess *ftmp = pd->f;
+
+ if (sd.encrypted) {
+ fae = memnew(FileAccessEncrypted);
+ ERR_FAIL_COND_V(!fae, ERR_SKIP);
+
+ Error err = fae->open_and_parse(ftmp, p_key, FileAccessEncrypted::MODE_WRITE_AES256, false);
+ ERR_FAIL_COND_V(err != OK, ERR_SKIP);
+ ftmp = fae;
+ }
+
+ // Store file content.
+ ftmp->store_buffer(p_data.ptr(), p_data.size());
+
+ if (fae) {
+ fae->release();
+ memdelete(fae);
+ }
- pd->f->store_buffer(p_data.ptr(), p_data.size());
- int pad = _get_pad(PCK_PADDING, sd.size);
+ int pad = _get_pad(PCK_PADDING, pd->f->get_position());
for (int i = 0; i < pad; i++) {
- pd->f->store_8(0);
+ pd->f->store_8(Math::rand() % 256);
}
+ // Store MD5 of original file.
{
unsigned char hash[16];
CryptoCore::md5(p_data.ptr(), p_data.size(), hash);
@@ -348,8 +396,7 @@ Error EditorExportPlatform::_save_pack_file(void *p_userdata, const String &p_pa
return OK;
}
-Error EditorExportPlatform::_save_zip_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total) {
-
+Error EditorExportPlatform::_save_zip_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key) {
String path = p_path.replace_first("res://", "");
ZipData *zd = (ZipData *)p_userdata;
@@ -358,12 +405,12 @@ Error EditorExportPlatform::_save_zip_file(void *p_userdata, const String &p_pat
zipOpenNewFileInZip(zip,
path.utf8().get_data(),
- NULL,
- NULL,
+ nullptr,
+ nullptr,
0,
- NULL,
+ nullptr,
0,
- NULL,
+ nullptr,
Z_DEFLATED,
Z_DEFAULT_COMPRESSION);
@@ -384,7 +431,6 @@ Ref<ImageTexture> EditorExportPlatform::get_option_icon(int p_index) const {
}
String EditorExportPlatform::find_export_template(String template_file_name, String *err) const {
-
String current_version = VERSION_FULL_CONFIG;
String template_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(current_version).plus_file(template_file_name);
@@ -404,7 +450,6 @@ bool EditorExportPlatform::exists_export_template(String template_file_name, Str
}
Ref<EditorExportPreset> EditorExportPlatform::create_preset() {
-
Ref<EditorExportPreset> preset;
preset.instance();
preset->platform = Ref<EditorExportPlatform>(this);
@@ -413,7 +458,6 @@ Ref<EditorExportPreset> EditorExportPlatform::create_preset() {
get_export_options(&options);
for (List<ExportOption>::Element *E = options.front(); E; E = E->next()) {
-
preset->properties.push_back(E->get().option);
preset->values[E->get().option.name] = E->get().default_value;
}
@@ -422,7 +466,6 @@ Ref<EditorExportPreset> EditorExportPlatform::create_preset() {
}
void EditorExportPlatform::_export_find_resources(EditorFileSystemDirectory *p_dir, Set<String> &p_paths) {
-
for (int i = 0; i < p_dir->get_subdir_count(); i++) {
_export_find_resources(p_dir->get_subdir(i), p_paths);
}
@@ -433,40 +476,40 @@ void EditorExportPlatform::_export_find_resources(EditorFileSystemDirectory *p_d
}
void EditorExportPlatform::_export_find_dependencies(const String &p_path, Set<String> &p_paths) {
-
- if (p_paths.has(p_path))
+ if (p_paths.has(p_path)) {
return;
+ }
p_paths.insert(p_path);
EditorFileSystemDirectory *dir;
int file_idx;
dir = EditorFileSystem::get_singleton()->find_file(p_path, &file_idx);
- if (!dir)
+ if (!dir) {
return;
+ }
Vector<String> deps = dir->get_file_deps(file_idx);
for (int i = 0; i < deps.size(); i++) {
-
_export_find_dependencies(deps[i], p_paths);
}
}
void EditorExportPlatform::_edit_files_with_filter(DirAccess *da, const Vector<String> &p_filters, Set<String> &r_list, bool exclude) {
-
da->list_dir_begin();
String cur_dir = da->get_current_dir().replace("\\", "/");
- if (!cur_dir.ends_with("/"))
+ if (!cur_dir.ends_with("/")) {
cur_dir += "/";
+ }
String cur_dir_no_prefix = cur_dir.replace("res://", "");
Vector<String> dirs;
String f;
while ((f = da->get_next()) != "") {
- if (da->current_is_dir())
+ if (da->current_is_dir()) {
dirs.push_back(f);
- else {
+ } else {
String fullpath = cur_dir + f;
// Test also against path without res:// so that filters like `file.txt` can work.
String fullpath_no_prefix = cur_dir_no_prefix + f;
@@ -486,8 +529,9 @@ void EditorExportPlatform::_edit_files_with_filter(DirAccess *da, const Vector<S
for (int i = 0; i < dirs.size(); ++i) {
String dir = dirs[i];
- if (dir.begins_with("."))
+ if (dir.begins_with(".")) {
continue;
+ }
da->change_dir(dir);
_edit_files_with_filter(da, p_filters, r_list, exclude);
da->change_dir("..");
@@ -495,15 +539,16 @@ void EditorExportPlatform::_edit_files_with_filter(DirAccess *da, const Vector<S
}
void EditorExportPlatform::_edit_filter_list(Set<String> &r_list, const String &p_filter, bool exclude) {
-
- if (p_filter == "")
+ if (p_filter == "") {
return;
+ }
Vector<String> split = p_filter.split(",");
Vector<String> filters;
for (int i = 0; i < split.size(); i++) {
String f = split[i].strip_edges();
- if (f.empty())
+ if (f.empty()) {
continue;
+ }
filters.push_back(f);
}
@@ -514,19 +559,16 @@ void EditorExportPlatform::_edit_filter_list(Set<String> &r_list, const String &
}
void EditorExportPlugin::set_export_preset(const Ref<EditorExportPreset> &p_preset) {
-
if (p_preset.is_valid()) {
export_preset = p_preset;
}
}
Ref<EditorExportPreset> EditorExportPlugin::get_export_preset() const {
-
return export_preset;
}
void EditorExportPlugin::add_file(const String &p_path, const Vector<uint8_t> &p_file, bool p_remap) {
-
ExtraFile ef;
ef.data = p_file;
ef.path = p_path;
@@ -535,7 +577,6 @@ void EditorExportPlugin::add_file(const String &p_path, const Vector<uint8_t> &p
}
void EditorExportPlugin::add_shared_object(const String &p_path, const Vector<String> &tags) {
-
shared_objects.push_back(SharedObject(p_path, tags));
}
@@ -543,10 +584,18 @@ void EditorExportPlugin::add_ios_framework(const String &p_path) {
ios_frameworks.push_back(p_path);
}
+void EditorExportPlugin::add_ios_embedded_framework(const String &p_path) {
+ ios_embedded_frameworks.push_back(p_path);
+}
+
Vector<String> EditorExportPlugin::get_ios_frameworks() const {
return ios_frameworks;
}
+Vector<String> EditorExportPlugin::get_ios_embedded_frameworks() const {
+ return ios_embedded_frameworks;
+}
+
void EditorExportPlugin::add_ios_plist_content(const String &p_plist_content) {
ios_plist_content += p_plist_content + "\n";
}
@@ -582,22 +631,27 @@ String EditorExportPlugin::get_ios_cpp_code() const {
return ios_cpp_code;
}
-void EditorExportPlugin::_export_file_script(const String &p_path, const String &p_type, const PoolVector<String> &p_features) {
+void EditorExportPlugin::add_ios_project_static_lib(const String &p_path) {
+ ios_project_static_libs.push_back(p_path);
+}
+
+Vector<String> EditorExportPlugin::get_ios_project_static_libs() const {
+ return ios_project_static_libs;
+}
+void EditorExportPlugin::_export_file_script(const String &p_path, const String &p_type, const Vector<String> &p_features) {
if (get_script_instance()) {
get_script_instance()->call("_export_file", p_path, p_type, p_features);
}
}
-void EditorExportPlugin::_export_begin_script(const PoolVector<String> &p_features, bool p_debug, const String &p_path, int p_flags) {
-
+void EditorExportPlugin::_export_begin_script(const Vector<String> &p_features, bool p_debug, const String &p_path, int p_flags) {
if (get_script_instance()) {
get_script_instance()->call("_export_begin", p_features, p_debug, p_path, p_flags);
}
}
void EditorExportPlugin::_export_end_script() {
-
if (get_script_instance()) {
get_script_instance()->call("_export_end");
}
@@ -610,23 +664,23 @@ void EditorExportPlugin::_export_begin(const Set<String> &p_features, bool p_deb
}
void EditorExportPlugin::skip() {
-
skipped = true;
}
void EditorExportPlugin::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("add_shared_object", "path", "tags"), &EditorExportPlugin::add_shared_object);
+ ClassDB::bind_method(D_METHOD("add_ios_project_static_lib", "path"), &EditorExportPlugin::add_ios_project_static_lib);
ClassDB::bind_method(D_METHOD("add_file", "path", "file", "remap"), &EditorExportPlugin::add_file);
ClassDB::bind_method(D_METHOD("add_ios_framework", "path"), &EditorExportPlugin::add_ios_framework);
+ ClassDB::bind_method(D_METHOD("add_ios_embedded_framework", "path"), &EditorExportPlugin::add_ios_embedded_framework);
ClassDB::bind_method(D_METHOD("add_ios_plist_content", "plist_content"), &EditorExportPlugin::add_ios_plist_content);
ClassDB::bind_method(D_METHOD("add_ios_linker_flags", "flags"), &EditorExportPlugin::add_ios_linker_flags);
ClassDB::bind_method(D_METHOD("add_ios_bundle_file", "path"), &EditorExportPlugin::add_ios_bundle_file);
ClassDB::bind_method(D_METHOD("add_ios_cpp_code", "code"), &EditorExportPlugin::add_ios_cpp_code);
ClassDB::bind_method(D_METHOD("skip"), &EditorExportPlugin::skip);
- BIND_VMETHOD(MethodInfo("_export_file", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::STRING, "type"), PropertyInfo(Variant::POOL_STRING_ARRAY, "features")));
- BIND_VMETHOD(MethodInfo("_export_begin", PropertyInfo(Variant::POOL_STRING_ARRAY, "features"), PropertyInfo(Variant::BOOL, "is_debug"), PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "flags")));
+ BIND_VMETHOD(MethodInfo("_export_file", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::STRING, "type"), PropertyInfo(Variant::PACKED_STRING_ARRAY, "features")));
+ BIND_VMETHOD(MethodInfo("_export_begin", PropertyInfo(Variant::PACKED_STRING_ARRAY, "features"), PropertyInfo(Variant::BOOL, "is_debug"), PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "flags")));
BIND_VMETHOD(MethodInfo("_export_end"));
}
@@ -647,7 +701,6 @@ EditorExportPlatform::FeatureContainers EditorExportPlatform::get_feature_contai
}
if (p_preset->get_custom_features() != String()) {
-
Vector<String> tmp_custom_list = p_preset->get_custom_features().split(",");
for (int i = 0; i < tmp_custom_list.size(); i++) {
@@ -664,7 +717,7 @@ EditorExportPlatform::FeatureContainers EditorExportPlatform::get_feature_contai
EditorExportPlatform::ExportNotifier::ExportNotifier(EditorExportPlatform &p_platform, const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags) {
FeatureContainers features = p_platform.get_feature_containers(p_preset);
- Vector<Ref<EditorExportPlugin> > export_plugins = EditorExport::get_singleton()->get_export_plugins();
+ Vector<Ref<EditorExportPlugin>> export_plugins = EditorExport::get_singleton()->get_export_plugins();
//initial export plugin callback
for (int i = 0; i < export_plugins.size(); i++) {
if (export_plugins[i]->get_script_instance()) { //script based
@@ -676,7 +729,7 @@ EditorExportPlatform::ExportNotifier::ExportNotifier(EditorExportPlatform &p_pla
}
EditorExportPlatform::ExportNotifier::~ExportNotifier() {
- Vector<Ref<EditorExportPlugin> > export_plugins = EditorExport::get_singleton()->get_export_plugins();
+ Vector<Ref<EditorExportPlugin>> export_plugins = EditorExport::get_singleton()->get_export_plugins();
for (int i = 0; i < export_plugins.size(); i++) {
if (export_plugins[i]->get_script_instance()) {
export_plugins.write[i]->_export_end_script();
@@ -698,8 +751,9 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
Vector<String> files = p_preset->get_files_to_export();
for (int i = 0; i < files.size(); i++) {
- if (scenes_only && ResourceLoader::get_resource_type(files[i]) != "PackedScene")
+ if (scenes_only && ResourceLoader::get_resource_type(files[i]) != "PackedScene") {
continue;
+ }
_export_find_dependencies(files[i], paths);
}
@@ -712,9 +766,63 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
_edit_filter_list(paths, p_preset->get_include_filter(), false);
_edit_filter_list(paths, p_preset->get_exclude_filter(), true);
- Vector<Ref<EditorExportPlugin> > export_plugins = EditorExport::get_singleton()->get_export_plugins();
- for (int i = 0; i < export_plugins.size(); i++) {
+ // Get encryption filters.
+ bool enc_pck = p_preset->get_enc_pck();
+ Vector<String> enc_in_filters;
+ Vector<String> enc_ex_filters;
+ Vector<uint8_t> key;
+
+ if (enc_pck) {
+ Vector<String> enc_in_split = p_preset->get_enc_in_filter().split(",");
+ for (int i = 0; i < enc_in_split.size(); i++) {
+ String f = enc_in_split[i].strip_edges();
+ if (f.empty()) {
+ continue;
+ }
+ enc_in_filters.push_back(f);
+ }
+
+ Vector<String> enc_ex_split = p_preset->get_enc_ex_filter().split(",");
+ for (int i = 0; i < enc_ex_split.size(); i++) {
+ String f = enc_ex_split[i].strip_edges();
+ if (f.empty()) {
+ continue;
+ }
+ enc_ex_filters.push_back(f);
+ }
+
+ // Get encryption key.
+ String script_key = p_preset->get_script_encryption_key().to_lower();
+ key.resize(32);
+ if (script_key.length() == 64) {
+ for (int i = 0; i < 32; i++) {
+ int v = 0;
+ if (i * 2 < script_key.length()) {
+ char32_t ct = script_key[i * 2];
+ if (ct >= '0' && ct <= '9') {
+ ct = ct - '0';
+ } else if (ct >= 'a' && ct <= 'f') {
+ ct = 10 + ct - 'a';
+ }
+ v |= ct << 4;
+ }
+
+ if (i * 2 + 1 < script_key.length()) {
+ char32_t ct = script_key[i * 2 + 1];
+ if (ct >= '0' && ct <= '9') {
+ ct = ct - '0';
+ } else if (ct >= 'a' && ct <= 'f') {
+ ct = 10 + ct - 'a';
+ }
+ v |= ct;
+ }
+ key.write[i] = v;
+ }
+ }
+ }
+ Vector<Ref<EditorExportPlugin>> export_plugins = EditorExport::get_singleton()->get_export_plugins();
+ for (int i = 0; i < export_plugins.size(); i++) {
export_plugins.write[i]->set_export_preset(p_preset);
if (p_so_func) {
@@ -723,7 +831,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
}
}
for (int j = 0; j < export_plugins[i]->extra_files.size(); j++) {
- p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, 0, paths.size());
+ p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, 0, paths.size(), enc_in_filters, enc_ex_filters, key);
}
export_plugins.write[i]->_clear();
@@ -731,14 +839,13 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
FeatureContainers feature_containers = get_feature_containers(p_preset);
Set<String> &features = feature_containers.features;
- PoolVector<String> &features_pv = feature_containers.features_pv;
+ Vector<String> &features_pv = feature_containers.features_pv;
//store everything in the export medium
int idx = 0;
int total = paths.size();
for (Set<String>::Element *E = paths.front(); E; E = E->next()) {
-
String path = E->get();
String type = ResourceLoader::get_resource_type(path);
@@ -748,7 +855,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
config.instance();
Error err = config->load(path + ".import");
if (err != OK) {
- ERR_PRINTS("Could not parse: '" + path + "', not exported.");
+ ERR_PRINT("Could not parse: '" + path + "', not exported.");
continue;
}
@@ -758,7 +865,6 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
Set<String> remap_features;
for (List<String>::Element *F = remaps.front(); F; F = F->next()) {
-
String remap = F->get();
String feature = remap.get_slice(".", 1);
if (features.has(feature)) {
@@ -773,19 +879,18 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
err = OK;
for (List<String>::Element *F = remaps.front(); F; F = F->next()) {
-
String remap = F->get();
if (remap == "path") {
String remapped_path = config->get_value("remap", remap);
Vector<uint8_t> array = FileAccess::get_file_as_array(remapped_path);
- err = p_func(p_udata, remapped_path, array, idx, total);
+ err = p_func(p_udata, remapped_path, array, idx, total, enc_in_filters, enc_ex_filters, key);
} else if (remap.begins_with("path.")) {
String feature = remap.get_slice(".", 1);
if (remap_features.has(feature)) {
String remapped_path = config->get_value("remap", remap);
Vector<uint8_t> array = FileAccess::get_file_as_array(remapped_path);
- err = p_func(p_udata, remapped_path, array, idx, total);
+ err = p_func(p_udata, remapped_path, array, idx, total, enc_in_filters, enc_ex_filters, key);
}
}
}
@@ -796,14 +901,13 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
//also save the .import file
Vector<uint8_t> array = FileAccess::get_file_as_array(path + ".import");
- err = p_func(p_udata, path + ".import", array, idx, total);
+ err = p_func(p_udata, path + ".import", array, idx, total, enc_in_filters, enc_ex_filters, key);
if (err != OK) {
return err;
}
} else {
-
bool do_export = true;
for (int i = 0; i < export_plugins.size(); i++) {
if (export_plugins[i]->get_script_instance()) { //script based
@@ -818,7 +922,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
}
for (int j = 0; j < export_plugins[i]->extra_files.size(); j++) {
- p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, idx, total);
+ p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, idx, total, enc_in_filters, enc_ex_filters, key);
if (export_plugins[i]->extra_files[j].remap) {
do_export = false; //if remap, do not
path_remaps.push_back(path);
@@ -831,13 +935,14 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
}
export_plugins.write[i]->_clear();
- if (!do_export)
+ if (!do_export) {
break; //apologies, not exporting
+ }
}
//just store it as it comes
if (do_export) {
Vector<uint8_t> array = FileAccess::get_file_as_array(path);
- p_func(p_udata, path, array, idx, total);
+ p_func(p_udata, path, array, idx, total, enc_in_filters, enc_ex_filters, key);
}
}
@@ -849,7 +954,6 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
Vector<String> custom_list;
if (p_preset->get_custom_features() != String()) {
-
Vector<String> tmp_custom_list = p_preset->get_custom_features().split(",");
for (int i = 0; i < tmp_custom_list.size(); i++) {
@@ -862,7 +966,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
ProjectSettings::CustomMap custom_map;
if (path_remaps.size()) {
- if (1) { //new remap mode, use always as it's friendlier with multiple .pck exports
+ if (true) { //new remap mode, use always as it's friendlier with multiple .pck exports
for (int i = 0; i < path_remaps.size(); i += 2) {
String from = path_remaps[i];
String to = path_remaps[i + 1];
@@ -874,7 +978,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
new_file.write[j] = utf8[j];
}
- p_func(p_udata, from + ".remap", new_file, idx, total);
+ p_func(p_udata, from + ".remap", new_file, idx, total, enc_in_filters, enc_ex_filters, key);
}
} else {
//old remap mode, will still work, but it's unused because it's not multiple pck export friendly
@@ -887,11 +991,11 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
String splash = ProjectSettings::get_singleton()->get("application/boot_splash/image");
if (icon != String() && FileAccess::exists(icon)) {
Vector<uint8_t> array = FileAccess::get_file_as_array(icon);
- p_func(p_udata, icon, array, idx, total);
+ p_func(p_udata, icon, array, idx, total, enc_in_filters, enc_ex_filters, key);
}
if (splash != String() && FileAccess::exists(splash) && icon != splash) {
Vector<uint8_t> array = FileAccess::get_file_as_array(splash);
- p_func(p_udata, splash, array, idx, total);
+ p_func(p_udata, splash, array, idx, total, enc_in_filters, enc_ex_filters, key);
}
String config_file = "project.binary";
@@ -900,7 +1004,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
Vector<uint8_t> data = FileAccess::get_file_as_array(engine_cfb);
DirAccess::remove_file_or_error(engine_cfb);
- p_func(p_udata, "res://" + config_file, data, idx, total);
+ p_func(p_udata, "res://" + config_file, data, idx, total, enc_in_filters, enc_ex_filters, key);
return OK;
}
@@ -915,7 +1019,6 @@ Error EditorExportPlatform::_add_shared_object(void *p_userdata, const SharedObj
}
Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, const String &p_path, Vector<SharedObject> *p_so_files, bool p_embed, int64_t *r_embedded_start, int64_t *r_embedded_size) {
-
EditorProgress ep("savepack", TTR("Packing"), 102, true);
String tmppath = EditorSettings::get_singleton()->get_cache_dir().plus_file("packtmp");
@@ -977,6 +1080,17 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
f->store_32(VERSION_MINOR);
f->store_32(VERSION_PATCH);
+ uint32_t pack_flags = 0;
+ bool enc_pck = p_preset->get_enc_pck();
+ bool enc_directory = p_preset->get_enc_directory();
+ if (enc_pck && enc_directory) {
+ pack_flags |= PACK_DIR_ENCRYPTED;
+ }
+ f->store_32(pack_flags); // flags
+
+ uint64_t file_base_ofs = f->get_position();
+ f->store_64(0); // files base
+
for (int i = 0; i < 16; i++) {
//reserved
f->store_32(0);
@@ -984,41 +1098,82 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
f->store_32(pd.file_ofs.size()); //amount of files
- int64_t header_size = f->get_position();
+ FileAccessEncrypted *fae = nullptr;
+ FileAccess *fhead = f;
+
+ if (enc_pck && enc_directory) {
+ String script_key = p_preset->get_script_encryption_key().to_lower();
+ Vector<uint8_t> key;
+ key.resize(32);
+ if (script_key.length() == 64) {
+ for (int i = 0; i < 32; i++) {
+ int v = 0;
+ if (i * 2 < script_key.length()) {
+ char32_t ct = script_key[i * 2];
+ if (ct >= '0' && ct <= '9') {
+ ct = ct - '0';
+ } else if (ct >= 'a' && ct <= 'f') {
+ ct = 10 + ct - 'a';
+ }
+ v |= ct << 4;
+ }
+
+ if (i * 2 + 1 < script_key.length()) {
+ char32_t ct = script_key[i * 2 + 1];
+ if (ct >= '0' && ct <= '9') {
+ ct = ct - '0';
+ } else if (ct >= 'a' && ct <= 'f') {
+ ct = 10 + ct - 'a';
+ }
+ v |= ct;
+ }
+ key.write[i] = v;
+ }
+ }
+ fae = memnew(FileAccessEncrypted);
+ ERR_FAIL_COND_V(!fae, ERR_SKIP);
- //precalculate header size
+ err = fae->open_and_parse(f, key, FileAccessEncrypted::MODE_WRITE_AES256, false);
+ ERR_FAIL_COND_V(err != OK, ERR_SKIP);
- for (int i = 0; i < pd.file_ofs.size(); i++) {
- header_size += 4; // size of path string (32 bits is enough)
- int string_len = pd.file_ofs[i].path_utf8.length();
- header_size += string_len + _get_pad(4, string_len); ///size of path string
- header_size += 8; // offset to file _with_ header size included
- header_size += 8; // size of file
- header_size += 16; // md5
+ fhead = fae;
}
- int header_padding = _get_pad(PCK_PADDING, header_size);
-
for (int i = 0; i < pd.file_ofs.size(); i++) {
-
int string_len = pd.file_ofs[i].path_utf8.length();
int pad = _get_pad(4, string_len);
- f->store_32(string_len + pad);
- f->store_buffer((const uint8_t *)pd.file_ofs[i].path_utf8.get_data(), string_len);
+ fhead->store_32(string_len + pad);
+ fhead->store_buffer((const uint8_t *)pd.file_ofs[i].path_utf8.get_data(), string_len);
for (int j = 0; j < pad; j++) {
- f->store_8(0);
+ fhead->store_8(0);
+ }
+
+ fhead->store_64(pd.file_ofs[i].ofs);
+ fhead->store_64(pd.file_ofs[i].size); // pay attention here, this is where file is
+ fhead->store_buffer(pd.file_ofs[i].md5.ptr(), 16); //also save md5 for file
+ uint32_t flags = 0;
+ if (pd.file_ofs[i].encrypted) {
+ flags |= PACK_FILE_ENCRYPTED;
}
+ fhead->store_32(flags);
+ }
- f->store_64(pd.file_ofs[i].ofs + header_padding + header_size);
- f->store_64(pd.file_ofs[i].size); // pay attention here, this is where file is
- f->store_buffer(pd.file_ofs[i].md5.ptr(), 16); //also save md5 for file
+ if (fae) {
+ fae->release();
+ memdelete(fae);
}
+ int header_padding = _get_pad(PCK_PADDING, f->get_position());
for (int i = 0; i < header_padding; i++) {
- f->store_8(0);
+ f->store_8(Math::rand() % 256);
}
+ uint64_t file_base = f->get_position();
+ f->seek(file_base_ofs);
+ f->store_64(file_base); // update files base
+ f->seek(file_base);
+
// Save the rest of the data.
ftmp = FileAccess::open(tmppath, FileAccess::READ);
@@ -1032,10 +1187,10 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
uint8_t buf[bufsize];
while (true) {
-
int got = ftmp->get_buffer(buf, bufsize);
- if (got <= 0)
+ if (got <= 0) {
break;
+ }
f->store_buffer(buf, got);
}
@@ -1065,22 +1220,22 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
}
Error EditorExportPlatform::save_zip(const Ref<EditorExportPreset> &p_preset, const String &p_path) {
-
EditorProgress ep("savezip", TTR("Packing"), 102, true);
FileAccess *src_f;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
- zipFile zip = zipOpen2(p_path.utf8().get_data(), APPEND_STATUS_CREATE, NULL, &io);
+ zipFile zip = zipOpen2(p_path.utf8().get_data(), APPEND_STATUS_CREATE, nullptr, &io);
ZipData zd;
zd.ep = &ep;
zd.zip = zip;
Error err = export_project_files(p_preset, _save_zip_file, &zd);
- if (err != OK && err != ERR_SKIP)
+ if (err != OK && err != ERR_SKIP) {
ERR_PRINT("Failed to export project files");
+ }
- zipClose(zip, NULL);
+ zipClose(zip, nullptr);
return OK;
}
@@ -1096,12 +1251,12 @@ Error EditorExportPlatform::export_zip(const Ref<EditorExportPreset> &p_preset,
}
void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags) {
-
String host = EditorSettings::get_singleton()->get("network/debug/remote_host");
int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
- if (p_flags & DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST)
+ if (p_flags & DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST) {
host = "localhost";
+ }
if (p_flags & DEBUG_FLAG_DUMB_CLIENT) {
int port = EditorSettings::get_singleton()->get("filesystem/file_server/port");
@@ -1115,23 +1270,21 @@ void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags
}
if (p_flags & DEBUG_FLAG_REMOTE_DEBUG) {
-
r_flags.push_back("--remote-debug");
- r_flags.push_back(host + ":" + String::num(remote_port));
+ r_flags.push_back(get_debug_protocol() + host + ":" + String::num(remote_port));
List<String> breakpoints;
ScriptEditor::get_singleton()->get_breakpoints(&breakpoints);
if (breakpoints.size()) {
-
r_flags.push_back("--breakpoints");
String bpoints;
for (const List<String>::Element *E = breakpoints.front(); E; E = E->next()) {
-
bpoints += E->get().replace(" ", "%20");
- if (E->next())
+ if (E->next()) {
bpoints += ",";
+ }
}
r_flags.push_back(bpoints);
@@ -1139,28 +1292,25 @@ void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags
}
if (p_flags & DEBUG_FLAG_VIEW_COLLISONS) {
-
r_flags.push_back("--debug-collisions");
}
if (p_flags & DEBUG_FLAG_VIEW_NAVIGATION) {
-
r_flags.push_back("--debug-navigation");
}
}
+
EditorExportPlatform::EditorExportPlatform() {
}
////
-EditorExport *EditorExport::singleton = NULL;
+EditorExport *EditorExport::singleton = nullptr;
void EditorExport::_save() {
-
Ref<ConfigFile> config;
config.instance();
for (int i = 0; i < export_presets.size(); i++) {
-
Ref<EditorExportPreset> preset = export_presets[i];
String section = "preset." + itos(i);
@@ -1192,6 +1342,10 @@ void EditorExport::_save() {
config->set_value(section, "exclude_filter", preset->get_exclude_filter());
config->set_value(section, "export_path", preset->get_export_path());
config->set_value(section, "patch_list", preset->get_patches());
+ config->set_value(section, "encryption_include_filters", preset->get_enc_in_filter());
+ config->set_value(section, "encryption_exclude_filters", preset->get_enc_ex_filter());
+ config->set_value(section, "encrypt_pck", preset->get_enc_pck());
+ config->set_value(section, "encrypt_directory", preset->get_enc_directory());
config->set_value(section, "script_export_mode", preset->get_script_export_mode());
config->set_value(section, "script_encryption_key", preset->get_script_encryption_key());
@@ -1206,123 +1360,107 @@ void EditorExport::_save() {
}
void EditorExport::save_presets() {
-
- if (block_save)
+ if (block_save) {
return;
+ }
save_timer->start();
}
void EditorExport::_bind_methods() {
-
- ClassDB::bind_method("_save", &EditorExport::_save);
+ ADD_SIGNAL(MethodInfo("export_presets_updated"));
}
void EditorExport::add_export_platform(const Ref<EditorExportPlatform> &p_platform) {
-
export_platforms.push_back(p_platform);
}
int EditorExport::get_export_platform_count() {
-
return export_platforms.size();
}
Ref<EditorExportPlatform> EditorExport::get_export_platform(int p_idx) {
-
ERR_FAIL_INDEX_V(p_idx, export_platforms.size(), Ref<EditorExportPlatform>());
return export_platforms[p_idx];
}
void EditorExport::add_export_preset(const Ref<EditorExportPreset> &p_preset, int p_at_pos) {
-
- if (p_at_pos < 0)
+ if (p_at_pos < 0) {
export_presets.push_back(p_preset);
- else
+ } else {
export_presets.insert(p_at_pos, p_preset);
+ }
}
String EditorExportPlatform::test_etc2() const {
-
String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name");
- bool driver_fallback = ProjectSettings::get_singleton()->get("rendering/quality/driver/fallback_to_gles2");
bool etc_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc");
bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2");
if (driver == "GLES2" && !etc_supported) {
return TTR("Target platform requires 'ETC' texture compression for GLES2. Enable 'Import Etc' in Project Settings.");
- } else if (driver == "GLES3") {
- String err;
- if (!etc2_supported) {
- err += TTR("Target platform requires 'ETC2' texture compression for GLES3. Enable 'Import Etc 2' in Project Settings.");
- }
- if (driver_fallback && !etc_supported) {
- if (err != String())
- err += "\n";
- err += TTR("Target platform requires 'ETC' texture compression for the driver fallback to GLES2.\nEnable 'Import Etc' in Project Settings, or disable 'Driver Fallback Enabled'.");
- }
- return err;
+ } else if (driver == "Vulkan" && !etc2_supported) {
+ // FIXME: Review if this is true for Vulkan.
+ return TTR("Target platform requires 'ETC2' texture compression for Vulkan. Enable 'Import Etc 2' in Project Settings.");
}
return String();
}
int EditorExport::get_export_preset_count() const {
-
return export_presets.size();
}
Ref<EditorExportPreset> EditorExport::get_export_preset(int p_idx) {
-
ERR_FAIL_INDEX_V(p_idx, export_presets.size(), Ref<EditorExportPreset>());
return export_presets[p_idx];
}
void EditorExport::remove_export_preset(int p_idx) {
-
export_presets.remove(p_idx);
save_presets();
}
void EditorExport::add_export_plugin(const Ref<EditorExportPlugin> &p_plugin) {
-
if (export_plugins.find(p_plugin) == -1) {
export_plugins.push_back(p_plugin);
}
}
void EditorExport::remove_export_plugin(const Ref<EditorExportPlugin> &p_plugin) {
-
export_plugins.erase(p_plugin);
}
-Vector<Ref<EditorExportPlugin> > EditorExport::get_export_plugins() {
-
+Vector<Ref<EditorExportPlugin>> EditorExport::get_export_plugins() {
return export_plugins;
}
void EditorExport::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
- load_config();
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ load_config();
+ } break;
+ case NOTIFICATION_PROCESS: {
+ update_export_presets();
+ } break;
}
}
void EditorExport::load_config() {
-
Ref<ConfigFile> config;
config.instance();
Error err = config->load("res://export_presets.cfg");
- if (err != OK)
+ if (err != OK) {
return;
+ }
block_save = true;
int index = 0;
while (true) {
-
String section = "preset." + itos(index);
- if (!config->has_section(section))
+ if (!config->has_section(section)) {
break;
+ }
String platform = config->get_value(section, "platform");
@@ -1362,11 +1500,14 @@ void EditorExport::load_config() {
}
if (get_files) {
-
Vector<String> files = config->get_value(section, "export_files");
for (int i = 0; i < files.size(); i++) {
- preset->add_export_file(files[i]);
+ if (!FileAccess::exists(files[i])) {
+ preset->remove_export_file(files[i]);
+ } else {
+ preset->add_export_file(files[i]);
+ }
}
}
@@ -1380,6 +1521,18 @@ void EditorExport::load_config() {
preset->add_patch(patch_list[i]);
}
+ if (config->has_section_key(section, "encrypt_pck")) {
+ preset->set_enc_pck(config->get_value(section, "encrypt_pck"));
+ }
+ if (config->has_section_key(section, "encrypt_directory")) {
+ preset->set_enc_directory(config->get_value(section, "encrypt_directory"));
+ }
+ if (config->has_section_key(section, "encryption_include_filters")) {
+ preset->set_enc_in_filter(config->get_value(section, "encryption_include_filters"));
+ }
+ if (config->has_section_key(section, "encryption_exclude_filters")) {
+ preset->set_enc_ex_filter(config->get_value(section, "encryption_exclude_filters"));
+ }
if (config->has_section_key(section, "script_export_mode")) {
preset->set_script_export_mode(config->get_value(section, "script_export_mode"));
}
@@ -1394,7 +1547,6 @@ void EditorExport::load_config() {
config->get_section_keys(option_section, &options);
for (List<String>::Element *E = options.front(); E; E = E->next()) {
-
Variant value = config->get_value(option_section, E->get());
preset->set(E->get(), value);
@@ -1407,8 +1559,50 @@ void EditorExport::load_config() {
block_save = false;
}
-bool EditorExport::poll_export_platforms() {
+void EditorExport::update_export_presets() {
+ Map<StringName, List<EditorExportPlatform::ExportOption>> platform_options;
+ for (int i = 0; i < export_platforms.size(); i++) {
+ Ref<EditorExportPlatform> platform = export_platforms[i];
+
+ if (platform->should_update_export_options()) {
+ List<EditorExportPlatform::ExportOption> options;
+ platform->get_export_options(&options);
+
+ platform_options[platform->get_name()] = options;
+ }
+ }
+
+ bool export_presets_updated = false;
+ for (int i = 0; i < export_presets.size(); i++) {
+ Ref<EditorExportPreset> preset = export_presets[i];
+ if (platform_options.has(preset->get_platform()->get_name())) {
+ export_presets_updated = true;
+
+ List<EditorExportPlatform::ExportOption> options = platform_options[preset->get_platform()->get_name()];
+
+ // Copy the previous preset values
+ Map<StringName, Variant> previous_values = preset->values;
+
+ // Clear the preset properties and values prior to reloading
+ preset->properties.clear();
+ preset->values.clear();
+
+ for (List<EditorExportPlatform::ExportOption>::Element *E = options.front(); E; E = E->next()) {
+ preset->properties.push_back(E->get().option);
+
+ StringName option_name = E->get().option.name;
+ preset->values[option_name] = previous_values.has(option_name) ? previous_values[option_name] : E->get().default_value;
+ }
+ }
+ }
+
+ if (export_presets_updated) {
+ emit_signal(_export_presets_updated);
+ }
+}
+
+bool EditorExport::poll_export_platforms() {
bool changed = false;
for (int i = 0; i < export_platforms.size(); i++) {
if (export_platforms.write[i]->poll_export()) {
@@ -1420,15 +1614,17 @@ bool EditorExport::poll_export_platforms() {
}
EditorExport::EditorExport() {
-
save_timer = memnew(Timer);
add_child(save_timer);
save_timer->set_wait_time(0.8);
save_timer->set_one_shot(true);
- save_timer->connect("timeout", this, "_save");
+ save_timer->connect("timeout", callable_mp(this, &EditorExport::_save));
block_save = false;
+ _export_presets_updated = "export_presets_updated";
+
singleton = this;
+ set_process(true);
}
EditorExport::~EditorExport() {
@@ -1437,7 +1633,6 @@ EditorExport::~EditorExport() {
//////////
void EditorExportPlatformPC::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) {
-
if (p_preset->get("texture_format/s3tc")) {
r_features->push_back("s3tc");
}
@@ -1456,7 +1651,6 @@ void EditorExportPlatformPC::get_preset_features(const Ref<EditorExportPreset> &
}
void EditorExportPlatformPC::get_export_options(List<ExportOption> *r_options) {
-
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/bptc"), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/s3tc"), true));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/etc"), false));
@@ -1469,21 +1663,18 @@ void EditorExportPlatformPC::get_export_options(List<ExportOption> *r_options) {
}
String EditorExportPlatformPC::get_name() const {
-
return name;
}
String EditorExportPlatformPC::get_os_name() const {
-
return os_name;
}
-Ref<Texture> EditorExportPlatformPC::get_logo() const {
+Ref<Texture2D> EditorExportPlatformPC::get_logo() const {
return logo;
}
bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const {
-
String err;
bool valid = false;
@@ -1509,8 +1700,9 @@ bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset> &p_preset,
valid = dvalid || rvalid;
r_missing_templates = !valid;
- if (!err.empty())
+ if (!err.empty()) {
r_error = err;
+ }
return valid;
}
@@ -1546,7 +1738,6 @@ Error EditorExportPlatformPC::export_project(const Ref<EditorExportPreset> &p_pr
template_path = template_path.strip_edges();
if (template_path == String()) {
-
if (p_preset->get("binary_format/64_bits")) {
if (p_debug) {
template_path = find_export_template(debug_file_64);
@@ -1585,7 +1776,6 @@ Error EditorExportPlatformPC::export_project(const Ref<EditorExportPreset> &p_pr
int64_t embedded_size;
err = save_pack(p_preset, pck_path, &so_files, p_preset->get("binary_format/embed_pck"), &embedded_pos, &embedded_size);
if (err == OK && p_preset->get("binary_format/embed_pck")) {
-
if (embedded_size >= 0x100000000 && !p_preset->get("binary_format/64_bits")) {
EditorNode::get_singleton()->show_warning(TTR("On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."));
return ERR_INVALID_PARAMETER;
@@ -1629,30 +1819,27 @@ void EditorExportPlatformPC::set_os_name(const String &p_name) {
os_name = p_name;
}
-void EditorExportPlatformPC::set_logo(const Ref<Texture> &p_logo) {
+void EditorExportPlatformPC::set_logo(const Ref<Texture2D> &p_logo) {
logo = p_logo;
}
void EditorExportPlatformPC::set_release_64(const String &p_file) {
-
release_file_64 = p_file;
}
void EditorExportPlatformPC::set_release_32(const String &p_file) {
-
release_file_32 = p_file;
}
-void EditorExportPlatformPC::set_debug_64(const String &p_file) {
+void EditorExportPlatformPC::set_debug_64(const String &p_file) {
debug_file_64 = p_file;
}
-void EditorExportPlatformPC::set_debug_32(const String &p_file) {
+void EditorExportPlatformPC::set_debug_32(const String &p_file) {
debug_file_32 = p_file;
}
void EditorExportPlatformPC::add_platform_feature(const String &p_feature) {
-
extra_features.insert(p_feature);
}
@@ -1666,7 +1853,6 @@ void EditorExportPlatformPC::get_platform_features(List<String> *r_features) {
}
void EditorExportPlatformPC::resolve_platform_feature_priorities(const Ref<EditorExportPreset> &p_preset, Set<String> &p_features) {
-
if (p_features.has("bptc")) {
if (p_preset->has("texture_format/no_bptc_fallbacks")) {
p_features.erase("s3tc");
@@ -1675,43 +1861,38 @@ void EditorExportPlatformPC::resolve_platform_feature_priorities(const Ref<Edito
}
int EditorExportPlatformPC::get_chmod_flags() const {
-
return chmod_flags;
}
void EditorExportPlatformPC::set_chmod_flags(int p_flags) {
-
chmod_flags = p_flags;
}
EditorExportPlatformPC::FixUpEmbeddedPckFunc EditorExportPlatformPC::get_fixup_embedded_pck_func() const {
-
return fixup_embedded_pck_func;
}
void EditorExportPlatformPC::set_fixup_embedded_pck_func(FixUpEmbeddedPckFunc p_fixup_embedded_pck_func) {
-
fixup_embedded_pck_func = p_fixup_embedded_pck_func;
}
EditorExportPlatformPC::EditorExportPlatformPC() {
-
chmod_flags = -1;
- fixup_embedded_pck_func = NULL;
+ fixup_embedded_pck_func = nullptr;
}
///////////////////////
void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, const String &p_type, const Set<String> &p_features) {
-
String extension = p_path.get_extension().to_lower();
if (extension != "tres" && extension != "tscn") {
return;
}
bool convert = GLOBAL_GET("editor/convert_text_resources_to_binary_on_export");
- if (!convert)
+ if (!convert) {
return;
+ }
String tmp_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpfile.res");
Error err = ResourceFormatLoaderText::convert_file_to_binary(p_path, tmp_path);
if (err != OK) {
@@ -1728,6 +1909,5 @@ void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, con
}
EditorExportTextSceneToBinaryPlugin::EditorExportTextSceneToBinaryPlugin() {
-
GLOBAL_DEF("editor/convert_text_resources_to_binary_on_export", false);
}
diff --git a/editor/editor_export.h b/editor/editor_export.h
index 577fd0cf7e..ac1051571c 100644
--- a/editor/editor_export.h
+++ b/editor/editor_export.h
@@ -43,7 +43,6 @@ class EditorFileSystemDirectory;
struct EditorProgress;
class EditorExportPreset : public Reference {
-
GDCLASS(EditorExportPreset, Reference);
public:
@@ -56,19 +55,18 @@ public:
enum ScriptExportMode {
MODE_SCRIPT_TEXT,
MODE_SCRIPT_COMPILED,
- MODE_SCRIPT_ENCRYPTED,
};
private:
Ref<EditorExportPlatform> platform;
- ExportFilter export_filter;
+ ExportFilter export_filter = EXPORT_ALL_RESOURCES;
String include_filter;
String exclude_filter;
String export_path;
String exporter;
Set<String> selected_files;
- bool runnable;
+ bool runnable = false;
Vector<String> patches;
@@ -82,7 +80,12 @@ private:
String custom_features;
- int script_mode;
+ String enc_in_filters;
+ String enc_ex_filters;
+ bool enc_pck = false;
+ bool enc_directory = false;
+
+ int script_mode = MODE_SCRIPT_COMPILED;
String script_key;
protected:
@@ -95,6 +98,8 @@ public:
bool has(const StringName &p_property) const { return values.has(p_property); }
+ void update_files_to_export();
+
Vector<String> get_files_to_export() const;
void add_export_file(const String &p_path);
@@ -128,6 +133,18 @@ public:
void set_export_path(const String &p_path);
String get_export_path() const;
+ void set_enc_in_filter(const String &p_filter);
+ String get_enc_in_filter() const;
+
+ void set_enc_ex_filter(const String &p_filter);
+ String get_enc_ex_filter() const;
+
+ void set_enc_pck(bool p_enabled);
+ bool get_enc_pck() const;
+
+ void set_enc_directory(bool p_enabled);
+ bool get_enc_directory() const;
+
void set_script_export_mode(int p_mode);
int get_script_export_mode() const;
@@ -136,7 +153,7 @@ public:
const List<PropertyInfo> &get_properties() const { return properties; }
- EditorExportPreset();
+ EditorExportPreset() {}
};
struct SharedObject {
@@ -152,18 +169,17 @@ struct SharedObject {
};
class EditorExportPlatform : public Reference {
-
GDCLASS(EditorExportPlatform, Reference);
public:
- typedef Error (*EditorExportSaveFunction)(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total);
+ typedef Error (*EditorExportSaveFunction)(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key);
typedef Error (*EditorExportSaveSharedObject)(void *p_userdata, const SharedObject &p_so);
private:
struct SavedData {
-
uint64_t ofs;
uint64_t size;
+ bool encrypted;
Vector<uint8_t> md5;
CharString path_utf8;
@@ -173,7 +189,6 @@ private:
};
struct PackData {
-
FileAccess *f;
Vector<SavedData> file_ofs;
EditorProgress *ep;
@@ -181,22 +196,21 @@ private:
};
struct ZipData {
-
void *zip;
EditorProgress *ep;
};
struct FeatureContainers {
Set<String> features;
- PoolVector<String> features_pv;
+ Vector<String> features_pv;
};
void _export_find_resources(EditorFileSystemDirectory *p_dir, Set<String> &p_paths);
void _export_find_dependencies(const String &p_path, Set<String> &p_paths);
void gen_debug_flags(Vector<String> &r_flags, int p_flags);
- static Error _save_pack_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total);
- static Error _save_zip_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total);
+ static Error _save_pack_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key);
+ static Error _save_zip_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key);
void _edit_files_with_filter(DirAccess *da, const Vector<String> &p_filters, Set<String> &r_list, bool exclude);
void _edit_filter_list(Set<String> &r_list, const String &p_filter, bool exclude);
@@ -212,7 +226,7 @@ protected:
FeatureContainers get_feature_containers(const Ref<EditorExportPreset> &p_preset);
bool exists_export_template(String template_file_name, String *err) const;
- String find_export_template(String template_file_name, String *err = NULL) const;
+ String find_export_template(String template_file_name, String *err = nullptr) const;
void gen_export_flags(Vector<String> &r_flags, int p_flags);
public:
@@ -232,15 +246,16 @@ public:
virtual Ref<EditorExportPreset> create_preset();
virtual void get_export_options(List<ExportOption> *r_options) = 0;
+ virtual bool should_update_export_options() { return false; }
virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { return true; }
virtual String get_os_name() const = 0;
virtual String get_name() const = 0;
- virtual Ref<Texture> get_logo() const = 0;
+ virtual Ref<Texture2D> get_logo() const = 0;
- Error export_project_files(const Ref<EditorExportPreset> &p_preset, EditorExportSaveFunction p_func, void *p_udata, EditorExportSaveSharedObject p_so_func = NULL);
+ Error export_project_files(const Ref<EditorExportPreset> &p_preset, EditorExportSaveFunction p_func, void *p_udata, EditorExportSaveSharedObject p_so_func = nullptr);
- Error save_pack(const Ref<EditorExportPreset> &p_preset, const String &p_path, Vector<SharedObject> *p_so_files = NULL, bool p_embed = false, int64_t *r_embedded_start = NULL, int64_t *r_embedded_size = NULL);
+ Error save_pack(const Ref<EditorExportPreset> &p_preset, const String &p_path, Vector<SharedObject> *p_so_files = nullptr, bool p_embed = false, int64_t *r_embedded_start = nullptr, int64_t *r_embedded_size = nullptr);
Error save_zip(const Ref<EditorExportPreset> &p_preset, const String &p_path);
virtual bool poll_export() { return false; }
@@ -259,7 +274,7 @@ public:
};
virtual Error run(const Ref<EditorExportPreset> &p_preset, int p_device, int p_debug_flags) { return OK; }
- virtual Ref<Texture> get_run_icon() const { return get_logo(); }
+ virtual Ref<Texture2D> get_run_icon() const { return get_logo(); }
String test_etc2() const; //generic test for etc2 since most platforms use it
virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const = 0;
@@ -270,6 +285,7 @@ public:
virtual Error export_zip(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0);
virtual void get_platform_features(List<String> *r_features) = 0;
virtual void resolve_platform_feature_priorities(const Ref<EditorExportPreset> &p_preset, Set<String> &p_features) = 0;
+ virtual String get_debug_protocol() const { return "tcp://"; }
EditorExportPlatform();
};
@@ -291,6 +307,8 @@ class EditorExportPlugin : public Reference {
bool skipped;
Vector<String> ios_frameworks;
+ Vector<String> ios_embedded_frameworks;
+ Vector<String> ios_project_static_libs;
String ios_plist_content;
String ios_linker_flags;
Vector<String> ios_bundle_files;
@@ -304,14 +322,15 @@ class EditorExportPlugin : public Reference {
_FORCE_INLINE_ void _export_end() {
ios_frameworks.clear();
+ ios_embedded_frameworks.clear();
ios_bundle_files.clear();
ios_plist_content = "";
ios_linker_flags = "";
ios_cpp_code = "";
}
- void _export_file_script(const String &p_path, const String &p_type, const PoolVector<String> &p_features);
- void _export_begin_script(const PoolVector<String> &p_features, bool p_debug, const String &p_path, int p_flags);
+ void _export_file_script(const String &p_path, const String &p_type, const Vector<String> &p_features);
+ void _export_begin_script(const Vector<String> &p_features, bool p_debug, const String &p_path, int p_flags);
void _export_end_script();
protected:
@@ -322,6 +341,8 @@ protected:
void add_shared_object(const String &p_path, const Vector<String> &tags);
void add_ios_framework(const String &p_path);
+ void add_ios_embedded_framework(const String &p_path);
+ void add_ios_project_static_lib(const String &p_path);
void add_ios_plist_content(const String &p_plist_content);
void add_ios_linker_flags(const String &p_flags);
void add_ios_bundle_file(const String &p_path);
@@ -336,6 +357,8 @@ protected:
public:
Vector<String> get_ios_frameworks() const;
+ Vector<String> get_ios_embedded_frameworks() const;
+ Vector<String> get_ios_project_static_libs() const;
String get_ios_plist_content() const;
String get_ios_linker_flags() const;
Vector<String> get_ios_bundle_files() const;
@@ -347,9 +370,11 @@ public:
class EditorExport : public Node {
GDCLASS(EditorExport, Node);
- Vector<Ref<EditorExportPlatform> > export_platforms;
- Vector<Ref<EditorExportPreset> > export_presets;
- Vector<Ref<EditorExportPlugin> > export_plugins;
+ Vector<Ref<EditorExportPlatform>> export_platforms;
+ Vector<Ref<EditorExportPreset>> export_presets;
+ Vector<Ref<EditorExportPlugin>> export_plugins;
+
+ StringName _export_presets_updated;
Timer *save_timer;
bool block_save;
@@ -379,10 +404,10 @@ public:
void add_export_plugin(const Ref<EditorExportPlugin> &p_plugin);
void remove_export_plugin(const Ref<EditorExportPlugin> &p_plugin);
- Vector<Ref<EditorExportPlugin> > get_export_plugins();
+ Vector<Ref<EditorExportPlugin>> get_export_plugins();
void load_config();
-
+ void update_export_presets();
bool poll_export_platforms();
EditorExport();
@@ -390,7 +415,6 @@ public:
};
class EditorExportPlatformPC : public EditorExportPlatform {
-
GDCLASS(EditorExportPlatformPC, EditorExportPlatform);
public:
@@ -414,24 +438,24 @@ private:
FixUpEmbeddedPckFunc fixup_embedded_pck_func;
public:
- virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features);
+ virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) override;
- virtual void get_export_options(List<ExportOption> *r_options);
+ virtual void get_export_options(List<ExportOption> *r_options) override;
- virtual String get_name() const;
- virtual String get_os_name() const;
- virtual Ref<Texture> get_logo() const;
+ virtual String get_name() const override;
+ virtual String get_os_name() const override;
+ virtual Ref<Texture2D> get_logo() const override;
- virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const;
- virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const;
- virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0);
+ virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const override;
+ virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const override;
+ virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) override;
virtual Error sign_shared_object(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path);
void set_extension(const String &p_extension, const String &p_feature_key = "default");
void set_name(const String &p_name);
void set_os_name(const String &p_name);
- void set_logo(const Ref<Texture> &p_logo);
+ void set_logo(const Ref<Texture2D> &p_logo);
void set_release_64(const String &p_file);
void set_release_32(const String &p_file);
@@ -439,8 +463,8 @@ public:
void set_debug_32(const String &p_file);
void add_platform_feature(const String &p_feature);
- virtual void get_platform_features(List<String> *r_features);
- virtual void resolve_platform_feature_priorities(const Ref<EditorExportPreset> &p_preset, Set<String> &p_features);
+ virtual void get_platform_features(List<String> *r_features) override;
+ virtual void resolve_platform_feature_priorities(const Ref<EditorExportPreset> &p_preset, Set<String> &p_features) override;
int get_chmod_flags() const;
void set_chmod_flags(int p_flags);
@@ -452,11 +476,10 @@ public:
};
class EditorExportTextSceneToBinaryPlugin : public EditorExportPlugin {
-
GDCLASS(EditorExportTextSceneToBinaryPlugin, EditorExportPlugin);
public:
- virtual void _export_file(const String &p_path, const String &p_type, const Set<String> &p_features);
+ virtual void _export_file(const String &p_path, const String &p_type, const Set<String> &p_features) override;
EditorExportTextSceneToBinaryPlugin();
};
diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp
index a4a7a0cd45..7335563dd9 100644
--- a/editor/editor_feature_profile.cpp
+++ b/editor/editor_feature_profile.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "editor_feature_profile.h"
+
#include "core/io/json.h"
#include "core/os/dir_access.h"
#include "editor/editor_settings.h"
@@ -40,9 +41,9 @@ const char *EditorFeatureProfile::feature_names[FEATURE_MAX] = {
TTRC("Script Editor"),
TTRC("Asset Library"),
TTRC("Scene Tree Editing"),
- TTRC("Import Dock"),
TTRC("Node Dock"),
- TTRC("FileSystem and Import Docks")
+ TTRC("FileSystem Dock"),
+ TTRC("Import Dock"),
};
const char *EditorFeatureProfile::feature_identifiers[FEATURE_MAX] = {
@@ -50,9 +51,9 @@ const char *EditorFeatureProfile::feature_identifiers[FEATURE_MAX] = {
"script",
"asset_lib",
"scene_tree",
- "import_dock",
"node_dock",
- "filesystem_dock"
+ "filesystem_dock",
+ "import_dock",
};
void EditorFeatureProfile::set_disable_class(const StringName &p_class, bool p_disabled) {
@@ -86,7 +87,6 @@ bool EditorFeatureProfile::is_class_editor_disabled(const StringName &p_class) c
}
void EditorFeatureProfile::set_disable_class_property(const StringName &p_class, const StringName &p_property, bool p_disabled) {
-
if (p_disabled) {
if (!disabled_properties.has(p_class)) {
disabled_properties[p_class] = Set<StringName>();
@@ -101,8 +101,8 @@ void EditorFeatureProfile::set_disable_class_property(const StringName &p_class,
}
}
}
-bool EditorFeatureProfile::is_class_property_disabled(const StringName &p_class, const StringName &p_property) const {
+bool EditorFeatureProfile::is_class_property_disabled(const StringName &p_class, const StringName &p_property) const {
if (!disabled_properties.has(p_class)) {
return false;
}
@@ -119,10 +119,10 @@ bool EditorFeatureProfile::has_class_properties_disabled(const StringName &p_cla
}
void EditorFeatureProfile::set_disable_feature(Feature p_feature, bool p_disable) {
-
ERR_FAIL_INDEX(p_feature, FEATURE_MAX);
features_disabled[p_feature] = p_disable;
}
+
bool EditorFeatureProfile::is_feature_disabled(Feature p_feature) const {
ERR_FAIL_INDEX_V(p_feature, FEATURE_MAX, false);
return features_disabled[p_feature];
@@ -134,7 +134,6 @@ String EditorFeatureProfile::get_feature_name(Feature p_feature) {
}
Error EditorFeatureProfile::save_to_file(const String &p_path) {
-
Dictionary json;
json["type"] = "feature_profile";
Array dis_classes;
@@ -153,7 +152,7 @@ Error EditorFeatureProfile::save_to_file(const String &p_path) {
Array dis_props;
- for (Map<StringName, Set<StringName> >::Element *E = disabled_properties.front(); E; E = E->next()) {
+ for (Map<StringName, Set<StringName>>::Element *E = disabled_properties.front(); E; E = E->next()) {
for (Set<StringName>::Element *F = E->get().front(); F; F = F->next()) {
dis_props.push_back(String(E->key()) + ":" + String(F->get()));
}
@@ -180,7 +179,6 @@ Error EditorFeatureProfile::save_to_file(const String &p_path) {
}
Error EditorFeatureProfile::load_from_file(const String &p_path) {
-
Error err;
String text = FileAccess::get_file_as_string(p_path, &err);
if (err != OK) {
@@ -192,14 +190,14 @@ Error EditorFeatureProfile::load_from_file(const String &p_path) {
Variant v;
err = JSON::parse(text, v, err_str, err_line);
if (err != OK) {
- ERR_PRINTS("Error parsing '" + p_path + "' on line " + itos(err_line) + ": " + err_str);
+ ERR_PRINT("Error parsing '" + p_path + "' on line " + itos(err_line) + ": " + err_str);
return ERR_PARSE_ERROR;
}
Dictionary json = v;
if (!json.has("type") || String(json["type"]) != "feature_profile") {
- ERR_PRINTS("Error parsing '" + p_path + "', it's not a feature profile.");
+ ERR_PRINT("Error parsing '" + p_path + "', it's not a feature profile.");
return ERR_PARSE_ERROR;
}
@@ -232,7 +230,6 @@ Error EditorFeatureProfile::load_from_file(const String &p_path) {
}
if (json.has("disabled_features")) {
-
Array disabled_features_arr = json["disabled_features"];
for (int i = 0; i < FEATURE_MAX; i++) {
bool found = false;
@@ -253,7 +250,6 @@ Error EditorFeatureProfile::load_from_file(const String &p_path) {
}
void EditorFeatureProfile::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("set_disable_class", "class_name", "disable"), &EditorFeatureProfile::set_disable_class);
ClassDB::bind_method(D_METHOD("is_class_disabled", "class_name"), &EditorFeatureProfile::is_class_disabled);
@@ -275,14 +271,13 @@ void EditorFeatureProfile::_bind_methods() {
BIND_ENUM_CONSTANT(FEATURE_SCRIPT);
BIND_ENUM_CONSTANT(FEATURE_ASSET_LIB);
BIND_ENUM_CONSTANT(FEATURE_SCENE_TREE);
- BIND_ENUM_CONSTANT(FEATURE_IMPORT_DOCK);
BIND_ENUM_CONSTANT(FEATURE_NODE_DOCK);
BIND_ENUM_CONSTANT(FEATURE_FILESYSTEM_DOCK);
+ BIND_ENUM_CONSTANT(FEATURE_IMPORT_DOCK);
BIND_ENUM_CONSTANT(FEATURE_MAX);
}
EditorFeatureProfile::EditorFeatureProfile() {
-
for (int i = 0; i < FEATURE_MAX; i++) {
features_disabled[i] = false;
}
@@ -292,13 +287,12 @@ EditorFeatureProfile::EditorFeatureProfile() {
void EditorFeatureProfileManager::_notification(int p_what) {
if (p_what == NOTIFICATION_READY) {
-
current_profile = EDITOR_GET("_default_feature_profile");
if (current_profile != String()) {
current.instance();
Error err = current->load_from_file(EditorSettings::get_singleton()->get_feature_profiles_dir().plus_file(current_profile + ".profile"));
if (err != OK) {
- ERR_PRINTS("Error loading default feature profile: " + current_profile);
+ ERR_PRINT("Error loading default feature profile: " + current_profile);
current_profile = String();
current.unref();
}
@@ -317,7 +311,6 @@ String EditorFeatureProfileManager::_get_selected_profile() {
}
void EditorFeatureProfileManager::_update_profile_list(const String &p_select_profile) {
-
String selected_profile;
if (p_select_profile == String()) { //default, keep
if (profile_list->get_selected() >= 0) {
@@ -342,7 +335,7 @@ void EditorFeatureProfileManager::_update_profile_list(const String &p_select_pr
}
if (!d->current_is_dir()) {
- int last_pos = f.find_last(".profile");
+ int last_pos = f.rfind(".profile");
if (last_pos != -1) {
profiles.push_back(f.substr(0, last_pos));
}
@@ -361,7 +354,7 @@ void EditorFeatureProfileManager::_update_profile_list(const String &p_select_pr
}
if (name == current_profile) {
- name += " (current)";
+ name += " " + TTR("(current)");
}
profile_list->add_item(name);
int index = profile_list->get_item_count() - 1;
@@ -371,21 +364,22 @@ void EditorFeatureProfileManager::_update_profile_list(const String &p_select_pr
}
}
+ class_list_vbc->set_visible(selected_profile != String());
+ property_list_vbc->set_visible(selected_profile != String());
+ no_profile_selected_help->set_visible(selected_profile == String());
profile_actions[PROFILE_CLEAR]->set_disabled(current_profile == String());
profile_actions[PROFILE_ERASE]->set_disabled(selected_profile == String());
profile_actions[PROFILE_EXPORT]->set_disabled(selected_profile == String());
profile_actions[PROFILE_SET]->set_disabled(selected_profile == String());
- current_profile_name->set_text(current_profile);
+ current_profile_name->set_text(current_profile != String() ? current_profile : TTR("(none)"));
_update_selected_profile();
}
void EditorFeatureProfileManager::_profile_action(int p_action) {
-
switch (p_action) {
case PROFILE_CLEAR: {
-
EditorSettings::get_singleton()->set("_default_feature_profile", "");
EditorSettings::get_singleton()->save();
current_profile = "";
@@ -395,7 +389,6 @@ void EditorFeatureProfileManager::_profile_action(int p_action) {
_emit_current_profile_changed();
} break;
case PROFILE_SET: {
-
String selected = _get_selected_profile();
ERR_FAIL_COND(selected == String());
if (selected == current_profile) {
@@ -410,33 +403,28 @@ void EditorFeatureProfileManager::_profile_action(int p_action) {
_emit_current_profile_changed();
} break;
case PROFILE_IMPORT: {
-
- import_profiles->popup_centered_ratio();
+ import_profiles->popup_file_dialog();
} break;
case PROFILE_EXPORT: {
-
- export_profile->popup_centered_ratio();
+ export_profile->popup_file_dialog();
export_profile->set_current_file(_get_selected_profile() + ".profile");
} break;
case PROFILE_NEW: {
-
- new_profile_dialog->popup_centered_minsize();
+ new_profile_dialog->popup_centered();
new_profile_name->clear();
new_profile_name->grab_focus();
} break;
case PROFILE_ERASE: {
-
String selected = _get_selected_profile();
ERR_FAIL_COND(selected == String());
erase_profile_dialog->set_text(vformat(TTR("Erase profile '%s'? (no undo)"), selected));
- erase_profile_dialog->popup_centered_minsize();
+ erase_profile_dialog->popup_centered();
} break;
}
}
void EditorFeatureProfileManager::_erase_selected_profile() {
-
String selected = _get_selected_profile();
ERR_FAIL_COND(selected == String());
DirAccessRef da = DirAccess::open(EditorSettings::get_singleton()->get_feature_profiles_dir());
@@ -467,15 +455,17 @@ void EditorFeatureProfileManager::_create_new_profile() {
new_profile->save_to_file(file);
_update_profile_list(name);
+ // The newly created profile is the first one, make it the current profile automatically.
+ if (profile_list->get_item_count() == 1) {
+ _profile_action(PROFILE_SET);
+ }
}
void EditorFeatureProfileManager::_profile_selected(int p_what) {
-
_update_selected_profile();
}
void EditorFeatureProfileManager::_fill_classes_from(TreeItem *p_parent, const String &p_class, const String &p_selected) {
-
TreeItem *class_item = class_list->create_item(p_parent);
class_item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
class_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_class, "Node"));
@@ -485,7 +475,7 @@ void EditorFeatureProfileManager::_fill_classes_from(TreeItem *p_parent, const S
bool disabled_editor = edited->is_class_editor_disabled(p_class);
bool disabled_properties = edited->has_class_properties_disabled(p_class);
if (disabled) {
- class_item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
+ class_item->set_custom_color(0, class_list->get_theme_color("disabled_font_color", "Editor"));
} else if (disabled_editor && disabled_properties) {
text += " " + TTR("(Editor Disabled, Properties Disabled)");
} else if (disabled_properties) {
@@ -522,9 +512,9 @@ void EditorFeatureProfileManager::_fill_classes_from(TreeItem *p_parent, const S
}
void EditorFeatureProfileManager::_class_list_item_selected() {
-
- if (updating_features)
+ if (updating_features) {
return;
+ }
property_list->clear();
@@ -534,7 +524,7 @@ void EditorFeatureProfileManager::_class_list_item_selected() {
}
Variant md = item->get_metadata(0);
- if (md.get_type() != Variant::STRING) {
+ if (md.get_type() != Variant::STRING && md.get_type() != Variant::STRING_NAME) {
return;
}
@@ -567,10 +557,10 @@ void EditorFeatureProfileManager::_class_list_item_selected() {
ClassDB::get_property_list(class_name, &props, true);
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
-
String name = E->get().name;
- if (!(E->get().usage & PROPERTY_USAGE_EDITOR))
+ if (!(E->get().usage & PROPERTY_USAGE_EDITOR)) {
continue;
+ }
TreeItem *property = property_list->create_item(properties);
property->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
property->set_editable(0, true);
@@ -586,9 +576,9 @@ void EditorFeatureProfileManager::_class_list_item_selected() {
}
void EditorFeatureProfileManager::_class_list_item_edited() {
-
- if (updating_features)
+ if (updating_features) {
return;
+ }
TreeItem *item = class_list->get_edited();
if (!item) {
@@ -598,7 +588,7 @@ void EditorFeatureProfileManager::_class_list_item_edited() {
bool checked = item->is_checked(0);
Variant md = item->get_metadata(0);
- if (md.get_type() == Variant::STRING) {
+ if (md.get_type() == Variant::STRING || md.get_type() == Variant::STRING_NAME) {
String class_selected = md;
edited->set_disable_class(class_selected, !checked);
_save_and_update();
@@ -611,8 +601,9 @@ void EditorFeatureProfileManager::_class_list_item_edited() {
}
void EditorFeatureProfileManager::_property_item_edited() {
- if (updating_features)
+ if (updating_features) {
return;
+ }
TreeItem *class_item = class_list->get_selected();
if (!class_item) {
@@ -620,7 +611,7 @@ void EditorFeatureProfileManager::_property_item_edited() {
}
Variant md = class_item->get_metadata(0);
- if (md.get_type() != Variant::STRING) {
+ if (md.get_type() != Variant::STRING && md.get_type() != Variant::STRING_NAME) {
return;
}
@@ -633,7 +624,7 @@ void EditorFeatureProfileManager::_property_item_edited() {
bool checked = item->is_checked(0);
md = item->get_metadata(0);
- if (md.get_type() == Variant::STRING) {
+ if (md.get_type() == Variant::STRING || md.get_type() == Variant::STRING_NAME) {
String property_selected = md;
edited->set_disable_class_property(class_name, property_selected, !checked);
_save_and_update();
@@ -651,13 +642,12 @@ void EditorFeatureProfileManager::_property_item_edited() {
}
void EditorFeatureProfileManager::_update_selected_profile() {
-
String class_selected;
int feature_selected = -1;
if (class_list->get_selected()) {
Variant md = class_list->get_selected()->get_metadata(0);
- if (md.get_type() == Variant::STRING) {
+ if (md.get_type() == Variant::STRING || md.get_type() == Variant::STRING_NAME) {
class_selected = md;
} else if (md.get_type() == Variant::INT) {
feature_selected = md;
@@ -688,10 +678,16 @@ void EditorFeatureProfileManager::_update_selected_profile() {
TreeItem *root = class_list->create_item();
TreeItem *features = class_list->create_item(root);
+ TreeItem *last_feature;
features->set_text(0, TTR("Enabled Features:"));
for (int i = 0; i < EditorFeatureProfile::FEATURE_MAX; i++) {
-
- TreeItem *feature = class_list->create_item(features);
+ TreeItem *feature;
+ if (i == EditorFeatureProfile::FEATURE_IMPORT_DOCK) {
+ feature = class_list->create_item(last_feature);
+ } else {
+ feature = class_list->create_item(features);
+ last_feature = feature;
+ }
feature->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
feature->set_text(0, TTRGET(EditorFeatureProfile::get_feature_name(EditorFeatureProfile::Feature(i))));
feature->set_selectable(0, true);
@@ -718,7 +714,6 @@ void EditorFeatureProfileManager::_update_selected_profile() {
}
void EditorFeatureProfileManager::_import_profiles(const Vector<String> &p_paths) {
-
//test it first
for (int i = 0; i < p_paths.size(); i++) {
Ref<EditorFeatureProfile> profile;
@@ -750,10 +745,13 @@ void EditorFeatureProfileManager::_import_profiles(const Vector<String> &p_paths
}
_update_profile_list();
+ // The newly imported profile is the first one, make it the current profile automatically.
+ if (profile_list->get_item_count() == 1) {
+ _profile_action(PROFILE_SET);
+ }
}
void EditorFeatureProfileManager::_export_profile(const String &p_path) {
-
ERR_FAIL_COND(edited.is_null());
Error err = edited->save_to_file(p_path);
if (err != OK) {
@@ -762,7 +760,6 @@ void EditorFeatureProfileManager::_export_profile(const String &p_path) {
}
void EditorFeatureProfileManager::_save_and_update() {
-
String edited_path = _get_selected_profile();
ERR_FAIL_COND(edited_path == String());
ERR_FAIL_COND(edited.is_null());
@@ -775,7 +772,6 @@ void EditorFeatureProfileManager::_save_and_update() {
}
void EditorFeatureProfileManager::_emit_current_profile_changed() {
-
emit_signal("current_feature_profile_changed");
}
@@ -787,102 +783,104 @@ Ref<EditorFeatureProfile> EditorFeatureProfileManager::get_current_profile() {
return current;
}
-EditorFeatureProfileManager *EditorFeatureProfileManager::singleton = NULL;
+EditorFeatureProfileManager *EditorFeatureProfileManager::singleton = nullptr;
void EditorFeatureProfileManager::_bind_methods() {
-
ClassDB::bind_method("_update_selected_profile", &EditorFeatureProfileManager::_update_selected_profile);
- ClassDB::bind_method("_profile_action", &EditorFeatureProfileManager::_profile_action);
- ClassDB::bind_method("_create_new_profile", &EditorFeatureProfileManager::_create_new_profile);
- ClassDB::bind_method("_profile_selected", &EditorFeatureProfileManager::_profile_selected);
- ClassDB::bind_method("_erase_selected_profile", &EditorFeatureProfileManager::_erase_selected_profile);
- ClassDB::bind_method("_import_profiles", &EditorFeatureProfileManager::_import_profiles);
- ClassDB::bind_method("_export_profile", &EditorFeatureProfileManager::_export_profile);
- ClassDB::bind_method("_class_list_item_selected", &EditorFeatureProfileManager::_class_list_item_selected);
- ClassDB::bind_method("_class_list_item_edited", &EditorFeatureProfileManager::_class_list_item_edited);
- ClassDB::bind_method("_property_item_edited", &EditorFeatureProfileManager::_property_item_edited);
- ClassDB::bind_method("_emit_current_profile_changed", &EditorFeatureProfileManager::_emit_current_profile_changed);
ADD_SIGNAL(MethodInfo("current_feature_profile_changed"));
}
EditorFeatureProfileManager::EditorFeatureProfileManager() {
-
VBoxContainer *main_vbc = memnew(VBoxContainer);
add_child(main_vbc);
HBoxContainer *name_hbc = memnew(HBoxContainer);
current_profile_name = memnew(LineEdit);
name_hbc->add_child(current_profile_name);
+ current_profile_name->set_text(TTR("(none)"));
current_profile_name->set_editable(false);
- current_profile_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ current_profile_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
profile_actions[PROFILE_CLEAR] = memnew(Button(TTR("Unset")));
name_hbc->add_child(profile_actions[PROFILE_CLEAR]);
profile_actions[PROFILE_CLEAR]->set_disabled(true);
- profile_actions[PROFILE_CLEAR]->connect("pressed", this, "_profile_action", varray(PROFILE_CLEAR));
+ profile_actions[PROFILE_CLEAR]->connect("pressed", callable_mp(this, &EditorFeatureProfileManager::_profile_action), varray(PROFILE_CLEAR));
main_vbc->add_margin_child(TTR("Current Profile:"), name_hbc);
HBoxContainer *profiles_hbc = memnew(HBoxContainer);
profile_list = memnew(OptionButton);
- profile_list->set_h_size_flags(SIZE_EXPAND_FILL);
+ profile_list->set_h_size_flags(Control::SIZE_EXPAND_FILL);
profiles_hbc->add_child(profile_list);
- profile_list->connect("item_selected", this, "_profile_selected");
+ profile_list->connect("item_selected", callable_mp(this, &EditorFeatureProfileManager::_profile_selected));
profile_actions[PROFILE_SET] = memnew(Button(TTR("Make Current")));
profiles_hbc->add_child(profile_actions[PROFILE_SET]);
profile_actions[PROFILE_SET]->set_disabled(true);
- profile_actions[PROFILE_SET]->connect("pressed", this, "_profile_action", varray(PROFILE_SET));
+ profile_actions[PROFILE_SET]->connect("pressed", callable_mp(this, &EditorFeatureProfileManager::_profile_action), varray(PROFILE_SET));
profile_actions[PROFILE_ERASE] = memnew(Button(TTR("Remove")));
profiles_hbc->add_child(profile_actions[PROFILE_ERASE]);
profile_actions[PROFILE_ERASE]->set_disabled(true);
- profile_actions[PROFILE_ERASE]->connect("pressed", this, "_profile_action", varray(PROFILE_ERASE));
+ profile_actions[PROFILE_ERASE]->connect("pressed", callable_mp(this, &EditorFeatureProfileManager::_profile_action), varray(PROFILE_ERASE));
profiles_hbc->add_child(memnew(VSeparator));
profile_actions[PROFILE_NEW] = memnew(Button(TTR("New")));
profiles_hbc->add_child(profile_actions[PROFILE_NEW]);
- profile_actions[PROFILE_NEW]->connect("pressed", this, "_profile_action", varray(PROFILE_NEW));
+ profile_actions[PROFILE_NEW]->connect("pressed", callable_mp(this, &EditorFeatureProfileManager::_profile_action), varray(PROFILE_NEW));
profiles_hbc->add_child(memnew(VSeparator));
profile_actions[PROFILE_IMPORT] = memnew(Button(TTR("Import")));
profiles_hbc->add_child(profile_actions[PROFILE_IMPORT]);
- profile_actions[PROFILE_IMPORT]->connect("pressed", this, "_profile_action", varray(PROFILE_IMPORT));
+ profile_actions[PROFILE_IMPORT]->connect("pressed", callable_mp(this, &EditorFeatureProfileManager::_profile_action), varray(PROFILE_IMPORT));
profile_actions[PROFILE_EXPORT] = memnew(Button(TTR("Export")));
profiles_hbc->add_child(profile_actions[PROFILE_EXPORT]);
profile_actions[PROFILE_EXPORT]->set_disabled(true);
- profile_actions[PROFILE_EXPORT]->connect("pressed", this, "_profile_action", varray(PROFILE_EXPORT));
+ profile_actions[PROFILE_EXPORT]->connect("pressed", callable_mp(this, &EditorFeatureProfileManager::_profile_action), varray(PROFILE_EXPORT));
main_vbc->add_margin_child(TTR("Available Profiles:"), profiles_hbc);
h_split = memnew(HSplitContainer);
- h_split->set_v_size_flags(SIZE_EXPAND_FILL);
+ h_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
main_vbc->add_child(h_split);
- VBoxContainer *class_list_vbc = memnew(VBoxContainer);
+ class_list_vbc = memnew(VBoxContainer);
h_split->add_child(class_list_vbc);
- class_list_vbc->set_h_size_flags(SIZE_EXPAND_FILL);
+ class_list_vbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
class_list = memnew(Tree);
class_list_vbc->add_margin_child(TTR("Enabled Classes:"), class_list, true);
class_list->set_hide_root(true);
class_list->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
- class_list->connect("cell_selected", this, "_class_list_item_selected");
- class_list->connect("item_edited", this, "_class_list_item_edited", varray(), CONNECT_DEFERRED);
+ class_list->connect("cell_selected", callable_mp(this, &EditorFeatureProfileManager::_class_list_item_selected));
+ class_list->connect("item_edited", callable_mp(this, &EditorFeatureProfileManager::_class_list_item_edited), varray(), CONNECT_DEFERRED);
+ // It will be displayed once the user creates or chooses a profile.
+ class_list_vbc->hide();
- VBoxContainer *property_list_vbc = memnew(VBoxContainer);
+ property_list_vbc = memnew(VBoxContainer);
h_split->add_child(property_list_vbc);
- property_list_vbc->set_h_size_flags(SIZE_EXPAND_FILL);
+ property_list_vbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
property_list = memnew(Tree);
- property_list_vbc->add_margin_child(TTR("Class Options"), property_list, true);
+ property_list_vbc->add_margin_child(TTR("Class Options:"), property_list, true);
property_list->set_hide_root(true);
property_list->set_hide_folding(true);
property_list->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
- property_list->connect("item_edited", this, "_property_item_edited", varray(), CONNECT_DEFERRED);
+ property_list->connect("item_edited", callable_mp(this, &EditorFeatureProfileManager::_property_item_edited), varray(), CONNECT_DEFERRED);
+ // It will be displayed once the user creates or chooses a profile.
+ property_list_vbc->hide();
+
+ no_profile_selected_help = memnew(Label(TTR("Create or import a profile to edit available classes and properties.")));
+ // Add some spacing above the help label.
+ Ref<StyleBoxEmpty> sb = memnew(StyleBoxEmpty);
+ sb->set_default_margin(MARGIN_TOP, 20 * EDSCALE);
+ no_profile_selected_help->add_theme_style_override("normal", sb);
+ no_profile_selected_help->set_align(Label::ALIGN_CENTER);
+ no_profile_selected_help->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ h_split->add_child(no_profile_selected_help);
new_profile_dialog = memnew(ConfirmationDialog);
new_profile_dialog->set_title(TTR("New profile name:"));
@@ -890,28 +888,28 @@ EditorFeatureProfileManager::EditorFeatureProfileManager() {
new_profile_dialog->add_child(new_profile_name);
new_profile_name->set_custom_minimum_size(Size2(300 * EDSCALE, 1));
add_child(new_profile_dialog);
- new_profile_dialog->connect("confirmed", this, "_create_new_profile");
+ new_profile_dialog->connect("confirmed", callable_mp(this, &EditorFeatureProfileManager::_create_new_profile));
new_profile_dialog->register_text_enter(new_profile_name);
new_profile_dialog->get_ok()->set_text(TTR("Create"));
erase_profile_dialog = memnew(ConfirmationDialog);
add_child(erase_profile_dialog);
erase_profile_dialog->set_title(TTR("Erase Profile"));
- erase_profile_dialog->connect("confirmed", this, "_erase_selected_profile");
+ erase_profile_dialog->connect("confirmed", callable_mp(this, &EditorFeatureProfileManager::_erase_selected_profile));
import_profiles = memnew(EditorFileDialog);
add_child(import_profiles);
- import_profiles->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+ import_profiles->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILES);
import_profiles->add_filter("*.profile; " + TTR("Godot Feature Profile"));
- import_profiles->connect("files_selected", this, "_import_profiles");
+ import_profiles->connect("files_selected", callable_mp(this, &EditorFeatureProfileManager::_import_profiles));
import_profiles->set_title(TTR("Import Profile(s)"));
import_profiles->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
export_profile = memnew(EditorFileDialog);
add_child(export_profile);
- export_profile->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ export_profile->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
export_profile->add_filter("*.profile; " + TTR("Godot Feature Profile"));
- export_profile->connect("file_selected", this, "_export_profile");
+ export_profile->connect("file_selected", callable_mp(this, &EditorFeatureProfileManager::_export_profile));
export_profile->set_title(TTR("Export Profile"));
export_profile->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
@@ -921,7 +919,7 @@ EditorFeatureProfileManager::EditorFeatureProfileManager() {
update_timer = memnew(Timer);
update_timer->set_wait_time(1); //wait a second before updating editor
add_child(update_timer);
- update_timer->connect("timeout", this, "_emit_current_profile_changed");
+ update_timer->connect("timeout", callable_mp(this, &EditorFeatureProfileManager::_emit_current_profile_changed));
update_timer->set_one_shot(true);
updating_features = false;
diff --git a/editor/editor_feature_profile.h b/editor/editor_feature_profile.h
index a5ab73da60..d0d08c61f4 100644
--- a/editor/editor_feature_profile.h
+++ b/editor/editor_feature_profile.h
@@ -49,16 +49,16 @@ public:
FEATURE_SCRIPT,
FEATURE_ASSET_LIB,
FEATURE_SCENE_TREE,
- FEATURE_IMPORT_DOCK,
FEATURE_NODE_DOCK,
FEATURE_FILESYSTEM_DOCK,
+ FEATURE_IMPORT_DOCK,
FEATURE_MAX
};
private:
Set<StringName> disabled_classes;
Set<StringName> disabled_editors;
- Map<StringName, Set<StringName> > disabled_properties;
+ Map<StringName, Set<StringName>> disabled_properties;
bool features_disabled[FEATURE_MAX];
static const char *feature_names[FEATURE_MAX];
@@ -94,7 +94,6 @@ public:
VARIANT_ENUM_CAST(EditorFeatureProfile::Feature)
class EditorFeatureProfileManager : public AcceptDialog {
-
GDCLASS(EditorFeatureProfileManager, AcceptDialog);
enum Action {
@@ -121,8 +120,11 @@ class EditorFeatureProfileManager : public AcceptDialog {
HSplitContainer *h_split;
+ VBoxContainer *class_list_vbc;
Tree *class_list;
+ VBoxContainer *property_list_vbc;
Tree *property_list;
+ Label *no_profile_selected_help;
EditorFileDialog *import_profiles;
EditorFileDialog *export_profile;
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
index 625f46f9d3..0e851734a7 100644
--- a/editor/editor_file_dialog.cpp
+++ b/editor/editor_file_dialog.cpp
@@ -42,82 +42,83 @@
#include "scene/gui/center_container.h"
#include "scene/gui/label.h"
#include "scene/gui/margin_container.h"
+#include "servers/display_server.h"
-EditorFileDialog::GetIconFunc EditorFileDialog::get_icon_func = NULL;
-EditorFileDialog::GetIconFunc EditorFileDialog::get_large_icon_func = NULL;
+EditorFileDialog::GetIconFunc EditorFileDialog::get_icon_func = nullptr;
+EditorFileDialog::GetIconFunc EditorFileDialog::get_large_icon_func = nullptr;
-EditorFileDialog::RegisterFunc EditorFileDialog::register_func = NULL;
-EditorFileDialog::RegisterFunc EditorFileDialog::unregister_func = NULL;
+EditorFileDialog::RegisterFunc EditorFileDialog::register_func = nullptr;
+EditorFileDialog::RegisterFunc EditorFileDialog::unregister_func = nullptr;
+
+void EditorFileDialog::popup_file_dialog() {
+ popup_centered_clamped(Size2(1050, 700) * EDSCALE, 0.8);
+}
VBoxContainer *EditorFileDialog::get_vbox() {
return vbox;
}
void EditorFileDialog::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
-
+ if (p_what == NOTIFICATION_READY || p_what == NOTIFICATION_THEME_CHANGED) {
// update icons
- mode_thumbnails->set_icon(get_icon("FileThumbnail", "EditorIcons"));
- mode_list->set_icon(get_icon("FileList", "EditorIcons"));
- dir_prev->set_icon(get_icon("Back", "EditorIcons"));
- dir_next->set_icon(get_icon("Forward", "EditorIcons"));
- dir_up->set_icon(get_icon("ArrowUp", "EditorIcons"));
- refresh->set_icon(get_icon("Reload", "EditorIcons"));
- favorite->set_icon(get_icon("Favorites", "EditorIcons"));
- show_hidden->set_icon(get_icon("GuiVisibilityVisible", "EditorIcons"));
-
- fav_up->set_icon(get_icon("MoveUp", "EditorIcons"));
- fav_down->set_icon(get_icon("MoveDown", "EditorIcons"));
+ mode_thumbnails->set_icon(item_list->get_theme_icon("FileThumbnail", "EditorIcons"));
+ mode_list->set_icon(item_list->get_theme_icon("FileList", "EditorIcons"));
+ dir_prev->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
+ dir_next->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
+ dir_up->set_icon(item_list->get_theme_icon("ArrowUp", "EditorIcons"));
+ refresh->set_icon(item_list->get_theme_icon("Reload", "EditorIcons"));
+ favorite->set_icon(item_list->get_theme_icon("Favorites", "EditorIcons"));
+ show_hidden->set_icon(item_list->get_theme_icon("GuiVisibilityVisible", "EditorIcons"));
+
+ fav_up->set_icon(item_list->get_theme_icon("MoveUp", "EditorIcons"));
+ fav_down->set_icon(item_list->get_theme_icon("MoveDown", "EditorIcons"));
} else if (p_what == NOTIFICATION_PROCESS) {
-
if (preview_waiting) {
preview_wheel_timeout -= get_process_delta_time();
if (preview_wheel_timeout <= 0) {
preview_wheel_index++;
- if (preview_wheel_index >= 8)
+ if (preview_wheel_index >= 8) {
preview_wheel_index = 0;
- Ref<Texture> frame = get_icon("Progress" + itos(preview_wheel_index + 1), "EditorIcons");
+ }
+ Ref<Texture2D> frame = item_list->get_theme_icon("Progress" + itos(preview_wheel_index + 1), "EditorIcons");
preview->set_texture(frame);
preview_wheel_timeout = 0.1;
}
}
- } else if (p_what == NOTIFICATION_POPUP_HIDE) {
-
- set_process_unhandled_input(false);
} else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-
bool is_showing_hidden = EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files");
- if (show_hidden_files != is_showing_hidden)
+ if (show_hidden_files != is_showing_hidden) {
set_show_hidden_files(is_showing_hidden);
+ }
set_display_mode((DisplayMode)EditorSettings::get_singleton()->get("filesystem/file_dialog/display_mode").operator int());
// update icons
- mode_thumbnails->set_icon(get_icon("FileThumbnail", "EditorIcons"));
- mode_list->set_icon(get_icon("FileList", "EditorIcons"));
- dir_prev->set_icon(get_icon("Back", "EditorIcons"));
- dir_next->set_icon(get_icon("Forward", "EditorIcons"));
- dir_up->set_icon(get_icon("ArrowUp", "EditorIcons"));
- refresh->set_icon(get_icon("Reload", "EditorIcons"));
- favorite->set_icon(get_icon("Favorites", "EditorIcons"));
-
- fav_up->set_icon(get_icon("MoveUp", "EditorIcons"));
- fav_down->set_icon(get_icon("MoveDown", "EditorIcons"));
+ mode_thumbnails->set_icon(item_list->get_theme_icon("FileThumbnail", "EditorIcons"));
+ mode_list->set_icon(item_list->get_theme_icon("FileList", "EditorIcons"));
+ dir_prev->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
+ dir_next->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
+ dir_up->set_icon(item_list->get_theme_icon("ArrowUp", "EditorIcons"));
+ refresh->set_icon(item_list->get_theme_icon("Reload", "EditorIcons"));
+ favorite->set_icon(item_list->get_theme_icon("Favorites", "EditorIcons"));
+
+ fav_up->set_icon(item_list->get_theme_icon("MoveUp", "EditorIcons"));
+ fav_down->set_icon(item_list->get_theme_icon("MoveDown", "EditorIcons"));
// DO NOT CALL UPDATE FILE LIST HERE, ALL HUNDREDS OF HIDDEN DIALOGS WILL RESPOND, CALL INVALIDATE INSTEAD
invalidate();
+ } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+ if (!is_visible()) {
+ set_process_unhandled_input(false);
+ }
}
}
void EditorFileDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventKey> k = p_event;
- if (k.is_valid() && is_window_modal_on_top()) {
-
+ if (k.is_valid()) {
if (k->is_pressed()) {
-
bool handled = false;
if (ED_IS_SHORTCUT("file_dialog/go_back", p_event)) {
@@ -176,51 +177,50 @@ void EditorFileDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
}
if (handled) {
- accept_event();
+ set_input_as_handled();
}
}
}
}
void EditorFileDialog::set_enable_multiple_selection(bool p_enable) {
-
item_list->set_select_mode(p_enable ? ItemList::SELECT_MULTI : ItemList::SELECT_SINGLE);
};
Vector<String> EditorFileDialog::get_selected_files() const {
-
Vector<String> list;
for (int i = 0; i < item_list->get_item_count(); i++) {
- if (item_list->is_selected(i))
+ if (item_list->is_selected(i)) {
list.push_back(item_list->get_item_text(i));
+ }
}
return list;
};
void EditorFileDialog::update_dir() {
-
- dir->set_text(dir_access->get_current_dir());
+ if (drives->is_visible()) {
+ drives->select(dir_access->get_current_drive());
+ }
+ dir->set_text(dir_access->get_current_dir(false));
// Disable "Open" button only when selecting file(s) mode.
get_ok()->set_disabled(_is_open_should_be_disabled());
switch (mode) {
-
- case MODE_OPEN_FILE:
- case MODE_OPEN_FILES:
+ case FILE_MODE_OPEN_FILE:
+ case FILE_MODE_OPEN_FILES:
get_ok()->set_text(TTR("Open"));
break;
- case MODE_OPEN_DIR:
+ case FILE_MODE_OPEN_DIR:
get_ok()->set_text(TTR("Select Current Folder"));
break;
- case MODE_OPEN_ANY:
- case MODE_SAVE_FILE:
+ case FILE_MODE_OPEN_ANY:
+ case FILE_MODE_SAVE_FILE:
// FIXME: Implement, or refactor to avoid duplication with set_mode
break;
}
}
void EditorFileDialog::_dir_entered(String p_dir) {
-
dir_access->change_dir(p_dir);
file->set_text("");
invalidate();
@@ -229,12 +229,10 @@ void EditorFileDialog::_dir_entered(String p_dir) {
}
void EditorFileDialog::_file_entered(const String &p_file) {
-
_action_pressed();
}
void EditorFileDialog::_save_confirm_pressed() {
-
String f = dir_access->get_current_dir().plus_file(file->get_text());
_save_to_recent();
hide();
@@ -242,37 +240,39 @@ void EditorFileDialog::_save_confirm_pressed() {
}
void EditorFileDialog::_post_popup() {
-
ConfirmationDialog::_post_popup();
if (invalidated) {
update_file_list();
invalidated = false;
}
- if (mode == MODE_SAVE_FILE)
+ if (mode == FILE_MODE_SAVE_FILE) {
file->grab_focus();
- else
+ } else {
item_list->grab_focus();
+ }
- if (mode == MODE_OPEN_DIR) {
+ if (mode == FILE_MODE_OPEN_DIR) {
file_box->set_visible(false);
} else {
file_box->set_visible(true);
}
- if (is_visible_in_tree() && get_current_file() != "")
+ if (is_visible() && get_current_file() != "") {
_request_single_thumbnail(get_current_dir().plus_file(get_current_file()));
+ }
- if (is_visible_in_tree()) {
- Ref<Texture> folder = get_icon("folder", "FileDialog");
- const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
+ if (is_visible()) {
+ Ref<Texture2D> folder = item_list->get_theme_icon("folder", "FileDialog");
+ const Color folder_color = item_list->get_theme_color("folder_icon_modulate", "FileDialog");
recent->clear();
bool res = access == ACCESS_RESOURCES;
Vector<String> recentd = EditorSettings::get_singleton()->get_recent_dirs();
for (int i = 0; i < recentd.size(); i++) {
bool cres = recentd[i].begins_with("res://");
- if (cres != res)
+ if (cres != res) {
continue;
+ }
String name = recentd[i];
if (res && name == "res://") {
name = "/";
@@ -295,28 +295,26 @@ void EditorFileDialog::_post_popup() {
set_process_unhandled_input(true);
}
-void EditorFileDialog::_thumbnail_result(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata) {
-
- if (display_mode == DISPLAY_LIST || p_preview.is_null())
+void EditorFileDialog::_thumbnail_result(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata) {
+ if (display_mode == DISPLAY_LIST || p_preview.is_null()) {
return;
+ }
for (int i = 0; i < item_list->get_item_count(); i++) {
Dictionary d = item_list->get_item_metadata(i);
String pname = d["path"];
if (pname == p_path) {
item_list->set_item_icon(i, p_preview);
- item_list->set_item_tag_icon(i, Ref<Texture>());
+ item_list->set_item_tag_icon(i, Ref<Texture2D>());
}
}
}
-void EditorFileDialog::_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata) {
-
+void EditorFileDialog::_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata) {
set_process(false);
preview_waiting = false;
if (p_preview.is_valid() && get_current_path() == p_path) {
-
preview->set_texture(p_preview);
if (display_mode == DISPLAY_THUMBNAILS) {
preview_vb->hide();
@@ -326,14 +324,14 @@ void EditorFileDialog::_thumbnail_done(const String &p_path, const Ref<Texture>
} else {
preview_vb->hide();
- preview->set_texture(Ref<Texture>());
+ preview->set_texture(Ref<Texture2D>());
}
}
void EditorFileDialog::_request_single_thumbnail(const String &p_path) {
-
- if (!FileAccess::exists(p_path))
+ if (!FileAccess::exists(p_path)) {
return;
+ }
set_process(true);
preview_waiting = true;
@@ -342,15 +340,14 @@ void EditorFileDialog::_request_single_thumbnail(const String &p_path) {
}
void EditorFileDialog::_action_pressed() {
-
- if (mode == MODE_OPEN_FILES) {
-
+ if (mode == FILE_MODE_OPEN_FILES) {
String fbase = dir_access->get_current_dir();
- PoolVector<String> files;
+ Vector<String> files;
for (int i = 0; i < item_list->get_item_count(); i++) {
- if (item_list->is_selected(i))
+ if (item_list->is_selected(i)) {
files.push_back(fbase.plus_file(item_list->get_item_text(i)));
+ }
}
if (files.size()) {
@@ -364,12 +361,11 @@ void EditorFileDialog::_action_pressed() {
String f = dir_access->get_current_dir().plus_file(file->get_text());
- if ((mode == MODE_OPEN_ANY || mode == MODE_OPEN_FILE) && dir_access->file_exists(f)) {
+ if ((mode == FILE_MODE_OPEN_ANY || mode == FILE_MODE_OPEN_FILE) && dir_access->file_exists(f)) {
_save_to_recent();
hide();
emit_signal("file_selected", f);
- } else if (mode == MODE_OPEN_ANY || mode == MODE_OPEN_DIR) {
-
+ } else if (mode == FILE_MODE_OPEN_ANY || mode == FILE_MODE_OPEN_DIR) {
String path = dir_access->get_current_dir();
path = path.replace("\\", "/");
@@ -390,8 +386,7 @@ void EditorFileDialog::_action_pressed() {
emit_signal("dir_selected", path);
}
- if (mode == MODE_SAVE_FILE) {
-
+ if (mode == FILE_MODE_SAVE_FILE) {
bool valid = false;
if (filter->get_selected() == filter->get_item_count() - 1) {
@@ -399,29 +394,27 @@ void EditorFileDialog::_action_pressed() {
} else if (filters.size() > 1 && filter->get_selected() == 0) {
// match all filters
for (int i = 0; i < filters.size(); i++) {
-
String flt = filters[i].get_slice(";", 0);
for (int j = 0; j < flt.get_slice_count(","); j++) {
-
String str = flt.get_slice(",", j).strip_edges();
if (f.match(str)) {
valid = true;
break;
}
}
- if (valid)
+ if (valid) {
break;
+ }
}
} else {
int idx = filter->get_selected();
- if (filters.size() > 1)
+ if (filters.size() > 1) {
idx--;
+ }
if (idx >= 0 && idx < filters.size()) {
-
String flt = filters[idx].get_slice(";", 0);
int filterSliceCount = flt.get_slice_count(",");
for (int j = 0; j < filterSliceCount; j++) {
-
String str = (flt.get_slice(",", j).strip_edges());
if (f.match(str)) {
valid = true;
@@ -442,16 +435,14 @@ void EditorFileDialog::_action_pressed() {
}
if (!valid) {
-
- exterr->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ exterr->popup_centered(Size2(250, 80) * EDSCALE);
return;
}
if (dir_access->file_exists(f) && !disable_overwrite_warning) {
- confirm_save->set_text(TTR("File Exists, Overwrite?"));
+ confirm_save->set_text(TTR("File exists, overwrite?"));
confirm_save->popup_centered(Size2(200, 80));
} else {
-
_save_to_recent();
hide();
emit_signal("file_selected", f);
@@ -460,25 +451,23 @@ void EditorFileDialog::_action_pressed() {
}
void EditorFileDialog::_cancel_pressed() {
-
file->set_text("");
invalidate();
hide();
}
void EditorFileDialog::_item_selected(int p_item) {
-
int current = p_item;
- if (current < 0 || current >= item_list->get_item_count())
+ if (current < 0 || current >= item_list->get_item_count()) {
return;
+ }
Dictionary d = item_list->get_item_metadata(current);
if (!d["dir"]) {
-
file->set_text(d["name"]);
_request_single_thumbnail(get_current_dir().plus_file(get_current_file()));
- } else if (mode == MODE_OPEN_DIR) {
+ } else if (mode == FILE_MODE_OPEN_DIR) {
get_ok()->set_text(TTR("Select This Folder"));
}
@@ -486,15 +475,14 @@ void EditorFileDialog::_item_selected(int p_item) {
}
void EditorFileDialog::_multi_selected(int p_item, bool p_selected) {
-
int current = p_item;
- if (current < 0 || current >= item_list->get_item_count())
+ if (current < 0 || current >= item_list->get_item_count()) {
return;
+ }
Dictionary d = item_list->get_item_metadata(current);
if (!d["dir"] && p_selected) {
-
file->set_text(d["name"]);
_request_single_thumbnail(get_current_dir().plus_file(get_current_file()));
}
@@ -503,32 +491,29 @@ void EditorFileDialog::_multi_selected(int p_item, bool p_selected) {
}
void EditorFileDialog::_items_clear_selection() {
-
item_list->unselect_all();
// If nothing is selected, then block Open button.
switch (mode) {
-
- case MODE_OPEN_FILE:
- case MODE_OPEN_FILES:
+ case FILE_MODE_OPEN_FILE:
+ case FILE_MODE_OPEN_FILES:
get_ok()->set_text(TTR("Open"));
get_ok()->set_disabled(!item_list->is_anything_selected());
break;
- case MODE_OPEN_DIR:
+ case FILE_MODE_OPEN_DIR:
get_ok()->set_disabled(false);
get_ok()->set_text(TTR("Select Current Folder"));
break;
- case MODE_OPEN_ANY:
- case MODE_SAVE_FILE:
+ case FILE_MODE_OPEN_ANY:
+ case FILE_MODE_SAVE_FILE:
// FIXME: Implement, or refactor to avoid duplication with set_mode
break;
}
}
void EditorFileDialog::_push_history() {
-
local_history.resize(local_history_pos + 1);
String new_path = dir_access->get_current_dir();
if (local_history.size() == 0 || new_path != local_history[local_history_pos]) {
@@ -538,16 +523,16 @@ void EditorFileDialog::_push_history() {
dir_next->set_disabled(true);
}
}
-void EditorFileDialog::_item_dc_selected(int p_item) {
+void EditorFileDialog::_item_dc_selected(int p_item) {
int current = p_item;
- if (current < 0 || current >= item_list->get_item_count())
+ if (current < 0 || current >= item_list->get_item_count()) {
return;
+ }
Dictionary d = item_list->get_item_metadata(current);
if (d["dir"]) {
-
dir_access->change_dir(d["name"]);
call_deferred("_update_file_list");
call_deferred("_update_dir");
@@ -555,13 +540,11 @@ void EditorFileDialog::_item_dc_selected(int p_item) {
_push_history();
} else {
-
_action_pressed();
}
}
void EditorFileDialog::_item_list_item_rmb_selected(int p_item, const Vector2 &p_pos) {
-
// Right click on specific file(s) or folder(s).
item_menu->clear();
item_menu->set_size(Size2(1, 1));
@@ -583,16 +566,16 @@ void EditorFileDialog::_item_list_item_rmb_selected(int p_item, const Vector2 &p
}
if (single_item_selected) {
- item_menu->add_icon_item(get_icon("ActionCopy", "EditorIcons"), TTR("Copy Path"), ITEM_MENU_COPY_PATH);
+ item_menu->add_icon_item(item_list->get_theme_icon("ActionCopy", "EditorIcons"), TTR("Copy Path"), ITEM_MENU_COPY_PATH);
}
if (allow_delete) {
- item_menu->add_icon_item(get_icon("Remove", "EditorIcons"), TTR("Delete"), ITEM_MENU_DELETE, KEY_DELETE);
+ item_menu->add_icon_item(item_list->get_theme_icon("Remove", "EditorIcons"), TTR("Delete"), ITEM_MENU_DELETE, KEY_DELETE);
}
if (single_item_selected) {
item_menu->add_separator();
Dictionary item_meta = item_list->get_item_metadata(p_item);
String item_text = item_meta["dir"] ? TTR("Open in File Manager") : TTR("Show in File Manager");
- item_menu->add_icon_item(get_icon("Filesystem", "EditorIcons"), item_text, ITEM_MENU_SHOW_IN_EXPLORER);
+ item_menu->add_icon_item(item_list->get_theme_icon("Filesystem", "EditorIcons"), item_text, ITEM_MENU_SHOW_IN_EXPLORER);
}
if (item_menu->get_item_count() > 0) {
@@ -602,7 +585,6 @@ void EditorFileDialog::_item_list_item_rmb_selected(int p_item, const Vector2 &p
}
void EditorFileDialog::_item_list_rmb_clicked(const Vector2 &p_pos) {
-
// Right click on folder background. Deselect all files so that actions are applied on the current folder.
for (int i = 0; i < item_list->get_item_count(); i++) {
item_list->unselect(i);
@@ -612,23 +594,21 @@ void EditorFileDialog::_item_list_rmb_clicked(const Vector2 &p_pos) {
item_menu->set_size(Size2(1, 1));
if (can_create_dir) {
- item_menu->add_icon_item(get_icon("folder", "FileDialog"), TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KEY_MASK_CMD | KEY_N);
+ item_menu->add_icon_item(item_list->get_theme_icon("folder", "FileDialog"), TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KEY_MASK_CMD | KEY_N);
}
- item_menu->add_icon_item(get_icon("Reload", "EditorIcons"), TTR("Refresh"), ITEM_MENU_REFRESH, KEY_F5);
+ item_menu->add_icon_item(item_list->get_theme_icon("Reload", "EditorIcons"), TTR("Refresh"), ITEM_MENU_REFRESH, KEY_F5);
item_menu->add_separator();
- item_menu->add_icon_item(get_icon("Filesystem", "EditorIcons"), TTR("Open in File Manager"), ITEM_MENU_SHOW_IN_EXPLORER);
+ item_menu->add_icon_item(item_list->get_theme_icon("Filesystem", "EditorIcons"), TTR("Open in File Manager"), ITEM_MENU_SHOW_IN_EXPLORER);
item_menu->set_position(item_list->get_global_position() + p_pos);
item_menu->popup();
}
void EditorFileDialog::_item_menu_id_pressed(int p_option) {
-
switch (p_option) {
-
case ITEM_MENU_COPY_PATH: {
Dictionary item_meta = item_list->get_item_metadata(item_list->get_current());
- OS::get_singleton()->set_clipboard(item_meta["path"]);
+ DisplayServer::get_singleton()->clipboard_set(item_meta["path"]);
} break;
case ITEM_MENU_DELETE: {
@@ -663,20 +643,21 @@ void EditorFileDialog::_item_menu_id_pressed(int p_option) {
}
bool EditorFileDialog::_is_open_should_be_disabled() {
-
- if (mode == MODE_OPEN_ANY || mode == MODE_SAVE_FILE)
+ if (mode == FILE_MODE_OPEN_ANY || mode == FILE_MODE_SAVE_FILE) {
return false;
+ }
Vector<int> items = item_list->get_selected_items();
- if (items.size() == 0)
- return mode != MODE_OPEN_DIR; // In "Open folder" mode, having nothing selected picks the current folder.
+ if (items.size() == 0) {
+ return mode != FILE_MODE_OPEN_DIR; // In "Open folder" mode, having nothing selected picks the current folder.
+ }
for (int i = 0; i < items.size(); i++) {
-
Dictionary d = item_list->get_item_metadata(items.get(i));
- if (((mode == MODE_OPEN_FILE || mode == MODE_OPEN_FILES) && d["dir"]) || (mode == MODE_OPEN_DIR && !d["dir"]))
+ if (((mode == FILE_MODE_OPEN_FILE || mode == FILE_MODE_OPEN_FILES) && d["dir"]) || (mode == FILE_MODE_OPEN_DIR && !d["dir"])) {
return true;
+ }
}
return false;
@@ -685,13 +666,15 @@ bool EditorFileDialog::_is_open_should_be_disabled() {
void EditorFileDialog::update_file_name() {
int idx = filter->get_selected() - 1;
if ((idx == -1 && filter->get_item_count() == 2) || (filter->get_item_count() > 2 && idx >= 0 && idx < filter->get_item_count() - 2)) {
- if (idx == -1) idx += 1;
+ if (idx == -1) {
+ idx += 1;
+ }
String filter_str = filters[idx];
String file_str = file->get_text();
String base_name = file_str.get_basename();
Vector<String> filter_substr = filter_str.split(";");
if (filter_substr.size() >= 2) {
- file_str = base_name + "." + filter_substr[1].strip_edges().to_lower();
+ file_str = base_name + "." + filter_substr[0].strip_edges().lstrip("*.").to_lower();
} else {
file_str = base_name + "." + filter_str.get_extension().strip_edges().to_lower();
}
@@ -701,11 +684,10 @@ void EditorFileDialog::update_file_name() {
// DO NOT USE THIS FUNCTION UNLESS NEEDED, CALL INVALIDATE() INSTEAD.
void EditorFileDialog::update_file_list() {
-
int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
thumbnail_size *= EDSCALE;
- Ref<Texture> folder_thumbnail;
- Ref<Texture> file_thumbnail;
+ Ref<Texture2D> folder_thumbnail;
+ Ref<Texture2D> file_thumbnail;
item_list->clear();
@@ -713,7 +695,6 @@ void EditorFileDialog::update_file_list() {
item_list->get_v_scroll()->set_value(0);
if (display_mode == DISPLAY_THUMBNAILS) {
-
item_list->set_max_columns(0);
item_list->set_icon_mode(ItemList::ICON_MODE_TOP);
item_list->set_fixed_column_width(thumbnail_size * 3 / 2);
@@ -721,47 +702,48 @@ void EditorFileDialog::update_file_list() {
item_list->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size));
if (thumbnail_size < 64) {
- folder_thumbnail = get_icon("FolderMediumThumb", "EditorIcons");
- file_thumbnail = get_icon("FileMediumThumb", "EditorIcons");
+ folder_thumbnail = item_list->get_theme_icon("FolderMediumThumb", "EditorIcons");
+ file_thumbnail = item_list->get_theme_icon("FileMediumThumb", "EditorIcons");
} else {
- folder_thumbnail = get_icon("FolderBigThumb", "EditorIcons");
- file_thumbnail = get_icon("FileBigThumb", "EditorIcons");
+ folder_thumbnail = item_list->get_theme_icon("FolderBigThumb", "EditorIcons");
+ file_thumbnail = item_list->get_theme_icon("FileBigThumb", "EditorIcons");
}
preview_vb->hide();
} else {
-
item_list->set_icon_mode(ItemList::ICON_MODE_LEFT);
item_list->set_max_columns(1);
item_list->set_max_text_lines(1);
item_list->set_fixed_column_width(0);
item_list->set_fixed_icon_size(Size2());
- if (preview->get_texture().is_valid())
+ if (preview->get_texture().is_valid()) {
preview_vb->show();
+ }
}
String cdir = dir_access->get_current_dir();
dir_access->list_dir_begin();
- Ref<Texture> folder = get_icon("folder", "FileDialog");
- const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
+ Ref<Texture2D> folder = item_list->get_theme_icon("folder", "FileDialog");
+ const Color folder_color = item_list->get_theme_color("folder_icon_modulate", "FileDialog");
List<String> files;
List<String> dirs;
String item;
while ((item = dir_access->get_next()) != "") {
-
- if (item == "." || item == "..")
+ if (item == "." || item == "..") {
continue;
+ }
if (show_hidden_files || !dir_access->current_is_hidden()) {
- if (!dir_access->current_is_dir())
+ if (!dir_access->current_is_dir()) {
files.push_back(item);
- else
+ } else {
dirs.push_back(item);
+ }
}
}
@@ -774,10 +756,8 @@ void EditorFileDialog::update_file_list() {
item_list->add_item(dir_name);
if (display_mode == DISPLAY_THUMBNAILS) {
-
item_list->set_item_icon(item_list->get_item_count() - 1, folder_thumbnail);
} else {
-
item_list->set_item_icon(item_list->get_item_count() - 1, folder);
}
@@ -795,55 +775,45 @@ void EditorFileDialog::update_file_list() {
List<String> patterns;
// build filter
if (filter->get_selected() == filter->get_item_count() - 1) {
-
// match all
} else if (filters.size() > 1 && filter->get_selected() == 0) {
// match all filters
for (int i = 0; i < filters.size(); i++) {
-
String f = filters[i].get_slice(";", 0);
for (int j = 0; j < f.get_slice_count(","); j++) {
-
patterns.push_back(f.get_slice(",", j).strip_edges());
}
}
} else {
int idx = filter->get_selected();
- if (filters.size() > 1)
+ if (filters.size() > 1) {
idx--;
+ }
if (idx >= 0 && idx < filters.size()) {
-
String f = filters[idx].get_slice(";", 0);
for (int j = 0; j < f.get_slice_count(","); j++) {
-
patterns.push_back(f.get_slice(",", j).strip_edges());
}
}
}
while (!files.empty()) {
-
bool match = patterns.empty();
for (List<String>::Element *E = patterns.front(); E; E = E->next()) {
-
if (files.front()->get().matchn(E->get())) {
-
match = true;
break;
}
}
if (match) {
-
item_list->add_item(files.front()->get());
if (get_icon_func) {
-
- Ref<Texture> icon = get_icon_func(cdir.plus_file(files.front()->get()));
+ Ref<Texture2D> icon = get_icon_func(cdir.plus_file(files.front()->get()));
if (display_mode == DISPLAY_THUMBNAILS) {
-
item_list->set_item_icon(item_list->get_item_count() - 1, file_thumbnail);
item_list->set_item_tag_icon(item_list->get_item_count() - 1, icon);
} else {
@@ -862,8 +832,9 @@ void EditorFileDialog::update_file_list() {
EditorResourcePreview::get_singleton()->queue_resource_preview(fullpath, this, "_thumbnail_result", fullpath);
}
- if (file->get_text() == files.front()->get())
+ if (file->get_text() == files.front()->get()) {
item_list->set_current(item_list->get_item_count() - 1);
+ }
}
files.pop_front();
@@ -898,7 +869,6 @@ void EditorFileDialog::_filter_selected(int) {
}
void EditorFileDialog::update_filters() {
-
filter->clear();
if (filters.size() > 1) {
@@ -908,86 +878,87 @@ void EditorFileDialog::update_filters() {
for (int i = 0; i < MIN(max_filters, filters.size()); i++) {
String flt = filters[i].get_slice(";", 0).strip_edges();
- if (i > 0)
+ if (i > 0) {
all_filters += ", ";
+ }
all_filters += flt;
}
- if (max_filters < filters.size())
+ if (max_filters < filters.size()) {
all_filters += ", ...";
+ }
filter->add_item(TTR("All Recognized") + " (" + all_filters + ")");
}
for (int i = 0; i < filters.size(); i++) {
-
String flt = filters[i].get_slice(";", 0).strip_edges();
String desc = filters[i].get_slice(";", 1).strip_edges();
- if (desc.length())
+ if (desc.length()) {
filter->add_item(desc + " (" + flt + ")");
- else
+ } else {
filter->add_item("(" + flt + ")");
+ }
}
filter->add_item(TTR("All Files (*)"));
}
void EditorFileDialog::clear_filters() {
-
filters.clear();
update_filters();
invalidate();
}
-void EditorFileDialog::add_filter(const String &p_filter) {
+void EditorFileDialog::add_filter(const String &p_filter) {
filters.push_back(p_filter);
update_filters();
invalidate();
}
String EditorFileDialog::get_current_dir() const {
-
- return dir->get_text();
+ return dir_access->get_current_dir();
}
-String EditorFileDialog::get_current_file() const {
+String EditorFileDialog::get_current_file() const {
return file->get_text();
}
-String EditorFileDialog::get_current_path() const {
- return dir->get_text().plus_file(file->get_text());
+String EditorFileDialog::get_current_path() const {
+ return dir_access->get_current_dir().plus_file(file->get_text());
}
-void EditorFileDialog::set_current_dir(const String &p_dir) {
- if (p_dir.is_rel_path())
+void EditorFileDialog::set_current_dir(const String &p_dir) {
+ if (p_dir.is_rel_path()) {
dir_access->change_dir(OS::get_singleton()->get_resource_dir());
+ }
dir_access->change_dir(p_dir);
update_dir();
invalidate();
}
-void EditorFileDialog::set_current_file(const String &p_file) {
+void EditorFileDialog::set_current_file(const String &p_file) {
file->set_text(p_file);
update_dir();
invalidate();
- int lp = p_file.find_last(".");
+ int lp = p_file.rfind(".");
if (lp != -1) {
file->select(0, lp);
file->grab_focus();
}
- if (is_visible_in_tree())
+ if (is_visible()) {
_request_single_thumbnail(get_current_dir().plus_file(get_current_file()));
+ }
}
-void EditorFileDialog::set_current_path(const String &p_path) {
- if (!p_path.size())
+void EditorFileDialog::set_current_path(const String &p_path) {
+ if (!p_path.size()) {
return;
- int pos = MAX(p_path.find_last("/"), p_path.find_last("\\"));
+ }
+ int pos = MAX(p_path.rfind("/"), p_path.rfind("\\"));
if (pos == -1) {
-
set_current_file(p_path);
} else {
-
String dir = p_path.substr(0, pos);
String file = p_path.substr(pos + 1, p_path.length());
set_current_dir(dir);
@@ -995,39 +966,37 @@ void EditorFileDialog::set_current_path(const String &p_path) {
}
}
-void EditorFileDialog::set_mode(Mode p_mode) {
-
+void EditorFileDialog::set_file_mode(FileMode p_mode) {
mode = p_mode;
switch (mode) {
-
- case MODE_OPEN_FILE:
+ case FILE_MODE_OPEN_FILE:
get_ok()->set_text(TTR("Open"));
set_title(TTR("Open a File"));
can_create_dir = false;
break;
- case MODE_OPEN_FILES:
+ case FILE_MODE_OPEN_FILES:
get_ok()->set_text(TTR("Open"));
set_title(TTR("Open File(s)"));
can_create_dir = false;
break;
- case MODE_OPEN_DIR:
+ case FILE_MODE_OPEN_DIR:
get_ok()->set_text(TTR("Open"));
set_title(TTR("Open a Directory"));
can_create_dir = true;
break;
- case MODE_OPEN_ANY:
+ case FILE_MODE_OPEN_ANY:
get_ok()->set_text(TTR("Open"));
set_title(TTR("Open a File or Directory"));
can_create_dir = true;
break;
- case MODE_SAVE_FILE:
+ case FILE_MODE_SAVE_FILE:
get_ok()->set_text(TTR("Save"));
set_title(TTR("Save a File"));
can_create_dir = true;
break;
}
- if (mode == MODE_OPEN_FILES) {
+ if (mode == FILE_MODE_OPEN_FILES) {
item_list->set_select_mode(ItemList::SELECT_MULTI);
} else {
item_list->set_select_mode(ItemList::SELECT_SINGLE);
@@ -1040,28 +1009,24 @@ void EditorFileDialog::set_mode(Mode p_mode) {
}
}
-EditorFileDialog::Mode EditorFileDialog::get_mode() const {
-
+EditorFileDialog::FileMode EditorFileDialog::get_file_mode() const {
return mode;
}
void EditorFileDialog::set_access(Access p_access) {
-
ERR_FAIL_INDEX(p_access, 3);
- if (access == p_access)
+ if (access == p_access) {
return;
+ }
memdelete(dir_access);
switch (p_access) {
case ACCESS_FILESYSTEM: {
-
dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
} break;
case ACCESS_RESOURCES: {
-
dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
} break;
case ACCESS_USERDATA: {
-
dir_access = DirAccess::create(DirAccess::ACCESS_USERDATA);
} break;
}
@@ -1073,8 +1038,7 @@ void EditorFileDialog::set_access(Access p_access) {
}
void EditorFileDialog::invalidate() {
-
- if (is_visible_in_tree()) {
+ if (is_visible()) {
update_file_list();
_update_favorites();
invalidated = false;
@@ -1084,12 +1048,10 @@ void EditorFileDialog::invalidate() {
}
EditorFileDialog::Access EditorFileDialog::get_access() const {
-
return access;
}
void EditorFileDialog::_make_dir_confirm() {
-
Error err = dir_access->make_dir(makedirname->get_text());
if (err == OK) {
dir_access->change_dir(makedirname->get_text());
@@ -1099,19 +1061,17 @@ void EditorFileDialog::_make_dir_confirm() {
_push_history();
EditorFileSystem::get_singleton()->scan_changes(); //we created a dir, so rescan changes
} else {
- mkdirerr->popup_centered_minsize(Size2(250, 50) * EDSCALE);
+ mkdirerr->popup_centered(Size2(250, 50) * EDSCALE);
}
makedirname->set_text(""); // reset label
}
void EditorFileDialog::_make_dir() {
-
- makedialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ makedialog->popup_centered(Size2(250, 80) * EDSCALE);
makedirname->grab_focus();
}
void EditorFileDialog::_delete_items() {
-
// Collect the selected folders and files to delete and check them in the deletion dependency dialog.
Vector<String> folders;
Vector<String> files;
@@ -1133,7 +1093,6 @@ void EditorFileDialog::_delete_items() {
}
void EditorFileDialog::_select_drive(int p_idx) {
-
String d = drives->get_item_text(p_idx);
dir_access->change_dir(d);
file->set_text("");
@@ -1143,12 +1102,17 @@ void EditorFileDialog::_select_drive(int p_idx) {
}
void EditorFileDialog::_update_drives() {
-
int dc = dir_access->get_drive_count();
if (dc == 0 || access != ACCESS_FILESYSTEM) {
drives->hide();
} else {
drives->clear();
+ Node *dp = drives->get_parent();
+ if (dp) {
+ dp->remove_child(drives);
+ }
+ dp = dir_access->drives_are_shortcuts() ? shortcuts_container : drives_container;
+ dp->add_child(drives);
drives->show();
for (int i = 0; i < dir_access->get_drive_count(); i++) {
@@ -1161,7 +1125,6 @@ void EditorFileDialog::_update_drives() {
}
void EditorFileDialog::_favorite_selected(int p_idx) {
-
dir_access->change_dir(favorites->get_item_metadata(p_idx));
file->set_text("");
update_dir();
@@ -1170,7 +1133,6 @@ void EditorFileDialog::_favorite_selected(int p_idx) {
}
void EditorFileDialog::_favorite_move_up() {
-
int current = favorites->get_current();
if (current > 0 && current < favorites->get_item_count()) {
@@ -1179,8 +1141,9 @@ void EditorFileDialog::_favorite_move_up() {
int a_idx = favorited.find(String(favorites->get_item_metadata(current - 1)));
int b_idx = favorited.find(String(favorites->get_item_metadata(current)));
- if (a_idx == -1 || b_idx == -1)
+ if (a_idx == -1 || b_idx == -1) {
return;
+ }
SWAP(favorited.write[a_idx], favorited.write[b_idx]);
EditorSettings::get_singleton()->set_favorites(favorited);
@@ -1189,8 +1152,8 @@ void EditorFileDialog::_favorite_move_up() {
update_file_list();
}
}
-void EditorFileDialog::_favorite_move_down() {
+void EditorFileDialog::_favorite_move_down() {
int current = favorites->get_current();
if (current >= 0 && current < favorites->get_item_count() - 1) {
@@ -1199,8 +1162,9 @@ void EditorFileDialog::_favorite_move_down() {
int a_idx = favorited.find(String(favorites->get_item_metadata(current + 1)));
int b_idx = favorited.find(String(favorites->get_item_metadata(current)));
- if (a_idx == -1 || b_idx == -1)
+ if (a_idx == -1 || b_idx == -1) {
return;
+ }
SWAP(favorited.write[a_idx], favorited.write[b_idx]);
EditorSettings::get_singleton()->set_favorites(favorited);
@@ -1211,12 +1175,11 @@ void EditorFileDialog::_favorite_move_down() {
}
void EditorFileDialog::_update_favorites() {
-
bool res = access == ACCESS_RESOURCES;
String current = get_current_dir();
- Ref<Texture> folder_icon = get_icon("Folder", "EditorIcons");
- const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
+ Ref<Texture2D> folder_icon = item_list->get_theme_icon("Folder", "EditorIcons");
+ const Color folder_color = item_list->get_theme_color("folder_icon_modulate", "FileDialog");
favorites->clear();
favorite->set_pressed(false);
@@ -1224,20 +1187,23 @@ void EditorFileDialog::_update_favorites() {
Vector<String> favorited = EditorSettings::get_singleton()->get_favorites();
for (int i = 0; i < favorited.size(); i++) {
bool cres = favorited[i].begins_with("res://");
- if (cres != res)
+ if (cres != res) {
continue;
+ }
String name = favorited[i];
bool setthis = false;
if (res && name == "res://") {
- if (name == current)
+ if (name == current) {
setthis = true;
+ }
name = "/";
favorites->add_item(name, folder_icon);
} else if (name.ends_with("/")) {
- if (name == current || name == current + "/")
+ if (name == current || name == current + "/") {
setthis = true;
+ }
name = name.substr(0, name.length() - 1);
name = name.get_file();
@@ -1261,16 +1227,18 @@ void EditorFileDialog::_favorite_pressed() {
bool res = access == ACCESS_RESOURCES;
String cd = get_current_dir();
- if (!cd.ends_with("/"))
+ if (!cd.ends_with("/")) {
cd += "/";
+ }
Vector<String> favorited = EditorSettings::get_singleton()->get_favorites();
bool found = false;
for (int i = 0; i < favorited.size(); i++) {
bool cres = favorited[i].begins_with("res://");
- if (cres != res)
+ if (cres != res) {
continue;
+ }
if (favorited[i] == cd) {
found = true;
@@ -1278,10 +1246,11 @@ void EditorFileDialog::_favorite_pressed() {
}
}
- if (found)
+ if (found) {
favorited.erase(cd);
- else
+ } else {
favorited.push_back(cd);
+ }
EditorSettings::get_singleton()->set_favorites(favorited);
@@ -1289,7 +1258,6 @@ void EditorFileDialog::_favorite_pressed() {
}
void EditorFileDialog::_recent_selected(int p_idx) {
-
Vector<String> recentd = EditorSettings::get_singleton()->get_recent_dirs();
ERR_FAIL_INDEX(p_idx, recentd.size());
@@ -1300,7 +1268,6 @@ void EditorFileDialog::_recent_selected(int p_idx) {
}
void EditorFileDialog::_go_up() {
-
dir_access->change_dir("..");
update_file_list();
update_dir();
@@ -1308,7 +1275,6 @@ void EditorFileDialog::_go_up() {
}
void EditorFileDialog::_go_back() {
-
if (local_history_pos <= 0) {
return;
}
@@ -1321,8 +1287,8 @@ void EditorFileDialog::_go_back() {
dir_prev->set_disabled(local_history_pos == 0);
dir_next->set_disabled(local_history_pos == local_history.size() - 1);
}
-void EditorFileDialog::_go_forward() {
+void EditorFileDialog::_go_forward() {
if (local_history_pos == local_history.size() - 1) {
return;
}
@@ -1341,9 +1307,9 @@ bool EditorFileDialog::default_show_hidden_files = false;
EditorFileDialog::DisplayMode EditorFileDialog::default_display_mode = DISPLAY_THUMBNAILS;
void EditorFileDialog::set_display_mode(DisplayMode p_mode) {
-
- if (display_mode == p_mode)
+ if (display_mode == p_mode) {
return;
+ }
if (p_mode == DISPLAY_THUMBNAILS) {
mode_list->set_pressed(false);
mode_thumbnails->set_pressed(true);
@@ -1356,27 +1322,13 @@ void EditorFileDialog::set_display_mode(DisplayMode p_mode) {
}
EditorFileDialog::DisplayMode EditorFileDialog::get_display_mode() const {
-
return display_mode;
}
void EditorFileDialog::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorFileDialog::_unhandled_input);
- ClassDB::bind_method(D_METHOD("_item_selected"), &EditorFileDialog::_item_selected);
- ClassDB::bind_method(D_METHOD("_multi_selected"), &EditorFileDialog::_multi_selected);
- ClassDB::bind_method(D_METHOD("_items_clear_selection"), &EditorFileDialog::_items_clear_selection);
- ClassDB::bind_method(D_METHOD("_item_list_item_rmb_selected"), &EditorFileDialog::_item_list_item_rmb_selected);
- ClassDB::bind_method(D_METHOD("_item_list_rmb_clicked"), &EditorFileDialog::_item_list_rmb_clicked);
- ClassDB::bind_method(D_METHOD("_item_menu_id_pressed"), &EditorFileDialog::_item_menu_id_pressed);
- ClassDB::bind_method(D_METHOD("_item_db_selected"), &EditorFileDialog::_item_dc_selected);
- ClassDB::bind_method(D_METHOD("_dir_entered"), &EditorFileDialog::_dir_entered);
- ClassDB::bind_method(D_METHOD("_file_entered"), &EditorFileDialog::_file_entered);
- ClassDB::bind_method(D_METHOD("_action_pressed"), &EditorFileDialog::_action_pressed);
ClassDB::bind_method(D_METHOD("_cancel_pressed"), &EditorFileDialog::_cancel_pressed);
- ClassDB::bind_method(D_METHOD("_filter_selected"), &EditorFileDialog::_filter_selected);
- ClassDB::bind_method(D_METHOD("_save_confirm_pressed"), &EditorFileDialog::_save_confirm_pressed);
ClassDB::bind_method(D_METHOD("clear_filters"), &EditorFileDialog::clear_filters);
ClassDB::bind_method(D_METHOD("add_filter", "filter"), &EditorFileDialog::add_filter);
@@ -1386,19 +1338,16 @@ void EditorFileDialog::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_current_dir", "dir"), &EditorFileDialog::set_current_dir);
ClassDB::bind_method(D_METHOD("set_current_file", "file"), &EditorFileDialog::set_current_file);
ClassDB::bind_method(D_METHOD("set_current_path", "path"), &EditorFileDialog::set_current_path);
- ClassDB::bind_method(D_METHOD("set_mode", "mode"), &EditorFileDialog::set_mode);
- ClassDB::bind_method(D_METHOD("get_mode"), &EditorFileDialog::get_mode);
+ ClassDB::bind_method(D_METHOD("set_file_mode", "mode"), &EditorFileDialog::set_file_mode);
+ ClassDB::bind_method(D_METHOD("get_file_mode"), &EditorFileDialog::get_file_mode);
ClassDB::bind_method(D_METHOD("get_vbox"), &EditorFileDialog::get_vbox);
ClassDB::bind_method(D_METHOD("set_access", "access"), &EditorFileDialog::set_access);
ClassDB::bind_method(D_METHOD("get_access"), &EditorFileDialog::get_access);
ClassDB::bind_method(D_METHOD("set_show_hidden_files", "show"), &EditorFileDialog::set_show_hidden_files);
ClassDB::bind_method(D_METHOD("is_showing_hidden_files"), &EditorFileDialog::is_showing_hidden_files);
- ClassDB::bind_method(D_METHOD("_select_drive"), &EditorFileDialog::_select_drive);
- ClassDB::bind_method(D_METHOD("_make_dir"), &EditorFileDialog::_make_dir);
- ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &EditorFileDialog::_make_dir_confirm);
ClassDB::bind_method(D_METHOD("_update_file_name"), &EditorFileDialog::update_file_name);
- ClassDB::bind_method(D_METHOD("_update_file_list"), &EditorFileDialog::update_file_list);
ClassDB::bind_method(D_METHOD("_update_dir"), &EditorFileDialog::update_dir);
+ ClassDB::bind_method(D_METHOD("_update_file_list"), &EditorFileDialog::update_file_list);
ClassDB::bind_method(D_METHOD("_thumbnail_done"), &EditorFileDialog::_thumbnail_done);
ClassDB::bind_method(D_METHOD("set_display_mode", "mode"), &EditorFileDialog::set_display_mode);
ClassDB::bind_method(D_METHOD("get_display_mode"), &EditorFileDialog::get_display_mode);
@@ -1406,36 +1355,26 @@ void EditorFileDialog::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_disable_overwrite_warning", "disable"), &EditorFileDialog::set_disable_overwrite_warning);
ClassDB::bind_method(D_METHOD("is_overwrite_warning_disabled"), &EditorFileDialog::is_overwrite_warning_disabled);
- ClassDB::bind_method(D_METHOD("_recent_selected"), &EditorFileDialog::_recent_selected);
- ClassDB::bind_method(D_METHOD("_go_back"), &EditorFileDialog::_go_back);
- ClassDB::bind_method(D_METHOD("_go_forward"), &EditorFileDialog::_go_forward);
- ClassDB::bind_method(D_METHOD("_go_up"), &EditorFileDialog::_go_up);
-
- ClassDB::bind_method(D_METHOD("_favorite_pressed"), &EditorFileDialog::_favorite_pressed);
- ClassDB::bind_method(D_METHOD("_favorite_selected"), &EditorFileDialog::_favorite_selected);
- ClassDB::bind_method(D_METHOD("_favorite_move_up"), &EditorFileDialog::_favorite_move_up);
- ClassDB::bind_method(D_METHOD("_favorite_move_down"), &EditorFileDialog::_favorite_move_down);
-
ClassDB::bind_method(D_METHOD("invalidate"), &EditorFileDialog::invalidate);
ADD_SIGNAL(MethodInfo("file_selected", PropertyInfo(Variant::STRING, "path")));
- ADD_SIGNAL(MethodInfo("files_selected", PropertyInfo(Variant::POOL_STRING_ARRAY, "paths")));
+ ADD_SIGNAL(MethodInfo("files_selected", PropertyInfo(Variant::PACKED_STRING_ARRAY, "paths")));
ADD_SIGNAL(MethodInfo("dir_selected", PropertyInfo(Variant::STRING, "dir")));
ADD_PROPERTY(PropertyInfo(Variant::INT, "access", PROPERTY_HINT_ENUM, "Resources,User data,File system"), "set_access", "get_access");
ADD_PROPERTY(PropertyInfo(Variant::INT, "display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List"), "set_display_mode", "get_display_mode");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Open one,Open many,Open folder,Open any,Save"), "set_mode", "get_mode");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "file_mode", PROPERTY_HINT_ENUM, "Open one,Open many,Open folder,Open any,Save"), "set_file_mode", "get_file_mode");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_dir", PROPERTY_HINT_DIR), "set_current_dir", "get_current_dir");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_file", PROPERTY_HINT_FILE, "*"), "set_current_file", "get_current_file");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_path"), "set_current_path", "get_current_path");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_hidden_files"), "set_show_hidden_files", "is_showing_hidden_files");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disable_overwrite_warning"), "set_disable_overwrite_warning", "is_overwrite_warning_disabled");
- BIND_ENUM_CONSTANT(MODE_OPEN_FILE);
- BIND_ENUM_CONSTANT(MODE_OPEN_FILES);
- BIND_ENUM_CONSTANT(MODE_OPEN_DIR);
- BIND_ENUM_CONSTANT(MODE_OPEN_ANY);
- BIND_ENUM_CONSTANT(MODE_SAVE_FILE);
+ BIND_ENUM_CONSTANT(FILE_MODE_OPEN_FILE);
+ BIND_ENUM_CONSTANT(FILE_MODE_OPEN_FILES);
+ BIND_ENUM_CONSTANT(FILE_MODE_OPEN_DIR);
+ BIND_ENUM_CONSTANT(FILE_MODE_OPEN_ANY);
+ BIND_ENUM_CONSTANT(FILE_MODE_SAVE_FILE);
BIND_ENUM_CONSTANT(ACCESS_RESOURCES);
BIND_ENUM_CONSTANT(ACCESS_USERDATA);
@@ -1464,7 +1403,6 @@ void EditorFileDialog::set_default_display_mode(DisplayMode p_mode) {
}
void EditorFileDialog::_save_to_recent() {
-
String dir = get_current_dir();
Vector<String> recent = EditorSettings::get_singleton()->get_recent_dirs();
@@ -1488,19 +1426,14 @@ void EditorFileDialog::_save_to_recent() {
}
void EditorFileDialog::set_disable_overwrite_warning(bool p_disable) {
-
disable_overwrite_warning = p_disable;
}
bool EditorFileDialog::is_overwrite_warning_disabled() const {
-
return disable_overwrite_warning;
}
EditorFileDialog::EditorFileDialog() {
-
- set_resizable(true);
-
show_hidden_files = default_show_hidden_files;
display_mode = default_display_mode;
local_history_pos = 0;
@@ -1508,7 +1441,7 @@ EditorFileDialog::EditorFileDialog() {
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
- mode = MODE_SAVE_FILE;
+ mode = FILE_MODE_SAVE_FILE;
set_title(TTR("Save a File"));
ED_SHORTCUT("file_dialog/go_back", TTR("Go Back"), KEY_MASK_ALT | KEY_LEFT);
@@ -1526,43 +1459,52 @@ EditorFileDialog::EditorFileDialog() {
HBoxContainer *pathhb = memnew(HBoxContainer);
- dir_prev = memnew(ToolButton);
+ dir_prev = memnew(Button);
+ dir_prev->set_flat(true);
dir_prev->set_tooltip(TTR("Go to previous folder."));
- dir_next = memnew(ToolButton);
+ dir_next = memnew(Button);
+ dir_next->set_flat(true);
dir_next->set_tooltip(TTR("Go to next folder."));
- dir_up = memnew(ToolButton);
+ dir_up = memnew(Button);
+ dir_up->set_flat(true);
dir_up->set_tooltip(TTR("Go to parent folder."));
pathhb->add_child(dir_prev);
pathhb->add_child(dir_next);
pathhb->add_child(dir_up);
- dir_prev->connect("pressed", this, "_go_back");
- dir_next->connect("pressed", this, "_go_forward");
- dir_up->connect("pressed", this, "_go_up");
+ dir_prev->connect("pressed", callable_mp(this, &EditorFileDialog::_go_back));
+ dir_next->connect("pressed", callable_mp(this, &EditorFileDialog::_go_forward));
+ dir_up->connect("pressed", callable_mp(this, &EditorFileDialog::_go_up));
pathhb->add_child(memnew(Label(TTR("Path:"))));
+ drives_container = memnew(HBoxContainer);
+ pathhb->add_child(drives_container);
+
dir = memnew(LineEdit);
pathhb->add_child(dir);
- dir->set_h_size_flags(SIZE_EXPAND_FILL);
+ dir->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- refresh = memnew(ToolButton);
+ refresh = memnew(Button);
+ refresh->set_flat(true);
refresh->set_tooltip(TTR("Refresh files."));
- refresh->connect("pressed", this, "_update_file_list");
+ refresh->connect("pressed", callable_mp(this, &EditorFileDialog::update_file_list));
pathhb->add_child(refresh);
- favorite = memnew(ToolButton);
+ favorite = memnew(Button);
+ favorite->set_flat(true);
favorite->set_toggle_mode(true);
favorite->set_tooltip(TTR("(Un)favorite current folder."));
- favorite->connect("pressed", this, "_favorite_pressed");
+ favorite->connect("pressed", callable_mp(this, &EditorFileDialog::_favorite_pressed));
pathhb->add_child(favorite);
- show_hidden = memnew(ToolButton);
+ show_hidden = memnew(Button);
+ show_hidden->set_flat(true);
show_hidden->set_toggle_mode(true);
show_hidden->set_pressed(is_showing_hidden_files());
show_hidden->set_tooltip(TTR("Toggle the visibility of hidden files."));
- show_hidden->connect("toggled", this, "set_show_hidden_files");
+ show_hidden->connect("toggled", callable_mp(this, &EditorFileDialog::set_show_hidden_files));
pathhb->add_child(show_hidden);
pathhb->add_child(memnew(VSeparator));
@@ -1570,36 +1512,41 @@ EditorFileDialog::EditorFileDialog() {
Ref<ButtonGroup> view_mode_group;
view_mode_group.instance();
- mode_thumbnails = memnew(ToolButton);
- mode_thumbnails->connect("pressed", this, "set_display_mode", varray(DISPLAY_THUMBNAILS));
+ mode_thumbnails = memnew(Button);
+ mode_thumbnails->set_flat(true);
+ mode_thumbnails->connect("pressed", callable_mp(this, &EditorFileDialog::set_display_mode), varray(DISPLAY_THUMBNAILS));
mode_thumbnails->set_toggle_mode(true);
mode_thumbnails->set_pressed(display_mode == DISPLAY_THUMBNAILS);
mode_thumbnails->set_button_group(view_mode_group);
mode_thumbnails->set_tooltip(TTR("View items as a grid of thumbnails."));
pathhb->add_child(mode_thumbnails);
- mode_list = memnew(ToolButton);
- mode_list->connect("pressed", this, "set_display_mode", varray(DISPLAY_LIST));
+ mode_list = memnew(Button);
+ mode_list->set_flat(true);
+ mode_list->connect("pressed", callable_mp(this, &EditorFileDialog::set_display_mode), varray(DISPLAY_LIST));
mode_list->set_toggle_mode(true);
mode_list->set_pressed(display_mode == DISPLAY_LIST);
mode_list->set_button_group(view_mode_group);
mode_list->set_tooltip(TTR("View items as a list."));
pathhb->add_child(mode_list);
+ shortcuts_container = memnew(HBoxContainer);
+ pathhb->add_child(shortcuts_container);
+
drives = memnew(OptionButton);
+ drives->connect("item_selected", callable_mp(this, &EditorFileDialog::_select_drive));
pathhb->add_child(drives);
- drives->connect("item_selected", this, "_select_drive");
makedir = memnew(Button);
makedir->set_text(TTR("Create Folder"));
- makedir->connect("pressed", this, "_make_dir");
+ makedir->connect("pressed", callable_mp(this, &EditorFileDialog::_make_dir));
pathhb->add_child(makedir);
list_hb = memnew(HSplitContainer);
vbc->add_child(pathhb);
vbc->add_child(list_hb);
- list_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ list_hb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
VSplitContainer *vsc = memnew(VSplitContainer);
list_hb->add_child(vsc);
@@ -1607,56 +1554,58 @@ EditorFileDialog::EditorFileDialog() {
VBoxContainer *fav_vb = memnew(VBoxContainer);
vsc->add_child(fav_vb);
fav_vb->set_custom_minimum_size(Size2(150, 100) * EDSCALE);
- fav_vb->set_v_size_flags(SIZE_EXPAND_FILL);
+ fav_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
HBoxContainer *fav_hb = memnew(HBoxContainer);
fav_vb->add_child(fav_hb);
fav_hb->add_child(memnew(Label(TTR("Favorites:"))));
fav_hb->add_spacer();
- fav_up = memnew(ToolButton);
+ fav_up = memnew(Button);
+ fav_up->set_flat(true);
fav_hb->add_child(fav_up);
- fav_up->connect("pressed", this, "_favorite_move_up");
- fav_down = memnew(ToolButton);
+ fav_up->connect("pressed", callable_mp(this, &EditorFileDialog::_favorite_move_up));
+ fav_down = memnew(Button);
+ fav_down->set_flat(true);
fav_hb->add_child(fav_down);
- fav_down->connect("pressed", this, "_favorite_move_down");
+ fav_down->connect("pressed", callable_mp(this, &EditorFileDialog::_favorite_move_down));
favorites = memnew(ItemList);
fav_vb->add_child(favorites);
- favorites->set_v_size_flags(SIZE_EXPAND_FILL);
- favorites->connect("item_selected", this, "_favorite_selected");
+ favorites->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ favorites->connect("item_selected", callable_mp(this, &EditorFileDialog::_favorite_selected));
VBoxContainer *rec_vb = memnew(VBoxContainer);
vsc->add_child(rec_vb);
rec_vb->set_custom_minimum_size(Size2(150, 100) * EDSCALE);
- rec_vb->set_v_size_flags(SIZE_EXPAND_FILL);
+ rec_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
recent = memnew(ItemList);
recent->set_allow_reselect(true);
rec_vb->add_margin_child(TTR("Recent:"), recent, true);
- recent->connect("item_selected", this, "_recent_selected");
+ recent->connect("item_selected", callable_mp(this, &EditorFileDialog::_recent_selected));
VBoxContainer *item_vb = memnew(VBoxContainer);
list_hb->add_child(item_vb);
item_vb->set_custom_minimum_size(Size2(320, 0) * EDSCALE);
HBoxContainer *preview_hb = memnew(HBoxContainer);
- preview_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ preview_hb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
item_vb->add_child(preview_hb);
VBoxContainer *list_vb = memnew(VBoxContainer);
- list_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ list_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
list_vb->add_child(memnew(Label(TTR("Directories & Files:"))));
preview_hb->add_child(list_vb);
// Item (files and folders) list with context menu.
item_list = memnew(ItemList);
- item_list->set_v_size_flags(SIZE_EXPAND_FILL);
- item_list->connect("item_rmb_selected", this, "_item_list_item_rmb_selected");
- item_list->connect("rmb_clicked", this, "_item_list_rmb_clicked");
+ item_list->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ item_list->connect("item_rmb_selected", callable_mp(this, &EditorFileDialog::_item_list_item_rmb_selected));
+ item_list->connect("rmb_clicked", callable_mp(this, &EditorFileDialog::_item_list_rmb_clicked));
item_list->set_allow_rmb_select(true);
list_vb->add_child(item_list);
item_menu = memnew(PopupMenu);
- item_menu->connect("id_pressed", this, "_item_menu_id_pressed");
+ item_menu->connect("id_pressed", callable_mp(this, &EditorFileDialog::_item_menu_id_pressed));
add_child(item_menu);
// Other stuff.
@@ -1673,33 +1622,33 @@ EditorFileDialog::EditorFileDialog() {
file_box->add_child(memnew(Label(TTR("File:"))));
file = memnew(LineEdit);
file->set_stretch_ratio(4);
- file->set_h_size_flags(SIZE_EXPAND_FILL);
+ file->set_h_size_flags(Control::SIZE_EXPAND_FILL);
file_box->add_child(file);
filter = memnew(OptionButton);
filter->set_stretch_ratio(3);
- filter->set_h_size_flags(SIZE_EXPAND_FILL);
+ filter->set_h_size_flags(Control::SIZE_EXPAND_FILL);
filter->set_clip_text(true); // Too many extensions overflow it.
file_box->add_child(filter);
- file_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ file_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
item_vb->add_child(file_box);
dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
access = ACCESS_RESOURCES;
_update_drives();
- connect("confirmed", this, "_action_pressed");
- item_list->connect("item_selected", this, "_item_selected", varray(), CONNECT_DEFERRED);
- item_list->connect("multi_selected", this, "_multi_selected", varray(), CONNECT_DEFERRED);
- item_list->connect("item_activated", this, "_item_db_selected", varray());
- item_list->connect("nothing_selected", this, "_items_clear_selection");
- dir->connect("text_entered", this, "_dir_entered");
- file->connect("text_entered", this, "_file_entered");
- filter->connect("item_selected", this, "_filter_selected");
+ connect("confirmed", callable_mp(this, &EditorFileDialog::_action_pressed));
+ item_list->connect("item_selected", callable_mp(this, &EditorFileDialog::_item_selected), varray(), CONNECT_DEFERRED);
+ item_list->connect("multi_selected", callable_mp(this, &EditorFileDialog::_multi_selected), varray(), CONNECT_DEFERRED);
+ item_list->connect("item_activated", callable_mp(this, &EditorFileDialog::_item_dc_selected), varray());
+ item_list->connect("nothing_selected", callable_mp(this, &EditorFileDialog::_items_clear_selection));
+ dir->connect("text_entered", callable_mp(this, &EditorFileDialog::_dir_entered));
+ file->connect("text_entered", callable_mp(this, &EditorFileDialog::_file_entered));
+ filter->connect("item_selected", callable_mp(this, &EditorFileDialog::_filter_selected));
confirm_save = memnew(ConfirmationDialog);
- confirm_save->set_as_toplevel(true);
+ //confirm_save->set_as_toplevel(true);
add_child(confirm_save);
- confirm_save->connect("confirmed", this, "_save_confirm_pressed");
+ confirm_save->connect("confirmed", callable_mp(this, &EditorFileDialog::_save_confirm_pressed));
remove_dialog = memnew(DependencyRemoveDialog);
add_child(remove_dialog);
@@ -1713,7 +1662,7 @@ EditorFileDialog::EditorFileDialog() {
makevb->add_margin_child(TTR("Name:"), makedirname);
add_child(makedialog);
makedialog->register_text_enter(makedirname);
- makedialog->connect("confirmed", this, "_make_dir_confirm");
+ makedialog->connect("confirmed", callable_mp(this, &EditorFileDialog::_make_dir_confirm));
mkdirerr = memnew(AcceptDialog);
mkdirerr->set_text(TTR("Could not create folder."));
add_child(mkdirerr);
@@ -1729,8 +1678,9 @@ EditorFileDialog::EditorFileDialog() {
vbox = vbc;
invalidated = true;
- if (register_func)
+ if (register_func) {
register_func(this);
+ }
preview_wheel_timeout = 0;
preview_wheel_index = 0;
@@ -1738,49 +1688,8 @@ EditorFileDialog::EditorFileDialog() {
}
EditorFileDialog::~EditorFileDialog() {
-
- if (unregister_func)
+ if (unregister_func) {
unregister_func(this);
+ }
memdelete(dir_access);
}
-
-void EditorLineEditFileChooser::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED)
- button->set_icon(get_icon("Folder", "EditorIcons"));
-}
-
-void EditorLineEditFileChooser::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_browse"), &EditorLineEditFileChooser::_browse);
- ClassDB::bind_method(D_METHOD("_chosen"), &EditorLineEditFileChooser::_chosen);
- ClassDB::bind_method(D_METHOD("get_button"), &EditorLineEditFileChooser::get_button);
- ClassDB::bind_method(D_METHOD("get_line_edit"), &EditorLineEditFileChooser::get_line_edit);
- ClassDB::bind_method(D_METHOD("get_file_dialog"), &EditorLineEditFileChooser::get_file_dialog);
-}
-
-void EditorLineEditFileChooser::_chosen(const String &p_text) {
-
- line_edit->set_text(p_text);
- line_edit->emit_signal("text_entered", p_text);
-}
-
-void EditorLineEditFileChooser::_browse() {
-
- dialog->popup_centered_ratio();
-}
-
-EditorLineEditFileChooser::EditorLineEditFileChooser() {
-
- line_edit = memnew(LineEdit);
- add_child(line_edit);
- line_edit->set_h_size_flags(SIZE_EXPAND_FILL);
- button = memnew(Button);
- add_child(button);
- button->connect("pressed", this, "_browse");
- dialog = memnew(EditorFileDialog);
- add_child(dialog);
- dialog->connect("file_selected", this, "_chosen");
- dialog->connect("dir_selected", this, "_chosen");
- dialog->connect("files_selected", this, "_chosen");
-}
diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h
index 6af261e8dd..df5b41ae1d 100644
--- a/editor/editor_file_dialog.h
+++ b/editor/editor_file_dialog.h
@@ -40,12 +40,10 @@
#include "scene/gui/separator.h"
#include "scene/gui/split_container.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class DependencyRemoveDialog;
class EditorFileDialog : public ConfirmationDialog {
-
GDCLASS(EditorFileDialog, ConfirmationDialog);
public:
@@ -60,15 +58,15 @@ public:
ACCESS_FILESYSTEM
};
- enum Mode {
- MODE_OPEN_FILE,
- MODE_OPEN_FILES,
- MODE_OPEN_DIR,
- MODE_OPEN_ANY,
- MODE_SAVE_FILE
+ enum FileMode {
+ FILE_MODE_OPEN_FILE,
+ FILE_MODE_OPEN_FILES,
+ FILE_MODE_OPEN_DIR,
+ FILE_MODE_OPEN_ANY,
+ FILE_MODE_SAVE_FILE
};
- typedef Ref<Texture> (*GetIconFunc)(const String &);
+ typedef Ref<Texture2D> (*GetIconFunc)(const String &);
typedef void (*RegisterFunc)(EditorFileDialog *);
static GetIconFunc get_icon_func;
@@ -92,14 +90,16 @@ private:
Access access;
//Button *action;
VBoxContainer *vbox;
- Mode mode;
+ FileMode mode;
bool can_create_dir;
LineEdit *dir;
- ToolButton *dir_prev;
- ToolButton *dir_next;
- ToolButton *dir_up;
+ Button *dir_prev;
+ Button *dir_next;
+ Button *dir_up;
+ HBoxContainer *drives_container;
+ HBoxContainer *shortcuts_container;
OptionButton *drives;
ItemList *item_list;
PopupMenu *item_menu;
@@ -115,15 +115,15 @@ private:
ConfirmationDialog *confirm_save;
DependencyRemoveDialog *remove_dialog;
- ToolButton *mode_thumbnails;
- ToolButton *mode_list;
+ Button *mode_thumbnails;
+ Button *mode_list;
- ToolButton *refresh;
- ToolButton *favorite;
- ToolButton *show_hidden;
+ Button *refresh;
+ Button *favorite;
+ Button *show_hidden;
- ToolButton *fav_up;
- ToolButton *fav_down;
+ Button *fav_up;
+ Button *fav_down;
ItemList *favorites;
ItemList *recent;
@@ -185,13 +185,13 @@ private:
void _go_back();
void _go_forward();
- virtual void _post_popup();
+ virtual void _post_popup() override;
void _save_to_recent();
- //callback function is callback(String p_path,Ref<Texture> preview,Variant udata) preview null if could not load
+ //callback function is callback(String p_path,Ref<Texture2D> preview,Variant udata) preview null if could not load
- void _thumbnail_result(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata);
- void _thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata);
+ void _thumbnail_result(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata);
+ void _thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata);
void _request_single_thumbnail(const String &p_path);
void _unhandled_input(const Ref<InputEvent> &p_event);
@@ -203,6 +203,7 @@ protected:
static void _bind_methods();
//bind helpers
public:
+ void popup_file_dialog();
void clear_filters();
void add_filter(const String &p_filter);
@@ -219,8 +220,8 @@ public:
void set_display_mode(DisplayMode p_mode);
DisplayMode get_display_mode() const;
- void set_mode(Mode p_mode);
- Mode get_mode() const;
+ void set_file_mode(FileMode p_mode);
+ FileMode get_file_mode() const;
VBoxContainer *get_vbox();
LineEdit *get_line_edit() { return file; }
@@ -243,29 +244,7 @@ public:
~EditorFileDialog();
};
-class EditorLineEditFileChooser : public HBoxContainer {
-
- GDCLASS(EditorLineEditFileChooser, HBoxContainer);
- Button *button;
- LineEdit *line_edit;
- EditorFileDialog *dialog;
-
- void _chosen(const String &p_text);
- void _browse();
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- Button *get_button() { return button; }
- LineEdit *get_line_edit() { return line_edit; }
- EditorFileDialog *get_file_dialog() { return dialog; }
-
- EditorLineEditFileChooser();
-};
-
-VARIANT_ENUM_CAST(EditorFileDialog::Mode);
+VARIANT_ENUM_CAST(EditorFileDialog::FileMode);
VARIANT_ENUM_CAST(EditorFileDialog::Access);
VARIANT_ENUM_CAST(EditorFileDialog::DisplayMode);
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
index 5abb3c4ec2..a5edcf5c22 100644
--- a/editor/editor_file_system.cpp
+++ b/editor/editor_file_system.cpp
@@ -41,58 +41,53 @@
#include "editor_resource_preview.h"
#include "editor_settings.h"
-EditorFileSystem *EditorFileSystem::singleton = NULL;
+EditorFileSystem *EditorFileSystem::singleton = nullptr;
//the name is the version, to keep compatibility with different versions of Godot
#define CACHE_FILE_NAME "filesystem_cache6"
void EditorFileSystemDirectory::sort_files() {
-
files.sort_custom<FileInfoSort>();
}
int EditorFileSystemDirectory::find_file_index(const String &p_file) const {
-
for (int i = 0; i < files.size(); i++) {
- if (files[i]->file == p_file)
+ if (files[i]->file == p_file) {
return i;
+ }
}
return -1;
}
-int EditorFileSystemDirectory::find_dir_index(const String &p_dir) const {
+int EditorFileSystemDirectory::find_dir_index(const String &p_dir) const {
for (int i = 0; i < subdirs.size(); i++) {
- if (subdirs[i]->name == p_dir)
+ if (subdirs[i]->name == p_dir) {
return i;
+ }
}
return -1;
}
int EditorFileSystemDirectory::get_subdir_count() const {
-
return subdirs.size();
}
EditorFileSystemDirectory *EditorFileSystemDirectory::get_subdir(int p_idx) {
-
- ERR_FAIL_INDEX_V(p_idx, subdirs.size(), NULL);
+ ERR_FAIL_INDEX_V(p_idx, subdirs.size(), nullptr);
return subdirs[p_idx];
}
int EditorFileSystemDirectory::get_file_count() const {
-
return files.size();
}
String EditorFileSystemDirectory::get_file(int p_idx) const {
-
ERR_FAIL_INDEX_V(p_idx, files.size(), "");
return files[p_idx]->file;
}
String EditorFileSystemDirectory::get_path() const {
-
String p;
const EditorFileSystemDirectory *d = this;
while (d->parent) {
@@ -104,7 +99,6 @@ String EditorFileSystemDirectory::get_path() const {
}
String EditorFileSystemDirectory::get_file_path(int p_idx) const {
-
String file = get_file(p_idx);
const EditorFileSystemDirectory *d = this;
while (d->parent) {
@@ -116,13 +110,11 @@ String EditorFileSystemDirectory::get_file_path(int p_idx) const {
}
Vector<String> EditorFileSystemDirectory::get_file_deps(int p_idx) const {
-
ERR_FAIL_INDEX_V(p_idx, files.size(), Vector<String>());
return files[p_idx]->deps;
}
bool EditorFileSystemDirectory::get_file_import_is_valid(int p_idx) const {
-
ERR_FAIL_INDEX_V(p_idx, files.size(), false);
return files[p_idx]->import_valid;
}
@@ -140,23 +132,19 @@ String EditorFileSystemDirectory::get_file_script_class_icon_path(int p_idx) con
}
StringName EditorFileSystemDirectory::get_file_type(int p_idx) const {
-
ERR_FAIL_INDEX_V(p_idx, files.size(), "");
return files[p_idx]->type;
}
String EditorFileSystemDirectory::get_name() {
-
return name;
}
EditorFileSystemDirectory *EditorFileSystemDirectory::get_parent() {
-
return parent;
}
void EditorFileSystemDirectory::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("get_subdir_count"), &EditorFileSystemDirectory::get_subdir_count);
ClassDB::bind_method(D_METHOD("get_subdir", "idx"), &EditorFileSystemDirectory::get_subdir);
ClassDB::bind_method(D_METHOD("get_file_count"), &EditorFileSystemDirectory::get_file_count);
@@ -174,27 +162,22 @@ void EditorFileSystemDirectory::_bind_methods() {
}
EditorFileSystemDirectory::EditorFileSystemDirectory() {
-
modified_time = 0;
- parent = NULL;
+ parent = nullptr;
verified = false;
}
EditorFileSystemDirectory::~EditorFileSystemDirectory() {
-
for (int i = 0; i < files.size(); i++) {
-
memdelete(files[i]);
}
for (int i = 0; i < subdirs.size(); i++) {
-
memdelete(subdirs[i]);
}
}
void EditorFileSystem::_scan_filesystem() {
-
ERR_FAIL_COND(!scanning || new_filesystem);
//read .fscache
@@ -212,7 +195,6 @@ void EditorFileSystem::_scan_filesystem() {
if (f) {
//read the disk cache
while (!f->eof_reached()) {
-
String l = f->get_line().strip_edges();
if (first) {
if (first_scan) {
@@ -229,8 +211,9 @@ void EditorFileSystem::_scan_filesystem() {
first = false;
continue;
}
- if (l == String())
+ if (l == String()) {
continue;
+ }
if (l.begins_with("::")) {
Vector<String> split = l.split("::");
@@ -250,9 +233,9 @@ void EditorFileSystem::_scan_filesystem() {
FileCache fc;
fc.type = split[1];
- fc.modification_time = split[2].to_int64();
- fc.import_modification_time = split[3].to_int64();
- fc.import_valid = split[4].to_int64() != 0;
+ fc.modification_time = split[2].to_int();
+ fc.import_modification_time = split[3].to_int();
+ fc.import_valid = split[4].to_int() != 0;
fc.import_group_file = split[5].strip_edges();
fc.script_class_name = split[6].get_slice("<>", 0);
fc.script_class_extends = split[6].get_slice("<>", 1);
@@ -282,7 +265,6 @@ void EditorFileSystem::_scan_filesystem() {
FileAccessRef f2 = FileAccess::open(update_cache, FileAccess::READ);
String l = f2->get_line().strip_edges();
while (l != String()) {
-
file_cache.erase(l); //erase cache for this, so it gets updated
l = f2->get_line().strip_edges();
}
@@ -300,7 +282,7 @@ void EditorFileSystem::_scan_filesystem() {
sp.progress = &scan_progress;
new_filesystem = memnew(EditorFileSystemDirectory);
- new_filesystem->parent = NULL;
+ new_filesystem->parent = nullptr;
DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
d->change_dir("res://");
@@ -319,7 +301,6 @@ void EditorFileSystem::_scan_filesystem() {
}
void EditorFileSystem::_save_filesystem_cache() {
-
group_file_cache.clear();
String fscache = EditorSettings::get_singleton()->get_project_settings_dir().plus_file(CACHE_FILE_NAME);
@@ -334,15 +315,14 @@ void EditorFileSystem::_save_filesystem_cache() {
}
void EditorFileSystem::_thread_func(void *_userdata) {
-
EditorFileSystem *sd = (EditorFileSystem *)_userdata;
sd->_scan_filesystem();
}
bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_imported_files) {
-
- if (!reimport_on_missing_imported_files && p_only_imported_files)
+ if (!reimport_on_missing_imported_files && p_only_imported_files) {
return false;
+ }
if (!FileAccess::exists(p_path + ".import")) {
return true;
@@ -378,16 +358,15 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo
String dest_md5 = "";
while (true) {
-
assign = Variant();
next_tag.fields.clear();
next_tag.name = String();
- err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, NULL, true);
+ err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, nullptr, true);
if (err == ERR_FILE_EOF) {
break;
} else if (err != OK) {
- ERR_PRINTS("ResourceFormatImporter::load - '" + p_path + ".import:" + itos(lines) + "' error '" + error_text + "'.");
+ ERR_PRINT("ResourceFormatImporter::load - '" + p_path + ".import:" + itos(lines) + "' error '" + error_text + "'.");
memdelete(f);
return false; //parse error, try reimport manually (Avoid reimport loop on broken file)
}
@@ -430,12 +409,12 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo
next_tag.fields.clear();
next_tag.name = String();
- err = VariantParser::parse_tag_assign_eof(&md5_stream, lines, error_text, next_tag, assign, value, NULL, true);
+ err = VariantParser::parse_tag_assign_eof(&md5_stream, lines, error_text, next_tag, assign, value, nullptr, true);
if (err == ERR_FILE_EOF) {
break;
} else if (err != OK) {
- ERR_PRINTS("ResourceFormatImporter::load - '" + p_path + ".import.md5:" + itos(lines) + "' error '" + error_text + "'.");
+ ERR_PRINT("ResourceFormatImporter::load - '" + p_path + ".import.md5:" + itos(lines) + "' error '" + error_text + "'.");
memdelete(md5s);
return false; // parse error
}
@@ -460,7 +439,6 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo
//check source md5 matching
if (!p_only_imported_files) {
-
if (source_file != String() && source_file != p_path) {
return true; //file was moved, reimport
}
@@ -486,7 +464,6 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo
}
bool EditorFileSystem::_update_scan_actions() {
-
sources_changed.clear();
bool fs_changed = false;
@@ -495,20 +472,17 @@ bool EditorFileSystem::_update_scan_actions() {
Vector<String> reloads;
for (List<ItemAction>::Element *E = scan_actions.front(); E; E = E->next()) {
-
ItemAction &ia = E->get();
switch (ia.action) {
case ItemAction::ACTION_NONE: {
-
} break;
case ItemAction::ACTION_DIR_ADD: {
-
int idx = 0;
for (int i = 0; i < ia.dir->subdirs.size(); i++) {
-
- if (ia.new_dir->name < ia.dir->subdirs[i]->name)
+ if (ia.new_dir->name < ia.dir->subdirs[i]->name) {
break;
+ }
idx++;
}
if (idx == ia.dir->subdirs.size()) {
@@ -520,19 +494,17 @@ bool EditorFileSystem::_update_scan_actions() {
fs_changed = true;
} break;
case ItemAction::ACTION_DIR_REMOVE: {
-
ERR_CONTINUE(!ia.dir->parent);
ia.dir->parent->subdirs.erase(ia.dir);
memdelete(ia.dir);
fs_changed = true;
} break;
case ItemAction::ACTION_FILE_ADD: {
-
int idx = 0;
for (int i = 0; i < ia.dir->files.size(); i++) {
-
- if (ia.new_file->file < ia.dir->files[i]->file)
+ if (ia.new_file->file < ia.dir->files[i]->file) {
break;
+ }
idx++;
}
if (idx == ia.dir->files.size()) {
@@ -545,7 +517,6 @@ bool EditorFileSystem::_update_scan_actions() {
} break;
case ItemAction::ACTION_FILE_REMOVE: {
-
int idx = ia.dir->find_file_index(ia.file);
ERR_CONTINUE(idx == -1);
_delete_internal_files(ia.dir->files[idx]->file);
@@ -556,13 +527,13 @@ bool EditorFileSystem::_update_scan_actions() {
} break;
case ItemAction::ACTION_FILE_TEST_REIMPORT: {
-
int idx = ia.dir->find_file_index(ia.file);
ERR_CONTINUE(idx == -1);
String full_path = ia.dir->get_file_path(idx);
if (_test_for_reimport(full_path, false)) {
//must reimport
reimports.push_back(full_path);
+ reimports.append_array(_get_dependencies(full_path));
} else {
//must not reimport, all was good
//update modified times, to avoid reimport
@@ -573,7 +544,6 @@ bool EditorFileSystem::_update_scan_actions() {
fs_changed = true;
} break;
case ItemAction::ACTION_FILE_RELOAD: {
-
int idx = ia.dir->find_file_index(ia.file);
ERR_CONTINUE(idx == -1);
String full_path = ia.dir->get_file_path(idx);
@@ -604,12 +574,13 @@ bool EditorFileSystem::_update_scan_actions() {
}
void EditorFileSystem::scan() {
-
- if (false /*&& bool(Globals::get_singleton()->get("debug/disable_scan"))*/)
+ if (false /*&& bool(Globals::get_singleton()->get("debug/disable_scan"))*/) {
return;
+ }
- if (scanning || scanning_changes || thread)
+ if (scanning || scanning_changes || thread) {
return;
+ }
_update_extensions();
@@ -618,11 +589,12 @@ void EditorFileSystem::scan() {
scanning = true;
scan_total = 0;
_scan_filesystem();
- if (filesystem)
+ if (filesystem) {
memdelete(filesystem);
+ }
//file_type_cache.clear();
filesystem = new_filesystem;
- new_filesystem = NULL;
+ new_filesystem = nullptr;
_update_scan_actions();
scanning = false;
emit_signal("filesystem_changed");
@@ -630,7 +602,6 @@ void EditorFileSystem::scan() {
_queue_update_script_classes();
first_scan = false;
} else {
-
ERR_FAIL_COND(thread);
set_process(true);
Thread::Settings s;
@@ -644,14 +615,12 @@ void EditorFileSystem::scan() {
}
void EditorFileSystem::ScanProgress::update(int p_current, int p_total) const {
-
float ratio = low + ((hi - low) / p_total) * p_current;
progress->step(ratio * 1000);
EditorFileSystem::singleton->scan_total = ratio;
}
EditorFileSystem::ScanProgress EditorFileSystem::ScanProgress::get_sub(int p_current, int p_total) const {
-
ScanProgress sp = *this;
float slice = (sp.hi - sp.low) / p_total;
sp.low += slice * p_current;
@@ -660,7 +629,6 @@ EditorFileSystem::ScanProgress EditorFileSystem::ScanProgress::get_sub(int p_cur
}
void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess *da, const ScanProgress &p_progress) {
-
List<String> dirs;
List<String> files;
@@ -670,25 +638,30 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
da->list_dir_begin();
while (true) {
-
String f = da->get_next();
- if (f == "")
+ if (f == "") {
break;
+ }
- if (da->current_is_dir()) {
+ if (da->current_is_hidden()) {
+ continue;
+ }
- if (f.begins_with(".")) //ignore hidden and . / ..
+ if (da->current_is_dir()) {
+ if (f.begins_with(".")) { // Ignore special and . / ..
continue;
+ }
- if (FileAccess::exists(cd.plus_file(f).plus_file("project.godot"))) // skip if another project inside this
+ if (FileAccess::exists(cd.plus_file(f).plus_file("project.godot"))) { // skip if another project inside this
continue;
- if (FileAccess::exists(cd.plus_file(f).plus_file(".gdignore"))) // skip if another project inside this
+ }
+ if (FileAccess::exists(cd.plus_file(f).plus_file(".gdignore"))) { // skip if another project inside this
continue;
+ }
dirs.push_back(f);
} else {
-
files.push_back(f);
}
}
@@ -702,15 +675,12 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
int idx = 0;
for (List<String>::Element *E = dirs.front(); E; E = E->next(), idx++) {
-
if (da->change_dir(E->get()) == OK) {
-
String d = da->get_current_dir();
if (d == cd || !d.begins_with(cd)) {
da->change_dir(cd); //avoid recursion
} else {
-
EditorFileSystemDirectory *efd = memnew(EditorFileSystemDirectory);
efd->parent = p_dir;
@@ -720,9 +690,9 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
int idx2 = 0;
for (int i = 0; i < p_dir->subdirs.size(); i++) {
-
- if (efd->name < p_dir->subdirs[i]->name)
+ if (efd->name < p_dir->subdirs[i]->name) {
break;
+ }
idx2++;
}
if (idx2 == p_dir->subdirs.size()) {
@@ -734,14 +704,13 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
da->change_dir("..");
}
} else {
- ERR_PRINTS("Cannot go into subdir '" + E->get() + "'.");
+ ERR_PRINT("Cannot go into subdir '" + E->get() + "'.");
}
p_progress.update(idx, total);
}
for (List<String>::Element *E = files.front(); E; E = E->next(), idx++) {
-
String ext = E->get().get_extension().to_lower();
if (!valid_extensions.has(ext)) {
continue; //invalid
@@ -756,7 +725,6 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
uint64_t mt = FileAccess::get_modified_time(path);
if (import_extensions.has(ext)) {
-
//is imported
uint64_t import_mt = 0;
if (FileAccess::exists(path + ".import")) {
@@ -764,7 +732,6 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
}
if (fc && fc->modification_time == mt && fc->import_modification_time == import_mt && !_test_for_reimport(path, true)) {
-
fi->type = fc->type;
fi->deps = fc->deps;
fi->modified_time = fc->modification_time;
@@ -792,7 +759,6 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
}
} else {
-
fi->type = ResourceFormatImporter::get_singleton()->get_resource_type(path);
fi->import_group_file = ResourceFormatImporter::get_singleton()->get_import_group_file(path);
fi->script_class_name = _get_global_script_class(fi->type, path, &fi->script_class_extends, &fi->script_class_icon_path);
@@ -807,7 +773,6 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
scan_actions.push_back(ia);
}
} else {
-
if (fc && fc->modification_time == mt) {
//not imported, so just update type if changed
fi->type = fc->type;
@@ -835,14 +800,12 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
}
void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const ScanProgress &p_progress) {
-
uint64_t current_mtime = FileAccess::get_modified_time(p_dir->get_path());
bool updated_dir = false;
String cd = p_dir->get_path();
if (current_mtime != p_dir->modified_time || using_fat32_or_exfat) {
-
updated_dir = true;
p_dir->modified_time = current_mtime;
//ooooops, dir changed, see what's going on
@@ -850,12 +813,10 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
//first mark everything as veryfied
for (int i = 0; i < p_dir->files.size(); i++) {
-
p_dir->files[i]->verified = false;
}
for (int i = 0; i < p_dir->subdirs.size(); i++) {
-
p_dir->get_subdir(i)->verified = false;
}
@@ -866,23 +827,28 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
da->change_dir(cd);
da->list_dir_begin();
while (true) {
-
String f = da->get_next();
- if (f == "")
+ if (f == "") {
break;
+ }
- if (da->current_is_dir()) {
+ if (da->current_is_hidden()) {
+ continue;
+ }
- if (f.begins_with(".")) //ignore hidden and . / ..
+ if (da->current_is_dir()) {
+ if (f.begins_with(".")) { // Ignore special and . / ..
continue;
+ }
int idx = p_dir->find_dir_index(f);
if (idx == -1) {
-
- if (FileAccess::exists(cd.plus_file(f).plus_file("project.godot"))) // skip if another project inside this
+ if (FileAccess::exists(cd.plus_file(f).plus_file("project.godot"))) { // skip if another project inside this
continue;
- if (FileAccess::exists(cd.plus_file(f).plus_file(".gdignore"))) // skip if another project inside this
+ }
+ if (FileAccess::exists(cd.plus_file(f).plus_file(".gdignore"))) { // skip if another project inside this
continue;
+ }
EditorFileSystemDirectory *efd = memnew(EditorFileSystemDirectory);
@@ -905,8 +871,9 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
} else {
String ext = f.get_extension().to_lower();
- if (!valid_extensions.has(ext))
+ if (!valid_extensions.has(ext)) {
continue; //invalid
+ }
int idx = p_dir->find_file_index(f);
@@ -952,7 +919,6 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
}
for (int i = 0; i < p_dir->files.size(); i++) {
-
if (updated_dir && !p_dir->files[i]->verified) {
//this file was removed, add action to remove it
ItemAction ia;
@@ -977,7 +943,6 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
} else if (!FileAccess::exists(path + ".import")) {
reimport = true; //no .import file, obviously reimport
} else {
-
uint64_t import_mt = FileAccess::get_modified_time(path + ".import");
if (import_mt != p_dir->files[i]->import_modified_time) {
reimport = true;
@@ -987,7 +952,6 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
}
if (reimport) {
-
ItemAction ia;
ia.action = ItemAction::ACTION_FILE_TEST_REIMPORT;
ia.dir = p_dir;
@@ -999,7 +963,6 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
uint64_t mt = FileAccess::get_modified_time(path);
if (mt != p_dir->files[i]->modified_time) {
-
p_dir->files[i]->modified_time = mt; //save new time, but test for reload
ItemAction ia;
@@ -1012,7 +975,6 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
}
for (int i = 0; i < p_dir->subdirs.size(); i++) {
-
if (updated_dir && !p_dir->subdirs[i]->verified) {
//this directory was removed, add action to remove it
ItemAction ia;
@@ -1039,7 +1001,6 @@ void EditorFileSystem::_delete_internal_files(String p_file) {
}
void EditorFileSystem::_thread_func_sources(void *_userdata) {
-
EditorFileSystem *efs = (EditorFileSystem *)_userdata;
if (efs->filesystem) {
EditorProgressBG pr("sources", TTR("ScanSources"), 1000);
@@ -1053,14 +1014,16 @@ void EditorFileSystem::_thread_func_sources(void *_userdata) {
}
void EditorFileSystem::get_changed_sources(List<String> *r_changed) {
-
*r_changed = sources_changed;
}
void EditorFileSystem::scan_changes() {
-
- if (scanning || scanning_changes || thread)
+ if (first_scan || // Prevent a premature changes scan from inhibiting the first full scan
+ scanning || scanning_changes || thread) {
+ scan_changes_pending = true;
+ set_process(true);
return;
+ }
_update_extensions();
sources_changed.clear();
@@ -1078,14 +1041,14 @@ void EditorFileSystem::scan_changes() {
sp.low = 0;
scan_total = 0;
_scan_fs_changes(filesystem, sp);
- if (_update_scan_actions())
+ if (_update_scan_actions()) {
emit_signal("filesystem_changed");
+ }
}
scanning_changes = false;
scanning_changes_done = true;
emit_signal("sources_changed", sources_changed.size() > 0);
} else {
-
ERR_FAIL_COND(thread_sources);
set_process(true);
scan_total = 0;
@@ -1096,110 +1059,110 @@ void EditorFileSystem::scan_changes() {
}
void EditorFileSystem::_notification(int p_what) {
-
switch (p_what) {
-
case NOTIFICATION_ENTER_TREE: {
-
call_deferred("scan"); //this should happen after every editor node entered the tree
} break;
case NOTIFICATION_EXIT_TREE: {
- if (use_threads && thread) {
+ Thread *active_thread = thread ? thread : thread_sources;
+ if (use_threads && active_thread) {
//abort thread if in progress
abort_scan = true;
while (scanning) {
OS::get_singleton()->delay_usec(1000);
}
- Thread::wait_to_finish(thread);
- memdelete(thread);
- thread = NULL;
- WARN_PRINTS("Scan thread aborted...");
+ Thread::wait_to_finish(active_thread);
+ memdelete(active_thread);
+ thread = nullptr;
+ thread_sources = nullptr;
+ WARN_PRINT("Scan thread aborted...");
set_process(false);
}
- if (filesystem)
+ if (filesystem) {
memdelete(filesystem);
- if (new_filesystem)
+ }
+ if (new_filesystem) {
memdelete(new_filesystem);
- filesystem = NULL;
- new_filesystem = NULL;
+ }
+ filesystem = nullptr;
+ new_filesystem = nullptr;
} break;
case NOTIFICATION_PROCESS: {
-
if (use_threads) {
-
if (scanning_changes) {
-
if (scanning_changes_done) {
-
scanning_changes = false;
set_process(false);
Thread::wait_to_finish(thread_sources);
memdelete(thread_sources);
- thread_sources = NULL;
- if (_update_scan_actions())
+ thread_sources = nullptr;
+ if (_update_scan_actions()) {
emit_signal("filesystem_changed");
+ }
emit_signal("sources_changed", sources_changed.size() > 0);
_queue_update_script_classes();
first_scan = false;
}
- } else if (!scanning) {
-
+ } else if (!scanning && thread) {
set_process(false);
- if (filesystem)
+ if (filesystem) {
memdelete(filesystem);
+ }
filesystem = new_filesystem;
- new_filesystem = NULL;
+ new_filesystem = nullptr;
Thread::wait_to_finish(thread);
memdelete(thread);
- thread = NULL;
+ thread = nullptr;
_update_scan_actions();
emit_signal("filesystem_changed");
emit_signal("sources_changed", sources_changed.size() > 0);
_queue_update_script_classes();
first_scan = false;
}
+
+ if (!is_processing() && scan_changes_pending) {
+ scan_changes_pending = false;
+ scan_changes();
+ }
}
} break;
}
}
bool EditorFileSystem::is_scanning() const {
-
return scanning || scanning_changes;
}
-float EditorFileSystem::get_scanning_progress() const {
+float EditorFileSystem::get_scanning_progress() const {
return scan_total;
}
EditorFileSystemDirectory *EditorFileSystem::get_filesystem() {
-
return filesystem;
}
void EditorFileSystem::_save_filesystem_cache(EditorFileSystemDirectory *p_dir, FileAccess *p_file) {
-
- if (!p_dir)
+ if (!p_dir) {
return; //none
+ }
p_file->store_line("::" + p_dir->get_path() + "::" + String::num(p_dir->modified_time));
for (int i = 0; i < p_dir->files.size(); i++) {
-
if (p_dir->files[i]->import_group_file != String()) {
group_file_cache.insert(p_dir->files[i]->import_group_file);
}
String s = p_dir->files[i]->file + "::" + p_dir->files[i]->type + "::" + itos(p_dir->files[i]->modified_time) + "::" + itos(p_dir->files[i]->import_modified_time) + "::" + itos(p_dir->files[i]->import_valid) + "::" + p_dir->files[i]->import_group_file + "::" + p_dir->files[i]->script_class_name + "<>" + p_dir->files[i]->script_class_extends + "<>" + p_dir->files[i]->script_class_icon_path;
s += "::";
for (int j = 0; j < p_dir->files[i]->deps.size(); j++) {
-
- if (j > 0)
+ if (j > 0) {
s += "<>";
+ }
s += p_dir->files[i]->deps[j];
}
@@ -1207,7 +1170,6 @@ void EditorFileSystem::_save_filesystem_cache(EditorFileSystemDirectory *p_dir,
}
for (int i = 0; i < p_dir->subdirs.size(); i++) {
-
_save_filesystem_cache(p_dir->subdirs[i], p_file);
}
}
@@ -1215,33 +1177,35 @@ void EditorFileSystem::_save_filesystem_cache(EditorFileSystemDirectory *p_dir,
bool EditorFileSystem::_find_file(const String &p_file, EditorFileSystemDirectory **r_d, int &r_file_pos) const {
//todo make faster
- if (!filesystem || scanning)
+ if (!filesystem || scanning) {
return false;
+ }
String f = ProjectSettings::get_singleton()->localize_path(p_file);
- if (!f.begins_with("res://"))
+ if (!f.begins_with("res://")) {
return false;
+ }
f = f.substr(6, f.length());
f = f.replace("\\", "/");
Vector<String> path = f.split("/");
- if (path.size() == 0)
+ if (path.size() == 0) {
return false;
+ }
String file = path[path.size() - 1];
path.resize(path.size() - 1);
EditorFileSystemDirectory *fs = filesystem;
for (int i = 0; i < path.size(); i++) {
-
- if (path[i].begins_with("."))
+ if (path[i].begins_with(".")) {
return false;
+ }
int idx = -1;
for (int j = 0; j < fs->get_subdir_count(); j++) {
-
if (fs->get_subdir(j)->get_name() == path[i]) {
idx = j;
break;
@@ -1257,26 +1221,25 @@ bool EditorFileSystem::_find_file(const String &p_file, EditorFileSystemDirector
int idx2 = 0;
for (int j = 0; j < fs->get_subdir_count(); j++) {
-
- if (efsd->name < fs->get_subdir(j)->get_name())
+ if (efsd->name < fs->get_subdir(j)->get_name()) {
break;
+ }
idx2++;
}
- if (idx2 == fs->get_subdir_count())
+ if (idx2 == fs->get_subdir_count()) {
fs->subdirs.push_back(efsd);
- else
+ } else {
fs->subdirs.insert(idx2, efsd);
+ }
fs = efsd;
} else {
-
fs = fs->get_subdir(idx);
}
}
int cpos = -1;
for (int i = 0; i < fs->files.size(); i++) {
-
if (fs->files[i]->file == file) {
cpos = i;
break;
@@ -1290,12 +1253,10 @@ bool EditorFileSystem::_find_file(const String &p_file, EditorFileSystemDirector
}
String EditorFileSystem::get_file_type(const String &p_file) const {
-
- EditorFileSystemDirectory *fs = NULL;
+ EditorFileSystemDirectory *fs = nullptr;
int cpos = -1;
if (!_find_file(p_file, &fs, cpos)) {
-
return "";
}
@@ -1303,53 +1264,55 @@ String EditorFileSystem::get_file_type(const String &p_file) const {
}
EditorFileSystemDirectory *EditorFileSystem::find_file(const String &p_file, int *r_index) const {
+ if (!filesystem || scanning) {
+ return nullptr;
+ }
- if (!filesystem || scanning)
- return NULL;
-
- EditorFileSystemDirectory *fs = NULL;
+ EditorFileSystemDirectory *fs = nullptr;
int cpos = -1;
if (!_find_file(p_file, &fs, cpos)) {
-
- return NULL;
+ return nullptr;
}
- if (r_index)
+ if (r_index) {
*r_index = cpos;
+ }
return fs;
}
EditorFileSystemDirectory *EditorFileSystem::get_filesystem_path(const String &p_path) {
-
- if (!filesystem || scanning)
- return NULL;
+ if (!filesystem || scanning) {
+ return nullptr;
+ }
String f = ProjectSettings::get_singleton()->localize_path(p_path);
- if (!f.begins_with("res://"))
- return NULL;
+ if (!f.begins_with("res://")) {
+ return nullptr;
+ }
f = f.substr(6, f.length());
f = f.replace("\\", "/");
- if (f == String())
+ if (f == String()) {
return filesystem;
+ }
- if (f.ends_with("/"))
+ if (f.ends_with("/")) {
f = f.substr(0, f.length() - 1);
+ }
Vector<String> path = f.split("/");
- if (path.size() == 0)
- return NULL;
+ if (path.size() == 0) {
+ return nullptr;
+ }
EditorFileSystemDirectory *fs = filesystem;
for (int i = 0; i < path.size(); i++) {
-
int idx = -1;
for (int j = 0; j < fs->get_subdir_count(); j++) {
-
if (fs->get_subdir(j)->get_name() == path[i]) {
idx = j;
break;
@@ -1357,9 +1320,8 @@ EditorFileSystemDirectory *EditorFileSystem::get_filesystem_path(const String &p
}
if (idx == -1) {
- return NULL;
+ return nullptr;
} else {
-
fs = fs->get_subdir(idx);
}
}
@@ -1378,7 +1340,6 @@ void EditorFileSystem::_save_late_updated_files() {
}
Vector<String> EditorFileSystem::_get_dependencies(const String &p_path) {
-
List<String> deps;
ResourceLoader::get_dependencies(p_path, &deps);
@@ -1391,7 +1352,6 @@ Vector<String> EditorFileSystem::_get_dependencies(const String &p_path) {
}
String EditorFileSystem::_get_global_script_class(const String &p_type, const String &p_path, String *r_extends, String *r_icon_path) const {
-
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
if (ScriptServer::get_language(i)->handles_global_class_type(p_type)) {
String global_name;
@@ -1433,9 +1393,9 @@ void EditorFileSystem::_scan_script_classes(EditorFileSystemDirectory *p_dir) {
}
void EditorFileSystem::update_script_classes() {
-
- if (!update_script_classes_queued)
+ if (!update_script_classes_queued) {
return;
+ }
update_script_classes_queued = false;
ScriptServer::global_classes_clear();
@@ -1465,14 +1425,13 @@ void EditorFileSystem::_queue_update_script_classes() {
}
void EditorFileSystem::update_file(const String &p_file) {
-
- EditorFileSystemDirectory *fs = NULL;
+ EditorFileSystemDirectory *fs = nullptr;
int cpos = -1;
if (!_find_file(p_file, &fs, cpos)) {
-
- if (!fs)
+ if (!fs) {
return;
+ }
}
if (!FileAccess::exists(p_file)) {
@@ -1491,15 +1450,15 @@ void EditorFileSystem::update_file(const String &p_file) {
String type = ResourceLoader::get_resource_type(p_file);
if (cpos == -1) {
-
//the file did not exist, it was added
late_added_files.insert(p_file); //remember that it was added. This mean it will be scanned and imported on editor restart
int idx = 0;
for (int i = 0; i < fs->files.size(); i++) {
- if (p_file < fs->files[i]->file)
+ if (p_file < fs->files[i]->file) {
break;
+ }
idx++;
}
@@ -1511,12 +1470,10 @@ void EditorFileSystem::update_file(const String &p_file) {
if (idx == fs->files.size()) {
fs->files.push_back(fi);
} else {
-
fs->files.insert(idx, fi);
}
cpos = idx;
} else {
-
//the file exists and it was updated, and was not added in this step.
//this means we must force upon next restart to scan it again, to get proper type and dependencies
late_update_files.insert(p_file);
@@ -1538,13 +1495,11 @@ void EditorFileSystem::update_file(const String &p_file) {
}
Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector<String> &p_files) {
-
String importer_name;
- Map<String, Map<StringName, Variant> > source_file_options;
+ Map<String, Map<StringName, Variant>> source_file_options;
Map<String, String> base_paths;
for (int i = 0; i < p_files.size(); i++) {
-
Ref<ConfigFile> config;
config.instance();
Error err = config->load(p_files[i] + ".import");
@@ -1568,7 +1523,6 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
importer->get_import_options(&options);
//set default values
for (List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) {
-
source_file_options[p_files[i]][E->get().option.name] = E->get().default_value;
}
@@ -1593,8 +1547,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
Error err = importer->import_group_file(p_group_file, source_file_options, base_paths);
//all went well, overwrite config files with proper remaps and md5s
- for (Map<String, Map<StringName, Variant> >::Element *E = source_file_options.front(); E; E = E->next()) {
-
+ for (Map<String, Map<StringName, Variant>>::Element *E = source_file_options.front(); E; E = E->next()) {
const String &file = E->key();
String base_path = ResourceFormatImporter::get_singleton()->get_import_base_path(file);
FileAccessRef f = FileAccess::open(file + ".import", FileAccess::WRITE);
@@ -1644,7 +1597,6 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
importer->get_import_options(&options);
//set default values
for (List<ResourceImporter::ImportOption>::Element *F = options.front(); F; F = F->next()) {
-
String base = F->get().option.name;
Variant v = F->get().default_value;
if (source_file_options[file].has(base)) {
@@ -1667,7 +1619,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
}
md5s->close();
- EditorFileSystemDirectory *fs = NULL;
+ EditorFileSystemDirectory *fs = nullptr;
int cpos = -1;
bool found = _find_file(file, &fs, cpos);
ERR_FAIL_COND_V_MSG(!found, ERR_UNCONFIGURED, "Can't find file '" + file + "'.");
@@ -1682,11 +1634,9 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
//if file is currently up, maybe the source it was loaded from changed, so import math must be updated for it
//to reload properly
if (ResourceCache::has(file)) {
-
Resource *r = ResourceCache::get(file);
if (r->get_import_path() != String()) {
-
String dst_path = ResourceFormatImporter::get_singleton()->get_internal_resource_path(file);
r->set_import_path(dst_path);
r->set_import_last_modified_time(0);
@@ -1700,8 +1650,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector
}
void EditorFileSystem::_reimport_file(const String &p_file) {
-
- EditorFileSystemDirectory *fs = NULL;
+ EditorFileSystemDirectory *fs = nullptr;
int cpos = -1;
bool found = _find_file(p_file, &fs, cpos);
ERR_FAIL_COND_MSG(!found, "Can't find file '" + p_file + "'.");
@@ -1780,7 +1729,7 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
Error err = importer->import(p_file, base_path, params, &import_variants, &gen_files, &metadata);
if (err != OK) {
- ERR_PRINTS("Error importing '" + p_file + "'.");
+ ERR_PRINT("Error importing '" + p_file + "'.");
}
//as import is complete, save the .import file
@@ -1799,13 +1748,11 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
Vector<String> dest_paths;
if (err == OK) {
-
if (importer->get_save_extension() == "") {
//no path
} else if (import_variants.size()) {
//import with variants
for (List<String>::Element *E = import_variants.front(); E; E = E->next()) {
-
String path = base_path.c_escape() + "." + E->get() + "." + importer->get_save_extension();
f->store_line("path." + E->get() + "=\"" + path + "\"");
@@ -1818,7 +1765,6 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
}
} else {
-
f->store_line("valid=false");
}
@@ -1859,7 +1805,6 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
//store options in provided order, to avoid file changing. Order is also important because first match is accepted first.
for (List<ResourceImporter::ImportOption>::Element *E = opts.front(); E; E = E->next()) {
-
String base = E->get().option.name;
String value;
VariantWriter::write_to_string(params[base], value);
@@ -1890,11 +1835,9 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
//if file is currently up, maybe the source it was loaded from changed, so import math must be updated for it
//to reload properly
if (ResourceCache::has(p_file)) {
-
Resource *r = ResourceCache::get(p_file);
if (r->get_import_path() != String()) {
-
String dst_path = ResourceFormatImporter::get_singleton()->get_internal_resource_path(p_file);
r->set_import_path(dst_path);
r->set_import_last_modified_time(0);
@@ -1904,8 +1847,7 @@ void EditorFileSystem::_reimport_file(const String &p_file) {
EditorResourcePreview::get_singleton()->check_for_invalidation(p_file);
}
-void EditorFileSystem::_find_group_files(EditorFileSystemDirectory *efd, Map<String, Vector<String> > &group_files, Set<String> &groups_to_reimport) {
-
+void EditorFileSystem::_find_group_files(EditorFileSystemDirectory *efd, Map<String, Vector<String>> &group_files, Set<String> &groups_to_reimport) {
int fc = efd->files.size();
const EditorFileSystemDirectory::FileInfo *const *files = efd->files.ptr();
for (int i = 0; i < fc; i++) {
@@ -1923,7 +1865,6 @@ void EditorFileSystem::_find_group_files(EditorFileSystemDirectory *efd, Map<Str
}
void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
-
{ //check that .import folder exists
DirAccess *da = DirAccess::open("res://");
if (da->change_dir(".import") != OK) {
@@ -1943,7 +1884,6 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
Set<String> groups_to_reimport;
for (int i = 0; i < p_files.size(); i++) {
-
String group_file = ResourceFormatImporter::get_singleton()->get_import_group_file(p_files[i]);
if (group_file_cache.has(p_files[i])) {
@@ -1963,10 +1903,9 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
}
//group may have changed, so also update group reference
- EditorFileSystemDirectory *fs = NULL;
+ EditorFileSystemDirectory *fs = nullptr;
int cpos = -1;
if (_find_file(p_files[i], &fs, cpos)) {
-
fs->files.write[cpos]->import_group_file = group_file;
}
}
@@ -1981,10 +1920,9 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
//reimport groups
if (groups_to_reimport.size()) {
- Map<String, Vector<String> > group_files;
+ Map<String, Vector<String>> group_files;
_find_group_files(filesystem, group_files, groups_to_reimport);
- for (Map<String, Vector<String> >::Element *E = group_files.front(); E; E = E->next()) {
-
+ for (Map<String, Vector<String>>::Element *E = group_files.front(); E; E = E->next()) {
Error err = _reimport_group(E->key(), E->get());
if (err == OK) {
_reimport_file(E->key());
@@ -2002,7 +1940,6 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
}
Error EditorFileSystem::_resource_import(const String &p_path) {
-
Vector<String> files;
files.push_back(p_path);
@@ -2017,13 +1954,10 @@ bool EditorFileSystem::is_group_file(const String &p_path) const {
}
void EditorFileSystem::_move_group_files(EditorFileSystemDirectory *efd, const String &p_group_file, const String &p_new_location) {
-
int fc = efd->files.size();
EditorFileSystemDirectory::FileInfo *const *files = efd->files.ptrw();
for (int i = 0; i < fc; i++) {
-
if (files[i]->import_group_file == p_group_file) {
-
files[i]->import_group_file = p_new_location;
Ref<ConfigFile> config;
@@ -2034,7 +1968,6 @@ void EditorFileSystem::_move_group_files(EditorFileSystemDirectory *efd, const S
continue;
}
if (config->has_section_key("remap", "group_file")) {
-
config->set_value("remap", "group_file", p_new_location);
}
@@ -2059,7 +1992,6 @@ void EditorFileSystem::_move_group_files(EditorFileSystemDirectory *efd, const S
}
void EditorFileSystem::move_group_file(const String &p_path, const String &p_new_path) {
-
if (get_filesystem()) {
_move_group_files(get_filesystem(), p_path, p_new_path);
if (group_file_cache.has(p_path)) {
@@ -2070,7 +2002,6 @@ void EditorFileSystem::move_group_file(const String &p_path, const String &p_new
}
void EditorFileSystem::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("get_filesystem"), &EditorFileSystem::get_filesystem);
ClassDB::bind_method(D_METHOD("is_scanning"), &EditorFileSystem::is_scanning);
ClassDB::bind_method(D_METHOD("get_scanning_progress"), &EditorFileSystem::get_scanning_progress);
@@ -2083,45 +2014,41 @@ void EditorFileSystem::_bind_methods() {
ADD_SIGNAL(MethodInfo("filesystem_changed"));
ADD_SIGNAL(MethodInfo("sources_changed", PropertyInfo(Variant::BOOL, "exist")));
- ADD_SIGNAL(MethodInfo("resources_reimported", PropertyInfo(Variant::POOL_STRING_ARRAY, "resources")));
- ADD_SIGNAL(MethodInfo("resources_reload", PropertyInfo(Variant::POOL_STRING_ARRAY, "resources")));
+ ADD_SIGNAL(MethodInfo("resources_reimported", PropertyInfo(Variant::PACKED_STRING_ARRAY, "resources")));
+ ADD_SIGNAL(MethodInfo("resources_reload", PropertyInfo(Variant::PACKED_STRING_ARRAY, "resources")));
}
void EditorFileSystem::_update_extensions() {
-
valid_extensions.clear();
import_extensions.clear();
List<String> extensionsl;
ResourceLoader::get_recognized_extensions_for_type("", &extensionsl);
for (List<String>::Element *E = extensionsl.front(); E; E = E->next()) {
-
valid_extensions.insert(E->get());
}
extensionsl.clear();
ResourceFormatImporter::get_singleton()->get_recognized_extensions(&extensionsl);
for (List<String>::Element *E = extensionsl.front(); E; E = E->next()) {
-
import_extensions.insert(E->get());
}
}
EditorFileSystem::EditorFileSystem() {
-
ResourceLoader::import = _resource_import;
reimport_on_missing_imported_files = GLOBAL_DEF("editor/reimport_missing_imported_files", true);
singleton = this;
filesystem = memnew(EditorFileSystemDirectory); //like, empty
- filesystem->parent = NULL;
+ filesystem->parent = nullptr;
- thread = NULL;
+ thread = nullptr;
scanning = false;
importing = false;
use_threads = true;
- thread_sources = NULL;
- new_filesystem = NULL;
+ thread_sources = nullptr;
+ new_filesystem = nullptr;
abort_scan = false;
scanning_changes = false;
@@ -2138,6 +2065,7 @@ EditorFileSystem::EditorFileSystem() {
scan_total = 0;
update_script_classes_queued = false;
first_scan = true;
+ scan_changes_pending = false;
revalidate_import_files = false;
}
diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h
index ce9936f983..da27a63c64 100644
--- a/editor/editor_file_system.h
+++ b/editor/editor_file_system.h
@@ -40,7 +40,6 @@ class FileAccess;
struct EditorProgressBG;
class EditorFileSystemDirectory : public Object {
-
GDCLASS(EditorFileSystemDirectory, Object);
String name;
@@ -104,13 +103,11 @@ public:
};
class EditorFileSystem : public Node {
-
GDCLASS(EditorFileSystem, Node);
_THREAD_SAFE_CLASS_
struct ItemAction {
-
enum Action {
ACTION_NONE,
ACTION_DIR_ADD,
@@ -129,9 +126,9 @@ class EditorFileSystem : public Node {
ItemAction() {
action = ACTION_NONE;
- dir = NULL;
- new_dir = NULL;
- new_file = NULL;
+ dir = nullptr;
+ new_dir = nullptr;
+ new_file = nullptr;
}
};
@@ -145,6 +142,7 @@ class EditorFileSystem : public Node {
bool scanning;
bool importing;
bool first_scan;
+ bool scan_changes_pending;
float scan_total;
String filesystem_settings_version_for_import;
bool revalidate_import_files;
@@ -162,7 +160,6 @@ class EditorFileSystem : public Node {
/* Used for reading the filesystem cache file */
struct FileCache {
-
String type;
uint64_t modification_time;
uint64_t import_modification_time;
@@ -177,7 +174,6 @@ class EditorFileSystem : public Node {
HashMap<String, FileCache> file_cache;
struct ScanProgress {
-
float low;
float hi;
mutable EditorProgressBG *progress;
@@ -239,7 +235,7 @@ class EditorFileSystem : public Node {
bool using_fat32_or_exfat; // Workaround for projects in FAT32 or exFAT filesystem (pendrives, most of the time)
- void _find_group_files(EditorFileSystemDirectory *efd, Map<String, Vector<String> > &group_files, Set<String> &groups_to_reimport);
+ void _find_group_files(EditorFileSystemDirectory *efd, Map<String, Vector<String>> &group_files, Set<String> &groups_to_reimport);
void _move_group_files(EditorFileSystemDirectory *efd, const String &p_group_file, const String &p_new_location);
diff --git a/editor/editor_folding.cpp b/editor/editor_folding.cpp
index 475f16f12f..a7e76e9b2b 100644
--- a/editor/editor_folding.cpp
+++ b/editor/editor_folding.cpp
@@ -34,12 +34,11 @@
#include "editor_inspector.h"
#include "editor_settings.h"
-PoolVector<String> EditorFolding::_get_unfolds(const Object *p_object) {
-
- PoolVector<String> sections;
+Vector<String> EditorFolding::_get_unfolds(const Object *p_object) {
+ Vector<String> sections;
sections.resize(p_object->editor_get_section_folding().size());
if (sections.size()) {
- PoolVector<String>::Write w = sections.write();
+ String *w = sections.ptrw();
int idx = 0;
for (const Set<String>::Element *E = p_object->editor_get_section_folding().front(); E; E = E->next()) {
w[idx++] = E->get();
@@ -52,7 +51,7 @@ PoolVector<String> EditorFolding::_get_unfolds(const Object *p_object) {
void EditorFolding::save_resource_folding(const RES &p_resource, const String &p_path) {
Ref<ConfigFile> config;
config.instance();
- PoolVector<String> unfolds = _get_unfolds(p_resource.ptr());
+ Vector<String> unfolds = _get_unfolds(p_resource.ptr());
config->set_value("folding", "sections_unfolded", unfolds);
String file = p_path.get_file() + "-folding-" + p_path.md5_text() + ".cfg";
@@ -60,10 +59,9 @@ void EditorFolding::save_resource_folding(const RES &p_resource, const String &p
config->save(file);
}
-void EditorFolding::_set_unfolds(Object *p_object, const PoolVector<String> &p_unfolds) {
-
+void EditorFolding::_set_unfolds(Object *p_object, const Vector<String> &p_unfolds) {
int uc = p_unfolds.size();
- PoolVector<String>::Read r = p_unfolds.read();
+ const String *r = p_unfolds.ptr();
p_object->editor_clear_section_folding();
for (int i = 0; i < uc; i++) {
p_object->editor_set_section_unfold(r[i], true);
@@ -71,7 +69,6 @@ void EditorFolding::_set_unfolds(Object *p_object, const PoolVector<String> &p_u
}
void EditorFolding::load_resource_folding(RES p_resource, const String &p_path) {
-
Ref<ConfigFile> config;
config.instance();
@@ -82,7 +79,7 @@ void EditorFolding::load_resource_folding(RES p_resource, const String &p_path)
return;
}
- PoolVector<String> unfolds;
+ Vector<String> unfolds;
if (config->has_section_key("folding", "sections_unfolded")) {
unfolds = config->get_value("folding", "sections_unfolded");
@@ -103,7 +100,7 @@ void EditorFolding::_fill_folds(const Node *p_root, const Node *p_node, Array &p
if (p_node->is_displayed_folded()) {
nodes_folded.push_back(p_root->get_path_to(p_node));
}
- PoolVector<String> unfolds = _get_unfolds(p_node);
+ Vector<String> unfolds = _get_unfolds(p_node);
if (unfolds.size()) {
p_folds.push_back(p_root->get_path_to(p_node));
@@ -117,8 +114,7 @@ void EditorFolding::_fill_folds(const Node *p_root, const Node *p_node, Array &p
if (E->get().type == Variant::OBJECT) {
RES res = p_node->get(E->get().name);
if (res.is_valid() && !resources.has(res) && res->get_path() != String() && !res->get_path().is_resource_file()) {
-
- PoolVector<String> res_unfolds = _get_unfolds(res.ptr());
+ Vector<String> res_unfolds = _get_unfolds(res.ptr());
resource_folds.push_back(res->get_path());
resource_folds.push_back(res_unfolds);
resources.insert(res);
@@ -131,11 +127,14 @@ void EditorFolding::_fill_folds(const Node *p_root, const Node *p_node, Array &p
_fill_folds(p_root, p_node->get_child(i), p_folds, resource_folds, nodes_folded, resources);
}
}
+
void EditorFolding::save_scene_folding(const Node *p_scene, const String &p_path) {
+ ERR_FAIL_NULL(p_scene);
FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES);
- if (!file_check->file_exists(p_path)) //This can happen when creating scene from FilesystemDock. It has path, but no file.
+ if (!file_check->file_exists(p_path)) { //This can happen when creating scene from FilesystemDock. It has path, but no file.
return;
+ }
Ref<ConfigFile> config;
config.instance();
@@ -153,8 +152,8 @@ void EditorFolding::save_scene_folding(const Node *p_scene, const String &p_path
file = EditorSettings::get_singleton()->get_project_settings_dir().plus_file(file);
config->save(file);
}
-void EditorFolding::load_scene_folding(Node *p_scene, const String &p_path) {
+void EditorFolding::load_scene_folding(Node *p_scene, const String &p_path) {
Ref<ConfigFile> config;
config.instance();
@@ -184,7 +183,7 @@ void EditorFolding::load_scene_folding(Node *p_scene, const String &p_path) {
for (int i = 0; i < unfolds.size(); i += 2) {
NodePath path2 = unfolds[i];
- PoolVector<String> un = unfolds[i + 1];
+ Vector<String> un = unfolds[i + 1];
Node *node = p_scene->get_node_or_null(path2);
if (!node) {
continue;
@@ -202,7 +201,7 @@ void EditorFolding::load_scene_folding(Node *p_scene, const String &p_path) {
continue;
}
- PoolVector<String> unfolds2 = res_unfolds[i + 1];
+ Vector<String> unfolds2 = res_unfolds[i + 1];
_set_unfolds(res.ptr(), unfolds2);
}
@@ -216,14 +215,12 @@ void EditorFolding::load_scene_folding(Node *p_scene, const String &p_path) {
}
bool EditorFolding::has_folding_data(const String &p_path) {
-
String file = p_path.get_file() + "-folding-" + p_path.md5_text() + ".cfg";
file = EditorSettings::get_singleton()->get_project_settings_dir().plus_file(file);
return FileAccess::exists(file);
}
void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) {
-
List<PropertyInfo> plist;
p_object->get_property_list(&plist);
String group_base;
@@ -232,7 +229,6 @@ void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) {
Set<String> unfold_group;
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
-
if (E->get().usage & PROPERTY_USAGE_CATEGORY) {
group = "";
group_base = "";
@@ -247,7 +243,6 @@ void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) {
//can unfold
if (E->get().usage & PROPERTY_USAGE_EDITOR) {
-
if (group != "") { //group
if (group_base == String() || E->get().name.begins_with(group_base)) {
bool can_revert = EditorPropertyRevert::can_property_revert(p_object, E->get().name);
@@ -256,7 +251,7 @@ void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) {
}
}
} else { //path
- int last = E->get().name.find_last("/");
+ int last = E->get().name.rfind("/");
if (last != -1) {
bool can_revert = EditorPropertyRevert::can_property_revert(p_object, E->get().name);
if (can_revert) {
@@ -269,7 +264,6 @@ void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) {
if (E->get().type == Variant::OBJECT) {
RES res = p_object->get(E->get().name);
if (res.is_valid() && !resources.has(res) && res->get_path() != String() && !res->get_path().is_resource_file()) {
-
resources.insert(res);
_do_object_unfolds(res.ptr(), resources);
}
@@ -299,7 +293,6 @@ void EditorFolding::_do_node_unfolds(Node *p_root, Node *p_node, Set<RES> &resou
}
void EditorFolding::unfold_scene(Node *p_scene) {
-
Set<RES> resources;
_do_node_unfolds(p_scene, p_scene, resources);
}
diff --git a/editor/editor_folding.h b/editor/editor_folding.h
index cc49b062d0..13f07b99b0 100644
--- a/editor/editor_folding.h
+++ b/editor/editor_folding.h
@@ -34,9 +34,8 @@
#include "scene/main/node.h"
class EditorFolding {
-
- PoolVector<String> _get_unfolds(const Object *p_object);
- void _set_unfolds(Object *p_object, const PoolVector<String> &p_unfolds);
+ Vector<String> _get_unfolds(const Object *p_object);
+ void _set_unfolds(Object *p_object, const Vector<String> &p_unfolds);
void _fill_folds(const Node *p_root, const Node *p_node, Array &p_folds, Array &resource_folds, Array &nodes_folded, Set<RES> &resources);
diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp
index db2f9c53d9..100c76c32b 100644
--- a/editor/editor_fonts.cpp
+++ b/editor/editor_fonts.cpp
@@ -231,7 +231,7 @@ void editor_register_fonts(Ref<Theme> p_theme) {
// Default font
MAKE_DEFAULT_FONT(df, default_font_size);
- p_theme->set_default_theme_font(df);
+ p_theme->set_default_font(df); // Default theme font
p_theme->set_font("main", "EditorFonts", df);
// Bold font
@@ -247,15 +247,21 @@ void editor_register_fonts(Ref<Theme> p_theme) {
MAKE_BOLD_FONT(df_doc_bold, int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE);
MAKE_BOLD_FONT(df_doc_title, int(EDITOR_GET("text_editor/help/help_title_font_size")) * EDSCALE);
MAKE_SOURCE_FONT(df_doc_code, int(EDITOR_GET("text_editor/help/help_source_font_size")) * EDSCALE);
+ MAKE_SOURCE_FONT(df_doc_kbd, (int(EDITOR_GET("text_editor/help/help_source_font_size")) - 1) * EDSCALE);
p_theme->set_font("doc", "EditorFonts", df_doc);
p_theme->set_font("doc_bold", "EditorFonts", df_doc_bold);
p_theme->set_font("doc_title", "EditorFonts", df_doc_title);
p_theme->set_font("doc_source", "EditorFonts", df_doc_code);
+ p_theme->set_font("doc_keyboard", "EditorFonts", df_doc_kbd);
// Ruler font
MAKE_DEFAULT_FONT(df_rulers, 8 * EDSCALE);
p_theme->set_font("rulers", "EditorFonts", df_rulers);
+ // Rotation widget font
+ MAKE_DEFAULT_FONT(df_rotation_control, 14 * EDSCALE);
+ p_theme->set_font("rotation_control", "EditorFonts", df_rotation_control);
+
// Code font
MAKE_SOURCE_FONT(df_code, int(EDITOR_GET("interface/editor/code_font_size")) * EDSCALE);
p_theme->set_font("source", "EditorFonts", df_code);
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index 556dbcbfc4..30aebd2b1f 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -30,7 +30,7 @@
#include "editor_help.h"
-#include "core/os/input.h"
+#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "doc_data_compressed.gen.h"
#include "editor/plugins/script_editor_plugin.h"
@@ -39,55 +39,49 @@
#include "editor_settings.h"
#define CONTRIBUTE_URL "https://docs.godotengine.org/en/latest/community/contributing/updating_the_class_reference.html"
-#define CONTRIBUTE2_URL "https://github.com/godotengine/godot-docs"
-#define REQUEST_URL "https://github.com/godotengine/godot-docs/issues/new"
-DocData *EditorHelp::doc = NULL;
+DocData *EditorHelp::doc = nullptr;
void EditorHelp::_init_colors() {
-
- title_color = get_color("accent_color", "Editor");
- text_color = get_color("default_color", "RichTextLabel");
- headline_color = get_color("headline_color", "EditorHelp");
- base_type_color = title_color.linear_interpolate(text_color, 0.5);
- comment_color = text_color * Color(1, 1, 1, 0.4);
+ title_color = get_theme_color("accent_color", "Editor");
+ text_color = get_theme_color("default_color", "RichTextLabel");
+ headline_color = get_theme_color("headline_color", "EditorHelp");
+ base_type_color = title_color.lerp(text_color, 0.5);
+ comment_color = text_color * Color(1, 1, 1, 0.6);
symbol_color = comment_color;
value_color = text_color * Color(1, 1, 1, 0.6);
qualifier_color = text_color * Color(1, 1, 1, 0.8);
- type_color = get_color("accent_color", "Editor").linear_interpolate(text_color, 0.5);
- class_desc->add_color_override("selection_color", get_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
- class_desc->add_constant_override("line_separation", Math::round(5 * EDSCALE));
+ type_color = get_theme_color("accent_color", "Editor").lerp(text_color, 0.5);
+ class_desc->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
+ class_desc->add_theme_constant_override("line_separation", Math::round(5 * EDSCALE));
}
void EditorHelp::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
-
- if (!is_visible_in_tree())
+ if (!is_visible_in_tree()) {
return;
+ }
Ref<InputEventKey> k = p_ev;
- if (k.is_valid() && k->get_control() && k->get_scancode() == KEY_F) {
-
+ if (k.is_valid() && k->get_control() && k->get_keycode() == KEY_F) {
search->grab_focus();
search->select_all();
}
}
void EditorHelp::_search(bool p_search_previous) {
-
- if (p_search_previous)
+ if (p_search_previous) {
find_bar->search_prev();
- else
+ } else {
find_bar->search_next();
+ }
}
void EditorHelp::_class_list_select(const String &p_select) {
-
_goto_desc(p_select);
}
void EditorHelp::_class_desc_select(const String &p_select) {
-
if (p_select.begins_with("$")) { //enum
String select = p_select.substr(1, p_select.length());
String class_name;
@@ -109,7 +103,7 @@ void EditorHelp::_class_desc_select(const String &p_select) {
String link = p_select.substr(tag_end + 1, p_select.length()).lstrip(" ");
String topic;
- Map<String, int> *table = NULL;
+ Map<String, int> *table = nullptr;
if (tag == "method") {
topic = "class_method";
@@ -173,21 +167,21 @@ void EditorHelp::_class_desc_input(const Ref<InputEvent> &p_input) {
void EditorHelp::_class_desc_resized() {
// Add extra horizontal margins for better readability.
// The margins increase as the width of the editor help container increases.
- Ref<Font> doc_code_font = get_font("doc_source", "EditorFonts");
+ Ref<Font> doc_code_font = get_theme_font("doc_source", "EditorFonts");
real_t char_width = doc_code_font->get_char_size('x').width;
const int display_margin = MAX(30 * EDSCALE, get_parent_anchorable_rect().size.width - char_width * 120 * EDSCALE) * 0.5;
- Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_stylebox("normal", "RichTextLabel")->duplicate();
+ Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox("normal", "RichTextLabel")->duplicate();
class_desc_stylebox->set_default_margin(MARGIN_LEFT, display_margin);
class_desc_stylebox->set_default_margin(MARGIN_RIGHT, display_margin);
- class_desc->add_style_override("normal", class_desc_stylebox);
+ class_desc->add_theme_style_override("normal", class_desc_stylebox);
}
void EditorHelp::_add_type(const String &p_type, const String &p_enum) {
-
String t = p_type;
- if (t.empty())
+ if (t.empty()) {
t = "void";
+ }
bool can_ref = (t != "void") || !p_enum.empty();
if (!p_enum.empty()) {
@@ -197,10 +191,15 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) {
t = p_enum.get_slice(".", 0);
}
}
- const Color text_color = get_color("default_color", "RichTextLabel");
- const Color type_color = get_color("accent_color", "Editor").linear_interpolate(text_color, 0.5);
+ const Color text_color = get_theme_color("default_color", "RichTextLabel");
+ const Color type_color = get_theme_color("accent_color", "Editor").lerp(text_color, 0.5);
class_desc->push_color(type_color);
+ bool add_array = false;
if (can_ref) {
+ if (t.ends_with("[]")) {
+ add_array = true;
+ t = t.replace("[]", "");
+ }
if (p_enum.empty()) {
class_desc->push_meta("#" + t); //class
} else {
@@ -208,13 +207,19 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) {
}
}
class_desc->add_text(t);
- if (can_ref)
+ if (can_ref) {
class_desc->pop();
+ if (add_array) {
+ class_desc->add_text(" ");
+ class_desc->push_meta("#Array"); //class
+ class_desc->add_text("[]");
+ class_desc->pop();
+ }
+ }
class_desc->pop();
}
String EditorHelp::_fix_constant(const String &p_constant) const {
-
if (p_constant.strip_edges() == "4294967295") {
return "0xFFFFFFFF";
}
@@ -231,7 +236,6 @@ String EditorHelp::_fix_constant(const String &p_constant) const {
}
void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview) {
-
method_line[p_method.name] = class_desc->get_line_count() - 2; //gets overridden if description
const bool is_vararg = p_method.qualifiers.find("vararg") != -1;
@@ -239,6 +243,9 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
if (p_overview) {
class_desc->push_cell();
class_desc->push_align(RichTextLabel::ALIGN_RIGHT);
+ } else {
+ static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
+ class_desc->add_text(String(prefix));
}
_add_type(p_method.return_type, p_method.return_enum);
@@ -269,14 +276,14 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
for (int j = 0; j < p_method.arguments.size(); j++) {
class_desc->push_color(text_color);
- if (j > 0)
+ if (j > 0) {
class_desc->add_text(", ");
+ }
_add_text(p_method.arguments[j].name);
class_desc->add_text(": ");
_add_type(p_method.arguments[j].type, p_method.arguments[j].enumeration);
if (p_method.arguments[j].default_value != "") {
-
class_desc->push_color(symbol_color);
class_desc->add_text(" = ");
class_desc->pop();
@@ -290,8 +297,9 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
if (is_vararg) {
class_desc->push_color(text_color);
- if (p_method.arguments.size())
+ if (p_method.arguments.size()) {
class_desc->add_text(", ");
+ }
class_desc->push_color(symbol_color);
class_desc->add_text("...");
class_desc->pop();
@@ -302,21 +310,21 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
class_desc->add_text(")");
class_desc->pop();
if (p_method.qualifiers != "") {
-
class_desc->push_color(qualifier_color);
class_desc->add_text(" ");
_add_text(p_method.qualifiers);
class_desc->pop();
}
- if (p_overview)
+ if (p_overview) {
class_desc->pop(); //cell
+ }
}
Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
-
- if (!doc->class_list.has(p_class))
+ if (!doc->class_list.has(p_class)) {
return ERR_DOES_NOT_EXIST;
+ }
select_locked = true;
@@ -324,8 +332,9 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
description_line = 0;
- if (p_class == edited_class)
+ if (p_class == edited_class) {
return OK; //already there
+ }
edited_class = p_class;
_update_doc();
@@ -333,8 +342,9 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
}
void EditorHelp::_update_doc() {
- if (!doc->class_list.has(edited_class))
+ if (!doc->class_list.has(edited_class)) {
return;
+ }
scroll_locked = true;
@@ -346,10 +356,10 @@ void EditorHelp::_update_doc() {
DocData::ClassDoc cd = doc->class_list[edited_class]; //make a copy, so we can sort without worrying
- Ref<Font> doc_font = get_font("doc", "EditorFonts");
- Ref<Font> doc_bold_font = get_font("doc_bold", "EditorFonts");
- Ref<Font> doc_title_font = get_font("doc_title", "EditorFonts");
- Ref<Font> doc_code_font = get_font("doc_source", "EditorFonts");
+ Ref<Font> doc_font = get_theme_font("doc", "EditorFonts");
+ Ref<Font> doc_bold_font = get_theme_font("doc_bold", "EditorFonts");
+ Ref<Font> doc_title_font = get_theme_font("doc_title", "EditorFonts");
+ Ref<Font> doc_code_font = get_theme_font("doc_source", "EditorFonts");
String link_color_text = title_color.to_html(false);
// Class name
@@ -368,11 +378,9 @@ void EditorHelp::_update_doc() {
// Ascendents
if (cd.inherits != "") {
-
class_desc->push_color(title_color);
class_desc->push_font(doc_font);
class_desc->add_text(TTR("Inherits:") + " ");
- class_desc->pop();
String inherits = cd.inherits;
@@ -387,29 +395,25 @@ void EditorHelp::_update_doc() {
}
class_desc->pop();
+ class_desc->pop();
class_desc->add_newline();
}
// Descendents
if (ClassDB::class_exists(cd.name)) {
-
bool found = false;
bool prev = false;
+ class_desc->push_font(doc_font);
for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) {
-
if (E->get().inherits == cd.name) {
-
if (!found) {
class_desc->push_color(title_color);
- class_desc->push_font(doc_font);
class_desc->add_text(TTR("Inherited by:") + " ");
- class_desc->pop();
found = true;
}
if (prev) {
-
class_desc->add_text(" , ");
}
@@ -417,6 +421,7 @@ void EditorHelp::_update_doc() {
prev = true;
}
}
+ class_desc->pop();
if (found) {
class_desc->pop();
@@ -429,11 +434,10 @@ void EditorHelp::_update_doc() {
// Brief description
if (cd.brief_description != "") {
-
class_desc->push_color(text_color);
class_desc->push_font(doc_bold_font);
class_desc->push_indent(1);
- _add_text(cd.brief_description);
+ _add_text(DTR(cd.brief_description));
class_desc->pop();
class_desc->pop();
class_desc->pop();
@@ -444,7 +448,6 @@ void EditorHelp::_update_doc() {
// Class description
if (cd.description != "") {
-
section_line.push_back(Pair<String, int>(TTR("Description"), class_desc->get_line_count() - 2));
description_line = class_desc->get_line_count() - 2;
class_desc->push_color(title_color);
@@ -458,7 +461,7 @@ void EditorHelp::_update_doc() {
class_desc->push_color(text_color);
class_desc->push_font(doc_font);
class_desc->push_indent(1);
- _add_text(cd.description);
+ _add_text(DTR(cd.description));
class_desc->pop();
class_desc->pop();
class_desc->pop();
@@ -480,8 +483,8 @@ void EditorHelp::_update_doc() {
class_desc->add_newline();
for (int i = 0; i < cd.tutorials.size(); i++) {
- const String link = cd.tutorials[i];
- String linktxt = link;
+ const String link = DTR(cd.tutorials[i].link);
+ String linktxt = (cd.tutorials[i].title.empty()) ? link : DTR(cd.tutorials[i].title);
const int seppos = linktxt.find("//");
if (seppos != -1) {
linktxt = link.right(seppos + 2);
@@ -504,7 +507,6 @@ void EditorHelp::_update_doc() {
bool property_descr = false;
if (cd.properties.size()) {
-
section_line.push_back(Pair<String, int>(TTR("Properties"), class_desc->get_line_count() - 2));
class_desc->push_color(title_color);
class_desc->push_font(doc_title_font);
@@ -516,7 +518,7 @@ void EditorHelp::_update_doc() {
class_desc->push_font(doc_code_font);
class_desc->push_indent(1);
class_desc->push_table(2);
- class_desc->set_table_column_expand(1, 1);
+ class_desc->set_table_column_expand(1, true);
for (int i = 0; i < cd.properties.size(); i++) {
property_line[cd.properties[i].name] = class_desc->get_line_count() - 2; //gets overridden if description
@@ -604,9 +606,9 @@ void EditorHelp::_update_doc() {
}
if (methods.size()) {
-
- if (sort_methods)
+ if (sort_methods) {
methods.sort();
+ }
section_line.push_back(Pair<String, int>(TTR("Methods"), class_desc->get_line_count() - 2));
class_desc->push_color(title_color);
@@ -619,7 +621,7 @@ void EditorHelp::_update_doc() {
class_desc->push_font(doc_code_font);
class_desc->push_indent(1);
class_desc->push_table(2);
- class_desc->set_table_column_expand(1, 1);
+ class_desc->set_table_column_expand(1, true);
bool any_previous = false;
for (int pass = 0; pass < 2; pass++) {
@@ -678,7 +680,6 @@ void EditorHelp::_update_doc() {
// Theme properties
if (cd.theme_properties.size()) {
-
section_line.push_back(Pair<String, int>(TTR("Theme Properties"), class_desc->get_line_count() - 2));
class_desc->push_color(title_color);
class_desc->push_font(doc_title_font);
@@ -688,10 +689,9 @@ void EditorHelp::_update_doc() {
class_desc->push_indent(1);
class_desc->push_table(2);
- class_desc->set_table_column_expand(1, 1);
+ class_desc->set_table_column_expand(1, true);
for (int i = 0; i < cd.theme_properties.size(); i++) {
-
theme_property_line[cd.theme_properties[i].name] = class_desc->get_line_count() - 2; //gets overridden if description
class_desc->push_cell();
@@ -726,7 +726,7 @@ void EditorHelp::_update_doc() {
class_desc->push_font(doc_font);
class_desc->add_text(" ");
class_desc->push_color(comment_color);
- _add_text(cd.theme_properties[i].description);
+ _add_text(DTR(cd.theme_properties[i].description));
class_desc->pop();
class_desc->pop();
}
@@ -741,7 +741,6 @@ void EditorHelp::_update_doc() {
// Signals
if (cd.signals.size()) {
-
if (sort_methods) {
cd.signals.sort();
}
@@ -759,10 +758,11 @@ void EditorHelp::_update_doc() {
class_desc->push_indent(1);
for (int i = 0; i < cd.signals.size(); i++) {
-
signal_line[cd.signals[i].name] = class_desc->get_line_count() - 2; //gets overridden if description
class_desc->push_font(doc_code_font); // monofont
class_desc->push_color(headline_color);
+ static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
+ class_desc->add_text(String(prefix));
_add_text(cd.signals[i].name);
class_desc->pop();
class_desc->push_color(symbol_color);
@@ -770,14 +770,14 @@ void EditorHelp::_update_doc() {
class_desc->pop();
for (int j = 0; j < cd.signals[i].arguments.size(); j++) {
class_desc->push_color(text_color);
- if (j > 0)
+ if (j > 0) {
class_desc->add_text(", ");
+ }
_add_text(cd.signals[i].arguments[j].name);
class_desc->add_text(": ");
_add_type(cd.signals[i].arguments[j].type);
if (cd.signals[i].arguments[j].default_value != "") {
-
class_desc->push_color(symbol_color);
class_desc->add_text(" = ");
class_desc->pop();
@@ -792,11 +792,10 @@ void EditorHelp::_update_doc() {
class_desc->pop();
class_desc->pop(); // end monofont
if (cd.signals[i].description != "") {
-
class_desc->push_font(doc_font);
class_desc->push_color(comment_color);
class_desc->push_indent(1);
- _add_text(cd.signals[i].description);
+ _add_text(DTR(cd.signals[i].description));
class_desc->pop(); // indent
class_desc->pop();
class_desc->pop(); // font
@@ -811,12 +810,10 @@ void EditorHelp::_update_doc() {
// Constants and enums
if (cd.constants.size()) {
-
- Map<String, Vector<DocData::ConstantDoc> > enums;
+ Map<String, Vector<DocData::ConstantDoc>> enums;
Vector<DocData::ConstantDoc> constants;
for (int i = 0; i < cd.constants.size(); i++) {
-
if (cd.constants[i].enumeration != String()) {
if (!enums.has(cd.constants[i].enumeration)) {
enums[cd.constants[i].enumeration] = Vector<DocData::ConstantDoc>();
@@ -824,14 +821,12 @@ void EditorHelp::_update_doc() {
enums[cd.constants[i].enumeration].push_back(cd.constants[i]);
} else {
-
constants.push_back(cd.constants[i]);
}
}
// Enums
if (enums.size()) {
-
section_line.push_back(Pair<String, int>(TTR("Enumerations"), class_desc->get_line_count() - 2));
class_desc->push_color(title_color);
class_desc->push_font(doc_title_font);
@@ -842,14 +837,13 @@ void EditorHelp::_update_doc() {
class_desc->add_newline();
- for (Map<String, Vector<DocData::ConstantDoc> >::Element *E = enums.front(); E; E = E->next()) {
-
+ for (Map<String, Vector<DocData::ConstantDoc>>::Element *E = enums.front(); E; E = E->next()) {
enum_line[E->key()] = class_desc->get_line_count() - 2;
+ class_desc->push_font(doc_code_font);
class_desc->push_color(title_color);
class_desc->add_text("enum ");
class_desc->pop();
- class_desc->push_font(doc_code_font);
String e = E->key();
if ((e.get_slice_count(".") > 1) && (e.get_slice(".", 0) == edited_class)) {
e = e.get_slice(".", 1);
@@ -862,6 +856,8 @@ void EditorHelp::_update_doc() {
class_desc->push_color(symbol_color);
class_desc->add_text(":");
class_desc->pop();
+
+ class_desc->add_newline();
class_desc->add_newline();
class_desc->push_indent(1);
@@ -871,14 +867,17 @@ void EditorHelp::_update_doc() {
int enumStartingLine = enum_line[E->key()];
for (int i = 0; i < enum_list.size(); i++) {
- if (cd.name == "@GlobalScope")
+ if (cd.name == "@GlobalScope") {
enumValuesContainer[enum_list[i].name] = enumStartingLine;
+ }
// 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_line_count() - 2;
class_desc->push_font(doc_code_font);
class_desc->push_color(headline_color);
+ static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
+ class_desc->add_text(String(prefix));
_add_text(enum_list[i].name);
class_desc->pop();
class_desc->push_color(symbol_color);
@@ -890,21 +889,23 @@ void EditorHelp::_update_doc() {
class_desc->pop();
if (enum_list[i].description != "") {
class_desc->push_font(doc_font);
- //class_desc->add_text(" ");
- class_desc->push_indent(1);
class_desc->push_color(comment_color);
- _add_text(enum_list[i].description);
+ static const char32_t dash[6] = { ' ', ' ', 0x2013 /* en dash */, ' ', ' ', 0 };
+ class_desc->add_text(String(dash));
+ _add_text(DTR(enum_list[i].description));
class_desc->pop();
class_desc->pop();
- class_desc->pop(); // indent
- class_desc->add_newline();
+ if (DTR(enum_list[i].description).find("\n") > 0) {
+ class_desc->add_newline();
+ }
}
class_desc->add_newline();
}
- if (cd.name == "@GlobalScope")
+ if (cd.name == "@GlobalScope") {
enum_values_line[E->key()] = enumValuesContainer;
+ }
class_desc->pop();
@@ -917,7 +918,6 @@ void EditorHelp::_update_doc() {
// Constants
if (constants.size()) {
-
section_line.push_back(Pair<String, int>(TTR("Constants"), class_desc->get_line_count() - 2));
class_desc->push_color(title_color);
class_desc->push_font(doc_title_font);
@@ -929,7 +929,6 @@ void EditorHelp::_update_doc() {
class_desc->add_newline();
for (int i = 0; i < constants.size(); i++) {
-
constant_line[constants[i].name] = class_desc->get_line_count() - 2;
class_desc->push_font(doc_code_font);
@@ -938,10 +937,13 @@ void EditorHelp::_update_doc() {
Vector<float> color = stripped.split_floats(",");
if (color.size() >= 3) {
class_desc->push_color(Color(color[0], color[1], color[2]));
- static const CharType prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
+ static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
class_desc->add_text(String(prefix));
class_desc->pop();
}
+ } else {
+ static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
+ class_desc->add_text(String(prefix));
}
class_desc->push_color(headline_color);
@@ -957,13 +959,15 @@ void EditorHelp::_update_doc() {
class_desc->pop();
if (constants[i].description != "") {
class_desc->push_font(doc_font);
- class_desc->push_indent(1);
class_desc->push_color(comment_color);
- _add_text(constants[i].description);
+ static const char32_t dash[6] = { ' ', ' ', 0x2013 /* en dash */, ' ', ' ', 0 };
+ class_desc->add_text(String(dash));
+ _add_text(DTR(constants[i].description));
class_desc->pop();
class_desc->pop();
- class_desc->pop(); // indent
- class_desc->add_newline();
+ if (DTR(constants[i].description).find("\n") > 0) {
+ class_desc->add_newline();
+ }
}
class_desc->add_newline();
@@ -976,7 +980,6 @@ void EditorHelp::_update_doc() {
// Property descriptions
if (property_descr) {
-
section_line.push_back(Pair<String, int>(TTR("Property Descriptions"), class_desc->get_line_count() - 2));
class_desc->push_color(title_color);
class_desc->push_font(doc_title_font);
@@ -988,17 +991,20 @@ void EditorHelp::_update_doc() {
class_desc->add_newline();
for (int i = 0; i < cd.properties.size(); i++) {
-
- if (cd.properties[i].overridden)
+ if (cd.properties[i].overridden) {
continue;
+ }
property_line[cd.properties[i].name] = class_desc->get_line_count() - 2;
class_desc->push_table(2);
- class_desc->set_table_column_expand(1, 1);
+ class_desc->set_table_column_expand(1, true);
class_desc->push_cell();
class_desc->push_font(doc_code_font);
+ static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
+ class_desc->add_text(String(prefix));
+
_add_type(cd.properties[i].type, cd.properties[i].enumeration);
class_desc->add_text(" ");
class_desc->pop(); // font
@@ -1027,38 +1033,57 @@ void EditorHelp::_update_doc() {
class_desc->pop(); // font
class_desc->pop(); // cell
- if (cd.properties[i].setter != "") {
+ Map<String, DocData::MethodDoc> method_map;
+ for (int j = 0; j < methods.size(); j++) {
+ method_map[methods[j].name] = methods[j];
+ }
+ if (cd.properties[i].setter != "") {
class_desc->push_cell();
class_desc->pop(); // cell
class_desc->push_cell();
class_desc->push_font(doc_code_font);
class_desc->push_color(text_color);
- class_desc->add_text(cd.properties[i].setter + TTR("(value)"));
+ 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);
+ class_desc->add_text(cd.properties[i].setter + TTR("(value)"));
+ class_desc->pop();
+ } else {
+ class_desc->add_text(cd.properties[i].setter + TTR("(value)"));
+ }
class_desc->pop(); // color
class_desc->push_color(comment_color);
class_desc->add_text(" setter");
class_desc->pop(); // color
class_desc->pop(); // font
class_desc->pop(); // cell
+ method_line[cd.properties[i].setter] = property_line[cd.properties[i].name];
}
if (cd.properties[i].getter != "") {
-
class_desc->push_cell();
class_desc->pop(); // cell
class_desc->push_cell();
class_desc->push_font(doc_code_font);
class_desc->push_color(text_color);
- class_desc->add_text(cd.properties[i].getter + "()");
+ 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);
+ class_desc->add_text(cd.properties[i].getter + "()");
+ class_desc->pop();
+ } else {
+ class_desc->add_text(cd.properties[i].getter + "()");
+ }
class_desc->pop(); //color
class_desc->push_color(comment_color);
class_desc->add_text(" getter");
class_desc->pop(); //color
class_desc->pop(); //font
class_desc->pop(); //cell
+ method_line[cd.properties[i].getter] = property_line[cd.properties[i].name];
}
class_desc->pop(); // table
@@ -1070,9 +1095,9 @@ void EditorHelp::_update_doc() {
class_desc->push_font(doc_font);
class_desc->push_indent(1);
if (cd.properties[i].description.strip_edges() != String()) {
- _add_text(cd.properties[i].description);
+ _add_text(DTR(cd.properties[i].description));
} else {
- class_desc->add_image(get_icon("Error", "EditorIcons"));
+ class_desc->add_image(get_theme_icon("Error", "EditorIcons"));
class_desc->add_text(" ");
class_desc->push_color(comment_color);
class_desc->append_bbcode(TTR("There is currently no description for this property. Please help us by [color=$color][url=$url]contributing one[/url][/color]!").replace("$url", CONTRIBUTE_URL).replace("$color", link_color_text));
@@ -1089,7 +1114,6 @@ void EditorHelp::_update_doc() {
// Method descriptions
if (method_descr) {
-
section_line.push_back(Pair<String, int>(TTR("Method Descriptions"), class_desc->get_line_count() - 2));
class_desc->push_color(title_color);
class_desc->push_font(doc_title_font);
@@ -1111,7 +1135,6 @@ void EditorHelp::_update_doc() {
}
for (int i = 0; i < methods_filtered.size(); i++) {
-
class_desc->push_font(doc_code_font);
_add_method(methods_filtered[i], false);
class_desc->pop();
@@ -1123,9 +1146,9 @@ void EditorHelp::_update_doc() {
class_desc->push_font(doc_font);
class_desc->push_indent(1);
if (methods_filtered[i].description.strip_edges() != String()) {
- _add_text(methods_filtered[i].description);
+ _add_text(DTR(methods_filtered[i].description));
} else {
- class_desc->add_image(get_icon("Error", "EditorIcons"));
+ class_desc->add_image(get_theme_icon("Error", "EditorIcons"));
class_desc->add_text(" ");
class_desc->push_color(comment_color);
class_desc->append_bbcode(TTR("There is currently no description for this method. Please help us by [color=$color][url=$url]contributing one[/url][/color]!").replace("$url", CONTRIBUTE_URL).replace("$color", link_color_text));
@@ -1153,12 +1176,12 @@ void EditorHelp::_request_help(const String &p_string) {
}
void EditorHelp::_help_callback(const String &p_topic) {
-
String what = p_topic.get_slice(":", 0);
String clss = p_topic.get_slice(":", 1);
String name;
- if (p_topic.get_slice_count(":") == 3)
+ if (p_topic.get_slice_count(":") == 3) {
name = p_topic.get_slice(":", 2);
+ }
_request_help(clss); //first go to class
@@ -1167,36 +1190,43 @@ void EditorHelp::_help_callback(const String &p_topic) {
if (what == "class_desc") {
line = description_line;
} else if (what == "class_signal") {
- if (signal_line.has(name))
+ if (signal_line.has(name)) {
line = signal_line[name];
+ }
} else if (what == "class_method" || what == "class_method_desc") {
- if (method_line.has(name))
+ if (method_line.has(name)) {
line = method_line[name];
+ }
} else if (what == "class_property") {
- if (property_line.has(name))
+ if (property_line.has(name)) {
line = property_line[name];
+ }
} else if (what == "class_enum") {
- if (enum_line.has(name))
+ if (enum_line.has(name)) {
line = enum_line[name];
+ }
} else if (what == "class_theme_item") {
- if (theme_property_line.has(name))
+ if (theme_property_line.has(name)) {
line = theme_property_line[name];
+ }
} else if (what == "class_constant") {
- if (constant_line.has(name))
+ if (constant_line.has(name)) {
line = constant_line[name];
+ }
} else if (what == "class_global") {
- if (constant_line.has(name))
+ if (constant_line.has(name)) {
line = constant_line[name];
- else {
- Map<String, Map<String, int> >::Element *iter = enum_values_line.front();
+ } else {
+ Map<String, Map<String, int>>::Element *iter = enum_values_line.front();
while (true) {
if (iter->value().has(name)) {
line = iter->value()[name];
break;
- } else if (iter == enum_values_line.back())
+ } else if (iter == enum_values_line.back()) {
break;
- else
+ } else {
iter = iter->next();
+ }
}
}
}
@@ -1205,21 +1235,72 @@ void EditorHelp::_help_callback(const String &p_topic) {
}
static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
-
DocData *doc = EditorHelp::get_doc_data();
String base_path;
- Ref<Font> doc_font = p_rt->get_font("doc", "EditorFonts");
- Ref<Font> doc_bold_font = p_rt->get_font("doc_bold", "EditorFonts");
- Ref<Font> doc_code_font = p_rt->get_font("doc_source", "EditorFonts");
+ Ref<Font> doc_font = p_rt->get_theme_font("doc", "EditorFonts");
+ Ref<Font> doc_bold_font = p_rt->get_theme_font("doc_bold", "EditorFonts");
+ Ref<Font> doc_code_font = p_rt->get_theme_font("doc_source", "EditorFonts");
+ Ref<Font> doc_kbd_font = p_rt->get_theme_font("doc_keyboard", "EditorFonts");
- Color font_color_hl = p_rt->get_color("headline_color", "EditorHelp");
- Color accent_color = p_rt->get_color("accent_color", "Editor");
- Color link_color = accent_color.linear_interpolate(font_color_hl, 0.8);
- Color code_color = accent_color.linear_interpolate(font_color_hl, 0.6);
+ Color font_color_hl = p_rt->get_theme_color("headline_color", "EditorHelp");
+ Color accent_color = p_rt->get_theme_color("accent_color", "Editor");
+ Color property_color = p_rt->get_theme_color("property_color", "Editor");
+ Color link_color = accent_color.lerp(font_color_hl, 0.8);
+ Color code_color = accent_color.lerp(font_color_hl, 0.6);
+ Color kbd_color = accent_color.lerp(property_color, 0.6);
String bbcode = p_bbcode.dedent().replace("\t", "").replace("\r", "").strip_edges();
+ // Select the correct code examples
+ switch ((int)EDITOR_GET("text_editor/help/class_reference_examples")) {
+ case 0: // GDScript
+ bbcode = bbcode.replace("[gdscript]", "[codeblock]");
+ bbcode = bbcode.replace("[/gdscript]", "[/codeblock]");
+
+ for (int pos = bbcode.find("[csharp]"); pos != -1; pos = bbcode.find("[csharp]")) {
+ if (bbcode.find("[/csharp]") == -1) {
+ WARN_PRINT("Unclosed [csharp] block or parse fail in code (search for tag errors)");
+ break;
+ }
+
+ bbcode.erase(pos, bbcode.find("[/csharp]") + 9 - pos);
+ while (bbcode[pos] == '\n') {
+ bbcode.erase(pos, 1);
+ }
+ }
+ break;
+ case 1: // C#
+ bbcode = bbcode.replace("[csharp]", "[codeblock]");
+ bbcode = bbcode.replace("[/csharp]", "[/codeblock]");
+
+ for (int pos = bbcode.find("[gdscript]"); pos != -1; pos = bbcode.find("[gdscript]")) {
+ if (bbcode.find("[/gdscript]") == -1) {
+ WARN_PRINT("Unclosed [gdscript] block or parse fail in code (search for tag errors)");
+ break;
+ }
+
+ bbcode.erase(pos, bbcode.find("[/gdscript]") + 11 - pos);
+ while (bbcode[pos] == '\n') {
+ bbcode.erase(pos, 1);
+ }
+ }
+ break;
+ case 2: // GDScript and C#
+ bbcode = bbcode.replace("[csharp]", "[b]C#:[/b]\n[codeblock]");
+ bbcode = bbcode.replace("[gdscript]", "[b]GDScript:[/b]\n[codeblock]");
+
+ bbcode = bbcode.replace("[/csharp]", "[/codeblock]");
+ bbcode = bbcode.replace("[/gdscript]", "[/codeblock]");
+ break;
+ }
+
+ // Remove codeblocks (they would be printed otherwise)
+ bbcode = bbcode.replace("[codeblocks]\n", "");
+ bbcode = bbcode.replace("\n[/codeblocks]", "");
+ bbcode = bbcode.replace("[codeblocks]", "");
+ bbcode = bbcode.replace("[/codeblocks]", "");
+
// remove extra new lines around code blocks
bbcode = bbcode.replace("[codeblock]\n", "[codeblock]");
bbcode = bbcode.replace("\n[/codeblock]", "[/codeblock]");
@@ -1229,29 +1310,31 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
int pos = 0;
while (pos < bbcode.length()) {
-
int brk_pos = bbcode.find("[", pos);
- if (brk_pos < 0)
+ if (brk_pos < 0) {
brk_pos = bbcode.length();
+ }
if (brk_pos > pos) {
String text = bbcode.substr(pos, brk_pos - pos);
- if (!code_tag)
+ if (!code_tag) {
text = text.replace("\n", "\n\n");
+ }
p_rt->add_text(text);
}
- if (brk_pos == bbcode.length())
+ if (brk_pos == bbcode.length()) {
break; //nothing else to add
+ }
int brk_end = bbcode.find("]", brk_pos + 1);
if (brk_end == -1) {
-
String text = bbcode.substr(brk_pos, bbcode.length() - brk_pos);
- if (!code_tag)
+ if (!code_tag) {
text = text.replace("\n", "\n\n");
+ }
p_rt->add_text(text);
break;
@@ -1263,7 +1346,6 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
bool tag_ok = tag_stack.size() && tag_stack.front()->get() == tag.substr(1, tag.length());
if (!tag_ok) {
-
p_rt->add_text("[");
pos = brk_pos + 1;
continue;
@@ -1280,12 +1362,10 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
code_tag = false;
} else if (code_tag) {
-
p_rt->add_text("[");
pos = brk_pos + 1;
} else if (tag.begins_with("method ") || tag.begins_with("member ") || tag.begins_with("signal ") || tag.begins_with("enum ") || tag.begins_with("constant ")) {
-
int tag_end = tag.find(" ");
String link_tag = tag.substr(0, tag_end);
@@ -1299,7 +1379,6 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
pos = brk_end + 1;
} else if (doc->class_list.has(tag)) {
-
p_rt->push_color(link_color);
p_rt->push_meta("#" + tag);
p_rt->add_text(tag);
@@ -1308,132 +1387,131 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
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_color(font_color_hl);
pos = brk_end + 1;
tag_stack.push_front(tag);
} else if (tag == "code" || tag == "codeblock") {
-
//use monospace font
p_rt->push_font(doc_code_font);
p_rt->push_color(code_color);
code_tag = true;
pos = brk_end + 1;
tag_stack.push_front(tag);
+ } else if (tag == "kbd") {
+ //use keyboard font with custom color
+ p_rt->push_font(doc_kbd_font);
+ 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_align(RichTextLabel::ALIGN_CENTER);
pos = brk_end + 1;
tag_stack.push_front(tag);
} else if (tag == "br") {
-
//force a line break
p_rt->add_newline();
pos = brk_end + 1;
} else if (tag == "u") {
-
//use underline
p_rt->push_underline();
pos = brk_end + 1;
tag_stack.push_front(tag);
} else if (tag == "s") {
-
//use strikethrough
p_rt->push_strikethrough();
pos = brk_end + 1;
tag_stack.push_front(tag);
} else if (tag == "url") {
-
int end = bbcode.find("[", brk_end);
- if (end == -1)
+ if (end == -1) {
end = bbcode.length();
+ }
String url = bbcode.substr(brk_end + 1, end - brk_end - 1);
p_rt->push_meta(url);
pos = brk_end + 1;
tag_stack.push_front(tag);
} 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") {
-
int end = bbcode.find("[", brk_end);
- if (end == -1)
+ if (end == -1) {
end = bbcode.length();
+ }
String image = bbcode.substr(brk_end + 1, end - brk_end - 1);
- Ref<Texture> texture = ResourceLoader::load(base_path.plus_file(image), "Texture");
- if (texture.is_valid())
+ Ref<Texture2D> texture = ResourceLoader::load(base_path.plus_file(image), "Texture2D");
+ if (texture.is_valid()) {
p_rt->add_image(texture);
+ }
pos = end;
tag_stack.push_front(tag);
} else if (tag.begins_with("color=")) {
-
String col = tag.substr(6, tag.length());
Color color;
- if (col.begins_with("#"))
+ if (col.begins_with("#")) {
color = Color::html(col);
- else if (col == "aqua")
+ } else if (col == "aqua") {
color = Color(0, 1, 1);
- else if (col == "black")
+ } else if (col == "black") {
color = Color(0, 0, 0);
- else if (col == "blue")
+ } else if (col == "blue") {
color = Color(0, 0, 1);
- else if (col == "fuchsia")
+ } else if (col == "fuchsia") {
color = Color(1, 0, 1);
- else if (col == "gray" || col == "grey")
+ } else if (col == "gray" || col == "grey") {
color = Color(0.5, 0.5, 0.5);
- else if (col == "green")
+ } else if (col == "green") {
color = Color(0, 0.5, 0);
- else if (col == "lime")
+ } else if (col == "lime") {
color = Color(0, 1, 0);
- else if (col == "maroon")
+ } else if (col == "maroon") {
color = Color(0.5, 0, 0);
- else if (col == "navy")
+ } else if (col == "navy") {
color = Color(0, 0, 0.5);
- else if (col == "olive")
+ } else if (col == "olive") {
color = Color(0.5, 0.5, 0);
- else if (col == "purple")
+ } else if (col == "purple") {
color = Color(0.5, 0, 0.5);
- else if (col == "red")
+ } else if (col == "red") {
color = Color(1, 0, 0);
- else if (col == "silver")
+ } else if (col == "silver") {
color = Color(0.75, 0.75, 0.75);
- else if (col == "teal")
+ } else if (col == "teal") {
color = Color(0, 0.5, 0.5);
- else if (col == "white")
+ } else if (col == "white") {
color = Color(1, 1, 1);
- else if (col == "yellow")
+ } else if (col == "yellow") {
color = Color(1, 1, 0);
- else
+ } else {
color = Color(0, 0, 0); //base_color;
+ }
p_rt->push_color(color);
pos = brk_end + 1;
tag_stack.push_front("color");
} else if (tag.begins_with("font=")) {
-
String fnt = tag.substr(5, tag.length());
Ref<Font> font = ResourceLoader::load(base_path.plus_file(fnt), "Font");
- if (font.is_valid())
+ if (font.is_valid()) {
p_rt->push_font(font);
- else {
+ } else {
p_rt->push_font(doc_font);
}
@@ -1441,7 +1519,6 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
tag_stack.push_front("font");
} else {
-
p_rt->add_text("["); //ignore
pos = brk_pos + 1;
}
@@ -1449,12 +1526,10 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
}
void EditorHelp::_add_text(const String &p_bbcode) {
-
_add_text_to_rt(p_bbcode, class_desc);
}
void EditorHelp::generate_doc() {
-
doc = memnew(DocData);
doc->generate(true);
DocData compdoc;
@@ -1463,11 +1538,9 @@ void EditorHelp::generate_doc() {
}
void EditorHelp::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_READY:
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-
_update_doc();
} break;
case NOTIFICATION_THEME_CHANGED: {
@@ -1475,22 +1548,21 @@ void EditorHelp::_notification(int p_what) {
_class_desc_resized();
}
} break;
- default: break;
+ default:
+ break;
}
}
void EditorHelp::go_to_help(const String &p_help) {
-
_help_callback(p_help);
}
void EditorHelp::go_to_class(const String &p_class, int p_scroll) {
-
_goto_desc(p_class, p_scroll);
}
-Vector<Pair<String, int> > EditorHelp::get_sections() {
- Vector<Pair<String, int> > sections;
+Vector<Pair<String, int>> EditorHelp::get_sections() {
+ Vector<Pair<String, int>> sections;
for (int i = 0; i < section_line.size(); i++) {
sections.push_back(Pair<String, int>(section_line[i].first, i));
@@ -1504,12 +1576,10 @@ void EditorHelp::scroll_to_section(int p_section_index) {
}
void EditorHelp::popup_search() {
-
find_bar->popup_search();
}
String EditorHelp::get_class() {
-
return edited_class;
}
@@ -1518,20 +1588,15 @@ void EditorHelp::search_again(bool p_search_previous) {
}
int EditorHelp::get_scroll() const {
-
return class_desc->get_v_scroll()->get_value();
}
-void EditorHelp::set_scroll(int p_scroll) {
+void EditorHelp::set_scroll(int p_scroll) {
class_desc->get_v_scroll()->set_value(p_scroll);
}
void EditorHelp::_bind_methods() {
-
ClassDB::bind_method("_class_list_select", &EditorHelp::_class_list_select);
- ClassDB::bind_method("_class_desc_select", &EditorHelp::_class_desc_select);
- ClassDB::bind_method("_class_desc_input", &EditorHelp::_class_desc_input);
- ClassDB::bind_method("_class_desc_resized", &EditorHelp::_class_desc_resized);
ClassDB::bind_method("_request_help", &EditorHelp::_request_help);
ClassDB::bind_method("_unhandled_key_input", &EditorHelp::_unhandled_key_input);
ClassDB::bind_method("_search", &EditorHelp::_search);
@@ -1541,7 +1606,6 @@ void EditorHelp::_bind_methods() {
}
EditorHelp::EditorHelp() {
-
set_custom_minimum_size(Size2(150 * EDSCALE, 0));
EDITOR_DEF("text_editor/help/sort_functions_alphabetically", true);
@@ -1549,11 +1613,11 @@ EditorHelp::EditorHelp() {
class_desc = memnew(RichTextLabel);
add_child(class_desc);
class_desc->set_v_size_flags(SIZE_EXPAND_FILL);
- class_desc->add_color_override("selection_color", get_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
+ class_desc->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
- class_desc->connect("meta_clicked", this, "_class_desc_select");
- class_desc->connect("gui_input", this, "_class_desc_input");
- class_desc->connect("resized", this, "_class_desc_resized");
+ 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));
_class_desc_resized();
// Added second so it opens at the bottom so it won't offset the entire widget.
@@ -1573,14 +1637,12 @@ EditorHelp::~EditorHelp() {
}
void EditorHelpBit::_go_to_help(String p_what) {
-
EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
ScriptEditor::get_singleton()->goto_help(p_what);
emit_signal("request_hide");
}
void EditorHelpBit::_meta_clicked(String p_select) {
-
if (p_select.begins_with("$")) { //enum
String select = p_select.substr(1, p_select.length());
@@ -1593,74 +1655,75 @@ void EditorHelpBit::_meta_clicked(String p_select) {
_go_to_help("class_enum:" + class_name + ":" + select);
return;
} else if (p_select.begins_with("#")) {
-
_go_to_help("class_name:" + p_select.substr(1, p_select.length()));
return;
} else if (p_select.begins_with("@")) {
-
String m = p_select.substr(1, p_select.length());
- if (m.find(".") != -1)
+ if (m.find(".") != -1) {
_go_to_help("class_method:" + m.get_slice(".", 0) + ":" + m.get_slice(".", 0)); //must go somewhere else
+ }
}
}
void EditorHelpBit::_bind_methods() {
-
- ClassDB::bind_method("_meta_clicked", &EditorHelpBit::_meta_clicked);
ClassDB::bind_method(D_METHOD("set_text", "text"), &EditorHelpBit::set_text);
ADD_SIGNAL(MethodInfo("request_hide"));
}
void EditorHelpBit::_notification(int p_what) {
-
switch (p_what) {
- case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ case NOTIFICATION_READY: {
+ rich_text->clear();
+ _add_text_to_rt(text, rich_text);
- rich_text->add_color_override("selection_color", get_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
} break;
- default: break;
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ rich_text->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
+ } break;
+ default:
+ break;
}
}
void EditorHelpBit::set_text(const String &p_text) {
-
+ text = p_text;
rich_text->clear();
- _add_text_to_rt(p_text, rich_text);
+ _add_text_to_rt(text, rich_text);
}
EditorHelpBit::EditorHelpBit() {
-
rich_text = memnew(RichTextLabel);
add_child(rich_text);
- rich_text->connect("meta_clicked", this, "_meta_clicked");
- rich_text->add_color_override("selection_color", get_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
+ rich_text->connect("meta_clicked", callable_mp(this, &EditorHelpBit::_meta_clicked));
+ rich_text->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
rich_text->set_override_selected_font_color(false);
set_custom_minimum_size(Size2(0, 70 * EDSCALE));
}
FindBar::FindBar() {
-
search_text = memnew(LineEdit);
add_child(search_text);
search_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
search_text->set_h_size_flags(SIZE_EXPAND_FILL);
- search_text->connect("text_changed", this, "_search_text_changed");
- search_text->connect("text_entered", this, "_search_text_entered");
+ search_text->connect("text_changed", callable_mp(this, &FindBar::_search_text_changed));
+ search_text->connect("text_entered", callable_mp(this, &FindBar::_search_text_entered));
matches_label = memnew(Label);
add_child(matches_label);
matches_label->hide();
- find_prev = memnew(ToolButton);
+ find_prev = memnew(Button);
+ find_prev->set_flat(true);
add_child(find_prev);
find_prev->set_focus_mode(FOCUS_NONE);
- find_prev->connect("pressed", this, "_search_prev");
+ find_prev->connect("pressed", callable_mp(this, &FindBar::search_prev));
- find_next = memnew(ToolButton);
+ find_next = memnew(Button);
+ find_next->set_flat(true);
add_child(find_next);
find_next->set_focus_mode(FOCUS_NONE);
- find_next->connect("pressed", this, "_search_next");
+ find_next->connect("pressed", callable_mp(this, &FindBar::search_next));
Control *space = memnew(Control);
add_child(space);
@@ -1671,11 +1734,10 @@ FindBar::FindBar() {
hide_button->set_focus_mode(FOCUS_NONE);
hide_button->set_expand(true);
hide_button->set_stretch_mode(TextureButton::STRETCH_KEEP_CENTERED);
- hide_button->connect("pressed", this, "_hide_pressed");
+ hide_button->connect("pressed", callable_mp(this, &FindBar::_hide_bar));
}
void FindBar::popup_search() {
-
show();
bool grabbed_focus = false;
if (!search_text->has_focus()) {
@@ -1693,56 +1755,42 @@ 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_icon("MoveUp", "EditorIcons"));
- find_next->set_icon(get_icon("MoveDown", "EditorIcons"));
- hide_button->set_normal_texture(get_icon("Close", "EditorIcons"));
- hide_button->set_hover_texture(get_icon("Close", "EditorIcons"));
- hide_button->set_pressed_texture(get_icon("Close", "EditorIcons"));
+ find_prev->set_icon(get_theme_icon("MoveUp", "EditorIcons"));
+ find_next->set_icon(get_theme_icon("MoveDown", "EditorIcons"));
+ hide_button->set_normal_texture(get_theme_icon("Close", "EditorIcons"));
+ hide_button->set_hover_texture(get_theme_icon("Close", "EditorIcons"));
+ hide_button->set_pressed_texture(get_theme_icon("Close", "EditorIcons"));
hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size());
- matches_label->add_color_override("font_color", results_count > 0 ? get_color("font_color", "Label") : get_color("error_color", "Editor"));
+ matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color("font_color", "Label") : get_theme_color("error_color", "Editor"));
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
-
set_process_unhandled_input(is_visible_in_tree());
} break;
}
}
void FindBar::_bind_methods() {
-
ClassDB::bind_method("_unhandled_input", &FindBar::_unhandled_input);
- ClassDB::bind_method("_search_text_changed", &FindBar::_search_text_changed);
- ClassDB::bind_method("_search_text_entered", &FindBar::_search_text_entered);
- ClassDB::bind_method("_search_next", &FindBar::search_next);
- ClassDB::bind_method("_search_prev", &FindBar::search_prev);
- ClassDB::bind_method("_hide_pressed", &FindBar::_hide_bar);
-
ADD_SIGNAL(MethodInfo("search"));
}
void FindBar::set_rich_text_label(RichTextLabel *p_rich_text_label) {
-
rich_text_label = p_rich_text_label;
}
bool FindBar::search_next() {
-
return _search();
}
bool FindBar::search_prev() {
-
return _search(true);
}
bool FindBar::_search(bool p_search_previous) {
-
String stext = search_text->get_text();
bool keep = prev_search == stext;
@@ -1764,11 +1812,12 @@ bool FindBar::_search(bool p_search_previous) {
}
void FindBar::_update_results_count() {
-
results_count = 0;
String searched = search_text->get_text();
- if (searched.empty()) return;
+ if (searched.empty()) {
+ return;
+ }
String full_text = rich_text_label->get_text();
@@ -1776,8 +1825,9 @@ void FindBar::_update_results_count() {
while (true) {
int pos = full_text.find(searched, from_pos);
- if (pos == -1)
+ if (pos == -1) {
break;
+ }
results_count++;
from_pos = pos + searched.length();
@@ -1785,42 +1835,35 @@ void FindBar::_update_results_count() {
}
void FindBar::_update_matches_label() {
-
if (search_text->get_text().empty() || results_count == -1) {
matches_label->hide();
} else {
matches_label->show();
- matches_label->add_color_override("font_color", results_count > 0 ? get_color("font_color", "Label") : get_color("error_color", "Editor"));
+ matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color("font_color", "Label") : get_theme_color("error_color", "Editor"));
matches_label->set_text(vformat(results_count == 1 ? TTR("%d match.") : TTR("%d matches."), results_count));
}
}
void FindBar::_hide_bar() {
-
- if (search_text->has_focus())
+ if (search_text->has_focus()) {
rich_text_label->grab_focus();
+ }
hide();
}
void FindBar::_unhandled_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventKey> k = p_event;
if (k.is_valid()) {
-
if (k->is_pressed() && (rich_text_label->has_focus() || is_a_parent_of(get_focus_owner()))) {
-
bool accepted = true;
- switch (k->get_scancode()) {
-
+ switch (k->get_keycode()) {
case KEY_ESCAPE: {
-
_hide_bar();
} break;
default: {
-
accepted = false;
} break;
}
@@ -1833,12 +1876,10 @@ void FindBar::_unhandled_input(const Ref<InputEvent> &p_event) {
}
void FindBar::_search_text_changed(const String &p_text) {
-
search_next();
}
void FindBar::_search_text_entered(const String &p_text) {
-
if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
search_prev();
} else {
diff --git a/editor/editor_help.h b/editor/editor_help.h
index 83c279aec3..7c3edeb299 100644
--- a/editor/editor_help.h
+++ b/editor/editor_help.h
@@ -32,7 +32,7 @@
#define EDITOR_HELP_H
#include "editor/code_editor.h"
-#include "editor/doc/doc_data.h"
+#include "editor/doc_data.h"
#include "editor/editor_plugin.h"
#include "scene/gui/margin_container.h"
#include "scene/gui/menu_button.h"
@@ -47,8 +47,8 @@ class FindBar : public HBoxContainer {
GDCLASS(FindBar, HBoxContainer);
LineEdit *search_text;
- ToolButton *find_prev;
- ToolButton *find_next;
+ Button *find_prev;
+ Button *find_next;
Label *matches_label;
TextureButton *hide_button;
String prev_search;
@@ -88,7 +88,6 @@ public:
};
class EditorHelp : public VBoxContainer {
-
GDCLASS(EditorHelp, VBoxContainer);
enum Page {
@@ -108,14 +107,14 @@ class EditorHelp : public VBoxContainer {
String edited_class;
- Vector<Pair<String, int> > section_line;
+ Vector<Pair<String, int>> section_line;
Map<String, int> method_line;
Map<String, int> signal_line;
Map<String, int> property_line;
Map<String, int> theme_property_line;
Map<String, int> constant_line;
Map<String, int> enum_line;
- Map<String, Map<String, int> > enum_values_line;
+ Map<String, Map<String, int>> enum_values_line;
int description_line;
RichTextLabel *class_desc;
@@ -175,7 +174,7 @@ public:
void go_to_help(const String &p_help);
void go_to_class(const String &p_class, int p_scroll = 0);
- Vector<Pair<String, int> > get_sections();
+ Vector<Pair<String, int>> get_sections();
void scroll_to_section(int p_section_index);
void popup_search();
@@ -192,14 +191,15 @@ public:
~EditorHelp();
};
-class EditorHelpBit : public PanelContainer {
-
- GDCLASS(EditorHelpBit, PanelContainer);
+class EditorHelpBit : public MarginContainer {
+ GDCLASS(EditorHelpBit, MarginContainer);
RichTextLabel *rich_text;
void _go_to_help(String p_what);
void _meta_clicked(String p_select);
+ String text;
+
protected:
static void _bind_methods();
void _notification(int p_what);
diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp
index 700d9b692b..4392538737 100644
--- a/editor/editor_help_search.cpp
+++ b/editor/editor_help_search.cpp
@@ -36,37 +36,37 @@
#include "editor_scale.h"
void EditorHelpSearch::_update_icons() {
-
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
+ search_box->set_right_icon(results_tree->get_theme_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
- search_box->add_icon_override("right_icon", get_icon("Search", "EditorIcons"));
- case_sensitive_button->set_icon(get_icon("MatchCase", "EditorIcons"));
- hierarchy_button->set_icon(get_icon("ClassList", "EditorIcons"));
+ search_box->add_theme_icon_override("right_icon", results_tree->get_theme_icon("Search", "EditorIcons"));
+ case_sensitive_button->set_icon(results_tree->get_theme_icon("MatchCase", "EditorIcons"));
+ hierarchy_button->set_icon(results_tree->get_theme_icon("ClassList", "EditorIcons"));
- if (is_visible_in_tree())
+ if (is_visible()) {
_update_results();
+ }
}
void EditorHelpSearch::_update_results() {
-
String term = search_box->get_text();
int search_flags = filter_combo->get_selected_id();
- if (case_sensitive_button->is_pressed())
+ if (case_sensitive_button->is_pressed()) {
search_flags |= SEARCH_CASE_SENSITIVE;
- if (hierarchy_button->is_pressed())
+ }
+ if (hierarchy_button->is_pressed()) {
search_flags |= SEARCH_SHOW_HIERARCHY;
+ }
- search = Ref<Runner>(memnew(Runner(this, results_tree, term, search_flags)));
+ search = Ref<Runner>(memnew(Runner(results_tree, results_tree, term, search_flags)));
set_process(true);
}
void EditorHelpSearch::_search_box_gui_input(const Ref<InputEvent> &p_event) {
-
// Redirect up and down navigational key events to the results list.
Ref<InputEventKey> key = p_event;
if (key.is_valid()) {
- switch (key->get_scancode()) {
+ switch (key->get_keycode()) {
case KEY_UP:
case KEY_DOWN:
case KEY_PAGEUP:
@@ -79,20 +79,18 @@ void EditorHelpSearch::_search_box_gui_input(const Ref<InputEvent> &p_event) {
}
void EditorHelpSearch::_search_box_text_changed(const String &p_text) {
-
_update_results();
}
void EditorHelpSearch::_filter_combo_item_selected(int p_option) {
-
_update_results();
}
void EditorHelpSearch::_confirmed() {
-
TreeItem *item = results_tree->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
// Activate the script editor and emit the signal with the documentation link to display.
EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
@@ -103,35 +101,34 @@ void EditorHelpSearch::_confirmed() {
}
void EditorHelpSearch::_notification(int p_what) {
-
switch (p_what) {
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (!is_visible()) {
+ results_tree->call_deferred("clear"); // Wait for the Tree's mouse event propagation.
+ get_ok()->set_disabled(true);
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "search_help", Rect2(get_position(), get_size()));
+ }
+ } break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-
_update_icons();
} break;
case NOTIFICATION_ENTER_TREE: {
-
- connect("confirmed", this, "_confirmed");
+ connect("confirmed", callable_mp(this, &EditorHelpSearch::_confirmed));
_update_icons();
} break;
- case NOTIFICATION_POPUP_HIDE: {
- results_tree->call_deferred("clear"); // Wait for the Tree's mouse event propagation.
- get_ok()->set_disabled(true);
- EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "search_help", get_rect());
- } break;
case NOTIFICATION_PROCESS: {
-
// Update background search.
if (search.is_valid()) {
if (search->work()) {
// Search done.
// Only point to the perfect match if it's a new search, and not just reopening a old one.
- if (!old_search)
+ if (!old_search) {
results_tree->ensure_cursor_is_visible();
- else
+ } else {
old_search = false;
+ }
get_ok()->set_disabled(!results_tree->get_selected());
@@ -146,36 +143,30 @@ void EditorHelpSearch::_notification(int p_what) {
}
void EditorHelpSearch::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_update_results"), &EditorHelpSearch::_update_results);
- ClassDB::bind_method(D_METHOD("_search_box_gui_input"), &EditorHelpSearch::_search_box_gui_input);
- ClassDB::bind_method(D_METHOD("_search_box_text_changed"), &EditorHelpSearch::_search_box_text_changed);
- ClassDB::bind_method(D_METHOD("_filter_combo_item_selected"), &EditorHelpSearch::_filter_combo_item_selected);
- ClassDB::bind_method(D_METHOD("_confirmed"), &EditorHelpSearch::_confirmed);
ADD_SIGNAL(MethodInfo("go_to_help"));
}
void EditorHelpSearch::popup_dialog() {
-
popup_dialog(search_box->get_text());
}
void EditorHelpSearch::popup_dialog(const String &p_term) {
-
// Restore valid window bounds or pop up at default size.
Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "search_help", Rect2());
- if (saved_size != Rect2())
+ if (saved_size != Rect2()) {
popup(saved_size);
- else
+ } else {
popup_centered_ratio(0.5F);
+ }
if (p_term == "") {
search_box->clear();
} else {
- if (old_term == p_term)
+ if (old_term == p_term) {
old_search = true;
- else
+ } else {
old_term = p_term;
+ }
search_box->set_text(p_term);
search_box->select_all();
@@ -185,11 +176,10 @@ void EditorHelpSearch::popup_dialog(const String &p_term) {
}
EditorHelpSearch::EditorHelpSearch() {
-
old_search = false;
set_hide_on_ok(false);
- set_resizable(true);
+
set_title(TTR("Search Help"));
get_ok()->set_disabled(true);
@@ -205,25 +195,27 @@ EditorHelpSearch::EditorHelpSearch() {
search_box = memnew(LineEdit);
search_box->set_custom_minimum_size(Size2(200, 0) * EDSCALE);
- search_box->set_h_size_flags(SIZE_EXPAND_FILL);
- search_box->connect("gui_input", this, "_search_box_gui_input");
- search_box->connect("text_changed", this, "_search_box_text_changed");
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ search_box->connect("gui_input", callable_mp(this, &EditorHelpSearch::_search_box_gui_input));
+ search_box->connect("text_changed", callable_mp(this, &EditorHelpSearch::_search_box_text_changed));
register_text_enter(search_box);
hbox->add_child(search_box);
- case_sensitive_button = memnew(ToolButton);
+ case_sensitive_button = memnew(Button);
+ case_sensitive_button->set_flat(true);
case_sensitive_button->set_tooltip(TTR("Case Sensitive"));
- case_sensitive_button->connect("pressed", this, "_update_results");
+ case_sensitive_button->connect("pressed", callable_mp(this, &EditorHelpSearch::_update_results));
case_sensitive_button->set_toggle_mode(true);
- case_sensitive_button->set_focus_mode(FOCUS_NONE);
+ case_sensitive_button->set_focus_mode(Control::FOCUS_NONE);
hbox->add_child(case_sensitive_button);
- hierarchy_button = memnew(ToolButton);
+ hierarchy_button = memnew(Button);
+ hierarchy_button->set_flat(true);
hierarchy_button->set_tooltip(TTR("Show Hierarchy"));
- hierarchy_button->connect("pressed", this, "_update_results");
+ hierarchy_button->connect("pressed", callable_mp(this, &EditorHelpSearch::_update_results));
hierarchy_button->set_toggle_mode(true);
hierarchy_button->set_pressed(true);
- hierarchy_button->set_focus_mode(FOCUS_NONE);
+ hierarchy_button->set_focus_mode(Control::FOCUS_NONE);
hbox->add_child(hierarchy_button);
filter_combo = memnew(OptionButton);
@@ -237,12 +229,12 @@ EditorHelpSearch::EditorHelpSearch() {
filter_combo->add_item(TTR("Constants Only"), SEARCH_CONSTANTS);
filter_combo->add_item(TTR("Properties Only"), SEARCH_PROPERTIES);
filter_combo->add_item(TTR("Theme Properties Only"), SEARCH_THEME_ITEMS);
- filter_combo->connect("item_selected", this, "_filter_combo_item_selected");
+ filter_combo->connect("item_selected", callable_mp(this, &EditorHelpSearch::_filter_combo_item_selected));
hbox->add_child(filter_combo);
// Create the results tree.
results_tree = memnew(Tree);
- results_tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ results_tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
results_tree->set_columns(2);
results_tree->set_column_title(0, TTR("Name"));
results_tree->set_column_title(1, TTR("Member Type"));
@@ -251,13 +243,12 @@ EditorHelpSearch::EditorHelpSearch() {
results_tree->set_custom_minimum_size(Size2(0, 100) * EDSCALE);
results_tree->set_hide_root(true);
results_tree->set_select_mode(Tree::SELECT_ROW);
- results_tree->connect("item_activated", this, "_confirmed");
- results_tree->connect("item_selected", get_ok(), "set_disabled", varray(false));
+ results_tree->connect("item_activated", callable_mp(this, &EditorHelpSearch::_confirmed));
+ results_tree->connect("item_selected", callable_mp((BaseButton *)get_ok(), &BaseButton::set_disabled), varray(false));
vbox->add_child(results_tree, true);
}
bool EditorHelpSearch::Runner::_is_class_disabled_by_feature_profile(const StringName &p_class) {
-
Ref<EditorFeatureProfile> profile = EditorFeatureProfileManager::get_singleton()->get_current_profile();
if (profile.is_null()) {
return false;
@@ -265,7 +256,6 @@ bool EditorHelpSearch::Runner::_is_class_disabled_by_feature_profile(const Strin
StringName class_name = p_class;
while (class_name != StringName()) {
-
if (!ClassDB::class_exists(class_name)) {
return false;
}
@@ -280,7 +270,6 @@ bool EditorHelpSearch::Runner::_is_class_disabled_by_feature_profile(const Strin
}
bool EditorHelpSearch::Runner::_slice() {
-
bool phase_done = false;
switch (phase) {
case PHASE_MATCH_CLASSES_INIT:
@@ -307,70 +296,78 @@ bool EditorHelpSearch::Runner::_slice() {
case PHASE_MAX:
return true;
default:
- WARN_PRINTS("Invalid or unhandled phase in EditorHelpSearch::Runner, aborting search.");
+ WARN_PRINT("Invalid or unhandled phase in EditorHelpSearch::Runner, aborting search.");
return true;
};
- if (phase_done)
+ if (phase_done) {
phase++;
+ }
return false;
}
bool EditorHelpSearch::Runner::_phase_match_classes_init() {
-
iterator_doc = EditorHelp::get_doc_data()->class_list.front();
matches.clear();
- matched_item = NULL;
+ matched_item = nullptr;
return true;
}
bool EditorHelpSearch::Runner::_phase_match_classes() {
-
DocData::ClassDoc &class_doc = iterator_doc->value();
if (!_is_class_disabled_by_feature_profile(class_doc.name)) {
-
matches[class_doc.name] = ClassMatch();
ClassMatch &match = matches[class_doc.name];
match.doc = &class_doc;
// Match class name.
- if (search_flags & SEARCH_CLASSES)
+ if (search_flags & SEARCH_CLASSES) {
match.name = term == "" || _match_string(term, class_doc.name);
+ }
// Match members if the term is long enough.
if (term.length() > 1) {
- if (search_flags & SEARCH_METHODS)
+ if (search_flags & SEARCH_METHODS) {
for (int i = 0; i < class_doc.methods.size(); i++) {
String method_name = (search_flags & SEARCH_CASE_SENSITIVE) ? class_doc.methods[i].name : class_doc.methods[i].name.to_lower();
- String aux_term = (search_flags & SEARCH_CASE_SENSITIVE) ? term : term.to_lower();
-
- if (aux_term.begins_with("."))
- aux_term = aux_term.right(1);
-
- if (aux_term.ends_with("("))
- aux_term = aux_term.left(aux_term.length() - 1).strip_edges();
-
- if (aux_term.is_subsequence_of(method_name))
+ if (method_name.find(term) > -1 ||
+ (term.begins_with(".") && method_name.begins_with(term.right(1))) ||
+ (term.ends_with("(") && method_name.ends_with(term.left(term.length() - 1).strip_edges())) ||
+ (term.begins_with(".") && term.ends_with("(") && method_name == term.substr(1, term.length() - 2).strip_edges())) {
match.methods.push_back(const_cast<DocData::MethodDoc *>(&class_doc.methods[i]));
+ }
}
- if (search_flags & SEARCH_SIGNALS)
- for (int i = 0; i < class_doc.signals.size(); i++)
- if (_match_string(term, class_doc.signals[i].name))
+ }
+ if (search_flags & SEARCH_SIGNALS) {
+ for (int i = 0; i < class_doc.signals.size(); i++) {
+ if (_match_string(term, class_doc.signals[i].name)) {
match.signals.push_back(const_cast<DocData::MethodDoc *>(&class_doc.signals[i]));
- if (search_flags & SEARCH_CONSTANTS)
- for (int i = 0; i < class_doc.constants.size(); i++)
- if (_match_string(term, class_doc.constants[i].name))
+ }
+ }
+ }
+ if (search_flags & SEARCH_CONSTANTS) {
+ for (int i = 0; i < class_doc.constants.size(); i++) {
+ if (_match_string(term, class_doc.constants[i].name)) {
match.constants.push_back(const_cast<DocData::ConstantDoc *>(&class_doc.constants[i]));
- if (search_flags & SEARCH_PROPERTIES)
- for (int i = 0; i < class_doc.properties.size(); i++)
- if (_match_string(term, class_doc.properties[i].name) || _match_string(term, class_doc.properties[i].getter) || _match_string(term, class_doc.properties[i].setter))
+ }
+ }
+ }
+ if (search_flags & SEARCH_PROPERTIES) {
+ for (int i = 0; i < class_doc.properties.size(); i++) {
+ if (_match_string(term, class_doc.properties[i].name) || _match_string(term, class_doc.properties[i].getter) || _match_string(term, class_doc.properties[i].setter)) {
match.properties.push_back(const_cast<DocData::PropertyDoc *>(&class_doc.properties[i]));
- if (search_flags & SEARCH_THEME_ITEMS)
- for (int i = 0; i < class_doc.theme_properties.size(); i++)
- if (_match_string(term, class_doc.theme_properties[i].name))
+ }
+ }
+ }
+ if (search_flags & SEARCH_THEME_ITEMS) {
+ for (int i = 0; i < class_doc.theme_properties.size(); i++) {
+ if (_match_string(term, class_doc.theme_properties[i].name)) {
match.theme_properties.push_back(const_cast<DocData::PropertyDoc *>(&class_doc.theme_properties[i]));
+ }
+ }
+ }
}
}
@@ -379,7 +376,6 @@ bool EditorHelpSearch::Runner::_phase_match_classes() {
}
bool EditorHelpSearch::Runner::_phase_class_items_init() {
-
iterator_match = matches.front();
results_tree->clear();
@@ -390,15 +386,16 @@ bool EditorHelpSearch::Runner::_phase_class_items_init() {
}
bool EditorHelpSearch::Runner::_phase_class_items() {
-
ClassMatch &match = iterator_match->value();
if (search_flags & SEARCH_SHOW_HIERARCHY) {
- if (match.required())
+ if (match.required()) {
_create_class_hierarchy(match);
+ }
} else {
- if (match.name)
+ if (match.name) {
_create_class_item(root_item, match.doc, false);
+ }
}
iterator_match = iterator_match->next();
@@ -406,64 +403,68 @@ bool EditorHelpSearch::Runner::_phase_class_items() {
}
bool EditorHelpSearch::Runner::_phase_member_items_init() {
-
iterator_match = matches.front();
return true;
}
bool EditorHelpSearch::Runner::_phase_member_items() {
-
ClassMatch &match = iterator_match->value();
TreeItem *parent = (search_flags & SEARCH_SHOW_HIERARCHY) ? class_items[match.doc->name] : root_item;
- for (int i = 0; i < match.methods.size(); i++)
+ for (int i = 0; i < match.methods.size(); i++) {
_create_method_item(parent, match.doc, match.methods[i]);
- for (int i = 0; i < match.signals.size(); i++)
+ }
+ for (int i = 0; i < match.signals.size(); i++) {
_create_signal_item(parent, match.doc, match.signals[i]);
- for (int i = 0; i < match.constants.size(); i++)
+ }
+ for (int i = 0; i < match.constants.size(); i++) {
_create_constant_item(parent, match.doc, match.constants[i]);
- for (int i = 0; i < match.properties.size(); i++)
+ }
+ for (int i = 0; i < match.properties.size(); i++) {
_create_property_item(parent, match.doc, match.properties[i]);
- for (int i = 0; i < match.theme_properties.size(); i++)
+ }
+ for (int i = 0; i < match.theme_properties.size(); i++) {
_create_theme_property_item(parent, match.doc, match.theme_properties[i]);
+ }
iterator_match = iterator_match->next();
return !iterator_match;
}
bool EditorHelpSearch::Runner::_phase_select_match() {
-
- if (matched_item)
+ if (matched_item) {
matched_item->select(0);
+ }
return true;
}
bool EditorHelpSearch::Runner::_match_string(const String &p_term, const String &p_string) const {
-
- if (search_flags & SEARCH_CASE_SENSITIVE)
- return p_term.is_subsequence_of(p_string);
- else
- return p_term.is_subsequence_ofi(p_string);
+ if (search_flags & SEARCH_CASE_SENSITIVE) {
+ return p_string.find(p_term) > -1;
+ } else {
+ return p_string.findn(p_term) > -1;
+ }
}
void EditorHelpSearch::Runner::_match_item(TreeItem *p_item, const String &p_text) {
-
if (!matched_item) {
if (search_flags & SEARCH_CASE_SENSITIVE) {
- if (p_text.casecmp_to(term) == 0)
+ if (p_text.casecmp_to(term) == 0) {
matched_item = p_item;
+ }
} else {
- if (p_text.nocasecmp_to(term) == 0)
+ if (p_text.nocasecmp_to(term) == 0) {
matched_item = p_item;
+ }
}
}
}
TreeItem *EditorHelpSearch::Runner::_create_class_hierarchy(const ClassMatch &p_match) {
-
- if (class_items.has(p_match.doc->name))
+ if (class_items.has(p_match.doc->name)) {
return class_items[p_match.doc->name];
+ }
// Ensure parent nodes are created first.
TreeItem *parent = root_item;
@@ -482,12 +483,12 @@ TreeItem *EditorHelpSearch::Runner::_create_class_hierarchy(const ClassMatch &p_
}
TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const DocData::ClassDoc *p_doc, bool p_gray) {
-
- Ref<Texture> icon = empty_icon;
- if (ui_service->has_icon(p_doc->name, "EditorIcons"))
- icon = ui_service->get_icon(p_doc->name, "EditorIcons");
- else if (ClassDB::class_exists(p_doc->name) && ClassDB::is_parent_class(p_doc->name, "Object"))
- icon = ui_service->get_icon("Object", "EditorIcons");
+ Ref<Texture2D> icon = empty_icon;
+ if (ui_service->has_theme_icon(p_doc->name, "EditorIcons")) {
+ icon = ui_service->get_theme_icon(p_doc->name, "EditorIcons");
+ } else if (ClassDB::class_exists(p_doc->name) && ClassDB::is_parent_class(p_doc->name, "Object")) {
+ icon = ui_service->get_theme_icon("Object", "EditorIcons");
+ }
String tooltip = p_doc->brief_description.strip_edges();
TreeItem *item = results_tree->create_item(p_parent);
@@ -508,43 +509,43 @@ TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const
}
TreeItem *EditorHelpSearch::Runner::_create_method_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc) {
-
String tooltip = p_doc->return_type + " " + p_class_doc->name + "." + p_doc->name + "(";
for (int i = 0; i < p_doc->arguments.size(); i++) {
const DocData::ArgumentDoc &arg = p_doc->arguments[i];
tooltip += arg.type + " " + arg.name;
- if (arg.default_value != "")
+ if (arg.default_value != "") {
tooltip += " = " + arg.default_value;
- if (i < p_doc->arguments.size() - 1)
+ }
+ if (i < p_doc->arguments.size() - 1) {
tooltip += ", ";
+ }
}
tooltip += ")";
return _create_member_item(p_parent, p_class_doc->name, "MemberMethod", p_doc->name, TTRC("Method"), "method", tooltip);
}
TreeItem *EditorHelpSearch::Runner::_create_signal_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc) {
-
String tooltip = p_doc->return_type + " " + p_class_doc->name + "." + p_doc->name + "(";
for (int i = 0; i < p_doc->arguments.size(); i++) {
const DocData::ArgumentDoc &arg = p_doc->arguments[i];
tooltip += arg.type + " " + arg.name;
- if (arg.default_value != "")
+ if (arg.default_value != "") {
tooltip += " = " + arg.default_value;
- if (i < p_doc->arguments.size() - 1)
+ }
+ if (i < p_doc->arguments.size() - 1) {
tooltip += ", ";
+ }
}
tooltip += ")";
return _create_member_item(p_parent, p_class_doc->name, "MemberSignal", p_doc->name, TTRC("Signal"), "signal", tooltip);
}
TreeItem *EditorHelpSearch::Runner::_create_constant_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ConstantDoc *p_doc) {
-
String tooltip = p_class_doc->name + "." + p_doc->name;
return _create_member_item(p_parent, p_class_doc->name, "MemberConstant", p_doc->name, TTRC("Constant"), "constant", tooltip);
}
TreeItem *EditorHelpSearch::Runner::_create_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc) {
-
String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name;
tooltip += "\n " + p_class_doc->name + "." + p_doc->setter + "(value) setter";
tooltip += "\n " + p_class_doc->name + "." + p_doc->getter + "() getter";
@@ -552,25 +553,23 @@ TreeItem *EditorHelpSearch::Runner::_create_property_item(TreeItem *p_parent, co
}
TreeItem *EditorHelpSearch::Runner::_create_theme_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc) {
-
String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name;
return _create_member_item(p_parent, p_class_doc->name, "MemberTheme", p_doc->name, TTRC("Theme Property"), "theme_item", tooltip);
}
TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_type, const String &p_metatype, const String &p_tooltip) {
-
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
String text;
if (search_flags & SEARCH_SHOW_HIERARCHY) {
- icon = ui_service->get_icon(p_icon, "EditorIcons");
+ icon = ui_service->get_theme_icon(p_icon, "EditorIcons");
text = p_name;
} else {
- icon = ui_service->get_icon(p_icon, "EditorIcons");
+ icon = ui_service->get_theme_icon(p_icon, "EditorIcons");
/*// In flat mode, show the class icon.
- if (ui_service->has_icon(p_class_name, "EditorIcons"))
- icon = ui_service->get_icon(p_class_name, "EditorIcons");
- else if (ClassDB::is_parent_class(p_class_name, "Object"))
- icon = ui_service->get_icon("Object", "EditorIcons");*/
+if (ui_service->has_icon(p_class_name, "EditorIcons"))
+icon = ui_service->get_icon(p_class_name, "EditorIcons");
+else if (ClassDB::is_parent_class(p_class_name, "Object"))
+icon = ui_service->get_icon("Object", "EditorIcons");*/
text = p_class_name + "." + p_name;
}
@@ -588,21 +587,21 @@ TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, cons
}
bool EditorHelpSearch::Runner::work(uint64_t slot) {
-
// Return true when the search has been completed, otherwise false.
const uint64_t until = OS::get_singleton()->get_ticks_usec() + slot;
- while (!_slice())
- if (OS::get_singleton()->get_ticks_usec() > until)
+ while (!_slice()) {
+ if (OS::get_singleton()->get_ticks_usec() > until) {
return false;
+ }
+ }
return true;
}
EditorHelpSearch::Runner::Runner(Control *p_icon_service, Tree *p_results_tree, const String &p_term, int p_search_flags) :
- phase(0),
ui_service(p_icon_service),
results_tree(p_results_tree),
term((p_search_flags & SEARCH_CASE_SENSITIVE) == 0 ? p_term.strip_edges().to_lower() : p_term.strip_edges()),
search_flags(p_search_flags),
- empty_icon(ui_service->get_icon("ArrowRight", "EditorIcons")),
- disabled_color(ui_service->get_color("disabled_font_color", "Editor")) {
+ empty_icon(ui_service->get_theme_icon("ArrowRight", "EditorIcons")),
+ disabled_color(ui_service->get_theme_color("disabled_font_color", "Editor")) {
}
diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h
index 5d089d1c24..b37f74fd7e 100644
--- a/editor/editor_help_search.h
+++ b/editor/editor_help_search.h
@@ -54,8 +54,8 @@ class EditorHelpSearch : public ConfirmationDialog {
};
LineEdit *search_box;
- ToolButton *case_sensitive_button;
- ToolButton *hierarchy_button;
+ Button *case_sensitive_button;
+ Button *hierarchy_button;
OptionButton *filter_combo;
Tree *results_tree;
bool old_search;
@@ -84,7 +84,6 @@ public:
};
class EditorHelpSearch::Runner : public Reference {
-
enum Phase {
PHASE_MATCH_CLASSES_INIT,
PHASE_MATCH_CLASSES,
@@ -95,7 +94,7 @@ class EditorHelpSearch::Runner : public Reference {
PHASE_SELECT_MATCH,
PHASE_MAX
};
- int phase;
+ int phase = 0;
struct ClassMatch {
DocData::ClassDoc *doc;
@@ -116,7 +115,7 @@ class EditorHelpSearch::Runner : public Reference {
String term;
int search_flags;
- Ref<Texture> empty_icon;
+ Ref<Texture2D> empty_icon;
Color disabled_color;
Map<String, DocData::ClassDoc>::Element *iterator_doc;
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index 7c1e58862e..2e716a636e 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "editor_inspector.h"
+
#include "array_property_edit.h"
#include "dictionary_property_edit.h"
#include "editor_feature_profile.h"
@@ -38,22 +39,24 @@
#include "scene/resources/packed_scene.h"
Size2 EditorProperty::get_minimum_size() const {
-
Size2 ms;
- Ref<Font> font = get_font("font", "Tree");
+ Ref<Font> font = get_theme_font("font", "Tree");
ms.height = font->get_height();
for (int i = 0; i < get_child_count(); i++) {
-
Control *c = Object::cast_to<Control>(get_child(i));
- if (!c)
+ if (!c) {
continue;
- if (c->is_set_as_toplevel())
+ }
+ if (c->is_set_as_toplevel()) {
continue;
- if (!c->is_visible())
+ }
+ if (!c->is_visible()) {
continue;
- if (c == bottom_editor)
+ }
+ if (c == bottom_editor) {
continue;
+ }
Size2 minsize = c->get_combined_minimum_size();
ms.width = MAX(ms.width, minsize.width);
@@ -61,17 +64,22 @@ Size2 EditorProperty::get_minimum_size() const {
}
if (keying) {
- Ref<Texture> key = get_icon("Key", "EditorIcons");
- ms.width += key->get_width() + get_constant("hseparator", "Tree");
+ Ref<Texture2D> key = get_theme_icon("Key", "EditorIcons");
+ ms.width += key->get_width() + get_theme_constant("hseparator", "Tree");
+ }
+
+ if (deletable) {
+ Ref<Texture2D> key = get_theme_icon("Close", "EditorIcons");
+ ms.width += key->get_width() + get_theme_constant("hseparator", "Tree");
}
if (checkable) {
- Ref<Texture> check = get_icon("checked", "CheckBox");
- ms.width += check->get_width() + get_constant("hseparation", "CheckBox") + get_constant("hseparator", "Tree");
+ Ref<Texture2D> check = get_theme_icon("checked", "CheckBox");
+ ms.width += check->get_width() + get_theme_constant("hseparation", "CheckBox") + get_theme_constant("hseparator", "Tree");
}
- if (bottom_editor != NULL && bottom_editor->is_visible()) {
- ms.height += get_constant("vseparation", "Tree");
+ if (bottom_editor != nullptr && bottom_editor->is_visible()) {
+ ms.height += get_theme_constant("vseparation", "Tree");
Size2 bems = bottom_editor->get_combined_minimum_size();
//bems.width += get_constant("item_margin", "Tree");
ms.height += bems.height;
@@ -82,7 +90,6 @@ Size2 EditorProperty::get_minimum_size() const {
}
void EditorProperty::emit_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field, bool p_changing) {
-
Variant args[4] = { p_property, p_value, p_field, p_changing };
const Variant *argptrs[4] = { &args[0], &args[1], &args[2], &args[3] };
@@ -90,9 +97,7 @@ void EditorProperty::emit_changed(const StringName &p_property, const Variant &p
}
void EditorProperty::_notification(int p_what) {
-
if (p_what == NOTIFICATION_SORT_CHILDREN) {
-
Size2 size = get_size();
Rect2 rect;
Rect2 bottom_rect;
@@ -102,20 +107,22 @@ void EditorProperty::_notification(int p_what) {
{
int child_room = size.width * (1.0 - split_ratio);
- Ref<Font> font = get_font("font", "Tree");
+ Ref<Font> font = get_theme_font("font", "Tree");
int height = font->get_height();
bool no_children = true;
//compute room needed
for (int i = 0; i < get_child_count(); i++) {
-
Control *c = Object::cast_to<Control>(get_child(i));
- if (!c)
+ if (!c) {
continue;
- if (c->is_set_as_toplevel())
+ }
+ if (c->is_set_as_toplevel()) {
continue;
- if (c == bottom_editor)
+ }
+ if (c == bottom_editor) {
continue;
+ }
Size2 minsize = c->get_combined_minimum_size();
child_room = MAX(child_room, minsize.width);
@@ -132,39 +139,52 @@ void EditorProperty::_notification(int p_what) {
}
if (bottom_editor) {
-
int m = 0; //get_constant("item_margin", "Tree");
- bottom_rect = Rect2(m, rect.size.height + get_constant("vseparation", "Tree"), size.width - m, bottom_editor->get_combined_minimum_size().height);
+ bottom_rect = Rect2(m, rect.size.height + get_theme_constant("vseparation", "Tree"), size.width - m, bottom_editor->get_combined_minimum_size().height);
}
if (keying) {
- Ref<Texture> key;
+ Ref<Texture2D> key;
if (use_keying_next()) {
- key = get_icon("KeyNext", "EditorIcons");
+ key = get_theme_icon("KeyNext", "EditorIcons");
} else {
- key = get_icon("Key", "EditorIcons");
+ key = get_theme_icon("Key", "EditorIcons");
}
- rect.size.x -= key->get_width() + get_constant("hseparator", "Tree");
+ rect.size.x -= key->get_width() + get_theme_constant("hseparator", "Tree");
if (no_children) {
text_size -= key->get_width() + 4 * EDSCALE;
}
}
+
+ if (deletable) {
+ Ref<Texture2D> close;
+
+ close = get_theme_icon("Close", "EditorIcons");
+
+ rect.size.x -= close->get_width() + get_theme_constant("hseparator", "Tree");
+
+ if (no_children) {
+ text_size -= close->get_width() + 4 * EDSCALE;
+ }
+ }
}
//set children
for (int i = 0; i < get_child_count(); i++) {
-
Control *c = Object::cast_to<Control>(get_child(i));
- if (!c)
+ if (!c) {
continue;
- if (c->is_set_as_toplevel())
+ }
+ if (c->is_set_as_toplevel()) {
continue;
- if (c == bottom_editor)
+ }
+ if (c == bottom_editor) {
continue;
+ }
fit_child_in_rect(c, rect);
right_child_rect = rect;
@@ -179,8 +199,8 @@ void EditorProperty::_notification(int p_what) {
}
if (p_what == NOTIFICATION_DRAW) {
- Ref<Font> font = get_font("font", "Tree");
- Color dark_color = get_color("dark_color_2", "Editor");
+ Ref<Font> font = get_theme_font("font", "Tree");
+ Color dark_color = get_theme_color("dark_color_2", "Editor");
Size2 size = get_size();
if (bottom_editor) {
@@ -190,7 +210,7 @@ void EditorProperty::_notification(int p_what) {
}
if (selected) {
- Ref<StyleBox> sb = get_stylebox("selected", "Tree");
+ Ref<StyleBox> sb = get_theme_stylebox("selected", "Tree");
draw_style_box(sb, Rect2(Vector2(), size));
}
@@ -203,9 +223,9 @@ void EditorProperty::_notification(int p_what) {
Color color;
if (draw_red) {
- color = get_color("error_color", "Editor");
+ color = get_theme_color("error_color", "Editor");
} else {
- color = get_color("property_color", "Editor");
+ color = get_theme_color("property_color", "Editor");
}
if (label.find(".") != -1) {
color.a = 0.5; //this should be un-hacked honestly, as it's used for editor overrides
@@ -215,11 +235,12 @@ void EditorProperty::_notification(int p_what) {
int text_limit = text_size;
if (checkable) {
- Ref<Texture> checkbox;
- if (checked)
- checkbox = get_icon("GuiChecked", "EditorIcons");
- else
- checkbox = get_icon("GuiUnchecked", "EditorIcons");
+ Ref<Texture2D> checkbox;
+ if (checked) {
+ checkbox = get_theme_icon("GuiChecked", "EditorIcons");
+ } else {
+ checkbox = get_theme_icon("GuiUnchecked", "EditorIcons");
+ }
Color color2(1, 1, 1);
if (check_hover) {
@@ -229,16 +250,16 @@ void EditorProperty::_notification(int p_what) {
}
check_rect = Rect2(ofs, ((size.height - checkbox->get_height()) / 2), checkbox->get_width(), checkbox->get_height());
draw_texture(checkbox, check_rect.position, color2);
- ofs += get_constant("hseparator", "Tree") + checkbox->get_width() + get_constant("hseparation", "CheckBox");
+ ofs += get_theme_constant("hseparator", "Tree") + checkbox->get_width() + get_theme_constant("hseparation", "CheckBox");
text_limit -= ofs;
} else {
check_rect = Rect2();
}
if (can_revert) {
- Ref<Texture> reload_icon = get_icon("ReloadSmall", "EditorIcons");
- text_limit -= reload_icon->get_width() + get_constant("hseparator", "Tree") * 2;
- revert_rect = Rect2(text_limit + get_constant("hseparator", "Tree"), (size.height - reload_icon->get_height()) / 2, reload_icon->get_width(), reload_icon->get_height());
+ Ref<Texture2D> reload_icon = get_theme_icon("ReloadSmall", "EditorIcons");
+ text_limit -= reload_icon->get_width() + get_theme_constant("hseparator", "Tree") * 2;
+ revert_rect = Rect2(text_limit + get_theme_constant("hseparator", "Tree"), (size.height - reload_icon->get_height()) / 2, reload_icon->get_width(), reload_icon->get_height());
Color color2(1, 1, 1);
if (revert_hover) {
@@ -256,15 +277,15 @@ void EditorProperty::_notification(int p_what) {
draw_string(font, Point2(ofs, v_ofs + font->get_ascent()), label, color, text_limit);
if (keying) {
- Ref<Texture> key;
+ Ref<Texture2D> key;
if (use_keying_next()) {
- key = get_icon("KeyNext", "EditorIcons");
+ key = get_theme_icon("KeyNext", "EditorIcons");
} else {
- key = get_icon("Key", "EditorIcons");
+ key = get_theme_icon("Key", "EditorIcons");
}
- ofs = size.width - key->get_width() - get_constant("hseparator", "Tree");
+ ofs = size.width - key->get_width() - get_theme_constant("hseparator", "Tree");
Color color2(1, 1, 1);
if (keying_hover) {
@@ -277,6 +298,25 @@ void EditorProperty::_notification(int p_what) {
} else {
keying_rect = Rect2();
}
+
+ if (deletable) {
+ Ref<Texture2D> close;
+
+ close = get_theme_icon("Close", "EditorIcons");
+
+ ofs = size.width - close->get_width() - get_theme_constant("hseparator", "Tree");
+
+ Color color2(1, 1, 1);
+ if (delete_hover) {
+ color2.r *= 1.2;
+ color2.g *= 1.2;
+ color2.b *= 1.2;
+ }
+ delete_rect = Rect2(ofs, ((size.height - close->get_height()) / 2), close->get_width(), close->get_height());
+ draw_texture(close, delete_rect.position, color2);
+ } else {
+ delete_rect = Rect2();
+ }
}
}
@@ -298,8 +338,9 @@ StringName EditorProperty::get_edited_property() {
}
void EditorProperty::update_property() {
- if (get_script_instance())
+ if (get_script_instance()) {
get_script_instance()->call("update_property");
+ }
}
void EditorProperty::set_read_only(bool p_read_only) {
@@ -311,14 +352,12 @@ bool EditorProperty::is_read_only() const {
}
bool EditorPropertyRevert::may_node_be_in_instance(Node *p_node) {
-
Node *edited_scene = EditorNode::get_singleton()->get_edited_scene();
bool might_be = false;
Node *node = p_node;
while (node) {
-
if (node->get_scene_instance_state().is_valid()) {
might_be = true;
break;
@@ -338,7 +377,6 @@ bool EditorPropertyRevert::may_node_be_in_instance(Node *p_node) {
}
bool EditorPropertyRevert::get_instanced_node_original_property(Node *p_node, const StringName &p_prop, Variant &value) {
-
Node *node = p_node;
Node *orig = node;
@@ -347,7 +385,6 @@ bool EditorPropertyRevert::get_instanced_node_original_property(Node *p_node, co
bool found = false;
while (node) {
-
Ref<SceneState> ss;
if (node == edited_scene) {
@@ -358,7 +395,6 @@ bool EditorPropertyRevert::get_instanced_node_original_property(Node *p_node, co
}
if (ss.is_valid()) {
-
NodePath np = node->get_path_to(orig);
int node_idx = ss->find_node_by_path(np);
if (node_idx >= 0) {
@@ -366,7 +402,6 @@ bool EditorPropertyRevert::get_instanced_node_original_property(Node *p_node, co
Variant lvar;
lvar = ss->get_property_value(node_idx, p_prop, lfound);
if (lfound) {
-
found = true;
value = lvar;
}
@@ -392,21 +427,20 @@ bool EditorPropertyRevert::get_instanced_node_original_property(Node *p_node, co
}
bool EditorPropertyRevert::is_node_property_different(Node *p_node, const Variant &p_current, const Variant &p_orig) {
-
// this is a pretty difficult function, because a property may not be saved but may have
// the flag to not save if one or if zero
//make sure there is an actual state
{
Node *node = p_node;
- if (!node)
+ if (!node) {
return false;
+ }
Node *edited_scene = EditorNode::get_singleton()->get_edited_scene();
bool found_state = false;
while (node) {
-
Ref<SceneState> ss;
if (node == edited_scene) {
@@ -426,11 +460,12 @@ bool EditorPropertyRevert::is_node_property_different(Node *p_node, const Varian
node = node->get_owner();
}
- if (!found_state)
+ if (!found_state) {
return false; //pointless to check if we are not comparing against anything.
+ }
}
- if (p_current.get_type() == Variant::REAL && p_orig.get_type() == Variant::REAL) {
+ if (p_current.get_type() == Variant::FLOAT && p_orig.get_type() == Variant::FLOAT) {
float a = p_current;
float b = p_orig;
@@ -441,7 +476,6 @@ bool EditorPropertyRevert::is_node_property_different(Node *p_node, const Varian
}
bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringName &p_property) {
-
bool has_revert = false;
Node *node = Object::cast_to<Node>(p_object);
@@ -464,18 +498,20 @@ bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringNam
}
}
- if (p_object->call("property_can_revert", p_property).operator bool()) {
-
- has_revert = true;
- }
-
- if (!has_revert && !p_object->get_script().is_null()) {
- Ref<Script> scr = p_object->get_script();
- if (scr.is_valid()) {
- Variant orig_value;
- if (scr->get_property_default_value(p_property, orig_value)) {
- if (orig_value != p_object->get(p_property)) {
- has_revert = true;
+ // If the object implements property_can_revert, rely on that completely
+ // (i.e. don't then try to revert to default value - the property_get_revert implementation
+ // can do that if so desired)
+ if (p_object->has_method("property_can_revert")) {
+ has_revert = p_object->call("property_can_revert", p_property).operator bool();
+ } else {
+ if (!has_revert && !p_object->get_script().is_null()) {
+ Ref<Script> scr = p_object->get_script();
+ if (scr.is_valid()) {
+ Variant orig_value;
+ if (scr->get_property_default_value(p_property, orig_value)) {
+ if (orig_value != p_object->get(p_property)) {
+ has_revert = true;
+ }
}
}
}
@@ -485,9 +521,9 @@ bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringNam
}
void EditorProperty::update_reload_status() {
-
- if (property == StringName())
+ if (property == StringName()) {
return; //no property, so nothing to do
+ }
bool has_reload = EditorPropertyRevert::can_property_revert(object, property);
@@ -511,31 +547,27 @@ bool EditorProperty::use_keying_next() const {
return false;
}
-void EditorProperty::set_checkable(bool p_checkable) {
+void EditorProperty::set_checkable(bool p_checkable) {
checkable = p_checkable;
update();
queue_sort();
}
bool EditorProperty::is_checkable() const {
-
return checkable;
}
void EditorProperty::set_checked(bool p_checked) {
-
checked = p_checked;
update();
}
bool EditorProperty::is_checked() const {
-
return checked;
}
void EditorProperty::set_draw_red(bool p_draw_red) {
-
draw_red = p_draw_red;
update();
}
@@ -546,19 +578,28 @@ void EditorProperty::set_keying(bool p_keying) {
queue_sort();
}
+void EditorProperty::set_deletable(bool p_deletable) {
+ deletable = p_deletable;
+ update();
+ queue_sort();
+}
+
+bool EditorProperty::is_deletable() const {
+ return deletable;
+}
+
bool EditorProperty::is_keying() const {
return keying;
}
bool EditorProperty::is_draw_red() const {
-
return draw_red;
}
void EditorProperty::_focusable_focused(int p_index) {
-
- if (!selectable)
+ if (!selectable) {
return;
+ }
bool already_selected = selected;
selected = true;
selected_focusable = p_index;
@@ -569,13 +610,11 @@ void EditorProperty::_focusable_focused(int p_index) {
}
void EditorProperty::add_focusable(Control *p_control) {
-
- p_control->connect("focus_entered", this, "_focusable_focused", varray(focusables.size()));
+ p_control->connect("focus_entered", callable_mp(this, &EditorProperty::_focusable_focused), varray(focusables.size()));
focusables.push_back(p_control);
}
void EditorProperty::select(int p_focusable) {
-
bool already_selected = selected;
if (p_focusable >= 0) {
@@ -602,14 +641,13 @@ bool EditorProperty::is_selected() const {
}
void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
-
- if (property == StringName())
+ if (property == StringName()) {
return;
+ }
Ref<InputEventMouse> me = p_event;
if (me.is_valid()) {
-
bool button_left = me->get_button_mask() & BUTTON_MASK_LEFT;
bool new_keying_hover = keying_rect.has_point(me->get_position()) && !button_left;
@@ -618,6 +656,12 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
update();
}
+ bool new_delete_hover = delete_rect.has_point(me->get_position()) && !button_left;
+ if (new_delete_hover != delete_hover) {
+ delete_hover = new_delete_hover;
+ update();
+ }
+
bool new_revert_hover = revert_rect.has_point(me->get_position()) && !button_left;
if (new_revert_hover != revert_hover) {
revert_hover = new_revert_hover;
@@ -634,7 +678,6 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
if (!selected && selectable) {
selected = true;
emit_signal("selected", property, -1);
@@ -645,7 +688,7 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
emit_signal("property_keyed", property, use_keying_next());
if (use_keying_next()) {
- if (property == "frame_coords" && (object->is_class("Sprite") || object->is_class("Sprite3D"))) {
+ if (property == "frame_coords" && (object->is_class("Sprite2D") || object->is_class("Sprite3D"))) {
Vector2 new_coords = object->get(property);
new_coords.x++;
if (new_coords.x >= object->get("hframes").operator int64_t()) {
@@ -661,14 +704,15 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
call_deferred("update_property");
}
}
+ if (delete_rect.has_point(mb->get_position())) {
+ emit_signal("property_deleted", property);
+ }
if (revert_rect.has_point(mb->get_position())) {
-
Variant vorig;
Node *node = Object::cast_to<Node>(object);
if (node && EditorPropertyRevert::may_node_be_in_instance(node) && EditorPropertyRevert::get_instanced_node_original_property(node, property, vorig)) {
-
emit_changed(property, vorig.duplicate(true));
update_property();
return;
@@ -709,17 +753,17 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
}
void EditorProperty::set_label_reference(Control *p_control) {
-
label_reference = p_control;
}
-void EditorProperty::set_bottom_editor(Control *p_control) {
+void EditorProperty::set_bottom_editor(Control *p_control) {
bottom_editor = p_control;
}
-Variant EditorProperty::get_drag_data(const Point2 &p_point) {
- if (property == StringName())
+Variant EditorProperty::get_drag_data(const Point2 &p_point) {
+ if (property == StringName()) {
return Variant();
+ }
Dictionary dp;
dp["type"] = "obj_property";
@@ -734,12 +778,10 @@ Variant EditorProperty::get_drag_data(const Point2 &p_point) {
}
void EditorProperty::set_use_folding(bool p_use_folding) {
-
use_folding = p_use_folding;
}
bool EditorProperty::is_using_folding() const {
-
return use_folding;
}
@@ -762,7 +804,6 @@ void EditorProperty::set_name_split_ratio(float p_ratio) {
}
float EditorProperty::get_name_split_ratio() const {
-
return split_ratio;
}
@@ -772,16 +813,26 @@ void EditorProperty::set_object_and_property(Object *p_object, const StringName
}
Control *EditorProperty::make_custom_tooltip(const String &p_text) const {
-
tooltip_text = p_text;
EditorHelpBit *help_bit = memnew(EditorHelpBit);
- help_bit->add_style_override("panel", get_stylebox("panel", "TooltipPanel"));
+ //help_bit->add_theme_style_override("panel", get_theme_stylebox("panel", "TooltipPanel"));
help_bit->get_rich_text()->set_fixed_size_to_width(360 * EDSCALE);
- String text = TTR("Property:") + " [u][b]" + p_text.get_slice("::", 0) + "[/b][/u]\n";
- text += p_text.get_slice("::", 1).strip_edges();
- help_bit->set_text(text);
- help_bit->call_deferred("set_text", text); //hack so it uses proper theme once inside scene
+ String text;
+ PackedStringArray slices = p_text.split("::", false);
+ if (!slices.empty()) {
+ String property_name = slices[0].strip_edges();
+ text = TTR("Property:") + " [u][b]" + property_name + "[/b][/u]";
+
+ if (slices.size() > 1) {
+ String property_doc = slices[1].strip_edges();
+ if (property_name != property_doc) {
+ text += "\n" + property_doc;
+ }
+ }
+ help_bit->set_text(text);
+ }
+
return help_bit;
}
@@ -790,7 +841,6 @@ String EditorProperty::get_tooltip_text() const {
}
void EditorProperty::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("set_label", "text"), &EditorProperty::set_label);
ClassDB::bind_method(D_METHOD("get_label"), &EditorProperty::get_label);
@@ -809,11 +859,13 @@ void EditorProperty::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_keying", "keying"), &EditorProperty::set_keying);
ClassDB::bind_method(D_METHOD("is_keying"), &EditorProperty::is_keying);
+ ClassDB::bind_method(D_METHOD("set_deletable", "deletable"), &EditorProperty::set_deletable);
+ ClassDB::bind_method(D_METHOD("is_deletable"), &EditorProperty::is_deletable);
+
ClassDB::bind_method(D_METHOD("get_edited_property"), &EditorProperty::get_edited_property);
ClassDB::bind_method(D_METHOD("get_edited_object"), &EditorProperty::get_edited_object);
ClassDB::bind_method(D_METHOD("_gui_input"), &EditorProperty::_gui_input);
- ClassDB::bind_method(D_METHOD("_focusable_focused"), &EditorProperty::_focusable_focused);
ClassDB::bind_method(D_METHOD("get_tooltip_text"), &EditorProperty::get_tooltip_text);
@@ -828,13 +880,15 @@ void EditorProperty::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "checked"), "set_checked", "is_checked");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "draw_red"), "set_draw_red", "is_draw_red");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keying"), "set_keying", "is_keying");
- ADD_SIGNAL(MethodInfo("property_changed", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT)));
- ADD_SIGNAL(MethodInfo("multiple_properties_changed", PropertyInfo(Variant::POOL_STRING_ARRAY, "properties"), PropertyInfo(Variant::ARRAY, "value")));
- ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property")));
- ADD_SIGNAL(MethodInfo("property_keyed_with_value", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT)));
- ADD_SIGNAL(MethodInfo("property_checked", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::STRING, "bool")));
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deletable"), "set_deletable", "is_deletable");
+ ADD_SIGNAL(MethodInfo("property_changed", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT)));
+ ADD_SIGNAL(MethodInfo("multiple_properties_changed", PropertyInfo(Variant::PACKED_STRING_ARRAY, "properties"), PropertyInfo(Variant::ARRAY, "value")));
+ ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING_NAME, "property")));
+ ADD_SIGNAL(MethodInfo("property_deleted", PropertyInfo(Variant::STRING_NAME, "property")));
+ ADD_SIGNAL(MethodInfo("property_keyed_with_value", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT)));
+ ADD_SIGNAL(MethodInfo("property_checked", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::STRING, "bool")));
ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource")));
- ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::INT, "id")));
+ ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::INT, "id")));
ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "focusable_idx")));
MethodInfo vm;
@@ -843,9 +897,8 @@ void EditorProperty::_bind_methods() {
}
EditorProperty::EditorProperty() {
-
draw_top_bg = true;
- object = NULL;
+ object = nullptr;
split_ratio = 0.5;
selectable = true;
text_size = 0;
@@ -854,6 +907,7 @@ EditorProperty::EditorProperty() {
checked = false;
draw_red = false;
keying = false;
+ deletable = false;
keying_hover = false;
revert_hover = false;
check_hover = false;
@@ -862,22 +916,21 @@ EditorProperty::EditorProperty() {
property_usage = 0;
selected = false;
selected_focusable = -1;
- label_reference = NULL;
- bottom_editor = NULL;
+ label_reference = nullptr;
+ bottom_editor = nullptr;
}
+
////////////////////////////////////////////////
////////////////////////////////////////////////
void EditorInspectorPlugin::add_custom_control(Control *control) {
-
AddedEditor ae;
ae.property_editor = control;
added_editors.push_back(ae);
}
void EditorInspectorPlugin::add_property_editor(const String &p_for_property, Control *p_prop) {
-
- ERR_FAIL_COND(Object::cast_to<EditorProperty>(p_prop) == NULL);
+ ERR_FAIL_COND(Object::cast_to<EditorProperty>(p_prop) == nullptr);
AddedEditor ae;
ae.properties.push_back(p_for_property);
@@ -886,7 +939,6 @@ void EditorInspectorPlugin::add_property_editor(const String &p_for_property, Co
}
void EditorInspectorPlugin::add_property_editor_for_multiple_properties(const String &p_label, const Vector<String> &p_properties, Control *p_prop) {
-
AddedEditor ae;
ae.properties = p_properties;
ae.property_editor = p_prop;
@@ -895,28 +947,25 @@ void EditorInspectorPlugin::add_property_editor_for_multiple_properties(const St
}
bool EditorInspectorPlugin::can_handle(Object *p_object) {
-
if (get_script_instance()) {
return get_script_instance()->call("can_handle", p_object);
}
return false;
}
-void EditorInspectorPlugin::parse_begin(Object *p_object) {
+void EditorInspectorPlugin::parse_begin(Object *p_object) {
if (get_script_instance()) {
get_script_instance()->call("parse_begin", p_object);
}
}
void EditorInspectorPlugin::parse_category(Object *p_object, const String &p_parse_category) {
-
if (get_script_instance()) {
get_script_instance()->call("parse_category", p_object, p_parse_category);
}
}
-bool EditorInspectorPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
-
+bool EditorInspectorPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) {
if (get_script_instance()) {
Variant arg[6] = {
p_object, p_type, p_path, p_hint, p_hint_text, p_usage
@@ -925,20 +974,19 @@ bool EditorInspectorPlugin::parse_property(Object *p_object, Variant::Type p_typ
&arg[0], &arg[1], &arg[2], &arg[3], &arg[4], &arg[5]
};
- Variant::CallError err;
+ Callable::CallError err;
return get_script_instance()->call("parse_property", (const Variant **)&argptr, 6, err);
}
return false;
}
-void EditorInspectorPlugin::parse_end() {
+void EditorInspectorPlugin::parse_end() {
if (get_script_instance()) {
get_script_instance()->call("parse_end");
}
}
void EditorInspectorPlugin::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("add_custom_control", "control"), &EditorInspectorPlugin::add_custom_control);
ClassDB::bind_method(D_METHOD("add_property_editor", "property", "editor"), &EditorInspectorPlugin::add_property_editor);
ClassDB::bind_method(D_METHOD("add_property_editor_for_multiple_properties", "label", "properties", "editor"), &EditorInspectorPlugin::add_property_editor_for_multiple_properties);
@@ -973,13 +1021,11 @@ void EditorInspectorPlugin::_bind_methods() {
////////////////////////////////////////////////
void EditorInspectorCategory::_notification(int p_what) {
-
if (p_what == NOTIFICATION_DRAW) {
-
draw_rect(Rect2(Vector2(), get_size()), bg_color);
- Ref<Font> font = get_font("font", "Tree");
+ Ref<Font> font = get_theme_font("font", "Tree");
- int hs = get_constant("hseparation", "Tree");
+ int hs = get_theme_constant("hseparation", "Tree");
int w = font->get_string_size(label).width;
if (icon.is_valid()) {
@@ -993,28 +1039,36 @@ void EditorInspectorCategory::_notification(int p_what) {
ofs += hs + icon->get_width();
}
- Color color = get_color("font_color", "Tree");
+ Color color = get_theme_color("font_color", "Tree");
draw_string(font, Point2(ofs, font->get_ascent() + (get_size().height - font->get_height()) / 2).floor(), label, color, get_size().width);
}
}
Control *EditorInspectorCategory::make_custom_tooltip(const String &p_text) const {
-
tooltip_text = p_text;
EditorHelpBit *help_bit = memnew(EditorHelpBit);
- help_bit->add_style_override("panel", get_stylebox("panel", "TooltipPanel"));
+ help_bit->add_theme_style_override("panel", get_theme_stylebox("panel", "TooltipPanel"));
help_bit->get_rich_text()->set_fixed_size_to_width(360 * EDSCALE);
- String text = "[u][b]" + p_text.get_slice("::", 0) + "[/b][/u]\n";
- text += p_text.get_slice("::", 1).strip_edges();
- help_bit->set_text(text);
- help_bit->call_deferred("set_text", text); //hack so it uses proper theme once inside scene
+ PackedStringArray slices = p_text.split("::", false);
+ if (!slices.empty()) {
+ String property_name = slices[0].strip_edges();
+ String text = "[u][b]" + property_name + "[/b][/u]";
+
+ if (slices.size() > 1) {
+ String property_doc = slices[1].strip_edges();
+ if (property_name != property_doc) {
+ text += "\n" + property_doc;
+ }
+ }
+ help_bit->set_text(text); //hack so it uses proper theme once inside scene
+ }
+
return help_bit;
}
Size2 EditorInspectorCategory::get_minimum_size() const {
-
- Ref<Font> font = get_font("font", "Tree");
+ Ref<Font> font = get_theme_font("font", "Tree");
Size2 ms;
ms.width = 1;
@@ -1022,7 +1076,7 @@ Size2 EditorInspectorCategory::get_minimum_size() const {
if (icon.is_valid()) {
ms.height = MAX(icon->get_height(), ms.height);
}
- ms.height += get_constant("vseparation", "Tree");
+ ms.height += get_theme_constant("vseparation", "Tree");
return ms;
}
@@ -1032,7 +1086,6 @@ void EditorInspectorCategory::_bind_methods() {
}
String EditorInspectorCategory::get_tooltip_text() const {
-
return tooltip_text;
}
@@ -1043,7 +1096,6 @@ EditorInspectorCategory::EditorInspectorCategory() {
////////////////////////////////////////////////
void EditorInspectorSection::_test_unfold() {
-
if (!vbox_added) {
add_child(vbox);
vbox_added = true;
@@ -1051,17 +1103,15 @@ void EditorInspectorSection::_test_unfold() {
}
void EditorInspectorSection::_notification(int p_what) {
-
if (p_what == NOTIFICATION_SORT_CHILDREN) {
-
- Ref<Font> font = get_font("font", "Tree");
- Ref<Texture> arrow;
+ Ref<Font> font = get_theme_font("font", "Tree");
+ Ref<Texture2D> arrow;
if (foldable) {
if (object->editor_is_section_unfolded(section)) {
- arrow = get_icon("arrow", "Tree");
+ arrow = get_theme_icon("arrow", "Tree");
} else {
- arrow = get_icon("arrow_collapsed", "Tree");
+ arrow = get_theme_icon("arrow_collapsed", "Tree");
}
}
@@ -1072,21 +1122,23 @@ void EditorInspectorSection::_notification(int p_what) {
offset.y = MAX(offset.y, arrow->get_height());
}
- offset.y += get_constant("vseparation", "Tree");
- offset.x += get_constant("inspector_margin", "Editor");
+ offset.y += get_theme_constant("vseparation", "Tree");
+ offset.x += get_theme_constant("inspector_margin", "Editor");
Rect2 rect(offset, size - offset);
//set children
for (int i = 0; i < get_child_count(); i++) {
-
Control *c = Object::cast_to<Control>(get_child(i));
- if (!c)
+ if (!c) {
continue;
- if (c->is_set_as_toplevel())
+ }
+ if (c->is_set_as_toplevel()) {
continue;
- if (!c->is_visible_in_tree())
+ }
+ if (!c->is_visible_in_tree()) {
continue;
+ }
fit_child_in_rect(c, rect);
}
@@ -1095,63 +1147,103 @@ void EditorInspectorSection::_notification(int p_what) {
}
if (p_what == NOTIFICATION_DRAW) {
-
- Ref<Texture> arrow;
+ Ref<Texture2D> arrow;
if (foldable) {
if (object->editor_is_section_unfolded(section)) {
- arrow = get_icon("arrow", "Tree");
+ arrow = get_theme_icon("arrow", "Tree");
} else {
- arrow = get_icon("arrow_collapsed", "Tree");
+ arrow = get_theme_icon("arrow_collapsed", "Tree");
}
}
- Ref<Font> font = get_font("font", "Tree");
+ Ref<Font> font = get_theme_font("font", "Tree");
int h = font->get_height();
if (arrow.is_valid()) {
h = MAX(h, arrow->get_height());
}
- h += get_constant("vseparation", "Tree");
+ h += get_theme_constant("vseparation", "Tree");
draw_rect(Rect2(Vector2(), Vector2(get_size().width, h)), bg_color);
const int arrow_margin = 3;
- Color color = get_color("font_color", "Tree");
+ Color color = get_theme_color("font_color", "Tree");
draw_string(font, Point2(Math::round((16 + arrow_margin) * EDSCALE), font->get_ascent() + (h - font->get_height()) / 2).floor(), label, color, get_size().width);
if (arrow.is_valid()) {
draw_texture(arrow, Point2(Math::round(arrow_margin * EDSCALE), (h - arrow->get_height()) / 2).floor());
}
+
+ if (dropping && !vbox->is_visible_in_tree()) {
+ Color accent_color = get_theme_color("accent_color", "Editor");
+ draw_rect(Rect2(Point2(), get_size()), accent_color, false);
+ }
+ }
+
+ if (p_what == NOTIFICATION_DRAG_BEGIN) {
+ Dictionary dd = get_viewport()->gui_get_drag_data();
+
+ // Only allow dropping if the section contains properties which can take the dragged data.
+ bool children_can_drop = false;
+ for (int child_idx = 0; child_idx < vbox->get_child_count(); child_idx++) {
+ Control *editor_property = Object::cast_to<Control>(vbox->get_child(child_idx));
+
+ // Test can_drop_data and can_drop_data_fw, since can_drop_data only works if set up with forwarding or if script attached.
+ if (editor_property && (editor_property->can_drop_data(Point2(), dd) || editor_property->call("can_drop_data_fw", Point2(), dd, this))) {
+ children_can_drop = true;
+ break;
+ }
+ }
+
+ dropping = children_can_drop;
+ update();
+ }
+
+ if (p_what == NOTIFICATION_DRAG_END) {
+ dropping = false;
+ update();
+ }
+
+ if (p_what == NOTIFICATION_MOUSE_ENTER) {
+ if (dropping) {
+ dropping_unfold_timer->start();
+ }
+ }
+
+ if (p_what == NOTIFICATION_MOUSE_EXIT) {
+ if (dropping) {
+ dropping_unfold_timer->stop();
+ }
}
}
Size2 EditorInspectorSection::get_minimum_size() const {
-
Size2 ms;
for (int i = 0; i < get_child_count(); i++) {
-
Control *c = Object::cast_to<Control>(get_child(i));
- if (!c)
+ if (!c) {
continue;
- if (c->is_set_as_toplevel())
+ }
+ if (c->is_set_as_toplevel()) {
continue;
- if (!c->is_visible())
+ }
+ if (!c->is_visible()) {
continue;
+ }
Size2 minsize = c->get_combined_minimum_size();
ms.width = MAX(ms.width, minsize.width);
ms.height = MAX(ms.height, minsize.height);
}
- Ref<Font> font = get_font("font", "Tree");
- ms.height += font->get_height() + get_constant("vseparation", "Tree");
- ms.width += get_constant("inspector_margin", "Editor");
+ Ref<Font> font = get_theme_font("font", "Tree");
+ ms.height += font->get_height() + get_theme_constant("vseparation", "Tree");
+ ms.width += get_theme_constant("inspector_margin", "Editor");
return ms;
}
void EditorInspectorSection::setup(const String &p_section, const String &p_label, Object *p_object, const Color &p_bg_color, bool p_foldable) {
-
section = p_section;
label = p_label;
object = p_object;
@@ -1174,26 +1266,22 @@ void EditorInspectorSection::setup(const String &p_section, const String &p_labe
}
void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
-
- if (!foldable)
+ if (!foldable) {
return;
+ }
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
- Ref<Font> font = get_font("font", "Tree");
+ Ref<Font> font = get_theme_font("font", "Tree");
if (mb->get_position().y > font->get_height()) { //clicked outside
return;
}
- _test_unfold();
-
- bool unfold = !object->editor_is_section_unfolded(section);
- object->editor_set_section_unfold(section, unfold);
- if (unfold) {
- vbox->show();
+ bool should_unfold = !object->editor_is_section_unfolded(section);
+ if (should_unfold) {
+ unfold();
} else {
- vbox->hide();
+ fold();
}
}
}
@@ -1203,9 +1291,9 @@ VBoxContainer *EditorInspectorSection::get_vbox() {
}
void EditorInspectorSection::unfold() {
-
- if (!foldable)
+ if (!foldable) {
return;
+ }
_test_unfold();
@@ -1215,11 +1303,13 @@ void EditorInspectorSection::unfold() {
}
void EditorInspectorSection::fold() {
- if (!foldable)
+ if (!foldable) {
return;
+ }
- if (!vbox_added)
+ if (!vbox_added) {
return; //kinda pointless
+ }
object->editor_set_section_unfold(section, false);
vbox->hide();
@@ -1227,7 +1317,6 @@ void EditorInspectorSection::fold() {
}
void EditorInspectorSection::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("setup", "section", "label", "object", "bg_color", "foldable"), &EditorInspectorSection::setup);
ClassDB::bind_method(D_METHOD("get_vbox"), &EditorInspectorSection::get_vbox);
ClassDB::bind_method(D_METHOD("unfold"), &EditorInspectorSection::unfold);
@@ -1236,14 +1325,20 @@ void EditorInspectorSection::_bind_methods() {
}
EditorInspectorSection::EditorInspectorSection() {
- object = NULL;
+ object = nullptr;
foldable = false;
vbox = memnew(VBoxContainer);
vbox_added = false;
+
+ dropping = false;
+ dropping_unfold_timer = memnew(Timer);
+ dropping_unfold_timer->set_wait_time(0.6);
+ dropping_unfold_timer->set_one_shot(true);
+ add_child(dropping_unfold_timer);
+ dropping_unfold_timer->connect("timeout", callable_mp(this, &EditorInspectorSection::unfold));
}
EditorInspectorSection::~EditorInspectorSection() {
-
if (!vbox_added) {
memdelete(vbox);
}
@@ -1255,11 +1350,9 @@ EditorInspectorSection::~EditorInspectorSection() {
Ref<EditorInspectorPlugin> EditorInspector::inspector_plugins[MAX_PLUGINS];
int EditorInspector::inspector_plugin_count = 0;
-EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
-
+EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) {
for (int i = inspector_plugin_count - 1; i >= 0; i--) {
-
- inspector_plugins[i]->parse_property(p_object, p_type, p_path, p_hint, p_hint_text, p_usage);
+ inspector_plugins[i]->parse_property(p_object, p_type, p_path, p_hint, p_hint_text, p_usage, p_wide);
if (inspector_plugins[i]->added_editors.size()) {
for (int j = 1; j < inspector_plugins[i]->added_editors.size(); j++) { //only keep first one
memdelete(inspector_plugins[i]->added_editors[j].property_editor);
@@ -1267,7 +1360,6 @@ EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, V
EditorProperty *prop = Object::cast_to<EditorProperty>(inspector_plugins[i]->added_editors[0].property_editor);
if (prop) {
-
inspector_plugins[i]->added_editors.clear();
return prop;
} else {
@@ -1276,22 +1368,21 @@ EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, V
}
}
}
- return NULL;
+ return nullptr;
}
void EditorInspector::add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin) {
-
ERR_FAIL_COND(inspector_plugin_count == MAX_PLUGINS);
for (int i = 0; i < inspector_plugin_count; i++) {
- if (inspector_plugins[i] == p_plugin)
+ if (inspector_plugins[i] == p_plugin) {
return; //already exists
+ }
}
inspector_plugins[inspector_plugin_count++] = p_plugin;
}
void EditorInspector::remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin) {
-
ERR_FAIL_COND(inspector_plugin_count == MAX_PLUGINS);
int idx = -1;
@@ -1307,8 +1398,9 @@ void EditorInspector::remove_inspector_plugin(const Ref<EditorInspectorPlugin> &
inspector_plugins[i] = inspector_plugins[i + 1];
}
- if (idx == inspector_plugin_count - 1)
+ if (idx == inspector_plugin_count - 1) {
inspector_plugins[idx] = Ref<EditorInspectorPlugin>();
+ }
inspector_plugin_count--;
}
@@ -1325,31 +1417,27 @@ void EditorInspector::set_undo_redo(UndoRedo *p_undo_redo) {
}
String EditorInspector::get_selected_path() const {
-
return property_selected;
}
void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Ref<EditorInspectorPlugin> ped) {
-
for (List<EditorInspectorPlugin::AddedEditor>::Element *F = ped->added_editors.front(); F; F = F->next()) {
-
EditorProperty *ep = Object::cast_to<EditorProperty>(F->get().property_editor);
current_vbox->add_child(F->get().property_editor);
if (ep) {
-
ep->object = object;
- ep->connect("property_changed", this, "_property_changed");
- ep->connect("property_keyed", this, "_property_keyed");
- ep->connect("property_keyed_with_value", this, "_property_keyed_with_value");
- ep->connect("property_checked", this, "_property_checked");
- ep->connect("selected", this, "_property_selected");
- ep->connect("multiple_properties_changed", this, "_multiple_properties_changed");
- ep->connect("resource_selected", this, "_resource_selected", varray(), CONNECT_DEFERRED);
- ep->connect("object_id_selected", this, "_object_id_selected", varray(), CONNECT_DEFERRED);
+ ep->connect("property_changed", callable_mp(this, &EditorInspector::_property_changed));
+ ep->connect("property_keyed", callable_mp(this, &EditorInspector::_property_keyed));
+ ep->connect("property_deleted", callable_mp(this, &EditorInspector::_property_deleted), varray(), CONNECT_DEFERRED);
+ ep->connect("property_keyed_with_value", callable_mp(this, &EditorInspector::_property_keyed_with_value));
+ ep->connect("property_checked", callable_mp(this, &EditorInspector::_property_checked));
+ ep->connect("selected", callable_mp(this, &EditorInspector::_property_selected));
+ ep->connect("multiple_properties_changed", callable_mp(this, &EditorInspector::_multiple_properties_changed));
+ ep->connect("resource_selected", callable_mp(this, &EditorInspector::_resource_selected), varray(), CONNECT_DEFERRED);
+ ep->connect("object_id_selected", callable_mp(this, &EditorInspector::_object_id_selected), varray(), CONNECT_DEFERRED);
if (F->get().properties.size()) {
-
if (F->get().properties.size() == 1) {
//since it's one, associate:
ep->property = F->get().properties[0];
@@ -1373,13 +1461,13 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Ref<Edit
ep->set_read_only(read_only);
ep->update_property();
ep->update_reload_status();
+ ep->set_deletable(deletable_properties);
}
}
ped->added_editors.clear();
}
bool EditorInspector::_is_property_disabled_by_feature_profile(const StringName &p_property) {
-
Ref<EditorFeatureProfile> profile = EditorFeatureProfileManager::get_singleton()->get_current_profile();
if (profile.is_null()) {
return false;
@@ -1388,7 +1476,6 @@ bool EditorInspector::_is_property_disabled_by_feature_profile(const StringName
StringName class_name = object->get_class();
while (class_name != StringName()) {
-
if (profile->is_class_property_disabled(class_name, p_property)) {
return true;
}
@@ -1403,7 +1490,6 @@ bool EditorInspector::_is_property_disabled_by_feature_profile(const StringName
}
void EditorInspector::update_tree() {
-
//to update properly if all is refreshed
StringName current_selected = property_selected;
int current_focusable = -1;
@@ -1431,14 +1517,16 @@ void EditorInspector::update_tree() {
_clear();
- if (!object)
+ if (!object) {
return;
+ }
- List<Ref<EditorInspectorPlugin> > valid_plugins;
+ List<Ref<EditorInspectorPlugin>> valid_plugins;
for (int i = inspector_plugin_count - 1; i >= 0; i--) { //start by last, so lastly added can override newly added
- if (!inspector_plugins[i]->can_handle(object))
+ if (!inspector_plugins[i]->can_handle(object)) {
continue;
+ }
valid_plugins.push_back(inspector_plugins[i]);
}
@@ -1452,84 +1540,118 @@ void EditorInspector::update_tree() {
}
}
- // TreeItem *current_category = NULL;
+ // TreeItem *current_category = nullptr;
String filter = search_box ? search_box->get_text() : "";
String group;
String group_base;
- VBoxContainer *category_vbox = NULL;
+ String subgroup;
+ String subgroup_base;
+ VBoxContainer *category_vbox = nullptr;
- List<PropertyInfo>
- plist;
+ List<PropertyInfo> plist;
object->get_property_list(&plist, true);
+ _update_script_class_properties(*object, plist);
HashMap<String, VBoxContainer *> item_path;
Map<VBoxContainer *, EditorInspectorSection *> section_map;
item_path[""] = main_vbox;
- Color sscolor = get_color("prop_subsection", "Editor");
+ Color sscolor = get_theme_color("prop_subsection", "Editor");
- for (List<Ref<EditorInspectorPlugin> >::Element *E = valid_plugins.front(); E; E = E->next()) {
+ for (List<Ref<EditorInspectorPlugin>>::Element *E = valid_plugins.front(); E; E = E->next()) {
Ref<EditorInspectorPlugin> ped = E->get();
ped->parse_begin(object);
_parse_added_editors(main_vbox, ped);
}
for (List<PropertyInfo>::Element *I = plist.front(); I; I = I->next()) {
-
PropertyInfo &p = I->get();
//make sure the property can be edited
- if (p.usage & PROPERTY_USAGE_GROUP) {
+ if (p.usage & PROPERTY_USAGE_SUBGROUP) {
+ subgroup = p.name;
+ subgroup_base = p.hint_string;
+
+ continue;
+ } else if (p.usage & PROPERTY_USAGE_GROUP) {
group = p.name;
group_base = p.hint_string;
+ subgroup = "";
+ subgroup_base = "";
continue;
} else if (p.usage & PROPERTY_USAGE_CATEGORY) {
-
group = "";
group_base = "";
+ subgroup = "";
+ subgroup_base = "";
- if (!show_categories)
+ if (!show_categories) {
continue;
+ }
List<PropertyInfo>::Element *N = I->next();
bool valid = true;
//if no properties in category, skip
while (N) {
- if (N->get().usage & PROPERTY_USAGE_EDITOR)
+ if (N->get().usage & PROPERTY_USAGE_EDITOR) {
break;
+ }
if (N->get().usage & PROPERTY_USAGE_CATEGORY) {
valid = false;
break;
}
N = N->next();
}
- if (!valid)
+ if (!valid) {
continue; //empty, ignore
+ }
EditorInspectorCategory *category = memnew(EditorInspectorCategory);
main_vbox->add_child(category);
- category_vbox = NULL; //reset
+ category_vbox = nullptr; //reset
String type = p.name;
- category->icon = EditorNode::get_singleton()->get_class_icon(type, "Object");
+ if (!ClassDB::class_exists(type) && !ScriptServer::is_global_class(type) && p.hint_string.length() && FileAccess::exists(p.hint_string)) {
+ Ref<Script> s = ResourceLoader::load(p.hint_string, "Script");
+ String base_type;
+ if (s.is_valid()) {
+ base_type = s->get_instance_base_type();
+ }
+ while (s.is_valid()) {
+ StringName name = EditorNode::get_editor_data().script_class_get_name(s->get_path());
+ String icon_path = EditorNode::get_editor_data().script_class_get_icon_path(name);
+ if (name != StringName() && icon_path.length()) {
+ category->icon = ResourceLoader::load(icon_path, "Texture");
+ break;
+ }
+ s = s->get_base_script();
+ }
+ if (category->icon.is_null() && has_theme_icon(base_type, "EditorIcons")) {
+ category->icon = get_theme_icon(base_type, "EditorIcons");
+ }
+ }
+ if (category->icon.is_null()) {
+ if (type != String()) { // Can happen for built-in scripts.
+ category->icon = EditorNode::get_singleton()->get_class_icon(type, "Object");
+ }
+ }
category->label = type;
- category->bg_color = get_color("prop_category", "Editor");
+ category->bg_color = get_theme_color("prop_category", "Editor");
if (use_doc_hints) {
StringName type2 = p.name;
if (!class_descr_cache.has(type2)) {
-
String descr;
DocData *dd = EditorHelp::get_doc_data();
Map<String, DocData::ClassDoc>::Element *E = dd->class_list.find(type2);
if (E) {
- descr = E->get().brief_description;
+ descr = DTR(E->get().brief_description);
}
class_descr_cache[type2] = descr;
}
@@ -1537,7 +1659,7 @@ void EditorInspector::update_tree() {
category->set_tooltip(p.name + "::" + (class_descr_cache[type2] == "" ? "" : class_descr_cache[type2]));
}
- for (List<Ref<EditorInspectorPlugin> >::Element *E = valid_plugins.front(); E; E = E->next()) {
+ for (List<Ref<EditorInspectorPlugin>>::Element *E = valid_plugins.front(); E; E = E->next()) {
Ref<EditorInspectorPlugin> ped = E->get();
ped->parse_category(object, p.name);
_parse_added_editors(main_vbox, ped);
@@ -1545,34 +1667,51 @@ void EditorInspector::update_tree() {
continue;
- } else if (!(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name))
+ } else if (!(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name)) {
continue;
+ }
- if (p.usage & PROPERTY_USAGE_HIGH_END_GFX && VS::get_singleton()->is_low_end())
+ if (p.usage & PROPERTY_USAGE_HIGH_END_GFX && RS::get_singleton()->is_low_end()) {
continue; //do not show this property in low end gfx
+ }
if (p.name == "script" && (hide_script || bool(object->call("_hide_script_from_inspector")))) {
continue;
}
String basename = p.name;
+
+ if (subgroup != "") {
+ if (subgroup_base != "") {
+ if (basename.begins_with(subgroup_base)) {
+ basename = basename.replace_first(subgroup_base, "");
+ } else if (subgroup_base.begins_with(basename)) {
+ //keep it, this is used pretty often
+ } else {
+ subgroup = ""; //no longer using subgroup base, clear
+ }
+ }
+ }
if (group != "") {
- if (group_base != "") {
+ if (group_base != "" && subgroup == "") {
if (basename.begins_with(group_base)) {
basename = basename.replace_first(group_base, "");
} else if (group_base.begins_with(basename)) {
//keep it, this is used pretty often
} else {
group = ""; //no longer using group base, clear
+ subgroup = "";
}
}
}
-
+ if (subgroup != "") {
+ basename = subgroup + "/" + basename;
+ }
if (group != "") {
basename = group + "/" + basename;
}
- String name = (basename.find("/") != -1) ? basename.right(basename.find_last("/") + 1) : basename;
+ String name = (basename.find("/") != -1) ? basename.right(basename.rfind("/") + 1) : basename;
if (capitalize_paths) {
int dot = name.find(".");
@@ -1587,20 +1726,21 @@ void EditorInspector::update_tree() {
}
}
- String path = basename.left(basename.find_last("/"));
+ String path = basename.left(basename.rfind("/"));
if (use_filter && filter != "") {
-
String cat = path;
- if (capitalize_paths)
+ if (capitalize_paths) {
cat = cat.capitalize();
+ }
- if (!filter.is_subsequence_ofi(cat) && !filter.is_subsequence_ofi(name) && property_prefix.to_lower().find(filter.to_lower()) == -1)
+ if (!filter.is_subsequence_ofi(cat) && !filter.is_subsequence_ofi(name) && property_prefix.to_lower().find(filter.to_lower()) == -1) {
continue;
+ }
}
- if (category_vbox == NULL) {
+ if (category_vbox == nullptr) {
category_vbox = memnew(VBoxContainer);
main_vbox->add_child(category_vbox);
}
@@ -1608,21 +1748,22 @@ void EditorInspector::update_tree() {
VBoxContainer *current_vbox = main_vbox;
{
-
String acc_path = "";
int level = 1;
for (int i = 0; i < path.get_slice_count("/"); i++) {
String path_name = path.get_slice("/", i);
- if (i > 0)
+ if (i > 0) {
acc_path += "/";
+ }
acc_path += path_name;
if (!item_path.has(acc_path)) {
EditorInspectorSection *section = memnew(EditorInspectorSection);
current_vbox->add_child(section);
sections.push_back(section);
- if (capitalize_paths)
+ if (capitalize_paths) {
path_name = path_name.capitalize();
+ }
Color c = sscolor;
c.a /= level;
@@ -1638,7 +1779,7 @@ void EditorInspector::update_tree() {
if (current_vbox == main_vbox) {
//do not add directly to the main vbox, given it has no spacing
- if (category_vbox == NULL) {
+ if (category_vbox == nullptr) {
category_vbox = memnew(VBoxContainer);
}
current_vbox = category_vbox;
@@ -1659,7 +1800,6 @@ void EditorInspector::update_tree() {
String doc_hint;
if (use_doc_hints) {
-
StringName classname = object->get_class_name();
if (object_class != String()) {
classname = object_class;
@@ -1668,7 +1808,7 @@ void EditorInspector::update_tree() {
String descr;
bool found = false;
- Map<StringName, Map<StringName, String> >::Element *E = descr_cache.find(classname);
+ Map<StringName, Map<StringName, String>>::Element *E = descr_cache.find(classname);
if (E) {
Map<StringName, String>::Element *F = E->get().find(propname);
if (F) {
@@ -1683,10 +1823,22 @@ void EditorInspector::update_tree() {
while (F && descr == String()) {
for (int i = 0; i < F->get().properties.size(); i++) {
if (F->get().properties[i].name == propname.operator String()) {
- descr = F->get().properties[i].description.strip_edges();
+ descr = DTR(F->get().properties[i].description);
break;
}
}
+
+ Vector<String> slices = propname.operator String().split("/");
+ if (slices.size() == 2 && slices[0].begins_with("custom_")) {
+ // Likely a theme property.
+ for (int i = 0; i < F->get().theme_properties.size(); i++) {
+ if (F->get().theme_properties[i].name == slices[1]) {
+ descr = DTR(F->get().theme_properties[i].description);
+ break;
+ }
+ }
+ }
+
if (!F->get().inherits.empty()) {
F = dd->class_list.find(F->get().inherits);
} else {
@@ -1699,15 +1851,14 @@ void EditorInspector::update_tree() {
doc_hint = descr;
}
- for (List<Ref<EditorInspectorPlugin> >::Element *E = valid_plugins.front(); E; E = E->next()) {
+ for (List<Ref<EditorInspectorPlugin>>::Element *E = valid_plugins.front(); E; E = E->next()) {
Ref<EditorInspectorPlugin> ped = E->get();
- bool exclusive = ped->parse_property(object, p.type, p.name, p.hint, p.hint_string, p.usage);
+ bool exclusive = ped->parse_property(object, p.type, p.name, p.hint, p.hint_string, p.usage, wide_editors);
List<EditorInspectorPlugin::AddedEditor> editors = ped->added_editors; //make a copy, since plugins may be used again in a sub-inspector
ped->added_editors.clear();
for (List<EditorInspectorPlugin::AddedEditor>::Element *F = editors.front(); F; F = F->next()) {
-
EditorProperty *ep = Object::cast_to<EditorProperty>(F->get().property_editor);
if (ep) {
@@ -1715,7 +1866,6 @@ void EditorInspector::update_tree() {
ep->object = object;
if (F->get().properties.size()) {
-
if (F->get().properties.size() == 1) {
//since it's one, associate:
ep->property = F->get().properties[0];
@@ -1745,23 +1895,24 @@ void EditorInspector::update_tree() {
ep->set_keying(keying);
ep->set_read_only(read_only);
+ ep->set_deletable(deletable_properties);
}
current_vbox->add_child(F->get().property_editor);
if (ep) {
-
- ep->connect("property_changed", this, "_property_changed");
+ ep->connect("property_changed", callable_mp(this, &EditorInspector::_property_changed));
if (p.usage & PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED) {
- ep->connect("property_changed", this, "_property_changed_update_all", varray(), CONNECT_DEFERRED);
+ ep->connect("property_changed", callable_mp(this, &EditorInspector::_property_changed_update_all), varray(), CONNECT_DEFERRED);
}
- ep->connect("property_keyed", this, "_property_keyed");
- ep->connect("property_keyed_with_value", this, "_property_keyed_with_value");
- ep->connect("property_checked", this, "_property_checked");
- ep->connect("selected", this, "_property_selected");
- ep->connect("multiple_properties_changed", this, "_multiple_properties_changed");
- ep->connect("resource_selected", this, "_resource_selected", varray(), CONNECT_DEFERRED);
- ep->connect("object_id_selected", this, "_object_id_selected", varray(), CONNECT_DEFERRED);
+ ep->connect("property_keyed", callable_mp(this, &EditorInspector::_property_keyed));
+ ep->connect("property_deleted", callable_mp(this, &EditorInspector::_property_deleted), varray(), CONNECT_DEFERRED);
+ ep->connect("property_keyed_with_value", callable_mp(this, &EditorInspector::_property_keyed_with_value));
+ ep->connect("property_checked", callable_mp(this, &EditorInspector::_property_checked));
+ ep->connect("selected", callable_mp(this, &EditorInspector::_property_selected));
+ ep->connect("multiple_properties_changed", callable_mp(this, &EditorInspector::_multiple_properties_changed));
+ ep->connect("resource_selected", callable_mp(this, &EditorInspector::_resource_selected), varray(), CONNECT_DEFERRED);
+ ep->connect("object_id_selected", callable_mp(this, &EditorInspector::_object_id_selected), varray(), CONNECT_DEFERRED);
if (doc_hint != String()) {
ep->set_tooltip(property_prefix + p.name + "::" + doc_hint);
} else {
@@ -1782,7 +1933,7 @@ void EditorInspector::update_tree() {
}
}
- for (List<Ref<EditorInspectorPlugin> >::Element *E = valid_plugins.front(); E; E = E->next()) {
+ for (List<Ref<EditorInspectorPlugin>>::Element *E = valid_plugins.front(); E; E = E->next()) {
Ref<EditorInspectorPlugin> ped = E->get();
ped->parse_end();
_parse_added_editors(main_vbox, ped);
@@ -1790,9 +1941,11 @@ void EditorInspector::update_tree() {
//see if this property exists and should be kept
}
+
void EditorInspector::update_property(const String &p_prop) {
- if (!editor_property_map.has(p_prop))
+ if (!editor_property_map.has(p_prop)) {
return;
+ }
for (List<EditorProperty *>::Element *E = editor_property_map[p_prop].front(); E; E = E->next()) {
E->get()->update_property();
@@ -1801,7 +1954,6 @@ void EditorInspector::update_property(const String &p_prop) {
}
void EditorInspector::_clear() {
-
while (main_vbox->get_child_count()) {
memdelete(main_vbox->get_child(0));
}
@@ -1814,9 +1966,9 @@ void EditorInspector::_clear() {
}
void EditorInspector::refresh() {
-
- if (refresh_countdown > 0 || changing)
+ if (refresh_countdown > 0 || changing) {
return;
+ }
refresh_countdown = EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval");
}
@@ -1825,10 +1977,10 @@ Object *EditorInspector::get_edited_object() {
}
void EditorInspector::edit(Object *p_object) {
- if (object == p_object)
+ if (object == p_object) {
return;
+ }
if (object) {
-
_clear();
object->remove_change_receptor(this);
}
@@ -1846,20 +1998,22 @@ void EditorInspector::edit(Object *p_object) {
}
void EditorInspector::set_keying(bool p_active) {
- if (keying == p_active)
+ if (keying == p_active) {
return;
+ }
keying = p_active;
update_tree();
}
+
void EditorInspector::set_read_only(bool p_read_only) {
read_only = p_read_only;
update_tree();
}
bool EditorInspector::is_capitalize_paths_enabled() const {
-
return capitalize_paths;
}
+
void EditorInspector::set_enable_capitalize_paths(bool p_capitalize) {
capitalize_paths = p_capitalize;
update_tree();
@@ -1878,22 +2032,25 @@ void EditorInspector::set_use_doc_hints(bool p_enable) {
use_doc_hints = p_enable;
update_tree();
}
+
void EditorInspector::set_hide_script(bool p_hide) {
hide_script = p_hide;
update_tree();
}
+
void EditorInspector::set_use_filter(bool p_use) {
use_filter = p_use;
update_tree();
}
+
void EditorInspector::register_text_enter(Node *p_line_edit) {
search_box = Object::cast_to<LineEdit>(p_line_edit);
- if (search_box)
- search_box->connect("text_changed", this, "_filter_changed");
+ if (search_box) {
+ search_box->connect("text_changed", callable_mp(this, &EditorInspector::_filter_changed));
+ }
}
void EditorInspector::_filter_changed(const String &p_text) {
-
_clear();
update_tree();
}
@@ -1908,12 +2065,11 @@ bool EditorInspector::is_using_folding() {
}
void EditorInspector::collapse_all_folding() {
-
for (List<EditorInspectorSection *>::Element *E = sections.front(); E; E = E->next()) {
E->get()->fold();
}
- for (Map<StringName, List<EditorProperty *> >::Element *F = editor_property_map.front(); F; F = F->next()) {
+ for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
for (List<EditorProperty *>::Element *E = F->get().front(); E; E = E->next()) {
E->get()->collapse_all_folding();
}
@@ -1924,7 +2080,7 @@ void EditorInspector::expand_all_folding() {
for (List<EditorInspectorSection *>::Element *E = sections.front(); E; E = E->next()) {
E->get()->unfold();
}
- for (Map<StringName, List<EditorProperty *> >::Element *F = editor_property_map.front(); F; F = F->next()) {
+ for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
for (List<EditorProperty *>::Element *E = F->get().front(); E; E = E->next()) {
E->get()->expand_all_folding();
}
@@ -1939,36 +2095,44 @@ int EditorInspector::get_scroll_offset() const {
return get_v_scroll();
}
-void EditorInspector::set_sub_inspector(bool p_enable) {
+void EditorInspector::set_use_wide_editors(bool p_enable) {
+ wide_editors = p_enable;
+}
+void EditorInspector::set_sub_inspector(bool p_enable) {
sub_inspector = p_enable;
- if (!is_inside_tree())
+ if (!is_inside_tree()) {
return;
+ }
if (sub_inspector) {
- add_style_override("bg", get_stylebox("sub_inspector_bg", "Editor"));
+ add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg", "Editor"));
} else {
- add_style_override("bg", get_stylebox("bg", "Tree"));
+ add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
}
}
-void EditorInspector::_edit_request_change(Object *p_object, const String &p_property) {
+void EditorInspector::set_use_deletable_properties(bool p_enabled) {
+ deletable_properties = p_enabled;
+}
- if (object != p_object) //may be undoing/redoing for a non edited object, so ignore
+void EditorInspector::_edit_request_change(Object *p_object, const String &p_property) {
+ if (object != p_object) { //may be undoing/redoing for a non edited object, so ignore
return;
+ }
- if (changing)
+ if (changing) {
return;
+ }
- if (p_property == String())
+ if (p_property == String()) {
update_tree_pending = true;
- else {
+ } else {
pending.insert(p_property);
}
}
void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all, const String &p_changed_field) {
-
if (autoclear && editor_property_map.has(p_name)) {
for (List<EditorProperty *>::Element *E = editor_property_map[p_name].front(); E; E = E->next()) {
if (E->get()->is_checkable()) {
@@ -1978,22 +2142,20 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo
}
if (!undo_redo || bool(object->call("_dont_undo_redo"))) {
-
object->set(p_name, p_value);
- if (p_refresh_all)
+ if (p_refresh_all) {
_edit_request_change(object, "");
- else
+ } else {
_edit_request_change(object, p_name);
+ }
emit_signal(_prop_edited, p_name);
} else if (Object::cast_to<MultiNodeEdit>(object)) {
-
Object::cast_to<MultiNodeEdit>(object)->set_property_field(p_name, p_value, p_changed_field);
_edit_request_change(object, p_name);
emit_signal(_prop_edited, p_name);
} else {
-
undo_redo->create_action(TTR("Set") + " " + p_name, UndoRedo::MERGE_ENDS);
undo_redo->add_do_property(object, p_name, p_value);
undo_redo->add_undo_property(object, p_name, object->get(p_name));
@@ -2002,14 +2164,12 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo
undo_redo->add_do_method(this, "_edit_request_change", object, "");
undo_redo->add_undo_method(this, "_edit_request_change", object, "");
} else {
-
undo_redo->add_do_method(this, "_edit_request_change", object, p_name);
undo_redo->add_undo_method(this, "_edit_request_change", object, p_name);
}
Resource *r = Object::cast_to<Resource>(object);
if (r) {
-
if (String(p_name) == "resource_local_to_scene") {
bool prev = object->get(p_name);
bool next = p_value;
@@ -2033,17 +2193,18 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo
}
}
-void EditorInspector::_property_changed(const String &p_path, const Variant &p_value, const String &p_name, bool changing) {
-
+void EditorInspector::_property_changed(const String &p_path, const Variant &p_value, const String &p_name, bool p_changing) {
// The "changing" variable must be true for properties that trigger events as typing occurs,
- // like "text_changed" signal. eg: Text property of Label, Button, RichTextLabel, etc.
- if (changing)
+ // like "text_changed" signal. E.g. text property of Label, Button, RichTextLabel, etc.
+ if (p_changing) {
this->changing++;
+ }
_edit_set(p_path, p_value, false, p_name);
- if (changing)
+ if (p_changing) {
this->changing--;
+ }
if (restart_request_props.has(p_path)) {
emit_signal("restart_requested");
@@ -2055,13 +2216,13 @@ void EditorInspector::_property_changed_update_all(const String &p_path, const V
}
void EditorInspector::_multiple_properties_changed(Vector<String> p_paths, Array p_values) {
-
ERR_FAIL_COND(p_paths.size() == 0 || p_values.size() == 0);
ERR_FAIL_COND(p_paths.size() != p_values.size());
String names;
for (int i = 0; i < p_paths.size(); i++) {
- if (i > 0)
+ if (i > 0) {
names += ",";
+ }
names += p_paths[i];
}
undo_redo->create_action(TTR("Set Multiple:") + " " + names, UndoRedo::MERGE_ENDS);
@@ -2077,40 +2238,47 @@ void EditorInspector::_multiple_properties_changed(Vector<String> p_paths, Array
}
void EditorInspector::_property_keyed(const String &p_path, bool p_advance) {
-
- if (!object)
+ if (!object) {
return;
+ }
emit_signal("property_keyed", p_path, object->get(p_path), p_advance); //second param is deprecated
}
-void EditorInspector::_property_keyed_with_value(const String &p_path, const Variant &p_value, bool p_advance) {
+void EditorInspector::_property_deleted(const String &p_path) {
+ print_line("deleted pressed?");
+ if (!object) {
+ return;
+ }
- if (!object)
+ emit_signal("property_deleted", p_path); //second param is deprecated
+}
+
+void EditorInspector::_property_keyed_with_value(const String &p_path, const Variant &p_value, bool p_advance) {
+ if (!object) {
return;
+ }
emit_signal("property_keyed", p_path, p_value, p_advance); //second param is deprecated
}
void EditorInspector::_property_checked(const String &p_path, bool p_checked) {
-
- if (!object)
+ if (!object) {
return;
+ }
//property checked
if (autoclear) {
-
if (!p_checked) {
object->set(p_path, Variant());
} else {
-
Variant to_create;
List<PropertyInfo> pinfo;
object->get_property_list(&pinfo);
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
if (E->get().name == p_path) {
- Variant::CallError ce;
- to_create = Variant::construct(E->get().type, NULL, 0, ce);
+ Callable::CallError ce;
+ to_create = Variant::construct(E->get().type, nullptr, 0, ce);
break;
}
}
@@ -2130,16 +2298,17 @@ void EditorInspector::_property_checked(const String &p_path, bool p_checked) {
}
void EditorInspector::_property_selected(const String &p_path, int p_focusable) {
-
property_selected = p_path;
property_focusable = p_focusable;
//deselect the others
- for (Map<StringName, List<EditorProperty *> >::Element *F = editor_property_map.front(); F; F = F->next()) {
- if (F->key() == property_selected)
+ for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
+ if (F->key() == property_selected) {
continue;
+ }
for (List<EditorProperty *>::Element *E = F->get().front(); E; E = E->next()) {
- if (E->get()->is_selected())
+ if (E->get()->is_selected()) {
E->get()->deselect();
+ }
}
}
@@ -2147,7 +2316,6 @@ void EditorInspector::_property_selected(const String &p_path, int p_focusable)
}
void EditorInspector::_object_id_selected(const String &p_path, ObjectID p_id) {
-
emit_signal("object_id_selected", p_id);
}
@@ -2156,40 +2324,35 @@ void EditorInspector::_resource_selected(const String &p_path, RES p_resource) {
}
void EditorInspector::_node_removed(Node *p_node) {
-
if (p_node == object) {
- edit(NULL);
+ edit(nullptr);
}
}
void EditorInspector::_notification(int p_what) {
-
if (p_what == NOTIFICATION_READY) {
- EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", this, "_feature_profile_changed");
+ EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &EditorInspector::_feature_profile_changed));
}
if (p_what == NOTIFICATION_ENTER_TREE) {
-
if (sub_inspector) {
- add_style_override("bg", get_stylebox("sub_inspector_bg", "Editor"));
+ add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg", "Editor"));
} else {
- add_style_override("bg", get_stylebox("bg", "Tree"));
- get_tree()->connect("node_removed", this, "_node_removed");
+ add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
+ get_tree()->connect("node_removed", callable_mp(this, &EditorInspector::_node_removed));
}
}
if (p_what == NOTIFICATION_PREDELETE) {
- edit(NULL); //just in case
+ edit(nullptr); //just in case
}
if (p_what == NOTIFICATION_EXIT_TREE) {
-
if (!sub_inspector) {
- get_tree()->disconnect("node_removed", this, "_node_removed");
+ get_tree()->disconnect("node_removed", callable_mp(this, &EditorInspector::_node_removed));
}
- edit(NULL);
+ edit(nullptr);
}
if (p_what == NOTIFICATION_PROCESS) {
-
if (update_scroll_request >= 0) {
get_v_scrollbar()->call_deferred("set_value", update_scroll_request);
update_scroll_request = -1;
@@ -2197,7 +2360,7 @@ void EditorInspector::_notification(int p_what) {
if (refresh_countdown > 0) {
refresh_countdown -= get_process_delta_time();
if (refresh_countdown <= 0) {
- for (Map<StringName, List<EditorProperty *> >::Element *F = editor_property_map.front(); F; F = F->next()) {
+ for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) {
for (List<EditorProperty *>::Element *E = F->get().front(); E; E = E->next()) {
E->get()->update_property();
E->get()->update_reload_status();
@@ -2209,13 +2372,11 @@ void EditorInspector::_notification(int p_what) {
changing++;
if (update_tree_pending) {
-
update_tree();
update_tree_pending = false;
pending.clear();
} else {
-
while (pending.size()) {
StringName prop = pending.front()->get();
if (editor_property_map.has(prop)) {
@@ -2232,11 +2393,10 @@ void EditorInspector::_notification(int p_what) {
}
if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-
if (sub_inspector) {
- add_style_override("bg", get_stylebox("sub_inspector_bg", "Editor"));
+ add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg", "Editor"));
} else if (is_inside_tree()) {
- add_style_override("bg", get_stylebox("bg", "Tree"));
+ add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
}
update_tree();
@@ -2249,9 +2409,9 @@ void EditorInspector::_changed_callback(Object *p_changed, const char *p_prop) {
}
void EditorInspector::_vscroll_changed(double p_offset) {
-
- if (update_scroll_request >= 0) //waiting, do nothing
+ if (update_scroll_request >= 0) { //waiting, do nothing
return;
+ }
if (object) {
scroll_cache[object->get_instance_id()] = p_offset;
@@ -2275,32 +2435,104 @@ String EditorInspector::get_object_class() const {
}
void EditorInspector::_feature_profile_changed() {
-
update_tree();
}
-void EditorInspector::_bind_methods() {
+void EditorInspector::_update_script_class_properties(const Object &p_object, List<PropertyInfo> &r_list) const {
+ Ref<Script> script = p_object.get_script();
+ if (script.is_null()) {
+ return;
+ }
+
+ List<StringName> classes;
+ Map<StringName, String> paths;
+
+ // NodeC -> NodeB -> NodeA
+ while (script.is_valid()) {
+ String n = EditorNode::get_editor_data().script_class_get_name(script->get_path());
+ if (n.length()) {
+ classes.push_front(n);
+ } else if (script->get_path() != String() && script->get_path().find("::") == -1) {
+ n = script->get_path().get_file();
+ classes.push_front(n);
+ } else {
+ n = TTR("Built-in script");
+ classes.push_front(n);
+ }
+ paths[n] = script->get_path();
+ script = script->get_base_script();
+ }
- ClassDB::bind_method("_property_changed", &EditorInspector::_property_changed, DEFVAL(""), DEFVAL(false));
- ClassDB::bind_method("_multiple_properties_changed", &EditorInspector::_multiple_properties_changed);
- ClassDB::bind_method("_property_changed_update_all", &EditorInspector::_property_changed_update_all);
+ if (classes.empty()) {
+ return;
+ }
+
+ // Script Variables -> to insert: NodeC..B..A -> bottom (insert_here)
+ List<PropertyInfo>::Element *script_variables = NULL;
+ List<PropertyInfo>::Element *bottom = NULL;
+ List<PropertyInfo>::Element *insert_here = NULL;
+ for (List<PropertyInfo>::Element *E = r_list.front(); E; E = E->next()) {
+ PropertyInfo &pi = E->get();
+ if (pi.name != "Script Variables") {
+ continue;
+ }
+ script_variables = E;
+ bottom = r_list.insert_after(script_variables, PropertyInfo());
+ insert_here = bottom;
+ break;
+ }
+ Set<StringName> added;
+ for (List<StringName>::Element *E = classes.front(); E; E = E->next()) {
+ StringName name = E->get();
+ String path = paths[name];
+ Ref<Script> s;
+ if (path == String()) {
+ // Built-in script. It can't be inherited, so must be the script attached to the object.
+ s = p_object.get_script();
+ } else {
+ s = ResourceLoader::load(path, "Script");
+ }
+ ERR_FAIL_COND(!s->is_valid());
+ List<PropertyInfo> props;
+ s->get_script_property_list(&props);
+
+ // Script Variables -> NodeA -> bottom (insert_here)
+ List<PropertyInfo>::Element *category = r_list.insert_before(insert_here, PropertyInfo(Variant::NIL, name, PROPERTY_HINT_NONE, path, PROPERTY_USAGE_CATEGORY));
+
+ // Script Variables -> NodeA -> A props... -> bottom (insert_here)
+ for (List<PropertyInfo>::Element *P = props.front(); P; P = P->next()) {
+ PropertyInfo &pi = P->get();
+ if (added.has(pi.name)) {
+ continue;
+ }
+ added.insert(pi.name);
+
+ r_list.insert_before(insert_here, pi);
+ }
+
+ // Script Variables -> NodeA (insert_here) -> A props... -> bottom
+ insert_here = category;
+ }
+
+ // NodeC -> C props... -> NodeB..C..
+ r_list.erase(script_variables);
+ List<PropertyInfo>::Element *to_delete = bottom->next();
+ while (to_delete && !(to_delete->get().usage & PROPERTY_USAGE_CATEGORY)) {
+ r_list.erase(to_delete);
+ to_delete = bottom->next();
+ }
+ r_list.erase(bottom);
+}
+
+void EditorInspector::_bind_methods() {
ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change);
- ClassDB::bind_method("_node_removed", &EditorInspector::_node_removed);
- ClassDB::bind_method("_filter_changed", &EditorInspector::_filter_changed);
- ClassDB::bind_method("_property_keyed", &EditorInspector::_property_keyed);
- ClassDB::bind_method("_property_keyed_with_value", &EditorInspector::_property_keyed_with_value);
- ClassDB::bind_method("_property_checked", &EditorInspector::_property_checked);
- ClassDB::bind_method("_property_selected", &EditorInspector::_property_selected);
- ClassDB::bind_method("_resource_selected", &EditorInspector::_resource_selected);
- ClassDB::bind_method("_object_id_selected", &EditorInspector::_object_id_selected);
- ClassDB::bind_method("_vscroll_changed", &EditorInspector::_vscroll_changed);
- ClassDB::bind_method("_feature_profile_changed", &EditorInspector::_feature_profile_changed);
ClassDB::bind_method("refresh", &EditorInspector::refresh);
ADD_SIGNAL(MethodInfo("property_selected", PropertyInfo(Variant::STRING, "property")));
ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property")));
+ ADD_SIGNAL(MethodInfo("property_deleted", PropertyInfo(Variant::STRING, "property")));
ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "res"), PropertyInfo(Variant::STRING, "prop")));
ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::INT, "id")));
ADD_SIGNAL(MethodInfo("property_edited", PropertyInfo(Variant::STRING, "property")));
@@ -2309,15 +2541,16 @@ void EditorInspector::_bind_methods() {
}
EditorInspector::EditorInspector() {
- object = NULL;
- undo_redo = NULL;
+ object = nullptr;
+ undo_redo = nullptr;
main_vbox = memnew(VBoxContainer);
main_vbox->set_h_size_flags(SIZE_EXPAND_FILL);
- main_vbox->add_constant_override("separation", 0);
+ main_vbox->add_theme_constant_override("separation", 0);
add_child(main_vbox);
set_enable_h_scroll(false);
set_enable_v_scroll(true);
+ wide_editors = false;
show_categories = false;
hide_script = true;
use_doc_hints = false;
@@ -2330,13 +2563,14 @@ EditorInspector::EditorInspector() {
update_tree_pending = false;
refresh_countdown = 0;
read_only = false;
- search_box = NULL;
+ search_box = nullptr;
keying = false;
_prop_edited = "property_edited";
set_process(true);
property_focusable = -1;
sub_inspector = false;
+ deletable_properties = false;
- get_v_scrollbar()->connect("value_changed", this, "_vscroll_changed");
+ get_v_scrollbar()->connect("value_changed", callable_mp(this, &EditorInspector::_vscroll_changed));
update_scroll_request = -1;
}
diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h
index 792247138e..36b80a7dd4 100644
--- a/editor/editor_inspector.h
+++ b/editor/editor_inspector.h
@@ -47,7 +47,6 @@ public:
};
class EditorProperty : public Container {
-
GDCLASS(EditorProperty, Container);
private:
@@ -64,6 +63,7 @@ private:
bool checked;
bool draw_red;
bool keying;
+ bool deletable;
Rect2 right_child_rect;
Rect2 bottom_child_rect;
@@ -74,6 +74,8 @@ private:
bool revert_hover;
Rect2 check_rect;
bool check_hover;
+ Rect2 delete_rect;
+ bool delete_hover;
bool can_revert;
@@ -105,7 +107,7 @@ protected:
public:
void emit_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field = StringName(), bool p_changing = false);
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void set_label(const String &p_label);
String get_label() const;
@@ -133,6 +135,8 @@ public:
void set_keying(bool p_keying);
bool is_keying() const;
+ void set_deletable(bool p_enable);
+ bool is_deletable() const;
void add_focusable(Control *p_control);
void select(int p_focusable = -1);
void deselect();
@@ -147,7 +151,7 @@ public:
virtual void expand_all_folding();
virtual void collapse_all_folding();
- virtual Variant get_drag_data(const Point2 &p_point);
+ virtual Variant get_drag_data(const Point2 &p_point) override;
void set_selectable(bool p_selectable);
bool is_selectable() const;
@@ -156,7 +160,7 @@ public:
float get_name_split_ratio() const;
void set_object_and_property(Object *p_object, const StringName &p_property);
- virtual Control *make_custom_tooltip(const String &p_text) const;
+ virtual Control *make_custom_tooltip(const String &p_text) const override;
String get_tooltip_text() const;
@@ -190,7 +194,7 @@ public:
virtual bool can_handle(Object *p_object);
virtual void parse_begin(Object *p_object);
virtual void parse_category(Object *p_object, const String &p_parse_category);
- virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage);
+ virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false);
virtual void parse_end();
};
@@ -198,7 +202,7 @@ class EditorInspectorCategory : public Control {
GDCLASS(EditorInspectorCategory, Control);
friend class EditorInspector;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
String label;
Color bg_color;
mutable String tooltip_text;
@@ -208,8 +212,8 @@ protected:
static void _bind_methods();
public:
- virtual Size2 get_minimum_size() const;
- virtual Control *make_custom_tooltip(const String &p_text) const;
+ virtual Size2 get_minimum_size() const override;
+ virtual Control *make_custom_tooltip(const String &p_text) const override;
String get_tooltip_text() const;
@@ -227,6 +231,9 @@ class EditorInspectorSection : public Container {
Color bg_color;
bool foldable;
+ Timer *dropping_unfold_timer;
+ bool dropping;
+
void _test_unfold();
protected:
@@ -235,7 +242,7 @@ protected:
void _gui_input(const Ref<InputEvent> &p_event);
public:
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void setup(const String &p_section, const String &p_label, Object *p_object, const Color &p_bg_color, bool p_foldable);
VBoxContainer *get_vbox();
@@ -261,7 +268,7 @@ class EditorInspector : public ScrollContainer {
VBoxContainer *main_vbox;
//map use to cache the instanced editors
- Map<StringName, List<EditorProperty *> > editor_property_map;
+ Map<StringName, List<EditorProperty *>> editor_property_map;
List<EditorInspectorSection *> sections;
Set<StringName> pending;
@@ -283,6 +290,8 @@ class EditorInspector : public ScrollContainer {
bool read_only;
bool keying;
bool sub_inspector;
+ bool wide_editors;
+ bool deletable_properties;
float refresh_countdown;
bool update_tree_pending;
@@ -291,7 +300,7 @@ class EditorInspector : public ScrollContainer {
int property_focusable;
int update_scroll_request;
- Map<StringName, Map<StringName, String> > descr_cache;
+ Map<StringName, Map<StringName, String>> descr_cache;
Map<StringName, String> class_descr_cache;
Set<StringName> restart_request_props;
@@ -302,11 +311,12 @@ class EditorInspector : public ScrollContainer {
void _edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all, const String &p_changed_field);
- void _property_changed(const String &p_path, const Variant &p_value, const String &p_name = "", bool changing = false);
+ void _property_changed(const String &p_path, const Variant &p_value, const String &p_name = "", bool p_changing = false);
void _property_changed_update_all(const String &p_path, const Variant &p_value, const String &p_name = "", bool p_changing = false);
void _multiple_properties_changed(Vector<String> p_paths, Array p_values);
void _property_keyed(const String &p_path, bool p_advance);
void _property_keyed_with_value(const String &p_path, const Variant &p_value, bool p_advance);
+ void _property_deleted(const String &p_path);
void _property_checked(const String &p_path, bool p_checked);
@@ -316,7 +326,7 @@ class EditorInspector : public ScrollContainer {
void _node_removed(Node *p_node);
- void _changed_callback(Object *p_changed, const char *p_prop);
+ void _changed_callback(Object *p_changed, const char *p_prop) override;
void _edit_request_change(Object *p_object, const String &p_prop);
void _filter_changed(const String &p_text);
@@ -325,6 +335,7 @@ class EditorInspector : public ScrollContainer {
void _vscroll_changed(double);
void _feature_profile_changed();
+ void _update_script_class_properties(const Object &p_object, List<PropertyInfo> &r_list) const;
bool _is_property_disabled_by_feature_profile(const StringName &p_property);
@@ -337,7 +348,7 @@ public:
static void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin);
static void cleanup_plugins();
- static EditorProperty *instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage);
+ static EditorProperty *instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false);
void set_undo_redo(UndoRedo *p_undo_redo);
@@ -380,8 +391,11 @@ public:
void set_object_class(const String &p_class);
String get_object_class() const;
+ void set_use_wide_editors(bool p_enable);
void set_sub_inspector(bool p_enable);
+ void set_use_deletable_properties(bool p_enabled);
+
EditorInspector();
};
diff --git a/editor/editor_layouts_dialog.cpp b/editor/editor_layouts_dialog.cpp
index 727e758341..14478b1386 100644
--- a/editor/editor_layouts_dialog.cpp
+++ b/editor/editor_layouts_dialog.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "editor_layouts_dialog.h"
+
#include "core/class_db.h"
#include "core/io/config_file.h"
#include "core/os/keyboard.h"
@@ -40,51 +41,43 @@ void EditorLayoutsDialog::_line_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> k = p_event;
if (k.is_valid()) {
-
- if (!k->is_pressed())
+ if (!k->is_pressed()) {
return;
+ }
- switch (k->get_scancode()) {
+ switch (k->get_keycode()) {
case KEY_KP_ENTER:
case KEY_ENTER: {
-
- if (get_hide_on_ok())
+ if (get_hide_on_ok()) {
hide();
+ }
ok_pressed();
- accept_event();
+ set_input_as_handled();
} break;
case KEY_ESCAPE: {
-
hide();
- accept_event();
+ set_input_as_handled();
} break;
}
}
}
void EditorLayoutsDialog::_bind_methods() {
- ClassDB::bind_method("_line_gui_input", &EditorLayoutsDialog::_line_gui_input);
-
ADD_SIGNAL(MethodInfo("name_confirmed", PropertyInfo(Variant::STRING, "name")));
}
void EditorLayoutsDialog::ok_pressed() {
-
if (layout_names->is_anything_selected()) {
-
Vector<int> const selected_items = layout_names->get_selected_items();
for (int i = 0; i < selected_items.size(); ++i) {
-
emit_signal("name_confirmed", layout_names->get_item_text(selected_items[i]));
}
} else if (name->is_visible() && name->get_text() != "") {
-
emit_signal("name_confirmed", name->get_text());
}
}
void EditorLayoutsDialog::_post_popup() {
-
ConfirmationDialog::_post_popup();
name->clear();
layout_names->clear();
@@ -93,7 +86,6 @@ void EditorLayoutsDialog::_post_popup() {
config.instance();
Error err = config->load(EditorSettings::get_singleton()->get_editor_layouts_config());
if (err != OK) {
-
return;
}
@@ -101,24 +93,22 @@ void EditorLayoutsDialog::_post_popup() {
config.ptr()->get_sections(&layouts);
for (List<String>::Element *E = layouts.front(); E; E = E->next()) {
-
layout_names->add_item(**E);
}
}
EditorLayoutsDialog::EditorLayoutsDialog() {
-
makevb = memnew(VBoxContainer);
add_child(makevb);
- makevb->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 5);
- makevb->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -5);
+ makevb->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 5);
+ makevb->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -5);
layout_names = memnew(ItemList);
makevb->add_child(layout_names);
layout_names->set_visible(true);
layout_names->set_margin(MARGIN_TOP, 5);
- layout_names->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 5);
- layout_names->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -5);
+ layout_names->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 5);
+ layout_names->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -5);
layout_names->set_v_size_flags(Control::SIZE_EXPAND_FILL);
layout_names->set_select_mode(ItemList::SELECT_MULTI);
layout_names->set_allow_rmb_select(true);
@@ -126,13 +116,12 @@ EditorLayoutsDialog::EditorLayoutsDialog() {
name = memnew(LineEdit);
makevb->add_child(name);
name->set_margin(MARGIN_TOP, 5);
- name->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 5);
- name->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -5);
- name->connect("gui_input", this, "_line_gui_input");
- name->connect("focus_entered", layout_names, "unselect_all");
+ name->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 5);
+ name->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -5);
+ name->connect("gui_input", callable_mp(this, &EditorLayoutsDialog::_line_gui_input));
+ name->connect("focus_entered", callable_mp(layout_names, &ItemList::unselect_all));
}
void EditorLayoutsDialog::set_name_line_enabled(bool p_enabled) {
-
name->set_visible(p_enabled);
}
diff --git a/editor/editor_layouts_dialog.h b/editor/editor_layouts_dialog.h
index d18c2bce17..ebb523829f 100644
--- a/editor/editor_layouts_dialog.h
+++ b/editor/editor_layouts_dialog.h
@@ -37,7 +37,6 @@ class LineEdit;
class ItemList;
class EditorLayoutsDialog : public ConfirmationDialog {
-
GDCLASS(EditorLayoutsDialog, ConfirmationDialog);
LineEdit *name;
@@ -48,8 +47,8 @@ class EditorLayoutsDialog : public ConfirmationDialog {
protected:
static void _bind_methods();
- virtual void ok_pressed();
- virtual void _post_popup();
+ virtual void ok_pressed() override;
+ virtual void _post_popup() override;
public:
EditorLayoutsDialog();
diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp
index 0495722a13..6fbafc7ff3 100644
--- a/editor/editor_log.cpp
+++ b/editor/editor_log.cpp
@@ -38,10 +38,10 @@
#include "scene/resources/dynamic_font.h"
void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type) {
-
EditorLog *self = (EditorLog *)p_self;
- if (self->current != Thread::get_caller_id())
+ if (self->current != Thread::get_caller_id()) {
return;
+ }
String err_str;
if (p_errorexp && p_errorexp[0]) {
@@ -58,30 +58,36 @@ void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_f
}
void EditorLog::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
-
//button->set_icon(get_icon("Console","EditorIcons"));
- log->add_font_override("normal_font", get_font("output_source", "EditorFonts"));
+ log->add_theme_font_override("normal_font", get_theme_font("output_source", "EditorFonts"));
+ log->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
} else if (p_what == NOTIFICATION_THEME_CHANGED) {
- Ref<DynamicFont> df_output_code = get_font("output_source", "EditorFonts");
+ Ref<DynamicFont> df_output_code = get_theme_font("output_source", "EditorFonts");
if (df_output_code.is_valid()) {
- if (log != NULL) {
- log->add_font_override("normal_font", get_font("output_source", "EditorFonts"));
+ if (log != nullptr) {
+ log->add_theme_font_override("normal_font", get_theme_font("output_source", "EditorFonts"));
+ log->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
}
}
}
}
void EditorLog::_clear_request() {
-
log->clear();
- tool_button->set_icon(Ref<Texture>());
+ tool_button->set_icon(Ref<Texture2D>());
}
void EditorLog::_copy_request() {
+ String text = log->get_selected_text();
+
+ if (text == "") {
+ text = log->get_text();
+ }
- log->selection_copy();
+ if (text != "") {
+ DisplayServer::get_singleton()->clipboard_set(text);
+ }
}
void EditorLog::clear() {
@@ -93,7 +99,6 @@ void EditorLog::copy() {
}
void EditorLog::add_message(const String &p_msg, MessageType p_type) {
-
log->add_newline();
bool restore = p_type != MSG_TYPE_STD;
@@ -101,51 +106,47 @@ void EditorLog::add_message(const String &p_msg, MessageType p_type) {
case MSG_TYPE_STD: {
} break;
case MSG_TYPE_ERROR: {
- log->push_color(get_color("error_color", "Editor"));
- Ref<Texture> icon = get_icon("Error", "EditorIcons");
+ log->push_color(get_theme_color("error_color", "Editor"));
+ Ref<Texture2D> icon = get_theme_icon("Error", "EditorIcons");
log->add_image(icon);
log->add_text(" ");
tool_button->set_icon(icon);
} break;
case MSG_TYPE_WARNING: {
- log->push_color(get_color("warning_color", "Editor"));
- Ref<Texture> icon = get_icon("Warning", "EditorIcons");
+ log->push_color(get_theme_color("warning_color", "Editor"));
+ Ref<Texture2D> icon = get_theme_icon("Warning", "EditorIcons");
log->add_image(icon);
log->add_text(" ");
tool_button->set_icon(icon);
} break;
case MSG_TYPE_EDITOR: {
// Distinguish editor messages from messages printed by the project
- log->push_color(get_color("font_color", "Editor") * Color(1, 1, 1, 0.6));
+ log->push_color(get_theme_color("font_color", "Editor") * Color(1, 1, 1, 0.6));
} break;
}
log->add_text(p_msg);
- if (restore)
+ if (restore) {
log->pop();
+ }
}
-void EditorLog::set_tool_button(ToolButton *p_tool_button) {
+void EditorLog::set_tool_button(Button *p_tool_button) {
tool_button = p_tool_button;
}
void EditorLog::_undo_redo_cbk(void *p_self, const String &p_name) {
-
EditorLog *self = (EditorLog *)p_self;
self->add_message(p_name, EditorLog::MSG_TYPE_EDITOR);
}
void EditorLog::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_clear_request"), &EditorLog::_clear_request);
- ClassDB::bind_method(D_METHOD("_copy_request"), &EditorLog::_copy_request);
ADD_SIGNAL(MethodInfo("clear_request"));
ADD_SIGNAL(MethodInfo("copy_request"));
}
EditorLog::EditorLog() {
-
VBoxContainer *vb = this;
HBoxContainer *hb = memnew(HBoxContainer);
@@ -159,13 +160,13 @@ EditorLog::EditorLog() {
hb->add_child(copybutton);
copybutton->set_text(TTR("Copy"));
copybutton->set_shortcut(ED_SHORTCUT("editor/copy_output", TTR("Copy Selection"), KEY_MASK_CMD | KEY_C));
- copybutton->connect("pressed", this, "_copy_request");
+ copybutton->connect("pressed", callable_mp(this, &EditorLog::_copy_request));
clearbutton = memnew(Button);
hb->add_child(clearbutton);
clearbutton->set_text(TTR("Clear"));
clearbutton->set_shortcut(ED_SHORTCUT("editor/clear_output", TTR("Clear Output"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K));
- clearbutton->connect("pressed", this, "_clear_request");
+ clearbutton->connect("pressed", callable_mp(this, &EditorLog::_clear_request));
log = memnew(RichTextLabel);
log->set_scroll_follow(true);
@@ -183,13 +184,12 @@ EditorLog::EditorLog() {
current = Thread::get_caller_id();
- add_constant_override("separation", get_constant("separation", "VBoxContainer"));
+ add_theme_constant_override("separation", get_theme_constant("separation", "VBoxContainer"));
EditorNode::get_undo_redo()->set_commit_notify_callback(_undo_redo_cbk, this);
}
void EditorLog::deinit() {
-
remove_error_handler(&eh);
}
diff --git a/editor/editor_log.h b/editor/editor_log.h
index e3980690b2..73a8c3f0c5 100644
--- a/editor/editor_log.h
+++ b/editor/editor_log.h
@@ -31,20 +31,17 @@
#ifndef EDITOR_LOG_H
#define EDITOR_LOG_H
+#include "core/os/thread.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
#include "scene/gui/control.h"
#include "scene/gui/label.h"
+#include "scene/gui/panel_container.h"
#include "scene/gui/rich_text_label.h"
#include "scene/gui/texture_button.h"
-//#include "scene/gui/empty_control.h"
-#include "core/os/thread.h"
-#include "pane_drag.h"
-#include "scene/gui/box_container.h"
-#include "scene/gui/panel_container.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class EditorLog : public VBoxContainer {
-
GDCLASS(EditorLog, VBoxContainer);
Button *clearbutton;
@@ -52,8 +49,7 @@ class EditorLog : public VBoxContainer {
Label *title;
RichTextLabel *log;
HBoxContainer *title_hb;
- //PaneDrag *pd;
- ToolButton *tool_button;
+ Button *tool_button;
static void _error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type);
@@ -79,7 +75,7 @@ public:
};
void add_message(const String &p_msg, MessageType p_type = MSG_TYPE_STD);
- void set_tool_button(ToolButton *p_tool_button);
+ void set_tool_button(Button *p_tool_button);
void deinit();
void clear();
diff --git a/editor/editor_network_profiler.cpp b/editor/editor_network_profiler.cpp
deleted file mode 100644
index 1b80743237..0000000000
--- a/editor/editor_network_profiler.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-/*************************************************************************/
-/* editor_network_profiler.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "editor_network_profiler.h"
-
-#include "core/os/os.h"
-#include "editor_scale.h"
-#include "editor_settings.h"
-
-void EditorNetworkProfiler::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_update_frame"), &EditorNetworkProfiler::_update_frame);
- ClassDB::bind_method(D_METHOD("_activate_pressed"), &EditorNetworkProfiler::_activate_pressed);
- ClassDB::bind_method(D_METHOD("_clear_pressed"), &EditorNetworkProfiler::_clear_pressed);
- ADD_SIGNAL(MethodInfo("enable_profiling", PropertyInfo(Variant::BOOL, "enable")));
-}
-
-void EditorNetworkProfiler::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- activate->set_icon(get_icon("Play", "EditorIcons"));
- clear_button->set_icon(get_icon("Clear", "EditorIcons"));
- incoming_bandwidth_text->set_right_icon(get_icon("ArrowDown", "EditorIcons"));
- outgoing_bandwidth_text->set_right_icon(get_icon("ArrowUp", "EditorIcons"));
-
- // This needs to be done here to set the faded color when the profiler is first opened
- incoming_bandwidth_text->add_color_override("font_color_uneditable", get_color("font_color", "Editor") * Color(1, 1, 1, 0.5));
- outgoing_bandwidth_text->add_color_override("font_color_uneditable", get_color("font_color", "Editor") * Color(1, 1, 1, 0.5));
- }
-}
-
-void EditorNetworkProfiler::_update_frame() {
-
- counters_display->clear();
-
- TreeItem *root = counters_display->create_item();
-
- for (Map<ObjectID, MultiplayerAPI::ProfilingInfo>::Element *E = nodes_data.front(); E; E = E->next()) {
-
- TreeItem *node = counters_display->create_item(root);
-
- for (int j = 0; j < counters_display->get_columns(); ++j) {
- node->set_text_align(j, j > 0 ? TreeItem::ALIGN_RIGHT : TreeItem::ALIGN_LEFT);
- }
-
- node->set_text(0, E->get().node_path);
- node->set_text(1, E->get().incoming_rpc == 0 ? "-" : itos(E->get().incoming_rpc));
- node->set_text(2, E->get().incoming_rset == 0 ? "-" : itos(E->get().incoming_rset));
- node->set_text(3, E->get().outgoing_rpc == 0 ? "-" : itos(E->get().outgoing_rpc));
- node->set_text(4, E->get().outgoing_rset == 0 ? "-" : itos(E->get().outgoing_rset));
- }
-}
-
-void EditorNetworkProfiler::_activate_pressed() {
-
- if (activate->is_pressed()) {
- activate->set_icon(get_icon("Stop", "EditorIcons"));
- activate->set_text(TTR("Stop"));
- } else {
- activate->set_icon(get_icon("Play", "EditorIcons"));
- activate->set_text(TTR("Start"));
- }
- emit_signal("enable_profiling", activate->is_pressed());
-}
-
-void EditorNetworkProfiler::_clear_pressed() {
- nodes_data.clear();
- set_bandwidth(0, 0);
- if (frame_delay->is_stopped()) {
- frame_delay->set_wait_time(0.1);
- frame_delay->start();
- }
-}
-
-void EditorNetworkProfiler::add_node_frame_data(const MultiplayerAPI::ProfilingInfo p_frame) {
-
- if (!nodes_data.has(p_frame.node)) {
- nodes_data.insert(p_frame.node, p_frame);
- } else {
- nodes_data[p_frame.node].incoming_rpc += p_frame.incoming_rpc;
- nodes_data[p_frame.node].incoming_rset += p_frame.incoming_rset;
- nodes_data[p_frame.node].outgoing_rpc += p_frame.outgoing_rpc;
- nodes_data[p_frame.node].outgoing_rset += p_frame.outgoing_rset;
- }
-
- if (frame_delay->is_stopped()) {
- frame_delay->set_wait_time(0.1);
- frame_delay->start();
- }
-}
-
-void EditorNetworkProfiler::set_bandwidth(int p_incoming, int p_outgoing) {
-
- incoming_bandwidth_text->set_text(vformat(TTR("%s/s"), String::humanize_size(p_incoming)));
- outgoing_bandwidth_text->set_text(vformat(TTR("%s/s"), String::humanize_size(p_outgoing)));
-
- // Make labels more prominent when the bandwidth is greater than 0 to attract user attention
- incoming_bandwidth_text->add_color_override(
- "font_color_uneditable",
- get_color("font_color", "Editor") * Color(1, 1, 1, p_incoming > 0 ? 1 : 0.5));
- outgoing_bandwidth_text->add_color_override(
- "font_color_uneditable",
- get_color("font_color", "Editor") * Color(1, 1, 1, p_outgoing > 0 ? 1 : 0.5));
-}
-
-bool EditorNetworkProfiler::is_profiling() {
- return activate->is_pressed();
-}
-
-EditorNetworkProfiler::EditorNetworkProfiler() {
-
- HBoxContainer *hb = memnew(HBoxContainer);
- hb->add_constant_override("separation", 8 * EDSCALE);
- add_child(hb);
-
- activate = memnew(Button);
- activate->set_toggle_mode(true);
- activate->set_text(TTR("Start"));
- activate->connect("pressed", this, "_activate_pressed");
- hb->add_child(activate);
-
- clear_button = memnew(Button);
- clear_button->set_text(TTR("Clear"));
- clear_button->connect("pressed", this, "_clear_pressed");
- hb->add_child(clear_button);
-
- hb->add_spacer();
-
- Label *lb = memnew(Label);
- lb->set_text(TTR("Down"));
- hb->add_child(lb);
-
- incoming_bandwidth_text = memnew(LineEdit);
- incoming_bandwidth_text->set_editable(false);
- incoming_bandwidth_text->set_custom_minimum_size(Size2(120, 0) * EDSCALE);
- incoming_bandwidth_text->set_align(LineEdit::Align::ALIGN_RIGHT);
- hb->add_child(incoming_bandwidth_text);
-
- Control *down_up_spacer = memnew(Control);
- down_up_spacer->set_custom_minimum_size(Size2(30, 0) * EDSCALE);
- hb->add_child(down_up_spacer);
-
- lb = memnew(Label);
- lb->set_text(TTR("Up"));
- hb->add_child(lb);
-
- outgoing_bandwidth_text = memnew(LineEdit);
- outgoing_bandwidth_text->set_editable(false);
- outgoing_bandwidth_text->set_custom_minimum_size(Size2(120, 0) * EDSCALE);
- outgoing_bandwidth_text->set_align(LineEdit::Align::ALIGN_RIGHT);
- hb->add_child(outgoing_bandwidth_text);
-
- // Set initial texts in the incoming/outgoing bandwidth labels
- set_bandwidth(0, 0);
-
- counters_display = memnew(Tree);
- counters_display->set_custom_minimum_size(Size2(300, 0) * EDSCALE);
- counters_display->set_v_size_flags(SIZE_EXPAND_FILL);
- counters_display->set_hide_folding(true);
- counters_display->set_hide_root(true);
- counters_display->set_columns(5);
- counters_display->set_column_titles_visible(true);
- counters_display->set_column_title(0, TTR("Node"));
- counters_display->set_column_expand(0, true);
- counters_display->set_column_min_width(0, 60 * EDSCALE);
- counters_display->set_column_title(1, TTR("Incoming RPC"));
- counters_display->set_column_expand(1, false);
- counters_display->set_column_min_width(1, 120 * EDSCALE);
- counters_display->set_column_title(2, TTR("Incoming RSET"));
- counters_display->set_column_expand(2, false);
- counters_display->set_column_min_width(2, 120 * EDSCALE);
- counters_display->set_column_title(3, TTR("Outgoing RPC"));
- counters_display->set_column_expand(3, false);
- counters_display->set_column_min_width(3, 120 * EDSCALE);
- counters_display->set_column_title(4, TTR("Outgoing RSET"));
- counters_display->set_column_expand(4, false);
- counters_display->set_column_min_width(4, 120 * EDSCALE);
- add_child(counters_display);
-
- frame_delay = memnew(Timer);
- frame_delay->set_wait_time(0.1);
- frame_delay->set_one_shot(true);
- add_child(frame_delay);
- frame_delay->connect("timeout", this, "_update_frame");
-}
diff --git a/editor/editor_network_profiler.h b/editor/editor_network_profiler.h
deleted file mode 100644
index 680131c288..0000000000
--- a/editor/editor_network_profiler.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*************************************************************************/
-/* editor_network_profiler.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef EDITORNETWORKPROFILER_H
-#define EDITORNETWORKPROFILER_H
-
-#include "scene/gui/box_container.h"
-#include "scene/gui/button.h"
-#include "scene/gui/label.h"
-#include "scene/gui/split_container.h"
-#include "scene/gui/tree.h"
-
-class EditorNetworkProfiler : public VBoxContainer {
-
- GDCLASS(EditorNetworkProfiler, VBoxContainer)
-
-private:
- Button *activate;
- Button *clear_button;
- Tree *counters_display;
- LineEdit *incoming_bandwidth_text;
- LineEdit *outgoing_bandwidth_text;
-
- Timer *frame_delay;
-
- Map<ObjectID, MultiplayerAPI::ProfilingInfo> nodes_data;
-
- void _update_frame();
-
- void _activate_pressed();
- void _clear_pressed();
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void add_node_frame_data(const MultiplayerAPI::ProfilingInfo p_frame);
- void set_bandwidth(int p_incoming, int p_outgoing);
- bool is_profiling();
-
- EditorNetworkProfiler();
-};
-
-#endif //EDITORNETWORKPROFILER_H
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index dd15910d09..8edda3123b 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -32,6 +32,7 @@
#include "core/bind/core_bind.h"
#include "core/class_db.h"
+#include "core/input/input.h"
#include "core/io/config_file.h"
#include "core/io/image_loader.h"
#include "core/io/resource_loader.h"
@@ -39,15 +40,12 @@
#include "core/io/stream_peer_ssl.h"
#include "core/message_queue.h"
#include "core/os/file_access.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/os/os.h"
-#include "core/path_remap.h"
#include "core/print_string.h"
#include "core/project_settings.h"
#include "core/translation.h"
#include "core/version.h"
-#include "main/input_default.h"
#include "main/main.h"
#include "scene/gui/center_container.h"
#include "scene/gui/control.h"
@@ -60,11 +58,14 @@
#include "scene/gui/tab_container.h"
#include "scene/gui/tabs.h"
#include "scene/gui/texture_progress.h"
-#include "scene/gui/tool_button.h"
#include "scene/resources/packed_scene.h"
-#include "servers/physics_2d_server.h"
+#include "servers/navigation_server_2d.h"
+#include "servers/navigation_server_3d.h"
+#include "servers/physics_server_2d.h"
+#include "servers/rendering/rendering_device.h"
#include "editor/audio_stream_preview.h"
+#include "editor/debugger/editor_debugger_node.h"
#include "editor/dependency_editor.h"
#include "editor/editor_about.h"
#include "editor/editor_audio_buses.h"
@@ -84,8 +85,8 @@
#include "editor/editor_settings.h"
#include "editor/editor_spin_slider.h"
#include "editor/editor_themes.h"
+#include "editor/editor_translation_parser.h"
#include "editor/export_template_manager.h"
-#include "editor/fileserver/editor_file_server.h"
#include "editor/filesystem_dock.h"
#include "editor/import/editor_import_collada.h"
#include "editor/import/editor_scene_importer_gltf.h"
@@ -96,13 +97,13 @@
#include "editor/import/resource_importer_layered_texture.h"
#include "editor/import/resource_importer_obj.h"
#include "editor/import/resource_importer_scene.h"
+#include "editor/import/resource_importer_shader_file.h"
#include "editor/import/resource_importer_texture.h"
#include "editor/import/resource_importer_texture_atlas.h"
#include "editor/import/resource_importer_wav.h"
#include "editor/import_dock.h"
#include "editor/multi_node_edit.h"
#include "editor/node_dock.h"
-#include "editor/pane_drag.h"
#include "editor/plugin_config_dialog.h"
#include "editor/plugins/animation_blend_space_1d_editor.h"
#include "editor/plugins/animation_blend_space_2d_editor.h"
@@ -110,50 +111,55 @@
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor/plugins/animation_state_machine_editor.h"
#include "editor/plugins/animation_tree_editor_plugin.h"
-#include "editor/plugins/animation_tree_player_editor_plugin.h"
#include "editor/plugins/asset_library_editor_plugin.h"
#include "editor/plugins/audio_stream_editor_plugin.h"
#include "editor/plugins/baked_lightmap_editor_plugin.h"
-#include "editor/plugins/camera_editor_plugin.h"
+#include "editor/plugins/camera_3d_editor_plugin.h"
#include "editor/plugins/canvas_item_editor_plugin.h"
#include "editor/plugins/collision_polygon_2d_editor_plugin.h"
-#include "editor/plugins/collision_polygon_editor_plugin.h"
+#include "editor/plugins/collision_polygon_3d_editor_plugin.h"
#include "editor/plugins/collision_shape_2d_editor_plugin.h"
#include "editor/plugins/cpu_particles_2d_editor_plugin.h"
-#include "editor/plugins/cpu_particles_editor_plugin.h"
+#include "editor/plugins/cpu_particles_3d_editor_plugin.h"
#include "editor/plugins/curve_editor_plugin.h"
+#include "editor/plugins/debugger_editor_plugin.h"
+#include "editor/plugins/editor_debugger_plugin.h"
#include "editor/plugins/editor_preview_plugins.h"
#include "editor/plugins/gi_probe_editor_plugin.h"
+#include "editor/plugins/gpu_particles_2d_editor_plugin.h"
+#include "editor/plugins/gpu_particles_3d_editor_plugin.h"
#include "editor/plugins/gradient_editor_plugin.h"
#include "editor/plugins/item_list_editor_plugin.h"
#include "editor/plugins/light_occluder_2d_editor_plugin.h"
#include "editor/plugins/line_2d_editor_plugin.h"
#include "editor/plugins/material_editor_plugin.h"
#include "editor/plugins/mesh_editor_plugin.h"
-#include "editor/plugins/mesh_instance_editor_plugin.h"
+#include "editor/plugins/mesh_instance_3d_editor_plugin.h"
#include "editor/plugins/mesh_library_editor_plugin.h"
#include "editor/plugins/multimesh_editor_plugin.h"
#include "editor/plugins/navigation_polygon_editor_plugin.h"
-#include "editor/plugins/particles_2d_editor_plugin.h"
-#include "editor/plugins/particles_editor_plugin.h"
+#include "editor/plugins/node_3d_editor_plugin.h"
+#include "editor/plugins/packed_scene_translation_parser_plugin.h"
#include "editor/plugins/path_2d_editor_plugin.h"
-#include "editor/plugins/path_editor_plugin.h"
-#include "editor/plugins/physical_bone_plugin.h"
+#include "editor/plugins/path_3d_editor_plugin.h"
+#include "editor/plugins/physical_bone_3d_editor_plugin.h"
#include "editor/plugins/polygon_2d_editor_plugin.h"
#include "editor/plugins/resource_preloader_editor_plugin.h"
#include "editor/plugins/root_motion_editor_plugin.h"
#include "editor/plugins/script_editor_plugin.h"
#include "editor/plugins/script_text_editor.h"
#include "editor/plugins/shader_editor_plugin.h"
+#include "editor/plugins/shader_file_editor_plugin.h"
#include "editor/plugins/skeleton_2d_editor_plugin.h"
-#include "editor/plugins/skeleton_editor_plugin.h"
-#include "editor/plugins/skeleton_ik_editor_plugin.h"
-#include "editor/plugins/spatial_editor_plugin.h"
-#include "editor/plugins/sprite_editor_plugin.h"
+#include "editor/plugins/skeleton_3d_editor_plugin.h"
+#include "editor/plugins/skeleton_ik_3d_editor_plugin.h"
+#include "editor/plugins/sprite_2d_editor_plugin.h"
#include "editor/plugins/sprite_frames_editor_plugin.h"
#include "editor/plugins/style_box_editor_plugin.h"
#include "editor/plugins/text_editor.h"
+#include "editor/plugins/texture_3d_editor_plugin.h"
#include "editor/plugins/texture_editor_plugin.h"
+#include "editor/plugins/texture_layered_editor_plugin.h"
#include "editor/plugins/texture_region_editor_plugin.h"
#include "editor/plugins/theme_editor_plugin.h"
#include "editor/plugins/tile_map_editor_plugin.h"
@@ -167,43 +173,162 @@
#include "editor/quick_open.h"
#include "editor/register_exporters.h"
#include "editor/run_settings_dialog.h"
-#include "editor/script_editor_debugger.h"
#include "editor/settings_config_dialog.h"
-
+#include "scene/main/window.h"
+#include "servers/display_server.h"
#include <stdio.h>
#include <stdlib.h>
-EditorNode *EditorNode::singleton = NULL;
+EditorNode *EditorNode::singleton = nullptr;
+
+void EditorNode::disambiguate_filenames(const Vector<String> p_full_paths, Vector<String> &r_filenames) {
+ // Keep track of a list of "index sets," i.e. sets of indices
+ // within disambiguated_scene_names which contain the same name.
+ Vector<Set<int>> index_sets;
+ Map<String, int> scene_name_to_set_index;
+ for (int i = 0; i < r_filenames.size(); i++) {
+ String scene_name = r_filenames[i];
+ if (!scene_name_to_set_index.has(scene_name)) {
+ index_sets.append(Set<int>());
+ scene_name_to_set_index.insert(r_filenames[i], index_sets.size() - 1);
+ }
+ index_sets.write[scene_name_to_set_index[scene_name]].insert(i);
+ }
+
+ // For each index set with a size > 1, we need to disambiguate
+ for (int i = 0; i < index_sets.size(); i++) {
+ Set<int> iset = index_sets[i];
+ while (iset.size() > 1) {
+ // Append the parent folder to each scene name
+ for (Set<int>::Element *E = iset.front(); E; E = E->next()) {
+ int set_idx = E->get();
+ String scene_name = r_filenames[set_idx];
+ String full_path = p_full_paths[set_idx];
+
+ // Get rid of file extensions and res:// prefixes
+ if (scene_name.rfind(".") >= 0) {
+ scene_name = scene_name.substr(0, scene_name.rfind("."));
+ }
+ if (full_path.begins_with("res://")) {
+ full_path = full_path.substr(6);
+ }
+ if (full_path.rfind(".") >= 0) {
+ full_path = full_path.substr(0, full_path.rfind("."));
+ }
-void EditorNode::_update_scene_tabs() {
+ int scene_name_size = scene_name.size();
+ int full_path_size = full_path.size();
+ int difference = full_path_size - scene_name_size;
+
+ // Find just the parent folder of the current path and append it.
+ // If the current name is foo.tscn, and the full path is /some/folder/foo.tscn
+ // then slash_idx is the second '/', so that we select just "folder", and
+ // append that to yield "folder/foo.tscn".
+ if (difference > 0) {
+ String parent = full_path.substr(0, difference);
+ int slash_idx = parent.rfind("/");
+ slash_idx = parent.rfind("/", slash_idx - 1);
+ parent = slash_idx >= 0 ? parent.substr(slash_idx + 1) : parent;
+ r_filenames.write[set_idx] = parent + r_filenames[set_idx];
+ }
+ }
+
+ // Loop back through scene names and remove non-ambiguous names
+ bool can_proceed = false;
+ Set<int>::Element *E = iset.front();
+ while (E) {
+ String scene_name = r_filenames[E->get()];
+ bool duplicate_found = false;
+ for (Set<int>::Element *F = iset.front(); F; F = F->next()) {
+ if (E->get() == F->get()) {
+ continue;
+ }
+ String other_scene_name = r_filenames[F->get()];
+ if (other_scene_name == scene_name) {
+ duplicate_found = true;
+ break;
+ }
+ }
+ Set<int>::Element *to_erase = duplicate_found ? nullptr : E;
+
+ // We need to check that we could actually append anymore names
+ // if we wanted to for disambiguation. If we can't, then we have
+ // to abort even with ambiguous names. We clean the full path
+ // and the scene name first to remove extensions so that this
+ // comparison actually works.
+ String path = p_full_paths[E->get()];
+ if (path.begins_with("res://")) {
+ path = path.substr(6);
+ }
+ if (path.rfind(".") >= 0) {
+ path = path.substr(0, path.rfind("."));
+ }
+ if (scene_name.rfind(".") >= 0) {
+ scene_name = scene_name.substr(0, scene_name.rfind("."));
+ }
+
+ // We can proceed iff the full path is longer than the scene name,
+ // meaning that there is at least one more parent folder we can
+ // tack onto the name.
+ can_proceed = can_proceed || (path.size() - scene_name.size()) >= 1;
+
+ E = E->next();
+ if (to_erase) {
+ iset.erase(to_erase);
+ }
+ }
+
+ if (!can_proceed) {
+ break;
+ }
+ }
+ }
+}
+
+void EditorNode::_update_scene_tabs() {
bool show_rb = EditorSettings::get_singleton()->get("interface/scene_tabs/show_script_button");
- OS::get_singleton()->global_menu_clear("_dock");
+ if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
+ DisplayServer::get_singleton()->global_menu_clear("_dock");
+ }
- scene_tabs->clear_tabs();
- Ref<Texture> script_icon = gui_base->get_icon("Script", "EditorIcons");
+ // Get all scene names, which may be ambiguous
+ Vector<String> disambiguated_scene_names;
+ Vector<String> full_path_names;
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
+ disambiguated_scene_names.append(editor_data.get_scene_title(i));
+ full_path_names.append(editor_data.get_scene_path(i));
+ }
+
+ disambiguate_filenames(full_path_names, disambiguated_scene_names);
+ scene_tabs->clear_tabs();
+ Ref<Texture2D> script_icon = gui_base->get_theme_icon("Script", "EditorIcons");
+ for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
Node *type_node = editor_data.get_edited_scene_root(i);
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
if (type_node) {
icon = EditorNode::get_singleton()->get_object_icon(type_node, "Node");
}
int current = editor_data.get_edited_scene();
bool unsaved = (i == current) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(i) != 0;
- scene_tabs->add_tab(editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), icon);
+ scene_tabs->add_tab(disambiguated_scene_names[i] + (unsaved ? "(*)" : ""), icon);
- OS::get_singleton()->global_menu_add_item("_dock", editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), GLOBAL_SCENE, i);
+ if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
+ DisplayServer::get_singleton()->global_menu_add_item("_dock", editor_data.get_scene_title(i) + (unsaved ? "(*)" : ""), callable_mp(this, &EditorNode::_global_menu_scene), i);
+ }
if (show_rb && editor_data.get_scene_root_script(i).is_valid()) {
scene_tabs->set_tab_right_button(i, script_icon);
}
}
- OS::get_singleton()->global_menu_add_separator("_dock");
- OS::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant());
+ if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
+ DisplayServer::get_singleton()->global_menu_add_separator("_dock");
+ DisplayServer::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), callable_mp(this, &EditorNode::_global_menu_new_window));
+ }
scene_tabs->set_current_tab(editor_data.get_edited_scene());
@@ -222,47 +347,41 @@ void EditorNode::_update_scene_tabs() {
scene_tabs->add_child(scene_tab_add);
}
Rect2 last_tab = Rect2();
- if (scene_tabs->get_tab_count() != 0)
+ if (scene_tabs->get_tab_count() != 0) {
last_tab = scene_tabs->get_tab_rect(scene_tabs->get_tab_count() - 1);
+ }
scene_tab_add->set_position(Point2(last_tab.get_position().x + last_tab.get_size().x + 3, last_tab.get_position().y));
}
}
void EditorNode::_version_control_menu_option(int p_idx) {
-
switch (vcs_actions_menu->get_item_id(p_idx)) {
case RUN_VCS_SETTINGS: {
-
VersionControlEditorPlugin::get_singleton()->popup_vcs_set_up_dialog(gui_base);
} break;
case RUN_VCS_SHUT_DOWN: {
-
VersionControlEditorPlugin::get_singleton()->shut_down();
} break;
}
}
void EditorNode::_update_title() {
-
String appname = ProjectSettings::get_singleton()->get("application/config/name");
String title = appname.empty() ? String(VERSION_FULL_NAME) : String(VERSION_NAME + String(" - ") + appname);
String edited = editor_data.get_edited_scene_root() ? editor_data.get_edited_scene_root()->get_filename() : String();
- if (!edited.empty())
+ if (!edited.empty()) {
title += " - " + String(edited.get_file());
- if (unsaved_cache)
+ }
+ if (unsaved_cache) {
title += " (*)";
+ }
- OS::get_singleton()->set_window_title(title);
+ DisplayServer::get_singleton()->window_set_title(title);
}
void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) {
-
- if (Node::get_viewport()->get_modal_stack_top())
- return; //ignore because of modal window
-
Ref<InputEventKey> k = p_event;
- if (k.is_valid() && k->is_pressed() && !k->is_echo() && !gui_base->get_viewport()->gui_has_modal_stack()) {
-
+ if (k.is_valid() && k->is_pressed() && !k->is_echo()) {
EditorPlugin *old_editor = editor_plugin_screen;
if (ED_IS_SHORTCUT("editor/next_tab", p_event)) {
@@ -296,20 +415,19 @@ void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) {
}
if (old_editor != editor_plugin_screen) {
- get_tree()->set_input_as_handled();
+ get_tree()->get_root()->set_input_as_handled();
}
}
}
void EditorNode::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_PROCESS: {
- if (opening_prev && !confirmation->is_visible())
+ if (opening_prev && !confirmation->is_visible()) {
opening_prev = false;
+ }
if (unsaved_cache != (saved_version != editor_data.get_undo_redo().get_version())) {
-
unsaved_cache = (saved_version != editor_data.get_undo_redo().get_version());
_update_title();
}
@@ -324,23 +442,69 @@ void EditorNode::_notification(int p_what) {
uint32_t tick = OS::get_singleton()->get_ticks_msec();
if (frame != update_spinner_step_frame && (tick - update_spinner_step_msec) > (1000 / 8)) {
-
update_spinner_step++;
- if (update_spinner_step >= 8)
+ if (update_spinner_step >= 8) {
update_spinner_step = 0;
+ }
update_spinner_step_msec = tick;
update_spinner_step_frame = frame + 1;
// update the icon itself only when the spinner is visible
if (EditorSettings::get_singleton()->get("interface/editor/show_update_spinner")) {
- update_spinner->set_icon(gui_base->get_icon("Progress" + itos(update_spinner_step + 1), "EditorIcons"));
+ update_spinner->set_icon(gui_base->get_theme_icon("Progress" + itos(update_spinner_step + 1), "EditorIcons"));
}
}
editor_selection->update();
- scene_root->set_size_override(true, Size2(ProjectSettings::get_singleton()->get("display/window/size/width"), ProjectSettings::get_singleton()->get("display/window/size/height")));
+ { //TODO should only happen on settings changed
+ int current_filter = GLOBAL_GET("rendering/canvas_textures/default_texture_filter");
+ if (current_filter != scene_root->get_default_canvas_item_texture_filter()) {
+ Viewport::DefaultCanvasItemTextureFilter tf = (Viewport::DefaultCanvasItemTextureFilter)current_filter;
+ scene_root->set_default_canvas_item_texture_filter(tf);
+ }
+ int current_repeat = GLOBAL_GET("rendering/canvas_textures/default_texture_repeat");
+ if (current_repeat != scene_root->get_default_canvas_item_texture_repeat()) {
+ Viewport::DefaultCanvasItemTextureRepeat tr = (Viewport::DefaultCanvasItemTextureRepeat)current_repeat;
+ scene_root->set_default_canvas_item_texture_repeat(tr);
+ }
+
+ RS::DOFBokehShape dof_shape = RS::DOFBokehShape(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_shape")));
+ RS::get_singleton()->camera_effects_set_dof_blur_bokeh_shape(dof_shape);
+ RS::DOFBlurQuality dof_quality = RS::DOFBlurQuality(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_quality")));
+ bool dof_jitter = GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_use_jitter");
+ RS::get_singleton()->camera_effects_set_dof_blur_quality(dof_quality, dof_jitter);
+ RS::get_singleton()->environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/quality/ssao/quality"))), GLOBAL_GET("rendering/quality/ssao/half_size"));
+ RS::get_singleton()->screen_space_roughness_limiter_set_active(GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_enabled"), GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_amount"), GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_limit"));
+ bool glow_bicubic = int(GLOBAL_GET("rendering/quality/glow/upscale_mode")) > 0;
+ RS::get_singleton()->environment_glow_set_use_bicubic_upscale(glow_bicubic);
+ bool glow_high_quality = GLOBAL_GET("rendering/quality/glow/use_high_quality");
+ RS::get_singleton()->environment_glow_set_use_high_quality(glow_high_quality);
+ RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/quality/screen_space_reflection/roughness_quality")));
+ RS::get_singleton()->environment_set_ssr_roughness_quality(ssr_roughness_quality);
+ RS::SubSurfaceScatteringQuality sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_quality")));
+ RS::get_singleton()->sub_surface_scattering_set_quality(sss_quality);
+ float sss_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_scale");
+ float sss_depth_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale");
+ RS::get_singleton()->sub_surface_scattering_set_scale(sss_scale, sss_depth_scale);
+ RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/shadows/soft_shadow_quality")));
+ RS::get_singleton()->shadows_quality_set(shadows_quality);
+ RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/directional_shadow/soft_shadow_quality")));
+ RS::get_singleton()->directional_shadow_quality_set(directional_shadow_quality);
+ float probe_update_speed = GLOBAL_GET("rendering/lightmapper/probe_capture_update_speed");
+ RS::get_singleton()->lightmap_set_probe_capture_update_speed(probe_update_speed);
+ RS::EnvironmentSDFGIFramesToConverge frames_to_converge = RS::EnvironmentSDFGIFramesToConverge(int(GLOBAL_GET("rendering/sdfgi/frames_to_converge")));
+ RS::get_singleton()->environment_set_sdfgi_frames_to_converge(frames_to_converge);
+ RS::EnvironmentSDFGIRayCount ray_count = RS::EnvironmentSDFGIRayCount(int(GLOBAL_GET("rendering/sdfgi/probe_ray_count")));
+ RS::get_singleton()->environment_set_sdfgi_ray_count(ray_count);
+ RS::GIProbeQuality gi_probe_quality = RS::GIProbeQuality(int(GLOBAL_GET("rendering/quality/gi_probes/quality")));
+ RS::get_singleton()->gi_probe_set_quality(gi_probe_quality);
+ RS::get_singleton()->environment_set_volumetric_fog_volume_size(GLOBAL_GET("rendering/volumetric_fog/volume_size"), GLOBAL_GET("rendering/volumetric_fog/volume_depth"));
+ RS::get_singleton()->environment_set_volumetric_fog_filter_active(bool(GLOBAL_GET("rendering/volumetric_fog/use_filter")));
+ RS::get_singleton()->environment_set_volumetric_fog_directional_shadow_shrink_size(GLOBAL_GET("rendering/volumetric_fog/directional_shadow_shrink"));
+ RS::get_singleton()->environment_set_volumetric_fog_positional_shadow_shrink_size(GLOBAL_GET("rendering/volumetric_fog/positional_shadow_shrink"));
+ }
ResourceImporterTexture::get_singleton()->update_imports();
} break;
@@ -349,26 +513,22 @@ void EditorNode::_notification(int p_what) {
Engine::get_singleton()->set_editor_hint(true);
OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec")));
- get_tree()->get_root()->set_usage(Viewport::USAGE_2D_NO_SAMPLING); //reduce memory usage
- get_tree()->get_root()->set_disable_3d(true);
get_tree()->get_root()->set_as_audio_listener(false);
get_tree()->get_root()->set_as_audio_listener_2d(false);
get_tree()->set_auto_accept_quit(false);
- get_tree()->connect("files_dropped", this, "_dropped_files");
- get_tree()->connect("global_menu_action", this, "_global_menu_action");
+ get_tree()->get_root()->connect("files_dropped", callable_mp(this, &EditorNode::_dropped_files));
/* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */
} break;
case NOTIFICATION_EXIT_TREE: {
editor_data.save_editor_external_data();
- FileAccess::set_file_close_fail_notify_callback(NULL);
+ FileAccess::set_file_close_fail_notify_callback(nullptr);
log->deinit(); // do not get messages anymore
editor_data.clear_edited_scenes();
} break;
case NOTIFICATION_READY: {
-
{
_initializing_addons = true;
Vector<String> addons;
@@ -382,9 +542,9 @@ void EditorNode::_notification(int p_what) {
_initializing_addons = false;
}
- VisualServer::get_singleton()->viewport_set_hide_scenario(get_scene_root()->get_viewport_rid(), true);
- VisualServer::get_singleton()->viewport_set_hide_canvas(get_scene_root()->get_viewport_rid(), true);
- VisualServer::get_singleton()->viewport_set_disable_environment(get_viewport()->get_viewport_rid(), true);
+ RenderingServer::get_singleton()->viewport_set_hide_scenario(get_scene_root()->get_viewport_rid(), true);
+ RenderingServer::get_singleton()->viewport_set_hide_canvas(get_scene_root()->get_viewport_rid(), true);
+ RenderingServer::get_singleton()->viewport_set_disable_environment(get_viewport()->get_viewport_rid(), true);
feature_profile_manager->notify_changed();
@@ -394,32 +554,26 @@ void EditorNode::_notification(int p_what) {
_editor_select(EDITOR_3D);
}
- _update_debug_options();
-
/* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */
} break;
- case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
-
+ case NOTIFICATION_APPLICATION_FOCUS_IN: {
// Restore the original FPS cap after focusing back on the editor
OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec")));
EditorFileSystem::get_singleton()->scan_changes();
} break;
- case MainLoop::NOTIFICATION_WM_FOCUS_OUT: {
-
+ case NOTIFICATION_APPLICATION_FOCUS_OUT: {
// Set a low FPS cap to decrease CPU/GPU usage while the editor is unfocused
OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/unfocused_low_processor_mode_sleep_usec")));
} break;
- case MainLoop::NOTIFICATION_WM_ABOUT: {
-
+ case NOTIFICATION_WM_ABOUT: {
show_about();
} break;
- case MainLoop::NOTIFICATION_WM_QUIT_REQUEST: {
-
+ case NOTIFICATION_WM_CLOSE_REQUEST: {
_menu_option_confirm(FILE_QUIT, false);
} break;
@@ -430,17 +584,17 @@ void EditorNode::_notification(int p_what) {
theme_base->set_theme(theme);
gui_base->set_theme(theme);
- gui_base->add_style_override("panel", gui_base->get_stylebox("Background", "EditorStyles"));
- scene_root_parent->add_style_override("panel", gui_base->get_stylebox("Content", "EditorStyles"));
- bottom_panel->add_style_override("panel", gui_base->get_stylebox("panel", "TabContainer"));
- scene_tabs->add_style_override("tab_fg", gui_base->get_stylebox("SceneTabFG", "EditorStyles"));
- scene_tabs->add_style_override("tab_bg", gui_base->get_stylebox("SceneTabBG", "EditorStyles"));
+ gui_base->add_theme_style_override("panel", gui_base->get_theme_stylebox("Background", "EditorStyles"));
+ scene_root_parent->add_theme_style_override("panel", gui_base->get_theme_stylebox("Content", "EditorStyles"));
+ bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox("panel", "TabContainer"));
+ scene_tabs->add_theme_style_override("tab_fg", gui_base->get_theme_stylebox("SceneTabFG", "EditorStyles"));
+ scene_tabs->add_theme_style_override("tab_bg", gui_base->get_theme_stylebox("SceneTabBG", "EditorStyles"));
- file_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
- project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
- debug_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
- settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
- help_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
+ file_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
+ project_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
+ debug_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
+ settings_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
+ help_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
if (EDITOR_GET("interface/scene_tabs/resize_if_many_tabs")) {
scene_tabs->set_min_width(int(EDITOR_GET("interface/scene_tabs/minimum_width")) * EDSCALE);
@@ -452,48 +606,50 @@ void EditorNode::_notification(int p_what) {
recent_scenes->set_as_minsize();
// debugger area
- if (ScriptEditor::get_singleton()->get_debugger()->is_visible())
- bottom_panel->add_style_override("panel", gui_base->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles"));
+ if (EditorDebuggerNode::get_singleton()->is_visible()) {
+ bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox("BottomPanelDebuggerOverride", "EditorStyles"));
+ }
// update_icons
for (int i = 0; i < singleton->main_editor_buttons.size(); i++) {
-
- ToolButton *tb = singleton->main_editor_buttons[i];
+ Button *tb = singleton->main_editor_buttons[i];
EditorPlugin *p_editor = singleton->editor_table[i];
- Ref<Texture> icon = p_editor->get_icon();
+ Ref<Texture2D> icon = p_editor->get_icon();
if (icon.is_valid()) {
tb->set_icon(icon);
- } else if (singleton->gui_base->has_icon(p_editor->get_name(), "EditorIcons")) {
- tb->set_icon(singleton->gui_base->get_icon(p_editor->get_name(), "EditorIcons"));
+ } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), "EditorIcons")) {
+ tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), "EditorIcons"));
}
}
_build_icon_type_cache();
- play_button->set_icon(gui_base->get_icon("MainPlay", "EditorIcons"));
- play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons"));
- play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons"));
- pause_button->set_icon(gui_base->get_icon("Pause", "EditorIcons"));
- stop_button->set_icon(gui_base->get_icon("Stop", "EditorIcons"));
+ play_button->set_icon(gui_base->get_theme_icon("MainPlay", "EditorIcons"));
+ play_scene_button->set_icon(gui_base->get_theme_icon("PlayScene", "EditorIcons"));
+ play_custom_scene_button->set_icon(gui_base->get_theme_icon("PlayCustom", "EditorIcons"));
+ pause_button->set_icon(gui_base->get_theme_icon("Pause", "EditorIcons"));
+ stop_button->set_icon(gui_base->get_theme_icon("Stop", "EditorIcons"));
- prev_scene->set_icon(gui_base->get_icon("PrevScene", "EditorIcons"));
- distraction_free->set_icon(gui_base->get_icon("DistractionFree", "EditorIcons"));
- scene_tab_add->set_icon(gui_base->get_icon("Add", "EditorIcons"));
+ prev_scene->set_icon(gui_base->get_theme_icon("PrevScene", "EditorIcons"));
+ distraction_free->set_icon(gui_base->get_theme_icon("DistractionFree", "EditorIcons"));
+ scene_tab_add->set_icon(gui_base->get_theme_icon("Add", "EditorIcons"));
- bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons"));
+ bottom_panel_raise->set_icon(gui_base->get_theme_icon("ExpandBottomDock", "EditorIcons"));
// clear_button->set_icon(gui_base->get_icon("Close", "EditorIcons")); don't have access to that node. needs to become a class property
dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons"));
dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons"));
PopupMenu *p = help_menu->get_popup();
- p->set_item_icon(p->get_item_index(HELP_SEARCH), gui_base->get_icon("HelpSearch", "EditorIcons"));
- p->set_item_icon(p->get_item_index(HELP_DOCS), gui_base->get_icon("Instance", "EditorIcons"));
- p->set_item_icon(p->get_item_index(HELP_QA), gui_base->get_icon("Instance", "EditorIcons"));
- p->set_item_icon(p->get_item_index(HELP_ISSUES), gui_base->get_icon("Instance", "EditorIcons"));
- p->set_item_icon(p->get_item_index(HELP_COMMUNITY), gui_base->get_icon("Instance", "EditorIcons"));
- p->set_item_icon(p->get_item_index(HELP_ABOUT), gui_base->get_icon("Godot", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_SEARCH), gui_base->get_theme_icon("HelpSearch", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_DOCS), gui_base->get_theme_icon("Instance", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_QA), gui_base->get_theme_icon("Instance", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_ABOUT), gui_base->get_theme_icon("Godot", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_REPORT_A_BUG), gui_base->get_theme_icon("Instance", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_SEND_DOCS_FEEDBACK), gui_base->get_theme_icon("Instance", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_COMMUNITY), gui_base->get_theme_icon("Instance", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(HELP_ABOUT), gui_base->get_theme_icon("Godot", "EditorIcons"));
_update_update_spinner();
} break;
@@ -517,8 +673,9 @@ void EditorNode::_update_update_spinner() {
void EditorNode::_on_plugin_ready(Object *p_script, const String &p_activate_name) {
Ref<Script> script = Object::cast_to<Script>(p_script);
- if (script.is_null())
+ if (script.is_null()) {
return;
+ }
if (p_activate_name.length()) {
set_addon_plugin_enabled(p_activate_name, true);
}
@@ -527,24 +684,25 @@ void EditorNode::_on_plugin_ready(Object *p_script, const String &p_activate_nam
push_item(script.operator->());
}
-void EditorNode::_resources_changed(const PoolVector<String> &p_resources) {
-
- List<Ref<Resource> > changed;
+void EditorNode::_resources_changed(const Vector<String> &p_resources) {
+ List<Ref<Resource>> changed;
int rc = p_resources.size();
for (int i = 0; i < rc; i++) {
-
Ref<Resource> res(ResourceCache::get(p_resources.get(i)));
if (res.is_null()) {
continue;
}
- if (!res->editor_can_reload_from_file())
+ if (!res->editor_can_reload_from_file()) {
continue;
- if (!res->get_path().is_resource_file() && !res->get_path().is_abs_path())
+ }
+ if (!res->get_path().is_resource_file() && !res->get_path().is_abs_path()) {
continue;
- if (!FileAccess::exists(res->get_path()))
+ }
+ if (!FileAccess::exists(res->get_path())) {
continue;
+ }
if (res->get_import_path() != String()) {
//this is an imported resource, will be reloaded if reimported via the _resources_reimported() callback
@@ -555,21 +713,18 @@ void EditorNode::_resources_changed(const PoolVector<String> &p_resources) {
}
if (changed.size()) {
- for (List<Ref<Resource> >::Element *E = changed.front(); E; E = E->next()) {
+ for (List<Ref<Resource>>::Element *E = changed.front(); E; E = E->next()) {
E->get()->reload_from_file();
}
}
}
void EditorNode::_fs_changed() {
-
for (Set<FileDialog *>::Element *E = file_dialogs.front(); E; E = E->next()) {
-
E->get()->invalidate();
}
for (Set<EditorFileDialog *>::Element *E = editor_file_dialogs.front(); E; E = E->next()) {
-
E->get()->invalidate();
}
@@ -591,7 +746,9 @@ void EditorNode::_fs_changed() {
preset.unref();
}
if (preset.is_null()) {
- export_error = vformat("Invalid export preset name: %s.", preset_name);
+ export_error = vformat(
+ "Invalid export preset name: %s. Make sure `export_presets.cfg` is present in the current directory.",
+ preset_name);
} else {
Ref<EditorExportPlatform> platform = preset->get_platform();
if (platform.is_null()) {
@@ -639,7 +796,6 @@ void EditorNode::_fs_changed() {
}
void EditorNode::_resources_reimported(const Vector<String> &p_resources) {
-
List<String> scenes; //will load later
int current_tab = scene_tabs->get_current_tab();
@@ -669,10 +825,13 @@ void EditorNode::_resources_reimported(const Vector<String> &p_resources) {
}
void EditorNode::_sources_changed(bool p_exist) {
-
if (waiting_for_first_scan) {
waiting_for_first_scan = false;
+ // Reload the global shader variables, but this time
+ // loading texures, as they are now properly imported.
+ RenderingServer::get_singleton()->global_variables_load_settings(true);
+
// Start preview thread now that it's safe.
if (!singleton->cmdline_export_mode) {
EditorResourcePreview::get_singleton()->start();
@@ -691,13 +850,12 @@ void EditorNode::_vp_resized() {
}
void EditorNode::_node_renamed() {
-
- if (get_inspector())
+ if (get_inspector()) {
get_inspector()->update_tree();
+ }
}
void EditorNode::_editor_select_next() {
-
int editor = _get_current_main_editor();
do {
@@ -712,7 +870,6 @@ void EditorNode::_editor_select_next() {
}
void EditorNode::_editor_select_prev() {
-
int editor = _get_current_main_editor();
do {
@@ -727,7 +884,6 @@ void EditorNode::_editor_select_prev() {
}
Error EditorNode::load_resource(const String &p_resource, bool p_ignore_broken_deps) {
-
dependency_errors.clear();
Error err;
@@ -735,11 +891,9 @@ Error EditorNode::load_resource(const String &p_resource, bool p_ignore_broken_d
ERR_FAIL_COND_V(!res.is_valid(), ERR_CANT_OPEN);
if (!p_ignore_broken_deps && dependency_errors.has(p_resource)) {
-
//current_option = -1;
Vector<String> errors;
for (Set<String>::Element *E = dependency_errors[p_resource].front(); E; E = E->next()) {
-
errors.push_back(E->get());
}
dependency_error->show(DependencyErrorDialog::MODE_RESOURCE, p_resource, errors);
@@ -753,16 +907,15 @@ Error EditorNode::load_resource(const String &p_resource, bool p_ignore_broken_d
}
void EditorNode::edit_node(Node *p_node) {
-
push_item(p_node);
}
void EditorNode::save_resource_in_path(const Ref<Resource> &p_resource, const String &p_path) {
-
editor_data.apply_changes_in_editors();
int flg = 0;
- if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources")) {
flg |= ResourceSaver::FLAG_COMPRESS;
+ }
String path = ProjectSettings::get_singleton()->localize_path(p_path);
Error err = ResourceSaver::save(path, p_resource, flg | ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS);
@@ -782,7 +935,6 @@ void EditorNode::save_resource_in_path(const Ref<Resource> &p_resource, const St
}
void EditorNode::save_resource(const Ref<Resource> &p_resource) {
-
if (p_resource->get_path().is_resource_file()) {
save_resource_in_path(p_resource, p_resource->get_path());
} else {
@@ -791,7 +943,6 @@ void EditorNode::save_resource(const Ref<Resource> &p_resource) {
}
void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String &p_at_path) {
-
{
String path = p_resource->get_path();
int srpos = path.find("::");
@@ -804,7 +955,7 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String
}
}
- file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
saving_resource = p_resource;
current_option = RESOURCE_SAVE_AS;
@@ -815,7 +966,6 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String
List<String> preferred;
for (int i = 0; i < extensions.size(); i++) {
-
if (p_resource->is_class("Script") && (extensions[i] == "tres" || extensions[i] == "res" || extensions[i] == "xml")) {
//this serves no purpose and confused people
continue;
@@ -825,7 +975,6 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String
}
if (p_at_path != String()) {
-
file->set_current_dir(p_at_path);
if (p_resource->get_path().is_resource_file()) {
file->set_current_file(p_resource->get_path().get_file());
@@ -837,52 +986,42 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String
}
}
} else if (p_resource->get_path() != "") {
-
file->set_current_path(p_resource->get_path());
if (extensions.size()) {
String ext = p_resource->get_path().get_extension().to_lower();
- if (extensions.find(ext) == NULL) {
+ if (extensions.find(ext) == nullptr) {
file->set_current_path(p_resource->get_path().replacen("." + ext, "." + extensions.front()->get()));
}
}
} else if (preferred.size()) {
-
String existing;
if (extensions.size()) {
existing = "new_" + p_resource->get_class().to_lower() + "." + preferred.front()->get().to_lower();
}
file->set_current_path(existing);
}
- file->popup_centered_ratio();
file->set_title(TTR("Save Resource As..."));
+ file->popup_file_dialog();
}
void EditorNode::_menu_option(int p_option) {
-
_menu_option_confirm(p_option, false);
}
void EditorNode::_menu_confirm_current() {
-
_menu_option_confirm(current_option, true);
}
void EditorNode::_dialog_display_save_error(String p_file, Error p_error) {
-
if (p_error) {
-
switch (p_error) {
-
case ERR_FILE_CANT_WRITE: {
-
show_accept(TTR("Can't open file for writing:") + " " + p_file.get_extension(), TTR("OK"));
} break;
case ERR_FILE_UNRECOGNIZED: {
-
show_accept(TTR("Requested file format unknown:") + " " + p_file.get_extension(), TTR("OK"));
} break;
default: {
-
show_accept(TTR("Error while saving."), TTR("OK"));
} break;
}
@@ -890,41 +1029,33 @@ void EditorNode::_dialog_display_save_error(String p_file, Error p_error) {
}
void EditorNode::_dialog_display_load_error(String p_file, Error p_error) {
-
if (p_error) {
-
switch (p_error) {
-
case ERR_CANT_OPEN: {
-
- show_accept(vformat(TTR("Can't open '%s'. The file could have been moved or deleted."), p_file.get_file()), TTR("OK"));
+ show_accept(vformat(TTR("Can't open file '%s'. The file could have been moved or deleted."), p_file.get_file()), TTR("OK"));
} break;
case ERR_PARSE_ERROR: {
-
- show_accept(vformat(TTR("Error while parsing '%s'."), p_file.get_file()), TTR("OK"));
+ show_accept(vformat(TTR("Error while parsing file '%s'."), p_file.get_file()), TTR("OK"));
} break;
case ERR_FILE_CORRUPT: {
-
- show_accept(vformat(TTR("Unexpected end of file '%s'."), p_file.get_file()), TTR("OK"));
+ show_accept(vformat(TTR("Scene file '%s' appears to be invalid/corrupt."), p_file.get_file()), TTR("OK"));
} break;
case ERR_FILE_NOT_FOUND: {
-
- show_accept(vformat(TTR("Missing '%s' or its dependencies."), p_file.get_file()), TTR("OK"));
+ show_accept(vformat(TTR("Missing file '%s' or one its dependencies."), p_file.get_file()), TTR("OK"));
} break;
default: {
-
- show_accept(vformat(TTR("Error while loading '%s'."), p_file.get_file()), TTR("OK"));
+ show_accept(vformat(TTR("Error while loading file '%s'."), p_file.get_file()), TTR("OK"));
} break;
}
}
}
void EditorNode::_get_scene_metadata(const String &p_file) {
-
Node *scene = editor_data.get_edited_scene_root();
- if (!scene)
+ if (!scene) {
return;
+ }
String path = EditorSettings::get_singleton()->get_project_settings_dir().plus_file(p_file.get_file() + "-editstate-" + p_file.md5_text() + ".cfg");
@@ -932,15 +1063,15 @@ void EditorNode::_get_scene_metadata(const String &p_file) {
cf.instance();
Error err = cf->load(path);
- if (err != OK || !cf->has_section("editor_states"))
+ if (err != OK || !cf->has_section("editor_states")) {
return; //must not exist
+ }
List<String> esl;
cf->get_section_keys("editor_states", &esl);
Dictionary md;
for (List<String>::Element *E = esl.front(); E; E = E->next()) {
-
Variant st = cf->get_value("editor_states", E->get());
if (st.get_type() != Variant::NIL) {
md[E->get()] = st;
@@ -951,11 +1082,11 @@ void EditorNode::_get_scene_metadata(const String &p_file) {
}
void EditorNode::_set_scene_metadata(const String &p_file, int p_idx) {
-
Node *scene = editor_data.get_edited_scene_root(p_idx);
- if (!scene)
+ if (!scene) {
return;
+ }
scene->set_meta("__editor_run_settings__", Variant()); //clear it (no point in keeping it)
scene->set_meta("__editor_plugin_states__", Variant());
@@ -977,7 +1108,6 @@ void EditorNode::_set_scene_metadata(const String &p_file, int p_idx) {
md.get_key_list(&keys);
for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {
-
cf->set_value("editor_states", E->get(), md[E->get()]);
}
@@ -986,12 +1116,11 @@ void EditorNode::_set_scene_metadata(const String &p_file, int p_idx) {
}
bool EditorNode::_find_and_save_resource(RES p_res, Map<RES, bool> &processed, int32_t flags) {
-
- if (p_res.is_null())
+ if (p_res.is_null()) {
return false;
+ }
if (processed.has(p_res)) {
-
return processed[p_res];
}
@@ -1008,55 +1137,51 @@ bool EditorNode::_find_and_save_resource(RES p_res, Map<RES, bool> &processed, i
processed[p_res] = false; //because it's a file
return false;
} else {
-
processed[p_res] = changed;
return changed;
}
}
bool EditorNode::_find_and_save_edited_subresources(Object *obj, Map<RES, bool> &processed, int32_t flags) {
-
bool ret_changed = false;
List<PropertyInfo> pi;
obj->get_property_list(&pi);
for (List<PropertyInfo>::Element *E = pi.front(); E; E = E->next()) {
-
- if (!(E->get().usage & PROPERTY_USAGE_STORAGE))
+ if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) {
continue;
+ }
switch (E->get().type) {
case Variant::OBJECT: {
-
RES res = obj->get(E->get().name);
- if (_find_and_save_resource(res, processed, flags))
+ if (_find_and_save_resource(res, processed, flags)) {
ret_changed = true;
+ }
} break;
case Variant::ARRAY: {
-
Array varray = obj->get(E->get().name);
int len = varray.size();
for (int i = 0; i < len; i++) {
-
const Variant &v = varray.get(i);
RES res = v;
- if (_find_and_save_resource(res, processed, flags))
+ if (_find_and_save_resource(res, processed, flags)) {
ret_changed = true;
+ }
}
} break;
case Variant::DICTIONARY: {
-
Dictionary d = obj->get(E->get().name);
List<Variant> keys;
d.get_key_list(&keys);
for (List<Variant>::Element *F = keys.front(); F; F = F->next()) {
-
Variant v = d[F->get()];
RES res = v;
- if (_find_and_save_resource(res, processed, flags))
+ if (_find_and_save_resource(res, processed, flags)) {
ret_changed = true;
+ }
}
} break;
default: {
@@ -1068,37 +1193,37 @@ bool EditorNode::_find_and_save_edited_subresources(Object *obj, Map<RES, bool>
}
void EditorNode::_save_edited_subresources(Node *scene, Map<RES, bool> &processed, int32_t flags) {
-
_find_and_save_edited_subresources(scene, processed, flags);
for (int i = 0; i < scene->get_child_count(); i++) {
-
Node *n = scene->get_child(i);
- if (n->get_owner() != editor_data.get_edited_scene_root())
+ if (n->get_owner() != editor_data.get_edited_scene_root()) {
continue;
+ }
_save_edited_subresources(n, processed, flags);
}
}
void EditorNode::_find_node_types(Node *p_node, int &count_2d, int &count_3d) {
-
- if (p_node->is_class("Viewport") || (p_node != editor_data.get_edited_scene_root() && p_node->get_owner() != editor_data.get_edited_scene_root()))
+ if (p_node->is_class("Viewport") || (p_node != editor_data.get_edited_scene_root() && p_node->get_owner() != editor_data.get_edited_scene_root())) {
return;
+ }
- if (p_node->is_class("CanvasItem"))
+ if (p_node->is_class("CanvasItem")) {
count_2d++;
- else if (p_node->is_class("Spatial"))
+ } else if (p_node->is_class("Node3D")) {
count_3d++;
+ }
- for (int i = 0; i < p_node->get_child_count(); i++)
+ for (int i = 0; i < p_node->get_child_count(); i++) {
_find_node_types(p_node->get_child(i), count_2d, count_3d);
+ }
}
void EditorNode::_save_scene_with_preview(String p_file, int p_idx) {
-
EditorProgress save("save", TTR("Saving Scene"), 4);
- if (editor_data.get_edited_scene_root() != NULL) {
+ if (editor_data.get_edited_scene_root() != nullptr) {
save.step(TTR("Analyzing"), 0);
int c2d = 0;
@@ -1106,24 +1231,31 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) {
_find_node_types(editor_data.get_edited_scene_root(), c2d, c3d);
- bool is2d;
- if (c3d < c2d) {
- is2d = true;
- } else {
- is2d = false;
- }
save.step(TTR("Creating Thumbnail"), 1);
//current view?
Ref<Image> img;
- if (is2d) {
- img = scene_root->get_texture()->get_data();
+ // If neither 3D or 2D nodes are present, make a 1x1 black texture.
+ // We cannot fallback on the 2D editor, because it may not have been used yet,
+ // which would result in an invalid texture.
+ if (c3d == 0 && c2d == 0) {
+ img.instance();
+ img->create(1, 1, 0, Image::FORMAT_RGB8);
+ } else if (c3d < c2d) {
+ Ref<ViewportTexture> viewport_texture = scene_root->get_texture();
+ if (viewport_texture->get_width() > 0 && viewport_texture->get_height() > 0) {
+ img = viewport_texture->get_data();
+ }
} else {
- img = SpatialEditor::get_singleton()->get_editor_viewport(0)->get_viewport_node()->get_texture()->get_data();
+ // The 3D editor may be disabled as a feature, but scenes can still be opened.
+ // This check prevents the preview from regenerating in case those scenes are then saved.
+ Ref<EditorFeatureProfile> profile = feature_profile_manager->get_current_profile();
+ if (profile.is_valid() && !profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D)) {
+ img = Node3DEditor::get_singleton()->get_editor_viewport(0)->get_viewport_node()->get_texture()->get_data();
+ }
}
- if (img.is_valid()) {
-
+ if (img.is_valid() && img->get_width() > 0 && img->get_height() > 0) {
img = img->duplicate();
save.step(TTR("Creating Thumbnail"), 2);
@@ -1152,8 +1284,6 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) {
}
img->convert(Image::FORMAT_RGB8);
- img->flip_y();
-
//save thumbnail directly, as thumbnailer may not update due to actual scene not changing md5
String temp_path = EditorSettings::get_singleton()->get_cache_dir();
String cache_base = ProjectSettings::get_singleton()->globalize_path(p_file).md5_text();
@@ -1177,7 +1307,6 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) {
}
bool EditorNode::_validate_scene_recursive(const String &p_filename, Node *p_node) {
-
for (int i = 0; i < p_node->get_child_count(); i++) {
Node *child = p_node->get_child(i);
if (child->get_filename() == p_filename) {
@@ -1192,8 +1321,7 @@ bool EditorNode::_validate_scene_recursive(const String &p_filename, Node *p_nod
return false;
}
-static bool _find_edited_resources(const Ref<Resource> &p_resource, Set<Ref<Resource> > &edited_resources) {
-
+static bool _find_edited_resources(const Ref<Resource> &p_resource, Set<Ref<Resource>> &edited_resources) {
if (p_resource->is_edited()) {
edited_resources.insert(p_resource);
return true;
@@ -1225,19 +1353,20 @@ int EditorNode::_save_external_resources() {
//save external resources and its subresources if any was modified
int flg = 0;
- if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources")) {
flg |= ResourceSaver::FLAG_COMPRESS;
+ }
flg |= ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS;
- Set<Ref<Resource> > edited_subresources;
+ Set<Ref<Resource>> edited_subresources;
int saved = 0;
- List<Ref<Resource> > cached;
+ List<Ref<Resource>> cached;
ResourceCache::get_cached_resources(&cached);
- for (List<Ref<Resource> >::Element *E = cached.front(); E; E = E->next()) {
-
+ for (List<Ref<Resource>>::Element *E = cached.front(); E; E = E->next()) {
Ref<Resource> res = E->get();
- if (!res->get_path().is_resource_file())
+ if (!res->get_path().is_resource_file()) {
continue;
+ }
//not only check if this resourec is edited, check contained subresources too
if (_find_edited_resources(res, edited_subresources)) {
ResourceSaver::save(res->get_path(), res, flg);
@@ -1248,7 +1377,7 @@ int EditorNode::_save_external_resources() {
// clear later, because user may have put the same subresource in two different resources,
// which will be shared until the next reload
- for (Set<Ref<Resource> >::Element *E = edited_subresources.front(); E; E = E->next()) {
+ for (Set<Ref<Resource>>::Element *E = edited_subresources.front(); E; E = E->next()) {
Ref<Resource> res = E->get();
res->set_edited(false);
}
@@ -1257,11 +1386,9 @@ int EditorNode::_save_external_resources() {
}
void EditorNode::_save_scene(String p_file, int idx) {
-
Node *scene = editor_data.get_edited_scene_root(idx);
if (!scene) {
-
show_accept(TTR("This operation can't be done without a tree root."), TTR("OK"));
return;
}
@@ -1284,17 +1411,17 @@ void EditorNode::_save_scene(String p_file, int idx) {
// old version still work for referencing changes in instanced or inherited scenes
sdata = Ref<PackedScene>(Object::cast_to<PackedScene>(ResourceCache::get(p_file)));
- if (sdata.is_valid())
+ if (sdata.is_valid()) {
sdata->recreate_state();
- else
+ } else {
sdata.instance();
+ }
} else {
sdata.instance();
}
Error err = sdata->pack(scene);
if (err != OK) {
-
show_accept(TTR("Couldn't save scene. Likely dependencies (instances or inheritance) couldn't be satisfied."), TTR("OK"));
return;
}
@@ -1309,8 +1436,9 @@ void EditorNode::_save_scene(String p_file, int idx) {
memdelete(dummy_scene);
int flg = 0;
- if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources")) {
flg |= ResourceSaver::FLAG_COMPRESS;
+ }
flg |= ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS;
err = ResourceSaver::save(p_file, sdata, flg);
@@ -1320,29 +1448,27 @@ void EditorNode::_save_scene(String p_file, int idx) {
editor_data.save_editor_external_data();
if (err == OK) {
scene->set_filename(ProjectSettings::get_singleton()->localize_path(p_file));
- if (idx < 0 || idx == editor_data.get_edited_scene())
+ if (idx < 0 || idx == editor_data.get_edited_scene()) {
set_current_version(editor_data.get_undo_redo().get_version());
- else
+ } else {
editor_data.set_edited_scene_version(0, idx);
+ }
editor_folding.save_scene_folding(scene, p_file);
_update_title();
_update_scene_tabs();
} else {
-
_dialog_display_save_error(p_file, err);
}
}
void EditorNode::save_all_scenes() {
-
_menu_option_confirm(RUN_STOP, true);
_save_all_scenes();
}
void EditorNode::save_scene_list(Vector<String> p_scene_filenames) {
-
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
Node *scene = editor_data.get_edited_scene_root(i);
@@ -1353,7 +1479,6 @@ void EditorNode::save_scene_list(Vector<String> p_scene_filenames) {
}
void EditorNode::restart_editor() {
-
exiting = true;
String to_reopen;
@@ -1375,14 +1500,14 @@ void EditorNode::restart_editor() {
}
void EditorNode::_save_all_scenes() {
-
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
Node *scene = editor_data.get_edited_scene_root(i);
if (scene && scene->get_filename() != "") {
- if (i != editor_data.get_edited_scene())
+ if (i != editor_data.get_edited_scene()) {
_save_scene(scene->get_filename(), i);
- else
+ } else {
_save_scene_with_preview(scene->get_filename());
+ }
} // else: ignore new scenes
}
@@ -1390,21 +1515,19 @@ void EditorNode::_save_all_scenes() {
}
void EditorNode::_mark_unsaved_scenes() {
-
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
-
Node *node = editor_data.get_edited_scene_root(i);
- if (!node)
+ if (!node) {
continue;
+ }
String path = node->get_filename();
if (!(path == String() || FileAccess::exists(path))) {
-
- node->set_filename("");
- if (i == editor_data.get_edited_scene())
+ if (i == editor_data.get_edited_scene()) {
set_current_version(-1);
- else
+ } else {
editor_data.set_edited_scene_version(-1, i);
+ }
}
}
@@ -1413,23 +1536,20 @@ void EditorNode::_mark_unsaved_scenes() {
}
void EditorNode::_dialog_action(String p_file) {
-
switch (current_option) {
case FILE_NEW_INHERITED_SCENE: {
-
Node *scene = editor_data.get_edited_scene_root();
// If the previous scene is rootless, just close it in favor of the new one.
- if (!scene)
+ if (!scene) {
_menu_option_confirm(FILE_CLOSE, true);
+ }
load_scene(p_file, false, true);
} break;
case FILE_OPEN_SCENE: {
-
load_scene(p_file);
} break;
case SETTINGS_PICK_MAIN_SCENE: {
-
ProjectSettings::get_singleton()->set("application/run/main_scene", p_file);
ProjectSettings::get_singleton()->save();
//would be nice to show the project manager opened with the highlighted field..
@@ -1446,14 +1566,14 @@ void EditorNode::_dialog_action(String p_file) {
case SCENE_TAB_CLOSE:
case FILE_SAVE_SCENE:
case FILE_SAVE_AS_SCENE: {
-
int scene_idx = (current_option == FILE_SAVE_SCENE || current_option == FILE_SAVE_AS_SCENE) ? -1 : tab_closing;
- if (file->get_mode() == EditorFileDialog::MODE_SAVE_FILE) {
+ if (file->get_file_mode() == EditorFileDialog::FILE_MODE_SAVE_FILE) {
bool same_open_scene = false;
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
- if (editor_data.get_scene_path(i) == p_file && i != scene_idx)
+ if (editor_data.get_scene_path(i) == p_file && i != scene_idx) {
same_open_scene = true;
+ }
}
if (same_open_scene) {
@@ -1466,15 +1586,15 @@ void EditorNode::_dialog_action(String p_file) {
_add_to_recent_scenes(p_file);
save_layout();
- if (scene_idx != -1)
+ if (scene_idx != -1) {
_discard_changes();
+ }
}
} break;
case FILE_SAVE_AND_RUN: {
- if (file->get_mode() == EditorFileDialog::MODE_SAVE_FILE) {
-
+ if (file->get_file_mode() == EditorFileDialog::FILE_MODE_SAVE_FILE) {
_save_default_environment();
_save_scene_with_preview(p_file);
_run(false, p_file);
@@ -1482,7 +1602,6 @@ void EditorNode::_dialog_action(String p_file) {
} break;
case FILE_EXPORT_MESH_LIBRARY: {
-
Ref<MeshLibrary> ml;
if (file_export_lib_merge->is_pressed() && FileAccess::exists(p_file)) {
ml = ResourceLoader::load(p_file, "MeshLibrary");
@@ -1507,7 +1626,6 @@ void EditorNode::_dialog_action(String p_file) {
} break;
case FILE_EXPORT_TILESET: {
-
Ref<TileSet> tileset;
if (FileAccess::exists(p_file) && file_export_lib_merge->is_pressed()) {
tileset = ResourceLoader::load(p_file, "TileSet");
@@ -1525,7 +1643,6 @@ void EditorNode::_dialog_action(String p_file) {
Error err = ResourceSaver::save(p_file, tileset);
if (err) {
-
show_accept(TTR("Error saving TileSet!"), TTR("OK"));
return;
}
@@ -1533,19 +1650,18 @@ void EditorNode::_dialog_action(String p_file) {
case RESOURCE_SAVE:
case RESOURCE_SAVE_AS: {
-
ERR_FAIL_COND(saving_resource.is_null());
save_resource_in_path(saving_resource, p_file);
saving_resource = Ref<Resource>();
ObjectID current = editor_history.get_current();
- Object *current_obj = current > 0 ? ObjectDB::get_instance(current) : NULL;
+ Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
ERR_FAIL_COND(!current_obj);
current_obj->_change_notify();
} break;
case SETTINGS_LAYOUT_SAVE: {
-
- if (p_file.empty())
+ if (p_file.empty()) {
return;
+ }
Ref<ConfigFile> config;
config.instance();
@@ -1571,9 +1687,9 @@ void EditorNode::_dialog_action(String p_file) {
} break;
case SETTINGS_LAYOUT_DELETE: {
-
- if (p_file.empty())
+ if (p_file.empty()) {
return;
+ }
Ref<ConfigFile> config;
config.instance();
@@ -1603,7 +1719,7 @@ void EditorNode::_dialog_action(String p_file) {
} break;
default: { //save scene?
- if (file->get_mode() == EditorFileDialog::MODE_SAVE_FILE) {
+ if (file->get_file_mode() == EditorFileDialog::FILE_MODE_SAVE_FILE) {
_save_scene_with_preview(p_file);
}
@@ -1612,7 +1728,6 @@ void EditorNode::_dialog_action(String p_file) {
}
bool EditorNode::item_has_editor(Object *p_object) {
-
if (_is_class_editor_disabled_by_feature_profile(p_object->get_class())) {
return false;
}
@@ -1625,7 +1740,6 @@ void EditorNode::edit_item_resource(RES p_resource) {
}
bool EditorNode::_is_class_editor_disabled_by_feature_profile(const StringName &p_class) {
-
Ref<EditorFeatureProfile> profile = EditorFeatureProfileManager::get_singleton()->get_current_profile();
if (profile.is_null()) {
return false;
@@ -1634,7 +1748,6 @@ bool EditorNode::_is_class_editor_disabled_by_feature_profile(const StringName &
StringName class_name = p_class;
while (class_name != StringName()) {
-
if (profile->is_class_disabled(class_name)) {
return true;
}
@@ -1648,7 +1761,6 @@ bool EditorNode::_is_class_editor_disabled_by_feature_profile(const StringName &
}
void EditorNode::edit_item(Object *p_object) {
-
Vector<EditorPlugin *> sub_plugins;
if (p_object) {
@@ -1659,7 +1771,6 @@ void EditorNode::edit_item(Object *p_object) {
}
if (!sub_plugins.empty()) {
-
bool same = true;
if (sub_plugins.size() == editor_plugins_over->get_plugins_list().size()) {
for (int i = 0; i < sub_plugins.size(); i++) {
@@ -1682,32 +1793,30 @@ void EditorNode::edit_item(Object *p_object) {
}
void EditorNode::push_item(Object *p_object, const String &p_property, bool p_inspector_only) {
-
if (!p_object) {
- get_inspector()->edit(NULL);
- node_dock->set_node(NULL);
- scene_tree_dock->set_selected(NULL);
- inspector_dock->update(NULL);
+ get_inspector()->edit(nullptr);
+ node_dock->set_node(nullptr);
+ scene_tree_dock->set_selected(nullptr);
+ inspector_dock->update(nullptr);
return;
}
- uint32_t id = p_object->get_instance_id();
+ ObjectID id = p_object->get_instance_id();
if (id != editor_history.get_current()) {
-
if (p_inspector_only) {
editor_history.add_object_inspector_only(id);
- } else if (p_property == "")
+ } else if (p_property == "") {
editor_history.add_object(id);
- else
+ } else {
editor_history.add_object(id, p_property);
+ }
}
_edit_current();
}
void EditorNode::_save_default_environment() {
-
- Ref<Environment> fallback = get_tree()->get_root()->get_world()->get_fallback_environment();
+ Ref<Environment> fallback = get_tree()->get_root()->get_world_3d()->get_fallback_environment();
if (fallback.is_valid() && fallback->get_path().is_resource_file()) {
Map<RES, bool> processed;
@@ -1717,7 +1826,6 @@ void EditorNode::_save_default_environment() {
}
void EditorNode::hide_top_editors() {
-
_display_top_editors(false);
editor_plugins_over->clear();
@@ -1736,29 +1844,27 @@ void EditorNode::_set_editing_top_editors(Object *p_current_object) {
}
static bool overrides_external_editor(Object *p_object) {
-
Script *script = Object::cast_to<Script>(p_object);
- if (!script)
+ if (!script) {
return false;
+ }
return script->get_language()->overrides_external_editor();
}
void EditorNode::_edit_current() {
-
- uint32_t current = editor_history.get_current();
- Object *current_obj = current > 0 ? ObjectDB::get_instance(current) : NULL;
+ ObjectID current = editor_history.get_current();
+ Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
bool inspector_only = editor_history.is_current_inspector_only();
this->current = current_obj;
if (!current_obj) {
-
- scene_tree_dock->set_selected(NULL);
- get_inspector()->edit(NULL);
- node_dock->set_node(NULL);
- inspector_dock->update(NULL);
+ scene_tree_dock->set_selected(nullptr);
+ get_inspector()->edit(nullptr);
+ node_dock->set_node(nullptr);
+ inspector_dock->update(nullptr);
_display_top_editors(false);
@@ -1775,13 +1881,12 @@ void EditorNode::_edit_current() {
String editable_warning; //none by default
if (is_resource) {
-
Resource *current_res = Object::cast_to<Resource>(current_obj);
ERR_FAIL_COND(!current_res);
get_inspector()->edit(current_res);
- scene_tree_dock->set_selected(NULL);
- node_dock->set_node(NULL);
- inspector_dock->update(NULL);
+ scene_tree_dock->set_selected(nullptr);
+ node_dock->set_node(nullptr);
+ inspector_dock->update(nullptr);
EditorNode::get_singleton()->get_import_dock()->set_edit_path(current_res->get_path());
int subr_idx = current_res->get_path().find("::");
@@ -1800,7 +1905,6 @@ void EditorNode::_edit_current() {
}
}
} else if (is_node) {
-
Node *current_node = Object::cast_to<Node>(current_obj);
ERR_FAIL_COND(!current_node);
@@ -1810,9 +1914,9 @@ void EditorNode::_edit_current() {
scene_tree_dock->set_selected(current_node);
inspector_dock->update(current_node);
} else {
- node_dock->set_node(NULL);
- scene_tree_dock->set_selected(NULL);
- inspector_dock->update(NULL);
+ node_dock->set_node(nullptr);
+ scene_tree_dock->set_selected(nullptr);
+ inspector_dock->update(nullptr);
}
if (get_edited_scene() && get_edited_scene()->get_filename() != String()) {
@@ -1823,10 +1927,9 @@ void EditorNode::_edit_current() {
}
} else {
+ Node *selected_node = nullptr;
- Node *selected_node = NULL;
-
- if (current_obj->is_class("ScriptEditorDebuggerInspectedObject")) {
+ if (current_obj->is_class("EditorDebuggerRemoteObject")) {
editable_warning = TTR("This is a remote object, so changes to it won't be kept.\nPlease read the documentation relevant to debugging to better understand this workflow.");
capitalize = false;
disable_folding = true;
@@ -1853,9 +1956,9 @@ void EditorNode::_edit_current() {
}
get_inspector()->edit(current_obj);
- node_dock->set_node(NULL);
+ node_dock->set_node(nullptr);
scene_tree_dock->set_selected(selected_node);
- inspector_dock->update(NULL);
+ inspector_dock->update(nullptr);
}
if (current_obj == prev_inspected_object) {
@@ -1876,30 +1979,29 @@ void EditorNode::_edit_current() {
/* Take care of PLUGIN EDITOR */
if (!inspector_only) {
-
EditorPlugin *main_plugin = editor_data.get_editor(current_obj);
for (int i = 0; i < editor_table.size(); i++) {
if (editor_table[i] == main_plugin && !main_editor_buttons[i]->is_visible()) {
- main_plugin = NULL; //if button is not visible, then no plugin active
+ main_plugin = nullptr; //if button is not visible, then no plugin active
}
}
if (main_plugin) {
-
// special case if use of external editor is true
if (main_plugin->get_name() == "Script" && current_obj->get_class_name() != StringName("VisualScript") && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) {
- if (!changing_scene)
+ if (!changing_scene) {
main_plugin->edit(current_obj);
+ }
}
else if (main_plugin != editor_plugin_screen && (!ScriptEditor::get_singleton() || !ScriptEditor::get_singleton()->is_visible_in_tree() || ScriptEditor::get_singleton()->can_take_away_focus())) {
// update screen main_plugin
if (!changing_scene) {
-
- if (editor_plugin_screen)
+ if (editor_plugin_screen) {
editor_plugin_screen->make_visible(false);
+ }
editor_plugin_screen = main_plugin;
editor_plugin_screen->edit(current_obj);
@@ -1911,13 +2013,11 @@ void EditorNode::_edit_current() {
}
for (int i = 0; i < editor_table.size(); i++) {
-
main_editor_buttons[i]->set_pressed(editor_table[i] == main_plugin);
}
}
} else {
-
editor_plugin_screen->edit(current_obj);
}
}
@@ -1935,7 +2035,6 @@ void EditorNode::_edit_current() {
_set_editing_top_editors(current_obj);
_display_top_editors(true);
} else if (!editor_plugins_over->get_plugins_list().empty()) {
-
hide_top_editors();
}
}
@@ -1945,7 +2044,6 @@ void EditorNode::_edit_current() {
}
void EditorNode::_run(bool p_current, const String &p_custom) {
-
if (editor_run.get_status() == EditorRun::STATUS_PLAY) {
play_button->set_pressed(!_playing_edited);
play_scene_button->set_pressed(_playing_edited);
@@ -1953,19 +2051,17 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
}
play_button->set_pressed(false);
- play_button->set_icon(gui_base->get_icon("MainPlay", "EditorIcons"));
+ play_button->set_icon(gui_base->get_theme_icon("MainPlay", "EditorIcons"));
play_scene_button->set_pressed(false);
- play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons"));
+ play_scene_button->set_icon(gui_base->get_theme_icon("PlayScene", "EditorIcons"));
play_custom_scene_button->set_pressed(false);
- play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons"));
+ play_custom_scene_button->set_icon(gui_base->get_theme_icon("PlayCustom", "EditorIcons"));
- String main_scene;
String run_filename;
String args;
bool skip_breakpoints;
- if (p_current || (editor_data.get_edited_scene_root() && p_custom == editor_data.get_edited_scene_root()->get_filename())) {
-
+ if (p_current || (editor_data.get_edited_scene_root() && p_custom != String() && p_custom == editor_data.get_edited_scene_root()->get_filename())) {
Node *scene = editor_data.get_edited_scene_root();
if (!scene) {
@@ -1985,7 +2081,6 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
}
if (run_filename == "") {
-
//evidently, run the scene
if (!ensure_main_scene(false)) {
return;
@@ -1993,19 +2088,10 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
}
if (bool(EDITOR_GET("run/auto_save/save_before_running"))) {
-
if (unsaved_cache) {
-
Node *scene = editor_data.get_edited_scene_root();
- if (scene) { //only autosave if there is a scene obviously
-
- if (scene->get_filename() == "") {
-
- show_accept(TTR("Current scene was never saved, please save it prior to running."), TTR("OK"));
- return;
- }
-
+ if (scene && scene->get_filename() != "") { // Only autosave if there is a scene and if it has a path.
_save_scene_with_preview(scene->get_filename());
}
}
@@ -2013,8 +2099,9 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
editor_data.save_editor_external_data();
}
- if (!call_build())
+ if (!call_build()) {
return;
+ }
if (bool(EDITOR_GET("run/output/always_clear_output_on_play"))) {
log->clear();
@@ -2028,12 +2115,12 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
editor_data.get_editor_breakpoints(&breakpoints);
args = ProjectSettings::get_singleton()->get("editor/main_run_args");
- skip_breakpoints = ScriptEditor::get_singleton()->get_debugger()->is_skip_breakpoints();
+ skip_breakpoints = EditorDebuggerNode::get_singleton()->is_skip_breakpoints();
+ EditorDebuggerNode::get_singleton()->start();
Error error = editor_run.run(run_filename, args, breakpoints, skip_breakpoints);
-
if (error != OK) {
-
+ EditorDebuggerNode::get_singleton()->stop();
show_accept(TTR("Could not start subprocess!"), TTR("OK"));
return;
}
@@ -2041,40 +2128,55 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
emit_signal("play_pressed");
if (p_current) {
play_scene_button->set_pressed(true);
- play_scene_button->set_icon(gui_base->get_icon("Reload", "EditorIcons"));
+ play_scene_button->set_icon(gui_base->get_theme_icon("Reload", "EditorIcons"));
} else if (p_custom != "") {
run_custom_filename = p_custom;
play_custom_scene_button->set_pressed(true);
- play_custom_scene_button->set_icon(gui_base->get_icon("Reload", "EditorIcons"));
+ play_custom_scene_button->set_icon(gui_base->get_theme_icon("Reload", "EditorIcons"));
} else {
play_button->set_pressed(true);
- play_button->set_icon(gui_base->get_icon("Reload", "EditorIcons"));
+ play_button->set_icon(gui_base->get_theme_icon("Reload", "EditorIcons"));
}
stop_button->set_disabled(false);
_playing_edited = p_current;
}
-void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
+void EditorNode::_run_native(const Ref<EditorExportPreset> &p_preset) {
+ bool autosave = EDITOR_GET("run/auto_save/save_before_running");
+ if (autosave) {
+ _menu_option_confirm(FILE_SAVE_ALL_SCENES, false);
+ }
+ if (run_native->is_deploy_debug_remote_enabled()) {
+ _menu_option_confirm(RUN_STOP, true);
+
+ if (!call_build()) {
+ return; // build failed
+ }
+
+ EditorDebuggerNode::get_singleton()->start(p_preset->get_platform()->get_debug_protocol());
+ emit_signal("play_pressed");
+ editor_run.run_native_notify();
+ }
+}
- if (!p_confirmed) //this may be a hack..
+void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
+ if (!p_confirmed) { //this may be a hack..
current_option = (MenuOptions)p_option;
+ }
switch (p_option) {
case FILE_NEW_SCENE: {
-
new_scene();
} break;
case FILE_NEW_INHERITED_SCENE:
case FILE_OPEN_SCENE: {
-
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions);
file->clear_filters();
for (int i = 0; i < extensions.size(); i++) {
-
file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
@@ -2083,31 +2185,28 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
file->set_current_path(scene->get_filename());
};
file->set_title(p_option == FILE_OPEN_SCENE ? TTR("Open Scene") : TTR("Open Base Scene"));
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} break;
case FILE_QUICK_OPEN: {
-
quick_open->popup_dialog("Resource", true);
quick_open->set_title(TTR("Quick Open..."));
} break;
case FILE_QUICK_OPEN_SCENE: {
-
quick_open->popup_dialog("PackedScene", true);
quick_open->set_title(TTR("Quick Open Scene..."));
} break;
case FILE_QUICK_OPEN_SCRIPT: {
-
quick_open->popup_dialog("Script", true);
quick_open->set_title(TTR("Quick Open Script..."));
} break;
case FILE_OPEN_PREV: {
-
- if (previous_scenes.empty())
+ if (previous_scenes.empty()) {
break;
+ }
opening_prev = true;
open_request(previous_scenes.back()->get());
previous_scenes.pop_back();
@@ -2121,20 +2220,21 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
next_tab %= editor_data.get_edited_scene_count();
_scene_tab_closed(next_tab, current_option);
} else {
- if (current_option != FILE_CLOSE_ALL)
+ if (current_option != FILE_CLOSE_ALL) {
current_option = -1;
- else
+ } else {
_scene_tab_closed(editor_data.get_edited_scene());
+ }
}
- if (p_confirmed)
+ if (p_confirmed) {
_menu_option_confirm(SCENE_TAB_CLOSE, true);
+ }
} break;
case FILE_CLOSE_ALL_AND_QUIT:
case FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER:
case FILE_CLOSE: {
-
if (!p_confirmed) {
tab_closing = p_option == FILE_CLOSE ? editor_data.get_edited_scene() : _next_unsaved_scene(false);
@@ -2142,7 +2242,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
String scene_filename = editor_data.get_edited_scene_root(tab_closing)->get_filename();
save_confirmation->get_ok()->set_text(TTR("Save & Close"));
save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), scene_filename != "" ? scene_filename : "unsaved scene"));
- save_confirmation->popup_centered_minsize();
+ save_confirmation->popup_centered();
break;
}
} else if (p_option == FILE_CLOSE) {
@@ -2154,28 +2254,28 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
break;
}
- FALLTHROUGH;
+ [[fallthrough]];
}
case SCENE_TAB_CLOSE:
case FILE_SAVE_SCENE: {
-
int scene_idx = (p_option == FILE_SAVE_SCENE) ? -1 : tab_closing;
Node *scene = editor_data.get_edited_scene_root(scene_idx);
if (scene && scene->get_filename() != "") {
-
- if (scene_idx != editor_data.get_edited_scene())
+ if (scene_idx != editor_data.get_edited_scene()) {
_save_scene_with_preview(scene->get_filename(), scene_idx);
- else
+ } else {
_save_scene_with_preview(scene->get_filename());
+ }
- if (scene_idx != -1)
+ if (scene_idx != -1) {
_discard_changes();
+ }
save_layout();
break;
}
- FALLTHROUGH;
+ [[fallthrough]];
}
case FILE_SAVE_AS_SCENE: {
int scene_idx = (p_option == FILE_SAVE_SCENE || p_option == FILE_SAVE_AS_SCENE) ? -1 : tab_closing;
@@ -2183,7 +2283,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
Node *scene = editor_data.get_edited_scene_root(scene_idx);
if (!scene) {
-
int saved = _save_external_resources();
String err_text;
if (saved > 0) {
@@ -2196,14 +2295,13 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
break;
}
- file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
List<String> extensions;
Ref<PackedScene> sd = memnew(PackedScene);
ResourceSaver::get_recognized_extensions(sd, &extensions);
file->clear_filters();
for (int i = 0; i < extensions.size(); i++) {
-
file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
@@ -2211,12 +2309,11 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
file->set_current_path(scene->get_filename());
if (extensions.size()) {
String ext = scene->get_filename().get_extension().to_lower();
- if (extensions.find(ext) == NULL) {
+ if (extensions.find(ext) == nullptr) {
file->set_current_path(scene->get_filename().replacen("." + ext, "." + extensions.front()->get()));
}
}
} else {
-
String existing;
if (extensions.size()) {
String root_name(scene->get_name());
@@ -2224,13 +2321,12 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
file->set_current_path(existing);
}
- file->popup_centered_ratio();
+ file->popup_file_dialog();
file->set_title(TTR("Save Scene As..."));
} break;
case FILE_SAVE_ALL_SCENES: {
-
_save_all_scenes();
} break;
case FILE_SAVE_BEFORE_RUN: {
@@ -2238,7 +2334,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
confirmation->get_cancel()->set_text(TTR("No"));
confirmation->get_ok()->set_text(TTR("Yes"));
confirmation->set_text(TTR("This scene has never been saved. Save before running?"));
- confirmation->popup_centered_minsize();
+ confirmation->popup_centered();
break;
}
@@ -2247,14 +2343,11 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case FILE_EXPORT_PROJECT: {
-
project_export->popup_export();
} break;
case FILE_EXPORT_MESH_LIBRARY: {
-
if (!editor_data.get_edited_scene_root()) {
-
show_accept(TTR("This operation can't be done without a scene."), TTR("OK"));
break;
}
@@ -2267,12 +2360,11 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
file_export_lib->add_filter("*." + E->get());
}
- file_export_lib->popup_centered_ratio();
+ file_export_lib->popup_file_dialog();
file_export_lib->set_title(TTR("Export Mesh Library"));
} break;
case FILE_EXPORT_TILESET: {
-
//Make sure that the scene has a root before trying to convert to tileset
if (!editor_data.get_edited_scene_root()) {
show_accept(TTR("This operation can't be done without a root node."), TTR("OK"));
@@ -2287,15 +2379,13 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
file_export_lib->add_filter("*." + E->get());
}
- file_export_lib->popup_centered_ratio();
+ file_export_lib->popup_file_dialog();
file_export_lib->set_title(TTR("Export Tile Set"));
} break;
case FILE_IMPORT_SUBSCENE: {
-
if (!editor_data.get_edited_scene_root()) {
-
show_accept(TTR("This operation can't be done without a selected node."), TTR("OK"));
break;
}
@@ -2305,12 +2395,10 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case FILE_EXTERNAL_OPEN_SCENE: {
-
if (unsaved_cache && !p_confirmed) {
-
confirmation->get_ok()->set_text(TTR("Open"));
confirmation->set_text(TTR("Current scene not saved. Open anyway?"));
- confirmation->popup_centered_minsize();
+ confirmation->popup_centered();
break;
}
@@ -2324,7 +2412,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case EDIT_UNDO: {
-
if (Input::get_singleton()->get_mouse_button_mask() & 0x7) {
log->add_message("Can't undo while mouse buttons are pressed.", EditorLog::MSG_TYPE_EDITOR);
} else {
@@ -2338,7 +2425,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
} break;
case EDIT_REDO: {
-
if (Input::get_singleton()->get_mouse_button_mask() & 0x7) {
log->add_message("Can't redo while mouse buttons are pressed.", EditorLog::MSG_TYPE_EDITOR);
} else {
@@ -2351,12 +2437,12 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
} break;
- case EDIT_REVERT: {
-
+ case EDIT_RELOAD_SAVED_SCENE: {
Node *scene = get_edited_scene();
- if (!scene)
+ if (!scene) {
break;
+ }
String filename = scene->get_filename();
@@ -2366,25 +2452,26 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
if (unsaved_cache && !p_confirmed) {
- confirmation->get_ok()->set_text(TTR("Revert"));
- confirmation->set_text(TTR("This action cannot be undone. Revert anyway?"));
- confirmation->popup_centered_minsize();
+ confirmation->get_ok()->set_text(TTR("Reload Saved Scene"));
+ confirmation->set_text(
+ TTR("The current scene has unsaved changes.\nReload the saved scene anyway? This action cannot be undone."));
+ confirmation->popup_centered();
break;
}
int cur_idx = editor_data.get_edited_scene();
_remove_edited_scene();
Error err = load_scene(filename);
- if (err != OK)
+ if (err != OK) {
ERR_PRINT("Failed to load scene");
+ }
editor_data.move_edited_scene_to_index(cur_idx);
get_undo_redo()->clear_history(false);
scene_tabs->set_current_tab(cur_idx);
} break;
case RUN_PLAY: {
- _menu_option_confirm(RUN_STOP, true);
- _run(false);
+ run_play();
} break;
case RUN_PLAY_CUSTOM_SCENE: {
@@ -2395,24 +2482,23 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
play_custom_scene_button->set_pressed(false);
} else {
String last_custom_scene = run_custom_filename;
- _menu_option_confirm(RUN_STOP, true);
- _run(false, last_custom_scene);
+ run_play_custom(last_custom_scene);
}
} break;
case RUN_STOP: {
-
- if (editor_run.get_status() == EditorRun::STATUS_STOP)
+ if (editor_run.get_status() == EditorRun::STATUS_STOP) {
break;
+ }
editor_run.stop();
run_custom_filename.clear();
play_button->set_pressed(false);
- play_button->set_icon(gui_base->get_icon("MainPlay", "EditorIcons"));
+ play_button->set_icon(gui_base->get_theme_icon("MainPlay", "EditorIcons"));
play_scene_button->set_pressed(false);
- play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons"));
+ play_scene_button->set_icon(gui_base->get_theme_icon("PlayScene", "EditorIcons"));
play_custom_scene_button->set_pressed(false);
- play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons"));
+ play_custom_scene_button->set_icon(gui_base->get_theme_icon("PlayCustom", "EditorIcons"));
stop_button->set_disabled(true);
if (bool(EDITOR_GET("run/output/always_close_output_on_stop"))) {
@@ -2423,6 +2509,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
}
}
+ EditorDebuggerNode::get_singleton()->stop();
emit_signal("stop_pressed");
} break;
@@ -2435,51 +2522,31 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case RUN_PLAY_SCENE: {
-
- _save_default_environment();
- _menu_option_confirm(RUN_STOP, true);
- _run(true);
+ run_play_current();
} break;
- case RUN_PLAY_NATIVE: {
-
- bool autosave = EDITOR_GET("run/auto_save/save_before_running");
- if (autosave) {
- _menu_option_confirm(FILE_SAVE_ALL_SCENES, false);
- }
- if (run_native->is_deploy_debug_remote_enabled()) {
- _menu_option_confirm(RUN_STOP, true);
-
- if (!call_build())
- break; // build failed
-
- emit_signal("play_pressed");
- editor_run.run_native_notify();
- }
- } break;
case RUN_SCENE_SETTINGS: {
-
run_settings_dialog->popup_run_settings();
} break;
case RUN_SETTINGS: {
-
project_settings->popup_project_settings();
} break;
case FILE_INSTALL_ANDROID_SOURCE: {
-
if (p_confirmed) {
export_template_manager->install_android_template();
} else {
if (DirAccess::exists("res://android/build")) {
- remove_android_build_template->popup_centered_minsize();
+ remove_android_build_template->popup_centered();
} else if (export_template_manager->can_install_android_template()) {
- install_android_build_template->popup_centered_minsize();
+ install_android_build_template->popup_centered();
} else {
- custom_build_manage_templates->popup_centered_minsize();
+ custom_build_manage_templates->popup_centered();
}
}
} break;
case RUN_PROJECT_DATA_FOLDER: {
+ // ensure_user_data_dir() to prevent the edge case: "Open Project Data Folder" won't work after the project was renamed in ProjectSettingsEditor unless the project is saved
+ OS::get_singleton()->ensure_user_data_dir();
OS::get_singleton()->shell_open(String("file://") + OS::get_singleton()->get_user_data_dir());
} break;
case FILE_EXPLORE_ANDROID_BUILD_TEMPLATES: {
@@ -2487,28 +2554,22 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case FILE_QUIT:
case RUN_PROJECT_MANAGER: {
-
if (!p_confirmed) {
bool save_each = EDITOR_GET("interface/editor/save_each_scene_on_quit");
if (_next_unsaved_scene(!save_each) == -1) {
-
bool confirm = EDITOR_GET("interface/editor/quit_confirmation");
if (confirm) {
-
confirmation->get_ok()->set_text(p_option == FILE_QUIT ? TTR("Quit") : TTR("Yes"));
confirmation->set_text(p_option == FILE_QUIT ? TTR("Exit the editor?") : TTR("Open Project Manager?"));
- confirmation->popup_centered_minsize();
+ confirmation->popup_centered();
} else {
_discard_changes();
break;
}
} else {
-
if (save_each) {
-
_menu_option_confirm(p_option == FILE_QUIT ? FILE_CLOSE_ALL_AND_QUIT : FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER, false);
} else {
-
String unsaved_scenes;
int i = _next_unsaved_scene(true, 0);
while (i != -1) {
@@ -2518,11 +2579,11 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
save_confirmation->get_ok()->set_text(TTR("Save & Quit"));
save_confirmation->set_text((p_option == FILE_QUIT ? TTR("Save changes to the following scene(s) before quitting?") : TTR("Save changes the following scene(s) before opening Project Manager?")) + unsaved_scenes);
- save_confirmation->popup_centered_minsize();
+ save_confirmation->popup_centered();
}
}
- OS::get_singleton()->request_attention();
+ DisplayServer::get_singleton()->window_request_attention();
break;
}
@@ -2531,125 +2592,53 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
_discard_changes();
} break;
- case RUN_FILE_SERVER: {
-
- bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_FILE_SERVER));
-
- if (ischecked) {
- file_server->stop();
- run_native->set_deploy_dumb(false);
- } else {
- file_server->start();
- run_native->set_deploy_dumb(true);
- }
-
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_FILE_SERVER), !ischecked);
- EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_file_server", !ischecked);
- } break;
- case RUN_LIVE_DEBUG: {
-
- bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_LIVE_DEBUG));
-
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_LIVE_DEBUG), !ischecked);
- ScriptEditor::get_singleton()->get_debugger()->set_live_debugging(!ischecked);
- EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_live_debug", !ischecked);
-
- } break;
- case RUN_DEPLOY_REMOTE_DEBUG: {
-
- bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEPLOY_REMOTE_DEBUG));
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEPLOY_REMOTE_DEBUG), !ischecked);
- run_native->set_deploy_debug_remote(!ischecked);
- EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_deploy_remote_debug", !ischecked);
-
- } break;
- case RUN_DEBUG_COLLISONS: {
-
- bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_COLLISONS));
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_COLLISONS), !ischecked);
- run_native->set_debug_collisions(!ischecked);
- editor_run.set_debug_collisions(!ischecked);
- EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_collisons", !ischecked);
-
- } break;
- case RUN_DEBUG_NAVIGATION: {
-
- bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION));
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION), !ischecked);
- run_native->set_debug_navigation(!ischecked);
- editor_run.set_debug_navigation(!ischecked);
- EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_navigation", !ischecked);
-
- } break;
- case RUN_RELOAD_SCRIPTS: {
-
- bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_RELOAD_SCRIPTS));
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_RELOAD_SCRIPTS), !ischecked);
-
- ScriptEditor::get_singleton()->set_live_auto_reload_running_scripts(!ischecked);
- EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_reload_scripts", !ischecked);
-
- } break;
case SETTINGS_UPDATE_CONTINUOUSLY: {
-
EditorSettings::get_singleton()->set("interface/editor/update_continuously", true);
_update_update_spinner();
show_accept(TTR("This option is deprecated. Situations where refresh must be forced are now considered a bug. Please report."), TTR("OK"));
} break;
case SETTINGS_UPDATE_WHEN_CHANGED: {
-
EditorSettings::get_singleton()->set("interface/editor/update_continuously", false);
_update_update_spinner();
} break;
case SETTINGS_UPDATE_SPINNER_HIDE: {
-
EditorSettings::get_singleton()->set("interface/editor/show_update_spinner", false);
_update_update_spinner();
} break;
case SETTINGS_PREFERENCES: {
-
settings_config_dialog->popup_edit_settings();
} break;
case SETTINGS_EDITOR_DATA_FOLDER: {
-
OS::get_singleton()->shell_open(String("file://") + EditorSettings::get_singleton()->get_data_dir());
} break;
case SETTINGS_EDITOR_CONFIG_FOLDER: {
-
OS::get_singleton()->shell_open(String("file://") + EditorSettings::get_singleton()->get_settings_dir());
} break;
case SETTINGS_MANAGE_EXPORT_TEMPLATES: {
-
export_template_manager->popup_manager();
} break;
case SETTINGS_MANAGE_FEATURE_PROFILES: {
-
feature_profile_manager->popup_centered_clamped(Size2(900, 800) * EDSCALE, 0.8);
} break;
case SETTINGS_TOGGLE_FULLSCREEN: {
-
- OS::get_singleton()->set_window_fullscreen(!OS::get_singleton()->is_window_fullscreen());
+ DisplayServer::get_singleton()->window_set_mode(DisplayServer::get_singleton()->window_get_mode() == DisplayServer::WINDOW_MODE_FULLSCREEN ? DisplayServer::WINDOW_MODE_WINDOWED : DisplayServer::WINDOW_MODE_FULLSCREEN);
} break;
case SETTINGS_TOGGLE_CONSOLE: {
-
- bool was_visible = OS::get_singleton()->is_console_visible();
- OS::get_singleton()->set_console_visible(!was_visible);
+ bool was_visible = DisplayServer::get_singleton()->is_console_visible();
+ DisplayServer::get_singleton()->console_set_visible(!was_visible);
EditorSettings::get_singleton()->set_setting("interface/editor/hide_console_window", was_visible);
} break;
case EDITOR_SCREENSHOT: {
-
screenshot_timer->start();
} break;
case SETTINGS_PICK_MAIN_SCENE: {
-
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions);
file->clear_filters();
for (int i = 0; i < extensions.size(); i++) {
-
file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
@@ -2658,7 +2647,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
file->set_current_path(scene->get_filename());
};
file->set_title(TTR("Pick a Main Scene"));
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} break;
case HELP_SEARCH: {
@@ -2670,18 +2659,20 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
case HELP_QA: {
OS::get_singleton()->shell_open("https://godotengine.org/qa/");
} break;
- case HELP_ISSUES: {
+ case HELP_REPORT_A_BUG: {
OS::get_singleton()->shell_open("https://github.com/godotengine/godot/issues");
} break;
+ case HELP_SEND_DOCS_FEEDBACK: {
+ OS::get_singleton()->shell_open("https://github.com/godotengine/godot-docs/issues");
+ } break;
case HELP_COMMUNITY: {
OS::get_singleton()->shell_open("https://godotengine.org/community");
} break;
case HELP_ABOUT: {
- about->popup_centered_minsize(Size2(780, 500) * EDSCALE);
+ about->popup_centered(Size2(780, 500) * EDSCALE);
} break;
case SET_VIDEO_DRIVER_SAVE_AND_RESTART: {
-
ProjectSettings::get_singleton()->set("rendering/quality/driver/driver_name", video_driver_request);
ProjectSettings::get_singleton()->save();
@@ -2705,12 +2696,10 @@ void EditorNode::_screenshot(bool p_use_utc) {
}
void EditorNode::_save_screenshot(NodePath p_path) {
-
- Viewport *viewport = EditorInterface::get_singleton()->get_editor_viewport()->get_viewport();
- viewport->set_clear_mode(Viewport::CLEAR_MODE_ONLY_NEXT_FRAME);
+ SubViewport *viewport = Object::cast_to<SubViewport>(EditorInterface::get_singleton()->get_editor_viewport()->get_viewport());
+ viewport->set_clear_mode(SubViewport::CLEAR_MODE_ONLY_NEXT_FRAME);
Ref<Image> img = viewport->get_texture()->get_data();
- img->flip_y();
- viewport->set_clear_mode(Viewport::CLEAR_MODE_ALWAYS);
+ viewport->set_clear_mode(SubViewport::CLEAR_MODE_ALWAYS);
Error error = img->save_png(p_path);
ERR_FAIL_COND_MSG(error != OK, "Cannot save screenshot to file '" + p_path + "'.");
}
@@ -2727,12 +2716,12 @@ void EditorNode::_tool_menu_option(int p_idx) {
Object *handler = ObjectDB::get_instance(params[0]);
String callback = params[1];
Variant *ud = &params[2];
- Variant::CallError ce;
+ Callable::CallError ce;
handler->call(callback, (const Variant **)&ud, 1, ce);
- if (ce.error != Variant::CallError::CALL_OK) {
+ if (ce.error != Callable::CallError::CALL_OK) {
String err = Variant::get_call_error_text(handler, callback, (const Variant **)&ud, 1, ce);
- ERR_PRINTS("Error calling function from tool menu: " + err);
+ ERR_PRINT("Error calling function from tool menu: " + err);
}
} // else it's a submenu so don't do anything.
} break;
@@ -2740,17 +2729,17 @@ void EditorNode::_tool_menu_option(int p_idx) {
}
int EditorNode::_next_unsaved_scene(bool p_valid_filename, int p_start) {
-
for (int i = p_start; i < editor_data.get_edited_scene_count(); i++) {
-
- if (!editor_data.get_edited_scene_root(i))
+ if (!editor_data.get_edited_scene_root(i)) {
continue;
+ }
int current = editor_data.get_edited_scene();
bool unsaved = (i == current) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(i) != 0;
if (unsaved) {
String scene_filename = editor_data.get_edited_scene_root(i)->get_filename();
- if (p_valid_filename && scene_filename.length() == 0)
+ if (p_valid_filename && scene_filename.length() == 0) {
continue;
+ }
return i;
}
}
@@ -2769,9 +2758,7 @@ void EditorNode::_exit_editor() {
}
void EditorNode::_discard_changes(const String &p_str) {
-
switch (current_option) {
-
case FILE_CLOSE_ALL_AND_QUIT:
case FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER:
case FILE_CLOSE:
@@ -2779,9 +2766,8 @@ void EditorNode::_discard_changes(const String &p_str) {
case FILE_CLOSE_RIGHT:
case FILE_CLOSE_ALL:
case SCENE_TAB_CLOSE: {
-
Node *scene = editor_data.get_edited_scene_root(tab_closing);
- if (scene != NULL) {
+ if (scene != nullptr) {
String scene_filename = scene->get_filename();
if (scene_filename != "") {
previous_scenes.push_back(scene_filename);
@@ -2813,13 +2799,11 @@ void EditorNode::_discard_changes(const String &p_str) {
}
} break;
case FILE_QUIT: {
-
_menu_option_confirm(RUN_STOP, true);
_exit_editor();
} break;
case RUN_PROJECT_MANAGER: {
-
_menu_option_confirm(RUN_STOP, true);
_exit_editor();
String exec = OS::get_singleton()->get_executable_path();
@@ -2836,28 +2820,10 @@ void EditorNode::_discard_changes(const String &p_str) {
}
}
-void EditorNode::_update_debug_options() {
-
- bool check_deploy_remote = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", false);
- bool check_file_server = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false);
- bool check_debug_collisons = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false);
- bool check_debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false);
- bool check_live_debug = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_live_debug", false);
- bool check_reload_scripts = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_reload_scripts", false);
-
- if (check_deploy_remote) _menu_option_confirm(RUN_DEPLOY_REMOTE_DEBUG, true);
- if (check_file_server) _menu_option_confirm(RUN_FILE_SERVER, true);
- if (check_debug_collisons) _menu_option_confirm(RUN_DEBUG_COLLISONS, true);
- if (check_debug_navigation) _menu_option_confirm(RUN_DEBUG_NAVIGATION, true);
- if (check_live_debug) _menu_option_confirm(RUN_LIVE_DEBUG, true);
- if (check_reload_scripts) _menu_option_confirm(RUN_RELOAD_SCRIPTS, true);
-}
-
void EditorNode::_update_file_menu_opened() {
-
- Ref<ShortCut> close_scene_sc = ED_GET_SHORTCUT("editor/close_scene");
+ Ref<Shortcut> close_scene_sc = ED_GET_SHORTCUT("editor/close_scene");
close_scene_sc->set_name(TTR("Close Scene"));
- Ref<ShortCut> reopen_closed_scene_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene");
+ Ref<Shortcut> reopen_closed_scene_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene");
reopen_closed_scene_sc->set_name(TTR("Reopen Closed Scene"));
PopupMenu *pop = file_menu->get_popup();
pop->set_item_disabled(pop->get_item_index(FILE_OPEN_PREV), previous_scenes.empty());
@@ -2869,20 +2835,20 @@ void EditorNode::_update_file_menu_closed() {
}
Control *EditorNode::get_viewport() {
-
return viewport;
}
void EditorNode::_editor_select(int p_which) {
-
static bool selecting = false;
- if (selecting || changing_scene)
+ if (selecting || changing_scene) {
return;
+ }
ERR_FAIL_INDEX(p_which, editor_table.size());
- if (!main_editor_buttons[p_which]->is_visible()) //button hidden, no editor
+ if (!main_editor_buttons[p_which]->is_visible()) { //button hidden, no editor
return;
+ }
selecting = true;
@@ -2895,8 +2861,9 @@ void EditorNode::_editor_select(int p_which) {
EditorPlugin *new_editor = editor_table[p_which];
ERR_FAIL_COND(!new_editor);
- if (editor_plugin_screen == new_editor)
+ if (editor_plugin_screen == new_editor) {
return;
+ }
if (editor_plugin_screen) {
editor_plugin_screen->make_visible(false);
@@ -2934,19 +2901,18 @@ void EditorNode::select_editor_by_name(const String &p_name) {
}
void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed) {
-
if (p_editor->has_main_screen()) {
-
- ToolButton *tb = memnew(ToolButton);
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
tb->set_toggle_mode(true);
- tb->connect("pressed", singleton, "_editor_select", varray(singleton->main_editor_buttons.size()));
+ tb->connect("pressed", callable_mp(singleton, &EditorNode::_editor_select), varray(singleton->main_editor_buttons.size()));
tb->set_text(p_editor->get_name());
- Ref<Texture> icon = p_editor->get_icon();
+ Ref<Texture2D> icon = p_editor->get_icon();
if (icon.is_valid()) {
tb->set_icon(icon);
- } else if (singleton->gui_base->has_icon(p_editor->get_name(), "EditorIcons")) {
- tb->set_icon(singleton->gui_base->get_icon(p_editor->get_name(), "EditorIcons"));
+ } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), "EditorIcons")) {
+ tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), "EditorIcons"));
}
tb->set_name(p_editor->get_name());
@@ -2958,18 +2924,15 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed
}
singleton->editor_data.add_editor_plugin(p_editor);
singleton->add_child(p_editor);
- if (p_config_changed)
+ if (p_config_changed) {
p_editor->enable_plugin();
+ }
}
void EditorNode::remove_editor_plugin(EditorPlugin *p_editor, bool p_config_changed) {
-
if (p_editor->has_main_screen()) {
-
for (int i = 0; i < singleton->main_editor_buttons.size(); i++) {
-
if (p_editor->get_name() == singleton->main_editor_buttons[i]->get_text()) {
-
if (singleton->main_editor_buttons[i]->is_pressed()) {
singleton->_editor_select(EDITOR_SCRIPT);
}
@@ -2985,8 +2948,9 @@ void EditorNode::remove_editor_plugin(EditorPlugin *p_editor, bool p_config_chan
}
p_editor->make_visible(false);
p_editor->clear();
- if (p_config_changed)
+ if (p_config_changed) {
p_editor->disable_plugin();
+ }
singleton->editor_plugins_over->get_plugins_list().erase(p_editor);
singleton->remove_child(p_editor);
singleton->editor_data.remove_editor_plugin(p_editor);
@@ -2994,9 +2958,9 @@ void EditorNode::remove_editor_plugin(EditorPlugin *p_editor, bool p_config_chan
}
void EditorNode::_update_addon_config() {
-
- if (_initializing_addons)
+ if (_initializing_addons) {
return;
+ }
Vector<String> enabled_addons;
@@ -3014,12 +2978,10 @@ void EditorNode::_update_addon_config() {
}
void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, bool p_config_changed) {
-
ERR_FAIL_COND(p_enabled && plugin_addons.has(p_addon));
ERR_FAIL_COND(!p_enabled && !plugin_addons.has(p_addon));
if (!p_enabled) {
-
EditorPlugin *addon = plugin_addons[p_addon];
remove_editor_plugin(addon, p_config_changed);
memdelete(addon); //bye
@@ -3033,7 +2995,7 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
String addon_path = String("res://addons").plus_file(p_addon).plus_file("plugin.cfg");
if (!DirAccess::exists(addon_path.get_base_dir())) {
ProjectSettings *ps = ProjectSettings::get_singleton();
- PoolStringArray enabled_plugins = ps->get("editor_plugins/enabled");
+ PackedStringArray enabled_plugins = ps->get("editor_plugins/enabled");
for (int i = 0; i < enabled_plugins.size(); ++i) {
if (enabled_plugins.get(i) == p_addon) {
enabled_plugins.remove(i);
@@ -3042,7 +3004,7 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
}
ps->set("editor_plugins/enabled", enabled_plugins);
ps->save();
- WARN_PRINTS("Addon '" + p_addon + "' failed to load. No directory found. Removing from enabled plugins.");
+ WARN_PRINT("Addon '" + p_addon + "' failed to load. No directory found. Removing from enabled plugins.");
return;
}
Error err = cf->load(addon_path);
@@ -3088,7 +3050,7 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
}
EditorPlugin *ep = memnew(EditorPlugin);
- ep->set_script(script.get_ref_ptr());
+ ep->set_script(script);
plugin_addons[p_addon] = ep;
add_editor_plugin(ep, p_config_changed);
@@ -3096,7 +3058,6 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
}
bool EditorNode::is_addon_plugin_enabled(const String &p_addon) const {
-
return plugin_addons.has(p_addon);
}
@@ -3117,7 +3078,9 @@ void EditorNode::_remove_edited_scene(bool p_change_tab) {
ScriptEditor::get_singleton()->close_builtin_scripts_from_scene(editor_data.get_scene_path(old_index));
}
- if (p_change_tab) _scene_tab_changed(new_index);
+ if (p_change_tab) {
+ _scene_tab_changed(new_index);
+ }
editor_data.remove_scene(old_index);
editor_data.get_undo_redo().clear_history(false);
_update_title();
@@ -3125,7 +3088,6 @@ void EditorNode::_remove_edited_scene(bool p_change_tab) {
}
void EditorNode::_remove_scene(int index, bool p_change_tab) {
-
if (editor_data.get_edited_scene() == index) {
//Scene to remove is current scene
_remove_edited_scene(p_change_tab);
@@ -3136,37 +3098,39 @@ void EditorNode::_remove_scene(int index, bool p_change_tab) {
}
void EditorNode::set_edited_scene(Node *p_scene) {
-
if (get_editor_data().get_edited_scene_root()) {
- if (get_editor_data().get_edited_scene_root()->get_parent() == scene_root)
+ if (get_editor_data().get_edited_scene_root()->get_parent() == scene_root) {
scene_root->remove_child(get_editor_data().get_edited_scene_root());
+ }
}
get_editor_data().set_edited_scene_root(p_scene);
- if (Object::cast_to<Popup>(p_scene))
+ if (Object::cast_to<Popup>(p_scene)) {
Object::cast_to<Popup>(p_scene)->show(); //show popups
+ }
scene_tree_dock->set_edited_scene(p_scene);
- if (get_tree())
+ if (get_tree()) {
get_tree()->set_edited_scene_root(p_scene);
+ }
if (p_scene) {
- if (p_scene->get_parent() != scene_root)
+ if (p_scene->get_parent() != scene_root) {
scene_root->add_child(p_scene);
+ }
}
}
int EditorNode::_get_current_main_editor() {
-
for (int i = 0; i < editor_table.size(); i++) {
- if (editor_table[i] == editor_plugin_screen)
+ if (editor_table[i] == editor_plugin_screen) {
return i;
+ }
}
return 0;
}
Dictionary EditorNode::_get_main_scene_state() {
-
Dictionary state;
state["main_tab"] = _get_current_main_editor();
state["scene_tree_offset"] = scene_tree_dock->get_tree_editor()->get_scene_tree()->get_vscroll_bar()->get_value();
@@ -3177,9 +3141,9 @@ Dictionary EditorNode::_get_main_scene_state() {
}
void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) {
-
- if (get_edited_scene() != p_for_scene && p_for_scene != NULL)
+ if (get_edited_scene() != p_for_scene && p_for_scene != nullptr) {
return; //not for this scene
+ }
changing_scene = false;
@@ -3213,23 +3177,25 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) {
}
}
- if (p_state.has("scene_tree_offset"))
+ if (p_state.has("scene_tree_offset")) {
scene_tree_dock->get_tree_editor()->get_scene_tree()->get_vscroll_bar()->set_value(p_state["scene_tree_offset"]);
- if (p_state.has("property_edit_offset"))
+ }
+ if (p_state.has("property_edit_offset")) {
get_inspector()->set_scroll_offset(p_state["property_edit_offset"]);
+ }
- if (p_state.has("node_filter"))
+ if (p_state.has("node_filter")) {
scene_tree_dock->set_filter(p_state["node_filter"]);
+ }
//this should only happen at the very end
- ScriptEditor::get_singleton()->get_debugger()->update_live_edit_root();
+ EditorDebuggerNode::get_singleton()->update_live_edit_root();
ScriptEditor::get_singleton()->set_scene_root_script(editor_data.get_scene_root_script(editor_data.get_edited_scene()));
editor_data.notify_edited_scene_changed();
}
void EditorNode::set_current_version(uint64_t p_version) {
-
saved_version = p_version;
editor_data.set_edited_scene_version(p_version);
}
@@ -3239,19 +3205,19 @@ bool EditorNode::is_changing_scene() const {
}
void EditorNode::_clear_undo_history() {
-
get_undo_redo()->clear_history(false);
}
void EditorNode::set_current_scene(int p_idx) {
-
//Save the folding in case the scene gets reloaded.
- if (editor_data.get_scene_path(p_idx) != "")
+ if (editor_data.get_scene_path(p_idx) != "" && editor_data.get_edited_scene_root(p_idx)) {
editor_folding.save_scene_folding(editor_data.get_edited_scene_root(p_idx), editor_data.get_scene_path(p_idx));
+ }
if (editor_data.check_and_update_scene(p_idx)) {
- if (editor_data.get_scene_path(p_idx) != "")
+ if (editor_data.get_scene_path(p_idx) != "") {
editor_folding.load_scene_folding(editor_data.get_edited_scene_root(p_idx), editor_data.get_scene_path(p_idx));
+ }
call_deferred("_clear_undo_history");
}
@@ -3260,8 +3226,9 @@ void EditorNode::set_current_scene(int p_idx) {
editor_data.save_edited_scene_state(editor_selection, &editor_history, _get_main_scene_state());
if (get_editor_data().get_edited_scene_root()) {
- if (get_editor_data().get_edited_scene_root()->get_parent() == scene_root)
+ if (get_editor_data().get_edited_scene_root()->get_parent() == scene_root) {
scene_root->remove_child(get_editor_data().get_edited_scene_root());
+ }
}
editor_selection->clear();
@@ -3269,16 +3236,19 @@ void EditorNode::set_current_scene(int p_idx) {
Node *new_scene = editor_data.get_edited_scene_root();
- if (Object::cast_to<Popup>(new_scene))
+ if (Object::cast_to<Popup>(new_scene)) {
Object::cast_to<Popup>(new_scene)->show(); //show popups
+ }
scene_tree_dock->set_edited_scene(new_scene);
- if (get_tree())
+ if (get_tree()) {
get_tree()->set_edited_scene_root(new_scene);
+ }
if (new_scene) {
- if (new_scene->get_parent() != scene_root)
+ if (new_scene->get_parent() != scene_root) {
scene_root->add_child(new_scene);
+ }
}
Dictionary state = editor_data.restore_edited_scene_state(editor_selection, &editor_history);
@@ -3290,10 +3260,10 @@ void EditorNode::set_current_scene(int p_idx) {
}
bool EditorNode::is_scene_open(const String &p_path) {
-
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
- if (editor_data.get_scene_path(i) == p_path)
+ if (editor_data.get_scene_path(i) == p_path) {
return true;
+ }
}
return false;
@@ -3312,16 +3282,13 @@ int EditorNode::new_scene() {
}
Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, bool p_set_inherited, bool p_clear_errors, bool p_force_open_imported) {
-
if (!is_inside_tree()) {
defer_load_scene = p_scene;
return OK;
}
if (!p_set_inherited) {
-
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
-
if (editor_data.get_scene_path(i) == p_scene) {
_scene_tab_changed(i);
return OK;
@@ -3330,20 +3297,20 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
if (!p_force_open_imported && FileAccess::exists(p_scene + ".import")) {
open_imported->set_text(vformat(TTR("Scene '%s' was automatically imported, so it can't be modified.\nTo make changes to it, a new inherited scene can be created."), p_scene.get_file()));
- open_imported->popup_centered_minsize();
+ open_imported->popup_centered();
new_inherited_button->grab_focus();
open_import_request = p_scene;
return OK;
}
}
- if (p_clear_errors)
+ if (p_clear_errors) {
load_errors->clear();
+ }
String lpath = ProjectSettings::get_singleton()->localize_path(p_scene);
if (!lpath.begins_with("res://")) {
-
show_accept(TTR("Error loading scene, it must be inside the project path. Use 'Import' to open the scene, then save it inside the project path."), TTR("OK"));
opening_prev = false;
return ERR_FILE_NOT_FOUND;
@@ -3363,7 +3330,6 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
Error err;
Ref<PackedScene> sdata = ResourceLoader::load(lpath, "", true, &err);
if (!sdata.is_valid()) {
-
_dialog_display_load_error(lpath, err);
opening_prev = false;
@@ -3375,11 +3341,9 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
}
if (!p_ignore_broken_deps && dependency_errors.has(lpath)) {
-
current_option = -1;
Vector<String> errors;
for (Set<String>::Element *E = dependency_errors[lpath].front(); E; E = E->next()) {
-
errors.push_back(E->get());
}
dependency_error->show(DependencyErrorDialog::MODE_SCENE, lpath, errors);
@@ -3394,8 +3358,7 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
dependency_errors.erase(lpath); //at least not self path
- for (Map<String, Set<String> >::Element *E = dependency_errors.front(); E; E = E->next()) {
-
+ for (Map<String, Set<String>>::Element *E = dependency_errors.front(); E; E = E->next()) {
String txt = vformat(TTR("Scene '%s' has broken dependencies:"), E->key()) + "\n";
for (Set<String>::Element *F = E->get().front(); F; F = F->next()) {
txt += "\t" + F->get() + "\n";
@@ -3419,15 +3382,14 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
Node *new_scene = sdata->instance(PackedScene::GEN_EDIT_STATE_MAIN);
if (!new_scene) {
-
sdata.unref();
- _dialog_display_load_error(lpath, ERR_FILE_NOT_FOUND);
+ _dialog_display_load_error(lpath, ERR_FILE_CORRUPT);
opening_prev = false;
if (prev != -1) {
set_current_scene(prev);
editor_data.remove_scene(idx);
}
- return ERR_FILE_NOT_FOUND;
+ return ERR_FILE_CORRUPT;
}
if (p_set_inherited) {
@@ -3458,7 +3420,7 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
opening_prev = false;
scene_tree_dock->set_selected(new_scene);
- ScriptEditor::get_singleton()->get_debugger()->update_live_edit_root();
+ EditorDebuggerNode::get_singleton()->update_live_edit_root();
push_item(new_scene);
@@ -3470,10 +3432,9 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
}
void EditorNode::open_request(const String &p_path) {
-
if (!opening_prev) {
List<String>::Element *prev_scene = previous_scenes.find(p_path);
- if (prev_scene != NULL) {
+ if (prev_scene != nullptr) {
prev_scene->erase();
}
}
@@ -3482,12 +3443,10 @@ void EditorNode::open_request(const String &p_path) {
}
void EditorNode::request_instance_scene(const String &p_path) {
-
scene_tree_dock->instance(p_path);
}
void EditorNode::request_instance_scenes(const Vector<String> &p_files) {
-
scene_tree_dock->instance_scenes(p_files);
}
@@ -3496,66 +3455,58 @@ ImportDock *EditorNode::get_import_dock() {
}
FileSystemDock *EditorNode::get_filesystem_dock() {
-
return filesystem_dock;
}
-SceneTreeDock *EditorNode::get_scene_tree_dock() {
+SceneTreeDock *EditorNode::get_scene_tree_dock() {
return scene_tree_dock;
}
-InspectorDock *EditorNode::get_inspector_dock() {
+InspectorDock *EditorNode::get_inspector_dock() {
return inspector_dock;
}
void EditorNode::_inherit_request(String p_file) {
-
current_option = FILE_NEW_INHERITED_SCENE;
_dialog_action(p_file);
}
void EditorNode::_instance_request(const Vector<String> &p_files) {
-
request_instance_scenes(p_files);
}
void EditorNode::_close_messages() {
-
old_split_ofs = center_split->get_split_offset();
center_split->set_split_offset(0);
}
void EditorNode::_show_messages() {
-
center_split->set_split_offset(old_split_ofs);
}
void EditorNode::_add_to_recent_scenes(const String &p_scene) {
-
Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scenes", Array());
- if (rc.find(p_scene) != -1)
+ if (rc.find(p_scene) != -1) {
rc.erase(p_scene);
+ }
rc.push_front(p_scene);
- if (rc.size() > 10)
+ if (rc.size() > 10) {
rc.resize(10);
+ }
EditorSettings::get_singleton()->set_project_metadata("recent_files", "scenes", rc);
_update_recent_scenes();
}
void EditorNode::_open_recent_scene(int p_idx) {
-
if (p_idx == recent_scenes->get_item_count() - 1) {
-
EditorSettings::get_singleton()->set_project_metadata("recent_files", "scenes", Array());
call_deferred("_update_recent_scenes");
} else {
-
Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scenes", Array());
ERR_FAIL_INDEX(p_idx, rc.size());
if (load_scene(rc[p_idx]) != OK) {
-
rc.remove(p_idx);
EditorSettings::get_singleton()->set_project_metadata("recent_files", "scenes", rc);
_update_recent_scenes();
@@ -3564,13 +3515,11 @@ void EditorNode::_open_recent_scene(int p_idx) {
}
void EditorNode::_update_recent_scenes() {
-
Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scenes", Array());
recent_scenes->clear();
String path;
for (int i = 0; i < rc.size(); i++) {
-
path = rc[i];
recent_scenes->add_item(path.replace("res://", ""), i);
}
@@ -3581,13 +3530,16 @@ void EditorNode::_update_recent_scenes() {
}
void EditorNode::_quick_opened() {
-
Vector<String> files = quick_open->get_selected_files();
+ bool open_scene_dialog = quick_open->get_base_type() == "PackedScene";
for (int i = 0; i < files.size(); i++) {
String res_path = files[i];
- if (quick_open->get_base_type() == "PackedScene") {
+ List<String> scene_extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions);
+
+ if (open_scene_dialog || scene_extensions.find(files[i].get_extension())) {
open_request(res_path);
} else {
load_resource(res_path);
@@ -3596,12 +3548,10 @@ void EditorNode::_quick_opened() {
}
void EditorNode::_quick_run() {
-
_run(false, quick_run->get_selected());
}
-void EditorNode::notify_child_process_exited() {
-
+void EditorNode::notify_all_debug_sessions_exited() {
_menu_option_confirm(RUN_STOP, false);
stop_button->set_pressed(false);
editor_run.stop();
@@ -3612,21 +3562,18 @@ void EditorNode::add_io_error(const String &p_error) {
}
void EditorNode::_load_error_notify(void *p_ud, const String &p_text) {
-
EditorNode *en = (EditorNode *)p_ud;
- en->load_errors->add_image(en->gui_base->get_icon("Error", "EditorIcons"));
+ en->load_errors->add_image(en->gui_base->get_theme_icon("Error", "EditorIcons"));
en->load_errors->add_text(p_text + "\n");
en->load_error_dialog->popup_centered_ratio(0.5);
}
bool EditorNode::_find_scene_in_use(Node *p_node, const String &p_path) const {
-
if (p_node->get_filename() == p_path) {
return true;
}
for (int i = 0; i < p_node->get_child_count(); i++) {
-
if (_find_scene_in_use(p_node->get_child(i), p_path)) {
return true;
}
@@ -3636,32 +3583,34 @@ bool EditorNode::_find_scene_in_use(Node *p_node, const String &p_path) const {
}
bool EditorNode::is_scene_in_use(const String &p_path) {
-
Node *es = get_edited_scene();
- if (es)
+ if (es) {
return _find_scene_in_use(es, p_path);
+ }
return false;
}
void EditorNode::register_editor_types() {
-
ResourceLoader::set_timestamp_on_load(true);
ResourceSaver::set_timestamp_on_save(true);
ClassDB::register_class<EditorPlugin>();
+ ClassDB::register_class<EditorTranslationParserPlugin>();
ClassDB::register_class<EditorImportPlugin>();
ClassDB::register_class<EditorScript>();
ClassDB::register_class<EditorSelection>();
ClassDB::register_class<EditorFileDialog>();
ClassDB::register_virtual_class<EditorSettings>();
- ClassDB::register_class<EditorSpatialGizmo>();
- ClassDB::register_class<EditorSpatialGizmoPlugin>();
+ ClassDB::register_class<EditorNode3DGizmo>();
+ ClassDB::register_class<EditorNode3DGizmoPlugin>();
ClassDB::register_virtual_class<EditorResourcePreview>();
ClassDB::register_class<EditorResourcePreviewGenerator>();
ClassDB::register_virtual_class<EditorFileSystem>();
ClassDB::register_class<EditorFileSystemDirectory>();
ClassDB::register_class<EditorVCSInterface>();
ClassDB::register_virtual_class<ScriptEditor>();
+ ClassDB::register_virtual_class<ScriptEditorBase>();
+ ClassDB::register_class<EditorSyntaxHighlighter>();
ClassDB::register_virtual_class<EditorInterface>();
ClassDB::register_class<EditorExportPlugin>();
ClassDB::register_class<EditorResourceConversionPlugin>();
@@ -3673,24 +3622,29 @@ void EditorNode::register_editor_types() {
ClassDB::register_class<ScriptCreateDialog>();
ClassDB::register_class<EditorFeatureProfile>();
ClassDB::register_class<EditorSpinSlider>();
+ ClassDB::register_virtual_class<FileSystemDock>();
// FIXME: Is this stuff obsolete, or should it be ported to new APIs?
ClassDB::register_class<EditorScenePostImport>();
//ClassDB::register_type<EditorImportExport>();
+ ClassDB::register_class<EditorDebuggerPlugin>();
}
void EditorNode::unregister_editor_types() {
-
_init_callbacks.clear();
}
-void EditorNode::stop_child_process() {
-
- _menu_option_confirm(RUN_STOP, false);
+void EditorNode::stop_child_process(OS::ProcessID p_pid) {
+ if (has_child_process(p_pid)) {
+ editor_run.stop_child_process(p_pid);
+ if (!editor_run.get_child_process_count()) { // All children stopped. Closing.
+ _menu_option_confirm(RUN_STOP, false);
+ }
+ }
}
Ref<Script> EditorNode::get_object_custom_type_base(const Object *p_object) const {
- ERR_FAIL_COND_V(!p_object, NULL);
+ ERR_FAIL_COND_V(!p_object, nullptr);
Ref<Script> script = p_object->get_script();
@@ -3717,7 +3671,7 @@ Ref<Script> EditorNode::get_object_custom_type_base(const Object *p_object) cons
}
}
- return NULL;
+ return nullptr;
}
StringName EditorNode::get_object_custom_type_name(const Object *p_object) const {
@@ -3732,8 +3686,9 @@ StringName EditorNode::get_object_custom_type_name(const Object *p_object) const
Ref<Script> base_script = script;
while (base_script.is_valid()) {
StringName name = EditorNode::get_editor_data().script_class_get_name(base_script->get_path());
- if (name != StringName())
+ if (name != StringName()) {
return name;
+ }
// should probably be deprecated in 4.x
StringName base = base_script->get_instance_base_type();
@@ -3763,11 +3718,11 @@ Ref<ImageTexture> EditorNode::_load_custom_class_icon(const String &p_path) cons
return icon;
}
}
- return NULL;
+ return nullptr;
}
-Ref<Texture> EditorNode::get_object_icon(const Object *p_object, const String &p_fallback) const {
- ERR_FAIL_COND_V(!p_object || !gui_base, NULL);
+Ref<Texture2D> EditorNode::get_object_icon(const Object *p_object, const String &p_fallback) const {
+ ERR_FAIL_COND_V(!p_object || !gui_base, nullptr);
Ref<Script> script = p_object->get_script();
if (script.is_null() && p_object->is_class("Script")) {
@@ -3799,37 +3754,32 @@ Ref<Texture> EditorNode::get_object_icon(const Object *p_object, const String &p
}
// should probably be deprecated in 4.x
- if (p_object->has_meta("_editor_icon"))
+ if (p_object->has_meta("_editor_icon")) {
return p_object->get_meta("_editor_icon");
+ }
- if (gui_base->has_icon(p_object->get_class(), "EditorIcons"))
- return gui_base->get_icon(p_object->get_class(), "EditorIcons");
+ if (gui_base->has_theme_icon(p_object->get_class(), "EditorIcons")) {
+ return gui_base->get_theme_icon(p_object->get_class(), "EditorIcons");
+ }
- if (p_fallback.length())
- return gui_base->get_icon(p_fallback, "EditorIcons");
+ if (p_fallback.length()) {
+ return gui_base->get_theme_icon(p_fallback, "EditorIcons");
+ }
- return NULL;
+ return nullptr;
}
-Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_fallback) const {
- ERR_FAIL_COND_V_MSG(p_class.empty(), NULL, "Class name cannot be empty.");
-
- if (gui_base->has_icon(p_class, "EditorIcons")) {
- return gui_base->get_icon(p_class, "EditorIcons");
- }
+Ref<Texture2D> EditorNode::get_class_icon(const String &p_class, const String &p_fallback) const {
+ ERR_FAIL_COND_V_MSG(p_class.empty(), nullptr, "Class name cannot be empty.");
if (ScriptServer::is_global_class(p_class)) {
- String icon_path = EditorNode::get_editor_data().script_class_get_icon_path(p_class);
- Ref<ImageTexture> icon = _load_custom_class_icon(icon_path);
- if (icon.is_valid()) {
- return icon;
- }
-
- Ref<Script> script = ResourceLoader::load(ScriptServer::get_global_class_path(p_class), "Script");
+ Ref<ImageTexture> icon;
+ Ref<Script> script = EditorNode::get_editor_data().script_class_load_script(p_class);
+ StringName name = p_class;
while (script.is_valid()) {
- String current_icon_path;
- script->get_language()->get_global_class_name(script->get_path(), NULL, &current_icon_path);
+ name = EditorNode::get_editor_data().script_class_get_name(script->get_path());
+ String current_icon_path = EditorNode::get_editor_data().script_class_get_icon_path(name);
icon = _load_custom_class_icon(current_icon_path);
if (icon.is_valid()) {
return icon;
@@ -3838,14 +3788,12 @@ Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_f
}
if (icon.is_null()) {
- icon = gui_base->get_icon(ScriptServer::get_global_class_base(p_class), "EditorIcons");
+ icon = gui_base->get_theme_icon(ScriptServer::get_global_class_base(name), "EditorIcons");
}
-
- return icon;
}
- const Map<String, Vector<EditorData::CustomType> > &p_map = EditorNode::get_editor_data().get_custom_types();
- for (const Map<String, Vector<EditorData::CustomType> >::Element *E = p_map.front(); E; E = E->next()) {
+ const Map<String, Vector<EditorData::CustomType>> &p_map = EditorNode::get_editor_data().get_custom_types();
+ for (const Map<String, Vector<EditorData::CustomType>>::Element *E = p_map.front(); E; E = E->next()) {
const Vector<EditorData::CustomType> &ct = E->value();
for (int i = 0; i < ct.size(); ++i) {
if (ct[i].name == p_class) {
@@ -3856,14 +3804,18 @@ Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_f
}
}
- if (p_fallback.length() && gui_base->has_icon(p_fallback, "EditorIcons"))
- return gui_base->get_icon(p_fallback, "EditorIcons");
+ if (gui_base->has_theme_icon(p_class, "EditorIcons")) {
+ return gui_base->get_theme_icon(p_class, "EditorIcons");
+ }
+
+ if (p_fallback.length() && gui_base->has_theme_icon(p_fallback, "EditorIcons")) {
+ return gui_base->get_theme_icon(p_fallback, "EditorIcons");
+ }
- return NULL;
+ return nullptr;
}
void EditorNode::progress_add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
-
if (singleton->cmdline_export_mode) {
print_line(p_task + ": begin: " + p_label + " steps: " + itos(p_steps));
} else {
@@ -3872,18 +3824,15 @@ void EditorNode::progress_add_task(const String &p_task, const String &p_label,
}
bool EditorNode::progress_task_step(const String &p_task, const String &p_state, int p_step, bool p_force_refresh) {
-
if (singleton->cmdline_export_mode) {
print_line("\t" + p_task + ": step " + itos(p_step) + ": " + p_state);
return false;
} else {
-
return singleton->progress_dialog->task_step(p_task, p_state, p_step, p_force_refresh);
}
}
void EditorNode::progress_end_task(const String &p_task) {
-
if (singleton->cmdline_export_mode) {
print_line(p_task + ": end");
} else {
@@ -3892,29 +3841,23 @@ void EditorNode::progress_end_task(const String &p_task) {
}
void EditorNode::progress_add_task_bg(const String &p_task, const String &p_label, int p_steps) {
-
singleton->progress_hb->add_task(p_task, p_label, p_steps);
}
void EditorNode::progress_task_step_bg(const String &p_task, int p_step) {
-
singleton->progress_hb->task_step(p_task, p_step);
}
void EditorNode::progress_end_task_bg(const String &p_task) {
-
singleton->progress_hb->end_task(p_task);
}
-Ref<Texture> EditorNode::_file_dialog_get_icon(const String &p_path) {
-
+Ref<Texture2D> EditorNode::_file_dialog_get_icon(const String &p_path) {
EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->get_filesystem_path(p_path.get_base_dir());
if (efsd) {
-
String file = p_path.get_file();
for (int i = 0; i < efsd->get_file_count(); i++) {
if (efsd->get_file(i) == file) {
-
String type = efsd->get_file_type(i);
if (singleton->icon_type_cache.has(type)) {
@@ -3930,42 +3873,36 @@ Ref<Texture> EditorNode::_file_dialog_get_icon(const String &p_path) {
}
void EditorNode::_build_icon_type_cache() {
-
List<StringName> tl;
StringName ei = "EditorIcons";
theme_base->get_theme()->get_icon_list(ei, &tl);
for (List<StringName>::Element *E = tl.front(); E; E = E->next()) {
-
- if (!ClassDB::class_exists(E->get()))
+ if (!ClassDB::class_exists(E->get())) {
continue;
+ }
icon_type_cache[E->get()] = theme_base->get_theme()->get_icon(E->get(), ei);
}
}
void EditorNode::_file_dialog_register(FileDialog *p_dialog) {
-
singleton->file_dialogs.insert(p_dialog);
}
void EditorNode::_file_dialog_unregister(FileDialog *p_dialog) {
-
singleton->file_dialogs.erase(p_dialog);
}
void EditorNode::_editor_file_dialog_register(EditorFileDialog *p_dialog) {
-
singleton->editor_file_dialogs.insert(p_dialog);
}
void EditorNode::_editor_file_dialog_unregister(EditorFileDialog *p_dialog) {
-
singleton->editor_file_dialogs.erase(p_dialog);
}
Vector<EditorNodeInitCallback> EditorNode::_init_callbacks;
Error EditorNode::export_preset(const String &p_preset, const String &p_path, bool p_debug, bool p_pack_only) {
-
export_defer.preset = p_preset;
export_defer.path = p_path;
export_defer.debug = p_debug;
@@ -3978,31 +3915,112 @@ void EditorNode::show_accept(const String &p_text, const String &p_title) {
current_option = -1;
accept->get_ok()->set_text(p_title);
accept->set_text(p_text);
- accept->popup_centered_minsize();
+ accept->popup_centered();
}
void EditorNode::show_warning(const String &p_text, const String &p_title) {
-
if (warning->is_inside_tree()) {
warning->set_text(p_text);
warning->set_title(p_title);
- warning->popup_centered_minsize();
+ warning->popup_centered();
} else {
- WARN_PRINTS(p_title + " " + p_text);
+ WARN_PRINT(p_title + " " + p_text);
}
}
void EditorNode::_copy_warning(const String &p_str) {
+ DisplayServer::get_singleton()->clipboard_set(warning->get_text());
+}
+
+void EditorNode::_dock_floating_close_request(Control *p_control) {
+ // Through the MarginContainer to the Window.
+ Window *window = (Window *)p_control->get_parent()->get_parent();
+ int window_slot = window->get_meta("dock_slot");
+
+ p_control->get_parent()->remove_child(p_control);
+ dock_slot[window_slot]->add_child(p_control);
+ dock_slot[window_slot]->move_child(p_control, MIN((int)window->get_meta("dock_index"), dock_slot[window_slot]->get_child_count()));
+ dock_slot[window_slot]->set_current_tab(window->get_meta("dock_index"));
+
+ window->queue_delete();
- OS::get_singleton()->set_clipboard(warning->get_text());
+ _update_dock_containers();
+
+ floating_docks.erase(p_control);
}
-void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
+void EditorNode::_dock_make_float() {
+ Control *dock = dock_slot[dock_popup_selected]->get_current_tab_control();
+ ERR_FAIL_COND(!dock);
+
+ const Size2i borders = Size2i(4, 4) * EDSCALE;
+ Size2 dock_size = dock->get_size() + borders * 2; //remember size
+ Point2 dock_screen_pos = dock->get_global_position() + get_tree()->get_root()->get_position() - borders;
+
+ print_line("dock pos: " + dock->get_global_position() + " window pos: " + get_tree()->get_root()->get_position());
+ int dock_index = dock->get_index();
+ dock_slot[dock_popup_selected]->remove_child(dock);
+
+ Window *window = memnew(Window);
+ window->set_title(dock->get_name());
+ Panel *p = memnew(Panel);
+ p->set_mode(Panel::MODE_FOREGROUND);
+ p->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ window->add_child(p);
+ MarginContainer *margin = memnew(MarginContainer);
+ margin->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ margin->add_theme_constant_override("margin_right", borders.width);
+ margin->add_theme_constant_override("margin_top", borders.height);
+ margin->add_theme_constant_override("margin_left", borders.width);
+ margin->add_theme_constant_override("margin_bottom", borders.height);
+ window->add_child(margin);
+ dock->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ margin->add_child(dock);
+ window->set_wrap_controls(true);
+ window->set_size(dock_size);
+ window->set_position(dock_screen_pos);
+ window->set_transient(true);
+ window->connect("close_requested", callable_mp(this, &EditorNode::_dock_floating_close_request), varray(dock));
+ window->set_meta("dock_slot", dock_popup_selected);
+ window->set_meta("dock_index", dock_index);
+ gui_base->add_child(window);
+
+ dock_select_popup->hide();
+ _update_dock_containers();
+
+ floating_docks.push_back(dock);
+}
+
+void EditorNode::_update_dock_containers() {
+ for (int i = 0; i < DOCK_SLOT_MAX; i++) {
+ if (dock_slot[i]->get_tab_count() == 0 && dock_slot[i]->is_visible()) {
+ dock_slot[i]->hide();
+ }
+ if (dock_slot[i]->get_tab_count() > 0 && !dock_slot[i]->is_visible()) {
+ dock_slot[i]->show();
+ }
+ }
+ for (int i = 0; i < vsplits.size(); i++) {
+ bool in_use = dock_slot[i * 2 + 0]->get_tab_count() || dock_slot[i * 2 + 1]->get_tab_count();
+ if (in_use) {
+ vsplits[i]->show();
+ } else {
+ vsplits[i]->hide();
+ }
+ }
+
+ if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible()) {
+ right_hsplit->show();
+ } else {
+ right_hsplit->hide();
+ }
+}
+
+void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouse> me = p_input;
if (me.is_valid()) {
-
Vector2 point = me->get_position();
int nrect = -1;
@@ -4018,8 +4036,9 @@ void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
dock_select_rect_over = nrect;
}
- if (nrect == -1)
+ if (nrect == -1) {
return;
+ }
Ref<InputEventMouseButton> mb = me;
@@ -4032,7 +4051,6 @@ void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
dock_slot[dock_popup_selected]->hide();
} else {
-
dock_slot[dock_popup_selected]->set_current_tab(0);
}
@@ -4042,18 +4060,7 @@ void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
dock_slot[nrect]->show();
dock_select->update();
- for (int i = 0; i < vsplits.size(); i++) {
- bool in_use = dock_slot[i * 2 + 0]->get_tab_count() || dock_slot[i * 2 + 1]->get_tab_count();
- if (in_use)
- vsplits[i]->show();
- else
- vsplits[i]->hide();
- }
-
- if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible())
- right_hsplit->show();
- else
- right_hsplit->hide();
+ _update_dock_containers();
_edit_current();
_save_docks();
@@ -4062,24 +4069,23 @@ void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
}
void EditorNode::_dock_popup_exit() {
-
dock_select_rect_over = -1;
dock_select->update();
}
void EditorNode::_dock_pre_popup(int p_which) {
-
dock_popup_selected = p_which;
}
void EditorNode::_dock_move_left() {
-
- if (dock_popup_selected < 0 || dock_popup_selected >= DOCK_SLOT_MAX)
+ if (dock_popup_selected < 0 || dock_popup_selected >= DOCK_SLOT_MAX) {
return;
+ }
Control *current = dock_slot[dock_popup_selected]->get_tab_control(dock_slot[dock_popup_selected]->get_current_tab());
Control *prev = dock_slot[dock_popup_selected]->get_tab_control(dock_slot[dock_popup_selected]->get_current_tab() - 1);
- if (!current || !prev)
+ if (!current || !prev) {
return;
+ }
dock_slot[dock_popup_selected]->move_child(current, prev->get_index());
dock_slot[dock_popup_selected]->set_current_tab(dock_slot[dock_popup_selected]->get_current_tab() - 1);
dock_select->update();
@@ -4088,11 +4094,11 @@ void EditorNode::_dock_move_left() {
}
void EditorNode::_dock_move_right() {
-
Control *current = dock_slot[dock_popup_selected]->get_tab_control(dock_slot[dock_popup_selected]->get_current_tab());
Control *next = dock_slot[dock_popup_selected]->get_tab_control(dock_slot[dock_popup_selected]->get_current_tab() + 1);
- if (!current || !next)
+ if (!current || !next) {
return;
+ }
dock_slot[dock_popup_selected]->move_child(next, current->get_index());
dock_slot[dock_popup_selected]->set_current_tab(dock_slot[dock_popup_selected]->get_current_tab() + 1);
dock_select->update();
@@ -4107,7 +4113,7 @@ void EditorNode::_dock_select_draw() {
Color used = Color(0.6, 0.6, 0.6, 0.8);
Color used_selected = Color(0.8, 0.8, 0.8, 0.8);
- Color tab_selected = theme_base->get_color("mono_color", "Editor");
+ Color tab_selected = theme_base->get_theme_color("mono_color", "Editor");
Color unused = used;
unused.a = 0.4;
Color unusable = unused;
@@ -4123,18 +4129,15 @@ void EditorNode::_dock_select_draw() {
dock_tab_move_right->set_disabled(true);
if (dock_popup_selected != -1 && dock_slot[dock_popup_selected]->get_tab_count()) {
-
dock_tab_move_left->set_disabled(dock_slot[dock_popup_selected]->get_current_tab() == 0);
dock_tab_move_right->set_disabled(dock_slot[dock_popup_selected]->get_current_tab() >= dock_slot[dock_popup_selected]->get_tab_count() - 1);
}
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
-
Vector2 ofs;
switch (i) {
case DOCK_SLOT_LEFT_UL: {
-
} break;
case DOCK_SLOT_LEFT_BL: {
ofs.y += s.y;
@@ -4175,22 +4178,21 @@ void EditorNode::_dock_select_draw() {
} else if (dock_slot[i]->get_child_count() == 0) {
dock_select->draw_rect(r, unused);
} else {
-
dock_select->draw_rect(r, used);
}
for (int j = 0; j < MIN(3, dock_slot[i]->get_child_count()); j++) {
int xofs = (r.size.width / 3) * j;
Color c = used;
- if (i == dock_popup_selected && (dock_slot[i]->get_current_tab() > 3 || dock_slot[i]->get_current_tab() == j))
+ if (i == dock_popup_selected && (dock_slot[i]->get_current_tab() > 3 || dock_slot[i]->get_current_tab() == j)) {
c = tab_selected;
+ }
dock_select->draw_rect(Rect2(2 + ofs.x + xofs, ofs.y, r.size.width / 3 - 1, 3), c);
}
}
}
void EditorNode::_save_docks() {
-
if (waiting_for_first_scan) {
return; //scanning, do not touch docks
}
@@ -4205,13 +4207,13 @@ void EditorNode::_save_docks() {
}
void EditorNode::_save_docks_to_config(Ref<ConfigFile> p_layout, const String &p_section) {
-
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
String names;
for (int j = 0; j < dock_slot[i]->get_tab_count(); j++) {
String name = dock_slot[i]->get_tab_control(j)->get_name();
- if (names != "")
+ if (names != "") {
names += ",";
+ }
names += name;
}
@@ -4225,14 +4227,12 @@ void EditorNode::_save_docks_to_config(Ref<ConfigFile> p_layout, const String &p
p_layout->set_value(p_section, "dock_filesystem_file_list_display_mode", filesystem_dock->get_file_list_display_mode());
for (int i = 0; i < vsplits.size(); i++) {
-
if (vsplits[i]->is_visible_in_tree()) {
p_layout->set_value(p_section, "dock_split_" + itos(i + 1), vsplits[i]->get_split_offset());
}
}
for (int i = 0; i < hsplits.size(); i++) {
-
p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), hsplits[i]->get_split_offset());
}
}
@@ -4250,17 +4250,14 @@ void EditorNode::_save_open_scenes_to_config(Ref<ConfigFile> p_layout, const Str
}
void EditorNode::save_layout() {
-
dock_drag_timer->start();
}
void EditorNode::_dock_split_dragged(int ofs) {
-
dock_drag_timer->start();
}
void EditorNode::_load_docks() {
-
Ref<ConfigFile> config;
config.instance();
Error err = config->load(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("editor_layout.cfg"));
@@ -4279,9 +4276,7 @@ void EditorNode::_load_docks() {
}
void EditorNode::_update_dock_slots_visibility() {
-
if (!docks_visible) {
-
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
dock_slot[i]->hide();
}
@@ -4291,51 +4286,48 @@ void EditorNode::_update_dock_slots_visibility() {
}
right_hsplit->hide();
- bottom_panel->hide();
} else {
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
-
int tabs_visible = 0;
for (int j = 0; j < dock_slot[i]->get_tab_count(); j++) {
if (!dock_slot[i]->get_tab_hidden(j)) {
tabs_visible++;
}
}
- if (tabs_visible)
+ if (tabs_visible) {
dock_slot[i]->show();
- else
+ } else {
dock_slot[i]->hide();
+ }
}
for (int i = 0; i < vsplits.size(); i++) {
bool in_use = dock_slot[i * 2 + 0]->get_tab_count() || dock_slot[i * 2 + 1]->get_tab_count();
- if (in_use)
+ if (in_use) {
vsplits[i]->show();
- else
+ } else {
vsplits[i]->hide();
+ }
}
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
-
if (dock_slot[i]->is_visible() && dock_slot[i]->get_tab_count()) {
dock_slot[i]->set_current_tab(0);
}
}
- bottom_panel->show();
- if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible())
+ if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible()) {
right_hsplit->show();
- else
+ } else {
right_hsplit->hide();
+ }
}
}
void EditorNode::_dock_tab_changed(int p_tab) {
-
// update visibility but don't set current tab
if (!docks_visible) {
-
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
dock_slot[i]->hide();
}
@@ -4348,55 +4340,58 @@ void EditorNode::_dock_tab_changed(int p_tab) {
bottom_panel->hide();
} else {
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
-
- if (dock_slot[i]->get_tab_count())
+ if (dock_slot[i]->get_tab_count()) {
dock_slot[i]->show();
- else
+ } else {
dock_slot[i]->hide();
+ }
}
for (int i = 0; i < vsplits.size(); i++) {
bool in_use = dock_slot[i * 2 + 0]->get_tab_count() || dock_slot[i * 2 + 1]->get_tab_count();
- if (in_use)
+ if (in_use) {
vsplits[i]->show();
- else
+ } else {
vsplits[i]->hide();
+ }
}
bottom_panel->show();
- if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible())
+ if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible()) {
right_hsplit->show();
- else
+ } else {
right_hsplit->hide();
+ }
}
}
void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String &p_section) {
-
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
-
- if (!p_layout->has_section_key(p_section, "dock_" + itos(i + 1)))
+ if (!p_layout->has_section_key(p_section, "dock_" + itos(i + 1))) {
continue;
+ }
Vector<String> names = String(p_layout->get_value(p_section, "dock_" + itos(i + 1))).split(",");
for (int j = 0; j < names.size(); j++) {
-
String name = names[j];
//find it, in a horribly inefficient way
int atidx = -1;
- Control *node = NULL;
+ Control *node = nullptr;
for (int k = 0; k < DOCK_SLOT_MAX; k++) {
- if (!dock_slot[k]->has_node(name))
+ if (!dock_slot[k]->has_node(name)) {
continue;
+ }
node = Object::cast_to<Control>(dock_slot[k]->get_node(name));
- if (!node)
+ if (!node) {
continue;
+ }
atidx = k;
break;
}
- if (atidx == -1) //well, it's not anywhere
+ if (atidx == -1) { //well, it's not anywhere
continue;
+ }
if (atidx == i) {
node->raise();
@@ -4429,36 +4424,38 @@ void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String
}
for (int i = 0; i < vsplits.size(); i++) {
-
- if (!p_layout->has_section_key(p_section, "dock_split_" + itos(i + 1)))
+ if (!p_layout->has_section_key(p_section, "dock_split_" + itos(i + 1))) {
continue;
+ }
int ofs = p_layout->get_value(p_section, "dock_split_" + itos(i + 1));
vsplits[i]->set_split_offset(ofs);
}
for (int i = 0; i < hsplits.size(); i++) {
- if (!p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1)))
+ if (!p_layout->has_section_key(p_section, "dock_hsplit_" + itos(i + 1))) {
continue;
+ }
int ofs = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1));
hsplits[i]->set_split_offset(ofs);
}
for (int i = 0; i < vsplits.size(); i++) {
bool in_use = dock_slot[i * 2 + 0]->get_tab_count() || dock_slot[i * 2 + 1]->get_tab_count();
- if (in_use)
+ if (in_use) {
vsplits[i]->show();
- else
+ } else {
vsplits[i]->hide();
+ }
}
- if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible())
+ if (right_l_vsplit->is_visible() || right_r_vsplit->is_visible()) {
right_hsplit->show();
- else
+ } else {
right_hsplit->hide();
+ }
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
-
if (dock_slot[i]->is_visible() && dock_slot[i]->get_tab_count()) {
dock_slot[i]->set_current_tab(0);
}
@@ -4507,26 +4504,23 @@ bool EditorNode::ensure_main_scene(bool p_from_native) {
String main_scene = GLOBAL_DEF("application/run/main_scene", "");
if (main_scene == "") {
-
current_option = -1;
pick_main_scene->set_text(TTR("No main scene has ever been defined, select one?\nYou can change it later in \"Project Settings\" under the 'application' category."));
- pick_main_scene->popup_centered_minsize();
+ pick_main_scene->popup_centered();
return false;
}
if (!FileAccess::exists(main_scene)) {
-
current_option = -1;
pick_main_scene->set_text(vformat(TTR("Selected scene '%s' does not exist, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
- pick_main_scene->popup_centered_minsize();
+ pick_main_scene->popup_centered();
return false;
}
if (ResourceLoader::get_resource_type(main_scene) != "PackedScene") {
-
current_option = -1;
pick_main_scene->set_text(vformat(TTR("Selected scene '%s' is not a scene file, select a valid one?\nYou can change it later in \"Project Settings\" under the 'application' category."), main_scene));
- pick_main_scene->popup_centered_minsize();
+ pick_main_scene->popup_centered();
return false;
}
@@ -4538,10 +4532,35 @@ void EditorNode::run_play() {
_run(false);
}
+void EditorNode::run_play_current() {
+ _save_default_environment();
+ _menu_option_confirm(RUN_STOP, true);
+ _run(true);
+}
+
+void EditorNode::run_play_custom(const String &p_custom) {
+ _menu_option_confirm(RUN_STOP, true);
+ _run(false, p_custom);
+}
+
void EditorNode::run_stop() {
_menu_option_confirm(RUN_STOP, false);
}
+bool EditorNode::is_run_playing() const {
+ EditorRun::Status status = editor_run.get_status();
+ return (status == EditorRun::STATUS_PLAY || status == EditorRun::STATUS_PAUSED);
+}
+
+String EditorNode::get_run_playing_scene() const {
+ String run_filename = editor_run.get_running_scene();
+ if (run_filename == "" && is_run_playing()) {
+ run_filename = GLOBAL_DEF("application/run/main_scene", ""); // Must be the main scene then.
+ }
+
+ return run_filename;
+}
+
int EditorNode::get_current_tab() {
return scene_tabs->get_current_tab();
}
@@ -4551,7 +4570,6 @@ void EditorNode::set_current_tab(int p_tab) {
}
void EditorNode::_update_layouts_menu() {
-
editor_layouts->clear();
overridden_default_layout = -1;
@@ -4572,7 +4590,6 @@ void EditorNode::_update_layouts_menu() {
config.ptr()->get_sections(&layouts);
for (List<String>::Element *E = layouts.front(); E; E = E->next()) {
-
String layout = E->get();
if (layout == TTR("Default")) {
@@ -4585,11 +4602,8 @@ void EditorNode::_update_layouts_menu() {
}
void EditorNode::_layout_menu_option(int p_id) {
-
switch (p_id) {
-
case SETTINGS_LAYOUT_SAVE: {
-
current_option = p_id;
layout_dialog->set_title(TTR("Save Layout"));
layout_dialog->get_ok()->set_text(TTR("Save"));
@@ -4597,7 +4611,6 @@ void EditorNode::_layout_menu_option(int p_id) {
layout_dialog->set_name_line_enabled(true);
} break;
case SETTINGS_LAYOUT_DELETE: {
-
current_option = p_id;
layout_dialog->set_title(TTR("Delete Layout"));
layout_dialog->get_ok()->set_text(TTR("Delete"));
@@ -4605,12 +4618,10 @@ void EditorNode::_layout_menu_option(int p_id) {
layout_dialog->set_name_line_enabled(false);
} break;
case SETTINGS_LAYOUT_DEFAULT: {
-
_load_docks_from_config(default_layout, "docks");
_save_docks();
} break;
default: {
-
Ref<ConfigFile> config;
config.instance();
Error err = config->load(EditorSettings::get_singleton()->get_editor_layouts_config());
@@ -4625,10 +4636,10 @@ void EditorNode::_layout_menu_option(int p_id) {
}
void EditorNode::_scene_tab_script_edited(int p_tab) {
-
Ref<Script> script = editor_data.get_scene_root_script(p_tab);
- if (script.is_valid())
+ if (script.is_valid()) {
inspector_dock->edit_resource(script);
+ }
}
void EditorNode::_scene_tab_closed(int p_tab, int option) {
@@ -4646,7 +4657,7 @@ void EditorNode::_scene_tab_closed(int p_tab, int option) {
if (unsaved) {
save_confirmation->get_ok()->set_text(TTR("Save & Close"));
save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), scene->get_filename() != "" ? scene->get_filename() : "unsaved scene"));
- save_confirmation->popup_centered_minsize();
+ save_confirmation->popup_centered();
} else {
_discard_changes();
}
@@ -4679,7 +4690,6 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouseButton> mb = p_input;
if (mb.is_valid()) {
-
if (scene_tabs->get_hovered_tab() >= 0) {
if (mb->get_button_index() == BUTTON_MIDDLE && mb->is_pressed()) {
_scene_tab_closed(scene_tabs->get_hovered_tab());
@@ -4690,7 +4700,6 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) {
}
}
if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
-
// context menu
scene_tabs_context_menu->clear();
scene_tabs_context_menu->set_size(Size2(1, 1));
@@ -4707,10 +4716,10 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) {
scene_tabs_context_menu->add_item(TTR("Play This Scene"), RUN_PLAY_SCENE);
scene_tabs_context_menu->add_separator();
- Ref<ShortCut> close_tab_sc = ED_GET_SHORTCUT("editor/close_scene");
+ Ref<Shortcut> close_tab_sc = ED_GET_SHORTCUT("editor/close_scene");
close_tab_sc->set_name(TTR("Close Tab"));
scene_tabs_context_menu->add_shortcut(close_tab_sc, FILE_CLOSE);
- Ref<ShortCut> undo_close_tab_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene");
+ Ref<Shortcut> undo_close_tab_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene");
undo_close_tab_sc->set_name(TTR("Undo Close Tab"));
scene_tabs_context_menu->add_shortcut(undo_close_tab_sc, FILE_OPEN_PREV);
if (previous_scenes.empty()) {
@@ -4731,7 +4740,7 @@ void EditorNode::_reposition_active_tab(int idx_to) {
_update_scene_tabs();
}
-void EditorNode::_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata) {
+void EditorNode::_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata) {
int p_tab = p_udata.operator signed int();
if (p_preview.is_valid()) {
Rect2 rect = scene_tabs->get_tab_rect(p_tab);
@@ -4747,8 +4756,9 @@ void EditorNode::_scene_tab_changed(int p_tab) {
bool unsaved = (saved_version != editor_data.get_undo_redo().get_version());
- if (p_tab == editor_data.get_edited_scene())
+ if (p_tab == editor_data.get_edited_scene()) {
return; //pointless
+ }
uint64_t next_scene_version = editor_data.get_scene_version(p_tab);
@@ -4763,10 +4773,10 @@ void EditorNode::_scene_tab_changed(int p_tab) {
editor_data.get_undo_redo().commit_action();
}
-ToolButton *EditorNode::add_bottom_panel_item(String p_text, Control *p_item) {
-
- ToolButton *tb = memnew(ToolButton);
- tb->connect("toggled", this, "_bottom_panel_switch", varray(bottom_panel_items.size()));
+Button *EditorNode::add_bottom_panel_item(String p_text, Control *p_item) {
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
+ tb->connect("toggled", callable_mp(this, &EditorNode::_bottom_panel_switch), varray(bottom_panel_items.size()));
tb->set_text(p_text);
tb->set_toggle_mode(true);
tb->set_focus_mode(Control::FOCUS_NONE);
@@ -4785,19 +4795,17 @@ ToolButton *EditorNode::add_bottom_panel_item(String p_text, Control *p_item) {
}
bool EditorNode::are_bottom_panels_hidden() const {
-
for (int i = 0; i < bottom_panel_items.size(); i++) {
- if (bottom_panel_items[i].button->is_pressed())
+ if (bottom_panel_items[i].button->is_pressed()) {
return false;
+ }
}
return true;
}
void EditorNode::hide_bottom_panel() {
-
for (int i = 0; i < bottom_panel_items.size(); i++) {
-
if (bottom_panel_items[i].control->is_visible()) {
_bottom_panel_switch(false, i);
break;
@@ -4806,9 +4814,7 @@ void EditorNode::hide_bottom_panel() {
}
void EditorNode::make_bottom_panel_item_visible(Control *p_item) {
-
for (int i = 0; i < bottom_panel_items.size(); i++) {
-
if (bottom_panel_items[i].control == p_item) {
_bottom_panel_switch(true, i);
break;
@@ -4817,9 +4823,7 @@ void EditorNode::make_bottom_panel_item_visible(Control *p_item) {
}
void EditorNode::raise_bottom_panel_item(Control *p_item) {
-
for (int i = 0; i < bottom_panel_items.size(); i++) {
-
if (bottom_panel_items[i].control == p_item) {
bottom_panel_items[i].button->raise();
SWAP(bottom_panel_items.write[i], bottom_panel_items.write[bottom_panel_items.size() - 1]);
@@ -4828,15 +4832,13 @@ void EditorNode::raise_bottom_panel_item(Control *p_item) {
}
for (int i = 0; i < bottom_panel_items.size(); i++) {
- bottom_panel_items[i].button->disconnect("toggled", this, "_bottom_panel_switch");
- bottom_panel_items[i].button->connect("toggled", this, "_bottom_panel_switch", varray(i));
+ bottom_panel_items[i].button->disconnect("toggled", callable_mp(this, &EditorNode::_bottom_panel_switch));
+ bottom_panel_items[i].button->connect("toggled", callable_mp(this, &EditorNode::_bottom_panel_switch), varray(i));
}
}
void EditorNode::remove_bottom_panel_item(Control *p_item) {
-
for (int i = 0; i < bottom_panel_items.size(); i++) {
-
if (bottom_panel_items[i].control == p_item) {
if (p_item->is_visible_in_tree()) {
_bottom_panel_switch(false, i);
@@ -4850,13 +4852,12 @@ void EditorNode::remove_bottom_panel_item(Control *p_item) {
}
for (int i = 0; i < bottom_panel_items.size(); i++) {
- bottom_panel_items[i].button->disconnect("toggled", this, "_bottom_panel_switch");
- bottom_panel_items[i].button->connect("toggled", this, "_bottom_panel_switch", varray(i));
+ bottom_panel_items[i].button->disconnect("toggled", callable_mp(this, &EditorNode::_bottom_panel_switch));
+ bottom_panel_items[i].button->connect("toggled", callable_mp(this, &EditorNode::_bottom_panel_switch), varray(i));
}
}
void EditorNode::_bottom_panel_switch(bool p_enable, int p_idx) {
-
ERR_FAIL_INDEX(p_idx, bottom_panel_items.size());
if (bottom_panel_items[p_idx].control->is_visible() == p_enable) {
@@ -4865,14 +4866,13 @@ void EditorNode::_bottom_panel_switch(bool p_enable, int p_idx) {
if (p_enable) {
for (int i = 0; i < bottom_panel_items.size(); i++) {
-
bottom_panel_items[i].button->set_pressed(i == p_idx);
bottom_panel_items[i].control->set_visible(i == p_idx);
}
- if (ScriptEditor::get_singleton()->get_debugger() == bottom_panel_items[p_idx].control) { // this is the debug panel which uses tabs, so the top section should be smaller
- bottom_panel->add_style_override("panel", gui_base->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles"));
+ if (EditorDebuggerNode::get_singleton() == bottom_panel_items[p_idx].control) { // this is the debug panel which uses tabs, so the top section should be smaller
+ bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox("BottomPanelDebuggerOverride", "EditorStyles"));
} else {
- bottom_panel->add_style_override("panel", gui_base->get_stylebox("panel", "TabContainer"));
+ bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox("panel", "TabContainer"));
}
center_split->set_dragger_visibility(SplitContainer::DRAGGER_VISIBLE);
center_split->set_collapsed(false);
@@ -4882,7 +4882,7 @@ void EditorNode::_bottom_panel_switch(bool p_enable, int p_idx) {
bottom_panel_raise->show();
} else {
- bottom_panel->add_style_override("panel", gui_base->get_stylebox("panel", "TabContainer"));
+ bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox("panel", "TabContainer"));
bottom_panel_items[p_idx].button->set_pressed(false);
bottom_panel_items[p_idx].control->set_visible(false);
center_split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN);
@@ -4904,7 +4904,6 @@ bool EditorNode::get_docks_visible() const {
}
void EditorNode::_toggle_distraction_free_mode() {
-
if (EditorSettings::get_singleton()->get("interface/editor/separate_distraction_mode")) {
int screen = -1;
for (int i = 0; i < editor_table.size(); i++) {
@@ -4927,7 +4926,6 @@ void EditorNode::_toggle_distraction_free_mode() {
}
void EditorNode::set_distraction_free_mode(bool p_enter) {
-
distraction_free->set_pressed(p_enter);
if (p_enter) {
@@ -4939,7 +4937,7 @@ void EditorNode::set_distraction_free_mode(bool p_enter) {
}
}
-bool EditorNode::get_distraction_free_mode() const {
+bool EditorNode::is_distraction_free_mode_enabled() const {
return distraction_free->is_pressed();
}
@@ -4950,8 +4948,7 @@ void EditorNode::add_control_to_dock(DockSlot p_slot, Control *p_control) {
}
void EditorNode::remove_control_from_dock(Control *p_control) {
-
- Control *dock = NULL;
+ Control *dock = nullptr;
for (int i = 0; i < DOCK_SLOT_MAX; i++) {
if (p_control->get_parent() == dock_slot[i]) {
dock = dock_slot[i];
@@ -4966,16 +4963,15 @@ void EditorNode::remove_control_from_dock(Control *p_control) {
}
Variant EditorNode::drag_resource(const Ref<Resource> &p_res, Control *p_from) {
-
Control *drag_control = memnew(Control);
TextureRect *drag_preview = memnew(TextureRect);
Label *label = memnew(Label);
- Ref<Texture> preview;
+ Ref<Texture2D> preview;
{
//todo make proper previews
- Ref<ImageTexture> pic = gui_base->get_icon("FileBigThumb", "EditorIcons");
+ Ref<ImageTexture> pic = gui_base->get_theme_icon("FileBigThumb", "EditorIcons");
Ref<Image> img = pic->get_data();
img = img->duplicate();
img->resize(48, 48); //meh
@@ -5027,10 +5023,10 @@ Variant EditorNode::drag_files_and_dirs(const Vector<String> &p_paths, Control *
if (p_paths[i].ends_with("/")) {
label->set_text(p_paths[i].substr(0, p_paths[i].length() - 1).get_file());
- icon->set_texture(gui_base->get_icon("Folder", "EditorIcons"));
+ icon->set_texture(gui_base->get_theme_icon("Folder", "EditorIcons"));
} else {
label->set_text(p_paths[i].get_file());
- icon->set_texture(gui_base->get_icon("File", "EditorIcons"));
+ icon->set_texture(gui_base->get_theme_icon("File", "EditorIcons"));
}
icon->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
icon->set_size(Size2(16, 16));
@@ -5074,7 +5070,7 @@ void EditorNode::add_tool_menu_item(const String &p_name, Object *p_handler, con
void EditorNode::add_tool_submenu_item(const String &p_name, PopupMenu *p_submenu) {
ERR_FAIL_NULL(p_submenu);
- ERR_FAIL_COND(p_submenu->get_parent() != NULL);
+ ERR_FAIL_COND(p_submenu->get_parent() != nullptr);
tool_menu->add_child(p_submenu);
tool_menu->add_submenu_item(p_name, p_submenu->get_name(), TOOLS_CUSTOM);
@@ -5082,8 +5078,9 @@ void EditorNode::add_tool_submenu_item(const String &p_name, PopupMenu *p_submen
void EditorNode::remove_tool_menu_item(const String &p_name) {
for (int i = 0; i < tool_menu->get_item_count(); i++) {
- if (tool_menu->get_item_id(i) != TOOLS_CUSTOM)
+ if (tool_menu->get_item_id(i) != TOOLS_CUSTOM) {
continue;
+ }
if (tool_menu->get_item_text(i) == p_name) {
if (tool_menu->get_item_submenu(i) != "") {
@@ -5098,26 +5095,23 @@ void EditorNode::remove_tool_menu_item(const String &p_name) {
}
}
-void EditorNode::_global_menu_action(const Variant &p_id, const Variant &p_meta) {
+void EditorNode::_global_menu_scene(const Variant &p_tag) {
+ int idx = (int)p_tag;
+ scene_tabs->set_current_tab(idx);
+}
- int id = (int)p_id;
- if (id == GLOBAL_NEW_WINDOW) {
- if (OS::get_singleton()->get_main_loop()) {
- List<String> args;
- args.push_back("-e");
- String exec = OS::get_singleton()->get_executable_path();
+void EditorNode::_global_menu_new_window(const Variant &p_tag) {
+ if (OS::get_singleton()->get_main_loop()) {
+ List<String> args;
+ args.push_back("-p");
+ String exec = OS::get_singleton()->get_executable_path();
- OS::ProcessID pid = 0;
- OS::get_singleton()->execute(exec, args, false, &pid);
- }
- } else if (id == GLOBAL_SCENE) {
- int idx = (int)p_meta;
- scene_tabs->set_current_tab(idx);
+ OS::ProcessID pid = 0;
+ OS::get_singleton()->execute(exec, args, false, &pid);
}
}
void EditorNode::_dropped_files(const Vector<String> &p_files, int p_screen) {
-
String to_path = ProjectSettings::get_singleton()->globalize_path(get_filesystem_dock()->get_selected_path());
_add_dropped_files_recursive(p_files, to_path);
@@ -5126,17 +5120,14 @@ void EditorNode::_dropped_files(const Vector<String> &p_files, int p_screen) {
}
void EditorNode::_add_dropped_files_recursive(const Vector<String> &p_files, String to_path) {
-
DirAccessRef dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
Vector<String> just_copy = String("ttf,otf").split(",");
for (int i = 0; i < p_files.size(); i++) {
-
String from = p_files[i];
String to = to_path.plus_file(from.get_file());
if (dir->dir_exists(from)) {
-
Vector<String> sub_files;
DirAccessRef sub_dir = DirAccess::open(from);
@@ -5169,19 +5160,16 @@ void EditorNode::_add_dropped_files_recursive(const Vector<String> &p_files, Str
}
void EditorNode::_file_access_close_error_notify(const String &p_str) {
-
add_io_error("Unable to write to file '" + p_str + "', file in use, locked or lacking permissions.");
}
void EditorNode::reload_scene(const String &p_path) {
-
//first of all, reload internal textures, materials, meshes, etc. as they might have changed on disk
- List<Ref<Resource> > cached;
+ List<Ref<Resource>> cached;
ResourceCache::get_cached_resources(&cached);
- List<Ref<Resource> > to_clear; //clear internal resources from previous scene from being used
- for (List<Ref<Resource> >::Element *E = cached.front(); E; E = E->next()) {
-
+ List<Ref<Resource>> to_clear; //clear internal resources from previous scene from being used
+ for (List<Ref<Resource>>::Element *E = cached.front(); E; E = E->next()) {
if (E->get()->get_path().begins_with(p_path + "::")) { //subresources of existing scene
to_clear.push_back(E->get());
}
@@ -5195,7 +5183,6 @@ void EditorNode::reload_scene(const String &p_path) {
int scene_idx = -1;
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
-
if (editor_data.get_scene_path(i) == p_path) {
scene_idx = i;
break;
@@ -5234,7 +5221,6 @@ void EditorNode::reload_scene(const String &p_path) {
int EditorNode::plugin_init_callback_count = 0;
void EditorNode::add_plugin_init_callback(EditorPluginInitializeCallback p_callback) {
-
ERR_FAIL_COND(plugin_init_callback_count == MAX_INIT_CALLBACKS);
plugin_init_callbacks[plugin_init_callback_count++] = p_callback;
@@ -5245,7 +5231,6 @@ EditorPluginInitializeCallback EditorNode::plugin_init_callbacks[EditorNode::MAX
int EditorNode::build_callback_count = 0;
void EditorNode::add_build_callback(EditorBuildCallback p_callback) {
-
ERR_FAIL_COND(build_callback_count == MAX_INIT_CALLBACKS);
build_callbacks[build_callback_count++] = p_callback;
@@ -5254,7 +5239,6 @@ void EditorNode::add_build_callback(EditorBuildCallback p_callback) {
EditorBuildCallback EditorNode::build_callbacks[EditorNode::MAX_BUILD_CALLBACKS];
bool EditorNode::call_build() {
-
bool builds_successful = true;
for (int i = 0; i < build_callback_count && builds_successful; i++) {
@@ -5273,13 +5257,11 @@ bool EditorNode::call_build() {
}
void EditorNode::_inherit_imported(const String &p_action) {
-
open_imported->hide();
load_scene(open_import_request, true, true);
}
void EditorNode::_open_imported() {
-
load_scene(open_import_request, true, false, true, true);
}
@@ -5299,7 +5281,6 @@ bool EditorNode::is_editor_dimmed() const {
}
void EditorNode::open_export_template_manager() {
-
export_template_manager->popup_manager();
}
@@ -5311,9 +5292,8 @@ void EditorNode::remove_resource_conversion_plugin(const Ref<EditorResourceConve
resource_conversion_plugins.erase(p_plugin);
}
-Vector<Ref<EditorResourceConversionPlugin> > EditorNode::find_resource_conversion_plugin(const Ref<Resource> &p_for_resource) {
-
- Vector<Ref<EditorResourceConversionPlugin> > ret;
+Vector<Ref<EditorResourceConversionPlugin>> EditorNode::find_resource_conversion_plugin(const Ref<Resource> &p_for_resource) {
+ Vector<Ref<EditorResourceConversionPlugin>> ret;
for (int i = 0; i < resource_conversion_plugins.size(); i++) {
if (resource_conversion_plugins[i].is_valid() && resource_conversion_plugins[i]->handles(p_for_resource)) {
@@ -5325,32 +5305,29 @@ Vector<Ref<EditorResourceConversionPlugin> > EditorNode::find_resource_conversio
}
void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) {
-
top_split->set_visible(!p_pressed);
}
void EditorNode::_update_video_driver_color() {
-
// TODO: Probably should de-hardcode this and add to editor settings.
if (video_driver->get_text() == "GLES2") {
- video_driver->add_color_override("font_color", Color::hex(0x5586a4ff));
- } else if (video_driver->get_text() == "GLES3") {
- video_driver->add_color_override("font_color", Color::hex(0xa5557dff));
+ video_driver->add_theme_color_override("font_color", Color::hex(0x5586a4ff));
+ } else if (video_driver->get_text() == "Vulkan") {
+ video_driver->add_theme_color_override("font_color", theme_base->get_theme_color("vulkan_color", "Editor"));
}
}
void EditorNode::_video_driver_selected(int p_which) {
-
String driver = video_driver->get_item_metadata(p_which);
- String current = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
+ String current = ""; //OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
if (driver == current) {
return;
}
video_driver_request = driver;
- video_restart_dialog->popup_centered_minsize();
+ video_restart_dialog->popup_centered();
video_driver->select(video_driver_current);
_update_video_driver_color();
}
@@ -5364,33 +5341,32 @@ void EditorNode::_resource_saved(RES p_resource, const String &p_path) {
}
void EditorNode::_resource_loaded(RES p_resource, const String &p_path) {
-
singleton->editor_folding.load_resource_folding(p_resource, p_path);
}
void EditorNode::_feature_profile_changed() {
-
Ref<EditorFeatureProfile> profile = feature_profile_manager->get_current_profile();
TabContainer *import_tabs = cast_to<TabContainer>(import_dock->get_parent());
TabContainer *node_tabs = cast_to<TabContainer>(node_dock->get_parent());
TabContainer *fs_tabs = cast_to<TabContainer>(filesystem_dock->get_parent());
if (profile.is_valid()) {
-
- import_tabs->set_tab_hidden(import_dock->get_index(), profile->is_feature_disabled(EditorFeatureProfile::FEATURE_IMPORT_DOCK));
node_tabs->set_tab_hidden(node_dock->get_index(), profile->is_feature_disabled(EditorFeatureProfile::FEATURE_NODE_DOCK));
- fs_tabs->set_tab_hidden(filesystem_dock->get_index(), profile->is_feature_disabled(EditorFeatureProfile::FEATURE_FILESYSTEM_DOCK));
+ // The Import dock is useless without the FileSystem dock. Ensure the configuration is valid.
+ bool fs_dock_disabled = profile->is_feature_disabled(EditorFeatureProfile::FEATURE_FILESYSTEM_DOCK);
+ fs_tabs->set_tab_hidden(filesystem_dock->get_index(), fs_dock_disabled);
+ import_tabs->set_tab_hidden(import_dock->get_index(), fs_dock_disabled || profile->is_feature_disabled(EditorFeatureProfile::FEATURE_IMPORT_DOCK));
main_editor_buttons[EDITOR_3D]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D));
main_editor_buttons[EDITOR_SCRIPT]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT));
- if (StreamPeerSSL::is_available())
+ if (StreamPeerSSL::is_available()) {
main_editor_buttons[EDITOR_ASSETLIB]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_ASSET_LIB));
+ }
if ((profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D) && singleton->main_editor_buttons[EDITOR_3D]->is_pressed()) ||
(profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT) && singleton->main_editor_buttons[EDITOR_SCRIPT]->is_pressed()) ||
(StreamPeerSSL::is_available() && profile->is_feature_disabled(EditorFeatureProfile::FEATURE_ASSET_LIB) && singleton->main_editor_buttons[EDITOR_ASSETLIB]->is_pressed())) {
_editor_select(EDITOR_2D);
}
} else {
-
import_tabs->set_tab_hidden(import_dock->get_index(), false);
node_tabs->set_tab_hidden(node_dock->get_index(), false);
fs_tabs->set_tab_hidden(filesystem_dock->get_index(), false);
@@ -5399,113 +5375,58 @@ void EditorNode::_feature_profile_changed() {
filesystem_dock->set_visible(true);
main_editor_buttons[EDITOR_3D]->set_visible(true);
main_editor_buttons[EDITOR_SCRIPT]->set_visible(true);
- if (StreamPeerSSL::is_available())
+ if (StreamPeerSSL::is_available()) {
main_editor_buttons[EDITOR_ASSETLIB]->set_visible(true);
+ }
}
_update_dock_slots_visibility();
}
void EditorNode::_bind_methods() {
-
- ClassDB::bind_method("_menu_option", &EditorNode::_menu_option);
- ClassDB::bind_method("_tool_menu_option", &EditorNode::_tool_menu_option);
- ClassDB::bind_method("_menu_confirm_current", &EditorNode::_menu_confirm_current);
- ClassDB::bind_method("_dialog_action", &EditorNode::_dialog_action);
ClassDB::bind_method("_editor_select", &EditorNode::_editor_select);
ClassDB::bind_method("_node_renamed", &EditorNode::_node_renamed);
ClassDB::bind_method("edit_node", &EditorNode::edit_node);
ClassDB::bind_method("_unhandled_input", &EditorNode::_unhandled_input);
- ClassDB::bind_method("_update_file_menu_opened", &EditorNode::_update_file_menu_opened);
- ClassDB::bind_method("_update_file_menu_closed", &EditorNode::_update_file_menu_closed);
ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false));
ClassDB::bind_method("_get_scene_metadata", &EditorNode::_get_scene_metadata);
ClassDB::bind_method("set_edited_scene", &EditorNode::set_edited_scene);
ClassDB::bind_method("open_request", &EditorNode::open_request);
- ClassDB::bind_method("_inherit_request", &EditorNode::_inherit_request);
- ClassDB::bind_method("_instance_request", &EditorNode::_instance_request);
ClassDB::bind_method("_close_messages", &EditorNode::_close_messages);
ClassDB::bind_method("_show_messages", &EditorNode::_show_messages);
- ClassDB::bind_method("_vp_resized", &EditorNode::_vp_resized);
- ClassDB::bind_method("_quick_opened", &EditorNode::_quick_opened);
- ClassDB::bind_method("_quick_run", &EditorNode::_quick_run);
-
- ClassDB::bind_method("_open_recent_scene", &EditorNode::_open_recent_scene);
ClassDB::bind_method("stop_child_process", &EditorNode::stop_child_process);
ClassDB::bind_method("get_script_create_dialog", &EditorNode::get_script_create_dialog);
- ClassDB::bind_method("_sources_changed", &EditorNode::_sources_changed);
- ClassDB::bind_method("_fs_changed", &EditorNode::_fs_changed);
- ClassDB::bind_method("_dock_select_draw", &EditorNode::_dock_select_draw);
- ClassDB::bind_method("_dock_select_input", &EditorNode::_dock_select_input);
- ClassDB::bind_method("_dock_pre_popup", &EditorNode::_dock_pre_popup);
- ClassDB::bind_method("_dock_split_dragged", &EditorNode::_dock_split_dragged);
- ClassDB::bind_method("_save_docks", &EditorNode::_save_docks);
- ClassDB::bind_method("_dock_popup_exit", &EditorNode::_dock_popup_exit);
- ClassDB::bind_method("_dock_move_left", &EditorNode::_dock_move_left);
- ClassDB::bind_method("_dock_move_right", &EditorNode::_dock_move_right);
- ClassDB::bind_method("_dock_tab_changed", &EditorNode::_dock_tab_changed);
-
- ClassDB::bind_method("_layout_menu_option", &EditorNode::_layout_menu_option);
-
ClassDB::bind_method("set_current_scene", &EditorNode::set_current_scene);
ClassDB::bind_method("set_current_version", &EditorNode::set_current_version);
- ClassDB::bind_method("_scene_tab_changed", &EditorNode::_scene_tab_changed);
- ClassDB::bind_method("_scene_tab_closed", &EditorNode::_scene_tab_closed);
- ClassDB::bind_method("_scene_tab_hover", &EditorNode::_scene_tab_hover);
- ClassDB::bind_method("_scene_tab_exit", &EditorNode::_scene_tab_exit);
- ClassDB::bind_method("_scene_tab_input", &EditorNode::_scene_tab_input);
- ClassDB::bind_method("_reposition_active_tab", &EditorNode::_reposition_active_tab);
ClassDB::bind_method("_thumbnail_done", &EditorNode::_thumbnail_done);
- ClassDB::bind_method("_scene_tab_script_edited", &EditorNode::_scene_tab_script_edited);
ClassDB::bind_method("_set_main_scene_state", &EditorNode::_set_main_scene_state);
- ClassDB::bind_method("_update_scene_tabs", &EditorNode::_update_scene_tabs);
- ClassDB::bind_method("_discard_changes", &EditorNode::_discard_changes);
ClassDB::bind_method("_update_recent_scenes", &EditorNode::_update_recent_scenes);
ClassDB::bind_method("_clear_undo_history", &EditorNode::_clear_undo_history);
- ClassDB::bind_method("_dropped_files", &EditorNode::_dropped_files);
- ClassDB::bind_method(D_METHOD("_global_menu_action"), &EditorNode::_global_menu_action, DEFVAL(Variant()));
- ClassDB::bind_method("_toggle_distraction_free_mode", &EditorNode::_toggle_distraction_free_mode);
- ClassDB::bind_method("_version_control_menu_option", &EditorNode::_version_control_menu_option);
+
ClassDB::bind_method("edit_item_resource", &EditorNode::edit_item_resource);
ClassDB::bind_method(D_METHOD("get_gui_base"), &EditorNode::get_gui_base);
- ClassDB::bind_method(D_METHOD("_bottom_panel_switch"), &EditorNode::_bottom_panel_switch);
-
- ClassDB::bind_method(D_METHOD("_open_imported"), &EditorNode::_open_imported);
- ClassDB::bind_method(D_METHOD("_inherit_imported"), &EditorNode::_inherit_imported);
-
- ClassDB::bind_method("_copy_warning", &EditorNode::_copy_warning);
-
- ClassDB::bind_method(D_METHOD("_resources_reimported"), &EditorNode::_resources_reimported);
- ClassDB::bind_method(D_METHOD("_bottom_panel_raise_toggled"), &EditorNode::_bottom_panel_raise_toggled);
-
- ClassDB::bind_method(D_METHOD("_on_plugin_ready"), &EditorNode::_on_plugin_ready);
-
- ClassDB::bind_method(D_METHOD("_video_driver_selected"), &EditorNode::_video_driver_selected);
- ClassDB::bind_method(D_METHOD("_resources_changed"), &EditorNode::_resources_changed);
- ClassDB::bind_method(D_METHOD("_feature_profile_changed"), &EditorNode::_feature_profile_changed);
+ ClassDB::bind_method(D_METHOD("_on_plugin_ready"), &EditorNode::_on_plugin_ready); // Still used by some connect_compat.
ClassDB::bind_method("_screenshot", &EditorNode::_screenshot);
- ClassDB::bind_method("_request_screenshot", &EditorNode::_request_screenshot);
ClassDB::bind_method("_save_screenshot", &EditorNode::_save_screenshot);
ADD_SIGNAL(MethodInfo("play_pressed"));
ADD_SIGNAL(MethodInfo("pause_pressed"));
ADD_SIGNAL(MethodInfo("stop_pressed"));
ADD_SIGNAL(MethodInfo("request_help_search"));
- ADD_SIGNAL(MethodInfo("script_add_function_request", PropertyInfo(Variant::OBJECT, "obj"), PropertyInfo(Variant::STRING, "function"), PropertyInfo(Variant::POOL_STRING_ARRAY, "args")));
+ ADD_SIGNAL(MethodInfo("script_add_function_request", PropertyInfo(Variant::OBJECT, "obj"), PropertyInfo(Variant::STRING, "function"), PropertyInfo(Variant::PACKED_STRING_ARRAY, "args")));
ADD_SIGNAL(MethodInfo("resource_saved", PropertyInfo(Variant::OBJECT, "obj")));
}
static Node *_resource_get_edited_scene() {
-
return EditorNode::get_singleton()->get_edited_scene();
}
@@ -5515,9 +5436,8 @@ void EditorNode::_print_handler(void *p_this, const String &p_string, bool p_err
}
static void _execute_thread(void *p_ud) {
-
EditorNode::ExecuteThreadArgs *eta = (EditorNode::ExecuteThreadArgs *)p_ud;
- Error err = OS::get_singleton()->execute(eta->path, eta->args, true, NULL, &eta->output, &eta->exitcode, true, eta->execute_output_mutex);
+ Error err = OS::get_singleton()->execute(eta->path, eta->args, true, nullptr, &eta->output, &eta->exitcode, true, &eta->execute_output_mutex);
print_verbose("Thread exit status: " + itos(eta->exitcode));
if (err != OK) {
eta->exitcode = err;
@@ -5527,7 +5447,6 @@ static void _execute_thread(void *p_ud) {
}
int EditorNode::execute_and_show_output(const String &p_title, const String &p_path, const List<String> &p_arguments, bool p_close_on_ok, bool p_close_on_errors) {
-
execute_output_dialog->set_title(p_title);
execute_output_dialog->get_ok()->set_disabled(true);
execute_outputs->clear();
@@ -5537,7 +5456,6 @@ int EditorNode::execute_and_show_output(const String &p_title, const String &p_p
ExecuteThreadArgs eta;
eta.path = p_path;
eta.args = p_arguments;
- eta.execute_output_mutex = Mutex::create();
eta.exitcode = 255;
eta.done = false;
@@ -5548,20 +5466,20 @@ int EditorNode::execute_and_show_output(const String &p_title, const String &p_p
ERR_FAIL_COND_V(!eta.execute_output_thread, 0);
while (!eta.done) {
- eta.execute_output_mutex->lock();
- if (prev_len != eta.output.length()) {
- String to_add = eta.output.substr(prev_len, eta.output.length());
- prev_len = eta.output.length();
- execute_outputs->add_text(to_add);
- Main::iteration();
- }
- eta.execute_output_mutex->unlock();
+ {
+ MutexLock lock(eta.execute_output_mutex);
+ if (prev_len != eta.output.length()) {
+ String to_add = eta.output.substr(prev_len, eta.output.length());
+ prev_len = eta.output.length();
+ execute_outputs->add_text(to_add);
+ Main::iteration();
+ }
+ }
OS::get_singleton()->delay_usec(1000);
}
Thread::wait_to_finish(eta.execute_output_thread);
memdelete(eta.execute_output_thread);
- memdelete(eta.execute_output_mutex);
execute_outputs->add_text("\nExit Code: " + itos(eta.exitcode));
if (p_close_on_errors && eta.exitcode != 0) {
@@ -5577,15 +5495,15 @@ int EditorNode::execute_and_show_output(const String &p_title, const String &p_p
}
EditorNode::EditorNode() {
-
Input::get_singleton()->set_use_accumulated_input(true);
Resource::_get_local_scene_func = _resource_get_edited_scene;
- VisualServer::get_singleton()->textures_keep_original(true);
- VisualServer::get_singleton()->set_debug_generate_wireframes(true);
+ RenderingServer::get_singleton()->set_debug_generate_wireframes(true);
+
+ NavigationServer3D::get_singleton()->set_active(false); // no nav by default if editor
- PhysicsServer::get_singleton()->set_active(false); // no physics by default if editor
- Physics2DServer::get_singleton()->set_active(false); // no physics by default if editor
+ PhysicsServer3D::get_singleton()->set_active(false); // no physics by default if editor
+ PhysicsServer2D::get_singleton()->set_active(false); // no physics by default if editor
ScriptServer::set_scripting_enabled(false); // no scripting by default if editor
EditorHelp::generate_doc(); //before any editor classes are created
@@ -5593,15 +5511,21 @@ EditorNode::EditorNode() {
ResourceLoader::clear_translation_remaps(); //no remaps using during editor
ResourceLoader::clear_path_remaps();
- InputDefault *id = Object::cast_to<InputDefault>(Input::get_singleton());
+ Input *id = Input::get_singleton();
if (id) {
+ bool found_touchscreen = false;
+ for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {
+ if (DisplayServer::get_singleton()->screen_is_touchscreen(i)) {
+ found_touchscreen = true;
+ }
+ }
- if (!OS::get_singleton()->has_touchscreen_ui_hint() && Input::get_singleton()) {
+ if (!found_touchscreen && Input::get_singleton()) {
//only if no touchscreen ui hint, set emulation
id->set_emulate_touch_from_mouse(false); //just disable just in case
}
- id->set_custom_mouse_cursor(RES());
+ DisplayServer::get_singleton()->cursor_set_custom_image(RES());
}
singleton = this;
@@ -5618,8 +5542,9 @@ EditorNode::EditorNode() {
TranslationServer::get_singleton()->set_enabled(false);
// load settings
- if (!EditorSettings::get_singleton())
+ if (!EditorSettings::get_singleton()) {
EditorSettings::create();
+ }
FileAccess::set_backup_save(EDITOR_GET("filesystem/on_save/safe_save_on_backup_then_rename"));
@@ -5630,8 +5555,12 @@ EditorNode::EditorNode() {
switch (display_scale) {
case 0: {
// Try applying a suitable display scale automatically
- const int screen = OS::get_singleton()->get_current_screen();
- editor_set_scale(OS::get_singleton()->get_screen_dpi(screen) >= 192 && OS::get_singleton()->get_screen_size(screen).x > 2000 ? 2.0 : 1.0);
+#ifdef OSX_ENABLED
+ editor_set_scale(DisplayServer::get_singleton()->screen_get_max_scale());
+#else
+ const int screen = DisplayServer::get_singleton()->window_get_current_screen();
+ editor_set_scale(DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && DisplayServer::get_singleton()->screen_get_size(screen).x > 2000 ? 2.0 : 1.0);
+#endif
} break;
case 1: {
@@ -5665,7 +5594,7 @@ EditorNode::EditorNode() {
}
// Define a minimum window size to prevent UI elements from overlapping or being cut off
- OS::get_singleton()->set_min_window_size(Size2(1024, 600) * EDSCALE);
+ DisplayServer::get_singleton()->window_set_min_size(Size2(1024, 600) * EDSCALE);
ResourceLoader::set_abort_on_missing_resources(false);
FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"));
@@ -5679,16 +5608,26 @@ EditorNode::EditorNode() {
import_texture.instance();
ResourceFormatImporter::get_singleton()->add_importer(import_texture);
- Ref<ResourceImporterLayeredTexture> import_3d;
- import_3d.instance();
- import_3d->set_3d(true);
- ResourceFormatImporter::get_singleton()->add_importer(import_3d);
+ Ref<ResourceImporterLayeredTexture> import_cubemap;
+ import_cubemap.instance();
+ import_cubemap->set_mode(ResourceImporterLayeredTexture::MODE_CUBEMAP);
+ ResourceFormatImporter::get_singleton()->add_importer(import_cubemap);
Ref<ResourceImporterLayeredTexture> import_array;
import_array.instance();
- import_array->set_3d(false);
+ import_array->set_mode(ResourceImporterLayeredTexture::MODE_2D_ARRAY);
ResourceFormatImporter::get_singleton()->add_importer(import_array);
+ Ref<ResourceImporterLayeredTexture> import_cubemap_array;
+ import_cubemap_array.instance();
+ import_cubemap_array->set_mode(ResourceImporterLayeredTexture::MODE_CUBEMAP_ARRAY);
+ ResourceFormatImporter::get_singleton()->add_importer(import_cubemap_array);
+
+ Ref<ResourceImporterLayeredTexture> import_3d;
+ import_3d.instance();
+ import_3d->set_mode(ResourceImporterLayeredTexture::MODE_3D);
+ ResourceFormatImporter::get_singleton()->add_importer(import_3d);
+
Ref<ResourceImporterImage> import_image;
import_image.instance();
ResourceFormatImporter::get_singleton()->add_importer(import_image);
@@ -5713,6 +5652,10 @@ EditorNode::EditorNode() {
import_obj.instance();
ResourceFormatImporter::get_singleton()->add_importer(import_obj);
+ Ref<ResourceImporterShaderFile> import_shader_file;
+ import_shader_file.instance();
+ ResourceFormatImporter::get_singleton()->add_importer(import_shader_file);
+
Ref<ResourceImporterScene> import_scene;
import_scene.instance();
ResourceFormatImporter::get_singleton()->add_importer(import_scene);
@@ -5798,13 +5741,13 @@ EditorNode::EditorNode() {
EDITOR_DEF_RST("interface/scene_tabs/show_thumbnail_on_hover", true);
EDITOR_DEF_RST("interface/inspector/capitalize_properties", true);
EDITOR_DEF_RST("interface/inspector/default_float_step", 0.001);
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::REAL, "interface/inspector/default_float_step", PROPERTY_HINT_EXP_RANGE, "0,1,0"));
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::FLOAT, "interface/inspector/default_float_step", PROPERTY_HINT_RANGE, "0,1,0"));
EDITOR_DEF_RST("interface/inspector/disable_folding", false);
EDITOR_DEF_RST("interface/inspector/auto_unfold_foreign_scenes", true);
EDITOR_DEF("interface/inspector/horizontal_vector2_editing", false);
EDITOR_DEF("interface/inspector/horizontal_vector_types_editing", true);
EDITOR_DEF("interface/inspector/open_resources_in_current_inspector", true);
- EDITOR_DEF("interface/inspector/resources_to_open_in_new_inspector", "SpatialMaterial,Script,MeshLibrary,TileSet");
+ EDITOR_DEF("interface/inspector/resources_to_open_in_new_inspector", "StandardMaterial3D,ORMMaterial3D,Script,MeshLibrary,TileSet");
EDITOR_DEF("interface/inspector/default_color_picker_mode", 0);
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "interface/inspector/default_color_picker_mode", PROPERTY_HINT_ENUM, "RGB,HSV,RAW", PROPERTY_USAGE_DEFAULT));
EDITOR_DEF("run/auto_save/save_before_running", true);
@@ -5819,7 +5762,7 @@ EditorNode::EditorNode() {
theme_base->set_theme(theme);
gui_base->set_theme(theme);
- gui_base->add_style_override("panel", gui_base->get_stylebox("Background", "EditorStyles"));
+ gui_base->add_theme_style_override("panel", gui_base->get_theme_stylebox("Background", "EditorStyles"));
resource_preview = memnew(EditorResourcePreview);
add_child(resource_preview);
@@ -5834,7 +5777,7 @@ EditorNode::EditorNode() {
main_vbox = memnew(VBoxContainer);
gui_base->add_child(main_vbox);
main_vbox->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 8);
- main_vbox->add_constant_override("separation", 8 * EDSCALE);
+ main_vbox->add_theme_constant_override("separation", 8 * EDSCALE);
menu_hb = memnew(HBoxContainer);
main_vbox->add_child(menu_hb);
@@ -5900,8 +5843,8 @@ EditorNode::EditorNode() {
hsplits.push_back(right_hsplit);
for (int i = 0; i < vsplits.size(); i++) {
- vsplits[i]->connect("dragged", this, "_dock_split_dragged");
- hsplits[i]->connect("dragged", this, "_dock_split_dragged");
+ vsplits[i]->connect("dragged", callable_mp(this, &EditorNode::_dock_split_dragged));
+ hsplits[i]->connect("dragged", callable_mp(this, &EditorNode::_dock_split_dragged));
}
dock_select_popup = memnew(PopupPanel);
@@ -5910,10 +5853,11 @@ EditorNode::EditorNode() {
dock_select_popup->add_child(dock_vb);
HBoxContainer *dock_hb = memnew(HBoxContainer);
- dock_tab_move_left = memnew(ToolButton);
+ dock_tab_move_left = memnew(Button);
+ dock_tab_move_left->set_flat(true);
dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons"));
dock_tab_move_left->set_focus_mode(Control::FOCUS_NONE);
- dock_tab_move_left->connect("pressed", this, "_dock_move_left");
+ dock_tab_move_left->connect("pressed", callable_mp(this, &EditorNode::_dock_move_left));
dock_hb->add_child(dock_tab_move_left);
Label *dock_label = memnew(Label);
@@ -5922,22 +5866,31 @@ EditorNode::EditorNode() {
dock_label->set_align(Label::ALIGN_CENTER);
dock_hb->add_child(dock_label);
- dock_tab_move_right = memnew(ToolButton);
+ dock_tab_move_right = memnew(Button);
+ dock_tab_move_right->set_flat(true);
dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons"));
dock_tab_move_right->set_focus_mode(Control::FOCUS_NONE);
- dock_tab_move_right->connect("pressed", this, "_dock_move_right");
+ dock_tab_move_right->connect("pressed", callable_mp(this, &EditorNode::_dock_move_right));
dock_hb->add_child(dock_tab_move_right);
dock_vb->add_child(dock_hb);
dock_select = memnew(Control);
dock_select->set_custom_minimum_size(Size2(128, 64) * EDSCALE);
- dock_select->connect("gui_input", this, "_dock_select_input");
- dock_select->connect("draw", this, "_dock_select_draw");
- dock_select->connect("mouse_exited", this, "_dock_popup_exit");
+ dock_select->connect("gui_input", callable_mp(this, &EditorNode::_dock_select_input));
+ dock_select->connect("draw", callable_mp(this, &EditorNode::_dock_select_draw));
+ dock_select->connect("mouse_exited", callable_mp(this, &EditorNode::_dock_popup_exit));
dock_select->set_v_size_flags(Control::SIZE_EXPAND_FILL);
dock_vb->add_child(dock_select);
+ dock_float = memnew(Button);
+ dock_float->set_text(TTR("Make Floating"));
+ dock_float->set_focus_mode(Control::FOCUS_NONE);
+ dock_float->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
+ dock_float->connect("pressed", callable_mp(this, &EditorNode::_dock_make_float));
+
+ dock_vb->add_child(dock_float);
+
dock_select_popup->set_as_minsize();
dock_select_rect_over = -1;
dock_popup_selected = -1;
@@ -5945,11 +5898,11 @@ EditorNode::EditorNode() {
dock_slot[i]->set_custom_minimum_size(Size2(170, 0) * EDSCALE);
dock_slot[i]->set_v_size_flags(Control::SIZE_EXPAND_FILL);
dock_slot[i]->set_popup(dock_select_popup);
- dock_slot[i]->connect("pre_popup_pressed", this, "_dock_pre_popup", varray(i));
+ dock_slot[i]->connect("pre_popup_pressed", callable_mp(this, &EditorNode::_dock_pre_popup), varray(i));
dock_slot[i]->set_tab_align(TabContainer::ALIGN_LEFT);
dock_slot[i]->set_drag_to_rearrange_enabled(true);
dock_slot[i]->set_tabs_rearrange_group(1);
- dock_slot[i]->connect("tab_changed", this, "_dock_tab_changed");
+ dock_slot[i]->connect("tab_changed", callable_mp(this, &EditorNode::_dock_tab_changed));
dock_slot[i]->set_use_hidden_tabs_for_min_size(true);
}
@@ -5957,7 +5910,7 @@ EditorNode::EditorNode() {
add_child(dock_drag_timer);
dock_drag_timer->set_wait_time(0.5);
dock_drag_timer->set_one_shot(true);
- dock_drag_timer->connect("timeout", this, "_save_docks");
+ dock_drag_timer->connect("timeout", callable_mp(this, &EditorNode::_save_docks));
top_split = memnew(VSplitContainer);
center_split->add_child(top_split);
@@ -5967,7 +5920,7 @@ EditorNode::EditorNode() {
VBoxContainer *srt = memnew(VBoxContainer);
srt->set_v_size_flags(Control::SIZE_EXPAND_FILL);
top_split->add_child(srt);
- srt->add_constant_override("separation", 0);
+ srt->add_theme_constant_override("separation", 0);
tab_preview_panel = memnew(Panel);
tab_preview_panel->set_size(Size2(100, 100) * EDSCALE);
@@ -5982,70 +5935,70 @@ EditorNode::EditorNode() {
tab_preview_panel->add_child(tab_preview);
scene_tabs = memnew(Tabs);
- scene_tabs->add_style_override("tab_fg", gui_base->get_stylebox("SceneTabFG", "EditorStyles"));
- scene_tabs->add_style_override("tab_bg", gui_base->get_stylebox("SceneTabBG", "EditorStyles"));
+ scene_tabs->add_theme_style_override("tab_fg", gui_base->get_theme_stylebox("SceneTabFG", "EditorStyles"));
+ scene_tabs->add_theme_style_override("tab_bg", gui_base->get_theme_stylebox("SceneTabBG", "EditorStyles"));
scene_tabs->set_select_with_rmb(true);
scene_tabs->add_tab("unsaved");
scene_tabs->set_tab_align(Tabs::ALIGN_LEFT);
scene_tabs->set_tab_close_display_policy((bool(EDITOR_DEF("interface/scene_tabs/always_show_close_button", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY));
scene_tabs->set_min_width(int(EDITOR_DEF("interface/scene_tabs/minimum_width", 50)) * EDSCALE);
scene_tabs->set_drag_to_rearrange_enabled(true);
- scene_tabs->connect("tab_changed", this, "_scene_tab_changed");
- scene_tabs->connect("right_button_pressed", this, "_scene_tab_script_edited");
- scene_tabs->connect("tab_close", this, "_scene_tab_closed", varray(SCENE_TAB_CLOSE));
- scene_tabs->connect("tab_hover", this, "_scene_tab_hover");
- scene_tabs->connect("mouse_exited", this, "_scene_tab_exit");
- scene_tabs->connect("gui_input", this, "_scene_tab_input");
- scene_tabs->connect("reposition_active_tab_request", this, "_reposition_active_tab");
- scene_tabs->connect("resized", this, "_update_scene_tabs");
+ scene_tabs->connect("tab_changed", callable_mp(this, &EditorNode::_scene_tab_changed));
+ scene_tabs->connect("right_button_pressed", callable_mp(this, &EditorNode::_scene_tab_script_edited));
+ scene_tabs->connect("tab_close", callable_mp(this, &EditorNode::_scene_tab_closed), varray(SCENE_TAB_CLOSE));
+ scene_tabs->connect("tab_hover", callable_mp(this, &EditorNode::_scene_tab_hover));
+ scene_tabs->connect("mouse_exited", callable_mp(this, &EditorNode::_scene_tab_exit));
+ scene_tabs->connect("gui_input", callable_mp(this, &EditorNode::_scene_tab_input));
+ scene_tabs->connect("reposition_active_tab_request", callable_mp(this, &EditorNode::_reposition_active_tab));
+ scene_tabs->connect("resized", callable_mp(this, &EditorNode::_update_scene_tabs));
tabbar_container = memnew(HBoxContainer);
scene_tabs->set_h_size_flags(Control::SIZE_EXPAND_FILL);
scene_tabs_context_menu = memnew(PopupMenu);
tabbar_container->add_child(scene_tabs_context_menu);
- scene_tabs_context_menu->connect("id_pressed", this, "_menu_option");
- scene_tabs_context_menu->set_hide_on_window_lose_focus(true);
+ scene_tabs_context_menu->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
srt->add_child(tabbar_container);
tabbar_container->add_child(scene_tabs);
- distraction_free = memnew(ToolButton);
+ distraction_free = memnew(Button);
+ distraction_free->set_flat(true);
#ifdef OSX_ENABLED
distraction_free->set_shortcut(ED_SHORTCUT("editor/distraction_free_mode", TTR("Distraction Free Mode"), KEY_MASK_CMD | KEY_MASK_CTRL | KEY_D));
#else
distraction_free->set_shortcut(ED_SHORTCUT("editor/distraction_free_mode", TTR("Distraction Free Mode"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F11));
#endif
distraction_free->set_tooltip(TTR("Toggle distraction-free mode."));
- distraction_free->connect("pressed", this, "_toggle_distraction_free_mode");
- distraction_free->set_icon(gui_base->get_icon("DistractionFree", "EditorIcons"));
+ distraction_free->connect("pressed", callable_mp(this, &EditorNode::_toggle_distraction_free_mode));
+ distraction_free->set_icon(gui_base->get_theme_icon("DistractionFree", "EditorIcons"));
distraction_free->set_toggle_mode(true);
- scene_tab_add = memnew(ToolButton);
+ scene_tab_add = memnew(Button);
+ scene_tab_add->set_flat(true);
tabbar_container->add_child(scene_tab_add);
tabbar_container->add_child(distraction_free);
scene_tab_add->set_tooltip(TTR("Add a new scene."));
- scene_tab_add->set_icon(gui_base->get_icon("Add", "EditorIcons"));
- scene_tab_add->add_color_override("icon_color_normal", Color(0.6f, 0.6f, 0.6f, 0.8f));
- scene_tab_add->connect("pressed", this, "_menu_option", make_binds(FILE_NEW_SCENE));
+ scene_tab_add->set_icon(gui_base->get_theme_icon("Add", "EditorIcons"));
+ scene_tab_add->add_theme_color_override("icon_color_normal", Color(0.6f, 0.6f, 0.6f, 0.8f));
+ scene_tab_add->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(FILE_NEW_SCENE));
scene_root_parent = memnew(PanelContainer);
scene_root_parent->set_custom_minimum_size(Size2(0, 80) * EDSCALE);
- scene_root_parent->add_style_override("panel", gui_base->get_stylebox("Content", "EditorStyles"));
+ scene_root_parent->add_theme_style_override("panel", gui_base->get_theme_stylebox("Content", "EditorStyles"));
scene_root_parent->set_draw_behind_parent(true);
srt->add_child(scene_root_parent);
scene_root_parent->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- scene_root = memnew(Viewport);
+ scene_root = memnew(SubViewport);
//scene_root->set_usage(Viewport::USAGE_2D); canvas BG mode prevents usage of this as 2D
- scene_root->set_disable_3d(true);
- VisualServer::get_singleton()->viewport_set_hide_scenario(scene_root->get_viewport_rid(), true);
+ RenderingServer::get_singleton()->viewport_set_hide_scenario(scene_root->get_viewport_rid(), true);
scene_root->set_disable_input(true);
scene_root->set_as_audio_listener_2d(true);
viewport = memnew(VBoxContainer);
viewport->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- viewport->add_constant_override("separation", 0);
+ viewport->add_theme_constant_override("separation", 0);
scene_root_parent->add_child(viewport);
HBoxContainer *left_menu_hb = memnew(HBoxContainer);
@@ -6055,21 +6008,22 @@ EditorNode::EditorNode() {
file_menu->set_flat(false);
file_menu->set_switch_on_hover(true);
file_menu->set_text(TTR("Scene"));
- file_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
+ file_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(file_menu);
- prev_scene = memnew(ToolButton);
- prev_scene->set_icon(gui_base->get_icon("PrevScene", "EditorIcons"));
+ prev_scene = memnew(Button);
+ prev_scene->set_flat(true);
+ prev_scene->set_icon(gui_base->get_theme_icon("PrevScene", "EditorIcons"));
prev_scene->set_tooltip(TTR("Go to previously opened scene."));
prev_scene->set_disabled(true);
- prev_scene->connect("pressed", this, "_menu_option", make_binds(FILE_OPEN_PREV));
+ prev_scene->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(FILE_OPEN_PREV));
gui_base->add_child(prev_scene);
prev_scene->set_position(Point2(3, 24));
prev_scene->hide();
accept = memnew(AcceptDialog);
gui_base->add_child(accept);
- accept->connect("confirmed", this, "_menu_confirm_current");
+ accept->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current));
project_export = memnew(ProjectExportDialog);
gui_base->add_child(project_export);
@@ -6096,22 +6050,22 @@ EditorNode::EditorNode() {
gui_base->add_child(feature_profile_manager);
about = memnew(EditorAbout);
gui_base->add_child(about);
- feature_profile_manager->connect("current_feature_profile_changed", this, "_feature_profile_changed");
+ feature_profile_manager->connect("current_feature_profile_changed", callable_mp(this, &EditorNode::_feature_profile_changed));
warning = memnew(AcceptDialog);
warning->add_button(TTR("Copy Text"), true, "copy");
gui_base->add_child(warning);
- warning->connect("custom_action", this, "_copy_warning");
+ warning->connect("custom_action", callable_mp(this, &EditorNode::_copy_warning));
ED_SHORTCUT("editor/next_tab", TTR("Next tab"), KEY_MASK_CMD + KEY_TAB);
ED_SHORTCUT("editor/prev_tab", TTR("Previous tab"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_TAB);
- ED_SHORTCUT("editor/filter_files", TTR("Filter Files..."), KEY_MASK_ALT + KEY_MASK_CMD + KEY_P);
+ ED_SHORTCUT("editor/filter_files", TTR("Filter Files..."), KEY_MASK_CMD + KEY_MASK_ALT + KEY_P);
PopupMenu *p;
file_menu->set_tooltip(TTR("Operations with scene files."));
p = file_menu->get_popup();
- p->set_hide_on_window_lose_focus(true);
+
p->add_shortcut(ED_SHORTCUT("editor/new_scene", TTR("New Scene")), FILE_NEW_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/new_inherited_scene", TTR("New Inherited Scene...")), FILE_NEW_INHERITED_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/open_scene", TTR("Open Scene..."), KEY_MASK_CMD + KEY_O), FILE_OPEN_SCENE);
@@ -6120,13 +6074,14 @@ EditorNode::EditorNode() {
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/save_scene", TTR("Save Scene"), KEY_MASK_CMD + KEY_S), FILE_SAVE_SCENE);
- p->add_shortcut(ED_SHORTCUT("editor/save_scene_as", TTR("Save Scene As..."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S), FILE_SAVE_AS_SCENE);
- p->add_shortcut(ED_SHORTCUT("editor/save_all_scenes", TTR("Save All Scenes"), KEY_MASK_ALT + KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S), FILE_SAVE_ALL_SCENES);
+ p->add_shortcut(ED_SHORTCUT("editor/save_scene_as", TTR("Save Scene As..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_S), FILE_SAVE_AS_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/save_all_scenes", TTR("Save All Scenes"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_S), FILE_SAVE_ALL_SCENES);
p->add_separator();
+
p->add_shortcut(ED_SHORTCUT("editor/quick_open", TTR("Quick Open..."), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN);
- p->add_shortcut(ED_SHORTCUT("editor/quick_open_scene", TTR("Quick Open Scene..."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCENE);
- p->add_shortcut(ED_SHORTCUT("editor/quick_open_script", TTR("Quick Open Script..."), KEY_MASK_ALT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCRIPT);
+ p->add_shortcut(ED_SHORTCUT("editor/quick_open_scene", TTR("Quick Open Scene..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_O), FILE_QUICK_OPEN_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/quick_open_script", TTR("Quick Open Script..."), KEY_MASK_CMD + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN_SCRIPT);
p->add_separator();
PopupMenu *pm_export = memnew(PopupMenu);
@@ -6135,20 +6090,20 @@ EditorNode::EditorNode() {
p->add_submenu_item(TTR("Convert To..."), "Export");
pm_export->add_shortcut(ED_SHORTCUT("editor/convert_to_MeshLibrary", TTR("MeshLibrary...")), FILE_EXPORT_MESH_LIBRARY);
pm_export->add_shortcut(ED_SHORTCUT("editor/convert_to_TileSet", TTR("TileSet...")), FILE_EXPORT_TILESET);
- pm_export->connect("id_pressed", this, "_menu_option");
+ pm_export->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/undo", TTR("Undo"), KEY_MASK_CMD + KEY_Z), EDIT_UNDO, true);
- p->add_shortcut(ED_SHORTCUT("editor/redo", TTR("Redo"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_Z), EDIT_REDO, true);
+ p->add_shortcut(ED_SHORTCUT("editor/redo", TTR("Redo"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Z), EDIT_REDO, true);
p->add_separator();
- p->add_shortcut(ED_SHORTCUT("editor/revert_scene", TTR("Revert Scene")), EDIT_REVERT);
- p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_W), FILE_CLOSE);
+ p->add_shortcut(ED_SHORTCUT("editor/reload_saved_scene", TTR("Reload Saved Scene")), EDIT_RELOAD_SAVED_SCENE);
+ p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_W), FILE_CLOSE);
recent_scenes = memnew(PopupMenu);
recent_scenes->set_name("RecentScenes");
p->add_child(recent_scenes);
- recent_scenes->connect("id_pressed", this, "_open_recent_scene");
+ recent_scenes->connect("id_pressed", callable_mp(this, &EditorNode::_open_recent_scene));
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/file_quit", TTR("Quit"), KEY_MASK_CMD + KEY_Q), FILE_QUIT, true);
@@ -6158,17 +6113,17 @@ EditorNode::EditorNode() {
project_menu->set_switch_on_hover(true);
project_menu->set_tooltip(TTR("Miscellaneous project or scene-wide tools."));
project_menu->set_text(TTR("Project"));
- project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
+ project_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(project_menu);
p = project_menu->get_popup();
- p->set_hide_on_window_lose_focus(true);
+
p->add_shortcut(ED_SHORTCUT("editor/project_settings", TTR("Project Settings...")), RUN_SETTINGS);
- p->connect("id_pressed", this, "_menu_option");
+ p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
vcs_actions_menu = VersionControlEditorPlugin::get_singleton()->get_version_control_actions_panel();
vcs_actions_menu->set_name("Version Control");
- vcs_actions_menu->connect("index_pressed", this, "_version_control_menu_option");
+ vcs_actions_menu->connect("index_pressed", callable_mp(this, &EditorNode::_version_control_menu_option));
p->add_separator();
p->add_child(vcs_actions_menu);
p->add_submenu_item(TTR("Version Control"), "Version Control");
@@ -6181,12 +6136,12 @@ EditorNode::EditorNode() {
p->add_item(TTR("Open Project Data Folder"), RUN_PROJECT_DATA_FOLDER);
plugin_config_dialog = memnew(PluginConfigDialog);
- plugin_config_dialog->connect("plugin_ready", this, "_on_plugin_ready");
+ plugin_config_dialog->connect("plugin_ready", callable_mp(this, &EditorNode::_on_plugin_ready));
gui_base->add_child(plugin_config_dialog);
tool_menu = memnew(PopupMenu);
tool_menu->set_name("Tools");
- tool_menu->connect("index_pressed", this, "_tool_menu_option");
+ tool_menu->connect("index_pressed", callable_mp(this, &EditorNode::_tool_menu_option));
p->add_child(tool_menu);
p->add_submenu_item(TTR("Tools"), "Tools");
tool_menu->add_item(TTR("Orphan Resource Explorer..."), TOOLS_ORPHAN_RESOURCES);
@@ -6195,7 +6150,7 @@ EditorNode::EditorNode() {
#ifdef OSX_ENABLED
p->add_shortcut(ED_SHORTCUT("editor/quit_to_project_list", TTR("Quit to Project List"), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q), RUN_PROJECT_MANAGER, true);
#else
- p->add_shortcut(ED_SHORTCUT("editor/quit_to_project_list", TTR("Quit to Project List"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_Q), RUN_PROJECT_MANAGER, true);
+ p->add_shortcut(ED_SHORTCUT("editor/quit_to_project_list", TTR("Quit to Project List"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Q), RUN_PROJECT_MANAGER, true);
#endif
menu_hb->add_spacer();
@@ -6203,53 +6158,35 @@ EditorNode::EditorNode() {
main_editor_button_vb = memnew(HBoxContainer);
menu_hb->add_child(main_editor_button_vb);
+ // Options are added and handled by DebuggerEditorPlugin
debug_menu = memnew(MenuButton);
debug_menu->set_flat(false);
debug_menu->set_switch_on_hover(true);
debug_menu->set_text(TTR("Debug"));
- debug_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
+ debug_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(debug_menu);
- p = debug_menu->get_popup();
- p->set_hide_on_window_lose_focus(true);
- p->set_hide_on_checkable_item_selection(false);
- p->add_check_shortcut(ED_SHORTCUT("editor/deploy_with_remote_debug", TTR("Deploy with Remote Debug")), RUN_DEPLOY_REMOTE_DEBUG);
- p->set_item_tooltip(p->get_item_count() - 1, TTR("When exporting or deploying, the resulting executable will attempt to connect to the IP of this computer in order to be debugged."));
- p->add_check_shortcut(ED_SHORTCUT("editor/small_deploy_with_network_fs", TTR("Small Deploy with Network FS")), RUN_FILE_SERVER);
- p->set_item_tooltip(p->get_item_count() - 1, TTR("When this option is enabled, export or deploy will produce a minimal executable.\nThe filesystem will be provided from the project by the editor over the network.\nOn Android, deploy will use the USB cable for faster performance. This option speeds up testing for games with a large footprint."));
- p->add_separator();
- p->add_check_shortcut(ED_SHORTCUT("editor/visible_collision_shapes", TTR("Visible Collision Shapes")), RUN_DEBUG_COLLISONS);
- p->set_item_tooltip(p->get_item_count() - 1, TTR("Collision shapes and raycast nodes (for 2D and 3D) will be visible on the running game if this option is turned on."));
- p->add_check_shortcut(ED_SHORTCUT("editor/visible_navigation", TTR("Visible Navigation")), RUN_DEBUG_NAVIGATION);
- p->set_item_tooltip(p->get_item_count() - 1, TTR("Navigation meshes and polygons will be visible on the running game if this option is turned on."));
- p->add_separator();
- //those are now on by default, since they are harmless
- p->add_check_shortcut(ED_SHORTCUT("editor/sync_scene_changes", TTR("Sync Scene Changes")), RUN_LIVE_DEBUG);
- p->set_item_tooltip(p->get_item_count() - 1, TTR("When this option is turned on, any changes made to the scene in the editor will be replicated in the running game.\nWhen used remotely on a device, this is more efficient with network filesystem."));
- p->set_item_checked(p->get_item_count() - 1, true);
- p->add_check_shortcut(ED_SHORTCUT("editor/sync_script_changes", TTR("Sync Script Changes")), RUN_RELOAD_SCRIPTS);
- p->set_item_tooltip(p->get_item_count() - 1, TTR("When this option is turned on, any script that is saved will be reloaded on the running game.\nWhen used remotely on a device, this is more efficient with network filesystem."));
- p->set_item_checked(p->get_item_count() - 1, true);
- p->connect("id_pressed", this, "_menu_option");
-
menu_hb->add_spacer();
settings_menu = memnew(MenuButton);
settings_menu->set_flat(false);
settings_menu->set_switch_on_hover(true);
settings_menu->set_text(TTR("Editor"));
- settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
+ settings_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(settings_menu);
p = settings_menu->get_popup();
- p->set_hide_on_window_lose_focus(true);
+#ifdef OSX_ENABLED
+ p->add_shortcut(ED_SHORTCUT("editor/editor_settings", TTR("Editor Settings..."), KEY_MASK_CMD + KEY_COMMA), SETTINGS_PREFERENCES);
+#else
p->add_shortcut(ED_SHORTCUT("editor/editor_settings", TTR("Editor Settings...")), SETTINGS_PREFERENCES);
+#endif
p->add_separator();
editor_layouts = memnew(PopupMenu);
editor_layouts->set_name("Layouts");
p->add_child(editor_layouts);
- editor_layouts->connect("id_pressed", this, "_layout_menu_option");
+ editor_layouts->connect("id_pressed", callable_mp(this, &EditorNode::_layout_menu_option));
p->add_submenu_item(TTR("Editor Layout"), "Layouts");
p->add_separator();
#ifdef OSX_ENABLED
@@ -6263,7 +6200,9 @@ EditorNode::EditorNode() {
#else
p->add_shortcut(ED_SHORTCUT("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_SHIFT | KEY_F11), SETTINGS_TOGGLE_FULLSCREEN);
#endif
-#ifdef WINDOWS_ENABLED
+#if defined(WINDOWS_ENABLED) && defined(WINDOWS_SUBSYSTEM_CONSOLE)
+ // The console can only be toggled if the application was built for the console subsystem,
+ // not the GUI subsystem.
p->add_item(TTR("Toggle System Console"), SETTINGS_TOGGLE_CONSOLE);
#endif
p->add_separator();
@@ -6286,30 +6225,31 @@ EditorNode::EditorNode() {
help_menu->set_flat(false);
help_menu->set_switch_on_hover(true);
help_menu->set_text(TTR("Help"));
- help_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
+ help_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(help_menu);
p = help_menu->get_popup();
- p->set_hide_on_window_lose_focus(true);
- p->connect("id_pressed", this, "_menu_option");
- p->add_icon_shortcut(gui_base->get_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search"), KEY_MASK_SHIFT | KEY_F1), HELP_SEARCH);
+ p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ p->add_icon_shortcut(gui_base->get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search"), KEY_MASK_SHIFT | KEY_F1), HELP_SEARCH);
p->add_separator();
- p->add_icon_shortcut(gui_base->get_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/online_docs", TTR("Online Docs")), HELP_DOCS);
- p->add_icon_shortcut(gui_base->get_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/q&a", TTR("Q&A")), HELP_QA);
- p->add_icon_shortcut(gui_base->get_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/issue_tracker", TTR("Issue Tracker")), HELP_ISSUES);
- p->add_icon_shortcut(gui_base->get_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/community", TTR("Community")), HELP_COMMUNITY);
+ p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/online_docs", TTR("Online Docs")), HELP_DOCS);
+ p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/q&a", TTR("Q&A")), HELP_QA);
+ p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/report_a_bug", TTR("Report a Bug")), HELP_REPORT_A_BUG);
+ p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/send_docs_feedback", TTR("Send Docs Feedback")), HELP_SEND_DOCS_FEEDBACK);
+ p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/community", TTR("Community")), HELP_COMMUNITY);
p->add_separator();
- p->add_icon_shortcut(gui_base->get_icon("Godot", "EditorIcons"), ED_SHORTCUT("editor/about", TTR("About")), HELP_ABOUT);
+ p->add_icon_shortcut(gui_base->get_theme_icon("Godot", "EditorIcons"), ED_SHORTCUT("editor/about", TTR("About")), HELP_ABOUT);
HBoxContainer *play_hb = memnew(HBoxContainer);
menu_hb->add_child(play_hb);
- play_button = memnew(ToolButton);
+ play_button = memnew(Button);
+ play_button->set_flat(true);
play_hb->add_child(play_button);
play_button->set_toggle_mode(true);
- play_button->set_icon(gui_base->get_icon("MainPlay", "EditorIcons"));
+ play_button->set_icon(gui_base->get_theme_icon("MainPlay", "EditorIcons"));
play_button->set_focus_mode(Control::FOCUS_NONE);
- play_button->connect("pressed", this, "_menu_option", make_binds(RUN_PLAY));
+ play_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY));
play_button->set_tooltip(TTR("Play the project."));
#ifdef OSX_ENABLED
play_button->set_shortcut(ED_SHORTCUT("editor/play", TTR("Play"), KEY_MASK_CMD | KEY_B));
@@ -6317,9 +6257,10 @@ EditorNode::EditorNode() {
play_button->set_shortcut(ED_SHORTCUT("editor/play", TTR("Play"), KEY_F5));
#endif
- pause_button = memnew(ToolButton);
+ pause_button = memnew(Button);
+ pause_button->set_flat(true);
pause_button->set_toggle_mode(true);
- pause_button->set_icon(gui_base->get_icon("Pause", "EditorIcons"));
+ pause_button->set_icon(gui_base->get_theme_icon("Pause", "EditorIcons"));
pause_button->set_focus_mode(Control::FOCUS_NONE);
pause_button->set_tooltip(TTR("Pause the scene execution for debugging."));
pause_button->set_disabled(true);
@@ -6330,11 +6271,12 @@ EditorNode::EditorNode() {
pause_button->set_shortcut(ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), KEY_F7));
#endif
- stop_button = memnew(ToolButton);
+ stop_button = memnew(Button);
+ stop_button->set_flat(true);
play_hb->add_child(stop_button);
stop_button->set_focus_mode(Control::FOCUS_NONE);
- stop_button->set_icon(gui_base->get_icon("Stop", "EditorIcons"));
- stop_button->connect("pressed", this, "_menu_option", make_binds(RUN_STOP));
+ stop_button->set_icon(gui_base->get_theme_icon("Stop", "EditorIcons"));
+ stop_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_STOP));
stop_button->set_tooltip(TTR("Stop the scene."));
stop_button->set_disabled(true);
#ifdef OSX_ENABLED
@@ -6345,14 +6287,15 @@ EditorNode::EditorNode() {
run_native = memnew(EditorRunNative);
play_hb->add_child(run_native);
- run_native->connect("native_run", this, "_menu_option", varray(RUN_PLAY_NATIVE));
+ run_native->connect("native_run", callable_mp(this, &EditorNode::_run_native));
- play_scene_button = memnew(ToolButton);
+ play_scene_button = memnew(Button);
+ play_scene_button->set_flat(true);
play_hb->add_child(play_scene_button);
play_scene_button->set_toggle_mode(true);
play_scene_button->set_focus_mode(Control::FOCUS_NONE);
- play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons"));
- play_scene_button->connect("pressed", this, "_menu_option", make_binds(RUN_PLAY_SCENE));
+ play_scene_button->set_icon(gui_base->get_theme_icon("PlayScene", "EditorIcons"));
+ play_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY_SCENE));
play_scene_button->set_tooltip(TTR("Play the edited scene."));
#ifdef OSX_ENABLED
play_scene_button->set_shortcut(ED_SHORTCUT("editor/play_scene", TTR("Play Scene"), KEY_MASK_CMD | KEY_R));
@@ -6360,12 +6303,13 @@ EditorNode::EditorNode() {
play_scene_button->set_shortcut(ED_SHORTCUT("editor/play_scene", TTR("Play Scene"), KEY_F6));
#endif
- play_custom_scene_button = memnew(ToolButton);
+ play_custom_scene_button = memnew(Button);
+ play_custom_scene_button->set_flat(true);
play_hb->add_child(play_custom_scene_button);
play_custom_scene_button->set_toggle_mode(true);
play_custom_scene_button->set_focus_mode(Control::FOCUS_NONE);
- play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons"));
- play_custom_scene_button->connect("pressed", this, "_menu_option", make_binds(RUN_PLAY_CUSTOM_SCENE));
+ play_custom_scene_button->set_icon(gui_base->get_theme_icon("PlayCustom", "EditorIcons"));
+ play_custom_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY_CUSTOM_SCENE));
play_custom_scene_button->set_tooltip(TTR("Play custom scene"));
#ifdef OSX_ENABLED
play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R));
@@ -6380,10 +6324,16 @@ EditorNode::EditorNode() {
video_driver = memnew(OptionButton);
video_driver->set_flat(true);
video_driver->set_focus_mode(Control::FOCUS_NONE);
- video_driver->connect("item_selected", this, "_video_driver_selected");
- video_driver->add_font_override("font", gui_base->get_font("bold", "EditorFonts"));
+ video_driver->connect("item_selected", callable_mp(this, &EditorNode::_video_driver_selected));
+ video_driver->add_theme_font_override("font", gui_base->get_theme_font("bold", "EditorFonts"));
+ // TODO re-enable when GLES2 is ported
+ video_driver->set_disabled(true);
right_menu_hb->add_child(video_driver);
+#ifndef _MSC_VER
+#warning needs to be reimplemented
+#endif
+#if 0
String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string;
String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
video_driver_current = 0;
@@ -6399,11 +6349,11 @@ EditorNode::EditorNode() {
}
_update_video_driver_color();
-
+#endif
video_restart_dialog = memnew(ConfirmationDialog);
video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor."));
video_restart_dialog->get_ok()->set_text(TTR("Save & Restart"));
- video_restart_dialog->connect("confirmed", this, "_menu_option", varray(SET_VIDEO_DRIVER_SAVE_AND_RESTART));
+ video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SET_VIDEO_DRIVER_SAVE_AND_RESTART));
gui_base->add_child(video_restart_dialog);
progress_hb = memnew(BackgroundProgress);
@@ -6412,13 +6362,13 @@ EditorNode::EditorNode() {
gui_base->add_child(layout_dialog);
layout_dialog->set_hide_on_ok(false);
layout_dialog->set_size(Size2(225, 270) * EDSCALE);
- layout_dialog->connect("name_confirmed", this, "_dialog_action");
+ layout_dialog->connect("name_confirmed", callable_mp(this, &EditorNode::_dialog_action));
update_spinner = memnew(MenuButton);
update_spinner->set_tooltip(TTR("Spins when the editor window redraws."));
right_menu_hb->add_child(update_spinner);
- update_spinner->set_icon(gui_base->get_icon("Progress1", "EditorIcons"));
- update_spinner->get_popup()->connect("id_pressed", this, "_menu_option");
+ update_spinner->set_icon(gui_base->get_theme_icon("Progress1", "EditorIcons"));
+ update_spinner->get_popup()->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
p = update_spinner->get_popup();
p->add_radio_check_item(TTR("Update Continuously"), SETTINGS_UPDATE_CONTINUOUSLY);
p->add_radio_check_item(TTR("Update When Changed"), SETTINGS_UPDATE_WHEN_CHANGED);
@@ -6434,9 +6384,9 @@ EditorNode::EditorNode() {
node_dock = memnew(NodeDock);
filesystem_dock = memnew(FileSystemDock(this));
- filesystem_dock->connect("inherit", this, "_inherit_request");
- filesystem_dock->connect("instance", this, "_instance_request");
- filesystem_dock->connect("display_mode_changed", this, "_save_docks");
+ filesystem_dock->connect("inherit", callable_mp(this, &EditorNode::_inherit_request));
+ filesystem_dock->connect("instance", callable_mp(this, &EditorNode::_instance_request));
+ filesystem_dock->connect("display_mode_changed", callable_mp(this, &EditorNode::_save_docks));
// Scene: Top left
dock_slot[DOCK_SLOT_LEFT_UR]->add_child(scene_tree_dock);
@@ -6481,8 +6431,9 @@ EditorNode::EditorNode() {
default_layout->set_value(docks_section, "dock_4", "FileSystem");
default_layout->set_value(docks_section, "dock_5", "Inspector,Node");
- for (int i = 0; i < vsplits.size(); i++)
+ for (int i = 0; i < vsplits.size(); i++) {
default_layout->set_value(docks_section, "dock_split_" + itos(i + 1), 0);
+ }
default_layout->set_value(docks_section, "dock_hsplit_1", 0);
default_layout->set_value(docks_section, "dock_hsplit_2", 70 * EDSCALE);
default_layout->set_value(docks_section, "dock_hsplit_3", -70 * EDSCALE);
@@ -6493,7 +6444,7 @@ EditorNode::EditorNode() {
// Bottom panels
bottom_panel = memnew(PanelContainer);
- bottom_panel->add_style_override("panel", gui_base->get_stylebox("panel", "TabContainer"));
+ bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox("panel", "TabContainer"));
center_split->add_child(bottom_panel);
center_split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN);
@@ -6514,60 +6465,61 @@ EditorNode::EditorNode() {
version_label->set_self_modulate(Color(1, 1, 1, 0.6));
bottom_panel_hb->add_child(version_label);
- bottom_panel_raise = memnew(ToolButton);
- bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons"));
+ bottom_panel_raise = memnew(Button);
+ bottom_panel_raise->set_flat(true);
+ bottom_panel_raise->set_icon(gui_base->get_theme_icon("ExpandBottomDock", "EditorIcons"));
bottom_panel_raise->set_shortcut(ED_SHORTCUT("editor/bottom_panel_expand", TTR("Expand Bottom Panel"), KEY_MASK_SHIFT | KEY_F12));
bottom_panel_hb->add_child(bottom_panel_raise);
bottom_panel_raise->hide();
bottom_panel_raise->set_toggle_mode(true);
- bottom_panel_raise->connect("toggled", this, "_bottom_panel_raise_toggled");
+ bottom_panel_raise->connect("toggled", callable_mp(this, &EditorNode::_bottom_panel_raise_toggled));
log = memnew(EditorLog);
- ToolButton *output_button = add_bottom_panel_item(TTR("Output"), log);
+ Button *output_button = add_bottom_panel_item(TTR("Output"), log);
log->set_tool_button(output_button);
old_split_ofs = 0;
- center_split->connect("resized", this, "_vp_resized");
+ center_split->connect("resized", callable_mp(this, &EditorNode::_vp_resized));
orphan_resources = memnew(OrphanResourcesDialog);
gui_base->add_child(orphan_resources);
confirmation = memnew(ConfirmationDialog);
gui_base->add_child(confirmation);
- confirmation->connect("confirmed", this, "_menu_confirm_current");
+ confirmation->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current));
save_confirmation = memnew(ConfirmationDialog);
- save_confirmation->add_button(TTR("Don't Save"), OS::get_singleton()->get_swap_ok_cancel(), "discard");
+ save_confirmation->add_button(TTR("Don't Save"), DisplayServer::get_singleton()->get_swap_cancel_ok(), "discard");
gui_base->add_child(save_confirmation);
- save_confirmation->connect("confirmed", this, "_menu_confirm_current");
- save_confirmation->connect("custom_action", this, "_discard_changes");
+ save_confirmation->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current));
+ save_confirmation->connect("custom_action", callable_mp(this, &EditorNode::_discard_changes));
custom_build_manage_templates = memnew(ConfirmationDialog);
custom_build_manage_templates->set_text(TTR("Android build template is missing, please install relevant templates."));
custom_build_manage_templates->get_ok()->set_text(TTR("Manage Templates"));
- custom_build_manage_templates->connect("confirmed", this, "_menu_option", varray(SETTINGS_MANAGE_EXPORT_TEMPLATES));
+ custom_build_manage_templates->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_MANAGE_EXPORT_TEMPLATES));
gui_base->add_child(custom_build_manage_templates);
install_android_build_template = memnew(ConfirmationDialog);
install_android_build_template->set_text(TTR("This will set up your project for custom Android builds by installing the source template to \"res://android/build\".\nYou can then apply modifications and build your own custom APK on export (adding modules, changing the AndroidManifest.xml, etc.).\nNote 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."));
install_android_build_template->get_ok()->set_text(TTR("Install"));
- install_android_build_template->connect("confirmed", this, "_menu_confirm_current");
+ install_android_build_template->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current));
gui_base->add_child(install_android_build_template);
remove_android_build_template = memnew(ConfirmationDialog);
remove_android_build_template->set_text(TTR("The Android build template is already installed in this project and it won't be overwritten.\nRemove the \"res://android/build\" directory manually before attempting this operation again."));
remove_android_build_template->get_ok()->set_text(TTR("Show in File Manager"));
- remove_android_build_template->connect("confirmed", this, "_menu_option", varray(FILE_EXPLORE_ANDROID_BUILD_TEMPLATES));
+ remove_android_build_template->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(FILE_EXPLORE_ANDROID_BUILD_TEMPLATES));
gui_base->add_child(remove_android_build_template);
file_templates = memnew(EditorFileDialog);
file_templates->set_title(TTR("Import Templates From ZIP File"));
gui_base->add_child(file_templates);
- file_templates->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_templates->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file_templates->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
file_templates->clear_filters();
file_templates->add_filter("*.tpz ; " + TTR("Template Package"));
@@ -6578,8 +6530,8 @@ EditorNode::EditorNode() {
file_export_lib = memnew(EditorFileDialog);
file_export_lib->set_title(TTR("Export Library"));
- file_export_lib->set_mode(EditorFileDialog::MODE_SAVE_FILE);
- file_export_lib->connect("file_selected", this, "_dialog_action");
+ file_export_lib->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+ file_export_lib->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action));
file_export_lib_merge = memnew(CheckBox);
file_export_lib_merge->set_text(TTR("Merge With Existing"));
file_export_lib_merge->set_pressed(true);
@@ -6589,33 +6541,32 @@ EditorNode::EditorNode() {
file_script = memnew(EditorFileDialog);
file_script->set_title(TTR("Open & Run a Script"));
file_script->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
- file_script->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_script->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
List<String> sexts;
ResourceLoader::get_recognized_extensions_for_type("Script", &sexts);
for (List<String>::Element *E = sexts.front(); E; E = E->next()) {
file_script->add_filter("*." + E->get());
}
gui_base->add_child(file_script);
- file_script->connect("file_selected", this, "_dialog_action");
+ file_script->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action));
- file_menu->get_popup()->connect("id_pressed", this, "_menu_option");
- file_menu->connect("about_to_show", this, "_update_file_menu_opened");
- file_menu->get_popup()->connect("popup_hide", this, "_update_file_menu_closed");
+ file_menu->get_popup()->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ file_menu->connect("about_to_popup", callable_mp(this, &EditorNode::_update_file_menu_opened));
+ file_menu->get_popup()->connect("popup_hide", callable_mp(this, &EditorNode::_update_file_menu_closed));
- settings_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ settings_menu->get_popup()->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
- file->connect("file_selected", this, "_dialog_action");
- file_templates->connect("file_selected", this, "_dialog_action");
+ file->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action));
+ file_templates->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action));
preview_gen = memnew(AudioStreamPreviewGenerator);
add_child(preview_gen);
//plugin stuff
- file_server = memnew(EditorFileServer);
-
+ add_editor_plugin(memnew(DebuggerEditorPlugin(this, debug_menu)));
add_editor_plugin(memnew(AnimationPlayerEditorPlugin(this)));
add_editor_plugin(memnew(CanvasItemEditorPlugin(this)));
- add_editor_plugin(memnew(SpatialEditorPlugin(this)));
+ add_editor_plugin(memnew(Node3DEditorPlugin(this)));
add_editor_plugin(memnew(ScriptEditorPlugin(this)));
EditorAudioBuses *audio_bus_editor = EditorAudioBuses::register_editor();
@@ -6639,21 +6590,22 @@ EditorNode::EditorNode() {
add_editor_plugin(VersionControlEditorPlugin::get_singleton());
add_editor_plugin(memnew(ShaderEditorPlugin(this)));
+ add_editor_plugin(memnew(ShaderFileEditorPlugin(this)));
add_editor_plugin(memnew(VisualShaderEditorPlugin(this)));
- add_editor_plugin(memnew(CameraEditorPlugin(this)));
+ add_editor_plugin(memnew(Camera3DEditorPlugin(this)));
add_editor_plugin(memnew(ThemeEditorPlugin(this)));
add_editor_plugin(memnew(MultiMeshEditorPlugin(this)));
- add_editor_plugin(memnew(MeshInstanceEditorPlugin(this)));
+ add_editor_plugin(memnew(MeshInstance3DEditorPlugin(this)));
add_editor_plugin(memnew(AnimationTreeEditorPlugin(this)));
- add_editor_plugin(memnew(AnimationTreePlayerEditorPlugin(this)));
add_editor_plugin(memnew(MeshLibraryEditorPlugin(this)));
add_editor_plugin(memnew(StyleBoxEditorPlugin(this)));
- add_editor_plugin(memnew(SpriteEditorPlugin(this)));
+ add_editor_plugin(memnew(Sprite2DEditorPlugin(this)));
add_editor_plugin(memnew(Skeleton2DEditorPlugin(this)));
- add_editor_plugin(memnew(ParticlesEditorPlugin(this)));
+ add_editor_plugin(memnew(GPUParticles2DEditorPlugin(this)));
+ add_editor_plugin(memnew(GPUParticles3DEditorPlugin(this)));
add_editor_plugin(memnew(CPUParticles2DEditorPlugin(this)));
- add_editor_plugin(memnew(CPUParticlesEditorPlugin(this)));
+ add_editor_plugin(memnew(CPUParticles3DEditorPlugin(this)));
add_editor_plugin(memnew(ResourcePreloaderEditorPlugin(this)));
add_editor_plugin(memnew(ItemListEditorPlugin(this)));
add_editor_plugin(memnew(Polygon3DEditorPlugin(this)));
@@ -6662,11 +6614,10 @@ EditorNode::EditorNode() {
add_editor_plugin(memnew(TileMapEditorPlugin(this)));
add_editor_plugin(memnew(SpriteFramesEditorPlugin(this)));
add_editor_plugin(memnew(TextureRegionEditorPlugin(this)));
- add_editor_plugin(memnew(Particles2DEditorPlugin(this)));
add_editor_plugin(memnew(GIProbeEditorPlugin(this)));
add_editor_plugin(memnew(BakedLightmapEditorPlugin(this)));
add_editor_plugin(memnew(Path2DEditorPlugin(this)));
- add_editor_plugin(memnew(PathEditorPlugin(this)));
+ add_editor_plugin(memnew(Path3DEditorPlugin(this)));
add_editor_plugin(memnew(Line2DEditorPlugin(this)));
add_editor_plugin(memnew(Polygon2DEditorPlugin(this)));
add_editor_plugin(memnew(LightOccluder2DEditorPlugin(this)));
@@ -6675,22 +6626,26 @@ EditorNode::EditorNode() {
add_editor_plugin(memnew(CollisionShape2DEditorPlugin(this)));
add_editor_plugin(memnew(CurveEditorPlugin(this)));
add_editor_plugin(memnew(TextureEditorPlugin(this)));
+ add_editor_plugin(memnew(TextureLayeredEditorPlugin(this)));
+ add_editor_plugin(memnew(Texture3DEditorPlugin(this)));
add_editor_plugin(memnew(AudioStreamEditorPlugin(this)));
add_editor_plugin(memnew(AudioBusesEditorPlugin(audio_bus_editor)));
- add_editor_plugin(memnew(SkeletonEditorPlugin(this)));
- add_editor_plugin(memnew(SkeletonIKEditorPlugin(this)));
- add_editor_plugin(memnew(PhysicalBonePlugin(this)));
+ add_editor_plugin(memnew(Skeleton3DEditorPlugin(this)));
+ add_editor_plugin(memnew(SkeletonIK3DEditorPlugin(this)));
+ add_editor_plugin(memnew(PhysicalBone3DEditorPlugin(this)));
add_editor_plugin(memnew(MeshEditorPlugin(this)));
add_editor_plugin(memnew(MaterialEditorPlugin(this)));
- for (int i = 0; i < EditorPlugins::get_plugin_count(); i++)
+ for (int i = 0; i < EditorPlugins::get_plugin_count(); i++) {
add_editor_plugin(EditorPlugins::create(i, this));
+ }
for (int i = 0; i < plugin_init_callback_count; i++) {
plugin_init_callbacks[i]();
}
resource_preview->add_preview_generator(Ref<EditorTexturePreviewPlugin>(memnew(EditorTexturePreviewPlugin)));
+ resource_preview->add_preview_generator(Ref<EditorImagePreviewPlugin>(memnew(EditorImagePreviewPlugin)));
resource_preview->add_preview_generator(Ref<EditorPackedScenePreviewPlugin>(memnew(EditorPackedScenePreviewPlugin)));
resource_preview->add_preview_generator(Ref<EditorMaterialPreviewPlugin>(memnew(EditorMaterialPreviewPlugin)));
resource_preview->add_preview_generator(Ref<EditorScriptPreviewPlugin>(memnew(EditorScriptPreviewPlugin)));
@@ -6700,7 +6655,7 @@ EditorNode::EditorNode() {
resource_preview->add_preview_generator(Ref<EditorFontPreviewPlugin>(memnew(EditorFontPreviewPlugin)));
{
- Ref<SpatialMaterialConversionPlugin> spatial_mat_convert;
+ Ref<StandardMaterial3DConversionPlugin> spatial_mat_convert;
spatial_mat_convert.instance();
resource_conversion_plugins.push_back(spatial_mat_convert);
@@ -6712,6 +6667,18 @@ EditorNode::EditorNode() {
particles_mat_convert.instance();
resource_conversion_plugins.push_back(particles_mat_convert);
+ Ref<ProceduralSkyMaterialConversionPlugin> procedural_sky_mat_convert;
+ procedural_sky_mat_convert.instance();
+ resource_conversion_plugins.push_back(procedural_sky_mat_convert);
+
+ Ref<PanoramaSkyMaterialConversionPlugin> panorama_sky_mat_convert;
+ panorama_sky_mat_convert.instance();
+ resource_conversion_plugins.push_back(panorama_sky_mat_convert);
+
+ Ref<PhysicalSkyMaterialConversionPlugin> physical_sky_mat_convert;
+ physical_sky_mat_convert.instance();
+ resource_conversion_plugins.push_back(physical_sky_mat_convert);
+
Ref<VisualShaderConversionPlugin> vshader_convert;
vshader_convert.instance();
resource_conversion_plugins.push_back(vshader_convert);
@@ -6720,7 +6687,7 @@ EditorNode::EditorNode() {
update_spinner_step_frame = Engine::get_singleton()->get_frames_drawn();
update_spinner_step = 0;
- editor_plugin_screen = NULL;
+ editor_plugin_screen = nullptr;
editor_plugins_over = memnew(EditorPluginList);
editor_plugins_force_over = memnew(EditorPluginList);
editor_plugins_force_input_forwarding = memnew(EditorPluginList);
@@ -6730,8 +6697,12 @@ EditorNode::EditorNode() {
EditorExport::get_singleton()->add_export_plugin(export_text_to_binary_plugin);
+ Ref<PackedSceneEditorTranslationParserPlugin> packed_scene_translation_parser_plugin;
+ packed_scene_translation_parser_plugin.instance();
+ EditorTranslationParser::get_singleton()->add_parser(packed_scene_translation_parser_plugin, EditorTranslationParser::STANDARD);
+
_edit_current();
- current = NULL;
+ current = nullptr;
saving_resource = Ref<Resource>();
reference_resource_mem = true;
@@ -6741,22 +6712,22 @@ EditorNode::EditorNode() {
open_imported = memnew(ConfirmationDialog);
open_imported->get_ok()->set_text(TTR("Open Anyway"));
- new_inherited_button = open_imported->add_button(TTR("New Inherited"), !OS::get_singleton()->get_swap_ok_cancel(), "inherit");
- open_imported->connect("confirmed", this, "_open_imported");
- open_imported->connect("custom_action", this, "_inherit_imported");
+ new_inherited_button = open_imported->add_button(TTR("New Inherited"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "inherit");
+ open_imported->connect("confirmed", callable_mp(this, &EditorNode::_open_imported));
+ open_imported->connect("custom_action", callable_mp(this, &EditorNode::_inherit_imported));
gui_base->add_child(open_imported);
saved_version = 1;
unsaved_cache = true;
- _last_instanced_scene = NULL;
+ _last_instanced_scene = nullptr;
quick_open = memnew(EditorQuickOpen);
gui_base->add_child(quick_open);
- quick_open->connect("quick_open", this, "_quick_opened");
+ quick_open->connect("quick_open", callable_mp(this, &EditorNode::_quick_opened));
quick_run = memnew(EditorQuickOpen);
gui_base->add_child(quick_run);
- quick_run->connect("quick_open", this, "_quick_run");
+ quick_run->connect("quick_open", callable_mp(this, &EditorNode::_quick_run));
_update_recent_scenes();
@@ -6773,15 +6744,16 @@ EditorNode::EditorNode() {
gui_base->add_child(load_error_dialog);
execute_outputs = memnew(RichTextLabel);
+ execute_outputs->set_selection_enabled(true);
execute_output_dialog = memnew(AcceptDialog);
execute_output_dialog->add_child(execute_outputs);
execute_output_dialog->set_title("");
gui_base->add_child(execute_output_dialog);
- EditorFileSystem::get_singleton()->connect("sources_changed", this, "_sources_changed");
- EditorFileSystem::get_singleton()->connect("filesystem_changed", this, "_fs_changed");
- EditorFileSystem::get_singleton()->connect("resources_reimported", this, "_resources_reimported");
- EditorFileSystem::get_singleton()->connect("resources_reload", this, "_resources_changed");
+ EditorFileSystem::get_singleton()->connect("sources_changed", callable_mp(this, &EditorNode::_sources_changed));
+ EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &EditorNode::_fs_changed));
+ EditorFileSystem::get_singleton()->connect("resources_reimported", callable_mp(this, &EditorNode::_resources_reimported));
+ EditorFileSystem::get_singleton()->connect("resources_reload", callable_mp(this, &EditorNode::_resources_changed));
_build_icon_type_cache();
@@ -6790,10 +6762,11 @@ EditorNode::EditorNode() {
pick_main_scene = memnew(ConfirmationDialog);
gui_base->add_child(pick_main_scene);
pick_main_scene->get_ok()->set_text(TTR("Select"));
- pick_main_scene->connect("confirmed", this, "_menu_option", varray(SETTINGS_PICK_MAIN_SCENE));
+ pick_main_scene->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_PICK_MAIN_SCENE));
- for (int i = 0; i < _init_callbacks.size(); i++)
+ for (int i = 0; i < _init_callbacks.size(); i++) {
_init_callbacks[i]();
+ }
editor_data.add_edited_scene(-1);
editor_data.set_edited_scene(0);
@@ -6830,14 +6803,17 @@ EditorNode::EditorNode() {
screenshot_timer = memnew(Timer);
screenshot_timer->set_one_shot(true);
screenshot_timer->set_wait_time(settings_menu->get_popup()->get_submenu_popup_delay() + 0.1f);
- screenshot_timer->connect("timeout", this, "_request_screenshot");
+ screenshot_timer->connect("timeout", callable_mp(this, &EditorNode::_request_screenshot));
add_child(screenshot_timer);
screenshot_timer->set_owner(get_owner());
+
+ String exec = OS::get_singleton()->get_executable_path();
+ EditorSettings::get_singleton()->set_project_metadata("editor_metadata", "executable_path", exec); // Save editor executable path for third-party tools
}
EditorNode::~EditorNode() {
-
EditorInspector::cleanup_plugins();
+ EditorTranslationParser::get_singleton()->clean_parsers();
remove_print_handler(&print_handler);
memdelete(EditorHelp::get_doc_data());
@@ -6845,7 +6821,6 @@ EditorNode::~EditorNode() {
memdelete(editor_plugins_over);
memdelete(editor_plugins_force_over);
memdelete(editor_plugins_force_input_forwarding);
- memdelete(file_server);
memdelete(progress_hb);
EditorSettings::destroy();
@@ -6856,21 +6831,18 @@ EditorNode::~EditorNode() {
*/
void EditorPluginList::make_visible(bool p_visible) {
-
for (int i = 0; i < plugins_list.size(); i++) {
plugins_list[i]->make_visible(p_visible);
}
}
void EditorPluginList::edit(Object *p_object) {
-
for (int i = 0; i < plugins_list.size(); i++) {
plugins_list[i]->edit(p_object);
}
}
bool EditorPluginList::forward_gui_input(const Ref<InputEvent> &p_event) {
-
bool discard = false;
for (int i = 0; i < plugins_list.size(); i++) {
@@ -6882,7 +6854,7 @@ bool EditorPluginList::forward_gui_input(const Ref<InputEvent> &p_event) {
return discard;
}
-bool EditorPluginList::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled) {
+bool EditorPluginList::forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled) {
bool discard = false;
for (int i = 0; i < plugins_list.size(); i++) {
@@ -6899,28 +6871,24 @@ bool EditorPluginList::forward_spatial_gui_input(Camera *p_camera, const Ref<Inp
}
void EditorPluginList::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
for (int i = 0; i < plugins_list.size(); i++) {
plugins_list[i]->forward_canvas_draw_over_viewport(p_overlay);
}
}
void EditorPluginList::forward_canvas_force_draw_over_viewport(Control *p_overlay) {
-
for (int i = 0; i < plugins_list.size(); i++) {
plugins_list[i]->forward_canvas_force_draw_over_viewport(p_overlay);
}
}
void EditorPluginList::forward_spatial_draw_over_viewport(Control *p_overlay) {
-
for (int i = 0; i < plugins_list.size(); i++) {
plugins_list[i]->forward_spatial_draw_over_viewport(p_overlay);
}
}
void EditorPluginList::forward_spatial_force_draw_over_viewport(Control *p_overlay) {
-
for (int i = 0; i < plugins_list.size(); i++) {
plugins_list[i]->forward_spatial_force_draw_over_viewport(p_overlay);
}
diff --git a/editor/editor_node.h b/editor/editor_node.h
index a5c04d3531..dec28b0d2b 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -32,6 +32,7 @@
#define EDITOR_NODE_H
#include "editor/editor_data.h"
+#include "editor/editor_export.h"
#include "editor/editor_folding.h"
#include "editor/editor_run.h"
#include "editor/inspector_dock.h"
@@ -70,7 +71,6 @@ class ImportDock;
class MenuButton;
class NodeDock;
class OrphanResourcesDialog;
-class PaneDrag;
class Panel;
class PanelContainer;
class PluginConfigDialog;
@@ -82,11 +82,12 @@ class ScriptCreateDialog;
class TabContainer;
class Tabs;
class TextureProgress;
-class ToolButton;
+class Button;
class VSplitContainer;
+class Window;
+class SubViewport;
class EditorNode : public Node {
-
GDCLASS(EditorNode, Node);
public:
@@ -107,7 +108,7 @@ public:
List<String> args;
String output;
Thread *execute_output_thread;
- Mutex *execute_output_mutex;
+ Mutex execute_output_mutex;
int exitcode;
volatile bool done;
};
@@ -150,7 +151,7 @@ private:
FILE_EXTERNAL_OPEN_SCENE,
EDIT_UNDO,
EDIT_REDO,
- EDIT_REVERT,
+ EDIT_RELOAD_SAVED_SCENE,
TOOLS_ORPHAN_RESOURCES,
TOOLS_CUSTOM,
RESOURCE_SAVE,
@@ -159,18 +160,11 @@ private:
RUN_STOP,
RUN_PLAY_SCENE,
- RUN_PLAY_NATIVE,
RUN_PLAY_CUSTOM_SCENE,
RUN_SCENE_SETTINGS,
RUN_SETTINGS,
RUN_PROJECT_DATA_FOLDER,
RUN_PROJECT_MANAGER,
- RUN_FILE_SERVER,
- RUN_LIVE_DEBUG,
- RUN_DEBUG_COLLISONS,
- RUN_DEBUG_NAVIGATION,
- RUN_DEPLOY_REMOTE_DEBUG,
- RUN_RELOAD_SCRIPTS,
RUN_VCS_SETTINGS,
RUN_VCS_SHUT_DOWN,
SETTINGS_UPDATE_CONTINUOUSLY,
@@ -198,7 +192,8 @@ private:
HELP_SEARCH,
HELP_DOCS,
HELP_QA,
- HELP_ISSUES,
+ HELP_REPORT_A_BUG,
+ HELP_SEND_DOCS_FEEDBACK,
HELP_COMMUNITY,
HELP_ABOUT,
@@ -212,7 +207,7 @@ private:
TOOL_MENU_BASE = 1000
};
- Viewport *scene_root; //root of the scene being edited
+ SubViewport *scene_root; //root of the scene being edited
PanelContainer *scene_root_parent;
Control *theme_base;
@@ -259,7 +254,6 @@ private:
VSplitContainer *top_split;
HBoxContainer *bottom_hb;
Control *vp_base;
- PaneDrag *pd;
HBoxContainer *menu_hb;
Control *viewport;
@@ -269,15 +263,15 @@ private:
MenuButton *settings_menu;
MenuButton *help_menu;
PopupMenu *tool_menu;
- ToolButton *export_button;
- ToolButton *prev_scene;
- ToolButton *play_button;
- ToolButton *pause_button;
- ToolButton *stop_button;
- ToolButton *run_settings_button;
- ToolButton *play_scene_button;
- ToolButton *play_custom_scene_button;
- ToolButton *search_button;
+ Button *export_button;
+ Button *prev_scene;
+ Button *play_button;
+ Button *pause_button;
+ Button *stop_button;
+ Button *run_settings_button;
+ Button *play_scene_button;
+ Button *play_custom_scene_button;
+ Button *search_button;
TextureProgress *audio_vu;
Timer *screenshot_timer;
@@ -340,7 +334,7 @@ private:
EditorQuickOpen *quick_run;
HBoxContainer *main_editor_button_vb;
- Vector<ToolButton *> main_editor_buttons;
+ Vector<Button *> main_editor_buttons;
Vector<EditorPlugin *> editor_table;
AudioStreamPreviewGenerator *preview_gen;
@@ -354,20 +348,23 @@ private:
Button *new_inherited_button;
String open_import_request;
+ Vector<Control *> floating_docks;
+
TabContainer *dock_slot[DOCK_SLOT_MAX];
Rect2 dock_select_rect[DOCK_SLOT_MAX];
int dock_select_rect_over;
PopupPanel *dock_select_popup;
Control *dock_select;
- ToolButton *dock_tab_move_left;
- ToolButton *dock_tab_move_right;
+ Button *dock_float;
+ Button *dock_tab_move_left;
+ Button *dock_tab_move_right;
int dock_popup_selected;
Timer *dock_drag_timer;
bool docks_visible;
HBoxContainer *tabbar_container;
- ToolButton *distraction_free;
- ToolButton *scene_tab_add;
+ Button *distraction_free;
+ Button *scene_tab_add;
bool scene_distraction;
bool script_distraction;
@@ -410,12 +407,10 @@ private:
EditorResourcePreview *resource_preview;
EditorFolding editor_folding;
- EditorFileServer *file_server;
-
struct BottomPanelItem {
String name;
Control *control;
- ToolButton *button;
+ Button *button;
};
Vector<BottomPanelItem> bottom_panel_items;
@@ -425,7 +420,7 @@ private:
HBoxContainer *bottom_panel_hb_editors;
VBoxContainer *bottom_panel_vb;
Label *version_label;
- ToolButton *bottom_panel_raise;
+ Button *bottom_panel_raise;
void _bottom_panel_raise_toggled(bool);
@@ -453,7 +448,6 @@ private:
void _save_screenshot(NodePath p_path);
void _tool_menu_option(int p_idx);
- void _update_debug_options();
void _update_file_menu_opened();
void _update_file_menu_closed();
@@ -495,6 +489,7 @@ private:
void _quick_run();
void _run(bool p_current = false, const String &p_custom = "");
+ void _run_native(const Ref<EditorExportPreset> &p_preset);
void _save_optimized();
void _import_action(const String &p_action);
@@ -502,7 +497,8 @@ private:
void _add_to_recent_scenes(const String &p_scene);
void _update_recent_scenes();
void _open_recent_scene(int p_idx);
- void _global_menu_action(const Variant &p_id, const Variant &p_meta);
+ void _global_menu_scene(const Variant &p_tag);
+ void _global_menu_new_window(const Variant &p_tag);
void _dropped_files(const Vector<String> &p_files, int p_screen);
void _add_dropped_files_recursive(const Vector<String> &p_files, String to_path);
String _recent_scene;
@@ -522,13 +518,13 @@ private:
Set<FileDialog *> file_dialogs;
Set<EditorFileDialog *> editor_file_dialogs;
- Map<String, Ref<Texture> > icon_type_cache;
+ Map<String, Ref<Texture2D>> icon_type_cache;
void _build_icon_type_cache();
bool _initializing_addons;
Map<String, EditorPlugin *> plugin_addons;
- static Ref<Texture> _file_dialog_get_icon(const String &p_path);
+ static Ref<Texture2D> _file_dialog_get_icon(const String &p_path);
static void _file_dialog_register(FileDialog *p_dialog);
static void _file_dialog_unregister(FileDialog *p_dialog);
static void _editor_file_dialog_register(EditorFileDialog *p_dialog);
@@ -545,12 +541,13 @@ private:
void _find_node_types(Node *p_node, int &count_2d, int &count_3d);
void _save_scene_with_preview(String p_file, int p_idx = -1);
- Map<String, Set<String> > dependency_errors;
+ Map<String, Set<String>> dependency_errors;
static void _dependency_error_report(void *ud, const String &p_path, const String &p_dep, const String &p_type) {
EditorNode *en = (EditorNode *)ud;
- if (!en->dependency_errors.has(p_path))
+ if (!en->dependency_errors.has(p_path)) {
en->dependency_errors[p_path] = Set<String>();
+ }
en->dependency_errors[p_path].insert(p_dep + "::" + p_type);
}
@@ -569,6 +566,8 @@ private:
bool _find_scene_in_use(Node *p_node, const String &p_path) const;
+ void _update_dock_containers();
+
void _dock_select_input(const Ref<InputEvent> &p_input);
void _dock_move_left();
void _dock_move_right();
@@ -576,13 +575,15 @@ private:
void _dock_pre_popup(int p_which);
void _dock_split_dragged(int ofs);
void _dock_popup_exit();
+ void _dock_floating_close_request(Control *p_control);
+ void _dock_make_float();
void _scene_tab_changed(int p_tab);
void _scene_tab_closed(int p_tab, int option = SCENE_TAB_CLOSE);
void _scene_tab_hover(int p_tab);
void _scene_tab_exit();
void _scene_tab_input(const Ref<InputEvent> &p_input);
void _reposition_active_tab(int idx_to);
- void _thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata);
+ void _thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata);
void _scene_tab_script_edited(int p_tab);
Dictionary _get_main_scene_state();
@@ -631,7 +632,7 @@ private:
void _update_update_spinner();
- Vector<Ref<EditorResourceConversionPlugin> > resource_conversion_plugins;
+ Vector<Ref<EditorResourceConversionPlugin>> resource_conversion_plugins;
PrintHandlerList print_handler;
static void _print_handler(void *p_this, const String &p_string, bool p_error);
@@ -639,7 +640,7 @@ private:
static void _resource_saved(RES p_resource, const String &p_path);
static void _resource_loaded(RES p_resource, const String &p_path);
- void _resources_changed(const PoolVector<String> &p_resources);
+ void _resources_changed(const Vector<String> &p_resources);
void _feature_profile_changed();
bool _is_class_editor_disabled_by_feature_profile(const StringName &p_class);
@@ -684,13 +685,15 @@ public:
static void add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed = false);
static void remove_editor_plugin(EditorPlugin *p_editor, bool p_config_changed = false);
+ static void disambiguate_filenames(const Vector<String> p_full_paths, Vector<String> &r_filenames);
+
void new_inherited_scene() { _menu_option_confirm(FILE_NEW_INHERITED_SCENE, false); }
void set_docks_visible(bool p_show);
bool get_docks_visible() const;
void set_distraction_free_mode(bool p_enter);
- bool get_distraction_free_mode() const;
+ bool is_distraction_free_mode_enabled() const;
void add_control_to_dock(DockSlot p_slot, Control *p_control);
void remove_control_from_dock(Control *p_control);
@@ -733,7 +736,7 @@ public:
Node *get_edited_scene() { return editor_data.get_edited_scene_root(); }
- Viewport *get_scene_root() { return scene_root; } //root of the scene being edited
+ SubViewport *get_scene_root() { return scene_root; } //root of the scene being edited
void fix_dependencies(const String &p_for_file);
void clear_scene() { _cleanup_scene(); }
@@ -764,16 +767,16 @@ public:
void set_convert_old_scene(bool p_old) { convert_old = p_old; }
- void notify_child_process_exited();
+ void notify_all_debug_sessions_exited();
- OS::ProcessID get_child_process_id() const { return editor_run.get_pid(); }
- void stop_child_process();
+ OS::ProcessID has_child_process(OS::ProcessID p_pid) const { return editor_run.has_child_process(p_pid); }
+ void stop_child_process(OS::ProcessID p_pid);
Ref<Theme> get_editor_theme() const { return theme; }
Ref<Script> get_object_custom_type_base(const Object *p_object) const;
StringName get_object_custom_type_name(const Object *p_object) const;
- Ref<Texture> get_object_icon(const Object *p_object, const String &p_fallback = "Object") const;
- Ref<Texture> get_class_icon(const String &p_class, const String &p_fallback = "Object") const;
+ Ref<Texture2D> get_object_icon(const Object *p_object, const String &p_fallback = "Object") const;
+ Ref<Texture2D> get_class_icon(const String &p_class, const String &p_fallback = "Object") const;
void show_accept(const String &p_text, const String &p_title);
void show_warning(const String &p_text, const String &p_title = TTR("Warning!"));
@@ -799,10 +802,11 @@ public:
static void progress_end_task_bg(const String &p_task);
void save_scene_to_path(String p_file, bool p_with_preview = true) {
- if (p_with_preview)
+ if (p_with_preview) {
_save_scene_with_preview(p_file);
- else
+ } else {
_save_scene(p_file);
+ }
}
bool is_scene_in_use(const String &p_path);
@@ -817,9 +821,9 @@ public:
bool is_exiting() const { return exiting; }
- ToolButton *get_pause_button() { return pause_button; }
+ Button *get_pause_button() { return pause_button; }
- ToolButton *add_bottom_panel_item(String p_text, Control *p_item);
+ Button *add_bottom_panel_item(String p_text, Control *p_item);
bool are_bottom_panels_hidden() const;
void make_bottom_panel_item_visible(Control *p_item);
void raise_bottom_panel_item(Control *p_item);
@@ -853,7 +857,7 @@ public:
void add_resource_conversion_plugin(const Ref<EditorResourceConversionPlugin> &p_plugin);
void remove_resource_conversion_plugin(const Ref<EditorResourceConversionPlugin> &p_plugin);
- Vector<Ref<EditorResourceConversionPlugin> > find_resource_conversion_plugin(const Ref<Resource> &p_for_resource);
+ Vector<Ref<EditorResourceConversionPlugin>> find_resource_conversion_plugin(const Ref<Resource> &p_for_resource);
static void add_init_callback(EditorNodeInitCallback p_callback) { _init_callbacks.push_back(p_callback); }
static void add_build_callback(EditorBuildCallback p_callback);
@@ -861,11 +865,14 @@ public:
bool ensure_main_scene(bool p_from_native);
void run_play();
+ void run_play_current();
+ void run_play_custom(const String &p_custom);
void run_stop();
+ bool is_run_playing() const;
+ String get_run_playing_scene() const;
};
struct EditorProgress {
-
String task;
bool step(const String &p_state, int p_step = -1, bool p_force_refresh = true) { return EditorNode::progress_task_step(task, p_state, p_step, p_force_refresh); }
EditorProgress(const String &p_task, const String &p_label, int p_amount, bool p_can_cancel = false) {
@@ -893,7 +900,7 @@ public:
bool forward_gui_input(const Ref<InputEvent> &p_event);
void forward_canvas_draw_over_viewport(Control *p_overlay);
void forward_canvas_force_draw_over_viewport(Control *p_overlay);
- bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled);
+ bool forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled);
void forward_spatial_draw_over_viewport(Control *p_overlay);
void forward_spatial_force_draw_over_viewport(Control *p_overlay);
void add_plugin(EditorPlugin *p_plugin);
@@ -906,7 +913,6 @@ public:
};
struct EditorProgressBG {
-
String task;
void step(int p_step = -1) { EditorNode::progress_task_step_bg(task, p_step); }
EditorProgressBG(const String &p_task, const String &p_label, int p_amount) {
diff --git a/editor/editor_path.cpp b/editor/editor_path.cpp
index f0d69f98fb..c249974f99 100644
--- a/editor/editor_path.cpp
+++ b/editor/editor_path.cpp
@@ -34,27 +34,30 @@
#include "editor_scale.h"
void EditorPath::_add_children_to_popup(Object *p_obj, int p_depth) {
-
- if (p_depth > 8)
+ if (p_depth > 8) {
return;
+ }
List<PropertyInfo> pinfo;
p_obj->get_property_list(&pinfo);
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
- if (!(E->get().usage & PROPERTY_USAGE_EDITOR))
+ if (!(E->get().usage & PROPERTY_USAGE_EDITOR)) {
continue;
- if (E->get().hint != PROPERTY_HINT_RESOURCE_TYPE)
+ }
+ if (E->get().hint != PROPERTY_HINT_RESOURCE_TYPE) {
continue;
+ }
Variant value = p_obj->get(E->get().name);
- if (value.get_type() != Variant::OBJECT)
+ if (value.get_type() != Variant::OBJECT) {
continue;
+ }
Object *obj = value;
- if (!obj)
+ if (!obj) {
continue;
+ }
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj);
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj);
int index = get_popup()->get_item_count();
get_popup()->add_icon_item(icon, E->get().name.capitalize(), objects.size());
@@ -66,10 +69,10 @@ void EditorPath::_add_children_to_popup(Object *p_obj, int p_depth) {
}
void EditorPath::_about_to_show() {
-
Object *obj = ObjectDB::get_instance(history->get_path_object(history->get_path_size() - 1));
- if (!obj)
+ if (!obj) {
return;
+ }
objects.clear();
get_popup()->clear();
@@ -83,37 +86,39 @@ void EditorPath::_about_to_show() {
}
void EditorPath::update_path() {
-
for (int i = 0; i < history->get_path_size(); i++) {
-
Object *obj = ObjectDB::get_instance(history->get_path_object(i));
- if (!obj)
+ if (!obj) {
continue;
+ }
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj);
- if (icon.is_valid())
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj);
+ if (icon.is_valid()) {
set_icon(icon);
+ }
if (i == history->get_path_size() - 1) {
String name;
if (Object::cast_to<Resource>(obj)) {
-
Resource *r = Object::cast_to<Resource>(obj);
- if (r->get_path().is_resource_file())
+ if (r->get_path().is_resource_file()) {
name = r->get_path().get_file();
- else
+ } else {
name = r->get_name();
+ }
- if (name == "")
+ if (name == "") {
name = r->get_class();
- } else if (obj->is_class("ScriptEditorDebuggerInspectedObject"))
+ }
+ } else if (obj->is_class("EditorDebuggerRemoteObject")) {
name = obj->call("get_title");
- else if (Object::cast_to<Node>(obj))
+ } else if (Object::cast_to<Node>(obj)) {
name = Object::cast_to<Node>(obj)->get_name();
- else if (Object::cast_to<Resource>(obj) && Object::cast_to<Resource>(obj)->get_name() != "")
+ } else if (Object::cast_to<Resource>(obj) && Object::cast_to<Resource>(obj)->get_name() != "") {
name = Object::cast_to<Resource>(obj)->get_name();
- else
+ } else {
name = obj->get_class();
+ }
set_text(" " + name); // An extra space so the text is not too close of the icon.
set_tooltip(obj->get_class());
@@ -122,18 +127,17 @@ void EditorPath::update_path() {
}
void EditorPath::_id_pressed(int p_idx) {
-
ERR_FAIL_INDEX(p_idx, objects.size());
Object *obj = ObjectDB::get_instance(objects[p_idx]);
- if (!obj)
+ if (!obj) {
return;
+ }
EditorNode::get_singleton()->push_item(obj);
}
void EditorPath::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_THEME_CHANGED: {
update_path();
@@ -142,16 +146,12 @@ void EditorPath::_notification(int p_what) {
}
void EditorPath::_bind_methods() {
-
- ClassDB::bind_method("_about_to_show", &EditorPath::_about_to_show);
- ClassDB::bind_method("_id_pressed", &EditorPath::_id_pressed);
}
EditorPath::EditorPath(EditorHistory *p_history) {
-
history = p_history;
set_clip_text(true);
set_text_align(ALIGN_LEFT);
- get_popup()->connect("about_to_show", this, "_about_to_show");
- get_popup()->connect("id_pressed", this, "_id_pressed");
+ get_popup()->connect("about_to_popup", callable_mp(this, &EditorPath::_about_to_show));
+ get_popup()->connect("id_pressed", callable_mp(this, &EditorPath::_id_pressed));
}
diff --git a/editor/editor_path.h b/editor/editor_path.h
index b0ffc487ac..01ba25ab69 100644
--- a/editor/editor_path.h
+++ b/editor/editor_path.h
@@ -35,7 +35,6 @@
#include "scene/gui/menu_button.h"
class EditorPath : public MenuButton {
-
GDCLASS(EditorPath, MenuButton);
EditorHistory *history;
diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp
index b5f63dcd43..bce46b719a 100644
--- a/editor/editor_plugin.cpp
+++ b/editor/editor_plugin.cpp
@@ -38,20 +38,19 @@
#include "editor_resource_preview.h"
#include "main/main.h"
#include "plugins/canvas_item_editor_plugin.h"
-#include "plugins/spatial_editor_plugin.h"
-#include "scene/3d/camera.h"
+#include "plugins/node_3d_editor_plugin.h"
+#include "scene/3d/camera_3d.h"
#include "scene/gui/popup_menu.h"
-#include "servers/visual_server.h"
+#include "servers/rendering_server.h"
Array EditorInterface::_make_mesh_previews(const Array &p_meshes, int p_preview_size) {
-
- Vector<Ref<Mesh> > meshes;
+ Vector<Ref<Mesh>> meshes;
for (int i = 0; i < p_meshes.size(); i++) {
meshes.push_back(p_meshes[i]);
}
- Vector<Ref<Texture> > textures = make_mesh_previews(meshes, NULL, p_preview_size);
+ Vector<Ref<Texture2D>> textures = make_mesh_previews(meshes, nullptr, p_preview_size);
Array ret;
for (int i = 0; i < textures.size(); i++) {
ret.push_back(textures[i]);
@@ -60,50 +59,47 @@ Array EditorInterface::_make_mesh_previews(const Array &p_meshes, int p_preview_
return ret;
}
-Vector<Ref<Texture> > EditorInterface::make_mesh_previews(const Vector<Ref<Mesh> > &p_meshes, Vector<Transform> *p_transforms, int p_preview_size) {
-
+Vector<Ref<Texture2D>> EditorInterface::make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform> *p_transforms, int p_preview_size) {
int size = p_preview_size;
- RID scenario = VS::get_singleton()->scenario_create();
+ RID scenario = RS::get_singleton()->scenario_create();
- RID viewport = VS::get_singleton()->viewport_create();
- VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ALWAYS);
- VS::get_singleton()->viewport_set_vflip(viewport, true);
- VS::get_singleton()->viewport_set_scenario(viewport, scenario);
- VS::get_singleton()->viewport_set_size(viewport, size, size);
- VS::get_singleton()->viewport_set_transparent_background(viewport, true);
- VS::get_singleton()->viewport_set_active(viewport, true);
- RID viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
+ RID viewport = RS::get_singleton()->viewport_create();
+ RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ALWAYS);
+ RS::get_singleton()->viewport_set_scenario(viewport, scenario);
+ RS::get_singleton()->viewport_set_size(viewport, size, size);
+ RS::get_singleton()->viewport_set_transparent_background(viewport, true);
+ RS::get_singleton()->viewport_set_active(viewport, true);
+ RID viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
- RID camera = VS::get_singleton()->camera_create();
- VS::get_singleton()->viewport_attach_camera(viewport, camera);
+ RID camera = RS::get_singleton()->camera_create();
+ RS::get_singleton()->viewport_attach_camera(viewport, camera);
- RID light = VS::get_singleton()->directional_light_create();
- RID light_instance = VS::get_singleton()->instance_create2(light, scenario);
+ RID light = RS::get_singleton()->directional_light_create();
+ RID light_instance = RS::get_singleton()->instance_create2(light, scenario);
- RID light2 = VS::get_singleton()->directional_light_create();
- VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
- RID light_instance2 = VS::get_singleton()->instance_create2(light2, scenario);
+ RID light2 = RS::get_singleton()->directional_light_create();
+ RS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
+ RID light_instance2 = RS::get_singleton()->instance_create2(light2, scenario);
EditorProgress ep("mlib", TTR("Creating Mesh Previews"), p_meshes.size());
- Vector<Ref<Texture> > textures;
+ Vector<Ref<Texture2D>> textures;
for (int i = 0; i < p_meshes.size(); i++) {
-
Ref<Mesh> mesh = p_meshes[i];
if (!mesh.is_valid()) {
- textures.push_back(Ref<Texture>());
+ textures.push_back(Ref<Texture2D>());
continue;
}
Transform mesh_xform;
- if (p_transforms != NULL) {
+ if (p_transforms != nullptr) {
mesh_xform = (*p_transforms)[i];
}
- RID inst = VS::get_singleton()->instance_create2(mesh->get_rid(), scenario);
- VS::get_singleton()->instance_set_transform(inst, mesh_xform);
+ RID inst = RS::get_singleton()->instance_create2(mesh->get_rid(), scenario);
+ RS::get_singleton()->instance_set_transform(inst, mesh_xform);
AABB aabb = mesh->get_aabb();
Vector3 ofs = aabb.position + aabb.size * 0.5;
@@ -114,7 +110,7 @@ Vector<Ref<Texture> > EditorInterface::make_mesh_previews(const Vector<Ref<Mesh>
AABB rot_aabb = xform.xform(aabb);
float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5;
if (m == 0) {
- textures.push_back(Ref<Texture>());
+ textures.push_back(Ref<Texture2D>());
continue;
}
xform.origin = -xform.basis.xform(ofs); //-ofs*m;
@@ -122,32 +118,32 @@ Vector<Ref<Texture> > EditorInterface::make_mesh_previews(const Vector<Ref<Mesh>
xform.invert();
xform = mesh_xform * xform;
- VS::get_singleton()->camera_set_transform(camera, xform * Transform(Basis(), Vector3(0, 0, 3)));
- VS::get_singleton()->camera_set_orthogonal(camera, m * 2, 0.01, 1000.0);
+ RS::get_singleton()->camera_set_transform(camera, xform * Transform(Basis(), Vector3(0, 0, 3)));
+ RS::get_singleton()->camera_set_orthogonal(camera, m * 2, 0.01, 1000.0);
- VS::get_singleton()->instance_set_transform(light_instance, xform * Transform().looking_at(Vector3(-2, -1, -1), Vector3(0, 1, 0)));
- VS::get_singleton()->instance_set_transform(light_instance2, xform * Transform().looking_at(Vector3(+1, -1, -2), Vector3(0, 1, 0)));
+ RS::get_singleton()->instance_set_transform(light_instance, xform * Transform().looking_at(Vector3(-2, -1, -1), Vector3(0, 1, 0)));
+ RS::get_singleton()->instance_set_transform(light_instance2, xform * Transform().looking_at(Vector3(+1, -1, -2), Vector3(0, 1, 0)));
ep.step(TTR("Thumbnail..."), i);
Main::iteration();
Main::iteration();
- Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture);
+ Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture);
ERR_CONTINUE(!img.is_valid() || img->empty());
Ref<ImageTexture> it(memnew(ImageTexture));
it->create_from_image(img);
- VS::get_singleton()->free(inst);
+ RS::get_singleton()->free(inst);
textures.push_back(it);
}
- VS::get_singleton()->free(viewport);
- VS::get_singleton()->free(light);
- VS::get_singleton()->free(light_instance);
- VS::get_singleton()->free(light2);
- VS::get_singleton()->free(light_instance2);
- VS::get_singleton()->free(camera);
- VS::get_singleton()->free(scenario);
+ RS::get_singleton()->free(viewport);
+ RS::get_singleton()->free(light);
+ RS::get_singleton()->free(light_instance);
+ RS::get_singleton()->free(light2);
+ RS::get_singleton()->free(light_instance2);
+ RS::get_singleton()->free(camera);
+ RS::get_singleton()->free(scenario);
return textures;
}
@@ -157,17 +153,14 @@ void EditorInterface::set_main_screen_editor(const String &p_name) {
}
Control *EditorInterface::get_editor_viewport() {
-
return EditorNode::get_singleton()->get_viewport();
}
void EditorInterface::edit_resource(const Ref<Resource> &p_resource) {
-
EditorNode::get_singleton()->edit_resource(p_resource);
}
void EditorInterface::open_scene_from_path(const String &scene_path) {
-
if (EditorNode::get_singleton()->is_changing_scene()) {
return;
}
@@ -176,7 +169,6 @@ void EditorInterface::open_scene_from_path(const String &scene_path) {
}
void EditorInterface::reload_scene_from_path(const String &scene_path) {
-
if (EditorNode::get_singleton()->is_changing_scene()) {
return;
}
@@ -184,19 +176,43 @@ void EditorInterface::reload_scene_from_path(const String &scene_path) {
EditorNode::get_singleton()->reload_scene(scene_path);
}
+void EditorInterface::play_main_scene() {
+ EditorNode::get_singleton()->run_play();
+}
+
+void EditorInterface::play_current_scene() {
+ EditorNode::get_singleton()->run_play_current();
+}
+
+void EditorInterface::play_custom_scene(const String &scene_path) {
+ EditorNode::get_singleton()->run_play_custom(scene_path);
+}
+
+void EditorInterface::stop_playing_scene() {
+ EditorNode::get_singleton()->run_stop();
+}
+
+bool EditorInterface::is_playing_scene() const {
+ return EditorNode::get_singleton()->is_run_playing();
+}
+
+String EditorInterface::get_playing_scene() const {
+ return EditorNode::get_singleton()->get_run_playing_scene();
+}
+
Node *EditorInterface::get_edited_scene_root() {
return EditorNode::get_singleton()->get_edited_scene();
}
Array EditorInterface::get_open_scenes() const {
-
Array ret;
Vector<EditorData::EditedScene> scenes = EditorNode::get_editor_data().get_edited_scenes();
int scns_amount = scenes.size();
for (int idx_scn = 0; idx_scn < scns_amount; idx_scn++) {
- if (scenes[idx_scn].root == NULL)
+ if (scenes[idx_scn].root == nullptr) {
continue;
+ }
ret.push_back(scenes[idx_scn].root->get_filename());
}
return ret;
@@ -219,7 +235,6 @@ String EditorInterface::get_current_path() const {
}
void EditorInterface::inspect_object(Object *p_obj, const String &p_for_property) {
-
EditorNode::get_singleton()->push_item(p_obj, p_for_property);
}
@@ -227,6 +242,10 @@ EditorFileSystem *EditorInterface::get_resource_file_system() {
return EditorFileSystem::get_singleton();
}
+FileSystemDock *EditorInterface::get_file_system_dock() {
+ return EditorNode::get_singleton()->get_filesystem_dock();
+}
+
EditorSelection *EditorInterface::get_selection() {
return EditorNode::get_singleton()->get_editor_selection();
}
@@ -240,7 +259,6 @@ EditorResourcePreview *EditorInterface::get_resource_previewer() {
}
Control *EditorInterface::get_base_control() {
-
return EditorNode::get_singleton()->get_gui_base();
}
@@ -257,17 +275,18 @@ EditorInspector *EditorInterface::get_inspector() const {
}
Error EditorInterface::save_scene() {
- if (!get_edited_scene_root())
+ if (!get_edited_scene_root()) {
return ERR_CANT_CREATE;
- if (get_edited_scene_root()->get_filename() == String())
+ }
+ if (get_edited_scene_root()->get_filename() == String()) {
return ERR_CANT_CREATE;
+ }
save_scene_as(get_edited_scene_root()->get_filename());
return OK;
}
void EditorInterface::save_scene_as(const String &p_scene, bool p_with_preview) {
-
EditorNode::get_singleton()->save_scene_to_path(p_scene, p_with_preview);
}
@@ -275,10 +294,13 @@ void EditorInterface::set_distraction_free_mode(bool p_enter) {
EditorNode::get_singleton()->set_distraction_free_mode(p_enter);
}
-EditorInterface *EditorInterface::singleton = NULL;
+bool EditorInterface::is_distraction_free_mode_enabled() const {
+ return EditorNode::get_singleton()->is_distraction_free_mode_enabled();
+}
+
+EditorInterface *EditorInterface::singleton = nullptr;
void EditorInterface::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("inspect_object", "object", "for_property"), &EditorInterface::inspect_object, DEFVAL(String()));
ClassDB::bind_method(D_METHOD("get_selection"), &EditorInterface::get_selection);
ClassDB::bind_method(D_METHOD("get_editor_settings"), &EditorInterface::get_editor_settings);
@@ -287,6 +309,12 @@ void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("edit_resource", "resource"), &EditorInterface::edit_resource);
ClassDB::bind_method(D_METHOD("open_scene_from_path", "scene_filepath"), &EditorInterface::open_scene_from_path);
ClassDB::bind_method(D_METHOD("reload_scene_from_path", "scene_filepath"), &EditorInterface::reload_scene_from_path);
+ ClassDB::bind_method(D_METHOD("play_main_scene"), &EditorInterface::play_main_scene);
+ ClassDB::bind_method(D_METHOD("play_current_scene"), &EditorInterface::play_current_scene);
+ ClassDB::bind_method(D_METHOD("play_custom_scene", "scene_filepath"), &EditorInterface::play_custom_scene);
+ ClassDB::bind_method(D_METHOD("stop_playing_scene"), &EditorInterface::stop_playing_scene);
+ ClassDB::bind_method(D_METHOD("is_playing_scene"), &EditorInterface::is_playing_scene);
+ ClassDB::bind_method(D_METHOD("get_playing_scene"), &EditorInterface::get_playing_scene);
ClassDB::bind_method(D_METHOD("get_open_scenes"), &EditorInterface::get_open_scenes);
ClassDB::bind_method(D_METHOD("get_edited_scene_root"), &EditorInterface::get_edited_scene_root);
ClassDB::bind_method(D_METHOD("get_resource_previewer"), &EditorInterface::get_resource_previewer);
@@ -296,6 +324,7 @@ void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("select_file", "file"), &EditorInterface::select_file);
ClassDB::bind_method(D_METHOD("get_selected_path"), &EditorInterface::get_selected_path);
ClassDB::bind_method(D_METHOD("get_current_path"), &EditorInterface::get_current_path);
+ ClassDB::bind_method(D_METHOD("get_file_system_dock"), &EditorInterface::get_file_system_dock);
ClassDB::bind_method(D_METHOD("set_plugin_enabled", "plugin", "enabled"), &EditorInterface::set_plugin_enabled);
ClassDB::bind_method(D_METHOD("is_plugin_enabled", "plugin"), &EditorInterface::is_plugin_enabled);
@@ -307,6 +336,9 @@ void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_main_screen_editor", "name"), &EditorInterface::set_main_screen_editor);
ClassDB::bind_method(D_METHOD("set_distraction_free_mode", "enter"), &EditorInterface::set_distraction_free_mode);
+ ClassDB::bind_method(D_METHOD("is_distraction_free_mode_enabled"), &EditorInterface::is_distraction_free_mode_enabled);
+
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "distraction_free_mode"), "set_distraction_free_mode", "is_distraction_free_mode_enabled");
}
EditorInterface::EditorInterface() {
@@ -314,13 +346,11 @@ EditorInterface::EditorInterface() {
}
///////////////////////////////////////////
-void EditorPlugin::add_custom_type(const String &p_type, const String &p_base, const Ref<Script> &p_script, const Ref<Texture> &p_icon) {
-
+void EditorPlugin::add_custom_type(const String &p_type, const String &p_base, const Ref<Script> &p_script, const Ref<Texture2D> &p_icon) {
EditorNode::get_editor_data().add_custom_type(p_type, p_base, p_script, p_icon);
}
void EditorPlugin::remove_custom_type(const String &p_type) {
-
EditorNode::get_editor_data().remove_custom_type(p_type);
}
@@ -332,25 +362,22 @@ void EditorPlugin::remove_autoload_singleton(const String &p_name) {
EditorNode::get_singleton()->get_project_settings()->get_autoload_settings()->autoload_remove(p_name);
}
-ToolButton *EditorPlugin::add_control_to_bottom_panel(Control *p_control, const String &p_title) {
- ERR_FAIL_NULL_V(p_control, NULL);
+Button *EditorPlugin::add_control_to_bottom_panel(Control *p_control, const String &p_title) {
+ ERR_FAIL_NULL_V(p_control, nullptr);
return EditorNode::get_singleton()->add_bottom_panel_item(p_title, p_control);
}
void EditorPlugin::add_control_to_dock(DockSlot p_slot, Control *p_control) {
-
ERR_FAIL_NULL(p_control);
EditorNode::get_singleton()->add_control_to_dock(EditorNode::DockSlot(p_slot), p_control);
}
void EditorPlugin::remove_control_from_docks(Control *p_control) {
-
ERR_FAIL_NULL(p_control);
EditorNode::get_singleton()->remove_control_from_dock(p_control);
}
void EditorPlugin::remove_control_from_bottom_panel(Control *p_control) {
-
ERR_FAIL_NULL(p_control);
EditorNode::get_singleton()->remove_bottom_panel_item(p_control);
}
@@ -359,69 +386,56 @@ void EditorPlugin::add_control_to_container(CustomControlContainer p_location, C
ERR_FAIL_NULL(p_control);
switch (p_location) {
-
case CONTAINER_TOOLBAR: {
-
EditorNode::get_menu_hb()->add_child(p_control);
} break;
case CONTAINER_SPATIAL_EDITOR_MENU: {
-
- SpatialEditor::get_singleton()->add_control_to_menu_panel(p_control);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(p_control);
} break;
case CONTAINER_SPATIAL_EDITOR_SIDE_LEFT: {
-
- SpatialEditor::get_singleton()->get_palette_split()->add_child(p_control);
- SpatialEditor::get_singleton()->get_palette_split()->move_child(p_control, 0);
+ Node3DEditor::get_singleton()->get_palette_split()->add_child(p_control);
+ Node3DEditor::get_singleton()->get_palette_split()->move_child(p_control, 0);
} break;
case CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT: {
-
- SpatialEditor::get_singleton()->get_palette_split()->add_child(p_control);
- SpatialEditor::get_singleton()->get_palette_split()->move_child(p_control, 1);
+ Node3DEditor::get_singleton()->get_palette_split()->add_child(p_control);
+ Node3DEditor::get_singleton()->get_palette_split()->move_child(p_control, 1);
} break;
case CONTAINER_SPATIAL_EDITOR_BOTTOM: {
-
- SpatialEditor::get_singleton()->get_shader_split()->add_child(p_control);
+ Node3DEditor::get_singleton()->get_shader_split()->add_child(p_control);
} break;
case CONTAINER_CANVAS_EDITOR_MENU: {
-
CanvasItemEditor::get_singleton()->add_control_to_menu_panel(p_control);
} break;
case CONTAINER_CANVAS_EDITOR_SIDE_LEFT: {
-
CanvasItemEditor::get_singleton()->get_palette_split()->add_child(p_control);
CanvasItemEditor::get_singleton()->get_palette_split()->move_child(p_control, 0);
} break;
case CONTAINER_CANVAS_EDITOR_SIDE_RIGHT: {
-
CanvasItemEditor::get_singleton()->get_palette_split()->add_child(p_control);
CanvasItemEditor::get_singleton()->get_palette_split()->move_child(p_control, 1);
} break;
case CONTAINER_CANVAS_EDITOR_BOTTOM: {
-
CanvasItemEditor::get_singleton()->get_bottom_split()->add_child(p_control);
} break;
case CONTAINER_PROPERTY_EDITOR_BOTTOM: {
-
EditorNode::get_singleton()->get_inspector_dock_addon_area()->add_child(p_control);
} break;
case CONTAINER_PROJECT_SETTING_TAB_LEFT: {
-
ProjectSettingsEditor::get_singleton()->get_tabs()->add_child(p_control);
ProjectSettingsEditor::get_singleton()->get_tabs()->move_child(p_control, 0);
} break;
case CONTAINER_PROJECT_SETTING_TAB_RIGHT: {
-
ProjectSettingsEditor::get_singleton()->get_tabs()->add_child(p_control);
ProjectSettingsEditor::get_singleton()->get_tabs()->move_child(p_control, 1);
@@ -433,52 +447,42 @@ void EditorPlugin::remove_control_from_container(CustomControlContainer p_locati
ERR_FAIL_NULL(p_control);
switch (p_location) {
-
case CONTAINER_TOOLBAR: {
-
EditorNode::get_menu_hb()->remove_child(p_control);
} break;
case CONTAINER_SPATIAL_EDITOR_MENU: {
-
- SpatialEditor::get_singleton()->remove_control_from_menu_panel(p_control);
+ Node3DEditor::get_singleton()->remove_control_from_menu_panel(p_control);
} break;
case CONTAINER_SPATIAL_EDITOR_SIDE_LEFT:
case CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT: {
-
- SpatialEditor::get_singleton()->get_palette_split()->remove_child(p_control);
+ Node3DEditor::get_singleton()->get_palette_split()->remove_child(p_control);
} break;
case CONTAINER_SPATIAL_EDITOR_BOTTOM: {
-
- SpatialEditor::get_singleton()->get_shader_split()->remove_child(p_control);
+ Node3DEditor::get_singleton()->get_shader_split()->remove_child(p_control);
} break;
case CONTAINER_CANVAS_EDITOR_MENU: {
-
CanvasItemEditor::get_singleton()->remove_control_from_menu_panel(p_control);
} break;
case CONTAINER_CANVAS_EDITOR_SIDE_LEFT:
case CONTAINER_CANVAS_EDITOR_SIDE_RIGHT: {
-
CanvasItemEditor::get_singleton()->get_palette_split()->remove_child(p_control);
} break;
case CONTAINER_CANVAS_EDITOR_BOTTOM: {
-
CanvasItemEditor::get_singleton()->get_bottom_split()->remove_child(p_control);
} break;
case CONTAINER_PROPERTY_EDITOR_BOTTOM: {
-
EditorNode::get_singleton()->get_inspector_dock_addon_area()->remove_child(p_control);
} break;
case CONTAINER_PROJECT_SETTING_TAB_LEFT:
case CONTAINER_PROJECT_SETTING_TAB_RIGHT: {
-
ProjectSettingsEditor::get_singleton()->get_tabs()->remove_child(p_control);
} break;
@@ -517,9 +521,9 @@ void EditorPlugin::notify_scene_changed(const Node *scn_root) {
}
void EditorPlugin::notify_main_screen_changed(const String &screen_name) {
-
- if (screen_name == last_main_screen_name)
+ if (screen_name == last_main_screen_name) {
return;
+ }
emit_signal("main_screen_changed", screen_name);
last_main_screen_name = screen_name;
@@ -534,7 +538,6 @@ void EditorPlugin::notify_resource_saved(const Ref<Resource> &p_resource) {
}
bool EditorPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
-
if (get_script_instance() && get_script_instance()->has_method("forward_canvas_gui_input")) {
return get_script_instance()->call("forward_canvas_gui_input", p_event);
}
@@ -542,14 +545,12 @@ bool EditorPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
}
void EditorPlugin::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
if (get_script_instance() && get_script_instance()->has_method("forward_canvas_draw_over_viewport")) {
get_script_instance()->call("forward_canvas_draw_over_viewport", p_overlay);
}
}
void EditorPlugin::forward_canvas_force_draw_over_viewport(Control *p_overlay) {
-
if (get_script_instance() && get_script_instance()->has_method("forward_canvas_force_draw_over_viewport")) {
get_script_instance()->call("forward_canvas_force_draw_over_viewport", p_overlay);
}
@@ -557,11 +558,10 @@ void EditorPlugin::forward_canvas_force_draw_over_viewport(Control *p_overlay) {
// Updates the overlays of the 2D viewport or, if in 3D mode, of every 3D viewport.
int EditorPlugin::update_overlays() const {
-
- if (SpatialEditor::get_singleton()->is_visible()) {
+ if (Node3DEditor::get_singleton()->is_visible()) {
int count = 0;
- for (uint32_t i = 0; i < SpatialEditor::VIEWPORTS_COUNT; i++) {
- SpatialEditorViewport *vp = SpatialEditor::get_singleton()->get_editor_viewport(i);
+ for (uint32_t i = 0; i < Node3DEditor::VIEWPORTS_COUNT; i++) {
+ Node3DEditorViewport *vp = Node3DEditor::get_singleton()->get_editor_viewport(i);
if (vp->is_visible()) {
vp->update_surface();
count++;
@@ -575,8 +575,7 @@ int EditorPlugin::update_overlays() const {
}
}
-bool EditorPlugin::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event) {
-
+bool EditorPlugin::forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) {
if (get_script_instance() && get_script_instance()->has_method("forward_spatial_gui_input")) {
return get_script_instance()->call("forward_spatial_gui_input", p_camera, p_event);
}
@@ -585,51 +584,48 @@ bool EditorPlugin::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEv
}
void EditorPlugin::forward_spatial_draw_over_viewport(Control *p_overlay) {
-
if (get_script_instance() && get_script_instance()->has_method("forward_spatial_draw_over_viewport")) {
get_script_instance()->call("forward_spatial_draw_over_viewport", p_overlay);
}
}
void EditorPlugin::forward_spatial_force_draw_over_viewport(Control *p_overlay) {
-
if (get_script_instance() && get_script_instance()->has_method("forward_spatial_force_draw_over_viewport")) {
get_script_instance()->call("forward_spatial_force_draw_over_viewport", p_overlay);
}
}
-String EditorPlugin::get_name() const {
+String EditorPlugin::get_name() const {
if (get_script_instance() && get_script_instance()->has_method("get_plugin_name")) {
return get_script_instance()->call("get_plugin_name");
}
return String();
}
-const Ref<Texture> EditorPlugin::get_icon() const {
+const Ref<Texture2D> EditorPlugin::get_icon() const {
if (get_script_instance() && get_script_instance()->has_method("get_plugin_icon")) {
return get_script_instance()->call("get_plugin_icon");
}
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
-bool EditorPlugin::has_main_screen() const {
+bool EditorPlugin::has_main_screen() const {
if (get_script_instance() && get_script_instance()->has_method("has_main_screen")) {
return get_script_instance()->call("has_main_screen");
}
return false;
}
-void EditorPlugin::make_visible(bool p_visible) {
+void EditorPlugin::make_visible(bool p_visible) {
if (get_script_instance() && get_script_instance()->has_method("make_visible")) {
get_script_instance()->call("make_visible", p_visible);
}
}
void EditorPlugin::edit(Object *p_object) {
-
if (get_script_instance() && get_script_instance()->has_method("edit")) {
if (p_object->is_class("Resource")) {
get_script_instance()->call("edit", Ref<Resource>(Object::cast_to<Resource>(p_object)));
@@ -640,15 +636,14 @@ void EditorPlugin::edit(Object *p_object) {
}
bool EditorPlugin::handles(Object *p_object) const {
-
if (get_script_instance() && get_script_instance()->has_method("handles")) {
return get_script_instance()->call("handles", p_object);
}
return false;
}
-Dictionary EditorPlugin::get_state() const {
+Dictionary EditorPlugin::get_state() const {
if (get_script_instance() && get_script_instance()->has_method("get_state")) {
return get_script_instance()->call("get_state");
}
@@ -657,14 +652,12 @@ Dictionary EditorPlugin::get_state() const {
}
void EditorPlugin::set_state(const Dictionary &p_state) {
-
if (get_script_instance() && get_script_instance()->has_method("set_state")) {
get_script_instance()->call("set_state", p_state);
}
}
void EditorPlugin::clear() {
-
if (get_script_instance() && get_script_instance()->has_method("clear")) {
get_script_instance()->call("clear");
}
@@ -672,7 +665,6 @@ void EditorPlugin::clear() {
// if editor references external resources/scenes, save them
void EditorPlugin::save_external_data() {
-
if (get_script_instance() && get_script_instance()->has_method("save_external_data")) {
get_script_instance()->call("save_external_data");
}
@@ -680,28 +672,35 @@ void EditorPlugin::save_external_data() {
// if changes are pending in editor, apply them
void EditorPlugin::apply_changes() {
-
if (get_script_instance() && get_script_instance()->has_method("apply_changes")) {
get_script_instance()->call("apply_changes");
}
}
void EditorPlugin::get_breakpoints(List<String> *p_breakpoints) {
-
if (get_script_instance() && get_script_instance()->has_method("get_breakpoints")) {
- PoolStringArray arr = get_script_instance()->call("get_breakpoints");
- for (int i = 0; i < arr.size(); i++)
+ PackedStringArray arr = get_script_instance()->call("get_breakpoints");
+ for (int i = 0; i < arr.size(); i++) {
p_breakpoints->push_back(arr[i]);
+ }
}
}
-bool EditorPlugin::get_remove_list(List<Node *> *p_list) {
+bool EditorPlugin::get_remove_list(List<Node *> *p_list) {
return false;
}
void EditorPlugin::restore_global_state() {}
void EditorPlugin::save_global_state() {}
+void EditorPlugin::add_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser) {
+ EditorTranslationParser::get_singleton()->add_parser(p_parser, EditorTranslationParser::CUSTOM);
+}
+
+void EditorPlugin::remove_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser) {
+ EditorTranslationParser::get_singleton()->remove_parser(p_parser, EditorTranslationParser::CUSTOM);
+}
+
void EditorPlugin::add_import_plugin(const Ref<EditorImportPlugin> &p_importer) {
ResourceFormatImporter::get_singleton()->add_importer(p_importer);
EditorFileSystem::get_singleton()->call_deferred("scan");
@@ -720,12 +719,12 @@ void EditorPlugin::remove_export_plugin(const Ref<EditorExportPlugin> &p_exporte
EditorExport::get_singleton()->remove_export_plugin(p_exporter);
}
-void EditorPlugin::add_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin) {
- SpatialEditor::get_singleton()->add_gizmo_plugin(p_gizmo_plugin);
+void EditorPlugin::add_spatial_gizmo_plugin(const Ref<EditorNode3DGizmoPlugin> &p_gizmo_plugin) {
+ Node3DEditor::get_singleton()->add_gizmo_plugin(p_gizmo_plugin);
}
-void EditorPlugin::remove_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin) {
- SpatialEditor::get_singleton()->remove_gizmo_plugin(p_gizmo_plugin);
+void EditorPlugin::remove_spatial_gizmo_plugin(const Ref<EditorNode3DGizmoPlugin> &p_gizmo_plugin) {
+ Node3DEditor::get_singleton()->remove_gizmo_plugin(p_gizmo_plugin);
}
void EditorPlugin::add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin) {
@@ -744,8 +743,8 @@ void EditorPlugin::remove_scene_import_plugin(const Ref<EditorSceneImporter> &p_
ResourceImporterScene::get_singleton()->remove_importer(p_importer);
}
-int find(const PoolStringArray &a, const String &v) {
- PoolStringArray::Read r = a.read();
+int find(const PackedStringArray &a, const String &v) {
+ const String *r = a.ptr();
for (int j = 0; j < a.size(); ++j) {
if (r[j] == v) {
return j;
@@ -773,21 +772,18 @@ void EditorPlugin::disable_plugin() {
}
void EditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) {
-
if (get_script_instance() && get_script_instance()->has_method("set_window_layout")) {
get_script_instance()->call("set_window_layout", p_layout);
}
}
void EditorPlugin::get_window_layout(Ref<ConfigFile> p_layout) {
-
if (get_script_instance() && get_script_instance()->has_method("get_window_layout")) {
get_script_instance()->call("get_window_layout", p_layout);
}
}
bool EditorPlugin::build() {
-
if (get_script_instance() && get_script_instance()->has_method("build")) {
return get_script_instance()->call("build");
}
@@ -796,17 +792,14 @@ bool EditorPlugin::build() {
}
void EditorPlugin::queue_save_layout() const {
-
EditorNode::get_singleton()->save_layout();
}
void EditorPlugin::make_bottom_panel_item_visible(Control *p_item) {
-
EditorNode::get_singleton()->make_bottom_panel_item_visible(p_item);
}
void EditorPlugin::hide_bottom_panel() {
-
EditorNode::get_singleton()->hide_bottom_panel();
}
@@ -818,8 +811,15 @@ ScriptCreateDialog *EditorPlugin::get_script_create_dialog() {
return EditorNode::get_singleton()->get_script_create_dialog();
}
-void EditorPlugin::_bind_methods() {
+void EditorPlugin::add_debugger_plugin(const Ref<Script> &p_script) {
+ EditorDebuggerNode::get_singleton()->add_debugger_plugin(p_script);
+}
+void EditorPlugin::remove_debugger_plugin(const Ref<Script> &p_script) {
+ EditorDebuggerNode::get_singleton()->remove_debugger_plugin(p_script);
+}
+
+void EditorPlugin::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_control_to_container", "container", "control"), &EditorPlugin::add_control_to_container);
ClassDB::bind_method(D_METHOD("add_control_to_bottom_panel", "control", "title"), &EditorPlugin::add_control_to_bottom_panel);
ClassDB::bind_method(D_METHOD("add_control_to_dock", "slot", "control"), &EditorPlugin::add_control_to_dock);
@@ -842,6 +842,8 @@ void EditorPlugin::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_undo_redo"), &EditorPlugin::_get_undo_redo);
ClassDB::bind_method(D_METHOD("queue_save_layout"), &EditorPlugin::queue_save_layout);
+ ClassDB::bind_method(D_METHOD("add_translation_parser_plugin", "parser"), &EditorPlugin::add_translation_parser_plugin);
+ ClassDB::bind_method(D_METHOD("remove_translation_parser_plugin", "parser"), &EditorPlugin::remove_translation_parser_plugin);
ClassDB::bind_method(D_METHOD("add_import_plugin", "importer"), &EditorPlugin::add_import_plugin);
ClassDB::bind_method(D_METHOD("remove_import_plugin", "importer"), &EditorPlugin::remove_import_plugin);
ClassDB::bind_method(D_METHOD("add_scene_import_plugin", "scene_importer"), &EditorPlugin::add_scene_import_plugin);
@@ -857,13 +859,15 @@ void EditorPlugin::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_editor_interface"), &EditorPlugin::get_editor_interface);
ClassDB::bind_method(D_METHOD("get_script_create_dialog"), &EditorPlugin::get_script_create_dialog);
+ ClassDB::bind_method(D_METHOD("add_debugger_plugin", "script"), &EditorPlugin::add_debugger_plugin);
+ ClassDB::bind_method(D_METHOD("remove_debugger_plugin", "script"), &EditorPlugin::remove_debugger_plugin);
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_canvas_gui_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_canvas_draw_over_viewport", PropertyInfo(Variant::OBJECT, "overlay", PROPERTY_HINT_RESOURCE_TYPE, "Control")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_canvas_force_draw_over_viewport", PropertyInfo(Variant::OBJECT, "overlay", PROPERTY_HINT_RESOURCE_TYPE, "Control")));
- ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_spatial_gui_input", PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_spatial_gui_input", PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera3D"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_plugin_name"));
- ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::OBJECT, "get_plugin_icon"));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(PropertyInfo(Variant::OBJECT, "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "get_plugin_icon"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "has_main_screen"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("make_visible", PropertyInfo(Variant::BOOL, "visible")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("edit", PropertyInfo(Variant::OBJECT, "object")));
@@ -873,7 +877,7 @@ void EditorPlugin::_bind_methods() {
ClassDB::add_virtual_method(get_class_static(), MethodInfo("clear"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("save_external_data"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("apply_changes"));
- ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::POOL_STRING_ARRAY, "get_breakpoints"));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::PACKED_STRING_ARRAY, "get_breakpoints"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("set_window_layout", PropertyInfo(Variant::OBJECT, "layout", PROPERTY_HINT_RESOURCE_TYPE, "ConfigFile")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("get_window_layout", PropertyInfo(Variant::OBJECT, "layout", PROPERTY_HINT_RESOURCE_TYPE, "ConfigFile")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "build"));
@@ -909,16 +913,6 @@ void EditorPlugin::_bind_methods() {
BIND_ENUM_CONSTANT(DOCK_SLOT_MAX);
}
-EditorPlugin::EditorPlugin() :
- undo_redo(NULL),
- input_event_forwarding_always_enabled(false),
- force_draw_over_forwarding_enabled(false),
- last_main_screen_name("") {
-}
-
-EditorPlugin::~EditorPlugin() {
-}
-
EditorPluginCreateFunc EditorPlugins::creation_funcs[MAX_CREATE_FUNCS];
int EditorPlugins::creation_func_count = 0;
diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h
index 1a78b72ade..c7803f73c9 100644
--- a/editor/editor_plugin.h
+++ b/editor/editor_plugin.h
@@ -33,26 +33,28 @@
#include "core/io/config_file.h"
#include "core/undo_redo.h"
+#include "editor/debugger/editor_debugger_node.h"
#include "editor/editor_inspector.h"
+#include "editor/editor_translation_parser.h"
#include "editor/import/editor_import_plugin.h"
#include "editor/import/resource_importer_scene.h"
#include "editor/script_create_dialog.h"
-#include "scene/gui/tool_button.h"
#include "scene/main/node.h"
#include "scene/resources/texture.h"
class EditorNode;
-class Spatial;
-class Camera;
+class Node3D;
+class Camera3D;
class EditorSelection;
class EditorExport;
class EditorSettings;
class EditorImportPlugin;
class EditorExportPlugin;
-class EditorSpatialGizmoPlugin;
+class EditorNode3DGizmoPlugin;
class EditorResourcePreview;
class EditorFileSystem;
class EditorToolAddons;
+class FileSystemDock;
class ScriptEditor;
class EditorInterface : public Node {
@@ -72,6 +74,13 @@ public:
void open_scene_from_path(const String &scene_path);
void reload_scene_from_path(const String &scene_path);
+ void play_main_scene();
+ void play_current_scene();
+ void play_custom_scene(const String &scene_path);
+ void stop_playing_scene();
+ bool is_playing_scene() const;
+ String get_playing_scene() const;
+
Node *get_edited_scene_root();
Array get_open_scenes() const;
ScriptEditor *get_script_editor();
@@ -88,6 +97,8 @@ public:
EditorResourcePreview *get_resource_previewer();
EditorFileSystem *get_resource_file_system();
+ FileSystemDock *get_file_system_dock();
+
Control *get_base_control();
void set_plugin_enabled(const String &p_plugin, bool p_enabled);
@@ -98,24 +109,24 @@ public:
Error save_scene();
void save_scene_as(const String &p_scene, bool p_with_preview = true);
- Vector<Ref<Texture> > make_mesh_previews(const Vector<Ref<Mesh> > &p_meshes, Vector<Transform> *p_transforms, int p_preview_size);
+ Vector<Ref<Texture2D>> make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform> *p_transforms, int p_preview_size);
void set_main_screen_editor(const String &p_name);
void set_distraction_free_mode(bool p_enter);
+ bool is_distraction_free_mode_enabled() const;
EditorInterface();
};
class EditorPlugin : public Node {
-
GDCLASS(EditorPlugin, Node);
friend class EditorData;
- UndoRedo *undo_redo;
+ UndoRedo *undo_redo = nullptr;
UndoRedo *_get_undo_redo() { return undo_redo; }
- bool input_event_forwarding_always_enabled;
- bool force_draw_over_forwarding_enabled;
+ bool input_event_forwarding_always_enabled = false;
+ bool force_draw_over_forwarding_enabled = false;
String last_main_screen_name;
@@ -123,7 +134,7 @@ protected:
static void _bind_methods();
UndoRedo &get_undo_redo() { return *undo_redo; }
- void add_custom_type(const String &p_type, const String &p_base, const Ref<Script> &p_script, const Ref<Texture> &p_icon);
+ void add_custom_type(const String &p_type, const String &p_base, const Ref<Script> &p_script, const Ref<Texture2D> &p_icon);
void remove_custom_type(const String &p_type);
public:
@@ -158,7 +169,7 @@ public:
void add_control_to_container(CustomControlContainer p_location, Control *p_control);
void remove_control_from_container(CustomControlContainer p_location, Control *p_control);
- ToolButton *add_control_to_bottom_panel(Control *p_control, const String &p_title);
+ Button *add_control_to_bottom_panel(Control *p_control, const String &p_title);
void add_control_to_dock(DockSlot p_slot, Control *p_control);
void remove_control_from_docks(Control *p_control);
void remove_control_from_bottom_panel(Control *p_control);
@@ -182,12 +193,12 @@ public:
virtual void forward_canvas_draw_over_viewport(Control *p_overlay);
virtual void forward_canvas_force_draw_over_viewport(Control *p_overlay);
- virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event);
+ virtual bool forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event);
virtual void forward_spatial_draw_over_viewport(Control *p_overlay);
virtual void forward_spatial_force_draw_over_viewport(Control *p_overlay);
virtual String get_name() const;
- virtual const Ref<Texture> get_icon() const;
+ virtual const Ref<Texture2D> get_icon() const;
virtual bool has_main_screen() const;
virtual void make_visible(bool p_visible);
virtual void selected_notify() {} //notify that it was raised by the user, not the editor
@@ -218,14 +229,17 @@ public:
virtual void restore_global_state();
virtual void save_global_state();
+ void add_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser);
+ void remove_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser);
+
void add_import_plugin(const Ref<EditorImportPlugin> &p_importer);
void remove_import_plugin(const Ref<EditorImportPlugin> &p_importer);
void add_export_plugin(const Ref<EditorExportPlugin> &p_exporter);
void remove_export_plugin(const Ref<EditorExportPlugin> &p_exporter);
- void add_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin);
- void remove_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin);
+ void add_spatial_gizmo_plugin(const Ref<EditorNode3DGizmoPlugin> &p_gizmo_plugin);
+ void remove_spatial_gizmo_plugin(const Ref<EditorNode3DGizmoPlugin> &p_gizmo_plugin);
void add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin);
void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin);
@@ -236,11 +250,14 @@ public:
void add_autoload_singleton(const String &p_name, const String &p_path);
void remove_autoload_singleton(const String &p_name);
+ void add_debugger_plugin(const Ref<Script> &p_script);
+ void remove_debugger_plugin(const Ref<Script> &p_script);
+
void enable_plugin();
void disable_plugin();
- EditorPlugin();
- virtual ~EditorPlugin();
+ EditorPlugin() {}
+ virtual ~EditorPlugin() {}
};
VARIANT_ENUM_CAST(EditorPlugin::CustomControlContainer);
@@ -249,7 +266,6 @@ VARIANT_ENUM_CAST(EditorPlugin::DockSlot);
typedef EditorPlugin *(*EditorPluginCreateFunc)(EditorNode *);
class EditorPlugins {
-
enum {
MAX_CREATE_FUNCS = 64
};
@@ -265,7 +281,7 @@ class EditorPlugins {
public:
static int get_plugin_count() { return creation_func_count; }
static EditorPlugin *create(int p_idx, EditorNode *p_editor) {
- ERR_FAIL_INDEX_V(p_idx, creation_func_count, NULL);
+ ERR_FAIL_INDEX_V(p_idx, creation_func_count, nullptr);
return creation_funcs[p_idx](p_editor);
}
@@ -275,7 +291,6 @@ public:
}
static void add_create_func(EditorPluginCreateFunc p_func) {
-
ERR_FAIL_COND(creation_func_count >= MAX_CREATE_FUNCS);
creation_funcs[creation_func_count++] = p_func;
}
diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp
index b81a996956..fe49198e8f 100644
--- a/editor/editor_plugin_settings.cpp
+++ b/editor/editor_plugin_settings.cpp
@@ -39,17 +39,15 @@
#include "scene/gui/margin_container.h"
void EditorPluginSettings::_notification(int p_what) {
-
- if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_IN) {
+ if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) {
update_plugins();
} else if (p_what == Node::NOTIFICATION_READY) {
- plugin_config_dialog->connect("plugin_ready", EditorNode::get_singleton(), "_on_plugin_ready");
- plugin_list->connect("button_pressed", this, "_cell_button_pressed");
+ plugin_config_dialog->connect_compat("plugin_ready", EditorNode::get_singleton(), "_on_plugin_ready");
+ plugin_list->connect("button_pressed", callable_mp(this, &EditorPluginSettings::_cell_button_pressed));
}
}
void EditorPluginSettings::update_plugins() {
-
plugin_list->clear();
DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
@@ -70,12 +68,10 @@ void EditorPluginSettings::update_plugins() {
Vector<String> plugins;
while (d != String()) {
-
bool dir = da->current_is_dir();
String path = "res://addons/" + d + "/plugin.cfg";
if (dir && FileAccess::exists(path)) {
-
plugins.push_back(d);
}
@@ -88,7 +84,6 @@ void EditorPluginSettings::update_plugins() {
plugins.sort();
for (int i = 0; i < plugins.size(); i++) {
-
Ref<ConfigFile> cf;
cf.instance();
String path = "res://addons/" + plugins[i] + "/plugin.cfg";
@@ -96,28 +91,28 @@ void EditorPluginSettings::update_plugins() {
Error err2 = cf->load(path);
if (err2 != OK) {
- WARN_PRINTS("Can't load plugin config: " + path);
+ WARN_PRINT("Can't load plugin config: " + path);
} else {
bool key_missing = false;
if (!cf->has_section_key("plugin", "name")) {
- WARN_PRINTS("Plugin config misses \"plugin/name\" key: " + path);
+ WARN_PRINT("Plugin config misses \"plugin/name\" key: " + path);
key_missing = true;
}
if (!cf->has_section_key("plugin", "author")) {
- WARN_PRINTS("Plugin config misses \"plugin/author\" key: " + path);
+ WARN_PRINT("Plugin config misses \"plugin/author\" key: " + path);
key_missing = true;
}
if (!cf->has_section_key("plugin", "version")) {
- WARN_PRINTS("Plugin config misses \"plugin/version\" key: " + path);
+ WARN_PRINT("Plugin config misses \"plugin/version\" key: " + path);
key_missing = true;
}
if (!cf->has_section_key("plugin", "description")) {
- WARN_PRINTS("Plugin config misses \"plugin/description\" key: " + path);
+ WARN_PRINT("Plugin config misses \"plugin/description\" key: " + path);
key_missing = true;
}
if (!cf->has_section_key("plugin", "script")) {
- WARN_PRINTS("Plugin config misses \"plugin/script\" key: " + path);
+ WARN_PRINT("Plugin config misses \"plugin/script\" key: " + path);
key_missing = true;
}
@@ -137,19 +132,12 @@ void EditorPluginSettings::update_plugins() {
item->set_metadata(1, script);
item->set_text(2, author);
item->set_metadata(2, description);
- item->set_cell_mode(3, TreeItem::CELL_MODE_RANGE);
- item->set_range_config(3, 0, 1, 1);
- item->set_text(3, "Inactive,Active");
+ item->set_cell_mode(3, TreeItem::CELL_MODE_CHECK);
+ item->set_text(3, TTR("Enable"));
+ bool is_active = EditorNode::get_singleton()->is_addon_plugin_enabled(d2);
+ item->set_checked(3, is_active);
item->set_editable(3, true);
- item->add_button(4, get_icon("Edit", "EditorIcons"), BUTTON_PLUGIN_EDIT, false, TTR("Edit Plugin"));
-
- if (EditorNode::get_singleton()->is_addon_plugin_enabled(d2)) {
- item->set_custom_color(3, get_color("success_color", "Editor"));
- item->set_range(3, 1);
- } else {
- item->set_custom_color(3, get_color("disabled_font_color", "Editor"));
- item->set_range(3, 0);
- }
+ item->add_button(4, get_theme_icon("Edit", "EditorIcons"), BUTTON_PLUGIN_EDIT, false, TTR("Edit Plugin"));
}
}
}
@@ -158,13 +146,13 @@ void EditorPluginSettings::update_plugins() {
}
void EditorPluginSettings::_plugin_activity_changed() {
-
- if (updating)
+ if (updating) {
return;
+ }
TreeItem *ti = plugin_list->get_edited();
ERR_FAIL_COND(!ti);
- bool active = ti->get_range(3);
+ bool active = ti->is_checked(3);
String name = ti->get_metadata(0);
EditorNode::get_singleton()->set_addon_plugin_enabled(name, active, true);
@@ -173,14 +161,9 @@ void EditorPluginSettings::_plugin_activity_changed() {
if (is_active != active) {
updating = true;
- ti->set_range(3, is_active ? 1 : 0);
+ ti->set_checked(3, is_active);
updating = false;
}
-
- if (is_active)
- ti->set_custom_color(3, get_color("success_color", "Editor"));
- else
- ti->set_custom_color(3, get_color("disabled_font_color", "Editor"));
}
void EditorPluginSettings::_create_clicked() {
@@ -190,8 +173,9 @@ void EditorPluginSettings::_create_clicked() {
void EditorPluginSettings::_cell_button_pressed(Object *p_item, int p_column, int p_id) {
TreeItem *item = Object::cast_to<TreeItem>(p_item);
- if (!item)
+ if (!item) {
return;
+ }
if (p_id == BUTTON_PLUGIN_EDIT) {
if (p_column == 4) {
String dir = item->get_metadata(0);
@@ -202,15 +186,9 @@ void EditorPluginSettings::_cell_button_pressed(Object *p_item, int p_column, in
}
void EditorPluginSettings::_bind_methods() {
-
- ClassDB::bind_method("update_plugins", &EditorPluginSettings::update_plugins);
- ClassDB::bind_method("_create_clicked", &EditorPluginSettings::_create_clicked);
- ClassDB::bind_method("_plugin_activity_changed", &EditorPluginSettings::_plugin_activity_changed);
- ClassDB::bind_method("_cell_button_pressed", &EditorPluginSettings::_cell_button_pressed);
}
EditorPluginSettings::EditorPluginSettings() {
-
plugin_config_dialog = memnew(PluginConfigDialog);
plugin_config_dialog->config("");
add_child(plugin_config_dialog);
@@ -219,10 +197,10 @@ EditorPluginSettings::EditorPluginSettings() {
title_hb->add_child(memnew(Label(TTR("Installed Plugins:"))));
title_hb->add_spacer();
create_plugin = memnew(Button(TTR("Create")));
- create_plugin->connect("pressed", this, "_create_clicked");
+ create_plugin->connect("pressed", callable_mp(this, &EditorPluginSettings::_create_clicked));
title_hb->add_child(create_plugin);
update_list = memnew(Button(TTR("Update")));
- update_list->connect("pressed", this, "update_plugins");
+ update_list->connect("pressed", callable_mp(this, &EditorPluginSettings::update_plugins));
title_hb->add_child(update_list);
add_child(title_hb);
@@ -245,7 +223,7 @@ EditorPluginSettings::EditorPluginSettings() {
plugin_list->set_column_min_width(3, 80 * EDSCALE);
plugin_list->set_column_min_width(4, 40 * EDSCALE);
plugin_list->set_hide_root(true);
- plugin_list->connect("item_edited", this, "_plugin_activity_changed");
+ plugin_list->connect("item_edited", callable_mp(this, &EditorPluginSettings::_plugin_activity_changed));
VBoxContainer *mc = memnew(VBoxContainer);
mc->add_child(plugin_list);
diff --git a/editor/editor_plugin_settings.h b/editor/editor_plugin_settings.h
index 63a8395805..ceb00eb12f 100644
--- a/editor/editor_plugin_settings.h
+++ b/editor/editor_plugin_settings.h
@@ -38,7 +38,6 @@
#include "scene/gui/dialogs.h"
class EditorPluginSettings : public VBoxContainer {
-
GDCLASS(EditorPluginSettings, VBoxContainer);
enum {
diff --git a/editor/editor_profiler.cpp b/editor/editor_profiler.cpp
deleted file mode 100644
index 3fdeaff19d..0000000000
--- a/editor/editor_profiler.cpp
+++ /dev/null
@@ -1,785 +0,0 @@
-/*************************************************************************/
-/* editor_profiler.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "editor_profiler.h"
-
-#include "core/os/os.h"
-#include "editor_scale.h"
-#include "editor_settings.h"
-
-void EditorProfiler::_make_metric_ptrs(Metric &m) {
-
- for (int i = 0; i < m.categories.size(); i++) {
- m.category_ptrs[m.categories[i].signature] = &m.categories.write[i];
- for (int j = 0; j < m.categories[i].items.size(); j++) {
- m.item_ptrs[m.categories[i].items[j].signature] = &m.categories.write[i].items.write[j];
- }
- }
-}
-
-void EditorProfiler::add_frame_metric(const Metric &p_metric, bool p_final) {
-
- ++last_metric;
- if (last_metric >= frame_metrics.size())
- last_metric = 0;
-
- frame_metrics.write[last_metric] = p_metric;
- _make_metric_ptrs(frame_metrics.write[last_metric]);
-
- updating_frame = true;
- cursor_metric_edit->set_max(frame_metrics[last_metric].frame_number);
- cursor_metric_edit->set_min(MAX(frame_metrics[last_metric].frame_number - frame_metrics.size(), 0));
-
- if (!seeking) {
- cursor_metric_edit->set_value(frame_metrics[last_metric].frame_number);
- if (hover_metric != -1) {
- hover_metric++;
- if (hover_metric >= frame_metrics.size()) {
- hover_metric = 0;
- }
- }
- }
- updating_frame = false;
-
- if (frame_delay->is_stopped()) {
-
- frame_delay->set_wait_time(p_final ? 0.1 : 1);
- frame_delay->start();
- }
-
- if (plot_delay->is_stopped()) {
- plot_delay->set_wait_time(0.1);
- plot_delay->start();
- }
-}
-
-void EditorProfiler::clear() {
-
- int metric_size = EditorSettings::get_singleton()->get("debugger/profiler_frame_history_size");
- metric_size = CLAMP(metric_size, 60, 1024);
- frame_metrics.clear();
- frame_metrics.resize(metric_size);
- last_metric = -1;
- variables->clear();
- plot_sigs.clear();
- plot_sigs.insert("physics_frame_time");
- plot_sigs.insert("category_frame_time");
-
- updating_frame = true;
- cursor_metric_edit->set_min(0);
- cursor_metric_edit->set_max(100); // Doesn't make much sense, but we can't have min == max. Doesn't hurt.
- cursor_metric_edit->set_value(0);
- updating_frame = false;
- hover_metric = -1;
- seeking = false;
-}
-
-static String _get_percent_txt(float p_value, float p_total) {
- if (p_total == 0) {
- p_total = 0.00001;
- }
-
- return String::num((p_value / p_total) * 100, 1) + "%";
-}
-
-String EditorProfiler::_get_time_as_text(const Metric &m, float p_time, int p_calls) {
-
- const int dmode = display_mode->get_selected();
-
- if (dmode == DISPLAY_FRAME_TIME) {
- return rtos(p_time * 1000).pad_decimals(2) + " ms";
- } else if (dmode == DISPLAY_AVERAGE_TIME) {
- if (p_calls == 0) {
- return "0.00 ms";
- } else {
- return rtos((p_time / p_calls) * 1000).pad_decimals(2) + " ms";
- }
- } else if (dmode == DISPLAY_FRAME_PERCENT) {
- return _get_percent_txt(p_time, m.frame_time);
- } else if (dmode == DISPLAY_PHYSICS_FRAME_PERCENT) {
- return _get_percent_txt(p_time, m.physics_frame_time);
- }
-
- return "err";
-}
-
-Color EditorProfiler::_get_color_from_signature(const StringName &p_signature) const {
-
- Color bc = get_color("error_color", "Editor");
- double rot = ABS(double(p_signature.hash()) / double(0x7FFFFFFF));
- Color c;
- c.set_hsv(rot, bc.get_s(), bc.get_v());
- return c.linear_interpolate(get_color("base_color", "Editor"), 0.07);
-}
-
-void EditorProfiler::_item_edited() {
-
- if (updating_frame)
- return;
-
- TreeItem *item = variables->get_edited();
- if (!item)
- return;
- StringName signature = item->get_metadata(0);
- bool checked = item->is_checked(0);
-
- if (checked)
- plot_sigs.insert(signature);
- else
- plot_sigs.erase(signature);
-
- if (!frame_delay->is_processing()) {
- frame_delay->set_wait_time(0.1);
- frame_delay->start();
- }
-
- _update_plot();
-}
-
-void EditorProfiler::_update_plot() {
-
- int w = graph->get_size().width;
- int h = graph->get_size().height;
-
- bool reset_texture = false;
-
- int desired_len = w * h * 4;
-
- if (graph_image.size() != desired_len) {
- reset_texture = true;
- graph_image.resize(desired_len);
- }
-
- PoolVector<uint8_t>::Write wr = graph_image.write();
-
- //clear
- for (int i = 0; i < desired_len; i += 4) {
- wr[i + 0] = 0;
- wr[i + 1] = 0;
- wr[i + 2] = 0;
- wr[i + 3] = 255;
- }
-
- //find highest value
-
- bool use_self = display_time->get_selected() == DISPLAY_SELF_TIME;
- float highest = 0;
-
- for (int i = 0; i < frame_metrics.size(); i++) {
- const Metric &m = frame_metrics[i];
- if (!m.valid)
- continue;
-
- for (Set<StringName>::Element *E = plot_sigs.front(); E; E = E->next()) {
-
- const Map<StringName, Metric::Category *>::Element *F = m.category_ptrs.find(E->get());
- if (F) {
- highest = MAX(F->get()->total_time, highest);
- }
-
- const Map<StringName, Metric::Category::Item *>::Element *G = m.item_ptrs.find(E->get());
- if (G) {
- if (use_self) {
- highest = MAX(G->get()->self, highest);
- } else {
- highest = MAX(G->get()->total, highest);
- }
- }
- }
- }
-
- if (highest > 0) {
- //means some data exists..
- highest *= 1.2; //leave some upper room
- graph_height = highest;
-
- Vector<int> columnv;
- columnv.resize(h * 4);
-
- int *column = columnv.ptrw();
-
- Map<StringName, int> plot_prev;
- //Map<StringName,int> plot_max;
-
- for (int i = 0; i < w; i++) {
-
- for (int j = 0; j < h * 4; j++) {
- column[j] = 0;
- }
-
- int current = i * frame_metrics.size() / w;
- int next = (i + 1) * frame_metrics.size() / w;
- if (next > frame_metrics.size()) {
- next = frame_metrics.size();
- }
- if (next == current)
- next = current + 1; //just because for loop must work
-
- for (Set<StringName>::Element *E = plot_sigs.front(); E; E = E->next()) {
-
- int plot_pos = -1;
-
- for (int j = current; j < next; j++) {
-
- //wrap
- int idx = last_metric + 1 + j;
- while (idx >= frame_metrics.size()) {
- idx -= frame_metrics.size();
- }
-
- //get
- const Metric &m = frame_metrics[idx];
- if (!m.valid)
- continue; //skip because invalid
-
- float value = 0;
-
- const Map<StringName, Metric::Category *>::Element *F = m.category_ptrs.find(E->get());
- if (F) {
- value = F->get()->total_time;
- }
-
- const Map<StringName, Metric::Category::Item *>::Element *G = m.item_ptrs.find(E->get());
- if (G) {
- if (use_self) {
- value = G->get()->self;
- } else {
- value = G->get()->total;
- }
- }
-
- plot_pos = MAX(CLAMP(int(value * h / highest), 0, h - 1), plot_pos);
- }
-
- int prev_plot = plot_pos;
- Map<StringName, int>::Element *H = plot_prev.find(E->get());
- if (H) {
- prev_plot = H->get();
- H->get() = plot_pos;
- } else {
- plot_prev[E->get()] = plot_pos;
- }
-
- if (plot_pos == -1 && prev_plot == -1) {
- //don't bother drawing
- continue;
- }
-
- if (prev_plot != -1 && plot_pos == -1) {
-
- plot_pos = prev_plot;
- }
-
- if (prev_plot == -1 && plot_pos != -1) {
- prev_plot = plot_pos;
- }
-
- plot_pos = h - plot_pos - 1;
- prev_plot = h - prev_plot - 1;
-
- if (prev_plot > plot_pos) {
- SWAP(prev_plot, plot_pos);
- }
-
- Color col = _get_color_from_signature(E->get());
-
- for (int j = prev_plot; j <= plot_pos; j++) {
-
- column[j * 4 + 0] += Math::fast_ftoi(CLAMP(col.r * 255, 0, 255));
- column[j * 4 + 1] += Math::fast_ftoi(CLAMP(col.g * 255, 0, 255));
- column[j * 4 + 2] += Math::fast_ftoi(CLAMP(col.b * 255, 0, 255));
- column[j * 4 + 3] += 1;
- }
- }
-
- for (int j = 0; j < h * 4; j += 4) {
-
- int a = column[j + 3];
- if (a > 0) {
- column[j + 0] /= a;
- column[j + 1] /= a;
- column[j + 2] /= a;
- }
-
- uint8_t r = uint8_t(column[j + 0]);
- uint8_t g = uint8_t(column[j + 1]);
- uint8_t b = uint8_t(column[j + 2]);
-
- int widx = ((j >> 2) * w + i) * 4;
- wr[widx + 0] = r;
- wr[widx + 1] = g;
- wr[widx + 2] = b;
- wr[widx + 3] = 255;
- }
- }
- }
-
- wr.release();
-
- Ref<Image> img;
- img.instance();
- img->create(w, h, 0, Image::FORMAT_RGBA8, graph_image);
-
- if (reset_texture) {
-
- if (graph_texture.is_null()) {
- graph_texture.instance();
- }
- graph_texture->create(img->get_width(), img->get_height(), img->get_format(), Texture::FLAG_VIDEO_SURFACE);
- }
-
- graph_texture->set_data(img);
-
- graph->set_texture(graph_texture);
- graph->update();
-}
-
-void EditorProfiler::_update_frame() {
-
- int cursor_metric = _get_cursor_index();
-
- ERR_FAIL_INDEX(cursor_metric, frame_metrics.size());
-
- updating_frame = true;
- variables->clear();
-
- TreeItem *root = variables->create_item();
- const Metric &m = frame_metrics[cursor_metric];
-
- int dtime = display_time->get_selected();
-
- for (int i = 0; i < m.categories.size(); i++) {
-
- TreeItem *category = variables->create_item(root);
- category->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
- category->set_editable(0, true);
- category->set_metadata(0, m.categories[i].signature);
- category->set_text(0, String(m.categories[i].name));
- category->set_text(1, _get_time_as_text(m, m.categories[i].total_time, 1));
-
- if (plot_sigs.has(m.categories[i].signature)) {
- category->set_checked(0, true);
- category->set_custom_color(0, _get_color_from_signature(m.categories[i].signature));
- }
-
- for (int j = m.categories[i].items.size() - 1; j >= 0; j--) {
- const Metric::Category::Item &it = m.categories[i].items[j];
-
- TreeItem *item = variables->create_item(category);
- item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
- item->set_editable(0, true);
- item->set_text(0, it.name);
- item->set_metadata(0, it.signature);
- item->set_metadata(1, it.script);
- item->set_metadata(2, it.line);
- item->set_text_align(2, TreeItem::ALIGN_RIGHT);
- item->set_tooltip(0, it.script + ":" + itos(it.line));
-
- float time = dtime == DISPLAY_SELF_TIME ? it.self : it.total;
-
- item->set_text(1, _get_time_as_text(m, time, it.calls));
-
- item->set_text(2, itos(it.calls));
-
- if (plot_sigs.has(it.signature)) {
- item->set_checked(0, true);
- item->set_custom_color(0, _get_color_from_signature(it.signature));
- }
- }
- }
-
- updating_frame = false;
-}
-
-void EditorProfiler::_activate_pressed() {
-
- if (activate->is_pressed()) {
- activate->set_icon(get_icon("Stop", "EditorIcons"));
- activate->set_text(TTR("Stop"));
- } else {
- activate->set_icon(get_icon("Play", "EditorIcons"));
- activate->set_text(TTR("Start"));
- }
- emit_signal("enable_profiling", activate->is_pressed());
-}
-
-void EditorProfiler::_clear_pressed() {
-
- clear();
- _update_plot();
-}
-
-void EditorProfiler::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
- activate->set_icon(get_icon("Play", "EditorIcons"));
- clear_button->set_icon(get_icon("Clear", "EditorIcons"));
- }
-}
-
-void EditorProfiler::_graph_tex_draw() {
-
- if (last_metric < 0)
- return;
- if (seeking) {
-
- int max_frames = frame_metrics.size();
- int frame = cursor_metric_edit->get_value() - (frame_metrics[last_metric].frame_number - max_frames + 1);
- if (frame < 0)
- frame = 0;
-
- int cur_x = frame * graph->get_size().x / max_frames;
-
- graph->draw_line(Vector2(cur_x, 0), Vector2(cur_x, graph->get_size().y), Color(1, 1, 1, 0.8));
- }
-
- if (hover_metric != -1 && frame_metrics[hover_metric].valid) {
-
- int max_frames = frame_metrics.size();
- int frame = frame_metrics[hover_metric].frame_number - (frame_metrics[last_metric].frame_number - max_frames + 1);
- if (frame < 0)
- frame = 0;
-
- int cur_x = frame * graph->get_size().x / max_frames;
-
- graph->draw_line(Vector2(cur_x, 0), Vector2(cur_x, graph->get_size().y), Color(1, 1, 1, 0.4));
- }
-}
-
-void EditorProfiler::_graph_tex_mouse_exit() {
-
- hover_metric = -1;
- graph->update();
-}
-
-void EditorProfiler::_cursor_metric_changed(double) {
- if (updating_frame)
- return;
-
- graph->update();
- _update_frame();
-}
-
-void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) {
-
- if (last_metric < 0)
- return;
-
- Ref<InputEventMouse> me = p_ev;
- Ref<InputEventMouseButton> mb = p_ev;
- Ref<InputEventMouseMotion> mm = p_ev;
-
- if (
- (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) ||
- (mm.is_valid())) {
-
- int x = me->get_position().x;
- x = x * frame_metrics.size() / graph->get_size().width;
-
- bool show_hover = x >= 0 && x < frame_metrics.size();
-
- if (x < 0) {
- x = 0;
- }
-
- if (x >= frame_metrics.size()) {
- x = frame_metrics.size() - 1;
- }
-
- int metric = frame_metrics.size() - x - 1;
- metric = last_metric - metric;
- while (metric < 0) {
- metric += frame_metrics.size();
- }
-
- if (show_hover) {
-
- hover_metric = metric;
-
- } else {
- hover_metric = -1;
- }
-
- if (mb.is_valid() || mm->get_button_mask() & BUTTON_MASK_LEFT) {
- //cursor_metric=x;
- updating_frame = true;
-
- //metric may be invalid, so look for closest metric that is valid, this makes snap feel better
- bool valid = false;
- for (int i = 0; i < frame_metrics.size(); i++) {
-
- if (frame_metrics[metric].valid) {
- valid = true;
- break;
- }
-
- metric++;
- if (metric >= frame_metrics.size())
- metric = 0;
- }
-
- if (valid)
- cursor_metric_edit->set_value(frame_metrics[metric].frame_number);
-
- updating_frame = false;
-
- if (activate->is_pressed()) {
- if (!seeking) {
- emit_signal("break_request");
- }
- }
-
- seeking = true;
-
- if (!frame_delay->is_processing()) {
- frame_delay->set_wait_time(0.1);
- frame_delay->start();
- }
- }
-
- graph->update();
- }
-}
-
-int EditorProfiler::_get_cursor_index() const {
-
- if (last_metric < 0)
- return 0;
- if (!frame_metrics[last_metric].valid)
- return 0;
-
- int diff = (frame_metrics[last_metric].frame_number - cursor_metric_edit->get_value());
-
- int idx = last_metric - diff;
- while (idx < 0) {
- idx += frame_metrics.size();
- }
-
- return idx;
-}
-
-void EditorProfiler::disable_seeking() {
-
- seeking = false;
- graph->update();
-}
-
-void EditorProfiler::_combo_changed(int) {
-
- _update_frame();
- _update_plot();
-}
-
-void EditorProfiler::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_update_frame"), &EditorProfiler::_update_frame);
- ClassDB::bind_method(D_METHOD("_update_plot"), &EditorProfiler::_update_plot);
- ClassDB::bind_method(D_METHOD("_activate_pressed"), &EditorProfiler::_activate_pressed);
- ClassDB::bind_method(D_METHOD("_clear_pressed"), &EditorProfiler::_clear_pressed);
- ClassDB::bind_method(D_METHOD("_graph_tex_draw"), &EditorProfiler::_graph_tex_draw);
- ClassDB::bind_method(D_METHOD("_graph_tex_input"), &EditorProfiler::_graph_tex_input);
- ClassDB::bind_method(D_METHOD("_graph_tex_mouse_exit"), &EditorProfiler::_graph_tex_mouse_exit);
- ClassDB::bind_method(D_METHOD("_cursor_metric_changed"), &EditorProfiler::_cursor_metric_changed);
- ClassDB::bind_method(D_METHOD("_combo_changed"), &EditorProfiler::_combo_changed);
-
- ClassDB::bind_method(D_METHOD("_item_edited"), &EditorProfiler::_item_edited);
- ADD_SIGNAL(MethodInfo("enable_profiling", PropertyInfo(Variant::BOOL, "enable")));
- ADD_SIGNAL(MethodInfo("break_request"));
-}
-
-void EditorProfiler::set_enabled(bool p_enable) {
-
- activate->set_disabled(!p_enable);
-}
-
-bool EditorProfiler::is_profiling() {
- return activate->is_pressed();
-}
-
-Vector<Vector<String> > EditorProfiler::get_data_as_csv() const {
- Vector<Vector<String> > res;
-
- if (frame_metrics.empty()) {
- return res;
- }
-
- // signatures
- Vector<String> signatures;
- const Vector<EditorProfiler::Metric::Category> &categories = frame_metrics[0].categories;
-
- for (int j = 0; j < categories.size(); j++) {
-
- const EditorProfiler::Metric::Category &c = categories[j];
- signatures.push_back(c.signature);
-
- for (int k = 0; k < c.items.size(); k++) {
- signatures.push_back(c.items[k].signature);
- }
- }
- res.push_back(signatures);
-
- // values
- Vector<String> values;
- values.resize(signatures.size());
-
- int index = last_metric;
-
- for (int i = 0; i < frame_metrics.size(); i++) {
-
- ++index;
-
- if (index >= frame_metrics.size()) {
- index = 0;
- }
-
- if (!frame_metrics[index].valid) {
- continue;
- }
- int it = 0;
- const Vector<EditorProfiler::Metric::Category> &frame_cat = frame_metrics[index].categories;
-
- for (int j = 0; j < frame_cat.size(); j++) {
-
- const EditorProfiler::Metric::Category &c = frame_cat[j];
- values.write[it++] = String::num_real(c.total_time);
-
- for (int k = 0; k < c.items.size(); k++) {
- values.write[it++] = String::num_real(c.items[k].total);
- }
- }
- res.push_back(values);
- }
-
- return res;
-}
-
-EditorProfiler::EditorProfiler() {
-
- HBoxContainer *hb = memnew(HBoxContainer);
- add_child(hb);
- activate = memnew(Button);
- activate->set_toggle_mode(true);
- activate->set_text(TTR("Start"));
- activate->connect("pressed", this, "_activate_pressed");
- hb->add_child(activate);
-
- clear_button = memnew(Button);
- clear_button->set_text(TTR("Clear"));
- clear_button->connect("pressed", this, "_clear_pressed");
- hb->add_child(clear_button);
-
- hb->add_child(memnew(Label(TTR("Measure:"))));
-
- display_mode = memnew(OptionButton);
- display_mode->add_item(TTR("Frame Time (sec)"));
- display_mode->add_item(TTR("Average Time (sec)"));
- display_mode->add_item(TTR("Frame %"));
- display_mode->add_item(TTR("Physics Frame %"));
- display_mode->connect("item_selected", this, "_combo_changed");
-
- hb->add_child(display_mode);
-
- hb->add_child(memnew(Label(TTR("Time:"))));
-
- display_time = memnew(OptionButton);
- display_time->add_item(TTR("Inclusive"));
- display_time->add_item(TTR("Self"));
- display_time->connect("item_selected", this, "_combo_changed");
-
- hb->add_child(display_time);
-
- hb->add_spacer();
-
- hb->add_child(memnew(Label(TTR("Frame #:"))));
-
- cursor_metric_edit = memnew(SpinBox);
- cursor_metric_edit->set_h_size_flags(SIZE_FILL);
- hb->add_child(cursor_metric_edit);
- cursor_metric_edit->connect("value_changed", this, "_cursor_metric_changed");
-
- hb->add_constant_override("separation", 8 * EDSCALE);
-
- h_split = memnew(HSplitContainer);
- add_child(h_split);
- h_split->set_v_size_flags(SIZE_EXPAND_FILL);
-
- variables = memnew(Tree);
- variables->set_custom_minimum_size(Size2(320, 0) * EDSCALE);
- variables->set_hide_folding(true);
- h_split->add_child(variables);
- variables->set_hide_root(true);
- variables->set_columns(3);
- variables->set_column_titles_visible(true);
- variables->set_column_title(0, TTR("Name"));
- variables->set_column_expand(0, true);
- variables->set_column_min_width(0, 60 * EDSCALE);
- variables->set_column_title(1, TTR("Time"));
- variables->set_column_expand(1, false);
- variables->set_column_min_width(1, 100 * EDSCALE);
- variables->set_column_title(2, TTR("Calls"));
- variables->set_column_expand(2, false);
- variables->set_column_min_width(2, 60 * EDSCALE);
- variables->connect("item_edited", this, "_item_edited");
-
- graph = memnew(TextureRect);
- graph->set_expand(true);
- graph->set_mouse_filter(MOUSE_FILTER_STOP);
- graph->connect("draw", this, "_graph_tex_draw");
- graph->connect("gui_input", this, "_graph_tex_input");
- graph->connect("mouse_exited", this, "_graph_tex_mouse_exit");
-
- h_split->add_child(graph);
- graph->set_h_size_flags(SIZE_EXPAND_FILL);
-
- int metric_size = CLAMP(int(EDITOR_DEF("debugger/profiler_frame_history_size", 600)), 60, 1024);
- frame_metrics.resize(metric_size);
- last_metric = -1;
- hover_metric = -1;
-
- EDITOR_DEF("debugger/profiler_frame_max_functions", 64);
-
- frame_delay = memnew(Timer);
- frame_delay->set_wait_time(0.1);
- frame_delay->set_one_shot(true);
- add_child(frame_delay);
- frame_delay->connect("timeout", this, "_update_frame");
-
- plot_delay = memnew(Timer);
- plot_delay->set_wait_time(0.1);
- plot_delay->set_one_shot(true);
- add_child(plot_delay);
- plot_delay->connect("timeout", this, "_update_plot");
-
- plot_sigs.insert("physics_frame_time");
- plot_sigs.insert("category_frame_time");
-
- seeking = false;
- graph_height = 1;
-}
diff --git a/editor/editor_profiler.h b/editor/editor_profiler.h
deleted file mode 100644
index f8accdf6d2..0000000000
--- a/editor/editor_profiler.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/*************************************************************************/
-/* editor_profiler.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef EDITORPROFILER_H
-#define EDITORPROFILER_H
-
-#include "scene/gui/box_container.h"
-#include "scene/gui/button.h"
-#include "scene/gui/label.h"
-#include "scene/gui/option_button.h"
-#include "scene/gui/spin_box.h"
-#include "scene/gui/split_container.h"
-#include "scene/gui/texture_rect.h"
-#include "scene/gui/tree.h"
-
-class EditorProfiler : public VBoxContainer {
-
- GDCLASS(EditorProfiler, VBoxContainer);
-
-public:
- struct Metric {
-
- bool valid;
-
- int frame_number;
- float frame_time;
- float idle_time;
- float physics_time;
- float physics_frame_time;
-
- struct Category {
-
- StringName signature;
- String name;
- float total_time; //total for category
-
- struct Item {
-
- StringName signature;
- String name;
- String script;
- int line;
- float self;
- float total;
- int calls;
- };
-
- Vector<Item> items;
- };
-
- Vector<Category> categories;
-
- Map<StringName, Category *> category_ptrs;
- Map<StringName, Category::Item *> item_ptrs;
-
- Metric() {
- valid = false;
- frame_number = 0;
- }
- };
-
- enum DisplayMode {
- DISPLAY_FRAME_TIME,
- DISPLAY_AVERAGE_TIME,
- DISPLAY_FRAME_PERCENT,
- DISPLAY_PHYSICS_FRAME_PERCENT,
- };
-
- enum DisplayTime {
- DISPLAY_TOTAL_TIME,
- DISPLAY_SELF_TIME,
- };
-
-private:
- Button *activate;
- Button *clear_button;
- TextureRect *graph;
- Ref<ImageTexture> graph_texture;
- PoolVector<uint8_t> graph_image;
- Tree *variables;
- HSplitContainer *h_split;
-
- Set<StringName> plot_sigs;
-
- OptionButton *display_mode;
- OptionButton *display_time;
-
- SpinBox *cursor_metric_edit;
-
- Vector<Metric> frame_metrics;
- int last_metric;
-
- int max_functions;
-
- bool updating_frame;
-
- //int cursor_metric;
- int hover_metric;
-
- float graph_height;
-
- bool seeking;
-
- Timer *frame_delay;
- Timer *plot_delay;
-
- void _update_frame();
-
- void _activate_pressed();
- void _clear_pressed();
-
- String _get_time_as_text(const Metric &m, float p_time, int p_calls);
-
- void _make_metric_ptrs(Metric &m);
- void _item_edited();
-
- void _update_plot();
-
- void _graph_tex_mouse_exit();
-
- void _graph_tex_draw();
- void _graph_tex_input(const Ref<InputEvent> &p_ev);
-
- int _get_cursor_index() const;
-
- Color _get_color_from_signature(const StringName &p_signature) const;
-
- void _cursor_metric_changed(double);
-
- void _combo_changed(int);
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void add_frame_metric(const Metric &p_metric, bool p_final = false);
- void set_enabled(bool p_enable);
- bool is_profiling();
- bool is_seeking() { return seeking; }
- void disable_seeking();
-
- void clear();
-
- Vector<Vector<String> > get_data_as_csv() const;
-
- EditorProfiler();
-};
-
-#endif // EDITORPROFILER_H
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp
index c134786b89..4c8af615b4 100644
--- a/editor/editor_properties.cpp
+++ b/editor/editor_properties.cpp
@@ -35,7 +35,8 @@
#include "editor_node.h"
#include "editor_properties_array_dict.h"
#include "editor_scale.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
+#include "scene/resources/dynamic_font.h"
///////////////////// NULL /////////////////////////
@@ -51,8 +52,9 @@ EditorPropertyNil::EditorPropertyNil() {
///////////////////// TEXT /////////////////////////
void EditorPropertyText::_text_entered(const String &p_string) {
- if (updating)
+ if (updating) {
return;
+ }
if (text->has_focus()) {
text->release_focus();
@@ -61,10 +63,15 @@ void EditorPropertyText::_text_entered(const String &p_string) {
}
void EditorPropertyText::_text_changed(const String &p_string) {
- if (updating)
+ if (updating) {
return;
+ }
- emit_changed(get_edited_property(), p_string, "", true);
+ if (string_name) {
+ emit_changed(get_edited_property(), StringName(p_string), "", true);
+ } else {
+ emit_changed(get_edited_property(), p_string, "", true);
+ }
}
void EditorPropertyText::update_property() {
@@ -75,23 +82,25 @@ void EditorPropertyText::update_property() {
updating = false;
}
+void EditorPropertyText::set_string_name(bool p_enabled) {
+ string_name = p_enabled;
+}
+
void EditorPropertyText::set_placeholder(const String &p_string) {
text->set_placeholder(p_string);
}
void EditorPropertyText::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_text_changed", "txt"), &EditorPropertyText::_text_changed);
- ClassDB::bind_method(D_METHOD("_text_entered", "txt"), &EditorPropertyText::_text_entered);
}
EditorPropertyText::EditorPropertyText() {
text = memnew(LineEdit);
add_child(text);
add_focusable(text);
- text->connect("text_changed", this, "_text_changed");
- text->connect("text_entered", this, "_text_entered");
+ text->connect("text_changed", callable_mp(this, &EditorPropertyText::_text_changed));
+ text->connect("text_entered", callable_mp(this, &EditorPropertyText::_text_entered));
+ string_name = false;
updating = false;
}
@@ -107,10 +116,9 @@ void EditorPropertyMultilineText::_text_changed() {
}
void EditorPropertyMultilineText::_open_big_text() {
-
if (!big_text_dialog) {
big_text = memnew(TextEdit);
- big_text->connect("text_changed", this, "_big_text_changed");
+ big_text->connect("text_changed", callable_mp(this, &EditorPropertyMultilineText::_big_text_changed));
big_text->set_wrap_enabled(true);
big_text_dialog = memnew(AcceptDialog);
big_text_dialog->add_child(big_text);
@@ -135,9 +143,9 @@ void EditorPropertyMultilineText::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_THEME_CHANGED:
case NOTIFICATION_ENTER_TREE: {
- Ref<Texture> df = get_icon("DistractionFree", "EditorIcons");
+ Ref<Texture2D> df = get_theme_icon("DistractionFree", "EditorIcons");
open_big_text->set_icon(df);
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
text->set_custom_minimum_size(Vector2(0, font->get_height() * 6));
} break;
@@ -145,10 +153,6 @@ void EditorPropertyMultilineText::_notification(int p_what) {
}
void EditorPropertyMultilineText::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_text_changed"), &EditorPropertyMultilineText::_text_changed);
- ClassDB::bind_method(D_METHOD("_big_text_changed"), &EditorPropertyMultilineText::_big_text_changed);
- ClassDB::bind_method(D_METHOD("_open_big_text"), &EditorPropertyMultilineText::_open_big_text);
}
EditorPropertyMultilineText::EditorPropertyMultilineText() {
@@ -156,27 +160,30 @@ EditorPropertyMultilineText::EditorPropertyMultilineText() {
add_child(hb);
set_bottom_editor(hb);
text = memnew(TextEdit);
- text->connect("text_changed", this, "_text_changed");
+ text->connect("text_changed", callable_mp(this, &EditorPropertyMultilineText::_text_changed));
text->set_wrap_enabled(true);
add_focusable(text);
hb->add_child(text);
text->set_h_size_flags(SIZE_EXPAND_FILL);
- open_big_text = memnew(ToolButton);
- open_big_text->connect("pressed", this, "_open_big_text");
+ open_big_text = memnew(Button);
+ open_big_text->set_flat(true);
+ open_big_text->connect("pressed", callable_mp(this, &EditorPropertyMultilineText::_open_big_text));
hb->add_child(open_big_text);
- big_text_dialog = NULL;
- big_text = NULL;
+ big_text_dialog = nullptr;
+ big_text = nullptr;
}
///////////////////// TEXT ENUM /////////////////////////
void EditorPropertyTextEnum::_option_selected(int p_which) {
-
- emit_changed(get_edited_property(), options->get_item_text(p_which));
+ if (string_name) {
+ emit_changed(get_edited_property(), StringName(options->get_item_text(p_which)));
+ } else {
+ emit_changed(get_edited_property(), options->get_item_text(p_which));
+ }
}
void EditorPropertyTextEnum::update_property() {
-
String which = get_edited_object()->get(get_edited_property());
for (int i = 0; i < options->get_item_count(); i++) {
String t = options->get_item_text(i);
@@ -187,39 +194,39 @@ void EditorPropertyTextEnum::update_property() {
}
}
-void EditorPropertyTextEnum::setup(const Vector<String> &p_options) {
+void EditorPropertyTextEnum::setup(const Vector<String> &p_options, bool p_string_name) {
for (int i = 0; i < p_options.size(); i++) {
options->add_item(p_options[i], i);
}
+ string_name = p_string_name;
}
void EditorPropertyTextEnum::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_option_selected"), &EditorPropertyTextEnum::_option_selected);
}
EditorPropertyTextEnum::EditorPropertyTextEnum() {
options = memnew(OptionButton);
options->set_clip_text(true);
options->set_flat(true);
+ string_name = false;
add_child(options);
add_focusable(options);
- options->connect("item_selected", this, "_option_selected");
+ options->connect("item_selected", callable_mp(this, &EditorPropertyTextEnum::_option_selected));
}
+
///////////////////// PATH /////////////////////////
void EditorPropertyPath::_path_selected(const String &p_path) {
-
emit_changed(get_edited_property(), p_path);
update_property();
}
-void EditorPropertyPath::_path_pressed() {
+void EditorPropertyPath::_path_pressed() {
if (!dialog) {
dialog = memnew(EditorFileDialog);
- dialog->connect("file_selected", this, "_path_selected");
- dialog->connect("dir_selected", this, "_path_selected");
+ dialog->connect("file_selected", callable_mp(this, &EditorPropertyPath::_path_selected));
+ dialog->connect("dir_selected", callable_mp(this, &EditorPropertyPath::_path_selected));
add_child(dialog);
}
@@ -234,10 +241,10 @@ void EditorPropertyPath::_path_pressed() {
}
if (folder) {
- dialog->set_mode(EditorFileDialog::MODE_OPEN_DIR);
+ dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR);
dialog->set_current_dir(full_path);
} else {
- dialog->set_mode(save_mode ? EditorFileDialog::MODE_SAVE_FILE : EditorFileDialog::MODE_OPEN_FILE);
+ dialog->set_file_mode(save_mode ? EditorFileDialog::FILE_MODE_SAVE_FILE : EditorFileDialog::FILE_MODE_OPEN_FILE);
for (int i = 0; i < extensions.size(); i++) {
String e = extensions[i].strip_edges();
if (e != String()) {
@@ -247,45 +254,36 @@ void EditorPropertyPath::_path_pressed() {
dialog->set_current_path(full_path);
}
- dialog->popup_centered_ratio();
+ dialog->popup_file_dialog();
}
void EditorPropertyPath::update_property() {
-
String full_path = get_edited_object()->get(get_edited_property());
path->set_text(full_path);
path->set_tooltip(full_path);
}
void EditorPropertyPath::setup(const Vector<String> &p_extensions, bool p_folder, bool p_global) {
-
extensions = p_extensions;
folder = p_folder;
global = p_global;
}
void EditorPropertyPath::set_save_mode() {
-
save_mode = true;
}
void EditorPropertyPath::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- path_edit->set_icon(get_icon("Folder", "EditorIcons"));
+ path_edit->set_icon(get_theme_icon("Folder", "EditorIcons"));
}
}
void EditorPropertyPath::_path_focus_exited() {
-
_path_selected(path->get_text());
}
void EditorPropertyPath::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_path_pressed"), &EditorPropertyPath::_path_pressed);
- ClassDB::bind_method(D_METHOD("_path_selected"), &EditorPropertyPath::_path_selected);
- ClassDB::bind_method(D_METHOD("_path_focus_exited"), &EditorPropertyPath::_path_focus_exited);
}
EditorPropertyPath::EditorPropertyPath() {
@@ -293,16 +291,16 @@ EditorPropertyPath::EditorPropertyPath() {
add_child(path_hb);
path = memnew(LineEdit);
path_hb->add_child(path);
- path->connect("text_entered", this, "_path_selected");
- path->connect("focus_exited", this, "_path_focus_exited");
+ path->connect("text_entered", callable_mp(this, &EditorPropertyPath::_path_selected));
+ path->connect("focus_exited", callable_mp(this, &EditorPropertyPath::_path_focus_exited));
path->set_h_size_flags(SIZE_EXPAND_FILL);
path_edit = memnew(Button);
path_edit->set_clip_text(true);
path_hb->add_child(path_edit);
add_focusable(path);
- dialog = NULL;
- path_edit->connect("pressed", this, "_path_pressed");
+ dialog = nullptr;
+ path_edit->connect("pressed", callable_mp(this, &EditorPropertyPath::_path_pressed));
folder = false;
global = false;
save_mode = false;
@@ -311,7 +309,6 @@ EditorPropertyPath::EditorPropertyPath() {
///////////////////// CLASS NAME /////////////////////////
void EditorPropertyClassName::setup(const String &p_base_type, const String &p_selected_type) {
-
base_type = p_base_type;
dialog->set_base_type(base_type);
selected_type = p_selected_type;
@@ -319,7 +316,6 @@ void EditorPropertyClassName::setup(const String &p_base_type, const String &p_s
}
void EditorPropertyClassName::update_property() {
-
String s = get_edited_object()->get(get_edited_property());
property->set_text(s);
selected_type = s;
@@ -336,8 +332,6 @@ void EditorPropertyClassName::_dialog_created() {
}
void EditorPropertyClassName::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_dialog_created"), &EditorPropertyClassName::_dialog_created);
- ClassDB::bind_method(D_METHOD("_property_selected"), &EditorPropertyClassName::_property_selected);
}
EditorPropertyClassName::EditorPropertyClassName() {
@@ -346,87 +340,82 @@ EditorPropertyClassName::EditorPropertyClassName() {
add_child(property);
add_focusable(property);
property->set_text(selected_type);
- property->connect("pressed", this, "_property_selected");
+ property->connect("pressed", callable_mp(this, &EditorPropertyClassName::_property_selected));
dialog = memnew(CreateDialog);
dialog->set_base_type(base_type);
- dialog->connect("create", this, "_dialog_created");
+ dialog->connect("create", callable_mp(this, &EditorPropertyClassName::_dialog_created));
add_child(dialog);
}
///////////////////// MEMBER /////////////////////////
void EditorPropertyMember::_property_selected(const String &p_selected) {
-
emit_changed(get_edited_property(), p_selected);
update_property();
}
void EditorPropertyMember::_property_select() {
-
if (!selector) {
selector = memnew(PropertySelector);
- selector->connect("selected", this, "_property_selected");
+ selector->connect("selected", callable_mp(this, &EditorPropertyMember::_property_selected));
add_child(selector);
}
String current = get_edited_object()->get(get_edited_property());
if (hint == MEMBER_METHOD_OF_VARIANT_TYPE) {
-
Variant::Type type = Variant::NIL;
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
if (hint_text == Variant::get_type_name(Variant::Type(i))) {
type = Variant::Type(i);
}
}
- if (type != Variant::NIL)
+ if (type != Variant::NIL) {
selector->select_method_from_basic_type(type, current);
+ }
} else if (hint == MEMBER_METHOD_OF_BASE_TYPE) {
-
selector->select_method_from_base_type(hint_text, current);
} else if (hint == MEMBER_METHOD_OF_INSTANCE) {
-
- Object *instance = ObjectDB::get_instance(hint_text.to_int64());
- if (instance)
+ Object *instance = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
+ if (instance) {
selector->select_method_from_instance(instance, current);
+ }
} else if (hint == MEMBER_METHOD_OF_SCRIPT) {
-
- Object *obj = ObjectDB::get_instance(hint_text.to_int64());
+ Object *obj = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
if (Object::cast_to<Script>(obj)) {
selector->select_method_from_script(Object::cast_to<Script>(obj), current);
}
} else if (hint == MEMBER_PROPERTY_OF_VARIANT_TYPE) {
-
Variant::Type type = Variant::NIL;
String tname = hint_text;
- if (tname.find(".") != -1)
+ if (tname.find(".") != -1) {
tname = tname.get_slice(".", 0);
+ }
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
if (tname == Variant::get_type_name(Variant::Type(i))) {
type = Variant::Type(Variant::Type(i));
}
}
- if (type != Variant::NIL)
+ if (type != Variant::NIL) {
selector->select_property_from_basic_type(type, current);
+ }
} else if (hint == MEMBER_PROPERTY_OF_BASE_TYPE) {
-
selector->select_property_from_base_type(hint_text, current);
} else if (hint == MEMBER_PROPERTY_OF_INSTANCE) {
-
- Object *instance = ObjectDB::get_instance(hint_text.to_int64());
- if (instance)
+ Object *instance = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
+ if (instance) {
selector->select_property_from_instance(instance, current);
+ }
} else if (hint == MEMBER_PROPERTY_OF_SCRIPT) {
-
- Object *obj = ObjectDB::get_instance(hint_text.to_int64());
+ Object *obj = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
if (Object::cast_to<Script>(obj)) {
selector->select_property_from_script(Object::cast_to<Script>(obj), current);
}
@@ -439,28 +428,24 @@ void EditorPropertyMember::setup(Type p_hint, const String &p_hint_text) {
}
void EditorPropertyMember::update_property() {
-
String full_path = get_edited_object()->get(get_edited_property());
property->set_text(full_path);
}
void EditorPropertyMember::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_property_selected"), &EditorPropertyMember::_property_selected);
- ClassDB::bind_method(D_METHOD("_property_select"), &EditorPropertyMember::_property_select);
}
EditorPropertyMember::EditorPropertyMember() {
- selector = NULL;
+ selector = nullptr;
property = memnew(Button);
property->set_clip_text(true);
add_child(property);
add_focusable(property);
- property->connect("pressed", this, "_property_select");
+ property->connect("pressed", callable_mp(this, &EditorPropertyMember::_property_select));
}
///////////////////// CHECK /////////////////////////
void EditorPropertyCheck::_checkbox_pressed() {
-
emit_changed(get_edited_property(), checkbox->is_pressed());
}
@@ -471,8 +456,6 @@ void EditorPropertyCheck::update_property() {
}
void EditorPropertyCheck::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_checkbox_pressed"), &EditorPropertyCheck::_checkbox_pressed);
}
EditorPropertyCheck::EditorPropertyCheck() {
@@ -480,19 +463,17 @@ EditorPropertyCheck::EditorPropertyCheck() {
checkbox->set_text(TTR("On"));
add_child(checkbox);
add_focusable(checkbox);
- checkbox->connect("pressed", this, "_checkbox_pressed");
+ checkbox->connect("pressed", callable_mp(this, &EditorPropertyCheck::_checkbox_pressed));
}
///////////////////// ENUM /////////////////////////
void EditorPropertyEnum::_option_selected(int p_which) {
-
int64_t val = options->get_item_metadata(p_which);
emit_changed(get_edited_property(), val);
}
void EditorPropertyEnum::update_property() {
-
int64_t which = get_edited_object()->get(get_edited_property());
for (int i = 0; i < options->get_item_count(); i++) {
@@ -504,12 +485,12 @@ void EditorPropertyEnum::update_property() {
}
void EditorPropertyEnum::setup(const Vector<String> &p_options) {
-
int64_t current_val = 0;
for (int i = 0; i < p_options.size(); i++) {
Vector<String> text_split = p_options[i].split(":");
- if (text_split.size() != 1)
- current_val = text_split[1].to_int64();
+ if (text_split.size() != 1) {
+ current_val = text_split[1].to_int();
+ }
options->add_item(text_split[0]);
options->set_item_metadata(i, current_val);
current_val += 1;
@@ -521,8 +502,6 @@ void EditorPropertyEnum::set_option_button_clip(bool p_enable) {
}
void EditorPropertyEnum::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_option_selected"), &EditorPropertyEnum::_option_selected);
}
EditorPropertyEnum::EditorPropertyEnum() {
@@ -531,13 +510,12 @@ EditorPropertyEnum::EditorPropertyEnum() {
options->set_flat(true);
add_child(options);
add_focusable(options);
- options->connect("item_selected", this, "_option_selected");
+ options->connect("item_selected", callable_mp(this, &EditorPropertyEnum::_option_selected));
}
///////////////////// FLAGS /////////////////////////
void EditorPropertyFlags::_flag_toggled() {
-
uint32_t value = 0;
for (int i = 0; i < flags.size(); i++) {
if (flags[i]->is_pressed()) {
@@ -551,14 +529,12 @@ void EditorPropertyFlags::_flag_toggled() {
}
void EditorPropertyFlags::update_property() {
-
uint32_t value = get_edited_object()->get(get_edited_property());
for (int i = 0; i < flags.size(); i++) {
uint32_t val = 1;
val <<= flag_indices[i];
if (value & val) {
-
flags[i]->set_pressed(true);
} else {
flags[i]->set_pressed(false);
@@ -576,7 +552,7 @@ void EditorPropertyFlags::setup(const Vector<String> &p_options) {
CheckBox *cb = memnew(CheckBox);
cb->set_text(option);
cb->set_clip_text(true);
- cb->connect("pressed", this, "_flag_toggled");
+ cb->connect("pressed", callable_mp(this, &EditorPropertyFlags::_flag_toggled));
add_focusable(cb);
vbox->add_child(cb);
flags.push_back(cb);
@@ -590,12 +566,9 @@ void EditorPropertyFlags::setup(const Vector<String> &p_options) {
}
void EditorPropertyFlags::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_flag_toggled"), &EditorPropertyFlags::_flag_toggled);
}
EditorPropertyFlags::EditorPropertyFlags() {
-
vbox = memnew(VBoxContainer);
add_child(vbox);
}
@@ -610,13 +583,14 @@ public:
Vector<Rect2> flag_rects;
Vector<String> names;
Vector<String> tooltips;
+ int hovered_index;
- virtual Size2 get_minimum_size() const {
- Ref<Font> font = get_font("font", "Label");
+ virtual Size2 get_minimum_size() const override {
+ Ref<Font> font = get_theme_font("font", "Label");
return Vector2(0, font->get_height() * 2);
}
- virtual String get_tooltip(const Point2 &p_pos) const {
+ virtual String get_tooltip(const Point2 &p_pos) const override {
for (int i = 0; i < flag_rects.size(); i++) {
if (i < tooltips.size() && flag_rects[i].has_point(p_pos)) {
return tooltips[i];
@@ -625,57 +599,79 @@ public:
return String();
}
void _gui_input(const Ref<InputEvent> &p_ev) {
- Ref<InputEventMouseButton> mb = p_ev;
- if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
+ const Ref<InputEventMouseMotion> mm = p_ev;
+
+ if (mm.is_valid()) {
for (int i = 0; i < flag_rects.size(); i++) {
- if (flag_rects[i].has_point(mb->get_position())) {
- //toggle
- if (value & (1 << i)) {
- value &= ~(1 << i);
- } else {
- value |= (1 << i);
- }
- emit_signal("flag_changed", value);
+ if (flag_rects[i].has_point(mm->get_position())) {
+ // Used to highlight the hovered flag in the layers grid.
+ hovered_index = i;
update();
+ break;
}
}
}
- }
-
- void _notification(int p_what) {
- if (p_what == NOTIFICATION_DRAW) {
-
- Rect2 rect;
- rect.size = get_size();
- flag_rects.clear();
-
- int bsize = (rect.size.height * 80 / 100) / 2;
- int h = bsize * 2 + 1;
- int vofs = (rect.size.height - h) / 2;
+ const Ref<InputEventMouseButton> mb = p_ev;
- Color color = get_color("highlight_color", "Editor");
- for (int i = 0; i < 2; i++) {
-
- Point2 ofs(4, vofs);
- if (i == 1)
- ofs.y += bsize + 1;
+ if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
+ // Toggle the flag.
+ // We base our choice on the hovered flag, so that it always matches the hovered flag.
+ if (value & (1 << hovered_index)) {
+ value &= ~(1 << hovered_index);
+ } else {
+ value |= (1 << hovered_index);
+ }
- ofs += rect.position;
- for (int j = 0; j < 10; j++) {
+ emit_signal("flag_changed", value);
+ update();
+ }
+ }
- Point2 o = ofs + Point2(j * (bsize + 1), 0);
- if (j >= 5)
- o.x += 1;
+ void _notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_DRAW: {
+ Rect2 rect;
+ rect.size = get_size();
+ flag_rects.clear();
+
+ const int bsize = (rect.size.height * 80 / 100) / 2;
+ const int h = bsize * 2 + 1;
+ const int vofs = (rect.size.height - h) / 2;
+
+ Color color = get_theme_color("highlight_color", "Editor");
+ for (int i = 0; i < 2; i++) {
+ Point2 ofs(4, vofs);
+ if (i == 1)
+ ofs.y += bsize + 1;
+
+ ofs += rect.position;
+ for (int j = 0; j < 10; j++) {
+ Point2 o = ofs + Point2(j * (bsize + 1), 0);
+ if (j >= 5)
+ o.x += 1;
+
+ const int idx = i * 10 + j;
+ const bool on = value & (1 << idx);
+ Rect2 rect2 = Rect2(o, Size2(bsize, bsize));
+
+ color.a = on ? 0.6 : 0.2;
+ if (idx == hovered_index) {
+ // Add visual feedback when hovering a flag.
+ color.a += 0.15;
+ }
- uint32_t idx = i * 10 + j;
- bool on = value & (1 << idx);
- Rect2 rect2 = Rect2(o, Size2(bsize, bsize));
- color.a = on ? 0.6 : 0.2;
- draw_rect(rect2, color);
- flag_rects.push_back(rect2);
+ draw_rect(rect2, color);
+ flag_rects.push_back(rect2);
+ }
}
- }
+ } break;
+ case NOTIFICATION_MOUSE_EXIT: {
+ hovered_index = -1;
+ update();
+ } break;
+ default:
+ break;
}
}
@@ -685,29 +681,26 @@ public:
}
static void _bind_methods() {
-
ClassDB::bind_method(D_METHOD("_gui_input"), &EditorPropertyLayersGrid::_gui_input);
ADD_SIGNAL(MethodInfo("flag_changed", PropertyInfo(Variant::INT, "flag")));
}
EditorPropertyLayersGrid() {
value = 0;
+ hovered_index = -1; // Nothing is hovered.
}
};
void EditorPropertyLayers::_grid_changed(uint32_t p_grid) {
-
emit_changed(get_edited_property(), p_grid);
}
void EditorPropertyLayers::update_property() {
-
uint32_t value = get_edited_object()->get(get_edited_property());
grid->set_flag(value);
}
void EditorPropertyLayers::setup(LayerType p_layer_type) {
-
String basename;
switch (p_layer_type) {
case LAYER_RENDER_2D:
@@ -746,7 +739,6 @@ void EditorPropertyLayers::setup(LayerType p_layer_type) {
}
void EditorPropertyLayers::_button_pressed() {
-
layers->clear();
for (int i = 0; i < 20; i++) {
if (i == 5 || i == 10 || i == 15) {
@@ -757,10 +749,10 @@ void EditorPropertyLayers::_button_pressed() {
layers->set_item_checked(idx, grid->value & (1 << i));
}
- Rect2 gp = button->get_global_rect();
+ Rect2 gp = button->get_screen_rect();
layers->set_as_minsize();
- Vector2 popup_pos = gp.position - Vector2(layers->get_combined_minimum_size().x, 0);
- layers->set_global_position(popup_pos);
+ Vector2 popup_pos = gp.position - Vector2(layers->get_contents_minimum_size().x, 0);
+ layers->set_position(popup_pos);
layers->popup();
}
@@ -776,38 +768,34 @@ void EditorPropertyLayers::_menu_pressed(int p_menu) {
}
void EditorPropertyLayers::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_grid_changed"), &EditorPropertyLayers::_grid_changed);
- ClassDB::bind_method(D_METHOD("_button_pressed"), &EditorPropertyLayers::_button_pressed);
- ClassDB::bind_method(D_METHOD("_menu_pressed"), &EditorPropertyLayers::_menu_pressed);
}
EditorPropertyLayers::EditorPropertyLayers() {
-
HBoxContainer *hb = memnew(HBoxContainer);
add_child(hb);
grid = memnew(EditorPropertyLayersGrid);
- grid->connect("flag_changed", this, "_grid_changed");
+ grid->connect("flag_changed", callable_mp(this, &EditorPropertyLayers::_grid_changed));
grid->set_h_size_flags(SIZE_EXPAND_FILL);
hb->add_child(grid);
button = memnew(Button);
button->set_toggle_mode(true);
- button->set_text("..");
- button->connect("pressed", this, "_button_pressed");
+ button->set_text("...");
+ button->connect("pressed", callable_mp(this, &EditorPropertyLayers::_button_pressed));
hb->add_child(button);
set_bottom_editor(hb);
layers = memnew(PopupMenu);
add_child(layers);
layers->set_hide_on_checkable_item_selection(false);
- layers->connect("id_pressed", this, "_menu_pressed");
- layers->connect("popup_hide", button, "set_pressed", varray(false));
+ layers->connect("id_pressed", callable_mp(this, &EditorPropertyLayers::_menu_pressed));
+ layers->connect("popup_hide", callable_mp((BaseButton *)button, &BaseButton::set_pressed), varray(false));
}
///////////////////// INT /////////////////////////
void EditorPropertyInteger::_value_changed(int64_t val) {
- if (setting)
+ if (setting) {
return;
+ }
emit_changed(get_edited_property(), val);
}
@@ -825,7 +813,6 @@ void EditorPropertyInteger::update_property() {
}
void EditorPropertyInteger::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyInteger::_value_changed);
}
void EditorPropertyInteger::setup(int64_t p_min, int64_t p_max, int64_t p_step, bool p_allow_greater, bool p_allow_lesser) {
@@ -841,31 +828,31 @@ EditorPropertyInteger::EditorPropertyInteger() {
spin->set_flat(true);
add_child(spin);
add_focusable(spin);
- spin->connect("value_changed", this, "_value_changed");
+ spin->connect("value_changed", callable_mp(this, &EditorPropertyInteger::_value_changed));
setting = false;
}
///////////////////// OBJECT ID /////////////////////////
void EditorPropertyObjectID::_edit_pressed() {
-
emit_signal("object_id_selected", get_edited_property(), get_edited_object()->get(get_edited_property()));
}
void EditorPropertyObjectID::update_property() {
String type = base_type;
- if (type == "")
+ if (type == "") {
type = "Object";
+ }
ObjectID id = get_edited_object()->get(get_edited_property());
- if (id != 0) {
+ if (id.is_valid()) {
edit->set_text(type + " ID: " + itos(id));
edit->set_disabled(false);
edit->set_icon(EditorNode::get_singleton()->get_class_icon(type));
} else {
edit->set_text(TTR("[Empty]"));
edit->set_disabled(true);
- edit->set_icon(Ref<Texture>());
+ edit->set_icon(Ref<Texture2D>());
}
}
@@ -874,21 +861,21 @@ void EditorPropertyObjectID::setup(const String &p_base_type) {
}
void EditorPropertyObjectID::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_edit_pressed"), &EditorPropertyObjectID::_edit_pressed);
}
EditorPropertyObjectID::EditorPropertyObjectID() {
edit = memnew(Button);
add_child(edit);
add_focusable(edit);
- edit->connect("pressed", this, "_edit_pressed");
+ edit->connect("pressed", callable_mp(this, &EditorPropertyObjectID::_edit_pressed));
}
///////////////////// FLOAT /////////////////////////
void EditorPropertyFloat::_value_changed(double val) {
- if (setting)
+ if (setting) {
return;
+ }
emit_changed(get_edited_property(), val);
}
@@ -901,12 +888,9 @@ void EditorPropertyFloat::update_property() {
}
void EditorPropertyFloat::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyFloat::_value_changed);
}
void EditorPropertyFloat::setup(double p_min, double p_max, double p_step, bool p_no_slider, bool p_exp_range, bool p_greater, bool p_lesser) {
-
spin->set_min(p_min);
spin->set_max(p_max);
spin->set_step(p_step);
@@ -921,14 +905,13 @@ EditorPropertyFloat::EditorPropertyFloat() {
spin->set_flat(true);
add_child(spin);
add_focusable(spin);
- spin->connect("value_changed", this, "_value_changed");
+ spin->connect("value_changed", callable_mp(this, &EditorPropertyFloat::_value_changed));
setting = false;
}
///////////////////// EASING /////////////////////////
void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) {
-
const Ref<InputEventMouseButton> mb = p_ev;
if (mb.is_valid()) {
if (mb->is_doubleclick() && mb->get_button_index() == BUTTON_LEFT) {
@@ -936,7 +919,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) {
}
if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) {
- preset->set_global_position(easing_draw->get_global_transform().xform(mb->get_position()));
+ preset->set_position(easing_draw->get_screen_transform().xform(mb->get_position()));
preset->popup();
// Ensure the easing doesn't appear as being dragged
@@ -954,27 +937,37 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) {
const Ref<InputEventMouseMotion> mm = p_ev;
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
-
float rel = mm->get_relative().x;
- if (rel == 0)
+ if (rel == 0) {
return;
+ }
- if (flip)
+ if (flip) {
rel = -rel;
+ }
float val = get_edited_object()->get(get_edited_property());
- if (val == 0)
- return;
bool sg = val < 0;
val = Math::absf(val);
val = Math::log(val) / Math::log((float)2.0);
- //logspace
+ // Logarithmic space.
val += rel * 0.05;
val = Math::pow(2.0f, val);
- if (sg)
+ if (sg) {
val = -val;
+ }
+
+ // 0 is a singularity, but both positive and negative values
+ // are otherwise allowed. Enforce 0+ as workaround.
+ if (Math::is_zero_approx(val)) {
+ val = 0.00001;
+ }
+
+ // Limit to a reasonable value to prevent the curve going into infinity,
+ // which can cause crashes and other issues.
+ val = CLAMP(val, -1'000'000, 1'000'000);
emit_changed(get_edited_property(), val);
easing_draw->update();
@@ -982,7 +975,6 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) {
}
void EditorPropertyEasing::_draw_easing() {
-
RID ci = easing_draw->get_canvas_item();
Size2 s = easing_draw->get_size();
@@ -992,18 +984,17 @@ void EditorPropertyEasing::_draw_easing() {
float prev = 1.0;
const float exp = get_edited_object()->get(get_edited_property());
- const Ref<Font> f = get_font("font", "Label");
- const Color font_color = get_color("font_color", "Label");
+ const Ref<Font> f = get_theme_font("font", "Label");
+ const Color font_color = get_theme_color("font_color", "Label");
Color line_color;
if (dragging) {
- line_color = get_color("accent_color", "Editor");
+ line_color = get_theme_color("accent_color", "Editor");
} else {
- line_color = get_color("font_color", "Label") * Color(1, 1, 1, 0.9);
+ line_color = get_theme_color("font_color", "Label") * Color(1, 1, 1, 0.9);
}
Vector<Point2> lines;
for (int i = 1; i <= points; i++) {
-
float ifl = i / float(points);
float iflp = (i - 1) / float(points);
@@ -1019,8 +1010,19 @@ void EditorPropertyEasing::_draw_easing() {
prev = h;
}
- easing_draw->draw_multiline(lines, line_color, 1.0, true);
- f->draw(ci, Point2(10, 10 + f->get_ascent()), String::num(exp, 2), font_color);
+ easing_draw->draw_multiline(lines, line_color, 1.0);
+ // Draw more decimals for small numbers since higher precision is usually required for fine adjustments.
+ int decimals;
+ if (Math::abs(exp) < 0.1 - CMP_EPSILON) {
+ decimals = 4;
+ } else if (Math::abs(exp) < 1 - CMP_EPSILON) {
+ decimals = 3;
+ } else if (Math::abs(exp) < 10 - CMP_EPSILON) {
+ decimals = 2;
+ } else {
+ decimals = 1;
+ }
+ f->draw(ci, Point2(10, 10 + f->get_ascent()), rtos(exp).pad_decimals(decimals), font_color);
}
void EditorPropertyEasing::update_property() {
@@ -1043,14 +1045,20 @@ void EditorPropertyEasing::_setup_spin() {
}
void EditorPropertyEasing::_spin_value_changed(double p_value) {
- if (setting)
+ if (setting) {
return;
+ }
// 0 is a singularity, but both positive and negative values
// are otherwise allowed. Enforce 0+ as workaround.
if (Math::is_zero_approx(p_value)) {
p_value = 0.00001;
}
+
+ // Limit to a reasonable value to prevent the curve going into infinity,
+ // which can cause crashes and other issues.
+ p_value = CLAMP(p_value, -1'000'000, 1'000'000);
+
emit_changed(get_edited_property(), p_value);
_spin_focus_exited();
}
@@ -1063,51 +1071,41 @@ void EditorPropertyEasing::_spin_focus_exited() {
}
void EditorPropertyEasing::setup(bool p_full, bool p_flip) {
-
flip = p_flip;
full = p_full;
}
void EditorPropertyEasing::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_THEME_CHANGED:
case NOTIFICATION_ENTER_TREE: {
preset->clear();
- preset->add_icon_item(get_icon("CurveConstant", "EditorIcons"), "Zero", EASING_ZERO);
- preset->add_icon_item(get_icon("CurveLinear", "EditorIcons"), "Linear", EASING_LINEAR);
- preset->add_icon_item(get_icon("CurveIn", "EditorIcons"), "In", EASING_IN);
- preset->add_icon_item(get_icon("CurveOut", "EditorIcons"), "Out", EASING_OUT);
+ preset->add_icon_item(get_theme_icon("CurveConstant", "EditorIcons"), "Zero", EASING_ZERO);
+ preset->add_icon_item(get_theme_icon("CurveLinear", "EditorIcons"), "Linear", EASING_LINEAR);
+ preset->add_icon_item(get_theme_icon("CurveIn", "EditorIcons"), "In", EASING_IN);
+ preset->add_icon_item(get_theme_icon("CurveOut", "EditorIcons"), "Out", EASING_OUT);
if (full) {
- preset->add_icon_item(get_icon("CurveInOut", "EditorIcons"), "In-Out", EASING_IN_OUT);
- preset->add_icon_item(get_icon("CurveOutIn", "EditorIcons"), "Out-In", EASING_OUT_IN);
+ preset->add_icon_item(get_theme_icon("CurveInOut", "EditorIcons"), "In-Out", EASING_IN_OUT);
+ preset->add_icon_item(get_theme_icon("CurveOutIn", "EditorIcons"), "Out-In", EASING_OUT_IN);
}
- easing_draw->set_custom_minimum_size(Size2(0, get_font("font", "Label")->get_height() * 2));
+ easing_draw->set_custom_minimum_size(Size2(0, get_theme_font("font", "Label")->get_height() * 2));
} break;
}
}
void EditorPropertyEasing::_bind_methods() {
-
- ClassDB::bind_method("_draw_easing", &EditorPropertyEasing::_draw_easing);
- ClassDB::bind_method("_drag_easing", &EditorPropertyEasing::_drag_easing);
- ClassDB::bind_method("_set_preset", &EditorPropertyEasing::_set_preset);
-
- ClassDB::bind_method("_spin_value_changed", &EditorPropertyEasing::_spin_value_changed);
- ClassDB::bind_method("_spin_focus_exited", &EditorPropertyEasing::_spin_focus_exited);
}
EditorPropertyEasing::EditorPropertyEasing() {
-
easing_draw = memnew(Control);
- easing_draw->connect("draw", this, "_draw_easing");
- easing_draw->connect("gui_input", this, "_drag_easing");
+ easing_draw->connect("draw", callable_mp(this, &EditorPropertyEasing::_draw_easing));
+ easing_draw->connect("gui_input", callable_mp(this, &EditorPropertyEasing::_drag_easing));
easing_draw->set_default_cursor_shape(Control::CURSOR_MOVE);
add_child(easing_draw);
preset = memnew(PopupMenu);
add_child(preset);
- preset->connect("id_pressed", this, "_set_preset");
+ preset->connect("id_pressed", callable_mp(this, &EditorPropertyEasing::_set_preset));
spin = memnew(EditorSpinSlider);
spin->set_flat(true);
@@ -1117,8 +1115,8 @@ EditorPropertyEasing::EditorPropertyEasing() {
spin->set_hide_slider(true);
spin->set_allow_lesser(true);
spin->set_allow_greater(true);
- spin->connect("value_changed", this, "_spin_value_changed");
- spin->get_line_edit()->connect("focus_exited", this, "_spin_focus_exited");
+ spin->connect("value_changed", callable_mp(this, &EditorPropertyEasing::_spin_value_changed));
+ spin->get_line_edit()->connect("focus_exited", callable_mp(this, &EditorPropertyEasing::_spin_focus_exited));
spin->hide();
add_child(spin);
@@ -1130,8 +1128,9 @@ EditorPropertyEasing::EditorPropertyEasing() {
///////////////////// VECTOR2 /////////////////////////
void EditorPropertyVector2::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Vector2 v2;
v2.x = spin[0]->get_value();
@@ -1149,9 +1148,8 @@ void EditorPropertyVector2::update_property() {
void EditorPropertyVector2::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 2; i++) {
-
Color c = base;
c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
@@ -1160,8 +1158,6 @@ void EditorPropertyVector2::_notification(int p_what) {
}
void EditorPropertyVector2::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyVector2::_value_changed);
}
void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1175,12 +1171,15 @@ void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, boo
}
}
-EditorPropertyVector2::EditorPropertyVector2() {
+EditorPropertyVector2::EditorPropertyVector2(bool p_force_wide) {
bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector2_editing");
BoxContainer *bc;
- if (horizontal) {
+ if (p_force_wide) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ } else if (horizontal) {
bc = memnew(HBoxContainer);
add_child(bc);
set_bottom_editor(bc);
@@ -1196,7 +1195,7 @@ EditorPropertyVector2::EditorPropertyVector2() {
spin[i]->set_label(desc[i]);
bc->add_child(spin[i]);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyVector2::_value_changed), varray(desc[i]));
if (horizontal) {
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
}
@@ -1211,8 +1210,9 @@ EditorPropertyVector2::EditorPropertyVector2() {
///////////////////// RECT2 /////////////////////////
void EditorPropertyRect2::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Rect2 r2;
r2.position.x = spin[0]->get_value();
@@ -1231,20 +1231,19 @@ void EditorPropertyRect2::update_property() {
spin[3]->set_value(val.size.y);
setting = false;
}
+
void EditorPropertyRect2::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 4; i++) {
-
Color c = base;
c.set_hsv(float(i % 2) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyRect2::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyRect2::_value_changed);
+void EditorPropertyRect2::_bind_methods() {
}
void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1258,13 +1257,15 @@ void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool
}
}
-EditorPropertyRect2::EditorPropertyRect2() {
-
- bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing");
+EditorPropertyRect2::EditorPropertyRect2(bool p_force_wide) {
+ bool horizontal = !p_force_wide && bool(EDITOR_GET("interface/inspector/horizontal_vector_types_editing"));
BoxContainer *bc;
- if (horizontal) {
+ if (p_force_wide) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ } else if (horizontal) {
bc = memnew(HBoxContainer);
add_child(bc);
set_bottom_editor(bc);
@@ -1280,7 +1281,7 @@ EditorPropertyRect2::EditorPropertyRect2() {
spin[i]->set_flat(true);
bc->add_child(spin[i]);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyRect2::_value_changed), varray(desc[i]));
if (horizontal) {
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
}
@@ -1295,8 +1296,9 @@ EditorPropertyRect2::EditorPropertyRect2() {
///////////////////// VECTOR3 /////////////////////////
void EditorPropertyVector3::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Vector3 v3;
v3.x = spin[0]->get_value();
@@ -1306,27 +1308,37 @@ void EditorPropertyVector3::_value_changed(double val, const String &p_name) {
}
void EditorPropertyVector3::update_property() {
- Vector3 val = get_edited_object()->get(get_edited_property());
+ update_using_vector(get_edited_object()->get(get_edited_property()));
+}
+
+void EditorPropertyVector3::update_using_vector(Vector3 p_vector) {
setting = true;
- spin[0]->set_value(val.x);
- spin[1]->set_value(val.y);
- spin[2]->set_value(val.z);
+ spin[0]->set_value(p_vector.x);
+ spin[1]->set_value(p_vector.y);
+ spin[2]->set_value(p_vector.z);
setting = false;
}
+
+Vector3 EditorPropertyVector3::get_vector() {
+ Vector3 v3;
+ v3.x = spin[0]->get_value();
+ v3.y = spin[1]->get_value();
+ v3.z = spin[2]->get_value();
+ return v3;
+}
+
void EditorPropertyVector3::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 3; i++) {
-
Color c = base;
c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyVector3::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyVector3::_value_changed);
+void EditorPropertyVector3::_bind_methods() {
}
void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1340,12 +1352,266 @@ void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, boo
}
}
-EditorPropertyVector3::EditorPropertyVector3() {
+EditorPropertyVector3::EditorPropertyVector3(bool p_force_wide) {
bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing");
BoxContainer *bc;
- if (horizontal) {
+ if (p_force_wide) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ } else if (horizontal) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ set_bottom_editor(bc);
+ } else {
+ bc = memnew(VBoxContainer);
+ add_child(bc);
+ }
+
+ static const char *desc[3] = { "x", "y", "z" };
+ for (int i = 0; i < 3; i++) {
+ spin[i] = memnew(EditorSpinSlider);
+ spin[i]->set_flat(true);
+ spin[i]->set_label(desc[i]);
+ bc->add_child(spin[i]);
+ add_focusable(spin[i]);
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyVector3::_value_changed), varray(desc[i]));
+ if (horizontal) {
+ spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
+ }
+ }
+
+ if (!horizontal) {
+ set_label_reference(spin[0]); //show text and buttons around this
+ }
+ setting = false;
+}
+
+///////////////////// VECTOR2i /////////////////////////
+
+void EditorPropertyVector2i::_value_changed(double val, const String &p_name) {
+ if (setting) {
+ return;
+ }
+
+ Vector2i v2;
+ v2.x = spin[0]->get_value();
+ v2.y = spin[1]->get_value();
+ emit_changed(get_edited_property(), v2, p_name);
+}
+
+void EditorPropertyVector2i::update_property() {
+ Vector2i val = get_edited_object()->get(get_edited_property());
+ setting = true;
+ spin[0]->set_value(val.x);
+ spin[1]->set_value(val.y);
+ setting = false;
+}
+
+void EditorPropertyVector2i::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
+ Color base = get_theme_color("accent_color", "Editor");
+ for (int i = 0; i < 2; i++) {
+ Color c = base;
+ c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
+ spin[i]->set_custom_label_color(true, c);
+ }
+ }
+}
+
+void EditorPropertyVector2i::_bind_methods() {
+}
+
+void EditorPropertyVector2i::setup(int p_min, int p_max, bool p_no_slider) {
+ for (int i = 0; i < 2; i++) {
+ spin[i]->set_min(p_min);
+ spin[i]->set_max(p_max);
+ spin[i]->set_step(1);
+ spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
+ }
+}
+
+EditorPropertyVector2i::EditorPropertyVector2i(bool p_force_wide) {
+ bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector2_editing");
+
+ BoxContainer *bc;
+
+ if (p_force_wide) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ } else if (horizontal) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ set_bottom_editor(bc);
+ } else {
+ bc = memnew(VBoxContainer);
+ add_child(bc);
+ }
+
+ static const char *desc[2] = { "x", "y" };
+ for (int i = 0; i < 2; i++) {
+ spin[i] = memnew(EditorSpinSlider);
+ spin[i]->set_flat(true);
+ spin[i]->set_label(desc[i]);
+ bc->add_child(spin[i]);
+ add_focusable(spin[i]);
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyVector2i::_value_changed), varray(desc[i]));
+ if (horizontal) {
+ spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
+ }
+ }
+
+ if (!horizontal) {
+ set_label_reference(spin[0]); //show text and buttons around this
+ }
+ setting = false;
+}
+
+///////////////////// RECT2i /////////////////////////
+
+void EditorPropertyRect2i::_value_changed(double val, const String &p_name) {
+ if (setting) {
+ return;
+ }
+
+ Rect2i r2;
+ r2.position.x = spin[0]->get_value();
+ r2.position.y = spin[1]->get_value();
+ r2.size.x = spin[2]->get_value();
+ r2.size.y = spin[3]->get_value();
+ emit_changed(get_edited_property(), r2, p_name);
+}
+
+void EditorPropertyRect2i::update_property() {
+ Rect2i val = get_edited_object()->get(get_edited_property());
+ setting = true;
+ spin[0]->set_value(val.position.x);
+ spin[1]->set_value(val.position.y);
+ spin[2]->set_value(val.size.x);
+ spin[3]->set_value(val.size.y);
+ setting = false;
+}
+
+void EditorPropertyRect2i::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
+ Color base = get_theme_color("accent_color", "Editor");
+ for (int i = 0; i < 4; i++) {
+ Color c = base;
+ c.set_hsv(float(i % 2) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
+ spin[i]->set_custom_label_color(true, c);
+ }
+ }
+}
+
+void EditorPropertyRect2i::_bind_methods() {
+}
+
+void EditorPropertyRect2i::setup(int p_min, int p_max, bool p_no_slider) {
+ for (int i = 0; i < 4; i++) {
+ spin[i]->set_min(p_min);
+ spin[i]->set_max(p_max);
+ spin[i]->set_step(1);
+ spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
+ }
+}
+
+EditorPropertyRect2i::EditorPropertyRect2i(bool p_force_wide) {
+ bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing");
+
+ BoxContainer *bc;
+
+ if (p_force_wide) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ } else if (horizontal) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ set_bottom_editor(bc);
+ } else {
+ bc = memnew(VBoxContainer);
+ add_child(bc);
+ }
+
+ static const char *desc[4] = { "x", "y", "w", "h" };
+ for (int i = 0; i < 4; i++) {
+ spin[i] = memnew(EditorSpinSlider);
+ spin[i]->set_label(desc[i]);
+ spin[i]->set_flat(true);
+ bc->add_child(spin[i]);
+ add_focusable(spin[i]);
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyRect2i::_value_changed), varray(desc[i]));
+ if (horizontal) {
+ spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
+ }
+ }
+
+ if (!horizontal) {
+ set_label_reference(spin[0]); //show text and buttons around this
+ }
+ setting = false;
+}
+
+///////////////////// VECTOR3i /////////////////////////
+
+void EditorPropertyVector3i::_value_changed(double val, const String &p_name) {
+ if (setting) {
+ return;
+ }
+
+ Vector3i v3;
+ v3.x = spin[0]->get_value();
+ v3.y = spin[1]->get_value();
+ v3.z = spin[2]->get_value();
+ emit_changed(get_edited_property(), v3, p_name);
+}
+
+void EditorPropertyVector3i::update_property() {
+ Vector3i val = get_edited_object()->get(get_edited_property());
+ setting = true;
+ spin[0]->set_value(val.x);
+ spin[1]->set_value(val.y);
+ spin[2]->set_value(val.z);
+ setting = false;
+}
+
+void EditorPropertyVector3i::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
+ Color base = get_theme_color("accent_color", "Editor");
+ for (int i = 0; i < 3; i++) {
+ Color c = base;
+ c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
+ spin[i]->set_custom_label_color(true, c);
+ }
+ }
+}
+
+void EditorPropertyVector3i::_bind_methods() {
+}
+
+void EditorPropertyVector3i::setup(int p_min, int p_max, bool p_no_slider) {
+ for (int i = 0; i < 3; i++) {
+ spin[i]->set_min(p_min);
+ spin[i]->set_max(p_max);
+ spin[i]->set_step(1);
+ spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
+ }
+}
+
+EditorPropertyVector3i::EditorPropertyVector3i(bool p_force_wide) {
+ bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing");
+
+ BoxContainer *bc;
+ if (p_force_wide) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ } else if (horizontal) {
bc = memnew(HBoxContainer);
add_child(bc);
set_bottom_editor(bc);
@@ -1361,7 +1627,7 @@ EditorPropertyVector3::EditorPropertyVector3() {
spin[i]->set_label(desc[i]);
bc->add_child(spin[i]);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyVector3i::_value_changed), varray(desc[i]));
if (horizontal) {
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
}
@@ -1372,11 +1638,13 @@ EditorPropertyVector3::EditorPropertyVector3() {
}
setting = false;
}
+
///////////////////// PLANE /////////////////////////
void EditorPropertyPlane::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Plane p;
p.normal.x = spin[0]->get_value();
@@ -1395,20 +1663,19 @@ void EditorPropertyPlane::update_property() {
spin[3]->set_value(val.d);
setting = false;
}
+
void EditorPropertyPlane::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 3; i++) {
-
Color c = base;
c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyPlane::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyPlane::_value_changed);
+void EditorPropertyPlane::_bind_methods() {
}
void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1422,13 +1689,15 @@ void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool
}
}
-EditorPropertyPlane::EditorPropertyPlane() {
-
+EditorPropertyPlane::EditorPropertyPlane(bool p_force_wide) {
bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing");
BoxContainer *bc;
- if (horizontal) {
+ if (p_force_wide) {
+ bc = memnew(HBoxContainer);
+ add_child(bc);
+ } else if (horizontal) {
bc = memnew(HBoxContainer);
add_child(bc);
set_bottom_editor(bc);
@@ -1444,7 +1713,7 @@ EditorPropertyPlane::EditorPropertyPlane() {
spin[i]->set_label(desc[i]);
bc->add_child(spin[i]);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyPlane::_value_changed), varray(desc[i]));
if (horizontal) {
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
}
@@ -1459,8 +1728,9 @@ EditorPropertyPlane::EditorPropertyPlane() {
///////////////////// QUAT /////////////////////////
void EditorPropertyQuat::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Quat p;
p.x = spin[0]->get_value();
@@ -1479,20 +1749,19 @@ void EditorPropertyQuat::update_property() {
spin[3]->set_value(val.w);
setting = false;
}
+
void EditorPropertyQuat::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 3; i++) {
-
Color c = base;
c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyQuat::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyQuat::_value_changed);
+void EditorPropertyQuat::_bind_methods() {
}
void EditorPropertyQuat::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1527,7 +1796,7 @@ EditorPropertyQuat::EditorPropertyQuat() {
spin[i]->set_label(desc[i]);
bc->add_child(spin[i]);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyQuat::_value_changed), varray(desc[i]));
if (horizontal) {
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
}
@@ -1542,8 +1811,9 @@ EditorPropertyQuat::EditorPropertyQuat() {
///////////////////// AABB /////////////////////////
void EditorPropertyAABB::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
AABB p;
p.position.x = spin[0]->get_value();
@@ -1568,20 +1838,19 @@ void EditorPropertyAABB::update_property() {
setting = false;
}
+
void EditorPropertyAABB::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 6; i++) {
-
Color c = base;
c.set_hsv(float(i % 3) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyAABB::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyAABB::_value_changed);
+void EditorPropertyAABB::_bind_methods() {
}
void EditorPropertyAABB::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1609,7 +1878,7 @@ EditorPropertyAABB::EditorPropertyAABB() {
g->add_child(spin[i]);
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyAABB::_value_changed), varray(desc[i]));
}
set_bottom_editor(g);
setting = false;
@@ -1618,8 +1887,9 @@ EditorPropertyAABB::EditorPropertyAABB() {
///////////////////// TRANSFORM2D /////////////////////////
void EditorPropertyTransform2D::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Transform2D p;
p[0][0] = spin[0]->get_value();
@@ -1644,20 +1914,19 @@ void EditorPropertyTransform2D::update_property() {
setting = false;
}
+
void EditorPropertyTransform2D::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 6; i++) {
-
Color c = base;
c.set_hsv(float(i % 2) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyTransform2D::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyTransform2D::_value_changed);
+void EditorPropertyTransform2D::_bind_methods() {
}
void EditorPropertyTransform2D::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1684,7 +1953,7 @@ EditorPropertyTransform2D::EditorPropertyTransform2D() {
g->add_child(spin[i]);
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyTransform2D::_value_changed), varray(desc[i]));
}
set_bottom_editor(g);
setting = false;
@@ -1693,8 +1962,9 @@ EditorPropertyTransform2D::EditorPropertyTransform2D() {
///////////////////// BASIS /////////////////////////
void EditorPropertyBasis::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Basis p;
p[0][0] = spin[0]->get_value();
@@ -1725,20 +1995,19 @@ void EditorPropertyBasis::update_property() {
setting = false;
}
+
void EditorPropertyBasis::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 9; i++) {
-
Color c = base;
c.set_hsv(float(i % 3) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyBasis::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyBasis::_value_changed);
+void EditorPropertyBasis::_bind_methods() {
}
void EditorPropertyBasis::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1765,7 +2034,7 @@ EditorPropertyBasis::EditorPropertyBasis() {
g->add_child(spin[i]);
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyBasis::_value_changed), varray(desc[i]));
}
set_bottom_editor(g);
setting = false;
@@ -1774,8 +2043,9 @@ EditorPropertyBasis::EditorPropertyBasis() {
///////////////////// TRANSFORM /////////////////////////
void EditorPropertyTransform::_value_changed(double val, const String &p_name) {
- if (setting)
+ if (setting) {
return;
+ }
Transform p;
p.basis[0][0] = spin[0]->get_value();
@@ -1795,37 +2065,38 @@ void EditorPropertyTransform::_value_changed(double val, const String &p_name) {
}
void EditorPropertyTransform::update_property() {
- Transform val = get_edited_object()->get(get_edited_property());
- setting = true;
- spin[0]->set_value(val.basis[0][0]);
- spin[1]->set_value(val.basis[1][0]);
- spin[2]->set_value(val.basis[2][0]);
- spin[3]->set_value(val.basis[0][1]);
- spin[4]->set_value(val.basis[1][1]);
- spin[5]->set_value(val.basis[2][1]);
- spin[6]->set_value(val.basis[0][2]);
- spin[7]->set_value(val.basis[1][2]);
- spin[8]->set_value(val.basis[2][2]);
- spin[9]->set_value(val.origin[0]);
- spin[10]->set_value(val.origin[1]);
- spin[11]->set_value(val.origin[2]);
+ update_using_transform(get_edited_object()->get(get_edited_property()));
+}
+void EditorPropertyTransform::update_using_transform(Transform p_transform) {
+ setting = true;
+ spin[0]->set_value(p_transform.basis[0][0]);
+ spin[1]->set_value(p_transform.basis[1][0]);
+ spin[2]->set_value(p_transform.basis[2][0]);
+ spin[3]->set_value(p_transform.basis[0][1]);
+ spin[4]->set_value(p_transform.basis[1][1]);
+ spin[5]->set_value(p_transform.basis[2][1]);
+ spin[6]->set_value(p_transform.basis[0][2]);
+ spin[7]->set_value(p_transform.basis[1][2]);
+ spin[8]->set_value(p_transform.basis[2][2]);
+ spin[9]->set_value(p_transform.origin[0]);
+ spin[10]->set_value(p_transform.origin[1]);
+ spin[11]->set_value(p_transform.origin[2]);
setting = false;
}
+
void EditorPropertyTransform::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Color base = get_color("accent_color", "Editor");
+ Color base = get_theme_color("accent_color", "Editor");
for (int i = 0; i < 12; i++) {
-
Color c = base;
c.set_hsv(float(i % 3) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v());
spin[i]->set_custom_label_color(true, c);
}
}
}
-void EditorPropertyTransform::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_value_changed"), &EditorPropertyTransform::_value_changed);
+void EditorPropertyTransform::_bind_methods() {
}
void EditorPropertyTransform::setup(double p_min, double p_max, double p_step, bool p_no_slider) {
@@ -1852,7 +2123,7 @@ EditorPropertyTransform::EditorPropertyTransform() {
g->add_child(spin[i]);
spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
add_focusable(spin[i]);
- spin[i]->connect("value_changed", this, "_value_changed", varray(desc[i]));
+ spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyTransform::_value_changed), varray(desc[i]));
}
set_bottom_editor(g);
setting = false;
@@ -1861,33 +2132,32 @@ EditorPropertyTransform::EditorPropertyTransform() {
////////////// COLOR PICKER //////////////////////
void EditorPropertyColor::_color_changed(const Color &p_color) {
+ // Cancel the color change if the current color is identical to the new one.
+ if (get_edited_object()->get(get_edited_property()) == p_color) {
+ return;
+ }
emit_changed(get_edited_property(), p_color, "", true);
}
void EditorPropertyColor::_popup_closed() {
-
emit_changed(get_edited_property(), picker->get_pick_color(), "", false);
}
void EditorPropertyColor::_picker_created() {
// get default color picker mode from editor settings
int default_color_mode = EDITOR_GET("interface/inspector/default_color_picker_mode");
- if (default_color_mode == 1)
+ if (default_color_mode == 1) {
picker->get_picker()->set_hsv_mode(true);
- else if (default_color_mode == 2)
+ } else if (default_color_mode == 2) {
picker->get_picker()->set_raw_mode(true);
+ }
}
void EditorPropertyColor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_color_changed"), &EditorPropertyColor::_color_changed);
- ClassDB::bind_method(D_METHOD("_popup_closed"), &EditorPropertyColor::_popup_closed);
- ClassDB::bind_method(D_METHOD("_picker_created"), &EditorPropertyColor::_picker_created);
}
void EditorPropertyColor::update_property() {
-
picker->set_pick_color(get_edited_object()->get(get_edited_property()));
const Color color = picker->get_pick_color();
@@ -1913,21 +2183,19 @@ void EditorPropertyColor::setup(bool p_show_alpha) {
}
EditorPropertyColor::EditorPropertyColor() {
-
picker = memnew(ColorPickerButton);
add_child(picker);
picker->set_flat(true);
- picker->connect("color_changed", this, "_color_changed");
- picker->connect("popup_closed", this, "_popup_closed");
- picker->connect("picker_created", this, "_picker_created");
+ picker->connect("color_changed", callable_mp(this, &EditorPropertyColor::_color_changed));
+ picker->connect("popup_closed", callable_mp(this, &EditorPropertyColor::_popup_closed));
+ picker->connect("picker_created", callable_mp(this, &EditorPropertyColor::_picker_created));
}
////////////// NODE PATH //////////////////////
void EditorPropertyNodePath::_node_selected(const NodePath &p_path) {
-
NodePath path = p_path;
- Node *base_node = NULL;
+ Node *base_node = nullptr;
if (!use_path_from_scene_root) {
base_node = Object::cast_to<Node>(get_edited_object());
@@ -1966,31 +2234,29 @@ void EditorPropertyNodePath::_node_assign() {
scene_tree->get_scene_tree()->set_show_enabled_subscene(true);
scene_tree->get_scene_tree()->set_valid_types(valid_types);
add_child(scene_tree);
- scene_tree->connect("selected", this, "_node_selected");
+ scene_tree->connect("selected", callable_mp(this, &EditorPropertyNodePath::_node_selected));
}
- scene_tree->popup_centered_ratio();
+ scene_tree->popup_scenetree_dialog();
}
void EditorPropertyNodePath::_node_clear() {
-
emit_changed(get_edited_property(), NodePath());
update_property();
}
void EditorPropertyNodePath::update_property() {
-
NodePath p = get_edited_object()->get(get_edited_property());
assign->set_tooltip(p);
if (p == NodePath()) {
- assign->set_icon(Ref<Texture>());
+ assign->set_icon(Ref<Texture2D>());
assign->set_text(TTR("Assign..."));
assign->set_flat(false);
return;
}
assign->set_flat(true);
- Node *base_node = NULL;
+ Node *base_node = nullptr;
if (base_hint != NodePath()) {
if (get_tree()->get_root()->has_node(base_hint)) {
base_node = get_tree()->get_root()->get_node(base_hint);
@@ -2000,7 +2266,7 @@ void EditorPropertyNodePath::update_property() {
}
if (!base_node || !base_node->has_node(p)) {
- assign->set_icon(Ref<Texture>());
+ assign->set_icon(Ref<Texture2D>());
assign->set_text(p);
return;
}
@@ -2009,7 +2275,7 @@ void EditorPropertyNodePath::update_property() {
ERR_FAIL_COND(!target_node);
if (String(target_node->get_name()).find("@") != -1) {
- assign->set_icon(Ref<Texture>());
+ assign->set_icon(Ref<Texture2D>());
assign->set_text(p);
return;
}
@@ -2019,45 +2285,38 @@ void EditorPropertyNodePath::update_property() {
}
void EditorPropertyNodePath::setup(const NodePath &p_base_hint, Vector<StringName> p_valid_types, bool p_use_path_from_scene_root) {
-
base_hint = p_base_hint;
valid_types = p_valid_types;
use_path_from_scene_root = p_use_path_from_scene_root;
}
void EditorPropertyNodePath::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Ref<Texture> t = get_icon("Clear", "EditorIcons");
+ Ref<Texture2D> t = get_theme_icon("Clear", "EditorIcons");
clear->set_icon(t);
}
}
void EditorPropertyNodePath::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_node_selected"), &EditorPropertyNodePath::_node_selected);
- ClassDB::bind_method(D_METHOD("_node_assign"), &EditorPropertyNodePath::_node_assign);
- ClassDB::bind_method(D_METHOD("_node_clear"), &EditorPropertyNodePath::_node_clear);
}
EditorPropertyNodePath::EditorPropertyNodePath() {
-
HBoxContainer *hbc = memnew(HBoxContainer);
add_child(hbc);
assign = memnew(Button);
assign->set_flat(true);
assign->set_h_size_flags(SIZE_EXPAND_FILL);
assign->set_clip_text(true);
- assign->connect("pressed", this, "_node_assign");
+ assign->connect("pressed", callable_mp(this, &EditorPropertyNodePath::_node_assign));
hbc->add_child(assign);
clear = memnew(Button);
clear->set_flat(true);
- clear->connect("pressed", this, "_node_clear");
+ clear->connect("pressed", callable_mp(this, &EditorPropertyNodePath::_node_clear));
hbc->add_child(clear);
use_path_from_scene_root = false;
- scene_tree = NULL; //do not allocate unnecessarily
+ scene_tree = nullptr; //do not allocate unnecessarily
}
///////////////////// RID /////////////////////////
@@ -2080,7 +2339,6 @@ EditorPropertyRID::EditorPropertyRID() {
////////////// RESOURCE //////////////////////
void EditorPropertyResource::_file_selected(const String &p_path) {
-
RES res = ResourceLoader::load(p_path);
ERR_FAIL_COND_MSG(res.is_null(), "Cannot load resource from path '" + p_path + "'.");
@@ -2104,8 +2362,9 @@ void EditorPropertyResource::_file_selected(const String &p_path) {
}
}
- if (!any_type_matches)
+ if (!any_type_matches) {
EditorNode::get_singleton()->show_warning(vformat(TTR("The selected resource (%s) does not match any type expected for this property (%s)."), res->get_class(), property_types));
+ }
}
emit_changed(get_edited_property(), res);
@@ -2113,22 +2372,19 @@ void EditorPropertyResource::_file_selected(const String &p_path) {
}
void EditorPropertyResource::_menu_option(int p_which) {
-
- // scene_tree->popup_centered_ratio();
+ //scene_tree->popup_scenetree_dialog();
switch (p_which) {
case OBJ_MENU_LOAD: {
-
if (!file) {
file = memnew(EditorFileDialog);
- file->connect("file_selected", this, "_file_selected");
+ file->connect("file_selected", callable_mp(this, &EditorPropertyResource::_file_selected));
add_child(file);
}
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
String type = base_type;
List<String> extensions;
for (int i = 0; i < type.get_slice_count(","); i++) {
-
ResourceLoader::get_recognized_extensions_for_type(type.get_slice(",", i), &extensions);
}
@@ -2139,45 +2395,39 @@ void EditorPropertyResource::_menu_option(int p_which) {
file->clear_filters();
for (Set<String>::Element *E = valid_extensions.front(); E; E = E->next()) {
-
file->add_filter("*." + E->get() + " ; " + E->get().to_upper());
}
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} break;
case OBJ_MENU_EDIT: {
-
RES res = get_edited_object()->get(get_edited_property());
if (!res.is_null()) {
-
emit_signal("resource_selected", get_edited_property(), res);
}
} break;
case OBJ_MENU_CLEAR: {
-
emit_changed(get_edited_property(), RES());
update_property();
} break;
case OBJ_MENU_MAKE_UNIQUE: {
-
RES res_orig = get_edited_object()->get(get_edited_property());
- if (res_orig.is_null())
+ if (res_orig.is_null()) {
return;
+ }
List<PropertyInfo> property_list;
res_orig->get_property_list(&property_list);
- List<Pair<String, Variant> > propvalues;
+ List<Pair<String, Variant>> propvalues;
for (List<PropertyInfo>::Element *E = property_list.front(); E; E = E->next()) {
-
Pair<String, Variant> p;
PropertyInfo &pi = E->get();
if (pi.usage & PROPERTY_USAGE_STORAGE) {
-
p.first = pi.name;
p.second = res_orig->get(pi.name);
}
@@ -2193,8 +2443,7 @@ void EditorPropertyResource::_menu_option(int p_which) {
ERR_FAIL_COND(res.is_null());
- for (List<Pair<String, Variant> >::Element *E = propvalues.front(); E; E = E->next()) {
-
+ for (List<Pair<String, Variant>>::Element *E = propvalues.front(); E; E = E->next()) {
Pair<String, Variant> &p = E->get();
res->set(p.first, p.second);
}
@@ -2206,8 +2455,9 @@ void EditorPropertyResource::_menu_option(int p_which) {
case OBJ_MENU_SAVE: {
RES res = get_edited_object()->get(get_edited_property());
- if (res.is_null())
+ if (res.is_null()) {
return;
+ }
EditorNode::get_singleton()->save_resource(res);
} break;
@@ -2218,21 +2468,18 @@ void EditorPropertyResource::_menu_option(int p_which) {
} break;
case OBJ_MENU_PASTE: {
-
RES res = EditorSettings::get_singleton()->get_resource_clipboard();
emit_changed(get_edited_property(), res);
update_property();
} break;
case OBJ_MENU_NEW_SCRIPT: {
-
if (Object::cast_to<Node>(get_edited_object())) {
EditorNode::get_singleton()->get_scene_tree_dock()->open_script_dialog(Object::cast_to<Node>(get_edited_object()), false);
}
} break;
case OBJ_MENU_EXTEND_SCRIPT: {
-
if (Object::cast_to<Node>(get_edited_object())) {
EditorNode::get_singleton()->get_scene_tree_dock()->open_script_dialog(Object::cast_to<Node>(get_edited_object()), true);
}
@@ -2245,17 +2492,15 @@ void EditorPropertyResource::_menu_option(int p_which) {
file_system_dock->navigate_to_path(res->get_path());
// Ensure that the FileSystem dock is visible.
TabContainer *tab_container = (TabContainer *)file_system_dock->get_parent_control();
- tab_container->set_current_tab(file_system_dock->get_position_in_parent());
+ tab_container->set_current_tab(file_system_dock->get_index());
} break;
default: {
-
RES res = get_edited_object()->get(get_edited_property());
if (p_which >= CONVERT_BASE_ID) {
-
int to_type = p_which - CONVERT_BASE_ID;
- Vector<Ref<EditorResourceConversionPlugin> > conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(res);
+ Vector<Ref<EditorResourceConversionPlugin>> conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(res);
ERR_FAIL_INDEX(to_type, conversions.size());
@@ -2270,7 +2515,6 @@ void EditorPropertyResource::_menu_option(int p_which) {
String intype = inheritors_array[p_which - TYPE_BASE_ID];
if (intype == "ViewportTexture") {
-
Resource *r = Object::cast_to<Resource>(get_edited_object());
if (r && r->get_path().is_resource_file()) {
EditorNode::get_singleton()->show_warning(TTR("Can't create a ViewportTexture on resources saved as a file.\nResource needs to belong to a scene."));
@@ -2289,15 +2533,15 @@ void EditorPropertyResource::_menu_option(int p_which) {
scene_tree->get_scene_tree()->set_valid_types(valid_types);
scene_tree->get_scene_tree()->set_show_enabled_subscene(true);
add_child(scene_tree);
- scene_tree->connect("selected", this, "_viewport_selected");
+ scene_tree->connect("selected", callable_mp(this, &EditorPropertyResource::_viewport_selected));
scene_tree->set_title(TTR("Pick a Viewport"));
}
- scene_tree->popup_centered_ratio();
+ scene_tree->popup_scenetree_dialog();
return;
}
- Object *obj = NULL;
+ Object *obj = nullptr;
if (ScriptServer::is_global_class(intype)) {
obj = ClassDB::instance(ScriptServer::get_global_class_native_base(intype));
@@ -2331,8 +2575,7 @@ void EditorPropertyResource::_menu_option(int p_which) {
}
}
-void EditorPropertyResource::_resource_preview(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, ObjectID p_obj) {
-
+void EditorPropertyResource::_resource_preview(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, ObjectID p_obj) {
RES p = get_edited_object()->get(get_edited_property());
if (p.is_valid() && p->get_instance_id() == p_obj) {
String type = p->get_class_name();
@@ -2343,7 +2586,7 @@ void EditorPropertyResource::_resource_preview(const String &p_path, const Ref<T
}
if (p_preview.is_valid()) {
- preview->set_margin(MARGIN_LEFT, assign->get_icon()->get_width() + assign->get_stylebox("normal")->get_default_margin(MARGIN_LEFT) + get_constant("hseparation", "Button"));
+ preview->set_margin(MARGIN_LEFT, assign->get_icon()->get_width() + assign->get_theme_stylebox("normal")->get_default_margin(MARGIN_LEFT) + get_theme_constant("hseparation", "Button"));
if (type == "GradientTexture") {
preview->set_stretch_mode(TextureRect::STRETCH_SCALE);
assign->set_custom_minimum_size(Size2(1, 1));
@@ -2360,15 +2603,14 @@ void EditorPropertyResource::_resource_preview(const String &p_path, const Ref<T
}
void EditorPropertyResource::_update_menu_items() {
-
//////////////////// UPDATE MENU //////////////////////////
RES res = get_edited_object()->get(get_edited_property());
menu->clear();
if (get_edited_property() == "script" && base_type == "Script" && Object::cast_to<Node>(get_edited_object())) {
- menu->add_icon_item(get_icon("ScriptCreate", "EditorIcons"), TTR("New Script"), OBJ_MENU_NEW_SCRIPT);
- menu->add_icon_item(get_icon("ScriptExtend", "EditorIcons"), TTR("Extend Script"), OBJ_MENU_EXTEND_SCRIPT);
+ menu->add_icon_item(get_theme_icon("ScriptCreate", "EditorIcons"), TTR("New Script"), OBJ_MENU_NEW_SCRIPT);
+ menu->add_icon_item(get_theme_icon("ScriptExtend", "EditorIcons"), TTR("Extend Script"), OBJ_MENU_EXTEND_SCRIPT);
menu->add_separator();
} else if (base_type != "") {
int idx = 0;
@@ -2380,7 +2622,6 @@ void EditorPropertyResource::_update_menu_items() {
}
for (int i = 0; i < base_type.get_slice_count(","); i++) {
-
String base = base_type.get_slice(",", i);
Set<String> valid_inheritors;
@@ -2412,25 +2653,28 @@ void EditorPropertyResource::_update_menu_items() {
const String &t = F->get();
bool is_custom_resource = false;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
if (!custom_resources.empty()) {
for (int j = 0; j < custom_resources.size(); j++) {
if (custom_resources[j].name == t) {
is_custom_resource = true;
- if (custom_resources[j].icon.is_valid())
+ if (custom_resources[j].icon.is_valid()) {
icon = custom_resources[j].icon;
+ }
break;
}
}
}
- if (!is_custom_resource && !(ScriptServer::is_global_class(t) || ClassDB::can_instance(t)))
+ if (!is_custom_resource && !(ScriptServer::is_global_class(t) || ClassDB::can_instance(t))) {
continue;
+ }
inheritors_array.push_back(t);
- if (!icon.is_valid())
- icon = get_icon(has_icon(t, "EditorIcons") ? t : "Object", "EditorIcons");
+ if (!icon.is_valid()) {
+ icon = get_theme_icon(has_theme_icon(t, "EditorIcons") ? t : "Object", "EditorIcons");
+ }
int id = TYPE_BASE_ID + idx;
menu->add_icon_item(icon, vformat(TTR("New %s"), t), id);
@@ -2439,18 +2683,18 @@ void EditorPropertyResource::_update_menu_items() {
}
}
- if (menu->get_item_count())
+ if (menu->get_item_count()) {
menu->add_separator();
+ }
}
- menu->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Load"), OBJ_MENU_LOAD);
+ menu->add_icon_item(get_theme_icon("Load", "EditorIcons"), TTR("Load"), OBJ_MENU_LOAD);
if (!res.is_null()) {
-
- menu->add_icon_item(get_icon("Edit", "EditorIcons"), TTR("Edit"), OBJ_MENU_EDIT);
- menu->add_icon_item(get_icon("Clear", "EditorIcons"), TTR("Clear"), OBJ_MENU_CLEAR);
- menu->add_icon_item(get_icon("Duplicate", "EditorIcons"), TTR("Make Unique"), OBJ_MENU_MAKE_UNIQUE);
- menu->add_icon_item(get_icon("Save", "EditorIcons"), TTR("Save"), OBJ_MENU_SAVE);
+ menu->add_icon_item(get_theme_icon("Edit", "EditorIcons"), TTR("Edit"), OBJ_MENU_EDIT);
+ menu->add_icon_item(get_theme_icon("Clear", "EditorIcons"), TTR("Clear"), OBJ_MENU_CLEAR);
+ menu->add_icon_item(get_theme_icon("Duplicate", "EditorIcons"), TTR("Make Unique"), OBJ_MENU_MAKE_UNIQUE);
+ menu->add_icon_item(get_theme_icon("Save", "EditorIcons"), TTR("Save"), OBJ_MENU_SAVE);
RES r = res;
if (r.is_valid() && r->get_path().is_resource_file()) {
menu->add_separator();
@@ -2461,45 +2705,42 @@ void EditorPropertyResource::_update_menu_items() {
RES cb = EditorSettings::get_singleton()->get_resource_clipboard();
bool paste_valid = false;
if (cb.is_valid()) {
- if (base_type == "")
+ if (base_type == "") {
paste_valid = true;
- else
- for (int i = 0; i < base_type.get_slice_count(","); i++)
+ } else {
+ for (int i = 0; i < base_type.get_slice_count(","); i++) {
if (ClassDB::is_parent_class(cb->get_class(), base_type.get_slice(",", i))) {
paste_valid = true;
break;
}
+ }
+ }
}
if (!res.is_null() || paste_valid) {
menu->add_separator();
if (!res.is_null()) {
-
menu->add_item(TTR("Copy"), OBJ_MENU_COPY);
}
if (paste_valid) {
-
menu->add_item(TTR("Paste"), OBJ_MENU_PASTE);
}
}
if (!res.is_null()) {
-
- Vector<Ref<EditorResourceConversionPlugin> > conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(res);
+ Vector<Ref<EditorResourceConversionPlugin>> conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(res);
if (conversions.size()) {
menu->add_separator();
}
for (int i = 0; i < conversions.size(); i++) {
String what = conversions[i]->converts_to();
- Ref<Texture> icon;
- if (has_icon(what, "EditorIcons")) {
-
- icon = get_icon(what, "EditorIcons");
+ Ref<Texture2D> icon;
+ if (has_theme_icon(what, "EditorIcons")) {
+ icon = get_theme_icon(what, "EditorIcons");
} else {
-
- icon = get_icon(what, "Resource");
+ icon = get_theme_icon(what, "Resource");
}
menu->add_icon_item(icon, vformat(TTR("Convert To %s"), what), CONVERT_BASE_ID + i);
@@ -2508,29 +2749,25 @@ void EditorPropertyResource::_update_menu_items() {
}
void EditorPropertyResource::_update_menu() {
-
_update_menu_items();
- Rect2 gt = edit->get_global_rect();
+ Rect2 gt = edit->get_screen_rect();
menu->set_as_minsize();
- int ms = menu->get_combined_minimum_size().width;
+ int ms = menu->get_contents_minimum_size().width;
Vector2 popup_pos = gt.position + gt.size - Vector2(ms, 0);
- menu->set_global_position(popup_pos);
+ menu->set_position(popup_pos);
menu->popup();
}
void EditorPropertyResource::_sub_inspector_property_keyed(const String &p_property, const Variant &p_value, bool) {
-
emit_signal("property_keyed_with_value", String(get_edited_property()) + ":" + p_property, p_value, false);
}
void EditorPropertyResource::_sub_inspector_resource_selected(const RES &p_resource, const String &p_property) {
-
emit_signal("resource_selected", String(get_edited_property()) + ":" + p_property, p_resource);
}
void EditorPropertyResource::_sub_inspector_object_id_selected(int p_id) {
-
emit_signal("object_id_selected", get_edited_property(), p_id);
}
@@ -2539,10 +2776,10 @@ void EditorPropertyResource::_button_input(const Ref<InputEvent> &p_event) {
if (mb.is_valid()) {
if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) {
_update_menu_items();
- Vector2 pos = mb->get_global_position();
+ Vector2 pos = get_screen_position() + mb->get_position();
//pos = assign->get_global_transform().xform(pos);
menu->set_as_minsize();
- menu->set_global_position(pos);
+ menu->set_position(pos);
menu->popup();
}
}
@@ -2556,15 +2793,15 @@ void EditorPropertyResource::_open_editor_pressed() {
}
void EditorPropertyResource::_fold_other_editors(Object *p_self) {
-
if (this == p_self) {
return;
}
RES res = get_edited_object()->get(get_edited_property());
- if (!res.is_valid())
+ if (!res.is_valid()) {
return;
+ }
bool use_editor = false;
for (int i = 0; i < EditorNode::get_editor_data().get_editor_plugin_count(); i++) {
EditorPlugin *ep = EditorNode::get_editor_data().get_editor_plugin(i);
@@ -2573,8 +2810,9 @@ void EditorPropertyResource::_fold_other_editors(Object *p_self) {
}
}
- if (!use_editor)
+ if (!use_editor) {
return;
+ }
bool unfolded = get_edited_object()->editor_is_section_unfolded(get_edited_property());
opened_editor = false;
@@ -2588,17 +2826,14 @@ void EditorPropertyResource::_fold_other_editors(Object *p_self) {
}
void EditorPropertyResource::update_property() {
-
RES res = get_edited_object()->get(get_edited_property());
if (use_sub_inspector) {
-
if (res.is_valid() != assign->is_toggle_mode()) {
assign->set_toggle_mode(res.is_valid());
}
if (res.is_valid() && get_edited_object()->editor_is_section_unfolded(get_edited_property())) {
-
if (!sub_inspector) {
sub_inspector = memnew(EditorInspector);
sub_inspector->set_enable_v_scroll(false);
@@ -2607,9 +2842,9 @@ void EditorPropertyResource::update_property() {
sub_inspector->set_sub_inspector(true);
sub_inspector->set_enable_capitalize_paths(true);
- sub_inspector->connect("property_keyed", this, "_sub_inspector_property_keyed");
- sub_inspector->connect("resource_selected", this, "_sub_inspector_resource_selected");
- sub_inspector->connect("object_id_selected", this, "_sub_inspector_object_id_selected");
+ sub_inspector->connect("property_keyed", callable_mp(this, &EditorPropertyResource::_sub_inspector_property_keyed));
+ sub_inspector->connect("resource_selected", callable_mp(this, &EditorPropertyResource::_sub_inspector_resource_selected));
+ sub_inspector->connect("object_id_selected", callable_mp(this, &EditorPropertyResource::_sub_inspector_object_id_selected));
sub_inspector->set_keying(is_keying());
sub_inspector->set_read_only(is_read_only());
sub_inspector->set_use_folding(is_using_folding());
@@ -2647,10 +2882,10 @@ void EditorPropertyResource::update_property() {
sub_inspector->refresh();
} else {
if (sub_inspector) {
- set_bottom_editor(NULL);
+ set_bottom_editor(nullptr);
memdelete(sub_inspector_vbox);
- sub_inspector = NULL;
- sub_inspector_vbox = NULL;
+ sub_inspector = nullptr;
+ sub_inspector_vbox = nullptr;
if (opened_editor) {
EditorNode::get_singleton()->hide_top_editors();
opened_editor = false;
@@ -2659,12 +2894,11 @@ void EditorPropertyResource::update_property() {
}
}
- preview->set_texture(Ref<Texture>());
+ preview->set_texture(Ref<Texture2D>());
if (res == RES()) {
- assign->set_icon(Ref<Texture>());
+ assign->set_icon(Ref<Texture2D>());
assign->set_text(TTR("[empty]"));
} else {
-
assign->set_icon(EditorNode::get_singleton()->get_object_icon(res.operator->(), "Object"));
if (res->get_name() != String()) {
@@ -2695,12 +2929,10 @@ void EditorPropertyResource::_resource_selected() {
}
if (use_sub_inspector) {
-
bool unfold = !get_edited_object()->editor_is_section_unfolded(get_edited_property());
get_edited_object()->editor_set_section_unfold(get_edited_property(), unfold);
update_property();
} else {
-
emit_signal("resource_selected", get_edited_property(), res);
}
}
@@ -2710,19 +2942,15 @@ void EditorPropertyResource::setup(const String &p_base_type) {
}
void EditorPropertyResource::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Ref<Texture> t = get_icon("select_arrow", "Tree");
+ Ref<Texture2D> t = get_theme_icon("select_arrow", "Tree");
edit->set_icon(t);
}
if (p_what == NOTIFICATION_DRAG_BEGIN) {
-
- if (is_visible_in_tree()) {
- if (_is_drop_valid(get_viewport()->gui_get_drag_data())) {
- dropping = true;
- assign->update();
- }
+ if (_is_drop_valid(get_viewport()->gui_get_drag_data())) {
+ dropping = true;
+ assign->update();
}
}
@@ -2735,7 +2963,6 @@ void EditorPropertyResource::_notification(int p_what) {
}
void EditorPropertyResource::_viewport_selected(const NodePath &p_path) {
-
Node *to_node = get_node(p_path);
if (!Object::cast_to<Viewport>(to_node)) {
EditorNode::get_singleton()->show_warning(TTR("Selected node is not a Viewport!"));
@@ -2758,25 +2985,21 @@ void EditorPropertyResource::collapse_all_folding() {
}
void EditorPropertyResource::expand_all_folding() {
-
if (sub_inspector) {
sub_inspector->expand_all_folding();
}
}
void EditorPropertyResource::_button_draw() {
-
if (dropping) {
- Color color = get_color("accent_color", "Editor");
+ Color color = get_theme_color("accent_color", "Editor");
assign->draw_rect(Rect2(Point2(), assign->get_size()), color, false);
}
}
Variant EditorPropertyResource::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
RES res = get_edited_object()->get(get_edited_property());
if (res.is_valid()) {
-
return EditorNode::get_singleton()->drag_resource(res, p_from);
}
@@ -2784,22 +3007,39 @@ Variant EditorPropertyResource::get_drag_data_fw(const Point2 &p_point, Control
}
bool EditorPropertyResource::_is_drop_valid(const Dictionary &p_drag_data) const {
-
- String allowed_type = base_type;
+ Vector<String> allowed_types = base_type.split(",");
+ int size = allowed_types.size();
+ for (int i = 0; i < size; i++) {
+ String at = allowed_types[i].strip_edges();
+ if (at == "StandardMaterial3D") {
+ allowed_types.append("Texture2D");
+ } else if (at == "ShaderMaterial") {
+ allowed_types.append("Shader");
+ } else if (at == "Font") {
+ allowed_types.append("DynamicFontData");
+ }
+ }
Dictionary drag_data = p_drag_data;
- if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
- Ref<Resource> res = drag_data["resource"];
- for (int i = 0; i < allowed_type.get_slice_count(","); i++) {
- String at = allowed_type.get_slice(",", i).strip_edges();
- if (res.is_valid() && ClassDB::is_parent_class(res->get_class(), at)) {
+
+ Ref<Resource> res;
+ if (drag_data.has("type") && String(drag_data["type"]) == "script_list_element") {
+ ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(drag_data["script_list_element"]);
+ res = se->get_edited_resource();
+ } else if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
+ res = drag_data["resource"];
+ }
+
+ if (res.is_valid()) {
+ for (int i = 0; i < allowed_types.size(); i++) {
+ String at = allowed_types[i].strip_edges();
+ if (ClassDB::is_parent_class(res->get_class(), at)) {
return true;
}
}
}
if (drag_data.has("type") && String(drag_data["type"]) == "files") {
-
Vector<String> files = drag_data["files"];
if (files.size() == 1) {
@@ -2807,9 +3047,8 @@ bool EditorPropertyResource::_is_drop_valid(const Dictionary &p_drag_data) const
String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
if (ftype != "") {
-
- for (int i = 0; i < allowed_type.get_slice_count(","); i++) {
- String at = allowed_type.get_slice(",", i).strip_edges();
+ for (int i = 0; i < allowed_types.size(); i++) {
+ String at = allowed_types[i].strip_edges();
if (ClassDB::is_parent_class(ftype, at)) {
return true;
}
@@ -2822,36 +3061,72 @@ bool EditorPropertyResource::_is_drop_valid(const Dictionary &p_drag_data) const
}
bool EditorPropertyResource::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
return _is_drop_valid(p_data);
}
-void EditorPropertyResource::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+void EditorPropertyResource::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
ERR_FAIL_COND(!_is_drop_valid(p_data));
Dictionary drag_data = p_data;
- if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
- Ref<Resource> res = drag_data["resource"];
- if (res.is_valid()) {
- emit_changed(get_edited_property(), res);
- update_property();
- return;
- }
- }
- if (drag_data.has("type") && String(drag_data["type"]) == "files") {
+ Ref<Resource> res;
+ if (drag_data.has("type") && String(drag_data["type"]) == "script_list_element") {
+ ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(drag_data["script_list_element"]);
+ res = se->get_edited_resource();
+ } else if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
+ res = drag_data["resource"];
+ }
+ if (!res.is_valid() && drag_data.has("type") && String(drag_data["type"]) == "files") {
Vector<String> files = drag_data["files"];
if (files.size() == 1) {
String file = files[0];
- RES res = ResourceLoader::load(file);
- if (res.is_valid()) {
- emit_changed(get_edited_property(), res);
- update_property();
- return;
+ res = ResourceLoader::load(file);
+ }
+ }
+
+ if (res.is_valid()) {
+ bool need_convert = true;
+
+ Vector<String> allowed_types = base_type.split(",");
+ for (int i = 0; i < allowed_types.size(); i++) {
+ String at = allowed_types[i].strip_edges();
+ if (ClassDB::is_parent_class(res->get_class(), at)) {
+ need_convert = false;
+ break;
+ }
+ }
+
+ if (need_convert) {
+ for (int i = 0; i < allowed_types.size(); i++) {
+ String at = allowed_types[i].strip_edges();
+ if (at == "StandardMaterial3D" && ClassDB::is_parent_class(res->get_class(), "Texture2D")) {
+ Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D);
+ mat->set_texture(StandardMaterial3D::TextureParam::TEXTURE_ALBEDO, res);
+ res = mat;
+ break;
+ }
+
+ if (at == "ShaderMaterial" && ClassDB::is_parent_class(res->get_class(), "Shader")) {
+ Ref<ShaderMaterial> mat = memnew(ShaderMaterial);
+ mat->set_shader(res);
+ res = mat;
+ break;
+ }
+
+ if (at == "Font" && ClassDB::is_parent_class(res->get_class(), "DynamicFontData")) {
+ Ref<DynamicFont> font = memnew(DynamicFont);
+ font->set_font_data(res);
+ res = font;
+ break;
+ }
}
}
+
+ emit_changed(get_edited_property(), res);
+ update_property();
+ return;
}
}
@@ -2860,30 +3135,18 @@ void EditorPropertyResource::set_use_sub_inspector(bool p_enable) {
}
void EditorPropertyResource::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_file_selected"), &EditorPropertyResource::_file_selected);
- ClassDB::bind_method(D_METHOD("_menu_option"), &EditorPropertyResource::_menu_option);
- ClassDB::bind_method(D_METHOD("_update_menu"), &EditorPropertyResource::_update_menu);
ClassDB::bind_method(D_METHOD("_resource_preview"), &EditorPropertyResource::_resource_preview);
- ClassDB::bind_method(D_METHOD("_resource_selected"), &EditorPropertyResource::_resource_selected);
- ClassDB::bind_method(D_METHOD("_viewport_selected"), &EditorPropertyResource::_viewport_selected);
- ClassDB::bind_method(D_METHOD("_sub_inspector_property_keyed"), &EditorPropertyResource::_sub_inspector_property_keyed);
- ClassDB::bind_method(D_METHOD("_sub_inspector_resource_selected"), &EditorPropertyResource::_sub_inspector_resource_selected);
- ClassDB::bind_method(D_METHOD("_sub_inspector_object_id_selected"), &EditorPropertyResource::_sub_inspector_object_id_selected);
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &EditorPropertyResource::get_drag_data_fw);
ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &EditorPropertyResource::can_drop_data_fw);
ClassDB::bind_method(D_METHOD("drop_data_fw"), &EditorPropertyResource::drop_data_fw);
- ClassDB::bind_method(D_METHOD("_button_draw"), &EditorPropertyResource::_button_draw);
ClassDB::bind_method(D_METHOD("_open_editor_pressed"), &EditorPropertyResource::_open_editor_pressed);
- ClassDB::bind_method(D_METHOD("_button_input"), &EditorPropertyResource::_button_input);
ClassDB::bind_method(D_METHOD("_fold_other_editors"), &EditorPropertyResource::_fold_other_editors);
}
EditorPropertyResource::EditorPropertyResource() {
-
opened_editor = false;
- sub_inspector = NULL;
- sub_inspector_vbox = NULL;
+ sub_inspector = nullptr;
+ sub_inspector_vbox = nullptr;
use_sub_inspector = bool(EDITOR_GET("interface/inspector/open_resources_in_current_inspector"));
HBoxContainer *hbc = memnew(HBoxContainer);
@@ -2892,9 +3155,9 @@ EditorPropertyResource::EditorPropertyResource() {
assign->set_flat(true);
assign->set_h_size_flags(SIZE_EXPAND_FILL);
assign->set_clip_text(true);
- assign->connect("pressed", this, "_resource_selected");
+ assign->connect("pressed", callable_mp(this, &EditorPropertyResource::_resource_selected));
assign->set_drag_forwarding(this);
- assign->connect("draw", this, "_button_draw");
+ assign->connect("draw", callable_mp(this, &EditorPropertyResource::_button_draw));
hbc->add_child(assign);
add_focusable(assign);
@@ -2905,22 +3168,22 @@ EditorPropertyResource::EditorPropertyResource() {
preview->set_margin(MARGIN_BOTTOM, -1);
preview->set_margin(MARGIN_RIGHT, -1);
assign->add_child(preview);
- assign->connect("gui_input", this, "_button_input");
+ assign->connect("gui_input", callable_mp(this, &EditorPropertyResource::_button_input));
menu = memnew(PopupMenu);
add_child(menu);
edit = memnew(Button);
edit->set_flat(true);
edit->set_toggle_mode(true);
- menu->connect("id_pressed", this, "_menu_option");
- menu->connect("popup_hide", edit, "set_pressed", varray(false));
- edit->connect("pressed", this, "_update_menu");
+ menu->connect("id_pressed", callable_mp(this, &EditorPropertyResource::_menu_option));
+ menu->connect("popup_hide", callable_mp((BaseButton *)edit, &BaseButton::set_pressed), varray(false));
+ edit->connect("pressed", callable_mp(this, &EditorPropertyResource::_update_menu));
hbc->add_child(edit);
- edit->connect("gui_input", this, "_button_input");
+ edit->connect("gui_input", callable_mp(this, &EditorPropertyResource::_button_input));
add_focusable(edit);
- file = NULL;
- scene_tree = NULL;
+ file = nullptr;
+ scene_tree = nullptr;
dropping = false;
add_to_group("_editor_resource_properties");
@@ -2936,12 +3199,10 @@ void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) {
//do none
}
-bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
-
+bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) {
float default_float_step = EDITOR_GET("interface/inspector/default_float_step");
switch (p_type) {
-
// atomic types
case Variant::NIL: {
EditorPropertyNil *editor = memnew(EditorPropertyNil);
@@ -2952,7 +3213,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
add_property_editor(p_path, editor);
} break;
case Variant::INT: {
-
if (p_hint == PROPERTY_HINT_ENUM) {
EditorPropertyEnum *editor = memnew(EditorPropertyEnum);
Vector<String> options = p_hint_text.split(",");
@@ -2966,7 +3226,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
add_property_editor(p_path, editor);
} else if (p_hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || p_hint == PROPERTY_HINT_LAYERS_2D_RENDER || p_hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || p_hint == PROPERTY_HINT_LAYERS_3D_RENDER) {
-
EditorPropertyLayers::LayerType lt = EditorPropertyLayers::LAYER_RENDER_2D;
switch (p_hint) {
case PROPERTY_HINT_LAYERS_2D_RENDER:
@@ -2988,7 +3247,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
editor->setup(lt);
add_property_editor(p_path, editor);
} else if (p_hint == PROPERTY_HINT_OBJECT_ID) {
-
EditorPropertyObjectID *editor = memnew(EditorPropertyObjectID);
editor->setup(p_hint_text);
add_property_editor(p_path, editor);
@@ -3024,8 +3282,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
add_property_editor(p_path, editor);
}
} break;
- case Variant::REAL: {
-
+ case Variant::FLOAT: {
if (p_hint == PROPERTY_HINT_EXP_EASING) {
EditorPropertyEasing *editor = memnew(EditorPropertyEasing);
bool full = true;
@@ -3054,10 +3311,10 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
if ((p_hint == PROPERTY_HINT_RANGE || p_hint == PROPERTY_HINT_EXP_RANGE) && p_hint_text.get_slice_count(",") >= 2) {
greater = false; //if using ranged, assume false by default
lesser = false;
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
exp_range = p_hint == PROPERTY_HINT_EXP_RANGE;
@@ -3078,7 +3335,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
}
} break;
case Variant::STRING: {
-
if (p_hint == PROPERTY_HINT_ENUM) {
EditorPropertyTextEnum *editor = memnew(EditorPropertyTextEnum);
Vector<String> options = p_hint_text.split(",");
@@ -3092,7 +3348,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
editor->setup("Object", p_hint_text);
add_property_editor(p_path, editor);
} else if (p_hint == PROPERTY_HINT_DIR || p_hint == PROPERTY_HINT_FILE || p_hint == PROPERTY_HINT_SAVE_FILE || p_hint == PROPERTY_HINT_GLOBAL_DIR || p_hint == PROPERTY_HINT_GLOBAL_FILE) {
-
Vector<String> extensions = p_hint_text.split(",");
bool global = p_hint == PROPERTY_HINT_GLOBAL_DIR || p_hint == PROPERTY_HINT_GLOBAL_FILE;
bool folder = p_hint == PROPERTY_HINT_DIR || p_hint == PROPERTY_HINT_GLOBAL_DIR;
@@ -3111,18 +3366,31 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
p_hint == PROPERTY_HINT_PROPERTY_OF_BASE_TYPE ||
p_hint == PROPERTY_HINT_PROPERTY_OF_INSTANCE ||
p_hint == PROPERTY_HINT_PROPERTY_OF_SCRIPT) {
-
EditorPropertyMember *editor = memnew(EditorPropertyMember);
EditorPropertyMember::Type type = EditorPropertyMember::MEMBER_METHOD_OF_BASE_TYPE;
switch (p_hint) {
- case PROPERTY_HINT_METHOD_OF_BASE_TYPE: type = EditorPropertyMember::MEMBER_METHOD_OF_BASE_TYPE; break;
- case PROPERTY_HINT_METHOD_OF_INSTANCE: type = EditorPropertyMember::MEMBER_METHOD_OF_INSTANCE; break;
- case PROPERTY_HINT_METHOD_OF_SCRIPT: type = EditorPropertyMember::MEMBER_METHOD_OF_SCRIPT; break;
- case PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE: type = EditorPropertyMember::MEMBER_PROPERTY_OF_VARIANT_TYPE; break;
- case PROPERTY_HINT_PROPERTY_OF_BASE_TYPE: type = EditorPropertyMember::MEMBER_PROPERTY_OF_BASE_TYPE; break;
- case PROPERTY_HINT_PROPERTY_OF_INSTANCE: type = EditorPropertyMember::MEMBER_PROPERTY_OF_INSTANCE; break;
- case PROPERTY_HINT_PROPERTY_OF_SCRIPT: type = EditorPropertyMember::MEMBER_PROPERTY_OF_SCRIPT; break;
+ case PROPERTY_HINT_METHOD_OF_BASE_TYPE:
+ type = EditorPropertyMember::MEMBER_METHOD_OF_BASE_TYPE;
+ break;
+ case PROPERTY_HINT_METHOD_OF_INSTANCE:
+ type = EditorPropertyMember::MEMBER_METHOD_OF_INSTANCE;
+ break;
+ case PROPERTY_HINT_METHOD_OF_SCRIPT:
+ type = EditorPropertyMember::MEMBER_METHOD_OF_SCRIPT;
+ break;
+ case PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE:
+ type = EditorPropertyMember::MEMBER_PROPERTY_OF_VARIANT_TYPE;
+ break;
+ case PROPERTY_HINT_PROPERTY_OF_BASE_TYPE:
+ type = EditorPropertyMember::MEMBER_PROPERTY_OF_BASE_TYPE;
+ break;
+ case PROPERTY_HINT_PROPERTY_OF_INSTANCE:
+ type = EditorPropertyMember::MEMBER_PROPERTY_OF_INSTANCE;
+ break;
+ case PROPERTY_HINT_PROPERTY_OF_SCRIPT:
+ type = EditorPropertyMember::MEMBER_PROPERTY_OF_SCRIPT;
+ break;
default: {
}
}
@@ -3130,7 +3398,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
add_property_editor(p_path, editor);
} else {
-
EditorPropertyText *editor = memnew(EditorPropertyText);
if (p_hint == PROPERTY_HINT_PLACEHOLDER_TEXT) {
editor->set_placeholder(p_hint_text);
@@ -3142,15 +3409,15 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
// math types
case Variant::VECTOR2: {
- EditorPropertyVector2 *editor = memnew(EditorPropertyVector2);
+ EditorPropertyVector2 *editor = memnew(EditorPropertyVector2(p_wide));
double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3158,17 +3425,32 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
editor->setup(min, max, step, hide_slider);
add_property_editor(p_path, editor);
- } break; // 5
+ } break;
+ case Variant::VECTOR2I: {
+ EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide));
+ int min = -65535, max = 65535;
+ bool hide_slider = true;
+
+ if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
+ hide_slider = false;
+ }
+
+ editor->setup(min, max, hide_slider);
+ add_property_editor(p_path, editor);
+
+ } break;
case Variant::RECT2: {
- EditorPropertyRect2 *editor = memnew(EditorPropertyRect2);
+ EditorPropertyRect2 *editor = memnew(EditorPropertyRect2(p_wide));
double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3176,16 +3458,30 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
editor->setup(min, max, step, hide_slider);
add_property_editor(p_path, editor);
} break;
+ case Variant::RECT2I: {
+ EditorPropertyRect2i *editor = memnew(EditorPropertyRect2i(p_wide));
+ int min = -65535, max = 65535;
+ bool hide_slider = true;
+
+ if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
+ hide_slider = false;
+ }
+
+ editor->setup(min, max, hide_slider);
+ add_property_editor(p_path, editor);
+ } break;
case Variant::VECTOR3: {
- EditorPropertyVector3 *editor = memnew(EditorPropertyVector3);
+ EditorPropertyVector3 *editor = memnew(EditorPropertyVector3(p_wide));
double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3194,16 +3490,32 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
add_property_editor(p_path, editor);
} break;
+ case Variant::VECTOR3I: {
+ EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide));
+ int min = -65535, max = 65535;
+ bool hide_slider = true;
+
+ if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
+
+ hide_slider = false;
+ }
+
+ editor->setup(min, max, hide_slider);
+ add_property_editor(p_path, editor);
+
+ } break;
case Variant::TRANSFORM2D: {
EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D);
double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3213,15 +3525,15 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break;
case Variant::PLANE: {
- EditorPropertyPlane *editor = memnew(EditorPropertyPlane);
+ EditorPropertyPlane *editor = memnew(EditorPropertyPlane(p_wide));
double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3235,27 +3547,27 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
editor->setup(min, max, step, hide_slider);
add_property_editor(p_path, editor);
- } break; // 10
+ } break;
case Variant::AABB: {
EditorPropertyAABB *editor = memnew(EditorPropertyAABB);
double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3269,10 +3581,10 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3286,10 +3598,10 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
- min = p_hint_text.get_slice(",", 0).to_double();
- max = p_hint_text.get_slice(",", 1).to_double();
+ min = p_hint_text.get_slice(",", 0).to_float();
+ max = p_hint_text.get_slice(",", 1).to_float();
if (p_hint_text.get_slice_count(",") >= 3) {
- step = p_hint_text.get_slice(",", 2).to_double();
+ step = p_hint_text.get_slice(",", 2).to_float();
}
hide_slider = false;
}
@@ -3305,8 +3617,22 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
editor->setup(p_hint != PROPERTY_HINT_COLOR_NO_ALPHA);
add_property_editor(p_path, editor);
} break;
+ case Variant::STRING_NAME: {
+ if (p_hint == PROPERTY_HINT_ENUM) {
+ EditorPropertyTextEnum *editor = memnew(EditorPropertyTextEnum);
+ Vector<String> options = p_hint_text.split(",");
+ editor->setup(options, true);
+ add_property_editor(p_path, editor);
+ } else {
+ EditorPropertyText *editor = memnew(EditorPropertyText);
+ if (p_hint == PROPERTY_HINT_PLACEHOLDER_TEXT) {
+ editor->set_placeholder(p_hint_text);
+ }
+ editor->set_string_name(true);
+ add_property_editor(p_path, editor);
+ }
+ } break;
case Variant::NODE_PATH: {
-
EditorPropertyNodePath *editor = memnew(EditorPropertyNodePath);
if (p_hint == PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && p_hint_text != String()) {
editor->setup(p_hint_text, Vector<StringName>(), (p_usage & PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT));
@@ -3318,7 +3644,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
}
add_property_editor(p_path, editor);
- } break; // 15
+ } break;
case Variant::_RID: {
EditorPropertyRID *editor = memnew(EditorPropertyRID);
add_property_editor(p_path, editor);
@@ -3334,7 +3660,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
for (int j = 0; j < p_hint_text.get_slice_count(","); j++) {
String inherits = p_hint_text.get_slicec(',', j);
if (ClassDB::is_parent_class(inherits, type)) {
-
editor->set_use_sub_inspector(false);
}
}
@@ -3353,39 +3678,49 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
editor->setup(Variant::ARRAY, p_hint_text);
add_property_editor(p_path, editor);
} break;
- case Variant::POOL_BYTE_ARRAY: {
+ case Variant::PACKED_BYTE_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_BYTE_ARRAY);
+ editor->setup(Variant::PACKED_BYTE_ARRAY);
add_property_editor(p_path, editor);
- } break; // 20
- case Variant::POOL_INT_ARRAY: {
+ } break;
+ case Variant::PACKED_INT32_ARRAY: {
+ EditorPropertyArray *editor = memnew(EditorPropertyArray);
+ editor->setup(Variant::PACKED_INT32_ARRAY);
+ add_property_editor(p_path, editor);
+ } break;
+ case Variant::PACKED_INT64_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_INT_ARRAY);
+ editor->setup(Variant::PACKED_INT64_ARRAY);
add_property_editor(p_path, editor);
} break;
- case Variant::POOL_REAL_ARRAY: {
+ case Variant::PACKED_FLOAT32_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_REAL_ARRAY);
+ editor->setup(Variant::PACKED_FLOAT32_ARRAY);
add_property_editor(p_path, editor);
} break;
- case Variant::POOL_STRING_ARRAY: {
+ case Variant::PACKED_FLOAT64_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_STRING_ARRAY);
+ editor->setup(Variant::PACKED_FLOAT64_ARRAY);
add_property_editor(p_path, editor);
} break;
- case Variant::POOL_VECTOR2_ARRAY: {
+ case Variant::PACKED_STRING_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_VECTOR2_ARRAY);
+ editor->setup(Variant::PACKED_STRING_ARRAY);
add_property_editor(p_path, editor);
} break;
- case Variant::POOL_VECTOR3_ARRAY: {
+ case Variant::PACKED_VECTOR2_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_VECTOR3_ARRAY);
+ editor->setup(Variant::PACKED_VECTOR2_ARRAY);
add_property_editor(p_path, editor);
- } break; // 25
- case Variant::POOL_COLOR_ARRAY: {
+ } break;
+ case Variant::PACKED_VECTOR3_ARRAY: {
+ EditorPropertyArray *editor = memnew(EditorPropertyArray);
+ editor->setup(Variant::PACKED_VECTOR3_ARRAY);
+ add_property_editor(p_path, editor);
+ } break;
+ case Variant::PACKED_COLOR_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_COLOR_ARRAY);
+ editor->setup(Variant::PACKED_COLOR_ARRAY);
add_property_editor(p_path, editor);
} break;
default: {
diff --git a/editor/editor_properties.h b/editor/editor_properties.h
index 1853a6b6e1..be3e9db8ed 100644
--- a/editor/editor_properties.h
+++ b/editor/editor_properties.h
@@ -44,7 +44,7 @@ class EditorPropertyNil : public EditorProperty {
LineEdit *text;
public:
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyNil();
};
@@ -53,6 +53,7 @@ class EditorPropertyText : public EditorProperty {
LineEdit *text;
bool updating;
+ bool string_name;
void _text_changed(const String &p_string);
void _text_entered(const String &p_string);
@@ -60,7 +61,8 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ void set_string_name(bool p_enabled);
+ virtual void update_property() override;
void set_placeholder(const String &p_string);
EditorPropertyText();
};
@@ -82,7 +84,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyMultilineText();
};
@@ -91,13 +93,14 @@ class EditorPropertyTextEnum : public EditorProperty {
OptionButton *options;
void _option_selected(int p_which);
+ bool string_name;
protected:
static void _bind_methods();
public:
- void setup(const Vector<String> &p_options);
- virtual void update_property();
+ void setup(const Vector<String> &p_options, bool p_string_name = false);
+ virtual void update_property() override;
EditorPropertyTextEnum();
};
@@ -122,7 +125,7 @@ protected:
public:
void setup(const Vector<String> &p_extensions, bool p_folder, bool p_global);
void set_save_mode();
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyPath();
};
@@ -142,7 +145,7 @@ protected:
public:
void setup(const String &p_base_type, const String &p_selected_type);
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyClassName();
};
@@ -176,7 +179,7 @@ protected:
public:
void setup(Type p_hint, const String &p_hint_text);
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyMember();
};
@@ -190,7 +193,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyCheck();
};
@@ -205,7 +208,7 @@ protected:
public:
void setup(const Vector<String> &p_options);
- virtual void update_property();
+ virtual void update_property() override;
void set_option_button_clip(bool p_enable);
EditorPropertyEnum();
};
@@ -223,7 +226,7 @@ protected:
public:
void setup(const Vector<String> &p_options);
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyFlags();
};
@@ -255,7 +258,7 @@ protected:
public:
void setup(LayerType p_layer_type);
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyLayers();
};
@@ -269,7 +272,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(int64_t p_min, int64_t p_max, int64_t p_step, bool p_allow_greater, bool p_allow_lesser);
EditorPropertyInteger();
};
@@ -284,7 +287,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(const String &p_base_type);
EditorPropertyObjectID();
};
@@ -299,7 +302,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider, bool p_exp_range, bool p_greater, bool p_lesser);
EditorPropertyFloat();
};
@@ -340,7 +343,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(bool p_full, bool p_flip);
EditorPropertyEasing();
};
@@ -356,9 +359,9 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
- EditorPropertyVector2();
+ EditorPropertyVector2(bool p_force_wide = false);
};
class EditorPropertyRect2 : public EditorProperty {
@@ -372,9 +375,9 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
- EditorPropertyRect2();
+ EditorPropertyRect2(bool p_force_wide = false);
};
class EditorPropertyVector3 : public EditorProperty {
@@ -388,9 +391,59 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
+ virtual void update_using_vector(Vector3 p_vector);
+ virtual Vector3 get_vector();
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
- EditorPropertyVector3();
+ EditorPropertyVector3(bool p_force_wide = false);
+};
+
+class EditorPropertyVector2i : public EditorProperty {
+ GDCLASS(EditorPropertyVector2i, EditorProperty);
+ EditorSpinSlider *spin[2];
+ bool setting;
+ void _value_changed(double p_val, const String &p_name);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ virtual void update_property() override;
+ void setup(int p_min, int p_max, bool p_no_slider);
+ EditorPropertyVector2i(bool p_force_wide = false);
+};
+
+class EditorPropertyRect2i : public EditorProperty {
+ GDCLASS(EditorPropertyRect2i, EditorProperty);
+ EditorSpinSlider *spin[4];
+ bool setting;
+ void _value_changed(double p_val, const String &p_name);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ virtual void update_property() override;
+ void setup(int p_min, int p_max, bool p_no_slider);
+ EditorPropertyRect2i(bool p_force_wide = false);
+};
+
+class EditorPropertyVector3i : public EditorProperty {
+ GDCLASS(EditorPropertyVector3i, EditorProperty);
+ EditorSpinSlider *spin[3];
+ bool setting;
+ void _value_changed(double p_val, const String &p_name);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ virtual void update_property() override;
+ void setup(int p_min, int p_max, bool p_no_slider);
+ EditorPropertyVector3i(bool p_force_wide = false);
};
class EditorPropertyPlane : public EditorProperty {
@@ -404,9 +457,9 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
- EditorPropertyPlane();
+ EditorPropertyPlane(bool p_force_wide = false);
};
class EditorPropertyQuat : public EditorProperty {
@@ -420,7 +473,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
EditorPropertyQuat();
};
@@ -436,7 +489,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
EditorPropertyAABB();
};
@@ -452,7 +505,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
EditorPropertyTransform2D();
};
@@ -468,7 +521,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
EditorPropertyBasis();
};
@@ -484,7 +537,8 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
+ virtual void update_using_transform(Transform p_transform);
void setup(double p_min, double p_max, double p_step, bool p_no_slider);
EditorPropertyTransform();
};
@@ -500,7 +554,7 @@ protected:
static void _bind_methods();
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(bool p_show_alpha);
EditorPropertyColor();
};
@@ -523,7 +577,7 @@ protected:
void _notification(int p_what);
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(const NodePath &p_base_hint, Vector<StringName> p_valid_types, bool p_use_path_from_scene_root = true);
EditorPropertyNodePath();
};
@@ -533,7 +587,7 @@ class EditorPropertyRID : public EditorProperty {
Label *label;
public:
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyRID();
};
@@ -574,7 +628,7 @@ class EditorPropertyResource : public EditorProperty {
void _file_selected(const String &p_path);
void _menu_option(int p_which);
- void _resource_preview(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, ObjectID p_obj);
+ void _resource_preview(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, ObjectID p_obj);
void _resource_selected();
void _viewport_selected(const NodePath &p_path);
@@ -603,11 +657,11 @@ protected:
void _notification(int p_what);
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(const String &p_base_type);
- void collapse_all_folding();
- void expand_all_folding();
+ void collapse_all_folding() override;
+ void expand_all_folding() override;
void set_use_sub_inspector(bool p_enable);
@@ -621,10 +675,10 @@ class EditorInspectorDefaultPlugin : public EditorInspectorPlugin {
GDCLASS(EditorInspectorDefaultPlugin, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
- virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage);
- virtual void parse_end();
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
+ virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override;
+ virtual void parse_end() override;
};
#endif // EDITOR_PROPERTIES_H
diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp
index 0dc67b298f..51fac6acec 100644
--- a/editor/editor_properties_array_dict.cpp
+++ b/editor/editor_properties_array_dict.cpp
@@ -35,7 +35,6 @@
#include "editor_properties.h"
bool EditorPropertyArrayObject::_set(const StringName &p_name, const Variant &p_value) {
-
String pn = p_name;
if (pn.begins_with("indices")) {
@@ -48,11 +47,9 @@ bool EditorPropertyArrayObject::_set(const StringName &p_name, const Variant &p_
}
bool EditorPropertyArrayObject::_get(const StringName &p_name, Variant &r_ret) const {
-
String pn = p_name;
if (pn.begins_with("indices")) {
-
int idx = pn.get_slicec('/', 1).to_int();
bool valid;
r_ret = array.get(idx, &valid);
@@ -80,17 +77,14 @@ EditorPropertyArrayObject::EditorPropertyArrayObject() {
///////////////////
bool EditorPropertyDictionaryObject::_set(const StringName &p_name, const Variant &p_value) {
-
String pn = p_name;
if (pn == "new_item_key") {
-
new_item_key = p_value;
return true;
}
if (pn == "new_item_value") {
-
new_item_value = p_value;
return true;
}
@@ -106,23 +100,19 @@ bool EditorPropertyDictionaryObject::_set(const StringName &p_name, const Varian
}
bool EditorPropertyDictionaryObject::_get(const StringName &p_name, Variant &r_ret) const {
-
String pn = p_name;
if (pn == "new_item_key") {
-
r_ret = new_item_key;
return true;
}
if (pn == "new_item_value") {
-
r_ret = new_item_value;
return true;
}
if (pn.begins_with("indices")) {
-
int idx = pn.get_slicec('/', 1).to_int();
Variant key = dict.get_key_at_index(idx);
r_ret = dict[key];
@@ -165,10 +155,9 @@ EditorPropertyDictionaryObject::EditorPropertyDictionaryObject() {
///////////////////// ARRAY ///////////////////////////
-void EditorPropertyArray::_property_changed(const String &p_prop, Variant p_value, const String &p_name, bool changing) {
-
- if (p_prop.begins_with("indices")) {
- int idx = p_prop.get_slice("/", 1).to_int();
+void EditorPropertyArray::_property_changed(const String &p_property, Variant p_value, const String &p_name, bool p_changing) {
+ if (p_property.begins_with("indices")) {
+ int idx = p_property.get_slice("/", 1).to_int();
Variant array = object->get_array();
array.set(idx, p_value);
emit_changed(get_edited_property(), array, "", true);
@@ -181,25 +170,23 @@ void EditorPropertyArray::_property_changed(const String &p_prop, Variant p_valu
}
void EditorPropertyArray::_change_type(Object *p_button, int p_index) {
-
Button *button = Object::cast_to<Button>(p_button);
changing_type_idx = p_index;
- Rect2 rect = button->get_global_rect();
+ Rect2 rect = button->get_screen_rect();
change_type->set_as_minsize();
- change_type->set_global_position(rect.position + rect.size - Vector2(change_type->get_combined_minimum_size().x, 0));
+ change_type->set_position(rect.position + rect.size - Vector2(change_type->get_contents_minimum_size().x, 0));
change_type->popup();
}
void EditorPropertyArray::_change_type_menu(int p_index) {
-
if (p_index == Variant::VARIANT_MAX) {
_remove_pressed(changing_type_idx);
return;
}
Variant value;
- Variant::CallError ce;
- value = Variant::construct(Variant::Type(p_index), NULL, 0, ce);
+ Callable::CallError ce;
+ value = Variant::construct(Variant::Type(p_index), nullptr, 0, ce);
Variant array = object->get_array();
array.set(changing_type_idx, value);
@@ -213,48 +200,46 @@ void EditorPropertyArray::_change_type_menu(int p_index) {
update_property();
}
-void EditorPropertyArray::_object_id_selected(const String &p_property, ObjectID p_id) {
+void EditorPropertyArray::_object_id_selected(const StringName &p_property, ObjectID p_id) {
emit_signal("object_id_selected", p_property, p_id);
}
void EditorPropertyArray::update_property() {
-
Variant array = get_edited_object()->get(get_edited_property());
String arrtype = "";
switch (array_type) {
case Variant::ARRAY: {
arrtype = "Array";
-
} break;
// arrays
- case Variant::POOL_BYTE_ARRAY: {
- arrtype = "PoolByteArray";
-
+ case Variant::PACKED_BYTE_ARRAY: {
+ arrtype = "PackedByteArray";
} break;
- case Variant::POOL_INT_ARRAY: {
- arrtype = "PoolIntArray";
-
+ case Variant::PACKED_INT32_ARRAY: {
+ arrtype = "PackedInt32Array";
} break;
- case Variant::POOL_REAL_ARRAY: {
-
- arrtype = "PoolFloatArray";
+ case Variant::PACKED_FLOAT32_ARRAY: {
+ arrtype = "PackedFloat32Array";
} break;
- case Variant::POOL_STRING_ARRAY: {
-
- arrtype = "PoolStringArray";
+ case Variant::PACKED_INT64_ARRAY: {
+ arrtype = "PackedInt64Array";
} break;
- case Variant::POOL_VECTOR2_ARRAY: {
-
- arrtype = "PoolVector2Array";
+ case Variant::PACKED_FLOAT64_ARRAY: {
+ arrtype = "PackedFloat64Array";
} break;
- case Variant::POOL_VECTOR3_ARRAY: {
- arrtype = "PoolVector3Array";
-
+ case Variant::PACKED_STRING_ARRAY: {
+ arrtype = "PackedStringArray";
} break;
- case Variant::POOL_COLOR_ARRAY: {
- arrtype = "PoolColorArray";
+ case Variant::PACKED_VECTOR2_ARRAY: {
+ arrtype = "PackedVector2Array";
+ } break;
+ case Variant::PACKED_VECTOR3_ARRAY: {
+ arrtype = "PackedVector3Array";
+ } break;
+ case Variant::PACKED_COLOR_ARRAY: {
+ arrtype = "PackedColorArray";
} break;
default: {
}
@@ -264,9 +249,9 @@ void EditorPropertyArray::update_property() {
edit->set_text(String("(Nil) ") + arrtype);
edit->set_pressed(false);
if (vbox) {
- set_bottom_editor(NULL);
+ set_bottom_editor(nullptr);
memdelete(vbox);
- vbox = NULL;
+ vbox = nullptr;
}
return;
}
@@ -279,11 +264,9 @@ void EditorPropertyArray::update_property() {
}
if (unfolded) {
-
updating = true;
if (!vbox) {
-
vbox = memnew(VBoxContainer);
add_child(vbox);
set_bottom_editor(vbox);
@@ -297,7 +280,7 @@ void EditorPropertyArray::update_property() {
length->set_max(1000000);
length->set_h_size_flags(SIZE_EXPAND_FILL);
hbc->add_child(length);
- length->connect("value_changed", this, "_length_changed");
+ length->connect("value_changed", callable_mp(this, &EditorPropertyArray::_length_changed));
page_hb = memnew(HBoxContainer);
vbox->add_child(page_hb);
@@ -308,7 +291,7 @@ void EditorPropertyArray::update_property() {
page->set_step(1);
page_hb->add_child(page);
page->set_h_size_flags(SIZE_EXPAND_FILL);
- page->connect("value_changed", this, "_page_changed");
+ page->connect("value_changed", callable_mp(this, &EditorPropertyArray::_page_changed));
} else {
//bye bye children of the box
while (vbox->get_child_count() > 2) {
@@ -341,7 +324,7 @@ void EditorPropertyArray::update_property() {
for (int i = 0; i < amount; i++) {
String prop_name = "indices/" + itos(i + offset);
- EditorProperty *prop = NULL;
+ EditorProperty *prop = nullptr;
Variant value = array.get(i + offset);
Variant::Type value_type = value.get_type();
@@ -354,14 +337,14 @@ void EditorPropertyArray::update_property() {
editor->setup("Object");
prop = editor;
} else {
- prop = EditorInspector::instantiate_property_editor(NULL, value_type, "", subtype_hint, subtype_hint_string, 0);
+ prop = EditorInspector::instantiate_property_editor(nullptr, value_type, "", subtype_hint, subtype_hint_string, 0);
}
prop->set_object_and_property(object.ptr(), prop_name);
prop->set_label(itos(i + offset));
prop->set_selectable(false);
- prop->connect("property_changed", this, "_property_changed");
- prop->connect("object_id_selected", this, "_object_id_selected");
+ prop->connect("property_changed", callable_mp(this, &EditorPropertyArray::_property_changed));
+ prop->connect("object_id_selected", callable_mp(this, &EditorPropertyArray::_object_id_selected));
prop->set_h_size_flags(SIZE_EXPAND_FILL);
HBoxContainer *hb = memnew(HBoxContainer);
@@ -372,16 +355,14 @@ void EditorPropertyArray::update_property() {
bool is_untyped_array = array.get_type() == Variant::ARRAY && subtype == Variant::NIL;
if (is_untyped_array) {
-
Button *edit = memnew(Button);
- edit->set_icon(get_icon("Edit", "EditorIcons"));
+ edit->set_icon(get_theme_icon("Edit", "EditorIcons"));
hb->add_child(edit);
- edit->connect("pressed", this, "_change_type", varray(edit, i + offset));
+ edit->connect("pressed", callable_mp(this, &EditorPropertyArray::_change_type), varray(edit, i + offset));
} else {
-
Button *remove = memnew(Button);
- remove->set_icon(get_icon("Remove", "EditorIcons"));
- remove->connect("pressed", this, "_remove_pressed", varray(i + offset));
+ remove->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ remove->connect("pressed", callable_mp(this, &EditorPropertyArray::_remove_pressed), varray(i + offset));
hb->add_child(remove);
}
@@ -392,15 +373,14 @@ void EditorPropertyArray::update_property() {
} else {
if (vbox) {
- set_bottom_editor(NULL);
+ set_bottom_editor(nullptr);
memdelete(vbox);
- vbox = NULL;
+ vbox = nullptr;
}
}
}
void EditorPropertyArray::_remove_pressed(int p_index) {
-
Variant array = object->get_array();
array.call("remove", p_index);
@@ -413,14 +393,105 @@ void EditorPropertyArray::_remove_pressed(int p_index) {
update_property();
}
+void EditorPropertyArray::_button_draw() {
+ if (dropping) {
+ Color color = get_theme_color("accent_color", "Editor");
+ edit->draw_rect(Rect2(Point2(), edit->get_size()), color, false);
+ }
+}
+
+bool EditorPropertyArray::_is_drop_valid(const Dictionary &p_drag_data) const {
+ String allowed_type = Variant::get_type_name(subtype);
+
+ Dictionary drag_data = p_drag_data;
+
+ if (drag_data.has("type") && String(drag_data["type"]) == "files") {
+ Vector<String> files = drag_data["files"];
+
+ for (int i = 0; i < files.size(); i++) {
+ String file = files[i];
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+
+ for (int j = 0; j < allowed_type.get_slice_count(","); j++) {
+ String at = allowed_type.get_slice(",", j).strip_edges();
+ // Fail if one of the files is not of allowed type
+ if (!ClassDB::is_parent_class(ftype, at)) {
+ return false;
+ }
+ }
+ }
+
+ // If no files fail, drop is valid
+ return true;
+ }
+
+ return false;
+}
+
+bool EditorPropertyArray::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
+ return _is_drop_valid(p_data);
+}
+
+void EditorPropertyArray::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+ ERR_FAIL_COND(!_is_drop_valid(p_data));
+
+ Dictionary drag_data = p_data;
+
+ if (drag_data.has("type") && String(drag_data["type"]) == "files") {
+ Vector<String> files = drag_data["files"];
+
+ Variant array = object->get_array();
+
+ // Handle the case where array is not initialised yet
+ if (!array.is_array()) {
+ Callable::CallError ce;
+ array = Variant::construct(array_type, nullptr, 0, ce);
+ }
+
+ // Loop the file array and add to existing array
+ for (int i = 0; i < files.size(); i++) {
+ String file = files[i];
+
+ RES res = ResourceLoader::load(file);
+ if (res.is_valid()) {
+ array.call("push_back", res);
+ }
+ }
+
+ if (array.get_type() == Variant::ARRAY) {
+ array = array.call("duplicate");
+ }
+
+ emit_changed(get_edited_property(), array, "", false);
+ object->set_array(array);
+
+ update_property();
+ }
+}
+
void EditorPropertyArray::_notification(int p_what) {
+ if (p_what == NOTIFICATION_DRAG_BEGIN) {
+ if (is_visible_in_tree()) {
+ if (_is_drop_valid(get_viewport()->gui_get_drag_data())) {
+ dropping = true;
+ edit->update();
+ }
+ }
+ }
+
+ if (p_what == NOTIFICATION_DRAG_END) {
+ if (dropping) {
+ dropping = false;
+ edit->update();
+ }
+ }
}
-void EditorPropertyArray::_edit_pressed() {
+void EditorPropertyArray::_edit_pressed() {
Variant array = get_edited_object()->get(get_edited_property());
if (!array.is_array()) {
- Variant::CallError ce;
- array = Variant::construct(array_type, NULL, 0, ce);
+ Callable::CallError ce;
+ array = Variant::construct(array_type, nullptr, 0, ce);
get_edited_object()->set(get_edited_property(), array);
}
@@ -430,15 +501,17 @@ void EditorPropertyArray::_edit_pressed() {
}
void EditorPropertyArray::_page_changed(double p_page) {
- if (updating)
+ if (updating) {
return;
+ }
page_idx = p_page;
update_property();
}
void EditorPropertyArray::_length_changed(double p_page) {
- if (updating)
+ if (updating) {
return;
+ }
Variant array = object->get_array();
int previous_size = array.call("size");
@@ -450,8 +523,8 @@ void EditorPropertyArray::_length_changed(double p_page) {
int size = array.call("size");
for (int i = previous_size; i < size; i++) {
if (array.get(i).get_type() == Variant::NIL) {
- Variant::CallError ce;
- array.set(i, Variant::construct(subtype, NULL, 0, ce));
+ Callable::CallError ce;
+ array.set(i, Variant::construct(subtype, nullptr, 0, ce));
}
}
}
@@ -460,8 +533,8 @@ void EditorPropertyArray::_length_changed(double p_page) {
int size = array.call("size");
// Pool*Array don't initialize their elements, have to do it manually
for (int i = previous_size; i < size; i++) {
- Variant::CallError ce;
- array.set(i, Variant::construct(array.get(i).get_type(), NULL, 0, ce));
+ Callable::CallError ce;
+ array.set(i, Variant::construct(array.get(i).get_type(), nullptr, 0, ce));
}
}
@@ -471,7 +544,6 @@ void EditorPropertyArray::_length_changed(double p_page) {
}
void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint_string) {
-
array_type = p_array_type;
if (array_type == Variant::ARRAY && !p_hint_string.empty()) {
@@ -491,18 +563,11 @@ void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint
}
void EditorPropertyArray::_bind_methods() {
- ClassDB::bind_method("_edit_pressed", &EditorPropertyArray::_edit_pressed);
- ClassDB::bind_method("_page_changed", &EditorPropertyArray::_page_changed);
- ClassDB::bind_method("_length_changed", &EditorPropertyArray::_length_changed);
- ClassDB::bind_method("_property_changed", &EditorPropertyArray::_property_changed, DEFVAL(String()), DEFVAL(false));
- ClassDB::bind_method("_change_type", &EditorPropertyArray::_change_type);
- ClassDB::bind_method("_change_type_menu", &EditorPropertyArray::_change_type_menu);
- ClassDB::bind_method("_object_id_selected", &EditorPropertyArray::_object_id_selected);
- ClassDB::bind_method("_remove_pressed", &EditorPropertyArray::_remove_pressed);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &EditorPropertyArray::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &EditorPropertyArray::drop_data_fw);
}
EditorPropertyArray::EditorPropertyArray() {
-
object.instance();
page_idx = 0;
page_len = 10;
@@ -510,17 +575,19 @@ EditorPropertyArray::EditorPropertyArray() {
edit->set_flat(true);
edit->set_h_size_flags(SIZE_EXPAND_FILL);
edit->set_clip_text(true);
- edit->connect("pressed", this, "_edit_pressed");
+ edit->connect("pressed", callable_mp(this, &EditorPropertyArray::_edit_pressed));
edit->set_toggle_mode(true);
+ edit->set_drag_forwarding(this);
+ edit->connect("draw", callable_mp(this, &EditorPropertyArray::_button_draw));
add_child(edit);
add_focusable(edit);
- vbox = NULL;
- page = NULL;
- length = NULL;
+ vbox = nullptr;
+ page = nullptr;
+ length = nullptr;
updating = false;
change_type = memnew(PopupMenu);
add_child(change_type);
- change_type->connect("id_pressed", this, "_change_type_menu");
+ change_type->connect("id_pressed", callable_mp(this, &EditorPropertyArray::_change_type_menu));
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
String type = Variant::get_type_name(Variant::Type(i));
@@ -533,20 +600,19 @@ EditorPropertyArray::EditorPropertyArray() {
subtype = Variant::NIL;
subtype_hint = PROPERTY_HINT_NONE;
subtype_hint_string = "";
+
+ dropping = false;
}
///////////////////// DICTIONARY ///////////////////////////
-void EditorPropertyDictionary::_property_changed(const String &p_prop, Variant p_value, const String &p_name, bool changing) {
-
- if (p_prop == "new_item_key") {
-
+void EditorPropertyDictionary::_property_changed(const String &p_property, Variant p_value, const String &p_name, bool p_changing) {
+ if (p_property == "new_item_key") {
object->set_new_item_key(p_value);
- } else if (p_prop == "new_item_value") {
-
+ } else if (p_property == "new_item_value") {
object->set_new_item_value(p_value);
- } else if (p_prop.begins_with("indices")) {
- int idx = p_prop.get_slice("/", 1).to_int();
+ } else if (p_property.begins_with("indices")) {
+ int idx = p_property.get_slice("/", 1).to_int();
Dictionary dict = object->get_dict();
Variant key = dict.get_key_at_index(idx);
dict[key] = p_value;
@@ -559,18 +625,16 @@ void EditorPropertyDictionary::_property_changed(const String &p_prop, Variant p
}
void EditorPropertyDictionary::_change_type(Object *p_button, int p_index) {
-
Button *button = Object::cast_to<Button>(p_button);
- Rect2 rect = button->get_global_rect();
+ Rect2 rect = button->get_screen_rect();
change_type->set_as_minsize();
- change_type->set_global_position(rect.position + rect.size - Vector2(change_type->get_combined_minimum_size().x, 0));
+ change_type->set_position(rect.position + rect.size - Vector2(change_type->get_contents_minimum_size().x, 0));
change_type->popup();
changing_type_idx = p_index;
}
void EditorPropertyDictionary::_add_key_value() {
-
// Do not allow nil as valid key. I experienced errors with this
if (object->get_new_item_key().get_type() == Variant::NIL) {
return;
@@ -590,11 +654,10 @@ void EditorPropertyDictionary::_add_key_value() {
}
void EditorPropertyDictionary::_change_type_menu(int p_index) {
-
if (changing_type_idx < 0) {
Variant value;
- Variant::CallError ce;
- value = Variant::construct(Variant::Type(p_index), NULL, 0, ce);
+ Callable::CallError ce;
+ value = Variant::construct(Variant::Type(p_index), nullptr, 0, ce);
if (changing_type_idx == -1) {
object->set_new_item_key(value);
} else {
@@ -607,10 +670,9 @@ void EditorPropertyDictionary::_change_type_menu(int p_index) {
Dictionary dict = object->get_dict();
if (p_index < Variant::VARIANT_MAX) {
-
Variant value;
- Variant::CallError ce;
- value = Variant::construct(Variant::Type(p_index), NULL, 0, ce);
+ Callable::CallError ce;
+ value = Variant::construct(Variant::Type(p_index), nullptr, 0, ce);
Variant key = dict.get_key_at_index(changing_type_idx);
dict[key] = value;
} else {
@@ -626,16 +688,15 @@ void EditorPropertyDictionary::_change_type_menu(int p_index) {
}
void EditorPropertyDictionary::update_property() {
-
Variant updated_val = get_edited_object()->get(get_edited_property());
if (updated_val.get_type() == Variant::NIL) {
edit->set_text("Dictionary (Nil)"); //This provides symmetry with the array property.
edit->set_pressed(false);
if (vbox) {
- set_bottom_editor(NULL);
+ set_bottom_editor(nullptr);
memdelete(vbox);
- vbox = NULL;
+ vbox = nullptr;
}
return;
}
@@ -650,11 +711,9 @@ void EditorPropertyDictionary::update_property() {
}
if (unfolded) {
-
updating = true;
if (!vbox) {
-
vbox = memnew(VBoxContainer);
add_child(vbox);
set_bottom_editor(vbox);
@@ -668,7 +727,7 @@ void EditorPropertyDictionary::update_property() {
page->set_step(1);
page_hb->add_child(page);
page->set_h_size_flags(SIZE_EXPAND_FILL);
- page->connect("value_changed", this, "_page_changed");
+ page->connect("value_changed", callable_mp(this, &EditorPropertyDictionary::_page_changed));
} else {
// Queue children for deletion, deleting immediately might cause errors.
for (int i = 1; i < vbox->get_child_count(); i++) {
@@ -692,7 +751,7 @@ void EditorPropertyDictionary::update_property() {
dict = dict.duplicate();
object->set_dict(dict);
- VBoxContainer *add_vbox = NULL;
+ VBoxContainer *add_vbox = nullptr;
for (int i = 0; i < amount + 2; i++) {
String prop_name;
@@ -711,7 +770,7 @@ void EditorPropertyDictionary::update_property() {
value = object->get_new_item_value();
}
- EditorProperty *prop = NULL;
+ EditorProperty *prop = nullptr;
switch (value.get_type()) {
case Variant::NIL: {
@@ -721,7 +780,6 @@ void EditorPropertyDictionary::update_property() {
// atomic types
case Variant::BOOL: {
-
prop = memnew(EditorPropertyCheck);
} break;
@@ -731,63 +789,72 @@ void EditorPropertyDictionary::update_property() {
prop = editor;
} break;
- case Variant::REAL: {
-
+ case Variant::FLOAT: {
EditorPropertyFloat *editor = memnew(EditorPropertyFloat);
editor->setup(-100000, 100000, 0.001, true, false, true, true);
prop = editor;
} break;
case Variant::STRING: {
-
prop = memnew(EditorPropertyText);
} break;
// math types
case Variant::VECTOR2: {
-
EditorPropertyVector2 *editor = memnew(EditorPropertyVector2);
editor->setup(-100000, 100000, 0.001, true);
prop = editor;
} break;
- case Variant::RECT2: {
+ case Variant::VECTOR2I: {
+ EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i);
+ editor->setup(-100000, 100000, true);
+ prop = editor;
+ } break;
+ case Variant::RECT2: {
EditorPropertyRect2 *editor = memnew(EditorPropertyRect2);
editor->setup(-100000, 100000, 0.001, true);
prop = editor;
} break;
- case Variant::VECTOR3: {
+ case Variant::RECT2I: {
+ EditorPropertyRect2i *editor = memnew(EditorPropertyRect2i);
+ editor->setup(-100000, 100000, true);
+ prop = editor;
+ } break;
+ case Variant::VECTOR3: {
EditorPropertyVector3 *editor = memnew(EditorPropertyVector3);
editor->setup(-100000, 100000, 0.001, true);
prop = editor;
} break;
- case Variant::TRANSFORM2D: {
+ case Variant::VECTOR3I: {
+ EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i);
+ editor->setup(-100000, 100000, true);
+ prop = editor;
+ } break;
+ case Variant::TRANSFORM2D: {
EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D);
editor->setup(-100000, 100000, 0.001, true);
prop = editor;
} break;
case Variant::PLANE: {
-
EditorPropertyPlane *editor = memnew(EditorPropertyPlane);
editor->setup(-100000, 100000, 0.001, true);
prop = editor;
} break;
case Variant::QUAT: {
-
EditorPropertyQuat *editor = memnew(EditorPropertyQuat);
editor->setup(-100000, 100000, 0.001, true);
prop = editor;
} break;
case Variant::AABB: {
-
EditorPropertyAABB *editor = memnew(EditorPropertyAABB);
editor->setup(-100000, 100000, 0.001, true);
prop = editor;
@@ -811,6 +878,12 @@ void EditorPropertyDictionary::update_property() {
prop = memnew(EditorPropertyColor);
} break;
+ case Variant::STRING_NAME: {
+ EditorPropertyText *ept = memnew(EditorPropertyText);
+ ept->set_string_name(true);
+ prop = ept;
+
+ } break;
case Variant::NODE_PATH: {
prop = memnew(EditorPropertyNodePath);
@@ -820,15 +893,12 @@ void EditorPropertyDictionary::update_property() {
} break;
case Variant::OBJECT: {
-
if (Object::cast_to<EncodedObjectAsID>(value)) {
-
EditorPropertyObjectID *editor = memnew(EditorPropertyObjectID);
editor->setup("Object");
prop = editor;
} else {
-
EditorPropertyResource *editor = memnew(EditorPropertyResource);
editor->setup("Resource");
prop = editor;
@@ -846,46 +916,49 @@ void EditorPropertyDictionary::update_property() {
} break;
// arrays
- case Variant::POOL_BYTE_ARRAY: {
-
+ case Variant::PACKED_BYTE_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_BYTE_ARRAY);
+ editor->setup(Variant::PACKED_BYTE_ARRAY);
prop = editor;
} break;
- case Variant::POOL_INT_ARRAY: {
-
+ case Variant::PACKED_INT32_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_INT_ARRAY);
+ editor->setup(Variant::PACKED_INT32_ARRAY);
prop = editor;
} break;
- case Variant::POOL_REAL_ARRAY: {
-
+ case Variant::PACKED_FLOAT32_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_REAL_ARRAY);
+ editor->setup(Variant::PACKED_FLOAT32_ARRAY);
prop = editor;
} break;
- case Variant::POOL_STRING_ARRAY: {
-
+ case Variant::PACKED_INT64_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_STRING_ARRAY);
+ editor->setup(Variant::PACKED_INT64_ARRAY);
prop = editor;
} break;
- case Variant::POOL_VECTOR2_ARRAY: {
-
+ case Variant::PACKED_FLOAT64_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_VECTOR2_ARRAY);
+ editor->setup(Variant::PACKED_FLOAT64_ARRAY);
prop = editor;
} break;
- case Variant::POOL_VECTOR3_ARRAY: {
-
+ case Variant::PACKED_STRING_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_VECTOR3_ARRAY);
+ editor->setup(Variant::PACKED_STRING_ARRAY);
prop = editor;
} break;
- case Variant::POOL_COLOR_ARRAY: {
-
+ case Variant::PACKED_VECTOR2_ARRAY: {
+ EditorPropertyArray *editor = memnew(EditorPropertyArray);
+ editor->setup(Variant::PACKED_VECTOR2_ARRAY);
+ prop = editor;
+ } break;
+ case Variant::PACKED_VECTOR3_ARRAY: {
+ EditorPropertyArray *editor = memnew(EditorPropertyArray);
+ editor->setup(Variant::PACKED_VECTOR3_ARRAY);
+ prop = editor;
+ } break;
+ case Variant::PACKED_COLOR_ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_COLOR_ARRAY);
+ editor->setup(Variant::PACKED_COLOR_ARRAY);
prop = editor;
} break;
default: {
@@ -900,9 +973,9 @@ void EditorPropertyDictionary::update_property() {
for (int j = 0; j < 4; j++) {
flat->set_default_margin(Margin(j), 2 * EDSCALE);
}
- flat->set_bg_color(get_color("prop_subsection", "Editor"));
+ flat->set_bg_color(get_theme_color("prop_subsection", "Editor"));
- pc->add_style_override("panel", flat);
+ pc->add_theme_style_override("panel", flat);
add_vbox = memnew(VBoxContainer);
pc->add_child(add_vbox);
}
@@ -923,8 +996,8 @@ void EditorPropertyDictionary::update_property() {
}
prop->set_selectable(false);
- prop->connect("property_changed", this, "_property_changed");
- prop->connect("object_id_selected", this, "_object_id_selected");
+ prop->connect("property_changed", callable_mp(this, &EditorPropertyDictionary::_property_changed));
+ prop->connect("object_id_selected", callable_mp(this, &EditorPropertyDictionary::_object_id_selected));
HBoxContainer *hb = memnew(HBoxContainer);
if (add_vbox) {
@@ -935,16 +1008,16 @@ void EditorPropertyDictionary::update_property() {
hb->add_child(prop);
prop->set_h_size_flags(SIZE_EXPAND_FILL);
Button *edit = memnew(Button);
- edit->set_icon(get_icon("Edit", "EditorIcons"));
+ edit->set_icon(get_theme_icon("Edit", "EditorIcons"));
hb->add_child(edit);
- edit->connect("pressed", this, "_change_type", varray(edit, change_index));
+ edit->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_change_type), varray(edit, change_index));
prop->update_property();
if (i == amount + 1) {
Button *butt_add_item = memnew(Button);
butt_add_item->set_text(TTR("Add Key/Value Pair"));
- butt_add_item->connect("pressed", this, "_add_key_value");
+ butt_add_item->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_add_key_value));
add_vbox->add_child(butt_add_item);
}
}
@@ -953,14 +1026,14 @@ void EditorPropertyDictionary::update_property() {
} else {
if (vbox) {
- set_bottom_editor(NULL);
+ set_bottom_editor(nullptr);
memdelete(vbox);
- vbox = NULL;
+ vbox = nullptr;
}
}
}
-void EditorPropertyDictionary::_object_id_selected(const String &p_property, ObjectID p_id) {
+void EditorPropertyDictionary::_object_id_selected(const StringName &p_property, ObjectID p_id) {
emit_signal("object_id_selected", p_property, p_id);
}
@@ -968,11 +1041,10 @@ void EditorPropertyDictionary::_notification(int p_what) {
}
void EditorPropertyDictionary::_edit_pressed() {
-
Variant prop_val = get_edited_object()->get(get_edited_property());
if (prop_val.get_type() == Variant::NIL) {
- Variant::CallError ce;
- prop_val = Variant::construct(Variant::DICTIONARY, NULL, 0, ce);
+ Callable::CallError ce;
+ prop_val = Variant::construct(Variant::DICTIONARY, nullptr, 0, ce);
get_edited_object()->set(get_edited_property(), prop_val);
}
@@ -981,24 +1053,17 @@ void EditorPropertyDictionary::_edit_pressed() {
}
void EditorPropertyDictionary::_page_changed(double p_page) {
- if (updating)
+ if (updating) {
return;
+ }
page_idx = p_page;
update_property();
}
void EditorPropertyDictionary::_bind_methods() {
- ClassDB::bind_method("_edit_pressed", &EditorPropertyDictionary::_edit_pressed);
- ClassDB::bind_method("_page_changed", &EditorPropertyDictionary::_page_changed);
- ClassDB::bind_method("_property_changed", &EditorPropertyDictionary::_property_changed, DEFVAL(String()), DEFVAL(false));
- ClassDB::bind_method("_change_type", &EditorPropertyDictionary::_change_type);
- ClassDB::bind_method("_change_type_menu", &EditorPropertyDictionary::_change_type_menu);
- ClassDB::bind_method("_add_key_value", &EditorPropertyDictionary::_add_key_value);
- ClassDB::bind_method("_object_id_selected", &EditorPropertyDictionary::_object_id_selected);
}
EditorPropertyDictionary::EditorPropertyDictionary() {
-
object.instance();
page_idx = 0;
page_len = 10;
@@ -1006,16 +1071,16 @@ EditorPropertyDictionary::EditorPropertyDictionary() {
edit->set_flat(true);
edit->set_h_size_flags(SIZE_EXPAND_FILL);
edit->set_clip_text(true);
- edit->connect("pressed", this, "_edit_pressed");
+ edit->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_edit_pressed));
edit->set_toggle_mode(true);
add_child(edit);
add_focusable(edit);
- vbox = NULL;
- page = NULL;
+ vbox = nullptr;
+ page = nullptr;
updating = false;
change_type = memnew(PopupMenu);
add_child(change_type);
- change_type->connect("id_pressed", this, "_change_type_menu");
+ change_type->connect("id_pressed", callable_mp(this, &EditorPropertyDictionary::_change_type_menu));
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
String type = Variant::get_type_name(Variant::Type(i));
diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h
index d4f8abf583..c786528d48 100644
--- a/editor/editor_properties_array_dict.h
+++ b/editor/editor_properties_array_dict.h
@@ -33,10 +33,10 @@
#include "editor/editor_inspector.h"
#include "editor/editor_spin_slider.h"
+#include "editor/filesystem_dock.h"
#include "scene/gui/button.h"
class EditorPropertyArrayObject : public Reference {
-
GDCLASS(EditorPropertyArrayObject, Reference);
Variant array;
@@ -53,7 +53,6 @@ public:
};
class EditorPropertyDictionaryObject : public Reference {
-
GDCLASS(EditorPropertyDictionaryObject, Reference);
Variant new_item_key;
@@ -82,6 +81,7 @@ class EditorPropertyArray : public EditorProperty {
PopupMenu *change_type;
bool updating;
+ bool dropping;
Ref<EditorPropertyArrayObject> object;
int page_len;
@@ -100,20 +100,25 @@ class EditorPropertyArray : public EditorProperty {
void _page_changed(double p_page);
void _length_changed(double p_page);
void _edit_pressed();
- void _property_changed(const String &p_prop, Variant p_value, const String &p_name = String(), bool changing = false);
+ void _property_changed(const String &p_property, Variant p_value, const String &p_name = "", bool p_changing = false);
void _change_type(Object *p_button, int p_index);
void _change_type_menu(int p_index);
- void _object_id_selected(const String &p_property, ObjectID p_id);
+ void _object_id_selected(const StringName &p_property, ObjectID p_id);
void _remove_pressed(int p_index);
+ void _button_draw();
+ bool _is_drop_valid(const Dictionary &p_drag_data) const;
+ bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
+ void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+
protected:
static void _bind_methods();
void _notification(int p_what);
public:
void setup(Variant::Type p_array_type, const String &p_hint_string = "");
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyArray();
};
@@ -135,19 +140,19 @@ class EditorPropertyDictionary : public EditorProperty {
void _page_changed(double p_page);
void _edit_pressed();
- void _property_changed(const String &p_prop, Variant p_value, const String &p_name = String(), bool changing = false);
+ void _property_changed(const String &p_property, Variant p_value, const String &p_name = "", bool p_changing = false);
void _change_type(Object *p_button, int p_index);
void _change_type_menu(int p_index);
void _add_key_value();
- void _object_id_selected(const String &p_property, ObjectID p_id);
+ void _object_id_selected(const StringName &p_property, ObjectID p_id);
protected:
static void _bind_methods();
void _notification(int p_what);
public:
- virtual void update_property();
+ virtual void update_property() override;
EditorPropertyDictionary();
};
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
index f63d4884e2..d2250fed7a 100644
--- a/editor/editor_resource_preview.cpp
+++ b/editor/editor_resource_preview.cpp
@@ -42,35 +42,32 @@
#include "editor_settings.h"
bool EditorResourcePreviewGenerator::handles(const String &p_type) const {
-
if (get_script_instance() && get_script_instance()->has_method("handles")) {
return get_script_instance()->call("handles", p_type);
}
ERR_FAIL_V_MSG(false, "EditorResourcePreviewGenerator::handles needs to be overridden.");
}
-Ref<Texture> EditorResourcePreviewGenerator::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorResourcePreviewGenerator::generate(const RES &p_from, const Size2 &p_size) const {
if (get_script_instance() && get_script_instance()->has_method("generate")) {
return get_script_instance()->call("generate", p_from, p_size);
}
- ERR_FAIL_V_MSG(Ref<Texture>(), "EditorResourcePreviewGenerator::generate needs to be overridden.");
+ ERR_FAIL_V_MSG(Ref<Texture2D>(), "EditorResourcePreviewGenerator::generate needs to be overridden.");
}
-Ref<Texture> EditorResourcePreviewGenerator::generate_from_path(const String &p_path, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorResourcePreviewGenerator::generate_from_path(const String &p_path, const Size2 &p_size) const {
if (get_script_instance() && get_script_instance()->has_method("generate_from_path")) {
return get_script_instance()->call("generate_from_path", p_path, p_size);
}
RES res = ResourceLoader::load(p_path);
- if (!res.is_valid())
+ if (!res.is_valid()) {
return res;
+ }
return generate(res, p_size);
}
bool EditorResourcePreviewGenerator::generate_small_preview_automatically() const {
-
if (get_script_instance() && get_script_instance()->has_method("generate_small_preview_automatically")) {
return get_script_instance()->call("generate_small_preview_automatically");
}
@@ -79,7 +76,6 @@ bool EditorResourcePreviewGenerator::generate_small_preview_automatically() cons
}
bool EditorResourcePreviewGenerator::can_generate_small_preview() const {
-
if (get_script_instance() && get_script_instance()->has_method("can_generate_small_preview")) {
return get_script_instance()->call("can_generate_small_preview");
}
@@ -88,10 +84,9 @@ bool EditorResourcePreviewGenerator::can_generate_small_preview() const {
}
void EditorResourcePreviewGenerator::_bind_methods() {
-
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "handles", PropertyInfo(Variant::STRING, "type")));
- ClassDB::add_virtual_method(get_class_static(), MethodInfo(CLASS_INFO(Texture), "generate", PropertyInfo(Variant::OBJECT, "from", PROPERTY_HINT_RESOURCE_TYPE, "Resource"), PropertyInfo(Variant::VECTOR2, "size")));
- ClassDB::add_virtual_method(get_class_static(), MethodInfo(CLASS_INFO(Texture), "generate_from_path", PropertyInfo(Variant::STRING, "path", PROPERTY_HINT_FILE), PropertyInfo(Variant::VECTOR2, "size")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(CLASS_INFO(Texture2D), "generate", PropertyInfo(Variant::OBJECT, "from", PROPERTY_HINT_RESOURCE_TYPE, "Resource"), PropertyInfo(Variant::VECTOR2, "size")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(CLASS_INFO(Texture2D), "generate_from_path", PropertyInfo(Variant::STRING, "path", PROPERTY_HINT_FILE), PropertyInfo(Variant::VECTOR2, "size")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "generate_small_preview_automatically"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "can_generate_small_preview"));
}
@@ -99,39 +94,37 @@ void EditorResourcePreviewGenerator::_bind_methods() {
EditorResourcePreviewGenerator::EditorResourcePreviewGenerator() {
}
-EditorResourcePreview *EditorResourcePreview::singleton = NULL;
+EditorResourcePreview *EditorResourcePreview::singleton = nullptr;
void EditorResourcePreview::_thread_func(void *ud) {
-
EditorResourcePreview *erp = (EditorResourcePreview *)ud;
erp->_thread();
}
-void EditorResourcePreview::_preview_ready(const String &p_str, const Ref<Texture> &p_texture, const Ref<Texture> &p_small_texture, ObjectID id, const StringName &p_func, const Variant &p_ud) {
-
- preview_mutex->lock();
-
+void EditorResourcePreview::_preview_ready(const String &p_str, const Ref<Texture2D> &p_texture, const Ref<Texture2D> &p_small_texture, ObjectID id, const StringName &p_func, const Variant &p_ud) {
String path = p_str;
- uint32_t hash = 0;
- uint64_t modified_time = 0;
+ {
+ MutexLock lock(preview_mutex);
- if (p_str.begins_with("ID:")) {
- hash = uint32_t(p_str.get_slicec(':', 2).to_int64());
- path = "ID:" + p_str.get_slicec(':', 1);
- } else {
- modified_time = FileAccess::get_modified_time(path);
- }
+ uint32_t hash = 0;
+ uint64_t modified_time = 0;
- Item item;
- item.order = order++;
- item.preview = p_texture;
- item.small_preview = p_small_texture;
- item.last_hash = hash;
- item.modified_time = modified_time;
+ if (p_str.begins_with("ID:")) {
+ hash = uint32_t(p_str.get_slicec(':', 2).to_int());
+ path = "ID:" + p_str.get_slicec(':', 1);
+ } else {
+ modified_time = FileAccess::get_modified_time(path);
+ }
- cache[path] = item;
+ Item item;
+ item.order = order++;
+ item.preview = p_texture;
+ item.small_preview = p_small_texture;
+ item.last_hash = hash;
+ item.modified_time = modified_time;
- preview_mutex->unlock();
+ cache[path] = item;
+ }
MessageQueue::get_singleton()->push_call(id, p_func, path, p_texture, p_small_texture, p_ud);
}
@@ -139,10 +132,11 @@ void EditorResourcePreview::_preview_ready(const String &p_str, const Ref<Textur
void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref<ImageTexture> &r_small_texture, const QueueItem &p_item, const String &cache_base) {
String type;
- if (p_item.resource.is_valid())
+ if (p_item.resource.is_valid()) {
type = p_item.resource->get_class();
- else
+ } else {
type = ResourceLoader::get_resource_type(p_item.path);
+ }
if (type == "") {
r_texture = Ref<ImageTexture>();
@@ -157,10 +151,11 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref<
r_small_texture = Ref<ImageTexture>();
for (int i = 0; i < preview_generators.size(); i++) {
- if (!preview_generators[i]->handles(type))
+ if (!preview_generators[i]->handles(type)) {
continue;
+ }
- Ref<Texture> generated;
+ Ref<Texture2D> generated;
if (p_item.resource.is_valid()) {
generated = preview_generators[i]->generate(p_item.resource, Vector2(thumbnail_size, thumbnail_size));
} else {
@@ -168,11 +163,11 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref<
}
r_texture = generated;
- int small_thumbnail_size = EditorNode::get_singleton()->get_theme_base()->get_icon("Object", "EditorIcons")->get_width(); // Kind of a workaround to retrieve the default icon size
+ int small_thumbnail_size = EditorNode::get_singleton()->get_theme_base()->get_theme_icon("Object", "EditorIcons")->get_width(); // Kind of a workaround to retrieve the default icon size
small_thumbnail_size *= EDSCALE;
if (preview_generators[i]->can_generate_small_preview()) {
- Ref<Texture> generated_small;
+ Ref<Texture2D> generated_small;
if (p_item.resource.is_valid()) {
generated_small = preview_generators[i]->generate(p_item.resource, Vector2(small_thumbnail_size, small_thumbnail_size));
} else {
@@ -214,15 +209,12 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref<
}
void EditorResourcePreview::_thread() {
-
exited = false;
while (!exit) {
-
- preview_sem->wait();
- preview_mutex->lock();
+ preview_sem.wait();
+ preview_mutex.lock();
if (queue.size()) {
-
QueueItem item = queue.front()->get();
queue.pop_front();
@@ -235,10 +227,9 @@ void EditorResourcePreview::_thread() {
_preview_ready(path, cache[item.path].preview, cache[item.path].small_preview, item.id, item.function, item.userdata);
- preview_mutex->unlock();
+ preview_mutex.unlock();
} else {
-
- preview_mutex->unlock();
+ preview_mutex.unlock();
Ref<ImageTexture> texture;
Ref<ImageTexture> small_texture;
@@ -247,14 +238,12 @@ void EditorResourcePreview::_thread() {
thumbnail_size *= EDSCALE;
if (item.resource.is_valid()) {
-
_generate_preview(texture, small_texture, item, String());
//adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred
_preview_ready(item.path + ":" + itos(item.resource->hash_edited_version()), texture, small_texture, item.id, item.function, item.userdata);
} else {
-
String temp_path = EditorSettings::get_singleton()->get_cache_dir();
String cache_base = ProjectSettings::get_singleton()->globalize_path(item.path).md5_text();
cache_base = temp_path.plus_file("resthumb-" + cache_base);
@@ -264,30 +253,25 @@ void EditorResourcePreview::_thread() {
String file = cache_base + ".txt";
FileAccess *f = FileAccess::open(file, FileAccess::READ);
if (!f) {
-
// No cache found, generate
_generate_preview(texture, small_texture, item, cache_base);
} else {
-
uint64_t modtime = FileAccess::get_modified_time(item.path);
- int tsize = f->get_line().to_int64();
+ int tsize = f->get_line().to_int();
bool has_small_texture = f->get_line().to_int();
- uint64_t last_modtime = f->get_line().to_int64();
+ uint64_t last_modtime = f->get_line().to_int();
bool cache_valid = true;
if (tsize != thumbnail_size) {
-
cache_valid = false;
memdelete(f);
} else if (last_modtime != modtime) {
-
String last_md5 = f->get_line();
String md5 = FileAccess::get_md5(item.path);
memdelete(f);
if (last_md5 != md5) {
-
cache_valid = false;
} else {
@@ -297,7 +281,7 @@ void EditorResourcePreview::_thread() {
if (!f) {
// Not returning as this would leave the thread hanging and would require
// some proper cleanup/disabling of resource preview generation.
- ERR_PRINTS("Cannot create file '" + file + "'. Check user write permissions.");
+ ERR_PRINT("Cannot create file '" + file + "'. Check user write permissions.");
} else {
f->store_line(itos(thumbnail_size));
f->store_line(itos(has_small_texture));
@@ -311,7 +295,6 @@ void EditorResourcePreview::_thread() {
}
if (cache_valid) {
-
Ref<Image> img;
img.instance();
Ref<Image> small_img;
@@ -320,23 +303,21 @@ void EditorResourcePreview::_thread() {
if (img->load(cache_base + ".png") != OK) {
cache_valid = false;
} else {
-
texture.instance();
- texture->create_from_image(img, Texture::FLAG_FILTER);
+ texture->create_from_image(img);
if (has_small_texture) {
if (small_img->load(cache_base + "_small.png") != OK) {
cache_valid = false;
} else {
small_texture.instance();
- small_texture->create_from_image(small_img, Texture::FLAG_FILTER);
+ small_texture->create_from_image(small_img);
}
}
}
}
if (!cache_valid) {
-
_generate_preview(texture, small_texture, item, cache_base);
}
}
@@ -345,82 +326,76 @@ void EditorResourcePreview::_thread() {
}
} else {
- preview_mutex->unlock();
+ preview_mutex.unlock();
}
}
exited = true;
}
void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p_res, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata) {
-
ERR_FAIL_NULL(p_receiver);
ERR_FAIL_COND(!p_res.is_valid());
- preview_mutex->lock();
+ {
+ MutexLock lock(preview_mutex);
- String path_id = "ID:" + itos(p_res->get_instance_id());
+ String path_id = "ID:" + itos(p_res->get_instance_id());
- if (cache.has(path_id) && cache[path_id].last_hash == p_res->hash_edited_version()) {
-
- cache[path_id].order = order++;
- p_receiver->call(p_receiver_func, path_id, cache[path_id].preview, cache[path_id].small_preview, p_userdata);
- preview_mutex->unlock();
- return;
- }
+ if (cache.has(path_id) && cache[path_id].last_hash == p_res->hash_edited_version()) {
+ cache[path_id].order = order++;
+ p_receiver->call(p_receiver_func, path_id, cache[path_id].preview, cache[path_id].small_preview, p_userdata);
+ return;
+ }
- cache.erase(path_id); //erase if exists, since it will be regen
+ cache.erase(path_id); //erase if exists, since it will be regen
- QueueItem item;
- item.function = p_receiver_func;
- item.id = p_receiver->get_instance_id();
- item.resource = p_res;
- item.path = path_id;
- item.userdata = p_userdata;
+ QueueItem item;
+ item.function = p_receiver_func;
+ item.id = p_receiver->get_instance_id();
+ item.resource = p_res;
+ item.path = path_id;
+ item.userdata = p_userdata;
- queue.push_back(item);
- preview_mutex->unlock();
- preview_sem->post();
+ queue.push_back(item);
+ }
+ preview_sem.post();
}
void EditorResourcePreview::queue_resource_preview(const String &p_path, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata) {
-
ERR_FAIL_NULL(p_receiver);
- preview_mutex->lock();
- if (cache.has(p_path)) {
- cache[p_path].order = order++;
- p_receiver->call(p_receiver_func, p_path, cache[p_path].preview, cache[p_path].small_preview, p_userdata);
- preview_mutex->unlock();
- return;
- }
+ {
+ MutexLock lock(preview_mutex);
- QueueItem item;
- item.function = p_receiver_func;
- item.id = p_receiver->get_instance_id();
- item.path = p_path;
- item.userdata = p_userdata;
+ if (cache.has(p_path)) {
+ cache[p_path].order = order++;
+ p_receiver->call(p_receiver_func, p_path, cache[p_path].preview, cache[p_path].small_preview, p_userdata);
+ return;
+ }
+
+ QueueItem item;
+ item.function = p_receiver_func;
+ item.id = p_receiver->get_instance_id();
+ item.path = p_path;
+ item.userdata = p_userdata;
- queue.push_back(item);
- preview_mutex->unlock();
- preview_sem->post();
+ queue.push_back(item);
+ }
+ preview_sem.post();
}
void EditorResourcePreview::add_preview_generator(const Ref<EditorResourcePreviewGenerator> &p_generator) {
-
preview_generators.push_back(p_generator);
}
void EditorResourcePreview::remove_preview_generator(const Ref<EditorResourcePreviewGenerator> &p_generator) {
-
preview_generators.erase(p_generator);
}
EditorResourcePreview *EditorResourcePreview::get_singleton() {
-
return singleton;
}
void EditorResourcePreview::_bind_methods() {
-
ClassDB::bind_method("_preview_ready", &EditorResourcePreview::_preview_ready);
ClassDB::bind_method(D_METHOD("queue_resource_preview", "path", "receiver", "receiver_func", "userdata"), &EditorResourcePreview::queue_resource_preview);
@@ -433,21 +408,19 @@ void EditorResourcePreview::_bind_methods() {
}
void EditorResourcePreview::check_for_invalidation(const String &p_path) {
-
- preview_mutex->lock();
-
bool call_invalidated = false;
- if (cache.has(p_path)) {
-
- uint64_t modified_time = FileAccess::get_modified_time(p_path);
- if (modified_time != cache[p_path].modified_time) {
- cache.erase(p_path);
- call_invalidated = true;
+ {
+ MutexLock lock(preview_mutex);
+
+ if (cache.has(p_path)) {
+ uint64_t modified_time = FileAccess::get_modified_time(p_path);
+ if (modified_time != cache[p_path].modified_time) {
+ cache.erase(p_path);
+ call_invalidated = true;
+ }
}
}
- preview_mutex->unlock();
-
if (call_invalidated) { //do outside mutex
call_deferred("emit_signal", "preview_invalidated", p_path);
}
@@ -461,30 +434,25 @@ void EditorResourcePreview::start() {
void EditorResourcePreview::stop() {
if (thread) {
exit = true;
- preview_sem->post();
+ preview_sem.post();
while (!exited) {
OS::get_singleton()->delay_usec(10000);
- VisualServer::get_singleton()->sync(); //sync pending stuff, as thread may be blocked on visual server
+ RenderingServer::get_singleton()->sync(); //sync pending stuff, as thread may be blocked on visual server
}
Thread::wait_to_finish(thread);
memdelete(thread);
- thread = NULL;
+ thread = nullptr;
}
}
EditorResourcePreview::EditorResourcePreview() {
- thread = NULL;
+ thread = nullptr;
singleton = this;
- preview_mutex = Mutex::create();
- preview_sem = Semaphore::create();
order = 0;
exit = false;
exited = false;
}
EditorResourcePreview::~EditorResourcePreview() {
-
stop();
- memdelete(preview_mutex);
- memdelete(preview_sem);
}
diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h
index 8091fbafdc..2f4bc65de9 100644
--- a/editor/editor_resource_preview.h
+++ b/editor/editor_resource_preview.h
@@ -37,7 +37,6 @@
#include "scene/resources/texture.h"
class EditorResourcePreviewGenerator : public Reference {
-
GDCLASS(EditorResourcePreviewGenerator, Reference);
protected:
@@ -45,8 +44,8 @@ protected:
public:
virtual bool handles(const String &p_type) const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
- virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 &p_size) const;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual Ref<Texture2D> generate_from_path(const String &p_path, const Size2 &p_size) const;
virtual bool generate_small_preview_automatically() const;
virtual bool can_generate_small_preview() const;
@@ -55,7 +54,6 @@ public:
};
class EditorResourcePreview : public Node {
-
GDCLASS(EditorResourcePreview, Node);
static EditorResourcePreview *singleton;
@@ -70,15 +68,15 @@ class EditorResourcePreview : public Node {
List<QueueItem> queue;
- Mutex *preview_mutex;
- Semaphore *preview_sem;
+ Mutex preview_mutex;
+ Semaphore preview_sem;
Thread *thread;
volatile bool exit;
volatile bool exited;
struct Item {
- Ref<Texture> preview;
- Ref<Texture> small_preview;
+ Ref<Texture2D> preview;
+ Ref<Texture2D> small_preview;
int order;
uint32_t last_hash;
uint64_t modified_time;
@@ -88,13 +86,13 @@ class EditorResourcePreview : public Node {
Map<String, Item> cache;
- void _preview_ready(const String &p_str, const Ref<Texture> &p_texture, const Ref<Texture> &p_small_texture, ObjectID id, const StringName &p_func, const Variant &p_ud);
+ void _preview_ready(const String &p_str, const Ref<Texture2D> &p_texture, const Ref<Texture2D> &p_small_texture, ObjectID id, const StringName &p_func, const Variant &p_ud);
void _generate_preview(Ref<ImageTexture> &r_texture, Ref<ImageTexture> &r_small_texture, const QueueItem &p_item, const String &cache_base);
static void _thread_func(void *ud);
void _thread();
- Vector<Ref<EditorResourcePreviewGenerator> > preview_generators;
+ Vector<Ref<EditorResourcePreviewGenerator>> preview_generators;
protected:
static void _bind_methods();
@@ -102,7 +100,7 @@ protected:
public:
static EditorResourcePreview *get_singleton();
- //callback function is callback(String p_path,Ref<Texture> preview,Variant udata) preview null if could not load
+ //callback function is callback(String p_path,Ref<Texture2D> preview,Variant udata) preview null if could not load
void queue_resource_preview(const String &p_path, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata);
void queue_edited_resource_preview(const Ref<Resource> &p_res, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata);
diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp
index ff7420e19b..7fada633c9 100644
--- a/editor/editor_run.cpp
+++ b/editor/editor_run.cpp
@@ -32,14 +32,17 @@
#include "core/project_settings.h"
#include "editor_settings.h"
+#include "servers/display_server.h"
EditorRun::Status EditorRun::get_status() const {
-
return status;
}
-Error EditorRun::run(const String &p_scene, const String &p_custom_args, const List<String> &p_breakpoints, const bool &p_skip_breakpoints) {
+String EditorRun::get_running_scene() const {
+ return running_scene;
+}
+Error EditorRun::run(const String &p_scene, const String &p_custom_args, const List<String> &p_breakpoints, const bool &p_skip_breakpoints) {
List<String> args;
String resource_path = ProjectSettings::get_singleton()->get_resource_path();
@@ -52,11 +55,13 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
}
args.push_back("--remote-debug");
- args.push_back(remote_host + ":" + String::num(remote_port));
+ args.push_back("tcp://" + remote_host + ":" + String::num(remote_port));
args.push_back("--allow_focus_steal_pid");
args.push_back(itos(OS::get_singleton()->get_process_id()));
+ bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false);
+ bool debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false);
if (debug_collisions) {
args.push_back("--debug-collisions");
}
@@ -68,19 +73,19 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
int screen = EditorSettings::get_singleton()->get("run/window_placement/screen");
if (screen == 0) {
// Same as editor
- screen = OS::get_singleton()->get_current_screen();
+ screen = DisplayServer::get_singleton()->window_get_current_screen();
} else if (screen == 1) {
// Previous monitor (wrap to the other end if needed)
screen = Math::wrapi(
- OS::get_singleton()->get_current_screen() - 1,
+ DisplayServer::get_singleton()->window_get_current_screen() - 1,
0,
- OS::get_singleton()->get_screen_count());
+ DisplayServer::get_singleton()->get_screen_count());
} else if (screen == 2) {
// Next monitor (wrap to the other end if needed)
screen = Math::wrapi(
- OS::get_singleton()->get_current_screen() + 1,
+ DisplayServer::get_singleton()->window_get_current_screen() + 1,
0,
- OS::get_singleton()->get_screen_count());
+ DisplayServer::get_singleton()->get_screen_count());
} else {
// Fixed monitor ID
// There are 3 special options, so decrement the option ID by 3 to get the monitor ID
@@ -92,8 +97,8 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
}
Rect2 screen_rect;
- screen_rect.position = OS::get_singleton()->get_screen_position(screen);
- screen_rect.size = OS::get_singleton()->get_screen_size(screen);
+ screen_rect.position = DisplayServer::get_singleton()->screen_get_position(screen);
+ screen_rect.size = DisplayServer::get_singleton()->screen_get_size(screen);
Size2 desired_size;
desired_size.x = ProjectSettings::get_singleton()->get("display/window/size/width");
@@ -103,27 +108,37 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
test_size.x = ProjectSettings::get_singleton()->get("display/window/size/test_width");
test_size.y = ProjectSettings::get_singleton()->get("display/window/size/test_height");
if (test_size.x > 0 && test_size.y > 0) {
-
desired_size = test_size;
}
int window_placement = EditorSettings::get_singleton()->get("run/window_placement/rect");
+ bool hidpi_proj = ProjectSettings::get_singleton()->get("display/window/dpi/allow_hidpi");
+ int display_scale = 1;
+ if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_HIDPI)) {
+ if (OS::get_singleton()->is_hidpi_allowed()) {
+ if (hidpi_proj) {
+ display_scale = 1; // Both editor and project runs in hiDPI mode, do not scale.
+ } else {
+ display_scale = DisplayServer::get_singleton()->screen_get_max_scale(); // Editor is in hiDPI mode, project is not, scale down.
+ }
+ } else {
+ if (hidpi_proj) {
+ display_scale = (1.f / DisplayServer::get_singleton()->screen_get_max_scale()); // Editor is not in hiDPI mode, project is, scale up.
+ } else {
+ display_scale = 1; // Both editor and project runs in lowDPI mode, do not scale.
+ }
+ }
+ screen_rect.position /= display_scale;
+ screen_rect.size /= display_scale;
+ }
switch (window_placement) {
case 0: { // top left
-
args.push_back("--position");
args.push_back(itos(screen_rect.position.x) + "," + itos(screen_rect.position.y));
} break;
case 1: { // centered
- int display_scale = 1;
-#ifdef OSX_ENABLED
- if (OS::get_singleton()->get_screen_dpi(screen) >= 192 && OS::get_singleton()->get_screen_size(screen).x > 2000) {
- display_scale = 2;
- }
-#endif
-
- Vector2 pos = screen_rect.position + ((screen_rect.size / display_scale - desired_size) / 2).floor();
+ Vector2 pos = (screen_rect.position) + ((screen_rect.size - desired_size) / 2).floor();
args.push_back("--position");
args.push_back(itos(pos.x) + "," + itos(pos.y));
} break;
@@ -138,10 +153,8 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
args.push_back("--position");
args.push_back(itos(pos.x) + "," + itos(pos.y));
args.push_back("--maximized");
-
} break;
case 4: { // force fullscreen
-
Vector2 pos = screen_rect.position;
args.push_back("--position");
args.push_back(itos(pos.x) + "," + itos(pos.y));
@@ -150,14 +163,13 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
}
if (p_breakpoints.size()) {
-
args.push_back("--breakpoints");
String bpoints;
for (const List<String>::Element *E = p_breakpoints.front(); E; E = E->next()) {
-
bpoints += E->get().replace(" ", "%20");
- if (E->next())
+ if (E->next()) {
bpoints += ",";
+ }
}
args.push_back(bpoints);
@@ -180,55 +192,56 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L
String exec = OS::get_singleton()->get_executable_path();
- printf("Running: %ls", exec.c_str());
+ printf("Running: %s", exec.utf8().get_data());
for (List<String>::Element *E = args.front(); E; E = E->next()) {
-
- printf(" %ls", E->get().c_str());
+ printf(" %s", E->get().utf8().get_data());
};
printf("\n");
- pid = 0;
- Error err = OS::get_singleton()->execute(exec, args, false, &pid);
- ERR_FAIL_COND_V(err, err);
+ int instances = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_instances", 1);
+ for (int i = 0; i < instances; i++) {
+ OS::ProcessID pid = 0;
+ Error err = OS::get_singleton()->execute(exec, args, false, &pid);
+ ERR_FAIL_COND_V(err, err);
+ pids.push_back(pid);
+ }
status = STATUS_PLAY;
+ if (p_scene != "") {
+ running_scene = p_scene;
+ }
return OK;
}
-void EditorRun::stop() {
-
- if (status != STATUS_STOP && pid != 0) {
-
- OS::get_singleton()->kill(pid);
+bool EditorRun::has_child_process(OS::ProcessID p_pid) const {
+ for (const List<OS::ProcessID>::Element *E = pids.front(); E; E = E->next()) {
+ if (E->get() == p_pid) {
+ return true;
+ }
}
-
- status = STATUS_STOP;
-}
-
-void EditorRun::set_debug_collisions(bool p_debug) {
-
- debug_collisions = p_debug;
+ return false;
}
-bool EditorRun::get_debug_collisions() const {
-
- return debug_collisions;
-}
-
-void EditorRun::set_debug_navigation(bool p_debug) {
-
- debug_navigation = p_debug;
+void EditorRun::stop_child_process(OS::ProcessID p_pid) {
+ if (has_child_process(p_pid)) {
+ OS::get_singleton()->kill(p_pid);
+ pids.erase(p_pid);
+ }
}
-bool EditorRun::get_debug_navigation() const {
+void EditorRun::stop() {
+ if (status != STATUS_STOP && pids.size() > 0) {
+ for (List<OS::ProcessID>::Element *E = pids.front(); E; E = E->next()) {
+ OS::get_singleton()->kill(E->get());
+ }
+ }
- return debug_navigation;
+ status = STATUS_STOP;
+ running_scene = "";
}
EditorRun::EditorRun() {
-
status = STATUS_STOP;
- debug_collisions = false;
- debug_navigation = false;
+ running_scene = "";
}
diff --git a/editor/editor_run.h b/editor/editor_run.h
index b50a2c2f0e..a15d65d91b 100644
--- a/editor/editor_run.h
+++ b/editor/editor_run.h
@@ -42,26 +42,22 @@ public:
STATUS_STOP
};
- OS::ProcessID pid;
+ List<OS::ProcessID> pids;
private:
- bool debug_collisions;
- bool debug_navigation;
Status status;
+ String running_scene;
public:
Status get_status() const;
+ String get_running_scene() const;
Error run(const String &p_scene, const String &p_custom_args, const List<String> &p_breakpoints, const bool &p_skip_breakpoints = false);
void run_native_notify() { status = STATUS_PLAY; }
void stop();
- OS::ProcessID get_pid() const { return pid; }
-
- void set_debug_collisions(bool p_debug);
- bool get_debug_collisions() const;
-
- void set_debug_navigation(bool p_debug);
- bool get_debug_navigation() const;
+ void stop_child_process(OS::ProcessID p_pid);
+ bool has_child_process(OS::ProcessID p_pid) const;
+ int get_child_process_count() const { return pids.size(); }
EditorRun();
};
diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp
index 4bbc111aea..422534a2e1 100644
--- a/editor/editor_run_native.cpp
+++ b/editor/editor_run_native.cpp
@@ -35,28 +35,25 @@
#include "editor_scale.h"
void EditorRunNative::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
-
for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) {
-
Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(i);
- if (eep.is_null())
+ if (eep.is_null()) {
continue;
+ }
Ref<ImageTexture> icon = eep->get_run_icon();
if (!icon.is_null()) {
Ref<Image> im = icon->get_data();
im = im->duplicate();
im->clear_mipmaps();
if (!im->empty()) {
-
im->resize(16 * EDSCALE, 16 * EDSCALE);
Ref<ImageTexture> small_icon;
small_icon.instance();
- small_icon->create_from_image(im, 0);
+ small_icon->create_from_image(im);
MenuButton *mb = memnew(MenuButton);
- mb->get_popup()->connect("id_pressed", this, "_run_native", varray(i));
- mb->connect("pressed", this, "_run_native", varray(-1, i));
+ mb->get_popup()->connect("id_pressed", callable_mp(this, &EditorRunNative::_run_native), varray(i));
+ mb->connect("pressed", callable_mp(this, &EditorRunNative::_run_native), varray(-1, i));
mb->set_icon(small_icon);
add_child(mb);
menus[i] = mb;
@@ -66,13 +63,10 @@ void EditorRunNative::_notification(int p_what) {
}
if (p_what == NOTIFICATION_PROCESS) {
-
bool changed = EditorExport::get_singleton()->poll_export_platforms() || first;
if (changed) {
-
for (Map<int, MenuButton *>::Element *E = menus.front(); E; E = E->next()) {
-
Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(E->key());
MenuButton *mb = E->get();
int dc = eep->get_options_count();
@@ -98,7 +92,6 @@ void EditorRunNative::_notification(int p_what) {
}
void EditorRunNative::_run_native(int p_idx, int p_platform) {
-
if (!EditorNode::get_singleton()->ensure_main_scene(true)) {
resume_idx = p_idx;
resume_platform = p_platform;
@@ -120,7 +113,6 @@ void EditorRunNative::_run_native(int p_idx, int p_platform) {
Ref<EditorExportPreset> preset;
for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) {
-
Ref<EditorExportPreset> ep = EditorExport::get_singleton()->get_export_preset(i);
if (ep->is_runnable() && ep->get_platform() == eep) {
preset = ep;
@@ -129,21 +121,31 @@ void EditorRunNative::_run_native(int p_idx, int p_platform) {
}
if (preset.is_null()) {
- EditorNode::get_singleton()->show_warning(TTR("No runnable export preset found for this platform.\nPlease add a runnable preset in the export menu."));
+ EditorNode::get_singleton()->show_warning(TTR("No runnable export preset found for this platform.\nPlease add a runnable preset in the Export menu or define an existing preset as runnable."));
return;
}
- emit_signal("native_run");
+ emit_signal("native_run", preset);
int flags = 0;
- if (deploy_debug_remote)
+
+ bool deploy_debug_remote = is_deploy_debug_remote_enabled();
+ bool deploy_dumb = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false);
+ bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false);
+ bool debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false);
+
+ if (deploy_debug_remote) {
flags |= EditorExportPlatform::DEBUG_FLAG_REMOTE_DEBUG;
- if (deploy_dumb)
+ }
+ if (deploy_dumb) {
flags |= EditorExportPlatform::DEBUG_FLAG_DUMB_CLIENT;
- if (debug_collisions)
+ }
+ if (debug_collisions) {
flags |= EditorExportPlatform::DEBUG_FLAG_VIEW_COLLISONS;
- if (debug_navigation)
+ }
+ if (debug_navigation) {
flags |= EditorExportPlatform::DEBUG_FLAG_VIEW_NAVIGATION;
+ }
eep->run(preset, p_idx, flags);
}
@@ -153,59 +155,16 @@ void EditorRunNative::resume_run_native() {
}
void EditorRunNative::_bind_methods() {
-
- ClassDB::bind_method("_run_native", &EditorRunNative::_run_native);
-
- ADD_SIGNAL(MethodInfo("native_run"));
-}
-
-void EditorRunNative::set_deploy_dumb(bool p_enabled) {
-
- deploy_dumb = p_enabled;
-}
-
-bool EditorRunNative::is_deploy_dumb_enabled() const {
-
- return deploy_dumb;
-}
-
-void EditorRunNative::set_deploy_debug_remote(bool p_enabled) {
-
- deploy_debug_remote = p_enabled;
+ ADD_SIGNAL(MethodInfo("native_run", PropertyInfo(Variant::OBJECT, "preset", PROPERTY_HINT_RESOURCE_TYPE, "EditorExportPreset")));
}
bool EditorRunNative::is_deploy_debug_remote_enabled() const {
-
- return deploy_debug_remote;
-}
-
-void EditorRunNative::set_debug_collisions(bool p_debug) {
-
- debug_collisions = p_debug;
-}
-
-bool EditorRunNative::get_debug_collisions() const {
-
- return debug_collisions;
-}
-
-void EditorRunNative::set_debug_navigation(bool p_debug) {
-
- debug_navigation = p_debug;
-}
-
-bool EditorRunNative::get_debug_navigation() const {
-
- return debug_navigation;
+ return EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", false);
}
EditorRunNative::EditorRunNative() {
set_process(true);
first = true;
- deploy_dumb = false;
- deploy_debug_remote = false;
- debug_collisions = false;
- debug_navigation = false;
resume_idx = 0;
resume_platform = 0;
}
diff --git a/editor/editor_run_native.h b/editor/editor_run_native.h
index be2e6d269d..df6714cb53 100644
--- a/editor/editor_run_native.h
+++ b/editor/editor_run_native.h
@@ -35,15 +35,10 @@
#include "scene/gui/menu_button.h"
class EditorRunNative : public HBoxContainer {
-
GDCLASS(EditorRunNative, HBoxContainer);
Map<int, MenuButton *> menus;
bool first;
- bool deploy_dumb;
- bool deploy_debug_remote;
- bool debug_collisions;
- bool debug_navigation;
int resume_idx;
int resume_platform;
@@ -55,18 +50,8 @@ protected:
void _notification(int p_what);
public:
- void set_deploy_dumb(bool p_enabled);
- bool is_deploy_dumb_enabled() const;
-
- void set_deploy_debug_remote(bool p_enabled);
bool is_deploy_debug_remote_enabled() const;
- void set_debug_collisions(bool p_debug);
- bool get_debug_collisions() const;
-
- void set_debug_navigation(bool p_debug);
- bool get_debug_navigation() const;
-
void resume_run_native();
EditorRunNative();
diff --git a/editor/editor_run_script.cpp b/editor/editor_run_script.cpp
index 1f269c246a..e2446e92be 100644
--- a/editor/editor_run_script.cpp
+++ b/editor/editor_run_script.cpp
@@ -33,7 +33,6 @@
#include "editor_node.h"
void EditorScript::add_root_node(Node *p_node) {
-
if (!editor) {
EditorNode::add_io_error("EditorScript::add_root_node: " + TTR("Write your logic in the _run() method."));
return;
@@ -48,22 +47,19 @@ void EditorScript::add_root_node(Node *p_node) {
}
EditorInterface *EditorScript::get_editor_interface() {
-
return EditorInterface::get_singleton();
}
Node *EditorScript::get_scene() {
-
if (!editor) {
EditorNode::add_io_error("EditorScript::get_scene: " + TTR("Write your logic in the _run() method."));
- return NULL;
+ return nullptr;
}
return editor->get_edited_scene();
}
void EditorScript::_run() {
-
Ref<Script> s = get_script();
ERR_FAIL_COND(!s.is_valid());
if (!get_script_instance()) {
@@ -71,22 +67,19 @@ void EditorScript::_run() {
return;
}
- Variant::CallError ce;
- ce.error = Variant::CallError::CALL_OK;
- get_script_instance()->call("_run", NULL, 0, ce);
- if (ce.error != Variant::CallError::CALL_OK) {
-
+ Callable::CallError ce;
+ ce.error = Callable::CallError::CALL_OK;
+ get_script_instance()->call("_run", nullptr, 0, ce);
+ if (ce.error != Callable::CallError::CALL_OK) {
EditorNode::add_io_error(TTR("Couldn't run script:") + "\n " + s->get_path() + "\n" + TTR("Did you forget the '_run' method?"));
}
}
void EditorScript::set_editor(EditorNode *p_editor) {
-
editor = p_editor;
}
void EditorScript::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("add_root_node", "node"), &EditorScript::add_root_node);
ClassDB::bind_method(D_METHOD("get_scene"), &EditorScript::get_scene);
ClassDB::bind_method(D_METHOD("get_editor_interface"), &EditorScript::get_editor_interface);
@@ -94,6 +87,5 @@ void EditorScript::_bind_methods() {
}
EditorScript::EditorScript() {
-
- editor = NULL;
+ editor = nullptr;
}
diff --git a/editor/editor_run_script.h b/editor/editor_run_script.h
index edf75b9e73..261e2a7e41 100644
--- a/editor/editor_run_script.h
+++ b/editor/editor_run_script.h
@@ -35,7 +35,6 @@
#include "editor_plugin.h"
class EditorNode;
class EditorScript : public Reference {
-
GDCLASS(EditorScript, Reference);
EditorNode *editor;
diff --git a/editor/editor_scale.cpp b/editor/editor_scale.cpp
index 358241cbcc..450de75328 100644
--- a/editor/editor_scale.cpp
+++ b/editor/editor_scale.cpp
@@ -35,10 +35,9 @@
static float scale = 1.0;
void editor_set_scale(float p_scale) {
-
scale = p_scale;
}
-float editor_get_scale() {
+float editor_get_scale() {
return scale;
}
diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp
index 2090c12c91..cf19b54cff 100644
--- a/editor/editor_sectioned_inspector.cpp
+++ b/editor/editor_sectioned_inspector.cpp
@@ -29,9 +29,10 @@
/*************************************************************************/
#include "editor_sectioned_inspector.h"
+
#include "editor_scale.h"
-class SectionedInspectorFilter : public Object {
+class SectionedInspectorFilter : public Object {
GDCLASS(SectionedInspectorFilter, Object);
Object *edited;
@@ -39,9 +40,9 @@ class SectionedInspectorFilter : public Object {
bool allow_sub;
bool _set(const StringName &p_name, const Variant &p_value) {
-
- if (!edited)
+ if (!edited) {
return false;
+ }
String name = p_name;
if (section != "") {
@@ -54,9 +55,9 @@ class SectionedInspectorFilter : public Object {
}
bool _get(const StringName &p_name, Variant &r_ret) const {
-
- if (!edited)
+ if (!edited) {
return false;
+ }
String name = p_name;
if (section != "") {
@@ -69,19 +70,19 @@ class SectionedInspectorFilter : public Object {
return valid;
}
void _get_property_list(List<PropertyInfo> *p_list) const {
-
- if (!edited)
+ if (!edited) {
return;
+ }
List<PropertyInfo> pinfo;
edited->get_property_list(&pinfo);
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
PropertyInfo pi = E->get();
int sp = pi.name.find("/");
- if (pi.name == "resource_path" || pi.name == "resource_name" || pi.name == "resource_local_to_scene" || pi.name.begins_with("script/") || pi.name.begins_with("_global_script")) //skip resource stuff
+ if (pi.name == "resource_path" || pi.name == "resource_name" || pi.name == "resource_local_to_scene" || pi.name.begins_with("script/") || pi.name.begins_with("_global_script")) { //skip resource stuff
continue;
+ }
if (sp == -1) {
pi.name = "global/" + pi.name;
@@ -89,33 +90,30 @@ class SectionedInspectorFilter : public Object {
if (pi.name.begins_with(section + "/")) {
pi.name = pi.name.replace_first(section + "/", "");
- if (!allow_sub && pi.name.find("/") != -1)
+ if (!allow_sub && pi.name.find("/") != -1) {
continue;
+ }
p_list->push_back(pi);
}
}
}
bool property_can_revert(const String &p_name) {
-
return edited->call("property_can_revert", section + "/" + p_name);
}
Variant property_get_revert(const String &p_name) {
-
return edited->call("property_get_revert", section + "/" + p_name);
}
protected:
static void _bind_methods() {
-
ClassDB::bind_method("property_can_revert", &SectionedInspectorFilter::property_can_revert);
ClassDB::bind_method("property_get_revert", &SectionedInspectorFilter::property_get_revert);
}
public:
void set_section(const String &p_section, bool p_allow_sub) {
-
section = p_section;
allow_sub = p_allow_sub;
_change_notify();
@@ -127,61 +125,55 @@ public:
}
SectionedInspectorFilter() {
- edited = NULL;
+ edited = nullptr;
}
};
void SectionedInspector::_bind_methods() {
-
- ClassDB::bind_method("_section_selected", &SectionedInspector::_section_selected);
- ClassDB::bind_method("_search_changed", &SectionedInspector::_search_changed);
-
ClassDB::bind_method("update_category_list", &SectionedInspector::update_category_list);
}
void SectionedInspector::_section_selected() {
-
- if (!sections->get_selected())
+ if (!sections->get_selected()) {
return;
+ }
selected_category = sections->get_selected()->get_metadata(0);
- filter->set_section(selected_category, sections->get_selected()->get_children() == NULL);
+ filter->set_section(selected_category, sections->get_selected()->get_children() == nullptr);
inspector->set_property_prefix(selected_category + "/");
}
void SectionedInspector::set_current_section(const String &p_section) {
-
if (section_map.has(p_section)) {
section_map[p_section]->select(0);
}
}
String SectionedInspector::get_current_section() const {
-
- if (sections->get_selected())
+ if (sections->get_selected()) {
return sections->get_selected()->get_metadata(0);
- else
+ } else {
return "";
+ }
}
String SectionedInspector::get_full_item_path(const String &p_item) {
-
String base = get_current_section();
- if (base != "")
+ if (base != "") {
return base + "/" + p_item;
- else
+ } else {
return p_item;
+ }
}
void SectionedInspector::edit(Object *p_object) {
-
if (!p_object) {
- obj = 0;
+ obj = ObjectID();
sections->clear();
- filter->set_edited(NULL);
- inspector->edit(NULL);
+ filter->set_edited(nullptr);
+ inspector->edit(nullptr);
return;
}
@@ -191,7 +183,6 @@ void SectionedInspector::edit(Object *p_object) {
inspector->set_object_class(p_object->get_class());
if (obj != id) {
-
obj = id;
update_category_list();
@@ -200,26 +191,26 @@ void SectionedInspector::edit(Object *p_object) {
TreeItem *first_item = sections->get_root();
if (first_item) {
- while (first_item->get_children())
+ while (first_item->get_children()) {
first_item = first_item->get_children();
+ }
first_item->select(0);
selected_category = first_item->get_metadata(0);
}
} else {
-
update_category_list();
}
}
void SectionedInspector::update_category_list() {
-
sections->clear();
Object *o = ObjectDB::get_instance(obj);
- if (!o)
+ if (!o) {
return;
+ }
List<PropertyInfo> pinfo;
o->get_property_list(&pinfo);
@@ -230,27 +221,31 @@ void SectionedInspector::update_category_list() {
section_map[""] = root;
String filter;
- if (search_box)
+ if (search_box) {
filter = search_box->get_text();
+ }
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
PropertyInfo pi = E->get();
- if (pi.usage & PROPERTY_USAGE_CATEGORY)
+ if (pi.usage & PROPERTY_USAGE_CATEGORY) {
continue;
- else if (!(pi.usage & PROPERTY_USAGE_EDITOR))
+ } else if (!(pi.usage & PROPERTY_USAGE_EDITOR)) {
continue;
+ }
- if (pi.name.find(":") != -1 || pi.name == "script" || pi.name == "resource_name" || pi.name == "resource_path" || pi.name == "resource_local_to_scene" || pi.name.begins_with("_global_script"))
+ if (pi.name.find(":") != -1 || pi.name == "script" || pi.name == "resource_name" || pi.name == "resource_path" || pi.name == "resource_local_to_scene" || pi.name.begins_with("_global_script")) {
continue;
+ }
- if (!filter.empty() && !filter.is_subsequence_ofi(pi.name) && !filter.is_subsequence_ofi(pi.name.replace("/", " ").capitalize()))
+ if (!filter.empty() && pi.name.findn(filter) == -1 && pi.name.replace("/", " ").capitalize().findn(filter) == -1) {
continue;
+ }
int sp = pi.name.find("/");
- if (sp == -1)
+ if (sp == -1) {
pi.name = "global/" + pi.name;
+ }
Vector<String> sectionarr = pi.name.split("/");
String metasection;
@@ -258,9 +253,8 @@ void SectionedInspector::update_category_list() {
int sc = MIN(2, sectionarr.size() - 1);
for (int i = 0; i < sc; i++) {
-
TreeItem *parent = section_map[metasection];
- parent->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
+ parent->set_custom_bg_color(0, get_theme_color("prop_subsection", "Editor"));
if (i > 0) {
metasection += "/" + sectionarr[i];
@@ -291,29 +285,24 @@ void SectionedInspector::update_category_list() {
}
void SectionedInspector::register_search_box(LineEdit *p_box) {
-
search_box = p_box;
inspector->register_text_enter(p_box);
- search_box->connect("text_changed", this, "_search_changed");
+ search_box->connect("text_changed", callable_mp(this, &SectionedInspector::_search_changed));
}
void SectionedInspector::_search_changed(const String &p_what) {
-
update_category_list();
}
EditorInspector *SectionedInspector::get_inspector() {
-
return inspector;
}
SectionedInspector::SectionedInspector() :
- obj(0),
sections(memnew(Tree)),
filter(memnew(SectionedInspectorFilter)),
- inspector(memnew(EditorInspector)),
- search_box(NULL) {
- add_constant_override("autohide", 1); // Fixes the dragger always showing up
+ inspector(memnew(EditorInspector)) {
+ add_theme_constant_override("autohide", 1); // Fixes the dragger always showing up
VBoxContainer *left_vb = memnew(VBoxContainer);
left_vb->set_custom_minimum_size(Size2(190, 0) * EDSCALE);
@@ -333,10 +322,9 @@ SectionedInspector::SectionedInspector() :
right_vb->add_child(inspector, true);
inspector->set_use_doc_hints(true);
- sections->connect("cell_selected", this, "_section_selected");
+ sections->connect("cell_selected", callable_mp(this, &SectionedInspector::_section_selected));
}
SectionedInspector::~SectionedInspector() {
-
memdelete(filter);
}
diff --git a/editor/editor_sectioned_inspector.h b/editor/editor_sectioned_inspector.h
index 7073b73751..dfc521302a 100644
--- a/editor/editor_sectioned_inspector.h
+++ b/editor/editor_sectioned_inspector.h
@@ -38,7 +38,6 @@
class SectionedInspectorFilter;
class SectionedInspector : public HSplitContainer {
-
GDCLASS(SectionedInspector, HSplitContainer);
ObjectID obj;
@@ -48,7 +47,7 @@ class SectionedInspector : public HSplitContainer {
Map<String, TreeItem *> section_map;
EditorInspector *inspector;
- LineEdit *search_box;
+ LineEdit *search_box = nullptr;
String selected_category;
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 92e3f61ca5..ac27c4a837 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -44,20 +44,20 @@
#include "core/os/os.h"
#include "core/project_settings.h"
#include "core/version.h"
+#include "editor/doc_translations.gen.h"
#include "editor/editor_node.h"
-#include "editor/translations.gen.h"
+#include "editor/editor_translations.gen.h"
#include "scene/main/node.h"
#include "scene/main/scene_tree.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
// PRIVATE METHODS
-Ref<EditorSettings> EditorSettings::singleton = NULL;
+Ref<EditorSettings> EditorSettings::singleton = nullptr;
// Properties
bool EditorSettings::_set(const StringName &p_name, const Variant &p_value) {
-
_THREAD_SAFE_METHOD_
bool changed = _set_only(p_name, p_value);
@@ -68,19 +68,16 @@ bool EditorSettings::_set(const StringName &p_name, const Variant &p_value) {
}
bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) {
-
_THREAD_SAFE_METHOD_
if (p_name.operator String() == "shortcuts") {
-
Array arr = p_value;
ERR_FAIL_COND_V(arr.size() && arr.size() & 1, true);
for (int i = 0; i < arr.size(); i += 2) {
-
String name = arr[i];
Ref<InputEvent> shortcut = arr[i + 1];
- Ref<ShortCut> sc;
+ Ref<Shortcut> sc;
sc.instance();
sc->set_shortcut(shortcut);
add_shortcut(name, sc);
@@ -119,15 +116,12 @@ bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value)
}
bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const {
-
_THREAD_SAFE_METHOD_
if (p_name.operator String() == "shortcuts") {
-
Array arr;
- for (const Map<String, Ref<ShortCut> >::Element *E = shortcuts.front(); E; E = E->next()) {
-
- Ref<ShortCut> sc = E->get();
+ for (const Map<String, Ref<Shortcut>>::Element *E = shortcuts.front(); E; E = E->next()) {
+ Ref<Shortcut> sc = E->get();
if (optimize_save) {
if (!sc->has_meta("original")) {
@@ -135,8 +129,9 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const {
}
Ref<InputEvent> original = sc->get_meta("original");
- if (sc->is_shortcut(original) || (original.is_null() && sc->get_shortcut().is_null()))
+ if (sc->is_shortcut(original) || (original.is_null() && sc->get_shortcut().is_null())) {
continue; //not changed from default, don't save
+ }
}
arr.push_back(E->key());
@@ -148,7 +143,7 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const {
const VariantContainer *v = props.getptr(p_name);
if (!v) {
- WARN_PRINTS("EditorSettings::_get - Property not found: " + String(p_name));
+ WARN_PRINT("EditorSettings::_get - Property not found: " + String(p_name));
return false;
}
r_ret = v->variant;
@@ -162,7 +157,6 @@ void EditorSettings::_initial_set(const StringName &p_name, const Variant &p_val
}
struct _EVCSort {
-
String name;
Variant::Type type;
int order;
@@ -173,18 +167,17 @@ struct _EVCSort {
};
void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {
-
_THREAD_SAFE_METHOD_
- const String *k = NULL;
+ const String *k = nullptr;
Set<_EVCSort> vclist;
while ((k = props.next(k))) {
-
const VariantContainer *v = props.getptr(*k);
- if (v->hide_from_editor)
+ if (v->hide_from_editor) {
continue;
+ }
_EVCSort vc;
vc.name = *k;
@@ -202,7 +195,6 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {
}
for (Set<_EVCSort>::Element *E = vclist.front(); E; E = E->next()) {
-
int pinfo = 0;
if (E->get().save || !optimize_save) {
pinfo |= PROPERTY_USAGE_STORAGE;
@@ -216,8 +208,9 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {
PropertyInfo pi(E->get().type, E->get().name);
pi.usage = pinfo;
- if (hints.has(E->get().name))
+ if (hints.has(E->get().name)) {
pi = hints[E->get().name];
+ }
if (E->get().restart_if_changed) {
pi.usage |= PROPERTY_USAGE_RESTART_IF_CHANGED;
@@ -230,7 +223,6 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {
}
void EditorSettings::_add_property_info_bind(const Dictionary &p_info) {
-
ERR_FAIL_COND(!p_info.has("name"));
ERR_FAIL_COND(!p_info.has("type"));
@@ -240,26 +232,27 @@ void EditorSettings::_add_property_info_bind(const Dictionary &p_info) {
pinfo.type = Variant::Type(p_info["type"].operator int());
ERR_FAIL_INDEX(pinfo.type, Variant::VARIANT_MAX);
- if (p_info.has("hint"))
+ if (p_info.has("hint")) {
pinfo.hint = PropertyHint(p_info["hint"].operator int());
- if (p_info.has("hint_string"))
+ }
+ if (p_info.has("hint_string")) {
pinfo.hint_string = p_info["hint_string"];
+ }
add_property_hint(pinfo);
}
// Default configs
bool EditorSettings::has_default_value(const String &p_setting) const {
-
_THREAD_SAFE_METHOD_
- if (!props.has(p_setting))
+ if (!props.has(p_setting)) {
return false;
+ }
return props[p_setting].has_default_value;
}
void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
-
_THREAD_SAFE_METHOD_
/* Languages */
@@ -279,7 +272,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
EditorTranslationList *etl = _editor_translations;
while (etl->data) {
-
const String &locale = etl->lang;
// Skip locales which we can't render properly (see above comment).
@@ -319,7 +311,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("interface/editor/display_scale", 0);
hints["interface/editor/display_scale"] = PropertyInfo(Variant::INT, "interface/editor/display_scale", PROPERTY_HINT_ENUM, "Auto,75%,100%,125%,150%,175%,200%,Custom", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/custom_display_scale", 1.0f);
- hints["interface/editor/custom_display_scale"] = PropertyInfo(Variant::REAL, "interface/editor/custom_display_scale", PROPERTY_HINT_RANGE, "0.5,3,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ hints["interface/editor/custom_display_scale"] = PropertyInfo(Variant::FLOAT, "interface/editor/custom_display_scale", PROPERTY_HINT_RANGE, "0.5,3,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/main_font_size", 14);
hints["interface/editor/main_font_size"] = PropertyInfo(Variant::INT, "interface/editor/main_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/code_font_size", 14);
@@ -335,11 +327,13 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["interface/editor/code_font"] = PropertyInfo(Variant::STRING, "interface/editor/code_font", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/dim_editor_on_dialog_popup", true);
_initial_set("interface/editor/low_processor_mode_sleep_usec", 6900); // ~144 FPS
- hints["interface/editor/low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ hints["interface/editor/low_processor_mode_sleep_usec"] = PropertyInfo(Variant::FLOAT, "interface/editor/low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/unfocused_low_processor_mode_sleep_usec", 50000); // 20 FPS
- hints["interface/editor/unfocused_low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/unfocused_low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ hints["interface/editor/unfocused_low_processor_mode_sleep_usec"] = PropertyInfo(Variant::FLOAT, "interface/editor/unfocused_low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/separate_distraction_mode", false);
_initial_set("interface/editor/automatically_open_screenshots", true);
+ _initial_set("interface/editor/single_window_mode", false);
+ hints["interface/editor/single_window_mode"] = PropertyInfo(Variant::BOOL, "interface/editor/single_window_mode", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/hide_console_window", false);
_initial_set("interface/editor/save_each_scene_on_quit", true); // Regression
_initial_set("interface/editor/quit_confirmation", true);
@@ -354,15 +348,15 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("interface/theme/accent_color", Color(0.41, 0.61, 0.91));
hints["interface/theme/accent_color"] = PropertyInfo(Variant::COLOR, "interface/theme/accent_color", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/theme/contrast", 0.25);
- hints["interface/theme/contrast"] = PropertyInfo(Variant::REAL, "interface/theme/contrast", PROPERTY_HINT_RANGE, "0.01, 1, 0.01");
+ hints["interface/theme/contrast"] = PropertyInfo(Variant::FLOAT, "interface/theme/contrast", PROPERTY_HINT_RANGE, "0.01, 1, 0.01");
_initial_set("interface/theme/relationship_line_opacity", 0.1);
- hints["interface/theme/relationship_line_opacity"] = PropertyInfo(Variant::REAL, "interface/theme/relationship_line_opacity", PROPERTY_HINT_RANGE, "0.00, 1, 0.01");
+ hints["interface/theme/relationship_line_opacity"] = PropertyInfo(Variant::FLOAT, "interface/theme/relationship_line_opacity", PROPERTY_HINT_RANGE, "0.00, 1, 0.01");
_initial_set("interface/theme/highlight_tabs", false);
_initial_set("interface/theme/border_size", 1);
_initial_set("interface/theme/use_graph_node_headers", false);
hints["interface/theme/border_size"] = PropertyInfo(Variant::INT, "interface/theme/border_size", PROPERTY_HINT_RANGE, "0,2,1", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/theme/additional_spacing", 0);
- hints["interface/theme/additional_spacing"] = PropertyInfo(Variant::REAL, "interface/theme/additional_spacing", PROPERTY_HINT_RANGE, "0,5,0.1", PROPERTY_USAGE_DEFAULT);
+ hints["interface/theme/additional_spacing"] = PropertyInfo(Variant::FLOAT, "interface/theme/additional_spacing", PROPERTY_HINT_RANGE, "0,5,0.1", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/theme/custom_theme", "");
hints["interface/theme/custom_theme"] = PropertyInfo(Variant::STRING, "interface/theme/custom_theme", PROPERTY_HINT_GLOBAL_FILE, "*.res,*.tres,*.theme", PROPERTY_USAGE_DEFAULT);
@@ -426,7 +420,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_load_default_text_editor_theme();
// Highlighting
- _initial_set("text_editor/highlighting/syntax_highlighting", true);
_initial_set("text_editor/highlighting/highlight_all_occurrences", true);
_initial_set("text_editor/highlighting/highlight_current_line", true);
_initial_set("text_editor/highlighting/highlight_type_safe_lines", true);
@@ -452,13 +445,14 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("text_editor/appearance/show_line_numbers", true);
_initial_set("text_editor/appearance/line_numbers_zero_padded", false);
_initial_set("text_editor/appearance/show_bookmark_gutter", true);
- _initial_set("text_editor/appearance/show_breakpoint_gutter", true);
_initial_set("text_editor/appearance/show_info_gutter", true);
_initial_set("text_editor/appearance/code_folding", true);
_initial_set("text_editor/appearance/word_wrap", false);
- _initial_set("text_editor/appearance/show_line_length_guideline", true);
- _initial_set("text_editor/appearance/line_length_guideline_column", 80);
- hints["text_editor/appearance/line_length_guideline_column"] = PropertyInfo(Variant::INT, "text_editor/appearance/line_length_guideline_column", PROPERTY_HINT_RANGE, "20, 160, 1");
+ _initial_set("text_editor/appearance/show_line_length_guidelines", true);
+ _initial_set("text_editor/appearance/line_length_guideline_soft_column", 80);
+ hints["text_editor/appearance/line_length_guideline_soft_column"] = PropertyInfo(Variant::INT, "text_editor/appearance/line_length_guideline_soft_column", PROPERTY_HINT_RANGE, "20, 160, 1");
+ _initial_set("text_editor/appearance/line_length_guideline_hard_column", 100);
+ hints["text_editor/appearance/line_length_guideline_hard_column"] = PropertyInfo(Variant::INT, "text_editor/appearance/line_length_guideline_hard_column", PROPERTY_HINT_RANGE, "20, 160, 1");
// Script list
_initial_set("text_editor/script_list/show_members_overview", true);
@@ -477,15 +471,15 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("text_editor/cursor/block_caret", false);
_initial_set("text_editor/cursor/caret_blink", true);
_initial_set("text_editor/cursor/caret_blink_speed", 0.5);
- hints["text_editor/cursor/caret_blink_speed"] = PropertyInfo(Variant::REAL, "text_editor/cursor/caret_blink_speed", PROPERTY_HINT_RANGE, "0.1, 10, 0.01");
+ hints["text_editor/cursor/caret_blink_speed"] = PropertyInfo(Variant::FLOAT, "text_editor/cursor/caret_blink_speed", PROPERTY_HINT_RANGE, "0.1, 10, 0.01");
_initial_set("text_editor/cursor/right_click_moves_caret", true);
// Completion
_initial_set("text_editor/completion/idle_parse_delay", 2.0);
- hints["text_editor/completion/idle_parse_delay"] = PropertyInfo(Variant::REAL, "text_editor/completion/idle_parse_delay", PROPERTY_HINT_RANGE, "0.1, 10, 0.01");
+ hints["text_editor/completion/idle_parse_delay"] = PropertyInfo(Variant::FLOAT, "text_editor/completion/idle_parse_delay", PROPERTY_HINT_RANGE, "0.1, 10, 0.01");
_initial_set("text_editor/completion/auto_brace_complete", true);
_initial_set("text_editor/completion/code_complete_delay", 0.3);
- hints["text_editor/completion/code_complete_delay"] = PropertyInfo(Variant::REAL, "text_editor/completion/code_complete_delay", PROPERTY_HINT_RANGE, "0.01, 5, 0.01");
+ hints["text_editor/completion/code_complete_delay"] = PropertyInfo(Variant::FLOAT, "text_editor/completion/code_complete_delay", PROPERTY_HINT_RANGE, "0.01, 5, 0.01");
_initial_set("text_editor/completion/put_callhint_tooltip_below_current_line", true);
_initial_set("text_editor/completion/callhint_tooltip_offset", Vector2());
_initial_set("text_editor/completion/complete_file_paths", true);
@@ -500,6 +494,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["text_editor/help/help_source_font_size"] = PropertyInfo(Variant::INT, "text_editor/help/help_source_font_size", PROPERTY_HINT_RANGE, "8,48,1");
_initial_set("text_editor/help/help_title_font_size", 23);
hints["text_editor/help/help_title_font_size"] = PropertyInfo(Variant::INT, "text_editor/help/help_title_font_size", PROPERTY_HINT_RANGE, "8,48,1");
+ _initial_set("text_editor/help/class_reference_examples", 0);
+ hints["text_editor/help/class_reference_examples"] = PropertyInfo(Variant::INT, "text_editor/help/class_reference_examples", PROPERTY_HINT_ENUM, "GDScript,C#,GDScript and C#");
/* Editors */
@@ -507,17 +503,38 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("editors/grid_map/pick_distance", 5000.0);
// 3D
- _initial_set("editors/3d/primary_grid_color", Color(0.56, 0.56, 0.56));
- hints["editors/3d/primary_grid_color"] = PropertyInfo(Variant::COLOR, "editors/3d/primary_grid_color", PROPERTY_HINT_COLOR_NO_ALPHA, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ _initial_set("editors/3d/primary_grid_color", Color(0.56, 0.56, 0.56, 0.5));
+ hints["editors/3d/primary_grid_color"] = PropertyInfo(Variant::COLOR, "editors/3d/primary_grid_color", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT);
- _initial_set("editors/3d/secondary_grid_color", Color(0.38, 0.38, 0.38));
- hints["editors/3d/secondary_grid_color"] = PropertyInfo(Variant::COLOR, "editors/3d/secondary_grid_color", PROPERTY_HINT_COLOR_NO_ALPHA, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
-
- _initial_set("editors/3d/grid_size", 50);
- hints["editors/3d/grid_size"] = PropertyInfo(Variant::INT, "editors/3d/grid_size", PROPERTY_HINT_RANGE, "1,500,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ _initial_set("editors/3d/secondary_grid_color", Color(0.38, 0.38, 0.38, 0.5));
+ hints["editors/3d/secondary_grid_color"] = PropertyInfo(Variant::COLOR, "editors/3d/secondary_grid_color", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT);
+ // If a line is a multiple of this, it uses the primary grid color.
_initial_set("editors/3d/primary_grid_steps", 10);
- hints["editors/3d/primary_grid_steps"] = PropertyInfo(Variant::INT, "editors/3d/primary_grid_steps", PROPERTY_HINT_RANGE, "1,100,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ hints["editors/3d/primary_grid_steps"] = PropertyInfo(Variant::INT, "editors/3d/primary_grid_steps", PROPERTY_HINT_RANGE, "1,100,1", PROPERTY_USAGE_DEFAULT);
+
+ // At 1000, the grid mostly looks like it has no edge.
+ _initial_set("editors/3d/grid_size", 200);
+ hints["editors/3d/grid_size"] = PropertyInfo(Variant::INT, "editors/3d/grid_size", PROPERTY_HINT_RANGE, "1,2000,1", PROPERTY_USAGE_DEFAULT);
+
+ // Default largest grid size is 100m, 10^2 (primary grid lines are 1km apart when primary_grid_steps is 10).
+ _initial_set("editors/3d/grid_division_level_max", 2);
+ // Higher values produce graphical artifacts when far away unless View Z-Far
+ // is increased significantly more than it really should need to be.
+ hints["editors/3d/grid_division_level_max"] = PropertyInfo(Variant::INT, "editors/3d/grid_division_level_max", PROPERTY_HINT_RANGE, "-1,3,1", PROPERTY_USAGE_DEFAULT);
+
+ // Default smallest grid size is 1cm, 10^-2.
+ _initial_set("editors/3d/grid_division_level_min", -2);
+ // Lower values produce graphical artifacts regardless of view clipping planes, so limit to -2 as a lower bound.
+ hints["editors/3d/grid_division_level_min"] = PropertyInfo(Variant::INT, "editors/3d/grid_division_level_min", PROPERTY_HINT_RANGE, "-2,2,1", PROPERTY_USAGE_DEFAULT);
+
+ // -0.2 seems like a sensible default. -1.0 gives Blender-like behavior, 0.5 gives huge grids.
+ _initial_set("editors/3d/grid_division_level_bias", -0.2);
+ hints["editors/3d/grid_division_level_bias"] = PropertyInfo(Variant::FLOAT, "editors/3d/grid_division_level_bias", PROPERTY_HINT_RANGE, "-1.0,0.5,0.1", PROPERTY_USAGE_DEFAULT);
+
+ _initial_set("editors/3d/grid_xz_plane", true);
+ _initial_set("editors/3d/grid_xy_plane", false);
+ _initial_set("editors/3d/grid_yz_plane", false);
_initial_set("editors/3d/default_fov", 70.0);
_initial_set("editors/3d/default_z_near", 0.05);
@@ -526,6 +543,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
// 3D: Navigation
_initial_set("editors/3d/navigation/navigation_scheme", 0);
_initial_set("editors/3d/navigation/invert_y_axis", false);
+ _initial_set("editors/3d/navigation/invert_x_axis", false);
hints["editors/3d/navigation/navigation_scheme"] = PropertyInfo(Variant::INT, "editors/3d/navigation/navigation_scheme", PROPERTY_HINT_ENUM, "Godot,Maya,Modo");
_initial_set("editors/3d/navigation/zoom_style", 0);
hints["editors/3d/navigation/zoom_style"] = PropertyInfo(Variant::INT, "editors/3d/navigation/zoom_style", PROPERTY_HINT_ENUM, "Vertical, Horizontal");
@@ -541,23 +559,27 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
// 3D: Navigation feel
_initial_set("editors/3d/navigation_feel/orbit_sensitivity", 0.4);
- hints["editors/3d/navigation_feel/orbit_sensitivity"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/orbit_sensitivity", PROPERTY_HINT_RANGE, "0.0, 2, 0.01");
+ hints["editors/3d/navigation_feel/orbit_sensitivity"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/orbit_sensitivity", PROPERTY_HINT_RANGE, "0.0, 2, 0.01");
_initial_set("editors/3d/navigation_feel/orbit_inertia", 0.05);
- hints["editors/3d/navigation_feel/orbit_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/orbit_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
+ hints["editors/3d/navigation_feel/orbit_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/orbit_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/navigation_feel/translation_inertia", 0.15);
- hints["editors/3d/navigation_feel/translation_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
+ hints["editors/3d/navigation_feel/translation_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/navigation_feel/zoom_inertia", 0.075);
- hints["editors/3d/navigation_feel/zoom_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/zoom_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
+ hints["editors/3d/navigation_feel/zoom_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/zoom_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/navigation_feel/manipulation_orbit_inertia", 0.075);
- hints["editors/3d/navigation_feel/manipulation_orbit_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/manipulation_orbit_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
+ hints["editors/3d/navigation_feel/manipulation_orbit_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/manipulation_orbit_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/navigation_feel/manipulation_translation_inertia", 0.075);
- hints["editors/3d/navigation_feel/manipulation_translation_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/manipulation_translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
+ hints["editors/3d/navigation_feel/manipulation_translation_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/manipulation_translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
// 3D: Freelook
+ _initial_set("editors/3d/freelook/freelook_navigation_scheme", false);
+ hints["editors/3d/freelook/freelook_navigation_scheme"] = PropertyInfo(Variant::INT, "editors/3d/freelook/freelook_navigation_scheme", PROPERTY_HINT_ENUM, "Default,Partially Axis-Locked (id Tech),Fully Axis-Locked (Minecraft)");
+ _initial_set("editors/3d/freelook/freelook_sensitivity", 0.4);
+ hints["editors/3d/freelook/freelook_sensitivity"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_sensitivity", PROPERTY_HINT_RANGE, "0.0, 2, 0.01");
_initial_set("editors/3d/freelook/freelook_inertia", 0.1);
- hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
+ hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/freelook/freelook_base_speed", 5.0);
- hints["editors/3d/freelook/freelook_base_speed"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_base_speed", PROPERTY_HINT_RANGE, "0.0, 10, 0.01");
+ hints["editors/3d/freelook/freelook_base_speed"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_base_speed", PROPERTY_HINT_RANGE, "0.0, 10, 0.01");
_initial_set("editors/3d/freelook/freelook_activation_modifier", 0);
hints["editors/3d/freelook/freelook_activation_modifier"] = PropertyInfo(Variant::INT, "editors/3d/freelook/freelook_activation_modifier", PROPERTY_HINT_ENUM, "None,Shift,Alt,Meta,Ctrl");
_initial_set("editors/3d/freelook/freelook_speed_zoom_link", false);
@@ -596,7 +618,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("run/window_placement/rect", 1);
hints["run/window_placement/rect"] = PropertyInfo(Variant::INT, "run/window_placement/rect", PROPERTY_HINT_ENUM, "Top Left,Centered,Custom Position,Force Maximized,Force Fullscreen");
String screen_hints = "Same as Editor,Previous Monitor,Next Monitor";
- for (int i = 0; i < OS::get_singleton()->get_screen_count(); i++) {
+ for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {
screen_hints += ",Monitor " + itos(i + 1);
}
_initial_set("run/window_placement/rect_custom_position", Vector2());
@@ -628,27 +650,22 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
/* Extra config */
_initial_set("project_manager/sorting_order", 0);
- hints["project_manager/sorting_order"] = PropertyInfo(Variant::INT, "project_manager/sorting_order", PROPERTY_HINT_ENUM, "Name,Path,Last Modified");
+ hints["project_manager/sorting_order"] = PropertyInfo(Variant::INT, "project_manager/sorting_order", PROPERTY_HINT_ENUM, "Name,Path,Last Edited");
if (p_extra_config.is_valid()) {
-
if (p_extra_config->has_section("init_projects") && p_extra_config->has_section_key("init_projects", "list")) {
-
Vector<String> list = p_extra_config->get_value("init_projects", "list");
for (int i = 0; i < list.size(); i++) {
-
String name = list[i].replace("/", "::");
set("projects/" + name, list[i]);
};
};
if (p_extra_config->has_section("presets")) {
-
List<String> keys;
p_extra_config->get_section_keys("presets", &keys);
for (List<String>::Element *E = keys.front(); E; E = E->next()) {
-
String key = E->get();
Variant val = p_extra_config->get_value("presets", key);
set(key, val);
@@ -658,7 +675,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
}
void EditorSettings::_load_default_text_editor_theme() {
-
bool dark_theme = is_dark_theme();
_initial_set("text_editor/highlighting/symbol_color", Color(0.73, 0.87, 1.0));
@@ -690,8 +706,8 @@ void EditorSettings::_load_default_text_editor_theme() {
_initial_set("text_editor/highlighting/member_variable_color", Color(0.9, 0.31, 0.35));
_initial_set("text_editor/highlighting/mark_color", Color(1.0, 0.4, 0.4, 0.4));
_initial_set("text_editor/highlighting/bookmark_color", Color(0.08, 0.49, 0.98));
- _initial_set("text_editor/highlighting/breakpoint_color", Color(0.8, 0.8, 0.4, 0.2));
- _initial_set("text_editor/highlighting/executing_line_color", Color(0.2, 0.8, 0.2, 0.4));
+ _initial_set("text_editor/highlighting/breakpoint_color", Color(0.9, 0.29, 0.3));
+ _initial_set("text_editor/highlighting/executing_line_color", Color(0.98, 0.89, 0.27));
_initial_set("text_editor/highlighting/code_folding_color", Color(0.8, 0.8, 0.8, 0.8));
_initial_set("text_editor/highlighting/search_result_color", Color(0.05, 0.25, 0.05, 1));
_initial_set("text_editor/highlighting/search_result_border_color", Color(0.41, 0.61, 0.91, 0.38));
@@ -742,7 +758,6 @@ static Dictionary _get_builtin_script_templates() {
}
static void _create_script_templates(const String &p_path) {
-
Dictionary templates = _get_builtin_script_templates();
List<Variant> keys;
templates.get_key_list(&keys);
@@ -766,16 +781,15 @@ static void _create_script_templates(const String &p_path) {
// PUBLIC METHODS
EditorSettings *EditorSettings::get_singleton() {
-
return singleton.ptr();
}
void EditorSettings::create() {
-
- if (singleton.ptr())
+ if (singleton.ptr()) {
return; //pointless
+ }
- DirAccess *dir = NULL;
+ DirAccess *dir = nullptr;
String data_path;
String data_dir;
@@ -794,19 +808,18 @@ void EditorSettings::create() {
self_contained = true;
Error err = extra_config->load(exe_path + "/._sc_");
if (err != OK) {
- ERR_PRINTS("Can't load config from path '" + exe_path + "/._sc_'.");
+ ERR_PRINT("Can't load config from path '" + exe_path + "/._sc_'.");
}
} else if (d->file_exists(exe_path + "/_sc_")) {
self_contained = true;
Error err = extra_config->load(exe_path + "/_sc_");
if (err != OK) {
- ERR_PRINTS("Can't load config from path '" + exe_path + "/_sc_'.");
+ ERR_PRINT("Can't load config from path '" + exe_path + "/_sc_'.");
}
}
memdelete(d);
if (self_contained) {
-
// editor is self contained, all in same folder
data_path = exe_path;
data_dir = data_path.plus_file("editor_data");
@@ -815,7 +828,6 @@ void EditorSettings::create() {
cache_path = exe_path;
cache_dir = data_dir.plus_file("cache");
} else {
-
// Typically XDG_DATA_HOME or %APPDATA%
data_path = OS::get_singleton()->get_data_path();
data_dir = data_path.plus_file(OS::get_singleton()->get_godot_dir_name());
@@ -836,7 +848,6 @@ void EditorSettings::create() {
String config_file_path;
if (data_path != "" && config_path != "" && cache_path != "") {
-
// Validate/create data dir and subdirectories
dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
@@ -907,8 +918,9 @@ void EditorSettings::create() {
dir->change_dir("projects");
String project_config_dir = ProjectSettings::get_singleton()->get_resource_path();
- if (project_config_dir.ends_with("/"))
+ if (project_config_dir.ends_with("/")) {
project_config_dir = config_path.substr(0, project_config_dir.size() - 1);
+ }
project_config_dir = project_config_dir.get_file() + "-" + project_config_dir.md5_text();
if (dir->change_dir(project_config_dir) != OK) {
@@ -923,6 +935,7 @@ void EditorSettings::create() {
String config_file_name = "editor_settings-" + itos(VERSION_MAJOR) + ".tres";
config_file_path = config_dir.plus_file(config_file_name);
if (!dir->file_exists(config_file_name)) {
+ memdelete(dir);
goto fail;
}
@@ -958,7 +971,6 @@ fail:
if (extra_config->has_section("init_projects")) {
Vector<String> list = extra_config->get_value("init_projects", "list");
for (int i = 0; i < list.size(); i++) {
-
list.write[i] = exe_path.plus_file(list[i]);
};
extra_config->set_value("init_projects", "list", list);
@@ -977,17 +989,15 @@ fail:
}
void EditorSettings::setup_language() {
-
String lang = get("interface/editor/editor_language");
- if (lang == "en")
- return; //none to do
+ if (lang == "en") {
+ return; // Default, nothing to do.
+ }
+ // Load editor translation for configured/detected locale.
EditorTranslationList *etl = _editor_translations;
-
while (etl->data) {
-
if (etl->lang == lang) {
-
Vector<uint8_t> data;
data.resize(etl->uncomp_size);
Compression::decompress(data.ptrw(), etl->uncomp_size, etl->data, etl->comp_size, Compression::MODE_DEFLATE);
@@ -995,7 +1005,7 @@ void EditorSettings::setup_language() {
FileAccessMemory *fa = memnew(FileAccessMemory);
fa->open_custom(data.ptr(), data.size());
- Ref<Translation> tr = TranslationLoaderPO::load_translation(fa, NULL, "translation_" + String(etl->lang));
+ Ref<Translation> tr = TranslationLoaderPO::load_translation(fa);
if (tr.is_valid()) {
tr->set_locale(etl->lang);
@@ -1006,10 +1016,32 @@ void EditorSettings::setup_language() {
etl++;
}
+
+ // Load class reference translation.
+ DocTranslationList *dtl = _doc_translations;
+ while (dtl->data) {
+ if (dtl->lang == lang) {
+ Vector<uint8_t> data;
+ data.resize(dtl->uncomp_size);
+ Compression::decompress(data.ptrw(), dtl->uncomp_size, dtl->data, dtl->comp_size, Compression::MODE_DEFLATE);
+
+ FileAccessMemory *fa = memnew(FileAccessMemory);
+ fa->open_custom(data.ptr(), data.size());
+
+ Ref<Translation> tr = TranslationLoaderPO::load_translation(fa);
+
+ if (tr.is_valid()) {
+ tr->set_locale(dtl->lang);
+ TranslationServer::get_singleton()->set_doc_translation(tr);
+ break;
+ }
+ }
+
+ dtl++;
+ }
}
void EditorSettings::setup_network() {
-
List<IP_Address> local_ip;
IP::get_singleton()->get_local_addresses(&local_ip);
String hint;
@@ -1018,20 +1050,23 @@ void EditorSettings::setup_network() {
// Check that current remote_host is a valid interface address and populate hints.
for (List<IP_Address>::Element *E = local_ip.front(); E; E = E->next()) {
-
String ip = E->get();
// link-local IPv6 addresses don't work, skipping them
- if (ip.begins_with("fe80:0:0:0:")) // fe80::/64
+ if (ip.begins_with("fe80:0:0:0:")) { // fe80::/64
continue;
+ }
// Same goes for IPv4 link-local (APIPA) addresses.
- if (ip.begins_with("169.254.")) // 169.254.0.0/16
+ if (ip.begins_with("169.254.")) { // 169.254.0.0/16
continue;
+ }
// Select current IP (found)
- if (ip == current)
+ if (ip == current) {
selected = ip;
- if (hint != "")
+ }
+ if (hint != "") {
hint += ",";
+ }
hint += ip;
}
@@ -1042,11 +1077,11 @@ void EditorSettings::setup_network() {
}
void EditorSettings::save() {
-
//_THREAD_SAFE_METHOD_
- if (!singleton.ptr())
+ if (!singleton.ptr()) {
return;
+ }
if (singleton->config_file_path == "") {
ERR_PRINT("Cannot save EditorSettings config, no valid path");
@@ -1056,22 +1091,21 @@ void EditorSettings::save() {
Error err = ResourceSaver::save(singleton->config_file_path, singleton);
if (err != OK) {
- ERR_PRINTS("Error saving editor settings to " + singleton->config_file_path);
+ ERR_PRINT("Error saving editor settings to " + singleton->config_file_path);
} else {
print_verbose("EditorSettings: Save OK!");
}
}
void EditorSettings::destroy() {
-
- if (!singleton.ptr())
+ if (!singleton.ptr()) {
return;
+ }
save();
singleton = Ref<EditorSettings>();
}
void EditorSettings::set_optimize_save(bool p_optimize) {
-
optimize_save = p_optimize;
}
@@ -1088,14 +1122,12 @@ Variant EditorSettings::get_setting(const String &p_setting) const {
}
bool EditorSettings::has_setting(const String &p_setting) const {
-
_THREAD_SAFE_METHOD_
return props.has(p_setting);
}
void EditorSettings::erase(const String &p_setting) {
-
_THREAD_SAFE_METHOD_
props.erase(p_setting);
@@ -1111,17 +1143,18 @@ void EditorSettings::raise_order(const String &p_setting) {
void EditorSettings::set_restart_if_changed(const StringName &p_setting, bool p_restart) {
_THREAD_SAFE_METHOD_
- if (!props.has(p_setting))
+ if (!props.has(p_setting)) {
return;
+ }
props[p_setting].restart_if_changed = p_restart;
}
void EditorSettings::set_initial_value(const StringName &p_setting, const Variant &p_value, bool p_update_current) {
-
_THREAD_SAFE_METHOD_
- if (!props.has(p_setting))
+ if (!props.has(p_setting)) {
return;
+ }
props[p_setting].initial = p_value;
props[p_setting].has_default_value = true;
if (p_update_current) {
@@ -1130,7 +1163,6 @@ void EditorSettings::set_initial_value(const StringName &p_setting, const Varian
}
Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_restart_if_changed) {
-
Variant ret = p_default;
if (EditorSettings::get_singleton()->has_setting(p_setting)) {
ret = EditorSettings::get_singleton()->get(p_setting);
@@ -1147,32 +1179,31 @@ Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_re
}
Variant _EDITOR_GET(const String &p_setting) {
-
ERR_FAIL_COND_V(!EditorSettings::get_singleton()->has_setting(p_setting), Variant());
return EditorSettings::get_singleton()->get(p_setting);
}
bool EditorSettings::property_can_revert(const String &p_setting) {
-
- if (!props.has(p_setting))
+ if (!props.has(p_setting)) {
return false;
+ }
- if (!props[p_setting].has_default_value)
+ if (!props[p_setting].has_default_value) {
return false;
+ }
return props[p_setting].initial != props[p_setting].variant;
}
Variant EditorSettings::property_get_revert(const String &p_setting) {
-
- if (!props.has(p_setting) || !props[p_setting].has_default_value)
+ if (!props.has(p_setting) || !props[p_setting].has_default_value) {
return Variant();
+ }
return props[p_setting].initial;
}
void EditorSettings::add_property_hint(const PropertyInfo &p_hint) {
-
_THREAD_SAFE_METHOD_
hints[p_hint.name] = p_hint;
@@ -1181,51 +1212,42 @@ void EditorSettings::add_property_hint(const PropertyInfo &p_hint) {
// Data directories
String EditorSettings::get_data_dir() const {
-
return data_dir;
}
String EditorSettings::get_templates_dir() const {
-
return get_data_dir().plus_file("templates");
}
// Config directories
String EditorSettings::get_settings_dir() const {
-
return settings_dir;
}
String EditorSettings::get_project_settings_dir() const {
-
return get_settings_dir().plus_file("projects").plus_file(project_config_dir);
}
String EditorSettings::get_text_editor_themes_dir() const {
-
return get_settings_dir().plus_file("text_editor_themes");
}
String EditorSettings::get_script_templates_dir() const {
-
return get_settings_dir().plus_file("script_templates");
}
String EditorSettings::get_project_script_templates_dir() const {
-
return ProjectSettings::get_singleton()->get("editor/script_templates_search_path");
}
// Cache directory
String EditorSettings::get_cache_dir() const {
-
return cache_dir;
}
String EditorSettings::get_feature_profiles_dir() const {
-
return get_settings_dir().plus_file("feature_profiles");
}
@@ -1253,39 +1275,36 @@ Variant EditorSettings::get_project_metadata(const String &p_section, const Stri
}
void EditorSettings::set_favorites(const Vector<String> &p_favorites) {
-
favorites = p_favorites;
FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("favorites"), FileAccess::WRITE);
if (f) {
- for (int i = 0; i < favorites.size(); i++)
+ for (int i = 0; i < favorites.size(); i++) {
f->store_line(favorites[i]);
+ }
memdelete(f);
}
}
Vector<String> EditorSettings::get_favorites() const {
-
return favorites;
}
void EditorSettings::set_recent_dirs(const Vector<String> &p_recent_dirs) {
-
recent_dirs = p_recent_dirs;
FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("recent_dirs"), FileAccess::WRITE);
if (f) {
- for (int i = 0; i < recent_dirs.size(); i++)
+ for (int i = 0; i < recent_dirs.size(); i++) {
f->store_line(recent_dirs[i]);
+ }
memdelete(f);
}
}
Vector<String> EditorSettings::get_recent_dirs() const {
-
return recent_dirs;
}
void EditorSettings::load_favorites() {
-
FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("favorites"), FileAccess::READ);
if (f) {
String line = f->get_line().strip_edges();
@@ -1368,7 +1387,6 @@ void EditorSettings::load_text_editor_theme() {
// don't load if it's not already there!
if (has_setting("text_editor/highlighting/" + key)) {
-
// make sure it is actually a color
if (val.is_valid_html_color() && key.find("color") >= 0) {
props["text_editor/highlighting/" + key].variant = Color::html(val); // change manually to prevent "Settings changed" console spam
@@ -1380,7 +1398,6 @@ void EditorSettings::load_text_editor_theme() {
}
bool EditorSettings::import_text_editor_theme(String p_file) {
-
if (!p_file.ends_with(".tet")) {
return false;
} else {
@@ -1399,7 +1416,6 @@ bool EditorSettings::import_text_editor_theme(String p_file) {
}
bool EditorSettings::save_text_editor_theme() {
-
String p_file = get("text_editor/theme/color_theme");
if (_is_default_text_editor_theme(p_file.get_file().to_lower())) {
@@ -1418,7 +1434,6 @@ bool EditorSettings::save_text_editor_theme_as(String p_file) {
return false;
}
if (_save_text_editor_theme(p_file)) {
-
// switch to theme is saved in the theme directory
list_text_editor_themes();
String theme_name = p_file.substr(0, p_file.length() - 4).get_file();
@@ -1438,7 +1453,6 @@ bool EditorSettings::is_default_text_editor_theme() {
}
Vector<String> EditorSettings::get_script_templates(const String &p_extension, const String &p_custom_path) {
-
Vector<String> templates;
String template_dir = get_script_templates_dir();
if (!p_custom_path.empty()) {
@@ -1461,62 +1475,55 @@ Vector<String> EditorSettings::get_script_templates(const String &p_extension, c
}
String EditorSettings::get_editor_layouts_config() const {
-
return get_settings_dir().plus_file("editor_layouts.cfg");
}
// Shortcuts
-void EditorSettings::add_shortcut(const String &p_name, Ref<ShortCut> &p_shortcut) {
-
+void EditorSettings::add_shortcut(const String &p_name, Ref<Shortcut> &p_shortcut) {
shortcuts[p_name] = p_shortcut;
}
bool EditorSettings::is_shortcut(const String &p_name, const Ref<InputEvent> &p_event) const {
-
- const Map<String, Ref<ShortCut> >::Element *E = shortcuts.find(p_name);
+ const Map<String, Ref<Shortcut>>::Element *E = shortcuts.find(p_name);
ERR_FAIL_COND_V_MSG(!E, false, "Unknown Shortcut: " + p_name + ".");
return E->get()->is_shortcut(p_event);
}
-Ref<ShortCut> EditorSettings::get_shortcut(const String &p_name) const {
-
- const Map<String, Ref<ShortCut> >::Element *E = shortcuts.find(p_name);
- if (!E)
- return Ref<ShortCut>();
+Ref<Shortcut> EditorSettings::get_shortcut(const String &p_name) const {
+ const Map<String, Ref<Shortcut>>::Element *E = shortcuts.find(p_name);
+ if (!E) {
+ return Ref<Shortcut>();
+ }
return E->get();
}
void EditorSettings::get_shortcut_list(List<String> *r_shortcuts) {
-
- for (const Map<String, Ref<ShortCut> >::Element *E = shortcuts.front(); E; E = E->next()) {
-
+ for (const Map<String, Ref<Shortcut>>::Element *E = shortcuts.front(); E; E = E->next()) {
r_shortcuts->push_back(E->key());
}
}
-Ref<ShortCut> ED_GET_SHORTCUT(const String &p_path) {
-
+Ref<Shortcut> ED_GET_SHORTCUT(const String &p_path) {
if (!EditorSettings::get_singleton()) {
- return NULL;
+ return nullptr;
}
- Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
+ Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
ERR_FAIL_COND_V_MSG(!sc.is_valid(), sc, "Used ED_GET_SHORTCUT with invalid shortcut: " + p_path + ".");
return sc;
}
-struct ShortCutMapping {
+struct ShortcutMapping {
const char *path;
uint32_t keycode;
};
-Ref<ShortCut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p_keycode) {
-
+Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p_keycode) {
#ifdef OSX_ENABLED
// Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS
if (p_keycode == KEY_DELETE) {
@@ -1529,7 +1536,7 @@ Ref<ShortCut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p
ie.instance();
ie->set_unicode(p_keycode & KEY_CODE_MASK);
- ie->set_scancode(p_keycode & KEY_CODE_MASK);
+ ie->set_keycode(p_keycode & KEY_CODE_MASK);
ie->set_shift(bool(p_keycode & KEY_MASK_SHIFT));
ie->set_alt(bool(p_keycode & KEY_MASK_ALT));
ie->set_control(bool(p_keycode & KEY_MASK_CTRL));
@@ -1537,7 +1544,7 @@ Ref<ShortCut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p
}
if (!EditorSettings::get_singleton()) {
- Ref<ShortCut> sc;
+ Ref<Shortcut> sc;
sc.instance();
sc->set_name(p_name);
sc->set_shortcut(ie);
@@ -1545,9 +1552,8 @@ Ref<ShortCut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p
return sc;
}
- Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
+ Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
if (sc.is_valid()) {
-
sc->set_name(p_name); //keep name (the ones that come from disk have no name)
sc->set_meta("original", ie); //to compare against changes
return sc;
@@ -1563,7 +1569,6 @@ Ref<ShortCut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p
}
void EditorSettings::notify_changes() {
-
_THREAD_SAFE_METHOD_
SceneTree *sml = Object::cast_to<SceneTree>(OS::get_singleton()->get_main_loop());
@@ -1581,7 +1586,6 @@ void EditorSettings::notify_changes() {
}
void EditorSettings::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("has_setting", "name"), &EditorSettings::has_setting);
ClassDB::bind_method(D_METHOD("set_setting", "name", "value"), &EditorSettings::set_setting);
ClassDB::bind_method(D_METHOD("get_setting", "name"), &EditorSettings::get_setting);
@@ -1608,7 +1612,6 @@ void EditorSettings::_bind_methods() {
}
EditorSettings::EditorSettings() {
-
last_order = 0;
optimize_save = true;
save_changed_setting = true;
diff --git a/editor/editor_settings.h b/editor/editor_settings.h
index 4caa494d59..4896fb58db 100644
--- a/editor/editor_settings.h
+++ b/editor/editor_settings.h
@@ -42,7 +42,6 @@
class EditorPlugin;
class EditorSettings : public Resource {
-
GDCLASS(EditorSettings, Resource);
private:
@@ -50,7 +49,6 @@ private:
public:
struct Plugin {
-
EditorPlugin *instance;
String path;
String name;
@@ -64,27 +62,19 @@ public:
private:
struct VariantContainer {
- int order;
+ int order = 0;
Variant variant;
Variant initial;
- bool has_default_value;
- bool hide_from_editor;
- bool save;
- bool restart_if_changed;
- VariantContainer() :
- order(0),
- has_default_value(false),
- hide_from_editor(false),
- save(false),
- restart_if_changed(false) {
- }
+ bool has_default_value = false;
+ bool hide_from_editor = false;
+ bool save = false;
+ bool restart_if_changed = false;
+
+ VariantContainer() {}
+
VariantContainer(const Variant &p_variant, int p_order) :
order(p_order),
- variant(p_variant),
- has_default_value(false),
- hide_from_editor(false),
- save(false),
- restart_if_changed(false) {
+ variant(p_variant) {
}
};
@@ -95,7 +85,7 @@ private:
int last_order;
Ref<Resource> clipboard;
- Map<String, Ref<ShortCut> > shortcuts;
+ Map<String, Ref<Shortcut>> shortcuts;
String resource_path;
String settings_dir;
@@ -117,7 +107,7 @@ private:
void _get_property_list(List<PropertyInfo> *p_list) const;
void _add_property_info_bind(const Dictionary &p_info);
- void _load_defaults(Ref<ConfigFile> p_extra_config = NULL);
+ void _load_defaults(Ref<ConfigFile> p_extra_config = Ref<ConfigFile>());
void _load_default_text_editor_theme();
bool _save_text_editor_theme(String p_file);
bool _is_default_text_editor_theme(String p_theme_name);
@@ -148,10 +138,11 @@ public:
void set_initial_value(const StringName &p_setting, const Variant &p_value, bool p_update_current = false);
void set_restart_if_changed(const StringName &p_setting, bool p_restart);
void set_manually(const StringName &p_setting, const Variant &p_value, bool p_emit_signal = false) {
- if (p_emit_signal)
+ if (p_emit_signal) {
_set(p_setting, p_value);
- else
+ } else {
_set_only(p_setting, p_value);
+ }
}
bool property_can_revert(const String &p_setting);
Variant property_get_revert(const String &p_setting);
@@ -191,9 +182,9 @@ public:
Vector<String> get_script_templates(const String &p_extension, const String &p_custom_path = String());
String get_editor_layouts_config() const;
- void add_shortcut(const String &p_name, Ref<ShortCut> &p_shortcut);
+ void add_shortcut(const String &p_name, Ref<Shortcut> &p_shortcut);
bool is_shortcut(const String &p_name, const Ref<InputEvent> &p_event) const;
- Ref<ShortCut> get_shortcut(const String &p_name) const;
+ Ref<Shortcut> get_shortcut(const String &p_name) const;
void get_shortcut_list(List<String> *r_shortcuts);
void notify_changes();
@@ -212,7 +203,7 @@ Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_re
Variant _EDITOR_GET(const String &p_setting);
#define ED_IS_SHORTCUT(p_name, p_ev) (EditorSettings::get_singleton()->is_shortcut(p_name, p_ev))
-Ref<ShortCut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p_keycode = 0);
-Ref<ShortCut> ED_GET_SHORTCUT(const String &p_path);
+Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p_keycode = 0);
+Ref<Shortcut> ED_GET_SHORTCUT(const String &p_path);
#endif // EDITOR_SETTINGS_H
diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp
index 5db18d8853..d76a3d2da7 100644
--- a/editor/editor_spin_slider.cpp
+++ b/editor/editor_spin_slider.cpp
@@ -29,11 +29,16 @@
/*************************************************************************/
#include "editor_spin_slider.h"
+
+#include "core/input/input.h"
#include "core/math/expression.h"
-#include "core/os/input.h"
+#include "editor_node.h"
#include "editor_scale.h"
String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
+ if (grabber->is_visible()) {
+ return rtos(get_value()) + "\n\n" + TTR("Hold Ctrl to round to integers. Hold Shift for more precise changes.");
+ }
return rtos(get_value());
}
@@ -42,16 +47,14 @@ String EditorSpinSlider::get_text_value() const {
}
void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
-
- if (read_only)
+ if (read_only) {
return;
+ }
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid()) {
-
if (mb->get_button_index() == BUTTON_LEFT) {
if (mb->is_pressed()) {
-
if (updown_offset != -1 && mb->get_position().x > updown_offset) {
//there is an updown, so use it.
if (mb->get_position().y < get_size().height / 2) {
@@ -61,7 +64,6 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
}
return;
} else {
-
grabbing_spinner_attempt = true;
grabbing_spinner_dist_cache = 0;
pre_grab_value = get_value();
@@ -69,11 +71,8 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
grabbing_spinner_mouse_pos = Input::get_singleton()->get_mouse_position();
}
} else {
-
if (grabbing_spinner_attempt) {
-
if (grabbing_spinner) {
-
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
Input::get_singleton()->warp_mouse_position(grabbing_spinner_mouse_pos);
update();
@@ -86,17 +85,15 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
}
}
} else if (mb->get_button_index() == BUTTON_WHEEL_UP || mb->get_button_index() == BUTTON_WHEEL_DOWN) {
-
- if (grabber->is_visible())
+ if (grabber->is_visible()) {
call_deferred("update");
+ }
}
}
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid()) {
-
if (grabbing_spinner_attempt) {
-
double diff_x = mm->get_relative().x;
if (mm->get_shift() && grabbing_spinner) {
diff_x *= 0.1;
@@ -109,7 +106,21 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
}
if (grabbing_spinner) {
+ // Don't make the user scroll all the way back to 'in range' if they went off the end.
+ if (pre_grab_value < get_min() && !is_lesser_allowed()) {
+ pre_grab_value = get_min();
+ }
+ if (pre_grab_value > get_max() && !is_greater_allowed()) {
+ pre_grab_value = get_max();
+ }
+
if (mm->get_control()) {
+ // If control was just pressed, don't make the value do a huge jump in magnitude.
+ if (grabbing_spinner_dist_cache != 0) {
+ pre_grab_value += grabbing_spinner_dist_cache * get_step();
+ grabbing_spinner_dist_cache = 0;
+ }
+
set_value(Math::round(pre_grab_value + get_step() * grabbing_spinner_dist_cache * 10));
} else {
set_value(pre_grab_value + get_step() * grabbing_spinner_dist_cache);
@@ -131,12 +142,10 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
}
void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseButton> mb = p_event;
if (grabbing_grabber) {
if (mb.is_valid()) {
-
if (mb->get_button_index() == BUTTON_WHEEL_UP) {
set_value(get_value() + get_step());
mousewheel_over_grabber = true;
@@ -148,9 +157,7 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
}
if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) {
-
if (mb->is_pressed()) {
-
grabbing_grabber = true;
if (!mousewheel_over_grabber) {
grabbing_ratio = get_as_ratio();
@@ -164,8 +171,9 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && grabbing_grabber) {
- if (mousewheel_over_grabber)
+ if (mousewheel_over_grabber) {
return;
+ }
float grabbing_ofs = (grabber->get_transform().xform(mm->get_position()).x - grabbing_from) / float(grabber_range);
set_as_ratio(grabbing_ratio + grabbing_ofs);
@@ -174,33 +182,45 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
}
void EditorSpinSlider::_notification(int p_what) {
-
- if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_OUT ||
- p_what == MainLoop::NOTIFICATION_WM_FOCUS_IN ||
+ if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_OUT ||
+ p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN ||
p_what == NOTIFICATION_EXIT_TREE) {
if (grabbing_spinner) {
+ grabber->hide();
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
grabbing_spinner = false;
grabbing_spinner_attempt = false;
}
}
- if (p_what == NOTIFICATION_DRAW) {
+ if (p_what == NOTIFICATION_READY) {
+ // Add a left margin to the stylebox to make the number align with the Label
+ // when it's edited. The LineEdit "focus" stylebox uses the "normal" stylebox's
+ // default margins.
+ Ref<StyleBoxFlat> stylebox =
+ EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox("normal", "LineEdit")->duplicate();
+ // EditorSpinSliders with a label have more space on the left, so add an
+ // higher margin to match the location where the text begins.
+ // The margin values below were determined by empirical testing.
+ stylebox->set_default_margin(MARGIN_LEFT, (get_label() != String() ? 23 : 16) * EDSCALE);
+ value_input->add_theme_style_override("normal", stylebox);
+ }
+ if (p_what == NOTIFICATION_DRAW) {
updown_offset = -1;
- Ref<StyleBox> sb = get_stylebox("normal", "LineEdit");
+ Ref<StyleBox> sb = get_theme_stylebox("normal", "LineEdit");
if (!flat) {
draw_style_box(sb, Rect2(Vector2(), get_size()));
}
- Ref<Font> font = get_font("font", "LineEdit");
+ Ref<Font> font = get_theme_font("font", "LineEdit");
int sep_base = 4 * EDSCALE;
int sep = sep_base + sb->get_offset().x; //make it have the same margin on both sides, looks better
int string_width = font->get_string_size(label).width;
int number_width = get_size().width - sb->get_minimum_size().width - string_width - sep;
- Ref<Texture> updown = get_icon("updown", "SpinBox");
+ Ref<Texture2D> updown = get_theme_icon("updown", "SpinBox");
if (get_step() == 1) {
number_width -= updown->get_width();
@@ -210,7 +230,7 @@ void EditorSpinSlider::_notification(int p_what) {
int vofs = (get_size().height - font->get_height()) / 2 + font->get_ascent();
- Color fc = get_color("font_color", "LineEdit");
+ Color fc = get_theme_color("font_color", "LineEdit");
Color lc;
if (use_custom_label_color) {
lc = custom_label_color;
@@ -219,12 +239,12 @@ void EditorSpinSlider::_notification(int p_what) {
}
if (flat && label != String()) {
- Color label_bg_color = get_color("dark_color_3", "Editor");
+ Color label_bg_color = get_theme_color("dark_color_3", "Editor");
draw_rect(Rect2(Vector2(), Vector2(sb->get_offset().x * 2 + string_width, get_size().height)), label_bg_color);
}
if (has_focus()) {
- Ref<StyleBox> focus = get_stylebox("focus", "LineEdit");
+ Ref<StyleBox> focus = get_theme_stylebox("focus", "LineEdit");
draw_style_box(focus, Rect2(Vector2(), get_size()));
}
@@ -233,7 +253,7 @@ void EditorSpinSlider::_notification(int p_what) {
draw_string(font, Vector2(Math::round(sb->get_offset().x + string_width + sep), vofs), numstr, fc, number_width);
if (get_step() == 1) {
- Ref<Texture> updown2 = get_icon("updown", "SpinBox");
+ Ref<Texture2D> updown2 = get_theme_icon("updown", "SpinBox");
int updown_vofs = (get_size().height - updown2->get_height()) / 2;
updown_offset = get_size().width - sb->get_margin(MARGIN_RIGHT) - updown2->get_width();
Color c(1, 1, 1);
@@ -258,7 +278,7 @@ void EditorSpinSlider::_notification(int p_what) {
Rect2 grabber_rect = Rect2(ofs + gofs, svofs + 1, grabber_w, 2 * EDSCALE);
draw_rect(grabber_rect, c);
- bool display_grabber = (mouse_over_spin || mouse_over_grabber) && !grabbing_spinner && !value_input->is_visible();
+ bool display_grabber = (mouse_over_spin || mouse_over_grabber) && !grabbing_spinner && !value_input_popup->is_visible();
if (grabber->is_visible() != display_grabber) {
if (display_grabber) {
grabber->show();
@@ -268,11 +288,11 @@ void EditorSpinSlider::_notification(int p_what) {
}
if (display_grabber) {
- Ref<Texture> grabber_tex;
+ Ref<Texture2D> grabber_tex;
if (mouse_over_grabber) {
- grabber_tex = get_icon("grabber_highlight", "HSlider");
+ grabber_tex = get_theme_icon("grabber_highlight", "HSlider");
} else {
- grabber_tex = get_icon("grabber", "HSlider");
+ grabber_tex = get_theme_icon("grabber", "HSlider");
}
if (grabber->get_texture() != grabber_tex) {
@@ -292,21 +312,14 @@ void EditorSpinSlider::_notification(int p_what) {
}
if (p_what == NOTIFICATION_MOUSE_ENTER) {
-
mouse_over_spin = true;
update();
}
if (p_what == NOTIFICATION_MOUSE_EXIT) {
-
mouse_over_spin = false;
update();
}
if (p_what == NOTIFICATION_FOCUS_ENTER) {
- /* Sorry, I don't like this, it makes navigating the different fields with arrows more difficult.
- * Just press enter to edit.
- * if (Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT) && !value_input_just_closed) {
- _focus_entered();
- }*/
if ((Input::get_singleton()->is_action_pressed("ui_focus_next") || Input::get_singleton()->is_action_pressed("ui_focus_prev")) && !value_input_just_closed) {
_focus_entered();
}
@@ -315,9 +328,8 @@ void EditorSpinSlider::_notification(int p_what) {
}
Size2 EditorSpinSlider::get_minimum_size() const {
-
- Ref<StyleBox> sb = get_stylebox("normal", "LineEdit");
- Ref<Font> font = get_font("font", "LineEdit");
+ Ref<StyleBox> sb = get_theme_stylebox("normal", "LineEdit");
+ Ref<Font> font = get_theme_font("font", "LineEdit");
Size2 ms = sb->get_minimum_size();
ms.height += font->get_height();
@@ -352,16 +364,17 @@ void EditorSpinSlider::_evaluate_input_text() {
return;
}
- Variant v = expr->execute(Array(), NULL, false);
- if (v.get_type() == Variant::NIL)
+ Variant v = expr->execute(Array(), nullptr, false);
+ if (v.get_type() == Variant::NIL) {
return;
+ }
set_value(v);
}
//text_entered signal
void EditorSpinSlider::_value_input_entered(const String &p_text) {
value_input_just_closed = true;
- value_input->hide();
+ value_input_popup->hide();
}
//modal_closed signal
@@ -372,10 +385,10 @@ void EditorSpinSlider::_value_input_closed() {
//focus_exited signal
void EditorSpinSlider::_value_focus_exited() {
-
// discontinue because the focus_exit was caused by right-click context menu
- if (value_input->get_menu()->is_visible())
+ if (value_input->get_menu()->is_visible()) {
return;
+ }
_evaluate_input_text();
// focus is not on the same element after the vlalue_input was exited
@@ -384,7 +397,7 @@ void EditorSpinSlider::_value_focus_exited() {
// -> modal_close was not called
// -> need to close/hide manually
if (!value_input_just_closed) { //value_input_just_closed should do the same
- value_input->hide();
+ value_input_popup->hide();
//tab was pressed
} else {
//enter, click, esc
@@ -402,7 +415,6 @@ void EditorSpinSlider::_grabber_mouse_exited() {
}
void EditorSpinSlider::set_read_only(bool p_enable) {
-
read_only = p_enable;
update();
}
@@ -412,7 +424,6 @@ bool EditorSpinSlider::is_read_only() const {
}
void EditorSpinSlider::set_flat(bool p_enable) {
-
flat = p_enable;
update();
}
@@ -427,11 +438,11 @@ void EditorSpinSlider::set_custom_label_color(bool p_use_custom_label_color, Col
}
void EditorSpinSlider::_focus_entered() {
- Rect2 gr = get_global_rect();
+ Rect2 gr = get_screen_rect();
value_input->set_text(get_text_value());
- value_input->set_position(gr.position);
- value_input->set_size(gr.size);
- value_input->call_deferred("show_modal");
+ value_input_popup->set_position(gr.position);
+ value_input_popup->set_size(gr.size);
+ value_input_popup->call_deferred("popup");
value_input->call_deferred("grab_focus");
value_input->call_deferred("select_all");
value_input->set_focus_next(find_next_valid_focus()->get_path());
@@ -449,12 +460,6 @@ void EditorSpinSlider::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_flat"), &EditorSpinSlider::is_flat);
ClassDB::bind_method(D_METHOD("_gui_input"), &EditorSpinSlider::_gui_input);
- ClassDB::bind_method(D_METHOD("_grabber_mouse_entered"), &EditorSpinSlider::_grabber_mouse_entered);
- ClassDB::bind_method(D_METHOD("_grabber_mouse_exited"), &EditorSpinSlider::_grabber_mouse_exited);
- ClassDB::bind_method(D_METHOD("_grabber_gui_input"), &EditorSpinSlider::_grabber_gui_input);
- ClassDB::bind_method(D_METHOD("_value_input_closed"), &EditorSpinSlider::_value_input_closed);
- ClassDB::bind_method(D_METHOD("_value_input_entered"), &EditorSpinSlider::_value_input_entered);
- ClassDB::bind_method(D_METHOD("_value_focus_exited"), &EditorSpinSlider::_value_focus_exited);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "label"), "set_label", "get_label");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only");
@@ -462,7 +467,6 @@ void EditorSpinSlider::_bind_methods() {
}
EditorSpinSlider::EditorSpinSlider() {
-
flat = false;
grabbing_spinner_attempt = false;
grabbing_spinner = false;
@@ -476,21 +480,23 @@ EditorSpinSlider::EditorSpinSlider() {
grabber->hide();
grabber->set_as_toplevel(true);
grabber->set_mouse_filter(MOUSE_FILTER_STOP);
- grabber->connect("mouse_entered", this, "_grabber_mouse_entered");
- grabber->connect("mouse_exited", this, "_grabber_mouse_exited");
- grabber->connect("gui_input", this, "_grabber_gui_input");
+ grabber->connect("mouse_entered", callable_mp(this, &EditorSpinSlider::_grabber_mouse_entered));
+ grabber->connect("mouse_exited", callable_mp(this, &EditorSpinSlider::_grabber_mouse_exited));
+ grabber->connect("gui_input", callable_mp(this, &EditorSpinSlider::_grabber_gui_input));
mouse_over_spin = false;
mouse_over_grabber = false;
mousewheel_over_grabber = false;
grabbing_grabber = false;
grabber_range = 1;
+ value_input_popup = memnew(Popup);
+ add_child(value_input_popup);
value_input = memnew(LineEdit);
- add_child(value_input);
- value_input->set_as_toplevel(true);
- value_input->hide();
- value_input->connect("modal_closed", this, "_value_input_closed");
- value_input->connect("text_entered", this, "_value_input_entered");
- value_input->connect("focus_exited", this, "_value_focus_exited");
+ value_input_popup->add_child(value_input);
+ value_input_popup->set_wrap_controls(true);
+ value_input->set_anchors_and_margins_preset(PRESET_WIDE);
+ value_input_popup->connect("popup_hide", callable_mp(this, &EditorSpinSlider::_value_input_closed));
+ value_input->connect("text_entered", callable_mp(this, &EditorSpinSlider::_value_input_entered));
+ value_input->connect("focus_exited", callable_mp(this, &EditorSpinSlider::_value_focus_exited));
value_input_just_closed = false;
hide_slider = false;
read_only = false;
diff --git a/editor/editor_spin_slider.h b/editor/editor_spin_slider.h
index 81a7b981cc..d000ebd151 100644
--- a/editor/editor_spin_slider.h
+++ b/editor/editor_spin_slider.h
@@ -62,6 +62,7 @@ class EditorSpinSlider : public Range {
Vector2 grabbing_spinner_mouse_pos;
double pre_grab_value;
+ Popup *value_input_popup;
LineEdit *value_input;
bool value_input_just_closed;
@@ -86,7 +87,7 @@ protected:
void _focus_entered();
public:
- String get_tooltip(const Point2 &p_pos) const;
+ String get_tooltip(const Point2 &p_pos) const override;
String get_text_value() const;
void set_label(const String &p_label);
@@ -106,7 +107,7 @@ public:
void setup_and_show() { _focus_entered(); }
LineEdit *get_line_edit() { return value_input; }
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
EditorSpinSlider();
};
diff --git a/editor/editor_sub_scene.cpp b/editor/editor_sub_scene.cpp
index cd533649e3..f794babc24 100644
--- a/editor/editor_sub_scene.cpp
+++ b/editor/editor_sub_scene.cpp
@@ -35,51 +35,49 @@
#include "scene/resources/packed_scene.h"
void EditorSubScene::_path_selected(const String &p_path) {
-
path->set_text(p_path);
_path_changed(p_path);
}
void EditorSubScene::_path_changed(const String &p_path) {
-
tree->clear();
if (scene) {
memdelete(scene);
- scene = NULL;
+ scene = nullptr;
}
- if (p_path == "")
+ if (p_path == "") {
return;
+ }
Ref<PackedScene> ps = ResourceLoader::load(p_path, "PackedScene");
- if (ps.is_null())
+ if (ps.is_null()) {
return;
+ }
scene = ps->instance();
- if (!scene)
+ if (!scene) {
return;
+ }
- _fill_tree(scene, NULL);
+ _fill_tree(scene, nullptr);
}
void EditorSubScene::_path_browse() {
-
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
}
void EditorSubScene::_notification(int p_what) {
-
if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
-
- if (is_visible() && scene == NULL)
+ if (is_visible() && scene == nullptr) {
_path_browse();
+ }
}
}
void EditorSubScene::_fill_tree(Node *p_node, TreeItem *p_parent) {
-
TreeItem *it = tree->create_item(p_parent);
it->set_metadata(0, p_node);
it->set_text(0, p_node->get_name());
@@ -88,10 +86,10 @@ void EditorSubScene::_fill_tree(Node *p_node, TreeItem *p_parent) {
it->set_icon(0, EditorNode::get_singleton()->get_object_icon(p_node, "Node"));
for (int i = 0; i < p_node->get_child_count(); i++) {
-
Node *c = p_node->get_child(i);
- if (c->get_owner() != scene)
+ if (c->get_owner() != scene) {
continue;
+ }
_fill_tree(c, it);
}
}
@@ -114,8 +112,9 @@ void EditorSubScene::_item_multi_selected(Object *p_object, int p_cell, bool p_s
Node *n = item->get_metadata(0);
- if (!n)
+ if (!n) {
return;
+ }
if (p_selected) {
if (n == scene) {
is_root = true;
@@ -125,12 +124,17 @@ void EditorSubScene::_item_multi_selected(Object *p_object, int p_cell, bool p_s
} else {
List<Node *>::Element *E = selection.find(n);
- if (E)
+ if (E) {
selection.erase(E);
+ }
}
}
}
+void EditorSubScene::_item_activated() {
+ _ok_pressed(); // From AcceptDialog.
+}
+
void EditorSubScene::_remove_selection_child(Node *p_node) {
if (p_node->get_child_count() > 0) {
for (int i = 0; i < p_node->get_child_count(); i++) {
@@ -161,13 +165,10 @@ void EditorSubScene::ok_pressed() {
}
void EditorSubScene::_reown(Node *p_node, List<Node *> *p_to_reown) {
-
if (p_node == scene) {
-
scene->set_filename("");
p_to_reown->push_back(p_node);
} else if (p_node->get_owner() == scene) {
-
p_to_reown->push_back(p_node);
}
@@ -205,29 +206,21 @@ void EditorSubScene::move(Node *p_new_parent, Node *p_new_owner) {
if (!is_root) {
memdelete(scene);
}
- scene = NULL;
+ scene = nullptr;
//return selnode;
}
void EditorSubScene::clear() {
-
path->set_text("");
_path_changed("");
}
void EditorSubScene::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_path_selected"), &EditorSubScene::_path_selected);
- ClassDB::bind_method(D_METHOD("_path_changed"), &EditorSubScene::_path_changed);
- ClassDB::bind_method(D_METHOD("_path_browse"), &EditorSubScene::_path_browse);
- ClassDB::bind_method(D_METHOD("_item_multi_selected"), &EditorSubScene::_item_multi_selected);
- ClassDB::bind_method(D_METHOD("_selected_changed"), &EditorSubScene::_selected_changed);
ADD_SIGNAL(MethodInfo("subscene_selected"));
}
EditorSubScene::EditorSubScene() {
-
- scene = NULL;
+ scene = nullptr;
is_root = false;
set_title(TTR("Select Node(s) to Import"));
@@ -239,35 +232,34 @@ EditorSubScene::EditorSubScene() {
HBoxContainer *hb = memnew(HBoxContainer);
path = memnew(LineEdit);
- path->connect("text_entered", this, "_path_changed");
+ path->connect("text_entered", callable_mp(this, &EditorSubScene::_path_changed));
hb->add_child(path);
- path->set_h_size_flags(SIZE_EXPAND_FILL);
+ path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
Button *b = memnew(Button);
b->set_text(TTR("Browse"));
hb->add_child(b);
- b->connect("pressed", this, "_path_browse");
+ b->connect("pressed", callable_mp(this, &EditorSubScene::_path_browse));
vb->add_margin_child(TTR("Scene Path:"), hb);
tree = memnew(Tree);
- tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
vb->add_margin_child(TTR("Import From Node:"), tree, true);
tree->set_select_mode(Tree::SELECT_MULTI);
- tree->connect("multi_selected", this, "_item_multi_selected");
+ tree->connect("multi_selected", callable_mp(this, &EditorSubScene::_item_multi_selected));
//tree->connect("nothing_selected", this, "_deselect_items");
- tree->connect("cell_selected", this, "_selected_changed");
+ tree->connect("cell_selected", callable_mp(this, &EditorSubScene::_selected_changed));
- tree->connect("item_activated", this, "_ok", make_binds(), CONNECT_DEFERRED);
+ tree->connect("item_activated", callable_mp(this, &EditorSubScene::_item_activated), make_binds(), CONNECT_DEFERRED);
file_dialog = memnew(EditorFileDialog);
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions);
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
-
file_dialog->add_filter("*." + E->get());
}
- file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
add_child(file_dialog);
- file_dialog->connect("file_selected", this, "_path_selected");
+ file_dialog->connect("file_selected", callable_mp(this, &EditorSubScene::_path_selected));
}
diff --git a/editor/editor_sub_scene.h b/editor/editor_sub_scene.h
index 8205db25d7..bdfbbca02f 100644
--- a/editor/editor_sub_scene.h
+++ b/editor/editor_sub_scene.h
@@ -36,7 +36,6 @@
#include "scene/gui/tree.h"
class EditorSubScene : public ConfirmationDialog {
-
GDCLASS(EditorSubScene, ConfirmationDialog);
List<Node *> selection;
@@ -50,10 +49,11 @@ class EditorSubScene : public ConfirmationDialog {
void _fill_tree(Node *p_node, TreeItem *p_parent);
void _selected_changed();
void _item_multi_selected(Object *p_object, int p_cell, bool p_selected);
+ void _item_activated();
void _remove_selection_child(Node *p_node);
void _reown(Node *p_node, List<Node *> *p_to_reown);
- void ok_pressed();
+ void ok_pressed() override;
protected:
void _notification(int p_what);
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
index 8037045e77..79525ced51 100644
--- a/editor/editor_themes.cpp
+++ b/editor/editor_themes.cpp
@@ -35,9 +35,13 @@
#include "editor_icons.gen.h"
#include "editor_scale.h"
#include "editor_settings.h"
+
+#include "modules/modules_enabled.gen.h"
+#ifdef MODULE_SVG_ENABLED
#include "modules/svg/image_loader_svg.h"
+#endif
-static Ref<StyleBoxTexture> make_stylebox(Ref<Texture> p_texture, float p_left, float p_top, float p_right, float p_botton, float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_botton = -1, bool p_draw_center = true) {
+static Ref<StyleBoxTexture> make_stylebox(Ref<Texture2D> p_texture, float p_left, float p_top, float p_right, float p_botton, float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_botton = -1, bool p_draw_center = true) {
Ref<StyleBoxTexture> style(memnew(StyleBoxTexture));
style->set_texture(p_texture);
style->set_margin_size(MARGIN_LEFT, p_left * EDSCALE);
@@ -81,35 +85,29 @@ static Ref<StyleBoxLine> make_line_stylebox(Color p_color, int p_thickness = 1,
return style;
}
-Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, float p_scale = EDSCALE, bool p_force_filter = false) {
-
+#ifdef MODULE_SVG_ENABLED
+static Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, float p_scale = EDSCALE, bool p_force_filter = false) {
Ref<ImageTexture> icon = memnew(ImageTexture);
Ref<Image> img = memnew(Image);
- // dumb gizmo check
- bool is_gizmo = String(editor_icons_names[p_index]).begins_with("Gizmo");
-
// Upsample icon generation only if the editor scale isn't an integer multiplier.
// Generating upsampled icons is slower, and the benefit is hardly visible
// with integer editor scales.
const bool upsample = !Math::is_equal_approx(Math::round(p_scale), p_scale);
ImageLoaderSVG::create_image_from_string(img, editor_icons_sources[p_index], p_scale, upsample, p_convert_color);
- if ((p_scale - (float)((int)p_scale)) > 0.0 || is_gizmo || p_force_filter)
- icon->create_from_image(img); // in this case filter really helps
- else
- icon->create_from_image(img, 0);
+ icon->create_from_image(img); // in this case filter really helps
return icon;
}
+#endif
#ifndef ADD_CONVERT_COLOR
#define ADD_CONVERT_COLOR(dictionary, old_color, new_color) dictionary[Color::html(old_color)] = Color::html(new_color)
#endif
void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = true, int p_thumb_size = 32, bool p_only_thumbs = false) {
-
-#ifdef SVG_ENABLED
+#ifdef MODULE_SVG_ENABLED
// The default icon theme is designed to be used for a dark theme.
// This dictionary stores color codes to convert to other colors
// for better readability on a light theme.
@@ -189,8 +187,7 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme =
exceptions.insert("EditorHandle");
exceptions.insert("Editor3DHandle");
exceptions.insert("Godot");
- exceptions.insert("PanoramaSky");
- exceptions.insert("ProceduralSky");
+ exceptions.insert("Sky");
exceptions.insert("EditorControlAnchor");
exceptions.insert("DefaultProjectIcon");
exceptions.insert("GuiCloseCustomizable");
@@ -221,8 +218,15 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme =
// Generate icons.
if (!p_only_thumbs) {
for (int i = 0; i < editor_icons_count; i++) {
+ float icon_scale = EDSCALE;
+
+ // Always keep the DefaultProjectIcon at the default size
+ if (strcmp(editor_icons_names[i], "DefaultProjectIcon") == 0) {
+ icon_scale = 1.0f;
+ }
+
const int is_exception = exceptions.has(editor_icons_names[i]);
- const Ref<ImageTexture> icon = editor_generate_icon(i, !is_exception);
+ const Ref<ImageTexture> icon = editor_generate_icon(i, !is_exception, icon_scale);
p_theme->set_icon(editor_icons_names[i], "EditorIcons", icon);
}
@@ -251,14 +255,13 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme =
}
}
- ImageLoaderSVG::set_convert_colors(NULL);
+ ImageLoaderSVG::set_convert_colors(nullptr);
#else
WARN_PRINT("SVG support disabled, editor icons won't be rendered.");
#endif
}
Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
-
Ref<Theme> theme = Ref<Theme>(memnew(Theme));
const float default_contrast = 0.25;
@@ -340,24 +343,24 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
//Colors
bool dark_theme = EditorSettings::get_singleton()->is_dark_theme();
- const Color dark_color_1 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast);
- const Color dark_color_2 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast * 1.5);
- const Color dark_color_3 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast * 2);
+ const Color dark_color_1 = base_color.lerp(Color(0, 0, 0, 1), contrast);
+ const Color dark_color_2 = base_color.lerp(Color(0, 0, 0, 1), contrast * 1.5);
+ const Color dark_color_3 = base_color.lerp(Color(0, 0, 0, 1), contrast * 2);
const Color background_color = dark_color_2;
// white (dark theme) or black (light theme), will be used to generate the rest of the colors
const Color mono_color = dark_theme ? Color(1, 1, 1) : Color(0, 0, 0);
- const Color contrast_color_1 = base_color.linear_interpolate(mono_color, MAX(contrast, default_contrast));
- const Color contrast_color_2 = base_color.linear_interpolate(mono_color, MAX(contrast * 1.5, default_contrast * 1.5));
+ const Color contrast_color_1 = base_color.lerp(mono_color, MAX(contrast, default_contrast));
+ const Color contrast_color_2 = base_color.lerp(mono_color, MAX(contrast * 1.5, default_contrast * 1.5));
- const Color font_color = mono_color.linear_interpolate(base_color, 0.25);
- const Color font_color_hl = mono_color.linear_interpolate(base_color, 0.15);
+ const Color font_color = mono_color.lerp(base_color, 0.25);
+ const Color font_color_hl = mono_color.lerp(base_color, 0.15);
const Color font_color_disabled = Color(mono_color.r, mono_color.g, mono_color.b, 0.3);
const Color font_color_selection = accent_color * Color(1, 1, 1, 0.4);
- const Color color_disabled = mono_color.inverted().linear_interpolate(base_color, 0.7);
- const Color color_disabled_bg = mono_color.inverted().linear_interpolate(base_color, 0.9);
+ const Color color_disabled = mono_color.inverted().lerp(base_color, 0.7);
+ const Color color_disabled_bg = mono_color.inverted().lerp(base_color, 0.9);
Color icon_color_hover = Color(1, 1, 1) * (dark_theme ? 1.15 : 1.45);
icon_color_hover.a = 1.0;
@@ -394,13 +397,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
Color success_color = Color(0.45, 0.95, 0.5);
Color warning_color = Color(1, 0.87, 0.4);
Color error_color = Color(1, 0.47, 0.42);
- Color property_color = font_color.linear_interpolate(Color(0.5, 0.5, 0.5), 0.5);
+ Color property_color = font_color.lerp(Color(0.5, 0.5, 0.5), 0.5);
if (!dark_theme) {
// Darken some colors to be readable on a light background
- success_color = success_color.linear_interpolate(mono_color, 0.35);
- warning_color = warning_color.linear_interpolate(mono_color, 0.35);
- error_color = error_color.linear_interpolate(mono_color, 0.25);
+ success_color = success_color.lerp(mono_color, 0.35);
+ warning_color = warning_color.lerp(mono_color, 0.35);
+ error_color = error_color.lerp(mono_color, 0.25);
}
theme->set_color("success_color", "Editor", success_color);
@@ -408,6 +411,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("error_color", "Editor", error_color);
theme->set_color("property_color", "Editor", property_color);
+ if (!dark_theme) {
+ theme->set_color("vulkan_color", "Editor", Color::hex(0xad1128ff));
+ } else {
+ theme->set_color("vulkan_color", "Editor", Color(1.0, 0.0, 0.0));
+ }
const int thumb_size = EDITOR_GET("filesystem/file_dialog/thumbnail_size");
theme->set_constant("scale", "Editor", EDSCALE);
theme->set_constant("thumb_size", "Editor", thumb_size);
@@ -416,7 +424,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
//Register icons + font
// the resolution and the icon color (dark_theme bool) has not changed, so we do not regenerate the icons
- if (p_theme != NULL && fabs(p_theme->get_constant("scale", "Editor") - EDSCALE) < 0.00001 && (bool)p_theme->get_constant("dark_theme", "Editor") == dark_theme) {
+ if (p_theme != nullptr && fabs(p_theme->get_constant("scale", "Editor") - EDSCALE) < 0.00001 && (bool)p_theme->get_constant("dark_theme", "Editor") == dark_theme) {
// register already generated icons
for (int i = 0; i < editor_icons_count; i++) {
theme->set_icon(editor_icons_names[i], "EditorIcons", p_theme->get_icon(editor_icons_names[i], "EditorIcons"));
@@ -425,14 +433,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
editor_register_and_generate_icons(theme, dark_theme, thumb_size);
}
// thumbnail size has changed, so we regenerate the medium sizes
- if (p_theme != NULL && fabs((double)p_theme->get_constant("thumb_size", "Editor") - thumb_size) > 0.00001) {
+ if (p_theme != nullptr && fabs((double)p_theme->get_constant("thumb_size", "Editor") - thumb_size) > 0.00001) {
editor_register_and_generate_icons(p_theme, dark_theme, thumb_size, true);
}
editor_register_fonts(theme);
// Highlighted tabs and border width
- Color tab_color = highlight_tabs ? base_color.linear_interpolate(font_color, contrast) : base_color;
+ Color tab_color = highlight_tabs ? base_color.lerp(font_color, contrast) : base_color;
const int border_width = CLAMP(border_size, 0, 3) * EDSCALE;
const int default_margin_size = 4;
@@ -571,17 +579,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_stylebox("focus", "PopupMenu", style_menu);
theme->set_stylebox("disabled", "PopupMenu", style_menu);
- theme->set_stylebox("normal", "ToolButton", style_menu);
- theme->set_stylebox("hover", "ToolButton", style_menu);
- theme->set_stylebox("pressed", "ToolButton", style_menu);
- theme->set_stylebox("focus", "ToolButton", style_menu);
- theme->set_stylebox("disabled", "ToolButton", style_menu);
-
theme->set_color("font_color", "MenuButton", font_color);
theme->set_color("font_color_hover", "MenuButton", font_color_hl);
- theme->set_color("font_color", "ToolButton", font_color);
- theme->set_color("font_color_hover", "ToolButton", font_color_hl);
- theme->set_color("font_color_pressed", "ToolButton", accent_color);
theme->set_stylebox("MenuHover", "EditorStyles", style_menu_hover_border);
@@ -684,7 +683,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon("GuiVisibilityXray", "EditorIcons"));
theme->set_constant("vseparation", "PopupMenu", (extra_spacing + default_margin_size + 1) * EDSCALE);
- Ref<StyleBoxFlat> sub_inspector_bg = make_flat_stylebox(dark_color_1.linear_interpolate(accent_color, 0.08), 2, 0, 2, 2);
+ Ref<StyleBoxFlat> sub_inspector_bg = make_flat_stylebox(dark_color_1.lerp(accent_color, 0.08), 2, 0, 2, 2);
sub_inspector_bg->set_border_width(MARGIN_LEFT, 2);
sub_inspector_bg->set_border_width(MARGIN_RIGHT, 2);
sub_inspector_bg->set_border_width(MARGIN_BOTTOM, 2);
@@ -761,9 +760,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_stylebox("title_button_hover", "Tree", style_tree_title);
theme->set_stylebox("title_button_pressed", "Tree", style_tree_title);
- Color prop_category_color = dark_color_1.linear_interpolate(mono_color, 0.12);
- Color prop_section_color = dark_color_1.linear_interpolate(mono_color, 0.09);
- Color prop_subsection_color = dark_color_1.linear_interpolate(mono_color, 0.06);
+ Color prop_category_color = dark_color_1.lerp(mono_color, 0.12);
+ Color prop_section_color = dark_color_1.lerp(mono_color, 0.09);
+ Color prop_subsection_color = dark_color_1.lerp(mono_color, 0.06);
theme->set_color("prop_category", "Editor", prop_category_color);
theme->set_color("prop_section", "Editor", prop_section_color);
theme->set_color("prop_subsection", "Editor", prop_subsection_color);
@@ -849,12 +848,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
Ref<StyleBoxFlat> style_panel_debugger = style_content_panel->duplicate();
style_panel_debugger->set_border_width(MARGIN_BOTTOM, 0);
theme->set_stylebox("DebuggerPanel", "EditorStyles", style_panel_debugger);
- theme->set_stylebox("DebuggerTabFG", "EditorStyles", style_tab_selected);
- theme->set_stylebox("DebuggerTabBG", "EditorStyles", style_tab_unselected);
Ref<StyleBoxFlat> style_panel_invisible_top = style_content_panel->duplicate();
int stylebox_offset = theme->get_font("tab_fg", "TabContainer")->get_height() + theme->get_stylebox("tab_fg", "TabContainer")->get_minimum_size().height + theme->get_stylebox("panel", "TabContainer")->get_default_margin(MARGIN_TOP);
style_panel_invisible_top->set_expand_margin_size(MARGIN_TOP, -stylebox_offset);
+ style_panel_invisible_top->set_default_margin(MARGIN_TOP, 0);
theme->set_stylebox("BottomPanelDebuggerOverride", "EditorStyles", style_panel_invisible_top);
// LineEdit
@@ -877,12 +875,24 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_constant("side_margin", "TabContainer", 0);
theme->set_icon("tab", "TextEdit", theme->get_icon("GuiTab", "EditorIcons"));
theme->set_icon("space", "TextEdit", theme->get_icon("GuiSpace", "EditorIcons"));
- theme->set_icon("folded", "TextEdit", theme->get_icon("GuiTreeArrowRight", "EditorIcons"));
- theme->set_icon("fold", "TextEdit", theme->get_icon("GuiTreeArrowDown", "EditorIcons"));
theme->set_color("font_color", "TextEdit", font_color);
theme->set_color("caret_color", "TextEdit", font_color);
theme->set_color("selection_color", "TextEdit", font_color_selection);
+ // CodeEdit
+ theme->set_stylebox("normal", "CodeEdit", style_widget);
+ theme->set_stylebox("focus", "CodeEdit", style_widget_hover);
+ theme->set_stylebox("read_only", "CodeEdit", style_widget_disabled);
+ theme->set_constant("side_margin", "TabContainer", 0);
+ theme->set_icon("tab", "CodeEdit", theme->get_icon("GuiTab", "EditorIcons"));
+ theme->set_icon("space", "CodeEdit", theme->get_icon("GuiSpace", "EditorIcons"));
+ theme->set_icon("folded", "CodeEdit", theme->get_icon("GuiTreeArrowRight", "EditorIcons"));
+ theme->set_icon("can_fold", "CodeEdit", theme->get_icon("GuiTreeArrowDown", "EditorIcons"));
+ theme->set_icon("executing_line", "CodeEdit", theme->get_icon("MainPlay", "EditorIcons"));
+ theme->set_color("font_color", "CodeEdit", font_color);
+ theme->set_color("caret_color", "CodeEdit", font_color);
+ theme->set_color("selection_color", "CodeEdit", font_color_selection);
+
// H/VSplitContainer
theme->set_stylebox("bg", "VSplitContainer", make_stylebox(theme->get_icon("GuiVsplitBg", "EditorIcons"), 1, 1, 1, 1));
theme->set_stylebox("bg", "HSplitContainer", make_stylebox(theme->get_icon("GuiHsplitBg", "EditorIcons"), 1, 1, 1, 1));
@@ -909,14 +919,17 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
style_window->set_border_color(tab_color);
style_window->set_border_width(MARGIN_TOP, 24 * EDSCALE);
style_window->set_expand_margin_size(MARGIN_TOP, 24 * EDSCALE);
- theme->set_stylebox("panel", "WindowDialog", style_window);
- theme->set_color("title_color", "WindowDialog", font_color);
- theme->set_icon("close", "WindowDialog", theme->get_icon("GuiClose", "EditorIcons"));
- theme->set_icon("close_highlight", "WindowDialog", theme->get_icon("GuiClose", "EditorIcons"));
- theme->set_constant("close_h_ofs", "WindowDialog", 22 * EDSCALE);
- theme->set_constant("close_v_ofs", "WindowDialog", 20 * EDSCALE);
- theme->set_constant("title_height", "WindowDialog", 24 * EDSCALE);
- theme->set_font("title_font", "WindowDialog", theme->get_font("title", "EditorFonts"));
+
+ theme->set_stylebox("panel", "Window", style_default);
+ theme->set_stylebox("panel_window", "Window", style_window);
+ theme->set_color("title_color", "Window", font_color);
+ theme->set_icon("close", "Window", theme->get_icon("GuiClose", "EditorIcons"));
+ theme->set_icon("close_highlight", "Window", theme->get_icon("GuiClose", "EditorIcons"));
+ theme->set_constant("close_h_ofs", "Window", 22 * EDSCALE);
+ theme->set_constant("close_v_ofs", "Window", 20 * EDSCALE);
+ theme->set_constant("title_height", "Window", 24 * EDSCALE);
+ theme->set_constant("resize_margin", "Window", 4 * EDSCALE);
+ theme->set_font("title_font", "Window", theme->get_font("title", "EditorFonts"));
// complex window, for now only Editor settings and Project settings
Ref<StyleBoxFlat> style_complex_window = style_window->duplicate();
@@ -927,7 +940,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_stylebox("panel", "EditorAbout", style_complex_window);
// HScrollBar
- Ref<Texture> empty_icon = memnew(ImageTexture);
+ Ref<Texture2D> empty_icon = memnew(ImageTexture);
theme->set_stylebox("scroll", "HScrollBar", make_stylebox(theme->get_icon("GuiScrollBg", "EditorIcons"), 5, 5, 5, 5, 0, 0, 0, 0));
theme->set_stylebox("scroll_focus", "HScrollBar", make_stylebox(theme->get_icon("GuiScrollBg", "EditorIcons"), 5, 5, 5, 5, 0, 0, 0, 0));
@@ -957,12 +970,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("grabber", "HSlider", theme->get_icon("GuiSliderGrabber", "EditorIcons"));
theme->set_stylebox("slider", "HSlider", make_flat_stylebox(dark_color_3, 0, default_margin_size / 2, 0, default_margin_size / 2));
theme->set_stylebox("grabber_area", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2));
+ theme->set_stylebox("grabber_area_highlight", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2));
// VSlider
theme->set_icon("grabber", "VSlider", theme->get_icon("GuiSliderGrabber", "EditorIcons"));
theme->set_icon("grabber_highlight", "VSlider", theme->get_icon("GuiSliderGrabberHl", "EditorIcons"));
theme->set_stylebox("slider", "VSlider", make_flat_stylebox(dark_color_3, default_margin_size / 2, 0, default_margin_size / 2, 0));
theme->set_stylebox("grabber_area", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0));
+ theme->set_stylebox("grabber_area_highlight", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0));
//RichTextLabel
theme->set_color("default_color", "RichTextLabel", font_color);
@@ -977,6 +992,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
// Panel
theme->set_stylebox("panel", "Panel", make_flat_stylebox(dark_color_1, 6, 4, 6, 4));
+ theme->set_stylebox("panel_fg", "Panel", style_default);
// Label
theme->set_stylebox("normal", "Label", style_empty);
@@ -990,6 +1006,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
// LinkButton
theme->set_stylebox("focus", "LinkButton", style_empty);
theme->set_color("font_color", "LinkButton", font_color);
+ theme->set_color("font_color_hover", "LinkButton", font_color_hl);
+ theme->set_color("font_color_pressed", "LinkButton", accent_color);
+ theme->set_color("font_color_disabled", "LinkButton", font_color_disabled);
// TooltipPanel
Ref<StyleBoxFlat> style_tooltip = style_popup->duplicate();
@@ -1114,7 +1133,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("toggle_hidden", "FileDialog", theme->get_icon("GuiVisibilityVisible", "EditorIcons"));
// Use a different color for folder icons to make them easier to distinguish from files.
// On a light theme, the icon will be dark, so we need to lighten it before blending it with the accent color.
- theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).linear_interpolate(accent_color, 0.7));
+ theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).lerp(accent_color, 0.7));
theme->set_color("files_disabled", "FileDialog", font_color_disabled);
// color picker
@@ -1148,13 +1167,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
// editor main color
const Color main_color = dark_theme ? Color(0.34, 0.7, 1.0) : Color(0.02, 0.5, 1.0);
- const Color symbol_color = Color(0.34, 0.57, 1.0).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3);
+ const Color symbol_color = Color(0.34, 0.57, 1.0).lerp(mono_color, dark_theme ? 0.5 : 0.3);
const Color keyword_color = Color(1.0, 0.44, 0.52);
const Color basetype_color = dark_theme ? Color(0.26, 1.0, 0.76) : Color(0.0, 0.76, 0.38);
- const Color type_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.4 : 0.3);
- const Color usertype_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.7 : 0.5);
+ const Color type_color = basetype_color.lerp(mono_color, dark_theme ? 0.4 : 0.3);
+ const Color usertype_color = basetype_color.lerp(mono_color, dark_theme ? 0.7 : 0.5);
const Color comment_color = dim_color;
- const Color string_color = (dark_theme ? Color(1.0, 0.85, 0.26) : Color(1.0, 0.82, 0.09)).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3);
+ const Color string_color = (dark_theme ? Color(1.0, 0.85, 0.26) : Color(1.0, 0.82, 0.09)).lerp(mono_color, dark_theme ? 0.5 : 0.3);
const Color te_background_color = dark_theme ? background_color : base_color;
const Color completion_background_color = dark_theme ? base_color : background_color;
@@ -1173,13 +1192,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
const Color current_line_color = alpha1;
const Color line_length_guideline_color = dark_theme ? base_color : background_color;
const Color word_highlighted_color = alpha1;
- const Color number_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3);
+ const Color number_color = basetype_color.lerp(mono_color, dark_theme ? 0.5 : 0.3);
const Color function_color = main_color;
- const Color member_variable_color = main_color.linear_interpolate(mono_color, 0.6);
+ const Color member_variable_color = main_color.lerp(mono_color, 0.6);
const Color mark_color = Color(error_color.r, error_color.g, error_color.b, 0.3);
const Color bookmark_color = Color(0.08, 0.49, 0.98);
const Color breakpoint_color = error_color;
- const Color executing_line_color = Color(0.2, 0.8, 0.2, 0.4);
+ const Color executing_line_color = Color(0.98, 0.89, 0.27);
const Color code_folding_color = alpha3;
const Color search_result_color = alpha1;
const Color search_result_border_color = Color(0.41, 0.61, 0.91, 0.38);
diff --git a/editor/editor_themes.h b/editor/editor_themes.h
index 6e9630804f..4d9bfc56c8 100644
--- a/editor/editor_themes.h
+++ b/editor/editor_themes.h
@@ -33,8 +33,8 @@
#include "scene/resources/theme.h"
-Ref<Theme> create_editor_theme(Ref<Theme> p_theme = NULL);
+Ref<Theme> create_editor_theme(Ref<Theme> p_theme = nullptr);
-Ref<Theme> create_custom_theme(Ref<Theme> p_theme = NULL);
+Ref<Theme> create_custom_theme(Ref<Theme> p_theme = nullptr);
#endif
diff --git a/editor/editor_translation_parser.cpp b/editor/editor_translation_parser.cpp
new file mode 100644
index 0000000000..7a90d20000
--- /dev/null
+++ b/editor/editor_translation_parser.cpp
@@ -0,0 +1,183 @@
+/*************************************************************************/
+/* editor_translation_parser.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_translation_parser.h"
+
+#include "core/error_macros.h"
+#include "core/os/file_access.h"
+#include "core/script_language.h"
+#include "core/set.h"
+
+EditorTranslationParser *EditorTranslationParser::singleton = nullptr;
+
+Error EditorTranslationParserPlugin::parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) {
+ if (!get_script_instance())
+ return ERR_UNAVAILABLE;
+
+ if (get_script_instance()->has_method("parse_file")) {
+ Array ids;
+ Array ids_ctx_plural;
+ get_script_instance()->call("parse_file", p_path, ids, ids_ctx_plural);
+
+ // Add user's extracted translatable messages.
+ for (int i = 0; i < ids.size(); i++) {
+ r_ids->append(ids[i]);
+ }
+
+ // Add user's collected translatable messages with context or plurals.
+ for (int i = 0; i < ids_ctx_plural.size(); i++) {
+ Array arr = ids_ctx_plural[i];
+ ERR_FAIL_COND_V_MSG(arr.size() != 3, ERR_INVALID_DATA, "Array entries written into `msgids_context_plural` in `parse_file()` method should have the form [\"message\", \"context\", \"plural message\"]");
+
+ Vector<String> id_ctx_plural;
+ id_ctx_plural.push_back(arr[0]);
+ id_ctx_plural.push_back(arr[1]);
+ id_ctx_plural.push_back(arr[2]);
+ r_ids_ctx_plural->append(id_ctx_plural);
+ }
+ return OK;
+ } else {
+ ERR_PRINT("Custom translation parser plugin's \"func parse_file(path, extracted_strings)\" is undefined.");
+ return ERR_UNAVAILABLE;
+ }
+}
+
+void EditorTranslationParserPlugin::get_recognized_extensions(List<String> *r_extensions) const {
+ if (!get_script_instance())
+ return;
+
+ if (get_script_instance()->has_method("get_recognized_extensions")) {
+ Array extensions = get_script_instance()->call("get_recognized_extensions");
+ for (int i = 0; i < extensions.size(); i++) {
+ r_extensions->push_back(extensions[i]);
+ }
+ } else {
+ ERR_PRINT("Custom translation parser plugin's \"func get_recognized_extensions()\" is undefined.");
+ }
+}
+
+void EditorTranslationParserPlugin::_bind_methods() {
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::NIL, "parse_file", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::ARRAY, "msgids"), PropertyInfo(Variant::ARRAY, "msgids_context_plural")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_recognized_extensions"));
+}
+
+/////////////////////////
+
+void EditorTranslationParser::get_recognized_extensions(List<String> *r_extensions) const {
+ Set<String> extensions;
+ List<String> temp;
+ for (int i = 0; i < standard_parsers.size(); i++) {
+ standard_parsers[i]->get_recognized_extensions(&temp);
+ }
+ for (int i = 0; i < custom_parsers.size(); i++) {
+ custom_parsers[i]->get_recognized_extensions(&temp);
+ }
+ // Remove duplicates.
+ for (int i = 0; i < temp.size(); i++) {
+ extensions.insert(temp[i]);
+ }
+ for (auto E = extensions.front(); E; E = E->next()) {
+ r_extensions->push_back(E->get());
+ }
+}
+
+bool EditorTranslationParser::can_parse(const String &p_extension) const {
+ List<String> extensions;
+ get_recognized_extensions(&extensions);
+ for (int i = 0; i < extensions.size(); i++) {
+ if (p_extension == extensions[i]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+Ref<EditorTranslationParserPlugin> EditorTranslationParser::get_parser(const String &p_extension) const {
+ // Consider user-defined parsers first.
+ for (int i = 0; i < custom_parsers.size(); i++) {
+ List<String> temp;
+ custom_parsers[i]->get_recognized_extensions(&temp);
+ for (int j = 0; j < temp.size(); j++) {
+ if (temp[j] == p_extension) {
+ return custom_parsers[i];
+ }
+ }
+ }
+
+ for (int i = 0; i < standard_parsers.size(); i++) {
+ List<String> temp;
+ standard_parsers[i]->get_recognized_extensions(&temp);
+ for (int j = 0; j < temp.size(); j++) {
+ if (temp[j] == p_extension) {
+ return standard_parsers[i];
+ }
+ }
+ }
+
+ WARN_PRINT("No translation parser available for \"" + p_extension + "\" extension.");
+
+ return nullptr;
+}
+
+void EditorTranslationParser::add_parser(const Ref<EditorTranslationParserPlugin> &p_parser, ParserType p_type) {
+ if (p_type == ParserType::STANDARD) {
+ standard_parsers.push_back(p_parser);
+ } else if (p_type == ParserType::CUSTOM) {
+ custom_parsers.push_back(p_parser);
+ }
+}
+
+void EditorTranslationParser::remove_parser(const Ref<EditorTranslationParserPlugin> &p_parser, ParserType p_type) {
+ if (p_type == ParserType::STANDARD) {
+ standard_parsers.erase(p_parser);
+ } else if (p_type == ParserType::CUSTOM) {
+ custom_parsers.erase(p_parser);
+ }
+}
+
+void EditorTranslationParser::clean_parsers() {
+ standard_parsers.clear();
+ custom_parsers.clear();
+}
+
+EditorTranslationParser *EditorTranslationParser::get_singleton() {
+ if (!singleton) {
+ singleton = memnew(EditorTranslationParser);
+ }
+ return singleton;
+}
+
+EditorTranslationParser::EditorTranslationParser() {
+}
+
+EditorTranslationParser::~EditorTranslationParser() {
+ memdelete(singleton);
+ singleton = nullptr;
+}
diff --git a/editor/editor_translation_parser.h b/editor/editor_translation_parser.h
new file mode 100644
index 0000000000..18f49b3803
--- /dev/null
+++ b/editor/editor_translation_parser.h
@@ -0,0 +1,73 @@
+/*************************************************************************/
+/* editor_translation_parser.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_TRANSLATION_PARSER_H
+#define EDITOR_TRANSLATION_PARSER_H
+
+#include "core/error_list.h"
+#include "core/reference.h"
+
+class EditorTranslationParserPlugin : public Reference {
+ GDCLASS(EditorTranslationParserPlugin, Reference);
+
+protected:
+ static void _bind_methods();
+
+public:
+ virtual Error parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural);
+ virtual void get_recognized_extensions(List<String> *r_extensions) const;
+};
+
+class EditorTranslationParser {
+ static EditorTranslationParser *singleton;
+
+public:
+ enum ParserType {
+ STANDARD, // GDScript, CSharp, ...
+ CUSTOM // User-defined parser plugins. This will override standard parsers if the same extension type is defined.
+ };
+
+ static EditorTranslationParser *get_singleton();
+
+ Vector<Ref<EditorTranslationParserPlugin>> standard_parsers;
+ Vector<Ref<EditorTranslationParserPlugin>> custom_parsers;
+
+ void get_recognized_extensions(List<String> *r_extensions) const;
+ bool can_parse(const String &p_extension) const;
+ Ref<EditorTranslationParserPlugin> get_parser(const String &p_extension) const;
+ void add_parser(const Ref<EditorTranslationParserPlugin> &p_parser, ParserType p_type);
+ void remove_parser(const Ref<EditorTranslationParserPlugin> &p_parser, ParserType p_type);
+ void clean_parsers();
+
+ EditorTranslationParser();
+ ~EditorTranslationParser();
+};
+
+#endif // EDITOR_TRANSLATION_PARSER_H
diff --git a/editor/editor_vcs_interface.cpp b/editor/editor_vcs_interface.cpp
index 0562c3ba43..4b13a5dd89 100644
--- a/editor/editor_vcs_interface.cpp
+++ b/editor/editor_vcs_interface.cpp
@@ -30,10 +30,9 @@
#include "editor_vcs_interface.h"
-EditorVCSInterface *EditorVCSInterface::singleton = NULL;
+EditorVCSInterface *EditorVCSInterface::singleton = nullptr;
void EditorVCSInterface::_bind_methods() {
-
// Proxy end points that act as fallbacks to unavailability of a function in the VCS addon
ClassDB::bind_method(D_METHOD("_initialize", "project_root_path"), &EditorVCSInterface::_initialize);
ClassDB::bind_method(D_METHOD("_is_vcs_initialized"), &EditorVCSInterface::_is_vcs_initialized);
@@ -62,18 +61,15 @@ void EditorVCSInterface::_bind_methods() {
}
bool EditorVCSInterface::_initialize(String p_project_root_path) {
-
- WARN_PRINT("Selected VCS addon does not implement an initialization function. This warning will be suppressed.")
+ WARN_PRINT("Selected VCS addon does not implement an initialization function. This warning will be suppressed.");
return true;
}
bool EditorVCSInterface::_is_vcs_initialized() {
-
return false;
}
Dictionary EditorVCSInterface::_get_modified_files_data() {
-
return Dictionary();
}
@@ -87,96 +83,76 @@ void EditorVCSInterface::_commit(String p_msg) {
}
Array EditorVCSInterface::_get_file_diff(String p_file_path) {
-
return Array();
}
bool EditorVCSInterface::_shut_down() {
-
return false;
}
String EditorVCSInterface::_get_project_name() {
-
return String();
}
String EditorVCSInterface::_get_vcs_name() {
-
return "";
}
bool EditorVCSInterface::initialize(String p_project_root_path) {
-
is_initialized = call("_initialize", p_project_root_path);
return is_initialized;
}
bool EditorVCSInterface::is_vcs_initialized() {
-
return call("_is_vcs_initialized");
}
Dictionary EditorVCSInterface::get_modified_files_data() {
-
return call("_get_modified_files_data");
}
void EditorVCSInterface::stage_file(String p_file_path) {
-
if (is_addon_ready()) {
-
call("_stage_file", p_file_path);
}
}
void EditorVCSInterface::unstage_file(String p_file_path) {
-
if (is_addon_ready()) {
-
call("_unstage_file", p_file_path);
}
}
bool EditorVCSInterface::is_addon_ready() {
-
return is_initialized;
}
void EditorVCSInterface::commit(String p_msg) {
-
if (is_addon_ready()) {
-
call("_commit", p_msg);
}
}
Array EditorVCSInterface::get_file_diff(String p_file_path) {
-
if (is_addon_ready()) {
-
return call("_get_file_diff", p_file_path);
}
return Array();
}
bool EditorVCSInterface::shut_down() {
-
return call("_shut_down");
}
String EditorVCSInterface::get_project_name() {
-
return call("_get_project_name");
}
String EditorVCSInterface::get_vcs_name() {
-
return call("_get_vcs_name");
}
EditorVCSInterface::EditorVCSInterface() {
-
is_initialized = false;
}
@@ -184,11 +160,9 @@ EditorVCSInterface::~EditorVCSInterface() {
}
EditorVCSInterface *EditorVCSInterface::get_singleton() {
-
return singleton;
}
void EditorVCSInterface::set_singleton(EditorVCSInterface *p_singleton) {
-
singleton = p_singleton;
}
diff --git a/editor/editor_vcs_interface.h b/editor/editor_vcs_interface.h
index 85d5e30367..ee9e51441d 100644
--- a/editor/editor_vcs_interface.h
+++ b/editor/editor_vcs_interface.h
@@ -36,7 +36,6 @@
#include "scene/gui/panel_container.h"
class EditorVCSInterface : public Object {
-
GDCLASS(EditorVCSInterface, Object)
bool is_initialized;
diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp
index cb636f8cdc..84517f36ea 100644
--- a/editor/export_template_manager.cpp
+++ b/editor/export_template_manager.cpp
@@ -30,10 +30,10 @@
#include "export_template_manager.h"
+#include "core/input/input.h"
#include "core/io/json.h"
#include "core/io/zip_io.h"
#include "core/os/dir_access.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/version.h"
#include "editor_node.h"
@@ -42,7 +42,6 @@
#include "scene/gui/link_button.h"
void ExportTemplateManager::_update_template_list() {
-
while (current_hb->get_child_count()) {
memdelete(current_hb->get_child(0));
}
@@ -57,7 +56,6 @@ void ExportTemplateManager::_update_template_list() {
Set<String> templates;
d->list_dir_begin();
if (err == OK) {
-
String c = d->get_next();
while (c != String()) {
if (d->current_is_dir() && !c.begins_with(".")) {
@@ -82,28 +80,28 @@ void ExportTemplateManager::_update_template_list() {
String(VERSION_STATUS) != String("rc");
Label *current = memnew(Label);
- current->set_h_size_flags(SIZE_EXPAND_FILL);
+ current->set_h_size_flags(Control::SIZE_EXPAND_FILL);
current_hb->add_child(current);
if (templates.has(current_version)) {
- current->add_color_override("font_color", get_color("success_color", "Editor"));
+ current->add_theme_color_override("font_color", current->get_theme_color("success_color", "Editor"));
// Only display a redownload button if it can be downloaded in the first place
if (downloads_available) {
Button *redownload = memnew(Button);
redownload->set_text(TTR("Redownload"));
current_hb->add_child(redownload);
- redownload->connect("pressed", this, "_download_template", varray(current_version));
+ redownload->connect("pressed", callable_mp(this, &ExportTemplateManager::_download_template), varray(current_version));
}
Button *uninstall = memnew(Button);
uninstall->set_text(TTR("Uninstall"));
current_hb->add_child(uninstall);
current->set_text(current_version + " " + TTR("(Installed)"));
- uninstall->connect("pressed", this, "_uninstall_template", varray(current_version));
+ uninstall->connect("pressed", callable_mp(this, &ExportTemplateManager::_uninstall_template), varray(current_version));
} else {
- current->add_color_override("font_color", get_color("error_color", "Editor"));
+ current->add_theme_color_override("font_color", current->get_theme_color("error_color", "Editor"));
Button *redownload = memnew(Button);
redownload->set_text(TTR("Download"));
@@ -112,40 +110,38 @@ void ExportTemplateManager::_update_template_list() {
redownload->set_tooltip(TTR("Official export templates aren't available for development builds."));
}
- redownload->connect("pressed", this, "_download_template", varray(current_version));
+ redownload->connect("pressed", callable_mp(this, &ExportTemplateManager::_download_template), varray(current_version));
current_hb->add_child(redownload);
current->set_text(current_version + " " + TTR("(Missing)"));
}
for (Set<String>::Element *E = templates.back(); E; E = E->prev()) {
-
HBoxContainer *hbc = memnew(HBoxContainer);
Label *version = memnew(Label);
- version->set_modulate(get_color("disabled_font_color", "Editor"));
+ version->set_modulate(current->get_theme_color("disabled_font_color", "Editor"));
String text = E->get();
if (text == current_version) {
text += " " + TTR("(Current)");
}
version->set_text(text);
- version->set_h_size_flags(SIZE_EXPAND_FILL);
+ version->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hbc->add_child(version);
Button *uninstall = memnew(Button);
uninstall->set_text(TTR("Uninstall"));
hbc->add_child(uninstall);
- uninstall->connect("pressed", this, "_uninstall_template", varray(E->get()));
+ uninstall->connect("pressed", callable_mp(this, &ExportTemplateManager::_uninstall_template), varray(E->get()));
installed_vb->add_child(hbc);
}
}
void ExportTemplateManager::_download_template(const String &p_version) {
-
while (template_list->get_child_count()) {
memdelete(template_list->get_child(0));
}
- template_downloader->popup_centered_minsize();
+ template_downloader->popup_centered();
template_list_state->set_text(TTR("Retrieving mirrors, please wait..."));
template_download_progress->set_max(100);
template_download_progress->set_value(0);
@@ -155,14 +151,12 @@ void ExportTemplateManager::_download_template(const String &p_version) {
}
void ExportTemplateManager::_uninstall_template(const String &p_version) {
-
remove_confirm->set_text(vformat(TTR("Remove template version '%s'?"), p_version));
- remove_confirm->popup_centered_minsize();
+ remove_confirm->popup_centered();
to_remove = p_version;
}
void ExportTemplateManager::_uninstall_template_confirm() {
-
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
const String &templates_dir = EditorSettings::get_singleton()->get_templates_dir();
Error err = da->change_dir(templates_dir);
@@ -181,15 +175,13 @@ void ExportTemplateManager::_uninstall_template_confirm() {
}
bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_progress) {
-
// unzClose() will take care of closing the file stored in the unzFile,
// so we don't need to `memdelete(fa)` in this method.
- FileAccess *fa = NULL;
+ FileAccess *fa = nullptr;
zlib_filefunc_def io = zipio_create_io_from_file(&fa);
unzFile pkg = unzOpen2(p_file.utf8().get_data(), &io);
if (!pkg) {
-
EditorNode::get_singleton()->show_warning(TTR("Can't open export templates zip."));
return false;
}
@@ -200,15 +192,13 @@ bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_
String contents_dir;
while (ret == UNZ_OK) {
-
unz_file_info info;
char fname[16384];
- ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0);
+ ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0);
String file = fname;
if (file.ends_with("version.txt")) {
-
Vector<uint8_t> data;
data.resize(info.uncompressed_size);
@@ -258,7 +248,7 @@ bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_
ret = unzGoToFirstFile(pkg);
- EditorProgress *p = NULL;
+ EditorProgress *p = nullptr;
if (p_use_progress) {
p = memnew(EditorProgress("ltask", TTR("Extracting Export Templates"), fc));
}
@@ -266,11 +256,10 @@ bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_
fc = 0;
while (ret == UNZ_OK) {
-
//get filename
unz_file_info info;
char fname[16384];
- unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0);
+ unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0);
String file_path(String(fname).simplify_path());
@@ -340,18 +329,15 @@ bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_
}
void ExportTemplateManager::popup_manager() {
-
_update_template_list();
- popup_centered_minsize(Size2(400, 400) * EDSCALE);
+ popup_centered(Size2(400, 400) * EDSCALE);
}
void ExportTemplateManager::ok_pressed() {
-
- template_open->popup_centered_ratio();
+ template_open->popup_file_dialog();
}
-void ExportTemplateManager::_http_download_mirror_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data) {
-
+void ExportTemplateManager::_http_download_mirror_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data) {
if (p_status != HTTPRequest::RESULT_SUCCESS || p_code != 200) {
EditorNode::get_singleton()->show_warning(TTR("Error getting the list of mirrors."));
return;
@@ -359,8 +345,8 @@ void ExportTemplateManager::_http_download_mirror_completed(int p_status, int p_
String mirror_str;
{
- PoolByteArray::Read r = p_data.read();
- mirror_str.parse_utf8((const char *)r.ptr(), p_data.size());
+ const uint8_t *r = p_data.ptr();
+ mirror_str.parse_utf8((const char *)r, p_data.size());
}
template_list_state->hide();
@@ -385,7 +371,7 @@ void ExportTemplateManager::_http_download_mirror_completed(int p_status, int p_
ERR_CONTINUE(!m.has("url") || !m.has("name"));
LinkButton *lb = memnew(LinkButton);
lb->set_text(m["name"]);
- lb->connect("pressed", this, "_begin_template_download", varray(m["url"]));
+ lb->connect("pressed", callable_mp(this, &ExportTemplateManager::_begin_template_download), varray(m["url"]));
template_list->add_child(lb);
mirrors_found = true;
}
@@ -396,10 +382,9 @@ void ExportTemplateManager::_http_download_mirror_completed(int p_status, int p_
return;
}
}
-void ExportTemplateManager::_http_download_templates_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data) {
+void ExportTemplateManager::_http_download_templates_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data) {
switch (p_status) {
-
case HTTPRequest::RESULT_CANT_RESOLVE: {
template_list_state->set_text(TTR("Can't resolve."));
} break;
@@ -445,7 +430,6 @@ void ExportTemplateManager::_http_download_templates_completed(int p_status, int
}
void ExportTemplateManager::_begin_template_download(const String &p_url) {
-
if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
OS::get_singleton()->shell_open(p_url);
return;
@@ -482,9 +466,12 @@ void ExportTemplateManager::_window_template_downloader_closed() {
}
void ExportTemplateManager::_notification(int p_what) {
-
+ if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+ if (!is_visible()) {
+ set_process(false);
+ }
+ }
if (p_what == NOTIFICATION_PROCESS) {
-
update_countdown -= get_process_delta_time();
if (update_countdown > 0) {
@@ -499,18 +486,26 @@ void ExportTemplateManager::_notification(int p_what) {
status = TTR("Disconnected");
errored = true;
break;
- case HTTPClient::STATUS_RESOLVING: status = TTR("Resolving"); break;
+ case HTTPClient::STATUS_RESOLVING:
+ status = TTR("Resolving");
+ break;
case HTTPClient::STATUS_CANT_RESOLVE:
status = TTR("Can't Resolve");
errored = true;
break;
- case HTTPClient::STATUS_CONNECTING: status = TTR("Connecting..."); break;
+ case HTTPClient::STATUS_CONNECTING:
+ status = TTR("Connecting...");
+ break;
case HTTPClient::STATUS_CANT_CONNECT:
status = TTR("Can't Connect");
errored = true;
break;
- case HTTPClient::STATUS_CONNECTED: status = TTR("Connected"); break;
- case HTTPClient::STATUS_REQUESTING: status = TTR("Requesting..."); break;
+ case HTTPClient::STATUS_CONNECTED:
+ status = TTR("Connected");
+ break;
+ case HTTPClient::STATUS_REQUESTING:
+ status = TTR("Requesting...");
+ break;
case HTTPClient::STATUS_BODY:
status = TTR("Downloading");
if (download_templates->get_body_size() > 0) {
@@ -536,24 +531,14 @@ void ExportTemplateManager::_notification(int p_what) {
set_process(false);
}
}
-
- if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
- if (!is_visible_in_tree()) {
- set_process(false);
- }
- }
}
bool ExportTemplateManager::can_install_android_template() {
-
const String templates_dir = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG);
- return FileAccess::exists(templates_dir.plus_file("android_source.zip")) &&
- FileAccess::exists(templates_dir.plus_file("android_release.apk")) &&
- FileAccess::exists(templates_dir.plus_file("android_debug.apk"));
+ return FileAccess::exists(templates_dir.plus_file("android_source.zip"));
}
Error ExportTemplateManager::install_android_template() {
-
// To support custom Android builds, we install the Java source code and buildsystem
// from android_source.zip to the project's res://android folder.
@@ -563,13 +548,6 @@ Error ExportTemplateManager::install_android_template() {
// Make res://android dir (if it does not exist).
da->make_dir("android");
{
- // Add an empty .gdignore file to avoid scan.
- FileAccessRef f = FileAccess::open("res://android/.gdignore", FileAccess::WRITE);
- ERR_FAIL_COND_V(!f, ERR_CANT_CREATE);
- f->store_line("");
- f->close();
- }
- {
// Add version, to ensure building won't work if template and Godot version don't match.
FileAccessRef f = FileAccess::open("res://android/.build_version", FileAccess::WRITE);
ERR_FAIL_COND_V(!f, ERR_CANT_CREATE);
@@ -577,8 +555,19 @@ Error ExportTemplateManager::install_android_template() {
f->close();
}
- Error err = da->make_dir_recursive("android/build");
+ // Create the android plugins directory.
+ Error err = da->make_dir_recursive("android/plugins");
+ ERR_FAIL_COND_V(err != OK, err);
+
+ err = da->make_dir_recursive("android/build");
ERR_FAIL_COND_V(err != OK, err);
+ {
+ // Add an empty .gdignore file to avoid scan.
+ FileAccessRef f = FileAccess::open("res://android/build/.gdignore", FileAccess::WRITE);
+ ERR_FAIL_COND_V(!f, ERR_CANT_CREATE);
+ f->store_line("");
+ f->close();
+ }
// Uncompress source template.
@@ -586,7 +575,7 @@ Error ExportTemplateManager::install_android_template() {
const String &source_zip = templates_path.plus_file("android_source.zip");
ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN);
- FileAccess *src_f = NULL;
+ FileAccess *src_f = nullptr;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
unzFile pkg = unzOpen2(source_zip.utf8().get_data(), &io);
@@ -606,11 +595,10 @@ Error ExportTemplateManager::install_android_template() {
Set<String> dirs_tested;
int idx = 0;
while (ret == UNZ_OK) {
-
// Get file path.
unz_file_info info;
char fpath[16384];
- ret = unzGetCurrentFileInfo(pkg, &info, fpath, 16384, NULL, 0, NULL, 0);
+ ret = unzGetCurrentFileInfo(pkg, &info, fpath, 16384, nullptr, 0, nullptr, 0);
String path = fpath;
String base_dir = path.get_base_dir();
@@ -638,7 +626,7 @@ Error ExportTemplateManager::install_android_template() {
FileAccess::set_unix_permissions(to_write, (info.external_fa >> 16) & 0x01FF);
#endif
} else {
- ERR_PRINTS("Can't uncompress file: " + to_write);
+ ERR_PRINT("Can't uncompress file: " + to_write);
}
}
@@ -655,19 +643,9 @@ Error ExportTemplateManager::install_android_template() {
}
void ExportTemplateManager::_bind_methods() {
-
- ClassDB::bind_method("_download_template", &ExportTemplateManager::_download_template);
- ClassDB::bind_method("_uninstall_template", &ExportTemplateManager::_uninstall_template);
- ClassDB::bind_method("_uninstall_template_confirm", &ExportTemplateManager::_uninstall_template_confirm);
- ClassDB::bind_method("_install_from_file", &ExportTemplateManager::_install_from_file);
- ClassDB::bind_method("_http_download_mirror_completed", &ExportTemplateManager::_http_download_mirror_completed);
- ClassDB::bind_method("_http_download_templates_completed", &ExportTemplateManager::_http_download_templates_completed);
- ClassDB::bind_method("_begin_template_download", &ExportTemplateManager::_begin_template_download);
- ClassDB::bind_method("_window_template_downloader_closed", &ExportTemplateManager::_window_template_downloader_closed);
}
ExportTemplateManager::ExportTemplateManager() {
-
VBoxContainer *main_vb = memnew(VBoxContainer);
add_child(main_vb);
@@ -681,7 +659,7 @@ ExportTemplateManager::ExportTemplateManager() {
installed_scroll->add_child(installed_vb);
installed_scroll->set_enable_v_scroll(true);
installed_scroll->set_enable_h_scroll(false);
- installed_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ installed_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
get_cancel()->set_text(TTR("Close"));
get_ok()->set_text(TTR("Install From File"));
@@ -689,14 +667,14 @@ ExportTemplateManager::ExportTemplateManager() {
remove_confirm = memnew(ConfirmationDialog);
remove_confirm->set_title(TTR("Remove Template"));
add_child(remove_confirm);
- remove_confirm->connect("confirmed", this, "_uninstall_template_confirm");
+ remove_confirm->connect("confirmed", callable_mp(this, &ExportTemplateManager::_uninstall_template_confirm));
template_open = memnew(FileDialog);
template_open->set_title(TTR("Select Template File"));
template_open->add_filter("*.tpz ; " + TTR("Godot Export Templates"));
template_open->set_access(FileDialog::ACCESS_FILESYSTEM);
- template_open->set_mode(FileDialog::MODE_OPEN_FILE);
- template_open->connect("file_selected", this, "_install_from_file", varray(true));
+ template_open->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE);
+ template_open->connect("file_selected", callable_mp(this, &ExportTemplateManager::_install_from_file), varray(true));
add_child(template_open);
set_title(TTR("Export Template Manager"));
@@ -704,18 +682,18 @@ ExportTemplateManager::ExportTemplateManager() {
request_mirror = memnew(HTTPRequest);
add_child(request_mirror);
- request_mirror->connect("request_completed", this, "_http_download_mirror_completed");
+ request_mirror->connect("request_completed", callable_mp(this, &ExportTemplateManager::_http_download_mirror_completed));
download_templates = memnew(HTTPRequest);
add_child(download_templates);
- download_templates->connect("request_completed", this, "_http_download_templates_completed");
+ download_templates->connect("request_completed", callable_mp(this, &ExportTemplateManager::_http_download_templates_completed));
template_downloader = memnew(AcceptDialog);
template_downloader->set_title(TTR("Download Templates"));
template_downloader->get_ok()->set_text(TTR("Close"));
template_downloader->set_exclusive(true);
add_child(template_downloader);
- template_downloader->connect("popup_hide", this, "_window_template_downloader_closed");
+ template_downloader->connect("cancelled", callable_mp(this, &ExportTemplateManager::_window_template_downloader_closed));
VBoxContainer *vbc = memnew(VBoxContainer);
template_downloader->add_child(vbc);
diff --git a/editor/export_template_manager.h b/editor/export_template_manager.h
index 96e61a6569..3d527f2338 100644
--- a/editor/export_template_manager.h
+++ b/editor/export_template_manager.h
@@ -69,11 +69,11 @@ class ExportTemplateManager : public ConfirmationDialog {
void _uninstall_template(const String &p_version);
void _uninstall_template_confirm();
- virtual void ok_pressed();
+ virtual void ok_pressed() override;
bool _install_from_file(const String &p_file, bool p_use_progress = true);
- void _http_download_mirror_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
- void _http_download_templates_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
+ void _http_download_mirror_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data);
+ void _http_download_templates_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data);
void _begin_template_download(const String &p_url);
diff --git a/editor/file_type_cache.cpp b/editor/file_type_cache.cpp
deleted file mode 100644
index 52ab80cc48..0000000000
--- a/editor/file_type_cache.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*************************************************************************/
-/* file_type_cache.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "file_type_cache.h"
-
-#include "core/os/file_access.h"
-#include "core/project_settings.h"
-
-FileTypeCache *FileTypeCache::singleton = NULL;
-
-bool FileTypeCache::has_file(const String &p_path) const {
-
- GLOBAL_LOCK_FUNCTION
- return file_type_map.has(p_path);
-}
-
-String FileTypeCache::get_file_type(const String &p_path) const {
-
- GLOBAL_LOCK_FUNCTION
- ERR_FAIL_COND_V(!file_type_map.has(p_path), "");
- return file_type_map[p_path];
-}
-void FileTypeCache::set_file_type(const String &p_path, const String &p_type) {
-
- GLOBAL_LOCK_FUNCTION
- file_type_map[p_path] = p_type;
-}
-
-void FileTypeCache::load() {
-
- GLOBAL_LOCK_FUNCTION
- String project = ProjectSettings::get_singleton()->get_resource_path();
- FileAccess *f = FileAccess::open(project + "/file_type_cache.cch", FileAccess::READ);
-
- if (!f) {
-
- WARN_PRINT("Can't open file_type_cache.cch.");
- return;
- }
-
- file_type_map.clear();
- while (!f->eof_reached()) {
-
- String path = f->get_line();
- if (f->eof_reached())
- break;
- String type = f->get_line();
- set_file_type(path, type);
- }
-
- memdelete(f);
-}
-
-void FileTypeCache::save() {
-
- GLOBAL_LOCK_FUNCTION
- String project = ProjectSettings::get_singleton()->get_resource_path();
- FileAccess *f = FileAccess::open(project + "/file_type_cache.cch", FileAccess::WRITE);
-
- ERR_FAIL_COND_MSG(!f, "Can't open file_type_cache.cch for writing, not saving file type cache!");
-
- const String *K = NULL;
-
- while ((K = file_type_map.next(K))) {
-
- f->store_line(*K);
- f->store_line(file_type_map[*K]);
- }
-
- memdelete(f);
-}
-
-FileTypeCache::FileTypeCache() {
-
- ERR_FAIL_COND_MSG(singleton, "FileTypeCache singleton already exist.");
- singleton = this;
-}
diff --git a/editor/file_type_cache.h b/editor/file_type_cache.h
deleted file mode 100644
index 216effea00..0000000000
--- a/editor/file_type_cache.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*************************************************************************/
-/* file_type_cache.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef FILE_TYPE_CACHE_H
-#define FILE_TYPE_CACHE_H
-
-#include "core/object.h"
-
-class FileTypeCache : Object {
-
- GDCLASS(FileTypeCache, Object);
-
- HashMap<String, String> file_type_map;
-
- static FileTypeCache *singleton;
-
-public:
- static FileTypeCache *get_singleton() { return singleton; }
-
- bool has_file(const String &p_path) const;
- String get_file_type(const String &p_path) const;
- void set_file_type(const String &p_path, const String &p_type);
-
- void load();
- void save();
-
- FileTypeCache();
-};
-
-#endif // FILE_TYPE_CACHE_H
diff --git a/editor/fileserver/SCsub b/editor/fileserver/SCsub
index 2b1e889fb0..359d04e5df 100644
--- a/editor/fileserver/SCsub
+++ b/editor/fileserver/SCsub
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-Import('env')
+Import("env")
env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/fileserver/editor_file_server.cpp b/editor/fileserver/editor_file_server.cpp
index af7eb0c4c7..7e05bc5d88 100644
--- a/editor/fileserver/editor_file_server.cpp
+++ b/editor/fileserver/editor_file_server.cpp
@@ -40,11 +40,11 @@
#define DEBUG_TIME(m_what)
void EditorFileServer::_close_client(ClientData *cd) {
-
cd->connection->disconnect_from_host();
- cd->efs->wait_mutex->lock();
- cd->efs->to_wait.insert(cd->thread);
- cd->efs->wait_mutex->unlock();
+ {
+ MutexLock lock(cd->efs->wait_mutex);
+ cd->efs->to_wait.insert(cd->thread);
+ }
while (cd->files.size()) {
memdelete(cd->files.front()->get());
cd->files.erase(cd->files.front());
@@ -53,7 +53,6 @@ void EditorFileServer::_close_client(ClientData *cd) {
}
void EditorFileServer::_subthread_start(void *s) {
-
ClientData *cd = (ClientData *)s;
cd->connection->set_no_delay(true);
@@ -67,11 +66,9 @@ void EditorFileServer::_subthread_start(void *s) {
int passlen = decode_uint32(buf4);
if (passlen > 512) {
-
_close_client(cd);
ERR_FAIL_COND(passlen > 512);
} else if (passlen > 0) {
-
Vector<char> passutf8;
passutf8.resize(passlen + 1);
err = cd->connection->get_data((uint8_t *)passutf8.ptr(), passlen);
@@ -105,7 +102,6 @@ void EditorFileServer::_subthread_start(void *s) {
cd->connection->put_data(buf4, 4);
while (!cd->quit) {
-
//wait for ID
err = cd->connection->get_data(buf4, 4);
DEBUG_TIME("get_data")
@@ -125,11 +121,9 @@ void EditorFileServer::_subthread_start(void *s) {
int cmd = decode_uint32(buf4);
switch (cmd) {
-
case FileAccessNetwork::COMMAND_FILE_EXISTS:
case FileAccessNetwork::COMMAND_GET_MODTIME:
case FileAccessNetwork::COMMAND_OPEN_FILE: {
-
DEBUG_TIME("open_file")
err = cd->connection->get_data(buf4, 4);
if (err != OK) {
@@ -160,14 +154,12 @@ void EditorFileServer::_subthread_start(void *s) {
}
if (!s2.begins_with("res://")) {
-
_close_client(cd);
ERR_FAIL_COND(!s2.begins_with("res://"));
}
ERR_CONTINUE(cd->files.has(id));
if (cmd == FileAccessNetwork::COMMAND_FILE_EXISTS) {
-
encode_uint32(id, buf4);
cd->connection->put_data(buf4, 4);
encode_uint32(FileAccessNetwork::RESPONSE_FILE_EXISTS, buf4);
@@ -179,7 +171,6 @@ void EditorFileServer::_subthread_start(void *s) {
}
if (cmd == FileAccessNetwork::COMMAND_GET_MODTIME) {
-
encode_uint32(id, buf4);
cd->connection->put_data(buf4, 4);
encode_uint32(FileAccessNetwork::RESPONSE_GET_MODTIME, buf4);
@@ -217,7 +208,6 @@ void EditorFileServer::_subthread_start(void *s) {
} break;
case FileAccessNetwork::COMMAND_READ_BLOCK: {
-
err = cd->connection->get_data(buf4, 8);
if (err != OK) {
_close_client(cd);
@@ -258,7 +248,6 @@ void EditorFileServer::_subthread_start(void *s) {
} break;
case FileAccessNetwork::COMMAND_CLOSE: {
-
print_verbose("CLOSED");
ERR_CONTINUE(!cd->files.has(id));
memdelete(cd->files[id]);
@@ -271,10 +260,8 @@ void EditorFileServer::_subthread_start(void *s) {
}
void EditorFileServer::_thread_start(void *s) {
-
EditorFileServer *self = (EditorFileServer *)s;
while (!self->quit) {
-
if (self->cmd == CMD_ACTIVATE) {
self->server->listen(self->port);
self->active = true;
@@ -295,23 +282,22 @@ void EditorFileServer::_thread_start(void *s) {
}
}
- self->wait_mutex->lock();
+ self->wait_mutex.lock();
while (self->to_wait.size()) {
Thread *w = self->to_wait.front()->get();
self->to_wait.erase(w);
- self->wait_mutex->unlock();
+ self->wait_mutex.unlock();
Thread::wait_to_finish(w);
memdelete(w);
- self->wait_mutex->lock();
+ self->wait_mutex.lock();
}
- self->wait_mutex->unlock();
+ self->wait_mutex.unlock();
OS::get_singleton()->delay_usec(100000);
}
}
void EditorFileServer::start() {
-
stop();
port = EDITOR_DEF("filesystem/file_server/port", 6010);
password = EDITOR_DEF("filesystem/file_server/password", "");
@@ -319,19 +305,15 @@ void EditorFileServer::start() {
}
bool EditorFileServer::is_active() const {
-
return active;
}
void EditorFileServer::stop() {
-
cmd = CMD_STOP;
}
EditorFileServer::EditorFileServer() {
-
server.instance();
- wait_mutex = Mutex::create();
quit = false;
active = false;
cmd = CMD_NONE;
@@ -342,9 +324,7 @@ EditorFileServer::EditorFileServer() {
}
EditorFileServer::~EditorFileServer() {
-
quit = true;
Thread::wait_to_finish(thread);
memdelete(thread);
- memdelete(wait_mutex);
}
diff --git a/editor/fileserver/editor_file_server.h b/editor/fileserver/editor_file_server.h
index 4ce4c0cda6..9645fbf39e 100644
--- a/editor/fileserver/editor_file_server.h
+++ b/editor/fileserver/editor_file_server.h
@@ -38,7 +38,6 @@
#include "core/os/thread.h"
class EditorFileServer : public Object {
-
GDCLASS(EditorFileServer, Object);
enum Command {
@@ -48,7 +47,6 @@ class EditorFileServer : public Object {
};
struct ClientData {
-
Thread *thread;
Ref<StreamPeerTCP> connection;
Map<int, FileAccess *> files;
@@ -62,7 +60,7 @@ class EditorFileServer : public Object {
static void _close_client(ClientData *cd);
static void _subthread_start(void *s);
- Mutex *wait_mutex;
+ Mutex wait_mutex;
Thread *thread;
static void _thread_start(void *);
bool quit;
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index 62effb406d..0071f169ac 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -42,16 +42,17 @@
#include "editor_scale.h"
#include "editor_settings.h"
#include "import_dock.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/resources/packed_scene.h"
+#include "servers/display_server.h"
-Ref<Texture> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx) {
- Ref<Texture> file_icon;
+Ref<Texture2D> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx) {
+ Ref<Texture2D> file_icon;
if (!p_dir->get_file_import_is_valid(p_idx)) {
- file_icon = get_icon("ImportFail", "EditorIcons");
+ file_icon = get_theme_icon("ImportFail", "EditorIcons");
} else {
String file_type = p_dir->get_file_type(p_idx);
- file_icon = (has_icon(file_type, "EditorIcons")) ? get_icon(file_type, "EditorIcons") : get_icon("File", "EditorIcons");
+ file_icon = (has_theme_icon(file_type, "EditorIcons")) ? get_theme_icon(file_type, "EditorIcons") : get_theme_icon("File", "EditorIcons");
}
return file_icon;
}
@@ -62,12 +63,13 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
// Create a tree item for the subdirectory.
TreeItem *subdirectory_item = tree->create_item(p_parent);
String dname = p_dir->get_name();
- if (dname == "")
+ if (dname == "") {
dname = "res://";
+ }
subdirectory_item->set_text(0, dname);
- subdirectory_item->set_icon(0, get_icon("Folder", "EditorIcons"));
- subdirectory_item->set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog"));
+ subdirectory_item->set_icon(0, get_theme_icon("Folder", "EditorIcons"));
+ subdirectory_item->set_icon_modulate(0, get_theme_color("folder_icon_modulate", "FileDialog"));
subdirectory_item->set_selectable(0, true);
String lpath = p_dir->get_path();
subdirectory_item->set_metadata(0, lpath);
@@ -85,14 +87,14 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
}
// Create items for all subdirectories.
- for (int i = 0; i < p_dir->get_subdir_count(); i++)
+ for (int i = 0; i < p_dir->get_subdir_count(); i++) {
parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths, p_select_in_favorites, p_unfold_path) || parent_should_expand);
+ }
// Create all items for the files in the subdirectory.
if (display_mode == DISPLAY_MODE_TREE_ONLY) {
String main_scene = ProjectSettings::get_singleton()->get("application/run/main_scene");
for (int i = 0; i < p_dir->get_file_count(); i++) {
-
String file_type = p_dir->get_file_type(i);
if (_is_file_type_disabled_by_feature_profile(file_type)) {
@@ -121,7 +123,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
file_item->set_as_cursor(0);
}
if (main_scene == file_metadata) {
- file_item->set_custom_color(0, get_color("accent_color", "Editor"));
+ file_item->set_custom_color(0, get_theme_color("accent_color", "Editor"));
}
Array udata;
udata.push_back(tree_update_id);
@@ -187,7 +189,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
// Handles the favorites.
TreeItem *favorites = tree->create_item(root);
- favorites->set_icon(0, get_icon("Favorites", "EditorIcons"));
+ favorites->set_icon(0, get_theme_icon("Favorites", "EditorIcons"));
favorites->set_text(0, TTR("Favorites:"));
favorites->set_metadata(0, "Favorites");
favorites->set_collapsed(p_uncollapsed_paths.find("Favorites") < 0);
@@ -195,14 +197,15 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
Vector<String> favorite_paths = EditorSettings::get_singleton()->get_favorites();
for (int i = 0; i < favorite_paths.size(); i++) {
String fave = favorite_paths[i];
- if (!fave.begins_with("res://"))
+ if (!fave.begins_with("res://")) {
continue;
+ }
- Ref<Texture> folder_icon = get_icon("Folder", "EditorIcons");
- const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
+ Ref<Texture2D> folder_icon = get_theme_icon("Folder", "EditorIcons");
+ const Color folder_color = get_theme_color("folder_icon_modulate", "FileDialog");
String text;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
Color color;
if (fave == "res://") {
text = "/";
@@ -219,7 +222,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
if (dir) {
icon = _get_tree_item_icon(dir, index);
} else {
- icon = get_icon("File", "EditorIcons");
+ icon = get_theme_icon("File", "EditorIcons");
}
color = Color(1, 1, 1);
}
@@ -297,33 +300,35 @@ void FileSystemDock::_update_display_mode(bool p_force) {
void FileSystemDock::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- if (initialized)
+ if (initialized) {
return;
+ }
initialized = true;
- EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", this, "_feature_profile_changed");
+ EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &FileSystemDock::_feature_profile_changed));
- EditorFileSystem::get_singleton()->connect("filesystem_changed", this, "_fs_changed");
- EditorResourcePreview::get_singleton()->connect("preview_invalidated", this, "_preview_invalidated");
+ EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &FileSystemDock::_fs_changed));
+ EditorResourcePreview::get_singleton()->connect("preview_invalidated", callable_mp(this, &FileSystemDock::_preview_invalidated));
String ei = "EditorIcons";
- button_reload->set_icon(get_icon("Reload", ei));
- button_toggle_display_mode->set_icon(get_icon("Panels2", ei));
- button_file_list_display_mode->connect("pressed", this, "_toggle_file_display");
-
- files->connect("item_activated", this, "_file_list_activate_file");
- button_hist_next->connect("pressed", this, "_fw_history");
- button_hist_prev->connect("pressed", this, "_bw_history");
- tree_search_box->set_right_icon(get_icon("Search", ei));
+
+ button_reload->set_icon(get_theme_icon("Reload", ei));
+ button_toggle_display_mode->set_icon(get_theme_icon("Panels2", ei));
+ button_file_list_display_mode->connect("pressed", callable_mp(this, &FileSystemDock::_toggle_file_display));
+
+ files->connect("item_activated", callable_mp(this, &FileSystemDock::_file_list_activate_file));
+ button_hist_next->connect("pressed", callable_mp(this, &FileSystemDock::_fw_history));
+ button_hist_prev->connect("pressed", callable_mp(this, &FileSystemDock::_bw_history));
+ tree_search_box->set_right_icon(get_theme_icon("Search", ei));
tree_search_box->set_clear_button_enabled(true);
- file_list_search_box->set_right_icon(get_icon("Search", ei));
+ file_list_search_box->set_right_icon(get_theme_icon("Search", ei));
file_list_search_box->set_clear_button_enabled(true);
- button_hist_next->set_icon(get_icon("Forward", ei));
- button_hist_prev->set_icon(get_icon("Back", ei));
- file_list_popup->connect("id_pressed", this, "_file_list_rmb_option");
- tree_popup->connect("id_pressed", this, "_tree_rmb_option");
+ button_hist_next->set_icon(get_theme_icon("Forward", ei));
+ button_hist_prev->set_icon(get_theme_icon("Back", ei));
+ file_list_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_file_list_rmb_option));
+ tree_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_tree_rmb_option));
- current_path->connect("text_entered", this, "_navigate_to_path");
+ current_path->connect("text_entered", callable_mp(this, &FileSystemDock::_navigate_to_path), make_binds(false));
always_show_folders = bool(EditorSettings::get_singleton()->get("docks/filesystem/always_show_folders"));
@@ -348,8 +353,9 @@ void FileSystemDock::_notification(int p_what) {
Dictionary dd = get_viewport()->gui_get_drag_data();
if (tree->is_visible_in_tree() && dd.has("type")) {
if (dd.has("favorite")) {
- if ((String(dd["favorite"]) == "all"))
+ if ((String(dd["favorite"]) == "all")) {
tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
+ }
} else if ((String(dd["type"]) == "files") || (String(dd["type"]) == "files_and_dirs") || (String(dd["type"]) == "resource")) {
tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM | Tree::DROP_MODE_INBETWEEN);
}
@@ -369,19 +375,19 @@ void FileSystemDock::_notification(int p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
// Update icons.
String ei = "EditorIcons";
- button_reload->set_icon(get_icon("Reload", ei));
- button_toggle_display_mode->set_icon(get_icon("Panels2", ei));
- button_hist_next->set_icon(get_icon("Forward", ei));
- button_hist_prev->set_icon(get_icon("Back", ei));
+ button_reload->set_icon(get_theme_icon("Reload", ei));
+ button_toggle_display_mode->set_icon(get_theme_icon("Panels2", ei));
+ button_hist_next->set_icon(get_theme_icon("Forward", ei));
+ button_hist_prev->set_icon(get_theme_icon("Back", ei));
if (file_list_display_mode == FILE_LIST_DISPLAY_LIST) {
- button_file_list_display_mode->set_icon(get_icon("FileThumbnail", "EditorIcons"));
+ button_file_list_display_mode->set_icon(get_theme_icon("FileThumbnail", "EditorIcons"));
} else {
- button_file_list_display_mode->set_icon(get_icon("FileList", "EditorIcons"));
+ button_file_list_display_mode->set_icon(get_theme_icon("FileList", "EditorIcons"));
}
- tree_search_box->set_right_icon(get_icon("Search", ei));
+ tree_search_box->set_right_icon(get_theme_icon("Search", ei));
tree_search_box->set_clear_button_enabled(true);
- file_list_search_box->set_right_icon(get_icon("Search", ei));
+ file_list_search_box->set_right_icon(get_theme_icon("Search", ei));
file_list_search_box->set_clear_button_enabled(true);
// Update always show folders.
@@ -403,13 +409,15 @@ void FileSystemDock::_tree_multi_selected(Object *p_item, int p_column, bool p_s
call_deferred("_update_import_dock");
// Return if we don't select something new.
- if (!p_selected)
+ if (!p_selected) {
return;
+ }
// Tree item selected.
TreeItem *selected = tree->get_selected();
- if (!selected)
+ if (!selected) {
return;
+ }
TreeItem *favorites_item = tree->get_root()->get_children();
if (selected->get_parent() == favorites_item && !String(selected->get_metadata(0)).ends_with("/")) {
@@ -431,10 +439,11 @@ void FileSystemDock::_tree_multi_selected(Object *p_item, int p_column, bool p_s
}
String FileSystemDock::get_selected_path() const {
- if (path.ends_with("/"))
+ if (path.ends_with("/")) {
return path;
- else
+ } else {
return path.get_base_dir();
+ }
}
String FileSystemDock::get_current_path() const {
@@ -496,15 +505,16 @@ void FileSystemDock::navigate_to_path(const String &p_path) {
_navigate_to_path(p_path);
}
-void FileSystemDock::_file_list_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata) {
+void FileSystemDock::_file_list_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata) {
if ((file_list_vb->is_visible_in_tree() || path == p_path.get_base_dir()) && p_preview.is_valid()) {
Array uarr = p_udata;
int idx = uarr[0];
String file = uarr[1];
if (idx < files->get_item_count() && files->get_item_text(idx) == file && files->get_item_metadata(idx) == p_path) {
if (file_list_display_mode == FILE_LIST_DISPLAY_LIST) {
- if (p_small_preview.is_valid())
+ if (p_small_preview.is_valid()) {
files->set_item_icon(idx, p_small_preview);
+ }
} else {
files->set_item_icon(idx, p_preview);
}
@@ -512,7 +522,7 @@ void FileSystemDock::_file_list_thumbnail_done(const String &p_path, const Ref<T
}
}
-void FileSystemDock::_tree_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata) {
+void FileSystemDock::_tree_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata) {
if (p_small_preview.is_valid()) {
Array uarr = p_udata;
if (tree_update_id == (int)uarr[0]) {
@@ -532,11 +542,11 @@ void FileSystemDock::_toggle_file_display() {
void FileSystemDock::_set_file_display(bool p_active) {
if (p_active) {
file_list_display_mode = FILE_LIST_DISPLAY_LIST;
- button_file_list_display_mode->set_icon(get_icon("FileThumbnail", "EditorIcons"));
+ button_file_list_display_mode->set_icon(get_theme_icon("FileThumbnail", "EditorIcons"));
button_file_list_display_mode->set_tooltip(TTR("View items as a grid of thumbnails."));
} else {
file_list_display_mode = FILE_LIST_DISPLAY_THUMBNAILS;
- button_file_list_display_mode->set_icon(get_icon("FileList", "EditorIcons"));
+ button_file_list_display_mode->set_icon(get_theme_icon("FileList", "EditorIcons"));
button_file_list_display_mode->set_tooltip(TTR("View items as a list."));
}
@@ -552,7 +562,6 @@ bool FileSystemDock::_is_file_type_disabled_by_feature_profile(const StringName
StringName class_name = p_class;
while (class_name != StringName()) {
-
if (profile->is_class_disabled(class_name)) {
return true;
}
@@ -563,8 +572,9 @@ bool FileSystemDock::_is_file_type_disabled_by_feature_profile(const StringName
}
void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> *matches, int p_max_items) {
- if (matches->size() > p_max_items)
+ if (matches->size() > p_max_items) {
return;
+ }
for (int i = 0; i < p_path->get_subdir_count(); i++) {
_search(p_path->get_subdir(i), matches, p_max_items);
@@ -574,7 +584,6 @@ void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> *
String file = p_path->get_file(i);
if (file.to_lower().find(searched_string) != -1) {
-
FileInfo fi;
fi.name = file;
fi.type = p_path->get_file_type(i);
@@ -587,8 +596,9 @@ void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> *
}
matches->push_back(fi);
- if (matches->size() > p_max_items)
+ if (matches->size() > p_max_items) {
return;
+ }
}
}
}
@@ -598,8 +608,9 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
Set<String> cselection;
if (p_keep_selection) {
for (int i = 0; i < files->get_item_count(); i++) {
- if (files->is_selected(i))
+ if (files->is_selected(i)) {
cselection.insert(files->get_item_text(i));
+ }
}
}
@@ -613,9 +624,9 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
String ei = "EditorIcons";
int thumbnail_size = EditorSettings::get_singleton()->get("docks/filesystem/thumbnail_size");
thumbnail_size *= EDSCALE;
- Ref<Texture> folder_thumbnail;
- Ref<Texture> file_thumbnail;
- Ref<Texture> file_thumbnail_broken;
+ Ref<Texture2D> folder_thumbnail;
+ Ref<Texture2D> file_thumbnail;
+ Ref<Texture2D> file_thumbnail_broken;
bool use_thumbnails = (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS);
@@ -628,13 +639,13 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
files->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size));
if (thumbnail_size < 64) {
- folder_thumbnail = get_icon("FolderMediumThumb", ei);
- file_thumbnail = get_icon("FileMediumThumb", ei);
- file_thumbnail_broken = get_icon("FileDeadMediumThumb", ei);
+ folder_thumbnail = get_theme_icon("FolderMediumThumb", ei);
+ file_thumbnail = get_theme_icon("FileMediumThumb", ei);
+ file_thumbnail_broken = get_theme_icon("FileDeadMediumThumb", ei);
} else {
- folder_thumbnail = get_icon("FolderBigThumb", ei);
- file_thumbnail = get_icon("FileBigThumb", ei);
- file_thumbnail_broken = get_icon("FileDeadBigThumb", ei);
+ folder_thumbnail = get_theme_icon("FolderBigThumb", ei);
+ file_thumbnail = get_theme_icon("FileBigThumb", ei);
+ file_thumbnail_broken = get_theme_icon("FileDeadBigThumb", ei);
}
} else {
// No thumbnails.
@@ -645,8 +656,8 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
files->set_fixed_icon_size(Size2());
}
- Ref<Texture> folder_icon = (use_thumbnails) ? folder_thumbnail : get_icon("folder", "FileDialog");
- const Color folder_color = get_color("folder_icon_modulate", "FileDialog");
+ Ref<Texture2D> folder_icon = (use_thumbnails) ? folder_thumbnail : get_theme_icon("folder", "FileDialog");
+ const Color folder_color = get_theme_color("folder_icon_modulate", "FileDialog");
// Build the FileInfo list.
List<FileInfo> filelist;
@@ -656,7 +667,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
for (int i = 0; i < favorites.size(); i++) {
String favorite = favorites[i];
String text;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
if (favorite == "res://") {
text = "/";
icon = folder_icon;
@@ -702,8 +713,9 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
file = path.get_file();
efd = EditorFileSystem::get_singleton()->get_filesystem_path(directory);
}
- if (!efd)
+ if (!efd) {
return;
+ }
if (searched_string.length() > 0) {
// Display the search results.
@@ -715,8 +727,9 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
files->add_item("..", folder_icon, true);
String bd = directory.get_base_dir();
- if (bd != "res://" && !bd.ends_with("/"))
+ if (bd != "res://" && !bd.ends_with("/")) {
bd += "/";
+ }
files->set_item_metadata(files->get_item_count() - 1, bd);
files->set_item_selectable(files->get_item_count() - 1, false);
@@ -759,17 +772,17 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
String fpath = finfo->path;
String ftype = finfo->type;
- Ref<Texture> type_icon;
- Ref<Texture> big_icon;
+ Ref<Texture2D> type_icon;
+ Ref<Texture2D> big_icon;
String tooltip = fpath;
// Select the icons.
if (!finfo->import_broken) {
- type_icon = (has_icon(ftype, ei)) ? get_icon(ftype, ei) : get_icon(oi, ei);
+ type_icon = (has_theme_icon(ftype, ei)) ? get_theme_icon(ftype, ei) : get_theme_icon(oi, ei);
big_icon = file_thumbnail;
} else {
- type_icon = get_icon("ImportFail", ei);
+ type_icon = get_theme_icon("ImportFail", ei);
big_icon = file_thumbnail_broken;
tooltip += "\n" + TTR("Status: Import of file failed. Please fix file and reimport manually.");
}
@@ -789,7 +802,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
}
if (fpath == main_scene) {
- files->set_item_custom_fg_color(item_index, get_color("accent_color", "Editor"));
+ files->set_item_custom_fg_color(item_index, get_theme_color("accent_color", "Editor"));
}
// Generate the preview.
@@ -802,8 +815,9 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
}
// Select the items.
- if (cselection.has(fname))
+ if (cselection.has(fname)) {
files->select(item_index, false);
+ }
if (!p_keep_selection && file != "" && fname == file) {
files->select(item_index, true);
@@ -841,7 +855,7 @@ void FileSystemDock::_tree_activate_file() {
if (selected) {
String path = selected->get_metadata(0);
TreeItem *parent = selected->get_parent();
- bool is_favorite = parent != NULL && parent->get_metadata(0) == "Favorites";
+ bool is_favorite = parent != nullptr && parent->get_metadata(0) == "Favorites";
if ((!is_favorite && path.ends_with("/")) || path == "Favorites") {
bool collapsed = selected->is_collapsed();
@@ -858,9 +872,7 @@ void FileSystemDock::_file_list_activate_file(int p_idx) {
void FileSystemDock::_preview_invalidated(const String &p_path) {
if (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS && p_path.get_base_dir() == path && searched_string.length() == 0 && file_list_vb->is_visible_in_tree()) {
-
for (int i = 0; i < files->get_item_count(); i++) {
-
if (files->get_item_metadata(i) == p_path) {
// Re-request preview.
Array udata;
@@ -905,15 +917,17 @@ void FileSystemDock::_set_scanning_mode() {
}
void FileSystemDock::_fw_history() {
- if (history_pos < history.size() - 1)
+ if (history_pos < history.size() - 1) {
history_pos++;
+ }
_update_history();
}
void FileSystemDock::_bw_history() {
- if (history_pos > 0)
+ if (history_pos > 0) {
history_pos--;
+ }
_update_history();
}
@@ -953,8 +967,9 @@ void FileSystemDock::_push_to_history() {
}
void FileSystemDock::_get_all_items_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files, Vector<String> &folders) const {
- if (efsd == NULL)
+ if (efsd == nullptr) {
return;
+ }
for (int i = 0; i < efsd->get_subdir_count(); i++) {
folders.push_back(efsd->get_subdir(i)->get_path());
@@ -1085,10 +1100,10 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin
void FileSystemDock::_update_resource_paths_after_move(const Map<String, String> &p_renames) const {
// Rename all resources loaded, be it subresources or actual resources.
- List<Ref<Resource> > cached;
+ List<Ref<Resource>> cached;
ResourceCache::get_cached_resources(&cached);
- for (List<Ref<Resource> >::Element *E = cached.front(); E; E = E->next()) {
+ for (List<Ref<Resource>>::Element *E = cached.front(); E; E = E->next()) {
Ref<Resource> r = E->get();
String base_path = r->get_path();
@@ -1109,8 +1124,9 @@ void FileSystemDock::_update_resource_paths_after_move(const Map<String, String>
for (int i = 0; i < EditorNode::get_editor_data().get_edited_scene_count(); i++) {
String path;
if (i == EditorNode::get_editor_data().get_edited_scene()) {
- if (!get_tree()->get_edited_scene_root())
+ if (!get_tree()->get_edited_scene_root()) {
continue;
+ }
path = get_tree()->get_edited_scene_root()->get_filename();
} else {
@@ -1141,8 +1157,9 @@ void FileSystemDock::_update_dependencies_after_move(const Map<String, String> &
print_verbose("Remapping dependencies for: " + file);
Error err = ResourceLoader::rename_dependencies(file, p_renames);
if (err == OK) {
- if (ResourceLoader::get_resource_type(file) == "PackedScene")
+ if (ResourceLoader::get_resource_type(file) == "PackedScene") {
editor->reload_scene(file);
+ }
} else {
EditorNode::get_singleton()->add_io_error(TTR("Unable to update dependencies:") + "\n" + remaps[i] + "\n");
}
@@ -1270,8 +1287,9 @@ void FileSystemDock::_make_scene_confirm() {
break;
}
}
- if (!extension_correct)
+ if (!extension_correct) {
scene_name = scene_name.get_basename() + ".tscn";
+ }
scene_name = directory.plus_file(scene_name);
@@ -1287,12 +1305,12 @@ void FileSystemDock::_make_scene_confirm() {
editor->get_editor_data().set_scene_path(idx, scene_name);
}
-void FileSystemDock::_file_deleted(String p_file) {
- emit_signal("file_deleted", p_file);
+void FileSystemDock::_file_removed(String p_file) {
+ emit_signal("file_removed", p_file);
}
-void FileSystemDock::_folder_deleted(String p_folder) {
- emit_signal("folder_deleted", p_folder);
+void FileSystemDock::_folder_removed(String p_folder) {
+ emit_signal("folder_removed", p_folder);
}
void FileSystemDock::_rename_operation_confirm() {
@@ -1406,24 +1424,20 @@ bool FileSystemDock::_check_existing() {
return true;
}
-void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool overwrite) {
- if (!overwrite) {
+void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool p_overwrite) {
+ if (!p_overwrite) {
to_move_path = p_to_path;
bool can_move = _check_existing();
if (!can_move) {
// Ask to do something.
- overwrite_dialog->popup_centered_minsize();
- overwrite_dialog->grab_focus();
+ overwrite_dialog->popup_centered();
return;
}
}
// Check groups.
for (int i = 0; i < to_move.size(); i++) {
-
- print_line("is group: " + to_move[i].path + ": " + itos(EditorFileSystem::get_singleton()->is_group_file(to_move[i].path)));
if (to_move[i].is_file && EditorFileSystem::get_singleton()->is_group_file(to_move[i].path)) {
- print_line("move to: " + p_to_path.plus_file(to_move[i].path.get_file()));
EditorFileSystem::get_singleton()->move_group_file(to_move[i].path, p_to_path.plus_file(to_move[i].path.get_file()));
}
}
@@ -1442,7 +1456,7 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool overw
if (is_moved) {
int current_tab = editor->get_current_tab();
- _save_scenes_after_move(file_renames); //save scenes before updating
+ _save_scenes_after_move(file_renames); // Save scenes before updating.
_update_dependencies_after_move(file_renames);
_update_resource_paths_after_move(file_renames);
_update_project_settings_after_move(file_renames);
@@ -1628,8 +1642,9 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
}
EditorSettings::get_singleton()->set_favorites(favorites);
_update_tree(_compute_uncollapsed_paths());
- if (path == "Favorites")
+ if (path == "Favorites") {
_update_file_list(true);
+ }
} break;
case FILE_DEPENDENCIES: {
@@ -1673,14 +1688,14 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
String name = to_rename.path.get_file();
rename_dialog->set_title(TTR("Renaming file:") + " " + name);
rename_dialog_text->set_text(name);
- rename_dialog_text->select(0, name.find_last("."));
+ rename_dialog_text->select(0, name.rfind("."));
} else {
String name = to_rename.path.substr(0, to_rename.path.length() - 1).get_file();
rename_dialog->set_title(TTR("Renaming folder:") + " " + name);
rename_dialog_text->set_text(name);
rename_dialog_text->select(0, name.length());
}
- rename_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ rename_dialog->popup_centered(Size2(250, 80) * EDSCALE);
rename_dialog_text->grab_focus();
}
}
@@ -1717,20 +1732,19 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
String name = to_duplicate.path.get_file();
duplicate_dialog->set_title(TTR("Duplicating file:") + " " + name);
duplicate_dialog_text->set_text(name);
- duplicate_dialog_text->select(0, name.find_last("."));
+ duplicate_dialog_text->select(0, name.rfind("."));
} else {
String name = to_duplicate.path.substr(0, to_duplicate.path.length() - 1).get_file();
duplicate_dialog->set_title(TTR("Duplicating folder:") + " " + name);
duplicate_dialog_text->set_text(name);
duplicate_dialog_text->select(0, name.length());
}
- duplicate_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ duplicate_dialog->popup_centered(Size2(250, 80) * EDSCALE);
duplicate_dialog_text->grab_focus();
}
} break;
case FILE_INFO: {
-
} break;
case FILE_REIMPORT: {
@@ -1746,14 +1760,14 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
case FILE_NEW_FOLDER: {
make_dir_dialog_text->set_text("new folder");
make_dir_dialog_text->select_all();
- make_dir_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ make_dir_dialog->popup_centered(Size2(250, 80) * EDSCALE);
make_dir_dialog_text->grab_focus();
} break;
case FILE_NEW_SCENE: {
make_scene_dialog_text->set_text("new scene");
make_scene_dialog_text->select_all();
- make_scene_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+ make_scene_dialog->popup_centered(Size2(250, 80) * EDSCALE);
make_scene_dialog_text->grab_focus();
} break;
@@ -1769,7 +1783,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
case FILE_COPY_PATH: {
if (!p_selected.empty()) {
String fpath = p_selected[0];
- OS::get_singleton()->set_clipboard(fpath);
+ DisplayServer::get_singleton()->clipboard_set(fpath);
}
} break;
@@ -1779,13 +1793,21 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected
}
}
-void FileSystemDock::_resource_created() const {
+void FileSystemDock::_resource_created() {
Object *c = new_resource_dialog->instance_selected();
ERR_FAIL_COND(!c);
Resource *r = Object::cast_to<Resource>(c);
ERR_FAIL_COND(!r);
+ PackedScene *scene = Object::cast_to<PackedScene>(r);
+ if (scene) {
+ Node *node = memnew(Node);
+ node->set_name("Node");
+ scene->pack(node);
+ memdelete(node);
+ }
+
REF res(r);
editor->push_item(c);
@@ -1807,10 +1829,11 @@ void FileSystemDock::_search_changed(const String &p_text, const Control *p_from
searched_string = p_text.to_lower();
- if (p_from == tree_search_box)
+ if (p_from == tree_search_box) {
file_list_search_box->set_text(searched_string);
- else // File_list_search_box.
+ } else { // File_list_search_box.
tree_search_box->set_text(searched_string);
+ }
bool unfold_path = (p_text == String() && path != String());
switch (display_mode) {
@@ -1843,8 +1866,9 @@ void FileSystemDock::focus_on_filter() {
}
void FileSystemDock::set_file_list_display_mode(FileListDisplayMode p_mode) {
- if (p_mode == file_list_display_mode)
+ if (p_mode == file_list_display_mode) {
return;
+ }
_toggle_file_display();
}
@@ -1865,7 +1889,7 @@ Variant FileSystemDock::get_drag_data_fw(const Point2 &p_point, Control *p_from)
return Variant();
}
- bool is_favorite = selected->get_parent() != NULL && tree->get_root()->get_children() == selected->get_parent();
+ bool is_favorite = selected->get_parent() != nullptr && tree->get_root()->get_children() == selected->get_parent();
all_favorites &= is_favorite;
all_not_favorites &= !is_favorite;
selected = tree->get_next_selected(selected);
@@ -1885,8 +1909,9 @@ Variant FileSystemDock::get_drag_data_fw(const Point2 &p_point, Control *p_from)
all_not_favorites = true;
}
- if (paths.empty())
+ if (paths.empty()) {
return Variant();
+ }
Dictionary drag_data = EditorNode::get_singleton()->drag_files_and_dirs(paths, p_from);
if (!all_not_favorites) {
@@ -1899,15 +1924,15 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
Dictionary drag_data = p_data;
if (drag_data.has("favorite")) {
-
if (String(drag_data["favorite"]) != "all") {
return false;
}
// Moving favorite around.
TreeItem *ti = tree->get_item_at_position(p_point);
- if (!ti)
+ if (!ti) {
return false;
+ }
int drop_section = tree->get_drop_section_at_position(p_point);
TreeItem *favorites_item = tree->get_root()->get_children();
@@ -1941,19 +1966,22 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
bool favorite;
_get_drag_target_folder(to_dir, favorite, p_point, p_from);
- if (favorite)
+ if (favorite) {
return true;
+ }
- if (to_dir.empty())
+ if (to_dir.empty()) {
return false;
+ }
// Attempting to move a folder into itself will fail later,
- // rather than bring up a message don't try to do it in the first place
+ // rather than bring up a message don't try to do it in the first place.
to_dir = to_dir.ends_with("/") ? to_dir : (to_dir + "/");
Vector<String> fnames = drag_data["files"];
for (int i = 0; i < fnames.size(); ++i) {
- if (fnames[i].ends_with("/") && to_dir.begins_with(fnames[i]))
+ if (fnames[i].ends_with("/") && to_dir.begins_with(fnames[i])) {
return false;
+ }
}
return true;
@@ -1963,21 +1991,22 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
}
void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
- if (!can_drop_data_fw(p_point, p_data, p_from))
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
return;
+ }
Dictionary drag_data = p_data;
Vector<String> dirs = EditorSettings::get_singleton()->get_favorites();
if (drag_data.has("favorite")) {
-
if (String(drag_data["favorite"]) != "all") {
return;
}
// Moving favorite around.
TreeItem *ti = tree->get_item_at_position(p_point);
- if (!ti)
+ if (!ti) {
return;
+ }
int drop_section = tree->get_drop_section_at_position(p_point);
int drop_position;
@@ -2024,8 +2053,9 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
EditorSettings::get_singleton()->set_favorites(dirs);
_update_tree(_compute_uncollapsed_paths());
- if (display_mode == DISPLAY_MODE_SPLIT && path == "Favorites")
+ if (display_mode == DISPLAY_MODE_SPLIT && path == "Favorites") {
_update_file_list(true);
+ }
return;
}
@@ -2050,11 +2080,40 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
Vector<String> fnames = drag_data["files"];
to_move.clear();
for (int i = 0; i < fnames.size(); i++) {
- to_move.push_back(FileOrFolder(fnames[i], !fnames[i].ends_with("/")));
+ if (fnames[i].get_base_dir() != to_dir) {
+ to_move.push_back(FileOrFolder(fnames[i], !fnames[i].ends_with("/")));
+ }
+ }
+ if (!to_move.empty()) {
+ if (Input::get_singleton()->is_key_pressed(KEY_CONTROL)) {
+ for (int i = 0; i < to_move.size(); i++) {
+ String new_path;
+ String new_path_base;
+
+ if (to_move[i].is_file) {
+ new_path = to_dir.plus_file(to_move[i].path.get_file());
+ new_path_base = new_path.get_basename() + " (%d)." + new_path.get_extension();
+ } else {
+ PackedStringArray path_split = to_move[i].path.split("/");
+ new_path = to_dir.plus_file(path_split[path_split.size() - 2]);
+ new_path_base = new_path + " (%d)";
+ }
+
+ int exist_counter = 1;
+ DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ while (da->file_exists(new_path) || da->dir_exists(new_path)) {
+ exist_counter++;
+ new_path = vformat(new_path_base, exist_counter);
+ }
+ _try_duplicate_item(to_move[i], new_path);
+ }
+ _rescan();
+ } else {
+ _move_operation_confirm(to_dir);
+ }
}
- _move_operation_confirm(to_dir);
} else if (favorite) {
- // Add the files from favorites
+ // Add the files from favorites.
Vector<String> fnames = drag_data["files"];
Vector<String> favorites = EditorSettings::get_singleton()->get_favorites();
for (int i = 0; i < fnames.size(); i++) {
@@ -2103,6 +2162,10 @@ void FileSystemDock::_get_drag_target_folder(String &target, bool &target_favori
// We drop on a folder.
target = fpath;
return;
+ } else {
+ // We drop on the folder that the target file is in.
+ target = fpath.get_base_dir();
+ return;
}
} else {
if (ti->get_parent() != tree->get_root()->get_children()) {
@@ -2166,28 +2229,28 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, Vector<Str
if (all_files) {
if (all_files_scenes) {
if (filenames.size() == 1) {
- p_popup->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Open Scene"), FILE_OPEN);
- p_popup->add_icon_item(get_icon("CreateNewSceneFrom", "EditorIcons"), TTR("New Inherited Scene"), FILE_INHERIT);
+ p_popup->add_icon_item(get_theme_icon("Load", "EditorIcons"), TTR("Open Scene"), FILE_OPEN);
+ p_popup->add_icon_item(get_theme_icon("CreateNewSceneFrom", "EditorIcons"), TTR("New Inherited Scene"), FILE_INHERIT);
if (ProjectSettings::get_singleton()->get("application/run/main_scene") != filenames[0]) {
- p_popup->add_icon_item(get_icon("PlayScene", "EditorIcons"), TTR("Set As Main Scene"), FILE_MAIN_SCENE);
+ p_popup->add_icon_item(get_theme_icon("PlayScene", "EditorIcons"), TTR("Set As Main Scene"), FILE_MAIN_SCENE);
}
} else {
- p_popup->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Open Scenes"), FILE_OPEN);
+ p_popup->add_icon_item(get_theme_icon("Load", "EditorIcons"), TTR("Open Scenes"), FILE_OPEN);
}
- p_popup->add_icon_item(get_icon("Instance", "EditorIcons"), TTR("Instance"), FILE_INSTANCE);
+ p_popup->add_icon_item(get_theme_icon("Instance", "EditorIcons"), TTR("Instance"), FILE_INSTANCE);
p_popup->add_separator();
} else if (filenames.size() == 1) {
- p_popup->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Open"), FILE_OPEN);
+ p_popup->add_icon_item(get_theme_icon("Load", "EditorIcons"), TTR("Open"), FILE_OPEN);
p_popup->add_separator();
}
}
if (p_paths.size() >= 1) {
if (!all_favorites) {
- p_popup->add_icon_item(get_icon("Favorites", "EditorIcons"), TTR("Add to Favorites"), FILE_ADD_FAVORITE);
+ p_popup->add_icon_item(get_theme_icon("Favorites", "EditorIcons"), TTR("Add to Favorites"), FILE_ADD_FAVORITE);
}
if (!all_not_favorites) {
- p_popup->add_icon_item(get_icon("NonFavorite", "EditorIcons"), TTR("Remove from Favorites"), FILE_REMOVE_FAVORITE);
+ p_popup->add_icon_item(get_theme_icon("NonFavorite", "EditorIcons"), TTR("Remove from Favorites"), FILE_REMOVE_FAVORITE);
}
p_popup->add_separator();
}
@@ -2200,36 +2263,36 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, Vector<Str
}
} else if (all_folders && foldernames.size() > 0) {
- p_popup->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Open"), FILE_OPEN);
+ p_popup->add_icon_item(get_theme_icon("Load", "EditorIcons"), TTR("Open"), FILE_OPEN);
p_popup->add_separator();
}
if (p_paths.size() == 1) {
- p_popup->add_icon_item(get_icon("ActionCopy", "EditorIcons"), TTR("Copy Path"), FILE_COPY_PATH);
+ p_popup->add_icon_item(get_theme_icon("ActionCopy", "EditorIcons"), TTR("Copy Path"), FILE_COPY_PATH);
if (p_paths[0] != "res://") {
- p_popup->add_icon_item(get_icon("Rename", "EditorIcons"), TTR("Rename..."), FILE_RENAME);
- p_popup->add_icon_item(get_icon("Duplicate", "EditorIcons"), TTR("Duplicate..."), FILE_DUPLICATE);
+ p_popup->add_icon_item(get_theme_icon("Rename", "EditorIcons"), TTR("Rename..."), FILE_RENAME);
+ p_popup->add_icon_item(get_theme_icon("Duplicate", "EditorIcons"), TTR("Duplicate..."), FILE_DUPLICATE);
}
}
if (p_paths.size() > 1 || p_paths[0] != "res://") {
- p_popup->add_icon_item(get_icon("MoveUp", "EditorIcons"), TTR("Move To..."), FILE_MOVE);
- p_popup->add_icon_item(get_icon("Remove", "EditorIcons"), TTR("Delete"), FILE_REMOVE);
+ p_popup->add_icon_item(get_theme_icon("MoveUp", "EditorIcons"), TTR("Move To..."), FILE_MOVE);
+ p_popup->add_icon_item(get_theme_icon("Remove", "EditorIcons"), TTR("Delete"), FILE_REMOVE);
}
if (p_paths.size() == 1) {
p_popup->add_separator();
if (p_display_path_dependent_options) {
- p_popup->add_icon_item(get_icon("Folder", "EditorIcons"), TTR("New Folder..."), FILE_NEW_FOLDER);
- p_popup->add_icon_item(get_icon("PackedScene", "EditorIcons"), TTR("New Scene..."), FILE_NEW_SCENE);
- p_popup->add_icon_item(get_icon("Script", "EditorIcons"), TTR("New Script..."), FILE_NEW_SCRIPT);
- p_popup->add_icon_item(get_icon("Object", "EditorIcons"), TTR("New Resource..."), FILE_NEW_RESOURCE);
+ p_popup->add_icon_item(get_theme_icon("Folder", "EditorIcons"), TTR("New Folder..."), FILE_NEW_FOLDER);
+ p_popup->add_icon_item(get_theme_icon("PackedScene", "EditorIcons"), TTR("New Scene..."), FILE_NEW_SCENE);
+ p_popup->add_icon_item(get_theme_icon("Script", "EditorIcons"), TTR("New Script..."), FILE_NEW_SCRIPT);
+ p_popup->add_icon_item(get_theme_icon("Object", "EditorIcons"), TTR("New Resource..."), FILE_NEW_RESOURCE);
p_popup->add_separator();
}
String fpath = p_paths[0];
String item_text = fpath.ends_with("/") ? TTR("Open in File Manager") : TTR("Show in File Manager");
- p_popup->add_icon_item(get_icon("Filesystem", "EditorIcons"), item_text, FILE_SHOW_IN_EXPLORER);
+ p_popup->add_icon_item(get_theme_icon("Filesystem", "EditorIcons"), item_text, FILE_SHOW_IN_EXPLORER);
}
}
@@ -2237,20 +2300,20 @@ void FileSystemDock::_tree_rmb_select(const Vector2 &p_pos) {
// Right click is pressed in the tree.
Vector<String> paths = _tree_get_selected(false);
+ tree_popup->clear();
if (paths.size() == 1) {
if (paths[0].ends_with("/")) {
- tree_popup->add_icon_item(get_icon("GuiTreeArrowDown", "EditorIcons"), TTR("Expand All"), FOLDER_EXPAND_ALL);
- tree_popup->add_icon_item(get_icon("GuiTreeArrowRight", "EditorIcons"), TTR("Collapse All"), FOLDER_COLLAPSE_ALL);
+ tree_popup->add_icon_item(get_theme_icon("GuiTreeArrowDown", "EditorIcons"), TTR("Expand All"), FOLDER_EXPAND_ALL);
+ tree_popup->add_icon_item(get_theme_icon("GuiTreeArrowRight", "EditorIcons"), TTR("Collapse All"), FOLDER_COLLAPSE_ALL);
tree_popup->add_separator();
}
}
// Popup.
if (!paths.empty()) {
- tree_popup->clear();
tree_popup->set_size(Size2(1, 1));
_file_and_folders_fill_popup(tree_popup, paths);
- tree_popup->set_position(tree->get_global_position() + p_pos);
+ tree_popup->set_position(tree->get_screen_position() + p_pos);
tree_popup->popup();
}
}
@@ -2260,10 +2323,10 @@ void FileSystemDock::_tree_rmb_empty(const Vector2 &p_pos) {
path = "res://";
tree_popup->clear();
tree_popup->set_size(Size2(1, 1));
- tree_popup->add_icon_item(get_icon("Folder", "EditorIcons"), TTR("New Folder..."), FILE_NEW_FOLDER);
- tree_popup->add_icon_item(get_icon("PackedScene", "EditorIcons"), TTR("New Scene..."), FILE_NEW_SCENE);
- tree_popup->add_icon_item(get_icon("Script", "EditorIcons"), TTR("New Script..."), FILE_NEW_SCRIPT);
- tree_popup->add_icon_item(get_icon("Object", "EditorIcons"), TTR("New Resource..."), FILE_NEW_RESOURCE);
+ tree_popup->add_icon_item(get_theme_icon("Folder", "EditorIcons"), TTR("New Folder..."), FILE_NEW_FOLDER);
+ tree_popup->add_icon_item(get_theme_icon("PackedScene", "EditorIcons"), TTR("New Scene..."), FILE_NEW_SCENE);
+ tree_popup->add_icon_item(get_theme_icon("Script", "EditorIcons"), TTR("New Script..."), FILE_NEW_SCRIPT);
+ tree_popup->add_icon_item(get_theme_icon("Object", "EditorIcons"), TTR("New Resource..."), FILE_NEW_RESOURCE);
tree_popup->set_position(tree->get_global_position() + p_pos);
tree_popup->popup();
}
@@ -2276,8 +2339,9 @@ void FileSystemDock::_file_list_rmb_select(int p_item, const Vector2 &p_pos) {
// Right click is pressed in the file list.
Vector<String> paths;
for (int i = 0; i < files->get_item_count(); i++) {
- if (!files->is_selected(i))
+ if (!files->is_selected(i)) {
continue;
+ }
if (files->get_item_text(p_item) == "..") {
files->unselect(i);
continue;
@@ -2297,18 +2361,19 @@ void FileSystemDock::_file_list_rmb_select(int p_item, const Vector2 &p_pos) {
void FileSystemDock::_file_list_rmb_pressed(const Vector2 &p_pos) {
// Right click on empty space for file list.
- if (searched_string.length() > 0)
+ if (searched_string.length() > 0) {
return;
+ }
file_list_popup->clear();
file_list_popup->set_size(Size2(1, 1));
- file_list_popup->add_icon_item(get_icon("Folder", "EditorIcons"), TTR("New Folder..."), FILE_NEW_FOLDER);
- file_list_popup->add_icon_item(get_icon("PackedScene", "EditorIcons"), TTR("New Scene..."), FILE_NEW_SCENE);
- file_list_popup->add_icon_item(get_icon("Script", "EditorIcons"), TTR("New Script..."), FILE_NEW_SCRIPT);
- file_list_popup->add_icon_item(get_icon("Object", "EditorIcons"), TTR("New Resource..."), FILE_NEW_RESOURCE);
+ file_list_popup->add_icon_item(get_theme_icon("Folder", "EditorIcons"), TTR("New Folder..."), FILE_NEW_FOLDER);
+ file_list_popup->add_icon_item(get_theme_icon("PackedScene", "EditorIcons"), TTR("New Scene..."), FILE_NEW_SCENE);
+ file_list_popup->add_icon_item(get_theme_icon("Script", "EditorIcons"), TTR("New Script..."), FILE_NEW_SCRIPT);
+ file_list_popup->add_icon_item(get_theme_icon("Object", "EditorIcons"), TTR("New Resource..."), FILE_NEW_RESOURCE);
file_list_popup->add_separator();
- file_list_popup->add_icon_item(get_icon("Filesystem", "EditorIcons"), TTR("Open in File Manager"), FILE_SHOW_IN_EXPLORER);
+ file_list_popup->add_icon_item(get_theme_icon("Filesystem", "EditorIcons"), TTR("Open in File Manager"), FILE_SHOW_IN_EXPLORER);
file_list_popup->set_position(files->get_global_position() + p_pos);
file_list_popup->popup();
}
@@ -2336,9 +2401,6 @@ void FileSystemDock::_file_multi_selected(int p_index, bool p_selected) {
}
void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) {
- if (get_viewport()->get_modal_stack_top())
- return; // Ignore because of modal window.
-
Ref<InputEventKey> key = p_event;
if (key.is_valid() && key->is_pressed() && !key->is_echo()) {
if (ED_IS_SHORTCUT("filesystem_dock/duplicate", p_event)) {
@@ -2354,9 +2416,6 @@ void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) {
}
void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) {
- if (get_viewport()->get_modal_stack_top())
- return; // Ignore because of modal window.
-
Ref<InputEventKey> key = p_event;
if (key.is_valid() && key->is_pressed() && !key->is_echo()) {
if (ED_IS_SHORTCUT("filesystem_dock/duplicate", p_event)) {
@@ -2371,6 +2430,27 @@ void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) {
}
}
+void FileSystemDock::_get_imported_files(const String &p_path, Vector<String> &files) const {
+ if (!p_path.ends_with("/")) {
+ if (FileAccess::exists(p_path + ".import")) {
+ files.push_back(p_path);
+ }
+ return;
+ }
+
+ DirAccess *da = DirAccess::open(p_path);
+ da->list_dir_begin();
+ String n = da->get_next();
+ while (n != String()) {
+ if (n != "." && n != ".." && !n.ends_with(".import")) {
+ String npath = p_path + n + (da->current_is_dir() ? "/" : "");
+ _get_imported_files(npath, files);
+ }
+ n = da->get_next();
+ }
+ da->list_dir_end();
+}
+
void FileSystemDock::_update_import_dock() {
if (!import_dock_needs_update)
return;
@@ -2391,21 +2471,17 @@ void FileSystemDock::_update_import_dock() {
}
}
+ // Expand directory selection
+ Vector<String> efiles;
+ for (int i = 0; i < selected.size(); i++) {
+ _get_imported_files(selected[i], efiles);
+ }
+
// Check import.
Vector<String> imports;
String import_type;
- for (int i = 0; i < selected.size(); i++) {
- String fpath = selected[i];
-
- if (fpath.ends_with("/")) {
- imports.clear();
- break;
- }
-
- if (!FileAccess::exists(fpath + ".import")) {
- imports.clear();
- break;
- }
+ for (int i = 0; i < efiles.size(); i++) {
+ String fpath = efiles[i];
Ref<ConfigFile> cf;
cf.instance();
Error err = cf->load(fpath + ".import");
@@ -2441,60 +2517,21 @@ void FileSystemDock::_feature_profile_changed() {
}
void FileSystemDock::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_file_list_gui_input"), &FileSystemDock::_file_list_gui_input);
- ClassDB::bind_method(D_METHOD("_tree_gui_input"), &FileSystemDock::_tree_gui_input);
-
ClassDB::bind_method(D_METHOD("_update_tree"), &FileSystemDock::_update_tree);
- ClassDB::bind_method(D_METHOD("_rescan"), &FileSystemDock::_rescan);
-
- ClassDB::bind_method(D_METHOD("_toggle_split_mode"), &FileSystemDock::_toggle_split_mode);
-
- ClassDB::bind_method(D_METHOD("_tree_rmb_option", "option"), &FileSystemDock::_tree_rmb_option);
- ClassDB::bind_method(D_METHOD("_tree_rmb_select"), &FileSystemDock::_tree_rmb_select);
- ClassDB::bind_method(D_METHOD("_tree_empty_selected"), &FileSystemDock::_tree_empty_selected);
-
- ClassDB::bind_method(D_METHOD("_file_list_rmb_option", "option"), &FileSystemDock::_file_list_rmb_option);
- ClassDB::bind_method(D_METHOD("_file_list_rmb_select"), &FileSystemDock::_file_list_rmb_select);
- ClassDB::bind_method(D_METHOD("_file_list_rmb_pressed"), &FileSystemDock::_file_list_rmb_pressed);
- ClassDB::bind_method(D_METHOD("_tree_rmb_empty"), &FileSystemDock::_tree_rmb_empty);
-
- ClassDB::bind_method(D_METHOD("_file_deleted"), &FileSystemDock::_file_deleted);
- ClassDB::bind_method(D_METHOD("_folder_deleted"), &FileSystemDock::_folder_deleted);
ClassDB::bind_method(D_METHOD("_file_list_thumbnail_done"), &FileSystemDock::_file_list_thumbnail_done);
ClassDB::bind_method(D_METHOD("_tree_thumbnail_done"), &FileSystemDock::_tree_thumbnail_done);
- ClassDB::bind_method(D_METHOD("_file_list_activate_file"), &FileSystemDock::_file_list_activate_file);
- ClassDB::bind_method(D_METHOD("_tree_activate_file"), &FileSystemDock::_tree_activate_file);
ClassDB::bind_method(D_METHOD("_select_file"), &FileSystemDock::_select_file);
- ClassDB::bind_method(D_METHOD("_navigate_to_path"), &FileSystemDock::_navigate_to_path, DEFVAL(false));
- ClassDB::bind_method(D_METHOD("_toggle_file_display"), &FileSystemDock::_toggle_file_display);
- ClassDB::bind_method(D_METHOD("_fw_history"), &FileSystemDock::_fw_history);
- ClassDB::bind_method(D_METHOD("_bw_history"), &FileSystemDock::_bw_history);
- ClassDB::bind_method(D_METHOD("_fs_changed"), &FileSystemDock::_fs_changed);
- ClassDB::bind_method(D_METHOD("_tree_multi_selected"), &FileSystemDock::_tree_multi_selected);
- ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &FileSystemDock::_make_dir_confirm);
- ClassDB::bind_method(D_METHOD("_make_scene_confirm"), &FileSystemDock::_make_scene_confirm);
- ClassDB::bind_method(D_METHOD("_resource_created"), &FileSystemDock::_resource_created);
- ClassDB::bind_method(D_METHOD("_move_operation_confirm", "to_path", "overwrite"), &FileSystemDock::_move_operation_confirm, DEFVAL(false));
- ClassDB::bind_method(D_METHOD("_move_with_overwrite"), &FileSystemDock::_move_with_overwrite);
- ClassDB::bind_method(D_METHOD("_rename_operation_confirm"), &FileSystemDock::_rename_operation_confirm);
- ClassDB::bind_method(D_METHOD("_duplicate_operation_confirm"), &FileSystemDock::_duplicate_operation_confirm);
-
- ClassDB::bind_method(D_METHOD("_search_changed"), &FileSystemDock::_search_changed);
-
- ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &FileSystemDock::get_drag_data_fw);
- ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &FileSystemDock::can_drop_data_fw);
- ClassDB::bind_method(D_METHOD("drop_data_fw"), &FileSystemDock::drop_data_fw);
- ClassDB::bind_method(D_METHOD("navigate_to_path"), &FileSystemDock::navigate_to_path);
-
- ClassDB::bind_method(D_METHOD("_preview_invalidated"), &FileSystemDock::_preview_invalidated);
- ClassDB::bind_method(D_METHOD("_file_multi_selected"), &FileSystemDock::_file_multi_selected);
- ClassDB::bind_method(D_METHOD("_update_import_dock"), &FileSystemDock::_update_import_dock);
- ClassDB::bind_method(D_METHOD("_feature_profile_changed"), &FileSystemDock::_feature_profile_changed);
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw", "position", "from"), &FileSystemDock::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw", "position", "data", "from"), &FileSystemDock::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw", "position", "data", "from"), &FileSystemDock::drop_data_fw);
+ ClassDB::bind_method(D_METHOD("navigate_to_path", "path"), &FileSystemDock::navigate_to_path);
+
+ ClassDB::bind_method(D_METHOD("_update_import_dock"), &FileSystemDock::_update_import_dock);
ADD_SIGNAL(MethodInfo("inherit", PropertyInfo(Variant::STRING, "file")));
- ADD_SIGNAL(MethodInfo("instance", PropertyInfo(Variant::POOL_STRING_ARRAY, "files")));
+ ADD_SIGNAL(MethodInfo("instance", PropertyInfo(Variant::PACKED_STRING_ARRAY, "files")));
ADD_SIGNAL(MethodInfo("file_removed", PropertyInfo(Variant::STRING, "file")));
ADD_SIGNAL(MethodInfo("folder_removed", PropertyInfo(Variant::STRING, "folder")));
@@ -2518,16 +2555,18 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
add_child(top_vbc);
HBoxContainer *toolbar_hbc = memnew(HBoxContainer);
- toolbar_hbc->add_constant_override("separation", 0);
+ toolbar_hbc->add_theme_constant_override("separation", 0);
top_vbc->add_child(toolbar_hbc);
- button_hist_prev = memnew(ToolButton);
+ button_hist_prev = memnew(Button);
+ button_hist_prev->set_flat(true);
button_hist_prev->set_disabled(true);
button_hist_prev->set_focus_mode(FOCUS_NONE);
button_hist_prev->set_tooltip(TTR("Previous Folder/File"));
toolbar_hbc->add_child(button_hist_prev);
- button_hist_next = memnew(ToolButton);
+ button_hist_next = memnew(Button);
+ button_hist_next->set_flat(true);
button_hist_next->set_disabled(true);
button_hist_next->set_focus_mode(FOCUS_NONE);
button_hist_next->set_tooltip(TTR("Next Folder/File"));
@@ -2540,7 +2579,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
button_reload = memnew(Button);
button_reload->set_flat(true);
- button_reload->connect("pressed", this, "_rescan");
+ button_reload->connect("pressed", callable_mp(this, &FileSystemDock::_rescan));
button_reload->set_focus_mode(FOCUS_NONE);
button_reload->set_tooltip(TTR("Re-Scan Filesystem"));
button_reload->hide();
@@ -2549,27 +2588,27 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
button_toggle_display_mode = memnew(Button);
button_toggle_display_mode->set_flat(true);
button_toggle_display_mode->set_toggle_mode(true);
- button_toggle_display_mode->connect("toggled", this, "_toggle_split_mode");
+ button_toggle_display_mode->connect("toggled", callable_mp(this, &FileSystemDock::_toggle_split_mode));
button_toggle_display_mode->set_focus_mode(FOCUS_NONE);
button_toggle_display_mode->set_tooltip(TTR("Toggle Split Mode"));
toolbar_hbc->add_child(button_toggle_display_mode);
HBoxContainer *toolbar2_hbc = memnew(HBoxContainer);
- toolbar2_hbc->add_constant_override("separation", 0);
+ toolbar2_hbc->add_theme_constant_override("separation", 0);
top_vbc->add_child(toolbar2_hbc);
tree_search_box = memnew(LineEdit);
tree_search_box->set_h_size_flags(SIZE_EXPAND_FILL);
tree_search_box->set_placeholder(TTR("Search files"));
- tree_search_box->connect("text_changed", this, "_search_changed", varray(tree_search_box));
+ tree_search_box->connect("text_changed", callable_mp(this, &FileSystemDock::_search_changed), varray(tree_search_box));
toolbar2_hbc->add_child(tree_search_box);
file_list_popup = memnew(PopupMenu);
- file_list_popup->set_hide_on_window_lose_focus(true);
+
add_child(file_list_popup);
tree_popup = memnew(PopupMenu);
- tree_popup->set_hide_on_window_lose_focus(true);
+
add_child(tree_popup);
split_box = memnew(VSplitContainer);
@@ -2585,12 +2624,12 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
tree->set_custom_minimum_size(Size2(0, 15 * EDSCALE));
split_box->add_child(tree);
- tree->connect("item_activated", this, "_tree_activate_file");
- tree->connect("multi_selected", this, "_tree_multi_selected");
- tree->connect("item_rmb_selected", this, "_tree_rmb_select");
- tree->connect("empty_rmb", this, "_tree_rmb_empty");
- tree->connect("nothing_selected", this, "_tree_empty_selected");
- tree->connect("gui_input", this, "_tree_gui_input");
+ tree->connect("item_activated", callable_mp(this, &FileSystemDock::_tree_activate_file));
+ tree->connect("multi_selected", callable_mp(this, &FileSystemDock::_tree_multi_selected));
+ tree->connect("item_rmb_selected", callable_mp(this, &FileSystemDock::_tree_rmb_select));
+ tree->connect("empty_rmb", callable_mp(this, &FileSystemDock::_tree_rmb_empty));
+ tree->connect("nothing_selected", callable_mp(this, &FileSystemDock::_tree_empty_selected));
+ tree->connect("gui_input", callable_mp(this, &FileSystemDock::_tree_gui_input));
file_list_vb = memnew(VBoxContainer);
file_list_vb->set_v_size_flags(SIZE_EXPAND_FILL);
@@ -2602,20 +2641,21 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
file_list_search_box = memnew(LineEdit);
file_list_search_box->set_h_size_flags(SIZE_EXPAND_FILL);
file_list_search_box->set_placeholder(TTR("Search files"));
- file_list_search_box->connect("text_changed", this, "_search_changed", varray(file_list_search_box));
+ file_list_search_box->connect("text_changed", callable_mp(this, &FileSystemDock::_search_changed), varray(file_list_search_box));
path_hb->add_child(file_list_search_box);
- button_file_list_display_mode = memnew(ToolButton);
+ button_file_list_display_mode = memnew(Button);
+ button_file_list_display_mode->set_flat(true);
path_hb->add_child(button_file_list_display_mode);
files = memnew(ItemList);
files->set_v_size_flags(SIZE_EXPAND_FILL);
files->set_select_mode(ItemList::SELECT_MULTI);
files->set_drag_forwarding(this);
- files->connect("item_rmb_selected", this, "_file_list_rmb_select");
- files->connect("gui_input", this, "_file_list_gui_input");
- files->connect("multi_selected", this, "_file_multi_selected");
- files->connect("rmb_clicked", this, "_file_list_rmb_pressed");
+ files->connect("item_rmb_selected", callable_mp(this, &FileSystemDock::_file_list_rmb_select));
+ files->connect("gui_input", callable_mp(this, &FileSystemDock::_file_list_gui_input));
+ files->connect("multi_selected", callable_mp(this, &FileSystemDock::_file_multi_selected));
+ files->connect("rmb_clicked", callable_mp(this, &FileSystemDock::_file_list_rmb_pressed));
files->set_custom_minimum_size(Size2(0, 15 * EDSCALE));
files->set_allow_rmb_select(true);
file_list_vb->add_child(files);
@@ -2639,14 +2679,14 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
add_child(owners_editor);
remove_dialog = memnew(DependencyRemoveDialog);
- remove_dialog->connect("file_removed", this, "_file_deleted");
- remove_dialog->connect("folder_removed", this, "_folder_deleted");
+ remove_dialog->connect("file_removed", callable_mp(this, &FileSystemDock::_file_removed));
+ remove_dialog->connect("folder_removed", callable_mp(this, &FileSystemDock::_folder_removed));
add_child(remove_dialog);
move_dialog = memnew(EditorDirDialog);
move_dialog->get_ok()->set_text(TTR("Move"));
add_child(move_dialog);
- move_dialog->connect("dir_selected", this, "_move_operation_confirm");
+ move_dialog->connect("dir_selected", callable_mp(this, &FileSystemDock::_move_operation_confirm), make_binds(false));
rename_dialog = memnew(ConfirmationDialog);
VBoxContainer *rename_dialog_vb = memnew(VBoxContainer);
@@ -2657,13 +2697,13 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
rename_dialog->get_ok()->set_text(TTR("Rename"));
add_child(rename_dialog);
rename_dialog->register_text_enter(rename_dialog_text);
- rename_dialog->connect("confirmed", this, "_rename_operation_confirm");
+ rename_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_rename_operation_confirm));
overwrite_dialog = memnew(ConfirmationDialog);
overwrite_dialog->set_text(TTR("There is already file or folder with the same name in this location."));
overwrite_dialog->get_ok()->set_text(TTR("Overwrite"));
add_child(overwrite_dialog);
- overwrite_dialog->connect("confirmed", this, "_move_with_overwrite");
+ overwrite_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_move_with_overwrite));
duplicate_dialog = memnew(ConfirmationDialog);
VBoxContainer *duplicate_dialog_vb = memnew(VBoxContainer);
@@ -2674,7 +2714,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
duplicate_dialog->get_ok()->set_text(TTR("Duplicate"));
add_child(duplicate_dialog);
duplicate_dialog->register_text_enter(duplicate_dialog_text);
- duplicate_dialog->connect("confirmed", this, "_duplicate_operation_confirm");
+ duplicate_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_duplicate_operation_confirm));
make_dir_dialog = memnew(ConfirmationDialog);
make_dir_dialog->set_title(TTR("Create Folder"));
@@ -2685,7 +2725,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
make_folder_dialog_vb->add_margin_child(TTR("Name:"), make_dir_dialog_text);
add_child(make_dir_dialog);
make_dir_dialog->register_text_enter(make_dir_dialog_text);
- make_dir_dialog->connect("confirmed", this, "_make_dir_confirm");
+ make_dir_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_make_dir_confirm));
make_scene_dialog = memnew(ConfirmationDialog);
make_scene_dialog->set_title(TTR("Create Scene"));
@@ -2696,7 +2736,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
make_scene_dialog_vb->add_margin_child(TTR("Name:"), make_scene_dialog_text);
add_child(make_scene_dialog);
make_scene_dialog->register_text_enter(make_scene_dialog_text);
- make_scene_dialog->connect("confirmed", this, "_make_scene_confirm");
+ make_scene_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_make_scene_confirm));
make_script_dialog = memnew(ScriptCreateDialog);
make_script_dialog->set_title(TTR("Create Script"));
@@ -2705,7 +2745,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
new_resource_dialog = memnew(CreateDialog);
add_child(new_resource_dialog);
new_resource_dialog->set_base_type("Resource");
- new_resource_dialog->connect("create", this, "_resource_created");
+ new_resource_dialog->connect("create", callable_mp(this, &FileSystemDock::_resource_created));
searched_string = String();
uncollapsed_paths_before_search = Vector<String>();
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index 49692c8349..ec2a075834 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -40,7 +40,6 @@
#include "scene/gui/option_button.h"
#include "scene/gui/progress_bar.h"
#include "scene/gui/split_container.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
#include "scene/main/timer.h"
@@ -148,11 +147,9 @@ private:
class FileOrFolder {
public:
String path;
- bool is_file;
+ bool is_file = false;
- FileOrFolder() :
- path(""),
- is_file(false) {}
+ FileOrFolder() {}
FileOrFolder(const String &p_path, bool p_is_file) :
path(p_path),
is_file(p_is_file) {}
@@ -176,7 +173,7 @@ private:
ItemList *files;
bool import_dock_needs_update;
- Ref<Texture> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx);
+ Ref<Texture2D> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx);
bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path = false);
Vector<String> _compute_uncollapsed_paths();
void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false, bool p_unfold_path = false);
@@ -198,6 +195,7 @@ private:
void _file_multi_selected(int p_index, bool p_selected);
void _tree_multi_selected(Object *p_item, int p_column, bool p_selected);
+ void _get_imported_files(const String &p_path, Vector<String> &files) const;
void _update_import_dock();
void _get_all_items_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files, Vector<String> &folders) const;
@@ -210,19 +208,19 @@ private:
void _update_favorites_list_after_move(const Map<String, String> &p_files_renames, const Map<String, String> &p_folders_renames) const;
void _update_project_settings_after_move(const Map<String, String> &p_renames) const;
- void _file_deleted(String p_file);
- void _folder_deleted(String p_folder);
+ void _file_removed(String p_file);
+ void _folder_removed(String p_folder);
void _files_moved(String p_old_file, String p_new_file);
void _folder_moved(String p_old_folder, String p_new_folder);
- void _resource_created() const;
+ void _resource_created();
void _make_dir_confirm();
void _make_scene_confirm();
void _rename_operation_confirm();
void _duplicate_operation_confirm();
void _move_with_overwrite();
bool _check_existing();
- void _move_operation_confirm(const String &p_to_path, bool overwrite = false);
+ void _move_operation_confirm(const String &p_to_path, bool p_overwrite = false);
void _tree_rmb_option(int p_option);
void _file_list_rmb_option(int p_option);
@@ -269,8 +267,8 @@ private:
void _get_drag_target_folder(String &target, bool &target_favorites, const Point2 &p_point, Control *p_from) const;
void _preview_invalidated(const String &p_path);
- void _file_list_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata);
- void _tree_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata);
+ void _file_list_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata);
+ void _tree_thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata);
void _update_display_mode(bool p_force = false);
diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp
index 4ab90ad3e4..c2ccbdb08c 100644
--- a/editor/find_in_files.cpp
+++ b/editor/find_in_files.cpp
@@ -47,26 +47,26 @@
const char *FindInFiles::SIGNAL_RESULT_FOUND = "result_found";
const char *FindInFiles::SIGNAL_FINISHED = "finished";
-// TODO Would be nice in Vector and PoolVectors
+// TODO Would be nice in Vector and Vectors
template <typename T>
inline void pop_back(T &container) {
container.resize(container.size() - 1);
}
// TODO Copied from TextEdit private, would be nice to extract it in a single place
-static bool is_text_char(CharType c) {
+static bool is_text_char(char32_t c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_';
}
static bool find_next(const String &line, String pattern, int from, bool match_case, bool whole_words, int &out_begin, int &out_end) {
-
int end = from;
while (true) {
int begin = match_case ? line.find(pattern, end) : line.findn(pattern, end);
- if (begin == -1)
+ if (begin == -1) {
return false;
+ }
end = begin + pattern.length();
out_begin = begin;
@@ -132,8 +132,8 @@ void FindInFiles::start() {
// Init search
_current_dir = "";
- PoolStringArray init_folder;
- init_folder.append(_root_dir);
+ PackedStringArray init_folder;
+ init_folder.push_back(_root_dir);
_folders_stack.clear();
_folders_stack.push_back(init_folder);
@@ -157,18 +157,17 @@ void FindInFiles::_process() {
while (is_processing()) {
_iterate();
float elapsed = (os.get_ticks_msec() - time_before);
- if (elapsed > 1000.0 / 120.0)
+ if (elapsed > 1000.0 / 120.0) {
break;
+ }
}
}
void FindInFiles::_iterate() {
-
if (_folders_stack.size() != 0) {
-
// Scan folders first so we can build a list of files and have progress info later
- PoolStringArray &folders_to_scan = _folders_stack.write[_folders_stack.size() - 1];
+ PackedStringArray &folders_to_scan = _folders_stack.write[_folders_stack.size() - 1];
if (folders_to_scan.size() != 0) {
// Scan one folder below
@@ -178,7 +177,7 @@ void FindInFiles::_iterate() {
_current_dir = _current_dir.plus_file(folder_name);
- PoolStringArray sub_dirs;
+ PackedStringArray sub_dirs;
_scan_dir("res://" + _current_dir, sub_dirs);
_folders_stack.push_back(sub_dirs);
@@ -196,7 +195,6 @@ void FindInFiles::_iterate() {
}
} else if (_files_to_scan.size() != 0) {
-
// Then scan files
String fpath = _files_to_scan[_files_to_scan.size() - 1];
@@ -219,8 +217,7 @@ float FindInFiles::get_progress() const {
return 0;
}
-void FindInFiles::_scan_dir(String path, PoolStringArray &out_folders) {
-
+void FindInFiles::_scan_dir(String path, PackedStringArray &out_folders) {
DirAccessRef dir = DirAccess::open(path);
if (!dir) {
print_verbose("Cannot open directory! " + path);
@@ -232,17 +229,22 @@ void FindInFiles::_scan_dir(String path, PoolStringArray &out_folders) {
for (int i = 0; i < 1000; ++i) {
String file = dir->get_next();
- if (file == "")
+ if (file == "") {
break;
+ }
- // Ignore special dirs and hidden dirs (such as .git and .import)
- if (file == "." || file == ".." || file.begins_with("."))
+ // Ignore special dirs (such as .git and .import)
+ if (file == "." || file == ".." || file.begins_with(".")) {
+ continue;
+ }
+ if (dir->current_is_hidden()) {
continue;
+ }
- if (dir->current_is_dir())
- out_folders.append(file);
+ if (dir->current_is_dir()) {
+ out_folders.push_back(file);
- else {
+ } else {
String file_ext = file.get_extension();
if (_extension_filter.has(file_ext)) {
_files_to_scan.push_back(path.plus_file(file));
@@ -252,7 +254,6 @@ void FindInFiles::_scan_dir(String path, PoolStringArray &out_folders) {
}
void FindInFiles::_scan_file(String fpath) {
-
FileAccessRef f = FileAccess::open(fpath, FileAccess::READ);
if (!f) {
print_verbose(String("Cannot open file ") + fpath);
@@ -262,7 +263,6 @@ void FindInFiles::_scan_file(String fpath) {
int line_number = 0;
while (!f->eof_reached()) {
-
// line number starts at 1
++line_number;
@@ -280,7 +280,6 @@ void FindInFiles::_scan_file(String fpath) {
}
void FindInFiles::_bind_methods() {
-
ADD_SIGNAL(MethodInfo(SIGNAL_RESULT_FOUND,
PropertyInfo(Variant::STRING, "path"),
PropertyInfo(Variant::INT, "line_number"),
@@ -296,15 +295,14 @@ const char *FindInFilesDialog::SIGNAL_FIND_REQUESTED = "find_requested";
const char *FindInFilesDialog::SIGNAL_REPLACE_REQUESTED = "replace_requested";
FindInFilesDialog::FindInFilesDialog() {
-
- set_custom_minimum_size(Size2(500 * EDSCALE, 0));
+ set_min_size(Size2(500 * EDSCALE, 0));
set_title(TTR("Find in Files"));
VBoxContainer *vbc = memnew(VBoxContainer);
- vbc->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, 8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -8 * EDSCALE);
add_child(vbc);
GridContainer *gc = memnew(GridContainer);
@@ -316,11 +314,22 @@ FindInFilesDialog::FindInFilesDialog() {
gc->add_child(find_label);
_search_text_line_edit = memnew(LineEdit);
- _search_text_line_edit->set_h_size_flags(SIZE_EXPAND_FILL);
- _search_text_line_edit->connect("text_changed", this, "_on_search_text_modified");
- _search_text_line_edit->connect("text_entered", this, "_on_search_text_entered");
+ _search_text_line_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ _search_text_line_edit->connect("text_changed", callable_mp(this, &FindInFilesDialog::_on_search_text_modified));
+ _search_text_line_edit->connect("text_entered", callable_mp(this, &FindInFilesDialog::_on_search_text_entered));
gc->add_child(_search_text_line_edit);
+ _replace_label = memnew(Label);
+ _replace_label->set_text(TTR("Replace:"));
+ _replace_label->hide();
+ gc->add_child(_replace_label);
+
+ _replace_text_line_edit = memnew(LineEdit);
+ _replace_text_line_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ _replace_text_line_edit->connect("text_entered", callable_mp(this, &FindInFilesDialog::_on_replace_text_entered));
+ _replace_text_line_edit->hide();
+ gc->add_child(_replace_text_line_edit);
+
gc->add_child(memnew(Control)); // Space to maintain the grid aligned.
{
@@ -349,17 +358,17 @@ FindInFilesDialog::FindInFilesDialog() {
hbc->add_child(prefix_label);
_folder_line_edit = memnew(LineEdit);
- _folder_line_edit->set_h_size_flags(SIZE_EXPAND_FILL);
+ _folder_line_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hbc->add_child(_folder_line_edit);
Button *folder_button = memnew(Button);
folder_button->set_text("...");
- folder_button->connect("pressed", this, "_on_folder_button_pressed");
+ folder_button->connect("pressed", callable_mp(this, &FindInFilesDialog::_on_folder_button_pressed));
hbc->add_child(folder_button);
_folder_dialog = memnew(FileDialog);
- _folder_dialog->set_mode(FileDialog::MODE_OPEN_DIR);
- _folder_dialog->connect("dir_selected", this, "_on_folder_selected");
+ _folder_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR);
+ _folder_dialog->connect("dir_selected", callable_mp(this, &FindInFilesDialog::_on_folder_selected));
add_child(_folder_dialog);
gc->add_child(hbc);
@@ -381,6 +390,8 @@ FindInFilesDialog::FindInFilesDialog() {
Button *cancel_button = get_ok();
cancel_button->set_text(TTR("Cancel"));
+
+ _mode = SEARCH_MODE;
}
void FindInFilesDialog::set_search_text(String text) {
@@ -388,11 +399,40 @@ void FindInFilesDialog::set_search_text(String text) {
_on_search_text_modified(text);
}
+void FindInFilesDialog::set_replace_text(String text) {
+ _replace_text_line_edit->set_text(text);
+}
+
+void FindInFilesDialog::set_find_in_files_mode(FindInFilesMode p_mode) {
+ if (_mode == p_mode) {
+ return;
+ }
+
+ _mode = p_mode;
+
+ if (p_mode == SEARCH_MODE) {
+ set_title(TTR("Find in Files"));
+ _replace_label->hide();
+ _replace_text_line_edit->hide();
+ } else if (p_mode == REPLACE_MODE) {
+ set_title(TTR("Replace in Files"));
+ _replace_label->show();
+ _replace_text_line_edit->show();
+ }
+
+ // After hiding some child controls, let's recalculate proper Dialog size
+ set_size(Size2(get_size().x, 0));
+}
+
String FindInFilesDialog::get_search_text() const {
String text = _search_text_line_edit->get_text();
return text.strip_edges();
}
+String FindInFilesDialog::get_replace_text() const {
+ return _replace_text_line_edit->get_text();
+}
+
bool FindInFilesDialog::is_match_case() const {
return _match_case_checkbox->is_pressed();
}
@@ -443,7 +483,7 @@ void FindInFilesDialog::_notification(int p_what) {
}
void FindInFilesDialog::_on_folder_button_pressed() {
- _folder_dialog->popup_centered_ratio();
+ _folder_dialog->popup_file_dialog();
}
void FindInFilesDialog::custom_action(const String &p_action) {
@@ -461,7 +501,6 @@ void FindInFilesDialog::custom_action(const String &p_action) {
}
void FindInFilesDialog::_on_search_text_modified(String text) {
-
ERR_FAIL_COND(!_find_button);
ERR_FAIL_COND(!_replace_button);
@@ -471,24 +510,37 @@ void FindInFilesDialog::_on_search_text_modified(String text) {
void FindInFilesDialog::_on_search_text_entered(String text) {
// This allows to trigger a global search without leaving the keyboard
- if (!_find_button->is_disabled())
- custom_action("find");
+ if (!_find_button->is_disabled()) {
+ if (_mode == SEARCH_MODE) {
+ custom_action("find");
+ }
+ }
+
+ if (!_replace_button->is_disabled()) {
+ if (_mode == REPLACE_MODE) {
+ custom_action("replace");
+ }
+ }
+}
+
+void FindInFilesDialog::_on_replace_text_entered(String text) {
+ // This allows to trigger a global search without leaving the keyboard
+ if (!_replace_button->is_disabled()) {
+ if (_mode == REPLACE_MODE) {
+ custom_action("replace");
+ }
+ }
}
void FindInFilesDialog::_on_folder_selected(String path) {
int i = path.find("://");
- if (i != -1)
+ if (i != -1) {
path = path.right(i + 3);
+ }
_folder_line_edit->set_text(path);
}
void FindInFilesDialog::_bind_methods() {
-
- ClassDB::bind_method("_on_folder_button_pressed", &FindInFilesDialog::_on_folder_button_pressed);
- ClassDB::bind_method("_on_folder_selected", &FindInFilesDialog::_on_folder_selected);
- ClassDB::bind_method("_on_search_text_modified", &FindInFilesDialog::_on_search_text_modified);
- ClassDB::bind_method("_on_search_text_entered", &FindInFilesDialog::_on_search_text_entered);
-
ADD_SIGNAL(MethodInfo(SIGNAL_FIND_REQUESTED));
ADD_SIGNAL(MethodInfo(SIGNAL_REPLACE_REQUESTED));
}
@@ -498,10 +550,9 @@ const char *FindInFilesPanel::SIGNAL_RESULT_SELECTED = "result_selected";
const char *FindInFilesPanel::SIGNAL_FILES_MODIFIED = "files_modified";
FindInFilesPanel::FindInFilesPanel() {
-
_finder = memnew(FindInFiles);
- _finder->connect(FindInFiles::SIGNAL_RESULT_FOUND, this, "_on_result_found");
- _finder->connect(FindInFiles::SIGNAL_FINISHED, this, "_on_finished");
+ _finder->connect(FindInFiles::SIGNAL_RESULT_FOUND, callable_mp(this, &FindInFilesPanel::_on_result_found));
+ _finder->connect(FindInFiles::SIGNAL_FINISHED, callable_mp(this, &FindInFilesPanel::_on_finished));
add_child(_finder);
VBoxContainer *vbc = memnew(VBoxContainer);
@@ -519,7 +570,7 @@ FindInFilesPanel::FindInFilesPanel() {
hbc->add_child(find_label);
_search_text_label = memnew(Label);
- _search_text_label->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("source", "EditorFonts"));
+ _search_text_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("source", "EditorFonts"));
hbc->add_child(_search_text_label);
_progress_bar = memnew(ProgressBar);
@@ -531,9 +582,15 @@ FindInFilesPanel::FindInFilesPanel() {
_status_label = memnew(Label);
hbc->add_child(_status_label);
+ _refresh_button = memnew(Button);
+ _refresh_button->set_text(TTR("Refresh"));
+ _refresh_button->connect("pressed", callable_mp(this, &FindInFilesPanel::_on_refresh_button_clicked));
+ _refresh_button->hide();
+ hbc->add_child(_refresh_button);
+
_cancel_button = memnew(Button);
_cancel_button->set_text(TTR("Cancel"));
- _cancel_button->connect("pressed", this, "_on_cancel_button_clicked");
+ _cancel_button->connect("pressed", callable_mp(this, &FindInFilesPanel::_on_cancel_button_clicked));
_cancel_button->hide();
hbc->add_child(_cancel_button);
@@ -541,10 +598,10 @@ FindInFilesPanel::FindInFilesPanel() {
}
_results_display = memnew(Tree);
- _results_display->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("source", "EditorFonts"));
+ _results_display->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("source", "EditorFonts"));
_results_display->set_v_size_flags(SIZE_EXPAND_FILL);
- _results_display->connect("item_selected", this, "_on_result_selected");
- _results_display->connect("item_edited", this, "_on_item_edited");
+ _results_display->connect("item_selected", callable_mp(this, &FindInFilesPanel::_on_result_selected));
+ _results_display->connect("item_edited", callable_mp(this, &FindInFilesPanel::_on_item_edited));
_results_display->set_hide_root(true);
_results_display->set_select_mode(Tree::SELECT_ROW);
_results_display->set_allow_rmb_select(true);
@@ -562,12 +619,12 @@ FindInFilesPanel::FindInFilesPanel() {
_replace_line_edit = memnew(LineEdit);
_replace_line_edit->set_h_size_flags(SIZE_EXPAND_FILL);
- _replace_line_edit->connect("text_changed", this, "_on_replace_text_changed");
+ _replace_line_edit->connect("text_changed", callable_mp(this, &FindInFilesPanel::_on_replace_text_changed));
_replace_container->add_child(_replace_line_edit);
_replace_all_button = memnew(Button);
_replace_all_button->set_text(TTR("Replace all (no undo)"));
- _replace_all_button->connect("pressed", this, "_on_replace_all_clicked");
+ _replace_all_button->connect("pressed", callable_mp(this, &FindInFilesPanel::_on_replace_all_clicked));
_replace_container->add_child(_replace_all_button);
_replace_container->hide();
@@ -577,7 +634,6 @@ FindInFilesPanel::FindInFilesPanel() {
}
void FindInFilesPanel::set_with_replace(bool with_replace) {
-
_with_replace = with_replace;
_replace_container->set_visible(with_replace);
@@ -594,6 +650,10 @@ void FindInFilesPanel::set_with_replace(bool with_replace) {
}
}
+void FindInFilesPanel::set_replace_text(String text) {
+ _replace_line_edit->set_text(text);
+}
+
void FindInFilesPanel::clear() {
_file_items.clear();
_result_items.clear();
@@ -602,7 +662,6 @@ void FindInFilesPanel::clear() {
}
void FindInFilesPanel::start_search() {
-
clear();
_status_label->set_text(TTR("Searching..."));
@@ -614,16 +673,17 @@ void FindInFilesPanel::start_search() {
_finder->start();
update_replace_buttons();
+ _refresh_button->hide();
_cancel_button->show();
}
void FindInFilesPanel::stop_search() {
-
_finder->stop();
_status_label->set_text("");
update_replace_buttons();
set_progress_visible(false);
+ _refresh_button->show();
_cancel_button->hide();
}
@@ -634,11 +694,10 @@ void FindInFilesPanel::_notification(int p_what) {
}
void FindInFilesPanel::_on_result_found(String fpath, int line_number, int begin, int end, String text) {
-
TreeItem *file_item;
Map<String, TreeItem *>::Element *E = _file_items.find(fpath);
- if (E == NULL) {
+ if (E == nullptr) {
file_item = _results_display->create_item();
file_item->set_text(0, fpath);
file_item->set_metadata(0, fpath);
@@ -660,22 +719,20 @@ void FindInFilesPanel::_on_result_found(String fpath, int line_number, int begin
// Do this first because it resets properties of the cell...
item->set_cell_mode(text_index, TreeItem::CELL_MODE_CUSTOM);
- String item_text = vformat("%3s: %s", line_number, text.replace("\t", " "));
+ // Trim result item line
+ int old_text_size = text.size();
+ text = text.strip_edges(true, false);
+ int chars_removed = old_text_size - text.size();
+ String start = vformat("%3s: ", line_number);
- item->set_text(text_index, item_text);
+ item->set_text(text_index, start + text);
item->set_custom_draw(text_index, this, "_draw_result_text");
- Ref<Font> font = _results_display->get_font("font");
-
- float raw_text_width = font->get_string_size(text).x;
- float item_text_width = font->get_string_size(item_text).x;
-
Result r;
r.line_number = line_number;
r.begin = begin;
r.end = end;
- r.draw_begin = (item_text_width - raw_text_width) + font->get_string_size(text.left(r.begin)).x;
- r.draw_width = font->get_string_size(text.substr(r.begin, r.end - r.begin)).x;
+ r.begin_trimmed = begin - chars_removed + start.size() - 1;
_result_items[item] = r;
if (_with_replace) {
@@ -686,19 +743,22 @@ void FindInFilesPanel::_on_result_found(String fpath, int line_number, int begin
}
void FindInFilesPanel::draw_result_text(Object *item_obj, Rect2 rect) {
-
TreeItem *item = Object::cast_to<TreeItem>(item_obj);
- if (!item)
+ if (!item) {
return;
+ }
Map<TreeItem *, Result>::Element *E = _result_items.find(item);
- if (!E)
+ if (!E) {
return;
+ }
Result r = E->value();
+ String item_text = item->get_text(_with_replace ? 1 : 0);
+ Ref<Font> font = _results_display->get_theme_font("font");
Rect2 match_rect = rect;
- match_rect.position.x += r.draw_begin;
- match_rect.size.x = r.draw_width;
+ match_rect.position.x += font->get_string_size(item_text.left(r.begin_trimmed)).x;
+ match_rect.size.x = font->get_string_size(_search_text_label->get_text()).x;
match_rect.position.y += 1 * EDSCALE;
match_rect.size.y -= 2 * EDSCALE;
@@ -707,39 +767,42 @@ void FindInFilesPanel::draw_result_text(Object *item_obj, Rect2 rect) {
}
void FindInFilesPanel::_on_item_edited() {
-
TreeItem *item = _results_display->get_selected();
if (item->is_checked(0)) {
- item->set_custom_color(1, _results_display->get_color("font_color"));
+ item->set_custom_color(1, _results_display->get_theme_color("font_color"));
} else {
// Grey out
- Color color = _results_display->get_color("font_color");
+ Color color = _results_display->get_theme_color("font_color");
color.a /= 2.0;
item->set_custom_color(1, color);
}
}
void FindInFilesPanel::_on_finished() {
-
_status_label->set_text(TTR("Search complete"));
update_replace_buttons();
set_progress_visible(false);
+ _refresh_button->show();
_cancel_button->hide();
}
+void FindInFilesPanel::_on_refresh_button_clicked() {
+ start_search();
+}
+
void FindInFilesPanel::_on_cancel_button_clicked() {
stop_search();
}
void FindInFilesPanel::_on_result_selected() {
-
TreeItem *item = _results_display->get_selected();
Map<TreeItem *, Result>::Element *E = _result_items.find(item);
- if (E == NULL)
+ if (E == nullptr) {
return;
+ }
Result r = E->value();
TreeItem *file_item = item->get_parent();
@@ -753,31 +816,29 @@ void FindInFilesPanel::_on_replace_text_changed(String text) {
}
void FindInFilesPanel::_on_replace_all_clicked() {
-
String replace_text = get_replace_text();
- PoolStringArray modified_files;
+ PackedStringArray modified_files;
for (Map<String, TreeItem *>::Element *E = _file_items.front(); E; E = E->next()) {
-
TreeItem *file_item = E->value();
String fpath = file_item->get_metadata(0);
Vector<Result> locations;
for (TreeItem *item = file_item->get_children(); item; item = item->get_next()) {
-
- if (!item->is_checked(0))
+ if (!item->is_checked(0)) {
continue;
+ }
Map<TreeItem *, Result>::Element *F = _result_items.find(item);
- ERR_FAIL_COND(F == NULL);
+ ERR_FAIL_COND(F == nullptr);
locations.push_back(F->value());
}
if (locations.size() != 0) {
// Results are sorted by file, so we can batch replaces
apply_replaces_in_file(fpath, locations, replace_text);
- modified_files.append(fpath);
+ modified_files.push_back(fpath);
}
}
@@ -791,13 +852,11 @@ void FindInFilesPanel::_on_replace_all_clicked() {
class ConservativeGetLine {
public:
String get_line(FileAccess *f) {
-
_line_buffer.clear();
- CharType c = f->get_8();
+ char32_t c = f->get_8();
while (!f->eof_reached()) {
-
if (c == '\n') {
_line_buffer.push_back(c);
_line_buffer.push_back(0);
@@ -823,7 +882,6 @@ private:
};
void FindInFilesPanel::apply_replaces_in_file(String fpath, const Vector<Result> &locations, String new_text) {
-
// If the file is already open, I assume the editor will reload it.
// If there are unsaved changes, the user will be asked on focus,
// however that means either losing changes or losing replaces.
@@ -842,7 +900,6 @@ void FindInFilesPanel::apply_replaces_in_file(String fpath, const Vector<Result>
int offset = 0;
for (int i = 0; i < locations.size(); ++i) {
-
int repl_line_number = locations[i].line_number;
while (current_line < repl_line_number) {
@@ -884,11 +941,10 @@ void FindInFilesPanel::apply_replaces_in_file(String fpath, const Vector<Result>
}
String FindInFilesPanel::get_replace_text() {
- return _replace_line_edit->get_text().strip_edges();
+ return _replace_line_edit->get_text();
}
void FindInFilesPanel::update_replace_buttons() {
-
bool disabled = _finder->is_searching();
_replace_all_button->set_disabled(disabled);
@@ -899,14 +955,8 @@ void FindInFilesPanel::set_progress_visible(bool visible) {
}
void FindInFilesPanel::_bind_methods() {
-
ClassDB::bind_method("_on_result_found", &FindInFilesPanel::_on_result_found);
- ClassDB::bind_method("_on_item_edited", &FindInFilesPanel::_on_item_edited);
ClassDB::bind_method("_on_finished", &FindInFilesPanel::_on_finished);
- ClassDB::bind_method("_on_cancel_button_clicked", &FindInFilesPanel::_on_cancel_button_clicked);
- ClassDB::bind_method("_on_result_selected", &FindInFilesPanel::_on_result_selected);
- ClassDB::bind_method("_on_replace_text_changed", &FindInFilesPanel::_on_replace_text_changed);
- ClassDB::bind_method("_on_replace_all_clicked", &FindInFilesPanel::_on_replace_all_clicked);
ClassDB::bind_method("_draw_result_text", &FindInFilesPanel::draw_result_text);
ADD_SIGNAL(MethodInfo(SIGNAL_RESULT_SELECTED,
diff --git a/editor/find_in_files.h b/editor/find_in_files.h
index 327c3f1b5a..5f2c6ee174 100644
--- a/editor/find_in_files.h
+++ b/editor/find_in_files.h
@@ -69,7 +69,7 @@ protected:
private:
void _process();
void _iterate();
- void _scan_dir(String path, PoolStringArray &out_folders);
+ void _scan_dir(String path, PackedStringArray &out_folders);
void _scan_file(String fpath);
// Config
@@ -82,7 +82,7 @@ private:
// State
bool _searching;
String _current_dir;
- Vector<PoolStringArray> _folders_stack;
+ Vector<PackedStringArray> _folders_stack;
Vector<String> _files_to_scan;
int _initial_files_count;
};
@@ -97,32 +97,48 @@ class FindInFilesDialog : public AcceptDialog {
GDCLASS(FindInFilesDialog, AcceptDialog);
public:
+ enum FindInFilesMode {
+ SEARCH_MODE,
+ REPLACE_MODE
+ };
+
static const char *SIGNAL_FIND_REQUESTED;
static const char *SIGNAL_REPLACE_REQUESTED;
FindInFilesDialog();
void set_search_text(String text);
+ void set_replace_text(String text);
+
+ void set_find_in_files_mode(FindInFilesMode p_mode);
String get_search_text() const;
+ String get_replace_text() const;
bool is_match_case() const;
bool is_whole_words() const;
String get_folder() const;
Set<String> get_filter() const;
protected:
- static void _bind_methods();
-
void _notification(int p_what);
- void custom_action(const String &p_action);
+
+ void _visibility_changed();
+ void custom_action(const String &p_action) override;
+ static void _bind_methods();
private:
void _on_folder_button_pressed();
void _on_folder_selected(String path);
void _on_search_text_modified(String text);
void _on_search_text_entered(String text);
+ void _on_replace_text_entered(String text);
+ FindInFilesMode _mode;
LineEdit *_search_text_line_edit;
+
+ Label *_replace_label;
+ LineEdit *_replace_text_line_edit;
+
LineEdit *_folder_line_edit;
CheckBox *_match_case_checkbox;
CheckBox *_whole_words_checkbox;
@@ -151,6 +167,7 @@ public:
FindInFiles *get_finder() const { return _finder; }
void set_with_replace(bool with_replace);
+ void set_replace_text(String text);
void start_search();
void stop_search();
@@ -163,6 +180,7 @@ protected:
private:
void _on_result_found(String fpath, int line_number, int begin, int end, String text);
void _on_finished();
+ void _on_refresh_button_clicked();
void _on_cancel_button_clicked();
void _on_result_selected();
void _on_item_edited();
@@ -173,8 +191,7 @@ private:
int line_number;
int begin;
int end;
- float draw_begin;
- float draw_width;
+ int begin_trimmed;
};
void apply_replaces_in_file(String fpath, const Vector<Result> &locations, String new_text);
@@ -190,6 +207,7 @@ private:
Label *_search_text_label;
Tree *_results_display;
Label *_status_label;
+ Button *_refresh_button;
Button *_cancel_button;
ProgressBar *_progress_bar;
Map<String, TreeItem *> _file_items;
diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp
index 83259afb35..4e6e2d0237 100644
--- a/editor/groups_editor.cpp
+++ b/editor/groups_editor.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "groups_editor.h"
+
#include "editor/scene_tree_editor.h"
#include "editor_node.h"
#include "editor_scale.h"
@@ -67,7 +68,7 @@ void GroupDialog::_load_nodes(Node *p_current) {
keep = false;
}
- TreeItem *node = NULL;
+ TreeItem *node = nullptr;
NodePath path = scene_tree->get_edited_scene_root()->get_path_to(p_current);
if (keep && p_current->is_in_group(selected_group)) {
if (remove_filter->get_text().is_subsequence_ofi(String(p_current->get_name()))) {
@@ -88,12 +89,12 @@ void GroupDialog::_load_nodes(Node *p_current) {
node->set_metadata(0, path);
node->set_tooltip(0, path);
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(p_current, "Node");
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(p_current, "Node");
node->set_icon(0, icon);
if (!_can_edit(p_current, selected_group)) {
node->set_selectable(0, false);
- node->set_custom_color(0, get_color("disabled_font_color", "Editor"));
+ node->set_custom_color(0, groups->get_theme_color("disabled_font_color", "Editor"));
}
}
@@ -121,7 +122,7 @@ bool GroupDialog::_can_edit(Node *p_node, String p_group) {
}
void GroupDialog::_add_pressed() {
- TreeItem *selected = nodes_to_add->get_next_selected(NULL);
+ TreeItem *selected = nodes_to_add->get_next_selected(nullptr);
if (!selected) {
return;
@@ -150,7 +151,7 @@ void GroupDialog::_add_pressed() {
}
void GroupDialog::_removed_pressed() {
- TreeItem *selected = nodes_to_remove->get_next_selected(NULL);
+ TreeItem *selected = nodes_to_remove->get_next_selected(nullptr);
if (!selected) {
return;
@@ -197,13 +198,13 @@ void GroupDialog::_add_group(String p_name) {
}
String name = p_name.strip_edges();
- if (name == "" || groups->search_item_text(name)) {
+ if (name.empty() || groups->get_item_with_text(name)) {
return;
}
TreeItem *new_group = groups->create_item(groups_root);
new_group->set_text(0, name);
- new_group->add_button(0, get_icon("Remove", "EditorIcons"), 0);
+ new_group->add_button(0, groups->get_theme_icon("Remove", "EditorIcons"), 0);
new_group->set_editable(0, true);
new_group->select(0);
groups->ensure_cursor_is_visible();
@@ -299,8 +300,9 @@ void GroupDialog::_load_groups(Node *p_current) {
void GroupDialog::_delete_group_pressed(Object *p_item, int p_column, int p_id) {
TreeItem *ti = Object::cast_to<TreeItem>(p_item);
- if (!ti)
+ if (!ti) {
return;
+ }
String name = ti->get_text(0);
@@ -360,12 +362,12 @@ void GroupDialog::_delete_group_item(const String &p_name) {
void GroupDialog::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- add_button->set_icon(get_icon("Forward", "EditorIcons"));
- remove_button->set_icon(get_icon("Back", "EditorIcons"));
+ add_button->set_icon(groups->get_theme_icon("Forward", "EditorIcons"));
+ remove_button->set_icon(groups->get_theme_icon("Back", "EditorIcons"));
- add_filter->set_right_icon(get_icon("Search", "EditorIcons"));
+ add_filter->set_right_icon(groups->get_theme_icon("Search", "EditorIcons"));
add_filter->set_clear_button_enabled(true);
- remove_filter->set_right_icon(get_icon("Search", "EditorIcons"));
+ remove_filter->set_right_icon(groups->get_theme_icon("Search", "EditorIcons"));
remove_filter->set_clear_button_enabled(true);
} break;
}
@@ -388,40 +390,31 @@ void GroupDialog::edit() {
}
void GroupDialog::_bind_methods() {
- ClassDB::bind_method("_add_pressed", &GroupDialog::_add_pressed);
- ClassDB::bind_method("_removed_pressed", &GroupDialog::_removed_pressed);
- ClassDB::bind_method("_delete_group_pressed", &GroupDialog::_delete_group_pressed);
ClassDB::bind_method("_delete_group_item", &GroupDialog::_delete_group_item);
- ClassDB::bind_method("_group_selected", &GroupDialog::_group_selected);
- ClassDB::bind_method("_add_group_pressed", &GroupDialog::_add_group_pressed);
ClassDB::bind_method("_add_group", &GroupDialog::_add_group);
- ClassDB::bind_method("_add_filter_changed", &GroupDialog::_add_filter_changed);
- ClassDB::bind_method("_remove_filter_changed", &GroupDialog::_remove_filter_changed);
-
- ClassDB::bind_method("_group_renamed", &GroupDialog::_group_renamed);
ClassDB::bind_method("_rename_group_item", &GroupDialog::_rename_group_item);
ADD_SIGNAL(MethodInfo("group_edited"));
}
GroupDialog::GroupDialog() {
- set_custom_minimum_size(Size2(600, 400) * EDSCALE);
+ set_min_size(Size2(600, 400) * EDSCALE);
scene_tree = SceneTree::get_singleton();
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
- vbc->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
+ vbc->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
HBoxContainer *hbc = memnew(HBoxContainer);
vbc->add_child(hbc);
- hbc->set_v_size_flags(SIZE_EXPAND_FILL);
+ hbc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
VBoxContainer *vbc_left = memnew(VBoxContainer);
hbc->add_child(vbc_left);
- vbc_left->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc_left->set_h_size_flags(Control::SIZE_EXPAND_FILL);
Label *group_title = memnew(Label);
group_title->set_text(TTR("Groups"));
@@ -433,29 +426,29 @@ GroupDialog::GroupDialog() {
groups->set_select_mode(Tree::SELECT_SINGLE);
groups->set_allow_reselect(true);
groups->set_allow_rmb_select(true);
- groups->set_v_size_flags(SIZE_EXPAND_FILL);
- groups->add_constant_override("draw_guides", 1);
- groups->connect("item_selected", this, "_group_selected");
- groups->connect("button_pressed", this, "_delete_group_pressed");
- groups->connect("item_edited", this, "_group_renamed");
+ groups->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ groups->add_theme_constant_override("draw_guides", 1);
+ groups->connect("item_selected", callable_mp(this, &GroupDialog::_group_selected));
+ groups->connect("button_pressed", callable_mp(this, &GroupDialog::_delete_group_pressed));
+ groups->connect("item_edited", callable_mp(this, &GroupDialog::_group_renamed));
HBoxContainer *chbc = memnew(HBoxContainer);
vbc_left->add_child(chbc);
- chbc->set_h_size_flags(SIZE_EXPAND_FILL);
+ chbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
add_group_text = memnew(LineEdit);
chbc->add_child(add_group_text);
- add_group_text->set_h_size_flags(SIZE_EXPAND_FILL);
- add_group_text->connect("text_entered", this, "_add_group_pressed");
+ add_group_text->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ add_group_text->connect("text_entered", callable_mp(this, &GroupDialog::_add_group_pressed));
Button *add_group_button = memnew(Button);
add_group_button->set_text(TTR("Add"));
chbc->add_child(add_group_button);
- add_group_button->connect("pressed", this, "_add_group_pressed", varray(String()));
+ add_group_button->connect("pressed", callable_mp(this, &GroupDialog::_add_group_pressed), varray(String()));
VBoxContainer *vbc_add = memnew(VBoxContainer);
hbc->add_child(vbc_add);
- vbc_add->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc_add->set_h_size_flags(Control::SIZE_EXPAND_FILL);
Label *out_of_group_title = memnew(Label);
out_of_group_title->set_text(TTR("Nodes Not in Group"));
@@ -466,43 +459,44 @@ GroupDialog::GroupDialog() {
nodes_to_add->set_hide_root(true);
nodes_to_add->set_hide_folding(true);
nodes_to_add->set_select_mode(Tree::SELECT_MULTI);
- nodes_to_add->set_v_size_flags(SIZE_EXPAND_FILL);
- nodes_to_add->add_constant_override("draw_guides", 1);
- nodes_to_add->connect("item_selected", this, "_nodes_to_add_selected");
+ nodes_to_add->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ nodes_to_add->add_theme_constant_override("draw_guides", 1);
HBoxContainer *add_filter_hbc = memnew(HBoxContainer);
- add_filter_hbc->add_constant_override("separate", 0);
+ add_filter_hbc->add_theme_constant_override("separate", 0);
vbc_add->add_child(add_filter_hbc);
add_filter = memnew(LineEdit);
- add_filter->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_filter->set_h_size_flags(Control::SIZE_EXPAND_FILL);
add_filter->set_placeholder(TTR("Filter nodes"));
add_filter_hbc->add_child(add_filter);
- add_filter->connect("text_changed", this, "_add_filter_changed");
+ add_filter->connect("text_changed", callable_mp(this, &GroupDialog::_add_filter_changed));
VBoxContainer *vbc_buttons = memnew(VBoxContainer);
hbc->add_child(vbc_buttons);
- vbc_buttons->set_h_size_flags(SIZE_SHRINK_CENTER);
- vbc_buttons->set_v_size_flags(SIZE_SHRINK_CENTER);
+ vbc_buttons->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
+ vbc_buttons->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
- add_button = memnew(ToolButton);
+ add_button = memnew(Button);
+ add_button->set_flat(true);
add_button->set_text(TTR("Add"));
- add_button->connect("pressed", this, "_add_pressed");
+ add_button->connect("pressed", callable_mp(this, &GroupDialog::_add_pressed));
vbc_buttons->add_child(add_button);
vbc_buttons->add_spacer();
vbc_buttons->add_spacer();
vbc_buttons->add_spacer();
- remove_button = memnew(ToolButton);
+ remove_button = memnew(Button);
+ remove_button->set_flat(true);
remove_button->set_text(TTR("Remove"));
- remove_button->connect("pressed", this, "_removed_pressed");
+ remove_button->connect("pressed", callable_mp(this, &GroupDialog::_removed_pressed));
vbc_buttons->add_child(remove_button);
VBoxContainer *vbc_remove = memnew(VBoxContainer);
hbc->add_child(vbc_remove);
- vbc_remove->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc_remove->set_h_size_flags(Control::SIZE_EXPAND_FILL);
Label *in_group_title = memnew(Label);
in_group_title->set_text(TTR("Nodes in Group"));
@@ -510,22 +504,21 @@ GroupDialog::GroupDialog() {
nodes_to_remove = memnew(Tree);
vbc_remove->add_child(nodes_to_remove);
- nodes_to_remove->set_v_size_flags(SIZE_EXPAND_FILL);
+ nodes_to_remove->set_v_size_flags(Control::SIZE_EXPAND_FILL);
nodes_to_remove->set_hide_root(true);
nodes_to_remove->set_hide_folding(true);
nodes_to_remove->set_select_mode(Tree::SELECT_MULTI);
- nodes_to_remove->add_constant_override("draw_guides", 1);
- nodes_to_remove->connect("item_selected", this, "_node_to_remove_selected");
+ nodes_to_remove->add_theme_constant_override("draw_guides", 1);
HBoxContainer *remove_filter_hbc = memnew(HBoxContainer);
- remove_filter_hbc->add_constant_override("separate", 0);
+ remove_filter_hbc->add_theme_constant_override("separate", 0);
vbc_remove->add_child(remove_filter_hbc);
remove_filter = memnew(LineEdit);
- remove_filter->set_h_size_flags(SIZE_EXPAND_FILL);
+ remove_filter->set_h_size_flags(Control::SIZE_EXPAND_FILL);
remove_filter->set_placeholder(TTR("Filter nodes"));
remove_filter_hbc->add_child(remove_filter);
- remove_filter->connect("text_changed", this, "_remove_filter_changed");
+ remove_filter->connect("text_changed", callable_mp(this, &GroupDialog::_remove_filter_changed));
group_empty = memnew(Label());
group_empty->set_text(TTR("Empty groups will be automatically removed."));
@@ -534,11 +527,9 @@ GroupDialog::GroupDialog() {
group_empty->set_autowrap(true);
group_empty->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
nodes_to_remove->add_child(group_empty);
- group_empty->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
+ group_empty->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
set_title(TTR("Group Editor"));
- set_as_toplevel(true);
- set_resizable(true);
error = memnew(ConfirmationDialog);
add_child(error);
@@ -548,16 +539,18 @@ GroupDialog::GroupDialog() {
////////////////////////////////////////////////////////////////////////////////
void GroupsEditor::_add_group(const String &p_group) {
-
- if (!node)
+ if (!node) {
return;
+ }
const String name = group_name->get_text().strip_edges();
- if (name.empty())
+ if (name.empty()) {
return;
+ }
- if (node->is_in_group(name))
+ if (node->is_in_group(name)) {
return;
+ }
undo_redo->create_action(TTR("Add to Group"));
@@ -576,13 +569,14 @@ void GroupsEditor::_add_group(const String &p_group) {
}
void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) {
-
- if (!node)
+ if (!node) {
return;
+ }
TreeItem *ti = Object::cast_to<TreeItem>(p_item);
- if (!ti)
+ if (!ti) {
return;
+ }
String name = ti->get_text(0);
@@ -601,18 +595,17 @@ void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) {
}
struct _GroupInfoComparator {
-
bool operator()(const Node::GroupInfo &p_a, const Node::GroupInfo &p_b) const {
return p_a.name.operator String() < p_b.name.operator String();
}
};
void GroupsEditor::update_tree() {
-
tree->clear();
- if (!node)
+ if (!node) {
return;
+ }
List<Node::GroupInfo> groups;
node->get_groups(&groups);
@@ -621,20 +614,18 @@ void GroupsEditor::update_tree() {
TreeItem *root = tree->create_item();
for (List<GroupInfo>::Element *E = groups.front(); E; E = E->next()) {
-
Node::GroupInfo gi = E->get();
- if (!gi.persistent)
+ if (!gi.persistent) {
continue;
+ }
Node *n = node;
bool can_be_deleted = true;
while (n) {
-
Ref<SceneState> ss = (n == EditorNode::get_singleton()->get_edited_scene()) ? n->get_scene_inherited_state() : n->get_scene_instance_state();
if (ss.is_valid()) {
-
int path = ss->find_node_by_path(n->get_path_to(node));
if (path != -1) {
if (ss->is_node_in_group(path, gi.name)) {
@@ -649,7 +640,7 @@ void GroupsEditor::update_tree() {
TreeItem *item = tree->create_item(root);
item->set_text(0, gi.name);
if (can_be_deleted) {
- item->add_button(0, get_icon("Remove", "EditorIcons"), 0);
+ item->add_button(0, get_theme_icon("Remove", "EditorIcons"), 0);
} else {
item->set_selectable(0, false);
}
@@ -657,62 +648,54 @@ void GroupsEditor::update_tree() {
}
void GroupsEditor::set_current(Node *p_node) {
-
node = p_node;
update_tree();
}
void GroupsEditor::_show_group_dialog() {
-
group_dialog->edit();
group_dialog->set_undo_redo(undo_redo);
}
void GroupsEditor::_bind_methods() {
-
- ClassDB::bind_method("_add_group", &GroupsEditor::_add_group);
- ClassDB::bind_method("_remove_group", &GroupsEditor::_remove_group);
ClassDB::bind_method("update_tree", &GroupsEditor::update_tree);
-
- ClassDB::bind_method("_show_group_dialog", &GroupsEditor::_show_group_dialog);
}
GroupsEditor::GroupsEditor() {
-
- node = NULL;
+ node = nullptr;
VBoxContainer *vbc = this;
group_dialog = memnew(GroupDialog);
- group_dialog->set_as_toplevel(true);
+
add_child(group_dialog);
- group_dialog->connect("group_edited", this, "update_tree");
+ group_dialog->connect("group_edited", callable_mp(this, &GroupsEditor::update_tree));
Button *group_dialog_button = memnew(Button);
group_dialog_button->set_text(TTR("Manage Groups"));
vbc->add_child(group_dialog_button);
- group_dialog_button->connect("pressed", this, "_show_group_dialog");
+ group_dialog_button->connect("pressed", callable_mp(this, &GroupsEditor::_show_group_dialog));
HBoxContainer *hbc = memnew(HBoxContainer);
vbc->add_child(hbc);
group_name = memnew(LineEdit);
- group_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ group_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hbc->add_child(group_name);
- group_name->connect("text_entered", this, "_add_group");
+ group_name->connect("text_entered", callable_mp(this, &GroupsEditor::_add_group));
add = memnew(Button);
add->set_text(TTR("Add"));
hbc->add_child(add);
- add->connect("pressed", this, "_add_group", varray(String()));
+ add->connect("pressed", callable_mp(this, &GroupsEditor::_add_group), varray(String()));
tree = memnew(Tree);
tree->set_hide_root(true);
- tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
vbc->add_child(tree);
- tree->connect("button_pressed", this, "_remove_group");
- tree->add_constant_override("draw_guides", 1);
- add_constant_override("separation", 3 * EDSCALE);
+ tree->connect("button_pressed", callable_mp(this, &GroupsEditor::_remove_group));
+ tree->add_theme_constant_override("draw_guides", 1);
+ add_theme_constant_override("separation", 3 * EDSCALE);
}
GroupsEditor::~GroupsEditor() {
diff --git a/editor/groups_editor.h b/editor/groups_editor.h
index 84c653bdea..d5daaa19eb 100644
--- a/editor/groups_editor.h
+++ b/editor/groups_editor.h
@@ -38,12 +38,10 @@
#include "scene/gui/item_list.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/popup.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
-class GroupDialog : public WindowDialog {
-
- GDCLASS(GroupDialog, WindowDialog);
+class GroupDialog : public AcceptDialog {
+ GDCLASS(GroupDialog, AcceptDialog);
ConfirmationDialog *error;
@@ -64,8 +62,8 @@ class GroupDialog : public WindowDialog {
Label *group_empty;
- ToolButton *add_button;
- ToolButton *remove_button;
+ Button *add_button;
+ Button *remove_button;
String selected_group;
@@ -104,7 +102,6 @@ public:
};
class GroupsEditor : public VBoxContainer {
-
GDCLASS(GroupsEditor, VBoxContainer);
Node *node;
diff --git a/editor/icons/2D.svg b/editor/icons/2D.svg
new file mode 100644
index 0000000000..afb9f4b45f
--- /dev/null
+++ b/editor/icons/2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-2 2a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l.29297-.29297v8.5859h8.5859l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l.29297.29297h-6.5859v-6.5859l.29297.29297a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.72266-.29102z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/3D.svg b/editor/icons/3D.svg
new file mode 100644
index 0000000000..501b47aca1
--- /dev/null
+++ b/editor/icons/3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.9902 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-2 2a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l.29297-.29297v8.5859h8.5859l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2a1 1 0 0 0 -.72266-.29102 1 1 0 0 0 -.69141.29102 1 1 0 0 0 0 1.4141l.29297.29297h-5.1719l5.5859-5.5859v.41602a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-2.8301a1.0001 1.0001 0 0 0 -1-1h-2.8301a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h.41602l-5.5859 5.5859v-5.1719l.29297.29297a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.72266-.29102z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/AABB.svg b/editor/icons/AABB.svg
new file mode 100644
index 0000000000..03ec25caf2
--- /dev/null
+++ b/editor/icons/AABB.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1a3 3 0 0 0 -3 3 3 3 0 0 0 .77734 2.0117 3 3 0 0 0 -2.7773 2.9883 3 3 0 0 0 3 3h2v-5h2v-6h-2zm6 0v5.1738a3 3 0 0 0 -1-.17383v-2h-2v8h2a3 3 0 0 0 3-3 3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2h-2zm-6 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm8 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm-10 3v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm7 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#ee7991"/><path d="m8 4v8h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2zm-5 2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-6zm0 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm7 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#fff" fill-opacity=".23529"/></svg>
diff --git a/editor/icons/AcceptDialog.svg b/editor/icons/AcceptDialog.svg
new file mode 100644
index 0000000000..d88ebd4cb2
--- /dev/null
+++ b/editor/icons/AcceptDialog.svg
@@ -0,0 +1 @@
+<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm9.4746 1.6367 1.4141 1.4141-4.9492 4.9492-2.8281-2.8281 1.4141-1.4141 1.4141 1.4141z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ActionCopy.svg b/editor/icons/ActionCopy.svg
new file mode 100644
index 0000000000..0d68290147
--- /dev/null
+++ b/editor/icons/ActionCopy.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.554 0-1 .446-1 1v9c0 .554.446 1 1 1h1v-9h9v-1c0-.554-.446-1-1-1zm3 3c-.554 0-1 .446-1 1v9c0 .554.446 1 1 1h9c.554 0 1-.446 1-1v-9c0-.554-.446-1-1-1zm1 2h7v7h-7z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ActionCut.svg b/editor/icons/ActionCut.svg
new file mode 100644
index 0000000000..a4ed2a2a15
--- /dev/null
+++ b/editor/icons/ActionCut.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.6348.50977c-2.9641 2.866.53553 8.9289 2.7676 8.7949l.44141.76562-.56445.97852a3 3 0 0 0 -2.2793-1.0488 3 3 0 0 0 -3 3 3 3 0 0 0 3 3 3 3 0 0 0 2.5938-1.502l.0039062.001953 1.4023-2.4277 1.4023 2.4277.0019531-.001953a3 3 0 0 0 2.5957 1.502 3 3 0 0 0 3-3 3 3 0 0 0 -3-3 3 3 0 0 0 -2.2773 1.0527l-.56641-.98242.44141-.76562c2.2321.13397 5.7317-5.9289 2.7676-8.7949l-4.3652 7.5605-4.3652-7.5605zm.36523 11.49a1 1 0 0 1 1 1 1 1 0 0 1 -.12305.47852l-.011719.021484a1 1 0 0 1 -.86523.5 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm8 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ActionPaste.svg b/editor/icons/ActionPaste.svg
new file mode 100644
index 0000000000..423bc7baab
--- /dev/null
+++ b/editor/icons/ActionPaste.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.3045 0-2.4033.8372-2.8164 2h-3.1836c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h12c.554 0 1-.446 1-1v-10c0-.554-.446-1-1-1h-3.1836c-.41312-1.1628-1.5119-2-2.8164-2zm0 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-5 2h2v2h6v-2h2v8h-10z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Add.svg b/editor/icons/Add.svg
new file mode 100644
index 0000000000..afad08a2e0
--- /dev/null
+++ b/editor/icons/Add.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/AddAtlasTile.svg b/editor/icons/AddAtlasTile.svg
new file mode 100644
index 0000000000..a6d94005a8
--- /dev/null
+++ b/editor/icons/AddAtlasTile.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#c9cfd4"/></svg>
diff --git a/editor/icons/AddAutotile.svg b/editor/icons/AddAutotile.svg
new file mode 100644
index 0000000000..52664b3eb6
--- /dev/null
+++ b/editor/icons/AddAutotile.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#4490fc"/></svg>
diff --git a/editor/icons/AddSingleTile.svg b/editor/icons/AddSingleTile.svg
new file mode 100644
index 0000000000..64bf1c99c0
--- /dev/null
+++ b/editor/icons/AddSingleTile.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#fce844"/></svg>
diff --git a/editor/icons/AddSplit.svg b/editor/icons/AddSplit.svg
new file mode 100644
index 0000000000..5c034d8d12
--- /dev/null
+++ b/editor/icons/AddSplit.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 13 10-10" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/><circle cx="4" cy="12" fill="none" r="2"/><path d="m13 1a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-10 10a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Anchor.svg b/editor/icons/Anchor.svg
new file mode 100644
index 0000000000..cb40970ba3
--- /dev/null
+++ b/editor/icons/Anchor.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8262v.17383h-2v2h2v3.8984a5 5 0 0 1 -3.8281-3.6035l-1.9336.51758a7 7 0 0 0 6.7617 5.1875 7 7 0 0 0 6.7617-5.1875l-1.9375-.51953a5 5 0 0 1 -3.8242 3.6035v-3.8965h2v-2h-2v-.17578a3 3 0 0 0 2-2.8242 3 3 0 0 0 -3-3zm0 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#a5efac"/></svg>
diff --git a/editor/icons/AnimatedSprite2D.svg b/editor/icons/AnimatedSprite2D.svg
new file mode 100644
index 0000000000..0c9d2933ee
--- /dev/null
+++ b/editor/icons/AnimatedSprite2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5b7f3"><path d="m7 0c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v6c1.108 0 2-.89199 2-2v-6c0-1.108-.89199-2-2-2z" fill-opacity=".39216"/><path d="m5 2c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2z" fill-opacity=".58824"/><path d="m3 4c-1.108 0-2 .89199-2 2v7c0 1.108.89199 2 2 2h7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2zm0 4c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm7 0c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm-6 4h5a2.5 2 0 0 1 -1.25 1.7324 2.5 2 0 0 1 -2.5 0 2.5 2 0 0 1 -1.25-1.7324z"/></g></svg>
diff --git a/editor/icons/AnimatedSprite3D.svg b/editor/icons/AnimatedSprite3D.svg
new file mode 100644
index 0000000000..b25ebae683
--- /dev/null
+++ b/editor/icons/AnimatedSprite3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc9c9c"><path d="m7 0c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v6c1.108 0 2-.89199 2-2v-6c0-1.108-.89199-2-2-2z" fill-opacity=".39216"/><path d="m5 2c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2z" fill-opacity=".58824"/><path d="m3 4c-1.108 0-2 .89199-2 2v7c0 1.108.89199 2 2 2h7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2zm0 4c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm7 0c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm-6 4h5a2.5 2 0 0 1 -1.25 1.7324 2.5 2 0 0 1 -2.5 0 2.5 2 0 0 1 -1.25-1.7324z"/></g></svg>
diff --git a/editor/icons/AnimatedTexture.svg b/editor/icons/AnimatedTexture.svg
new file mode 100644
index 0000000000..532573103f
--- /dev/null
+++ b/editor/icons/AnimatedTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><filter id="a" color-interpolation-filters="sRGB" height="1.024" width="1.024" x="-.012" y="-.012"><feGaussianBlur stdDeviation=".07"/></filter><path d="m1 1037.4v14h1.1667v-2h1.8333v2h8v-2h2v2h1v-14h-1v2h-2v-2h-8v2h-1.8333v-2zm1.1667 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2zm-9.8333 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2z" fill="#e0e0e0" filter="url(#a)" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Animation.svg b/editor/icons/Animation.svg
new file mode 100644
index 0000000000..917784badd
--- /dev/null
+++ b/editor/icons/Animation.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 4-1.5352v1.5352h.001953a2 2 0 0 0 .26562 1 2 2 0 0 0 1.7324 1h1v-1-1h-.5a.5.49999 0 0 1 -.5-.5v-.5-5a6 6 0 0 0 -6-6zm0 1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm3.4414 2a1 1 0 0 1 .88867.5 1 1 0 0 1 -.36523 1.3652 1 1 0 0 1 -1.3672-.36523 1 1 0 0 1 .36719-1.3652 1 1 0 0 1 .47656-.13477zm-6.9531.0019531a1 1 0 0 1 .54688.13281 1 1 0 0 1 .36719 1.3652 1 1 0 0 1 -1.3672.36523 1 1 0 0 1 -.36523-1.3652 1 1 0 0 1 .81836-.49805zm.023438 3.998a1 1 0 0 1 .89062.5 1 1 0 0 1 -.36719 1.3652 1 1 0 0 1 -1.3652-.36523 1 1 0 0 1 .36523-1.3652 1 1 0 0 1 .47656-.13477zm6.9043.0019531a1 1 0 0 1 .54883.13281 1 1 0 0 1 .36523 1.3652 1 1 0 0 1 -1.3652.36523 1 1 0 0 1 -.36719-1.3652 1 1 0 0 1 .81836-.49805zm-3.416 1.998a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/AnimationFilter.svg b/editor/icons/AnimationFilter.svg
new file mode 100644
index 0000000000..8a2b059348
--- /dev/null
+++ b/editor/icons/AnimationFilter.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m495.289 20.143h-478.58c-14.938 0-22.344 18.205-11.666 28.636l169.7 165.778v260.587c0 14.041 16.259 21.739 27.131 13.031l129.143-103.432c3.956-3.169 6.258-7.962 6.258-13.031v-157.156l169.68-165.777c10.688-10.44 3.259-28.636-11.666-28.636z" fill="#e0e0e0" transform="matrix(.02719109 0 0 .02719109 1.315346 1.002286)"/></svg>
diff --git a/editor/icons/AnimationPlayer.svg b/editor/icons/AnimationPlayer.svg
new file mode 100644
index 0000000000..52b6b02c15
--- /dev/null
+++ b/editor/icons/AnimationPlayer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1037.4v14h1.1667v-2h1.8333v2h8v-2h2v2h1v-14h-1v2h-2v-2h-8v2h-1.8333v-2zm1.1667 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2zm-9.8333 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2z" fill="#cea4f1" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/AnimationTrackGroup.svg b/editor/icons/AnimationTrackGroup.svg
new file mode 100644
index 0000000000..c5811e1bfa
--- /dev/null
+++ b/editor/icons/AnimationTrackGroup.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m5.0508475 2v2h8.9491525v-2zm-3.322034-.016949v2h2v-2zm7.2542373 5.016949v2h5.0169492v-2zm-3.5254237 5v2h2v-2zm3.5254237 0v2h5.0169492v-2z"/><path d="m5.4915255 6.9322039v1.999999h2v-1.999999z"/></g></svg>
diff --git a/editor/icons/AnimationTrackList.svg b/editor/icons/AnimationTrackList.svg
new file mode 100644
index 0000000000..3ba4915350
--- /dev/null
+++ b/editor/icons/AnimationTrackList.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/AnimationTree.svg b/editor/icons/AnimationTree.svg
new file mode 100644
index 0000000000..d6484097c9
--- /dev/null
+++ b/editor/icons/AnimationTree.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h1.166v-2h1.834v2h8v-2h2v2h1v-14h-1v2h-2v-2h-8v2h-1.834v-2zm4 3h2v1 1h1 3v2h-2v1 1h1 1v2h-1-2a1.0001 1.0001 0 0 1 -1-1v-1-2h-1a1.0001 1.0001 0 0 1 -1-1v-1-1zm-2.834 1h1.834v2h-1.834zm9.834 0h2v2h-2zm-9.834 4h1.834v2h-1.834zm9.834 0h2v2h-2z" fill="#cea4f1"/></svg>
diff --git a/editor/icons/Area2D.svg b/editor/icons/Area2D.svg
new file mode 100644
index 0000000000..005f70ed48
--- /dev/null
+++ b/editor/icons/Area2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 2h2v-2h2v-2zm10 0v2h2v2h2v-4zm-7 3v2 4 2h8v-2-6zm2 2h4v4h-4zm-5 5v2 2h2 2v-2h-2v-2zm12 0v2h-2v2h4v-2-2z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/Area3D.svg b/editor/icons/Area3D.svg
new file mode 100644
index 0000000000..4be8a2cced
--- /dev/null
+++ b/editor/icons/Area3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 2h2v-2h2v-2zm10 0v2h2v2h2v-4zm-7 3v2 4 2h8v-2-6zm2 2h4v4h-4zm-5 5v2 2h2 2v-2h-2v-2zm12 0v2h-2v2h4v-2-2z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/Array.svg b/editor/icons/Array.svg
new file mode 100644
index 0000000000..068007bb29
--- /dev/null
+++ b/editor/icons/Array.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 4a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-6zm6 0a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2zm4 0a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2zm-10 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ArrayMesh.svg b/editor/icons/ArrayMesh.svg
new file mode 100644
index 0000000000..3a33a966aa
--- /dev/null
+++ b/editor/icons/ArrayMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm10 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-2 7v3h-3v2h3v3h2v-3h3v-2h-3v-3zm-8 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#ffd684"/></svg>
diff --git a/editor/icons/ArrowDown.svg b/editor/icons/ArrowDown.svg
new file mode 100644
index 0000000000..d24357d2c5
--- /dev/null
+++ b/editor/icons/ArrowDown.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 3.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2.293 2.293h-4.5859c-.55228 0-1 .4477-1 1s.44772 1 1 1h4.5859l-2.293 2.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l4-4a1.0001 1.0001 0 0 0 0-1.4141l-4-4a1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" fill-opacity=".99608" transform="matrix(0 1 -1 0 16.0021 -.00004)"/></svg>
diff --git a/editor/icons/ArrowLeft.svg b/editor/icons/ArrowLeft.svg
new file mode 100644
index 0000000000..ddd2f4e353
--- /dev/null
+++ b/editor/icons/ArrowLeft.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9863 3.002a1 1 0 0 0 -.69336.29102l-4 4a1.0001 1.0001 0 0 0 0 1.4141l4 4a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2.293-2.293h4.5859a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-4.5859l2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ArrowRight.svg b/editor/icons/ArrowRight.svg
new file mode 100644
index 0000000000..a0c78dc1eb
--- /dev/null
+++ b/editor/icons/ArrowRight.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 3.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2.293 2.293h-4.5859c-.55228 0-1 .4477-1 1s.44772 1 1 1h4.5859l-2.293 2.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l4-4a1.0001 1.0001 0 0 0 0-1.4141l-4-4a1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ArrowUp.svg b/editor/icons/ArrowUp.svg
new file mode 100644
index 0000000000..f71f95c7b1
--- /dev/null
+++ b/editor/icons/ArrowUp.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.00008 1049.4022a1 1 0 0 0 .69336-.291 1 1 0 0 0 0-1.4141l-2.293-2.293h4.5859c.55228 0 1-.4477 1-1s-.44772-1-1-1h-4.5859l2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -1.4141 0l-4 4a1.0001 1.0001 0 0 0 0 1.4141l4 4a1 1 0 0 0 .7207.291z" fill="#e0e0e0" fill-opacity=".99608" transform="matrix(0 1 -1 0 1052.4021 -.00004)"/></svg>
diff --git a/editor/icons/AssetLib.svg b/editor/icons/AssetLib.svg
new file mode 100644
index 0000000000..22307efde3
--- /dev/null
+++ b/editor/icons/AssetLib.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="2"><path d="m8 1v9l4-4"/><path d="m8 10-4-4"/><path d="m2 10v4h12v-4" stroke-linecap="round"/></g></svg>
diff --git a/editor/icons/AtlasTexture.svg b/editor/icons/AtlasTexture.svg
new file mode 100644
index 0000000000..e261d372d1
--- /dev/null
+++ b/editor/icons/AtlasTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1037.4-5 2v12l5-2 4 2 5-2v-12l-5 2zm0 2 4 2v8l-4-2z" fill="#e0e0e0" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/AudioBusBypass.svg b/editor/icons/AudioBusBypass.svg
new file mode 100644
index 0000000000..2723f847eb
--- /dev/null
+++ b/editor/icons/AudioBusBypass.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 3c-.55226.0000552-.99994.44774-1 1v8c.0000552.55226.44774.99994 1 1h4c1.0702 0 2.0645-.5732 2.5996-1.5s.5351-2.0732 0-3c-.40058-.69381-1.058-1.1892-1.8125-1.3945.33452-.84425.27204-1.8062-.18945-2.6055-.5351-.9268-1.5275-1.5-2.5977-1.5zm1 2h1c.35887 0 .6858.1892.86523.5s.17943.6892 0 1-.50637.5-.86523.5h-1zm0 4h1 2c.35887 0 .68775.1892.86719.5.17943.3108.17943.6892 0 1-.17944.3108-.50832.5-.86719.5h-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/AudioBusLayout.svg b/editor/icons/AudioBusLayout.svg
new file mode 100644
index 0000000000..3b1f3e7a0d
--- /dev/null
+++ b/editor/icons/AudioBusLayout.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m3 1c-1.108 0-2 .89199-2 2v10c0 1.108.89199 2 2 2h2c1.108 0 2-.89199 2-2v-10c0-1.108-.89199-2-2-2zm8 0c-1.108 0-2 .89199-2 2v10c0 1.108.89199 2 2 2h2c1.108 0 2-.89199 2-2v-10c0-1.108-.89199-2-2-2zm-8 1h2c.55401 0 1 .44599 1 1v10c0 .55401-.44599 1-1 1h-2c-.55401 0-1-.44599-1-1v-10c0-.55401.44599-1 1-1z" fill="url(#a)"/></svg>
diff --git a/editor/icons/AudioBusMute.svg b/editor/icons/AudioBusMute.svg
new file mode 100644
index 0000000000..dbfcc81107
--- /dev/null
+++ b/editor/icons/AudioBusMute.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1048.4v-8l4 5 4-5v8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/AudioBusSolo.svg b/editor/icons/AudioBusSolo.svg
new file mode 100644
index 0000000000..4065bdc630
--- /dev/null
+++ b/editor/icons/AudioBusSolo.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 3a1 1 0 0 0 -.12695.0078125c-1.0208.043703-1.957.60248-2.4707 1.4922-.5351.9268-.5351 2.0732 0 3s1.5275 1.5 2.5977 1.5h2c.35887 0 .6858.1892.86523.5s.17943.6892 0 1-.50637.5-.86523.5h-3a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h3c1.0702 0 2.0626-.5732 2.5977-1.5s.5351-2.0732 0-3-1.5275-1.5-2.5977-1.5h-2c-.35887 0-.6858-.1892-.86523-.5s-.17943-.6892 0-1 .50637-.5.86523-.5h3a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/AudioStreamOGGVorbis.svg b/editor/icons/AudioStreamOGGVorbis.svg
new file mode 100644
index 0000000000..900d5873fe
--- /dev/null
+++ b/editor/icons/AudioStreamOGGVorbis.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m11.971 1.002c-.08326.00207-.16593.014541-.24609.037109l-7 2c-.42881.12287-.7244.51487-.72461.96094v5.5508c-.16454-.033679-.33205-.050692-.5-.050781-1.3807 0-2.5 1.1193-2.5 2.5-.00000475 1.3807 1.1193 2.5 2.5 2.5 1.3456-.0013 2.4488-1.0674 2.4961-2.4121.0025906-.029226.003894-.058551.0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5c-.000916-.56314-.4664-1.0145-1.0293-.99805zm-1.4707 6.998c-.277 0-.5.223-.5.5v5c0 .277.223.5.5.5s.5-.223.5-.5v-5c0-.277-.223-.5-.5-.5zm2 1c-.277 0-.5.223-.5.5v3c0 .277.223.5.5.5s.5-.223.5-.5v-3c0-.277-.223-.5-.5-.5zm-4 1c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5zm6 0c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5z" fill="url(#a)"/></svg>
diff --git a/editor/icons/AudioStreamPlayer.svg b/editor/icons/AudioStreamPlayer.svg
new file mode 100644
index 0000000000..48aa7c2904
--- /dev/null
+++ b/editor/icons/AudioStreamPlayer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m10.023 1044.4c-.56139-.013-1.0235.4264-1.0234.9724v5.0542c.0006911.7482.83361 1.2154 1.5.8414l4-2.5262c.66694-.3743.66694-1.3104 0-1.6847l-4-2.5261c-.14505-.082-.30893-.1269-.47656-.131z" fill="#e0e0e0"/><path d="m11.971 1.002a1.0001 1.0001 0 0 0 -.24609.037109l-7 2a1.0001 1.0001 0 0 0 -.72461.96094v5.5508a2.5 2.5 0 0 0 -.5-.050781 2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.4961-2.4121 1.0001 1.0001 0 0 0 .0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5a1.0001 1.0001 0 0 0 -1.0293-.99805z" fill="url(#a)" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/AudioStreamPlayer2D.svg b/editor/icons/AudioStreamPlayer2D.svg
new file mode 100644
index 0000000000..21cf751c92
--- /dev/null
+++ b/editor/icons/AudioStreamPlayer2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m10.023 1044.4c-.56139-.013-1.0235.4264-1.0234.9724v5.0542c.0006911.7482.83361 1.2154 1.5.8414l4-2.5262c.66694-.3743.66694-1.3104 0-1.6847l-4-2.5261c-.14505-.082-.30893-.1269-.47656-.131z" fill="#a5b7f3"/><path d="m11.971 1.002a1.0001 1.0001 0 0 0 -.24609.037109l-7 2a1.0001 1.0001 0 0 0 -.72461.96094v5.5508a2.5 2.5 0 0 0 -.5-.050781 2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.4961-2.4121 1.0001 1.0001 0 0 0 .0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5a1.0001 1.0001 0 0 0 -1.0293-.99805z" fill="url(#a)" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/AudioStreamPlayer3D.svg b/editor/icons/AudioStreamPlayer3D.svg
new file mode 100644
index 0000000000..d1e39e62f3
--- /dev/null
+++ b/editor/icons/AudioStreamPlayer3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m10.023 1044.4c-.56139-.013-1.0235.4264-1.0234.9724v5.0542c.0006911.7482.83361 1.2154 1.5.8414l4-2.5262c.66694-.3743.66694-1.3104 0-1.6847l-4-2.5261c-.14505-.082-.30893-.1269-.47656-.131z" fill="#fc9c9c"/><path d="m11.971 1.002a1.0001 1.0001 0 0 0 -.24609.037109l-7 2a1.0001 1.0001 0 0 0 -.72461.96094v5.5508a2.5 2.5 0 0 0 -.5-.050781 2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.4961-2.4121 1.0001 1.0001 0 0 0 .0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5a1.0001 1.0001 0 0 0 -1.0293-.99805z" fill="url(#a)" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/AudioStreamSample.svg b/editor/icons/AudioStreamSample.svg
new file mode 100644
index 0000000000..900d5873fe
--- /dev/null
+++ b/editor/icons/AudioStreamSample.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m11.971 1.002c-.08326.00207-.16593.014541-.24609.037109l-7 2c-.42881.12287-.7244.51487-.72461.96094v5.5508c-.16454-.033679-.33205-.050692-.5-.050781-1.3807 0-2.5 1.1193-2.5 2.5-.00000475 1.3807 1.1193 2.5 2.5 2.5 1.3456-.0013 2.4488-1.0674 2.4961-2.4121.0025906-.029226.003894-.058551.0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5c-.000916-.56314-.4664-1.0145-1.0293-.99805zm-1.4707 6.998c-.277 0-.5.223-.5.5v5c0 .277.223.5.5.5s.5-.223.5-.5v-5c0-.277-.223-.5-.5-.5zm2 1c-.277 0-.5.223-.5.5v3c0 .277.223.5.5.5s.5-.223.5-.5v-3c0-.277-.223-.5-.5-.5zm-4 1c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5zm6 0c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5z" fill="url(#a)"/></svg>
diff --git a/editor/icons/AutoEnd.svg b/editor/icons/AutoEnd.svg
new file mode 100644
index 0000000000..b5d925c92e
--- /dev/null
+++ b/editor/icons/AutoEnd.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m13.999798 14c.552262-.000055.999945-.447738 1-1v-10c-.000055-.5522619-.447738-.9999448-1-1h-8.0000004c-.3038627-.0001753-.5913245.1378063-.78125.375l-4 5c-.29139692.3649711-.29139692.8830289 0 1.248l4 5c.189538.237924.4770584.376652.78125.37695h8.0000004zm-1-2h-6.5195004l-3.1992-4 3.1992-4h6.5195004zm-6.0000004-2v-4l-2 2z" fill-rule="evenodd"/><path d="m15.129502-36.414393h20.292969v5.683593h-12.773437v5.429688h12.011718v5.683594h-12.011718v6.679687h13.203125v5.6835938h-20.722657z" transform="matrix(.20475474 0 0 .20475474 4.790386 12.365563)"/></g></svg>
diff --git a/editor/icons/AutoKey.svg b/editor/icons/AutoKey.svg
new file mode 100644
index 0000000000..acc6665baf
--- /dev/null
+++ b/editor/icons/AutoKey.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><circle cx="8" cy="5" r="4"/><path d="m11 13c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1 .00001-.55228.44772-.99999 1-1h1v-2h-1c-1.6569 0-3 1.3431-3 3z" fill-opacity=".99608"/><path d="m4 10c-1.6569 0-3 1.3431-3 3v3h2v-3c.0000096-.5523.44772-1 1-1h1v-2z" fill-opacity=".99608"/><path d="m8 10c-3 0-3 3-3 3s0 3 3 3h1v-2h-1s-1 0-1-1h3 1s0-3-3-3zm-1 1h2v1h-2z"/></g></svg>
diff --git a/editor/icons/AutoPlay.svg b/editor/icons/AutoPlay.svg
new file mode 100644
index 0000000000..f1a6d426c9
--- /dev/null
+++ b/editor/icons/AutoPlay.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2a1.0001 1.0001 0 0 0 -1 1v10a1.0001 1.0001 0 0 0 1 1h8a1.0001 1.0001 0 0 0 .78125-.375l4-5a1.0001 1.0001 0 0 0 0-1.248l-4-5a1.0001 1.0001 0 0 0 -.78125-.37695h-8zm1 2h6.5195l3.1992 4-3.1992 4h-6.5195zm3 1c-1.1046 0-2 .8954-2 2v4h1v-2h2v2h1v-4c0-1.1046-.89543-2-2-2zm0 1a1 1 0 0 1 1 1v1h-2v-1a1 1 0 0 1 1-1zm3 0v4l2-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/AutoTriangle.svg b/editor/icons/AutoTriangle.svg
new file mode 100644
index 0000000000..fbd212f2ba
--- /dev/null
+++ b/editor/icons/AutoTriangle.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.2324219.67773438-7.58789065 14.61132762h14.71093775zm-1.2910157 4.76562502h2.2695313c.3451753.6237333.6845072 1.2654948 1.0195315 1.9238281.335023.6496.670835 1.3367865 1.005859 2.0644531.345175.7276004.695453 1.5033054 1.050781 2.3261714.355328.822934.731017 1.719254 1.126953 2.689454h-2.542968c-.111674-.311867-.238728-.631738-.38086-.960938-.131979-.329133-.264505-.659081-.396484-.988281h-4.1113281c-.1319787.3292-.2680243.659148-.4101563.988281-.1319786.3292-.2555135.649071-.3671875.960938h-2.4667969c.3959374-.9702.7716252-1.86652 1.1269532-2.689454.355328-.822866.702086-1.598571 1.0371094-2.3261714.3451759-.7276666.6790355-1.4148531 1.0039062-2.0644531.3350233-.6583333.6798282-1.3000948 1.0351562-1.9238281zm1.0820313 2.0390625c-.0507667.1299333-.126999.3080031-.2285156.5332031-.101522.2252-.2176307.4847635-.3496094.7792969-.1319793.2945333-.2809234.619476-.4433594.9746093-.1522833.3551338-.3082684.7273878-.4707031 1.1171878h3c-.162436-.3898-.3203736-.762054-.4726562-1.1171878-.1522834-.3551333-.299275-.680076-.4414063-.9746093-.1319793-.2945334-.2480874-.5540969-.3496094-.7792969-.1015226-.2252-.1832273-.4032698-.2441406-.5332031z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Back.svg b/editor/icons/Back.svg
new file mode 100644
index 0000000000..e98a583855
--- /dev/null
+++ b/editor/icons/Back.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 8 16" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m6 1038.4-4 6 4 6" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/BackBufferCopy.svg b/editor/icons/BackBufferCopy.svg
new file mode 100644
index 0000000000..9bd40395c0
--- /dev/null
+++ b/editor/icons/BackBufferCopy.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v11h5v-2h-3v-7h6v-2zm6 3v11h8v-11zm2 2h4v7h-4z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/Bake.svg b/editor/icons/Bake.svg
new file mode 100644
index 0000000000..9c652c76b3
--- /dev/null
+++ b/editor/icons/Bake.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v2h12v-2zm-1 3v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-9zm2 1h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm-9 2h10v6h-10zm3 1v1h4v-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/BakedLightmap.svg b/editor/icons/BakedLightmap.svg
new file mode 100644
index 0000000000..ea9efa55ba
--- /dev/null
+++ b/editor/icons/BakedLightmap.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v2h12v-2zm-1 3v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-9zm2 1h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm-9 2h10v6h-10zm3 1v1h4v-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/BakedLightmapData.svg b/editor/icons/BakedLightmapData.svg
new file mode 100644
index 0000000000..f5dcfb618b
--- /dev/null
+++ b/editor/icons/BakedLightmapData.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h2v-2zm4 0v2h6v-2zm-7 3v2h2v-2zm3 0v2h2v-2zm4 0v3h5v6h-5v2h5a2 2 0 0 0 2-2v-9zm1 1h1v1h-1zm3 0h1v1h-1zm-11 2v2h2v-2zm3 0v2h2v-2zm4 1v1h2v-1zm-7 2v2h2v-2zm3 0v2h2v-2zm-3 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Basis.svg b/editor/icons/Basis.svg
new file mode 100644
index 0000000000..5ff892888a
--- /dev/null
+++ b/editor/icons/Basis.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v8h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2zm10 0v2h2v-2zm-3 2a2 2 0 0 0 -1.7324 1 2 2 0 0 0 0 2 2 2 0 0 0 1.7324 1h-2v2h2a2 2 0 0 0 1.7324-1 2 2 0 0 0 0-2 2 2 0 0 0 -1.7324-1h2v-2zm7 0a2 2 0 0 0 -1.7324 1 2 2 0 0 0 0 2 2 2 0 0 0 1.7324 1h-2v-2h-2v4h4a2 2 0 0 0 1.7324-1 2 2 0 0 0 0-2 2 2 0 0 0 -1.7324-1h2v-2zm-12 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#e3ec69"/><path d="m10 2v2h2v-2zm0 4v4h2v-4z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/BezierHandlesBalanced.svg b/editor/icons/BezierHandlesBalanced.svg
new file mode 100644
index 0000000000..e4b8ae12e3
--- /dev/null
+++ b/editor/icons/BezierHandlesBalanced.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.7627119 13.627119s1.2881355-6.847458 6.5762712-8.1355935c5.0847459.9491522 5.9661009 8.1355925 5.9661009 8.1355925" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="1.7"/><ellipse cx="1.898304" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><ellipse cx="14.237288" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><path d="m7.4559186 5.1473018-4.7355323 1.5541798" fill="none" stroke="#84c2ff" stroke-width=".618"/><path d="m10.790357 4.2063094-2.5009748.9433136" fill="none" stroke="#84c2ff" stroke-width=".614897"/><g fill="#e0e0e0"><ellipse cx="8.271187" cy="4.779661" rx="1.267586" ry="1.199789"/><path d="m1.7157324 5.8754878a1.2675855 1.1997888 0 0 0 -1.26757806 1.1992188 1.2675855 1.1997888 0 0 0 1.26757806 1.1992187 1.2675855 1.1997888 0 0 0 1.2675781-1.1992187 1.2675855 1.1997888 0 0 0 -1.2675781-1.1992188zm.00195.4238282a.84677333.80148375 0 0 1 .8476593.8007812.84677333.80148375 0 0 1 -.8476562.8007812.84677333.80148375 0 0 1 -.84765616-.8007812.84677333.80148375 0 0 1 .84765616-.8007812z"/><path d="m11.909414 2.4642073a1.2836218 1.231838 0 0 0 -1.283614 1.2312528 1.2836218 1.231838 0 0 0 1.283614 1.2312527 1.2836218 1.231838 0 0 0 1.283614-1.2312527 1.2836218 1.231838 0 0 0 -1.283614-1.2312528zm.002.4351497a.85748593.82289328 0 0 1 .858383.8221719.85748593.82289328 0 0 1 -.85838.822172.85748593.82289328 0 0 1 -.858379-.822172.85748593.82289328 0 0 1 .858379-.8221719z"/></g></svg>
diff --git a/editor/icons/BezierHandlesFree.svg b/editor/icons/BezierHandlesFree.svg
new file mode 100644
index 0000000000..88f8146871
--- /dev/null
+++ b/editor/icons/BezierHandlesFree.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.7627119 13.627119s1.2881355-6.847458 6.5762712-8.1355935c5.0847459.9491522 5.9661009 8.1355925 5.9661009 8.1355925" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="1.7"/><ellipse cx="1.898304" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><ellipse cx="14.237288" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><path d="m7.6850253 4.7560401-3.776127.6607599" fill="none" stroke="#84c2ff" stroke-width=".805138"/><path d="m11.695505 2.3941651-2.999121 2.2935078" fill="none" stroke="#84c2ff" stroke-width=".730798"/><g fill="#e0e0e0"><ellipse cx="8.271187" cy="4.779661" rx="1.267586" ry="1.199789"/><path d="m2.4961199 4.3976698a1.1997888 1.2675855 80.074672 0 0 -1.0419038 1.3997559 1.1997888 1.2675855 80.074672 0 0 1.4553094.9627848 1.1997888 1.2675855 80.074672 0 0 1.0419037-1.3997558 1.1997888 1.2675855 80.074672 0 0 -1.4553093-.9627849zm.074974.4171488a.80148375.84677333 80.074672 0 1 .9729986.6426896.80148375.84677333 80.074672 0 1 -.6969432.934902.80148375.84677333 80.074672 0 1 -.9729958-.6426902.80148375.84677333 80.074672 0 1 .6969432-.934902z"/><path d="m11.838896.64428913a1.231838 1.2836218 52.593897 0 0 -.271701 1.75779027 1.231838 1.2836218 52.593897 0 0 1.767576.1983008 1.231838 1.2836218 52.593897 0 0 .271701-1.75779027 1.231838 1.2836218 52.593897 0 0 -1.767576-.1983008zm.265925.3444462a.82289328.85748593 52.593897 0 1 1.181294.13165847.82289328.85748593 52.593897 0 1 -.182417 1.1745241.82289328.85748593 52.593897 0 1 -1.181291-.1316609.82289328.85748593 52.593897 0 1 .182417-1.17452347z"/></g></svg>
diff --git a/editor/icons/BezierHandlesMirror.svg b/editor/icons/BezierHandlesMirror.svg
new file mode 100644
index 0000000000..3a4b75ee96
--- /dev/null
+++ b/editor/icons/BezierHandlesMirror.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.7627119 13.627119s1.2881355-6.847458 6.5762712-8.1355935c5.0847459.9491522 5.9661009 8.1355925 5.9661009 8.1355925" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="1.7"/><ellipse cx="1.898304" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><ellipse cx="14.237288" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><path d="m8.2033896 4.6779662h-3.8335021" fill="none" stroke="#84c2ff" stroke-width=".805138"/><path d="m11.931789 4.6440679h-3.7283994" fill="none" stroke="#84c2ff" stroke-width=".716709"/><g fill="#e0e0e0"><ellipse cx="8.271187" cy="4.779661" rx="1.267586" ry="1.199789"/><path d="m3.1539157 3.4305762a1.2675855 1.1997888 0 0 0 -1.2675781 1.1992188 1.2675855 1.1997888 0 0 0 1.2675781 1.1992187 1.2675855 1.1997888 0 0 0 1.2675781-1.1992187 1.2675855 1.1997888 0 0 0 -1.2675781-1.1992188zm.00195.4238282a.84677333.80148375 0 0 1 .8476593.8007812.84677333.80148375 0 0 1 -.8476562.8007812.84677333.80148375 0 0 1 -.8476562-.8007812.84677333.80148375 0 0 1 .8476562-.8007812z"/><path d="m13.093969 3.3750567a1.2675855 1.1997888 0 0 0 -1.267578 1.1992188 1.2675855 1.1997888 0 0 0 1.267578 1.1992187 1.2675855 1.1997888 0 0 0 1.267578-1.1992187 1.2675855 1.1997888 0 0 0 -1.267578-1.1992188zm.002.4238282a.84677333.80148375 0 0 1 .847659.8007812.84677333.80148375 0 0 1 -.847656.8007812.84677333.80148375 0 0 1 -.847656-.8007812.84677333.80148375 0 0 1 .847656-.8007812z"/></g></svg>
diff --git a/editor/icons/BitMap.svg b/editor/icons/BitMap.svg
new file mode 100644
index 0000000000..703c958ee3
--- /dev/null
+++ b/editor/icons/BitMap.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm2 2v2h2v-2zm2 0h2v-2h-2zm2 0v2h2v-2zm2 0h2v-2h-2zm2 0v2h2v-2zm2 0h2v-2h-2zm0 2v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm-2 0h-2v2h2zm-2 0v-2h-2v2zm-2 0h-2v2h2zm-2 0v-2h-2v2zm-2 0h-2v2h2zm0-2v-2h-2v2zm0-2h2v-2h-2zm0-2v-2h-2v2zm2 0h2v-2h-2zm2 0v2h2v-2zm2 0h2v-2h-2zm0 2v2h2v-2zm-2 0h-2v2h2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/BitmapFont.svg b/editor/icons/BitmapFont.svg
new file mode 100644
index 0000000000..d3ab5f7dd7
--- /dev/null
+++ b/editor/icons/BitmapFont.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1037.4v4h1v-1h1v-1h4v10h-1v1h-1v1h6v-1h-1v-1h-1v-10h4v1h1v1h1v-4z" fill="#84c2ff" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Blend.svg b/editor/icons/Blend.svg
new file mode 100644
index 0000000000..4de2fa5a43
--- /dev/null
+++ b/editor/icons/Blend.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1v2h2.5859l-3.5859 3.5859-4.293-4.293-1.4141 1.4141 4.293 4.293-4.293 4.293 1.4141 1.4141 4.293-4.293 3.5859 3.5859h-2.5859v2h5a1.0001 1.0001 0 0 0 1-1v-5h-2v2.5859l-3.5859-3.5859 3.5859-3.5859v2.5859h2v-5a1.0001 1.0001 0 0 0 -1-1h-5z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Bone.svg b/editor/icons/Bone.svg
new file mode 100644
index 0000000000..cbfa4794ed
--- /dev/null
+++ b/editor/icons/Bone.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Bone2D.svg b/editor/icons/Bone2D.svg
new file mode 100644
index 0000000000..2298022d6a
--- /dev/null
+++ b/editor/icons/Bone2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#a5b7f3" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/BoneAttachment3D.svg b/editor/icons/BoneAttachment3D.svg
new file mode 100644
index 0000000000..2f2a9cdae5
--- /dev/null
+++ b/editor/icons/BoneAttachment3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#fc9c9c" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/BoneTrack.svg b/editor/icons/BoneTrack.svg
new file mode 100644
index 0000000000..34fb76e696
--- /dev/null
+++ b/editor/icons/BoneTrack.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#cea4f1" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/BoxShape3D.svg b/editor/icons/BoxShape3D.svg
new file mode 100644
index 0000000000..f9012d1fe4
--- /dev/null
+++ b/editor/icons/BoxShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3v-8z" fill="#2998ff" transform="translate(0 1036.4)"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#68b6ff"/><path d="m1 1040.4 7 3 7-3-7-3z" fill="#a2d2ff"/></g></svg>
diff --git a/editor/icons/Bucket.svg b/editor/icons/Bucket.svg
new file mode 100644
index 0000000000..a30fce3112
--- /dev/null
+++ b/editor/icons/Bucket.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke-width="1.325447" transform="matrix(.53348552 .53348552 -.53348552 .53348552 561.06065 -551.99594)"><path d="m2 1c-.5522355.0001-.9999477.4477-1 1v1.5h2.8847656a1.4999877 1.5 0 0 1 1.1152344-.5 1.4999877 1.5 0 0 1 1.5 1.5 1.4999877 1.5 0 0 1 -1.5 1.5 1.4999877 1.5 0 0 1 -1.1152344-.5h-2.8847656v1.5h-1.26953125-1.73046875c-.5522769 0-.999989-.4477-1-1 .000011-.5523.4477231-1 1-1h3 2.5878906.546875a1 1 0 0 0 .8652344.5 1 1 0 0 0 1-1 1 1 0 0 0 -1-1 1 1 0 0 0 -.8632812.5h-.5488282-2.5878906-3c-1.1045647 0-1.9999933.8954285-2 2 .0000067 1.1045715.8954353 2 2 2h3v6c.0000735.5523.4477232.9999 1 1h8c.552235-.0001.999947-.4477 1-1v-13z" stroke-width="1.325447" transform="translate(0 1036.4)"/><path d="m12 1038.4c.707107 3.5356.707107 3.5356 1.414213 4.2427.707107.7071 2.121321.7071 2.828428 0 .707106-.7071.707106-2.1213 0-2.8284-.707107-.7072-.707107-.7072-4.242641-1.4143z" fill-rule="evenodd"/></g></svg>
diff --git a/editor/icons/BusVuEmpty.svg b/editor/icons/BusVuEmpty.svg
new file mode 100644
index 0000000000..32a27e26b5
--- /dev/null
+++ b/editor/icons/BusVuEmpty.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 16 128" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="926.36" y2="1050.36"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -924.36)"><path d="m3 926.36c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill="url(#a)"/><path d="m3 2c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill-opacity=".19608" transform="translate(0 924.36)"/></g></svg>
diff --git a/editor/icons/BusVuFrozen.svg b/editor/icons/BusVuFrozen.svg
new file mode 100644
index 0000000000..a78b83a644
--- /dev/null
+++ b/editor/icons/BusVuFrozen.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 16 128" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="2" y2="126"><stop offset="0" stop-color="#62aeff"/><stop offset=".5" stop-color="#75d1e6"/><stop offset="1" stop-color="#84ffee"/></linearGradient><path d="m3 2c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill="url(#a)" opacity=".7"/></svg>
diff --git a/editor/icons/BusVuFull.svg b/editor/icons/BusVuFull.svg
new file mode 100644
index 0000000000..acfa742d18
--- /dev/null
+++ b/editor/icons/BusVuFull.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 16 128" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="2" y2="126"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m3 2c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill="url(#a)"/></svg>
diff --git a/editor/icons/Button.svg b/editor/icons/Button.svg
new file mode 100644
index 0000000000..6046038289
--- /dev/null
+++ b/editor/icons/Button.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3.1328l-1.4453-.96484-1.1094 1.6641 3 2a1.0001 1.0001 0 0 0 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm-1.5 8c-.831 0-1.5.669-1.5 1.5v1.5h-2v2h12v-2h-2v-1.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ButtonGroup.svg b/editor/icons/ButtonGroup.svg
new file mode 100644
index 0000000000..0fd49f0646
--- /dev/null
+++ b/editor/icons/ButtonGroup.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1c-.554 0-1 .446-1 1v12c0 .554.446 1 1 1h8c.554 0 1-.446 1-1v-12c0-.554-.446-1-1-1zm1 1h2c.554 0 1 .446 1 1s-.446 1-1 1h-2c-.554 0-1-.446-1-1s.446-1 1-1zm6 0c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-5 4a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm5 0c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm0 4c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-7 2h1v2h-1zm2 0h1v2h-1zm2 0h1v2h-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/CPUParticles2D.svg b/editor/icons/CPUParticles2D.svg
new file mode 100644
index 0000000000..29770bc240
--- /dev/null
+++ b/editor/icons/CPUParticles2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.5587261.60940813c-.4226244 0-.7617187.3410473-.7617187.76367177v.5078126c0 .1028478.020058.199689.056641.2890624h-1.1933597c-.4226245 0-.7617188.3390944-.7617188.7617188v.921875c-.040428-.00657-.0767989-.0234375-.1191406-.0234375h-.5078125c-.42262448 0-.76367188.3410475-.76367188.7636719v.3730468c0 .4226245.3410474.7617188.76367188.7617188h.5078125c.042396 0 .078663-.016851.1191406-.023437v4.4531248c-.040428-.0066-.076799-.02344-.1191406-.02344h-.5078125c-.42262448 0-.76367188.341047-.76367188.763672v.373047c0 .422625.3410474.761718.76367188.761718h.5078125c.042396 0 .078663-.01685.1191406-.02344v1.125c0 .422624.3390944.763672.7617188.763672h1.1367187v.457031c0 .422624.3390943.763672.7617187.763672h.3730469c.4226244 0 .7636719-.341048.7636719-.763672v-.457031h4.4062501v.457031c0 .422624.339094.763672.761719.763672h.373047c.422624 0 .763671-.341048.763671-.763672v-.457031h1.269532c.422625 0 .763672-.341048.763672-.763672v-1.111328c.01774.0012.03272.0098.05078.0098h.507812c.422624 0 .763672-.339093.763672-.761718v-.373047c0-.422624-.341048-.763672-.763672-.763672h-.507812c-.01803 0-.03307.0085-.05078.0098v-4.4258454c.01774.00122.03272.00977.05078.00977h.507812c.422624 0 .763672-.3390943.763672-.7617188v-.3730512c0-.4226244-.341048-.7636719-.763672-.7636719h-.507812c-.01803 0-.03307.00855-.05078.00977v-.9082075c0-.4226244-.341047-.7617187-.763672-.7617188h-1.328125c.03658-.089375.05859-.1862118.05859-.2890624v-.5078126c0-.42262437-.341047-.76367177-.763671-.76367177h-.373047c-.422625 0-.761719.3410474-.761719.76367177v.5078126c0 .1028478.02006.1996891.05664.2890624h-4.5214809c.036585-.0893749.0585938-.1862118.0585938-.2890624v-.5078126c0-.42262437-.3410475-.76367177-.7636719-.76367177zm3.2382813 2.35742177a3.279661 3.6440678 0 0 1 3.2128906 2.9394532 2.1864407 2.1864407 0 0 1 1.888672 2.1621094 2.1864407 2.1864407 0 0 1 -2.1875 2.1855475h-5.8300782a2.1864407 2.1864407 0 0 1 -2.1855469-2.1855475 2.1864407 2.1864407 0 0 1 1.8847656-2.1640626 3.279661 3.6440678 0 0 1 3.2167969-2.9375zm-2.9160156 8.0156251a.72881355.72881355 0 0 1 .7285156.728516.72881355.72881355 0 0 1 -.7285156.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm5.8300782 0a.72881355.72881355 0 0 1 .730469.728516.72881355.72881355 0 0 1 -.730469.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm-2.9140626.728516a.72881355.72881355 0 0 1 .7285156.730469.72881355.72881355 0 0 1 -.7285156.728515.72881355.72881355 0 0 1 -.7285156-.728515.72881355.72881355 0 0 1 .7285156-.730469z" fill="#a3b6f3" fill-opacity=".992157"/></svg>
diff --git a/editor/icons/CPUParticles3D.svg b/editor/icons/CPUParticles3D.svg
new file mode 100644
index 0000000000..072703cfa9
--- /dev/null
+++ b/editor/icons/CPUParticles3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.5587261.60940813c-.4226244 0-.7617187.3410473-.7617187.76367177v.5078126c0 .1028478.020058.199689.056641.2890624h-1.1933597c-.4226245 0-.7617188.3390944-.7617188.7617188v.921875c-.040428-.00657-.0767989-.0234375-.1191406-.0234375h-.5078125c-.42262448 0-.76367188.3410475-.76367188.7636719v.3730468c0 .4226245.3410474.7617188.76367188.7617188h.5078125c.042396 0 .078663-.016851.1191406-.023437v4.4531248c-.040428-.0066-.076799-.02344-.1191406-.02344h-.5078125c-.42262448 0-.76367188.341047-.76367188.763672v.373047c0 .422625.3410474.761718.76367188.761718h.5078125c.042396 0 .078663-.01685.1191406-.02344v1.125c0 .422624.3390944.763672.7617188.763672h1.1367187v.457031c0 .422624.3390943.763672.7617187.763672h.3730469c.4226244 0 .7636719-.341048.7636719-.763672v-.457031h4.4062501v.457031c0 .422624.339094.763672.761719.763672h.373047c.422624 0 .763671-.341048.763671-.763672v-.457031h1.269532c.422625 0 .763672-.341048.763672-.763672v-1.111328c.01774.0012.03272.0098.05078.0098h.507812c.422624 0 .763672-.339093.763672-.761718v-.373047c0-.422624-.341048-.763672-.763672-.763672h-.507812c-.01803 0-.03307.0085-.05078.0098v-4.4258454c.01774.00122.03272.00977.05078.00977h.507812c.422624 0 .763672-.3390943.763672-.7617188v-.3730512c0-.4226244-.341048-.7636719-.763672-.7636719h-.507812c-.01803 0-.03307.00855-.05078.00977v-.9082075c0-.4226244-.341047-.7617187-.763672-.7617188h-1.328125c.03658-.089375.05859-.1862118.05859-.2890624v-.5078126c0-.42262437-.341047-.76367177-.763671-.76367177h-.373047c-.422625 0-.761719.3410474-.761719.76367177v.5078126c0 .1028478.02006.1996891.05664.2890624h-4.5214809c.036585-.0893749.0585938-.1862118.0585938-.2890624v-.5078126c0-.42262437-.3410475-.76367177-.7636719-.76367177zm3.2382813 2.35742177a3.279661 3.6440678 0 0 1 3.2128906 2.9394532 2.1864407 2.1864407 0 0 1 1.888672 2.1621094 2.1864407 2.1864407 0 0 1 -2.1875 2.1855475h-5.8300782a2.1864407 2.1864407 0 0 1 -2.1855469-2.1855475 2.1864407 2.1864407 0 0 1 1.8847656-2.1640626 3.279661 3.6440678 0 0 1 3.2167969-2.9375zm-2.9160156 8.0156251a.72881355.72881355 0 0 1 .7285156.728516.72881355.72881355 0 0 1 -.7285156.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm5.8300782 0a.72881355.72881355 0 0 1 .730469.728516.72881355.72881355 0 0 1 -.730469.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm-2.9140626.728516a.72881355.72881355 0 0 1 .7285156.730469.72881355.72881355 0 0 1 -.7285156.728515.72881355.72881355 0 0 1 -.7285156-.728515.72881355.72881355 0 0 1 .7285156-.730469z" fill="#fc9c9c" fill-opacity=".996078"/></svg>
diff --git a/editor/icons/Callable.svg b/editor/icons/Callable.svg
new file mode 100644
index 0000000000..8f421f4fed
--- /dev/null
+++ b/editor/icons/Callable.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg">
+<g transform="translate(0 -292.77)">
+<path transform="matrix(.26458 0 0 .26458 0 292.77)" d="m12 1c-2 2-4 4-7 4h-4v5h4c3 3.8e-5 5 2 7 4v-13zm1 4v5c2.5896-0.015798 2.5896-4.9849 0-5zm-11 6v4h2l1-4h-3z" fill="#e0e0e0"/>
+</g>
+</svg>
diff --git a/editor/icons/Camera2D.svg b/editor/icons/Camera2D.svg
new file mode 100644
index 0000000000..b6aa869be3
--- /dev/null
+++ b/editor/icons/Camera2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1038.4a3 3 0 0 0 -2.9883 2.7774 3 3 0 0 0 -2.0117-.7774 3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8243v2.1757c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695a3 3 0 0 0 1-2.2305 3 3 0 0 0 -3-3z" fill="#a5b7f3" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Camera3D.svg b/editor/icons/Camera3D.svg
new file mode 100644
index 0000000000..f6e99cb56e
--- /dev/null
+++ b/editor/icons/Camera3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1038.4a3 3 0 0 0 -2.9883 2.7774 3 3 0 0 0 -2.0117-.7774 3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8243v2.1757c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695a3 3 0 0 0 1-2.2305 3 3 0 0 0 -3-3z" fill="#fc9c9c" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/CameraEffects.svg b/editor/icons/CameraEffects.svg
new file mode 100644
index 0000000000..de1d55e1a9
--- /dev/null
+++ b/editor/icons/CameraEffects.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5.9492188 2a3 3 0 0 0 -2.9492188 3 3 3 0 0 0 1 2.2304688v1.7695312l-3-2v6l3-2v1c0 .554.44599 1 1 1h3c.0076117-.045309.0115938-.096059.0214844-.134766.0773621-.302758.1860981-.478282.2832031-.625.1397097-.211089.2814954-.338835.4257813-.480468-.1445165-.141692-.2879205-.269839-.4277344-.480469-.0971224-.146315-.2052562-.321748-.2832032-.623047-.0777157-.300405-.1044198-.8152648.1640626-1.2910156.2700589-.4775976.7340166-.7239536 1.0371093-.8105469.3037241-.0867737.5108695-.0808838.6875-.0703125.2608449.0156115.4500479.0763383.6503909.1328125.049596-.1859081.086921-.3641449.195312-.5800781.078477-.1563394.174637-.3364783.396485-.5527344.221847-.2162561.652628-.4930277 1.195312-.4980469a1.6124973 1.6124973 0 0 1 .033203 0c.542861.0056205.97185.2837448 1.19336.5.146452.1429781.230167.265896.298828.3808594a3 3 0 0 0 .128906-.8671875 3 3 0 0 0 -3-3 3 3 0 0 0 -2.0117188.7773438 3 3 0 0 0 -2.9882812-2.7773438 3 3 0 0 0 -.0507812 0z" fill="#e0e0e0"/><path d="m12.36062 8.59795a.53334 3.2001 0 0 0 -.50976 2.2754 3.2001.53334 30 0 0 -2.2656-.71484 3.2001.53334 30 0 0 1.75 1.6016.53334 3.2001 60 0 0 -1.7461 1.5996.53334 3.2001 60 0 0 2.2578-.71094.53334 3.2001 0 0 0 .51367 2.3496.53334 3.2001 0 0 0 .51367-2.3516 3.2001.53334 30 0 0 2.2539.71094 3.2001.53334 30 0 0 -1.7441-1.5977.53334 3.2001 60 0 0 1.748-1.5996.53334 3.2001 60 0 0 -2.2617.71484.53334 3.2001 0 0 0 -.50977-2.2773z" fill="#cea4f1" stroke-width="1.0667"/></svg>
diff --git a/editor/icons/CameraTexture.svg b/editor/icons/CameraTexture.svg
new file mode 100644
index 0000000000..adb4762082
--- /dev/null
+++ b/editor/icons/CameraTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55228 0-1 .44772-1 1v12c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-12c0-.55228-.44772-1-1-1zm1 2h10v8h-10zm5.8184 1.0039c-.85534.0009758-1.5654.66069-1.6289 1.5137-.30036-.27229-.69029-.4234-1.0957-.42383-.90315 0-1.6367.73162-1.6367 1.6348.0009732.69217.43922 1.3103 1.0918 1.541v1.1855c0 .30198.24293.54492.54492.54492h3.2695c.30199 0 .54492-.24294.54492-.54492v-.54492l1.6367 1.0898v-3.2715l-1.6367 1.0918v-.96484c.34606-.30952.54406-.75251.54492-1.2168 0-.90315-.73162-1.6348-1.6348-1.6348z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/CanvasItem.svg b/editor/icons/CanvasItem.svg
new file mode 100644
index 0000000000..f396290436
--- /dev/null
+++ b/editor/icons/CanvasItem.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9208 1046.4c-.26373.3-.4204.7296-.4204 1.2383 0 1.6277-3.1381-.1781-.33757 2.6703.88382.899 2.6544.6701 3.5382-.2288.88384-.899.88382-2.3565 0-3.2554-1.1002-1.1191-2.2001-1.0845-2.7803-.4244zm2.3802-1.6103 2.4005 2.4416 6.8014-6.9177c.66286-.6742.66286-1.7673 0-2.4415-.66288-.6741-1.7376-.6741-2.4005 0z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/CanvasItemMaterial.svg b/editor/icons/CanvasItemMaterial.svg
new file mode 100644
index 0000000000..241184f8b9
--- /dev/null
+++ b/editor/icons/CanvasItemMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.1035 3a7 7 0 0 0 -1.418 2h12.631a7 7 0 0 0 -1.4277-2h-9.7852z" fill="#ffeb70"/><path d="m1.6855 5a7 7 0 0 0 -.60547 2h13.842a7 7 0 0 0 -.60547-2h-12.631z" fill="#9dff70"/><path d="m1.0801 7a7 7 0 0 0 -.080078 1 7 7 0 0 0 .078125 1h13.842a7 7 0 0 0 .080078-1 7 7 0 0 0 -.078125-1z" fill="#70ffb9"/><path d="m1.0781 9a7 7 0 0 0 .60547 2h12.631a7 7 0 0 0 .60547-2h-13.842z" fill="#70deff"/><path d="m3.1113 13a7 7 0 0 0 4.8887 2 7 7 0 0 0 4.8965-2z" fill="#ff70ac"/><path d="m1.6836 11a7 7 0 0 0 1.4277 2h9.7852a7 7 0 0 0 1.418-2h-12.631z" fill="#9f70ff"/><path d="m8 1a7 7 0 0 0 -4.8965 2h9.7852a7 7 0 0 0 -4.8887-2z" fill="#ff7070"/></svg>
diff --git a/editor/icons/CanvasItemShader.svg b/editor/icons/CanvasItemShader.svg
new file mode 100644
index 0000000000..b8b1588843
--- /dev/null
+++ b/editor/icons/CanvasItemShader.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.303 1c-.4344 0-.86973.16881-1.2012.50586l-1.4688 1.4941h4.3418c.082839-.52789-.072596-1.0872-.47266-1.4941-.33144-.33705-.76482-.50586-1.1992-.50586z" fill="#ff7070"/><path d="m10.633 3-1.9668 2h4.8008l1.0352-1.0527c.2628-.2673.41824-.60049.47266-.94727h-4.3418z" fill="#ffeb70"/><path d="m8.666 5-1.9648 2h4.7988l1.9668-2z" fill="#9dff70"/><path d="m6.7012 7-1.4004 1.4238.56641.57617h3.668l1.9648-2h-4.7988z" fill="#70ffb9"/><path d="m5.8672 9 1.834 1.8652 1.834-1.8652zm-1.752.57812c-.48501-.048725-.90521.12503-1.1953.45508-.21472.24426-.35243.57797-.39844.9668h3.5625c-.10223-.1935-.22224-.37965-.38281-.54297-.55011-.55955-1.1009-.83018-1.5859-.87891z" fill="#70deff"/><path d="m1.3242 13c.18414.24071.43707.53374.83789.94141.88382.899 2.6552.67038 3.5391-.22852.20747-.21103.36064-.45476.4707-.71289h-4.8477z" fill="#ff70ac"/><path d="m2.5215 11c-.0105.088737-.021484.17696-.021484.27148 0 1.3947-2.2782.28739-1.1758 1.7285h4.8477c.27363-.64173.24047-1.3785-.087891-2h-3.5625z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/CanvasItemShaderGraph.svg b/editor/icons/CanvasItemShaderGraph.svg
new file mode 100644
index 0000000000..838ca45178
--- /dev/null
+++ b/editor/icons/CanvasItemShaderGraph.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m8.0625 1025.9a3.375 3 0 0 0 -3.375 3 3.375 3 0 0 0 1.6875 2.5957v9.8115a3.375 3 0 0 0 -1.6875 2.5928 3.375 3 0 0 0 3.375 3 3.375 3 0 0 0 3.375-3 3.375 3 0 0 0 -1.6875-2.5957v-8.7832l11.931 10.605a3.375 3 0 0 0 -.11865.7735 3.375 3 0 0 0 3.375 3 3.375 3 0 0 0 3.375-3 3.375 3 0 0 0 -3.375-3 3.375 3 0 0 0 -.87341.1025l-11.928-10.602h9.8844a3.375 3 0 0 0 2.9169 1.5 3.375 3 0 0 0 3.375-3 3.375 3 0 0 0 -3.375-3 3.375 3 0 0 0 -2.9202 1.5h-11.038a3.375 3 0 0 0 -2.9169-1.5z"/></clipPath><g transform="translate(0 -1036.4)"><g clip-path="url(#a)" transform="matrix(.59259 0 0 .66667 -1.7778 353.45)"><path d="m3 1025.9h27v3h-27z" fill="#ff7070"/><path d="m3 1028.9h27v3h-27z" fill="#ffeb70"/><path d="m3 1031.9h27v3h-27z" fill="#9dff70"/><path d="m3 1034.9h27v3h-27z" fill="#70ffb9"/><path d="m3 1037.9h27v3h-27z" fill="#70deff"/><path d="m3 1043.9h27v3h-27z" fill="#ff70ac"/><path d="m3 1040.9h27v3h-27z" fill="#9f70ff"/></g><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/></g></svg>
diff --git a/editor/icons/CanvasLayer.svg b/editor/icons/CanvasLayer.svg
new file mode 100644
index 0000000000..6e98fd1ba9
--- /dev/null
+++ b/editor/icons/CanvasLayer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2v6h1v-6a1 1 0 0 1 1-1h6v-1zm10.303 0c-.4344 0-.86973.16881-1.2012.50586l-6.8008 6.918 2.4004 2.4414 6.8008-6.918c.66286-.6742.66286-1.7672 0-2.4414-.33144-.33705-.76482-.50586-1.1992-.50586zm.69727 6v6a1 1 0 0 1 -1 1h-6v1h6a2 2 0 0 0 2-2v-6zm-9.8848 2.5781c-.48501-.048725-.90521.12503-1.1953.45508-.26373.3-.41992.72958-.41992 1.2383 0 1.6277-3.1385-.17848-.33789 2.6699.88382.899 2.6552.67038 3.5391-.22852.88384-.899.88382-2.357 0-3.2559-.55011-.55955-1.1009-.83018-1.5859-.87891z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/CanvasModulate.svg b/editor/icons/CanvasModulate.svg
new file mode 100644
index 0000000000..6096beb732
--- /dev/null
+++ b/editor/icons/CanvasModulate.svg
@@ -0,0 +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="m1 1037.4v14h14v-14zm2 2h10v10h-10z" fill="#a5b7f3"/><g fill-rule="evenodd"><path d="m12 1048.4h-5l5-5z" fill="#70bfff"/><path d="m4 1040.4h5l-5 5z" fill="#ff7070"/><path d="m4 1048.4v-3l5-5h3v3l-5 5z" fill="#7aff70"/></g></g></svg>
diff --git a/editor/icons/CapsuleMesh.svg b/editor/icons/CapsuleMesh.svg
new file mode 100644
index 0000000000..f7424310aa
--- /dev/null
+++ b/editor/icons/CapsuleMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.7527 0-5 2.2419-5 4.9903v4.0175c0 2.7484 2.2473 4.9922 5 4.9922s5-2.2438 5-4.9922v-4.0175c0-2.7484-2.2473-4.9903-5-4.9903zm-1.0059 2.1264v4.8576c-.66556-.1047-1.2973-.372-1.9941-.6618v-1.3222c0-1.3474.79838-2.4648 1.9941-2.8736zm2.0118 0c1.1957.4088 1.9941 1.5262 1.9941 2.8736v1.3451c-.68406.3054-1.3142.5732-1.9941.6663zm-4.0059 6.334c.67836.2231 1.3126.447 1.9941.5264v2.8848c-1.1957-.4092-1.9941-1.5242-1.9941-2.8716zm6 .03v.5094c0 1.3474-.79838 2.4619-1.9941 2.8711v-2.8711c.68606-.068 1.3207-.2828 1.9941-.5094z" fill="#ffd684"/></svg>
diff --git a/editor/icons/CapsuleShape2D.svg b/editor/icons/CapsuleShape2D.svg
new file mode 100644
index 0000000000..99a67d4641
--- /dev/null
+++ b/editor/icons/CapsuleShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.77 0-5 2.23-5 5v4c0 2.77 2.23 5 5 5s5-2.23 5-5v-4c0-2.77-2.23-5-5-5zm0 2c1.662 0 3 1.338 3 3v4c0 1.662-1.338 3-3 3s-3-1.338-3-3v-4c0-1.662 1.338-3 3-3z" fill="#68b6ff"/></svg>
diff --git a/editor/icons/CapsuleShape3D.svg b/editor/icons/CapsuleShape3D.svg
new file mode 100644
index 0000000000..4d5bc522b1
--- /dev/null
+++ b/editor/icons/CapsuleShape3D.svg
@@ -0,0 +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="m8 1037.4c-2.7527 0-5 2.2419-5 4.9903v4.0175c0 2.7484 2.2473 4.9922 5 4.9922s5-2.2438 5-4.9922v-4.0175c0-2.7484-2.2473-4.9903-5-4.9903z" fill="#68b6ff"/><circle cx="6.5" cy="1040.9" fill="#a2d2ff" r="1.5"/></g></svg>
diff --git a/editor/icons/CenterContainer.svg b/editor/icons/CenterContainer.svg
new file mode 100644
index 0000000000..af1958c2d8
--- /dev/null
+++ b/editor/icons/CenterContainer.svg
@@ -0,0 +1 @@
+<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 2h10v10h-10zm3 1 2 2 2-2zm-2 2v4l2-2zm8 0-2 2 2 2zm-4 4-2 2h4z" fill="#a5efac"/></svg>
diff --git a/editor/icons/CheckBox.svg b/editor/icons/CheckBox.svg
new file mode 100644
index 0000000000..8707dfce0c
--- /dev/null
+++ b/editor/icons/CheckBox.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-1.1046 0-2 .89543-2 2v9c0 1.1046.89543 2 2 2h9c1.1046 0 2-.89543 2-2v-4.9277l-2 2v2.9277h-9v-9h6.5859l2-2zm9.3633 2.0508-4.9492 4.9492-1.4141-1.4141-1.4141 1.4141 2.8281 2.8281 6.3633-6.3633z" fill="#a5efac"/></svg>
diff --git a/editor/icons/CheckButton.svg b/editor/icons/CheckButton.svg
new file mode 100644
index 0000000000..4b8106ecc0
--- /dev/null
+++ b/editor/icons/CheckButton.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 4a4 4 0 0 0 -4 4 4 4 0 0 0 4 4h6a4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 2h2.541a4 4 0 0 0 -.54102 2 4 4 0 0 0 .54102 2h-2.541a2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Checkerboard.svg b/editor/icons/Checkerboard.svg
new file mode 100644
index 0000000000..38b537e872
--- /dev/null
+++ b/editor/icons/Checkerboard.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -988.36)"><path d="m0 988.36h64v64h-64z" fill-opacity=".19608" stroke-width="2"/><path d="m0 0v16h16v-16zm16 16v16h16v-16zm16 0h16v-16h-16zm16 0v16h16v-16zm0 16h-16v16h16zm0 16v16h16v-16zm-16 0h-16v16h16zm-16 0v-16h-16v16z" fill-opacity=".39216" stroke-width="8" transform="translate(0 988.36)"/></g></svg>
diff --git a/editor/icons/CircleShape2D.svg b/editor/icons/CircleShape2D.svg
new file mode 100644
index 0000000000..d23ca6d8a3
--- /dev/null
+++ b/editor/icons/CircleShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1038.4a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" fill="none" stroke="#68b6ff" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/ClassList.svg b/editor/icons/ClassList.svg
new file mode 100644
index 0000000000..11713b125a
--- /dev/null
+++ b/editor/icons/ClassList.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1v1h-5v1h2v10h1 5v1h6v-3h-6v1h-5v-4h5v1h6v-3h-6v1h-5v-4h2v1h6v-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Clear.svg b/editor/icons/Clear.svg
new file mode 100644
index 0000000000..43c00311bc
--- /dev/null
+++ b/editor/icons/Clear.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v5h-2c-1.108 0-2 .892-2 2v1h10v-1c0-1.108-.892-2-2-2h-2v-5a1 1 0 0 0 -1-1zm-5 10v4l10-1v-3z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ClippedCamera3D.svg b/editor/icons/ClippedCamera3D.svg
new file mode 100644
index 0000000000..a66f7844a9
--- /dev/null
+++ b/editor/icons/ClippedCamera3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6.5 12v4h3v-1h-2v-3zm-1 0h-2c-.5 0-1 .5-1 1v2c-.01829.53653.5 1 1 1h2v-1h-2v-2h2zm4-12c-1.5691.0017903-2.8718 1.2125-2.9883 2.7773-.55103-.49952-1.268-.77655-2.0117-.77734-1.6569 0-3 1.3431-3 3 .00179 1.2698.80282 2.4009 2 2.8242v2.1758c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695c.63486-.56783.99842-1.3788 1-2.2305 0-1.6569-1.3431-3-3-3zm1 12v4h1v-1h1c.55228 0 1-.44772 1-1v-1c0-.55228-.44775-.99374-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/Close.svg b/editor/icons/Close.svg
new file mode 100644
index 0000000000..331727ab91
--- /dev/null
+++ b/editor/icons/Close.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Collapse.svg b/editor/icons/Collapse.svg
new file mode 100644
index 0000000000..5e5611adb2
--- /dev/null
+++ b/editor/icons/Collapse.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1044.4 5 4 5-4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/CollisionPolygon2D.svg b/editor/icons/CollisionPolygon2D.svg
new file mode 100644
index 0000000000..524efd1e65
--- /dev/null
+++ b/editor/icons/CollisionPolygon2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12l-6 6z" fill="none" stroke="#a5b7f3" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/CollisionPolygon3D.svg b/editor/icons/CollisionPolygon3D.svg
new file mode 100644
index 0000000000..9b8b13c514
--- /dev/null
+++ b/editor/icons/CollisionPolygon3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12l-6 6z" fill="none" stroke="#fc9c9c" stroke-linejoin="round" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/CollisionShape2D.svg b/editor/icons/CollisionShape2D.svg
new file mode 100644
index 0000000000..d366ddb630
--- /dev/null
+++ b/editor/icons/CollisionShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12z" fill="none" stroke="#a5b7f3" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/CollisionShape3D.svg b/editor/icons/CollisionShape3D.svg
new file mode 100644
index 0000000000..cf5925ce79
--- /dev/null
+++ b/editor/icons/CollisionShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1050.4-6-3v-6l6-3 6 3v6z" fill="none" stroke="#fc9c9c" stroke-linejoin="round" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.399988)"/></svg>
diff --git a/editor/icons/Color.svg b/editor/icons/Color.svg
new file mode 100644
index 0000000000..91bc0d1d2d
--- /dev/null
+++ b/editor/icons/Color.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 4a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2z" fill="#ff8484"/><path d="m14 4a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2z" fill="#84c2ff"/><path d="m6 2v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-5z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/ColorPick.svg b/editor/icons/ColorPick.svg
new file mode 100644
index 0000000000..ff44937a21
--- /dev/null
+++ b/editor/icons/ColorPick.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.108 0-2 .892-2 2v2h-1v2h1v5a2 2 0 0 0 1 1.7285v1.2715h2v-1.2695a2 2 0 0 0 1-1.7305v-5h1v-2h-1v-2c0-1.108-.892-2-2-2zm-1 6h2v5a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ColorPicker.svg b/editor/icons/ColorPicker.svg
new file mode 100644
index 0000000000..c4f48cd347
--- /dev/null
+++ b/editor/icons/ColorPicker.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.108 0-2 .892-2 2v2h-1v2h1v5a2 2 0 0 0 1 1.7285v1.2715h2v-1.2695a2 2 0 0 0 1-1.7305v-5h1v-2h-1v-2c0-1.108-.892-2-2-2zm-1 6h2v5a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ColorPickerButton.svg b/editor/icons/ColorPickerButton.svg
new file mode 100644
index 0000000000..fa2a615428
--- /dev/null
+++ b/editor/icons/ColorPickerButton.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1c-1.108 0-2 .892-2 2v2h-1v2h1v5a2 2 0 0 0 1 1.7285v1.2715h2v-1.2695a2 2 0 0 0 1-1.7305v-5h1v-2h-1v-2c0-1.108-.892-2-2-2zm-9 1v3.1328l-1.4453-.96484-1.1094 1.6641 3 2c.3359.2239.77347.2239 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm8 5h2v5a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1zm-8.5 3c-.831 0-1.5.669-1.5 1.5v.5 1h-1v2h8v-2h-1v-1-.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ColorRamp.svg b/editor/icons/ColorRamp.svg
new file mode 100644
index 0000000000..13e05dd1ee
--- /dev/null
+++ b/editor/icons/ColorRamp.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(.51852 0 0 .7 -.55556 1034.6)" gradientUnits="userSpaceOnUse" x1="4" x2="30" y1="14" y2="14"><stop offset="0" stop-color="#afff68"/><stop offset="1" stop-color="#ff6b6b"/></linearGradient><path d="m1 1051.4h14v-14z" fill="url(#a)" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/ColorRect.svg b/editor/icons/ColorRect.svg
new file mode 100644
index 0000000000..306401191a
--- /dev/null
+++ b/editor/icons/ColorRect.svg
@@ -0,0 +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="m1 1v14h14v-14zm2 2h10v10h-10z" fill="#a5efac" transform="translate(0 1036.4)"/><g fill-rule="evenodd"><path d="m12 1048.4h-4.8l4.8-4.8z" fill="#70bfff"/><path d="m4 1040.4h4.8l-4.8 4.8z" fill="#ff7070"/><path d="m4 1048.4v-3.2l4.8-4.8h3.2v3.2l-4.8 4.8z" fill="#7aff70"/></g></g></svg>
diff --git a/editor/icons/ColorTrackVu.svg b/editor/icons/ColorTrackVu.svg
new file mode 100644
index 0000000000..faf82d86a9
--- /dev/null
+++ b/editor/icons/ColorTrackVu.svg
@@ -0,0 +1 @@
+<svg height="24" viewBox="0 0 16 24" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(1.0931873 0 0 1.4762899 -.980214 .08553)" gradientUnits="userSpaceOnUse" x1="7.728814" x2="7.728814" y1="16.474577" y2="3.864407"><stop offset="0" stop-color="#288027"/><stop offset="1" stop-color="#dbee15"/></linearGradient><linearGradient id="b" gradientTransform="matrix(1.1036585 0 0 .47778193 -16.507235 -7.901817)" gradientUnits="userSpaceOnUse" x1="7.728814" x2="7.728814" y1="16.474577" y2="3.864407"><stop offset="0" stop-color="#f70000"/><stop offset="1" stop-color="#eec315"/></linearGradient><rect fill="url(#a)" height="18.416088" ry=".845801" width="18.232145" x="-1.350786" y="5.99069"/><rect fill="url(#b)" height="5.960126" ry=".273732" transform="scale(-1)" width="18.406782" x="-16.881357" y="-5.99069"/></svg>
diff --git a/editor/icons/ConcavePolygonShape2D.svg b/editor/icons/ConcavePolygonShape2D.svg
new file mode 100644
index 0000000000..463fece525
--- /dev/null
+++ b/editor/icons/ConcavePolygonShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12l6 6 6-6z" fill="none" stroke="#68b6ff" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/ConcavePolygonShape3D.svg b/editor/icons/ConcavePolygonShape3D.svg
new file mode 100644
index 0000000000..60d1a6234f
--- /dev/null
+++ b/editor/icons/ConcavePolygonShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><g fill="#2998ff"><path d="m8 1-7 3v8l7 3 7-3v-8z" transform="translate(0 1036.4)"/><path d="m8 1037.4-7 3v8l7 3 7-3v-8z"/><path d="m3 1041.4v6l5 2 5-2v-6l-5-2z"/></g><path d="m8 1049.4 5-2-5-2-5 2z" fill="#a2d2ff"/><path d="m8 1045.4 5 2v-6l-5-2z" fill="#68b6ff"/><g transform="translate(0 1036.4)"><path d="m8 1-7 3 2 1 5-2 5 2 2-1z" fill="#a2d2ff"/><path d="m1 4v8l7 3v-2l-5-2v-6z" fill="#68b6ff"/><path d="m15 4-2 1v6l-5 2v2l7-3z" fill="#2998ff"/></g></g></svg>
diff --git a/editor/icons/ConeTwistJoint3D.svg b/editor/icons/ConeTwistJoint3D.svg
new file mode 100644
index 0000000000..9eff38d0dc
--- /dev/null
+++ b/editor/icons/ConeTwistJoint3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9824 1a1.0001 1.0001 0 0 0 -.81445.44531l-4.7012 7.0527c-.80117.58197-1.3801 1.3563-1.4492 2.3145a1.0001 1.0001 0 0 0 -.017578.1875c0 .21449.033976.41628.082031.61328.0071983.028314.015306.055972.023438.083985.053631.19149.1274.37452.2207.54883.19678.36764.47105.69651.80273.98633.007988.007025.013442.016473.021484.023437.016953.014679.03747.026532.054688.041016.10299.086112.21259.16531.32422.24414.23883.16992.49083.33075.76953.4707.0025295.00127.0052799.002638.0078125.003906.001313.000658.0025928.001296.0039063.001953.0085785.00429.018732.007456.027344.011719.26499.13103.55174.24596.84961.35156.10487.037634.21202.071147.32031.10547.072945.022902.1402.050715.21484.072266.16777.04843.34161.086385.51367.12695.093562.021905.18185.048745.27734.068359.010733.002205.022447.003684.033203.00586.34623.071177.69974.12196 1.0566.16211.057889.006228.11544.01213.17383.017578.81052.079498 1.6348.079498 2.4453 0 .058387-.005448.11594-.01135.17383-.017578.3569-.040146.71041-.090932 1.0566-.16211.010948-.002251.022269-.003578.033203-.00586.095491-.019614.18378-.046454.27734-.068359.17206-.040568.3459-.078523.51367-.12695.074642-.021551.1419-.049364.21484-.072266.10829-.034322.21544-.067835.32031-.10547.29787-.1056.58462-.22053.84961-.35156.009951-.00492.021348-.008715.03125-.013672.002626-.001315.005189-.002588.007813-.003906.2787-.13995.5307-.30078.76953-.4707.11163-.07883.22123-.15803.32422-.24414.017218-.014484.037734-.026337.054687-.041016.008042-.006964.013497-.016412.021485-.023437.33169-.28982.60596-.61869.80273-.98633.093299-.17431.16707-.35733.2207-.54883.008132-.028013.016239-.055671.023438-.083985.048055-.197.082031-.39879.082031-.61328a1.0001 1.0001 0 0 0 -.017578-.18164 1.0001 1.0001 0 0 0 -.001953-.017578c-.073081-.95265-.64941-1.7232-1.4473-2.3027l-4.7012-7.0527a1.0001 1.0001 0 0 0 -.84961-.44531zm-.98242 4.3027v1.7461c-.43911.033461-.86366.087835-1.2734.16406l1.2734-1.9102zm2 0 1.2734 1.9102c-.40978-.076228-.83432-.1306-1.2734-.16406v-1.7461zm-2 3.748v1.9492a1.0001 1.0001 0 1 0 2 0v-1.9492c1.1126.10487 2.0951.37277 2.7949.72266.12146.060728.20622.12218.30664.18359l.80078 1.2012c-.032965.14677-.089654.30658-.30469.51758-.051464.049149-.10034.098137-.16406.14844-.045193.035312-.091373.070148-.14258.10547-.11245.07827-.24511.15838-.39062.23633-.075428.040204-.1553.078371-.23828.11719-.16195.075482-.33452.14662-.52148.21289-.070588.025324-.14454.048409-.21875.072265-.23425.074473-.48077.14392-.74414.20117-.021343.004579-.041038.011189-.0625.015625-.2559.05368-.53101.090517-.80859.125-.856.10229-1.7573.10229-2.6133 0-.27759-.034483-.5527-.07132-.80859-.125-.021462-.004436-.041156-.011046-.0625-.015625-.26337-.057254-.50989-.1267-.74414-.20117-.074211-.023856-.14816-.046941-.21875-.072265-.18697-.066266-.35954-.13741-.52148-.21289-.082979-.038816-.16285-.076983-.23828-.11719-.14552-.077951-.27818-.15806-.39062-.23633-.051205-.035321-.097386-.070157-.14258-.10547-.06372-.050301-.1126-.099289-.16406-.14844-.21503-.21099-.27173-.37081-.30469-.51758l.80078-1.2012c.10043-.061415.18518-.12287.30664-.18359.69978-.34989 1.6823-.61778 2.7949-.72266z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/ConfirmationDialog.svg b/editor/icons/ConfirmationDialog.svg
new file mode 100644
index 0000000000..f23b5f932a
--- /dev/null
+++ b/editor/icons/ConfirmationDialog.svg
@@ -0,0 +1 @@
+<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm6.9863 1.002c.34689-.0022844.6986.055762 1.0391.17969 1.3618.4956 2.1813 1.9126 1.9297 3.3398-.19105 1.0835-.96172 1.9461-1.9551 2.3008v.17773h-1-1v-.8418a1.0001 1.0001 0 0 1 1-1.1582c.49193 0 .89895-.34177.98438-.82617.085424-.4845-.18031-.94508-.64258-1.1133-.46227-.1683-.96106.013453-1.207.43945a1.0002 1.0002 0 0 1 -1.7324-1c.54346-.94148 1.5433-1.4912 2.584-1.498zm-.98633 6.998h2v1h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Container.svg b/editor/icons/Container.svg
new file mode 100644
index 0000000000..a7be880268
--- /dev/null
+++ b/editor/icons/Container.svg
@@ -0,0 +1 @@
+<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 2h2zm2 0v2h2v-2zm4 0v2h2v-2zm4 0v2h2c0-1.1046-.89543-2-2-2zm-12 4v2h2v-2zm12 0v2h2v-2zm-12 4v2h2v-2zm12 0v2h2v-2zm-12 4c0 1.1046.89543 2 2 2v-2zm4 0v2h2v-2zm4 0v2h2v-2zm4 0v2c1.1046 0 2-.89543 2-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Control.svg b/editor/icons/Control.svg
new file mode 100644
index 0000000000..0ec9c4c6fe
--- /dev/null
+++ b/editor/icons/Control.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ControlAlignBottomCenter.svg b/editor/icons/ControlAlignBottomCenter.svg
new file mode 100644
index 0000000000..ca7f0c2e01
--- /dev/null
+++ b/editor/icons/ControlAlignBottomCenter.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m6 10h4v4h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignBottomLeft.svg b/editor/icons/ControlAlignBottomLeft.svg
new file mode 100644
index 0000000000..34904b5c6a
--- /dev/null
+++ b/editor/icons/ControlAlignBottomLeft.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 10h4v4h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignBottomRight.svg b/editor/icons/ControlAlignBottomRight.svg
new file mode 100644
index 0000000000..169ca2840f
--- /dev/null
+++ b/editor/icons/ControlAlignBottomRight.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 10h4v4h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignBottomWide.svg b/editor/icons/ControlAlignBottomWide.svg
new file mode 100644
index 0000000000..f51043789f
--- /dev/null
+++ b/editor/icons/ControlAlignBottomWide.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 10h12v4h-12z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignCenter.svg b/editor/icons/ControlAlignCenter.svg
new file mode 100644
index 0000000000..44dda03e47
--- /dev/null
+++ b/editor/icons/ControlAlignCenter.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m6 6h4v4h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignCenterLeft.svg b/editor/icons/ControlAlignCenterLeft.svg
new file mode 100644
index 0000000000..fc4674af48
--- /dev/null
+++ b/editor/icons/ControlAlignCenterLeft.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 6h6v4h-6z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignCenterRight.svg b/editor/icons/ControlAlignCenterRight.svg
new file mode 100644
index 0000000000..c66a3d59b5
--- /dev/null
+++ b/editor/icons/ControlAlignCenterRight.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 6h6v4h-6z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignLeftCenter.svg b/editor/icons/ControlAlignLeftCenter.svg
new file mode 100644
index 0000000000..612c36b4d6
--- /dev/null
+++ b/editor/icons/ControlAlignLeftCenter.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 6h4v4h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignLeftWide.svg b/editor/icons/ControlAlignLeftWide.svg
new file mode 100644
index 0000000000..82f4911cb4
--- /dev/null
+++ b/editor/icons/ControlAlignLeftWide.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h4v12h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignRightCenter.svg b/editor/icons/ControlAlignRightCenter.svg
new file mode 100644
index 0000000000..43f8618c80
--- /dev/null
+++ b/editor/icons/ControlAlignRightCenter.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 6h4v4h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignRightWide.svg b/editor/icons/ControlAlignRightWide.svg
new file mode 100644
index 0000000000..0ee0e095e2
--- /dev/null
+++ b/editor/icons/ControlAlignRightWide.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 2h4v12h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignTopCenter.svg b/editor/icons/ControlAlignTopCenter.svg
new file mode 100644
index 0000000000..dca9c84ce6
--- /dev/null
+++ b/editor/icons/ControlAlignTopCenter.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m6 2h4v3.9999h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignTopLeft.svg b/editor/icons/ControlAlignTopLeft.svg
new file mode 100644
index 0000000000..68a8173835
--- /dev/null
+++ b/editor/icons/ControlAlignTopLeft.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h4v3.9999h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignTopRight.svg b/editor/icons/ControlAlignTopRight.svg
new file mode 100644
index 0000000000..c862d20504
--- /dev/null
+++ b/editor/icons/ControlAlignTopRight.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 2h4v3.9999h-4z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignTopWide.svg b/editor/icons/ControlAlignTopWide.svg
new file mode 100644
index 0000000000..01d9690706
--- /dev/null
+++ b/editor/icons/ControlAlignTopWide.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h12v3.9999h-12z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlAlignWide.svg b/editor/icons/ControlAlignWide.svg
new file mode 100644
index 0000000000..0099e04896
--- /dev/null
+++ b/editor/icons/ControlAlignWide.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h12v12h-12z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlHcenterWide.svg b/editor/icons/ControlHcenterWide.svg
new file mode 100644
index 0000000000..af3f9b495b
--- /dev/null
+++ b/editor/icons/ControlHcenterWide.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 6h12v4h-12z" fill="#d6d6d6"/></svg>
diff --git a/editor/icons/ControlLayout.svg b/editor/icons/ControlLayout.svg
new file mode 100644
index 0000000000..c4aa64113d
--- /dev/null
+++ b/editor/icons/ControlLayout.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h14v-14zm2 2h3v3h-3zm5 0h5v3h-5zm-5 5h3v5h-3zm5 0h5v5h-5z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ControlVcenterWide.svg b/editor/icons/ControlVcenterWide.svg
new file mode 100644
index 0000000000..decd1cbd12
--- /dev/null
+++ b/editor/icons/ControlVcenterWide.svg
@@ -0,0 +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="m0 1036.4h16v16h-16z" fill="#919191"/><path d="m2 1038.4h12v12h-12z" fill="#474747"/><path d="m1038.4-10h12v4h-12z" fill="#d6d6d6" transform="rotate(90)"/></g></svg>
diff --git a/editor/icons/ConvexPolygonShape2D.svg b/editor/icons/ConvexPolygonShape2D.svg
new file mode 100644
index 0000000000..dc2b0faf81
--- /dev/null
+++ b/editor/icons/ConvexPolygonShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-6l6-6 6 6z" fill="none" stroke="#68b6ff" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/ConvexPolygonShape3D.svg b/editor/icons/ConvexPolygonShape3D.svg
new file mode 100644
index 0000000000..3478289ab1
--- /dev/null
+++ b/editor/icons/ConvexPolygonShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3z" fill="#2998ff" transform="translate(0 1036.4)"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#68b6ff"/><path d="m8 1-7 3 7 11 7-3z" fill="#2998ff" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/CopyNodePath.svg b/editor/icons/CopyNodePath.svg
new file mode 100644
index 0000000000..1adec4ade3
--- /dev/null
+++ b/editor/icons/CopyNodePath.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><circle cx="3" cy="1048.4"/><path d="m2 1c-.55226.0001-.99994.4477-1 1v12c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-8l-5-5zm1 2h6v3c0 .554.44599 1 1 1h3v6h-10zm3 5-2 4h2l2-4zm4 0-2 4h2l2-4z" fill-opacity=".78431" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/CreateNewSceneFrom.svg b/editor/icons/CreateNewSceneFrom.svg
new file mode 100644
index 0000000000..094a0aae39
--- /dev/null
+++ b/editor/icons/CreateNewSceneFrom.svg
@@ -0,0 +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="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25-.28906-1.9785zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812-.81836-1.9004zm-1.4258 3.2285v6c0 1.1046.89543 2 2 2h7v-1h-2v-4h2v-2h4v2h1v-3z" fill="#e0e0e0" transform="translate(0 1036.4)"/><circle cx="-14" cy="1047.4" fill="#e0e0e0" r="0"/><path d="m13 1049.4h2v-2h-2v-2h-2v2h-2v2h2v2h2z" fill="#84ffb1" fill-rule="evenodd"/></g></svg>
diff --git a/editor/icons/CryptoKey.svg b/editor/icons/CryptoKey.svg
new file mode 100644
index 0000000000..c5d1af1d23
--- /dev/null
+++ b/editor/icons/CryptoKey.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.233 4.233" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.397.34-.374.373-.375.374v.375l.188.187-1.497 1.496v.375l.374.374h.374l.187-.188.282-.092.092-.282.282-.093.093-.28.094-.28.28-.095.187-.187.187.187h.374l.375-.375.373-.373.001-.374-1.122-1.122zm.374.858a.264.264 0 1 1 .002.528.264.264 0 0 1 -.002-.528z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/CubeMesh.svg b/editor/icons/CubeMesh.svg
new file mode 100644
index 0000000000..d540858248
--- /dev/null
+++ b/editor/icons/CubeMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 .88867-7 3.5v7.2227l7 3.5 7-3.5v-7.2227zm0 2.1152 3.9395 1.9707-3.9395 1.9688-3.9395-1.9688zm-5 3.5527 4 2v3.9414l-4-2.002zm10 0v3.9395l-4 2.002v-3.9414z" fill="#ffd684" stroke-width="1.0667" transform="scale(.9375)"/></svg>
diff --git a/editor/icons/Cubemap.svg b/editor/icons/Cubemap.svg
new file mode 100644
index 0000000000..b3ec2bd3e7
--- /dev/null
+++ b/editor/icons/Cubemap.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 6v4h4v-4zm8 0v4h4v-4z" fill="#84ffb1"/><path d="m4 6v4h4v-4zm8 0v4h4v-4z" fill="#ff8484"/><path d="m4 2v4h4v-4zm0 8v4h4v-4z" fill="#84c2ff"/></svg>
diff --git a/editor/icons/CubemapArray.svg b/editor/icons/CubemapArray.svg
new file mode 100644
index 0000000000..c9d722dc52
--- /dev/null
+++ b/editor/icons/CubemapArray.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 6v4h2v-4zm6 0v4h4v-4z" fill="#84ffb1"/><path d="m4 6v4h4v-4zm8 0v4h2v-4z" fill="#ff8484"/><path d="m4 2v4h4v-4zm0 8v4h4v-4z" fill="#84c2ff"/><path d="m-.00000002 2v12h4.00000002v-2h-2v-8h2v-2h-2zm12.00000002 0v2h2.000001v8h-2.000001v2h4.000001v-12h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Curve.svg b/editor/icons/Curve.svg
new file mode 100644
index 0000000000..34d537a46d
--- /dev/null
+++ b/editor/icons/Curve.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-width="2" transform="translate(0 -1036.4)"><path d="m2 1038.4v12h12" stroke-linecap="square" stroke-opacity=".32549"/><path d="m2 1050.4c8 0 12-4 12-12" stroke-linecap="round"/></g></svg>
diff --git a/editor/icons/Curve2D.svg b/editor/icons/Curve2D.svg
new file mode 100644
index 0000000000..4470e660b3
--- /dev/null
+++ b/editor/icons/Curve2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1037.4c-3.1667 0-5.1045.854-6.082 2.3203-.97757 1.4664-.91797 3.1797-.91797 4.6797s-.059601 2.7867-.58203 3.5703c-.52243.7837-1.5846 1.4297-4.418 1.4297a1.0001 1.0001 0 1 0 0 2c3.1667 0 5.1045-.8539 6.082-2.3203.97757-1.4663.91797-3.1797.91797-4.6797s.059601-2.7866.58203-3.5703c.52243-.7836 1.5846-1.4297 4.418-1.4297a1.0001 1.0001 0 1 0 0-2z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Curve3D.svg b/editor/icons/Curve3D.svg
new file mode 100644
index 0000000000..f61b344966
--- /dev/null
+++ b/editor/icons/Curve3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0039 1037.4a1.0001 1.0001 0 0 0 -.45117.1113l-6 3a1.0001 1.0001 0 0 0 0 1.7891l6 3a1.0001 1.0001 0 0 0 .89453 0l4.5527-2.2754v3.7636l-5 2.5-5.5527-2.7773a1.0001 1.0001 0 0 0 -.89453 1.7891l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.8946v-6a1.0001 1.0001 0 0 0 -1.4473-.8945l-5.5527 2.7773-3.7637-1.8828 4.2109-2.1054a1.0001 1.0001 0 0 0 -.44336-1.9004z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/CurveClose.svg b/editor/icons/CurveClose.svg
new file mode 100644
index 0000000000..26e30cdb1c
--- /dev/null
+++ b/editor/icons/CurveClose.svg
@@ -0,0 +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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m5 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm8 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/><path d="m10 6v2h2v-2zm0 2h-2v2h2zm-2 2h-2v2h2z" fill="#84c2ff"/></g></g></svg>
diff --git a/editor/icons/CurveConstant.svg b/editor/icons/CurveConstant.svg
new file mode 100644
index 0000000000..656bdd7580
--- /dev/null
+++ b/editor/icons/CurveConstant.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1046.4h8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/CurveCreate.svg b/editor/icons/CurveCreate.svg
new file mode 100644
index 0000000000..962abd0b3f
--- /dev/null
+++ b/editor/icons/CurveCreate.svg
@@ -0,0 +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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m5 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm6 5v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#84ffb1"/><path d="m13 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></g></svg>
diff --git a/editor/icons/CurveCurve.svg b/editor/icons/CurveCurve.svg
new file mode 100644
index 0000000000..35770543af
--- /dev/null
+++ b/editor/icons/CurveCurve.svg
@@ -0,0 +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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m8.4688.4707-2.6875 2.6875h-.0019531a2 2 0 0 0 -.7793-.1582 2 2 0 0 0 -2 2 2 2 0 0 0 .16016.7793l-2.6914 2.6914 1.0625 1.0605 2.6895-2.6895a2 2 0 0 0 .7793.1582 2 2 0 0 0 2-2 2 2 0 0 0 -.16016-.77734l2.6914-2.6914-1.0625-1.0605z" fill="#84c2ff"/><path d="m13 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></g></svg>
diff --git a/editor/icons/CurveDelete.svg b/editor/icons/CurveDelete.svg
new file mode 100644
index 0000000000..5bce6d0c1c
--- /dev/null
+++ b/editor/icons/CurveDelete.svg
@@ -0,0 +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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><path d="m5 1039.4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm4.8789 5.4648-1.4141 1.4141 2.1211 2.1211-2.1211 2.1211 1.4141 1.4141 2.1211-2.1211 2.1211 2.1211 1.4141-1.4141-2.1211-2.1211 2.1211-2.1211-1.4141-1.4141-2.1211 2.1211z" fill="#ff8484"/><path d="m13 1039.4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></svg>
diff --git a/editor/icons/CurveEdit.svg b/editor/icons/CurveEdit.svg
new file mode 100644
index 0000000000..84b56fbccb
--- /dev/null
+++ b/editor/icons/CurveEdit.svg
@@ -0,0 +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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m5 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm3 5 3.291 8 .94726-2.8203 1.8828 1.8828.94336-.94141-1.8848-1.8828 2.8203-.94726-8-3.291z" fill="#84c2ff"/><path d="m13 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></g></svg>
diff --git a/editor/icons/CurveIn.svg b/editor/icons/CurveIn.svg
new file mode 100644
index 0000000000..2ad44dc654
--- /dev/null
+++ b/editor/icons/CurveIn.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c5 0 8-3 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/CurveInOut.svg b/editor/icons/CurveInOut.svg
new file mode 100644
index 0000000000..292dac4573
--- /dev/null
+++ b/editor/icons/CurveInOut.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c5 0 3-8 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/CurveLinear.svg b/editor/icons/CurveLinear.svg
new file mode 100644
index 0000000000..3c1fb2a0e2
--- /dev/null
+++ b/editor/icons/CurveLinear.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/CurveOut.svg b/editor/icons/CurveOut.svg
new file mode 100644
index 0000000000..dfa9a26144
--- /dev/null
+++ b/editor/icons/CurveOut.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c0-5 3-8 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/CurveOutIn.svg b/editor/icons/CurveOutIn.svg
new file mode 100644
index 0000000000..9a6463d0e9
--- /dev/null
+++ b/editor/icons/CurveOutIn.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c0-5 8-3 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/CurveTexture.svg b/editor/icons/CurveTexture.svg
new file mode 100644
index 0000000000..761fb9a45b
--- /dev/null
+++ b/editor/icons/CurveTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55228 0-1 .44772-1 1v9.1602c.32185-.10966.66-.16382 1-.16016.33117 0 .66575-.007902 1-.013672v-7.9863h10v1.1348c.29007-.10393.59442-.16256.90234-.17383.37315-.012796.74541.044169 1.0977.16797v-2.1289c0-.55228-.44772-1-1-1h-12zm7 4v1h-1v1h-2v1h-1v1h-1v1h2 2 .39062c1.1119-.56677 1.9678-1.4538 2.6094-3.4727v-.52734h-1v-1h-1zm4.9668.98828a1.0001 1.0001 0 0 0 -.92774.73828c-.92743 3.246-2.6356 4.6825-4.6523 5.4668-2.0168.7843-4.3867.80664-6.3867.80664a1.0001 1.0001 0 1 0 0 2c2 0 4.6301.023994 7.1133-.94141 2.4832-.9657 4.7751-3.0292 5.8477-6.7832a1.0001 1.0001 0 0 0 -.99414-1.2871z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/CylinderMesh.svg b/editor/icons/CylinderMesh.svg
new file mode 100644
index 0000000000..85483aeeca
--- /dev/null
+++ b/editor/icons/CylinderMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.5.9375c-1.6377 0-3.12.2123-4.2737.5969-.57682.1923-1.0754.4237-1.4905.7508-.41505.3271-.79834.8259-.79834 1.4648v7.5c0 .6389.38329 1.1396.79834 1.4667s.91366.5585 1.4905.7507c1.1536.3846 2.6359.5951 4.2737.5951s3.12-.2105 4.2737-.5951c.57682-.1922 1.0754-.4236 1.4905-.7507.41505-.3271.79834-.8278.79834-1.4667v-7.5c0-.6389-.38329-1.1377-.79834-1.4648s-.91366-.5585-1.4905-.7508c-1.1536-.3846-2.6359-.5969-4.2737-.5969zm0 1.875c1.4689 0 2.8.2076 3.6823.5017.4347.1449.7513.3163.9082.4376-.15705.1212-.47387.2911-.9082.4358-.88221.2941-2.2134.4999-3.6823.4999s-2.8-.2058-3.6823-.4999c-.43433-.1447-.75115-.3146-.9082-.4358.15691-.1213.47351-.2927.9082-.4376.88221-.2941 2.2134-.5017 3.6823-.5017zm-4.6875 2.9883c.13762.055.26578.1173.41382.1666 1.1536.3846 2.6359.5951 4.2737.5951s3.12-.2105 4.2737-.5951c.14804-.049.2762-.1112.41382-.1666v5.4492c-.15705.1212-.57092.2929-1.0052.4376-.88221.2941-2.2134.4999-3.6823.4999s-2.8-.2058-3.6823-.4999c-.43433-.1447-.8482-.3164-1.0052-.4376z" fill="#ffd684"/></svg>
diff --git a/editor/icons/CylinderShape3D.svg b/editor/icons/CylinderShape3D.svg
new file mode 100644
index 0000000000..cbff4c8897
--- /dev/null
+++ b/editor/icons/CylinderShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m.890374 3.687944h13.171325v7.699331h-13.171325z" fill="#68b6ff"/><ellipse cx="7.477298" cy="3.722912" fill="#a2d2ff" rx="6.586479" ry="2.820821"/><ellipse cx="7.474688" cy="11.34481" fill="#68b6ff" rx="6.586479" ry="2.820821"/></svg>
diff --git a/editor/icons/DampedSpringJoint2D.svg b/editor/icons/DampedSpringJoint2D.svg
new file mode 100644
index 0000000000..02a7033106
--- /dev/null
+++ b/editor/icons/DampedSpringJoint2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-opacity=".98824"><path d="m4 3v2l8 3v-2zm0 5v2l8 3v-2z" fill="#708cea"/><path d="m4 3v2l8-2v-2zm0 5v2l8-2v-2zm0 5v2l8-2v-2z" fill="#a5b7f3"/></g></svg>
diff --git a/editor/icons/Debug.svg b/editor/icons/Debug.svg
new file mode 100644
index 0000000000..769fada054
--- /dev/null
+++ b/editor/icons/Debug.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.3257 0-2.5977.52744-3.5352 1.4648a1 1 0 0 0 0 1.4141 1 1 0 0 0 .69141.29297 1 1 0 0 0 .72266-.29297c.56288-.5628 1.3251-.87891 2.1211-.87891s1.5582.31611 2.1211.87891a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141c-.93741-.9374-2.2095-1.4648-3.5352-1.4648zm-5 3.9961a1 1 0 0 0 -1 1c0 .8334.32654 1.6973.96875 2.5.33016.41272.7705.79575 1.3008 1.0723a4 4 0 0 0 -.13672.43164h-2.1328a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h2.1309a4 4 0 0 0 .17969.53711c-.14177.089422-.27868.1846-.41016.2832-.58533.439-1.1074.96875-1.6074 1.4688a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0c.5-.5.97791-.9722 1.3926-1.2832.1693-.12693.3098-.20282.44336-.26953a4 4 0 0 0 2.457.84961 4 4 0 0 0 2.459-.84766c.13307.066645.27298.14126.44141.26758.41467.311.89258.7832 1.3926 1.2832a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141c-.5-.5-1.0221-1.0297-1.6074-1.4688-.13076-.098068-.26727-.19224-.4082-.28125a4 4 0 0 0 .17578-.53906h2.1328a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-2.1309a4 4 0 0 0 -.13477-.43359c.52857-.27637.96751-.65858 1.2969-1.0703.64221-.8027.96875-1.6666.96875-2.5a1 1 0 0 0 -1-1 1 1 0 0 0 -1 1c0 .1667-.17346.8028-.53125 1.25-.25089.31365-.54884.54907-.93164.66602a4 4 0 0 0 -.60352-.41211 2 2 0 0 0 .066406-.5 2 2 0 0 0 -2-2 2 2 0 0 0 -2 2 2 2 0 0 0 .066406.50391 4 4 0 0 0 -.60352.4082c-.3828-.11694-.68075-.35236-.93164-.66602-.35779-.4472-.53125-1.0833-.53125-1.25a1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/DebugContinue.svg b/editor/icons/DebugContinue.svg
new file mode 100644
index 0000000000..cf9e0724c2
--- /dev/null
+++ b/editor/icons/DebugContinue.svg
@@ -0,0 +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="m10 4v3h-5v2h5v3l2.5-2 2.5-2-2.5-2z" fill="#ff8484" transform="translate(0 1036.4)"/><circle cx="4" cy="1044.4" fill="#e0e0e0" r="3"/></g></svg>
diff --git a/editor/icons/DebugNext.svg b/editor/icons/DebugNext.svg
new file mode 100644
index 0000000000..d510aff828
--- /dev/null
+++ b/editor/icons/DebugNext.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1v10h-2l1.5 2 1.5 2 1.5-2 1.5-2h-2v-10z" fill="#ff8484"/><path d="m7 1v2h8v-2zm2 4v2h6v-2zm0 4v2h6v-2zm-2 4v2h8v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/DebugSkipBreakpointsOff.svg b/editor/icons/DebugSkipBreakpointsOff.svg
new file mode 100644
index 0000000000..e7228c599f
--- /dev/null
+++ b/editor/icons/DebugSkipBreakpointsOff.svg
@@ -0,0 +1 @@
+<svg height="17" viewBox="0 0 17 17" width="17" xmlns="http://www.w3.org/2000/svg"><path d="m4.8983252 3.006855a1.6192284 1.3289529 0 0 1 -.0000431.0097" stroke-width=".626319"/><path d="m8.796752 5.0553513a2.563139 3.6270869 0 0 1 -.0000683.02648" stroke-width=".626319"/><path d="m13.121337 4.512148a6.1594577 6.0545759 0 0 1 -.248787 8.20109 6.1594577 6.0545759 0 0 1 -8.3355404.427215 6.1594577 6.0545759 0 0 1 -1.1151058-8.1311866 6.1594577 6.0545759 0 0 1 8.1530832-1.7576713" fill="#ff8585" fill-opacity=".996078" stroke-width="1.019123"/></svg>
diff --git a/editor/icons/DebugSkipBreakpointsOn.svg b/editor/icons/DebugSkipBreakpointsOn.svg
new file mode 100644
index 0000000000..0836954bbb
--- /dev/null
+++ b/editor/icons/DebugSkipBreakpointsOn.svg
@@ -0,0 +1 @@
+<svg height="17" viewBox="0 0 17 17" width="17" xmlns="http://www.w3.org/2000/svg"><path d="m4.8983252 3.006855a1.6192284 1.3289529 0 0 1 -.0000431.0097" stroke-width=".626319"/><path d="m8.796752 5.0553513a2.563139 3.6270869 0 0 1 -.0000683.02648" stroke-width=".626319"/><path d="m13.121337 4.512148a6.1594577 6.0545759 0 0 1 -.248787 8.20109 6.1594577 6.0545759 0 0 1 -8.3355404.427215 6.1594577 6.0545759 0 0 1 -1.1151058-8.1311866 6.1594577 6.0545759 0 0 1 8.1530832-1.7576713" fill="#ff8585" fill-opacity=".996078" stroke-width="1.019123"/><path d="m-9.290675 10.816157h18.575495v2.518711h-18.575495z" fill="#e0e0e0" stroke-width="1.187332" transform="matrix(.70605846 -.70815355 .70605846 .70815355 0 0)"/></svg>
diff --git a/editor/icons/DebugStep.svg b/editor/icons/DebugStep.svg
new file mode 100644
index 0000000000..b26e9b7b25
--- /dev/null
+++ b/editor/icons/DebugStep.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v8 2h2 1v2l2-1.5 2-1.5-2-1.5-2-1.5v2h-1v-8z" fill="#ff8484"/><path d="m7 1v2h8v-2zm2 4v2h6v-2zm0 4v2h6v-2zm-2 4v2h8v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Decal.svg b/editor/icons/Decal.svg
new file mode 100644
index 0000000000..2a61ceb0a0
--- /dev/null
+++ b/editor/icons/Decal.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2c-3.3137085 0-6 2.6862915-6 6 0 2.220299 1.2092804 4.153789 3.0019531 5.191406l8.9082029-6.1894529c-.476307-2.8374399-2.937354-5.0019531-5.910156-5.0019531z" fill="#fc9c9c"/><path d="m5.001954 13.191406 8.908202-6.1894529c-.882819-.510985-1.904638-.808594-2.998046-.808594-3.3137079 0-6 2.686292-6 5.9999999 0 .340906.03522.672663.08984.998047z" fill="#ff5d5d"/><path d="m13.910156 7.0019531-8.908202 6.1894529c.882819.510985 1.904638.808594 2.998046.808594 3.313708 0 6-2.686292 6-5.9999999 0-.340906-.03522-.672663-.08984-.998047z" fill="#fc9c9c" fill-opacity=".392157"/></svg>
diff --git a/editor/icons/DefaultProjectIcon.svg b/editor/icons/DefaultProjectIcon.svg
new file mode 100644
index 0000000000..f81ba4d390
--- /dev/null
+++ b/editor/icons/DefaultProjectIcon.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><g stroke-linejoin="round"><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8z" fill="#355570" stroke-linecap="round" stroke-width="2"/><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8zm0 2h48c3.324 0 6 2.676 6 6v48c0 3.324-2.676 6-6 6h-48c-3.324 0-6-2.676-6-6v-48c0-3.324 2.676-6 6-6z" fill-opacity=".19608" stroke-linecap="round" stroke-width="2"/><path d="m27.254 10c-2.1314.47383-4.2401 1.134-6.2168 2.1289.04521 1.7455.15796 3.4164.38672 5.1152-.76768.4919-1.574.91443-2.291 1.4902-.72854.5604-1.4731 1.0965-2.1328 1.752-1.3179-.8716-2.7115-1.691-4.1484-2.4141-1.549 1.667-2.9985 3.4672-4.1816 5.4805.89011 1.4399 1.8209 2.7894 2.8242 4.0703h.027343v9.9453 1.2617 1.1504l-.009765 1.6309h-.001953c.0031.7321.011718 1.5356.011718 1.6953 0 7.1942 9.1264 10.652 20.465 10.691h.013672.013672c11.338-.04 20.461-3.4972 20.461-10.691 0-.1626.010282-.96271.013672-1.6953h-.001953l-.011719-1.6309v-.98633l.003907-.001953v-11.369h.027343c1.0035-1.2809 1.9337-2.6304 2.8242-4.0703-1.1827-2.0133-2.6327-3.8135-4.1816-5.4805-1.4366.7231-2.8325 1.5425-4.1504 2.4141-.65947-.6555-1.4013-1.1916-2.1309-1.752-.71682-.5758-1.5248-.99833-2.291-1.4902.22813-1.6988.3413-3.3697.38672-5.1152-1.977-.99494-4.0863-1.6551-6.2188-2.1289-.85139 1.4309-1.6285 2.9812-2.3066 4.4961-.80409-.1344-1.613-.18571-2.4219-.19531h-.015625-.015625c-.81037.01-1.6176.060513-2.4219.19531-.67768-1.5149-1.4559-3.0652-2.3086-4.4961z" fill="#fff" stroke="#fff" stroke-width="3"/></g><g stroke-width=".32031" transform="matrix(.050279 0 0 .050279 6.2574 1.18)"><path d="m0 0s-.325 1.994-.515 1.976l-36.182-3.491c-2.879-.278-5.115-2.574-5.317-5.459l-.994-14.247-27.992-1.997-1.904 12.912c-.424 2.872-2.932 5.037-5.835 5.037h-38.188c-2.902 0-5.41-2.165-5.834-5.037l-1.905-12.912-27.992 1.997-.994 14.247c-.202 2.886-2.438 5.182-5.317 5.46l-36.2 3.49c-.187.018-.324-1.978-.511-1.978l-.049-7.83 30.658-4.944 1.004-14.374c.203-2.91 2.551-5.263 5.463-5.472l38.551-2.75c.146-.01.29-.016.434-.016 2.897 0 5.401 2.166 5.825 5.038l1.959 13.286h28.005l1.959-13.286c.423-2.871 2.93-5.037 5.831-5.037.142 0 .284.005.423.015l38.556 2.75c2.911.209 5.26 2.562 5.463 5.472l1.003 14.374 30.645 4.966z" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 919.24 771.67)"/><path d="m0 0v-59.041c.108-.001.216-.005.323-.015l36.196-3.49c1.896-.183 3.382-1.709 3.514-3.609l1.116-15.978 31.574-2.253 2.175 14.747c.282 1.912 1.922 3.329 3.856 3.329h38.188c1.933 0 3.573-1.417 3.855-3.329l2.175-14.747 31.575 2.253 1.115 15.978c.133 1.9 1.618 3.425 3.514 3.609l36.182 3.49c.107.01.214.014.322.015v4.711l.015.005v54.325h.134c4.795 6.12 9.232 12.569 13.487 19.449-5.651 9.62-12.575 18.217-19.976 26.182-6.864-3.455-13.531-7.369-19.828-11.534-3.151 3.132-6.7 5.694-10.186 8.372-3.425 2.751-7.285 4.768-10.946 7.118 1.09 8.117 1.629 16.108 1.846 24.448-9.446 4.754-19.519 7.906-29.708 10.17-4.068-6.837-7.788-14.241-11.028-21.479-3.842.642-7.702.88-11.567.926v.006c-.027 0-.052-.006-.075-.006-.024 0-.049.006-.073.006v-.006c-3.872-.046-7.729-.284-11.572-.926-3.238 7.238-6.956 14.642-11.03 21.479-10.184-2.264-20.258-5.416-29.703-10.17.216-8.34.755-16.331 1.848-24.448-3.668-2.35-7.523-4.367-10.949-7.118-3.481-2.678-7.036-5.24-10.188-8.372-6.297 4.165-12.962 8.079-19.828 11.534-7.401-7.965-14.321-16.562-19.974-26.182 4.253-6.88 8.693-13.329 13.487-19.449z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 104.7 525.91)"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916 0-3.569 1.406-3.852 3.33l-2.211 14.994h-31.459l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616l-1.121 16.063-32.547 3.138c.015-3.498.06-7.33.06-8.093 0-34.374 43.605-50.896 97.781-51.086h.133c54.176.19 97.766 16.712 97.766 51.086 0 .777.047 4.593.063 8.093z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 784.07 817.24)"/><path d="m0 0c0-12.052-9.765-21.815-21.813-21.815-12.042 0-21.81 9.763-21.81 21.815 0 12.044 9.768 21.802 21.81 21.802 12.048 0 21.813-9.758 21.813-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 389.21 625.67)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996 0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479c8 0 14.479-6.485 14.479-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 367.37 631.06)"/><path d="m0 0c-3.878 0-7.021 2.858-7.021 6.381v20.081c0 3.52 3.143 6.381 7.021 6.381s7.028-2.861 7.028-6.381v-20.081c0-3.523-3.15-6.381-7.028-6.381" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 511.99 724.74)"/><path d="m0 0c0-12.052 9.765-21.815 21.815-21.815 12.041 0 21.808 9.763 21.808 21.815 0 12.044-9.767 21.802-21.808 21.802-12.05 0-21.815-9.758-21.815-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 634.79 625.67)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473 8.002 0 14.479 6.479 14.479 14.473s-6.477 14.479-14.479 14.479c-7.994 0-14.471-6.485-14.471-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 656.64 631.06)"/></g></svg>
diff --git a/editor/icons/DeleteSplit.svg b/editor/icons/DeleteSplit.svg
new file mode 100644
index 0000000000..4ae590f78b
--- /dev/null
+++ b/editor/icons/DeleteSplit.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m.623213 6.939446h1.845669v2.085366h-1.845669z" fill="#800000"/><path d="m12.488225 7.179143h1.629941v1.989487h-1.629941z" fill="#800000"/><g fill="#e9afaf"><path d="m2.540791 7.970143h3.164003v.407485h-3.164003z"/><path d="m9.012615 8.042052h3.523549v.527334h-3.523549z"/><g transform="matrix(-.55917959 .82904655 -.82904655 -.55917959 0 0)"><path d="m1.511097-9.732645h3.643398v.455425h-3.643398z"/><path d="m.07207-12.144793h3.643398v.455425h-3.643398z"/></g></g></svg>
diff --git a/editor/icons/Dictionary.svg b/editor/icons/Dictionary.svg
new file mode 100644
index 0000000000..c835398836
--- /dev/null
+++ b/editor/icons/Dictionary.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2v2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-8zm3 0v2h2v-2zm7 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2zm-2 2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2zm-3 3v-1h-2v4h2zm-5-1v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#77edb1"/></svg>
diff --git a/editor/icons/DirectionalLight3D.svg b/editor/icons/DirectionalLight3D.svg
new file mode 100644
index 0000000000..ff033636be
--- /dev/null
+++ b/editor/icons/DirectionalLight3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3h2v-3zm-2.5352 2.0508-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-3.5352 1.9492c-1.6569 0-3 1.3432-3 3s1.3431 3 3 3 3-1.3432 3-3-1.3431-3-3-3zm-7 2v2h3v-2zm11 0v2h3v-2zm-7.5352 3.1211-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.5352 1.8789v3h2v-3z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/DistractionFree.svg b/editor/icons/DistractionFree.svg
new file mode 100644
index 0000000000..d4778930d2
--- /dev/null
+++ b/editor/icons/DistractionFree.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v5l1.793-1.793 2.5 2.5 1.4141-1.4141-2.5-2.5 1.793-1.793h-5zm9 0 1.793 1.793-2.5 2.5 1.4141 1.4141 2.5-2.5 1.793 1.793v-5h-5zm-4.707 8.293-2.5 2.5-1.793-1.793v5h5l-1.793-1.793 2.5-2.5-1.4141-1.4141zm5.4141 0-1.4141 1.4141 2.5 2.5-1.793 1.793h5v-5l-1.793 1.793-2.5-2.5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Duplicate.svg b/editor/icons/Duplicate.svg
new file mode 100644
index 0000000000..a7381f919f
--- /dev/null
+++ b/editor/icons/Duplicate.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1v11h9v-6h-5v-5zm5 0v4h4zm-8 3v11h2 8v-2h-8v-9z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/DynamicFont.svg b/editor/icons/DynamicFont.svg
new file mode 100644
index 0000000000..bbaa12ea1b
--- /dev/null
+++ b/editor/icons/DynamicFont.svg
@@ -0,0 +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="m1 1037.4v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#e0e0e0"/><path d="m4 5v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#84c2ff" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/DynamicFontData.svg b/editor/icons/DynamicFontData.svg
new file mode 100644
index 0000000000..7ee88582a5
--- /dev/null
+++ b/editor/icons/DynamicFontData.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2zm0 5v2h2v-2zm0 3v2h2v-2zm0 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0"/><path d="m4 5v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#ff8484"/></svg>
diff --git a/editor/icons/Edit.svg b/editor/icons/Edit.svg
new file mode 100644
index 0000000000..6fc7ae012d
--- /dev/null
+++ b/editor/icons/Edit.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/EditBezier.svg b/editor/icons/EditBezier.svg
new file mode 100644
index 0000000000..3feff790dc
--- /dev/null
+++ b/editor/icons/EditBezier.svg
@@ -0,0 +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="m1.4758015 1050.3064c11.6492855.7191 3.1098343-11.4976 12.2331255-11.3475" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="2.2"/><g fill="#e0e0e0"><circle cx="13.470984" cy="1038.7133" r="1.823002"/><circle cx="2.444912" cy="1050.1708" r="1.823002"/></g></g></svg>
diff --git a/editor/icons/EditInternal.svg b/editor/icons/EditInternal.svg
new file mode 100644
index 0000000000..7daf7ec29a
--- /dev/null
+++ b/editor/icons/EditInternal.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m7 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1z" transform="translate(-3.322034)"/><circle cx="10.508475" cy="12.677966" r="2.372881"/></g></svg>
diff --git a/editor/icons/EditKey.svg b/editor/icons/EditKey.svg
new file mode 100644
index 0000000000..455c544e6a
--- /dev/null
+++ b/editor/icons/EditKey.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-7 3c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm6 1v7l2 3 2-3v-7zm1 1h1v5h-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/EditPivot.svg b/editor/icons/EditPivot.svg
new file mode 100644
index 0000000000..140fbd629f
--- /dev/null
+++ b/editor/icons/EditPivot.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v4h2v-4zm-6 6v2h4v-2zm10 0v.61328l3.3711 1.3867h.62891v-2h-4zm-3 1 3.291 8 .94726-2.8203 1.8828 1.8828.94336-.94141-1.8848-1.8828 2.8203-.94726-8-3.291zm-1 3v4h2v-.625l-1.3887-3.375h-.61133z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/EditResource.svg b/editor/icons/EditResource.svg
new file mode 100644
index 0000000000..3b14428b90
--- /dev/null
+++ b/editor/icons/EditResource.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3.9902-.0097656a1.0001 1.0001 0 0 0 -.69727 1.7168l1.293 1.293h-3.5859v2h3.5859l-1.293 1.293a1.0001 1.0001 0 1 0 1.4141 1.4141l3-3a1.0001 1.0001 0 0 0 0-1.4141l-3-3a1.0001 1.0001 0 0 0 -.7168-.30273z" fill="#e0e0e0" fill-opacity=".78431"/></svg>
diff --git a/editor/icons/Editor3DHandle.svg b/editor/icons/Editor3DHandle.svg
new file mode 100644
index 0000000000..f63234f410
--- /dev/null
+++ b/editor/icons/Editor3DHandle.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" fill-opacity=".29412" r="8"/><circle cx="8" cy="8" fill="#fff" r="7"/><circle cx="8" cy="8" fill="#ff8484" r="5"/></svg>
diff --git a/editor/icons/EditorControlAnchor.svg b/editor/icons/EditorControlAnchor.svg
new file mode 100644
index 0000000000..4574f5d7be
--- /dev/null
+++ b/editor/icons/EditorControlAnchor.svg
@@ -0,0 +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="m5 0a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 1.0566-.11914l9.9434 6.1191-6.1172-9.9395a5 5 0 0 0 .11719-1.0605 5 5 0 0 0 -5-5z" fill-opacity=".39216" transform="translate(0 1036.4)"/><path d="m5 1a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 1.1406-.16992l9.8594 7.1699-7.168-9.8555a4 4 0 0 0 .16797-1.1445 4 4 0 0 0 -4-4z" fill="#a5efac" fill-rule="evenodd" transform="translate(0 1036.4)"/><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/><circle cx="5" cy="1041.4" fill="#a5efac" r="0"/></g></svg>
diff --git a/editor/icons/EditorCurveHandle.svg b/editor/icons/EditorCurveHandle.svg
new file mode 100644
index 0000000000..ea69f4e4cc
--- /dev/null
+++ b/editor/icons/EditorCurveHandle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill="#fefefe" r="2.75" stroke="#000" stroke-linecap="square"/></svg>
diff --git a/editor/icons/EditorFileDialog.svg b/editor/icons/EditorFileDialog.svg
new file mode 100644
index 0000000000..c1e5479525
--- /dev/null
+++ b/editor/icons/EditorFileDialog.svg
@@ -0,0 +1 @@
+<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm3 2h3c1 0 1 2 2 2h3v4h-8z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/EditorHandle.svg b/editor/icons/EditorHandle.svg
new file mode 100644
index 0000000000..a56e64bde3
--- /dev/null
+++ b/editor/icons/EditorHandle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill-opacity=".29412" r="5"/><circle cx="5" cy="5" fill="#fff" r="4"/><circle cx="5" cy="5" fill="#ff8484" r="3"/></svg>
diff --git a/editor/icons/EditorHandleAdd.svg b/editor/icons/EditorHandleAdd.svg
new file mode 100644
index 0000000000..82d3730d3c
--- /dev/null
+++ b/editor/icons/EditorHandleAdd.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill-opacity=".29412" r="5"/><circle cx="5" cy="5" fill="#474747" r="4"/><path d="m4 2v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/EditorInternalHandle.svg b/editor/icons/EditorInternalHandle.svg
new file mode 100644
index 0000000000..dbb7bc289f
--- /dev/null
+++ b/editor/icons/EditorInternalHandle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill-opacity=".29412" r="5"/><circle cx="5" cy="5" fill="#fff" r="4"/><circle cx="5" cy="5" fill="#84b1ff" r="3"/></svg>
diff --git a/editor/icons/EditorPathSharpHandle.svg b/editor/icons/EditorPathSharpHandle.svg
new file mode 100644
index 0000000000..328dc04677
--- /dev/null
+++ b/editor/icons/EditorPathSharpHandle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m-3.035534-10.106602h6.071068v6.071068h-6.071068z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="matrix(-.70710678 .70710678 -.70710678 -.70710678 0 0)"/></svg>
diff --git a/editor/icons/EditorPathSmoothHandle.svg b/editor/icons/EditorPathSmoothHandle.svg
new file mode 100644
index 0000000000..b498345d5a
--- /dev/null
+++ b/editor/icons/EditorPathSmoothHandle.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m1.5-8.5h7v7h-7z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="rotate(90)"/></svg>
diff --git a/editor/icons/EditorPivot.svg b/editor/icons/EditorPivot.svg
new file mode 100644
index 0000000000..ecb5dd95b7
--- /dev/null
+++ b/editor/icons/EditorPivot.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v6h-6v4h6v6h4v-6h6v-4h-6v-6zm1 7h2v2h-2z" fill="#fff" fill-opacity=".70588"/><path d="m7 1v5h2v-5zm-6 6v2h5v-2zm9 0v2h5v-2zm-3 3v5h2v-5z" fill="#ff8484"/></svg>
diff --git a/editor/icons/EditorPlugin.svg b/editor/icons/EditorPlugin.svg
new file mode 100644
index 0000000000..7008762fa8
--- /dev/null
+++ b/editor/icons/EditorPlugin.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v8c.0000552.5523.44774.9999 1 1h3v.27148a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-.26953h3c.55226-.0001.99994-.4477 1-1v-3h.27148a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-.26953v-3c-.000055-.5523-.44774-.9999-1-1h-8z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/EditorPosition.svg b/editor/icons/EditorPosition.svg
new file mode 100644
index 0000000000..09f09feffc
--- /dev/null
+++ b/editor/icons/EditorPosition.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v4.4199a4.2662 4.0576 0 0 0 -1.709 1.5801h-4.291v4h4.2949a4.2662 4.0576 0 0 0 1.7051 1.582v4.418h4v-4.4199a4.2662 4.0576 0 0 0 1.709-1.5801h4.291v-4h-4.2949a4.2662 4.0576 0 0 0 -1.7051-1.582v-4.418z" fill="#fff" fill-opacity=".70588"/><path d="m7 1v3.0605a4.2662 4.0576 0 0 1 1-.11914 4.2662 4.0576 0 0 1 1 .11914v-3.0605zm1 4.0801a2.9201 2.9201 0 0 0 -2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199-2.9199 2.9201 2.9201 0 0 0 -2.9199-2.9199zm-7 1.9199v2h2.8691a4.2662 4.0576 0 0 1 -.13477-1 4.2662 4.0576 0 0 1 .13672-1h-2.8711zm11.131 0a4.2662 4.0576 0 0 1 .13477 1 4.2662 4.0576 0 0 1 -.13672 1h2.8711v-2h-2.8691zm-5.1309 4.9395v3.0605h2v-3.0605a4.2662 4.0576 0 0 1 -1 .11914 4.2662 4.0576 0 0 1 -1-.11914z" fill="#ff8484"/></svg>
diff --git a/editor/icons/EditorPositionPrevious.svg b/editor/icons/EditorPositionPrevious.svg
new file mode 100644
index 0000000000..ba69650d81
--- /dev/null
+++ b/editor/icons/EditorPositionPrevious.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3.0605a4.2662 4.0576 0 0 1 1-.11914 4.2662 4.0576 0 0 1 1 .11914v-3.0605zm1 4.0801a2.9201 2.9201 0 0 0 -2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199-2.9199 2.9201 2.9201 0 0 0 -2.9199-2.9199zm-7 1.9199v2h2.8691a4.2662 4.0576 0 0 1 -.13477-1 4.2662 4.0576 0 0 1 .13672-1h-2.8711zm11.131 0a4.2662 4.0576 0 0 1 .13477 1 4.2662 4.0576 0 0 1 -.13672 1h2.8711v-2h-2.8691zm-5.1309 4.9395v3.0605h2v-3.0605a4.2662 4.0576 0 0 1 -1 .11914 4.2662 4.0576 0 0 1 -1-.11914z" fill="#69f" fill-opacity=".69804"/></svg>
diff --git a/editor/icons/EditorPositionUnselected.svg b/editor/icons/EditorPositionUnselected.svg
new file mode 100644
index 0000000000..881fcab079
--- /dev/null
+++ b/editor/icons/EditorPositionUnselected.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v4.4199a4.2662 4.0576 0 0 0 -1.709 1.5801h-4.291v4h4.2949a4.2662 4.0576 0 0 0 1.7051 1.582v4.418h4v-4.4199a4.2662 4.0576 0 0 0 1.709-1.5801h4.291v-4h-4.2949a4.2662 4.0576 0 0 0 -1.7051-1.582v-4.418z" fill-opacity=".41077"/><path d="m7 1v3.0605a4.2662 4.0576 0 0 1 1-.11914 4.2662 4.0576 0 0 1 1 .11914v-3.0605zm1 4.0801a2.9201 2.9201 0 0 0 -2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199-2.9199 2.9201 2.9201 0 0 0 -2.9199-2.9199zm-7 1.9199v2h2.8691a4.2662 4.0576 0 0 1 -.13477-1 4.2662 4.0576 0 0 1 .13672-1h-2.8711zm11.131 0a4.2662 4.0576 0 0 1 .13477 1 4.2662 4.0576 0 0 1 -.13672 1h2.8711v-2h-2.8691zm-5.1309 4.9395v3.0605h2v-3.0605a4.2662 4.0576 0 0 1 -1 .11914 4.2662 4.0576 0 0 1 -1-.11914z" fill="#d9d9d9"/></svg>
diff --git a/editor/icons/Enum.svg b/editor/icons/Enum.svg
new file mode 100644
index 0000000000..45d2c7e24c
--- /dev/null
+++ b/editor/icons/Enum.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-.5304.0000801-1.0391.21085-1.4141.58594-.37509.37501-.58586.88366-.58594 1.4141v1c-.2652.0000401-.51953.10542-.70703.29297-.18755.18751-.29293.44183-.29297.70703.00004008.2652.10542.51953.29297.70703.18751.18755.44183.29293.70703.29297v1c.0000801.5304.21085 1.0391.58594 1.4141.37501.37509.88366.58586 1.4141.58594h1v-2h-1v-4h1v-2zm3 0v8h4v-2h-2v-1h2v-2h-2v-1h2v-2zm6 0v2h1v4h-1v2h1c.5304-.0000803 1.0391-.21085 1.4141-.58594.37509-.37501.58586-.88366.58594-1.4141v-1c.2652-.0000401.51953-.10542.70703-.29297.18755-.18751.29293-.44183.29297-.70703-.00004-.2652-.10542-.51953-.29297-.70703-.1875-.18755-.44183-.29293-.70703-.29297v-1c-.00008-.5304-.21085-1.0391-.58594-1.4141-.37501-.37509-.88366-.58586-1.4141-.58594z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Environment.svg b/editor/icons/Environment.svg
new file mode 100644
index 0000000000..f42ae39bc0
--- /dev/null
+++ b/editor/icons/Environment.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0"><circle cx="8" cy="8" r="6" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><g stroke-width="1.5" transform="translate(0 -1036.4)"><path d="m2 1044.4c4.5932 1.582 8.3985 1.0627 12 0"/><path d="m8 1038.4c-3 4-3 8 0 12"/><path d="m8 1038.4c3 4 3 8 0 12"/></g></g></svg>
diff --git a/editor/icons/Error.svg b/editor/icons/Error.svg
new file mode 100644
index 0000000000..4b306ae1ca
--- /dev/null
+++ b/editor/icons/Error.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#ff5d5d" height="8" ry="4" width="8"/></svg>
diff --git a/editor/icons/ErrorSign.svg b/editor/icons/ErrorSign.svg
new file mode 100644
index 0000000000..85a2cda346
--- /dev/null
+++ b/editor/icons/ErrorSign.svg
@@ -0,0 +1 @@
+<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1020.4)"><path d="m10 1048.4h12l6-6v-12l-6-6h-12l-6 6v12z" fill="#ff5d5d" fill-rule="evenodd"/><path d="m14 8 1 10h2l1-10zm2 12a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#fff" transform="translate(0 1020.4)"/></g></svg>
diff --git a/editor/icons/ErrorWarning.svg b/editor/icons/ErrorWarning.svg
new file mode 100644
index 0000000000..53b7be2763
--- /dev/null
+++ b/editor/icons/ErrorWarning.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m4 0c-2.216 0-4 1.784-4 4s1.784 4 4 4z" fill="#ff5d5d"/><path d="m4 .00000003c2.216 0 4 1.78399997 4 3.99999997s-1.784 4-4 4z" fill="#ffdd65"/></svg>
diff --git a/editor/icons/ExpandBottomDock.svg b/editor/icons/ExpandBottomDock.svg
new file mode 100644
index 0000000000..636d4f8b83
--- /dev/null
+++ b/editor/icons/ExpandBottomDock.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.2130251 4.516057-3.5355339 3.5355339h2.5356849v4.9737171h1.9998394v-4.9737171h2.5356849l-3.5355339-3.5355339z"/><path d="m11.907306 4.6119359-3.5355342 3.5355339h2.5356852v4.9737172h1.999839v-4.9737172h2.535685l-3.535534-3.5355339z"/><path d="m1.288136 1.370074h14v1.830509h-14z"/></g></svg>
diff --git a/editor/icons/Favorites.svg b/editor/icons/Favorites.svg
new file mode 100644
index 0000000000..67f62f26d5
--- /dev/null
+++ b/editor/icons/Favorites.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1038.1-2.3741 4.0973-4.6259 1.0978 3.2361 3.4074-.35866 4.6735 4.1389-1.9766 4.1572 1.9421-.39534-4.6532 3.2218-3.3932-4.6259-1.0978z" fill="#e0e0e0" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/File.svg b/editor/icons/File.svg
new file mode 100644
index 0000000000..d3c01ca45e
--- /dev/null
+++ b/editor/icons/File.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v14h12v-9h-5v-5zm8 0v4h4z" fill="#e0e0e0" transform="translate(0 -.000017)"/></svg>
diff --git a/editor/icons/FileBigThumb.svg b/editor/icons/FileBigThumb.svg
new file mode 100644
index 0000000000..214bd1d56b
--- /dev/null
+++ b/editor/icons/FileBigThumb.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m14 5c-2.1987 0-4 1.8013-4 4v46c0 2.1987 1.8013 4 4 4h36c2.1987 0 4-1.8013 4-4v-33h-.007812c.00212-.24832-.079273-.50098-.28516-.70703l-16-16c-.18786-.18693-.44246-.28939-.70703-.28906v-.0039062h-23zm0 2h22v2 10c0 2.1987 1.8013 4 4 4h10 2v32c0 1.1253-.87472 2-2 2h-36c-1.1253 0-2-.8747-2-2v-46c0-1.1253.87472-2 2-2z" fill="#fff" fill-opacity=".58824" transform="translate(0 -.000017)"/></svg>
diff --git a/editor/icons/FileBroken.svg b/editor/icons/FileBroken.svg
new file mode 100644
index 0000000000..2f5099aa29
--- /dev/null
+++ b/editor/icons/FileBroken.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v8.5859l1.293-1.293a1.0001 1.0001 0 0 1 .69141-.29102 1.0001 1.0001 0 0 1 .72266.29102l2.293 2.293 2.293-2.293a1.0001 1.0001 0 0 1 1.4141 0l2.293 2.293 1-1v-3.5859h-5v-5h-7zm8 0v4h4zm-6 9.4141-2 2v2.5859h12v-2.5859l-.29297.29297a1.0001 1.0001 0 0 1 -1.4141 0l-2.293-2.293-2.293 2.293a1.0001 1.0001 0 0 1 -1.4141 0l-2.293-2.293z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg>
diff --git a/editor/icons/FileBrokenBigThumb.svg b/editor/icons/FileBrokenBigThumb.svg
new file mode 100644
index 0000000000..effaa0afe9
--- /dev/null
+++ b/editor/icons/FileBrokenBigThumb.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m14 5c-2.1987 0-4 1.8013-4 4v26.172a1.0001 1.0001 0 0 0 1.707.70703l3.293-3.293 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l9.293-9.293 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l8-8a1.0001 1.0001 0 0 0 .29297-.70703v-11.172a1.0001 1.0001 0 0 0 -.29297-.70703l-16-16a1.0001 1.0001 0 0 0 -.70703-.29297h-23zm0 2h22v12c0 2.1987 1.8013 4 4 4h12v9.7578l-7 7-9.293-9.293a1.0001 1.0001 0 0 0 -1.4141 0l-9.293 9.293-9.293-9.293a1.0001 1.0001 0 0 0 -1.4141 0l-2.293 2.293v-23.758c0-1.1253.87473-2 2-2zm.98438 28.83a1.0001 1.0001 0 0 0 -.69141.29297l-4 4a1.0001 1.0001 0 0 0 -.29297.70703v14.17c0 2.1987 1.8013 4 4 4h36c2.1987 0 4-1.8013 4-4v-16.17a1.0001 1.0001 0 0 0 -1.707-.70703l-7.293 7.293-9.293-9.293a1.0001 1.0001 0 0 0 -1.4141 0l-9.293 9.293-9.293-9.293a1.0001 1.0001 0 0 0 -.72266-.29297zm.015625 2.4141 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l9.293-9.293 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l6.293-6.293v13.756c0 1.1253-.87473 2-2 2h-36c-1.1253 0-2-.87473-2-2v-13.756l3-3z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg>
diff --git a/editor/icons/FileDead.svg b/editor/icons/FileDead.svg
new file mode 100644
index 0000000000..f8df831a22
--- /dev/null
+++ b/editor/icons/FileDead.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v14h12v-9h-5v-5zm8 0v4h4zm-6.0078 6c.1353-.0020779.26567.050774.36133.14648l.64648.64648.64648-.64648c.09183-.091882.21582-.14442.3457-.14648.1353-.00208.26567.050774.36133.14648.19521.19525.19521.51178 0 .70703l-.64648.64648.64648.64648c.19521.19525.19521.51178 0 .70703-.19525.19521-.51178.19521-.70703 0l-.64648-.64648-.64648.64648c-.19525.19521-.51178.19521-.70703 0-.19521-.19525-.19521-.51178 0-.70703l.64648-.64648-.64648-.64648c-.19521-.19525-.19521-.51178 0-.70703.09183-.091882.21582-.14442.3457-.14648zm6 0c.1353-.00208.26567.050774.36133.14648l.64648.64648.64648-.64648c.09183-.091883.21582-.14442.3457-.14648.1353-.00208.26567.050774.36133.14648.19521.19525.19521.51178 0 .70703l-.64648.64648.64648.64648c.19521.19525.19521.51178 0 .70703-.19525.19521-.51178.19521-.70703 0l-.64648-.64648-.64648.64648c-.19525.19521-.51178.19521-.70703 0-.19521-.19525-.19521-.51178 0-.70703l.64648-.64648-.64648-.64648c-.19521-.19525-.19521-.51178 0-.70703.09183-.091882.21582-.14442.3457-.14648zm-6.4922 4h9c.277 0 .5.223.5.5s-.223.5-.5.5h-4.5c0 1.1046-.89543 2-2 2s-2-.8954-2-2h-.5c-.277 0-.5-.223-.5-.5s.223-.5.5-.5zm1.5 1c-.000019.5523.44771 1 1 1s1-.4477 1-1z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg>
diff --git a/editor/icons/FileDeadBigThumb.svg b/editor/icons/FileDeadBigThumb.svg
new file mode 100644
index 0000000000..ca4578e7b7
--- /dev/null
+++ b/editor/icons/FileDeadBigThumb.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m14 993.36c-2.1987 0-4 1.8013-4 4v46c0 2.1987 1.8013 4 4 4h36c2.1987 0 4-1.8013 4-4v-33h-.0078c.002-.2483-.0793-.501-.28516-.707l-16-16c-.18788-.18693-.44247-.28939-.70704-.28907v-.004zm0 2h22v12c0 2.1987 1.8013 4 4 4h12v32c0 1.1253-.87472 2-2 2h-36c-1.1253 0-2-.8747-2-2v-46c0-1.1253.87472-2 2-2zm2.9512 22.002a1 1 0 0 0 -.60938.2461 1 1 0 0 0 -.09375 1.4121l2.9238 3.3398-2.9238 3.3418a1 1 0 0 0 .09375 1.4121 1 1 0 0 0 1.4102-.094l2.748-3.1407 2.748 3.1407a1 1 0 0 0 1.4102.094 1 1 0 0 0 .09375-1.4121l-2.9238-3.3418 2.9238-3.3398a1 1 0 0 0 -.09375-1.4121 1 1 0 0 0 -.63867-.2461 1 1 0 0 0 -.77148.3398l-2.748 3.1406-2.748-3.1406a1 1 0 0 0 -.80078-.3398zm23 0a1 1 0 0 0 -.60938.2461 1 1 0 0 0 -.09375 1.4121l2.9238 3.3398-2.9238 3.3418a1 1 0 0 0 .09375 1.4121 1 1 0 0 0 1.4102-.094l2.748-3.1407 2.748 3.1407a1 1 0 0 0 1.4102.094 1 1 0 0 0 .09375-1.4121l-2.9238-3.3418 2.9238-3.3398a1 1 0 0 0 -.09375-1.4121 1 1 0 0 0 -.63867-.2461 1 1 0 0 0 -.77148.3398l-2.748 3.1406-2.748-3.1406a1 1 0 0 0 -.80078-.3398zm-18.951 13.998a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h3v3c0 2.7527 2.2473 5 5 5s5-2.2473 5-5v-3h9a1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm5 2h6v3c0 1.6793-1.3207 3-3 3s-3-1.3207-3-3z" fill="#ff5d5d" transform="translate(0 -988.360017)"/></svg>
diff --git a/editor/icons/FileDeadMediumThumb.svg b/editor/icons/FileDeadMediumThumb.svg
new file mode 100644
index 0000000000..2d1808b90a
--- /dev/null
+++ b/editor/icons/FileDeadMediumThumb.svg
@@ -0,0 +1 @@
+<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.6447 0-3 1.3553-3 3v24c0 1.6447 1.3553 3 3 3h22c1.6447 0 3-1.3553 3-3v-16.809c-.000051-.2652-.10543-.51952-.29297-.70703l-9.1816-9.1895c-.18719-.18825-.44155-.29435-.70703-.29492h-14.818zm0 2h14v6c0 1.6447 1.3553 3 3 3h6v16c0 .5713-.42868 1-1 1h-22c-.57133 0-1-.4287-1-1v-24c0-.5713.42867-1 1-1zm1.9863 11.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l1.293 1.293-1.293 1.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l1.293-1.293 1.293 1.293a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-1.293-1.293 1.293-1.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-1.293 1.293-1.293-1.293a1 1 0 0 0 -.7207-.29102zm14 0a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l1.293 1.293-1.293 1.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l1.293-1.293 1.293 1.293a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-1.293-1.293 1.293-1.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-1.293 1.293-1.293-1.293a1 1 0 0 0 -.7207-.29102zm-13.986 7.998a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h1a4 4 0 0 0 2 3.4648 4 4 0 0 0 4 0 4 4 0 0 0 2-3.4648h9a1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm3 2h4a2 2 0 0 1 -2 2 2 2 0 0 1 -2-2z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg>
diff --git a/editor/icons/FileDialog.svg b/editor/icons/FileDialog.svg
new file mode 100644
index 0000000000..c1e5479525
--- /dev/null
+++ b/editor/icons/FileDialog.svg
@@ -0,0 +1 @@
+<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm3 2h3c1 0 1 2 2 2h3v4h-8z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/FileList.svg b/editor/icons/FileList.svg
new file mode 100644
index 0000000000..3ba4915350
--- /dev/null
+++ b/editor/icons/FileList.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/FileMediumThumb.svg b/editor/icons/FileMediumThumb.svg
new file mode 100644
index 0000000000..0c2b467bf9
--- /dev/null
+++ b/editor/icons/FileMediumThumb.svg
@@ -0,0 +1 @@
+<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.6447 0-3 1.3553-3 3v24c0 1.6447 1.3553 3 3 3h22c1.6447 0 3-1.3553 3-3v-16.809c-.000051-.2652-.10543-.51952-.29297-.70703l-9.1816-9.1895c-.18719-.18825-.44155-.29435-.70703-.29492zm0 2h14v6c0 1.6447 1.3553 3 3 3h6v16c0 .5713-.42868 1-1 1h-22c-.57133 0-1-.4287-1-1v-24c0-.5713.42867-1 1-1z" fill="#fff" fill-opacity=".58824" transform="translate(0 -.000017)"/></svg>
diff --git a/editor/icons/FileThumbnail.svg b/editor/icons/FileThumbnail.svg
new file mode 100644
index 0000000000..5cf0ddc3f8
--- /dev/null
+++ b/editor/icons/FileThumbnail.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2v5h5v-5zm7 0v5h5v-5zm-7 7v5h5v-5zm7 0v5h5v-5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Filesystem.svg b/editor/icons/Filesystem.svg
new file mode 100644
index 0000000000..a5e1c2f8a9
--- /dev/null
+++ b/editor/icons/Filesystem.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v5h2v8h1 5v1h6v-3h-6v1h-5v-4h5v1h6v-3h-6v1h-5v-2h3v-4h-2l-1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/FixedMaterial.svg b/editor/icons/FixedMaterial.svg
new file mode 100644
index 0000000000..2c30ecac24
--- /dev/null
+++ b/editor/icons/FixedMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1037.4a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-2 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/FixedSpatialMaterial.svg b/editor/icons/FixedSpatialMaterial.svg
new file mode 100644
index 0000000000..6701208560
--- /dev/null
+++ b/editor/icons/FixedSpatialMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -4.8887 2h2.8887 6.8965a7 7 0 0 0 -4.8965-2z" fill="#ff7070"/><path d="m3.1113 3a7 7 0 0 0 -1.4277 2h2.3164a2 2 0 0 1 2-2zm2.8887 0a2 2 0 0 1 2 2h6.3145a7 7 0 0 0 -1.418-2z" fill="#ffeb70"/><path d="m1.6836 5a7 7 0 0 0 -.60547 2h4.9219a2 2 0 0 1 -2-2h-2.3164zm4.3164 2h8.9199a7 7 0 0 0 -.60547-2h-6.3145a2 2 0 0 1 -2 2z" fill="#9dff70"/><path d="m1.0781 7a7 7 0 0 0 -.078125 1 7 7 0 0 0 .080078 1h13.842a7 7 0 0 0 .078125-1 7 7 0 0 0 -.080078-1h-8.9199-4.9219z" fill="#70ffb9"/><path d="m1.0801 9a7 7 0 0 0 .60547 2h12.631a7 7 0 0 0 .60547-2h-13.842z" fill="#70deff"/><path d="m3.1035 13a7 7 0 0 0 4.8965 2 7 7 0 0 0 4.8887-2z" fill="#ff70ac"/><path d="m1.6855 11a7 7 0 0 0 1.418 2h9.7852a7 7 0 0 0 1.4277-2h-12.631z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/Folder.svg b/editor/icons/Folder.svg
new file mode 100644
index 0000000000..c2def257ea
--- /dev/null
+++ b/editor/icons/Folder.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2a1 1 0 0 0 -1 1v2 6 2a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1h-4a1 1 0 0 1 -1-1v-1a1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/FolderBigThumb.svg b/editor/icons/FolderBigThumb.svg
new file mode 100644
index 0000000000..db7d9aa550
--- /dev/null
+++ b/editor/icons/FolderBigThumb.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m12 10c-2.2091 0-4 1.7909-4 4v37h.13086c.45564 1.7647 2.0466 2.9982 3.8691 3h40c2.2091 0 4-1.7909 4-4v-28c0-2.2091-1.7909-4-4-4h-16l-2-4c-.98796-1.9759-1.7909-4-4-4z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/editor/icons/FolderMediumThumb.svg b/editor/icons/FolderMediumThumb.svg
new file mode 100644
index 0000000000..4e9f72e760
--- /dev/null
+++ b/editor/icons/FolderMediumThumb.svg
@@ -0,0 +1 @@
+<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m6 1025.4c-1.1046 0-2 .8954-2 2v18.5h.06543c.22782.8823 1.0233 1.4991 1.9346 1.5h20c1.1046 0 2-.8954 2-2v-14c0-1.1046-.89543-2-2-2h-8l-1-2c-.49398-.988-.89543-2-2-2z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -1020.4)"/></svg>
diff --git a/editor/icons/Font.svg b/editor/icons/Font.svg
new file mode 100644
index 0000000000..2c8d7cb43e
--- /dev/null
+++ b/editor/icons/Font.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m1 1037.4h14v2h-14z"/><path d="m7 1037.4h2v14h-2z"/><path d="m5 1050.4h6v1h-6z"/><path d="m1037.4-2h4v1h-4z" transform="rotate(90)"/><path d="m1037.4-15h4v1h-4z" transform="rotate(90)"/><path d="m2 3v2a2 2 0 0 1 2-2z" transform="translate(0 1036.4)"/><path d="m12 3a2 2 0 0 1 2 2v-2z" transform="translate(0 1036.4)"/><path d="m5 1050.4a2 2 0 0 0 2-2v2z"/><path d="m11 1050.4a2 2 0 0 1 -2-2v2z"/></g></svg>
diff --git a/editor/icons/Forward.svg b/editor/icons/Forward.svg
new file mode 100644
index 0000000000..6eab4884bc
--- /dev/null
+++ b/editor/icons/Forward.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 8 16" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m2 1038.4 4 6-4 6" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/GIProbe.svg b/editor/icons/GIProbe.svg
new file mode 100644
index 0000000000..b66c937317
--- /dev/null
+++ b/editor/icons/GIProbe.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h4v-2h-3v-10h9v-2zm9 3a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.459v.54102c0 .55401.44599 1 1 1h2c.55401 0 1-.44599 1-1v-.54102a4 4 0 0 0 2-3.459 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-1 8v1h2v-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/GIProbeData.svg b/editor/icons/GIProbeData.svg
new file mode 100644
index 0000000000..5975115f4c
--- /dev/null
+++ b/editor/icons/GIProbeData.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h4v-2h-3v-10h9v-2zm2 3v2h2v-2zm7 0a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.459v.54102c0 .55401.44599 1 1 1h2c.55401 0 1-.44599 1-1v-.54102a4 4 0 0 0 2-3.459 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-7 1v2h2v-2zm0 3v2h2v-2zm6 4v1h2v-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/GPUParticles2D.svg b/editor/icons/GPUParticles2D.svg
new file mode 100644
index 0000000000..b291bcda95
--- /dev/null
+++ b/editor/icons/GPUParticles2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a4.5 5 0 0 0 -4.4141 4.0312 3 3 0 0 0 -2.5859 2.9688 3 3 0 0 0 3 3h8a3 3 0 0 0 3-3 3 3 0 0 0 -2.5898-2.9668 4.5 5 0 0 0 -4.4102-4.0332zm-4 11a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm8 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-4 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/GPUParticles3D.svg b/editor/icons/GPUParticles3D.svg
new file mode 100644
index 0000000000..25377f9f5f
--- /dev/null
+++ b/editor/icons/GPUParticles3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a4.5 5 0 0 0 -4.4141 4.0312 3 3 0 0 0 -2.5859 2.9688 3 3 0 0 0 3 3h8a3 3 0 0 0 3-3 3 3 0 0 0 -2.5898-2.9668 4.5 5 0 0 0 -4.4102-4.0332zm-4 11a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm8 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-4 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Generic6DOFJoint3D.svg b/editor/icons/Generic6DOFJoint3D.svg
new file mode 100644
index 0000000000..63df5fc507
--- /dev/null
+++ b/editor/icons/Generic6DOFJoint3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v4.8828l-3.5527-1.7773a1 1 0 0 0 -.48438-.10352 1 1 0 0 0 -.85742.55078 1 1 0 0 0 .44727 1.3418l3.2109 1.6055-3.2109 1.6055a1 1 0 0 0 -.44727 1.3418 1 1 0 0 0 1.3418.44726l3.5527-1.7773v3.8828a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-3.8828l3.5527 1.7773a1 1 0 0 0 1.3418-.44726 1 1 0 0 0 -.44726-1.3418l-3.2109-1.6055 3.2109-1.6055a1 1 0 0 0 .44726-1.3418 1 1 0 0 0 -.88672-.55273 1 1 0 0 0 -.45508.10547l-3.5527 1.7773v-4.8828a1 1 0 0 0 -1-1z" fill="#fc9c9c" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/Gizmo3DSamplePlayer.svg b/editor/icons/Gizmo3DSamplePlayer.svg
new file mode 100644
index 0000000000..d174bcfe07
--- /dev/null
+++ b/editor/icons/Gizmo3DSamplePlayer.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -924.36)"><path d="m63.766 932.37c-2.0369.0594-3.9779.89602-5.4199 2.3359l-.002.002-29.656 29.658h-12.688c-4.3705.00044-7.9996 3.6295-8 8v32c.0004372 4.3705 3.6295 7.9995 8 8h12.688l29.656 29.656c2.4 2.3983 5.9795 2.8662 8.7168 1.7324 2.7373-1.1337 4.9381-3.9958 4.9395-7.3886v-96.004c-.003-4.4555-3.779-8.1211-8.2324-7.9922zm48.234 3.9941c-4.3709 0-8 3.6291-8 8v88c0 4.3709 3.6291 8 8 8s8-3.6291 8-8v-88c0-4.3709-3.6291-8-8-8zm-24 24c-4.3709 0-8 3.6291-8 8v40c0 4.3709 3.6291 8 8 8s8-3.6291 8-8v-40c0-4.3709-3.6291-8-8-8z" fill-opacity=".29412"/><path d="m63.883 12.004c-1.0195.0295-1.9892.4473-2.7109 1.168l-30.828 30.83h-14.344c-2.209.000221-3.9998 1.791-4 4v32c.000221 2.209 1.791 3.9998 4 4h14.344l30.828 30.828c2.52 2.5182 6.8267.73442 6.8281-2.8281v-96.002c-.0015-2.2541-1.8641-4.0619-4.1172-3.9961zm48.117 3.9961a4 4 0 0 0 -4 4v88a4 4 0 0 0 4 4 4 4 0 0 0 4-4v-88a4 4 0 0 0 -4-4zm-24 24a4 4 0 0 0 -4 4v40a4 4 0 0 0 4 4 4 4 0 0 0 4-4v-40a4 4 0 0 0 -4-4z" fill="#f7f5cf" transform="translate(0 924.36)"/></g></svg>
diff --git a/editor/icons/GizmoBakedLightmap.svg b/editor/icons/GizmoBakedLightmap.svg
new file mode 100644
index 0000000000..a7828615fd
--- /dev/null
+++ b/editor/icons/GizmoBakedLightmap.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m18 8c-2.209.00022-3.9998 1.791-4 4l.01563 20h-6.0156c-2.209.00022-3.9998 1.791-4 4v71.076c0 9.3065 7.6174 16.924 16.924 16.924h61.076c2.209-.0002 3.9998-1.791 4-4v-12c-.000221-2.209-1.791-3.9998-4-4h-58v-40h20v12c.000221 2.209 1.791 3.9998 4 4h32c2.209-.0002 3.9998-1.791 4-4v-12h20v4c.002.72576.20093 1.4374.57617 2.0586-.19584-.006-.37901-.058594-.57617-.058594-10.998 0-20 9.0016-20 20-.000004 0-.000004.0098 0 .0098.0088 6.2734 3.0833 12.01 8 15.756v2.2383c0 2.8834 1.66 5.3456 4 6.75v5.2461c.000221 2.209 1.791 3.9998 4 4h8c2.209-.0002 3.9998-1.791 4-4v-5.248c2.3405-1.4043 4-3.8682 4-6.752v-2.2344c4.9179-3.7475 7.9931-9.4866 8-15.762 0-7.935-4.7186-14.774-11.459-18h7.459c2.209-.00022 3.9998-1.791 4-4v-32c-.00022-2.209-1.791-3.9998-4-4l-6-.003906v-19.996c-.00022-2.209-1.791-3.9998-4-4zm8 38c1.1519 0 2 .84806 2 2 .000003 1.1519-.84806 2-2 2s-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm25 0c1.1519 0 2 .84806 2 2 .000003 1.1519-.84806 2-2 2s-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm26 0c1.1519 0 2 .84806 2 2 .000003 1.1519-.84806 2-2 2s-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm25 0c1.1519 0 2 .84806 2 2s-.84806 2-2 2-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm2 38c3.3611 0 6 2.6388 6 6 0 3.361-2.639 6-6 6s-6-2.639-6-6c0-3.3612 2.6389-6 6-6z" fill-opacity=".29412"/><path d="m18 12v16h92v-16zm-10 24v71.076c0 7.1594 5.7644 12.924 12.924 12.924h61.076v-12h-62v-48h88v8h12v-32zm18 6c3.3137-.00001 6 2.6863 6 6 .000009 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm25 0c3.3137-.00001 6 2.6863 6 6 .000009 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm26 0c3.3137-.00001 6 2.6863 6 6 .000009 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm25 0c3.3137-.00001 6 2.6863 6 6 .00001 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm-54 26v8h32v-8zm56 6c-8.8365 0-16 7.1634-16 16 .008 5.7082 3.0565 10.98 8 13.834v4.166c0 2.216 1.784 4 4 4h8c2.216 0 4-1.784 4-4v-4.1602c4.945-2.855 7.9937-8.1299 8-13.84 0-8.8366-7.1635-16-16-16zm0 6c5.5228 0 10 4.4771 10 10 0 5.5228-4.4772 10-10 10s-10-4.4772-10-10c0-5.5229 4.4772-10 10-10zm-4 36v4h8v-4z" fill="#f7f5cf"/></svg>
diff --git a/editor/icons/GizmoCPUParticles3D.svg b/editor/icons/GizmoCPUParticles3D.svg
new file mode 100644
index 0000000000..785cd81625
--- /dev/null
+++ b/editor/icons/GizmoCPUParticles3D.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m35.503779 1.2819066c-3.570424 0-6.435164 2.9483368-6.435164 6.6019028v4.3900146c0 .889114.169457 1.726301.478513 2.49893h-10.081759c-3.570424 0-6.435167 2.931453-6.435167 6.585021v7.969562c-.341543-.0568-.648813-.202614-1.006525-.202614h-4.2901096c-3.5704232 0-6.451665 2.948338-6.451665 6.601904v3.224972c0 3.653568 2.8812418 6.585016 6.451665 6.585016h4.2901096c.358169 0 .664563-.14568 1.006525-.202618v38.497043c-.341543-.05706-.648814-.202616-1.006525-.202616h-4.2901096c-3.5704232 0-6.451665 2.948332-6.451665 6.601908v3.224971c0 3.653575 2.8812418 6.585017 6.451665 6.585017h4.2901096c.358169 0 .664563-.145692 1.006525-.202612v9.725542c0 3.6536 2.864743 6.60193 6.435167 6.60193h9.603246v3.951c0 3.65357 2.86474 6.60192 6.435164 6.60192h3.15158c3.57042 0 6.451663-2.94836 6.451663-6.60192v-3.95104h37.224955v3.951c0 3.65358 2.86474 6.60193 6.435166 6.60193h3.151583c3.570418 0 6.451653-2.94836 6.451653-6.60193v-3.951h10.725281c3.57043 0 6.45166-2.94833 6.45166-6.60191v-9.607372c.14985.0105.27643.0846.42899.0846h4.29014c3.5704 0 6.45165-2.931432 6.45165-6.585011v-3.224992c0-3.653565-2.88125-6.601906-6.45165-6.601906h-4.29014c-.15231 0-.27938.07348-.42899.08472v-38.261071c.14985.01042.27643.08445.42899.08445h4.29014c3.5704 0 6.45165-2.931451 6.45165-6.585023v-3.224986c0-3.653566-2.88125-6.601906-6.45165-6.601906h-4.29014c-.15231 0-.27938.07392-.42899.08446v-7.851429c0-3.653567-2.88123-6.585019-6.45166-6.585021h-11.220281c.309043-.772641.494982-1.609791.494982-2.498929v-4.3900086c0-3.6535651-2.881246-6.601903-6.451662-6.601903h-3.15158c-3.570428 0-6.435167 2.9483379-6.435167 6.601903v4.3900146c0 .889115.16948 1.726301.478507 2.49893h-38.198448c.309083-.772642.495011-1.609792.495011-2.49893v-4.3900146c0-3.6535651-2.881243-6.601903-6.451663-6.601903z" fill="#f7f5cf" stroke="#b4b4b4" stroke-width="2.563805"/><g fill="#b4b4b4" stroke-width="8.546018"><path d="m62.861474 21.661698a27.707285 31.502779 0 0 1 27.143197 25.411422 18.471523 18.901669 0 0 1 15.955909 18.691329 18.471523 18.901669 0 0 1 -18.480472 18.893947h-49.25376a18.471523 18.901669 0 0 1 -18.463973-18.893947 18.471523 18.901669 0 0 1 15.922908-18.708215 27.707285 31.502779 0 0 1 27.176191-25.394536z"/><path d="m38.226348 90.956369a6.1571744 6.3005562 0 0 1 6.154657 6.297979 6.1571744 6.3005562 0 0 1 -6.154657 6.314882 6.1571744 6.3005562 0 0 1 -6.154657-6.314882 6.1571744 6.3005562 0 0 1 6.154657-6.297979z"/><path d="m87.480108 90.956369a6.1571744 6.3005562 0 0 1 6.171159 6.297979 6.1571744 6.3005562 0 0 1 -6.171159 6.314882 6.1571744 6.3005562 0 0 1 -6.154656-6.314882 6.1571744 6.3005562 0 0 1 6.154656-6.297979z"/><path d="m62.861474 97.254348a6.1571744 6.3005562 0 0 1 6.154662 6.314882 6.1571744 6.3005562 0 0 1 -6.154662 6.29797 6.1571744 6.3005562 0 0 1 -6.154651-6.29797 6.1571744 6.3005562 0 0 1 6.154651-6.314882z"/></g></svg>
diff --git a/editor/icons/GizmoCamera.svg b/editor/icons/GizmoCamera.svg
new file mode 100644
index 0000000000..1fa2186197
--- /dev/null
+++ b/editor/icons/GizmoCamera.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -924.36)"><path d="m76 16a28 28 0 0 0 -26.631 19.4 28 28 0 0 0 -13.369-3.4004 28 28 0 0 0 -28 28 28 28 0 0 0 16 25.26v14.74c0 6.648 5.352 12 12 12h48c6.648 0 12-5.352 12-12l24 16v-64l-24 16v-4.4434a28 28 0 0 0 8-19.557 28 28 0 0 0 -28-28z" fill-opacity=".29412" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2" transform="translate(0 924.36)"/><path d="m76 944.36a24 24 0 0 0 -23.906 22.219 24 24 0 0 0 -16.094-6.2192 24 24 0 0 0 -24 24 24 24 0 0 0 16 22.594v17.406c0 4.432 3.5679 8 8 8h48c4.4321 0 8-3.568 8-8v-8l24 16v-48l-24 16v-14.156a24 24 0 0 0 8-17.844 24 24 0 0 0 -24-24z" fill="#f7f5cf"/></g></svg>
diff --git a/editor/icons/GizmoDirectionalLight.svg b/editor/icons/GizmoDirectionalLight.svg
new file mode 100644
index 0000000000..041a694773
--- /dev/null
+++ b/editor/icons/GizmoDirectionalLight.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m64 4c-4.432 0-8 3.568-8 8v16c0 4.432 3.568 8 8 8s8-3.568 8-8v-16c0-4.432-3.568-8-8-8zm-36.77 15.223c-2.045 0-4.0893.78461-5.6562 2.3516-3.1339 3.1339-3.1339 8.1786 0 11.312l11.312 11.314c3.1339 3.1339 8.1806 3.1339 11.314 0s3.1339-8.1806 0-11.314l-11.314-11.312c-1.5669-1.5669-3.6113-2.3516-5.6562-2.3516zm73.539 0c-2.045 0-4.0893.78461-5.6562 2.3516l-11.314 11.312c-3.1339 3.1339-3.1339 8.1806 0 11.314s8.1806 3.1339 11.314 0l11.312-11.314c3.1339-3.1339 3.1339-8.1786 0-11.312-1.567-1.5669-3.6113-2.3516-5.6562-2.3516zm-36.77 20.777a24 24 0 0 0 -24 24 24 24 0 0 0 24 24 24 24 0 0 0 24-24 24 24 0 0 0 -24-24zm-52 16c-4.432 0-8 3.568-8 8s3.568 8 8 8h16c4.432 0 8-3.568 8-8s-3.568-8-8-8zm88 0c-4.432 0-8 3.568-8 8s3.568 8 8 8h16c4.432 0 8-3.568 8-8s-3.568-8-8-8zm-61.455 25.449c-2.045 0-4.0913.78266-5.6582 2.3496l-11.312 11.314c-3.1339 3.1339-3.1339 8.1786 0 11.312 3.1339 3.1339 8.1786 3.1339 11.312 0l11.314-11.312c3.1339-3.1339 3.1339-8.1806 0-11.314-1.5669-1.5669-3.6113-2.3496-5.6562-2.3496zm50.91 0c-2.045 0-4.0893.78266-5.6562 2.3496-3.1339 3.1339-3.1339 8.1806 0 11.314l11.314 11.312c3.1339 3.1339 8.1786 3.1339 11.312 0s3.1339-8.1786 0-11.312l-11.312-11.314c-1.5669-1.5669-3.6132-2.3496-5.6582-2.3496zm-25.455 10.551c-4.432 0-8 3.568-8 8v16c0 4.432 3.568 8 8 8s8-3.568 8-8v-16c0-4.432-3.568-8-8-8z" fill-opacity=".29412" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2"/><path d="m64 8c-2.216 0-4 1.784-4 4v16c0 2.216 1.784 4 4 4s4-1.784 4-4v-16c0-2.216-1.784-4-4-4zm-36.77 15.227c-1.0225 0-2.0447.39231-2.8281 1.1758-1.5669 1.5669-1.5669 4.0893 0 5.6562l11.312 11.314c1.5669 1.5669 4.0913 1.5669 5.6582 0s1.5669-4.0913 0-5.6582l-11.314-11.312c-.78348-.78348-1.8056-1.1758-2.8281-1.1758zm73.539 0c-1.0225 0-2.0446.39231-2.8281 1.1758l-11.314 11.312c-1.5669 1.5669-1.5669 4.0913 0 5.6582s4.0913 1.5669 5.6582 0l11.313-11.314c1.5669-1.5669 1.5669-4.0893 0-5.6562-.78348-.78348-1.8056-1.1758-2.8281-1.1758zm-36.77 20.773c-11.046.00001-20 8.9543-20 20 .000007 11.046 8.9543 20 20 20s20-8.9543 20-20c-.000008-11.046-8.9543-20-20-20zm-52 16c-2.216 0-4 1.784-4 4s1.784 4 4 4h16c2.216 0 4-1.784 4-4s-1.784-4-4-4zm88 0c-2.216 0-4 1.784-4 4s1.784 4 4 4h16c2.216 0 4-1.784 4-4s-1.784-4-4-4zm-61.455 25.453c-1.0225 0-2.0466.39035-2.8301 1.1738l-11.312 11.314c-1.5669 1.5669-1.5669 4.0893 0 5.6563 1.5669 1.5669 4.0893 1.5669 5.6562 0l11.314-11.313c1.5669-1.5669 1.5669-4.0913 0-5.6582-.78347-.78347-1.8056-1.1738-2.8281-1.1738zm50.91 0c-1.0225 0-2.0447.39035-2.8281 1.1738-1.5669 1.5669-1.5669 4.0913 0 5.6582l11.314 11.313c1.5669 1.5669 4.0893 1.5669 5.6563 0 1.5669-1.567 1.5669-4.0893 0-5.6563l-11.313-11.314c-.78347-.78347-1.8076-1.1738-2.8301-1.1738zm-25.455 10.547c-2.216 0-4 1.784-4 4v16c0 2.216 1.784 4 4 4s4-1.784 4-4v-16c0-2.216-1.784-4-4-4z" fill="#fefefe"/></svg>
diff --git a/editor/icons/GizmoGIProbe.svg b/editor/icons/GizmoGIProbe.svg
new file mode 100644
index 0000000000..ff3cafa1f5
--- /dev/null
+++ b/editor/icons/GizmoGIProbe.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m12 4c-4.4183.0000095-8 3.5817-8 8v104c.0000095 4.4183 3.5817 8 8 8h64v-16h-56v-88h88v7.7676a36 36 0 0 0 -16-3.7676 36 36 0 0 0 -36 36 36 36 0 0 0 16 29.9v8.0996c0 4.8544 3.4253 8.8788 8 9.8008v16.199h24v-16.199c4.5747-.92197 8-4.9464 8-9.8008v-8.0879a36 36 0 0 0 16-29.912 36 36 0 0 0 -19.523-32h15.523v-16c-.00001-4.4183-3.5817-8-8-8h-104zm28.25 17.996c-2.8358-.076599-5.6171 1.3651-7.1406 4.0039-2.216 3.8382-.90854 8.7117 2.9297 10.928l10.393 6c3.8382 2.216 8.7117.91049 10.928-2.9277s.91049-8.7117-2.9277-10.928l-10.393-6c-1.1994-.6925-2.5-1.0414-3.7891-1.0762zm51.75 22.004a16 16 0 0 1 16 16 16 16 0 0 1 -16 16 16 16 0 0 1 -16-16 16 16 0 0 1 16-16zm-60 8c-4.432 0-8 3.568-8 8s3.568 8 8 8h12c4.432 0 8-3.568 8-8s-3.568-8-8-8zm18.221 23.996c-1.289.034818-2.5896.38367-3.7891 1.0762l-10.393 6c-3.8382 2.216-5.1457 7.0895-2.9297 10.928s7.0915 5.1437 10.93 2.9277l10.393-6c3.8382-2.216 5.1437-7.0895 2.9277-10.928-1.5235-2.6388-4.3028-4.0805-7.1387-4.0039z" fill-opacity=".29412"/><path d="m12 8a4.0004 4.0004 0 0 0 -4 4v104a4.0004 4.0004 0 0 0 4 4h60v-8h-56v-96h96v8h8v-12a4.0004 4.0004 0 0 0 -4-4zm27.715 17.951c-1.2324.08615-2.3996.76492-3.0664 1.9199l-.14844.25781c-1.0669 1.848-.43784 4.1948 1.4102 5.2617l10.648 6.1484c1.848 1.0669 4.1948.43784 5.2617-1.4102l.14844-.25781c1.0669-1.848.43784-4.1948-1.4102-5.2617l-10.648-6.1484c-.693-.4001-1.4558-.56146-2.1953-.50977zm52.285 2.0488a32 32 0 0 0 -32 32 32 32 0 0 0 16 27.668v8.332c0 4.432 3.568 8 8 8h16c4.432 0 8-3.568 8-8v-8.3223a32 32 0 0 0 16-27.678 32 32 0 0 0 -32-32zm0 12a20 20 0 0 1 20 20 20 20 0 0 1 -20 20 20 20 0 0 1 -20-20 20 20 0 0 1 20-20zm-60.148 16c-2.1339 0-3.8516 1.7177-3.8516 3.8516v.29688c0 2.1339 1.7177 3.8516 3.8516 3.8516h12.297c2.1339 0 3.8516-1.7177 3.8516-3.8516v-.29688c0-2.1339-1.7177-3.8516-3.8516-3.8516zm18.902 23.951c-.73947-.05169-1.5023.10966-2.1953.50977l-10.648 6.1484c-1.848 1.0669-2.4771 3.4137-1.4102 5.2617l.14844.25781c1.0669 1.848 3.4137 2.4771 5.2617 1.4102l10.648-6.1484c1.848-1.0669 2.4771-3.4137 1.4102-5.2617l-.14844-.25781c-.66684-1.155-1.834-1.8338-3.0664-1.9199zm33.246 32.049v8h16v-8z" fill="#f7f5cf"/></svg>
diff --git a/editor/icons/GizmoGPUParticles3D.svg b/editor/icons/GizmoGPUParticles3D.svg
new file mode 100644
index 0000000000..126ece6d4d
--- /dev/null
+++ b/editor/icons/GizmoGPUParticles3D.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -924.36)"><path d="m63.998 928.36c-18.429.005-34.029 13.88-38.557 32.926-12.4 3.0077-21.427 14.08-21.441 27.07v.004c0 15.417 12.583 28 28 28h64c15.417 0 28-12.583 28-28v-.004c-.0152-13-9.0549-24.076-21.467-27.074-4.5265-19.033-20.112-32.903-38.529-32.922zm32.002 88c-6.58 0-12 5.42-12 12s5.42 12 12 12 12-5.42 12-12-5.42-12-12-12zm-64 0c-6.58 0-12 5.42-12 12s5.42 12 12 12 12-5.42 12-12-5.42-12-12-12zm32 8c-6.58 0-12 5.42-12 12s5.42 12 12 12 12-5.42 12-12-5.42-12-12-12z" fill-opacity=".29412"/><path d="m64 8a36 40 0 0 0 -35.311 32.256 24 24 0 0 0 -20.689 23.744 24 24 0 0 0 24 24h64a24 24 0 0 0 24-24 24 24 0 0 0 -20.715-23.746 36 40 0 0 0 -35.285-32.254zm-32 88a8 8 0 0 0 -8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0 -8-8zm64 0a8 8 0 0 0 -8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0 -8-8zm-32 8a8 8 0 0 0 -8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0 -8-8z" fill="#f7f5cf" transform="translate(0 924.36)"/></g></svg>
diff --git a/editor/icons/GizmoLight.svg b/editor/icons/GizmoLight.svg
new file mode 100644
index 0000000000..ab828c800e
--- /dev/null
+++ b/editor/icons/GizmoLight.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m64 2a44 44 0 0 0 -44 44 44 44 0 0 0 24 39.189v5.8105 5 3c0 5.0515 3.3756 9.2769 8 10.578v16.422h24v-16.422c4.6244-1.3012 8-5.5266 8-10.578v-3-5-5.8574a44 44 0 0 0 24-39.143 44 44 0 0 0 -44-44zm0 20a24 24 0 0 1 24 24 24 24 0 0 1 -24 24 24 24 0 0 1 -24-24 24 24 0 0 1 24-24z" fill-opacity=".29412" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2.2"/><path d="m64 6a40 40 0 0 0 -40 40 40 40 0 0 0 24 36.607v15.393a8 8 0 0 0 8 8h16a8 8 0 0 0 8-8v-15.363a40 40 0 0 0 24-36.637 40 40 0 0 0 -40-40zm0 12a28 28 0 0 1 28 28 28 28 0 0 1 -28 28 28 28 0 0 1 -28-28 28 28 0 0 1 28-28zm-8 96v8h16v-8z" fill="#fefefe"/></svg>
diff --git a/editor/icons/GizmoListener.svg b/editor/icons/GizmoListener.svg
new file mode 100644
index 0000000000..9d3ddf8b85
--- /dev/null
+++ b/editor/icons/GizmoListener.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(2 0 0 2 -16 -1964.76)"><path d="m32 984.36c-12.126.00002-22 9.8729-22 21.999.00011 1.1045.89548 1.9999 2 2h8c1.1045-.0001 1.9999-.8955 2-2 .000223-5.546 4.4536-9.999 10-9.999 5.5464.00001 9.9998 4.453 10 9.999 0 6.5873-1.6032 8.0251-3.8408 9.8897-1.0295.8579-2.3133 1.6111-3.7969 2.6826-.72285.522-1.6649 1.2341-2.5488 2.3496-.98288 1.2402-1.8135 2.99-1.8135 5.0781 0 2.3898-.31658 3.686-.61035 4.3194-.29378.6333-.4706.73-.97754 1.0341-.54947.3297-2.5162.6446-4.4121.6446-.0065.0003-.01302.0006-.01953.001h-3.9805c-1.1045.0001-1.9999.8954-2 2v8c.00011 1.1045.89548 1.9999 2 2h4c.0072-.0003.01432-.0005.02148-.001 1.9052.001 6.3098.1982 10.566-2.3555 4.0103-2.4061 6.6628-7.2724 7.1738-13.592.81224-.548 2.3445-1.497 4.0791-2.9424 4.0025-3.3353 8.1592-9.5405 8.1592-19.108-.000095-12.126-9.8735-21.999-22-21.999zm31.807 4.002c-.38259-.0177-.76221.0749-1.0938.2666l-6.9531 4.0156c-.95754.55332-1.2843 1.7787-.72949 2.7354 1.9364 3.3365 2.9609 7.1229 2.9717 10.98-.0072 3.8597-1.0296 7.6487-2.9648 10.988-.55452.9572-.22681 2.1827.73144 2.7353l6.9453 4.0069c.95656.5517 2.1792.2238 2.7314-.7325 6.0717-10.516 6.0717-23.482 0-33.998-.3406-.59005-.95812-.96615-1.6387-.99805z" fill-opacity=".29412"/><path d="m48 8a40 39.998 0 0 0 -40 39.998h16a24 23.999 0 0 1 24-23.998 24 23.999 0 0 1 24 23.998c0 13.999-4.33 18.859-9.1211 22.852-2.3955 1.9962-5.0363 3.5302-7.8125 5.5352-1.3881 1.0024-2.8661 2.126-4.3047 3.9414-1.4385 1.8152-2.7617 4.6719-2.7617 7.6719 0 10.221-2.5383 12.59-5.1172 14.137-2.5789 1.5472-6.8828 1.8594-10.883 1.8594v.00195h-8v16h8v-.00195c4 0 11.696.31158 19.117-4.1406 7.0602-4.236 12.198-13.279 12.695-26 .1835-.1636.14883-.15489.62109-.49609 1.7238-1.245 5.083-3.2112 8.6875-6.2148 7.209-6.0072 14.879-17.145 14.879-35.145a40 39.998 0 0 0 -40-39.998zm63.426 8-13.906 8.0312a48 47.998 0 0 1 6.4844 23.967 48 47.998 0 0 1 -6.4688 23.984l13.891 8.0137a64 63.997 0 0 0 0-63.996z" fill="#f7f5cf" transform="matrix(.5 0 0 .5 8 982.36)"/></g></svg>
diff --git a/editor/icons/GizmoReflectionProbe.svg b/editor/icons/GizmoReflectionProbe.svg
new file mode 100644
index 0000000000..60895a18af
--- /dev/null
+++ b/editor/icons/GizmoReflectionProbe.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -924.36)"><path d="m12 928.36c-4.3705.00044-7.9996 3.6295-8 8v28h16v-20h88v8h16v-16c-.00044-4.3705-3.6295-7.9996-8-8zm76 28c-4.3709 0-8 3.6291-8 8s3.6291 8 8 8h10.035l-34.486 40.236-44.721-44.723-11.312 11.316 50.828 50.828c3.2536 3.2513 8.7374 3.0394 11.73-.4531l37.926-44.244v7.0391c0 4.3709 3.6291 8 8 8s8-3.6291 8-8v-28c-.00044-4.3705-3.6295-7.9996-8-8zm-84 52v32c.000437 4.3705 3.6295 7.9996 8 8h104c4.3705-.0004 7.9996-3.6295 8-8v-32h-16v24h-88v-24z" fill-opacity=".29412"/><path d="m12 932.36c-2.209.00022-3.9998 1.791-4 4v24h8v-20h96v8h8v-12c-.00022-2.209-1.791-3.9998-4-4zm76 28c-2.2091 0-4 1.7909-4 4s1.7909 4 4 4h18.732l-42.957 50.119-44.947-44.947-5.6562 5.6582 48 48c1.648 1.6468 4.3491 1.5425 5.8652-.2266l44.963-52.457v17.854c0 2.2091 1.7909 4 4 4s4-1.7909 4-4v-28c-.00022-2.209-1.791-3.9998-4-4zm-80 52v28c.0002209 2.2091 1.791 3.9998 4 4h104c2.209-.0002 3.9998-1.7909 4-4v-28h-8v24h-96v-24z" fill="#f7f5cf"/></g></svg>
diff --git a/editor/icons/GizmoSpotLight.svg b/editor/icons/GizmoSpotLight.svg
new file mode 100644
index 0000000000..18696c2cdc
--- /dev/null
+++ b/editor/icons/GizmoSpotLight.svg
@@ -0,0 +1 @@
+<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m52 4c-6.5788 0-12 5.4212-12 12v26.625c-12.263 7.2822-19.978 19.75-20 33.369l-.005859 4.0059h28.578c1.7994 6.8632 8.0265 12 15.428 12s13.628-5.1368 15.428-12h28.576l-.00391-4.0039c-.01526-13.625-7.7323-26.099-20-33.385v-26.611c0-6.5788-5.4212-12-12-12zm-11.689 78.016c-1.536-.10738-3.1419.23676-4.5586 1.0547l-10.393 6c-3.7786 2.1816-5.1117 7.1503-2.9297 10.93 2.1816 3.7786 7.1503 5.1117 10.93 2.9297l10.393-6c3.7796-2.1822 5.1087-7.1521 2.9277-10.93-1.3629-2.3605-3.8057-3.8052-6.3691-3.9844zm47.379 0c-2.5634.1792-5.0063 1.6238-6.3691 3.9844-2.181 3.7776-.85187 8.7475 2.9277 10.93l10.393 6c3.7794 2.182 8.7481.8489 10.93-2.9297 2.182-3.7794.84891-8.7481-2.9297-10.93l-10.393-6c-1.4167-.81792-3.0225-1.1621-4.5586-1.0547zm-23.689 13.984c-4.3628 0-8 3.6372-8 8v12c0 4.3628 3.6372 8 8 8s8-3.6372 8-8v-12c0-4.3628-3.6372-8-8-8z" fill-opacity=".29412"/><path d="m52 8c-4.432 0-8 3.568-8 8v12 16.875a40 36 0 0 0 -20 31.125h28a12 12 0 0 0 12 12 12 12 0 0 0 12-12h28a40 36 0 0 0 -20-31.141v-20.859-8c0-4.432-3.568-8-8-8zm-11.969 78.006c-.76793-.053681-1.5596.1138-2.2793.5293l-10.393 6c-1.9191 1.108-2.5728 3.5457-1.4648 5.4648s3.5457 2.5728 5.4648 1.4648l10.393-6c1.9191-1.108 2.5709-3.5457 1.4629-5.4648-.6925-1.1994-1.9037-1.9047-3.1836-1.9941zm47.938 0c-1.2799.08947-2.4911.7947-3.1836 1.9941-1.108 1.9191-.45622 4.3568 1.4629 5.4648l10.393 6c1.9191 1.108 4.3568.45427 5.4648-1.4648s.45427-4.3568-1.4648-5.4648l-10.393-6c-.71967-.4155-1.5114-.58298-2.2793-.5293zm-23.969 13.994c-2.216 0-4 1.784-4 4v12c0 2.216 1.784 4 4 4s4-1.784 4-4v-12c0-2.216-1.784-4-4-4z" fill="#fefefe" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.1082"/></svg>
diff --git a/editor/icons/Godot.svg b/editor/icons/Godot.svg
new file mode 100644
index 0000000000..4887425f4c
--- /dev/null
+++ b/editor/icons/Godot.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width=".32031" transform="matrix(.017241 0 0 .017241 -.82759 -2.7)"><path d="m0 0s-.325 1.994-.515 1.976l-36.182-3.491c-2.879-.278-5.115-2.574-5.317-5.459l-.994-14.247-27.992-1.997-1.904 12.912c-.424 2.872-2.932 5.037-5.835 5.037h-38.188c-2.902 0-5.41-2.165-5.834-5.037l-1.905-12.912-27.992 1.997-.994 14.247c-.202 2.886-2.438 5.182-5.317 5.46l-36.2 3.49c-.187.018-.324-1.978-.511-1.978l-.049-7.83 30.658-4.944 1.004-14.374c.203-2.91 2.551-5.263 5.463-5.472l38.551-2.75c.146-.01.29-.016.434-.016 2.897 0 5.401 2.166 5.825 5.038l1.959 13.286h28.005l1.959-13.286c.423-2.871 2.93-5.037 5.831-5.037.142 0 .284.005.423.015l38.556 2.75c2.911.209 5.26 2.562 5.463 5.472l1.003 14.374 30.645 4.966z" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 919.24 771.67)"/><path d="m0 0v-59.041c.108-.001.216-.005.323-.015l36.196-3.49c1.896-.183 3.382-1.709 3.514-3.609l1.116-15.978 31.574-2.253 2.175 14.747c.282 1.912 1.922 3.329 3.856 3.329h38.188c1.933 0 3.573-1.417 3.855-3.329l2.175-14.747 31.575 2.253 1.115 15.978c.133 1.9 1.618 3.425 3.514 3.609l36.182 3.49c.107.01.214.014.322.015v4.711l.015.005v54.325h.134c4.795 6.12 9.232 12.569 13.487 19.449-5.651 9.62-12.575 18.217-19.976 26.182-6.864-3.455-13.531-7.369-19.828-11.534-3.151 3.132-6.7 5.694-10.186 8.372-3.425 2.751-7.285 4.768-10.946 7.118 1.09 8.117 1.629 16.108 1.846 24.448-9.446 4.754-19.519 7.906-29.708 10.17-4.068-6.837-7.788-14.241-11.028-21.479-3.842.642-7.702.88-11.567.926v.006c-.027 0-.052-.006-.075-.006-.024 0-.049.006-.073.006v-.006c-3.872-.046-7.729-.284-11.572-.926-3.238 7.238-6.956 14.642-11.03 21.479-10.184-2.264-20.258-5.416-29.703-10.17.216-8.34.755-16.331 1.848-24.448-3.668-2.35-7.523-4.367-10.949-7.118-3.481-2.678-7.036-5.24-10.188-8.372-6.297 4.165-12.962 8.079-19.828 11.534-7.401-7.965-14.321-16.562-19.974-26.182 4.253-6.88 8.693-13.329 13.487-19.449z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 104.7 525.91)"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916 0-3.569 1.406-3.852 3.33l-2.211 14.994h-31.459l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616l-1.121 16.063-32.547 3.138c.015-3.498.06-7.33.06-8.093 0-34.374 43.605-50.896 97.781-51.086h.133c54.176.19 97.766 16.712 97.766 51.086 0 .777.047 4.593.063 8.093z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 784.07 817.24)"/><path d="m0 0c0-12.052-9.765-21.815-21.813-21.815-12.042 0-21.81 9.763-21.81 21.815 0 12.044 9.768 21.802 21.81 21.802 12.048 0 21.813-9.758 21.813-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 389.21 625.67)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996 0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479c8 0 14.479-6.485 14.479-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 367.37 631.06)"/><path d="m0 0c-3.878 0-7.021 2.858-7.021 6.381v20.081c0 3.52 3.143 6.381 7.021 6.381s7.028-2.861 7.028-6.381v-20.081c0-3.523-3.15-6.381-7.028-6.381" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 511.99 724.74)"/><path d="m0 0c0-12.052 9.765-21.815 21.815-21.815 12.041 0 21.808 9.763 21.808 21.815 0 12.044-9.767 21.802-21.808 21.802-12.05 0-21.815-9.758-21.815-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 634.79 625.67)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473 8.002 0 14.479 6.479 14.479 14.473s-6.477 14.479-14.479 14.479c-7.994 0-14.471-6.485-14.471-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 656.64 631.06)"/></g></svg>
diff --git a/editor/icons/Gradient.svg b/editor/icons/Gradient.svg
new file mode 100644
index 0000000000..47dde294fc
--- /dev/null
+++ b/editor/icons/Gradient.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="10" x2="10" y1="1" y2="15"><stop offset="0" stop-color="#e0e0e0"/><stop offset="1" stop-color="#e0e0e0" stop-opacity="0"/></linearGradient><path d="m2 1c-.55228 0-1 .44772-1 1v12c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-12c0-.55228-.44772-1-1-1z" fill="url(#a)"/></svg>
diff --git a/editor/icons/GradientTexture.svg b/editor/icons/GradientTexture.svg
new file mode 100644
index 0000000000..ec4c4546e1
--- /dev/null
+++ b/editor/icons/GradientTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="10" x2="10" y1="1" y2="15"><stop offset="0" stop-color="#e0e0e0"/><stop offset="1" stop-color="#e0e0e0" stop-opacity="0"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm1 2h10v8h-10z" fill="url(#a)" transform="translate(0 1036.4)"/><g fill="#e0e0e0"><path d="m6 1043.4h2v1h-2z"/><path d="m6 1044.4h2v2h-2z"/><path d="m4 1045.4h2v1h-2z"/><path d="m8 1044.4h2v2h-2z"/><path d="m10 1044.4h2v2h-2z"/><path d="m8 1042.4h3v2h-3z"/><path d="m9 1041.4h1v1h-1z"/><path d="m5 1044.4h1v1h-1z"/></g></g></svg>
diff --git a/editor/icons/GraphEdit.svg b/editor/icons/GraphEdit.svg
new file mode 100644
index 0000000000..b879259ffc
--- /dev/null
+++ b/editor/icons/GraphEdit.svg
@@ -0,0 +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 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-5.8555l4.793 4.793 1.4141-1.4141-4.793-4.793h5.8574a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm10.656 6.9297-.70703.70703 1.4141 1.4141.70703-.70703zm-1.4141 1.4141-3.8887 3.8887-.35352 1.7676 1.7676-.35352 3.8887-3.8887-1.4141-1.4141z" fill="#a5efac" transform="translate(0 1036.4)"/><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/></g></svg>
diff --git a/editor/icons/GraphNode.svg b/editor/icons/GraphNode.svg
new file mode 100644
index 0000000000..bcd7bfc1c1
--- /dev/null
+++ b/editor/icons/GraphNode.svg
@@ -0,0 +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 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-5.8555l4.0859 4.0859 1.4141-1.4141-4.0859-4.0859h5.8574a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm9.5 9a2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0 -2.5-2.5z" fill="#a5efac" transform="translate(0 1036.4)"/><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/></g></svg>
diff --git a/editor/icons/Grid.svg b/editor/icons/Grid.svg
new file mode 100644
index 0000000000..8353ad7d19
--- /dev/null
+++ b/editor/icons/Grid.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 10 2h2 12v-2-12h-12zm2 2h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/GridContainer.svg b/editor/icons/GridContainer.svg
new file mode 100644
index 0000000000..fb6207d94b
--- /dev/null
+++ b/editor/icons/GridContainer.svg
@@ -0,0 +1 @@
+<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 2h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/GrooveJoint2D.svg b/editor/icons/GrooveJoint2D.svg
new file mode 100644
index 0000000000..41cf64ad66
--- /dev/null
+++ b/editor/icons/GrooveJoint2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1037.4h-5v6h-5v2h5v6h5zm-7 0h-7v14h7v-4h-5v-6h5z" fill="#a5b7f3" fill-opacity=".98824" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Group.svg b/editor/icons/Group.svg
new file mode 100644
index 0000000000..19601795d8
--- /dev/null
+++ b/editor/icons/Group.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v8h8v-6h6v-8zm2 2h4v4h-4z" fill="#e0e0e0" fill-opacity=".39216"/><path d="m1 1v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm12 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm-12 12v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0zm12 0v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0z" fill="#fff"/></svg>
diff --git a/editor/icons/GroupViewport.svg b/editor/icons/GroupViewport.svg
new file mode 100644
index 0000000000..1c22046ba1
--- /dev/null
+++ b/editor/icons/GroupViewport.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v4h4v-4zm6 0v6h-6v10h10v-6h6v-10zm4 4h2v2h-2zm2 8v4h4v-4z" fill-opacity=".39216" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width=".5"/><path d="m7 1v6h-6v8h8v-6h6v-8zm2 2h4v4h-4z" fill="#e0e0e0"/><path d="m1 1v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm12 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm-12 12v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0zm12 0v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0z" fill="#fff"/></svg>
diff --git a/editor/icons/Groups.svg b/editor/icons/Groups.svg
new file mode 100644
index 0000000000..80dc6b7445
--- /dev/null
+++ b/editor/icons/Groups.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h12a1.0001 1.0001 0 0 0 1-1v-12a1.0001 1.0001 0 0 0 -1-1zm1 2h10v10h-10zm5 2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0 -3-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/GuiChecked.svg b/editor/icons/GuiChecked.svg
new file mode 100644
index 0000000000..9bdf5dcb19
--- /dev/null
+++ b/editor/icons/GuiChecked.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m3.3333333 1c-1.2887 0-2.3333333 1.0446683-2.3333333 2.3333333v9.3333337c0 1.2887 1.0446683 2.333333 2.3333333 2.333333h9.3333337c1.2887 0 2.333333-1.044668 2.333333-2.333333v-9.3333337c0-1.2887-1.044668-2.3333333-2.333333-2.3333333z" fill-opacity=".188235" stroke-width="1.166667"/><path d="m11.500773 3.7343508-5.6117507 5.6117502-1.7045017-1.6814543-1.4992276 1.4992276 3.2037293 3.1806817 7.1109777-7.1109775z" stroke-width="1.060227"/></g></svg>
diff --git a/editor/icons/GuiClose.svg b/editor/icons/GuiClose.svg
new file mode 100644
index 0000000000..d8ffa12cfa
--- /dev/null
+++ b/editor/icons/GuiClose.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" fill="#fff" fill-opacity=".89804"/></svg>
diff --git a/editor/icons/GuiCloseCustomizable.svg b/editor/icons/GuiCloseCustomizable.svg
new file mode 100644
index 0000000000..d8ffa12cfa
--- /dev/null
+++ b/editor/icons/GuiCloseCustomizable.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" fill="#fff" fill-opacity=".89804"/></svg>
diff --git a/editor/icons/GuiDropdown.svg b/editor/icons/GuiDropdown.svg
new file mode 100644
index 0000000000..ef37cda6ff
--- /dev/null
+++ b/editor/icons/GuiDropdown.svg
@@ -0,0 +1 @@
+<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m4 1045.4 3 3 3-3" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.58824;stroke-width:2" transform="translate(0 -1038.4)"/></svg>
diff --git a/editor/icons/GuiEllipsis.svg b/editor/icons/GuiEllipsis.svg
new file mode 100644
index 0000000000..d96929725c
--- /dev/null
+++ b/editor/icons/GuiEllipsis.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 14 8" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m3.8594 4c-2.1381 0-3.8594 1.7213-3.8594 3.8594v.28125c0 2.1381 1.7213 3.8594 3.8594 3.8594h6.2812c2.1381 0 3.8594-1.7213 3.8594-3.8594v-.28125c0-2.1381-1.7213-3.8594-3.8594-3.8594zm-.85938 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#fff" fill-opacity=".39216" transform="translate(0 -4)"/></svg>
diff --git a/editor/icons/GuiGraphNodePort.svg b/editor/icons/GuiGraphNodePort.svg
new file mode 100644
index 0000000000..f87f361825
--- /dev/null
+++ b/editor/icons/GuiGraphNodePort.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill="#fff" fill-rule="evenodd" r="5"/></svg>
diff --git a/editor/icons/GuiHTick.svg b/editor/icons/GuiHTick.svg
new file mode 100644
index 0000000000..a8a2fe58f6
--- /dev/null
+++ b/editor/icons/GuiHTick.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4 15.999999" width="4" xmlns="http://www.w3.org/2000/svg"><circle cx="2" cy="2" fill="#fff" fill-opacity=".39216" r="1"/></svg>
diff --git a/editor/icons/GuiHsplitter.svg b/editor/icons/GuiHsplitter.svg
new file mode 100644
index 0000000000..6d4505685e
--- /dev/null
+++ b/editor/icons/GuiHsplitter.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 8 64" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m4 990.36v60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="translate(0 -988.36)"/></svg>
diff --git a/editor/icons/GuiMiniCheckerboard.svg b/editor/icons/GuiMiniCheckerboard.svg
new file mode 100644
index 0000000000..0ae6a855bd
--- /dev/null
+++ b/editor/icons/GuiMiniCheckerboard.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="1.9994"><path d="m0 0v8h8v-8zm8 8v8h8v-8z" fill="#e0e0e0"/><path d="m8 0v8h8v-8zm0 8h-8v8h8z" fill="#fff"/></g></svg>
diff --git a/editor/icons/GuiOptionArrow.svg b/editor/icons/GuiOptionArrow.svg
new file mode 100644
index 0000000000..832793068f
--- /dev/null
+++ b/editor/icons/GuiOptionArrow.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m10 1043.4c-.26378.01-.5144.1165-.69726.3067l-3.293 3.2929-3.293-3.2929c-.18826-.1936-.44679-.3028-.7168-.3028-.89742.0002-1.3404 1.0909-.69727 1.7168l4 4c.39053.3904 1.0235.3904 1.4141 0l4-4c.65734-.6321.19491-1.7422-.7168-1.7207z" fill="#fff" fill-opacity=".78431" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/GuiProgressBar.svg b/editor/icons/GuiProgressBar.svg
new file mode 100644
index 0000000000..b1ce44c645
--- /dev/null
+++ b/editor/icons/GuiProgressBar.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1036.4c-1.0907-.0002-2 .9073-2 1.998v12.002c0 1.0907.9093 2 2 2h12c1.0907 0 2-.9093 2-2v-12c0-1.0907-.9093-1.9978-2-1.998zm0 2h12v11.998h-12z" fill="#e0e0e0" fill-opacity=".39216" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/GuiProgressFill.svg b/editor/icons/GuiProgressFill.svg
new file mode 100644
index 0000000000..f8070cadc4
--- /dev/null
+++ b/editor/icons/GuiProgressFill.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><rect fill="#e0e0e0" fill-opacity=".39216" height="8" ry=".99999" width="8" x="4" y="4"/></svg>
diff --git a/editor/icons/GuiRadioChecked.svg b/editor/icons/GuiRadioChecked.svg
new file mode 100644
index 0000000000..771337116d
--- /dev/null
+++ b/editor/icons/GuiRadioChecked.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m15 8a7 7 0 0 1 -7 7 7 7 0 0 1 -7-7 7 7 0 0 1 7-7 7 7 0 0 1 7 7" fill-opacity=".188235" stroke-width="2.333333"/><path d="m12 8a4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4 4 4 0 0 1 4 4" stroke-width="1.333333"/></g></svg>
diff --git a/editor/icons/GuiRadioUnchecked.svg b/editor/icons/GuiRadioUnchecked.svg
new file mode 100644
index 0000000000..6a21d316be
--- /dev/null
+++ b/editor/icons/GuiRadioUnchecked.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 8a7 7 0 0 1 -7 7 7 7 0 0 1 -7-7 7 7 0 0 1 7-7 7 7 0 0 1 7 7" fill="#e0e0e0" fill-opacity=".188235" stroke-width="2.333333"/></svg>
diff --git a/editor/icons/GuiResizer.svg b/editor/icons/GuiResizer.svg
new file mode 100644
index 0000000000..c7bee36b49
--- /dev/null
+++ b/editor/icons/GuiResizer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 3c-.55228 0-1 .44772-1 1v6h-6c-.55228 0-1 .44772-1 1s.44772 1 1 1h7c.55226-.000055.99994-.44774 1-1v-7c0-.55228-.44772-1-1-1z" fill="#fff" fill-opacity=".58824"/></svg>
diff --git a/editor/icons/GuiScrollArrowLeft.svg b/editor/icons/GuiScrollArrowLeft.svg
new file mode 100644
index 0000000000..50cca02ac1
--- /dev/null
+++ b/editor/icons/GuiScrollArrowLeft.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 1 6 6 6 6 0 0 1 -6 6 6 6 0 0 1 -6-6 6 6 0 0 1 6-6zm1.0137 2a1 1 0 0 0 -.7207.29297l-3 3a1.0001 1.0001 0 0 0 0 1.4141l3 3a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2.293-2.293 2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.69336-.29297z" fill="#e0e0e0" fill-opacity=".78431" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/editor/icons/GuiScrollArrowLeftHl.svg b/editor/icons/GuiScrollArrowLeftHl.svg
new file mode 100644
index 0000000000..6adb4931b5
--- /dev/null
+++ b/editor/icons/GuiScrollArrowLeftHl.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 1 6 6 6 6 0 0 1 -6 6 6 6 0 0 1 -6-6 6 6 0 0 1 6-6zm1.0137 2a1 1 0 0 0 -.7207.29297l-3 3a1.0001 1.0001 0 0 0 0 1.4141l3 3a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2.293-2.293 2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.69336-.29297z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/editor/icons/GuiScrollArrowRight.svg b/editor/icons/GuiScrollArrowRight.svg
new file mode 100644
index 0000000000..fea26043c1
--- /dev/null
+++ b/editor/icons/GuiScrollArrowRight.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm-1.0137 2a1 1 0 0 1 .7207.29297l3 3a1.0001 1.0001 0 0 1 0 1.4141l-3 3a1 1 0 0 1 -1.4141 0 1 1 0 0 1 0-1.4141l2.293-2.293-2.293-2.293a1 1 0 0 1 0-1.4141 1 1 0 0 1 .69336-.29297z" fill="#e0e0e0" fill-opacity=".78431" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/editor/icons/GuiScrollArrowRightHl.svg b/editor/icons/GuiScrollArrowRightHl.svg
new file mode 100644
index 0000000000..8a90890a0f
--- /dev/null
+++ b/editor/icons/GuiScrollArrowRightHl.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm-1.0137 2a1 1 0 0 1 .7207.29297l3 3a1.0001 1.0001 0 0 1 0 1.4141l-3 3a1 1 0 0 1 -1.4141 0 1 1 0 0 1 0-1.4141l2.293-2.293-2.293-2.293a1 1 0 0 1 0-1.4141 1 1 0 0 1 .69336-.29297z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/editor/icons/GuiScrollBg.svg b/editor/icons/GuiScrollBg.svg
new file mode 100644
index 0000000000..dd5c60e534
--- /dev/null
+++ b/editor/icons/GuiScrollBg.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"/>
diff --git a/editor/icons/GuiScrollGrabber.svg b/editor/icons/GuiScrollGrabber.svg
new file mode 100644
index 0000000000..16edfb567c
--- /dev/null
+++ b/editor/icons/GuiScrollGrabber.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="6" fill="#fff" fill-opacity=".27451" r="2"/></svg>
diff --git a/editor/icons/GuiScrollGrabberHl.svg b/editor/icons/GuiScrollGrabberHl.svg
new file mode 100644
index 0000000000..cec53330f0
--- /dev/null
+++ b/editor/icons/GuiScrollGrabberHl.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="6" fill="#f9f9f9" fill-opacity=".73" r="3"/></svg>
diff --git a/editor/icons/GuiScrollGrabberPressed.svg b/editor/icons/GuiScrollGrabberPressed.svg
new file mode 100644
index 0000000000..13f8427d35
--- /dev/null
+++ b/editor/icons/GuiScrollGrabberPressed.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="6" fill="#afafaf" fill-opacity=".72941" r="3"/></svg>
diff --git a/editor/icons/GuiSliderGrabber.svg b/editor/icons/GuiSliderGrabber.svg
new file mode 100644
index 0000000000..ddd1b1d9b8
--- /dev/null
+++ b/editor/icons/GuiSliderGrabber.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2a5 5 0 0 1 .5.025391 5 5 0 0 1 .49414.074219 5 5 0 0 1 .48438.12305 5 5 0 0 1 .46875.17188 5 5 0 0 1 .44922.2168 5 5 0 0 1 .42578.26172 5 5 0 0 1 .39844.30273 5 5 0 0 1 .36524.33984 5 5 0 0 1 .33008.37695 5 5 0 0 1 .29102.40625 5 5 0 0 1 .24805.43359 5 5 0 0 1 .20508.45508 5 5 0 0 1 .1582.47461 5 5 0 0 1 .10938.48828 5 5 0 0 1 .060547.49609 5 5 0 0 1 .011719.35352 5 5 0 0 1 -.025391.5 5 5 0 0 1 -.074218.49414 5 5 0 0 1 -.12305.48438 5 5 0 0 1 -.17188.46875 5 5 0 0 1 -.2168.44922 5 5 0 0 1 -.26172.42578 5 5 0 0 1 -.30273.39844 5 5 0 0 1 -.33984.36524 5 5 0 0 1 -.37695.33008 5 5 0 0 1 -.40625.29102 5 5 0 0 1 -.43359.24805 5 5 0 0 1 -.45508.20508 5 5 0 0 1 -.47461.1582 5 5 0 0 1 -.48828.10938 5 5 0 0 1 -.49609.060547 5 5 0 0 1 -.35352.011719 5 5 0 0 1 -.5-.025391 5 5 0 0 1 -.49414-.074218 5 5 0 0 1 -.48438-.12305 5 5 0 0 1 -.46875-.17188 5 5 0 0 1 -.44922-.2168 5 5 0 0 1 -.42578-.26172 5 5 0 0 1 -.39844-.30273 5 5 0 0 1 -.36523-.33984 5 5 0 0 1 -.33008-.37695 5 5 0 0 1 -.29102-.40625 5 5 0 0 1 -.24805-.43359 5 5 0 0 1 -.20508-.45508 5 5 0 0 1 -.1582-.47461 5 5 0 0 1 -.10938-.48828 5 5 0 0 1 -.060547-.49609 5 5 0 0 1 -.011719-.35352 5 5 0 0 1 .025391-.5 5 5 0 0 1 .074219-.49414 5 5 0 0 1 .12305-.48438 5 5 0 0 1 .17188-.46875 5 5 0 0 1 .2168-.44922 5 5 0 0 1 .26172-.42578 5 5 0 0 1 .30273-.39844 5 5 0 0 1 .33984-.36523 5 5 0 0 1 .37695-.33008 5 5 0 0 1 .40625-.29102 5 5 0 0 1 .43359-.24805 5 5 0 0 1 .45508-.20508 5 5 0 0 1 .47461-.1582 5 5 0 0 1 .48828-.10938 5 5 0 0 1 .49609-.060547 5 5 0 0 1 .35352-.011719z" fill="#e0e0e0" fill-opacity=".289256" transform="translate(0 1036.4)"/><circle cx="8" cy="1044.4" r="3" style="fill:#fff;fill-opacity:.58824;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.32549;stroke-width:3"/></g><circle cx="7.932204" cy="8" fill="#fff" fill-opacity=".78431" r="3" stroke-linejoin="round" stroke-opacity=".39216" stroke-width="3"/></svg>
diff --git a/editor/icons/GuiSliderGrabberHl.svg b/editor/icons/GuiSliderGrabberHl.svg
new file mode 100644
index 0000000000..3af977ae4a
--- /dev/null
+++ b/editor/icons/GuiSliderGrabberHl.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2a5 5 0 0 1 .5.025391 5 5 0 0 1 .49414.074219 5 5 0 0 1 .48438.12305 5 5 0 0 1 .46875.17188 5 5 0 0 1 .44922.2168 5 5 0 0 1 .42578.26172 5 5 0 0 1 .39844.30273 5 5 0 0 1 .36524.33984 5 5 0 0 1 .33008.37695 5 5 0 0 1 .29102.40625 5 5 0 0 1 .24805.43359 5 5 0 0 1 .20508.45508 5 5 0 0 1 .1582.47461 5 5 0 0 1 .10938.48828 5 5 0 0 1 .060547.49609 5 5 0 0 1 .011719.35352 5 5 0 0 1 -.025391.5 5 5 0 0 1 -.074218.49414 5 5 0 0 1 -.12305.48438 5 5 0 0 1 -.17188.46875 5 5 0 0 1 -.2168.44922 5 5 0 0 1 -.26172.42578 5 5 0 0 1 -.30273.39844 5 5 0 0 1 -.33984.36524 5 5 0 0 1 -.37695.33008 5 5 0 0 1 -.40625.29102 5 5 0 0 1 -.43359.24805 5 5 0 0 1 -.45508.20508 5 5 0 0 1 -.47461.1582 5 5 0 0 1 -.48828.10938 5 5 0 0 1 -.49609.060547 5 5 0 0 1 -.35352.011719 5 5 0 0 1 -.5-.025391 5 5 0 0 1 -.49414-.074218 5 5 0 0 1 -.48438-.12305 5 5 0 0 1 -.46875-.17188 5 5 0 0 1 -.44922-.2168 5 5 0 0 1 -.42578-.26172 5 5 0 0 1 -.39844-.30273 5 5 0 0 1 -.36523-.33984 5 5 0 0 1 -.33008-.37695 5 5 0 0 1 -.29102-.40625 5 5 0 0 1 -.24805-.43359 5 5 0 0 1 -.20508-.45508 5 5 0 0 1 -.1582-.47461 5 5 0 0 1 -.10938-.48828 5 5 0 0 1 -.060547-.49609 5 5 0 0 1 -.011719-.35352 5 5 0 0 1 .025391-.5 5 5 0 0 1 .074219-.49414 5 5 0 0 1 .12305-.48438 5 5 0 0 1 .17188-.46875 5 5 0 0 1 .2168-.44922 5 5 0 0 1 .26172-.42578 5 5 0 0 1 .30273-.39844 5 5 0 0 1 .33984-.36523 5 5 0 0 1 .37695-.33008 5 5 0 0 1 .40625-.29102 5 5 0 0 1 .43359-.24805 5 5 0 0 1 .45508-.20508 5 5 0 0 1 .47461-.1582 5 5 0 0 1 .48828-.10938 5 5 0 0 1 .49609-.060547 5 5 0 0 1 .35352-.011719z" fill="#e0e0e0" transform="translate(0 1036.4)"/><circle cx="8" cy="1044.4" r="3" style="fill:#fff;fill-opacity:.58824;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.32549;stroke-width:3"/></g><circle cx="7.932204" cy="8" fill="#fff" fill-opacity=".78431" r="3" stroke-linejoin="round" stroke-opacity=".39216" stroke-width="3"/></svg>
diff --git a/editor/icons/GuiSpace.svg b/editor/icons/GuiSpace.svg
new file mode 100644
index 0000000000..db4b1745e2
--- /dev/null
+++ b/editor/icons/GuiSpace.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 7.9999993" width="8" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="1046.4" fill="#fff" fill-opacity=".196078" r="3" transform="matrix(.5 0 0 -.5 1 527.20001)"/></svg>
diff --git a/editor/icons/GuiSpinboxUpdown.svg b/editor/icons/GuiSpinboxUpdown.svg
new file mode 100644
index 0000000000..5bfa6a1c09
--- /dev/null
+++ b/editor/icons/GuiSpinboxUpdown.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-4 4a1.0001 1.0001 0 1 0 1.4141 1.4141l3.293-3.293 3.293 3.293a1.0001 1.0001 0 1 0 1.4141-1.4141l-4-4a1.0001 1.0001 0 0 0 -.72266-.29102zm4.0059 7.9844a1.0001 1.0001 0 0 0 -.69726.30664l-3.293 3.293-3.293-3.293a1.0001 1.0001 0 0 0 -.7168-.30273 1.0001 1.0001 0 0 0 -.69727 1.7168l4 4a1.0001 1.0001 0 0 0 1.4141 0l4-4a1.0001 1.0001 0 0 0 -.7168-1.7207z" fill="#e0e0e0" fill-opacity=".78431"/></svg>
diff --git a/editor/icons/GuiTab.svg b/editor/icons/GuiTab.svg
new file mode 100644
index 0000000000..b6ba1bb3dd
--- /dev/null
+++ b/editor/icons/GuiTab.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v8h2v-8zm-5.0137.0019531a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2.293 2.293-2.293 2.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l3-3a1.0001 1.0001 0 0 0 0-1.4141l-3-3a1 1 0 0 0 -.7207-.29102z" fill="#fff" fill-opacity=".19608"/></svg>
diff --git a/editor/icons/GuiTabMenu.svg b/editor/icons/GuiTabMenu.svg
new file mode 100644
index 0000000000..8bb6bbc012
--- /dev/null
+++ b/editor/icons/GuiTabMenu.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/GuiTabMenuHl.svg b/editor/icons/GuiTabMenuHl.svg
new file mode 100644
index 0000000000..b20bd8097f
--- /dev/null
+++ b/editor/icons/GuiTabMenuHl.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/GuiToggleOff.svg b/editor/icons/GuiToggleOff.svg
new file mode 100644
index 0000000000..9644ef176c
--- /dev/null
+++ b/editor/icons/GuiToggleOff.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 38 15.999999" width="38" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><rect fill-opacity=".188235" height="14" rx="7" stroke-width="55.8958" width="36" x="1" y="1"/><circle cx="8" cy="8" r="5" stroke-width="97.3613"/></g></svg>
diff --git a/editor/icons/GuiToggleOn.svg b/editor/icons/GuiToggleOn.svg
new file mode 100644
index 0000000000..8ab0998f71
--- /dev/null
+++ b/editor/icons/GuiToggleOn.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 38 15.999999" width="38" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.878 0-7 3.122-7 7s3.122 7 7 7h22c3.878 0 7-3.122 7-7s-3.122-7-7-7zm22 2a5 5 0 0 1 5 5 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 5-5z" fill="#e0e0e0" stroke-width="55.8958"/></svg>
diff --git a/editor/icons/GuiTreeArrowDown.svg b/editor/icons/GuiTreeArrowDown.svg
new file mode 100644
index 0000000000..7b320152ff
--- /dev/null
+++ b/editor/icons/GuiTreeArrowDown.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m3 1045.4 3 3 3-3" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.39216;stroke-width:2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/GuiTreeArrowRight.svg b/editor/icons/GuiTreeArrowRight.svg
new file mode 100644
index 0000000000..cf1b5dac7c
--- /dev/null
+++ b/editor/icons/GuiTreeArrowRight.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m4 1049.4 3-3-3-3" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.39216;stroke-width:2" transform="translate(0 -1040.4)"/></svg>
diff --git a/editor/icons/GuiTreeArrowUp.svg b/editor/icons/GuiTreeArrowUp.svg
new file mode 100644
index 0000000000..f5399bc7f9
--- /dev/null
+++ b/editor/icons/GuiTreeArrowUp.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m3 1045.4 3 3 3-3" style="fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.39216" transform="matrix(-1 0 0 -1 12 1052.16952)"/></svg>
diff --git a/editor/icons/GuiTreeUpdown.svg b/editor/icons/GuiTreeUpdown.svg
new file mode 100644
index 0000000000..c6b9014e82
--- /dev/null
+++ b/editor/icons/GuiTreeUpdown.svg
@@ -0,0 +1 @@
+<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m6.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-3 3a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2.293-2.293 2.293 2.293a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-3-3a1.0001 1.0001 0 0 0 -.72266-.29102zm3 6.998a1 1 0 0 0 -.69141.29297l-2.293 2.293-2.293-2.293a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l3 3a1.0001 1.0001 0 0 0 1.4141 0l3-3a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.72266-.29297z" fill="#fff" fill-opacity=".58824"/></svg>
diff --git a/editor/icons/GuiUnchecked.svg b/editor/icons/GuiUnchecked.svg
new file mode 100644
index 0000000000..74d6106dc9
--- /dev/null
+++ b/editor/icons/GuiUnchecked.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.3333333 1c-1.2887 0-2.3333333 1.0446683-2.3333333 2.3333333v9.3333337c0 1.2887 1.0446683 2.333333 2.3333333 2.333333h9.3333337c1.2887 0 2.333333-1.044668 2.333333-2.333333v-9.3333337c0-1.2887-1.044668-2.3333333-2.333333-2.3333333z" fill="#e0e0e0" fill-opacity=".188235" stroke-width="1.166667"/></svg>
diff --git a/editor/icons/GuiVTick.svg b/editor/icons/GuiVTick.svg
new file mode 100644
index 0000000000..c0af1df8fb
--- /dev/null
+++ b/editor/icons/GuiVTick.svg
@@ -0,0 +1 @@
+<svg height="4" viewBox="0 0 16 3.9999998" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="2" cy="2" fill="#fff" fill-opacity=".39216" r="1"/></svg>
diff --git a/editor/icons/GuiViewportHdiagsplitter.svg b/editor/icons/GuiViewportHdiagsplitter.svg
new file mode 100644
index 0000000000..ceba2c9cfb
--- /dev/null
+++ b/editor/icons/GuiViewportHdiagsplitter.svg
@@ -0,0 +1 @@
+<svg height="34" viewBox="0 0 64 34" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m4.0307 1048.4h29.969m-30 30v-60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="matrix(0 1 -1 0 1080.4 -2)"/></svg>
diff --git a/editor/icons/GuiViewportVdiagsplitter.svg b/editor/icons/GuiViewportVdiagsplitter.svg
new file mode 100644
index 0000000000..af52e1ec62
--- /dev/null
+++ b/editor/icons/GuiViewportVdiagsplitter.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 34 64" width="34" xmlns="http://www.w3.org/2000/svg"><path d="m4.0307 1048.4h29.969m-30 30v-60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="matrix(-1 0 0 -1 36.008 1080.4)"/></svg>
diff --git a/editor/icons/GuiViewportVhsplitter.svg b/editor/icons/GuiViewportVhsplitter.svg
new file mode 100644
index 0000000000..b53a23f62a
--- /dev/null
+++ b/editor/icons/GuiViewportVhsplitter.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m-26 1048.4h60m-30 30v-60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="matrix(0 1 -1 0 1080.4 28)"/></svg>
diff --git a/editor/icons/GuiVisibilityHidden.svg b/editor/icons/GuiVisibilityHidden.svg
new file mode 100644
index 0000000000..6152fe8acf
--- /dev/null
+++ b/editor/icons/GuiVisibilityHidden.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9609 7.7266-1.9219.54883c.31999 1.12.8236 2.0593 1.4316 2.8398l-.83398.83398 1.4141 1.4141.84375-.84375c.98585.74762 2.0766 1.2067 3.1055 1.3867v1.0938h2v-1.0938c1.0288-.17998 2.1196-.6391 3.1055-1.3867l.84375.84375 1.4141-1.4141-.83398-.83398c.60804-.78055 1.1117-1.7199 1.4316-2.8398l-1.9219-.54883c-.8756 3.0646-3.5391 4.2734-5.0391 4.2734s-4.1635-1.2088-5.0391-4.2734z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/GuiVisibilityVisible.svg b/editor/icons/GuiVisibilityVisible.svg
new file mode 100644
index 0000000000..32eaea633b
--- /dev/null
+++ b/editor/icons/GuiVisibilityVisible.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.00586.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.55273c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/GuiVisibilityXray.svg b/editor/icons/GuiVisibilityXray.svg
new file mode 100644
index 0000000000..109911df45
--- /dev/null
+++ b/editor/icons/GuiVisibilityXray.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-rule="evenodd"><path d="m7.9998 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.00586.5703c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.5527c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill-opacity=".39216"/><path d="m8 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.00586.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246v-2a4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/GuiVsplitBg.svg b/editor/icons/GuiVsplitBg.svg
new file mode 100644
index 0000000000..9844fc2018
--- /dev/null
+++ b/editor/icons/GuiVsplitBg.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 7.9999995" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h8v8h-8z" fill-opacity=".098039"/></svg>
diff --git a/editor/icons/GuiVsplitter.svg b/editor/icons/GuiVsplitter.svg
new file mode 100644
index 0000000000..add4301a4b
--- /dev/null
+++ b/editor/icons/GuiVsplitter.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 64 8" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m2 1048.4h60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="translate(0 -1044.4)"/></svg>
diff --git a/editor/icons/HBoxContainer.svg b/editor/icons/HBoxContainer.svg
new file mode 100644
index 0000000000..791fca0ebc
--- /dev/null
+++ b/editor/icons/HBoxContainer.svg
@@ -0,0 +1 @@
+<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 2h2v10h-2zm4 0h2v10h-2zm4 0h2v10h-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/HScrollBar.svg b/editor/icons/HScrollBar.svg
new file mode 100644
index 0000000000..5828ccb388
--- /dev/null
+++ b/editor/icons/HScrollBar.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1041.4c0-1.108-.892-2-2-2h-10c-1.108 0-2 .892-2 2v6c0 1.108.892 2 2 2h10c1.108 0 2-.892 2-2zm-1 2.9883a1.0001 1.0001 0 0 1 -.168.5664l-2 3a1.0001 1.0001 0 1 1 -1.664-1.1094l1.6289-2.4453-1.6289-2.4453a1.0001 1.0001 0 1 1 1.664-1.1094l2 3a1.0001 1.0001 0 0 1 .168.543zm-7.9922-2.9981a1.0001 1.0001 0 0 1 -.1758.5645l-1.6308 2.4453 1.6308 2.4453a1.0001 1.0001 0 1 1 -1.664 1.1094l-2-3a1.0001 1.0001 0 0 1 0-1.1094l2-3a1.0001 1.0001 0 0 1 1.8398.5449z" fill="#a5efac" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/HSeparator.svg b/editor/icons/HSeparator.svg
new file mode 100644
index 0000000000..d786767be8
--- /dev/null
+++ b/editor/icons/HSeparator.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 2v3h6v-3zm-4 5v2h14v-2zm4 4v3h6v-3z" fill="#a5efac"/></svg>
diff --git a/editor/icons/HSlider.svg b/editor/icons/HSlider.svg
new file mode 100644
index 0000000000..0ab453bbce
--- /dev/null
+++ b/editor/icons/HSlider.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 3c-.55228 0-1 .44772-1 1v2c0 .55228.44772 1 1 1s1-.44772 1-1v-2c0-.55228-.44772-1-1-1zm12 0c-.55228 0-1 .44772-1 1v2c0 .55228.44772 1 1 1s1-.44772 1-1v-2c0-.55228-.44772-1-1-1zm-6 1c-.55228 0-1 .44772-1 1s.44772 1 1 1 1-.44772 1-1-.44772-1-1-1zm5 5c-1.1046 0-2 .89543-2 2 0 1.1046.89543 2 2 2 1.0099-.000337 1.8611-.75351 1.9844-1.7559.04003-.16104.03936-.32952-.002-.49024-.12404-1.0008-.97388-1.7527-1.9824-1.7539zm-11 1c-1.3523-.019125-1.3523 2.0191 0 2h7.1309c-.085635-.32648-.1296-.66248-.13086-1 .00189-.3376.046518-.67361.13281-1z" fill="#a5efac"/></svg>
diff --git a/editor/icons/HSplitContainer.svg b/editor/icons/HSplitContainer.svg
new file mode 100644
index 0000000000..796e331ef5
--- /dev/null
+++ b/editor/icons/HSplitContainer.svg
@@ -0,0 +1 @@
+<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 2h4v3l-2 2 2 2v3h-4zm6 0h4v10h-4v-3l2-2-2-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/HTTPRequest.svg b/editor/icons/HTTPRequest.svg
new file mode 100644
index 0000000000..1a2187fe15
--- /dev/null
+++ b/editor/icons/HTTPRequest.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-3 4h2v3h2v-3h2zm7 0v3h-2l3 4 3-4h-2v-3zm-10 9v2 1 2h1v-2h1v2h1v-5h-1v2h-1v-2zm4 0v1h1v4h1v-4h1v-1zm4 0v1h1v4h1v-4h1v-1zm4 0v2 1 2h1v-2h1 1v-1-2h-2zm1 1h1v1h-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Headphones.svg b/editor/icons/Headphones.svg
new file mode 100644
index 0000000000..76f92d58a7
--- /dev/null
+++ b/editor/icons/Headphones.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7v2 3a2 2 0 0 0 2 2h2v-5h-2v-2a5 5 0 0 1 5-5 5 5 0 0 1 5 5v2h-2v3 2h2a2 2 0 0 0 2-2v-3-2a7 7 0 0 0 -7-7z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/HeightMapShape3D.svg b/editor/icons/HeightMapShape3D.svg
new file mode 100644
index 0000000000..0ffff96850
--- /dev/null
+++ b/editor/icons/HeightMapShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="8" y2="11"><stop offset="0" stop-color="#68b6ff"/><stop offset="1" stop-color="#a2d2ff"/></linearGradient><g transform="translate(0 -1)"><path d="m1 1044.4 7 3 7-3-7-3z" fill="#a2d2ff" fill-rule="evenodd" transform="translate(0 -1033.4)"/><path d="m3 11c1-1 2-2 2-4s1-3 3-3 3 1 3 3 1 3 2 4z" fill="url(#a)"/></g></svg>
diff --git a/editor/icons/Help.svg b/editor/icons/Help.svg
new file mode 100644
index 0000000000..65f3100164
--- /dev/null
+++ b/editor/icons/Help.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5.0293 1c-.99969-.010925-2.0096.31165-3.0293 1v7c2.0172-1.3529 4.0167-1.3136 6 0 1.9833-1.3136 3.9828-1.3529 6 0v-7c-1.0197-.68835-2.0296-1.0109-3.0293-1-.6613.007227-1.3175.1735-1.9707.46289v4.5371h-1v-4c-.98156-.64465-1.971-.98908-2.9707-1zm-5.0293 9v6h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3zm5 3a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0 -3-3 3 3 0 0 0 -3 3zm6 0a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2h-1a3 3 0 0 0 -3 3zm-9-1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" style="fill:#e0e0e0;fill-opacity:.58824;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.32549;stroke-width:2"/></svg>
diff --git a/editor/icons/HelpSearch.svg b/editor/icons/HelpSearch.svg
new file mode 100644
index 0000000000..89c8735432
--- /dev/null
+++ b/editor/icons/HelpSearch.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 0a4 4 0 0 0 -4 4 4 4 0 0 0 .55859 2.0273l-2.2656 2.2656 1.4141 1.4141 2.2656-2.2656a4 4 0 0 0 2.0273.55859 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-9 8v6h2c1.6569 0 3-1.3431 3-3s-1.3431-3-3-3zm5 3c0 1.6569 1.3431 3 3 3s3-1.3431 3-3-1.3431-3-3-3-3 1.3431-3 3zm6 0c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1 .00001-.55228.44772-.99999 1-1h1v-2h-1c-1.6569 0-3 1.3431-3 3zm-9-1c.55228 0 1 .44772 1 1s-.44772 1-1 1zm6 0c.55228.00001.99999.44772 1 1-.0000096.55228-.44772.99999-1 1-.55228-.00001-.99999-.44772-1-1 .0000096-.55228.44772-.99999 1-1z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".32549" stroke-width="2"/></svg>
diff --git a/editor/icons/HingeJoint3D.svg b/editor/icons/HingeJoint3D.svg
new file mode 100644
index 0000000000..ca97169d82
--- /dev/null
+++ b/editor/icons/HingeJoint3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.2832 1.3281a1.0001 1.0001 0 0 0 -.88086.51172l-3.6895 6.3906c.40599-.13877.83411-.23047 1.2871-.23047.37043 0 .72206.067873 1.0625.16211l3.0723-5.3223a1.0001 1.0001 0 0 0 -.85156-1.5117zm-3.2832 7.6719a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h10a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-7.1738a3 3 0 0 0 .17383-1 3 3 0 0 0 -3-3zm0 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/History.svg b/editor/icons/History.svg
new file mode 100644
index 0000000000..45bc565088
--- /dev/null
+++ b/editor/icons/History.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/><path d="m8 1041.4h2v4h-2z"/><path d="m8 1043.4h4v2h-4z"/></g></svg>
diff --git a/editor/icons/Hsize.svg b/editor/icons/Hsize.svg
new file mode 100644
index 0000000000..c7b62e58c8
--- /dev/null
+++ b/editor/icons/Hsize.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 7v-2l-3 3 3 3v-2h8v2l3-3-3-3v2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Image.svg b/editor/icons/Image.svg
new file mode 100644
index 0000000000..ddf97ec59e
--- /dev/null
+++ b/editor/icons/Image.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm1 2h10v8h-10zm6 2-1.5 2.5-.70117 1.168-.099609-.16797-.89844-1.5-.90039 1.5-.90039 1.5h1.8008.19922 1.5996 1.4004 3l-1.5-2.5-1.5-2.5z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ImageTexture.svg b/editor/icons/ImageTexture.svg
new file mode 100644
index 0000000000..013e847db3
--- /dev/null
+++ b/editor/icons/ImageTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm1 2h10v8h-10zm6 2v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-2h-1v-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ImmediateGeometry3D.svg b/editor/icons/ImmediateGeometry3D.svg
new file mode 100644
index 0000000000..876d752ced
--- /dev/null
+++ b/editor/icons/ImmediateGeometry3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9208 1046.4c-.26373.3-.4204.7296-.4204 1.2383 0 1.6277-3.1381-.1781-.33757 2.6703.88382.899 2.6544.6701 3.5382-.2288.88384-.899.88382-2.3565 0-3.2554-1.1002-1.1191-2.2001-1.0845-2.7803-.4244zm2.3802-1.6103 2.4005 2.4416 6.8014-6.9177c.66286-.6742.66286-1.7673 0-2.4415-.66288-.6741-1.7376-.6741-2.4005 0z" fill="#fc9c9c" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/ImportCheck.svg b/editor/icons/ImportCheck.svg
new file mode 100644
index 0000000000..0e6b0a7105
--- /dev/null
+++ b/editor/icons/ImportCheck.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1044.4 4 4 8-8" fill="none" stroke="#45ff8b" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/ImportFail.svg b/editor/icons/ImportFail.svg
new file mode 100644
index 0000000000..6e34dfc405
--- /dev/null
+++ b/editor/icons/ImportFail.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9902 1.9902a1.0001 1.0001 0 0 0 -.69727 1.7168l4.293 4.293-4.293 4.293a1.0001 1.0001 0 1 0 1.4141 1.4141l4.293-4.293 4.293 4.293a1.0001 1.0001 0 1 0 1.4141-1.4141l-4.293-4.293 4.293-4.293a1.0001 1.0001 0 0 0 -.72656-1.7148 1.0001 1.0001 0 0 0 -.6875.30078l-4.293 4.293-4.293-4.293a1.0001 1.0001 0 0 0 -.7168-.30273z" fill="#ff5d5d" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/InformationSign.svg b/editor/icons/InformationSign.svg
new file mode 100644
index 0000000000..8cf1ac78e3
--- /dev/null
+++ b/editor/icons/InformationSign.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width=".570241"><path d="m4.5291945 14.892249h6.8428865l3.421444-3.421444v-6.8428864l-3.421444-3.4214437h-6.8428865l-3.4214436 3.4214437v6.8428864z" fill="#ffb65d" fill-rule="evenodd"/><g fill="#fff"><path d="m6.69985 6.347754h2.624354v6.50621h-2.624354z"/><ellipse cx="8.039363" cy="4.215466" rx="1.394188" ry="1.366851"/></g></g></svg>
diff --git a/editor/icons/InsertAfter.svg b/editor/icons/InsertAfter.svg
new file mode 100644
index 0000000000..b75df837bd
--- /dev/null
+++ b/editor/icons/InsertAfter.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="4" cy="12" fill="none" r="2"/><path d="m11.99.99023a1.0001 1.0001 0 0 0 -.69726 1.7168l.29297.29297h-2.5859v2h2.5859l-.29297.29297a1.0001 1.0001 0 1 0 1.4141 1.4141l2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.7168-.30273zm-8.9902.0097656c-1.108 0-2 .892-2 2v2c0 1.108.892 2 2 2h2c1.108 0 2-.892 2-2v-2c0-1.108-.892-2-2-2z" fill="#e0e0e0"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/InsertBefore.svg b/editor/icons/InsertBefore.svg
new file mode 100644
index 0000000000..44c876fc76
--- /dev/null
+++ b/editor/icons/InsertBefore.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="4" cy="12" fill="none" r="2"/><path d="m4.0096.99023a1.0001 1.0001 0 0 1 .69726 1.7168l-.29297.29297h2.5859v2h-2.5859l.29297.29297a1.0001 1.0001 0 1 1 -1.4141 1.4141l-2-2a1.0001 1.0001 0 0 1 0-1.4141l2-2a1.0001 1.0001 0 0 1 .7168-.30273zm8.9902.0097656c1.108 0 2 .892 2 2v2c0 1.108-.892 2-2 2h-2c-1.108 0-2-.892-2-2v-2c0-1.108.892-2 2-2z" fill="#e0e0e0"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/Instance.svg b/editor/icons/Instance.svg
new file mode 100644
index 0000000000..f0b8a04c7d
--- /dev/null
+++ b/editor/icons/Instance.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 1c-2.1973 0-4 1.8027-4 4 0 .35477.062329.69321.15039 1.0215l2.3945-2.3945c.36302-.38506.87563-.62695 1.4551-.62695 1.1164 0 2 .8836 2 2 0 .57388-.23667 1.0829-.61523 1.4453l-2.4043 2.4043c.32773.087749.66541.15039 1.0195.15039 2.1973 0 4-1.8027 4-4s-1.8027-4-4-4zm-.013672 3.002a1 1 0 0 0 -.69336.29102l-6 6a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l6-6a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102zm-5.9863 2.998c-2.1973 0-4 1.8027-4 4s1.8027 4 4 4 4-1.8027 4-4c0-.35412-.062641-.6918-.15039-1.0195l-2.4043 2.4043c-.36245.37857-.87143.61523-1.4453.61523-1.1164 0-2-.8836-2-2 0-.57944.24189-1.0921.62695-1.4551l2.3945-2.3945c-.32827-.088062-.66671-.15039-1.0215-.15039z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/InstanceOptions.svg b/editor/icons/InstanceOptions.svg
new file mode 100644
index 0000000000..c9ff474fee
--- /dev/null
+++ b/editor/icons/InstanceOptions.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m1 7v6c0 1.1046.89543 2 2 2h12v-8zm4 2h6l-3 4z" transform="translate(0 1036.4)"/><path d="m.71129 1040.4.28871 1.9791 2.2438-.3273-.81826-1.9018-1.7143.25zm3.6933-.5387.81826 1.9018 1.9791-.2887-.81826-1.9018zm3.9581-.5775.81826 1.9018 1.9791-.2887-.81826-1.9018zm3.9581-.5774.81826 1.9018 1.7143-.25-.28871-1.9791-2.2438.3273z"/></g></svg>
diff --git a/editor/icons/InterpCubic.svg b/editor/icons/InterpCubic.svg
new file mode 100644
index 0000000000..ad2ed51ee1
--- /dev/null
+++ b/editor/icons/InterpCubic.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c3 0 3-4 6-4s3 4 6 4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg>
diff --git a/editor/icons/InterpLinear.svg b/editor/icons/InterpLinear.svg
new file mode 100644
index 0000000000..241a82fc8f
--- /dev/null
+++ b/editor/icons/InterpLinear.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 6-4 6 4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg>
diff --git a/editor/icons/InterpRaw.svg b/editor/icons/InterpRaw.svg
new file mode 100644
index 0000000000..6344155c4b
--- /dev/null
+++ b/editor/icons/InterpRaw.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4h3v-4h6v4h3" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg>
diff --git a/editor/icons/InterpWrapClamp.svg b/editor/icons/InterpWrapClamp.svg
new file mode 100644
index 0000000000..6ba8e78500
--- /dev/null
+++ b/editor/icons/InterpWrapClamp.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v6h2v-2.9863-3.0137zm2 3.0137a1.0001 1.0001 0 0 0 .29297.69336l2 2a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-.29297-.29297h3.1719l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .29297-.72266 1.0001 1.0001 0 0 0 -.29297-.69141l-2-2a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l.29297.29297h-3.1719l.29297-.29297a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-2 2a1.0001 1.0001 0 0 0 -.29297.7207zm10-.029297v3.0156h2v-6h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/InterpWrapLoop.svg b/editor/icons/InterpWrapLoop.svg
new file mode 100644
index 0000000000..57670f97ce
--- /dev/null
+++ b/editor/icons/InterpWrapLoop.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 0-3 2 3 2v-1h3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1v2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3h-3zm-5 1a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h3v1l3-2-3-2v1h-3a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/InverseKinematics.svg b/editor/icons/InverseKinematics.svg
new file mode 100644
index 0000000000..e4a076fbbd
--- /dev/null
+++ b/editor/icons/InverseKinematics.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v10.27h2v-10.271a2 2 0 0 0 .73047-.72852h4.541a2 2 0 0 0 .72852.73047v3.2695h-2v2l-1 2 3 2v-4h2v4l3-2-1-2v-2h-2v-3.2715a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-4.541a2 2 0 0 0 -1.7285-1z" fill="#fc9c9c" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/Issue.svg b/editor/icons/Issue.svg
new file mode 100644
index 0000000000..457d070d89
--- /dev/null
+++ b/editor/icons/Issue.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m5.2902433 14.98657h1.9512087v2.441414h-1.9512087zm0-11.909101h1.9512087v6.2957719l-.1922373 3.4314361h-1.5571222l-.2018492-3.4314361z" transform="matrix(1.2172834 0 0 .60107067 .478728 1.839214)"/><path d="m8.0503291 1.1522775a6.8983747 6.8983747 0 0 0 -6.8980516 6.8980516 6.8983747 6.8983747 0 0 0 6.8980516 6.8997839 6.8983747 6.8983747 0 0 0 6.8997839-6.8997839 6.8983747 6.8983747 0 0 0 -6.8997839-6.8980516zm-.0294418 1.1430364a5.6659852 5.6659852 0 0 1 5.6666897 5.6649578 5.6659852 5.6659852 0 0 1 -5.6666897 5.6666893 5.6659852 5.6659852 0 0 1 -5.6666896-5.6666893 5.6659852 5.6659852 0 0 1 5.6666896-5.6649578z" stroke-width=".886719"/></g></svg>
diff --git a/editor/icons/ItemList.svg b/editor/icons/ItemList.svg
new file mode 100644
index 0000000000..fb98a706a9
--- /dev/null
+++ b/editor/icons/ItemList.svg
@@ -0,0 +1 @@
+<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 2h10v10h-10zm1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/JoyAxis.svg b/editor/icons/JoyAxis.svg
new file mode 100644
index 0000000000..1ab65f0af0
--- /dev/null
+++ b/editor/icons/JoyAxis.svg
@@ -0,0 +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="m27 1038.4h7v14h-7z" fill="#fff" fill-opacity=".99608"/><g fill="#e0e0e0"><path d="m3 1a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h12v-14zm4 2h2a1 1 0 0 1 1 1v2h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1-1v-2h-2a1 1 0 0 1 -1-1v-2a1 1 0 0 1 1-1h2v-2a1 1 0 0 1 1-1z" fill-opacity=".99608" transform="translate(0 1036.4)"/><circle cx="8" cy="1044.4" r="1"/></g></g></svg>
diff --git a/editor/icons/JoyButton.svg b/editor/icons/JoyButton.svg
new file mode 100644
index 0000000000..080d91ad53
--- /dev/null
+++ b/editor/icons/JoyButton.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m27 1038.4h7v14h-7z" fill="#fff"/><path d="m1 1v14h12c1.1046 0 2-.8954 2-2v-10c0-1.1046-.89543-2-2-2zm7 1a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-4 4a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm8 0a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-4 4a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/Joypad.svg b/editor/icons/Joypad.svg
new file mode 100644
index 0000000000..3c6bbf2980
--- /dev/null
+++ b/editor/icons/Joypad.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 3c-.55226.0000552-.99994.44774-1 1v8c.0000552.55226.44774.99994 1 1h14c.55226-.000055.99994-.44774 1-1v-8c-.000055-.55226-.44774-.99994-1-1zm2 2h2v2h2v2h-2v2h-2v-2h-2v-2h2zm10.5 0a1.5 1.5 0 0 1 1.5 1.5 1.5 1.5 0 0 1 -1.5 1.5 1.5 1.5 0 0 1 -1.5-1.5 1.5 1.5 0 0 1 1.5-1.5zm-3 3a1.5 1.5 0 0 1 1.5 1.5 1.5 1.5 0 0 1 -1.5 1.5 1.5 1.5 0 0 1 -1.5-1.5 1.5 1.5 0 0 1 1.5-1.5z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/Key.svg b/editor/icons/Key.svg
new file mode 100644
index 0000000000..544ebe5a47
--- /dev/null
+++ b/editor/icons/Key.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 4a4 4 0 0 0 -3.8691 3h-6.1309v2h1v2h3v-2h2.1328a4 4 0 0 0 3.8672 3 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/KeyAnimation.svg b/editor/icons/KeyAnimation.svg
new file mode 100644
index 0000000000..5afd5bdb70
--- /dev/null
+++ b/editor/icons/KeyAnimation.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#b76ef0" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg>
diff --git a/editor/icons/KeyAudio.svg b/editor/icons/KeyAudio.svg
new file mode 100644
index 0000000000..e1a93529a6
--- /dev/null
+++ b/editor/icons/KeyAudio.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#eae668" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg>
diff --git a/editor/icons/KeyBezier.svg b/editor/icons/KeyBezier.svg
new file mode 100644
index 0000000000..cd41f953b1
--- /dev/null
+++ b/editor/icons/KeyBezier.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#5792f6" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg>
diff --git a/editor/icons/KeyBezierHandle.svg b/editor/icons/KeyBezierHandle.svg
new file mode 100644
index 0000000000..a2b58118e3
--- /dev/null
+++ b/editor/icons/KeyBezierHandle.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3.9960938-.03710938c-.1950007 0-.3896403.07518711-.5390626.22460938l-3.23632808 3.2363281c-.29883746.2988375-.29884453.7812336 0 1.0800781l3.23632808 3.2363282c.2988375.2988374.7812407.2988374 1.0800782 0l3.2363281-3.2363282c.2988445-.2988445.2988375-.7812406 0-1.0800781l-3.2363281-3.2363281c-.1494223-.14942227-.346015-.22460938-.5410156-.22460938zm.0292968.8515625c.1516192 0 .3037416.05796444.4199219.17382813l2.515625 2.50781255c.2323605.2317273.2323605.6061632 0 .8378906l-2.515625 2.5097656c-.2323605.2317274-.6074832.2317274-.8398437 0l-2.515625-2.5097656c-.23236057-.2317274-.23236057-.6061633 0-.8378906l2.515625-2.50781255c.1161802-.11586369.2683026-.17382813.4199218-.17382813z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/KeyBezierPoint.svg b/editor/icons/KeyBezierPoint.svg
new file mode 100644
index 0000000000..266da4c200
--- /dev/null
+++ b/editor/icons/KeyBezierPoint.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#e0e0e0" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1044.4)" width="6.1027" x="-741.53" y="741.08"/></svg>
diff --git a/editor/icons/KeyBezierSelected.svg b/editor/icons/KeyBezierSelected.svg
new file mode 100644
index 0000000000..e8536e97b4
--- /dev/null
+++ b/editor/icons/KeyBezierSelected.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#84c2ff" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1044.4)" width="6.1027" x="-741.53" y="741.08"/></svg>
diff --git a/editor/icons/KeyCall.svg b/editor/icons/KeyCall.svg
new file mode 100644
index 0000000000..dd47272d4f
--- /dev/null
+++ b/editor/icons/KeyCall.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#66f376" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg>
diff --git a/editor/icons/KeyHover.svg b/editor/icons/KeyHover.svg
new file mode 100644
index 0000000000..b67d7ff78d
--- /dev/null
+++ b/editor/icons/KeyHover.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#fff" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1044.4)" width="6.1027" x="-741.53" y="741.08"/></svg>
diff --git a/editor/icons/KeyInvalid.svg b/editor/icons/KeyInvalid.svg
new file mode 100644
index 0000000000..4a04c1ee65
--- /dev/null
+++ b/editor/icons/KeyInvalid.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m.46447 1046.2 2.1213 2.1213-2.1213 2.1213 1.4142 1.4142 2.1213-2.1213 2.1213 2.1213 1.4142-1.4142-2.1213-2.1213 2.1213-2.1213-1.4142-1.4142-2.1213 2.1213-2.1213-2.1213-1.4142 1.4142z" fill="#ff5d5d" transform="translate(0 -1044.4)"/></svg>
diff --git a/editor/icons/KeyNext.svg b/editor/icons/KeyNext.svg
new file mode 100644
index 0000000000..a2b616072b
--- /dev/null
+++ b/editor/icons/KeyNext.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/><path d="m11 1a4 4 0 0 0 -3.8691 3h-6.1309v2h1v2h3v-2h2.1328a4 4 0 0 0 2.8672 2.8691v-.86914h3.6387a4 4 0 0 0 1.3613-3 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/KeyPosition.svg b/editor/icons/KeyPosition.svg
new file mode 100644
index 0000000000..260a6f582f
--- /dev/null
+++ b/editor/icons/KeyPosition.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm-7 7v5c0 1.6569 1.3471 3.114 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1v-5zm7 2c-1.645 0-3 1.355-3 3s1.355 3 3 3 3-1.355 3-3-1.355-3-3-3zm3 3c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1 .00001-.55228.44772-.99999 1-1h1v-2h-1c-1.6569 0-3 1.3431-3 3zm-3-1c.56413 0 1 .4359 1 1 0 .5642-.43587 1-1 1s-1-.4358-1-1c0-.5641.43587-1 1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/KeyRotation.svg b/editor/icons/KeyRotation.svg
new file mode 100644
index 0000000000..284a835467
--- /dev/null
+++ b/editor/icons/KeyRotation.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm3 7v5c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228 0-.99999-.4477-1-1v-1h2v-2h-2v-2zm0 5c0-1.645-1.355-3-3-3s-3 1.355-3 3 1.355 3 3 3 3-1.355 3-3zm-7-3c-1.6569 0-3 1.3431-3 3v3h2v-3c.0000096-.5523.44772-1 1-1h1v-2zm4 2c.56413 0 1 .4359 1 1 0 .5642-.43587 1-1 1s-1-.4358-1-1c0-.5641.43587-1 1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/KeyScale.svg b/editor/icons/KeyScale.svg
new file mode 100644
index 0000000000..84805191f2
--- /dev/null
+++ b/editor/icons/KeyScale.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm3 7v5c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1v-5zm-8 2c-.71466-.0001-1.3751.3811-1.7324 1-.35727.6188-.35727 1.3812 0 2 .35733.6189 1.0178 1.0001 1.7324 1h-2v2h2c.71466.0001 1.3751-.3811 1.7324-1 .35727-.6188.35727-1.3812 0-2-.35733-.6189-1.0178-1.0001-1.7324-1h2v-2zm6 0c-1.6569 0-3 1.3431-3 3s1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1 .0000096-.55228.44772-.99999 1-1h1v-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/KeySelected.svg b/editor/icons/KeySelected.svg
new file mode 100644
index 0000000000..32f900bdd6
--- /dev/null
+++ b/editor/icons/KeySelected.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#84c2ff" height="6.1027" ry=".76286" transform="matrix(.87871827 -.87871827 .87871827 .87871827 .03288 -1297.7965)" width="6.1027" x="-741.53003" y="741.08002"/><rect fill="#003e7a" height="3.434683" ry=".429348" stroke-width=".562814" transform="matrix(.89137101 -.86588067 .89137101 .86588067 -.038545 -1297.8361)" width="3.434683" x="-751.20953" y="753.42743"/></svg>
diff --git a/editor/icons/KeyValue.svg b/editor/icons/KeyValue.svg
new file mode 100644
index 0000000000..2a112e210a
--- /dev/null
+++ b/editor/icons/KeyValue.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#e0e0e0" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 1.002946 -1043.3636)" width="6.1027" x="-741.53003" y="741.08002"/></svg>
diff --git a/editor/icons/KeyXform.svg b/editor/icons/KeyXform.svg
new file mode 100644
index 0000000000..12f27d32a9
--- /dev/null
+++ b/editor/icons/KeyXform.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#ea9568" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg>
diff --git a/editor/icons/Keyboard.svg b/editor/icons/Keyboard.svg
new file mode 100644
index 0000000000..9c372bc08d
--- /dev/null
+++ b/editor/icons/Keyboard.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M4 2a1 1 0 0 0-1 1v9.084c0 .506.448.916 1 .916h8c.552 0 1-.41 1-.916V3a1 1 0 0 0-1-1H4zm1.543 1.139h1.393L8.77 7.338h1.295v.437c.708.052 1.246.239 1.61.559.368.316.55.747.55 1.295 0 .552-.182.99-.55 1.314-.368.32-.906.505-1.61.553v.467H8.771v-.473c-.708-.06-1.247-.248-1.615-.564-.364-.316-.545-.75-.545-1.297 0-.548.181-.977.545-1.29.368-.315.907-.504 1.615-.564v-.437H7.307l-.282-.733H5.43l-.284.733H3.707l1.836-4.2zm.684 1.39l-.409 1.057h.817l-.408-1.057zm3.84 4.338v1.526c.28-.04.483-.12.607-.24.124-.125.185-.302.185-.53 0-.224-.063-.396-.191-.516-.124-.12-.326-.2-.602-.24zm-1.296.006c-.284.04-.487.12-.61.24-.12.116-.182.288-.182.516 0 .22.065.392.193.512.132.12.331.202.6.246V8.873z" fill="#e0e0e0" fill-opacity=".996"/><path d="M27 2h7v14h-7z" fill="#fff" fill-opacity=".996"/><path fill="#e0e0e0" fill-opacity=".996" d="M1 4v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4h-1v9a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4z"/></svg>
diff --git a/editor/icons/KeyboardPhysical.svg b/editor/icons/KeyboardPhysical.svg
new file mode 100644
index 0000000000..0f20315fca
--- /dev/null
+++ b/editor/icons/KeyboardPhysical.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M4 2a1 1 0 0 0-1 1v9.084c0 .506.448.916 1 .916h8c.552 0 1-.41 1-.916V3a1 1 0 0 0-1-1zm2.762 1.768h2.476l3.264 7.464H9.898l-.502-1.3H6.561l-.502 1.3H3.498zm1.217 2.474L7.254 8.12h1.45z" fill="#e0e0e0" fill-opacity=".996"/><path d="M27 2h7v14h-7z" fill="#fff" fill-opacity=".996"/><path fill="#e0e0e0" fill-opacity=".996" d="M1 4v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4h-1v9a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4z"/></svg>
diff --git a/editor/icons/KinematicBody2D.svg b/editor/icons/KinematicBody2D.svg
new file mode 100644
index 0000000000..70faad6a49
--- /dev/null
+++ b/editor/icons/KinematicBody2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6.4921 1c-.55401 0-1 .446-1 1v3c0 .554.44599 1 1 1h1v.9902a1.0001 1.0001 0 0 0 -.31641.062l-2.0508.6836-.68359-2.0508a1.0001 1.0001 0 0 0 -.99023-.6972 1.0001 1.0001 0 0 0 -.9082 1.3281l1 3a1.0001 1.0001 0 0 0 1.2656.6328l1.6836-.5605v.6113c0 .041.018715.076.023437.1152l-4.5781 3.0528a1.0001 1.0001 0 1 0 1.1094 1.664l5.0566-3.3711 1.4941 2.9864a1.0001 1.0001 0 0 0 1.2109.5019l3-1a1.0001 1.0001 0 1 0 -.63281-1.8965l-2.1777.7246-.97461-1.9511c.2759-.1777.46875-.4723.46875-.8262v-1h1.3828l.72266 1.4473a1.0001 1.0001 0 1 0 1.7891-.8946l-1-2a1.0001 1.0001 0 0 0 -.89453-.5527h-3v-1h1c.55401 0 1-.446 1-1v-3c0-.554-.44599-1-1-1zm0 2h1v2h-1z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/KinematicBody3D.svg b/editor/icons/KinematicBody3D.svg
new file mode 100644
index 0000000000..06e9275ec1
--- /dev/null
+++ b/editor/icons/KinematicBody3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1c-.55401 0-1 .44599-1 1v3c0 .55401.44599 1 1 1h1v.99023a1.0001 1.0001 0 0 0 -.31641.0625l-2.0508.68359-.68359-2.0508a1.0001 1.0001 0 0 0 -.99023-.69727 1.0001 1.0001 0 0 0 -.9082 1.3281l1 3a1.0001 1.0001 0 0 0 1.2656.63281l1.6836-.56055v.61133c0 .04088.018715.07566.023437.11523l-4.5781 3.0527a1.0001 1.0001 0 1 0 1.1094 1.6641l5.0566-3.3711 1.4941 2.9863a1.0001 1.0001 0 0 0 1.2109.50195l3-1a1.0001 1.0001 0 1 0 -.63281-1.8965l-2.1777.72461-.97461-1.9512c.2759-.17764.46875-.47227.46875-.82617v-1h1.3828l.72266 1.4473a1.0001 1.0001 0 1 0 1.7891-.89453l-1-2a1.0001 1.0001 0 0 0 -.89453-.55273h-3v-1h1c.55401 0 1-.44599 1-1v-3c0-.55401-.44599-1-1-1zm0 2h1v2h-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Label.svg b/editor/icons/Label.svg
new file mode 100644
index 0000000000..bfb1c903f3
--- /dev/null
+++ b/editor/icons/Label.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 3a1.0001 1.0001 0 0 0 -.70703.29297l-4 4a1.0001 1.0001 0 0 0 0 1.4141l4 4a1.0001 1.0001 0 0 0 .70703.29297h8a1.0001 1.0001 0 0 0 1-1v-8a1.0001 1.0001 0 0 0 -1-1h-8zm-1 4a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#a5efac" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/LargeTexture.svg b/editor/icons/LargeTexture.svg
new file mode 100644
index 0000000000..137a761e1d
--- /dev/null
+++ b/editor/icons/LargeTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v1 2h1v-2h2v-1zm11 0v1h2v2h1v-3zm-3 5v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-1-1h-1v-1zm-8 6v2 1h3v-1h-2v-2zm13 0v2h-2v1h3v-1-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Light2D.svg b/editor/icons/Light2D.svg
new file mode 100644
index 0000000000..d660b82c34
--- /dev/null
+++ b/editor/icons/Light2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 5 0 0 0 -5 5 5 5 0 0 0 3 4.5762v2.4238h4v-2.4199a5 5 0 0 0 3-4.5801 5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3 3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3zm-1 11v1h2v-1z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/LightOccluder2D.svg b/editor/icons/LightOccluder2D.svg
new file mode 100644
index 0000000000..8c5bb89218
--- /dev/null
+++ b/editor/icons/LightOccluder2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1037.4c-2.7614 0-5 2.2386-5 5 .00253 1.9858 1.18 3.7819 3 4.5762v2.4238h4v-2.4199c1.8213-.7949 2.999-2.5929 3-4.5801 0-2.7614-2.2386-5-5-5zm0 2v6c-1.6569 0-3-1.3431-3-3s1.3431-3 3-3zm-1 11v1h2v-1z" fill="#a5b7f3" fill-opacity=".98824" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/LightmapProbe.svg b/editor/icons/LightmapProbe.svg
new file mode 100644
index 0000000000..bc790d50c1
--- /dev/null
+++ b/editor/icons/LightmapProbe.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 9h3v-2h-3zm2.050781 2.535156 1.414063 1.414063 1.414062-1.414063-1.414062-1.414062zm0-7.070312 1.414063 1.414062 1.414062-1.414062-1.414062-1.414063zm1.949219 3.535156c0 1.6569 1.3432 3 3 3s3-1.3431 3-3-1.3432-3-3-3-3 1.3431-3 3zm3 7c3.865993 0 7-3.134007 7-7s-3.134007-7-7-7v2.333984c2.577329 0 4.666016 2.088687 4.666016 4.666016s-2.088687 4.666016-4.666016 4.666016z" fill="#fc9c9c" fill-opacity=".996078" stroke-width="1.16667"/></svg>
diff --git a/editor/icons/Line2D.svg b/editor/icons/Line2D.svg
new file mode 100644
index 0000000000..a0f9d1e33c
--- /dev/null
+++ b/editor/icons/Line2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1045.4 3 4 3-10 3 6 3-2" fill="none" stroke="#a5b7f3" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/LineEdit.svg b/editor/icons/LineEdit.svg
new file mode 100644
index 0000000000..54e3190259
--- /dev/null
+++ b/editor/icons/LineEdit.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 4v5h2v-5zm-1 7c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2h-2-10z" fill="#a5efac"/></svg>
diff --git a/editor/icons/LineShape2D.svg b/editor/icons/LineShape2D.svg
new file mode 100644
index 0000000000..f1dbe97c6f
--- /dev/null
+++ b/editor/icons/LineShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke="#68b6ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><path d="m1 1037.4 14 14" fill="#68b6ff" fill-rule="evenodd" stroke-opacity=".39216"/><g fill="none"><path d="m3 1039.4 10 10" stroke-opacity=".58824"/><path d="m5 1041.4 6 6"/></g></g></svg>
diff --git a/editor/icons/LinkButton.svg b/editor/icons/LinkButton.svg
new file mode 100644
index 0000000000..3a99d241c3
--- /dev/null
+++ b/editor/icons/LinkButton.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 3a5 5 0 0 0 -4.3301 2.5 5 5 0 0 0 0 5 5 5 0 0 0 4.3301 2.5h1v-2h-1a3 3 0 0 1 -3-3 3 3 0 0 1 3-3h1v-2zm3 0v2h1a3 3 0 0 1 3 3 3 3 0 0 1 -3 3h-1v2h1a5 5 0 0 0 4.3301-2.5 5 5 0 0 0 0-5 5 5 0 0 0 -4.3301-2.5zm-3 4a.99998.99998 0 0 0 -1 1 .99998.99998 0 0 0 1 1h4a.99998.99998 0 0 0 1-1 .99998.99998 0 0 0 -1-1z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ListSelect.svg b/editor/icons/ListSelect.svg
new file mode 100644
index 0000000000..9e2bf381d3
--- /dev/null
+++ b/editor/icons/ListSelect.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h8.2578l-.82227-2h-5.4355v-2h4.6113l-.82227-2h-3.7891v-2h3.8867a1.5002 1.5002 0 0 1 1.0977-.49805v-.0019531a1.5002 1.5002 0 0 1 .58594.11133l.94531.38867h.48438v.19922l2 .82227v-7.0215h-11zm2 2h7v2h-7zm5 5 3.291 8 .94726-2.8203 1.8828 1.8828.94336-.94141-1.8848-1.8828 2.8203-.94726-8-3.291z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Listener3D.svg b/editor/icons/Listener3D.svg
new file mode 100644
index 0000000000..7afbdccd43
--- /dev/null
+++ b/editor/icons/Listener3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a5 5 0 0 0 -5 5h2a3 3 0 0 1 3-3 3 3 0 0 1 3 3c0 1.75-.54175 2.3583-1.1406 2.8574-.29944.2495-.62954.44071-.97656.69141-.17351.1253-.35729.26529-.53711.49219-.17982.227-.3457.58398-.3457.95898 0 1.2778-.31632 1.5742-.63867 1.7676-.32236.1934-.86133.23242-1.3613.23242h-1v2h1c.5 0 1.461.038922 2.3887-.51758.87316-.5239 1.4826-1.6633 1.5566-3.2266.011365-.0098.027247-.024684.10938-.083984.21547-.1556.63537-.40194 1.0859-.77734.90112-.751 1.8594-2.1445 1.8594-4.3945a5 5 0 0 0 -5-5zm7.9277 1-1.7383 1.0039a6 6 0 0 1 .81055 2.9961 6 6 0 0 1 -.80859 2.998l1.7363 1.002a8 8 0 0 0 0-8z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/Load.svg b/editor/icons/Load.svg
new file mode 100644
index 0000000000..a049454ebb
--- /dev/null
+++ b/editor/icons/Load.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-1.1046 0-2 .8954-2 2v9c0 1.1046.89543 2 2 2h9c1.1046 0 1.8184-.91043 2-2l1-6c.003977-.18354-.042648-.3412-.13477-.5-.17849-.30916-.50825-.49972-.86523-.5h-8c-.35698.0002824-.68674.19084-.86523.5-.092118.1588-.13874.3399-.13477.52344l-1 5.9766c-.091144.54473-.44772 1-1 1s-1-.4477-1-1v-9c0-.5523.44772-1 1-1h2c.55228 0 1 .4477 1 1a1 1 0 0 0 .29297.70703 1 1 0 0 0 .70703.29297h4 1a1 1 0 0 0 -.29297-.70703 1 1 0 0 0 -.70703-.29297h-4c0-1.1046-.89543-2-2-2h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Lock.svg b/editor/icons/Lock.svg
new file mode 100644
index 0000000000..1988b9b331
--- /dev/null
+++ b/editor/icons/Lock.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 5 0 0 0 -5 5v2h-1v7h12v-7h-1v-2a5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3v2h-6v-2a3 3 0 0 1 3-3zm-1 7h2v3h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/LockViewport.svg b/editor/icons/LockViewport.svg
new file mode 100644
index 0000000000..c8b8a57be6
--- /dev/null
+++ b/editor/icons/LockViewport.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 0a6 6 0 0 0 -6 6v1h-1v9h14v-9h-1v-1a6 6 0 0 0 -6-6zm0 4c1.1046 0 2 .89543 2 2v1h-4v-1c0-1.1046.89543-2 2-2z" fill-opacity=".39216" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="4"/><path d="m8 1a5 5 0 0 0 -5 5v2h-1v7h12v-7h-1v-2a5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3v2h-6v-2a3 3 0 0 1 3-3zm-1 7h2v3h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Logo.svg b/editor/icons/Logo.svg
new file mode 100644
index 0000000000..d7aef39cc9
--- /dev/null
+++ b/editor/icons/Logo.svg
@@ -0,0 +1 @@
+<svg height="69" viewBox="0 0 187 69" width="187" xmlns="http://www.w3.org/2000/svg"><path d="m91.912 19.51c-3.5233 0-6.278 1.1097-8.2676 3.3281-1.9911 2.2193-2.9844 5.1004-2.9844 8.6465 0 4.1636 1.0165 7.3207 3.0508 9.4707 2.0379 2.1497 4.7123 3.2227 8.0293 3.2227 1.7838 0 3.3686-.15384 4.752-.46289 1.3848-.30784 2.3038-.62367 2.7617-.94336l.13867-10.736c0-.62388-1.6471-.90785-3.4941-.93945-1.847-.02857-3.9609.35742-3.9609.35742v3.6055h2.125l-.023438 1.6055c0 .59532-.59062.89453-1.7676.89453-1.1785 0-2.2182-.4989-3.1211-1.4941-.90498-.99645-1.3555-2.4517-1.3555-4.3711 0-1.9233.43964-3.3428 1.3203-4.2578.87885-.9141 2.0322-1.3711 3.4492-1.3711.59532 0 1.2107.095008 1.8516.29102.64121.19418 1.0686.37639 1.2871.54688.21667.17534.42435.25781.61914.25781.19388 0 .50715-.22698.94141-.68555.43487-.45735.82427-1.1501 1.168-2.0742.34218-.92899.51367-1.6414.51367-2.1465 0-.50111-.011023-.84501-.033203-1.0273-.48045-.52573-1.3668-.94394-2.6602-1.2539-1.2909-.30906-2.7387-.46289-4.3398-.46289zm21.049 0c-3.2367 0-5.8788 1.0413-7.9258 3.1211-2.0464 2.0826-3.0703 5.1404-3.0703 9.1797 0 4.0369 1.0128 7.1085 3.0352 9.2129 2.0251 2.1026 4.6444 3.1543 7.8574 3.1543 3.2145 0 5.8383-1.0111 7.875-3.0332 2.0367-2.0263 3.0527-5.1142 3.0527-9.2656 0-4.1484-.99433-7.2508-2.9863-9.2969-1.9884-2.05-4.6018-3.0723-7.8379-3.0723zm45.504 0c-3.2379 0-5.8792 1.0413-7.9277 3.1211-2.0461 2.0826-3.0684 5.1404-3.0684 9.1797 0 4.0369 1.0104 7.1085 3.0352 9.2129 2.0233 2.1026 4.6432 3.1543 7.8574 3.1543 3.213 0 5.8373-1.0111 7.873-3.0332 2.0364-2.0263 3.0547-5.1142 3.0547-9.2656 0-4.1484-.9939-7.2508-2.9844-9.2969-1.9908-2.05-4.6031-3.0723-7.8398-3.0723zm-30.105.30859c-.45888 0-.82988.16637-1.1152.49609-.28717.33489-.42969.78715-.42969 1.3594v20.584c0 1.053.58624 1.5781 1.752 1.5781h5.8652c7.1824-.000001 10.773-4.2092 10.773-12.627 0-3.9348-.94335-6.8151-2.832-8.6445-1.8853-1.83-4.6472-2.7461-8.2832-2.7461h-5.7305zm42.807 0c-.38928 0-.66468.52801-.82422 1.5801-.0687.50294-.10157 1.0191-.10157 1.543 0 .52694.03287 1.0409.10157 1.543.15954 1.0548.43494 1.5801.82422 1.5801h4.1152v17.225c0 .45462 1.1351.68555 3.3984.68555 2.2655 0 3.3965-.23093 3.3965-.68555v-17.225h4.0137c.38868 0 .66225-.52528.82422-1.5801.0672-.50202.10156-1.016.10156-1.543.00001-.52391-.03436-1.04-.10156-1.543-.16197-1.0521-.43554-1.5801-.82422-1.5801h-14.924zm-58.291 6.2793c1.0989 0 2.0193.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.35955 3.2363-1.0801 4.2188-.72053.98612-1.6597 1.4785-2.8145 1.4785-1.1554 0-2.0859-.48441-2.7949-1.459-.71019-.97154-1.0644-2.3663-1.0644-4.1875 0-1.8173.37148-3.2302 1.1133-4.2363.74574-1.0053 1.6663-1.5098 2.7637-1.5098zm45.504 0c1.0989 0 2.0181.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.3612 3.2363-1.082 4.2188-.71961.98612-1.6574 1.4785-2.8125 1.4785-1.1554 0-2.0888-.48441-2.7969-1.459-.70806-.97154-1.0625-2.3663-1.0625-4.1875 0-1.8173.37179-3.2302 1.1133-4.2363.74453-1.0053 1.666-1.5098 2.7637-1.5098zm-24.977.23828h.34375c1.4638 0 2.5334.33466 3.209.99805.6722.66157 1.0098 2.0859 1.0098 4.2715 0 2.1847-.32289 3.7447-.97656 4.6816-.65214.9378-1.6059 1.4082-2.8652 1.4082-.34218 0-.54909-.063339-.61719-.18945-.06873-.12672-.10352-.42897-.10352-.9082v-10.262z" fill="#fff"/><path d="m137.91 48.551v1.2109h.85938v-1.2109zm-52.396.58984c-.99736 0-1.7963.32424-2.3926.96484-.59745.64576-.89453 1.5712-.89453 2.7773v3.0742c0 1.2329.31639 2.1765.94727 2.832.6333.66066 1.467.98828 2.5039.98828.78586 0 1.4321-.16147 1.9414-.48633.50993-.32273.8592-.67938 1.0488-1.0684v-3.6875h-3.0059v.74805h2.1465v2.6934c-.13766.30115-.38143.55386-.73242.76172-.34978.2109-.8171.31445-1.3984.31445-.79619 0-1.4265-.2632-1.8945-.78711-.46799-.52786-.70312-1.2936-.70312-2.2988v-3.0918c0-.96941.21778-1.7078.65234-2.2168.43578-.51023 1.0297-.76367 1.7812-.76367.74271 0 1.3056.19019 1.6836.56641.38017.37925.58276.91542.61133 1.6113h.79492l.013672-.041016c-.024311-.90802-.30456-1.6179-.83789-2.127-.53484-.50719-1.2907-.76367-2.2656-.76367zm7.6133 2.6641c-.719 0-1.3111.22524-1.7715.67773-.46222.45371-.68069.96571-.6582 1.5449l.013672.041015.79688.007813c0-.42696.14768-.78487.44336-1.0781.2966-.29508.67455-.44141 1.1328-.44141.4926 0 .87459.15388 1.1523.45898.27198.30906.41016.73655.41016 1.2793v.94531h-1.3418c-.85666 0-1.5379.21084-2.0391.63477-.50142.42392-.75195.99502-.75195 1.707 0 .67372.17358 1.2075.51758 1.6035.34613.39445.83497.5918 1.4707.5918.45462 0 .86723-.12355 1.2383-.37305.37166-.24767.67317-.56424.90625-.94531 0 .17413.01089.34527.03125.51758.02097.16927.053163.38614.095703.65234h.88867c-.062302-.24767-.10234-.49621-.12695-.75391-.02401-.25436-.037109-.52051-.037109-.79492v-3.7676c0-.80622-.21809-1.4265-.65234-1.8613-.43669-.43061-1.0083-.64648-1.7188-.64648zm7.1152 0c-.45462 0-.85109.11505-1.1875.3457-.33519.23369-.60486.56357-.80664.99023l-.074219-1.1934h-.75195v7.6816h.85352v-5.5293c.11791-.47346.31244-.84655.58594-1.1191.27168-.27107.63379-.4082 1.082-.4082.4689 0 .83314.19466 1.0957.58789.26378.39323.39258 1.0508.39258 1.9707v4.498h.85351v-4.6211-.19922c.0623-.64455.23396-1.1785.51172-1.6055.27927-.42696.66855-.63672 1.166-.63672.47285 0 .83879.19223 1.0938.57422.25345.38138.38281 1.0443.38281 1.9863v4.502h.85742v-4.4863c0-1.1332-.18468-1.9728-.55664-2.5195-.37044-.54548-.89268-.81836-1.5664-.81836-.48897 0-.91182.1465-1.2598.43945-.34796.29234-.61537.69589-.80469 1.207-.148-.55369-.38151-.966-.69726-1.2383-.31543-.2732-.70589-.4082-1.1699-.4082zm10.316 0c-.74423-.000001-1.3797.32125-1.9082.96094-.52725.64273-.78906 1.4505-.78906 2.4199v1.2754c0 .96758.26259 1.762.7871 2.3828.52604.62206 1.2032.93359 2.0312.93359.5157 0 .95833-.090281 1.3242-.26562.36679-.17626.66658-.41287.89844-.70703l-.34961-.60547c-.21728.27441-.4784.4836-.7832.63281-.3048.14586-.66987.2207-1.0898.2207-.60443 0-1.0864-.24489-1.4414-.74023-.35433-.49412-.53321-1.1138-.53321-1.8574v-.63867h4.3965v-.84375c0-.96667-.22381-1.7371-.66992-2.3105-.44519-.57253-1.0684-.85742-1.873-.85742zm9.4727 0c-.74423-.000001-1.3782.32125-1.9082.96094-.52603.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26241 1.762.78906 2.3828.52512.62206 1.2028.93359 2.0312.93359.51601 0 .95639-.090281 1.3223-.26562.36741-.17626.66822-.41287.90039-.70703l-.34766-.60547c-.21972.27441-.4811.4836-.78711.63281-.30389.14586-.66639.2207-1.0879.2207-.60656 0-1.0883-.24489-1.4414-.74023-.35646-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3945v-.84375c0-.96667-.22338-1.7371-.66797-2.3105-.44398-.57253-1.0699-.85742-1.873-.85742zm6.8672 0c-.45614 0-.85274.12451-1.1894.36914-.33975.24342-.60962.5923-.81445 1.043l-.07031-1.2695h-.76172v7.6816h.85351v-5.4824c.14617-.47923.36569-.85918.66016-1.1445.29325-.28809.65767-.42969 1.0938-.42969.48622 0 .85922.17765 1.1133.5332.25557.35555.38477.96807.38477 1.8457v4.6777h.85937v-4.6855c0-1.0736-.18381-1.866-.55273-2.375-.36497-.50993-.89-.76367-1.5762-.76367zm6.2539 0c-.77674 0-1.386.32888-1.8242.98437-.44186.65883-.66211 1.5326-.66211 2.6211l.00196 1.0508c0 1.0031.21834 1.8072.65625 2.4102.43699.60413 1.0429.90625 1.8144.90625.41602 0 .78387-.091234 1.0996-.27539.31695-.18324.58484-.4491.80273-.79492v.92969c0 .75881-.14785 1.3303-.4414 1.7266-.29235.39111-.74301.58789-1.3535.58789-.30359 0-.59763-.04082-.88086-.125-.28565-.081443-.54279-.19619-.77344-.3457l-.23632.74805c.27047.15164.57916.27315.92773.36523.34795.092075.67388.13867.97656.13867.84208 0 1.494-.27297 1.9531-.81055.45857-.53971.68554-1.3009.68554-2.2852v-7.6895h-.72265l-.08399 1.0684c-.21485-.38533-.48269-.68758-.80664-.89453-.32334-.2109-.70159-.31641-1.1328-.31641zm10.467 0c-.45401 0-.85062.12451-1.1895.36914-.33914.24342-.60902.5923-.81445 1.043l-.07031-1.2695h-.75977v7.6816h.85352v-5.4824c.14556-.47923.3663-.85918.66016-1.1445.29295-.28809.65797-.42969 1.0937-.42969.48775 0 .85711.17765 1.1133.5332.25496.35555.38476.96807.38476 1.8457v4.6777h.85742v-4.6855c0-1.0736-.18081-1.866-.54882-2.375-.36588-.50993-.8939-.76367-1.5801-.76367zm6.4043 0c-.74271-.000001-1.3778.32125-1.9062.96094-.52724.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26334 1.762.78906 2.3828.52361.62206 1.2007.93359 2.0312.93359.5154 0 .9567-.090281 1.3223-.26562.3668-.17626.6667-.41287.90039-.70703l-.34961-.60547c-.2194.27441-.47958.4836-.78711.63281-.30359.14586-.66597.2207-1.0859.2207-.60717 0-1.089-.24489-1.4434-.74023-.35464-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3965v-.84375c0-.96667-.22369-1.7371-.66797-2.3105-.44551-.57253-1.0709-.85742-1.875-.85742zm-12.113.14258v7.6816h.85938v-7.6816zm-27.352.60938c.53029 0 .9445.20789 1.2441.62695.29781.41876.44531.94616.44531 1.5801v.33008h-3.543c.01429-.71688.19281-1.3186.53711-1.8066.34401-.48622.78217-.73047 1.3164-.73047zm9.4727 0c.52998 0 .94406.20789 1.2422.62695.29963.41876.44727.94616.44727 1.5801v.33008h-3.543c.0155-.71688.19298-1.3186.53516-1.8066.3437-.48622.7826-.73047 1.3184-.73047zm29.992 0c.53089 0 .94602.20789 1.2441.62695.29902.41876.44532.94616.44532 1.5801v.33008h-3.543c.01519-.71688.19402-1.3186.53711-1.8066.34218-.48622.78064-.73047 1.3164-.73047zm-16.686.015625c.42119 0 .77033.1246 1.0469.375.27684.25466.4967.58706.65625.99609v3.8047c-.16593.39718-.39.70872-.67383.93359-.28475.22488-.63089.33594-1.043.33594-.6014 0-1.0536-.22975-1.3496-.69531-.29964-.4613-.44727-1.0819-.44727-1.8613v-1.0508c0-.84177.15149-1.527.45508-2.0527.30146-.52482.75528-.78516 1.3555-.78516zm-40.057 3.3281h1.3652v1.6621c-.15286.42089-.40964.76752-.77734 1.041-.3671.27228-.78783.40625-1.2598.40625-.39262 0-.69782-.12824-.91602-.38867-.2185-.25952-.32617-.59591-.32617-1.0059 0-.48531.17262-.89402.52148-1.2207.34795-.32881.81215-.49414 1.3926-.49414z" fill="#e0e0e0"/><path d="m27 3c-3.0948.68801-6.1571 1.6452-9.0273 3.0898.06564 2.5344.23035 4.963.5625 7.4297-1.1147.71414-2.287 1.3281-3.3281 2.1641-1.0578.81382-2.1378 1.5912-3.0957 2.543-1.9136-1.2657-3.9389-2.454-6.0254-3.5039-2.2491 2.4205-4.3524 5.0317-6.0703 7.9551 1.2924 2.0908 2.6428 4.0523 4.0996 5.9121h.041016v14.438 1.834 1.6699c.03282.000304.06514.000806.097656.003906l11 1.0605c.57617.05561 1.0282.52027 1.0684 1.0977l.33789 4.8555 9.5957.68359.66016-4.4805c.0857-.58104.58415-1.0117 1.1719-1.0117h11.605c.58742 0 1.0862.43068 1.1719 1.0117l.66016 4.4805 9.5957-.68359.33789-4.8555c.04042-.57739.49219-1.0417 1.0684-1.0977l10.996-1.0605c.032519-.003.064836-.003606.097656-.003906v-1.4316l.003906-.001953v-16.508h.041016c1.4571-1.8598 2.8066-3.8214 4.0996-5.9121-1.7173-2.9234-3.8232-5.5346-6.0723-7.9551-2.0859 1.0499-4.1118 2.2382-6.0254 3.5039-.95756-.95178-2.0363-1.7292-3.0957-2.543-1.0408-.836-2.2136-1.4499-3.3262-2.1641.33124-2.4667.49656-4.8952.5625-7.4297-2.8706-1.4447-5.933-2.4018-9.0293-3.0898-1.2362 2.0777-2.367 4.3278-3.3516 6.5273-1.1675-.1951-2.3391-.26727-3.5137-.28125v-.0019532c-.0082 0-.016447.0019531-.023437.0019532-.0073 0-.014194-.0019532-.021484-.0019532v.0019532c-1.1767.013979-2.3497.086153-3.5176.28125-.98399-2.1996-2.1135-4.4497-3.3516-6.5273zm-22.863 45.904c.0045599 1.063.019531 2.2271.019531 2.459 0 10.446 13.251 15.468 29.715 15.525h.019531.019531c16.464-.05774 29.711-5.0795 29.711-15.525 0-.23612.014661-1.3954.019531-2.459l-9.8867.95312-.3418 4.8809c-.04102.58833-.50933 1.0574-1.0977 1.0996l-11.717.83594c-.02857.0021-.055724.003906-.083984.003906-.58225 0-1.0859-.42704-1.1719-1.0117l-.67188-4.5566h-9.5586l-.67188 4.5566c-.09025.61325-.63836 1.0531-1.2559 1.0078l-11.717-.83594c-.58833-.04224-1.0566-.51128-1.0977-1.0996l-.3418-4.8809-9.8906-.95312z" fill="#478cbf"/><path d="m18.299 29.246c-3.6594 0-6.6289 2.9669-6.6289 6.627 0 3.6625 2.9695 6.6289 6.6289 6.6289 3.6613 0 6.627-2.9664 6.627-6.6289 0-3.66-2.9657-6.627-6.627-6.627zm31.186 0c-3.6619 0-6.6289 2.9669-6.6289 6.627 0 3.6625 2.967 6.6289 6.6289 6.6289 3.6591 0 6.627-2.9664 6.627-6.6289 0-3.66-2.9678-6.627-6.627-6.627zm-15.594 3.8789c-1.1785 0-2.1348.86781-2.1348 1.9375v6.1035c0 1.0706.95628 1.9395 2.1348 1.9395s2.1348-.86885 2.1348-1.9395v-6.1035c0-1.0697-.95628-1.9375-2.1348-1.9375z" fill="#f6f6f6"/><path d="m18.932 31.865c-2.4299 0-4.4004 1.9711-4.4004 4.4004s1.9705 4.3984 4.4004 4.3984c2.4311 0 4.4004-1.9691 4.4004-4.3984s-1.9693-4.4004-4.4004-4.4004zm29.916 0c-2.4293 0-4.3984 1.9711-4.3984 4.4004s1.9691 4.3984 4.3984 4.3984c2.4317 0 4.4004-1.9691 4.4004-4.3984s-1.9687-4.4004-4.4004-4.4004z" fill="#414042"/></svg>
diff --git a/editor/icons/Loop.svg b/editor/icons/Loop.svg
new file mode 100644
index 0000000000..7fd8561bc4
--- /dev/null
+++ b/editor/icons/Loop.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1v2h-2a5 5 0 0 0 -5 5 5 5 0 0 0 1.0039 2.9961l1.4355-1.4355a3 3 0 0 1 -.43945-1.5605 3 3 0 0 1 3-3h2v2l2-1.5 2-1.5-2-1.5-2-1.5zm5.9961 4.0039-1.4355 1.4355a3 3 0 0 1 .43945 1.5605 3 3 0 0 1 -3 3h-2v-2l-2 1.5-2 1.5 2 1.5 2 1.5v-2h2a5 5 0 0 0 5-5 5 5 0 0 0 -1.0039-2.9961z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/LoopInterpolation.svg b/editor/icons/LoopInterpolation.svg
new file mode 100644
index 0000000000..5e3f919043
--- /dev/null
+++ b/editor/icons/LoopInterpolation.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1v2h-2a2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.0019531v.046875 5.2246a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-3.2695-2h2v2l4-3-4-3zm7 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v3.2695 2h-2v-2l-4 3 4 3v-2h2a2 2 0 0 0 1.7324-1 2 2 0 0 0 .26562-1h.001953v-5.2715a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/MainPlay.svg b/editor/icons/MainPlay.svg
new file mode 100644
index 0000000000..5a1d195530
--- /dev/null
+++ b/editor/icons/MainPlay.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1048.4v-8l7 4z" fill="#e0e0e0" fill-rule="evenodd" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/MarginContainer.svg b/editor/icons/MarginContainer.svg
new file mode 100644
index 0000000000..82e72c0da9
--- /dev/null
+++ b/editor/icons/MarginContainer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5efac" 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 2h10v10h-10z" transform="translate(0 1036.4)"/><path d="m4 1042.4v4l2-2z"/></g></svg>
diff --git a/editor/icons/MatchCase.svg b/editor/icons/MatchCase.svg
new file mode 100644
index 0000000000..0787b0aa56
--- /dev/null
+++ b/editor/icons/MatchCase.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1c-2.2091-.00000066-4.069 1.7919-4 4v10h2v-4h4v4h2v-10c0-2.2091-1.7909-4-4-4zm5 11c0 1.6569 1.3431 3 3 3 .3409-.0014.67908-.0608 1-.17578v.17578h2v-6c0-1.6569-1.3431-3-3-3h-1v2h1c.55228 0 1 .44772 1 1v.17383c-.32104-.11432-.65921-.1731-1-.17383-1.6569 0-3 1.3431-3 3zm-5-9c1.1046-.0000001 1.914.89879 2 2v4h-4v-4c0-1.1046.89543-2 2-2zm8 8c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MaterialPreviewCube.svg b/editor/icons/MaterialPreviewCube.svg
new file mode 100644
index 0000000000..29baa9f030
--- /dev/null
+++ b/editor/icons/MaterialPreviewCube.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3v-8z" fill="#d5d5d5" transform="translate(0 1036.4)"/><path d="m1 1040.4 7 3 7-3-7-3z" fill="#fff"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#e0e0e0"/><path d="m8 1051.4 7-3v-8l-7 3z" fill="#d5d5d5"/></g></svg>
diff --git a/editor/icons/MaterialPreviewCubeOff.svg b/editor/icons/MaterialPreviewCubeOff.svg
new file mode 100644
index 0000000000..14564c558e
--- /dev/null
+++ b/editor/icons/MaterialPreviewCubeOff.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3v-8z" fill="#d5d5d5" transform="translate(0 1036.4)"/><path d="m1 1040.4 7 3 7-3-7-3z" fill="#fff"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#e0e0e0"/><path d="m8 1051.4 7-3v-8l-7 3z" fill="#d5d5d5"/><path d="m8 1037.4-7 3v8l7 3 7-3v-8z" fill-opacity=".23529"/></g></svg>
diff --git a/editor/icons/MaterialPreviewLight1.svg b/editor/icons/MaterialPreviewLight1.svg
new file mode 100644
index 0000000000..8e6954b6ab
--- /dev/null
+++ b/editor/icons/MaterialPreviewLight1.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v1 5h-1v-5h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MaterialPreviewLight1Off.svg b/editor/icons/MaterialPreviewLight1Off.svg
new file mode 100644
index 0000000000..2f84612e82
--- /dev/null
+++ b/editor/icons/MaterialPreviewLight1Off.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v1 5h-1v-5h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill-opacity=".23529"/></svg>
diff --git a/editor/icons/MaterialPreviewLight2.svg b/editor/icons/MaterialPreviewLight2.svg
new file mode 100644
index 0000000000..cbc5204b3a
--- /dev/null
+++ b/editor/icons/MaterialPreviewLight2.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v2 1h-2v1h2v1h-2-1v-2-1h2v-1h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MaterialPreviewLight2Off.svg b/editor/icons/MaterialPreviewLight2Off.svg
new file mode 100644
index 0000000000..d6ec546e3f
--- /dev/null
+++ b/editor/icons/MaterialPreviewLight2Off.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v2 1h-2v1h2v1h-2-1v-2-1h2v-1h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill="#e0e0e0"/><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v2 1h-2v1h2v1h-2-1v-2-1h2v-1h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill-opacity=".23529"/></svg>
diff --git a/editor/icons/MaterialPreviewSphere.svg b/editor/icons/MaterialPreviewSphere.svg
new file mode 100644
index 0000000000..22c9eef0fb
--- /dev/null
+++ b/editor/icons/MaterialPreviewSphere.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-2 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MaterialPreviewSphereOff.svg b/editor/icons/MaterialPreviewSphereOff.svg
new file mode 100644
index 0000000000..52bb095210
--- /dev/null
+++ b/editor/icons/MaterialPreviewSphereOff.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-2 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill-opacity=".23529"/></svg>
diff --git a/editor/icons/MemberConstant.svg b/editor/icons/MemberConstant.svg
new file mode 100644
index 0000000000..72a6a8363d
--- /dev/null
+++ b/editor/icons/MemberConstant.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.135 3.002c-1.5244-.04132-2.9843.61528-3.9648 1.7832-1.5607 1.8591-1.5607 4.5706 0 6.4297 1.5599 1.8584 4.229 2.3286 6.3301 1.1152l-1.0039-1.7363c-.45449.26416-.97042.40425-1.4961.40625-1.6569 0-3-1.3431-3-3-.0000001-1.6569 1.3431-3 3-3 .5255.0014061 1.0414.14082 1.4961.4043l1.0039-1.7344c-.72056-.41598-1.5335-.64557-2.3652-.66797zm-7.1348 7.998c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MemberMethod.svg b/editor/icons/MemberMethod.svg
new file mode 100644
index 0000000000..073525a5aa
--- /dev/null
+++ b/editor/icons/MemberMethod.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6.0215 3c-.40133-.0028518-.79916.074854-1.1699.22852-1.1208.46444-1.8516 1.5582-1.8516 2.7715v7h2v-3h2v-2h-2v-2c0-.55228.44772-1 1-1 .2652.0000401.51953.10542.70703.29297l1.4141-1.4141c-.55724-.5574-1.3115-.87312-2.0996-.87891zm2.9785 3c-1.3263 2.6586-1.3404 4.3252 0 7h2c-1.3404-2.6748-1.3263-4.3414 0-7zm4 0c1.3263 2.6586 1.3404 4.3252 0 7h2c1.3404-2.6748 1.3263-4.3414 0-7zm-12 5a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MemberProperty.svg b/editor/icons/MemberProperty.svg
new file mode 100644
index 0000000000..475de2be0b
--- /dev/null
+++ b/editor/icons/MemberProperty.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 4v9h2v-3h1c1.6569 0 3-1.3431 3-3s-1.3431-3-3-3zm2 2h1c.55228 0 1 .44772 1 1s-.44798.98275-1 1h-1zm-5 5c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MemberSignal.svg b/editor/icons/MemberSignal.svg
new file mode 100644
index 0000000000..07ff88f7c9
--- /dev/null
+++ b/editor/icons/MemberSignal.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c4.4301 0 8 3.5699 8 8a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-5.511-4.489-10-10-10zm0 4a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c2.221 0 4 1.779 4 4a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-3.3018-2.6981-6-6-6zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-5 2c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MemberTheme.svg b/editor/icons/MemberTheme.svg
new file mode 100644
index 0000000000..ad770afafa
--- /dev/null
+++ b/editor/icons/MemberTheme.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke-width="0"><path d="m3 11c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z"/><path d="m10 2c-2.4 4-4 4.7909-4 7s1.8297 4 4 4 4-1.7909 4-4-1.6-3-4-7z"/></g></svg>
diff --git a/editor/icons/MenuButton.svg b/editor/icons/MenuButton.svg
new file mode 100644
index 0000000000..ca129baced
--- /dev/null
+++ b/editor/icons/MenuButton.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h14v-4zm5 1h4l-2 2zm-4 4a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1zm1 2h10v2h-10zm0 3h10v2h-10z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Mesh.svg b/editor/icons/Mesh.svg
new file mode 100644
index 0000000000..c02d5d0613
--- /dev/null
+++ b/editor/icons/Mesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -1.0312-1.75h.03125v-6.5215a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm2.4141 3h5.8574a2 2 0 0 0 .72852.73047v5.8555l-6.5859-6.5859zm-1.4141 1.4141 6.5859 6.5859h-5.8574a2 2 0 0 0 -.72852-.73047v-5.8555z" fill="#ffd684"/></svg>
diff --git a/editor/icons/MeshInstance2D.svg b/editor/icons/MeshInstance2D.svg
new file mode 100644
index 0000000000..b8df0768d2
--- /dev/null
+++ b/editor/icons/MeshInstance2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -1.0312-1.75h.03125v-6.5215a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm2.4141 3h5.8574a2 2 0 0 0 .72852.73047v5.8555l-6.5859-6.5859zm-1.4141 1.4141 6.5859 6.5859h-5.8574a2 2 0 0 0 -.72852-.73047v-5.8555z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/MeshInstance3D.svg b/editor/icons/MeshInstance3D.svg
new file mode 100644
index 0000000000..aa0cf7740b
--- /dev/null
+++ b/editor/icons/MeshInstance3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -1.0312-1.75h.03125v-6.5215a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm2.4141 3h5.8574a2 2 0 0 0 .72852.73047v5.8555l-6.5859-6.5859zm-1.4141 1.4141 6.5859 6.5859h-5.8574a2 2 0 0 0 -.72852-.73047v-5.8555z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/MeshLibrary.svg b/editor/icons/MeshLibrary.svg
new file mode 100644
index 0000000000..6e824af177
--- /dev/null
+++ b/editor/icons/MeshLibrary.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h2.2695v-2h-2.2715a2 2 0 0 0 -.72852-.73047v-5.8555l3 3v-.41406a2.0002 2.0002 0 0 1 .80859-1.6055l-2.3945-2.3945h5.8574a2 2 0 0 0 .72852.73047v1.2695a2.0002 2.0002 0 0 1 .99805.27148 2.0002 2.0002 0 0 1 1.002-.27148v-1.2715a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm6 7v1 5 1h5c.55228 0 1-.4477 1-1v-5c0-.5523-.44772-1-1-1v4l-1-1-1 1v-4z" fill="#ffd684"/></svg>
diff --git a/editor/icons/MeshTexture.svg b/editor/icons/MeshTexture.svg
new file mode 100644
index 0000000000..988882c960
--- /dev/null
+++ b/editor/icons/MeshTexture.svg
@@ -0,0 +1 @@
+<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 2 .0005649.71397.38169 1.3735 1 1.7305v6.541c-.61771.35663-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.000565 1.3735-.38169 1.7305-1h6.541c.35663.61771 1.0152.99874 1.7285 1 1.1046 0 2-.89543 2-2 .000101-.72747-.39481-1.3976-1.0312-1.75h.03125v-6.5215c.61771-.35663.99874-1.0152 1-1.7285 0-1.1046-.89543-2-2-2-.71397.0005648-1.3735.38169-1.7305 1h-6.541c-.35663-.61771-1.0152-.99874-1.7285-1zm1.7266 3h.6875 5.168.68945c.17478.30301.42598.55488.72852.73047v.68359 5.1719.68555c-.30301.17478-.55488.42598-.73047.72852h-.68359-5.1719-.68555c-.17478-.30301-.42598-.55488-.72852-.73047v-.6875l-.0039062.003907v-5.8574c.30302-.17478.55488-.42598.73047-.72852zm4.0859 2.25v.70117h-.8125v.69922h-1.625v.69922h-.8125v.69922h-.8125v.70117h1.625 1.625 1.625 1.625v-1.4004h-.8125v-1.3984h-.8125v-.70117h-.8125z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/MiniObject.svg b/editor/icons/MiniObject.svg
new file mode 100644
index 0000000000..b4a336923d
--- /dev/null
+++ b/editor/icons/MiniObject.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2v8h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2zm0 5a3 3 0 0 0 -3-3 3 3 0 0 0 -3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3zm7-3v5a1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 3-3v-5zm-10 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm5 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#79f3e8"/></svg>
diff --git a/editor/icons/MirrorX.svg b/editor/icons/MirrorX.svg
new file mode 100644
index 0000000000..fa668986ac
--- /dev/null
+++ b/editor/icons/MirrorX.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.4)"><path d="m4 1042.4-2 2 2 2" stroke-linecap="round" stroke-linejoin="round"/><path d="m2 1044.4h11"/><path d="m12 1042.4 2 2-2 2" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
diff --git a/editor/icons/MirrorY.svg b/editor/icons/MirrorY.svg
new file mode 100644
index 0000000000..bb4e4d3543
--- /dev/null
+++ b/editor/icons/MirrorY.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11.012 1048.4a1.0001 1.0001 0 0 0 -1.7168-.6973l-.29297.293v-7.1719l.29297.293a1.0001 1.0001 0 0 0 1.7148-.7266 1.0001 1.0001 0 0 0 -.30078-.6875l-2-2a1.0001 1.0001 0 0 0 -1.4141 0l-2 2a1.0001 1.0001 0 1 0 1.4141 1.4141l.29297-.293v7.1719l-.29297-.293a1.0001 1.0001 0 1 0 -1.4141 1.4141l2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .30273-.7168z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Mouse.svg b/editor/icons/Mouse.svg
new file mode 100644
index 0000000000..217512085e
--- /dev/null
+++ b/editor/icons/Mouse.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1.1016a5 5 0 0 0 -4 4.8984h4zm2 .0039063v4.8945h4a5 5 0 0 0 -4-4.8945zm-6 6.8945v2a5 5 0 0 0 5 5 5 5 0 0 0 5-5v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MoveDown.svg b/editor/icons/MoveDown.svg
new file mode 100644
index 0000000000..3c2d771cd5
--- /dev/null
+++ b/editor/icons/MoveDown.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a1.0001 1.0001 0 1 0 0 2h4a1.0001 1.0001 0 1 0 0-2zm2 4c-.55231 0-1 .4477-1 1v5.1484l-2.2188-2.7734c-.34504-.4317-.97482-.50165-1.4062-.15625-.4305.3449-.5004.9732-.15625 1.4043l4 5c.18868.2369.4745.37695.77734.37695.30559.0009.59477-.13795.78516-.37695l4-5c.34415-.4311.27424-1.0594-.15625-1.4043-.43143-.3454-1.0612-.27545-1.4062.15625l-2.2188 2.7734v-5.1484c0-.5523-.44769-1-1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/MoveLeft.svg b/editor/icons/MoveLeft.svg
new file mode 100644
index 0000000000..8f96ee0060
--- /dev/null
+++ b/editor/icons/MoveLeft.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 10a1.0001 1.0001 0 1 1 -2 0v-4a1.0001 1.0001 0 1 1 2 0zm-4-2c0 .55231-.4477 1-1 1h-5.1484l2.7734 2.2188c.4317.34504.50165.97482.15625 1.4062-.3449.4305-.9732.5004-1.4043.15625l-5-4c-.2369-.18868-.37695-.4745-.37695-.77734-.0009-.30559.13795-.59477.37695-.78516l5-4c.4311-.34415 1.0594-.27424 1.4043.15625.3454.43143.27545 1.0612-.15625 1.4062l-2.7734 2.2188h5.1484c.5523 0 1 .44769 1 1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/MovePoint.svg b/editor/icons/MovePoint.svg
new file mode 100644
index 0000000000..03b15e47b5
--- /dev/null
+++ b/editor/icons/MovePoint.svg
@@ -0,0 +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="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 1.2129-.10742l-2.5996-6.3203a1.5002 1.5002 0 0 1 1.3711-2.0703v-.0019531a1.5002 1.5002 0 0 1 .58594.11133l6.3184 2.5996a7 7 0 0 0 .11133-1.2109 7 7 0 0 0 -7-7zm2.7559 9.7559.52344 1.2734a1.5002 1.5002 0 0 1 .48047-.26953 1.5002 1.5002 0 0 1 .26953-.47852l-1.2734-.52539z" fill="#fff" transform="translate(0 1036.4)"/><path d="m8 3a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 .42578-.021484l-1.8125-4.4063a1.5002 1.5002 0 0 1 1.3711-2.0703v-.0019531a1.5002 1.5002 0 0 1 .58594.11133l4.4082 1.8125a5 5 0 0 0 .021484-.42383 5 5 0 0 0 -5-5zm2.7559 7.7559.44336 1.0801a5 5 0 0 0 .63867-.63281l-1.082-.44727z" fill="#ff8484" transform="translate(0 1036.4)"/><path d="m16 1047.7-8-3.291 3.291 8 .9471-2.8201 1.8836 1.8835.9418-.9418-1.8836-1.8835z" fill="#e0e0e0"/></g></svg>
diff --git a/editor/icons/MoveRight.svg b/editor/icons/MoveRight.svg
new file mode 100644
index 0000000000..ee8d1b45a4
--- /dev/null
+++ b/editor/icons/MoveRight.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 10a1.0001 1.0001 0 1 0 2 0v-4a1.0001 1.0001 0 1 0 -2 0zm4-2c0 .55231.4477 1 1 1h5.1484l-2.7734 2.2188c-.4317.34504-.50165.97482-.15625 1.4062.3449.4305.9732.5004 1.4043.15625l5-4c.2369-.18868.37695-.4745.37695-.77734.0009-.30559-.13795-.59477-.37695-.78516l-5-4c-.4311-.34415-1.0594-.27424-1.4043.15625-.3454.43143-.27545 1.0612.15625 1.4062l2.7734 2.2188h-5.1484c-.5523 0-1 .44769-1 1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/MoveUp.svg b/editor/icons/MoveUp.svg
new file mode 100644
index 0000000000..f1302b2984
--- /dev/null
+++ b/editor/icons/MoveUp.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 15a1.0001 1.0001 0 1 1 0-2h4a1.0001 1.0001 0 1 1 0 2zm2-4c-.55231 0-1-.4477-1-1v-5.1484l-2.2188 2.7734c-.34504.4317-.97482.50165-1.4062.15625-.4305-.3449-.5004-.9732-.15625-1.4043l4-5c.18868-.2369.4745-.37695.77734-.37695.30559-.0009.59477.13795.78516.37695l4 5c.34415.4311.27424 1.0594-.15625 1.4043-.43143.3454-1.0612.27545-1.4062-.15625l-2.2188-2.7734v5.1484c0 .5523-.44769 1-1 1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/MultiEdit.svg b/editor/icons/MultiEdit.svg
new file mode 100644
index 0000000000..d1409e16ca
--- /dev/null
+++ b/editor/icons/MultiEdit.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1zm8 1v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MultiLine.svg b/editor/icons/MultiLine.svg
new file mode 100644
index 0000000000..634086fd51
--- /dev/null
+++ b/editor/icons/MultiLine.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h7v-2zm9 0v2h5v-2zm-9 4v2h11v-2zm0 4v2h4v-2zm6 0v2h8v-2zm-6 4v2h13v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/MultiMesh.svg b/editor/icons/MultiMesh.svg
new file mode 100644
index 0000000000..6ee638db4c
--- /dev/null
+++ b/editor/icons/MultiMesh.svg
@@ -0,0 +1 @@
+<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 2 .0005649.71397.38169 1.3735 1 1.7305v6.541c-.61771.35663-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.000565 1.3735-.38169 1.7305-1h1.2695v-2h-1.2715c-.17478-.30301-.42598-.55488-.72852-.73047v-5.8555l3.5859 3.5859h1.4141v-1.4141l-3.5859-3.5859h5.8574c.17532.30158.42647.55205.72852.72656v1.2734h2v-1.2695c.61831-.35698.99944-1.0165 1-1.7305 0-1.1046-.89543-2-2-2-.71397.0005648-1.3735.38169-1.7305 1h-6.541c-.35663-.61771-1.0152-.99874-1.7285-1zm8 7v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#ffd684"/></svg>
diff --git a/editor/icons/MultiMeshInstance2D.svg b/editor/icons/MultiMeshInstance2D.svg
new file mode 100644
index 0000000000..07c72aeed1
--- /dev/null
+++ b/editor/icons/MultiMeshInstance2D.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m-1-1h582v402h-582z" fill="none"/><path d="m3 1c-1.1046 0-2 .89543-2 2 .00056.71397.38169 1.3735 1 1.7305v6.541c-.61771.35664-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.00056 1.3735-.38169 1.7305-1h1.2695v-2h-1.2715c-.17478-.30301-.42598-.55488-.72852-.73047v-5.8555l3.5859 3.5859h1.4141v-1.4141l-3.5859-3.5859h5.8574c.17532.30158.42647.55205.72852.72656v1.2734h2v-1.2695c.61831-.35698.99944-1.0165 1-1.7305 0-1.1046-.89543-2-2-2-.71397.00056-1.3735.38169-1.7305 1h-6.541c-.35664-.61771-1.0152-.99874-1.7285-1zm8 7v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#a5b7f3" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/editor/icons/MultiMeshInstance3D.svg b/editor/icons/MultiMeshInstance3D.svg
new file mode 100644
index 0000000000..61d728c4be
--- /dev/null
+++ b/editor/icons/MultiMeshInstance3D.svg
@@ -0,0 +1 @@
+<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 2 .0005649.71397.38169 1.3735 1 1.7305v6.541c-.61771.35663-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.000565 1.3735-.38169 1.7305-1h1.2695v-2h-1.2715c-.17478-.30301-.42598-.55488-.72852-.73047v-5.8555l3.5859 3.5859h1.4141v-1.4141l-3.5859-3.5859h5.8574c.17532.30158.42647.55205.72852.72656v1.2734h2v-1.2695c.61831-.35698.99944-1.0165 1-1.7305 0-1.1046-.89543-2-2-2-.71397.0005648-1.3735.38169-1.7305 1h-6.541c-.35663-.61771-1.0152-.99874-1.7285-1zm8 7v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Navigation2D.svg b/editor/icons/Navigation2D.svg
new file mode 100644
index 0000000000..6725400e92
--- /dev/null
+++ b/editor/icons/Navigation2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1050.4 5-2 5 2-5-12z" fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Navigation3D.svg b/editor/icons/Navigation3D.svg
new file mode 100644
index 0000000000..74c8e204a3
--- /dev/null
+++ b/editor/icons/Navigation3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1050.4 5-2 5 2-5-12z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/NavigationAgent2D.svg b/editor/icons/NavigationAgent2D.svg
new file mode 100644
index 0000000000..28760be4a1
--- /dev/null
+++ b/editor/icons/NavigationAgent2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.2333332 4.2333335" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.9999997.0000126-5 2-5 5s3.0000003 6 5 9c2-3 5.007143-6.0296693 5-9 0-3-2-4.9999874-5-5zm0 2.5a2.4999999 2.4999999 0 0 1 2.5 2.5 2.4999999 2.4999999 0 0 1 -2.5 2.5 2.4999999 2.4999999 0 0 1 -2.5-2.5 2.4999999 2.4999999 0 0 1 2.5-2.5z" fill="#e0e0e0" transform="scale(.26458333)"/></svg>
diff --git a/editor/icons/NavigationAgent3D.svg b/editor/icons/NavigationAgent3D.svg
new file mode 100644
index 0000000000..da76adaa99
--- /dev/null
+++ b/editor/icons/NavigationAgent3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.2333332 4.2333335" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="scale(.26458333)"><path d="m9 1c-1.3712923 0-2.308408.4294811-2.9394531 1.0742188-.6678822.6627728-1.3395938 1.3233299-2.0097657 1.984375-.0455468 1.7412784.7567781 4.3277129 2.3652344 4.84375.1781835.3171398.3844475.6487461.5839844.9765624v5.1210938l2-2c2-3 4-5.9999874 4-8s-1-4-4-4z" fill="#fff" fill-opacity=".392157"/><path d="m7 3c-3 0-4 1.9999874-4 4s2.0000003 5 4 8c2.0000001-3 4-5.9999874 4-8s-1-4-4-4zm0 2a1.9999999 1.9999999 0 0 1 2 2 1.9999999 1.9999999 0 0 1 -2 2 1.9999999 1.9999999 0 0 1 -2-2 1.9999999 1.9999999 0 0 1 2-2z" fill="#e0e0e0"/></g></svg>
diff --git a/editor/icons/NavigationMesh.svg b/editor/icons/NavigationMesh.svg
new file mode 100644
index 0000000000..45bc51ac31
--- /dev/null
+++ b/editor/icons/NavigationMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h2.5078l.75-2h-3.2598a2 2 0 0 0 -.72852-.73047v-5.8555l4.6973 4.6973.77148-2.0566-4.0547-4.0547h5.8574a2 2 0 0 0 .72852.73047v.27148a2.0002 2.0002 0 0 1 .023438 0 2.0002 2.0002 0 0 1 1.8496 1.2969l.12695.33789v-1.9082a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm9 6-3 8 3-2 3 2z" fill="#ffd684"/></svg>
diff --git a/editor/icons/NavigationObstacle2D.svg b/editor/icons/NavigationObstacle2D.svg
new file mode 100644
index 0000000000..fab41e2f43
--- /dev/null
+++ b/editor/icons/NavigationObstacle2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.2333332 4.2333335" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 .875c-.625 0-1.2499999.3749906-1.5 1.125l-2.9999999 10h8.9999999l-3-10c-.2499999-.7500094-.875-1.125-1.5-1.125zm-1.5 4.125h3l1 4h-5zm-4.5 8c-1 0-1 2 0 2h12c1 0 1-2 0-2z" fill="#e0e0e0" transform="scale(.26458333)"/></svg>
diff --git a/editor/icons/NavigationObstacle3D.svg b/editor/icons/NavigationObstacle3D.svg
new file mode 100644
index 0000000000..10b09107cd
--- /dev/null
+++ b/editor/icons/NavigationObstacle3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.2333332 4.2333335" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="scale(.26458333)"><path d="m4.6074219 8.3789062c-1.7979243.927604-3.60742192 2.0716858-3.6074219 2.6210938 0 .999987 6.0000005 4 7 4 1.0000006 0 7-3.000013 7-4 0-.549408-1.809498-1.6934898-3.607422-2.6210938l.607422 1.6210938c2 4.000025-9.9999999 4.000025-8 0z" fill="#fff" fill-opacity=".392157"/><path d="m8 .875c-.375 0-.7499997.3749906-1 1.125l-3 8c-1.9999998 4.000025 10 4.000025 8 0l-3-8c-.2499997-.7500094-.625-1.125-1-1.125zm-1.5 4.125c.9999999.4999937 2.0000001.4999937 3 0l1 3.5c-1.4999996.9999874-3.4999996.9999874-5 0z" fill="#e0e0e0"/></g></svg>
diff --git a/editor/icons/NavigationPolygon.svg b/editor/icons/NavigationPolygon.svg
new file mode 100644
index 0000000000..d0fc822f42
--- /dev/null
+++ b/editor/icons/NavigationPolygon.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h4.9023a2.1002 2.1002 0 0 1 .13086-.73633l.47461-1.2637h-4.5078v-10h8.5859l-4.293 4.293a1.0001 1.0001 0 0 0 0 1.4141l1.3262 1.3262 1.4141-3.7695a2.1002 2.1002 0 0 1 1.9922-1.3613 2.1002 2.1002 0 0 1 .43555.050781l2.2461-2.2461a1.0001 1.0001 0 0 0 -.70703-1.707h-12z" transform="translate(0 1036.4)"/><path d="m15 1051.4-3-8-3 8 3-2z"/></g></svg>
diff --git a/editor/icons/NavigationRegion2D.svg b/editor/icons/NavigationRegion2D.svg
new file mode 100644
index 0000000000..3ec0938417
--- /dev/null
+++ b/editor/icons/NavigationRegion2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.1339223.0000569-.2535666.0306675-.3652344.0742188-.022275.0088111-.0410424.0209185-.0625.03125-.0889622.0424668-.1681009.0954994-.2382812.1601562-.0215322.0195204-.0427394.0372854-.0625.0585938-.0741112.0810923-.13722.1698052-.1816406.2695312-.0034324.0076504-.0084746.0137334-.0117188.0214844l-.0019531.0019531c-.0452252.1091882-.0629923.2268973-.0683594.3457031-.0005086.0130821-.0078112.023903-.0078125.0371094v12c.0000552.552262.4477381.999945 1 1h4.8847656a2.1184381 2.1184381 0 0 1 .1328125-.744141l2.9999999-7.9999996a2.1184381 2.1184381 0 0 1 2.007813-1.3730469 2.1184381 2.1184381 0 0 1 1.957031 1.3730469l1.017578 2.7128906v-6.96875c-.000001-.0132064-.007305-.0240273-.007812-.0371094-.005369-.1188058-.023135-.2365149-.06836-.3457031l-.001953-.0019531c-.003155-.0075626-.008384-.0139987-.011719-.0214844-.044421-.099726-.107529-.188439-.18164-.2695312-.019761-.0213083-.040968-.0390734-.0625-.0585938-.070181-.0646568-.149319-.1176895-.238282-.1601562-.021457-.0103315-.040225-.022439-.0625-.03125-.111667-.0435511-.231312-.0741619-.365234-.0742188zm10 6-3 8 3-2 3 2z" fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/NavigationRegion3D.svg b/editor/icons/NavigationRegion3D.svg
new file mode 100644
index 0000000000..7a899dbc80
--- /dev/null
+++ b/editor/icons/NavigationRegion3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.1339223.0000569-.2535666.030668-.3652344.074219-.022275.00881-.041042.020919-.0625.03125-.088962.042467-.1681009.095499-.2382812.1601562-.021532.01952-.042739.037285-.0625.058594-.074111.081092-.13722.1698052-.1816406.2695312-.00343.00765-.00847.013733-.011719.021484l-.00195.00195c-.0452281.1091913-.0629952.2269004-.0683623.3457062-.0005086.0130821-.0078112.023903-.0078125.0371094v12c.0000552.552262.4477381.999945 1 1h4.8847656a2.1184381 2.1184381 0 0 1 .1328125-.744141l2.9999999-7.9999996a2.1184381 2.1184381 0 0 1 2.007813-1.3730469 2.1184381 2.1184381 0 0 1 1.957031 1.3730469l1.017578 2.7128906v-6.96875c-.000001-.013206-.0073-.024027-.0078-.037109-.0054-.1188058-.02313-.2365149-.06836-.3457031l-.002-.00195c-.0032-.00756-.0084-.013999-.01172-.021484-.04442-.099726-.107529-.188439-.18164-.2695312-.01976-.021308-.04097-.039073-.0625-.058594-.07018-.064657-.149319-.1176895-.238282-.1601562-.02146-.010331-.04022-.022439-.0625-.03125-.111631-.0435548-.231276-.0741656-.365198-.0742225zm10 6-3 8 3-2 3 2z" fill="#fc9c9c" fill-opacity=".996078" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/New.svg b/editor/icons/New.svg
new file mode 100644
index 0000000000..efc897cb4f
--- /dev/null
+++ b/editor/icons/New.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.400017)"><path d="m2 1v14h8v-1h-2v-4h2v-2h4v-2h-5v-5zm8 0v4h4z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m11 1045.4v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></g></svg>
diff --git a/editor/icons/NewRoot.svg b/editor/icons/NewRoot.svg
new file mode 100644
index 0000000000..061ff6043a
--- /dev/null
+++ b/editor/icons/NewRoot.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 4.7813475v2.0494746c-.6177049.3566305-.998733 1.0152377-1 1.7285 0 1.1045694.8954305 1.9999999 2 1.9999999.7139771-.000554 1.3735116-.381678 1.7305-.9999995h1.3545593c.3566306.6177035 1.0152377.9987325 1.7285.9999995 1.1045696 0 1.9999996-.8954305 1.9999996-1.9999999 0-1.1045695-.89543-2-1.9999996-2-.7139771.0005537-1.3735116.3816774-1.7305 1h-1.3545593c-.1747809-.3030102-.4259781-.5548798-.72852-.73047v-2.0494746c-.5384713.0290292-1.2982621.0368063-1.99998.00197z" fill="#e0e0e0"/><path d="m6.8474576 9.6288045v1.2020165c-.617705.35663-.998733 1.015237-1 1.7285 0 1.104569.89543 2 2 2 .713977-.000554 1.373512-.381678 1.7305-1h1.2867634c.35663.617704 1.015237.998733 1.7285 1 1.104569 0 1.999999-.895431 1.999999-2 0-1.10457-.89543-2-1.999999-2-.713977.000553-1.373512.381677-1.7305 1h-1.2867634c-.174781-.303011-.425978-.55488-.72852-.73047v-1.2020165s-1.264363.03681-1.99998.002z" fill="#e0e0e0"/><path d="m2.7966098 1.3559322c-1.104569 0-2.00000003.8954305-2.00000003 2 .000554.7139771.38167803 1.3735116 1.00000003 1.7305.757716.266212.949133.2840609 1.99998-.00197.617705-.3566306.998733-1.0152377 1-1.7285 0-1.1045695-.89543-2-2-2z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/Nil.svg b/editor/icons/Nil.svg
new file mode 100644
index 0000000000..e4fbb90389
--- /dev/null
+++ b/editor/icons/Nil.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2v2h2v-2zm4 0v5c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.0000096-.99999-.44772-1-1v-5zm-11 2v6h2v-4h1c.55228.0000096.99999.44772 1 1v3h2v-3c0-1.6569-1.3431-3-3-3zm7 2v4h2v-4z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/NinePatchRect.svg b/editor/icons/NinePatchRect.svg
new file mode 100644
index 0000000000..d857b71a46
--- /dev/null
+++ b/editor/icons/NinePatchRect.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5efac" transform="translate(0 -1036.4)"><path d="m1 1037.4h2v14h-2z"/><path d="m1 1049.4h14v2h-14z"/><path d="m1 1037.4h14v2h-14z"/><path d="m13 1037.4h2v14h-2z"/><path d="m1 1041.4h14v.99998h-14z"/><path d="m1 1046.4h14v.99998h-14z"/><g transform="rotate(90)"><path d="m1037.4-6h14v.99998h-14z"/><path d="m1037.4-11h14v.99998h-14z"/></g></g></svg>
diff --git a/editor/icons/Node.svg b/editor/icons/Node.svg
new file mode 100644
index 0000000000..199f94e890
--- /dev/null
+++ b/editor/icons/Node.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Node2D.svg b/editor/icons/Node2D.svg
new file mode 100644
index 0000000000..7f27e0695f
--- /dev/null
+++ b/editor/icons/Node2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/Node3D.svg b/editor/icons/Node3D.svg
new file mode 100644
index 0000000000..56f6ed5542
--- /dev/null
+++ b/editor/icons/Node3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/NodePath.svg b/editor/icons/NodePath.svg
new file mode 100644
index 0000000000..3ecb830bec
--- /dev/null
+++ b/editor/icons/NodePath.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v8h2v-2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3zm6 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2zm5 0v8h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3v-2zm-9 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#6993ec"/></svg>
diff --git a/editor/icons/NodeWarning.svg b/editor/icons/NodeWarning.svg
new file mode 100644
index 0000000000..f40d539a39
--- /dev/null
+++ b/editor/icons/NodeWarning.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0293 2.002a1.0001 1.0001 0 0 0 -.88672.48438l-6 10a1.0001 1.0001 0 0 0 .85742 1.5137h12a1.0001 1.0001 0 0 0 .85742-1.5137l-6-10a1.0001 1.0001 0 0 0 -.82812-.48438zm-1.0293 2.998h2v5h-2zm0 6h2v2h-2z" fill="#ffdd65" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/NonFavorite.svg b/editor/icons/NonFavorite.svg
new file mode 100644
index 0000000000..29bdc8bdfd
--- /dev/null
+++ b/editor/icons/NonFavorite.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1.7246-2.375 4.0977-4.625 1.0977 3.2363 3.4063-.35938 4.6738 4.1387-1.9766 4.1582 1.9414-.39648-4.6523 3.2227-3.3926-4.625-1.0977-2.375-4.0977zm0 2.2754 1.6582 2.7773 3.2324.74414-2.25 2.3008.27539 3.1543-2.9043-1.3164-2.8926 1.3398.25195-3.168-2.2617-2.3105 3.2324-.74414 1.6582-2.7773z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ORMMaterial3D.svg b/editor/icons/ORMMaterial3D.svg
new file mode 100644
index 0000000000..3dd6013436
--- /dev/null
+++ b/editor/icons/ORMMaterial3D.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ version="1.1"
+ viewBox="0 0 16 16"
+ id="svg18"
+ sodipodi:docname="icon_o_r_m_material_3d.svg"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ <metadata
+ id="metadata24">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs22" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1010"
+ inkscape:window-height="553"
+ id="namedview20"
+ showgrid="false"
+ inkscape:zoom="7.375"
+ inkscape:cx="16.698858"
+ inkscape:cy="18.275823"
+ inkscape:window-x="345"
+ inkscape:window-y="144"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg18" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4541"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:Uroob;-inkscape-font-specification:Uroob;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.33291078"
+ d="m 5.0534707,10.652714 q 0,0.729229 -0.4538398,1.253141 -0.4538403,0.516832 -1.0868283,0.516832 H 2.3184864 q -0.6389592,0 -1.1047425,-0.509753 -0.47175502,-0.509751 -0.47175502,-1.26022 V 5.1304021 q 0,-0.7575473 0.47175502,-1.2672998 0.4717549,-0.5097517 1.1047425,-0.5097517 h 1.1943162 q 0.6270165,0 1.0868283,0.516832 0.4538398,0.5168313 0.4538398,1.2602195 z M 3.9726148,10.419078 V 5.3640385 q 0,-0.5734707 -0.3344086,-0.8141867 Q 3.5307175,4.4648927 3.381428,4.471973 H 2.3901454 q -0.2567779,0 -0.4120391,0.2690357 -0.1552611,0.2690357 -0.1552611,0.6230298 v 5.0550395 q 0,0.559311 0.3164938,0.807108 0.1074885,0.08496 0.2508064,0.08496 H 3.381428 q 0.2746925,0 0.4359254,-0.276116 0.1552614,-0.276115 0.1552614,-0.61595 z" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4543"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:Uroob;-inkscape-font-specification:Uroob;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.32084218"
+ d="M 9.9872948,12.451006 H 8.9445586 L 7.4747449,8.5287488 H 6.6815992 V 12.451006 H 5.6721419 V 3.37459 h 2.739956 q 0.5435541,0 0.9318066,0.4601926 0.3882524,0.4601933 0.3882524,1.1540217 V 7.112771 q 0,1.0053443 -0.6766682,1.3168588 -0.2107668,0.099119 -0.4659043,0.099119 z M 8.7282467,6.808336 V 5.2224407 q 0,-0.4743524 -0.2884169,-0.6867495 -0.088743,-0.070798 -0.2052192,-0.063719 H 6.6815992 v 2.9452329 h 1.7194053 q 0.2828702,-0.00708 0.3161488,-0.389394 0.011093,-0.1132781 0.011093,-0.2194752 z" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4545"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:Uroob;-inkscape-font-specification:Uroob;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.31984535"
+ d="m 10.201004,3.7285848 q 0,-0.4106342 0.529158,-0.3681546 0.126777,0.014161 0.209458,0.014161 v 0.00708 h 0.115753 l 1.692202,4.9205216 1.697714,-4.9205216 h 0.06063 v -0.00708 h 0.463013 q 0.198434,0 0.297651,0.212397 0.03307,0.063719 0.03307,0.1415978 v 8.694102 h -1.01422 V 6.8224966 L 13.227119,10.050925 H 12.273535 L 11.21522,7.1198527 v 5.3028353 h -1.014218 z" />
+</svg>
diff --git a/editor/icons/Object.svg b/editor/icons/Object.svg
new file mode 100644
index 0000000000..b1fa85d608
--- /dev/null
+++ b/editor/icons/Object.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm.037109 2.1172 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828zm-5 3.498 4 2v3.7656l-4-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/OccluderPolygon2D.svg b/editor/icons/OccluderPolygon2D.svg
new file mode 100644
index 0000000000..cdceb16441
--- /dev/null
+++ b/editor/icons/OccluderPolygon2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m1 1045.4 6 6h8v-8l-6-6h-8z" fill="#3552b1"/><path d="m1 1037.4h8l-3 4 3 4h-8z" fill="#a5b7f3" fill-opacity=".98824"/></g></svg>
diff --git a/editor/icons/OmniLight3D.svg b/editor/icons/OmniLight3D.svg
new file mode 100644
index 0000000000..06b3786ebe
--- /dev/null
+++ b/editor/icons/OmniLight3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 5 0 0 0 -5 5 5 5 0 0 0 3 4.5762v2.4238h4v-2.4199a5 5 0 0 0 3-4.5801 5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3 3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3zm-1 11v1h2v-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Onion.svg b/editor/icons/Onion.svg
new file mode 100644
index 0000000000..ec4137eab9
--- /dev/null
+++ b/editor/icons/Onion.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2 2-7 4-7 8s3 6 7 6c-7-3-6.5995-7.703 0-13-2.2981 3.9516-5.4951 8.9197 0 13 4.8692-4.2391 2.7733-8.1815 1-12 5.5855 4.704 5.3995 8.6488-1 12 4 0 7-2 7-6s-5-6-7-8z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/OptionButton.svg b/editor/icons/OptionButton.svg
new file mode 100644
index 0000000000..50e6fae218
--- /dev/null
+++ b/editor/icons/OptionButton.svg
@@ -0,0 +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 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h5 1 1 2 1c1.1046 0 2-.89543 2-2v-6c0-1.1046-.89543-2-2-2h-1-2-1-1zm8 2.9863a1.0001 1.0001 0 0 1 .7168 1.7207l-3 3a1.0001 1.0001 0 0 1 -1.4141 0l-3-3a1.0001 1.0001 0 0 1 .69727-1.7168 1.0001 1.0001 0 0 1 .7168.30273l2.293 2.293 2.293-2.293a1.0001 1.0001 0 0 1 .69727-.30664z" fill="#a5efac" transform="translate(0 1036.4)"/><path d="m4 1042.4h4v4h-4z" fill="none"/></g></svg>
diff --git a/editor/icons/OverbrightIndicator.svg b/editor/icons/OverbrightIndicator.svg
new file mode 100644
index 0000000000..70894361ce
--- /dev/null
+++ b/editor/icons/OverbrightIndicator.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v10l10-10z" fill="#fff"/><path d="m0 12 12-12h-2l-10 10z" fill="#000003"/></svg>
diff --git a/editor/icons/Override.svg b/editor/icons/Override.svg
new file mode 100644
index 0000000000..cfa9313d8e
--- /dev/null
+++ b/editor/icons/Override.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.108 0-2 .89199-2 2v1h4v-1h2v1h4v-1c0-1.108-.89199-2-2-2zm-2 5c-1.108 0-2 .89199-2 2v5c0 1.108.89199 2 2 2h10c1.108 0 2-.89199 2-2v-5c0-1.108-.89199-2-2-2h-4v3h2l-3 4-3-4h2v-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PackedByteArray.svg b/editor/icons/PackedByteArray.svg
new file mode 100644
index 0000000000..95534e4410
--- /dev/null
+++ b/editor/icons/PackedByteArray.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2h-2zm12 0v2h2v8h-2v2h4v-12h-2z" fill="#e0e0e0"/><path d="m5 3a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v4h2a3 3 0 0 0 1-.17578v.17578h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4h-2v3a1 1 0 0 1 -1 1v-4h-2z" fill="#69ec9e"/><path d="m6 9v-6h2v4a1 1 0 0 0 1-1v-3h2v4a1 1 0 0 0 1-1v-3h2v3a3 3 0 0 1 -3 3h-2v-.1758a3 3 0 0 1 -1 .1758z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PackedColorArray.svg b/editor/icons/PackedColorArray.svg
new file mode 100644
index 0000000000..206819ffb6
--- /dev/null
+++ b/editor/icons/PackedColorArray.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m6 3.5a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2z" fill="#ff7070"/><path d="m13 3.5a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1z" fill="#70bfff"/><path d="m7 1.5v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5z" fill="#7aff70"/></svg>
diff --git a/editor/icons/PackedDataContainer.svg b/editor/icons/PackedDataContainer.svg
new file mode 100644
index 0000000000..dd08ee4cc0
--- /dev/null
+++ b/editor/icons/PackedDataContainer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h12a1.0001 1.0001 0 0 0 1-1v-12a1.0001 1.0001 0 0 0 -1-1zm1 2h10v10h-10zm1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/PackedFloat32Array.svg b/editor/icons/PackedFloat32Array.svg
new file mode 100644
index 0000000000..503b0e7b6f
--- /dev/null
+++ b/editor/icons/PackedFloat32Array.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m6 2a3 3 0 0 0 -3 3v5h2v-2h1v-2h-1v-1a1 1 0 0 1 1-1zm1 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5zm3 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2z" fill="#61daf4"/><path d="m7 2v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PackedFloat64Array.svg b/editor/icons/PackedFloat64Array.svg
new file mode 100644
index 0000000000..503b0e7b6f
--- /dev/null
+++ b/editor/icons/PackedFloat64Array.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m6 2a3 3 0 0 0 -3 3v5h2v-2h1v-2h-1v-1a1 1 0 0 1 1-1zm1 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5zm3 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2z" fill="#61daf4"/><path d="m7 2v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PackedInt32Array.svg b/editor/icons/PackedInt32Array.svg
new file mode 100644
index 0000000000..a1dc417c11
--- /dev/null
+++ b/editor/icons/PackedInt32Array.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m3 2v2h2v-2zm2 2v2h-2v4h4v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3zm5 3a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2h-2z" fill="#7dc6ef"/><path d="m5 4v6h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PackedInt64Array.svg b/editor/icons/PackedInt64Array.svg
new file mode 100644
index 0000000000..a1dc417c11
--- /dev/null
+++ b/editor/icons/PackedInt64Array.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m3 2v2h2v-2zm2 2v2h-2v4h4v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3zm5 3a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2h-2z" fill="#7dc6ef"/><path d="m5 4v6h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PackedScene.svg b/editor/icons/PackedScene.svg
new file mode 100644
index 0000000000..6294989a57
--- /dev/null
+++ b/editor/icons/PackedScene.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812zm-1.4258 3.2285v6c0 1.1046.89543 2 2 2h12v-8z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PackedStringArray.svg b/editor/icons/PackedStringArray.svg
new file mode 100644
index 0000000000..e9285e2192
--- /dev/null
+++ b/editor/icons/PackedStringArray.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m7 2a3 3 0 0 0 -3 3v2a1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 3-3v-2a1 1 0 0 1 1-1h1v3a3 3 0 0 0 3 3h2v-3a1 1 0 0 1 1-1v-2a3 3 0 0 0 -3 3v1a1 1 0 0 1 -1-1v-1h1v-2h-1v-2h-2z" fill="#6ba7ec"/><path d="m8 2v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PackedVector2Array.svg b/editor/icons/PackedVector2Array.svg
new file mode 100644
index 0000000000..a5c8921045
--- /dev/null
+++ b/editor/icons/PackedVector2Array.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m9 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.0019531v2h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5zm-6 1v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4z" fill="#bd91f1"/><path d="m9 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.00195v2.0001h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5001z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PackedVector3Array.svg b/editor/icons/PackedVector3Array.svg
new file mode 100644
index 0000000000..e1de83908d
--- /dev/null
+++ b/editor/icons/PackedVector3Array.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m8 1v2h2c0 .55228-.44772 1-1 1v2c.55228 0 1 .44772 1 1s-.44772 1-1 1h-1v2h1c1.0716-.0001501 2.0618-.57193 2.5977-1.5.5359-.9282.5359-2.0718 0-3-.10406-.1795-.22646-.34772-.36523-.50195.13856-.15301.26095-.31991.36523-.49805.26209-.45639.3995-.97371.39844-1.5h.003906v-2zm0 2h-2v3c-.0000096.55228-.44772.99999-1 1v-4h-2v6h2c1.6569 0 3-1.3431 3-3z" fill="#e286f0"/><path d="m8 1v2h2c0 .55228-.44772 1-1 1v2c.55228 0 1 .44772 1 1s-.44772 1-1 1h-1v2h1c1.0716-.0001501 2.0618-.57193 2.5977-1.5.5359-.9282.5359-2.0718 0-3-.10406-.1795-.22646-.34772-.36523-.50195.13856-.15301.26095-.31991.36523-.49805.26209-.45639.3995-.97371.39844-1.5h.003906v-2z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/PaintVertex.svg b/editor/icons/PaintVertex.svg
new file mode 100644
index 0000000000..5a13e4b7d0
--- /dev/null
+++ b/editor/icons/PaintVertex.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><ellipse cx="8.372881" cy="8.169492" fill="#fff" rx="6.677966" ry="6.067797"/></svg>
diff --git a/editor/icons/Panel.svg b/editor/icons/Panel.svg
new file mode 100644
index 0000000000..f82822c5a1
--- /dev/null
+++ b/editor/icons/Panel.svg
@@ -0,0 +1 @@
+<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-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/PanelContainer.svg b/editor/icons/PanelContainer.svg
new file mode 100644
index 0000000000..017941ba36
--- /dev/null
+++ b/editor/icons/PanelContainer.svg
@@ -0,0 +1 @@
+<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 2h10v10h-10z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Panels1.svg b/editor/icons/Panels1.svg
new file mode 100644
index 0000000000..a6fc65a6a5
--- /dev/null
+++ b/editor/icons/Panels1.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Panels2.svg b/editor/icons/Panels2.svg
new file mode 100644
index 0000000000..620a2c41c3
--- /dev/null
+++ b/editor/icons/Panels2.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h16v-7zm0 9v7h16v-7z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Panels2Alt.svg b/editor/icons/Panels2Alt.svg
new file mode 100644
index 0000000000..8d76c78552
--- /dev/null
+++ b/editor/icons/Panels2Alt.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v16h7v-16zm9 0v16h7v-16z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Panels3.svg b/editor/icons/Panels3.svg
new file mode 100644
index 0000000000..1155b5b217
--- /dev/null
+++ b/editor/icons/Panels3.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h16v-7zm0 9v7h7v-7zm9 0v7h7v-7z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Panels3Alt.svg b/editor/icons/Panels3Alt.svg
new file mode 100644
index 0000000000..3ab3b19106
--- /dev/null
+++ b/editor/icons/Panels3Alt.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h7v-7zm9 0v16h7v-16zm-9 9v7h7v-7z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Panels4.svg b/editor/icons/Panels4.svg
new file mode 100644
index 0000000000..3b12eae80a
--- /dev/null
+++ b/editor/icons/Panels4.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h7v-7zm9 0v7h7v-7zm-9 9v7h7v-7zm9 0v7h7v-7z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PanoramaSkyMaterial.svg b/editor/icons/PanoramaSkyMaterial.svg
new file mode 100644
index 0000000000..33ffc20351
--- /dev/null
+++ b/editor/icons/PanoramaSkyMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 5v2h8 1c0-.554.446-1 1-1h2c.554 0 1 .446 1 1h1v-2z" fill="#9dff70"/><path d="m1 3v2h14v-2h-1.589844c-2.86436 1.357608-6.9481434 1.30996-10.347656 0z" fill="#ffeb70"/><path d="m1 2v1h2.0625c-.7241713-.2790504-1.419865-.6077805-2.0625-1zm14 0c-.465784.3952185-1.005424.7230054-1.589844 1h1.589844z" fill="#ff7070"/><path d="m1 7v2h2 1 5c-.554 0-1-.446-1-1s.446-1 1-1zm13 0c0 .554-.446 1-1 1h-1c0 .554-.446 1-1 1h4v-2z" fill="#70ffb9"/><path d="m1 9v2h2c-.554 0-1-.446-1-1s.446-1 1-1zm3 0c.554 0 1 .446 1 1s-.446 1-1 1h11v-2h-4-2z" fill="#70deff"/><path d="m1 13v-2h14v2h-1.589844c-2.86436-1.357608-6.9481434-1.30996-10.347656 0z" fill="#9f70ff"/><path d="m1 14v-1h2.0625c-.7241713.27905-1.419865.60778-2.0625 1zm14 0c-.465784-.395219-1.005424-.723005-1.589844-1h1.589844z" fill="#ff70ac"/></svg>
diff --git a/editor/icons/ParallaxBackground.svg b/editor/icons/ParallaxBackground.svg
new file mode 100644
index 0000000000..9d13f3a65d
--- /dev/null
+++ b/editor/icons/ParallaxBackground.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/><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" fill-opacity=".99608" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/ParallaxLayer.svg b/editor/icons/ParallaxLayer.svg
new file mode 100644
index 0000000000..64bf68f604
--- /dev/null
+++ b/editor/icons/ParallaxLayer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/><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="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/ParticlesMaterial.svg b/editor/icons/ParticlesMaterial.svg
new file mode 100644
index 0000000000..f9a25530ef
--- /dev/null
+++ b/editor/icons/ParticlesMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a4.5 5 0 0 0 -3.5938 2h7.1816a4.5 5 0 0 0 -3.5879-2z" fill="#ff7070"/><path d="m4.4062 3a4.5 5 0 0 0 -.81445 2h8.8105a4.5 5 0 0 0 -.81445-2z" fill="#ffeb70"/><path d="m3.5918 5a4.5 5 0 0 0 -.0058594.03125 3 3 0 0 0 -2.4121 1.9688h13.65a3 3 0 0 0 -2.4141-1.9668 4.5 5 0 0 0 -.007812-.033203h-8.8105z" fill="#9dff70"/><path d="m1.1738 7a3 3 0 0 0 -.17383 1 3 3 0 0 0 .17578 1h13.65a3 3 0 0 0 .17383-1 3 3 0 0 0 -.17578-1z" fill="#70ffb9"/><path d="m1.1758 9a3 3 0 0 0 2.8242 2h8a3 3 0 0 0 2.8262-2h-13.65z" fill="#70deff"/><path d="m3 13a1 1 0 0 0 1 1 1 1 0 0 0 1-1zm5 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm3 0a1 1 0 0 0 1 1 1 1 0 0 0 1-1z" fill="#ff70ac"/><path d="m4 12a1 1 0 0 0 -1 1h2a1 1 0 0 0 -1-1zm8 0a1 1 0 0 0 -1 1h2a1 1 0 0 0 -1-1z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/Path2D.svg b/editor/icons/Path2D.svg
new file mode 100644
index 0000000000..5633dcf923
--- /dev/null
+++ b/editor/icons/Path2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1a2 2 0 0 0 -2 2 2 2 0 0 0 .84961 1.6328c-.19239.88508-.55317 1.3394-.98633 1.6426-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c.8927-.62488 1.5321-1.6538 1.8184-3.0977a2 2 0 0 0 1.1699-1.8164 2 2 0 0 0 -2-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/Path3D.svg b/editor/icons/Path3D.svg
new file mode 100644
index 0000000000..913fe8abf6
--- /dev/null
+++ b/editor/icons/Path3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1a2 2 0 0 0 -2 2 2 2 0 0 0 .84961 1.6328c-.19239.88508-.55317 1.3394-.98633 1.6426-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c.8927-.62488 1.5321-1.6538 1.8184-3.0977a2 2 0 0 0 1.1699-1.8164 2 2 0 0 0 -2-2z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/PathFollow2D.svg b/editor/icons/PathFollow2D.svg
new file mode 100644
index 0000000000..ac0f17240e
--- /dev/null
+++ b/editor/icons/PathFollow2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 0-3 4h1.9473c-.1385 1.3203-.5583 1.9074-1.084 2.2754-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c1.0528-.73697 1.7552-2.032 1.9375-3.9141h2.0508l-3-4z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/PathFollow3D.svg b/editor/icons/PathFollow3D.svg
new file mode 100644
index 0000000000..c9bd7009dc
--- /dev/null
+++ b/editor/icons/PathFollow3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 0-3 4h1.9473c-.1385 1.3203-.5583 1.9074-1.084 2.2754-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c1.0528-.73697 1.7552-2.032 1.9375-3.9141h2.0508l-3-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Pause.svg b/editor/icons/Pause.svg
new file mode 100644
index 0000000000..724a84f458
--- /dev/null
+++ b/editor/icons/Pause.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 3a1.0001 1.0001 0 0 0 -1 1v8a1.0001 1.0001 0 0 0 1 1h2a1 1 0 0 0 1-1v-8a1 1 0 0 0 -1-1zm6 0a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h2a1.0001 1.0001 0 0 0 1-1v-8a1.0001 1.0001 0 0 0 -1-1z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/PhysicalBone3D.svg b/editor/icons/PhysicalBone3D.svg
new file mode 100644
index 0000000000..55df1f1e19
--- /dev/null
+++ b/editor/icons/PhysicalBone3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc9c9c" transform="translate(-2.5625 -18.4375)"><path d="m13.107422 19.382812a2.4664 2.4663 0 0 0 -1.78125.720704 2.4664 2.4663 0 0 0 -.185547.21289l1.332031 2.433594-1.605469.603516-3.414062 3.414062a2.4664 2.4663 0 0 0 -3.1015625.3125 2.4664 2.4663 0 0 0 0 3.488281 2.4664 2.4663 0 0 0 1.3964844.695313 2.4664 2.4663 0 0 0 .6953125 1.396484 2.4664 2.4663 0 0 0 3.4882812 0 2.4664 2.4663 0 0 0 .3144534-3.103515l3.560547-3.560547a2.4664 2.4663 0 0 0 3.099609-.310547 2.4664 2.4663 0 0 0 0-3.488281 2.4664 2.4663 0 0 0 -1.396484-.697266 2.4664 2.4663 0 0 0 -.695313-1.396484 2.4664 2.4663 0 0 0 -1.707031-.720704z"/><path d="m3.7211033 21.208326.9608286 4.82644 1.3962404-.524494z"/><path d="m6.4843278 19.465234.9608285 4.82644 1.3962404-.524494z"/><path d="m9.6964655 19.33678.7108285 3.51394 1.39624-.524494z"/></g></svg>
diff --git a/editor/icons/PhysicalSkyMaterial.svg b/editor/icons/PhysicalSkyMaterial.svg
new file mode 100644
index 0000000000..68bf2785a4
--- /dev/null
+++ b/editor/icons/PhysicalSkyMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 5v2h8 1c0-.554.446-1 1-1h2c.554 0 1 .446 1 1h1v-2z" fill="#9dff70"/><path d="m1 7v2h2 1 5c-.554 0-1-.446-1-1s.446-1 1-1zm13 0c0 .554-.446 1-1 1h-1c0 .554-.446 1-1 1h4v-2z" fill="#70ffb9"/><path d="m1 9v2h2c-.554 0-1-.446-1-1s.446-1 1-1zm3 0c.554 0 1 .446 1 1s-.446 1-1 1h11v-2h-4-2z" fill="#70deff"/><path d="m1 3v2h14v-2z" fill="#ffeb70"/><path d="m1 11v2h14v-2z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/Pin.svg b/editor/icons/Pin.svg
new file mode 100644
index 0000000000..708eab9333
--- /dev/null
+++ b/editor/icons/Pin.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1v1l1 1v3h6v-3l1-1v-1zm1 6-2 3h10l-2-3zm2 4v2l1 2 1-2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/PinJoint2D.svg b/editor/icons/PinJoint2D.svg
new file mode 100644
index 0000000000..4e701df7fb
--- /dev/null
+++ b/editor/icons/PinJoint2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1.2715-.70703.70703v1.4141l-2.1211 2.123 4.2422 4.2422 2.1211-2.1211h1.4141l.70703-.70703-5.6562-5.6582zm-3.5352 4.9512-3.5352.70703 7.0703 7.0703.70703-3.5352-4.2422-4.2422zm-1.4141 4.2422-1.4141 1.4141-.70703 2.1211 2.1211-.70703 1.4141-1.4141-1.4141-1.4141z" fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/PinJoint3D.svg b/editor/icons/PinJoint3D.svg
new file mode 100644
index 0000000000..12f388b2f7
--- /dev/null
+++ b/editor/icons/PinJoint3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1.2715-.70703.70703v1.4141l-2.1211 2.123 4.2422 4.2422 2.1211-2.1211h1.4141l.70703-.70703-5.6562-5.6582zm-3.5352 4.9512-3.5352.70703 7.0703 7.0703.70703-3.5352-4.2422-4.2422zm-1.4141 4.2422-1.4141 1.4141-.70703 2.1211 2.1211-.70703 1.4141-1.4141-1.4141-1.4141z" fill="#fc9c9c" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/PinPressed.svg b/editor/icons/PinPressed.svg
new file mode 100644
index 0000000000..708eab9333
--- /dev/null
+++ b/editor/icons/PinPressed.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1v1l1 1v3h6v-3l1-1v-1zm1 6-2 3h10l-2-3zm2 4v2l1 2 1-2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/Plane.svg b/editor/icons/Plane.svg
new file mode 100644
index 0000000000..edaa86e772
--- /dev/null
+++ b/editor/icons/Plane.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 2v8h2v-2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3zm6 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5zm-4 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm8 0v6h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3z" fill="#f77070"/></svg>
diff --git a/editor/icons/PlaneMesh.svg b/editor/icons/PlaneMesh.svg
new file mode 100644
index 0000000000..3514c1e3e3
--- /dev/null
+++ b/editor/icons/PlaneMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 4-7 4 7 4 7-4zm0 2 3.5 2-3.5 2-3.5-2z" fill="#ffd684"/></svg>
diff --git a/editor/icons/Play.svg b/editor/icons/Play.svg
new file mode 100644
index 0000000000..0be543d1ae
--- /dev/null
+++ b/editor/icons/Play.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/PlayBackwards.svg b/editor/icons/PlayBackwards.svg
new file mode 100644
index 0000000000..846a6aec19
--- /dev/null
+++ b/editor/icons/PlayBackwards.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" transform="matrix(-1 0 0 1 16 -1036.4)"/></svg>
diff --git a/editor/icons/PlayCustom.svg b/editor/icons/PlayCustom.svg
new file mode 100644
index 0000000000..118545ec62
--- /dev/null
+++ b/editor/icons/PlayCustom.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25-.28906-1.9785zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812-.81836-1.9004zm-1.4258 3.2285v6a2 2 0 0 0 2 2h12v-8zm3 1h4v1h4v5h-4-4v-5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PlayOverlay.svg b/editor/icons/PlayOverlay.svg
new file mode 100644
index 0000000000..9b3299d1b9
--- /dev/null
+++ b/editor/icons/PlayOverlay.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><rect fill="#044b94" fill-opacity=".6" height="64" rx="5" width="64"/><path d="m16 16 32 16-32 16" fill="#f2f2f2"/></svg>
diff --git a/editor/icons/PlayScene.svg b/editor/icons/PlayScene.svg
new file mode 100644
index 0000000000..7f8e40fa63
--- /dev/null
+++ b/editor/icons/PlayScene.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812zm-1.4258 3.2285v6c0 1.1046.89543 2 2 2h12v-8zm5 1 5 3-5 3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PlayStart.svg b/editor/icons/PlayStart.svg
new file mode 100644
index 0000000000..afd1251560
--- /dev/null
+++ b/editor/icons/PlayStart.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1c.55226-.0001.99994-.4477 1-1v-8c-.000055-.5523-.44774-.9999-1-1zm4.9746 0c-.54154.014-.97365.45635-.97461.99805v8c-.000392.8389.97003 1.3054 1.625.78125l5-4c.49938-.4004.49938-1.1601 0-1.5605l-5-4c-.18422-.1473-.41459-.22485-.65039-.21875z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/PlayStartBackwards.svg b/editor/icons/PlayStartBackwards.svg
new file mode 100644
index 0000000000..7d1624a397
--- /dev/null
+++ b/editor/icons/PlayStartBackwards.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1039.4a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-1c-.55226-.0001-.99994-.4477-1-1v-8c.000055-.5523.44774-.9999 1-1zm-4.9746 0c.54154.014.97365.4563.97461.998v8c.000392.8389-.97003 1.3055-1.625.7813l-5-4c-.49938-.4004-.49938-1.1601 0-1.5605l5-4c.18422-.1473.41459-.2249.65039-.2188z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/PlayTravel.svg b/editor/icons/PlayTravel.svg
new file mode 100644
index 0000000000..be4ac1fb7e
--- /dev/null
+++ b/editor/icons/PlayTravel.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(.59321602 0 0 .59321602 -1.220314 -611.14809)"/><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(.59321602 0 0 .59321602 7.525472 -610.94451)"/><rect height=".542373" ry=".271186" width="9.559322" x="3.005846" y="8.128074"/></g></svg>
diff --git a/editor/icons/PluginScript.svg b/editor/icons/PluginScript.svg
new file mode 100644
index 0000000000..3fb34879fe
--- /dev/null
+++ b/editor/icons/PluginScript.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1-.56445 2.2578c-.23643.075851-.46689.16921-.68945.2793l-1.9883-1.1934-1.4141 1.4141 1.1953 1.9941c-.11191.22113-.20723.45028-.28516.68555l-2.2539.5625v2l2.2578.56445c.048141.14946.11579.29137.17773.43555h.58789c.51595-.6841 1.1988-1.2456 2.0195-1.5957-.028019-.13296-.042416-.26842-.042969-.4043.0000096-1.1046.89543-2 2-2 1.1046.0000096 2 .89543 2 2-.0001737.1345-.013915.26865-.041016.40039.82295.35108 1.509.91301 2.0254 1.5996h.58008c.063668-.14463.13192-.2874.18164-.4375l2.2539-.5625v-2l-2.2578-.56445c-.075942-.23577-.1693-.46557-.2793-.6875l1.1934-1.9902-1.4141-1.4141-1.9941 1.1953c-.22113-.11191-.45028-.20723-.68555-.28516l-.5625-2.2539h-2zm1 6a1 1 0 0 0 -.99805.92969 1 1 0 0 0 -.0019531.070312v2.1738a3 3 0 0 0 -2 2.8262h1v2h1v-2h2v2h1v-2h1a3 3 0 0 0 -.015625-.29883 3 3 0 0 0 -1.9844-2.5254v-2.1758a1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PointMesh.svg b/editor/icons/PointMesh.svg
new file mode 100644
index 0000000000..184200c528
--- /dev/null
+++ b/editor/icons/PointMesh.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#ffd684"><ellipse cx="3.7237" cy="3.0268" rx="2.0114" ry="1.9956"/><ellipse cx="11.717" cy="6.1734" rx="2.0114" ry="1.9956"/><ellipse cx="6.5219" cy="12.477" rx="2.0114" ry="1.9956"/></g></svg>
diff --git a/editor/icons/Polygon2D.svg b/editor/icons/Polygon2D.svg
new file mode 100644
index 0000000000..b74ba3e342
--- /dev/null
+++ b/editor/icons/Polygon2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12l-6 6z" fill="#a5b7f3" stroke="#a5b7f3" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/PolygonPathFinder.svg b/editor/icons/PolygonPathFinder.svg
new file mode 100644
index 0000000000..f400037d80
--- /dev/null
+++ b/editor/icons/PolygonPathFinder.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0000552-.99994.44774-1 1v1h2v-2zm3 0v2h2v-2zm4 0v2h2v-2zm4 0v2h1.4141l.29297-.29297c.62956-.62999.18361-1.7067-.70703-1.707h-1zm-12 4v2h2v-2zm11 2-3 8 3-2 3 2zm-11 2v2h2v-2zm0 4v1c.0000552.55226.44774.99994 1 1h1v-2zm4 0v2h1.9023c-.0007835-.2513.043539-.50069.13086-.73633l.47461-1.2637h-2.5078z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/Popup.svg b/editor/icons/Popup.svg
new file mode 100644
index 0000000000..c25cc5b256
--- /dev/null
+++ b/editor/icons/Popup.svg
@@ -0,0 +1 @@
+<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-2zm4 2h2v6h-2zm0 8h2v2h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PopupMenu.svg b/editor/icons/PopupMenu.svg
new file mode 100644
index 0000000000..dd729e472b
--- /dev/null
+++ b/editor/icons/PopupMenu.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1zm1 2h10v2h-10zm0 3h10v2h-10z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/PopupPanel.svg b/editor/icons/PopupPanel.svg
new file mode 100644
index 0000000000..075cad678e
--- /dev/null
+++ b/editor/icons/PopupPanel.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4c-.55228 0-1 .44772-1 1v7c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-7c0-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Portal.svg b/editor/icons/Portal.svg
new file mode 100644
index 0000000000..e52e0473a6
--- /dev/null
+++ b/editor/icons/Portal.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 7 0 0 0 -5 7 5 7 0 0 0 5 7 5 7 0 0 0 5-7 5 7 0 0 0 -5-7zm0 2a3 5 0 0 1 3 5 3 5 0 0 1 -3 5 3 5 0 0 1 -3-5 3 5 0 0 1 3-5z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Position2D.svg b/editor/icons/Position2D.svg
new file mode 100644
index 0000000000..d5e7ff9621
--- /dev/null
+++ b/editor/icons/Position2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v4h2v-4zm-6 6v2h4v-2zm10 0v2h4v-2zm-4 4v4h2v-4z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/Position3D.svg b/editor/icons/Position3D.svg
new file mode 100644
index 0000000000..da7dfb010a
--- /dev/null
+++ b/editor/icons/Position3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v4h2v-4zm-6 6v2h4v-2zm10 0v2h4v-2zm-4 4v4h2v-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/PrismMesh.svg b/editor/icons/PrismMesh.svg
new file mode 100644
index 0000000000..bc5f4fb0b1
--- /dev/null
+++ b/editor/icons/PrismMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9824 1.002a1.0001 1.0001 0 0 0 -.81445.44336l-5.9727 8.9609-.027344.03906a1 1 0 0 0 -.0625.10742 1 1 0 0 0 .44727 1.3418l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1 1 0 0 0 .44726-1.3418 1 1 0 0 0 -.0625-.10742l-6-9a1.0001 1.0001 0 0 0 -.84961-.44336zm-.98242 4.3008v7.0801l-3.5391-1.7715zm2 0 3.5391 5.3086-3.5391 1.7715z" fill="#ffd684"/></svg>
diff --git a/editor/icons/ProceduralSkyMaterial.svg b/editor/icons/ProceduralSkyMaterial.svg
new file mode 100644
index 0000000000..9aa362d8da
--- /dev/null
+++ b/editor/icons/ProceduralSkyMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.0761719 11a7 7 0 0 0 .609375 2h12.6308591a7 7 0 0 0 .609375-2h-9.925781c0 .554-.446 1-1 1h-1c-.554 0-1-.446-1-1z" fill="#9f70ff"/><path d="m1.0722656 9a7 7 0 0 0 -.0722656 1 7 7 0 0 0 .0761719 1h.9238281c0-.554.446-1 1-1h1c.554 0 1 .446 1 1h9.925781a7 7 0 0 0 .074219-1 7 7 0 0 0 -.072266-1h-2.927734-1c0 .554-.446 1-1 1h-2c-.554 0-1-.446-1-1z" fill="#70deff"/><path d="m1.6757812 7a7 7 0 0 0 -.6035156 2h5.9277344c0-.554.446-1 1-1h1c0-.554.446-1 1-1zm10.3242188 0c.554 0 1 .446 1 1s-.446 1-1 1h2.927734a7 7 0 0 0 -.603515-2z" fill="#70ffb9"/><path d="m3.1035156 5a7 7 0 0 0 -1.4277344 2h12.6484378a7 7 0 0 0 -1.425781-2z" fill="#9dff70"/><path d="m8 3a7 7 0 0 0 -4.8964844 2h9.7949224a7 7 0 0 0 -4.898438-2z" fill="#ffeb70"/></svg>
diff --git a/editor/icons/Progress1.svg b/editor/icons/Progress1.svg
new file mode 100644
index 0000000000..07505ddd67
--- /dev/null
+++ b/editor/icons/Progress1.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1037.4v3.0547a4 4 0 0 1 1.0273.4258l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223z" fill-opacity=".99608"/><path d="m7 1.0801a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/Progress2.svg b/editor/icons/Progress2.svg
new file mode 100644
index 0000000000..0a48f7d3f5
--- /dev/null
+++ b/editor/icons/Progress2.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm-1.3203 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m13.6 1040.2-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/Progress3.svg b/editor/icons/Progress3.svg
new file mode 100644
index 0000000000..a7f0f9c973
--- /dev/null
+++ b/editor/icons/Progress3.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm4.8926 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m11.867 1045.4a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/Progress4.svg b/editor/icons/Progress4.svg
new file mode 100644
index 0000000000..171920915e
--- /dev/null
+++ b/editor/icons/Progress4.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m10.027 1047.8a4 4 0 0 1 -1.0273.4277v3.0508a7 7 0 0 0 3.1855-1.3203z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/Progress5.svg b/editor/icons/Progress5.svg
new file mode 100644
index 0000000000..7289b7b8fe
--- /dev/null
+++ b/editor/icons/Progress5.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-1.8398 2.4414a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m5.9727 1047.8-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.4258z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/Progress6.svg b/editor/icons/Progress6.svg
new file mode 100644
index 0000000000..3deba6d48c
--- /dev/null
+++ b/editor/icons/Progress6.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-1.7324 5.1855a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m1.0801 1045.4a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/Progress7.svg b/editor/icons/Progress7.svg
new file mode 100644
index 0000000000..546155dc59
--- /dev/null
+++ b/editor/icons/Progress7.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm6.5996 2.7344-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m2.4004 1040.2a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/Progress8.svg b/editor/icons/Progress8.svg
new file mode 100644
index 0000000000..b56ffcb727
--- /dev/null
+++ b/editor/icons/Progress8.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-6.5996 2.7363a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m7 1037.4a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.4277z" fill-opacity=".99608"/></g></svg>
diff --git a/editor/icons/ProgressBar.svg b/editor/icons/ProgressBar.svg
new file mode 100644
index 0000000000..2200cb8ea7
--- /dev/null
+++ b/editor/icons/ProgressBar.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-6c0-1.1046-.89543-2-2-2zm0 2h10v6h-10zm1 1v4h1v-4zm2 0v4h1v-4zm2 0v4h1v-4z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ProjectIconLoading.svg b/editor/icons/ProjectIconLoading.svg
new file mode 100644
index 0000000000..5e189a97b0
--- /dev/null
+++ b/editor/icons/ProjectIconLoading.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8z" fill="#e0e0e0" fill-opacity=".188235"/></svg>
diff --git a/editor/icons/ProximityGroup3D.svg b/editor/icons/ProximityGroup3D.svg
new file mode 100644
index 0000000000..703abc6486
--- /dev/null
+++ b/editor/icons/ProximityGroup3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h14v-14zm2 2h10v10h-10zm7.5 1c-.82843.0000048-1.5.67157-1.5 1.5.0000048.82843.67157 1.5 1.5 1.5.82842-.0000048 1.5-.67157 1.5-1.5-.000005-.82843-.67158-1.5-1.5-1.5zm-5 5c-.82843-.0000048-1.5.67157-1.5 1.5-.0000048.82843.67157 1.5 1.5 1.5.82843.000005 1.5-.67157 1.5-1.5.0000048-.82843-.67157-1.5-1.5-1.5zm5 0c-.82843.0000048-1.5.67157-1.5 1.5.0000048.82842.67157 1.5 1.5 1.5.82842-.000005 1.5-.67158 1.5-1.5-.000005-.82843-.67158-1.5-1.5-1.5z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ProxyTexture.svg b/editor/icons/ProxyTexture.svg
new file mode 100644
index 0000000000..526f21c379
--- /dev/null
+++ b/editor/icons/ProxyTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h4v-4zm6 0v2h6v8h-6v4h7a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm2 4v1h-1v1h-1v3h1 2 2v-2h-1v-2h-1v-1zm-8 1v4h4v-4zm0 5v4h4v-4z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Quad.svg b/editor/icons/Quad.svg
new file mode 100644
index 0000000000..cf07be1d2f
--- /dev/null
+++ b/editor/icons/Quad.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 10 2h2 12v-2-12h-12zm3.4141 2h8.5859v8.5859zm-1.4141 1.4141 8.5859 8.5859h-8.5859z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/QuadMesh.svg b/editor/icons/QuadMesh.svg
new file mode 100644
index 0000000000..bee0b2853f
--- /dev/null
+++ b/editor/icons/QuadMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1v14h-14v-14zm-2 2h-8.5859l8.5859 8.5859zm-10 1.4141v8.5859h8.5859z" fill="#ffd684"/></svg>
diff --git a/editor/icons/Quat.svg b/editor/icons/Quat.svg
new file mode 100644
index 0000000000..66020e5243
--- /dev/null
+++ b/editor/icons/Quat.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3a3 3 0 0 0 -3 3 3 3 0 0 0 3 3v2h2v-2.7695a3 3 0 0 0 2 .76953h2v-6h-2v4a1 1 0 0 1 -1-1v-3h-2zm0 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#ec69a3"/><path d="m4 3v3a3 3 0 0 0 3 3h2v-6h-2v4a1 1 0 0 1 -1-1v-3z" fill="#fff" fill-opacity=".39216"/><path d="m13 1v2h-2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-3a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2zm-2 4v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#ec69a3"/></svg>
diff --git a/editor/icons/README.md b/editor/icons/README.md
index 5f652e47ab..3159565180 100644
--- a/editor/icons/README.md
+++ b/editor/icons/README.md
@@ -1,12 +1,7 @@
-The icons here are optimized SVGs, because the editor renders the svgs at runtime, they need
-to be small in size, so they can be efficiently parsed.
+# Editor icons
-The original icons can be found at:
-https://github.com/godotengine/godot-design/tree/master/engine/icons
+This folder contains all the icons used by Godot editor (except for platform
+icons which are located in their respective platform folder).
-There you can find the optimizer script.
-
-If you add a new icon, please make a pull request to this repo:
-https://github.com/godotengine/godot-design/
-
-and store the optimized SVG version here.
+See [Editor icons](https://docs.godotengine.org/en/latest/development/editor/creating_icons.html)
+in the documentation for details on creating icons for the Godot editor.
diff --git a/editor/icons/RID.svg b/editor/icons/RID.svg
new file mode 100644
index 0000000000..9198e421b1
--- /dev/null
+++ b/editor/icons/RID.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 2v2h2v-2zm7 0v2h-1a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1 2v-8zm-10 2a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2zm3 2v4h2v-4zm6 0h1v2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#69ec9a"/></svg>
diff --git a/editor/icons/RayCast2D.svg b/editor/icons/RayCast2D.svg
new file mode 100644
index 0000000000..645da1e2da
--- /dev/null
+++ b/editor/icons/RayCast2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v9h-3l4 5 4-5h-3v-9z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/RayCast3D.svg b/editor/icons/RayCast3D.svg
new file mode 100644
index 0000000000..4500551463
--- /dev/null
+++ b/editor/icons/RayCast3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v9h-3l4 5 4-5h-3v-9z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/RayShape2D.svg b/editor/icons/RayShape2D.svg
new file mode 100644
index 0000000000..aa8cee1210
--- /dev/null
+++ b/editor/icons/RayShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v9.5859l-1.293-1.293a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l3 3a1.0001 1.0001 0 0 0 .0039062.003907 1 1 0 0 0 .050781.044921 1.0001 1.0001 0 0 0 .03125.027344 1 1 0 0 0 .048828.035156 1.0001 1.0001 0 0 0 .023438.015625 1 1 0 0 0 .076172.044922 1.0001 1.0001 0 0 0 .0058593.003906 1 1 0 0 0 .013672.007813 1.0001 1.0001 0 0 0 .078125.035156 1 1 0 0 0 .074219.025391 1.0001 1.0001 0 0 0 .025391.009766 1 1 0 0 0 .039062.009765 1.0001 1.0001 0 0 0 .068359.013672 1.0001 1.0001 0 0 0 .097656.011719 1.0001 1.0001 0 0 0 .0078125 0 1 1 0 0 0 .0625.003906 1 1 0 0 0 .015625-.001953 1.0001 1.0001 0 0 0 .083984-.003906 1 1 0 0 0 .015625-.001953 1.0001 1.0001 0 0 0 .083984-.013672 1.0001 1.0001 0 0 0 .052734-.013672 1 1 0 0 0 .058594-.015625 1.0001 1.0001 0 0 0 .078125-.029297 1 1 0 0 0 .013672-.00586 1.0001 1.0001 0 0 0 .076172-.037109 1 1 0 0 0 .013672-.007812 1.0001 1.0001 0 0 0 .072266-.044922 1 1 0 0 0 .011719-.007813 1.0001 1.0001 0 0 0 .068359-.052734 1 1 0 0 0 .011719-.009766 1.0001 1.0001 0 0 0 .050781-.046875l.0097657-.011719 2.9902-2.9883a1 1 0 0 0 0-1.4141 1 1 0 0 0 -1.4141 0l-1.293 1.293v-9.5859a1 1 0 0 0 -1-1z" fill="#68b6ff" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/RayShape3D.svg b/editor/icons/RayShape3D.svg
new file mode 100644
index 0000000000..44d32fe83b
--- /dev/null
+++ b/editor/icons/RayShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m8 1-6 5 4 2.666v4.334l2 2v-5-2z" fill="#a2d2ff"/><path d="m8 1v7 2l-2-1.334v1.334l2 1.5v3.5l2-2v-4.334l4-2.666z" fill="#2998ff"/></g></svg>
diff --git a/editor/icons/Rayito.svg b/editor/icons/Rayito.svg
new file mode 100644
index 0000000000..1db71c2231
--- /dev/null
+++ b/editor/icons/Rayito.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-1 7h2.875l-.875 7 9-8h-3.8574l.85742-6h-7z" fill="#ffd684"/></svg>
diff --git a/editor/icons/Rect2.svg b/editor/icons/Rect2.svg
new file mode 100644
index 0000000000..18dbdf3a12
--- /dev/null
+++ b/editor/icons/Rect2.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 2v2h-1a3 3 0 0 0 -2.5 1.3457 3 3 0 0 0 -2.5-1.3457 3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1h3a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v1a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2zm-10 2a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2z" fill="#f191a5"/></svg>
diff --git a/editor/icons/Rect2i.svg b/editor/icons/Rect2i.svg
new file mode 100644
index 0000000000..d28c098ed6
--- /dev/null
+++ b/editor/icons/Rect2i.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="12" version="1.1" viewBox="0 0 16 12" xmlns="http://www.w3.org/2000/svg">
+<path d="m9 2v2h-1c-1.7267 0-3 1.3359-3 3 0 1.6569 1.3431 3 3 3h1v-2h-1c-0.55228 0-1-0.44772-1-1s0.44772-1 1-1h1v1c0 1.6569 1.3431 3 3 3v-2c-0.55228 0-0.93526-0.45152-1-1v-1h1v-2h-1v-2zm-5 2c-1.6569 0-2.9547 1.3438-3 3v3h2v-3c0-0.55228 0.44772-1 1-1h1v-2z" fill="#f191a5"/>
+<path d="m13 2v2h2v-2zm0 4v4h2v-4z" fill="#7dc6ef"/>
+</svg>
diff --git a/editor/icons/RectangleShape2D.svg b/editor/icons/RectangleShape2D.svg
new file mode 100644
index 0000000000..f0d6c54dc9
--- /dev/null
+++ b/editor/icons/RectangleShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><rect fill="none" height="8" rx=".000017" stroke="#68b6ff" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" width="12" x="2" y="4"/></svg>
diff --git a/editor/icons/ReferenceRect.svg b/editor/icons/ReferenceRect.svg
new file mode 100644
index 0000000000..449ca250e3
--- /dev/null
+++ b/editor/icons/ReferenceRect.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h8v-2zm9 0v2h2v-2zm-12 3v8h2v-8zm12 0v8h2v-8zm-12 9v2h2v-2zm3 0v2h8v-2zm9 0v2h2v-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/ReflectionProbe.svg b/editor/icons/ReflectionProbe.svg
new file mode 100644
index 0000000000..ff9263d798
--- /dev/null
+++ b/editor/icons/ReflectionProbe.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10 2a1.0001 1.0001 0 1 0 0 2h1.5859l-4.5195 4.5195-4.2988-5.1582-1.5352 1.2793 5 6a1.0001 1.0001 0 0 0 1.4746.064453l5.293-5.293v1.5879a1.0001 1.0001 0 1 0 2 0v-4a1.0001 1.0001 0 0 0 -1-1h-4zm-9 7v5a1.0001 1.0001 0 0 0 1 1h12a1.0001 1.0001 0 0 0 1-1v-4h-2v3h-10v-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/RegionEdit.svg b/editor/icons/RegionEdit.svg
new file mode 100644
index 0000000000..0bee107e33
--- /dev/null
+++ b/editor/icons/RegionEdit.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m6 1042.4h6v6h-6z"/><path d="m1 1v4h4v-4zm5 0v4h6v-4zm7 0v4h2v-4zm-12 5v6h4v-6zm12 0v6h2v-6zm-12 7v2h4v-2zm5 0v2h6v-2zm7 0v2h2v-2z" fill-opacity=".32549" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/Reload.svg b/editor/icons/Reload.svg
new file mode 100644
index 0000000000..1200df1dde
--- /dev/null
+++ b/editor/icons/Reload.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg>
diff --git a/editor/icons/ReloadSmall.svg b/editor/icons/ReloadSmall.svg
new file mode 100644
index 0000000000..9418a57ab1
--- /dev/null
+++ b/editor/icons/ReloadSmall.svg
@@ -0,0 +1 @@
+<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1038.4)"><path d="m8 1039.4a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1618 1050.3)"/></g></svg>
diff --git a/editor/icons/RemoteTransform2D.svg b/editor/icons/RemoteTransform2D.svg
new file mode 100644
index 0000000000..81a3946d9f
--- /dev/null
+++ b/editor/icons/RemoteTransform2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.8565 0-5.4995 1.5262-6.9277 4a1 1 0 0 0 .36523 1.3672 1 1 0 0 0 1.3672-.36719c1.0726-1.8578 3.0501-3 5.1953-3s4.1227 1.1422 5.1953 3a1 1 0 0 0 1.3672.36719 1 1 0 0 0 .36523-1.3672c-1.4283-2.4738-4.0712-4-6.9277-4zm0 4c-1.8056 0-3.396 1.2207-3.8633 2.9648a1 1 0 0 0 .70703 1.2246 1 1 0 0 0 1.2246-.70703c.23553-.8791 1.0216-1.4824 1.9316-1.4824s1.6961.60332 1.9316 1.4824a1 1 0 0 0 1.2246.70703 1 1 0 0 0 .70703-1.2246c-.46732-1.7441-2.0577-2.9648-3.8633-2.9648zm0 4c-.554 0-1 .446-1 1v1h-3a4 4 0 0 0 2 3.4648 4 4 0 0 0 4 0 4 4 0 0 0 2-3.4648h-3v-1c0-.554-.446-1-1-1z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/RemoteTransform3D.svg b/editor/icons/RemoteTransform3D.svg
new file mode 100644
index 0000000000..d55e4e4224
--- /dev/null
+++ b/editor/icons/RemoteTransform3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.8565 0-5.4995 1.5262-6.9277 4a1 1 0 0 0 .36523 1.3672 1 1 0 0 0 1.3672-.36719c1.0726-1.8578 3.0501-3 5.1953-3s4.1227 1.1422 5.1953 3a1 1 0 0 0 1.3672.36719 1 1 0 0 0 .36523-1.3672c-1.4283-2.4738-4.0712-4-6.9277-4zm0 4c-1.8056 0-3.396 1.2207-3.8633 2.9648a1 1 0 0 0 .70703 1.2246 1 1 0 0 0 1.2246-.70703c.23553-.8791 1.0216-1.4824 1.9316-1.4824s1.6961.60332 1.9316 1.4824a1 1 0 0 0 1.2246.70703 1 1 0 0 0 .70703-1.2246c-.46732-1.7441-2.0577-2.9648-3.8633-2.9648zm0 4c-.554 0-1 .446-1 1v1h-3a4 4 0 0 0 2 3.4648 4 4 0 0 0 4 0 4 4 0 0 0 2-3.4648h-3v-1c0-.554-.446-1-1-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/Remove.svg b/editor/icons/Remove.svg
new file mode 100644
index 0000000000..5bcdf8e569
--- /dev/null
+++ b/editor/icons/Remove.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1v1h-4v2h14v-2h-4v-1zm-3 4v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-8zm1 2h2v6h-2zm4 0h2v6h-2zm4 0h2v6h-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/RemoveInternal.svg b/editor/icons/RemoveInternal.svg
new file mode 100644
index 0000000000..1cb5db1c52
--- /dev/null
+++ b/editor/icons/RemoveInternal.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><circle cx="10.508475" cy="12.677966" r="2.372881"/><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" transform="matrix(.63442593 0 0 .63442593 .38222 .924574)"/></g></svg>
diff --git a/editor/icons/Rename.svg b/editor/icons/Rename.svg
new file mode 100644
index 0000000000..853f68b2e1
--- /dev/null
+++ b/editor/icons/Rename.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 2v2h2v8h-2v2h2c.55228 0 1-.4477 1-1 0 .5523.44772 1 1 1h2v-2h-2v-8h2v-2h-2c-.55228 0-1 .44772-1 1 0-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Reparent.svg b/editor/icons/Reparent.svg
new file mode 100644
index 0000000000..04efb08b99
--- /dev/null
+++ b/editor/icons/Reparent.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v5.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -.72852-.73047v-5.541a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2z" fill="#e0e0e0"/><path d="m9 1-4 3 4 3v-2a3 3 0 0 1 3 3v2h2v-2a5 5 0 0 0 -5-5z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/ReparentToNewNode.svg b/editor/icons/ReparentToNewNode.svg
new file mode 100644
index 0000000000..cca610d2b1
--- /dev/null
+++ b/editor/icons/ReparentToNewNode.svg
@@ -0,0 +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="m1.4915254 13c0 1.104569.8954305 2 2 2 .7139771-.000554 1.3735116-.381677 1.7305-1h6.0494746c.356631.617705 1.015238.998733 1.7285 1 1.104569 0 2-.895431 2-2s-.895431-2-2-2c-.713977.000554-1.373512.381677-1.7305 1h-6.0494746c-.1747809-.30301-.8483719-1-1.7285-1-.9027301 0-2 .891221-2 2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m10.421845 1038.2814-2.7947264 2.096 2.7947264 2.0961v-1.3974c2.716918 0 2.180792 1.4469 2.180792 3.9265v1.3974h1.397363v-1.3974c0-3.863.13086-5.3239-3.578155-5.3239z" fill="#84ffb1" stroke-width=".698682"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1" transform="translate(-8.5 1028.4)"/><path d="m4.5 1047.7968v-3.1171h-2.0000005v3.1171z" fill="#e0e0e0" stroke-width=".717839"/></g></svg>
diff --git a/editor/icons/ResourcePreloader.svg b/editor/icons/ResourcePreloader.svg
new file mode 100644
index 0000000000..7a788bbdcb
--- /dev/null
+++ b/editor/icons/ResourcePreloader.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm.037109 2.1172 3.7637 1.8809-1.3809.69141-3.7637-1.8828 1.3809-.68945zm-5 3.5 4 2v3.7637l-4-2zm10 0v3.7637l-4 2v-3.7637z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/RichTextEffect.svg b/editor/icons/RichTextEffect.svg
new file mode 100644
index 0000000000..f1d3f168ff
--- /dev/null
+++ b/editor/icons/RichTextEffect.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h7v-2zm9 0v2h5v-2zm-9 4v2h11v-2zm0 4v2h4v-2zm6 0v2h1c-.044949-.094701-.088906-.20229-.125-.3418-.077717-.30039-.10439-.81722.16406-1.293.081489-.1441.18202-.26127.28906-.36523zm-6 4v2h8.2812c-.066517-.011548-.1231-.014758-.20117-.037109-.30195-.08645-.76491-.33245-1.0352-.80664-.23366-.4121-.24101-.84933-.18945-1.1562z" fill="#e0e0e0"/><path d="m12.216 8.598a.53334 3.2001 0 0 0 -.50976 2.2754 3.2001.53334 30 0 0 -2.2656-.71484 3.2001.53334 30 0 0 1.75 1.6016.53334 3.2001 60 0 0 -1.7461 1.5996.53334 3.2001 60 0 0 2.2578-.71094.53334 3.2001 0 0 0 .51367 2.3496.53334 3.2001 0 0 0 .51367-2.3516 3.2001.53334 30 0 0 2.2539.71094 3.2001.53334 30 0 0 -1.7441-1.5977.53334 3.2001 60 0 0 1.748-1.5996.53334 3.2001 60 0 0 -2.2617.71484.53334 3.2001 0 0 0 -.50977-2.2773z" fill="#cea4f1" stroke-width="1.0667"/></svg>
diff --git a/editor/icons/RichTextLabel.svg b/editor/icons/RichTextLabel.svg
new file mode 100644
index 0000000000..7283d3dd62
--- /dev/null
+++ b/editor/icons/RichTextLabel.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h8v-2zm12 0-3 3h2v8h-2l3 3 3-3h-2v-8h2zm-12 4v2h2v-2zm4 0v2h4v-2zm-4 4v2h8v-2zm0 4v2h4v-2zm6 0v2h2v-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/RigidBody2D.svg b/editor/icons/RigidBody2D.svg
new file mode 100644
index 0000000000..9dc626b94e
--- /dev/null
+++ b/editor/icons/RigidBody2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 1.2227 3.9531 7 7 0 0 0 .30273.4082c.000785-.00256.0011667-.005252.0019532-.007812a7 7 0 0 0 5.4727 2.6465 7 7 0 0 0 3.2422-.80273c.001375.000393.002531.00156.003906.001953a7 7 0 0 0 .035156-.021485 7 7 0 0 0 .42578-.25 7 7 0 0 0 .16992-.10352 7 7 0 0 0 .36914-.26953 7 7 0 0 0 .20508-.15625 7 7 0 0 0 .3418-.30859 7 7 0 0 0 .16406-.1543 7 7 0 0 0 .33008-.36133 7 7 0 0 0 .14062-.16016 7 7 0 0 0 .27734-.37305 7 7 0 0 0 .13867-.19531 7 7 0 0 0 .21875-.36133 7 7 0 0 0 .14258-.25 7 7 0 0 0 .15625-.33398 7 7 0 0 0 .13867-.31055 7 7 0 0 0 .10742-.30859 7 7 0 0 0 .11914-.35352 7 7 0 0 0 .087891-.36914 7 7 0 0 0 .066406-.29297 7 7 0 0 0 .056641-.40039 7 7 0 0 0 .037109-.3125 7 7 0 0 0 .025391-.55273 7 7 0 0 0 -4.3926-6.4922 7 7 0 0 0 -.001953 0 7 7 0 0 0 -.66016-.22852 7 7 0 0 0 -.0058594-.0019531 7 7 0 0 0 -.55078-.13086 7 7 0 0 0 -.14062-.03125 7 7 0 0 0 -.55078-.072266 7 7 0 0 0 -.14258-.017578 7 7 0 0 0 -.55469-.025391zm1.9512 1.334a6 6 0 0 1 4.0488 5.666h-7a2 2 0 0 0 -.94922-1.6992c1.3464-2.0289 2.6038-3.2631 3.9004-3.9668zm-6.8281 2.1797c.14632.65093.35776 1.2833.68359 1.8848a2 2 0 0 0 -.80664 1.6016h-1a6 6 0 0 1 1.123-3.4863zm1.877 1.4863a2 2 0 0 0 -.10938.0039062 2 2 0 0 1 .10938-.0039062zm-.18945.011719a2 2 0 0 0 -.12109.013672 2 2 0 0 1 .12109-.013672zm-.44141.09375a2 2 0 0 0 -.056641.019531 2 2 0 0 1 .056641-.019531zm-1.3594 2.0605a2 2 0 0 0 .013672.11914 2 2 0 0 1 -.013672-.11914zm.027344.20898a2 2 0 0 0 .017578.080078 2 2 0 0 1 -.017578-.080078zm.73438 1.1992a2 2 0 0 0 1.2285.42578 2 2 0 0 0 1.0508-.30078c1.345 2.0268 2.6013 3.2645 3.8965 3.9688a6 6 0 0 1 -1.9473.33203 6 6 0 0 1 -5.0547-2.7695c.23771-.5785.50336-1.1403.82617-1.6563z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/RigidBody3D.svg b/editor/icons/RigidBody3D.svg
new file mode 100644
index 0000000000..476bf3966a
--- /dev/null
+++ b/editor/icons/RigidBody3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 .035156.69922 7 7 0 0 0 .27734 1.3691 7 7 0 0 0 .91016 1.8848 7 7 0 0 0 .30273.4082c.000785-.00256.0011667-.005252.0019532-.007812a7 7 0 0 0 5.4727 2.6465 7 7 0 0 0 3.2422-.80273c.001374.000393.002531.00156.003906.001953a7 7 0 0 0 .035156-.021485 7 7 0 0 0 .42578-.25 7 7 0 0 0 .16992-.10352 7 7 0 0 0 .36914-.26953 7 7 0 0 0 .20508-.15625 7 7 0 0 0 .3418-.30859 7 7 0 0 0 .16406-.1543 7 7 0 0 0 .33008-.36133 7 7 0 0 0 .14062-.16016 7 7 0 0 0 .27734-.37305 7 7 0 0 0 .13867-.19531 7 7 0 0 0 .21875-.36133 7 7 0 0 0 .14258-.25 7 7 0 0 0 .15625-.33398 7 7 0 0 0 .13867-.31055 7 7 0 0 0 .10742-.30859 7 7 0 0 0 .11914-.35352 7 7 0 0 0 .087891-.36914 7 7 0 0 0 .066406-.29297 7 7 0 0 0 .056641-.40039 7 7 0 0 0 .037109-.3125 7 7 0 0 0 .025391-.55273 7 7 0 0 0 -4.3848-6.4883 7 7 0 0 0 -.007812-.0039063 7 7 0 0 0 -.001953 0 7 7 0 0 0 -.61523-.21289 7 7 0 0 0 -.044922-.015625 7 7 0 0 0 -.0058594-.0019531 7 7 0 0 0 -.55078-.13086 7 7 0 0 0 -.14062-.03125 7 7 0 0 0 -.55078-.072266 7 7 0 0 0 -.14258-.017578 7 7 0 0 0 -.55469-.025391zm1.9512 1.334a6 6 0 0 1 4.0488 5.666h-7a2 2 0 0 0 -.94922-1.6992c1.3464-2.0289 2.6038-3.2631 3.9004-3.9668zm-6.8281 2.1797c.14632.65093.35776 1.2833.68359 1.8848a2 2 0 0 0 -.80664 1.6016h-1a6 6 0 0 1 1.123-3.4863zm1.877 1.4863a2 2 0 0 0 -.10938.0039062 2 2 0 0 1 .10938-.0039062zm-.18945.011719a2 2 0 0 0 -.12109.013672 2 2 0 0 1 .12109-.013672zm-.44141.09375a2 2 0 0 0 -.056641.019531 2 2 0 0 1 .056641-.019531zm-1.3594 2.0605a2 2 0 0 0 .013672.11914 2 2 0 0 1 -.013672-.11914zm.027344.20898a2 2 0 0 0 .017578.080078 2 2 0 0 1 -.017578-.080078zm.73438 1.1992a2 2 0 0 0 1.2285.42578 2 2 0 0 0 1.0508-.30078c1.345 2.0268 2.6013 3.2645 3.8965 3.9688a6 6 0 0 1 -1.9473.33203 6 6 0 0 1 -5.0547-2.7695c.23771-.5785.50336-1.1403.82617-1.6563z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Room.svg b/editor/icons/Room.svg
new file mode 100644
index 0000000000..6491d0409c
--- /dev/null
+++ b/editor/icons/Room.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm1.0371 2.6172 4 2v3.7637l-4-2zm-1 5.5 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/RoomBounds.svg b/editor/icons/RoomBounds.svg
new file mode 100644
index 0000000000..66901d7895
--- /dev/null
+++ b/editor/icons/RoomBounds.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h1v-1h1v-1zm12 0v1h1v1h1v-2zm-5.0371.00195c-.14254.00487-.28238.04016-.41016.10352l-6 3c-.33878.16944-.55276.51574-.55273.89453v6c-.00002576.37879.21395.72509.55273.89453l6 3c.28156.14078.61297.14078.89453 0l6-3c.33878-.16944.55276-.51574.55273-.89453v-6c.000026-.37879-.21395-.72509-.55273-.89453l-6-3c-.15022-.074574-.31679-.11017-.48438-.10352zm1.0371 2.6172 4 2v3.7637l-4-2zm-1 5.5 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828zm-7 3.8809v2h2v-1h-1v-1zm13 0v1h-1v1h2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/RootMotionView.svg b/editor/icons/RootMotionView.svg
new file mode 100644
index 0000000000..f2d23e5b9f
--- /dev/null
+++ b/editor/icons/RootMotionView.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="8" cy="8" gradientTransform="matrix(.85714281 -.00000007 .00000004 .85714284 1.142858 1.142858)" gradientUnits="userSpaceOnUse" r="7"><stop offset="0" stop-color="#fc9c9c"/><stop offset=".83333331" stop-color="#fc9c9c" stop-opacity=".701961"/><stop offset="1" stop-color="#fc9c9c" stop-opacity="0"/></radialGradient><path d="m5 2v3h-3v2h3v2h-3v2h3v3h2v-3h2v3h2v-3h3v-2h-3v-2h3v-2h-3v-3h-2v3h-2v-3zm2 5h2v2h-2z" fill="url(#a)"/></svg>
diff --git a/editor/icons/Rotate0.svg b/editor/icons/Rotate0.svg
new file mode 100644
index 0000000000..670a6f09c3
--- /dev/null
+++ b/editor/icons/Rotate0.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm1 2.1016a5 5 0 0 1 4 4.8984 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 4-4.8945v5.8945h2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Rotate180.svg b/editor/icons/Rotate180.svg
new file mode 100644
index 0000000000..fdd0882fba
--- /dev/null
+++ b/editor/icons/Rotate180.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.8541 0-7 3.1459-7 7 0 3.8542 3.1459 7 7 7s7-3.1458 7-7c0-3.8541-3.1459-7-7-7zm0 2v10c-2.7733 0-5-2.2267-5-5 0-2.7732 2.2267-5 5-5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Rotate270.svg b/editor/icons/Rotate270.svg
new file mode 100644
index 0000000000..7ffd43d147
--- /dev/null
+++ b/editor/icons/Rotate270.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2v5h-5a5 5 0 0 1 5-5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Rotate90.svg b/editor/icons/Rotate90.svg
new file mode 100644
index 0000000000..ef4d631df6
--- /dev/null
+++ b/editor/icons/Rotate90.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.8541 0-7 3.1459-7 7 0 3.8542 3.1459 7 7 7 3.7179 0 6.7102-2.9486 6.9219-6.6152a1 1 0 0 0 .078125-.38477 1 1 0 0 0 -.078125-.38867 1 1 0 0 0 -.001953-.0039062c-.21589-3.6627-3.2049-6.6074-6.9199-6.6074zm0 2v5h5c0 2.7733-2.2267 5-5 5s-5-2.2267-5-5c0-2.7732 2.2267-5 5-5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/RotateLeft.svg b/editor/icons/RotateLeft.svg
new file mode 100644
index 0000000000..1200df1dde
--- /dev/null
+++ b/editor/icons/RotateLeft.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg>
diff --git a/editor/icons/RotateRight.svg b/editor/icons/RotateRight.svg
new file mode 100644
index 0000000000..d69e6a7705
--- /dev/null
+++ b/editor/icons/RotateRight.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="matrix(-1 0 0 1 16.026308 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg>
diff --git a/editor/icons/Ruler.svg b/editor/icons/Ruler.svg
new file mode 100644
index 0000000000..2f026ed365
--- /dev/null
+++ b/editor/icons/Ruler.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.2333 4.2333" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v7.5 6.5h14zm3 7 4 4h-4z" fill="#e0e0e0" transform="scale(.26458)"/></svg>
diff --git a/editor/icons/SCsub b/editor/icons/SCsub
index b39c74c66a..dd4243d750 100644
--- a/editor/icons/SCsub
+++ b/editor/icons/SCsub
@@ -1,21 +1,26 @@
#!/usr/bin/env python
-Import('env')
+Import("env")
+
+import os
-from platform_methods import run_in_subprocess
import editor_icons_builders
-make_editor_icons_builder = Builder(action=run_in_subprocess(editor_icons_builders.make_editor_icons_action),
- suffix='.h',
- src_suffix='.svg')
-env['BUILDERS']['MakeEditorIconsBuilder'] = make_editor_icons_builder
+env["BUILDERS"]["MakeEditorIconsBuilder"] = Builder(
+ action=env.Run(editor_icons_builders.make_editor_icons_action, "Generating editor icons header."),
+ suffix=".h",
+ src_suffix=".svg",
+)
# Editor's own icons
icon_sources = Glob("*.svg")
# Module icons
-for module_icons in env.module_icons_paths:
- icon_sources += Glob('#' + module_icons + "/*.svg")
+for path in env.module_icons_paths:
+ if not os.path.isabs(path):
+ icon_sources += Glob("#" + path + "/*.svg") # Built-in.
+ else:
+ icon_sources += Glob(path + "/*.svg") # Custom.
-env.Alias('editor_icons', [env.MakeEditorIconsBuilder('#editor/editor_icons.gen.h', icon_sources)])
+env.Alias("editor_icons", [env.MakeEditorIconsBuilder("#editor/editor_icons.gen.h", icon_sources)])
diff --git a/editor/icons/SampleLibrary.svg b/editor/icons/SampleLibrary.svg
new file mode 100644
index 0000000000..962f7b9413
--- /dev/null
+++ b/editor/icons/SampleLibrary.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.0215 1.002a1.0001 1.0001 0 0 0 -1 .875l-.58984 4.7227-.52344-1.0469a1.0001 1.0001 0 0 0 -.89453-.55273h-2a1.0001 1.0001 0 1 0 0 2h1.3828l1.7227 3.4473a1.0001 1.0001 0 0 0 1.8867-.32227l.58984-4.7227.52344 1.0449a1.0001 1.0001 0 0 0 .89453.55273h3a1.0001 1.0001 0 1 0 0-2h-2.3809l-1.7246-3.4473a1.0001 1.0001 0 0 0 -.88672-.55078zm1.9785 6.998v1 5 1h5c.55228 0 1-.44772 1-1v-5c0-.55228-.44772-1-1-1v4l-1-1-1 1v-4z" fill="#ff8484"/></svg>
diff --git a/editor/icons/Save.svg b/editor/icons/Save.svg
new file mode 100644
index 0000000000..cc99128cb1
--- /dev/null
+++ b/editor/icons/Save.svg
@@ -0,0 +1 @@
+<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-7-1-1l-3-3h-1v5 1h-8zm1 0v5h3v-5zm4 8c1.1046 0 2 .89543 2 2 0 1.1046-.89543 2-2 2s-2-.89543-2-2c0-1.1046.89543-2 2-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Script.svg b/editor/icons/Script.svg
new file mode 100644
index 0000000000..2a47c67def
--- /dev/null
+++ b/editor/icons/Script.svg
@@ -0,0 +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="m6 1v1a1 1 0 0 0 -1 1v10h-1v-2h-2v2a1 1 0 0 0 .5.86523 1 1 0 0 0 .5.13477v1h7a2 2 0 0 0 2-2v-8h3v-2a2 2 0 0 0 -2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/></g></svg>
diff --git a/editor/icons/ScriptCreate.svg b/editor/icons/ScriptCreate.svg
new file mode 100644
index 0000000000..91e95eb8c7
--- /dev/null
+++ b/editor/icons/ScriptCreate.svg
@@ -0,0 +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="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h5 1v-1h-1v-4h2v-2h2v-3h3v-2c0-1.1046-.89543-2-2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/><path d="m13 1049.4h2v-2h-2v-2h-2v2h-2v2h2v2h2z" fill="#84ffb1" fill-rule="evenodd"/></g></svg>
diff --git a/editor/icons/ScriptCreateDialog.svg b/editor/icons/ScriptCreateDialog.svg
new file mode 100644
index 0000000000..b62891faea
--- /dev/null
+++ b/editor/icons/ScriptCreateDialog.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm5.5722656 1h3.9980464a1.1426143 1.1426143 0 0 1 1.142579 1.1425781v1.1425781h-1.712891-2.2851562v-.5703124-.5722657c0-.6310659-.5115295-1.1425781-1.1425782-1.1425781zm0 .5722656c.3155215 0 .5703125.254791.5703125.5703125v.5722657.5703124.5722657h.5722657 2.2851562v3.9980471a1.1426143 1.1426143 0 0 1 -1.1425781 1.142578h-4c.6310487 0 1.1425781-.511529 1.1425781-1.142578v-5.7128909c0-.0785019.01823-.1545692.046875-.2226562v-.0019531c.02868-.0672829.0683226-.1266374.1191406-.1777344.00097-.00096.0029352-.0010048.0039063-.0019532.0513303-.0508898.1121075-.0944618.1796875-.1230468.0683505-.028909.1437752-.0429688.2226562-.0429688zm-2.2851562 5.1406254h1.1425781v1.142578c0 .315522-.2567441.572265-.5722656.572265-.0776611 0-.15125-.016852-.21875-.044922-.00206-.000799-.0038594-.003049-.0058594-.003906-.0656506-.028192-.1236101-.067817-.1738281-.117187a.57130715.57130715 0 0 1 -.0097656-.009766c-.0490902-.050487-.0893425-.107988-.1171876-.173828-.028908-.06835-.0449218-.143776-.0449218-.222656z"/><circle cx="-23.915255" cy="3.118624" r="0"/></g></svg>
diff --git a/editor/icons/ScriptExtend.svg b/editor/icons/ScriptExtend.svg
new file mode 100644
index 0000000000..5aa39e21a9
--- /dev/null
+++ b/editor/icons/ScriptExtend.svg
@@ -0,0 +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="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h7c.73866 0 1.3763-.40437 1.7227-1h-3.7227v-4h4v-5h3v-2c0-1.1046-.89543-2-2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/><path d="m16 1048.4-3-3v2h-4v2h4v2z" fill="#68b6ff" fill-rule="evenodd"/></g></svg>
diff --git a/editor/icons/ScriptRemove.svg b/editor/icons/ScriptRemove.svg
new file mode 100644
index 0000000000..b455583a6c
--- /dev/null
+++ b/editor/icons/ScriptRemove.svg
@@ -0,0 +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="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h5.6348l-1.584-1.584 1.4141-1.4141-1.4141-1.416 3.5352-3.5352 1.4141 1.4141v-.46484-3h3v-2c0-1.1046-.89543-2-2-2h-7z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/><path d="m13.414 1048.4 1.4142-1.4142-1.4142-1.4142-1.4142 1.4142-1.4142-1.4142-1.4142 1.4142 1.4142 1.4142-1.4142 1.4142 1.4142 1.4142 1.4142-1.4142 1.4142 1.4142 1.4142-1.4142z" fill="#ff8484" fill-rule="evenodd"/></g></svg>
diff --git a/editor/icons/ScrollContainer.svg b/editor/icons/ScrollContainer.svg
new file mode 100644
index 0000000000..600590684d
--- /dev/null
+++ b/editor/icons/ScrollContainer.svg
@@ -0,0 +1 @@
+<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 2h10v10h-10zm5 1-2 2h4zm2 2v4l2-2zm0 4h-4l2 2zm-4 0v-4l-2 2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Search.svg b/editor/icons/Search.svg
new file mode 100644
index 0000000000..fff4a3cb19
--- /dev/null
+++ b/editor/icons/Search.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.7539-.83203l4.3164 4.3164 1.4141-1.4141-4.3164-4.3164a5 5 0 0 0 .83203-2.7539 5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3 3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/SegmentShape2D.svg b/editor/icons/SegmentShape2D.svg
new file mode 100644
index 0000000000..3fcbd78625
--- /dev/null
+++ b/editor/icons/SegmentShape2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 12-12" style="fill:none;stroke:#68b6ff;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/Shader.svg b/editor/icons/Shader.svg
new file mode 100644
index 0000000000..33479326d4
--- /dev/null
+++ b/editor/icons/Shader.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v12c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-8l-5-5zm1 2h6v3c0 .554.44599 1 1 1h3v6h-10z" fill="#e0e0e0"/><path d="m10 11h2v1h-2z" fill="#9f70ff"/><path d="m4 6h2v1h-2z" fill="#ffeb70"/><path d="m8 8h4v1h-4z" fill="#9dff70"/><path d="m7 6h1v1h-1z" fill="#70deff"/><path d="m4 11h5v1h-5z" fill="#ff70ac"/><path d="m4 4h3v1h-3z" fill="#ff7070"/><path d="m4 8h3v1h-3z" fill="#70ffb9"/></svg>
diff --git a/editor/icons/ShaderGlobalsOverride.svg b/editor/icons/ShaderGlobalsOverride.svg
new file mode 100644
index 0000000000..3a4e4cfb2c
--- /dev/null
+++ b/editor/icons/ShaderGlobalsOverride.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v12c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-8l-5-5zm1 2h6v3c0 .554.44599 1 1 1h3v6h-10zm1 1v1h3v-1zm0 2v1h2v-1zm3 0v1h1v-1zm-2 3 3 3 3-3z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ShaderMaterial.svg b/editor/icons/ShaderMaterial.svg
new file mode 100644
index 0000000000..ff92f0c376
--- /dev/null
+++ b/editor/icons/ShaderMaterial.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v1h2 6 3l-2-2z" fill="#ff7070"/><path d="m1 3v2h2v-2zm8 0v2h5l-2-2z" fill="#ffeb70"/><path d="m1 5v2h2v-2zm8 0v1c0 .554.44599 1 1 1h3 2v-1l-1-1z" fill="#9dff70"/><path d="m1 7v2h2v-2zm12 0v2h2v-2z" fill="#70ffb9"/><path d="m1 9v2h2v-2zm12 0v2h2v-2z" fill="#70deff"/><path d="m1 13v1c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-1h-2-10z" fill="#ff70ac"/><path d="m1 11v2h2v-2zm12 0v2h2v-2z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/Shortcut.svg b/editor/icons/Shortcut.svg
new file mode 100644
index 0000000000..4ef16f0401
--- /dev/null
+++ b/editor/icons/Shortcut.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 2c-.55228 0-1 .4477-1 1v9.084c.0004015.506.448.91602 1 .91602h8c.552 0 .9996-.41002 1-.91602v-9.084c0-.5523-.44772-1-1-1zm-3 2v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-9h-1v9a.99998.99998 0 0 1 -1 1h-10a1 1 0 0 1 -1-1v-9zm6 0h3l-1 3h2l-4 4 1-3h-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Signal.svg b/editor/icons/Signal.svg
new file mode 100644
index 0000000000..91599ffd65
--- /dev/null
+++ b/editor/icons/Signal.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 3v10h2 4v-2h-4v-6h4v-2h-4zm9 1v3h-5v2h5v3l2.5-2 2.5-2-2.5-2z" fill="#ff8484"/></svg>
diff --git a/editor/icons/Signals.svg b/editor/icons/Signals.svg
new file mode 100644
index 0000000000..f3bdd7be14
--- /dev/null
+++ b/editor/icons/Signals.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c4.4301 0 8 3.5699 8 8a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-5.511-4.489-10-10-10zm0 4a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c2.221 0 4 1.779 4 4a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-3.3018-2.6981-6-6-6zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/SignalsAndGroups.svg b/editor/icons/SignalsAndGroups.svg
new file mode 100644
index 0000000000..319163a019
--- /dev/null
+++ b/editor/icons/SignalsAndGroups.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0c-.55228 0-1 .4477-1 1s.44772 1 1 1c4.4301 0 8 3.5699 8 8 0 .5523.44772 1 1 1s1-.4477 1-1c0-5.511-4.489-10-10-10zm0 4c-.55228 0-1 .4477-1 1s.44772 1 1 1c2.221 0 4 1.779 4 4 0 .5523.44772 1 1 1s1-.4477 1-1c0-3.3018-2.6981-6-6-6zm-5 4a1.0001 1.0001 0 0 0 -1 1v6a1.0001 1.0001 0 0 0 1 1h6a1.0001 1.0001 0 0 0 1-1v-6a1.0001 1.0001 0 0 0 -1-1zm1 2h4v4h-4z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Skeleton2D.svg b/editor/icons/Skeleton2D.svg
new file mode 100644
index 0000000000..b34a2a9dca
--- /dev/null
+++ b/editor/icons/Skeleton2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.4531v3.5469a2 2 0 0 0 1 1.7324 2 2 0 0 0 1 .26562v.001953h4v-.001953a2 2 0 0 0 1-.26562 2 2 0 0 0 1-1.7324v-3.5469a4 4 0 0 0 2-3.4531 4 4 0 0 0 -4-4zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-4 2h2v1h-2zm-2 2h1v1h1v-1h1 1v1h1v-1h1v.86719 3.1328h-1v-1h-1v1h-1-1v-1h-1v1h-1v-3.1309-.86914z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/Skeleton3D.svg b/editor/icons/Skeleton3D.svg
new file mode 100644
index 0000000000..e0780dedd6
--- /dev/null
+++ b/editor/icons/Skeleton3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.4531v3.5469a2 2 0 0 0 1 1.7324 2 2 0 0 0 1 .26562v.001953h4v-.001953a2 2 0 0 0 1-.26562 2 2 0 0 0 1-1.7324v-3.5469a4 4 0 0 0 2-3.4531 4 4 0 0 0 -4-4zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-4 2h2v1h-2zm-2 2h1v1h1v-1h1 1v1h1v-1h1v.86719 3.1328h-1v-1h-1v1h-1-1v-1h-1v1h-1v-3.1309-.86914z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/SkeletonIK3D.svg b/editor/icons/SkeletonIK3D.svg
new file mode 100644
index 0000000000..45697a1b42
--- /dev/null
+++ b/editor/icons/SkeletonIK3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.4531v3.5469a2 2 0 0 0 1 1.7324 2 2 0 0 0 1 .26562v.001953h4v-.001953a2 2 0 0 0 1-.26562 2 2 0 0 0 1-1.7324v-3.5469a4 4 0 0 0 2-3.4531 4 4 0 0 0 -4-4zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-4 2h2v1h-2zm-2 2h1v1h1v-1h1 1v1h1v-1h1v.86719 3.1328h-1v-1h-1v1h-1-1v-1h-1v1h-1v-3.1309-.86914z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Sky.svg b/editor/icons/Sky.svg
new file mode 100644
index 0000000000..e463c5fc33
--- /dev/null
+++ b/editor/icons/Sky.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1040.4" y2="1050.4"><stop offset="0" stop-color="#1ec3ff"/><stop offset="1" stop-color="#b2e1ff"/></linearGradient><g transform="translate(0 -1037.4)"><path d="m8 1040.4a7 7 0 0 0 -7 7 7 7 0 0 0 .68555 3h12.631a7 7 0 0 0 .68359-3 7 7 0 0 0 -7-7z" fill="url(#a)"/><path d="m10 7c-.554 0-1 .446-1 1h-1c-.554 0-1 .446-1 1s.446 1 1 1h2c.554 0 1-.446 1-1h1c.554 0 1-.446 1-1s-.446-1-1-1zm-7 3c-.554 0-1 .446-1 1s.446 1 1 1h1c.554 0 1-.446 1-1s-.446-1-1-1z" fill="#fff" transform="translate(0 1037.4)"/></g></svg>
diff --git a/editor/icons/SliderJoint3D.svg b/editor/icons/SliderJoint3D.svg
new file mode 100644
index 0000000000..57d22dff6a
--- /dev/null
+++ b/editor/icons/SliderJoint3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-.55228 0-1 .44772-1 1s.44772 1 1 1h3l-7 7v3l12-12zm10 2-12 12h8c.55228 0 1-.44772 1-1s-.44772-1-1-1h-3l7-7z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/Slot.svg b/editor/icons/Slot.svg
new file mode 100644
index 0000000000..ec35be6b51
--- /dev/null
+++ b/editor/icons/Slot.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 3v2h4v6h-4v2h4 2v-10h-2zm-3 1v3h-5v2h5v3l2.5-2 2.5-2-2.5-2z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/Snap.svg b/editor/icons/Snap.svg
new file mode 100644
index 0000000000..8bcf5b3a16
--- /dev/null
+++ b/editor/icons/Snap.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3v2h2v-2zm6 0v2h2v-2zm-6 6v2h2v-2zm4 4v2h2v-2zm6 0v2h2v-2z" fill="#e0e0e0"/><path d="m11 7a4 4 0 0 0 -4 4v2h2v-2a2 2 0 0 1 2-2 2 2 0 0 1 2 2v2h2v-2a4 4 0 0 0 -4-4z" fill="#fff" fill-opacity=".68627"/></svg>
diff --git a/editor/icons/SnapGrid.svg b/editor/icons/SnapGrid.svg
new file mode 100644
index 0000000000..e3aea78162
--- /dev/null
+++ b/editor/icons/SnapGrid.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 0v3h-3v2h3v4h-3v2h3v3h2v-9h9v-2h-3v-3h-2v3h-4v-3zm4 13v2h2v-2zm6 0v2h2v-2z" fill="#e0e0e0"/><path d="m11 7a4 4 0 0 0 -4 4v2h2v-2a2 2 0 0 1 2-2 2 2 0 0 1 2 2v2h2v-2a4 4 0 0 0 -4-4z" fill="#fff" fill-opacity=".68627"/></svg>
diff --git a/editor/icons/SoftBody3D.svg b/editor/icons/SoftBody3D.svg
new file mode 100644
index 0000000000..e46691d6a2
--- /dev/null
+++ b/editor/icons/SoftBody3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1s-3 5 0 7-1 7-1 7h13s3-6 0-8 1-6 1-6zm2 2h7s-2 3 1 5 0 5 0 5h-7s2-4-1-6 0-4 0-4z" fill="#fc9c9c" fill-opacity=".996078"/></svg>
diff --git a/editor/icons/Sort.svg b/editor/icons/Sort.svg
new file mode 100644
index 0000000000..a7f01fd24e
--- /dev/null
+++ b/editor/icons/Sort.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1v2h6v-2zm-5.0156.0019531a1.0001 1.0001 0 0 0 -.69141.29102l-2 2a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l.29297-.29297v7.1719l-.29297-.29297a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2a1 1 0 0 0 0-1.4141 1 1 0 0 0 -1.4141 0l-.29297.29297v-7.1719l.29297.29297a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.72266-.29102zm5.0156 5.998v2h4v-2zm0 6v2h2v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/SphereMesh.svg b/editor/icons/SphereMesh.svg
new file mode 100644
index 0000000000..66cc8e3cc4
--- /dev/null
+++ b/editor/icons/SphereMesh.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.8541 0-7 3.1459-7 7 0 3.8542 3.1459 7 7 7s7-3.1458 7-7c0-3.8541-3.1459-7-7-7zm-1 2.0977v4.8711c-1.2931-.071342-2.6061-.29819-3.9434-.69141.30081-2.0978 1.8852-3.7665 3.9434-4.1797zm2 0c2.0549.41253 3.637 2.0767 3.9414 4.1699-1.3046.36677-2.6158.60259-3.9414.6875zm3.7852 6.2812c-.50864 1.7788-1.9499 3.1531-3.7852 3.5215v-2.9512c1.2792-.072301 2.5419-.26704 3.7852-.57031zm-9.5645.017578c1.2733.31892 2.5337.50215 3.7793.5625v2.9414c-1.8291-.36719-3.266-1.7339-3.7793-3.5039z" fill="#ffd684"/></svg>
diff --git a/editor/icons/SphereShape3D.svg b/editor/icons/SphereShape3D.svg
new file mode 100644
index 0000000000..cc526abcec
--- /dev/null
+++ b/editor/icons/SphereShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" fill="#68b6ff" r="7"/><circle cx="6" cy="5" fill="#a2d2ff" r="2"/></svg>
diff --git a/editor/icons/SpinBox.svg b/editor/icons/SpinBox.svg
new file mode 100644
index 0000000000..a8dc55d8db
--- /dev/null
+++ b/editor/icons/SpinBox.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h7v-2-6-2zm10 1-2 3h4zm-10 1h5v6h-5zm8 4 2 3 2-3z" fill="#a5efac"/></svg>
diff --git a/editor/icons/SpotLight3D.svg b/editor/icons/SpotLight3D.svg
new file mode 100644
index 0000000000..a1dea938a3
--- /dev/null
+++ b/editor/icons/SpotLight3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a1 1 0 0 0 -1 1v3.6934c-1.7861.86608-3 2.4605-3 4.3066h4a2 2 0 0 0 2 2 2 2 0 0 0 2-2h4c0-1.8462-1.2139-3.4406-3-4.3066v-3.6934a1 1 0 0 0 -1-1zm-1.0977 9.6348-1.7324 1 1 1.7305 1.7324-1zm6.1953 0-1 1.7305 1.7324 1 1-1.7305zm-4.0977 2.3652v2h2v-2z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/SpringArm3D.svg b/editor/icons/SpringArm3D.svg
new file mode 100644
index 0000000000..707e408dd9
--- /dev/null
+++ b/editor/icons/SpringArm3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#fc9c9c" stroke-width="2"><path d="m8 14 6-6"/><path d="m2 2 7 7"/><path d="m10 9h-6"/><path d="m9 9v-5"/></g></svg>
diff --git a/editor/icons/Sprite2D.svg b/editor/icons/Sprite2D.svg
new file mode 100644
index 0000000000..faae0e444f
--- /dev/null
+++ b/editor/icons/Sprite2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-2.216 0-4 1.784-4 4v6c0 2.216 1.784 4 4 4h6c2.216 0 4-1.784 4-4v-6c0-2.216-1.784-4-4-4zm-1 5c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm8 0c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm-1.8887 5.1074a1.0001 1.0001 0 0 1 .7168 1.7207c-.74987.74987-1.7676 1.1719-2.8281 1.1719s-2.0783-.422-2.8281-1.1719a1.0001 1.0001 0 0 1 .69727-1.7168 1.0001 1.0001 0 0 1 .7168.30273c.37534.37535.88325.58594 1.4141.58594s1.0387-.21059 1.4141-.58594a1.0001 1.0001 0 0 1 .69727-.30664z" fill="#a5b7f3"/></svg>
diff --git a/editor/icons/Sprite3D.svg b/editor/icons/Sprite3D.svg
new file mode 100644
index 0000000000..4ccd8f9c48
--- /dev/null
+++ b/editor/icons/Sprite3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-2.216 0-4 1.784-4 4v6c0 2.216 1.784 4 4 4h6c2.216 0 4-1.784 4-4v-6c0-2.216-1.784-4-4-4zm-1 5c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm8 0c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm-1.8887 5.1074a1.0001 1.0001 0 0 1 .7168 1.7207c-.74987.74987-1.7676 1.1719-2.8281 1.1719s-2.0783-.422-2.8281-1.1719a1.0001 1.0001 0 0 1 .69727-1.7168 1.0001 1.0001 0 0 1 .7168.30273c.37534.37535.88325.58594 1.4141.58594s1.0387-.21059 1.4141-.58594a1.0001 1.0001 0 0 1 .69727-.30664z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/SpriteFrames.svg b/editor/icons/SpriteFrames.svg
new file mode 100644
index 0000000000..8ab0ec2c00
--- /dev/null
+++ b/editor/icons/SpriteFrames.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.108 0-2 .89199-2 2v6c0 1.108.89199 2 2 2h6c1.108 0 2-.89199 2-2v-6c0-1.108-.89199-2-2-2zm10 0v2h2v-2zm-10 4c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm6 0c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm4 0v2h2v-2zm-9 4h2 2a2 1 0 0 1 -1 .86523 2 1 0 0 1 -2 0 2 1 0 0 1 -1-.86523zm9 0v2h2v-2zm-12 4v2h2v-2zm4 0v2h2v-2zm4 0v2h2v-2zm4 0v2h2v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/SpriteSheet.svg b/editor/icons/SpriteSheet.svg
new file mode 100644
index 0000000000..a162037f99
--- /dev/null
+++ b/editor/icons/SpriteSheet.svg
@@ -0,0 +1 @@
+<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 2h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/StandardMaterial3D.svg b/editor/icons/StandardMaterial3D.svg
new file mode 100644
index 0000000000..aa8bfc9a5b
--- /dev/null
+++ b/editor/icons/StandardMaterial3D.svg
@@ -0,0 +1,11 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+<g transform="translate(0 -1036.4)">
+<path transform="translate(0 1036.4)" d="m7.9629 1.002a1.0001 1.0001 0 0 0 -0.41016 0.10352l-3.7891 1.8945h8.4727l-3.7891-1.8945a1.0001 1.0001 0 0 0 -0.48438 -0.10352z" fill="#ff7070"/>
+<path transform="translate(0 1036.4)" d="m3.7637 3l-2.2109 1.1055a1.0001 1.0001 0 0 0 -0.55273 0.89453h3.2363l3.7637-1.8809 3.7637 1.8809h3.2363a1.0001 1.0001 0 0 0 -0.55273 -0.89453l-2.2109-1.1055h-8.4727z" fill="#ffeb70"/>
+<path transform="translate(0 1036.4)" d="m1 5v2h2v-0.38086l0.76172 0.38086h8.4766l0.76172-0.38086v0.38086h2v-2h-3.2363l-3.7637 1.8828-3.7637-1.8828h-3.2363z" fill="#9dff70"/>
+<path transform="translate(0 1036.4)" d="m1 7v2h2v-2h-2zm2.7617 0l3.2383 1.6191v0.38086h2v-0.38086l3.2383-1.6191h-8.4766zm9.2383 0v2h2v-2h-2z" fill="#70ffb9"/>
+<path transform="translate(0 1036.4)" d="m1 9v2h3.2344l-1.2344-0.61719v-1.3828h-2zm6 0v2h2v-2h-2zm6 0v1.3828l-1.2344 0.61719h3.2344v-2h-2z" fill="#70deff"/>
+<path transform="translate(0 1036.4)" d="m3.7637 13l3.7891 1.8945a1.0001 1.0001 0 0 0 0.48438 0.10547 1.0001 1.0001 0 0 0 0.41016 -0.10547l3.7891-1.8945h-8.4727z" fill="#ff70ac"/>
+<path transform="translate(0 1036.4)" d="m1 11a1.0001 1.0001 0 0 0 0.55273 0.89453l2.2109 1.1055h8.4727l2.2109-1.1055a1.0001 1.0001 0 0 0 0.55273 -0.89453h-3.2344l-2.7656 1.3828v-1.3828h-2v1.3828l-2.7656-1.3828h-3.2344z" fill="#9f70ff"/>
+</g>
+</svg>
diff --git a/editor/icons/StaticBody2D.svg b/editor/icons/StaticBody2D.svg
new file mode 100644
index 0000000000..66940ad415
--- /dev/null
+++ b/editor/icons/StaticBody2D.svg
@@ -0,0 +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="m29 1042.4h1v1h-1z" fill="#fefeff"/><path d="m3 1a2 2 0 0 0 -1.4141.58594 2 2 0 0 0 -.58594 1.4141v10a2 2 0 0 0 .58594 1.4141 2 2 0 0 0 1.4141.58594h10a2 2 0 0 0 2-2v-10a2 2 0 0 0 -2-2h-10zm0 1h10a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-10a1 1 0 0 1 -1-1v-10a1 1 0 0 1 1-1zm0 1v2h2v-2zm8 0v2h2v-2zm-8 8v2h2v-2zm8 0v2h2v-2z" fill="#a5b7f3" fill-opacity=".98824" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/StaticBody3D.svg b/editor/icons/StaticBody3D.svg
new file mode 100644
index 0000000000..a4a641f28c
--- /dev/null
+++ b/editor/icons/StaticBody3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -1.4141.58594 2 2 0 0 0 -.58594 1.4141v10a2 2 0 0 0 .58594 1.4141 2 2 0 0 0 1.4141.58594h10a2 2 0 0 0 2-2v-10a2 2 0 0 0 -2-2h-10zm0 1h10a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-10a1 1 0 0 1 -1-1v-10a1 1 0 0 1 1-1zm0 1v2h2v-2zm8 0v2h2v-2zm-8 8v2h2v-2zm8 0v2h2v-2z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/StatusError.svg b/editor/icons/StatusError.svg
new file mode 100644
index 0000000000..a9639c8749
--- /dev/null
+++ b/editor/icons/StatusError.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7s3.134 7 7 7 7-3.134 7-7-3.134-7-7-7zm-2.8281 2.7578 2.8281 2.8281 2.8281-2.8281 1.4141 1.4141-2.8281 2.8281 2.8281 2.8281-1.4141 1.4141-2.8281-2.8281-2.8281 2.8281-1.4141-1.4141 2.8281-2.8281-2.8281-2.8281 1.4141-1.4141z" fill="#ff5d5d"/></svg>
diff --git a/editor/icons/StatusSuccess.svg b/editor/icons/StatusSuccess.svg
new file mode 100644
index 0000000000..6e7988100f
--- /dev/null
+++ b/editor/icons/StatusSuccess.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7s3.134 7 7 7 7-3.134 7-7-3.134-7-7-7zm3.293 3.877 1.4141 1.4141-5.707 5.709-3.707-3.709 1.4141-1.4141 2.293 2.293z" fill="#45ff8b"/></svg>
diff --git a/editor/icons/StatusWarning.svg b/editor/icons/StatusWarning.svg
new file mode 100644
index 0000000000..52d7e422c7
--- /dev/null
+++ b/editor/icons/StatusWarning.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1 2h2v7h-2zm0 8h2v2h-2z" fill="#ffdd65"/></svg>
diff --git a/editor/icons/Stop.svg b/editor/icons/Stop.svg
new file mode 100644
index 0000000000..2059eab078
--- /dev/null
+++ b/editor/icons/Stop.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1048.4v-8h8v8z" fill="#e0e0e0" fill-rule="evenodd" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/StreamTexture.svg b/editor/icons/StreamTexture.svg
new file mode 100644
index 0000000000..068f65dead
--- /dev/null
+++ b/editor/icons/StreamTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h6v-2h2v-2h-2-5v-8h5v-2zm6 2v2h2v-2zm2 0h2v-2h-2zm2 0v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm0 2h-2v2h2zm-2-4v-2h-2v-1h-1v1h-1v1h-1v1h-1v1h2 2v-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/String.svg b/editor/icons/String.svg
new file mode 100644
index 0000000000..5b7ade8b1e
--- /dev/null
+++ b/editor/icons/String.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 2a3 3 0 0 0 -3 3v2a1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 3-3v-2a1 1 0 0 1 1-1h1v-2zm2 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2zm8 2a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2z" fill="#6ba7ec"/></svg>
diff --git a/editor/icons/StringName.svg b/editor/icons/StringName.svg
new file mode 100644
index 0000000000..bedaa6d634
--- /dev/null
+++ b/editor/icons/StringName.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="12" version="1.1" viewBox="0 0 16 12" xmlns="http://www.w3.org/2000/svg">
+<path d="m5 2c-1.6569 0-3 1.3431-3 3v2c0 0.55228-0.44772 1-1 1h-1v2h1c1.6569 0 3-1.3431 3-3v-2c0-0.55228 0.44772-1 1-1h1v3c0 1.6569 1.3431 3 3 3h3v-4h1c0.55228 0 1 0.44772 1 1v3h2v-3c0-1.6569-1.3431-3-3-3h-5v-2zm3 4h2v2h-1c-0.55228 0-1-0.44772-1-1z" fill="#6ba7ec"/>
+<path d="m10 4v6h2v-4h1c0.55228 0 1 0.44772 1 1v3h2v-3c0-1.6569-1.3431-3-3-3h-1z" fill="#fff" fill-opacity=".39216"/>
+</svg>
diff --git a/editor/icons/StyleBoxEmpty.svg b/editor/icons/StyleBoxEmpty.svg
new file mode 100644
index 0000000000..e1a2bc6888
--- /dev/null
+++ b/editor/icons/StyleBoxEmpty.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v1h2v-2zm3 0v2h2v-2zm4 0v2h2v-2zm4 0v2h2v-1c-.000055-.5523-.44774-.9999-1-1z" fill="#ff7070"/><path d="m1 5v2h2v-2zm12 0v.23242c.31584.1783.57817.43795.75977.75195.19142.33153.43699.67036.69922 1.0156h.54102v-2h-2z" fill="#9dff70"/><path d="m12 7c-.43047.7456-.94451 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2zm2.459 0c.17438.2296.352.46082.54102.69922v-.69922z" fill="#70ffb9"/><path d="m1 9v2h2v-2zm9.5645 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78151-1.31-1.334-2z" fill="#70deff"/><path d="m1 13v1c.0000552.5523.44774.9999 1 1h1v-2zm4 0v2h2v-2zm4.1836 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m9.2305 11c-.13656.32585-.23047.65576-.23047 1 0 .35235.07201.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/StyleBoxFlat.svg b/editor/icons/StyleBoxFlat.svg
new file mode 100644
index 0000000000..b24c453f6b
--- /dev/null
+++ b/editor/icons/StyleBoxFlat.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v1h14v-1c-.000055-.5523-.44774-.9999-1-1z" fill="#ff7070"/><path d="m1 3v2h14v-2z" fill="#ffeb70"/><path d="m1 5v2h8.582c.25686-.33847.49465-.66934.68555-1 .33885-.5859.95103-.96109 1.627-.99609.7512-.04 1.4613.34489 1.8379.99609.18899.32737.42831.66049.68555 1h.58203v-2h-14z" fill="#9dff70"/><path d="m1 7v2h7.0547c.14116-.20345.28508-.40233.42383-.58398.38601-.5053.76348-.96794 1.1035-1.416h-8.582zm11 0c-.43047.7456-.94451 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2zm2.418 0c.18626.24583.37928.49419.58203.75v-.75z" fill="#70ffb9"/><path d="m1 9v2h6.1172c.17955-.78395.54577-1.4354.9375-2zm9.5645 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78151-1.31-1.334-2z" fill="#70deff"/><path d="m1 13v1c.0000552.5523.44774.9999 1 1h6.0371c-.44511-.58388-.76161-1.2639-.91992-2h-6.1172zm8.1836 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m1 11v2h6.1172c-.06966-.3239-.11719-.65596-.11719-1 0-.35655.045474-.68688.11719-1zm8.2305 0c-.13656.32585-.23047.65576-.23047 1 0 .35235.07201.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/StyleBoxLine.svg b/editor/icons/StyleBoxLine.svg
new file mode 100644
index 0000000000..e92f33b7b0
--- /dev/null
+++ b/editor/icons/StyleBoxLine.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.303 1c-.4344 0-.86973.16881-1.2012.50586l-1.4688 1.4941h4.3418c.082839-.52789-.072596-1.0872-.47266-1.4941-.33144-.33705-.76482-.50586-1.1992-.50586z" fill="#ff7070"/><path d="m10.633 3-1.9668 2h4.8008l1.0352-1.0527c.2628-.2673.41824-.60049.47266-.94727h-4.3418z" fill="#ffeb70"/><path d="m8.666 5-1.9648 2h2.8809c.25686-.33847.49465-.66934.68555-1 .33885-.5859.95098-.96109 1.627-.99609.44399-.023642.86385.115 1.2188.35547l.35352-.35938h-4.8008z" fill="#9dff70"/><path d="m1.2617 13c-.08284.52789.072596 1.0872.47266 1.4941.33144.33705.76484.50586 1.1992.50586.4344 0 .8697-.16881 1.2012-.50586l1.4688-1.4941h-4.3418zm7.9219 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m2.7695 11-1.0352 1.0527c-.2628.2673-.41824.60049-.47266.94727h4.3418l1.4238-1.4473c.020288-.18998.04923-.37542.089844-.55273h-4.3477zm6.4609 0c-.13656.32585-.23047.65576-.23047 1 0 .35235.072014.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/><path d="m4.7363 9-1.9668 2h4.3477c.17955-.78395.54577-1.4354.9375-2zm5.8281 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78149-1.31-1.334-2z" fill="#70deff"/><path d="m6.7012 7-1.9648 2h3.3184c.14116-.20345.28508-.40233.42383-.58398.38601-.5053.7635-.96796 1.1035-1.416h-2.8809zm5.2988 0c-.43047.7456-.94456 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2z" fill="#70ffb9"/></svg>
diff --git a/editor/icons/StyleBoxTexture.svg b/editor/icons/StyleBoxTexture.svg
new file mode 100644
index 0000000000..89bbc41ef8
--- /dev/null
+++ b/editor/icons/StyleBoxTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v1h2 10 2v-1a1.0001 1.0001 0 0 0 -1-1z" fill="#ff7070"/><path d="m1 3v2h2v-2zm12 0v2h2v-2zm-4 1v1h1v-1z" fill="#ffeb70"/><path d="m1 5v2h2v-2zm7 0v1h-2v1h3.543c.26215-.34438.50373-.68039.69727-1.0156a2.0315 2.0315 0 0 1 .75977-.75195v-.23242h-1-1-1zm5 0v.23242a2.0315 2.0315 0 0 1 .75977.75195c.19142.33153.43699.67033.69922 1.0156h.54102v-2h-2z" fill="#9dff70"/><path d="m1 7v2h2v-2zm4 0v1h-1v1h4.0156c.14585-.2113.29419-.41592.4375-.60352.38121-.49904.75394-.95521 1.0898-1.3965h-3.543-1zm7 0c-.43047.7456-.94451 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2zm2.459 0c.17438.22962.352.46082.54102.69922v-.69922z" fill="#70ffb9"/><path d="m1 9v2h2v-2zm9.5645 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78151-1.31-1.334-2z" fill="#70deff"/><path d="m1 13v1a1.0001 1.0001 0 0 0 1 1h5.998c-.4429-.5864-.77294-1.2592-.92578-2h-4.0723-2zm8.1836 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m1 11v2h2v-2zm8.2305 0c-.13656.32585-.23047.65576-.23047 1 0 .35235.07201.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/></svg>
diff --git a/editor/icons/SubViewport.svg b/editor/icons/SubViewport.svg
new file mode 100644
index 0000000000..1e17ae234f
--- /dev/null
+++ b/editor/icons/SubViewport.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-.5304.0000801-1.0390625.2108475-1.4140625.5859375-.37509.37501-.5858575.8836225-.5859375 1.4140625v8c.0000803.5304.2108475 1.039063.5859375 1.414062.37501.375091.8836225.585858 1.4140625.585938h10c1.1046 0 2-.89543 2-2v-8c0-1.1046-.89543-2-2-2zm0 1h10c.55228.0000096.99999.44772 1 1v8c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-8c.0000096-.55228.44772-.99999 1-1zm3 1c-.5304.0001-1.0390625.2108375-1.4140625.5859375-.37509.375-.5858575.8836225-.5859375 1.4140625v4c.00008.5304.2108475 1.039062.5859375 1.414062.37501.3751.8836225.585838 1.4140625.585938h4c1.1046 0 2-.8954 2-2v-4c0-1.1046-.89543-2-2-2zm0 1h4c.55228 0 .99999.4477 1 1v4c-.00001.5523-.44772 1-1 1h-4c-.55228 0-.99999-.4477-1-1v-4c.00001-.5523.44772-1 1-1z" fill="#e0e0e0" fill-opacity=".996078"/></svg>
diff --git a/editor/icons/SubViewportContainer.svg b/editor/icons/SubViewportContainer.svg
new file mode 100644
index 0000000000..baf80e5086
--- /dev/null
+++ b/editor/icons/SubViewportContainer.svg
@@ -0,0 +1 @@
+<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 2h10v10h-10zm3 1c-.5304.0001-1.0391.21084-1.4141.58594-.37509.375-.58586.88366-.58594 1.4141v4c.00008.5304.21085 1.0391.58594 1.4141.37501.3751.88366.58584 1.4141.58594h4c1.1046 0 2-.8954 2-2v-4c0-1.1046-.89543-2-2-2zm0 1h4c.55228 0 .99999.4477 1 1v4c-.00001.5523-.44772 1-1 1h-4c-.55228 0-.99999-.4477-1-1v-4c.00001-.5523.44772-1 1-1z" fill="#a5efac"/></svg>
diff --git a/editor/icons/TabContainer.svg b/editor/icons/TabContainer.svg
new file mode 100644
index 0000000000..aeb5507279
--- /dev/null
+++ b/editor/icons/TabContainer.svg
@@ -0,0 +1 @@
+<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 2h5v2 2h5v6h-10zm7 0h3v2h-3z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Tabs.svg b/editor/icons/Tabs.svg
new file mode 100644
index 0000000000..4fd4a5cd80
--- /dev/null
+++ b/editor/icons/Tabs.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 4c-1.108 0-1.8178.9071-2 2l-1 6h-1v2h4 6 4v-2h-2l-1-6c-.18216-1.0929-.89199-2-2-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/TestCube.svg b/editor/icons/TestCube.svg
new file mode 100644
index 0000000000..bdfb3c893b
--- /dev/null
+++ b/editor/icons/TestCube.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm.037109 2.1172 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828zm-5 3.5 4 2v3.7637l-4-2zm10 0v3.7637l-4 2v-3.7637z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd" transform="translate(0 .000012)"/></svg>
diff --git a/editor/icons/TextEdit.svg b/editor/icons/TextEdit.svg
new file mode 100644
index 0000000000..366cf6596d
--- /dev/null
+++ b/editor/icons/TextEdit.svg
@@ -0,0 +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="m29 1042.4h1v1h-1z" fill="#fefeff"/><path d="m3 1c-1.1046 0-2 .8954-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-10c0-1.1046-.89543-2-2-2zm0 2h10v10h-10zm1 1v4h1v-4z" fill="#a5efac" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/TextFile.svg b/editor/icons/TextFile.svg
new file mode 100644
index 0000000000..f480217dcd
--- /dev/null
+++ b/editor/icons/TextFile.svg
@@ -0,0 +1 @@
+<svg enable-background="new" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.370548 12.198712 1.078638-.0225c-.004-.738576-.008-1.477152-.01198-2.215728-1.429703.011985-2.859406.02397-4.289109.035955.004.759672.008 1.519344.01198 2.279016.40349-.01135.806981-.02271 1.210471-.03406v3.755044h2m-7.2700003-3.749287c.332722.21587.665444.431741.998166.647611-.3328629.218648-.6657258.437297-.9985887.655945-.0000001.818044-.0000002 1.636088-.0000003 2.454132.5662705-.533749 1.1325409-1.067498 1.6988114-1.601247.6353035.532396 1.2706071 1.064791 1.9059106 1.597187-.00095-.757409-.0019-1.514817-.00285-2.272226-.2987204-.278501-.5974407-.557002-.8961611-.835503.2983766-.205775.5967531-.41155.8951297-.617325.00283-.73844.00565-1.476881.00848-2.215321-.63732.474447-1.27464.948893-1.91196 1.42334-.5656447-.504299-1.1312895-1.008599-1.6969342-1.5128982m-1.4606388 2.2314242c.3595459-.0075.7190917-.015 1.0786376-.0225-.00399-.738576-.00799-1.477152-.011985-2.2157276-1.4297028.011985-2.8594057.02397-4.2891085.035955.00399.7596716.00799 1.5193436.011985 2.2790156.4034903-.01135.8069806-.02271 1.2104709-.03406v3.755044h2m2.3600877-14.999998c-.18815.7526-.3763 1.5052-.56445 2.2578-.3833928.1379205-.7411891.4041566-1.0765556.0469548-.5337315-.3203516-1.0674629-.6407032-1.6011944-.9610548-.4713667.4713667-.9427333.9427333-1.4141 1.4141.3984333.6647.7968667 1.3294 1.1953 1.9941-.1706946.369732-.2331288.8106877-.7232054.7948719-.6052849.1510593-1.2105697.3021187-1.8158546.4531781v2h5.2715c-.6869282-1.0800497-.0133438-2.6625661 1.2286888-2.9370347 1.2082391-.3582 2.5455142.6777799 2.4998312 1.9370347.104409.4657408-.6052318 1.1778026.181951 1h4.818019c0-.6666667 0-1.3333333 0-2-.7526-.18815-1.5052-.3763-2.2578-.56445-.138671-.3826756-.40361-.7396543-.047118-1.0747035.320406-.5343322.640812-1.0686643.961218-1.6029965-.471367-.4713667-.942733-.9427333-1.4141-1.4141-.6647.3984333-1.3294.7968667-1.9941 1.1953-.3697319-.1706947-.8106877-.2331288-.7948719-.7232054-.1510593-.6052849-.3021187-1.2105697-.4531781-1.8158546-.6666322.00004002-1.3334865-.00008002-1.99998.00006z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Texture3D.svg b/editor/icons/Texture3D.svg
new file mode 100644
index 0000000000..6bdc599f6d
--- /dev/null
+++ b/editor/icons/Texture3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2 1c-.5522847 0-1 .4477153-1 1v12c0 .552285.4477153 1 1 1h12c.552285 0 1-.447715 1-1v-12c0-.5522847-.447715-1-1-1zm1 2h10v8h-10z" fill-opacity=".99608" transform="translate(.359546 -.287637)"/><g fill-opacity=".996078" stroke-width=".203212" transform="scale(.9167105 1.0908569)"><path d="m5.8175194 8.9717502q-.2194689 0-.4633233-.032514-.2438544-.0243854-.4714519-.0731562-.2275974-.0487709-.4145524-.1056703-.1869551-.0568993-.2926253-.1056702l.2357259-1.0079315q.2113405.089413.5364797.1950835.3332677.097542.8209765.097542.5608651 0 .8209764-.2113404.2601114-.2113405.2601114-.5689936 0-.219469-.097542-.3657816-.089413-.1544415-.2519826-.2438547-.1625696-.0975418-.3901671-.1300557-.2194689-.0406424-.4714518-.0406424h-.4714519v-.9754176h.5364797q.1788266 0 .3413962-.032514.1706981-.032514.3007537-.1056703.1300557-.081285.203212-.2113404.081285-.1381842.081285-.3413962 0-.1544411-.065028-.2682398-.0650278-.1137987-.1706981-.186955-.0975417-.0731563-.2357259-.1056702-.1300557-.0406424-.2682398-.0406424-.3495247 0-.6502784.1056702-.2926253.1056703-.5364797.2601114l-.4308095-.8860043q.1300557-.0812848.3007538-.1706981.1788266-.0894133.390167-.1625696.2113405-.0731563.4470664-.1219272.2438544-.048771.5120943-.048771.4958373 0 .8534904.1219272.3657816.1137987.6015075.3332677.2357259.2113405.3495246.5039657.1137987.2844968.1137987.625893 0 .3332677-.186955.6502784-.186955.3088822-.5039657.4714518.4389379.1788266.6746638.5364797.2438544.3495246.2438544.8453619 0 .3901671-.1300557.7234347-.1300557.3251393-.406424.5689937-.2763683.235726-.7071777.3739101-.422681.1300557-1.0079316.1300557z"/><path d="m10.502445 7.817506q.08941.00813.203212.016257.121927 0 .284497 0 .951032 0 1.406227-.4795803.463323-.4795803.463323-1.3249422 0-.8860044-.438938-1.3411992-.438938-.4551949-1.38997-.4551949-.130055 0-.26824.00813-.138184 0-.260111.016257zm3.665945-1.7882655q0 .7315631-.227598 1.2761713-.227597.5446082-.650278.9022613-.414553.3576531-1.01606.5364797-.601508.1788265-1.349328.1788265-.341396 0-.796591-.032514-.4551948-.0243853-.8941328-.1137986v-5.486724q.438938-.081285.9103898-.1056702.47958-.032514.820976-.032514.723435 0 1.308686.1625696.593379.1625696 1.01606.5120943.422681.3495246.650278.8941328.227598.5446081.227598 1.3086853z"/></g></g></svg>
diff --git a/editor/icons/TextureArray.svg b/editor/icons/TextureArray.svg
new file mode 100644
index 0000000000..86d4875e12
--- /dev/null
+++ b/editor/icons/TextureArray.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2 1c-.5522847 0-1 .4477153-1 1v12c0 .552285.4477153 1 1 1h12c.552285 0 1-.447715 1-1v-12c0-.5522847-.447715-1-1-1zm1 2h10v8h-10z" fill-opacity=".99608" transform="translate(.359546 -.287637)"/><g fill-opacity=".996078" stroke-width=".207395" transform="matrix(1.6197742 0 0 .750929 -3.723153 1.832957)"><path d="m4.7302951 2.4553483h2.2481639v.9872012h-1.0701592v6.0559397h1.0701592v.9872008h-2.2481639z"/><path d="m10.138643 10.48569h-2.2481636v-.9872008h1.0701592v-6.0559397h-1.0701592v-.9872012h2.2481636z"/></g></g></svg>
diff --git a/editor/icons/TextureButton.svg b/editor/icons/TextureButton.svg
new file mode 100644
index 0000000000..497386945e
--- /dev/null
+++ b/editor/icons/TextureButton.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1v2h6v10h-4v2h6v-14zm-5 1v3.1328l-1.4453-.96484-1.1094 1.6641 3 2c.3359.2239.77347.2239 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm7 4v1h-1v1h-1v1h1v2h2 2v-2h-1v-2h-1v-1zm-7.5 4c-.831 0-1.5.669-1.5 1.5v.5 1h-1v2h8v-2h-1v-1-.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg>
diff --git a/editor/icons/TextureProgress.svg b/editor/icons/TextureProgress.svg
new file mode 100644
index 0000000000..30d76e33b8
--- /dev/null
+++ b/editor/icons/TextureProgress.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5efac" transform="translate(0 -1036.4)"><path d="m3 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-6c0-1.1046-.89543-2-2-2zm0 2h10v6h-10z" transform="translate(0 1036.4)"/><path d="m4 1042.4h1v2h-1z"/><path d="m6 1043.4h1v3h-1z"/><path d="m8 1042.4h1v4h-1z"/></g></svg>
diff --git a/editor/icons/TextureRect.svg b/editor/icons/TextureRect.svg
new file mode 100644
index 0000000000..605afbb7ca
--- /dev/null
+++ b/editor/icons/TextureRect.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h14v-14zm2 2h10v10h-10zm6 3v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-2h-1v-1z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Theme.svg b/editor/icons/Theme.svg
new file mode 100644
index 0000000000..00e1716dad
--- /dev/null
+++ b/editor/icons/Theme.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width="0"><path d="m6.7246 3c-.52985.78935-.96267 1.4021-1.3945 2h5.3398c-.43187-.59786-.86468-1.2107-1.3945-2z" fill="#ffeb70"/><path d="m5.3301 5c-.52617.72841-1.0198 1.4208-1.375 2h8.0898c-.35516-.57924-.84883-1.2716-1.375-2z" fill="#9dff70"/><path d="m3.9551 7c-.41451.67603-.71534 1.3082-.85547 2h9.8008c-.14013-.69181-.44096-1.324-.85547-2h-8.0898z" fill="#70ffb9"/><path d="m3.0996 9c-.063989.3159-.099609.64498-.099609 1 0 .34242.034776.67693.10156 1h9.7969c.066786-.32307.10156-.65758.10156-1 0-.35502-.03562-.6841-.099609-1h-9.8008z" fill="#70deff"/><path d="m3.1016 11c.15381.74405.48967 1.4159.93555 2h7.9258c.44588-.5841.78173-1.2559.93555-2h-9.7969z" fill="#9f70ff"/><path d="m4.0371 13c.9218 1.2076 2.3612 2 3.9629 2s3.0411-.79243 3.9629-2z" fill="#ff70ac"/><path d="m8 1c-.45196.75327-.87224 1.3994-1.2754 2h2.5508c-.40315-.6006-.82343-1.2467-1.2754-2z" fill="#ff7070"/></g></svg>
diff --git a/editor/icons/ThumbnailWait.svg b/editor/icons/ThumbnailWait.svg
new file mode 100644
index 0000000000..be510f457d
--- /dev/null
+++ b/editor/icons/ThumbnailWait.svg
@@ -0,0 +1 @@
+<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8zm0 2h48c3.324 0 6 2.676 6 6v48c0 3.324-2.676 6-6 6h-48c-3.324 0-6-2.676-6-6v-48c0-3.324 2.676-6 6-6zm-.013672 5.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l8 8a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-8-8a1 1 0 0 0 -.7207-.29102zm48 0a1 1 0 0 0 -.69336.29102l-8 8a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l8-8a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102zm-33.986 10.998a2.0002 2.0002 0 0 0 -.37891.039062c-.005702.001087-.011894.000819-.017578.001954-.01402.002798-.027106.006677-.041016.009765a2.0002 2.0002 0 0 0 -.30859.095703c-.024592.009869-.048174.020446-.072265.03125a2.0002 2.0002 0 0 0 -.24609.13281c-.021344.013452-.043669.024834-.064453.039062-.008816.006036-.016678.013359-.025391.019532a2.0002 2.0002 0 0 0 -.21484.17578c-.0215.020231-.04387.039386-.064453.060547a2.0002 2.0002 0 0 0 -.001953.001953 2.0002 2.0002 0 0 0 -.18555.22461c-.017788.024669-.036063.048717-.052734.074219a2.0002 2.0002 0 0 0 -.14258.26562c-.013621.029909-.026892.059158-.039063.089844a2.0002 2.0002 0 0 0 -.09375.30078c-.004203.018931-.008053.037509-.011719.056641a2.0002 2.0002 0 0 0 -.039062.38086c0 3 1.9339 5.2454 3.7461 7.3164 1.5217 1.7392 2.8322 3.2888 3.75 4.6836-.91778 1.3948-2.2283 2.9444-3.75 4.6836-1.8122 2.071-3.7461 4.3164-3.7461 7.3164a2.0002 2.0002 0 0 0 .041016.4043 2.0002 2.0002 0 0 0 .10547.3418c.008774.021862.017831.042985.027344.064453a2.0002 2.0002 0 0 0 .14648.27344c.010017.015513.018867.031664.029297.046875l.001953.001953a2.0002 2.0002 0 0 0 .19336.23633c.020231.0215.039386.04387.060547.064453a2.0002 2.0002 0 0 0 .001953.001953 2.0002 2.0002 0 0 0 .23438.19336c.021387.01522.042447.030536.064453.044922a2.0002 2.0002 0 0 0 .27734.15039c.019743.008822.038513.019147.058594.027343a2.0002 2.0002 0 0 0 .33789.10352c.005331.001131.010278.002818.015625.003906a2.0002 2.0002 0 0 0 .009766 0 2.0002 2.0002 0 0 0 .39453.041016h20a2.0002 2.0002 0 0 0 .4043-.041016 2.0002 2.0002 0 0 0 .375-.11523 2.0002 2.0002 0 0 0 .29297-.1582c.018831-.011984.038248-.022566.05664-.035156a2.0002 2.0002 0 0 0 .021485-.015625 2.0002 2.0002 0 0 0 .23633-.19531c.013296-.012808.028079-.023939.041015-.037109a2.0002 2.0002 0 0 0 .20508-.25c.012127-.017168.025518-.033217.03711-.050782a2.0002 2.0002 0 0 0 .15234-.28125c.01106-.024605.021165-.049089.03125-.074218a2.0002 2.0002 0 0 0 .097656-.31445c.003563-.016291.0066-.03239.009766-.048829a2.0002 2.0002 0 0 0 .039062-.38281c0-3-1.9339-5.2454-3.7461-7.3164-1.5217-1.7392-2.8322-3.2888-3.75-4.6836.91778-1.3948 2.2283-2.9444 3.75-4.6836 1.8122-2.071 3.7461-4.3164 3.7461-7.3164a2.0002 2.0002 0 0 0 -.041016-.4043v-.001953a2.0002 2.0002 0 0 0 -.10156-.32617c-.011965-.03044-.023719-.060163-.03711-.089844a2.0002 2.0002 0 0 0 -.13476-.25c-.011984-.018831-.022566-.038248-.035156-.05664a2.0002 2.0002 0 0 0 -.023438-.03125 2.0002 2.0002 0 0 0 -.1582-.19336c-.025026-.027154-.049686-.054353-.076172-.080078a2.0002 2.0002 0 0 0 -.027344-.02539 2.0002 2.0002 0 0 0 -.18945-.1543c-.031037-.022641-.061384-.04555-.09375-.066407l-.001953-.001953a2.0002 2.0002 0 0 0 -.24219-.13086c-.031326-.014467-.061564-.030098-.09375-.042969a2.0002 2.0002 0 0 0 -.29883-.091797c-.021554-.004877-.042636-.009492-.064453-.013672a2.0002 2.0002 0 0 0 -.38086-.039062h-20zm3.1758 4h13.648c-.4756.8814-.611 1.5782-1.5781 2.6836-1.6878 1.929-3.7966 3.9449-5.0352 6.4219a2.0002 2.0002 0 0 0 -.20898.89453h-.003906a2.0002 2.0002 0 0 0 -.20898-.89453c-1.2385-2.477-3.3473-4.4929-5.0352-6.4219-.96713-1.1054-1.1025-1.8022-1.5781-2.6836zm-9.1895 25.002a1 1 0 0 0 -.69336.29102l-8 8a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l8-8a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102zm32 0a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l8 8a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-8-8a1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
diff --git a/editor/icons/TileMap.svg b/editor/icons/TileMap.svg
new file mode 100644
index 0000000000..d1904338a8
--- /dev/null
+++ b/editor/icons/TileMap.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/TileSet.svg b/editor/icons/TileSet.svg
new file mode 100644
index 0000000000..5da406889e
--- /dev/null
+++ b/editor/icons/TileSet.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm5 1v7h5c.55228 0 1-.44772 1-1v-5c0-.55228-.44772-1-1-1v4l-1-1-1 1v-4zm-8 2v2h2v-2zm3 0v2h2v-2zm-3 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Time.svg b/editor/icons/Time.svg
new file mode 100644
index 0000000000..63215c9767
--- /dev/null
+++ b/editor/icons/Time.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="matrix(.0279396 0 0 .02755726 .914016 .7343)"><path d="m276.193 58.507v-18.118h14.578c11.153 0 20.194-9.042 20.194-20.194s-9.042-20.195-20.194-20.195h-69.544c-11.153 0-20.194 9.042-20.194 20.194s9.042 20.194 20.194 20.194h14.578v18.118c-115.853 10.254-207.006 107.821-207.006 226.293 0 125.279 101.922 227.201 227.201 227.201s227.201-101.922 227.201-227.201c-.001-118.472-91.155-216.039-207.008-226.292zm0 412.009v-20.124c0-11.153-9.042-20.194-20.194-20.194-11.153 0-20.194 9.042-20.194 20.194v20.124c-86.91-9.385-156.137-78.614-165.522-165.522h20.124c11.153 0 20.194-9.042 20.194-20.194s-9.042-20.194-20.194-20.194h-20.125c9.385-86.91 78.614-156.137 165.522-165.523v20.124c0 11.153 9.042 20.194 20.194 20.194 11.153 0 20.194-9.042 20.194-20.194v-20.126c86.91 9.385 156.137 78.614 165.522 165.523h-20.124c-11.153 0-20.194 9.042-20.194 20.194s9.042 20.194 20.194 20.194h20.126c-9.385 86.911-78.613 156.14-165.523 165.524z"/><path d="m317.248 194.99-58.179 58.18c-1.011-.097-2.034-.151-3.071-.151-17.552 0-31.779 14.229-31.779 31.779 0 17.552 14.228 31.779 31.779 31.779s31.779-14.229 31.779-31.779c0-1.037-.054-2.06-.151-3.07l58.178-58.18c7.887-7.885 7.887-20.672 0-28.559-7.882-7.886-20.669-7.886-28.556.001z"/></g></svg>
diff --git a/editor/icons/TimelineIndicator.svg b/editor/icons/TimelineIndicator.svg
new file mode 100644
index 0000000000..d63026b9e2
--- /dev/null
+++ b/editor/icons/TimelineIndicator.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 0h10l-4 4h-2z" fill="#fefefe"/></svg>
diff --git a/editor/icons/Timer.svg b/editor/icons/Timer.svg
new file mode 100644
index 0000000000..3fc69758bb
--- /dev/null
+++ b/editor/icons/Timer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a1.0001 1.0001 0 0 0 -.38672.078125 1.0001 1.0001 0 0 0 -.0019531 0c-.0022762.0009545-.0035918.0029354-.0058593.0039062a1.0001 1.0001 0 0 0 -.31055.20898c-.0012857.0012787-.0026276.0026206-.0039063.0039063a1.0001 1.0001 0 0 0 -.20508.30469c-.0029915.0068502-.0069239.012601-.0097656.019531a1.0001 1.0001 0 0 0 -.076172.38086c0 1.5.96697 2.6247 1.873 3.6602.76081.8695 1.4161 1.6425 1.875 2.3398-.45889.6974-1.1141 1.4723-1.875 2.3418-.90608 1.0355-1.873 2.1582-1.873 3.6582a1.0001 1.0001 0 0 0 .078125.38867v.001953c.0009292.002204.0029617.003663.0039062.005859a1.0001 1.0001 0 0 0 .20898.30664c.0010185.001027.0028834.004836.0039063.005859a1.0001 1.0001 0 0 0 .30078.20312c.0093182.004119.017877.007879.027344.011719a1.0001 1.0001 0 0 0 .37695.076172h10a1.0001 1.0001 0 0 0 .375-.074219c.010174-.0041.019294-.009251.029297-.013672a1.0001 1.0001 0 0 0 .29297-.19922c.004786-.004679.00898-.008899.013672-.013672a1.0001 1.0001 0 0 0 .20117-.29492c.004119-.009318.007879-.017877.011719-.027344a1.0001 1.0001 0 0 0 .076172-.37695c0-1.5-.96697-2.6227-1.873-3.6582-.76087-.8695-1.4161-1.6444-1.875-2.3418.4589-.6973 1.1142-1.4703 1.875-2.3398.90608-1.0355 1.873-2.1602 1.873-3.6602a1.0001 1.0001 0 0 0 -.078125-.39062 1.0001 1.0001 0 0 0 -.21484-.31641 1.0001 1.0001 0 0 0 -.31055-.21094 1.0001 1.0001 0 0 0 -.011718-.0058593 1.0001 1.0001 0 0 0 -.38477-.076172h-10zm1.5879 2h6.8242c-.2378.4408-.3055.7892-.78906 1.3418-.84392.9645-1.8983 1.9723-2.5176 3.2109a1.0001 1.0001 0 0 0 -.10547.44727 1.0001 1.0001 0 0 0 -.10547-.44727c-.61926-1.2386-1.6737-2.2464-2.5176-3.2109-.48356-.5526-.55126-.901-.78906-1.3418z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/ToolAddNode.svg b/editor/icons/ToolAddNode.svg
new file mode 100644
index 0000000000..9f47019746
--- /dev/null
+++ b/editor/icons/ToolAddNode.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(-26.001 -1046.2683)"><path d="m27.917081 1047.5557c-.422624 0-.763672.3411-.763672.7637v11.8301c0 .4226.341048.7637.763672.7637h12.507813c.422624 0 .761719-.3411.761719-.7637v-11.8301c0-.4226-.339095-.7637-.761719-.7637zm1.898438 1.6954h8.642578c.422624 0 .763672.341.763672.7636v8.5078c0 .4227-.341048.7618-.763672.7618h-8.642578c-.422625 0-.763672-.3391-.763672-.7618v-8.5078c0-.4226.341047-.7636.763672-.7636z"/><rect height="2.372881" ry=".76286" width="7.79661" x="30.20439" y="1052.9802"/><rect height="7.525424" ry=".729978" stroke-width=".882536" width="2.372881" x="32.916256" y="1050.3361"/></g></svg>
diff --git a/editor/icons/ToolConnect.svg b/editor/icons/ToolConnect.svg
new file mode 100644
index 0000000000..a778e260a6
--- /dev/null
+++ b/editor/icons/ToolConnect.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(-26.001 -1046.2683)"><rect height="2.169492" ry=".76286" width="14.305085" x="26.766621" y="1053.1389"/><path d="m30.596131 1046.927v14.8861l8.228847-7.5722z"/></g></svg>
diff --git a/editor/icons/ToolMove.svg b/editor/icons/ToolMove.svg
new file mode 100644
index 0000000000..b83f62265f
--- /dev/null
+++ b/editor/icons/ToolMove.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-2 2 1.4141 1.4141 1.293-1.293 1.293 1.293 1.4141-1.4141-2-2a1.0001 1.0001 0 0 0 -.72266-.29102zm-4.6914 4.291-2 2a1.0001 1.0001 0 0 0 0 1.4141l2 2 1.4141-1.4141-1.293-1.293 1.293-1.293-1.4141-1.4141zm9.4141 0-1.4141 1.4141 1.293 1.293-1.293 1.293 1.4141 1.4141 2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2zm-4.707.70703a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-1.293 5.293-1.4141 1.4141 2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2-1.4141-1.4141-1.293 1.293-1.293-1.293z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ToolPan.svg b/editor/icons/ToolPan.svg
new file mode 100644
index 0000000000..28ffe6336a
--- /dev/null
+++ b/editor/icons/ToolPan.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10 1a1 1 0 0 0 -1 1v6h-1v-5a1 1 0 0 0 -1-1 1 1 0 0 0 -1 1v8 .033203l-2.4746-1.8086c-.52015-.3803-1.1948-.4556-1.6504 0-.45566.4556-.45561 1.1948 0 1.6504l4.125 4.125h6a2 2 0 0 0 2-2v-5-4a1 1 0 0 0 -1-1 1 1 0 0 0 -1 1v4h-1v-6a1 1 0 0 0 -1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ToolRotate.svg b/editor/icons/ToolRotate.svg
new file mode 100644
index 0000000000..41dd22584d
--- /dev/null
+++ b/editor/icons/ToolRotate.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0879 1.002a7 7 0 0 0 -.30469.0019531 7 7 0 0 0 -.69727.056641 7 7 0 0 0 -5.9512 5.5742 7 7 0 0 0 1.9707 6.3652h-1.1055v2h4a1.0001 1.0001 0 0 0 .9707-1.2422l-1-4-1.9414.48633.28125 1.1211a5 5 0 0 1 -1.3105-3.3652 5 5 0 0 1 5-5 5 5 0 0 1 5 5 5 5 0 0 1 -1.4668 3.5332l1.416 1.416a7 7 0 0 0 1.3281-8.0449 7 7 0 0 0 -6.1895-3.9023zm-.087891 4.998a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ToolScale.svg b/editor/icons/ToolScale.svg
new file mode 100644
index 0000000000..730143a474
--- /dev/null
+++ b/editor/icons/ToolScale.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h2.5859l-1.293 1.293 1.4141 1.4141 1.293-1.293v2.5859a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-5a1.0001 1.0001 0 0 0 -1-1zm-1 5a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-6 2a1 1 0 0 0 -1 1v5a1.0001 1.0001 0 0 0 1 1h5a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-2.5859l1.293-1.293-1.4141-1.4141-1.293 1.293v-2.5859a1 1 0 0 0 -1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ToolSelect.svg b/editor/icons/ToolSelect.svg
new file mode 100644
index 0000000000..21318b5c05
--- /dev/null
+++ b/editor/icons/ToolSelect.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m40.001 1053.2-12-4.9365 4.9365 12 1.4207-4.2301 2.8254 2.8252 1.4127-1.4127-2.8254-2.8252z" fill="#e0e0e0" transform="translate(-26.001 -1046.2683)"/></svg>
diff --git a/editor/icons/ToolTriangle.svg b/editor/icons/ToolTriangle.svg
new file mode 100644
index 0000000000..51dee03f60
--- /dev/null
+++ b/editor/icons/ToolTriangle.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-26.001 -1046.2683)"><path d="m27.695915 1056.3022s7.457627-8.0678 7.118644-7.8644 5.830509 11.7288 5.830509 11.7288z" fill="#e0e0e0"/><g fill="#4b4b4b" stroke="#e0e0e0" stroke-width=".512"><circle cx="34.662014" cy="1048.5903" r="1.607564"/><circle cx="39.933205" cy="1059.6581" r="1.607564"/><circle cx="28.17049" cy="1056.2683" r="1.607564"/></g></g></svg>
diff --git a/editor/icons/Tools.svg b/editor/icons/Tools.svg
new file mode 100644
index 0000000000..81e7385945
--- /dev/null
+++ b/editor/icons/Tools.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-1 2 1 2v4h-2v3 .5c0 1.385 1.115 2.5 2.5 2.5s2.5-1.115 2.5-2.5v-1-2.5h-2v-4l1-2-1-2zm6 .17383a3 3 0 0 0 -2 2.8262 3 3 0 0 0 2 2.8262v6.1738 1c0 .554.446 1 1 1s1-.446 1-1v-4-3.1758a3 3 0 0 0 2-2.8242 3 3 0 0 0 -2-2.8242v2.8242a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1v-2.8262z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/TouchScreenButton.svg b/editor/icons/TouchScreenButton.svg
new file mode 100644
index 0000000000..aec0951d59
--- /dev/null
+++ b/editor/icons/TouchScreenButton.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a1 1 0 0 0 -1 1v2a1 1 0 0 0 1 1h2v-1h-1-1v-2h8v2h-2v1h2a1 1 0 0 0 1-1v-2a1 1 0 0 0 -1-1zm4 2a1 1 0 0 0 -1 1v7 .033203l-2.4746-1.8086c-.52015-.3803-1.1948-.4556-1.6504 0-.45566.4556-.45561 1.1948 0 1.6504l4.125 4.125h6c1.1046 0 2-.8954 2-2v-5h-6v-4a1 1 0 0 0 -1-1z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/TrackAddKey.svg b/editor/icons/TrackAddKey.svg
new file mode 100644
index 0000000000..5d2b4ebaf9
--- /dev/null
+++ b/editor/icons/TrackAddKey.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#84ffb1"/></svg>
diff --git a/editor/icons/TrackAddKeyHl.svg b/editor/icons/TrackAddKeyHl.svg
new file mode 100644
index 0000000000..0a0cdea48c
--- /dev/null
+++ b/editor/icons/TrackAddKeyHl.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#84ffb1"/><path d="m3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#fff" fill-opacity=".42424"/></svg>
diff --git a/editor/icons/TrackCapture.svg b/editor/icons/TrackCapture.svg
new file mode 100644
index 0000000000..aaa4a20e4a
--- /dev/null
+++ b/editor/icons/TrackCapture.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2.1665128.99764963c-.422625 0-.763672.34104737-.763672.76367187v4.5742187c0 .4226242.341047.7617192.763672.7617192h4.472656c.422625 0 .763672-.339095.763672-.7617192v-.9882812h-3.300781c-.1662 0-.298828-.3390943-.298828-.7617188v-1.2246094c0-.4226244.132628-.7636718.298828-.7636718h3.300781v-.8359375c0-.4226245-.341047-.76367187-.763672-.76367187z"/><path d="m9.1827441 4.7953408c.5166221-1.0415625 1.0955249-2.2117429 1.2864509-2.600401l.347137-.7066511.679654.00665.679654.00665.956945 2.3125c.526319 1.271875 1.007254 2.4334375 1.068744 2.5812497l.1118.26875h-.597215-.597214l-.332849-.6437497-.332849-.64375h-1.133826-1.133825l-.3786749.6561133-.3786747.6561134-.5922856.000137-.592285.000136zm3.1779349-.369483c.0042-.00346-.233487-.4884588-.528245-1.0777779l-.535922-1.0714891-.03691.0875c-.0203.048125-.183516.425-.362699.8375-.179182.4125-.355738.85125-.392346.975-.03661.12375-.07127.2390723-.07703.2562715-.0083.024853.188215.027989.957503.015278.532385-.0088.971429-.018823.975651-.022283z" stroke="#e0e0e0" stroke-width=".803"/></g></svg>
diff --git a/editor/icons/TrackColor.svg b/editor/icons/TrackColor.svg
new file mode 100644
index 0000000000..6a736c7a84
--- /dev/null
+++ b/editor/icons/TrackColor.svg
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="10"
+ viewBox="0 0 10 10"
+ width="10"
+ version="1.1"
+ id="svg4"
+ sodipodi:docname="icon_track_color.svg"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs8" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="838"
+ inkscape:window-height="480"
+ id="namedview6"
+ showgrid="false"
+ inkscape:zoom="23.6"
+ inkscape:cx="5"
+ inkscape:cy="5"
+ inkscape:window-x="593"
+ inkscape:window-y="314"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg4" />
+ <rect
+ fill="#5792f6"
+ height="6.1027"
+ ry=".76286"
+ transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)"
+ width="6.1027"
+ x="-740.13947"
+ y="741.10779"
+ id="rect2"
+ style="fill:#ffffff;fill-opacity:1" />
+</svg>
diff --git a/editor/icons/TrackContinuous.svg b/editor/icons/TrackContinuous.svg
new file mode 100644
index 0000000000..7f64ad7dbb
--- /dev/null
+++ b/editor/icons/TrackContinuous.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c6 0 6-4 12-4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg>
diff --git a/editor/icons/TrackDiscrete.svg b/editor/icons/TrackDiscrete.svg
new file mode 100644
index 0000000000..d1df4b1667
--- /dev/null
+++ b/editor/icons/TrackDiscrete.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/TrackTrigger.svg b/editor/icons/TrackTrigger.svg
new file mode 100644
index 0000000000..6e46a74121
--- /dev/null
+++ b/editor/icons/TrackTrigger.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v4h2v-4h2v-2zm13 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Transform.svg b/editor/icons/Transform.svg
new file mode 100644
index 0000000000..4d9bb829cd
--- /dev/null
+++ b/editor/icons/Transform.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2 2 4-2 4h2l.9082-2.1816 1.0918 2.1816h2l-2-4 2-4h-2l-.9082 2.1816-1.0918-2.1816zm6 8h2v-2h1v-2h-1v-1c.0000096-.55228.44772-.99999 1-1h1v-2h-1c-1.6569 0-3 1.3431-3 3zm4-6v6h2v-2l1 1 1-1v2h2v-6h-2l-1 2-1-2z" fill="#f6a86e"/><path d="m9 2a3 3 0 0 0 -3 3v5h2v-2h1v-2h-1v-1a1 1 0 0 1 1-1h1v-2z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/Transform2D.svg b/editor/icons/Transform2D.svg
new file mode 100644
index 0000000000..a0b5430298
--- /dev/null
+++ b/editor/icons/Transform2D.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v2h2v6h2v-6h2v-2zm7 0v2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.0019531v2h7a4 4 0 0 0 3.4648-2 4 4 0 0 0 0-4 4 4 0 0 0 -3.4648-2h-2v6h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5zm5 2a2 2 0 0 1 1.7324 1 2 2 0 0 1 0 2 2 2 0 0 1 -1.7324 1z" fill="#c4ec69"/><path d="m7 2v2c.55228 0 1 .44772 1 1s-.44772 1-1 1c-.71466-.0001326-1.3751.38108-1.7324 1-.17472.30426-.26633.64914-.26562 1h-.0019531v2h5v-2h-3c1.0716-.00015 2.0618-.57193 2.5977-1.5.5359-.9282.5359-2.0718 0-3-.53582-.92807-1.526-1.4998-2.5977-1.5z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/TransitionEnd.svg b/editor/icons/TransitionEnd.svg
new file mode 100644
index 0000000000..d0263c159e
--- /dev/null
+++ b/editor/icons/TransitionEnd.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(-2 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="11.16989" y="3.008411"/></g></svg>
diff --git a/editor/icons/TransitionEndAuto.svg b/editor/icons/TransitionEndAuto.svg
new file mode 100644
index 0000000000..89eb373df6
--- /dev/null
+++ b/editor/icons/TransitionEndAuto.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(-2 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="11.16989" y="3.008411"/></g></svg>
diff --git a/editor/icons/TransitionEndAutoBig.svg b/editor/icons/TransitionEndAutoBig.svg
new file mode 100644
index 0000000000..22f3414d34
--- /dev/null
+++ b/editor/icons/TransitionEndAutoBig.svg
@@ -0,0 +1 @@
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57" stroke="#41562e"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(1.4099529 0 0 1.4099529 -4.197589 -1462.5094)"/><rect height="14.194397" ry="1.075597" stroke-width="1.409953" width="4.325911" x="14.371336" y="3.007612"/></g></svg>
diff --git a/editor/icons/TransitionEndBig.svg b/editor/icons/TransitionEndBig.svg
new file mode 100644
index 0000000000..641f9c55d0
--- /dev/null
+++ b/editor/icons/TransitionEndBig.svg
@@ -0,0 +1 @@
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke="#424242"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" stroke-width=".999944" transform="matrix(1.4203458 0 0 1.4203458 -4.29479 -1473.1325)"/><rect height="14.299023" ry="1.083525" stroke-width="1.420266" width="4.357798" x="14.411009" y="3.186887"/></g></svg>
diff --git a/editor/icons/TransitionImmediate.svg b/editor/icons/TransitionImmediate.svg
new file mode 100644
index 0000000000..ffab62410d
--- /dev/null
+++ b/editor/icons/TransitionImmediate.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(-2 -1036.4)"/></svg>
diff --git a/editor/icons/TransitionImmediateAuto.svg b/editor/icons/TransitionImmediateAuto.svg
new file mode 100644
index 0000000000..98c583f407
--- /dev/null
+++ b/editor/icons/TransitionImmediateAuto.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#77ce57" fill-rule="evenodd" transform="translate(-2 -1036.4)"/></svg>
diff --git a/editor/icons/TransitionImmediateAutoBig.svg b/editor/icons/TransitionImmediateAutoBig.svg
new file mode 100644
index 0000000000..fe5e0903b5
--- /dev/null
+++ b/editor/icons/TransitionImmediateAutoBig.svg
@@ -0,0 +1 @@
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#77ce57" fill-rule="evenodd" stroke="#41562e" transform="matrix(1.571031 0 0 1.571031 -2.725768 -1630.6239)"/></svg>
diff --git a/editor/icons/TransitionImmediateBig.svg b/editor/icons/TransitionImmediateBig.svg
new file mode 100644
index 0000000000..2365518cc3
--- /dev/null
+++ b/editor/icons/TransitionImmediateBig.svg
@@ -0,0 +1 @@
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" stroke="#404040" transform="matrix(1.571031 0 0 1.571031 -2.725768 -1630.6239)"/></svg>
diff --git a/editor/icons/TransitionSync.svg b/editor/icons/TransitionSync.svg
new file mode 100644
index 0000000000..439d17fc3b
--- /dev/null
+++ b/editor/icons/TransitionSync.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(2.554247 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="1.965517" y="3.008411"/></g></svg>
diff --git a/editor/icons/TransitionSyncAuto.svg b/editor/icons/TransitionSyncAuto.svg
new file mode 100644
index 0000000000..022e1d8a7d
--- /dev/null
+++ b/editor/icons/TransitionSyncAuto.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(3.081581 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="1.965517" y="3.008411"/></g></svg>
diff --git a/editor/icons/TransitionSyncAutoBig.svg b/editor/icons/TransitionSyncAutoBig.svg
new file mode 100644
index 0000000000..27cb637667
--- /dev/null
+++ b/editor/icons/TransitionSyncAutoBig.svg
@@ -0,0 +1 @@
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57" stroke="#41562e"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(1.4099529 0 0 1.4099529 2.175293 -1462.5094)"/><rect height="14.194397" ry="1.075597" stroke-width="1.409953" width="4.325911" x="1.625573" y="3.007612"/></g></svg>
diff --git a/editor/icons/TransitionSyncBig.svg b/editor/icons/TransitionSyncBig.svg
new file mode 100644
index 0000000000..27ae519739
--- /dev/null
+++ b/editor/icons/TransitionSyncBig.svg
@@ -0,0 +1 @@
+<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke="#424242"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" stroke-width=".999944" transform="matrix(1.4203458 0 0 1.4203458 1.874702 -1473.1325)"/><rect height="14.299023" ry="1.083525" stroke-width="1.420266" width="4.357798" x="1.461856" y="3.186887"/></g></svg>
diff --git a/editor/icons/Translation.svg b/editor/icons/Translation.svg
new file mode 100644
index 0000000000..fd6e689250
--- /dev/null
+++ b/editor/icons/Translation.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1c-1.645 0-3 1.355-3 3s1.355 3 3 3c.46079 0 .89328-.11549 1.2852-.30469.18147.1867.43274.30469.71484.30469.554 0 1-.446 1-1v-2-2c0-.554-.446-1-1-1-.28152 0-.53345.11683-.71484.30273-.39187-.1892-.82436-.30273-1.2852-.30273zm0 2c.56412 0 1 .4359 1 1s-.43588 1-1 1-1-.4359-1-1 .43588-1 1-1zm6.8867 3.5293-1.7891.89453.28906.57617h-2.3867v2h.82031c.13264.9292.4994 1.8938 1.1992 2.7305-.61509.163-1.3569.26523-2.2656.26953l.0097657 2c1.6777-.01 3.0414-.31328 4.1113-.83398 1.07.5208 2.4336.82608 4.1113.83398l.009766-2c-.90873 0-1.6505-.10653-2.2656-.26953.7-.8367 1.068-1.8013 1.2012-2.7305h1.0684v-2h-3.3789l-.73438-1.4707zm-1.0234 3.4707h2.0234c-.12578.5801-.37537 1.147-.83594 1.623-.05313.055-.11651.10676-.17578.16016-.05927-.053-.12265-.10516-.17578-.16016-.46056-.476-.71015-1.0429-.83594-1.623z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Transpose.svg b/editor/icons/Transpose.svg
new file mode 100644
index 0000000000..41b88ea667
--- /dev/null
+++ b/editor/icons/Transpose.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h7v-7h7v-7zm2 2h3v3h-3zm0 5h3v5h-3zm12 2-5 5h5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/Tree.svg b/editor/icons/Tree.svg
new file mode 100644
index 0000000000..9476f40db3
--- /dev/null
+++ b/editor/icons/Tree.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v13c.0000552.55226.44774.99994 1 1h13v-2h-12v-6h2v3c.0000552.55226.44774.99994 1 1h9v-2h-8v-2h8v-2h-12v-2h12v-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Tween.svg b/editor/icons/Tween.svg
new file mode 100644
index 0000000000..d5cfbbcd88
--- /dev/null
+++ b/editor/icons/Tween.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h6v6h2v-8zm-1 4 1.793 1.793-4.793 4.793v-4.5859h-2v8h8v-2h-4.5859l4.793-4.793 1.793 1.793v-5h-5z" fill="#cea4f1" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/Unbone.svg b/editor/icons/Unbone.svg
new file mode 100644
index 0000000000..2aa0b8ad8c
--- /dev/null
+++ b/editor/icons/Unbone.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.479 1a2.4664 2.4663 0 0 0 -1.7813.7207 2.4664 2.4663 0 0 0 -.31445 3.1035l-1.0723 1.0723 2.791 2.791 1.0762-1.0742a2.4664 2.4663 0 0 0 3.0996-.31055 2.4664 2.4663 0 0 0 0-3.4883 2.4664 2.4663 0 0 0 -1.3965-.69727 2.4664 2.4663 0 0 0 -.69531-1.3965 2.4664 2.4663 0 0 0 -1.707-.7207zm-4.582 6.3105-1.0723 1.0742a2.4664 2.4663 0 0 0 -3.1016.3125 2.4664 2.4663 0 0 0 0 3.4883 2.4664 2.4663 0 0 0 1.3965.69531 2.4664 2.4663 0 0 0 .69531 1.3965 2.4664 2.4663 0 0 0 3.4883 0 2.4664 2.4663 0 0 0 .31445-3.1035l1.0703-1.0723-2.791-2.791z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/Ungroup.svg b/editor/icons/Ungroup.svg
new file mode 100644
index 0000000000..f3f1051bcc
--- /dev/null
+++ b/editor/icons/Ungroup.svg
@@ -0,0 +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="m7 1037.4v6h-6v8h8v-6h6v-8zm2 2h4v4h-4z" fill="#e0e0e0" fill-opacity=".39216"/><path d="m7 1v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm6 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm-12 6v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.0000234-.446 0-1 0s-1-.0000234-1 0zm6 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.0000234-.446 0-1 0s-1-.0000234-1 0zm6 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.0000234-.446 0-1 0s-1-.0000234-1 0zm-12 6v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0zm6 0v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0z" fill="#fff" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/Unlock.svg b/editor/icons/Unlock.svg
new file mode 100644
index 0000000000..29fbd76292
--- /dev/null
+++ b/editor/icons/Unlock.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.87738.001545-1.7389.23394-2.498.67383l1 1.7324c.45506-.26449.97171-.40459 1.498-.40625 1.6569 0 3 1.3431 3 3v2h-9v7h12v-7h-1v-2c0-2.7614-2.2386-5-5-5zm-1 9h2v3h-2z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/UnpaintVertex.svg b/editor/icons/UnpaintVertex.svg
new file mode 100644
index 0000000000..059fcf6e25
--- /dev/null
+++ b/editor/icons/UnpaintVertex.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><ellipse cx="8.372881" cy="8.169492" rx="6.677966" ry="6.067797"/></svg>
diff --git a/editor/icons/Uv.svg b/editor/icons/Uv.svg
new file mode 100644
index 0000000000..82c914c84f
--- /dev/null
+++ b/editor/icons/Uv.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 5v4a3 3 0 0 0 1.5 2.5977 3 3 0 0 0 3 0 3 3 0 0 0 1.5-2.5977v-4h-2v4a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1v-4zm8 0 2 7h1 1 1l2-7h-2l-1.5 5.25-1.5-5.25z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/VBoxContainer.svg b/editor/icons/VBoxContainer.svg
new file mode 100644
index 0000000000..9a68df4f6a
--- /dev/null
+++ b/editor/icons/VBoxContainer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1039.4c0-1.1046-.89543-2-2-2h-10c-1.1046 0-2 .8954-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2zm-2 0v2h-10v-2zm0 4v2h-10v-2zm0 4v2h-10v-2z" fill="#a5efac" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/VScrollBar.svg b/editor/icons/VScrollBar.svg
new file mode 100644
index 0000000000..e0fc575860
--- /dev/null
+++ b/editor/icons/VScrollBar.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.108 0-2 .89199-2 2v10c0 1.108.89199 2 2 2h6c1.108 0 2-.89199 2-2v-10c0-1.108-.89199-2-2-2zm2.9883 1a1.0001 1.0001 0 0 1 .56641.16797l3 2a1.0001 1.0001 0 1 1 -1.1094 1.6641l-2.4453-1.6289-2.4453 1.6289a1.0001 1.0001 0 1 1 -1.1094-1.6641l3-2a1.0001 1.0001 0 0 1 .54297-.16797zm-2.998 7.9922a1.0001 1.0001 0 0 1 .56445.17578l2.4453 1.6309 2.4453-1.6309a1.0001 1.0001 0 1 1 1.1094 1.6641l-3 2a1.0001 1.0001 0 0 1 -1.1094 0l-3-2a1.0001 1.0001 0 0 1 .54492-1.8398z" fill="#a5efac"/></svg>
diff --git a/editor/icons/VSeparator.svg b/editor/icons/VSeparator.svg
new file mode 100644
index 0000000000..11038b7542
--- /dev/null
+++ b/editor/icons/VSeparator.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1047.4h3v-6h-3zm5 4h2v-14h-2zm4-4h3v-6h-3z" fill="#a5efac" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/VSlider.svg b/editor/icons/VSlider.svg
new file mode 100644
index 0000000000..0ecb1e9aa3
--- /dev/null
+++ b/editor/icons/VSlider.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm5 0c-.55228 0-1 .44772-1 1s.44772 1 1 1h2c.55228 0 1-.44772 1-1s-.44772-1-1-1zm-4 5.8672c-.32639.086294-.6624.13092-1 .13281-.33752-.0012549-.67352-.045224-1-.13086v5 1.1309 1c-.019125 1.3523 2.0191 1.3523 2 0v-1-1.1328-5zm5 .13281c-.55228 0-1 .44772-1 1s.44772 1 1 1 1-.44772 1-1-.44772-1-1-1zm-1 6c-.55228 0-1 .44772-1 1s.44772 1 1 1h2c.55228 0 1-.44772 1-1s-.44772-1-1-1z" fill="#a5efac"/></svg>
diff --git a/editor/icons/VSplitContainer.svg b/editor/icons/VSplitContainer.svg
new file mode 100644
index 0000000000..21d45bd5e7
--- /dev/null
+++ b/editor/icons/VSplitContainer.svg
@@ -0,0 +1 @@
+<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 2h10v4h-3l-2-2-2 2h-3zm0 6h3l2 2 2-2h3v4h-10z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Variant.svg b/editor/icons/Variant.svg
new file mode 100644
index 0000000000..71ebd060ae
--- /dev/null
+++ b/editor/icons/Variant.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 4a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-6zm3 0v6h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3zm5 3a3 3 0 0 0 3 3v2h2v-8h-2v4a1 1 0 0 1 -1-1v-3h-2zm-8-1v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#69ecbd"/></svg>
diff --git a/editor/icons/Vector2.svg b/editor/icons/Vector2.svg
new file mode 100644
index 0000000000..43a93df83f
--- /dev/null
+++ b/editor/icons/Vector2.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.001953v2h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5zm-11 2v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4zm5 3a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2h-1a3 3 0 0 0 -3 3z" fill="#bd91f1"/><path d="m12 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.001953v2h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/Vector2i.svg b/editor/icons/Vector2i.svg
new file mode 100644
index 0000000000..6cf9a896f3
--- /dev/null
+++ b/editor/icons/Vector2i.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="12" version="1.1" viewBox="0 0 16 12" xmlns="http://www.w3.org/2000/svg">
+<path d="m8 2v2h1c0.55228 0 1 0.44772 1 1s-0.44772 1-1 1c-0.71466-1.248e-4 -1.3751 0.38109-1.7324 1-0.17472 0.30426-0.26633 0.64914-0.26562 1h-2e-3v2h5v-2h-3c1.0717-1.344e-4 2.0619-0.57191 2.5977-1.5 0.5359-0.9282 0.5359-2.0718 0-3-0.53578-0.92809-1.526-1.4999-2.5977-1.5zm-7 2v6h2c1.6569 0 3-1.3431 3-3v-3h-2v3c0 0.55228-0.44772 1-1 1v-4z" fill="#bd91f1"/>
+<path d="m8 2v2h1c0.55228 0 1 0.44772 1 1s-0.44772 1-1 1c-0.71466-1.248e-4 -1.3751 0.38109-1.7324 1-0.17472 0.30426-0.26633 0.64914-0.26562 1h-0.001953v2h5v-2h-3c1.0717-1.344e-4 2.0619-0.57191 2.5977-1.5 0.5359-0.9282 0.5359-2.0718 0-3-0.53583-0.92809-1.526-1.4999-2.5977-1.5z" fill="#fff" fill-opacity=".39216"/>
+<path d="m13 2v2h2v-2zm0 4v4h2v-4z" fill="#7dc6ef"/>
+</svg>
diff --git a/editor/icons/Vector3.svg b/editor/icons/Vector3.svg
new file mode 100644
index 0000000000..2606f6e22b
--- /dev/null
+++ b/editor/icons/Vector3.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 2v2h2a1 1 0 0 1 -1 1v2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -.36523-.50195 3 3 0 0 0 .36523-.49805 3 3 0 0 0 .39844-1.5h.003906v-2zm-11 2v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4zm5 3a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2h-1a3 3 0 0 0 -3 3z" fill="#e286f0"/><path d="m12 2v2h2a1 1 0 0 1 -1 1v2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -.36523-.50195 3 3 0 0 0 .36523-.49805 3 3 0 0 0 .39844-1.5h.003906v-2z" fill="#fff" fill-opacity=".39216"/></svg>
diff --git a/editor/icons/Vector3i.svg b/editor/icons/Vector3i.svg
new file mode 100644
index 0000000000..d0be27886d
--- /dev/null
+++ b/editor/icons/Vector3i.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="12" version="1.1" viewBox="0 0 16 12" xmlns="http://www.w3.org/2000/svg">
+<path d="m8 2v2h2c0 0.55228-0.44772 1-1 1v2c0.55228 0 1 0.44772 1 1s-0.45296 0.92408-1 1h-1v2h1c1.0717-1.34e-4 2.0619-0.57191 2.5977-1.5 0.5359-0.9282 0.5359-2.0718 0-3-0.10406-0.1795-0.22646-0.34771-0.36523-0.50195 0.13855-0.15301 0.26094-0.31991 0.36523-0.49805 0.26209-0.45639 0.3995-0.97371 0.39844-1.5h0.0039v-2zm-7 2v6h2c1.6569 0 3-1.3431 3-3v-3h-2v3c0 0.55228-0.44772 1-1 1v-4z" fill="#e286f0"/>
+<path d="m8 2v2h2c0 0.55228-0.44772 1-1 1v2c0.55228 0 1 0.44772 1 1s-0.44948 0.95585-1 1h-1v2h1c1.0717-1.34e-4 2.0619-0.57191 2.5977-1.5 0.5359-0.9282 0.5359-2.0718 0-3-0.10406-0.1795-0.22646-0.34771-0.36523-0.50195 0.13855-0.15301 0.26094-0.31991 0.36523-0.49805 0.26209-0.45639 0.3995-0.97371 0.39844-1.5h0.0039v-2z" fill="#fff" fill-opacity=".39216"/>
+<path d="m13 2v2h2v-2zm0 4v4h2v-4z" fill="#7dc6ef"/>
+</svg>
diff --git a/editor/icons/VehicleBody3D.svg b/editor/icons/VehicleBody3D.svg
new file mode 100644
index 0000000000..0cfbad371c
--- /dev/null
+++ b/editor/icons/VehicleBody3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 3a1 1 0 0 0 -1 1l-1 3h-2v4h1.0508c.23167-1.1411 1.2398-2 2.4492-2s2.2175.85893 2.4492 2h2.1016c.23167-1.1411 1.2398-2 2.4492-2s2.2175.85893 2.4492 2h1.0508v-4h-4v-4zm1 1h4v3h-4zm-1.5 6a1.5 1.5 0 0 0 -1.5 1.5 1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0 -1.5-1.5zm7 0a1.5 1.5 0 0 0 -1.5 1.5 1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0 -1.5-1.5z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/VehicleWheel3D.svg b/editor/icons/VehicleWheel3D.svg
new file mode 100644
index 0000000000..0391eac4cf
--- /dev/null
+++ b/editor/icons/VehicleWheel3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2a5 5 0 0 1 5 5 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 5-5zm0 1a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-2 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-2 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/VideoPlayer.svg b/editor/icons/VideoPlayer.svg
new file mode 100644
index 0000000000..c5433e0131
--- /dev/null
+++ b/editor/icons/VideoPlayer.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.0907 0-2 .9093-2 2v10c0 1.0907.90929 2 2 2h10c1.0907 0 2-.9093 2-2v-10c0-1.0907-.90929-2-2-2zm0 2h10v8h-10zm3 2v4l4-2z" fill="#a5efac"/></svg>
diff --git a/editor/icons/Viewport.svg b/editor/icons/Viewport.svg
new file mode 100644
index 0000000000..7d388c1c6d
--- /dev/null
+++ b/editor/icons/Viewport.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-.5304.0000801-1.0391.21085-1.4141.58594-.37509.37501-.58586.88366-.58594 1.4141v8c.0000803.5304.21085 1.0391.58594 1.4141.37501.37509.88366.58586 1.4141.58594h10c1.1046 0 2-.89543 2-2v-8c0-1.1046-.89543-2-2-2zm0 1h10c.55228.0000096.99999.44772 1 1v8c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-8c.0000096-.55228.44772-.99999 1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ViewportSpeed.svg b/editor/icons/ViewportSpeed.svg
new file mode 100644
index 0000000000..8fceaffd52
--- /dev/null
+++ b/editor/icons/ViewportSpeed.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.2333333 4.2333333" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.5875 0c-.28858 0-.52917.24059-.52917.52917v.61132c-.085589-.051-.18113-.0891-.28525-.0853-.34849.0127-.5952.37346-.48059.70278l.26355.79066c.048664.14623.15979.24805.29249.30644l-.60927.40669c-.13121.0845-.22102.22389-.24133.3633-.020312.13941.017471.26985.087333.37465s.17614.19045.31264.22532c.13634.0348.29946.006.42788-.0827h.0005159l1.0852-.72348.26097.52192c.11682.23391.39274.34829.64079.26561l.79375-.26458-.00775.003c.15105-.0454.27732-.15615.33486-.2863.057538-.13015.055144-.26773.014986-.38809-.03156-.0946-.10972-.1687-.19275-.23617.069099-.0546.1445-.10364.18035-.19325.051761-.12941.045257-.29292-.02377-.43098l-.26459-.52946c-.089407-.17933-.27348-.29308-.47335-.29305h-.1111c.052029-.0817.1111-.16214.1111-.26458v-.79375c0-.28858-.24059-.52917-.52917-.52917z"/><path d="m1.5875.26458c-.14658 0-.26458.118-.26458.26459v.79375c0 .14658.118.26458.26458.26458h.26458v.262a.26461.26461 0 0 0 -.083716.0165l-.5426.18086-.18087-.5426a.26461.26461 0 0 0 -.262-.18448.26461.26461 0 0 0 -.2403.3514l.26458.79375a.26461.26461 0 0 0 .33486.16743l.44545-.14831v.16174c0 .0108.00495.02.0062.0305l-1.2113.80771a.26461.26461 0 1 0 .29352.44028l1.3379-.89194.39532.79014a.26461.26461 0 0 0 .32039.1328l.79375-.26458a.26461.26461 0 1 0 -.16743-.50175l-.57619.19172-.25787-.51625c.072998-.047.12402-.12495.12402-.21859v-.26458h.36587l.1912.38292a.26461.26461 0 1 0 .47336-.23668l-.26458-.52916a.26461.26461 0 0 0 -.23668-.14625h-.79375v-.26458h.26458c.14658 0 .26458-.118.26458-.26458v-.79375c0-.14659-.118-.26459-.26458-.26459zm0 .52917h.26458v.52917h-.26458z" fill="#fff" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ViewportTexture.svg b/editor/icons/ViewportTexture.svg
new file mode 100644
index 0000000000..3dd448b1ac
--- /dev/null
+++ b/editor/icons/ViewportTexture.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-.5304.0000801-1.0391.21085-1.4141.58594-.37509.37501-.58586.88366-.58594 1.4141v8c.0000803.5304.21085 1.0391.58594 1.4141.37501.37509.88366.58586 1.4141.58594h10c1.1046 0 2-.89543 2-2v-8c0-1.1046-.89543-2-2-2h-10zm0 1h10c.55228.0000096.99999.44772 1 1v8c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-8c.0000096-.55228.44772-.99999 1-1zm6 3v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-1-1h-1v-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ViewportZoom.svg b/editor/icons/ViewportZoom.svg
new file mode 100644
index 0000000000..d111e5d5c5
--- /dev/null
+++ b/editor/icons/ViewportZoom.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0c-3.3019 0-6 2.6981-6 6s2.6981 6 6 6h.00195c.88828 0 1.737-.2588 2.5332-.6367l3.8281 3.8281c.39053.3904 1.0235.3904 1.4141 0l1.4141-1.4141c.39033-.3905.39033-1.0235 0-1.414l-3.791-3.791c.02779-.058.06588-.1109.0918-.17.05554-.1268.08414-.2638.08398-.4023h1.4238c.55226-.0001.99994-.4477 1-1v-1h1c.55226-.0001.99994-.4477 1-1v-2c-.000055-.5523-.44774-.9999-1-1h-1v-1c-.000055-.5523-.44774-.9999-1-1h-2c-.55226.0001-.99994.4477-1 1v1h-.00977c.000144-.3151-.14822-.6118-.40039-.8008-1.0353-.7764-2.2938-1.1967-3.5879-1.1992h-.00195z"/><path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.752-.83398l4.3184 4.3184 1.4141-1.4141-4.3184-4.3184a5 5 0 0 0 .41016-.75195h-.57617v-2h-1a3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3 3 3 0 0 1 2 .76758v-1.7676h.99023a5 5 0 0 0 -2.9902-1zm5 0v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#fff"/></svg>
diff --git a/editor/icons/VisibilityEnabler2D.svg b/editor/icons/VisibilityEnabler2D.svg
new file mode 100644
index 0000000000..e603936d83
--- /dev/null
+++ b/editor/icons/VisibilityEnabler2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v3h1v-2h2v-1zm11 0v1h2v2h1v-3zm-4 1c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.55273c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-7 6v3h3v-1h-2v-2zm13 0v2h-2v1h3v-3z" fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/VisibilityEnabler3D.svg b/editor/icons/VisibilityEnabler3D.svg
new file mode 100644
index 0000000000..07ba8b88df
--- /dev/null
+++ b/editor/icons/VisibilityEnabler3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v3h1v-2h2v-1zm11 0v1h2v2h1v-3zm-4 1c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.55273c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-7 6v3h3v-1h-2v-2zm13 0v2h-2v1h3v-3z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/VisibilityNotifier2D.svg b/editor/icons/VisibilityNotifier2D.svg
new file mode 100644
index 0000000000..8eaf8334ac
--- /dev/null
+++ b/editor/icons/VisibilityNotifier2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 1v6h2v-6zm-4 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246 1.4907 0 3.2717-.65207 4.7109-2h-.71094-2v-.54102a4 4 0 0 1 -2 .54102 4 4 0 0 1 -4-4 4 4 0 0 1 4-4 4 4 0 0 1 2 .54102v-2.1816c-.68312-.23834-1.3644-.35938-2-.35938zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm4 2v2h2v-2z" fill="#a5b7f3" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/VisibilityNotifier3D.svg b/editor/icons/VisibilityNotifier3D.svg
new file mode 100644
index 0000000000..afb433c9ed
--- /dev/null
+++ b/editor/icons/VisibilityNotifier3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 1v6h2v-6zm-4 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246 1.4907 0 3.2717-.65207 4.7109-2h-.71094-2v-.54102a4 4 0 0 1 -2 .54102 4 4 0 0 1 -4-4 4 4 0 0 1 4-4 4 4 0 0 1 2 .54102v-2.1816c-.68312-.23834-1.3644-.35938-2-.35938zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm4 2v2h2v-2z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd"/></svg>
diff --git a/editor/icons/VisualShader.svg b/editor/icons/VisualShader.svg
new file mode 100644
index 0000000000..7006066592
--- /dev/null
+++ b/editor/icons/VisualShader.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2.8642 9.9954v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4z"/><path d="m10.864 9.9954a2 2 0 0 0 -1.7324 1 2 2 0 0 0 0 2 2 2 0 0 0 1.7324 1h-2v2h2a2 2 0 0 0 1.7324-1 2 2 0 0 0 0-2 2 2 0 0 0 -1.7324-1h2v-2z"/><path d="m2 1c-.55226.0001-.99994.4477-1 1v7h2v-6h6v3c0 .554.44599 1 1 1h3v2h2v-3l-5-5z"/></g><path d="m4 6h2v1h-2z" fill="#ffeb70"/><path d="m8 8h4v1h-4z" fill="#9dff70"/><path d="m7 6h1v1h-1z" fill="#70deff"/><path d="m4 4h3v1h-3z" fill="#ff7070"/><path d="m4 8h3v1h-3z" fill="#70ffb9"/></svg>
diff --git a/editor/icons/VisualShaderPort.svg b/editor/icons/VisualShaderPort.svg
new file mode 100644
index 0000000000..5311513d83
--- /dev/null
+++ b/editor/icons/VisualShaderPort.svg
@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m1.9883 1042.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59363-.3959.59363-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#fff" fill-rule="evenodd" transform="translate(0 -1042.4)"/></svg>
diff --git a/editor/icons/Warning.svg b/editor/icons/Warning.svg
new file mode 100644
index 0000000000..cdb88dd2d2
--- /dev/null
+++ b/editor/icons/Warning.svg
@@ -0,0 +1 @@
+<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#ffdd65" height="8" ry="4" width="8"/></svg>
diff --git a/editor/icons/Window.svg b/editor/icons/Window.svg
new file mode 100644
index 0000000000..a60a25bcdf
--- /dev/null
+++ b/editor/icons/Window.svg
@@ -0,0 +1 @@
+<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/World2D.svg b/editor/icons/World2D.svg
new file mode 100644
index 0000000000..d784836694
--- /dev/null
+++ b/editor/icons/World2D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1037.4a1.0001 1.0001 0 0 0 -1 1v10a1.0001 1.0001 0 0 0 1 1c2.3667 0 3.9746.4629 5.7246.9629s3.6421 1.0371 6.2754 1.0371a1.0001 1.0001 0 0 0 1-1v-10a1.0001 1.0001 0 0 0 -1-1c-2.3667 0-3.9746-.4609-5.7246-.9609s-3.6421-1.0391-6.2754-1.0391zm1 2.0957c1.7984.1158 3.2574.448 4.7246.8672 1.4977.4279 3.194.8188 5.2754.9414v8.002c-1.7985-.1158-3.2574-.448-4.7246-.8672-1.4977-.4279-3.194-.8208-5.2754-.9434z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/World3D.svg b/editor/icons/World3D.svg
new file mode 100644
index 0000000000..acb1083b88
--- /dev/null
+++ b/editor/icons/World3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 3a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 5-5 5 5 0 0 0 -5-5z" fill="#e0e0e0"/></svg>
diff --git a/editor/icons/WorldEnvironment.svg b/editor/icons/WorldEnvironment.svg
new file mode 100644
index 0000000000..314639a576
--- /dev/null
+++ b/editor/icons/WorldEnvironment.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1.7305 2.3125c-.83125 1.5372-1.2685 3.1037-1.2695 4.6816-.64057-.11251-1.3005-.27158-1.9766-.47266a5 5 0 0 1 3.2461-4.209zm3.4629.0039062a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.00845-1.5627-.44294-3.1141-1.2656-4.6367zm-1.7324.0078126c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.0066161.10803-.0078125.16211-.96392.096801-1.9566.1103-2.9844.027344-.0016335-.063192-.0078125-.12632-.0078125-.18945 0-1.5333.48744-3.0828 1.5-4.6758zm4.8789 5.7578a5 5 0 0 1 -3.1484 3.6055c.57106-1.0564.95277-2.1268 1.1367-3.2051.68204-.10905 1.3556-.23789 2.0117-.40039zm-9.7461.033203c.68377.18153 1.3555.33345 2.0098.43164.18781 1.0551.56647 2.1026 1.125 3.1367a5 5 0 0 1 -3.1348-3.5684zm6.168.55469c-.22615.98866-.65424 1.9884-1.3008 3.0059-.63811-1.0042-1.0645-1.9908-1.293-2.9668.89027.054126 1.7517.029377 2.5938-.039062z" fill="#fc9c9c" fill-opacity=".99608"/><path d="m8 1v2.3242c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.0066161.10803-.0078125.16211-.4894.049148-.98713.077552-1.4922.082031v1.4922c.43915-.0075968.87287-.031628 1.3008-.066406-.22615.98866-.65424 1.9884-1.3008 3.0059v2.3242a7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm1.7324 2.3164a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.00845-1.5627-.44294-3.1141-1.2656-4.6367zm3.1465 5.7656a5 5 0 0 1 -3.1484 3.6055c.57106-1.0564.95277-2.1268 1.1367-3.2051.68204-.10905 1.3556-.23789 2.0117-.40039z" fill="#a5b7f3"/></g></svg>
diff --git a/editor/icons/WorldMarginShape3D.svg b/editor/icons/WorldMarginShape3D.svg
new file mode 100644
index 0000000000..a73e74ad33
--- /dev/null
+++ b/editor/icons/WorldMarginShape3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1044.4 7 3 7-3-7-3z" fill="#a2d2ff" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg>
diff --git a/editor/icons/X509Certificate.svg b/editor/icons/X509Certificate.svg
new file mode 100644
index 0000000000..b56268f281
--- /dev/null
+++ b/editor/icons/X509Certificate.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 4.233 4.233" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.967.263-3.704.001v2.646h1.427a.993.993 0 0 1 -.022-.096.993.993 0 0 1 -.012-.099.993.993 0 0 1 -.002-.07.993.993 0 0 1 .005-.1.993.993 0 0 1 .014-.097.993.993 0 0 1 .025-.096.993.993 0 0 1 .034-.093.993.993 0 0 1 .043-.09.993.993 0 0 1 .052-.085.993.993 0 0 1 .06-.079.993.993 0 0 1 .068-.072.993.993 0 0 1 .074-.066.993.993 0 0 1 .08-.057.993.993 0 0 1 .087-.05.993.993 0 0 1 .09-.04.993.993 0 0 1 .095-.031.993.993 0 0 1 .096-.022.993.993 0 0 1 .099-.012.993.993 0 0 1 .07-.003.993.993 0 0 1 .099.006.993.993 0 0 1 .098.014.993.993 0 0 1 .096.025.993.993 0 0 1 .094.034.993.993 0 0 1 .089.043.993.993 0 0 1 .084.052.993.993 0 0 1 .08.06.993.993 0 0 1 .072.068.993.993 0 0 1 .065.074.993.993 0 0 1 .058.08.993.993 0 0 1 .05.087.993.993 0 0 1 .04.09.993.993 0 0 1 .031.095.993.993 0 0 1 .022.096.993.993 0 0 1 .012.099.993.993 0 0 1 .002.07.993.993 0 0 1 -.004.1.993.993 0 0 1 -.015.097.993.993 0 0 1 -.017.068h.365z" fill="#e0e0e0"/><g fill="#ff8484"><path d="m2.116 3.175v.793l.53-.253.529.253v-.793z"/><circle cx="2.646" cy="2.645" r=".794"/></g></svg>
diff --git a/editor/icons/XRAnchor3D.svg b/editor/icons/XRAnchor3D.svg
new file mode 100644
index 0000000000..0f6282a085
--- /dev/null
+++ b/editor/icons/XRAnchor3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h-2v2h2v3.2656l-2.5527-1.2773c-.15005-.075253-.31662-.11152-.48438-.10547-.36536.013648-.69415.2256-.85742.55273-.24709.49403-.046823 1.0948.44727 1.3418l4.4473 2.2227 4.4473-2.2227c.49409-.24697.69435-.84777.44726-1.3418-.24697-.49409-.84777-.69435-1.3418-.44727l-2.5527 1.2773v-3.2656h2v-2h-2v-2zm-3 11v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v4h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/XRCamera3D.svg b/editor/icons/XRCamera3D.svg
new file mode 100644
index 0000000000..9f9072fc1e
--- /dev/null
+++ b/editor/icons/XRCamera3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9.5 0a3 3 0 0 0 -2.9883 2.7773 3 3 0 0 0 -2.0117-.77734 3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8242v2.1758c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695a3 3 0 0 0 1-2.2305 3 3 0 0 0 -3-3zm-5.5 12v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v1 3h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/XRController3D.svg b/editor/icons/XRController3D.svg
new file mode 100644
index 0000000000..9296b11c8e
--- /dev/null
+++ b/editor/icons/XRController3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.554 0-1 .446-1 1v6c0 .554.446 1 1 1h12c.554 0 1-.446 1-1v-6c0-.554-.446-1-1-1zm2 1h2v2h2v2h-2v2h-2v-2h-2v-2h2zm9 1c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-2 2c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-7 7v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v1 3h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/XROrigin3D.svg b/editor/icons/XROrigin3D.svg
new file mode 100644
index 0000000000..dda24e7530
--- /dev/null
+++ b/editor/icons/XROrigin3D.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3h2v-3zm-4 4v2h3v-2zm5 0c-.55228 0-1 .44772-1 1s.44772 1 1 1 1-.44772 1-1-.44772-1-1-1zm2 0v2h3v-2zm-3 3v3h2v-3zm-3 4v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v1 3h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg>
diff --git a/editor/icons/YSort.svg b/editor/icons/YSort.svg
new file mode 100644
index 0000000000..40367bd2b2
--- /dev/null
+++ b/editor/icons/YSort.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-3 3h2v8h-2l3 3 3-3h-2v-8h2zm5 1v2h6v-2zm0 5v2h4v-2zm0 5v2h2v-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg>
diff --git a/editor/icons/Zoom.svg b/editor/icons/Zoom.svg
new file mode 100644
index 0000000000..fc0102f0e3
--- /dev/null
+++ b/editor/icons/Zoom.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.752-.83398l4.3184 4.3184 1.4141-1.4141-4.3184-4.3184a5 5 0 0 0 .41016-.75195h-.57617v-2h-1a3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3 3 3 0 0 1 2 .76758v-1.7676h.99023a5 5 0 0 0 -2.9902-1zm5 0v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/editor/icons/ZoomLess.svg b/editor/icons/ZoomLess.svg
new file mode 100644
index 0000000000..18b052c32a
--- /dev/null
+++ b/editor/icons/ZoomLess.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><circle cx="8" cy="1044.4" fill-opacity=".39216" r="8" stroke-opacity=".98824"/><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-4 6h8v2h-8z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/ZoomMore.svg b/editor/icons/ZoomMore.svg
new file mode 100644
index 0000000000..fdc80611da
--- /dev/null
+++ b/editor/icons/ZoomMore.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><circle cx="8" cy="1044.4" fill-opacity=".39216" r="8" stroke-opacity=".98824"/><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1 3h2v3h3v2h-3v3h-2v-3h-3v-2h3z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/ZoomReset.svg b/editor/icons/ZoomReset.svg
new file mode 100644
index 0000000000..f6793b6816
--- /dev/null
+++ b/editor/icons/ZoomReset.svg
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><circle cx="8" cy="1044.4" fill-opacity=".39216" r="8" stroke-opacity=".98824"/><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-.029297 3.002a1.0001 1.0001 0 0 1 1.0293.99805v7h-2v-5.1309l-1.4453.96289-1.1094-1.6641 3-2a1.0001 1.0001 0 0 1 .52539-.16602z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg>
diff --git a/editor/icons/bool.svg b/editor/icons/bool.svg
new file mode 100644
index 0000000000..e6e32001ef
--- /dev/null
+++ b/editor/icons/bool.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v8h2a3 3 0 0 0 2.5-1.3457 3 3 0 0 0 2.5 1.3457 3 3 0 0 0 2-.76758 3 3 0 0 0 2 .76758 3 3 0 0 0 2.5-1.3457 3 3 0 0 0 2.5 1.3457v-2a1 1 0 0 1 -1-1v-5h-2v2.7695a3 3 0 0 0 -2-.76953 3 3 0 0 0 -2 .76758 3 3 0 0 0 -2-.76758 3 3 0 0 0 -2.5 1.3457 3 3 0 0 0 -2.5-1.3457v-2zm2 4a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm5 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#8da6f0"/></svg>
diff --git a/editor/icons/editor_icons_builders.py b/editor/icons/editor_icons_builders.py
index dfd0802ce9..d7145abe50 100644
--- a/editor/icons/editor_icons_builders.py
+++ b/editor/icons/editor_icons_builders.py
@@ -3,9 +3,10 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness.
"""
+
import os
+from io import StringIO
from platform_methods import subprocess_main
-from compat import StringIO
def make_editor_icons_action(target, source, env):
@@ -21,17 +22,16 @@ def make_editor_icons_action(target, source, env):
icons_string.write('\t"')
- with open(fname, 'rb') as svgf:
+ with open(fname, "rb") as svgf:
b = svgf.read(1)
- while(len(b) == 1):
+ while len(b) == 1:
icons_string.write("\\" + str(hex(ord(b)))[1:])
b = svgf.read(1)
-
icons_string.write('"')
if fname != svg_icons[-1]:
icons_string.write(",")
- icons_string.write('\n')
+ icons_string.write("\n")
s = StringIO()
s.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n")
@@ -40,21 +40,20 @@ def make_editor_icons_action(target, source, env):
s.write("static const int editor_icons_count = {};\n".format(len(svg_icons)))
s.write("static const char *editor_icons_sources[] = {\n")
s.write(icons_string.getvalue())
- s.write('};\n\n')
+ s.write("};\n\n")
s.write("static const char *editor_icons_names[] = {\n")
# this is used to store the indices of thumbnail icons
- thumb_medium_indices = [];
- thumb_big_indices = [];
+ thumb_medium_indices = []
+ thumb_big_indices = []
index = 0
for f in svg_icons:
fname = str(f)
- icon_name = os.path.basename(fname)[5:-4].title().replace("_", "")
+ # Trim the `.svg` extension from the string.
+ icon_name = os.path.basename(fname)[:-4]
# some special cases
- if icon_name in ['Int', 'Bool', 'Float']:
- icon_name = icon_name.lower()
if icon_name.endswith("MediumThumb"): # don't know a better way to handle this
thumb_medium_indices.append(str(index))
if icon_name.endswith("BigThumb"): # don't know a better way to handle this
@@ -64,11 +63,11 @@ def make_editor_icons_action(target, source, env):
if fname != svg_icons[-1]:
s.write(",")
- s.write('\n')
+ s.write("\n")
index += 1
- s.write('};\n')
+ s.write("};\n")
if thumb_medium_indices:
s.write("\n\n")
@@ -92,5 +91,5 @@ def make_editor_icons_action(target, source, env):
icons_string.close()
-if __name__ == '__main__':
+if __name__ == "__main__":
subprocess_main(globals())
diff --git a/editor/icons/float.svg b/editor/icons/float.svg
new file mode 100644
index 0000000000..1e931ad930
--- /dev/null
+++ b/editor/icons/float.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2a3 3 0 0 0 -3 3v5h2v-2h2v-2h-2v-1a1 1 0 0 1 1-1h1v-2zm3 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-5zm6 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2z" fill="#61daf4"/></svg>
diff --git a/editor/icons/icon_2_d.svg b/editor/icons/icon_2_d.svg
deleted file mode 100644
index e1a96aeab6..0000000000
--- a/editor/icons/icon_2_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-2 2a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l.29297-.29297v8.5859h8.5859l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l.29297.29297h-6.5859v-6.5859l.29297.29297a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.72266-.29102z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_3_d.svg b/editor/icons/icon_3_d.svg
deleted file mode 100644
index 2a1d5ff36d..0000000000
--- a/editor/icons/icon_3_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.9902 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-2 2a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l.29297-.29297v8.5859h8.5859l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2a1 1 0 0 0 -.72266-.29102 1 1 0 0 0 -.69141.29102 1 1 0 0 0 0 1.4141l.29297.29297h-5.1719l5.5859-5.5859v.41602a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-2.8301a1.0001 1.0001 0 0 0 -1-1h-2.8301a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h.41602l-5.5859 5.5859v-5.1719l.29297.29297a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.72266-.29102z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_checked.svg b/editor/icons/icon_GUI_checked.svg
deleted file mode 100644
index 8d00eca8d3..0000000000
--- a/editor/icons/icon_GUI_checked.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m3.3333333 1c-1.2887 0-2.3333333 1.0446683-2.3333333 2.3333333v9.3333337c0 1.2887 1.0446683 2.333333 2.3333333 2.333333h9.3333337c1.2887 0 2.333333-1.044668 2.333333-2.333333v-9.3333337c0-1.2887-1.044668-2.3333333-2.333333-2.3333333z" fill-opacity=".188235" stroke-width="1.166667"/><path d="m11.500773 3.7343508-5.6117507 5.6117502-1.7045017-1.6814543-1.4992276 1.4992276 3.2037293 3.1806817 7.1109777-7.1109775z" stroke-width="1.060227"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_dropdown.svg b/editor/icons/icon_GUI_dropdown.svg
deleted file mode 100644
index 3ed9466f4a..0000000000
--- a/editor/icons/icon_GUI_dropdown.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m4 1045.4 3 3 3-3" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.58824;stroke-width:2" transform="translate(0 -1038.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_ellipsis.svg b/editor/icons/icon_GUI_ellipsis.svg
deleted file mode 100644
index 4d530d635e..0000000000
--- a/editor/icons/icon_GUI_ellipsis.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 14 8" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m3.8594 4c-2.1381 0-3.8594 1.7213-3.8594 3.8594v.28125c0 2.1381 1.7213 3.8594 3.8594 3.8594h6.2812c2.1381 0 3.8594-1.7213 3.8594-3.8594v-.28125c0-2.1381-1.7213-3.8594-3.8594-3.8594zm-.85938 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#fff" fill-opacity=".39216" transform="translate(0 -4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_h_tick.svg b/editor/icons/icon_GUI_h_tick.svg
deleted file mode 100644
index 01fecf5d12..0000000000
--- a/editor/icons/icon_GUI_h_tick.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 4 15.999999" width="4" xmlns="http://www.w3.org/2000/svg"><circle cx="2" cy="2" fill="#fff" fill-opacity=".39216" r="1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_hsplitter.svg b/editor/icons/icon_GUI_hsplitter.svg
deleted file mode 100644
index f94a81cb1e..0000000000
--- a/editor/icons/icon_GUI_hsplitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 8 64" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m4 990.36v60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="translate(0 -988.36)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_mini_checkerboard.svg b/editor/icons/icon_GUI_mini_checkerboard.svg
deleted file mode 100644
index dc6c7e37d1..0000000000
--- a/editor/icons/icon_GUI_mini_checkerboard.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="1.9994"><path d="m0 0v8h8v-8zm8 8v8h8v-8z" fill="#e0e0e0"/><path d="m8 0v8h8v-8zm0 8h-8v8h8z" fill="#fff"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_option_arrow.svg b/editor/icons/icon_GUI_option_arrow.svg
deleted file mode 100644
index 28435e08c3..0000000000
--- a/editor/icons/icon_GUI_option_arrow.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m10 1043.4c-.26378.01-.5144.1165-.69726.3067l-3.293 3.2929-3.293-3.2929c-.18826-.1936-.44679-.3028-.7168-.3028-.89742.0002-1.3404 1.0909-.69727 1.7168l4 4c.39053.3904 1.0235.3904 1.4141 0l4-4c.65734-.6321.19491-1.7422-.7168-1.7207z" fill="#fff" fill-opacity=".78431" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_progress_bar.svg b/editor/icons/icon_GUI_progress_bar.svg
deleted file mode 100644
index a7a57adaa7..0000000000
--- a/editor/icons/icon_GUI_progress_bar.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1036.4c-1.0907-.0002-2 .9073-2 1.998v12.002c0 1.0907.9093 2 2 2h12c1.0907 0 2-.9093 2-2v-12c0-1.0907-.9093-1.9978-2-1.998zm0 2h12v11.998h-12z" fill="#e0e0e0" fill-opacity=".39216" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_progress_fill.svg b/editor/icons/icon_GUI_progress_fill.svg
deleted file mode 100644
index a75bf93edd..0000000000
--- a/editor/icons/icon_GUI_progress_fill.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><rect fill="#e0e0e0" fill-opacity=".39216" height="8" ry=".99999" width="8" x="4" y="4"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_radio_checked.svg b/editor/icons/icon_GUI_radio_checked.svg
deleted file mode 100644
index 447b57f8ae..0000000000
--- a/editor/icons/icon_GUI_radio_checked.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m15 8a7 7 0 0 1 -7 7 7 7 0 0 1 -7-7 7 7 0 0 1 7-7 7 7 0 0 1 7 7" fill-opacity=".188235" stroke-width="2.333333"/><path d="m12 8a4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4 4 4 0 0 1 4 4" stroke-width="1.333333"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_radio_unchecked.svg b/editor/icons/icon_GUI_radio_unchecked.svg
deleted file mode 100644
index 1e8117bd10..0000000000
--- a/editor/icons/icon_GUI_radio_unchecked.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 8a7 7 0 0 1 -7 7 7 7 0 0 1 -7-7 7 7 0 0 1 7-7 7 7 0 0 1 7 7" fill="#e0e0e0" fill-opacity=".188235" stroke-width="2.333333"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_arrow_left.svg b/editor/icons/icon_GUI_scroll_arrow_left.svg
deleted file mode 100644
index a118f04e17..0000000000
--- a/editor/icons/icon_GUI_scroll_arrow_left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 1 6 6 6 6 0 0 1 -6 6 6 6 0 0 1 -6-6 6 6 0 0 1 6-6zm1.0137 2a1 1 0 0 0 -.7207.29297l-3 3a1.0001 1.0001 0 0 0 0 1.4141l3 3a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2.293-2.293 2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.69336-.29297z" fill="#e0e0e0" fill-opacity=".78431" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_arrow_left_hl.svg b/editor/icons/icon_GUI_scroll_arrow_left_hl.svg
deleted file mode 100644
index 046356f18b..0000000000
--- a/editor/icons/icon_GUI_scroll_arrow_left_hl.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 1 6 6 6 6 0 0 1 -6 6 6 6 0 0 1 -6-6 6 6 0 0 1 6-6zm1.0137 2a1 1 0 0 0 -.7207.29297l-3 3a1.0001 1.0001 0 0 0 0 1.4141l3 3a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2.293-2.293 2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.69336-.29297z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_arrow_right.svg b/editor/icons/icon_GUI_scroll_arrow_right.svg
deleted file mode 100644
index 4e0a8b5327..0000000000
--- a/editor/icons/icon_GUI_scroll_arrow_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm-1.0137 2a1 1 0 0 1 .7207.29297l3 3a1.0001 1.0001 0 0 1 0 1.4141l-3 3a1 1 0 0 1 -1.4141 0 1 1 0 0 1 0-1.4141l2.293-2.293-2.293-2.293a1 1 0 0 1 0-1.4141 1 1 0 0 1 .69336-.29297z" fill="#e0e0e0" fill-opacity=".78431" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_arrow_right_hl.svg b/editor/icons/icon_GUI_scroll_arrow_right_hl.svg
deleted file mode 100644
index 4224ca8de4..0000000000
--- a/editor/icons/icon_GUI_scroll_arrow_right_hl.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm-1.0137 2a1 1 0 0 1 .7207.29297l3 3a1.0001 1.0001 0 0 1 0 1.4141l-3 3a1 1 0 0 1 -1.4141 0 1 1 0 0 1 0-1.4141l2.293-2.293-2.293-2.293a1 1 0 0 1 0-1.4141 1 1 0 0 1 .69336-.29297z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_bg.svg b/editor/icons/icon_GUI_scroll_bg.svg
deleted file mode 100644
index 263b42ea61..0000000000
--- a/editor/icons/icon_GUI_scroll_bg.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"/> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_grabber.svg b/editor/icons/icon_GUI_scroll_grabber.svg
deleted file mode 100644
index 9f6e9f2e25..0000000000
--- a/editor/icons/icon_GUI_scroll_grabber.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="6" fill="#fff" fill-opacity=".27451" r="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_grabber_hl.svg b/editor/icons/icon_GUI_scroll_grabber_hl.svg
deleted file mode 100644
index bf5bce6934..0000000000
--- a/editor/icons/icon_GUI_scroll_grabber_hl.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="6" fill="#f9f9f9" fill-opacity=".73" r="3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_scroll_grabber_pressed.svg b/editor/icons/icon_GUI_scroll_grabber_pressed.svg
deleted file mode 100644
index da26032474..0000000000
--- a/editor/icons/icon_GUI_scroll_grabber_pressed.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 11.999999" width="12" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="6" fill="#afafaf" fill-opacity=".72941" r="3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_slider_grabber.svg b/editor/icons/icon_GUI_slider_grabber.svg
deleted file mode 100644
index dd751ead80..0000000000
--- a/editor/icons/icon_GUI_slider_grabber.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2a5 5 0 0 1 .5.025391 5 5 0 0 1 .49414.074219 5 5 0 0 1 .48438.12305 5 5 0 0 1 .46875.17188 5 5 0 0 1 .44922.2168 5 5 0 0 1 .42578.26172 5 5 0 0 1 .39844.30273 5 5 0 0 1 .36524.33984 5 5 0 0 1 .33008.37695 5 5 0 0 1 .29102.40625 5 5 0 0 1 .24805.43359 5 5 0 0 1 .20508.45508 5 5 0 0 1 .1582.47461 5 5 0 0 1 .10938.48828 5 5 0 0 1 .060547.49609 5 5 0 0 1 .011719.35352 5 5 0 0 1 -.025391.5 5 5 0 0 1 -.074218.49414 5 5 0 0 1 -.12305.48438 5 5 0 0 1 -.17188.46875 5 5 0 0 1 -.2168.44922 5 5 0 0 1 -.26172.42578 5 5 0 0 1 -.30273.39844 5 5 0 0 1 -.33984.36524 5 5 0 0 1 -.37695.33008 5 5 0 0 1 -.40625.29102 5 5 0 0 1 -.43359.24805 5 5 0 0 1 -.45508.20508 5 5 0 0 1 -.47461.1582 5 5 0 0 1 -.48828.10938 5 5 0 0 1 -.49609.060547 5 5 0 0 1 -.35352.011719 5 5 0 0 1 -.5-.025391 5 5 0 0 1 -.49414-.074218 5 5 0 0 1 -.48438-.12305 5 5 0 0 1 -.46875-.17188 5 5 0 0 1 -.44922-.2168 5 5 0 0 1 -.42578-.26172 5 5 0 0 1 -.39844-.30273 5 5 0 0 1 -.36523-.33984 5 5 0 0 1 -.33008-.37695 5 5 0 0 1 -.29102-.40625 5 5 0 0 1 -.24805-.43359 5 5 0 0 1 -.20508-.45508 5 5 0 0 1 -.1582-.47461 5 5 0 0 1 -.10938-.48828 5 5 0 0 1 -.060547-.49609 5 5 0 0 1 -.011719-.35352 5 5 0 0 1 .025391-.5 5 5 0 0 1 .074219-.49414 5 5 0 0 1 .12305-.48438 5 5 0 0 1 .17188-.46875 5 5 0 0 1 .2168-.44922 5 5 0 0 1 .26172-.42578 5 5 0 0 1 .30273-.39844 5 5 0 0 1 .33984-.36523 5 5 0 0 1 .37695-.33008 5 5 0 0 1 .40625-.29102 5 5 0 0 1 .43359-.24805 5 5 0 0 1 .45508-.20508 5 5 0 0 1 .47461-.1582 5 5 0 0 1 .48828-.10938 5 5 0 0 1 .49609-.060547 5 5 0 0 1 .35352-.011719z" fill="#e0e0e0" fill-opacity=".289256" transform="translate(0 1036.4)"/><circle cx="8" cy="1044.4" r="3" style="fill:#fff;fill-opacity:.58824;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.32549;stroke-width:3"/></g><circle cx="7.932204" cy="8" fill="#fff" fill-opacity=".78431" r="3" stroke-linejoin="round" stroke-opacity=".39216" stroke-width="3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_slider_grabber_hl.svg b/editor/icons/icon_GUI_slider_grabber_hl.svg
deleted file mode 100644
index 90d62934ec..0000000000
--- a/editor/icons/icon_GUI_slider_grabber_hl.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2a5 5 0 0 1 .5.025391 5 5 0 0 1 .49414.074219 5 5 0 0 1 .48438.12305 5 5 0 0 1 .46875.17188 5 5 0 0 1 .44922.2168 5 5 0 0 1 .42578.26172 5 5 0 0 1 .39844.30273 5 5 0 0 1 .36524.33984 5 5 0 0 1 .33008.37695 5 5 0 0 1 .29102.40625 5 5 0 0 1 .24805.43359 5 5 0 0 1 .20508.45508 5 5 0 0 1 .1582.47461 5 5 0 0 1 .10938.48828 5 5 0 0 1 .060547.49609 5 5 0 0 1 .011719.35352 5 5 0 0 1 -.025391.5 5 5 0 0 1 -.074218.49414 5 5 0 0 1 -.12305.48438 5 5 0 0 1 -.17188.46875 5 5 0 0 1 -.2168.44922 5 5 0 0 1 -.26172.42578 5 5 0 0 1 -.30273.39844 5 5 0 0 1 -.33984.36524 5 5 0 0 1 -.37695.33008 5 5 0 0 1 -.40625.29102 5 5 0 0 1 -.43359.24805 5 5 0 0 1 -.45508.20508 5 5 0 0 1 -.47461.1582 5 5 0 0 1 -.48828.10938 5 5 0 0 1 -.49609.060547 5 5 0 0 1 -.35352.011719 5 5 0 0 1 -.5-.025391 5 5 0 0 1 -.49414-.074218 5 5 0 0 1 -.48438-.12305 5 5 0 0 1 -.46875-.17188 5 5 0 0 1 -.44922-.2168 5 5 0 0 1 -.42578-.26172 5 5 0 0 1 -.39844-.30273 5 5 0 0 1 -.36523-.33984 5 5 0 0 1 -.33008-.37695 5 5 0 0 1 -.29102-.40625 5 5 0 0 1 -.24805-.43359 5 5 0 0 1 -.20508-.45508 5 5 0 0 1 -.1582-.47461 5 5 0 0 1 -.10938-.48828 5 5 0 0 1 -.060547-.49609 5 5 0 0 1 -.011719-.35352 5 5 0 0 1 .025391-.5 5 5 0 0 1 .074219-.49414 5 5 0 0 1 .12305-.48438 5 5 0 0 1 .17188-.46875 5 5 0 0 1 .2168-.44922 5 5 0 0 1 .26172-.42578 5 5 0 0 1 .30273-.39844 5 5 0 0 1 .33984-.36523 5 5 0 0 1 .37695-.33008 5 5 0 0 1 .40625-.29102 5 5 0 0 1 .43359-.24805 5 5 0 0 1 .45508-.20508 5 5 0 0 1 .47461-.1582 5 5 0 0 1 .48828-.10938 5 5 0 0 1 .49609-.060547 5 5 0 0 1 .35352-.011719z" fill="#e0e0e0" transform="translate(0 1036.4)"/><circle cx="8" cy="1044.4" r="3" style="fill:#fff;fill-opacity:.58824;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.32549;stroke-width:3"/></g><circle cx="7.932204" cy="8" fill="#fff" fill-opacity=".78431" r="3" stroke-linejoin="round" stroke-opacity=".39216" stroke-width="3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_space.svg b/editor/icons/icon_GUI_space.svg
deleted file mode 100644
index b43e97b6e1..0000000000
--- a/editor/icons/icon_GUI_space.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 7.9999993" width="8" xmlns="http://www.w3.org/2000/svg"><circle cx="6" cy="1046.4" fill="#fff" fill-opacity=".196078" r="3" transform="matrix(.5 0 0 -.5 1 527.20001)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_spinbox_updown.svg b/editor/icons/icon_GUI_spinbox_updown.svg
deleted file mode 100644
index a6776728e3..0000000000
--- a/editor/icons/icon_GUI_spinbox_updown.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-4 4a1.0001 1.0001 0 1 0 1.4141 1.4141l3.293-3.293 3.293 3.293a1.0001 1.0001 0 1 0 1.4141-1.4141l-4-4a1.0001 1.0001 0 0 0 -.72266-.29102zm4.0059 7.9844a1.0001 1.0001 0 0 0 -.69726.30664l-3.293 3.293-3.293-3.293a1.0001 1.0001 0 0 0 -.7168-.30273 1.0001 1.0001 0 0 0 -.69727 1.7168l4 4a1.0001 1.0001 0 0 0 1.4141 0l4-4a1.0001 1.0001 0 0 0 -.7168-1.7207z" fill="#e0e0e0" fill-opacity=".78431"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_tab.svg b/editor/icons/icon_GUI_tab.svg
deleted file mode 100644
index 8451ebe5c0..0000000000
--- a/editor/icons/icon_GUI_tab.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v8h2v-8zm-5.0137.0019531a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2.293 2.293-2.293 2.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l3-3a1.0001 1.0001 0 0 0 0-1.4141l-3-3a1 1 0 0 0 -.7207-.29102z" fill="#fff" fill-opacity=".19608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_tab_menu.svg b/editor/icons/icon_GUI_tab_menu.svg
deleted file mode 100644
index 8bf5ef2f7d..0000000000
--- a/editor/icons/icon_GUI_tab_menu.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 6 16" width="6" xmlns="http://www.w3.org/2000/svg"><path d="m3 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_tab_menu_hl.svg b/editor/icons/icon_GUI_tab_menu_hl.svg
deleted file mode 100644
index 42d58a5abf..0000000000
--- a/editor/icons/icon_GUI_tab_menu_hl.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 6 16" width="6" xmlns="http://www.w3.org/2000/svg"><path d="m3 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm0 6a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_toggle_off.svg b/editor/icons/icon_GUI_toggle_off.svg
deleted file mode 100644
index 46f13d198d..0000000000
--- a/editor/icons/icon_GUI_toggle_off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="26" viewBox="0 0 42 25.999998" width="42" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><rect fill-opacity=".188235" height="16" rx="9" stroke-width="55.8958" width="38" x="2" y="5"/><circle cx="10" cy="13" r="5" stroke-width="97.3613"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_toggle_on.svg b/editor/icons/icon_GUI_toggle_on.svg
deleted file mode 100644
index 0316680daa..0000000000
--- a/editor/icons/icon_GUI_toggle_on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="26" viewBox="0 0 42 25.999998" width="42" xmlns="http://www.w3.org/2000/svg"><path d="m11 5c-4.986 0-9 3.568-9 8s4.014 8 9 8h20c4.986 0 9-3.568 9-8s-4.014-8-9-8zm21 3a5 5 0 0 1 5 5 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 5-5z" fill="#e0e0e0" stroke-width="55.8958"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_tree_arrow_down.svg b/editor/icons/icon_GUI_tree_arrow_down.svg
deleted file mode 100644
index fd2d900711..0000000000
--- a/editor/icons/icon_GUI_tree_arrow_down.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m3 1045.4 3 3 3-3" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.39216;stroke-width:2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_tree_arrow_right.svg b/editor/icons/icon_GUI_tree_arrow_right.svg
deleted file mode 100644
index e20c92e2e7..0000000000
--- a/editor/icons/icon_GUI_tree_arrow_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m4 1049.4 3-3-3-3" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.39216;stroke-width:2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_tree_arrow_up.svg b/editor/icons/icon_GUI_tree_arrow_up.svg
deleted file mode 100644
index 464363a8b1..0000000000
--- a/editor/icons/icon_GUI_tree_arrow_up.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m3 1045.4 3 3 3-3" style="fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.39216" transform="matrix(-1 0 0 -1 12 1052.16952)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_tree_updown.svg b/editor/icons/icon_GUI_tree_updown.svg
deleted file mode 100644
index 66716845df..0000000000
--- a/editor/icons/icon_GUI_tree_updown.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m6.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-3 3a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2.293-2.293 2.293 2.293a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-3-3a1.0001 1.0001 0 0 0 -.72266-.29102zm3 6.998a1 1 0 0 0 -.69141.29297l-2.293 2.293-2.293-2.293a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l3 3a1.0001 1.0001 0 0 0 1.4141 0l3-3a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.72266-.29297z" fill="#fff" fill-opacity=".58824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_unchecked.svg b/editor/icons/icon_GUI_unchecked.svg
deleted file mode 100644
index 9575422df3..0000000000
--- a/editor/icons/icon_GUI_unchecked.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 15.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.3333333 1c-1.2887 0-2.3333333 1.0446683-2.3333333 2.3333333v9.3333337c0 1.2887 1.0446683 2.333333 2.3333333 2.333333h9.3333337c1.2887 0 2.333333-1.044668 2.333333-2.333333v-9.3333337c0-1.2887-1.044668-2.3333333-2.333333-2.3333333z" fill="#e0e0e0" fill-opacity=".188235" stroke-width="1.166667"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_v_tick.svg b/editor/icons/icon_GUI_v_tick.svg
deleted file mode 100644
index 4205237952..0000000000
--- a/editor/icons/icon_GUI_v_tick.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="4" viewBox="0 0 16 3.9999998" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="2" cy="2" fill="#fff" fill-opacity=".39216" r="1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_viewport_hdiagsplitter.svg b/editor/icons/icon_GUI_viewport_hdiagsplitter.svg
deleted file mode 100644
index b1705582dc..0000000000
--- a/editor/icons/icon_GUI_viewport_hdiagsplitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="34" viewBox="0 0 64 34" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m4.0307 1048.4h29.969m-30 30v-60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="matrix(0 1 -1 0 1080.4 -2)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_viewport_vdiagsplitter.svg b/editor/icons/icon_GUI_viewport_vdiagsplitter.svg
deleted file mode 100644
index 0817529ff1..0000000000
--- a/editor/icons/icon_GUI_viewport_vdiagsplitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 34 64" width="34" xmlns="http://www.w3.org/2000/svg"><path d="m4.0307 1048.4h29.969m-30 30v-60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="matrix(-1 0 0 -1 36.008 1080.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_viewport_vhsplitter.svg b/editor/icons/icon_GUI_viewport_vhsplitter.svg
deleted file mode 100644
index a11fbd1b4c..0000000000
--- a/editor/icons/icon_GUI_viewport_vhsplitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m-26 1048.4h60m-30 30v-60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="matrix(0 1 -1 0 1080.4 28)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_visibility_hidden.svg b/editor/icons/icon_GUI_visibility_hidden.svg
deleted file mode 100644
index 1d1e61d1bb..0000000000
--- a/editor/icons/icon_GUI_visibility_hidden.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9609 7.7266-1.9219.54883c.31999 1.12.8236 2.0593 1.4316 2.8398l-.83398.83398 1.4141 1.4141.84375-.84375c.98585.74762 2.0766 1.2067 3.1055 1.3867v1.0938h2v-1.0938c1.0288-.17998 2.1196-.6391 3.1055-1.3867l.84375.84375 1.4141-1.4141-.83398-.83398c.60804-.78055 1.1117-1.7199 1.4316-2.8398l-1.9219-.54883c-.8756 3.0646-3.5391 4.2734-5.0391 4.2734s-4.1635-1.2088-5.0391-4.2734z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_visibility_visible.svg b/editor/icons/icon_GUI_visibility_visible.svg
deleted file mode 100644
index 2e56f57ed8..0000000000
--- a/editor/icons/icon_GUI_visibility_visible.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.00586.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.55273c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_visibility_xray.svg b/editor/icons/icon_GUI_visibility_xray.svg
deleted file mode 100644
index 241ff3e7e5..0000000000
--- a/editor/icons/icon_GUI_visibility_xray.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-rule="evenodd"><path d="m7.9998 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.00586.5703c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.5527c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill-opacity=".39216"/><path d="m8 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.00586.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246v-2a4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_vsplit_bg.svg b/editor/icons/icon_GUI_vsplit_bg.svg
deleted file mode 100644
index fa572c797e..0000000000
--- a/editor/icons/icon_GUI_vsplit_bg.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 7.9999995" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h8v8h-8z" fill-opacity=".098039"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_GUI_vsplitter.svg b/editor/icons/icon_GUI_vsplitter.svg
deleted file mode 100644
index 8629801713..0000000000
--- a/editor/icons/icon_GUI_vsplitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 64 8" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m2 1048.4h60" fill="none" stroke="#fff" stroke-linecap="round" stroke-opacity=".39216" stroke-width="2" transform="translate(0 -1044.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_a_a_b_b.svg b/editor/icons/icon_a_a_b_b.svg
deleted file mode 100644
index d6fbc52541..0000000000
--- a/editor/icons/icon_a_a_b_b.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1a3 3 0 0 0 -3 3 3 3 0 0 0 .77734 2.0117 3 3 0 0 0 -2.7773 2.9883 3 3 0 0 0 3 3h2v-5h2v-6h-2zm6 0v5.1738a3 3 0 0 0 -1-.17383v-2h-2v8h2a3 3 0 0 0 3-3 3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2h-2zm-6 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm8 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm-10 3v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm7 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#ee7991"/><path d="m8 4v8h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2zm-5 2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-6zm0 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm7 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#fff" fill-opacity=".23529"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_a_r_v_r_anchor.svg b/editor/icons/icon_a_r_v_r_anchor.svg
deleted file mode 100644
index f1571b3fcc..0000000000
--- a/editor/icons/icon_a_r_v_r_anchor.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h-2v2h2v3.2656l-2.5527-1.2773c-.15005-.075253-.31662-.11152-.48438-.10547-.36536.013648-.69415.2256-.85742.55273-.24709.49403-.046823 1.0948.44727 1.3418l4.4473 2.2227 4.4473-2.2227c.49409-.24697.69435-.84777.44726-1.3418-.24697-.49409-.84777-.69435-1.3418-.44727l-2.5527 1.2773v-3.2656h2v-2h-2v-2zm-3 11v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v4h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_a_r_v_r_camera.svg b/editor/icons/icon_a_r_v_r_camera.svg
deleted file mode 100644
index f59a8c8b4a..0000000000
--- a/editor/icons/icon_a_r_v_r_camera.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9.5 0a3 3 0 0 0 -2.9883 2.7773 3 3 0 0 0 -2.0117-.77734 3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8242v2.1758c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695a3 3 0 0 0 1-2.2305 3 3 0 0 0 -3-3zm-5.5 12v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v1 3h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_a_r_v_r_controller.svg b/editor/icons/icon_a_r_v_r_controller.svg
deleted file mode 100644
index 40e5b8dce1..0000000000
--- a/editor/icons/icon_a_r_v_r_controller.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.554 0-1 .446-1 1v6c0 .554.446 1 1 1h12c.554 0 1-.446 1-1v-6c0-.554-.446-1-1-1zm2 1h2v2h2v2h-2v2h-2v-2h-2v-2h2zm9 1c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-2 2c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-7 7v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v1 3h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_a_r_v_r_origin.svg b/editor/icons/icon_a_r_v_r_origin.svg
deleted file mode 100644
index dbb93ba7a5..0000000000
--- a/editor/icons/icon_a_r_v_r_origin.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3h2v-3zm-4 4v2h3v-2zm5 0c-.55228 0-1 .44772-1 1s.44772 1 1 1 1-.44772 1-1-.44772-1-1-1zm2 0v2h3v-2zm-3 3v3h2v-3zm-3 4v1c0 .55228.44772 1 1 1-.55228 0-1 .44772-1 1v1h1v-1h1v1h1v-1c0-.55228-.44772-1-1-1 .55228 0 1-.44772 1-1v-1h-1v1h-1v-1zm5 0v1 3h1v-1h1v1h1v-1c-.000834-.17579-.047991-.34825-.13672-.5.088728-.15175.13588-.32421.13672-.5v-1c0-.55228-.44772-1-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_accept_dialog.svg b/editor/icons/icon_accept_dialog.svg
deleted file mode 100644
index e0bf7b8336..0000000000
--- a/editor/icons/icon_accept_dialog.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm9.4746 1.6367 1.4141 1.4141-4.9492 4.9492-2.8281-2.8281 1.4141-1.4141 1.4141 1.4141z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_action_copy.svg b/editor/icons/icon_action_copy.svg
deleted file mode 100644
index d7a1e1097a..0000000000
--- a/editor/icons/icon_action_copy.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.554 0-1 .446-1 1v9c0 .554.446 1 1 1h1v-9h9v-1c0-.554-.446-1-1-1zm3 3c-.554 0-1 .446-1 1v9c0 .554.446 1 1 1h9c.554 0 1-.446 1-1v-9c0-.554-.446-1-1-1zm1 2h7v7h-7z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_action_cut.svg b/editor/icons/icon_action_cut.svg
deleted file mode 100644
index 97df9b2d5a..0000000000
--- a/editor/icons/icon_action_cut.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.6348.50977c-2.9641 2.866.53553 8.9289 2.7676 8.7949l.44141.76562-.56445.97852a3 3 0 0 0 -2.2793-1.0488 3 3 0 0 0 -3 3 3 3 0 0 0 3 3 3 3 0 0 0 2.5938-1.502l.0039062.001953 1.4023-2.4277 1.4023 2.4277.0019531-.001953a3 3 0 0 0 2.5957 1.502 3 3 0 0 0 3-3 3 3 0 0 0 -3-3 3 3 0 0 0 -2.2773 1.0527l-.56641-.98242.44141-.76562c2.2321.13397 5.7317-5.9289 2.7676-8.7949l-4.3652 7.5605-4.3652-7.5605zm.36523 11.49a1 1 0 0 1 1 1 1 1 0 0 1 -.12305.47852l-.011719.021484a1 1 0 0 1 -.86523.5 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm8 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_action_paste.svg b/editor/icons/icon_action_paste.svg
deleted file mode 100644
index 6d46f899f8..0000000000
--- a/editor/icons/icon_action_paste.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.3045 0-2.4033.8372-2.8164 2h-3.1836c-.554 0-1 .446-1 1v10c0 .554.446 1 1 1h12c.554 0 1-.446 1-1v-10c0-.554-.446-1-1-1h-3.1836c-.41312-1.1628-1.5119-2-2.8164-2zm0 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-5 2h2v2h6v-2h2v8h-10z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_add.svg b/editor/icons/icon_add.svg
deleted file mode 100644
index a241829603..0000000000
--- a/editor/icons/icon_add.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_add_atlas_tile.svg b/editor/icons/icon_add_atlas_tile.svg
deleted file mode 100644
index 97d3590678..0000000000
--- a/editor/icons/icon_add_atlas_tile.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#c9cfd4"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_add_autotile.svg b/editor/icons/icon_add_autotile.svg
deleted file mode 100644
index c6f1df422d..0000000000
--- a/editor/icons/icon_add_autotile.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#4490fc"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_add_single_tile.svg b/editor/icons/icon_add_single_tile.svg
deleted file mode 100644
index 319fef8078..0000000000
--- a/editor/icons/icon_add_single_tile.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#fce844"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_add_split.svg b/editor/icons/icon_add_split.svg
deleted file mode 100644
index 1f33e8c72b..0000000000
--- a/editor/icons/icon_add_split.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 13 10-10" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/><circle cx="4" cy="12" fill="none" r="2"/><path d="m13 1a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-10 10a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_anchor.svg b/editor/icons/icon_anchor.svg
deleted file mode 100644
index 119960d177..0000000000
--- a/editor/icons/icon_anchor.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8262v.17383h-2v2h2v3.8984a5 5 0 0 1 -3.8281-3.6035l-1.9336.51758a7 7 0 0 0 6.7617 5.1875 7 7 0 0 0 6.7617-5.1875l-1.9375-.51953a5 5 0 0 1 -3.8242 3.6035v-3.8965h2v-2h-2v-.17578a3 3 0 0 0 2-2.8242 3 3 0 0 0 -3-3zm0 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animated_sprite.svg b/editor/icons/icon_animated_sprite.svg
deleted file mode 100644
index 411ddda015..0000000000
--- a/editor/icons/icon_animated_sprite.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5b7f3"><path d="m7 0c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v6c1.108 0 2-.89199 2-2v-6c0-1.108-.89199-2-2-2z" fill-opacity=".39216"/><path d="m5 2c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2z" fill-opacity=".58824"/><path d="m3 4c-1.108 0-2 .89199-2 2v7c0 1.108.89199 2 2 2h7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2zm0 4c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm7 0c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm-6 4h5a2.5 2 0 0 1 -1.25 1.7324 2.5 2 0 0 1 -2.5 0 2.5 2 0 0 1 -1.25-1.7324z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animated_sprite_3d.svg b/editor/icons/icon_animated_sprite_3d.svg
deleted file mode 100644
index 974c4e04eb..0000000000
--- a/editor/icons/icon_animated_sprite_3d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc9c9c"><path d="m7 0c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v6c1.108 0 2-.89199 2-2v-6c0-1.108-.89199-2-2-2z" fill-opacity=".39216"/><path d="m5 2c-1.108 0-2 .89199-2 2h7c1.108 0 2 .89199 2 2v7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2z" fill-opacity=".58824"/><path d="m3 4c-1.108 0-2 .89199-2 2v7c0 1.108.89199 2 2 2h7c1.108 0 2-.89199 2-2v-7c0-1.108-.89199-2-2-2zm0 4c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm7 0c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm-6 4h5a2.5 2 0 0 1 -1.25 1.7324 2.5 2 0 0 1 -2.5 0 2.5 2 0 0 1 -1.25-1.7324z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animated_texture.svg b/editor/icons/icon_animated_texture.svg
deleted file mode 100644
index 3719b64747..0000000000
--- a/editor/icons/icon_animated_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><filter id="a" color-interpolation-filters="sRGB" height="1.024" width="1.024" x="-.012" y="-.012"><feGaussianBlur stdDeviation=".07"/></filter><path d="m1 1037.4v14h1.1667v-2h1.8333v2h8v-2h2v2h1v-14h-1v2h-2v-2h-8v2h-1.8333v-2zm1.1667 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2zm-9.8333 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2z" fill="#e0e0e0" filter="url(#a)" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animation.svg b/editor/icons/icon_animation.svg
deleted file mode 100644
index 2cb738a8a6..0000000000
--- a/editor/icons/icon_animation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 4-1.5352v1.5352h.001953a2 2 0 0 0 .26562 1 2 2 0 0 0 1.7324 1h1v-1-1h-.5a.5.49999 0 0 1 -.5-.5v-.5-5a6 6 0 0 0 -6-6zm0 1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm3.4414 2a1 1 0 0 1 .88867.5 1 1 0 0 1 -.36523 1.3652 1 1 0 0 1 -1.3672-.36523 1 1 0 0 1 .36719-1.3652 1 1 0 0 1 .47656-.13477zm-6.9531.0019531a1 1 0 0 1 .54688.13281 1 1 0 0 1 .36719 1.3652 1 1 0 0 1 -1.3672.36523 1 1 0 0 1 -.36523-1.3652 1 1 0 0 1 .81836-.49805zm.023438 3.998a1 1 0 0 1 .89062.5 1 1 0 0 1 -.36719 1.3652 1 1 0 0 1 -1.3652-.36523 1 1 0 0 1 .36523-1.3652 1 1 0 0 1 .47656-.13477zm6.9043.0019531a1 1 0 0 1 .54883.13281 1 1 0 0 1 .36523 1.3652 1 1 0 0 1 -1.3652.36523 1 1 0 0 1 -.36719-1.3652 1 1 0 0 1 .81836-.49805zm-3.416 1.998a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animation_filter.svg b/editor/icons/icon_animation_filter.svg
deleted file mode 100644
index 45c323543d..0000000000
--- a/editor/icons/icon_animation_filter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m495.289 20.143h-478.58c-14.938 0-22.344 18.205-11.666 28.636l169.7 165.778v260.587c0 14.041 16.259 21.739 27.131 13.031l129.143-103.432c3.956-3.169 6.258-7.962 6.258-13.031v-157.156l169.68-165.777c10.688-10.44 3.259-28.636-11.666-28.636z" fill="#e0e0e0" transform="matrix(.02719109 0 0 .02719109 1.315346 1.002286)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animation_player.svg b/editor/icons/icon_animation_player.svg
deleted file mode 100644
index a5f7804e0d..0000000000
--- a/editor/icons/icon_animation_player.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1037.4v14h1.1667v-2h1.8333v2h8v-2h2v2h1v-14h-1v2h-2v-2h-8v2h-1.8333v-2zm1.1667 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2zm-9.8333 4h1.8333v2h-1.8333zm9.8333 0h2v2h-2z" fill="#cea4f1" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animation_track_group.svg b/editor/icons/icon_animation_track_group.svg
deleted file mode 100644
index d0d14b7c44..0000000000
--- a/editor/icons/icon_animation_track_group.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m5.0508475 2v2h8.9491525v-2zm-3.322034-.016949v2h2v-2zm7.2542373 5.016949v2h5.0169492v-2zm-3.5254237 5v2h2v-2zm3.5254237 0v2h5.0169492v-2z"/><path d="m5.4915255 6.9322039v1.999999h2v-1.999999z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animation_track_list.svg b/editor/icons/icon_animation_track_list.svg
deleted file mode 100644
index e47c8b18cb..0000000000
--- a/editor/icons/icon_animation_track_list.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animation_tree.svg b/editor/icons/icon_animation_tree.svg
deleted file mode 100644
index 718eaac2d2..0000000000
--- a/editor/icons/icon_animation_tree.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h1.166v-2h1.834v2h8v-2h2v2h1v-14h-1v2h-2v-2h-8v2h-1.834v-2zm4 3h2v1 1h1 3v2h-2v1 1h1 1v2h-1-2a1.0001 1.0001 0 0 1 -1-1v-1-2h-1a1.0001 1.0001 0 0 1 -1-1v-1-1zm-2.834 1h1.834v2h-1.834zm9.834 0h2v2h-2zm-9.834 4h1.834v2h-1.834zm9.834 0h2v2h-2z" fill="#cea4f1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_animation_tree_player.svg b/editor/icons/icon_animation_tree_player.svg
deleted file mode 100644
index 718eaac2d2..0000000000
--- a/editor/icons/icon_animation_tree_player.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h1.166v-2h1.834v2h8v-2h2v2h1v-14h-1v2h-2v-2h-8v2h-1.834v-2zm4 3h2v1 1h1 3v2h-2v1 1h1 1v2h-1-2a1.0001 1.0001 0 0 1 -1-1v-1-2h-1a1.0001 1.0001 0 0 1 -1-1v-1-1zm-2.834 1h1.834v2h-1.834zm9.834 0h2v2h-2zm-9.834 4h1.834v2h-1.834zm9.834 0h2v2h-2z" fill="#cea4f1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_area.svg b/editor/icons/icon_area.svg
deleted file mode 100644
index 21ebe3c251..0000000000
--- a/editor/icons/icon_area.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 2h2v-2h2v-2zm10 0v2h2v2h2v-4zm-7 3v2 4 2h8v-2-6zm2 2h4v4h-4zm-5 5v2 2h2 2v-2h-2v-2zm12 0v2h-2v2h4v-2-2z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_area_2d.svg b/editor/icons/icon_area_2d.svg
deleted file mode 100644
index e374205b13..0000000000
--- a/editor/icons/icon_area_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 2h2v-2h2v-2zm10 0v2h2v2h2v-4zm-7 3v2 4 2h8v-2-6zm2 2h4v4h-4zm-5 5v2 2h2 2v-2h-2v-2zm12 0v2h-2v2h4v-2-2z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_array.svg b/editor/icons/icon_array.svg
deleted file mode 100644
index d499fcac3a..0000000000
--- a/editor/icons/icon_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 4a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-6zm6 0a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2zm4 0a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2zm-10 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_array_mesh.svg b/editor/icons/icon_array_mesh.svg
deleted file mode 100644
index 394a18623d..0000000000
--- a/editor/icons/icon_array_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm10 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-2 7v3h-3v2h3v3h2v-3h3v-2h-3v-3zm-8 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_arrow_down.svg b/editor/icons/icon_arrow_down.svg
deleted file mode 100644
index 49a93e6e28..0000000000
--- a/editor/icons/icon_arrow_down.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 3.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2.293 2.293h-4.5859c-.55228 0-1 .4477-1 1s.44772 1 1 1h4.5859l-2.293 2.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l4-4a1.0001 1.0001 0 0 0 0-1.4141l-4-4a1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" fill-opacity=".99608" transform="matrix(0 1 -1 0 16.0021 -.00004)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_arrow_left.svg b/editor/icons/icon_arrow_left.svg
deleted file mode 100644
index fbbe5d9075..0000000000
--- a/editor/icons/icon_arrow_left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9863 3.002a1 1 0 0 0 -.69336.29102l-4 4a1.0001 1.0001 0 0 0 0 1.4141l4 4a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2.293-2.293h4.5859a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-4.5859l2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_arrow_right.svg b/editor/icons/icon_arrow_right.svg
deleted file mode 100644
index 7895158bb1..0000000000
--- a/editor/icons/icon_arrow_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 3.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2.293 2.293h-4.5859c-.55228 0-1 .4477-1 1s.44772 1 1 1h4.5859l-2.293 2.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l4-4a1.0001 1.0001 0 0 0 0-1.4141l-4-4a1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_arrow_up.svg b/editor/icons/icon_arrow_up.svg
deleted file mode 100644
index 9bf19a6a12..0000000000
--- a/editor/icons/icon_arrow_up.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.00008 1049.4022a1 1 0 0 0 .69336-.291 1 1 0 0 0 0-1.4141l-2.293-2.293h4.5859c.55228 0 1-.4477 1-1s-.44772-1-1-1h-4.5859l2.293-2.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -1.4141 0l-4 4a1.0001 1.0001 0 0 0 0 1.4141l4 4a1 1 0 0 0 .7207.291z" fill="#e0e0e0" fill-opacity=".99608" transform="matrix(0 1 -1 0 1052.4021 -.00004)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_asset_lib.svg b/editor/icons/icon_asset_lib.svg
deleted file mode 100644
index 72b20ec047..0000000000
--- a/editor/icons/icon_asset_lib.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.6569 0-3 1.3431-3 3v2h-3c-.66446.0003505-1.1438.6366-.96094 1.2754l2 7c.12287.42881.51487.7244.96094.72461h8c.44606-.000209.83806-.2958.96094-.72461l2-7c.1829-.63879-.29648-1.275-.96094-1.2754h-3v-2c0-1.6569-1.3431-3-3-3zm0 2c.55228 0 1 .44772 1 1v2h-2v-2c0-.55228.44772-1 1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_atlas_texture.svg b/editor/icons/icon_atlas_texture.svg
deleted file mode 100644
index 28a44e179a..0000000000
--- a/editor/icons/icon_atlas_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1037.4-5 2v12l5-2 4 2 5-2v-12l-5 2zm0 2 4 2v8l-4-2z" fill="#e0e0e0" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_bus_bypass.svg b/editor/icons/icon_audio_bus_bypass.svg
deleted file mode 100644
index c251a7c83f..0000000000
--- a/editor/icons/icon_audio_bus_bypass.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 3c-.55226.0000552-.99994.44774-1 1v8c.0000552.55226.44774.99994 1 1h4c1.0702 0 2.0645-.5732 2.5996-1.5s.5351-2.0732 0-3c-.40058-.69381-1.058-1.1892-1.8125-1.3945.33452-.84425.27204-1.8062-.18945-2.6055-.5351-.9268-1.5275-1.5-2.5977-1.5zm1 2h1c.35887 0 .6858.1892.86523.5s.17943.6892 0 1-.50637.5-.86523.5h-1zm0 4h1 2c.35887 0 .68775.1892.86719.5.17943.3108.17943.6892 0 1-.17944.3108-.50832.5-.86719.5h-3z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_bus_layout.svg b/editor/icons/icon_audio_bus_layout.svg
deleted file mode 100644
index f95794a7c7..0000000000
--- a/editor/icons/icon_audio_bus_layout.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m3 1c-1.108 0-2 .89199-2 2v10c0 1.108.89199 2 2 2h2c1.108 0 2-.89199 2-2v-10c0-1.108-.89199-2-2-2zm8 0c-1.108 0-2 .89199-2 2v10c0 1.108.89199 2 2 2h2c1.108 0 2-.89199 2-2v-10c0-1.108-.89199-2-2-2zm-8 1h2c.55401 0 1 .44599 1 1v10c0 .55401-.44599 1-1 1h-2c-.55401 0-1-.44599-1-1v-10c0-.55401.44599-1 1-1z" fill="url(#a)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_bus_mute.svg b/editor/icons/icon_audio_bus_mute.svg
deleted file mode 100644
index 4750b0fec0..0000000000
--- a/editor/icons/icon_audio_bus_mute.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1048.4v-8l4 5 4-5v8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_bus_solo.svg b/editor/icons/icon_audio_bus_solo.svg
deleted file mode 100644
index 5be72a8961..0000000000
--- a/editor/icons/icon_audio_bus_solo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 3a1 1 0 0 0 -.12695.0078125c-1.0208.043703-1.957.60248-2.4707 1.4922-.5351.9268-.5351 2.0732 0 3s1.5275 1.5 2.5977 1.5h2c.35887 0 .6858.1892.86523.5s.17943.6892 0 1-.50637.5-.86523.5h-3a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h3c1.0702 0 2.0626-.5732 2.5977-1.5s.5351-2.0732 0-3-1.5275-1.5-2.5977-1.5h-2c-.35887 0-.6858-.1892-.86523-.5s-.17943-.6892 0-1 .50637-.5.86523-.5h3a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-3z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_stream_o_g_g_vorbis.svg b/editor/icons/icon_audio_stream_o_g_g_vorbis.svg
deleted file mode 100644
index a8d6fb6bf1..0000000000
--- a/editor/icons/icon_audio_stream_o_g_g_vorbis.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m11.971 1.002c-.08326.00207-.16593.014541-.24609.037109l-7 2c-.42881.12287-.7244.51487-.72461.96094v5.5508c-.16454-.033679-.33205-.050692-.5-.050781-1.3807 0-2.5 1.1193-2.5 2.5-.00000475 1.3807 1.1193 2.5 2.5 2.5 1.3456-.0013 2.4488-1.0674 2.4961-2.4121.0025906-.029226.003894-.058551.0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5c-.000916-.56314-.4664-1.0145-1.0293-.99805zm-1.4707 6.998c-.277 0-.5.223-.5.5v5c0 .277.223.5.5.5s.5-.223.5-.5v-5c0-.277-.223-.5-.5-.5zm2 1c-.277 0-.5.223-.5.5v3c0 .277.223.5.5.5s.5-.223.5-.5v-3c0-.277-.223-.5-.5-.5zm-4 1c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5zm6 0c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5z" fill="url(#a)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_stream_player.svg b/editor/icons/icon_audio_stream_player.svg
deleted file mode 100644
index bbe2793407..0000000000
--- a/editor/icons/icon_audio_stream_player.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m10.023 1044.4c-.56139-.013-1.0235.4264-1.0234.9724v5.0542c.0006911.7482.83361 1.2154 1.5.8414l4-2.5262c.66694-.3743.66694-1.3104 0-1.6847l-4-2.5261c-.14505-.082-.30893-.1269-.47656-.131z" fill="#e0e0e0"/><path d="m11.971 1.002a1.0001 1.0001 0 0 0 -.24609.037109l-7 2a1.0001 1.0001 0 0 0 -.72461.96094v5.5508a2.5 2.5 0 0 0 -.5-.050781 2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.4961-2.4121 1.0001 1.0001 0 0 0 .0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5a1.0001 1.0001 0 0 0 -1.0293-.99805z" fill="url(#a)" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_stream_player_2_d.svg b/editor/icons/icon_audio_stream_player_2_d.svg
deleted file mode 100644
index 090b23ff7c..0000000000
--- a/editor/icons/icon_audio_stream_player_2_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m10.023 1044.4c-.56139-.013-1.0235.4264-1.0234.9724v5.0542c.0006911.7482.83361 1.2154 1.5.8414l4-2.5262c.66694-.3743.66694-1.3104 0-1.6847l-4-2.5261c-.14505-.082-.30893-.1269-.47656-.131z" fill="#a5b7f3"/><path d="m11.971 1.002a1.0001 1.0001 0 0 0 -.24609.037109l-7 2a1.0001 1.0001 0 0 0 -.72461.96094v5.5508a2.5 2.5 0 0 0 -.5-.050781 2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.4961-2.4121 1.0001 1.0001 0 0 0 .0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5a1.0001 1.0001 0 0 0 -1.0293-.99805z" fill="url(#a)" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_stream_player_3_d.svg b/editor/icons/icon_audio_stream_player_3_d.svg
deleted file mode 100644
index 95da9818aa..0000000000
--- a/editor/icons/icon_audio_stream_player_3_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m10.023 1044.4c-.56139-.013-1.0235.4264-1.0234.9724v5.0542c.0006911.7482.83361 1.2154 1.5.8414l4-2.5262c.66694-.3743.66694-1.3104 0-1.6847l-4-2.5261c-.14505-.082-.30893-.1269-.47656-.131z" fill="#fc9c9c"/><path d="m11.971 1.002a1.0001 1.0001 0 0 0 -.24609.037109l-7 2a1.0001 1.0001 0 0 0 -.72461.96094v5.5508a2.5 2.5 0 0 0 -.5-.050781 2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.4961-2.4121 1.0001 1.0001 0 0 0 .0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5a1.0001 1.0001 0 0 0 -1.0293-.99805z" fill="url(#a)" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_audio_stream_sample.svg b/editor/icons/icon_audio_stream_sample.svg
deleted file mode 100644
index a8d6fb6bf1..0000000000
--- a/editor/icons/icon_audio_stream_sample.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m11.971 1.002c-.08326.00207-.16593.014541-.24609.037109l-7 2c-.42881.12287-.7244.51487-.72461.96094v5.5508c-.16454-.033679-.33205-.050692-.5-.050781-1.3807 0-2.5 1.1193-2.5 2.5-.00000475 1.3807 1.1193 2.5 2.5 2.5 1.3456-.0013 2.4488-1.0674 2.4961-2.4121.0025906-.029226.003894-.058551.0039062-.087891v-7.2441l5-1.4277v3.1719l2-1v-3.5c-.000916-.56314-.4664-1.0145-1.0293-.99805zm-1.4707 6.998c-.277 0-.5.223-.5.5v5c0 .277.223.5.5.5s.5-.223.5-.5v-5c0-.277-.223-.5-.5-.5zm2 1c-.277 0-.5.223-.5.5v3c0 .277.223.5.5.5s.5-.223.5-.5v-3c0-.277-.223-.5-.5-.5zm-4 1c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5zm6 0c-.277 0-.5.223-.5.5v1c0 .277.223.5.5.5s.5-.223.5-.5v-1c0-.277-.223-.5-.5-.5z" fill="url(#a)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_auto_end.svg b/editor/icons/icon_auto_end.svg
deleted file mode 100644
index 35f5fb2b1c..0000000000
--- a/editor/icons/icon_auto_end.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m13.999798 14c.552262-.000055.999945-.447738 1-1v-10c-.000055-.5522619-.447738-.9999448-1-1h-8.0000004c-.3038627-.0001753-.5913245.1378063-.78125.375l-4 5c-.29139692.3649711-.29139692.8830289 0 1.248l4 5c.189538.237924.4770584.376652.78125.37695h8.0000004zm-1-2h-6.5195004l-3.1992-4 3.1992-4h6.5195004zm-6.0000004-2v-4l-2 2z" fill-rule="evenodd"/><path d="m15.129502-36.414393h20.292969v5.683593h-12.773437v5.429688h12.011718v5.683594h-12.011718v6.679687h13.203125v5.6835938h-20.722657z" transform="matrix(.20475474 0 0 .20475474 4.790386 12.365563)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_auto_key.svg b/editor/icons/icon_auto_key.svg
deleted file mode 100644
index 3d5569397f..0000000000
--- a/editor/icons/icon_auto_key.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m5 3-3 5h-1v4h1.0507812a2.5 2.5 0 0 1 2.4492188-2 2.5 2.5 0 0 1 2.4453125 2h2.1054687a2.5 2.5 0 0 1 2.4492188-2 2.5 2.5 0 0 1 2.445312 2h1.054688v-4h-1l-4-5zm1 1h3l3 4h-8z" stroke-width=".033311"/><circle cx="4.5" cy="12.5" r="1.5"/><circle cx="11.5" cy="12.5" r="1.5"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_auto_play.svg b/editor/icons/icon_auto_play.svg
deleted file mode 100644
index dbe41f244f..0000000000
--- a/editor/icons/icon_auto_play.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2a1.0001 1.0001 0 0 0 -1 1v10a1.0001 1.0001 0 0 0 1 1h8a1.0001 1.0001 0 0 0 .78125-.375l4-5a1.0001 1.0001 0 0 0 0-1.248l-4-5a1.0001 1.0001 0 0 0 -.78125-.37695h-8zm1 2h6.5195l3.1992 4-3.1992 4h-6.5195zm3 1c-1.1046 0-2 .8954-2 2v4h1v-2h2v2h1v-4c0-1.1046-.89543-2-2-2zm0 1a1 1 0 0 1 1 1v1h-2v-1a1 1 0 0 1 1-1zm3 0v4l2-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_auto_triangle.svg b/editor/icons/icon_auto_triangle.svg
deleted file mode 100644
index 13b8f7c5d2..0000000000
--- a/editor/icons/icon_auto_triangle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.2324219.67773438-7.58789065 14.61132762h14.71093775zm-1.2910157 4.76562502h2.2695313c.3451753.6237333.6845072 1.2654948 1.0195315 1.9238281.335023.6496.670835 1.3367865 1.005859 2.0644531.345175.7276004.695453 1.5033054 1.050781 2.3261714.355328.822934.731017 1.719254 1.126953 2.689454h-2.542968c-.111674-.311867-.238728-.631738-.38086-.960938-.131979-.329133-.264505-.659081-.396484-.988281h-4.1113281c-.1319787.3292-.2680243.659148-.4101563.988281-.1319786.3292-.2555135.649071-.3671875.960938h-2.4667969c.3959374-.9702.7716252-1.86652 1.1269532-2.689454.355328-.822866.702086-1.598571 1.0371094-2.3261714.3451759-.7276666.6790355-1.4148531 1.0039062-2.0644531.3350233-.6583333.6798282-1.3000948 1.0351562-1.9238281zm1.0820313 2.0390625c-.0507667.1299333-.126999.3080031-.2285156.5332031-.101522.2252-.2176307.4847635-.3496094.7792969-.1319793.2945333-.2809234.619476-.4433594.9746093-.1522833.3551338-.3082684.7273878-.4707031 1.1171878h3c-.162436-.3898-.3203736-.762054-.4726562-1.1171878-.1522834-.3551333-.299275-.680076-.4414063-.9746093-.1319793-.2945334-.2480874-.5540969-.3496094-.7792969-.1015226-.2252-.1832273-.4032698-.2441406-.5332031z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_back.svg b/editor/icons/icon_back.svg
deleted file mode 100644
index c8ea97fa5c..0000000000
--- a/editor/icons/icon_back.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 8 16" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m6 1038.4-4 6 4 6" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_back_buffer_copy.svg b/editor/icons/icon_back_buffer_copy.svg
deleted file mode 100644
index c16cfe9009..0000000000
--- a/editor/icons/icon_back_buffer_copy.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v11h5v-2h-3v-7h6v-2zm6 3v11h8v-11zm2 2h4v7h-4z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bake.svg b/editor/icons/icon_bake.svg
deleted file mode 100644
index 9bcfb174dc..0000000000
--- a/editor/icons/icon_bake.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v2h12v-2zm-1 3v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-9zm2 1h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm-9 2h10v6h-10zm3 1v1h4v-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_baked_lightmap.svg b/editor/icons/icon_baked_lightmap.svg
deleted file mode 100644
index 338a100022..0000000000
--- a/editor/icons/icon_baked_lightmap.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v2h12v-2zm-1 3v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-9zm2 1h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm3 0h1v1h-1zm-9 2h10v6h-10zm3 1v1h4v-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_baked_lightmap_data.svg b/editor/icons/icon_baked_lightmap_data.svg
deleted file mode 100644
index e8d471c2af..0000000000
--- a/editor/icons/icon_baked_lightmap_data.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h2v-2zm4 0v2h6v-2zm-7 3v2h2v-2zm3 0v2h2v-2zm4 0v3h5v6h-5v2h5a2 2 0 0 0 2-2v-9zm1 1h1v1h-1zm3 0h1v1h-1zm-11 2v2h2v-2zm3 0v2h2v-2zm4 1v1h2v-1zm-7 2v2h2v-2zm3 0v2h2v-2zm-3 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_basis.svg b/editor/icons/icon_basis.svg
deleted file mode 100644
index ecdb0f4ec0..0000000000
--- a/editor/icons/icon_basis.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v8h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2zm10 0v2h2v-2zm-3 2a2 2 0 0 0 -1.7324 1 2 2 0 0 0 0 2 2 2 0 0 0 1.7324 1h-2v2h2a2 2 0 0 0 1.7324-1 2 2 0 0 0 0-2 2 2 0 0 0 -1.7324-1h2v-2zm7 0a2 2 0 0 0 -1.7324 1 2 2 0 0 0 0 2 2 2 0 0 0 1.7324 1h-2v-2h-2v4h4a2 2 0 0 0 1.7324-1 2 2 0 0 0 0-2 2 2 0 0 0 -1.7324-1h2v-2zm-12 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#e3ec69"/><path d="m10 2v2h2v-2zm0 4v4h2v-4z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bezier_handles_balanced.svg b/editor/icons/icon_bezier_handles_balanced.svg
deleted file mode 100644
index 6656d3f5eb..0000000000
--- a/editor/icons/icon_bezier_handles_balanced.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.7627119 13.627119s1.2881355-6.847458 6.5762712-8.1355935c5.0847459.9491522 5.9661009 8.1355925 5.9661009 8.1355925" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="1.7"/><ellipse cx="1.898304" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><ellipse cx="14.237288" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><path d="m7.4559186 5.1473018-4.7355323 1.5541798" fill="none" stroke="#84c2ff" stroke-width=".618"/><path d="m10.790357 4.2063094-2.5009748.9433136" fill="none" stroke="#84c2ff" stroke-width=".614897"/><g fill="#e0e0e0"><ellipse cx="8.271187" cy="4.779661" rx="1.267586" ry="1.199789"/><path d="m1.7157324 5.8754878a1.2675855 1.1997888 0 0 0 -1.26757806 1.1992188 1.2675855 1.1997888 0 0 0 1.26757806 1.1992187 1.2675855 1.1997888 0 0 0 1.2675781-1.1992187 1.2675855 1.1997888 0 0 0 -1.2675781-1.1992188zm.00195.4238282a.84677333.80148375 0 0 1 .8476593.8007812.84677333.80148375 0 0 1 -.8476562.8007812.84677333.80148375 0 0 1 -.84765616-.8007812.84677333.80148375 0 0 1 .84765616-.8007812z"/><path d="m11.909414 2.4642073a1.2836218 1.231838 0 0 0 -1.283614 1.2312528 1.2836218 1.231838 0 0 0 1.283614 1.2312527 1.2836218 1.231838 0 0 0 1.283614-1.2312527 1.2836218 1.231838 0 0 0 -1.283614-1.2312528zm.002.4351497a.85748593.82289328 0 0 1 .858383.8221719.85748593.82289328 0 0 1 -.85838.822172.85748593.82289328 0 0 1 -.858379-.822172.85748593.82289328 0 0 1 .858379-.8221719z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bezier_handles_free.svg b/editor/icons/icon_bezier_handles_free.svg
deleted file mode 100644
index 06abfe34ab..0000000000
--- a/editor/icons/icon_bezier_handles_free.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.7627119 13.627119s1.2881355-6.847458 6.5762712-8.1355935c5.0847459.9491522 5.9661009 8.1355925 5.9661009 8.1355925" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="1.7"/><ellipse cx="1.898304" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><ellipse cx="14.237288" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><path d="m7.6850253 4.7560401-3.776127.6607599" fill="none" stroke="#84c2ff" stroke-width=".805138"/><path d="m11.695505 2.3941651-2.999121 2.2935078" fill="none" stroke="#84c2ff" stroke-width=".730798"/><g fill="#e0e0e0"><ellipse cx="8.271187" cy="4.779661" rx="1.267586" ry="1.199789"/><path d="m2.4961199 4.3976698a1.1997888 1.2675855 80.074672 0 0 -1.0419038 1.3997559 1.1997888 1.2675855 80.074672 0 0 1.4553094.9627848 1.1997888 1.2675855 80.074672 0 0 1.0419037-1.3997558 1.1997888 1.2675855 80.074672 0 0 -1.4553093-.9627849zm.074974.4171488a.80148375.84677333 80.074672 0 1 .9729986.6426896.80148375.84677333 80.074672 0 1 -.6969432.934902.80148375.84677333 80.074672 0 1 -.9729958-.6426902.80148375.84677333 80.074672 0 1 .6969432-.934902z"/><path d="m11.838896.64428913a1.231838 1.2836218 52.593897 0 0 -.271701 1.75779027 1.231838 1.2836218 52.593897 0 0 1.767576.1983008 1.231838 1.2836218 52.593897 0 0 .271701-1.75779027 1.231838 1.2836218 52.593897 0 0 -1.767576-.1983008zm.265925.3444462a.82289328.85748593 52.593897 0 1 1.181294.13165847.82289328.85748593 52.593897 0 1 -.182417 1.1745241.82289328.85748593 52.593897 0 1 -1.181291-.1316609.82289328.85748593 52.593897 0 1 .182417-1.17452347z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bezier_handles_mirror.svg b/editor/icons/icon_bezier_handles_mirror.svg
deleted file mode 100644
index be85f170c7..0000000000
--- a/editor/icons/icon_bezier_handles_mirror.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.7627119 13.627119s1.2881355-6.847458 6.5762712-8.1355935c5.0847459.9491522 5.9661009 8.1355925 5.9661009 8.1355925" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="1.7"/><ellipse cx="1.898304" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><ellipse cx="14.237288" cy="13.491526" fill="#e0e0e0" rx="1.267586" ry="1.199789"/><path d="m8.2033896 4.6779662h-3.8335021" fill="none" stroke="#84c2ff" stroke-width=".805138"/><path d="m11.931789 4.6440679h-3.7283994" fill="none" stroke="#84c2ff" stroke-width=".716709"/><g fill="#e0e0e0"><ellipse cx="8.271187" cy="4.779661" rx="1.267586" ry="1.199789"/><path d="m3.1539157 3.4305762a1.2675855 1.1997888 0 0 0 -1.2675781 1.1992188 1.2675855 1.1997888 0 0 0 1.2675781 1.1992187 1.2675855 1.1997888 0 0 0 1.2675781-1.1992187 1.2675855 1.1997888 0 0 0 -1.2675781-1.1992188zm.00195.4238282a.84677333.80148375 0 0 1 .8476593.8007812.84677333.80148375 0 0 1 -.8476562.8007812.84677333.80148375 0 0 1 -.8476562-.8007812.84677333.80148375 0 0 1 .8476562-.8007812z"/><path d="m13.093969 3.3750567a1.2675855 1.1997888 0 0 0 -1.267578 1.1992188 1.2675855 1.1997888 0 0 0 1.267578 1.1992187 1.2675855 1.1997888 0 0 0 1.267578-1.1992187 1.2675855 1.1997888 0 0 0 -1.267578-1.1992188zm.002.4238282a.84677333.80148375 0 0 1 .847659.8007812.84677333.80148375 0 0 1 -.847656.8007812.84677333.80148375 0 0 1 -.847656-.8007812.84677333.80148375 0 0 1 .847656-.8007812z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bit_map.svg b/editor/icons/icon_bit_map.svg
deleted file mode 100644
index b61c1b7dc5..0000000000
--- a/editor/icons/icon_bit_map.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm2 2v2h2v-2zm2 0h2v-2h-2zm2 0v2h2v-2zm2 0h2v-2h-2zm2 0v2h2v-2zm2 0h2v-2h-2zm0 2v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm-2 0h-2v2h2zm-2 0v-2h-2v2zm-2 0h-2v2h2zm-2 0v-2h-2v2zm-2 0h-2v2h2zm0-2v-2h-2v2zm0-2h2v-2h-2zm0-2v-2h-2v2zm2 0h2v-2h-2zm2 0v2h2v-2zm2 0h2v-2h-2zm0 2v2h2v-2zm-2 0h-2v2h2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bitmap_font.svg b/editor/icons/icon_bitmap_font.svg
deleted file mode 100644
index 5e5bd859c9..0000000000
--- a/editor/icons/icon_bitmap_font.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1037.4v4h1v-1h1v-1h4v10h-1v1h-1v1h6v-1h-1v-1h-1v-10h4v1h1v1h1v-4z" fill="#84c2ff" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_blend.svg b/editor/icons/icon_blend.svg
deleted file mode 100644
index c78b9287fa..0000000000
--- a/editor/icons/icon_blend.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1v2h2.5859l-3.5859 3.5859-4.293-4.293-1.4141 1.4141 4.293 4.293-4.293 4.293 1.4141 1.4141 4.293-4.293 3.5859 3.5859h-2.5859v2h5a1.0001 1.0001 0 0 0 1-1v-5h-2v2.5859l-3.5859-3.5859 3.5859-3.5859v2.5859h2v-5a1.0001 1.0001 0 0 0 -1-1h-5z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bone.svg b/editor/icons/icon_bone.svg
deleted file mode 100644
index fafebb0394..0000000000
--- a/editor/icons/icon_bone.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bone_2_d.svg b/editor/icons/icon_bone_2_d.svg
deleted file mode 100644
index 94bfff61e4..0000000000
--- a/editor/icons/icon_bone_2_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#a5b7f3" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bone_attachment.svg b/editor/icons/icon_bone_attachment.svg
deleted file mode 100644
index 0b7dede0b6..0000000000
--- a/editor/icons/icon_bone_attachment.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#fc9c9c" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bone_track.svg b/editor/icons/icon_bone_track.svg
deleted file mode 100644
index 0f6f9bb6cd..0000000000
--- a/editor/icons/icon_bone_track.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.478 1037.4a2.4664 2.4663 0 0 0 -1.7804.7205 2.4664 2.4663 0 0 0 -.31408 3.1041l-3.559 3.5608a2.4664 2.4663 0 0 0 -3.1023.3121 2.4664 2.4663 0 0 0 0 3.4876 2.4664 2.4663 0 0 0 1.397.6955 2.4664 2.4663 0 0 0 .69561 1.397 2.4664 2.4663 0 0 0 3.4877 0 2.4664 2.4663 0 0 0 .31408-3.1041l3.5609-3.5608a2.4664 2.4663 0 0 0 3.1004-.3102 2.4664 2.4663 0 0 0 0-3.4875 2.4664 2.4663 0 0 0 -1.397-.6974 2.4664 2.4663 0 0 0 -.69561-1.3971 2.4664 2.4663 0 0 0 -1.7072-.7205z" fill="#cea4f1" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bool.svg b/editor/icons/icon_bool.svg
deleted file mode 100644
index 5ffd40a815..0000000000
--- a/editor/icons/icon_bool.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v8h2a3 3 0 0 0 2.5-1.3457 3 3 0 0 0 2.5 1.3457 3 3 0 0 0 2-.76758 3 3 0 0 0 2 .76758 3 3 0 0 0 2.5-1.3457 3 3 0 0 0 2.5 1.3457v-2a1 1 0 0 1 -1-1v-5h-2v2.7695a3 3 0 0 0 -2-.76953 3 3 0 0 0 -2 .76758 3 3 0 0 0 -2-.76758 3 3 0 0 0 -2.5 1.3457 3 3 0 0 0 -2.5-1.3457v-2zm2 4a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm5 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#8da6f0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_box_shape.svg b/editor/icons/icon_box_shape.svg
deleted file mode 100644
index 171e95f4fa..0000000000
--- a/editor/icons/icon_box_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3v-8z" fill="#2998ff" transform="translate(0 1036.4)"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#68b6ff"/><path d="m1 1040.4 7 3 7-3-7-3z" fill="#a2d2ff"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bucket.svg b/editor/icons/icon_bucket.svg
deleted file mode 100644
index fc3481290d..0000000000
--- a/editor/icons/icon_bucket.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke-width="1.325447" transform="matrix(.53348552 .53348552 -.53348552 .53348552 561.06065 -551.99594)"><path d="m2 1c-.5522355.0001-.9999477.4477-1 1v1.5h2.8847656a1.4999877 1.5 0 0 1 1.1152344-.5 1.4999877 1.5 0 0 1 1.5 1.5 1.4999877 1.5 0 0 1 -1.5 1.5 1.4999877 1.5 0 0 1 -1.1152344-.5h-2.8847656v1.5h-1.26953125-1.73046875c-.5522769 0-.999989-.4477-1-1 .000011-.5523.4477231-1 1-1h3 2.5878906.546875a1 1 0 0 0 .8652344.5 1 1 0 0 0 1-1 1 1 0 0 0 -1-1 1 1 0 0 0 -.8632812.5h-.5488282-2.5878906-3c-1.1045647 0-1.9999933.8954285-2 2 .0000067 1.1045715.8954353 2 2 2h3v6c.0000735.5523.4477232.9999 1 1h8c.552235-.0001.999947-.4477 1-1v-13z" stroke-width="1.325447" transform="translate(0 1036.4)"/><path d="m12 1038.4c.707107 3.5356.707107 3.5356 1.414213 4.2427.707107.7071 2.121321.7071 2.828428 0 .707106-.7071.707106-2.1213 0-2.8284-.707107-.7072-.707107-.7072-4.242641-1.4143z" fill-rule="evenodd"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bus_vu_empty.svg b/editor/icons/icon_bus_vu_empty.svg
deleted file mode 100644
index 5260b9e252..0000000000
--- a/editor/icons/icon_bus_vu_empty.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 16 128" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="926.36" y2="1050.36"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><g transform="translate(0 -924.36)"><path d="m3 926.36c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill="url(#a)"/><path d="m3 2c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill-opacity=".19608" transform="translate(0 924.36)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bus_vu_frozen.svg b/editor/icons/icon_bus_vu_frozen.svg
deleted file mode 100644
index c10bb5a1a2..0000000000
--- a/editor/icons/icon_bus_vu_frozen.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 16 128" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="2" y2="126"><stop offset="0" stop-color="#62aeff"/><stop offset=".5" stop-color="#75d1e6"/><stop offset="1" stop-color="#84ffee"/></linearGradient><path d="m3 2c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill="url(#a)" opacity=".7"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_bus_vu_full.svg b/editor/icons/icon_bus_vu_full.svg
deleted file mode 100644
index 377ac60bc1..0000000000
--- a/editor/icons/icon_bus_vu_full.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 16 128" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="2" y2="126"><stop offset="0" stop-color="#ff7a7a"/><stop offset=".5" stop-color="#e1dc7a"/><stop offset="1" stop-color="#66ff9e"/></linearGradient><path d="m3 2c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 5c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1zm0 3c-.554 0-1 .446-1 1s.446 1 1 1h10c.554 0 1-.446 1-1s-.446-1-1-1z" fill="url(#a)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_button.svg b/editor/icons/icon_button.svg
deleted file mode 100644
index 6ea5663dda..0000000000
--- a/editor/icons/icon_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3.1328l-1.4453-.96484-1.1094 1.6641 3 2a1.0001 1.0001 0 0 0 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm-1.5 8c-.831 0-1.5.669-1.5 1.5v1.5h-2v2h12v-2h-2v-1.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_button_group.svg b/editor/icons/icon_button_group.svg
deleted file mode 100644
index 683a8c3054..0000000000
--- a/editor/icons/icon_button_group.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1c-.554 0-1 .446-1 1v12c0 .554.446 1 1 1h8c.554 0 1-.446 1-1v-12c0-.554-.446-1-1-1zm1 1h2c.554 0 1 .446 1 1s-.446 1-1 1h-2c-.554 0-1-.446-1-1s.446-1 1-1zm6 0c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-5 4a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm5 0c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm0 4c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1zm-7 2h1v2h-1zm2 0h1v2h-1zm2 0h1v2h-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_c_p_u_particles.svg b/editor/icons/icon_c_p_u_particles.svg
deleted file mode 100644
index af4115c93f..0000000000
--- a/editor/icons/icon_c_p_u_particles.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.5587261.60940813c-.4226244 0-.7617187.3410473-.7617187.76367177v.5078126c0 .1028478.020058.199689.056641.2890624h-1.1933597c-.4226245 0-.7617188.3390944-.7617188.7617188v.921875c-.040428-.00657-.0767989-.0234375-.1191406-.0234375h-.5078125c-.42262448 0-.76367188.3410475-.76367188.7636719v.3730468c0 .4226245.3410474.7617188.76367188.7617188h.5078125c.042396 0 .078663-.016851.1191406-.023437v4.4531248c-.040428-.0066-.076799-.02344-.1191406-.02344h-.5078125c-.42262448 0-.76367188.341047-.76367188.763672v.373047c0 .422625.3410474.761718.76367188.761718h.5078125c.042396 0 .078663-.01685.1191406-.02344v1.125c0 .422624.3390944.763672.7617188.763672h1.1367187v.457031c0 .422624.3390943.763672.7617187.763672h.3730469c.4226244 0 .7636719-.341048.7636719-.763672v-.457031h4.4062501v.457031c0 .422624.339094.763672.761719.763672h.373047c.422624 0 .763671-.341048.763671-.763672v-.457031h1.269532c.422625 0 .763672-.341048.763672-.763672v-1.111328c.01774.0012.03272.0098.05078.0098h.507812c.422624 0 .763672-.339093.763672-.761718v-.373047c0-.422624-.341048-.763672-.763672-.763672h-.507812c-.01803 0-.03307.0085-.05078.0098v-4.4258454c.01774.00122.03272.00977.05078.00977h.507812c.422624 0 .763672-.3390943.763672-.7617188v-.3730512c0-.4226244-.341048-.7636719-.763672-.7636719h-.507812c-.01803 0-.03307.00855-.05078.00977v-.9082075c0-.4226244-.341047-.7617187-.763672-.7617188h-1.328125c.03658-.089375.05859-.1862118.05859-.2890624v-.5078126c0-.42262437-.341047-.76367177-.763671-.76367177h-.373047c-.422625 0-.761719.3410474-.761719.76367177v.5078126c0 .1028478.02006.1996891.05664.2890624h-4.5214809c.036585-.0893749.0585938-.1862118.0585938-.2890624v-.5078126c0-.42262437-.3410475-.76367177-.7636719-.76367177zm3.2382813 2.35742177a3.279661 3.6440678 0 0 1 3.2128906 2.9394532 2.1864407 2.1864407 0 0 1 1.888672 2.1621094 2.1864407 2.1864407 0 0 1 -2.1875 2.1855475h-5.8300782a2.1864407 2.1864407 0 0 1 -2.1855469-2.1855475 2.1864407 2.1864407 0 0 1 1.8847656-2.1640626 3.279661 3.6440678 0 0 1 3.2167969-2.9375zm-2.9160156 8.0156251a.72881355.72881355 0 0 1 .7285156.728516.72881355.72881355 0 0 1 -.7285156.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm5.8300782 0a.72881355.72881355 0 0 1 .730469.728516.72881355.72881355 0 0 1 -.730469.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm-2.9140626.728516a.72881355.72881355 0 0 1 .7285156.730469.72881355.72881355 0 0 1 -.7285156.728515.72881355.72881355 0 0 1 -.7285156-.728515.72881355.72881355 0 0 1 .7285156-.730469z" fill="#fc9c9c" fill-opacity=".996078"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_c_p_u_particles_2_d.svg b/editor/icons/icon_c_p_u_particles_2_d.svg
deleted file mode 100644
index 25afc35bec..0000000000
--- a/editor/icons/icon_c_p_u_particles_2_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.5587261.60940813c-.4226244 0-.7617187.3410473-.7617187.76367177v.5078126c0 .1028478.020058.199689.056641.2890624h-1.1933597c-.4226245 0-.7617188.3390944-.7617188.7617188v.921875c-.040428-.00657-.0767989-.0234375-.1191406-.0234375h-.5078125c-.42262448 0-.76367188.3410475-.76367188.7636719v.3730468c0 .4226245.3410474.7617188.76367188.7617188h.5078125c.042396 0 .078663-.016851.1191406-.023437v4.4531248c-.040428-.0066-.076799-.02344-.1191406-.02344h-.5078125c-.42262448 0-.76367188.341047-.76367188.763672v.373047c0 .422625.3410474.761718.76367188.761718h.5078125c.042396 0 .078663-.01685.1191406-.02344v1.125c0 .422624.3390944.763672.7617188.763672h1.1367187v.457031c0 .422624.3390943.763672.7617187.763672h.3730469c.4226244 0 .7636719-.341048.7636719-.763672v-.457031h4.4062501v.457031c0 .422624.339094.763672.761719.763672h.373047c.422624 0 .763671-.341048.763671-.763672v-.457031h1.269532c.422625 0 .763672-.341048.763672-.763672v-1.111328c.01774.0012.03272.0098.05078.0098h.507812c.422624 0 .763672-.339093.763672-.761718v-.373047c0-.422624-.341048-.763672-.763672-.763672h-.507812c-.01803 0-.03307.0085-.05078.0098v-4.4258454c.01774.00122.03272.00977.05078.00977h.507812c.422624 0 .763672-.3390943.763672-.7617188v-.3730512c0-.4226244-.341048-.7636719-.763672-.7636719h-.507812c-.01803 0-.03307.00855-.05078.00977v-.9082075c0-.4226244-.341047-.7617187-.763672-.7617188h-1.328125c.03658-.089375.05859-.1862118.05859-.2890624v-.5078126c0-.42262437-.341047-.76367177-.763671-.76367177h-.373047c-.422625 0-.761719.3410474-.761719.76367177v.5078126c0 .1028478.02006.1996891.05664.2890624h-4.5214809c.036585-.0893749.0585938-.1862118.0585938-.2890624v-.5078126c0-.42262437-.3410475-.76367177-.7636719-.76367177zm3.2382813 2.35742177a3.279661 3.6440678 0 0 1 3.2128906 2.9394532 2.1864407 2.1864407 0 0 1 1.888672 2.1621094 2.1864407 2.1864407 0 0 1 -2.1875 2.1855475h-5.8300782a2.1864407 2.1864407 0 0 1 -2.1855469-2.1855475 2.1864407 2.1864407 0 0 1 1.8847656-2.1640626 3.279661 3.6440678 0 0 1 3.2167969-2.9375zm-2.9160156 8.0156251a.72881355.72881355 0 0 1 .7285156.728516.72881355.72881355 0 0 1 -.7285156.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm5.8300782 0a.72881355.72881355 0 0 1 .730469.728516.72881355.72881355 0 0 1 -.730469.730469.72881355.72881355 0 0 1 -.7285157-.730469.72881355.72881355 0 0 1 .7285157-.728516zm-2.9140626.728516a.72881355.72881355 0 0 1 .7285156.730469.72881355.72881355 0 0 1 -.7285156.728515.72881355.72881355 0 0 1 -.7285156-.728515.72881355.72881355 0 0 1 .7285156-.730469z" fill="#a3b6f3" fill-opacity=".992157"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_camera.svg b/editor/icons/icon_camera.svg
deleted file mode 100644
index af1cb8a2e9..0000000000
--- a/editor/icons/icon_camera.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1038.4a3 3 0 0 0 -2.9883 2.7774 3 3 0 0 0 -2.0117-.7774 3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8243v2.1757c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695a3 3 0 0 0 1-2.2305 3 3 0 0 0 -3-3z" fill="#fc9c9c" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_camera_2d.svg b/editor/icons/icon_camera_2d.svg
deleted file mode 100644
index 9a91b3017b..0000000000
--- a/editor/icons/icon_camera_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1038.4a3 3 0 0 0 -2.9883 2.7774 3 3 0 0 0 -2.0117-.7774 3 3 0 0 0 -3 3 3 3 0 0 0 2 2.8243v2.1757c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695a3 3 0 0 0 1-2.2305 3 3 0 0 0 -3-3z" fill="#a5b7f3" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_camera_texture.svg b/editor/icons/icon_camera_texture.svg
deleted file mode 100644
index e61b5902f0..0000000000
--- a/editor/icons/icon_camera_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55228 0-1 .44772-1 1v12c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-12c0-.55228-.44772-1-1-1zm1 2h10v8h-10zm5.8184 1.0039c-.85534.0009758-1.5654.66069-1.6289 1.5137-.30036-.27229-.69029-.4234-1.0957-.42383-.90315 0-1.6367.73162-1.6367 1.6348.0009732.69217.43922 1.3103 1.0918 1.541v1.1855c0 .30198.24293.54492.54492.54492h3.2695c.30199 0 .54492-.24294.54492-.54492v-.54492l1.6367 1.0898v-3.2715l-1.6367 1.0918v-.96484c.34606-.30952.54406-.75251.54492-1.2168 0-.90315-.73162-1.6348-1.6348-1.6348z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_canvas_item.svg b/editor/icons/icon_canvas_item.svg
deleted file mode 100644
index eefe501ca8..0000000000
--- a/editor/icons/icon_canvas_item.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9208 1046.4c-.26373.3-.4204.7296-.4204 1.2383 0 1.6277-3.1381-.1781-.33757 2.6703.88382.899 2.6544.6701 3.5382-.2288.88384-.899.88382-2.3565 0-3.2554-1.1002-1.1191-2.2001-1.0845-2.7803-.4244zm2.3802-1.6103 2.4005 2.4416 6.8014-6.9177c.66286-.6742.66286-1.7673 0-2.4415-.66288-.6741-1.7376-.6741-2.4005 0z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_canvas_item_material.svg b/editor/icons/icon_canvas_item_material.svg
deleted file mode 100644
index 7df06ed686..0000000000
--- a/editor/icons/icon_canvas_item_material.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.1035 3a7 7 0 0 0 -1.418 2h12.631a7 7 0 0 0 -1.4277-2h-9.7852z" fill="#ffeb70"/><path d="m1.6855 5a7 7 0 0 0 -.60547 2h13.842a7 7 0 0 0 -.60547-2h-12.631z" fill="#9dff70"/><path d="m1.0801 7a7 7 0 0 0 -.080078 1 7 7 0 0 0 .078125 1h13.842a7 7 0 0 0 .080078-1 7 7 0 0 0 -.078125-1z" fill="#70ffb9"/><path d="m1.0781 9a7 7 0 0 0 .60547 2h12.631a7 7 0 0 0 .60547-2h-13.842z" fill="#70deff"/><path d="m3.1113 13a7 7 0 0 0 4.8887 2 7 7 0 0 0 4.8965-2z" fill="#ff70ac"/><path d="m1.6836 11a7 7 0 0 0 1.4277 2h9.7852a7 7 0 0 0 1.418-2h-12.631z" fill="#9f70ff"/><path d="m8 1a7 7 0 0 0 -4.8965 2h9.7852a7 7 0 0 0 -4.8887-2z" fill="#ff7070"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_canvas_item_shader.svg b/editor/icons/icon_canvas_item_shader.svg
deleted file mode 100644
index 834fe61472..0000000000
--- a/editor/icons/icon_canvas_item_shader.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.303 1c-.4344 0-.86973.16881-1.2012.50586l-1.4688 1.4941h4.3418c.082839-.52789-.072596-1.0872-.47266-1.4941-.33144-.33705-.76482-.50586-1.1992-.50586z" fill="#ff7070"/><path d="m10.633 3-1.9668 2h4.8008l1.0352-1.0527c.2628-.2673.41824-.60049.47266-.94727h-4.3418z" fill="#ffeb70"/><path d="m8.666 5-1.9648 2h4.7988l1.9668-2z" fill="#9dff70"/><path d="m6.7012 7-1.4004 1.4238.56641.57617h3.668l1.9648-2h-4.7988z" fill="#70ffb9"/><path d="m5.8672 9 1.834 1.8652 1.834-1.8652zm-1.752.57812c-.48501-.048725-.90521.12503-1.1953.45508-.21472.24426-.35243.57797-.39844.9668h3.5625c-.10223-.1935-.22224-.37965-.38281-.54297-.55011-.55955-1.1009-.83018-1.5859-.87891z" fill="#70deff"/><path d="m1.3242 13c.18414.24071.43707.53374.83789.94141.88382.899 2.6552.67038 3.5391-.22852.20747-.21103.36064-.45476.4707-.71289h-4.8477z" fill="#ff70ac"/><path d="m2.5215 11c-.0105.088737-.021484.17696-.021484.27148 0 1.3947-2.2782.28739-1.1758 1.7285h4.8477c.27363-.64173.24047-1.3785-.087891-2h-3.5625z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_canvas_item_shader_graph.svg b/editor/icons/icon_canvas_item_shader_graph.svg
deleted file mode 100644
index 3e83751698..0000000000
--- a/editor/icons/icon_canvas_item_shader_graph.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m8.0625 1025.9a3.375 3 0 0 0 -3.375 3 3.375 3 0 0 0 1.6875 2.5957v9.8115a3.375 3 0 0 0 -1.6875 2.5928 3.375 3 0 0 0 3.375 3 3.375 3 0 0 0 3.375-3 3.375 3 0 0 0 -1.6875-2.5957v-8.7832l11.931 10.605a3.375 3 0 0 0 -.11865.7735 3.375 3 0 0 0 3.375 3 3.375 3 0 0 0 3.375-3 3.375 3 0 0 0 -3.375-3 3.375 3 0 0 0 -.87341.1025l-11.928-10.602h9.8844a3.375 3 0 0 0 2.9169 1.5 3.375 3 0 0 0 3.375-3 3.375 3 0 0 0 -3.375-3 3.375 3 0 0 0 -2.9202 1.5h-11.038a3.375 3 0 0 0 -2.9169-1.5z"/></clipPath><g transform="translate(0 -1036.4)"><g clip-path="url(#a)" transform="matrix(.59259 0 0 .66667 -1.7778 353.45)"><path d="m3 1025.9h27v3h-27z" fill="#ff7070"/><path d="m3 1028.9h27v3h-27z" fill="#ffeb70"/><path d="m3 1031.9h27v3h-27z" fill="#9dff70"/><path d="m3 1034.9h27v3h-27z" fill="#70ffb9"/><path d="m3 1037.9h27v3h-27z" fill="#70deff"/><path d="m3 1043.9h27v3h-27z" fill="#ff70ac"/><path d="m3 1040.9h27v3h-27z" fill="#9f70ff"/></g><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_canvas_layer.svg b/editor/icons/icon_canvas_layer.svg
deleted file mode 100644
index a3fcc903d7..0000000000
--- a/editor/icons/icon_canvas_layer.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2v6h1v-6a1 1 0 0 1 1-1h6v-1zm10.303 0c-.4344 0-.86973.16881-1.2012.50586l-6.8008 6.918 2.4004 2.4414 6.8008-6.918c.66286-.6742.66286-1.7672 0-2.4414-.33144-.33705-.76482-.50586-1.1992-.50586zm.69727 6v6a1 1 0 0 1 -1 1h-6v1h6a2 2 0 0 0 2-2v-6zm-9.8848 2.5781c-.48501-.048725-.90521.12503-1.1953.45508-.26373.3-.41992.72958-.41992 1.2383 0 1.6277-3.1385-.17848-.33789 2.6699.88382.899 2.6552.67038 3.5391-.22852.88384-.899.88382-2.357 0-3.2559-.55011-.55955-1.1009-.83018-1.5859-.87891z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_canvas_modulate.svg b/editor/icons/icon_canvas_modulate.svg
deleted file mode 100644
index a7b788d638..0000000000
--- a/editor/icons/icon_canvas_modulate.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m1 1037.4v14h14v-14zm2 2h10v10h-10z" fill="#a5b7f3"/><g fill-rule="evenodd"><path d="m12 1048.4h-5l5-5z" fill="#70bfff"/><path d="m4 1040.4h5l-5 5z" fill="#ff7070"/><path d="m4 1048.4v-3l5-5h3v3l-5 5z" fill="#7aff70"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_capsule_mesh.svg b/editor/icons/icon_capsule_mesh.svg
deleted file mode 100644
index 1c9470105f..0000000000
--- a/editor/icons/icon_capsule_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.7527 0-5 2.2419-5 4.9903v4.0175c0 2.7484 2.2473 4.9922 5 4.9922s5-2.2438 5-4.9922v-4.0175c0-2.7484-2.2473-4.9903-5-4.9903zm-1.0059 2.1264v4.8576c-.66556-.1047-1.2973-.372-1.9941-.6618v-1.3222c0-1.3474.79838-2.4648 1.9941-2.8736zm2.0118 0c1.1957.4088 1.9941 1.5262 1.9941 2.8736v1.3451c-.68406.3054-1.3142.5732-1.9941.6663zm-4.0059 6.334c.67836.2231 1.3126.447 1.9941.5264v2.8848c-1.1957-.4092-1.9941-1.5242-1.9941-2.8716zm6 .03v.5094c0 1.3474-.79838 2.4619-1.9941 2.8711v-2.8711c.68606-.068 1.3207-.2828 1.9941-.5094z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_capsule_shape.svg b/editor/icons/icon_capsule_shape.svg
deleted file mode 100644
index ba035ca196..0000000000
--- a/editor/icons/icon_capsule_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m8 1037.4c-2.7527 0-5 2.2419-5 4.9903v4.0175c0 2.7484 2.2473 4.9922 5 4.9922s5-2.2438 5-4.9922v-4.0175c0-2.7484-2.2473-4.9903-5-4.9903z" fill="#68b6ff"/><circle cx="6.5" cy="1040.9" fill="#a2d2ff" r="1.5"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_capsule_shape_2d.svg b/editor/icons/icon_capsule_shape_2d.svg
deleted file mode 100644
index 81de995cb4..0000000000
--- a/editor/icons/icon_capsule_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.77 0-5 2.23-5 5v4c0 2.77 2.23 5 5 5s5-2.23 5-5v-4c0-2.77-2.23-5-5-5zm0 2c1.662 0 3 1.338 3 3v4c0 1.662-1.338 3-3 3s-3-1.338-3-3v-4c0-1.662 1.338-3 3-3z" fill="#68b6ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_center_container.svg b/editor/icons/icon_center_container.svg
deleted file mode 100644
index 5d854a3cc3..0000000000
--- a/editor/icons/icon_center_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h10v10h-10zm3 1 2 2 2-2zm-2 2v4l2-2zm8 0-2 2 2 2zm-4 4-2 2h4z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_check_box.svg b/editor/icons/icon_check_box.svg
deleted file mode 100644
index 6cb1f2aacd..0000000000
--- a/editor/icons/icon_check_box.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-1.1046 0-2 .89543-2 2v9c0 1.1046.89543 2 2 2h9c1.1046 0 2-.89543 2-2v-4.9277l-2 2v2.9277h-9v-9h6.5859l2-2zm9.3633 2.0508-4.9492 4.9492-1.4141-1.4141-1.4141 1.4141 2.8281 2.8281 6.3633-6.3633z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_check_button.svg b/editor/icons/icon_check_button.svg
deleted file mode 100644
index f689c5fe47..0000000000
--- a/editor/icons/icon_check_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 4a4 4 0 0 0 -4 4 4 4 0 0 0 4 4h6a4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 2h2.541a4 4 0 0 0 -.54102 2 4 4 0 0 0 .54102 2h-2.541a2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_checkerboard.svg b/editor/icons/icon_checkerboard.svg
deleted file mode 100644
index 7923291017..0000000000
--- a/editor/icons/icon_checkerboard.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -988.36)"><path d="m0 988.36h64v64h-64z" fill-opacity=".19608" stroke-width="2"/><path d="m0 0v16h16v-16zm16 16v16h16v-16zm16 0h16v-16h-16zm16 0v16h16v-16zm0 16h-16v16h16zm0 16v16h16v-16zm-16 0h-16v16h16zm-16 0v-16h-16v16z" fill-opacity=".39216" stroke-width="8" transform="translate(0 988.36)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_circle_shape_2d.svg b/editor/icons/icon_circle_shape_2d.svg
deleted file mode 100644
index e41fc8807c..0000000000
--- a/editor/icons/icon_circle_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1038.4a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" fill="none" stroke="#68b6ff" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_class_list.svg b/editor/icons/icon_class_list.svg
deleted file mode 100644
index ae2494724d..0000000000
--- a/editor/icons/icon_class_list.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1v1h-5v1h2v10h1 5v1h6v-3h-6v1h-5v-4h5v1h6v-3h-6v1h-5v-4h2v1h6v-3z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_clear.svg b/editor/icons/icon_clear.svg
deleted file mode 100644
index 91343ca6af..0000000000
--- a/editor/icons/icon_clear.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v5h-2c-1.108 0-2 .892-2 2v1h10v-1c0-1.108-.892-2-2-2h-2v-5a1 1 0 0 0 -1-1zm-5 10v4l10-1v-3z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_clipped_camera.svg b/editor/icons/icon_clipped_camera.svg
deleted file mode 100644
index 8c80c04e27..0000000000
--- a/editor/icons/icon_clipped_camera.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6.5 12v4h3v-1h-2v-3zm-1 0h-2c-.5 0-1 .5-1 1v2c-.01829.53653.5 1 1 1h2v-1h-2v-2h2zm4-12c-1.5691.0017903-2.8718 1.2125-2.9883 2.7773-.55103-.49952-1.268-.77655-2.0117-.77734-1.6569 0-3 1.3431-3 3 .00179 1.2698.80282 2.4009 2 2.8242v2.1758c0 .554.44599 1 1 1h6c.55401 0 1-.446 1-1v-1l3 2v-6l-3 2v-1.7695c.63486-.56783.99842-1.3788 1-2.2305 0-1.6569-1.3431-3-3-3zm1 12v4h1v-1h1c.55228 0 1-.44772 1-1v-1c0-.55228-.44775-.99374-1-1h-1zm1 1h1v1h-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_close.svg b/editor/icons/icon_close.svg
deleted file mode 100644
index 4147c7bcdd..0000000000
--- a/editor/icons/icon_close.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_collapse.svg b/editor/icons/icon_collapse.svg
deleted file mode 100644
index 62b5e55d81..0000000000
--- a/editor/icons/icon_collapse.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1044.4 5 4 5-4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_collision_polygon.svg b/editor/icons/icon_collision_polygon.svg
deleted file mode 100644
index 5e849ae4e3..0000000000
--- a/editor/icons/icon_collision_polygon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12l-6 6z" fill="none" stroke="#fc9c9c" stroke-linejoin="round" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_collision_polygon_2d.svg b/editor/icons/icon_collision_polygon_2d.svg
deleted file mode 100644
index 54148f3fd4..0000000000
--- a/editor/icons/icon_collision_polygon_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12l-6 6z" fill="none" stroke="#a5b7f3" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_collision_shape.svg b/editor/icons/icon_collision_shape.svg
deleted file mode 100644
index 8f14996a97..0000000000
--- a/editor/icons/icon_collision_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1050.4-6-3v-6l6-3 6 3v6z" fill="none" stroke="#fc9c9c" stroke-linejoin="round" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.399988)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_collision_shape_2d.svg b/editor/icons/icon_collision_shape_2d.svg
deleted file mode 100644
index 8210bf917f..0000000000
--- a/editor/icons/icon_collision_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12z" fill="none" stroke="#a5b7f3" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_color.svg b/editor/icons/icon_color.svg
deleted file mode 100644
index de0540763e..0000000000
--- a/editor/icons/icon_color.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 4a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2z" fill="#ff8484"/><path d="m14 4a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2z" fill="#84c2ff"/><path d="m6 2v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-5z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_color_pick.svg b/editor/icons/icon_color_pick.svg
deleted file mode 100644
index d73225bd60..0000000000
--- a/editor/icons/icon_color_pick.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.108 0-2 .892-2 2v2h-1v2h1v5a2 2 0 0 0 1 1.7285v1.2715h2v-1.2695a2 2 0 0 0 1-1.7305v-5h1v-2h-1v-2c0-1.108-.892-2-2-2zm-1 6h2v5a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_color_picker.svg b/editor/icons/icon_color_picker.svg
deleted file mode 100644
index 3d03615708..0000000000
--- a/editor/icons/icon_color_picker.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.108 0-2 .892-2 2v2h-1v2h1v5a2 2 0 0 0 1 1.7285v1.2715h2v-1.2695a2 2 0 0 0 1-1.7305v-5h1v-2h-1v-2c0-1.108-.892-2-2-2zm-1 6h2v5a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_color_picker_button.svg b/editor/icons/icon_color_picker_button.svg
deleted file mode 100644
index b9fa86db6a..0000000000
--- a/editor/icons/icon_color_picker_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1c-1.108 0-2 .892-2 2v2h-1v2h1v5a2 2 0 0 0 1 1.7285v1.2715h2v-1.2695a2 2 0 0 0 1-1.7305v-5h1v-2h-1v-2c0-1.108-.892-2-2-2zm-9 1v3.1328l-1.4453-.96484-1.1094 1.6641 3 2c.3359.2239.77347.2239 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm8 5h2v5a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1zm-8.5 3c-.831 0-1.5.669-1.5 1.5v.5 1h-1v2h8v-2h-1v-1-.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_color_ramp.svg b/editor/icons/icon_color_ramp.svg
deleted file mode 100644
index e0f0a67483..0000000000
--- a/editor/icons/icon_color_ramp.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(.51852 0 0 .7 -.55556 1034.6)" gradientUnits="userSpaceOnUse" x1="4" x2="30" y1="14" y2="14"><stop offset="0" stop-color="#afff68"/><stop offset="1" stop-color="#ff6b6b"/></linearGradient><path d="m1 1051.4h14v-14z" fill="url(#a)" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_color_rect.svg b/editor/icons/icon_color_rect.svg
deleted file mode 100644
index c2054de9d3..0000000000
--- a/editor/icons/icon_color_rect.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m1 1v14h14v-14zm2 2h10v10h-10z" fill="#a5efac" transform="translate(0 1036.4)"/><g fill-rule="evenodd"><path d="m12 1048.4h-4.8l4.8-4.8z" fill="#70bfff"/><path d="m4 1040.4h4.8l-4.8 4.8z" fill="#ff7070"/><path d="m4 1048.4v-3.2l4.8-4.8h3.2v3.2l-4.8 4.8z" fill="#7aff70"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_color_track_vu.svg b/editor/icons/icon_color_track_vu.svg
deleted file mode 100644
index 5760f81070..0000000000
--- a/editor/icons/icon_color_track_vu.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="24" viewBox="0 0 16 24" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(1.0931873 0 0 1.4762899 -.980214 .08553)" gradientUnits="userSpaceOnUse" x1="7.728814" x2="7.728814" y1="16.474577" y2="3.864407"><stop offset="0" stop-color="#288027"/><stop offset="1" stop-color="#dbee15"/></linearGradient><linearGradient id="b" gradientTransform="matrix(1.1036585 0 0 .47778193 -16.507235 -7.901817)" gradientUnits="userSpaceOnUse" x1="7.728814" x2="7.728814" y1="16.474577" y2="3.864407"><stop offset="0" stop-color="#f70000"/><stop offset="1" stop-color="#eec315"/></linearGradient><rect fill="url(#a)" height="18.416088" ry=".845801" width="18.232145" x="-1.350786" y="5.99069"/><rect fill="url(#b)" height="5.960126" ry=".273732" transform="scale(-1)" width="18.406782" x="-16.881357" y="-5.99069"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_concave_polygon_shape.svg b/editor/icons/icon_concave_polygon_shape.svg
deleted file mode 100644
index 001ab82826..0000000000
--- a/editor/icons/icon_concave_polygon_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><g fill="#2998ff"><path d="m8 1-7 3v8l7 3 7-3v-8z" transform="translate(0 1036.4)"/><path d="m8 1037.4-7 3v8l7 3 7-3v-8z"/><path d="m3 1041.4v6l5 2 5-2v-6l-5-2z"/></g><path d="m8 1049.4 5-2-5-2-5 2z" fill="#a2d2ff"/><path d="m8 1045.4 5 2v-6l-5-2z" fill="#68b6ff"/><g transform="translate(0 1036.4)"><path d="m8 1-7 3 2 1 5-2 5 2 2-1z" fill="#a2d2ff"/><path d="m1 4v8l7 3v-2l-5-2v-6z" fill="#68b6ff"/><path d="m15 4-2 1v6l-5 2v2l7-3z" fill="#2998ff"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_concave_polygon_shape_2d.svg b/editor/icons/icon_concave_polygon_shape_2d.svg
deleted file mode 100644
index 38a92095c9..0000000000
--- a/editor/icons/icon_concave_polygon_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12l6 6 6-6z" fill="none" stroke="#68b6ff" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_cone_twist_joint.svg b/editor/icons/icon_cone_twist_joint.svg
deleted file mode 100644
index 0e5e98a17b..0000000000
--- a/editor/icons/icon_cone_twist_joint.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9824 1a1.0001 1.0001 0 0 0 -.81445.44531l-4.7012 7.0527c-.80117.58197-1.3801 1.3563-1.4492 2.3145a1.0001 1.0001 0 0 0 -.017578.1875c0 .21449.033976.41628.082031.61328.0071983.028314.015306.055972.023438.083985.053631.19149.1274.37452.2207.54883.19678.36764.47105.69651.80273.98633.007988.007025.013442.016473.021484.023437.016953.014679.03747.026532.054688.041016.10299.086112.21259.16531.32422.24414.23883.16992.49083.33075.76953.4707.0025295.00127.0052799.002638.0078125.003906.001313.000658.0025928.001296.0039063.001953.0085785.00429.018732.007456.027344.011719.26499.13103.55174.24596.84961.35156.10487.037634.21202.071147.32031.10547.072945.022902.1402.050715.21484.072266.16777.04843.34161.086385.51367.12695.093562.021905.18185.048745.27734.068359.010733.002205.022447.003684.033203.00586.34623.071177.69974.12196 1.0566.16211.057889.006228.11544.01213.17383.017578.81052.079498 1.6348.079498 2.4453 0 .058387-.005448.11594-.01135.17383-.017578.3569-.040146.71041-.090932 1.0566-.16211.010948-.002251.022269-.003578.033203-.00586.095491-.019614.18378-.046454.27734-.068359.17206-.040568.3459-.078523.51367-.12695.074642-.021551.1419-.049364.21484-.072266.10829-.034322.21544-.067835.32031-.10547.29787-.1056.58462-.22053.84961-.35156.009951-.00492.021348-.008715.03125-.013672.002626-.001315.005189-.002588.007813-.003906.2787-.13995.5307-.30078.76953-.4707.11163-.07883.22123-.15803.32422-.24414.017218-.014484.037734-.026337.054687-.041016.008042-.006964.013497-.016412.021485-.023437.33169-.28982.60596-.61869.80273-.98633.093299-.17431.16707-.35733.2207-.54883.008132-.028013.016239-.055671.023438-.083985.048055-.197.082031-.39879.082031-.61328a1.0001 1.0001 0 0 0 -.017578-.18164 1.0001 1.0001 0 0 0 -.001953-.017578c-.073081-.95265-.64941-1.7232-1.4473-2.3027l-4.7012-7.0527a1.0001 1.0001 0 0 0 -.84961-.44531zm-.98242 4.3027v1.7461c-.43911.033461-.86366.087835-1.2734.16406l1.2734-1.9102zm2 0 1.2734 1.9102c-.40978-.076228-.83432-.1306-1.2734-.16406v-1.7461zm-2 3.748v1.9492a1.0001 1.0001 0 1 0 2 0v-1.9492c1.1126.10487 2.0951.37277 2.7949.72266.12146.060728.20622.12218.30664.18359l.80078 1.2012c-.032965.14677-.089654.30658-.30469.51758-.051464.049149-.10034.098137-.16406.14844-.045193.035312-.091373.070148-.14258.10547-.11245.07827-.24511.15838-.39062.23633-.075428.040204-.1553.078371-.23828.11719-.16195.075482-.33452.14662-.52148.21289-.070588.025324-.14454.048409-.21875.072265-.23425.074473-.48077.14392-.74414.20117-.021343.004579-.041038.011189-.0625.015625-.2559.05368-.53101.090517-.80859.125-.856.10229-1.7573.10229-2.6133 0-.27759-.034483-.5527-.07132-.80859-.125-.021462-.004436-.041156-.011046-.0625-.015625-.26337-.057254-.50989-.1267-.74414-.20117-.074211-.023856-.14816-.046941-.21875-.072265-.18697-.066266-.35954-.13741-.52148-.21289-.082979-.038816-.16285-.076983-.23828-.11719-.14552-.077951-.27818-.15806-.39062-.23633-.051205-.035321-.097386-.070157-.14258-.10547-.06372-.050301-.1126-.099289-.16406-.14844-.21503-.21099-.27173-.37081-.30469-.51758l.80078-1.2012c.10043-.061415.18518-.12287.30664-.18359.69978-.34989 1.6823-.61778 2.7949-.72266z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_confirmation_dialog.svg b/editor/icons/icon_confirmation_dialog.svg
deleted file mode 100644
index d1f13fbb3b..0000000000
--- a/editor/icons/icon_confirmation_dialog.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm6.9863 1.002c.34689-.0022844.6986.055762 1.0391.17969 1.3618.4956 2.1813 1.9126 1.9297 3.3398-.19105 1.0835-.96172 1.9461-1.9551 2.3008v.17773h-1-1v-.8418a1.0001 1.0001 0 0 1 1-1.1582c.49193 0 .89895-.34177.98438-.82617.085424-.4845-.18031-.94508-.64258-1.1133-.46227-.1683-.96106.013453-1.207.43945a1.0002 1.0002 0 0 1 -1.7324-1c.54346-.94148 1.5433-1.4912 2.584-1.498zm-.98633 6.998h2v1h-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_container.svg b/editor/icons/icon_container.svg
deleted file mode 100644
index aaea67faa1..0000000000
--- a/editor/icons/icon_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h2zm2 0v2h2v-2zm4 0v2h2v-2zm4 0v2h2c0-1.1046-.89543-2-2-2zm-12 4v2h2v-2zm12 0v2h2v-2zm-12 4v2h2v-2zm12 0v2h2v-2zm-12 4c0 1.1046.89543 2 2 2v-2zm4 0v2h2v-2zm4 0v2h2v-2zm4 0v2c1.1046 0 2-.89543 2-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control.svg b/editor/icons/icon_control.svg
deleted file mode 100644
index ff6a52e29a..0000000000
--- a/editor/icons/icon_control.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_bottom_center.svg b/editor/icons/icon_control_align_bottom_center.svg
deleted file mode 100644
index 7aee8caa79..0000000000
--- a/editor/icons/icon_control_align_bottom_center.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m6 10h4v4h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_bottom_left.svg b/editor/icons/icon_control_align_bottom_left.svg
deleted file mode 100644
index aa26eb570a..0000000000
--- a/editor/icons/icon_control_align_bottom_left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 10h4v4h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_bottom_right.svg b/editor/icons/icon_control_align_bottom_right.svg
deleted file mode 100644
index 737328e6f0..0000000000
--- a/editor/icons/icon_control_align_bottom_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 10h4v4h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_bottom_wide.svg b/editor/icons/icon_control_align_bottom_wide.svg
deleted file mode 100644
index ad0d7fac85..0000000000
--- a/editor/icons/icon_control_align_bottom_wide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 10h12v4h-12z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_center.svg b/editor/icons/icon_control_align_center.svg
deleted file mode 100644
index 14dd500500..0000000000
--- a/editor/icons/icon_control_align_center.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m6 6h4v4h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_center_left.svg b/editor/icons/icon_control_align_center_left.svg
deleted file mode 100644
index 52f1d4d143..0000000000
--- a/editor/icons/icon_control_align_center_left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 6h6v4h-6z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_center_right.svg b/editor/icons/icon_control_align_center_right.svg
deleted file mode 100644
index 201796f172..0000000000
--- a/editor/icons/icon_control_align_center_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 6h6v4h-6z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_left_center.svg b/editor/icons/icon_control_align_left_center.svg
deleted file mode 100644
index 8135c9d851..0000000000
--- a/editor/icons/icon_control_align_left_center.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 6h4v4h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_left_wide.svg b/editor/icons/icon_control_align_left_wide.svg
deleted file mode 100644
index 56d16bec76..0000000000
--- a/editor/icons/icon_control_align_left_wide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h4v12h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_right_center.svg b/editor/icons/icon_control_align_right_center.svg
deleted file mode 100644
index 69c4dba40d..0000000000
--- a/editor/icons/icon_control_align_right_center.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 6h4v4h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_right_wide.svg b/editor/icons/icon_control_align_right_wide.svg
deleted file mode 100644
index b0a46cdb82..0000000000
--- a/editor/icons/icon_control_align_right_wide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 2h4v12h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_top_center.svg b/editor/icons/icon_control_align_top_center.svg
deleted file mode 100644
index cafb3ff856..0000000000
--- a/editor/icons/icon_control_align_top_center.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m6 2h4v3.9999h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_top_left.svg b/editor/icons/icon_control_align_top_left.svg
deleted file mode 100644
index ad288647fb..0000000000
--- a/editor/icons/icon_control_align_top_left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h4v3.9999h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_top_right.svg b/editor/icons/icon_control_align_top_right.svg
deleted file mode 100644
index d9955de728..0000000000
--- a/editor/icons/icon_control_align_top_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m10 2h4v3.9999h-4z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_top_wide.svg b/editor/icons/icon_control_align_top_wide.svg
deleted file mode 100644
index 2526b45ad9..0000000000
--- a/editor/icons/icon_control_align_top_wide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h12v3.9999h-12z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_align_wide.svg b/editor/icons/icon_control_align_wide.svg
deleted file mode 100644
index 5d1467cd9b..0000000000
--- a/editor/icons/icon_control_align_wide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 2h12v12h-12z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_hcenter_wide.svg b/editor/icons/icon_control_hcenter_wide.svg
deleted file mode 100644
index 51c9aeb22d..0000000000
--- a/editor/icons/icon_control_hcenter_wide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#919191"/><path d="m2 2h12v12h-12z" fill="#474747"/><path d="m2 6h12v4h-12z" fill="#d6d6d6"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_layout.svg b/editor/icons/icon_control_layout.svg
deleted file mode 100644
index e39e6b474c..0000000000
--- a/editor/icons/icon_control_layout.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h14v-14zm2 2h3v3h-3zm5 0h5v3h-5zm-5 5h3v5h-3zm5 0h5v5h-5z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_control_vcenter_wide.svg b/editor/icons/icon_control_vcenter_wide.svg
deleted file mode 100644
index 93bbc5748b..0000000000
--- a/editor/icons/icon_control_vcenter_wide.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m0 1036.4h16v16h-16z" fill="#919191"/><path d="m2 1038.4h12v12h-12z" fill="#474747"/><path d="m1038.4-10h12v4h-12z" fill="#d6d6d6" transform="rotate(90)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_convex_polygon_shape.svg b/editor/icons/icon_convex_polygon_shape.svg
deleted file mode 100644
index bfb9230586..0000000000
--- a/editor/icons/icon_convex_polygon_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3z" fill="#2998ff" transform="translate(0 1036.4)"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#68b6ff"/><path d="m8 1-7 3 7 11 7-3z" fill="#2998ff" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_convex_polygon_shape_2d.svg b/editor/icons/icon_convex_polygon_shape_2d.svg
deleted file mode 100644
index 8d16523d93..0000000000
--- a/editor/icons/icon_convex_polygon_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-6l6-6 6 6z" fill="none" stroke="#68b6ff" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_copy_node_path.svg b/editor/icons/icon_copy_node_path.svg
deleted file mode 100644
index 2cabe0a44e..0000000000
--- a/editor/icons/icon_copy_node_path.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><circle cx="3" cy="1048.4"/><path d="m2 1c-.55226.0001-.99994.4477-1 1v12c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-8l-5-5zm1 2h6v3c0 .554.44599 1 1 1h3v6h-10zm3 5-2 4h2l2-4zm4 0-2 4h2l2-4z" fill-opacity=".78431" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_create_new_scene_from.svg b/editor/icons/icon_create_new_scene_from.svg
deleted file mode 100644
index ffeaa36bc4..0000000000
--- a/editor/icons/icon_create_new_scene_from.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25-.28906-1.9785zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812-.81836-1.9004zm-1.4258 3.2285v6c0 1.1046.89543 2 2 2h7v-1h-2v-4h2v-2h4v2h1v-3z" fill="#e0e0e0" transform="translate(0 1036.4)"/><circle cx="-14" cy="1047.4" fill="#e0e0e0" r="0"/><path d="m13 1049.4h2v-2h-2v-2h-2v2h-2v2h2v2h2z" fill="#84ffb1" fill-rule="evenodd"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_crosshair.svg b/editor/icons/icon_crosshair.svg
deleted file mode 100644
index b6fa5ec654..0000000000
--- a/editor/icons/icon_crosshair.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1v5h-5v1 3h5v5h4v-5h5v-4h-5v-5z" fill-opacity=".627451"/><path d="m2 7v2l5.0000803.0000197-.0000803 4.9999803h2l-.0000803-4.9999803 5.0000803-.0000197v-2l-5.0000803.0001803.0000803-5.0001803h-2l.0000803 5.0001803z" fill="#fefefe" fill-opacity=".862745"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_crypto_key.svg b/editor/icons/icon_crypto_key.svg
deleted file mode 100644
index 45b53c815d..0000000000
--- a/editor/icons/icon_crypto_key.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 4.233 4.233" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.397.34-.374.373-.375.374v.375l.188.187-1.497 1.496v.375l.374.374h.374l.187-.188.282-.092.092-.282.282-.093.093-.28.094-.28.28-.095.187-.187.187.187h.374l.375-.375.373-.373.001-.374-1.122-1.122zm.374.858a.264.264 0 1 1 .002.528.264.264 0 0 1 -.002-.528z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_cube_map.svg b/editor/icons/icon_cube_map.svg
deleted file mode 100644
index c9e6f1fa7d..0000000000
--- a/editor/icons/icon_cube_map.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 6v4h4v-4zm8 0v4h4v-4z" fill="#84ffb1"/><path d="m4 6v4h4v-4zm8 0v4h4v-4z" fill="#ff8484"/><path d="m4 2v4h4v-4zm0 8v4h4v-4z" fill="#84c2ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_cube_mesh.svg b/editor/icons/icon_cube_mesh.svg
deleted file mode 100644
index aeb5324b1b..0000000000
--- a/editor/icons/icon_cube_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 .88867-7 3.5v7.2227l7 3.5 7-3.5v-7.2227zm0 2.1152 3.9395 1.9707-3.9395 1.9688-3.9395-1.9688zm-5 3.5527 4 2v3.9414l-4-2.002zm10 0v3.9395l-4 2.002v-3.9414z" fill="#ffd684" stroke-width="1.0667" transform="scale(.9375)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve.svg b/editor/icons/icon_curve.svg
deleted file mode 100644
index 14895337c6..0000000000
--- a/editor/icons/icon_curve.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-width="2" transform="translate(0 -1036.4)"><path d="m2 1038.4v12h12" stroke-linecap="square" stroke-opacity=".32549"/><path d="m2 1050.4c8 0 12-4 12-12" stroke-linecap="round"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_2d.svg b/editor/icons/icon_curve_2d.svg
deleted file mode 100644
index 23f585c7c5..0000000000
--- a/editor/icons/icon_curve_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1037.4c-3.1667 0-5.1045.854-6.082 2.3203-.97757 1.4664-.91797 3.1797-.91797 4.6797s-.059601 2.7867-.58203 3.5703c-.52243.7837-1.5846 1.4297-4.418 1.4297a1.0001 1.0001 0 1 0 0 2c3.1667 0 5.1045-.8539 6.082-2.3203.97757-1.4663.91797-3.1797.91797-4.6797s.059601-2.7866.58203-3.5703c.52243-.7836 1.5846-1.4297 4.418-1.4297a1.0001 1.0001 0 1 0 0-2z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_3d.svg b/editor/icons/icon_curve_3d.svg
deleted file mode 100644
index f14c581ec3..0000000000
--- a/editor/icons/icon_curve_3d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0039 1037.4a1.0001 1.0001 0 0 0 -.45117.1113l-6 3a1.0001 1.0001 0 0 0 0 1.7891l6 3a1.0001 1.0001 0 0 0 .89453 0l4.5527-2.2754v3.7636l-5 2.5-5.5527-2.7773a1.0001 1.0001 0 0 0 -.89453 1.7891l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.8946v-6a1.0001 1.0001 0 0 0 -1.4473-.8945l-5.5527 2.7773-3.7637-1.8828 4.2109-2.1054a1.0001 1.0001 0 0 0 -.44336-1.9004z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_close.svg b/editor/icons/icon_curve_close.svg
deleted file mode 100644
index 7d7bae88c2..0000000000
--- a/editor/icons/icon_curve_close.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m5 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm8 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/><path d="m10 6v2h2v-2zm0 2h-2v2h2zm-2 2h-2v2h2z" fill="#84c2ff"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_constant.svg b/editor/icons/icon_curve_constant.svg
deleted file mode 100644
index 713a3a982a..0000000000
--- a/editor/icons/icon_curve_constant.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1046.4h8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_create.svg b/editor/icons/icon_curve_create.svg
deleted file mode 100644
index 43811f93f5..0000000000
--- a/editor/icons/icon_curve_create.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m5 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm6 5v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#84ffb1"/><path d="m13 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_curve.svg b/editor/icons/icon_curve_curve.svg
deleted file mode 100644
index 60f965abc1..0000000000
--- a/editor/icons/icon_curve_curve.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m8.4688.4707-2.6875 2.6875h-.0019531a2 2 0 0 0 -.7793-.1582 2 2 0 0 0 -2 2 2 2 0 0 0 .16016.7793l-2.6914 2.6914 1.0625 1.0605 2.6895-2.6895a2 2 0 0 0 .7793.1582 2 2 0 0 0 2-2 2 2 0 0 0 -.16016-.77734l2.6914-2.6914-1.0625-1.0605z" fill="#84c2ff"/><path d="m13 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_delete.svg b/editor/icons/icon_curve_delete.svg
deleted file mode 100644
index afb545840f..0000000000
--- a/editor/icons/icon_curve_delete.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><path d="m5 1039.4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm4.8789 5.4648-1.4141 1.4141 2.1211 2.1211-2.1211 2.1211 1.4141 1.4141 2.1211-2.1211 2.1211 2.1211 1.4141-1.4141-2.1211-2.1211 2.1211-2.1211-1.4141-1.4141-2.1211 2.1211z" fill="#ff8484"/><path d="m13 1039.4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_edit.svg b/editor/icons/icon_curve_edit.svg
deleted file mode 100644
index 5d1d6560e1..0000000000
--- a/editor/icons/icon_curve_edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m5 1049.4c-2-9-1-10 8-8" fill="none" stroke="#f5f5f5" stroke-opacity=".39216" stroke-width="2"/><g transform="translate(0 1036.4)"><path d="m5 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm3 5 3.291 8 .94726-2.8203 1.8828 1.8828.94336-.94141-1.8848-1.8828 2.8203-.94726-8-3.291z" fill="#84c2ff"/><path d="m13 3a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-8 8a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#f5f5f5"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_in.svg b/editor/icons/icon_curve_in.svg
deleted file mode 100644
index b9e203dea0..0000000000
--- a/editor/icons/icon_curve_in.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c5 0 8-3 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_in_out.svg b/editor/icons/icon_curve_in_out.svg
deleted file mode 100644
index 6d3c57d4f5..0000000000
--- a/editor/icons/icon_curve_in_out.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c5 0 3-8 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_linear.svg b/editor/icons/icon_curve_linear.svg
deleted file mode 100644
index 2256f493ce..0000000000
--- a/editor/icons/icon_curve_linear.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_out.svg b/editor/icons/icon_curve_out.svg
deleted file mode 100644
index 9b04df6b6c..0000000000
--- a/editor/icons/icon_curve_out.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c0-5 3-8 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_out_in.svg b/editor/icons/icon_curve_out_in.svg
deleted file mode 100644
index 4a08d30966..0000000000
--- a/editor/icons/icon_curve_out_in.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c0-5 8-3 8-8" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1040.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_curve_texture.svg b/editor/icons/icon_curve_texture.svg
deleted file mode 100644
index 05f9d62775..0000000000
--- a/editor/icons/icon_curve_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55228 0-1 .44772-1 1v9.1602c.32185-.10966.66-.16382 1-.16016.33117 0 .66575-.007902 1-.013672v-7.9863h10v1.1348c.29007-.10393.59442-.16256.90234-.17383.37315-.012796.74541.044169 1.0977.16797v-2.1289c0-.55228-.44772-1-1-1h-12zm7 4v1h-1v1h-2v1h-1v1h-1v1h2 2 .39062c1.1119-.56677 1.9678-1.4538 2.6094-3.4727v-.52734h-1v-1h-1zm4.9668.98828a1.0001 1.0001 0 0 0 -.92774.73828c-.92743 3.246-2.6356 4.6825-4.6523 5.4668-2.0168.7843-4.3867.80664-6.3867.80664a1.0001 1.0001 0 1 0 0 2c2 0 4.6301.023994 7.1133-.94141 2.4832-.9657 4.7751-3.0292 5.8477-6.7832a1.0001 1.0001 0 0 0 -.99414-1.2871z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_cylinder_mesh.svg b/editor/icons/icon_cylinder_mesh.svg
deleted file mode 100644
index f204edc985..0000000000
--- a/editor/icons/icon_cylinder_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.5.9375c-1.6377 0-3.12.2123-4.2737.5969-.57682.1923-1.0754.4237-1.4905.7508-.41505.3271-.79834.8259-.79834 1.4648v7.5c0 .6389.38329 1.1396.79834 1.4667s.91366.5585 1.4905.7507c1.1536.3846 2.6359.5951 4.2737.5951s3.12-.2105 4.2737-.5951c.57682-.1922 1.0754-.4236 1.4905-.7507.41505-.3271.79834-.8278.79834-1.4667v-7.5c0-.6389-.38329-1.1377-.79834-1.4648s-.91366-.5585-1.4905-.7508c-1.1536-.3846-2.6359-.5969-4.2737-.5969zm0 1.875c1.4689 0 2.8.2076 3.6823.5017.4347.1449.7513.3163.9082.4376-.15705.1212-.47387.2911-.9082.4358-.88221.2941-2.2134.4999-3.6823.4999s-2.8-.2058-3.6823-.4999c-.43433-.1447-.75115-.3146-.9082-.4358.15691-.1213.47351-.2927.9082-.4376.88221-.2941 2.2134-.5017 3.6823-.5017zm-4.6875 2.9883c.13762.055.26578.1173.41382.1666 1.1536.3846 2.6359.5951 4.2737.5951s3.12-.2105 4.2737-.5951c.14804-.049.2762-.1112.41382-.1666v5.4492c-.15705.1212-.57092.2929-1.0052.4376-.88221.2941-2.2134.4999-3.6823.4999s-2.8-.2058-3.6823-.4999c-.43433-.1447-.8482-.3164-1.0052-.4376z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_cylinder_shape.svg b/editor/icons/icon_cylinder_shape.svg
deleted file mode 100644
index f0aa5833d2..0000000000
--- a/editor/icons/icon_cylinder_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m.890374 3.687944h13.171325v7.699331h-13.171325z" fill="#68b6ff"/><ellipse cx="7.477298" cy="3.722912" fill="#a2d2ff" rx="6.586479" ry="2.820821"/><ellipse cx="7.474688" cy="11.34481" fill="#68b6ff" rx="6.586479" ry="2.820821"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_damped_spring_joint_2d.svg b/editor/icons/icon_damped_spring_joint_2d.svg
deleted file mode 100644
index 9bd842bcc8..0000000000
--- a/editor/icons/icon_damped_spring_joint_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-opacity=".98824"><path d="m4 3v2l8 3v-2zm0 5v2l8 3v-2z" fill="#708cea"/><path d="m4 3v2l8-2v-2zm0 5v2l8-2v-2zm0 5v2l8-2v-2z" fill="#a5b7f3"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_debug.svg b/editor/icons/icon_debug.svg
deleted file mode 100644
index 7490862c4a..0000000000
--- a/editor/icons/icon_debug.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.3257 0-2.5977.52744-3.5352 1.4648a1 1 0 0 0 0 1.4141 1 1 0 0 0 .69141.29297 1 1 0 0 0 .72266-.29297c.56288-.5628 1.3251-.87891 2.1211-.87891s1.5582.31611 2.1211.87891a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141c-.93741-.9374-2.2095-1.4648-3.5352-1.4648zm-5 3.9961a1 1 0 0 0 -1 1c0 .8334.32654 1.6973.96875 2.5.33016.41272.7705.79575 1.3008 1.0723a4 4 0 0 0 -.13672.43164h-2.1328a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h2.1309a4 4 0 0 0 .17969.53711c-.14177.089422-.27868.1846-.41016.2832-.58533.439-1.1074.96875-1.6074 1.4688a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0c.5-.5.97791-.9722 1.3926-1.2832.1693-.12693.3098-.20282.44336-.26953a4 4 0 0 0 2.457.84961 4 4 0 0 0 2.459-.84766c.13307.066645.27298.14126.44141.26758.41467.311.89258.7832 1.3926 1.2832a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141c-.5-.5-1.0221-1.0297-1.6074-1.4688-.13076-.098068-.26727-.19224-.4082-.28125a4 4 0 0 0 .17578-.53906h2.1328a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-2.1309a4 4 0 0 0 -.13477-.43359c.52857-.27637.96751-.65858 1.2969-1.0703.64221-.8027.96875-1.6666.96875-2.5a1 1 0 0 0 -1-1 1 1 0 0 0 -1 1c0 .1667-.17346.8028-.53125 1.25-.25089.31365-.54884.54907-.93164.66602a4 4 0 0 0 -.60352-.41211 2 2 0 0 0 .066406-.5 2 2 0 0 0 -2-2 2 2 0 0 0 -2 2 2 2 0 0 0 .066406.50391 4 4 0 0 0 -.60352.4082c-.3828-.11694-.68075-.35236-.93164-.66602-.35779-.4472-.53125-1.0833-.53125-1.25a1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_debug_continue.svg b/editor/icons/icon_debug_continue.svg
deleted file mode 100644
index 69c64c4fd4..0000000000
--- a/editor/icons/icon_debug_continue.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m10 4v3h-5v2h5v3l2.5-2 2.5-2-2.5-2z" fill="#ff8484" transform="translate(0 1036.4)"/><circle cx="4" cy="1044.4" fill="#e0e0e0" r="3"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_debug_next.svg b/editor/icons/icon_debug_next.svg
deleted file mode 100644
index 133be255e1..0000000000
--- a/editor/icons/icon_debug_next.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1v10h-2l1.5 2 1.5 2 1.5-2 1.5-2h-2v-10z" fill="#ff8484"/><path d="m7 1v2h8v-2zm2 4v2h6v-2zm0 4v2h6v-2zm-2 4v2h8v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_debug_skip_breakpoints_off.svg b/editor/icons/icon_debug_skip_breakpoints_off.svg
deleted file mode 100644
index f8923510bb..0000000000
--- a/editor/icons/icon_debug_skip_breakpoints_off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="17" viewBox="0 0 17 17" width="17" xmlns="http://www.w3.org/2000/svg"><path d="m4.8983252 3.006855a1.6192284 1.3289529 0 0 1 -.0000431.0097" stroke-width=".626319"/><path d="m8.796752 5.0553513a2.563139 3.6270869 0 0 1 -.0000683.02648" stroke-width=".626319"/><path d="m13.121337 4.512148a6.1594577 6.0545759 0 0 1 -.248787 8.20109 6.1594577 6.0545759 0 0 1 -8.3355404.427215 6.1594577 6.0545759 0 0 1 -1.1151058-8.1311866 6.1594577 6.0545759 0 0 1 8.1530832-1.7576713" fill="#ff8585" fill-opacity=".996078" stroke-width="1.019123"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_debug_skip_breakpoints_on.svg b/editor/icons/icon_debug_skip_breakpoints_on.svg
deleted file mode 100644
index d4a4b4c138..0000000000
--- a/editor/icons/icon_debug_skip_breakpoints_on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="17" viewBox="0 0 17 17" width="17" xmlns="http://www.w3.org/2000/svg"><path d="m4.8983252 3.006855a1.6192284 1.3289529 0 0 1 -.0000431.0097" stroke-width=".626319"/><path d="m8.796752 5.0553513a2.563139 3.6270869 0 0 1 -.0000683.02648" stroke-width=".626319"/><path d="m13.121337 4.512148a6.1594577 6.0545759 0 0 1 -.248787 8.20109 6.1594577 6.0545759 0 0 1 -8.3355404.427215 6.1594577 6.0545759 0 0 1 -1.1151058-8.1311866 6.1594577 6.0545759 0 0 1 8.1530832-1.7576713" fill="#ff8585" fill-opacity=".996078" stroke-width="1.019123"/><path d="m-9.290675 10.816157h18.575495v2.518711h-18.575495z" fill="#e0e0e0" stroke-width="1.187332" transform="matrix(.70605846 -.70815355 .70605846 .70815355 0 0)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_debug_step.svg b/editor/icons/icon_debug_step.svg
deleted file mode 100644
index c0356463fe..0000000000
--- a/editor/icons/icon_debug_step.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v8 2h2 1v2l2-1.5 2-1.5-2-1.5-2-1.5v2h-1v-8z" fill="#ff8484"/><path d="m7 1v2h8v-2zm2 4v2h6v-2zm0 4v2h6v-2zm-2 4v2h8v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_default_project_icon.svg b/editor/icons/icon_default_project_icon.svg
deleted file mode 100644
index 10ecbd019d..0000000000
--- a/editor/icons/icon_default_project_icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><g stroke-linejoin="round"><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8z" fill="#355570" stroke-linecap="round" stroke-width="2"/><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8zm0 2h48c3.324 0 6 2.676 6 6v48c0 3.324-2.676 6-6 6h-48c-3.324 0-6-2.676-6-6v-48c0-3.324 2.676-6 6-6z" fill-opacity=".19608" stroke-linecap="round" stroke-width="2"/><path d="m27.254 10c-2.1314.47383-4.2401 1.134-6.2168 2.1289.04521 1.7455.15796 3.4164.38672 5.1152-.76768.4919-1.574.91443-2.291 1.4902-.72854.5604-1.4731 1.0965-2.1328 1.752-1.3179-.8716-2.7115-1.691-4.1484-2.4141-1.549 1.667-2.9985 3.4672-4.1816 5.4805.89011 1.4399 1.8209 2.7894 2.8242 4.0703h.027343v9.9453 1.2617 1.1504l-.009765 1.6309h-.001953c.0031.7321.011718 1.5356.011718 1.6953 0 7.1942 9.1264 10.652 20.465 10.691h.013672.013672c11.338-.04 20.461-3.4972 20.461-10.691 0-.1626.010282-.96271.013672-1.6953h-.001953l-.011719-1.6309v-.98633l.003907-.001953v-11.369h.027343c1.0035-1.2809 1.9337-2.6304 2.8242-4.0703-1.1827-2.0133-2.6327-3.8135-4.1816-5.4805-1.4366.7231-2.8325 1.5425-4.1504 2.4141-.65947-.6555-1.4013-1.1916-2.1309-1.752-.71682-.5758-1.5248-.99833-2.291-1.4902.22813-1.6988.3413-3.3697.38672-5.1152-1.977-.99494-4.0863-1.6551-6.2188-2.1289-.85139 1.4309-1.6285 2.9812-2.3066 4.4961-.80409-.1344-1.613-.18571-2.4219-.19531h-.015625-.015625c-.81037.01-1.6176.060513-2.4219.19531-.67768-1.5149-1.4559-3.0652-2.3086-4.4961z" fill="#fff" stroke="#fff" stroke-width="3"/></g><g stroke-width=".32031" transform="matrix(.050279 0 0 .050279 6.2574 1.18)"><path d="m0 0s-.325 1.994-.515 1.976l-36.182-3.491c-2.879-.278-5.115-2.574-5.317-5.459l-.994-14.247-27.992-1.997-1.904 12.912c-.424 2.872-2.932 5.037-5.835 5.037h-38.188c-2.902 0-5.41-2.165-5.834-5.037l-1.905-12.912-27.992 1.997-.994 14.247c-.202 2.886-2.438 5.182-5.317 5.46l-36.2 3.49c-.187.018-.324-1.978-.511-1.978l-.049-7.83 30.658-4.944 1.004-14.374c.203-2.91 2.551-5.263 5.463-5.472l38.551-2.75c.146-.01.29-.016.434-.016 2.897 0 5.401 2.166 5.825 5.038l1.959 13.286h28.005l1.959-13.286c.423-2.871 2.93-5.037 5.831-5.037.142 0 .284.005.423.015l38.556 2.75c2.911.209 5.26 2.562 5.463 5.472l1.003 14.374 30.645 4.966z" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 919.24 771.67)"/><path d="m0 0v-59.041c.108-.001.216-.005.323-.015l36.196-3.49c1.896-.183 3.382-1.709 3.514-3.609l1.116-15.978 31.574-2.253 2.175 14.747c.282 1.912 1.922 3.329 3.856 3.329h38.188c1.933 0 3.573-1.417 3.855-3.329l2.175-14.747 31.575 2.253 1.115 15.978c.133 1.9 1.618 3.425 3.514 3.609l36.182 3.49c.107.01.214.014.322.015v4.711l.015.005v54.325h.134c4.795 6.12 9.232 12.569 13.487 19.449-5.651 9.62-12.575 18.217-19.976 26.182-6.864-3.455-13.531-7.369-19.828-11.534-3.151 3.132-6.7 5.694-10.186 8.372-3.425 2.751-7.285 4.768-10.946 7.118 1.09 8.117 1.629 16.108 1.846 24.448-9.446 4.754-19.519 7.906-29.708 10.17-4.068-6.837-7.788-14.241-11.028-21.479-3.842.642-7.702.88-11.567.926v.006c-.027 0-.052-.006-.075-.006-.024 0-.049.006-.073.006v-.006c-3.872-.046-7.729-.284-11.572-.926-3.238 7.238-6.956 14.642-11.03 21.479-10.184-2.264-20.258-5.416-29.703-10.17.216-8.34.755-16.331 1.848-24.448-3.668-2.35-7.523-4.367-10.949-7.118-3.481-2.678-7.036-5.24-10.188-8.372-6.297 4.165-12.962 8.079-19.828 11.534-7.401-7.965-14.321-16.562-19.974-26.182 4.253-6.88 8.693-13.329 13.487-19.449z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 104.7 525.91)"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916 0-3.569 1.406-3.852 3.33l-2.211 14.994h-31.459l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616l-1.121 16.063-32.547 3.138c.015-3.498.06-7.33.06-8.093 0-34.374 43.605-50.896 97.781-51.086h.133c54.176.19 97.766 16.712 97.766 51.086 0 .777.047 4.593.063 8.093z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 784.07 817.24)"/><path d="m0 0c0-12.052-9.765-21.815-21.813-21.815-12.042 0-21.81 9.763-21.81 21.815 0 12.044 9.768 21.802 21.81 21.802 12.048 0 21.813-9.758 21.813-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 389.21 625.67)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996 0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479c8 0 14.479-6.485 14.479-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 367.37 631.06)"/><path d="m0 0c-3.878 0-7.021 2.858-7.021 6.381v20.081c0 3.52 3.143 6.381 7.021 6.381s7.028-2.861 7.028-6.381v-20.081c0-3.523-3.15-6.381-7.028-6.381" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 511.99 724.74)"/><path d="m0 0c0-12.052 9.765-21.815 21.815-21.815 12.041 0 21.808 9.763 21.808 21.815 0 12.044-9.767 21.802-21.808 21.802-12.05 0-21.815-9.758-21.815-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 634.79 625.67)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473 8.002 0 14.479 6.479 14.479 14.473s-6.477 14.479-14.479 14.479c-7.994 0-14.471-6.485-14.471-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 656.64 631.06)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_delete_split.svg b/editor/icons/icon_delete_split.svg
deleted file mode 100644
index 7424de3b8a..0000000000
--- a/editor/icons/icon_delete_split.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m.623213 6.939446h1.845669v2.085366h-1.845669z" fill="#800000"/><path d="m12.488225 7.179143h1.629941v1.989487h-1.629941z" fill="#800000"/><g fill="#e9afaf"><path d="m2.540791 7.970143h3.164003v.407485h-3.164003z"/><path d="m9.012615 8.042052h3.523549v.527334h-3.523549z"/><g transform="matrix(-.55917959 .82904655 -.82904655 -.55917959 0 0)"><path d="m1.511097-9.732645h3.643398v.455425h-3.643398z"/><path d="m.07207-12.144793h3.643398v.455425h-3.643398z"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_dictionary.svg b/editor/icons/icon_dictionary.svg
deleted file mode 100644
index 668ef37a86..0000000000
--- a/editor/icons/icon_dictionary.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2v2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-8zm3 0v2h2v-2zm7 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2zm-2 2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2zm-3 3v-1h-2v4h2zm-5-1v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#77edb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_directional_light.svg b/editor/icons/icon_directional_light.svg
deleted file mode 100644
index faac2be134..0000000000
--- a/editor/icons/icon_directional_light.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3h2v-3zm-2.5352 2.0508-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-3.5352 1.9492c-1.6569 0-3 1.3432-3 3s1.3431 3 3 3 3-1.3432 3-3-1.3431-3-3-3zm-7 2v2h3v-2zm11 0v2h3v-2zm-7.5352 3.1211-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.5352 1.8789v3h2v-3z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_distraction_free.svg b/editor/icons/icon_distraction_free.svg
deleted file mode 100644
index 8608b33f58..0000000000
--- a/editor/icons/icon_distraction_free.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v5l1.793-1.793 2.5 2.5 1.4141-1.4141-2.5-2.5 1.793-1.793h-5zm9 0 1.793 1.793-2.5 2.5 1.4141 1.4141 2.5-2.5 1.793 1.793v-5h-5zm-4.707 8.293-2.5 2.5-1.793-1.793v5h5l-1.793-1.793 2.5-2.5-1.4141-1.4141zm5.4141 0-1.4141 1.4141 2.5 2.5-1.793 1.793h5v-5l-1.793 1.793-2.5-2.5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_duplicate.svg b/editor/icons/icon_duplicate.svg
deleted file mode 100644
index d506b7a8c7..0000000000
--- a/editor/icons/icon_duplicate.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1v11h9v-6h-5v-5zm5 0v4h4zm-8 3v11h2 8v-2h-8v-9z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_dynamic_font.svg b/editor/icons/icon_dynamic_font.svg
deleted file mode 100644
index fe5eca2e35..0000000000
--- a/editor/icons/icon_dynamic_font.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m1 1037.4v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#e0e0e0"/><path d="m4 5v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#84c2ff" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_dynamic_font_data.svg b/editor/icons/icon_dynamic_font_data.svg
deleted file mode 100644
index 56426dd33e..0000000000
--- a/editor/icons/icon_dynamic_font_data.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2zm0 5v2h2v-2zm0 3v2h2v-2zm0 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0"/><path d="m4 5v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#ff8484"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_edit.svg b/editor/icons/icon_edit.svg
deleted file mode 100644
index bb7ffa2fce..0000000000
--- a/editor/icons/icon_edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_edit_bezier.svg b/editor/icons/icon_edit_bezier.svg
deleted file mode 100644
index be9e2f22b8..0000000000
--- a/editor/icons/icon_edit_bezier.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m1.4758015 1050.3064c11.6492855.7191 3.1098343-11.4976 12.2331255-11.3475" fill="none" stroke="#84c2ff" stroke-miterlimit="4.9" stroke-width="2.2"/><g fill="#e0e0e0"><circle cx="13.470984" cy="1038.7133" r="1.823002"/><circle cx="2.444912" cy="1050.1708" r="1.823002"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_edit_internal.svg b/editor/icons/icon_edit_internal.svg
deleted file mode 100644
index 2a538102ce..0000000000
--- a/editor/icons/icon_edit_internal.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m7 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1z" transform="translate(-3.322034)"/><circle cx="10.508475" cy="12.677966" r="2.372881"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_edit_key.svg b/editor/icons/icon_edit_key.svg
deleted file mode 100644
index 883ddfda71..0000000000
--- a/editor/icons/icon_edit_key.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-7 3c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm6 1v7l2 3 2-3v-7zm1 1h1v5h-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_edit_pivot.svg b/editor/icons/icon_edit_pivot.svg
deleted file mode 100644
index ae303535b4..0000000000
--- a/editor/icons/icon_edit_pivot.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v4h2v-4zm-6 6v2h4v-2zm10 0v.61328l3.3711 1.3867h.62891v-2h-4zm-3 1 3.291 8 .94726-2.8203 1.8828 1.8828.94336-.94141-1.8848-1.8828 2.8203-.94726-8-3.291zm-1 3v4h2v-.625l-1.3887-3.375h-.61133z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_edit_resource.svg b/editor/icons/icon_edit_resource.svg
deleted file mode 100644
index e16ca00355..0000000000
--- a/editor/icons/icon_edit_resource.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3.9902-.0097656a1.0001 1.0001 0 0 0 -.69727 1.7168l1.293 1.293h-3.5859v2h3.5859l-1.293 1.293a1.0001 1.0001 0 1 0 1.4141 1.4141l3-3a1.0001 1.0001 0 0 0 0-1.4141l-3-3a1.0001 1.0001 0 0 0 -.7168-.30273z" fill="#e0e0e0" fill-opacity=".78431"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_3d_handle.svg b/editor/icons/icon_editor_3d_handle.svg
deleted file mode 100644
index 687a5b184d..0000000000
--- a/editor/icons/icon_editor_3d_handle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" fill-opacity=".29412" r="8"/><circle cx="8" cy="8" fill="#fff" r="7"/><circle cx="8" cy="8" fill="#ff8484" r="5"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_control_anchor.svg b/editor/icons/icon_editor_control_anchor.svg
deleted file mode 100644
index 11e2bb5175..0000000000
--- a/editor/icons/icon_editor_control_anchor.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m5 0a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 1.0566-.11914l9.9434 6.1191-6.1172-9.9395a5 5 0 0 0 .11719-1.0605 5 5 0 0 0 -5-5z" fill-opacity=".39216" transform="translate(0 1036.4)"/><path d="m5 1a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 1.1406-.16992l9.8594 7.1699-7.168-9.8555a4 4 0 0 0 .16797-1.1445 4 4 0 0 0 -4-4z" fill="#a5efac" fill-rule="evenodd" transform="translate(0 1036.4)"/><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/><circle cx="5" cy="1041.4" fill="#a5efac" r="0"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_curve_handle.svg b/editor/icons/icon_editor_curve_handle.svg
deleted file mode 100644
index c405ceab9d..0000000000
--- a/editor/icons/icon_editor_curve_handle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill="#fefefe" r="2.75" stroke="#000" stroke-linecap="square"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_handle.svg b/editor/icons/icon_editor_handle.svg
deleted file mode 100644
index 8b11e782db..0000000000
--- a/editor/icons/icon_editor_handle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill-opacity=".29412" r="5"/><circle cx="5" cy="5" fill="#fff" r="4"/><circle cx="5" cy="5" fill="#ff8484" r="3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_handle_add.svg b/editor/icons/icon_editor_handle_add.svg
deleted file mode 100644
index bf3b604d5c..0000000000
--- a/editor/icons/icon_editor_handle_add.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill-opacity=".29412" r="5"/><circle cx="5" cy="5" fill="#474747" r="4"/><path d="m4 2v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_internal_handle.svg b/editor/icons/icon_editor_internal_handle.svg
deleted file mode 100644
index 244e6b5d6c..0000000000
--- a/editor/icons/icon_editor_internal_handle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill-opacity=".29412" r="5"/><circle cx="5" cy="5" fill="#fff" r="4"/><circle cx="5" cy="5" fill="#84b1ff" r="3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_path_sharp_handle.svg b/editor/icons/icon_editor_path_sharp_handle.svg
deleted file mode 100644
index db160dfeae..0000000000
--- a/editor/icons/icon_editor_path_sharp_handle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m-3.035534-10.106602h6.071068v6.071068h-6.071068z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="matrix(-.70710678 .70710678 -.70710678 -.70710678 0 0)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_path_smooth_handle.svg b/editor/icons/icon_editor_path_smooth_handle.svg
deleted file mode 100644
index 34f3d290bd..0000000000
--- a/editor/icons/icon_editor_path_smooth_handle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m1.5-8.5h7v7h-7z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="rotate(90)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_pivot.svg b/editor/icons/icon_editor_pivot.svg
deleted file mode 100644
index 8e00f60530..0000000000
--- a/editor/icons/icon_editor_pivot.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v6h-6v4h6v6h4v-6h6v-4h-6v-6zm1 7h2v2h-2z" fill="#fff" fill-opacity=".70588"/><path d="m7 1v5h2v-5zm-6 6v2h5v-2zm9 0v2h5v-2zm-3 3v5h2v-5z" fill="#ff8484"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_plugin.svg b/editor/icons/icon_editor_plugin.svg
deleted file mode 100644
index 72f2bd5c28..0000000000
--- a/editor/icons/icon_editor_plugin.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v8c.0000552.5523.44774.9999 1 1h3v.27148a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-.26953h3c.55226-.0001.99994-.4477 1-1v-3h.27148a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-.26953v-3c-.000055-.5523-.44774-.9999-1-1h-8z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_position.svg b/editor/icons/icon_editor_position.svg
deleted file mode 100644
index 7b17fb5aa3..0000000000
--- a/editor/icons/icon_editor_position.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v4.4199a4.2662 4.0576 0 0 0 -1.709 1.5801h-4.291v4h4.2949a4.2662 4.0576 0 0 0 1.7051 1.582v4.418h4v-4.4199a4.2662 4.0576 0 0 0 1.709-1.5801h4.291v-4h-4.2949a4.2662 4.0576 0 0 0 -1.7051-1.582v-4.418z" fill="#fff" fill-opacity=".70588"/><path d="m7 1v3.0605a4.2662 4.0576 0 0 1 1-.11914 4.2662 4.0576 0 0 1 1 .11914v-3.0605zm1 4.0801a2.9201 2.9201 0 0 0 -2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199-2.9199 2.9201 2.9201 0 0 0 -2.9199-2.9199zm-7 1.9199v2h2.8691a4.2662 4.0576 0 0 1 -.13477-1 4.2662 4.0576 0 0 1 .13672-1h-2.8711zm11.131 0a4.2662 4.0576 0 0 1 .13477 1 4.2662 4.0576 0 0 1 -.13672 1h2.8711v-2h-2.8691zm-5.1309 4.9395v3.0605h2v-3.0605a4.2662 4.0576 0 0 1 -1 .11914 4.2662 4.0576 0 0 1 -1-.11914z" fill="#ff8484"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_position_previous.svg b/editor/icons/icon_editor_position_previous.svg
deleted file mode 100644
index 8c1d2992a5..0000000000
--- a/editor/icons/icon_editor_position_previous.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3.0605a4.2662 4.0576 0 0 1 1-.11914 4.2662 4.0576 0 0 1 1 .11914v-3.0605zm1 4.0801a2.9201 2.9201 0 0 0 -2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199-2.9199 2.9201 2.9201 0 0 0 -2.9199-2.9199zm-7 1.9199v2h2.8691a4.2662 4.0576 0 0 1 -.13477-1 4.2662 4.0576 0 0 1 .13672-1h-2.8711zm11.131 0a4.2662 4.0576 0 0 1 .13477 1 4.2662 4.0576 0 0 1 -.13672 1h2.8711v-2h-2.8691zm-5.1309 4.9395v3.0605h2v-3.0605a4.2662 4.0576 0 0 1 -1 .11914 4.2662 4.0576 0 0 1 -1-.11914z" fill="#69f" fill-opacity=".69804"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_editor_position_unselected.svg b/editor/icons/icon_editor_position_unselected.svg
deleted file mode 100644
index b9a38ca371..0000000000
--- a/editor/icons/icon_editor_position_unselected.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0v4.4199a4.2662 4.0576 0 0 0 -1.709 1.5801h-4.291v4h4.2949a4.2662 4.0576 0 0 0 1.7051 1.582v4.418h4v-4.4199a4.2662 4.0576 0 0 0 1.709-1.5801h4.291v-4h-4.2949a4.2662 4.0576 0 0 0 -1.7051-1.582v-4.418z" fill-opacity=".41077"/><path d="m7 1v3.0605a4.2662 4.0576 0 0 1 1-.11914 4.2662 4.0576 0 0 1 1 .11914v-3.0605zm1 4.0801a2.9201 2.9201 0 0 0 -2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199 2.9199 2.9201 2.9201 0 0 0 2.9199-2.9199 2.9201 2.9201 0 0 0 -2.9199-2.9199zm-7 1.9199v2h2.8691a4.2662 4.0576 0 0 1 -.13477-1 4.2662 4.0576 0 0 1 .13672-1h-2.8711zm11.131 0a4.2662 4.0576 0 0 1 .13477 1 4.2662 4.0576 0 0 1 -.13672 1h2.8711v-2h-2.8691zm-5.1309 4.9395v3.0605h2v-3.0605a4.2662 4.0576 0 0 1 -1 .11914 4.2662 4.0576 0 0 1 -1-.11914z" fill="#d9d9d9"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_enum.svg b/editor/icons/icon_enum.svg
deleted file mode 100644
index efa3050e95..0000000000
--- a/editor/icons/icon_enum.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-.5304.0000801-1.0391.21085-1.4141.58594-.37509.37501-.58586.88366-.58594 1.4141v1c-.2652.0000401-.51953.10542-.70703.29297-.18755.18751-.29293.44183-.29297.70703.00004008.2652.10542.51953.29297.70703.18751.18755.44183.29293.70703.29297v1c.0000801.5304.21085 1.0391.58594 1.4141.37501.37509.88366.58586 1.4141.58594h1v-2h-1v-4h1v-2zm3 0v8h4v-2h-2v-1h2v-2h-2v-1h2v-2zm6 0v2h1v4h-1v2h1c.5304-.0000803 1.0391-.21085 1.4141-.58594.37509-.37501.58586-.88366.58594-1.4141v-1c.2652-.0000401.51953-.10542.70703-.29297.18755-.18751.29293-.44183.29297-.70703-.00004-.2652-.10542-.51953-.29297-.70703-.1875-.18755-.44183-.29293-.70703-.29297v-1c-.00008-.5304-.21085-1.0391-.58594-1.4141-.37501-.37509-.88366-.58586-1.4141-.58594z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_environment.svg b/editor/icons/icon_environment.svg
deleted file mode 100644
index ee29342942..0000000000
--- a/editor/icons/icon_environment.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0"><circle cx="8" cy="8" r="6" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><g stroke-width="1.5" transform="translate(0 -1036.4)"><path d="m2 1044.4c4.5932 1.582 8.3985 1.0627 12 0"/><path d="m8 1038.4c-3 4-3 8 0 12"/><path d="m8 1038.4c3 4 3 8 0 12"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_error.svg b/editor/icons/icon_error.svg
deleted file mode 100644
index 05e548068d..0000000000
--- a/editor/icons/icon_error.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#ff5d5d" height="8" ry="4" width="8"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_error_sign.svg b/editor/icons/icon_error_sign.svg
deleted file mode 100644
index 96aace5c0c..0000000000
--- a/editor/icons/icon_error_sign.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1020.4)"><path d="m10 1048.4h12l6-6v-12l-6-6h-12l-6 6v12z" fill="#ff5d5d" fill-rule="evenodd"/><path d="m14 8 1 10h2l1-10zm2 12a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#fff" transform="translate(0 1020.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_expand_bottom_dock.svg b/editor/icons/icon_expand_bottom_dock.svg
deleted file mode 100644
index 09cc3b9b07..0000000000
--- a/editor/icons/icon_expand_bottom_dock.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.2130251 4.516057-3.5355339 3.5355339h2.5356849v4.9737171h1.9998394v-4.9737171h2.5356849l-3.5355339-3.5355339z"/><path d="m11.907306 4.6119359-3.5355342 3.5355339h2.5356852v4.9737172h1.999839v-4.9737172h2.535685l-3.535534-3.5355339z"/><path d="m1.288136 1.370074h14v1.830509h-14z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_favorites.svg b/editor/icons/icon_favorites.svg
deleted file mode 100644
index 79e0c8475e..0000000000
--- a/editor/icons/icon_favorites.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1038.1-2.3741 4.0973-4.6259 1.0978 3.2361 3.4074-.35866 4.6735 4.1389-1.9766 4.1572 1.9421-.39534-4.6532 3.2218-3.3932-4.6259-1.0978z" fill="#e0e0e0" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file.svg b/editor/icons/icon_file.svg
deleted file mode 100644
index 22d330fd56..0000000000
--- a/editor/icons/icon_file.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v14h12v-9h-5v-5zm8 0v4h4z" fill="#e0e0e0" transform="translate(0 -.000017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_big_thumb.svg b/editor/icons/icon_file_big_thumb.svg
deleted file mode 100644
index 50900ab684..0000000000
--- a/editor/icons/icon_file_big_thumb.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m14 5c-2.1987 0-4 1.8013-4 4v46c0 2.1987 1.8013 4 4 4h36c2.1987 0 4-1.8013 4-4v-33h-.007812c.00212-.24832-.079273-.50098-.28516-.70703l-16-16c-.18786-.18693-.44246-.28939-.70703-.28906v-.0039062h-23zm0 2h22v2 10c0 2.1987 1.8013 4 4 4h10 2v32c0 1.1253-.87472 2-2 2h-36c-1.1253 0-2-.8747-2-2v-46c0-1.1253.87472-2 2-2z" fill="#fff" fill-opacity=".58824" transform="translate(0 -.000017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_broken.svg b/editor/icons/icon_file_broken.svg
deleted file mode 100644
index af79f02c12..0000000000
--- a/editor/icons/icon_file_broken.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v8.5859l1.293-1.293a1.0001 1.0001 0 0 1 .69141-.29102 1.0001 1.0001 0 0 1 .72266.29102l2.293 2.293 2.293-2.293a1.0001 1.0001 0 0 1 1.4141 0l2.293 2.293 1-1v-3.5859h-5v-5h-7zm8 0v4h4zm-6 9.4141-2 2v2.5859h12v-2.5859l-.29297.29297a1.0001 1.0001 0 0 1 -1.4141 0l-2.293-2.293-2.293 2.293a1.0001 1.0001 0 0 1 -1.4141 0l-2.293-2.293z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_broken_big_thumb.svg b/editor/icons/icon_file_broken_big_thumb.svg
deleted file mode 100644
index 08dee26f1c..0000000000
--- a/editor/icons/icon_file_broken_big_thumb.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m14 5c-2.1987 0-4 1.8013-4 4v26.172a1.0001 1.0001 0 0 0 1.707.70703l3.293-3.293 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l9.293-9.293 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l8-8a1.0001 1.0001 0 0 0 .29297-.70703v-11.172a1.0001 1.0001 0 0 0 -.29297-.70703l-16-16a1.0001 1.0001 0 0 0 -.70703-.29297h-23zm0 2h22v12c0 2.1987 1.8013 4 4 4h12v9.7578l-7 7-9.293-9.293a1.0001 1.0001 0 0 0 -1.4141 0l-9.293 9.293-9.293-9.293a1.0001 1.0001 0 0 0 -1.4141 0l-2.293 2.293v-23.758c0-1.1253.87473-2 2-2zm.98438 28.83a1.0001 1.0001 0 0 0 -.69141.29297l-4 4a1.0001 1.0001 0 0 0 -.29297.70703v14.17c0 2.1987 1.8013 4 4 4h36c2.1987 0 4-1.8013 4-4v-16.17a1.0001 1.0001 0 0 0 -1.707-.70703l-7.293 7.293-9.293-9.293a1.0001 1.0001 0 0 0 -1.4141 0l-9.293 9.293-9.293-9.293a1.0001 1.0001 0 0 0 -.72266-.29297zm.015625 2.4141 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l9.293-9.293 9.293 9.293a1.0001 1.0001 0 0 0 1.4141 0l6.293-6.293v13.756c0 1.1253-.87473 2-2 2h-36c-1.1253 0-2-.87473-2-2v-13.756l3-3z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_dead.svg b/editor/icons/icon_file_dead.svg
deleted file mode 100644
index c40aa1b9a4..0000000000
--- a/editor/icons/icon_file_dead.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v14h12v-9h-5v-5zm8 0v4h4zm-6.0078 6c.1353-.0020779.26567.050774.36133.14648l.64648.64648.64648-.64648c.09183-.091882.21582-.14442.3457-.14648.1353-.00208.26567.050774.36133.14648.19521.19525.19521.51178 0 .70703l-.64648.64648.64648.64648c.19521.19525.19521.51178 0 .70703-.19525.19521-.51178.19521-.70703 0l-.64648-.64648-.64648.64648c-.19525.19521-.51178.19521-.70703 0-.19521-.19525-.19521-.51178 0-.70703l.64648-.64648-.64648-.64648c-.19521-.19525-.19521-.51178 0-.70703.09183-.091882.21582-.14442.3457-.14648zm6 0c.1353-.00208.26567.050774.36133.14648l.64648.64648.64648-.64648c.09183-.091883.21582-.14442.3457-.14648.1353-.00208.26567.050774.36133.14648.19521.19525.19521.51178 0 .70703l-.64648.64648.64648.64648c.19521.19525.19521.51178 0 .70703-.19525.19521-.51178.19521-.70703 0l-.64648-.64648-.64648.64648c-.19525.19521-.51178.19521-.70703 0-.19521-.19525-.19521-.51178 0-.70703l.64648-.64648-.64648-.64648c-.19521-.19525-.19521-.51178 0-.70703.09183-.091882.21582-.14442.3457-.14648zm-6.4922 4h9c.277 0 .5.223.5.5s-.223.5-.5.5h-4.5c0 1.1046-.89543 2-2 2s-2-.8954-2-2h-.5c-.277 0-.5-.223-.5-.5s.223-.5.5-.5zm1.5 1c-.000019.5523.44771 1 1 1s1-.4477 1-1z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_dead_big_thumb.svg b/editor/icons/icon_file_dead_big_thumb.svg
deleted file mode 100644
index 79369873a6..0000000000
--- a/editor/icons/icon_file_dead_big_thumb.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m14 993.36c-2.1987 0-4 1.8013-4 4v46c0 2.1987 1.8013 4 4 4h36c2.1987 0 4-1.8013 4-4v-33h-.0078c.002-.2483-.0793-.501-.28516-.707l-16-16c-.18788-.18693-.44247-.28939-.70704-.28907v-.004zm0 2h22v12c0 2.1987 1.8013 4 4 4h12v32c0 1.1253-.87472 2-2 2h-36c-1.1253 0-2-.8747-2-2v-46c0-1.1253.87472-2 2-2zm2.9512 22.002a1 1 0 0 0 -.60938.2461 1 1 0 0 0 -.09375 1.4121l2.9238 3.3398-2.9238 3.3418a1 1 0 0 0 .09375 1.4121 1 1 0 0 0 1.4102-.094l2.748-3.1407 2.748 3.1407a1 1 0 0 0 1.4102.094 1 1 0 0 0 .09375-1.4121l-2.9238-3.3418 2.9238-3.3398a1 1 0 0 0 -.09375-1.4121 1 1 0 0 0 -.63867-.2461 1 1 0 0 0 -.77148.3398l-2.748 3.1406-2.748-3.1406a1 1 0 0 0 -.80078-.3398zm23 0a1 1 0 0 0 -.60938.2461 1 1 0 0 0 -.09375 1.4121l2.9238 3.3398-2.9238 3.3418a1 1 0 0 0 .09375 1.4121 1 1 0 0 0 1.4102-.094l2.748-3.1407 2.748 3.1407a1 1 0 0 0 1.4102.094 1 1 0 0 0 .09375-1.4121l-2.9238-3.3418 2.9238-3.3398a1 1 0 0 0 -.09375-1.4121 1 1 0 0 0 -.63867-.2461 1 1 0 0 0 -.77148.3398l-2.748 3.1406-2.748-3.1406a1 1 0 0 0 -.80078-.3398zm-18.951 13.998a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h3v3c0 2.7527 2.2473 5 5 5s5-2.2473 5-5v-3h9a1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm5 2h6v3c0 1.6793-1.3207 3-3 3s-3-1.3207-3-3z" fill="#ff5d5d" transform="translate(0 -988.360017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_dead_medium_thumb.svg b/editor/icons/icon_file_dead_medium_thumb.svg
deleted file mode 100644
index 62496daaae..0000000000
--- a/editor/icons/icon_file_dead_medium_thumb.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.6447 0-3 1.3553-3 3v24c0 1.6447 1.3553 3 3 3h22c1.6447 0 3-1.3553 3-3v-16.809c-.000051-.2652-.10543-.51952-.29297-.70703l-9.1816-9.1895c-.18719-.18825-.44155-.29435-.70703-.29492h-14.818zm0 2h14v6c0 1.6447 1.3553 3 3 3h6v16c0 .5713-.42868 1-1 1h-22c-.57133 0-1-.4287-1-1v-24c0-.5713.42867-1 1-1zm1.9863 11.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l1.293 1.293-1.293 1.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l1.293-1.293 1.293 1.293a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-1.293-1.293 1.293-1.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-1.293 1.293-1.293-1.293a1 1 0 0 0 -.7207-.29102zm14 0a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l1.293 1.293-1.293 1.293a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l1.293-1.293 1.293 1.293a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-1.293-1.293 1.293-1.293a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-1.293 1.293-1.293-1.293a1 1 0 0 0 -.7207-.29102zm-13.986 7.998a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h1a4 4 0 0 0 2 3.4648 4 4 0 0 0 4 0 4 4 0 0 0 2-3.4648h9a1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm3 2h4a2 2 0 0 1 -2 2 2 2 0 0 1 -2-2z" fill="#ff5d5d" transform="translate(0 -.000017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_dialog.svg b/editor/icons/icon_file_dialog.svg
deleted file mode 100644
index 7708659c21..0000000000
--- a/editor/icons/icon_file_dialog.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm3 2h3c1 0 1 2 2 2h3v4h-8z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_list.svg b/editor/icons/icon_file_list.svg
deleted file mode 100644
index e47c8b18cb..0000000000
--- a/editor/icons/icon_file_list.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2zm-4 5v2h2v-2zm4 0v2h8v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_medium_thumb.svg b/editor/icons/icon_file_medium_thumb.svg
deleted file mode 100644
index 4c7d78b58e..0000000000
--- a/editor/icons/icon_file_medium_thumb.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.6447 0-3 1.3553-3 3v24c0 1.6447 1.3553 3 3 3h22c1.6447 0 3-1.3553 3-3v-16.809c-.000051-.2652-.10543-.51952-.29297-.70703l-9.1816-9.1895c-.18719-.18825-.44155-.29435-.70703-.29492zm0 2h14v6c0 1.6447 1.3553 3 3 3h6v16c0 .5713-.42868 1-1 1h-22c-.57133 0-1-.4287-1-1v-24c0-.5713.42867-1 1-1z" fill="#fff" fill-opacity=".58824" transform="translate(0 -.000017)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_file_thumbnail.svg b/editor/icons/icon_file_thumbnail.svg
deleted file mode 100644
index 571335a935..0000000000
--- a/editor/icons/icon_file_thumbnail.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2v5h5v-5zm7 0v5h5v-5zm-7 7v5h5v-5zm7 0v5h5v-5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_filesystem.svg b/editor/icons/icon_filesystem.svg
deleted file mode 100644
index da6fa2ad60..0000000000
--- a/editor/icons/icon_filesystem.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v5h2v8h1 5v1h6v-3h-6v1h-5v-4h5v1h6v-3h-6v1h-5v-2h3v-4h-2l-1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_fixed_material.svg b/editor/icons/icon_fixed_material.svg
deleted file mode 100644
index 903691689b..0000000000
--- a/editor/icons/icon_fixed_material.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1037.4a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-2 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_fixed_spatial_material.svg b/editor/icons/icon_fixed_spatial_material.svg
deleted file mode 100644
index ba1e251088..0000000000
--- a/editor/icons/icon_fixed_spatial_material.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -4.8887 2h2.8887 6.8965a7 7 0 0 0 -4.8965-2z" fill="#ff7070"/><path d="m3.1113 3a7 7 0 0 0 -1.4277 2h2.3164a2 2 0 0 1 2-2zm2.8887 0a2 2 0 0 1 2 2h6.3145a7 7 0 0 0 -1.418-2z" fill="#ffeb70"/><path d="m1.6836 5a7 7 0 0 0 -.60547 2h4.9219a2 2 0 0 1 -2-2h-2.3164zm4.3164 2h8.9199a7 7 0 0 0 -.60547-2h-6.3145a2 2 0 0 1 -2 2z" fill="#9dff70"/><path d="m1.0781 7a7 7 0 0 0 -.078125 1 7 7 0 0 0 .080078 1h13.842a7 7 0 0 0 .078125-1 7 7 0 0 0 -.080078-1h-8.9199-4.9219z" fill="#70ffb9"/><path d="m1.0801 9a7 7 0 0 0 .60547 2h12.631a7 7 0 0 0 .60547-2h-13.842z" fill="#70deff"/><path d="m3.1035 13a7 7 0 0 0 4.8965 2 7 7 0 0 0 4.8887-2z" fill="#ff70ac"/><path d="m1.6855 11a7 7 0 0 0 1.418 2h9.7852a7 7 0 0 0 1.4277-2h-12.631z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_float.svg b/editor/icons/icon_float.svg
deleted file mode 100644
index 5c09d4c244..0000000000
--- a/editor/icons/icon_float.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2a3 3 0 0 0 -3 3v5h2v-2h2v-2h-2v-1a1 1 0 0 1 1-1h1v-2zm3 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-5zm6 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2z" fill="#61daf4"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_folder.svg b/editor/icons/icon_folder.svg
deleted file mode 100644
index 00ff7a95e9..0000000000
--- a/editor/icons/icon_folder.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2a1 1 0 0 0 -1 1v2 6 2a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1h-4a1 1 0 0 1 -1-1v-1a1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_folder_big_thumb.svg b/editor/icons/icon_folder_big_thumb.svg
deleted file mode 100644
index a620d17b8f..0000000000
--- a/editor/icons/icon_folder_big_thumb.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m12 10c-2.2091 0-4 1.7909-4 4v37h.13086c.45564 1.7647 2.0466 2.9982 3.8691 3h40c2.2091 0 4-1.7909 4-4v-28c0-2.2091-1.7909-4-4-4h-16l-2-4c-.98796-1.9759-1.7909-4-4-4z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_folder_medium_thumb.svg b/editor/icons/icon_folder_medium_thumb.svg
deleted file mode 100644
index 431650aff0..0000000000
--- a/editor/icons/icon_folder_medium_thumb.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m6 1025.4c-1.1046 0-2 .8954-2 2v18.5h.06543c.22782.8823 1.0233 1.4991 1.9346 1.5h20c1.1046 0 2-.8954 2-2v-14c0-1.1046-.89543-2-2-2h-8l-1-2c-.49398-.988-.89543-2-2-2z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -1020.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_font.svg b/editor/icons/icon_font.svg
deleted file mode 100644
index 4b71b59d2e..0000000000
--- a/editor/icons/icon_font.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m1 1037.4h14v2h-14z"/><path d="m7 1037.4h2v14h-2z"/><path d="m5 1050.4h6v1h-6z"/><path d="m1037.4-2h4v1h-4z" transform="rotate(90)"/><path d="m1037.4-15h4v1h-4z" transform="rotate(90)"/><path d="m2 3v2a2 2 0 0 1 2-2z" transform="translate(0 1036.4)"/><path d="m12 3a2 2 0 0 1 2 2v-2z" transform="translate(0 1036.4)"/><path d="m5 1050.4a2 2 0 0 0 2-2v2z"/><path d="m11 1050.4a2 2 0 0 1 -2-2v2z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_forward.svg b/editor/icons/icon_forward.svg
deleted file mode 100644
index aecd4b362c..0000000000
--- a/editor/icons/icon_forward.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 8 16" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m2 1038.4 4 6-4 6" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_g_i_probe.svg b/editor/icons/icon_g_i_probe.svg
deleted file mode 100644
index 5a5bfd3c5a..0000000000
--- a/editor/icons/icon_g_i_probe.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h4v-2h-3v-10h9v-2zm9 3a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.459v.54102c0 .55401.44599 1 1 1h2c.55401 0 1-.44599 1-1v-.54102a4 4 0 0 0 2-3.459 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-1 8v1h2v-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_g_i_probe_data.svg b/editor/icons/icon_g_i_probe_data.svg
deleted file mode 100644
index d4765be30f..0000000000
--- a/editor/icons/icon_g_i_probe_data.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h4v-2h-3v-10h9v-2zm2 3v2h2v-2zm7 0a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.459v.54102c0 .55401.44599 1 1 1h2c.55401 0 1-.44599 1-1v-.54102a4 4 0 0 0 2-3.459 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-7 1v2h2v-2zm0 3v2h2v-2zm6 4v1h2v-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_generic_6_d_o_f_joint.svg b/editor/icons/icon_generic_6_d_o_f_joint.svg
deleted file mode 100644
index 30d892e7a1..0000000000
--- a/editor/icons/icon_generic_6_d_o_f_joint.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v4.8828l-3.5527-1.7773a1 1 0 0 0 -.48438-.10352 1 1 0 0 0 -.85742.55078 1 1 0 0 0 .44727 1.3418l3.2109 1.6055-3.2109 1.6055a1 1 0 0 0 -.44727 1.3418 1 1 0 0 0 1.3418.44726l3.5527-1.7773v3.8828a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-3.8828l3.5527 1.7773a1 1 0 0 0 1.3418-.44726 1 1 0 0 0 -.44726-1.3418l-3.2109-1.6055 3.2109-1.6055a1 1 0 0 0 .44726-1.3418 1 1 0 0 0 -.88672-.55273 1 1 0 0 0 -.45508.10547l-3.5527 1.7773v-4.8828a1 1 0 0 0 -1-1z" fill="#fc9c9c" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_baked_lightmap.svg b/editor/icons/icon_gizmo_baked_lightmap.svg
deleted file mode 100644
index 9568f7ff25..0000000000
--- a/editor/icons/icon_gizmo_baked_lightmap.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m18 8c-2.209.00022-3.9998 1.791-4 4l.01563 20h-6.0156c-2.209.00022-3.9998 1.791-4 4v71.076c0 9.3065 7.6174 16.924 16.924 16.924h61.076c2.209-.0002 3.9998-1.791 4-4v-12c-.000221-2.209-1.791-3.9998-4-4h-58v-40h20v12c.000221 2.209 1.791 3.9998 4 4h32c2.209-.0002 3.9998-1.791 4-4v-12h20v4c.002.72576.20093 1.4374.57617 2.0586-.19584-.006-.37901-.058594-.57617-.058594-10.998 0-20 9.0016-20 20-.000004 0-.000004.0098 0 .0098.0088 6.2734 3.0833 12.01 8 15.756v2.2383c0 2.8834 1.66 5.3456 4 6.75v5.2461c.000221 2.209 1.791 3.9998 4 4h8c2.209-.0002 3.9998-1.791 4-4v-5.248c2.3405-1.4043 4-3.8682 4-6.752v-2.2344c4.9179-3.7475 7.9931-9.4866 8-15.762 0-7.935-4.7186-14.774-11.459-18h7.459c2.209-.00022 3.9998-1.791 4-4v-32c-.00022-2.209-1.791-3.9998-4-4l-6-.003906v-19.996c-.00022-2.209-1.791-3.9998-4-4zm8 38c1.1519 0 2 .84806 2 2 .000003 1.1519-.84806 2-2 2s-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm25 0c1.1519 0 2 .84806 2 2 .000003 1.1519-.84806 2-2 2s-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm26 0c1.1519 0 2 .84806 2 2 .000003 1.1519-.84806 2-2 2s-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm25 0c1.1519 0 2 .84806 2 2s-.84806 2-2 2-2-.84806-2-2c-.000003-1.1519.84806-2 2-2zm2 38c3.3611 0 6 2.6388 6 6 0 3.361-2.639 6-6 6s-6-2.639-6-6c0-3.3612 2.6389-6 6-6z" fill-opacity=".29412"/><path d="m18 12v16h92v-16zm-10 24v71.076c0 7.1594 5.7644 12.924 12.924 12.924h61.076v-12h-62v-48h88v8h12v-32zm18 6c3.3137-.00001 6 2.6863 6 6 .000009 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm25 0c3.3137-.00001 6 2.6863 6 6 .000009 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm26 0c3.3137-.00001 6 2.6863 6 6 .000009 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm25 0c3.3137-.00001 6 2.6863 6 6 .00001 3.3137-2.6863 6-6 6-3.3137.00001-6-2.6863-6-6-.000009-3.3137 2.6863-6 6-6zm-54 26v8h32v-8zm56 6c-8.8365 0-16 7.1634-16 16 .008 5.7082 3.0565 10.98 8 13.834v4.166c0 2.216 1.784 4 4 4h8c2.216 0 4-1.784 4-4v-4.1602c4.945-2.855 7.9937-8.1299 8-13.84 0-8.8366-7.1635-16-16-16zm0 6c5.5228 0 10 4.4771 10 10 0 5.5228-4.4772 10-10 10s-10-4.4772-10-10c0-5.5229 4.4772-10 10-10zm-4 36v4h8v-4z" fill="#f7f5cf"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_c_p_u_particles.svg b/editor/icons/icon_gizmo_c_p_u_particles.svg
deleted file mode 100644
index d4e86d9c42..0000000000
--- a/editor/icons/icon_gizmo_c_p_u_particles.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m35.503779 1.2819066c-3.570424 0-6.435164 2.9483368-6.435164 6.6019028v4.3900146c0 .889114.169457 1.726301.478513 2.49893h-10.081759c-3.570424 0-6.435167 2.931453-6.435167 6.585021v7.969562c-.341543-.0568-.648813-.202614-1.006525-.202614h-4.2901096c-3.5704232 0-6.451665 2.948338-6.451665 6.601904v3.224972c0 3.653568 2.8812418 6.585016 6.451665 6.585016h4.2901096c.358169 0 .664563-.14568 1.006525-.202618v38.497043c-.341543-.05706-.648814-.202616-1.006525-.202616h-4.2901096c-3.5704232 0-6.451665 2.948332-6.451665 6.601908v3.224971c0 3.653575 2.8812418 6.585017 6.451665 6.585017h4.2901096c.358169 0 .664563-.145692 1.006525-.202612v9.725542c0 3.6536 2.864743 6.60193 6.435167 6.60193h9.603246v3.951c0 3.65357 2.86474 6.60192 6.435164 6.60192h3.15158c3.57042 0 6.451663-2.94836 6.451663-6.60192v-3.95104h37.224955v3.951c0 3.65358 2.86474 6.60193 6.435166 6.60193h3.151583c3.570418 0 6.451653-2.94836 6.451653-6.60193v-3.951h10.725281c3.57043 0 6.45166-2.94833 6.45166-6.60191v-9.607372c.14985.0105.27643.0846.42899.0846h4.29014c3.5704 0 6.45165-2.931432 6.45165-6.585011v-3.224992c0-3.653565-2.88125-6.601906-6.45165-6.601906h-4.29014c-.15231 0-.27938.07348-.42899.08472v-38.261071c.14985.01042.27643.08445.42899.08445h4.29014c3.5704 0 6.45165-2.931451 6.45165-6.585023v-3.224986c0-3.653566-2.88125-6.601906-6.45165-6.601906h-4.29014c-.15231 0-.27938.07392-.42899.08446v-7.851429c0-3.653567-2.88123-6.585019-6.45166-6.585021h-11.220281c.309043-.772641.494982-1.609791.494982-2.498929v-4.3900086c0-3.6535651-2.881246-6.601903-6.451662-6.601903h-3.15158c-3.570428 0-6.435167 2.9483379-6.435167 6.601903v4.3900146c0 .889115.16948 1.726301.478507 2.49893h-38.198448c.309083-.772642.495011-1.609792.495011-2.49893v-4.3900146c0-3.6535651-2.881243-6.601903-6.451663-6.601903z" fill="#f7f5cf" stroke="#b4b4b4" stroke-width="2.563805"/><g fill="#b4b4b4" stroke-width="8.546018"><path d="m62.861474 21.661698a27.707285 31.502779 0 0 1 27.143197 25.411422 18.471523 18.901669 0 0 1 15.955909 18.691329 18.471523 18.901669 0 0 1 -18.480472 18.893947h-49.25376a18.471523 18.901669 0 0 1 -18.463973-18.893947 18.471523 18.901669 0 0 1 15.922908-18.708215 27.707285 31.502779 0 0 1 27.176191-25.394536z"/><path d="m38.226348 90.956369a6.1571744 6.3005562 0 0 1 6.154657 6.297979 6.1571744 6.3005562 0 0 1 -6.154657 6.314882 6.1571744 6.3005562 0 0 1 -6.154657-6.314882 6.1571744 6.3005562 0 0 1 6.154657-6.297979z"/><path d="m87.480108 90.956369a6.1571744 6.3005562 0 0 1 6.171159 6.297979 6.1571744 6.3005562 0 0 1 -6.171159 6.314882 6.1571744 6.3005562 0 0 1 -6.154656-6.314882 6.1571744 6.3005562 0 0 1 6.154656-6.297979z"/><path d="m62.861474 97.254348a6.1571744 6.3005562 0 0 1 6.154662 6.314882 6.1571744 6.3005562 0 0 1 -6.154662 6.29797 6.1571744 6.3005562 0 0 1 -6.154651-6.29797 6.1571744 6.3005562 0 0 1 6.154651-6.314882z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_camera.svg b/editor/icons/icon_gizmo_camera.svg
deleted file mode 100644
index f28efb813e..0000000000
--- a/editor/icons/icon_gizmo_camera.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -924.36)"><path d="m76 16a28 28 0 0 0 -26.631 19.4 28 28 0 0 0 -13.369-3.4004 28 28 0 0 0 -28 28 28 28 0 0 0 16 25.26v14.74c0 6.648 5.352 12 12 12h48c6.648 0 12-5.352 12-12l24 16v-64l-24 16v-4.4434a28 28 0 0 0 8-19.557 28 28 0 0 0 -28-28z" fill-opacity=".29412" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2" transform="translate(0 924.36)"/><path d="m76 944.36a24 24 0 0 0 -23.906 22.219 24 24 0 0 0 -16.094-6.2192 24 24 0 0 0 -24 24 24 24 0 0 0 16 22.594v17.406c0 4.432 3.5679 8 8 8h48c4.4321 0 8-3.568 8-8v-8l24 16v-48l-24 16v-14.156a24 24 0 0 0 8-17.844 24 24 0 0 0 -24-24z" fill="#f7f5cf"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_directional_light.svg b/editor/icons/icon_gizmo_directional_light.svg
deleted file mode 100644
index dc2d6bf82d..0000000000
--- a/editor/icons/icon_gizmo_directional_light.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m64 4c-4.432 0-8 3.568-8 8v16c0 4.432 3.568 8 8 8s8-3.568 8-8v-16c0-4.432-3.568-8-8-8zm-36.77 15.223c-2.045 0-4.0893.78461-5.6562 2.3516-3.1339 3.1339-3.1339 8.1786 0 11.312l11.312 11.314c3.1339 3.1339 8.1806 3.1339 11.314 0s3.1339-8.1806 0-11.314l-11.314-11.312c-1.5669-1.5669-3.6113-2.3516-5.6562-2.3516zm73.539 0c-2.045 0-4.0893.78461-5.6562 2.3516l-11.314 11.312c-3.1339 3.1339-3.1339 8.1806 0 11.314s8.1806 3.1339 11.314 0l11.312-11.314c3.1339-3.1339 3.1339-8.1786 0-11.312-1.567-1.5669-3.6113-2.3516-5.6562-2.3516zm-36.77 20.777a24 24 0 0 0 -24 24 24 24 0 0 0 24 24 24 24 0 0 0 24-24 24 24 0 0 0 -24-24zm-52 16c-4.432 0-8 3.568-8 8s3.568 8 8 8h16c4.432 0 8-3.568 8-8s-3.568-8-8-8zm88 0c-4.432 0-8 3.568-8 8s3.568 8 8 8h16c4.432 0 8-3.568 8-8s-3.568-8-8-8zm-61.455 25.449c-2.045 0-4.0913.78266-5.6582 2.3496l-11.312 11.314c-3.1339 3.1339-3.1339 8.1786 0 11.312 3.1339 3.1339 8.1786 3.1339 11.312 0l11.314-11.312c3.1339-3.1339 3.1339-8.1806 0-11.314-1.5669-1.5669-3.6113-2.3496-5.6562-2.3496zm50.91 0c-2.045 0-4.0893.78266-5.6562 2.3496-3.1339 3.1339-3.1339 8.1806 0 11.314l11.314 11.312c3.1339 3.1339 8.1786 3.1339 11.312 0s3.1339-8.1786 0-11.312l-11.312-11.314c-1.5669-1.5669-3.6132-2.3496-5.6582-2.3496zm-25.455 10.551c-4.432 0-8 3.568-8 8v16c0 4.432 3.568 8 8 8s8-3.568 8-8v-16c0-4.432-3.568-8-8-8z" fill-opacity=".29412" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2"/><path d="m64 8c-2.216 0-4 1.784-4 4v16c0 2.216 1.784 4 4 4s4-1.784 4-4v-16c0-2.216-1.784-4-4-4zm-36.77 15.227c-1.0225 0-2.0447.39231-2.8281 1.1758-1.5669 1.5669-1.5669 4.0893 0 5.6562l11.312 11.314c1.5669 1.5669 4.0913 1.5669 5.6582 0s1.5669-4.0913 0-5.6582l-11.314-11.312c-.78348-.78348-1.8056-1.1758-2.8281-1.1758zm73.539 0c-1.0225 0-2.0446.39231-2.8281 1.1758l-11.314 11.312c-1.5669 1.5669-1.5669 4.0913 0 5.6582s4.0913 1.5669 5.6582 0l11.313-11.314c1.5669-1.5669 1.5669-4.0893 0-5.6562-.78348-.78348-1.8056-1.1758-2.8281-1.1758zm-36.77 20.773c-11.046.00001-20 8.9543-20 20 .000007 11.046 8.9543 20 20 20s20-8.9543 20-20c-.000008-11.046-8.9543-20-20-20zm-52 16c-2.216 0-4 1.784-4 4s1.784 4 4 4h16c2.216 0 4-1.784 4-4s-1.784-4-4-4zm88 0c-2.216 0-4 1.784-4 4s1.784 4 4 4h16c2.216 0 4-1.784 4-4s-1.784-4-4-4zm-61.455 25.453c-1.0225 0-2.0466.39035-2.8301 1.1738l-11.312 11.314c-1.5669 1.5669-1.5669 4.0893 0 5.6563 1.5669 1.5669 4.0893 1.5669 5.6562 0l11.314-11.313c1.5669-1.5669 1.5669-4.0913 0-5.6582-.78347-.78347-1.8056-1.1738-2.8281-1.1738zm50.91 0c-1.0225 0-2.0447.39035-2.8281 1.1738-1.5669 1.5669-1.5669 4.0913 0 5.6582l11.314 11.313c1.5669 1.5669 4.0893 1.5669 5.6563 0 1.5669-1.567 1.5669-4.0893 0-5.6563l-11.313-11.314c-.78347-.78347-1.8076-1.1738-2.8301-1.1738zm-25.455 10.547c-2.216 0-4 1.784-4 4v16c0 2.216 1.784 4 4 4s4-1.784 4-4v-16c0-2.216-1.784-4-4-4z" fill="#fefefe"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_g_i_probe.svg b/editor/icons/icon_gizmo_g_i_probe.svg
deleted file mode 100644
index c792dc5a28..0000000000
--- a/editor/icons/icon_gizmo_g_i_probe.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m12 4c-4.4183.0000095-8 3.5817-8 8v104c.0000095 4.4183 3.5817 8 8 8h64v-16h-56v-88h88v7.7676a36 36 0 0 0 -16-3.7676 36 36 0 0 0 -36 36 36 36 0 0 0 16 29.9v8.0996c0 4.8544 3.4253 8.8788 8 9.8008v16.199h24v-16.199c4.5747-.92197 8-4.9464 8-9.8008v-8.0879a36 36 0 0 0 16-29.912 36 36 0 0 0 -19.523-32h15.523v-16c-.00001-4.4183-3.5817-8-8-8h-104zm28.25 17.996c-2.8358-.076599-5.6171 1.3651-7.1406 4.0039-2.216 3.8382-.90854 8.7117 2.9297 10.928l10.393 6c3.8382 2.216 8.7117.91049 10.928-2.9277s.91049-8.7117-2.9277-10.928l-10.393-6c-1.1994-.6925-2.5-1.0414-3.7891-1.0762zm51.75 22.004a16 16 0 0 1 16 16 16 16 0 0 1 -16 16 16 16 0 0 1 -16-16 16 16 0 0 1 16-16zm-60 8c-4.432 0-8 3.568-8 8s3.568 8 8 8h12c4.432 0 8-3.568 8-8s-3.568-8-8-8zm18.221 23.996c-1.289.034818-2.5896.38367-3.7891 1.0762l-10.393 6c-3.8382 2.216-5.1457 7.0895-2.9297 10.928s7.0915 5.1437 10.93 2.9277l10.393-6c3.8382-2.216 5.1437-7.0895 2.9277-10.928-1.5235-2.6388-4.3028-4.0805-7.1387-4.0039z" fill-opacity=".29412"/><path d="m12 8a4.0004 4.0004 0 0 0 -4 4v104a4.0004 4.0004 0 0 0 4 4h60v-8h-56v-96h96v8h8v-12a4.0004 4.0004 0 0 0 -4-4zm27.715 17.951c-1.2324.08615-2.3996.76492-3.0664 1.9199l-.14844.25781c-1.0669 1.848-.43784 4.1948 1.4102 5.2617l10.648 6.1484c1.848 1.0669 4.1948.43784 5.2617-1.4102l.14844-.25781c1.0669-1.848.43784-4.1948-1.4102-5.2617l-10.648-6.1484c-.693-.4001-1.4558-.56146-2.1953-.50977zm52.285 2.0488a32 32 0 0 0 -32 32 32 32 0 0 0 16 27.668v8.332c0 4.432 3.568 8 8 8h16c4.432 0 8-3.568 8-8v-8.3223a32 32 0 0 0 16-27.678 32 32 0 0 0 -32-32zm0 12a20 20 0 0 1 20 20 20 20 0 0 1 -20 20 20 20 0 0 1 -20-20 20 20 0 0 1 20-20zm-60.148 16c-2.1339 0-3.8516 1.7177-3.8516 3.8516v.29688c0 2.1339 1.7177 3.8516 3.8516 3.8516h12.297c2.1339 0 3.8516-1.7177 3.8516-3.8516v-.29688c0-2.1339-1.7177-3.8516-3.8516-3.8516zm18.902 23.951c-.73947-.05169-1.5023.10966-2.1953.50977l-10.648 6.1484c-1.848 1.0669-2.4771 3.4137-1.4102 5.2617l.14844.25781c1.0669 1.848 3.4137 2.4771 5.2617 1.4102l10.648-6.1484c1.848-1.0669 2.4771-3.4137 1.4102-5.2617l-.14844-.25781c-.66684-1.155-1.834-1.8338-3.0664-1.9199zm33.246 32.049v8h16v-8z" fill="#f7f5cf"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_light.svg b/editor/icons/icon_gizmo_light.svg
deleted file mode 100644
index 1e47082a0a..0000000000
--- a/editor/icons/icon_gizmo_light.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m64 2a44 44 0 0 0 -44 44 44 44 0 0 0 24 39.189v5.8105 5 3c0 5.0515 3.3756 9.2769 8 10.578v16.422h24v-16.422c4.6244-1.3012 8-5.5266 8-10.578v-3-5-5.8574a44 44 0 0 0 24-39.143 44 44 0 0 0 -44-44zm0 20a24 24 0 0 1 24 24 24 24 0 0 1 -24 24 24 24 0 0 1 -24-24 24 24 0 0 1 24-24z" fill-opacity=".29412" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="2.2"/><path d="m64 6a40 40 0 0 0 -40 40 40 40 0 0 0 24 36.607v15.393a8 8 0 0 0 8 8h16a8 8 0 0 0 8-8v-15.363a40 40 0 0 0 24-36.637 40 40 0 0 0 -40-40zm0 12a28 28 0 0 1 28 28 28 28 0 0 1 -28 28 28 28 0 0 1 -28-28 28 28 0 0 1 28-28zm-8 96v8h16v-8z" fill="#fefefe"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_listener.svg b/editor/icons/icon_gizmo_listener.svg
deleted file mode 100644
index 9e28c7730f..0000000000
--- a/editor/icons/icon_gizmo_listener.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(2 0 0 2 -16 -1964.76)"><path d="m32 984.36c-12.126.00002-22 9.8729-22 21.999.00011 1.1045.89548 1.9999 2 2h8c1.1045-.0001 1.9999-.8955 2-2 .000223-5.546 4.4536-9.999 10-9.999 5.5464.00001 9.9998 4.453 10 9.999 0 6.5873-1.6032 8.0251-3.8408 9.8897-1.0295.8579-2.3133 1.6111-3.7969 2.6826-.72285.522-1.6649 1.2341-2.5488 2.3496-.98288 1.2402-1.8135 2.99-1.8135 5.0781 0 2.3898-.31658 3.686-.61035 4.3194-.29378.6333-.4706.73-.97754 1.0341-.54947.3297-2.5162.6446-4.4121.6446-.0065.0003-.01302.0006-.01953.001h-3.9805c-1.1045.0001-1.9999.8954-2 2v8c.00011 1.1045.89548 1.9999 2 2h4c.0072-.0003.01432-.0005.02148-.001 1.9052.001 6.3098.1982 10.566-2.3555 4.0103-2.4061 6.6628-7.2724 7.1738-13.592.81224-.548 2.3445-1.497 4.0791-2.9424 4.0025-3.3353 8.1592-9.5405 8.1592-19.108-.000095-12.126-9.8735-21.999-22-21.999zm31.807 4.002c-.38259-.0177-.76221.0749-1.0938.2666l-6.9531 4.0156c-.95754.55332-1.2843 1.7787-.72949 2.7354 1.9364 3.3365 2.9609 7.1229 2.9717 10.98-.0072 3.8597-1.0296 7.6487-2.9648 10.988-.55452.9572-.22681 2.1827.73144 2.7353l6.9453 4.0069c.95656.5517 2.1792.2238 2.7314-.7325 6.0717-10.516 6.0717-23.482 0-33.998-.3406-.59005-.95812-.96615-1.6387-.99805z" fill-opacity=".29412"/><path d="m48 8a40 39.998 0 0 0 -40 39.998h16a24 23.999 0 0 1 24-23.998 24 23.999 0 0 1 24 23.998c0 13.999-4.33 18.859-9.1211 22.852-2.3955 1.9962-5.0363 3.5302-7.8125 5.5352-1.3881 1.0024-2.8661 2.126-4.3047 3.9414-1.4385 1.8152-2.7617 4.6719-2.7617 7.6719 0 10.221-2.5383 12.59-5.1172 14.137-2.5789 1.5472-6.8828 1.8594-10.883 1.8594v.00195h-8v16h8v-.00195c4 0 11.696.31158 19.117-4.1406 7.0602-4.236 12.198-13.279 12.695-26 .1835-.1636.14883-.15489.62109-.49609 1.7238-1.245 5.083-3.2112 8.6875-6.2148 7.209-6.0072 14.879-17.145 14.879-35.145a40 39.998 0 0 0 -40-39.998zm63.426 8-13.906 8.0312a48 47.998 0 0 1 6.4844 23.967 48 47.998 0 0 1 -6.4688 23.984l13.891 8.0137a64 63.997 0 0 0 0-63.996z" fill="#f7f5cf" transform="matrix(.5 0 0 .5 8 982.36)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_particles.svg b/editor/icons/icon_gizmo_particles.svg
deleted file mode 100644
index 1c5d8c5f2d..0000000000
--- a/editor/icons/icon_gizmo_particles.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -924.36)"><path d="m63.998 928.36c-18.429.005-34.029 13.88-38.557 32.926-12.4 3.0077-21.427 14.08-21.441 27.07v.004c0 15.417 12.583 28 28 28h64c15.417 0 28-12.583 28-28v-.004c-.0152-13-9.0549-24.076-21.467-27.074-4.5265-19.033-20.112-32.903-38.529-32.922zm32.002 88c-6.58 0-12 5.42-12 12s5.42 12 12 12 12-5.42 12-12-5.42-12-12-12zm-64 0c-6.58 0-12 5.42-12 12s5.42 12 12 12 12-5.42 12-12-5.42-12-12-12zm32 8c-6.58 0-12 5.42-12 12s5.42 12 12 12 12-5.42 12-12-5.42-12-12-12z" fill-opacity=".29412"/><path d="m64 8a36 40 0 0 0 -35.311 32.256 24 24 0 0 0 -20.689 23.744 24 24 0 0 0 24 24h64a24 24 0 0 0 24-24 24 24 0 0 0 -20.715-23.746 36 40 0 0 0 -35.285-32.254zm-32 88a8 8 0 0 0 -8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0 -8-8zm64 0a8 8 0 0 0 -8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0 -8-8zm-32 8a8 8 0 0 0 -8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0 -8-8z" fill="#f7f5cf" transform="translate(0 924.36)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_reflection_probe.svg b/editor/icons/icon_gizmo_reflection_probe.svg
deleted file mode 100644
index 82136821c7..0000000000
--- a/editor/icons/icon_gizmo_reflection_probe.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -924.36)"><path d="m12 928.36c-4.3705.00044-7.9996 3.6295-8 8v28h16v-20h88v8h16v-16c-.00044-4.3705-3.6295-7.9996-8-8zm76 28c-4.3709 0-8 3.6291-8 8s3.6291 8 8 8h10.035l-34.486 40.236-44.721-44.723-11.312 11.316 50.828 50.828c3.2536 3.2513 8.7374 3.0394 11.73-.4531l37.926-44.244v7.0391c0 4.3709 3.6291 8 8 8s8-3.6291 8-8v-28c-.00044-4.3705-3.6295-7.9996-8-8zm-84 52v32c.000437 4.3705 3.6295 7.9996 8 8h104c4.3705-.0004 7.9996-3.6295 8-8v-32h-16v24h-88v-24z" fill-opacity=".29412"/><path d="m12 932.36c-2.209.00022-3.9998 1.791-4 4v24h8v-20h96v8h8v-12c-.00022-2.209-1.791-3.9998-4-4zm76 28c-2.2091 0-4 1.7909-4 4s1.7909 4 4 4h18.732l-42.957 50.119-44.947-44.947-5.6562 5.6582 48 48c1.648 1.6468 4.3491 1.5425 5.8652-.2266l44.963-52.457v17.854c0 2.2091 1.7909 4 4 4s4-1.7909 4-4v-28c-.00022-2.209-1.791-3.9998-4-4zm-80 52v28c.0002209 2.2091 1.791 3.9998 4 4h104c2.209-.0002 3.9998-1.7909 4-4v-28h-8v24h-96v-24z" fill="#f7f5cf"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_spatial_sample_player.svg b/editor/icons/icon_gizmo_spatial_sample_player.svg
deleted file mode 100644
index ee471124dc..0000000000
--- a/editor/icons/icon_gizmo_spatial_sample_player.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -924.36)"><path d="m63.766 932.37c-2.0369.0594-3.9779.89602-5.4199 2.3359l-.002.002-29.656 29.658h-12.688c-4.3705.00044-7.9996 3.6295-8 8v32c.0004372 4.3705 3.6295 7.9995 8 8h12.688l29.656 29.656c2.4 2.3983 5.9795 2.8662 8.7168 1.7324 2.7373-1.1337 4.9381-3.9958 4.9395-7.3886v-96.004c-.003-4.4555-3.779-8.1211-8.2324-7.9922zm48.234 3.9941c-4.3709 0-8 3.6291-8 8v88c0 4.3709 3.6291 8 8 8s8-3.6291 8-8v-88c0-4.3709-3.6291-8-8-8zm-24 24c-4.3709 0-8 3.6291-8 8v40c0 4.3709 3.6291 8 8 8s8-3.6291 8-8v-40c0-4.3709-3.6291-8-8-8z" fill-opacity=".29412"/><path d="m63.883 12.004c-1.0195.0295-1.9892.4473-2.7109 1.168l-30.828 30.83h-14.344c-2.209.000221-3.9998 1.791-4 4v32c.000221 2.209 1.791 3.9998 4 4h14.344l30.828 30.828c2.52 2.5182 6.8267.73442 6.8281-2.8281v-96.002c-.0015-2.2541-1.8641-4.0619-4.1172-3.9961zm48.117 3.9961a4 4 0 0 0 -4 4v88a4 4 0 0 0 4 4 4 4 0 0 0 4-4v-88a4 4 0 0 0 -4-4zm-24 24a4 4 0 0 0 -4 4v40a4 4 0 0 0 4 4 4 4 0 0 0 4-4v-40a4 4 0 0 0 -4-4z" fill="#f7f5cf" transform="translate(0 924.36)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_spatial_stream_player.svg b/editor/icons/icon_gizmo_spatial_stream_player.svg
deleted file mode 100644
index 473fd2c2cd..0000000000
--- a/editor/icons/icon_gizmo_spatial_stream_player.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m99.645 6.0059c-.9956.029687-1.9837.18322-2.9414.45703l-56 16c-5.1336 1.4668-8.7021 6.198-8.7031 11.537v44.203c-11.16 1.0331-20 10.379-20 21.797.000011 12.103 9.8971 22 22 22 12.103-.00001 22-9.8971 22-22v-56.947l32-9.1426v28.293c-11.16 1.0331-20 10.379-20 21.797.000011 12.103 9.8971 22 22 22 12.103-.00001 22-9.8971 22-22v-66c-.00104-6.7137-5.6428-12.192-12.354-11.994z" fill-opacity=".29412"/><path d="m99.764 10.004a8.0008 8.0008 0 0 0 -1.9609.30469l-56 16a8.0008 8.0008 0 0 0 -5.8027 7.6914v48.121a18 18 0 0 0 -2-.12109 18 18 0 0 0 -18 18 18 18 0 0 0 18 18 18 18 0 0 0 18-18v-59.965l40-11.428v37.514a18 18 0 0 0 -2-.12109 18 18 0 0 0 -18 18 18 18 0 0 0 18 18 18 18 0 0 0 18-18v-66a8.0008 8.0008 0 0 0 -8.2363-7.9961z" fill="#f7f5cf"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gizmo_spot_light.svg b/editor/icons/icon_gizmo_spot_light.svg
deleted file mode 100644
index 23a8364679..0000000000
--- a/editor/icons/icon_gizmo_spot_light.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="128" viewBox="0 0 128 128" width="128" xmlns="http://www.w3.org/2000/svg"><path d="m52 4c-6.5788 0-12 5.4212-12 12v26.625c-12.263 7.2822-19.978 19.75-20 33.369l-.005859 4.0059h28.578c1.7994 6.8632 8.0265 12 15.428 12s13.628-5.1368 15.428-12h28.576l-.00391-4.0039c-.01526-13.625-7.7323-26.099-20-33.385v-26.611c0-6.5788-5.4212-12-12-12zm-11.689 78.016c-1.536-.10738-3.1419.23676-4.5586 1.0547l-10.393 6c-3.7786 2.1816-5.1117 7.1503-2.9297 10.93 2.1816 3.7786 7.1503 5.1117 10.93 2.9297l10.393-6c3.7796-2.1822 5.1087-7.1521 2.9277-10.93-1.3629-2.3605-3.8057-3.8052-6.3691-3.9844zm47.379 0c-2.5634.1792-5.0063 1.6238-6.3691 3.9844-2.181 3.7776-.85187 8.7475 2.9277 10.93l10.393 6c3.7794 2.182 8.7481.8489 10.93-2.9297 2.182-3.7794.84891-8.7481-2.9297-10.93l-10.393-6c-1.4167-.81792-3.0225-1.1621-4.5586-1.0547zm-23.689 13.984c-4.3628 0-8 3.6372-8 8v12c0 4.3628 3.6372 8 8 8s8-3.6372 8-8v-12c0-4.3628-3.6372-8-8-8z" fill-opacity=".29412"/><path d="m52 8c-4.432 0-8 3.568-8 8v12 16.875a40 36 0 0 0 -20 31.125h28a12 12 0 0 0 12 12 12 12 0 0 0 12-12h28a40 36 0 0 0 -20-31.141v-20.859-8c0-4.432-3.568-8-8-8zm-11.969 78.006c-.76793-.053681-1.5596.1138-2.2793.5293l-10.393 6c-1.9191 1.108-2.5728 3.5457-1.4648 5.4648s3.5457 2.5728 5.4648 1.4648l10.393-6c1.9191-1.108 2.5709-3.5457 1.4629-5.4648-.6925-1.1994-1.9037-1.9047-3.1836-1.9941zm47.938 0c-1.2799.08947-2.4911.7947-3.1836 1.9941-1.108 1.9191-.45622 4.3568 1.4629 5.4648l10.393 6c1.9191 1.108 4.3568.45427 5.4648-1.4648s.45427-4.3568-1.4648-5.4648l-10.393-6c-.71967-.4155-1.5114-.58298-2.2793-.5293zm-23.969 13.994c-2.216 0-4 1.784-4 4v12c0 2.216 1.784 4 4 4s4-1.784 4-4v-12c0-2.216-1.784-4-4-4z" fill="#fefefe" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.1082"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_godot.svg b/editor/icons/icon_godot.svg
deleted file mode 100644
index 8ca9fdcabd..0000000000
--- a/editor/icons/icon_godot.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width=".32031" transform="matrix(.017241 0 0 .017241 -.82759 -2.7)"><path d="m0 0s-.325 1.994-.515 1.976l-36.182-3.491c-2.879-.278-5.115-2.574-5.317-5.459l-.994-14.247-27.992-1.997-1.904 12.912c-.424 2.872-2.932 5.037-5.835 5.037h-38.188c-2.902 0-5.41-2.165-5.834-5.037l-1.905-12.912-27.992 1.997-.994 14.247c-.202 2.886-2.438 5.182-5.317 5.46l-36.2 3.49c-.187.018-.324-1.978-.511-1.978l-.049-7.83 30.658-4.944 1.004-14.374c.203-2.91 2.551-5.263 5.463-5.472l38.551-2.75c.146-.01.29-.016.434-.016 2.897 0 5.401 2.166 5.825 5.038l1.959 13.286h28.005l1.959-13.286c.423-2.871 2.93-5.037 5.831-5.037.142 0 .284.005.423.015l38.556 2.75c2.911.209 5.26 2.562 5.463 5.472l1.003 14.374 30.645 4.966z" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 919.24 771.67)"/><path d="m0 0v-59.041c.108-.001.216-.005.323-.015l36.196-3.49c1.896-.183 3.382-1.709 3.514-3.609l1.116-15.978 31.574-2.253 2.175 14.747c.282 1.912 1.922 3.329 3.856 3.329h38.188c1.933 0 3.573-1.417 3.855-3.329l2.175-14.747 31.575 2.253 1.115 15.978c.133 1.9 1.618 3.425 3.514 3.609l36.182 3.49c.107.01.214.014.322.015v4.711l.015.005v54.325h.134c4.795 6.12 9.232 12.569 13.487 19.449-5.651 9.62-12.575 18.217-19.976 26.182-6.864-3.455-13.531-7.369-19.828-11.534-3.151 3.132-6.7 5.694-10.186 8.372-3.425 2.751-7.285 4.768-10.946 7.118 1.09 8.117 1.629 16.108 1.846 24.448-9.446 4.754-19.519 7.906-29.708 10.17-4.068-6.837-7.788-14.241-11.028-21.479-3.842.642-7.702.88-11.567.926v.006c-.027 0-.052-.006-.075-.006-.024 0-.049.006-.073.006v-.006c-3.872-.046-7.729-.284-11.572-.926-3.238 7.238-6.956 14.642-11.03 21.479-10.184-2.264-20.258-5.416-29.703-10.17.216-8.34.755-16.331 1.848-24.448-3.668-2.35-7.523-4.367-10.949-7.118-3.481-2.678-7.036-5.24-10.188-8.372-6.297 4.165-12.962 8.079-19.828 11.534-7.401-7.965-14.321-16.562-19.974-26.182 4.253-6.88 8.693-13.329 13.487-19.449z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 104.7 525.91)"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916 0-3.569 1.406-3.852 3.33l-2.211 14.994h-31.459l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616l-1.121 16.063-32.547 3.138c.015-3.498.06-7.33.06-8.093 0-34.374 43.605-50.896 97.781-51.086h.133c54.176.19 97.766 16.712 97.766 51.086 0 .777.047 4.593.063 8.093z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 784.07 817.24)"/><path d="m0 0c0-12.052-9.765-21.815-21.813-21.815-12.042 0-21.81 9.763-21.81 21.815 0 12.044 9.768 21.802 21.81 21.802 12.048 0 21.813-9.758 21.813-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 389.21 625.67)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996 0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479c8 0 14.479-6.485 14.479-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 367.37 631.06)"/><path d="m0 0c-3.878 0-7.021 2.858-7.021 6.381v20.081c0 3.52 3.143 6.381 7.021 6.381s7.028-2.861 7.028-6.381v-20.081c0-3.523-3.15-6.381-7.028-6.381" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 511.99 724.74)"/><path d="m0 0c0-12.052 9.765-21.815 21.815-21.815 12.041 0 21.808 9.763 21.808 21.815 0 12.044-9.767 21.802-21.808 21.802-12.05 0-21.815-9.758-21.815-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 634.79 625.67)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473 8.002 0 14.479 6.479 14.479 14.473s-6.477 14.479-14.479 14.479c-7.994 0-14.471-6.485-14.471-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 656.64 631.06)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_godot_docs.svg b/editor/icons/icon_godot_docs.svg
deleted file mode 100644
index e38885aed9..0000000000
--- a/editor/icons/icon_godot_docs.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width=".32031" transform="matrix(.017241 0 0 .017241 -.82759 -2.7)"><path d="m0 0s-.325 1.994-.515 1.976l-36.182-3.491c-2.879-.278-5.115-2.574-5.317-5.459l-.994-14.247-27.992-1.997-1.904 12.912c-.424 2.872-2.932 5.037-5.835 5.037h-38.188c-2.902 0-5.41-2.165-5.834-5.037l-1.905-12.912-27.992 1.997-.994 14.247c-.202 2.886-2.438 5.182-5.317 5.46l-36.2 3.49c-.187.018-.324-1.978-.511-1.978l-.049-7.83 30.658-4.944 1.004-14.374c.203-2.91 2.551-5.263 5.463-5.472l38.551-2.75c.146-.01.29-.016.434-.016 2.897 0 5.401 2.166 5.825 5.038l1.959 13.286h28.005l1.959-13.286c.423-2.871 2.93-5.037 5.831-5.037.142 0 .284.005.423.015l38.556 2.75c2.911.209 5.26 2.562 5.463 5.472l1.003 14.374 30.645 4.966z" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 919.24 771.67)"/><path d="m0 0v-59.041c.108-.001.216-.005.323-.015l36.196-3.49c1.896-.183 3.382-1.709 3.514-3.609l1.116-15.978 31.574-2.253 2.175 14.747c.282 1.912 1.922 3.329 3.856 3.329h38.188c1.933 0 3.573-1.417 3.855-3.329l2.175-14.747 31.575 2.253 1.115 15.978c.133 1.9 1.618 3.425 3.514 3.609l36.182 3.49c.107.01.214.014.322.015v4.711l.015.005v54.325h.134c4.795 6.12 9.232 12.569 13.487 19.449-5.651 9.62-12.575 18.217-19.976 26.182-6.864-3.455-13.531-7.369-19.828-11.534-3.151 3.132-6.7 5.694-10.186 8.372-3.425 2.751-7.285 4.768-10.946 7.118 1.09 8.117 1.629 16.108 1.846 24.448-9.446 4.754-19.519 7.906-29.708 10.17-4.068-6.837-7.788-14.241-11.028-21.479-3.842.642-7.702.88-11.567.926v.006c-.027 0-.052-.006-.075-.006-.024 0-.049.006-.073.006v-.006c-3.872-.046-7.729-.284-11.572-.926-3.238 7.238-6.956 14.642-11.03 21.479-10.184-2.264-20.258-5.416-29.703-10.17.216-8.34.755-16.331 1.848-24.448-3.668-2.35-7.523-4.367-10.949-7.118-3.481-2.678-7.036-5.24-10.188-8.372-6.297 4.165-12.962 8.079-19.828 11.534-7.401-7.965-14.321-16.562-19.974-26.182 4.253-6.88 8.693-13.329 13.487-19.449z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 104.7 525.91)"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916 0-3.569 1.406-3.852 3.33l-2.211 14.994h-31.459l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616l-1.121 16.063-32.547 3.138c.015-3.498.06-7.33.06-8.093 0-34.374 43.605-50.896 97.781-51.086h.133c54.176.19 97.766 16.712 97.766 51.086 0 .777.047 4.593.063 8.093z" fill="#478cbf" transform="matrix(4.1626 0 0 -4.1626 784.07 817.24)"/><path d="m0 0c0-12.052-9.765-21.815-21.813-21.815-12.042 0-21.81 9.763-21.81 21.815 0 12.044 9.768 21.802 21.81 21.802 12.048 0 21.813-9.758 21.813-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 389.21 625.67)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996 0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479c8 0 14.479-6.485 14.479-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 367.37 631.06)"/><path d="m0 0c-3.878 0-7.021 2.858-7.021 6.381v20.081c0 3.52 3.143 6.381 7.021 6.381s7.028-2.861 7.028-6.381v-20.081c0-3.523-3.15-6.381-7.028-6.381" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 511.99 724.74)"/><path d="m0 0c0-12.052 9.765-21.815 21.815-21.815 12.041 0 21.808 9.763 21.808 21.815 0 12.044-9.767 21.802-21.808 21.802-12.05 0-21.815-9.758-21.815-21.802" fill="#fff" transform="matrix(4.1626 0 0 -4.1626 634.79 625.67)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473 8.002 0 14.479 6.479 14.479 14.473s-6.477 14.479-14.479 14.479c-7.994 0-14.471-6.485-14.471-14.479" fill="#414042" transform="matrix(4.1626 0 0 -4.1626 656.64 631.06)"/></g><path d="m4 5a3 3 0 0 0 -3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3h2a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0 -3-3 3 3 0 0 0 -2.8262 2h-2.3496a3 3 0 0 0 -2.8242-2zm0 1a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm8 0a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gradient.svg b/editor/icons/icon_gradient.svg
deleted file mode 100644
index b67a9e6f8a..0000000000
--- a/editor/icons/icon_gradient.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="10" x2="10" y1="1" y2="15"><stop offset="0" stop-color="#e0e0e0"/><stop offset="1" stop-color="#e0e0e0" stop-opacity="0"/></linearGradient><path d="m2 1c-.55228 0-1 .44772-1 1v12c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-12c0-.55228-.44772-1-1-1z" fill="url(#a)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gradient_texture.svg b/editor/icons/icon_gradient_texture.svg
deleted file mode 100644
index 1388c141bd..0000000000
--- a/editor/icons/icon_gradient_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="10" x2="10" y1="1" y2="15"><stop offset="0" stop-color="#e0e0e0"/><stop offset="1" stop-color="#e0e0e0" stop-opacity="0"/></linearGradient><g transform="translate(0 -1036.4)"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm1 2h10v8h-10z" fill="url(#a)" transform="translate(0 1036.4)"/><g fill="#e0e0e0"><path d="m6 1043.4h2v1h-2z"/><path d="m6 1044.4h2v2h-2z"/><path d="m4 1045.4h2v1h-2z"/><path d="m8 1044.4h2v2h-2z"/><path d="m10 1044.4h2v2h-2z"/><path d="m8 1042.4h3v2h-3z"/><path d="m9 1041.4h1v1h-1z"/><path d="m5 1044.4h1v1h-1z"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_graph_edit.svg b/editor/icons/icon_graph_edit.svg
deleted file mode 100644
index 7ab7245260..0000000000
--- a/editor/icons/icon_graph_edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-5.8555l4.793 4.793 1.4141-1.4141-4.793-4.793h5.8574a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm10.656 6.9297-.70703.70703 1.4141 1.4141.70703-.70703zm-1.4141 1.4141-3.8887 3.8887-.35352 1.7676 1.7676-.35352 3.8887-3.8887-1.4141-1.4141z" fill="#a5efac" transform="translate(0 1036.4)"/><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_graph_node.svg b/editor/icons/icon_graph_node.svg
deleted file mode 100644
index c8d4fda910..0000000000
--- a/editor/icons/icon_graph_node.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-5.8555l4.0859 4.0859 1.4141-1.4141-4.0859-4.0859h5.8574a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm9.5 9a2.5 2.5 0 0 0 -2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0 -2.5-2.5z" fill="#a5efac" transform="translate(0 1036.4)"/><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_grid.svg b/editor/icons/icon_grid.svg
deleted file mode 100644
index 869bc649fe..0000000000
--- a/editor/icons/icon_grid.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 10 2h2 12v-2-12h-12zm2 2h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_grid_container.svg b/editor/icons/icon_grid_container.svg
deleted file mode 100644
index 9fffd8b342..0000000000
--- a/editor/icons/icon_grid_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_groove_joint_2d.svg b/editor/icons/icon_groove_joint_2d.svg
deleted file mode 100644
index a2c7b741ad..0000000000
--- a/editor/icons/icon_groove_joint_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1037.4h-5v6h-5v2h5v6h5zm-7 0h-7v14h7v-4h-5v-6h5z" fill="#a5b7f3" fill-opacity=".98824" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_group.svg b/editor/icons/icon_group.svg
deleted file mode 100644
index 7e0b2f3675..0000000000
--- a/editor/icons/icon_group.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v8h8v-6h6v-8zm2 2h4v4h-4z" fill="#e0e0e0" fill-opacity=".39216"/><path d="m1 1v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm12 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm-12 12v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0zm12 0v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_group_viewport.svg b/editor/icons/icon_group_viewport.svg
deleted file mode 100644
index 768c87e18d..0000000000
--- a/editor/icons/icon_group_viewport.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v4h4v-4zm6 0v6h-6v10h10v-6h6v-10zm4 4h2v2h-2zm2 8v4h4v-4z" fill-opacity=".39216" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width=".5"/><path d="m7 1v6h-6v8h8v-6h6v-8zm2 2h4v4h-4z" fill="#e0e0e0"/><path d="m1 1v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm12 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm-12 12v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0zm12 0v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_groups.svg b/editor/icons/icon_groups.svg
deleted file mode 100644
index 5c8bd73f0f..0000000000
--- a/editor/icons/icon_groups.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h12a1.0001 1.0001 0 0 0 1-1v-12a1.0001 1.0001 0 0 0 -1-1zm1 2h10v10h-10zm5 2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0 -3-3z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gui_close.svg b/editor/icons/icon_gui_close.svg
deleted file mode 100644
index 3596061877..0000000000
--- a/editor/icons/icon_gui_close.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" fill="#fff" fill-opacity=".89804"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gui_close_customizable.svg b/editor/icons/icon_gui_close_customizable.svg
deleted file mode 100644
index 3596061877..0000000000
--- a/editor/icons/icon_gui_close_customizable.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" fill="#fff" fill-opacity=".89804"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gui_graph_node_port.svg b/editor/icons/icon_gui_graph_node_port.svg
deleted file mode 100644
index 2023a30ead..0000000000
--- a/editor/icons/icon_gui_graph_node_port.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill="#fff" fill-rule="evenodd" r="5"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_gui_resizer.svg b/editor/icons/icon_gui_resizer.svg
deleted file mode 100644
index 545a1c9612..0000000000
--- a/editor/icons/icon_gui_resizer.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 3c-.55228 0-1 .44772-1 1v6h-6c-.55228 0-1 .44772-1 1s.44772 1 1 1h7c.55226-.000055.99994-.44774 1-1v-7c0-.55228-.44772-1-1-1z" fill="#fff" fill-opacity=".58824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_h_box_container.svg b/editor/icons/icon_h_box_container.svg
deleted file mode 100644
index 0ddbaf5a2e..0000000000
--- a/editor/icons/icon_h_box_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h2v10h-2zm4 0h2v10h-2zm4 0h2v10h-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_h_scroll_bar.svg b/editor/icons/icon_h_scroll_bar.svg
deleted file mode 100644
index 039ebdf0c1..0000000000
--- a/editor/icons/icon_h_scroll_bar.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1041.4c0-1.108-.892-2-2-2h-10c-1.108 0-2 .892-2 2v6c0 1.108.892 2 2 2h10c1.108 0 2-.892 2-2zm-1 2.9883a1.0001 1.0001 0 0 1 -.168.5664l-2 3a1.0001 1.0001 0 1 1 -1.664-1.1094l1.6289-2.4453-1.6289-2.4453a1.0001 1.0001 0 1 1 1.664-1.1094l2 3a1.0001 1.0001 0 0 1 .168.543zm-7.9922-2.9981a1.0001 1.0001 0 0 1 -.1758.5645l-1.6308 2.4453 1.6308 2.4453a1.0001 1.0001 0 1 1 -1.664 1.1094l-2-3a1.0001 1.0001 0 0 1 0-1.1094l2-3a1.0001 1.0001 0 0 1 1.8398.5449z" fill="#a5efac" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_h_separator.svg b/editor/icons/icon_h_separator.svg
deleted file mode 100644
index 762992acb8..0000000000
--- a/editor/icons/icon_h_separator.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 2v3h6v-3zm-4 5v2h14v-2zm4 4v3h6v-3z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_h_slider.svg b/editor/icons/icon_h_slider.svg
deleted file mode 100644
index 20fbf0d00b..0000000000
--- a/editor/icons/icon_h_slider.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 3c-.55228 0-1 .44772-1 1v2c0 .55228.44772 1 1 1s1-.44772 1-1v-2c0-.55228-.44772-1-1-1zm12 0c-.55228 0-1 .44772-1 1v2c0 .55228.44772 1 1 1s1-.44772 1-1v-2c0-.55228-.44772-1-1-1zm-6 1c-.55228 0-1 .44772-1 1s.44772 1 1 1 1-.44772 1-1-.44772-1-1-1zm5 5c-1.1046 0-2 .89543-2 2 0 1.1046.89543 2 2 2 1.0099-.000337 1.8611-.75351 1.9844-1.7559.04003-.16104.03936-.32952-.002-.49024-.12404-1.0008-.97388-1.7527-1.9824-1.7539zm-11 1c-1.3523-.019125-1.3523 2.0191 0 2h7.1309c-.085635-.32648-.1296-.66248-.13086-1 .00189-.3376.046518-.67361.13281-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_h_split_container.svg b/editor/icons/icon_h_split_container.svg
deleted file mode 100644
index ae7c05ee61..0000000000
--- a/editor/icons/icon_h_split_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h4v3l-2 2 2 2v3h-4zm6 0h4v10h-4v-3l2-2-2-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_h_t_t_p_request.svg b/editor/icons/icon_h_t_t_p_request.svg
deleted file mode 100644
index c79af15a43..0000000000
--- a/editor/icons/icon_h_t_t_p_request.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-3 4h2v3h2v-3h2zm7 0v3h-2l3 4 3-4h-2v-3zm-10 9v2 1 2h1v-2h1v2h1v-5h-1v2h-1v-2zm4 0v1h1v4h1v-4h1v-1zm4 0v1h1v4h1v-4h1v-1zm4 0v2 1 2h1v-2h1 1v-1-2h-2zm1 1h1v1h-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_headphones.svg b/editor/icons/icon_headphones.svg
deleted file mode 100644
index 82ef7acb29..0000000000
--- a/editor/icons/icon_headphones.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7v2 3a2 2 0 0 0 2 2h2v-5h-2v-2a5 5 0 0 1 5-5 5 5 0 0 1 5 5v2h-2v3 2h2a2 2 0 0 0 2-2v-3-2a7 7 0 0 0 -7-7z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_height_map_shape.svg b/editor/icons/icon_height_map_shape.svg
deleted file mode 100644
index 2e0bf53565..0000000000
--- a/editor/icons/icon_height_map_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="8" y2="11"><stop offset="0" stop-color="#68b6ff"/><stop offset="1" stop-color="#a2d2ff"/></linearGradient><g transform="translate(0 -1)"><path d="m1 1044.4 7 3 7-3-7-3z" fill="#a2d2ff" fill-rule="evenodd" transform="translate(0 -1033.4)"/><path d="m3 11c1-1 2-2 2-4s1-3 3-3 3 1 3 3 1 3 2 4z" fill="url(#a)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_help.svg b/editor/icons/icon_help.svg
deleted file mode 100644
index d993c95982..0000000000
--- a/editor/icons/icon_help.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5.0293 1c-.99969-.010925-2.0096.31165-3.0293 1v7c2.0172-1.3529 4.0167-1.3136 6 0 1.9833-1.3136 3.9828-1.3529 6 0v-7c-1.0197-.68835-2.0296-1.0109-3.0293-1-.6613.007227-1.3175.1735-1.9707.46289v4.5371h-1v-4c-.98156-.64465-1.971-.98908-2.9707-1zm-5.0293 9v6h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3zm5 3a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0 -3-3 3 3 0 0 0 -3 3zm6 0a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2h-1a3 3 0 0 0 -3 3zm-9-1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" style="fill:#e0e0e0;fill-opacity:.58824;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.32549;stroke-width:2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_help_search.svg b/editor/icons/icon_help_search.svg
deleted file mode 100644
index 4a82ba23c7..0000000000
--- a/editor/icons/icon_help_search.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 0a4 4 0 0 0 -4 4 4 4 0 0 0 .55859 2.0273l-2.2656 2.2656 1.4141 1.4141 2.2656-2.2656a4 4 0 0 0 2.0273.55859 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-9 8v6h2c1.6569 0 3-1.3431 3-3s-1.3431-3-3-3zm5 3c0 1.6569 1.3431 3 3 3s3-1.3431 3-3-1.3431-3-3-3-3 1.3431-3 3zm6 0c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1 .00001-.55228.44772-.99999 1-1h1v-2h-1c-1.6569 0-3 1.3431-3 3zm-9-1c.55228 0 1 .44772 1 1s-.44772 1-1 1zm6 0c.55228.00001.99999.44772 1 1-.0000096.55228-.44772.99999-1 1-.55228-.00001-.99999-.44772-1-1 .0000096-.55228.44772-.99999 1-1z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".32549" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_hinge_joint.svg b/editor/icons/icon_hinge_joint.svg
deleted file mode 100644
index 21b3e29cb5..0000000000
--- a/editor/icons/icon_hinge_joint.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.2832 1.3281a1.0001 1.0001 0 0 0 -.88086.51172l-3.6895 6.3906c.40599-.13877.83411-.23047 1.2871-.23047.37043 0 .72206.067873 1.0625.16211l3.0723-5.3223a1.0001 1.0001 0 0 0 -.85156-1.5117zm-3.2832 7.6719a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h10a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-7.1738a3 3 0 0 0 .17383-1 3 3 0 0 0 -3-3zm0 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_history.svg b/editor/icons/icon_history.svg
deleted file mode 100644
index 48eed7b0c8..0000000000
--- a/editor/icons/icon_history.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/><path d="m8 1041.4h2v4h-2z"/><path d="m8 1043.4h4v2h-4z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_hsize.svg b/editor/icons/icon_hsize.svg
deleted file mode 100644
index 075bab1050..0000000000
--- a/editor/icons/icon_hsize.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 7v-2l-3 3 3 3v-2h8v2l3-3-3-3v2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_image.svg b/editor/icons/icon_image.svg
deleted file mode 100644
index f3beda898e..0000000000
--- a/editor/icons/icon_image.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm1 2h10v8h-10zm6 2-1.5 2.5-.70117 1.168-.099609-.16797-.89844-1.5-.90039 1.5-.90039 1.5h1.8008.19922 1.5996 1.4004 3l-1.5-2.5-1.5-2.5z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_image_texture.svg b/editor/icons/icon_image_texture.svg
deleted file mode 100644
index 6e9905881b..0000000000
--- a/editor/icons/icon_image_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm1 2h10v8h-10zm6 2v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-2h-1v-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_immediate_geometry.svg b/editor/icons/icon_immediate_geometry.svg
deleted file mode 100644
index 5679d5906f..0000000000
--- a/editor/icons/icon_immediate_geometry.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9208 1046.4c-.26373.3-.4204.7296-.4204 1.2383 0 1.6277-3.1381-.1781-.33757 2.6703.88382.899 2.6544.6701 3.5382-.2288.88384-.899.88382-2.3565 0-3.2554-1.1002-1.1191-2.2001-1.0845-2.7803-.4244zm2.3802-1.6103 2.4005 2.4416 6.8014-6.9177c.66286-.6742.66286-1.7673 0-2.4415-.66288-.6741-1.7376-.6741-2.4005 0z" fill="#fc9c9c" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_import_check.svg b/editor/icons/icon_import_check.svg
deleted file mode 100644
index b2b967f37a..0000000000
--- a/editor/icons/icon_import_check.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1044.4 4 4 8-8" fill="none" stroke="#45ff8b" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_import_fail.svg b/editor/icons/icon_import_fail.svg
deleted file mode 100644
index 6c81f88d9f..0000000000
--- a/editor/icons/icon_import_fail.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2.9902 1.9902a1.0001 1.0001 0 0 0 -.69727 1.7168l4.293 4.293-4.293 4.293a1.0001 1.0001 0 1 0 1.4141 1.4141l4.293-4.293 4.293 4.293a1.0001 1.0001 0 1 0 1.4141-1.4141l-4.293-4.293 4.293-4.293a1.0001 1.0001 0 0 0 -.72656-1.7148 1.0001 1.0001 0 0 0 -.6875.30078l-4.293 4.293-4.293-4.293a1.0001 1.0001 0 0 0 -.7168-.30273z" fill="#ff5d5d" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_information_sign.svg b/editor/icons/icon_information_sign.svg
deleted file mode 100644
index a99be1b042..0000000000
--- a/editor/icons/icon_information_sign.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width=".570241"><path d="m4.5291945 14.892249h6.8428865l3.421444-3.421444v-6.8428864l-3.421444-3.4214437h-6.8428865l-3.4214436 3.4214437v6.8428864z" fill="#ffb65d" fill-rule="evenodd"/><g fill="#fff"><path d="m6.69985 6.347754h2.624354v6.50621h-2.624354z"/><ellipse cx="8.039363" cy="4.215466" rx="1.394188" ry="1.366851"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_insert_after.svg b/editor/icons/icon_insert_after.svg
deleted file mode 100644
index cab00048ac..0000000000
--- a/editor/icons/icon_insert_after.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="4" cy="12" fill="none" r="2"/><path d="m11.99.99023a1.0001 1.0001 0 0 0 -.69726 1.7168l.29297.29297h-2.5859v2h2.5859l-.29297.29297a1.0001 1.0001 0 1 0 1.4141 1.4141l2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.7168-.30273zm-8.9902.0097656c-1.108 0-2 .892-2 2v2c0 1.108.892 2 2 2h2c1.108 0 2-.892 2-2v-2c0-1.108-.892-2-2-2z" fill="#e0e0e0"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_insert_before.svg b/editor/icons/icon_insert_before.svg
deleted file mode 100644
index 366be3a1e6..0000000000
--- a/editor/icons/icon_insert_before.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="4" cy="12" fill="none" r="2"/><path d="m4.0096.99023a1.0001 1.0001 0 0 1 .69726 1.7168l-.29297.29297h2.5859v2h-2.5859l.29297.29297a1.0001 1.0001 0 1 1 -1.4141 1.4141l-2-2a1.0001 1.0001 0 0 1 0-1.4141l2-2a1.0001 1.0001 0 0 1 .7168-.30273zm8.9902.0097656c1.108 0 2 .892 2 2v2c0 1.108-.892 2-2 2h-2c-1.108 0-2-.892-2-2v-2c0-1.108.892-2 2-2z" fill="#e0e0e0"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_instance.svg b/editor/icons/icon_instance.svg
deleted file mode 100644
index 8fc985bb51..0000000000
--- a/editor/icons/icon_instance.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 1c-2.1973 0-4 1.8027-4 4 0 .35477.062329.69321.15039 1.0215l2.3945-2.3945c.36302-.38506.87563-.62695 1.4551-.62695 1.1164 0 2 .8836 2 2 0 .57388-.23667 1.0829-.61523 1.4453l-2.4043 2.4043c.32773.087749.66541.15039 1.0195.15039 2.1973 0 4-1.8027 4-4s-1.8027-4-4-4zm-.013672 3.002a1 1 0 0 0 -.69336.29102l-6 6a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l6-6a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102zm-5.9863 2.998c-2.1973 0-4 1.8027-4 4s1.8027 4 4 4 4-1.8027 4-4c0-.35412-.062641-.6918-.15039-1.0195l-2.4043 2.4043c-.36245.37857-.87143.61523-1.4453.61523-1.1164 0-2-.8836-2-2 0-.57944.24189-1.0921.62695-1.4551l2.3945-2.3945c-.32827-.088062-.66671-.15039-1.0215-.15039z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_instance_options.svg b/editor/icons/icon_instance_options.svg
deleted file mode 100644
index ca9a5bcc87..0000000000
--- a/editor/icons/icon_instance_options.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m1 7v6c0 1.1046.89543 2 2 2h12v-8zm4 2h6l-3 4z" transform="translate(0 1036.4)"/><path d="m.71129 1040.4.28871 1.9791 2.2438-.3273-.81826-1.9018-1.7143.25zm3.6933-.5387.81826 1.9018 1.9791-.2887-.81826-1.9018zm3.9581-.5775.81826 1.9018 1.9791-.2887-.81826-1.9018zm3.9581-.5774.81826 1.9018 1.7143-.25-.28871-1.9791-2.2438.3273z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_int.svg b/editor/icons/icon_int.svg
deleted file mode 100644
index 4226c8cb7e..0000000000
--- a/editor/icons/icon_int.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 2v2h2v-2zm11 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2zm-8 2v6h2v-4h1a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3h-1zm-3 2v4h2v-4z" fill="#7dc6ef"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_interp_cubic.svg b/editor/icons/icon_interp_cubic.svg
deleted file mode 100644
index c2dd7db08c..0000000000
--- a/editor/icons/icon_interp_cubic.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c3 0 3-4 6-4s3 4 6 4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_interp_linear.svg b/editor/icons/icon_interp_linear.svg
deleted file mode 100644
index 368be15315..0000000000
--- a/editor/icons/icon_interp_linear.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 6-4 6 4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_interp_raw.svg b/editor/icons/icon_interp_raw.svg
deleted file mode 100644
index 1c6ae0062a..0000000000
--- a/editor/icons/icon_interp_raw.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4h3v-4h6v4h3" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_interp_wrap_clamp.svg b/editor/icons/icon_interp_wrap_clamp.svg
deleted file mode 100644
index 9634dc8a07..0000000000
--- a/editor/icons/icon_interp_wrap_clamp.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v6h2v-2.9863-3.0137zm2 3.0137a1.0001 1.0001 0 0 0 .29297.69336l2 2a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-.29297-.29297h3.1719l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .29297-.72266 1.0001 1.0001 0 0 0 -.29297-.69141l-2-2a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l.29297.29297h-3.1719l.29297-.29297a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-2 2a1.0001 1.0001 0 0 0 -.29297.7207zm10-.029297v3.0156h2v-6h-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_interp_wrap_loop.svg b/editor/icons/icon_interp_wrap_loop.svg
deleted file mode 100644
index 6fbb4356c8..0000000000
--- a/editor/icons/icon_interp_wrap_loop.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 0-3 2 3 2v-1h3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1v2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3h-3zm-5 1a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h3v1l3-2-3-2v1h-3a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_interpolated_camera.svg b/editor/icons/icon_interpolated_camera.svg
deleted file mode 100644
index 4bc4ba1ee9..0000000000
--- a/editor/icons/icon_interpolated_camera.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9.5.00004c-1.5691.0017903-2.8718 1.2125-2.9883 2.7773-.55103-.49952-1.268-.77655-2.0117-.77734-1.6569 0-3 1.3431-3 3 .00179 1.2698.80282 2.4009 2 2.8242v2.1758c0 .554.44599 1 1 1h6c.55401 0 .9853-.4462 1-1v-1l3 2v-6l-3 2v-1.7695c.63486-.56783.99842-1.3788 1-2.2305 0-1.6569-1.3431-3-3-3zm-6 12v4h1v-4zm3 0v4h1v-1h1c.55228 0 1-.44772 1-1v-1c0-.55228-.44824-1.024-1-1h-1zm5 0c-.55228 0-1 .44772-1 1v2c0 .55228.44772 1 1 1h1c.55228 0 1-.44772 1-1v-2c0-.55228-.44772-1-1-1zm-4 1h1v1h-1zm4 0h1v2h-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_inverse_kinematics.svg b/editor/icons/icon_inverse_kinematics.svg
deleted file mode 100644
index a98c989ccc..0000000000
--- a/editor/icons/icon_inverse_kinematics.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v10.27h2v-10.271a2 2 0 0 0 .73047-.72852h4.541a2 2 0 0 0 .72852.73047v3.2695h-2v2l-1 2 3 2v-4h2v4l3-2-1-2v-2h-2v-3.2715a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-4.541a2 2 0 0 0 -1.7285-1z" fill="#fc9c9c" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_issue.svg b/editor/icons/icon_issue.svg
deleted file mode 100644
index ddaaf41440..0000000000
--- a/editor/icons/icon_issue.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m5.2902433 14.98657h1.9512087v2.441414h-1.9512087zm0-11.909101h1.9512087v6.2957719l-.1922373 3.4314361h-1.5571222l-.2018492-3.4314361z" transform="matrix(1.2172834 0 0 .60107067 .478728 1.839214)"/><path d="m8.0503291 1.1522775a6.8983747 6.8983747 0 0 0 -6.8980516 6.8980516 6.8983747 6.8983747 0 0 0 6.8980516 6.8997839 6.8983747 6.8983747 0 0 0 6.8997839-6.8997839 6.8983747 6.8983747 0 0 0 -6.8997839-6.8980516zm-.0294418 1.1430364a5.6659852 5.6659852 0 0 1 5.6666897 5.6649578 5.6659852 5.6659852 0 0 1 -5.6666897 5.6666893 5.6659852 5.6659852 0 0 1 -5.6666896-5.6666893 5.6659852 5.6659852 0 0 1 5.6666896-5.6649578z" stroke-width=".886719"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_item_list.svg b/editor/icons/icon_item_list.svg
deleted file mode 100644
index 311ed08a44..0000000000
--- a/editor/icons/icon_item_list.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h10v10h-10zm1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_joy_axis.svg b/editor/icons/icon_joy_axis.svg
deleted file mode 100644
index cb7b5cdf8f..0000000000
--- a/editor/icons/icon_joy_axis.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m27 1038.4h7v14h-7z" fill="#fff" fill-opacity=".99608"/><g fill="#e0e0e0"><path d="m3 1a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h12v-14zm4 2h2a1 1 0 0 1 1 1v2h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1-1v-2h-2a1 1 0 0 1 -1-1v-2a1 1 0 0 1 1-1h2v-2a1 1 0 0 1 1-1z" fill-opacity=".99608" transform="translate(0 1036.4)"/><circle cx="8" cy="1044.4" r="1"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_joy_button.svg b/editor/icons/icon_joy_button.svg
deleted file mode 100644
index 9f4fbfdf2d..0000000000
--- a/editor/icons/icon_joy_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m27 1038.4h7v14h-7z" fill="#fff"/><path d="m1 1v14h12c1.1046 0 2-.8954 2-2v-10c0-1.1046-.89543-2-2-2zm7 1a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-4 4a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm8 0a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2zm-4 4a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_joypad.svg b/editor/icons/icon_joypad.svg
deleted file mode 100644
index 8cb5de0c0e..0000000000
--- a/editor/icons/icon_joypad.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 3c-.55226.0000552-.99994.44774-1 1v8c.0000552.55226.44774.99994 1 1h14c.55226-.000055.99994-.44774 1-1v-8c-.000055-.55226-.44774-.99994-1-1zm2 2h2v2h2v2h-2v2h-2v-2h-2v-2h2zm10.5 0a1.5 1.5 0 0 1 1.5 1.5 1.5 1.5 0 0 1 -1.5 1.5 1.5 1.5 0 0 1 -1.5-1.5 1.5 1.5 0 0 1 1.5-1.5zm-3 3a1.5 1.5 0 0 1 1.5 1.5 1.5 1.5 0 0 1 -1.5 1.5 1.5 1.5 0 0 1 -1.5-1.5 1.5 1.5 0 0 1 1.5-1.5z" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key.svg b/editor/icons/icon_key.svg
deleted file mode 100644
index d134735c53..0000000000
--- a/editor/icons/icon_key.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 4a4 4 0 0 0 -3.8691 3h-6.1309v2h1v2h3v-2h2.1328a4 4 0 0 0 3.8672 3 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_animation.svg b/editor/icons/icon_key_animation.svg
deleted file mode 100644
index 6db513ca26..0000000000
--- a/editor/icons/icon_key_animation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#b76ef0" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_audio.svg b/editor/icons/icon_key_audio.svg
deleted file mode 100644
index 75576885ec..0000000000
--- a/editor/icons/icon_key_audio.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#eae668" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_bezier.svg b/editor/icons/icon_key_bezier.svg
deleted file mode 100644
index dc5800fd5a..0000000000
--- a/editor/icons/icon_key_bezier.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#5792f6" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_bezier_handle.svg b/editor/icons/icon_key_bezier_handle.svg
deleted file mode 100644
index 9f00f61304..0000000000
--- a/editor/icons/icon_key_bezier_handle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3.9960938-.03710938c-.1950007 0-.3896403.07518711-.5390626.22460938l-3.23632808 3.2363281c-.29883746.2988375-.29884453.7812336 0 1.0800781l3.23632808 3.2363282c.2988375.2988374.7812407.2988374 1.0800782 0l3.2363281-3.2363282c.2988445-.2988445.2988375-.7812406 0-1.0800781l-3.2363281-3.2363281c-.1494223-.14942227-.346015-.22460938-.5410156-.22460938zm.0292968.8515625c.1516192 0 .3037416.05796444.4199219.17382813l2.515625 2.50781255c.2323605.2317273.2323605.6061632 0 .8378906l-2.515625 2.5097656c-.2323605.2317274-.6074832.2317274-.8398437 0l-2.515625-2.5097656c-.23236057-.2317274-.23236057-.6061633 0-.8378906l2.515625-2.50781255c.1161802-.11586369.2683026-.17382813.4199218-.17382813z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_bezier_point.svg b/editor/icons/icon_key_bezier_point.svg
deleted file mode 100644
index 0edb55cda1..0000000000
--- a/editor/icons/icon_key_bezier_point.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#e0e0e0" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1044.4)" width="6.1027" x="-741.53" y="741.08"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_bezier_selected.svg b/editor/icons/icon_key_bezier_selected.svg
deleted file mode 100644
index 9e50e2bdf1..0000000000
--- a/editor/icons/icon_key_bezier_selected.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#84c2ff" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1044.4)" width="6.1027" x="-741.53" y="741.08"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_call.svg b/editor/icons/icon_key_call.svg
deleted file mode 100644
index 6cc442c391..0000000000
--- a/editor/icons/icon_key_call.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#66f376" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_hover.svg b/editor/icons/icon_key_hover.svg
deleted file mode 100644
index 417621716b..0000000000
--- a/editor/icons/icon_key_hover.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#fff" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1044.4)" width="6.1027" x="-741.53" y="741.08"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_invalid.svg b/editor/icons/icon_key_invalid.svg
deleted file mode 100644
index 8ac9445b31..0000000000
--- a/editor/icons/icon_key_invalid.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m.46447 1046.2 2.1213 2.1213-2.1213 2.1213 1.4142 1.4142 2.1213-2.1213 2.1213 2.1213 1.4142-1.4142-2.1213-2.1213 2.1213-2.1213-1.4142-1.4142-2.1213 2.1213-2.1213-2.1213-1.4142 1.4142z" fill="#ff5d5d" transform="translate(0 -1044.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_next.svg b/editor/icons/icon_key_next.svg
deleted file mode 100644
index 2d064e7e86..0000000000
--- a/editor/icons/icon_key_next.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/><path d="m11 1a4 4 0 0 0 -3.8691 3h-6.1309v2h1v2h3v-2h2.1328a4 4 0 0 0 2.8672 2.8691v-.86914h3.6387a4 4 0 0 0 1.3613-3 4 4 0 0 0 -4-4zm0 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_position.svg b/editor/icons/icon_key_position.svg
deleted file mode 100644
index d152b76e8d..0000000000
--- a/editor/icons/icon_key_position.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm-7 7v5c0 1.6569 1.3471 3.114 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1v-5zm7 2c-1.645 0-3 1.355-3 3s1.355 3 3 3 3-1.355 3-3-1.355-3-3-3zm3 3c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1 .00001-.55228.44772-.99999 1-1h1v-2h-1c-1.6569 0-3 1.3431-3 3zm-3-1c.56413 0 1 .4359 1 1 0 .5642-.43587 1-1 1s-1-.4358-1-1c0-.5641.43587-1 1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_rotation.svg b/editor/icons/icon_key_rotation.svg
deleted file mode 100644
index 0d3577eac4..0000000000
--- a/editor/icons/icon_key_rotation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm3 7v5c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228 0-.99999-.4477-1-1v-1h2v-2h-2v-2zm0 5c0-1.645-1.355-3-3-3s-3 1.355-3 3 1.355 3 3 3 3-1.355 3-3zm-7-3c-1.6569 0-3 1.3431-3 3v3h2v-3c.0000096-.5523.44772-1 1-1h1v-2zm4 2c.56413 0 1 .4359 1 1 0 .5642-.43587 1-1 1s-1-.4358-1-1c0-.5641.43587-1 1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_scale.svg b/editor/icons/icon_key_scale.svg
deleted file mode 100644
index a1214db62e..0000000000
--- a/editor/icons/icon_key_scale.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.195 0-.38964.07519-.53906.22461l-3.2363 3.2363c-.29884.29884-.29884.77929 0 1.0781l3.2363 3.2363c.29884.29884.77929.29884 1.0781 0l3.2363-3.2363c.29884-.29884.29884-.77929 0-1.0781l-3.2363-3.2363c-.14942-.14942-.34406-.22461-.53906-.22461zm3 7v5c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1v-5zm-8 2c-.71466-.0001-1.3751.3811-1.7324 1-.35727.6188-.35727 1.3812 0 2 .35733.6189 1.0178 1.0001 1.7324 1h-2v2h2c.71466.0001 1.3751-.3811 1.7324-1 .35727-.6188.35727-1.3812 0-2-.35733-.6189-1.0178-1.0001-1.7324-1h2v-2zm6 0c-1.6569 0-3 1.3431-3 3s1.3431 3 3 3h1v-2h-1c-.55228-.00001-.99999-.44772-1-1 .0000096-.55228.44772-.99999 1-1h1v-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_selected.svg b/editor/icons/icon_key_selected.svg
deleted file mode 100644
index 6594aec6ee..0000000000
--- a/editor/icons/icon_key_selected.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#84c2ff" height="6.1027" ry=".76286" transform="matrix(.87871827 -.87871827 .87871827 .87871827 .03288 -1297.7965)" width="6.1027" x="-741.53003" y="741.08002"/><rect fill="#003e7a" height="3.434683" ry=".429348" stroke-width=".562814" transform="matrix(.89137101 -.86588067 .89137101 .86588067 -.038545 -1297.8361)" width="3.434683" x="-751.20953" y="753.42743"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_value.svg b/editor/icons/icon_key_value.svg
deleted file mode 100644
index 8a4787d6ed..0000000000
--- a/editor/icons/icon_key_value.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#e0e0e0" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 1.002946 -1043.3636)" width="6.1027" x="-741.53003" y="741.08002"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_key_xform.svg b/editor/icons/icon_key_xform.svg
deleted file mode 100644
index 4a567075a7..0000000000
--- a/editor/icons/icon_key_xform.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#ea9568" height="6.1027" ry=".76286" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" width="6.1027" x="-740.13947" y="741.10779"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_keyboard.svg b/editor/icons/icon_keyboard.svg
deleted file mode 100644
index bd8736278d..0000000000
--- a/editor/icons/icon_keyboard.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m4 2a1 1 0 0 0 -1 1v9.084a1 .91667 0 0 0 1 .91602h8a1 .91667 0 0 0 1-.91602v-9.084a1 1 0 0 0 -1-1zm-3 2v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-9h-1v9a.99998.99998 0 0 1 -1 1h-10a1 1 0 0 1 -1-1v-9zm4 0h2v3l2-3h2l-2 3 2 4h-2l-2-4v4h-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m27 1038.4h7v14h-7z" fill="#fff"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_kinematic_body.svg b/editor/icons/icon_kinematic_body.svg
deleted file mode 100644
index 16078fbdec..0000000000
--- a/editor/icons/icon_kinematic_body.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1c-.55401 0-1 .44599-1 1v3c0 .55401.44599 1 1 1h1v.99023a1.0001 1.0001 0 0 0 -.31641.0625l-2.0508.68359-.68359-2.0508a1.0001 1.0001 0 0 0 -.99023-.69727 1.0001 1.0001 0 0 0 -.9082 1.3281l1 3a1.0001 1.0001 0 0 0 1.2656.63281l1.6836-.56055v.61133c0 .04088.018715.07566.023437.11523l-4.5781 3.0527a1.0001 1.0001 0 1 0 1.1094 1.6641l5.0566-3.3711 1.4941 2.9863a1.0001 1.0001 0 0 0 1.2109.50195l3-1a1.0001 1.0001 0 1 0 -.63281-1.8965l-2.1777.72461-.97461-1.9512c.2759-.17764.46875-.47227.46875-.82617v-1h1.3828l.72266 1.4473a1.0001 1.0001 0 1 0 1.7891-.89453l-1-2a1.0001 1.0001 0 0 0 -.89453-.55273h-3v-1h1c.55401 0 1-.44599 1-1v-3c0-.55401-.44599-1-1-1zm0 2h1v2h-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_kinematic_body_2d.svg b/editor/icons/icon_kinematic_body_2d.svg
deleted file mode 100644
index be9dfa2d27..0000000000
--- a/editor/icons/icon_kinematic_body_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6.4921 1c-.55401 0-1 .446-1 1v3c0 .554.44599 1 1 1h1v.9902a1.0001 1.0001 0 0 0 -.31641.062l-2.0508.6836-.68359-2.0508a1.0001 1.0001 0 0 0 -.99023-.6972 1.0001 1.0001 0 0 0 -.9082 1.3281l1 3a1.0001 1.0001 0 0 0 1.2656.6328l1.6836-.5605v.6113c0 .041.018715.076.023437.1152l-4.5781 3.0528a1.0001 1.0001 0 1 0 1.1094 1.664l5.0566-3.3711 1.4941 2.9864a1.0001 1.0001 0 0 0 1.2109.5019l3-1a1.0001 1.0001 0 1 0 -.63281-1.8965l-2.1777.7246-.97461-1.9511c.2759-.1777.46875-.4723.46875-.8262v-1h1.3828l.72266 1.4473a1.0001 1.0001 0 1 0 1.7891-.8946l-1-2a1.0001 1.0001 0 0 0 -.89453-.5527h-3v-1h1c.55401 0 1-.446 1-1v-3c0-.554-.44599-1-1-1zm0 2h1v2h-1z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_label.svg b/editor/icons/icon_label.svg
deleted file mode 100644
index 24de398501..0000000000
--- a/editor/icons/icon_label.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 3a1.0001 1.0001 0 0 0 -.70703.29297l-4 4a1.0001 1.0001 0 0 0 0 1.4141l4 4a1.0001 1.0001 0 0 0 .70703.29297h8a1.0001 1.0001 0 0 0 1-1v-8a1.0001 1.0001 0 0 0 -1-1h-8zm-1 4a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#a5efac" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_large_texture.svg b/editor/icons/icon_large_texture.svg
deleted file mode 100644
index 15920bf3d3..0000000000
--- a/editor/icons/icon_large_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v1 2h1v-2h2v-1zm11 0v1h2v2h1v-3zm-3 5v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-1-1h-1v-1zm-8 6v2 1h3v-1h-2v-2zm13 0v2h-2v1h3v-1-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_light_2d.svg b/editor/icons/icon_light_2d.svg
deleted file mode 100644
index 87cfb29149..0000000000
--- a/editor/icons/icon_light_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 5 0 0 0 -5 5 5 5 0 0 0 3 4.5762v2.4238h4v-2.4199a5 5 0 0 0 3-4.5801 5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3 3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3zm-1 11v1h2v-1z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_light_occluder_2d.svg b/editor/icons/icon_light_occluder_2d.svg
deleted file mode 100644
index 2905f9badd..0000000000
--- a/editor/icons/icon_light_occluder_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1037.4c-2.7614 0-5 2.2386-5 5 .00253 1.9858 1.18 3.7819 3 4.5762v2.4238h4v-2.4199c1.8213-.7949 2.999-2.5929 3-4.5801 0-2.7614-2.2386-5-5-5zm0 2v6c-1.6569 0-3-1.3431-3-3s1.3431-3 3-3zm-1 11v1h2v-1z" fill="#a5b7f3" fill-opacity=".98824" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_line_2d.svg b/editor/icons/icon_line_2d.svg
deleted file mode 100644
index 9728262e50..0000000000
--- a/editor/icons/icon_line_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1045.4 3 4 3-10 3 6 3-2" fill="none" stroke="#a5b7f3" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_line_edit.svg b/editor/icons/icon_line_edit.svg
deleted file mode 100644
index 4df7a3b248..0000000000
--- a/editor/icons/icon_line_edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 4v5h2v-5zm-1 7c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2h-2-10z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_line_shape_2d.svg b/editor/icons/icon_line_shape_2d.svg
deleted file mode 100644
index 758c0fbef2..0000000000
--- a/editor/icons/icon_line_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke="#68b6ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><path d="m1 1037.4 14 14" fill="#68b6ff" fill-rule="evenodd" stroke-opacity=".39216"/><g fill="none"><path d="m3 1039.4 10 10" stroke-opacity=".58824"/><path d="m5 1041.4 6 6"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_link_button.svg b/editor/icons/icon_link_button.svg
deleted file mode 100644
index bf7f7657eb..0000000000
--- a/editor/icons/icon_link_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 3a5 5 0 0 0 -4.3301 2.5 5 5 0 0 0 0 5 5 5 0 0 0 4.3301 2.5h1v-2h-1a3 3 0 0 1 -3-3 3 3 0 0 1 3-3h1v-2zm3 0v2h1a3 3 0 0 1 3 3 3 3 0 0 1 -3 3h-1v2h1a5 5 0 0 0 4.3301-2.5 5 5 0 0 0 0-5 5 5 0 0 0 -4.3301-2.5zm-3 4a.99998.99998 0 0 0 -1 1 .99998.99998 0 0 0 1 1h4a.99998.99998 0 0 0 1-1 .99998.99998 0 0 0 -1-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_list_select.svg b/editor/icons/icon_list_select.svg
deleted file mode 100644
index 42feb1922b..0000000000
--- a/editor/icons/icon_list_select.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h8.2578l-.82227-2h-5.4355v-2h4.6113l-.82227-2h-3.7891v-2h3.8867a1.5002 1.5002 0 0 1 1.0977-.49805v-.0019531a1.5002 1.5002 0 0 1 .58594.11133l.94531.38867h.48438v.19922l2 .82227v-7.0215h-11zm2 2h7v2h-7zm5 5 3.291 8 .94726-2.8203 1.8828 1.8828.94336-.94141-1.8848-1.8828 2.8203-.94726-8-3.291z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_listener.svg b/editor/icons/icon_listener.svg
deleted file mode 100644
index 96eaeaffa9..0000000000
--- a/editor/icons/icon_listener.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a5 5 0 0 0 -5 5h2a3 3 0 0 1 3-3 3 3 0 0 1 3 3c0 1.75-.54175 2.3583-1.1406 2.8574-.29944.2495-.62954.44071-.97656.69141-.17351.1253-.35729.26529-.53711.49219-.17982.227-.3457.58398-.3457.95898 0 1.2778-.31632 1.5742-.63867 1.7676-.32236.1934-.86133.23242-1.3613.23242h-1v2h1c.5 0 1.461.038922 2.3887-.51758.87316-.5239 1.4826-1.6633 1.5566-3.2266.011365-.0098.027247-.024684.10938-.083984.21547-.1556.63537-.40194 1.0859-.77734.90112-.751 1.8594-2.1445 1.8594-4.3945a5 5 0 0 0 -5-5zm7.9277 1-1.7383 1.0039a6 6 0 0 1 .81055 2.9961 6 6 0 0 1 -.80859 2.998l1.7363 1.002a8 8 0 0 0 0-8z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_load.svg b/editor/icons/icon_load.svg
deleted file mode 100644
index 7ee6ae2a2d..0000000000
--- a/editor/icons/icon_load.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-1.1046 0-2 .8954-2 2v9c0 1.1046.89543 2 2 2h9c1.1046 0 1.8184-.91043 2-2l1-6c.003977-.18354-.042648-.3412-.13477-.5-.17849-.30916-.50825-.49972-.86523-.5h-8c-.35698.0002824-.68674.19084-.86523.5-.092118.1588-.13874.3399-.13477.52344l-1 5.9766c-.091144.54473-.44772 1-1 1s-1-.4477-1-1v-9c0-.5523.44772-1 1-1h2c.55228 0 1 .4477 1 1a1 1 0 0 0 .29297.70703 1 1 0 0 0 .70703.29297h4 1a1 1 0 0 0 -.29297-.70703 1 1 0 0 0 -.70703-.29297h-4c0-1.1046-.89543-2-2-2h-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_lock.svg b/editor/icons/icon_lock.svg
deleted file mode 100644
index 4136dad557..0000000000
--- a/editor/icons/icon_lock.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 5 0 0 0 -5 5v2h-1v7h12v-7h-1v-2a5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3v2h-6v-2a3 3 0 0 1 3-3zm-1 7h2v3h-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_lock_viewport.svg b/editor/icons/icon_lock_viewport.svg
deleted file mode 100644
index 99c066055d..0000000000
--- a/editor/icons/icon_lock_viewport.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 0a6 6 0 0 0 -6 6v1h-1v9h14v-9h-1v-1a6 6 0 0 0 -6-6zm0 4c1.1046 0 2 .89543 2 2v1h-4v-1c0-1.1046.89543-2 2-2z" fill-opacity=".39216" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".98824" stroke-width="4"/><path d="m8 1a5 5 0 0 0 -5 5v2h-1v7h12v-7h-1v-2a5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3v2h-6v-2a3 3 0 0 1 3-3zm-1 7h2v3h-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_logo.svg b/editor/icons/icon_logo.svg
deleted file mode 100644
index f5379c48d4..0000000000
--- a/editor/icons/icon_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="69" viewBox="0 0 187 69" width="187" xmlns="http://www.w3.org/2000/svg"><path d="m91.912 19.51c-3.5233 0-6.278 1.1097-8.2676 3.3281-1.9911 2.2193-2.9844 5.1004-2.9844 8.6465 0 4.1636 1.0165 7.3207 3.0508 9.4707 2.0379 2.1497 4.7123 3.2227 8.0293 3.2227 1.7838 0 3.3686-.15384 4.752-.46289 1.3848-.30784 2.3038-.62367 2.7617-.94336l.13867-10.736c0-.62388-1.6471-.90785-3.4941-.93945-1.847-.02857-3.9609.35742-3.9609.35742v3.6055h2.125l-.023438 1.6055c0 .59532-.59062.89453-1.7676.89453-1.1785 0-2.2182-.4989-3.1211-1.4941-.90498-.99645-1.3555-2.4517-1.3555-4.3711 0-1.9233.43964-3.3428 1.3203-4.2578.87885-.9141 2.0322-1.3711 3.4492-1.3711.59532 0 1.2107.095008 1.8516.29102.64121.19418 1.0686.37639 1.2871.54688.21667.17534.42435.25781.61914.25781.19388 0 .50715-.22698.94141-.68555.43487-.45735.82427-1.1501 1.168-2.0742.34218-.92899.51367-1.6414.51367-2.1465 0-.50111-.011023-.84501-.033203-1.0273-.48045-.52573-1.3668-.94394-2.6602-1.2539-1.2909-.30906-2.7387-.46289-4.3398-.46289zm21.049 0c-3.2367 0-5.8788 1.0413-7.9258 3.1211-2.0464 2.0826-3.0703 5.1404-3.0703 9.1797 0 4.0369 1.0128 7.1085 3.0352 9.2129 2.0251 2.1026 4.6444 3.1543 7.8574 3.1543 3.2145 0 5.8383-1.0111 7.875-3.0332 2.0367-2.0263 3.0527-5.1142 3.0527-9.2656 0-4.1484-.99433-7.2508-2.9863-9.2969-1.9884-2.05-4.6018-3.0723-7.8379-3.0723zm45.504 0c-3.2379 0-5.8792 1.0413-7.9277 3.1211-2.0461 2.0826-3.0684 5.1404-3.0684 9.1797 0 4.0369 1.0104 7.1085 3.0352 9.2129 2.0233 2.1026 4.6432 3.1543 7.8574 3.1543 3.213 0 5.8373-1.0111 7.873-3.0332 2.0364-2.0263 3.0547-5.1142 3.0547-9.2656 0-4.1484-.9939-7.2508-2.9844-9.2969-1.9908-2.05-4.6031-3.0723-7.8398-3.0723zm-30.105.30859c-.45888 0-.82988.16637-1.1152.49609-.28717.33489-.42969.78715-.42969 1.3594v20.584c0 1.053.58624 1.5781 1.752 1.5781h5.8652c7.1824-.000001 10.773-4.2092 10.773-12.627 0-3.9348-.94335-6.8151-2.832-8.6445-1.8853-1.83-4.6472-2.7461-8.2832-2.7461h-5.7305zm42.807 0c-.38928 0-.66468.52801-.82422 1.5801-.0687.50294-.10157 1.0191-.10157 1.543 0 .52694.03287 1.0409.10157 1.543.15954 1.0548.43494 1.5801.82422 1.5801h4.1152v17.225c0 .45462 1.1351.68555 3.3984.68555 2.2655 0 3.3965-.23093 3.3965-.68555v-17.225h4.0137c.38868 0 .66225-.52528.82422-1.5801.0672-.50202.10156-1.016.10156-1.543.00001-.52391-.03436-1.04-.10156-1.543-.16197-1.0521-.43554-1.5801-.82422-1.5801h-14.924zm-58.291 6.2793c1.0989 0 2.0193.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.35955 3.2363-1.0801 4.2188-.72053.98612-1.6597 1.4785-2.8145 1.4785-1.1554 0-2.0859-.48441-2.7949-1.459-.71019-.97154-1.0644-2.3663-1.0644-4.1875 0-1.8173.37148-3.2302 1.1133-4.2363.74574-1.0053 1.6663-1.5098 2.7637-1.5098zm45.504 0c1.0989 0 2.0181.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.3612 3.2363-1.082 4.2188-.71961.98612-1.6574 1.4785-2.8125 1.4785-1.1554 0-2.0888-.48441-2.7969-1.459-.70806-.97154-1.0625-2.3663-1.0625-4.1875 0-1.8173.37179-3.2302 1.1133-4.2363.74453-1.0053 1.666-1.5098 2.7637-1.5098zm-24.977.23828h.34375c1.4638 0 2.5334.33466 3.209.99805.6722.66157 1.0098 2.0859 1.0098 4.2715 0 2.1847-.32289 3.7447-.97656 4.6816-.65214.9378-1.6059 1.4082-2.8652 1.4082-.34218 0-.54909-.063339-.61719-.18945-.06873-.12672-.10352-.42897-.10352-.9082v-10.262z" fill="#fff"/><path d="m137.91 48.551v1.2109h.85938v-1.2109zm-52.396.58984c-.99736 0-1.7963.32424-2.3926.96484-.59745.64576-.89453 1.5712-.89453 2.7773v3.0742c0 1.2329.31639 2.1765.94727 2.832.6333.66066 1.467.98828 2.5039.98828.78586 0 1.4321-.16147 1.9414-.48633.50993-.32273.8592-.67938 1.0488-1.0684v-3.6875h-3.0059v.74805h2.1465v2.6934c-.13766.30115-.38143.55386-.73242.76172-.34978.2109-.8171.31445-1.3984.31445-.79619 0-1.4265-.2632-1.8945-.78711-.46799-.52786-.70312-1.2936-.70312-2.2988v-3.0918c0-.96941.21778-1.7078.65234-2.2168.43578-.51023 1.0297-.76367 1.7812-.76367.74271 0 1.3056.19019 1.6836.56641.38017.37925.58276.91542.61133 1.6113h.79492l.013672-.041016c-.024311-.90802-.30456-1.6179-.83789-2.127-.53484-.50719-1.2907-.76367-2.2656-.76367zm7.6133 2.6641c-.719 0-1.3111.22524-1.7715.67773-.46222.45371-.68069.96571-.6582 1.5449l.013672.041015.79688.007813c0-.42696.14768-.78487.44336-1.0781.2966-.29508.67455-.44141 1.1328-.44141.4926 0 .87459.15388 1.1523.45898.27198.30906.41016.73655.41016 1.2793v.94531h-1.3418c-.85666 0-1.5379.21084-2.0391.63477-.50142.42392-.75195.99502-.75195 1.707 0 .67372.17358 1.2075.51758 1.6035.34613.39445.83497.5918 1.4707.5918.45462 0 .86723-.12355 1.2383-.37305.37166-.24767.67317-.56424.90625-.94531 0 .17413.01089.34527.03125.51758.02097.16927.053163.38614.095703.65234h.88867c-.062302-.24767-.10234-.49621-.12695-.75391-.02401-.25436-.037109-.52051-.037109-.79492v-3.7676c0-.80622-.21809-1.4265-.65234-1.8613-.43669-.43061-1.0083-.64648-1.7188-.64648zm7.1152 0c-.45462 0-.85109.11505-1.1875.3457-.33519.23369-.60486.56357-.80664.99023l-.074219-1.1934h-.75195v7.6816h.85352v-5.5293c.11791-.47346.31244-.84655.58594-1.1191.27168-.27107.63379-.4082 1.082-.4082.4689 0 .83314.19466 1.0957.58789.26378.39323.39258 1.0508.39258 1.9707v4.498h.85351v-4.6211-.19922c.0623-.64455.23396-1.1785.51172-1.6055.27927-.42696.66855-.63672 1.166-.63672.47285 0 .83879.19223 1.0938.57422.25345.38138.38281 1.0443.38281 1.9863v4.502h.85742v-4.4863c0-1.1332-.18468-1.9728-.55664-2.5195-.37044-.54548-.89268-.81836-1.5664-.81836-.48897 0-.91182.1465-1.2598.43945-.34796.29234-.61537.69589-.80469 1.207-.148-.55369-.38151-.966-.69726-1.2383-.31543-.2732-.70589-.4082-1.1699-.4082zm10.316 0c-.74423-.000001-1.3797.32125-1.9082.96094-.52725.64273-.78906 1.4505-.78906 2.4199v1.2754c0 .96758.26259 1.762.7871 2.3828.52604.62206 1.2032.93359 2.0312.93359.5157 0 .95833-.090281 1.3242-.26562.36679-.17626.66658-.41287.89844-.70703l-.34961-.60547c-.21728.27441-.4784.4836-.7832.63281-.3048.14586-.66987.2207-1.0898.2207-.60443 0-1.0864-.24489-1.4414-.74023-.35433-.49412-.53321-1.1138-.53321-1.8574v-.63867h4.3965v-.84375c0-.96667-.22381-1.7371-.66992-2.3105-.44519-.57253-1.0684-.85742-1.873-.85742zm9.4727 0c-.74423-.000001-1.3782.32125-1.9082.96094-.52603.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26241 1.762.78906 2.3828.52512.62206 1.2028.93359 2.0312.93359.51601 0 .95639-.090281 1.3223-.26562.36741-.17626.66822-.41287.90039-.70703l-.34766-.60547c-.21972.27441-.4811.4836-.78711.63281-.30389.14586-.66639.2207-1.0879.2207-.60656 0-1.0883-.24489-1.4414-.74023-.35646-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3945v-.84375c0-.96667-.22338-1.7371-.66797-2.3105-.44398-.57253-1.0699-.85742-1.873-.85742zm6.8672 0c-.45614 0-.85274.12451-1.1894.36914-.33975.24342-.60962.5923-.81445 1.043l-.07031-1.2695h-.76172v7.6816h.85351v-5.4824c.14617-.47923.36569-.85918.66016-1.1445.29325-.28809.65767-.42969 1.0938-.42969.48622 0 .85922.17765 1.1133.5332.25557.35555.38477.96807.38477 1.8457v4.6777h.85937v-4.6855c0-1.0736-.18381-1.866-.55273-2.375-.36497-.50993-.89-.76367-1.5762-.76367zm6.2539 0c-.77674 0-1.386.32888-1.8242.98437-.44186.65883-.66211 1.5326-.66211 2.6211l.00196 1.0508c0 1.0031.21834 1.8072.65625 2.4102.43699.60413 1.0429.90625 1.8144.90625.41602 0 .78387-.091234 1.0996-.27539.31695-.18324.58484-.4491.80273-.79492v.92969c0 .75881-.14785 1.3303-.4414 1.7266-.29235.39111-.74301.58789-1.3535.58789-.30359 0-.59763-.04082-.88086-.125-.28565-.081443-.54279-.19619-.77344-.3457l-.23632.74805c.27047.15164.57916.27315.92773.36523.34795.092075.67388.13867.97656.13867.84208 0 1.494-.27297 1.9531-.81055.45857-.53971.68554-1.3009.68554-2.2852v-7.6895h-.72265l-.08399 1.0684c-.21485-.38533-.48269-.68758-.80664-.89453-.32334-.2109-.70159-.31641-1.1328-.31641zm10.467 0c-.45401 0-.85062.12451-1.1895.36914-.33914.24342-.60902.5923-.81445 1.043l-.07031-1.2695h-.75977v7.6816h.85352v-5.4824c.14556-.47923.3663-.85918.66016-1.1445.29295-.28809.65797-.42969 1.0937-.42969.48775 0 .85711.17765 1.1133.5332.25496.35555.38476.96807.38476 1.8457v4.6777h.85742v-4.6855c0-1.0736-.18081-1.866-.54882-2.375-.36588-.50993-.8939-.76367-1.5801-.76367zm6.4043 0c-.74271-.000001-1.3778.32125-1.9062.96094-.52724.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26334 1.762.78906 2.3828.52361.62206 1.2007.93359 2.0312.93359.5154 0 .9567-.090281 1.3223-.26562.3668-.17626.6667-.41287.90039-.70703l-.34961-.60547c-.2194.27441-.47958.4836-.78711.63281-.30359.14586-.66597.2207-1.0859.2207-.60717 0-1.089-.24489-1.4434-.74023-.35464-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3965v-.84375c0-.96667-.22369-1.7371-.66797-2.3105-.44551-.57253-1.0709-.85742-1.875-.85742zm-12.113.14258v7.6816h.85938v-7.6816zm-27.352.60938c.53029 0 .9445.20789 1.2441.62695.29781.41876.44531.94616.44531 1.5801v.33008h-3.543c.01429-.71688.19281-1.3186.53711-1.8066.34401-.48622.78217-.73047 1.3164-.73047zm9.4727 0c.52998 0 .94406.20789 1.2422.62695.29963.41876.44727.94616.44727 1.5801v.33008h-3.543c.0155-.71688.19298-1.3186.53516-1.8066.3437-.48622.7826-.73047 1.3184-.73047zm29.992 0c.53089 0 .94602.20789 1.2441.62695.29902.41876.44532.94616.44532 1.5801v.33008h-3.543c.01519-.71688.19402-1.3186.53711-1.8066.34218-.48622.78064-.73047 1.3164-.73047zm-16.686.015625c.42119 0 .77033.1246 1.0469.375.27684.25466.4967.58706.65625.99609v3.8047c-.16593.39718-.39.70872-.67383.93359-.28475.22488-.63089.33594-1.043.33594-.6014 0-1.0536-.22975-1.3496-.69531-.29964-.4613-.44727-1.0819-.44727-1.8613v-1.0508c0-.84177.15149-1.527.45508-2.0527.30146-.52482.75528-.78516 1.3555-.78516zm-40.057 3.3281h1.3652v1.6621c-.15286.42089-.40964.76752-.77734 1.041-.3671.27228-.78783.40625-1.2598.40625-.39262 0-.69782-.12824-.91602-.38867-.2185-.25952-.32617-.59591-.32617-1.0059 0-.48531.17262-.89402.52148-1.2207.34795-.32881.81215-.49414 1.3926-.49414z" fill="#e0e0e0"/><path d="m27 3c-3.0948.68801-6.1571 1.6452-9.0273 3.0898.06564 2.5344.23035 4.963.5625 7.4297-1.1147.71414-2.287 1.3281-3.3281 2.1641-1.0578.81382-2.1378 1.5912-3.0957 2.543-1.9136-1.2657-3.9389-2.454-6.0254-3.5039-2.2491 2.4205-4.3524 5.0317-6.0703 7.9551 1.2924 2.0908 2.6428 4.0523 4.0996 5.9121h.041016v14.438 1.834 1.6699c.03282.000304.06514.000806.097656.003906l11 1.0605c.57617.05561 1.0282.52027 1.0684 1.0977l.33789 4.8555 9.5957.68359.66016-4.4805c.0857-.58104.58415-1.0117 1.1719-1.0117h11.605c.58742 0 1.0862.43068 1.1719 1.0117l.66016 4.4805 9.5957-.68359.33789-4.8555c.04042-.57739.49219-1.0417 1.0684-1.0977l10.996-1.0605c.032519-.003.064836-.003606.097656-.003906v-1.4316l.003906-.001953v-16.508h.041016c1.4571-1.8598 2.8066-3.8214 4.0996-5.9121-1.7173-2.9234-3.8232-5.5346-6.0723-7.9551-2.0859 1.0499-4.1118 2.2382-6.0254 3.5039-.95756-.95178-2.0363-1.7292-3.0957-2.543-1.0408-.836-2.2136-1.4499-3.3262-2.1641.33124-2.4667.49656-4.8952.5625-7.4297-2.8706-1.4447-5.933-2.4018-9.0293-3.0898-1.2362 2.0777-2.367 4.3278-3.3516 6.5273-1.1675-.1951-2.3391-.26727-3.5137-.28125v-.0019532c-.0082 0-.016447.0019531-.023437.0019532-.0073 0-.014194-.0019532-.021484-.0019532v.0019532c-1.1767.013979-2.3497.086153-3.5176.28125-.98399-2.1996-2.1135-4.4497-3.3516-6.5273zm-22.863 45.904c.0045599 1.063.019531 2.2271.019531 2.459 0 10.446 13.251 15.468 29.715 15.525h.019531.019531c16.464-.05774 29.711-5.0795 29.711-15.525 0-.23612.014661-1.3954.019531-2.459l-9.8867.95312-.3418 4.8809c-.04102.58833-.50933 1.0574-1.0977 1.0996l-11.717.83594c-.02857.0021-.055724.003906-.083984.003906-.58225 0-1.0859-.42704-1.1719-1.0117l-.67188-4.5566h-9.5586l-.67188 4.5566c-.09025.61325-.63836 1.0531-1.2559 1.0078l-11.717-.83594c-.58833-.04224-1.0566-.51128-1.0977-1.0996l-.3418-4.8809-9.8906-.95312z" fill="#478cbf"/><path d="m18.299 29.246c-3.6594 0-6.6289 2.9669-6.6289 6.627 0 3.6625 2.9695 6.6289 6.6289 6.6289 3.6613 0 6.627-2.9664 6.627-6.6289 0-3.66-2.9657-6.627-6.627-6.627zm31.186 0c-3.6619 0-6.6289 2.9669-6.6289 6.627 0 3.6625 2.967 6.6289 6.6289 6.6289 3.6591 0 6.627-2.9664 6.627-6.6289 0-3.66-2.9678-6.627-6.627-6.627zm-15.594 3.8789c-1.1785 0-2.1348.86781-2.1348 1.9375v6.1035c0 1.0706.95628 1.9395 2.1348 1.9395s2.1348-.86885 2.1348-1.9395v-6.1035c0-1.0697-.95628-1.9375-2.1348-1.9375z" fill="#f6f6f6"/><path d="m18.932 31.865c-2.4299 0-4.4004 1.9711-4.4004 4.4004s1.9705 4.3984 4.4004 4.3984c2.4311 0 4.4004-1.9691 4.4004-4.3984s-1.9693-4.4004-4.4004-4.4004zm29.916 0c-2.4293 0-4.3984 1.9711-4.3984 4.4004s1.9691 4.3984 4.3984 4.3984c2.4317 0 4.4004-1.9691 4.4004-4.3984s-1.9687-4.4004-4.4004-4.4004z" fill="#414042"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_loop.svg b/editor/icons/icon_loop.svg
deleted file mode 100644
index bbb8dadc06..0000000000
--- a/editor/icons/icon_loop.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1v2h-2a5 5 0 0 0 -5 5 5 5 0 0 0 1.0039 2.9961l1.4355-1.4355a3 3 0 0 1 -.43945-1.5605 3 3 0 0 1 3-3h2v2l2-1.5 2-1.5-2-1.5-2-1.5zm5.9961 4.0039-1.4355 1.4355a3 3 0 0 1 .43945 1.5605 3 3 0 0 1 -3 3h-2v-2l-2 1.5-2 1.5 2 1.5 2 1.5v-2h2a5 5 0 0 0 5-5 5 5 0 0 0 -1.0039-2.9961z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_loop_interpolation.svg b/editor/icons/icon_loop_interpolation.svg
deleted file mode 100644
index 052a34ab36..0000000000
--- a/editor/icons/icon_loop_interpolation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1v2h-2a2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.0019531v.046875 5.2246a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -1-1.7305v-3.2695-2h2v2l4-3-4-3zm7 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v3.2695 2h-2v-2l-4 3 4 3v-2h2a2 2 0 0 0 1.7324-1 2 2 0 0 0 .26562-1h.001953v-5.2715a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_main_play.svg b/editor/icons/icon_main_play.svg
deleted file mode 100644
index 5fd62b9453..0000000000
--- a/editor/icons/icon_main_play.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1048.4v-8l7 4z" fill="#e0e0e0" fill-rule="evenodd" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_margin_container.svg b/editor/icons/icon_margin_container.svg
deleted file mode 100644
index f11b415c06..0000000000
--- a/editor/icons/icon_margin_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5efac" 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 2h10v10h-10z" transform="translate(0 1036.4)"/><path d="m4 1042.4v4l2-2z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_match_case.svg b/editor/icons/icon_match_case.svg
deleted file mode 100644
index 1b348f3d46..0000000000
--- a/editor/icons/icon_match_case.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1c-2.2091-.00000066-4.069 1.7919-4 4v10h2v-4h4v4h2v-10c0-2.2091-1.7909-4-4-4zm5 11c0 1.6569 1.3431 3 3 3 .3409-.0014.67908-.0608 1-.17578v.17578h2v-6c0-1.6569-1.3431-3-3-3h-1v2h1c.55228 0 1 .44772 1 1v.17383c-.32104-.11432-.65921-.1731-1-.17383-1.6569 0-3 1.3431-3 3zm-5-9c1.1046-.0000001 1.914.89879 2 2v4h-4v-4c0-1.1046.89543-2 2-2zm8 8c.55228 0 1 .44772 1 1s-.44772 1-1 1-1-.44772-1-1 .44772-1 1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_cube.svg b/editor/icons/icon_material_preview_cube.svg
deleted file mode 100644
index 7992ce05c1..0000000000
--- a/editor/icons/icon_material_preview_cube.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3v-8z" fill="#d5d5d5" transform="translate(0 1036.4)"/><path d="m1 1040.4 7 3 7-3-7-3z" fill="#fff"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#e0e0e0"/><path d="m8 1051.4 7-3v-8l-7 3z" fill="#d5d5d5"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_cube_off.svg b/editor/icons/icon_material_preview_cube_off.svg
deleted file mode 100644
index 6dfe169eae..0000000000
--- a/editor/icons/icon_material_preview_cube_off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m8 1-7 3v8l7 3 7-3v-8z" fill="#d5d5d5" transform="translate(0 1036.4)"/><path d="m1 1040.4 7 3 7-3-7-3z" fill="#fff"/><path d="m8 1051.4-7-3v-8l7 3z" fill="#e0e0e0"/><path d="m8 1051.4 7-3v-8l-7 3z" fill="#d5d5d5"/><path d="m8 1037.4-7 3v8l7 3 7-3v-8z" fill-opacity=".23529"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_light_1.svg b/editor/icons/icon_material_preview_light_1.svg
deleted file mode 100644
index 3003793013..0000000000
--- a/editor/icons/icon_material_preview_light_1.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v1 5h-1v-5h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_light_1_off.svg b/editor/icons/icon_material_preview_light_1_off.svg
deleted file mode 100644
index 6948e3d77e..0000000000
--- a/editor/icons/icon_material_preview_light_1_off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v1 5h-1v-5h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill-opacity=".23529"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_light_2.svg b/editor/icons/icon_material_preview_light_2.svg
deleted file mode 100644
index 08c05379e4..0000000000
--- a/editor/icons/icon_material_preview_light_2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v2 1h-2v1h2v1h-2-1v-2-1h2v-1h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_light_2_off.svg b/editor/icons/icon_material_preview_light_2_off.svg
deleted file mode 100644
index cc48927ece..0000000000
--- a/editor/icons/icon_material_preview_light_2_off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v2 1h-2v1h2v1h-2-1v-2-1h2v-1h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill="#e0e0e0"/><path d="m7 1v2h2v-2zm-3.2422 1.3438-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.2422 1.6562a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm-1 1h2v2 1h-2v1h2v1h-2-1v-2-1h2v-1h-1zm-6 2v2h2v-2zm12 0v2h2v-2zm-9.2422 3.8281-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm8.4844 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-5.2422 2.1719v2h2v-2z" fill-opacity=".23529"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_sphere.svg b/editor/icons/icon_material_preview_sphere.svg
deleted file mode 100644
index 4f4ef67e20..0000000000
--- a/editor/icons/icon_material_preview_sphere.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-2 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_material_preview_sphere_off.svg b/editor/icons/icon_material_preview_sphere_off.svg
deleted file mode 100644
index f702b4fd27..0000000000
--- a/editor/icons/icon_material_preview_sphere_off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-2 2a2 2 0 0 1 2 2 2 2 0 0 1 -2 2 2 2 0 0 1 -2-2 2 2 0 0 1 2-2z" fill-opacity=".23529"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_member_constant.svg b/editor/icons/icon_member_constant.svg
deleted file mode 100644
index ec82749cf4..0000000000
--- a/editor/icons/icon_member_constant.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.135 3.002c-1.5244-.04132-2.9843.61528-3.9648 1.7832-1.5607 1.8591-1.5607 4.5706 0 6.4297 1.5599 1.8584 4.229 2.3286 6.3301 1.1152l-1.0039-1.7363c-.45449.26416-.97042.40425-1.4961.40625-1.6569 0-3-1.3431-3-3-.0000001-1.6569 1.3431-3 3-3 .5255.0014061 1.0414.14082 1.4961.4043l1.0039-1.7344c-.72056-.41598-1.5335-.64557-2.3652-.66797zm-7.1348 7.998c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_member_method.svg b/editor/icons/icon_member_method.svg
deleted file mode 100644
index ea5c64482c..0000000000
--- a/editor/icons/icon_member_method.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6.0215 3c-.40133-.0028518-.79916.074854-1.1699.22852-1.1208.46444-1.8516 1.5582-1.8516 2.7715v7h2v-3h2v-2h-2v-2c0-.55228.44772-1 1-1 .2652.0000401.51953.10542.70703.29297l1.4141-1.4141c-.55724-.5574-1.3115-.87312-2.0996-.87891zm2.9785 3c-1.3263 2.6586-1.3404 4.3252 0 7h2c-1.3404-2.6748-1.3263-4.3414 0-7zm4 0c1.3263 2.6586 1.3404 4.3252 0 7h2c1.3404-2.6748 1.3263-4.3414 0-7zm-12 5a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_member_property.svg b/editor/icons/icon_member_property.svg
deleted file mode 100644
index 4b6b7ab5df..0000000000
--- a/editor/icons/icon_member_property.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 4v9h2v-3h1c1.6569 0 3-1.3431 3-3s-1.3431-3-3-3zm2 2h1c.55228 0 1 .44772 1 1s-.44798.98275-1 1h-1zm-5 5c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_member_signal.svg b/editor/icons/icon_member_signal.svg
deleted file mode 100644
index 5159e4acd7..0000000000
--- a/editor/icons/icon_member_signal.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c4.4301 0 8 3.5699 8 8a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-5.511-4.489-10-10-10zm0 4a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c2.221 0 4 1.779 4 4a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-3.3018-2.6981-6-6-6zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-5 2c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_member_theme.svg b/editor/icons/icon_member_theme.svg
deleted file mode 100644
index 7aaaf2b808..0000000000
--- a/editor/icons/icon_member_theme.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke-width="0"><path d="m3 11c-.55228 0-1 .44772-1 1-.0000001.55228.44772 1 1 1s1-.44772 1-1c.0000001-.55228-.44772-1-1-1z"/><path d="m10 2c-2.4 4-4 4.7909-4 7s1.8297 4 4 4 4-1.7909 4-4-1.6-3-4-7z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_menu_button.svg b/editor/icons/icon_menu_button.svg
deleted file mode 100644
index 8c23927783..0000000000
--- a/editor/icons/icon_menu_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h14v-4zm5 1h4l-2 2zm-4 4a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1zm1 2h10v2h-10zm0 3h10v2h-10z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mesh.svg b/editor/icons/icon_mesh.svg
deleted file mode 100644
index 0fb9e74584..0000000000
--- a/editor/icons/icon_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -1.0312-1.75h.03125v-6.5215a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm2.4141 3h5.8574a2 2 0 0 0 .72852.73047v5.8555l-6.5859-6.5859zm-1.4141 1.4141 6.5859 6.5859h-5.8574a2 2 0 0 0 -.72852-.73047v-5.8555z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mesh_instance.svg b/editor/icons/icon_mesh_instance.svg
deleted file mode 100644
index 68344b7dbd..0000000000
--- a/editor/icons/icon_mesh_instance.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -1.0312-1.75h.03125v-6.5215a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm2.4141 3h5.8574a2 2 0 0 0 .72852.73047v5.8555l-6.5859-6.5859zm-1.4141 1.4141 6.5859 6.5859h-5.8574a2 2 0 0 0 -.72852-.73047v-5.8555z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mesh_instance_2d.svg b/editor/icons/icon_mesh_instance_2d.svg
deleted file mode 100644
index a173d02771..0000000000
--- a/editor/icons/icon_mesh_instance_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -1.0312-1.75h.03125v-6.5215a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm2.4141 3h5.8574a2 2 0 0 0 .72852.73047v5.8555l-6.5859-6.5859zm-1.4141 1.4141 6.5859 6.5859h-5.8574a2 2 0 0 0 -.72852-.73047v-5.8555z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mesh_library.svg b/editor/icons/icon_mesh_library.svg
deleted file mode 100644
index 13ae8fece7..0000000000
--- a/editor/icons/icon_mesh_library.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h2.2695v-2h-2.2715a2 2 0 0 0 -.72852-.73047v-5.8555l3 3v-.41406a2.0002 2.0002 0 0 1 .80859-1.6055l-2.3945-2.3945h5.8574a2 2 0 0 0 .72852.73047v1.2695a2.0002 2.0002 0 0 1 .99805.27148 2.0002 2.0002 0 0 1 1.002-.27148v-1.2715a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm6 7v1 5 1h5c.55228 0 1-.4477 1-1v-5c0-.5523-.44772-1-1-1v4l-1-1-1 1v-4z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mesh_texture.svg b/editor/icons/icon_mesh_texture.svg
deleted file mode 100644
index b3beff05c0..0000000000
--- a/editor/icons/icon_mesh_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2 .0005649.71397.38169 1.3735 1 1.7305v6.541c-.61771.35663-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.000565 1.3735-.38169 1.7305-1h6.541c.35663.61771 1.0152.99874 1.7285 1 1.1046 0 2-.89543 2-2 .000101-.72747-.39481-1.3976-1.0312-1.75h.03125v-6.5215c.61771-.35663.99874-1.0152 1-1.7285 0-1.1046-.89543-2-2-2-.71397.0005648-1.3735.38169-1.7305 1h-6.541c-.35663-.61771-1.0152-.99874-1.7285-1zm1.7266 3h.6875 5.168.68945c.17478.30301.42598.55488.72852.73047v.68359 5.1719.68555c-.30301.17478-.55488.42598-.73047.72852h-.68359-5.1719-.68555c-.17478-.30301-.42598-.55488-.72852-.73047v-.6875l-.0039062.003907v-5.8574c.30302-.17478.55488-.42598.73047-.72852zm4.0859 2.25v.70117h-.8125v.69922h-1.625v.69922h-.8125v.69922h-.8125v.70117h1.625 1.625 1.625 1.625v-1.4004h-.8125v-1.3984h-.8125v-.70117h-.8125z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mini_object.svg b/editor/icons/icon_mini_object.svg
deleted file mode 100644
index 0b34a9fdbb..0000000000
--- a/editor/icons/icon_mini_object.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2v8h2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3v-2zm0 5a3 3 0 0 0 -3-3 3 3 0 0 0 -3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3zm7-3v5a1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 3-3v-5zm-10 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm5 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#79f3e8"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mirror_x.svg b/editor/icons/icon_mirror_x.svg
deleted file mode 100644
index 445a4e058d..0000000000
--- a/editor/icons/icon_mirror_x.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.4)"><path d="m4 1042.4-2 2 2 2" stroke-linecap="round" stroke-linejoin="round"/><path d="m2 1044.4h11"/><path d="m12 1042.4 2 2-2 2" stroke-linecap="round" stroke-linejoin="round"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mirror_y.svg b/editor/icons/icon_mirror_y.svg
deleted file mode 100644
index ebfcf8cabd..0000000000
--- a/editor/icons/icon_mirror_y.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11.012 1048.4a1.0001 1.0001 0 0 0 -1.7168-.6973l-.29297.293v-7.1719l.29297.293a1.0001 1.0001 0 0 0 1.7148-.7266 1.0001 1.0001 0 0 0 -.30078-.6875l-2-2a1.0001 1.0001 0 0 0 -1.4141 0l-2 2a1.0001 1.0001 0 1 0 1.4141 1.4141l.29297-.293v7.1719l-.29297-.293a1.0001 1.0001 0 1 0 -1.4141 1.4141l2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .30273-.7168z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_mouse.svg b/editor/icons/icon_mouse.svg
deleted file mode 100644
index 571288675a..0000000000
--- a/editor/icons/icon_mouse.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1.1016a5 5 0 0 0 -4 4.8984h4zm2 .0039063v4.8945h4a5 5 0 0 0 -4-4.8945zm-6 6.8945v2a5 5 0 0 0 5 5 5 5 0 0 0 5-5v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_move_down.svg b/editor/icons/icon_move_down.svg
deleted file mode 100644
index ba0c5d80ba..0000000000
--- a/editor/icons/icon_move_down.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a1.0001 1.0001 0 1 0 0 2h4a1.0001 1.0001 0 1 0 0-2zm2 4c-.55231 0-1 .4477-1 1v5.1484l-2.2188-2.7734c-.34504-.4317-.97482-.50165-1.4062-.15625-.4305.3449-.5004.9732-.15625 1.4043l4 5c.18868.2369.4745.37695.77734.37695.30559.0009.59477-.13795.78516-.37695l4-5c.34415-.4311.27424-1.0594-.15625-1.4043-.43143-.3454-1.0612-.27545-1.4062.15625l-2.2188 2.7734v-5.1484c0-.5523-.44769-1-1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_move_left.svg b/editor/icons/icon_move_left.svg
deleted file mode 100644
index f4ad280ae1..0000000000
--- a/editor/icons/icon_move_left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 10a1.0001 1.0001 0 1 1 -2 0v-4a1.0001 1.0001 0 1 1 2 0zm-4-2c0 .55231-.4477 1-1 1h-5.1484l2.7734 2.2188c.4317.34504.50165.97482.15625 1.4062-.3449.4305-.9732.5004-1.4043.15625l-5-4c-.2369-.18868-.37695-.4745-.37695-.77734-.0009-.30559.13795-.59477.37695-.78516l5-4c.4311-.34415 1.0594-.27424 1.4043.15625.3454.43143.27545 1.0612-.15625 1.4062l-2.7734 2.2188h5.1484c.5523 0 1 .44769 1 1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_move_point.svg b/editor/icons/icon_move_point.svg
deleted file mode 100644
index a8c11e7cb3..0000000000
--- a/editor/icons/icon_move_point.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 1.2129-.10742l-2.5996-6.3203a1.5002 1.5002 0 0 1 1.3711-2.0703v-.0019531a1.5002 1.5002 0 0 1 .58594.11133l6.3184 2.5996a7 7 0 0 0 .11133-1.2109 7 7 0 0 0 -7-7zm2.7559 9.7559.52344 1.2734a1.5002 1.5002 0 0 1 .48047-.26953 1.5002 1.5002 0 0 1 .26953-.47852l-1.2734-.52539z" fill="#fff" transform="translate(0 1036.4)"/><path d="m8 3a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 .42578-.021484l-1.8125-4.4063a1.5002 1.5002 0 0 1 1.3711-2.0703v-.0019531a1.5002 1.5002 0 0 1 .58594.11133l4.4082 1.8125a5 5 0 0 0 .021484-.42383 5 5 0 0 0 -5-5zm2.7559 7.7559.44336 1.0801a5 5 0 0 0 .63867-.63281l-1.082-.44727z" fill="#ff8484" transform="translate(0 1036.4)"/><path d="m16 1047.7-8-3.291 3.291 8 .9471-2.8201 1.8836 1.8835.9418-.9418-1.8836-1.8835z" fill="#e0e0e0"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_move_right.svg b/editor/icons/icon_move_right.svg
deleted file mode 100644
index 4d1c3b1145..0000000000
--- a/editor/icons/icon_move_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 10a1.0001 1.0001 0 1 0 2 0v-4a1.0001 1.0001 0 1 0 -2 0zm4-2c0 .55231.4477 1 1 1h5.1484l-2.7734 2.2188c-.4317.34504-.50165.97482-.15625 1.4062.3449.4305.9732.5004 1.4043.15625l5-4c.2369-.18868.37695-.4745.37695-.77734.0009-.30559-.13795-.59477-.37695-.78516l-5-4c-.4311-.34415-1.0594-.27424-1.4043.15625-.3454.43143-.27545 1.0612.15625 1.4062l2.7734 2.2188h-5.1484c-.5523 0-1 .44769-1 1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_move_up.svg b/editor/icons/icon_move_up.svg
deleted file mode 100644
index 87c7834597..0000000000
--- a/editor/icons/icon_move_up.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 15a1.0001 1.0001 0 1 1 0-2h4a1.0001 1.0001 0 1 1 0 2zm2-4c-.55231 0-1-.4477-1-1v-5.1484l-2.2188 2.7734c-.34504.4317-.97482.50165-1.4062.15625-.4305-.3449-.5004-.9732-.15625-1.4043l4-5c.18868-.2369.4745-.37695.77734-.37695.30559-.0009.59477.13795.78516.37695l4 5c.34415.4311.27424 1.0594-.15625 1.4043-.43143.3454-1.0612.27545-1.4062-.15625l-2.2188-2.7734v5.1484c0 .5523-.44769 1-1 1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_multi_edit.svg b/editor/icons/icon_multi_edit.svg
deleted file mode 100644
index 9a5b3237b2..0000000000
--- a/editor/icons/icon_multi_edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1zm8 1v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_multi_line.svg b/editor/icons/icon_multi_line.svg
deleted file mode 100644
index dd79bb50d8..0000000000
--- a/editor/icons/icon_multi_line.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h7v-2zm9 0v2h5v-2zm-9 4v2h11v-2zm0 4v2h4v-2zm6 0v2h8v-2zm-6 4v2h13v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_multi_mesh.svg b/editor/icons/icon_multi_mesh.svg
deleted file mode 100644
index d317129ef4..0000000000
--- a/editor/icons/icon_multi_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2 .0005649.71397.38169 1.3735 1 1.7305v6.541c-.61771.35663-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.000565 1.3735-.38169 1.7305-1h1.2695v-2h-1.2715c-.17478-.30301-.42598-.55488-.72852-.73047v-5.8555l3.5859 3.5859h1.4141v-1.4141l-3.5859-3.5859h5.8574c.17532.30158.42647.55205.72852.72656v1.2734h2v-1.2695c.61831-.35698.99944-1.0165 1-1.7305 0-1.1046-.89543-2-2-2-.71397.0005648-1.3735.38169-1.7305 1h-6.541c-.35663-.61771-1.0152-.99874-1.7285-1zm8 7v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_multi_mesh_instance.svg b/editor/icons/icon_multi_mesh_instance.svg
deleted file mode 100644
index c114a725db..0000000000
--- a/editor/icons/icon_multi_mesh_instance.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2 .0005649.71397.38169 1.3735 1 1.7305v6.541c-.61771.35663-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.000565 1.3735-.38169 1.7305-1h1.2695v-2h-1.2715c-.17478-.30301-.42598-.55488-.72852-.73047v-5.8555l3.5859 3.5859h1.4141v-1.4141l-3.5859-3.5859h5.8574c.17532.30158.42647.55205.72852.72656v1.2734h2v-1.2695c.61831-.35698.99944-1.0165 1-1.7305 0-1.1046-.89543-2-2-2-.71397.0005648-1.3735.38169-1.7305 1h-6.541c-.35663-.61771-1.0152-.99874-1.7285-1zm8 7v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_multi_mesh_instance_2d.svg b/editor/icons/icon_multi_mesh_instance_2d.svg
deleted file mode 100644
index 6c54a63ae2..0000000000
--- a/editor/icons/icon_multi_mesh_instance_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m-1-1h582v402h-582z" fill="none"/><path d="m3 1c-1.1046 0-2 .89543-2 2 .00056.71397.38169 1.3735 1 1.7305v6.541c-.61771.35664-.99874 1.0152-1 1.7285 0 1.1046.89543 2 2 2 .71397-.00056 1.3735-.38169 1.7305-1h1.2695v-2h-1.2715c-.17478-.30301-.42598-.55488-.72852-.73047v-5.8555l3.5859 3.5859h1.4141v-1.4141l-3.5859-3.5859h5.8574c.17532.30158.42647.55205.72852.72656v1.2734h2v-1.2695c.61831-.35698.99944-1.0165 1-1.7305 0-1.1046-.89543-2-2-2-.71397.00056-1.3735.38169-1.7305 1h-6.541c-.35664-.61771-1.0152-.99874-1.7285-1zm8 7v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#a5b7f3" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_navigation.svg b/editor/icons/icon_navigation.svg
deleted file mode 100644
index d5a8f8618b..0000000000
--- a/editor/icons/icon_navigation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1050.4 5-2 5 2-5-12z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_navigation_2d.svg b/editor/icons/icon_navigation_2d.svg
deleted file mode 100644
index 79dc532aee..0000000000
--- a/editor/icons/icon_navigation_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1050.4 5-2 5 2-5-12z" fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_navigation_mesh.svg b/editor/icons/icon_navigation_mesh.svg
deleted file mode 100644
index 9bc4a00d53..0000000000
--- a/editor/icons/icon_navigation_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h2.5078l.75-2h-3.2598a2 2 0 0 0 -.72852-.73047v-5.8555l4.6973 4.6973.77148-2.0566-4.0547-4.0547h5.8574a2 2 0 0 0 .72852.73047v.27148a2.0002 2.0002 0 0 1 .023438 0 2.0002 2.0002 0 0 1 1.8496 1.2969l.12695.33789v-1.9082a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm9 6-3 8 3-2 3 2z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_navigation_mesh_instance.svg b/editor/icons/icon_navigation_mesh_instance.svg
deleted file mode 100644
index 737d9c319d..0000000000
--- a/editor/icons/icon_navigation_mesh_instance.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v6.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h2.5078l.75-2h-3.2598a2 2 0 0 0 -.72852-.73047v-5.8555l4.6973 4.6973.77148-2.0566-4.0547-4.0547h5.8574a2 2 0 0 0 .72852.73047v.27148a2.0002 2.0002 0 0 1 .023438 0 2.0002 2.0002 0 0 1 1.8496 1.2969l.12695.33789v-1.9082a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -1.7285-1zm9 6-3 8 3-2 3 2z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_navigation_polygon.svg b/editor/icons/icon_navigation_polygon.svg
deleted file mode 100644
index df2ddb07f6..0000000000
--- a/editor/icons/icon_navigation_polygon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h4.9023a2.1002 2.1002 0 0 1 .13086-.73633l.47461-1.2637h-4.5078v-10h8.5859l-4.293 4.293a1.0001 1.0001 0 0 0 0 1.4141l1.3262 1.3262 1.4141-3.7695a2.1002 2.1002 0 0 1 1.9922-1.3613 2.1002 2.1002 0 0 1 .43555.050781l2.2461-2.2461a1.0001 1.0001 0 0 0 -.70703-1.707h-12z" transform="translate(0 1036.4)"/><path d="m15 1051.4-3-8-3 8 3-2z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_navigation_polygon_instance.svg b/editor/icons/icon_navigation_polygon_instance.svg
deleted file mode 100644
index e16d10614e..0000000000
--- a/editor/icons/icon_navigation_polygon_instance.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h4.9023a2.1002 2.1002 0 0 1 .13086-.73633l.47461-1.2637h-4.5078v-10h8.5859l-4.293 4.293a1.0001 1.0001 0 0 0 0 1.4141l1.3262 1.3262 1.4141-3.7695a2.1002 2.1002 0 0 1 1.9922-1.3613 2.1002 2.1002 0 0 1 .43555.050781l2.2461-2.2461a1.0001 1.0001 0 0 0 -.70703-1.707h-12z" transform="translate(0 1036.4)"/><path d="m15 1051.4-3-8-3 8 3-2z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_new.svg b/editor/icons/icon_new.svg
deleted file mode 100644
index a3199e3fba..0000000000
--- a/editor/icons/icon_new.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.400017)"><path d="m2 1v14h8v-1h-2v-4h2v-2h4v-2h-5v-5zm8 0v4h4z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m11 1045.4v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_new_root.svg b/editor/icons/icon_new_root.svg
deleted file mode 100644
index d32777d507..0000000000
--- a/editor/icons/icon_new_root.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 4.7813475v2.0494746c-.6177049.3566305-.998733 1.0152377-1 1.7285 0 1.1045694.8954305 1.9999999 2 1.9999999.7139771-.000554 1.3735116-.381678 1.7305-.9999995h1.3545593c.3566306.6177035 1.0152377.9987325 1.7285.9999995 1.1045696 0 1.9999996-.8954305 1.9999996-1.9999999 0-1.1045695-.89543-2-1.9999996-2-.7139771.0005537-1.3735116.3816774-1.7305 1h-1.3545593c-.1747809-.3030102-.4259781-.5548798-.72852-.73047v-2.0494746c-.5384713.0290292-1.2982621.0368063-1.99998.00197z" fill="#e0e0e0"/><path d="m6.8474576 9.6288045v1.2020165c-.617705.35663-.998733 1.015237-1 1.7285 0 1.104569.89543 2 2 2 .713977-.000554 1.373512-.381678 1.7305-1h1.2867634c.35663.617704 1.015237.998733 1.7285 1 1.104569 0 1.999999-.895431 1.999999-2 0-1.10457-.89543-2-1.999999-2-.713977.000553-1.373512.381677-1.7305 1h-1.2867634c-.174781-.303011-.425978-.55488-.72852-.73047v-1.2020165s-1.264363.03681-1.99998.002z" fill="#e0e0e0"/><path d="m2.7966098 1.3559322c-1.104569 0-2.00000003.8954305-2.00000003 2 .000554.7139771.38167803 1.3735116 1.00000003 1.7305.757716.266212.949133.2840609 1.99998-.00197.617705-.3566306.998733-1.0152377 1-1.7285 0-1.1045695-.89543-2-2-2z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_nil.svg b/editor/icons/icon_nil.svg
deleted file mode 100644
index 04a29abaaa..0000000000
--- a/editor/icons/icon_nil.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2v2h2v-2zm4 0v5c0 1.6569 1.3431 3 3 3h1v-2h-1c-.55228-.0000096-.99999-.44772-1-1v-5zm-11 2v6h2v-4h1c.55228.0000096.99999.44772 1 1v3h2v-3c0-1.6569-1.3431-3-3-3zm7 2v4h2v-4z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_nine_patch_rect.svg b/editor/icons/icon_nine_patch_rect.svg
deleted file mode 100644
index c5b04ec049..0000000000
--- a/editor/icons/icon_nine_patch_rect.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5efac" transform="translate(0 -1036.4)"><path d="m1 1037.4h2v14h-2z"/><path d="m1 1049.4h14v2h-14z"/><path d="m1 1037.4h14v2h-14z"/><path d="m13 1037.4h2v14h-2z"/><path d="m1 1041.4h14v.99998h-14z"/><path d="m1 1046.4h14v.99998h-14z"/><g transform="rotate(90)"><path d="m1037.4-6h14v.99998h-14z"/><path d="m1037.4-11h14v.99998h-14z"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_node.svg b/editor/icons/icon_node.svg
deleted file mode 100644
index 93f0ce80b1..0000000000
--- a/editor/icons/icon_node.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_node_2d.svg b/editor/icons/icon_node_2d.svg
deleted file mode 100644
index 5ca5754daa..0000000000
--- a/editor/icons/icon_node_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_node_path.svg b/editor/icons/icon_node_path.svg
deleted file mode 100644
index 580283b75a..0000000000
--- a/editor/icons/icon_node_path.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v8h2v-2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3zm6 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2zm5 0v8h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3v-2zm-9 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1z" fill="#6993ec"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_node_warning.svg b/editor/icons/icon_node_warning.svg
deleted file mode 100644
index 587a49412e..0000000000
--- a/editor/icons/icon_node_warning.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0293 2.002a1.0001 1.0001 0 0 0 -.88672.48438l-6 10a1.0001 1.0001 0 0 0 .85742 1.5137h12a1.0001 1.0001 0 0 0 .85742-1.5137l-6-10a1.0001 1.0001 0 0 0 -.82812-.48438zm-1.0293 2.998h2v5h-2zm0 6h2v2h-2z" fill="#ffdd65" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_non_favorite.svg b/editor/icons/icon_non_favorite.svg
deleted file mode 100644
index eb0ebf052c..0000000000
--- a/editor/icons/icon_non_favorite.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1.7246-2.375 4.0977-4.625 1.0977 3.2363 3.4063-.35938 4.6738 4.1387-1.9766 4.1582 1.9414-.39648-4.6523 3.2227-3.3926-4.625-1.0977-2.375-4.0977zm0 2.2754 1.6582 2.7773 3.2324.74414-2.25 2.3008.27539 3.1543-2.9043-1.3164-2.8926 1.3398.25195-3.168-2.2617-2.3105 3.2324-.74414 1.6582-2.7773z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_object.svg b/editor/icons/icon_object.svg
deleted file mode 100644
index c3d1b47538..0000000000
--- a/editor/icons/icon_object.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm.037109 2.1172 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828zm-5 3.498 4 2v3.7656l-4-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_occluder_polygon_2d.svg b/editor/icons/icon_occluder_polygon_2d.svg
deleted file mode 100644
index 19244f35ca..0000000000
--- a/editor/icons/icon_occluder_polygon_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd" transform="translate(0 -1036.4)"><path d="m1 1045.4 6 6h8v-8l-6-6h-8z" fill="#3552b1"/><path d="m1 1037.4h8l-3 4 3 4h-8z" fill="#a5b7f3" fill-opacity=".98824"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_omni_light.svg b/editor/icons/icon_omni_light.svg
deleted file mode 100644
index 6fa0454e8c..0000000000
--- a/editor/icons/icon_omni_light.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 5 0 0 0 -5 5 5 5 0 0 0 3 4.5762v2.4238h4v-2.4199a5 5 0 0 0 3-4.5801 5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3 3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3zm-1 11v1h2v-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_onion.svg b/editor/icons/icon_onion.svg
deleted file mode 100644
index ff1376c316..0000000000
--- a/editor/icons/icon_onion.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2 2-7 4-7 8s3 6 7 6c-7-3-6.5995-7.703 0-13-2.2981 3.9516-5.4951 8.9197 0 13 4.8692-4.2391 2.7733-8.1815 1-12 5.5855 4.704 5.3995 8.6488-1 12 4 0 7-2 7-6s-5-6-7-8z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_option_button.svg b/editor/icons/icon_option_button.svg
deleted file mode 100644
index 6b4402481d..0000000000
--- a/editor/icons/icon_option_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h5 1 1 2 1c1.1046 0 2-.89543 2-2v-6c0-1.1046-.89543-2-2-2h-1-2-1-1zm8 2.9863a1.0001 1.0001 0 0 1 .7168 1.7207l-3 3a1.0001 1.0001 0 0 1 -1.4141 0l-3-3a1.0001 1.0001 0 0 1 .69727-1.7168 1.0001 1.0001 0 0 1 .7168.30273l2.293 2.293 2.293-2.293a1.0001 1.0001 0 0 1 .69727-.30664z" fill="#a5efac" transform="translate(0 1036.4)"/><path d="m4 1042.4h4v4h-4z" fill="none"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_overbright_indicator.svg b/editor/icons/icon_overbright_indicator.svg
deleted file mode 100644
index 9e6f53b727..0000000000
--- a/editor/icons/icon_overbright_indicator.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v10l10-10z" fill="#fff"/><path d="m0 12 12-12h-2l-10 10z" fill="#000003"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_override.svg b/editor/icons/icon_override.svg
deleted file mode 100644
index 2d8a1fb309..0000000000
--- a/editor/icons/icon_override.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.108 0-2 .89199-2 2v1h4v-1h2v1h4v-1c0-1.108-.89199-2-2-2zm-2 5c-1.108 0-2 .89199-2 2v5c0 1.108.89199 2 2 2h10c1.108 0 2-.89199 2-2v-5c0-1.108-.89199-2-2-2h-4v3h2l-3 4-3-4h2v-3z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_packed_data_container.svg b/editor/icons/icon_packed_data_container.svg
deleted file mode 100644
index 18bad53f66..0000000000
--- a/editor/icons/icon_packed_data_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v12a1.0001 1.0001 0 0 0 1 1h12a1.0001 1.0001 0 0 0 1-1v-12a1.0001 1.0001 0 0 0 -1-1zm1 2h10v10h-10zm1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-6 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_packed_scene.svg b/editor/icons/icon_packed_scene.svg
deleted file mode 100644
index 9c1d88db1c..0000000000
--- a/editor/icons/icon_packed_scene.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812zm-1.4258 3.2285v6c0 1.1046.89543 2 2 2h12v-8z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_paint_vertex.svg b/editor/icons/icon_paint_vertex.svg
deleted file mode 100644
index cab3716bf5..0000000000
--- a/editor/icons/icon_paint_vertex.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><ellipse cx="8.372881" cy="8.169492" fill="#fff" rx="6.677966" ry="6.067797"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panel.svg b/editor/icons/icon_panel.svg
deleted file mode 100644
index 10a67bae7e..0000000000
--- a/editor/icons/icon_panel.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panel_container.svg b/editor/icons/icon_panel_container.svg
deleted file mode 100644
index 08c5492f7e..0000000000
--- a/editor/icons/icon_panel_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h10v10h-10z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panels_1.svg b/editor/icons/icon_panels_1.svg
deleted file mode 100644
index 850aad2cff..0000000000
--- a/editor/icons/icon_panels_1.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h16v16h-16z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panels_2.svg b/editor/icons/icon_panels_2.svg
deleted file mode 100644
index 5f3fc6cf48..0000000000
--- a/editor/icons/icon_panels_2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h16v-7zm0 9v7h16v-7z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panels_2_alt.svg b/editor/icons/icon_panels_2_alt.svg
deleted file mode 100644
index edee3a660f..0000000000
--- a/editor/icons/icon_panels_2_alt.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v16h7v-16zm9 0v16h7v-16z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panels_3.svg b/editor/icons/icon_panels_3.svg
deleted file mode 100644
index 3ddcb5e2ef..0000000000
--- a/editor/icons/icon_panels_3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h16v-7zm0 9v7h7v-7zm9 0v7h7v-7z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panels_3_alt.svg b/editor/icons/icon_panels_3_alt.svg
deleted file mode 100644
index 0f36a24da8..0000000000
--- a/editor/icons/icon_panels_3_alt.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h7v-7zm9 0v16h7v-16zm-9 9v7h7v-7z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panels_4.svg b/editor/icons/icon_panels_4.svg
deleted file mode 100644
index 7b2189087f..0000000000
--- a/editor/icons/icon_panels_4.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v7h7v-7zm9 0v7h7v-7zm-9 9v7h7v-7zm9 0v7h7v-7z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_panorama_sky.svg b/editor/icons/icon_panorama_sky.svg
deleted file mode 100644
index bfff6840bd..0000000000
--- a/editor/icons/icon_panorama_sky.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(1.0096 0 0 1.0227 -.009615 -22.593)" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1038.4" y2="1050.4"><stop offset="0" stop-color="#1ec3ff"/><stop offset="1" stop-color="#b2e1ff"/></linearGradient><g transform="translate(0 -1037.4)"><path d="m1 1039.4c4.2749 2.6091 10.765 2.7449 14 0v12c-3.5849-2.6849-9.7929-2.6544-14 0z" fill="url(#a)" stroke-width="15.242"/><path d="m11 6c-.554 0-1 .446-1 1h-1c-.554 0-1 .446-1 1s.446 1 1 1h2c.554 0 1-.446 1-1h1c.554 0 1-.446 1-1s-.446-1-1-1zm-8 3c-.554 0-1 .446-1 1s.446 1 1 1h1c.554 0 1-.446 1-1s-.446-1-1-1z" fill="#fff" transform="translate(0 1037.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_parallax_background.svg b/editor/icons/icon_parallax_background.svg
deleted file mode 100644
index 09e6a7d19d..0000000000
--- a/editor/icons/icon_parallax_background.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/><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" fill-opacity=".99608" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_parallax_layer.svg b/editor/icons/icon_parallax_layer.svg
deleted file mode 100644
index d8a5ef5e1f..0000000000
--- a/editor/icons/icon_parallax_layer.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><ellipse cx="3" cy="1039.4" fill="#6e6e6e"/><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="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_particle_attractor_2d.svg b/editor/icons/icon_particle_attractor_2d.svg
deleted file mode 100644
index 85f289dc4b..0000000000
--- a/editor/icons/icon_particle_attractor_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a3 7 0 0 0 -2.0801 1.9668 7 3 45 0 0 -2.8691.083984 7 3 45 0 0 -.080078 2.8633 7 3 0 0 0 -1.9707 2.0859 7 3 0 0 0 1.9668 2.0801 3 7 45 0 0 .083984 2.8691 3 7 45 0 0 2.8633.080078 3 7 0 0 0 2.0859 1.9707 3 7 0 0 0 2.0801-1.9668 7 3 45 0 0 2.8691-.083984 7 3 45 0 0 .080078-2.8633 7 3 0 0 0 1.9707-2.0859 7 3 0 0 0 -1.9668-2.0801 3 7 45 0 0 -.083984-2.8691 3 7 45 0 0 -2.8633-.080078 3 7 0 0 0 -2.0859-1.9707zm0 1a2 6 0 0 1 1.2598 1.3438 3 7 45 0 0 -1.2578.75977 7 3 45 0 0 -1.2637-.75781 2 6 0 0 1 1.2617-1.3457zm-3.6348 1.5293a6 2 45 0 1 1.2344.28906 3 7 0 0 0 -.35352 1.4238 7 3 0 0 0 -1.4297.35742 6 2 45 0 1 -.058594-1.8418 6 2 45 0 1 .60742-.22852zm7.0762.0039062a2 6 45 0 1 .80078.22461 2 6 45 0 1 -.060547 1.8418 7 3 0 0 0 -1.4238-.35352 3 7 0 0 0 -.35742-1.4297 2 6 45 0 1 1.041-.2832zm-4.998.70703a6 2 45 0 1 .74023.4707 3 7 45 0 0 -.41211.33984 7 3 0 0 0 -.52344.048828 2 6 0 0 1 .19531-.85938zm3.1152.0019531a2 6 0 0 1 .18945.85547 7 3 0 0 0 -.5293-.050781 7 3 45 0 0 -.4043-.33594 2 6 45 0 1 .74414-.46875zm-1.5586 1.7578a6 2 0 0 1 .82031.021484 6 2 45 0 1 .59375.56445 6 2 45 0 1 .56445.59375 2 6 0 0 1 .021484.82031 2 6 0 0 1 -.021484.82031 2 6 45 0 1 -.56445.59375 2 6 45 0 1 -.59375.56445 6 2 0 0 1 -.82031.021484 6 2 0 0 1 -.82031-.021484 6 2 45 0 1 -.59375-.56445 6 2 45 0 1 -.56445-.59375 2 6 0 0 1 -.021484-.82031 2 6 0 0 1 .021484-.82031 2 6 45 0 1 .56445-.59375 2 6 45 0 1 .59375-.56445 6 2 0 0 1 .82031-.021484zm2.9004.24805a6 2 0 0 1 .85938.19531 2 6 45 0 1 -.4707.74023 7 3 45 0 0 -.33984-.41211 3 7 0 0 0 -.048828-.52344zm-5.8027.0039062a3 7 0 0 0 -.050781.5293 3 7 45 0 0 -.33594.4043 6 2 45 0 1 -.46875-.74414 6 2 0 0 1 .85547-.18945zm7.5566.48633a6 2 0 0 1 1.3457 1.2617 6 2 0 0 1 -1.3438 1.2598 7 3 45 0 0 -.75977-1.2578 3 7 45 0 0 .75781-1.2637zm-9.3105.0019532a7 3 45 0 0 .75977 1.2578 3 7 45 0 0 -.75781 1.2637 6 2 0 0 1 -1.3457-1.2617 6 2 0 0 1 1.3438-1.2598zm4.6562.25977a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm3.2891 1.8145a6 2 45 0 1 .46875.74414 6 2 0 0 1 -.85547.18945 3 7 0 0 0 .050781-.5293 3 7 45 0 0 .33594-.4043zm-6.5781.0019531a7 3 45 0 0 .33984.41211 3 7 0 0 0 .048828.52344 6 2 0 0 1 -.85938-.19531 2 6 45 0 1 .4707-.74023zm-.89258 1.584a7 3 0 0 0 1.4238.35352 3 7 0 0 0 .35742 1.4297 2 6 45 0 1 -1.8418.058594 2 6 45 0 1 .060547-1.8418zm8.3652 0a6 2 45 0 1 .058594 1.8418 6 2 45 0 1 -1.8418-.060547 3 7 0 0 0 .35352-1.4238 7 3 0 0 0 1.4297-.35742zm-2.4316.5a2 6 0 0 1 -.19531.85938 6 2 45 0 1 -.74023-.4707 3 7 45 0 0 .41211-.33984 7 3 0 0 0 .52344-.048828zm-3.5.001953a7 3 0 0 0 .5293.050781 7 3 45 0 0 .4043.33594 2 6 45 0 1 -.74414.46875 2 6 0 0 1 -.18945-.85547zm1.7461.99414a7 3 45 0 0 1.2637.75781 2 6 0 0 1 -1.2617 1.3457 2 6 0 0 1 -1.2598-1.3438 3 7 45 0 0 1.2578-.75977z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_particles.svg b/editor/icons/icon_particles.svg
deleted file mode 100644
index f1378e3f8c..0000000000
--- a/editor/icons/icon_particles.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a4.5 5 0 0 0 -4.4141 4.0312 3 3 0 0 0 -2.5859 2.9688 3 3 0 0 0 3 3h8a3 3 0 0 0 3-3 3 3 0 0 0 -2.5898-2.9668 4.5 5 0 0 0 -4.4102-4.0332zm-4 11a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm8 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-4 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_particles_2d.svg b/editor/icons/icon_particles_2d.svg
deleted file mode 100644
index 7151194e36..0000000000
--- a/editor/icons/icon_particles_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a4.5 5 0 0 0 -4.4141 4.0312 3 3 0 0 0 -2.5859 2.9688 3 3 0 0 0 3 3h8a3 3 0 0 0 3-3 3 3 0 0 0 -2.5898-2.9668 4.5 5 0 0 0 -4.4102-4.0332zm-4 11a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm8 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-4 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_particles_material.svg b/editor/icons/icon_particles_material.svg
deleted file mode 100644
index af45f9888a..0000000000
--- a/editor/icons/icon_particles_material.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a4.5 5 0 0 0 -3.5938 2h7.1816a4.5 5 0 0 0 -3.5879-2z" fill="#ff7070"/><path d="m4.4062 3a4.5 5 0 0 0 -.81445 2h8.8105a4.5 5 0 0 0 -.81445-2z" fill="#ffeb70"/><path d="m3.5918 5a4.5 5 0 0 0 -.0058594.03125 3 3 0 0 0 -2.4121 1.9688h13.65a3 3 0 0 0 -2.4141-1.9668 4.5 5 0 0 0 -.007812-.033203h-8.8105z" fill="#9dff70"/><path d="m1.1738 7a3 3 0 0 0 -.17383 1 3 3 0 0 0 .17578 1h13.65a3 3 0 0 0 .17383-1 3 3 0 0 0 -.17578-1z" fill="#70ffb9"/><path d="m1.1758 9a3 3 0 0 0 2.8242 2h8a3 3 0 0 0 2.8262-2h-13.65z" fill="#70deff"/><path d="m3 13a1 1 0 0 0 1 1 1 1 0 0 0 1-1zm5 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm3 0a1 1 0 0 0 1 1 1 1 0 0 0 1-1z" fill="#ff70ac"/><path d="m4 12a1 1 0 0 0 -1 1h2a1 1 0 0 0 -1-1zm8 0a1 1 0 0 0 -1 1h2a1 1 0 0 0 -1-1z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_path.svg b/editor/icons/icon_path.svg
deleted file mode 100644
index cde9a06903..0000000000
--- a/editor/icons/icon_path.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1a2 2 0 0 0 -2 2 2 2 0 0 0 .84961 1.6328c-.19239.88508-.55317 1.3394-.98633 1.6426-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c.8927-.62488 1.5321-1.6538 1.8184-3.0977a2 2 0 0 0 1.1699-1.8164 2 2 0 0 0 -2-2z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_path_2d.svg b/editor/icons/icon_path_2d.svg
deleted file mode 100644
index 8aa0453b88..0000000000
--- a/editor/icons/icon_path_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1a2 2 0 0 0 -2 2 2 2 0 0 0 .84961 1.6328c-.19239.88508-.55317 1.3394-.98633 1.6426-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c.8927-.62488 1.5321-1.6538 1.8184-3.0977a2 2 0 0 0 1.1699-1.8164 2 2 0 0 0 -2-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_path_follow.svg b/editor/icons/icon_path_follow.svg
deleted file mode 100644
index 8e904ab5a5..0000000000
--- a/editor/icons/icon_path_follow.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 0-3 4h1.9473c-.1385 1.3203-.5583 1.9074-1.084 2.2754-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c1.0528-.73697 1.7552-2.032 1.9375-3.9141h2.0508l-3-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_path_follow_2d.svg b/editor/icons/icon_path_follow_2d.svg
deleted file mode 100644
index 20a32f2d83..0000000000
--- a/editor/icons/icon_path_follow_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 0-3 4h1.9473c-.1385 1.3203-.5583 1.9074-1.084 2.2754-.64426.451-1.7129.60547-2.9629.73047s-2.6814.22053-3.9121 1.082c-.89278.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.84961-1.6328c.19235-.88496.55306-1.3373.98633-1.6406.64426-.451 1.7129-.60547 2.9629-.73047s2.6814-.22053 3.9121-1.082c1.0528-.73697 1.7552-2.032 1.9375-3.9141h2.0508l-3-4z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pause.svg b/editor/icons/icon_pause.svg
deleted file mode 100644
index 14c9971383..0000000000
--- a/editor/icons/icon_pause.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 3a1.0001 1.0001 0 0 0 -1 1v8a1.0001 1.0001 0 0 0 1 1h2a1 1 0 0 0 1-1v-8a1 1 0 0 0 -1-1zm6 0a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h2a1.0001 1.0001 0 0 0 1-1v-8a1.0001 1.0001 0 0 0 -1-1z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_physical_bone.svg b/editor/icons/icon_physical_bone.svg
deleted file mode 100644
index 0a34eb6e48..0000000000
--- a/editor/icons/icon_physical_bone.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc9c9c" transform="translate(-2.5625 -18.4375)"><path d="m13.107422 19.382812a2.4664 2.4663 0 0 0 -1.78125.720704 2.4664 2.4663 0 0 0 -.185547.21289l1.332031 2.433594-1.605469.603516-3.414062 3.414062a2.4664 2.4663 0 0 0 -3.1015625.3125 2.4664 2.4663 0 0 0 0 3.488281 2.4664 2.4663 0 0 0 1.3964844.695313 2.4664 2.4663 0 0 0 .6953125 1.396484 2.4664 2.4663 0 0 0 3.4882812 0 2.4664 2.4663 0 0 0 .3144534-3.103515l3.560547-3.560547a2.4664 2.4663 0 0 0 3.099609-.310547 2.4664 2.4663 0 0 0 0-3.488281 2.4664 2.4663 0 0 0 -1.396484-.697266 2.4664 2.4663 0 0 0 -.695313-1.396484 2.4664 2.4663 0 0 0 -1.707031-.720704z"/><path d="m3.7211033 21.208326.9608286 4.82644 1.3962404-.524494z"/><path d="m6.4843278 19.465234.9608285 4.82644 1.3962404-.524494z"/><path d="m9.6964655 19.33678.7108285 3.51394 1.39624-.524494z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pin.svg b/editor/icons/icon_pin.svg
deleted file mode 100644
index 85cd815b64..0000000000
--- a/editor/icons/icon_pin.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1v1l1 1v3h6v-3l1-1v-1zm1 6-2 3h10l-2-3zm2 4v2l1 2 1-2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pin_joint.svg b/editor/icons/icon_pin_joint.svg
deleted file mode 100644
index 147553d316..0000000000
--- a/editor/icons/icon_pin_joint.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1.2715-.70703.70703v1.4141l-2.1211 2.123 4.2422 4.2422 2.1211-2.1211h1.4141l.70703-.70703-5.6562-5.6582zm-3.5352 4.9512-3.5352.70703 7.0703 7.0703.70703-3.5352-4.2422-4.2422zm-1.4141 4.2422-1.4141 1.4141-.70703 2.1211 2.1211-.70703 1.4141-1.4141-1.4141-1.4141z" fill="#fc9c9c" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pin_joint_2d.svg b/editor/icons/icon_pin_joint_2d.svg
deleted file mode 100644
index f1dcafb923..0000000000
--- a/editor/icons/icon_pin_joint_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1.2715-.70703.70703v1.4141l-2.1211 2.123 4.2422 4.2422 2.1211-2.1211h1.4141l.70703-.70703-5.6562-5.6582zm-3.5352 4.9512-3.5352.70703 7.0703 7.0703.70703-3.5352-4.2422-4.2422zm-1.4141 4.2422-1.4141 1.4141-.70703 2.1211 2.1211-.70703 1.4141-1.4141-1.4141-1.4141z" fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pin_pressed.svg b/editor/icons/icon_pin_pressed.svg
deleted file mode 100644
index 85cd815b64..0000000000
--- a/editor/icons/icon_pin_pressed.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1v1l1 1v3h6v-3l1-1v-1zm1 6-2 3h10l-2-3zm2 4v2l1 2 1-2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_plane.svg b/editor/icons/icon_plane.svg
deleted file mode 100644
index 3a943af0b3..0000000000
--- a/editor/icons/icon_plane.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 2v8h2v-2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3zm6 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5zm-4 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1zm8 0v6h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3z" fill="#f77070"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_plane_mesh.svg b/editor/icons/icon_plane_mesh.svg
deleted file mode 100644
index ddcc623c67..0000000000
--- a/editor/icons/icon_plane_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 12h12l-3-8h-6z" fill="none" stroke="#ffd684" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_plane_shape.svg b/editor/icons/icon_plane_shape.svg
deleted file mode 100644
index 2c90cf6d53..0000000000
--- a/editor/icons/icon_plane_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1044.4 7 3 7-3-7-3z" fill="#a2d2ff" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play.svg b/editor/icons/icon_play.svg
deleted file mode 100644
index 4c16215a68..0000000000
--- a/editor/icons/icon_play.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play_backwards.svg b/editor/icons/icon_play_backwards.svg
deleted file mode 100644
index c98f15ea50..0000000000
--- a/editor/icons/icon_play_backwards.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" transform="matrix(-1 0 0 1 16 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play_custom.svg b/editor/icons/icon_play_custom.svg
deleted file mode 100644
index e19a8e7028..0000000000
--- a/editor/icons/icon_play_custom.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25-.28906-1.9785zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812-.81836-1.9004zm-1.4258 3.2285v6a2 2 0 0 0 2 2h12v-8zm3 1h4v1h4v5h-4-4v-5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play_overlay.svg b/editor/icons/icon_play_overlay.svg
deleted file mode 100644
index 1fb2da6596..0000000000
--- a/editor/icons/icon_play_overlay.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><rect fill="#044b94" fill-opacity=".6" height="64" rx="5" width="64"/><path d="m16 16 32 16-32 16" fill="#f2f2f2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play_scene.svg b/editor/icons/icon_play_scene.svg
deleted file mode 100644
index 5e5097fd66..0000000000
--- a/editor/icons/icon_play_scene.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.564 2-2.2441.32812.81836 1.9004 1.7148-.25zm-4.2227.61523-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.959.57812-1.9785.28906.81836 1.9023 1.9785-.28906zm-3.957.57812-1.7148.25.28906 1.9785 2.2441-.32812zm-1.4258 3.2285v6c0 1.1046.89543 2 2 2h12v-8zm5 1 5 3-5 3z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play_start.svg b/editor/icons/icon_play_start.svg
deleted file mode 100644
index 2ade7371e0..0000000000
--- a/editor/icons/icon_play_start.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1c.55226-.0001.99994-.4477 1-1v-8c-.000055-.5523-.44774-.9999-1-1zm4.9746 0c-.54154.014-.97365.45635-.97461.99805v8c-.000392.8389.97003 1.3054 1.625.78125l5-4c.49938-.4004.49938-1.1601 0-1.5605l-5-4c-.18422-.1473-.41459-.22485-.65039-.21875z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play_start_backwards.svg b/editor/icons/icon_play_start_backwards.svg
deleted file mode 100644
index 195f9a646e..0000000000
--- a/editor/icons/icon_play_start_backwards.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 1039.4a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-1c-.55226-.0001-.99994-.4477-1-1v-8c.000055-.5523.44774-.9999 1-1zm-4.9746 0c.54154.014.97365.4563.97461.998v8c.000392.8389-.97003 1.3055-1.625.7813l-5-4c-.49938-.4004-.49938-1.1601 0-1.5605l5-4c.18422-.1473.41459-.2249.65039-.2188z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_play_travel.svg b/editor/icons/icon_play_travel.svg
deleted file mode 100644
index d772476e15..0000000000
--- a/editor/icons/icon_play_travel.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(.59321602 0 0 .59321602 -1.220314 -611.14809)"/><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(.59321602 0 0 .59321602 7.525472 -610.94451)"/><rect height=".542373" ry=".271186" width="9.559322" x="3.005846" y="8.128074"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_plugin_script.svg b/editor/icons/icon_plugin_script.svg
deleted file mode 100644
index 0d080c132e..0000000000
--- a/editor/icons/icon_plugin_script.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1-.56445 2.2578c-.23643.075851-.46689.16921-.68945.2793l-1.9883-1.1934-1.4141 1.4141 1.1953 1.9941c-.11191.22113-.20723.45028-.28516.68555l-2.2539.5625v2l2.2578.56445c.048141.14946.11579.29137.17773.43555h.58789c.51595-.6841 1.1988-1.2456 2.0195-1.5957-.028019-.13296-.042416-.26842-.042969-.4043.0000096-1.1046.89543-2 2-2 1.1046.0000096 2 .89543 2 2-.0001737.1345-.013915.26865-.041016.40039.82295.35108 1.509.91301 2.0254 1.5996h.58008c.063668-.14463.13192-.2874.18164-.4375l2.2539-.5625v-2l-2.2578-.56445c-.075942-.23577-.1693-.46557-.2793-.6875l1.1934-1.9902-1.4141-1.4141-1.9941 1.1953c-.22113-.11191-.45028-.20723-.68555-.28516l-.5625-2.2539h-2zm1 6a1 1 0 0 0 -.99805.92969 1 1 0 0 0 -.0019531.070312v2.1738a3 3 0 0 0 -2 2.8262h1v2h1v-2h2v2h1v-2h1a3 3 0 0 0 -.015625-.29883 3 3 0 0 0 -1.9844-2.5254v-2.1758a1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_point_mesh.svg b/editor/icons/icon_point_mesh.svg
deleted file mode 100644
index 0504b7ff01..0000000000
--- a/editor/icons/icon_point_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#ffd684"><ellipse cx="3.7237" cy="3.0268" rx="2.0114" ry="1.9956"/><ellipse cx="11.717" cy="6.1734" rx="2.0114" ry="1.9956"/><ellipse cx="6.5219" cy="12.477" rx="2.0114" ry="1.9956"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_polygon_2_d.svg b/editor/icons/icon_polygon_2_d.svg
deleted file mode 100644
index 485109072e..0000000000
--- a/editor/icons/icon_polygon_2_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1050.4h-12v-12h12l-6 6z" fill="none" stroke="#a5b7f3" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_polygon_path_finder.svg b/editor/icons/icon_polygon_path_finder.svg
deleted file mode 100644
index b41067d08a..0000000000
--- a/editor/icons/icon_polygon_path_finder.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0000552-.99994.44774-1 1v1h2v-2zm3 0v2h2v-2zm4 0v2h2v-2zm4 0v2h1.4141l.29297-.29297c.62956-.62999.18361-1.7067-.70703-1.707h-1zm-12 4v2h2v-2zm11 2-3 8 3-2 3 2zm-11 2v2h2v-2zm0 4v1c.0000552.55226.44774.99994 1 1h1v-2zm4 0v2h1.9023c-.0007835-.2513.043539-.50069.13086-.73633l.47461-1.2637h-2.5078z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pool_byte_array.svg b/editor/icons/icon_pool_byte_array.svg
deleted file mode 100644
index 5409a47bc4..0000000000
--- a/editor/icons/icon_pool_byte_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2h-2zm12 0v2h2v8h-2v2h4v-12h-2z" fill="#e0e0e0"/><path d="m5 3a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v4h2a3 3 0 0 0 1-.17578v.17578h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4h-2v3a1 1 0 0 1 -1 1v-4h-2z" fill="#69ec9e"/><path d="m6 9v-6h2v4a1 1 0 0 0 1-1v-3h2v4a1 1 0 0 0 1-1v-3h2v3a3 3 0 0 1 -3 3h-2v-.1758a3 3 0 0 1 -1 .1758z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pool_color_array.svg b/editor/icons/icon_pool_color_array.svg
deleted file mode 100644
index 7a312d0e91..0000000000
--- a/editor/icons/icon_pool_color_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m6 3.5a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2z" fill="#ff7070"/><path d="m13 3.5a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1z" fill="#70bfff"/><path d="m7 1.5v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5z" fill="#7aff70"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pool_int_array.svg b/editor/icons/icon_pool_int_array.svg
deleted file mode 100644
index a664b2d5fd..0000000000
--- a/editor/icons/icon_pool_int_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m3 2v2h2v-2zm2 2v2h-2v4h4v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3zm5 3a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2h-2z" fill="#7dc6ef"/><path d="m5 4v6h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pool_real_array.svg b/editor/icons/icon_pool_real_array.svg
deleted file mode 100644
index 734f40cd05..0000000000
--- a/editor/icons/icon_pool_real_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m6 2a3 3 0 0 0 -3 3v5h2v-2h1v-2h-1v-1a1 1 0 0 1 1-1zm1 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5zm3 0v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2z" fill="#61daf4"/><path d="m7 2v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-5z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pool_string_array.svg b/editor/icons/icon_pool_string_array.svg
deleted file mode 100644
index 7e66f5f5e5..0000000000
--- a/editor/icons/icon_pool_string_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m7 2a3 3 0 0 0 -3 3v2a1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 3-3v-2a1 1 0 0 1 1-1h1v3a3 3 0 0 0 3 3h2v-3a1 1 0 0 1 1-1v-2a3 3 0 0 0 -3 3v1a1 1 0 0 1 -1-1v-1h1v-2h-1v-2h-2z" fill="#6ba7ec"/><path d="m8 2v5a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pool_vector2_array.svg b/editor/icons/icon_pool_vector2_array.svg
deleted file mode 100644
index 170512eb39..0000000000
--- a/editor/icons/icon_pool_vector2_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m9 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.0019531v2h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5zm-6 1v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4z" fill="#bd91f1"/><path d="m9 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.00195v2.0001h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5001z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_pool_vector3_array.svg b/editor/icons/icon_pool_vector3_array.svg
deleted file mode 100644
index cd3578182f..0000000000
--- a/editor/icons/icon_pool_vector3_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v12h4v-2h-2v-8h2v-2zm12 0v2h2v8h-2v2h4v-12z" fill="#e0e0e0"/><path d="m8 1v2h2c0 .55228-.44772 1-1 1v2c.55228 0 1 .44772 1 1s-.44772 1-1 1h-1v2h1c1.0716-.0001501 2.0618-.57193 2.5977-1.5.5359-.9282.5359-2.0718 0-3-.10406-.1795-.22646-.34772-.36523-.50195.13856-.15301.26095-.31991.36523-.49805.26209-.45639.3995-.97371.39844-1.5h.003906v-2zm0 2h-2v3c-.0000096.55228-.44772.99999-1 1v-4h-2v6h2c1.6569 0 3-1.3431 3-3z" fill="#e286f0"/><path d="m8 1v2h2c0 .55228-.44772 1-1 1v2c.55228 0 1 .44772 1 1s-.44772 1-1 1h-1v2h1c1.0716-.0001501 2.0618-.57193 2.5977-1.5.5359-.9282.5359-2.0718 0-3-.10406-.1795-.22646-.34772-.36523-.50195.13856-.15301.26095-.31991.36523-.49805.26209-.45639.3995-.97371.39844-1.5h.003906v-2z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_popup.svg b/editor/icons/icon_popup.svg
deleted file mode 100644
index 93f7e5000d..0000000000
--- a/editor/icons/icon_popup.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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-2zm4 2h2v6h-2zm0 8h2v2h-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_popup_dialog.svg b/editor/icons/icon_popup_dialog.svg
deleted file mode 100644
index d871e56a63..0000000000
--- a/editor/icons/icon_popup_dialog.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm6 1h2v5h-2zm0 6h2v2h-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_popup_menu.svg b/editor/icons/icon_popup_menu.svg
deleted file mode 100644
index dd7b2bb0fd..0000000000
--- a/editor/icons/icon_popup_menu.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1zm1 2h10v2h-10zm0 3h10v2h-10z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_popup_panel.svg b/editor/icons/icon_popup_panel.svg
deleted file mode 100644
index 47a5448f5b..0000000000
--- a/editor/icons/icon_popup_panel.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4c-.55228 0-1 .44772-1 1v7c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-7c0-.55228-.44772-1-1-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_portal.svg b/editor/icons/icon_portal.svg
deleted file mode 100644
index 99d626e2f4..0000000000
--- a/editor/icons/icon_portal.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a5 7 0 0 0 -5 7 5 7 0 0 0 5 7 5 7 0 0 0 5-7 5 7 0 0 0 -5-7zm0 2a3 5 0 0 1 3 5 3 5 0 0 1 -3 5 3 5 0 0 1 -3-5 3 5 0 0 1 3-5z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_position_2d.svg b/editor/icons/icon_position_2d.svg
deleted file mode 100644
index 22d4ab05ca..0000000000
--- a/editor/icons/icon_position_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v4h2v-4zm-6 6v2h4v-2zm10 0v2h4v-2zm-4 4v4h2v-4z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_position_3d.svg b/editor/icons/icon_position_3d.svg
deleted file mode 100644
index 0401942d69..0000000000
--- a/editor/icons/icon_position_3d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v4h2v-4zm-6 6v2h4v-2zm10 0v2h4v-2zm-4 4v4h2v-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_prism_mesh.svg b/editor/icons/icon_prism_mesh.svg
deleted file mode 100644
index c391652add..0000000000
--- a/editor/icons/icon_prism_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9824 1.002a1.0001 1.0001 0 0 0 -.81445.44336l-5.9727 8.9609-.027344.03906a1 1 0 0 0 -.0625.10742 1 1 0 0 0 .44727 1.3418l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1 1 0 0 0 .44726-1.3418 1 1 0 0 0 -.0625-.10742l-6-9a1.0001 1.0001 0 0 0 -.84961-.44336zm-.98242 4.3008v7.0801l-3.5391-1.7715zm2 0 3.5391 5.3086-3.5391 1.7715z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_procedural_sky.svg b/editor/icons/icon_procedural_sky.svg
deleted file mode 100644
index 356a966fe9..0000000000
--- a/editor/icons/icon_procedural_sky.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1040.4" y2="1050.4"><stop offset="0" stop-color="#1ec3ff"/><stop offset="1" stop-color="#b2e1ff"/></linearGradient><g transform="translate(0 -1037.4)"><path d="m8 1040.4a7 7 0 0 0 -7 7 7 7 0 0 0 .68555 3h12.631a7 7 0 0 0 .68359-3 7 7 0 0 0 -7-7z" fill="url(#a)"/><path d="m10 7c-.554 0-1 .446-1 1h-1c-.554 0-1 .446-1 1s.446 1 1 1h2c.554 0 1-.446 1-1h1c.554 0 1-.446 1-1s-.446-1-1-1zm-7 3c-.554 0-1 .446-1 1s.446 1 1 1h1c.554 0 1-.446 1-1s-.446-1-1-1z" fill="#fff" transform="translate(0 1037.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_1.svg b/editor/icons/icon_progress_1.svg
deleted file mode 100644
index 01c2f8f334..0000000000
--- a/editor/icons/icon_progress_1.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1037.4v3.0547a4 4 0 0 1 1.0273.4258l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223z" fill-opacity=".99608"/><path d="m7 1.0801a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_2.svg b/editor/icons/icon_progress_2.svg
deleted file mode 100644
index a18ceb0381..0000000000
--- a/editor/icons/icon_progress_2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm-1.3203 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m13.6 1040.2-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_3.svg b/editor/icons/icon_progress_3.svg
deleted file mode 100644
index 55b01dad83..0000000000
--- a/editor/icons/icon_progress_3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm4.8926 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m11.867 1045.4a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_4.svg b/editor/icons/icon_progress_4.svg
deleted file mode 100644
index a038bbec70..0000000000
--- a/editor/icons/icon_progress_4.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m10.027 1047.8a4 4 0 0 1 -1.0273.4277v3.0508a7 7 0 0 0 3.1855-1.3203z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_5.svg b/editor/icons/icon_progress_5.svg
deleted file mode 100644
index 64144978af..0000000000
--- a/editor/icons/icon_progress_5.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-1.8398 2.4414a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m5.9727 1047.8-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.4258z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_6.svg b/editor/icons/icon_progress_6.svg
deleted file mode 100644
index 83b1806263..0000000000
--- a/editor/icons/icon_progress_6.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm-4.5996 2.7344a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-1.7324 5.1855a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m1.0801 1045.4a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_7.svg b/editor/icons/icon_progress_7.svg
deleted file mode 100644
index 77d4321a14..0000000000
--- a/editor/icons/icon_progress_7.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-2 .0019531a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.42773v-3.0508zm6.5996 2.7344-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m2.4004 1040.2a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_8.svg b/editor/icons/icon_progress_8.svg
deleted file mode 100644
index ee76ba4499..0000000000
--- a/editor/icons/icon_progress_8.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m9 1.0781v3.0547a4 4 0 0 1 1.0273.42578l2.1582-2.1582a7 7 0 0 0 -3.1855-1.3223zm-6.5996 2.7363a7 7 0 0 0 -1.3223 3.1855h3.0547a4 4 0 0 1 .42578-1.0273l-2.1582-2.1582zm11.199 0-2.1582 2.1582a4 4 0 0 1 .42774 1.0273h3.0508a7 7 0 0 0 -1.3203-3.1855zm-12.52 5.1855a7 7 0 0 0 1.3203 3.1855l2.1582-2.1582a4 4 0 0 1 -.42773-1.0273h-3.0508zm10.787 0a4 4 0 0 1 -.42578 1.0273l2.1582 2.1582a7 7 0 0 0 1.3223-3.1855h-3.0547zm-5.8945 2.4414-2.1582 2.1582a7 7 0 0 0 3.1855 1.3223v-3.0547a4 4 0 0 1 -1.0273-.42578zm4.0547 0a4 4 0 0 1 -1.0273.42774v3.0508a7 7 0 0 0 3.1855-1.3203l-2.1582-2.1582z" fill-opacity=".19608" transform="translate(0 1036.4)"/><path d="m7 1037.4a7 7 0 0 0 -3.1855 1.3203l2.1582 2.1582a4 4 0 0 1 1.0273-.4277z" fill-opacity=".99608"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_progress_bar.svg b/editor/icons/icon_progress_bar.svg
deleted file mode 100644
index 70f99e3bbb..0000000000
--- a/editor/icons/icon_progress_bar.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-6c0-1.1046-.89543-2-2-2zm0 2h10v6h-10zm1 1v4h1v-4zm2 0v4h1v-4zm2 0v4h1v-4z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_project_icon_loading.svg b/editor/icons/icon_project_icon_loading.svg
deleted file mode 100644
index 3802b67654..0000000000
--- a/editor/icons/icon_project_icon_loading.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8z" fill="#e0e0e0" fill-opacity=".188235"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_proximity_group.svg b/editor/icons/icon_proximity_group.svg
deleted file mode 100644
index 7df1cc9093..0000000000
--- a/editor/icons/icon_proximity_group.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h14v-14zm2 2h10v10h-10zm7.5 1c-.82843.0000048-1.5.67157-1.5 1.5.0000048.82843.67157 1.5 1.5 1.5.82842-.0000048 1.5-.67157 1.5-1.5-.000005-.82843-.67158-1.5-1.5-1.5zm-5 5c-.82843-.0000048-1.5.67157-1.5 1.5-.0000048.82843.67157 1.5 1.5 1.5.82843.000005 1.5-.67157 1.5-1.5.0000048-.82843-.67157-1.5-1.5-1.5zm5 0c-.82843.0000048-1.5.67157-1.5 1.5.0000048.82842.67157 1.5 1.5 1.5.82842-.000005 1.5-.67158 1.5-1.5-.000005-.82843-.67158-1.5-1.5-1.5z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_proxy_texture.svg b/editor/icons/icon_proxy_texture.svg
deleted file mode 100644
index 0c19363cb4..0000000000
--- a/editor/icons/icon_proxy_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h4v-4zm6 0v2h6v8h-6v4h7a1 1 0 0 0 1-1v-12a1 1 0 0 0 -1-1zm2 4v1h-1v1h-1v3h1 2 2v-2h-1v-2h-1v-1zm-8 1v4h4v-4zm0 5v4h4v-4z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_quad.svg b/editor/icons/icon_quad.svg
deleted file mode 100644
index 4657e0b0bd..0000000000
--- a/editor/icons/icon_quad.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2 10 2h2 12v-2-12h-12zm3.4141 2h8.5859v8.5859zm-1.4141 1.4141 8.5859 8.5859h-8.5859z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_quad_mesh.svg b/editor/icons/icon_quad_mesh.svg
deleted file mode 100644
index de0bd3e127..0000000000
--- a/editor/icons/icon_quad_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1v14h-14v-14zm-2 2h-8.5859l8.5859 8.5859zm-10 1.4141v8.5859h8.5859z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_quat.svg b/editor/icons/icon_quat.svg
deleted file mode 100644
index 8702a3041a..0000000000
--- a/editor/icons/icon_quat.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3a3 3 0 0 0 -3 3 3 3 0 0 0 3 3v2h2v-2.7695a3 3 0 0 0 2 .76953h2v-6h-2v4a1 1 0 0 1 -1-1v-3h-2zm0 2v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#ec69a3"/><path d="m4 3v3a3 3 0 0 0 3 3h2v-6h-2v4a1 1 0 0 1 -1-1v-3z" fill="#fff" fill-opacity=".39216"/><path d="m13 1v2h-2a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-3a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2zm-2 4v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#ec69a3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_r_i_d.svg b/editor/icons/icon_r_i_d.svg
deleted file mode 100644
index a6ace54d12..0000000000
--- a/editor/icons/icon_r_i_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 2v2h2v-2zm7 0v2h-1a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1 2v-8zm-10 2a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2zm3 2v4h2v-4zm6 0h1v2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#69ec9a"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_ray_cast.svg b/editor/icons/icon_ray_cast.svg
deleted file mode 100644
index e782b27e9f..0000000000
--- a/editor/icons/icon_ray_cast.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v9h-3l4 5 4-5h-3v-9z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_ray_cast_2d.svg b/editor/icons/icon_ray_cast_2d.svg
deleted file mode 100644
index 02faaa51c9..0000000000
--- a/editor/icons/icon_ray_cast_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v9h-3l4 5 4-5h-3v-9z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_ray_shape.svg b/editor/icons/icon_ray_shape.svg
deleted file mode 100644
index 37c2206740..0000000000
--- a/editor/icons/icon_ray_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m8 1-6 5 4 2.666v4.334l2 2v-5-2z" fill="#a2d2ff"/><path d="m8 1v7 2l-2-1.334v1.334l2 1.5v3.5l2-2v-4.334l4-2.666z" fill="#2998ff"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_ray_shape_2d.svg b/editor/icons/icon_ray_shape_2d.svg
deleted file mode 100644
index 109c254fc3..0000000000
--- a/editor/icons/icon_ray_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v9.5859l-1.293-1.293a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l3 3a1.0001 1.0001 0 0 0 .0039062.003907 1 1 0 0 0 .050781.044921 1.0001 1.0001 0 0 0 .03125.027344 1 1 0 0 0 .048828.035156 1.0001 1.0001 0 0 0 .023438.015625 1 1 0 0 0 .076172.044922 1.0001 1.0001 0 0 0 .0058593.003906 1 1 0 0 0 .013672.007813 1.0001 1.0001 0 0 0 .078125.035156 1 1 0 0 0 .074219.025391 1.0001 1.0001 0 0 0 .025391.009766 1 1 0 0 0 .039062.009765 1.0001 1.0001 0 0 0 .068359.013672 1.0001 1.0001 0 0 0 .097656.011719 1.0001 1.0001 0 0 0 .0078125 0 1 1 0 0 0 .0625.003906 1 1 0 0 0 .015625-.001953 1.0001 1.0001 0 0 0 .083984-.003906 1 1 0 0 0 .015625-.001953 1.0001 1.0001 0 0 0 .083984-.013672 1.0001 1.0001 0 0 0 .052734-.013672 1 1 0 0 0 .058594-.015625 1.0001 1.0001 0 0 0 .078125-.029297 1 1 0 0 0 .013672-.00586 1.0001 1.0001 0 0 0 .076172-.037109 1 1 0 0 0 .013672-.007812 1.0001 1.0001 0 0 0 .072266-.044922 1 1 0 0 0 .011719-.007813 1.0001 1.0001 0 0 0 .068359-.052734 1 1 0 0 0 .011719-.009766 1.0001 1.0001 0 0 0 .050781-.046875l.0097657-.011719 2.9902-2.9883a1 1 0 0 0 0-1.4141 1 1 0 0 0 -1.4141 0l-1.293 1.293v-9.5859a1 1 0 0 0 -1-1z" fill="#68b6ff" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rayito.svg b/editor/icons/icon_rayito.svg
deleted file mode 100644
index 4fd6a2827b..0000000000
--- a/editor/icons/icon_rayito.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-1 7h2.875l-.875 7 9-8h-3.8574l.85742-6h-7z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rect2.svg b/editor/icons/icon_rect2.svg
deleted file mode 100644
index 25feb52cab..0000000000
--- a/editor/icons/icon_rect2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13 2v2h-1a3 3 0 0 0 -2.5 1.3457 3 3 0 0 0 -2.5-1.3457 3 3 0 0 0 -3 3 3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1h3a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v1a3 3 0 0 0 3 3v-2a1 1 0 0 1 -1-1v-1h1v-2h-1v-2zm-10 2a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2z" fill="#f191a5"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rectangle_shape_2d.svg b/editor/icons/icon_rectangle_shape_2d.svg
deleted file mode 100644
index 437547ece3..0000000000
--- a/editor/icons/icon_rectangle_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><rect fill="none" height="8" rx=".000017" stroke="#68b6ff" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" width="12" x="2" y="4"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_reference_rect.svg b/editor/icons/icon_reference_rect.svg
deleted file mode 100644
index 2fd530d584..0000000000
--- a/editor/icons/icon_reference_rect.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h8v-2zm9 0v2h2v-2zm-12 3v8h2v-8zm12 0v8h2v-8zm-12 9v2h2v-2zm3 0v2h8v-2zm9 0v2h2v-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_reflection_probe.svg b/editor/icons/icon_reflection_probe.svg
deleted file mode 100644
index 6bf9cc9013..0000000000
--- a/editor/icons/icon_reflection_probe.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10 2a1.0001 1.0001 0 1 0 0 2h1.5859l-4.5195 4.5195-4.2988-5.1582-1.5352 1.2793 5 6a1.0001 1.0001 0 0 0 1.4746.064453l5.293-5.293v1.5879a1.0001 1.0001 0 1 0 2 0v-4a1.0001 1.0001 0 0 0 -1-1h-4zm-9 7v5a1.0001 1.0001 0 0 0 1 1h12a1.0001 1.0001 0 0 0 1-1v-4h-2v3h-10v-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_region_edit.svg b/editor/icons/icon_region_edit.svg
deleted file mode 100644
index 8443c0e454..0000000000
--- a/editor/icons/icon_region_edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><path d="m6 1042.4h6v6h-6z"/><path d="m1 1v4h4v-4zm5 0v4h6v-4zm7 0v4h2v-4zm-12 5v6h4v-6zm12 0v6h2v-6zm-12 7v2h4v-2zm5 0v2h6v-2zm7 0v2h2v-2z" fill-opacity=".32549" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_reload.svg b/editor/icons/icon_reload.svg
deleted file mode 100644
index 223a725332..0000000000
--- a/editor/icons/icon_reload.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_reload_small.svg b/editor/icons/icon_reload_small.svg
deleted file mode 100644
index ce707b645a..0000000000
--- a/editor/icons/icon_reload_small.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1038.4)"><path d="m8 1039.4a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1618 1050.3)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_remote_transform.svg b/editor/icons/icon_remote_transform.svg
deleted file mode 100644
index 2bdf8cd858..0000000000
--- a/editor/icons/icon_remote_transform.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.8565 0-5.4995 1.5262-6.9277 4a1 1 0 0 0 .36523 1.3672 1 1 0 0 0 1.3672-.36719c1.0726-1.8578 3.0501-3 5.1953-3s4.1227 1.1422 5.1953 3a1 1 0 0 0 1.3672.36719 1 1 0 0 0 .36523-1.3672c-1.4283-2.4738-4.0712-4-6.9277-4zm0 4c-1.8056 0-3.396 1.2207-3.8633 2.9648a1 1 0 0 0 .70703 1.2246 1 1 0 0 0 1.2246-.70703c.23553-.8791 1.0216-1.4824 1.9316-1.4824s1.6961.60332 1.9316 1.4824a1 1 0 0 0 1.2246.70703 1 1 0 0 0 .70703-1.2246c-.46732-1.7441-2.0577-2.9648-3.8633-2.9648zm0 4c-.554 0-1 .446-1 1v1h-3a4 4 0 0 0 2 3.4648 4 4 0 0 0 4 0 4 4 0 0 0 2-3.4648h-3v-1c0-.554-.446-1-1-1z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_remote_transform_2d.svg b/editor/icons/icon_remote_transform_2d.svg
deleted file mode 100644
index 51c9e084df..0000000000
--- a/editor/icons/icon_remote_transform_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-2.8565 0-5.4995 1.5262-6.9277 4a1 1 0 0 0 .36523 1.3672 1 1 0 0 0 1.3672-.36719c1.0726-1.8578 3.0501-3 5.1953-3s4.1227 1.1422 5.1953 3a1 1 0 0 0 1.3672.36719 1 1 0 0 0 .36523-1.3672c-1.4283-2.4738-4.0712-4-6.9277-4zm0 4c-1.8056 0-3.396 1.2207-3.8633 2.9648a1 1 0 0 0 .70703 1.2246 1 1 0 0 0 1.2246-.70703c.23553-.8791 1.0216-1.4824 1.9316-1.4824s1.6961.60332 1.9316 1.4824a1 1 0 0 0 1.2246.70703 1 1 0 0 0 .70703-1.2246c-.46732-1.7441-2.0577-2.9648-3.8633-2.9648zm0 4c-.554 0-1 .446-1 1v1h-3a4 4 0 0 0 2 3.4648 4 4 0 0 0 4 0 4 4 0 0 0 2-3.4648h-3v-1c0-.554-.446-1-1-1z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_remove.svg b/editor/icons/icon_remove.svg
deleted file mode 100644
index 9372eb08b5..0000000000
--- a/editor/icons/icon_remove.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1v1h-4v2h14v-2h-4v-1zm-3 4v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-8zm1 2h2v6h-2zm4 0h2v6h-2zm4 0h2v6h-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_remove_internal.svg b/editor/icons/icon_remove_internal.svg
deleted file mode 100644
index 0a7e06e6cd..0000000000
--- a/editor/icons/icon_remove_internal.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><circle cx="10.508475" cy="12.677966" r="2.372881"/><path d="m3.7578 2.3438-1.4141 1.4141 4.2422 4.2422-4.2422 4.2422 1.4141 1.4141 4.2422-4.2422 4.2422 4.2422 1.4141-1.4141-4.2422-4.2422 4.2422-4.2422-1.4141-1.4141-4.2422 4.2422z" transform="matrix(.63442593 0 0 .63442593 .38222 .924574)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rename.svg b/editor/icons/icon_rename.svg
deleted file mode 100644
index 01923e3a0a..0000000000
--- a/editor/icons/icon_rename.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 2v2h2v8h-2v2h2c.55228 0 1-.4477 1-1 0 .5523.44772 1 1 1h2v-2h-2v-8h2v-2h-2c-.55228 0-1 .44772-1 1 0-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_reparent.svg b/editor/icons/icon_reparent.svg
deleted file mode 100644
index 39b79cd3a1..0000000000
--- a/editor/icons/icon_reparent.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2a2 2 0 0 0 -2 2 2 2 0 0 0 1 1.7305v5.541a2 2 0 0 0 -1 1.7285 2 2 0 0 0 2 2 2 2 0 0 0 1.7305-1h6.541a2 2 0 0 0 1.7285 1 2 2 0 0 0 2-2 2 2 0 0 0 -2-2 2 2 0 0 0 -1.7305 1h-6.541a2 2 0 0 0 -.72852-.73047v-5.541a2 2 0 0 0 1-1.7285 2 2 0 0 0 -2-2z" fill="#e0e0e0"/><path d="m9 1-4 3 4 3v-2a3 3 0 0 1 3 3v2h2v-2a5 5 0 0 0 -5-5z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_reparent_to_new_node.svg b/editor/icons/icon_reparent_to_new_node.svg
deleted file mode 100644
index 37fbee848c..0000000000
--- a/editor/icons/icon_reparent_to_new_node.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m1.4915254 13c0 1.104569.8954305 2 2 2 .7139771-.000554 1.3735116-.381677 1.7305-1h6.0494746c.356631.617705 1.015238.998733 1.7285 1 1.104569 0 2-.895431 2-2s-.895431-2-2-2c-.713977.000554-1.373512.381677-1.7305 1h-6.0494746c-.1747809-.30301-.8483719-1-1.7285-1-.9027301 0-2 .891221-2 2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m10.421845 1038.2814-2.7947264 2.096 2.7947264 2.0961v-1.3974c2.716918 0 2.180792 1.4469 2.180792 3.9265v1.3974h1.397363v-1.3974c0-3.863.13086-5.3239-3.578155-5.3239z" fill="#84ffb1" stroke-width=".698682"/><path d="m11 9v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1" transform="translate(-8.5 1028.4)"/><path d="m4.5 1047.7968v-3.1171h-2.0000005v3.1171z" fill="#e0e0e0" stroke-width=".717839"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_resource_preloader.svg b/editor/icons/icon_resource_preloader.svg
deleted file mode 100644
index 417e63b604..0000000000
--- a/editor/icons/icon_resource_preloader.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm.037109 2.1172 3.7637 1.8809-1.3809.69141-3.7637-1.8828 1.3809-.68945zm-5 3.5 4 2v3.7637l-4-2zm10 0v3.7637l-4 2v-3.7637z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rich_text_effect.svg b/editor/icons/icon_rich_text_effect.svg
deleted file mode 100644
index afe08685bd..0000000000
--- a/editor/icons/icon_rich_text_effect.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h7v-2zm9 0v2h5v-2zm-9 4v2h11v-2zm0 4v2h4v-2zm6 0v2h1c-.044949-.094701-.088906-.20229-.125-.3418-.077717-.30039-.10439-.81722.16406-1.293.081489-.1441.18202-.26127.28906-.36523zm-6 4v2h8.2812c-.066517-.011548-.1231-.014758-.20117-.037109-.30195-.08645-.76491-.33245-1.0352-.80664-.23366-.4121-.24101-.84933-.18945-1.1562z" fill="#e0e0e0"/><path d="m12.216 8.598a.53334 3.2001 0 0 0 -.50976 2.2754 3.2001.53334 30 0 0 -2.2656-.71484 3.2001.53334 30 0 0 1.75 1.6016.53334 3.2001 60 0 0 -1.7461 1.5996.53334 3.2001 60 0 0 2.2578-.71094.53334 3.2001 0 0 0 .51367 2.3496.53334 3.2001 0 0 0 .51367-2.3516 3.2001.53334 30 0 0 2.2539.71094 3.2001.53334 30 0 0 -1.7441-1.5977.53334 3.2001 60 0 0 1.748-1.5996.53334 3.2001 60 0 0 -2.2617.71484.53334 3.2001 0 0 0 -.50977-2.2773z" fill="#cea4f1" stroke-width="1.0667"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rich_text_label.svg b/editor/icons/icon_rich_text_label.svg
deleted file mode 100644
index 3f4b33707c..0000000000
--- a/editor/icons/icon_rich_text_label.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h8v-2zm12 0-3 3h2v8h-2l3 3 3-3h-2v-8h2zm-12 4v2h2v-2zm4 0v2h4v-2zm-4 4v2h8v-2zm0 4v2h4v-2zm6 0v2h2v-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rigid_body.svg b/editor/icons/icon_rigid_body.svg
deleted file mode 100644
index 5d766f7c3d..0000000000
--- a/editor/icons/icon_rigid_body.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 .035156.69922 7 7 0 0 0 .27734 1.3691 7 7 0 0 0 .91016 1.8848 7 7 0 0 0 .30273.4082c.000785-.00256.0011667-.005252.0019532-.007812a7 7 0 0 0 5.4727 2.6465 7 7 0 0 0 3.2422-.80273c.001374.000393.002531.00156.003906.001953a7 7 0 0 0 .035156-.021485 7 7 0 0 0 .42578-.25 7 7 0 0 0 .16992-.10352 7 7 0 0 0 .36914-.26953 7 7 0 0 0 .20508-.15625 7 7 0 0 0 .3418-.30859 7 7 0 0 0 .16406-.1543 7 7 0 0 0 .33008-.36133 7 7 0 0 0 .14062-.16016 7 7 0 0 0 .27734-.37305 7 7 0 0 0 .13867-.19531 7 7 0 0 0 .21875-.36133 7 7 0 0 0 .14258-.25 7 7 0 0 0 .15625-.33398 7 7 0 0 0 .13867-.31055 7 7 0 0 0 .10742-.30859 7 7 0 0 0 .11914-.35352 7 7 0 0 0 .087891-.36914 7 7 0 0 0 .066406-.29297 7 7 0 0 0 .056641-.40039 7 7 0 0 0 .037109-.3125 7 7 0 0 0 .025391-.55273 7 7 0 0 0 -4.3848-6.4883 7 7 0 0 0 -.007812-.0039063 7 7 0 0 0 -.001953 0 7 7 0 0 0 -.61523-.21289 7 7 0 0 0 -.044922-.015625 7 7 0 0 0 -.0058594-.0019531 7 7 0 0 0 -.55078-.13086 7 7 0 0 0 -.14062-.03125 7 7 0 0 0 -.55078-.072266 7 7 0 0 0 -.14258-.017578 7 7 0 0 0 -.55469-.025391zm1.9512 1.334a6 6 0 0 1 4.0488 5.666h-7a2 2 0 0 0 -.94922-1.6992c1.3464-2.0289 2.6038-3.2631 3.9004-3.9668zm-6.8281 2.1797c.14632.65093.35776 1.2833.68359 1.8848a2 2 0 0 0 -.80664 1.6016h-1a6 6 0 0 1 1.123-3.4863zm1.877 1.4863a2 2 0 0 0 -.10938.0039062 2 2 0 0 1 .10938-.0039062zm-.18945.011719a2 2 0 0 0 -.12109.013672 2 2 0 0 1 .12109-.013672zm-.44141.09375a2 2 0 0 0 -.056641.019531 2 2 0 0 1 .056641-.019531zm-1.3594 2.0605a2 2 0 0 0 .013672.11914 2 2 0 0 1 -.013672-.11914zm.027344.20898a2 2 0 0 0 .017578.080078 2 2 0 0 1 -.017578-.080078zm.73438 1.1992a2 2 0 0 0 1.2285.42578 2 2 0 0 0 1.0508-.30078c1.345 2.0268 2.6013 3.2645 3.8965 3.9688a6 6 0 0 1 -1.9473.33203 6 6 0 0 1 -5.0547-2.7695c.23771-.5785.50336-1.1403.82617-1.6563z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rigid_body_2d.svg b/editor/icons/icon_rigid_body_2d.svg
deleted file mode 100644
index bb97fa650b..0000000000
--- a/editor/icons/icon_rigid_body_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 1.2227 3.9531 7 7 0 0 0 .30273.4082c.000785-.00256.0011667-.005252.0019532-.007812a7 7 0 0 0 5.4727 2.6465 7 7 0 0 0 3.2422-.80273c.001375.000393.002531.00156.003906.001953a7 7 0 0 0 .035156-.021485 7 7 0 0 0 .42578-.25 7 7 0 0 0 .16992-.10352 7 7 0 0 0 .36914-.26953 7 7 0 0 0 .20508-.15625 7 7 0 0 0 .3418-.30859 7 7 0 0 0 .16406-.1543 7 7 0 0 0 .33008-.36133 7 7 0 0 0 .14062-.16016 7 7 0 0 0 .27734-.37305 7 7 0 0 0 .13867-.19531 7 7 0 0 0 .21875-.36133 7 7 0 0 0 .14258-.25 7 7 0 0 0 .15625-.33398 7 7 0 0 0 .13867-.31055 7 7 0 0 0 .10742-.30859 7 7 0 0 0 .11914-.35352 7 7 0 0 0 .087891-.36914 7 7 0 0 0 .066406-.29297 7 7 0 0 0 .056641-.40039 7 7 0 0 0 .037109-.3125 7 7 0 0 0 .025391-.55273 7 7 0 0 0 -4.3926-6.4922 7 7 0 0 0 -.001953 0 7 7 0 0 0 -.66016-.22852 7 7 0 0 0 -.0058594-.0019531 7 7 0 0 0 -.55078-.13086 7 7 0 0 0 -.14062-.03125 7 7 0 0 0 -.55078-.072266 7 7 0 0 0 -.14258-.017578 7 7 0 0 0 -.55469-.025391zm1.9512 1.334a6 6 0 0 1 4.0488 5.666h-7a2 2 0 0 0 -.94922-1.6992c1.3464-2.0289 2.6038-3.2631 3.9004-3.9668zm-6.8281 2.1797c.14632.65093.35776 1.2833.68359 1.8848a2 2 0 0 0 -.80664 1.6016h-1a6 6 0 0 1 1.123-3.4863zm1.877 1.4863a2 2 0 0 0 -.10938.0039062 2 2 0 0 1 .10938-.0039062zm-.18945.011719a2 2 0 0 0 -.12109.013672 2 2 0 0 1 .12109-.013672zm-.44141.09375a2 2 0 0 0 -.056641.019531 2 2 0 0 1 .056641-.019531zm-1.3594 2.0605a2 2 0 0 0 .013672.11914 2 2 0 0 1 -.013672-.11914zm.027344.20898a2 2 0 0 0 .017578.080078 2 2 0 0 1 -.017578-.080078zm.73438 1.1992a2 2 0 0 0 1.2285.42578 2 2 0 0 0 1.0508-.30078c1.345 2.0268 2.6013 3.2645 3.8965 3.9688a6 6 0 0 1 -1.9473.33203 6 6 0 0 1 -5.0547-2.7695c.23771-.5785.50336-1.1403.82617-1.6563z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_room.svg b/editor/icons/icon_room.svg
deleted file mode 100644
index 799be9f99a..0000000000
--- a/editor/icons/icon_room.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm1.0371 2.6172 4 2v3.7637l-4-2zm-1 5.5 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_room_bounds.svg b/editor/icons/icon_room_bounds.svg
deleted file mode 100644
index ad90944ac6..0000000000
--- a/editor/icons/icon_room_bounds.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h1v-1h1v-1zm12 0v1h1v1h1v-2zm-5.0371.00195c-.14254.00487-.28238.04016-.41016.10352l-6 3c-.33878.16944-.55276.51574-.55273.89453v6c-.00002576.37879.21395.72509.55273.89453l6 3c.28156.14078.61297.14078.89453 0l6-3c.33878-.16944.55276-.51574.55273-.89453v-6c.000026-.37879-.21395-.72509-.55273-.89453l-6-3c-.15022-.074574-.31679-.11017-.48438-.10352zm1.0371 2.6172 4 2v3.7637l-4-2zm-1 5.5 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828zm-7 3.8809v2h2v-1h-1v-1zm13 0v1h-1v1h2v-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rotate_0.svg b/editor/icons/icon_rotate_0.svg
deleted file mode 100644
index 96174ca93b..0000000000
--- a/editor/icons/icon_rotate_0.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm1 2.1016a5 5 0 0 1 4 4.8984 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 4-4.8945v5.8945h2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rotate_180.svg b/editor/icons/icon_rotate_180.svg
deleted file mode 100644
index 11415e1e19..0000000000
--- a/editor/icons/icon_rotate_180.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.8541 0-7 3.1459-7 7 0 3.8542 3.1459 7 7 7s7-3.1458 7-7c0-3.8541-3.1459-7-7-7zm0 2v10c-2.7733 0-5-2.2267-5-5 0-2.7732 2.2267-5 5-5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rotate_270.svg b/editor/icons/icon_rotate_270.svg
deleted file mode 100644
index be26bc4337..0000000000
--- a/editor/icons/icon_rotate_270.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2v5h-5a5 5 0 0 1 5-5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rotate_90.svg b/editor/icons/icon_rotate_90.svg
deleted file mode 100644
index d46c56a1fc..0000000000
--- a/editor/icons/icon_rotate_90.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.8541 0-7 3.1459-7 7 0 3.8542 3.1459 7 7 7 3.7179 0 6.7102-2.9486 6.9219-6.6152a1 1 0 0 0 .078125-.38477 1 1 0 0 0 -.078125-.38867 1 1 0 0 0 -.001953-.0039062c-.21589-3.6627-3.2049-6.6074-6.9199-6.6074zm0 2v5h5c0 2.7733-2.2267 5-5 5s-5-2.2267-5-5c0-2.7732 2.2267-5 5-5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rotate_left.svg b/editor/icons/icon_rotate_left.svg
deleted file mode 100644
index 223a725332..0000000000
--- a/editor/icons/icon_rotate_left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_rotate_right.svg b/editor/icons/icon_rotate_right.svg
deleted file mode 100644
index 2b66bae998..0000000000
--- a/editor/icons/icon_rotate_right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="matrix(-1 0 0 1 16.026308 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_ruler.svg b/editor/icons/icon_ruler.svg
deleted file mode 100644
index dbe02102ec..0000000000
--- a/editor/icons/icon_ruler.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 4.2333 4.2333" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v7.5 6.5h14zm3 7 4 4h-4z" fill="#e0e0e0" transform="scale(.26458)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sample_library.svg b/editor/icons/icon_sample_library.svg
deleted file mode 100644
index e83a1a3778..0000000000
--- a/editor/icons/icon_sample_library.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.0215 1.002a1.0001 1.0001 0 0 0 -1 .875l-.58984 4.7227-.52344-1.0469a1.0001 1.0001 0 0 0 -.89453-.55273h-2a1.0001 1.0001 0 1 0 0 2h1.3828l1.7227 3.4473a1.0001 1.0001 0 0 0 1.8867-.32227l.58984-4.7227.52344 1.0449a1.0001 1.0001 0 0 0 .89453.55273h3a1.0001 1.0001 0 1 0 0-2h-2.3809l-1.7246-3.4473a1.0001 1.0001 0 0 0 -.88672-.55078zm1.9785 6.998v1 5 1h5c.55228 0 1-.44772 1-1v-5c0-.55228-.44772-1-1-1v4l-1-1-1 1v-4z" fill="#ff8484"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_save.svg b/editor/icons/icon_save.svg
deleted file mode 100644
index be5d3ef6fd..0000000000
--- a/editor/icons/icon_save.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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-7-1-1l-3-3h-1v5 1h-8zm1 0v5h3v-5zm4 8c1.1046 0 2 .89543 2 2 0 1.1046-.89543 2-2 2s-2-.89543-2-2c0-1.1046.89543-2 2-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_script.svg b/editor/icons/icon_script.svg
deleted file mode 100644
index 1c6ec51a48..0000000000
--- a/editor/icons/icon_script.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m6 1v1a1 1 0 0 0 -1 1v10h-1v-2h-2v2a1 1 0 0 0 .5.86523 1 1 0 0 0 .5.13477v1h7a2 2 0 0 0 2-2v-8h3v-2a2 2 0 0 0 -2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_script_create.svg b/editor/icons/icon_script_create.svg
deleted file mode 100644
index 0a03907a13..0000000000
--- a/editor/icons/icon_script_create.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h5 1v-1h-1v-4h2v-2h2v-3h3v-2c0-1.1046-.89543-2-2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/><path d="m13 1049.4h2v-2h-2v-2h-2v2h-2v2h2v2h2z" fill="#84ffb1" fill-rule="evenodd"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_script_create_dialog.svg b/editor/icons/icon_script_create_dialog.svg
deleted file mode 100644
index 751b799ba9..0000000000
--- a/editor/icons/icon_script_create_dialog.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="17.067" viewBox="0 0 16 16" width="17.067" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h6v-5l3-2v-3h3v-2c0-1.1046-.89543-2-2-2z" fill="#a5efac" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-3v3c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v3h5v-1h-4v-2c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#87e29f" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0" r="0"/><g fill="#87e29f"><ellipse cx="12" cy="1048.4" rx=".5" ry="3"/><ellipse cx="913.91" cy="513.79" rx=".5" ry="3" transform="matrix(.5 .8660254 -.8660254 .5 0 0)"/><ellipse cx="901.91" cy="-534.57" rx=".5" ry="3" transform="matrix(-.5 .8660254 -.8660254 -.5 0 0)"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_script_extend.svg b/editor/icons/icon_script_extend.svg
deleted file mode 100644
index efa0077ab1..0000000000
--- a/editor/icons/icon_script_extend.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h7c.73866 0 1.3763-.40437 1.7227-1h-3.7227v-4h4v-5h3v-2c0-1.1046-.89543-2-2-2z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/><path d="m16 1048.4-3-3v2h-4v2h4v2z" fill="#68b6ff" fill-rule="evenodd"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_script_remove.svg b/editor/icons/icon_script_remove.svg
deleted file mode 100644
index de67d02947..0000000000
--- a/editor/icons/icon_script_remove.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h5.6348l-1.584-1.584 1.4141-1.4141-1.4141-1.416 3.5352-3.5352 1.4141 1.4141v-.46484-3h3v-2c0-1.1046-.89543-2-2-2h-7z" fill="#e0e0e0" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-2-1v1 2c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v1 1 1h1 4v-1h-4v-1-1c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#b4b4b4" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0"/><path d="m13.414 1048.4 1.4142-1.4142-1.4142-1.4142-1.4142 1.4142-1.4142-1.4142-1.4142 1.4142 1.4142 1.4142-1.4142 1.4142 1.4142 1.4142 1.4142-1.4142 1.4142 1.4142 1.4142-1.4142z" fill="#ff8484" fill-rule="evenodd"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_scroll_container.svg b/editor/icons/icon_scroll_container.svg
deleted file mode 100644
index 738748ca91..0000000000
--- a/editor/icons/icon_scroll_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h10v10h-10zm5 1-2 2h4zm2 2v4l2-2zm0 4h-4l2 2zm-4 0v-4l-2 2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_search.svg b/editor/icons/icon_search.svg
deleted file mode 100644
index 04dc4f7372..0000000000
--- a/editor/icons/icon_search.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.7539-.83203l4.3164 4.3164 1.4141-1.4141-4.3164-4.3164a5 5 0 0 0 .83203-2.7539 5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3 3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_segment_shape_2d.svg b/editor/icons/icon_segment_shape_2d.svg
deleted file mode 100644
index e4c04ae7c6..0000000000
--- a/editor/icons/icon_segment_shape_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 12-12" style="fill:none;stroke:#68b6ff;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_shader.svg b/editor/icons/icon_shader.svg
deleted file mode 100644
index 479379d235..0000000000
--- a/editor/icons/icon_shader.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v12c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-8l-5-5zm1 2h6v3c0 .554.44599 1 1 1h3v6h-10z" fill="#e0e0e0"/><path d="m10 11h2v1h-2z" fill="#9f70ff"/><path d="m4 6h2v1h-2z" fill="#ffeb70"/><path d="m8 8h4v1h-4z" fill="#9dff70"/><path d="m7 6h1v1h-1z" fill="#70deff"/><path d="m4 11h5v1h-5z" fill="#ff70ac"/><path d="m4 4h3v1h-3z" fill="#ff7070"/><path d="m4 8h3v1h-3z" fill="#70ffb9"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_shader_material.svg b/editor/icons/icon_shader_material.svg
deleted file mode 100644
index 37c1610f29..0000000000
--- a/editor/icons/icon_shader_material.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v1h2 6 3l-2-2z" fill="#ff7070"/><path d="m1 3v2h2v-2zm8 0v2h5l-2-2z" fill="#ffeb70"/><path d="m1 5v2h2v-2zm8 0v1c0 .554.44599 1 1 1h3 2v-1l-1-1z" fill="#9dff70"/><path d="m1 7v2h2v-2zm12 0v2h2v-2z" fill="#70ffb9"/><path d="m1 9v2h2v-2zm12 0v2h2v-2z" fill="#70deff"/><path d="m1 13v1c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-1h-2-10z" fill="#ff70ac"/><path d="m1 11v2h2v-2zm12 0v2h2v-2z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_short_cut.svg b/editor/icons/icon_short_cut.svg
deleted file mode 100644
index f4e302efdb..0000000000
--- a/editor/icons/icon_short_cut.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 2c-.55228 0-1 .4477-1 1v9.084c.0004015.506.448.91602 1 .91602h8c.552 0 .9996-.41002 1-.91602v-9.084c0-.5523-.44772-1-1-1zm-3 2v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-9h-1v9a.99998.99998 0 0 1 -1 1h-10a1 1 0 0 1 -1-1v-9zm6 0h3l-1 3h2l-4 4 1-3h-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_signal.svg b/editor/icons/icon_signal.svg
deleted file mode 100644
index 82fdf2b059..0000000000
--- a/editor/icons/icon_signal.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 3v10h2 4v-2h-4v-6h4v-2h-4zm9 1v3h-5v2h5v3l2.5-2 2.5-2-2.5-2z" fill="#ff8484"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_signals.svg b/editor/icons/icon_signals.svg
deleted file mode 100644
index 9c09546f84..0000000000
--- a/editor/icons/icon_signals.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c4.4301 0 8 3.5699 8 8a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-5.511-4.489-10-10-10zm0 4a1 1 0 0 0 -1 1 1 1 0 0 0 1 1c2.221 0 4 1.779 4 4a1 1 0 0 0 1 1 1 1 0 0 0 1-1c0-3.3018-2.6981-6-6-6zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_signals_and_groups.svg b/editor/icons/icon_signals_and_groups.svg
deleted file mode 100644
index d568296d5f..0000000000
--- a/editor/icons/icon_signals_and_groups.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0c-.55228 0-1 .4477-1 1s.44772 1 1 1c4.4301 0 8 3.5699 8 8 0 .5523.44772 1 1 1s1-.4477 1-1c0-5.511-4.489-10-10-10zm0 4c-.55228 0-1 .4477-1 1s.44772 1 1 1c2.221 0 4 1.779 4 4 0 .5523.44772 1 1 1s1-.4477 1-1c0-3.3018-2.6981-6-6-6zm-5 4a1.0001 1.0001 0 0 0 -1 1v6a1.0001 1.0001 0 0 0 1 1h6a1.0001 1.0001 0 0 0 1-1v-6a1.0001 1.0001 0 0 0 -1-1zm1 2h4v4h-4z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_skeleton.svg b/editor/icons/icon_skeleton.svg
deleted file mode 100644
index 015c842125..0000000000
--- a/editor/icons/icon_skeleton.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.4531v3.5469a2 2 0 0 0 1 1.7324 2 2 0 0 0 1 .26562v.001953h4v-.001953a2 2 0 0 0 1-.26562 2 2 0 0 0 1-1.7324v-3.5469a4 4 0 0 0 2-3.4531 4 4 0 0 0 -4-4zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-4 2h2v1h-2zm-2 2h1v1h1v-1h1 1v1h1v-1h1v.86719 3.1328h-1v-1h-1v1h-1-1v-1h-1v1h-1v-3.1309-.86914z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_skeleton_2d.svg b/editor/icons/icon_skeleton_2d.svg
deleted file mode 100644
index 8e38b5c971..0000000000
--- a/editor/icons/icon_skeleton_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.4531v3.5469a2 2 0 0 0 1 1.7324 2 2 0 0 0 1 .26562v.001953h4v-.001953a2 2 0 0 0 1-.26562 2 2 0 0 0 1-1.7324v-3.5469a4 4 0 0 0 2-3.4531 4 4 0 0 0 -4-4zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-4 2h2v1h-2zm-2 2h1v1h1v-1h1 1v1h1v-1h1v.86719 3.1328h-1v-1h-1v1h-1-1v-1h-1v1h-1v-3.1309-.86914z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_skeleton_i_k.svg b/editor/icons/icon_skeleton_i_k.svg
deleted file mode 100644
index e69f6e8bf3..0000000000
--- a/editor/icons/icon_skeleton_i_k.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.4531v3.5469a2 2 0 0 0 1 1.7324 2 2 0 0 0 1 .26562v.001953h4v-.001953a2 2 0 0 0 1-.26562 2 2 0 0 0 1-1.7324v-3.5469a4 4 0 0 0 2-3.4531 4 4 0 0 0 -4-4zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-4 2h2v1h-2zm-2 2h1v1h1v-1h1 1v1h1v-1h1v.86719 3.1328h-1v-1h-1v1h-1-1v-1h-1v1h-1v-3.1309-.86914z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_slider_joint.svg b/editor/icons/icon_slider_joint.svg
deleted file mode 100644
index fdd7487bbf..0000000000
--- a/editor/icons/icon_slider_joint.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-.55228 0-1 .44772-1 1s.44772 1 1 1h3l-7 7v3l12-12zm10 2-12 12h8c.55228 0 1-.44772 1-1s-.44772-1-1-1h-3l7-7z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_slot.svg b/editor/icons/icon_slot.svg
deleted file mode 100644
index 24d54297a8..0000000000
--- a/editor/icons/icon_slot.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 3v2h4v6h-4v2h4 2v-10h-2zm-3 1v3h-5v2h5v3l2.5-2 2.5-2-2.5-2z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_snap.svg b/editor/icons/icon_snap.svg
deleted file mode 100644
index 632cf6c27d..0000000000
--- a/editor/icons/icon_snap.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3v2h2v-2zm6 0v2h2v-2zm-6 6v2h2v-2zm4 4v2h2v-2zm6 0v2h2v-2z" fill="#e0e0e0"/><path d="m11 7a4 4 0 0 0 -4 4v2h2v-2a2 2 0 0 1 2-2 2 2 0 0 1 2 2v2h2v-2a4 4 0 0 0 -4-4z" fill="#fff" fill-opacity=".68627"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_snap_grid.svg b/editor/icons/icon_snap_grid.svg
deleted file mode 100644
index a4a1f33053..0000000000
--- a/editor/icons/icon_snap_grid.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 0v3h-3v2h3v4h-3v2h3v3h2v-9h9v-2h-3v-3h-2v3h-4v-3zm4 13v2h2v-2zm6 0v2h2v-2z" fill="#e0e0e0"/><path d="m11 7a4 4 0 0 0 -4 4v2h2v-2a2 2 0 0 1 2-2 2 2 0 0 1 2 2v2h2v-2a4 4 0 0 0 -4-4z" fill="#fff" fill-opacity=".68627"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_soft_body.svg b/editor/icons/icon_soft_body.svg
deleted file mode 100644
index 2c907df847..0000000000
--- a/editor/icons/icon_soft_body.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1s-3 5 0 7-1 7-1 7h13s3-6 0-8 1-6 1-6zm2 2h7s-2 3 1 5 0 5 0 5h-7s2-4-1-6 0-4 0-4z" fill="#fc9c9c" fill-opacity=".996078"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sort.svg b/editor/icons/icon_sort.svg
deleted file mode 100644
index 0b2f7f7ea9..0000000000
--- a/editor/icons/icon_sort.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1v2h6v-2zm-5.0156.0019531a1.0001 1.0001 0 0 0 -.69141.29102l-2 2a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l.29297-.29297v7.1719l-.29297-.29297a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2a1 1 0 0 0 0-1.4141 1 1 0 0 0 -1.4141 0l-.29297.29297v-7.1719l.29297.29297a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-2-2a1.0001 1.0001 0 0 0 -.72266-.29102zm5.0156 5.998v2h4v-2zm0 6v2h2v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_spatial.svg b/editor/icons/icon_spatial.svg
deleted file mode 100644
index 6a469dde13..0000000000
--- a/editor/icons/icon_spatial.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_spatial_material.svg b/editor/icons/icon_spatial_material.svg
deleted file mode 100644
index cfd994a0fe..0000000000
--- a/editor/icons/icon_spatial_material.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-3.7891 1.8945h8.4727l-3.7891-1.8945a1.0001 1.0001 0 0 0 -.48438-.10352z" fill="#ff7070"/><path d="m3.7637 3-2.2109 1.1055a1.0001 1.0001 0 0 0 -.55273.89453h3.2363l3.7637-1.8809 3.7637 1.8809h3.2363a1.0001 1.0001 0 0 0 -.55273-.89453l-2.2109-1.1055h-8.4727z" fill="#ffeb70"/><path d="m1 5v2h2v-.38086l.76172.38086h8.4766l.76172-.38086v.38086h2v-2h-3.2363l-3.7637 1.8828-3.7637-1.8828h-3.2363z" fill="#9dff70"/><path d="m1 7v2h2v-2zm2.7617 0 3.2383 1.6191v.38086h2v-.38086l3.2383-1.6191zm9.2383 0v2h2v-2z" fill="#70ffb9"/><path d="m1 9v2h3.2344l-1.2344-.61719v-1.3828h-2zm6 0v2h2v-2zm6 0v1.3828l-1.2344.61719h3.2344v-2h-2z" fill="#70deff"/><path d="m3.7637 13 3.7891 1.8945a1.0001 1.0001 0 0 0 .48438.10547 1.0001 1.0001 0 0 0 .41016-.10547l3.7891-1.8945h-8.4727z" fill="#ff70ac"/><path d="m1 11a1.0001 1.0001 0 0 0 .55273.89453l2.2109 1.1055h8.4727l2.2109-1.1055a1.0001 1.0001 0 0 0 .55273-.89453h-3.2344l-2.7656 1.3828v-1.3828h-2v1.3828l-2.7656-1.3828h-3.2344z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sphere_mesh.svg b/editor/icons/icon_sphere_mesh.svg
deleted file mode 100644
index b01ba46bcf..0000000000
--- a/editor/icons/icon_sphere_mesh.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.8541 0-7 3.1459-7 7 0 3.8542 3.1459 7 7 7s7-3.1458 7-7c0-3.8541-3.1459-7-7-7zm-1 2.0977v4.8711c-1.2931-.071342-2.6061-.29819-3.9434-.69141.30081-2.0978 1.8852-3.7665 3.9434-4.1797zm2 0c2.0549.41253 3.637 2.0767 3.9414 4.1699-1.3046.36677-2.6158.60259-3.9414.6875zm3.7852 6.2812c-.50864 1.7788-1.9499 3.1531-3.7852 3.5215v-2.9512c1.2792-.072301 2.5419-.26704 3.7852-.57031zm-9.5645.017578c1.2733.31892 2.5337.50215 3.7793.5625v2.9414c-1.8291-.36719-3.266-1.7339-3.7793-3.5039z" fill="#ffd684"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sphere_shape.svg b/editor/icons/icon_sphere_shape.svg
deleted file mode 100644
index 4da18a1a38..0000000000
--- a/editor/icons/icon_sphere_shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" fill="#68b6ff" r="7"/><circle cx="6" cy="5" fill="#a2d2ff" r="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_spin_box.svg b/editor/icons/icon_spin_box.svg
deleted file mode 100644
index 728710e440..0000000000
--- a/editor/icons/icon_spin_box.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h7v-2-6-2zm10 1-2 3h4zm-10 1h5v6h-5zm8 4 2 3 2-3z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_spot_light.svg b/editor/icons/icon_spot_light.svg
deleted file mode 100644
index 6a35ee3890..0000000000
--- a/editor/icons/icon_spot_light.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a1 1 0 0 0 -1 1v3.6934c-1.7861.86608-3 2.4605-3 4.3066h4a2 2 0 0 0 2 2 2 2 0 0 0 2-2h4c0-1.8462-1.2139-3.4406-3-4.3066v-3.6934a1 1 0 0 0 -1-1zm-1.0977 9.6348-1.7324 1 1 1.7305 1.7324-1zm6.1953 0-1 1.7305 1.7324 1 1-1.7305zm-4.0977 2.3652v2h2v-2z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_spring_arm.svg b/editor/icons/icon_spring_arm.svg
deleted file mode 100644
index eb0c1ebd7d..0000000000
--- a/editor/icons/icon_spring_arm.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#fc9c9c" stroke-width="2"><path d="m8 14 6-6"/><path d="m2 2 7 7"/><path d="m10 9h-6"/><path d="m9 9v-5"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sprite.svg b/editor/icons/icon_sprite.svg
deleted file mode 100644
index 26a10625fc..0000000000
--- a/editor/icons/icon_sprite.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-2.216 0-4 1.784-4 4v6c0 2.216 1.784 4 4 4h6c2.216 0 4-1.784 4-4v-6c0-2.216-1.784-4-4-4zm-1 5c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm8 0c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm-1.8887 5.1074a1.0001 1.0001 0 0 1 .7168 1.7207c-.74987.74987-1.7676 1.1719-2.8281 1.1719s-2.0783-.422-2.8281-1.1719a1.0001 1.0001 0 0 1 .69727-1.7168 1.0001 1.0001 0 0 1 .7168.30273c.37534.37535.88325.58594 1.4141.58594s1.0387-.21059 1.4141-.58594a1.0001 1.0001 0 0 1 .69727-.30664z" fill="#a5b7f3"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sprite_3d.svg b/editor/icons/icon_sprite_3d.svg
deleted file mode 100644
index 385bb8f87d..0000000000
--- a/editor/icons/icon_sprite_3d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-2.216 0-4 1.784-4 4v6c0 2.216 1.784 4 4 4h6c2.216 0 4-1.784 4-4v-6c0-2.216-1.784-4-4-4zm-1 5c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm8 0c.554 0 1 .446 1 1v2c0 .554-.446 1-1 1s-1-.446-1-1v-2c0-.554.446-1 1-1zm-1.8887 5.1074a1.0001 1.0001 0 0 1 .7168 1.7207c-.74987.74987-1.7676 1.1719-2.8281 1.1719s-2.0783-.422-2.8281-1.1719a1.0001 1.0001 0 0 1 .69727-1.7168 1.0001 1.0001 0 0 1 .7168.30273c.37534.37535.88325.58594 1.4141.58594s1.0387-.21059 1.4141-.58594a1.0001 1.0001 0 0 1 .69727-.30664z" fill="#fc9c9c"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sprite_frames.svg b/editor/icons/icon_sprite_frames.svg
deleted file mode 100644
index f27adcb78c..0000000000
--- a/editor/icons/icon_sprite_frames.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.108 0-2 .89199-2 2v6c0 1.108.89199 2 2 2h6c1.108 0 2-.89199 2-2v-6c0-1.108-.89199-2-2-2zm10 0v2h2v-2zm-10 4c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm6 0c.554 0 1 .446 1 1v1c0 .554-.446 1-1 1s-1-.446-1-1v-1c0-.554.446-1 1-1zm4 0v2h2v-2zm-9 4h2 2a2 1 0 0 1 -1 .86523 2 1 0 0 1 -2 0 2 1 0 0 1 -1-.86523zm9 0v2h2v-2zm-12 4v2h2v-2zm4 0v2h2v-2zm4 0v2h2v-2zm4 0v2h2v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_sprite_sheet.svg b/editor/icons/icon_sprite_sheet.svg
deleted file mode 100644
index 9b3eda3287..0000000000
--- a/editor/icons/icon_sprite_sheet.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2zm-8 4h2v2h-2zm4 0h2v2h-2zm4 0h2v2h-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_static_body.svg b/editor/icons/icon_static_body.svg
deleted file mode 100644
index de819bd76b..0000000000
--- a/editor/icons/icon_static_body.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a2 2 0 0 0 -1.4141.58594 2 2 0 0 0 -.58594 1.4141v10a2 2 0 0 0 .58594 1.4141 2 2 0 0 0 1.4141.58594h10a2 2 0 0 0 2-2v-10a2 2 0 0 0 -2-2h-10zm0 1h10a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-10a1 1 0 0 1 -1-1v-10a1 1 0 0 1 1-1zm0 1v2h2v-2zm8 0v2h2v-2zm-8 8v2h2v-2zm8 0v2h2v-2z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_static_body_2d.svg b/editor/icons/icon_static_body_2d.svg
deleted file mode 100644
index 2d846c5471..0000000000
--- a/editor/icons/icon_static_body_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m29 1042.4h1v1h-1z" fill="#fefeff"/><path d="m3 1a2 2 0 0 0 -1.4141.58594 2 2 0 0 0 -.58594 1.4141v10a2 2 0 0 0 .58594 1.4141 2 2 0 0 0 1.4141.58594h10a2 2 0 0 0 2-2v-10a2 2 0 0 0 -2-2h-10zm0 1h10a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-10a1 1 0 0 1 -1-1v-10a1 1 0 0 1 1-1zm0 1v2h2v-2zm8 0v2h2v-2zm-8 8v2h2v-2zm8 0v2h2v-2z" fill="#a5b7f3" fill-opacity=".98824" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_status_error.svg b/editor/icons/icon_status_error.svg
deleted file mode 100644
index ac3060e155..0000000000
--- a/editor/icons/icon_status_error.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7s3.134 7 7 7 7-3.134 7-7-3.134-7-7-7zm-2.8281 2.7578 2.8281 2.8281 2.8281-2.8281 1.4141 1.4141-2.8281 2.8281 2.8281 2.8281-1.4141 1.4141-2.8281-2.8281-2.8281 2.8281-1.4141-1.4141 2.8281-2.8281-2.8281-2.8281 1.4141-1.4141z" fill="#ff5d5d"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_status_success.svg b/editor/icons/icon_status_success.svg
deleted file mode 100644
index 4a22c6fc7f..0000000000
--- a/editor/icons/icon_status_success.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7s3.134 7 7 7 7-3.134 7-7-3.134-7-7-7zm3.293 3.877 1.4141 1.4141-5.707 5.709-3.707-3.709 1.4141-1.4141 2.293 2.293z" fill="#45ff8b"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_status_warning.svg b/editor/icons/icon_status_warning.svg
deleted file mode 100644
index 4ec16008d7..0000000000
--- a/editor/icons/icon_status_warning.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1 2h2v7h-2zm0 8h2v2h-2z" fill="#ffdd65"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_stop.svg b/editor/icons/icon_stop.svg
deleted file mode 100644
index 2cb013c0df..0000000000
--- a/editor/icons/icon_stop.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1048.4v-8h8v8z" fill="#e0e0e0" fill-rule="evenodd" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_stream_texture.svg b/editor/icons/icon_stream_texture.svg
deleted file mode 100644
index e7845e10f3..0000000000
--- a/editor/icons/icon_stream_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1 1 0 0 0 -1 1v12a1 1 0 0 0 1 1h6v-2h2v-2h-2-5v-8h5v-2zm6 2v2h2v-2zm2 0h2v-2h-2zm2 0v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm0 2h-2v2h2zm0 2v2h2v-2zm0 2h-2v2h2zm-2-4v-2h-2v-1h-1v1h-1v1h-1v1h-1v1h2 2v-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_string.svg b/editor/icons/icon_string.svg
deleted file mode 100644
index 9f3bb0b011..0000000000
--- a/editor/icons/icon_string.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 2a3 3 0 0 0 -3 3v2a1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 3-3v-2a1 1 0 0 1 1-1h1v-2zm2 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2zm8 2a3 3 0 0 0 -3 3v3h2v-3a1 1 0 0 1 1-1h1v-2z" fill="#6ba7ec"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_style_box_empty.svg b/editor/icons/icon_style_box_empty.svg
deleted file mode 100644
index 0268b03ef2..0000000000
--- a/editor/icons/icon_style_box_empty.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v1h2v-2zm3 0v2h2v-2zm4 0v2h2v-2zm4 0v2h2v-1c-.000055-.5523-.44774-.9999-1-1z" fill="#ff7070"/><path d="m1 5v2h2v-2zm12 0v.23242c.31584.1783.57817.43795.75977.75195.19142.33153.43699.67036.69922 1.0156h.54102v-2h-2z" fill="#9dff70"/><path d="m12 7c-.43047.7456-.94451 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2zm2.459 0c.17438.2296.352.46082.54102.69922v-.69922z" fill="#70ffb9"/><path d="m1 9v2h2v-2zm9.5645 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78151-1.31-1.334-2z" fill="#70deff"/><path d="m1 13v1c.0000552.5523.44774.9999 1 1h1v-2zm4 0v2h2v-2zm4.1836 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m9.2305 11c-.13656.32585-.23047.65576-.23047 1 0 .35235.07201.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_style_box_flat.svg b/editor/icons/icon_style_box_flat.svg
deleted file mode 100644
index a6f43be4c8..0000000000
--- a/editor/icons/icon_style_box_flat.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1c-.55226.0001-.99994.4477-1 1v1h14v-1c-.000055-.5523-.44774-.9999-1-1z" fill="#ff7070"/><path d="m1 3v2h14v-2z" fill="#ffeb70"/><path d="m1 5v2h8.582c.25686-.33847.49465-.66934.68555-1 .33885-.5859.95103-.96109 1.627-.99609.7512-.04 1.4613.34489 1.8379.99609.18899.32737.42831.66049.68555 1h.58203v-2h-14z" fill="#9dff70"/><path d="m1 7v2h7.0547c.14116-.20345.28508-.40233.42383-.58398.38601-.5053.76348-.96794 1.1035-1.416h-8.582zm11 0c-.43047.7456-.94451 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2zm2.418 0c.18626.24583.37928.49419.58203.75v-.75z" fill="#70ffb9"/><path d="m1 9v2h6.1172c.17955-.78395.54577-1.4354.9375-2zm9.5645 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78151-1.31-1.334-2z" fill="#70deff"/><path d="m1 13v1c.0000552.5523.44774.9999 1 1h6.0371c-.44511-.58388-.76161-1.2639-.91992-2h-6.1172zm8.1836 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m1 11v2h6.1172c-.06966-.3239-.11719-.65596-.11719-1 0-.35655.045474-.68688.11719-1zm8.2305 0c-.13656.32585-.23047.65576-.23047 1 0 .35235.07201.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_style_box_line.svg b/editor/icons/icon_style_box_line.svg
deleted file mode 100644
index d7c26aac9d..0000000000
--- a/editor/icons/icon_style_box_line.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.303 1c-.4344 0-.86973.16881-1.2012.50586l-1.4688 1.4941h4.3418c.082839-.52789-.072596-1.0872-.47266-1.4941-.33144-.33705-.76482-.50586-1.1992-.50586z" fill="#ff7070"/><path d="m10.633 3-1.9668 2h4.8008l1.0352-1.0527c.2628-.2673.41824-.60049.47266-.94727h-4.3418z" fill="#ffeb70"/><path d="m8.666 5-1.9648 2h2.8809c.25686-.33847.49465-.66934.68555-1 .33885-.5859.95098-.96109 1.627-.99609.44399-.023642.86385.115 1.2188.35547l.35352-.35938h-4.8008z" fill="#9dff70"/><path d="m1.2617 13c-.08284.52789.072596 1.0872.47266 1.4941.33144.33705.76484.50586 1.1992.50586.4344 0 .8697-.16881 1.2012-.50586l1.4688-1.4941h-4.3418zm7.9219 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m2.7695 11-1.0352 1.0527c-.2628.2673-.41824.60049-.47266.94727h4.3418l1.4238-1.4473c.020288-.18998.04923-.37542.089844-.55273h-4.3477zm6.4609 0c-.13656.32585-.23047.65576-.23047 1 0 .35235.072014.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/><path d="m4.7363 9-1.9668 2h4.3477c.17955-.78395.54577-1.4354.9375-2zm5.8281 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78149-1.31-1.334-2z" fill="#70deff"/><path d="m6.7012 7-1.9648 2h3.3184c.14116-.20345.28508-.40233.42383-.58398.38601-.5053.7635-.96796 1.1035-1.416h-2.8809zm5.2988 0c-.43047.7456-.94456 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2z" fill="#70ffb9"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_style_box_texture.svg b/editor/icons/icon_style_box_texture.svg
deleted file mode 100644
index 6f067a4db4..0000000000
--- a/editor/icons/icon_style_box_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1a1.0001 1.0001 0 0 0 -1 1v1h2 10 2v-1a1.0001 1.0001 0 0 0 -1-1z" fill="#ff7070"/><path d="m1 3v2h2v-2zm12 0v2h2v-2zm-4 1v1h1v-1z" fill="#ffeb70"/><path d="m1 5v2h2v-2zm7 0v1h-2v1h3.543c.26215-.34438.50373-.68039.69727-1.0156a2.0315 2.0315 0 0 1 .75977-.75195v-.23242h-1-1-1zm5 0v.23242a2.0315 2.0315 0 0 1 .75977.75195c.19142.33153.43699.67033.69922 1.0156h.54102v-2h-2z" fill="#9dff70"/><path d="m1 7v2h2v-2zm4 0v1h-1v1h4.0156c.14585-.2113.29419-.41592.4375-.60352.38121-.49904.75394-.95521 1.0898-1.3965h-3.543-1zm7 0c-.43047.7456-.94451 1.3867-1.4355 2h2.8711c-.49104-.6133-1.0051-1.2544-1.4355-2zm2.459 0c.17438.22962.352.46082.54102.69922v-.69922z" fill="#70ffb9"/><path d="m1 9v2h2v-2zm9.5645 0c-.55248.69003-1.0583 1.3421-1.334 2h5.5391c-.2757-.65786-.78151-1.31-1.334-2z" fill="#70deff"/><path d="m1 13v1a1.0001 1.0001 0 0 0 1 1h5.998c-.4429-.5864-.77294-1.2592-.92578-2h-4.0723-2zm8.1836 0c.41312 1.1628 1.5119 2 2.8164 2s2.4033-.83718 2.8164-2z" fill="#ff70ac"/><path d="m1 11v2h2v-2zm8.2305 0c-.13656.32585-.23047.65576-.23047 1 0 .35235.07201.68593.18359 1h5.6328c.11158-.31407.18359-.64765.18359-1 0-.34424-.093909-.67415-.23047-1h-5.5391z" fill="#9f70ff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tab_container.svg b/editor/icons/icon_tab_container.svg
deleted file mode 100644
index fe0e426ef9..0000000000
--- a/editor/icons/icon_tab_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h5v2 2h5v6h-10zm7 0h3v2h-3z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tabs.svg b/editor/icons/icon_tabs.svg
deleted file mode 100644
index ad1e9069d0..0000000000
--- a/editor/icons/icon_tabs.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 4c-1.108 0-1.8178.9071-2 2l-1 6h-1v2h4 6 4v-2h-2l-1-6c-.18216-1.0929-.89199-2-2-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_test_cube.svg b/editor/icons/icon_test_cube.svg
deleted file mode 100644
index 16cf68520f..0000000000
--- a/editor/icons/icon_test_cube.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9629 1.002a1.0001 1.0001 0 0 0 -.41016.10352l-6 3a1.0001 1.0001 0 0 0 -.55273.89453v6a1.0001 1.0001 0 0 0 .55273.89453l6 3a1.0001 1.0001 0 0 0 .89453 0l6-3a1.0001 1.0001 0 0 0 .55273-.89453v-6a1.0001 1.0001 0 0 0 -.55273-.89453l-6-3a1.0001 1.0001 0 0 0 -.48438-.10352zm.037109 2.1172 3.7637 1.8809-3.7637 1.8828-3.7637-1.8828zm-5 3.5 4 2v3.7637l-4-2zm10 0v3.7637l-4 2v-3.7637z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd" transform="translate(0 .000012)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_text_edit.svg b/editor/icons/icon_text_edit.svg
deleted file mode 100644
index 66f2fca4ba..0000000000
--- a/editor/icons/icon_text_edit.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m29 1042.4h1v1h-1z" fill="#fefeff"/><path d="m3 1c-1.1046 0-2 .8954-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-10c0-1.1046-.89543-2-2-2zm0 2h10v10h-10zm1 1v4h1v-4z" fill="#a5efac" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_text_file.svg b/editor/icons/icon_text_file.svg
deleted file mode 100644
index d381048212..0000000000
--- a/editor/icons/icon_text_file.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg enable-background="new" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.370548 12.198712 1.078638-.0225c-.004-.738576-.008-1.477152-.01198-2.215728-1.429703.011985-2.859406.02397-4.289109.035955.004.759672.008 1.519344.01198 2.279016.40349-.01135.806981-.02271 1.210471-.03406v3.755044h2m-7.2700003-3.749287c.332722.21587.665444.431741.998166.647611-.3328629.218648-.6657258.437297-.9985887.655945-.0000001.818044-.0000002 1.636088-.0000003 2.454132.5662705-.533749 1.1325409-1.067498 1.6988114-1.601247.6353035.532396 1.2706071 1.064791 1.9059106 1.597187-.00095-.757409-.0019-1.514817-.00285-2.272226-.2987204-.278501-.5974407-.557002-.8961611-.835503.2983766-.205775.5967531-.41155.8951297-.617325.00283-.73844.00565-1.476881.00848-2.215321-.63732.474447-1.27464.948893-1.91196 1.42334-.5656447-.504299-1.1312895-1.008599-1.6969342-1.5128982m-1.4606388 2.2314242c.3595459-.0075.7190917-.015 1.0786376-.0225-.00399-.738576-.00799-1.477152-.011985-2.2157276-1.4297028.011985-2.8594057.02397-4.2891085.035955.00399.7596716.00799 1.5193436.011985 2.2790156.4034903-.01135.8069806-.02271 1.2104709-.03406v3.755044h2m2.3600877-14.999998c-.18815.7526-.3763 1.5052-.56445 2.2578-.3833928.1379205-.7411891.4041566-1.0765556.0469548-.5337315-.3203516-1.0674629-.6407032-1.6011944-.9610548-.4713667.4713667-.9427333.9427333-1.4141 1.4141.3984333.6647.7968667 1.3294 1.1953 1.9941-.1706946.369732-.2331288.8106877-.7232054.7948719-.6052849.1510593-1.2105697.3021187-1.8158546.4531781v2h5.2715c-.6869282-1.0800497-.0133438-2.6625661 1.2286888-2.9370347 1.2082391-.3582 2.5455142.6777799 2.4998312 1.9370347.104409.4657408-.6052318 1.1778026.181951 1h4.818019c0-.6666667 0-1.3333333 0-2-.7526-.18815-1.5052-.3763-2.2578-.56445-.138671-.3826756-.40361-.7396543-.047118-1.0747035.320406-.5343322.640812-1.0686643.961218-1.6029965-.471367-.4713667-.942733-.9427333-1.4141-1.4141-.6647.3984333-1.3294.7968667-1.9941 1.1953-.3697319-.1706947-.8106877-.2331288-.7948719-.7232054-.1510593-.6052849-.3021187-1.2105697-.4531781-1.8158546-.6666322.00004002-1.3334865-.00008002-1.99998.00006z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_texture_3_d.svg b/editor/icons/icon_texture_3_d.svg
deleted file mode 100644
index ed8ce3e4ef..0000000000
--- a/editor/icons/icon_texture_3_d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2 1c-.5522847 0-1 .4477153-1 1v12c0 .552285.4477153 1 1 1h12c.552285 0 1-.447715 1-1v-12c0-.5522847-.447715-1-1-1zm1 2h10v8h-10z" fill-opacity=".99608" transform="translate(.359546 -.287637)"/><g fill-opacity=".996078" stroke-width=".203212" transform="scale(.9167105 1.0908569)"><path d="m5.8175194 8.9717502q-.2194689 0-.4633233-.032514-.2438544-.0243854-.4714519-.0731562-.2275974-.0487709-.4145524-.1056703-.1869551-.0568993-.2926253-.1056702l.2357259-1.0079315q.2113405.089413.5364797.1950835.3332677.097542.8209765.097542.5608651 0 .8209764-.2113404.2601114-.2113405.2601114-.5689936 0-.219469-.097542-.3657816-.089413-.1544415-.2519826-.2438547-.1625696-.0975418-.3901671-.1300557-.2194689-.0406424-.4714518-.0406424h-.4714519v-.9754176h.5364797q.1788266 0 .3413962-.032514.1706981-.032514.3007537-.1056703.1300557-.081285.203212-.2113404.081285-.1381842.081285-.3413962 0-.1544411-.065028-.2682398-.0650278-.1137987-.1706981-.186955-.0975417-.0731563-.2357259-.1056702-.1300557-.0406424-.2682398-.0406424-.3495247 0-.6502784.1056702-.2926253.1056703-.5364797.2601114l-.4308095-.8860043q.1300557-.0812848.3007538-.1706981.1788266-.0894133.390167-.1625696.2113405-.0731563.4470664-.1219272.2438544-.048771.5120943-.048771.4958373 0 .8534904.1219272.3657816.1137987.6015075.3332677.2357259.2113405.3495246.5039657.1137987.2844968.1137987.625893 0 .3332677-.186955.6502784-.186955.3088822-.5039657.4714518.4389379.1788266.6746638.5364797.2438544.3495246.2438544.8453619 0 .3901671-.1300557.7234347-.1300557.3251393-.406424.5689937-.2763683.235726-.7071777.3739101-.422681.1300557-1.0079316.1300557z"/><path d="m10.502445 7.817506q.08941.00813.203212.016257.121927 0 .284497 0 .951032 0 1.406227-.4795803.463323-.4795803.463323-1.3249422 0-.8860044-.438938-1.3411992-.438938-.4551949-1.38997-.4551949-.130055 0-.26824.00813-.138184 0-.260111.016257zm3.665945-1.7882655q0 .7315631-.227598 1.2761713-.227597.5446082-.650278.9022613-.414553.3576531-1.01606.5364797-.601508.1788265-1.349328.1788265-.341396 0-.796591-.032514-.4551948-.0243853-.8941328-.1137986v-5.486724q.438938-.081285.9103898-.1056702.47958-.032514.820976-.032514.723435 0 1.308686.1625696.593379.1625696 1.01606.5120943.422681.3495246.650278.8941328.227598.5446081.227598 1.3086853z"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_texture_array.svg b/editor/icons/icon_texture_array.svg
deleted file mode 100644
index 4631b1449c..0000000000
--- a/editor/icons/icon_texture_array.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2 1c-.5522847 0-1 .4477153-1 1v12c0 .552285.4477153 1 1 1h12c.552285 0 1-.447715 1-1v-12c0-.5522847-.447715-1-1-1zm1 2h10v8h-10z" fill-opacity=".99608" transform="translate(.359546 -.287637)"/><g fill-opacity=".996078" stroke-width=".207395" transform="matrix(1.6197742 0 0 .750929 -3.723153 1.832957)"><path d="m4.7302951 2.4553483h2.2481639v.9872012h-1.0701592v6.0559397h1.0701592v.9872008h-2.2481639z"/><path d="m10.138643 10.48569h-2.2481636v-.9872008h1.0701592v-6.0559397h-1.0701592v-.9872012h2.2481636z"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_texture_button.svg b/editor/icons/icon_texture_button.svg
deleted file mode 100644
index 6e1d1b6436..0000000000
--- a/editor/icons/icon_texture_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1v2h6v10h-4v2h6v-14zm-5 1v3.1328l-1.4453-.96484-1.1094 1.6641 3 2c.3359.2239.77347.2239 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm7 4v1h-1v1h-1v1h1v2h2 2v-2h-1v-2h-1v-1zm-7.5 4c-.831 0-1.5.669-1.5 1.5v.5 1h-1v2h8v-2h-1v-1-.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_texture_progress.svg b/editor/icons/icon_texture_progress.svg
deleted file mode 100644
index 5763fde840..0000000000
--- a/editor/icons/icon_texture_progress.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5efac" transform="translate(0 -1036.4)"><path d="m3 3c-1.1046 0-2 .89543-2 2v6c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-6c0-1.1046-.89543-2-2-2zm0 2h10v6h-10z" transform="translate(0 1036.4)"/><path d="m4 1042.4h1v2h-1z"/><path d="m6 1043.4h1v3h-1z"/><path d="m8 1042.4h1v4h-1z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_texture_rect.svg b/editor/icons/icon_texture_rect.svg
deleted file mode 100644
index 1d1b5ed8f7..0000000000
--- a/editor/icons/icon_texture_rect.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h14v-14zm2 2h10v10h-10zm6 3v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-2h-1v-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_theme.svg b/editor/icons/icon_theme.svg
deleted file mode 100644
index e16acbfb72..0000000000
--- a/editor/icons/icon_theme.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width="0"><path d="m6.7246 3c-.52985.78935-.96267 1.4021-1.3945 2h5.3398c-.43187-.59786-.86468-1.2107-1.3945-2z" fill="#ffeb70"/><path d="m5.3301 5c-.52617.72841-1.0198 1.4208-1.375 2h8.0898c-.35516-.57924-.84883-1.2716-1.375-2z" fill="#9dff70"/><path d="m3.9551 7c-.41451.67603-.71534 1.3082-.85547 2h9.8008c-.14013-.69181-.44096-1.324-.85547-2h-8.0898z" fill="#70ffb9"/><path d="m3.0996 9c-.063989.3159-.099609.64498-.099609 1 0 .34242.034776.67693.10156 1h9.7969c.066786-.32307.10156-.65758.10156-1 0-.35502-.03562-.6841-.099609-1h-9.8008z" fill="#70deff"/><path d="m3.1016 11c.15381.74405.48967 1.4159.93555 2h7.9258c.44588-.5841.78173-1.2559.93555-2h-9.7969z" fill="#9f70ff"/><path d="m4.0371 13c.9218 1.2076 2.3612 2 3.9629 2s3.0411-.79243 3.9629-2z" fill="#ff70ac"/><path d="m8 1c-.45196.75327-.87224 1.3994-1.2754 2h2.5508c-.40315-.6006-.82343-1.2467-1.2754-2z" fill="#ff7070"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_thumbnail_wait.svg b/editor/icons/icon_thumbnail_wait.svg
deleted file mode 100644
index fe242e81fb..0000000000
--- a/editor/icons/icon_thumbnail_wait.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m8 0c-4.432 0-8 3.568-8 8v48c0 4.432 3.568 8 8 8h48c4.432 0 8-3.568 8-8v-48c0-4.432-3.568-8-8-8zm0 2h48c3.324 0 6 2.676 6 6v48c0 3.324-2.676 6-6 6h-48c-3.324 0-6-2.676-6-6v-48c0-3.324 2.676-6 6-6zm-.013672 5.002a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l8 8a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-8-8a1 1 0 0 0 -.7207-.29102zm48 0a1 1 0 0 0 -.69336.29102l-8 8a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l8-8a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102zm-33.986 10.998a2.0002 2.0002 0 0 0 -.37891.039062c-.005702.001087-.011894.000819-.017578.001954-.01402.002798-.027106.006677-.041016.009765a2.0002 2.0002 0 0 0 -.30859.095703c-.024592.009869-.048174.020446-.072265.03125a2.0002 2.0002 0 0 0 -.24609.13281c-.021344.013452-.043669.024834-.064453.039062-.008816.006036-.016678.013359-.025391.019532a2.0002 2.0002 0 0 0 -.21484.17578c-.0215.020231-.04387.039386-.064453.060547a2.0002 2.0002 0 0 0 -.001953.001953 2.0002 2.0002 0 0 0 -.18555.22461c-.017788.024669-.036063.048717-.052734.074219a2.0002 2.0002 0 0 0 -.14258.26562c-.013621.029909-.026892.059158-.039063.089844a2.0002 2.0002 0 0 0 -.09375.30078c-.004203.018931-.008053.037509-.011719.056641a2.0002 2.0002 0 0 0 -.039062.38086c0 3 1.9339 5.2454 3.7461 7.3164 1.5217 1.7392 2.8322 3.2888 3.75 4.6836-.91778 1.3948-2.2283 2.9444-3.75 4.6836-1.8122 2.071-3.7461 4.3164-3.7461 7.3164a2.0002 2.0002 0 0 0 .041016.4043 2.0002 2.0002 0 0 0 .10547.3418c.008774.021862.017831.042985.027344.064453a2.0002 2.0002 0 0 0 .14648.27344c.010017.015513.018867.031664.029297.046875l.001953.001953a2.0002 2.0002 0 0 0 .19336.23633c.020231.0215.039386.04387.060547.064453a2.0002 2.0002 0 0 0 .001953.001953 2.0002 2.0002 0 0 0 .23438.19336c.021387.01522.042447.030536.064453.044922a2.0002 2.0002 0 0 0 .27734.15039c.019743.008822.038513.019147.058594.027343a2.0002 2.0002 0 0 0 .33789.10352c.005331.001131.010278.002818.015625.003906a2.0002 2.0002 0 0 0 .009766 0 2.0002 2.0002 0 0 0 .39453.041016h20a2.0002 2.0002 0 0 0 .4043-.041016 2.0002 2.0002 0 0 0 .375-.11523 2.0002 2.0002 0 0 0 .29297-.1582c.018831-.011984.038248-.022566.05664-.035156a2.0002 2.0002 0 0 0 .021485-.015625 2.0002 2.0002 0 0 0 .23633-.19531c.013296-.012808.028079-.023939.041015-.037109a2.0002 2.0002 0 0 0 .20508-.25c.012127-.017168.025518-.033217.03711-.050782a2.0002 2.0002 0 0 0 .15234-.28125c.01106-.024605.021165-.049089.03125-.074218a2.0002 2.0002 0 0 0 .097656-.31445c.003563-.016291.0066-.03239.009766-.048829a2.0002 2.0002 0 0 0 .039062-.38281c0-3-1.9339-5.2454-3.7461-7.3164-1.5217-1.7392-2.8322-3.2888-3.75-4.6836.91778-1.3948 2.2283-2.9444 3.75-4.6836 1.8122-2.071 3.7461-4.3164 3.7461-7.3164a2.0002 2.0002 0 0 0 -.041016-.4043v-.001953a2.0002 2.0002 0 0 0 -.10156-.32617c-.011965-.03044-.023719-.060163-.03711-.089844a2.0002 2.0002 0 0 0 -.13476-.25c-.011984-.018831-.022566-.038248-.035156-.05664a2.0002 2.0002 0 0 0 -.023438-.03125 2.0002 2.0002 0 0 0 -.1582-.19336c-.025026-.027154-.049686-.054353-.076172-.080078a2.0002 2.0002 0 0 0 -.027344-.02539 2.0002 2.0002 0 0 0 -.18945-.1543c-.031037-.022641-.061384-.04555-.09375-.066407l-.001953-.001953a2.0002 2.0002 0 0 0 -.24219-.13086c-.031326-.014467-.061564-.030098-.09375-.042969a2.0002 2.0002 0 0 0 -.29883-.091797c-.021554-.004877-.042636-.009492-.064453-.013672a2.0002 2.0002 0 0 0 -.38086-.039062h-20zm3.1758 4h13.648c-.4756.8814-.611 1.5782-1.5781 2.6836-1.6878 1.929-3.7966 3.9449-5.0352 6.4219a2.0002 2.0002 0 0 0 -.20898.89453h-.003906a2.0002 2.0002 0 0 0 -.20898-.89453c-1.2385-2.477-3.3473-4.4929-5.0352-6.4219-.96713-1.1054-1.1025-1.8022-1.5781-2.6836zm-9.1895 25.002a1 1 0 0 0 -.69336.29102l-8 8a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l8-8a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102zm32 0a1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l8 8a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-8-8a1 1 0 0 0 -.7207-.29102z" fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tile_map.svg b/editor/icons/icon_tile_map.svg
deleted file mode 100644
index afdaeea7e8..0000000000
--- a/editor/icons/icon_tile_map.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tile_set.svg b/editor/icons/icon_tile_set.svg
deleted file mode 100644
index 0948e6dae1..0000000000
--- a/editor/icons/icon_tile_set.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm3 0v2h2v-2zm-12 3v2h2v-2zm3 0v2h2v-2zm5 1v7h5c.55228 0 1-.44772 1-1v-5c0-.55228-.44772-1-1-1v4l-1-1-1 1v-4zm-8 2v2h2v-2zm3 0v2h2v-2zm-3 3v2h2v-2zm3 0v2h2v-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_time.svg b/editor/icons/icon_time.svg
deleted file mode 100644
index eb411c6858..0000000000
--- a/editor/icons/icon_time.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="matrix(.0279396 0 0 .02755726 .914016 .7343)"><path d="m276.193 58.507v-18.118h14.578c11.153 0 20.194-9.042 20.194-20.194s-9.042-20.195-20.194-20.195h-69.544c-11.153 0-20.194 9.042-20.194 20.194s9.042 20.194 20.194 20.194h14.578v18.118c-115.853 10.254-207.006 107.821-207.006 226.293 0 125.279 101.922 227.201 227.201 227.201s227.201-101.922 227.201-227.201c-.001-118.472-91.155-216.039-207.008-226.292zm0 412.009v-20.124c0-11.153-9.042-20.194-20.194-20.194-11.153 0-20.194 9.042-20.194 20.194v20.124c-86.91-9.385-156.137-78.614-165.522-165.522h20.124c11.153 0 20.194-9.042 20.194-20.194s-9.042-20.194-20.194-20.194h-20.125c9.385-86.91 78.614-156.137 165.522-165.523v20.124c0 11.153 9.042 20.194 20.194 20.194 11.153 0 20.194-9.042 20.194-20.194v-20.126c86.91 9.385 156.137 78.614 165.522 165.523h-20.124c-11.153 0-20.194 9.042-20.194 20.194s9.042 20.194 20.194 20.194h20.126c-9.385 86.911-78.613 156.14-165.523 165.524z"/><path d="m317.248 194.99-58.179 58.18c-1.011-.097-2.034-.151-3.071-.151-17.552 0-31.779 14.229-31.779 31.779 0 17.552 14.228 31.779 31.779 31.779s31.779-14.229 31.779-31.779c0-1.037-.054-2.06-.151-3.07l58.178-58.18c7.887-7.885 7.887-20.672 0-28.559-7.882-7.886-20.669-7.886-28.556.001z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_timeline_indicator.svg b/editor/icons/icon_timeline_indicator.svg
deleted file mode 100644
index fd18192705..0000000000
--- a/editor/icons/icon_timeline_indicator.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 0h10l-4 4h-2z" fill="#fefefe"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_timer.svg b/editor/icons/icon_timer.svg
deleted file mode 100644
index d445eeb1dd..0000000000
--- a/editor/icons/icon_timer.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a1.0001 1.0001 0 0 0 -.38672.078125 1.0001 1.0001 0 0 0 -.0019531 0c-.0022762.0009545-.0035918.0029354-.0058593.0039062a1.0001 1.0001 0 0 0 -.31055.20898c-.0012857.0012787-.0026276.0026206-.0039063.0039063a1.0001 1.0001 0 0 0 -.20508.30469c-.0029915.0068502-.0069239.012601-.0097656.019531a1.0001 1.0001 0 0 0 -.076172.38086c0 1.5.96697 2.6247 1.873 3.6602.76081.8695 1.4161 1.6425 1.875 2.3398-.45889.6974-1.1141 1.4723-1.875 2.3418-.90608 1.0355-1.873 2.1582-1.873 3.6582a1.0001 1.0001 0 0 0 .078125.38867v.001953c.0009292.002204.0029617.003663.0039062.005859a1.0001 1.0001 0 0 0 .20898.30664c.0010185.001027.0028834.004836.0039063.005859a1.0001 1.0001 0 0 0 .30078.20312c.0093182.004119.017877.007879.027344.011719a1.0001 1.0001 0 0 0 .37695.076172h10a1.0001 1.0001 0 0 0 .375-.074219c.010174-.0041.019294-.009251.029297-.013672a1.0001 1.0001 0 0 0 .29297-.19922c.004786-.004679.00898-.008899.013672-.013672a1.0001 1.0001 0 0 0 .20117-.29492c.004119-.009318.007879-.017877.011719-.027344a1.0001 1.0001 0 0 0 .076172-.37695c0-1.5-.96697-2.6227-1.873-3.6582-.76087-.8695-1.4161-1.6444-1.875-2.3418.4589-.6973 1.1142-1.4703 1.875-2.3398.90608-1.0355 1.873-2.1602 1.873-3.6602a1.0001 1.0001 0 0 0 -.078125-.39062 1.0001 1.0001 0 0 0 -.21484-.31641 1.0001 1.0001 0 0 0 -.31055-.21094 1.0001 1.0001 0 0 0 -.011718-.0058593 1.0001 1.0001 0 0 0 -.38477-.076172h-10zm1.5879 2h6.8242c-.2378.4408-.3055.7892-.78906 1.3418-.84392.9645-1.8983 1.9723-2.5176 3.2109a1.0001 1.0001 0 0 0 -.10547.44727 1.0001 1.0001 0 0 0 -.10547-.44727c-.61926-1.2386-1.6737-2.2464-2.5176-3.2109-.48356-.5526-.55126-.901-.78906-1.3418z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_add_node.svg b/editor/icons/icon_tool_add_node.svg
deleted file mode 100644
index 71599c0b0d..0000000000
--- a/editor/icons/icon_tool_add_node.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(-26.001 -1046.2683)"><path d="m27.917081 1047.5557c-.422624 0-.763672.3411-.763672.7637v11.8301c0 .4226.341048.7637.763672.7637h12.507813c.422624 0 .761719-.3411.761719-.7637v-11.8301c0-.4226-.339095-.7637-.761719-.7637zm1.898438 1.6954h8.642578c.422624 0 .763672.341.763672.7636v8.5078c0 .4227-.341048.7618-.763672.7618h-8.642578c-.422625 0-.763672-.3391-.763672-.7618v-8.5078c0-.4226.341047-.7636.763672-.7636z"/><rect height="2.372881" ry=".76286" width="7.79661" x="30.20439" y="1052.9802"/><rect height="7.525424" ry=".729978" stroke-width=".882536" width="2.372881" x="32.916256" y="1050.3361"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_button.svg b/editor/icons/icon_tool_button.svg
deleted file mode 100644
index 98a41d2a08..0000000000
--- a/editor/icons/icon_tool_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 1.1738c-1.1979.4235-1.999 1.5557-2 2.8262.0009552 1.2705.80214 2.4027 2 2.8262v7.1738c0 .554.446 1 1 1s1-.446 1-1v-7.1758c1.1972-.4232 1.9982-1.5544 2-2.8242-.0018-1.2698-.80282-2.401-2-2.8242v2.8242c0 .5523-.44772 1-1 1s-1-.4477-1-1zm-7 1.8262v3.1328l-1.4453-.96484-1.1094 1.6641 3 2c.3359.22389.77347.22389 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm-.5 8c-.831 0-1.5.669-1.5 1.5v.5h-1v2h8v-2h-1v-.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_connect.svg b/editor/icons/icon_tool_connect.svg
deleted file mode 100644
index 321f68654a..0000000000
--- a/editor/icons/icon_tool_connect.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(-26.001 -1046.2683)"><rect height="2.169492" ry=".76286" width="14.305085" x="26.766621" y="1053.1389"/><path d="m30.596131 1046.927v14.8861l8.228847-7.5722z"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_move.svg b/editor/icons/icon_tool_move.svg
deleted file mode 100644
index a02296fed6..0000000000
--- a/editor/icons/icon_tool_move.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7.9844 1.002a1.0001 1.0001 0 0 0 -.69141.29102l-2 2 1.4141 1.4141 1.293-1.293 1.293 1.293 1.4141-1.4141-2-2a1.0001 1.0001 0 0 0 -.72266-.29102zm-4.6914 4.291-2 2a1.0001 1.0001 0 0 0 0 1.4141l2 2 1.4141-1.4141-1.293-1.293 1.293-1.293-1.4141-1.4141zm9.4141 0-1.4141 1.4141 1.293 1.293-1.293 1.293 1.4141 1.4141 2-2a1.0001 1.0001 0 0 0 0-1.4141l-2-2zm-4.707.70703a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-1.293 5.293-1.4141 1.4141 2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2-1.4141-1.4141-1.293 1.293-1.293-1.293z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_pan.svg b/editor/icons/icon_tool_pan.svg
deleted file mode 100644
index e195542687..0000000000
--- a/editor/icons/icon_tool_pan.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10 1a1 1 0 0 0 -1 1v6h-1v-5a1 1 0 0 0 -1-1 1 1 0 0 0 -1 1v8 .033203l-2.4746-1.8086c-.52015-.3803-1.1948-.4556-1.6504 0-.45566.4556-.45561 1.1948 0 1.6504l4.125 4.125h6a2 2 0 0 0 2-2v-5-4a1 1 0 0 0 -1-1 1 1 0 0 0 -1 1v4h-1v-6a1 1 0 0 0 -1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_rotate.svg b/editor/icons/icon_tool_rotate.svg
deleted file mode 100644
index e25b08cd07..0000000000
--- a/editor/icons/icon_tool_rotate.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0879 1.002a7 7 0 0 0 -.30469.0019531 7 7 0 0 0 -.69727.056641 7 7 0 0 0 -5.9512 5.5742 7 7 0 0 0 1.9707 6.3652h-1.1055v2h4a1.0001 1.0001 0 0 0 .9707-1.2422l-1-4-1.9414.48633.28125 1.1211a5 5 0 0 1 -1.3105-3.3652 5 5 0 0 1 5-5 5 5 0 0 1 5 5 5 5 0 0 1 -1.4668 3.5332l1.416 1.416a7 7 0 0 0 1.3281-8.0449 7 7 0 0 0 -6.1895-3.9023zm-.087891 4.998a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_scale.svg b/editor/icons/icon_tool_scale.svg
deleted file mode 100644
index 8fc1527296..0000000000
--- a/editor/icons/icon_tool_scale.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h2.5859l-1.293 1.293 1.4141 1.4141 1.293-1.293v2.5859a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-5a1.0001 1.0001 0 0 0 -1-1zm-1 5a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-6 2a1 1 0 0 0 -1 1v5a1.0001 1.0001 0 0 0 1 1h5a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-2.5859l1.293-1.293-1.4141-1.4141-1.293 1.293v-2.5859a1 1 0 0 0 -1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_select.svg b/editor/icons/icon_tool_select.svg
deleted file mode 100644
index 4285b3181b..0000000000
--- a/editor/icons/icon_tool_select.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m40.001 1053.2-12-4.9365 4.9365 12 1.4207-4.2301 2.8254 2.8252 1.4127-1.4127-2.8254-2.8252z" fill="#e0e0e0" transform="translate(-26.001 -1046.2683)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tool_triangle.svg b/editor/icons/icon_tool_triangle.svg
deleted file mode 100644
index 17ce12265e..0000000000
--- a/editor/icons/icon_tool_triangle.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-26.001 -1046.2683)"><path d="m27.695915 1056.3022s7.457627-8.0678 7.118644-7.8644 5.830509 11.7288 5.830509 11.7288z" fill="#e0e0e0"/><g fill="#4b4b4b" stroke="#e0e0e0" stroke-width=".512"><circle cx="34.662014" cy="1048.5903" r="1.607564"/><circle cx="39.933205" cy="1059.6581" r="1.607564"/><circle cx="28.17049" cy="1056.2683" r="1.607564"/></g></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tools.svg b/editor/icons/icon_tools.svg
deleted file mode 100644
index dc002d6a4d..0000000000
--- a/editor/icons/icon_tools.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-1 2 1 2v4h-2v3 .5c0 1.385 1.115 2.5 2.5 2.5s2.5-1.115 2.5-2.5v-1-2.5h-2v-4l1-2-1-2zm6 .17383a3 3 0 0 0 -2 2.8262 3 3 0 0 0 2 2.8262v6.1738 1c0 .554.446 1 1 1s1-.446 1-1v-4-3.1758a3 3 0 0 0 2-2.8242 3 3 0 0 0 -2-2.8242v2.8242a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1v-2.8262z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_touch_screen_button.svg b/editor/icons/icon_touch_screen_button.svg
deleted file mode 100644
index d29e411f05..0000000000
--- a/editor/icons/icon_touch_screen_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1a1 1 0 0 0 -1 1v2a1 1 0 0 0 1 1h2v-1h-1-1v-2h8v2h-2v1h2a1 1 0 0 0 1-1v-2a1 1 0 0 0 -1-1zm4 2a1 1 0 0 0 -1 1v7 .033203l-2.4746-1.8086c-.52015-.3803-1.1948-.4556-1.6504 0-.45566.4556-.45561 1.1948 0 1.6504l4.125 4.125h6c1.1046 0 2-.8954 2-2v-5h-6v-4a1 1 0 0 0 -1-1z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_track_add_key.svg b/editor/icons/icon_track_add_key.svg
deleted file mode 100644
index 582003cd9b..0000000000
--- a/editor/icons/icon_track_add_key.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#84ffb1"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_track_add_key_hl.svg b/editor/icons/icon_track_add_key_hl.svg
deleted file mode 100644
index 7f3c60a562..0000000000
--- a/editor/icons/icon_track_add_key_hl.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><path d="m3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#84ffb1"/><path d="m3 0v3h-3v2h3v3h2v-3h3v-2h-3v-3z" fill="#fff" fill-opacity=".42424"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_track_capture.svg b/editor/icons/icon_track_capture.svg
deleted file mode 100644
index 51a38ff1fb..0000000000
--- a/editor/icons/icon_track_capture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2.1665128.99764963c-.422625 0-.763672.34104737-.763672.76367187v4.5742187c0 .4226242.341047.7617192.763672.7617192h4.472656c.422625 0 .763672-.339095.763672-.7617192v-.9882812h-3.300781c-.1662 0-.298828-.3390943-.298828-.7617188v-1.2246094c0-.4226244.132628-.7636718.298828-.7636718h3.300781v-.8359375c0-.4226245-.341047-.76367187-.763672-.76367187z"/><path d="m9.1827441 4.7953408c.5166221-1.0415625 1.0955249-2.2117429 1.2864509-2.600401l.347137-.7066511.679654.00665.679654.00665.956945 2.3125c.526319 1.271875 1.007254 2.4334375 1.068744 2.5812497l.1118.26875h-.597215-.597214l-.332849-.6437497-.332849-.64375h-1.133826-1.133825l-.3786749.6561133-.3786747.6561134-.5922856.000137-.592285.000136zm3.1779349-.369483c.0042-.00346-.233487-.4884588-.528245-1.0777779l-.535922-1.0714891-.03691.0875c-.0203.048125-.183516.425-.362699.8375-.179182.4125-.355738.85125-.392346.975-.03661.12375-.07127.2390723-.07703.2562715-.0083.024853.188215.027989.957503.015278.532385-.0088.971429-.018823.975651-.022283z" stroke="#e0e0e0" stroke-width=".803"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_track_continuous.svg b/editor/icons/icon_track_continuous.svg
deleted file mode 100644
index 2e89cdd821..0000000000
--- a/editor/icons/icon_track_continuous.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c6 0 6-4 12-4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_track_discrete.svg b/editor/icons/icon_track_discrete.svg
deleted file mode 100644
index a0550822bf..0000000000
--- a/editor/icons/icon_track_discrete.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_track_trigger.svg b/editor/icons/icon_track_trigger.svg
deleted file mode 100644
index 5572b254a2..0000000000
--- a/editor/icons/icon_track_trigger.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v4h2v-4h2v-2zm13 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transform.svg b/editor/icons/icon_transform.svg
deleted file mode 100644
index 0ed5377ed7..0000000000
--- a/editor/icons/icon_transform.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2 2 4-2 4h2l.9082-2.1816 1.0918 2.1816h2l-2-4 2-4h-2l-.9082 2.1816-1.0918-2.1816zm6 8h2v-2h1v-2h-1v-1c.0000096-.55228.44772-.99999 1-1h1v-2h-1c-1.6569 0-3 1.3431-3 3zm4-6v6h2v-2l1 1 1-1v2h2v-6h-2l-1 2-1-2z" fill="#f6a86e"/><path d="m9 2a3 3 0 0 0 -3 3v5h2v-2h1v-2h-1v-1a1 1 0 0 1 1-1h1v-2z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transform_2_D.svg b/editor/icons/icon_transform_2_D.svg
deleted file mode 100644
index a57587ba06..0000000000
--- a/editor/icons/icon_transform_2_D.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 2v2h2v6h2v-6h2v-2zm7 0v2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.0019531v2h7a4 4 0 0 0 3.4648-2 4 4 0 0 0 0-4 4 4 0 0 0 -3.4648-2h-2v6h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5zm5 2a2 2 0 0 1 1.7324 1 2 2 0 0 1 0 2 2 2 0 0 1 -1.7324 1z" fill="#c4ec69"/><path d="m7 2v2c.55228 0 1 .44772 1 1s-.44772 1-1 1c-.71466-.0001326-1.3751.38108-1.7324 1-.17472.30426-.26633.64914-.26562 1h-.0019531v2h5v-2h-3c1.0716-.00015 2.0618-.57193 2.5977-1.5.5359-.9282.5359-2.0718 0-3-.53582-.92807-1.526-1.4998-2.5977-1.5z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_end.svg b/editor/icons/icon_transition_end.svg
deleted file mode 100644
index 8d6857432f..0000000000
--- a/editor/icons/icon_transition_end.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(-2 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="11.16989" y="3.008411"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_end_auto.svg b/editor/icons/icon_transition_end_auto.svg
deleted file mode 100644
index fbfa7b03db..0000000000
--- a/editor/icons/icon_transition_end_auto.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(-2 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="11.16989" y="3.008411"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_end_auto_big.svg b/editor/icons/icon_transition_end_auto_big.svg
deleted file mode 100644
index fcc894a3e6..0000000000
--- a/editor/icons/icon_transition_end_auto_big.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57" stroke="#41562e"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(1.4099529 0 0 1.4099529 -4.197589 -1462.5094)"/><rect height="14.194397" ry="1.075597" stroke-width="1.409953" width="4.325911" x="14.371336" y="3.007612"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_end_big.svg b/editor/icons/icon_transition_end_big.svg
deleted file mode 100644
index cc93dd5808..0000000000
--- a/editor/icons/icon_transition_end_big.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke="#424242"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" stroke-width=".999944" transform="matrix(1.4203458 0 0 1.4203458 -4.29479 -1473.1325)"/><rect height="14.299023" ry="1.083525" stroke-width="1.420266" width="4.357798" x="14.411009" y="3.186887"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_immediate.svg b/editor/icons/icon_transition_immediate.svg
deleted file mode 100644
index 56e9b6c0f3..0000000000
--- a/editor/icons/icon_transition_immediate.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(-2 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_immediate_auto.svg b/editor/icons/icon_transition_immediate_auto.svg
deleted file mode 100644
index 8453bcff08..0000000000
--- a/editor/icons/icon_transition_immediate_auto.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#77ce57" fill-rule="evenodd" transform="translate(-2 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_immediate_auto_big.svg b/editor/icons/icon_transition_immediate_auto_big.svg
deleted file mode 100644
index 77f7ba592e..0000000000
--- a/editor/icons/icon_transition_immediate_auto_big.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#77ce57" fill-rule="evenodd" stroke="#41562e" transform="matrix(1.571031 0 0 1.571031 -2.725768 -1630.6239)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_immediate_big.svg b/editor/icons/icon_transition_immediate_big.svg
deleted file mode 100644
index 94584c45f7..0000000000
--- a/editor/icons/icon_transition_immediate_big.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#e0e0e0" fill-rule="evenodd" stroke="#404040" transform="matrix(1.571031 0 0 1.571031 -2.725768 -1630.6239)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_sync.svg b/editor/icons/icon_transition_sync.svg
deleted file mode 100644
index affa353100..0000000000
--- a/editor/icons/icon_transition_sync.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(2.554247 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="1.965517" y="3.008411"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_sync_auto.svg b/editor/icons/icon_transition_sync_auto.svg
deleted file mode 100644
index 767773a000..0000000000
--- a/editor/icons/icon_transition_sync_auto.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="translate(3.081581 -1036.4)"/><rect height="10.067283" ry=".76286" width="3.068124" x="1.965517" y="3.008411"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_sync_auto_big.svg b/editor/icons/icon_transition_sync_auto_big.svg
deleted file mode 100644
index c9735a2653..0000000000
--- a/editor/icons/icon_transition_sync_auto_big.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#77ce57" stroke="#41562e"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" transform="matrix(1.4099529 0 0 1.4099529 2.175293 -1462.5094)"/><rect height="14.194397" ry="1.075597" stroke-width="1.409953" width="4.325911" x="1.625573" y="3.007612"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transition_sync_big.svg b/editor/icons/icon_transition_sync_big.svg
deleted file mode 100644
index 959f26c6f1..0000000000
--- a/editor/icons/icon_transition_sync_big.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="20" viewBox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke="#424242"><path d="m4.9883 1039.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59362-.3959.59362-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill-rule="evenodd" stroke-width=".999944" transform="matrix(1.4203458 0 0 1.4203458 1.874702 -1473.1325)"/><rect height="14.299023" ry="1.083525" stroke-width="1.420266" width="4.357798" x="1.461856" y="3.186887"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_translation.svg b/editor/icons/icon_translation.svg
deleted file mode 100644
index 4195ce04a9..0000000000
--- a/editor/icons/icon_translation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1c-1.645 0-3 1.355-3 3s1.355 3 3 3c.46079 0 .89328-.11549 1.2852-.30469.18147.1867.43274.30469.71484.30469.554 0 1-.446 1-1v-2-2c0-.554-.446-1-1-1-.28152 0-.53345.11683-.71484.30273-.39187-.1892-.82436-.30273-1.2852-.30273zm0 2c.56412 0 1 .4359 1 1s-.43588 1-1 1-1-.4359-1-1 .43588-1 1-1zm6.8867 3.5293-1.7891.89453.28906.57617h-2.3867v2h.82031c.13264.9292.4994 1.8938 1.1992 2.7305-.61509.163-1.3569.26523-2.2656.26953l.0097657 2c1.6777-.01 3.0414-.31328 4.1113-.83398 1.07.5208 2.4336.82608 4.1113.83398l.009766-2c-.90873 0-1.6505-.10653-2.2656-.26953.7-.8367 1.068-1.8013 1.2012-2.7305h1.0684v-2h-3.3789l-.73438-1.4707zm-1.0234 3.4707h2.0234c-.12578.5801-.37537 1.147-.83594 1.623-.05313.055-.11651.10676-.17578.16016-.05927-.053-.12265-.10516-.17578-.16016-.46056-.476-.71015-1.0429-.83594-1.623z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_transpose.svg b/editor/icons/icon_transpose.svg
deleted file mode 100644
index e63c679323..0000000000
--- a/editor/icons/icon_transpose.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v14h7v-7h7v-7zm2 2h3v3h-3zm0 5h3v5h-3zm12 2-5 5h5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tree.svg b/editor/icons/icon_tree.svg
deleted file mode 100644
index 8e450948ce..0000000000
--- a/editor/icons/icon_tree.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v13c.0000552.55226.44774.99994 1 1h13v-2h-12v-6h2v3c.0000552.55226.44774.99994 1 1h9v-2h-8v-2h8v-2h-12v-2h12v-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_tween.svg b/editor/icons/icon_tween.svg
deleted file mode 100644
index c311cbd05e..0000000000
--- a/editor/icons/icon_tween.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v2h6v6h2v-8zm-1 4 1.793 1.793-4.793 4.793v-4.5859h-2v8h8v-2h-4.5859l4.793-4.793 1.793 1.793v-5h-5z" fill="#cea4f1" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_unbone.svg b/editor/icons/icon_unbone.svg
deleted file mode 100644
index 75df7e6ce9..0000000000
--- a/editor/icons/icon_unbone.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.479 1a2.4664 2.4663 0 0 0 -1.7813.7207 2.4664 2.4663 0 0 0 -.31445 3.1035l-1.0723 1.0723 2.791 2.791 1.0762-1.0742a2.4664 2.4663 0 0 0 3.0996-.31055 2.4664 2.4663 0 0 0 0-3.4883 2.4664 2.4663 0 0 0 -1.3965-.69727 2.4664 2.4663 0 0 0 -.69531-1.3965 2.4664 2.4663 0 0 0 -1.707-.7207zm-4.582 6.3105-1.0723 1.0742a2.4664 2.4663 0 0 0 -3.1016.3125 2.4664 2.4663 0 0 0 0 3.4883 2.4664 2.4663 0 0 0 1.3965.69531 2.4664 2.4663 0 0 0 .69531 1.3965 2.4664 2.4663 0 0 0 3.4883 0 2.4664 2.4663 0 0 0 .31445-3.1035l1.0703-1.0723-2.791-2.791z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_ungroup.svg b/editor/icons/icon_ungroup.svg
deleted file mode 100644
index c6e235f47d..0000000000
--- a/editor/icons/icon_ungroup.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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="m7 1037.4v6h-6v8h8v-6h6v-8zm2 2h4v4h-4z" fill="#e0e0e0" fill-opacity=".39216"/><path d="m7 1v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm6 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.00002341-.446 0-1 0s-1-.00002341-1 0zm-12 6v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.0000234-.446 0-1 0s-1-.0000234-1 0zm6 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.0000234-.446 0-1 0s-1-.0000234-1 0zm6 0v2c0 .0000234.446 0 1 0s1 .0000234 1 0v-2c0-.0000234-.446 0-1 0s-1-.0000234-1 0zm-12 6v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0zm6 0v2c0 .000023.446 0 1 0s1 .000023 1 0v-2c0-.000023-.446 0-1 0s-1-.000023-1 0z" fill="#fff" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_unlock.svg b/editor/icons/icon_unlock.svg
deleted file mode 100644
index 52be7e2233..0000000000
--- a/editor/icons/icon_unlock.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-.87738.001545-1.7389.23394-2.498.67383l1 1.7324c.45506-.26449.97171-.40459 1.498-.40625 1.6569 0 3 1.3431 3 3v2h-9v7h12v-7h-1v-2c0-2.7614-2.2386-5-5-5zm-1 9h2v3h-2z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_unpaint_vertex.svg b/editor/icons/icon_unpaint_vertex.svg
deleted file mode 100644
index 7bb94f06be..0000000000
--- a/editor/icons/icon_unpaint_vertex.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><ellipse cx="8.372881" cy="8.169492" rx="6.677966" ry="6.067797"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_uv.svg b/editor/icons/icon_uv.svg
deleted file mode 100644
index f68ea2c984..0000000000
--- a/editor/icons/icon_uv.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 5v4a3 3 0 0 0 1.5 2.5977 3 3 0 0 0 3 0 3 3 0 0 0 1.5-2.5977v-4h-2v4a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1v-4zm8 0 2 7h1 1 1l2-7h-2l-1.5 5.25-1.5-5.25z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_v_box_container.svg b/editor/icons/icon_v_box_container.svg
deleted file mode 100644
index 17b83ced0a..0000000000
--- a/editor/icons/icon_v_box_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m15 1039.4c0-1.1046-.89543-2-2-2h-10c-1.1046 0-2 .8954-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2zm-2 0v2h-10v-2zm0 4v2h-10v-2zm0 4v2h-10v-2z" fill="#a5efac" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_v_scroll_bar.svg b/editor/icons/icon_v_scroll_bar.svg
deleted file mode 100644
index 285e54fbd1..0000000000
--- a/editor/icons/icon_v_scroll_bar.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1c-1.108 0-2 .89199-2 2v10c0 1.108.89199 2 2 2h6c1.108 0 2-.89199 2-2v-10c0-1.108-.89199-2-2-2zm2.9883 1a1.0001 1.0001 0 0 1 .56641.16797l3 2a1.0001 1.0001 0 1 1 -1.1094 1.6641l-2.4453-1.6289-2.4453 1.6289a1.0001 1.0001 0 1 1 -1.1094-1.6641l3-2a1.0001 1.0001 0 0 1 .54297-.16797zm-2.998 7.9922a1.0001 1.0001 0 0 1 .56445.17578l2.4453 1.6309 2.4453-1.6309a1.0001 1.0001 0 1 1 1.1094 1.6641l-3 2a1.0001 1.0001 0 0 1 -1.1094 0l-3-2a1.0001 1.0001 0 0 1 .54492-1.8398z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_v_separator.svg b/editor/icons/icon_v_separator.svg
deleted file mode 100644
index 6476ea5ad7..0000000000
--- a/editor/icons/icon_v_separator.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1047.4h3v-6h-3zm5 4h2v-14h-2zm4-4h3v-6h-3z" fill="#a5efac" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_v_slider.svg b/editor/icons/icon_v_slider.svg
deleted file mode 100644
index c6fc1e6e0f..0000000000
--- a/editor/icons/icon_v_slider.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm5 0c-.55228 0-1 .44772-1 1s.44772 1 1 1h2c.55228 0 1-.44772 1-1s-.44772-1-1-1zm-4 5.8672c-.32639.086294-.6624.13092-1 .13281-.33752-.0012549-.67352-.045224-1-.13086v5 1.1309 1c-.019125 1.3523 2.0191 1.3523 2 0v-1-1.1328-5zm5 .13281c-.55228 0-1 .44772-1 1s.44772 1 1 1 1-.44772 1-1-.44772-1-1-1zm-1 6c-.55228 0-1 .44772-1 1s.44772 1 1 1h2c.55228 0 1-.44772 1-1s-.44772-1-1-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_v_split_container.svg b/editor/icons/icon_v_split_container.svg
deleted file mode 100644
index b9bbb4bfc3..0000000000
--- a/editor/icons/icon_v_split_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h10v4h-3l-2-2-2 2h-3zm0 6h3l2 2 2-2h3v4h-10z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_variant.svg b/editor/icons/icon_variant.svg
deleted file mode 100644
index 7c2e4559d1..0000000000
--- a/editor/icons/icon_variant.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 4a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h2v-6zm3 0v6h2v-4a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3zm5 3a3 3 0 0 0 3 3v2h2v-8h-2v4a1 1 0 0 1 -1-1v-3h-2zm-8-1v2a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#69ecbd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_vector2.svg b/editor/icons/icon_vector2.svg
deleted file mode 100644
index b4e9b44c03..0000000000
--- a/editor/icons/icon_vector2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.001953v2h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5zm-11 2v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4zm5 3a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2h-1a3 3 0 0 0 -3 3z" fill="#bd91f1"/><path d="m12 2v2h1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 2 2 0 0 0 -1.7324 1 2 2 0 0 0 -.26562 1h-.001953v2h5v-2h-3a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -2.5977-1.5z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_vector3.svg b/editor/icons/icon_vector3.svg
deleted file mode 100644
index 74861160d6..0000000000
--- a/editor/icons/icon_vector3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 2v2h2a1 1 0 0 1 -1 1v2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -.36523-.50195 3 3 0 0 0 .36523-.49805 3 3 0 0 0 .39844-1.5h.003906v-2zm-11 2v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4zm5 3a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1 1 1 0 0 1 1-1h1v-2h-1a3 3 0 0 0 -3 3z" fill="#e286f0"/><path d="m12 2v2h2a1 1 0 0 1 -1 1v2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1h-1v2h1a3 3 0 0 0 2.5977-1.5 3 3 0 0 0 0-3 3 3 0 0 0 -.36523-.50195 3 3 0 0 0 .36523-.49805 3 3 0 0 0 .39844-1.5h.003906v-2z" fill="#fff" fill-opacity=".39216"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_vehicle_body.svg b/editor/icons/icon_vehicle_body.svg
deleted file mode 100644
index a509730602..0000000000
--- a/editor/icons/icon_vehicle_body.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 3a1 1 0 0 0 -1 1l-1 3h-2v4h1.0508c.23167-1.1411 1.2398-2 2.4492-2s2.2175.85893 2.4492 2h2.1016c.23167-1.1411 1.2398-2 2.4492-2s2.2175.85893 2.4492 2h1.0508v-4h-4v-4zm1 1h4v3h-4zm-1.5 6a1.5 1.5 0 0 0 -1.5 1.5 1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0 -1.5-1.5zm7 0a1.5 1.5 0 0 0 -1.5 1.5 1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0 -1.5-1.5z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_vehicle_wheel.svg b/editor/icons/icon_vehicle_wheel.svg
deleted file mode 100644
index bd870c0118..0000000000
--- a/editor/icons/icon_vehicle_wheel.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 2a5 5 0 0 1 5 5 5 5 0 0 1 -5 5 5 5 0 0 1 -5-5 5 5 0 0 1 5-5zm0 1a4 4 0 0 0 -4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 -4-4zm0 1a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-2 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-2 2a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#fc9c9c" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_video_player.svg b/editor/icons/icon_video_player.svg
deleted file mode 100644
index 4e8dcf0ec2..0000000000
--- a/editor/icons/icon_video_player.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.0907 0-2 .9093-2 2v10c0 1.0907.90929 2 2 2h10c1.0907 0 2-.9093 2-2v-10c0-1.0907-.90929-2-2-2zm0 2h10v8h-10zm3 2v4l4-2z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_viewport.svg b/editor/icons/icon_viewport.svg
deleted file mode 100644
index 7cd5d73cde..0000000000
--- a/editor/icons/icon_viewport.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-.5304.0000801-1.0391.21085-1.4141.58594-.37509.37501-.58586.88366-.58594 1.4141v8c.0000803.5304.21085 1.0391.58594 1.4141.37501.37509.88366.58586 1.4141.58594h10c1.1046 0 2-.89543 2-2v-8c0-1.1046-.89543-2-2-2zm0 1h10c.55228.0000096.99999.44772 1 1v8c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-8c.0000096-.55228.44772-.99999 1-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_viewport_container.svg b/editor/icons/icon_viewport_container.svg
deleted file mode 100644
index 18dcddc15f..0000000000
--- a/editor/icons/icon_viewport_container.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 2h10v10h-10zm3 1c-.5304.0001-1.0391.21084-1.4141.58594-.37509.375-.58586.88366-.58594 1.4141v4c.00008.5304.21085 1.0391.58594 1.4141.37501.3751.88366.58584 1.4141.58594h4c1.1046 0 2-.8954 2-2v-4c0-1.1046-.89543-2-2-2zm0 1h4c.55228 0 .99999.4477 1 1v4c-.00001.5523-.44772 1-1 1h-4c-.55228 0-.99999-.4477-1-1v-4c.00001-.5523.44772-1 1-1z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_viewport_speed.svg b/editor/icons/icon_viewport_speed.svg
deleted file mode 100644
index 364eb4969b..0000000000
--- a/editor/icons/icon_viewport_speed.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 4.2333333 4.2333333" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1.5875 0c-.28858 0-.52917.24059-.52917.52917v.61132c-.085589-.051-.18113-.0891-.28525-.0853-.34849.0127-.5952.37346-.48059.70278l.26355.79066c.048664.14623.15979.24805.29249.30644l-.60927.40669c-.13121.0845-.22102.22389-.24133.3633-.020312.13941.017471.26985.087333.37465s.17614.19045.31264.22532c.13634.0348.29946.006.42788-.0827h.0005159l1.0852-.72348.26097.52192c.11682.23391.39274.34829.64079.26561l.79375-.26458-.00775.003c.15105-.0454.27732-.15615.33486-.2863.057538-.13015.055144-.26773.014986-.38809-.03156-.0946-.10972-.1687-.19275-.23617.069099-.0546.1445-.10364.18035-.19325.051761-.12941.045257-.29292-.02377-.43098l-.26459-.52946c-.089407-.17933-.27348-.29308-.47335-.29305h-.1111c.052029-.0817.1111-.16214.1111-.26458v-.79375c0-.28858-.24059-.52917-.52917-.52917z"/><path d="m1.5875.26458c-.14658 0-.26458.118-.26458.26459v.79375c0 .14658.118.26458.26458.26458h.26458v.262a.26461.26461 0 0 0 -.083716.0165l-.5426.18086-.18087-.5426a.26461.26461 0 0 0 -.262-.18448.26461.26461 0 0 0 -.2403.3514l.26458.79375a.26461.26461 0 0 0 .33486.16743l.44545-.14831v.16174c0 .0108.00495.02.0062.0305l-1.2113.80771a.26461.26461 0 1 0 .29352.44028l1.3379-.89194.39532.79014a.26461.26461 0 0 0 .32039.1328l.79375-.26458a.26461.26461 0 1 0 -.16743-.50175l-.57619.19172-.25787-.51625c.072998-.047.12402-.12495.12402-.21859v-.26458h.36587l.1912.38292a.26461.26461 0 1 0 .47336-.23668l-.26458-.52916a.26461.26461 0 0 0 -.23668-.14625h-.79375v-.26458h.26458c.14658 0 .26458-.118.26458-.26458v-.79375c0-.14659-.118-.26459-.26458-.26459zm0 .52917h.26458v.52917h-.26458z" fill="#fff" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_viewport_texture.svg b/editor/icons/icon_viewport_texture.svg
deleted file mode 100644
index 145beff6bc..0000000000
--- a/editor/icons/icon_viewport_texture.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 2c-.5304.0000801-1.0391.21085-1.4141.58594-.37509.37501-.58586.88366-.58594 1.4141v8c.0000803.5304.21085 1.0391.58594 1.4141.37501.37509.88366.58586 1.4141.58594h10c1.1046 0 2-.89543 2-2v-8c0-1.1046-.89543-2-2-2h-10zm0 1h10c.55228.0000096.99999.44772 1 1v8c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-8c.0000096-.55228.44772-.99999 1-1zm6 3v1h-1v1h-2v1h-1v1h-1v1h2 2 2 2v-2h-1v-1-1h-1v-1z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_viewport_zoom.svg b/editor/icons/icon_viewport_zoom.svg
deleted file mode 100644
index 6d64d1b8a4..0000000000
--- a/editor/icons/icon_viewport_zoom.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 0c-3.3019 0-6 2.6981-6 6s2.6981 6 6 6h.00195c.88828 0 1.737-.2588 2.5332-.6367l3.8281 3.8281c.39053.3904 1.0235.3904 1.4141 0l1.4141-1.4141c.39033-.3905.39033-1.0235 0-1.414l-3.791-3.791c.02779-.058.06588-.1109.0918-.17.05554-.1268.08414-.2638.08398-.4023h1.4238c.55226-.0001.99994-.4477 1-1v-1h1c.55226-.0001.99994-.4477 1-1v-2c-.000055-.5523-.44774-.9999-1-1h-1v-1c-.000055-.5523-.44774-.9999-1-1h-2c-.55226.0001-.99994.4477-1 1v1h-.00977c.000144-.3151-.14822-.6118-.40039-.8008-1.0353-.7764-2.2938-1.1967-3.5879-1.1992h-.00195z"/><path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.752-.83398l4.3184 4.3184 1.4141-1.4141-4.3184-4.3184a5 5 0 0 0 .41016-.75195h-.57617v-2h-1a3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3 3 3 0 0 1 2 .76758v-1.7676h.99023a5 5 0 0 0 -2.9902-1zm5 0v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_visibility_enabler.svg b/editor/icons/icon_visibility_enabler.svg
deleted file mode 100644
index 70e4f081c2..0000000000
--- a/editor/icons/icon_visibility_enabler.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v3h1v-2h2v-1zm11 0v1h2v2h1v-3zm-4 1c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.55273c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-7 6v3h3v-1h-2v-2zm13 0v2h-2v1h3v-3z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_visibility_enabler_2d.svg b/editor/icons/icon_visibility_enabler_2d.svg
deleted file mode 100644
index 2976e468ed..0000000000
--- a/editor/icons/icon_visibility_enabler_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v3h1v-2h2v-1zm11 0v1h2v2h1v-3zm-4 1c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0-.55273c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm-7 6v3h3v-1h-2v-2zm13 0v2h-2v1h3v-3z" fill="#a5b7f3" fill-opacity=".98824" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_visibility_notifier.svg b/editor/icons/icon_visibility_notifier.svg
deleted file mode 100644
index c908d5c99d..0000000000
--- a/editor/icons/icon_visibility_notifier.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 1v6h2v-6zm-4 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246 1.4907 0 3.2717-.65207 4.7109-2h-.71094-2v-.54102a4 4 0 0 1 -2 .54102 4 4 0 0 1 -4-4 4 4 0 0 1 4-4 4 4 0 0 1 2 .54102v-2.1816c-.68312-.23834-1.3644-.35938-2-.35938zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm4 2v2h2v-2z" fill="#fc9c9c" fill-opacity=".99608" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_visibility_notifier_2d.svg b/editor/icons/icon_visibility_notifier_2d.svg
deleted file mode 100644
index e05d7d3887..0000000000
--- a/editor/icons/icon_visibility_notifier_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 1v6h2v-6zm-4 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -.0058594.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246 1.4907 0 3.2717-.65207 4.7109-2h-.71094-2v-.54102a4 4 0 0 1 -2 .54102 4 4 0 0 1 -4-4 4 4 0 0 1 4-4 4 4 0 0 1 2 .54102v-2.1816c-.68312-.23834-1.3644-.35938-2-.35938zm0 4a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm4 2v2h2v-2z" fill="#a5b7f3" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_visual_shader.svg b/editor/icons/icon_visual_shader.svg
deleted file mode 100644
index 15cb60d2e3..0000000000
--- a/editor/icons/icon_visual_shader.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2.8642 9.9954v6h2a3 3 0 0 0 3-3v-3h-2v3a1 1 0 0 1 -1 1v-4z"/><path d="m10.864 9.9954a2 2 0 0 0 -1.7324 1 2 2 0 0 0 0 2 2 2 0 0 0 1.7324 1h-2v2h2a2 2 0 0 0 1.7324-1 2 2 0 0 0 0-2 2 2 0 0 0 -1.7324-1h2v-2z"/><path d="m2 1c-.55226.0001-.99994.4477-1 1v7h2v-6h6v3c0 .554.44599 1 1 1h3v2h2v-3l-5-5z"/></g><path d="m4 6h2v1h-2z" fill="#ffeb70"/><path d="m8 8h4v1h-4z" fill="#9dff70"/><path d="m7 6h1v1h-1z" fill="#70deff"/><path d="m4 4h3v1h-3z" fill="#ff7070"/><path d="m4 8h3v1h-3z" fill="#70ffb9"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_visual_shader_port.svg b/editor/icons/icon_visual_shader_port.svg
deleted file mode 100644
index 9df6344fe2..0000000000
--- a/editor/icons/icon_visual_shader_port.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m1.9883 1042.4c-.5469.01-.98717.4511-.98828.998v8c.0001163.7986.89011 1.275 1.5547.8321l6-4c.59363-.3959.59363-1.2682 0-1.6641l-6-4c-.1678-.1111-.3652-.1689-.56641-.166z" fill="#fff" fill-rule="evenodd" transform="translate(0 -1042.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_warning.svg b/editor/icons/icon_warning.svg
deleted file mode 100644
index 698288d5a9..0000000000
--- a/editor/icons/icon_warning.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="8" viewBox="0 0 8 8" width="8" xmlns="http://www.w3.org/2000/svg"><rect fill="#ffdd65" height="8" ry="4" width="8"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_window_dialog.svg b/editor/icons/icon_window_dialog.svg
deleted file mode 100644
index 3c7be2a58d..0000000000
--- a/editor/icons/icon_window_dialog.svg
+++ /dev/null
@@ -1 +0,0 @@
-<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 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_world.svg b/editor/icons/icon_world.svg
deleted file mode 100644
index 3db96a75a6..0000000000
--- a/editor/icons/icon_world.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 3a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 5-5 5 5 0 0 0 -5-5z" fill="#e0e0e0"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_world_2d.svg b/editor/icons/icon_world_2d.svg
deleted file mode 100644
index 862242ec44..0000000000
--- a/editor/icons/icon_world_2d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1037.4a1.0001 1.0001 0 0 0 -1 1v10a1.0001 1.0001 0 0 0 1 1c2.3667 0 3.9746.4629 5.7246.9629s3.6421 1.0371 6.2754 1.0371a1.0001 1.0001 0 0 0 1-1v-10a1.0001 1.0001 0 0 0 -1-1c-2.3667 0-3.9746-.4609-5.7246-.9609s-3.6421-1.0391-6.2754-1.0391zm1 2.0957c1.7984.1158 3.2574.448 4.7246.8672 1.4977.4279 3.194.8188 5.2754.9414v8.002c-1.7985-.1158-3.2574-.448-4.7246-.8672-1.4977-.4279-3.194-.8208-5.2754-.9434z" fill="#e0e0e0" fill-rule="evenodd" transform="translate(0 -1036.4)"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_world_environment.svg b/editor/icons/icon_world_environment.svg
deleted file mode 100644
index e87a4b5b0c..0000000000
--- a/editor/icons/icon_world_environment.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1.7305 2.3125c-.83125 1.5372-1.2685 3.1037-1.2695 4.6816-.64057-.11251-1.3005-.27158-1.9766-.47266a5 5 0 0 1 3.2461-4.209zm3.4629.0039062a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.00845-1.5627-.44294-3.1141-1.2656-4.6367zm-1.7324.0078126c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.0066161.10803-.0078125.16211-.96392.096801-1.9566.1103-2.9844.027344-.0016335-.063192-.0078125-.12632-.0078125-.18945 0-1.5333.48744-3.0828 1.5-4.6758zm4.8789 5.7578a5 5 0 0 1 -3.1484 3.6055c.57106-1.0564.95277-2.1268 1.1367-3.2051.68204-.10905 1.3556-.23789 2.0117-.40039zm-9.7461.033203c.68377.18153 1.3555.33345 2.0098.43164.18781 1.0551.56647 2.1026 1.125 3.1367a5 5 0 0 1 -3.1348-3.5684zm6.168.55469c-.22615.98866-.65424 1.9884-1.3008 3.0059-.63811-1.0042-1.0645-1.9908-1.293-2.9668.89027.054126 1.7517.029377 2.5938-.039062z" fill="#fc9c9c" fill-opacity=".99608"/><path d="m8 1v2.3242c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.0066161.10803-.0078125.16211-.4894.049148-.98713.077552-1.4922.082031v1.4922c.43915-.0075968.87287-.031628 1.3008-.066406-.22615.98866-.65424 1.9884-1.3008 3.0059v2.3242a7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm1.7324 2.3164a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.00845-1.5627-.44294-3.1141-1.2656-4.6367zm3.1465 5.7656a5 5 0 0 1 -3.1484 3.6055c.57106-1.0564.95277-2.1268 1.1367-3.2051.68204-.10905 1.3556-.23789 2.0117-.40039z" fill="#a5b7f3"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_x509_certificate.svg b/editor/icons/icon_x509_certificate.svg
deleted file mode 100644
index e175fa3234..0000000000
--- a/editor/icons/icon_x509_certificate.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 4.233 4.233" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.967.263-3.704.001v2.646h1.427a.993.993 0 0 1 -.022-.096.993.993 0 0 1 -.012-.099.993.993 0 0 1 -.002-.07.993.993 0 0 1 .005-.1.993.993 0 0 1 .014-.097.993.993 0 0 1 .025-.096.993.993 0 0 1 .034-.093.993.993 0 0 1 .043-.09.993.993 0 0 1 .052-.085.993.993 0 0 1 .06-.079.993.993 0 0 1 .068-.072.993.993 0 0 1 .074-.066.993.993 0 0 1 .08-.057.993.993 0 0 1 .087-.05.993.993 0 0 1 .09-.04.993.993 0 0 1 .095-.031.993.993 0 0 1 .096-.022.993.993 0 0 1 .099-.012.993.993 0 0 1 .07-.003.993.993 0 0 1 .099.006.993.993 0 0 1 .098.014.993.993 0 0 1 .096.025.993.993 0 0 1 .094.034.993.993 0 0 1 .089.043.993.993 0 0 1 .084.052.993.993 0 0 1 .08.06.993.993 0 0 1 .072.068.993.993 0 0 1 .065.074.993.993 0 0 1 .058.08.993.993 0 0 1 .05.087.993.993 0 0 1 .04.09.993.993 0 0 1 .031.095.993.993 0 0 1 .022.096.993.993 0 0 1 .012.099.993.993 0 0 1 .002.07.993.993 0 0 1 -.004.1.993.993 0 0 1 -.015.097.993.993 0 0 1 -.017.068h.365z" fill="#e0e0e0"/><g fill="#ff8484"><path d="m2.116 3.175v.793l.53-.253.529.253v-.793z"/><circle cx="2.646" cy="2.645" r=".794"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_y_sort.svg b/editor/icons/icon_y_sort.svg
deleted file mode 100644
index dbcefef216..0000000000
--- a/editor/icons/icon_y_sort.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1-3 3h2v8h-2l3 3 3-3h-2v-8h2zm5 1v2h6v-2zm0 5v2h4v-2zm0 5v2h2v-2z" fill="#a5b7f3" fill-opacity=".98824"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_zoom.svg b/editor/icons/icon_zoom.svg
deleted file mode 100644
index aa517b6ae2..0000000000
--- a/editor/icons/icon_zoom.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.752-.83398l4.3184 4.3184 1.4141-1.4141-4.3184-4.3184a5 5 0 0 0 .41016-.75195h-.57617v-2h-1a3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3 3 3 0 0 1 2 .76758v-1.7676h.99023a5 5 0 0 0 -2.9902-1zm5 0v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg> \ No newline at end of file
diff --git a/editor/icons/icon_zoom_less.svg b/editor/icons/icon_zoom_less.svg
deleted file mode 100644
index cf3b4475c9..0000000000
--- a/editor/icons/icon_zoom_less.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><circle cx="8" cy="1044.4" fill-opacity=".39216" r="8" stroke-opacity=".98824"/><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-4 6h8v2h-8z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_zoom_more.svg b/editor/icons/icon_zoom_more.svg
deleted file mode 100644
index 8847eea53f..0000000000
--- a/editor/icons/icon_zoom_more.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><circle cx="8" cy="1044.4" fill-opacity=".39216" r="8" stroke-opacity=".98824"/><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1 3h2v3h3v2h-3v3h-2v-3h-3v-2h3z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/icon_zoom_reset.svg b/editor/icons/icon_zoom_reset.svg
deleted file mode 100644
index 6ecb4111fe..0000000000
--- a/editor/icons/icon_zoom_reset.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1036.4)"><circle cx="8" cy="1044.4" fill-opacity=".39216" r="8" stroke-opacity=".98824"/><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-.029297 3.002a1.0001 1.0001 0 0 1 1.0293.99805v7h-2v-5.1309l-1.4453.96289-1.1094-1.6641 3-2a1.0001 1.0001 0 0 1 .52539-.16602z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg> \ No newline at end of file
diff --git a/editor/icons/int.svg b/editor/icons/int.svg
new file mode 100644
index 0000000000..f8c88300f7
--- /dev/null
+++ b/editor/icons/int.svg
@@ -0,0 +1 @@
+<svg height="12" viewBox="0 0 16 12" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 2v2h2v-2zm11 0v5a3 3 0 0 0 3 3h1v-2h-1a1 1 0 0 1 -1-1v-1h2v-2h-2v-2zm-8 2v6h2v-4h1a1 1 0 0 1 1 1v3h2v-3a3 3 0 0 0 -3-3h-1zm-3 2v4h2v-4z" fill="#7dc6ef"/></svg>
diff --git a/editor/import/SCsub b/editor/import/SCsub
index 2b1e889fb0..359d04e5df 100644
--- a/editor/import/SCsub
+++ b/editor/import/SCsub
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-Import('env')
+Import("env")
env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/import/collada.cpp b/editor/import/collada.cpp
new file mode 100644
index 0000000000..8eb68ecdcf
--- /dev/null
+++ b/editor/import/collada.cpp
@@ -0,0 +1,2407 @@
+/*************************************************************************/
+/* collada.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "collada.h"
+
+#include <stdio.h>
+
+//#define DEBUG_DEFAULT_ANIMATION
+//#define DEBUG_COLLADA
+#ifdef DEBUG_COLLADA
+#define COLLADA_PRINT(m_what) print_line(m_what)
+#else
+#define COLLADA_PRINT(m_what)
+#endif
+
+#define COLLADA_IMPORT_SCALE_SCENE
+
+/* HELPERS */
+
+String Collada::Effect::get_texture_path(const String &p_source, Collada &state) const {
+ const String &image = p_source;
+ ERR_FAIL_COND_V(!state.state.image_map.has(image), "");
+ return state.state.image_map[image].path;
+}
+
+Transform Collada::get_root_transform() const {
+ Transform unit_scale_transform;
+#ifndef COLLADA_IMPORT_SCALE_SCENE
+ unit_scale_transform.scale(Vector3(state.unit_scale, state.unit_scale, state.unit_scale));
+#endif
+ return unit_scale_transform;
+}
+
+void Collada::Vertex::fix_unit_scale(Collada &state) {
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ vertex *= state.state.unit_scale;
+#endif
+}
+
+static String _uri_to_id(const String &p_uri) {
+ if (p_uri.begins_with("#")) {
+ return p_uri.substr(1, p_uri.size() - 1);
+ } else {
+ return p_uri;
+ }
+}
+
+/** HELPER FUNCTIONS **/
+
+Transform Collada::fix_transform(const Transform &p_transform) {
+ Transform tr = p_transform;
+
+#ifndef NO_UP_AXIS_SWAP
+
+ if (state.up_axis != Vector3::AXIS_Y) {
+ for (int i = 0; i < 3; i++) {
+ SWAP(tr.basis[1][i], tr.basis[state.up_axis][i]);
+ }
+ for (int i = 0; i < 3; i++) {
+ SWAP(tr.basis[i][1], tr.basis[i][state.up_axis]);
+ }
+
+ SWAP(tr.origin[1], tr.origin[state.up_axis]);
+
+ tr.basis[state.up_axis][0] = -tr.basis[state.up_axis][0];
+ tr.basis[state.up_axis][1] = -tr.basis[state.up_axis][1];
+ tr.basis[0][state.up_axis] = -tr.basis[0][state.up_axis];
+ tr.basis[1][state.up_axis] = -tr.basis[1][state.up_axis];
+ tr.origin[state.up_axis] = -tr.origin[state.up_axis];
+ }
+#endif
+
+ //tr.scale(Vector3(state.unit_scale.unit_scale.unit_scale));
+ return tr;
+ //return state.matrix_fix * p_transform;
+}
+
+static Transform _read_transform_from_array(const Vector<float> &array, int ofs = 0) {
+ Transform tr;
+ // i wonder why collada matrices are transposed, given that's opposed to opengl..
+ tr.basis.elements[0][0] = array[0 + ofs];
+ tr.basis.elements[0][1] = array[1 + ofs];
+ tr.basis.elements[0][2] = array[2 + ofs];
+ tr.basis.elements[1][0] = array[4 + ofs];
+ tr.basis.elements[1][1] = array[5 + ofs];
+ tr.basis.elements[1][2] = array[6 + ofs];
+ tr.basis.elements[2][0] = array[8 + ofs];
+ tr.basis.elements[2][1] = array[9 + ofs];
+ tr.basis.elements[2][2] = array[10 + ofs];
+ tr.origin.x = array[3 + ofs];
+ tr.origin.y = array[7 + ofs];
+ tr.origin.z = array[11 + ofs];
+ return tr;
+}
+
+/* STRUCTURES */
+
+Transform Collada::Node::compute_transform(Collada &state) const {
+ Transform xform;
+
+ for (int i = 0; i < xform_list.size(); i++) {
+ Transform xform_step;
+ const XForm &xf = xform_list[i];
+ switch (xf.op) {
+ case XForm::OP_ROTATE: {
+ if (xf.data.size() >= 4) {
+ xform_step.rotate(Vector3(xf.data[0], xf.data[1], xf.data[2]), Math::deg2rad(xf.data[3]));
+ }
+ } break;
+ case XForm::OP_SCALE: {
+ if (xf.data.size() >= 3) {
+ xform_step.scale(Vector3(xf.data[0], xf.data[1], xf.data[2]));
+ }
+
+ } break;
+ case XForm::OP_TRANSLATE: {
+ if (xf.data.size() >= 3) {
+ xform_step.origin = Vector3(xf.data[0], xf.data[1], xf.data[2]);
+ }
+
+ } break;
+ case XForm::OP_MATRIX: {
+ if (xf.data.size() >= 16) {
+ xform_step = _read_transform_from_array(xf.data, 0);
+ }
+
+ } break;
+ default: {
+ }
+ }
+
+ xform = xform * xform_step;
+ }
+
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ xform.origin *= state.state.unit_scale;
+#endif
+ return xform;
+}
+
+Transform Collada::Node::get_transform() const {
+ return default_transform;
+}
+
+Transform Collada::Node::get_global_transform() const {
+ if (parent) {
+ return parent->get_global_transform() * default_transform;
+ } else {
+ return default_transform;
+ }
+}
+
+Vector<float> Collada::AnimationTrack::get_value_at_time(float p_time) const {
+ ERR_FAIL_COND_V(keys.size() == 0, Vector<float>());
+ int i = 0;
+
+ for (i = 0; i < keys.size(); i++) {
+ if (keys[i].time > p_time) {
+ break;
+ }
+ }
+
+ if (i == 0) {
+ return keys[0].data;
+ }
+ if (i == keys.size()) {
+ return keys[keys.size() - 1].data;
+ }
+
+ switch (keys[i].interp_type) {
+ case INTERP_BEZIER: //wait for bezier
+ case INTERP_LINEAR: {
+ float c = (p_time - keys[i - 1].time) / (keys[i].time - keys[i - 1].time);
+
+ if (keys[i].data.size() == 16) {
+ //interpolate a matrix
+ Transform src = _read_transform_from_array(keys[i - 1].data);
+ Transform dst = _read_transform_from_array(keys[i].data);
+
+ Transform interp = c < 0.001 ? src : src.interpolate_with(dst, c);
+
+ Vector<float> ret;
+ ret.resize(16);
+ Transform tr;
+ // i wonder why collada matrices are transposed, given that's opposed to opengl..
+ ret.write[0] = interp.basis.elements[0][0];
+ ret.write[1] = interp.basis.elements[0][1];
+ ret.write[2] = interp.basis.elements[0][2];
+ ret.write[4] = interp.basis.elements[1][0];
+ ret.write[5] = interp.basis.elements[1][1];
+ ret.write[6] = interp.basis.elements[1][2];
+ ret.write[8] = interp.basis.elements[2][0];
+ ret.write[9] = interp.basis.elements[2][1];
+ ret.write[10] = interp.basis.elements[2][2];
+ ret.write[3] = interp.origin.x;
+ ret.write[7] = interp.origin.y;
+ ret.write[11] = interp.origin.z;
+ ret.write[12] = 0;
+ ret.write[13] = 0;
+ ret.write[14] = 0;
+ ret.write[15] = 1;
+
+ return ret;
+ } else {
+ Vector<float> dest;
+ dest.resize(keys[i].data.size());
+ for (int j = 0; j < dest.size(); j++) {
+ dest.write[j] = keys[i].data[j] * c + keys[i - 1].data[j] * (1.0 - c);
+ }
+ return dest;
+ //interpolate one by one
+ }
+ } break;
+ }
+
+ ERR_FAIL_V(Vector<float>());
+}
+
+void Collada::_parse_asset(XMLParser &parser) {
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+
+ if (name == "up_axis") {
+ parser.read();
+ if (parser.get_node_data() == "X_UP") {
+ state.up_axis = Vector3::AXIS_X;
+ }
+ if (parser.get_node_data() == "Y_UP") {
+ state.up_axis = Vector3::AXIS_Y;
+ }
+ if (parser.get_node_data() == "Z_UP") {
+ state.up_axis = Vector3::AXIS_Z;
+ }
+
+ COLLADA_PRINT("up axis: " + parser.get_node_data());
+ } else if (name == "unit") {
+ state.unit_scale = parser.get_attribute_value("meter").to_float();
+ COLLADA_PRINT("unit scale: " + rtos(state.unit_scale));
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "asset") {
+ break; //end of <asset>
+ }
+ }
+}
+
+void Collada::_parse_image(XMLParser &parser) {
+ String id = parser.get_attribute_value("id");
+
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ Image image;
+
+ if (state.version < State::Version(1, 4, 0)) {
+ /* <1.4 */
+ String path = parser.get_attribute_value("source").strip_edges();
+ if (path.find("://") == -1 && path.is_rel_path()) {
+ // path is relative to file being loaded, so convert to a resource path
+ image.path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path.percent_decode()));
+ }
+ } else {
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+
+ if (name == "init_from") {
+ parser.read();
+ String path = parser.get_node_data().strip_edges().percent_decode();
+
+ if (path.find("://") == -1 && path.is_rel_path()) {
+ // path is relative to file being loaded, so convert to a resource path
+ path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path));
+
+ } else if (path.find("file:///") == 0) {
+ path = path.replace_first("file:///", "");
+ path = ProjectSettings::get_singleton()->localize_path(path);
+ }
+
+ image.path = path;
+
+ } else if (name == "data") {
+ ERR_PRINT("COLLADA Embedded image data not supported!");
+
+ } else if (name == "extra" && !parser.is_empty()) {
+ parser.skip_section();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "image") {
+ break; //end of <asset>
+ }
+ }
+ }
+
+ state.image_map[id] = image;
+}
+
+void Collada::_parse_material(XMLParser &parser) {
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ Material material;
+
+ String id = parser.get_attribute_value("id");
+ if (parser.has_attribute("name")) {
+ material.name = parser.get_attribute_value("name");
+ }
+
+ if (state.version < State::Version(1, 4, 0)) {
+ /* <1.4 */
+ ERR_PRINT("Collada Materials < 1.4 are not supported (yet)");
+ } else {
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT && parser.get_node_name() == "instance_effect") {
+ material.instance_effect = _uri_to_id(parser.get_attribute_value("url"));
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "material") {
+ break; //end of <asset>
+ }
+ }
+ }
+
+ state.material_map[id] = material;
+}
+
+//! reads floats from inside of xml element until end of xml element
+Vector<float> Collada::_read_float_array(XMLParser &parser) {
+ if (parser.is_empty()) {
+ return Vector<float>();
+ }
+
+ Vector<String> splitters;
+ splitters.push_back(" ");
+ splitters.push_back("\n");
+ splitters.push_back("\r");
+ splitters.push_back("\t");
+
+ Vector<float> array;
+ while (parser.read() == OK) {
+ // TODO: check for comments inside the element
+ // and ignore them.
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ // parse float data
+ String str = parser.get_node_data();
+ array = str.split_floats_mk(splitters, false);
+ //array=str.split_floats(" ",false);
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) {
+ break; // end parsing text
+ }
+ }
+
+ return array;
+}
+
+Vector<String> Collada::_read_string_array(XMLParser &parser) {
+ if (parser.is_empty()) {
+ return Vector<String>();
+ }
+
+ Vector<String> array;
+ while (parser.read() == OK) {
+ // TODO: check for comments inside the element
+ // and ignore them.
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ // parse String data
+ String str = parser.get_node_data();
+ array = str.split_spaces();
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) {
+ break; // end parsing text
+ }
+ }
+
+ return array;
+}
+
+Transform Collada::_read_transform(XMLParser &parser) {
+ if (parser.is_empty()) {
+ return Transform();
+ }
+
+ Vector<String> array;
+ while (parser.read() == OK) {
+ // TODO: check for comments inside the element
+ // and ignore them.
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ // parse float data
+ String str = parser.get_node_data();
+ array = str.split_spaces();
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) {
+ break; // end parsing text
+ }
+ }
+
+ ERR_FAIL_COND_V(array.size() != 16, Transform());
+ Vector<float> farr;
+ farr.resize(16);
+ for (int i = 0; i < 16; i++) {
+ farr.write[i] = array[i].to_float();
+ }
+
+ return _read_transform_from_array(farr);
+}
+
+String Collada::_read_empty_draw_type(XMLParser &parser) {
+ String empty_draw_type = "";
+
+ if (parser.is_empty()) {
+ return empty_draw_type;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ empty_draw_type = parser.get_node_data();
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) {
+ break; // end parsing text
+ }
+ }
+ return empty_draw_type;
+}
+
+Variant Collada::_parse_param(XMLParser &parser) {
+ if (parser.is_empty()) {
+ return Variant();
+ }
+
+ String from = parser.get_node_name();
+ Variant data;
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "float") {
+ parser.read();
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ data = parser.get_node_data().to_float();
+ }
+ } else if (parser.get_node_name() == "float2") {
+ Vector<float> v2 = _read_float_array(parser);
+
+ if (v2.size() >= 2) {
+ data = Vector2(v2[0], v2[1]);
+ }
+ } else if (parser.get_node_name() == "float3") {
+ Vector<float> v3 = _read_float_array(parser);
+
+ if (v3.size() >= 3) {
+ data = Vector3(v3[0], v3[1], v3[2]);
+ }
+ } else if (parser.get_node_name() == "float4") {
+ Vector<float> v4 = _read_float_array(parser);
+
+ if (v4.size() >= 4) {
+ data = Color(v4[0], v4[1], v4[2], v4[3]);
+ }
+ } else if (parser.get_node_name() == "sampler2D") {
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "source") {
+ parser.read();
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ data = parser.get_node_data();
+ }
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "sampler2D") {
+ break;
+ }
+ }
+ } else if (parser.get_node_name() == "surface") {
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "init_from") {
+ parser.read();
+
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ data = parser.get_node_data();
+ }
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "surface") {
+ break;
+ }
+ }
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == from) {
+ break;
+ }
+ }
+
+ COLLADA_PRINT("newparam ending " + parser.get_node_name());
+ return data;
+}
+
+void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &id) {
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ // first come the tags we descend, but ignore the top-levels
+
+ COLLADA_PRINT("node name: " + parser.get_node_name());
+
+ if (!parser.is_empty() && (parser.get_node_name() == "profile_COMMON" || parser.get_node_name() == "technique" || parser.get_node_name() == "extra")) {
+ _parse_effect_material(parser, effect, id); // try again
+
+ } else if (parser.get_node_name() == "newparam") {
+ String name = parser.get_attribute_value("sid");
+ Variant value = _parse_param(parser);
+ effect.params[name] = value;
+ COLLADA_PRINT("param: " + name + " value:" + String(value));
+
+ } else if (parser.get_node_name() == "constant" ||
+ parser.get_node_name() == "lambert" ||
+ parser.get_node_name() == "phong" ||
+ parser.get_node_name() == "blinn") {
+ COLLADA_PRINT("shade model: " + parser.get_node_name());
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String what = parser.get_node_name();
+
+ if (what == "emission" ||
+ what == "diffuse" ||
+ what == "specular" ||
+ what == "reflective") {
+ // color or texture types
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "color") {
+ Vector<float> colorarr = _read_float_array(parser);
+ COLLADA_PRINT("colorarr size: " + rtos(colorarr.size()));
+
+ if (colorarr.size() >= 3) {
+ // alpha strangely not alright? maybe it needs to be multiplied by value as a channel intensity
+ Color color(colorarr[0], colorarr[1], colorarr[2], 1.0);
+ if (what == "diffuse") {
+ effect.diffuse.color = color;
+ }
+ if (what == "specular") {
+ effect.specular.color = color;
+ }
+ if (what == "emission") {
+ effect.emission.color = color;
+ }
+
+ COLLADA_PRINT(what + " color: " + color);
+ }
+
+ } else if (parser.get_node_name() == "texture") {
+ String sampler = parser.get_attribute_value("texture");
+ if (!effect.params.has(sampler)) {
+ ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
+ } else {
+ String surface = effect.params[sampler];
+
+ if (!effect.params.has(surface)) {
+ ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data());
+ } else {
+ String uri = effect.params[surface];
+
+ if (what == "diffuse") {
+ effect.diffuse.texture = uri;
+ } else if (what == "specular") {
+ effect.specular.texture = uri;
+ } else if (what == "emission") {
+ effect.emission.texture = uri;
+ } else if (what == "bump") {
+ if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
+ WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
+ }
+
+ effect.bump.texture = uri;
+ }
+
+ COLLADA_PRINT(what + " texture: " + uri);
+ }
+ }
+ } else if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == what) {
+ break;
+ }
+ }
+
+ } else if (what == "shininess") {
+ effect.shininess = _parse_param(parser);
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && (parser.get_node_name() == "constant" ||
+ parser.get_node_name() == "lambert" ||
+ parser.get_node_name() == "phong" ||
+ parser.get_node_name() == "blinn")) {
+ break;
+ }
+ }
+ } else if (parser.get_node_name() == "double_sided" || parser.get_node_name() == "show_double_sided") { // colladamax / google earth
+
+ // 3DS Max / Google Earth double sided extension
+ parser.read();
+ effect.found_double_sided = true;
+ effect.double_sided = parser.get_node_data().to_int();
+ COLLADA_PRINT("double sided: " + itos(parser.get_node_data().to_int()));
+ } else if (parser.get_node_name() == "unshaded") {
+ parser.read();
+ effect.unshaded = parser.get_node_data().to_int();
+ } else if (parser.get_node_name() == "bump") {
+ // color or texture types
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "texture") {
+ String sampler = parser.get_attribute_value("texture");
+ if (!effect.params.has(sampler)) {
+ ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
+ } else {
+ String surface = effect.params[sampler];
+
+ if (!effect.params.has(surface)) {
+ ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data());
+ } else {
+ String uri = effect.params[surface];
+
+ if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
+ WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
+ }
+
+ effect.bump.texture = uri;
+ COLLADA_PRINT(" bump: " + uri);
+ }
+ }
+ } else if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "bump") {
+ break;
+ }
+ }
+
+ } else if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END &&
+ (parser.get_node_name() == "effect" ||
+ parser.get_node_name() == "profile_COMMON" ||
+ parser.get_node_name() == "technique" ||
+ parser.get_node_name() == "extra")) {
+ break;
+ }
+ }
+}
+
+void Collada::_parse_effect(XMLParser &parser) {
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ String id = parser.get_attribute_value("id");
+
+ Effect effect;
+ if (parser.has_attribute("name")) {
+ effect.name = parser.get_attribute_value("name");
+ }
+ _parse_effect_material(parser, effect, id);
+
+ state.effect_map[id] = effect;
+
+ COLLADA_PRINT("Effect ID:" + id);
+}
+
+void Collada::_parse_camera(XMLParser &parser) {
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ String id = parser.get_attribute_value("id");
+
+ state.camera_data_map[id] = CameraData();
+ CameraData &camera = state.camera_data_map[id];
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+
+ if (name == "perspective") {
+ camera.mode = CameraData::MODE_PERSPECTIVE;
+ } else if (name == "orthographic") {
+ camera.mode = CameraData::MODE_ORTHOGONAL;
+ } else if (name == "xfov") {
+ parser.read();
+ camera.perspective.x_fov = parser.get_node_data().to_float();
+
+ } else if (name == "yfov") {
+ parser.read();
+ camera.perspective.y_fov = parser.get_node_data().to_float();
+ } else if (name == "xmag") {
+ parser.read();
+ camera.orthogonal.x_mag = parser.get_node_data().to_float();
+
+ } else if (name == "ymag") {
+ parser.read();
+ camera.orthogonal.y_mag = parser.get_node_data().to_float();
+ } else if (name == "aspect_ratio") {
+ parser.read();
+ camera.aspect = parser.get_node_data().to_float();
+
+ } else if (name == "znear") {
+ parser.read();
+ camera.z_near = parser.get_node_data().to_float();
+
+ } else if (name == "zfar") {
+ parser.read();
+ camera.z_far = parser.get_node_data().to_float();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "camera") {
+ break; //end of <asset>
+ }
+ }
+
+ COLLADA_PRINT("Camera ID:" + id);
+}
+
+void Collada::_parse_light(XMLParser &parser) {
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ String id = parser.get_attribute_value("id");
+
+ state.light_data_map[id] = LightData();
+ LightData &light = state.light_data_map[id];
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+
+ if (name == "ambient") {
+ light.mode = LightData::MODE_AMBIENT;
+ } else if (name == "directional") {
+ light.mode = LightData::MODE_DIRECTIONAL;
+ } else if (name == "point") {
+ light.mode = LightData::MODE_OMNI;
+ } else if (name == "spot") {
+ light.mode = LightData::MODE_SPOT;
+ } else if (name == "color") {
+ parser.read();
+ Vector<float> colorarr = _read_float_array(parser);
+ COLLADA_PRINT("colorarr size: " + rtos(colorarr.size()));
+
+ if (colorarr.size() >= 4) {
+ // alpha strangely not alright? maybe it needs to be multiplied by value as a channel intensity
+ Color color(colorarr[0], colorarr[1], colorarr[2], 1.0);
+ light.color = color;
+ }
+
+ } else if (name == "constant_attenuation") {
+ parser.read();
+ light.constant_att = parser.get_node_data().to_float();
+ } else if (name == "linear_attenuation") {
+ parser.read();
+ light.linear_att = parser.get_node_data().to_float();
+ } else if (name == "quadratic_attenuation") {
+ parser.read();
+ light.quad_att = parser.get_node_data().to_float();
+ } else if (name == "falloff_angle") {
+ parser.read();
+ light.spot_angle = parser.get_node_data().to_float();
+
+ } else if (name == "falloff_exponent") {
+ parser.read();
+ light.spot_exp = parser.get_node_data().to_float();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "light") {
+ break; //end of <asset>
+ }
+ }
+
+ COLLADA_PRINT("Light ID:" + id);
+}
+
+void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_name) {
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ //load everything into a pre dictionary
+
+ state.curve_data_map[p_id] = CurveData();
+
+ CurveData &curvedata = state.curve_data_map[p_id];
+ curvedata.name = p_name;
+
+ COLLADA_PRINT("curve name: " + p_name);
+
+ String current_source;
+ // handles geometry node and the curve children in this loop
+ // read sources with arrays and accessor for each curve
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String section = parser.get_node_name();
+
+ if (section == "source") {
+ String id = parser.get_attribute_value("id");
+ curvedata.sources[id] = CurveData::Source();
+ current_source = id;
+ COLLADA_PRINT("source data: " + id);
+
+ } else if (section == "float_array" || section == "array") {
+ // create a new array and read it.
+ if (curvedata.sources.has(current_source)) {
+ curvedata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values.");
+ }
+ } else if (section == "Name_array") {
+ // create a new array and read it.
+ if (curvedata.sources.has(current_source)) {
+ curvedata.sources[current_source].sarray = _read_string_array(parser);
+ COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values.");
+ }
+
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (curvedata.sources.has(current_source)) {
+ curvedata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
+ COLLADA_PRINT("section: " + current_source + " stride " + itos(curvedata.sources[current_source].stride));
+ }
+ } else if (section == "control_vertices") {
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "input") {
+ String semantic = parser.get_attribute_value("semantic");
+ String source = _uri_to_id(parser.get_attribute_value("source"));
+
+ curvedata.control_vertices[semantic] = source;
+
+ COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) {
+ break;
+ }
+ }
+
+ } else if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "spline") {
+ break;
+ }
+ }
+}
+
+void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name) {
+ if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ return;
+ }
+
+ //load everything into a pre dictionary
+
+ state.mesh_data_map[p_id] = MeshData();
+
+ MeshData &meshdata = state.mesh_data_map[p_id];
+ meshdata.name = p_name;
+
+ COLLADA_PRINT("mesh name: " + p_name);
+
+ String current_source;
+ // handles geometry node and the mesh children in this loop
+ // read sources with arrays and accessor for each mesh
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String section = parser.get_node_name();
+
+ if (section == "source") {
+ String id = parser.get_attribute_value("id");
+ meshdata.sources[id] = MeshData::Source();
+ current_source = id;
+ COLLADA_PRINT("source data: " + id);
+
+ } else if (section == "float_array" || section == "array") {
+ // create a new array and read it.
+ if (meshdata.sources.has(current_source)) {
+ meshdata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: " + current_source + " read " + itos(meshdata.sources[current_source].array.size()) + " values.");
+ }
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (meshdata.sources.has(current_source)) {
+ meshdata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
+ COLLADA_PRINT("section: " + current_source + " stride " + itos(meshdata.sources[current_source].stride));
+ }
+ } else if (section == "vertices") {
+ MeshData::Vertices vert;
+ String id = parser.get_attribute_value("id");
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "input") {
+ String semantic = parser.get_attribute_value("semantic");
+ String source = _uri_to_id(parser.get_attribute_value("source"));
+
+ vert.sources[semantic] = source;
+
+ COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) {
+ break;
+ }
+ }
+
+ meshdata.vertices[id] = vert;
+
+ } else if (section == "triangles" || section == "polylist" || section == "polygons") {
+ bool polygons = (section == "polygons");
+ if (polygons) {
+ WARN_PRINT("Primitive type \"polygons\" is not well supported (concave shapes may fail). To ensure that the geometry is properly imported, please re-export using \"triangles\" or \"polylist\".");
+ }
+ MeshData::Primitives prim;
+
+ if (parser.has_attribute("material")) {
+ prim.material = parser.get_attribute_value("material");
+ }
+ prim.count = parser.get_attribute_value("count").to_int();
+ prim.vertex_size = 0;
+ int last_ref = 0;
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "input") {
+ String semantic = parser.get_attribute_value("semantic");
+ String source = _uri_to_id(parser.get_attribute_value("source"));
+
+ if (semantic == "TEXCOORD") {
+ /*
+ if (parser.has_attribute("set"))// a texcoord
+ semantic+=parser.get_attribute_value("set");
+ else
+ semantic="TEXCOORD0";*/
+ semantic = "TEXCOORD" + itos(last_ref++);
+ }
+ int offset = parser.get_attribute_value("offset").to_int();
+
+ MeshData::Primitives::SourceRef sref;
+ sref.source = source;
+ sref.offset = offset;
+ prim.sources[semantic] = sref;
+ prim.vertex_size = MAX(prim.vertex_size, offset + 1);
+
+ COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset));
+
+ } else if (parser.get_node_name() == "p") { //indices
+
+ Vector<float> values = _read_float_array(parser);
+ if (polygons) {
+ ERR_CONTINUE(prim.vertex_size == 0);
+ prim.polygons.push_back(values.size() / prim.vertex_size);
+ int from = prim.indices.size();
+ prim.indices.resize(from + values.size());
+ for (int i = 0; i < values.size(); i++) {
+ prim.indices.write[from + i] = values[i];
+ }
+
+ } else if (prim.vertex_size > 0) {
+ prim.indices = values;
+ }
+
+ COLLADA_PRINT("read " + itos(values.size()) + " index values");
+
+ } else if (parser.get_node_name() == "vcount") { // primitive
+
+ Vector<float> values = _read_float_array(parser);
+ prim.polygons = values;
+ COLLADA_PRINT("read " + itos(values.size()) + " polygon values");
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) {
+ break;
+ }
+ }
+
+ meshdata.primitives.push_back(prim);
+
+ } else if (parser.get_node_name() == "double_sided") {
+ parser.read();
+ meshdata.found_double_sided = true;
+ meshdata.double_sided = parser.get_node_data().to_int();
+
+ } else if (parser.get_node_name() == "polygons") {
+ ERR_PRINT("Primitive type \"polygons\" not supported, re-export using \"polylist\" or \"triangles\".");
+ } else if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "mesh") {
+ break;
+ }
+ }
+}
+
+void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
+ state.skin_controller_data_map[p_id] = SkinControllerData();
+ SkinControllerData &skindata = state.skin_controller_data_map[p_id];
+
+ skindata.base = _uri_to_id(parser.get_attribute_value("source"));
+
+ String current_source;
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String section = parser.get_node_name();
+
+ if (section == "bind_shape_matrix") {
+ skindata.bind_shape = _read_transform(parser);
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ skindata.bind_shape.origin *= state.unit_scale;
+
+#endif
+ COLLADA_PRINT("skeleton bind shape transform: " + skindata.bind_shape);
+
+ } else if (section == "source") {
+ String id = parser.get_attribute_value("id");
+ skindata.sources[id] = SkinControllerData::Source();
+ current_source = id;
+ COLLADA_PRINT("source data: " + id);
+
+ } else if (section == "float_array" || section == "array") {
+ // create a new array and read it.
+ if (skindata.sources.has(current_source)) {
+ skindata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: " + current_source + " read " + itos(skindata.sources[current_source].array.size()) + " values.");
+ }
+ } else if (section == "Name_array" || section == "IDREF_array") {
+ // create a new array and read it.
+
+ if (section == "IDREF_array") {
+ skindata.use_idrefs = true;
+ }
+ if (skindata.sources.has(current_source)) {
+ skindata.sources[current_source].sarray = _read_string_array(parser);
+ if (section == "IDREF_array") {
+ Vector<String> sa = skindata.sources[current_source].sarray;
+ for (int i = 0; i < sa.size(); i++) {
+ state.idref_joints.insert(sa[i]);
+ }
+ }
+ COLLADA_PRINT("section: " + current_source + " read " + itos(skindata.sources[current_source].array.size()) + " values.");
+ }
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (skindata.sources.has(current_source)) {
+ int stride = 1;
+ if (parser.has_attribute("stride")) {
+ stride = parser.get_attribute_value("stride").to_int();
+ }
+
+ skindata.sources[current_source].stride = stride;
+ COLLADA_PRINT("section: " + current_source + " stride " + itos(skindata.sources[current_source].stride));
+ }
+
+ } else if (section == "joints") {
+ SkinControllerData::Joints joint;
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "input") {
+ String semantic = parser.get_attribute_value("semantic");
+ String source = _uri_to_id(parser.get_attribute_value("source"));
+
+ joint.sources[semantic] = source;
+
+ COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) {
+ break;
+ }
+ }
+
+ skindata.joints = joint;
+
+ } else if (section == "vertex_weights") {
+ SkinControllerData::Weights weights;
+
+ weights.count = parser.get_attribute_value("count").to_int();
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "input") {
+ String semantic = parser.get_attribute_value("semantic");
+ String source = _uri_to_id(parser.get_attribute_value("source"));
+
+ int offset = parser.get_attribute_value("offset").to_int();
+
+ SkinControllerData::Weights::SourceRef sref;
+ sref.source = source;
+ sref.offset = offset;
+ weights.sources[semantic] = sref;
+
+ COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset));
+
+ } else if (parser.get_node_name() == "v") { //indices
+
+ Vector<float> values = _read_float_array(parser);
+ weights.indices = values;
+ COLLADA_PRINT("read " + itos(values.size()) + " index values");
+
+ } else if (parser.get_node_name() == "vcount") { // weightsitive
+
+ Vector<float> values = _read_float_array(parser);
+ weights.sets = values;
+ COLLADA_PRINT("read " + itos(values.size()) + " polygon values");
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) {
+ break;
+ }
+ }
+
+ skindata.weights = weights;
+ }
+ /*
+ else if (!parser.is_empty())
+ parser.skip_section();
+ */
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "skin") {
+ break;
+ }
+ }
+
+ /* STORE REST MATRICES */
+
+ Vector<Transform> rests;
+ ERR_FAIL_COND(!skindata.joints.sources.has("JOINT"));
+ ERR_FAIL_COND(!skindata.joints.sources.has("INV_BIND_MATRIX"));
+
+ String joint_arr = skindata.joints.sources["JOINT"];
+ String ibm = skindata.joints.sources["INV_BIND_MATRIX"];
+
+ ERR_FAIL_COND(!skindata.sources.has(joint_arr));
+ ERR_FAIL_COND(!skindata.sources.has(ibm));
+
+ SkinControllerData::Source &joint_source = skindata.sources[joint_arr];
+ SkinControllerData::Source &ibm_source = skindata.sources[ibm];
+
+ ERR_FAIL_COND(joint_source.sarray.size() != ibm_source.array.size() / 16);
+
+ for (int i = 0; i < joint_source.sarray.size(); i++) {
+ String name = joint_source.sarray[i];
+ Transform xform = _read_transform_from_array(ibm_source.array, i * 16); //<- this is a mistake, it must be applied to vertices
+ xform.affine_invert(); // inverse for rest, because it's an inverse
+#ifdef COLLADA_IMPORT_SCALE_SCENE
+ xform.origin *= state.unit_scale;
+#endif
+ skindata.bone_rest_map[name] = xform;
+ }
+}
+
+void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
+ state.morph_controller_data_map[p_id] = MorphControllerData();
+ MorphControllerData &morphdata = state.morph_controller_data_map[p_id];
+
+ morphdata.mesh = _uri_to_id(parser.get_attribute_value("source"));
+ morphdata.mode = parser.get_attribute_value("method");
+ String current_source;
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String section = parser.get_node_name();
+
+ if (section == "source") {
+ String id = parser.get_attribute_value("id");
+ morphdata.sources[id] = MorphControllerData::Source();
+ current_source = id;
+ COLLADA_PRINT("source data: " + id);
+
+ } else if (section == "float_array" || section == "array") {
+ // create a new array and read it.
+ if (morphdata.sources.has(current_source)) {
+ morphdata.sources[current_source].array = _read_float_array(parser);
+ COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values.");
+ }
+ } else if (section == "Name_array" || section == "IDREF_array") {
+ // create a new array and read it.
+
+ /*
+ if (section=="IDREF_array")
+ morphdata.use_idrefs=true;
+ */
+ if (morphdata.sources.has(current_source)) {
+ morphdata.sources[current_source].sarray = _read_string_array(parser);
+ /*
+ if (section=="IDREF_array") {
+ Vector<String> sa = morphdata.sources[current_source].sarray;
+ for(int i=0;i<sa.size();i++)
+ state.idref_joints.insert(sa[i]);
+ }*/
+ COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values.");
+ }
+ } else if (section == "technique_common") {
+ //skip it
+ } else if (section == "accessor") { // child of source (below a technique tag)
+
+ if (morphdata.sources.has(current_source)) {
+ int stride = 1;
+ if (parser.has_attribute("stride")) {
+ stride = parser.get_attribute_value("stride").to_int();
+ }
+
+ morphdata.sources[current_source].stride = stride;
+ COLLADA_PRINT("section: " + current_source + " stride " + itos(morphdata.sources[current_source].stride));
+ }
+
+ } else if (section == "targets") {
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "input") {
+ String semantic = parser.get_attribute_value("semantic");
+ String source = _uri_to_id(parser.get_attribute_value("source"));
+
+ morphdata.targets[semantic] = source;
+
+ COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) {
+ break;
+ }
+ }
+ }
+ /*
+ else if (!parser.is_empty())
+ parser.skip_section();
+ */
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "morph") {
+ break;
+ }
+ }
+
+ if (morphdata.targets.has("MORPH_WEIGHT")) {
+ state.morph_name_map[morphdata.targets["MORPH_WEIGHT"]] = p_id;
+ }
+}
+
+void Collada::_parse_controller(XMLParser &parser) {
+ String id = parser.get_attribute_value("id");
+
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String section = parser.get_node_name();
+
+ if (section == "skin") {
+ _parse_skin_controller(parser, id);
+ } else if (section == "morph") {
+ _parse_morph_controller(parser, id);
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "controller") {
+ break;
+ }
+ }
+}
+
+Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) {
+ String type = parser.get_node_name();
+ NodeGeometry *geom = memnew(NodeGeometry);
+ geom->controller = type == "instance_controller";
+ geom->source = _uri_to_id(parser.get_attribute_value_safe("url"));
+
+ if (parser.is_empty()) { //nothing else to parse...
+ return geom;
+ }
+ // try to find also many materials and skeletons!
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "instance_material") {
+ String symbol = parser.get_attribute_value("symbol");
+ String target = _uri_to_id(parser.get_attribute_value("target"));
+
+ NodeGeometry::Material mat;
+ mat.target = target;
+ geom->material_map[symbol] = mat;
+ COLLADA_PRINT("uses material: '" + target + "' on primitive'" + symbol + "'");
+ } else if (parser.get_node_name() == "skeleton") {
+ parser.read();
+ String uri = _uri_to_id(parser.get_node_data());
+ if (uri != "") {
+ geom->skeletons.push_back(uri);
+ }
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == type) {
+ break;
+ }
+ }
+
+ if (geom->controller) {
+ if (geom->skeletons.empty()) {
+ //XSI style
+
+ if (state.skin_controller_data_map.has(geom->source)) {
+ SkinControllerData *skin = &state.skin_controller_data_map[geom->source];
+ //case where skeletons reference bones with IDREF (XSI)
+ ERR_FAIL_COND_V(!skin->joints.sources.has("JOINT"), geom);
+ String joint_arr = skin->joints.sources["JOINT"];
+ ERR_FAIL_COND_V(!skin->sources.has(joint_arr), geom);
+ Collada::SkinControllerData::Source &joint_source = skin->sources[joint_arr];
+ geom->skeletons = joint_source.sarray; //quite crazy, but should work.
+ }
+ }
+ }
+
+ return geom;
+}
+
+Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) {
+ NodeCamera *cam = memnew(NodeCamera);
+ cam->camera = _uri_to_id(parser.get_attribute_value_safe("url"));
+
+ if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness
+ cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
+ }
+
+ if (parser.is_empty()) { //nothing else to parse...
+ return cam;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_camera") {
+ break;
+ }
+ }
+
+ return cam;
+}
+
+Collada::Node *Collada::_parse_visual_instance_light(XMLParser &parser) {
+ NodeLight *cam = memnew(NodeLight);
+ cam->light = _uri_to_id(parser.get_attribute_value_safe("url"));
+
+ if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness
+ cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
+ }
+
+ if (parser.is_empty()) { //nothing else to parse...
+ return cam;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_light") {
+ break;
+ }
+ }
+
+ return cam;
+}
+
+Collada::Node *Collada::_parse_visual_node_instance_data(XMLParser &parser) {
+ String instance_type = parser.get_node_name();
+
+ if (instance_type == "instance_geometry" || instance_type == "instance_controller") {
+ return _parse_visual_instance_geometry(parser);
+ } else if (instance_type == "instance_camera") {
+ return _parse_visual_instance_camera(parser);
+ } else if (instance_type == "instance_light") {
+ return _parse_visual_instance_light(parser);
+ }
+
+ if (parser.is_empty()) { //nothing else to parse...
+ return nullptr;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == instance_type) {
+ break;
+ }
+ }
+
+ return nullptr;
+}
+
+Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
+ String name;
+
+ String id = parser.get_attribute_value_safe("id");
+
+ bool found_name = false;
+
+ if (id == "") {
+ id = "%NODEID%" + itos(Math::rand());
+
+ } else {
+ found_name = true;
+ }
+
+ Vector<Node::XForm> xform_list;
+ Vector<Node *> children;
+
+ String empty_draw_type = "";
+
+ Node *node = nullptr;
+
+ name = parser.has_attribute("name") ? parser.get_attribute_value_safe("name") : parser.get_attribute_value_safe("id");
+ if (name == "") {
+ name = id;
+ } else {
+ found_name = true;
+ }
+
+ if ((parser.has_attribute("type") && parser.get_attribute_value("type") == "JOINT") || state.idref_joints.has(name)) {
+ // handle a bone
+
+ NodeJoint *joint = memnew(NodeJoint);
+
+ if (parser.has_attribute("sid")) { //bones may not have sid
+ joint->sid = parser.get_attribute_value("sid");
+ //state.bone_map[joint->sid]=joint;
+ } else if (state.idref_joints.has(name)) {
+ joint->sid = name; //kind of a cheat but..
+ } else if (parser.has_attribute("name")) {
+ joint->sid = parser.get_attribute_value_safe("name");
+ }
+
+ if (joint->sid != "") {
+ state.sid_to_node_map[joint->sid] = id;
+ }
+
+ node = joint;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String section = parser.get_node_name();
+
+ if (section == "translate") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id = parser.get_attribute_value("sid");
+ }
+ xf.op = Node::XForm::OP_TRANSLATE;
+
+ Vector<float> xlt = _read_float_array(parser);
+ xf.data = xlt;
+ xform_list.push_back(xf);
+
+ } else if (section == "rotate") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id = parser.get_attribute_value("sid");
+ }
+ xf.op = Node::XForm::OP_ROTATE;
+
+ Vector<float> rot = _read_float_array(parser);
+ xf.data = rot;
+
+ xform_list.push_back(xf);
+
+ } else if (section == "scale") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id = parser.get_attribute_value("sid");
+ }
+
+ xf.op = Node::XForm::OP_SCALE;
+
+ Vector<float> scale = _read_float_array(parser);
+
+ xf.data = scale;
+
+ xform_list.push_back(xf);
+
+ } else if (section == "matrix") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id = parser.get_attribute_value("sid");
+ }
+ xf.op = Node::XForm::OP_MATRIX;
+
+ Vector<float> matrix = _read_float_array(parser);
+
+ xf.data = matrix;
+ String mtx;
+ for (int i = 0; i < matrix.size(); i++) {
+ mtx += " " + rtos(matrix[i]);
+ }
+
+ xform_list.push_back(xf);
+
+ } else if (section == "visibility") {
+ Node::XForm xf;
+ if (parser.has_attribute("sid")) {
+ xf.id = parser.get_attribute_value("sid");
+ }
+ xf.op = Node::XForm::OP_VISIBILITY;
+
+ Vector<float> visible = _read_float_array(parser);
+
+ xf.data = visible;
+
+ xform_list.push_back(xf);
+
+ } else if (section == "empty_draw_type") {
+ empty_draw_type = _read_empty_draw_type(parser);
+ } else if (section == "technique" || section == "extra") {
+ } else if (section != "node") {
+ //usually what defines the type of node
+ if (section.begins_with("instance_")) {
+ if (!node) {
+ node = _parse_visual_node_instance_data(parser);
+
+ } else {
+ ERR_PRINT("Multiple instance_* not supported.");
+ }
+ }
+
+ } else {
+ /* Found a child node!! what to do..*/
+
+ Node *child = _parse_visual_scene_node(parser);
+ children.push_back(child);
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "node") {
+ break;
+ }
+ }
+
+ if (!node) {
+ node = memnew(Node); //generic node, nothing of relevance found
+ }
+
+ node->noname = !found_name;
+ node->xform_list = xform_list;
+ node->children = children;
+ for (int i = 0; i < children.size(); i++) {
+ node->children[i]->parent = node;
+ }
+
+ node->name = name;
+ node->id = id;
+ node->empty_draw_type = empty_draw_type;
+
+ if (node->children.size() == 1) {
+ if (node->children[0]->noname && !node->noname) {
+ node->children[0]->name = node->name;
+ node->name = node->name + "-base";
+ }
+ }
+
+ node->default_transform = node->compute_transform(*this);
+ state.scene_map[id] = node;
+
+ return node;
+}
+
+void Collada::_parse_visual_scene(XMLParser &parser) {
+ String id = parser.get_attribute_value("id");
+
+ if (parser.is_empty()) {
+ return;
+ }
+
+ state.visual_scene_map[id] = VisualScene();
+ VisualScene &vscene = state.visual_scene_map[id];
+
+ if (parser.has_attribute("name")) {
+ vscene.name = parser.get_attribute_value("name");
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String section = parser.get_node_name();
+
+ if (section == "node") {
+ vscene.root_nodes.push_back(_parse_visual_scene_node(parser));
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "visual_scene") {
+ break;
+ }
+ }
+
+ COLLADA_PRINT("Scene ID:" + id);
+}
+
+void Collada::_parse_animation(XMLParser &parser) {
+ if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+
+ return;
+ }
+
+ Map<String, Vector<float>> float_sources;
+ Map<String, Vector<String>> string_sources;
+ Map<String, int> source_strides;
+ Map<String, Map<String, String>> samplers;
+ Map<String, Vector<String>> source_param_names;
+ Map<String, Vector<String>> source_param_types;
+
+ String id = "";
+ if (parser.has_attribute("id")) {
+ id = parser.get_attribute_value("id");
+ }
+
+ String current_source;
+ String current_sampler;
+ Vector<String> channel_sources;
+ Vector<String> channel_targets;
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+ if (name == "source") {
+ current_source = parser.get_attribute_value("id");
+ source_param_names[current_source] = Vector<String>();
+ source_param_types[current_source] = Vector<String>();
+
+ } else if (name == "float_array") {
+ if (current_source != "") {
+ float_sources[current_source] = _read_float_array(parser);
+ }
+
+ } else if (name == "Name_array") {
+ if (current_source != "") {
+ string_sources[current_source] = _read_string_array(parser);
+ }
+ } else if (name == "accessor") {
+ if (current_source != "" && parser.has_attribute("stride")) {
+ source_strides[current_source] = parser.get_attribute_value("stride").to_int();
+ }
+ } else if (name == "sampler") {
+ current_sampler = parser.get_attribute_value("id");
+ samplers[current_sampler] = Map<String, String>();
+ } else if (name == "param") {
+ if (parser.has_attribute("name")) {
+ source_param_names[current_source].push_back(parser.get_attribute_value("name"));
+ } else {
+ source_param_names[current_source].push_back("");
+ }
+
+ if (parser.has_attribute("type")) {
+ source_param_types[current_source].push_back(parser.get_attribute_value("type"));
+ } else {
+ source_param_types[current_source].push_back("");
+ }
+
+ } else if (name == "input") {
+ if (current_sampler != "") {
+ samplers[current_sampler][parser.get_attribute_value("semantic")] = parser.get_attribute_value("source");
+ }
+
+ } else if (name == "channel") {
+ channel_sources.push_back(parser.get_attribute_value("source"));
+ channel_targets.push_back(parser.get_attribute_value("target"));
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation") {
+ break; //end of <asset>
+ }
+ }
+
+ for (int i = 0; i < channel_sources.size(); i++) {
+ String source = _uri_to_id(channel_sources[i]);
+ String target = channel_targets[i];
+ ERR_CONTINUE(!samplers.has(source));
+ Map<String, String> &sampler = samplers[source];
+
+ ERR_CONTINUE(!sampler.has("INPUT")); //no input semantic? wtf?
+ String input_id = _uri_to_id(sampler["INPUT"]);
+ COLLADA_PRINT("input id is " + input_id);
+ ERR_CONTINUE(!float_sources.has(input_id));
+
+ ERR_CONTINUE(!sampler.has("OUTPUT"));
+ String output_id = _uri_to_id(sampler["OUTPUT"]);
+ ERR_CONTINUE(!float_sources.has(output_id));
+
+ ERR_CONTINUE(!source_param_names.has(output_id));
+
+ Vector<String> &names = source_param_names[output_id];
+
+ for (int l = 0; l < names.size(); l++) {
+ String name = names[l];
+
+ Vector<float> &time_keys = float_sources[input_id];
+ int key_count = time_keys.size();
+
+ AnimationTrack track; //begin crating track
+ track.id = id;
+
+ track.keys.resize(key_count);
+
+ for (int j = 0; j < key_count; j++) {
+ track.keys.write[j].time = time_keys[j];
+ state.animation_length = MAX(state.animation_length, time_keys[j]);
+ }
+
+ //now read actual values
+
+ int stride = 1;
+
+ if (source_strides.has(output_id)) {
+ stride = source_strides[output_id];
+ }
+ int output_len = stride / names.size();
+
+ ERR_CONTINUE(output_len == 0);
+ ERR_CONTINUE(!float_sources.has(output_id));
+
+ Vector<float> &output = float_sources[output_id];
+
+ ERR_CONTINUE_MSG((output.size() / stride) != key_count, "Wrong number of keys in output.");
+
+ for (int j = 0; j < key_count; j++) {
+ track.keys.write[j].data.resize(output_len);
+ for (int k = 0; k < output_len; k++) {
+ track.keys.write[j].data.write[k] = output[l + j * stride + k]; //super weird but should work:
+ }
+ }
+
+ if (sampler.has("INTERPOLATION")) {
+ String interp_id = _uri_to_id(sampler["INTERPOLATION"]);
+ ERR_CONTINUE(!string_sources.has(interp_id));
+ Vector<String> &interps = string_sources[interp_id];
+ ERR_CONTINUE(interps.size() != key_count);
+
+ for (int j = 0; j < key_count; j++) {
+ if (interps[j] == "BEZIER") {
+ track.keys.write[j].interp_type = AnimationTrack::INTERP_BEZIER;
+ } else {
+ track.keys.write[j].interp_type = AnimationTrack::INTERP_LINEAR;
+ }
+ }
+ }
+
+ if (sampler.has("IN_TANGENT") && sampler.has("OUT_TANGENT")) {
+ //bezier control points..
+ String intangent_id = _uri_to_id(sampler["IN_TANGENT"]);
+ ERR_CONTINUE(!float_sources.has(intangent_id));
+ Vector<float> &intangents = float_sources[intangent_id];
+
+ ERR_CONTINUE(intangents.size() != key_count * 2 * names.size());
+
+ String outangent_id = _uri_to_id(sampler["OUT_TANGENT"]);
+ ERR_CONTINUE(!float_sources.has(outangent_id));
+ Vector<float> &outangents = float_sources[outangent_id];
+ ERR_CONTINUE(outangents.size() != key_count * 2 * names.size());
+
+ for (int j = 0; j < key_count; j++) {
+ track.keys.write[j].in_tangent = Vector2(intangents[j * 2 * names.size() + 0 + l * 2], intangents[j * 2 * names.size() + 1 + l * 2]);
+ track.keys.write[j].out_tangent = Vector2(outangents[j * 2 * names.size() + 0 + l * 2], outangents[j * 2 * names.size() + 1 + l * 2]);
+ }
+ }
+
+ if (target.find("/") != -1) { //transform component
+ track.target = target.get_slicec('/', 0);
+ track.param = target.get_slicec('/', 1);
+ if (track.param.find(".") != -1) {
+ track.component = track.param.get_slice(".", 1).to_upper();
+ }
+ track.param = track.param.get_slice(".", 0);
+ if (names.size() > 1 && track.component == "") {
+ //this is a guess because the collada spec is ambiguous here...
+ //i suppose if you have many names (outputs) you can't use a component and i should abide to that.
+ track.component = name;
+ }
+ } else {
+ track.target = target;
+ }
+
+ state.animation_tracks.push_back(track);
+
+ if (!state.referenced_tracks.has(target)) {
+ state.referenced_tracks[target] = Vector<int>();
+ }
+
+ state.referenced_tracks[target].push_back(state.animation_tracks.size() - 1);
+
+ if (id != "") {
+ if (!state.by_id_tracks.has(id)) {
+ state.by_id_tracks[id] = Vector<int>();
+ }
+
+ state.by_id_tracks[id].push_back(state.animation_tracks.size() - 1);
+ }
+
+ COLLADA_PRINT("loaded animation with " + itos(key_count) + " keys");
+ }
+ }
+}
+
+void Collada::_parse_animation_clip(XMLParser &parser) {
+ if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) {
+ if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+
+ return;
+ }
+
+ AnimationClip clip;
+
+ if (parser.has_attribute("name")) {
+ clip.name = parser.get_attribute_value("name");
+ } else if (parser.has_attribute("id")) {
+ clip.name = parser.get_attribute_value("id");
+ }
+ if (parser.has_attribute("start")) {
+ clip.begin = parser.get_attribute_value("start").to_float();
+ }
+ if (parser.has_attribute("end")) {
+ clip.end = parser.get_attribute_value("end").to_float();
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+ if (name == "instance_animation") {
+ String url = _uri_to_id(parser.get_attribute_value("url"));
+ clip.tracks.push_back(url);
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation_clip") {
+ break; //end of <asset>
+ }
+ }
+
+ state.animation_clips.push_back(clip);
+}
+
+void Collada::_parse_scene(XMLParser &parser) {
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+
+ if (name == "instance_visual_scene") {
+ state.root_visual_scene = _uri_to_id(parser.get_attribute_value("url"));
+ } else if (name == "instance_physics_scene") {
+ state.root_physics_scene = _uri_to_id(parser.get_attribute_value("url"));
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "scene") {
+ break; //end of <asset>
+ }
+ }
+}
+
+void Collada::_parse_library(XMLParser &parser) {
+ if (parser.is_empty()) {
+ return;
+ }
+
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ String name = parser.get_node_name();
+ COLLADA_PRINT("library name is: " + name);
+ if (name == "image") {
+ _parse_image(parser);
+ } else if (name == "material") {
+ _parse_material(parser);
+ } else if (name == "effect") {
+ _parse_effect(parser);
+ } else if (name == "camera") {
+ _parse_camera(parser);
+ } else if (name == "light") {
+ _parse_light(parser);
+ } else if (name == "geometry") {
+ String id = parser.get_attribute_value("id");
+ String name2 = parser.get_attribute_value_safe("name");
+ while (parser.read() == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "mesh") {
+ state.mesh_name_map[id] = (name2 != "") ? name2 : id;
+ _parse_mesh_geometry(parser, id, name2);
+ } else if (parser.get_node_name() == "spline") {
+ state.mesh_name_map[id] = (name2 != "") ? name2 : id;
+ _parse_curve_geometry(parser, id, name2);
+ } else if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "geometry") {
+ break;
+ }
+ }
+
+ } else if (name == "controller") {
+ _parse_controller(parser);
+ } else if (name == "animation") {
+ _parse_animation(parser);
+ } else if (name == "animation_clip") {
+ _parse_animation_clip(parser);
+ } else if (name == "visual_scene") {
+ COLLADA_PRINT("visual scene");
+ _parse_visual_scene(parser);
+ } else if (!parser.is_empty()) {
+ parser.skip_section();
+ }
+
+ } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name().begins_with("library_")) {
+ break; //end of <asset>
+ }
+ }
+}
+
+void Collada::_joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner) {
+ if (p_node->type == Node::TYPE_JOINT) {
+ NodeJoint *nj = static_cast<NodeJoint *>(p_node);
+ nj->owner = p_owner;
+
+ for (int i = 0; i < nj->children.size(); i++) {
+ _joint_set_owner(nj->children.write[i], p_owner);
+ }
+ }
+}
+
+void Collada::_create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton) {
+ Node *node = *p_node;
+
+ if (node->type == Node::TYPE_JOINT) {
+ if (!p_skeleton) {
+ // ohohohoohoo it's a joint node, time to work!
+ NodeSkeleton *sk = memnew(NodeSkeleton);
+ *p_node = sk;
+ sk->children.push_back(node);
+ sk->parent = node->parent;
+ node->parent = sk;
+ p_skeleton = sk;
+ }
+
+ NodeJoint *nj = static_cast<NodeJoint *>(node);
+ nj->owner = p_skeleton;
+ } else {
+ p_skeleton = nullptr;
+ }
+
+ for (int i = 0; i < node->children.size(); i++) {
+ _create_skeletons(&node->children.write[i], p_skeleton);
+ }
+}
+
+bool Collada::_remove_node(Node *p_parent, Node *p_node) {
+ for (int i = 0; i < p_parent->children.size(); i++) {
+ if (p_parent->children[i] == p_node) {
+ p_parent->children.remove(i);
+ return true;
+ }
+ if (_remove_node(p_parent->children[i], p_node)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Collada::_remove_node(VisualScene *p_vscene, Node *p_node) {
+ for (int i = 0; i < p_vscene->root_nodes.size(); i++) {
+ if (p_vscene->root_nodes[i] == p_node) {
+ p_vscene->root_nodes.remove(i);
+ return;
+ }
+ if (_remove_node(p_vscene->root_nodes[i], p_node)) {
+ return;
+ }
+ }
+
+ ERR_PRINT("ERROR: Not found node to remove?");
+}
+
+void Collada::_merge_skeletons(VisualScene *p_vscene, Node *p_node) {
+ if (p_node->type == Node::TYPE_GEOMETRY) {
+ NodeGeometry *gnode = static_cast<NodeGeometry *>(p_node);
+ if (gnode->controller) {
+ // recount skeletons used
+ Set<NodeSkeleton *> skeletons;
+
+ for (int i = 0; i < gnode->skeletons.size(); i++) {
+ String nodeid = gnode->skeletons[i];
+
+ ERR_CONTINUE(!state.scene_map.has(nodeid)); //weird, it should have it...
+
+#ifdef NO_SAFE_CAST
+ NodeJoint *nj = static_cast<NodeJoint *>(state.scene_map[nodeid]);
+#else
+ NodeJoint *nj = dynamic_cast<NodeJoint *>(state.scene_map[nodeid]);
+#endif
+ ERR_CONTINUE(!nj); //broken collada
+ ERR_CONTINUE(!nj->owner); //weird, node should have a skeleton owner
+
+ skeletons.insert(nj->owner);
+ }
+
+ if (skeletons.size() > 1) {
+ //do the merger!!
+ Set<NodeSkeleton *>::Element *E = skeletons.front();
+ NodeSkeleton *base = E->get();
+
+ for (E = E->next(); E; E = E->next()) {
+ NodeSkeleton *merged = E->get();
+ _remove_node(p_vscene, merged);
+ for (int i = 0; i < merged->children.size(); i++) {
+ _joint_set_owner(merged->children[i], base);
+ base->children.push_back(merged->children[i]);
+ merged->children[i]->parent = base;
+ }
+
+ merged->children.clear(); //take children from it
+ memdelete(merged);
+ }
+ }
+ }
+ }
+
+ for (int i = 0; i < p_node->children.size(); i++) {
+ _merge_skeletons(p_vscene, p_node->children[i]);
+ }
+}
+
+void Collada::_merge_skeletons2(VisualScene *p_vscene) {
+ for (Map<String, SkinControllerData>::Element *E = state.skin_controller_data_map.front(); E; E = E->next()) {
+ SkinControllerData &cd = E->get();
+
+ NodeSkeleton *skeleton = nullptr;
+
+ for (Map<String, Transform>::Element *F = cd.bone_rest_map.front(); F; F = F->next()) {
+ String name;
+
+ if (!state.sid_to_node_map.has(F->key())) {
+ continue;
+ }
+
+ name = state.sid_to_node_map[F->key()];
+
+ ERR_CONTINUE(!state.scene_map.has(name));
+
+ Node *node = state.scene_map[name];
+ ERR_CONTINUE(node->type != Node::TYPE_JOINT);
+
+ NodeSkeleton *sk = nullptr;
+
+ while (node && !sk) {
+ if (node->type == Node::TYPE_SKELETON) {
+ sk = static_cast<NodeSkeleton *>(node);
+ }
+ node = node->parent;
+ }
+
+ ERR_CONTINUE(!sk);
+
+ if (!skeleton) {
+ skeleton = sk;
+ continue;
+ }
+
+ if (skeleton != sk) {
+ //whoa.. wtf, merge.
+ _remove_node(p_vscene, sk);
+ for (int i = 0; i < sk->children.size(); i++) {
+ _joint_set_owner(sk->children[i], skeleton);
+ skeleton->children.push_back(sk->children[i]);
+ sk->children[i]->parent = skeleton;
+ }
+
+ sk->children.clear(); //take children from it
+ memdelete(sk);
+ }
+ }
+ }
+}
+
+bool Collada::_optimize_skeletons(VisualScene *p_vscene, Node *p_node) {
+ Node *node = p_node;
+
+ if (node->type == Node::TYPE_SKELETON && node->parent && node->parent->type == Node::TYPE_NODE && node->parent->children.size() == 1) {
+ //replace parent by this...
+ Node *parent = node->parent;
+
+ //i wonder if this is alright.. i think it is since created skeleton (first joint) is already animated by bone..
+ node->id = parent->id;
+ node->name = parent->name;
+ node->xform_list = parent->xform_list;
+ node->default_transform = parent->default_transform;
+
+ state.scene_map[node->id] = node;
+ node->parent = parent->parent;
+
+ if (parent->parent) {
+ Node *gp = parent->parent;
+ bool found = false;
+ for (int i = 0; i < gp->children.size(); i++) {
+ if (gp->children[i] == parent) {
+ gp->children.write[i] = node;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ ERR_PRINT("BUG");
+ }
+ } else {
+ bool found = false;
+
+ for (int i = 0; i < p_vscene->root_nodes.size(); i++) {
+ if (p_vscene->root_nodes[i] == parent) {
+ p_vscene->root_nodes.write[i] = node;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ ERR_PRINT("BUG");
+ }
+ }
+
+ parent->children.clear();
+ memdelete(parent);
+ return true;
+ }
+
+ for (int i = 0; i < node->children.size(); i++) {
+ if (_optimize_skeletons(p_vscene, node->children[i])) {
+ return false; //stop processing, go up
+ }
+ }
+
+ return false;
+}
+
+bool Collada::_move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, List<Node *> *p_mgeom) {
+ // Bind Shape Matrix scales the bones and makes them gigantic, so the matrix then shrinks the model?
+ // Solution: apply the Bind Shape Matrix to the VERTICES, and if the object comes scaled, it seems to be left alone!
+
+ if (p_node->type == Node::TYPE_GEOMETRY) {
+ NodeGeometry *ng = static_cast<NodeGeometry *>(p_node);
+ if (ng->ignore_anim) {
+ return false; //already made child of skeleton and processeg
+ }
+
+ if (ng->controller && ng->skeletons.size()) {
+ String nodeid = ng->skeletons[0];
+
+ ERR_FAIL_COND_V(!state.scene_map.has(nodeid), false); //weird, it should have it...
+#ifdef NO_SAFE_CAST
+ NodeJoint *nj = static_cast<NodeJoint *>(state.scene_map[nodeid]);
+#else
+ NodeJoint *nj = dynamic_cast<NodeJoint *>(state.scene_map[nodeid]);
+#endif
+ ERR_FAIL_COND_V(!nj, false);
+ ERR_FAIL_COND_V(!nj->owner, false); //weird, node should have a skeleton owner
+
+ NodeSkeleton *sk = nj->owner;
+
+ Node *p = sk->parent;
+ bool node_is_parent_of_skeleton = false;
+
+ while (p) {
+ if (p == p_node) {
+ node_is_parent_of_skeleton = true;
+ break;
+ }
+ p = p->parent; // try again
+ }
+
+ ERR_FAIL_COND_V(node_is_parent_of_skeleton, false);
+
+ //this should be correct
+ ERR_FAIL_COND_V(!state.skin_controller_data_map.has(ng->source), false);
+ SkinControllerData &skin = state.skin_controller_data_map[ng->source];
+ Transform skel_inv = sk->get_global_transform().affine_inverse();
+ p_node->default_transform = skel_inv * (skin.bind_shape /* p_node->get_global_transform()*/); // i honestly have no idea what to do with a previous model xform.. most exporters ignore it
+
+ //make rests relative to the skeleton (they seem to be always relative to world)
+ for (Map<String, Transform>::Element *E = skin.bone_rest_map.front(); E; E = E->next()) {
+ E->get() = skel_inv * E->get(); //make the bone rest local to the skeleton
+ state.bone_rest_map[E->key()] = E->get(); // make it remember where the bone is globally, now that it's relative
+ }
+
+ //but most exporters seem to work only if i do this..
+ //p_node->default_transform = p_node->get_global_transform();
+
+ //p_node->default_transform=Transform(); //this seems to be correct, because bind shape makes the object local to the skeleton
+ p_node->ignore_anim = true; // collada may animate this later, if it does, then this is not supported (redo your original asset and don't animate the base mesh)
+ p_node->parent = sk;
+ //sk->children.push_back(0,p_node); //avoid INFINITE loop
+ p_mgeom->push_back(p_node);
+ return true;
+ }
+ }
+
+ for (int i = 0; i < p_node->children.size(); i++) {
+ if (_move_geometry_to_skeletons(p_vscene, p_node->children[i], p_mgeom)) {
+ p_node->children.remove(i);
+ i--;
+ }
+ }
+
+ return false;
+}
+
+void Collada::_find_morph_nodes(VisualScene *p_vscene, Node *p_node) {
+ if (p_node->type == Node::TYPE_GEOMETRY) {
+ NodeGeometry *nj = static_cast<NodeGeometry *>(p_node);
+
+ if (nj->controller) {
+ String base = nj->source;
+
+ while (base != "" && !state.mesh_data_map.has(base)) {
+ if (state.skin_controller_data_map.has(base)) {
+ SkinControllerData &sk = state.skin_controller_data_map[base];
+ base = sk.base;
+ } else if (state.morph_controller_data_map.has(base)) {
+ state.morph_ownership_map[base] = nj->id;
+ break;
+ } else {
+ ERR_FAIL_MSG("Invalid scene.");
+ }
+ }
+ }
+ }
+
+ for (int i = 0; i < p_node->children.size(); i++) {
+ _find_morph_nodes(p_vscene, p_node->children[i]);
+ }
+}
+
+void Collada::_optimize() {
+ for (Map<String, VisualScene>::Element *E = state.visual_scene_map.front(); E; E = E->next()) {
+ VisualScene &vs = E->get();
+ for (int i = 0; i < vs.root_nodes.size(); i++) {
+ _create_skeletons(&vs.root_nodes.write[i]);
+ }
+
+ for (int i = 0; i < vs.root_nodes.size(); i++) {
+ _merge_skeletons(&vs, vs.root_nodes[i]);
+ }
+
+ _merge_skeletons2(&vs);
+
+ for (int i = 0; i < vs.root_nodes.size(); i++) {
+ _optimize_skeletons(&vs, vs.root_nodes[i]);
+ }
+
+ for (int i = 0; i < vs.root_nodes.size(); i++) {
+ List<Node *> mgeom;
+ if (_move_geometry_to_skeletons(&vs, vs.root_nodes[i], &mgeom)) {
+ vs.root_nodes.remove(i);
+ i--;
+ }
+
+ while (!mgeom.empty()) {
+ Node *n = mgeom.front()->get();
+ n->parent->children.push_back(n);
+ mgeom.pop_front();
+ }
+ }
+
+ for (int i = 0; i < vs.root_nodes.size(); i++) {
+ _find_morph_nodes(&vs, vs.root_nodes[i]);
+ }
+ }
+}
+
+int Collada::get_uv_channel(String p_name) {
+ if (!channel_map.has(p_name)) {
+ ERR_FAIL_COND_V(channel_map.size() == 2, 0);
+
+ channel_map[p_name] = channel_map.size();
+ }
+
+ return channel_map[p_name];
+}
+
+Error Collada::load(const String &p_path, int p_flags) {
+ Ref<XMLParser> parserr = memnew(XMLParser);
+ XMLParser &parser = *parserr.ptr();
+ Error err = parser.open(p_path);
+ ERR_FAIL_COND_V_MSG(err, err, "Cannot open Collada file '" + p_path + "'.");
+
+ state.local_path = ProjectSettings::get_singleton()->localize_path(p_path);
+ state.import_flags = p_flags;
+ /* Skip headers */
+ while ((err = parser.read()) == OK) {
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
+ if (parser.get_node_name() == "COLLADA") {
+ break;
+ } else if (!parser.is_empty()) {
+ parser.skip_section(); // unknown section, likely headers
+ }
+ }
+ }
+
+ ERR_FAIL_COND_V_MSG(err != OK, ERR_FILE_CORRUPT, "Corrupted Collada file '" + p_path + "'.");
+
+ /* Start loading Collada */
+
+ {
+ //version
+ String version = parser.get_attribute_value("version");
+ state.version.major = version.get_slice(".", 0).to_int();
+ state.version.minor = version.get_slice(".", 1).to_int();
+ state.version.rev = version.get_slice(".", 2).to_int();
+ COLLADA_PRINT("Collada VERSION: " + version);
+ }
+
+ while ((err = parser.read()) == OK) {
+ /* Read all the main sections.. */
+
+ if (parser.get_node_type() != XMLParser::NODE_ELEMENT) {
+ continue; //no idea what this may be, but skipping anyway
+ }
+
+ String section = parser.get_node_name();
+
+ COLLADA_PRINT("section: " + section);
+
+ if (section == "asset") {
+ _parse_asset(parser);
+
+ } else if (section.begins_with("library_")) {
+ _parse_library(parser);
+ } else if (section == "scene") {
+ _parse_scene(parser);
+ } else if (!parser.is_empty()) {
+ parser.skip_section(); // unknown section, likely headers
+ }
+ }
+
+ _optimize();
+ return OK;
+}
+
+Collada::Collada() {
+}
diff --git a/editor/import/collada.h b/editor/import/collada.h
new file mode 100644
index 0000000000..90c6c47e0b
--- /dev/null
+++ b/editor/import/collada.h
@@ -0,0 +1,578 @@
+/*************************************************************************/
+/* collada.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef COLLADA_H
+#define COLLADA_H
+
+#include "core/io/xml_parser.h"
+#include "core/map.h"
+#include "core/project_settings.h"
+#include "scene/resources/material.h"
+
+class Collada {
+public:
+ enum ImportFlags {
+ IMPORT_FLAG_SCENE = 1,
+ IMPORT_FLAG_ANIMATION = 2
+ };
+
+ struct Image {
+ String path;
+ };
+
+ struct Material {
+ String name;
+ String instance_effect;
+ };
+
+ struct Effect {
+ String name;
+ Map<String, Variant> params;
+
+ struct Channel {
+ int uv_idx = 0;
+ String texture;
+ Color color;
+ Channel() {}
+ };
+
+ Channel diffuse, specular, emission, bump;
+ float shininess = 40;
+ bool found_double_sided = false;
+ bool double_sided = true;
+ bool unshaded = false;
+
+ String get_texture_path(const String &p_source, Collada &state) const;
+
+ Effect() {
+ diffuse.color = Color(1, 1, 1, 1);
+ }
+ };
+
+ struct CameraData {
+ enum Mode {
+ MODE_PERSPECTIVE,
+ MODE_ORTHOGONAL
+ };
+
+ Mode mode = MODE_PERSPECTIVE;
+
+ union {
+ struct {
+ float x_fov = 0;
+ float y_fov = 0;
+ } perspective;
+ struct {
+ float x_mag = 0;
+ float y_mag = 0;
+ } orthogonal;
+ };
+
+ float aspect = 1;
+ float z_near = 0.1;
+ float z_far = 100;
+
+ CameraData() {}
+ };
+
+ struct LightData {
+ enum Mode {
+ MODE_AMBIENT,
+ MODE_DIRECTIONAL,
+ MODE_OMNI,
+ MODE_SPOT
+ };
+
+ Mode mode = MODE_AMBIENT;
+
+ Color color = Color(1, 1, 1, 1);
+
+ float constant_att = 0;
+ float linear_att = 0;
+ float quad_att = 0;
+
+ float spot_angle = 45;
+ float spot_exp = 1;
+
+ LightData() {}
+ };
+
+ struct MeshData {
+ String name;
+ struct Source {
+ Vector<float> array;
+ int stride;
+ };
+
+ Map<String, Source> sources;
+
+ struct Vertices {
+ Map<String, String> sources;
+ };
+
+ Map<String, Vertices> vertices;
+
+ struct Primitives {
+ struct SourceRef {
+ String source;
+ int offset;
+ };
+
+ String material;
+ Map<String, SourceRef> sources;
+ Vector<float> polygons;
+ Vector<float> indices;
+ int count;
+ int vertex_size;
+ };
+
+ Vector<Primitives> primitives;
+
+ bool found_double_sided = false;
+ bool double_sided = true;
+
+ MeshData() {}
+ };
+
+ struct CurveData {
+ String name;
+ bool closed = false;
+
+ struct Source {
+ Vector<String> sarray;
+ Vector<float> array;
+ int stride;
+ };
+
+ Map<String, Source> sources;
+
+ Map<String, String> control_vertices;
+
+ CurveData() {}
+ };
+
+ struct SkinControllerData {
+ String base;
+ bool use_idrefs = false;
+
+ Transform bind_shape;
+
+ struct Source {
+ Vector<String> sarray; //maybe for names
+ Vector<float> array;
+ int stride = 1;
+ Source() {}
+ };
+
+ Map<String, Source> sources;
+
+ struct Joints {
+ Map<String, String> sources;
+ } joints;
+
+ struct Weights {
+ struct SourceRef {
+ String source;
+ int offset;
+ };
+
+ String material;
+ Map<String, SourceRef> sources;
+ Vector<float> sets;
+ Vector<float> indices;
+ int count;
+ } weights;
+
+ Map<String, Transform> bone_rest_map;
+
+ SkinControllerData() {}
+ };
+
+ struct MorphControllerData {
+ String mesh;
+ String mode;
+
+ struct Source {
+ int stride = 1;
+ Vector<String> sarray; //maybe for names
+ Vector<float> array;
+ Source() {}
+ };
+
+ Map<String, Source> sources;
+
+ Map<String, String> targets;
+ MorphControllerData() {}
+ };
+
+ struct Vertex {
+ int idx = 0;
+ Vector3 vertex;
+ Vector3 normal;
+ Vector3 uv;
+ Vector3 uv2;
+ Plane tangent;
+ Color color;
+ int uid = 0;
+ struct Weight {
+ int bone_idx;
+ float weight;
+ bool operator<(const Weight w) const { return weight > w.weight; } //heaviest first
+ };
+
+ Vector<Weight> weights;
+
+ void fix_weights() {
+ weights.sort();
+ if (weights.size() > 4) {
+ //cap to 4 and make weights add up 1
+ weights.resize(4);
+ float total = 0;
+ for (int i = 0; i < 4; i++) {
+ total += weights[i].weight;
+ }
+ if (total) {
+ for (int i = 0; i < 4; i++) {
+ weights.write[i].weight /= total;
+ }
+ }
+ }
+ }
+
+ void fix_unit_scale(Collada &state);
+
+ bool operator<(const Vertex &p_vert) const {
+ if (uid == p_vert.uid) {
+ if (vertex == p_vert.vertex) {
+ if (normal == p_vert.normal) {
+ if (uv == p_vert.uv) {
+ if (uv2 == p_vert.uv2) {
+ if (!weights.empty() || !p_vert.weights.empty()) {
+ if (weights.size() == p_vert.weights.size()) {
+ for (int i = 0; i < weights.size(); i++) {
+ if (weights[i].bone_idx != p_vert.weights[i].bone_idx) {
+ return weights[i].bone_idx < p_vert.weights[i].bone_idx;
+ }
+
+ if (weights[i].weight != p_vert.weights[i].weight) {
+ return weights[i].weight < p_vert.weights[i].weight;
+ }
+ }
+ } else {
+ return weights.size() < p_vert.weights.size();
+ }
+ }
+
+ return (color < p_vert.color);
+ } else {
+ return (uv2 < p_vert.uv2);
+ }
+ } else {
+ return (uv < p_vert.uv);
+ }
+ } else {
+ return (normal < p_vert.normal);
+ }
+ } else {
+ return vertex < p_vert.vertex;
+ }
+ } else {
+ return uid < p_vert.uid;
+ }
+ }
+
+ Vertex() {}
+ };
+
+ struct Node {
+ enum Type {
+
+ TYPE_NODE,
+ TYPE_JOINT,
+ TYPE_SKELETON, //this bone is not collada, it's added afterwards as optimization
+ TYPE_LIGHT,
+ TYPE_CAMERA,
+ TYPE_GEOMETRY
+ };
+
+ struct XForm {
+ enum Op {
+ OP_ROTATE,
+ OP_SCALE,
+ OP_TRANSLATE,
+ OP_MATRIX,
+ OP_VISIBILITY
+ };
+
+ String id;
+ Op op;
+ Vector<float> data;
+ };
+
+ Type type = TYPE_NODE;
+
+ String name;
+ String id;
+ String empty_draw_type;
+ bool noname = false;
+ Vector<XForm> xform_list;
+ Transform default_transform;
+ Transform post_transform;
+ Vector<Node *> children;
+
+ Node *parent = nullptr;
+
+ Transform compute_transform(Collada &state) const;
+ Transform get_global_transform() const;
+ Transform get_transform() const;
+
+ bool ignore_anim = false;
+
+ Node() {}
+ virtual ~Node() {
+ for (int i = 0; i < children.size(); i++) {
+ memdelete(children[i]);
+ }
+ };
+ };
+
+ struct NodeSkeleton : public Node {
+ NodeSkeleton() { type = TYPE_SKELETON; }
+ };
+
+ struct NodeJoint : public Node {
+ NodeSkeleton *owner = nullptr;
+ String sid;
+ NodeJoint() {
+ type = TYPE_JOINT;
+ }
+ };
+
+ struct NodeGeometry : public Node {
+ bool controller;
+ String source;
+
+ struct Material {
+ String target;
+ };
+
+ Map<String, Material> material_map;
+ Vector<String> skeletons;
+
+ NodeGeometry() { type = TYPE_GEOMETRY; }
+ };
+
+ struct NodeCamera : public Node {
+ String camera;
+
+ NodeCamera() { type = TYPE_CAMERA; }
+ };
+
+ struct NodeLight : public Node {
+ String light;
+
+ NodeLight() { type = TYPE_LIGHT; }
+ };
+
+ struct VisualScene {
+ String name;
+ Vector<Node *> root_nodes;
+
+ ~VisualScene() {
+ for (int i = 0; i < root_nodes.size(); i++) {
+ memdelete(root_nodes[i]);
+ }
+ }
+ };
+
+ struct AnimationClip {
+ String name;
+ float begin = 0;
+ float end = 1;
+ Vector<String> tracks;
+
+ AnimationClip() {}
+ };
+
+ struct AnimationTrack {
+ String id;
+ String target;
+ String param;
+ String component;
+ bool property = false;
+
+ enum InterpolationType {
+ INTERP_LINEAR,
+ INTERP_BEZIER
+ };
+
+ struct Key {
+ enum Type {
+ TYPE_FLOAT,
+ TYPE_MATRIX
+ };
+
+ float time;
+ Vector<float> data;
+ Point2 in_tangent;
+ Point2 out_tangent;
+ InterpolationType interp_type = INTERP_LINEAR;
+
+ Key() {}
+ };
+
+ Vector<float> get_value_at_time(float p_time) const;
+
+ Vector<Key> keys;
+
+ AnimationTrack() {}
+ };
+
+ /****************/
+ /* IMPORT STATE */
+ /****************/
+
+ struct State {
+ int import_flags = 0;
+
+ float unit_scale = 1.0;
+ Vector3::Axis up_axis = Vector3::AXIS_Y;
+ bool z_up;
+
+ struct Version {
+ int major, minor, rev;
+
+ bool operator<(const Version &p_ver) const { return (major == p_ver.major) ? ((minor == p_ver.minor) ? (rev < p_ver.rev) : minor < p_ver.minor) : major < p_ver.major; }
+ Version(int p_major = 0, int p_minor = 0, int p_rev = 0) {
+ major = p_major;
+ minor = p_minor;
+ rev = p_rev;
+ }
+ } version;
+
+ Map<String, CameraData> camera_data_map;
+ Map<String, MeshData> mesh_data_map;
+ Map<String, LightData> light_data_map;
+ Map<String, CurveData> curve_data_map;
+
+ Map<String, String> mesh_name_map;
+ Map<String, String> morph_name_map;
+ Map<String, String> morph_ownership_map;
+ Map<String, SkinControllerData> skin_controller_data_map;
+ Map<String, MorphControllerData> morph_controller_data_map;
+
+ Map<String, Image> image_map;
+ Map<String, Material> material_map;
+ Map<String, Effect> effect_map;
+
+ Map<String, VisualScene> visual_scene_map;
+ Map<String, Node *> scene_map;
+ Set<String> idref_joints;
+ Map<String, String> sid_to_node_map;
+ //Map<String,NodeJoint*> bone_map;
+
+ Map<String, Transform> bone_rest_map;
+
+ String local_path;
+ String root_visual_scene;
+ String root_physics_scene;
+
+ Vector<AnimationClip> animation_clips;
+ Vector<AnimationTrack> animation_tracks;
+ Map<String, Vector<int>> referenced_tracks;
+ Map<String, Vector<int>> by_id_tracks;
+
+ float animation_length = 0;
+
+ State() {}
+ } state;
+
+ Error load(const String &p_path, int p_flags = 0);
+
+ Collada();
+
+ Transform fix_transform(const Transform &p_transform);
+
+ Transform get_root_transform() const;
+
+ int get_uv_channel(String p_name);
+
+private: // private stuff
+ Map<String, int> channel_map;
+
+ void _parse_asset(XMLParser &parser);
+ void _parse_image(XMLParser &parser);
+ void _parse_material(XMLParser &parser);
+ void _parse_effect_material(XMLParser &parser, Effect &effect, String &id);
+ void _parse_effect(XMLParser &parser);
+ void _parse_camera(XMLParser &parser);
+ void _parse_light(XMLParser &parser);
+ void _parse_animation_clip(XMLParser &parser);
+
+ void _parse_mesh_geometry(XMLParser &parser, String p_id, String p_name);
+ void _parse_curve_geometry(XMLParser &parser, String p_id, String p_name);
+
+ void _parse_skin_controller(XMLParser &parser, String p_id);
+ void _parse_morph_controller(XMLParser &parser, String p_id);
+ void _parse_controller(XMLParser &parser);
+
+ Node *_parse_visual_instance_geometry(XMLParser &parser);
+ Node *_parse_visual_instance_camera(XMLParser &parser);
+ Node *_parse_visual_instance_light(XMLParser &parser);
+
+ Node *_parse_visual_node_instance_data(XMLParser &parser);
+ Node *_parse_visual_scene_node(XMLParser &parser);
+ void _parse_visual_scene(XMLParser &parser);
+
+ void _parse_animation(XMLParser &parser);
+ void _parse_scene(XMLParser &parser);
+ void _parse_library(XMLParser &parser);
+
+ Variant _parse_param(XMLParser &parser);
+ Vector<float> _read_float_array(XMLParser &parser);
+ Vector<String> _read_string_array(XMLParser &parser);
+ Transform _read_transform(XMLParser &parser);
+ String _read_empty_draw_type(XMLParser &parser);
+
+ void _joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner);
+ void _create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton = nullptr);
+ void _find_morph_nodes(VisualScene *p_vscene, Node *p_node);
+ bool _remove_node(Node *p_parent, Node *p_node);
+ void _remove_node(VisualScene *p_vscene, Node *p_node);
+ void _merge_skeletons2(VisualScene *p_vscene);
+ void _merge_skeletons(VisualScene *p_vscene, Node *p_node);
+ bool _optimize_skeletons(VisualScene *p_vscene, Node *p_node);
+
+ bool _move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, List<Node *> *p_mgeom);
+
+ void _optimize();
+};
+
+#endif // COLLADA_H
diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp
index b3f97714ae..12cbaaa885 100644
--- a/editor/import/editor_import_collada.cpp
+++ b/editor/import/editor_import_collada.cpp
@@ -31,34 +31,33 @@
#include "editor_import_collada.h"
#include "core/os/os.h"
-#include "editor/collada/collada.h"
#include "editor/editor_node.h"
-#include "scene/3d/camera.h"
-#include "scene/3d/light.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/3d/path.h"
-#include "scene/3d/skeleton.h"
-#include "scene/3d/spatial.h"
+#include "editor/import/collada.h"
+#include "scene/3d/camera_3d.h"
+#include "scene/3d/light_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/3d/node_3d.h"
+#include "scene/3d/path_3d.h"
+#include "scene/3d/skeleton_3d.h"
#include "scene/animation/animation_player.h"
#include "scene/resources/animation.h"
#include "scene/resources/packed_scene.h"
#include "scene/resources/surface_tool.h"
struct ColladaImport {
-
Collada collada;
- Spatial *scene;
+ Node3D *scene;
- Vector<Ref<Animation> > animations;
+ Vector<Ref<Animation>> animations;
struct NodeMap {
//String path;
- Spatial *node;
+ Node3D *node;
int bone;
List<int> anim_tracks;
NodeMap() {
- node = NULL;
+ node = nullptr;
bone = -1;
}
};
@@ -73,23 +72,23 @@ struct ColladaImport {
Map<String, NodeMap> node_map; //map from collada node to engine node
Map<String, String> node_name_map; //map from collada node to engine node
- Map<String, Ref<ArrayMesh> > mesh_cache;
- Map<String, Ref<Curve3D> > curve_cache;
- Map<String, Ref<Material> > material_cache;
- Map<Collada::Node *, Skeleton *> skeleton_map;
+ Map<String, Ref<ArrayMesh>> mesh_cache;
+ Map<String, Ref<Curve3D>> curve_cache;
+ Map<String, Ref<Material>> material_cache;
+ Map<Collada::Node *, Skeleton3D *> skeleton_map;
- Map<Skeleton *, Map<String, int> > skeleton_bone_map;
+ Map<Skeleton3D *, Map<String, int>> skeleton_bone_map;
Set<String> valid_animated_nodes;
Vector<int> valid_animated_properties;
Map<String, bool> bones_with_animation;
- Error _populate_skeleton(Skeleton *p_skeleton, Collada::Node *p_node, int &r_bone, int p_parent);
+ Error _populate_skeleton(Skeleton3D *p_skeleton, Collada::Node *p_node, int &r_bone, int p_parent);
Error _create_scene_skeletons(Collada::Node *p_node);
- Error _create_scene(Collada::Node *p_node, Spatial *p_parent);
+ Error _create_scene(Collada::Node *p_node, Node3D *p_parent);
Error _create_resources(Collada::Node *p_node, bool p_use_compression);
Error _create_material(const String &p_target);
- Error _create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_mesh, const Map<String, Collada::NodeGeometry::Material> &p_material_map, const Collada::MeshData &meshdata, const Transform &p_local_xform, const Vector<int> &bone_remap, const Collada::SkinControllerData *p_skin_controller, const Collada::MorphControllerData *p_morph_data, Vector<Ref<ArrayMesh> > p_morph_meshes = Vector<Ref<ArrayMesh> >(), bool p_use_compression = false, bool p_use_mesh_material = false);
+ Error _create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_mesh, const Map<String, Collada::NodeGeometry::Material> &p_material_map, const Collada::MeshData &meshdata, const Transform &p_local_xform, const Vector<int> &bone_remap, const Collada::SkinControllerData *p_skin_controller, const Collada::MorphControllerData *p_morph_data, Vector<Ref<ArrayMesh>> p_morph_meshes = Vector<Ref<ArrayMesh>>(), bool p_use_compression = false, bool p_use_mesh_material = false);
Error load(const String &p_path, int p_flags, bool p_force_make_tangents = false, bool p_use_compression = false);
void _fix_param_animation_tracks();
void create_animation(int p_clip, bool p_make_tracks_in_all_bones, bool p_import_value_tracks);
@@ -101,7 +100,6 @@ struct ColladaImport {
void _pre_process_lights(Collada::Node *p_node);
ColladaImport() {
-
found_ambient = false;
found_directional = false;
force_make_tangents = false;
@@ -110,16 +108,17 @@ struct ColladaImport {
}
};
-Error ColladaImport::_populate_skeleton(Skeleton *p_skeleton, Collada::Node *p_node, int &r_bone, int p_parent) {
-
- if (p_node->type != Collada::Node::TYPE_JOINT)
+Error ColladaImport::_populate_skeleton(Skeleton3D *p_skeleton, Collada::Node *p_node, int &r_bone, int p_parent) {
+ if (p_node->type != Collada::Node::TYPE_JOINT) {
return OK;
+ }
Collada::NodeJoint *joint = static_cast<Collada::NodeJoint *>(p_node);
p_skeleton->add_bone(p_node->name);
- if (p_parent >= 0)
+ if (p_parent >= 0) {
p_skeleton->set_bone_parent(r_bone, p_parent);
+ }
NodeMap nm;
nm.node = p_skeleton;
@@ -130,7 +129,6 @@ Error ColladaImport::_populate_skeleton(Skeleton *p_skeleton, Collada::Node *p_n
skeleton_bone_map[p_skeleton][joint->sid] = r_bone;
if (collada.state.bone_rest_map.has(joint->sid)) {
-
p_skeleton->set_bone_rest(r_bone, collada.fix_transform(collada.state.bone_rest_map[joint->sid]));
//should map this bone to something for animation?
} else {
@@ -139,22 +137,19 @@ Error ColladaImport::_populate_skeleton(Skeleton *p_skeleton, Collada::Node *p_n
int id = r_bone++;
for (int i = 0; i < p_node->children.size(); i++) {
-
Error err = _populate_skeleton(p_skeleton, p_node->children[i], r_bone, id);
- if (err)
+ if (err) {
return err;
+ }
}
return OK;
}
void ColladaImport::_pre_process_lights(Collada::Node *p_node) {
-
if (p_node->type == Collada::Node::TYPE_LIGHT) {
-
Collada::NodeLight *light = static_cast<Collada::NodeLight *>(p_node);
if (collada.state.light_data_map.has(light->light)) {
-
Collada::LightData &ld = collada.state.light_data_map[light->light];
if (ld.mode == Collada::LightData::MODE_AMBIENT) {
found_ambient = true;
@@ -166,18 +161,16 @@ void ColladaImport::_pre_process_lights(Collada::Node *p_node) {
}
}
- for (int i = 0; i < p_node->children.size(); i++)
+ for (int i = 0; i < p_node->children.size(); i++) {
_pre_process_lights(p_node->children[i]);
+ }
}
Error ColladaImport::_create_scene_skeletons(Collada::Node *p_node) {
-
if (p_node->type == Collada::Node::TYPE_SKELETON) {
-
- Skeleton *sk = memnew(Skeleton);
+ Skeleton3D *sk = memnew(Skeleton3D);
int bone = 0;
for (int i = 0; i < p_node->children.size(); i++) {
-
_populate_skeleton(sk, p_node->children[i], bone, -1);
}
sk->localize_rests(); //after creating skeleton, rests must be localized...!
@@ -185,54 +178,48 @@ Error ColladaImport::_create_scene_skeletons(Collada::Node *p_node) {
}
for (int i = 0; i < p_node->children.size(); i++) {
-
Error err = _create_scene_skeletons(p_node->children[i]);
- if (err)
+ if (err) {
return err;
+ }
}
return OK;
}
-Error ColladaImport::_create_scene(Collada::Node *p_node, Spatial *p_parent) {
-
- Spatial *node = NULL;
+Error ColladaImport::_create_scene(Collada::Node *p_node, Node3D *p_parent) {
+ Node3D *node = nullptr;
switch (p_node->type) {
-
case Collada::Node::TYPE_NODE: {
-
- node = memnew(Spatial);
+ node = memnew(Node3D);
} break;
case Collada::Node::TYPE_JOINT: {
-
return OK; // do nothing
} break;
case Collada::Node::TYPE_LIGHT: {
-
//node = memnew( Light)
Collada::NodeLight *light = static_cast<Collada::NodeLight *>(p_node);
if (collada.state.light_data_map.has(light->light)) {
-
Collada::LightData &ld = collada.state.light_data_map[light->light];
if (ld.mode == Collada::LightData::MODE_AMBIENT) {
-
- if (found_directional)
+ if (found_directional) {
return OK; //do nothing not needed
+ }
- if (!bool(GLOBAL_DEF("collada/use_ambient", false)))
+ if (!bool(GLOBAL_DEF("collada/use_ambient", false))) {
return OK;
+ }
//well, it's an ambient light..
- Light *l = memnew(DirectionalLight);
+ Light3D *l = memnew(DirectionalLight3D);
//l->set_color(Light::COLOR_AMBIENT,ld.color);
//l->set_color(Light::COLOR_DIFFUSE,Color(0,0,0));
//l->set_color(Light::COLOR_SPECULAR,Color(0,0,0));
node = l;
} else if (ld.mode == Collada::LightData::MODE_DIRECTIONAL) {
-
//well, it's an ambient light..
- Light *l = memnew(DirectionalLight);
+ Light3D *l = memnew(DirectionalLight3D);
/*
if (found_ambient) //use it here
l->set_color(Light::COLOR_AMBIENT,ambient);
@@ -242,13 +229,12 @@ Error ColladaImport::_create_scene(Collada::Node *p_node, Spatial *p_parent) {
*/
node = l;
} else {
+ Light3D *l;
- Light *l;
-
- if (ld.mode == Collada::LightData::MODE_OMNI)
- l = memnew(OmniLight);
- else {
- l = memnew(SpotLight);
+ if (ld.mode == Collada::LightData::MODE_OMNI) {
+ l = memnew(OmniLight3D);
+ } else {
+ l = memnew(SpotLight3D);
//l->set_parameter(Light::PARAM_SPOT_ANGLE,ld.spot_angle);
//l->set_parameter(Light::PARAM_SPOT_ATTENUATION,ld.spot_exp);
}
@@ -261,43 +247,33 @@ Error ColladaImport::_create_scene(Collada::Node *p_node, Spatial *p_parent) {
}
} else {
-
- node = memnew(Spatial);
+ node = memnew(Node3D);
}
} break;
case Collada::Node::TYPE_CAMERA: {
-
Collada::NodeCamera *cam = static_cast<Collada::NodeCamera *>(p_node);
- Camera *camera = memnew(Camera);
+ Camera3D *camera = memnew(Camera3D);
if (collada.state.camera_data_map.has(cam->camera)) {
-
const Collada::CameraData &cd = collada.state.camera_data_map[cam->camera];
switch (cd.mode) {
-
case Collada::CameraData::MODE_ORTHOGONAL: {
-
if (cd.orthogonal.y_mag) {
-
- camera->set_keep_aspect_mode(Camera::KEEP_HEIGHT);
+ camera->set_keep_aspect_mode(Camera3D::KEEP_HEIGHT);
camera->set_orthogonal(cd.orthogonal.y_mag * 2.0, cd.z_near, cd.z_far);
} else if (!cd.orthogonal.y_mag && cd.orthogonal.x_mag) {
-
- camera->set_keep_aspect_mode(Camera::KEEP_WIDTH);
+ camera->set_keep_aspect_mode(Camera3D::KEEP_WIDTH);
camera->set_orthogonal(cd.orthogonal.x_mag * 2.0, cd.z_near, cd.z_far);
}
} break;
case Collada::CameraData::MODE_PERSPECTIVE: {
-
if (cd.perspective.y_fov) {
-
camera->set_perspective(cd.perspective.y_fov, cd.z_near, cd.z_far);
} else if (!cd.perspective.y_fov && cd.perspective.x_fov) {
-
camera->set_perspective(cd.perspective.x_fov / cd.aspect, cd.z_near, cd.z_far);
}
@@ -309,28 +285,26 @@ Error ColladaImport::_create_scene(Collada::Node *p_node, Spatial *p_parent) {
} break;
case Collada::Node::TYPE_GEOMETRY: {
-
Collada::NodeGeometry *ng = static_cast<Collada::NodeGeometry *>(p_node);
if (collada.state.curve_data_map.has(ng->source)) {
-
- node = memnew(Path);
+ node = memnew(Path3D);
} else {
//mesh since nothing else
- node = memnew(MeshInstance);
- //Object::cast_to<MeshInstance>(node)->set_flag(GeometryInstance::FLAG_USE_BAKED_LIGHT, true);
+ node = memnew(MeshInstance3D);
+ //Object::cast_to<MeshInstance3D>(node)->set_flag(GeometryInstance3D::FLAG_USE_BAKED_LIGHT, true);
}
} break;
case Collada::Node::TYPE_SKELETON: {
-
ERR_FAIL_COND_V(!skeleton_map.has(p_node), ERR_CANT_CREATE);
- Skeleton *sk = skeleton_map[p_node];
+ Skeleton3D *sk = skeleton_map[p_node];
node = sk;
} break;
}
- if (p_node->name != "")
+ if (p_node->name != "") {
node->set_name(p_node->name);
+ }
NodeMap nm;
nm.node = node;
node_map[p_node->id] = nm;
@@ -347,45 +321,42 @@ Error ColladaImport::_create_scene(Collada::Node *p_node, Spatial *p_parent) {
}
for (int i = 0; i < p_node->children.size(); i++) {
-
Error err = _create_scene(p_node->children[i], node);
- if (err)
+ if (err) {
return err;
+ }
}
return OK;
}
Error ColladaImport::_create_material(const String &p_target) {
-
ERR_FAIL_COND_V(material_cache.has(p_target), ERR_ALREADY_EXISTS);
ERR_FAIL_COND_V(!collada.state.material_map.has(p_target), ERR_INVALID_PARAMETER);
Collada::Material &src_mat = collada.state.material_map[p_target];
ERR_FAIL_COND_V(!collada.state.effect_map.has(src_mat.instance_effect), ERR_INVALID_PARAMETER);
Collada::Effect &effect = collada.state.effect_map[src_mat.instance_effect];
- Ref<SpatialMaterial> material = memnew(SpatialMaterial);
+ Ref<StandardMaterial3D> material = memnew(StandardMaterial3D);
- if (src_mat.name != "")
+ if (src_mat.name != "") {
material->set_name(src_mat.name);
- else if (effect.name != "")
+ } else if (effect.name != "") {
material->set_name(effect.name);
+ }
// DIFFUSE
if (effect.diffuse.texture != "") {
-
String texfile = effect.get_texture_path(effect.diffuse.texture, collada);
if (texfile != "") {
-
if (texfile.begins_with("/")) {
texfile = texfile.replace_first("/", "res://");
}
- Ref<Texture> texture = ResourceLoader::load(texfile, "Texture");
+ Ref<Texture2D> texture = ResourceLoader::load(texfile, "Texture2D");
if (texture.is_valid()) {
-
- material->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
+ material->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, texture);
material->set_albedo(Color(1, 1, 1, 1));
- //material->set_parameter(SpatialMaterial::PARAM_DIFFUSE,Color(1,1,1,1));
+ //material->set_parameter(StandardMaterial3D::PARAM_DIFFUSE,Color(1,1,1,1));
} else {
missing_textures.push_back(texfile.get_file());
}
@@ -397,21 +368,19 @@ Error ColladaImport::_create_material(const String &p_target) {
// SPECULAR
if (effect.specular.texture != "") {
-
String texfile = effect.get_texture_path(effect.specular.texture, collada);
if (texfile != "") {
-
if (texfile.begins_with("/")) {
texfile = texfile.replace_first("/", "res://");
}
- Ref<Texture> texture = ResourceLoader::load(texfile, "Texture");
+ Ref<Texture2D> texture = ResourceLoader::load(texfile, "Texture2D");
if (texture.is_valid()) {
- material->set_texture(SpatialMaterial::TEXTURE_METALLIC, texture);
+ material->set_texture(StandardMaterial3D::TEXTURE_METALLIC, texture);
material->set_specular(1.0);
- //material->set_texture(SpatialMaterial::PARAM_SPECULAR,texture);
- //material->set_parameter(SpatialMaterial::PARAM_SPECULAR,Color(1,1,1,1));
+ //material->set_texture(StandardMaterial3D::PARAM_SPECULAR,texture);
+ //material->set_parameter(StandardMaterial3D::PARAM_SPECULAR,Color(1,1,1,1));
} else {
missing_textures.push_back(texfile.get_file());
}
@@ -424,29 +393,26 @@ Error ColladaImport::_create_material(const String &p_target) {
// EMISSION
if (effect.emission.texture != "") {
-
String texfile = effect.get_texture_path(effect.emission.texture, collada);
if (texfile != "") {
-
if (texfile.begins_with("/")) {
texfile = texfile.replace_first("/", "res://");
}
- Ref<Texture> texture = ResourceLoader::load(texfile, "Texture");
+ Ref<Texture2D> texture = ResourceLoader::load(texfile, "Texture2D");
if (texture.is_valid()) {
-
- material->set_feature(SpatialMaterial::FEATURE_EMISSION, true);
- material->set_texture(SpatialMaterial::TEXTURE_EMISSION, texture);
+ material->set_feature(StandardMaterial3D::FEATURE_EMISSION, true);
+ material->set_texture(StandardMaterial3D::TEXTURE_EMISSION, texture);
material->set_emission(Color(1, 1, 1, 1));
- //material->set_parameter(SpatialMaterial::PARAM_EMISSION,Color(1,1,1,1));
+ //material->set_parameter(StandardMaterial3D::PARAM_EMISSION,Color(1,1,1,1));
} else {
missing_textures.push_back(texfile.get_file());
}
}
} else {
if (effect.emission.color != Color()) {
- material->set_feature(SpatialMaterial::FEATURE_EMISSION, true);
+ material->set_feature(StandardMaterial3D::FEATURE_EMISSION, true);
material->set_emission(effect.emission.color);
}
}
@@ -454,21 +420,19 @@ Error ColladaImport::_create_material(const String &p_target) {
// NORMAL
if (effect.bump.texture != "") {
-
String texfile = effect.get_texture_path(effect.bump.texture, collada);
if (texfile != "") {
-
if (texfile.begins_with("/")) {
texfile = texfile.replace_first("/", "res://");
}
- Ref<Texture> texture = ResourceLoader::load(texfile, "Texture");
+ Ref<Texture2D> texture = ResourceLoader::load(texfile, "Texture2D");
if (texture.is_valid()) {
- material->set_feature(SpatialMaterial::FEATURE_NORMAL_MAPPING, true);
- material->set_texture(SpatialMaterial::TEXTURE_NORMAL, texture);
+ material->set_feature(StandardMaterial3D::FEATURE_NORMAL_MAPPING, true);
+ material->set_texture(StandardMaterial3D::TEXTURE_NORMAL, texture);
//material->set_emission(Color(1,1,1,1));
- //material->set_texture(SpatialMaterial::PARAM_NORMAL,texture);
+ //material->set_texture(StandardMaterial3D::PARAM_NORMAL,texture);
} else {
//missing_textures.push_back(texfile.get_file());
}
@@ -479,42 +443,41 @@ Error ColladaImport::_create_material(const String &p_target) {
material->set_roughness(roughness);
if (effect.double_sided) {
- material->set_cull_mode(SpatialMaterial::CULL_DISABLED);
+ material->set_cull_mode(StandardMaterial3D::CULL_DISABLED);
+ }
+ if (effect.unshaded) {
+ material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
}
- material->set_flag(SpatialMaterial::FLAG_UNSHADED, effect.unshaded);
material_cache[p_target] = material;
return OK;
}
-Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_mesh, const Map<String, Collada::NodeGeometry::Material> &p_material_map, const Collada::MeshData &meshdata, const Transform &p_local_xform, const Vector<int> &bone_remap, const Collada::SkinControllerData *p_skin_controller, const Collada::MorphControllerData *p_morph_data, Vector<Ref<ArrayMesh> > p_morph_meshes, bool p_use_compression, bool p_use_mesh_material) {
-
+Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_mesh, const Map<String, Collada::NodeGeometry::Material> &p_material_map, const Collada::MeshData &meshdata, const Transform &p_local_xform, const Vector<int> &bone_remap, const Collada::SkinControllerData *p_skin_controller, const Collada::MorphControllerData *p_morph_data, Vector<Ref<ArrayMesh>> p_morph_meshes, bool p_use_compression, bool p_use_mesh_material) {
bool local_xform_mirror = p_local_xform.basis.determinant() < 0;
if (p_morph_data) {
-
//add morphie target
ERR_FAIL_COND_V(!p_morph_data->targets.has("MORPH_TARGET"), ERR_INVALID_DATA);
String mt = p_morph_data->targets["MORPH_TARGET"];
ERR_FAIL_COND_V(!p_morph_data->sources.has(mt), ERR_INVALID_DATA);
int morph_targets = p_morph_data->sources[mt].sarray.size();
for (int i = 0; i < morph_targets; i++) {
-
String target = p_morph_data->sources[mt].sarray[i];
ERR_FAIL_COND_V(!collada.state.mesh_data_map.has(target), ERR_INVALID_DATA);
String name = collada.state.mesh_data_map[target].name;
p_mesh->add_blend_shape(name);
}
- if (p_morph_data->mode == "RELATIVE")
+ if (p_morph_data->mode == "RELATIVE") {
p_mesh->set_blend_shape_mode(Mesh::BLEND_SHAPE_MODE_RELATIVE);
- else if (p_morph_data->mode == "NORMALIZED")
+ } else if (p_morph_data->mode == "NORMALIZED") {
p_mesh->set_blend_shape_mode(Mesh::BLEND_SHAPE_MODE_NORMALIZED);
+ }
}
int surface = 0;
for (int p_i = 0; p_i < meshdata.primitives.size(); p_i++) {
-
const Collada::MeshData::Primitives &p = meshdata.primitives[p_i];
/* VERTEX SOURCE */
@@ -534,66 +497,60 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
/* NORMAL SOURCE */
- const Collada::MeshData::Source *normal_src = NULL;
+ const Collada::MeshData::Source *normal_src = nullptr;
int normal_ofs = 0;
if (p.sources.has("NORMAL")) {
-
String normal_source_id = p.sources["NORMAL"].source;
normal_ofs = p.sources["NORMAL"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(normal_source_id), ERR_INVALID_DATA);
normal_src = &meshdata.sources[normal_source_id];
}
- const Collada::MeshData::Source *binormal_src = NULL;
+ const Collada::MeshData::Source *binormal_src = nullptr;
int binormal_ofs = 0;
if (p.sources.has("TEXBINORMAL")) {
-
String binormal_source_id = p.sources["TEXBINORMAL"].source;
binormal_ofs = p.sources["TEXBINORMAL"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(binormal_source_id), ERR_INVALID_DATA);
binormal_src = &meshdata.sources[binormal_source_id];
}
- const Collada::MeshData::Source *tangent_src = NULL;
+ const Collada::MeshData::Source *tangent_src = nullptr;
int tangent_ofs = 0;
if (p.sources.has("TEXTANGENT")) {
-
String tangent_source_id = p.sources["TEXTANGENT"].source;
tangent_ofs = p.sources["TEXTANGENT"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(tangent_source_id), ERR_INVALID_DATA);
tangent_src = &meshdata.sources[tangent_source_id];
}
- const Collada::MeshData::Source *uv_src = NULL;
+ const Collada::MeshData::Source *uv_src = nullptr;
int uv_ofs = 0;
if (p.sources.has("TEXCOORD0")) {
-
String uv_source_id = p.sources["TEXCOORD0"].source;
uv_ofs = p.sources["TEXCOORD0"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(uv_source_id), ERR_INVALID_DATA);
uv_src = &meshdata.sources[uv_source_id];
}
- const Collada::MeshData::Source *uv2_src = NULL;
+ const Collada::MeshData::Source *uv2_src = nullptr;
int uv2_ofs = 0;
if (p.sources.has("TEXCOORD1")) {
-
String uv2_source_id = p.sources["TEXCOORD1"].source;
uv2_ofs = p.sources["TEXCOORD1"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(uv2_source_id), ERR_INVALID_DATA);
uv2_src = &meshdata.sources[uv2_source_id];
}
- const Collada::MeshData::Source *color_src = NULL;
+ const Collada::MeshData::Source *color_src = nullptr;
int color_ofs = 0;
if (p.sources.has("COLOR")) {
-
String color_source_id = p.sources["COLOR"].source;
color_ofs = p.sources["COLOR"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(color_source_id), ERR_INVALID_DATA);
@@ -606,21 +563,18 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
/* ADD WEIGHTS IF EXIST */
/************************/
- Map<int, Vector<Collada::Vertex::Weight> > pre_weights;
+ Map<int, Vector<Collada::Vertex::Weight>> pre_weights;
bool has_weights = false;
if (p_skin_controller) {
-
- const Collada::SkinControllerData::Source *weight_src = NULL;
+ const Collada::SkinControllerData::Source *weight_src = nullptr;
int weight_ofs = 0;
if (p_skin_controller->weights.sources.has("WEIGHT")) {
-
String weight_id = p_skin_controller->weights.sources["WEIGHT"].source;
weight_ofs = p_skin_controller->weights.sources["WEIGHT"].offset;
if (p_skin_controller->sources.has(weight_id)) {
-
weight_src = &p_skin_controller->sources[weight_id];
}
}
@@ -628,7 +582,6 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
int joint_ofs = 0;
if (p_skin_controller->weights.sources.has("JOINT")) {
-
joint_ofs = p_skin_controller->weights.sources["JOINT"].offset;
}
@@ -637,13 +590,11 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
int index_ofs = 0;
int wstride = p_skin_controller->weights.sources.size();
for (int w_i = 0; w_i < p_skin_controller->weights.sets.size(); w_i++) {
-
int amount = p_skin_controller->weights.sets[w_i];
Vector<Collada::Vertex::Weight> weights;
for (int a_i = 0; a_i < amount; a_i++) {
-
Collada::Vertex::Weight w;
int read_from = index_ofs + a_i * wstride;
@@ -654,8 +605,9 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
w.weight = weight_src->array[weight_index];
int bone_index = p_skin_controller->weights.indices[read_from + joint_ofs];
- if (bone_index == -1)
+ if (bone_index == -1) {
continue; //ignore this weight (refers to bind shape)
+ }
ERR_FAIL_INDEX_V(bone_index, bone_remap.size(), ERR_INVALID_DATA);
w.bone_idx = bone_remap[bone_index];
@@ -674,11 +626,14 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
//make sure weights always add up to 1
float total = 0;
- for (int i = 0; i < weights.size(); i++)
+ for (int i = 0; i < weights.size(); i++) {
total += weights[i].weight;
- if (total)
- for (int i = 0; i < weights.size(); i++)
+ }
+ if (total) {
+ for (int i = 0; i < weights.size(); i++) {
weights.write[i].weight /= total;
+ }
+ }
if (weights.size() == 0 || total == 0) { //if nothing, add a weight to bone 0
//no weights assigned
@@ -713,10 +668,8 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
int _prim_ofs = 0;
int vertidx = 0;
for (int p_j = 0; p_j < p.count; p_j++) {
-
int amount;
if (p.polygons.size()) {
-
ERR_FAIL_INDEX_V(p_j, p.polygons.size(), ERR_INVALID_DATA);
amount = p.polygons[p_j];
} else {
@@ -728,15 +681,15 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
int prev2[2] = { 0, 0 };
for (int j = 0; j < amount; j++) {
-
int src = _prim_ofs;
//_prim_ofs+=p.sources.size()
ERR_FAIL_INDEX_V(src, p.indices.size(), ERR_INVALID_DATA);
Collada::Vertex vertex;
- if (!p_optimize)
+ if (!p_optimize) {
vertex.uid = vertidx++;
+ }
int vertex_index = p.indices[src + vertex_ofs]; //used for index field (later used by controllers)
int vertex_pos = (vertex_src->stride ? vertex_src->stride : 3) * vertex_index;
@@ -748,13 +701,11 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
}
if (normal_src) {
-
int normal_pos = (normal_src->stride ? normal_src->stride : 3) * p.indices[src + normal_ofs];
ERR_FAIL_INDEX_V(normal_pos, normal_src->array.size(), ERR_INVALID_DATA);
vertex.normal = Vector3(normal_src->array[normal_pos + 0], normal_src->array[normal_pos + 1], normal_src->array[normal_pos + 2]);
if (tangent_src && binormal_src) {
-
int binormal_pos = (binormal_src->stride ? binormal_src->stride : 3) * p.indices[src + binormal_ofs];
ERR_FAIL_INDEX_V(binormal_pos, binormal_src->array.size(), ERR_INVALID_DATA);
Vector3 binormal = Vector3(binormal_src->array[binormal_pos + 0], binormal_src->array[binormal_pos + 1], binormal_src->array[binormal_pos + 2]);
@@ -769,21 +720,18 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
}
if (uv_src) {
-
int uv_pos = (uv_src->stride ? uv_src->stride : 2) * p.indices[src + uv_ofs];
ERR_FAIL_INDEX_V(uv_pos, uv_src->array.size(), ERR_INVALID_DATA);
vertex.uv = Vector3(uv_src->array[uv_pos + 0], 1.0 - uv_src->array[uv_pos + 1], 0);
}
if (uv2_src) {
-
int uv2_pos = (uv2_src->stride ? uv2_src->stride : 2) * p.indices[src + uv2_ofs];
ERR_FAIL_INDEX_V(uv2_pos, uv2_src->array.size(), ERR_INVALID_DATA);
vertex.uv2 = Vector3(uv2_src->array[uv2_pos + 0], 1.0 - uv2_src->array[uv2_pos + 1], 0);
}
if (color_src) {
-
int color_pos = (color_src->stride ? color_src->stride : 3) * p.indices[src + color_ofs]; // colors are RGB in collada..
ERR_FAIL_INDEX_V(color_pos, color_src->array.size(), ERR_INVALID_DATA);
vertex.color = Color(color_src->array[color_pos + 0], color_src->array[color_pos + 1], color_src->array[color_pos + 2], (color_src->stride > 3) ? color_src->array[color_pos + 3] : 1.0);
@@ -791,7 +739,6 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
#ifndef NO_UP_AXIS_SWAP
if (collada.state.up_axis == Vector3::AXIS_Z) {
-
Vector3 bn = vertex.normal.cross(vertex.tangent.normal) * vertex.tangent.d;
SWAP(vertex.vertex.z, vertex.vertex.y);
@@ -813,23 +760,21 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
//COLLADA_PRINT("vertex: "+vertex.vertex);
if (vertex_set.has(vertex)) {
-
index = vertex_set.find(vertex)->get().idx;
} else {
-
index = vertex_set.size();
vertex.idx = index;
vertex_set.insert(vertex);
}
//build triangles if needed
- if (j == 0)
+ if (j == 0) {
prev2[0] = index;
+ }
if (j >= 2) {
//insert indices in reverse order (collada uses CCW as frontface)
if (local_xform_mirror) {
-
indices_list.push_back(prev2[0]);
indices_list.push_back(prev2[1]);
indices_list.push_back(index);
@@ -850,16 +795,13 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
vertex_array.resize(vertex_set.size());
for (Set<Collada::Vertex>::Element *F = vertex_set.front(); F; F = F->next()) {
-
vertex_array.write[F->get().idx] = F->get();
}
if (has_weights) {
-
//if skeleton, localize
Transform local_xform = p_local_xform;
for (int i = 0; i < vertex_array.size(); i++) {
-
vertex_array.write[i].vertex = local_xform.xform(vertex_array[i].vertex);
vertex_array.write[i].normal = local_xform.basis.xform(vertex_array[i].normal).normalized();
vertex_array.write[i].tangent.normal = local_xform.basis.xform(vertex_array[i].tangent.normal).normalized();
@@ -876,23 +818,23 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
/*****************/
{
-
- Ref<SpatialMaterial> material;
+ Ref<StandardMaterial3D> material;
{
-
if (p_material_map.has(p.material)) {
String target = p_material_map[p.material].target;
if (!material_cache.has(target)) {
Error err = _create_material(target);
- if (!err)
+ if (!err) {
material = material_cache[target];
- } else
+ }
+ } else {
material = material_cache[target];
+ }
} else if (p.material != "") {
- WARN_PRINTS("Collada: Unreferenced material in geometry instance: " + p.material);
+ WARN_PRINT("Collada: Unreferenced material in geometry instance: " + p.material);
}
}
@@ -920,16 +862,15 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
if (has_weights) {
Vector<float> weights;
Vector<int> bones;
- weights.resize(VS::ARRAY_WEIGHTS_SIZE);
- bones.resize(VS::ARRAY_WEIGHTS_SIZE);
+ weights.resize(RS::ARRAY_WEIGHTS_SIZE);
+ bones.resize(RS::ARRAY_WEIGHTS_SIZE);
//float sum=0.0;
- for (int l = 0; l < VS::ARRAY_WEIGHTS_SIZE; l++) {
+ for (int l = 0; l < RS::ARRAY_WEIGHTS_SIZE; l++) {
if (l < vertex_array[k].weights.size()) {
weights.write[l] = vertex_array[k].weights[l].weight;
bones.write[l] = vertex_array[k].weights[l].bone_idx;
//sum += vertex_array[k].weights[l].weight;
} else {
-
weights.write[l] = 0;
bones.write[l] = 0;
}
@@ -952,7 +893,6 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
}
if ((!binormal_src || !tangent_src) && normal_src && uv_src && force_make_tangents) {
-
surftool->generate_tangents();
}
@@ -961,7 +901,7 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
////////////////////////////
Array d = surftool->commit_to_arrays();
- d.resize(VS::ARRAY_MAX);
+ d.resize(RS::ARRAY_MAX);
Array mr;
@@ -970,7 +910,6 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
////////////////////////////
for (int mi = 0; mi < p_morph_meshes.size(); mi++) {
-
Array a = p_morph_meshes[mi]->surface_get_arrays(surface);
//add valid weight and bone arrays if they exist, TODO check if they are unique to shape (generally not)
@@ -984,7 +923,7 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
mr.push_back(a);
}
- p_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, d, mr, p_use_compression ? Mesh::ARRAY_COMPRESS_DEFAULT : 0);
+ p_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, d, mr, Dictionary(), p_use_compression ? Mesh::ARRAY_COMPRESS_DEFAULT : 0);
if (material.is_valid()) {
if (p_use_mesh_material) {
@@ -1005,21 +944,16 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
}
Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compression) {
-
if (p_node->type == Collada::Node::TYPE_GEOMETRY && node_map.has(p_node->id)) {
-
- Spatial *node = node_map[p_node->id].node;
+ Node3D *node = node_map[p_node->id].node;
Collada::NodeGeometry *ng = static_cast<Collada::NodeGeometry *>(p_node);
- if (Object::cast_to<Path>(node)) {
-
- Path *path = Object::cast_to<Path>(node);
+ if (Object::cast_to<Path3D>(node)) {
+ Path3D *path = Object::cast_to<Path3D>(node);
if (curve_cache.has(ng->source)) {
-
path->set_curve(curve_cache[ng->source]);
} else {
-
Ref<Curve3D> c = memnew(Curve3D);
const Collada::CurveData &cd = collada.state.curve_data_map[ng->source];
@@ -1045,20 +979,19 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
const Collada::CurveData::Source &interps = cd.sources[cd.control_vertices["INTERPOLATION"]];
ERR_FAIL_COND_V(interps.stride != 1, ERR_INVALID_DATA);
- const Collada::CurveData::Source *tilts = NULL;
- if (cd.control_vertices.has("TILT") && cd.sources.has(cd.control_vertices["TILT"]))
+ const Collada::CurveData::Source *tilts = nullptr;
+ if (cd.control_vertices.has("TILT") && cd.sources.has(cd.control_vertices["TILT"])) {
tilts = &cd.sources[cd.control_vertices["TILT"]];
+ }
int pc = vertices.array.size() / 3;
for (int i = 0; i < pc; i++) {
-
Vector3 pos(vertices.array[i * 3 + 0], vertices.array[i * 3 + 1], vertices.array[i * 3 + 2]);
Vector3 in(in_tangents.array[i * 3 + 0], in_tangents.array[i * 3 + 1], in_tangents.array[i * 3 + 2]);
Vector3 out(out_tangents.array[i * 3 + 0], out_tangents.array[i * 3 + 1], out_tangents.array[i * 3 + 2]);
#ifndef NO_UP_AXIS_SWAP
if (collada.state.up_axis == Vector3::AXIS_Z) {
-
SWAP(pos.y, pos.z);
pos.z = -pos.z;
SWAP(in.y, in.z);
@@ -1072,8 +1005,9 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
out *= collada.state.unit_scale;
c->add_point(pos, in - pos, out - pos);
- if (tilts)
+ if (tilts) {
c->set_point_tilt(i, tilts->array[i]);
+ }
}
curve_cache[ng->source] = c;
@@ -1081,27 +1015,24 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
}
}
- if (Object::cast_to<MeshInstance>(node)) {
-
+ if (Object::cast_to<MeshInstance3D>(node)) {
Collada::NodeGeometry *ng2 = static_cast<Collada::NodeGeometry *>(p_node);
- MeshInstance *mi = Object::cast_to<MeshInstance>(node);
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(node);
ERR_FAIL_COND_V(!mi, ERR_BUG);
- Collada::SkinControllerData *skin = NULL;
- Collada::MorphControllerData *morph = NULL;
+ Collada::SkinControllerData *skin = nullptr;
+ Collada::MorphControllerData *morph = nullptr;
String meshid;
Transform apply_xform;
Vector<int> bone_remap;
- Vector<Ref<ArrayMesh> > morphs;
+ Vector<Ref<ArrayMesh>> morphs;
if (ng2->controller) {
-
String ngsource = ng2->source;
if (collada.state.skin_controller_data_map.has(ngsource)) {
-
ERR_FAIL_COND_V(!collada.state.skin_controller_data_map.has(ngsource), ERR_INVALID_DATA);
skin = &collada.state.skin_controller_data_map[ngsource];
@@ -1112,7 +1043,7 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
String skname = skeletons[0];
ERR_FAIL_COND_V(!node_map.has(skname), ERR_INVALID_DATA);
NodeMap nmsk = node_map[skname];
- Skeleton *sk = Object::cast_to<Skeleton>(nmsk.node);
+ Skeleton3D *sk = Object::cast_to<Skeleton3D>(nmsk.node);
ERR_FAIL_COND_V(!sk, ERR_INVALID_DATA);
ERR_FAIL_COND_V(!skeleton_bone_map.has(sk), ERR_INVALID_DATA);
Map<String, int> &bone_remap_map = skeleton_bone_map[sk];
@@ -1145,7 +1076,6 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
bone_remap.resize(joint_src->sarray.size());
for (int i = 0; i < bone_remap.size(); i++) {
-
String str = joint_src->sarray[i];
ERR_FAIL_COND_V(!bone_remap_map.has(str), ERR_INVALID_DATA);
bone_remap.write[i] = bone_remap_map[str];
@@ -1153,7 +1083,6 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
}
if (collada.state.morph_controller_data_map.has(ngsource)) {
-
//it's a morph!!
morph = &collada.state.morph_controller_data_map[ngsource];
meshid = morph->mesh;
@@ -1165,13 +1094,12 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
valid = true;
Vector<String> names = morph->sources[target].sarray;
for (int i = 0; i < names.size(); i++) {
-
String meshid2 = names[i];
if (collada.state.mesh_data_map.has(meshid2)) {
Ref<ArrayMesh> mesh = Ref<ArrayMesh>(memnew(ArrayMesh));
const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid2];
mesh->set_name(meshdata.name);
- Error err = _create_mesh_surfaces(false, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, NULL, Vector<Ref<ArrayMesh> >(), false);
+ Error err = _create_mesh_surfaces(false, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, nullptr, Vector<Ref<ArrayMesh>>(), false);
ERR_FAIL_COND_V(err, err);
morphs.push_back(mesh);
@@ -1181,8 +1109,9 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
}
}
- if (!valid)
+ if (!valid) {
morphs.clear();
+ }
ngsource = "";
}
}
@@ -1209,19 +1138,16 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
mesh_cache[meshid] = mesh;
} else {
-
- WARN_PRINTS("Collada: Will not import geometry: " + meshid);
+ WARN_PRINT("Collada: Will not import geometry: " + meshid);
}
}
if (!mesh.is_null()) {
-
mi->set_mesh(mesh);
if (!use_mesh_builtin_materials) {
const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid];
for (int i = 0; i < meshdata.primitives.size(); i++) {
-
String matname = meshdata.primitives[i].material;
if (ng2->material_map.has(matname)) {
@@ -1230,14 +1156,16 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
Ref<Material> material;
if (!material_cache.has(target)) {
Error err = _create_material(target);
- if (!err)
+ if (!err) {
material = material_cache[target];
- } else
+ }
+ } else {
material = material_cache[target];
+ }
mi->set_surface_material(i, material);
} else if (matname != "") {
- WARN_PRINTS("Collada: Unreferenced material in geometry instance: " + matname);
+ WARN_PRINT("Collada: Unreferenced material in geometry instance: " + matname);
}
}
}
@@ -1246,16 +1174,15 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
}
for (int i = 0; i < p_node->children.size(); i++) {
-
Error err = _create_resources(p_node->children[i], p_use_compression);
- if (err)
+ if (err) {
return err;
+ }
}
return OK;
}
Error ColladaImport::load(const String &p_path, int p_flags, bool p_force_make_tangents, bool p_use_compression) {
-
Error err = collada.load(p_path, p_flags);
ERR_FAIL_COND_V_MSG(err, err, "Cannot load file '" + p_path + "'.");
@@ -1263,17 +1190,15 @@ Error ColladaImport::load(const String &p_path, int p_flags, bool p_force_make_t
ERR_FAIL_COND_V(!collada.state.visual_scene_map.has(collada.state.root_visual_scene), ERR_INVALID_DATA);
Collada::VisualScene &vs = collada.state.visual_scene_map[collada.state.root_visual_scene];
- scene = memnew(Spatial); // root
+ scene = memnew(Node3D); // root
//determine what's going on with the lights
for (int i = 0; i < vs.root_nodes.size(); i++) {
-
_pre_process_lights(vs.root_nodes[i]);
}
//import scene
for (int i = 0; i < vs.root_nodes.size(); i++) {
-
Error err2 = _create_scene_skeletons(vs.root_nodes[i]);
if (err2 != OK) {
memdelete(scene);
@@ -1282,7 +1207,6 @@ Error ColladaImport::load(const String &p_path, int p_flags, bool p_force_make_t
}
for (int i = 0; i < vs.root_nodes.size(); i++) {
-
Error err2 = _create_scene(vs.root_nodes[i], scene);
if (err2 != OK) {
memdelete(scene);
@@ -1303,48 +1227,36 @@ Error ColladaImport::load(const String &p_path, int p_flags, bool p_force_make_t
}
void ColladaImport::_fix_param_animation_tracks() {
-
for (Map<String, Collada::Node *>::Element *E = collada.state.scene_map.front(); E; E = E->next()) {
-
Collada::Node *n = E->get();
switch (n->type) {
-
case Collada::Node::TYPE_NODE: {
// ? do nothing
} break;
case Collada::Node::TYPE_JOINT: {
-
} break;
case Collada::Node::TYPE_SKELETON: {
-
} break;
case Collada::Node::TYPE_LIGHT: {
-
} break;
case Collada::Node::TYPE_CAMERA: {
-
} break;
case Collada::Node::TYPE_GEOMETRY: {
-
Collada::NodeGeometry *ng = static_cast<Collada::NodeGeometry *>(n);
// test source(s)
String source = ng->source;
while (source != "") {
-
if (collada.state.skin_controller_data_map.has(source)) {
-
const Collada::SkinControllerData &skin = collada.state.skin_controller_data_map[source];
//nothing to animate here i think
source = skin.base;
} else if (collada.state.morph_controller_data_map.has(source)) {
-
const Collada::MorphControllerData &morph = collada.state.morph_controller_data_map[source];
if (morph.targets.has("MORPH_WEIGHT") && morph.targets.has("MORPH_TARGET")) {
-
String weights = morph.targets["MORPH_WEIGHT"];
String targets = morph.targets["MORPH_TARGET"];
//fails here
@@ -1356,11 +1268,9 @@ void ColladaImport::_fix_param_animation_tracks() {
ERR_FAIL_COND(weight_src.array.size() != target_src.sarray.size());
for (int i = 0; i < weight_src.array.size(); i++) {
-
String track_name = weights + "(" + itos(i) + ")";
String mesh_name = target_src.sarray[i];
if (collada.state.mesh_name_map.has(mesh_name) && collada.state.referenced_tracks.has(track_name)) {
-
const Vector<int> &rt = collada.state.referenced_tracks[track_name];
for (int rti = 0; rti < rt.size(); rti++) {
@@ -1377,7 +1287,6 @@ void ColladaImport::_fix_param_animation_tracks() {
}
source = morph.mesh;
} else {
-
source = ""; // for now nothing else supported
}
}
@@ -1388,27 +1297,23 @@ void ColladaImport::_fix_param_animation_tracks() {
}
void ColladaImport::create_animations(bool p_make_tracks_in_all_bones, bool p_import_value_tracks) {
-
_fix_param_animation_tracks();
for (int i = 0; i < collada.state.animation_clips.size(); i++) {
-
- for (int j = 0; j < collada.state.animation_clips[i].tracks.size(); j++)
+ for (int j = 0; j < collada.state.animation_clips[i].tracks.size(); j++) {
tracks_in_clips.insert(collada.state.animation_clips[i].tracks[j]);
+ }
}
for (int i = 0; i < collada.state.animation_tracks.size(); i++) {
-
const Collada::AnimationTrack &at = collada.state.animation_tracks[i];
String node;
if (!node_map.has(at.target)) {
-
if (node_name_map.has(at.target)) {
-
node = node_name_map[at.target];
} else {
- WARN_PRINTS("Collada: Couldn't find node: " + at.target);
+ WARN_PRINT("Collada: Couldn't find node: " + at.target);
continue;
}
} else {
@@ -1416,23 +1321,21 @@ void ColladaImport::create_animations(bool p_make_tracks_in_all_bones, bool p_im
}
if (at.property) {
-
valid_animated_properties.push_back(i);
} else {
-
node_map[node].anim_tracks.push_back(i);
valid_animated_nodes.insert(node);
}
}
create_animation(-1, p_make_tracks_in_all_bones, p_import_value_tracks);
- for (int i = 0; i < collada.state.animation_clips.size(); i++)
+ for (int i = 0; i < collada.state.animation_clips.size(); i++) {
create_animation(i, p_make_tracks_in_all_bones, p_import_value_tracks);
+ }
}
void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones, bool p_import_value_tracks) {
-
Ref<Animation> animation = Ref<Animation>(memnew(Animation));
if (p_clip == -1) {
@@ -1442,9 +1345,9 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
}
for (Map<String, NodeMap>::Element *E = node_map.front(); E; E = E->next()) {
-
- if (E->get().bone < 0)
+ if (E->get().bone < 0) {
continue;
+ }
bones_with_animation[E->key()] = false;
}
//store and validate tracks
@@ -1456,15 +1359,11 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
Set<int> track_filter;
if (p_clip == -1) {
-
for (int i = 0; i < collada.state.animation_clips.size(); i++) {
-
int tc = collada.state.animation_clips[i].tracks.size();
for (int j = 0; j < tc; j++) {
-
String n = collada.state.animation_clips[i].tracks[j];
if (collada.state.by_id_tracks.has(n)) {
-
const Vector<int> &ti = collada.state.by_id_tracks[n];
for (int k = 0; k < ti.size(); k++) {
track_filter.insert(ti[k]);
@@ -1473,13 +1372,10 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
}
}
} else {
-
int tc = collada.state.animation_clips[p_clip].tracks.size();
for (int j = 0; j < tc; j++) {
-
String n = collada.state.animation_clips[p_clip].tracks[j];
if (collada.state.by_id_tracks.has(n)) {
-
const Vector<int> &ti = collada.state.by_id_tracks[n];
for (int k = 0; k < ti.size(); k++) {
track_filter.insert(ti[k]);
@@ -1497,11 +1393,11 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
float snapshot_interval = 1.0 / bake_fps; //should be customizable somewhere...
float anim_length = collada.state.animation_length;
- if (p_clip >= 0 && collada.state.animation_clips[p_clip].end)
+ if (p_clip >= 0 && collada.state.animation_clips[p_clip].end) {
anim_length = collada.state.animation_clips[p_clip].end;
+ }
while (f < anim_length) {
-
base_snapshots.push_back(f);
f += snapshot_interval;
@@ -1516,11 +1412,9 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
bool tracks_found = false;
for (Set<String>::Element *E = valid_animated_nodes.front(); E; E = E->next()) {
-
// take snapshots
if (!collada.state.scene_map.has(E->get())) {
-
continue;
}
@@ -1528,7 +1422,7 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
String path = scene->get_path_to(nm.node);
if (nm.bone >= 0) {
- Skeleton *sk = static_cast<Skeleton *>(nm.node);
+ Skeleton3D *sk = static_cast<Skeleton3D *>(nm.node);
String name = sk->get_bone_name(nm.bone);
path = path + ":" + name;
}
@@ -1537,7 +1431,6 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
Collada::Node *cn = collada.state.scene_map[E->get()];
if (cn->ignore_anim) {
-
continue;
}
@@ -1552,25 +1445,23 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
//use snapshot keys from anim track instead, because this was most likely exported baked
const Collada::AnimationTrack &at = collada.state.animation_tracks[nm.anim_tracks.front()->get()];
snapshots.clear();
- for (int i = 0; i < at.keys.size(); i++)
+ for (int i = 0; i < at.keys.size(); i++) {
snapshots.push_back(at.keys[i].time);
+ }
}
for (int i = 0; i < snapshots.size(); i++) {
-
for (List<int>::Element *ET = nm.anim_tracks.front(); ET; ET = ET->next()) {
//apply tracks
if (p_clip == -1) {
-
if (track_filter.has(ET->get())) {
-
continue;
}
} else {
-
- if (!track_filter.has(ET->get()))
+ if (!track_filter.has(ET->get())) {
continue;
+ }
}
found_anim = true;
@@ -1579,16 +1470,14 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
int xform_idx = -1;
for (int j = 0; j < cn->xform_list.size(); j++) {
-
if (cn->xform_list[j].id == at.param) {
-
xform_idx = j;
break;
}
}
if (xform_idx == -1) {
- WARN_PRINTS("Collada: Couldn't find matching node " + at.target + " xform for track " + at.param + ".");
+ WARN_PRINT("Collada: Couldn't find matching node " + at.target + " xform for track " + at.param + ".");
continue;
}
@@ -1619,12 +1508,10 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
if (nm.bone >= 0) {
//make bone transform relative to rest (in case of skeleton)
- Skeleton *sk = Object::cast_to<Skeleton>(nm.node);
+ Skeleton3D *sk = Object::cast_to<Skeleton3D>(nm.node);
if (sk) {
-
xform = sk->get_bone_rest(nm.bone).affine_inverse() * xform;
} else {
-
ERR_PRINT("Collada: Invalid skeleton");
}
}
@@ -1638,35 +1525,35 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
}
if (nm.bone >= 0) {
- if (found_anim)
+ if (found_anim) {
bones_with_animation[E->get()] = true;
+ }
}
- if (found_anim)
+ if (found_anim) {
tracks_found = true;
- else {
+ } else {
animation->remove_track(track);
}
}
if (p_make_tracks_in_all_bones) {
-
//some bones may lack animation, but since we don't store pose as a property, we must add keyframes!
for (Map<String, bool>::Element *E = bones_with_animation.front(); E; E = E->next()) {
-
- if (E->get())
+ if (E->get()) {
continue;
+ }
NodeMap &nm = node_map[E->key()];
String path = scene->get_path_to(nm.node);
ERR_CONTINUE(nm.bone < 0);
- Skeleton *sk = static_cast<Skeleton *>(nm.node);
+ Skeleton3D *sk = static_cast<Skeleton3D *>(nm.node);
String name = sk->get_bone_name(nm.bone);
path = path + ":" + name;
Collada::Node *cn = collada.state.scene_map[E->key()];
if (cn->ignore_anim) {
- WARN_PRINTS("Collada: Ignoring animation on node: " + path);
+ WARN_PRINT("Collada: Ignoring animation on node: " + path);
continue;
}
@@ -1693,24 +1580,24 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
if (p_import_value_tracks) {
for (int i = 0; i < valid_animated_properties.size(); i++) {
-
int ti = valid_animated_properties[i];
if (p_clip == -1) {
-
- if (track_filter.has(ti))
+ if (track_filter.has(ti)) {
continue;
+ }
} else {
-
- if (!track_filter.has(ti))
+ if (!track_filter.has(ti)) {
continue;
+ }
}
const Collada::AnimationTrack &at = collada.state.animation_tracks[ti];
// take snapshots
- if (!collada.state.scene_map.has(at.target))
+ if (!collada.state.scene_map.has(at.target)) {
continue;
+ }
NodeMap &nm = node_map[at.target];
String path = scene->get_path_to(nm.node);
@@ -1723,7 +1610,6 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
animation->track_set_imported(track, true); //helps merging later
for (int j = 0; j < at.keys.size(); j++) {
-
float time = at.keys[j].time;
Variant value;
Vector<float> data = at.keys[j].data;
@@ -1735,7 +1621,7 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
//matrix
WARN_PRINT("Collada: Value keys for matrices not supported.");
} else {
- WARN_PRINTS("Collada: Unexpected amount of value keys: " + itos(data.size()));
+ WARN_PRINT("Collada: Unexpected amount of value keys: " + itos(data.size()));
}
animation->track_insert_key(track, time, value);
@@ -1746,7 +1632,6 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
}
if (tracks_found) {
-
animations.push_back(animation);
}
}
@@ -1756,37 +1641,35 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
/*********************************************************************************/
uint32_t EditorSceneImporterCollada::get_import_flags() const {
-
return IMPORT_SCENE | IMPORT_ANIMATION;
}
-void EditorSceneImporterCollada::get_extensions(List<String> *r_extensions) const {
+void EditorSceneImporterCollada::get_extensions(List<String> *r_extensions) const {
r_extensions->push_back("dae");
}
-Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
+Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
ColladaImport state;
uint32_t flags = Collada::IMPORT_FLAG_SCENE;
- if (p_flags & IMPORT_ANIMATION)
+ if (p_flags & IMPORT_ANIMATION) {
flags |= Collada::IMPORT_FLAG_ANIMATION;
+ }
state.use_mesh_builtin_materials = !(p_flags & IMPORT_MATERIALS_IN_INSTANCES);
state.bake_fps = p_bake_fps;
Error err = state.load(p_path, flags, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS, p_flags & EditorSceneImporter::IMPORT_USE_COMPRESSION);
- ERR_FAIL_COND_V_MSG(err != OK, NULL, "Cannot load scene from file '" + p_path + "'.");
+ ERR_FAIL_COND_V_MSG(err != OK, nullptr, "Cannot load scene from file '" + p_path + "'.");
if (state.missing_textures.size()) {
-
/*
- for(int i=0;i<state.missing_textures.size();i++) {
- EditorNode::add_io_error("Texture Not Found: "+state.missing_textures[i]);
- }
- */
+ for(int i=0;i<state.missing_textures.size();i++) {
+ EditorNode::add_io_error("Texture Not Found: "+state.missing_textures[i]);
+ }
+ */
if (r_missing_deps) {
-
for (int i = 0; i < state.missing_textures.size(); i++) {
//EditorNode::add_io_error("Texture Not Found: "+state.missing_textures[i]);
r_missing_deps->push_back(state.missing_textures[i]);
@@ -1795,18 +1678,17 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_
}
if (p_flags & IMPORT_ANIMATION) {
-
state.create_animations(p_flags & IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS, p_flags & EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS);
AnimationPlayer *ap = memnew(AnimationPlayer);
for (int i = 0; i < state.animations.size(); i++) {
String name;
- if (state.animations[i]->get_name() == "")
+ if (state.animations[i]->get_name() == "") {
name = "default";
- else
+ } else {
name = state.animations[i]->get_name();
+ }
if (p_flags & IMPORT_ANIMATION_DETECT_LOOP) {
-
if (name.begins_with("loop") || name.ends_with("loop") || name.begins_with("cycle") || name.ends_with("cycle")) {
state.animations.write[i]->set_loop(true);
}
@@ -1822,7 +1704,6 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_
}
Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
-
ColladaImport state;
state.use_mesh_builtin_materials = false;
@@ -1831,15 +1712,16 @@ Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path
ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot load animation from file '" + p_path + "'.");
state.create_animations(p_flags & EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS, p_flags & EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS);
- if (state.scene)
+ if (state.scene) {
memdelete(state.scene);
+ }
- if (state.animations.size() == 0)
+ if (state.animations.size() == 0) {
return Ref<Animation>();
+ }
Ref<Animation> anim = state.animations[0];
String base = p_path.get_basename().to_lower();
if (p_flags & IMPORT_ANIMATION_DETECT_LOOP) {
-
if (base.begins_with("loop") || base.ends_with("loop") || base.begins_with("cycle") || base.ends_with("cycle")) {
anim->set_loop(true);
}
diff --git a/editor/import/editor_import_collada.h b/editor/import/editor_import_collada.h
index 822a6450be..5fa17ebd02 100644
--- a/editor/import/editor_import_collada.h
+++ b/editor/import/editor_import_collada.h
@@ -34,14 +34,13 @@
#include "editor/import/resource_importer_scene.h"
class EditorSceneImporterCollada : public EditorSceneImporter {
-
GDCLASS(EditorSceneImporterCollada, EditorSceneImporter);
public:
- virtual uint32_t get_import_flags() const;
- virtual void get_extensions(List<String> *r_extensions) const;
- virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps = NULL, Error *r_err = NULL);
- virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps);
+ virtual uint32_t get_import_flags() const override;
+ virtual void get_extensions(List<String> *r_extensions) const override;
+ virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps = nullptr, Error *r_err = nullptr) override;
+ virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) override;
EditorSceneImporterCollada();
};
diff --git a/editor/import/editor_import_plugin.cpp b/editor/import/editor_import_plugin.cpp
index 53a654c971..6d46d4d2e9 100644
--- a/editor/import/editor_import_plugin.cpp
+++ b/editor/import/editor_import_plugin.cpp
@@ -87,7 +87,6 @@ int EditorImportPlugin::get_import_order() const {
}
void EditorImportPlugin::get_import_options(List<ResourceImporter::ImportOption> *r_options, int p_preset) const {
-
ERR_FAIL_COND(!(get_script_instance() && get_script_instance()->has_method("get_import_options")));
Array needed;
needed.push_back("name");
@@ -131,7 +130,6 @@ bool EditorImportPlugin::get_option_visibility(const String &p_option, const Map
}
Error EditorImportPlugin::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("import")), ERR_UNAVAILABLE);
Dictionary options;
Array platform_variants, gen_files;
@@ -153,7 +151,6 @@ Error EditorImportPlugin::import(const String &p_source_file, const String &p_sa
}
void EditorImportPlugin::_bind_methods() {
-
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_importer_name"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_visible_name"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "get_preset_count"));
@@ -162,7 +159,7 @@ void EditorImportPlugin::_bind_methods() {
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_import_options", PropertyInfo(Variant::INT, "preset")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_save_extension"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_resource_type"));
- ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::REAL, "get_priority"));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::FLOAT, "get_priority"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "get_import_order"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "get_option_visibility", PropertyInfo(Variant::STRING, "option"), PropertyInfo(Variant::DICTIONARY, "options")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "import", PropertyInfo(Variant::STRING, "source_file"), PropertyInfo(Variant::STRING, "save_path"), PropertyInfo(Variant::DICTIONARY, "options"), PropertyInfo(Variant::ARRAY, "platform_variants"), PropertyInfo(Variant::ARRAY, "gen_files")));
diff --git a/editor/import/editor_import_plugin.h b/editor/import/editor_import_plugin.h
index 4383b1b084..00a7d9efba 100644
--- a/editor/import/editor_import_plugin.h
+++ b/editor/import/editor_import_plugin.h
@@ -41,18 +41,18 @@ protected:
public:
EditorImportPlugin();
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_preset_name(int p_idx) const;
- virtual int get_preset_count() const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
- virtual float get_priority() const;
- virtual int get_import_order() const;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata = NULL);
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_preset_name(int p_idx) const override;
+ virtual int get_preset_count() const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
+ virtual float get_priority() const override;
+ virtual int get_import_order() const override;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata = nullptr) override;
};
#endif //EDITOR_IMPORT_PLUGIN_H
diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp
index 2f9135c52c..bb144d2ed6 100644
--- a/editor/import/editor_scene_importer_gltf.cpp
+++ b/editor/import/editor_scene_importer_gltf.cpp
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "editor_scene_importer_gltf.h"
+
#include "core/crypto/crypto_core.h"
#include "core/io/json.h"
#include "core/math/disjoint_set.h"
@@ -36,24 +37,22 @@
#include "core/os/file_access.h"
#include "core/os/os.h"
#include "modules/regex/regex.h"
-#include "scene/3d/bone_attachment.h"
-#include "scene/3d/camera.h"
-#include "scene/3d/mesh_instance.h"
+#include "scene/3d/bone_attachment_3d.h"
+#include "scene/3d/camera_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
#include "scene/animation/animation_player.h"
#include "scene/resources/surface_tool.h"
uint32_t EditorSceneImporterGLTF::get_import_flags() const {
-
return IMPORT_SCENE | IMPORT_ANIMATION;
}
-void EditorSceneImporterGLTF::get_extensions(List<String> *r_extensions) const {
+void EditorSceneImporterGLTF::get_extensions(List<String> *r_extensions) const {
r_extensions->push_back("gltf");
r_extensions->push_back("glb");
}
Error EditorSceneImporterGLTF::_parse_json(const String &p_path, GLTFState &state) {
-
Error err;
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ, &err);
if (!f) {
@@ -80,7 +79,6 @@ Error EditorSceneImporterGLTF::_parse_json(const String &p_path, GLTFState &stat
}
Error EditorSceneImporterGLTF::_parse_glb(const String &p_path, GLTFState &state) {
-
Error err;
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ, &err);
if (!f) {
@@ -162,7 +160,6 @@ String EditorSceneImporterGLTF::_sanitize_scene_name(const String &name) {
}
String EditorSceneImporterGLTF::_gen_unique_name(GLTFState &state, const String &p_name) {
-
const String s_name = _sanitize_scene_name(p_name);
String name;
@@ -203,7 +200,6 @@ String EditorSceneImporterGLTF::_sanitize_bone_name(const String &name) {
}
String EditorSceneImporterGLTF::_gen_unique_bone_name(GLTFState &state, const GLTFSkeletonIndex skel_i, const String &p_name) {
-
const String s_name = _sanitize_bone_name(p_name);
String name;
@@ -226,14 +222,13 @@ String EditorSceneImporterGLTF::_gen_unique_bone_name(GLTFState &state, const GL
}
Error EditorSceneImporterGLTF::_parse_scenes(GLTFState &state) {
-
ERR_FAIL_COND_V(!state.json.has("scenes"), ERR_FILE_CORRUPT);
const Array &scenes = state.json["scenes"];
int loaded_scene = 0;
if (state.json.has("scene")) {
loaded_scene = state.json["scene"];
} else {
- WARN_PRINT("The load-time scene is not defined in the glTF2 file. Picking the first scene.")
+ WARN_PRINT("The load-time scene is not defined in the glTF2 file. Picking the first scene.");
}
if (scenes.size()) {
@@ -256,11 +251,9 @@ Error EditorSceneImporterGLTF::_parse_scenes(GLTFState &state) {
}
Error EditorSceneImporterGLTF::_parse_nodes(GLTFState &state) {
-
ERR_FAIL_COND_V(!state.json.has("nodes"), ERR_FILE_CORRUPT);
const Array &nodes = state.json["nodes"];
for (int i = 0; i < nodes.size(); i++) {
-
GLTFNode *node = memnew(GLTFNode);
const Dictionary &n = nodes[i];
@@ -280,7 +273,6 @@ Error EditorSceneImporterGLTF::_parse_nodes(GLTFState &state) {
node->xform = _arr_to_xform(n["matrix"]);
} else {
-
if (n.has("translation")) {
node->translation = _arr_to_vec3(n["translation"]);
}
@@ -294,7 +286,16 @@ Error EditorSceneImporterGLTF::_parse_nodes(GLTFState &state) {
node->xform.basis.set_quat_scale(node->rotation, node->scale);
node->xform.origin = node->translation;
}
-
+ if (n.has("extensions")) {
+ Dictionary extensions = n["extensions"];
+ if (extensions.has("KHR_lights_punctual")) {
+ Dictionary lights_punctual = extensions["KHR_lights_punctual"];
+ if (lights_punctual.has("light")) {
+ GLTFLightIndex light = lights_punctual["light"];
+ node->light = light;
+ }
+ }
+ }
if (n.has("children")) {
const Array &children = n["children"];
for (int j = 0; j < children.size(); j++) {
@@ -307,7 +308,6 @@ Error EditorSceneImporterGLTF::_parse_nodes(GLTFState &state) {
// build the hierarchy
for (GLTFNodeIndex node_i = 0; node_i < state.nodes.size(); node_i++) {
-
for (int j = 0; j < state.nodes[node_i]->children.size(); j++) {
GLTFNodeIndex child_i = state.nodes[node_i]->children[j];
@@ -324,7 +324,6 @@ Error EditorSceneImporterGLTF::_parse_nodes(GLTFState &state) {
}
void EditorSceneImporterGLTF::_compute_node_heights(GLTFState &state) {
-
state.root_nodes.clear();
for (GLTFNodeIndex node_i = 0; node_i < state.nodes.size(); ++node_i) {
GLTFNode *node = state.nodes[node_i];
@@ -346,7 +345,6 @@ void EditorSceneImporterGLTF::_compute_node_heights(GLTFState &state) {
}
static Vector<uint8_t> _parse_base64_uri(const String &uri) {
-
int start = uri.find(",");
ERR_FAIL_COND_V(start == -1, Vector<uint8_t>());
@@ -366,20 +364,18 @@ static Vector<uint8_t> _parse_base64_uri(const String &uri) {
}
Error EditorSceneImporterGLTF::_parse_buffers(GLTFState &state, const String &p_base_path) {
-
- if (!state.json.has("buffers"))
+ if (!state.json.has("buffers")) {
return OK;
+ }
const Array &buffers = state.json["buffers"];
for (GLTFBufferIndex i = 0; i < buffers.size(); i++) {
-
if (i == 0 && state.glb_data.size()) {
state.buffers.push_back(state.glb_data);
} else {
const Dictionary &buffer = buffers[i];
if (buffer.has("uri")) {
-
Vector<uint8_t> buffer_data;
String uri = buffer["uri"];
@@ -387,7 +383,6 @@ Error EditorSceneImporterGLTF::_parse_buffers(GLTFState &state, const String &p_
//embedded data
buffer_data = _parse_base64_uri(uri);
} else {
-
uri = p_base_path.plus_file(uri).replace("\\", "/"); //fix for windows
buffer_data = FileAccess::get_file_as_array(uri);
ERR_FAIL_COND_V(buffer.size() == 0, ERR_PARSE_ERROR);
@@ -407,11 +402,9 @@ Error EditorSceneImporterGLTF::_parse_buffers(GLTFState &state, const String &p_
}
Error EditorSceneImporterGLTF::_parse_buffer_views(GLTFState &state) {
-
ERR_FAIL_COND_V(!state.json.has("bufferViews"), ERR_FILE_CORRUPT);
const Array &buffers = state.json["bufferViews"];
for (GLTFBufferViewIndex i = 0; i < buffers.size(); i++) {
-
const Dictionary &d = buffers[i];
GLTFBufferView buffer_view;
@@ -443,33 +436,37 @@ Error EditorSceneImporterGLTF::_parse_buffer_views(GLTFState &state) {
}
EditorSceneImporterGLTF::GLTFType EditorSceneImporterGLTF::_get_type_from_str(const String &p_string) {
-
- if (p_string == "SCALAR")
+ if (p_string == "SCALAR") {
return TYPE_SCALAR;
+ }
- if (p_string == "VEC2")
+ if (p_string == "VEC2") {
return TYPE_VEC2;
- if (p_string == "VEC3")
+ }
+ if (p_string == "VEC3") {
return TYPE_VEC3;
- if (p_string == "VEC4")
+ }
+ if (p_string == "VEC4") {
return TYPE_VEC4;
+ }
- if (p_string == "MAT2")
+ if (p_string == "MAT2") {
return TYPE_MAT2;
- if (p_string == "MAT3")
+ }
+ if (p_string == "MAT3") {
return TYPE_MAT3;
- if (p_string == "MAT4")
+ }
+ if (p_string == "MAT4") {
return TYPE_MAT4;
+ }
ERR_FAIL_V(TYPE_SCALAR);
}
Error EditorSceneImporterGLTF::_parse_accessors(GLTFState &state) {
-
ERR_FAIL_COND_V(!state.json.has("accessors"), ERR_FILE_CORRUPT);
const Array &accessors = state.json["accessors"];
for (GLTFAccessorIndex i = 0; i < accessors.size(); i++) {
-
const Dictionary &d = accessors[i];
GLTFAccessor accessor;
@@ -535,21 +532,25 @@ Error EditorSceneImporterGLTF::_parse_accessors(GLTFState &state) {
}
String EditorSceneImporterGLTF::_get_component_type_name(const uint32_t p_component) {
-
switch (p_component) {
- case COMPONENT_TYPE_BYTE: return "Byte";
- case COMPONENT_TYPE_UNSIGNED_BYTE: return "UByte";
- case COMPONENT_TYPE_SHORT: return "Short";
- case COMPONENT_TYPE_UNSIGNED_SHORT: return "UShort";
- case COMPONENT_TYPE_INT: return "Int";
- case COMPONENT_TYPE_FLOAT: return "Float";
+ case COMPONENT_TYPE_BYTE:
+ return "Byte";
+ case COMPONENT_TYPE_UNSIGNED_BYTE:
+ return "UByte";
+ case COMPONENT_TYPE_SHORT:
+ return "Short";
+ case COMPONENT_TYPE_UNSIGNED_SHORT:
+ return "UShort";
+ case COMPONENT_TYPE_INT:
+ return "Int";
+ case COMPONENT_TYPE_FLOAT:
+ return "Float";
}
return "<Error>";
}
String EditorSceneImporterGLTF::_get_type_name(const GLTFType p_component) {
-
static const char *names[] = {
"float",
"vec2",
@@ -564,7 +565,6 @@ String EditorSceneImporterGLTF::_get_type_name(const GLTFType p_component) {
}
Error EditorSceneImporterGLTF::_decode_buffer_view(GLTFState &state, double *dst, const GLTFBufferViewIndex p_buffer_view, const int skip_every, const int skip_bytes, const int element_size, const int count, const GLTFType type, const int component_count, const int component_type, const int component_size, const bool normalized, const int byte_offset, const bool for_vertex) {
-
const GLTFBufferView &bv = state.buffer_views[p_buffer_view];
int stride = bv.byte_stride ? bv.byte_stride : element_size;
@@ -590,11 +590,9 @@ Error EditorSceneImporterGLTF::_decode_buffer_view(GLTFState &state, double *dst
//fill everything as doubles
for (int i = 0; i < count; i++) {
-
const uint8_t *src = &bufptr[offset + i * stride];
for (int j = 0; j < component_count; j++) {
-
if (skip_every && j > 0 && (j % skip_every) == 0) {
src += skip_bytes;
}
@@ -652,14 +650,25 @@ Error EditorSceneImporterGLTF::_decode_buffer_view(GLTFState &state, double *dst
}
int EditorSceneImporterGLTF::_get_component_type_size(const int component_type) {
-
switch (component_type) {
- case COMPONENT_TYPE_BYTE: return 1; break;
- case COMPONENT_TYPE_UNSIGNED_BYTE: return 1; break;
- case COMPONENT_TYPE_SHORT: return 2; break;
- case COMPONENT_TYPE_UNSIGNED_SHORT: return 2; break;
- case COMPONENT_TYPE_INT: return 4; break;
- case COMPONENT_TYPE_FLOAT: return 4; break;
+ case COMPONENT_TYPE_BYTE:
+ return 1;
+ break;
+ case COMPONENT_TYPE_UNSIGNED_BYTE:
+ return 1;
+ break;
+ case COMPONENT_TYPE_SHORT:
+ return 2;
+ break;
+ case COMPONENT_TYPE_UNSIGNED_SHORT:
+ return 2;
+ break;
+ case COMPONENT_TYPE_INT:
+ return 4;
+ break;
+ case COMPONENT_TYPE_FLOAT:
+ return 4;
+ break;
default: {
ERR_FAIL_V(0);
}
@@ -668,7 +677,6 @@ int EditorSceneImporterGLTF::_get_component_type_size(const int component_type)
}
Vector<double> EditorSceneImporterGLTF::_decode_accessor(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
//spec, for reference:
//https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment
@@ -691,7 +699,6 @@ Vector<double> EditorSceneImporterGLTF::_decode_accessor(GLTFState &state, const
switch (a.component_type) {
case COMPONENT_TYPE_BYTE:
case COMPONENT_TYPE_UNSIGNED_BYTE: {
-
if (a.type == TYPE_MAT2) {
skip_every = 2;
skip_bytes = 2;
@@ -721,12 +728,12 @@ Vector<double> EditorSceneImporterGLTF::_decode_accessor(GLTFState &state, const
double *dst = dst_buffer.ptrw();
if (a.buffer_view >= 0) {
-
ERR_FAIL_INDEX_V(a.buffer_view, state.buffer_views.size(), Vector<double>());
const Error err = _decode_buffer_view(state, dst, a.buffer_view, skip_every, skip_bytes, element_size, a.count, a.type, component_count, a.component_type, component_size, a.normalized, a.byte_offset, p_for_vertex);
- if (err != OK)
+ if (err != OK) {
return Vector<double>();
+ }
} else {
//fill with zeros, as bufferview is not defined.
@@ -742,14 +749,16 @@ Vector<double> EditorSceneImporterGLTF::_decode_accessor(GLTFState &state, const
const int indices_component_size = _get_component_type_size(a.sparse_indices_component_type);
Error err = _decode_buffer_view(state, indices.ptrw(), a.sparse_indices_buffer_view, 0, 0, indices_component_size, a.sparse_count, TYPE_SCALAR, 1, a.sparse_indices_component_type, indices_component_size, false, a.sparse_indices_byte_offset, false);
- if (err != OK)
+ if (err != OK) {
return Vector<double>();
+ }
Vector<double> data;
data.resize(component_count * a.sparse_count);
err = _decode_buffer_view(state, data.ptrw(), a.sparse_values_buffer_view, skip_every, skip_bytes, element_size, a.sparse_count, a.type, component_count, a.component_type, component_size, a.normalized, a.sparse_values_byte_offset, p_for_vertex);
- if (err != OK)
+ if (err != OK) {
return Vector<double>();
+ }
for (int i = 0; i < indices.size(); i++) {
const int write_offset = int(indices[i]) * component_count;
@@ -763,19 +772,19 @@ Vector<double> EditorSceneImporterGLTF::_decode_accessor(GLTFState &state, const
return dst_buffer;
}
-PoolVector<int> EditorSceneImporterGLTF::_decode_accessor_as_ints(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
+Vector<int> EditorSceneImporterGLTF::_decode_accessor_as_ints(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
- PoolVector<int> ret;
+ Vector<int> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
const double *attribs_ptr = attribs.ptr();
const int ret_size = attribs.size();
ret.resize(ret_size);
{
- PoolVector<int>::Write w = ret.write();
+ int *w = ret.ptrw();
for (int i = 0; i < ret_size; i++) {
w[i] = int(attribs_ptr[i]);
}
@@ -783,19 +792,19 @@ PoolVector<int> EditorSceneImporterGLTF::_decode_accessor_as_ints(GLTFState &sta
return ret;
}
-PoolVector<float> EditorSceneImporterGLTF::_decode_accessor_as_floats(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
+Vector<float> EditorSceneImporterGLTF::_decode_accessor_as_floats(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
- PoolVector<float> ret;
+ Vector<float> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
const double *attribs_ptr = attribs.ptr();
const int ret_size = attribs.size();
ret.resize(ret_size);
{
- PoolVector<float>::Write w = ret.write();
+ float *w = ret.ptrw();
for (int i = 0; i < ret_size; i++) {
w[i] = float(attribs_ptr[i]);
}
@@ -803,20 +812,20 @@ PoolVector<float> EditorSceneImporterGLTF::_decode_accessor_as_floats(GLTFState
return ret;
}
-PoolVector<Vector2> EditorSceneImporterGLTF::_decode_accessor_as_vec2(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
+Vector<Vector2> EditorSceneImporterGLTF::_decode_accessor_as_vec2(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
- PoolVector<Vector2> ret;
+ Vector<Vector2> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
ERR_FAIL_COND_V(attribs.size() % 2 != 0, ret);
const double *attribs_ptr = attribs.ptr();
const int ret_size = attribs.size() / 2;
ret.resize(ret_size);
{
- PoolVector<Vector2>::Write w = ret.write();
+ Vector2 *w = ret.ptrw();
for (int i = 0; i < ret_size; i++) {
w[i] = Vector2(attribs_ptr[i * 2 + 0], attribs_ptr[i * 2 + 1]);
}
@@ -824,20 +833,20 @@ PoolVector<Vector2> EditorSceneImporterGLTF::_decode_accessor_as_vec2(GLTFState
return ret;
}
-PoolVector<Vector3> EditorSceneImporterGLTF::_decode_accessor_as_vec3(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
+Vector<Vector3> EditorSceneImporterGLTF::_decode_accessor_as_vec3(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
- PoolVector<Vector3> ret;
+ Vector<Vector3> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
ERR_FAIL_COND_V(attribs.size() % 3 != 0, ret);
const double *attribs_ptr = attribs.ptr();
const int ret_size = attribs.size() / 3;
ret.resize(ret_size);
{
- PoolVector<Vector3>::Write w = ret.write();
+ Vector3 *w = ret.ptrw();
for (int i = 0; i < ret_size; i++) {
w[i] = Vector3(attribs_ptr[i * 3 + 0], attribs_ptr[i * 3 + 1], attribs_ptr[i * 3 + 2]);
}
@@ -845,13 +854,13 @@ PoolVector<Vector3> EditorSceneImporterGLTF::_decode_accessor_as_vec3(GLTFState
return ret;
}
-PoolVector<Color> EditorSceneImporterGLTF::_decode_accessor_as_color(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
+Vector<Color> EditorSceneImporterGLTF::_decode_accessor_as_color(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
- PoolVector<Color> ret;
+ Vector<Color> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
const int type = state.accessors[p_accessor].type;
ERR_FAIL_COND_V(!(type == TYPE_VEC3 || type == TYPE_VEC4), ret);
@@ -865,7 +874,7 @@ PoolVector<Color> EditorSceneImporterGLTF::_decode_accessor_as_color(GLTFState &
const int ret_size = attribs.size() / vec_len;
ret.resize(ret_size);
{
- PoolVector<Color>::Write w = ret.write();
+ Color *w = ret.ptrw();
for (int i = 0; i < ret_size; i++) {
w[i] = Color(attribs_ptr[i * vec_len + 0], attribs_ptr[i * vec_len + 1], attribs_ptr[i * vec_len + 2], vec_len == 4 ? attribs_ptr[i * 4 + 3] : 1.0);
}
@@ -874,12 +883,12 @@ PoolVector<Color> EditorSceneImporterGLTF::_decode_accessor_as_color(GLTFState &
}
Vector<Quat> EditorSceneImporterGLTF::_decode_accessor_as_quat(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
Vector<Quat> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
ERR_FAIL_COND_V(attribs.size() % 4 != 0, ret);
const double *attribs_ptr = attribs.ptr();
@@ -892,13 +901,14 @@ Vector<Quat> EditorSceneImporterGLTF::_decode_accessor_as_quat(GLTFState &state,
}
return ret;
}
-Vector<Transform2D> EditorSceneImporterGLTF::_decode_accessor_as_xform2d(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
+Vector<Transform2D> EditorSceneImporterGLTF::_decode_accessor_as_xform2d(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
Vector<Transform2D> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
ERR_FAIL_COND_V(attribs.size() % 4 != 0, ret);
ret.resize(attribs.size() / 4);
@@ -910,12 +920,12 @@ Vector<Transform2D> EditorSceneImporterGLTF::_decode_accessor_as_xform2d(GLTFSta
}
Vector<Basis> EditorSceneImporterGLTF::_decode_accessor_as_basis(GLTFState &state, const GLTFAccessorIndex p_accessor, bool p_for_vertex) {
-
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
Vector<Basis> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
ERR_FAIL_COND_V(attribs.size() % 9 != 0, ret);
ret.resize(attribs.size() / 9);
@@ -928,12 +938,12 @@ Vector<Basis> EditorSceneImporterGLTF::_decode_accessor_as_basis(GLTFState &stat
}
Vector<Transform> EditorSceneImporterGLTF::_decode_accessor_as_xform(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) {
-
const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex);
Vector<Transform> ret;
- if (attribs.size() == 0)
+ if (attribs.size() == 0) {
return ret;
+ }
ERR_FAIL_COND_V(attribs.size() % 16 != 0, ret);
ret.resize(attribs.size() / 16);
@@ -947,13 +957,15 @@ Vector<Transform> EditorSceneImporterGLTF::_decode_accessor_as_xform(GLTFState &
}
Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
-
- if (!state.json.has("meshes"))
+ if (!state.json.has("meshes")) {
return OK;
+ }
+
+ bool compress_vert_data = state.import_flags & IMPORT_USE_COMPRESSION;
+ uint32_t mesh_flags = compress_vert_data ? Mesh::ARRAY_COMPRESS_DEFAULT : 0;
Array meshes = state.json["meshes"];
for (GLTFMeshIndex i = 0; i < meshes.size(); i++) {
-
print_verbose("glTF: Parsing mesh: " + itos(i));
Dictionary d = meshes[i];
@@ -966,7 +978,6 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
const Dictionary &extras = d.has("extras") ? (Dictionary)d["extras"] : Dictionary();
for (int j = 0; j < primitives.size(); j++) {
-
Dictionary p = primitives[j];
Array array;
@@ -983,11 +994,15 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
static const Mesh::PrimitiveType primitives2[7] = {
Mesh::PRIMITIVE_POINTS,
Mesh::PRIMITIVE_LINES,
- Mesh::PRIMITIVE_LINE_LOOP,
- Mesh::PRIMITIVE_LINE_STRIP,
+ Mesh::PRIMITIVE_LINES, //loop not supported, should ce converted
+ Mesh::PRIMITIVE_LINES,
Mesh::PRIMITIVE_TRIANGLES,
Mesh::PRIMITIVE_TRIANGLE_STRIP,
- Mesh::PRIMITIVE_TRIANGLE_FAN,
+ Mesh::PRIMITIVE_TRIANGLES, //fan not supported, should be converted
+#ifndef _MSC_VER
+#warning line loop and triangle fan are not supported and need to be converted to lines and triangles
+#endif
+
};
primitive = primitives2[mode];
@@ -1016,10 +1031,10 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array[Mesh::ARRAY_BONES] = _decode_accessor_as_ints(state, a["JOINTS_0"], true);
}
if (a.has("WEIGHTS_0")) {
- PoolVector<float> weights = _decode_accessor_as_floats(state, a["WEIGHTS_0"], true);
+ Vector<float> weights = _decode_accessor_as_floats(state, a["WEIGHTS_0"], true);
{ //gltf does not seem to normalize the weights for some reason..
int wc = weights.size();
- PoolVector<float>::Write w = weights.write();
+ float *w = weights.ptrw();
for (int k = 0; k < wc; k += 4) {
float total = 0.0;
@@ -1039,13 +1054,13 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
}
if (p.has("indices")) {
- PoolVector<int> indices = _decode_accessor_as_ints(state, p["indices"], false);
+ Vector<int> indices = _decode_accessor_as_ints(state, p["indices"], false);
if (primitive == Mesh::PRIMITIVE_TRIANGLES) {
//swap around indices, convert ccw to cw for front face
const int is = indices.size();
- const PoolVector<int>::Write w = indices.write();
+ int *w = indices.ptrw();
for (int k = 0; k < is; k += 3) {
SWAP(w[k + 1], w[k + 2]);
}
@@ -1054,13 +1069,13 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
} else if (primitive == Mesh::PRIMITIVE_TRIANGLES) {
//generate indices because they need to be swapped for CW/CCW
- const PoolVector<Vector3> &vertices = array[Mesh::ARRAY_VERTEX];
+ const Vector<Vector3> &vertices = array[Mesh::ARRAY_VERTEX];
ERR_FAIL_COND_V(vertices.size() == 0, ERR_PARSE_ERROR);
- PoolVector<int> indices;
+ Vector<int> indices;
const int vs = vertices.size();
indices.resize(vs);
{
- const PoolVector<int>::Write w = indices.write();
+ int *w = indices.ptrw();
for (int k = 0; k < vs; k += 3) {
w[k] = k;
w[k + 1] = k + 2;
@@ -1070,24 +1085,15 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array[Mesh::ARRAY_INDEX] = indices;
}
- bool generated_tangents = false;
- Variant erased_indices;
+ bool generate_tangents = (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL"));
- if (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL")) {
+ if (generate_tangents) {
//must generate mikktspace tangents.. ergh..
Ref<SurfaceTool> st;
st.instance();
st->create_from_triangle_arrays(array);
- if (!p.has("targets")) {
- //morph targets should not be reindexed, as array size might differ
- //removing indices is the best bet here
- st->deindex();
- erased_indices = a[Mesh::ARRAY_INDEX];
- a[Mesh::ARRAY_INDEX] = Variant();
- }
st->generate_tangents();
array = st->commit_to_arrays();
- generated_tangents = true;
}
Array morphs;
@@ -1109,7 +1115,6 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
}
for (int k = 0; k < targets.size(); k++) {
-
const Dictionary &t = targets[k];
Array array_copy;
@@ -1122,18 +1127,17 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array_copy[Mesh::ARRAY_INDEX] = Variant();
if (t.has("POSITION")) {
- PoolVector<Vector3> varr = _decode_accessor_as_vec3(state, t["POSITION"], true);
- const PoolVector<Vector3> src_varr = array[Mesh::ARRAY_VERTEX];
+ Vector<Vector3> varr = _decode_accessor_as_vec3(state, t["POSITION"], true);
+ const Vector<Vector3> src_varr = array[Mesh::ARRAY_VERTEX];
const int size = src_varr.size();
ERR_FAIL_COND_V(size == 0, ERR_PARSE_ERROR);
{
-
const int max_idx = varr.size();
varr.resize(size);
- const PoolVector<Vector3>::Write w_varr = varr.write();
- const PoolVector<Vector3>::Read r_varr = varr.read();
- const PoolVector<Vector3>::Read r_src_varr = src_varr.read();
+ Vector3 *w_varr = varr.ptrw();
+ const Vector3 *r_varr = varr.ptr();
+ const Vector3 *r_src_varr = src_varr.ptr();
for (int l = 0; l < size; l++) {
if (l < max_idx) {
w_varr[l] = r_varr[l] + r_src_varr[l];
@@ -1145,17 +1149,17 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array_copy[Mesh::ARRAY_VERTEX] = varr;
}
if (t.has("NORMAL")) {
- PoolVector<Vector3> narr = _decode_accessor_as_vec3(state, t["NORMAL"], true);
- const PoolVector<Vector3> src_narr = array[Mesh::ARRAY_NORMAL];
+ Vector<Vector3> narr = _decode_accessor_as_vec3(state, t["NORMAL"], true);
+ const Vector<Vector3> src_narr = array[Mesh::ARRAY_NORMAL];
int size = src_narr.size();
ERR_FAIL_COND_V(size == 0, ERR_PARSE_ERROR);
{
int max_idx = narr.size();
narr.resize(size);
- const PoolVector<Vector3>::Write w_narr = narr.write();
- const PoolVector<Vector3>::Read r_narr = narr.read();
- const PoolVector<Vector3>::Read r_src_narr = src_narr.read();
+ Vector3 *w_narr = narr.ptrw();
+ const Vector3 *r_narr = narr.ptr();
+ const Vector3 *r_src_narr = src_narr.ptr();
for (int l = 0; l < size; l++) {
if (l < max_idx) {
w_narr[l] = r_narr[l] + r_src_narr[l];
@@ -1167,25 +1171,23 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array_copy[Mesh::ARRAY_NORMAL] = narr;
}
if (t.has("TANGENT")) {
- const PoolVector<Vector3> tangents_v3 = _decode_accessor_as_vec3(state, t["TANGENT"], true);
- const PoolVector<float> src_tangents = array[Mesh::ARRAY_TANGENT];
+ const Vector<Vector3> tangents_v3 = _decode_accessor_as_vec3(state, t["TANGENT"], true);
+ const Vector<float> src_tangents = array[Mesh::ARRAY_TANGENT];
ERR_FAIL_COND_V(src_tangents.size() == 0, ERR_PARSE_ERROR);
- PoolVector<float> tangents_v4;
+ Vector<float> tangents_v4;
{
-
int max_idx = tangents_v3.size();
int size4 = src_tangents.size();
tangents_v4.resize(size4);
- const PoolVector<float>::Write w4 = tangents_v4.write();
+ float *w4 = tangents_v4.ptrw();
- const PoolVector<Vector3>::Read r3 = tangents_v3.read();
- const PoolVector<float>::Read r4 = src_tangents.read();
+ const Vector3 *r3 = tangents_v3.ptr();
+ const float *r4 = src_tangents.ptr();
for (int l = 0; l < size4 / 4; l++) {
-
if (l < max_idx) {
w4[l * 4 + 0] = r3[l].x + r4[l * 4 + 0];
w4[l * 4 + 1] = r3[l].y + r4[l * 4 + 1];
@@ -1202,10 +1204,9 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array_copy[Mesh::ARRAY_TANGENT] = tangents_v4;
}
- if (generated_tangents) {
+ if (generate_tangents) {
Ref<SurfaceTool> st;
st.instance();
- array_copy[Mesh::ARRAY_INDEX] = erased_indices; //needed for tangent generation, erased by deindex
st->create_from_triangle_arrays(array_copy);
st->deindex();
st->generate_tangents();
@@ -1217,7 +1218,7 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
}
//just add it
- mesh.mesh->add_surface_from_arrays(primitive, array, morphs);
+ mesh.mesh->add_surface_from_arrays(primitive, array, morphs, Dictionary(), mesh_flags);
if (p.has("material")) {
const int material = p["material"];
@@ -1228,10 +1229,14 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
}
}
+ mesh.blend_weights.resize(mesh.mesh->get_blend_shape_count());
+ for (int32_t weight_i = 0; weight_i < mesh.blend_weights.size(); weight_i++) {
+ mesh.blend_weights.write[weight_i] = 0.0f;
+ }
+
if (d.has("weights")) {
const Array &weights = d["weights"];
- ERR_FAIL_COND_V(mesh.mesh->get_blend_shape_count() != weights.size(), ERR_PARSE_ERROR);
- mesh.blend_weights.resize(weights.size());
+ ERR_FAIL_COND_V(mesh.blend_weights.size() != weights.size(), ERR_PARSE_ERROR);
for (int j = 0; j < weights.size(); j++) {
mesh.blend_weights.write[j] = weights[j];
}
@@ -1246,13 +1251,12 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
}
Error EditorSceneImporterGLTF::_parse_images(GLTFState &state, const String &p_base_path) {
-
- if (!state.json.has("images"))
+ if (!state.json.has("images")) {
return OK;
+ }
const Array &images = state.json["images"];
for (int i = 0; i < images.size(); i++) {
-
const Dictionary &d = images[i];
String mimetype;
@@ -1261,7 +1265,7 @@ Error EditorSceneImporterGLTF::_parse_images(GLTFState &state, const String &p_b
}
Vector<uint8_t> data;
- const uint8_t *data_ptr = NULL;
+ const uint8_t *data_ptr = nullptr;
int data_size = 0;
if (d.has("uri")) {
@@ -1274,9 +1278,8 @@ Error EditorSceneImporterGLTF::_parse_images(GLTFState &state, const String &p_b
data_ptr = data.ptr();
data_size = data.size();
} else {
-
uri = p_base_path.plus_file(uri).replace("\\", "/"); //fix for windows
- Ref<Texture> texture = ResourceLoader::load(uri);
+ Ref<Texture2D> texture = ResourceLoader::load(uri);
state.images.push_back(texture);
continue;
}
@@ -1302,7 +1305,7 @@ Error EditorSceneImporterGLTF::_parse_images(GLTFState &state, const String &p_b
if (mimetype.findn("png") != -1) {
//is a png
- ERR_FAIL_COND_V(Image::_png_mem_loader_func == NULL, ERR_UNAVAILABLE);
+ ERR_FAIL_COND_V(Image::_png_mem_loader_func == nullptr, ERR_UNAVAILABLE);
const Ref<Image> img = Image::_png_mem_loader_func(data_ptr, data_size);
@@ -1318,7 +1321,7 @@ Error EditorSceneImporterGLTF::_parse_images(GLTFState &state, const String &p_b
if (mimetype.findn("jpeg") != -1) {
//is a jpg
- ERR_FAIL_COND_V(Image::_jpg_mem_loader_func == NULL, ERR_UNAVAILABLE);
+ ERR_FAIL_COND_V(Image::_jpg_mem_loader_func == nullptr, ERR_UNAVAILABLE);
const Ref<Image> img = Image::_jpg_mem_loader_func(data_ptr, data_size);
@@ -1342,13 +1345,12 @@ Error EditorSceneImporterGLTF::_parse_images(GLTFState &state, const String &p_b
}
Error EditorSceneImporterGLTF::_parse_textures(GLTFState &state) {
-
- if (!state.json.has("textures"))
+ if (!state.json.has("textures")) {
return OK;
+ }
const Array &textures = state.json["textures"];
for (GLTFTextureIndex i = 0; i < textures.size(); i++) {
-
const Dictionary &d = textures[i];
ERR_FAIL_COND_V(!d.has("source"), ERR_PARSE_ERROR);
@@ -1361,33 +1363,31 @@ Error EditorSceneImporterGLTF::_parse_textures(GLTFState &state) {
return OK;
}
-Ref<Texture> EditorSceneImporterGLTF::_get_texture(GLTFState &state, const GLTFTextureIndex p_texture) {
- ERR_FAIL_INDEX_V(p_texture, state.textures.size(), Ref<Texture>());
+Ref<Texture2D> EditorSceneImporterGLTF::_get_texture(GLTFState &state, const GLTFTextureIndex p_texture) {
+ ERR_FAIL_INDEX_V(p_texture, state.textures.size(), Ref<Texture2D>());
const GLTFImageIndex image = state.textures[p_texture].src_image;
- ERR_FAIL_INDEX_V(image, state.images.size(), Ref<Texture>());
+ ERR_FAIL_INDEX_V(image, state.images.size(), Ref<Texture2D>());
return state.images[image];
}
Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
-
- if (!state.json.has("materials"))
+ if (!state.json.has("materials")) {
return OK;
+ }
const Array &materials = state.json["materials"];
for (GLTFMaterialIndex i = 0; i < materials.size(); i++) {
-
const Dictionary &d = materials[i];
- Ref<SpatialMaterial> material;
+ Ref<StandardMaterial3D> material;
material.instance();
if (d.has("name")) {
material->set_name(d["name"]);
}
if (d.has("pbrMetallicRoughness")) {
-
const Dictionary &mr = d["pbrMetallicRoughness"];
if (mr.has("baseColorFactor")) {
const Array &arr = mr["baseColorFactor"];
@@ -1400,7 +1400,7 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
if (mr.has("baseColorTexture")) {
const Dictionary &bct = mr["baseColorTexture"];
if (bct.has("index")) {
- material->set_texture(SpatialMaterial::TEXTURE_ALBEDO, _get_texture(state, bct["index"]));
+ material->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, _get_texture(state, bct["index"]));
}
if (!mr.has("baseColorFactor")) {
material->set_albedo(Color(1, 1, 1));
@@ -1422,11 +1422,11 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
if (mr.has("metallicRoughnessTexture")) {
const Dictionary &bct = mr["metallicRoughnessTexture"];
if (bct.has("index")) {
- const Ref<Texture> t = _get_texture(state, bct["index"]);
- material->set_texture(SpatialMaterial::TEXTURE_METALLIC, t);
- material->set_metallic_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_BLUE);
- material->set_texture(SpatialMaterial::TEXTURE_ROUGHNESS, t);
- material->set_roughness_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_GREEN);
+ const Ref<Texture2D> t = _get_texture(state, bct["index"]);
+ material->set_texture(StandardMaterial3D::TEXTURE_METALLIC, t);
+ material->set_metallic_texture_channel(StandardMaterial3D::TEXTURE_CHANNEL_BLUE);
+ material->set_texture(StandardMaterial3D::TEXTURE_ROUGHNESS, t);
+ material->set_roughness_texture_channel(StandardMaterial3D::TEXTURE_CHANNEL_GREEN);
if (!mr.has("metallicFactor")) {
material->set_metallic(1);
}
@@ -1440,8 +1440,8 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
if (d.has("normalTexture")) {
const Dictionary &bct = d["normalTexture"];
if (bct.has("index")) {
- material->set_texture(SpatialMaterial::TEXTURE_NORMAL, _get_texture(state, bct["index"]));
- material->set_feature(SpatialMaterial::FEATURE_NORMAL_MAPPING, true);
+ material->set_texture(StandardMaterial3D::TEXTURE_NORMAL, _get_texture(state, bct["index"]));
+ material->set_feature(StandardMaterial3D::FEATURE_NORMAL_MAPPING, true);
}
if (bct.has("scale")) {
material->set_normal_scale(bct["scale"]);
@@ -1450,9 +1450,9 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
if (d.has("occlusionTexture")) {
const Dictionary &bct = d["occlusionTexture"];
if (bct.has("index")) {
- material->set_texture(SpatialMaterial::TEXTURE_AMBIENT_OCCLUSION, _get_texture(state, bct["index"]));
- material->set_ao_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_RED);
- material->set_feature(SpatialMaterial::FEATURE_AMBIENT_OCCLUSION, true);
+ material->set_texture(StandardMaterial3D::TEXTURE_AMBIENT_OCCLUSION, _get_texture(state, bct["index"]));
+ material->set_ao_texture_channel(StandardMaterial3D::TEXTURE_CHANNEL_RED);
+ material->set_feature(StandardMaterial3D::FEATURE_AMBIENT_OCCLUSION, true);
}
}
@@ -1460,7 +1460,7 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
const Array &arr = d["emissiveFactor"];
ERR_FAIL_COND_V(arr.size() != 3, ERR_PARSE_ERROR);
const Color c = Color(arr[0], arr[1], arr[2]).to_srgb();
- material->set_feature(SpatialMaterial::FEATURE_EMISSION, true);
+ material->set_feature(StandardMaterial3D::FEATURE_EMISSION, true);
material->set_emission(c);
}
@@ -1468,8 +1468,8 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
if (d.has("emissiveTexture")) {
const Dictionary &bct = d["emissiveTexture"];
if (bct.has("index")) {
- material->set_texture(SpatialMaterial::TEXTURE_EMISSION, _get_texture(state, bct["index"]));
- material->set_feature(SpatialMaterial::FEATURE_EMISSION, true);
+ material->set_texture(StandardMaterial3D::TEXTURE_EMISSION, _get_texture(state, bct["index"]));
+ material->set_feature(StandardMaterial3D::FEATURE_EMISSION, true);
material->set_emission(Color(0, 0, 0));
}
}
@@ -1477,17 +1477,16 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) {
if (d.has("doubleSided")) {
const bool ds = d["doubleSided"];
if (ds) {
- material->set_cull_mode(SpatialMaterial::CULL_DISABLED);
+ material->set_cull_mode(StandardMaterial3D::CULL_DISABLED);
}
}
if (d.has("alphaMode")) {
const String &am = d["alphaMode"];
if (am == "BLEND") {
- material->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- material->set_depth_draw_mode(SpatialMaterial::DEPTH_DRAW_ALPHA_OPAQUE_PREPASS);
+ material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA_DEPTH_PRE_PASS);
} else if (am == "MASK") {
- material->set_flag(SpatialMaterial::FLAG_USE_ALPHA_SCISSOR, true);
+ material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA_SCISSOR);
if (d.has("alphaCutoff")) {
material->set_alpha_scissor_threshold(d["alphaCutoff"]);
} else {
@@ -1522,7 +1521,6 @@ EditorSceneImporterGLTF::GLTFNodeIndex EditorSceneImporterGLTF::_find_highest_no
}
bool EditorSceneImporterGLTF::_capture_nodes_in_skin(GLTFState &state, GLTFSkin &skin, const GLTFNodeIndex node_index) {
-
bool found_joint = false;
for (int i = 0; i < state.nodes[node_index]->children.size(); ++i) {
@@ -1546,7 +1544,6 @@ bool EditorSceneImporterGLTF::_capture_nodes_in_skin(GLTFState &state, GLTFSkin
}
void EditorSceneImporterGLTF::_capture_nodes_for_multirooted_skin(GLTFState &state, GLTFSkin &skin) {
-
DisjointSet<GLTFNodeIndex> disjoint_set;
for (int i = 0; i < skin.joints.size(); ++i) {
@@ -1580,7 +1577,6 @@ void EditorSceneImporterGLTF::_capture_nodes_for_multirooted_skin(GLTFState &sta
// Go up the tree till all of the multiple roots of the skin are at the same hierarchy level.
// This sucks, but 99% of all game engines (not just Godot) would have this same issue.
for (int i = 0; i < roots.size(); ++i) {
-
GLTFNodeIndex current_node = roots[i];
while (state.nodes[current_node]->height > maxHeight) {
GLTFNodeIndex parent = state.nodes[current_node]->parent;
@@ -1628,7 +1624,6 @@ void EditorSceneImporterGLTF::_capture_nodes_for_multirooted_skin(GLTFState &sta
}
Error EditorSceneImporterGLTF::_expand_skin(GLTFState &state, GLTFSkin &skin) {
-
_capture_nodes_for_multirooted_skin(state, skin);
// Grab all nodes that lay in between skin joints/nodes
@@ -1674,7 +1669,6 @@ Error EditorSceneImporterGLTF::_expand_skin(GLTFState &state, GLTFSkin &skin) {
}
Error EditorSceneImporterGLTF::_verify_skin(GLTFState &state, GLTFSkin &skin) {
-
// This may seem duplicated from expand_skins, but this is really a sanity check! (so it kinda is)
// In case additional interpolating logic is added to the skins, this will help ensure that you
// do not cause it to self implode into a fiery blaze
@@ -1740,15 +1734,14 @@ Error EditorSceneImporterGLTF::_verify_skin(GLTFState &state, GLTFSkin &skin) {
}
Error EditorSceneImporterGLTF::_parse_skins(GLTFState &state) {
-
- if (!state.json.has("skins"))
+ if (!state.json.has("skins")) {
return OK;
+ }
const Array &skins = state.json["skins"];
// Create the base skins, and mark nodes that are joints
for (int i = 0; i < skins.size(); i++) {
-
const Dictionary &d = skins[i];
GLTFSkin skin;
@@ -1798,7 +1791,6 @@ Error EditorSceneImporterGLTF::_parse_skins(GLTFState &state) {
}
Error EditorSceneImporterGLTF::_determine_skeletons(GLTFState &state) {
-
// Using a disjoint set, we are going to potentially combine all skins that are actually branches
// of a main skeleton, or treat skins defining the same set of nodes as ONE skeleton.
// This is another unclear issue caused by the current glTF specification.
@@ -1834,7 +1826,7 @@ Error EditorSceneImporterGLTF::_determine_skeletons(GLTFState &state) {
skeleton_sets.get_representatives(groups_representatives);
Vector<GLTFNodeIndex> highest_group_members;
- Vector<Vector<GLTFNodeIndex> > groups;
+ Vector<Vector<GLTFNodeIndex>> groups;
for (int i = 0; i < groups_representatives.size(); ++i) {
Vector<GLTFNodeIndex> group;
skeleton_sets.get_members(group, groups_representatives[i]);
@@ -1876,7 +1868,6 @@ Error EditorSceneImporterGLTF::_determine_skeletons(GLTFState &state) {
// Mark all the skins actual skeletons, after we have merged them
for (GLTFSkeletonIndex skel_i = 0; skel_i < skeleton_owners.size(); ++skel_i) {
-
const GLTFNodeIndex skeleton_owner = skeleton_owners[skel_i];
GLTFSkeleton skeleton;
@@ -1931,7 +1922,6 @@ Error EditorSceneImporterGLTF::_determine_skeletons(GLTFState &state) {
}
Error EditorSceneImporterGLTF::_reparent_non_joint_skeleton_subtrees(GLTFState &state, GLTFSkeleton &skeleton, const Vector<GLTFNodeIndex> &non_joints) {
-
DisjointSet<GLTFNodeIndex> subtree_set;
// Populate the disjoint set with ONLY non joints that are in the skeleton hierarchy (non_joints vector)
@@ -1991,8 +1981,9 @@ Error EditorSceneImporterGLTF::_reparent_to_fake_joint(GLTFState &state, GLTFSke
state.nodes.push_back(fake_joint);
// We better not be a joint, or we messed up in our logic
- if (node->joint)
+ if (node->joint) {
return FAILED;
+ }
fake_joint->translation = node->translation;
fake_joint->rotation = node->rotation;
@@ -2046,7 +2037,6 @@ Error EditorSceneImporterGLTF::_reparent_to_fake_joint(GLTFState &state, GLTFSke
}
Error EditorSceneImporterGLTF::_determine_skeleton_roots(GLTFState &state, const GLTFSkeletonIndex skel_i) {
-
DisjointSet<GLTFNodeIndex> disjoint_set;
for (GLTFNodeIndex i = 0; i < state.nodes.size(); ++i) {
@@ -2101,10 +2091,9 @@ Error EditorSceneImporterGLTF::_determine_skeleton_roots(GLTFState &state, const
Error EditorSceneImporterGLTF::_create_skeletons(GLTFState &state) {
for (GLTFSkeletonIndex skel_i = 0; skel_i < state.skeletons.size(); ++skel_i) {
-
GLTFSkeleton &gltf_skeleton = state.skeletons.write[skel_i];
- Skeleton *skeleton = memnew(Skeleton);
+ Skeleton3D *skeleton = memnew(Skeleton3D);
gltf_skeleton.godot_skeleton = skeleton;
// Make a unique name, no gltf node represents this skeleton
@@ -2179,6 +2168,8 @@ Error EditorSceneImporterGLTF::_map_skin_joints_indices_to_skeleton_bone_indices
const GLTFNodeIndex node_i = skin.joints_original[joint_index];
const GLTFNode *node = state.nodes[node_i];
+ skin.joint_i_to_name.insert(joint_index, node->name);
+
const int bone_index = skeleton.godot_skeleton->find_bone(node->name);
ERR_FAIL_COND_V(bone_index < 0, FAILED);
@@ -2200,12 +2191,17 @@ Error EditorSceneImporterGLTF::_create_skins(GLTFState &state) {
const bool has_ibms = !gltf_skin.inverse_binds.empty();
for (int joint_i = 0; joint_i < gltf_skin.joints_original.size(); ++joint_i) {
- int bone_i = gltf_skin.joint_i_to_bone_i[joint_i];
-
+ Transform xform;
if (has_ibms) {
- skin->add_bind(bone_i, gltf_skin.inverse_binds[joint_i]);
+ xform = gltf_skin.inverse_binds[joint_i];
+ }
+
+ if (state.use_named_skin_binds) {
+ StringName name = gltf_skin.joint_i_to_name[joint_i];
+ skin->add_named_bind(name, xform);
} else {
- skin->add_bind(bone_i, Transform());
+ int bone_i = gltf_skin.joint_i_to_bone_i[joint_i];
+ skin->add_bind(bone_i, xform);
}
}
@@ -2233,7 +2229,6 @@ bool EditorSceneImporterGLTF::_skins_are_same(const Ref<Skin> &skin_a, const Ref
}
for (int i = 0; i < skin_a->get_bind_count(); ++i) {
-
if (skin_a->get_bind_bone(i) != skin_b->get_bind_bone(i)) {
return false;
}
@@ -2263,22 +2258,72 @@ void EditorSceneImporterGLTF::_remove_duplicate_skins(GLTFState &state) {
}
}
-Error EditorSceneImporterGLTF::_parse_cameras(GLTFState &state) {
+Error EditorSceneImporterGLTF::_parse_lights(GLTFState &state) {
+ if (!state.json.has("extensions")) {
+ return OK;
+ }
+ Dictionary extensions = state.json["extensions"];
+ if (!extensions.has("KHR_lights_punctual")) {
+ return OK;
+ }
+ Dictionary lights_punctual = extensions["KHR_lights_punctual"];
+ if (!lights_punctual.has("lights")) {
+ return OK;
+ }
+
+ const Array &lights = lights_punctual["lights"];
+
+ for (GLTFLightIndex light_i = 0; light_i < lights.size(); light_i++) {
+ const Dictionary &d = lights[light_i];
+
+ GLTFLight light;
+ ERR_FAIL_COND_V(!d.has("type"), ERR_PARSE_ERROR);
+ const String &type = d["type"];
+ light.type = type;
+
+ if (d.has("color")) {
+ const Array &arr = d["color"];
+ ERR_FAIL_COND_V(arr.size() != 3, ERR_PARSE_ERROR);
+ const Color c = Color(arr[0], arr[1], arr[2]).to_srgb();
+ light.color = c;
+ }
+ if (d.has("intensity")) {
+ light.intensity = d["intensity"];
+ }
+ if (d.has("range")) {
+ light.range = d["range"];
+ }
+ if (type == "spot") {
+ const Dictionary &spot = d["spot"];
+ light.inner_cone_angle = spot["innerConeAngle"];
+ light.outer_cone_angle = spot["outerConeAngle"];
+ ERR_FAIL_COND_V_MSG(light.inner_cone_angle >= light.outer_cone_angle, ERR_PARSE_ERROR, "The inner angle must be smaller than the outer angle.");
+ } else if (type != "point" && type != "directional") {
+ ERR_FAIL_V_MSG(ERR_PARSE_ERROR, "Light type is unknown.");
+ }
- if (!state.json.has("cameras"))
+ state.lights.push_back(light);
+ }
+
+ print_verbose("glTF: Total lights: " + itos(state.lights.size()));
+
+ return OK;
+}
+
+Error EditorSceneImporterGLTF::_parse_cameras(GLTFState &state) {
+ if (!state.json.has("cameras")) {
return OK;
+ }
const Array &cameras = state.json["cameras"];
for (GLTFCameraIndex i = 0; i < cameras.size(); i++) {
-
const Dictionary &d = cameras[i];
GLTFCamera camera;
ERR_FAIL_COND_V(!d.has("type"), ERR_PARSE_ERROR);
const String &type = d["type"];
if (type == "orthographic") {
-
camera.perspective = false;
if (d.has("orthographic")) {
const Dictionary &og = d["orthographic"];
@@ -2290,7 +2335,6 @@ Error EditorSceneImporterGLTF::_parse_cameras(GLTFState &state) {
}
} else if (type == "perspective") {
-
camera.perspective = true;
if (d.has("perspective")) {
const Dictionary &ppt = d["perspective"];
@@ -2314,20 +2358,20 @@ Error EditorSceneImporterGLTF::_parse_cameras(GLTFState &state) {
}
Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
-
- if (!state.json.has("animations"))
+ if (!state.json.has("animations")) {
return OK;
+ }
const Array &animations = state.json["animations"];
for (GLTFAnimationIndex i = 0; i < animations.size(); i++) {
-
const Dictionary &d = animations[i];
GLTFAnimation animation;
- if (!d.has("channels") || !d.has("samplers"))
+ if (!d.has("channels") || !d.has("samplers")) {
continue;
+ }
Array channels = d["channels"];
Array samplers = d["samplers"];
@@ -2341,10 +2385,10 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
}
for (int j = 0; j < channels.size(); j++) {
-
const Dictionary &c = channels[j];
- if (!c.has("target"))
+ if (!c.has("target")) {
continue;
+ }
const Dictionary &t = c["target"];
if (!t.has("node") || !t.has("path")) {
@@ -2393,9 +2437,9 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
}
}
- const PoolVector<float> times = _decode_accessor_as_floats(state, input, false);
+ const Vector<float> times = _decode_accessor_as_floats(state, input, false);
if (path == "translation") {
- const PoolVector<Vector3> translations = _decode_accessor_as_vec3(state, output, false);
+ const Vector<Vector3> translations = _decode_accessor_as_vec3(state, output, false);
track->translation_track.interpolation = interp;
track->translation_track.times = Variant(times); //convert via variant
track->translation_track.values = Variant(translations); //convert via variant
@@ -2405,12 +2449,12 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
track->rotation_track.times = Variant(times); //convert via variant
track->rotation_track.values = rotations; //convert via variant
} else if (path == "scale") {
- const PoolVector<Vector3> scales = _decode_accessor_as_vec3(state, output, false);
+ const Vector<Vector3> scales = _decode_accessor_as_vec3(state, output, false);
track->scale_track.interpolation = interp;
track->scale_track.times = Variant(times); //convert via variant
track->scale_track.values = Variant(scales); //convert via variant
} else if (path == "weights") {
- const PoolVector<float> weights = _decode_accessor_as_floats(state, output, false);
+ const Vector<float> weights = _decode_accessor_as_floats(state, output, false);
ERR_FAIL_INDEX_V(state.nodes[node]->mesh, state.meshes.size(), ERR_PARSE_ERROR);
const GLTFMesh *mesh = &state.meshes[state.nodes[node]->mesh];
@@ -2423,7 +2467,7 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
ERR_FAIL_COND_V_MSG(weights.size() != expected_value_count, ERR_PARSE_ERROR, "Invalid weight data, expected " + itos(expected_value_count) + " weight values, got " + itos(weights.size()) + " instead.");
const int wlen = weights.size() / wc;
- PoolVector<float>::Read r = weights.read();
+ const float *r = weights.ptr();
for (int k = 0; k < wc; k++) { //separate tracks, having them together is not such a good idea
GLTFAnimation::Channel<float> cf;
cf.interpolation = interp;
@@ -2438,7 +2482,7 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
track->weight_tracks.write[k] = cf;
}
} else {
- WARN_PRINTS("Invalid path '" + path + "'.");
+ WARN_PRINT("Invalid path '" + path + "'.");
}
}
@@ -2451,13 +2495,13 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
}
void EditorSceneImporterGLTF::_assign_scene_names(GLTFState &state) {
-
for (int i = 0; i < state.nodes.size(); i++) {
GLTFNode *n = state.nodes[i];
// Any joints get unique names generated when the skeleton is made, unique to the skeleton
- if (n->skeleton >= 0)
+ if (n->skeleton >= 0) {
continue;
+ }
if (n->name.empty()) {
if (n->mesh >= 0) {
@@ -2473,12 +2517,11 @@ void EditorSceneImporterGLTF::_assign_scene_names(GLTFState &state) {
}
}
-BoneAttachment *EditorSceneImporterGLTF::_generate_bone_attachment(GLTFState &state, Skeleton *skeleton, const GLTFNodeIndex node_index) {
-
+BoneAttachment3D *EditorSceneImporterGLTF::_generate_bone_attachment(GLTFState &state, Skeleton3D *skeleton, const GLTFNodeIndex node_index) {
const GLTFNode *gltf_node = state.nodes[node_index];
const GLTFNode *bone_node = state.nodes[gltf_node->parent];
- BoneAttachment *bone_attachment = memnew(BoneAttachment);
+ BoneAttachment3D *bone_attachment = memnew(BoneAttachment3D);
print_verbose("glTF: Creating bone attachment for: " + gltf_node->name);
ERR_FAIL_COND_V(!bone_node->joint, nullptr);
@@ -2488,12 +2531,12 @@ BoneAttachment *EditorSceneImporterGLTF::_generate_bone_attachment(GLTFState &st
return bone_attachment;
}
-MeshInstance *EditorSceneImporterGLTF::_generate_mesh_instance(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index) {
+MeshInstance3D *EditorSceneImporterGLTF::_generate_mesh_instance(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index) {
const GLTFNode *gltf_node = state.nodes[node_index];
ERR_FAIL_INDEX_V(gltf_node->mesh, state.meshes.size(), nullptr);
- MeshInstance *mi = memnew(MeshInstance);
+ MeshInstance3D *mi = memnew(MeshInstance3D);
print_verbose("glTF: Creating mesh for: " + gltf_node->name);
GLTFMesh &mesh = state.meshes.write[gltf_node->mesh];
@@ -2510,12 +2553,64 @@ MeshInstance *EditorSceneImporterGLTF::_generate_mesh_instance(GLTFState &state,
return mi;
}
-Camera *EditorSceneImporterGLTF::_generate_camera(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index) {
+Light3D *EditorSceneImporterGLTF::_generate_light(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index) {
+ const GLTFNode *gltf_node = state.nodes[node_index];
+
+ ERR_FAIL_INDEX_V(gltf_node->light, state.lights.size(), nullptr);
+
+ print_verbose("glTF: Creating light for: " + gltf_node->name);
+
+ const GLTFLight &l = state.lights[gltf_node->light];
+
+ float intensity = l.intensity;
+ if (intensity > 10) {
+ // GLTF spec has the default around 1, but Blender defaults lights to 100.
+ // The only sane way to handle this is to check where it came from and
+ // handle it accordingly. If it's over 10, it probably came from Blender.
+ intensity /= 100;
+ }
+
+ if (l.type == "directional") {
+ DirectionalLight3D *light = memnew(DirectionalLight3D);
+ light->set_param(Light3D::PARAM_ENERGY, intensity);
+ light->set_color(l.color);
+ return light;
+ }
+
+ const float range = CLAMP(l.range, 0, 4096);
+ // Doubling the range will double the effective brightness, so we need double attenuation (half brightness).
+ // We want to have double intensity give double brightness, so we need half the attenuation.
+ const float attenuation = range / intensity;
+ if (l.type == "point") {
+ OmniLight3D *light = memnew(OmniLight3D);
+ light->set_param(OmniLight3D::PARAM_ATTENUATION, attenuation);
+ light->set_param(OmniLight3D::PARAM_RANGE, range);
+ light->set_color(l.color);
+ return light;
+ }
+ if (l.type == "spot") {
+ SpotLight3D *light = memnew(SpotLight3D);
+ light->set_param(SpotLight3D::PARAM_ATTENUATION, attenuation);
+ light->set_param(SpotLight3D::PARAM_RANGE, range);
+ light->set_param(SpotLight3D::PARAM_SPOT_ANGLE, Math::rad2deg(l.outer_cone_angle));
+ light->set_color(l.color);
+
+ // Line of best fit derived from guessing, see https://www.desmos.com/calculator/biiflubp8b
+ // The points in desmos are not exact, except for (1, infinity).
+ float angle_ratio = l.inner_cone_angle / l.outer_cone_angle;
+ float angle_attenuation = 0.2 / (1 - angle_ratio) - 0.1;
+ light->set_param(SpotLight3D::PARAM_SPOT_ATTENUATION, angle_attenuation);
+ return light;
+ }
+ return nullptr;
+}
+
+Camera3D *EditorSceneImporterGLTF::_generate_camera(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index) {
const GLTFNode *gltf_node = state.nodes[node_index];
ERR_FAIL_INDEX_V(gltf_node->camera, state.cameras.size(), nullptr);
- Camera *camera = memnew(Camera);
+ Camera3D *camera = memnew(Camera3D);
print_verbose("glTF: Creating camera for: " + gltf_node->name);
const GLTFCamera &c = state.cameras[gltf_node->camera];
@@ -2528,26 +2623,25 @@ Camera *EditorSceneImporterGLTF::_generate_camera(GLTFState &state, Node *scene_
return camera;
}
-Spatial *EditorSceneImporterGLTF::_generate_spatial(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index) {
+Node3D *EditorSceneImporterGLTF::_generate_spatial(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index) {
const GLTFNode *gltf_node = state.nodes[node_index];
- Spatial *spatial = memnew(Spatial);
+ Node3D *spatial = memnew(Node3D);
print_verbose("glTF: Creating spatial for: " + gltf_node->name);
return spatial;
}
-void EditorSceneImporterGLTF::_generate_scene_node(GLTFState &state, Node *scene_parent, Spatial *scene_root, const GLTFNodeIndex node_index) {
-
+void EditorSceneImporterGLTF::_generate_scene_node(GLTFState &state, Node *scene_parent, Node3D *scene_root, const GLTFNodeIndex node_index) {
const GLTFNode *gltf_node = state.nodes[node_index];
- Spatial *current_node = nullptr;
+ Node3D *current_node = nullptr;
// Is our parent a skeleton
- Skeleton *active_skeleton = Object::cast_to<Skeleton>(scene_parent);
+ Skeleton3D *active_skeleton = Object::cast_to<Skeleton3D>(scene_parent);
if (gltf_node->skeleton >= 0) {
- Skeleton *skeleton = state.skeletons[gltf_node->skeleton].godot_skeleton;
+ Skeleton3D *skeleton = state.skeletons[gltf_node->skeleton].godot_skeleton;
if (active_skeleton != skeleton) {
ERR_FAIL_COND_MSG(active_skeleton != nullptr, "glTF: Generating scene detected direct parented Skeletons");
@@ -2565,7 +2659,7 @@ void EditorSceneImporterGLTF::_generate_scene_node(GLTFState &state, Node *scene
// If we have an active skeleton, and the node is node skinned, we need to create a bone attachment
if (current_node == nullptr && active_skeleton != nullptr && gltf_node->skin < 0) {
- BoneAttachment *bone_attachment = _generate_bone_attachment(state, active_skeleton, node_index);
+ BoneAttachment3D *bone_attachment = _generate_bone_attachment(state, active_skeleton, node_index);
scene_parent->add_child(bone_attachment);
bone_attachment->set_owner(scene_root);
@@ -2584,6 +2678,8 @@ void EditorSceneImporterGLTF::_generate_scene_node(GLTFState &state, Node *scene
current_node = _generate_mesh_instance(state, scene_parent, node_index);
} else if (gltf_node->camera >= 0) {
current_node = _generate_camera(state, scene_parent, node_index);
+ } else if (gltf_node->light >= 0) {
+ current_node = _generate_light(state, scene_parent, node_index);
} else {
current_node = _generate_spatial(state, scene_parent, node_index);
}
@@ -2603,18 +2699,15 @@ void EditorSceneImporterGLTF::_generate_scene_node(GLTFState &state, Node *scene
template <class T>
struct EditorSceneImporterGLTFInterpolate {
-
T lerp(const T &a, const T &b, float c) const {
-
return a + (b - a) * c;
}
T catmull_rom(const T &p0, const T &p1, const T &p2, const T &p3, float t) {
-
const float t2 = t * t;
const float t3 = t2 * t;
- return 0.5f * ((2.0f * p1) + (-p0 + p2) * t + (2.0f * p0 - 5.0f * p1 + 4 * p2 - p3) * t2 + (-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3);
+ return 0.5f * ((2.0f * p1) + (-p0 + p2) * t + (2.0f * p0 - 5.0f * p1 + 4.0f * p2 - p3) * t2 + (-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3);
}
T bezier(T start, T control_1, T control_2, T end, float t) {
@@ -2632,7 +2725,6 @@ struct EditorSceneImporterGLTFInterpolate {
// thank you for existing, partial specialization
template <>
struct EditorSceneImporterGLTFInterpolate<Quat> {
-
Quat lerp(const Quat &a, const Quat &b, const float c) const {
ERR_FAIL_COND_V_MSG(!a.is_normalized(), Quat(), "The quaternion \"a\" must be normalized.");
ERR_FAIL_COND_V_MSG(!b.is_normalized(), Quat(), "The quaternion \"b\" must be normalized.");
@@ -2657,12 +2749,12 @@ struct EditorSceneImporterGLTFInterpolate<Quat> {
template <class T>
T EditorSceneImporterGLTF::_interpolate_track(const Vector<float> &p_times, const Vector<T> &p_values, const float p_time, const GLTFAnimation::Interpolation p_interp) {
-
//could use binary search, worth it?
int idx = -1;
for (int i = 0; i < p_times.size(); i++) {
- if (p_times[i] > p_time)
+ if (p_times[i] > p_time) {
break;
+ }
idx++;
}
@@ -2670,7 +2762,6 @@ T EditorSceneImporterGLTF::_interpolate_track(const Vector<float> &p_times, cons
switch (p_interp) {
case GLTFAnimation::INTERP_LINEAR: {
-
if (idx == -1) {
return p_values[0];
} else if (idx >= p_times.size() - 1) {
@@ -2683,7 +2774,6 @@ T EditorSceneImporterGLTF::_interpolate_track(const Vector<float> &p_times, cons
} break;
case GLTFAnimation::INTERP_STEP: {
-
if (idx == -1) {
return p_values[0];
} else if (idx >= p_times.size() - 1) {
@@ -2694,7 +2784,6 @@ T EditorSceneImporterGLTF::_interpolate_track(const Vector<float> &p_times, cons
} break;
case GLTFAnimation::INTERP_CATMULLROMSPLINE: {
-
if (idx == -1) {
return p_values[1];
} else if (idx >= p_times.size() - 1) {
@@ -2707,7 +2796,6 @@ T EditorSceneImporterGLTF::_interpolate_track(const Vector<float> &p_times, cons
} break;
case GLTFAnimation::INTERP_CUBIC_SPLINE: {
-
if (idx == -1) {
return p_values[1];
} else if (idx >= p_times.size() - 1) {
@@ -2730,7 +2818,6 @@ T EditorSceneImporterGLTF::_interpolate_track(const Vector<float> &p_times, cons
}
void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlayer *ap, const GLTFAnimationIndex index, const int bake_fps) {
-
const GLTFAnimation &anim = state.animations[index];
String name = anim.name;
@@ -2750,7 +2837,6 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
float length = 0;
for (Map<int, GLTFAnimation::Track>::Element *E = anim.tracks.front(); E; E = E->next()) {
-
const GLTFAnimation::Track &track = E->get();
//need to find the path
NodePath node_path;
@@ -2764,7 +2850,7 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
const GLTFNode *node = state.nodes[E->key()];
if (node->skeleton >= 0) {
- const Skeleton *sk = Object::cast_to<Skeleton>(state.scene_nodes.find(node_index)->get());
+ const Skeleton3D *sk = Object::cast_to<Skeleton3D>(state.scene_nodes.find(node_index)->get());
ERR_FAIL_COND(sk == nullptr);
const String path = ap->get_parent()->get_path_to(sk);
@@ -2795,6 +2881,7 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
int track_idx = animation->get_track_count();
animation->add_track(Animation::TYPE_TRANSFORM);
animation->track_set_path(track_idx, node_path);
+ animation->track_set_imported(track_idx, true);
//first determine animation length
const float increment = 1.0 / float(bake_fps);
@@ -2818,7 +2905,6 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
bool last = false;
while (true) {
-
Vector3 pos = base_pos;
Quat rot = base_rot;
Vector3 scale = base_scale;
@@ -2836,12 +2922,11 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
}
if (node->skeleton >= 0) {
-
Transform xform;
xform.basis.set_quat_scale(rot, scale);
xform.origin = pos;
- const Skeleton *skeleton = state.skeletons[node->skeleton].godot_skeleton;
+ const Skeleton3D *skeleton = state.skeletons[node->skeleton].godot_skeleton;
const int bone_idx = skeleton->find_bone(node->name);
xform = skeleton->get_bone_rest(bone_idx).affine_inverse() * xform;
@@ -2910,7 +2995,7 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
ap->add_animation(name, animation);
}
-void EditorSceneImporterGLTF::_process_mesh_instances(GLTFState &state, Spatial *scene_root) {
+void EditorSceneImporterGLTF::_process_mesh_instances(GLTFState &state, Node3D *scene_root) {
for (GLTFNodeIndex node_i = 0; node_i < state.nodes.size(); ++node_i) {
const GLTFNode *node = state.nodes[node_i];
@@ -2918,12 +3003,12 @@ void EditorSceneImporterGLTF::_process_mesh_instances(GLTFState &state, Spatial
const GLTFSkinIndex skin_i = node->skin;
Map<GLTFNodeIndex, Node *>::Element *mi_element = state.scene_nodes.find(node_i);
- MeshInstance *mi = Object::cast_to<MeshInstance>(mi_element->get());
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(mi_element->get());
ERR_FAIL_COND(mi == nullptr);
const GLTFSkeletonIndex skel_i = state.skins[node->skin].skeleton;
const GLTFSkeleton &gltf_skeleton = state.skeletons[skel_i];
- Skeleton *skeleton = gltf_skeleton.godot_skeleton;
+ Skeleton3D *skeleton = gltf_skeleton.godot_skeleton;
ERR_FAIL_COND(skeleton == nullptr);
mi->get_parent()->remove_child(mi);
@@ -2937,9 +3022,8 @@ void EditorSceneImporterGLTF::_process_mesh_instances(GLTFState &state, Spatial
}
}
-Spatial *EditorSceneImporterGLTF::_generate_scene(GLTFState &state, const int p_bake_fps) {
-
- Spatial *root = memnew(Spatial);
+Node3D *EditorSceneImporterGLTF::_generate_scene(GLTFState &state, const int p_bake_fps) {
+ Node3D *root = memnew(Node3D);
// scene_name is already unique
root->set_name(state.scene_name);
@@ -2965,119 +3049,142 @@ Spatial *EditorSceneImporterGLTF::_generate_scene(GLTFState &state, const int p_
}
Node *EditorSceneImporterGLTF::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
-
GLTFState state;
if (p_path.to_lower().ends_with("glb")) {
//binary file
//text file
Error err = _parse_glb(p_path, state);
- if (err)
- return NULL;
+ if (err) {
+ return nullptr;
+ }
} else {
//text file
Error err = _parse_json(p_path, state);
- if (err)
- return NULL;
+ if (err) {
+ return nullptr;
+ }
}
- ERR_FAIL_COND_V(!state.json.has("asset"), NULL);
+ ERR_FAIL_COND_V(!state.json.has("asset"), nullptr);
Dictionary asset = state.json["asset"];
- ERR_FAIL_COND_V(!asset.has("version"), NULL);
+ ERR_FAIL_COND_V(!asset.has("version"), nullptr);
String version = asset["version"];
+ state.import_flags = p_flags;
state.major_version = version.get_slice(".", 0).to_int();
state.minor_version = version.get_slice(".", 1).to_int();
+ state.use_named_skin_binds = p_flags & IMPORT_USE_NAMED_SKIN_BINDS;
/* STEP 0 PARSE SCENE */
Error err = _parse_scenes(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 1 PARSE NODES */
err = _parse_nodes(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 2 PARSE BUFFERS */
err = _parse_buffers(state, p_path.get_base_dir());
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 3 PARSE BUFFER VIEWS */
err = _parse_buffer_views(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 4 PARSE ACCESSORS */
err = _parse_accessors(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 5 PARSE IMAGES */
err = _parse_images(state, p_path.get_base_dir());
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 6 PARSE TEXTURES */
err = _parse_textures(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 7 PARSE TEXTURES */
err = _parse_materials(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 9 PARSE SKINS */
err = _parse_skins(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 10 DETERMINE SKELETONS */
err = _determine_skeletons(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 11 CREATE SKELETONS */
err = _create_skeletons(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 12 CREATE SKINS */
err = _create_skins(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
/* STEP 13 PARSE MESHES (we have enough info now) */
err = _parse_meshes(state);
- if (err != OK)
+ if (err != OK) {
+ return nullptr;
+ }
+
+ /* STEP 14 PARSE LIGHTS */
+ err = _parse_lights(state);
+ if (err != OK) {
return NULL;
+ }
- /* STEP 14 PARSE CAMERAS */
+ /* STEP 15 PARSE CAMERAS */
err = _parse_cameras(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
- /* STEP 15 PARSE ANIMATIONS */
+ /* STEP 16 PARSE ANIMATIONS */
err = _parse_animations(state);
- if (err != OK)
- return NULL;
+ if (err != OK) {
+ return nullptr;
+ }
- /* STEP 16 ASSIGN SCENE NAMES */
+ /* STEP 17 ASSIGN SCENE NAMES */
_assign_scene_names(state);
- /* STEP 17 MAKE SCENE! */
- Spatial *scene = _generate_scene(state, p_bake_fps);
+ /* STEP 18 MAKE SCENE! */
+ Node3D *scene = _generate_scene(state, p_bake_fps);
return scene;
}
Ref<Animation> EditorSceneImporterGLTF::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
-
return Ref<Animation>();
}
diff --git a/editor/import/editor_scene_importer_gltf.h b/editor/import/editor_scene_importer_gltf.h
index 78d7106b0d..bd30f8f1dd 100644
--- a/editor/import/editor_scene_importer_gltf.h
+++ b/editor/import/editor_scene_importer_gltf.h
@@ -32,15 +32,15 @@
#define EDITOR_SCENE_IMPORTER_GLTF_H
#include "editor/import/resource_importer_scene.h"
-#include "scene/3d/skeleton.h"
-#include "scene/3d/spatial.h"
+#include "scene/3d/light_3d.h"
+#include "scene/3d/node_3d.h"
+#include "scene/3d/skeleton_3d.h"
class AnimationPlayer;
-class BoneAttachment;
-class MeshInstance;
+class BoneAttachment3D;
+class MeshInstance3D;
class EditorSceneImporterGLTF : public EditorSceneImporter {
-
GDCLASS(EditorSceneImporterGLTF, EditorSceneImporter);
typedef int GLTFAccessorIndex;
@@ -51,6 +51,7 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
typedef int GLTFImageIndex;
typedef int GLTFMaterialIndex;
typedef int GLTFMeshIndex;
+ typedef int GLTFLightIndex;
typedef int GLTFNodeIndex;
typedef int GLTFSkeletonIndex;
typedef int GLTFSkinIndex;
@@ -92,92 +93,61 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
String _get_type_name(const GLTFType p_component);
struct GLTFNode {
-
//matrices need to be transformed to this
- GLTFNodeIndex parent;
- int height;
+ GLTFNodeIndex parent = -1;
+ int height = -1;
Transform xform;
String name;
- GLTFMeshIndex mesh;
- GLTFCameraIndex camera;
- GLTFSkinIndex skin;
+ GLTFMeshIndex mesh = -1;
+ GLTFCameraIndex camera = -1;
+ GLTFSkinIndex skin = -1;
- GLTFSkeletonIndex skeleton;
- bool joint;
+ GLTFSkeletonIndex skeleton = -1;
+ bool joint = false;
Vector3 translation;
Quat rotation;
- Vector3 scale;
+ Vector3 scale = Vector3(1, 1, 1);
Vector<int> children;
- GLTFNodeIndex fake_joint_parent;
-
- GLTFNode() :
- parent(-1),
- height(-1),
- mesh(-1),
- camera(-1),
- skin(-1),
- skeleton(-1),
- joint(false),
- translation(0, 0, 0),
- scale(Vector3(1, 1, 1)),
- fake_joint_parent(-1) {}
+ GLTFNodeIndex fake_joint_parent = -1;
+
+ GLTFLightIndex light = -1;
+
+ GLTFNode() {}
};
struct GLTFBufferView {
-
- GLTFBufferIndex buffer;
- int byte_offset;
- int byte_length;
- int byte_stride;
- bool indices;
+ GLTFBufferIndex buffer = -1;
+ int byte_offset = 0;
+ int byte_length = 0;
+ int byte_stride = 0;
+ bool indices = false;
//matrices need to be transformed to this
- GLTFBufferView() :
- buffer(-1),
- byte_offset(0),
- byte_length(0),
- byte_stride(0),
- indices(false) {
- }
+ GLTFBufferView() {}
};
struct GLTFAccessor {
-
- GLTFBufferViewIndex buffer_view;
- int byte_offset;
- int component_type;
- bool normalized;
- int count;
+ GLTFBufferViewIndex buffer_view = 0;
+ int byte_offset = 0;
+ int component_type = 0;
+ bool normalized = false;
+ int count = 0;
GLTFType type;
- float min;
- float max;
- int sparse_count;
- int sparse_indices_buffer_view;
- int sparse_indices_byte_offset;
- int sparse_indices_component_type;
- int sparse_values_buffer_view;
- int sparse_values_byte_offset;
-
- GLTFAccessor() {
- buffer_view = 0;
- byte_offset = 0;
- component_type = 0;
- normalized = false;
- count = 0;
- min = 0;
- max = 0;
- sparse_count = 0;
- sparse_indices_buffer_view = 0;
- sparse_indices_byte_offset = 0;
- sparse_indices_component_type = 0;
- sparse_values_buffer_view = 0;
- sparse_values_byte_offset = 0;
- }
+ float min = 0;
+ float max = 0;
+ int sparse_count = 0;
+ int sparse_indices_buffer_view = 0;
+ int sparse_indices_byte_offset = 0;
+ int sparse_indices_component_type = 0;
+ int sparse_values_buffer_view = 0;
+ int sparse_values_byte_offset = 0;
+
+ GLTFAccessor() {}
};
struct GLTFTexture {
GLTFImageIndex src_image;
@@ -192,21 +162,19 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
Vector<GLTFNodeIndex> roots;
// The created Skeleton for the scene
- Skeleton *godot_skeleton;
+ Skeleton3D *godot_skeleton = nullptr;
// Set of unique bone names for the skeleton
Set<String> unique_names;
- GLTFSkeleton() :
- godot_skeleton(nullptr) {
- }
+ GLTFSkeleton() {}
};
struct GLTFSkin {
String name;
// The "skeleton" property defined in the gltf spec. -1 = Scene Root
- GLTFNodeIndex skin_root;
+ GLTFNodeIndex skin_root = -1;
Vector<GLTFNodeIndex> joints_original;
Vector<Transform> inverse_binds;
@@ -226,19 +194,18 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
Vector<GLTFNodeIndex> roots;
// The GLTF Skeleton this Skin points to (after we determine skeletons)
- GLTFSkeletonIndex skeleton;
+ GLTFSkeletonIndex skeleton = -1;
// A mapping from the joint indices (in the order of joints_original) to the
// Godot Skeleton's bone_indices
Map<int, int> joint_i_to_bone_i;
+ Map<int, StringName> joint_i_to_name;
// The Actual Skin that will be created as a mapping between the IBM's of this skin
// to the generated skeleton for the mesh instances.
Ref<Skin> godot_skin;
- GLTFSkin() :
- skin_root(-1),
- skeleton(-1) {}
+ GLTFSkin() {}
};
struct GLTFMesh {
@@ -247,18 +214,23 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
};
struct GLTFCamera {
+ bool perspective = true;
+ float fov_size = 64;
+ float zfar = 500;
+ float znear = 0.1;
- bool perspective;
- float fov_size;
- float zfar;
- float znear;
+ GLTFCamera() {}
+ };
- GLTFCamera() {
- perspective = true;
- fov_size = 65;
- zfar = 500;
- znear = 0.1;
- }
+ struct GLTFLight {
+ Color color = Color(1.0f, 1.0f, 1.0f);
+ float intensity = 1.0f;
+ String type = "";
+ float range = Math_INF;
+ float inner_cone_angle = 0.0f;
+ float outer_cone_angle = Math_PI / 4.0;
+
+ GLTFLight() {}
};
struct GLTFAnimation {
@@ -279,11 +251,10 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
};
struct Track {
-
Channel<Vector3> translation_track;
Channel<Quat> rotation_track;
Channel<Vector3> scale_track;
- Vector<Channel<float> > weight_tracks;
+ Vector<Channel<float>> weight_tracks;
};
String name;
@@ -292,28 +263,30 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
};
struct GLTFState {
-
Dictionary json;
int major_version;
int minor_version;
Vector<uint8_t> glb_data;
+ bool use_named_skin_binds;
+
Vector<GLTFNode *> nodes;
- Vector<Vector<uint8_t> > buffers;
+ Vector<Vector<uint8_t>> buffers;
Vector<GLTFBufferView> buffer_views;
Vector<GLTFAccessor> accessors;
Vector<GLTFMesh> meshes; //meshes are loaded directly, no reason not to.
- Vector<Ref<Material> > materials;
+ Vector<Ref<Material>> materials;
String scene_name;
Vector<int> root_nodes;
Vector<GLTFTexture> textures;
- Vector<Ref<Texture> > images;
+ Vector<Ref<Texture2D>> images;
Vector<GLTFSkin> skins;
Vector<GLTFCamera> cameras;
+ Vector<GLTFLight> lights;
Set<String> unique_names;
@@ -322,6 +295,9 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
Map<GLTFNodeIndex, Node *> scene_nodes;
+ // EditorSceneImporter::ImportFlags
+ uint32_t import_flags;
+
~GLTFState() {
for (int i = 0; i < nodes.size(); i++) {
memdelete(nodes[i]);
@@ -335,7 +311,7 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
String _sanitize_bone_name(const String &name);
String _gen_unique_bone_name(GLTFState &state, const GLTFSkeletonIndex skel_i, const String &p_name);
- Ref<Texture> _get_texture(GLTFState &state, const GLTFTextureIndex p_texture);
+ Ref<Texture2D> _get_texture(GLTFState &state, const GLTFTextureIndex p_texture);
Error _parse_json(const String &p_path, GLTFState &state);
Error _parse_glb(const String &p_path, GLTFState &state);
@@ -352,11 +328,11 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
Error _decode_buffer_view(GLTFState &state, double *dst, const GLTFBufferViewIndex p_buffer_view, const int skip_every, const int skip_bytes, const int element_size, const int count, const GLTFType type, const int component_count, const int component_type, const int component_size, const bool normalized, const int byte_offset, const bool for_vertex);
Vector<double> _decode_accessor(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
- PoolVector<float> _decode_accessor_as_floats(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
- PoolVector<int> _decode_accessor_as_ints(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
- PoolVector<Vector2> _decode_accessor_as_vec2(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
- PoolVector<Vector3> _decode_accessor_as_vec3(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
- PoolVector<Color> _decode_accessor_as_color(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
+ Vector<float> _decode_accessor_as_floats(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
+ Vector<int> _decode_accessor_as_ints(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
+ Vector<Vector2> _decode_accessor_as_vec2(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
+ Vector<Vector3> _decode_accessor_as_vec3(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
+ Vector<Color> _decode_accessor_as_color(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
Vector<Quat> _decode_accessor_as_quat(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
Vector<Transform2D> _decode_accessor_as_xform2d(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
Vector<Basis> _decode_accessor_as_basis(GLTFState &state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex);
@@ -389,18 +365,19 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
void _remove_duplicate_skins(GLTFState &state);
Error _parse_cameras(GLTFState &state);
-
+ Error _parse_lights(GLTFState &state);
Error _parse_animations(GLTFState &state);
- BoneAttachment *_generate_bone_attachment(GLTFState &state, Skeleton *skeleton, const GLTFNodeIndex node_index);
- MeshInstance *_generate_mesh_instance(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index);
- Camera *_generate_camera(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index);
- Spatial *_generate_spatial(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index);
+ BoneAttachment3D *_generate_bone_attachment(GLTFState &state, Skeleton3D *skeleton, const GLTFNodeIndex node_index);
+ MeshInstance3D *_generate_mesh_instance(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index);
+ Camera3D *_generate_camera(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index);
+ Light3D *_generate_light(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index);
+ Node3D *_generate_spatial(GLTFState &state, Node *scene_parent, const GLTFNodeIndex node_index);
- void _generate_scene_node(GLTFState &state, Node *scene_parent, Spatial *scene_root, const GLTFNodeIndex node_index);
- Spatial *_generate_scene(GLTFState &state, const int p_bake_fps);
+ void _generate_scene_node(GLTFState &state, Node *scene_parent, Node3D *scene_root, const GLTFNodeIndex node_index);
+ Node3D *_generate_scene(GLTFState &state, const int p_bake_fps);
- void _process_mesh_instances(GLTFState &state, Spatial *scene_root);
+ void _process_mesh_instances(GLTFState &state, Node3D *scene_root);
void _assign_scene_names(GLTFState &state);
@@ -410,10 +387,10 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
void _import_animation(GLTFState &state, AnimationPlayer *ap, const GLTFAnimationIndex index, const int bake_fps);
public:
- virtual uint32_t get_import_flags() const;
- virtual void get_extensions(List<String> *r_extensions) const;
- virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps = NULL, Error *r_err = NULL);
- virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps);
+ virtual uint32_t get_import_flags() const override;
+ virtual void get_extensions(List<String> *r_extensions) const override;
+ virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps = nullptr, Error *r_err = nullptr) override;
+ virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) override;
EditorSceneImporterGLTF();
};
diff --git a/editor/import/resource_importer_bitmask.cpp b/editor/import/resource_importer_bitmask.cpp
index c6fdbd1378..da2d1c9bdf 100644
--- a/editor/import/resource_importer_bitmask.cpp
+++ b/editor/import/resource_importer_bitmask.cpp
@@ -38,55 +38,51 @@
#include "scene/resources/texture.h"
String ResourceImporterBitMap::get_importer_name() const {
-
return "bitmap";
}
String ResourceImporterBitMap::get_visible_name() const {
-
return "BitMap";
}
-void ResourceImporterBitMap::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterBitMap::get_recognized_extensions(List<String> *p_extensions) const {
ImageLoader::get_recognized_extensions(p_extensions);
}
+
String ResourceImporterBitMap::get_save_extension() const {
return "res";
}
String ResourceImporterBitMap::get_resource_type() const {
-
return "BitMap";
}
bool ResourceImporterBitMap::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
return true;
}
int ResourceImporterBitMap::get_preset_count() const {
return 0;
}
-String ResourceImporterBitMap::get_preset_name(int p_idx) const {
+String ResourceImporterBitMap::get_preset_name(int p_idx) const {
return String();
}
void ResourceImporterBitMap::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "create_from", PROPERTY_HINT_ENUM, "Black & White,Alpha"), 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "threshold", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.5));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "threshold", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.5));
}
Error ResourceImporterBitMap::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
int create_from = p_options["create_from"];
float threshold = p_options["threshold"];
Ref<Image> image;
image.instance();
Error err = ImageLoader::load_image(p_source_file, image);
- if (err != OK)
+ if (err != OK) {
return err;
+ }
int w = image->get_width();
int h = image->get_height();
@@ -94,11 +90,9 @@ Error ResourceImporterBitMap::import(const String &p_source_file, const String &
Ref<BitMap> bitmap;
bitmap.instance();
bitmap->create(Size2(w, h));
- image->lock();
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
-
bool bit;
Color c = image->get_pixel(j, i);
if (create_from == 0) { //b&W
diff --git a/editor/import/resource_importer_bitmask.h b/editor/import/resource_importer_bitmask.h
index dd95cb687a..0d3cb23697 100644
--- a/editor/import/resource_importer_bitmask.h
+++ b/editor/import/resource_importer_bitmask.h
@@ -40,18 +40,18 @@ class ResourceImporterBitMap : public ResourceImporter {
GDCLASS(ResourceImporterBitMap, ResourceImporter);
public:
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
-
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
-
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
+
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
+
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
ResourceImporterBitMap();
~ResourceImporterBitMap();
diff --git a/editor/import/resource_importer_csv.cpp b/editor/import/resource_importer_csv.cpp
index 424f90bd54..d29ba28a96 100644
--- a/editor/import/resource_importer_csv.cpp
+++ b/editor/import/resource_importer_csv.cpp
@@ -34,16 +34,14 @@
#include "core/os/file_access.h"
String ResourceImporterCSV::get_importer_name() const {
-
return "csv";
}
String ResourceImporterCSV::get_visible_name() const {
-
return "CSV";
}
-void ResourceImporterCSV::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterCSV::get_recognized_extensions(List<String> *p_extensions) const {
p_extensions->push_back("csv");
}
@@ -52,20 +50,18 @@ String ResourceImporterCSV::get_save_extension() const {
}
String ResourceImporterCSV::get_resource_type() const {
-
return "TextFile";
}
bool ResourceImporterCSV::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
return true;
}
int ResourceImporterCSV::get_preset_count() const {
return 0;
}
-String ResourceImporterCSV::get_preset_name(int p_idx) const {
+String ResourceImporterCSV::get_preset_name(int p_idx) const {
return "";
}
diff --git a/editor/import/resource_importer_csv.h b/editor/import/resource_importer_csv.h
index 2030dd1f99..c9fbe75dd2 100644
--- a/editor/import/resource_importer_csv.h
+++ b/editor/import/resource_importer_csv.h
@@ -37,19 +37,19 @@ class ResourceImporterCSV : public ResourceImporter {
GDCLASS(ResourceImporterCSV, ResourceImporter);
public:
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
ResourceImporterCSV();
};
diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp
index 3119fb088b..04e20dee86 100644
--- a/editor/import/resource_importer_csv_translation.cpp
+++ b/editor/import/resource_importer_csv_translation.cpp
@@ -36,16 +36,14 @@
#include "core/translation.h"
String ResourceImporterCSVTranslation::get_importer_name() const {
-
return "csv_translation";
}
String ResourceImporterCSVTranslation::get_visible_name() const {
-
return "CSV Translation";
}
-void ResourceImporterCSVTranslation::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterCSVTranslation::get_recognized_extensions(List<String> *p_extensions) const {
p_extensions->push_back("csv");
}
@@ -54,38 +52,40 @@ String ResourceImporterCSVTranslation::get_save_extension() const {
}
String ResourceImporterCSVTranslation::get_resource_type() const {
-
return "Translation";
}
bool ResourceImporterCSVTranslation::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
return true;
}
int ResourceImporterCSVTranslation::get_preset_count() const {
return 0;
}
-String ResourceImporterCSVTranslation::get_preset_name(int p_idx) const {
+String ResourceImporterCSVTranslation::get_preset_name(int p_idx) const {
return "";
}
void ResourceImporterCSVTranslation::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "compress"), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "delimiter", PROPERTY_HINT_ENUM, "Comma,Semicolon,Tab"), 0));
}
Error ResourceImporterCSVTranslation::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
bool compress = p_options["compress"];
String delimiter;
switch ((int)p_options["delimiter"]) {
- case 0: delimiter = ","; break;
- case 1: delimiter = ";"; break;
- case 2: delimiter = "\t"; break;
+ case 0:
+ delimiter = ",";
+ break;
+ case 1:
+ delimiter = ";";
+ break;
+ case 2:
+ delimiter = "\t";
+ break;
}
FileAccessRef f = FileAccess::open(p_source_file, FileAccess::READ);
@@ -96,10 +96,9 @@ Error ResourceImporterCSVTranslation::import(const String &p_source_file, const
ERR_FAIL_COND_V(line.size() <= 1, ERR_PARSE_ERROR);
Vector<String> locales;
- Vector<Ref<Translation> > translations;
+ Vector<Ref<Translation>> translations;
for (int i = 1; i < line.size(); i++) {
-
String locale = line[i];
ERR_FAIL_COND_V_MSG(!TranslationServer::is_locale_valid(locale), ERR_PARSE_ERROR, "Error importing CSV translation: '" + locale + "' is not a valid locale.");
@@ -113,10 +112,8 @@ Error ResourceImporterCSVTranslation::import(const String &p_source_file, const
line = f->get_csv_line(delimiter);
while (line.size() == locales.size() + 1) {
-
String key = line[0];
if (key != "") {
-
for (int i = 1; i < line.size(); i++) {
translations.write[i - 1]->add_message(key, line[i].c_unescape());
}
diff --git a/editor/import/resource_importer_csv_translation.h b/editor/import/resource_importer_csv_translation.h
index ec33d6aa16..7c7646b640 100644
--- a/editor/import/resource_importer_csv_translation.h
+++ b/editor/import/resource_importer_csv_translation.h
@@ -37,19 +37,19 @@ class ResourceImporterCSVTranslation : public ResourceImporter {
GDCLASS(ResourceImporterCSVTranslation, ResourceImporter);
public:
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
ResourceImporterCSVTranslation();
};
diff --git a/editor/import/resource_importer_image.cpp b/editor/import/resource_importer_image.cpp
index a1f5a79b00..885b00865b 100644
--- a/editor/import/resource_importer_image.cpp
+++ b/editor/import/resource_importer_image.cpp
@@ -36,16 +36,14 @@
#include "scene/resources/texture.h"
String ResourceImporterImage::get_importer_name() const {
-
return "image";
}
String ResourceImporterImage::get_visible_name() const {
-
return "Image";
}
-void ResourceImporterImage::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterImage::get_recognized_extensions(List<String> *p_extensions) const {
ImageLoader::get_recognized_extensions(p_extensions);
}
@@ -54,20 +52,18 @@ String ResourceImporterImage::get_save_extension() const {
}
String ResourceImporterImage::get_resource_type() const {
-
return "Image";
}
bool ResourceImporterImage::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
return true;
}
int ResourceImporterImage::get_preset_count() const {
return 0;
}
-String ResourceImporterImage::get_preset_name(int p_idx) const {
+String ResourceImporterImage::get_preset_name(int p_idx) const {
return String();
}
@@ -75,7 +71,6 @@ void ResourceImporterImage::get_import_options(List<ImportOption> *r_options, in
}
Error ResourceImporterImage::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
FileAccess *f = FileAccess::open(p_source_file, FileAccess::READ);
ERR_FAIL_COND_V_MSG(!f, ERR_CANT_OPEN, "Cannot open file from path '" + p_source_file + "'.");
diff --git a/editor/import/resource_importer_image.h b/editor/import/resource_importer_image.h
index 6ad77eec1b..dc9c2c3014 100644
--- a/editor/import/resource_importer_image.h
+++ b/editor/import/resource_importer_image.h
@@ -38,19 +38,19 @@ class ResourceImporterImage : public ResourceImporter {
GDCLASS(ResourceImporterImage, ResourceImporter);
public:
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
ResourceImporterImage();
};
diff --git a/editor/import/resource_importer_layered_texture.cpp b/editor/import/resource_importer_layered_texture.cpp
index 9b819bc341..bbf62596d0 100644
--- a/editor/import/resource_importer_layered_texture.cpp
+++ b/editor/import/resource_importer_layered_texture.cpp
@@ -36,208 +36,338 @@
#include "core/io/image_loader.h"
#include "editor/editor_file_system.h"
#include "editor/editor_node.h"
+#include "resource_importer_texture.h"
#include "scene/resources/texture.h"
String ResourceImporterLayeredTexture::get_importer_name() const {
+ switch (mode) {
+ case MODE_CUBEMAP: {
+ return "cubemap_texture";
+ } break;
+ case MODE_2D_ARRAY: {
+ return "2d_array_texture";
+ } break;
+ case MODE_CUBEMAP_ARRAY: {
+ return "cubemap_array_texture";
+ } break;
+ case MODE_3D: {
+ return "cubemap_3d_texture";
+ } break;
+ }
- return is_3d ? "texture_3d" : "texture_array";
+ ERR_FAIL_V("");
}
String ResourceImporterLayeredTexture::get_visible_name() const {
+ switch (mode) {
+ case MODE_CUBEMAP: {
+ return "Cubemap";
+ } break;
+ case MODE_2D_ARRAY: {
+ return "Texture2DArray";
+ } break;
+ case MODE_CUBEMAP_ARRAY: {
+ return "CubemapArray";
+ } break;
+ case MODE_3D: {
+ return "Texture3D";
+ } break;
+ }
- return is_3d ? "Texture3D" : "TextureArray";
+ ERR_FAIL_V("");
}
-void ResourceImporterLayeredTexture::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterLayeredTexture::get_recognized_extensions(List<String> *p_extensions) const {
ImageLoader::get_recognized_extensions(p_extensions);
}
+
String ResourceImporterLayeredTexture::get_save_extension() const {
- return is_3d ? "tex3d" : "texarr";
+ switch (mode) {
+ case MODE_CUBEMAP: {
+ return "scube";
+ } break;
+ case MODE_2D_ARRAY: {
+ return "stexarray";
+ } break;
+ case MODE_CUBEMAP_ARRAY: {
+ return "scubearray";
+ } break;
+ case MODE_3D: {
+ return "stex3d";
+ } break;
+ }
+
+ ERR_FAIL_V(String());
}
String ResourceImporterLayeredTexture::get_resource_type() const {
-
- return is_3d ? "Texture3D" : "TextureArray";
+ switch (mode) {
+ case MODE_CUBEMAP: {
+ return "StreamCubemap";
+ } break;
+ case MODE_2D_ARRAY: {
+ return "StreamTexture2DArray";
+ } break;
+ case MODE_CUBEMAP_ARRAY: {
+ return "StreamCubemapArray";
+ } break;
+ case MODE_3D: {
+ return "StreamTexture3D";
+ } break;
+ }
+ ERR_FAIL_V(String());
}
bool ResourceImporterLayeredTexture::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
+ if (p_option == "compress/lossy_quality" && p_options.has("compress/mode")) {
+ return int(p_options["compress/mode"]) == COMPRESS_LOSSY;
+ }
return true;
}
int ResourceImporterLayeredTexture::get_preset_count() const {
- return 3;
+ return 0;
}
-String ResourceImporterLayeredTexture::get_preset_name(int p_idx) const {
- static const char *preset_names[] = {
- "3D",
- "2D",
- "ColorCorrect"
- };
-
- return preset_names[p_idx];
+String ResourceImporterLayeredTexture::get_preset_name(int p_idx) const {
+ return "";
}
void ResourceImporterLayeredTexture::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Lossless,Video RAM,Uncompressed", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), p_preset == PRESET_3D ? 1 : 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "compress/no_bptc_if_rgb"), false));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "flags/repeat", PROPERTY_HINT_ENUM, "Disabled,Enabled,Mirrored"), 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "flags/filter"), true));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "flags/mipmaps"), p_preset == PRESET_COLOR_CORRECT ? 0 : 1));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "flags/srgb", PROPERTY_HINT_ENUM, "Disable,Enable"), p_preset == PRESET_3D ? 1 : 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/horizontal", PROPERTY_HINT_RANGE, "1,256,1"), p_preset == PRESET_COLOR_CORRECT ? 16 : 8));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/vertical", PROPERTY_HINT_RANGE, "1,256,1"), p_preset == PRESET_COLOR_CORRECT ? 1 : 8));
-}
-
-void ResourceImporterLayeredTexture::_save_tex(const Vector<Ref<Image> > &p_images, const String &p_to_path, int p_compress_mode, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags) {
-
- FileAccess *f = FileAccess::open(p_to_path, FileAccess::WRITE);
- f->store_8('G');
- f->store_8('D');
- if (is_3d) {
- f->store_8('3');
- } else {
- f->store_8('A');
- }
- f->store_8('T'); //godot streamable texture
-
- f->store_32(p_images[0]->get_width());
- f->store_32(p_images[0]->get_height());
- f->store_32(p_images.size()); //depth
- f->store_32(p_texture_flags);
- if (p_compress_mode != COMPRESS_VIDEO_RAM) {
- //vram needs to do a first compression to tell what the format is, for the rest its ok
- f->store_32(p_images[0]->get_format());
- f->store_32(p_compress_mode); // 0 - lossless (PNG), 1 - vram, 2 - uncompressed
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Lossless (PNG),Lossy (WebP),Video RAM (S3TC/ETC/BPTC),Uncompressed,Basis Universal", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 1));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "compress/lossy_quality", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.7));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/hdr_compression", PROPERTY_HINT_ENUM, "Disabled,Opaque Only,Always"), 1));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/bptc_ldr", PROPERTY_HINT_ENUM, "Disabled,Enabled,RGBA Only"), 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/channel_pack", PROPERTY_HINT_ENUM, "sRGB Friendly,Optimized"), 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "mipmaps/generate"), true));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "mipmaps/limit", PROPERTY_HINT_RANGE, "-1,256"), -1));
+
+ if (mode == MODE_2D_ARRAY || mode == MODE_3D) {
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/horizontal", PROPERTY_HINT_RANGE, "1,256,1"), 8));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/vertical", PROPERTY_HINT_RANGE, "1,256,1"), 8));
}
-
- if ((p_compress_mode == COMPRESS_LOSSLESS) && p_images[0]->get_format() > Image::FORMAT_RGBA8) {
- p_compress_mode = COMPRESS_UNCOMPRESSED; //these can't go as lossy
+ if (mode == MODE_CUBEMAP || mode == MODE_CUBEMAP_ARRAY) {
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/arrangement", PROPERTY_HINT_ENUM, "1x6,2x3,3x2,6x1"), 1));
+ if (mode == MODE_CUBEMAP_ARRAY) {
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/layout", PROPERTY_HINT_ENUM, "Horizontal,Vertical"), 1));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/amount", PROPERTY_HINT_RANGE, "1,1024,1,or_greater"), 1));
+ }
}
+}
- for (int i = 0; i < p_images.size(); i++) {
-
- switch (p_compress_mode) {
- case COMPRESS_LOSSLESS: {
+void ResourceImporterLayeredTexture::_save_tex(Vector<Ref<Image>> p_images, const String &p_to_path, int p_compress_mode, float p_lossy, Image::CompressMode p_vram_compression, Image::CompressSource p_csource, Image::UsedChannels used_channels, bool p_mipmaps, bool p_force_po2) {
+ Vector<Ref<Image>> mipmap_images; //for 3D
- Ref<Image> image = p_images[i]->duplicate();
- if (p_mipmaps) {
- image->generate_mipmaps();
- } else {
- image->clear_mipmaps();
- }
+ if (mode == MODE_3D) {
+ //3D saves in its own way
- int mmc = image->get_mipmap_count() + 1;
- f->store_32(mmc);
+ for (int i = 0; i < p_images.size(); i++) {
+ if (p_images.write[i]->has_mipmaps()) {
+ p_images.write[i]->clear_mipmaps();
+ }
- for (int j = 0; j < mmc; j++) {
+ if (p_force_po2) {
+ p_images.write[i]->resize_to_po2();
+ }
+ }
- if (j > 0) {
- image->shrink_x2();
+ if (p_mipmaps) {
+ Vector<Ref<Image>> parent_images = p_images;
+ //create 3D mipmaps, this is horrible, though not used very often
+ int w = p_images[0]->get_width();
+ int h = p_images[0]->get_height();
+ int d = p_images.size();
+
+ while (w > 1 || h > 1 || d > 1) {
+ Vector<Ref<Image>> mipmaps;
+ int mm_w = MAX(1, w >> 1);
+ int mm_h = MAX(1, h >> 1);
+ int mm_d = MAX(1, d >> 1);
+
+ for (int i = 0; i < mm_d; i++) {
+ Ref<Image> mm;
+ mm.instance();
+ mm->create(mm_w, mm_h, false, p_images[0]->get_format());
+ Vector3 pos;
+ pos.z = float(i) * float(d) / float(mm_d) + 0.5;
+ for (int x = 0; x < mm_w; x++) {
+ for (int y = 0; y < mm_h; y++) {
+ pos.x = float(x) * float(w) / float(mm_w) + 0.5;
+ pos.y = float(y) * float(h) / float(mm_h) + 0.5;
+
+ Vector3i posi = Vector3i(pos);
+ Vector3 fract = pos - Vector3(posi);
+ Vector3i posi_n = posi;
+ if (posi_n.x < w - 1) {
+ posi_n.x++;
+ }
+ if (posi_n.y < h - 1) {
+ posi_n.y++;
+ }
+ if (posi_n.z < d - 1) {
+ posi_n.z++;
+ }
+
+ Color c000 = parent_images[posi.z]->get_pixel(posi.x, posi.y);
+ Color c100 = parent_images[posi.z]->get_pixel(posi_n.x, posi.y);
+ Color c010 = parent_images[posi.z]->get_pixel(posi.x, posi_n.y);
+ Color c110 = parent_images[posi.z]->get_pixel(posi_n.x, posi_n.y);
+ Color c001 = parent_images[posi_n.z]->get_pixel(posi.x, posi.y);
+ Color c101 = parent_images[posi_n.z]->get_pixel(posi_n.x, posi.y);
+ Color c011 = parent_images[posi_n.z]->get_pixel(posi.x, posi_n.y);
+ Color c111 = parent_images[posi_n.z]->get_pixel(posi_n.x, posi_n.y);
+
+ Color cx00 = c000.lerp(c100, fract.x);
+ Color cx01 = c001.lerp(c101, fract.x);
+ Color cx10 = c010.lerp(c110, fract.x);
+ Color cx11 = c011.lerp(c111, fract.x);
+
+ Color cy0 = cx00.lerp(cx10, fract.y);
+ Color cy1 = cx01.lerp(cx11, fract.y);
+
+ Color cz = cy0.lerp(cy1, fract.z);
+
+ mm->set_pixel(x, y, cz);
+ }
}
- PoolVector<uint8_t> data = Image::lossless_packer(image);
- int data_len = data.size();
- f->store_32(data_len);
-
- PoolVector<uint8_t>::Read r = data.read();
- f->store_buffer(r.ptr(), data_len);
- }
-
- } break;
- case COMPRESS_VIDEO_RAM: {
-
- Ref<Image> image = p_images[i]->duplicate();
- image->generate_mipmaps(false);
-
- Image::CompressSource csource = Image::COMPRESS_SOURCE_LAYERED;
- image->compress(p_vram_compression, csource, 0.7);
-
- if (i == 0) {
- //hack so we can properly tell the format
- f->store_32(image->get_format());
- f->store_32(p_compress_mode); // 0 - lossless (PNG), 1 - vram, 2 - uncompressed
+ mipmaps.push_back(mm);
}
- PoolVector<uint8_t> data = image->get_data();
- int dl = data.size();
+ w = mm_w;
+ h = mm_h;
+ d = mm_d;
- PoolVector<uint8_t>::Read r = data.read();
- f->store_buffer(r.ptr(), dl);
- } break;
- case COMPRESS_UNCOMPRESSED: {
+ mipmap_images.append_array(mipmaps);
+ parent_images = mipmaps;
+ }
+ }
+ } else {
+ for (int i = 0; i < p_images.size(); i++) {
+ if (p_force_po2) {
+ p_images.write[i]->resize_to_po2();
+ }
- Ref<Image> image = p_images[i]->duplicate();
+ if (p_mipmaps) {
+ p_images.write[i]->generate_mipmaps();
+ } else {
+ p_images.write[i]->clear_mipmaps();
+ }
+ }
+ }
- if (p_mipmaps) {
- image->generate_mipmaps();
- } else {
- image->clear_mipmaps();
- }
+ FileAccessRef f = FileAccess::open(p_to_path, FileAccess::WRITE);
+ f->store_8('G');
+ f->store_8('S');
+ f->store_8('T');
+ f->store_8('L');
- PoolVector<uint8_t> data = image->get_data();
- int dl = data.size();
+ f->store_32(StreamTextureLayered::FORMAT_VERSION);
+ f->store_32(p_images.size()); //2d layers or 3d depth
+ f->store_32(mode);
+ f->store_32(0);
- PoolVector<uint8_t>::Read r = data.read();
+ f->store_32(0);
+ f->store_32(mipmap_images.size()); // amount of mipmaps
+ f->store_32(0);
+ f->store_32(0);
- f->store_buffer(r.ptr(), dl);
+ for (int i = 0; i < p_images.size(); i++) {
+ ResourceImporterTexture::save_to_stex_format(f, p_images[i], ResourceImporterTexture::CompressMode(p_compress_mode), used_channels, p_vram_compression, p_lossy);
+ }
- } break;
- }
+ for (int i = 0; i < mipmap_images.size(); i++) {
+ ResourceImporterTexture::save_to_stex_format(f, mipmap_images[i], ResourceImporterTexture::CompressMode(p_compress_mode), used_channels, p_vram_compression, p_lossy);
}
- memdelete(f);
+ f->close();
}
Error ResourceImporterLayeredTexture::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
int compress_mode = p_options["compress/mode"];
- int no_bptc_if_rgb = p_options["compress/no_bptc_if_rgb"];
- int repeat = p_options["flags/repeat"];
- bool filter = p_options["flags/filter"];
- bool mipmaps = p_options["flags/mipmaps"];
- int srgb = p_options["flags/srgb"];
- int hslices = p_options["slices/horizontal"];
- int vslices = p_options["slices/vertical"];
+ float lossy = p_options["compress/lossy_quality"];
+ int hdr_compression = p_options["compress/hdr_compression"];
+ int bptc_ldr = p_options["compress/bptc_ldr"];
+ bool mipmaps = p_options["mipmaps/generate"];
+ //bool mipmap_limit = p_options["mipmaps/limit"];
+
+ int channel_pack = p_options["compress/channel_pack"];
+ int hslices = (p_options.has("slices/horizontal")) ? int(p_options["slices/horizontal"]) : 0;
+ int vslices = (p_options.has("slices/vertical")) ? int(p_options["slices/vertical"]) : 0;
+ int arrangement = (p_options.has("slices/arrangement")) ? int(p_options["slices/arrangement"]) : 0;
+ int layout = (p_options.has("slices/layout")) ? int(p_options["slices/layout"]) : 0;
+ int amount = (p_options.has("slices/amount")) ? int(p_options["slices/amount"]) : 0;
+
+ if (mode == MODE_CUBEMAP || mode == MODE_CUBEMAP_ARRAY) {
+ switch (arrangement) {
+ case CUBEMAP_FORMAT_1X6: {
+ hslices = 1;
+ vslices = 6;
+ } break;
+ case CUBEMAP_FORMAT_2X3: {
+ hslices = 2;
+ vslices = 3;
+ } break;
+ case CUBEMAP_FORMAT_3X2: {
+ hslices = 3;
+ vslices = 2;
+ } break;
+ case CUBEMAP_FORMAT_6X1: {
+ hslices = 6;
+ vslices = 1;
+ } break;
+ }
+
+ if (mode == MODE_CUBEMAP_ARRAY) {
+ if (layout == 0) {
+ hslices *= amount;
+ } else {
+ vslices *= amount;
+ }
+ }
+ }
Ref<Image> image;
image.instance();
- Error err = ImageLoader::load_image(p_source_file, image, NULL, false, 1.0);
- if (err != OK)
+ Error err = ImageLoader::load_image(p_source_file, image, nullptr, false, 1.0);
+ if (err != OK) {
return err;
+ }
- int tex_flags = 0;
- if (repeat > 0)
- tex_flags |= Texture::FLAG_REPEAT;
- if (repeat == 2)
- tex_flags |= Texture::FLAG_MIRRORED_REPEAT;
- if (filter)
- tex_flags |= Texture::FLAG_FILTER;
- if (mipmaps || compress_mode == COMPRESS_VIDEO_RAM)
- tex_flags |= Texture::FLAG_MIPMAPS;
- if (srgb == 1)
- tex_flags |= Texture::FLAG_CONVERT_TO_LINEAR;
-
- Vector<Ref<Image> > slices;
+ if (compress_mode == COMPRESS_BASIS_UNIVERSAL && image->get_format() >= Image::FORMAT_RF) {
+ //basis universal does not support float formats, fall back
+ compress_mode = COMPRESS_VRAM_COMPRESSED;
+ }
- int slice_w = image->get_width() / hslices;
- int slice_h = image->get_height() / vslices;
+ if (compress_mode == COMPRESS_VRAM_COMPRESSED) {
+ mipmaps = true;
+ }
//optimize
- if (compress_mode == COMPRESS_VIDEO_RAM) {
+ if (compress_mode == COMPRESS_VRAM_COMPRESSED) {
//if using video ram, optimize
- if (srgb) {
+ if (channel_pack == 0) {
//remove alpha if not needed, so compression is more efficient
if (image->get_format() == Image::FORMAT_RGBA8 && !image->detect_alpha()) {
image->convert(Image::FORMAT_RGB8);
}
- } else {
+ } else if (image->get_format() < Image::FORMAT_RGBA8) {
image->optimize_channels();
}
}
+ Image::CompressSource csource = Image::COMPRESS_SOURCE_GENERIC;
+ if (channel_pack == 0) {
+ csource = Image::COMPRESS_SOURCE_SRGB;
+ }
+
+ Image::UsedChannels used_channels = image->detect_used_channels(csource);
+
+ Vector<Ref<Image>> slices;
+
+ int slice_w = image->get_width() / hslices;
+ int slice_h = image->get_height() / vslices;
+
for (int i = 0; i < vslices; i++) {
for (int j = 0; j < hslices; j++) {
int x = slice_w * j;
@@ -254,58 +384,77 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const
String extension = get_save_extension();
Array formats_imported;
- if (compress_mode == COMPRESS_VIDEO_RAM) {
+ if (compress_mode == COMPRESS_VRAM_COMPRESSED) {
//must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc).
//Android, GLES 2.x
bool ok_on_pc = false;
- bool encode_bptc = false;
+ bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995);
+ bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565);
+ bool can_bptc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc");
+ bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_s3tc");
- if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc")) {
-
- encode_bptc = true;
-
- if (no_bptc_if_rgb) {
- Image::DetectChannels channels = image->get_detected_channels();
- if (channels != Image::DETECTED_LA && channels != Image::DETECTED_RGBA) {
- encode_bptc = false;
+ if (can_bptc) {
+ formats_imported.push_back("bptc"); //needs to be aded anyway
+ }
+ bool can_compress_hdr = hdr_compression > 0;
+
+ if (is_hdr && can_compress_hdr) {
+ if (used_channels == Image::USED_CHANNELS_LA || used_channels == Image::USED_CHANNELS_RGBA) {
+ //can compress hdr, but hdr with alpha is not compressible
+
+ if (hdr_compression == 2) {
+ //but user selected to compress hdr anyway, so force an alpha-less format.
+ if (image->get_format() == Image::FORMAT_RGBAF) {
+ for (int i = 0; i < slices.size(); i++) {
+ slices.write[i]->convert(Image::FORMAT_RGBF);
+ }
+
+ } else if (image->get_format() == Image::FORMAT_RGBAH) {
+ for (int i = 0; i < slices.size(); i++) {
+ slices.write[i]->convert(Image::FORMAT_RGBH);
+ }
+ }
+ } else {
+ can_compress_hdr = false;
}
}
- formats_imported.push_back("bptc");
+ if (can_compress_hdr) {
+ if (!can_bptc) {
+ //default to rgbe
+ if (image->get_format() != Image::FORMAT_RGBE9995) {
+ for (int i = 0; i < slices.size(); i++) {
+ slices.write[i]->convert(Image::FORMAT_RGBE9995);
+ }
+ }
+ }
+ } else {
+ can_bptc = false;
+ }
}
- if (encode_bptc) {
-
- _save_tex(slices, p_save_path + ".bptc." + extension, compress_mode, Image::COMPRESS_BPTC, mipmaps, tex_flags);
- r_platform_variants->push_back("bptc");
- ok_on_pc = true;
+ if (is_ldr && can_bptc) {
+ if (bptc_ldr == 0 || (bptc_ldr == 1 && !(used_channels == Image::USED_CHANNELS_LA || used_channels == Image::USED_CHANNELS_RGBA))) {
+ can_bptc = false;
+ }
}
- if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_s3tc")) {
-
- _save_tex(slices, p_save_path + ".s3tc." + extension, compress_mode, Image::COMPRESS_S3TC, mipmaps, tex_flags);
+ if (can_bptc || can_s3tc) {
+ _save_tex(slices, p_save_path + ".s3tc." + extension, compress_mode, lossy, can_bptc ? Image::COMPRESS_BPTC : Image::COMPRESS_S3TC, csource, used_channels, mipmaps, false);
r_platform_variants->push_back("s3tc");
- ok_on_pc = true;
formats_imported.push_back("s3tc");
+ ok_on_pc = true;
}
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) {
-
- _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, Image::COMPRESS_ETC2, mipmaps, tex_flags);
+ _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, lossy, Image::COMPRESS_ETC2, csource, used_channels, mipmaps, true);
r_platform_variants->push_back("etc2");
formats_imported.push_back("etc2");
}
- if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) {
- _save_tex(slices, p_save_path + ".etc." + extension, compress_mode, Image::COMPRESS_ETC, mipmaps, tex_flags);
- r_platform_variants->push_back("etc");
- formats_imported.push_back("etc");
- }
-
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) {
-
- _save_tex(slices, p_save_path + ".pvrtc." + extension, compress_mode, Image::COMPRESS_PVRTC4, mipmaps, tex_flags);
+ _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, lossy, Image::COMPRESS_ETC2, csource, used_channels, mipmaps, true);
r_platform_variants->push_back("pvrtc");
formats_imported.push_back("pvrtc");
}
@@ -315,12 +464,12 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const
}
} else {
//import normally
- _save_tex(slices, p_save_path + "." + extension, compress_mode, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, tex_flags);
+ _save_tex(slices, p_save_path + "." + extension, compress_mode, lossy, Image::COMPRESS_S3TC /* IGNORED */, csource, used_channels, mipmaps, false);
}
if (r_metadata) {
Dictionary metadata;
- metadata["vram_texture"] = compress_mode == COMPRESS_VIDEO_RAM;
+ metadata["vram_texture"] = compress_mode == COMPRESS_VRAM_COMPRESSED;
if (formats_imported.size()) {
metadata["imported_formats"] = formats_imported;
}
@@ -336,10 +485,9 @@ const char *ResourceImporterLayeredTexture::compression_formats[] = {
"etc",
"etc2",
"pvrtc",
- NULL
+ nullptr
};
String ResourceImporterLayeredTexture::get_import_settings_string() const {
-
String s;
int index = 0;
@@ -356,7 +504,6 @@ String ResourceImporterLayeredTexture::get_import_settings_string() const {
}
bool ResourceImporterLayeredTexture::are_import_settings_valid(const String &p_path) const {
-
//will become invalid if formats are missing to import
Dictionary metadata = ResourceFormatImporter::get_singleton()->get_resource_metadata(p_path);
@@ -391,12 +538,11 @@ bool ResourceImporterLayeredTexture::are_import_settings_valid(const String &p_p
return valid;
}
-ResourceImporterLayeredTexture *ResourceImporterLayeredTexture::singleton = NULL;
+ResourceImporterLayeredTexture *ResourceImporterLayeredTexture::singleton = nullptr;
ResourceImporterLayeredTexture::ResourceImporterLayeredTexture() {
-
singleton = this;
- is_3d = true;
+ mode = MODE_CUBEMAP;
}
ResourceImporterLayeredTexture::~ResourceImporterLayeredTexture() {
diff --git a/editor/import/resource_importer_layered_texture.h b/editor/import/resource_importer_layered_texture.h
index 6dc4b6ed3c..b54923be00 100644
--- a/editor/import/resource_importer_layered_texture.h
+++ b/editor/import/resource_importer_layered_texture.h
@@ -28,64 +28,108 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+/*************************************************************************/
+/* resource_importer_layered_texture.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
#ifndef RESOURCE_IMPORTER_LAYERED_TEXTURE_H
#define RESOURCE_IMPORTER_LAYERED_TEXTURE_H
#include "core/image.h"
#include "core/io/resource_importer.h"
-class StreamTexture;
+class StreamTexture2D;
class ResourceImporterLayeredTexture : public ResourceImporter {
GDCLASS(ResourceImporterLayeredTexture, ResourceImporter);
- bool is_3d;
+public:
+ enum Mode {
+ MODE_2D_ARRAY,
+ MODE_CUBEMAP,
+ MODE_CUBEMAP_ARRAY,
+ MODE_3D,
+ };
+
+ enum CubemapFormat {
+ CUBEMAP_FORMAT_1X6,
+ CUBEMAP_FORMAT_2X3,
+ CUBEMAP_FORMAT_3X2,
+ CUBEMAP_FORMAT_6X1,
+ };
+
+ enum TextureFlags {
+ TEXTURE_FLAGS_MIPMAPS = 1
+ };
+
+private:
+ Mode mode;
static const char *compression_formats[];
protected:
- static void _texture_reimport_srgb(const Ref<StreamTexture> &p_tex);
- static void _texture_reimport_3d(const Ref<StreamTexture> &p_tex);
- static void _texture_reimport_normal(const Ref<StreamTexture> &p_tex);
-
static ResourceImporterLayeredTexture *singleton;
public:
static ResourceImporterLayeredTexture *get_singleton() { return singleton; }
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
-
- enum Preset {
- PRESET_3D,
- PRESET_2D,
- PRESET_COLOR_CORRECT,
- };
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
enum CompressMode {
COMPRESS_LOSSLESS,
- COMPRESS_VIDEO_RAM,
- COMPRESS_UNCOMPRESSED
+ COMPRESS_LOSSY,
+ COMPRESS_VRAM_COMPRESSED,
+ COMPRESS_VRAM_UNCOMPRESSED,
+ COMPRESS_BASIS_UNIVERSAL
};
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
- void _save_tex(const Vector<Ref<Image> > &p_images, const String &p_to_path, int p_compress_mode, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags);
+ void _save_tex(Vector<Ref<Image>> p_images, const String &p_to_path, int p_compress_mode, float p_lossy, Image::CompressMode p_vram_compression, Image::CompressSource p_csource, Image::UsedChannels used_channels, bool p_mipmaps, bool p_force_po2);
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
void update_imports();
- virtual bool are_import_settings_valid(const String &p_path) const;
- virtual String get_import_settings_string() const;
+ virtual bool are_import_settings_valid(const String &p_path) const override;
+ virtual String get_import_settings_string() const override;
+
+ void set_mode(Mode p_mode) { mode = p_mode; }
- void set_3d(bool p_3d) { is_3d = p_3d; }
ResourceImporterLayeredTexture();
~ResourceImporterLayeredTexture();
};
+
#endif // RESOURCE_IMPORTER_LAYERED_TEXTURE_H
diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp
index b1ed59a2db..49b47bf4be 100644
--- a/editor/import/resource_importer_obj.cpp
+++ b/editor/import/resource_importer_obj.cpp
@@ -32,26 +32,23 @@
#include "core/io/resource_saver.h"
#include "core/os/file_access.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/3d/spatial.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/3d/node_3d.h"
#include "scene/resources/mesh.h"
#include "scene/resources/surface_tool.h"
uint32_t EditorOBJImporter::get_import_flags() const {
-
return IMPORT_SCENE;
}
-static Error _parse_material_library(const String &p_path, Map<String, Ref<SpatialMaterial> > &material_map, List<String> *r_missing_deps) {
-
+static Error _parse_material_library(const String &p_path, Map<String, Ref<StandardMaterial3D>> &material_map, List<String> *r_missing_deps) {
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ);
ERR_FAIL_COND_V_MSG(!f, ERR_CANT_OPEN, vformat("Couldn't open MTL file '%s', it may not exist or not be readable.", p_path));
- Ref<SpatialMaterial> current;
+ Ref<StandardMaterial3D> current;
String current_name;
String base_path = p_path.get_base_dir();
while (true) {
-
String l = f->get_line().strip_edges();
if (l.begins_with("newmtl ")) {
@@ -63,7 +60,7 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
material_map[current_name] = current;
} else if (l.begins_with("Ka ")) {
//uv
- WARN_PRINTS("OBJ: Ambient light for material '" + current_name + "' is ignored in PBR");
+ WARN_PRINT("OBJ: Ambient light for material '" + current_name + "' is ignored in PBR");
} else if (l.begins_with("Kd ")) {
//normal
@@ -102,7 +99,7 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
c.a = d;
current->set_albedo(c);
if (c.a < 0.99) {
- current->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
+ current->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
}
} else if (l.begins_with("Tr ")) {
//normal
@@ -114,12 +111,12 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
c.a = 1.0 - d;
current->set_albedo(c);
if (c.a < 0.99) {
- current->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
+ current->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
}
} else if (l.begins_with("map_Ka ")) {
//uv
- WARN_PRINTS("OBJ: Ambient light texture for material '" + current_name + "' is ignored in PBR");
+ WARN_PRINT("OBJ: Ambient light texture for material '" + current_name + "' is ignored in PBR");
} else if (l.begins_with("map_Kd ")) {
//normal
@@ -133,10 +130,10 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
path = base_path.plus_file(p);
}
- Ref<Texture> texture = ResourceLoader::load(path);
+ Ref<Texture2D> texture = ResourceLoader::load(path);
if (texture.is_valid()) {
- current->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
+ current->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, texture);
} else if (r_missing_deps) {
r_missing_deps->push_back(path);
}
@@ -153,10 +150,10 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
path = base_path.plus_file(p);
}
- Ref<Texture> texture = ResourceLoader::load(path);
+ Ref<Texture2D> texture = ResourceLoader::load(path);
if (texture.is_valid()) {
- current->set_texture(SpatialMaterial::TEXTURE_METALLIC, texture);
+ current->set_texture(StandardMaterial3D::TEXTURE_METALLIC, texture);
} else if (r_missing_deps) {
r_missing_deps->push_back(path);
}
@@ -173,10 +170,10 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
path = base_path.plus_file(p);
}
- Ref<Texture> texture = ResourceLoader::load(path);
+ Ref<Texture2D> texture = ResourceLoader::load(path);
if (texture.is_valid()) {
- current->set_texture(SpatialMaterial::TEXTURE_ROUGHNESS, texture);
+ current->set_texture(StandardMaterial3D::TEXTURE_ROUGHNESS, texture);
} else if (r_missing_deps) {
r_missing_deps->push_back(path);
}
@@ -187,11 +184,11 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
String p = l.replace("map_bump", "").replace("\\", "/").strip_edges();
String path = base_path.plus_file(p);
- Ref<Texture> texture = ResourceLoader::load(path);
+ Ref<Texture2D> texture = ResourceLoader::load(path);
if (texture.is_valid()) {
- current->set_feature(SpatialMaterial::FEATURE_NORMAL_MAPPING, true);
- current->set_texture(SpatialMaterial::TEXTURE_NORMAL, texture);
+ current->set_feature(StandardMaterial3D::FEATURE_NORMAL_MAPPING, true);
+ current->set_texture(StandardMaterial3D::TEXTURE_NORMAL, texture);
} else if (r_missing_deps) {
r_missing_deps->push_back(path);
}
@@ -203,8 +200,7 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
return OK;
}
-static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p_single_mesh, bool p_generate_tangents, bool p_optimize, Vector3 p_scale_mesh, Vector3 p_offset_mesh, List<String> *r_missing_deps) {
-
+static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_single_mesh, bool p_generate_tangents, bool p_optimize, Vector3 p_scale_mesh, Vector3 p_offset_mesh, List<String> *r_missing_deps) {
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ);
ERR_FAIL_COND_V_MSG(!f, ERR_CANT_OPEN, vformat("Couldn't open OBJ file '%s', it may not exist or not be readable.", p_path));
@@ -221,7 +217,7 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
Vector<Vector2> uvs;
String name;
- Map<String, Map<String, Ref<SpatialMaterial> > > material_map;
+ Map<String, Map<String, Ref<StandardMaterial3D>>> material_map;
Ref<SurfaceTool> surf_tool = memnew(SurfaceTool);
surf_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
@@ -231,7 +227,6 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
String current_group;
while (true) {
-
String l = f->get_line().strip_edges();
while (l.length() && l[l.length() - 1] == '\\') {
String add = f->get_line().strip_edges();
@@ -283,12 +278,10 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
ERR_FAIL_COND_V(face[0].size() != face[1].size(), ERR_FILE_CORRUPT);
for (int i = 2; i < v.size() - 1; i++) {
-
face[2] = v[i + 1].split("/");
ERR_FAIL_COND_V(face[0].size() != face[2].size(), ERR_FILE_CORRUPT);
for (int j = 0; j < 3; j++) {
-
int idx = j;
if (idx < 2) {
@@ -297,23 +290,26 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
if (face[idx].size() == 3) {
int norm = face[idx][2].to_int() - 1;
- if (norm < 0)
+ if (norm < 0) {
norm += normals.size() + 1;
+ }
ERR_FAIL_INDEX_V(norm, normals.size(), ERR_FILE_CORRUPT);
surf_tool->add_normal(normals[norm]);
}
if (face[idx].size() >= 2 && face[idx][1] != String()) {
int uv = face[idx][1].to_int() - 1;
- if (uv < 0)
+ if (uv < 0) {
uv += uvs.size() + 1;
+ }
ERR_FAIL_INDEX_V(uv, uvs.size(), ERR_FILE_CORRUPT);
surf_tool->add_uv(uvs[uv]);
}
int vtx = face[idx][0].to_int() - 1;
- if (vtx < 0)
+ if (vtx < 0) {
vtx += vertices.size() + 1;
+ }
ERR_FAIL_INDEX_V(vtx, vertices.size(), ERR_FILE_CORRUPT);
Vector3 vertex = vertices[vtx];
@@ -326,10 +322,11 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
}
} else if (l.begins_with("s ")) { //smoothing
String what = l.substr(2, l.length()).strip_edges();
- if (what == "off")
+ if (what == "off") {
surf_tool->add_smooth_group(false);
- else
+ } else {
surf_tool->add_smooth_group(true);
+ }
} else if (/*l.begins_with("g ") ||*/ l.begins_with("usemtl ") || (l.begins_with("o ") || f->eof_reached())) { //commit group to mesh
//groups are too annoying
if (surf_tool->get_vertex_array().size()) {
@@ -365,7 +362,6 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
}
if (l.begins_with("o ") || f->eof_reached()) {
-
if (!p_single_mesh) {
mesh->set_name(name);
r_meshes.push_back(mesh);
@@ -384,12 +380,10 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
}
if (l.begins_with("usemtl ")) {
-
current_material = l.replace("usemtl", "").strip_edges();
}
if (l.begins_with("g ")) {
-
current_group = l.substr(2, l.length()).strip_edges();
}
@@ -397,7 +391,7 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
current_material_library = l.replace("mtllib", "").strip_edges();
if (!material_map.has(current_material_library)) {
- Map<String, Ref<SpatialMaterial> > lib;
+ Map<String, Ref<StandardMaterial3D>> lib;
Error err = _parse_material_library(current_material_library, lib, r_missing_deps);
if (err == ERR_CANT_OPEN) {
String dir = p_path.get_base_dir();
@@ -411,7 +405,6 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
}
if (p_single_mesh) {
-
r_meshes.push_back(mesh);
}
@@ -419,8 +412,7 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
}
Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
-
- List<Ref<Mesh> > meshes;
+ List<Ref<Mesh>> meshes;
Error err = _parse_obj(p_path, meshes, false, p_flags & IMPORT_GENERATE_TANGENT_ARRAYS, p_flags & IMPORT_USE_COMPRESSION, Vector3(1, 1, 1), Vector3(0, 0, 0), r_missing_deps);
@@ -428,14 +420,13 @@ Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, in
if (r_err) {
*r_err = err;
}
- return NULL;
+ return nullptr;
}
- Spatial *scene = memnew(Spatial);
+ Node3D *scene = memnew(Node3D);
- for (List<Ref<Mesh> >::Element *E = meshes.front(); E; E = E->next()) {
-
- MeshInstance *mi = memnew(MeshInstance);
+ for (List<Ref<Mesh>>::Element *E = meshes.front(); E; E = E->next()) {
+ MeshInstance3D *mi = memnew(MeshInstance3D);
mi->set_mesh(E->get());
mi->set_name(E->get()->get_name());
scene->add_child(mi);
@@ -448,33 +439,36 @@ Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, in
return scene;
}
-Ref<Animation> EditorOBJImporter::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
+Ref<Animation> EditorOBJImporter::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
return Ref<Animation>();
}
void EditorOBJImporter::get_extensions(List<String> *r_extensions) const {
-
r_extensions->push_back("obj");
}
EditorOBJImporter::EditorOBJImporter() {
}
+
////////////////////////////////////////////////////
String ResourceImporterOBJ::get_importer_name() const {
return "wavefront_obj";
}
+
String ResourceImporterOBJ::get_visible_name() const {
return "OBJ As Mesh";
}
-void ResourceImporterOBJ::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterOBJ::get_recognized_extensions(List<String> *p_extensions) const {
p_extensions->push_back("obj");
}
+
String ResourceImporterOBJ::get_save_extension() const {
return "mesh";
}
+
String ResourceImporterOBJ::get_resource_type() const {
return "Mesh";
}
@@ -482,27 +476,26 @@ String ResourceImporterOBJ::get_resource_type() const {
int ResourceImporterOBJ::get_preset_count() const {
return 0;
}
+
String ResourceImporterOBJ::get_preset_name(int p_idx) const {
return "";
}
void ResourceImporterOBJ::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "generate_tangents"), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::VECTOR3, "scale_mesh"), Vector3(1, 1, 1)));
r_options->push_back(ImportOption(PropertyInfo(Variant::VECTOR3, "offset_mesh"), Vector3(0, 0, 0)));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "optimize_mesh"), true));
}
-bool ResourceImporterOBJ::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
+bool ResourceImporterOBJ::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
return true;
}
Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
+ List<Ref<Mesh>> meshes;
- List<Ref<Mesh> > meshes;
-
- Error err = _parse_obj(p_source_file, meshes, true, p_options["generate_tangents"], p_options["optimize_mesh"], p_options["scale_mesh"], p_options["offset_mesh"], NULL);
+ Error err = _parse_obj(p_source_file, meshes, true, p_options["generate_tangents"], p_options["optimize_mesh"], p_options["scale_mesh"], p_options["offset_mesh"], nullptr);
ERR_FAIL_COND_V(err != OK, err);
ERR_FAIL_COND_V(meshes.size() != 1, ERR_BUG);
diff --git a/editor/import/resource_importer_obj.h b/editor/import/resource_importer_obj.h
index 678be45106..4083bc7403 100644
--- a/editor/import/resource_importer_obj.h
+++ b/editor/import/resource_importer_obj.h
@@ -34,14 +34,13 @@
#include "resource_importer_scene.h"
class EditorOBJImporter : public EditorSceneImporter {
-
GDCLASS(EditorOBJImporter, EditorSceneImporter);
public:
- virtual uint32_t get_import_flags() const;
- virtual void get_extensions(List<String> *r_extensions) const;
- virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = NULL);
- virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps);
+ virtual uint32_t get_import_flags() const override;
+ virtual void get_extensions(List<String> *r_extensions) const override;
+ virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = nullptr) override;
+ virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) override;
EditorOBJImporter();
};
@@ -50,19 +49,19 @@ class ResourceImporterOBJ : public ResourceImporter {
GDCLASS(ResourceImporterOBJ, ResourceImporter);
public:
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
ResourceImporterOBJ();
};
diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp
index 0774d0b5dc..5dcdf6bec4 100644
--- a/editor/import/resource_importer_scene.cpp
+++ b/editor/import/resource_importer_scene.cpp
@@ -32,30 +32,29 @@
#include "core/io/resource_saver.h"
#include "editor/editor_node.h"
-#include "scene/3d/collision_shape.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/3d/navigation.h"
-#include "scene/3d/physics_body.h"
-#include "scene/3d/vehicle_body.h"
+#include "scene/3d/collision_shape_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/3d/navigation_3d.h"
+#include "scene/3d/physics_body_3d.h"
+#include "scene/3d/vehicle_body_3d.h"
#include "scene/animation/animation_player.h"
#include "scene/resources/animation.h"
-#include "scene/resources/box_shape.h"
+#include "scene/resources/box_shape_3d.h"
#include "scene/resources/packed_scene.h"
-#include "scene/resources/plane_shape.h"
-#include "scene/resources/ray_shape.h"
+#include "scene/resources/ray_shape_3d.h"
#include "scene/resources/resource_format_text.h"
-#include "scene/resources/sphere_shape.h"
+#include "scene/resources/sphere_shape_3d.h"
+#include "scene/resources/world_margin_shape_3d.h"
uint32_t EditorSceneImporter::get_import_flags() const {
-
if (get_script_instance()) {
return get_script_instance()->call("_get_import_flags");
}
ERR_FAIL_V(0);
}
-void EditorSceneImporter::get_extensions(List<String> *r_extensions) const {
+void EditorSceneImporter::get_extensions(List<String> *r_extensions) const {
if (get_script_instance()) {
Array arr = get_script_instance()->call("_get_extensions");
for (int i = 0; i < arr.size(); i++) {
@@ -66,39 +65,35 @@ void EditorSceneImporter::get_extensions(List<String> *r_extensions) const {
ERR_FAIL();
}
-Node *EditorSceneImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
+Node *EditorSceneImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
if (get_script_instance()) {
return get_script_instance()->call("_import_scene", p_path, p_flags, p_bake_fps);
}
- ERR_FAIL_V(NULL);
+ ERR_FAIL_V(nullptr);
}
Ref<Animation> EditorSceneImporter::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
-
if (get_script_instance()) {
return get_script_instance()->call("_import_animation", p_path, p_flags);
}
- ERR_FAIL_V(NULL);
+ ERR_FAIL_V(nullptr);
}
//for documenters, these functions are useful when an importer calls an external conversion helper (like, fbx2gltf),
//and you want to load the resulting file
Node *EditorSceneImporter::import_scene_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) {
-
return ResourceImporterScene::get_singleton()->import_scene_from_other_importer(this, p_path, p_flags, p_bake_fps);
}
Ref<Animation> EditorSceneImporter::import_animation_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) {
-
return ResourceImporterScene::get_singleton()->import_animation_from_other_importer(this, p_path, p_flags, p_bake_fps);
}
void EditorSceneImporter::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("import_scene_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneImporter::import_scene_from_other_importer);
ClassDB::bind_method(D_METHOD("import_animation_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneImporter::import_animation_from_other_importer);
@@ -126,27 +121,24 @@ void EditorSceneImporter::_bind_methods() {
/////////////////////////////////
void EditorScenePostImport::_bind_methods() {
-
BIND_VMETHOD(MethodInfo(Variant::OBJECT, "post_import", PropertyInfo(Variant::OBJECT, "scene")));
ClassDB::bind_method(D_METHOD("get_source_folder"), &EditorScenePostImport::get_source_folder);
ClassDB::bind_method(D_METHOD("get_source_file"), &EditorScenePostImport::get_source_file);
}
Node *EditorScenePostImport::post_import(Node *p_scene) {
-
- if (get_script_instance())
+ if (get_script_instance()) {
return get_script_instance()->call("post_import", p_scene);
+ }
return p_scene;
}
String EditorScenePostImport::get_source_folder() const {
-
return source_folder;
}
String EditorScenePostImport::get_source_file() const {
-
return source_file;
}
@@ -159,18 +151,15 @@ EditorScenePostImport::EditorScenePostImport() {
}
String ResourceImporterScene::get_importer_name() const {
-
return "scene";
}
String ResourceImporterScene::get_visible_name() const {
-
return "Scene";
}
void ResourceImporterScene::get_recognized_extensions(List<String> *p_extensions) const {
-
- for (Set<Ref<EditorSceneImporter> >::Element *E = importers.front(); E; E = E->next()) {
+ for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) {
E->get()->get_extensions(p_extensions);
}
}
@@ -180,27 +169,29 @@ String ResourceImporterScene::get_save_extension() const {
}
String ResourceImporterScene::get_resource_type() const {
-
return "PackedScene";
}
bool ResourceImporterScene::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
if (p_option.begins_with("animation/")) {
- if (p_option != "animation/import" && !bool(p_options["animation/import"]))
+ if (p_option != "animation/import" && !bool(p_options["animation/import"])) {
return false;
+ }
- if (p_option == "animation/keep_custom_tracks" && int(p_options["animation/storage"]) == 0)
+ if (p_option == "animation/keep_custom_tracks" && int(p_options["animation/storage"]) == 0) {
return false;
+ }
- if (p_option.begins_with("animation/optimizer/") && p_option != "animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"]))
+ if (p_option.begins_with("animation/optimizer/") && p_option != "animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"])) {
return false;
+ }
if (p_option.begins_with("animation/clip_")) {
int max_clip = p_options["animation/clips/amount"];
int clip = p_option.get_slice("/", 1).get_slice("_", 1).to_int() - 1;
- if (clip >= max_clip)
+ if (clip >= max_clip) {
return false;
+ }
}
}
@@ -218,73 +209,82 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const
int ResourceImporterScene::get_preset_count() const {
return PRESET_MAX;
}
-String ResourceImporterScene::get_preset_name(int p_idx) const {
+String ResourceImporterScene::get_preset_name(int p_idx) const {
switch (p_idx) {
- case PRESET_SINGLE_SCENE: return TTR("Import as Single Scene");
- case PRESET_SEPARATE_ANIMATIONS: return TTR("Import with Separate Animations");
- case PRESET_SEPARATE_MATERIALS: return TTR("Import with Separate Materials");
- case PRESET_SEPARATE_MESHES: return TTR("Import with Separate Objects");
- case PRESET_SEPARATE_MESHES_AND_MATERIALS: return TTR("Import with Separate Objects+Materials");
- case PRESET_SEPARATE_MESHES_AND_ANIMATIONS: return TTR("Import with Separate Objects+Animations");
- case PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS: return TTR("Import with Separate Materials+Animations");
- case PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS: return TTR("Import with Separate Objects+Materials+Animations");
- case PRESET_MULTIPLE_SCENES: return TTR("Import as Multiple Scenes");
- case PRESET_MULTIPLE_SCENES_AND_MATERIALS: return TTR("Import as Multiple Scenes+Materials");
+ case PRESET_SINGLE_SCENE:
+ return TTR("Import as Single Scene");
+ case PRESET_SEPARATE_ANIMATIONS:
+ return TTR("Import with Separate Animations");
+ case PRESET_SEPARATE_MATERIALS:
+ return TTR("Import with Separate Materials");
+ case PRESET_SEPARATE_MESHES:
+ return TTR("Import with Separate Objects");
+ case PRESET_SEPARATE_MESHES_AND_MATERIALS:
+ return TTR("Import with Separate Objects+Materials");
+ case PRESET_SEPARATE_MESHES_AND_ANIMATIONS:
+ return TTR("Import with Separate Objects+Animations");
+ case PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS:
+ return TTR("Import with Separate Materials+Animations");
+ case PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS:
+ return TTR("Import with Separate Objects+Materials+Animations");
+ case PRESET_MULTIPLE_SCENES:
+ return TTR("Import as Multiple Scenes");
+ case PRESET_MULTIPLE_SCENES_AND_MATERIALS:
+ return TTR("Import as Multiple Scenes+Materials");
}
return "";
}
static bool _teststr(const String &p_what, const String &p_str) {
-
String what = p_what;
//remove trailing spaces and numbers, some apps like blender add ".number" to duplicates so also compensate for this
while (what.length() && ((what[what.length() - 1] >= '0' && what[what.length() - 1] <= '9') || what[what.length() - 1] <= 32 || what[what.length() - 1] == '.')) {
-
what = what.substr(0, what.length() - 1);
}
- if (what.findn("$" + p_str) != -1) //blender and other stuff
+ if (what.findn("$" + p_str) != -1) { //blender and other stuff
return true;
- if (what.to_lower().ends_with("-" + p_str)) //collada only supports "_" and "-" besides letters
+ }
+ if (what.to_lower().ends_with("-" + p_str)) { //collada only supports "_" and "-" besides letters
return true;
- if (what.to_lower().ends_with("_" + p_str)) //collada only supports "_" and "-" besides letters
+ }
+ if (what.to_lower().ends_with("_" + p_str)) { //collada only supports "_" and "-" besides letters
return true;
+ }
return false;
}
static String _fixstr(const String &p_what, const String &p_str) {
-
String what = p_what;
//remove trailing spaces and numbers, some apps like blender add ".number" to duplicates so also compensate for this
while (what.length() && ((what[what.length() - 1] >= '0' && what[what.length() - 1] <= '9') || what[what.length() - 1] <= 32 || what[what.length() - 1] == '.')) {
-
what = what.substr(0, what.length() - 1);
}
String end = p_what.substr(what.length(), p_what.length() - what.length());
- if (what.findn("$" + p_str) != -1) //blender and other stuff
+ if (what.findn("$" + p_str) != -1) { //blender and other stuff
return what.replace("$" + p_str, "") + end;
- if (what.to_lower().ends_with("-" + p_str)) //collada only supports "_" and "-" besides letters
+ }
+ if (what.to_lower().ends_with("-" + p_str)) { //collada only supports "_" and "-" besides letters
return what.substr(0, what.length() - (p_str.length() + 1)) + end;
- if (what.to_lower().ends_with("_" + p_str)) //collada only supports "_" and "-" besides letters
+ }
+ if (what.to_lower().ends_with("_" + p_str)) { //collada only supports "_" and "-" besides letters
return what.substr(0, what.length() - (p_str.length() + 1)) + end;
+ }
return what;
}
-static void _gen_shape_list(const Ref<Mesh> &mesh, List<Ref<Shape> > &r_shape_list, bool p_convex) {
-
+static void _gen_shape_list(const Ref<Mesh> &mesh, List<Ref<Shape3D>> &r_shape_list, bool p_convex) {
if (!p_convex) {
-
- Ref<Shape> shape = mesh->create_trimesh_shape();
+ Ref<Shape3D> shape = mesh->create_trimesh_shape();
r_shape_list.push_back(shape);
} else {
-
- Vector<Ref<Shape> > cd = mesh->convex_decompose();
+ Vector<Ref<Shape3D>> cd = mesh->convex_decompose();
if (cd.size()) {
for (int i = 0; i < cd.size(); i++) {
r_shape_list.push_back(cd[i]);
@@ -293,11 +293,9 @@ static void _gen_shape_list(const Ref<Mesh> &mesh, List<Ref<Shape> > &r_shape_li
}
}
-Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape> > > &collision_map, LightBakeMode p_light_bake_mode) {
-
+Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape3D>>> &collision_map, LightBakeMode p_light_bake_mode) {
// children first
for (int i = 0; i < p_node->get_child_count(); i++) {
-
Node *r = _fix_node(p_node->get_child(i), p_root, collision_map, p_light_bake_mode);
if (!r) {
i--; //was erased
@@ -309,42 +307,36 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
bool isroot = p_node == p_root;
if (!isroot && _teststr(name, "noimp")) {
-
memdelete(p_node);
- return NULL;
+ return nullptr;
}
- if (Object::cast_to<MeshInstance>(p_node)) {
-
- MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
+ if (Object::cast_to<MeshInstance3D>(p_node)) {
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node);
Ref<ArrayMesh> m = mi->get_mesh();
if (m.is_valid()) {
-
for (int i = 0; i < m->get_surface_count(); i++) {
-
- Ref<SpatialMaterial> mat = m->surface_get_material(i);
- if (!mat.is_valid())
+ Ref<StandardMaterial3D> mat = m->surface_get_material(i);
+ if (!mat.is_valid()) {
continue;
+ }
if (_teststr(mat->get_name(), "alpha")) {
-
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
+ mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
mat->set_name(_fixstr(mat->get_name(), "alpha"));
}
if (_teststr(mat->get_name(), "vcol")) {
-
- mat->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- mat->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
+ mat->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ mat->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
mat->set_name(_fixstr(mat->get_name(), "vcol"));
}
}
}
if (p_light_bake_mode != LIGHT_BAKE_DISABLED) {
-
- mi->set_flag(GeometryInstance::FLAG_USE_BAKED_LIGHT, true);
+ mi->set_gi_mode(GeometryInstance3D::GI_MODE_BAKED);
}
}
@@ -355,7 +347,6 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
List<StringName> anims;
ap->get_animation_list(&anims);
for (List<StringName>::Element *E = anims.front(); E; E = E->next()) {
-
Ref<Animation> anim = ap->get_animation(E->get());
ERR_CONTINUE(anim.is_null());
for (int i = 0; i < anim->get_track_count(); i++) {
@@ -374,15 +365,15 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
}
if (_teststr(name, "colonly") || _teststr(name, "convcolonly")) {
-
- if (isroot)
+ if (isroot) {
return p_node;
- MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
+ }
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node);
if (mi) {
Ref<Mesh> mesh = mi->get_mesh();
if (mesh.is_valid()) {
- List<Ref<Shape> > shapes;
+ List<Ref<Shape3D>> shapes;
String fixed_name;
if (collision_map.has(mesh)) {
shapes = collision_map[mesh];
@@ -400,11 +391,10 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
fixed_name = _fixstr(name, "convcolonly");
}
- ERR_FAIL_COND_V(fixed_name == String(), NULL);
+ ERR_FAIL_COND_V(fixed_name == String(), nullptr);
if (shapes.size()) {
-
- StaticBody *col = memnew(StaticBody);
+ StaticBody3D *col = memnew(StaticBody3D);
col->set_transform(mi->get_transform());
col->set_name(fixed_name);
p_node->replace_by(col);
@@ -412,9 +402,8 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
p_node = col;
int idx = 0;
- for (List<Ref<Shape> >::Element *E = shapes.front(); E; E = E->next()) {
-
- CollisionShape *cshape = memnew(CollisionShape);
+ for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) {
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
cshape->set_shape(E->get());
col->add_child(cshape);
@@ -427,55 +416,55 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
} else if (p_node->has_meta("empty_draw_type")) {
String empty_draw_type = String(p_node->get_meta("empty_draw_type"));
- StaticBody *sb = memnew(StaticBody);
+ StaticBody3D *sb = memnew(StaticBody3D);
sb->set_name(_fixstr(name, "colonly"));
- Object::cast_to<Spatial>(sb)->set_transform(Object::cast_to<Spatial>(p_node)->get_transform());
+ Object::cast_to<Node3D>(sb)->set_transform(Object::cast_to<Node3D>(p_node)->get_transform());
p_node->replace_by(sb);
memdelete(p_node);
- p_node = NULL;
- CollisionShape *colshape = memnew(CollisionShape);
+ p_node = nullptr;
+ CollisionShape3D *colshape = memnew(CollisionShape3D);
if (empty_draw_type == "CUBE") {
- BoxShape *boxShape = memnew(BoxShape);
+ BoxShape3D *boxShape = memnew(BoxShape3D);
boxShape->set_extents(Vector3(1, 1, 1));
colshape->set_shape(boxShape);
- colshape->set_name("BoxShape");
+ colshape->set_name("BoxShape3D");
} else if (empty_draw_type == "SINGLE_ARROW") {
- RayShape *rayShape = memnew(RayShape);
+ RayShape3D *rayShape = memnew(RayShape3D);
rayShape->set_length(1);
colshape->set_shape(rayShape);
- colshape->set_name("RayShape");
- Object::cast_to<Spatial>(sb)->rotate_x(Math_PI / 2);
+ colshape->set_name("RayShape3D");
+ Object::cast_to<Node3D>(sb)->rotate_x(Math_PI / 2);
} else if (empty_draw_type == "IMAGE") {
- PlaneShape *planeShape = memnew(PlaneShape);
- colshape->set_shape(planeShape);
- colshape->set_name("PlaneShape");
+ WorldMarginShape3D *world_margin_shape = memnew(WorldMarginShape3D);
+ colshape->set_shape(world_margin_shape);
+ colshape->set_name("WorldMarginShape3D");
} else {
- SphereShape *sphereShape = memnew(SphereShape);
+ SphereShape3D *sphereShape = memnew(SphereShape3D);
sphereShape->set_radius(1);
colshape->set_shape(sphereShape);
- colshape->set_name("SphereShape");
+ colshape->set_name("SphereShape3D");
}
sb->add_child(colshape);
colshape->set_owner(sb->get_owner());
}
- } else if (_teststr(name, "rigid") && Object::cast_to<MeshInstance>(p_node)) {
-
- if (isroot)
+ } else if (_teststr(name, "rigid") && Object::cast_to<MeshInstance3D>(p_node)) {
+ if (isroot) {
return p_node;
+ }
- MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node);
Ref<Mesh> mesh = mi->get_mesh();
if (mesh.is_valid()) {
- List<Ref<Shape> > shapes;
+ List<Ref<Shape3D>> shapes;
if (collision_map.has(mesh)) {
shapes = collision_map[mesh];
} else {
_gen_shape_list(mesh, shapes, true);
}
- RigidBody *rigid_body = memnew(RigidBody);
+ RigidBody3D *rigid_body = memnew(RigidBody3D);
rigid_body->set_name(_fixstr(name, "rigid"));
p_node->replace_by(rigid_body);
rigid_body->set_transform(mi->get_transform());
@@ -486,9 +475,8 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
mi->set_owner(rigid_body->get_owner());
int idx = 0;
- for (List<Ref<Shape> >::Element *E = shapes.front(); E; E = E->next()) {
-
- CollisionShape *cshape = memnew(CollisionShape);
+ for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) {
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
cshape->set_shape(E->get());
rigid_body->add_child(cshape);
@@ -498,14 +486,13 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
}
}
- } else if ((_teststr(name, "col") || (_teststr(name, "convcol"))) && Object::cast_to<MeshInstance>(p_node)) {
-
- MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
+ } else if ((_teststr(name, "col") || (_teststr(name, "convcol"))) && Object::cast_to<MeshInstance3D>(p_node)) {
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node);
Ref<Mesh> mesh = mi->get_mesh();
if (mesh.is_valid()) {
- List<Ref<Shape> > shapes;
+ List<Ref<Shape3D>> shapes;
String fixed_name;
if (collision_map.has(mesh)) {
shapes = collision_map[mesh];
@@ -530,15 +517,14 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
}
if (shapes.size()) {
- StaticBody *col = memnew(StaticBody);
+ StaticBody3D *col = memnew(StaticBody3D);
col->set_name("static_collision");
mi->add_child(col);
col->set_owner(mi->get_owner());
int idx = 0;
- for (List<Ref<Shape> >::Element *E = shapes.front(); E; E = E->next()) {
-
- CollisionShape *cshape = memnew(CollisionShape);
+ for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) {
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
cshape->set_shape(E->get());
col->add_child(cshape);
@@ -550,33 +536,33 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
}
}
- } else if (_teststr(name, "navmesh") && Object::cast_to<MeshInstance>(p_node)) {
-
- if (isroot)
+ } else if (_teststr(name, "navmesh") && Object::cast_to<MeshInstance3D>(p_node)) {
+ if (isroot) {
return p_node;
+ }
- MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node);
Ref<ArrayMesh> mesh = mi->get_mesh();
- ERR_FAIL_COND_V(mesh.is_null(), NULL);
- NavigationMeshInstance *nmi = memnew(NavigationMeshInstance);
+ ERR_FAIL_COND_V(mesh.is_null(), nullptr);
+ NavigationRegion3D *nmi = memnew(NavigationRegion3D);
nmi->set_name(_fixstr(name, "navmesh"));
Ref<NavigationMesh> nmesh = memnew(NavigationMesh);
nmesh->create_from_mesh(mesh);
nmi->set_navigation_mesh(nmesh);
- Object::cast_to<Spatial>(nmi)->set_transform(mi->get_transform());
+ Object::cast_to<Node3D>(nmi)->set_transform(mi->get_transform());
p_node->replace_by(nmi);
memdelete(p_node);
p_node = nmi;
} else if (_teststr(name, "vehicle")) {
-
- if (isroot)
+ if (isroot) {
return p_node;
+ }
Node *owner = p_node->get_owner();
- Spatial *s = Object::cast_to<Spatial>(p_node);
- VehicleBody *bv = memnew(VehicleBody);
+ Node3D *s = Object::cast_to<Node3D>(p_node);
+ VehicleBody3D *bv = memnew(VehicleBody3D);
String n = _fixstr(p_node->get_name(), "vehicle");
bv->set_name(n);
p_node->replace_by(bv);
@@ -590,13 +576,13 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
p_node = bv;
} else if (_teststr(name, "wheel")) {
-
- if (isroot)
+ if (isroot) {
return p_node;
+ }
Node *owner = p_node->get_owner();
- Spatial *s = Object::cast_to<Spatial>(p_node);
- VehicleWheel *bv = memnew(VehicleWheel);
+ Node3D *s = Object::cast_to<Node3D>(p_node);
+ VehicleWheel3D *bv = memnew(VehicleWheel3D);
String n = _fixstr(p_node->get_name(), "wheel");
bv->set_name(n);
p_node->replace_by(bv);
@@ -609,16 +595,14 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
p_node = bv;
- } else if (Object::cast_to<MeshInstance>(p_node)) {
-
+ } else if (Object::cast_to<MeshInstance3D>(p_node)) {
//last attempt, maybe collision inside the mesh data
- MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node);
Ref<ArrayMesh> mesh = mi->get_mesh();
if (!mesh.is_null()) {
-
- List<Ref<Shape> > shapes;
+ List<Ref<Shape3D>> shapes;
if (collision_map.has(mesh)) {
shapes = collision_map[mesh];
} else if (_teststr(mesh->get_name(), "col")) {
@@ -632,15 +616,14 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
}
if (shapes.size()) {
- StaticBody *col = memnew(StaticBody);
+ StaticBody3D *col = memnew(StaticBody3D);
col->set_name("static_collision");
p_node->add_child(col);
col->set_owner(p_node->get_owner());
int idx = 0;
- for (List<Ref<Shape> >::Element *E = shapes.front(); E; E = E->next()) {
-
- CollisionShape *cshape = memnew(CollisionShape);
+ for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) {
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
cshape->set_shape(E->get());
col->add_child(cshape);
@@ -656,41 +639,39 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>
}
void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, bool p_bake_all) {
-
- if (!scene->has_node(String("AnimationPlayer")))
+ if (!scene->has_node(String("AnimationPlayer"))) {
return;
+ }
Node *n = scene->get_node(String("AnimationPlayer"));
ERR_FAIL_COND(!n);
AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n);
ERR_FAIL_COND(!anim);
- if (!anim->has_animation("default"))
+ if (!anim->has_animation("default")) {
return;
+ }
Ref<Animation> default_anim = anim->get_animation("default");
for (int i = 0; i < p_clips.size(); i += 4) {
-
String name = p_clips[i];
float from = p_clips[i + 1];
float to = p_clips[i + 2];
bool loop = p_clips[i + 3];
- if (from >= to)
+ if (from >= to) {
continue;
+ }
Ref<Animation> new_anim = memnew(Animation);
for (int j = 0; j < default_anim->get_track_count(); j++) {
-
List<float> keys;
int kc = default_anim->track_get_key_count(j);
int dtrack = -1;
for (int k = 0; k < kc; k++) {
-
float kt = default_anim->track_get_key_time(j, k);
if (kt >= from && kt < to) {
-
//found a key within range, so create track
if (dtrack == -1) {
new_anim->add_track(default_anim->track_get_type(j));
@@ -698,7 +679,6 @@ void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, boo
new_anim->track_set_path(dtrack, default_anim->track_get_path(j));
if (kt > (from + 0.01) && k > 0) {
-
if (default_anim->track_get_type(j) == Animation::TYPE_TRANSFORM) {
Quat q;
Vector3 p;
@@ -727,7 +707,6 @@ void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, boo
}
if (dtrack != -1 && kt >= to) {
-
if (default_anim->track_get_type(j) == Animation::TYPE_TRANSFORM) {
Quat q;
Vector3 p;
@@ -747,7 +726,6 @@ void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, boo
dtrack = new_anim->get_track_count() - 1;
new_anim->track_set_path(dtrack, default_anim->track_get_path(j));
if (default_anim->track_get_type(j) == Animation::TYPE_TRANSFORM) {
-
Quat q;
Vector3 p;
Vector3 s;
@@ -774,12 +752,10 @@ void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, boo
}
void ResourceImporterScene::_filter_anim_tracks(Ref<Animation> anim, Set<String> &keep) {
-
Ref<Animation> a = anim;
ERR_FAIL_COND(!a.is_valid());
for (int j = 0; j < a->get_track_count(); j++) {
-
String path = a->track_get_path(j);
if (!keep.has(path)) {
@@ -790,9 +766,9 @@ void ResourceImporterScene::_filter_anim_tracks(Ref<Animation> anim, Set<String>
}
void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) {
-
- if (!scene->has_node(String("AnimationPlayer")))
+ if (!scene->has_node(String("AnimationPlayer"))) {
return;
+ }
Node *n = scene->get_node(String("AnimationPlayer"));
ERR_FAIL_COND(!n);
AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n);
@@ -800,14 +776,12 @@ void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) {
Vector<String> strings = p_text.split("\n");
for (int i = 0; i < strings.size(); i++) {
-
strings.write[i] = strings[i].strip_edges();
}
List<StringName> anim_names;
anim->get_animation_list(&anim_names);
for (List<StringName>::Element *E = anim_names.front(); E; E = E->next()) {
-
String name = E->get();
bool valid_for_this = false;
bool valid = false;
@@ -816,9 +790,7 @@ void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) {
Set<String> keep_local;
for (int i = 0; i < strings.size(); i++) {
-
if (strings[i].begins_with("@")) {
-
valid_for_this = false;
for (Set<String>::Element *F = keep_local.front(); F; F = F->next()) {
keep.insert(F->get());
@@ -827,59 +799,64 @@ void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) {
Vector<String> filters = strings[i].substr(1, strings[i].length()).split(",");
for (int j = 0; j < filters.size(); j++) {
-
String fname = filters[j].strip_edges();
- if (fname == "")
+ if (fname == "") {
continue;
+ }
int fc = fname[0];
bool plus;
- if (fc == '+')
+ if (fc == '+') {
plus = true;
- else if (fc == '-')
+ } else if (fc == '-') {
plus = false;
- else
+ } else {
continue;
+ }
String filter = fname.substr(1, fname.length()).strip_edges();
- if (!name.matchn(filter))
+ if (!name.matchn(filter)) {
continue;
+ }
valid_for_this = plus;
}
- if (valid_for_this)
+ if (valid_for_this) {
valid = true;
+ }
} else if (valid_for_this) {
-
Ref<Animation> a = anim->get_animation(name);
- if (!a.is_valid())
+ if (!a.is_valid()) {
continue;
+ }
for (int j = 0; j < a->get_track_count(); j++) {
-
String path = a->track_get_path(j);
String tname = strings[i];
- if (tname == "")
+ if (tname == "") {
continue;
+ }
int fc = tname[0];
bool plus;
- if (fc == '+')
+ if (fc == '+') {
plus = true;
- else if (fc == '-')
+ } else if (fc == '-') {
plus = false;
- else
+ } else {
continue;
+ }
String filter = tname.substr(1, tname.length()).strip_edges();
- if (!path.matchn(filter))
+ if (!path.matchn(filter)) {
continue;
+ }
- if (plus)
+ if (plus) {
keep_local.insert(path);
- else if (!keep.has(path)) {
+ } else if (!keep.has(path)) {
keep_local.erase(path);
}
}
@@ -896,9 +873,9 @@ void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) {
}
void ResourceImporterScene::_optimize_animations(Node *scene, float p_max_lin_error, float p_max_ang_error, float p_max_angle) {
-
- if (!scene->has_node(String("AnimationPlayer")))
+ if (!scene->has_node(String("AnimationPlayer"))) {
return;
+ }
Node *n = scene->get_node(String("AnimationPlayer"));
ERR_FAIL_COND(!n);
AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n);
@@ -907,14 +884,12 @@ void ResourceImporterScene::_optimize_animations(Node *scene, float p_max_lin_er
List<StringName> anim_names;
anim->get_animation_list(&anim_names);
for (List<StringName>::Element *E = anim_names.front(); E; E = E->next()) {
-
Ref<Animation> a = anim->get_animation(E->get());
a->optimize(p_max_lin_error, p_max_ang_error, Math::deg2rad(p_max_angle));
}
}
static String _make_extname(const String &p_str) {
-
String ext_name = p_str.replace(".", "_");
ext_name = ext_name.replace(":", "_");
ext_name = ext_name.replace("\"", "_");
@@ -930,35 +905,31 @@ static String _make_extname(const String &p_str) {
}
void ResourceImporterScene::_find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes) {
-
List<PropertyInfo> pi;
p_node->get_property_list(&pi);
- MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node);
if (mi) {
-
Ref<ArrayMesh> mesh = mi->get_mesh();
if (mesh.is_valid() && !meshes.has(mesh)) {
- Spatial *s = mi;
+ Node3D *s = mi;
Transform transform;
while (s) {
transform = transform * s->get_transform();
- s = s->get_parent_spatial();
+ s = Object::cast_to<Node3D>(s->get_parent());
}
meshes[mesh] = transform;
}
}
for (int i = 0; i < p_node->get_child_count(); i++) {
-
_find_meshes(p_node->get_child(i), meshes);
}
}
-void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes) {
-
+void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation>> &p_animations, Map<Ref<Material>, Ref<Material>> &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh>> &p_meshes) {
List<PropertyInfo> pi;
if (p_make_animations) {
@@ -968,13 +939,11 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
List<StringName> anims;
ap->get_animation_list(&anims);
for (List<StringName>::Element *E = anims.front(); E; E = E->next()) {
-
Ref<Animation> anim = ap->get_animation(E->get());
ERR_CONTINUE(anim.is_null());
if (!p_animations.has(anim)) {
-
- //mark what comes from the file first, this helps eventually keep user data
+ // Tracks from source file should be set as imported, anything else is a custom track.
for (int i = 0; i < anim->get_track_count(); i++) {
anim->track_set_imported(i, true);
}
@@ -988,10 +957,9 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
}
if (FileAccess::exists(ext_name) && p_keep_animations) {
- //try to keep custom animation tracks
+ // Copy custom animation tracks from previously imported files.
Ref<Animation> old_anim = ResourceLoader::load(ext_name, "Animation", true);
if (old_anim.is_valid()) {
- //meergeee
for (int i = 0; i < old_anim->get_track_count(); i++) {
if (!old_anim->track_is_imported(i)) {
old_anim->copy_track(i, anim);
@@ -1001,7 +969,7 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
}
}
- anim->set_path(ext_name, true); //if not set, then its never saved externally
+ anim->set_path(ext_name, true); // Set path to save externally.
ResourceSaver::save(ext_name, anim, ResourceSaver::FLAG_CHANGE_PATH);
p_animations[anim] = anim;
}
@@ -1012,15 +980,11 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
p_node->get_property_list(&pi);
for (List<PropertyInfo>::Element *E = pi.front(); E; E = E->next()) {
-
if (E->get().type == Variant::OBJECT) {
-
Ref<Material> mat = p_node->get(E->get().name);
if (p_make_materials && mat.is_valid() && mat->get_name() != "") {
-
if (!p_materials.has(mat)) {
-
String ext_name;
if (p_materials_as_text) {
@@ -1033,28 +997,22 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
//if exists, use it
p_materials[mat] = ResourceLoader::load(ext_name);
} else {
-
ResourceSaver::save(ext_name, mat, ResourceSaver::FLAG_CHANGE_PATH);
p_materials[mat] = ResourceLoader::load(ext_name, "", true); // disable loading from the cache.
}
}
if (p_materials[mat] != mat) {
-
p_node->set(E->get().name, p_materials[mat]);
}
} else {
-
Ref<ArrayMesh> mesh = p_node->get(E->get().name);
if (mesh.is_valid()) {
-
bool mesh_just_added = false;
if (p_make_meshes) {
-
if (!p_meshes.has(mesh)) {
-
//meshes are always overwritten, keeping them is not practical
String ext_name;
@@ -1072,16 +1030,16 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
}
if (p_make_materials) {
-
if (mesh_just_added || !p_meshes.has(mesh)) {
-
for (int i = 0; i < mesh->get_surface_count(); i++) {
mat = mesh->surface_get_material(i);
- if (!mat.is_valid())
+ if (!mat.is_valid()) {
continue;
- if (mat->get_name() == "")
+ }
+ if (mat->get_name() == "") {
continue;
+ }
if (!p_materials.has(mat)) {
String ext_name;
@@ -1096,19 +1054,16 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
//if exists, use it
p_materials[mat] = ResourceLoader::load(ext_name);
} else {
-
ResourceSaver::save(ext_name, mat, ResourceSaver::FLAG_CHANGE_PATH);
p_materials[mat] = ResourceLoader::load(ext_name, "", true); // disable loading from the cache.
}
}
if (p_materials[mat] != mat) {
-
mesh->surface_set_material(i, p_materials[mat]);
//re-save the mesh since a material is now assigned
if (p_make_meshes) {
-
String ext_name;
if (p_meshes_as_text) {
@@ -1134,14 +1089,12 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
}
for (int i = 0; i < p_node->get_child_count(); i++) {
-
_make_external_resources(p_node->get_child(i), p_base_path, p_make_animations, p_animations_as_text, p_keep_animations, p_make_materials, p_materials_as_text, p_keep_materials, p_make_meshes, p_meshes_as_text, p_animations, p_materials, p_meshes);
}
}
void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
- r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/root_type", PROPERTY_HINT_TYPE_STRING, "Node"), "Spatial"));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/root_type", PROPERTY_HINT_TYPE_STRING, "Node"), "Node3D"));
r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/root_name"), "Scene Root"));
List<String> script_extentions;
@@ -1150,8 +1103,9 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in
String script_ext_hint;
for (List<String>::Element *E = script_extentions.front(); E; E = E->next()) {
- if (script_ext_hint != "")
+ if (script_ext_hint != "") {
script_ext_hint += ",";
+ }
script_ext_hint += "*." + E->get();
}
@@ -1160,7 +1114,7 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in
bool scenes_out = p_preset == PRESET_MULTIPLE_SCENES || p_preset == PRESET_MULTIPLE_SCENES_AND_MATERIALS;
bool animations_out = p_preset == PRESET_SEPARATE_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS;
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "nodes/root_scale", PROPERTY_HINT_RANGE, "0.001,1000,0.001"), 1.0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "nodes/root_scale", PROPERTY_HINT_RANGE, "0.001,1000,0.001"), 1.0));
r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/custom_script", PROPERTY_HINT_FILE, script_ext_hint), ""));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "nodes/storage", PROPERTY_HINT_ENUM, "Single Scene,Instanced Sub-Scenes"), scenes_out ? 1 : 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/location", PROPERTY_HINT_ENUM, "Node,Mesh"), (meshes_out || materials_out) ? 1 : 0));
@@ -1170,17 +1124,18 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/ensure_tangents"), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.mesh),Files (.tres)"), meshes_out ? 1 : 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Enable,Gen Lightmaps", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "meshes/lightmap_texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.1));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "meshes/lightmap_texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.1));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "skins/use_named_skins"), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "external_files/store_in_subdir"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15));
r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "animation/filter_script", PROPERTY_HINT_MULTILINE_TEXT), ""));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.anim),Files (.tres)", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), animations_out));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/keep_custom_tracks"), animations_out));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/optimizer/max_linear_error"), 0.05));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/optimizer/max_angular_error"), 0.01));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/optimizer/max_angle"), 22));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_linear_error"), 0.05));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_angular_error"), 0.01));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_angle"), 22));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/remove_unused_tracks"), true));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/clips/amount", PROPERTY_HINT_RANGE, "0,256,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0));
for (int i = 0; i < 256; i++) {
@@ -1192,7 +1147,6 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in
}
void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner) {
-
if (p_node != p_new_owner && p_node->get_owner() == p_scene) {
p_node->set_owner(p_new_owner);
}
@@ -1204,31 +1158,29 @@ void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_
}
Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) {
-
Ref<EditorSceneImporter> importer;
String ext = p_path.get_extension().to_lower();
- for (Set<Ref<EditorSceneImporter> >::Element *E = importers.front(); E; E = E->next()) {
-
- if (E->get().ptr() == p_exception)
+ for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) {
+ if (E->get().ptr() == p_exception) {
continue;
+ }
List<String> extensions;
E->get()->get_extensions(&extensions);
for (List<String>::Element *F = extensions.front(); F; F = F->next()) {
-
if (F->get().to_lower() == ext) {
-
importer = E->get();
break;
}
}
- if (importer.is_valid())
+ if (importer.is_valid()) {
break;
+ }
}
- ERR_FAIL_COND_V(!importer.is_valid(), NULL);
+ ERR_FAIL_COND_V(!importer.is_valid(), nullptr);
List<String> missing;
Error err;
@@ -1236,37 +1188,34 @@ Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneImporte
}
Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) {
-
Ref<EditorSceneImporter> importer;
String ext = p_path.get_extension().to_lower();
- for (Set<Ref<EditorSceneImporter> >::Element *E = importers.front(); E; E = E->next()) {
-
- if (E->get().ptr() == p_exception)
+ for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) {
+ if (E->get().ptr() == p_exception) {
continue;
+ }
List<String> extensions;
E->get()->get_extensions(&extensions);
for (List<String>::Element *F = extensions.front(); F; F = F->next()) {
-
if (F->get().to_lower() == ext) {
-
importer = E->get();
break;
}
}
- if (importer.is_valid())
+ if (importer.is_valid()) {
break;
+ }
}
- ERR_FAIL_COND_V(!importer.is_valid(), NULL);
+ ERR_FAIL_COND_V(!importer.is_valid(), nullptr);
return importer->import_animation(p_path, p_flags, p_bake_fps);
}
Error ResourceImporterScene::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
const String &src_path = p_source_file;
Ref<EditorSceneImporter> importer;
@@ -1275,22 +1224,20 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
EditorProgress progress("import", TTR("Import Scene"), 104);
progress.step(TTR("Importing Scene..."), 0);
- for (Set<Ref<EditorSceneImporter> >::Element *E = importers.front(); E; E = E->next()) {
-
+ for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) {
List<String> extensions;
E->get()->get_extensions(&extensions);
for (List<String>::Element *F = extensions.front(); F; F = F->next()) {
-
if (F->get().to_lower() == ext) {
-
importer = E->get();
break;
}
}
- if (importer.is_valid())
+ if (importer.is_valid()) {
break;
+ }
}
ERR_FAIL_COND_V(!importer.is_valid(), ERR_FILE_UNRECOGNIZED);
@@ -1298,20 +1245,29 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
float fps = p_options["animation/fps"];
int import_flags = EditorSceneImporter::IMPORT_ANIMATION_DETECT_LOOP;
- if (!bool(p_options["animation/optimizer/remove_unused_tracks"]))
+ if (!bool(p_options["animation/optimizer/remove_unused_tracks"])) {
import_flags |= EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS;
+ }
- if (bool(p_options["animation/import"]))
+ if (bool(p_options["animation/import"])) {
import_flags |= EditorSceneImporter::IMPORT_ANIMATION;
+ }
- if (int(p_options["meshes/compress"]))
+ if (int(p_options["meshes/compress"])) {
import_flags |= EditorSceneImporter::IMPORT_USE_COMPRESSION;
+ }
- if (bool(p_options["meshes/ensure_tangents"]))
+ if (bool(p_options["meshes/ensure_tangents"])) {
import_flags |= EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS;
+ }
- if (int(p_options["materials/location"]) == 0)
+ if (int(p_options["materials/location"]) == 0) {
import_flags |= EditorSceneImporter::IMPORT_MATERIALS_IN_INSTANCES;
+ }
+
+ if (bool(p_options["skins/use_named_skins"])) {
+ import_flags |= EditorSceneImporter::IMPORT_USE_NAMED_SKIN_BINDS;
+ }
Error err = OK;
List<String> missing_deps; // for now, not much will be done with this
@@ -1323,17 +1279,16 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
String root_type = p_options["nodes/root_type"];
root_type = root_type.split(" ")[0]; // full root_type is "ClassName (filename.gd)" for a script global class.
- Ref<Script> root_script = NULL;
+ Ref<Script> root_script = nullptr;
if (ScriptServer::is_global_class(root_type)) {
root_script = ResourceLoader::load(ScriptServer::get_global_class_path(root_type));
root_type = ScriptServer::get_global_class_base(root_type);
}
- if (root_type != "Spatial") {
+ if (root_type != "Node3D") {
Node *base_node = Object::cast_to<Node>(ClassDB::instance(root_type));
if (base_node) {
-
scene->replace_by(base_node);
memdelete(scene);
scene = base_node;
@@ -1344,15 +1299,17 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
scene->set_script(Variant(root_script));
}
- if (Object::cast_to<Spatial>(scene)) {
- float root_scale = p_options["nodes/root_scale"];
- Object::cast_to<Spatial>(scene)->scale(Vector3(root_scale, root_scale, root_scale));
+ float root_scale = 1.0;
+ if (Object::cast_to<Node3D>(scene)) {
+ root_scale = p_options["nodes/root_scale"];
+ Object::cast_to<Node3D>(scene)->scale(Vector3(root_scale, root_scale, root_scale));
}
- if (p_options["nodes/root_name"] != "Scene Root")
+ if (p_options["nodes/root_name"] != "Scene Root") {
scene->set_name(p_options["nodes/root_name"]);
- else
+ } else {
scene->set_name(p_save_path.get_file().get_basename());
+ }
err = OK;
@@ -1364,7 +1321,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
float anim_optimizer_maxang = p_options["animation/optimizer/max_angle"];
int light_bake_mode = p_options["meshes/light_baking"];
- Map<Ref<Mesh>, List<Ref<Shape> > > collision_map;
+ Map<Ref<Mesh>, List<Ref<Shape3D>>> collision_map;
scene = _fix_node(scene, scene, collision_map, LightBakeMode(light_bake_mode));
@@ -1374,7 +1331,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
Array animation_clips;
{
-
int clip_count = p_options["animation/clips/amount"];
for (int i = 0; i < clip_count; i++) {
@@ -1409,7 +1365,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
String base_path = p_source_file.get_base_dir();
if (external_animations || external_materials || external_meshes || external_scenes) {
-
if (bool(p_options["external_files/store_in_subdir"])) {
String subdir_name = p_source_file.get_file().get_basename();
DirAccess *da = DirAccess::open(base_path);
@@ -1421,40 +1376,119 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
}
if (light_bake_mode == 2 /* || generate LOD */) {
-
Map<Ref<ArrayMesh>, Transform> meshes;
_find_meshes(scene, meshes);
- if (light_bake_mode == 2) {
+ String file_id = src_path.get_file();
+ String cache_file_path = base_path.plus_file(file_id + ".unwrap_cache");
- float texel_size = p_options["meshes/lightmap_texel_size"];
- texel_size = MAX(0.001, texel_size);
+ Vector<unsigned char> cache_data;
- EditorProgress progress2("gen_lightmaps", TTR("Generating Lightmaps"), meshes.size());
- int step = 0;
- for (Map<Ref<ArrayMesh>, Transform>::Element *E = meshes.front(); E; E = E->next()) {
+ if (FileAccess::exists(cache_file_path)) {
+ Error err2;
+ FileAccess *file = FileAccess::open(cache_file_path, FileAccess::READ, &err2);
- Ref<ArrayMesh> mesh = E->key();
- String name = mesh->get_name();
- if (name == "") { //should not happen but..
- name = "Mesh " + itos(step);
+ if (err2) {
+ if (file) {
+ memdelete(file);
}
+ } else {
+ int cache_size = file->get_len();
+ cache_data.resize(cache_size);
+ file->get_buffer(cache_data.ptrw(), cache_size);
+ }
+ }
- progress2.step(TTR("Generating for Mesh: ") + name + " (" + itos(step) + "/" + itos(meshes.size()) + ")", step);
+ float texel_size = p_options["meshes/lightmap_texel_size"];
+ texel_size = MAX(0.001, texel_size);
+
+ Map<String, unsigned int> used_unwraps;
+
+ EditorProgress progress2("gen_lightmaps", TTR("Generating Lightmaps"), meshes.size());
+ int step = 0;
+ for (Map<Ref<ArrayMesh>, Transform>::Element *E = meshes.front(); E; E = E->next()) {
+ Ref<ArrayMesh> mesh = E->key();
+ String name = mesh->get_name();
+ if (name == "") { //should not happen but..
+ name = "Mesh " + itos(step);
+ }
- Error err2 = mesh->lightmap_unwrap(E->get(), texel_size);
- if (err2 != OK) {
- EditorNode::add_io_error("Mesh '" + name + "' failed lightmap generation. Please fix geometry.");
+ progress2.step(TTR("Generating for Mesh: ") + name + " (" + itos(step) + "/" + itos(meshes.size()) + ")", step);
+
+ int *ret_cache_data = (int *)cache_data.ptrw();
+ unsigned int ret_cache_size = cache_data.size();
+ bool ret_used_cache = true; // Tell the unwrapper to use the cache
+ Error err2 = mesh->lightmap_unwrap_cached(ret_cache_data, ret_cache_size, ret_used_cache, E->get(), texel_size);
+
+ if (err2 != OK) {
+ EditorNode::add_io_error("Mesh '" + name + "' failed lightmap generation. Please fix geometry.");
+ } else {
+ String hash = String::md5((unsigned char *)ret_cache_data);
+ used_unwraps.insert(hash, ret_cache_size);
+
+ if (!ret_used_cache) {
+ // Cache was not used, add the generated entry to the current cache
+ if (cache_data.empty()) {
+ cache_data.resize(4 + ret_cache_size);
+ int *data = (int *)cache_data.ptrw();
+ data[0] = 1;
+ memcpy(&data[1], ret_cache_data, ret_cache_size);
+ } else {
+ int current_size = cache_data.size();
+ cache_data.resize(cache_data.size() + ret_cache_size);
+ unsigned char *ptrw = cache_data.ptrw();
+ memcpy(&ptrw[current_size], ret_cache_data, ret_cache_size);
+ int *data = (int *)ptrw;
+ data[0] += 1;
+ }
}
- step++;
}
+ step++;
+ }
+
+ Error err2;
+ FileAccess *file = FileAccess::open(cache_file_path, FileAccess::WRITE, &err2);
+
+ if (err2) {
+ if (file) {
+ memdelete(file);
+ }
+ } else {
+ // Store number of entries
+ file->store_32(used_unwraps.size());
+
+ // Store cache entries
+ const int *cache = (int *)cache_data.ptr();
+ unsigned int r_idx = 1;
+ for (int i = 0; i < cache[0]; ++i) {
+ unsigned char *entry_start = (unsigned char *)&cache[r_idx];
+ String entry_hash = String::md5(entry_start);
+ if (used_unwraps.has(entry_hash)) {
+ unsigned int entry_size = used_unwraps[entry_hash];
+ file->store_buffer(entry_start, entry_size);
+ }
+
+ r_idx += 4; // hash
+ r_idx += 2; // size hint
+
+ int vertex_count = cache[r_idx];
+ r_idx += 1; // vertex count
+ r_idx += vertex_count; // vertex
+ r_idx += vertex_count * 2; // uvs
+
+ int index_count = cache[r_idx];
+ r_idx += 1; // index count
+ r_idx += index_count; // indices
+ }
+
+ file->close();
}
}
if (external_animations || external_materials || external_meshes) {
- Map<Ref<Animation>, Ref<Animation> > anim_map;
- Map<Ref<Material>, Ref<Material> > mat_map;
- Map<Ref<ArrayMesh>, Ref<ArrayMesh> > mesh_map;
+ Map<Ref<Animation>, Ref<Animation>> anim_map;
+ Map<Ref<Material>, Ref<Material>> mat_map;
+ Map<Ref<ArrayMesh>, Ref<ArrayMesh>> mesh_map;
bool keep_materials = bool(p_options["materials/keep_on_reimport"]);
@@ -1471,9 +1505,8 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
if (!scr.is_valid()) {
EditorNode::add_io_error(TTR("Couldn't load post-import script:") + " " + post_import_script_path);
} else {
-
post_import_script = Ref<EditorScenePostImport>(memnew(EditorScenePostImport));
- post_import_script->set_script(scr.get_ref_ptr());
+ post_import_script->set_script(scr);
if (!post_import_script->get_script_instance()) {
EditorNode::add_io_error(TTR("Invalid/broken script for post-import (check console):") + " " + post_import_script_path);
post_import_script.unref();
@@ -1486,7 +1519,9 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
post_import_script->init(base_path, p_source_file);
scene = post_import_script->post_import(scene);
if (!scene) {
- EditorNode::add_io_error(TTR("Error running post-import script:") + " " + post_import_script_path);
+ EditorNode::add_io_error(
+ TTR("Error running post-import script:") + " " + post_import_script_path + "\n" +
+ TTR("Did you return a Node-derived object in the `post_import()` method?"));
return err;
}
}
@@ -1497,8 +1532,9 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
//save sub-scenes as instances!
for (int i = 0; i < scene->get_child_count(); i++) {
Node *child = scene->get_child(i);
- if (child->get_owner() != scene)
+ if (child->get_owner() != scene) {
continue; //not a real child probably created by scene type (ig, a scrollbar)
+ }
_replace_owner(child, scene, child);
String cn = String(child->get_name()).strip_edges().replace(".", "_").replace(":", "_");
@@ -1529,30 +1565,33 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
return OK;
}
-ResourceImporterScene *ResourceImporterScene::singleton = NULL;
+ResourceImporterScene *ResourceImporterScene::singleton = nullptr;
ResourceImporterScene::ResourceImporterScene() {
singleton = this;
}
+
///////////////////////////////////////
uint32_t EditorSceneImporterESCN::get_import_flags() const {
return IMPORT_SCENE;
}
+
void EditorSceneImporterESCN::get_extensions(List<String> *r_extensions) const {
r_extensions->push_back("escn");
}
-Node *EditorSceneImporterESCN::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
+Node *EditorSceneImporterESCN::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) {
Error error;
Ref<PackedScene> ps = ResourceFormatLoaderText::singleton->load(p_path, p_path, &error);
- ERR_FAIL_COND_V_MSG(!ps.is_valid(), NULL, "Cannot load scene as text resource from path '" + p_path + "'.");
+ ERR_FAIL_COND_V_MSG(!ps.is_valid(), nullptr, "Cannot load scene as text resource from path '" + p_path + "'.");
Node *scene = ps->instance();
- ERR_FAIL_COND_V(!scene, NULL);
+ ERR_FAIL_COND_V(!scene, nullptr);
return scene;
}
+
Ref<Animation> EditorSceneImporterESCN::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) {
ERR_FAIL_V(Ref<Animation>());
}
diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h
index 2691b224eb..465d11116b 100644
--- a/editor/import/resource_importer_scene.h
+++ b/editor/import/resource_importer_scene.h
@@ -34,12 +34,11 @@
#include "core/io/resource_importer.h"
#include "scene/resources/animation.h"
#include "scene/resources/mesh.h"
-#include "scene/resources/shape.h"
+#include "scene/resources/shape_3d.h"
class Material;
class EditorSceneImporter : public Reference {
-
GDCLASS(EditorSceneImporter, Reference);
protected:
@@ -59,20 +58,20 @@ public:
IMPORT_GENERATE_TANGENT_ARRAYS = 256,
IMPORT_FAIL_ON_MISSING_DEPENDENCIES = 512,
IMPORT_MATERIALS_IN_INSTANCES = 1024,
- IMPORT_USE_COMPRESSION = 2048
+ IMPORT_USE_COMPRESSION = 2048,
+ IMPORT_USE_NAMED_SKIN_BINDS = 4096,
};
virtual uint32_t get_import_flags() const;
virtual void get_extensions(List<String> *r_extensions) const;
- virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = NULL);
+ virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = nullptr);
virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps);
EditorSceneImporter() {}
};
class EditorScenePostImport : public Reference {
-
GDCLASS(EditorScenePostImport, Reference);
String source_folder;
@@ -92,7 +91,7 @@ public:
class ResourceImporterScene : public ResourceImporter {
GDCLASS(ResourceImporterScene, ResourceImporter);
- Set<Ref<EditorSceneImporter> > importers;
+ Set<Ref<EditorSceneImporter>> importers;
static ResourceImporterScene *singleton;
@@ -124,36 +123,36 @@ class ResourceImporterScene : public ResourceImporter {
public:
static ResourceImporterScene *get_singleton() { return singleton; }
- const Set<Ref<EditorSceneImporter> > &get_importers() const { return importers; }
+ const Set<Ref<EditorSceneImporter>> &get_importers() const { return importers; }
void add_importer(Ref<EditorSceneImporter> p_importer) { importers.insert(p_importer); }
void remove_importer(Ref<EditorSceneImporter> p_importer) { importers.erase(p_importer); }
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
- virtual int get_import_order() const { return 100; } //after everything
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
+ virtual int get_import_order() const override { return 100; } //after everything
void _find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes);
- void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes);
+ void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation>> &p_animations, Map<Ref<Material>, Ref<Material>> &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh>> &p_meshes);
- Node *_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape> > > &collision_map, LightBakeMode p_light_bake_mode);
+ Node *_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape3D>>> &collision_map, LightBakeMode p_light_bake_mode);
void _create_clips(Node *scene, const Array &p_clips, bool p_bake_all);
void _filter_anim_tracks(Ref<Animation> anim, Set<String> &keep);
void _filter_tracks(Node *scene, const String &p_text);
void _optimize_animations(Node *scene, float p_max_lin_error, float p_max_ang_error, float p_max_angle);
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
Node *import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps);
Ref<Animation> import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps);
@@ -165,10 +164,10 @@ class EditorSceneImporterESCN : public EditorSceneImporter {
GDCLASS(EditorSceneImporterESCN, EditorSceneImporter);
public:
- virtual uint32_t get_import_flags() const;
- virtual void get_extensions(List<String> *r_extensions) const;
- virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = NULL);
- virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps);
+ virtual uint32_t get_import_flags() const override;
+ virtual void get_extensions(List<String> *r_extensions) const override;
+ virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = nullptr) override;
+ virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) override;
};
#endif // RESOURCEIMPORTERSCENE_H
diff --git a/editor/import/resource_importer_shader_file.cpp b/editor/import/resource_importer_shader_file.cpp
new file mode 100644
index 0000000000..a2e80dfa18
--- /dev/null
+++ b/editor/import/resource_importer_shader_file.cpp
@@ -0,0 +1,118 @@
+/*************************************************************************/
+/* resource_importer_shader_file.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "resource_importer_shader_file.h"
+
+#include "core/io/marshalls.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
+#include "editor/editor_node.h"
+#include "editor/plugins/shader_file_editor_plugin.h"
+#include "servers/rendering/rendering_device_binds.h"
+
+String ResourceImporterShaderFile::get_importer_name() const {
+ return "glsl";
+}
+
+String ResourceImporterShaderFile::get_visible_name() const {
+ return "GLSL Shader File";
+}
+
+void ResourceImporterShaderFile::get_recognized_extensions(List<String> *p_extensions) const {
+ p_extensions->push_back("glsl");
+}
+
+String ResourceImporterShaderFile::get_save_extension() const {
+ return "res";
+}
+
+String ResourceImporterShaderFile::get_resource_type() const {
+ return "RDShaderFile";
+}
+
+int ResourceImporterShaderFile::get_preset_count() const {
+ return 0;
+}
+
+String ResourceImporterShaderFile::get_preset_name(int p_idx) const {
+ return String();
+}
+
+void ResourceImporterShaderFile::get_import_options(List<ImportOption> *r_options, int p_preset) const {
+}
+
+bool ResourceImporterShaderFile::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
+ return true;
+}
+
+static String _include_function(const String &p_path, void *userpointer) {
+ Error err;
+
+ String *base_path = (String *)userpointer;
+
+ String include = p_path;
+ if (include.is_rel_path()) {
+ include = base_path->plus_file(include);
+ }
+
+ FileAccessRef file_inc = FileAccess::open(include, FileAccess::READ, &err);
+ if (err != OK) {
+ return String();
+ }
+ return file_inc->get_as_utf8_string();
+}
+
+Error ResourceImporterShaderFile::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
+ /* STEP 1, Read shader code */
+
+ Error err;
+ FileAccessRef file = FileAccess::open(p_source_file, FileAccess::READ, &err);
+ ERR_FAIL_COND_V(err != OK, ERR_CANT_OPEN);
+ ERR_FAIL_COND_V(!file.operator->(), ERR_CANT_OPEN);
+
+ String file_txt = file->get_as_utf8_string();
+ Ref<RDShaderFile> shader_file;
+ shader_file.instance();
+ String base_path = p_source_file.get_base_dir();
+ err = shader_file->parse_versions_from_text(file_txt, "", _include_function, &base_path);
+
+ if (err != OK) {
+ if (!ShaderFileEditor::singleton->is_visible_in_tree()) {
+ EditorNode::get_singleton()->add_io_error(vformat(TTR("Error importing GLSL shader file: '%s'. Open the file in the filesystem dock in order to see the reason."), p_source_file));
+ }
+ }
+
+ ResourceSaver::save(p_save_path + ".res", shader_file);
+
+ return OK;
+}
+
+ResourceImporterShaderFile::ResourceImporterShaderFile() {
+}
diff --git a/editor/import/resource_importer_shader_file.h b/editor/import/resource_importer_shader_file.h
new file mode 100644
index 0000000000..66ae626c51
--- /dev/null
+++ b/editor/import/resource_importer_shader_file.h
@@ -0,0 +1,57 @@
+/*************************************************************************/
+/* resource_importer_shader_file.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef RESOURCE_IMPORTER_SHADER_FILE_H
+#define RESOURCE_IMPORTER_SHADER_FILE_H
+
+#include "core/io/resource_importer.h"
+
+class ResourceImporterShaderFile : public ResourceImporter {
+ GDCLASS(ResourceImporterShaderFile, ResourceImporter);
+
+public:
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
+
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
+
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
+
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
+
+ ResourceImporterShaderFile();
+};
+
+#endif // RESOURCE_IMPORTER_SHADER_FILE_H
diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp
index 88547280ce..3a0e624a8f 100644
--- a/editor/import/resource_importer_texture.cpp
+++ b/editor/import/resource_importer_texture.cpp
@@ -32,103 +32,101 @@
#include "core/io/config_file.h"
#include "core/io/image_loader.h"
+#include "core/version.h"
#include "editor/editor_file_system.h"
#include "editor/editor_node.h"
-#include "scene/resources/texture.h"
-void ResourceImporterTexture::_texture_reimport_srgb(const Ref<StreamTexture> &p_tex) {
+void ResourceImporterTexture::_texture_reimport_roughness(const Ref<StreamTexture2D> &p_tex, const String &p_normal_path, RS::TextureDetectRoughnessChannel p_channel) {
+ MutexLock lock(singleton->mutex);
- singleton->mutex->lock();
StringName path = p_tex->get_path();
if (!singleton->make_flags.has(path)) {
- singleton->make_flags[path] = 0;
+ singleton->make_flags[path] = MakeInfo();
}
- singleton->make_flags[path] |= MAKE_SRGB_FLAG;
-
- singleton->mutex->unlock();
+ singleton->make_flags[path].flags |= MAKE_ROUGHNESS_FLAG;
+ singleton->make_flags[path].channel_for_roughness = p_channel;
+ singleton->make_flags[path].normal_path_for_roughness = p_normal_path;
}
-void ResourceImporterTexture::_texture_reimport_3d(const Ref<StreamTexture> &p_tex) {
+void ResourceImporterTexture::_texture_reimport_3d(const Ref<StreamTexture2D> &p_tex) {
+ MutexLock lock(singleton->mutex);
- singleton->mutex->lock();
StringName path = p_tex->get_path();
if (!singleton->make_flags.has(path)) {
- singleton->make_flags[path] = 0;
+ singleton->make_flags[path] = MakeInfo();
}
- singleton->make_flags[path] |= MAKE_3D_FLAG;
-
- singleton->mutex->unlock();
+ singleton->make_flags[path].flags |= MAKE_3D_FLAG;
}
-void ResourceImporterTexture::_texture_reimport_normal(const Ref<StreamTexture> &p_tex) {
+void ResourceImporterTexture::_texture_reimport_normal(const Ref<StreamTexture2D> &p_tex) {
+ MutexLock lock(singleton->mutex);
- singleton->mutex->lock();
StringName path = p_tex->get_path();
if (!singleton->make_flags.has(path)) {
- singleton->make_flags[path] = 0;
+ singleton->make_flags[path] = MakeInfo();
}
- singleton->make_flags[path] |= MAKE_NORMAL_FLAG;
-
- singleton->mutex->unlock();
+ singleton->make_flags[path].flags |= MAKE_NORMAL_FLAG;
}
void ResourceImporterTexture::update_imports() {
-
if (EditorFileSystem::get_singleton()->is_scanning() || EditorFileSystem::get_singleton()->is_importing()) {
return; // do nothing for now
}
- mutex->lock();
-
- if (make_flags.empty()) {
- mutex->unlock();
- return;
- }
+ MutexLock lock(mutex);
Vector<String> to_reimport;
- for (Map<StringName, int>::Element *E = make_flags.front(); E; E = E->next()) {
+ {
+ if (make_flags.empty()) {
+ return;
+ }
- Ref<ConfigFile> cf;
- cf.instance();
- String src_path = String(E->key()) + ".import";
+ for (Map<StringName, MakeInfo>::Element *E = make_flags.front(); E; E = E->next()) {
+ Ref<ConfigFile> cf;
+ cf.instance();
+ String src_path = String(E->key()) + ".import";
- Error err = cf->load(src_path);
- ERR_CONTINUE(err != OK);
+ Error err = cf->load(src_path);
+ ERR_CONTINUE(err != OK);
- bool changed = false;
- if (E->get() & MAKE_SRGB_FLAG && int(cf->get_value("params", "flags/srgb")) == 2) {
- cf->set_value("params", "flags/srgb", 1);
- changed = true;
- }
+ bool changed = false;
- if (E->get() & MAKE_NORMAL_FLAG && int(cf->get_value("params", "compress/normal_map")) == 0) {
- cf->set_value("params", "compress/normal_map", 1);
- changed = true;
- }
+ if (E->get().flags & MAKE_NORMAL_FLAG && int(cf->get_value("params", "compress/normal_map")) == 0) {
+ cf->set_value("params", "compress/normal_map", 1);
+ changed = true;
+ }
- if (E->get() & MAKE_3D_FLAG && bool(cf->get_value("params", "detect_3d"))) {
- cf->set_value("params", "detect_3d", false);
- cf->set_value("params", "compress/mode", 2);
- cf->set_value("params", "flags/repeat", true);
- cf->set_value("params", "flags/filter", true);
- cf->set_value("params", "flags/mipmaps", true);
- changed = true;
- }
+ if (E->get().flags & MAKE_ROUGHNESS_FLAG && int(cf->get_value("params", "roughness/mode")) == 0) {
+ cf->set_value("params", "roughness/mode", E->get().channel_for_roughness + 2);
+ cf->set_value("params", "roughness/src_normal", E->get().normal_path_for_roughness);
+ changed = true;
+ }
- if (changed) {
- cf->save(src_path);
- to_reimport.push_back(E->key());
- }
- }
+ if (E->get().flags & MAKE_3D_FLAG && bool(cf->get_value("params", "detect_3d/compress_to"))) {
+ int compress_to = cf->get_value("params", "detect_3d/compress_to");
+ cf->set_value("params", "detect_3d/compress_to", 0);
+ if (compress_to == 1) {
+ cf->set_value("params", "compress/mode", COMPRESS_VRAM_COMPRESSED);
+ } else if (compress_to == 2) {
+ cf->set_value("params", "compress/mode", COMPRESS_BASIS_UNIVERSAL);
+ }
+ cf->set_value("params", "mipmaps/generate", true);
+ changed = true;
+ }
- make_flags.clear();
+ if (changed) {
+ cf->save(src_path);
+ to_reimport.push_back(E->key());
+ }
+ }
- mutex->unlock();
+ make_flags.clear();
+ }
if (to_reimport.size()) {
EditorFileSystem::get_singleton()->reimport_files(to_reimport);
@@ -136,42 +134,42 @@ void ResourceImporterTexture::update_imports() {
}
String ResourceImporterTexture::get_importer_name() const {
-
return "texture";
}
String ResourceImporterTexture::get_visible_name() const {
-
- return "Texture";
+ return "Texture2D";
}
-void ResourceImporterTexture::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterTexture::get_recognized_extensions(List<String> *p_extensions) const {
ImageLoader::get_recognized_extensions(p_extensions);
}
+
String ResourceImporterTexture::get_save_extension() const {
return "stex";
}
String ResourceImporterTexture::get_resource_type() const {
-
- return "StreamTexture";
+ return "StreamTexture2D";
}
bool ResourceImporterTexture::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
if (p_option == "compress/lossy_quality") {
int compress_mode = int(p_options["compress/mode"]);
- if (compress_mode != COMPRESS_LOSSY && compress_mode != COMPRESS_VIDEO_RAM) {
+ if (compress_mode != COMPRESS_LOSSY && compress_mode != COMPRESS_VRAM_COMPRESSED) {
return false;
}
} else if (p_option == "compress/hdr_mode") {
int compress_mode = int(p_options["compress/mode"]);
- if (compress_mode != COMPRESS_VIDEO_RAM) {
+ if (compress_mode < COMPRESS_VRAM_COMPRESSED) {
return false;
}
+ } else if (p_option == "mipmaps/limit") {
+ return p_options["mipmaps/generate"];
+
} else if (p_option == "compress/bptc_ldr") {
int compress_mode = int(p_options["compress/mode"]);
- if (compress_mode != COMPRESS_VIDEO_RAM) {
+ if (compress_mode < COMPRESS_VRAM_COMPRESSED) {
return false;
}
if (!ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc")) {
@@ -183,240 +181,242 @@ bool ResourceImporterTexture::get_option_visibility(const String &p_option, cons
}
int ResourceImporterTexture::get_preset_count() const {
- return 4;
+ return 3;
}
-String ResourceImporterTexture::get_preset_name(int p_idx) const {
+String ResourceImporterTexture::get_preset_name(int p_idx) const {
static const char *preset_names[] = {
- "2D, Detect 3D",
+ "2D/3D (Auto-Detect)",
"2D",
- "2D Pixel",
- "3D"
+ "3D",
};
return preset_names[p_idx];
}
void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Lossless,Lossy,Video RAM,Uncompressed", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), p_preset == PRESET_3D ? 2 : 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "compress/lossy_quality", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.7));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/hdr_mode", PROPERTY_HINT_ENUM, "Enabled,Force RGBE"), 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/bptc_ldr", PROPERTY_HINT_ENUM, "Enabled,RGBA Only"), 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Lossless,Lossy,VRAM Compressed,VRAM Uncompressed,Basis Universal", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), p_preset == PRESET_3D ? 2 : 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "compress/lossy_quality", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.7));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/hdr_compression", PROPERTY_HINT_ENUM, "Disabled,Opaque Only,Always"), 1));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/bptc_ldr", PROPERTY_HINT_ENUM, "Disabled,Enabled,RGBA Only"), 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/normal_map", PROPERTY_HINT_ENUM, "Detect,Enable,Disabled"), 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "flags/repeat", PROPERTY_HINT_ENUM, "Disabled,Enabled,Mirrored"), p_preset == PRESET_3D ? 1 : 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "flags/filter"), p_preset != PRESET_2D_PIXEL));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "flags/mipmaps"), p_preset == PRESET_3D));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "flags/anisotropic"), false));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "flags/srgb", PROPERTY_HINT_ENUM, "Disable,Enable,Detect"), 2));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/channel_pack", PROPERTY_HINT_ENUM, "sRGB Friendly,Optimized"), 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/streamed"), false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "mipmaps/generate"), (p_preset == PRESET_3D ? true : false)));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "mipmaps/limit", PROPERTY_HINT_RANGE, "-1,256"), -1));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "roughness/mode", PROPERTY_HINT_ENUM, "Detect,Disabled,Red,Green,Blue,Alpha,Gray"), 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "roughness/src_normal", PROPERTY_HINT_FILE, "*.png,*.jpg"), ""));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/fix_alpha_border"), p_preset != PRESET_3D));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/premult_alpha"), false));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/HDR_as_SRGB"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/invert_color"), false));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "stream"), false));
- r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "size_limit", PROPERTY_HINT_RANGE, "0,4096,1"), 0));
- r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "detect_3d"), p_preset == PRESET_DETECT));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "svg/scale", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 1.0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/HDR_as_SRGB"), false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "process/size_limit", PROPERTY_HINT_RANGE, "0,4096,1"), 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "detect_3d/compress_to", PROPERTY_HINT_ENUM, "Disabled,VRAM Compressed,Basis Universal"), (p_preset == PRESET_DETECT) ? 1 : 0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "svg/scale", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 1.0));
}
-void ResourceImporterTexture::_save_stex(const Ref<Image> &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb, bool p_force_rgbe, bool p_detect_normal, bool p_force_normal, bool p_force_po2_for_compressed) {
-
- FileAccess *f = FileAccess::open(p_to_path, FileAccess::WRITE);
- f->store_8('G');
- f->store_8('D');
- f->store_8('S');
- f->store_8('T'); //godot streamable texture
-
- bool resize_to_po2 = false;
-
- if (p_compress_mode == COMPRESS_VIDEO_RAM && p_force_po2_for_compressed && (p_mipmaps || p_texture_flags & Texture::FLAG_REPEAT)) {
- resize_to_po2 = true;
- f->store_16(next_power_of_2(p_image->get_width()));
- f->store_16(p_image->get_width());
- f->store_16(next_power_of_2(p_image->get_height()));
- f->store_16(p_image->get_height());
- } else {
- f->store_16(p_image->get_width());
- f->store_16(0);
- f->store_16(p_image->get_height());
- f->store_16(0);
- }
- f->store_32(p_texture_flags);
-
- uint32_t format = 0;
-
- if (p_streamable)
- format |= StreamTexture::FORMAT_BIT_STREAM;
- if (p_mipmaps)
- format |= StreamTexture::FORMAT_BIT_HAS_MIPMAPS; //mipmaps bit
- if (p_detect_3d)
- format |= StreamTexture::FORMAT_BIT_DETECT_3D;
- if (p_detect_srgb)
- format |= StreamTexture::FORMAT_BIT_DETECT_SRGB;
- if (p_detect_normal)
- format |= StreamTexture::FORMAT_BIT_DETECT_NORMAL;
-
- if ((p_compress_mode == COMPRESS_LOSSLESS || p_compress_mode == COMPRESS_LOSSY) && p_image->get_format() > Image::FORMAT_RGBA8) {
- p_compress_mode = COMPRESS_UNCOMPRESSED; //these can't go as lossy
- }
-
+void ResourceImporterTexture::save_to_stex_format(FileAccess *f, const Ref<Image> &p_image, CompressMode p_compress_mode, Image::UsedChannels p_channels, Image::CompressMode p_compress_format, float p_lossy_quality) {
switch (p_compress_mode) {
case COMPRESS_LOSSLESS: {
+ f->store_32(StreamTexture2D::DATA_FORMAT_LOSSLESS);
+ f->store_16(p_image->get_width());
+ f->store_16(p_image->get_height());
+ f->store_32(p_image->get_mipmap_count());
+ f->store_32(p_image->get_format());
+
+ for (int i = 0; i < p_image->get_mipmap_count() + 1; i++) {
+ Vector<uint8_t> data = Image::lossless_packer(p_image->get_image_from_mipmap(i));
+ int data_len = data.size();
+ f->store_32(data_len);
- Ref<Image> image = p_image->duplicate();
- if (p_mipmaps) {
- image->generate_mipmaps();
- } else {
- image->clear_mipmaps();
+ const uint8_t *r = data.ptr();
+ f->store_buffer(r, data_len);
}
- int mmc = image->get_mipmap_count() + 1;
-
- format |= StreamTexture::FORMAT_BIT_LOSSLESS;
- f->store_32(format);
- f->store_32(mmc);
-
- for (int i = 0; i < mmc; i++) {
-
- if (i > 0) {
- image->shrink_x2();
- }
-
- PoolVector<uint8_t> data = Image::lossless_packer(image);
+ } break;
+ case COMPRESS_LOSSY: {
+ f->store_32(StreamTexture2D::DATA_FORMAT_LOSSY);
+ f->store_16(p_image->get_width());
+ f->store_16(p_image->get_height());
+ f->store_32(p_image->get_mipmap_count());
+ f->store_32(p_image->get_format());
+
+ for (int i = 0; i < p_image->get_mipmap_count() + 1; i++) {
+ Vector<uint8_t> data = Image::lossy_packer(p_image->get_image_from_mipmap(i), p_lossy_quality);
int data_len = data.size();
f->store_32(data_len);
- PoolVector<uint8_t>::Read r = data.read();
- f->store_buffer(r.ptr(), data_len);
+ const uint8_t *r = data.ptr();
+ f->store_buffer(r, data_len);
}
-
} break;
- case COMPRESS_LOSSY: {
+ case COMPRESS_VRAM_COMPRESSED: {
Ref<Image> image = p_image->duplicate();
- if (p_mipmaps) {
- image->generate_mipmaps();
- } else {
- image->clear_mipmaps();
- }
- int mmc = image->get_mipmap_count() + 1;
+ image->compress_from_channels(p_compress_format, p_channels, p_lossy_quality);
- format |= StreamTexture::FORMAT_BIT_LOSSY;
- f->store_32(format);
- f->store_32(mmc);
+ f->store_32(StreamTexture2D::DATA_FORMAT_IMAGE);
+ f->store_16(image->get_width());
+ f->store_16(image->get_height());
+ f->store_32(image->get_mipmap_count());
+ f->store_32(image->get_format());
- for (int i = 0; i < mmc; i++) {
+ Vector<uint8_t> data = image->get_data();
+ int dl = data.size();
+ const uint8_t *r = data.ptr();
+ f->store_buffer(r, dl);
+ } break;
+ case COMPRESS_VRAM_UNCOMPRESSED: {
+ f->store_32(StreamTexture2D::DATA_FORMAT_IMAGE);
+ f->store_16(p_image->get_width());
+ f->store_16(p_image->get_height());
+ f->store_32(p_image->get_mipmap_count());
+ f->store_32(p_image->get_format());
+
+ Vector<uint8_t> data = p_image->get_data();
+ int dl = data.size();
+ const uint8_t *r = data.ptr();
- if (i > 0) {
- image->shrink_x2();
- }
+ f->store_buffer(r, dl);
- PoolVector<uint8_t> data = Image::lossy_packer(image, p_lossy_quality);
+ } break;
+ case COMPRESS_BASIS_UNIVERSAL: {
+ f->store_32(StreamTexture2D::DATA_FORMAT_BASIS_UNIVERSAL);
+ f->store_16(p_image->get_width());
+ f->store_16(p_image->get_height());
+ f->store_32(p_image->get_mipmap_count());
+ f->store_32(p_image->get_format());
+
+ for (int i = 0; i < p_image->get_mipmap_count() + 1; i++) {
+ Vector<uint8_t> data = Image::basis_universal_packer(p_image->get_image_from_mipmap(i), p_channels);
int data_len = data.size();
f->store_32(data_len);
- PoolVector<uint8_t>::Read r = data.read();
- f->store_buffer(r.ptr(), data_len);
+ const uint8_t *r = data.ptr();
+ f->store_buffer(r, data_len);
}
} break;
- case COMPRESS_VIDEO_RAM: {
+ }
+}
- Ref<Image> image = p_image->duplicate();
- if (resize_to_po2) {
- image->resize_to_po2();
- }
- if (p_mipmaps) {
- image->generate_mipmaps(p_force_normal);
- }
+void ResourceImporterTexture::_save_stex(const Ref<Image> &p_image, const String &p_to_path, CompressMode p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, bool p_streamable, bool p_detect_3d, bool p_detect_roughness, bool p_detect_normal, bool p_force_normal, bool p_srgb_friendly, bool p_force_po2_for_compressed, uint32_t p_limit_mipmap, const Ref<Image> &p_normal, Image::RoughnessChannel p_roughness_channel) {
+ FileAccess *f = FileAccess::open(p_to_path, FileAccess::WRITE);
+ f->store_8('G');
+ f->store_8('S');
+ f->store_8('T');
+ f->store_8('2'); //godot streamable texture 2D
+
+ //format version
+ f->store_32(StreamTexture2D::FORMAT_VERSION);
+ //texture may be resized later, so original size must be saved first
+ f->store_32(p_image->get_width());
+ f->store_32(p_image->get_height());
+
+ uint32_t flags = 0;
+ if (p_streamable) {
+ flags |= StreamTexture2D::FORMAT_BIT_STREAM;
+ }
+ if (p_mipmaps) {
+ flags |= StreamTexture2D::FORMAT_BIT_HAS_MIPMAPS; //mipmaps bit
+ }
+ if (p_detect_3d) {
+ flags |= StreamTexture2D::FORMAT_BIT_DETECT_3D;
+ }
+ if (p_detect_roughness) {
+ flags |= StreamTexture2D::FORMAT_BIT_DETECT_ROUGNESS;
+ }
+ if (p_detect_normal) {
+ flags |= StreamTexture2D::FORMAT_BIT_DETECT_NORMAL;
+ }
- if (p_force_rgbe && image->get_format() >= Image::FORMAT_R8 && image->get_format() <= Image::FORMAT_RGBE9995) {
- image->convert(Image::FORMAT_RGBE9995);
- } else {
- Image::CompressSource csource = Image::COMPRESS_SOURCE_GENERIC;
- if (p_force_normal) {
- csource = Image::COMPRESS_SOURCE_NORMAL;
- } else if (p_texture_flags & VS::TEXTURE_FLAG_CONVERT_TO_LINEAR) {
- csource = Image::COMPRESS_SOURCE_SRGB;
- }
+ f->store_32(flags);
+ f->store_32(p_limit_mipmap);
+ //reserved for future use
+ f->store_32(0);
+ f->store_32(0);
+ f->store_32(0);
+
+ /*
+ print_line("streamable " + itos(p_streamable));
+ print_line("mipmaps " + itos(p_mipmaps));
+ print_line("detect_3d " + itos(p_detect_3d));
+ print_line("roughness " + itos(p_detect_roughness));
+ print_line("normal " + itos(p_detect_normal));
+*/
- image->compress(p_vram_compression, csource, p_lossy_quality);
- }
+ if ((p_compress_mode == COMPRESS_LOSSLESS || p_compress_mode == COMPRESS_LOSSY) && p_image->get_format() > Image::FORMAT_RGBA8) {
+ p_compress_mode = COMPRESS_VRAM_UNCOMPRESSED; //these can't go as lossy
+ }
- format |= image->get_format();
+ Ref<Image> image = p_image->duplicate();
- f->store_32(format);
+ if (((p_compress_mode == COMPRESS_BASIS_UNIVERSAL) || (p_compress_mode == COMPRESS_VRAM_COMPRESSED && p_force_po2_for_compressed)) && p_mipmaps) {
+ image->resize_to_po2();
+ }
- PoolVector<uint8_t> data = image->get_data();
- int dl = data.size();
- PoolVector<uint8_t>::Read r = data.read();
- f->store_buffer(r.ptr(), dl);
- } break;
- case COMPRESS_UNCOMPRESSED: {
+ if (p_mipmaps && (!image->has_mipmaps() || p_force_normal)) {
+ image->generate_mipmaps(p_force_normal);
+ }
- Ref<Image> image = p_image->duplicate();
- if (p_mipmaps) {
- image->generate_mipmaps();
- } else {
- image->clear_mipmaps();
- }
+ if (!p_mipmaps) {
+ image->clear_mipmaps();
+ }
- format |= image->get_format();
- f->store_32(format);
+ if (image->has_mipmaps() && p_normal.is_valid()) {
+ image->generate_mipmap_roughness(p_roughness_channel, p_normal);
+ }
- PoolVector<uint8_t> data = image->get_data();
- int dl = data.size();
- PoolVector<uint8_t>::Read r = data.read();
+ Image::CompressSource csource = Image::COMPRESS_SOURCE_GENERIC;
+ if (p_force_normal) {
+ csource = Image::COMPRESS_SOURCE_NORMAL;
+ } else if (p_srgb_friendly) {
+ csource = Image::COMPRESS_SOURCE_SRGB;
+ }
- f->store_buffer(r.ptr(), dl);
+ Image::UsedChannels used_channels = image->detect_used_channels(csource);
- } break;
- }
+ save_to_stex_format(f, image, p_compress_mode, used_channels, p_vram_compression, p_lossy_quality);
memdelete(f);
}
Error ResourceImporterTexture::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
- int compress_mode = p_options["compress/mode"];
+ CompressMode compress_mode = CompressMode(int(p_options["compress/mode"]));
float lossy = p_options["compress/lossy_quality"];
- int repeat = p_options["flags/repeat"];
- bool filter = p_options["flags/filter"];
- bool mipmaps = p_options["flags/mipmaps"];
- bool anisotropic = p_options["flags/anisotropic"];
- int srgb = p_options["flags/srgb"];
+ int pack_channels = p_options["compress/channel_pack"];
+ bool mipmaps = p_options["mipmaps/generate"];
+ uint32_t mipmap_limit = int(mipmaps ? int(p_options["mipmaps/limit"]) : int(-1));
bool fix_alpha_border = p_options["process/fix_alpha_border"];
bool premult_alpha = p_options["process/premult_alpha"];
bool invert_color = p_options["process/invert_color"];
- bool stream = p_options["stream"];
- int size_limit = p_options["size_limit"];
+ bool stream = p_options["compress/streamed"];
+ int size_limit = p_options["process/size_limit"];
bool hdr_as_srgb = p_options["process/HDR_as_SRGB"];
int normal = p_options["compress/normal_map"];
float scale = p_options["svg/scale"];
- bool force_rgbe = p_options["compress/hdr_mode"];
+ int hdr_compression = p_options["compress/hdr_compression"];
int bptc_ldr = p_options["compress/bptc_ldr"];
+ int roughness = p_options["roughness/mode"];
+ String normal_map = p_options["roughness/src_normal"];
+ Ref<Image> normal_image;
+ Image::RoughnessChannel roughness_channel = Image::ROUGHNESS_CHANNEL_R;
+
+ if (mipmaps && roughness > 1 && FileAccess::exists(normal_map)) {
+ normal_image.instance();
+ if (ImageLoader::load_image(normal_map, normal_image) == OK) {
+ roughness_channel = Image::RoughnessChannel(roughness - 2);
+ }
+ }
Ref<Image> image;
image.instance();
- Error err = ImageLoader::load_image(p_source_file, image, NULL, hdr_as_srgb, scale);
- if (err != OK)
+ Error err = ImageLoader::load_image(p_source_file, image, nullptr, hdr_as_srgb, scale);
+ if (err != OK) {
return err;
+ }
Array formats_imported;
- int tex_flags = 0;
- if (repeat > 0)
- tex_flags |= Texture::FLAG_REPEAT;
- if (repeat == 2)
- tex_flags |= Texture::FLAG_MIRRORED_REPEAT;
- if (filter)
- tex_flags |= Texture::FLAG_FILTER;
- if (mipmaps || compress_mode == COMPRESS_VIDEO_RAM)
- tex_flags |= Texture::FLAG_MIPMAPS;
- if (anisotropic)
- tex_flags |= Texture::FLAG_ANISOTROPIC_FILTER;
- if (srgb == 1)
- tex_flags |= Texture::FLAG_CONVERT_TO_LINEAR;
-
if (size_limit > 0 && (image->get_width() > size_limit || image->get_height() > size_limit)) {
//limit size
if (image->get_width() >= image->get_height()) {
@@ -425,7 +425,6 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC);
} else {
-
int new_height = size_limit;
int new_width = image->get_width() * new_height / image->get_height();
@@ -449,76 +448,96 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
int height = image->get_height();
int width = image->get_width();
- image->lock();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
image->set_pixel(i, j, image->get_pixel(i, j).inverted());
}
}
- image->unlock();
}
- bool detect_3d = p_options["detect_3d"];
- bool detect_srgb = srgb == 2;
+ if (compress_mode == COMPRESS_BASIS_UNIVERSAL && image->get_format() >= Image::FORMAT_RF) {
+ //basis universal does not support float formats, fall back
+ compress_mode = COMPRESS_VRAM_COMPRESSED;
+ }
+
+ bool detect_3d = int(p_options["detect_3d/compress_to"]) > 0;
+ bool detect_roughness = roughness == 0;
bool detect_normal = normal == 0;
bool force_normal = normal == 1;
+ bool srgb_friendly_pack = pack_channels == 0;
- if (compress_mode == COMPRESS_VIDEO_RAM) {
+ if (compress_mode == COMPRESS_VRAM_COMPRESSED) {
//must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc).
//Android, GLES 2.x
bool ok_on_pc = false;
bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995);
- bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGBA5551);
+ bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565);
bool can_bptc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc");
bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_s3tc");
if (can_bptc) {
- Image::DetectChannels channels = image->get_detected_channels();
- if (is_hdr) {
+ //add to the list anyway
+ formats_imported.push_back("bptc");
+ }
- if (channels == Image::DETECTED_LA || channels == Image::DETECTED_RGBA) {
- can_bptc = false;
+ bool can_compress_hdr = hdr_compression > 0;
+ bool has_alpha = image->detect_alpha() != Image::ALPHA_NONE;
+
+ if (is_hdr && can_compress_hdr) {
+ if (has_alpha) {
+ //can compress hdr, but hdr with alpha is not compressible
+ if (hdr_compression == 2) {
+ //but user selected to compress hdr anyway, so force an alpha-less format.
+ if (image->get_format() == Image::FORMAT_RGBAF) {
+ image->convert(Image::FORMAT_RGBF);
+ } else if (image->get_format() == Image::FORMAT_RGBAH) {
+ image->convert(Image::FORMAT_RGBH);
+ }
+ } else {
+ can_compress_hdr = false;
}
- } else if (is_ldr) {
+ }
- //handle "RGBA Only" setting
- if (bptc_ldr == 1 && channels != Image::DETECTED_LA && channels != Image::DETECTED_RGBA) {
- can_bptc = false;
+ if (can_compress_hdr) {
+ if (!can_bptc) {
+ //fallback to RGBE99995
+ if (image->get_format() != Image::FORMAT_RGBE9995) {
+ image->convert(Image::FORMAT_RGBE9995);
+ }
}
+ } else {
+ can_bptc = false;
}
-
- formats_imported.push_back("bptc");
}
- if (!can_bptc && is_hdr && !force_rgbe) {
- //convert to ldr if this can't be stored hdr
- image->convert(Image::FORMAT_RGBA8);
+ if (is_ldr && can_bptc) {
+ if (bptc_ldr == 0 || (bptc_ldr == 1 && !has_alpha)) {
+ can_bptc = false;
+ }
}
if (can_bptc || can_s3tc) {
- _save_stex(image, p_save_path + ".s3tc.stex", compress_mode, lossy, can_bptc ? Image::COMPRESS_BPTC : Image::COMPRESS_S3TC, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, false);
+ _save_stex(image, p_save_path + ".s3tc.stex", compress_mode, lossy, can_bptc ? Image::COMPRESS_BPTC : Image::COMPRESS_S3TC, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
r_platform_variants->push_back("s3tc");
formats_imported.push_back("s3tc");
ok_on_pc = true;
}
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) {
-
- _save_stex(image, p_save_path + ".etc2.stex", compress_mode, lossy, Image::COMPRESS_ETC2, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, true);
+ _save_stex(image, p_save_path + ".etc2.stex", compress_mode, lossy, Image::COMPRESS_ETC2, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel);
r_platform_variants->push_back("etc2");
formats_imported.push_back("etc2");
}
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) {
- _save_stex(image, p_save_path + ".etc.stex", compress_mode, lossy, Image::COMPRESS_ETC, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, true);
+ _save_stex(image, p_save_path + ".etc.stex", compress_mode, lossy, Image::COMPRESS_ETC, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel);
r_platform_variants->push_back("etc");
formats_imported.push_back("etc");
}
if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) {
-
- _save_stex(image, p_save_path + ".pvrtc.stex", compress_mode, lossy, Image::COMPRESS_PVRTC4, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, true);
+ _save_stex(image, p_save_path + ".pvrtc.stex", compress_mode, lossy, Image::COMPRESS_PVRTC4, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel);
r_platform_variants->push_back("pvrtc");
formats_imported.push_back("pvrtc");
}
@@ -528,12 +547,12 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
}
} else {
//import normally
- _save_stex(image, p_save_path + ".stex", compress_mode, lossy, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, tex_flags, stream, detect_3d, detect_srgb, force_rgbe, detect_normal, force_normal, false);
+ _save_stex(image, p_save_path + ".stex", compress_mode, lossy, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel);
}
if (r_metadata) {
Dictionary metadata;
- metadata["vram_texture"] = compress_mode == COMPRESS_VIDEO_RAM;
+ metadata["vram_texture"] = compress_mode == COMPRESS_VRAM_COMPRESSED;
if (formats_imported.size()) {
metadata["imported_formats"] = formats_imported;
}
@@ -548,10 +567,9 @@ const char *ResourceImporterTexture::compression_formats[] = {
"etc",
"etc2",
"pvrtc",
- NULL
+ nullptr
};
String ResourceImporterTexture::get_import_settings_string() const {
-
String s;
int index = 0;
@@ -568,7 +586,6 @@ String ResourceImporterTexture::get_import_settings_string() const {
}
bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) const {
-
//will become invalid if formats are missing to import
Dictionary metadata = ResourceFormatImporter::get_singleton()->get_resource_metadata(p_path);
@@ -603,18 +620,14 @@ bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) co
return valid;
}
-ResourceImporterTexture *ResourceImporterTexture::singleton = NULL;
+ResourceImporterTexture *ResourceImporterTexture::singleton = nullptr;
ResourceImporterTexture::ResourceImporterTexture() {
-
singleton = this;
- StreamTexture::request_3d_callback = _texture_reimport_3d;
- StreamTexture::request_srgb_callback = _texture_reimport_srgb;
- StreamTexture::request_normal_callback = _texture_reimport_normal;
- mutex = Mutex::create();
+ StreamTexture2D::request_3d_callback = _texture_reimport_3d;
+ StreamTexture2D::request_roughness_callback = _texture_reimport_roughness;
+ StreamTexture2D::request_normal_callback = _texture_reimport_normal;
}
ResourceImporterTexture::~ResourceImporterTexture() {
-
- memdelete(mutex);
}
diff --git a/editor/import/resource_importer_texture.h b/editor/import/resource_importer_texture.h
index fbfd47f4f0..bc41aacae5 100644
--- a/editor/import/resource_importer_texture.h
+++ b/editor/import/resource_importer_texture.h
@@ -33,65 +33,81 @@
#include "core/image.h"
#include "core/io/resource_importer.h"
+#include "core/os/file_access.h"
+#include "scene/resources/texture.h"
+#include "servers/rendering_server.h"
-class StreamTexture;
+class StreamTexture2D;
class ResourceImporterTexture : public ResourceImporter {
GDCLASS(ResourceImporterTexture, ResourceImporter);
+public:
+ enum CompressMode {
+ COMPRESS_LOSSLESS,
+ COMPRESS_LOSSY,
+ COMPRESS_VRAM_COMPRESSED,
+ COMPRESS_VRAM_UNCOMPRESSED,
+ COMPRESS_BASIS_UNIVERSAL
+ };
+
protected:
enum {
MAKE_3D_FLAG = 1,
- MAKE_SRGB_FLAG = 2,
+ MAKE_ROUGHNESS_FLAG = 2,
MAKE_NORMAL_FLAG = 4
};
- Mutex *mutex;
- Map<StringName, int> make_flags;
+ Mutex mutex;
+ struct MakeInfo {
+ int flags;
+ String normal_path_for_roughness;
+ RS::TextureDetectRoughnessChannel channel_for_roughness;
+ MakeInfo() {
+ flags = 0;
+ channel_for_roughness = RS::TEXTURE_DETECT_ROUGNHESS_R;
+ }
+ };
+
+ Map<StringName, MakeInfo> make_flags;
- static void _texture_reimport_srgb(const Ref<StreamTexture> &p_tex);
- static void _texture_reimport_3d(const Ref<StreamTexture> &p_tex);
- static void _texture_reimport_normal(const Ref<StreamTexture> &p_tex);
+ static void _texture_reimport_roughness(const Ref<StreamTexture2D> &p_tex, const String &p_normal_path, RenderingServer::TextureDetectRoughnessChannel p_channel);
+ static void _texture_reimport_3d(const Ref<StreamTexture2D> &p_tex);
+ static void _texture_reimport_normal(const Ref<StreamTexture2D> &p_tex);
static ResourceImporterTexture *singleton;
static const char *compression_formats[];
+ void _save_stex(const Ref<Image> &p_image, const String &p_to_path, CompressMode p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, bool p_streamable, bool p_detect_3d, bool p_detect_srgb, bool p_detect_normal, bool p_force_normal, bool p_srgb_friendly, bool p_force_po2_for_compressed, uint32_t p_limit_mipmap, const Ref<Image> &p_normal, Image::RoughnessChannel p_roughness_channel);
+
public:
+ static void save_to_stex_format(FileAccess *f, const Ref<Image> &p_image, CompressMode p_compress_mode, Image::UsedChannels p_channels, Image::CompressMode p_compress_format, float p_lossy_quality);
+
static ResourceImporterTexture *get_singleton() { return singleton; }
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
enum Preset {
PRESET_DETECT,
PRESET_2D,
- PRESET_2D_PIXEL,
PRESET_3D,
};
- enum CompressMode {
- COMPRESS_LOSSLESS,
- COMPRESS_LOSSY,
- COMPRESS_VIDEO_RAM,
- COMPRESS_UNCOMPRESSED
- };
-
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
-
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- void _save_stex(const Ref<Image> &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb, bool p_force_rgbe, bool p_detect_normal, bool p_force_normal, bool p_force_po2_for_compressed);
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
void update_imports();
- virtual bool are_import_settings_valid(const String &p_path) const;
- virtual String get_import_settings_string() const;
+ virtual bool are_import_settings_valid(const String &p_path) const override;
+ virtual String get_import_settings_string() const override;
ResourceImporterTexture();
~ResourceImporterTexture();
diff --git a/editor/import/resource_importer_texture_atlas.cpp b/editor/import/resource_importer_texture_atlas.cpp
index 335e1114e6..2423553d22 100644
--- a/editor/import/resource_importer_texture_atlas.cpp
+++ b/editor/import/resource_importer_texture_atlas.cpp
@@ -33,22 +33,21 @@
#include "atlas_import_failed.xpm"
#include "core/io/image_loader.h"
#include "core/io/resource_saver.h"
+#include "core/math/geometry_2d.h"
#include "core/os/file_access.h"
#include "editor/editor_atlas_packer.h"
#include "scene/resources/mesh.h"
#include "scene/resources/texture.h"
String ResourceImporterTextureAtlas::get_importer_name() const {
-
return "texture_atlas";
}
String ResourceImporterTextureAtlas::get_visible_name() const {
-
return "TextureAtlas";
}
-void ResourceImporterTextureAtlas::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterTextureAtlas::get_recognized_extensions(List<String> *p_extensions) const {
ImageLoader::get_recognized_extensions(p_extensions);
}
@@ -57,25 +56,22 @@ String ResourceImporterTextureAtlas::get_save_extension() const {
}
String ResourceImporterTextureAtlas::get_resource_type() const {
-
- return "Texture";
+ return "Texture2D";
}
bool ResourceImporterTextureAtlas::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
return true;
}
int ResourceImporterTextureAtlas::get_preset_count() const {
return 0;
}
-String ResourceImporterTextureAtlas::get_preset_name(int p_idx) const {
+String ResourceImporterTextureAtlas::get_preset_name(int p_idx) const {
return String();
}
void ResourceImporterTextureAtlas::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "atlas_file", PROPERTY_HINT_SAVE_FILE, "*.png"), ""));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "import_mode", PROPERTY_HINT_ENUM, "Region,Mesh2D"), 0));
}
@@ -85,7 +81,6 @@ String ResourceImporterTextureAtlas::get_option_group_file() const {
}
Error ResourceImporterTextureAtlas::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
/* If this happens, it's because the atlas_file field was not filled, so just import a broken texture */
//use an xpm because it's size independent, the editor images are vector and size dependent
@@ -103,7 +98,6 @@ Error ResourceImporterTextureAtlas::import(const String &p_source_file, const St
}
static void _plot_triangle(Vector2 *vertices, const Vector2 &p_offset, bool p_transposed, Ref<Image> p_image, const Ref<Image> &p_src_image) {
-
int width = p_image->get_width();
int height = p_image->get_height();
int src_width = p_src_image->get_width();
@@ -113,7 +107,6 @@ static void _plot_triangle(Vector2 *vertices, const Vector2 &p_offset, bool p_tr
int y[3];
for (int j = 0; j < 3; j++) {
-
x[j] = vertices[j].x;
y[j] = vertices[j].y;
}
@@ -137,14 +130,14 @@ static void _plot_triangle(Vector2 *vertices, const Vector2 &p_offset, bool p_tr
double dx_low = double(x[2] - x[1]) / (y[2] - y[1] + 1);
double xf = x[0];
double xt = x[0] + dx_upper; // if y[0] == y[1], special case
- for (int yi = y[0]; yi <= (y[2] > height - 1 ? height - 1 : y[2]); yi++) {
+ int max_y = MIN(y[2], height - p_offset.y - 1);
+ for (int yi = y[0]; yi <= max_y; yi++) {
if (yi >= 0) {
for (int xi = (xf > 0 ? int(xf) : 0); xi <= (xt < width ? xt : width - 1); xi++) {
-
int px = xi, py = yi;
int sx = px, sy = py;
- sx = CLAMP(sx, 0, src_width);
- sy = CLAMP(sy, 0, src_height);
+ sx = CLAMP(sx, 0, src_width - 1);
+ sy = CLAMP(sy, 0, src_height - 1);
Color color = p_src_image->get_pixel(sx, sy);
if (p_transposed) {
SWAP(px, py);
@@ -165,8 +158,8 @@ static void _plot_triangle(Vector2 *vertices, const Vector2 &p_offset, bool p_tr
for (int xi = (xf < width ? int(xf) : width - 1); xi >= (xt > 0 ? xt : 0); xi--) {
int px = xi, py = yi;
int sx = px, sy = py;
- sx = CLAMP(sx, 0, src_width);
- sy = CLAMP(sy, 0, src_height);
+ sx = CLAMP(sx, 0, src_width - 1);
+ sy = CLAMP(sy, 0, src_height - 1);
Color color = p_src_image->get_pixel(sx, sy);
if (p_transposed) {
SWAP(px, py);
@@ -185,15 +178,15 @@ static void _plot_triangle(Vector2 *vertices, const Vector2 &p_offset, bool p_tr
}
}
xf += dx_far;
- if (yi < y[1])
+ if (yi < y[1]) {
xt += dx_upper;
- else
+ } else {
xt += dx_low;
+ }
}
}
-Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file, const Map<String, Map<StringName, Variant> > &p_source_file_options, const Map<String, String> &p_base_paths) {
-
+Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file, const Map<String, Map<StringName, Variant>> &p_source_file_options, const Map<String, String> &p_base_paths) {
ERR_FAIL_COND_V(p_source_file_options.size() == 0, ERR_BUG); //should never happen
Vector<EditorAtlasPacker::Chart> charts;
@@ -202,8 +195,7 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
pack_data_files.resize(p_source_file_options.size());
int idx = 0;
- for (const Map<String, Map<StringName, Variant> >::Element *E = p_source_file_options.front(); E; E = E->next(), idx++) {
-
+ for (const Map<String, Map<StringName, Variant>>::Element *E = p_source_file_options.front(); E; E = E->next(), idx++) {
PackData &pack_data = pack_data_files.write[idx];
const String &source = E->key();
const Map<StringName, Variant> &options = E->get();
@@ -218,7 +210,6 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
int mode = options["import_mode"];
if (mode == IMPORT_MODE_REGION) {
-
pack_data.is_mesh = false;
EditorAtlasPacker::Chart chart;
@@ -251,17 +242,15 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
Ref<BitMap> bit_map;
bit_map.instance();
bit_map->create_from_image_alpha(image);
- Vector<Vector<Vector2> > polygons = bit_map->clip_opaque_to_polygons(Rect2(0, 0, image->get_width(), image->get_height()));
+ Vector<Vector<Vector2>> polygons = bit_map->clip_opaque_to_polygons(Rect2(0, 0, image->get_width(), image->get_height()));
for (int j = 0; j < polygons.size(); j++) {
-
EditorAtlasPacker::Chart chart;
chart.vertices = polygons[j];
chart.can_transpose = true;
- Vector<int> poly = Geometry::triangulate_polygon(polygons[j]);
+ Vector<int> poly = Geometry2D::triangulate_polygon(polygons[j]);
for (int i = 0; i < poly.size(); i += 3) {
-
EditorAtlasPacker::Chart::Face f;
f.vertex[0] = poly[i + 0];
f.vertex[1] = poly[i + 1];
@@ -286,12 +275,9 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
new_atlas.instance();
new_atlas->create(atlas_width, atlas_height, false, Image::FORMAT_RGBA8);
- new_atlas->lock();
-
for (int i = 0; i < pack_data_files.size(); i++) {
-
PackData &pack_data = pack_data_files.write[i];
- pack_data.image->lock();
+
for (int j = 0; j < pack_data.chart_pieces.size(); j++) {
const EditorAtlasPacker::Chart &chart = charts[pack_data.chart_pieces[j]];
for (int k = 0; k < chart.faces.size(); k++) {
@@ -304,16 +290,14 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
_plot_triangle(positions, chart.final_offset, chart.transposed, new_atlas, pack_data.image);
}
}
- pack_data.image->unlock();
}
- new_atlas->unlock();
//save the atlas
new_atlas->save_png(p_group_file);
//update cache if existing, else create
- Ref<Texture> cache;
+ Ref<Texture2D> cache;
if (ResourceCache::has(p_group_file)) {
Resource *resptr = ResourceCache::get(p_group_file);
cache.reference_ptr(resptr);
@@ -327,11 +311,10 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
//save the images
idx = 0;
- for (const Map<String, Map<StringName, Variant> >::Element *E = p_source_file_options.front(); E; E = E->next(), idx++) {
-
+ for (const Map<String, Map<StringName, Variant>>::Element *E = p_source_file_options.front(); E; E = E->next(), idx++) {
PackData &pack_data = pack_data_files.write[idx];
- Ref<Texture> texture;
+ Ref<Texture2D> texture;
if (!pack_data.is_mesh) {
Vector2 offset = charts[pack_data.chart_pieces[0]].vertices[0] + charts[pack_data.chart_pieces[0]].final_offset;
@@ -350,9 +333,9 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
for (int i = 0; i < pack_data.chart_pieces.size(); i++) {
const EditorAtlasPacker::Chart &chart = charts[pack_data.chart_pieces[i]];
- PoolVector<Vector2> vertices;
- PoolVector<int> indices;
- PoolVector<Vector2> uvs;
+ Vector<Vector2> vertices;
+ Vector<int> indices;
+ Vector<Vector2> uvs;
int vc = chart.vertices.size();
int fc = chart.faces.size();
vertices.resize(vc);
@@ -360,9 +343,9 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file
indices.resize(fc * 3);
{
- PoolVector<Vector2>::Write vw = vertices.write();
- PoolVector<int>::Write iw = indices.write();
- PoolVector<Vector2>::Write uvw = uvs.write();
+ Vector2 *vw = vertices.ptrw();
+ int *iw = indices.ptrw();
+ Vector2 *uvw = uvs.ptrw();
for (int j = 0; j < vc; j++) {
vw[j] = chart.vertices[j];
diff --git a/editor/import/resource_importer_texture_atlas.h b/editor/import/resource_importer_texture_atlas.h
index e455a157cf..25a662a333 100644
--- a/editor/import/resource_importer_texture_atlas.h
+++ b/editor/import/resource_importer_texture_atlas.h
@@ -40,7 +40,7 @@ class ResourceImporterTextureAtlas : public ResourceImporter {
Rect2 region;
bool is_mesh;
Vector<int> chart_pieces; //one for region, many for mesh
- Vector<Vector<Vector2> > chart_vertices; //for mesh
+ Vector<Vector<Vector2>> chart_vertices; //for mesh
Ref<Image> image;
};
@@ -50,21 +50,21 @@ public:
IMPORT_MODE_2D_MESH
};
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
- virtual String get_option_group_file() const;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
+ virtual String get_option_group_file() const override;
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
- virtual Error import_group_file(const String &p_group_file, const Map<String, Map<StringName, Variant> > &p_source_file_options, const Map<String, String> &p_base_paths);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
+ virtual Error import_group_file(const String &p_group_file, const Map<String, Map<StringName, Variant>> &p_source_file_options, const Map<String, String> &p_base_paths) override;
ResourceImporterTextureAtlas();
};
diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp
index 2d43fa089d..cb669b4c89 100644
--- a/editor/import/resource_importer_wav.cpp
+++ b/editor/import/resource_importer_wav.cpp
@@ -39,29 +39,26 @@ const float TRIM_DB_LIMIT = -50;
const int TRIM_FADE_OUT_FRAMES = 500;
String ResourceImporterWAV::get_importer_name() const {
-
return "wav";
}
String ResourceImporterWAV::get_visible_name() const {
-
return "Microsoft WAV";
}
-void ResourceImporterWAV::get_recognized_extensions(List<String> *p_extensions) const {
+void ResourceImporterWAV::get_recognized_extensions(List<String> *p_extensions) const {
p_extensions->push_back("wav");
}
+
String ResourceImporterWAV::get_save_extension() const {
return "sample";
}
String ResourceImporterWAV::get_resource_type() const {
-
return "AudioStreamSample";
}
bool ResourceImporterWAV::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
-
if (p_option == "force/max_rate_hz" && !bool(p_options["force/max_rate"])) {
return false;
}
@@ -72,17 +69,16 @@ bool ResourceImporterWAV::get_option_visibility(const String &p_option, const Ma
int ResourceImporterWAV::get_preset_count() const {
return 0;
}
-String ResourceImporterWAV::get_preset_name(int p_idx) const {
+String ResourceImporterWAV::get_preset_name(int p_idx) const {
return String();
}
void ResourceImporterWAV::get_import_options(List<ImportOption> *r_options, int p_preset) const {
-
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/8_bit"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/mono"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/max_rate", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "force/max_rate_hz", PROPERTY_HINT_EXP_RANGE, "11025,192000,1"), 44100));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "force/max_rate_hz", PROPERTY_HINT_EXP_RANGE, "11025,192000,1"), 44100));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/trim"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/normalize"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/loop"), false));
@@ -90,7 +86,6 @@ void ResourceImporterWAV::get_import_options(List<ImportOption> *r_options, int
}
Error ResourceImporterWAV::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
-
/* STEP 1, READ WAVE FILE */
Error err;
@@ -104,7 +99,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
file->get_buffer((uint8_t *)&riff, 4); //RIFF
if (riff[0] != 'R' || riff[1] != 'I' || riff[2] != 'F' || riff[3] != 'F') {
-
file->close();
memdelete(file);
ERR_FAIL_V(ERR_FILE_UNRECOGNIZED);
@@ -120,7 +114,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
file->get_buffer((uint8_t *)&wave, 4); //RIFF
if (wave[0] != 'W' || wave[1] != 'A' || wave[2] != 'V' || wave[3] != 'E') {
-
file->close();
memdelete(file);
ERR_FAIL_V_MSG(ERR_FILE_UNRECOGNIZED, "Not a WAV file (no WAVE RIFF header).");
@@ -141,7 +134,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
Vector<float> data;
while (!file->eof_reached()) {
-
/* chunk */
char chunkID[4];
file->get_buffer((uint8_t *)&chunkID, 4); //RIFF
@@ -151,7 +143,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
uint32_t file_pos = file->get_position(); //save file pos, so we can skip to next chunk safely
if (file->eof_reached()) {
-
//ERR_PRINT("EOF REACH");
break;
}
@@ -242,7 +233,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
uint32_t s = 0;
for (int b = 0; b < (format_bits >> 3); b++) {
-
s |= ((uint32_t)file->get_8()) << (b * 8);
}
s <<= (32 - format_bits);
@@ -270,8 +260,9 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
* 22:38 06.07.2017 GMT
**/
- for (int i = 0; i < 10; i++)
+ for (int i = 0; i < 10; i++) {
file->get_32(); // i wish to know why should i do this... no doc!
+ }
// only read 0x00 (loop forward), 0x01 (loop ping-pong) and 0x02 (loop backward)
// Skip anything else because it's not supported, reserved for future uses or sampler specific
@@ -322,12 +313,10 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
Vector<float> new_data;
new_data.resize(new_data_frames * format_channels);
for (int c = 0; c < format_channels; c++) {
-
float frac = .0f;
int ipos = 0;
for (int i = 0; i < new_data_frames; i++) {
-
//simple cubic interpolation should be enough.
float mu = frac;
@@ -370,20 +359,17 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
bool normalize = p_options["edit/normalize"];
if (normalize) {
-
float max = 0;
for (int i = 0; i < data.size(); i++) {
-
float amp = Math::abs(data[i]);
- if (amp > max)
+ if (amp > max) {
max = amp;
+ }
}
if (max > 0) {
-
float mult = 1.0 / max;
for (int i = 0; i < data.size(); i++) {
-
data.write[i] *= mult;
}
}
@@ -392,7 +378,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
bool trim = p_options["edit/trim"];
if (trim && !loop && format_channels > 0) {
-
int first = 0;
int last = (frames / format_channels) - 1;
bool found = false;
@@ -420,7 +405,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
Vector<float> new_data;
new_data.resize((last - first) * format_channels);
for (int i = first; i < last; i++) {
-
float fadeOutMult = 1;
if (last - i < TRIM_FADE_OUT_FRAMES) {
@@ -440,7 +424,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
bool make_loop = p_options["edit/loop"];
if (make_loop && !loop) {
-
loop = AudioStreamSample::LOOP_FORWARD;
loop_begin = 0;
loop_end = frames;
@@ -450,7 +433,6 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
bool force_mono = p_options["force/mono"];
if (force_mono && format_channels == 2) {
-
Vector<float> new_data;
new_data.resize(data.size() / 2);
for (int i = 0; i < frames; i++) {
@@ -463,20 +445,17 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
bool force_8_bit = p_options["force/8_bit"];
if (force_8_bit) {
-
is16 = false;
}
- PoolVector<uint8_t> dst_data;
+ Vector<uint8_t> dst_data;
AudioStreamSample::Format dst_format;
if (compression == 1) {
-
dst_format = AudioStreamSample::FORMAT_IMA_ADPCM;
if (format_channels == 1) {
_compress_ima_adpcm(data, dst_data);
} else {
-
//byte interleave
Vector<float> left;
Vector<float> right;
@@ -490,8 +469,8 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
right.write[i] = data[i * 2 + 1];
}
- PoolVector<uint8_t> bleft;
- PoolVector<uint8_t> bright;
+ Vector<uint8_t> bleft;
+ Vector<uint8_t> bright;
_compress_ima_adpcm(left, bleft);
_compress_ima_adpcm(right, bright);
@@ -499,9 +478,9 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
int dl = bleft.size();
dst_data.resize(dl * 2);
- PoolVector<uint8_t>::Write w = dst_data.write();
- PoolVector<uint8_t>::Read rl = bleft.read();
- PoolVector<uint8_t>::Read rr = bright.read();
+ uint8_t *w = dst_data.ptrw();
+ const uint8_t *rl = bleft.ptr();
+ const uint8_t *rr = bright.ptr();
for (int i = 0; i < dl; i++) {
w[i * 2 + 0] = rl[i];
@@ -510,15 +489,13 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
}
} else {
-
dst_format = is16 ? AudioStreamSample::FORMAT_16_BITS : AudioStreamSample::FORMAT_8_BITS;
dst_data.resize(data.size() * (is16 ? 2 : 1));
{
- PoolVector<uint8_t>::Write w = dst_data.write();
+ uint8_t *w = dst_data.ptrw();
int ds = data.size();
for (int i = 0; i < ds; i++) {
-
if (is16) {
int16_t v = CLAMP(data[i] * 32768, -32768, 32767);
encode_uint16(v, &w[i * 2]);
diff --git a/editor/import/resource_importer_wav.h b/editor/import/resource_importer_wav.h
index 59d33feef0..3c4a8757eb 100644
--- a/editor/import/resource_importer_wav.h
+++ b/editor/import/resource_importer_wav.h
@@ -37,19 +37,19 @@ class ResourceImporterWAV : public ResourceImporter {
GDCLASS(ResourceImporterWAV, ResourceImporter);
public:
- virtual String get_importer_name() const;
- virtual String get_visible_name() const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual String get_save_extension() const;
- virtual String get_resource_type() const;
+ virtual String get_importer_name() const override;
+ virtual String get_visible_name() const override;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const override;
+ virtual String get_save_extension() const override;
+ virtual String get_resource_type() const override;
- virtual int get_preset_count() const;
- virtual String get_preset_name(int p_idx) const;
+ virtual int get_preset_count() const override;
+ virtual String get_preset_name(int p_idx) const override;
- virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const;
- virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const;
+ virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override;
+ virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override;
- static void _compress_ima_adpcm(const Vector<float> &p_data, PoolVector<uint8_t> &dst_data) {
+ static void _compress_ima_adpcm(const Vector<float> &p_data, Vector<uint8_t> &dst_data) {
/*p_sample_data->data = (void*)malloc(len);
xm_s8 *dataptr=(xm_s8*)p_sample_data->data;*/
@@ -72,14 +72,15 @@ public:
int datalen = p_data.size();
int datamax = datalen;
- if (datalen & 1)
+ if (datalen & 1) {
datalen++;
+ }
dst_data.resize(datalen / 2 + 4);
- PoolVector<uint8_t>::Write w = dst_data.write();
+ uint8_t *w = dst_data.ptrw();
int i, step_idx = 0, prev = 0;
- uint8_t *out = w.ptr();
+ uint8_t *out = w;
//int16_t xm_prev=0;
const float *in = p_data.ptr();
@@ -96,10 +97,9 @@ public:
uint8_t nibble;
int16_t xm_sample;
- if (i >= datamax)
+ if (i >= datamax) {
xm_sample = 0;
- else {
-
+ } else {
xm_sample = CLAMP(in[i] * 32767.0, -32768, 32767);
/*
if (xm_sample==32767 || xm_sample==-32768)
@@ -121,9 +121,7 @@ public:
}
mask = 4;
while (mask) {
-
if (diff >= step) {
-
nibble |= mask;
diff -= step;
vpdiff += step;
@@ -133,10 +131,11 @@ public:
mask >>= 1;
};
- if (nibble & 8)
+ if (nibble & 8) {
prev -= vpdiff;
- else
+ } else {
prev += vpdiff;
+ }
if (prev > 32767) {
//printf("%i,xms %i, prev %i,diff %i, vpdiff %i, clip up %i\n",i,xm_sample,prev,diff,vpdiff,prev);
@@ -147,10 +146,11 @@ public:
}
step_idx += _ima_adpcm_index_table[nibble];
- if (step_idx < 0)
+ if (step_idx < 0) {
step_idx = 0;
- else if (step_idx > 88)
+ } else if (step_idx > 88) {
step_idx = 88;
+ }
if (i & 1) {
*out |= nibble << 4;
@@ -162,7 +162,7 @@ public:
}
}
- virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL, Variant *r_metadata = NULL);
+ virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override;
ResourceImporterWAV();
};
diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp
index 20d47e8250..8ab2e0aef1 100644
--- a/editor/import_dock.cpp
+++ b/editor/import_dock.cpp
@@ -44,12 +44,11 @@ public:
bool checking;
bool _set(const StringName &p_name, const Variant &p_value) {
-
if (values.has(p_name)) {
values[p_name] = p_value;
if (checking) {
checked.insert(p_name);
- _change_notify(String(p_name).utf8().get_data());
+ _change_notify();
}
return true;
}
@@ -58,7 +57,6 @@ public:
}
bool _get(const StringName &p_name, Variant &r_ret) const {
-
if (values.has(p_name)) {
r_ret = values[p_name];
return true;
@@ -67,10 +65,10 @@ public:
return false;
}
void _get_property_list(List<PropertyInfo> *p_list) const {
-
for (const List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
- if (!importer->get_option_visibility(E->get().name, values))
+ if (!importer->get_option_visibility(E->get().name, values)) {
continue;
+ }
PropertyInfo pi = E->get();
if (checking) {
pi.usage |= PROPERTY_USAGE_CHECKABLE;
@@ -92,7 +90,6 @@ public:
};
void ImportDock::set_edit_path(const String &p_path) {
-
Ref<ConfigFile> config;
config.instance();
Error err = config->load(p_path + ".import");
@@ -107,21 +104,24 @@ void ImportDock::set_edit_path(const String &p_path) {
return;
}
+ params->paths.clear();
+ params->paths.push_back(p_path);
+
_update_options(config);
- List<Ref<ResourceImporter> > importers;
+ List<Ref<ResourceImporter>> importers;
ResourceFormatImporter::get_singleton()->get_importers_for_extension(p_path.get_extension(), &importers);
- List<Pair<String, String> > importer_names;
+ List<Pair<String, String>> importer_names;
- for (List<Ref<ResourceImporter> >::Element *E = importers.front(); E; E = E->next()) {
+ for (List<Ref<ResourceImporter>>::Element *E = importers.front(); E; E = E->next()) {
importer_names.push_back(Pair<String, String>(E->get()->get_visible_name(), E->get()->get_importer_name()));
}
- importer_names.sort_custom<PairSort<String, String> >();
+ importer_names.sort_custom<PairSort<String, String>>();
import_as->clear();
- for (List<Pair<String, String> >::Element *E = importer_names.front(); E; E = E->next()) {
+ for (List<Pair<String, String>>::Element *E = importer_names.front(); E; E = E->next()) {
import_as->add_item(E->get().first);
import_as->set_item_metadata(import_as->get_item_count() - 1, E->get().second);
if (E->get().second == params->importer->get_importer_name()) {
@@ -129,8 +129,6 @@ void ImportDock::set_edit_path(const String &p_path) {
}
}
- params->paths.clear();
- params->paths.push_back(p_path);
import->set_disabled(false);
import_as->set_disabled(false);
preset->set_disabled(false);
@@ -139,17 +137,15 @@ void ImportDock::set_edit_path(const String &p_path) {
}
void ImportDock::_update_options(const Ref<ConfigFile> &p_config) {
-
List<ResourceImporter::ImportOption> options;
params->importer->get_import_options(&options);
params->properties.clear();
params->values.clear();
- params->checking = false;
+ params->checking = params->paths.size() > 1;
params->checked.clear();
for (List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) {
-
params->properties.push_back(E->get().option);
if (p_config.is_valid() && p_config->has_section_key("params", E->get().option.name)) {
params->values[E->get().option.name] = p_config->get_value("params", E->get().option.name);
@@ -159,35 +155,16 @@ void ImportDock::_update_options(const Ref<ConfigFile> &p_config) {
}
params->update();
-
- preset->get_popup()->clear();
-
- if (params->importer->get_preset_count() == 0) {
- preset->get_popup()->add_item(TTR("Default"));
- } else {
- for (int i = 0; i < params->importer->get_preset_count(); i++) {
- preset->get_popup()->add_item(params->importer->get_preset_name(i));
- }
- }
-
- preset->get_popup()->add_separator();
- preset->get_popup()->add_item(vformat(TTR("Set as Default for '%s'"), params->importer->get_visible_name()), ITEM_SET_AS_DEFAULT);
- if (ProjectSettings::get_singleton()->has_setting("importer_defaults/" + params->importer->get_importer_name())) {
- preset->get_popup()->add_item(TTR("Load Default"), ITEM_LOAD_DEFAULT);
- preset->get_popup()->add_separator();
- preset->get_popup()->add_item(vformat(TTR("Clear Default for '%s'"), params->importer->get_visible_name()), ITEM_CLEAR_DEFAULT);
- }
+ _update_preset_menu();
}
void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) {
-
clear();
// Use the value that is repeated the most.
Map<String, Dictionary> value_frequency;
for (int i = 0; i < p_paths.size(); i++) {
-
Ref<ConfigFile> config;
config.instance();
Error err = config->load(p_paths[i] + ".import");
@@ -205,7 +182,6 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) {
config->get_section_keys("params", &keys);
for (List<String>::Element *E = keys.front(); E; E = E->next()) {
-
if (!value_frequency.has(E->get())) {
value_frequency[E->get()] = Dictionary();
}
@@ -231,11 +207,9 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) {
params->checked.clear();
for (List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) {
-
params->properties.push_back(E->get().option);
if (value_frequency.has(E->get().option.name)) {
-
Dictionary d = value_frequency[E->get().option.name];
int freq = 0;
List<Variant> v;
@@ -256,19 +230,19 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) {
params->update();
- List<Ref<ResourceImporter> > importers;
+ List<Ref<ResourceImporter>> importers;
ResourceFormatImporter::get_singleton()->get_importers_for_extension(p_paths[0].get_extension(), &importers);
- List<Pair<String, String> > importer_names;
+ List<Pair<String, String>> importer_names;
- for (List<Ref<ResourceImporter> >::Element *E = importers.front(); E; E = E->next()) {
+ for (List<Ref<ResourceImporter>>::Element *E = importers.front(); E; E = E->next()) {
importer_names.push_back(Pair<String, String>(E->get()->get_visible_name(), E->get()->get_importer_name()));
}
- importer_names.sort_custom<PairSort<String, String> >();
+ importer_names.sort_custom<PairSort<String, String>>();
import_as->clear();
- for (List<Pair<String, String> >::Element *E = importer_names.front(); E; E = E->next()) {
+ for (List<Pair<String, String>>::Element *E = importer_names.front(); E; E = E->next()) {
import_as->add_item(E->get().first);
import_as->set_item_metadata(import_as->get_item_count() - 1, E->get().second);
if (E->get().second == params->importer->get_importer_name()) {
@@ -276,6 +250,17 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) {
}
}
+ _update_preset_menu();
+
+ params->paths = p_paths;
+ import->set_disabled(false);
+ import_as->set_disabled(false);
+ preset->set_disabled(false);
+
+ imported->set_text(vformat(TTR("%d Files"), p_paths.size()));
+}
+
+void ImportDock::_update_preset_menu() {
preset->get_popup()->clear();
if (params->importer->get_preset_count() == 0) {
@@ -286,12 +271,13 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) {
}
}
- params->paths = p_paths;
- import->set_disabled(false);
- import_as->set_disabled(false);
- preset->set_disabled(false);
-
- imported->set_text(itos(p_paths.size()) + TTR(" Files"));
+ preset->get_popup()->add_separator();
+ preset->get_popup()->add_item(vformat(TTR("Set as Default for '%s'"), params->importer->get_visible_name()), ITEM_SET_AS_DEFAULT);
+ if (ProjectSettings::get_singleton()->has_setting("importer_defaults/" + params->importer->get_importer_name())) {
+ preset->get_popup()->add_item(TTR("Load Default"), ITEM_LOAD_DEFAULT);
+ preset->get_popup()->add_separator();
+ preset->get_popup()->add_item(vformat(TTR("Clear Default for '%s'"), params->importer->get_visible_name()), ITEM_CLEAR_DEFAULT);
+ }
}
void ImportDock::_importer_selected(int i_idx) {
@@ -313,7 +299,6 @@ void ImportDock::_importer_selected(int i_idx) {
}
void ImportDock::_preset_selected(int p_idx) {
-
int item_id = preset->get_popup()->get_item_id(p_idx);
switch (item_id) {
@@ -326,46 +311,51 @@ void ImportDock::_preset_selected(int p_idx) {
ProjectSettings::get_singleton()->set("importer_defaults/" + params->importer->get_importer_name(), d);
ProjectSettings::get_singleton()->save();
-
+ _update_preset_menu();
} break;
case ITEM_LOAD_DEFAULT: {
-
ERR_FAIL_COND(!ProjectSettings::get_singleton()->has_setting("importer_defaults/" + params->importer->get_importer_name()));
Dictionary d = ProjectSettings::get_singleton()->get("importer_defaults/" + params->importer->get_importer_name());
List<Variant> v;
d.get_key_list(&v);
+ if (params->checking) {
+ params->checked.clear();
+ }
for (List<Variant>::Element *E = v.front(); E; E = E->next()) {
params->values[E->get()] = d[E->get()];
+ if (params->checking) {
+ params->checked.insert(E->get());
+ }
}
params->update();
-
} break;
case ITEM_CLEAR_DEFAULT: {
-
ProjectSettings::get_singleton()->set("importer_defaults/" + params->importer->get_importer_name(), Variant());
ProjectSettings::get_singleton()->save();
-
+ _update_preset_menu();
} break;
default: {
-
List<ResourceImporter::ImportOption> options;
params->importer->get_import_options(&options, p_idx);
+ if (params->checking) {
+ params->checked.clear();
+ }
for (List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) {
-
params->values[E->get().option.name] = E->get().default_value;
+ if (params->checking) {
+ params->checked.insert(E->get().option.name);
+ }
}
-
params->update();
} break;
}
}
void ImportDock::clear() {
-
imported->set_text("");
import->set_disabled(true);
import_as->clear();
@@ -378,28 +368,27 @@ void ImportDock::clear() {
}
static bool _find_owners(EditorFileSystemDirectory *efsd, const String &p_path) {
-
- if (!efsd)
+ if (!efsd) {
return false;
+ }
for (int i = 0; i < efsd->get_subdir_count(); i++) {
-
if (_find_owners(efsd->get_subdir(i), p_path)) {
return true;
}
}
for (int i = 0; i < efsd->get_file_count(); i++) {
-
Vector<String> deps = efsd->get_file_deps(i);
- if (deps.find(p_path) != -1)
+ if (deps.find(p_path) != -1) {
return true;
+ }
}
return false;
}
-void ImportDock::_reimport_attempt() {
+void ImportDock::_reimport_attempt() {
bool need_restart = false;
bool used_in_resources = false;
for (int i = 0; i < params->paths.size(); i++) {
@@ -419,7 +408,7 @@ void ImportDock::_reimport_attempt() {
if (need_restart) {
label_warning->set_visible(used_in_resources);
- reimport_confirm->popup_centered_minsize();
+ reimport_confirm->popup_centered();
return;
}
@@ -427,7 +416,6 @@ void ImportDock::_reimport_attempt() {
}
void ImportDock::_reimport_and_restart() {
-
EditorNode::get_singleton()->save_all_scenes();
EditorResourcePreview::get_singleton()->stop(); //don't try to re-create previews after import
_reimport();
@@ -435,9 +423,7 @@ void ImportDock::_reimport_and_restart() {
}
void ImportDock::_reimport() {
-
for (int i = 0; i < params->paths.size(); i++) {
-
Ref<ConfigFile> config;
config.instance();
Error err = config->load(params->paths[i] + ".import");
@@ -445,8 +431,8 @@ void ImportDock::_reimport() {
String importer_name = params->importer->get_importer_name();
- if (params->checking) {
- //update only what edited (checkboxes)
+ if (params->checking && config->get_value("remap", "importer") == params->importer->get_importer_name()) {
+ //update only what is edited (checkboxes) if the importer is the same
for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) {
if (params->checked.has(E->get().name)) {
config->set_value("params", E->get().name, params->values[E->get().name]);
@@ -455,7 +441,9 @@ void ImportDock::_reimport() {
} else {
//override entirely
config->set_value("remap", "importer", importer_name);
- config->erase_section("params");
+ if (config->has_section("params")) {
+ config->erase_section("params");
+ }
for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) {
config->set_value("params", E->get().name, params->values[E->get().name]);
@@ -484,16 +472,13 @@ void ImportDock::_reimport() {
void ImportDock::_notification(int p_what) {
switch (p_what) {
-
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-
- imported->add_style_override("normal", get_stylebox("normal", "LineEdit"));
+ imported->add_theme_style_override("normal", get_theme_stylebox("normal", "LineEdit"));
} break;
case NOTIFICATION_ENTER_TREE: {
-
import_opts->edit(params);
- label_warning->add_color_override("font_color", get_color("warning_color", "Editor"));
+ label_warning->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor"));
} break;
}
}
@@ -505,62 +490,55 @@ void ImportDock::_property_toggled(const StringName &p_prop, bool p_checked) {
params->checked.erase(p_prop);
}
}
-void ImportDock::_bind_methods() {
+void ImportDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_reimport"), &ImportDock::_reimport);
- ClassDB::bind_method(D_METHOD("_preset_selected"), &ImportDock::_preset_selected);
- ClassDB::bind_method(D_METHOD("_importer_selected"), &ImportDock::_importer_selected);
- ClassDB::bind_method(D_METHOD("_property_toggled"), &ImportDock::_property_toggled);
- ClassDB::bind_method(D_METHOD("_reimport_and_restart"), &ImportDock::_reimport_and_restart);
- ClassDB::bind_method(D_METHOD("_reimport_attempt"), &ImportDock::_reimport_attempt);
}
void ImportDock::initialize_import_options() const {
-
ERR_FAIL_COND(!import_opts || !params);
import_opts->edit(params);
}
ImportDock::ImportDock() {
-
set_name("Import");
imported = memnew(Label);
- imported->add_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_stylebox("normal", "LineEdit"));
+ imported->add_theme_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("normal", "LineEdit"));
imported->set_clip_text(true);
add_child(imported);
HBoxContainer *hb = memnew(HBoxContainer);
add_margin_child(TTR("Import As:"), hb);
import_as = memnew(OptionButton);
import_as->set_disabled(true);
- import_as->connect("item_selected", this, "_importer_selected");
+ import_as->connect("item_selected", callable_mp(this, &ImportDock::_importer_selected));
hb->add_child(import_as);
import_as->set_h_size_flags(SIZE_EXPAND_FILL);
preset = memnew(MenuButton);
preset->set_text(TTR("Preset"));
preset->set_disabled(true);
- preset->get_popup()->connect("index_pressed", this, "_preset_selected");
+ preset->get_popup()->connect("index_pressed", callable_mp(this, &ImportDock::_preset_selected));
hb->add_child(preset);
import_opts = memnew(EditorInspector);
add_child(import_opts);
import_opts->set_v_size_flags(SIZE_EXPAND_FILL);
- import_opts->connect("property_toggled", this, "_property_toggled");
+ import_opts->connect("property_toggled", callable_mp(this, &ImportDock::_property_toggled));
hb = memnew(HBoxContainer);
add_child(hb);
import = memnew(Button);
import->set_text(TTR("Reimport"));
import->set_disabled(true);
- import->connect("pressed", this, "_reimport_attempt");
+ import->connect("pressed", callable_mp(this, &ImportDock::_reimport_attempt));
hb->add_spacer();
hb->add_child(import);
hb->add_spacer();
reimport_confirm = memnew(ConfirmationDialog);
- reimport_confirm->get_ok()->set_text(TTR("Save scenes, re-import and restart"));
+ reimport_confirm->get_ok()->set_text(TTR("Save Scenes, Re-Import, and Restart"));
add_child(reimport_confirm);
- reimport_confirm->connect("confirmed", this, "_reimport_and_restart");
+ reimport_confirm->connect("confirmed", callable_mp(this, &ImportDock::_reimport_and_restart));
VBoxContainer *vbc_confirm = memnew(VBoxContainer());
vbc_confirm->add_child(memnew(Label(TTR("Changing the type of an imported file requires editor restart."))));
@@ -572,6 +550,5 @@ ImportDock::ImportDock() {
}
ImportDock::~ImportDock() {
-
memdelete(params);
}
diff --git a/editor/import_dock.h b/editor/import_dock.h
index a4378fb60d..7a2e669620 100644
--- a/editor/import_dock.h
+++ b/editor/import_dock.h
@@ -62,6 +62,7 @@ class ImportDock : public VBoxContainer {
void _preset_selected(int p_idx);
void _importer_selected(int i_idx);
void _update_options(const Ref<ConfigFile> &p_config = Ref<ConfigFile>());
+ void _update_preset_menu();
void _property_toggled(const StringName &p_prop, bool p_checked);
void _reimport_attempt();
diff --git a/editor/input_map_editor.cpp b/editor/input_map_editor.cpp
new file mode 100644
index 0000000000..c67e16d371
--- /dev/null
+++ b/editor/input_map_editor.cpp
@@ -0,0 +1,1048 @@
+/*************************************************************************/
+/* input_map_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "input_map_editor.h"
+
+#include "core/input/input_map.h"
+#include "core/os/keyboard.h"
+#include "editor/editor_node.h"
+#include "editor/editor_scale.h"
+
+static const char *_button_descriptions[JOY_SDL_BUTTONS] = {
+ TTRC("Face Bottom, DualShock Cross, Xbox A, Nintendo B"),
+ TTRC("Face Right, DualShock Circle, Xbox B, Nintendo A"),
+ TTRC("Face Left, DualShock Square, Xbox X, Nintendo Y"),
+ TTRC("Face Top, DualShock Triangle, Xbox Y, Nintendo X"),
+ TTRC("DualShock Select, Xbox Back, Nintendo -"),
+ TTRC("Home, DualShock PS, Guide"),
+ TTRC("Start, Nintendo +"),
+ TTRC("Left Stick, DualShock L3, Xbox L/LS"),
+ TTRC("Right Stick, DualShock R3, Xbox R/RS"),
+ TTRC("Left Shoulder, DualShock L1, Xbox LB"),
+ TTRC("Right Shoulder, DualShock R1, Xbox RB"),
+ TTRC("D-Pad Up"),
+ TTRC("D-Pad Down"),
+ TTRC("D-Pad Left"),
+ TTRC("D-Pad Right")
+};
+
+static const char *_axis_descriptions[JOY_AXIS_MAX * 2] = {
+ TTRC("Left Stick Left"),
+ TTRC("Left Stick Right"),
+ TTRC("Left Stick Up"),
+ TTRC("Left Stick Down"),
+ TTRC("Right Stick Left"),
+ TTRC("Right Stick Right"),
+ TTRC("Right Stick Up"),
+ TTRC("Right Stick Down"),
+ TTRC("Joystick 2 Left"),
+ TTRC("Joystick 2 Right, Left Trigger, L2, LT"),
+ TTRC("Joystick 2 Up"),
+ TTRC("Joystick 2 Down, Right Trigger, R2, RT"),
+ TTRC("Joystick 3 Left"),
+ TTRC("Joystick 3 Right"),
+ TTRC("Joystick 3 Up"),
+ TTRC("Joystick 3 Down"),
+ TTRC("Joystick 4 Left"),
+ TTRC("Joystick 4 Right"),
+ TTRC("Joystick 4 Up"),
+ TTRC("Joystick 4 Down"),
+};
+
+void InputMapEditor::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ action_add_error->add_theme_color_override("font_color", input_editor->get_theme_color("error_color", "Editor"));
+ popup_add->add_icon_item(input_editor->get_theme_icon("Keyboard", "EditorIcons"), TTR("Key"), INPUT_KEY);
+ popup_add->add_icon_item(input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons"), TTR("Physical Key"), INPUT_KEY_PHYSICAL);
+ popup_add->add_icon_item(input_editor->get_theme_icon("JoyButton", "EditorIcons"), TTR("Joy Button"), INPUT_JOY_BUTTON);
+ popup_add->add_icon_item(input_editor->get_theme_icon("JoyAxis", "EditorIcons"), TTR("Joy Axis"), INPUT_JOY_MOTION);
+ popup_add->add_icon_item(input_editor->get_theme_icon("Mouse", "EditorIcons"), TTR("Mouse Button"), INPUT_MOUSE_BUTTON);
+ _update_actions();
+ } break;
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ action_add_error->add_theme_color_override("font_color", input_editor->get_theme_color("error_color", "Editor"));
+ popup_add->set_item_icon(popup_add->get_item_index(INPUT_KEY), input_editor->get_theme_icon("Keyboard", "EditorIcons"));
+ popup_add->set_item_icon(popup_add->get_item_index(INPUT_KEY_PHYSICAL), input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons"));
+ popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_BUTTON), input_editor->get_theme_icon("JoyButton", "EditorIcons"));
+ popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_MOTION), input_editor->get_theme_icon("JoyAxis", "EditorIcons"));
+ popup_add->set_item_icon(popup_add->get_item_index(INPUT_MOUSE_BUTTON), input_editor->get_theme_icon("Mouse", "EditorIcons"));
+ _update_actions();
+ } break;
+ }
+}
+
+static bool _validate_action_name(const String &p_name) {
+ const char32_t *cstr = p_name.get_data();
+ for (int i = 0; cstr[i]; i++) {
+ if (cstr[i] == '/' || cstr[i] == ':' || cstr[i] == '"' ||
+ cstr[i] == '=' || cstr[i] == '\\' || cstr[i] < 32) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void InputMapEditor::_action_selected() {
+ TreeItem *ti = input_editor->get_selected();
+ if (!ti || !ti->is_editable(0)) {
+ return;
+ }
+
+ add_at = "input/" + ti->get_text(0);
+ edit_idx = -1;
+}
+
+void InputMapEditor::_action_edited() {
+ TreeItem *ti = input_editor->get_selected();
+ if (!ti) {
+ return;
+ }
+
+ if (input_editor->get_selected_column() == 0) {
+ String new_name = ti->get_text(0);
+ String old_name = add_at.substr(add_at.find("/") + 1, add_at.length());
+
+ if (new_name == old_name) {
+ return;
+ }
+
+ if (new_name == "" || !_validate_action_name(new_name)) {
+ ti->set_text(0, old_name);
+ add_at = "input/" + old_name;
+
+ message->set_text(TTR("Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or '\"'"));
+ message->popup_centered(Size2(300, 100) * EDSCALE);
+ return;
+ }
+
+ String action_prop = "input/" + new_name;
+
+ if (ProjectSettings::get_singleton()->has_setting(action_prop)) {
+ ti->set_text(0, old_name);
+ add_at = "input/" + old_name;
+
+ message->set_text(vformat(TTR("An action with the name '%s' already exists."), new_name));
+ message->popup_centered(Size2(300, 100) * EDSCALE);
+ return;
+ }
+
+ int order = ProjectSettings::get_singleton()->get_order(add_at);
+ Dictionary action = ProjectSettings::get_singleton()->get(add_at);
+
+ setting = true;
+ undo_redo->create_action(TTR("Rename Input Action Event"));
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", add_at);
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_prop, action);
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", action_prop, order);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", action_prop);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", add_at, action);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", add_at, order);
+ undo_redo->add_do_method(this, "_update_actions");
+ undo_redo->add_undo_method(this, "_update_actions");
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+ setting = false;
+
+ add_at = action_prop;
+ } else if (input_editor->get_selected_column() == 1) {
+ String name = "input/" + ti->get_text(0);
+ Dictionary old_action = ProjectSettings::get_singleton()->get(name);
+ Dictionary new_action = old_action.duplicate();
+ new_action["deadzone"] = ti->get_range(1);
+
+ undo_redo->create_action(TTR("Change Action deadzone"));
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, new_action);
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_action);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+ }
+}
+
+void InputMapEditor::_device_input_add() {
+ Ref<InputEvent> ie;
+ String name = add_at;
+ int idx = edit_idx;
+ Dictionary old_val = ProjectSettings::get_singleton()->get(name);
+ Dictionary action = old_val.duplicate();
+ Array events = action["events"];
+
+ switch (add_type) {
+ case INPUT_MOUSE_BUTTON: {
+ Ref<InputEventMouseButton> mb;
+ mb.instance();
+ mb->set_button_index(device_index->get_selected() + 1);
+ mb->set_device(_get_current_device());
+
+ for (int i = 0; i < events.size(); i++) {
+ Ref<InputEventMouseButton> aie = events[i];
+ if (aie.is_null()) {
+ continue;
+ }
+ if (aie->get_device() == mb->get_device() && aie->get_button_index() == mb->get_button_index()) {
+ return;
+ }
+ }
+
+ ie = mb;
+
+ } break;
+ case INPUT_JOY_MOTION: {
+ Ref<InputEventJoypadMotion> jm;
+ jm.instance();
+ jm->set_axis(device_index->get_selected() >> 1);
+ jm->set_axis_value((device_index->get_selected() & 1) ? 1 : -1);
+ jm->set_device(_get_current_device());
+
+ for (int i = 0; i < events.size(); i++) {
+ Ref<InputEventJoypadMotion> aie = events[i];
+ if (aie.is_null()) {
+ continue;
+ }
+
+ if (aie->get_device() == jm->get_device() && aie->get_axis() == jm->get_axis() && aie->get_axis_value() == jm->get_axis_value()) {
+ return;
+ }
+ }
+
+ ie = jm;
+
+ } break;
+ case INPUT_JOY_BUTTON: {
+ Ref<InputEventJoypadButton> jb;
+ jb.instance();
+
+ jb->set_button_index(device_index->get_selected());
+ jb->set_device(_get_current_device());
+
+ for (int i = 0; i < events.size(); i++) {
+ Ref<InputEventJoypadButton> aie = events[i];
+ if (aie.is_null()) {
+ continue;
+ }
+ if (aie->get_device() == jb->get_device() && aie->get_button_index() == jb->get_button_index()) {
+ return;
+ }
+ }
+ ie = jb;
+
+ } break;
+ default: {
+ }
+ }
+
+ if (idx < 0 || idx >= events.size()) {
+ events.push_back(ie);
+ } else {
+ events[idx] = ie;
+ }
+ action["events"] = events;
+
+ undo_redo->create_action(TTR("Add Input Action Event"));
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
+ undo_redo->add_do_method(this, "_update_actions");
+ undo_redo->add_undo_method(this, "_update_actions");
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+
+ _show_last_added(ie, name);
+}
+
+void InputMapEditor::_set_current_device(int i_device) {
+ device_id->select(i_device + 1);
+}
+
+int InputMapEditor::_get_current_device() {
+ return device_id->get_selected() - 1;
+}
+
+String InputMapEditor::_get_device_string(int i_device) {
+ if (i_device == InputMap::ALL_DEVICES) {
+ return TTR("All Devices");
+ }
+ return TTR("Device") + " " + itos(i_device);
+}
+
+void InputMapEditor::_press_a_key_confirm() {
+ if (last_wait_for_key.is_null()) {
+ return;
+ }
+
+ Ref<InputEventKey> ie;
+ ie.instance();
+ if (press_a_key_physical) {
+ ie->set_physical_keycode(last_wait_for_key->get_physical_keycode());
+ ie->set_keycode(0);
+ } else {
+ ie->set_physical_keycode(0);
+ ie->set_keycode(last_wait_for_key->get_keycode());
+ }
+ ie->set_shift(last_wait_for_key->get_shift());
+ ie->set_alt(last_wait_for_key->get_alt());
+ ie->set_control(last_wait_for_key->get_control());
+ ie->set_metakey(last_wait_for_key->get_metakey());
+
+ String name = add_at;
+ int idx = edit_idx;
+
+ Dictionary old_val = ProjectSettings::get_singleton()->get(name);
+ Dictionary action = old_val.duplicate();
+ Array events = action["events"];
+
+ for (int i = 0; i < events.size(); i++) {
+ Ref<InputEventKey> aie = events[i];
+ if (aie.is_null()) {
+ continue;
+ }
+ if (!press_a_key_physical) {
+ if (aie->get_keycode_with_modifiers() == ie->get_keycode_with_modifiers()) {
+ return;
+ }
+ } else {
+ if (aie->get_physical_keycode_with_modifiers() == ie->get_physical_keycode_with_modifiers()) {
+ return;
+ }
+ }
+ }
+
+ if (idx < 0 || idx >= events.size()) {
+ events.push_back(ie);
+ } else {
+ events[idx] = ie;
+ }
+ action["events"] = events;
+
+ undo_redo->create_action(TTR("Add Input Action Event"));
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
+ undo_redo->add_do_method(this, "_update_actions");
+ undo_redo->add_undo_method(this, "_update_actions");
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+
+ _show_last_added(ie, name);
+}
+
+void InputMapEditor::_show_last_added(const Ref<InputEvent> &p_event, const String &p_name) {
+ TreeItem *r = input_editor->get_root();
+
+ String name = p_name;
+ name.erase(0, 6);
+ if (!r) {
+ return;
+ }
+ r = r->get_children();
+ if (!r) {
+ return;
+ }
+ bool found = false;
+ while (r) {
+ if (r->get_text(0) != name) {
+ r = r->get_next();
+ continue;
+ }
+ TreeItem *child = r->get_children();
+ while (child) {
+ Variant input = child->get_meta("__input");
+ if (p_event == input) {
+ r->set_collapsed(false);
+ child->select(0);
+ found = true;
+ break;
+ }
+ child = child->get_next();
+ }
+ if (found) {
+ break;
+ }
+ r = r->get_next();
+ }
+
+ if (found) {
+ input_editor->ensure_cursor_is_visible();
+ }
+}
+
+void InputMapEditor::_wait_for_key(const Ref<InputEvent> &p_event) {
+ Ref<InputEventKey> k = p_event;
+
+ if (k.is_valid() && k->is_pressed() && k->get_keycode() != 0) {
+ last_wait_for_key = p_event;
+ const String str = (press_a_key_physical) ? keycode_get_string(k->get_physical_keycode_with_modifiers()) + TTR(" (Physical)") : keycode_get_string(k->get_keycode_with_modifiers());
+
+ press_a_key_label->set_text(str);
+ press_a_key->get_ok()->set_disabled(false);
+ press_a_key->set_input_as_handled();
+ }
+}
+
+void InputMapEditor::_edit_item(Ref<InputEvent> p_exiting_event) {
+ InputType ie_type;
+
+ if ((Ref<InputEventKey>(p_exiting_event)).is_valid()) {
+ if ((Ref<InputEventKey>(p_exiting_event))->get_keycode() != 0) {
+ ie_type = INPUT_KEY;
+ } else {
+ ie_type = INPUT_KEY_PHYSICAL;
+ }
+ } else if ((Ref<InputEventJoypadButton>(p_exiting_event)).is_valid()) {
+ ie_type = INPUT_JOY_BUTTON;
+ } else if ((Ref<InputEventMouseButton>(p_exiting_event)).is_valid()) {
+ ie_type = INPUT_MOUSE_BUTTON;
+ } else if ((Ref<InputEventJoypadMotion>(p_exiting_event)).is_valid()) {
+ ie_type = INPUT_JOY_MOTION;
+ } else {
+ return;
+ }
+
+ _add_item(ie_type, p_exiting_event);
+}
+
+void InputMapEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_event) {
+ add_type = InputType(p_item);
+
+ switch (add_type) {
+ case INPUT_KEY: {
+ press_a_key_physical = false;
+ press_a_key_label->set_text(TTR("Press a Key..."));
+ press_a_key->get_ok()->set_disabled(true);
+ last_wait_for_key = Ref<InputEvent>();
+ press_a_key->popup_centered(Size2(250, 80) * EDSCALE);
+ //press_a_key->grab_focus();
+
+ } break;
+ case INPUT_KEY_PHYSICAL: {
+ press_a_key_physical = true;
+ press_a_key_label->set_text(TTR("Press a Key..."));
+
+ last_wait_for_key = Ref<InputEvent>();
+ press_a_key->popup_centered(Size2(250, 80) * EDSCALE);
+ press_a_key->grab_focus();
+
+ } break;
+ case INPUT_MOUSE_BUTTON: {
+ device_index_label->set_text(TTR("Mouse Button Index:"));
+ device_index->clear();
+ device_index->add_item(TTR("Left Button"));
+ device_index->add_item(TTR("Right Button"));
+ device_index->add_item(TTR("Middle Button"));
+ device_index->add_item(TTR("Wheel Up Button"));
+ device_index->add_item(TTR("Wheel Down Button"));
+ device_index->add_item(TTR("Wheel Left Button"));
+ device_index->add_item(TTR("Wheel Right Button"));
+ device_index->add_item(TTR("X Button 1"));
+ device_index->add_item(TTR("X Button 2"));
+ device_input->popup_centered(Size2(350, 95) * EDSCALE);
+
+ Ref<InputEventMouseButton> mb = p_exiting_event;
+ if (mb.is_valid()) {
+ device_index->select(mb->get_button_index() - 1);
+ _set_current_device(mb->get_device());
+ device_input->get_ok()->set_text(TTR("Change"));
+ } else {
+ _set_current_device(0);
+ device_input->get_ok()->set_text(TTR("Add"));
+ }
+
+ } break;
+ case INPUT_JOY_MOTION: {
+ device_index_label->set_text(TTR("Joypad Axis Index:"));
+ device_index->clear();
+ for (int i = 0; i < JOY_AXIS_MAX * 2; i++) {
+ String desc = TTR("Axis") + " " + itos(i / 2) + " " + ((i & 1) ? "+" : "-") +
+ " (" + TTR(_axis_descriptions[i]) + ")";
+ device_index->add_item(desc);
+ }
+ device_input->popup_centered(Size2(350, 95) * EDSCALE);
+
+ Ref<InputEventJoypadMotion> jm = p_exiting_event;
+ if (jm.is_valid()) {
+ device_index->select(jm->get_axis() * 2 + (jm->get_axis_value() > 0 ? 1 : 0));
+ _set_current_device(jm->get_device());
+ device_input->get_ok()->set_text(TTR("Change"));
+ } else {
+ _set_current_device(0);
+ device_input->get_ok()->set_text(TTR("Add"));
+ }
+
+ } break;
+ case INPUT_JOY_BUTTON: {
+ device_index_label->set_text(TTR("Joypad Button Index:"));
+ device_index->clear();
+ for (int i = 0; i < JOY_BUTTON_MAX; i++) {
+ String desc = TTR("Button") + " " + itos(i);
+ if (i < JOY_SDL_BUTTONS) {
+ desc += " (" + TTR(_button_descriptions[i]) + ")";
+ }
+ device_index->add_item(desc);
+ }
+ device_input->popup_centered(Size2(350, 95) * EDSCALE);
+
+ Ref<InputEventJoypadButton> jb = p_exiting_event;
+ if (jb.is_valid()) {
+ device_index->select(jb->get_button_index());
+ _set_current_device(jb->get_device());
+ device_input->get_ok()->set_text(TTR("Change"));
+ } else {
+ _set_current_device(0);
+ device_input->get_ok()->set_text(TTR("Add"));
+ }
+
+ } break;
+ default: {
+ }
+ }
+}
+
+void InputMapEditor::_action_activated() {
+ TreeItem *ti = input_editor->get_selected();
+
+ if (!ti || ti->get_parent() == input_editor->get_root()) {
+ return;
+ }
+
+ String name = "input/" + ti->get_parent()->get_text(0);
+ Dictionary action = ProjectSettings::get_singleton()->get(name);
+ Array events = action["events"];
+ int idx = ti->get_metadata(0);
+
+ ERR_FAIL_INDEX(idx, events.size());
+ Ref<InputEvent> event = events[idx];
+ if (event.is_null()) {
+ return;
+ }
+
+ add_at = name;
+ edit_idx = idx;
+ _edit_item(event);
+}
+
+void InputMapEditor::_action_button_pressed(Object *p_obj, int p_column, int p_id) {
+ TreeItem *ti = Object::cast_to<TreeItem>(p_obj);
+
+ ERR_FAIL_COND(!ti);
+
+ if (p_id == 1) {
+ // Add action event
+ Point2 ofs = input_editor->get_global_position();
+ Rect2 ir = input_editor->get_item_rect(ti);
+ ir.position.y -= input_editor->get_scroll().y;
+ ofs += ir.position + ir.size;
+ ofs.x -= 100;
+ popup_add->set_position(ofs);
+ popup_add->popup();
+ add_at = "input/" + ti->get_text(0);
+ edit_idx = -1;
+
+ } else if (p_id == 2) {
+ // Remove
+
+ if (ti->get_parent() == input_editor->get_root()) {
+ // Remove action
+ String name = "input/" + ti->get_text(0);
+ Dictionary old_val = ProjectSettings::get_singleton()->get(name);
+ int order = ProjectSettings::get_singleton()->get_order(name);
+
+ undo_redo->create_action(TTR("Erase Input Action"));
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", name);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", name, order);
+ undo_redo->add_do_method(this, "_update_actions");
+ undo_redo->add_undo_method(this, "_update_actions");
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+
+ } else {
+ // Remove action event
+ String name = "input/" + ti->get_parent()->get_text(0);
+ Dictionary old_val = ProjectSettings::get_singleton()->get(name);
+ Dictionary action = old_val.duplicate();
+ int idx = ti->get_metadata(0);
+
+ Array events = action["events"];
+ ERR_FAIL_INDEX(idx, events.size());
+ events.remove(idx);
+ action["events"] = events;
+
+ undo_redo->create_action(TTR("Erase Input Action Event"));
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
+ undo_redo->add_do_method(this, "_update_actions");
+ undo_redo->add_undo_method(this, "_update_actions");
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+ }
+ } else if (p_id == 3) {
+ // Edit
+
+ if (ti->get_parent() == input_editor->get_root()) {
+ // Edit action name
+ ti->set_as_cursor(0);
+ input_editor->edit_selected();
+
+ } else {
+ // Edit action event
+ String name = "input/" + ti->get_parent()->get_text(0);
+ int idx = ti->get_metadata(0);
+ Dictionary action = ProjectSettings::get_singleton()->get(name);
+
+ Array events = action["events"];
+ ERR_FAIL_INDEX(idx, events.size());
+
+ Ref<InputEvent> event = events[idx];
+
+ if (event.is_null()) {
+ return;
+ }
+
+ ti->set_as_cursor(0);
+ add_at = name;
+ edit_idx = idx;
+ _edit_item(event);
+ }
+ }
+}
+
+void InputMapEditor::_update_actions() {
+ if (setting) {
+ return;
+ }
+
+ Map<String, bool> collapsed;
+
+ if (input_editor->get_root() && input_editor->get_root()->get_children()) {
+ for (TreeItem *item = input_editor->get_root()->get_children(); item; item = item->get_next()) {
+ collapsed[item->get_text(0)] = item->is_collapsed();
+ }
+ }
+
+ input_editor->clear();
+ TreeItem *root = input_editor->create_item();
+ input_editor->set_hide_root(true);
+
+ List<PropertyInfo> props;
+ ProjectSettings::get_singleton()->get_property_list(&props);
+ for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
+ const String property_name = E->get().name;
+
+ if (!property_name.begins_with("input/")) {
+ continue;
+ }
+
+ const String name = property_name.get_slice("/", 1);
+
+ TreeItem *item = input_editor->create_item(root);
+ item->set_text(0, name);
+ item->set_custom_bg_color(0, input_editor->get_theme_color("prop_subsection", "Editor"));
+ if (collapsed.has(name)) {
+ item->set_collapsed(collapsed[name]);
+ }
+
+ item->set_editable(1, true);
+ item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
+ item->set_range_config(1, 0.0, 1.0, 0.01);
+
+ item->set_custom_bg_color(1, input_editor->get_theme_color("prop_subsection", "Editor"));
+
+ const bool is_builtin_input = ProjectSettings::get_singleton()->get_input_presets().find(property_name) != nullptr;
+ const String tooltip_remove = is_builtin_input ? TTR("Built-in actions can't be removed as they're used for UI navigation.") : TTR("Remove");
+ item->add_button(2, input_editor->get_theme_icon("Add", "EditorIcons"), 1, false, TTR("Add Event"));
+ item->add_button(2, input_editor->get_theme_icon("Remove", "EditorIcons"), 2, false, tooltip_remove);
+
+ if (is_builtin_input) {
+ item->set_button_disabled(2, 1, true);
+ } else {
+ item->set_editable(0, true);
+ }
+
+ Dictionary action = ProjectSettings::get_singleton()->get(property_name);
+ Array events = action["events"];
+ item->set_range(1, action["deadzone"]);
+
+ for (int i = 0; i < events.size(); i++) {
+ Ref<InputEvent> event = events[i];
+ if (event.is_null()) {
+ continue;
+ }
+
+ TreeItem *action2 = input_editor->create_item(item);
+
+ Ref<InputEventKey> k = event;
+ if (k.is_valid()) {
+ if (k->get_keycode() != 0) {
+ action2->set_text(0, keycode_get_string(k->get_keycode_with_modifiers()));
+ action2->set_icon(0, input_editor->get_theme_icon("Keyboard", "EditorIcons"));
+ } else {
+ action2->set_text(0, keycode_get_string(k->get_physical_keycode_with_modifiers()) + TTR(" (Physical)"));
+ action2->set_icon(0, input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons"));
+ }
+ }
+
+ Ref<InputEventJoypadButton> jb = event;
+ if (jb.is_valid()) {
+ const int idx = jb->get_button_index();
+ String str = _get_device_string(jb->get_device()) + ", " +
+ TTR("Button") + " " + itos(idx);
+ if (idx >= 0 && idx < JOY_SDL_BUTTONS) {
+ str += String() + " (" + TTR(_button_descriptions[jb->get_button_index()]) + ")";
+ }
+
+ action2->set_text(0, str);
+ action2->set_icon(0, input_editor->get_theme_icon("JoyButton", "EditorIcons"));
+ }
+
+ Ref<InputEventMouseButton> mb = event;
+ if (mb.is_valid()) {
+ String str = _get_device_string(mb->get_device()) + ", ";
+ switch (mb->get_button_index()) {
+ case BUTTON_LEFT:
+ str += TTR("Left Button");
+ break;
+ case BUTTON_RIGHT:
+ str += TTR("Right Button");
+ break;
+ case BUTTON_MIDDLE:
+ str += TTR("Middle Button");
+ break;
+ case BUTTON_WHEEL_UP:
+ str += TTR("Wheel Up");
+ break;
+ case BUTTON_WHEEL_DOWN:
+ str += TTR("Wheel Down");
+ break;
+ default:
+ str += vformat(TTR("%d Button"), mb->get_button_index());
+ }
+
+ action2->set_text(0, str);
+ action2->set_icon(0, input_editor->get_theme_icon("Mouse", "EditorIcons"));
+ }
+
+ Ref<InputEventJoypadMotion> jm = event;
+ if (jm.is_valid()) {
+ int ax = jm->get_axis();
+ int n = 2 * ax + (jm->get_axis_value() < 0 ? 0 : 1);
+ String str = _get_device_string(jm->get_device()) + ", " +
+ TTR("Axis") + " " + itos(ax) + " " + (jm->get_axis_value() < 0 ? "-" : "+") +
+ " (" + _axis_descriptions[n] + ")";
+ action2->set_text(0, str);
+ action2->set_icon(0, input_editor->get_theme_icon("JoyAxis", "EditorIcons"));
+ }
+ action2->set_metadata(0, i);
+ action2->set_meta("__input", event);
+
+ action2->add_button(2, input_editor->get_theme_icon("Edit", "EditorIcons"), 3, false, TTR("Edit"));
+ action2->add_button(2, input_editor->get_theme_icon("Remove", "EditorIcons"), 2, false, TTR("Remove"));
+ // Fade out the individual event buttons slightly to make the
+ // Add/Remove buttons stand out more.
+ action2->set_button_color(2, 0, Color(1, 1, 1, 0.75));
+ action2->set_button_color(2, 1, Color(1, 1, 1, 0.75));
+ }
+ }
+
+ _action_check(action_name->get_text());
+}
+
+void InputMapEditor::_action_check(String p_action) {
+ if (p_action == "") {
+ action_add->set_disabled(true);
+ } else {
+ if (!_validate_action_name(p_action)) {
+ action_add_error->set_text(TTR("Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or '\"'."));
+ action_add_error->show();
+ action_add->set_disabled(true);
+ return;
+ }
+ if (ProjectSettings::get_singleton()->has_setting("input/" + p_action)) {
+ action_add_error->set_text(vformat(TTR("An action with the name '%s' already exists."), p_action));
+ action_add_error->show();
+ action_add->set_disabled(true);
+ return;
+ }
+
+ action_add->set_disabled(false);
+ }
+
+ action_add_error->hide();
+}
+
+void InputMapEditor::_action_adds(String) {
+ if (!action_add->is_disabled()) {
+ _action_add();
+ }
+}
+
+void InputMapEditor::_action_add() {
+ Dictionary action;
+ action["events"] = Array();
+ action["deadzone"] = 0.5f;
+ String name = "input/" + action_name->get_text();
+ undo_redo->create_action(TTR("Add Input Action"));
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", name);
+ undo_redo->add_do_method(this, "_update_actions");
+ undo_redo->add_undo_method(this, "_update_actions");
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+
+ TreeItem *r = input_editor->get_root();
+
+ if (!r) {
+ return;
+ }
+ r = r->get_children();
+ if (!r) {
+ return;
+ }
+ while (r->get_next()) {
+ r = r->get_next();
+ }
+
+ r->select(0);
+ input_editor->ensure_cursor_is_visible();
+ action_add_error->hide();
+ action_name->clear();
+}
+
+Variant InputMapEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
+ TreeItem *selected = input_editor->get_selected();
+ if (!selected || selected->get_parent() != input_editor->get_root()) {
+ return Variant();
+ }
+
+ String name = selected->get_text(0);
+ VBoxContainer *vb = memnew(VBoxContainer);
+ HBoxContainer *hb = memnew(HBoxContainer);
+ Label *label = memnew(Label(name));
+ hb->set_modulate(Color(1, 1, 1, 1.0f));
+ hb->add_child(label);
+ vb->add_child(hb);
+ input_editor->set_drag_preview(vb);
+
+ Dictionary drag_data;
+ drag_data["type"] = "nodes";
+
+ input_editor->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
+
+ return drag_data;
+}
+
+bool InputMapEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
+ Dictionary d = p_data;
+ if (!d.has("type") || d["type"] != "nodes") {
+ return false;
+ }
+
+ TreeItem *selected = input_editor->get_selected();
+ TreeItem *item = input_editor->get_item_at_position(p_point);
+ if (!selected || !item || item == selected || item->get_parent() == selected) {
+ return false;
+ }
+
+ return true;
+}
+
+void InputMapEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
+ return;
+ }
+
+ TreeItem *selected = input_editor->get_selected();
+ TreeItem *item = input_editor->get_item_at_position(p_point);
+ if (!item) {
+ return;
+ }
+ TreeItem *target = item->get_parent() == input_editor->get_root() ? item : item->get_parent();
+
+ String selected_name = "input/" + selected->get_text(0);
+ int old_order = ProjectSettings::get_singleton()->get_order(selected_name);
+ String target_name = "input/" + target->get_text(0);
+ int target_order = ProjectSettings::get_singleton()->get_order(target_name);
+
+ int order = old_order;
+ bool is_below = target_order > old_order;
+ TreeItem *iterator = is_below ? selected->get_next() : selected->get_prev();
+
+ undo_redo->create_action(TTR("Moved Input Action Event"));
+ while (iterator != target) {
+ String iterator_name = "input/" + iterator->get_text(0);
+ int iterator_order = ProjectSettings::get_singleton()->get_order(iterator_name);
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", iterator_name, order);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", iterator_name, iterator_order);
+ order = iterator_order;
+ iterator = is_below ? iterator->get_next() : iterator->get_prev();
+ }
+
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", target_name, order);
+ undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", selected_name, target_order);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", target_name, target_order);
+ undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", selected_name, old_order);
+
+ undo_redo->add_do_method(this, "_update_actions");
+ undo_redo->add_undo_method(this, "_update_actions");
+ undo_redo->add_do_method(this, "emit_signal", inputmap_changed);
+ undo_redo->add_undo_method(this, "emit_signal", inputmap_changed);
+ undo_redo->commit_action();
+}
+
+void InputMapEditor::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_update_actions"), &InputMapEditor::_update_actions);
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &InputMapEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &InputMapEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &InputMapEditor::drop_data_fw);
+
+ ADD_SIGNAL(MethodInfo("inputmap_changed"));
+}
+
+InputMapEditor::InputMapEditor() {
+ undo_redo = EditorNode::get_undo_redo();
+ press_a_key_physical = false;
+ inputmap_changed = "inputmap_changed";
+
+ VBoxContainer *vbc = memnew(VBoxContainer);
+ vbc->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, 0);
+ vbc->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, 0);
+ vbc->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 0);
+ vbc->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, 0);
+ add_child(vbc);
+
+ HBoxContainer *hbc = memnew(HBoxContainer);
+ vbc->add_child(hbc);
+
+ Label *l = memnew(Label);
+ l->set_text(TTR("Action:"));
+ hbc->add_child(l);
+
+ action_name = memnew(LineEdit);
+ action_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ action_name->connect("text_entered", callable_mp(this, &InputMapEditor::_action_adds));
+ action_name->connect("text_changed", callable_mp(this, &InputMapEditor::_action_check));
+ hbc->add_child(action_name);
+
+ action_add_error = memnew(Label);
+ action_add_error->hide();
+ hbc->add_child(action_add_error);
+
+ Button *add = memnew(Button);
+ add->set_text(TTR("Add"));
+ add->set_disabled(true);
+ add->connect("pressed", callable_mp(this, &InputMapEditor::_action_add));
+ hbc->add_child(add);
+ action_add = add;
+
+ input_editor = memnew(Tree);
+ input_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ input_editor->set_columns(3);
+ input_editor->set_column_titles_visible(true);
+ input_editor->set_column_title(0, TTR("Action"));
+ input_editor->set_column_title(1, TTR("Deadzone"));
+ input_editor->set_column_expand(1, false);
+ input_editor->set_column_min_width(1, 80 * EDSCALE);
+ input_editor->set_column_expand(2, false);
+ input_editor->set_column_min_width(2, 50 * EDSCALE);
+ input_editor->connect("item_edited", callable_mp(this, &InputMapEditor::_action_edited));
+ input_editor->connect("item_activated", callable_mp(this, &InputMapEditor::_action_activated));
+ input_editor->connect("cell_selected", callable_mp(this, &InputMapEditor::_action_selected));
+ input_editor->connect("button_pressed", callable_mp(this, &InputMapEditor::_action_button_pressed));
+#ifndef _MSC_VER
+#warning need to make drag data forwarding to non controls happen
+#endif
+ //input_editor->set_drag_forwarding(this);
+ vbc->add_child(input_editor);
+
+ // Popups
+
+ popup_add = memnew(PopupMenu);
+ popup_add->connect("id_pressed", callable_mp(this, &InputMapEditor::_add_item), make_binds(Ref<InputEvent>()));
+ add_child(popup_add);
+
+ press_a_key = memnew(ConfirmationDialog);
+ press_a_key->get_ok()->set_disabled(true);
+ //press_a_key->set_focus_mode(Control::FOCUS_ALL);
+ press_a_key->connect("window_input", callable_mp(this, &InputMapEditor::_wait_for_key));
+ press_a_key->connect("confirmed", callable_mp(this, &InputMapEditor::_press_a_key_confirm));
+ add_child(press_a_key);
+
+ l = memnew(Label);
+ l->set_text(TTR("Press a Key..."));
+ l->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ l->set_align(Label::ALIGN_CENTER);
+ l->set_margin(MARGIN_TOP, 20);
+ l->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_BEGIN, 30);
+ press_a_key->add_child(l);
+ press_a_key_label = l;
+
+ device_input = memnew(ConfirmationDialog);
+ device_input->get_ok()->set_text(TTR("Add"));
+ device_input->connect("confirmed", callable_mp(this, &InputMapEditor::_device_input_add));
+ add_child(device_input);
+
+ hbc = memnew(HBoxContainer);
+ device_input->add_child(hbc);
+
+ VBoxContainer *vbc_left = memnew(VBoxContainer);
+ hbc->add_child(vbc_left);
+
+ l = memnew(Label);
+ l->set_text(TTR("Device:"));
+ vbc_left->add_child(l);
+
+ device_id = memnew(OptionButton);
+ for (int i = -1; i < 8; i++) {
+ device_id->add_item(_get_device_string(i));
+ }
+ _set_current_device(0);
+ vbc_left->add_child(device_id);
+
+ VBoxContainer *vbc_right = memnew(VBoxContainer);
+ vbc_right->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbc->add_child(vbc_right);
+
+ l = memnew(Label);
+ l->set_text(TTR("Index:"));
+ vbc_right->add_child(l);
+
+ device_index_label = l;
+ device_index = memnew(OptionButton);
+ device_index->set_clip_text(true);
+ vbc_right->add_child(device_index);
+
+ message = memnew(AcceptDialog);
+ add_child(message);
+}
diff --git a/editor/input_map_editor.h b/editor/input_map_editor.h
new file mode 100644
index 0000000000..cc806fc660
--- /dev/null
+++ b/editor/input_map_editor.h
@@ -0,0 +1,107 @@
+/*************************************************************************/
+/* input_map_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef INPUT_MAP_EDITOR_H
+#define INPUT_MAP_EDITOR_H
+
+#include "core/undo_redo.h"
+#include "editor/editor_data.h"
+
+class InputMapEditor : public Control {
+ GDCLASS(InputMapEditor, Control);
+
+ enum InputType {
+ INPUT_KEY,
+ INPUT_KEY_PHYSICAL,
+ INPUT_JOY_BUTTON,
+ INPUT_JOY_MOTION,
+ INPUT_MOUSE_BUTTON
+ };
+
+ Tree *input_editor;
+ LineEdit *action_name;
+ Button *action_add;
+ Label *action_add_error;
+
+ InputType add_type;
+ String add_at;
+ int edit_idx;
+
+ PopupMenu *popup_add;
+ ConfirmationDialog *press_a_key;
+ bool press_a_key_physical;
+ Label *press_a_key_label;
+ ConfirmationDialog *device_input;
+ OptionButton *device_id;
+ OptionButton *device_index;
+ Label *device_index_label;
+ MenuButton *popup_copy_to_feature;
+
+ Ref<InputEventKey> last_wait_for_key;
+
+ AcceptDialog *message;
+ UndoRedo *undo_redo;
+ String inputmap_changed;
+ bool setting;
+
+ void _update_actions();
+ void _add_item(int p_item, Ref<InputEvent> p_exiting_event = Ref<InputEvent>());
+ void _edit_item(Ref<InputEvent> p_exiting_event);
+
+ void _action_check(String p_action);
+ void _action_adds(String);
+ void _action_add();
+ void _device_input_add();
+
+ void _action_selected();
+ void _action_edited();
+ void _action_activated();
+ void _action_button_pressed(Object *p_obj, int p_column, int p_id);
+ void _wait_for_key(const Ref<InputEvent> &p_event);
+ void _press_a_key_confirm();
+ void _show_last_added(const Ref<InputEvent> &p_event, const String &p_name);
+
+ Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
+ bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
+ void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+
+protected:
+ int _get_current_device();
+ void _set_current_device(int i_device);
+ String _get_device_string(int i_device);
+
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ InputMapEditor();
+};
+
+#endif // INPUT_MAP_EDITOR_H
diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp
index b65482cc6b..8f1b8838d8 100644
--- a/editor/inspector_dock.cpp
+++ b/editor/inspector_dock.cpp
@@ -68,15 +68,16 @@ void InspectorDock::_menu_option(int p_option) {
case OBJECT_COPY_PARAMS: {
editor_data->apply_changes_in_editors();
- if (current)
+ if (current) {
editor_data->copy_object_params(current);
+ }
} break;
case OBJECT_PASTE_PARAMS: {
editor_data->apply_changes_in_editors();
- if (current)
+ if (current) {
editor_data->paste_object_params(current);
- editor_data->get_undo_redo().clear_history();
+ }
} break;
case OBJECT_UNIQUE_RESOURCES: {
@@ -86,18 +87,16 @@ void InspectorDock::_menu_option(int p_option) {
current->get_property_list(&props);
Map<RES, RES> duplicates;
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
-
- if (!(E->get().usage & PROPERTY_USAGE_STORAGE))
+ if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) {
continue;
+ }
Variant v = current->get(E->get().name);
if (v.is_ref()) {
REF ref = v;
if (ref.is_valid()) {
-
RES res = ref;
if (res.is_valid()) {
-
if (!duplicates.has(res)) {
duplicates[res] = res->duplicate();
}
@@ -113,7 +112,7 @@ void InspectorDock::_menu_option(int p_option) {
editor_data->get_undo_redo().clear_history();
- editor->get_editor_plugins_over()->edit(NULL);
+ editor->get_editor_plugins_over()->edit(nullptr);
editor->get_editor_plugins_over()->edit(current);
} break;
@@ -141,7 +140,7 @@ void InspectorDock::_new_resource() {
}
void InspectorDock::_load_resource(const String &p_type) {
- load_resource_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ load_resource_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type(p_type, &extensions);
@@ -151,7 +150,7 @@ void InspectorDock::_load_resource(const String &p_type) {
load_resource_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
- load_resource_dialog->popup_centered_ratio();
+ load_resource_dialog->popup_file_dialog();
}
void InspectorDock::_resource_file_selected(String p_file) {
@@ -166,22 +165,23 @@ void InspectorDock::_resource_file_selected(String p_file) {
}
void InspectorDock::_save_resource(bool save_as) const {
- uint32_t current = EditorNode::get_singleton()->get_editor_history()->get_current();
- Object *current_obj = current > 0 ? ObjectDB::get_instance(current) : NULL;
+ ObjectID current = EditorNode::get_singleton()->get_editor_history()->get_current();
+ Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
ERR_FAIL_COND(!Object::cast_to<Resource>(current_obj));
RES current_res = RES(Object::cast_to<Resource>(current_obj));
- if (save_as)
+ if (save_as) {
editor->save_resource_as(current_res);
- else
+ } else {
editor->save_resource(current_res);
+ }
}
void InspectorDock::_unref_resource() const {
- uint32_t current = EditorNode::get_singleton()->get_editor_history()->get_current();
- Object *current_obj = current > 0 ? ObjectDB::get_instance(current) : NULL;
+ ObjectID current = EditorNode::get_singleton()->get_editor_history()->get_current();
+ Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
ERR_FAIL_COND(!Object::cast_to<Resource>(current_obj));
@@ -191,8 +191,8 @@ void InspectorDock::_unref_resource() const {
}
void InspectorDock::_copy_resource() const {
- uint32_t current = EditorNode::get_singleton()->get_editor_history()->get_current();
- Object *current_obj = current > 0 ? ObjectDB::get_instance(current) : NULL;
+ ObjectID current = EditorNode::get_singleton()->get_editor_history()->get_current();
+ Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
ERR_FAIL_COND(!Object::cast_to<Resource>(current_obj));
@@ -215,10 +215,9 @@ void InspectorDock::_prepare_history() {
history_menu->get_popup()->clear();
- Ref<Texture> base_icon = get_icon("Object", "EditorIcons");
+ Ref<Texture2D> base_icon = get_theme_icon("Object", "EditorIcons");
Set<ObjectID> already;
for (int i = editor_history->get_history_len() - 1; i >= history_to; i--) {
-
ObjectID id = editor_history->get_history_obj(i);
Object *obj = ObjectDB::get_instance(id);
if (!obj || already.has(id)) {
@@ -230,7 +229,7 @@ void InspectorDock::_prepare_history() {
already.insert(id);
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj, "");
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj, "");
if (icon.is_null()) {
icon = base_icon;
}
@@ -238,16 +237,16 @@ void InspectorDock::_prepare_history() {
String text;
if (Object::cast_to<Resource>(obj)) {
Resource *r = Object::cast_to<Resource>(obj);
- if (r->get_path().is_resource_file())
+ if (r->get_path().is_resource_file()) {
text = r->get_path().get_file();
- else if (r->get_name() != String()) {
+ } else if (r->get_name() != String()) {
text = r->get_name();
} else {
text = r->get_class();
}
} else if (Object::cast_to<Node>(obj)) {
text = Object::cast_to<Node>(obj)->get_name();
- } else if (obj->is_class("ScriptEditorDebuggerInspectedObject")) {
+ } else if (obj->is_class("EditorDebuggerRemoteObject")) {
text = obj->call("get_title");
} else {
text = obj->get_class();
@@ -260,16 +259,17 @@ void InspectorDock::_prepare_history() {
}
}
-void InspectorDock::_select_history(int p_idx) const {
+void InspectorDock::_select_history(int p_idx) {
//push it to the top, it is not correct, but it's more useful
ObjectID id = EditorNode::get_singleton()->get_editor_history()->get_history_obj(p_idx);
Object *obj = ObjectDB::get_instance(id);
- if (!obj)
+ if (!obj) {
return;
+ }
editor->push_item(obj);
}
-void InspectorDock::_resource_created() const {
+void InspectorDock::_resource_created() {
Object *c = new_resource_dialog->instance_selected();
ERR_FAIL_COND(!c);
@@ -280,22 +280,26 @@ void InspectorDock::_resource_created() const {
editor->push_item(c);
}
-void InspectorDock::_resource_selected(const RES &p_res, const String &p_property) const {
- if (p_res.is_null())
+void InspectorDock::_resource_selected(const RES &p_res, const String &p_property) {
+ if (p_res.is_null()) {
return;
+ }
RES r = p_res;
editor->push_item(r.operator->(), p_property);
}
void InspectorDock::_edit_forward() {
- if (EditorNode::get_singleton()->get_editor_history()->next())
+ if (EditorNode::get_singleton()->get_editor_history()->next()) {
editor->edit_current();
+ }
}
+
void InspectorDock::_edit_back() {
EditorHistory *editor_history = EditorNode::get_singleton()->get_editor_history();
- if ((current && editor_history->previous()) || editor_history->get_path_size() == 1)
+ if ((current && editor_history->previous()) || editor_history->get_path_size() == 1) {
editor->edit_current();
+ }
}
void InspectorDock::_menu_collapseall() {
@@ -311,14 +315,15 @@ void InspectorDock::_property_keyed(const String &p_keyed, const Variant &p_valu
}
void InspectorDock::_transform_keyed(Object *sp, const String &p_sub, const Transform &p_key) {
- Spatial *s = Object::cast_to<Spatial>(sp);
- if (!s)
+ Node3D *s = Object::cast_to<Node3D>(sp);
+ if (!s) {
return;
+ }
AnimationPlayerEditor::singleton->get_track_editor()->insert_transform_key(s, p_sub, p_key);
}
void InspectorDock::_warning_pressed() {
- warning_dialog->popup_centered_minsize();
+ warning_dialog->popup_centered();
}
Container *InspectorDock::get_addon_area() {
@@ -329,41 +334,29 @@ void InspectorDock::_notification(int p_what) {
switch (p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
set_theme(editor->get_gui_base()->get_theme());
- resource_new_button->set_icon(get_icon("New", "EditorIcons"));
- resource_load_button->set_icon(get_icon("Load", "EditorIcons"));
- resource_save_button->set_icon(get_icon("Save", "EditorIcons"));
- backward_button->set_icon(get_icon("Back", "EditorIcons"));
- forward_button->set_icon(get_icon("Forward", "EditorIcons"));
- history_menu->set_icon(get_icon("History", "EditorIcons"));
- object_menu->set_icon(get_icon("Tools", "EditorIcons"));
- warning->set_icon(get_icon("NodeWarning", "EditorIcons"));
+ resource_new_button->set_icon(get_theme_icon("New", "EditorIcons"));
+ resource_load_button->set_icon(get_theme_icon("Load", "EditorIcons"));
+ resource_save_button->set_icon(get_theme_icon("Save", "EditorIcons"));
+ backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
+ forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
+ history_menu->set_icon(get_theme_icon("History", "EditorIcons"));
+ object_menu->set_icon(get_theme_icon("Tools", "EditorIcons"));
+ warning->set_icon(get_theme_icon("NodeWarning", "EditorIcons"));
+ warning->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor"));
} break;
}
}
void InspectorDock::_bind_methods() {
- ClassDB::bind_method("_menu_option", &InspectorDock::_menu_option);
-
ClassDB::bind_method("update_keying", &InspectorDock::update_keying);
- ClassDB::bind_method("_property_keyed", &InspectorDock::_property_keyed);
- ClassDB::bind_method("_transform_keyed", &InspectorDock::_transform_keyed);
+ ClassDB::bind_method("_transform_keyed", &InspectorDock::_transform_keyed); // Still used by some connect_compat.
- ClassDB::bind_method("_new_resource", &InspectorDock::_new_resource);
- ClassDB::bind_method("_resource_file_selected", &InspectorDock::_resource_file_selected);
- ClassDB::bind_method("_open_resource_selector", &InspectorDock::_open_resource_selector);
ClassDB::bind_method("_unref_resource", &InspectorDock::_unref_resource);
ClassDB::bind_method("_paste_resource", &InspectorDock::_paste_resource);
ClassDB::bind_method("_copy_resource", &InspectorDock::_copy_resource);
- ClassDB::bind_method("_select_history", &InspectorDock::_select_history);
- ClassDB::bind_method("_prepare_history", &InspectorDock::_prepare_history);
- ClassDB::bind_method("_resource_created", &InspectorDock::_resource_created);
- ClassDB::bind_method("_resource_selected", &InspectorDock::_resource_selected, DEFVAL(""));
ClassDB::bind_method("_menu_collapseall", &InspectorDock::_menu_collapseall);
ClassDB::bind_method("_menu_expandall", &InspectorDock::_menu_expandall);
- ClassDB::bind_method("_warning_pressed", &InspectorDock::_warning_pressed);
- ClassDB::bind_method("_edit_forward", &InspectorDock::_edit_forward);
- ClassDB::bind_method("_edit_back", &InspectorDock::_edit_back);
ADD_SIGNAL(MethodInfo("request_help"));
}
@@ -388,7 +381,6 @@ void InspectorDock::clear() {
}
void InspectorDock::update(Object *p_object) {
-
EditorHistory *editor_history = EditorNode::get_singleton()->get_editor_history();
backward_button->set_disabled(editor_history->is_at_beginning());
forward_button->set_disabled(editor_history->is_at_end());
@@ -409,7 +401,7 @@ void InspectorDock::update(Object *p_object) {
editor_path->set_disabled(true);
editor_path->set_text("");
editor_path->set_tooltip("");
- editor_path->set_icon(NULL);
+ editor_path->set_icon(nullptr);
return;
}
@@ -447,19 +439,17 @@ void InspectorDock::update(Object *p_object) {
p->add_separator();
p->add_shortcut(ED_SHORTCUT("property_editor/make_subresources_unique", TTR("Make Sub-Resources Unique")), OBJECT_UNIQUE_RESOURCES);
p->add_separator();
- p->add_icon_shortcut(get_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("property_editor/open_help", TTR("Open in Help")), OBJECT_REQUEST_HELP);
+ p->add_icon_shortcut(get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("property_editor/open_help", TTR("Open in Help")), OBJECT_REQUEST_HELP);
}
List<MethodInfo> methods;
p_object->get_method_list(&methods);
if (!methods.empty()) {
-
bool found = false;
List<MethodInfo>::Element *I = methods.front();
int i = 0;
while (I) {
-
if (I->get().flags & METHOD_FLAG_EDITOR) {
if (!found) {
p->add_separator();
@@ -481,13 +471,10 @@ void InspectorDock::update_keying() {
bool valid = false;
if (AnimationPlayerEditor::singleton->get_track_editor()->has_keying()) {
-
EditorHistory *editor_history = EditorNode::get_singleton()->get_editor_history();
if (editor_history->get_path_size() >= 1) {
-
Object *obj = ObjectDB::get_instance(editor_history->get_path_object(0));
if (Object::cast_to<Node>(obj)) {
-
valid = true;
}
}
@@ -506,54 +493,58 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
HBoxContainer *general_options_hb = memnew(HBoxContainer);
add_child(general_options_hb);
- resource_new_button = memnew(ToolButton);
+ resource_new_button = memnew(Button);
+ resource_new_button->set_flat(true);
resource_new_button->set_tooltip(TTR("Create a new resource in memory and edit it."));
- resource_new_button->set_icon(get_icon("New", "EditorIcons"));
+ resource_new_button->set_icon(get_theme_icon("New", "EditorIcons"));
general_options_hb->add_child(resource_new_button);
- resource_new_button->connect("pressed", this, "_new_resource");
+ resource_new_button->connect("pressed", callable_mp(this, &InspectorDock::_new_resource));
resource_new_button->set_focus_mode(Control::FOCUS_NONE);
- resource_load_button = memnew(ToolButton);
+ resource_load_button = memnew(Button);
+ resource_load_button->set_flat(true);
resource_load_button->set_tooltip(TTR("Load an existing resource from disk and edit it."));
- resource_load_button->set_icon(get_icon("Load", "EditorIcons"));
+ resource_load_button->set_icon(get_theme_icon("Load", "EditorIcons"));
general_options_hb->add_child(resource_load_button);
- resource_load_button->connect("pressed", this, "_open_resource_selector");
+ resource_load_button->connect("pressed", callable_mp(this, &InspectorDock::_open_resource_selector));
resource_load_button->set_focus_mode(Control::FOCUS_NONE);
resource_save_button = memnew(MenuButton);
resource_save_button->set_tooltip(TTR("Save the currently edited resource."));
- resource_save_button->set_icon(get_icon("Save", "EditorIcons"));
+ resource_save_button->set_icon(get_theme_icon("Save", "EditorIcons"));
general_options_hb->add_child(resource_save_button);
resource_save_button->get_popup()->add_item(TTR("Save"), RESOURCE_SAVE);
resource_save_button->get_popup()->add_item(TTR("Save As..."), RESOURCE_SAVE_AS);
- resource_save_button->get_popup()->connect("id_pressed", this, "_menu_option");
+ resource_save_button->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
resource_save_button->set_focus_mode(Control::FOCUS_NONE);
resource_save_button->set_disabled(true);
general_options_hb->add_spacer();
- backward_button = memnew(ToolButton);
+ backward_button = memnew(Button);
+ backward_button->set_flat(true);
general_options_hb->add_child(backward_button);
- backward_button->set_icon(get_icon("Back", "EditorIcons"));
+ backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
backward_button->set_flat(true);
backward_button->set_tooltip(TTR("Go to the previous edited object in history."));
backward_button->set_disabled(true);
- backward_button->connect("pressed", this, "_edit_back");
+ backward_button->connect("pressed", callable_mp(this, &InspectorDock::_edit_back));
- forward_button = memnew(ToolButton);
+ forward_button = memnew(Button);
+ forward_button->set_flat(true);
general_options_hb->add_child(forward_button);
- forward_button->set_icon(get_icon("Forward", "EditorIcons"));
+ forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
forward_button->set_flat(true);
forward_button->set_tooltip(TTR("Go to the next edited object in history."));
forward_button->set_disabled(true);
- forward_button->connect("pressed", this, "_edit_forward");
+ forward_button->connect("pressed", callable_mp(this, &InspectorDock::_edit_forward));
history_menu = memnew(MenuButton);
history_menu->set_tooltip(TTR("History of recently edited objects."));
- history_menu->set_icon(get_icon("History", "EditorIcons"));
+ history_menu->set_icon(get_theme_icon("History", "EditorIcons"));
general_options_hb->add_child(history_menu);
- history_menu->connect("about_to_show", this, "_prepare_history");
- history_menu->get_popup()->connect("id_pressed", this, "_select_history");
+ history_menu->connect("about_to_popup", callable_mp(this, &InspectorDock::_prepare_history));
+ history_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_select_history));
HBoxContainer *node_info_hb = memnew(HBoxContainer);
add_child(node_info_hb);
@@ -563,30 +554,31 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
node_info_hb->add_child(editor_path);
object_menu = memnew(MenuButton);
- object_menu->set_icon(get_icon("Tools", "EditorIcons"));
+ object_menu->set_icon(get_theme_icon("Tools", "EditorIcons"));
node_info_hb->add_child(object_menu);
object_menu->set_tooltip(TTR("Object properties."));
- object_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ object_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
new_resource_dialog = memnew(CreateDialog);
editor->get_gui_base()->add_child(new_resource_dialog);
new_resource_dialog->set_base_type("Resource");
- new_resource_dialog->connect("create", this, "_resource_created");
+ new_resource_dialog->connect("create", callable_mp(this, &InspectorDock::_resource_created));
search = memnew(LineEdit);
search->set_h_size_flags(Control::SIZE_EXPAND_FILL);
search->set_placeholder(TTR("Filter properties"));
- search->set_right_icon(get_icon("Search", "EditorIcons"));
+ search->set_right_icon(get_theme_icon("Search", "EditorIcons"));
search->set_clear_button_enabled(true);
add_child(search);
warning = memnew(Button);
add_child(warning);
warning->set_text(TTR("Changes may be lost!"));
- warning->set_icon(get_icon("NodeWarning", "EditorIcons"));
+ warning->set_icon(get_theme_icon("NodeWarning", "EditorIcons"));
+ warning->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor"));
warning->set_clip_text(true);
warning->hide();
- warning->connect("pressed", this, "_warning_pressed");
+ warning->connect("pressed", callable_mp(this, &InspectorDock::_warning_pressed));
warning_dialog = memnew(AcceptDialog);
editor->get_gui_base()->add_child(warning_dialog);
@@ -594,7 +586,7 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
load_resource_dialog = memnew(EditorFileDialog);
add_child(load_resource_dialog);
load_resource_dialog->set_current_dir("res://");
- load_resource_dialog->connect("file_selected", this, "_resource_file_selected");
+ load_resource_dialog->connect("file_selected", callable_mp(this, &InspectorDock::_resource_file_selected));
inspector = memnew(EditorInspector);
add_child(inspector);
@@ -610,8 +602,8 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
inspector->set_use_filter(true); // TODO: check me
- inspector->connect("resource_selected", this, "_resource_selected");
- inspector->connect("property_keyed", this, "_property_keyed");
+ inspector->connect("resource_selected", callable_mp(this, &InspectorDock::_resource_selected));
+ inspector->connect("property_keyed", callable_mp(this, &InspectorDock::_property_keyed));
}
InspectorDock::~InspectorDock() {
diff --git a/editor/inspector_dock.h b/editor/inspector_dock.h
index a7da4bef4c..551d3d1643 100644
--- a/editor/inspector_dock.h
+++ b/editor/inspector_dock.h
@@ -42,12 +42,10 @@
#include "scene/gui/control.h"
#include "scene/gui/label.h"
#include "scene/gui/popup_menu.h"
-#include "scene/gui/tool_button.h"
class EditorNode;
class InspectorDock : public VBoxContainer {
-
GDCLASS(InspectorDock, VBoxContainer);
enum MenuOptions {
@@ -75,13 +73,13 @@ class InspectorDock : public VBoxContainer {
Object *current;
- ToolButton *backward_button;
- ToolButton *forward_button;
+ Button *backward_button;
+ Button *forward_button;
EditorFileDialog *load_resource_dialog;
CreateDialog *new_resource_dialog;
- ToolButton *resource_new_button;
- ToolButton *resource_load_button;
+ Button *resource_new_button;
+ Button *resource_load_button;
MenuButton *resource_save_button;
MenuButton *history_menu;
LineEdit *search;
@@ -104,13 +102,13 @@ class InspectorDock : public VBoxContainer {
void _paste_resource() const;
void _warning_pressed();
- void _resource_created() const;
- void _resource_selected(const RES &p_res, const String &p_property = "") const;
+ void _resource_created();
+ void _resource_selected(const RES &p_res, const String &p_property);
void _edit_forward();
void _edit_back();
void _menu_collapseall();
void _menu_expandall();
- void _select_history(int p_idx) const;
+ void _select_history(int p_idx);
void _prepare_history();
void _property_keyed(const String &p_keyed, const Variant &p_value, bool p_advance);
diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp
new file mode 100644
index 0000000000..6764f70d9b
--- /dev/null
+++ b/editor/localization_editor.cpp
@@ -0,0 +1,794 @@
+/*************************************************************************/
+/* localization_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "localization_editor.h"
+
+#include "core/translation.h"
+#include "editor_node.h"
+#include "editor_translation_parser.h"
+#include "pot_generator.h"
+#include "scene/gui/control.h"
+
+void LocalizationEditor::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ translation_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_delete));
+ translation_pot_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_pot_delete));
+
+ List<String> tfn;
+ ResourceLoader::get_recognized_extensions_for_type("Translation", &tfn);
+ for (List<String>::Element *E = tfn.front(); E; E = E->next()) {
+ translation_file_open->add_filter("*." + E->get());
+ }
+
+ List<String> rfn;
+ ResourceLoader::get_recognized_extensions_for_type("Resource", &rfn);
+ for (List<String>::Element *E = rfn.front(); E; E = E->next()) {
+ translation_res_file_open_dialog->add_filter("*." + E->get());
+ translation_res_option_file_open_dialog->add_filter("*." + E->get());
+ }
+
+ _update_pot_file_extensions();
+ pot_generate_dialog->add_filter("*.pot");
+ }
+}
+
+void LocalizationEditor::add_translation(const String &p_translation) {
+ _translation_add(p_translation);
+}
+
+void LocalizationEditor::_translation_add(const String &p_path) {
+ PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations");
+ if (translations.has(p_path)) {
+ return;
+ }
+
+ translations.push_back(p_path);
+
+ undo_redo->create_action(TTR("Add Translation"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_translation_file_open() {
+ translation_file_open->popup_file_dialog();
+}
+
+void LocalizationEditor::_translation_delete(Object *p_item, int p_column, int p_button) {
+ TreeItem *ti = Object::cast_to<TreeItem>(p_item);
+ ERR_FAIL_COND(!ti);
+
+ int idx = ti->get_metadata(0);
+
+ PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations");
+
+ ERR_FAIL_INDEX(idx, translations.size());
+
+ translations.remove(idx);
+
+ undo_redo->create_action(TTR("Remove Translation"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_translation_res_file_open() {
+ translation_res_file_open_dialog->popup_file_dialog();
+}
+
+void LocalizationEditor::_translation_res_add(const String &p_path) {
+ Variant prev;
+ Dictionary remaps;
+
+ if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) {
+ remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
+ prev = remaps;
+ }
+
+ if (remaps.has(p_path)) {
+ return; //pointless already has it
+ }
+
+ remaps[p_path] = PackedStringArray();
+
+ undo_redo->create_action(TTR("Add Remapped Path"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", prev);
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_translation_res_option_file_open() {
+ translation_res_option_file_open_dialog->popup_file_dialog();
+}
+
+void LocalizationEditor::_translation_res_option_add(const String &p_path) {
+ ERR_FAIL_COND(!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps"));
+
+ Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = translation_remap->get_selected();
+ ERR_FAIL_COND(!k);
+
+ String key = k->get_metadata(0);
+
+ ERR_FAIL_COND(!remaps.has(key));
+ PackedStringArray r = remaps[key];
+ r.push_back(p_path + ":" + "en");
+ remaps[key] = r;
+
+ undo_redo->create_action(TTR("Resource Remap Add Remap"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_translation_res_select() {
+ if (updating_translations) {
+ return;
+ }
+
+ call_deferred("update_translations");
+}
+
+void LocalizationEditor::_translation_res_option_changed() {
+ if (updating_translations) {
+ return;
+ }
+
+ if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) {
+ return;
+ }
+
+ Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = translation_remap->get_selected();
+ ERR_FAIL_COND(!k);
+ TreeItem *ed = translation_remap_options->get_edited();
+ ERR_FAIL_COND(!ed);
+
+ String key = k->get_metadata(0);
+ int idx = ed->get_metadata(0);
+ String path = ed->get_metadata(1);
+ int which = ed->get_range(1);
+
+ Vector<String> langs = TranslationServer::get_all_locales();
+
+ ERR_FAIL_INDEX(which, langs.size());
+
+ ERR_FAIL_COND(!remaps.has(key));
+ PackedStringArray r = remaps[key];
+ ERR_FAIL_INDEX(idx, r.size());
+ if (translation_locales_idxs_remap.size() > which) {
+ r.set(idx, path + ":" + langs[translation_locales_idxs_remap[which]]);
+ } else {
+ r.set(idx, path + ":" + langs[which]);
+ }
+ remaps[key] = r;
+
+ updating_translations = true;
+ undo_redo->create_action(TTR("Change Resource Remap Language"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+ updating_translations = false;
+}
+
+void LocalizationEditor::_translation_res_delete(Object *p_item, int p_column, int p_button) {
+ if (updating_translations) {
+ return;
+ }
+
+ if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) {
+ return;
+ }
+
+ Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = Object::cast_to<TreeItem>(p_item);
+
+ String key = k->get_metadata(0);
+ ERR_FAIL_COND(!remaps.has(key));
+
+ remaps.erase(key);
+
+ undo_redo->create_action(TTR("Remove Resource Remap"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_translation_res_option_delete(Object *p_item, int p_column, int p_button) {
+ if (updating_translations) {
+ return;
+ }
+
+ if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) {
+ return;
+ }
+
+ Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
+
+ TreeItem *k = translation_remap->get_selected();
+ ERR_FAIL_COND(!k);
+ TreeItem *ed = Object::cast_to<TreeItem>(p_item);
+ ERR_FAIL_COND(!ed);
+
+ String key = k->get_metadata(0);
+ int idx = ed->get_metadata(0);
+
+ ERR_FAIL_COND(!remaps.has(key));
+ PackedStringArray r = remaps[key];
+ ERR_FAIL_INDEX(idx, r.size());
+ r.remove(idx);
+ remaps[key] = r;
+
+ undo_redo->create_action(TTR("Remove Resource Remap Option"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_translation_filter_option_changed() {
+ int sel_id = translation_locale_filter_mode->get_selected_id();
+ TreeItem *t = translation_filter->get_edited();
+ String locale = t->get_tooltip(0);
+ bool checked = t->is_checked(0);
+
+ Variant prev;
+ Array f_locales_all;
+
+ if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) {
+ f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter");
+ prev = f_locales_all;
+
+ if (f_locales_all.size() != 2) {
+ f_locales_all.clear();
+ f_locales_all.append(sel_id);
+ f_locales_all.append(Array());
+ }
+ } else {
+ f_locales_all.append(sel_id);
+ f_locales_all.append(Array());
+ }
+
+ Array f_locales = f_locales_all[1];
+ int l_idx = f_locales.find(locale);
+
+ if (checked) {
+ if (l_idx == -1) {
+ f_locales.append(locale);
+ }
+ } else {
+ if (l_idx != -1) {
+ f_locales.remove(l_idx);
+ }
+ }
+
+ f_locales = f_locales.sort();
+
+ undo_redo->create_action(TTR("Changed Locale Filter"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev);
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_translation_filter_mode_changed(int p_mode) {
+ int sel_id = translation_locale_filter_mode->get_selected_id();
+
+ Variant prev;
+ Array f_locales_all;
+
+ if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) {
+ f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter");
+ prev = f_locales_all;
+
+ if (f_locales_all.size() != 2) {
+ f_locales_all.clear();
+ f_locales_all.append(sel_id);
+ f_locales_all.append(Array());
+ } else {
+ f_locales_all[0] = sel_id;
+ }
+ } else {
+ f_locales_all.append(sel_id);
+ f_locales_all.append(Array());
+ }
+
+ undo_redo->create_action(TTR("Changed Locale Filter Mode"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev);
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_pot_add(const String &p_path) {
+ PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files");
+
+ for (int i = 0; i < pot_translations.size(); i++) {
+ if (pot_translations[i] == p_path) {
+ return; //exists
+ }
+ }
+
+ pot_translations.push_back(p_path);
+ undo_redo->create_action(TTR("Add files for POT generation"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", pot_translations);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", ProjectSettings::get_singleton()->get("locale/translations_pot_files"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_pot_delete(Object *p_item, int p_column, int p_button) {
+ TreeItem *ti = Object::cast_to<TreeItem>(p_item);
+ ERR_FAIL_COND(!ti);
+
+ int idx = ti->get_metadata(0);
+
+ PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files");
+
+ ERR_FAIL_INDEX(idx, pot_translations.size());
+
+ pot_translations.remove(idx);
+
+ undo_redo->create_action(TTR("Remove file from POT generation"));
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", pot_translations);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", ProjectSettings::get_singleton()->get("locale/translations_pot_files"));
+ undo_redo->add_do_method(this, "update_translations");
+ undo_redo->add_undo_method(this, "update_translations");
+ undo_redo->add_do_method(this, "emit_signal", localization_changed);
+ undo_redo->add_undo_method(this, "emit_signal", localization_changed);
+ undo_redo->commit_action();
+}
+
+void LocalizationEditor::_pot_file_open() {
+ pot_file_open_dialog->popup_file_dialog();
+}
+
+void LocalizationEditor::_pot_generate_open() {
+ pot_generate_dialog->popup_file_dialog();
+}
+
+void LocalizationEditor::_pot_generate(const String &p_file) {
+ POTGenerator::get_singleton()->generate_pot(p_file);
+}
+
+void LocalizationEditor::_update_pot_file_extensions() {
+ pot_file_open_dialog->clear_filters();
+ List<String> translation_parse_file_extensions;
+ EditorTranslationParser::get_singleton()->get_recognized_extensions(&translation_parse_file_extensions);
+ for (List<String>::Element *E = translation_parse_file_extensions.front(); E; E = E->next()) {
+ pot_file_open_dialog->add_filter("*." + E->get());
+ }
+}
+
+void LocalizationEditor::update_translations() {
+ if (updating_translations) {
+ return;
+ }
+
+ updating_translations = true;
+
+ translation_list->clear();
+ TreeItem *root = translation_list->create_item(nullptr);
+ translation_list->set_hide_root(true);
+ if (ProjectSettings::get_singleton()->has_setting("locale/translations")) {
+ PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations");
+ for (int i = 0; i < translations.size(); i++) {
+ TreeItem *t = translation_list->create_item(root);
+ t->set_editable(0, false);
+ t->set_text(0, translations[i].replace_first("res://", ""));
+ t->set_tooltip(0, translations[i]);
+ t->set_metadata(0, i);
+ t->add_button(0, get_theme_icon("Remove", "EditorIcons"), 0, false, TTR("Remove"));
+ }
+ }
+
+ Vector<String> langs = TranslationServer::get_all_locales();
+ Vector<String> names = TranslationServer::get_all_locale_names();
+
+ // Update filter tab
+ Array l_filter_all;
+
+ bool is_arr_empty = true;
+ if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) {
+ l_filter_all = ProjectSettings::get_singleton()->get("locale/locale_filter");
+
+ if (l_filter_all.size() == 2) {
+ translation_locale_filter_mode->select(l_filter_all[0]);
+ is_arr_empty = false;
+ }
+ }
+ if (is_arr_empty) {
+ l_filter_all.append(0);
+ l_filter_all.append(Array());
+ translation_locale_filter_mode->select(0);
+ }
+
+ int filter_mode = l_filter_all[0];
+ Array l_filter = l_filter_all[1];
+
+ int s = names.size();
+ bool is_short_list_when_show_all_selected = filter_mode == SHOW_ALL_LOCALES && translation_filter_treeitems.size() < s;
+ bool is_full_list_when_show_only_selected = filter_mode == SHOW_ONLY_SELECTED_LOCALES && translation_filter_treeitems.size() == s;
+ bool should_recreate_locales_list = is_short_list_when_show_all_selected || is_full_list_when_show_only_selected;
+
+ if (!translation_locales_list_created || should_recreate_locales_list) {
+ translation_locales_list_created = true;
+ translation_filter->clear();
+ root = translation_filter->create_item(nullptr);
+ translation_filter->set_hide_root(true);
+ translation_filter_treeitems.clear();
+ for (int i = 0; i < s; i++) {
+ String n = names[i];
+ String l = langs[i];
+ bool is_checked = l_filter.has(l);
+ if (filter_mode == SHOW_ONLY_SELECTED_LOCALES && !is_checked) {
+ continue;
+ }
+
+ TreeItem *t = translation_filter->create_item(root);
+ t->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
+ t->set_text(0, n);
+ t->set_editable(0, true);
+ t->set_tooltip(0, l);
+ t->set_checked(0, is_checked);
+ translation_filter_treeitems.push_back(t);
+ }
+ } else {
+ for (int i = 0; i < translation_filter_treeitems.size(); i++) {
+ TreeItem *t = translation_filter_treeitems[i];
+ t->set_checked(0, l_filter.has(t->get_tooltip(0)));
+ }
+ }
+
+ // Update translation remaps.
+ String remap_selected;
+ if (translation_remap->get_selected()) {
+ remap_selected = translation_remap->get_selected()->get_metadata(0);
+ }
+
+ translation_remap->clear();
+ translation_remap_options->clear();
+ root = translation_remap->create_item(nullptr);
+ TreeItem *root2 = translation_remap_options->create_item(nullptr);
+ translation_remap->set_hide_root(true);
+ translation_remap_options->set_hide_root(true);
+ translation_res_option_add_button->set_disabled(true);
+
+ translation_locales_idxs_remap.clear();
+ translation_locales_idxs_remap.resize(l_filter.size());
+ int fl_idx_count = translation_locales_idxs_remap.size();
+
+ String langnames = "";
+ int l_idx = 0;
+ for (int i = 0; i < names.size(); i++) {
+ if (filter_mode == SHOW_ONLY_SELECTED_LOCALES && fl_idx_count != 0) {
+ if (l_filter.size() > 0) {
+ if (l_filter.find(langs[i]) != -1) {
+ if (langnames.length() > 0) {
+ langnames += ",";
+ }
+ langnames += names[i];
+ translation_locales_idxs_remap.write[l_idx] = i;
+ l_idx++;
+ }
+ }
+ } else {
+ if (i > 0) {
+ langnames += ",";
+ }
+ langnames += names[i];
+ }
+ }
+
+ if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) {
+ Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
+ List<Variant> rk;
+ remaps.get_key_list(&rk);
+ Vector<String> keys;
+ for (List<Variant>::Element *E = rk.front(); E; E = E->next()) {
+ keys.push_back(E->get());
+ }
+ keys.sort();
+
+ for (int i = 0; i < keys.size(); i++) {
+ TreeItem *t = translation_remap->create_item(root);
+ t->set_editable(0, false);
+ t->set_text(0, keys[i].replace_first("res://", ""));
+ t->set_tooltip(0, keys[i]);
+ t->set_metadata(0, keys[i]);
+ t->add_button(0, get_theme_icon("Remove", "EditorIcons"), 0, false, TTR("Remove"));
+ if (keys[i] == remap_selected) {
+ t->select(0);
+ translation_res_option_add_button->set_disabled(false);
+
+ PackedStringArray selected = remaps[keys[i]];
+ for (int j = 0; j < selected.size(); j++) {
+ String s2 = selected[j];
+ int qp = s2.rfind(":");
+ String path = s2.substr(0, qp);
+ String locale = s2.substr(qp + 1, s2.length());
+
+ TreeItem *t2 = translation_remap_options->create_item(root2);
+ t2->set_editable(0, false);
+ t2->set_text(0, path.replace_first("res://", ""));
+ t2->set_tooltip(0, path);
+ t2->set_metadata(0, j);
+ t2->add_button(0, get_theme_icon("Remove", "EditorIcons"), 0, false, TTR("Remove"));
+ t2->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
+ t2->set_text(1, langnames);
+ t2->set_editable(1, true);
+ t2->set_metadata(1, path);
+ int idx = langs.find(locale);
+ if (idx < 0) {
+ idx = 0;
+ }
+
+ int f_idx = translation_locales_idxs_remap.find(idx);
+ if (f_idx != -1 && fl_idx_count > 0 && filter_mode == SHOW_ONLY_SELECTED_LOCALES) {
+ t2->set_range(1, f_idx);
+ } else {
+ t2->set_range(1, idx);
+ }
+ }
+ }
+ }
+ }
+
+ // Update translation POT files.
+ translation_pot_list->clear();
+ root = translation_pot_list->create_item(nullptr);
+ translation_pot_list->set_hide_root(true);
+ if (ProjectSettings::get_singleton()->has_setting("locale/translations_pot_files")) {
+ PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files");
+ for (int i = 0; i < pot_translations.size(); i++) {
+ TreeItem *t = translation_pot_list->create_item(root);
+ t->set_editable(0, false);
+ t->set_text(0, pot_translations[i].replace_first("res://", ""));
+ t->set_tooltip(0, pot_translations[i]);
+ t->set_metadata(0, i);
+ t->add_button(0, get_theme_icon("Remove", "EditorIcons"), 0, false, TTR("Remove"));
+ }
+ }
+
+ // New translation parser plugin might extend possible file extensions in POT generation.
+ _update_pot_file_extensions();
+
+ updating_translations = false;
+}
+
+void LocalizationEditor::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("update_translations"), &LocalizationEditor::update_translations);
+
+ ADD_SIGNAL(MethodInfo("localization_changed"));
+}
+
+LocalizationEditor::LocalizationEditor() {
+ undo_redo = EditorNode::get_undo_redo();
+ updating_translations = false;
+ localization_changed = "localization_changed";
+
+ translation_locales_idxs_remap = Vector<int>();
+ translation_locales_list_created = false;
+
+ TabContainer *translations = memnew(TabContainer);
+ translations->set_tab_align(TabContainer::ALIGN_LEFT);
+ translations->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ add_child(translations);
+
+ {
+ VBoxContainer *tvb = memnew(VBoxContainer);
+ tvb->set_name(TTR("Translations"));
+ translations->add_child(tvb);
+
+ HBoxContainer *thb = memnew(HBoxContainer);
+ thb->add_spacer();
+ thb->add_child(memnew(Label(TTR("Translations:"))));
+ tvb->add_child(thb);
+
+ Button *addtr = memnew(Button(TTR("Add...")));
+ addtr->connect("pressed", callable_mp(this, &LocalizationEditor::_translation_file_open));
+ thb->add_child(addtr);
+
+ VBoxContainer *tmc = memnew(VBoxContainer);
+ tmc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tvb->add_child(tmc);
+
+ translation_list = memnew(Tree);
+ translation_list->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tmc->add_child(translation_list);
+
+ translation_file_open = memnew(EditorFileDialog);
+ translation_file_open->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ translation_file_open->connect("file_selected", callable_mp(this, &LocalizationEditor::_translation_add));
+ add_child(translation_file_open);
+ }
+
+ {
+ VBoxContainer *tvb = memnew(VBoxContainer);
+ tvb->set_name(TTR("Remaps"));
+ translations->add_child(tvb);
+
+ HBoxContainer *thb = memnew(HBoxContainer);
+ thb->add_child(memnew(Label(TTR("Resources:"))));
+ thb->add_spacer();
+ tvb->add_child(thb);
+
+ Button *addtr = memnew(Button(TTR("Add...")));
+ addtr->connect("pressed", callable_mp(this, &LocalizationEditor::_translation_res_file_open));
+ thb->add_child(addtr);
+
+ VBoxContainer *tmc = memnew(VBoxContainer);
+ tmc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tvb->add_child(tmc);
+
+ translation_remap = memnew(Tree);
+ translation_remap->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ translation_remap->connect("cell_selected", callable_mp(this, &LocalizationEditor::_translation_res_select));
+ translation_remap->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_res_delete));
+ tmc->add_child(translation_remap);
+
+ translation_res_file_open_dialog = memnew(EditorFileDialog);
+ translation_res_file_open_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ translation_res_file_open_dialog->connect("file_selected", callable_mp(this, &LocalizationEditor::_translation_res_add));
+ add_child(translation_res_file_open_dialog);
+
+ thb = memnew(HBoxContainer);
+ thb->add_child(memnew(Label(TTR("Remaps by Locale:"))));
+ thb->add_spacer();
+ tvb->add_child(thb);
+
+ addtr = memnew(Button(TTR("Add...")));
+ addtr->connect("pressed", callable_mp(this, &LocalizationEditor::_translation_res_option_file_open));
+ translation_res_option_add_button = addtr;
+ thb->add_child(addtr);
+
+ tmc = memnew(VBoxContainer);
+ tmc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tvb->add_child(tmc);
+
+ translation_remap_options = memnew(Tree);
+ translation_remap_options->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ translation_remap_options->set_columns(2);
+ translation_remap_options->set_column_title(0, TTR("Path"));
+ translation_remap_options->set_column_title(1, TTR("Locale"));
+ translation_remap_options->set_column_titles_visible(true);
+ translation_remap_options->set_column_expand(0, true);
+ translation_remap_options->set_column_expand(1, false);
+ translation_remap_options->set_column_min_width(1, 200);
+ translation_remap_options->connect("item_edited", callable_mp(this, &LocalizationEditor::_translation_res_option_changed));
+ translation_remap_options->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_res_option_delete));
+ tmc->add_child(translation_remap_options);
+
+ translation_res_option_file_open_dialog = memnew(EditorFileDialog);
+ translation_res_option_file_open_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ translation_res_option_file_open_dialog->connect("file_selected", callable_mp(this, &LocalizationEditor::_translation_res_option_add));
+ add_child(translation_res_option_file_open_dialog);
+ }
+
+ {
+ VBoxContainer *tvb = memnew(VBoxContainer);
+ tvb->set_name(TTR("Locales Filter"));
+ translations->add_child(tvb);
+
+ VBoxContainer *tmc = memnew(VBoxContainer);
+ tmc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tvb->add_child(tmc);
+
+ translation_locale_filter_mode = memnew(OptionButton);
+ translation_locale_filter_mode->add_item(TTR("Show All Locales"), SHOW_ALL_LOCALES);
+ translation_locale_filter_mode->add_item(TTR("Show Selected Locales Only"), SHOW_ONLY_SELECTED_LOCALES);
+ translation_locale_filter_mode->select(0);
+ translation_locale_filter_mode->connect("item_selected", callable_mp(this, &LocalizationEditor::_translation_filter_mode_changed));
+ tmc->add_margin_child(TTR("Filter mode:"), translation_locale_filter_mode);
+
+ tmc->add_child(memnew(Label(TTR("Locales:"))));
+ translation_filter = memnew(Tree);
+ translation_filter->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ translation_filter->set_columns(1);
+ translation_filter->connect("item_edited", callable_mp(this, &LocalizationEditor::_translation_filter_option_changed));
+ tmc->add_child(translation_filter);
+ }
+
+ {
+ VBoxContainer *tvb = memnew(VBoxContainer);
+ tvb->set_name(TTR("POT Generation"));
+ translations->add_child(tvb);
+
+ HBoxContainer *thb = memnew(HBoxContainer);
+ thb->add_child(memnew(Label(TTR("Files with translation strings:"))));
+ thb->add_spacer();
+ tvb->add_child(thb);
+
+ Button *addtr = memnew(Button(TTR("Add...")));
+ addtr->connect("pressed", callable_mp(this, &LocalizationEditor::_pot_file_open));
+ thb->add_child(addtr);
+
+ Button *generate = memnew(Button(TTR("Generate POT")));
+ generate->connect("pressed", callable_mp(this, &LocalizationEditor::_pot_generate_open));
+ thb->add_child(generate);
+
+ VBoxContainer *tmc = memnew(VBoxContainer);
+ tmc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tvb->add_child(tmc);
+
+ translation_pot_list = memnew(Tree);
+ translation_pot_list->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tmc->add_child(translation_pot_list);
+
+ pot_generate_dialog = memnew(EditorFileDialog);
+ pot_generate_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+ pot_generate_dialog->connect("file_selected", callable_mp(this, &LocalizationEditor::_pot_generate));
+ add_child(pot_generate_dialog);
+
+ pot_file_open_dialog = memnew(EditorFileDialog);
+ pot_file_open_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ pot_file_open_dialog->connect("file_selected", callable_mp(this, &LocalizationEditor::_pot_add));
+ add_child(pot_file_open_dialog);
+ }
+}
diff --git a/editor/localization_editor.h b/editor/localization_editor.h
new file mode 100644
index 0000000000..b7253fb31d
--- /dev/null
+++ b/editor/localization_editor.h
@@ -0,0 +1,103 @@
+/*************************************************************************/
+/* localization_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef LOCALIZATION_EDITOR_H
+#define LOCALIZATION_EDITOR_H
+
+#include "core/undo_redo.h"
+#include "editor_file_dialog.h"
+#include "scene/gui/tree.h"
+
+class LocalizationEditor : public VBoxContainer {
+ GDCLASS(LocalizationEditor, VBoxContainer);
+
+ enum LocaleFilter {
+ SHOW_ALL_LOCALES,
+ SHOW_ONLY_SELECTED_LOCALES,
+ };
+
+ Tree *translation_list;
+
+ EditorFileDialog *translation_file_open;
+
+ Button *translation_res_option_add_button;
+ EditorFileDialog *translation_res_file_open_dialog;
+ EditorFileDialog *translation_res_option_file_open_dialog;
+ Tree *translation_remap;
+ Tree *translation_remap_options;
+ Tree *translation_filter;
+ bool translation_locales_list_created;
+ OptionButton *translation_locale_filter_mode;
+ Vector<TreeItem *> translation_filter_treeitems;
+ Vector<int> translation_locales_idxs_remap;
+
+ Tree *translation_pot_list;
+ EditorFileDialog *pot_file_open_dialog;
+ EditorFileDialog *pot_generate_dialog;
+
+ UndoRedo *undo_redo;
+ bool updating_translations;
+ String localization_changed;
+
+ void _translation_file_open();
+ void _translation_add(const String &p_path);
+ void _translation_delete(Object *p_item, int p_column, int p_button);
+
+ void _translation_res_file_open();
+ void _translation_res_add(const String &p_path);
+ void _translation_res_delete(Object *p_item, int p_column, int p_button);
+ void _translation_res_select();
+ void _translation_res_option_file_open();
+ void _translation_res_option_add(const String &p_path);
+ void _translation_res_option_changed();
+ void _translation_res_option_delete(Object *p_item, int p_column, int p_button);
+
+ void _translation_filter_option_changed();
+ void _translation_filter_mode_changed(int p_mode);
+
+ void _pot_add(const String &p_path);
+ void _pot_delete(Object *p_item, int p_column, int p_button);
+ void _pot_file_open();
+ void _pot_generate_open();
+ void _pot_generate(const String &p_file);
+ void _update_pot_file_extensions();
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void add_translation(const String &p_translation);
+ void update_translations();
+
+ LocalizationEditor();
+};
+
+#endif // LOCALIZATION_EDITOR_H
diff --git a/editor/multi_node_edit.cpp b/editor/multi_node_edit.cpp
index 7bc67b54c1..1077aca7b3 100644
--- a/editor/multi_node_edit.cpp
+++ b/editor/multi_node_edit.cpp
@@ -39,8 +39,9 @@ bool MultiNodeEdit::_set(const StringName &p_name, const Variant &p_value) {
bool MultiNodeEdit::_set_impl(const StringName &p_name, const Variant &p_value, const String &p_field) {
Node *es = EditorNode::get_singleton()->get_edited_scene();
- if (!es)
+ if (!es) {
return false;
+ }
String name = p_name;
@@ -52,13 +53,14 @@ bool MultiNodeEdit::_set_impl(const StringName &p_name, const Variant &p_value,
ur->create_action(TTR("MultiNode Set") + " " + String(name), UndoRedo::MERGE_ENDS);
for (const List<NodePath>::Element *E = nodes.front(); E; E = E->next()) {
-
- if (!es->has_node(E->get()))
+ if (!es->has_node(E->get())) {
continue;
+ }
Node *n = es->get_node(E->get());
- if (!n)
+ if (!n) {
continue;
+ }
if (p_value.get_type() == Variant::NODE_PATH) {
Node *tonode = n->get_node(p_value);
@@ -87,8 +89,9 @@ bool MultiNodeEdit::_set_impl(const StringName &p_name, const Variant &p_value,
bool MultiNodeEdit::_get(const StringName &p_name, Variant &r_ret) const {
Node *es = EditorNode::get_singleton()->get_edited_scene();
- if (!es)
+ if (!es) {
return false;
+ }
String name = p_name;
if (name == "scripts") { // script set is intercepted at object level (check Variant Object::get() ) ,so use a different name
@@ -96,18 +99,20 @@ bool MultiNodeEdit::_get(const StringName &p_name, Variant &r_ret) const {
}
for (const List<NodePath>::Element *E = nodes.front(); E; E = E->next()) {
-
- if (!es->has_node(E->get()))
+ if (!es->has_node(E->get())) {
continue;
+ }
const Node *n = es->get_node(E->get());
- if (!n)
+ if (!n) {
continue;
+ }
bool found;
r_ret = n->get(name, &found);
- if (found)
+ if (found) {
return true;
+ }
}
return false;
@@ -117,29 +122,31 @@ void MultiNodeEdit::_get_property_list(List<PropertyInfo> *p_list) const {
HashMap<String, PLData> usage;
Node *es = EditorNode::get_singleton()->get_edited_scene();
- if (!es)
+ if (!es) {
return;
+ }
int nc = 0;
List<PLData *> data_list;
for (const List<NodePath>::Element *E = nodes.front(); E; E = E->next()) {
-
- if (!es->has_node(E->get()))
+ if (!es->has_node(E->get())) {
continue;
+ }
Node *n = es->get_node(E->get());
- if (!n)
+ if (!n) {
continue;
+ }
List<PropertyInfo> plist;
n->get_property_list(&plist, true);
for (List<PropertyInfo>::Element *F = plist.front(); F; F = F->next()) {
-
- if (F->get().name == "script")
+ if (F->get().name == "script") {
continue; //added later manually, since this is intercepted before being set (check Variant Object::get() )
+ }
if (!usage.has(F->get().name)) {
PLData pld;
pld.uses = 0;
@@ -149,15 +156,15 @@ void MultiNodeEdit::_get_property_list(List<PropertyInfo> *p_list) const {
}
// Make sure only properties with the same exact PropertyInfo data will appear
- if (usage[F->get().name].info == F->get())
+ if (usage[F->get().name].info == F->get()) {
usage[F->get().name].uses++;
+ }
}
nc++;
}
for (List<PLData *>::Element *E = data_list.front(); E; E = E->next()) {
-
if (nc == E->get()->uses) {
p_list->push_back(E->get()->info);
}
diff --git a/editor/multi_node_edit.h b/editor/multi_node_edit.h
index d3eefafcec..694dad76f1 100644
--- a/editor/multi_node_edit.h
+++ b/editor/multi_node_edit.h
@@ -34,7 +34,6 @@
#include "scene/main/node.h"
class MultiNodeEdit : public Reference {
-
GDCLASS(MultiNodeEdit, Reference);
List<NodePath> nodes;
diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp
new file mode 100644
index 0000000000..6e5fb6389d
--- /dev/null
+++ b/editor/node_3d_editor_gizmos.cpp
@@ -0,0 +1,4688 @@
+/*************************************************************************/
+/* node_3d_editor_gizmos.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "node_3d_editor_gizmos.h"
+
+#include "core/math/geometry_2d.h"
+#include "core/math/geometry_3d.h"
+#include "core/math/quick_hull.h"
+#include "scene/3d/audio_stream_player_3d.h"
+#include "scene/3d/baked_lightmap.h"
+#include "scene/3d/collision_polygon_3d.h"
+#include "scene/3d/collision_shape_3d.h"
+#include "scene/3d/cpu_particles_3d.h"
+#include "scene/3d/decal.h"
+#include "scene/3d/gi_probe.h"
+#include "scene/3d/gpu_particles_3d.h"
+#include "scene/3d/light_3d.h"
+#include "scene/3d/lightmap_probe.h"
+#include "scene/3d/listener_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/physics_joint_3d.h"
+#include "scene/3d/position_3d.h"
+#include "scene/3d/ray_cast_3d.h"
+#include "scene/3d/reflection_probe.h"
+#include "scene/3d/soft_body_3d.h"
+#include "scene/3d/spring_arm_3d.h"
+#include "scene/3d/sprite_3d.h"
+#include "scene/3d/vehicle_body_3d.h"
+#include "scene/3d/visibility_notifier_3d.h"
+#include "scene/resources/box_shape_3d.h"
+#include "scene/resources/capsule_shape_3d.h"
+#include "scene/resources/concave_polygon_shape_3d.h"
+#include "scene/resources/convex_polygon_shape_3d.h"
+#include "scene/resources/cylinder_shape_3d.h"
+#include "scene/resources/height_map_shape_3d.h"
+#include "scene/resources/primitive_meshes.h"
+#include "scene/resources/ray_shape_3d.h"
+#include "scene/resources/sphere_shape_3d.h"
+#include "scene/resources/surface_tool.h"
+#include "scene/resources/world_margin_shape_3d.h"
+
+#define HANDLE_HALF_SIZE 9.5
+
+bool EditorNode3DGizmo::is_editable() const {
+ ERR_FAIL_COND_V(!spatial_node, false);
+ Node *edited_root = spatial_node->get_tree()->get_edited_scene_root();
+ if (spatial_node == edited_root) {
+ return true;
+ }
+ if (spatial_node->get_owner() == edited_root) {
+ return true;
+ }
+
+ if (edited_root->is_editable_instance(spatial_node->get_owner())) {
+ return true;
+ }
+
+ return false;
+}
+
+void EditorNode3DGizmo::clear() {
+ for (int i = 0; i < instances.size(); i++) {
+ if (instances[i].instance.is_valid()) {
+ RS::get_singleton()->free(instances[i].instance);
+ }
+ }
+
+ billboard_handle = false;
+ collision_segments.clear();
+ collision_mesh = Ref<TriangleMesh>();
+ instances.clear();
+ handles.clear();
+ secondary_handles.clear();
+}
+
+void EditorNode3DGizmo::redraw() {
+ if (get_script_instance() && get_script_instance()->has_method("redraw")) {
+ get_script_instance()->call("redraw");
+ return;
+ }
+
+ ERR_FAIL_COND(!gizmo_plugin);
+ gizmo_plugin->redraw(this);
+}
+
+String EditorNode3DGizmo::get_handle_name(int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_name")) {
+ return get_script_instance()->call("get_handle_name", p_idx);
+ }
+
+ ERR_FAIL_COND_V(!gizmo_plugin, "");
+ return gizmo_plugin->get_handle_name(this, p_idx);
+}
+
+bool EditorNode3DGizmo::is_handle_highlighted(int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("is_handle_highlighted")) {
+ return get_script_instance()->call("is_handle_highlighted", p_idx);
+ }
+
+ ERR_FAIL_COND_V(!gizmo_plugin, false);
+ return gizmo_plugin->is_handle_highlighted(this, p_idx);
+}
+
+Variant EditorNode3DGizmo::get_handle_value(int p_idx) {
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_value")) {
+ return get_script_instance()->call("get_handle_value", p_idx);
+ }
+
+ ERR_FAIL_COND_V(!gizmo_plugin, Variant());
+ return gizmo_plugin->get_handle_value(this, p_idx);
+}
+
+void EditorNode3DGizmo::set_handle(int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ if (get_script_instance() && get_script_instance()->has_method("set_handle")) {
+ get_script_instance()->call("set_handle", p_idx, p_camera, p_point);
+ return;
+ }
+
+ ERR_FAIL_COND(!gizmo_plugin);
+ gizmo_plugin->set_handle(this, p_idx, p_camera, p_point);
+}
+
+void EditorNode3DGizmo::commit_handle(int p_idx, const Variant &p_restore, bool p_cancel) {
+ if (get_script_instance() && get_script_instance()->has_method("commit_handle")) {
+ get_script_instance()->call("commit_handle", p_idx, p_restore, p_cancel);
+ return;
+ }
+
+ ERR_FAIL_COND(!gizmo_plugin);
+ gizmo_plugin->commit_handle(this, p_idx, p_restore, p_cancel);
+}
+
+void EditorNode3DGizmo::set_spatial_node(Node3D *p_node) {
+ ERR_FAIL_NULL(p_node);
+ spatial_node = p_node;
+}
+
+void EditorNode3DGizmo::Instance::create_instance(Node3D *p_base, bool p_hidden) {
+ instance = RS::get_singleton()->instance_create2(mesh->get_rid(), p_base->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_attach_object_instance_id(instance, p_base->get_instance_id());
+ if (skin_reference.is_valid()) {
+ RS::get_singleton()->instance_attach_skeleton(instance, skin_reference->get_skeleton());
+ }
+ if (extra_margin) {
+ RS::get_singleton()->instance_set_extra_visibility_margin(instance, 1);
+ }
+ RS::get_singleton()->instance_geometry_set_cast_shadows_setting(instance, RS::SHADOW_CASTING_SETTING_OFF);
+ int layer = p_hidden ? 0 : 1 << Node3DEditorViewport::GIZMO_EDIT_LAYER;
+ RS::get_singleton()->instance_set_layer_mask(instance, layer); //gizmos are 26
+}
+
+void EditorNode3DGizmo::add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard, const Ref<SkinReference> &p_skin_reference, const Ref<Material> &p_material) {
+ ERR_FAIL_COND(!spatial_node);
+ Instance ins;
+
+ ins.billboard = p_billboard;
+ ins.mesh = p_mesh;
+ ins.skin_reference = p_skin_reference;
+ ins.material = p_material;
+ if (valid) {
+ ins.create_instance(spatial_node, hidden);
+ RS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
+ if (ins.material.is_valid()) {
+ RS::get_singleton()->instance_geometry_set_material_override(ins.instance, p_material->get_rid());
+ }
+ }
+
+ instances.push_back(ins);
+}
+
+void EditorNode3DGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard, const Color &p_modulate) {
+ if (p_lines.empty()) {
+ return;
+ }
+
+ ERR_FAIL_COND(!spatial_node);
+ Instance ins;
+
+ Ref<ArrayMesh> mesh = memnew(ArrayMesh);
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+
+ a[Mesh::ARRAY_VERTEX] = p_lines;
+
+ Vector<Color> color;
+ color.resize(p_lines.size());
+ {
+ Color *w = color.ptrw();
+ for (int i = 0; i < p_lines.size(); i++) {
+ if (is_selected()) {
+ w[i] = Color(1, 1, 1, 0.8) * p_modulate;
+ } else {
+ w[i] = Color(1, 1, 1, 0.2) * p_modulate;
+ }
+ }
+ }
+
+ a[Mesh::ARRAY_COLOR] = color;
+
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, a);
+ mesh->surface_set_material(0, p_material);
+
+ if (p_billboard) {
+ float md = 0;
+ for (int i = 0; i < p_lines.size(); i++) {
+ md = MAX(0, p_lines[i].length());
+ }
+ if (md) {
+ mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0));
+ }
+ }
+
+ ins.billboard = p_billboard;
+ ins.mesh = mesh;
+ if (valid) {
+ ins.create_instance(spatial_node, hidden);
+ RS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
+ }
+
+ instances.push_back(ins);
+}
+
+void EditorNode3DGizmo::add_unscaled_billboard(const Ref<Material> &p_material, float p_scale, const Color &p_modulate) {
+ ERR_FAIL_COND(!spatial_node);
+ Instance ins;
+
+ Vector<Vector3> vs;
+ Vector<Vector2> uv;
+ Vector<Color> colors;
+
+ vs.push_back(Vector3(-p_scale, p_scale, 0));
+ vs.push_back(Vector3(p_scale, p_scale, 0));
+ vs.push_back(Vector3(p_scale, -p_scale, 0));
+ vs.push_back(Vector3(-p_scale, -p_scale, 0));
+
+ uv.push_back(Vector2(0, 0));
+ uv.push_back(Vector2(1, 0));
+ uv.push_back(Vector2(1, 1));
+ uv.push_back(Vector2(0, 1));
+
+ colors.push_back(p_modulate);
+ colors.push_back(p_modulate);
+ colors.push_back(p_modulate);
+ colors.push_back(p_modulate);
+
+ Ref<ArrayMesh> mesh = memnew(ArrayMesh);
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ a[Mesh::ARRAY_VERTEX] = vs;
+ a[Mesh::ARRAY_TEX_UV] = uv;
+ Vector<int> indices;
+ indices.push_back(0);
+ indices.push_back(1);
+ indices.push_back(2);
+ indices.push_back(0);
+ indices.push_back(2);
+ indices.push_back(3);
+ a[Mesh::ARRAY_INDEX] = indices;
+ a[Mesh::ARRAY_COLOR] = colors;
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, a);
+ mesh->surface_set_material(0, p_material);
+
+ float md = 0;
+ for (int i = 0; i < vs.size(); i++) {
+ md = MAX(0, vs[i].length());
+ }
+ if (md) {
+ mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0));
+ }
+
+ selectable_icon_size = p_scale;
+ mesh->set_custom_aabb(AABB(Vector3(-selectable_icon_size, -selectable_icon_size, -selectable_icon_size) * 100.0f, Vector3(selectable_icon_size, selectable_icon_size, selectable_icon_size) * 200.0f));
+
+ ins.mesh = mesh;
+ ins.unscaled = true;
+ ins.billboard = true;
+ if (valid) {
+ ins.create_instance(spatial_node, hidden);
+ RS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
+ }
+
+ selectable_icon_size = p_scale;
+
+ instances.push_back(ins);
+}
+
+void EditorNode3DGizmo::add_collision_triangles(const Ref<TriangleMesh> &p_tmesh) {
+ collision_mesh = p_tmesh;
+}
+
+void EditorNode3DGizmo::add_collision_segments(const Vector<Vector3> &p_lines) {
+ int from = collision_segments.size();
+ collision_segments.resize(from + p_lines.size());
+ for (int i = 0; i < p_lines.size(); i++) {
+ collision_segments.write[from + i] = p_lines[i];
+ }
+}
+
+void EditorNode3DGizmo::add_handles(const Vector<Vector3> &p_handles, const Ref<Material> &p_material, bool p_billboard, bool p_secondary) {
+ billboard_handle = p_billboard;
+
+ if (!is_selected() || !is_editable()) {
+ return;
+ }
+
+ ERR_FAIL_COND(!spatial_node);
+
+ Instance ins;
+
+ Ref<ArrayMesh> mesh = memnew(ArrayMesh);
+
+ Array a;
+ a.resize(RS::ARRAY_MAX);
+ a[RS::ARRAY_VERTEX] = p_handles;
+ Vector<Color> colors;
+ {
+ colors.resize(p_handles.size());
+ Color *w = colors.ptrw();
+ for (int i = 0; i < p_handles.size(); i++) {
+ Color col(1, 1, 1, 1);
+ if (is_handle_highlighted(i)) {
+ col = Color(0, 0, 1, 0.9);
+ }
+
+ if (Node3DEditor::get_singleton()->get_over_gizmo_handle() != i) {
+ col.a = 0.8;
+ }
+
+ w[i] = col;
+ }
+ }
+ a[RS::ARRAY_COLOR] = colors;
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_POINTS, a);
+ mesh->surface_set_material(0, p_material);
+
+ if (p_billboard) {
+ float md = 0;
+ for (int i = 0; i < p_handles.size(); i++) {
+ md = MAX(0, p_handles[i].length());
+ }
+ if (md) {
+ mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0));
+ }
+ }
+
+ ins.mesh = mesh;
+ ins.billboard = p_billboard;
+ ins.extra_margin = true;
+ if (valid) {
+ ins.create_instance(spatial_node, hidden);
+ RS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
+ }
+ instances.push_back(ins);
+ if (!p_secondary) {
+ int chs = handles.size();
+ handles.resize(chs + p_handles.size());
+ for (int i = 0; i < p_handles.size(); i++) {
+ handles.write[i + chs] = p_handles[i];
+ }
+ } else {
+ int chs = secondary_handles.size();
+ secondary_handles.resize(chs + p_handles.size());
+ for (int i = 0; i < p_handles.size(); i++) {
+ secondary_handles.write[i + chs] = p_handles[i];
+ }
+ }
+}
+
+void EditorNode3DGizmo::add_solid_box(Ref<Material> &p_material, Vector3 p_size, Vector3 p_position) {
+ ERR_FAIL_COND(!spatial_node);
+
+ CubeMesh cubem;
+ cubem.set_size(p_size);
+
+ Array arrays = cubem.surface_get_arrays(0);
+ PackedVector3Array vertex = arrays[RS::ARRAY_VERTEX];
+ Vector3 *w = vertex.ptrw();
+
+ for (int i = 0; i < vertex.size(); ++i) {
+ w[i] += p_position;
+ }
+
+ arrays[RS::ARRAY_VERTEX] = vertex;
+
+ Ref<ArrayMesh> m = memnew(ArrayMesh);
+ m->add_surface_from_arrays(cubem.surface_get_primitive_type(0), arrays);
+ m->surface_set_material(0, p_material);
+ add_mesh(m);
+}
+
+bool EditorNode3DGizmo::intersect_frustum(const Camera3D *p_camera, const Vector<Plane> &p_frustum) {
+ ERR_FAIL_COND_V(!spatial_node, false);
+ ERR_FAIL_COND_V(!valid, false);
+
+ if (hidden && !gizmo_plugin->is_selectable_when_hidden()) {
+ return false;
+ }
+
+ if (selectable_icon_size > 0.0f) {
+ Vector3 origin = spatial_node->get_global_transform().get_origin();
+
+ const Plane *p = p_frustum.ptr();
+ int fc = p_frustum.size();
+
+ bool any_out = false;
+
+ for (int j = 0; j < fc; j++) {
+ if (p[j].is_point_over(origin)) {
+ any_out = true;
+ break;
+ }
+ }
+
+ return !any_out;
+ }
+
+ if (collision_segments.size()) {
+ const Plane *p = p_frustum.ptr();
+ int fc = p_frustum.size();
+
+ int vc = collision_segments.size();
+ const Vector3 *vptr = collision_segments.ptr();
+ Transform t = spatial_node->get_global_transform();
+
+ bool any_out = false;
+ for (int j = 0; j < fc; j++) {
+ for (int i = 0; i < vc; i++) {
+ Vector3 v = t.xform(vptr[i]);
+ if (p[j].is_point_over(v)) {
+ any_out = true;
+ break;
+ }
+ }
+ if (any_out) {
+ break;
+ }
+ }
+
+ if (!any_out) {
+ return true;
+ }
+ }
+
+ if (collision_mesh.is_valid()) {
+ Transform t = spatial_node->get_global_transform();
+
+ Vector3 mesh_scale = t.get_basis().get_scale();
+ t.orthonormalize();
+
+ Transform it = t.affine_inverse();
+
+ Vector<Plane> transformed_frustum;
+
+ for (int i = 0; i < p_frustum.size(); i++) {
+ transformed_frustum.push_back(it.xform(p_frustum[i]));
+ }
+
+ Vector<Vector3> convex_points = Geometry3D::compute_convex_mesh_points(p_frustum.ptr(), p_frustum.size());
+ if (collision_mesh->inside_convex_shape(transformed_frustum.ptr(), transformed_frustum.size(), convex_points.ptr(), convex_points.size(), mesh_scale)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool EditorNode3DGizmo::intersect_ray(Camera3D *p_camera, const Point2 &p_point, Vector3 &r_pos, Vector3 &r_normal, int *r_gizmo_handle, bool p_sec_first) {
+ ERR_FAIL_COND_V(!spatial_node, false);
+ ERR_FAIL_COND_V(!valid, false);
+
+ if (hidden && !gizmo_plugin->is_selectable_when_hidden()) {
+ return false;
+ }
+
+ if (r_gizmo_handle && !hidden) {
+ Transform t = spatial_node->get_global_transform();
+ if (billboard_handle) {
+ t.set_look_at(t.origin, t.origin - p_camera->get_transform().basis.get_axis(2), p_camera->get_transform().basis.get_axis(1));
+ }
+
+ float min_d = 1e20;
+ int idx = -1;
+
+ for (int i = 0; i < secondary_handles.size(); i++) {
+ Vector3 hpos = t.xform(secondary_handles[i]);
+ Vector2 p = p_camera->unproject_position(hpos);
+
+ if (p.distance_to(p_point) < HANDLE_HALF_SIZE) {
+ real_t dp = p_camera->get_transform().origin.distance_to(hpos);
+ if (dp < min_d) {
+ r_pos = t.xform(hpos);
+ r_normal = p_camera->get_transform().basis.get_axis(2);
+ min_d = dp;
+ idx = i + handles.size();
+ }
+ }
+ }
+
+ if (p_sec_first && idx != -1) {
+ *r_gizmo_handle = idx;
+ return true;
+ }
+
+ min_d = 1e20;
+
+ for (int i = 0; i < handles.size(); i++) {
+ Vector3 hpos = t.xform(handles[i]);
+ Vector2 p = p_camera->unproject_position(hpos);
+
+ if (p.distance_to(p_point) < HANDLE_HALF_SIZE) {
+ real_t dp = p_camera->get_transform().origin.distance_to(hpos);
+ if (dp < min_d) {
+ r_pos = t.xform(hpos);
+ r_normal = p_camera->get_transform().basis.get_axis(2);
+ min_d = dp;
+ idx = i;
+ }
+ }
+ }
+
+ if (idx >= 0) {
+ *r_gizmo_handle = idx;
+ return true;
+ }
+ }
+
+ if (selectable_icon_size > 0.0f) {
+ Transform t = spatial_node->get_global_transform();
+ Vector3 camera_position = p_camera->get_camera_transform().origin;
+ if (camera_position.distance_squared_to(t.origin) > 0.01) {
+ t.set_look_at(t.origin, camera_position, Vector3(0, 1, 0));
+ }
+
+ float scale = t.origin.distance_to(p_camera->get_camera_transform().origin);
+
+ if (p_camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL) {
+ float aspect = p_camera->get_viewport()->get_visible_rect().size.aspect();
+ float size = p_camera->get_size();
+ scale = size / aspect;
+ }
+
+ Point2 center = p_camera->unproject_position(t.origin);
+
+ Transform orig_camera_transform = p_camera->get_camera_transform();
+
+ if (orig_camera_transform.origin.distance_squared_to(t.origin) > 0.01 &&
+ ABS(orig_camera_transform.basis.get_axis(Vector3::AXIS_Z).dot(Vector3(0, 1, 0))) < 0.99) {
+ p_camera->look_at(t.origin, Vector3(0, 1, 0));
+ }
+
+ Vector3 c0 = t.xform(Vector3(selectable_icon_size, selectable_icon_size, 0) * scale);
+ Vector3 c1 = t.xform(Vector3(-selectable_icon_size, -selectable_icon_size, 0) * scale);
+
+ Point2 p0 = p_camera->unproject_position(c0);
+ Point2 p1 = p_camera->unproject_position(c1);
+
+ p_camera->set_global_transform(orig_camera_transform);
+
+ Rect2 rect(p0, (p1 - p0).abs());
+
+ rect.set_position(center - rect.get_size() / 2.0);
+
+ if (rect.has_point(p_point)) {
+ r_pos = t.origin;
+ r_normal = -p_camera->project_ray_normal(p_point);
+ return true;
+ }
+
+ return false;
+ }
+
+ if (collision_segments.size()) {
+ Plane camp(p_camera->get_transform().origin, (-p_camera->get_transform().basis.get_axis(2)).normalized());
+
+ int vc = collision_segments.size();
+ const Vector3 *vptr = collision_segments.ptr();
+ Transform t = spatial_node->get_global_transform();
+ if (billboard_handle) {
+ t.set_look_at(t.origin, t.origin - p_camera->get_transform().basis.get_axis(2), p_camera->get_transform().basis.get_axis(1));
+ }
+
+ Vector3 cp;
+ float cpd = 1e20;
+
+ for (int i = 0; i < vc / 2; i++) {
+ Vector3 a = t.xform(vptr[i * 2 + 0]);
+ Vector3 b = t.xform(vptr[i * 2 + 1]);
+ Vector2 s[2];
+ s[0] = p_camera->unproject_position(a);
+ s[1] = p_camera->unproject_position(b);
+
+ Vector2 p = Geometry2D::get_closest_point_to_segment(p_point, s);
+
+ float pd = p.distance_to(p_point);
+
+ if (pd < cpd) {
+ float d = s[0].distance_to(s[1]);
+ Vector3 tcp;
+ if (d > 0) {
+ float d2 = s[0].distance_to(p) / d;
+ tcp = a + (b - a) * d2;
+
+ } else {
+ tcp = a;
+ }
+
+ if (camp.distance_to(tcp) < p_camera->get_znear()) {
+ continue;
+ }
+ cp = tcp;
+ cpd = pd;
+ }
+ }
+
+ if (cpd < 8) {
+ r_pos = cp;
+ r_normal = -p_camera->project_ray_normal(p_point);
+ return true;
+ }
+
+ return false;
+ }
+
+ if (collision_mesh.is_valid()) {
+ Transform gt = spatial_node->get_global_transform();
+
+ if (billboard_handle) {
+ gt.set_look_at(gt.origin, gt.origin - p_camera->get_transform().basis.get_axis(2), p_camera->get_transform().basis.get_axis(1));
+ }
+
+ Transform ai = gt.affine_inverse();
+ Vector3 ray_from = ai.xform(p_camera->project_ray_origin(p_point));
+ Vector3 ray_dir = ai.basis.xform(p_camera->project_ray_normal(p_point)).normalized();
+ Vector3 rpos, rnorm;
+
+ if (collision_mesh->intersect_ray(ray_from, ray_dir, rpos, rnorm)) {
+ r_pos = gt.xform(rpos);
+ r_normal = gt.basis.xform(rnorm).normalized();
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void EditorNode3DGizmo::create() {
+ ERR_FAIL_COND(!spatial_node);
+ ERR_FAIL_COND(valid);
+ valid = true;
+
+ for (int i = 0; i < instances.size(); i++) {
+ instances.write[i].create_instance(spatial_node, hidden);
+ }
+
+ transform();
+}
+
+void EditorNode3DGizmo::transform() {
+ ERR_FAIL_COND(!spatial_node);
+ ERR_FAIL_COND(!valid);
+ for (int i = 0; i < instances.size(); i++) {
+ RS::get_singleton()->instance_set_transform(instances[i].instance, spatial_node->get_global_transform());
+ }
+}
+
+void EditorNode3DGizmo::free() {
+ ERR_FAIL_COND(!spatial_node);
+ ERR_FAIL_COND(!valid);
+
+ for (int i = 0; i < instances.size(); i++) {
+ if (instances[i].instance.is_valid()) {
+ RS::get_singleton()->free(instances[i].instance);
+ }
+ instances.write[i].instance = RID();
+ }
+
+ clear();
+
+ valid = false;
+}
+
+void EditorNode3DGizmo::set_hidden(bool p_hidden) {
+ hidden = p_hidden;
+ int layer = hidden ? 0 : 1 << Node3DEditorViewport::GIZMO_EDIT_LAYER;
+ for (int i = 0; i < instances.size(); ++i) {
+ RS::get_singleton()->instance_set_layer_mask(instances[i].instance, layer);
+ }
+}
+
+void EditorNode3DGizmo::set_plugin(EditorNode3DGizmoPlugin *p_plugin) {
+ gizmo_plugin = p_plugin;
+}
+
+void EditorNode3DGizmo::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("add_lines", "lines", "material", "billboard", "modulate"), &EditorNode3DGizmo::add_lines, DEFVAL(false), DEFVAL(Color(1, 1, 1)));
+ ClassDB::bind_method(D_METHOD("add_mesh", "mesh", "billboard", "skeleton", "material"), &EditorNode3DGizmo::add_mesh, DEFVAL(false), DEFVAL(Ref<SkinReference>()), DEFVAL(Variant()));
+ ClassDB::bind_method(D_METHOD("add_collision_segments", "segments"), &EditorNode3DGizmo::add_collision_segments);
+ ClassDB::bind_method(D_METHOD("add_collision_triangles", "triangles"), &EditorNode3DGizmo::add_collision_triangles);
+ ClassDB::bind_method(D_METHOD("add_unscaled_billboard", "material", "default_scale", "modulate"), &EditorNode3DGizmo::add_unscaled_billboard, DEFVAL(1), DEFVAL(Color(1, 1, 1)));
+ ClassDB::bind_method(D_METHOD("add_handles", "handles", "material", "billboard", "secondary"), &EditorNode3DGizmo::add_handles, DEFVAL(false), DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("set_spatial_node", "node"), &EditorNode3DGizmo::_set_spatial_node);
+ ClassDB::bind_method(D_METHOD("get_spatial_node"), &EditorNode3DGizmo::get_spatial_node);
+ ClassDB::bind_method(D_METHOD("get_plugin"), &EditorNode3DGizmo::get_plugin);
+ ClassDB::bind_method(D_METHOD("clear"), &EditorNode3DGizmo::clear);
+ ClassDB::bind_method(D_METHOD("set_hidden", "hidden"), &EditorNode3DGizmo::set_hidden);
+
+ BIND_VMETHOD(MethodInfo("redraw"));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "get_handle_name", PropertyInfo(Variant::INT, "index")));
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_handle_highlighted", PropertyInfo(Variant::INT, "index")));
+
+ MethodInfo hvget(Variant::NIL, "get_handle_value", PropertyInfo(Variant::INT, "index"));
+ hvget.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+ BIND_VMETHOD(hvget);
+
+ BIND_VMETHOD(MethodInfo("set_handle", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera3D"), PropertyInfo(Variant::VECTOR2, "point")));
+ MethodInfo cm = MethodInfo("commit_handle", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "restore"), PropertyInfo(Variant::BOOL, "cancel"));
+ cm.default_arguments.push_back(false);
+ BIND_VMETHOD(cm);
+}
+
+EditorNode3DGizmo::EditorNode3DGizmo() {
+ valid = false;
+ billboard_handle = false;
+ hidden = false;
+ base = nullptr;
+ selected = false;
+ instanced = false;
+ spatial_node = nullptr;
+ gizmo_plugin = nullptr;
+ selectable_icon_size = -1.0f;
+}
+
+EditorNode3DGizmo::~EditorNode3DGizmo() {
+ if (gizmo_plugin != nullptr) {
+ gizmo_plugin->unregister_gizmo(this);
+ }
+ clear();
+}
+
+Vector3 EditorNode3DGizmo::get_handle_pos(int p_idx) const {
+ ERR_FAIL_INDEX_V(p_idx, handles.size(), Vector3());
+
+ return handles[p_idx];
+}
+
+//// light gizmo
+
+Light3DGizmoPlugin::Light3DGizmoPlugin() {
+ // Enable vertex colors for the materials below as the gizmo color depends on the light color.
+ create_material("lines_primary", Color(1, 1, 1), false, false, true);
+ create_material("lines_secondary", Color(1, 1, 1, 0.35), false, false, true);
+ create_material("lines_billboard", Color(1, 1, 1), true, false, true);
+
+ create_icon_material("light_directional_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoDirectionalLight", "EditorIcons"));
+ create_icon_material("light_omni_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoLight", "EditorIcons"));
+ create_icon_material("light_spot_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoSpotLight", "EditorIcons"));
+
+ create_handle_material("handles");
+ create_handle_material("handles_billboard", true);
+}
+
+bool Light3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<Light3D>(p_spatial) != nullptr;
+}
+
+String Light3DGizmoPlugin::get_name() const {
+ return "Light3D";
+}
+
+int Light3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String Light3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ if (p_idx == 0) {
+ return "Radius";
+ } else {
+ return "Aperture";
+ }
+}
+
+Variant Light3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node());
+ if (p_idx == 0) {
+ return light->get_param(Light3D::PARAM_RANGE);
+ }
+ if (p_idx == 1) {
+ return light->get_param(Light3D::PARAM_SPOT_ANGLE);
+ }
+
+ return Variant();
+}
+
+static float _find_closest_angle_to_half_pi_arc(const Vector3 &p_from, const Vector3 &p_to, float p_arc_radius, const Transform &p_arc_xform) {
+ //bleh, discrete is simpler
+ static const int arc_test_points = 64;
+ float min_d = 1e20;
+ Vector3 min_p;
+
+ for (int i = 0; i < arc_test_points; i++) {
+ float a = i * Math_PI * 0.5 / arc_test_points;
+ float an = (i + 1) * Math_PI * 0.5 / arc_test_points;
+ Vector3 p = Vector3(Math::cos(a), 0, -Math::sin(a)) * p_arc_radius;
+ Vector3 n = Vector3(Math::cos(an), 0, -Math::sin(an)) * p_arc_radius;
+
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(p, n, p_from, p_to, ra, rb);
+
+ float d = ra.distance_to(rb);
+ if (d < min_d) {
+ min_d = d;
+ min_p = ra;
+ }
+ }
+
+ //min_p = p_arc_xform.affine_inverse().xform(min_p);
+ float a = (Math_PI * 0.5) - Vector2(min_p.x, -min_p.z).angle();
+ return a * 180.0 / Math_PI;
+}
+
+void Light3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node());
+ Transform gt = light->get_global_transform();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 s[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
+ if (p_idx == 0) {
+ if (Object::cast_to<SpotLight3D>(light)) {
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), Vector3(0, 0, -4096), s[0], s[1], ra, rb);
+
+ float d = -ra.z;
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d <= 0) { // Equal is here for negative zero.
+ d = 0;
+ }
+
+ light->set_param(Light3D::PARAM_RANGE, d);
+ } else if (Object::cast_to<OmniLight3D>(light)) {
+ Plane cp = Plane(gt.origin, p_camera->get_transform().basis.get_axis(2));
+
+ Vector3 inters;
+ if (cp.intersects_ray(ray_from, ray_dir, &inters)) {
+ float r = inters.distance_to(gt.origin);
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ r = Math::stepify(r, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ light->set_param(Light3D::PARAM_RANGE, r);
+ }
+ }
+
+ } else if (p_idx == 1) {
+ float a = _find_closest_angle_to_half_pi_arc(s[0], s[1], light->get_param(Light3D::PARAM_RANGE), gt);
+ light->set_param(Light3D::PARAM_SPOT_ANGLE, CLAMP(a, 0.01, 89.99));
+ }
+}
+
+void Light3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node());
+ if (p_cancel) {
+ light->set_param(p_idx == 0 ? Light3D::PARAM_RANGE : Light3D::PARAM_SPOT_ANGLE, p_restore);
+
+ } else if (p_idx == 0) {
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Light Radius"));
+ ur->add_do_method(light, "set_param", Light3D::PARAM_RANGE, light->get_param(Light3D::PARAM_RANGE));
+ ur->add_undo_method(light, "set_param", Light3D::PARAM_RANGE, p_restore);
+ ur->commit_action();
+ } else if (p_idx == 1) {
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Light Radius"));
+ ur->add_do_method(light, "set_param", Light3D::PARAM_SPOT_ANGLE, light->get_param(Light3D::PARAM_SPOT_ANGLE));
+ ur->add_undo_method(light, "set_param", Light3D::PARAM_SPOT_ANGLE, p_restore);
+ ur->commit_action();
+ }
+}
+
+void Light3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node());
+
+ Color color = light->get_color();
+ // Make the gizmo color as bright as possible for better visibility
+ color.set_hsv(color.get_h(), color.get_s(), 1);
+
+ p_gizmo->clear();
+
+ if (Object::cast_to<DirectionalLight3D>(light)) {
+ Ref<Material> material = get_material("lines_primary", p_gizmo);
+ Ref<Material> icon = get_material("light_directional_icon", p_gizmo);
+
+ const int arrow_points = 7;
+ const float arrow_length = 1.5;
+
+ Vector3 arrow[arrow_points] = {
+ Vector3(0, 0, -1),
+ Vector3(0, 0.8, 0),
+ Vector3(0, 0.3, 0),
+ Vector3(0, 0.3, arrow_length),
+ Vector3(0, -0.3, arrow_length),
+ Vector3(0, -0.3, 0),
+ Vector3(0, -0.8, 0)
+ };
+
+ int arrow_sides = 2;
+
+ Vector<Vector3> lines;
+
+ for (int i = 0; i < arrow_sides; i++) {
+ for (int j = 0; j < arrow_points; j++) {
+ Basis ma(Vector3(0, 0, 1), Math_PI * i / arrow_sides);
+
+ Vector3 v1 = arrow[j] - Vector3(0, 0, arrow_length);
+ Vector3 v2 = arrow[(j + 1) % arrow_points] - Vector3(0, 0, arrow_length);
+
+ lines.push_back(ma.xform(v1));
+ lines.push_back(ma.xform(v2));
+ }
+ }
+
+ p_gizmo->add_lines(lines, material, false, color);
+ p_gizmo->add_unscaled_billboard(icon, 0.05, color);
+ }
+
+ if (Object::cast_to<OmniLight3D>(light)) {
+ // Use both a billboard circle and 3 non-billboard circles for a better sphere-like representation
+ const Ref<Material> lines_material = get_material("lines_secondary", p_gizmo);
+ const Ref<Material> lines_billboard_material = get_material("lines_billboard", p_gizmo);
+ const Ref<Material> icon = get_material("light_omni_icon", p_gizmo);
+
+ OmniLight3D *on = Object::cast_to<OmniLight3D>(light);
+ const float r = on->get_param(Light3D::PARAM_RANGE);
+ Vector<Vector3> points;
+ Vector<Vector3> points_billboard;
+
+ for (int i = 0; i < 120; i++) {
+ // Create a circle
+ const float ra = Math::deg2rad((float)(i * 3));
+ const float rb = Math::deg2rad((float)((i + 1) * 3));
+ const Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
+ const Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
+
+ // Draw axis-aligned circles
+ points.push_back(Vector3(a.x, 0, a.y));
+ points.push_back(Vector3(b.x, 0, b.y));
+ points.push_back(Vector3(0, a.x, a.y));
+ points.push_back(Vector3(0, b.x, b.y));
+ points.push_back(Vector3(a.x, a.y, 0));
+ points.push_back(Vector3(b.x, b.y, 0));
+
+ // Draw a billboarded circle
+ points_billboard.push_back(Vector3(a.x, a.y, 0));
+ points_billboard.push_back(Vector3(b.x, b.y, 0));
+ }
+
+ p_gizmo->add_lines(points, lines_material, true, color);
+ p_gizmo->add_lines(points_billboard, lines_billboard_material, true, color);
+ p_gizmo->add_unscaled_billboard(icon, 0.05, color);
+
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(r, 0, 0));
+ p_gizmo->add_handles(handles, get_material("handles_billboard"), true);
+ }
+
+ if (Object::cast_to<SpotLight3D>(light)) {
+ const Ref<Material> material_primary = get_material("lines_primary", p_gizmo);
+ const Ref<Material> material_secondary = get_material("lines_secondary", p_gizmo);
+ const Ref<Material> icon = get_material("light_spot_icon", p_gizmo);
+
+ Vector<Vector3> points_primary;
+ Vector<Vector3> points_secondary;
+ SpotLight3D *sl = Object::cast_to<SpotLight3D>(light);
+
+ float r = sl->get_param(Light3D::PARAM_RANGE);
+ float w = r * Math::sin(Math::deg2rad(sl->get_param(Light3D::PARAM_SPOT_ANGLE)));
+ float d = r * Math::cos(Math::deg2rad(sl->get_param(Light3D::PARAM_SPOT_ANGLE)));
+
+ for (int i = 0; i < 120; i++) {
+ // Draw a circle
+ const float ra = Math::deg2rad((float)(i * 3));
+ const float rb = Math::deg2rad((float)((i + 1) * 3));
+ const Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
+ const Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * w;
+
+ points_primary.push_back(Vector3(a.x, a.y, -d));
+ points_primary.push_back(Vector3(b.x, b.y, -d));
+
+ if (i % 15 == 0) {
+ // Draw 8 lines from the cone origin to the sides of the circle
+ points_secondary.push_back(Vector3(a.x, a.y, -d));
+ points_secondary.push_back(Vector3());
+ }
+ }
+
+ points_primary.push_back(Vector3(0, 0, -r));
+ points_primary.push_back(Vector3());
+
+ p_gizmo->add_lines(points_primary, material_primary, false, color);
+ p_gizmo->add_lines(points_secondary, material_secondary, false, color);
+
+ const float ra = 16 * Math_PI * 2.0 / 64.0;
+ const Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
+
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(0, 0, -r));
+ handles.push_back(Vector3(a.x, a.y, -d));
+
+ p_gizmo->add_handles(handles, get_material("handles"));
+ p_gizmo->add_unscaled_billboard(icon, 0.05, color);
+ }
+}
+
+//////
+
+//// player gizmo
+AudioStreamPlayer3DGizmoPlugin::AudioStreamPlayer3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/stream_player_3d", Color(0.4, 0.8, 1));
+
+ create_icon_material("stream_player_3d_icon", Node3DEditor::get_singleton()->get_theme_icon("Gizmo3DSamplePlayer", "EditorIcons"));
+ create_material("stream_player_3d_material_primary", gizmo_color);
+ create_material("stream_player_3d_material_secondary", gizmo_color * Color(1, 1, 1, 0.35));
+ create_handle_material("handles");
+}
+
+bool AudioStreamPlayer3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<AudioStreamPlayer3D>(p_spatial) != nullptr;
+}
+
+String AudioStreamPlayer3DGizmoPlugin::get_name() const {
+ return "AudioStreamPlayer3D";
+}
+
+int AudioStreamPlayer3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String AudioStreamPlayer3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ return "Emission Radius";
+}
+
+Variant AudioStreamPlayer3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
+ return player->get_emission_angle();
+}
+
+void AudioStreamPlayer3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
+
+ Transform gt = player->get_global_transform();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+ Vector3 ray_to = ray_from + ray_dir * 4096;
+
+ ray_from = gi.xform(ray_from);
+ ray_to = gi.xform(ray_to);
+
+ float closest_dist = 1e20;
+ float closest_angle = 1e20;
+
+ for (int i = 0; i < 180; i++) {
+ float a = i * Math_PI / 180.0;
+ float an = (i + 1) * Math_PI / 180.0;
+
+ Vector3 from(Math::sin(a), 0, -Math::cos(a));
+ Vector3 to(Math::sin(an), 0, -Math::cos(an));
+
+ Vector3 r1, r2;
+ Geometry3D::get_closest_points_between_segments(from, to, ray_from, ray_to, r1, r2);
+ float d = r1.distance_to(r2);
+ if (d < closest_dist) {
+ closest_dist = d;
+ closest_angle = i;
+ }
+ }
+
+ if (closest_angle < 91) {
+ player->set_emission_angle(closest_angle);
+ }
+}
+
+void AudioStreamPlayer3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
+
+ if (p_cancel) {
+ player->set_emission_angle(p_restore);
+
+ } else {
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change AudioStreamPlayer3D Emission Angle"));
+ ur->add_do_method(player, "set_emission_angle", player->get_emission_angle());
+ ur->add_undo_method(player, "set_emission_angle", p_restore);
+ ur->commit_action();
+ }
+}
+
+void AudioStreamPlayer3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ const AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ const Ref<Material> icon = get_material("stream_player_3d_icon", p_gizmo);
+
+ if (player->is_emission_angle_enabled()) {
+ const float pc = player->get_emission_angle();
+ const float ofs = -Math::cos(Math::deg2rad(pc));
+ const float radius = Math::sin(Math::deg2rad(pc));
+
+ Vector<Vector3> points_primary;
+ points_primary.resize(200);
+
+ for (int i = 0; i < 100; i++) {
+ const float a = i * 2.0 * Math_PI / 100.0;
+ const float an = (i + 1) * 2.0 * Math_PI / 100.0;
+
+ const Vector3 from(Math::sin(a) * radius, Math::cos(a) * radius, ofs);
+ const Vector3 to(Math::sin(an) * radius, Math::cos(an) * radius, ofs);
+
+ points_primary.write[i * 2 + 0] = from;
+ points_primary.write[i * 2 + 1] = to;
+ }
+
+ const Ref<Material> material_primary = get_material("stream_player_3d_material_primary", p_gizmo);
+ p_gizmo->add_lines(points_primary, material_primary);
+
+ Vector<Vector3> points_secondary;
+ points_secondary.resize(16);
+
+ for (int i = 0; i < 8; i++) {
+ const float a = i * 2.0 * Math_PI / 8.0;
+ const Vector3 from(Math::sin(a) * radius, Math::cos(a) * radius, ofs);
+
+ points_secondary.write[i * 2 + 0] = from;
+ points_secondary.write[i * 2 + 1] = Vector3();
+ }
+
+ const Ref<Material> material_secondary = get_material("stream_player_3d_material_secondary", p_gizmo);
+ p_gizmo->add_lines(points_secondary, material_secondary);
+
+ Vector<Vector3> handles;
+ const float ha = Math::deg2rad(player->get_emission_angle());
+ handles.push_back(Vector3(Math::sin(ha), 0, -Math::cos(ha)));
+ p_gizmo->add_handles(handles, get_material("handles"));
+ }
+
+ p_gizmo->add_unscaled_billboard(icon, 0.05);
+}
+
+//////
+
+Camera3DGizmoPlugin::Camera3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/camera", Color(0.8, 0.4, 0.8));
+
+ create_material("camera_material", gizmo_color);
+ create_handle_material("handles");
+}
+
+bool Camera3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<Camera3D>(p_spatial) != nullptr;
+}
+
+String Camera3DGizmoPlugin::get_name() const {
+ return "Camera3D";
+}
+
+int Camera3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String Camera3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node());
+
+ if (camera->get_projection() == Camera3D::PROJECTION_PERSPECTIVE) {
+ return "FOV";
+ } else {
+ return "Size";
+ }
+}
+
+Variant Camera3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node());
+
+ if (camera->get_projection() == Camera3D::PROJECTION_PERSPECTIVE) {
+ return camera->get_fov();
+ } else {
+ return camera->get_size();
+ }
+}
+
+void Camera3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node());
+
+ Transform gt = camera->get_global_transform();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 s[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
+
+ if (camera->get_projection() == Camera3D::PROJECTION_PERSPECTIVE) {
+ Transform gt2 = camera->get_global_transform();
+ float a = _find_closest_angle_to_half_pi_arc(s[0], s[1], 1.0, gt2);
+ camera->set("fov", CLAMP(a * 2.0, 1, 179));
+ } else {
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(0, 0, -1), Vector3(4096, 0, -1), s[0], s[1], ra, rb);
+ float d = ra.x * 2.0;
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ d = CLAMP(d, 0.1, 16384);
+
+ camera->set("size", d);
+ }
+}
+
+void Camera3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node());
+
+ if (camera->get_projection() == Camera3D::PROJECTION_PERSPECTIVE) {
+ if (p_cancel) {
+ camera->set("fov", p_restore);
+ } else {
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Camera FOV"));
+ ur->add_do_property(camera, "fov", camera->get_fov());
+ ur->add_undo_property(camera, "fov", p_restore);
+ ur->commit_action();
+ }
+
+ } else {
+ if (p_cancel) {
+ camera->set("size", p_restore);
+ } else {
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Camera Size"));
+ ur->add_do_property(camera, "size", camera->get_size());
+ ur->add_undo_property(camera, "size", p_restore);
+ ur->commit_action();
+ }
+ }
+}
+
+void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+ Vector<Vector3> handles;
+
+ Ref<Material> material = get_material("camera_material", p_gizmo);
+
+#define ADD_TRIANGLE(m_a, m_b, m_c) \
+ { \
+ lines.push_back(m_a); \
+ lines.push_back(m_b); \
+ lines.push_back(m_b); \
+ lines.push_back(m_c); \
+ lines.push_back(m_c); \
+ lines.push_back(m_a); \
+ }
+
+#define ADD_QUAD(m_a, m_b, m_c, m_d) \
+ { \
+ lines.push_back(m_a); \
+ lines.push_back(m_b); \
+ lines.push_back(m_b); \
+ lines.push_back(m_c); \
+ lines.push_back(m_c); \
+ lines.push_back(m_d); \
+ lines.push_back(m_d); \
+ lines.push_back(m_a); \
+ }
+
+ switch (camera->get_projection()) {
+ case Camera3D::PROJECTION_PERSPECTIVE: {
+ // The real FOV is halved for accurate representation
+ float fov = camera->get_fov() / 2.0;
+
+ Vector3 side = Vector3(Math::sin(Math::deg2rad(fov)), 0, -Math::cos(Math::deg2rad(fov)));
+ Vector3 nside = side;
+ nside.x = -nside.x;
+ Vector3 up = Vector3(0, side.x, 0);
+
+ ADD_TRIANGLE(Vector3(), side + up, side - up);
+ ADD_TRIANGLE(Vector3(), nside + up, nside - up);
+ ADD_TRIANGLE(Vector3(), side + up, nside + up);
+ ADD_TRIANGLE(Vector3(), side - up, nside - up);
+
+ handles.push_back(side);
+ side.x *= 0.25;
+ nside.x *= 0.25;
+ Vector3 tup(0, up.y * 3 / 2, side.z);
+ ADD_TRIANGLE(tup, side + up, nside + up);
+
+ } break;
+ case Camera3D::PROJECTION_ORTHOGONAL: {
+ float size = camera->get_size();
+
+ float hsize = size * 0.5;
+ Vector3 right(hsize, 0, 0);
+ Vector3 up(0, hsize, 0);
+ Vector3 back(0, 0, -1.0);
+ Vector3 front(0, 0, 0);
+
+ ADD_QUAD(-up - right, -up + right, up + right, up - right);
+ ADD_QUAD(-up - right + back, -up + right + back, up + right + back, up - right + back);
+ ADD_QUAD(up + right, up + right + back, up - right + back, up - right);
+ ADD_QUAD(-up + right, -up + right + back, -up - right + back, -up - right);
+
+ handles.push_back(right + back);
+
+ right.x *= 0.25;
+ Vector3 tup(0, up.y * 3 / 2, back.z);
+ ADD_TRIANGLE(tup, right + up + back, -right + up + back);
+
+ } break;
+ case Camera3D::PROJECTION_FRUSTUM: {
+ float hsize = camera->get_size() / 2.0;
+
+ Vector3 side = Vector3(hsize, 0, -camera->get_znear()).normalized();
+ Vector3 nside = side;
+ nside.x = -nside.x;
+ Vector3 up = Vector3(0, side.x, 0);
+ Vector3 offset = Vector3(camera->get_frustum_offset().x, camera->get_frustum_offset().y, 0.0);
+
+ ADD_TRIANGLE(Vector3(), side + up + offset, side - up + offset);
+ ADD_TRIANGLE(Vector3(), nside + up + offset, nside - up + offset);
+ ADD_TRIANGLE(Vector3(), side + up + offset, nside + up + offset);
+ ADD_TRIANGLE(Vector3(), side - up + offset, nside - up + offset);
+
+ side.x *= 0.25;
+ nside.x *= 0.25;
+ Vector3 tup(0, up.y * 3 / 2, side.z);
+ ADD_TRIANGLE(tup + offset, side + up + offset, nside + up + offset);
+ }
+ }
+
+#undef ADD_TRIANGLE
+#undef ADD_QUAD
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_handles(handles, get_material("handles"));
+
+ ClippedCamera3D *clipcam = Object::cast_to<ClippedCamera3D>(camera);
+ if (clipcam) {
+ Node3D *parent = Object::cast_to<Node3D>(camera->get_parent());
+ if (!parent) {
+ return;
+ }
+ Vector3 cam_normal = -camera->get_global_transform().basis.get_axis(Vector3::AXIS_Z).normalized();
+ Vector3 cam_x = camera->get_global_transform().basis.get_axis(Vector3::AXIS_X).normalized();
+ Vector3 cam_y = camera->get_global_transform().basis.get_axis(Vector3::AXIS_Y).normalized();
+ Vector3 cam_pos = camera->get_global_transform().origin;
+ Vector3 parent_pos = parent->get_global_transform().origin;
+
+ Plane parent_plane(parent_pos, cam_normal);
+ Vector3 ray_from = parent_plane.project(cam_pos);
+
+ lines.clear();
+ lines.push_back(ray_from + cam_x * 0.5 + cam_y * 0.5);
+ lines.push_back(ray_from + cam_x * 0.5 + cam_y * -0.5);
+
+ lines.push_back(ray_from + cam_x * 0.5 + cam_y * -0.5);
+ lines.push_back(ray_from + cam_x * -0.5 + cam_y * -0.5);
+
+ lines.push_back(ray_from + cam_x * -0.5 + cam_y * -0.5);
+ lines.push_back(ray_from + cam_x * -0.5 + cam_y * 0.5);
+
+ lines.push_back(ray_from + cam_x * -0.5 + cam_y * 0.5);
+ lines.push_back(ray_from + cam_x * 0.5 + cam_y * 0.5);
+
+ if (parent_plane.distance_to(cam_pos) < 0) {
+ lines.push_back(ray_from);
+ lines.push_back(cam_pos);
+ }
+
+ Transform local = camera->get_global_transform().affine_inverse();
+ for (int i = 0; i < lines.size(); i++) {
+ lines.write[i] = local.xform(lines[i]);
+ }
+
+ p_gizmo->add_lines(lines, material);
+ }
+}
+
+//////
+
+MeshInstance3DGizmoPlugin::MeshInstance3DGizmoPlugin() {
+}
+
+bool MeshInstance3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<MeshInstance3D>(p_spatial) != nullptr && Object::cast_to<SoftBody3D>(p_spatial) == nullptr;
+}
+
+String MeshInstance3DGizmoPlugin::get_name() const {
+ return "MeshInstance3D";
+}
+
+int MeshInstance3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+bool MeshInstance3DGizmoPlugin::can_be_hidden() const {
+ return false;
+}
+
+void MeshInstance3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ MeshInstance3D *mesh = Object::cast_to<MeshInstance3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Ref<Mesh> m = mesh->get_mesh();
+
+ if (!m.is_valid()) {
+ return; //none
+ }
+
+ Ref<TriangleMesh> tm = m->generate_triangle_mesh();
+ if (tm.is_valid()) {
+ p_gizmo->add_collision_triangles(tm);
+ }
+}
+
+/////
+Sprite3DGizmoPlugin::Sprite3DGizmoPlugin() {
+}
+
+bool Sprite3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<Sprite3D>(p_spatial) != nullptr;
+}
+
+String Sprite3DGizmoPlugin::get_name() const {
+ return "Sprite3D";
+}
+
+int Sprite3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+bool Sprite3DGizmoPlugin::can_be_hidden() const {
+ return false;
+}
+
+void Sprite3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Sprite3D *sprite = Object::cast_to<Sprite3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Ref<TriangleMesh> tm = sprite->generate_triangle_mesh();
+ if (tm.is_valid()) {
+ p_gizmo->add_collision_triangles(tm);
+ }
+}
+
+///
+
+Position3DGizmoPlugin::Position3DGizmoPlugin() {
+ pos3d_mesh = Ref<ArrayMesh>(memnew(ArrayMesh));
+ cursor_points = Vector<Vector3>();
+
+ Vector<Color> cursor_colors;
+ float cs = 0.25;
+ cursor_points.push_back(Vector3(+cs, 0, 0));
+ cursor_points.push_back(Vector3(-cs, 0, 0));
+ cursor_points.push_back(Vector3(0, +cs, 0));
+ cursor_points.push_back(Vector3(0, -cs, 0));
+ cursor_points.push_back(Vector3(0, 0, +cs));
+ cursor_points.push_back(Vector3(0, 0, -cs));
+ cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_theme_color("axis_x_color", "Editor"));
+ cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_theme_color("axis_x_color", "Editor"));
+ cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_theme_color("axis_y_color", "Editor"));
+ cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_theme_color("axis_y_color", "Editor"));
+ cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_theme_color("axis_z_color", "Editor"));
+ cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_theme_color("axis_z_color", "Editor"));
+
+ Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D);
+ mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ mat->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ mat->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+
+ Array d;
+ d.resize(RS::ARRAY_MAX);
+ d[Mesh::ARRAY_VERTEX] = cursor_points;
+ d[Mesh::ARRAY_COLOR] = cursor_colors;
+ pos3d_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, d);
+ pos3d_mesh->surface_set_material(0, mat);
+}
+
+bool Position3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<Position3D>(p_spatial) != nullptr;
+}
+
+String Position3DGizmoPlugin::get_name() const {
+ return "Position3D";
+}
+
+int Position3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void Position3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ p_gizmo->clear();
+ p_gizmo->add_mesh(pos3d_mesh);
+ p_gizmo->add_collision_segments(cursor_points);
+}
+
+/////
+
+Skeleton3DGizmoPlugin::Skeleton3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/skeleton", Color(1, 0.8, 0.4));
+ create_material("skeleton_material", gizmo_color);
+}
+
+bool Skeleton3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<Skeleton3D>(p_spatial) != nullptr;
+}
+
+String Skeleton3DGizmoPlugin::get_name() const {
+ return "Skeleton3D";
+}
+
+int Skeleton3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void Skeleton3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Skeleton3D *skel = Object::cast_to<Skeleton3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Ref<Material> material = get_material("skeleton_material", p_gizmo);
+
+ Ref<SurfaceTool> surface_tool(memnew(SurfaceTool));
+
+ surface_tool->begin(Mesh::PRIMITIVE_LINES);
+ surface_tool->set_material(material);
+ Vector<Transform> grests;
+ grests.resize(skel->get_bone_count());
+
+ Vector<int> bones;
+ Vector<float> weights;
+ bones.resize(4);
+ weights.resize(4);
+
+ for (int i = 0; i < 4; i++) {
+ bones.write[i] = 0;
+ weights.write[i] = 0;
+ }
+
+ weights.write[0] = 1;
+
+ AABB aabb;
+
+ Color bonecolor = Color(1.0, 0.4, 0.4, 0.3);
+ Color rootcolor = Color(0.4, 1.0, 0.4, 0.1);
+
+ for (int i_bone = 0; i_bone < skel->get_bone_count(); i_bone++) {
+ int i = skel->get_process_order(i_bone);
+
+ int parent = skel->get_bone_parent(i);
+
+ if (parent >= 0) {
+ grests.write[i] = grests[parent] * skel->get_bone_rest(i);
+
+ Vector3 v0 = grests[parent].origin;
+ Vector3 v1 = grests[i].origin;
+ Vector3 d = (v1 - v0).normalized();
+ float dist = v0.distance_to(v1);
+
+ //find closest axis
+ int closest = -1;
+ float closest_d = 0.0;
+
+ for (int j = 0; j < 3; j++) {
+ float dp = Math::abs(grests[parent].basis[j].normalized().dot(d));
+ if (j == 0 || dp > closest_d) {
+ closest = j;
+ }
+ }
+
+ //find closest other
+ Vector3 first;
+ Vector3 points[4];
+ int pointidx = 0;
+ for (int j = 0; j < 3; j++) {
+ bones.write[0] = parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(rootcolor);
+ surface_tool->add_vertex(v0 - grests[parent].basis[j].normalized() * dist * 0.05);
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(rootcolor);
+ surface_tool->add_vertex(v0 + grests[parent].basis[j].normalized() * dist * 0.05);
+
+ if (j == closest) {
+ continue;
+ }
+
+ Vector3 axis;
+ if (first == Vector3()) {
+ axis = d.cross(d.cross(grests[parent].basis[j])).normalized();
+ first = axis;
+ } else {
+ axis = d.cross(first).normalized();
+ }
+
+ for (int k = 0; k < 2; k++) {
+ if (k == 1) {
+ axis = -axis;
+ }
+ Vector3 point = v0 + d * dist * 0.2;
+ point += axis * dist * 0.1;
+
+ bones.write[0] = parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(v0);
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(point);
+
+ bones.write[0] = parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(point);
+ bones.write[0] = i;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(v1);
+ points[pointidx++] = point;
+ }
+ }
+
+ SWAP(points[1], points[2]);
+ for (int j = 0; j < 4; j++) {
+ bones.write[0] = parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(points[j]);
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(bonecolor);
+ surface_tool->add_vertex(points[(j + 1) % 4]);
+ }
+
+ /*
+ bones[0]=parent;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(0.4,1,0.4,0.4));
+ surface_tool->add_vertex(v0);
+ bones[0]=i;
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(0.4,1,0.4,0.4));
+ surface_tool->add_vertex(v1);
+*/
+ } else {
+ grests.write[i] = skel->get_bone_rest(i);
+ bones.write[0] = i;
+ }
+ /*
+ Transform t = grests[i];
+ t.orthonormalize();
+
+ for (int i=0;i<6;i++) {
+
+
+ Vector3 face_points[4];
+
+ for (int j=0;j<4;j++) {
+
+ float v[3];
+ v[0]=1.0;
+ v[1]=1-2*((j>>1)&1);
+ v[2]=v[1]*(1-2*(j&1));
+
+ for (int k=0;k<3;k++) {
+
+ if (i<3)
+ face_points[j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ else
+ face_points[3-j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ }
+ }
+
+ for(int j=0;j<4;j++) {
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(1.0,0.4,0.4,0.4));
+ surface_tool->add_vertex(t.xform(face_points[j]*0.04));
+ surface_tool->add_bones(bones);
+ surface_tool->add_weights(weights);
+ surface_tool->add_color(Color(1.0,0.4,0.4,0.4));
+ surface_tool->add_vertex(t.xform(face_points[(j+1)%4]*0.04));
+ }
+
+ }
+ */
+ }
+
+ Ref<ArrayMesh> m = surface_tool->commit();
+ p_gizmo->add_mesh(m, false, skel->register_skin(Ref<Skin>()));
+}
+
+////
+
+PhysicalBone3DGizmoPlugin::PhysicalBone3DGizmoPlugin() {
+ create_material("joint_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1)));
+}
+
+bool PhysicalBone3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<PhysicalBone3D>(p_spatial) != nullptr;
+}
+
+String PhysicalBone3DGizmoPlugin::get_name() const {
+ return "PhysicalBone3D";
+}
+
+int PhysicalBone3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void PhysicalBone3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ p_gizmo->clear();
+
+ PhysicalBone3D *physical_bone = Object::cast_to<PhysicalBone3D>(p_gizmo->get_spatial_node());
+
+ if (!physical_bone) {
+ return;
+ }
+
+ Skeleton3D *sk(physical_bone->find_skeleton_parent());
+ if (!sk) {
+ return;
+ }
+
+ PhysicalBone3D *pb(sk->get_physical_bone(physical_bone->get_bone_id()));
+ if (!pb) {
+ return;
+ }
+
+ PhysicalBone3D *pbp(sk->get_physical_bone_parent(physical_bone->get_bone_id()));
+ if (!pbp) {
+ return;
+ }
+
+ Vector<Vector3> points;
+
+ switch (physical_bone->get_joint_type()) {
+ case PhysicalBone3D::JOINT_TYPE_PIN: {
+ Joint3DGizmoPlugin::CreatePinJointGizmo(physical_bone->get_joint_offset(), points);
+ } break;
+ case PhysicalBone3D::JOINT_TYPE_CONE: {
+ const PhysicalBone3D::ConeJointData *cjd(static_cast<const PhysicalBone3D::ConeJointData *>(physical_bone->get_joint_data()));
+ Joint3DGizmoPlugin::CreateConeTwistJointGizmo(
+ physical_bone->get_joint_offset(),
+ physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
+ pb->get_global_transform(),
+ pbp->get_global_transform(),
+ cjd->swing_span,
+ cjd->twist_span,
+ &points,
+ &points);
+ } break;
+ case PhysicalBone3D::JOINT_TYPE_HINGE: {
+ const PhysicalBone3D::HingeJointData *hjd(static_cast<const PhysicalBone3D::HingeJointData *>(physical_bone->get_joint_data()));
+ Joint3DGizmoPlugin::CreateHingeJointGizmo(
+ physical_bone->get_joint_offset(),
+ physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
+ pb->get_global_transform(),
+ pbp->get_global_transform(),
+ hjd->angular_limit_lower,
+ hjd->angular_limit_upper,
+ hjd->angular_limit_enabled,
+ points,
+ &points,
+ &points);
+ } break;
+ case PhysicalBone3D::JOINT_TYPE_SLIDER: {
+ const PhysicalBone3D::SliderJointData *sjd(static_cast<const PhysicalBone3D::SliderJointData *>(physical_bone->get_joint_data()));
+ Joint3DGizmoPlugin::CreateSliderJointGizmo(
+ physical_bone->get_joint_offset(),
+ physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
+ pb->get_global_transform(),
+ pbp->get_global_transform(),
+ sjd->angular_limit_lower,
+ sjd->angular_limit_upper,
+ sjd->linear_limit_lower,
+ sjd->linear_limit_upper,
+ points,
+ &points,
+ &points);
+ } break;
+ case PhysicalBone3D::JOINT_TYPE_6DOF: {
+ const PhysicalBone3D::SixDOFJointData *sdofjd(static_cast<const PhysicalBone3D::SixDOFJointData *>(physical_bone->get_joint_data()));
+ Joint3DGizmoPlugin::CreateGeneric6DOFJointGizmo(
+ physical_bone->get_joint_offset(),
+
+ physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
+ pb->get_global_transform(),
+ pbp->get_global_transform(),
+
+ sdofjd->axis_data[0].angular_limit_lower,
+ sdofjd->axis_data[0].angular_limit_upper,
+ sdofjd->axis_data[0].linear_limit_lower,
+ sdofjd->axis_data[0].linear_limit_upper,
+ sdofjd->axis_data[0].angular_limit_enabled,
+ sdofjd->axis_data[0].linear_limit_enabled,
+
+ sdofjd->axis_data[1].angular_limit_lower,
+ sdofjd->axis_data[1].angular_limit_upper,
+ sdofjd->axis_data[1].linear_limit_lower,
+ sdofjd->axis_data[1].linear_limit_upper,
+ sdofjd->axis_data[1].angular_limit_enabled,
+ sdofjd->axis_data[1].linear_limit_enabled,
+
+ sdofjd->axis_data[2].angular_limit_lower,
+ sdofjd->axis_data[2].angular_limit_upper,
+ sdofjd->axis_data[2].linear_limit_lower,
+ sdofjd->axis_data[2].linear_limit_upper,
+ sdofjd->axis_data[2].angular_limit_enabled,
+ sdofjd->axis_data[2].linear_limit_enabled,
+
+ points,
+ &points,
+ &points);
+ } break;
+ default:
+ return;
+ }
+
+ Ref<Material> material = get_material("joint_material", p_gizmo);
+
+ p_gizmo->add_collision_segments(points);
+ p_gizmo->add_lines(points, material);
+}
+
+/////
+
+RayCast3DGizmoPlugin::RayCast3DGizmoPlugin() {
+ const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ create_material("shape_material", gizmo_color);
+ const float gizmo_value = gizmo_color.get_v();
+ const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
+ create_material("shape_material_disabled", gizmo_color_disabled);
+}
+
+bool RayCast3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<RayCast3D>(p_spatial) != nullptr;
+}
+
+String RayCast3DGizmoPlugin::get_name() const {
+ return "RayCast3D";
+}
+
+int RayCast3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void RayCast3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ RayCast3D *raycast = Object::cast_to<RayCast3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+
+ lines.push_back(Vector3());
+ lines.push_back(raycast->get_target_position());
+
+ const Ref<StandardMaterial3D> material =
+ get_material(raycast->is_enabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_collision_segments(lines);
+}
+
+/////
+
+void SpringArm3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ SpringArm3D *spring_arm = Object::cast_to<SpringArm3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+
+ lines.push_back(Vector3());
+ lines.push_back(Vector3(0, 0, 1.0) * spring_arm->get_length());
+
+ Ref<StandardMaterial3D> material = get_material("shape_material", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_collision_segments(lines);
+}
+
+SpringArm3DGizmoPlugin::SpringArm3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ create_material("shape_material", gizmo_color);
+}
+
+bool SpringArm3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<SpringArm3D>(p_spatial) != nullptr;
+}
+
+String SpringArm3DGizmoPlugin::get_name() const {
+ return "SpringArm3D";
+}
+
+int SpringArm3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+/////
+
+VehicleWheel3DGizmoPlugin::VehicleWheel3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ create_material("shape_material", gizmo_color);
+}
+
+bool VehicleWheel3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<VehicleWheel3D>(p_spatial) != nullptr;
+}
+
+String VehicleWheel3DGizmoPlugin::get_name() const {
+ return "VehicleWheel3D";
+}
+
+int VehicleWheel3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void VehicleWheel3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ VehicleWheel3D *car_wheel = Object::cast_to<VehicleWheel3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> points;
+
+ float r = car_wheel->get_radius();
+ const int skip = 10;
+ for (int i = 0; i <= 360; i += skip) {
+ float ra = Math::deg2rad((float)i);
+ float rb = Math::deg2rad((float)i + skip);
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
+
+ points.push_back(Vector3(0, a.x, a.y));
+ points.push_back(Vector3(0, b.x, b.y));
+
+ const int springsec = 4;
+
+ for (int j = 0; j < springsec; j++) {
+ float t = car_wheel->get_suspension_rest_length() * 5;
+ points.push_back(Vector3(a.x, i / 360.0 * t / springsec + j * (t / springsec), a.y) * 0.2);
+ points.push_back(Vector3(b.x, (i + skip) / 360.0 * t / springsec + j * (t / springsec), b.y) * 0.2);
+ }
+ }
+
+ //travel
+ points.push_back(Vector3(0, 0, 0));
+ points.push_back(Vector3(0, car_wheel->get_suspension_rest_length(), 0));
+
+ //axis
+ points.push_back(Vector3(r * 0.2, car_wheel->get_suspension_rest_length(), 0));
+ points.push_back(Vector3(-r * 0.2, car_wheel->get_suspension_rest_length(), 0));
+ //axis
+ points.push_back(Vector3(r * 0.2, 0, 0));
+ points.push_back(Vector3(-r * 0.2, 0, 0));
+
+ //forward line
+ points.push_back(Vector3(0, -r, 0));
+ points.push_back(Vector3(0, -r, r * 2));
+ points.push_back(Vector3(0, -r, r * 2));
+ points.push_back(Vector3(r * 2 * 0.2, -r, r * 2 * 0.8));
+ points.push_back(Vector3(0, -r, r * 2));
+ points.push_back(Vector3(-r * 2 * 0.2, -r, r * 2 * 0.8));
+
+ Ref<Material> material = get_material("shape_material", p_gizmo);
+
+ p_gizmo->add_lines(points, material);
+ p_gizmo->add_collision_segments(points);
+}
+
+///////////
+
+SoftBody3DGizmoPlugin::SoftBody3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ create_material("shape_material", gizmo_color);
+ create_handle_material("handles");
+}
+
+bool SoftBody3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<SoftBody3D>(p_spatial) != nullptr;
+}
+
+String SoftBody3DGizmoPlugin::get_name() const {
+ return "SoftBody3D";
+}
+
+int SoftBody3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+bool SoftBody3DGizmoPlugin::is_selectable_when_hidden() const {
+ return true;
+}
+
+void SoftBody3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ if (!soft_body || soft_body->get_mesh().is_null()) {
+ return;
+ }
+
+ // find mesh
+
+ Vector<Vector3> lines;
+
+ soft_body->get_mesh()->generate_debug_mesh_lines(lines);
+
+ if (!lines.size()) {
+ return;
+ }
+
+ Ref<TriangleMesh> tm = soft_body->get_mesh()->generate_triangle_mesh();
+
+ Vector<Vector3> points;
+ soft_body->get_mesh()->generate_debug_mesh_indices(points);
+
+ Ref<Material> material = get_material("shape_material", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_handles(points, get_material("handles"));
+ p_gizmo->add_collision_triangles(tm);
+}
+
+String SoftBody3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ return "SoftBody3D pin point";
+}
+
+Variant SoftBody3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node());
+ return Variant(soft_body->is_point_pinned(p_idx));
+}
+
+void SoftBody3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node());
+ soft_body->pin_point_toggle(p_idx);
+}
+
+bool SoftBody3DGizmoPlugin::is_handle_highlighted(const EditorNode3DGizmo *p_gizmo, int idx) const {
+ SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node());
+ return soft_body->is_point_pinned(idx);
+}
+
+///////////
+
+VisibilityNotifier3DGizmoPlugin::VisibilityNotifier3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/visibility_notifier", Color(0.8, 0.5, 0.7));
+ create_material("visibility_notifier_material", gizmo_color);
+ gizmo_color.a = 0.1;
+ create_material("visibility_notifier_solid_material", gizmo_color);
+ create_handle_material("handles");
+}
+
+bool VisibilityNotifier3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<VisibilityNotifier3D>(p_spatial) != nullptr;
+}
+
+String VisibilityNotifier3DGizmoPlugin::get_name() const {
+ return "VisibilityNotifier3D";
+}
+
+int VisibilityNotifier3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String VisibilityNotifier3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ switch (p_idx) {
+ case 0:
+ return "Size X";
+ case 1:
+ return "Size Y";
+ case 2:
+ return "Size Z";
+ case 3:
+ return "Pos X";
+ case 4:
+ return "Pos Y";
+ case 5:
+ return "Pos Z";
+ }
+
+ return "";
+}
+
+Variant VisibilityNotifier3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node());
+ return notifier->get_aabb();
+}
+
+void VisibilityNotifier3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node());
+
+ Transform gt = notifier->get_global_transform();
+
+ Transform gi = gt.affine_inverse();
+
+ bool move = p_idx >= 3;
+ p_idx = p_idx % 3;
+
+ AABB aabb = notifier->get_aabb();
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
+
+ Vector3 ofs = aabb.position + aabb.size * 0.5;
+
+ Vector3 axis;
+ axis[p_idx] = 1.0;
+
+ if (move) {
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(ofs - axis * 4096, ofs + axis * 4096, sg[0], sg[1], ra, rb);
+
+ float d = ra[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ aabb.position[p_idx] = d - 1.0 - aabb.size[p_idx] * 0.5;
+ notifier->set_aabb(aabb);
+
+ } else {
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(ofs, ofs + axis * 4096, sg[0], sg[1], ra, rb);
+
+ float d = ra[p_idx] - ofs[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+ //resize
+ aabb.position[p_idx] = (aabb.position[p_idx] + aabb.size[p_idx] * 0.5) - d;
+ aabb.size[p_idx] = d * 2;
+ notifier->set_aabb(aabb);
+ }
+}
+
+void VisibilityNotifier3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node());
+
+ if (p_cancel) {
+ notifier->set_aabb(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Notifier AABB"));
+ ur->add_do_method(notifier, "set_aabb", notifier->get_aabb());
+ ur->add_undo_method(notifier, "set_aabb", p_restore);
+ ur->commit_action();
+}
+
+void VisibilityNotifier3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+ AABB aabb = notifier->get_aabb();
+
+ for (int i = 0; i < 12; i++) {
+ Vector3 a, b;
+ aabb.get_edge(i, a, b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ Vector<Vector3> handles;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = aabb.position[i] + aabb.size[i];
+ ax[(i + 1) % 3] = aabb.position[(i + 1) % 3] + aabb.size[(i + 1) % 3] * 0.5;
+ ax[(i + 2) % 3] = aabb.position[(i + 2) % 3] + aabb.size[(i + 2) % 3] * 0.5;
+ handles.push_back(ax);
+ }
+
+ Vector3 center = aabb.position + aabb.size * 0.5;
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = 1.0;
+ handles.push_back(center + ax);
+ lines.push_back(center);
+ lines.push_back(center + ax);
+ }
+
+ Ref<Material> material = get_material("visibility_notifier_material", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_collision_segments(lines);
+
+ if (p_gizmo->is_selected()) {
+ Ref<Material> solid_material = get_material("visibility_notifier_solid_material", p_gizmo);
+ p_gizmo->add_solid_box(solid_material, aabb.get_size(), aabb.get_position() + aabb.get_size() / 2.0);
+ }
+
+ p_gizmo->add_handles(handles, get_material("handles"));
+}
+
+////
+
+CPUParticles3DGizmoPlugin::CPUParticles3DGizmoPlugin() {
+ create_icon_material("particles_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoCPUParticles3D", "EditorIcons"));
+}
+
+bool CPUParticles3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<CPUParticles3D>(p_spatial) != nullptr;
+}
+
+String CPUParticles3DGizmoPlugin::get_name() const {
+ return "CPUParticles3D";
+}
+
+int CPUParticles3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+bool CPUParticles3DGizmoPlugin::is_selectable_when_hidden() const {
+ return true;
+}
+
+void CPUParticles3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Ref<Material> icon = get_material("particles_icon", p_gizmo);
+ p_gizmo->add_unscaled_billboard(icon, 0.05);
+}
+
+////
+
+GPUParticles3DGizmoPlugin::GPUParticles3DGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/particles", Color(0.8, 0.7, 0.4));
+ create_material("particles_material", gizmo_color);
+ gizmo_color.a = 0.1;
+ create_material("particles_solid_material", gizmo_color);
+ create_icon_material("particles_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoGPUParticles3D", "EditorIcons"));
+ create_handle_material("handles");
+}
+
+bool GPUParticles3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<GPUParticles3D>(p_spatial) != nullptr;
+}
+
+String GPUParticles3DGizmoPlugin::get_name() const {
+ return "GPUParticles3D";
+}
+
+int GPUParticles3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+bool GPUParticles3DGizmoPlugin::is_selectable_when_hidden() const {
+ return true;
+}
+
+String GPUParticles3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ switch (p_idx) {
+ case 0:
+ return "Size X";
+ case 1:
+ return "Size Y";
+ case 2:
+ return "Size Z";
+ case 3:
+ return "Pos X";
+ case 4:
+ return "Pos Y";
+ case 5:
+ return "Pos Z";
+ }
+
+ return "";
+}
+
+Variant GPUParticles3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ GPUParticles3D *particles = Object::cast_to<GPUParticles3D>(p_gizmo->get_spatial_node());
+ return particles->get_visibility_aabb();
+}
+
+void GPUParticles3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ GPUParticles3D *particles = Object::cast_to<GPUParticles3D>(p_gizmo->get_spatial_node());
+
+ Transform gt = particles->get_global_transform();
+ Transform gi = gt.affine_inverse();
+
+ bool move = p_idx >= 3;
+ p_idx = p_idx % 3;
+
+ AABB aabb = particles->get_visibility_aabb();
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
+
+ Vector3 ofs = aabb.position + aabb.size * 0.5;
+
+ Vector3 axis;
+ axis[p_idx] = 1.0;
+
+ if (move) {
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(ofs - axis * 4096, ofs + axis * 4096, sg[0], sg[1], ra, rb);
+
+ float d = ra[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ aabb.position[p_idx] = d - 1.0 - aabb.size[p_idx] * 0.5;
+ particles->set_visibility_aabb(aabb);
+
+ } else {
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(ofs, ofs + axis * 4096, sg[0], sg[1], ra, rb);
+
+ float d = ra[p_idx] - ofs[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+ //resize
+ aabb.position[p_idx] = (aabb.position[p_idx] + aabb.size[p_idx] * 0.5) - d;
+ aabb.size[p_idx] = d * 2;
+ particles->set_visibility_aabb(aabb);
+ }
+}
+
+void GPUParticles3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ GPUParticles3D *particles = Object::cast_to<GPUParticles3D>(p_gizmo->get_spatial_node());
+
+ if (p_cancel) {
+ particles->set_visibility_aabb(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Particles AABB"));
+ ur->add_do_method(particles, "set_visibility_aabb", particles->get_visibility_aabb());
+ ur->add_undo_method(particles, "set_visibility_aabb", p_restore);
+ ur->commit_action();
+}
+
+void GPUParticles3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ GPUParticles3D *particles = Object::cast_to<GPUParticles3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+ AABB aabb = particles->get_visibility_aabb();
+
+ for (int i = 0; i < 12; i++) {
+ Vector3 a, b;
+ aabb.get_edge(i, a, b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ Vector<Vector3> handles;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = aabb.position[i] + aabb.size[i];
+ ax[(i + 1) % 3] = aabb.position[(i + 1) % 3] + aabb.size[(i + 1) % 3] * 0.5;
+ ax[(i + 2) % 3] = aabb.position[(i + 2) % 3] + aabb.size[(i + 2) % 3] * 0.5;
+ handles.push_back(ax);
+ }
+
+ Vector3 center = aabb.position + aabb.size * 0.5;
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = 1.0;
+ handles.push_back(center + ax);
+ lines.push_back(center);
+ lines.push_back(center + ax);
+ }
+
+ Ref<Material> material = get_material("particles_material", p_gizmo);
+ Ref<Material> icon = get_material("particles_icon", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+
+ if (p_gizmo->is_selected()) {
+ Ref<Material> solid_material = get_material("particles_solid_material", p_gizmo);
+ p_gizmo->add_solid_box(solid_material, aabb.get_size(), aabb.get_position() + aabb.get_size() / 2.0);
+ }
+
+ p_gizmo->add_handles(handles, get_material("handles"));
+ p_gizmo->add_unscaled_billboard(icon, 0.05);
+}
+
+////
+
+ReflectionProbeGizmoPlugin::ReflectionProbeGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/reflection_probe", Color(0.6, 1, 0.5));
+
+ create_material("reflection_probe_material", gizmo_color);
+
+ gizmo_color.a = 0.5;
+ create_material("reflection_internal_material", gizmo_color);
+
+ gizmo_color.a = 0.1;
+ create_material("reflection_probe_solid_material", gizmo_color);
+
+ create_icon_material("reflection_probe_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoReflectionProbe", "EditorIcons"));
+ create_handle_material("handles");
+}
+
+bool ReflectionProbeGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<ReflectionProbe>(p_spatial) != nullptr;
+}
+
+String ReflectionProbeGizmoPlugin::get_name() const {
+ return "ReflectionProbe";
+}
+
+int ReflectionProbeGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String ReflectionProbeGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ switch (p_idx) {
+ case 0:
+ return "Extents X";
+ case 1:
+ return "Extents Y";
+ case 2:
+ return "Extents Z";
+ case 3:
+ return "Origin X";
+ case 4:
+ return "Origin Y";
+ case 5:
+ return "Origin Z";
+ }
+
+ return "";
+}
+
+Variant ReflectionProbeGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
+ return AABB(probe->get_extents(), probe->get_origin_offset());
+}
+
+void ReflectionProbeGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
+ Transform gt = probe->get_global_transform();
+
+ Transform gi = gt.affine_inverse();
+
+ if (p_idx < 3) {
+ Vector3 extents = probe->get_extents();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
+
+ Vector3 axis;
+ axis[p_idx] = 1.0;
+
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), axis * 16384, sg[0], sg[1], ra, rb);
+ float d = ra[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ extents[p_idx] = d;
+ probe->set_extents(extents);
+ } else {
+ p_idx -= 3;
+
+ Vector3 origin = probe->get_origin_offset();
+ origin[p_idx] = 0;
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
+
+ Vector3 axis;
+ axis[p_idx] = 1.0;
+
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(origin - axis * 16384, origin + axis * 16384, sg[0], sg[1], ra, rb);
+ // Adjust the actual position to account for the gizmo handle position
+ float d = ra[p_idx] + 0.25;
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ origin[p_idx] = d;
+ probe->set_origin_offset(origin);
+ }
+}
+
+void ReflectionProbeGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
+
+ AABB restore = p_restore;
+
+ if (p_cancel) {
+ probe->set_extents(restore.position);
+ probe->set_origin_offset(restore.size);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Probe Extents"));
+ ur->add_do_method(probe, "set_extents", probe->get_extents());
+ ur->add_do_method(probe, "set_origin_offset", probe->get_origin_offset());
+ ur->add_undo_method(probe, "set_extents", restore.position);
+ ur->add_undo_method(probe, "set_origin_offset", restore.size);
+ ur->commit_action();
+}
+
+void ReflectionProbeGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+ Vector<Vector3> internal_lines;
+ Vector3 extents = probe->get_extents();
+
+ AABB aabb;
+ aabb.position = -extents;
+ aabb.size = extents * 2;
+
+ for (int i = 0; i < 12; i++) {
+ Vector3 a, b;
+ aabb.get_edge(i, a, b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ for (int i = 0; i < 8; i++) {
+ Vector3 ep = aabb.get_endpoint(i);
+ internal_lines.push_back(probe->get_origin_offset());
+ internal_lines.push_back(ep);
+ }
+
+ Vector<Vector3> handles;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = aabb.position[i] + aabb.size[i];
+ handles.push_back(ax);
+ }
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 orig_handle = probe->get_origin_offset();
+ orig_handle[i] -= 0.25;
+ lines.push_back(orig_handle);
+ handles.push_back(orig_handle);
+
+ orig_handle[i] += 0.5;
+ lines.push_back(orig_handle);
+ }
+
+ Ref<Material> material = get_material("reflection_probe_material", p_gizmo);
+ Ref<Material> material_internal = get_material("reflection_internal_material", p_gizmo);
+ Ref<Material> icon = get_material("reflection_probe_icon", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_lines(internal_lines, material_internal);
+
+ if (p_gizmo->is_selected()) {
+ Ref<Material> solid_material = get_material("reflection_probe_solid_material", p_gizmo);
+ p_gizmo->add_solid_box(solid_material, probe->get_extents() * 2.0);
+ }
+
+ p_gizmo->add_unscaled_billboard(icon, 0.05);
+ p_gizmo->add_handles(handles, get_material("handles"));
+}
+
+///////////////////////////////
+
+////
+
+DecalGizmoPlugin::DecalGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/decal", Color(0.6, 0.5, 1.0));
+
+ create_material("decal_material", gizmo_color);
+
+ create_handle_material("handles");
+}
+
+bool DecalGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<Decal>(p_spatial) != nullptr;
+}
+
+String DecalGizmoPlugin::get_name() const {
+ return "Decal";
+}
+
+int DecalGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String DecalGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ switch (p_idx) {
+ case 0:
+ return "Extents X";
+ case 1:
+ return "Extents Y";
+ case 2:
+ return "Extents Z";
+ }
+
+ return "";
+}
+
+Variant DecalGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node());
+ return decal->get_extents();
+}
+
+void DecalGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node());
+ Transform gt = decal->get_global_transform();
+
+ Transform gi = gt.affine_inverse();
+
+ Vector3 extents = decal->get_extents();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
+
+ Vector3 axis;
+ axis[p_idx] = 1.0;
+
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), axis * 16384, sg[0], sg[1], ra, rb);
+ float d = ra[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ extents[p_idx] = d;
+ decal->set_extents(extents);
+}
+
+void DecalGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node());
+
+ Vector3 restore = p_restore;
+
+ if (p_cancel) {
+ decal->set_extents(restore);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Decal Extents"));
+ ur->add_do_method(decal, "set_extents", decal->get_extents());
+ ur->add_undo_method(decal, "set_extents", restore);
+ ur->commit_action();
+}
+
+void DecalGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+ Vector3 extents = decal->get_extents();
+
+ AABB aabb;
+ aabb.position = -extents;
+ aabb.size = extents * 2;
+
+ for (int i = 0; i < 12; i++) {
+ Vector3 a, b;
+ aabb.get_edge(i, a, b);
+ if (a.y == b.y) {
+ lines.push_back(a);
+ lines.push_back(b);
+ } else {
+ Vector3 ah = a.lerp(b, 0.2);
+ lines.push_back(a);
+ lines.push_back(ah);
+ Vector3 bh = b.lerp(a, 0.2);
+ lines.push_back(b);
+ lines.push_back(bh);
+ }
+ }
+
+ lines.push_back(Vector3(0, extents.y, 0));
+ lines.push_back(Vector3(0, extents.y * 1.2, 0));
+
+ Vector<Vector3> handles;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = aabb.position[i] + aabb.size[i];
+ handles.push_back(ax);
+ }
+
+ Ref<Material> material = get_material("decal_material", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+
+ p_gizmo->add_handles(handles, get_material("handles"));
+}
+
+///////////////////////////////
+GIProbeGizmoPlugin::GIProbeGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/gi_probe", Color(0.5, 1, 0.6));
+
+ create_material("gi_probe_material", gizmo_color);
+
+ // This gizmo draws a lot of lines. Use a low opacity to make it not too intrusive.
+ gizmo_color.a = 0.1;
+ create_material("gi_probe_internal_material", gizmo_color);
+
+ gizmo_color.a = 0.05;
+ create_material("gi_probe_solid_material", gizmo_color);
+
+ create_icon_material("gi_probe_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoGIProbe", "EditorIcons"));
+ create_handle_material("handles");
+}
+
+bool GIProbeGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<GIProbe>(p_spatial) != nullptr;
+}
+
+String GIProbeGizmoPlugin::get_name() const {
+ return "GIProbe";
+}
+
+int GIProbeGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String GIProbeGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ switch (p_idx) {
+ case 0:
+ return "Extents X";
+ case 1:
+ return "Extents Y";
+ case 2:
+ return "Extents Z";
+ }
+
+ return "";
+}
+
+Variant GIProbeGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
+ return probe->get_extents();
+}
+
+void GIProbeGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
+
+ Transform gt = probe->get_global_transform();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 extents = probe->get_extents();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
+
+ Vector3 axis;
+ axis[p_idx] = 1.0;
+
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), axis * 16384, sg[0], sg[1], ra, rb);
+ float d = ra[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ extents[p_idx] = d;
+ probe->set_extents(extents);
+}
+
+void GIProbeGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
+
+ Vector3 restore = p_restore;
+
+ if (p_cancel) {
+ probe->set_extents(restore);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Probe Extents"));
+ ur->add_do_method(probe, "set_extents", probe->get_extents());
+ ur->add_undo_method(probe, "set_extents", restore);
+ ur->commit_action();
+}
+
+void GIProbeGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
+
+ Ref<Material> material = get_material("gi_probe_material", p_gizmo);
+ Ref<Material> icon = get_material("gi_probe_icon", p_gizmo);
+ Ref<Material> material_internal = get_material("gi_probe_internal_material", p_gizmo);
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+ Vector3 extents = probe->get_extents();
+
+ static const int subdivs[GIProbe::SUBDIV_MAX] = { 64, 128, 256, 512 };
+
+ AABB aabb = AABB(-extents, extents * 2);
+ int subdiv = subdivs[probe->get_subdiv()];
+ float cell_size = aabb.get_longest_axis_size() / subdiv;
+
+ for (int i = 0; i < 12; i++) {
+ Vector3 a, b;
+ aabb.get_edge(i, a, b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ p_gizmo->add_lines(lines, material);
+
+ lines.clear();
+
+ for (int i = 1; i < subdiv; i++) {
+ for (int j = 0; j < 3; j++) {
+ if (cell_size * i > aabb.size[j]) {
+ continue;
+ }
+
+ Vector2 dir;
+ dir[j] = 1.0;
+ Vector2 ta, tb;
+ int j_n1 = (j + 1) % 3;
+ int j_n2 = (j + 2) % 3;
+ ta[j_n1] = 1.0;
+ tb[j_n2] = 1.0;
+
+ for (int k = 0; k < 4; k++) {
+ Vector3 from = aabb.position, to = aabb.position;
+ from[j] += cell_size * i;
+ to[j] += cell_size * i;
+
+ if (k & 1) {
+ to[j_n1] += aabb.size[j_n1];
+ } else {
+ to[j_n2] += aabb.size[j_n2];
+ }
+
+ if (k & 2) {
+ from[j_n1] += aabb.size[j_n1];
+ from[j_n2] += aabb.size[j_n2];
+ }
+
+ lines.push_back(from);
+ lines.push_back(to);
+ }
+ }
+ }
+
+ p_gizmo->add_lines(lines, material_internal);
+
+ Vector<Vector3> handles;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = aabb.position[i] + aabb.size[i];
+ handles.push_back(ax);
+ }
+
+ if (p_gizmo->is_selected()) {
+ Ref<Material> solid_material = get_material("gi_probe_solid_material", p_gizmo);
+ p_gizmo->add_solid_box(solid_material, aabb.get_size());
+ }
+
+ p_gizmo->add_unscaled_billboard(icon, 0.05);
+ p_gizmo->add_handles(handles, get_material("handles"));
+}
+
+////
+
+BakedLightmapGizmoPlugin::BakedLightmapGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/lightmap_lines", Color(0.5, 0.6, 1));
+
+ gizmo_color.a = 0.1;
+ create_material("lightmap_lines", gizmo_color);
+
+ Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D);
+ mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ mat->set_cull_mode(StandardMaterial3D::CULL_DISABLED);
+ mat->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ mat->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, false);
+
+ add_material("lightmap_probe_material", mat);
+
+ create_icon_material("baked_indirect_light_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoBakedLightmap", "EditorIcons"));
+}
+
+String BakedLightmapGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ return "";
+}
+
+Variant BakedLightmapGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ return Variant();
+}
+
+void BakedLightmapGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+}
+
+void BakedLightmapGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+}
+
+bool BakedLightmapGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<BakedLightmap>(p_spatial) != nullptr;
+}
+
+String BakedLightmapGizmoPlugin::get_name() const {
+ return "BakedLightmap";
+}
+
+int BakedLightmapGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void BakedLightmapGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Ref<Material> icon = get_material("baked_indirect_light_icon", p_gizmo);
+ BakedLightmap *baker = Object::cast_to<BakedLightmap>(p_gizmo->get_spatial_node());
+ Ref<BakedLightmapData> data = baker->get_light_data();
+
+ p_gizmo->add_unscaled_billboard(icon, 0.05);
+
+ if (data.is_null()) {
+ return;
+ }
+
+ Ref<Material> material_lines = get_material("lightmap_lines", p_gizmo);
+ Ref<Material> material_probes = get_material("lightmap_probe_material", p_gizmo);
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+ Set<Vector2i> lines_found;
+
+ Vector<Vector3> points = data->get_capture_points();
+ if (points.size() == 0) {
+ return;
+ }
+ Vector<Color> sh = data->get_capture_sh();
+ if (sh.size() != points.size() * 9) {
+ return;
+ }
+
+ Vector<int> tetrahedrons = data->get_capture_tetrahedra();
+
+ for (int i = 0; i < tetrahedrons.size(); i += 4) {
+ for (int j = 0; j < 4; j++) {
+ for (int k = j + 1; k < 4; k++) {
+ Vector2i pair;
+ pair.x = tetrahedrons[i + j];
+ pair.y = tetrahedrons[i + k];
+
+ if (pair.y < pair.x) {
+ SWAP(pair.x, pair.y);
+ }
+ if (lines_found.has(pair)) {
+ continue;
+ }
+ lines_found.insert(pair);
+ lines.push_back(points[pair.x]);
+ lines.push_back(points[pair.y]);
+ }
+ }
+ }
+
+ p_gizmo->add_lines(lines, material_lines);
+
+ int stack_count = 8;
+ int sector_count = 16;
+
+ float sector_step = 2 * Math_PI / sector_count;
+ float stack_step = Math_PI / stack_count;
+
+ Vector<Vector3> vertices;
+ Vector<Color> colors;
+ Vector<int> indices;
+ float radius = 0.3;
+
+ for (int p = 0; p < points.size(); p++) {
+ int vertex_base = vertices.size();
+ Vector3 sh_col[9];
+ for (int i = 0; i < 9; i++) {
+ sh_col[i].x = sh[p * 9 + i].r;
+ sh_col[i].y = sh[p * 9 + i].g;
+ sh_col[i].z = sh[p * 9 + i].b;
+ }
+
+ for (int i = 0; i <= stack_count; ++i) {
+ float stack_angle = Math_PI / 2 - i * stack_step; // starting from pi/2 to -pi/2
+ float xy = radius * Math::cos(stack_angle); // r * cos(u)
+ float z = radius * Math::sin(stack_angle); // r * sin(u)
+
+ // add (sector_count+1) vertices per stack
+ // the first and last vertices have same position and normal, but different tex coords
+ for (int j = 0; j <= sector_count; ++j) {
+ float sector_angle = j * sector_step; // starting from 0 to 2pi
+
+ // vertex position (x, y, z)
+ float x = xy * Math::cos(sector_angle); // r * cos(u) * cos(v)
+ float y = xy * Math::sin(sector_angle); // r * cos(u) * sin(v)
+
+ Vector3 n = Vector3(x, z, y);
+ vertices.push_back(points[p] + n);
+ n.normalize();
+
+ const float c1 = 0.429043;
+ const float c2 = 0.511664;
+ const float c3 = 0.743125;
+ const float c4 = 0.886227;
+ const float c5 = 0.247708;
+ Vector3 light = (c1 * sh_col[8] * (n.x * n.x - n.y * n.y) +
+ c3 * sh_col[6] * n.z * n.z +
+ c4 * sh_col[0] -
+ c5 * sh_col[6] +
+ 2.0 * c1 * sh_col[4] * n.x * n.y +
+ 2.0 * c1 * sh_col[7] * n.x * n.z +
+ 2.0 * c1 * sh_col[5] * n.y * n.z +
+ 2.0 * c2 * sh_col[3] * n.x +
+ 2.0 * c2 * sh_col[1] * n.y +
+ 2.0 * c2 * sh_col[2] * n.z);
+
+ colors.push_back(Color(light.x, light.y, light.z, 1));
+ }
+ }
+
+ for (int i = 0; i < stack_count; ++i) {
+ int k1 = i * (sector_count + 1); // beginning of current stack
+ int k2 = k1 + sector_count + 1; // beginning of next stack
+
+ for (int j = 0; j < sector_count; ++j, ++k1, ++k2) {
+ // 2 triangles per sector excluding first and last stacks
+ // k1 => k2 => k1+1
+ if (i != 0) {
+ indices.push_back(vertex_base + k1);
+ indices.push_back(vertex_base + k2);
+ indices.push_back(vertex_base + k1 + 1);
+ }
+
+ // k1+1 => k2 => k2+1
+ if (i != (stack_count - 1)) {
+ indices.push_back(vertex_base + k1 + 1);
+ indices.push_back(vertex_base + k2);
+ indices.push_back(vertex_base + k2 + 1);
+ }
+ }
+ }
+ }
+
+ Array array;
+ array.resize(RS::ARRAY_MAX);
+ array[RS::ARRAY_VERTEX] = vertices;
+ array[RS::ARRAY_INDEX] = indices;
+ array[RS::ARRAY_COLOR] = colors;
+
+ Ref<ArrayMesh> mesh;
+ mesh.instance();
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, array, Array(), Dictionary(), 0); //no compression
+ mesh->surface_set_material(0, material_probes);
+
+ p_gizmo->add_mesh(mesh);
+}
+
+/////////
+
+LightmapProbeGizmoPlugin::LightmapProbeGizmoPlugin() {
+ Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/lightprobe_lines", Color(0.5, 0.6, 1));
+
+ gizmo_color.a = 0.3;
+ create_material("lightprobe_lines", gizmo_color);
+}
+
+String LightmapProbeGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ return "";
+}
+
+Variant LightmapProbeGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ return Variant();
+}
+
+void LightmapProbeGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+}
+
+void LightmapProbeGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+}
+
+bool LightmapProbeGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<LightmapProbe>(p_spatial) != nullptr;
+}
+
+String LightmapProbeGizmoPlugin::get_name() const {
+ return "LightmapProbe";
+}
+
+int LightmapProbeGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void LightmapProbeGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Ref<Material> material_lines = get_material("lightprobe_lines", p_gizmo);
+
+ p_gizmo->clear();
+
+ Vector<Vector3> lines;
+
+ int stack_count = 8;
+ int sector_count = 16;
+
+ float sector_step = 2 * Math_PI / sector_count;
+ float stack_step = Math_PI / stack_count;
+
+ Vector<Vector3> vertices;
+ float radius = 0.2;
+
+ for (int i = 0; i <= stack_count; ++i) {
+ float stack_angle = Math_PI / 2 - i * stack_step; // starting from pi/2 to -pi/2
+ float xy = radius * Math::cos(stack_angle); // r * cos(u)
+ float z = radius * Math::sin(stack_angle); // r * sin(u)
+
+ // add (sector_count+1) vertices per stack
+ // the first and last vertices have same position and normal, but different tex coords
+ for (int j = 0; j <= sector_count; ++j) {
+ float sector_angle = j * sector_step; // starting from 0 to 2pi
+
+ // vertex position (x, y, z)
+ float x = xy * Math::cos(sector_angle); // r * cos(u) * cos(v)
+ float y = xy * Math::sin(sector_angle); // r * cos(u) * sin(v)
+
+ Vector3 n = Vector3(x, z, y);
+ vertices.push_back(n);
+ }
+ }
+
+ for (int i = 0; i < stack_count; ++i) {
+ int k1 = i * (sector_count + 1); // beginning of current stack
+ int k2 = k1 + sector_count + 1; // beginning of next stack
+
+ for (int j = 0; j < sector_count; ++j, ++k1, ++k2) {
+ // 2 triangles per sector excluding first and last stacks
+ // k1 => k2 => k1+1
+ if (i != 0) {
+ lines.push_back(vertices[k1]);
+ lines.push_back(vertices[k2]);
+ lines.push_back(vertices[k1]);
+ lines.push_back(vertices[k1 + 1]);
+ }
+
+ if (i != (stack_count - 1)) {
+ lines.push_back(vertices[k1 + 1]);
+ lines.push_back(vertices[k2]);
+ lines.push_back(vertices[k2]);
+ lines.push_back(vertices[k2 + 1]);
+ }
+ }
+ }
+
+ p_gizmo->add_lines(lines, material_lines);
+}
+
+////
+
+CollisionShape3DGizmoPlugin::CollisionShape3DGizmoPlugin() {
+ const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ create_material("shape_material", gizmo_color);
+ const float gizmo_value = gizmo_color.get_v();
+ const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
+ create_material("shape_material_disabled", gizmo_color_disabled);
+ create_handle_material("handles");
+}
+
+bool CollisionShape3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<CollisionShape3D>(p_spatial) != nullptr;
+}
+
+String CollisionShape3DGizmoPlugin::get_name() const {
+ return "CollisionShape3D";
+}
+
+int CollisionShape3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+String CollisionShape3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ const CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node());
+
+ Ref<Shape3D> s = cs->get_shape();
+ if (s.is_null()) {
+ return "";
+ }
+
+ if (Object::cast_to<SphereShape3D>(*s)) {
+ return "Radius";
+ }
+
+ if (Object::cast_to<BoxShape3D>(*s)) {
+ return "Extents";
+ }
+
+ if (Object::cast_to<CapsuleShape3D>(*s)) {
+ return p_idx == 0 ? "Radius" : "Height";
+ }
+
+ if (Object::cast_to<CylinderShape3D>(*s)) {
+ return p_idx == 0 ? "Radius" : "Height";
+ }
+
+ if (Object::cast_to<RayShape3D>(*s)) {
+ return "Length";
+ }
+
+ return "";
+}
+
+Variant CollisionShape3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node());
+
+ Ref<Shape3D> s = cs->get_shape();
+ if (s.is_null()) {
+ return Variant();
+ }
+
+ if (Object::cast_to<SphereShape3D>(*s)) {
+ Ref<SphereShape3D> ss = s;
+ return ss->get_radius();
+ }
+
+ if (Object::cast_to<BoxShape3D>(*s)) {
+ Ref<BoxShape3D> bs = s;
+ return bs->get_extents();
+ }
+
+ if (Object::cast_to<CapsuleShape3D>(*s)) {
+ Ref<CapsuleShape3D> cs2 = s;
+ return p_idx == 0 ? cs2->get_radius() : cs2->get_height();
+ }
+
+ if (Object::cast_to<CylinderShape3D>(*s)) {
+ Ref<CylinderShape3D> cs2 = s;
+ return p_idx == 0 ? cs2->get_radius() : cs2->get_height();
+ }
+
+ if (Object::cast_to<RayShape3D>(*s)) {
+ Ref<RayShape3D> cs2 = s;
+ return cs2->get_length();
+ }
+
+ return Variant();
+}
+
+void CollisionShape3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node());
+
+ Ref<Shape3D> s = cs->get_shape();
+ if (s.is_null()) {
+ return;
+ }
+
+ Transform gt = cs->get_global_transform();
+ Transform gi = gt.affine_inverse();
+
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
+
+ if (Object::cast_to<SphereShape3D>(*s)) {
+ Ref<SphereShape3D> ss = s;
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), Vector3(4096, 0, 0), sg[0], sg[1], ra, rb);
+ float d = ra.x;
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ ss->set_radius(d);
+ }
+
+ if (Object::cast_to<RayShape3D>(*s)) {
+ Ref<RayShape3D> rs = s;
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), Vector3(0, 0, 4096), sg[0], sg[1], ra, rb);
+ float d = ra.z;
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ rs->set_length(d);
+ }
+
+ if (Object::cast_to<BoxShape3D>(*s)) {
+ Vector3 axis;
+ axis[p_idx] = 1.0;
+ Ref<BoxShape3D> bs = s;
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb);
+ float d = ra[p_idx];
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ Vector3 he = bs->get_extents();
+ he[p_idx] = d;
+ bs->set_extents(he);
+ }
+
+ if (Object::cast_to<CapsuleShape3D>(*s)) {
+ Vector3 axis;
+ axis[p_idx == 0 ? 0 : 2] = 1.0;
+ Ref<CapsuleShape3D> cs2 = s;
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb);
+ float d = axis.dot(ra);
+ if (p_idx == 1) {
+ d -= cs2->get_radius();
+ }
+
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ if (p_idx == 0) {
+ cs2->set_radius(d);
+ } else if (p_idx == 1) {
+ cs2->set_height(d * 2.0);
+ }
+ }
+
+ if (Object::cast_to<CylinderShape3D>(*s)) {
+ Vector3 axis;
+ axis[p_idx == 0 ? 0 : 1] = 1.0;
+ Ref<CylinderShape3D> cs2 = s;
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb);
+ float d = axis.dot(ra);
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap());
+ }
+
+ if (d < 0.001) {
+ d = 0.001;
+ }
+
+ if (p_idx == 0) {
+ cs2->set_radius(d);
+ } else if (p_idx == 1) {
+ cs2->set_height(d * 2.0);
+ }
+ }
+}
+
+void CollisionShape3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node());
+
+ Ref<Shape3D> s = cs->get_shape();
+ if (s.is_null()) {
+ return;
+ }
+
+ if (Object::cast_to<SphereShape3D>(*s)) {
+ Ref<SphereShape3D> ss = s;
+ if (p_cancel) {
+ ss->set_radius(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Sphere Shape Radius"));
+ ur->add_do_method(ss.ptr(), "set_radius", ss->get_radius());
+ ur->add_undo_method(ss.ptr(), "set_radius", p_restore);
+ ur->commit_action();
+ }
+
+ if (Object::cast_to<BoxShape3D>(*s)) {
+ Ref<BoxShape3D> ss = s;
+ if (p_cancel) {
+ ss->set_extents(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Box Shape Extents"));
+ ur->add_do_method(ss.ptr(), "set_extents", ss->get_extents());
+ ur->add_undo_method(ss.ptr(), "set_extents", p_restore);
+ ur->commit_action();
+ }
+
+ if (Object::cast_to<CapsuleShape3D>(*s)) {
+ Ref<CapsuleShape3D> ss = s;
+ if (p_cancel) {
+ if (p_idx == 0) {
+ ss->set_radius(p_restore);
+ } else {
+ ss->set_height(p_restore);
+ }
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ if (p_idx == 0) {
+ ur->create_action(TTR("Change Capsule Shape Radius"));
+ ur->add_do_method(ss.ptr(), "set_radius", ss->get_radius());
+ ur->add_undo_method(ss.ptr(), "set_radius", p_restore);
+ } else {
+ ur->create_action(TTR("Change Capsule Shape Height"));
+ ur->add_do_method(ss.ptr(), "set_height", ss->get_height());
+ ur->add_undo_method(ss.ptr(), "set_height", p_restore);
+ }
+
+ ur->commit_action();
+ }
+
+ if (Object::cast_to<CylinderShape3D>(*s)) {
+ Ref<CylinderShape3D> ss = s;
+ if (p_cancel) {
+ if (p_idx == 0) {
+ ss->set_radius(p_restore);
+ } else {
+ ss->set_height(p_restore);
+ }
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ if (p_idx == 0) {
+ ur->create_action(TTR("Change Cylinder Shape Radius"));
+ ur->add_do_method(ss.ptr(), "set_radius", ss->get_radius());
+ ur->add_undo_method(ss.ptr(), "set_radius", p_restore);
+ } else {
+ ur->create_action(
+ ///
+
+ ////////
+ TTR("Change Cylinder Shape Height"));
+ ur->add_do_method(ss.ptr(), "set_height", ss->get_height());
+ ur->add_undo_method(ss.ptr(), "set_height", p_restore);
+ }
+
+ ur->commit_action();
+ }
+
+ if (Object::cast_to<RayShape3D>(*s)) {
+ Ref<RayShape3D> ss = s;
+ if (p_cancel) {
+ ss->set_length(p_restore);
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Change Ray Shape Length"));
+ ur->add_do_method(ss.ptr(), "set_length", ss->get_length());
+ ur->add_undo_method(ss.ptr(), "set_length", p_restore);
+ ur->commit_action();
+ }
+}
+
+void CollisionShape3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Ref<Shape3D> s = cs->get_shape();
+ if (s.is_null()) {
+ return;
+ }
+
+ const Ref<Material> material =
+ get_material(!cs->is_disabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
+ Ref<Material> handles_material = get_material("handles");
+
+ if (Object::cast_to<SphereShape3D>(*s)) {
+ Ref<SphereShape3D> sp = s;
+ float r = sp->get_radius();
+
+ Vector<Vector3> points;
+
+ for (int i = 0; i <= 360; i++) {
+ float ra = Math::deg2rad((float)i);
+ float rb = Math::deg2rad((float)i + 1);
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
+
+ points.push_back(Vector3(a.x, 0, a.y));
+ points.push_back(Vector3(b.x, 0, b.y));
+ points.push_back(Vector3(0, a.x, a.y));
+ points.push_back(Vector3(0, b.x, b.y));
+ points.push_back(Vector3(a.x, a.y, 0));
+ points.push_back(Vector3(b.x, b.y, 0));
+ }
+
+ Vector<Vector3> collision_segments;
+
+ for (int i = 0; i < 64; i++) {
+ float ra = i * Math_PI * 2.0 / 64.0;
+ float rb = (i + 1) * Math_PI * 2.0 / 64.0;
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
+
+ collision_segments.push_back(Vector3(a.x, 0, a.y));
+ collision_segments.push_back(Vector3(b.x, 0, b.y));
+ collision_segments.push_back(Vector3(0, a.x, a.y));
+ collision_segments.push_back(Vector3(0, b.x, b.y));
+ collision_segments.push_back(Vector3(a.x, a.y, 0));
+ collision_segments.push_back(Vector3(b.x, b.y, 0));
+ }
+
+ p_gizmo->add_lines(points, material);
+ p_gizmo->add_collision_segments(collision_segments);
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(r, 0, 0));
+ p_gizmo->add_handles(handles, handles_material);
+ }
+
+ if (Object::cast_to<BoxShape3D>(*s)) {
+ Ref<BoxShape3D> bs = s;
+ Vector<Vector3> lines;
+ AABB aabb;
+ aabb.position = -bs->get_extents();
+ aabb.size = aabb.position * -2;
+
+ for (int i = 0; i < 12; i++) {
+ Vector3 a, b;
+ aabb.get_edge(i, a, b);
+ lines.push_back(a);
+ lines.push_back(b);
+ }
+
+ Vector<Vector3> handles;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ax;
+ ax[i] = bs->get_extents()[i];
+ handles.push_back(ax);
+ }
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_collision_segments(lines);
+ p_gizmo->add_handles(handles, handles_material);
+ }
+
+ if (Object::cast_to<CapsuleShape3D>(*s)) {
+ Ref<CapsuleShape3D> cs2 = s;
+ float radius = cs2->get_radius();
+ float height = cs2->get_height();
+
+ Vector<Vector3> points;
+
+ Vector3 d(0, height * 0.5, 0);
+ for (int i = 0; i < 360; i++) {
+ float ra = Math::deg2rad((float)i);
+ float rb = Math::deg2rad((float)i + 1);
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
+
+ points.push_back(Vector3(a.x, 0, a.y) + d);
+ points.push_back(Vector3(b.x, 0, b.y) + d);
+
+ points.push_back(Vector3(a.x, 0, a.y) - d);
+ points.push_back(Vector3(b.x, 0, b.y) - d);
+
+ if (i % 90 == 0) {
+ points.push_back(Vector3(a.x, 0, a.y) + d);
+ points.push_back(Vector3(a.x, 0, a.y) - d);
+ }
+
+ Vector3 dud = i < 180 ? d : -d;
+
+ points.push_back(Vector3(0, a.x, a.y) + dud);
+ points.push_back(Vector3(0, b.x, b.y) + dud);
+ points.push_back(Vector3(a.y, a.x, 0) + dud);
+ points.push_back(Vector3(b.y, b.x, 0) + dud);
+ }
+
+ p_gizmo->add_lines(points, material);
+
+ Vector<Vector3> collision_segments;
+
+ for (int i = 0; i < 64; i++) {
+ float ra = i * Math_PI * 2.0 / 64.0;
+ float rb = (i + 1) * Math_PI * 2.0 / 64.0;
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
+
+ collision_segments.push_back(Vector3(a.x, 0, a.y) + d);
+ collision_segments.push_back(Vector3(b.x, 0, b.y) + d);
+
+ collision_segments.push_back(Vector3(a.x, 0, a.y) - d);
+ collision_segments.push_back(Vector3(b.x, 0, b.y) - d);
+
+ if (i % 16 == 0) {
+ collision_segments.push_back(Vector3(a.x, 0, a.y) + d);
+ collision_segments.push_back(Vector3(a.x, 0, a.y) - d);
+ }
+
+ Vector3 dud = i < 32 ? d : -d;
+
+ collision_segments.push_back(Vector3(0, a.x, a.y) + dud);
+ collision_segments.push_back(Vector3(0, b.x, b.y) + dud);
+ collision_segments.push_back(Vector3(a.y, a.x, 0) + dud);
+ collision_segments.push_back(Vector3(b.y, b.x, 0) + dud);
+ }
+
+ p_gizmo->add_collision_segments(collision_segments);
+
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(cs2->get_radius(), 0, 0));
+ handles.push_back(Vector3(0, cs2->get_height() * 0.5 + cs2->get_radius(), 0));
+ p_gizmo->add_handles(handles, handles_material);
+ }
+
+ if (Object::cast_to<CylinderShape3D>(*s)) {
+ Ref<CylinderShape3D> cs2 = s;
+ float radius = cs2->get_radius();
+ float height = cs2->get_height();
+
+ Vector<Vector3> points;
+
+ Vector3 d(0, height * 0.5, 0);
+ for (int i = 0; i < 360; i++) {
+ float ra = Math::deg2rad((float)i);
+ float rb = Math::deg2rad((float)i + 1);
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
+
+ points.push_back(Vector3(a.x, 0, a.y) + d);
+ points.push_back(Vector3(b.x, 0, b.y) + d);
+
+ points.push_back(Vector3(a.x, 0, a.y) - d);
+ points.push_back(Vector3(b.x, 0, b.y) - d);
+
+ if (i % 90 == 0) {
+ points.push_back(Vector3(a.x, 0, a.y) + d);
+ points.push_back(Vector3(a.x, 0, a.y) - d);
+ }
+ }
+
+ p_gizmo->add_lines(points, material);
+
+ Vector<Vector3> collision_segments;
+
+ for (int i = 0; i < 64; i++) {
+ float ra = i * Math_PI * 2.0 / 64.0;
+ float rb = (i + 1) * Math_PI * 2.0 / 64.0;
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
+
+ collision_segments.push_back(Vector3(a.x, 0, a.y) + d);
+ collision_segments.push_back(Vector3(b.x, 0, b.y) + d);
+
+ collision_segments.push_back(Vector3(a.x, 0, a.y) - d);
+ collision_segments.push_back(Vector3(b.x, 0, b.y) - d);
+
+ if (i % 16 == 0) {
+ collision_segments.push_back(Vector3(a.x, 0, a.y) + d);
+ collision_segments.push_back(Vector3(a.x, 0, a.y) - d);
+ }
+ }
+
+ p_gizmo->add_collision_segments(collision_segments);
+
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(cs2->get_radius(), 0, 0));
+ handles.push_back(Vector3(0, cs2->get_height() * 0.5, 0));
+ p_gizmo->add_handles(handles, handles_material);
+ }
+
+ if (Object::cast_to<WorldMarginShape3D>(*s)) {
+ Ref<WorldMarginShape3D> ps = s;
+ Plane p = ps->get_plane();
+ Vector<Vector3> points;
+
+ Vector3 n1 = p.get_any_perpendicular_normal();
+ Vector3 n2 = p.normal.cross(n1).normalized();
+
+ Vector3 pface[4] = {
+ p.normal * p.d + n1 * 10.0 + n2 * 10.0,
+ p.normal * p.d + n1 * 10.0 + n2 * -10.0,
+ p.normal * p.d + n1 * -10.0 + n2 * -10.0,
+ p.normal * p.d + n1 * -10.0 + n2 * 10.0,
+ };
+
+ points.push_back(pface[0]);
+ points.push_back(pface[1]);
+ points.push_back(pface[1]);
+ points.push_back(pface[2]);
+ points.push_back(pface[2]);
+ points.push_back(pface[3]);
+ points.push_back(pface[3]);
+ points.push_back(pface[0]);
+ points.push_back(p.normal * p.d);
+ points.push_back(p.normal * p.d + p.normal * 3);
+
+ p_gizmo->add_lines(points, material);
+ p_gizmo->add_collision_segments(points);
+ }
+
+ if (Object::cast_to<ConvexPolygonShape3D>(*s)) {
+ Vector<Vector3> points = Object::cast_to<ConvexPolygonShape3D>(*s)->get_points();
+
+ if (points.size() > 3) {
+ Vector<Vector3> varr = Variant(points);
+ Geometry3D::MeshData md;
+ Error err = QuickHull::build(varr, md);
+ if (err == OK) {
+ Vector<Vector3> points2;
+ points2.resize(md.edges.size() * 2);
+ for (int i = 0; i < md.edges.size(); i++) {
+ points2.write[i * 2 + 0] = md.vertices[md.edges[i].a];
+ points2.write[i * 2 + 1] = md.vertices[md.edges[i].b];
+ }
+
+ p_gizmo->add_lines(points2, material);
+ p_gizmo->add_collision_segments(points2);
+ }
+ }
+ }
+
+ if (Object::cast_to<ConcavePolygonShape3D>(*s)) {
+ Ref<ConcavePolygonShape3D> cs2 = s;
+ Ref<ArrayMesh> mesh = cs2->get_debug_mesh();
+ p_gizmo->add_mesh(mesh, false, Ref<SkinReference>(), material);
+ p_gizmo->add_collision_segments(cs2->get_debug_mesh_lines());
+ }
+
+ if (Object::cast_to<RayShape3D>(*s)) {
+ Ref<RayShape3D> rs = s;
+
+ Vector<Vector3> points;
+ points.push_back(Vector3());
+ points.push_back(Vector3(0, 0, rs->get_length()));
+ p_gizmo->add_lines(points, material);
+ p_gizmo->add_collision_segments(points);
+ Vector<Vector3> handles;
+ handles.push_back(Vector3(0, 0, rs->get_length()));
+ p_gizmo->add_handles(handles, handles_material);
+ }
+
+ if (Object::cast_to<HeightMapShape3D>(*s)) {
+ Ref<HeightMapShape3D> hms = s;
+
+ Ref<ArrayMesh> mesh = hms->get_debug_mesh();
+ p_gizmo->add_mesh(mesh, false, Ref<SkinReference>(), material);
+ }
+}
+
+/////
+
+CollisionPolygon3DGizmoPlugin::CollisionPolygon3DGizmoPlugin() {
+ const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
+ create_material("shape_material", gizmo_color);
+ const float gizmo_value = gizmo_color.get_v();
+ const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
+ create_material("shape_material_disabled", gizmo_color_disabled);
+}
+
+bool CollisionPolygon3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<CollisionPolygon3D>(p_spatial) != nullptr;
+}
+
+String CollisionPolygon3DGizmoPlugin::get_name() const {
+ return "CollisionPolygon3D";
+}
+
+int CollisionPolygon3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void CollisionPolygon3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ CollisionPolygon3D *polygon = Object::cast_to<CollisionPolygon3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Vector<Vector2> points = polygon->get_polygon();
+ float depth = polygon->get_depth() * 0.5;
+
+ Vector<Vector3> lines;
+ for (int i = 0; i < points.size(); i++) {
+ int n = (i + 1) % points.size();
+ lines.push_back(Vector3(points[i].x, points[i].y, depth));
+ lines.push_back(Vector3(points[n].x, points[n].y, depth));
+ lines.push_back(Vector3(points[i].x, points[i].y, -depth));
+ lines.push_back(Vector3(points[n].x, points[n].y, -depth));
+ lines.push_back(Vector3(points[i].x, points[i].y, depth));
+ lines.push_back(Vector3(points[i].x, points[i].y, -depth));
+ }
+
+ const Ref<Material> material =
+ get_material(!polygon->is_disabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
+
+ p_gizmo->add_lines(lines, material);
+ p_gizmo->add_collision_segments(lines);
+}
+
+////
+
+NavigationRegion3DGizmoPlugin::NavigationRegion3DGizmoPlugin() {
+ create_material("navigation_edge_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_edge", Color(0.5, 1, 1)));
+ create_material("navigation_edge_material_disabled", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_edge_disabled", Color(0.7, 0.7, 0.7)));
+ create_material("navigation_solid_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_solid", Color(0.5, 1, 1, 0.4)));
+ create_material("navigation_solid_material_disabled", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_solid_disabled", Color(0.7, 0.7, 0.7, 0.4)));
+}
+
+bool NavigationRegion3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<NavigationRegion3D>(p_spatial) != nullptr;
+}
+
+String NavigationRegion3DGizmoPlugin::get_name() const {
+ return "NavigationRegion3D";
+}
+
+int NavigationRegion3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void NavigationRegion3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ NavigationRegion3D *navmesh = Object::cast_to<NavigationRegion3D>(p_gizmo->get_spatial_node());
+
+ Ref<Material> edge_material = get_material("navigation_edge_material", p_gizmo);
+ Ref<Material> edge_material_disabled = get_material("navigation_edge_material_disabled", p_gizmo);
+ Ref<Material> solid_material = get_material("navigation_solid_material", p_gizmo);
+ Ref<Material> solid_material_disabled = get_material("navigation_solid_material_disabled", p_gizmo);
+
+ p_gizmo->clear();
+ Ref<NavigationMesh> navmeshie = navmesh->get_navigation_mesh();
+ if (navmeshie.is_null()) {
+ return;
+ }
+
+ Vector<Vector3> vertices = navmeshie->get_vertices();
+ const Vector3 *vr = vertices.ptr();
+ List<Face3> faces;
+ for (int i = 0; i < navmeshie->get_polygon_count(); i++) {
+ Vector<int> p = navmeshie->get_polygon(i);
+
+ for (int j = 2; j < p.size(); j++) {
+ Face3 f;
+ f.vertex[0] = vr[p[0]];
+ f.vertex[1] = vr[p[j - 1]];
+ f.vertex[2] = vr[p[j]];
+
+ faces.push_back(f);
+ }
+ }
+
+ if (faces.empty()) {
+ return;
+ }
+
+ Map<_EdgeKey, bool> edge_map;
+ Vector<Vector3> tmeshfaces;
+ tmeshfaces.resize(faces.size() * 3);
+
+ {
+ Vector3 *tw = tmeshfaces.ptrw();
+ int tidx = 0;
+
+ for (List<Face3>::Element *E = faces.front(); E; E = E->next()) {
+ const Face3 &f = E->get();
+
+ for (int j = 0; j < 3; j++) {
+ tw[tidx++] = f.vertex[j];
+ _EdgeKey ek;
+ ek.from = f.vertex[j].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON));
+ ek.to = f.vertex[(j + 1) % 3].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON));
+ if (ek.from < ek.to) {
+ SWAP(ek.from, ek.to);
+ }
+
+ Map<_EdgeKey, bool>::Element *F = edge_map.find(ek);
+
+ if (F) {
+ F->get() = false;
+
+ } else {
+ edge_map[ek] = true;
+ }
+ }
+ }
+ }
+ Vector<Vector3> lines;
+
+ for (Map<_EdgeKey, bool>::Element *E = edge_map.front(); E; E = E->next()) {
+ if (E->get()) {
+ lines.push_back(E->key().from);
+ lines.push_back(E->key().to);
+ }
+ }
+
+ Ref<TriangleMesh> tmesh = memnew(TriangleMesh);
+ tmesh->create(tmeshfaces);
+
+ if (lines.size()) {
+ p_gizmo->add_lines(lines, navmesh->is_enabled() ? edge_material : edge_material_disabled);
+ }
+ p_gizmo->add_collision_triangles(tmesh);
+ Ref<ArrayMesh> m = memnew(ArrayMesh);
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ a[0] = tmeshfaces;
+ m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, a);
+ m->surface_set_material(0, navmesh->is_enabled() ? solid_material : solid_material_disabled);
+ p_gizmo->add_mesh(m);
+ p_gizmo->add_collision_segments(lines);
+}
+
+//////
+
+#define BODY_A_RADIUS 0.25
+#define BODY_B_RADIUS 0.27
+
+Basis JointGizmosDrawer::look_body(const Transform &p_joint_transform, const Transform &p_body_transform) {
+ const Vector3 &p_eye(p_joint_transform.origin);
+ const Vector3 &p_target(p_body_transform.origin);
+
+ Vector3 v_x, v_y, v_z;
+
+ // Look the body with X
+ v_x = p_target - p_eye;
+ v_x.normalize();
+
+ v_z = v_x.cross(Vector3(0, 1, 0));
+ v_z.normalize();
+
+ v_y = v_z.cross(v_x);
+ v_y.normalize();
+
+ Basis base;
+ base.set(v_x, v_y, v_z);
+
+ // Absorb current joint transform
+ base = p_joint_transform.basis.inverse() * base;
+
+ return base;
+}
+
+Basis JointGizmosDrawer::look_body_toward(Vector3::Axis p_axis, const Transform &joint_transform, const Transform &body_transform) {
+ switch (p_axis) {
+ case Vector3::AXIS_X:
+ return look_body_toward_x(joint_transform, body_transform);
+ case Vector3::AXIS_Y:
+ return look_body_toward_y(joint_transform, body_transform);
+ case Vector3::AXIS_Z:
+ return look_body_toward_z(joint_transform, body_transform);
+ default:
+ return Basis();
+ }
+}
+
+Basis JointGizmosDrawer::look_body_toward_x(const Transform &p_joint_transform, const Transform &p_body_transform) {
+ const Vector3 &p_eye(p_joint_transform.origin);
+ const Vector3 &p_target(p_body_transform.origin);
+
+ const Vector3 p_front(p_joint_transform.basis.get_axis(0));
+
+ Vector3 v_x, v_y, v_z;
+
+ // Look the body with X
+ v_x = p_target - p_eye;
+ v_x.normalize();
+
+ v_y = p_front.cross(v_x);
+ v_y.normalize();
+
+ v_z = v_y.cross(p_front);
+ v_z.normalize();
+
+ // Clamp X to FRONT axis
+ v_x = p_front;
+ v_x.normalize();
+
+ Basis base;
+ base.set(v_x, v_y, v_z);
+
+ // Absorb current joint transform
+ base = p_joint_transform.basis.inverse() * base;
+
+ return base;
+}
+
+Basis JointGizmosDrawer::look_body_toward_y(const Transform &p_joint_transform, const Transform &p_body_transform) {
+ const Vector3 &p_eye(p_joint_transform.origin);
+ const Vector3 &p_target(p_body_transform.origin);
+
+ const Vector3 p_up(p_joint_transform.basis.get_axis(1));
+
+ Vector3 v_x, v_y, v_z;
+
+ // Look the body with X
+ v_x = p_target - p_eye;
+ v_x.normalize();
+
+ v_z = v_x.cross(p_up);
+ v_z.normalize();
+
+ v_x = p_up.cross(v_z);
+ v_x.normalize();
+
+ // Clamp Y to UP axis
+ v_y = p_up;
+ v_y.normalize();
+
+ Basis base;
+ base.set(v_x, v_y, v_z);
+
+ // Absorb current joint transform
+ base = p_joint_transform.basis.inverse() * base;
+
+ return base;
+}
+
+Basis JointGizmosDrawer::look_body_toward_z(const Transform &p_joint_transform, const Transform &p_body_transform) {
+ const Vector3 &p_eye(p_joint_transform.origin);
+ const Vector3 &p_target(p_body_transform.origin);
+
+ const Vector3 p_lateral(p_joint_transform.basis.get_axis(2));
+
+ Vector3 v_x, v_y, v_z;
+
+ // Look the body with X
+ v_x = p_target - p_eye;
+ v_x.normalize();
+
+ v_z = p_lateral;
+ v_z.normalize();
+
+ v_y = v_z.cross(v_x);
+ v_y.normalize();
+
+ // Clamp X to Z axis
+ v_x = v_y.cross(v_z);
+ v_x.normalize();
+
+ Basis base;
+ base.set(v_x, v_y, v_z);
+
+ // Absorb current joint transform
+ base = p_joint_transform.basis.inverse() * base;
+
+ return base;
+}
+
+void JointGizmosDrawer::draw_circle(Vector3::Axis p_axis, real_t p_radius, const Transform &p_offset, const Basis &p_base, real_t p_limit_lower, real_t p_limit_upper, Vector<Vector3> &r_points, bool p_inverse) {
+ if (p_limit_lower == p_limit_upper) {
+ r_points.push_back(p_offset.translated(Vector3()).origin);
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3(0.5, 0, 0))).origin);
+
+ } else {
+ if (p_limit_lower > p_limit_upper) {
+ p_limit_lower = -Math_PI;
+ p_limit_upper = Math_PI;
+ }
+
+ const int points = 32;
+
+ for (int i = 0; i < points; i++) {
+ real_t s = p_limit_lower + i * (p_limit_upper - p_limit_lower) / points;
+ real_t n = p_limit_lower + (i + 1) * (p_limit_upper - p_limit_lower) / points;
+
+ Vector3 from;
+ Vector3 to;
+ switch (p_axis) {
+ case Vector3::AXIS_X:
+ if (p_inverse) {
+ from = p_base.xform(Vector3(0, Math::sin(s), Math::cos(s))) * p_radius;
+ to = p_base.xform(Vector3(0, Math::sin(n), Math::cos(n))) * p_radius;
+ } else {
+ from = p_base.xform(Vector3(0, -Math::sin(s), Math::cos(s))) * p_radius;
+ to = p_base.xform(Vector3(0, -Math::sin(n), Math::cos(n))) * p_radius;
+ }
+ break;
+ case Vector3::AXIS_Y:
+ if (p_inverse) {
+ from = p_base.xform(Vector3(Math::cos(s), 0, -Math::sin(s))) * p_radius;
+ to = p_base.xform(Vector3(Math::cos(n), 0, -Math::sin(n))) * p_radius;
+ } else {
+ from = p_base.xform(Vector3(Math::cos(s), 0, Math::sin(s))) * p_radius;
+ to = p_base.xform(Vector3(Math::cos(n), 0, Math::sin(n))) * p_radius;
+ }
+ break;
+ case Vector3::AXIS_Z:
+ from = p_base.xform(Vector3(Math::cos(s), Math::sin(s), 0)) * p_radius;
+ to = p_base.xform(Vector3(Math::cos(n), Math::sin(n), 0)) * p_radius;
+ break;
+ }
+
+ if (i == points - 1) {
+ r_points.push_back(p_offset.translated(to).origin);
+ r_points.push_back(p_offset.translated(Vector3()).origin);
+ }
+ if (i == 0) {
+ r_points.push_back(p_offset.translated(from).origin);
+ r_points.push_back(p_offset.translated(Vector3()).origin);
+ }
+
+ r_points.push_back(p_offset.translated(from).origin);
+ r_points.push_back(p_offset.translated(to).origin);
+ }
+
+ r_points.push_back(p_offset.translated(Vector3(0, p_radius * 1.5, 0)).origin);
+ r_points.push_back(p_offset.translated(Vector3()).origin);
+ }
+}
+
+void JointGizmosDrawer::draw_cone(const Transform &p_offset, const Basis &p_base, real_t p_swing, real_t p_twist, Vector<Vector3> &r_points) {
+ float r = 1.0;
+ float w = r * Math::sin(p_swing);
+ float d = r * Math::cos(p_swing);
+
+ //swing
+ for (int i = 0; i < 360; i += 10) {
+ float ra = Math::deg2rad((float)i);
+ float rb = Math::deg2rad((float)i + 10);
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * w;
+
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3(d, a.x, a.y))).origin);
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3(d, b.x, b.y))).origin);
+
+ if (i % 90 == 0) {
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3(d, a.x, a.y))).origin);
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3())).origin);
+ }
+ }
+
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3())).origin);
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3(1, 0, 0))).origin);
+
+ /// Twist
+ float ts = Math::rad2deg(p_twist);
+ ts = MIN(ts, 720);
+
+ for (int i = 0; i < int(ts); i += 5) {
+ float ra = Math::deg2rad((float)i);
+ float rb = Math::deg2rad((float)i + 5);
+ float c = i / 720.0;
+ float cn = (i + 5) / 720.0;
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w * c;
+ Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * w * cn;
+
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3(c, a.x, a.y))).origin);
+ r_points.push_back(p_offset.translated(p_base.xform(Vector3(cn, b.x, b.y))).origin);
+ }
+}
+
+////
+
+Joint3DGizmoPlugin::Joint3DGizmoPlugin() {
+ create_material("joint_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1)));
+ create_material("joint_body_a_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint_body_a", Color(0.6, 0.8, 1)));
+ create_material("joint_body_b_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint_body_b", Color(0.6, 0.9, 1)));
+
+ update_timer = memnew(Timer);
+ update_timer->set_name("JointGizmoUpdateTimer");
+ update_timer->set_wait_time(1.0 / 120.0);
+ update_timer->connect("timeout", callable_mp(this, &Joint3DGizmoPlugin::incremental_update_gizmos));
+ update_timer->set_autostart(true);
+ EditorNode::get_singleton()->call_deferred("add_child", update_timer);
+}
+
+void Joint3DGizmoPlugin::incremental_update_gizmos() {
+ if (!current_gizmos.empty()) {
+ update_idx++;
+ update_idx = update_idx % current_gizmos.size();
+ redraw(current_gizmos[update_idx]);
+ }
+}
+
+bool Joint3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ return Object::cast_to<Joint3D>(p_spatial) != nullptr;
+}
+
+String Joint3DGizmoPlugin::get_name() const {
+ return "Joint3D";
+}
+
+int Joint3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+void Joint3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ Joint3D *joint = Object::cast_to<Joint3D>(p_gizmo->get_spatial_node());
+
+ p_gizmo->clear();
+
+ Node3D *node_body_a = nullptr;
+ if (!joint->get_node_a().is_empty()) {
+ node_body_a = Object::cast_to<Node3D>(joint->get_node(joint->get_node_a()));
+ }
+
+ Node3D *node_body_b = nullptr;
+ if (!joint->get_node_b().is_empty()) {
+ node_body_b = Object::cast_to<Node3D>(joint->get_node(joint->get_node_b()));
+ }
+
+ if (!node_body_a && !node_body_b) {
+ return;
+ }
+
+ Ref<Material> common_material = get_material("joint_material", p_gizmo);
+ Ref<Material> body_a_material = get_material("joint_body_a_material", p_gizmo);
+ Ref<Material> body_b_material = get_material("joint_body_b_material", p_gizmo);
+
+ Vector<Vector3> points;
+ Vector<Vector3> body_a_points;
+ Vector<Vector3> body_b_points;
+
+ if (Object::cast_to<PinJoint3D>(joint)) {
+ CreatePinJointGizmo(Transform(), points);
+ p_gizmo->add_collision_segments(points);
+ p_gizmo->add_lines(points, common_material);
+ }
+
+ HingeJoint3D *hinge = Object::cast_to<HingeJoint3D>(joint);
+ if (hinge) {
+ CreateHingeJointGizmo(
+ Transform(),
+ hinge->get_global_transform(),
+ node_body_a ? node_body_a->get_global_transform() : Transform(),
+ node_body_b ? node_body_b->get_global_transform() : Transform(),
+ hinge->get_param(HingeJoint3D::PARAM_LIMIT_LOWER),
+ hinge->get_param(HingeJoint3D::PARAM_LIMIT_UPPER),
+ hinge->get_flag(HingeJoint3D::FLAG_USE_LIMIT),
+ points,
+ node_body_a ? &body_a_points : nullptr,
+ node_body_b ? &body_b_points : nullptr);
+
+ p_gizmo->add_collision_segments(points);
+ p_gizmo->add_collision_segments(body_a_points);
+ p_gizmo->add_collision_segments(body_b_points);
+
+ p_gizmo->add_lines(points, common_material);
+ p_gizmo->add_lines(body_a_points, body_a_material);
+ p_gizmo->add_lines(body_b_points, body_b_material);
+ }
+
+ SliderJoint3D *slider = Object::cast_to<SliderJoint3D>(joint);
+ if (slider) {
+ CreateSliderJointGizmo(
+ Transform(),
+ slider->get_global_transform(),
+ node_body_a ? node_body_a->get_global_transform() : Transform(),
+ node_body_b ? node_body_b->get_global_transform() : Transform(),
+ slider->get_param(SliderJoint3D::PARAM_ANGULAR_LIMIT_LOWER),
+ slider->get_param(SliderJoint3D::PARAM_ANGULAR_LIMIT_UPPER),
+ slider->get_param(SliderJoint3D::PARAM_LINEAR_LIMIT_LOWER),
+ slider->get_param(SliderJoint3D::PARAM_LINEAR_LIMIT_UPPER),
+ points,
+ node_body_a ? &body_a_points : nullptr,
+ node_body_b ? &body_b_points : nullptr);
+
+ p_gizmo->add_collision_segments(points);
+ p_gizmo->add_collision_segments(body_a_points);
+ p_gizmo->add_collision_segments(body_b_points);
+
+ p_gizmo->add_lines(points, common_material);
+ p_gizmo->add_lines(body_a_points, body_a_material);
+ p_gizmo->add_lines(body_b_points, body_b_material);
+ }
+
+ ConeTwistJoint3D *cone = Object::cast_to<ConeTwistJoint3D>(joint);
+ if (cone) {
+ CreateConeTwistJointGizmo(
+ Transform(),
+ cone->get_global_transform(),
+ node_body_a ? node_body_a->get_global_transform() : Transform(),
+ node_body_b ? node_body_b->get_global_transform() : Transform(),
+ cone->get_param(ConeTwistJoint3D::PARAM_SWING_SPAN),
+ cone->get_param(ConeTwistJoint3D::PARAM_TWIST_SPAN),
+ node_body_a ? &body_a_points : nullptr,
+ node_body_b ? &body_b_points : nullptr);
+
+ p_gizmo->add_collision_segments(body_a_points);
+ p_gizmo->add_collision_segments(body_b_points);
+
+ p_gizmo->add_lines(body_a_points, body_a_material);
+ p_gizmo->add_lines(body_b_points, body_b_material);
+ }
+
+ Generic6DOFJoint3D *gen = Object::cast_to<Generic6DOFJoint3D>(joint);
+ if (gen) {
+ CreateGeneric6DOFJointGizmo(
+ Transform(),
+ gen->get_global_transform(),
+ node_body_a ? node_body_a->get_global_transform() : Transform(),
+ node_body_b ? node_body_b->get_global_transform() : Transform(),
+
+ gen->get_param_x(Generic6DOFJoint3D::PARAM_ANGULAR_LOWER_LIMIT),
+ gen->get_param_x(Generic6DOFJoint3D::PARAM_ANGULAR_UPPER_LIMIT),
+ gen->get_param_x(Generic6DOFJoint3D::PARAM_LINEAR_LOWER_LIMIT),
+ gen->get_param_x(Generic6DOFJoint3D::PARAM_LINEAR_UPPER_LIMIT),
+ gen->get_flag_x(Generic6DOFJoint3D::FLAG_ENABLE_ANGULAR_LIMIT),
+ gen->get_flag_x(Generic6DOFJoint3D::FLAG_ENABLE_LINEAR_LIMIT),
+
+ gen->get_param_y(Generic6DOFJoint3D::PARAM_ANGULAR_LOWER_LIMIT),
+ gen->get_param_y(Generic6DOFJoint3D::PARAM_ANGULAR_UPPER_LIMIT),
+ gen->get_param_y(Generic6DOFJoint3D::PARAM_LINEAR_LOWER_LIMIT),
+ gen->get_param_y(Generic6DOFJoint3D::PARAM_LINEAR_UPPER_LIMIT),
+ gen->get_flag_y(Generic6DOFJoint3D::FLAG_ENABLE_ANGULAR_LIMIT),
+ gen->get_flag_y(Generic6DOFJoint3D::FLAG_ENABLE_LINEAR_LIMIT),
+
+ gen->get_param_z(Generic6DOFJoint3D::PARAM_ANGULAR_LOWER_LIMIT),
+ gen->get_param_z(Generic6DOFJoint3D::PARAM_ANGULAR_UPPER_LIMIT),
+ gen->get_param_z(Generic6DOFJoint3D::PARAM_LINEAR_LOWER_LIMIT),
+ gen->get_param_z(Generic6DOFJoint3D::PARAM_LINEAR_UPPER_LIMIT),
+ gen->get_flag_z(Generic6DOFJoint3D::FLAG_ENABLE_ANGULAR_LIMIT),
+ gen->get_flag_z(Generic6DOFJoint3D::FLAG_ENABLE_LINEAR_LIMIT),
+
+ points,
+ node_body_a ? &body_a_points : nullptr,
+ node_body_a ? &body_b_points : nullptr);
+
+ p_gizmo->add_collision_segments(points);
+ p_gizmo->add_collision_segments(body_a_points);
+ p_gizmo->add_collision_segments(body_b_points);
+
+ p_gizmo->add_lines(points, common_material);
+ p_gizmo->add_lines(body_a_points, body_a_material);
+ p_gizmo->add_lines(body_b_points, body_b_material);
+ }
+}
+
+void Joint3DGizmoPlugin::CreatePinJointGizmo(const Transform &p_offset, Vector<Vector3> &r_cursor_points) {
+ float cs = 0.25;
+
+ r_cursor_points.push_back(p_offset.translated(Vector3(+cs, 0, 0)).origin);
+ r_cursor_points.push_back(p_offset.translated(Vector3(-cs, 0, 0)).origin);
+ r_cursor_points.push_back(p_offset.translated(Vector3(0, +cs, 0)).origin);
+ r_cursor_points.push_back(p_offset.translated(Vector3(0, -cs, 0)).origin);
+ r_cursor_points.push_back(p_offset.translated(Vector3(0, 0, +cs)).origin);
+ r_cursor_points.push_back(p_offset.translated(Vector3(0, 0, -cs)).origin);
+}
+
+void Joint3DGizmoPlugin::CreateHingeJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_limit_lower, real_t p_limit_upper, bool p_use_limit, Vector<Vector3> &r_common_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) {
+ r_common_points.push_back(p_offset.translated(Vector3(0, 0, 0.5)).origin);
+ r_common_points.push_back(p_offset.translated(Vector3(0, 0, -0.5)).origin);
+
+ if (!p_use_limit) {
+ p_limit_upper = -1;
+ p_limit_lower = 0;
+ }
+
+ if (r_body_a_points) {
+ JointGizmosDrawer::draw_circle(Vector3::AXIS_Z,
+ BODY_A_RADIUS,
+ p_offset,
+ JointGizmosDrawer::look_body_toward_z(p_trs_joint, p_trs_body_a),
+ p_limit_lower,
+ p_limit_upper,
+ *r_body_a_points);
+ }
+
+ if (r_body_b_points) {
+ JointGizmosDrawer::draw_circle(Vector3::AXIS_Z,
+ BODY_B_RADIUS,
+ p_offset,
+ JointGizmosDrawer::look_body_toward_z(p_trs_joint, p_trs_body_b),
+ p_limit_lower,
+ p_limit_upper,
+ *r_body_b_points);
+ }
+}
+
+void Joint3DGizmoPlugin::CreateSliderJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_angular_limit_lower, real_t p_angular_limit_upper, real_t p_linear_limit_lower, real_t p_linear_limit_upper, Vector<Vector3> &r_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) {
+ p_linear_limit_lower = -p_linear_limit_lower;
+ p_linear_limit_upper = -p_linear_limit_upper;
+
+ float cs = 0.25;
+ r_points.push_back(p_offset.translated(Vector3(0, 0, 0.5)).origin);
+ r_points.push_back(p_offset.translated(Vector3(0, 0, -0.5)).origin);
+
+ if (p_linear_limit_lower >= p_linear_limit_upper) {
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, 0, 0)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, 0, 0)).origin);
+
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, -cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, -cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, -cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, -cs)).origin);
+
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, -cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, -cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, -cs)).origin);
+ r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, -cs)).origin);
+
+ } else {
+ r_points.push_back(p_offset.translated(Vector3(+cs * 2, 0, 0)).origin);
+ r_points.push_back(p_offset.translated(Vector3(-cs * 2, 0, 0)).origin);
+ }
+
+ if (r_body_a_points) {
+ JointGizmosDrawer::draw_circle(
+ Vector3::AXIS_X,
+ BODY_A_RADIUS,
+ p_offset,
+ JointGizmosDrawer::look_body_toward(Vector3::AXIS_X, p_trs_joint, p_trs_body_a),
+ p_angular_limit_lower,
+ p_angular_limit_upper,
+ *r_body_a_points);
+ }
+
+ if (r_body_b_points) {
+ JointGizmosDrawer::draw_circle(
+ Vector3::AXIS_X,
+ BODY_B_RADIUS,
+ p_offset,
+ JointGizmosDrawer::look_body_toward(Vector3::AXIS_X, p_trs_joint, p_trs_body_b),
+ p_angular_limit_lower,
+ p_angular_limit_upper,
+ *r_body_b_points,
+ true);
+ }
+}
+
+void Joint3DGizmoPlugin::CreateConeTwistJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_swing, real_t p_twist, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) {
+ if (r_body_a_points) {
+ JointGizmosDrawer::draw_cone(
+ p_offset,
+ JointGizmosDrawer::look_body(p_trs_joint, p_trs_body_a),
+ p_swing,
+ p_twist,
+ *r_body_a_points);
+ }
+
+ if (r_body_b_points) {
+ JointGizmosDrawer::draw_cone(
+ p_offset,
+ JointGizmosDrawer::look_body(p_trs_joint, p_trs_body_b),
+ p_swing,
+ p_twist,
+ *r_body_b_points);
+ }
+}
+
+void Joint3DGizmoPlugin::CreateGeneric6DOFJointGizmo(
+ const Transform &p_offset,
+ const Transform &p_trs_joint,
+ const Transform &p_trs_body_a,
+ const Transform &p_trs_body_b,
+ real_t p_angular_limit_lower_x,
+ real_t p_angular_limit_upper_x,
+ real_t p_linear_limit_lower_x,
+ real_t p_linear_limit_upper_x,
+ bool p_enable_angular_limit_x,
+ bool p_enable_linear_limit_x,
+ real_t p_angular_limit_lower_y,
+ real_t p_angular_limit_upper_y,
+ real_t p_linear_limit_lower_y,
+ real_t p_linear_limit_upper_y,
+ bool p_enable_angular_limit_y,
+ bool p_enable_linear_limit_y,
+ real_t p_angular_limit_lower_z,
+ real_t p_angular_limit_upper_z,
+ real_t p_linear_limit_lower_z,
+ real_t p_linear_limit_upper_z,
+ bool p_enable_angular_limit_z,
+ bool p_enable_linear_limit_z,
+ Vector<Vector3> &r_points,
+ Vector<Vector3> *r_body_a_points,
+ Vector<Vector3> *r_body_b_points) {
+ float cs = 0.25;
+
+ for (int ax = 0; ax < 3; ax++) {
+ float ll = 0;
+ float ul = 0;
+ float lll = 0;
+ float lul = 0;
+
+ int a1 = 0;
+ int a2 = 0;
+ int a3 = 0;
+ bool enable_ang = false;
+ bool enable_lin = false;
+
+ switch (ax) {
+ case 0:
+ ll = p_angular_limit_lower_x;
+ ul = p_angular_limit_upper_x;
+ lll = -p_linear_limit_lower_x;
+ lul = -p_linear_limit_upper_x;
+ enable_ang = p_enable_angular_limit_x;
+ enable_lin = p_enable_linear_limit_x;
+ a1 = 0;
+ a2 = 1;
+ a3 = 2;
+ break;
+ case 1:
+ ll = p_angular_limit_lower_y;
+ ul = p_angular_limit_upper_y;
+ lll = -p_linear_limit_lower_y;
+ lul = -p_linear_limit_upper_y;
+ enable_ang = p_enable_angular_limit_y;
+ enable_lin = p_enable_linear_limit_y;
+ a1 = 1;
+ a2 = 2;
+ a3 = 0;
+ break;
+ case 2:
+ ll = p_angular_limit_lower_z;
+ ul = p_angular_limit_upper_z;
+ lll = -p_linear_limit_lower_z;
+ lul = -p_linear_limit_upper_z;
+ enable_ang = p_enable_angular_limit_z;
+ enable_lin = p_enable_linear_limit_z;
+ a1 = 2;
+ a2 = 0;
+ a3 = 1;
+ break;
+ }
+
+#define ADD_VTX(x, y, z) \
+ { \
+ Vector3 v; \
+ v[a1] = (x); \
+ v[a2] = (y); \
+ v[a3] = (z); \
+ r_points.push_back(p_offset.translated(v).origin); \
+ }
+
+ if (enable_lin && lll >= lul) {
+ ADD_VTX(lul, 0, 0);
+ ADD_VTX(lll, 0, 0);
+
+ ADD_VTX(lul, -cs, -cs);
+ ADD_VTX(lul, -cs, cs);
+ ADD_VTX(lul, -cs, cs);
+ ADD_VTX(lul, cs, cs);
+ ADD_VTX(lul, cs, cs);
+ ADD_VTX(lul, cs, -cs);
+ ADD_VTX(lul, cs, -cs);
+ ADD_VTX(lul, -cs, -cs);
+
+ ADD_VTX(lll, -cs, -cs);
+ ADD_VTX(lll, -cs, cs);
+ ADD_VTX(lll, -cs, cs);
+ ADD_VTX(lll, cs, cs);
+ ADD_VTX(lll, cs, cs);
+ ADD_VTX(lll, cs, -cs);
+ ADD_VTX(lll, cs, -cs);
+ ADD_VTX(lll, -cs, -cs);
+
+ } else {
+ ADD_VTX(+cs * 2, 0, 0);
+ ADD_VTX(-cs * 2, 0, 0);
+ }
+
+ if (!enable_ang) {
+ ll = 0;
+ ul = -1;
+ }
+
+ if (r_body_a_points) {
+ JointGizmosDrawer::draw_circle(
+ static_cast<Vector3::Axis>(ax),
+ BODY_A_RADIUS,
+ p_offset,
+ JointGizmosDrawer::look_body_toward(static_cast<Vector3::Axis>(ax), p_trs_joint, p_trs_body_a),
+ ll,
+ ul,
+ *r_body_a_points,
+ true);
+ }
+
+ if (r_body_b_points) {
+ JointGizmosDrawer::draw_circle(
+ static_cast<Vector3::Axis>(ax),
+ BODY_B_RADIUS,
+ p_offset,
+ JointGizmosDrawer::look_body_toward(static_cast<Vector3::Axis>(ax), p_trs_joint, p_trs_body_b),
+ ll,
+ ul,
+ *r_body_b_points);
+ }
+ }
+
+#undef ADD_VTX
+}
diff --git a/editor/node_3d_editor_gizmos.h b/editor/node_3d_editor_gizmos.h
new file mode 100644
index 0000000000..c7aae39a45
--- /dev/null
+++ b/editor/node_3d_editor_gizmos.h
@@ -0,0 +1,451 @@
+/*************************************************************************/
+/* node_3d_editor_gizmos.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SPATIAL_EDITOR_GIZMOS_H
+#define SPATIAL_EDITOR_GIZMOS_H
+
+#include "editor/plugins/node_3d_editor_plugin.h"
+#include "scene/3d/camera_3d.h"
+
+class Camera3D;
+
+class Light3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(Light3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ Light3DGizmoPlugin();
+};
+
+class AudioStreamPlayer3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(AudioStreamPlayer3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ AudioStreamPlayer3DGizmoPlugin();
+};
+
+class Camera3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(Camera3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ Camera3DGizmoPlugin();
+};
+
+class MeshInstance3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(MeshInstance3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ bool can_be_hidden() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ MeshInstance3DGizmoPlugin();
+};
+
+class Sprite3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(Sprite3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ bool can_be_hidden() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ Sprite3DGizmoPlugin();
+};
+
+class Position3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(Position3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+ Ref<ArrayMesh> pos3d_mesh;
+ Vector<Vector3> cursor_points;
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ Position3DGizmoPlugin();
+};
+
+class Skeleton3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(Skeleton3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ Skeleton3DGizmoPlugin();
+};
+
+class PhysicalBone3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(PhysicalBone3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ PhysicalBone3DGizmoPlugin();
+};
+
+class RayCast3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(RayCast3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ RayCast3DGizmoPlugin();
+};
+
+class SpringArm3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(SpringArm3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ SpringArm3DGizmoPlugin();
+};
+
+class VehicleWheel3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(VehicleWheel3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ VehicleWheel3DGizmoPlugin();
+};
+
+class SoftBody3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(SoftBody3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ bool is_selectable_when_hidden() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) override;
+ bool is_handle_highlighted(const EditorNode3DGizmo *p_gizmo, int idx) const override;
+
+ SoftBody3DGizmoPlugin();
+};
+
+class VisibilityNotifier3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(VisibilityNotifier3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ VisibilityNotifier3DGizmoPlugin();
+};
+
+class CPUParticles3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(CPUParticles3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ bool is_selectable_when_hidden() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+ CPUParticles3DGizmoPlugin();
+};
+
+class GPUParticles3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(GPUParticles3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ bool is_selectable_when_hidden() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ GPUParticles3DGizmoPlugin();
+};
+
+class ReflectionProbeGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(ReflectionProbeGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ ReflectionProbeGizmoPlugin();
+};
+
+class DecalGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(DecalGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ DecalGizmoPlugin();
+};
+
+class GIProbeGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(GIProbeGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ GIProbeGizmoPlugin();
+};
+
+class BakedLightmapGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(BakedLightmapGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ BakedLightmapGizmoPlugin();
+};
+
+class LightmapProbeGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(LightmapProbeGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ LightmapProbeGizmoPlugin();
+};
+
+class CollisionShape3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(CollisionShape3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const override;
+ void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ CollisionShape3DGizmoPlugin();
+};
+
+class CollisionPolygon3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(CollisionPolygon3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+ CollisionPolygon3DGizmoPlugin();
+};
+
+class NavigationRegion3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(NavigationRegion3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+ struct _EdgeKey {
+ Vector3 from;
+ Vector3 to;
+
+ bool operator<(const _EdgeKey &p_with) const { return from == p_with.from ? to < p_with.to : from < p_with.from; }
+ };
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ NavigationRegion3DGizmoPlugin();
+};
+
+class JointGizmosDrawer {
+public:
+ static Basis look_body(const Transform &p_joint_transform, const Transform &p_body_transform);
+ static Basis look_body_toward(Vector3::Axis p_axis, const Transform &joint_transform, const Transform &body_transform);
+ static Basis look_body_toward_x(const Transform &p_joint_transform, const Transform &p_body_transform);
+ static Basis look_body_toward_y(const Transform &p_joint_transform, const Transform &p_body_transform);
+ /// Special function just used for physics joints, it returns a basis constrained toward Joint Z axis
+ /// with axis X and Y that are looking toward the body and oriented toward up
+ static Basis look_body_toward_z(const Transform &p_joint_transform, const Transform &p_body_transform);
+
+ // Draw circle around p_axis
+ static void draw_circle(Vector3::Axis p_axis, real_t p_radius, const Transform &p_offset, const Basis &p_base, real_t p_limit_lower, real_t p_limit_upper, Vector<Vector3> &r_points, bool p_inverse = false);
+ static void draw_cone(const Transform &p_offset, const Basis &p_base, real_t p_swing, real_t p_twist, Vector<Vector3> &r_points);
+};
+
+class Joint3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(Joint3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+ Timer *update_timer;
+ uint64_t update_idx = 0;
+
+ void incremental_update_gizmos();
+
+public:
+ bool has_gizmo(Node3D *p_spatial) override;
+ String get_name() const override;
+ int get_priority() const override;
+ void redraw(EditorNode3DGizmo *p_gizmo) override;
+
+ static void CreatePinJointGizmo(const Transform &p_offset, Vector<Vector3> &r_cursor_points);
+ static void CreateHingeJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_limit_lower, real_t p_limit_upper, bool p_use_limit, Vector<Vector3> &r_common_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points);
+ static void CreateSliderJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_angular_limit_lower, real_t p_angular_limit_upper, real_t p_linear_limit_lower, real_t p_linear_limit_upper, Vector<Vector3> &r_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points);
+ static void CreateConeTwistJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_swing, real_t p_twist, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points);
+ static void CreateGeneric6DOFJointGizmo(
+ const Transform &p_offset,
+ const Transform &p_trs_joint,
+ const Transform &p_trs_body_a,
+ const Transform &p_trs_body_b,
+ real_t p_angular_limit_lower_x,
+ real_t p_angular_limit_upper_x,
+ real_t p_linear_limit_lower_x,
+ real_t p_linear_limit_upper_x,
+ bool p_enable_angular_limit_x,
+ bool p_enable_linear_limit_x,
+ real_t p_angular_limit_lower_y,
+ real_t p_angular_limit_upper_y,
+ real_t p_linear_limit_lower_y,
+ real_t p_linear_limit_upper_y,
+ bool p_enable_angular_limit_y,
+ bool p_enable_linear_limit_y,
+ real_t p_angular_limit_lower_z,
+ real_t p_angular_limit_upper_z,
+ real_t p_linear_limit_lower_z,
+ real_t p_linear_limit_upper_z,
+ bool p_enable_angular_limit_z,
+ bool p_enable_linear_limit_z,
+ Vector<Vector3> &r_points,
+ Vector<Vector3> *r_body_a_points,
+ Vector<Vector3> *r_body_b_points);
+
+ Joint3DGizmoPlugin();
+};
+
+#endif // SPATIAL_EDITOR_GIZMOS_H
diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp
index c53c5f330b..2c89517008 100644
--- a/editor/node_dock.cpp
+++ b/editor/node_dock.cpp
@@ -34,7 +34,6 @@
#include "editor_scale.h"
void NodeDock::show_groups() {
-
groups_button->set_pressed(true);
connections_button->set_pressed(false);
groups->show();
@@ -42,7 +41,6 @@ void NodeDock::show_groups() {
}
void NodeDock::show_connections() {
-
groups_button->set_pressed(false);
connections_button->set_pressed(true);
groups->hide();
@@ -50,36 +48,31 @@ void NodeDock::show_connections() {
}
void NodeDock::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("show_groups"), &NodeDock::show_groups);
- ClassDB::bind_method(D_METHOD("show_connections"), &NodeDock::show_connections);
}
void NodeDock::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- connections_button->set_icon(get_icon("Signals", "EditorIcons"));
- groups_button->set_icon(get_icon("Groups", "EditorIcons"));
+ connections_button->set_icon(get_theme_icon("Signals", "EditorIcons"));
+ groups_button->set_icon(get_theme_icon("Groups", "EditorIcons"));
}
}
-NodeDock *NodeDock::singleton = NULL;
+NodeDock *NodeDock::singleton = nullptr;
void NodeDock::update_lists() {
-
connections->update_tree();
}
void NodeDock::set_node(Node *p_node) {
-
connections->set_node(p_node);
groups->set_current(p_node);
if (p_node) {
- if (connections_button->is_pressed())
+ if (connections_button->is_pressed()) {
connections->show();
- else
+ } else {
groups->show();
+ }
mode_hb->show();
select_a_node->hide();
@@ -92,7 +85,6 @@ void NodeDock::set_node(Node *p_node) {
}
NodeDock::NodeDock() {
-
singleton = this;
set_name("Node");
@@ -100,23 +92,25 @@ NodeDock::NodeDock() {
add_child(mode_hb);
mode_hb->hide();
- connections_button = memnew(ToolButton);
+ connections_button = memnew(Button);
+ connections_button->set_flat(true);
connections_button->set_text(TTR("Signals"));
connections_button->set_toggle_mode(true);
connections_button->set_pressed(true);
connections_button->set_h_size_flags(SIZE_EXPAND_FILL);
connections_button->set_clip_text(true);
mode_hb->add_child(connections_button);
- connections_button->connect("pressed", this, "show_connections");
+ connections_button->connect("pressed", callable_mp(this, &NodeDock::show_connections));
- groups_button = memnew(ToolButton);
+ groups_button = memnew(Button);
+ groups_button->set_flat(true);
groups_button->set_text(TTR("Groups"));
groups_button->set_toggle_mode(true);
groups_button->set_pressed(false);
groups_button->set_h_size_flags(SIZE_EXPAND_FILL);
groups_button->set_clip_text(true);
mode_hb->add_child(groups_button);
- groups_button->connect("pressed", this, "show_groups");
+ groups_button->connect("pressed", callable_mp(this, &NodeDock::show_groups));
connections = memnew(ConnectionsDock(EditorNode::get_singleton()));
connections->set_undoredo(EditorNode::get_undo_redo());
diff --git a/editor/node_dock.h b/editor/node_dock.h
index ae33c5b9a5..8e10db5eb3 100644
--- a/editor/node_dock.h
+++ b/editor/node_dock.h
@@ -35,11 +35,10 @@
#include "groups_editor.h"
class NodeDock : public VBoxContainer {
-
GDCLASS(NodeDock, VBoxContainer);
- ToolButton *connections_button;
- ToolButton *groups_button;
+ Button *connections_button;
+ Button *groups_button;
ConnectionsDock *connections;
GroupsEditor *groups;
diff --git a/editor/pane_drag.cpp b/editor/pane_drag.cpp
deleted file mode 100644
index eef4db456c..0000000000
--- a/editor/pane_drag.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*************************************************************************/
-/* pane_drag.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "pane_drag.h"
-
-void PaneDrag::_gui_input(const Ref<InputEvent> &p_input) {
-
- Ref<InputEventMouseMotion> mm = p_input;
- if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
-
- emit_signal("dragged", Point2(mm->get_relative().x, mm->get_relative().y));
- }
-}
-
-void PaneDrag::_notification(int p_what) {
-
- switch (p_what) {
-
- case NOTIFICATION_DRAW: {
-
- Ref<Texture> icon = mouse_over ? get_icon("PaneDragHover", "EditorIcons") : get_icon("PaneDrag", "EditorIcons");
- if (!icon.is_null())
- icon->draw(get_canvas_item(), Point2(0, 0));
-
- } break;
- case NOTIFICATION_MOUSE_ENTER:
- mouse_over = true;
- update();
- break;
- case NOTIFICATION_MOUSE_EXIT:
- mouse_over = false;
- update();
- break;
- }
-}
-Size2 PaneDrag::get_minimum_size() const {
-
- Ref<Texture> icon = get_icon("PaneDrag", "EditorIcons");
- if (!icon.is_null())
- return icon->get_size();
- return Size2();
-}
-
-void PaneDrag::_bind_methods() {
-
- ClassDB::bind_method("_gui_input", &PaneDrag::_gui_input);
- ADD_SIGNAL(MethodInfo("dragged", PropertyInfo(Variant::VECTOR2, "amount")));
-}
-
-PaneDrag::PaneDrag() {
-
- mouse_over = false;
-}
diff --git a/editor/pane_drag.h b/editor/pane_drag.h
deleted file mode 100644
index 7e66bb429f..0000000000
--- a/editor/pane_drag.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*************************************************************************/
-/* pane_drag.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef PANE_DRAG_H
-#define PANE_DRAG_H
-
-#include "scene/gui/control.h"
-
-class PaneDrag : public Control {
-
- GDCLASS(PaneDrag, Control);
-
- bool mouse_over;
-
-protected:
- void _gui_input(const Ref<InputEvent> &p_input);
- void _notification(int p_what);
- virtual Size2 get_minimum_size() const;
- static void _bind_methods();
-
-public:
- PaneDrag();
-};
-
-#endif // PANE_DRAG_H
diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp
index 07b87633a9..3ad6938498 100644
--- a/editor/plugin_config_dialog.cpp
+++ b/editor/plugin_config_dialog.cpp
@@ -35,9 +35,13 @@
#include "editor/editor_plugin.h"
#include "editor/editor_scale.h"
#include "editor/project_settings_editor.h"
-#include "modules/gdscript/gdscript.h"
#include "scene/gui/grid_container.h"
+#include "modules/modules_enabled.gen.h"
+#ifdef MODULE_GDSCRIPT_ENABLED
+#include "modules/gdscript/gdscript.h"
+#endif
+
void PluginConfigDialog::_clear_fields() {
name_edit->set_text("");
subfolder_edit->set_text("");
@@ -48,13 +52,13 @@ void PluginConfigDialog::_clear_fields() {
}
void PluginConfigDialog::_on_confirmed() {
-
String path = "res://addons/" + subfolder_edit->get_text();
if (!_edit_mode) {
DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
- if (!d || d->make_dir_recursive(path) != OK)
+ if (!d || d->make_dir_recursive(path) != OK) {
return;
+ }
}
Ref<ConfigFile> cf = memnew(ConfigFile);
@@ -75,6 +79,9 @@ void PluginConfigDialog::_on_confirmed() {
// TODO Use script templates. Right now, this code won't add the 'tool' annotation to other languages.
// TODO Better support script languages with named classes (has_named_classes).
+ // FIXME: It's hacky to have hardcoded access to the GDScript module here.
+ // The editor code should not have to know what languages are enabled.
+#ifdef MODULE_GDSCRIPT_ENABLED
if (lang_name == GDScriptLanguage::get_singleton()->get_name()) {
// Hard-coded GDScript template to keep usability until we use script templates.
Ref<Script> gdscript = memnew(GDScript);
@@ -95,12 +102,15 @@ void PluginConfigDialog::_on_confirmed() {
ResourceSaver::save(script_path, gdscript);
script = gdscript;
} else {
+#endif
String script_path = path.plus_file(script_edit->get_text());
String class_name = script_path.get_file().get_basename();
script = ScriptServer::get_language(lang_idx)->get_template(class_name, "EditorPlugin");
script->set_path(script_path);
ResourceSaver::save(script_path, script);
+#ifdef MODULE_GDSCRIPT_ENABLED
}
+#endif
emit_signal("plugin_ready", script.operator->(), active_edit->is_pressed() ? subfolder_edit->get_text() : "");
} else {
@@ -121,13 +131,14 @@ void PluginConfigDialog::_on_required_text_changed(const String &) {
void PluginConfigDialog::_notification(int p_what) {
switch (p_what) {
- case NOTIFICATION_READY: {
- connect("confirmed", this, "_on_confirmed");
- get_cancel()->connect("pressed", this, "_on_cancelled");
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (is_visible()) {
+ name_edit->grab_focus();
+ }
} break;
-
- case NOTIFICATION_POST_POPUP: {
- name_edit->grab_focus();
+ case NOTIFICATION_READY: {
+ connect("confirmed", callable_mp(this, &PluginConfigDialog::_on_confirmed));
+ get_cancel()->connect("pressed", callable_mp(this, &PluginConfigDialog::_on_cancelled));
} break;
}
}
@@ -165,9 +176,6 @@ void PluginConfigDialog::config(const String &p_config_path) {
}
void PluginConfigDialog::_bind_methods() {
- ClassDB::bind_method("_on_required_text_changed", &PluginConfigDialog::_on_required_text_changed);
- ClassDB::bind_method("_on_confirmed", &PluginConfigDialog::_on_confirmed);
- ClassDB::bind_method("_on_cancelled", &PluginConfigDialog::_on_cancelled);
ADD_SIGNAL(MethodInfo("plugin_ready", PropertyInfo(Variant::STRING, "script_path", PROPERTY_HINT_NONE, ""), PropertyInfo(Variant::STRING, "activate_name")));
}
@@ -184,7 +192,7 @@ PluginConfigDialog::PluginConfigDialog() {
grid->add_child(name_lb);
name_edit = memnew(LineEdit);
- name_edit->connect("text_changed", this, "_on_required_text_changed");
+ name_edit->connect("text_changed", callable_mp(this, &PluginConfigDialog::_on_required_text_changed));
name_edit->set_placeholder("MyPlugin");
grid->add_child(name_edit);
@@ -229,9 +237,11 @@ PluginConfigDialog::PluginConfigDialog() {
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
ScriptLanguage *lang = ScriptServer::get_language(i);
script_option_edit->add_item(lang->get_name());
+#ifdef MODULE_GDSCRIPT_ENABLED
if (lang == GDScriptLanguage::get_singleton()) {
default_lang = i;
}
+#endif
}
script_option_edit->select(default_lang);
grid->add_child(script_option_edit);
@@ -241,7 +251,7 @@ PluginConfigDialog::PluginConfigDialog() {
grid->add_child(script_lb);
script_edit = memnew(LineEdit);
- script_edit->connect("text_changed", this, "_on_required_text_changed");
+ script_edit->connect("text_changed", callable_mp(this, &PluginConfigDialog::_on_required_text_changed));
script_edit->set_placeholder("\"plugin.gd\" -> res://addons/my_plugin/plugin.gd");
grid->add_child(script_edit);
diff --git a/editor/plugin_config_dialog.h b/editor/plugin_config_dialog.h
index fa148125bc..93c8c01c70 100644
--- a/editor/plugin_config_dialog.h
+++ b/editor/plugin_config_dialog.h
@@ -38,7 +38,6 @@
#include "scene/gui/text_edit.h"
class PluginConfigDialog : public ConfirmationDialog {
-
GDCLASS(PluginConfigDialog, ConfirmationDialog);
LineEdit *name_edit;
diff --git a/editor/plugins/SCsub b/editor/plugins/SCsub
index 2b1e889fb0..359d04e5df 100644
--- a/editor/plugins/SCsub
+++ b/editor/plugins/SCsub
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-Import('env')
+Import("env")
env.add_source_files(env.editor_sources, "*.cpp")
diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp
index c8a36a3a99..7a3fb1ff52 100644
--- a/editor/plugins/abstract_polygon_2d_editor.cpp
+++ b/editor/plugins/abstract_polygon_2d_editor.cpp
@@ -31,135 +31,89 @@
#include "abstract_polygon_2d_editor.h"
#include "canvas_item_editor_plugin.h"
+#include "core/math/geometry_2d.h"
#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
-AbstractPolygon2DEditor::Vertex::Vertex() :
- polygon(-1),
- vertex(-1) {
- // invalid vertex
-}
-
-AbstractPolygon2DEditor::Vertex::Vertex(int p_vertex) :
- polygon(-1),
- vertex(p_vertex) {
- // vertex p_vertex of current wip polygon
-}
-
-AbstractPolygon2DEditor::Vertex::Vertex(int p_polygon, int p_vertex) :
- polygon(p_polygon),
- vertex(p_vertex) {
- // vertex p_vertex of polygon p_polygon
-}
-
bool AbstractPolygon2DEditor::Vertex::operator==(const AbstractPolygon2DEditor::Vertex &p_vertex) const {
-
return polygon == p_vertex.polygon && vertex == p_vertex.vertex;
}
bool AbstractPolygon2DEditor::Vertex::operator!=(const AbstractPolygon2DEditor::Vertex &p_vertex) const {
-
return !(*this == p_vertex);
}
bool AbstractPolygon2DEditor::Vertex::valid() const {
-
return vertex >= 0;
}
-AbstractPolygon2DEditor::PosVertex::PosVertex() {
- // invalid vertex
-}
-
-AbstractPolygon2DEditor::PosVertex::PosVertex(const Vertex &p_vertex, const Vector2 &p_pos) :
- Vertex(p_vertex.polygon, p_vertex.vertex),
- pos(p_pos) {
-}
-
-AbstractPolygon2DEditor::PosVertex::PosVertex(int p_polygon, int p_vertex, const Vector2 &p_pos) :
- Vertex(p_polygon, p_vertex),
- pos(p_pos) {
-}
-
bool AbstractPolygon2DEditor::_is_empty() const {
-
- if (!_get_node())
+ if (!_get_node()) {
return true;
+ }
const int n = _get_polygon_count();
for (int i = 0; i < n; i++) {
-
Vector<Vector2> vertices = _get_polygon(i);
- if (vertices.size() != 0)
+ if (vertices.size() != 0) {
return false;
+ }
}
return true;
}
bool AbstractPolygon2DEditor::_is_line() const {
-
return false;
}
bool AbstractPolygon2DEditor::_has_uv() const {
-
return false;
}
int AbstractPolygon2DEditor::_get_polygon_count() const {
-
return 1;
}
Variant AbstractPolygon2DEditor::_get_polygon(int p_idx) const {
-
return _get_node()->get("polygon");
}
void AbstractPolygon2DEditor::_set_polygon(int p_idx, const Variant &p_polygon) const {
-
_get_node()->set("polygon", p_polygon);
}
void AbstractPolygon2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) {
-
Node2D *node = _get_node();
undo_redo->add_do_method(node, "set_polygon", p_polygon);
undo_redo->add_undo_method(node, "set_polygon", p_previous);
}
Vector2 AbstractPolygon2DEditor::_get_offset(int p_idx) const {
-
return Vector2(0, 0);
}
void AbstractPolygon2DEditor::_commit_action() {
-
undo_redo->add_do_method(canvas_item_editor, "update_viewport");
undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
undo_redo->commit_action();
}
void AbstractPolygon2DEditor::_action_add_polygon(const Variant &p_polygon) {
-
_action_set_polygon(0, p_polygon);
}
void AbstractPolygon2DEditor::_action_remove_polygon(int p_idx) {
-
- _action_set_polygon(p_idx, _get_polygon(p_idx), PoolVector<Vector2>());
+ _action_set_polygon(p_idx, _get_polygon(p_idx), Vector<Vector2>());
}
void AbstractPolygon2DEditor::_action_set_polygon(int p_idx, const Variant &p_polygon) {
-
_action_set_polygon(p_idx, _get_polygon(p_idx), p_polygon);
}
bool AbstractPolygon2DEditor::_has_resource() const {
-
return true;
}
@@ -167,18 +121,14 @@ void AbstractPolygon2DEditor::_create_resource() {
}
void AbstractPolygon2DEditor::_menu_option(int p_option) {
-
switch (p_option) {
-
case MODE_CREATE: {
-
mode = MODE_CREATE;
button_create->set_pressed(true);
button_edit->set_pressed(false);
button_delete->set_pressed(false);
} break;
case MODE_EDIT: {
-
_wip_close();
mode = MODE_EDIT;
button_create->set_pressed(false);
@@ -186,7 +136,6 @@ void AbstractPolygon2DEditor::_menu_option(int p_option) {
button_delete->set_pressed(false);
} break;
case MODE_DELETE: {
-
_wip_close();
mode = MODE_DELETE;
button_create->set_pressed(false);
@@ -197,28 +146,24 @@ void AbstractPolygon2DEditor::_menu_option(int p_option) {
}
void AbstractPolygon2DEditor::_notification(int p_what) {
-
switch (p_what) {
-
case NOTIFICATION_READY: {
-
disable_polygon_editing(false, String());
- button_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCreate", "EditorIcons"));
- button_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveEdit", "EditorIcons"));
- button_delete->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveDelete", "EditorIcons"));
+ button_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveCreate", "EditorIcons"));
+ button_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveEdit", "EditorIcons"));
+ button_delete->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveDelete", "EditorIcons"));
button_edit->set_pressed(true);
- get_tree()->connect("node_removed", this, "_node_removed");
- create_resource->connect("confirmed", this, "_create_resource");
+ get_tree()->connect("node_removed", callable_mp(this, &AbstractPolygon2DEditor::_node_removed));
+ create_resource->connect("confirmed", callable_mp(this, &AbstractPolygon2DEditor::_create_resource));
} break;
}
}
void AbstractPolygon2DEditor::_node_removed(Node *p_node) {
-
if (p_node == _get_node()) {
- edit(NULL);
+ edit(nullptr);
hide();
canvas_item_editor->update_viewport();
@@ -226,14 +171,12 @@ void AbstractPolygon2DEditor::_node_removed(Node *p_node) {
}
void AbstractPolygon2DEditor::_wip_changed() {
-
if (wip_active && _is_line()) {
_set_polygon(0, wip);
}
}
void AbstractPolygon2DEditor::_wip_cancel() {
-
wip.clear();
wip_active = false;
@@ -245,23 +188,21 @@ void AbstractPolygon2DEditor::_wip_cancel() {
}
void AbstractPolygon2DEditor::_wip_close() {
- if (!wip_active)
+ if (!wip_active) {
return;
+ }
if (_is_line()) {
-
_set_polygon(0, wip);
} else if (wip.size() >= (_is_line() ? 2 : 3)) {
-
undo_redo->create_action(TTR("Create Polygon"));
_action_add_polygon(wip);
if (_has_uv()) {
- undo_redo->add_do_method(_get_node(), "set_uv", PoolVector<Vector2>());
+ undo_redo->add_do_method(_get_node(), "set_uv", Vector<Vector2>());
undo_redo->add_undo_method(_get_node(), "set_uv", _get_node()->get("uv"));
}
_commit_action();
} else {
-
return;
}
@@ -279,7 +220,6 @@ void AbstractPolygon2DEditor::_wip_close() {
}
void AbstractPolygon2DEditor::disable_polygon_editing(bool p_disable, String p_reason) {
-
_polygon_editing_enabled = !p_disable;
button_create->set_disabled(p_disable);
@@ -287,12 +227,10 @@ void AbstractPolygon2DEditor::disable_polygon_editing(bool p_disable, String p_r
button_delete->set_disabled(p_disable);
if (p_disable) {
-
button_create->set_tooltip(p_reason);
button_edit->set_tooltip(p_reason);
button_delete->set_tooltip(p_reason);
} else {
-
button_create->set_tooltip(TTR("Create points."));
button_edit->set_tooltip(TTR("Edit points.\nLMB: Move Point\nRMB: Erase Point"));
button_delete->set_tooltip(TTR("Erase points."));
@@ -300,27 +238,26 @@ void AbstractPolygon2DEditor::disable_polygon_editing(bool p_disable, String p_r
}
bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
-
- if (!_get_node() || !_polygon_editing_enabled)
+ if (!_get_node() || !_polygon_editing_enabled) {
return false;
+ }
Ref<InputEventMouseButton> mb = p_event;
if (!_has_resource()) {
-
if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) {
create_resource->set_text(String("No polygon resource on this node.\nCreate and assign one?"));
- create_resource->popup_centered_minsize();
+ create_resource->popup_centered();
}
return (mb.is_valid() && mb->get_button_index() == 1);
}
CanvasItemEditor::Tool tool = CanvasItemEditor::get_singleton()->get_current_tool();
- if (tool != CanvasItemEditor::TOOL_SELECT)
+ if (tool != CanvasItemEditor::TOOL_SELECT) {
return false;
+ }
if (mb.is_valid()) {
-
Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
Vector2 gpoint = mb->get_position();
@@ -329,17 +266,16 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
if (mode == MODE_EDIT || (_is_line() && mode == MODE_CREATE)) {
if (mb->get_button_index() == BUTTON_LEFT) {
if (mb->is_pressed()) {
- if (mb->get_control() || mb->get_shift() || mb->get_alt())
+ if (mb->get_control() || mb->get_shift() || mb->get_alt()) {
return false;
+ }
const PosVertex insert = closest_edge_point(gpoint);
if (insert.valid()) {
-
Vector<Vector2> vertices = _get_polygon(insert.polygon);
if (vertices.size() < (_is_line() ? 2 : 3)) {
-
vertices.push_back(cpoint);
undo_redo->create_action(TTR("Edit Polygon"));
selected_point = Vertex(insert.polygon, vertices.size());
@@ -347,12 +283,11 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
_commit_action();
return true;
} else {
-
Vector<Vector2> vertices2 = _get_polygon(insert.polygon);
pre_move_edit = vertices2;
edited_point = PosVertex(insert.polygon, insert.vertex + 1, xform.affine_inverse().xform(insert.pos));
vertices2.insert(edited_point.vertex, edited_point.pos);
- selected_point = edited_point;
+ selected_point = Vertex(edited_point.polygon, edited_point.vertex);
edge_point = PosVertex();
undo_redo->create_action(TTR("Insert Point"));
@@ -361,12 +296,10 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
return true;
}
} else {
-
//look for points to move
const PosVertex closest = closest_point(gpoint);
if (closest.valid()) {
-
pre_move_edit = _get_polygon(closest.polygon);
edited_point = PosVertex(closest, xform.affine_inverse().xform(closest.pos));
selected_point = closest;
@@ -374,14 +307,11 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
canvas_item_editor->update_viewport();
return true;
} else {
-
selected_point = Vertex();
}
}
} else {
-
if (edited_point.valid()) {
-
//apply
Vector<Vector2> vertices = _get_polygon(edited_point.polygon);
@@ -397,23 +327,18 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
}
}
} else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && !edited_point.valid()) {
-
const PosVertex closest = closest_point(gpoint);
if (closest.valid()) {
-
remove_point(closest);
return true;
}
}
} else if (mode == MODE_DELETE) {
-
if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
-
const PosVertex closest = closest_point(gpoint);
if (closest.valid()) {
-
remove_point(closest);
return true;
}
@@ -421,11 +346,8 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
}
if (mode == MODE_CREATE) {
-
if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
-
if (_is_line()) {
-
// for lines, we don't have a wip mode, and we can undo each single add point.
Vector<Vector2> vertices = _get_polygon(0);
vertices.push_back(cpoint);
@@ -434,7 +356,6 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
_commit_action();
return true;
} else if (!wip_active) {
-
wip.clear();
wip.push_back(cpoint);
wip_active = true;
@@ -446,16 +367,14 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
edge_point = PosVertex();
return true;
} else {
-
const real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
- if (!_is_line() && wip.size() > 1 && xform.xform(wip[0]).distance_to(gpoint) < grab_threshold) {
+ if (!_is_line() && wip.size() > 1 && xform.xform(wip[0]).distance_to(xform.xform(cpoint)) < grab_threshold) {
//wip closed
_wip_close();
return true;
} else {
-
//add wip point
wip.push_back(cpoint);
_wip_changed();
@@ -474,11 +393,9 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid()) {
-
Vector2 gpoint = mm->get_position();
if (edited_point.valid() && (wip_active || (mm->get_button_mask() & BUTTON_MASK_LEFT))) {
-
Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)));
//Move the point in a single axis. Should only work when editing a polygon and while holding shift.
@@ -494,7 +411,6 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
edited_point = PosVertex(edited_point, cpoint);
if (!wip_active) {
-
Vector<Vector2> vertices = _get_polygon(edited_point.polygon);
ERR_FAIL_INDEX_V(edited_point.vertex, vertices.size(), false);
vertices.write[edited_point.vertex] = cpoint - _get_offset(edited_point.polygon);
@@ -503,25 +419,20 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
canvas_item_editor->update_viewport();
} else if (mode == MODE_EDIT || (_is_line() && mode == MODE_CREATE)) {
-
const PosVertex onEdgeVertex = closest_edge_point(gpoint);
if (onEdgeVertex.valid()) {
-
hover_point = Vertex();
edge_point = onEdgeVertex;
canvas_item_editor->update_viewport();
} else {
-
if (edge_point.valid()) {
-
edge_point = PosVertex();
canvas_item_editor->update_viewport();
}
const PosVertex new_hover_point = closest_point(gpoint);
if (hover_point != new_hover_point) {
-
hover_point = new_hover_point;
canvas_item_editor->update_viewport();
}
@@ -532,13 +443,9 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_pressed()) {
-
- if (k->get_scancode() == KEY_DELETE || k->get_scancode() == KEY_BACKSPACE) {
-
+ if (k->get_keycode() == KEY_DELETE || k->get_keycode() == KEY_BACKSPACE) {
if (wip_active && selected_point.polygon == -1) {
-
if (wip.size() > selected_point.vertex) {
-
wip.remove(selected_point.vertex);
_wip_changed();
selected_point = wip.size() - 1;
@@ -546,19 +453,16 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
return true;
}
} else {
-
const Vertex active_point = get_active_point();
if (active_point.valid()) {
-
remove_point(active_point);
return true;
}
}
- } else if (wip_active && k->get_scancode() == KEY_ENTER) {
-
+ } else if (wip_active && k->get_keycode() == KEY_ENTER) {
_wip_close();
- } else if (wip_active && k->get_scancode() == KEY_ESCAPE) {
+ } else if (wip_active && k->get_keycode() == KEY_ESCAPE) {
_wip_cancel();
}
}
@@ -567,44 +471,41 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
}
void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
- if (!_get_node())
+ if (!_get_node()) {
return;
+ }
Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
// All polygon points are sharp, so use the sharp handle icon
- const Ref<Texture> handle = get_icon("EditorPathSharpHandle", "EditorIcons");
+ const Ref<Texture2D> handle = get_theme_icon("EditorPathSharpHandle", "EditorIcons");
const Vertex active_point = get_active_point();
const int n_polygons = _get_polygon_count();
const bool is_closed = !_is_line();
for (int j = -1; j < n_polygons; j++) {
-
- if (wip_active && wip_destructive && j != -1)
+ if (wip_active && wip_destructive && j != -1) {
continue;
+ }
- PoolVector<Vector2> points;
+ Vector<Vector2> points;
Vector2 offset;
if (wip_active && j == edited_point.polygon) {
-
points = Variant(wip);
offset = Vector2(0, 0);
} else {
-
- if (j == -1)
+ if (j == -1) {
continue;
+ }
points = _get_polygon(j);
offset = _get_offset(j);
}
if (!wip_active && j == edited_point.polygon && EDITOR_GET("editors/poly_editor/show_previous_outline")) {
-
const Color col = Color(0.5, 0.5, 0.5); // FIXME polygon->get_outline_color();
const int n = pre_move_edit.size();
for (int i = 0; i < n - (is_closed ? 0 : 1); i++) {
-
Vector2 p, p2;
p = pre_move_edit[i] + offset;
p2 = pre_move_edit[(i + 1) % n] + offset;
@@ -612,7 +513,7 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
Vector2 point = xform.xform(p);
Vector2 next_point = xform.xform(p2);
- p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE), true);
+ p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE));
}
}
@@ -620,28 +521,26 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
const Color col = Color(1, 0.3, 0.1, 0.8);
for (int i = 0; i < n_points; i++) {
-
const Vertex vertex(j, i);
const Vector2 p = (vertex == edited_point) ? edited_point.pos : (points[i] + offset);
const Vector2 point = xform.xform(p);
if (is_closed || i < n_points - 1) {
-
Vector2 p2;
if (j == edited_point.polygon &&
- ((wip_active && i == n_points - 1) || (((i + 1) % n_points) == edited_point.vertex)))
+ ((wip_active && i == n_points - 1) || (((i + 1) % n_points) == edited_point.vertex))) {
p2 = edited_point.pos;
- else
+ } else {
p2 = points[(i + 1) % n_points] + offset;
+ }
const Vector2 next_point = xform.xform(p2);
- p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE), true);
+ p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE));
}
}
for (int i = 0; i < n_points; i++) {
-
const Vertex vertex(j, i);
const Vector2 p = (vertex == edited_point) ? edited_point.pos : (points[i] + offset);
@@ -651,7 +550,7 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
p_overlay->draw_texture(handle, point - handle->get_size() * 0.5, modulate);
if (vertex == hover_point) {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
String num = String::num(vertex.vertex);
Size2 num_size = font->get_string_size(num);
p_overlay->draw_string(font, point - num_size * 0.5, num, Color(1.0, 1.0, 1.0, 0.5));
@@ -660,26 +559,25 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
}
if (edge_point.valid()) {
-
- Ref<Texture> add_handle = get_icon("EditorHandleAdd", "EditorIcons");
+ Ref<Texture2D> add_handle = get_theme_icon("EditorHandleAdd", "EditorIcons");
p_overlay->draw_texture(add_handle, edge_point.pos - add_handle->get_size() * 0.5);
}
}
void AbstractPolygon2DEditor::edit(Node *p_polygon) {
-
- if (!canvas_item_editor)
+ if (!canvas_item_editor) {
canvas_item_editor = CanvasItemEditor::get_singleton();
+ }
if (p_polygon) {
-
_set_node(p_polygon);
// Enable the pencil tool if the polygon is empty.
- if (_is_empty())
+ if (_is_empty()) {
_menu_option(MODE_CREATE);
- else
+ } else {
_menu_option(MODE_EDIT);
+ }
wip.clear();
wip_active = false;
@@ -689,51 +587,43 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) {
canvas_item_editor->update_viewport();
} else {
-
- _set_node(NULL);
+ _set_node(nullptr);
}
}
void AbstractPolygon2DEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_node_removed"), &AbstractPolygon2DEditor::_node_removed);
- ClassDB::bind_method(D_METHOD("_menu_option"), &AbstractPolygon2DEditor::_menu_option);
- ClassDB::bind_method(D_METHOD("_create_resource"), &AbstractPolygon2DEditor::_create_resource);
}
void AbstractPolygon2DEditor::remove_point(const Vertex &p_vertex) {
-
- PoolVector<Vector2> vertices = _get_polygon(p_vertex.polygon);
+ Vector<Vector2> vertices = _get_polygon(p_vertex.polygon);
if (vertices.size() > (_is_line() ? 2 : 3)) {
-
vertices.remove(p_vertex.vertex);
undo_redo->create_action(TTR("Edit Polygon (Remove Point)"));
_action_set_polygon(p_vertex.polygon, vertices);
_commit_action();
} else {
-
undo_redo->create_action(TTR("Remove Polygon And Point"));
_action_remove_polygon(p_vertex.polygon);
_commit_action();
}
- if (_is_empty())
+ if (_is_empty()) {
_menu_option(MODE_CREATE);
+ }
hover_point = Vertex();
- if (selected_point == p_vertex)
+ if (selected_point == p_vertex) {
selected_point = Vertex();
+ }
}
AbstractPolygon2DEditor::Vertex AbstractPolygon2DEditor::get_active_point() const {
-
return hover_point.valid() ? hover_point : selected_point;
}
AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_point(const Vector2 &p_pos) const {
-
const real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
const int n_polygons = _get_polygon_count();
@@ -743,13 +633,11 @@ AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_point(const
real_t closest_dist = 1e10;
for (int j = 0; j < n_polygons; j++) {
-
- PoolVector<Vector2> points = _get_polygon(j);
+ Vector<Vector2> points = _get_polygon(j);
const Vector2 offset = _get_offset(j);
const int n_points = points.size();
for (int i = 0; i < n_points; i++) {
-
Vector2 cp = xform.xform(points[i] + offset);
real_t d = cp.distance_to(p_pos);
@@ -764,7 +652,6 @@ AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_point(const
}
AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_edge_point(const Vector2 &p_pos) const {
-
const real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
const real_t eps = grab_threshold * 2;
const real_t eps2 = eps * eps;
@@ -776,21 +663,20 @@ AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_edge_point(c
real_t closest_dist = 1e10;
for (int j = 0; j < n_polygons; j++) {
-
- PoolVector<Vector2> points = _get_polygon(j);
+ Vector<Vector2> points = _get_polygon(j);
const Vector2 offset = _get_offset(j);
const int n_points = points.size();
const int n_segments = n_points - (_is_line() ? 1 : 0);
for (int i = 0; i < n_segments; i++) {
-
Vector2 segment[2] = { xform.xform(points[i] + offset),
xform.xform(points[(i + 1) % n_points] + offset) };
- Vector2 cp = Geometry::get_closest_point_to_segment_2d(p_pos, segment);
+ Vector2 cp = Geometry2D::get_closest_point_to_segment(p_pos, segment);
- if (cp.distance_squared_to(segment[0]) < eps2 || cp.distance_squared_to(segment[1]) < eps2)
+ if (cp.distance_squared_to(segment[0]) < eps2 || cp.distance_squared_to(segment[1]) < eps2) {
continue; //not valid to reuse point
+ }
real_t d = cp.distance_to(p_pos);
if (d < closest_dist && d < grab_threshold) {
@@ -804,8 +690,7 @@ AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_edge_point(c
}
AbstractPolygon2DEditor::AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wip_destructive) {
-
- canvas_item_editor = NULL;
+ canvas_item_editor = nullptr;
editor = p_editor;
undo_redo = EditorNode::get_undo_redo();
@@ -818,19 +703,22 @@ AbstractPolygon2DEditor::AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wi
edge_point = PosVertex();
add_child(memnew(VSeparator));
- button_create = memnew(ToolButton);
+ button_create = memnew(Button);
+ button_create->set_flat(true);
add_child(button_create);
- button_create->connect("pressed", this, "_menu_option", varray(MODE_CREATE));
+ button_create->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option), varray(MODE_CREATE));
button_create->set_toggle_mode(true);
- button_edit = memnew(ToolButton);
+ button_edit = memnew(Button);
+ button_edit->set_flat(true);
add_child(button_edit);
- button_edit->connect("pressed", this, "_menu_option", varray(MODE_EDIT));
+ button_edit->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option), varray(MODE_EDIT));
button_edit->set_toggle_mode(true);
- button_delete = memnew(ToolButton);
+ button_delete = memnew(Button);
+ button_delete->set_flat(true);
add_child(button_delete);
- button_delete->connect("pressed", this, "_menu_option", varray(MODE_DELETE));
+ button_delete->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option), varray(MODE_DELETE));
button_delete->set_toggle_mode(true);
create_resource = memnew(ConfirmationDialog);
@@ -841,24 +729,19 @@ AbstractPolygon2DEditor::AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wi
}
void AbstractPolygon2DEditorPlugin::edit(Object *p_object) {
-
polygon_editor->edit(Object::cast_to<Node>(p_object));
}
bool AbstractPolygon2DEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class(klass);
}
void AbstractPolygon2DEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
-
polygon_editor->show();
} else {
-
polygon_editor->hide();
- polygon_editor->edit(NULL);
+ polygon_editor->edit(nullptr);
}
}
diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h
index 6ed6d0a257..527803150d 100644
--- a/editor/plugins/abstract_polygon_2d_editor.h
+++ b/editor/plugins/abstract_polygon_2d_editor.h
@@ -34,36 +34,41 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
#include "scene/2d/polygon_2d.h"
-#include "scene/gui/tool_button.h"
class CanvasItemEditor;
class AbstractPolygon2DEditor : public HBoxContainer {
-
GDCLASS(AbstractPolygon2DEditor, HBoxContainer);
- ToolButton *button_create;
- ToolButton *button_edit;
- ToolButton *button_delete;
+ Button *button_create;
+ Button *button_edit;
+ Button *button_delete;
struct Vertex {
- Vertex();
- Vertex(int p_vertex);
- Vertex(int p_polygon, int p_vertex);
+ Vertex() {}
+ Vertex(int p_vertex) :
+ vertex(p_vertex) {}
+ Vertex(int p_polygon, int p_vertex) :
+ polygon(p_polygon),
+ vertex(p_vertex) {}
bool operator==(const Vertex &p_vertex) const;
bool operator!=(const Vertex &p_vertex) const;
bool valid() const;
- int polygon;
- int vertex;
+ int polygon = -1;
+ int vertex = -1;
};
struct PosVertex : public Vertex {
- PosVertex();
- PosVertex(const Vertex &p_vertex, const Vector2 &p_pos);
- PosVertex(int p_polygon, int p_vertex, const Vector2 &p_pos);
+ PosVertex() {}
+ PosVertex(const Vertex &p_vertex, const Vector2 &p_pos) :
+ Vertex(p_vertex.polygon, p_vertex.vertex),
+ pos(p_pos) {}
+ PosVertex(int p_polygon, int p_vertex, const Vector2 &p_pos) :
+ Vertex(p_polygon, p_vertex),
+ pos(p_pos) {}
Vector2 pos;
};
@@ -144,7 +149,6 @@ public:
};
class AbstractPolygon2DEditorPlugin : public EditorPlugin {
-
GDCLASS(AbstractPolygon2DEditorPlugin, EditorPlugin);
AbstractPolygon2DEditor *polygon_editor;
@@ -152,14 +156,14 @@ class AbstractPolygon2DEditorPlugin : public EditorPlugin {
String klass;
public:
- virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return polygon_editor->forward_gui_input(p_event); }
- virtual void forward_canvas_draw_over_viewport(Control *p_overlay) { polygon_editor->forward_canvas_draw_over_viewport(p_overlay); }
-
- bool has_main_screen() const { return false; }
- virtual String get_name() const { return klass; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return polygon_editor->forward_gui_input(p_event); }
+ virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override { polygon_editor->forward_canvas_draw_over_viewport(p_overlay); }
+
+ bool has_main_screen() const override { return false; }
+ virtual String get_name() const override { return klass; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
AbstractPolygon2DEditorPlugin(EditorNode *p_node, AbstractPolygon2DEditor *p_polygon_editor, String p_class);
~AbstractPolygon2DEditorPlugin();
diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp
index d743d1ac2f..d335b29c2f 100644
--- a/editor/plugins/animation_blend_space_1d_editor.cpp
+++ b/editor/plugins/animation_blend_space_1d_editor.cpp
@@ -42,7 +42,7 @@ StringName AnimationNodeBlendSpace1DEditor::get_blend_position_path() const {
void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> k = p_event;
- if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_DELETE && !k->is_echo()) {
+ if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) {
if (selected_point != -1) {
_erase_selected();
accept_event();
@@ -73,7 +73,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
ap->get_animation_list(&names);
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
- animations_menu->add_icon_item(get_icon("Animation", "EditorIcons"), E->get());
+ animations_menu->add_icon_item(get_theme_icon("Animation", "EditorIcons"), E->get());
animations_to_add.push_back(E->get());
}
}
@@ -81,8 +81,9 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
for (List<StringName>::Element *E = classes.front(); E; E = E->next()) {
String name = String(E->get()).replace_first("AnimationNode", "");
- if (name == "Animation")
+ if (name == "Animation") {
continue;
+ }
int idx = menu->get_item_count();
menu->add_item(vformat("Add %s", name), idx);
@@ -97,7 +98,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
menu->add_separator();
menu->add_item(TTR("Load..."), MENU_LOAD_FILE);
- menu->set_global_position(blend_space_draw->get_global_transform().xform(mb->get_position()));
+ menu->set_position(blend_space_draw->get_screen_transform().xform(mb->get_position()));
menu->popup();
add_point_pos = (mb->get_position() / blend_space_draw->get_size()).x;
@@ -117,7 +118,6 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
_update_tool_erase();
for (int i = 0; i < points.size(); i++) {
-
if (Math::abs(float(points[i] - mb->get_position().x)) < 10 * EDSCALE) {
selected_point = i;
@@ -196,19 +196,18 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
}
void AnimationNodeBlendSpace1DEditor::_blend_space_draw() {
-
- Color linecolor = get_color("font_color", "Label");
+ Color linecolor = get_theme_color("font_color", "Label");
Color linecolor_soft = linecolor;
linecolor_soft.a *= 0.5;
- Ref<Font> font = get_font("font", "Label");
- Ref<Texture> icon = get_icon("KeyValue", "EditorIcons");
- Ref<Texture> icon_selected = get_icon("KeySelected", "EditorIcons");
+ Ref<Font> font = get_theme_font("font", "Label");
+ Ref<Texture2D> icon = get_theme_icon("KeyValue", "EditorIcons");
+ Ref<Texture2D> icon_selected = get_theme_icon("KeySelected", "EditorIcons");
Size2 s = blend_space_draw->get_size();
if (blend_space_draw->has_focus()) {
- Color color = get_color("accent_color", "Editor");
+ Color color = get_theme_color("accent_color", "Editor");
blend_space_draw->draw_rect(Rect2(Point2(), s), color, false);
}
@@ -227,7 +226,6 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_draw() {
}
if (snap->is_pressed()) {
-
linecolor_soft.a = linecolor.a * 0.1;
if (blend_space->get_snap() > 0) {
@@ -280,7 +278,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_draw() {
{
Color color;
if (tool_blend->is_pressed()) {
- color = get_color("accent_color", "Editor");
+ color = get_theme_color("accent_color", "Editor");
} else {
color = linecolor;
color.a *= 0.5;
@@ -303,9 +301,9 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_draw() {
}
void AnimationNodeBlendSpace1DEditor::_update_space() {
-
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
@@ -322,8 +320,9 @@ void AnimationNodeBlendSpace1DEditor::_update_space() {
}
void AnimationNodeBlendSpace1DEditor::_config_changed(double) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
undo_redo->create_action(TTR("Change BlendSpace1D Limits"));
@@ -342,8 +341,9 @@ void AnimationNodeBlendSpace1DEditor::_config_changed(double) {
}
void AnimationNodeBlendSpace1DEditor::_labels_changed(String) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
undo_redo->create_action(TTR("Change BlendSpace1D Labels"), UndoRedo::MERGE_ENDS);
@@ -360,7 +360,6 @@ void AnimationNodeBlendSpace1DEditor::_snap_toggled() {
}
void AnimationNodeBlendSpace1DEditor::_file_opened(const String &p_file) {
-
file_loaded = ResourceLoader::load(p_file);
if (file_loaded.is_valid()) {
_add_menu_type(MENU_LOAD_FILE_CONFIRM);
@@ -370,20 +369,18 @@ void AnimationNodeBlendSpace1DEditor::_file_opened(const String &p_file) {
void AnimationNodeBlendSpace1DEditor::_add_menu_type(int p_index) {
Ref<AnimationRootNode> node;
if (p_index == MENU_LOAD_FILE) {
-
open_file->clear_filters();
List<String> filters;
ResourceLoader::get_recognized_extensions_for_type("AnimationRootNode", &filters);
for (List<String>::Element *E = filters.front(); E; E = E->next()) {
open_file->add_filter("*." + E->get());
}
- open_file->popup_centered_ratio();
+ open_file->popup_file_dialog();
return;
} else if (p_index == MENU_LOAD_FILE_CONFIRM) {
node = file_loaded;
file_loaded.unref();
} else if (p_index == MENU_PASTE) {
-
node = EditorSettings::get_singleton()->get_resource_clipboard();
} else {
String type = menu->get_item_metadata(p_index);
@@ -432,7 +429,6 @@ void AnimationNodeBlendSpace1DEditor::_add_animation_type(int p_index) {
}
void AnimationNodeBlendSpace1DEditor::_tool_switch(int p_tool) {
-
if (p_tool == 0) {
tool_erase->show();
tool_erase_sep->show();
@@ -446,8 +442,9 @@ void AnimationNodeBlendSpace1DEditor::_tool_switch(int p_tool) {
}
void AnimationNodeBlendSpace1DEditor::_update_edited_point_pos() {
- if (updating)
+ if (updating) {
return;
+ }
if (selected_point >= 0 && selected_point < blend_space->get_blend_point_count()) {
float pos = blend_space->get_blend_point_position(selected_point);
@@ -467,7 +464,6 @@ void AnimationNodeBlendSpace1DEditor::_update_edited_point_pos() {
}
void AnimationNodeBlendSpace1DEditor::_update_tool_erase() {
-
bool point_valid = selected_point >= 0 && selected_point < blend_space->get_blend_point_count();
tool_erase->set_disabled(!point_valid);
@@ -504,8 +500,9 @@ void AnimationNodeBlendSpace1DEditor::_erase_selected() {
}
void AnimationNodeBlendSpace1DEditor::_edit_point_pos(double) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
undo_redo->create_action(TTR("Move BlendSpace1D Node Point"));
@@ -522,7 +519,6 @@ void AnimationNodeBlendSpace1DEditor::_edit_point_pos(double) {
}
void AnimationNodeBlendSpace1DEditor::_open_editor() {
-
if (selected_point >= 0 && selected_point < blend_space->get_blend_point_count()) {
Ref<AnimationNode> an = blend_space->get_blend_point_node(selected_point);
ERR_FAIL_COND(an.is_null());
@@ -532,15 +528,15 @@ void AnimationNodeBlendSpace1DEditor::_open_editor() {
void AnimationNodeBlendSpace1DEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- error_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
- panel->add_style_override("panel", get_stylebox("bg", "Tree"));
- tool_blend->set_icon(get_icon("EditPivot", "EditorIcons"));
- tool_select->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tool_create->set_icon(get_icon("EditKey", "EditorIcons"));
- tool_erase->set_icon(get_icon("Remove", "EditorIcons"));
- snap->set_icon(get_icon("SnapGrid", "EditorIcons"));
- open_editor->set_icon(get_icon("Edit", "EditorIcons"));
+ error_panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
+ panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ tool_blend->set_icon(get_theme_icon("EditPivot", "EditorIcons"));
+ tool_select->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ tool_create->set_icon(get_theme_icon("EditKey", "EditorIcons"));
+ tool_erase->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ snap->set_icon(get_theme_icon("SnapGrid", "EditorIcons"));
+ open_editor->set_icon(get_theme_icon("Edit", "EditorIcons"));
}
if (p_what == NOTIFICATION_PROCESS) {
@@ -568,35 +564,18 @@ void AnimationNodeBlendSpace1DEditor::_notification(int p_what) {
}
void AnimationNodeBlendSpace1DEditor::_bind_methods() {
- ClassDB::bind_method("_blend_space_gui_input", &AnimationNodeBlendSpace1DEditor::_blend_space_gui_input);
- ClassDB::bind_method("_blend_space_draw", &AnimationNodeBlendSpace1DEditor::_blend_space_draw);
- ClassDB::bind_method("_config_changed", &AnimationNodeBlendSpace1DEditor::_config_changed);
- ClassDB::bind_method("_labels_changed", &AnimationNodeBlendSpace1DEditor::_labels_changed);
ClassDB::bind_method("_update_space", &AnimationNodeBlendSpace1DEditor::_update_space);
- ClassDB::bind_method("_snap_toggled", &AnimationNodeBlendSpace1DEditor::_snap_toggled);
- ClassDB::bind_method("_tool_switch", &AnimationNodeBlendSpace1DEditor::_tool_switch);
- ClassDB::bind_method("_erase_selected", &AnimationNodeBlendSpace1DEditor::_erase_selected);
ClassDB::bind_method("_update_tool_erase", &AnimationNodeBlendSpace1DEditor::_update_tool_erase);
- ClassDB::bind_method("_edit_point_pos", &AnimationNodeBlendSpace1DEditor::_edit_point_pos);
-
- ClassDB::bind_method("_add_menu_type", &AnimationNodeBlendSpace1DEditor::_add_menu_type);
- ClassDB::bind_method("_add_animation_type", &AnimationNodeBlendSpace1DEditor::_add_animation_type);
ClassDB::bind_method("_update_edited_point_pos", &AnimationNodeBlendSpace1DEditor::_update_edited_point_pos);
-
- ClassDB::bind_method("_open_editor", &AnimationNodeBlendSpace1DEditor::_open_editor);
-
- ClassDB::bind_method("_file_opened", &AnimationNodeBlendSpace1DEditor::_file_opened);
}
bool AnimationNodeBlendSpace1DEditor::can_edit(const Ref<AnimationNode> &p_node) {
-
Ref<AnimationNodeBlendSpace1D> b1d = p_node;
return b1d.is_valid();
}
void AnimationNodeBlendSpace1DEditor::edit(const Ref<AnimationNode> &p_node) {
-
blend_space = p_node;
if (!blend_space.is_null()) {
@@ -604,7 +583,7 @@ void AnimationNodeBlendSpace1DEditor::edit(const Ref<AnimationNode> &p_node) {
}
}
-AnimationNodeBlendSpace1DEditor *AnimationNodeBlendSpace1DEditor::singleton = NULL;
+AnimationNodeBlendSpace1DEditor *AnimationNodeBlendSpace1DEditor::singleton = nullptr;
AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
singleton = this;
@@ -616,43 +595,48 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
Ref<ButtonGroup> bg;
bg.instance();
- tool_blend = memnew(ToolButton);
+ tool_blend = memnew(Button);
+ tool_blend->set_flat(true);
tool_blend->set_toggle_mode(true);
tool_blend->set_button_group(bg);
top_hb->add_child(tool_blend);
tool_blend->set_pressed(true);
tool_blend->set_tooltip(TTR("Set the blending position within the space"));
- tool_blend->connect("pressed", this, "_tool_switch", varray(3));
+ tool_blend->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_tool_switch), varray(3));
- tool_select = memnew(ToolButton);
+ tool_select = memnew(Button);
+ tool_select->set_flat(true);
tool_select->set_toggle_mode(true);
tool_select->set_button_group(bg);
top_hb->add_child(tool_select);
tool_select->set_tooltip(TTR("Select and move points, create points with RMB."));
- tool_select->connect("pressed", this, "_tool_switch", varray(0));
+ tool_select->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_tool_switch), varray(0));
- tool_create = memnew(ToolButton);
+ tool_create = memnew(Button);
+ tool_create->set_flat(true);
tool_create->set_toggle_mode(true);
tool_create->set_button_group(bg);
top_hb->add_child(tool_create);
tool_create->set_tooltip(TTR("Create points."));
- tool_create->connect("pressed", this, "_tool_switch", varray(1));
+ tool_create->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_tool_switch), varray(1));
tool_erase_sep = memnew(VSeparator);
top_hb->add_child(tool_erase_sep);
- tool_erase = memnew(ToolButton);
+ tool_erase = memnew(Button);
+ tool_erase->set_flat(true);
top_hb->add_child(tool_erase);
tool_erase->set_tooltip(TTR("Erase points."));
- tool_erase->connect("pressed", this, "_erase_selected");
+ tool_erase->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_erase_selected));
top_hb->add_child(memnew(VSeparator));
- snap = memnew(ToolButton);
+ snap = memnew(Button);
+ snap->set_flat(true);
snap->set_toggle_mode(true);
top_hb->add_child(snap);
snap->set_pressed(true);
snap->set_tooltip(TTR("Enable snap and show grid."));
- snap->connect("pressed", this, "_snap_toggled");
+ snap->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_snap_toggled));
snap_value = memnew(SpinBox);
top_hb->add_child(snap_value);
@@ -670,12 +654,12 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
edit_value->set_min(-1000);
edit_value->set_max(1000);
edit_value->set_step(0.01);
- edit_value->connect("value_changed", this, "_edit_point_pos");
+ edit_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_edit_point_pos));
open_editor = memnew(Button);
edit_hb->add_child(open_editor);
open_editor->set_text(TTR("Open Editor"));
- open_editor->connect("pressed", this, "_open_editor", varray(), CONNECT_DEFERRED);
+ open_editor->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_open_editor), varray(), CONNECT_DEFERRED);
edit_hb->hide();
open_editor->hide();
@@ -691,8 +675,8 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
panel->set_v_size_flags(SIZE_EXPAND_FILL);
blend_space_draw = memnew(Control);
- blend_space_draw->connect("gui_input", this, "_blend_space_gui_input");
- blend_space_draw->connect("draw", this, "_blend_space_draw");
+ blend_space_draw->connect("gui_input", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_blend_space_gui_input));
+ blend_space_draw->connect("draw", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_blend_space_draw));
blend_space_draw->set_focus_mode(FOCUS_ALL);
panel->add_child(blend_space_draw);
@@ -724,10 +708,10 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
bottom_hb->add_child(max_value);
}
- snap_value->connect("value_changed", this, "_config_changed");
- min_value->connect("value_changed", this, "_config_changed");
- max_value->connect("value_changed", this, "_config_changed");
- label_value->connect("text_changed", this, "_labels_changed");
+ snap_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_config_changed));
+ min_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_config_changed));
+ max_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_config_changed));
+ label_value->connect("text_changed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_labels_changed));
error_panel = memnew(PanelContainer);
add_child(error_panel);
@@ -740,18 +724,18 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_add_menu_type");
+ menu->connect("id_pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_add_menu_type));
animations_menu = memnew(PopupMenu);
menu->add_child(animations_menu);
animations_menu->set_name("animations");
- animations_menu->connect("index_pressed", this, "_add_animation_type");
+ animations_menu->connect("index_pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_add_animation_type));
open_file = memnew(EditorFileDialog);
add_child(open_file);
open_file->set_title(TTR("Open Animation Node"));
- open_file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- open_file->connect("file_selected", this, "_file_opened");
+ open_file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ open_file->connect("file_selected", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_file_opened));
undo_redo = EditorNode::get_undo_redo();
selected_point = -1;
diff --git a/editor/plugins/animation_blend_space_1d_editor.h b/editor/plugins/animation_blend_space_1d_editor.h
index 346ad36cff..5ff5da47c0 100644
--- a/editor/plugins/animation_blend_space_1d_editor.h
+++ b/editor/plugins/animation_blend_space_1d_editor.h
@@ -42,21 +42,20 @@
#include "scene/gui/tree.h"
class AnimationNodeBlendSpace1DEditor : public AnimationTreeNodeEditorPlugin {
-
GDCLASS(AnimationNodeBlendSpace1DEditor, AnimationTreeNodeEditorPlugin);
Ref<AnimationNodeBlendSpace1D> blend_space;
HBoxContainer *goto_parent_hb;
- ToolButton *goto_parent;
+ Button *goto_parent;
PanelContainer *panel;
- ToolButton *tool_blend;
- ToolButton *tool_select;
- ToolButton *tool_create;
+ Button *tool_blend;
+ Button *tool_select;
+ Button *tool_create;
VSeparator *tool_erase_sep;
- ToolButton *tool_erase;
- ToolButton *snap;
+ Button *tool_erase;
+ Button *snap;
SpinBox *snap_value;
LineEdit *label_value;
@@ -130,8 +129,8 @@ protected:
public:
static AnimationNodeBlendSpace1DEditor *get_singleton() { return singleton; }
- virtual bool can_edit(const Ref<AnimationNode> &p_node);
- virtual void edit(const Ref<AnimationNode> &p_node);
+ virtual bool can_edit(const Ref<AnimationNode> &p_node) override;
+ virtual void edit(const Ref<AnimationNode> &p_node) override;
AnimationNodeBlendSpace1DEditor();
};
diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp
index dc7754ba9a..805df0cbb9 100644
--- a/editor/plugins/animation_blend_space_2d_editor.cpp
+++ b/editor/plugins/animation_blend_space_2d_editor.cpp
@@ -30,9 +30,9 @@
#include "animation_blend_space_2d_editor.h"
+#include "core/input/input.h"
#include "core/io/resource_loader.h"
-#include "core/math/delaunay.h"
-#include "core/os/input.h"
+#include "core/math/geometry_2d.h"
#include "core/os/keyboard.h"
#include "core/project_settings.h"
#include "editor/editor_scale.h"
@@ -40,10 +40,9 @@
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
bool AnimationNodeBlendSpace2DEditor::can_edit(const Ref<AnimationNode> &p_node) {
-
Ref<AnimationNodeBlendSpace2D> bs2d = p_node;
return bs2d.is_valid();
}
@@ -53,14 +52,13 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_changed() {
}
void AnimationNodeBlendSpace2DEditor::edit(const Ref<AnimationNode> &p_node) {
-
if (blend_space.is_valid()) {
- blend_space->disconnect("triangles_updated", this, "_blend_space_changed");
+ blend_space->disconnect("triangles_updated", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_blend_space_changed));
}
blend_space = p_node;
if (!blend_space.is_null()) {
- blend_space->connect("triangles_updated", this, "_blend_space_changed");
+ blend_space->connect("triangles_updated", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_blend_space_changed));
_update_space();
}
}
@@ -71,9 +69,8 @@ StringName AnimationNodeBlendSpace2DEditor::get_blend_position_path() const {
}
void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventKey> k = p_event;
- if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_DELETE && !k->is_echo()) {
+ if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) {
if (selected_point != -1 || selected_triangle != -1) {
_erase_selected();
accept_event();
@@ -100,17 +97,17 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
List<StringName> names;
ap->get_animation_list(&names);
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
- animations_menu->add_icon_item(get_icon("Animation", "EditorIcons"), E->get());
+ animations_menu->add_icon_item(get_theme_icon("Animation", "EditorIcons"), E->get());
animations_to_add.push_back(E->get());
}
}
}
for (List<StringName>::Element *E = classes.front(); E; E = E->next()) {
-
String name = String(E->get()).replace_first("AnimationNode", "");
- if (name == "Animation")
+ if (name == "Animation") {
continue; // nope
+ }
int idx = menu->get_item_count();
menu->add_item(vformat("Add %s", name), idx);
menu->set_item_metadata(idx, E->get());
@@ -124,7 +121,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
menu->add_separator();
menu->add_item(TTR("Load..."), MENU_LOAD_FILE);
- menu->set_global_position(blend_space_draw->get_global_transform().xform(mb->get_position()));
+ menu->set_position(blend_space_draw->get_screen_transform().xform(mb->get_position()));
menu->popup();
add_point_pos = (mb->get_position() / blend_space_draw->get_size());
add_point_pos.y = 1.0 - add_point_pos.y;
@@ -138,7 +135,6 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
blend_space_draw->update(); //update anyway
//try to see if a point can be selected
selected_point = -1;
@@ -146,7 +142,6 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
_update_tool_erase();
for (int i = 0; i < points.size(); i++) {
-
if (points[i].distance_to(mb->get_position()) < 10 * EDSCALE) {
selected_point = i;
Ref<AnimationNode> node = blend_space->get_blend_point_node(i);
@@ -170,7 +165,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
triangle.push_back(points[idx]);
}
- if (Geometry::is_point_in_triangle(mb->get_position(), triangle[0], triangle[1], triangle[2])) {
+ if (Geometry2D::is_point_in_triangle(mb->get_position(), triangle[0], triangle[1], triangle[2])) {
selected_triangle = i;
_update_tool_erase();
return;
@@ -180,15 +175,14 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
blend_space_draw->update(); //update anyway
//try to see if a point can be selected
selected_point = -1;
for (int i = 0; i < points.size(); i++) {
-
- if (making_triangle.find(i) != -1)
+ if (making_triangle.find(i) != -1) {
continue;
+ }
if (points[i].distance_to(mb->get_position()) < 10 * EDSCALE) {
making_triangle.push_back(i);
@@ -243,7 +237,6 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
Vector2 blend_pos = (mb->get_position() / blend_space_draw->get_size());
blend_pos.y = 1.0 - blend_pos.y;
blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space());
@@ -278,7 +271,6 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
-
Vector2 blend_pos = (mm->get_position() / blend_space_draw->get_size());
blend_pos.y = 1.0 - blend_pos.y;
blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space());
@@ -291,7 +283,6 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
void AnimationNodeBlendSpace2DEditor::_file_opened(const String &p_file) {
-
file_loaded = ResourceLoader::load(p_file);
if (file_loaded.is_valid()) {
_add_menu_type(MENU_LOAD_FILE_CONFIRM);
@@ -299,23 +290,20 @@ void AnimationNodeBlendSpace2DEditor::_file_opened(const String &p_file) {
}
void AnimationNodeBlendSpace2DEditor::_add_menu_type(int p_index) {
-
Ref<AnimationRootNode> node;
if (p_index == MENU_LOAD_FILE) {
-
open_file->clear_filters();
List<String> filters;
ResourceLoader::get_recognized_extensions_for_type("AnimationRootNode", &filters);
for (List<String>::Element *E = filters.front(); E; E = E->next()) {
open_file->add_filter("*." + E->get());
}
- open_file->popup_centered_ratio();
+ open_file->popup_file_dialog();
return;
} else if (p_index == MENU_LOAD_FILE_CONFIRM) {
node = file_loaded;
file_loaded.unref();
} else if (p_index == MENU_PASTE) {
-
node = EditorSettings::get_singleton()->get_resource_clipboard();
} else {
String type = menu->get_item_metadata(p_index);
@@ -346,7 +334,6 @@ void AnimationNodeBlendSpace2DEditor::_add_menu_type(int p_index) {
}
void AnimationNodeBlendSpace2DEditor::_add_animation_type(int p_index) {
-
Ref<AnimationNodeAnimation> anim;
anim.instance();
@@ -405,18 +392,17 @@ void AnimationNodeBlendSpace2DEditor::_tool_switch(int p_tool) {
}
void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
-
- Color linecolor = get_color("font_color", "Label");
+ Color linecolor = get_theme_color("font_color", "Label");
Color linecolor_soft = linecolor;
linecolor_soft.a *= 0.5;
- Ref<Font> font = get_font("font", "Label");
- Ref<Texture> icon = get_icon("KeyValue", "EditorIcons");
- Ref<Texture> icon_selected = get_icon("KeySelected", "EditorIcons");
+ Ref<Font> font = get_theme_font("font", "Label");
+ Ref<Texture2D> icon = get_theme_icon("KeyValue", "EditorIcons");
+ Ref<Texture2D> icon_selected = get_theme_icon("KeySelected", "EditorIcons");
Size2 s = blend_space_draw->get_size();
if (blend_space_draw->has_focus()) {
- Color color = get_color("accent_color", "Editor");
+ Color color = get_theme_color("accent_color", "Editor");
blend_space_draw->draw_rect(Rect2(Point2(), s), color, false);
}
blend_space_draw->draw_line(Point2(1, 0), Point2(1, s.height - 1), linecolor);
@@ -438,14 +424,11 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
}
if (snap->is_pressed()) {
-
linecolor_soft.a = linecolor.a * 0.1;
if (blend_space->get_snap().x > 0) {
-
int prev_idx = 0;
for (int i = 0; i < s.x; i++) {
-
float v = blend_space->get_min_space().x + i * (blend_space->get_max_space().x - blend_space->get_min_space().x) / s.x;
int idx = int(v / blend_space->get_snap().x);
@@ -458,10 +441,8 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
}
if (blend_space->get_snap().y > 0) {
-
int prev_idx = 0;
for (int i = 0; i < s.y; i++) {
-
float v = blend_space->get_max_space().y - i * (blend_space->get_max_space().y - blend_space->get_min_space().y) / s.y;
int idx = int(v / blend_space->get_snap().y);
@@ -476,7 +457,6 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
//triangles first
for (int i = 0; i < blend_space->get_triangle_count(); i++) {
-
Vector<Vector2> points;
points.resize(3);
@@ -497,12 +477,12 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
}
for (int j = 0; j < 3; j++) {
- blend_space_draw->draw_line(points[j], points[(j + 1) % 3], linecolor, 1, true);
+ blend_space_draw->draw_line(points[j], points[(j + 1) % 3], linecolor, 1);
}
Color color;
if (i == selected_triangle) {
- color = get_color("accent_color", "Editor");
+ color = get_theme_color("accent_color", "Editor");
color.a *= 0.5;
} else {
color = linecolor;
@@ -518,7 +498,6 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
points.clear();
for (int i = 0; i < blend_space->get_blend_point_count(); i++) {
-
Vector2 point = blend_space->get_blend_point_position(i);
if (dragging_selected && selected_point == i) {
point += drag_ofs;
@@ -553,9 +532,9 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
}
for (int i = 0; i < points.size() - 1; i++) {
- blend_space_draw->draw_line(points[i], points[i + 1], linecolor, 2, true);
+ blend_space_draw->draw_line(points[i], points[i + 1], linecolor, 2);
}
- blend_space_draw->draw_line(points[points.size() - 1], blend_space_draw->get_local_mouse_position(), linecolor, 2, true);
+ blend_space_draw->draw_line(points[points.size() - 1], blend_space_draw->get_local_mouse_position(), linecolor, 2);
}
///draw cursor position
@@ -563,7 +542,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
{
Color color;
if (tool_blend->is_pressed()) {
- color = get_color("accent_color", "Editor");
+ color = get_theme_color("accent_color", "Editor");
} else {
color = linecolor;
color.a *= 0.5;
@@ -597,14 +576,13 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
}
void AnimationNodeBlendSpace2DEditor::_snap_toggled() {
-
blend_space_draw->update();
}
void AnimationNodeBlendSpace2DEditor::_update_space() {
-
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
@@ -636,8 +614,9 @@ void AnimationNodeBlendSpace2DEditor::_update_space() {
}
void AnimationNodeBlendSpace2DEditor::_config_changed(double) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
undo_redo->create_action(TTR("Change BlendSpace2D Limits"));
@@ -658,8 +637,9 @@ void AnimationNodeBlendSpace2DEditor::_config_changed(double) {
}
void AnimationNodeBlendSpace2DEditor::_labels_changed(String) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
undo_redo->create_action(TTR("Change BlendSpace2D Labels"), UndoRedo::MERGE_ENDS);
@@ -674,9 +654,7 @@ void AnimationNodeBlendSpace2DEditor::_labels_changed(String) {
}
void AnimationNodeBlendSpace2DEditor::_erase_selected() {
-
if (selected_point != -1) {
-
updating = true;
undo_redo->create_action(TTR("Remove BlendSpace2D Point"));
undo_redo->add_do_method(blend_space.ptr(), "remove_blend_point", selected_point);
@@ -699,7 +677,6 @@ void AnimationNodeBlendSpace2DEditor::_erase_selected() {
blend_space_draw->update();
} else if (selected_triangle != -1) {
-
updating = true;
undo_redo->create_action(TTR("Remove BlendSpace2D Triangle"));
undo_redo->add_do_method(blend_space.ptr(), "remove_triangle", selected_triangle);
@@ -715,8 +692,9 @@ void AnimationNodeBlendSpace2DEditor::_erase_selected() {
}
void AnimationNodeBlendSpace2DEditor::_update_edited_point_pos() {
- if (updating)
+ if (updating) {
return;
+ }
if (selected_point >= 0 && selected_point < blend_space->get_blend_point_count()) {
Vector2 pos = blend_space->get_blend_point_position(selected_point);
@@ -735,8 +713,9 @@ void AnimationNodeBlendSpace2DEditor::_update_edited_point_pos() {
}
void AnimationNodeBlendSpace2DEditor::_edit_point_pos(double) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
undo_redo->create_action(TTR("Move Node Point"));
undo_redo->add_do_method(blend_space.ptr(), "set_blend_point_position", selected_point, Vector2(edit_x->get_value(), edit_y->get_value()));
@@ -752,27 +731,25 @@ void AnimationNodeBlendSpace2DEditor::_edit_point_pos(double) {
}
void AnimationNodeBlendSpace2DEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- error_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
- panel->add_style_override("panel", get_stylebox("bg", "Tree"));
- tool_blend->set_icon(get_icon("EditPivot", "EditorIcons"));
- tool_select->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tool_create->set_icon(get_icon("EditKey", "EditorIcons"));
- tool_triangle->set_icon(get_icon("ToolTriangle", "EditorIcons"));
- tool_erase->set_icon(get_icon("Remove", "EditorIcons"));
- snap->set_icon(get_icon("SnapGrid", "EditorIcons"));
- open_editor->set_icon(get_icon("Edit", "EditorIcons"));
- auto_triangles->set_icon(get_icon("AutoTriangle", "EditorIcons"));
+ error_panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
+ panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ tool_blend->set_icon(get_theme_icon("EditPivot", "EditorIcons"));
+ tool_select->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ tool_create->set_icon(get_theme_icon("EditKey", "EditorIcons"));
+ tool_triangle->set_icon(get_theme_icon("ToolTriangle", "EditorIcons"));
+ tool_erase->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ snap->set_icon(get_theme_icon("SnapGrid", "EditorIcons"));
+ open_editor->set_icon(get_theme_icon("Edit", "EditorIcons"));
+ auto_triangles->set_icon(get_theme_icon("AutoTriangle", "EditorIcons"));
interpolation->clear();
- interpolation->add_icon_item(get_icon("TrackContinuous", "EditorIcons"), "", 0);
- interpolation->add_icon_item(get_icon("TrackDiscrete", "EditorIcons"), "", 1);
- interpolation->add_icon_item(get_icon("TrackCapture", "EditorIcons"), "", 2);
+ interpolation->add_icon_item(get_theme_icon("TrackContinuous", "EditorIcons"), "", 0);
+ interpolation->add_icon_item(get_theme_icon("TrackDiscrete", "EditorIcons"), "", 1);
+ interpolation->add_icon_item(get_theme_icon("TrackCapture", "EditorIcons"), "", 2);
}
if (p_what == NOTIFICATION_PROCESS) {
-
String error;
if (!AnimationTreeEditor::get_singleton()->get_tree()) {
@@ -801,7 +778,6 @@ void AnimationNodeBlendSpace2DEditor::_notification(int p_what) {
}
void AnimationNodeBlendSpace2DEditor::_open_editor() {
-
if (selected_point >= 0 && selected_point < blend_space->get_blend_point_count()) {
Ref<AnimationNode> an = blend_space->get_blend_point_node(selected_point);
ERR_FAIL_COND(an.is_null());
@@ -810,11 +786,10 @@ void AnimationNodeBlendSpace2DEditor::_open_editor() {
}
void AnimationNodeBlendSpace2DEditor::_removed_from_graph() {
- EditorNode::get_singleton()->edit_item(NULL);
+ EditorNode::get_singleton()->edit_item(nullptr);
}
void AnimationNodeBlendSpace2DEditor::_auto_triangles_toggled() {
-
undo_redo->create_action(TTR("Toggle Auto Triangles"));
undo_redo->add_do_method(blend_space.ptr(), "set_auto_triangles", auto_triangles->is_pressed());
undo_redo->add_undo_method(blend_space.ptr(), "set_auto_triangles", blend_space->get_auto_triangles());
@@ -824,37 +799,17 @@ void AnimationNodeBlendSpace2DEditor::_auto_triangles_toggled() {
}
void AnimationNodeBlendSpace2DEditor::_bind_methods() {
-
- ClassDB::bind_method("_blend_space_gui_input", &AnimationNodeBlendSpace2DEditor::_blend_space_gui_input);
- ClassDB::bind_method("_blend_space_draw", &AnimationNodeBlendSpace2DEditor::_blend_space_draw);
- ClassDB::bind_method("_config_changed", &AnimationNodeBlendSpace2DEditor::_config_changed);
- ClassDB::bind_method("_labels_changed", &AnimationNodeBlendSpace2DEditor::_labels_changed);
ClassDB::bind_method("_update_space", &AnimationNodeBlendSpace2DEditor::_update_space);
- ClassDB::bind_method("_snap_toggled", &AnimationNodeBlendSpace2DEditor::_snap_toggled);
- ClassDB::bind_method("_tool_switch", &AnimationNodeBlendSpace2DEditor::_tool_switch);
- ClassDB::bind_method("_erase_selected", &AnimationNodeBlendSpace2DEditor::_erase_selected);
ClassDB::bind_method("_update_tool_erase", &AnimationNodeBlendSpace2DEditor::_update_tool_erase);
- ClassDB::bind_method("_edit_point_pos", &AnimationNodeBlendSpace2DEditor::_edit_point_pos);
-
- ClassDB::bind_method("_add_menu_type", &AnimationNodeBlendSpace2DEditor::_add_menu_type);
- ClassDB::bind_method("_add_animation_type", &AnimationNodeBlendSpace2DEditor::_add_animation_type);
ClassDB::bind_method("_update_edited_point_pos", &AnimationNodeBlendSpace2DEditor::_update_edited_point_pos);
- ClassDB::bind_method("_open_editor", &AnimationNodeBlendSpace2DEditor::_open_editor);
-
ClassDB::bind_method("_removed_from_graph", &AnimationNodeBlendSpace2DEditor::_removed_from_graph);
-
- ClassDB::bind_method("_auto_triangles_toggled", &AnimationNodeBlendSpace2DEditor::_auto_triangles_toggled);
- ClassDB::bind_method("_blend_space_changed", &AnimationNodeBlendSpace2DEditor::_blend_space_changed);
-
- ClassDB::bind_method("_file_opened", &AnimationNodeBlendSpace2DEditor::_file_opened);
}
-AnimationNodeBlendSpace2DEditor *AnimationNodeBlendSpace2DEditor::singleton = NULL;
+AnimationNodeBlendSpace2DEditor *AnimationNodeBlendSpace2DEditor::singleton = nullptr;
AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
-
singleton = this;
updating = false;
@@ -864,59 +819,66 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
Ref<ButtonGroup> bg;
bg.instance();
- tool_blend = memnew(ToolButton);
+ tool_blend = memnew(Button);
+ tool_blend->set_flat(true);
tool_blend->set_toggle_mode(true);
tool_blend->set_button_group(bg);
top_hb->add_child(tool_blend);
tool_blend->set_pressed(true);
tool_blend->set_tooltip(TTR("Set the blending position within the space"));
- tool_blend->connect("pressed", this, "_tool_switch", varray(3));
+ tool_blend->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_tool_switch), varray(3));
- tool_select = memnew(ToolButton);
+ tool_select = memnew(Button);
+ tool_select->set_flat(true);
tool_select->set_toggle_mode(true);
tool_select->set_button_group(bg);
top_hb->add_child(tool_select);
tool_select->set_tooltip(TTR("Select and move points, create points with RMB."));
- tool_select->connect("pressed", this, "_tool_switch", varray(0));
+ tool_select->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_tool_switch), varray(0));
- tool_create = memnew(ToolButton);
+ tool_create = memnew(Button);
+ tool_create->set_flat(true);
tool_create->set_toggle_mode(true);
tool_create->set_button_group(bg);
top_hb->add_child(tool_create);
tool_create->set_tooltip(TTR("Create points."));
- tool_create->connect("pressed", this, "_tool_switch", varray(1));
+ tool_create->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_tool_switch), varray(1));
- tool_triangle = memnew(ToolButton);
+ tool_triangle = memnew(Button);
+ tool_triangle->set_flat(true);
tool_triangle->set_toggle_mode(true);
tool_triangle->set_button_group(bg);
top_hb->add_child(tool_triangle);
tool_triangle->set_tooltip(TTR("Create triangles by connecting points."));
- tool_triangle->connect("pressed", this, "_tool_switch", varray(2));
+ tool_triangle->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_tool_switch), varray(2));
tool_erase_sep = memnew(VSeparator);
top_hb->add_child(tool_erase_sep);
- tool_erase = memnew(ToolButton);
+ tool_erase = memnew(Button);
+ tool_erase->set_flat(true);
top_hb->add_child(tool_erase);
tool_erase->set_tooltip(TTR("Erase points and triangles."));
- tool_erase->connect("pressed", this, "_erase_selected");
+ tool_erase->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_erase_selected));
tool_erase->set_disabled(true);
top_hb->add_child(memnew(VSeparator));
- auto_triangles = memnew(ToolButton);
+ auto_triangles = memnew(Button);
+ auto_triangles->set_flat(true);
top_hb->add_child(auto_triangles);
- auto_triangles->connect("pressed", this, "_auto_triangles_toggled");
+ auto_triangles->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_auto_triangles_toggled));
auto_triangles->set_toggle_mode(true);
auto_triangles->set_tooltip(TTR("Generate blend triangles automatically (instead of manually)"));
top_hb->add_child(memnew(VSeparator));
- snap = memnew(ToolButton);
+ snap = memnew(Button);
+ snap->set_flat(true);
snap->set_toggle_mode(true);
top_hb->add_child(snap);
snap->set_pressed(true);
snap->set_tooltip(TTR("Enable snap and show grid."));
- snap->connect("pressed", this, "_snap_toggled");
+ snap->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_snap_toggled));
snap_x = memnew(SpinBox);
top_hb->add_child(snap_x);
@@ -937,7 +899,7 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
top_hb->add_child(memnew(Label(TTR("Blend:"))));
interpolation = memnew(OptionButton);
top_hb->add_child(interpolation);
- interpolation->connect("item_selected", this, "_config_changed");
+ interpolation->connect("item_selected", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed));
edit_hb = memnew(HBoxContainer);
top_hb->add_child(edit_hb);
@@ -948,17 +910,17 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
edit_x->set_min(-1000);
edit_x->set_step(0.01);
edit_x->set_max(1000);
- edit_x->connect("value_changed", this, "_edit_point_pos");
+ edit_x->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_edit_point_pos));
edit_y = memnew(SpinBox);
edit_hb->add_child(edit_y);
edit_y->set_min(-1000);
edit_y->set_step(0.01);
edit_y->set_max(1000);
- edit_y->connect("value_changed", this, "_edit_point_pos");
+ edit_y->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_edit_point_pos));
open_editor = memnew(Button);
edit_hb->add_child(open_editor);
open_editor->set_text(TTR("Open Editor"));
- open_editor->connect("pressed", this, "_open_editor", varray(), CONNECT_DEFERRED);
+ open_editor->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_open_editor), varray(), CONNECT_DEFERRED);
edit_hb->hide();
open_editor->hide();
@@ -999,8 +961,8 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
panel->set_h_size_flags(SIZE_EXPAND_FILL);
blend_space_draw = memnew(Control);
- blend_space_draw->connect("gui_input", this, "_blend_space_gui_input");
- blend_space_draw->connect("draw", this, "_blend_space_draw");
+ blend_space_draw->connect("gui_input", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_blend_space_gui_input));
+ blend_space_draw->connect("draw", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_blend_space_draw));
blend_space_draw->set_focus_mode(FOCUS_ALL);
panel->add_child(blend_space_draw);
@@ -1029,14 +991,14 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
min_x_value->set_step(0.01);
}
- snap_x->connect("value_changed", this, "_config_changed");
- snap_y->connect("value_changed", this, "_config_changed");
- max_x_value->connect("value_changed", this, "_config_changed");
- min_x_value->connect("value_changed", this, "_config_changed");
- max_y_value->connect("value_changed", this, "_config_changed");
- min_y_value->connect("value_changed", this, "_config_changed");
- label_x->connect("text_changed", this, "_labels_changed");
- label_y->connect("text_changed", this, "_labels_changed");
+ snap_x->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed));
+ snap_y->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed));
+ max_x_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed));
+ min_x_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed));
+ max_y_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed));
+ min_y_value->connect("value_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed));
+ label_x->connect("text_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_labels_changed));
+ label_y->connect("text_changed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_labels_changed));
error_panel = memnew(PanelContainer);
add_child(error_panel);
@@ -1050,18 +1012,18 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_add_menu_type");
+ menu->connect("id_pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_add_menu_type));
animations_menu = memnew(PopupMenu);
menu->add_child(animations_menu);
animations_menu->set_name("animations");
- animations_menu->connect("index_pressed", this, "_add_animation_type");
+ animations_menu->connect("index_pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_add_animation_type));
open_file = memnew(EditorFileDialog);
add_child(open_file);
open_file->set_title(TTR("Open Animation Node"));
- open_file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- open_file->connect("file_selected", this, "_file_opened");
+ open_file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ open_file->connect("file_selected", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_file_opened));
undo_redo = EditorNode::get_undo_redo();
selected_point = -1;
diff --git a/editor/plugins/animation_blend_space_2d_editor.h b/editor/plugins/animation_blend_space_2d_editor.h
index 50b0d9a06c..64885aeaca 100644
--- a/editor/plugins/animation_blend_space_2d_editor.h
+++ b/editor/plugins/animation_blend_space_2d_editor.h
@@ -42,24 +42,23 @@
#include "scene/gui/tree.h"
class AnimationNodeBlendSpace2DEditor : public AnimationTreeNodeEditorPlugin {
-
GDCLASS(AnimationNodeBlendSpace2DEditor, AnimationTreeNodeEditorPlugin);
Ref<AnimationNodeBlendSpace2D> blend_space;
PanelContainer *panel;
- ToolButton *tool_blend;
- ToolButton *tool_select;
- ToolButton *tool_create;
- ToolButton *tool_triangle;
+ Button *tool_blend;
+ Button *tool_select;
+ Button *tool_create;
+ Button *tool_triangle;
VSeparator *tool_erase_sep;
- ToolButton *tool_erase;
- ToolButton *snap;
+ Button *tool_erase;
+ Button *snap;
SpinBox *snap_x;
SpinBox *snap_y;
OptionButton *interpolation;
- ToolButton *auto_triangles;
+ Button *auto_triangles;
LineEdit *label_x;
LineEdit *label_y;
@@ -143,8 +142,8 @@ protected:
public:
static AnimationNodeBlendSpace2DEditor *get_singleton() { return singleton; }
- virtual bool can_edit(const Ref<AnimationNode> &p_node);
- virtual void edit(const Ref<AnimationNode> &p_node);
+ virtual bool can_edit(const Ref<AnimationNode> &p_node) override;
+ virtual void edit(const Ref<AnimationNode> &p_node) override;
AnimationNodeBlendSpace2DEditor();
};
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp
index 2de224c043..6419f62343 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -30,8 +30,8 @@
#include "animation_blend_tree_editor_plugin.h"
+#include "core/input/input.h"
#include "core/io/resource_loader.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/project_settings.h"
#include "editor/editor_inspector.h"
@@ -40,10 +40,9 @@
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
#include "scene/gui/progress_bar.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
void AnimationNodeBlendTreeEditor::add_custom_type(const String &p_name, const Ref<Script> &p_script) {
-
for (int i = 0; i < add_options.size(); i++) {
ERR_FAIL_COND(add_options[i].script == p_script);
}
@@ -57,7 +56,6 @@ void AnimationNodeBlendTreeEditor::add_custom_type(const String &p_name, const R
}
void AnimationNodeBlendTreeEditor::remove_custom_type(const Ref<Script> &p_script) {
-
for (int i = 0; i < add_options.size(); i++) {
if (add_options[i].script == p_script) {
add_options.remove(i);
@@ -69,7 +67,6 @@ void AnimationNodeBlendTreeEditor::remove_custom_type(const Ref<Script> &p_scrip
}
void AnimationNodeBlendTreeEditor::_update_options_menu() {
-
add_node->get_popup()->clear();
for (int i = 0; i < add_options.size(); i++) {
add_node->get_popup()->add_item(add_options[i].name, i);
@@ -86,12 +83,10 @@ void AnimationNodeBlendTreeEditor::_update_options_menu() {
}
Size2 AnimationNodeBlendTreeEditor::get_minimum_size() const {
-
return Size2(10, 200);
}
void AnimationNodeBlendTreeEditor::_property_changed(const StringName &p_property, const Variant &p_value, const String &p_field, bool p_changing) {
-
AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_tree();
updating = true;
undo_redo->create_action(TTR("Parameter Changed") + ": " + String(p_property), UndoRedo::MERGE_ENDS);
@@ -104,9 +99,9 @@ void AnimationNodeBlendTreeEditor::_property_changed(const StringName &p_propert
}
void AnimationNodeBlendTreeEditor::_update_graph() {
-
- if (updating)
+ if (updating) {
return;
+ }
visible_properties.clear();
@@ -115,7 +110,6 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
graph->clear_connections();
//erase all nodes
for (int i = 0; i < graph->get_child_count(); i++) {
-
if (Object::cast_to<GraphNode>(graph->get_child(i))) {
memdelete(graph->get_child(i));
i--;
@@ -128,7 +122,6 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
blend_tree->get_node_list(&nodes);
for (List<StringName>::Element *E = nodes.front(); E; E = E->next()) {
-
GraphNode *node = memnew(GraphNode);
graph->add_child(node);
@@ -145,25 +138,24 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
name->set_text(E->get());
name->set_expand_to_text_length(true);
node->add_child(name);
- node->set_slot(0, false, 0, Color(), true, 0, get_color("font_color", "Label"));
- name->connect("text_entered", this, "_node_renamed", varray(agnode));
- name->connect("focus_exited", this, "_node_renamed_focus_out", varray(name, agnode), CONNECT_DEFERRED);
+ node->set_slot(0, false, 0, Color(), true, 0, get_theme_color("font_color", "Label"));
+ name->connect("text_entered", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed), varray(agnode));
+ name->connect("focus_exited", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed_focus_out), varray(name, agnode), CONNECT_DEFERRED);
base = 1;
node->set_show_close_button(true);
- node->connect("close_request", this, "_delete_request", varray(E->get()), CONNECT_DEFERRED);
+ node->connect("close_request", callable_mp(this, &AnimationNodeBlendTreeEditor::_delete_request), varray(E->get()), CONNECT_DEFERRED);
}
for (int i = 0; i < agnode->get_input_count(); i++) {
Label *in_name = memnew(Label);
node->add_child(in_name);
in_name->set_text(agnode->get_input_name(i));
- node->set_slot(base + i, true, 0, get_color("font_color", "Label"), false, 0, Color());
+ node->set_slot(base + i, true, 0, get_theme_color("font_color", "Label"), false, 0, Color());
}
List<PropertyInfo> pinfo;
agnode->get_parameter_list(&pinfo);
for (List<PropertyInfo>::Element *F = pinfo.front(); F; F = F->next()) {
-
if (!(F->get().usage & PROPERTY_USAGE_EDITOR)) {
continue;
}
@@ -173,41 +165,39 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
prop->set_object_and_property(AnimationTreeEditor::get_singleton()->get_tree(), base_path);
prop->update_property();
prop->set_name_split_ratio(0);
- prop->connect("property_changed", this, "_property_changed");
+ prop->connect("property_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_property_changed));
node->add_child(prop);
visible_properties.push_back(prop);
}
}
- node->connect("dragged", this, "_node_dragged", varray(E->get()));
+ node->connect("dragged", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_dragged), varray(E->get()));
if (AnimationTreeEditor::get_singleton()->can_edit(agnode)) {
node->add_child(memnew(HSeparator));
Button *open_in_editor = memnew(Button);
open_in_editor->set_text(TTR("Open Editor"));
- open_in_editor->set_icon(get_icon("Edit", "EditorIcons"));
+ open_in_editor->set_icon(get_theme_icon("Edit", "EditorIcons"));
node->add_child(open_in_editor);
- open_in_editor->connect("pressed", this, "_open_in_editor", varray(E->get()), CONNECT_DEFERRED);
+ open_in_editor->connect("pressed", callable_mp(this, &AnimationNodeBlendTreeEditor::_open_in_editor), varray(E->get()), CONNECT_DEFERRED);
open_in_editor->set_h_size_flags(SIZE_SHRINK_CENTER);
}
if (agnode->has_filter()) {
-
node->add_child(memnew(HSeparator));
Button *edit_filters = memnew(Button);
edit_filters->set_text(TTR("Edit Filters"));
- edit_filters->set_icon(get_icon("AnimationFilter", "EditorIcons"));
+ edit_filters->set_icon(get_theme_icon("AnimationFilter", "EditorIcons"));
node->add_child(edit_filters);
- edit_filters->connect("pressed", this, "_edit_filters", varray(E->get()), CONNECT_DEFERRED);
+ edit_filters->connect("pressed", callable_mp(this, &AnimationNodeBlendTreeEditor::_edit_filters), varray(E->get()), CONNECT_DEFERRED);
edit_filters->set_h_size_flags(SIZE_SHRINK_CENTER);
}
Ref<AnimationNodeAnimation> anim = agnode;
if (anim.is_valid()) {
-
MenuButton *mb = memnew(MenuButton);
mb->set_text(anim->get_animation());
- mb->set_icon(get_icon("Animation", "EditorIcons"));
+ mb->set_icon(get_theme_icon("Animation", "EditorIcons"));
Array options;
node->add_child(memnew(HSeparator));
@@ -238,20 +228,20 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
animations[E->get()] = pb;
node->add_child(pb);
- mb->get_popup()->connect("index_pressed", this, "_anim_selected", varray(options, E->get()), CONNECT_DEFERRED);
+ mb->get_popup()->connect("index_pressed", callable_mp(this, &AnimationNodeBlendTreeEditor::_anim_selected), varray(options, E->get()), CONNECT_DEFERRED);
}
if (EditorSettings::get_singleton()->get("interface/theme/use_graph_node_headers")) {
- Ref<StyleBoxFlat> sb = node->get_stylebox("frame", "GraphNode");
+ Ref<StyleBoxFlat> sb = node->get_theme_stylebox("frame", "GraphNode");
Color c = sb->get_border_color();
Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0) : Color(0.0, 0.0, 0.0);
mono_color.a = 0.85;
c = mono_color;
- node->add_color_override("title_color", c);
+ node->add_theme_color_override("title_color", c);
c.a = 0.7;
- node->add_color_override("close_color", c);
- node->add_color_override("resizer_color", c);
+ node->add_theme_color_override("close_color", c);
+ node->add_theme_color_override("resizer_color", c);
}
}
@@ -259,7 +249,6 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
blend_tree->get_node_connections(&connections);
for (List<AnimationNodeBlendTree::NodeConnection>::Element *E = connections.front(); E; E = E->next()) {
-
StringName from = E->get().output_node;
StringName to = E->get().input_node;
int to_idx = E->get().input_index;
@@ -269,7 +258,6 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
}
void AnimationNodeBlendTreeEditor::_file_opened(const String &p_file) {
-
file_loaded = ResourceLoader::load(p_file);
if (file_loaded.is_valid()) {
_add_node(MENU_LOAD_FILE_CONFIRM);
@@ -277,27 +265,24 @@ void AnimationNodeBlendTreeEditor::_file_opened(const String &p_file) {
}
void AnimationNodeBlendTreeEditor::_add_node(int p_idx) {
-
Ref<AnimationNode> anode;
String base_name;
if (p_idx == MENU_LOAD_FILE) {
-
open_file->clear_filters();
List<String> filters;
ResourceLoader::get_recognized_extensions_for_type("AnimationNode", &filters);
for (List<String>::Element *E = filters.front(); E; E = E->next()) {
open_file->add_filter("*." + E->get());
}
- open_file->popup_centered_ratio();
+ open_file->popup_file_dialog();
return;
} else if (p_idx == MENU_LOAD_FILE_CONFIRM) {
anode = file_loaded;
file_loaded.unref();
base_name = anode->get_class();
} else if (p_idx == MENU_PASTE) {
-
anode = EditorSettings::get_singleton()->get_resource_clipboard();
ERR_FAIL_COND(!anode.is_valid());
base_name = anode->get_class();
@@ -312,7 +297,7 @@ void AnimationNodeBlendTreeEditor::_add_node(int p_idx) {
AnimationNode *an = Object::cast_to<AnimationNode>(ClassDB::instance(base_type));
ERR_FAIL_COND(!an);
anode = Ref<AnimationNode>(an);
- anode->set_script(add_options[p_idx].script.get_ref_ptr());
+ anode->set_script(add_options[p_idx].script);
base_name = add_options[p_idx].name;
}
@@ -347,7 +332,6 @@ void AnimationNodeBlendTreeEditor::_add_node(int p_idx) {
}
void AnimationNodeBlendTreeEditor::_node_dragged(const Vector2 &p_from, const Vector2 &p_to, const StringName &p_which) {
-
updating = true;
undo_redo->create_action(TTR("Node Moved"));
undo_redo->add_do_method(blend_tree.ptr(), "set_node_position", p_which, p_to / EDSCALE);
@@ -359,7 +343,6 @@ void AnimationNodeBlendTreeEditor::_node_dragged(const Vector2 &p_from, const Ve
}
void AnimationNodeBlendTreeEditor::_connection_request(const String &p_from, int p_from_index, const String &p_to, int p_to_index) {
-
AnimationNodeBlendTree::ConnectionError err = blend_tree->can_connect_node(p_to, p_to_index, p_from);
if (err != AnimationNodeBlendTree::CONNECTION_OK) {
@@ -376,7 +359,6 @@ void AnimationNodeBlendTreeEditor::_connection_request(const String &p_from, int
}
void AnimationNodeBlendTreeEditor::_disconnection_request(const String &p_from, int p_from_index, const String &p_to, int p_to_index) {
-
graph->disconnect_node(p_from, p_from_index, p_to, p_to_index);
updating = true;
@@ -390,7 +372,6 @@ void AnimationNodeBlendTreeEditor::_disconnection_request(const String &p_from,
}
void AnimationNodeBlendTreeEditor::_anim_selected(int p_index, Array p_options, const String &p_node) {
-
String option = p_options[p_index];
Ref<AnimationNodeAnimation> anim = blend_tree->get_node(p_node);
@@ -405,7 +386,6 @@ void AnimationNodeBlendTreeEditor::_anim_selected(int p_index, Array p_options,
}
void AnimationNodeBlendTreeEditor::_delete_request(const String &p_which) {
-
undo_redo->create_action(TTR("Delete Node"));
undo_redo->add_do_method(blend_tree.ptr(), "remove_node", p_which);
undo_redo->add_undo_method(blend_tree.ptr(), "add_node", p_which, blend_tree->get_node(p_which), blend_tree.ptr()->get_node_position(p_which));
@@ -425,7 +405,6 @@ void AnimationNodeBlendTreeEditor::_delete_request(const String &p_which) {
}
void AnimationNodeBlendTreeEditor::_delete_nodes_request() {
-
List<StringName> to_erase;
for (int i = 0; i < graph->get_child_count(); i++) {
@@ -437,8 +416,9 @@ void AnimationNodeBlendTreeEditor::_delete_nodes_request() {
}
}
- if (to_erase.empty())
+ if (to_erase.empty()) {
return;
+ }
undo_redo->create_action(TTR("Delete Node(s)"));
@@ -450,7 +430,6 @@ void AnimationNodeBlendTreeEditor::_delete_nodes_request() {
}
void AnimationNodeBlendTreeEditor::_popup_request(const Vector2 &p_position) {
-
_update_options_menu();
use_popup_menu_position = true;
popup_menu_position = graph->get_local_mouse_position();
@@ -459,7 +438,6 @@ void AnimationNodeBlendTreeEditor::_popup_request(const Vector2 &p_position) {
}
void AnimationNodeBlendTreeEditor::_node_selected(Object *p_node) {
-
GraphNode *gn = Object::cast_to<GraphNode>(p_node);
ERR_FAIL_COND(!gn);
@@ -472,14 +450,12 @@ void AnimationNodeBlendTreeEditor::_node_selected(Object *p_node) {
}
void AnimationNodeBlendTreeEditor::_open_in_editor(const String &p_which) {
-
Ref<AnimationNode> an = blend_tree->get_node(p_which);
ERR_FAIL_COND(!an.is_valid());
AnimationTreeEditor::get_singleton()->enter_editor(p_which);
}
void AnimationNodeBlendTreeEditor::_filter_toggled() {
-
updating = true;
undo_redo->create_action(TTR("Toggle Filter On/Off"));
undo_redo->add_do_method(_filter_edit.ptr(), "set_filter_enabled", filter_enabled->is_pressed());
@@ -491,7 +467,6 @@ void AnimationNodeBlendTreeEditor::_filter_toggled() {
}
void AnimationNodeBlendTreeEditor::_filter_edited() {
-
TreeItem *edited = filters->get_edited();
ERR_FAIL_COND(!edited);
@@ -509,9 +484,9 @@ void AnimationNodeBlendTreeEditor::_filter_edited() {
}
bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &anode) {
-
- if (updating || _filter_edit != anode)
+ if (updating || _filter_edit != anode) {
return false;
+ }
NodePath player_path = AnimationTreeEditor::get_singleton()->get_tree()->get_animation_player();
@@ -536,13 +511,12 @@ bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &ano
updating = true;
Set<String> paths;
- HashMap<String, Set<String> > types;
+ HashMap<String, Set<String>> types;
{
List<StringName> animations;
player->get_animation_list(&animations);
for (List<StringName>::Element *E = animations.front(); E; E = E->next()) {
-
Ref<Animation> anim = player->get_animation(E->get());
for (int i = 0; i < anim->get_track_count(); i++) {
String track_path = anim->track_get_path(i);
@@ -577,9 +551,8 @@ bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &ano
Map<String, TreeItem *> parenthood;
for (Set<String>::Element *E = paths.front(); E; E = E->next()) {
-
NodePath path = E->get();
- TreeItem *ti = NULL;
+ TreeItem *ti = nullptr;
String accum;
for (int i = 0; i < path.get_name_count(); i++) {
String name = path.get_name(i);
@@ -608,18 +581,18 @@ bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &ano
}
}
- Node *node = NULL;
+ Node *node = nullptr;
if (base->has_node(accum)) {
node = base->get_node(accum);
}
- if (!node)
+ if (!node) {
continue; //no node, can't edit
+ }
if (path.get_subname_count()) {
-
String concat = path.get_concatenated_subnames();
- Skeleton *skeleton = Object::cast_to<Skeleton>(node);
+ Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node);
if (skeleton && skeleton->find_bone(concat) != -1) {
//path in skeleton
const String &bone = concat;
@@ -643,7 +616,7 @@ bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &ano
ti->set_text(0, F->get());
ti->set_selectable(0, false);
ti->set_editable(0, false);
- ti->set_icon(0, get_icon("BoneAttachment", "EditorIcons"));
+ ti->set_icon(0, get_theme_icon("BoneAttachment3D", "EditorIcons"));
} else {
ti = parenthood[accum];
}
@@ -654,7 +627,7 @@ bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &ano
ti->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
ti->set_text(0, concat);
ti->set_checked(0, anode->is_path_filtered(path));
- ti->set_icon(0, get_icon("BoneAttachment", "EditorIcons"));
+ ti->set_icon(0, get_theme_icon("BoneAttachment3D", "EditorIcons"));
ti->set_metadata(0, path);
} else {
@@ -697,36 +670,34 @@ bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &ano
}
void AnimationNodeBlendTreeEditor::_edit_filters(const String &p_which) {
-
Ref<AnimationNode> anode = blend_tree->get_node(p_which);
ERR_FAIL_COND(!anode.is_valid());
_filter_edit = anode;
- if (!_update_filters(anode))
+ if (!_update_filters(anode)) {
return;
+ }
- filter_dialog->popup_centered_minsize(Size2(500, 500) * EDSCALE);
+ filter_dialog->popup_centered(Size2(500, 500) * EDSCALE);
}
void AnimationNodeBlendTreeEditor::_removed_from_graph() {
if (is_visible()) {
- EditorNode::get_singleton()->edit_item(NULL);
+ EditorNode::get_singleton()->edit_item(nullptr);
}
}
void AnimationNodeBlendTreeEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
+ error_panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
- error_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
-
- if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree())
+ if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree()) {
_update_graph();
+ }
}
if (p_what == NOTIFICATION_PROCESS) {
-
String error;
if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) {
@@ -756,7 +727,7 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) {
}
AnimationTree *graph_player = AnimationTreeEditor::get_singleton()->get_tree();
- AnimationPlayer *player = NULL;
+ AnimationPlayer *player = nullptr;
if (graph_player->has_node(graph_player->get_animation_player())) {
player = Object::cast_to<AnimationPlayer>(graph_player->get_node(graph_player->get_animation_player()));
}
@@ -789,44 +760,22 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) {
}
void AnimationNodeBlendTreeEditor::_scroll_changed(const Vector2 &p_scroll) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
blend_tree->set_graph_offset(p_scroll / EDSCALE);
updating = false;
}
void AnimationNodeBlendTreeEditor::_bind_methods() {
-
ClassDB::bind_method("_update_graph", &AnimationNodeBlendTreeEditor::_update_graph);
- ClassDB::bind_method("_add_node", &AnimationNodeBlendTreeEditor::_add_node);
- ClassDB::bind_method("_node_dragged", &AnimationNodeBlendTreeEditor::_node_dragged);
- ClassDB::bind_method("_node_renamed", &AnimationNodeBlendTreeEditor::_node_renamed);
- ClassDB::bind_method("_node_renamed_focus_out", &AnimationNodeBlendTreeEditor::_node_renamed_focus_out);
- ClassDB::bind_method("_connection_request", &AnimationNodeBlendTreeEditor::_connection_request);
- ClassDB::bind_method("_disconnection_request", &AnimationNodeBlendTreeEditor::_disconnection_request);
- ClassDB::bind_method("_node_selected", &AnimationNodeBlendTreeEditor::_node_selected);
- ClassDB::bind_method("_open_in_editor", &AnimationNodeBlendTreeEditor::_open_in_editor);
- ClassDB::bind_method("_scroll_changed", &AnimationNodeBlendTreeEditor::_scroll_changed);
- ClassDB::bind_method("_delete_request", &AnimationNodeBlendTreeEditor::_delete_request);
- ClassDB::bind_method("_delete_nodes_request", &AnimationNodeBlendTreeEditor::_delete_nodes_request);
- ClassDB::bind_method("_popup_request", &AnimationNodeBlendTreeEditor::_popup_request);
- ClassDB::bind_method("_edit_filters", &AnimationNodeBlendTreeEditor::_edit_filters);
ClassDB::bind_method("_update_filters", &AnimationNodeBlendTreeEditor::_update_filters);
- ClassDB::bind_method("_filter_edited", &AnimationNodeBlendTreeEditor::_filter_edited);
- ClassDB::bind_method("_filter_toggled", &AnimationNodeBlendTreeEditor::_filter_toggled);
- ClassDB::bind_method("_removed_from_graph", &AnimationNodeBlendTreeEditor::_removed_from_graph);
- ClassDB::bind_method("_property_changed", &AnimationNodeBlendTreeEditor::_property_changed);
- ClassDB::bind_method("_file_opened", &AnimationNodeBlendTreeEditor::_file_opened);
- ClassDB::bind_method("_update_options_menu", &AnimationNodeBlendTreeEditor::_update_options_menu);
-
- ClassDB::bind_method("_anim_selected", &AnimationNodeBlendTreeEditor::_anim_selected);
}
-AnimationNodeBlendTreeEditor *AnimationNodeBlendTreeEditor::singleton = NULL;
+AnimationNodeBlendTreeEditor *AnimationNodeBlendTreeEditor::singleton = nullptr;
void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<AnimationNode> p_node) {
-
String prev_name = blend_tree->get_node_name(p_node);
ERR_FAIL_COND(prev_name == String());
GraphNode *gn = Object::cast_to<GraphNode>(graph->get_node(prev_name));
@@ -879,7 +828,6 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima
blend_tree->get_node_connections(&connections);
for (List<AnimationNodeBlendTree::NodeConnection>::Element *E = connections.front(); E; E = E->next()) {
-
StringName from = E->get().output_node;
StringName to = E->get().input_node;
int to_idx = E->get().input_index;
@@ -909,9 +857,8 @@ bool AnimationNodeBlendTreeEditor::can_edit(const Ref<AnimationNode> &p_node) {
}
void AnimationNodeBlendTreeEditor::edit(const Ref<AnimationNode> &p_node) {
-
if (blend_tree.is_valid()) {
- blend_tree->disconnect("removed_from_graph", this, "_removed_from_graph");
+ blend_tree->disconnect("removed_from_graph", callable_mp(this, &AnimationNodeBlendTreeEditor::_removed_from_graph));
}
blend_tree = p_node;
@@ -919,14 +866,13 @@ void AnimationNodeBlendTreeEditor::edit(const Ref<AnimationNode> &p_node) {
if (blend_tree.is_null()) {
hide();
} else {
- blend_tree->connect("removed_from_graph", this, "_removed_from_graph");
+ blend_tree->connect("removed_from_graph", callable_mp(this, &AnimationNodeBlendTreeEditor::_removed_from_graph));
_update_graph();
}
}
AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() {
-
singleton = this;
updating = false;
use_popup_menu_position = false;
@@ -936,12 +882,12 @@ AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() {
graph->add_valid_right_disconnect_type(0);
graph->add_valid_left_disconnect_type(0);
graph->set_v_size_flags(SIZE_EXPAND_FILL);
- graph->connect("connection_request", this, "_connection_request", varray(), CONNECT_DEFERRED);
- graph->connect("disconnection_request", this, "_disconnection_request", varray(), CONNECT_DEFERRED);
- graph->connect("node_selected", this, "_node_selected");
- graph->connect("scroll_offset_changed", this, "_scroll_changed");
- graph->connect("delete_nodes_request", this, "_delete_nodes_request");
- graph->connect("popup_request", this, "_popup_request");
+ graph->connect("connection_request", callable_mp(this, &AnimationNodeBlendTreeEditor::_connection_request), varray(), CONNECT_DEFERRED);
+ graph->connect("disconnection_request", callable_mp(this, &AnimationNodeBlendTreeEditor::_disconnection_request), varray(), CONNECT_DEFERRED);
+ graph->connect("node_selected", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_selected));
+ graph->connect("scroll_offset_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_scroll_changed));
+ graph->connect("delete_nodes_request", callable_mp(this, &AnimationNodeBlendTreeEditor::_delete_nodes_request));
+ graph->connect("popup_request", callable_mp(this, &AnimationNodeBlendTreeEditor::_popup_request));
VSeparator *vs = memnew(VSeparator);
graph->get_zoom_hbox()->add_child(vs);
@@ -951,8 +897,8 @@ AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() {
graph->get_zoom_hbox()->add_child(add_node);
add_node->set_text(TTR("Add Node..."));
graph->get_zoom_hbox()->move_child(add_node, 0);
- add_node->get_popup()->connect("id_pressed", this, "_add_node");
- add_node->connect("about_to_show", this, "_update_options_menu");
+ add_node->get_popup()->connect("id_pressed", callable_mp(this, &AnimationNodeBlendTreeEditor::_add_node));
+ add_node->connect("about_to_popup", callable_mp(this, &AnimationNodeBlendTreeEditor::_update_options_menu));
add_options.push_back(AddOption("Animation", "AnimationNodeAnimation"));
add_options.push_back(AddOption("OneShot", "AnimationNodeOneShot"));
@@ -984,19 +930,19 @@ AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() {
filter_enabled = memnew(CheckBox);
filter_enabled->set_text(TTR("Enable Filtering"));
- filter_enabled->connect("pressed", this, "_filter_toggled");
+ filter_enabled->connect("pressed", callable_mp(this, &AnimationNodeBlendTreeEditor::_filter_toggled));
filter_vbox->add_child(filter_enabled);
filters = memnew(Tree);
filter_vbox->add_child(filters);
filters->set_v_size_flags(SIZE_EXPAND_FILL);
filters->set_hide_root(true);
- filters->connect("item_edited", this, "_filter_edited");
+ filters->connect("item_edited", callable_mp(this, &AnimationNodeBlendTreeEditor::_filter_edited));
open_file = memnew(EditorFileDialog);
add_child(open_file);
open_file->set_title(TTR("Open Animation Node"));
- open_file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- open_file->connect("file_selected", this, "_file_opened");
+ open_file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ open_file->connect("file_selected", callable_mp(this, &AnimationNodeBlendTreeEditor::_file_opened));
undo_redo = EditorNode::get_undo_redo();
}
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.h b/editor/plugins/animation_blend_tree_editor_plugin.h
index 4f5badea9f..3ebf623eef 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.h
+++ b/editor/plugins/animation_blend_tree_editor_plugin.h
@@ -44,7 +44,6 @@
class ProgressBar;
class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin {
-
GDCLASS(AnimationNodeBlendTreeEditor, AnimationTreeNodeEditorPlugin);
Ref<AnimationNodeBlendTree> blend_tree;
@@ -130,10 +129,10 @@ public:
void add_custom_type(const String &p_name, const Ref<Script> &p_script);
void remove_custom_type(const Ref<Script> &p_script);
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
- virtual bool can_edit(const Ref<AnimationNode> &p_node);
- virtual void edit(const Ref<AnimationNode> &p_node);
+ virtual bool can_edit(const Ref<AnimationNode> &p_node) override;
+ virtual void edit(const Ref<AnimationNode> &p_node) override;
AnimationNodeBlendTreeEditor();
};
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index 5e69ce4e69..6e4a39d3f0 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -30,54 +30,48 @@
#include "animation_player_editor_plugin.h"
+#include "core/input/input.h"
#include "core/io/resource_loader.h"
#include "core/io/resource_saver.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/project_settings.h"
#include "editor/animation_track_editor.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
-
-// For onion skinning.
-#include "editor/plugins/canvas_item_editor_plugin.h"
-#include "editor/plugins/spatial_editor_plugin.h"
-#include "scene/main/viewport.h"
-#include "servers/visual_server.h"
+#include "editor/plugins/canvas_item_editor_plugin.h" // For onion skinning.
+#include "editor/plugins/node_3d_editor_plugin.h" // For onion skinning.
+#include "scene/main/window.h"
+#include "servers/rendering_server.h"
void AnimationPlayerEditor::_node_removed(Node *p_node) {
-
if (player && player == p_node) {
- player = NULL;
+ player = nullptr;
set_process(false);
track_editor->set_animation(Ref<Animation>());
- track_editor->set_root(NULL);
+ track_editor->set_root(nullptr);
track_editor->show_select_node_warning(true);
_update_player();
}
}
void AnimationPlayerEditor::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_PROCESS: {
-
- if (!player)
+ if (!player) {
return;
+ }
updating = true;
if (player->is_playing()) {
-
{
String animname = player->get_assigned_animation();
if (player->has_animation(animname)) {
Ref<Animation> anim = player->get_animation(animname);
if (!anim.is_null()) {
-
frame->set_max(anim->get_length());
}
}
@@ -98,42 +92,39 @@ void AnimationPlayerEditor::_notification(int p_what) {
updating = false;
} break;
case NOTIFICATION_ENTER_TREE: {
+ tool_anim->get_popup()->connect("id_pressed", callable_mp(this, &AnimationPlayerEditor::_animation_tool_menu));
- tool_anim->get_popup()->connect("id_pressed", this, "_animation_tool_menu");
+ onion_skinning->get_popup()->connect("id_pressed", callable_mp(this, &AnimationPlayerEditor::_onion_skinning_menu));
- onion_skinning->get_popup()->connect("id_pressed", this, "_onion_skinning_menu");
+ blend_editor.next->connect("item_selected", callable_mp(this, &AnimationPlayerEditor::_blend_editor_next_changed));
- blend_editor.next->connect("item_selected", this, "_blend_editor_next_changed");
+ get_tree()->connect("node_removed", callable_mp(this, &AnimationPlayerEditor::_node_removed));
- get_tree()->connect("node_removed", this, "_node_removed");
-
- add_style_override("panel", editor->get_gui_base()->get_stylebox("panel", "Panel"));
+ add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox("panel", "Panel"));
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-
- add_style_override("panel", editor->get_gui_base()->get_stylebox("panel", "Panel"));
+ add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox("panel", "Panel"));
} break;
case NOTIFICATION_THEME_CHANGED: {
+ autoplay->set_icon(get_theme_icon("AutoPlay", "EditorIcons"));
- autoplay->set_icon(get_icon("AutoPlay", "EditorIcons"));
-
- play->set_icon(get_icon("PlayStart", "EditorIcons"));
- play_from->set_icon(get_icon("Play", "EditorIcons"));
- play_bw->set_icon(get_icon("PlayStartBackwards", "EditorIcons"));
- play_bw_from->set_icon(get_icon("PlayBackwards", "EditorIcons"));
+ play->set_icon(get_theme_icon("PlayStart", "EditorIcons"));
+ play_from->set_icon(get_theme_icon("Play", "EditorIcons"));
+ play_bw->set_icon(get_theme_icon("PlayStartBackwards", "EditorIcons"));
+ play_bw_from->set_icon(get_theme_icon("PlayBackwards", "EditorIcons"));
- autoplay_icon = get_icon("AutoPlay", "EditorIcons");
- stop->set_icon(get_icon("Stop", "EditorIcons"));
+ autoplay_icon = get_theme_icon("AutoPlay", "EditorIcons");
+ stop->set_icon(get_theme_icon("Stop", "EditorIcons"));
- onion_toggle->set_icon(get_icon("Onion", "EditorIcons"));
- onion_skinning->set_icon(get_icon("GuiTabMenu", "EditorIcons"));
+ onion_toggle->set_icon(get_theme_icon("Onion", "EditorIcons"));
+ onion_skinning->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons"));
- pin->set_icon(get_icon("Pin", "EditorIcons"));
+ pin->set_icon(get_theme_icon("Pin", "EditorIcons"));
- tool_anim->add_style_override("normal", get_stylebox("normal", "Button"));
- track_editor->get_edit_menu()->add_style_override("normal", get_stylebox("normal", "Button"));
+ tool_anim->add_theme_style_override("normal", get_theme_stylebox("normal", "Button"));
+ track_editor->get_edit_menu()->add_theme_style_override("normal", get_theme_stylebox("normal", "Button"));
-#define ITEM_ICON(m_item, m_icon) tool_anim->get_popup()->set_item_icon(tool_anim->get_popup()->get_item_index(m_item), get_icon(m_icon, "EditorIcons"))
+#define ITEM_ICON(m_item, m_icon) tool_anim->get_popup()->set_item_icon(tool_anim->get_popup()->get_item_index(m_item), get_theme_icon(m_icon, "EditorIcons"))
ITEM_ICON(TOOL_NEW_ANIM, "New");
ITEM_ICON(TOOL_LOAD_ANIM, "Load");
@@ -149,9 +140,9 @@ void AnimationPlayerEditor::_notification(int p_what) {
}
void AnimationPlayerEditor::_autoplay_pressed() {
-
- if (updating)
+ if (updating) {
return;
+ }
if (animation->get_item_count() == 0) {
return;
}
@@ -178,17 +169,15 @@ void AnimationPlayerEditor::_autoplay_pressed() {
}
void AnimationPlayerEditor::_play_pressed() {
-
String current;
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count()) {
-
current = animation->get_item_text(animation->get_selected());
}
if (current != "") {
-
- if (current == player->get_assigned_animation())
+ if (current == player->get_assigned_animation()) {
player->stop(); //so it won't blend with itself
+ }
player->play(current);
}
@@ -197,19 +186,15 @@ void AnimationPlayerEditor::_play_pressed() {
}
void AnimationPlayerEditor::_play_from_pressed() {
-
String current;
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count()) {
-
current = animation->get_item_text(animation->get_selected());
}
if (current != "") {
-
float time = player->get_current_animation_position();
if (current == player->get_assigned_animation() && player->is_playing()) {
-
player->stop(); //so it won't blend with itself
}
@@ -222,17 +207,15 @@ void AnimationPlayerEditor::_play_from_pressed() {
}
void AnimationPlayerEditor::_play_bw_pressed() {
-
String current;
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count()) {
-
current = animation->get_item_text(animation->get_selected());
}
if (current != "") {
-
- if (current == player->get_assigned_animation())
+ if (current == player->get_assigned_animation()) {
player->stop(); //so it won't blend with itself
+ }
player->play(current, -1, -1, true);
}
@@ -241,18 +224,16 @@ void AnimationPlayerEditor::_play_bw_pressed() {
}
void AnimationPlayerEditor::_play_bw_from_pressed() {
-
String current;
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count()) {
-
current = animation->get_item_text(animation->get_selected());
}
if (current != "") {
-
float time = player->get_current_animation_position();
- if (current == player->get_assigned_animation())
+ if (current == player->get_assigned_animation()) {
player->stop(); //so it won't blend with itself
+ }
player->play(current, -1, -1, true);
player->seek(time);
@@ -261,8 +242,8 @@ void AnimationPlayerEditor::_play_bw_from_pressed() {
//unstop
stop->set_pressed(false);
}
-void AnimationPlayerEditor::_stop_pressed() {
+void AnimationPlayerEditor::_stop_pressed() {
if (!player) {
return;
}
@@ -273,24 +254,21 @@ void AnimationPlayerEditor::_stop_pressed() {
}
void AnimationPlayerEditor::_animation_selected(int p_which) {
-
- if (updating)
+ if (updating) {
return;
+ }
// when selecting an animation, the idea is that the only interesting behavior
// ui-wise is that it should play/blend the next one if currently playing
String current;
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count()) {
-
current = animation->get_item_text(animation->get_selected());
}
if (current != "") {
-
player->set_assigned_animation(current);
Ref<Animation> anim = player->get_animation(current);
{
-
track_editor->set_animation(anim);
Node *root = player->get_node(player->get_root());
if (root) {
@@ -301,7 +279,7 @@ void AnimationPlayerEditor::_animation_selected(int p_which) {
} else {
track_editor->set_animation(Ref<Animation>());
- track_editor->set_root(NULL);
+ track_editor->set_root(nullptr);
}
autoplay->set_pressed(current == player->get_autoplay());
@@ -312,7 +290,6 @@ void AnimationPlayerEditor::_animation_selected(int p_which) {
}
void AnimationPlayerEditor::_animation_new() {
-
renaming = false;
name_title->set_text(TTR("New Animation Name:"));
@@ -320,8 +297,9 @@ void AnimationPlayerEditor::_animation_new() {
String base = TTR("New Anim");
while (true) {
String attempt = base;
- if (count > 1)
+ if (count > 1) {
attempt += " (" + itos(count) + ")";
+ }
if (player->has_animation(attempt)) {
count++;
continue;
@@ -335,10 +313,11 @@ void AnimationPlayerEditor::_animation_new() {
name->select_all();
name->grab_focus();
}
-void AnimationPlayerEditor::_animation_rename() {
- if (animation->get_item_count() == 0)
+void AnimationPlayerEditor::_animation_rename() {
+ if (animation->get_item_count() == 0) {
return;
+ }
int selected = animation->get_selected();
String selected_name = animation->get_item_text(selected);
@@ -349,34 +328,33 @@ void AnimationPlayerEditor::_animation_rename() {
name->select_all();
name->grab_focus();
}
+
void AnimationPlayerEditor::_animation_load() {
ERR_FAIL_COND(!player);
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file->clear_filters();
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("Animation", &extensions);
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
-
file->add_filter("*." + E->get() + " ; " + E->get().to_upper());
}
- file->popup_centered_ratio();
+ file->popup_file_dialog();
current_option = RESOURCE_LOAD;
}
void AnimationPlayerEditor::_animation_save_in_path(const Ref<Resource> &p_resource, const String &p_path) {
-
int flg = 0;
- if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources")) {
flg |= ResourceSaver::FLAG_COMPRESS;
+ }
String path = ProjectSettings::get_singleton()->localize_path(p_path);
Error err = ResourceSaver::save(path, p_resource, flg | ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS);
if (err != OK) {
- accept->set_text(TTR("Error saving resource!"));
- accept->popup_centered_minsize();
+ EditorNode::get_singleton()->show_warning(TTR("Error saving resource!"));
return;
}
@@ -385,7 +363,6 @@ void AnimationPlayerEditor::_animation_save_in_path(const Ref<Resource> &p_resou
}
void AnimationPlayerEditor::_animation_save(const Ref<Resource> &p_resource) {
-
if (p_resource->get_path().is_resource_file()) {
_animation_save_in_path(p_resource, p_resource->get_path());
} else {
@@ -394,54 +371,51 @@ void AnimationPlayerEditor::_animation_save(const Ref<Resource> &p_resource) {
}
void AnimationPlayerEditor::_animation_save_as(const Ref<Resource> &p_resource) {
-
- file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
List<String> extensions;
ResourceSaver::get_recognized_extensions(p_resource, &extensions);
file->clear_filters();
for (int i = 0; i < extensions.size(); i++) {
-
file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
+ String path;
//file->set_current_path(current_path);
if (p_resource->get_path() != "") {
- file->set_current_path(p_resource->get_path());
+ path = p_resource->get_path();
if (extensions.size()) {
- String ext = p_resource->get_path().get_extension().to_lower();
- if (extensions.find(ext) == NULL) {
- file->set_current_path(p_resource->get_path().replacen("." + ext, "." + extensions.front()->get()));
+ if (extensions.find(p_resource->get_path().get_extension().to_lower()) == nullptr) {
+ path = p_resource->get_path().get_base_dir() + p_resource->get_name() + "." + extensions.front()->get();
}
}
} else {
-
- String existing;
if (extensions.size()) {
if (p_resource->get_name() != "") {
- existing = p_resource->get_name() + "." + extensions.front()->get().to_lower();
+ path = p_resource->get_name() + "." + extensions.front()->get().to_lower();
} else {
- existing = "new_" + p_resource->get_class().to_lower() + "." + extensions.front()->get().to_lower();
+ path = "new_" + p_resource->get_class().to_lower() + "." + extensions.front()->get().to_lower();
}
}
- file->set_current_path(existing);
}
- file->popup_centered_ratio();
+ file->set_current_path(path);
file->set_title(TTR("Save Resource As..."));
+ file->popup_file_dialog();
current_option = RESOURCE_SAVE;
}
void AnimationPlayerEditor::_animation_remove() {
-
- if (animation->get_item_count() == 0)
+ if (animation->get_item_count() == 0) {
return;
+ }
- delete_dialog->set_text(TTR("Delete Animation?"));
- delete_dialog->popup_centered_minsize();
+ String current = animation->get_item_text(animation->get_selected());
+
+ delete_dialog->set_text(vformat(TTR("Delete Animation '%s'?"), current));
+ delete_dialog->popup_centered();
}
void AnimationPlayerEditor::_animation_remove_confirmed() {
-
String current = animation->get_item_text(animation->get_selected());
Ref<Animation> anim = player->get_animation(current);
@@ -464,12 +438,9 @@ void AnimationPlayerEditor::_animation_remove_confirmed() {
}
void AnimationPlayerEditor::_select_anim_by_name(const String &p_anim) {
-
int idx = -1;
for (int i = 0; i < animation->get_item_count(); i++) {
-
if (animation->get_item_text(i) == p_anim) {
-
idx = i;
break;
}
@@ -483,7 +454,6 @@ void AnimationPlayerEditor::_select_anim_by_name(const String &p_anim) {
}
double AnimationPlayerEditor::_get_editor_step() const {
-
// Returns the effective snapping value depending on snapping modifiers, or 0 if snapping is disabled.
if (track_editor->is_snap_enabled()) {
const String current = player->get_assigned_animation();
@@ -498,13 +468,12 @@ double AnimationPlayerEditor::_get_editor_step() const {
}
void AnimationPlayerEditor::_animation_name_edited() {
-
player->stop();
String new_name = name->get_text();
if (new_name == "" || new_name.find(":") != -1 || new_name.find("/") != -1) {
error_dialog->set_text(TTR("Invalid animation name!"));
- error_dialog->popup_centered_minsize();
+ error_dialog->popup_centered();
return;
}
@@ -515,7 +484,7 @@ void AnimationPlayerEditor::_animation_name_edited() {
if (player->has_animation(new_name)) {
error_dialog->set_text(TTR("Animation name already exists!"));
- error_dialog->popup_centered_minsize();
+ error_dialog->popup_centered();
return;
}
@@ -535,7 +504,6 @@ void AnimationPlayerEditor::_animation_name_edited() {
_select_anim_by_name(new_name);
} else {
-
Ref<Animation> new_anim = Ref<Animation>(memnew(Animation));
new_anim->set_name(new_name);
@@ -557,9 +525,9 @@ void AnimationPlayerEditor::_animation_name_edited() {
}
void AnimationPlayerEditor::_blend_editor_next_changed(const int p_idx) {
-
- if (animation->get_item_count() == 0)
+ if (animation->get_item_count() == 0) {
return;
+ }
String current = animation->get_item_text(animation->get_selected());
@@ -572,14 +540,15 @@ void AnimationPlayerEditor::_blend_editor_next_changed(const int p_idx) {
}
void AnimationPlayerEditor::_animation_blend() {
-
- if (updating_blends)
+ if (updating_blends) {
return;
+ }
blend_editor.tree->clear();
- if (animation->get_item_count() == 0)
+ if (animation->get_item_count() == 0) {
return;
+ }
String current = animation->get_item_text(animation->get_selected());
@@ -600,7 +569,6 @@ void AnimationPlayerEditor::_animation_blend() {
blend_editor.next->add_item("", i);
for (List<StringName>::Element *E = anims.front(); E; E = E->next()) {
-
String to = E->get();
TreeItem *blend = blend_editor.tree->create_item(root);
blend->set_editable(0, false);
@@ -628,18 +596,20 @@ void AnimationPlayerEditor::_animation_blend() {
}
void AnimationPlayerEditor::_blend_edited() {
-
- if (updating_blends)
+ if (updating_blends) {
return;
+ }
- if (animation->get_item_count() == 0)
+ if (animation->get_item_count() == 0) {
return;
+ }
String current = animation->get_item_text(animation->get_selected());
TreeItem *selected = blend_editor.tree->get_edited();
- if (!selected)
+ if (!selected) {
return;
+ }
updating_blends = true;
String to = selected->get_text(0);
@@ -656,15 +626,14 @@ void AnimationPlayerEditor::_blend_edited() {
}
void AnimationPlayerEditor::ensure_visibility() {
-
- if (player && pin->is_pressed())
+ if (player && pin->is_pressed()) {
return; // another player is pinned, don't reset
+ }
_animation_edit();
}
Dictionary AnimationPlayerEditor::get_state() const {
-
Dictionary d;
d["visible"] = is_visible_in_tree();
@@ -676,8 +645,8 @@ Dictionary AnimationPlayerEditor::get_state() const {
return d;
}
-void AnimationPlayerEditor::set_state(const Dictionary &p_state) {
+void AnimationPlayerEditor::set_state(const Dictionary &p_state) {
if (!p_state.has("visible") || !p_state["visible"]) {
return;
}
@@ -686,7 +655,6 @@ void AnimationPlayerEditor::set_state(const Dictionary &p_state) {
}
if (p_state.has("player")) {
-
Node *n = EditorNode::get_singleton()->get_edited_scene()->get_node(p_state["player"]);
if (Object::cast_to<AnimationPlayer>(n) && EditorNode::get_singleton()->get_editor_selection()->is_selected(n)) {
player = Object::cast_to<AnimationPlayer>(n);
@@ -711,7 +679,6 @@ void AnimationPlayerEditor::set_state(const Dictionary &p_state) {
}
void AnimationPlayerEditor::_animation_resource_edit() {
-
if (animation->get_item_count()) {
String current = animation->get_item_text(animation->get_selected());
Ref<Animation> anim = player->get_animation(current);
@@ -720,7 +687,6 @@ void AnimationPlayerEditor::_animation_resource_edit() {
}
void AnimationPlayerEditor::_animation_edit() {
-
if (animation->get_item_count()) {
String current = animation->get_item_text(animation->get_selected());
Ref<Animation> anim = player->get_animation(current);
@@ -732,36 +698,30 @@ void AnimationPlayerEditor::_animation_edit() {
}
} else {
track_editor->set_animation(Ref<Animation>());
- track_editor->set_root(NULL);
+ track_editor->set_root(nullptr);
}
}
-void AnimationPlayerEditor::_dialog_action(String p_file) {
-
+void AnimationPlayerEditor::_dialog_action(String p_path) {
switch (current_option) {
case RESOURCE_LOAD: {
ERR_FAIL_COND(!player);
- Ref<Resource> res = ResourceLoader::load(p_file, "Animation");
- ERR_FAIL_COND_MSG(res.is_null(), "Cannot load Animation from file '" + p_file + "'.");
- ERR_FAIL_COND_MSG(!res->is_class("Animation"), "Loaded resource from file '" + p_file + "' is not Animation.");
- if (p_file.find_last("/") != -1) {
+ Ref<Resource> res = ResourceLoader::load(p_path, "Animation");
+ ERR_FAIL_COND_MSG(res.is_null(), "Cannot load Animation from file '" + p_path + "'.");
+ ERR_FAIL_COND_MSG(!res->is_class("Animation"), "Loaded resource from file '" + p_path + "' is not Animation.");
- p_file = p_file.substr(p_file.find_last("/") + 1, p_file.length());
+ String anim_name = p_path.get_file();
+ int ext_pos = anim_name.rfind(".");
+ if (ext_pos != -1) {
+ anim_name = anim_name.substr(0, ext_pos);
}
- if (p_file.find_last("\\") != -1) {
-
- p_file = p_file.substr(p_file.find_last("\\") + 1, p_file.length());
- }
-
- if (p_file.find(".") != -1)
- p_file = p_file.substr(0, p_file.find("."));
undo_redo->create_action(TTR("Load Animation"));
- undo_redo->add_do_method(player, "add_animation", p_file, res);
- undo_redo->add_undo_method(player, "remove_animation", p_file);
- if (player->has_animation(p_file)) {
- undo_redo->add_undo_method(player, "add_animation", p_file, player->get_animation(p_file));
+ undo_redo->add_do_method(player, "add_animation", anim_name, res);
+ undo_redo->add_undo_method(player, "remove_animation", anim_name);
+ if (player->has_animation(anim_name)) {
+ undo_redo->add_undo_method(player, "add_animation", anim_name, player->get_animation(anim_name));
}
undo_redo->add_do_method(this, "_animation_player_changed", player);
undo_redo->add_undo_method(this, "_animation_player_changed", player);
@@ -769,7 +729,6 @@ void AnimationPlayerEditor::_dialog_action(String p_file) {
break;
}
case RESOURCE_SAVE: {
-
String current = animation->get_item_text(animation->get_selected());
if (current != "") {
Ref<Animation> anim = player->get_animation(current);
@@ -778,31 +737,27 @@ void AnimationPlayerEditor::_dialog_action(String p_file) {
RES current_res = RES(Object::cast_to<Resource>(*anim));
- _animation_save_in_path(current_res, p_file);
+ _animation_save_in_path(current_res, p_path);
}
}
}
}
void AnimationPlayerEditor::_scale_changed(const String &p_scale) {
-
- player->set_speed_scale(p_scale.to_double());
+ player->set_speed_scale(p_scale.to_float());
}
void AnimationPlayerEditor::_update_animation() {
-
// the purpose of _update_animation is to reflect the current state
// of the animation player in the current editor..
updating = true;
if (player->is_playing()) {
-
play->set_pressed(true);
stop->set_pressed(false);
} else {
-
play->set_pressed(false);
stop->set_pressed(true);
}
@@ -811,7 +766,6 @@ void AnimationPlayerEditor::_update_animation() {
String current = player->get_assigned_animation();
for (int i = 0; i < animation->get_item_count(); i++) {
-
if (animation->get_item_text(i) == current) {
animation->select(i);
break;
@@ -822,11 +776,11 @@ void AnimationPlayerEditor::_update_animation() {
}
void AnimationPlayerEditor::_update_player() {
-
updating = true;
List<StringName> animlist;
- if (player)
+ if (player) {
player->get_animation_list(&animlist);
+ }
animation->clear();
@@ -848,10 +802,10 @@ void AnimationPlayerEditor::_update_player() {
frame->set_editable(animlist.size() != 0);
animation->set_disabled(animlist.size() == 0);
autoplay->set_disabled(animlist.size() == 0);
- tool_anim->set_disabled(player == NULL);
+ tool_anim->set_disabled(player == nullptr);
onion_toggle->set_disabled(animlist.size() == 0);
onion_skinning->set_disabled(animlist.size() == 0);
- pin->set_disabled(player == NULL);
+ pin->set_disabled(player == nullptr);
if (!player) {
AnimationPlayerEditor::singleton->get_track_editor()->update_keying();
@@ -861,14 +815,15 @@ void AnimationPlayerEditor::_update_player() {
int active_idx = -1;
for (List<StringName>::Element *E = animlist.front(); E; E = E->next()) {
-
- if (player->get_autoplay() == E->get())
+ if (player->get_autoplay() == E->get()) {
animation->add_icon_item(autoplay_icon, E->get());
- else
+ } else {
animation->add_item(E->get());
+ }
- if (player->get_assigned_animation() == E->get())
+ if (player->get_assigned_animation() == E->get()) {
active_idx = animation->get_item_count() - 1;
+ }
}
updating = false;
@@ -878,7 +833,6 @@ void AnimationPlayerEditor::_update_player() {
_animation_selected(active_idx);
} else if (animation->get_item_count() > 0) {
-
animation->select(0);
autoplay->set_pressed(animation->get_item_text(0) == player->get_autoplay());
_animation_selected(0);
@@ -900,38 +854,41 @@ void AnimationPlayerEditor::_update_player() {
}
void AnimationPlayerEditor::edit(AnimationPlayer *p_player) {
-
- if (player && pin->is_pressed())
+ if (player && pin->is_pressed()) {
return; // Ignore, pinned.
+ }
player = p_player;
if (player) {
_update_player();
if (onion.enabled) {
- if (animation->get_item_count() > 0)
+ if (animation->get_item_count() > 0) {
_start_onion_skinning();
- else
+ } else {
_stop_onion_skinning();
+ }
}
track_editor->show_select_node_warning(false);
} else {
- if (onion.enabled)
+ if (onion.enabled) {
_stop_onion_skinning();
+ }
track_editor->show_select_node_warning(true);
}
}
void AnimationPlayerEditor::forward_canvas_force_draw_over_viewport(Control *p_overlay) {
-
- if (!onion.can_overlay)
+ if (!onion.can_overlay) {
return;
+ }
// Can happen on viewport resize, at least.
- if (!_are_onion_layers_valid())
+ if (!_are_onion_layers_valid()) {
return;
+ }
RID ci = p_overlay->get_canvas_item();
Rect2 src_rect = p_overlay->get_global_rect();
@@ -950,8 +907,8 @@ void AnimationPlayerEditor::forward_canvas_force_draw_over_viewport(Control *p_o
alpha += alpha_step;
if (onion.captures_valid[cidx]) {
- VS::get_singleton()->canvas_item_add_texture_rect_region(
- ci, dst_rect, VS::get_singleton()->viewport_get_texture(onion.captures[cidx]), src_rect, Color(1, 1, 1, alpha));
+ RS::get_singleton()->canvas_item_add_texture_rect_region(
+ ci, dst_rect, RS::get_singleton()->viewport_get_texture(onion.captures[cidx]), src_rect, Color(1, 1, 1, alpha));
}
cidx++;
@@ -964,8 +921,8 @@ void AnimationPlayerEditor::forward_canvas_force_draw_over_viewport(Control *p_o
alpha -= alpha_step;
if (onion.captures_valid[cidx]) {
- VS::get_singleton()->canvas_item_add_texture_rect_region(
- ci, dst_rect, VS::get_singleton()->viewport_get_texture(onion.captures[cidx]), src_rect, Color(1, 1, 1, alpha));
+ RS::get_singleton()->canvas_item_add_texture_rect_region(
+ ci, dst_rect, RS::get_singleton()->viewport_get_texture(onion.captures[cidx]), src_rect, Color(1, 1, 1, alpha));
}
cidx++;
@@ -974,22 +931,21 @@ void AnimationPlayerEditor::forward_canvas_force_draw_over_viewport(Control *p_o
}
void AnimationPlayerEditor::_animation_duplicate() {
-
- if (!animation->get_item_count())
+ if (!animation->get_item_count()) {
return;
+ }
String current = animation->get_item_text(animation->get_selected());
Ref<Animation> anim = player->get_animation(current);
- if (!anim.is_valid())
+ if (!anim.is_valid()) {
return;
+ }
Ref<Animation> new_anim = memnew(Animation);
List<PropertyInfo> plist;
anim->get_property_list(&plist);
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
-
if (E->get().usage & PROPERTY_USAGE_STORAGE) {
-
new_anim->set(E->get().name, anim->get(E->get().name));
}
}
@@ -1010,9 +966,7 @@ void AnimationPlayerEditor::_animation_duplicate() {
undo_redo->commit_action();
for (int i = 0; i < animation->get_item_count(); i++) {
-
if (animation->get_item_text(i) == new_name) {
-
animation->select(i);
_animation_selected(i);
return;
@@ -1021,7 +975,6 @@ void AnimationPlayerEditor::_animation_duplicate() {
}
void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set) {
-
if (updating || !player || player->is_playing()) {
return;
};
@@ -1057,41 +1010,42 @@ void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set) {
};
void AnimationPlayerEditor::_animation_player_changed(Object *p_pl) {
-
if (player == p_pl && is_visible_in_tree()) {
-
_update_player();
- if (blend_editor.dialog->is_visible_in_tree())
+ if (blend_editor.dialog->is_visible()) {
_animation_blend(); // Update.
+ }
}
}
void AnimationPlayerEditor::_list_changed() {
-
- if (is_visible_in_tree())
+ if (is_visible_in_tree()) {
_update_player();
+ }
}
void AnimationPlayerEditor::_animation_key_editor_anim_len_changed(float p_len) {
-
frame->set_max(p_len);
}
void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag) {
-
timeline_position = p_pos;
- if (!is_visible_in_tree())
+ if (!is_visible_in_tree()) {
return;
+ }
- if (!player)
+ if (!player) {
return;
+ }
- if (player->is_playing())
+ if (player->is_playing()) {
return;
+ }
- if (!player->has_animation(player->get_assigned_animation()))
+ if (!player->has_animation(player->get_assigned_animation())) {
return;
+ }
updating = true;
frame->set_value(Math::stepify(p_pos, _get_editor_step()));
@@ -1102,7 +1056,6 @@ void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag)
}
void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
-
String current;
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count()) {
current = animation->get_item_text(animation->get_selected());
@@ -1114,48 +1067,40 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
}
switch (p_option) {
-
case TOOL_NEW_ANIM: {
-
_animation_new();
} break;
case TOOL_LOAD_ANIM: {
-
_animation_load();
} break;
case TOOL_SAVE_ANIM: {
-
if (anim.is_valid()) {
_animation_save(anim);
}
} break;
case TOOL_SAVE_AS_ANIM: {
-
if (anim.is_valid()) {
_animation_save_as(anim);
}
} break;
case TOOL_DUPLICATE_ANIM: {
-
_animation_duplicate();
- } break;
- case TOOL_RENAME_ANIM: {
+ [[fallthrough]]; // Allow immediate rename after animation is duplicated
+ }
+ case TOOL_RENAME_ANIM: {
_animation_rename();
} break;
case TOOL_EDIT_TRANSITIONS: {
-
_animation_blend();
} break;
case TOOL_REMOVE_ANIM: {
-
_animation_remove();
} break;
case TOOL_COPY_ANIM: {
-
if (!animation->get_item_count()) {
error_dialog->set_text(TTR("No animation to copy!"));
- error_dialog->popup_centered_minsize();
+ error_dialog->popup_centered();
return;
}
@@ -1164,11 +1109,10 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
EditorSettings::get_singleton()->set_resource_clipboard(anim2);
} break;
case TOOL_PASTE_ANIM: {
-
Ref<Animation> anim2 = EditorSettings::get_singleton()->get_resource_clipboard();
if (!anim2.is_valid()) {
error_dialog->set_text(TTR("No animation resource on clipboard!"));
- error_dialog->popup_centered_minsize();
+ error_dialog->popup_centered();
return;
}
@@ -1180,7 +1124,6 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
int idx = 1;
String base = name;
while (player->has_animation(name)) {
-
idx++;
name = base + " " + itos(idx);
}
@@ -1195,10 +1138,9 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
_select_anim_by_name(name);
} break;
case TOOL_EDIT_RESOURCE: {
-
if (!animation->get_item_count()) {
error_dialog->set_text(TTR("No animation to edit!"));
- error_dialog->popup_centered_minsize();
+ error_dialog->popup_centered();
return;
}
@@ -1210,30 +1152,26 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
}
void AnimationPlayerEditor::_onion_skinning_menu(int p_option) {
-
PopupMenu *menu = onion_skinning->get_popup();
int idx = menu->get_item_index(p_option);
switch (p_option) {
-
case ONION_SKINNING_ENABLE: {
-
onion.enabled = !onion.enabled;
- if (onion.enabled)
+ if (onion.enabled) {
_start_onion_skinning();
- else
+ } else {
_stop_onion_skinning();
+ }
} break;
case ONION_SKINNING_PAST: {
-
// Ensure at least one of past/future is checked.
onion.past = onion.future ? !onion.past : true;
menu->set_item_checked(idx, onion.past);
} break;
case ONION_SKINNING_FUTURE: {
-
// Ensure at least one of past/future is checked.
onion.future = onion.past ? !onion.future : true;
menu->set_item_checked(idx, onion.future);
@@ -1241,7 +1179,6 @@ void AnimationPlayerEditor::_onion_skinning_menu(int p_option) {
case ONION_SKINNING_1_STEP: // Fall-through.
case ONION_SKINNING_2_STEPS:
case ONION_SKINNING_3_STEPS: {
-
onion.steps = (p_option - ONION_SKINNING_1_STEP) + 1;
int one_frame_idx = menu->get_item_index(ONION_SKINNING_1_STEP);
for (int i = 0; i <= ONION_SKINNING_LAST_STEPS_OPTION - ONION_SKINNING_1_STEP; i++) {
@@ -1249,17 +1186,14 @@ void AnimationPlayerEditor::_onion_skinning_menu(int p_option) {
}
} break;
case ONION_SKINNING_DIFFERENCES_ONLY: {
-
onion.differences_only = !onion.differences_only;
menu->set_item_checked(idx, onion.differences_only);
} break;
case ONION_SKINNING_FORCE_WHITE_MODULATE: {
-
onion.force_white_modulate = !onion.force_white_modulate;
menu->set_item_checked(idx, onion.force_white_modulate);
} break;
case ONION_SKINNING_INCLUDE_GIZMOS: {
-
onion.include_gizmos = !onion.include_gizmos;
menu->set_item_checked(idx, onion.include_gizmos);
} break;
@@ -1267,40 +1201,37 @@ void AnimationPlayerEditor::_onion_skinning_menu(int p_option) {
}
void AnimationPlayerEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
-
Ref<InputEventKey> k = p_ev;
if (is_visible_in_tree() && k.is_valid() && k->is_pressed() && !k->is_echo() && !k->get_alt() && !k->get_control() && !k->get_metakey()) {
-
- switch (k->get_scancode()) {
-
+ switch (k->get_keycode()) {
case KEY_A: {
- if (!k->get_shift())
+ if (!k->get_shift()) {
_play_bw_from_pressed();
- else
+ } else {
_play_bw_pressed();
+ }
} break;
case KEY_S: {
_stop_pressed();
} break;
case KEY_D: {
- if (!k->get_shift())
+ if (!k->get_shift()) {
_play_from_pressed();
- else
+ } else {
_play_pressed();
+ }
} break;
}
}
}
void AnimationPlayerEditor::_editor_visibility_changed() {
-
if (is_visible() && animation->get_item_count() > 0) {
_start_onion_skinning();
}
}
bool AnimationPlayerEditor::_are_onion_layers_valid() {
-
ERR_FAIL_COND_V(!onion.past && !onion.future, false);
Point2 capture_size = get_tree()->get_root()->get_size();
@@ -1308,7 +1239,6 @@ bool AnimationPlayerEditor::_are_onion_layers_valid() {
}
void AnimationPlayerEditor::_allocate_onion_layers() {
-
_free_onion_layers();
int captures = onion.get_needed_capture_count();
@@ -1321,27 +1251,25 @@ void AnimationPlayerEditor::_allocate_onion_layers() {
bool is_present = onion.differences_only && i == captures - 1;
// Each capture is a viewport with a canvas item attached that renders a full-size rect with the contents of the main viewport.
- onion.captures.write[i] = VS::get_singleton()->viewport_create();
- VS::get_singleton()->viewport_set_usage(onion.captures[i], VS::VIEWPORT_USAGE_2D);
- VS::get_singleton()->viewport_set_size(onion.captures[i], capture_size.width, capture_size.height);
- VS::get_singleton()->viewport_set_update_mode(onion.captures[i], VS::VIEWPORT_UPDATE_ALWAYS);
- VS::get_singleton()->viewport_set_transparent_background(onion.captures[i], !is_present);
- VS::get_singleton()->viewport_set_vflip(onion.captures[i], true);
- VS::get_singleton()->viewport_attach_canvas(onion.captures[i], onion.capture.canvas);
+ onion.captures.write[i] = RS::get_singleton()->viewport_create();
+
+ RS::get_singleton()->viewport_set_size(onion.captures[i], capture_size.width, capture_size.height);
+ RS::get_singleton()->viewport_set_update_mode(onion.captures[i], RS::VIEWPORT_UPDATE_ALWAYS);
+ RS::get_singleton()->viewport_set_transparent_background(onion.captures[i], !is_present);
+ RS::get_singleton()->viewport_attach_canvas(onion.captures[i], onion.capture.canvas);
}
// Reset the capture canvas item to the current root viewport texture (defensive).
- VS::get_singleton()->canvas_item_clear(onion.capture.canvas_item);
- VS::get_singleton()->canvas_item_add_texture_rect(onion.capture.canvas_item, Rect2(Point2(), capture_size), get_tree()->get_root()->get_texture()->get_rid());
+ RS::get_singleton()->canvas_item_clear(onion.capture.canvas_item);
+ RS::get_singleton()->canvas_item_add_texture_rect(onion.capture.canvas_item, Rect2(Point2(), capture_size), get_tree()->get_root()->get_texture()->get_rid());
onion.capture_size = capture_size;
}
void AnimationPlayerEditor::_free_onion_layers() {
-
for (int i = 0; i < onion.captures.size(); i++) {
if (onion.captures[i].is_valid()) {
- VS::get_singleton()->free(onion.captures[i]);
+ RS::get_singleton()->free(onion.captures[i]);
}
}
onion.captures.clear();
@@ -1349,11 +1277,11 @@ void AnimationPlayerEditor::_free_onion_layers() {
}
void AnimationPlayerEditor::_prepare_onion_layers_1() {
-
// This would be called per viewport and we want to act once only.
int64_t frame = get_tree()->get_frame();
- if (frame == onion.last_frame)
+ if (frame == onion.last_frame) {
return;
+ }
if (!onion.enabled || !is_processing() || !is_visible() || !get_player()) {
_stop_onion_skinning();
@@ -1366,28 +1294,34 @@ void AnimationPlayerEditor::_prepare_onion_layers_1() {
onion.can_overlay = false;
plugin->update_overlays();
- if (player->is_playing())
+ if (player->is_playing()) {
return;
+ }
// And go to next step afterwards.
call_deferred("_prepare_onion_layers_2");
}
-void AnimationPlayerEditor::_prepare_onion_layers_2() {
+void AnimationPlayerEditor::_prepare_onion_layers_1_deferred() {
+ call_deferred("_prepare_onion_layers_1");
+}
+void AnimationPlayerEditor::_prepare_onion_layers_2() {
Ref<Animation> anim = player->get_animation(player->get_assigned_animation());
- if (!anim.is_valid())
+ if (!anim.is_valid()) {
return;
+ }
- if (!_are_onion_layers_valid())
+ if (!_are_onion_layers_valid()) {
_allocate_onion_layers();
+ }
// Hide superfluous elements that would make the overlay unnecessary cluttered.
Dictionary canvas_edit_state;
Dictionary spatial_edit_state;
- if (SpatialEditor::get_singleton()->is_visible()) {
+ if (Node3DEditor::get_singleton()->is_visible()) {
// 3D
- spatial_edit_state = SpatialEditor::get_singleton()->get_state();
+ spatial_edit_state = Node3DEditor::get_singleton()->get_state();
Dictionary new_state = spatial_edit_state.duplicate();
new_state["show_grid"] = false;
new_state["show_origin"] = false;
@@ -1404,7 +1338,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
}
new_state["viewports"] = vp;
// TODO: Save/restore only affected entries.
- SpatialEditor::get_singleton()->set_state(new_state);
+ Node3DEditor::get_singleton()->set_state(new_state);
} else { // CanvasItemEditor
// 2D
canvas_edit_state = CanvasItemEditor::get_singleton()->get_state();
@@ -1420,19 +1354,19 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
// Tweak the root viewport to ensure it's rendered before our target.
RID root_vp = get_tree()->get_root()->get_viewport_rid();
- Rect2 root_vp_screen_rect = get_tree()->get_root()->get_attach_to_screen_rect();
- VS::get_singleton()->viewport_attach_to_screen(root_vp, Rect2());
- VS::get_singleton()->viewport_set_update_mode(root_vp, VS::VIEWPORT_UPDATE_ALWAYS);
+ Rect2 root_vp_screen_rect = Rect2(Vector2(), get_tree()->get_root()->get_size());
+ RS::get_singleton()->viewport_attach_to_screen(root_vp, Rect2());
+ RS::get_singleton()->viewport_set_update_mode(root_vp, RS::VIEWPORT_UPDATE_ALWAYS);
RID present_rid;
if (onion.differences_only) {
// Capture present scene as it is.
- VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, RID());
+ RS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, RID());
present_rid = onion.captures[onion.captures.size() - 1];
- VS::get_singleton()->viewport_set_active(present_rid, true);
- VS::get_singleton()->viewport_set_parent_viewport(root_vp, present_rid);
- VS::get_singleton()->draw(false);
- VS::get_singleton()->viewport_set_active(present_rid, false);
+ RS::get_singleton()->viewport_set_active(present_rid, true);
+ RS::get_singleton()->viewport_set_parent_viewport(root_vp, present_rid);
+ RS::get_singleton()->draw(false);
+ RS::get_singleton()->viewport_set_active(present_rid, false);
}
// Backup current animation state.
@@ -1441,21 +1375,21 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
// Render every past/future step with the capture shader.
- VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid());
+ RS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid());
onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/default_clear_color"));
onion.capture.material->set_shader_param("differences_only", onion.differences_only);
- onion.capture.material->set_shader_param("present", onion.differences_only ? VS::get_singleton()->viewport_get_texture(present_rid) : RID());
+ onion.capture.material->set_shader_param("present", onion.differences_only ? RS::get_singleton()->viewport_get_texture(present_rid) : RID());
int step_off_a = onion.past ? -onion.steps : 0;
int step_off_b = onion.future ? onion.steps : 0;
int cidx = 0;
onion.capture.material->set_shader_param("dir_color", onion.force_white_modulate ? Color(1, 1, 1) : Color(EDITOR_GET("editors/animation/onion_layers_past_color")));
for (int step_off = step_off_a; step_off <= step_off_b; step_off++) {
-
if (step_off == 0) {
// Skip present step and switch to the color of future.
- if (!onion.force_white_modulate)
+ if (!onion.force_white_modulate) {
onion.capture.material->set_shader_param("dir_color", EDITOR_GET("editors/animation/onion_layers_future_color"));
+ }
continue;
}
@@ -1465,22 +1399,22 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
onion.captures_valid.write[cidx] = valid;
if (valid) {
player->seek(pos, true);
- get_tree()->flush_transform_notifications(); // Needed for transforms of Spatials.
+ get_tree()->flush_transform_notifications(); // Needed for transforms of Node3Ds.
values_backup.update_skeletons(); // Needed for Skeletons (2D & 3D).
- VS::get_singleton()->viewport_set_active(onion.captures[cidx], true);
- VS::get_singleton()->viewport_set_parent_viewport(root_vp, onion.captures[cidx]);
- VS::get_singleton()->draw(false);
- VS::get_singleton()->viewport_set_active(onion.captures[cidx], false);
+ RS::get_singleton()->viewport_set_active(onion.captures[cidx], true);
+ RS::get_singleton()->viewport_set_parent_viewport(root_vp, onion.captures[cidx]);
+ RS::get_singleton()->draw(false);
+ RS::get_singleton()->viewport_set_active(onion.captures[cidx], false);
}
cidx++;
}
// Restore root viewport.
- VS::get_singleton()->viewport_set_parent_viewport(root_vp, RID());
- VS::get_singleton()->viewport_attach_to_screen(root_vp, root_vp_screen_rect);
- VS::get_singleton()->viewport_set_update_mode(root_vp, VS::VIEWPORT_UPDATE_WHEN_VISIBLE);
+ RS::get_singleton()->viewport_set_parent_viewport(root_vp, RID());
+ RS::get_singleton()->viewport_attach_to_screen(root_vp, root_vp_screen_rect);
+ RS::get_singleton()->viewport_set_update_mode(root_vp, RS::VIEWPORT_UPDATE_WHEN_VISIBLE);
// Restore animation state
// (Seeking with update=true wouldn't do the trick because the current value of the properties
@@ -1489,9 +1423,9 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
player->restore_animated_values(values_backup);
// Restore state of main editors.
- if (SpatialEditor::get_singleton()->is_visible()) {
+ if (Node3DEditor::get_singleton()->is_visible()) {
// 3D
- SpatialEditor::get_singleton()->set_state(spatial_edit_state);
+ Node3DEditor::get_singleton()->set_state(spatial_edit_state);
} else { // CanvasItemEditor
// 2D
CanvasItemEditor::get_singleton()->set_state(canvas_edit_state);
@@ -1503,18 +1437,15 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
}
void AnimationPlayerEditor::_start_onion_skinning() {
-
// FIXME: Using "idle_frame" makes onion layers update one frame behind the current.
- if (!get_tree()->is_connected("idle_frame", this, "call_deferred")) {
- get_tree()->connect("idle_frame", this, "call_deferred", varray("_prepare_onion_layers_1"));
+ if (!get_tree()->is_connected("idle_frame", callable_mp(this, &AnimationPlayerEditor::_prepare_onion_layers_1_deferred))) {
+ get_tree()->connect("idle_frame", callable_mp(this, &AnimationPlayerEditor::_prepare_onion_layers_1_deferred));
}
}
void AnimationPlayerEditor::_stop_onion_skinning() {
-
- if (get_tree()->is_connected("idle_frame", this, "call_deferred")) {
-
- get_tree()->disconnect("idle_frame", this, "call_deferred");
+ if (get_tree()->is_connected("idle_frame", callable_mp(this, &AnimationPlayerEditor::_prepare_onion_layers_1_deferred))) {
+ get_tree()->disconnect("idle_frame", callable_mp(this, &AnimationPlayerEditor::_prepare_onion_layers_1_deferred));
_free_onion_layers();
@@ -1525,56 +1456,31 @@ void AnimationPlayerEditor::_stop_onion_skinning() {
}
void AnimationPlayerEditor::_pin_pressed() {
-
EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->update_tree();
}
void AnimationPlayerEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_node_removed"), &AnimationPlayerEditor::_node_removed);
- ClassDB::bind_method(D_METHOD("_play_pressed"), &AnimationPlayerEditor::_play_pressed);
- ClassDB::bind_method(D_METHOD("_play_from_pressed"), &AnimationPlayerEditor::_play_from_pressed);
- ClassDB::bind_method(D_METHOD("_play_bw_pressed"), &AnimationPlayerEditor::_play_bw_pressed);
- ClassDB::bind_method(D_METHOD("_play_bw_from_pressed"), &AnimationPlayerEditor::_play_bw_from_pressed);
- ClassDB::bind_method(D_METHOD("_stop_pressed"), &AnimationPlayerEditor::_stop_pressed);
- ClassDB::bind_method(D_METHOD("_autoplay_pressed"), &AnimationPlayerEditor::_autoplay_pressed);
- ClassDB::bind_method(D_METHOD("_animation_selected"), &AnimationPlayerEditor::_animation_selected);
- ClassDB::bind_method(D_METHOD("_animation_name_edited"), &AnimationPlayerEditor::_animation_name_edited);
ClassDB::bind_method(D_METHOD("_animation_new"), &AnimationPlayerEditor::_animation_new);
ClassDB::bind_method(D_METHOD("_animation_rename"), &AnimationPlayerEditor::_animation_rename);
ClassDB::bind_method(D_METHOD("_animation_load"), &AnimationPlayerEditor::_animation_load);
ClassDB::bind_method(D_METHOD("_animation_remove"), &AnimationPlayerEditor::_animation_remove);
- ClassDB::bind_method(D_METHOD("_animation_remove_confirmed"), &AnimationPlayerEditor::_animation_remove_confirmed);
ClassDB::bind_method(D_METHOD("_animation_blend"), &AnimationPlayerEditor::_animation_blend);
ClassDB::bind_method(D_METHOD("_animation_edit"), &AnimationPlayerEditor::_animation_edit);
ClassDB::bind_method(D_METHOD("_animation_resource_edit"), &AnimationPlayerEditor::_animation_resource_edit);
- ClassDB::bind_method(D_METHOD("_dialog_action"), &AnimationPlayerEditor::_dialog_action);
- ClassDB::bind_method(D_METHOD("_seek_value_changed"), &AnimationPlayerEditor::_seek_value_changed, DEFVAL(true));
ClassDB::bind_method(D_METHOD("_animation_player_changed"), &AnimationPlayerEditor::_animation_player_changed);
- ClassDB::bind_method(D_METHOD("_blend_edited"), &AnimationPlayerEditor::_blend_edited);
- ClassDB::bind_method(D_METHOD("_scale_changed"), &AnimationPlayerEditor::_scale_changed);
ClassDB::bind_method(D_METHOD("_list_changed"), &AnimationPlayerEditor::_list_changed);
- ClassDB::bind_method(D_METHOD("_animation_key_editor_seek"), &AnimationPlayerEditor::_animation_key_editor_seek);
- ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_len_changed"), &AnimationPlayerEditor::_animation_key_editor_anim_len_changed);
ClassDB::bind_method(D_METHOD("_animation_duplicate"), &AnimationPlayerEditor::_animation_duplicate);
- ClassDB::bind_method(D_METHOD("_blend_editor_next_changed"), &AnimationPlayerEditor::_blend_editor_next_changed);
ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &AnimationPlayerEditor::_unhandled_key_input);
- ClassDB::bind_method(D_METHOD("_animation_tool_menu"), &AnimationPlayerEditor::_animation_tool_menu);
- ClassDB::bind_method(D_METHOD("_onion_skinning_menu"), &AnimationPlayerEditor::_onion_skinning_menu);
- ClassDB::bind_method(D_METHOD("_editor_visibility_changed"), &AnimationPlayerEditor::_editor_visibility_changed);
ClassDB::bind_method(D_METHOD("_prepare_onion_layers_1"), &AnimationPlayerEditor::_prepare_onion_layers_1);
ClassDB::bind_method(D_METHOD("_prepare_onion_layers_2"), &AnimationPlayerEditor::_prepare_onion_layers_2);
ClassDB::bind_method(D_METHOD("_start_onion_skinning"), &AnimationPlayerEditor::_start_onion_skinning);
ClassDB::bind_method(D_METHOD("_stop_onion_skinning"), &AnimationPlayerEditor::_stop_onion_skinning);
-
- ClassDB::bind_method(D_METHOD("_pin_pressed"), &AnimationPlayerEditor::_pin_pressed);
}
-AnimationPlayerEditor *AnimationPlayerEditor::singleton = NULL;
+AnimationPlayerEditor *AnimationPlayerEditor::singleton = nullptr;
AnimationPlayer *AnimationPlayerEditor::get_player() const {
-
return player;
}
@@ -1587,29 +1493,34 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
set_focus_mode(FOCUS_ALL);
- player = NULL;
+ player = nullptr;
HBoxContainer *hb = memnew(HBoxContainer);
add_child(hb);
- play_bw_from = memnew(ToolButton);
+ play_bw_from = memnew(Button);
+ play_bw_from->set_flat(true);
play_bw_from->set_tooltip(TTR("Play selected animation backwards from current pos. (A)"));
hb->add_child(play_bw_from);
- play_bw = memnew(ToolButton);
+ play_bw = memnew(Button);
+ play_bw->set_flat(true);
play_bw->set_tooltip(TTR("Play selected animation backwards from end. (Shift+A)"));
hb->add_child(play_bw);
- stop = memnew(ToolButton);
+ stop = memnew(Button);
+ stop->set_flat(true);
stop->set_toggle_mode(true);
hb->add_child(stop);
stop->set_tooltip(TTR("Stop animation playback. (S)"));
- play = memnew(ToolButton);
+ play = memnew(Button);
+ play->set_flat(true);
play->set_tooltip(TTR("Play selected animation from start. (Shift+D)"));
hb->add_child(play);
- play_from = memnew(ToolButton);
+ play_from = memnew(Button);
+ play_from->set_flat(true);
play_from->set_tooltip(TTR("Play selected animation from current pos. (D)"));
hb->add_child(play_from);
@@ -1629,13 +1540,9 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
scale->set_tooltip(TTR("Scale animation playback globally for the node."));
scale->hide();
- accept = memnew(AcceptDialog);
- add_child(accept);
- accept->connect("confirmed", this, "_menu_confirm_current");
-
delete_dialog = memnew(ConfirmationDialog);
add_child(delete_dialog);
- delete_dialog->connect("confirmed", this, "_animation_remove_confirmed");
+ delete_dialog->connect("confirmed", callable_mp(this, &AnimationPlayerEditor::_animation_remove_confirmed));
tool_anim = memnew(MenuButton);
tool_anim->set_flat(false);
@@ -1665,7 +1572,8 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
animation->set_tooltip(TTR("Display list of animations in player."));
animation->set_clip_text(true);
- autoplay = memnew(ToolButton);
+ autoplay = memnew(Button);
+ autoplay->set_flat(true);
hb->add_child(autoplay);
autoplay->set_tooltip(TTR("Autoplay on Load"));
@@ -1677,10 +1585,11 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
hb->add_child(memnew(VSeparator));
- onion_toggle = memnew(ToolButton);
+ onion_toggle = memnew(Button);
+ onion_toggle->set_flat(true);
onion_toggle->set_toggle_mode(true);
onion_toggle->set_tooltip(TTR("Enable Onion Skinning"));
- onion_toggle->connect("pressed", this, "_onion_skinning_menu", varray(ONION_SKINNING_ENABLE));
+ onion_toggle->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_onion_skinning_menu), varray(ONION_SKINNING_ENABLE));
hb->add_child(onion_toggle);
onion_skinning = memnew(MenuButton);
@@ -1702,11 +1611,12 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
hb->add_child(memnew(VSeparator));
- pin = memnew(ToolButton);
+ pin = memnew(Button);
+ pin->set_flat(true);
pin->set_toggle_mode(true);
pin->set_tooltip(TTR("Pin AnimationPlayer"));
hb->add_child(pin);
- pin->connect("pressed", this, "_pin_pressed");
+ pin->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_pin_pressed));
file = memnew(EditorFileDialog);
add_child(file);
@@ -1730,7 +1640,7 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
error_dialog->set_title(TTR("Error!"));
add_child(error_dialog);
- name_dialog->connect("confirmed", this, "_animation_name_edited");
+ name_dialog->connect("confirmed", callable_mp(this, &AnimationPlayerEditor::_animation_name_edited));
blend_editor.dialog = memnew(AcceptDialog);
add_child(blend_editor.dialog);
@@ -1746,21 +1656,21 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
blend_editor.dialog->set_title(TTR("Cross-Animation Blend Times"));
updating_blends = false;
- blend_editor.tree->connect("item_edited", this, "_blend_edited");
+ blend_editor.tree->connect("item_edited", callable_mp(this, &AnimationPlayerEditor::_blend_edited));
- autoplay->connect("pressed", this, "_autoplay_pressed");
+ autoplay->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_autoplay_pressed));
autoplay->set_toggle_mode(true);
- play->connect("pressed", this, "_play_pressed");
- play_from->connect("pressed", this, "_play_from_pressed");
- play_bw->connect("pressed", this, "_play_bw_pressed");
- play_bw_from->connect("pressed", this, "_play_bw_from_pressed");
- stop->connect("pressed", this, "_stop_pressed");
+ play->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_play_pressed));
+ play_from->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_play_from_pressed));
+ play_bw->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_play_bw_pressed));
+ play_bw_from->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_play_bw_from_pressed));
+ stop->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_stop_pressed));
- animation->connect("item_selected", this, "_animation_selected", Vector<Variant>(), true);
+ animation->connect("item_selected", callable_mp(this, &AnimationPlayerEditor::_animation_selected));
- file->connect("file_selected", this, "_dialog_action");
- frame->connect("value_changed", this, "_seek_value_changed", Vector<Variant>(), true);
- scale->connect("text_entered", this, "_scale_changed", Vector<Variant>(), true);
+ file->connect("file_selected", callable_mp(this, &AnimationPlayerEditor::_dialog_action));
+ frame->connect("value_changed", callable_mp(this, &AnimationPlayerEditor::_seek_value_changed), make_binds(true));
+ scale->connect("text_entered", callable_mp(this, &AnimationPlayerEditor::_scale_changed));
renaming = false;
last_active = false;
@@ -1770,14 +1680,14 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
add_child(track_editor);
track_editor->set_v_size_flags(SIZE_EXPAND_FILL);
- track_editor->connect("timeline_changed", this, "_animation_key_editor_seek");
- track_editor->connect("animation_len_changed", this, "_animation_key_editor_anim_len_changed");
+ track_editor->connect("timeline_changed", callable_mp(this, &AnimationPlayerEditor::_animation_key_editor_seek));
+ track_editor->connect("animation_len_changed", callable_mp(this, &AnimationPlayerEditor::_animation_key_editor_anim_len_changed));
_update_player();
// Onion skinning.
- track_editor->connect("visibility_changed", this, "_editor_visibility_changed");
+ track_editor->connect("visibility_changed", callable_mp(this, &AnimationPlayerEditor::_editor_visibility_changed));
onion.enabled = false;
onion.past = true;
@@ -1790,9 +1700,9 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
onion.last_frame = 0;
onion.can_overlay = false;
onion.capture_size = Size2();
- onion.capture.canvas = VS::get_singleton()->canvas_create();
- onion.capture.canvas_item = VS::get_singleton()->canvas_item_create();
- VS::get_singleton()->canvas_item_set_parent(onion.capture.canvas_item, onion.capture.canvas);
+ onion.capture.canvas = RS::get_singleton()->canvas_create();
+ onion.capture.canvas_item = RS::get_singleton()->canvas_item_create();
+ RS::get_singleton()->canvas_item_set_parent(onion.capture.canvas_item, onion.capture.canvas);
onion.capture.material = Ref<ShaderMaterial>(memnew(ShaderMaterial));
@@ -1818,43 +1728,37 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
COLOR = vec4(capture_samp.rgb * dir_color.rgb, bkg_mask * diff_mask); \
} \
");
- VS::get_singleton()->material_set_shader(onion.capture.material->get_rid(), onion.capture.shader->get_rid());
+ RS::get_singleton()->material_set_shader(onion.capture.material->get_rid(), onion.capture.shader->get_rid());
}
AnimationPlayerEditor::~AnimationPlayerEditor() {
-
_free_onion_layers();
- VS::get_singleton()->free(onion.capture.canvas);
- VS::get_singleton()->free(onion.capture.canvas_item);
+ RS::get_singleton()->free(onion.capture.canvas);
+ RS::get_singleton()->free(onion.capture.canvas_item);
}
void AnimationPlayerEditorPlugin::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
-
set_force_draw_over_forwarding_enabled();
} break;
}
}
void AnimationPlayerEditorPlugin::edit(Object *p_object) {
-
anim_editor->set_undo_redo(&get_undo_redo());
- if (!p_object)
+ if (!p_object) {
return;
+ }
anim_editor->edit(Object::cast_to<AnimationPlayer>(p_object));
}
bool AnimationPlayerEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("AnimationPlayer");
}
void AnimationPlayerEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
-
editor->make_bottom_panel_item_visible(anim_editor);
anim_editor->set_process(true);
anim_editor->ensure_visibility();
@@ -1862,7 +1766,6 @@ void AnimationPlayerEditorPlugin::make_visible(bool p_visible) {
}
AnimationPlayerEditorPlugin::AnimationPlayerEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
anim_editor = memnew(AnimationPlayerEditor(editor, this));
anim_editor->set_undo_redo(EditorNode::get_undo_redo());
diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h
index 55c2f365ce..e11db1390b 100644
--- a/editor/plugins/animation_player_editor_plugin.h
+++ b/editor/plugins/animation_player_editor_plugin.h
@@ -43,7 +43,6 @@ class AnimationTrackEditor;
class AnimationPlayerEditorPlugin;
class AnimationPlayerEditor : public VBoxContainer {
-
GDCLASS(AnimationPlayerEditor, VBoxContainer);
EditorNode *editor;
@@ -97,25 +96,23 @@ class AnimationPlayerEditor : public VBoxContainer {
Button *autoplay;
MenuButton *tool_anim;
- ToolButton *onion_toggle;
+ Button *onion_toggle;
MenuButton *onion_skinning;
- ToolButton *pin;
+ Button *pin;
SpinBox *frame;
LineEdit *scale;
LineEdit *name;
Label *name_title;
UndoRedo *undo_redo;
- Ref<Texture> autoplay_icon;
+ Ref<Texture2D> autoplay_icon;
bool last_active;
float timeline_position;
EditorFileDialog *file;
- AcceptDialog *accept;
ConfirmationDialog *delete_dialog;
int current_option;
struct BlendEditor {
-
AcceptDialog *dialog;
Tree *tree;
OptionButton *next;
@@ -210,6 +207,7 @@ class AnimationPlayerEditor : public VBoxContainer {
void _allocate_onion_layers();
void _free_onion_layers();
void _prepare_onion_layers_1();
+ void _prepare_onion_layers_1_deferred();
void _prepare_onion_layers_2();
void _start_onion_skinning();
void _stop_onion_skinning();
@@ -244,7 +242,6 @@ public:
};
class AnimationPlayerEditorPlugin : public EditorPlugin {
-
GDCLASS(AnimationPlayerEditorPlugin, EditorPlugin);
AnimationPlayerEditor *anim_editor;
@@ -254,16 +251,16 @@ protected:
void _notification(int p_what);
public:
- virtual Dictionary get_state() const { return anim_editor->get_state(); }
- virtual void set_state(const Dictionary &p_state) { anim_editor->set_state(p_state); }
+ virtual Dictionary get_state() const override { return anim_editor->get_state(); }
+ virtual void set_state(const Dictionary &p_state) override { anim_editor->set_state(p_state); }
- virtual String get_name() const { return "Anim"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "Anim"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
- virtual void forward_canvas_force_draw_over_viewport(Control *p_overlay) { anim_editor->forward_canvas_force_draw_over_viewport(p_overlay); }
+ virtual void forward_canvas_force_draw_over_viewport(Control *p_overlay) override { anim_editor->forward_canvas_force_draw_over_viewport(p_overlay); }
AnimationPlayerEditorPlugin(EditorNode *p_node);
~AnimationPlayerEditorPlugin();
diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp
index 2a582a1249..26006d85c9 100644
--- a/editor/plugins/animation_state_machine_editor.cpp
+++ b/editor/plugins/animation_state_machine_editor.cpp
@@ -30,9 +30,9 @@
#include "animation_state_machine_editor.h"
+#include "core/input/input.h"
#include "core/io/resource_loader.h"
-#include "core/math/delaunay.h"
-#include "core/os/input.h"
+#include "core/math/geometry_2d.h"
#include "core/os/keyboard.h"
#include "core/project_settings.h"
#include "editor/editor_scale.h"
@@ -40,20 +40,17 @@
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
bool AnimationNodeStateMachineEditor::can_edit(const Ref<AnimationNode> &p_node) {
-
Ref<AnimationNodeStateMachine> ansm = p_node;
return ansm.is_valid();
}
void AnimationNodeStateMachineEditor::edit(const Ref<AnimationNode> &p_node) {
-
state_machine = p_node;
if (state_machine.is_valid()) {
-
selected_transition_from = StringName();
selected_transition_to = StringName();
selected_node = StringName();
@@ -63,13 +60,13 @@ void AnimationNodeStateMachineEditor::edit(const Ref<AnimationNode> &p_node) {
}
void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback");
- if (playback.is_null())
+ if (playback.is_null()) {
return;
+ }
Ref<InputEventKey> k = p_event;
- if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_DELETE && !k->is_echo()) {
+ if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) {
if (selected_node != StringName() || selected_transition_to != StringName() || selected_transition_from != StringName()) {
_erase_selected();
accept_event();
@@ -97,17 +94,17 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
List<StringName> names;
ap->get_animation_list(&names);
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
- animations_menu->add_icon_item(get_icon("Animation", "EditorIcons"), E->get());
+ animations_menu->add_icon_item(get_theme_icon("Animation", "EditorIcons"), E->get());
animations_to_add.push_back(E->get());
}
}
}
for (List<StringName>::Element *E = classes.front(); E; E = E->next()) {
-
String name = String(E->get()).replace_first("AnimationNode", "");
- if (name == "Animation")
+ if (name == "Animation") {
continue; // nope
+ }
int idx = menu->get_item_count();
menu->add_item(vformat("Add %s", name), idx);
menu->set_item_metadata(idx, E->get());
@@ -121,14 +118,13 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
menu->add_separator();
menu->add_item(TTR("Load..."), MENU_LOAD_FILE);
- menu->set_global_position(state_machine_draw->get_global_transform().xform(mb->get_position()));
+ menu->set_position(state_machine_draw->get_screen_transform().xform(mb->get_position()));
menu->popup();
add_node_pos = mb->get_position() / EDSCALE + state_machine->get_graph_offset();
}
// select node or push a field inside
if (mb.is_valid() && !mb->get_shift() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
selected_transition_from = StringName();
selected_transition_to = StringName();
selected_node = StringName();
@@ -149,16 +145,16 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
if (node_rects[i].name.has_point(mb->get_position())) { //edit name
- Ref<StyleBox> line_sb = get_stylebox("normal", "LineEdit");
+ Ref<StyleBox> line_sb = get_theme_stylebox("normal", "LineEdit");
Rect2 edit_rect = node_rects[i].name;
edit_rect.position -= line_sb->get_offset();
edit_rect.size += line_sb->get_minimum_size();
- name_edit->set_global_position(state_machine_draw->get_global_transform().xform(edit_rect.position));
- name_edit->set_size(edit_rect.size);
+ name_edit_popup->set_position(state_machine_draw->get_screen_transform().xform(edit_rect.position));
+ name_edit_popup->set_size(edit_rect.size);
name_edit->set_text(node_rects[i].node_name);
- name_edit->show_modal();
+ name_edit_popup->popup();
name_edit->grab_focus();
name_edit->select_all();
@@ -191,12 +187,11 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
int closest = -1;
float closest_d = 1e20;
for (int i = 0; i < transition_lines.size(); i++) {
-
Vector2 s[2] = {
transition_lines[i].from,
transition_lines[i].to
};
- Vector2 cpoint = Geometry::get_closest_point_to_segment_2d(mb->get_position(), s);
+ Vector2 cpoint = Geometry2D::get_closest_point_to_segment(mb->get_position(), s);
float d = cpoint.distance_to(mb->get_position());
if (d > transition_lines[i].width) {
continue;
@@ -222,9 +217,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
//end moving node
if (mb.is_valid() && dragging_selected_attempt && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) {
-
if (dragging_selected) {
-
Ref<AnimationNode> an = state_machine->get_node(selected_node);
updating = true;
undo_redo->create_action(TTR("Move Node"));
@@ -245,7 +238,6 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
//connect nodes
if (mb.is_valid() && ((tool_select->is_pressed() && mb->get_shift()) || tool_connect->is_pressed()) && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
-
for (int i = node_rects.size() - 1; i >= 0; i--) { //inverse to draw order
if (node_rects[i].node.has_point(mb->get_position())) { //select node since nothing else was selected
connecting = true;
@@ -259,14 +251,11 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
//end connecting nodes
if (mb.is_valid() && connecting && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) {
-
if (connecting_to_node != StringName()) {
-
if (state_machine->has_transition(connecting_from, connecting_to_node)) {
EditorNode::get_singleton()->show_warning(TTR("Transition exists!"));
} else {
-
Ref<AnimationNodeStateMachineTransition> tr;
tr.instance();
tr->set_switch_mode(AnimationNodeStateMachineTransition::SwitchMode(transition_mode->get_selected()));
@@ -296,14 +285,12 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
//pan window
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) {
-
h_scroll->set_value(h_scroll->get_value() - mm->get_relative().x);
v_scroll->set_value(v_scroll->get_value() - mm->get_relative().y);
}
//move mouse while connecting
if (mm.is_valid() && connecting) {
-
connecting_to = mm->get_position();
connecting_to_node = StringName();
state_machine_draw->update();
@@ -318,7 +305,6 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
//move mouse while moving a node
if (mm.is_valid() && dragging_selected_attempt) {
-
dragging_selected = true;
drag_ofs = mm->get_position() - drag_from;
snap_x = StringName();
@@ -333,8 +319,9 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
float best_d_y = 1e20;
for (List<StringName>::Element *E = nodes.front(); E; E = E->next()) {
- if (E->get() == selected_node)
+ if (E->get() == selected_node) {
continue;
+ }
Vector2 npos = state_machine->get_node_position(E->get());
float d_x = ABS(npos.x - cpos.x);
@@ -358,14 +345,12 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
//put ibeam (text cursor) over names to make it clearer that they are editable
if (mm.is_valid()) {
-
state_machine_draw->grab_focus();
bool over_text_now = false;
String new_over_node = StringName();
int new_over_node_what = -1;
if (tool_select->is_pressed()) {
-
for (int i = node_rects.size() - 1; i >= 0; i--) { //inverse to draw order
if (node_rects[i].name.has_point(mm->get_position())) {
@@ -392,7 +377,6 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
}
if (over_text != over_text_now) {
-
if (over_text_now) {
state_machine_draw->set_default_cursor_shape(CURSOR_IBEAM);
} else {
@@ -405,7 +389,6 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
}
void AnimationNodeStateMachineEditor::_file_opened(const String &p_file) {
-
file_loaded = ResourceLoader::load(p_file);
if (file_loaded.is_valid()) {
_add_menu_type(MENU_LOAD_FILE_CONFIRM);
@@ -413,25 +396,22 @@ void AnimationNodeStateMachineEditor::_file_opened(const String &p_file) {
}
void AnimationNodeStateMachineEditor::_add_menu_type(int p_index) {
-
String base_name;
Ref<AnimationRootNode> node;
if (p_index == MENU_LOAD_FILE) {
-
open_file->clear_filters();
List<String> filters;
ResourceLoader::get_recognized_extensions_for_type("AnimationRootNode", &filters);
for (List<String>::Element *E = filters.front(); E; E = E->next()) {
open_file->add_filter("*." + E->get());
}
- open_file->popup_centered_ratio();
+ open_file->popup_file_dialog();
return;
} else if (p_index == MENU_LOAD_FILE_CONFIRM) {
node = file_loaded;
file_loaded.unref();
} else if (p_index == MENU_PASTE) {
-
node = EditorSettings::get_singleton()->get_resource_clipboard();
} else {
@@ -452,7 +432,6 @@ void AnimationNodeStateMachineEditor::_add_menu_type(int p_index) {
}
if (base_name == String()) {
-
base_name = node->get_class().replace_first("AnimationNode", "");
}
@@ -476,7 +455,6 @@ void AnimationNodeStateMachineEditor::_add_menu_type(int p_index) {
}
void AnimationNodeStateMachineEditor::_add_animation_type(int p_index) {
-
Ref<AnimationNodeAnimation> anim;
anim.instance();
@@ -503,10 +481,9 @@ void AnimationNodeStateMachineEditor::_add_animation_type(int p_index) {
}
void AnimationNodeStateMachineEditor::_connection_draw(const Vector2 &p_from, const Vector2 &p_to, AnimationNodeStateMachineTransition::SwitchMode p_mode, bool p_enabled, bool p_selected, bool p_travel, bool p_auto_advance) {
-
- Color linecolor = get_color("font_color", "Label");
+ Color linecolor = get_theme_color("font_color", "Label");
Color icon_color(1, 1, 1);
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
if (!p_enabled) {
linecolor.a *= 0.2;
@@ -514,26 +491,26 @@ void AnimationNodeStateMachineEditor::_connection_draw(const Vector2 &p_from, co
accent.a *= 0.6;
}
- Ref<Texture> icons[6] = {
- get_icon("TransitionImmediateBig", "EditorIcons"),
- get_icon("TransitionSyncBig", "EditorIcons"),
- get_icon("TransitionEndBig", "EditorIcons"),
- get_icon("TransitionImmediateAutoBig", "EditorIcons"),
- get_icon("TransitionSyncAutoBig", "EditorIcons"),
- get_icon("TransitionEndAutoBig", "EditorIcons")
+ Ref<Texture2D> icons[6] = {
+ get_theme_icon("TransitionImmediateBig", "EditorIcons"),
+ get_theme_icon("TransitionSyncBig", "EditorIcons"),
+ get_theme_icon("TransitionEndBig", "EditorIcons"),
+ get_theme_icon("TransitionImmediateAutoBig", "EditorIcons"),
+ get_theme_icon("TransitionSyncAutoBig", "EditorIcons"),
+ get_theme_icon("TransitionEndAutoBig", "EditorIcons")
};
if (p_selected) {
- state_machine_draw->draw_line(p_from, p_to, accent, 6, true);
+ state_machine_draw->draw_line(p_from, p_to, accent, 6);
}
if (p_travel) {
linecolor = accent;
linecolor.set_hsv(1.0, linecolor.get_s(), linecolor.get_v());
}
- state_machine_draw->draw_line(p_from, p_to, linecolor, 2, true);
+ state_machine_draw->draw_line(p_from, p_to, linecolor, 2);
- Ref<Texture> icon = icons[p_mode + (p_auto_advance ? 3 : 0)];
+ Ref<Texture2D> icon = icons[p_mode + (p_auto_advance ? 3 : 0)];
Transform2D xf;
xf.elements[0] = (p_to - p_from).normalized();
@@ -546,9 +523,9 @@ void AnimationNodeStateMachineEditor::_connection_draw(const Vector2 &p_from, co
}
void AnimationNodeStateMachineEditor::_clip_src_line_to_rect(Vector2 &r_from, Vector2 &r_to, const Rect2 &p_rect) {
-
- if (r_to == r_from)
+ if (r_to == r_from) {
return;
+ }
//this could be optimized...
Vector2 n = (r_to - r_from).normalized();
@@ -558,9 +535,9 @@ void AnimationNodeStateMachineEditor::_clip_src_line_to_rect(Vector2 &r_from, Ve
}
void AnimationNodeStateMachineEditor::_clip_dst_line_to_rect(Vector2 &r_from, Vector2 &r_to, const Rect2 &p_rect) {
-
- if (r_to == r_from)
+ if (r_to == r_from) {
return;
+ }
//this could be optimized...
Vector2 n = (r_to - r_from).normalized();
@@ -570,21 +547,20 @@ void AnimationNodeStateMachineEditor::_clip_dst_line_to_rect(Vector2 &r_from, Ve
}
void AnimationNodeStateMachineEditor::_state_machine_draw() {
-
Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback");
- Ref<StyleBox> style = get_stylebox("state_machine_frame", "GraphNode");
- Ref<StyleBox> style_selected = get_stylebox("state_machine_selectedframe", "GraphNode");
+ Ref<StyleBox> style = get_theme_stylebox("state_machine_frame", "GraphNode");
+ Ref<StyleBox> style_selected = get_theme_stylebox("state_machine_selectedframe", "GraphNode");
- Ref<Font> font = get_font("title_font", "GraphNode");
- Color font_color = get_color("title_color", "GraphNode");
- Ref<Texture> play = get_icon("Play", "EditorIcons");
- Ref<Texture> auto_play = get_icon("AutoPlay", "EditorIcons");
- Ref<Texture> edit = get_icon("Edit", "EditorIcons");
- Color accent = get_color("accent_color", "Editor");
- Color linecolor = get_color("font_color", "Label");
+ Ref<Font> font = get_theme_font("title_font", "GraphNode");
+ Color font_color = get_theme_color("title_color", "GraphNode");
+ Ref<Texture2D> play = get_theme_icon("Play", "EditorIcons");
+ Ref<Texture2D> auto_play = get_theme_icon("AutoPlay", "EditorIcons");
+ Ref<Texture2D> edit = get_theme_icon("Edit", "EditorIcons");
+ Color accent = get_theme_color("accent_color", "Editor");
+ Color linecolor = get_theme_color("font_color", "Label");
linecolor.a *= 0.3;
- Ref<StyleBox> playing_overlay = get_stylebox("position", "GraphNode");
+ Ref<StyleBox> playing_overlay = get_theme_stylebox("position", "GraphNode");
bool playing = false;
StringName current;
@@ -611,7 +587,6 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
//snap lines
if (dragging_selected) {
-
Vector2 from = (state_machine->get_node_position(selected_node) * EDSCALE) + drag_ofs - state_machine->get_graph_offset() * EDSCALE;
if (snap_x != StringName()) {
Vector2 to = (state_machine->get_node_position(snap_x) * EDSCALE) - state_machine->get_graph_offset() * EDSCALE;
@@ -625,7 +600,6 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
//pre pass nodes so we know the rectangles
for (List<StringName>::Element *E = nodes.front(); E; E = E->next()) {
-
Ref<AnimationNode> anode = state_machine->get_node(E->get());
String name = E->get();
bool needs_editor = EditorNode::get_singleton()->item_has_editor(anode.ptr());
@@ -686,12 +660,11 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
_connection_draw(from, to, AnimationNodeStateMachineTransition::SwitchMode(transition_mode->get_selected()), true, false, false, false);
}
- Ref<Texture> tr_reference_icon = get_icon("TransitionImmediateBig", "EditorIcons");
+ Ref<Texture2D> tr_reference_icon = get_theme_icon("TransitionImmediateBig", "EditorIcons");
float tr_bidi_offset = int(tr_reference_icon->get_height() * 0.8);
//draw transition lines
for (int i = 0; i < state_machine->get_transition_count(); i++) {
-
TransitionLine tl;
tl.from_node = state_machine->get_transition_from(i);
Vector2 ofs_from = (dragging_selected && tl.from_node == selected_node) ? drag_ofs : Vector2();
@@ -733,7 +706,6 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
}
if (travel_path.size()) {
-
if (current == tl.from_node && travel_path[0] == tl.to_node) {
travel = true;
} else {
@@ -759,7 +731,6 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
//draw actual nodes
for (int i = 0; i < node_rects.size(); i++) {
-
String name = node_rects[i].node_name;
Ref<AnimationNode> anode = state_machine->get_node(name);
bool needs_editor = AnimationTreeEditor::get_singleton()->can_edit(anode);
@@ -786,7 +757,6 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
}
if (state_machine->get_end_node() == name) {
-
int endofs = nr.node.size.x - font->get_string_size(TTR("End")).x;
state_machine_draw->draw_string(font, offset + Vector2(endofs, -font->get_height() - 3 * EDSCALE + font->get_ascent()), TTR("End"), font_color);
}
@@ -796,7 +766,7 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
nr.play.position = offset + Vector2(0, (h - play->get_height()) / 2).floor();
nr.play.size = play->get_size();
- Ref<Texture> play_tex = onstart ? auto_play : play;
+ Ref<Texture2D> play_tex = onstart ? auto_play : play;
if (over_node == name && over_node_what == 0) {
state_machine_draw->draw_texture(play_tex, nr.play.position, accent);
@@ -844,11 +814,11 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
}
void AnimationNodeStateMachineEditor::_state_machine_pos_draw() {
-
Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback");
- if (!playback.is_valid() || !playback->is_playing())
+ if (!playback.is_valid() || !playback->is_playing()) {
return;
+ }
int idx = -1;
for (int i = 0; i < node_rects.size(); i++) {
@@ -858,8 +828,9 @@ void AnimationNodeStateMachineEditor::_state_machine_pos_draw() {
}
}
- if (idx == -1)
+ if (idx == -1) {
return;
+ }
const NodeRect &nr = node_rects[idx];
@@ -879,21 +850,21 @@ void AnimationNodeStateMachineEditor::_state_machine_pos_draw() {
float pos = CLAMP(play_pos, 0, len);
float c = pos / len;
- Color fg = get_color("font_color", "Label");
+ Color fg = get_theme_color("font_color", "Label");
Color bg = fg;
bg.a *= 0.3;
state_machine_play_pos->draw_line(from, to, bg, 2);
- to = from.linear_interpolate(to, c);
+ to = from.lerp(to, c);
state_machine_play_pos->draw_line(from, to, fg, 2);
}
void AnimationNodeStateMachineEditor::_update_graph() {
-
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
@@ -903,40 +874,30 @@ void AnimationNodeStateMachineEditor::_update_graph() {
}
void AnimationNodeStateMachineEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- error_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
- panel->add_style_override("panel", get_stylebox("bg", "Tree"));
+ error_panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
+ panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
- tool_select->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tool_create->set_icon(get_icon("ToolAddNode", "EditorIcons"));
- tool_connect->set_icon(get_icon("ToolConnect", "EditorIcons"));
+ tool_select->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ tool_create->set_icon(get_theme_icon("ToolAddNode", "EditorIcons"));
+ tool_connect->set_icon(get_theme_icon("ToolConnect", "EditorIcons"));
transition_mode->clear();
- transition_mode->add_icon_item(get_icon("TransitionImmediate", "EditorIcons"), TTR("Immediate"));
- transition_mode->add_icon_item(get_icon("TransitionSync", "EditorIcons"), TTR("Sync"));
- transition_mode->add_icon_item(get_icon("TransitionEnd", "EditorIcons"), TTR("At End"));
-
- //force filter on those, so they deform better
- get_icon("TransitionImmediateBig", "EditorIcons")->set_flags(Texture::FLAG_FILTER);
- get_icon("TransitionEndBig", "EditorIcons")->set_flags(Texture::FLAG_FILTER);
- get_icon("TransitionSyncBig", "EditorIcons")->set_flags(Texture::FLAG_FILTER);
- get_icon("TransitionImmediateAutoBig", "EditorIcons")->set_flags(Texture::FLAG_FILTER);
- get_icon("TransitionEndAutoBig", "EditorIcons")->set_flags(Texture::FLAG_FILTER);
- get_icon("TransitionSyncAutoBig", "EditorIcons")->set_flags(Texture::FLAG_FILTER);
-
- tool_erase->set_icon(get_icon("Remove", "EditorIcons"));
- tool_autoplay->set_icon(get_icon("AutoPlay", "EditorIcons"));
- tool_end->set_icon(get_icon("AutoEnd", "EditorIcons"));
+ transition_mode->add_icon_item(get_theme_icon("TransitionImmediate", "EditorIcons"), TTR("Immediate"));
+ transition_mode->add_icon_item(get_theme_icon("TransitionSync", "EditorIcons"), TTR("Sync"));
+ transition_mode->add_icon_item(get_theme_icon("TransitionEnd", "EditorIcons"), TTR("At End"));
+
+ tool_erase->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ tool_autoplay->set_icon(get_theme_icon("AutoPlay", "EditorIcons"));
+ tool_end->set_icon(get_theme_icon("AutoEnd", "EditorIcons"));
play_mode->clear();
- play_mode->add_icon_item(get_icon("PlayTravel", "EditorIcons"), TTR("Travel"));
- play_mode->add_icon_item(get_icon("Play", "EditorIcons"), TTR("Immediate"));
+ play_mode->add_icon_item(get_theme_icon("PlayTravel", "EditorIcons"), TTR("Travel"));
+ play_mode->add_icon_item(get_theme_icon("Play", "EditorIcons"), TTR("Immediate"));
}
if (p_what == NOTIFICATION_PROCESS) {
-
String error;
Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback");
@@ -1025,7 +986,6 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) {
}
{
-
if (last_travel_path.size() != tp.size()) {
same_travel_path = false;
} else {
@@ -1040,7 +1000,6 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) {
//update if travel state changed
if (!same_travel_path || last_active != is_playing || last_current_node != current_node || last_blend_from_node != blend_from_node) {
-
state_machine_draw->update();
last_travel_path = tp;
last_current_node = current_node;
@@ -1051,7 +1010,6 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) {
{
if (current_node != StringName() && state_machine->has_node(current_node)) {
-
String next = current_node;
Ref<AnimationNodeStateMachine> anodesm = state_machine->get_node(next);
Ref<AnimationNodeStateMachinePlayback> current_node_playback;
@@ -1071,7 +1029,6 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) {
}
if (last_play_pos != play_pos) {
-
last_play_pos = play_pos;
state_machine_play_pos->update();
}
@@ -1084,17 +1041,14 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) {
}
void AnimationNodeStateMachineEditor::_open_editor(const String &p_name) {
-
AnimationTreeEditor::get_singleton()->enter_editor(p_name);
}
void AnimationNodeStateMachineEditor::_removed_from_graph() {
-
- EditorNode::get_singleton()->edit_item(NULL);
+ EditorNode::get_singleton()->edit_item(nullptr);
}
void AnimationNodeStateMachineEditor::_name_edited(const String &p_text) {
-
const String &new_name = p_text;
ERR_FAIL_COND(new_name == "" || new_name.find(".") != -1 || new_name.find("/") != -1);
@@ -1118,31 +1072,30 @@ void AnimationNodeStateMachineEditor::_name_edited(const String &p_text) {
undo_redo->add_do_method(this, "_update_graph");
undo_redo->add_undo_method(this, "_update_graph");
undo_redo->commit_action();
- name_edit->hide();
+ name_edit_popup->hide();
updating = false;
state_machine_draw->update();
}
void AnimationNodeStateMachineEditor::_name_edited_focus_out() {
-
- if (updating)
+ if (updating) {
return;
+ }
_name_edited(name_edit->get_text());
}
void AnimationNodeStateMachineEditor::_scroll_changed(double) {
-
- if (updating)
+ if (updating) {
return;
+ }
state_machine->set_graph_offset(Vector2(h_scroll->get_value(), v_scroll->get_value()));
state_machine_draw->update();
}
void AnimationNodeStateMachineEditor::_erase_selected() {
-
if (selected_node != StringName() && state_machine->has_node(selected_node)) {
updating = true;
undo_redo->create_action(TTR("Node Removed"));
@@ -1166,7 +1119,6 @@ void AnimationNodeStateMachineEditor::_erase_selected() {
}
if (selected_transition_to != StringName() && selected_transition_from != StringName() && state_machine->has_transition(selected_transition_from, selected_transition_to)) {
-
Ref<AnimationNodeStateMachineTransition> tr = state_machine->get_transition(state_machine->find_transition(selected_transition_from, selected_transition_to));
updating = true;
undo_redo->create_action(TTR("Transition Removed"));
@@ -1184,9 +1136,7 @@ void AnimationNodeStateMachineEditor::_erase_selected() {
}
void AnimationNodeStateMachineEditor::_autoplay_selected() {
-
if (selected_node != StringName() && state_machine->has_node(selected_node)) {
-
StringName new_start_node;
if (state_machine->get_start_node() == selected_node) { //toggle it
new_start_node = StringName();
@@ -1207,9 +1157,7 @@ void AnimationNodeStateMachineEditor::_autoplay_selected() {
}
void AnimationNodeStateMachineEditor::_end_selected() {
-
if (selected_node != StringName() && state_machine->has_node(selected_node)) {
-
StringName new_end_node;
if (state_machine->get_end_node() == selected_node) { //toggle it
new_end_node = StringName();
@@ -1228,8 +1176,8 @@ void AnimationNodeStateMachineEditor::_end_selected() {
state_machine_draw->update();
}
}
-void AnimationNodeStateMachineEditor::_update_mode() {
+void AnimationNodeStateMachineEditor::_update_mode() {
if (tool_select->is_pressed()) {
tool_erase_hb->show();
tool_erase->set_disabled(selected_node == StringName() && selected_transition_from == StringName() && selected_transition_to == StringName());
@@ -1241,34 +1189,16 @@ void AnimationNodeStateMachineEditor::_update_mode() {
}
void AnimationNodeStateMachineEditor::_bind_methods() {
-
- ClassDB::bind_method("_state_machine_gui_input", &AnimationNodeStateMachineEditor::_state_machine_gui_input);
- ClassDB::bind_method("_state_machine_draw", &AnimationNodeStateMachineEditor::_state_machine_draw);
- ClassDB::bind_method("_state_machine_pos_draw", &AnimationNodeStateMachineEditor::_state_machine_pos_draw);
ClassDB::bind_method("_update_graph", &AnimationNodeStateMachineEditor::_update_graph);
- ClassDB::bind_method("_add_menu_type", &AnimationNodeStateMachineEditor::_add_menu_type);
- ClassDB::bind_method("_add_animation_type", &AnimationNodeStateMachineEditor::_add_animation_type);
-
- ClassDB::bind_method("_name_edited", &AnimationNodeStateMachineEditor::_name_edited);
- ClassDB::bind_method("_name_edited_focus_out", &AnimationNodeStateMachineEditor::_name_edited_focus_out);
-
ClassDB::bind_method("_removed_from_graph", &AnimationNodeStateMachineEditor::_removed_from_graph);
ClassDB::bind_method("_open_editor", &AnimationNodeStateMachineEditor::_open_editor);
- ClassDB::bind_method("_scroll_changed", &AnimationNodeStateMachineEditor::_scroll_changed);
-
- ClassDB::bind_method("_erase_selected", &AnimationNodeStateMachineEditor::_erase_selected);
- ClassDB::bind_method("_autoplay_selected", &AnimationNodeStateMachineEditor::_autoplay_selected);
- ClassDB::bind_method("_end_selected", &AnimationNodeStateMachineEditor::_end_selected);
- ClassDB::bind_method("_update_mode", &AnimationNodeStateMachineEditor::_update_mode);
- ClassDB::bind_method("_file_opened", &AnimationNodeStateMachineEditor::_file_opened);
}
-AnimationNodeStateMachineEditor *AnimationNodeStateMachineEditor::singleton = NULL;
+AnimationNodeStateMachineEditor *AnimationNodeStateMachineEditor::singleton = nullptr;
AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
-
singleton = this;
updating = false;
@@ -1278,49 +1208,55 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
Ref<ButtonGroup> bg;
bg.instance();
- tool_select = memnew(ToolButton);
+ tool_select = memnew(Button);
+ tool_select->set_flat(true);
top_hb->add_child(tool_select);
tool_select->set_toggle_mode(true);
tool_select->set_button_group(bg);
tool_select->set_pressed(true);
tool_select->set_tooltip(TTR("Select and move nodes.\nRMB to add new nodes.\nShift+LMB to create connections."));
- tool_select->connect("pressed", this, "_update_mode", varray(), CONNECT_DEFERRED);
+ tool_select->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_update_mode), varray(), CONNECT_DEFERRED);
- tool_create = memnew(ToolButton);
+ tool_create = memnew(Button);
+ tool_create->set_flat(true);
top_hb->add_child(tool_create);
tool_create->set_toggle_mode(true);
tool_create->set_button_group(bg);
tool_create->set_tooltip(TTR("Create new nodes."));
- tool_create->connect("pressed", this, "_update_mode", varray(), CONNECT_DEFERRED);
+ tool_create->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_update_mode), varray(), CONNECT_DEFERRED);
- tool_connect = memnew(ToolButton);
+ tool_connect = memnew(Button);
+ tool_connect->set_flat(true);
top_hb->add_child(tool_connect);
tool_connect->set_toggle_mode(true);
tool_connect->set_button_group(bg);
tool_connect->set_tooltip(TTR("Connect nodes."));
- tool_connect->connect("pressed", this, "_update_mode", varray(), CONNECT_DEFERRED);
+ tool_connect->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_update_mode), varray(), CONNECT_DEFERRED);
tool_erase_hb = memnew(HBoxContainer);
top_hb->add_child(tool_erase_hb);
tool_erase_hb->add_child(memnew(VSeparator));
- tool_erase = memnew(ToolButton);
+ tool_erase = memnew(Button);
+ tool_erase->set_flat(true);
tool_erase->set_tooltip(TTR("Remove selected node or transition."));
tool_erase_hb->add_child(tool_erase);
- tool_erase->connect("pressed", this, "_erase_selected");
+ tool_erase->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_erase_selected));
tool_erase->set_disabled(true);
tool_erase_hb->add_child(memnew(VSeparator));
- tool_autoplay = memnew(ToolButton);
+ tool_autoplay = memnew(Button);
+ tool_autoplay->set_flat(true);
tool_autoplay->set_tooltip(TTR("Toggle autoplay this animation on start, restart or seek to zero."));
tool_erase_hb->add_child(tool_autoplay);
- tool_autoplay->connect("pressed", this, "_autoplay_selected");
+ tool_autoplay->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_autoplay_selected));
tool_autoplay->set_disabled(true);
- tool_end = memnew(ToolButton);
+ tool_end = memnew(Button);
+ tool_end->set_flat(true);
tool_end->set_tooltip(TTR("Set the end animation. This is useful for sub-transitions."));
tool_erase_hb->add_child(tool_end);
- tool_end->connect("pressed", this, "_end_selected");
+ tool_end->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_end_selected));
tool_end->set_disabled(true);
top_hb->add_child(memnew(VSeparator));
@@ -1341,26 +1277,26 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
state_machine_draw = memnew(Control);
panel->add_child(state_machine_draw);
- state_machine_draw->connect("gui_input", this, "_state_machine_gui_input");
- state_machine_draw->connect("draw", this, "_state_machine_draw");
+ state_machine_draw->connect("gui_input", callable_mp(this, &AnimationNodeStateMachineEditor::_state_machine_gui_input));
+ state_machine_draw->connect("draw", callable_mp(this, &AnimationNodeStateMachineEditor::_state_machine_draw));
state_machine_draw->set_focus_mode(FOCUS_ALL);
state_machine_play_pos = memnew(Control);
state_machine_draw->add_child(state_machine_play_pos);
state_machine_play_pos->set_mouse_filter(MOUSE_FILTER_PASS); //pass all to parent
state_machine_play_pos->set_anchors_and_margins_preset(PRESET_WIDE);
- state_machine_play_pos->connect("draw", this, "_state_machine_pos_draw");
+ state_machine_play_pos->connect("draw", callable_mp(this, &AnimationNodeStateMachineEditor::_state_machine_pos_draw));
v_scroll = memnew(VScrollBar);
state_machine_draw->add_child(v_scroll);
v_scroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
- v_scroll->connect("value_changed", this, "_scroll_changed");
+ v_scroll->connect("value_changed", callable_mp(this, &AnimationNodeStateMachineEditor::_scroll_changed));
h_scroll = memnew(HScrollBar);
state_machine_draw->add_child(h_scroll);
h_scroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
h_scroll->set_margin(MARGIN_RIGHT, -v_scroll->get_size().x * EDSCALE);
- h_scroll->connect("value_changed", this, "_scroll_changed");
+ h_scroll->connect("value_changed", callable_mp(this, &AnimationNodeStateMachineEditor::_scroll_changed));
error_panel = memnew(PanelContainer);
add_child(error_panel);
@@ -1374,25 +1310,26 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_add_menu_type");
+ menu->connect("id_pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_add_menu_type));
animations_menu = memnew(PopupMenu);
menu->add_child(animations_menu);
animations_menu->set_name("animations");
- animations_menu->connect("index_pressed", this, "_add_animation_type");
+ animations_menu->connect("index_pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_add_animation_type));
+ name_edit_popup = memnew(Popup);
+ add_child(name_edit_popup);
name_edit = memnew(LineEdit);
- state_machine_draw->add_child(name_edit);
- name_edit->hide();
- name_edit->connect("text_entered", this, "_name_edited");
- name_edit->connect("focus_exited", this, "_name_edited_focus_out");
- name_edit->set_as_toplevel(true);
+ name_edit_popup->add_child(name_edit);
+ name_edit->set_anchors_and_margins_preset(PRESET_WIDE);
+ name_edit->connect("text_entered", callable_mp(this, &AnimationNodeStateMachineEditor::_name_edited));
+ name_edit->connect("focus_exited", callable_mp(this, &AnimationNodeStateMachineEditor::_name_edited_focus_out));
open_file = memnew(EditorFileDialog);
add_child(open_file);
open_file->set_title(TTR("Open Animation Node"));
- open_file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- open_file->connect("file_selected", this, "_file_opened");
+ open_file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ open_file->connect("file_selected", callable_mp(this, &AnimationNodeStateMachineEditor::_file_opened));
undo_redo = EditorNode::get_undo_redo();
over_text = false;
diff --git a/editor/plugins/animation_state_machine_editor.h b/editor/plugins/animation_state_machine_editor.h
index 132e66b28d..f78d90bdbf 100644
--- a/editor/plugins/animation_state_machine_editor.h
+++ b/editor/plugins/animation_state_machine_editor.h
@@ -42,20 +42,20 @@
#include "scene/gui/tree.h"
class AnimationNodeStateMachineEditor : public AnimationTreeNodeEditorPlugin {
-
GDCLASS(AnimationNodeStateMachineEditor, AnimationTreeNodeEditorPlugin);
Ref<AnimationNodeStateMachine> state_machine;
- ToolButton *tool_select;
- ToolButton *tool_create;
- ToolButton *tool_connect;
+ Button *tool_select;
+ Button *tool_create;
+ Button *tool_connect;
+ Popup *name_edit_popup;
LineEdit *name_edit;
HBoxContainer *tool_erase_hb;
- ToolButton *tool_erase;
- ToolButton *tool_autoplay;
- ToolButton *tool_end;
+ Button *tool_erase;
+ Button *tool_autoplay;
+ Button *tool_end;
OptionButton *transition_mode;
OptionButton *play_mode;
@@ -182,8 +182,8 @@ protected:
public:
static AnimationNodeStateMachineEditor *get_singleton() { return singleton; }
- virtual bool can_edit(const Ref<AnimationNode> &p_node);
- virtual void edit(const Ref<AnimationNode> &p_node);
+ virtual bool can_edit(const Ref<AnimationNode> &p_node) override;
+ virtual void edit(const Ref<AnimationNode> &p_node) override;
AnimationNodeStateMachineEditor();
};
diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp
index 8dc7e4638d..269c54ba2b 100644
--- a/editor/plugins/animation_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_tree_editor_plugin.cpp
@@ -34,9 +34,9 @@
#include "animation_blend_space_2d_editor.h"
#include "animation_blend_tree_editor_plugin.h"
#include "animation_state_machine_editor.h"
+#include "core/input/input.h"
#include "core/io/resource_loader.h"
-#include "core/math/delaunay.h"
-#include "core/os/input.h"
+#include "core/math/delaunay_2d.h"
#include "core/os/keyboard.h"
#include "core/project_settings.h"
#include "editor/editor_scale.h"
@@ -44,13 +44,13 @@
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/scene_string_names.h"
void AnimationTreeEditor::edit(AnimationTree *p_tree) {
-
- if (tree == p_tree)
+ if (tree == p_tree) {
return;
+ }
tree = p_tree;
@@ -59,12 +59,11 @@ void AnimationTreeEditor::edit(AnimationTree *p_tree) {
path = tree->get_meta("_tree_edit_path");
edit_path(path);
} else {
- current_root = 0;
+ current_root = ObjectID();
}
}
void AnimationTreeEditor::_path_button_pressed(int p_path) {
-
edited_path.clear();
for (int i = 0; i <= p_path; i++) {
edited_path.push_back(button_path[i]);
@@ -80,12 +79,12 @@ void AnimationTreeEditor::_update_path() {
group.instance();
Button *b = memnew(Button);
- b->set_text("root");
+ b->set_text("Root");
b->set_toggle_mode(true);
b->set_button_group(group);
b->set_pressed(true);
b->set_focus_mode(FOCUS_NONE);
- b->connect("pressed", this, "_path_button_pressed", varray(-1));
+ b->connect("pressed", callable_mp(this, &AnimationTreeEditor::_path_button_pressed), varray(-1));
path_hb->add_child(b);
for (int i = 0; i < button_path.size(); i++) {
b = memnew(Button);
@@ -95,12 +94,11 @@ void AnimationTreeEditor::_update_path() {
path_hb->add_child(b);
b->set_pressed(true);
b->set_focus_mode(FOCUS_NONE);
- b->connect("pressed", this, "_path_button_pressed", varray(i));
+ b->connect("pressed", callable_mp(this, &AnimationTreeEditor::_path_button_pressed), varray(i));
}
}
void AnimationTreeEditor::edit_path(const Vector<String> &p_path) {
-
button_path.clear();
Ref<AnimationNode> node = tree->get_tree_root();
@@ -109,7 +107,6 @@ void AnimationTreeEditor::edit_path(const Vector<String> &p_path) {
current_root = node->get_instance_id();
for (int i = 0; i < p_path.size(); i++) {
-
Ref<AnimationNode> child = node->get_child_by_name(p_path[i]);
ERR_BREAK(child.is_null());
node = child;
@@ -128,7 +125,7 @@ void AnimationTreeEditor::edit_path(const Vector<String> &p_path) {
}
}
} else {
- current_root = 0;
+ current_root = ObjectID();
edited_path = button_path;
}
@@ -140,7 +137,6 @@ Vector<String> AnimationTreeEditor::get_edited_path() const {
}
void AnimationTreeEditor::enter_editor(const String &p_path) {
-
Vector<String> path = edited_path;
path.push_back(p_path);
edit_path(path);
@@ -151,7 +147,7 @@ void AnimationTreeEditor::_about_to_show_root() {
void AnimationTreeEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_PROCESS) {
- ObjectID root = 0;
+ ObjectID root;
if (tree && tree->get_tree_root().is_valid()) {
root = tree->get_tree_root()->get_instance_id();
}
@@ -167,10 +163,9 @@ void AnimationTreeEditor::_notification(int p_what) {
}
void AnimationTreeEditor::_bind_methods() {
- ClassDB::bind_method("_path_button_pressed", &AnimationTreeEditor::_path_button_pressed);
}
-AnimationTreeEditor *AnimationTreeEditor::singleton = NULL;
+AnimationTreeEditor *AnimationTreeEditor::singleton = nullptr;
void AnimationTreeEditor::add_plugin(AnimationTreeNodeEditorPlugin *p_editor) {
ERR_FAIL_COND(p_editor->get_parent());
@@ -205,19 +200,20 @@ bool AnimationTreeEditor::can_edit(const Ref<AnimationNode> &p_node) const {
}
Vector<String> AnimationTreeEditor::get_animation_list() {
-
if (!singleton->is_visible()) {
return Vector<String>();
}
AnimationTree *tree = singleton->tree;
- if (!tree || !tree->has_node(tree->get_animation_player()))
+ if (!tree || !tree->has_node(tree->get_animation_player())) {
return Vector<String>();
+ }
AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(tree->get_node(tree->get_animation_player()));
- if (!ap)
+ if (!ap) {
return Vector<String>();
+ }
List<StringName> anims;
ap->get_animation_list(&anims);
@@ -230,7 +226,6 @@ Vector<String> AnimationTreeEditor::get_animation_list() {
}
AnimationTreeEditor::AnimationTreeEditor() {
-
AnimationNodeAnimation::get_editable_animation_list = get_animation_list;
path_edit = memnew(ScrollContainer);
add_child(path_edit);
@@ -242,9 +237,8 @@ AnimationTreeEditor::AnimationTreeEditor() {
add_child(memnew(HSeparator));
- current_root = 0;
singleton = this;
- editor_base = memnew(PanelContainer);
+ editor_base = memnew(MarginContainer);
editor_base->set_v_size_flags(SIZE_EXPAND_FILL);
add_child(editor_base);
@@ -255,17 +249,14 @@ AnimationTreeEditor::AnimationTreeEditor() {
}
void AnimationTreeEditorPlugin::edit(Object *p_object) {
-
anim_tree_editor->edit(Object::cast_to<AnimationTree>(p_object));
}
bool AnimationTreeEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("AnimationTree");
}
void AnimationTreeEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
//editor->hide_animation_player_editors();
//editor->animation_panel_make_visible(true);
@@ -273,16 +264,15 @@ void AnimationTreeEditorPlugin::make_visible(bool p_visible) {
editor->make_bottom_panel_item_visible(anim_tree_editor);
anim_tree_editor->set_process(true);
} else {
-
- if (anim_tree_editor->is_visible_in_tree())
+ if (anim_tree_editor->is_visible_in_tree()) {
editor->hide_bottom_panel();
+ }
button->hide();
anim_tree_editor->set_process(false);
}
}
AnimationTreeEditorPlugin::AnimationTreeEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
anim_tree_editor = memnew(AnimationTreeEditor);
anim_tree_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE);
diff --git a/editor/plugins/animation_tree_editor_plugin.h b/editor/plugins/animation_tree_editor_plugin.h
index 0b93b0fd8e..356a078d99 100644
--- a/editor/plugins/animation_tree_editor_plugin.h
+++ b/editor/plugins/animation_tree_editor_plugin.h
@@ -49,14 +49,13 @@ public:
};
class AnimationTreeEditor : public VBoxContainer {
-
GDCLASS(AnimationTreeEditor, VBoxContainer);
ScrollContainer *path_edit;
HBoxContainer *path_hb;
AnimationTree *tree;
- PanelContainer *editor_base;
+ MarginContainer *editor_base;
Vector<String> button_path;
Vector<String> edited_path;
@@ -95,7 +94,6 @@ public:
};
class AnimationTreeEditorPlugin : public EditorPlugin {
-
GDCLASS(AnimationTreeEditorPlugin, EditorPlugin);
AnimationTreeEditor *anim_tree_editor;
@@ -103,11 +101,11 @@ class AnimationTreeEditorPlugin : public EditorPlugin {
Button *button;
public:
- virtual String get_name() const { return "AnimationTree"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "AnimationTree"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
AnimationTreeEditorPlugin(EditorNode *p_node);
~AnimationTreeEditorPlugin();
diff --git a/editor/plugins/animation_tree_player_editor_plugin.cpp b/editor/plugins/animation_tree_player_editor_plugin.cpp
deleted file mode 100644
index 2b365feec5..0000000000
--- a/editor/plugins/animation_tree_player_editor_plugin.cpp
+++ /dev/null
@@ -1,1451 +0,0 @@
-/*************************************************************************/
-/* animation_tree_player_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "animation_tree_player_editor_plugin.h"
-
-#include "core/io/resource_loader.h"
-#include "core/os/input.h"
-#include "core/os/keyboard.h"
-#include "core/project_settings.h"
-#include "editor/editor_scale.h"
-#include "scene/gui/menu_button.h"
-#include "scene/gui/panel.h"
-#include "scene/main/viewport.h"
-
-void AnimationTreePlayerEditor::edit(AnimationTreePlayer *p_anim_tree) {
-
- anim_tree = p_anim_tree;
-
- if (!anim_tree) {
- hide();
- } else {
- order.clear();
- p_anim_tree->get_node_list(&order);
- /*
- for(List<StringName>::Element* E=order.front();E;E=E->next()) {
-
- if (E->get() >= (int)last_id)
- last_id=E->get()+1;
- }*/
- play_button->set_pressed(p_anim_tree->is_active());
- //read the orders
- }
-}
-
-Size2 AnimationTreePlayerEditor::_get_maximum_size() {
-
- Size2 max;
-
- for (List<StringName>::Element *E = order.front(); E; E = E->next()) {
-
- Point2 pos = anim_tree->node_get_position(E->get());
-
- if (click_type == CLICK_NODE && click_node == E->get()) {
-
- pos += click_motion - click_pos;
- }
- pos += get_node_size(E->get());
- if (pos.x > max.x)
- max.x = pos.x;
- if (pos.y > max.y)
- max.y = pos.y;
- }
-
- return max;
-}
-
-const char *AnimationTreePlayerEditor::_node_type_names[] = { "Output", "Animation", "OneShot", "Mix", "Blend2", "Blend3", "Blend4", "TimeScale", "TimeSeek", "Transition" };
-
-Size2 AnimationTreePlayerEditor::get_node_size(const StringName &p_node) const {
-
- AnimationTreePlayer::NodeType type = anim_tree->node_get_type(p_node);
-
- Ref<StyleBox> style = get_stylebox("panel", "PopupMenu");
- Ref<Font> font = get_font("font", "PopupMenu");
-
- Size2 size = style->get_minimum_size();
-
- int count = 2; // title and name
- int inputs = anim_tree->node_get_input_count(p_node);
- count += inputs ? inputs : 1;
- String name = p_node;
-
- float name_w = font->get_string_size(name).width;
- float type_w = font->get_string_size(String(_node_type_names[type])).width;
- float max_w = MAX(name_w, type_w);
-
- switch (type) {
- case AnimationTreePlayer::NODE_TIMESEEK:
- case AnimationTreePlayer::NODE_OUTPUT: {
- } break;
- case AnimationTreePlayer::NODE_ANIMATION:
- case AnimationTreePlayer::NODE_ONESHOT:
- case AnimationTreePlayer::NODE_MIX:
- case AnimationTreePlayer::NODE_BLEND2:
- case AnimationTreePlayer::NODE_BLEND3:
- case AnimationTreePlayer::NODE_BLEND4:
- case AnimationTreePlayer::NODE_TIMESCALE:
- case AnimationTreePlayer::NODE_TRANSITION: {
-
- size.height += font->get_height();
- } break;
- case AnimationTreePlayer::NODE_MAX: {
- }
- }
-
- size.x += max_w + 20;
- size.y += count * (font->get_height() + get_constant("vseparation", "PopupMenu"));
-
- return size;
-}
-
-void AnimationTreePlayerEditor::_edit_dialog_changede(String) {
-
- edit_dialog->hide();
-}
-
-void AnimationTreePlayerEditor::_edit_dialog_changeds(String s) {
-
- _edit_dialog_changed();
-}
-
-void AnimationTreePlayerEditor::_edit_dialog_changedf(float) {
-
- _edit_dialog_changed();
-}
-
-void AnimationTreePlayerEditor::_edit_dialog_changed() {
-
- if (updating_edit)
- return;
-
- if (renaming_edit) {
-
- if (anim_tree->node_rename(edited_node, edit_line[0]->get_text()) == OK) {
- for (List<StringName>::Element *E = order.front(); E; E = E->next()) {
-
- if (E->get() == edited_node)
- E->get() = edit_line[0]->get_text();
- }
- edited_node = edit_line[0]->get_text();
- }
- update();
- return;
- }
-
- AnimationTreePlayer::NodeType type = anim_tree->node_get_type(edited_node);
-
- switch (type) {
-
- case AnimationTreePlayer::NODE_TIMESCALE:
- anim_tree->timescale_node_set_scale(edited_node, edit_line[0]->get_text().to_double());
- break;
- case AnimationTreePlayer::NODE_ONESHOT:
- anim_tree->oneshot_node_set_fadein_time(edited_node, edit_line[0]->get_text().to_double());
- anim_tree->oneshot_node_set_fadeout_time(edited_node, edit_line[1]->get_text().to_double());
- anim_tree->oneshot_node_set_autorestart_delay(edited_node, edit_line[2]->get_text().to_double());
- anim_tree->oneshot_node_set_autorestart_random_delay(edited_node, edit_line[3]->get_text().to_double());
- anim_tree->oneshot_node_set_autorestart(edited_node, edit_check->is_pressed());
- anim_tree->oneshot_node_set_mix_mode(edited_node, edit_option->get_selected());
-
- break;
-
- case AnimationTreePlayer::NODE_MIX:
-
- anim_tree->mix_node_set_amount(edited_node, edit_scroll[0]->get_value());
- break;
- case AnimationTreePlayer::NODE_BLEND2:
- anim_tree->blend2_node_set_amount(edited_node, edit_scroll[0]->get_value());
-
- break;
-
- case AnimationTreePlayer::NODE_BLEND3:
- anim_tree->blend3_node_set_amount(edited_node, edit_scroll[0]->get_value());
-
- break;
- case AnimationTreePlayer::NODE_BLEND4:
-
- anim_tree->blend4_node_set_amount(edited_node, Point2(edit_scroll[0]->get_value(), edit_scroll[1]->get_value()));
-
- break;
-
- case AnimationTreePlayer::NODE_TRANSITION: {
- anim_tree->transition_node_set_xfade_time(edited_node, edit_line[0]->get_text().to_double());
- if (anim_tree->transition_node_get_current(edited_node) != edit_option->get_selected())
- anim_tree->transition_node_set_current(edited_node, edit_option->get_selected());
- } break;
- default: {
- }
- }
-}
-
-void AnimationTreePlayerEditor::_edit_dialog_animation_changed() {
-
- Ref<Animation> anim = property_editor->get_variant().operator RefPtr();
- anim_tree->animation_node_set_animation(edited_node, anim);
- update();
-}
-
-void AnimationTreePlayerEditor::_edit_dialog_edit_animation() {
-
- if (Engine::get_singleton()->is_editor_hint()) {
- get_tree()->get_root()->get_child(0)->call("_resource_selected", property_editor->get_variant().operator RefPtr());
- };
-};
-
-void AnimationTreePlayerEditor::_edit_oneshot_start() {
-
- anim_tree->oneshot_node_start(edited_node);
-}
-
-void AnimationTreePlayerEditor::_play_toggled() {
-
- anim_tree->set_active(play_button->is_pressed());
-}
-
-void AnimationTreePlayerEditor::_master_anim_menu_item(int p_item) {
-
- if (p_item == 0)
- _edit_filters();
- else {
-
- String str = master_anim_popup->get_item_text(p_item);
- anim_tree->animation_node_set_master_animation(edited_node, str);
- }
- update();
-}
-
-void AnimationTreePlayerEditor::_popup_edit_dialog() {
-
- updating_edit = true;
-
- for (int i = 0; i < 2; i++)
- edit_scroll[i]->hide();
-
- for (int i = 0; i < 4; i++) {
-
- edit_line[i]->hide();
- edit_label[i]->hide();
- }
-
- edit_option->hide();
- edit_button->hide();
- filter_button->hide();
- edit_check->hide();
-
- Point2 pos = anim_tree->node_get_position(edited_node) - Point2(h_scroll->get_value(), v_scroll->get_value());
- Ref<StyleBox> style = get_stylebox("panel", "PopupMenu");
- Size2 size = get_node_size(edited_node);
- Point2 popup_pos(pos.x + style->get_margin(MARGIN_LEFT), pos.y + size.y - style->get_margin(MARGIN_BOTTOM));
- popup_pos += get_global_position();
-
- if (renaming_edit) {
-
- edit_label[0]->set_text(TTR("New name:"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_line[0]->set_begin(Point2(15, 25));
- edit_line[0]->set_text(edited_node);
- edit_line[0]->show();
- edit_dialog->set_size(Size2(150, 50));
-
- } else {
-
- AnimationTreePlayer::NodeType type = anim_tree->node_get_type(edited_node);
-
- switch (type) {
-
- case AnimationTreePlayer::NODE_ANIMATION:
-
- if (anim_tree->get_master_player() != NodePath() && anim_tree->has_node(anim_tree->get_master_player()) && Object::cast_to<AnimationPlayer>(anim_tree->get_node(anim_tree->get_master_player()))) {
-
- AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(anim_tree->get_node(anim_tree->get_master_player()));
- master_anim_popup->clear();
- master_anim_popup->add_item(TTR("Edit Filters"));
- master_anim_popup->add_separator();
- List<StringName> sn;
- ap->get_animation_list(&sn);
- sn.sort_custom<StringName::AlphCompare>();
- for (List<StringName>::Element *E = sn.front(); E; E = E->next()) {
- master_anim_popup->add_item(E->get());
- }
-
- master_anim_popup->set_position(popup_pos);
- master_anim_popup->popup();
- } else {
- property_editor->edit(this, "", Variant::OBJECT, anim_tree->animation_node_get_animation(edited_node), PROPERTY_HINT_RESOURCE_TYPE, "Animation");
- property_editor->set_position(popup_pos);
- property_editor->popup();
- updating_edit = false;
- }
- return;
- case AnimationTreePlayer::NODE_TIMESCALE:
- edit_label[0]->set_text(TTR("Scale:"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_line[0]->set_begin(Point2(15, 25));
- edit_line[0]->set_text(rtos(anim_tree->timescale_node_get_scale(edited_node)));
- edit_line[0]->show();
- edit_dialog->set_size(Size2(150, 50));
- break;
- case AnimationTreePlayer::NODE_ONESHOT:
- edit_label[0]->set_text(TTR("Fade In (s):"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_line[0]->set_begin(Point2(15, 25));
- edit_line[0]->set_text(rtos(anim_tree->oneshot_node_get_fadein_time(edited_node)));
- edit_line[0]->show();
- edit_label[1]->set_text(TTR("Fade Out (s):"));
- edit_label[1]->set_position(Point2(5, 55));
- edit_label[1]->show();
- edit_line[1]->set_begin(Point2(15, 75));
- edit_line[1]->set_text(rtos(anim_tree->oneshot_node_get_fadeout_time(edited_node)));
- edit_line[1]->show();
-
- edit_option->clear();
- edit_option->add_item(TTR("Blend"), 0);
- edit_option->add_item(TTR("Mix"), 1);
- edit_option->set_begin(Point2(15, 105));
-
- edit_option->select(anim_tree->oneshot_node_get_mix_mode(edited_node));
- edit_option->show();
-
- edit_check->set_text(TTR("Auto Restart:"));
- edit_check->set_begin(Point2(15, 125));
- edit_check->set_pressed(anim_tree->oneshot_node_has_autorestart(edited_node));
- edit_check->show();
-
- edit_label[2]->set_text(TTR("Restart (s):"));
- edit_label[2]->set_position(Point2(5, 145));
- edit_label[2]->show();
- edit_line[2]->set_begin(Point2(15, 165));
- edit_line[2]->set_text(rtos(anim_tree->oneshot_node_get_autorestart_delay(edited_node)));
- edit_line[2]->show();
- edit_label[3]->set_text(TTR("Random Restart (s):"));
- edit_label[3]->set_position(Point2(5, 195));
- edit_label[3]->show();
- edit_line[3]->set_begin(Point2(15, 215));
- edit_line[3]->set_text(rtos(anim_tree->oneshot_node_get_autorestart_random_delay(edited_node)));
- edit_line[3]->show();
-
- filter_button->set_begin(Point2(10, 245));
- filter_button->show();
-
- edit_button->set_begin(Point2(10, 268));
- edit_button->set_text(TTR("Start!"));
-
- edit_button->show();
-
- edit_dialog->set_size(Size2(180, 293));
-
- break;
-
- case AnimationTreePlayer::NODE_MIX:
-
- edit_label[0]->set_text(TTR("Amount:"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_scroll[0]->set_min(0);
- edit_scroll[0]->set_max(1);
- edit_scroll[0]->set_step(0.01);
- edit_scroll[0]->set_value(anim_tree->mix_node_get_amount(edited_node));
- edit_scroll[0]->set_begin(Point2(15, 25));
- edit_scroll[0]->show();
- edit_dialog->set_size(Size2(150, 50));
-
- break;
- case AnimationTreePlayer::NODE_BLEND2:
- edit_label[0]->set_text(TTR("Blend:"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_scroll[0]->set_min(0);
- edit_scroll[0]->set_max(1);
- edit_scroll[0]->set_step(0.01);
- edit_scroll[0]->set_value(anim_tree->blend2_node_get_amount(edited_node));
- edit_scroll[0]->set_begin(Point2(15, 25));
- edit_scroll[0]->show();
- filter_button->set_begin(Point2(10, 47));
- filter_button->show();
- edit_dialog->set_size(Size2(150, 74));
-
- break;
-
- case AnimationTreePlayer::NODE_BLEND3:
- edit_label[0]->set_text(TTR("Blend:"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_scroll[0]->set_min(-1);
- edit_scroll[0]->set_max(1);
- edit_scroll[0]->set_step(0.01);
- edit_scroll[0]->set_value(anim_tree->blend3_node_get_amount(edited_node));
- edit_scroll[0]->set_begin(Point2(15, 25));
- edit_scroll[0]->show();
- edit_dialog->set_size(Size2(150, 50));
-
- break;
- case AnimationTreePlayer::NODE_BLEND4:
-
- edit_label[0]->set_text(TTR("Blend 0:"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_scroll[0]->set_min(0);
- edit_scroll[0]->set_max(1);
- edit_scroll[0]->set_step(0.01);
- edit_scroll[0]->set_value(anim_tree->blend4_node_get_amount(edited_node).x);
- edit_scroll[0]->set_begin(Point2(15, 25));
- edit_scroll[0]->show();
- edit_label[1]->set_text(TTR("Blend 1:"));
- edit_label[1]->set_position(Point2(5, 55));
- edit_label[1]->show();
- edit_scroll[1]->set_min(0);
- edit_scroll[1]->set_max(1);
- edit_scroll[1]->set_step(0.01);
- edit_scroll[1]->set_value(anim_tree->blend4_node_get_amount(edited_node).y);
- edit_scroll[1]->set_begin(Point2(15, 75));
- edit_scroll[1]->show();
- edit_dialog->set_size(Size2(150, 100));
-
- break;
-
- case AnimationTreePlayer::NODE_TRANSITION: {
-
- edit_label[0]->set_text(TTR("X-Fade Time (s):"));
- edit_label[0]->set_position(Point2(5, 5));
- edit_label[0]->show();
- edit_line[0]->set_begin(Point2(15, 25));
- edit_line[0]->set_text(rtos(anim_tree->transition_node_get_xfade_time(edited_node)));
- edit_line[0]->show();
-
- edit_label[1]->set_text(TTR("Current:"));
- edit_label[1]->set_position(Point2(5, 55));
- edit_label[1]->show();
- edit_option->set_begin(Point2(15, 75));
-
- edit_option->clear();
-
- for (int i = 0; i < anim_tree->transition_node_get_input_count(edited_node); i++) {
- edit_option->add_item(itos(i), i);
- }
-
- edit_option->select(anim_tree->transition_node_get_current(edited_node));
- edit_option->show();
- edit_dialog->set_size(Size2(150, 100));
-
- } break;
- default: {
- }
- }
- }
-
- edit_dialog->set_position(popup_pos);
- edit_dialog->popup();
-
- updating_edit = false;
-}
-
-void AnimationTreePlayerEditor::_draw_node(const StringName &p_node) {
-
- RID ci = get_canvas_item();
- AnimationTreePlayer::NodeType type = anim_tree->node_get_type(p_node);
-
- Ref<StyleBox> style = get_stylebox("panel", "PopupMenu");
- Ref<Font> font = get_font("font", "PopupMenu");
- Color font_color = get_color("font_color", "PopupMenu");
- Color font_color_title = get_color("font_color_hover", "PopupMenu");
- font_color_title.a *= 0.8;
- Ref<Texture> slot_icon = get_icon("VisualShaderPort", "EditorIcons");
-
- Size2 size = get_node_size(p_node);
- Point2 pos = anim_tree->node_get_position(p_node);
- if (click_type == CLICK_NODE && click_node == p_node) {
-
- pos += click_motion - click_pos;
- if (pos.x < 5)
- pos.x = 5;
- if (pos.y < 5)
- pos.y = 5;
- }
-
- pos -= Point2(h_scroll->get_value(), v_scroll->get_value());
-
- style->draw(ci, Rect2(pos, size));
-
- float w = size.width - style->get_minimum_size().width;
- float h = font->get_height() + get_constant("vseparation", "PopupMenu");
-
- Point2 ofs = style->get_offset() + pos;
- Point2 ascofs(0, font->get_ascent());
-
- Color bx = font_color_title;
- bx.a *= 0.1;
- draw_rect(Rect2(ofs, Size2(size.width - style->get_minimum_size().width, font->get_height())), bx);
- font->draw_halign(ci, ofs + ascofs, HALIGN_CENTER, w, String(_node_type_names[type]), font_color_title);
-
- ofs.y += h;
- font->draw_halign(ci, ofs + ascofs, HALIGN_CENTER, w, p_node, font_color);
- ofs.y += h;
-
- int inputs = anim_tree->node_get_input_count(p_node);
-
- float icon_h_ofs = Math::floor((font->get_height() - slot_icon->get_height()) / 2.0) + 1;
-
- if (type != AnimationTreePlayer::NODE_OUTPUT)
- slot_icon->draw(ci, ofs + Point2(w, icon_h_ofs)); //output
-
- if (inputs) {
- for (int i = 0; i < inputs; i++) {
-
- slot_icon->draw(ci, ofs + Point2(-slot_icon->get_width(), icon_h_ofs));
- String text;
- switch (type) {
-
- case AnimationTreePlayer::NODE_TIMESCALE:
- case AnimationTreePlayer::NODE_TIMESEEK: text = "in"; break;
- case AnimationTreePlayer::NODE_OUTPUT: text = "out"; break;
- case AnimationTreePlayer::NODE_ANIMATION: break;
- case AnimationTreePlayer::NODE_ONESHOT: text = (i == 0 ? "in" : "add"); break;
- case AnimationTreePlayer::NODE_BLEND2:
- case AnimationTreePlayer::NODE_MIX: text = (i == 0 ? "a" : "b"); break;
- case AnimationTreePlayer::NODE_BLEND3:
- switch (i) {
- case 0: text = "b-"; break;
- case 1: text = "a"; break;
- case 2: text = "b+"; break;
- }
- break;
-
- case AnimationTreePlayer::NODE_BLEND4:
- switch (i) {
- case 0: text = "a0"; break;
- case 1: text = "b0"; break;
- case 2: text = "a1"; break;
- case 3: text = "b1"; break;
- }
- break;
-
- case AnimationTreePlayer::NODE_TRANSITION:
- text = itos(i);
- if (anim_tree->transition_node_has_input_auto_advance(p_node, i))
- text += "->";
-
- break;
- default: {
- }
- }
- font->draw(ci, ofs + ascofs + Point2(3, 0), text, font_color);
-
- ofs.y += h;
- }
- } else {
- ofs.y += h;
- }
-
- Ref<StyleBox> pg_bg = get_stylebox("bg", "ProgressBar");
- Ref<StyleBox> pg_fill = get_stylebox("fill", "ProgressBar");
- Rect2 pg_rect(ofs, Size2(w, h));
-
- bool editable = true;
- switch (type) {
- case AnimationTreePlayer::NODE_ANIMATION: {
-
- Ref<Animation> anim = anim_tree->animation_node_get_animation(p_node);
- String text;
- if (anim_tree->animation_node_get_master_animation(p_node) != "")
- text = anim_tree->animation_node_get_master_animation(p_node);
- else if (anim.is_null())
- text = "load...";
- else
- text = anim->get_name();
-
- font->draw_halign(ci, ofs + ascofs, HALIGN_CENTER, w, text, font_color_title);
-
- } break;
- case AnimationTreePlayer::NODE_ONESHOT:
- case AnimationTreePlayer::NODE_MIX:
- case AnimationTreePlayer::NODE_BLEND2:
- case AnimationTreePlayer::NODE_BLEND3:
- case AnimationTreePlayer::NODE_BLEND4:
- case AnimationTreePlayer::NODE_TIMESCALE:
- case AnimationTreePlayer::NODE_TRANSITION: {
-
- font->draw_halign(ci, ofs + ascofs, HALIGN_CENTER, w, "edit...", font_color_title);
- } break;
- default: editable = false;
- }
-
- if (editable) {
-
- Ref<Texture> arrow = get_icon("GuiDropdown", "EditorIcons");
- Point2 arrow_ofs(w - arrow->get_width(), Math::floor((h - arrow->get_height()) / 2));
- arrow->draw(ci, ofs + arrow_ofs);
- }
-}
-
-AnimationTreePlayerEditor::ClickType AnimationTreePlayerEditor::_locate_click(const Point2 &p_click, StringName *p_node_id, int *p_slot_index) const {
-
- Ref<StyleBox> style = get_stylebox("panel", "PopupMenu");
- Ref<Font> font = get_font("font", "PopupMenu");
-
- float h = (font->get_height() + get_constant("vseparation", "PopupMenu"));
-
- for (const List<StringName>::Element *E = order.back(); E; E = E->prev()) {
-
- const StringName &node = E->get();
-
- AnimationTreePlayer::NodeType type = anim_tree->node_get_type(node);
-
- Point2 pos = anim_tree->node_get_position(node);
- Size2 size = get_node_size(node);
-
- pos -= Point2(h_scroll->get_value(), v_scroll->get_value());
-
- if (!Rect2(pos, size).has_point(p_click))
- continue;
-
- if (p_node_id)
- *p_node_id = node;
-
- pos = p_click - pos;
-
- float y = pos.y - style->get_offset().height;
-
- if (y < 2 * h)
- return CLICK_NODE;
- y -= 2 * h;
-
- int inputs = anim_tree->node_get_input_count(node);
- int count = MAX(inputs, 1);
-
- if (inputs == 0 || (pos.x > size.width / 2 && type != AnimationTreePlayer::NODE_OUTPUT)) {
-
- if (y < count * h) {
-
- if (p_slot_index)
- *p_slot_index = 0;
- return CLICK_OUTPUT_SLOT;
- }
- }
-
- for (int i = 0; i < count; i++) {
-
- if (y < h) {
- if (p_slot_index)
- *p_slot_index = i;
- return CLICK_INPUT_SLOT;
- }
- y -= h;
- }
-
- bool has_parameters = type != AnimationTreePlayer::NODE_OUTPUT && type != AnimationTreePlayer::NODE_TIMESEEK;
- return has_parameters ? CLICK_PARAMETER : CLICK_NODE;
- }
-
- return CLICK_NONE;
-}
-
-Point2 AnimationTreePlayerEditor::_get_slot_pos(const StringName &p_node_id, bool p_input, int p_slot) {
-
- Ref<StyleBox> style = get_stylebox("panel", "PopupMenu");
- Ref<Font> font = get_font("font", "PopupMenu");
- Ref<Texture> slot_icon = get_icon("VisualShaderPort", "EditorIcons");
-
- Size2 size = get_node_size(p_node_id);
- Point2 pos = anim_tree->node_get_position(p_node_id);
-
- if (click_type == CLICK_NODE && click_node == p_node_id) {
-
- pos += click_motion - click_pos;
- if (pos.x < 5)
- pos.x = 5;
- if (pos.y < 5)
- pos.y = 5;
- }
-
- pos -= Point2(h_scroll->get_value(), v_scroll->get_value());
-
- float w = size.width - style->get_minimum_size().width;
- float h = font->get_height() + get_constant("vseparation", "PopupMenu");
-
- pos += style->get_offset();
-
- pos.y += h * 2;
-
- pos.y += h * p_slot;
-
- pos += Point2(-slot_icon->get_width() / 2.0, h / 2.0).floor();
-
- if (!p_input) {
- pos.x += w + slot_icon->get_width();
- }
-
- return pos;
-}
-
-void AnimationTreePlayerEditor::_gui_input(Ref<InputEvent> p_event) {
-
- Ref<InputEventMouseButton> mb = p_event;
-
- if (mb.is_valid()) {
-
- if (mb->is_pressed()) {
-
- if (mb->get_button_index() == 1) {
- click_pos = Point2(mb->get_position().x, mb->get_position().y);
- click_motion = click_pos;
- click_type = _locate_click(click_pos, &click_node, &click_slot);
- if (click_type != CLICK_NONE) {
-
- order.erase(click_node);
- order.push_back(click_node);
- update();
- }
-
- switch (click_type) {
- case CLICK_INPUT_SLOT: {
- click_pos = _get_slot_pos(click_node, true, click_slot);
- } break;
- case CLICK_OUTPUT_SLOT: {
- click_pos = _get_slot_pos(click_node, false, click_slot);
- } break;
- case CLICK_PARAMETER: {
-
- edited_node = click_node;
- renaming_edit = false;
- _popup_edit_dialog();
- //open editor
- //_node_edit_property(click_node);
- } break;
- default: {
- }
- }
- }
- if (mb->get_button_index() == 2) {
-
- if (click_type != CLICK_NONE) {
- click_type = CLICK_NONE;
- update();
- } else {
- // try to disconnect/remove
-
- Point2 rclick_pos = Point2(mb->get_position().x, mb->get_position().y);
- rclick_type = _locate_click(rclick_pos, &rclick_node, &rclick_slot);
- if (rclick_type == CLICK_INPUT_SLOT || rclick_type == CLICK_OUTPUT_SLOT) {
-
- node_popup->clear();
- node_popup->set_size(Size2(1, 1));
- node_popup->add_item(TTR("Disconnect"), NODE_DISCONNECT);
- if (anim_tree->node_get_type(rclick_node) == AnimationTreePlayer::NODE_TRANSITION) {
- node_popup->add_item(TTR("Add Input"), NODE_ADD_INPUT);
- if (rclick_type == CLICK_INPUT_SLOT) {
- if (anim_tree->transition_node_has_input_auto_advance(rclick_node, rclick_slot))
- node_popup->add_item(TTR("Clear Auto-Advance"), NODE_CLEAR_AUTOADVANCE);
- else
- node_popup->add_item(TTR("Set Auto-Advance"), NODE_SET_AUTOADVANCE);
- node_popup->add_item(TTR("Delete Input"), NODE_DELETE_INPUT);
- }
- }
-
- node_popup->set_position(rclick_pos + get_global_position());
- node_popup->popup();
- }
-
- if (rclick_type == CLICK_NODE) {
- node_popup->clear();
- node_popup->set_size(Size2(1, 1));
- node_popup->add_item(TTR("Rename"), NODE_RENAME);
- node_popup->add_item(TTR("Remove"), NODE_ERASE);
- if (anim_tree->node_get_type(rclick_node) == AnimationTreePlayer::NODE_TRANSITION)
- node_popup->add_item(TTR("Add Input"), NODE_ADD_INPUT);
- node_popup->set_position(rclick_pos + get_global_position());
- node_popup->popup();
- }
- }
- }
- } else {
-
- if (mb->get_button_index() == 1 && click_type != CLICK_NONE) {
-
- switch (click_type) {
- case CLICK_INPUT_SLOT:
- case CLICK_OUTPUT_SLOT: {
-
- Point2 dst_click_pos = Point2(mb->get_position().x, mb->get_position().y);
- StringName id;
- int slot;
- ClickType dst_click_type = _locate_click(dst_click_pos, &id, &slot);
-
- if (dst_click_type == CLICK_INPUT_SLOT && click_type == CLICK_OUTPUT_SLOT) {
-
- anim_tree->connect_nodes(click_node, id, slot);
- }
- if (click_type == CLICK_INPUT_SLOT && dst_click_type == CLICK_OUTPUT_SLOT) {
-
- anim_tree->connect_nodes(id, click_node, click_slot);
- }
-
- } break;
- case CLICK_NODE: {
- Point2 new_pos = anim_tree->node_get_position(click_node) + (click_motion - click_pos);
- if (new_pos.x < 5)
- new_pos.x = 5;
- if (new_pos.y < 5)
- new_pos.y = 5;
- anim_tree->node_set_position(click_node, new_pos);
-
- } break;
- default: {
- }
- }
-
- click_type = CLICK_NONE;
- update();
- }
- }
- }
-
- Ref<InputEventMouseMotion> mm = p_event;
-
- if (mm.is_valid()) {
-
- if (mm->get_button_mask() & 1 && click_type != CLICK_NONE) {
-
- click_motion = Point2(mm->get_position().x, mm->get_position().y);
- update();
- }
- if (mm->get_button_mask() & 4 || Input::get_singleton()->is_key_pressed(KEY_SPACE)) {
-
- h_scroll->set_value(h_scroll->get_value() - mm->get_relative().x);
- v_scroll->set_value(v_scroll->get_value() - mm->get_relative().y);
- update();
- }
- }
-}
-
-void AnimationTreePlayerEditor::_draw_cos_line(const Vector2 &p_from, const Vector2 &p_to, const Color &p_color) {
-
- static const int steps = 20;
-
- Rect2 r;
- r.position = p_from;
- r.expand_to(p_to);
- Vector2 sign = Vector2((p_from.x < p_to.x) ? 1 : -1, (p_from.y < p_to.y) ? 1 : -1);
- bool flip = sign.x * sign.y < 0;
-
- Vector2 prev;
- for (int i = 0; i <= steps; i++) {
-
- float d = i / float(steps);
- float c = -Math::cos(d * Math_PI) * 0.5 + 0.5;
- if (flip)
- c = 1.0 - c;
- Vector2 p = r.position + Vector2(d * r.size.width, c * r.size.height);
-
- if (i > 0) {
-
- draw_line(prev, p, p_color, 2);
- }
-
- prev = p;
- }
-}
-
-void AnimationTreePlayerEditor::_notification(int p_what) {
-
- switch (p_what) {
-
- case NOTIFICATION_ENTER_TREE: {
-
- play_button->set_icon(get_icon("Play", "EditorIcons"));
- add_menu->set_icon(get_icon("Add", "EditorIcons"));
- } break;
- case NOTIFICATION_DRAW: {
-
- _update_scrollbars();
- //VisualServer::get_singleton()->canvas_item_add_rect(get_canvas_item(),Rect2(Point2(),get_size()),Color(0,0,0,1));
- get_stylebox("bg", "Tree")->draw(get_canvas_item(), Rect2(Point2(), get_size()));
-
- for (List<StringName>::Element *E = order.front(); E; E = E->next()) {
-
- _draw_node(E->get());
- }
-
- if (click_type == CLICK_INPUT_SLOT || click_type == CLICK_OUTPUT_SLOT) {
-
- _draw_cos_line(click_pos, click_motion, Color(0.5, 1, 0.5, 0.8));
- }
-
- List<AnimationTreePlayer::Connection> connections;
- anim_tree->get_connection_list(&connections);
-
- for (List<AnimationTreePlayer::Connection>::Element *E = connections.front(); E; E = E->next()) {
-
- const AnimationTreePlayer::Connection &c = E->get();
- Point2 source = _get_slot_pos(c.src_node, false, 0);
- Point2 dest = _get_slot_pos(c.dst_node, true, c.dst_input);
- Color col = Color(1, 1, 0.5, 0.8);
- /*
- if (click_type==CLICK_NODE && click_node==c.src_node) {
-
- source+=click_motion-click_pos;
- }
-
- if (click_type==CLICK_NODE && click_node==c.dst_node) {
-
- dest+=click_motion-click_pos;
- }*/
-
- _draw_cos_line(source, dest, col);
- }
-
- const Ref<Font> f = get_font("font", "Label");
- const Point2 status_offset = Point2(5, 25) * EDSCALE + Point2(0, f->get_ascent());
-
- switch (anim_tree->get_last_error()) {
-
- case AnimationTreePlayer::CONNECT_OK: {
-
- f->draw(get_canvas_item(), status_offset, TTR("Animation tree is valid."), Color(0, 1, 0.6, 0.8));
- } break;
- default: {
-
- f->draw(get_canvas_item(), status_offset, TTR("Animation tree is invalid."), Color(1, 0.6, 0.0, 0.8));
- } break;
- }
-
- } break;
- }
-}
-
-void AnimationTreePlayerEditor::_update_scrollbars() {
-
- Size2 size = get_size();
- Size2 hmin = h_scroll->get_combined_minimum_size();
- Size2 vmin = v_scroll->get_combined_minimum_size();
-
- v_scroll->set_begin(Point2(size.width - vmin.width, 0));
- v_scroll->set_end(Point2(size.width, size.height));
-
- h_scroll->set_begin(Point2(0, size.height - hmin.height));
- h_scroll->set_end(Point2(size.width - vmin.width, size.height));
-
- Size2 min = _get_maximum_size();
-
- if (min.height < size.height - hmin.height) {
-
- v_scroll->hide();
- offset.y = 0;
- } else {
-
- v_scroll->show();
- v_scroll->set_max(min.height);
- v_scroll->set_page(size.height - hmin.height);
- offset.y = v_scroll->get_value();
- }
-
- if (min.width < size.width - vmin.width) {
-
- h_scroll->hide();
- offset.x = 0;
- } else {
-
- h_scroll->show();
- h_scroll->set_max(min.width);
- h_scroll->set_page(size.width - vmin.width);
- offset.x = h_scroll->get_value();
- }
-}
-
-void AnimationTreePlayerEditor::_scroll_moved(float) {
-
- offset.x = h_scroll->get_value();
- offset.y = v_scroll->get_value();
- update();
-}
-
-void AnimationTreePlayerEditor::_node_menu_item(int p_item) {
-
- switch (p_item) {
-
- case NODE_DISCONNECT: {
-
- if (rclick_type == CLICK_INPUT_SLOT) {
-
- anim_tree->disconnect_nodes(rclick_node, rclick_slot);
- update();
- }
-
- if (rclick_type == CLICK_OUTPUT_SLOT) {
-
- List<AnimationTreePlayer::Connection> connections;
- anim_tree->get_connection_list(&connections);
-
- for (List<AnimationTreePlayer::Connection>::Element *E = connections.front(); E; E = E->next()) {
-
- const AnimationTreePlayer::Connection &c = E->get();
- if (c.dst_node == rclick_node) {
-
- anim_tree->disconnect_nodes(c.dst_node, c.dst_input);
- }
- }
- update();
- }
-
- } break;
- case NODE_RENAME: {
-
- renaming_edit = true;
- edited_node = rclick_node;
- _popup_edit_dialog();
-
- } break;
- case NODE_ADD_INPUT: {
-
- anim_tree->transition_node_set_input_count(rclick_node, anim_tree->transition_node_get_input_count(rclick_node) + 1);
- update();
- } break;
- case NODE_DELETE_INPUT: {
-
- anim_tree->transition_node_delete_input(rclick_node, rclick_slot);
- update();
- } break;
- case NODE_SET_AUTOADVANCE: {
-
- anim_tree->transition_node_set_input_auto_advance(rclick_node, rclick_slot, true);
- update();
-
- } break;
- case NODE_CLEAR_AUTOADVANCE: {
-
- anim_tree->transition_node_set_input_auto_advance(rclick_node, rclick_slot, false);
- update();
-
- } break;
-
- case NODE_ERASE: {
-
- if (rclick_node == "out")
- break;
- order.erase(rclick_node);
- anim_tree->remove_node(rclick_node);
- update();
- } break;
- }
-}
-
-StringName AnimationTreePlayerEditor::_add_node(int p_item) {
-
- static const char *bname[] = {
- "out",
- "anim",
- "oneshot",
- "mix",
- "blend2",
- "blend3",
- "blend4",
- "scale",
- "seek",
- "transition"
- };
-
- String name;
- int idx = 1;
-
- while (true) {
-
- name = bname[p_item];
- if (idx > 1)
- name += " " + itos(idx);
- if (anim_tree->node_exists(name))
- idx++;
- else
- break;
- }
-
- anim_tree->add_node((AnimationTreePlayer::NodeType)p_item, name);
- anim_tree->node_set_position(name, Point2(last_x, last_y));
- order.push_back(name);
- last_x += 10;
- last_y += 10;
- last_x = last_x % (int)get_size().width;
- last_y = last_y % (int)get_size().height;
- update();
-
- return name;
-};
-
-void AnimationTreePlayerEditor::_file_dialog_selected(String p_path) {
-
- switch (file_op) {
-
- case MENU_IMPORT_ANIMATIONS: {
- Vector<String> files = file_dialog->get_selected_files();
-
- for (int i = 0; i < files.size(); i++) {
-
- StringName node = _add_node(AnimationTreePlayer::NODE_ANIMATION);
-
- RES anim = ResourceLoader::load(files[i]);
- anim_tree->animation_node_set_animation(node, anim);
- //anim_tree->node_set_name(node, files[i].get_file());
- };
- } break;
-
- default:
- break;
- };
-};
-
-void AnimationTreePlayerEditor::_add_menu_item(int p_item) {
-
- if (p_item == MENU_GRAPH_CLEAR) {
-
- //clear
- } else if (p_item == MENU_IMPORT_ANIMATIONS) {
-
- file_op = MENU_IMPORT_ANIMATIONS;
- file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- file_dialog->popup_centered_ratio();
-
- } else {
-
- _add_node(p_item);
- }
-}
-
-Size2 AnimationTreePlayerEditor::get_minimum_size() const {
-
- return Size2(10, 200);
-}
-
-void AnimationTreePlayerEditor::_find_paths_for_filter(const StringName &p_node, Set<String> &paths) {
-
- ERR_FAIL_COND(!anim_tree->node_exists(p_node));
-
- for (int i = 0; i < anim_tree->node_get_input_count(p_node); i++) {
-
- StringName port = anim_tree->node_get_input_source(p_node, i);
- if (port == StringName())
- continue;
- _find_paths_for_filter(port, paths);
- }
-
- if (anim_tree->node_get_type(p_node) == AnimationTreePlayer::NODE_ANIMATION) {
-
- Ref<Animation> anim = anim_tree->animation_node_get_animation(p_node);
- if (anim.is_valid()) {
-
- for (int i = 0; i < anim->get_track_count(); i++) {
- paths.insert(anim->track_get_path(i));
- }
- }
- }
-}
-
-void AnimationTreePlayerEditor::_filter_edited() {
-
- TreeItem *ed = filter->get_edited();
- if (!ed)
- return;
-
- if (anim_tree->node_get_type(edited_node) == AnimationTreePlayer::NODE_ONESHOT) {
- anim_tree->oneshot_node_set_filter_path(edited_node, ed->get_metadata(0), ed->is_checked(0));
- } else if (anim_tree->node_get_type(edited_node) == AnimationTreePlayer::NODE_BLEND2) {
- anim_tree->blend2_node_set_filter_path(edited_node, ed->get_metadata(0), ed->is_checked(0));
- } else if (anim_tree->node_get_type(edited_node) == AnimationTreePlayer::NODE_ANIMATION) {
- anim_tree->animation_node_set_filter_path(edited_node, ed->get_metadata(0), ed->is_checked(0));
- }
-}
-
-void AnimationTreePlayerEditor::_edit_filters() {
-
- filter_dialog->popup_centered_ratio();
- filter->clear();
-
- Set<String> npb;
- _find_paths_for_filter(edited_node, npb);
-
- TreeItem *root = filter->create_item();
- filter->set_hide_root(true);
- Map<String, TreeItem *> pm;
-
- Node *base = anim_tree->get_node(anim_tree->get_base_path());
-
- for (Set<String>::Element *E = npb.front(); E; E = E->next()) {
-
- TreeItem *parent = root;
- String descr = E->get();
- if (base) {
- NodePath np = E->get();
-
- if (np.get_subname_count() == 1) {
- Node *n = base->get_node(np);
- Skeleton *s = Object::cast_to<Skeleton>(n);
- if (s) {
-
- String skelbase = E->get().substr(0, E->get().find(":"));
-
- int bidx = s->find_bone(np.get_subname(0));
-
- if (bidx != -1) {
- int bparent = s->get_bone_parent(bidx);
- //
- if (bparent != -1) {
-
- String bpn = skelbase + ":" + s->get_bone_name(bparent);
- if (pm.has(bpn)) {
- parent = pm[bpn];
- descr = np.get_subname(0);
- }
- } else {
-
- if (pm.has(skelbase)) {
- parent = pm[skelbase];
- }
- }
- }
- }
- }
- }
-
- TreeItem *it = filter->create_item(parent);
- it->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
- it->set_text(0, descr);
- it->set_metadata(0, NodePath(E->get()));
- it->set_editable(0, true);
- if (anim_tree->node_get_type(edited_node) == AnimationTreePlayer::NODE_ONESHOT) {
- it->set_checked(0, anim_tree->oneshot_node_is_path_filtered(edited_node, E->get()));
- } else if (anim_tree->node_get_type(edited_node) == AnimationTreePlayer::NODE_BLEND2) {
- it->set_checked(0, anim_tree->blend2_node_is_path_filtered(edited_node, E->get()));
- } else if (anim_tree->node_get_type(edited_node) == AnimationTreePlayer::NODE_ANIMATION) {
- it->set_checked(0, anim_tree->animation_node_is_path_filtered(edited_node, E->get()));
- }
- pm[E->get()] = it;
- }
-}
-
-void AnimationTreePlayerEditor::_bind_methods() {
-
- ClassDB::bind_method("_add_menu_item", &AnimationTreePlayerEditor::_add_menu_item);
- ClassDB::bind_method("_node_menu_item", &AnimationTreePlayerEditor::_node_menu_item);
- ClassDB::bind_method("_gui_input", &AnimationTreePlayerEditor::_gui_input);
- //ClassDB::bind_method( "_node_param_changed", &AnimationTreeEditor::_node_param_changed );
- ClassDB::bind_method("_scroll_moved", &AnimationTreePlayerEditor::_scroll_moved);
- ClassDB::bind_method("_edit_dialog_changeds", &AnimationTreePlayerEditor::_edit_dialog_changeds);
- ClassDB::bind_method("_edit_dialog_changede", &AnimationTreePlayerEditor::_edit_dialog_changede);
- ClassDB::bind_method("_edit_dialog_changedf", &AnimationTreePlayerEditor::_edit_dialog_changedf);
- ClassDB::bind_method("_edit_dialog_changed", &AnimationTreePlayerEditor::_edit_dialog_changed);
- ClassDB::bind_method("_edit_dialog_animation_changed", &AnimationTreePlayerEditor::_edit_dialog_animation_changed);
- ClassDB::bind_method("_edit_dialog_edit_animation", &AnimationTreePlayerEditor::_edit_dialog_edit_animation);
- ClassDB::bind_method("_play_toggled", &AnimationTreePlayerEditor::_play_toggled);
- ClassDB::bind_method("_edit_oneshot_start", &AnimationTreePlayerEditor::_edit_oneshot_start);
- ClassDB::bind_method("_file_dialog_selected", &AnimationTreePlayerEditor::_file_dialog_selected);
- ClassDB::bind_method("_master_anim_menu_item", &AnimationTreePlayerEditor::_master_anim_menu_item);
- ClassDB::bind_method("_edit_filters", &AnimationTreePlayerEditor::_edit_filters);
- ClassDB::bind_method("_filter_edited", &AnimationTreePlayerEditor::_filter_edited);
-}
-
-AnimationTreePlayerEditor::AnimationTreePlayerEditor() {
-
- set_focus_mode(FOCUS_ALL);
-
- PopupMenu *p;
- List<PropertyInfo> defaults;
-
- add_menu = memnew(MenuButton);
- //add_menu->set_
- add_menu->set_position(Point2(0, 0));
- add_menu->set_size(Point2(25, 15));
- add_child(add_menu);
-
- p = add_menu->get_popup();
- p->add_item(TTR("Animation Node"), AnimationTreePlayer::NODE_ANIMATION);
- p->add_item(TTR("OneShot Node"), AnimationTreePlayer::NODE_ONESHOT);
- p->add_item(TTR("Mix Node"), AnimationTreePlayer::NODE_MIX);
- p->add_item(TTR("Blend2 Node"), AnimationTreePlayer::NODE_BLEND2);
- p->add_item(TTR("Blend3 Node"), AnimationTreePlayer::NODE_BLEND3);
- p->add_item(TTR("Blend4 Node"), AnimationTreePlayer::NODE_BLEND4);
- p->add_item(TTR("TimeScale Node"), AnimationTreePlayer::NODE_TIMESCALE);
- p->add_item(TTR("TimeSeek Node"), AnimationTreePlayer::NODE_TIMESEEK);
- p->add_item(TTR("Transition Node"), AnimationTreePlayer::NODE_TRANSITION);
- p->add_separator();
- p->add_item(TTR("Import Animations..."), MENU_IMPORT_ANIMATIONS); // wtf
- p->add_separator();
- p->add_item(TTR("Clear"), MENU_GRAPH_CLEAR);
-
- p->connect("id_pressed", this, "_add_menu_item");
-
- play_button = memnew(Button);
- play_button->set_position(Point2(25, 0) * EDSCALE);
- play_button->set_size(Point2(25, 15));
- add_child(play_button);
- play_button->set_toggle_mode(true);
- play_button->connect("pressed", this, "_play_toggled");
-
- last_x = 50;
- last_y = 50;
-
- property_editor = memnew(CustomPropertyEditor);
- add_child(property_editor);
- property_editor->connect("variant_changed", this, "_edit_dialog_animation_changed");
- property_editor->connect("resource_edit_request", this, "_edit_dialog_edit_animation");
-
- h_scroll = memnew(HScrollBar);
- v_scroll = memnew(VScrollBar);
-
- add_child(h_scroll);
- add_child(v_scroll);
-
- h_scroll->connect("value_changed", this, "_scroll_moved");
- v_scroll->connect("value_changed", this, "_scroll_moved");
-
- node_popup = memnew(PopupMenu);
- add_child(node_popup);
- node_popup->set_as_toplevel(true);
-
- master_anim_popup = memnew(PopupMenu);
- add_child(master_anim_popup);
- master_anim_popup->connect("id_pressed", this, "_master_anim_menu_item");
-
- node_popup->connect("id_pressed", this, "_node_menu_item");
-
- updating_edit = false;
-
- edit_dialog = memnew(PopupPanel);
- //edit_dialog->get_ok()->hide();
- //edit_dialog->get_cancel()->hide();
- add_child(edit_dialog);
-
- edit_option = memnew(OptionButton);
- edit_option->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- edit_option->set_margin(MARGIN_RIGHT, -10);
- edit_dialog->add_child(edit_option);
- edit_option->connect("item_selected", this, "_edit_dialog_changedf");
- edit_option->hide();
-
- for (int i = 0; i < 2; i++) {
- edit_scroll[i] = memnew(HSlider);
- edit_scroll[i]->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- edit_scroll[i]->set_margin(MARGIN_RIGHT, -10);
- edit_dialog->add_child(edit_scroll[i]);
- edit_scroll[i]->hide();
- edit_scroll[i]->connect("value_changed", this, "_edit_dialog_changedf");
- }
- for (int i = 0; i < 4; i++) {
- edit_line[i] = memnew(LineEdit);
- edit_line[i]->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- edit_line[i]->set_margin(MARGIN_RIGHT, -10);
- edit_dialog->add_child(edit_line[i]);
- edit_line[i]->hide();
- edit_line[i]->connect("text_changed", this, "_edit_dialog_changeds");
- edit_line[i]->connect("text_entered", this, "_edit_dialog_changede");
- edit_label[i] = memnew(Label);
- edit_dialog->add_child(edit_label[i]);
- edit_label[i]->hide();
- }
-
- edit_button = memnew(Button);
- edit_button->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- edit_button->set_margin(MARGIN_RIGHT, -10);
- edit_dialog->add_child(edit_button);
- edit_button->hide();
- edit_button->connect("pressed", this, "_edit_oneshot_start");
-
- edit_check = memnew(CheckButton);
- edit_check->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- edit_check->set_margin(MARGIN_RIGHT, -10);
- edit_dialog->add_child(edit_check);
- edit_check->hide();
- edit_check->connect("pressed", this, "_edit_dialog_changed");
-
- file_dialog = memnew(EditorFileDialog);
- file_dialog->set_enable_multiple_selection(true);
- file_dialog->set_current_dir(ProjectSettings::get_singleton()->get_resource_path());
- add_child(file_dialog);
- file_dialog->connect("file_selected", this, "_file_dialog_selected");
-
- filter_dialog = memnew(AcceptDialog);
- filter_dialog->set_title(TTR("Edit Node Filters"));
- add_child(filter_dialog);
-
- filter = memnew(Tree);
- filter_dialog->add_child(filter);
- //filter_dialog->set_child_rect(filter);
- filter->connect("item_edited", this, "_filter_edited");
-
- filter_button = memnew(Button);
- filter_button->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- filter_button->set_margin(MARGIN_RIGHT, -10);
- edit_dialog->add_child(filter_button);
- filter_button->hide();
- filter_button->set_text(TTR("Filters..."));
- filter_button->connect("pressed", this, "_edit_filters");
-
- set_clip_contents(true);
-}
-
-void AnimationTreePlayerEditorPlugin::edit(Object *p_object) {
-
- anim_tree_editor->edit(Object::cast_to<AnimationTreePlayer>(p_object));
-}
-
-bool AnimationTreePlayerEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("AnimationTreePlayer");
-}
-
-void AnimationTreePlayerEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- //editor->hide_animation_player_editors();
- //editor->animation_panel_make_visible(true);
- button->show();
- editor->make_bottom_panel_item_visible(anim_tree_editor);
- anim_tree_editor->set_physics_process(true);
- } else {
-
- if (anim_tree_editor->is_visible_in_tree())
- editor->hide_bottom_panel();
- button->hide();
- anim_tree_editor->set_physics_process(false);
- }
-}
-
-AnimationTreePlayerEditorPlugin::AnimationTreePlayerEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- anim_tree_editor = memnew(AnimationTreePlayerEditor);
- anim_tree_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE);
-
- button = editor->add_bottom_panel_item(TTR("AnimationTree"), anim_tree_editor);
- button->hide();
-}
-
-AnimationTreePlayerEditorPlugin::~AnimationTreePlayerEditorPlugin() {
-}
diff --git a/editor/plugins/animation_tree_player_editor_plugin.h b/editor/plugins/animation_tree_player_editor_plugin.h
deleted file mode 100644
index d3fd6ae362..0000000000
--- a/editor/plugins/animation_tree_player_editor_plugin.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*************************************************************************/
-/* animation_tree_player_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef ANIMATION_TREE_PLAYER_EDITOR_PLUGIN_H
-#define ANIMATION_TREE_PLAYER_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "editor/property_editor.h"
-#include "scene/animation/animation_tree_player.h"
-#include "scene/gui/button.h"
-#include "scene/gui/popup.h"
-#include "scene/gui/tree.h"
-
-class AnimationTreePlayerEditor : public Control {
-
- GDCLASS(AnimationTreePlayerEditor, Control);
-
- static const char *_node_type_names[];
-
- enum ClickType {
- CLICK_NONE,
- CLICK_NAME,
- CLICK_NODE,
- CLICK_INPUT_SLOT,
- CLICK_OUTPUT_SLOT,
- CLICK_PARAMETER
- };
-
- enum {
-
- MENU_GRAPH_CLEAR = 100,
- MENU_IMPORT_ANIMATIONS = 101,
- NODE_DISCONNECT,
- NODE_RENAME,
- NODE_ERASE,
- NODE_ADD_INPUT,
- NODE_DELETE_INPUT,
- NODE_SET_AUTOADVANCE,
- NODE_CLEAR_AUTOADVANCE
- };
-
- bool renaming_edit;
- StringName edited_node;
- bool updating_edit;
- Popup *edit_dialog;
- HSlider *edit_scroll[2];
- LineEdit *edit_line[4];
- OptionButton *edit_option;
- Label *edit_label[4];
- Button *edit_button;
- Button *filter_button;
- CheckButton *edit_check;
- EditorFileDialog *file_dialog;
- int file_op;
-
- void _popup_edit_dialog();
-
- void _setup_edit_dialog(const StringName &p_node);
- PopupMenu *master_anim_popup;
- PopupMenu *node_popup;
- PopupMenu *add_popup;
- HScrollBar *h_scroll;
- VScrollBar *v_scroll;
- MenuButton *add_menu;
-
- CustomPropertyEditor *property_editor;
-
- AnimationTreePlayer *anim_tree;
- List<StringName> order;
- Set<StringName> active_nodes;
-
- int last_x, last_y;
-
- Point2 offset;
- ClickType click_type;
- Point2 click_pos;
- StringName click_node;
- int click_slot;
- Point2 click_motion;
- ClickType rclick_type;
- StringName rclick_node;
- int rclick_slot;
-
- Button *play_button;
-
- Size2 _get_maximum_size();
- Size2 get_node_size(const StringName &p_node) const;
- void _draw_node(const StringName &p_node);
-
- AcceptDialog *filter_dialog;
- Tree *filter;
-
- void _draw_cos_line(const Vector2 &p_from, const Vector2 &p_to, const Color &p_color);
- void _update_scrollbars();
- void _scroll_moved(float);
- void _play_toggled();
- /*
- void _node_param_changed();
- void _node_add_callback();
- void _node_add(VisualServer::AnimationTreeNodeType p_type);
- void _node_edit_property(const StringName& p_node);
-*/
-
- void _master_anim_menu_item(int p_item);
- void _node_menu_item(int p_item);
- void _add_menu_item(int p_item);
-
- void _filter_edited();
- void _find_paths_for_filter(const StringName &p_node, Set<String> &paths);
- void _edit_filters();
-
- void _edit_oneshot_start();
- void _edit_dialog_animation_changed();
- void _edit_dialog_edit_animation();
- void _edit_dialog_changeds(String);
- void _edit_dialog_changede(String);
- void _edit_dialog_changedf(float);
- void _edit_dialog_changed();
- void _dialog_changed() const;
- ClickType _locate_click(const Point2 &p_click, StringName *p_node_id, int *p_slot_index) const;
- Point2 _get_slot_pos(const StringName &p_node_id, bool p_input, int p_slot);
-
- StringName _add_node(int p_item);
- void _file_dialog_selected(String p_path);
-
-protected:
- void _notification(int p_what);
- void _gui_input(Ref<InputEvent> p_event);
- static void _bind_methods();
-
-public:
- virtual Size2 get_minimum_size() const;
- void edit(AnimationTreePlayer *p_anim_tree);
- AnimationTreePlayerEditor();
-};
-
-class AnimationTreePlayerEditorPlugin : public EditorPlugin {
-
- GDCLASS(AnimationTreePlayerEditorPlugin, EditorPlugin);
-
- AnimationTreePlayerEditor *anim_tree_editor;
- EditorNode *editor;
- Button *button;
-
-public:
- virtual String get_name() const { return "AnimTree"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- AnimationTreePlayerEditorPlugin(EditorNode *p_node);
- ~AnimationTreePlayerEditorPlugin();
-};
-
-#endif // ANIMATION_TREE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp
index 4f73a5eaea..28ac85457b 100644
--- a/editor/plugins/asset_library_editor_plugin.cpp
+++ b/editor/plugins/asset_library_editor_plugin.cpp
@@ -30,7 +30,9 @@
#include "asset_library_editor_plugin.h"
+#include "core/input/input.h"
#include "core/io/json.h"
+#include "core/os/keyboard.h"
#include "core/version.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
@@ -38,7 +40,6 @@
#include "editor/project_settings_editor.h"
void EditorAssetLibraryItem::configure(const String &p_title, int p_asset_id, const String &p_category, int p_category_id, const String &p_author, int p_author_id, const String &p_cost) {
-
title->set_text(p_title);
asset_id = p_asset_id;
category->set_text(p_category);
@@ -48,8 +49,7 @@ void EditorAssetLibraryItem::configure(const String &p_title, int p_asset_id, co
price->set_text(p_cost);
}
-void EditorAssetLibraryItem::set_image(int p_type, int p_index, const Ref<Texture> &p_image) {
-
+void EditorAssetLibraryItem::set_image(int p_type, int p_index, const Ref<Texture2D> &p_image) {
ERR_FAIL_COND(p_type != EditorAssetLibrary::IMAGE_QUEUE_ICON);
ERR_FAIL_COND(p_index != 0);
@@ -57,118 +57,102 @@ void EditorAssetLibraryItem::set_image(int p_type, int p_index, const Ref<Textur
}
void EditorAssetLibraryItem::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
-
- icon->set_normal_texture(get_icon("ProjectIconLoading", "EditorIcons"));
- category->add_color_override("font_color", Color(0.5, 0.5, 0.5));
- author->add_color_override("font_color", Color(0.5, 0.5, 0.5));
- price->add_color_override("font_color", Color(0.5, 0.5, 0.5));
+ icon->set_normal_texture(get_theme_icon("ProjectIconLoading", "EditorIcons"));
+ category->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5));
+ author->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5));
+ price->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5));
}
}
void EditorAssetLibraryItem::_asset_clicked() {
-
emit_signal("asset_selected", asset_id);
}
void EditorAssetLibraryItem::_category_clicked() {
-
emit_signal("category_selected", category_id);
}
-void EditorAssetLibraryItem::_author_clicked() {
+void EditorAssetLibraryItem::_author_clicked() {
emit_signal("author_selected", author_id);
}
void EditorAssetLibraryItem::_bind_methods() {
-
ClassDB::bind_method("set_image", &EditorAssetLibraryItem::set_image);
- ClassDB::bind_method("_asset_clicked", &EditorAssetLibraryItem::_asset_clicked);
- ClassDB::bind_method("_category_clicked", &EditorAssetLibraryItem::_category_clicked);
- ClassDB::bind_method("_author_clicked", &EditorAssetLibraryItem::_author_clicked);
ADD_SIGNAL(MethodInfo("asset_selected"));
ADD_SIGNAL(MethodInfo("category_selected"));
ADD_SIGNAL(MethodInfo("author_selected"));
}
EditorAssetLibraryItem::EditorAssetLibraryItem() {
-
Ref<StyleBoxEmpty> border;
border.instance();
border->set_default_margin(MARGIN_LEFT, 5 * EDSCALE);
border->set_default_margin(MARGIN_RIGHT, 5 * EDSCALE);
border->set_default_margin(MARGIN_BOTTOM, 5 * EDSCALE);
border->set_default_margin(MARGIN_TOP, 5 * EDSCALE);
- add_style_override("panel", border);
+ add_theme_style_override("panel", border);
HBoxContainer *hb = memnew(HBoxContainer);
// Add some spacing to visually separate the icon from the asset details.
- hb->add_constant_override("separation", 15 * EDSCALE);
+ hb->add_theme_constant_override("separation", 15 * EDSCALE);
add_child(hb);
icon = memnew(TextureButton);
icon->set_custom_minimum_size(Size2(64, 64) * EDSCALE);
icon->set_default_cursor_shape(CURSOR_POINTING_HAND);
- icon->connect("pressed", this, "_asset_clicked");
+ icon->connect("pressed", callable_mp(this, &EditorAssetLibraryItem::_asset_clicked));
hb->add_child(icon);
VBoxContainer *vb = memnew(VBoxContainer);
hb->add_child(vb);
- vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
title = memnew(LinkButton);
title->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
- title->connect("pressed", this, "_asset_clicked");
+ title->connect("pressed", callable_mp(this, &EditorAssetLibraryItem::_asset_clicked));
vb->add_child(title);
category = memnew(LinkButton);
category->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
- category->connect("pressed", this, "_category_clicked");
+ category->connect("pressed", callable_mp(this, &EditorAssetLibraryItem::_category_clicked));
vb->add_child(category);
author = memnew(LinkButton);
author->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER);
- author->connect("pressed", this, "_author_clicked");
+ author->connect("pressed", callable_mp(this, &EditorAssetLibraryItem::_author_clicked));
vb->add_child(author);
price = memnew(Label);
vb->add_child(price);
set_custom_minimum_size(Size2(250, 100) * EDSCALE);
- set_h_size_flags(SIZE_EXPAND_FILL);
-
- set_mouse_filter(MOUSE_FILTER_PASS);
+ set_h_size_flags(Control::SIZE_EXPAND_FILL);
}
//////////////////////////////////////////////////////////////////////////////
-void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const Ref<Texture> &p_image) {
-
+void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const Ref<Texture2D> &p_image) {
switch (p_type) {
-
case EditorAssetLibrary::IMAGE_QUEUE_ICON: {
-
item->call("set_image", p_type, p_index, p_image);
icon = p_image;
} break;
case EditorAssetLibrary::IMAGE_QUEUE_THUMBNAIL: {
-
for (int i = 0; i < preview_images.size(); i++) {
if (preview_images[i].id == p_index) {
if (preview_images[i].is_video) {
- Ref<Image> overlay = get_icon("PlayOverlay", "EditorIcons")->get_data();
+ Ref<Image> overlay = previews->get_theme_icon("PlayOverlay", "EditorIcons")->get_data();
Ref<Image> thumbnail = p_image->get_data();
thumbnail = thumbnail->duplicate();
Point2 overlay_pos = Point2((thumbnail->get_width() - overlay->get_width()) / 2, (thumbnail->get_height() - overlay->get_height()) / 2);
// Overlay and thumbnail need the same format for `blend_rect` to work.
thumbnail->convert(Image::FORMAT_RGBA8);
- thumbnail->lock();
+
thumbnail->blend_rect(overlay, overlay->get_used_rect(), overlay_pos);
- thumbnail->unlock();
Ref<ImageTexture> tex;
tex.instance();
@@ -176,7 +160,7 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const
preview_images[i].button->set_icon(tex);
// Make it clearer that clicking it will open an external link
- preview_images[i].button->set_default_cursor_shape(CURSOR_POINTING_HAND);
+ preview_images[i].button->set_default_cursor_shape(Control::CURSOR_POINTING_HAND);
} else {
preview_images[i].button->set_icon(p_image);
}
@@ -185,7 +169,6 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const
}
} break;
case EditorAssetLibrary::IMAGE_QUEUE_SCREENSHOT: {
-
for (int i = 0; i < preview_images.size(); i++) {
if (preview_images[i].id == p_index) {
preview_images.write[i].image = p_image;
@@ -202,15 +185,13 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const
void EditorAssetLibraryItemDescription::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- previews_bg->add_style_override("panel", get_stylebox("normal", "TextEdit"));
+ previews_bg->add_theme_style_override("panel", previews->get_theme_stylebox("normal", "TextEdit"));
} break;
}
}
void EditorAssetLibraryItemDescription::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_image"), &EditorAssetLibraryItemDescription::set_image);
- ClassDB::bind_method(D_METHOD("_link_click"), &EditorAssetLibraryItemDescription::_link_click);
- ClassDB::bind_method(D_METHOD("_preview_click"), &EditorAssetLibraryItemDescription::_preview_click);
}
void EditorAssetLibraryItemDescription::_link_click(const String &p_url) {
@@ -225,7 +206,7 @@ void EditorAssetLibraryItemDescription::_preview_click(int p_id) {
if (!preview_images[i].is_video) {
if (preview_images[i].image.is_valid()) {
preview->set_texture(preview_images[i].image);
- minimum_size_changed();
+ child_controls_changed();
}
} else {
_link_click(preview_images[i].video_link);
@@ -237,7 +218,6 @@ void EditorAssetLibraryItemDescription::_preview_click(int p_id) {
}
void EditorAssetLibraryItemDescription::configure(const String &p_title, int p_asset_id, const String &p_category, int p_category_id, const String &p_author, int p_author_id, const String &p_cost, int p_version, const String &p_version_string, const String &p_description, const String &p_download_url, const String &p_browse_url, const String &p_sha256_hash) {
-
asset_id = p_asset_id;
title = p_title;
download_url = p_download_url;
@@ -255,19 +235,18 @@ void EditorAssetLibraryItemDescription::configure(const String &p_title, int p_a
}
void EditorAssetLibraryItemDescription::add_preview(int p_id, bool p_video, const String &p_url) {
-
Preview preview;
preview.id = p_id;
preview.video_link = p_url;
preview.is_video = p_video;
preview.button = memnew(Button);
preview.button->set_flat(true);
- preview.button->set_icon(get_icon("ThumbnailWait", "EditorIcons"));
+ preview.button->set_icon(previews->get_theme_icon("ThumbnailWait", "EditorIcons"));
preview.button->set_toggle_mode(true);
- preview.button->connect("pressed", this, "_preview_click", varray(p_id));
+ preview.button->connect("pressed", callable_mp(this, &EditorAssetLibraryItemDescription::_preview_click), varray(p_id));
preview_hb->add_child(preview.button);
if (!p_video) {
- preview.image = get_icon("ThumbnailWait", "EditorIcons");
+ preview.image = previews->get_theme_icon("ThumbnailWait", "EditorIcons");
}
preview_images.push_back(preview);
if (preview_images.size() == 1 && !p_video) {
@@ -276,12 +255,11 @@ void EditorAssetLibraryItemDescription::add_preview(int p_id, bool p_video, cons
}
EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() {
-
HBoxContainer *hbox = memnew(HBoxContainer);
add_child(hbox);
VBoxContainer *desc_vbox = memnew(VBoxContainer);
hbox->add_child(desc_vbox);
- hbox->add_constant_override("separation", 15 * EDSCALE);
+ hbox->add_theme_constant_override("separation", 15 * EDSCALE);
item = memnew(EditorAssetLibraryItem);
@@ -290,14 +268,14 @@ EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() {
description = memnew(RichTextLabel);
desc_vbox->add_child(description);
- description->set_v_size_flags(SIZE_EXPAND_FILL);
- description->connect("meta_clicked", this, "_link_click");
- description->add_constant_override("line_separation", Math::round(5 * EDSCALE));
+ description->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ description->connect("meta_clicked", callable_mp(this, &EditorAssetLibraryItemDescription::_link_click));
+ description->add_theme_constant_override("line_separation", Math::round(5 * EDSCALE));
VBoxContainer *previews_vbox = memnew(VBoxContainer);
hbox->add_child(previews_vbox);
- previews_vbox->add_constant_override("separation", 15 * EDSCALE);
- previews_vbox->set_v_size_flags(SIZE_EXPAND_FILL);
+ previews_vbox->add_theme_constant_override("separation", 15 * EDSCALE);
+ previews_vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL);
preview = memnew(TextureRect);
previews_vbox->add_child(preview);
@@ -314,20 +292,19 @@ EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() {
previews->set_enable_v_scroll(false);
previews->set_enable_h_scroll(true);
preview_hb = memnew(HBoxContainer);
- preview_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ preview_hb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
previews->add_child(preview_hb);
get_ok()->set_text(TTR("Download"));
get_cancel()->set_text(TTR("Close"));
}
-///////////////////////////////////////////////////////////////////////////////////
-void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data) {
+///////////////////////////////////////////////////////////////////////////////////
+void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data) {
String error_text;
switch (p_status) {
-
case HTTPRequest::RESULT_CHUNKED_BODY_SIZE_MISMATCH:
case HTTPRequest::RESULT_CONNECTION_ERROR:
case HTTPRequest::RESULT_BODY_SIZE_LIMIT_EXCEEDED: {
@@ -381,7 +358,7 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int
if (error_text != String()) {
download_error->set_text(TTR("Asset Download Error:") + "\n" + error_text);
- download_error->popup_centered_minsize();
+ download_error->popup_centered();
return;
}
@@ -393,30 +370,26 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int
set_process(false);
}
-void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asset_id, const Ref<Texture> &p_preview, const String &p_download_url, const String &p_sha256_hash) {
-
+void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asset_id, const Ref<Texture2D> &p_preview, const String &p_download_url, const String &p_sha256_hash) {
title->set_text(p_title);
icon->set_texture(p_preview);
asset_id = p_asset_id;
- if (!p_preview.is_valid())
- icon->set_texture(get_icon("FileBrokenBigThumb", "EditorIcons"));
+ if (!p_preview.is_valid()) {
+ icon->set_texture(get_theme_icon("FileBrokenBigThumb", "EditorIcons"));
+ }
host = p_download_url;
sha256 = p_sha256_hash;
_make_request();
}
void EditorAssetLibraryItemDownload::_notification(int p_what) {
-
switch (p_what) {
-
// FIXME: The editor crashes if 'NOTICATION_THEME_CHANGED' is used.
case NOTIFICATION_ENTER_TREE: {
-
- add_style_override("panel", get_stylebox("panel", "TabContainer"));
- dismiss->set_normal_texture(get_icon("Close", "EditorIcons"));
+ add_theme_style_override("panel", get_theme_stylebox("panel", "TabContainer"));
+ dismiss->set_normal_texture(get_theme_icon("Close", "EditorIcons"));
} break;
case NOTIFICATION_PROCESS: {
-
// Make the progress bar visible again when retrying the download.
progress->set_modulate(Color(1, 1, 1, 1));
@@ -444,7 +417,6 @@ void EditorAssetLibraryItemDownload::_notification(int p_what) {
if (cstatus != prev_status) {
switch (cstatus) {
-
case HTTPClient::STATUS_RESOLVING: {
status->set_text(TTR("Resolving..."));
progress->set_max(1);
@@ -468,15 +440,14 @@ void EditorAssetLibraryItemDownload::_notification(int p_what) {
} break;
}
}
-void EditorAssetLibraryItemDownload::_close() {
+void EditorAssetLibraryItemDownload::_close() {
// Clean up downloaded file.
DirAccess::remove_file_or_error(download->get_download_file());
queue_delete();
}
void EditorAssetLibraryItemDownload::_install() {
-
String file = download->get_download_file();
if (external_install) {
@@ -500,17 +471,10 @@ void EditorAssetLibraryItemDownload::_make_request() {
}
void EditorAssetLibraryItemDownload::_bind_methods() {
-
- ClassDB::bind_method("_http_download_completed", &EditorAssetLibraryItemDownload::_http_download_completed);
- ClassDB::bind_method("_install", &EditorAssetLibraryItemDownload::_install);
- ClassDB::bind_method("_close", &EditorAssetLibraryItemDownload::_close);
- ClassDB::bind_method("_make_request", &EditorAssetLibraryItemDownload::_make_request);
-
ADD_SIGNAL(MethodInfo("install_asset", PropertyInfo(Variant::STRING, "zip_path"), PropertyInfo(Variant::STRING, "name")));
}
EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
-
HBoxContainer *hb = memnew(HBoxContainer);
add_child(hb);
icon = memnew(TextureRect);
@@ -518,16 +482,16 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
VBoxContainer *vb = memnew(VBoxContainer);
hb->add_child(vb);
- vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
HBoxContainer *title_hb = memnew(HBoxContainer);
vb->add_child(title_hb);
title = memnew(Label);
title_hb->add_child(title);
- title->set_h_size_flags(SIZE_EXPAND_FILL);
+ title->set_h_size_flags(Control::SIZE_EXPAND_FILL);
dismiss = memnew(TextureButton);
- dismiss->connect("pressed", this, "_close");
+ dismiss->connect("pressed", callable_mp(this, &EditorAssetLibraryItemDownload::_close));
title_hb->add_child(dismiss);
title->set_clip_text(true);
@@ -536,7 +500,7 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
status = memnew(Label(TTR("Idle")));
vb->add_child(status);
- status->add_color_override("font_color", Color(0.5, 0.5, 0.5));
+ status->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5));
progress = memnew(ProgressBar);
vb->add_child(progress);
@@ -547,11 +511,11 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
install = memnew(Button);
install->set_text(TTR("Install..."));
install->set_disabled(true);
- install->connect("pressed", this, "_install");
+ install->connect("pressed", callable_mp(this, &EditorAssetLibraryItemDownload::_install));
retry = memnew(Button);
retry->set_text(TTR("Retry"));
- retry->connect("pressed", this, "_make_request");
+ retry->connect("pressed", callable_mp(this, &EditorAssetLibraryItemDownload::_make_request));
hb2->add_child(retry);
hb2->add_child(install);
@@ -559,7 +523,7 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
download = memnew(HTTPRequest);
add_child(download);
- download->connect("request_completed", this, "_http_download_completed");
+ download->connect("request_completed", callable_mp(this, &EditorAssetLibraryItemDownload::_http_download_completed));
download->set_use_threads(EDITOR_DEF("asset_library/use_threads", true));
download_error = memnew(AcceptDialog);
@@ -568,7 +532,7 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
asset_installer = memnew(EditorAssetInstaller);
add_child(asset_installer);
- asset_installer->connect("confirmed", this, "_close");
+ asset_installer->connect("confirmed", callable_mp(this, &EditorAssetLibraryItemDownload::_close));
prev_status = -1;
@@ -577,25 +541,20 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
////////////////////////////////////////////////////////////////////////////////
void EditorAssetLibrary::_notification(int p_what) {
-
switch (p_what) {
-
case NOTIFICATION_READY: {
-
- error_tr->set_texture(get_icon("Error", "EditorIcons"));
- filter->set_right_icon(get_icon("Search", "EditorIcons"));
+ error_tr->set_texture(get_theme_icon("Error", "EditorIcons"));
+ filter->set_right_icon(get_theme_icon("Search", "EditorIcons"));
filter->set_clear_button_enabled(true);
error_label->raise();
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
-
if (is_visible() && initial_loading) {
_repository_changed(0); // Update when shown for the first time.
}
} break;
case NOTIFICATION_PROCESS: {
-
HTTPClient::Status s = request->get_http_client_status();
const bool loading = s != HTTPClient::STATUS_DISCONNECTED;
@@ -612,27 +571,36 @@ void EditorAssetLibrary::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
-
- library_scroll_bg->add_style_override("panel", get_stylebox("bg", "Tree"));
- downloads_scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
- error_tr->set_texture(get_icon("Error", "EditorIcons"));
- filter->set_right_icon(get_icon("Search", "EditorIcons"));
+ library_scroll_bg->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ downloads_scroll->add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
+ error_tr->set_texture(get_theme_icon("Error", "EditorIcons"));
+ filter->set_right_icon(get_theme_icon("Search", "EditorIcons"));
filter->set_clear_button_enabled(true);
} break;
}
}
-void EditorAssetLibrary::_install_asset() {
+void EditorAssetLibrary::_unhandled_input(const Ref<InputEvent> &p_event) {
+ const Ref<InputEventKey> key = p_event;
+
+ if (key.is_valid() && key->is_pressed()) {
+ if (key->get_keycode_with_modifiers() == (KEY_MASK_CMD | KEY_F) && is_visible_in_tree()) {
+ filter->grab_focus();
+ filter->select_all();
+ accept_event();
+ }
+ }
+}
+void EditorAssetLibrary::_install_asset() {
ERR_FAIL_COND(!description);
for (int i = 0; i < downloads_hb->get_child_count(); i++) {
-
EditorAssetLibraryItemDownload *d = Object::cast_to<EditorAssetLibraryItemDownload>(downloads_hb->get_child(i));
if (d && d->get_asset_id() == description->get_asset_id()) {
-
- if (EditorNode::get_singleton() != NULL)
+ if (EditorNode::get_singleton() != nullptr) {
EditorNode::get_singleton()->show_warning(TTR("Download for this asset is already in progress!"));
+ }
return;
}
}
@@ -643,7 +611,7 @@ void EditorAssetLibrary::_install_asset() {
if (templates_only) {
download->set_external_install(true);
- download->connect("install_asset", this, "_install_external_asset");
+ download->connect("install_asset", callable_mp(this, &EditorAssetLibrary::_install_external_asset));
}
}
@@ -672,16 +640,14 @@ const char *EditorAssetLibrary::support_key[SUPPORT_MAX] = {
};
void EditorAssetLibrary::_select_author(int p_id) {
-
// Open author window.
}
void EditorAssetLibrary::_select_category(int p_id) {
-
for (int i = 0; i < categories->get_item_count(); i++) {
-
- if (i == 0)
+ if (i == 0) {
continue;
+ }
int id = categories->get_item_metadata(i);
if (id == p_id) {
categories->select(i);
@@ -690,17 +656,17 @@ void EditorAssetLibrary::_select_category(int p_id) {
}
}
}
-void EditorAssetLibrary::_select_asset(int p_id) {
+void EditorAssetLibrary::_select_asset(int p_id) {
_api_request("asset/" + itos(p_id), REQUESTING_ASSET);
}
-void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByteArray &p_data, int p_queue_id) {
+void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PackedByteArray &p_data, int p_queue_id) {
Object *obj = ObjectDB::get_instance(image_queue[p_queue_id].target);
if (obj) {
bool image_set = false;
- PoolByteArray image_data = p_data;
+ PackedByteArray image_data = p_data;
if (use_cache) {
String cache_filename_base = EditorSettings::get_singleton()->get_cache_dir().plus_file("assetimage_" + image_queue[p_queue_id].image_url.md5_text());
@@ -708,12 +674,12 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt
FileAccess *file = FileAccess::open(cache_filename_base + ".data", FileAccess::READ);
if (file) {
- PoolByteArray cached_data;
+ PackedByteArray cached_data;
int len = file->get_32();
cached_data.resize(len);
- PoolByteArray::Write w = cached_data.write();
- file->get_buffer(w.ptr(), len);
+ uint8_t *w = cached_data.ptrw();
+ file->get_buffer(w, len);
image_data = cached_data;
file->close();
@@ -722,17 +688,17 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt
}
int len = image_data.size();
- PoolByteArray::Read r = image_data.read();
+ const uint8_t *r = image_data.ptr();
Ref<Image> image = Ref<Image>(memnew(Image));
uint8_t png_signature[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
uint8_t jpg_signature[3] = { 255, 216, 255 };
- if (r.ptr()) {
+ if (r) {
if ((memcmp(&r[0], &png_signature[0], 8) == 0) && Image::_png_mem_loader_func) {
- image->copy_internals_from(Image::_png_mem_loader_func(r.ptr(), len));
+ image->copy_internals_from(Image::_png_mem_loader_func(r, len));
} else if ((memcmp(&r[0], &jpg_signature[0], 3) == 0) && Image::_jpg_mem_loader_func) {
- image->copy_internals_from(Image::_jpg_mem_loader_func(r.ptr(), len));
+ image->copy_internals_from(Image::_jpg_mem_loader_func(r, len));
}
}
@@ -770,17 +736,15 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt
}
if (!image_set && final) {
- obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("FileBrokenBigThumb", "EditorIcons"));
+ obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_theme_icon("FileBrokenBigThumb", "EditorIcons"));
}
}
}
-void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data, int p_queue_id) {
-
+void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data, int p_queue_id) {
ERR_FAIL_COND(!image_queue.has(p_queue_id));
if (p_status == HTTPRequest::RESULT_SUCCESS && p_code < HTTPClient::RESPONSE_BAD_REQUEST) {
-
if (p_code != HTTPClient::RESPONSE_NOT_MODIFIED) {
for (int i = 0; i < headers.size(); i++) {
if (headers[i].findn("ETag:") == 0) { // Save etag
@@ -796,11 +760,11 @@ void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, cons
}
int len = p_data.size();
- PoolByteArray::Read r = p_data.read();
+ const uint8_t *r = p_data.ptr();
file = FileAccess::open(cache_filename_base + ".data", FileAccess::WRITE);
if (file) {
file->store_32(len);
- file->store_buffer(r.ptr(), len);
+ file->store_buffer(r, len);
file->close();
memdelete(file);
}
@@ -812,10 +776,10 @@ void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, cons
_image_update(p_code == HTTPClient::RESPONSE_NOT_MODIFIED, true, p_data, p_queue_id);
} else {
- WARN_PRINTS("Error getting image file from URL: " + image_queue[p_queue_id].image_url);
+ WARN_PRINT("Error getting image file from URL: " + image_queue[p_queue_id].image_url);
Object *obj = ObjectDB::get_instance(image_queue[p_queue_id].target);
if (obj) {
- obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("FileBrokenBigThumb", "EditorIcons"));
+ obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_theme_icon("FileBrokenBigThumb", "EditorIcons"));
}
}
@@ -826,14 +790,12 @@ void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, cons
}
void EditorAssetLibrary::_update_image_queue() {
-
const int max_images = 6;
int current_images = 0;
List<int> to_delete;
for (Map<int, ImageQueue>::Element *E = image_queue.front(); E; E = E->next()) {
if (!E->get().active && current_images < max_images) {
-
String cache_filename_base = EditorSettings::get_singleton()->get_cache_dir().plus_file("assetimage_" + E->get().image_url.md5_text());
Vector<String> headers;
@@ -866,7 +828,6 @@ void EditorAssetLibrary::_update_image_queue() {
}
void EditorAssetLibrary::_request_image(ObjectID p_for, String p_image_url, ImageType p_type, int p_image_index) {
-
ImageQueue iq;
iq.image_url = p_image_url;
iq.image_index = p_image_index;
@@ -878,13 +839,13 @@ void EditorAssetLibrary::_request_image(ObjectID p_for, String p_image_url, Imag
iq.queue_id = ++last_queue_id;
iq.active = false;
- iq.request->connect("request_completed", this, "_image_request_completed", varray(iq.queue_id));
+ iq.request->connect("request_completed", callable_mp(this, &EditorAssetLibrary::_image_request_completed), varray(iq.queue_id));
image_queue[iq.queue_id] = iq;
add_child(iq.request);
- _image_update(true, false, PoolByteArray(), iq.queue_id);
+ _image_update(true, false, PackedByteArray(), iq.queue_id);
_update_image_queue();
}
@@ -907,7 +868,6 @@ void EditorAssetLibrary::_rerun_search(int p_ignore) {
}
void EditorAssetLibrary::_search(int p_page) {
-
String args;
if (templates_only) {
@@ -931,7 +891,6 @@ void EditorAssetLibrary::_search(int p_page) {
}
if (categories->get_selected() > 0) {
-
args += "&category=" + itos(categories->get_item_metadata(categories->get_selected()));
}
@@ -952,32 +911,33 @@ void EditorAssetLibrary::_search(int p_page) {
}
void EditorAssetLibrary::_search_text_entered(const String &p_text) {
-
_search();
}
HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int p_page_len, int p_total_items, int p_current_items) {
-
HBoxContainer *hbc = memnew(HBoxContainer);
- if (p_page_count < 2)
+ if (p_page_count < 2) {
return hbc;
+ }
//do the mario
int from = p_page - 5;
- if (from < 0)
+ if (from < 0) {
from = 0;
+ }
int to = from + 10;
- if (to > p_page_count)
+ if (to > p_page_count) {
to = p_page_count;
+ }
hbc->add_spacer();
- hbc->add_constant_override("separation", 5 * EDSCALE);
+ hbc->add_theme_constant_override("separation", 5 * EDSCALE);
Button *first = memnew(Button);
first->set_text(TTR("First"));
if (p_page != 0) {
- first->connect("pressed", this, "_search", varray(0));
+ first->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), varray(0));
} else {
first->set_disabled(true);
first->set_focus_mode(Control::FOCUS_NONE);
@@ -987,7 +947,7 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
Button *prev = memnew(Button);
prev->set_text(TTR("Previous"));
if (p_page > 0) {
- prev->connect("pressed", this, "_search", varray(p_page - 1));
+ prev->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), varray(p_page - 1));
} else {
prev->set_disabled(true);
prev->set_focus_mode(Control::FOCUS_NONE);
@@ -996,9 +956,7 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
hbc->add_child(memnew(VSeparator));
for (int i = from; i < to; i++) {
-
if (i == p_page) {
-
Button *current = memnew(Button);
current->set_text(itos(i + 1));
current->set_disabled(true);
@@ -1006,10 +964,9 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
hbc->add_child(current);
} else {
-
Button *current = memnew(Button);
current->set_text(itos(i + 1));
- current->connect("pressed", this, "_search", varray(i));
+ current->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), varray(i));
hbc->add_child(current);
}
@@ -1018,7 +975,7 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
Button *next = memnew(Button);
next->set_text(TTR("Next"));
if (p_page < p_page_count - 1) {
- next->connect("pressed", this, "_search", varray(p_page + 1));
+ next->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), varray(p_page + 1));
} else {
next->set_disabled(true);
next->set_focus_mode(Control::FOCUS_NONE);
@@ -1029,7 +986,7 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
Button *last = memnew(Button);
last->set_text(TTR("Last"));
if (p_page != p_page_count - 1) {
- last->connect("pressed", this, "_search", varray(p_page_count - 1));
+ last->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), varray(p_page_count - 1));
} else {
last->set_disabled(true);
last->set_focus_mode(Control::FOCUS_NONE);
@@ -1042,7 +999,6 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
}
void EditorAssetLibrary::_api_request(const String &p_request, RequestType p_request_type, const String &p_arguments) {
-
if (requesting != REQUESTING_NONE) {
request->cancel_request();
}
@@ -1053,20 +1009,18 @@ void EditorAssetLibrary::_api_request(const String &p_request, RequestType p_req
request->request(host + "/" + p_request + p_arguments);
}
-void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data) {
-
+void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data) {
String str;
{
int datalen = p_data.size();
- PoolByteArray::Read r = p_data.read();
- str.parse_utf8((const char *)r.ptr(), datalen);
+ const uint8_t *r = p_data.ptr();
+ str.parse_utf8((const char *)r, datalen);
}
bool error_abort = true;
switch (p_status) {
-
case HTTPRequest::RESULT_CANT_RESOLVE: {
error_label->set_text(TTR("Can't resolve hostname:") + " " + host);
} break;
@@ -1093,7 +1047,6 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
if (p_code != 200) {
error_label->set_text(TTR("Request failed, return code:") + " " + itos(p_code));
} else {
-
error_abort = false;
}
} break;
@@ -1118,7 +1071,6 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
switch (requested) {
case REQUESTING_CONFIG: {
-
categories->clear();
categories->add_item(TTR("All"));
categories->set_item_metadata(0, 0);
@@ -1126,8 +1078,9 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
Array clist = d["categories"];
for (int i = 0; i < clist.size(); i++) {
Dictionary cat = clist[i];
- if (!cat.has("name") || !cat.has("id"))
+ if (!cat.has("name") || !cat.has("id")) {
continue;
+ }
String name = cat["name"];
int id = cat["id"];
categories->add_item(name);
@@ -1139,7 +1092,6 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
_search();
} break;
case REQUESTING_SEARCH: {
-
initial_loading = false;
// The loading text only needs to be displayed before the first page is loaded.
@@ -1187,8 +1139,8 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
asset_items = memnew(GridContainer);
asset_items->set_columns(2);
- asset_items->add_constant_override("hseparation", 10 * EDSCALE);
- asset_items->add_constant_override("vseparation", 10 * EDSCALE);
+ asset_items->add_theme_constant_override("hseparation", 10 * EDSCALE);
+ asset_items->add_theme_constant_override("vseparation", 10 * EDSCALE);
library_vb->add_child(asset_items);
@@ -1196,12 +1148,20 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
library_vb->add_child(asset_bottom_page);
if (result.empty()) {
- library_error->set_text(vformat(TTR("No results for \"%s\"."), filter->get_text()));
+ if (filter->get_text() != String()) {
+ library_error->set_text(
+ vformat(TTR("No results for \"%s\"."), filter->get_text()));
+ } else {
+ // No results, even though the user didn't search for anything specific.
+ // This is typically because the version number changed recently
+ // and no assets compatible with the new version have been published yet.
+ library_error->set_text(
+ vformat(TTR("No results compatible with %s %s."), String(VERSION_SHORT_NAME).capitalize(), String(VERSION_BRANCH)));
+ }
library_error->show();
}
for (int i = 0; i < result.size(); i++) {
-
Dictionary r = result[i];
ERR_CONTINUE(!r.has("title"));
@@ -1215,9 +1175,9 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
EditorAssetLibraryItem *item = memnew(EditorAssetLibraryItem);
asset_items->add_child(item);
item->configure(r["title"], r["asset_id"], category_map[r["category_id"]], r["category_id"], r["author"], r["author_id"], r["cost"]);
- item->connect("asset_selected", this, "_select_asset");
- item->connect("author_selected", this, "_select_author");
- item->connect("category_selected", this, "_select_category");
+ item->connect("asset_selected", callable_mp(this, &EditorAssetLibrary::_select_asset));
+ item->connect("author_selected", callable_mp(this, &EditorAssetLibrary::_select_author));
+ item->connect("category_selected", callable_mp(this, &EditorAssetLibrary::_select_category));
if (r.has("icon_url") && r["icon_url"] != "") {
_request_image(item->get_instance_id(), r["icon_url"], IMAGE_QUEUE_ICON, 0);
@@ -1247,8 +1207,8 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
description = memnew(EditorAssetLibraryItemDescription);
add_child(description);
- description->popup_centered_minsize();
- description->connect("confirmed", this, "_install_asset");
+ description->popup_centered();
+ description->connect("confirmed", callable_mp(this, &EditorAssetLibrary::_install_asset));
description->configure(r["title"], r["asset_id"], category_map[r["category_id"]], r["category_id"], r["author"], r["author_id"], r["cost"], r["version"], r["version_string"], r["description"], r["download_url"], r["browse_url"], r["download_hash"]);
@@ -1260,7 +1220,6 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
Array previews = d["previews"];
for (int i = 0; i < previews.size(); i++) {
-
Dictionary p = previews[i];
ERR_CONTINUE(!p.has("type"));
@@ -1284,15 +1243,15 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
}
}
} break;
- default: break;
+ default:
+ break;
}
}
void EditorAssetLibrary::_asset_file_selected(const String &p_file) {
-
if (asset_installer) {
memdelete(asset_installer);
- asset_installer = NULL;
+ asset_installer = nullptr;
}
asset_installer = memnew(EditorAssetInstaller);
@@ -1301,18 +1260,15 @@ void EditorAssetLibrary::_asset_file_selected(const String &p_file) {
}
void EditorAssetLibrary::_asset_open() {
-
- asset_open->popup_centered_ratio();
+ asset_open->popup_file_dialog();
}
void EditorAssetLibrary::_manage_plugins() {
-
ProjectSettingsEditor::get_singleton()->popup_project_settings();
ProjectSettingsEditor::get_singleton()->set_plugins_page();
}
void EditorAssetLibrary::_install_external_asset(String p_zip_path, String p_title) {
-
emit_signal("install_asset", p_zip_path, p_title);
}
@@ -1321,28 +1277,12 @@ void EditorAssetLibrary::disable_community_support() {
}
void EditorAssetLibrary::_bind_methods() {
-
- ClassDB::bind_method("_http_request_completed", &EditorAssetLibrary::_http_request_completed);
- ClassDB::bind_method("_select_asset", &EditorAssetLibrary::_select_asset);
- ClassDB::bind_method("_select_author", &EditorAssetLibrary::_select_author);
- ClassDB::bind_method("_select_category", &EditorAssetLibrary::_select_category);
- ClassDB::bind_method("_image_request_completed", &EditorAssetLibrary::_image_request_completed);
- ClassDB::bind_method("_search", &EditorAssetLibrary::_search, DEFVAL(0));
- ClassDB::bind_method("_search_text_entered", &EditorAssetLibrary::_search_text_entered);
- ClassDB::bind_method("_install_asset", &EditorAssetLibrary::_install_asset);
- ClassDB::bind_method("_manage_plugins", &EditorAssetLibrary::_manage_plugins);
- ClassDB::bind_method("_asset_open", &EditorAssetLibrary::_asset_open);
- ClassDB::bind_method("_asset_file_selected", &EditorAssetLibrary::_asset_file_selected);
- ClassDB::bind_method("_repository_changed", &EditorAssetLibrary::_repository_changed);
- ClassDB::bind_method("_support_toggled", &EditorAssetLibrary::_support_toggled);
- ClassDB::bind_method("_rerun_search", &EditorAssetLibrary::_rerun_search);
- ClassDB::bind_method("_install_external_asset", &EditorAssetLibrary::_install_external_asset);
+ ClassDB::bind_method("_unhandled_input", &EditorAssetLibrary::_unhandled_input);
ADD_SIGNAL(MethodInfo("install_asset", PropertyInfo(Variant::STRING, "zip_path"), PropertyInfo(Variant::STRING, "name")));
}
EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
-
requesting = REQUESTING_NONE;
templates_only = p_templates_only;
initial_loading = true;
@@ -1354,28 +1294,29 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
HBoxContainer *search_hb = memnew(HBoxContainer);
library_main->add_child(search_hb);
- library_main->add_constant_override("separation", 10 * EDSCALE);
+ library_main->add_theme_constant_override("separation", 10 * EDSCALE);
filter = memnew(LineEdit);
search_hb->add_child(filter);
- filter->set_h_size_flags(SIZE_EXPAND_FILL);
- filter->connect("text_entered", this, "_search_text_entered");
+ filter->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ filter->connect("text_entered", callable_mp(this, &EditorAssetLibrary::_search_text_entered));
search = memnew(Button(TTR("Search")));
- search->connect("pressed", this, "_search");
+ search->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), make_binds(0));
search_hb->add_child(search);
- if (!p_templates_only)
+ if (!p_templates_only) {
search_hb->add_child(memnew(VSeparator));
+ }
Button *open_asset = memnew(Button);
open_asset->set_text(TTR("Import..."));
search_hb->add_child(open_asset);
- open_asset->connect("pressed", this, "_asset_open");
+ open_asset->connect("pressed", callable_mp(this, &EditorAssetLibrary::_asset_open));
Button *plugins = memnew(Button);
plugins->set_text(TTR("Plugins..."));
search_hb->add_child(plugins);
- plugins->connect("pressed", this, "_manage_plugins");
+ plugins->connect("pressed", callable_mp(this, &EditorAssetLibrary::_manage_plugins));
if (p_templates_only) {
open_asset->hide();
@@ -1393,8 +1334,8 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
search_hb2->add_child(sort);
- sort->set_h_size_flags(SIZE_EXPAND_FILL);
- sort->connect("item_selected", this, "_rerun_search");
+ sort->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ sort->connect("item_selected", callable_mp(this, &EditorAssetLibrary::_rerun_search));
search_hb2->add_child(memnew(VSeparator));
@@ -1402,8 +1343,8 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
categories = memnew(OptionButton);
categories->add_item(TTR("All"));
search_hb2->add_child(categories);
- categories->set_h_size_flags(SIZE_EXPAND_FILL);
- categories->connect("item_selected", this, "_rerun_search");
+ categories->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ categories->connect("item_selected", callable_mp(this, &EditorAssetLibrary::_rerun_search));
search_hb2->add_child(memnew(VSeparator));
@@ -1415,10 +1356,10 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
repository->add_item("localhost");
repository->set_item_metadata(1, "http://127.0.0.1/asset-library/api");
- repository->connect("item_selected", this, "_repository_changed");
+ repository->connect("item_selected", callable_mp(this, &EditorAssetLibrary::_repository_changed));
search_hb2->add_child(repository);
- repository->set_h_size_flags(SIZE_EXPAND_FILL);
+ repository->set_h_size_flags(Control::SIZE_EXPAND_FILL);
search_hb2->add_child(memnew(VSeparator));
@@ -1430,13 +1371,13 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
support->get_popup()->add_check_item(TTR("Testing"), SUPPORT_TESTING);
support->get_popup()->set_item_checked(SUPPORT_OFFICIAL, true);
support->get_popup()->set_item_checked(SUPPORT_COMMUNITY, true);
- support->get_popup()->connect("id_pressed", this, "_support_toggled");
+ support->get_popup()->connect("id_pressed", callable_mp(this, &EditorAssetLibrary::_support_toggled));
/////////
library_scroll_bg = memnew(PanelContainer);
library_main->add_child(library_scroll_bg);
- library_scroll_bg->set_v_size_flags(SIZE_EXPAND_FILL);
+ library_scroll_bg->set_v_size_flags(Control::SIZE_EXPAND_FILL);
library_scroll = memnew(ScrollContainer);
library_scroll->set_enable_v_scroll(true);
@@ -1453,12 +1394,11 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
PanelContainer *library_vb_border = memnew(PanelContainer);
library_scroll->add_child(library_vb_border);
- library_vb_border->add_style_override("panel", border2);
- library_vb_border->set_h_size_flags(SIZE_EXPAND_FILL);
- library_vb_border->set_mouse_filter(MOUSE_FILTER_PASS);
+ library_vb_border->add_theme_style_override("panel", border2);
+ library_vb_border->set_h_size_flags(Control::SIZE_EXPAND_FILL);
library_vb = memnew(VBoxContainer);
- library_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ library_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
library_vb_border->add_child(library_vb);
@@ -1476,8 +1416,8 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
asset_items = memnew(GridContainer);
asset_items->set_columns(2);
- asset_items->add_constant_override("hseparation", 10 * EDSCALE);
- asset_items->add_constant_override("vseparation", 10 * EDSCALE);
+ asset_items->add_theme_constant_override("hseparation", 10 * EDSCALE);
+ asset_items->add_theme_constant_override("vseparation", 10 * EDSCALE);
library_vb->add_child(asset_items);
@@ -1487,24 +1427,25 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
request = memnew(HTTPRequest);
add_child(request);
request->set_use_threads(EDITOR_DEF("asset_library/use_threads", true));
- request->connect("request_completed", this, "_http_request_completed");
+ request->connect("request_completed", callable_mp(this, &EditorAssetLibrary::_http_request_completed));
last_queue_id = 0;
- library_vb->add_constant_override("separation", 20 * EDSCALE);
+ library_vb->add_theme_constant_override("separation", 20 * EDSCALE);
error_hb = memnew(HBoxContainer);
library_main->add_child(error_hb);
error_label = memnew(Label);
- error_label->add_color_override("color", get_color("error_color", "Editor"));
+ error_label->add_theme_color_override("color", get_theme_color("error_color", "Editor"));
error_hb->add_child(error_label);
error_tr = memnew(TextureRect);
error_tr->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
error_hb->add_child(error_tr);
- description = NULL;
+ description = nullptr;
set_process(true);
+ set_process_unhandled_input(true);
downloads_scroll = memnew(ScrollContainer);
downloads_scroll->set_enable_h_scroll(true);
@@ -1517,28 +1458,24 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
asset_open->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
asset_open->add_filter("*.zip ; " + TTR("Assets ZIP File"));
- asset_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ asset_open->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
add_child(asset_open);
- asset_open->connect("file_selected", this, "_asset_file_selected");
+ asset_open->connect("file_selected", callable_mp(this, &EditorAssetLibrary::_asset_file_selected));
- asset_installer = NULL;
+ asset_installer = nullptr;
}
///////
void AssetLibraryEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
-
addon_library->show();
} else {
-
addon_library->hide();
}
}
AssetLibraryEditorPlugin::AssetLibraryEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
addon_library = memnew(EditorAssetLibrary);
addon_library->set_v_size_flags(Control::SIZE_EXPAND_FILL);
diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h
index aa3c735810..3fca8a1084 100644
--- a/editor/plugins/asset_library_editor_plugin.h
+++ b/editor/plugins/asset_library_editor_plugin.h
@@ -50,7 +50,6 @@
#include "scene/main/http_request.h"
class EditorAssetLibraryItem : public PanelContainer {
-
GDCLASS(EditorAssetLibraryItem, PanelContainer);
TextureButton *icon;
@@ -68,7 +67,7 @@ class EditorAssetLibraryItem : public PanelContainer {
void _category_clicked();
void _author_clicked();
- void set_image(int p_type, int p_index, const Ref<Texture> &p_image);
+ void set_image(int p_type, int p_index, const Ref<Texture2D> &p_image);
protected:
void _notification(int p_what);
@@ -81,7 +80,6 @@ public:
};
class EditorAssetLibraryItemDescription : public ConfirmationDialog {
-
GDCLASS(EditorAssetLibraryItemDescription, ConfirmationDialog);
EditorAssetLibraryItem *item;
@@ -95,19 +93,19 @@ class EditorAssetLibraryItemDescription : public ConfirmationDialog {
bool is_video;
String video_link;
Button *button;
- Ref<Texture> image;
+ Ref<Texture2D> image;
};
Vector<Preview> preview_images;
TextureRect *preview;
- void set_image(int p_type, int p_index, const Ref<Texture> &p_image);
+ void set_image(int p_type, int p_index, const Ref<Texture2D> &p_image);
int asset_id;
String download_url;
String title;
String sha256;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
void _link_click(const String &p_url);
void _preview_click(int p_id);
@@ -121,7 +119,7 @@ public:
void add_preview(int p_id, bool p_video, const String &p_url);
String get_title() { return title; }
- Ref<Texture> get_preview_icon() { return icon; }
+ Ref<Texture2D> get_preview_icon() { return icon; }
String get_download_url() { return download_url; }
int get_asset_id() { return asset_id; }
String get_sha256() { return sha256; }
@@ -129,7 +127,6 @@ public:
};
class EditorAssetLibraryItemDownload : public PanelContainer {
-
GDCLASS(EditorAssetLibraryItemDownload, PanelContainer);
TextureRect *icon;
@@ -156,7 +153,7 @@ class EditorAssetLibraryItemDownload : public PanelContainer {
void _close();
void _install();
void _make_request();
- void _http_download_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
+ void _http_download_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data);
protected:
void _notification(int p_what);
@@ -165,7 +162,7 @@ protected:
public:
void set_external_install(bool p_enable) { external_install = p_enable; }
int get_asset_id() { return asset_id; }
- void configure(const String &p_title, int p_asset_id, const Ref<Texture> &p_preview, const String &p_download_url, const String &p_sha256_hash);
+ void configure(const String &p_title, int p_asset_id, const Ref<Texture2D> &p_preview, const String &p_download_url, const String &p_sha256_hash);
EditorAssetLibraryItemDownload();
};
@@ -237,7 +234,6 @@ class EditorAssetLibrary : public PanelContainer {
};
struct ImageQueue {
-
bool active;
int queue_id;
ImageType image_type;
@@ -250,8 +246,8 @@ class EditorAssetLibrary : public PanelContainer {
int last_queue_id;
Map<int, ImageQueue> image_queue;
- void _image_update(bool use_cache, bool final, const PoolByteArray &p_data, int p_queue_id);
- void _image_request_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data, int p_queue_id);
+ void _image_update(bool use_cache, bool final, const PackedByteArray &p_data, int p_queue_id);
+ void _image_request_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data, int p_queue_id);
void _request_image(ObjectID p_for, String p_image_url, ImageType p_type, int p_image_index);
void _update_image_queue();
@@ -286,8 +282,8 @@ class EditorAssetLibrary : public PanelContainer {
void _rerun_search(int p_ignore);
void _search_text_entered(const String &p_text = "");
void _api_request(const String &p_request, RequestType p_request_type, const String &p_arguments = "");
- void _http_request_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
- void _http_download_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
+ void _http_request_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data);
+ void _http_download_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data);
void _repository_changed(int p_repository_id);
void _support_toggled(int p_support);
@@ -300,6 +296,7 @@ class EditorAssetLibrary : public PanelContainer {
protected:
static void _bind_methods();
void _notification(int p_what);
+ void _unhandled_input(const Ref<InputEvent> &p_event);
public:
void disable_community_support();
@@ -308,18 +305,17 @@ public:
};
class AssetLibraryEditorPlugin : public EditorPlugin {
-
GDCLASS(AssetLibraryEditorPlugin, EditorPlugin);
EditorAssetLibrary *addon_library;
EditorNode *editor;
public:
- virtual String get_name() const { return "AssetLib"; }
- bool has_main_screen() const { return true; }
- virtual void edit(Object *p_object) {}
- virtual bool handles(Object *p_object) const { return false; }
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "AssetLib"; }
+ bool has_main_screen() const override { return true; }
+ virtual void edit(Object *p_object) override {}
+ virtual bool handles(Object *p_object) const override { return false; }
+ virtual void make_visible(bool p_visible) override;
//virtual bool get_remove_list(List<Node*> *p_list) { return canvas_item_editor->get_remove_list(p_list); }
//virtual Dictionary get_state() const;
//virtual void set_state(const Dictionary& p_state);
diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp
index 60cb2ff54d..b0f65af245 100644
--- a/editor/plugins/audio_stream_editor_plugin.cpp
+++ b/editor/plugins/audio_stream_editor_plugin.cpp
@@ -37,16 +37,15 @@
#include "editor/editor_settings.h"
void AudioStreamEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_READY) {
- AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", this, "_preview_changed");
+ AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", callable_mp(this, &AudioStreamEditor::_preview_changed));
}
if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) {
- _play_button->set_icon(get_icon("MainPlay", "EditorIcons"));
- _stop_button->set_icon(get_icon("Stop", "EditorIcons"));
- _preview->set_frame_color(get_color("dark_color_2", "Editor"));
- set_frame_color(get_color("dark_color_1", "Editor"));
+ _play_button->set_icon(get_theme_icon("MainPlay", "EditorIcons"));
+ _stop_button->set_icon(get_theme_icon("Stop", "EditorIcons"));
+ _preview->set_frame_color(get_theme_color("dark_color_2", "Editor"));
+ set_frame_color(get_theme_color("dark_color_1", "Editor"));
_indicator->update();
_preview->update();
@@ -75,7 +74,6 @@ void AudioStreamEditor::_draw_preview() {
lines.resize(size.width * 2);
for (int i = 0; i < size.width; i++) {
-
float ofs = i * preview_len / size.width;
float ofs_n = (i + 1) * preview_len / size.width;
float max = preview->get_max(ofs, ofs_n) * 0.5 + 0.5;
@@ -87,50 +85,46 @@ void AudioStreamEditor::_draw_preview() {
}
Vector<Color> color;
- color.push_back(get_color("contrast_color_2", "Editor"));
+ color.push_back(get_theme_color("contrast_color_2", "Editor"));
- VS::get_singleton()->canvas_item_add_multiline(_preview->get_canvas_item(), lines, color);
+ RS::get_singleton()->canvas_item_add_multiline(_preview->get_canvas_item(), lines, color);
}
void AudioStreamEditor::_preview_changed(ObjectID p_which) {
-
if (stream.is_valid() && stream->get_instance_id() == p_which) {
_preview->update();
}
}
void AudioStreamEditor::_changed_callback(Object *p_changed, const char *p_prop) {
-
- if (!is_visible())
+ if (!is_visible()) {
return;
+ }
update();
}
void AudioStreamEditor::_play() {
-
if (_player->is_playing()) {
_player->stop();
- _play_button->set_icon(get_icon("MainPlay", "EditorIcons"));
+ _play_button->set_icon(get_theme_icon("MainPlay", "EditorIcons"));
set_process(false);
} else {
_player->play(_current);
- _play_button->set_icon(get_icon("Pause", "EditorIcons"));
+ _play_button->set_icon(get_theme_icon("Pause", "EditorIcons"));
set_process(true);
}
}
void AudioStreamEditor::_stop() {
-
_player->stop();
- _play_button->set_icon(get_icon("MainPlay", "EditorIcons"));
+ _play_button->set_icon(get_theme_icon("MainPlay", "EditorIcons"));
_current = 0;
_indicator->update();
set_process(false);
}
void AudioStreamEditor::_on_finished() {
-
- _play_button->set_icon(get_icon("MainPlay", "EditorIcons"));
+ _play_button->set_icon(get_theme_icon("MainPlay", "EditorIcons"));
if (_current == _player->get_stream()->get_length()) {
_current = 0;
_indicator->update();
@@ -138,7 +132,6 @@ void AudioStreamEditor::_on_finished() {
}
void AudioStreamEditor::_draw_indicator() {
-
if (!stream.is_valid()) {
return;
}
@@ -146,7 +139,7 @@ void AudioStreamEditor::_draw_indicator() {
Rect2 rect = _preview->get_rect();
float len = stream->get_length();
float ofs_x = _current / len * rect.size.width;
- _indicator->draw_line(Point2(ofs_x, 0), Point2(ofs_x, rect.size.height), get_color("accent_color", "Editor"), 1);
+ _indicator->draw_line(Point2(ofs_x, 0), Point2(ofs_x, rect.size.height), get_theme_color("accent_color", "Editor"), 1);
_current_label->set_text(String::num(_current, 2).pad_decimals(2) + " /");
}
@@ -178,9 +171,9 @@ void AudioStreamEditor::_seek_to(real_t p_x) {
}
void AudioStreamEditor::edit(Ref<AudioStream> p_stream) {
-
- if (!stream.is_null())
+ if (!stream.is_null()) {
stream->remove_change_receptor(this);
+ }
stream = p_stream;
_player->set_stream(stream);
@@ -197,24 +190,15 @@ void AudioStreamEditor::edit(Ref<AudioStream> p_stream) {
}
void AudioStreamEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_preview_changed"), &AudioStreamEditor::_preview_changed);
- ClassDB::bind_method(D_METHOD("_play"), &AudioStreamEditor::_play);
- ClassDB::bind_method(D_METHOD("_stop"), &AudioStreamEditor::_stop);
- ClassDB::bind_method(D_METHOD("_on_finished"), &AudioStreamEditor::_on_finished);
- ClassDB::bind_method(D_METHOD("_draw_preview"), &AudioStreamEditor::_draw_preview);
- ClassDB::bind_method(D_METHOD("_draw_indicator"), &AudioStreamEditor::_draw_indicator);
- ClassDB::bind_method(D_METHOD("_on_input_indicator"), &AudioStreamEditor::_on_input_indicator);
}
AudioStreamEditor::AudioStreamEditor() {
-
set_custom_minimum_size(Size2(1, 100) * EDSCALE);
_current = 0;
_dragging = false;
_player = memnew(AudioStreamPlayer);
- _player->connect("finished", this, "_on_finished");
+ _player->connect("finished", callable_mp(this, &AudioStreamEditor::_on_finished));
add_child(_player);
VBoxContainer *vbox = memnew(VBoxContainer);
@@ -223,62 +207,61 @@ AudioStreamEditor::AudioStreamEditor() {
_preview = memnew(ColorRect);
_preview->set_v_size_flags(SIZE_EXPAND_FILL);
- _preview->connect("draw", this, "_draw_preview");
+ _preview->connect("draw", callable_mp(this, &AudioStreamEditor::_draw_preview));
vbox->add_child(_preview);
_indicator = memnew(Control);
_indicator->set_anchors_and_margins_preset(PRESET_WIDE);
- _indicator->connect("draw", this, "_draw_indicator");
- _indicator->connect("gui_input", this, "_on_input_indicator");
+ _indicator->connect("draw", callable_mp(this, &AudioStreamEditor::_draw_indicator));
+ _indicator->connect("gui_input", callable_mp(this, &AudioStreamEditor::_on_input_indicator));
_preview->add_child(_indicator);
HBoxContainer *hbox = memnew(HBoxContainer);
- hbox->add_constant_override("separation", 0);
+ hbox->add_theme_constant_override("separation", 0);
vbox->add_child(hbox);
- _play_button = memnew(ToolButton);
+ _play_button = memnew(Button);
+ _play_button->set_flat(true);
hbox->add_child(_play_button);
_play_button->set_focus_mode(Control::FOCUS_NONE);
- _play_button->connect("pressed", this, "_play");
+ _play_button->connect("pressed", callable_mp(this, &AudioStreamEditor::_play));
- _stop_button = memnew(ToolButton);
+ _stop_button = memnew(Button);
+ _stop_button->set_flat(true);
hbox->add_child(_stop_button);
_stop_button->set_focus_mode(Control::FOCUS_NONE);
- _stop_button->connect("pressed", this, "_stop");
+ _stop_button->connect("pressed", callable_mp(this, &AudioStreamEditor::_stop));
_current_label = memnew(Label);
_current_label->set_align(Label::ALIGN_RIGHT);
_current_label->set_h_size_flags(SIZE_EXPAND_FILL);
- _current_label->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+ _current_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
_current_label->set_modulate(Color(1, 1, 1, 0.5));
hbox->add_child(_current_label);
_duration_label = memnew(Label);
- _duration_label->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+ _duration_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
hbox->add_child(_duration_label);
}
void AudioStreamEditorPlugin::edit(Object *p_object) {
-
AudioStream *s = Object::cast_to<AudioStream>(p_object);
- if (!s)
+ if (!s) {
return;
+ }
audio_editor->edit(Ref<AudioStream>(s));
}
bool AudioStreamEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("AudioStream");
}
void AudioStreamEditorPlugin::make_visible(bool p_visible) {
-
audio_editor->set_visible(p_visible);
}
AudioStreamEditorPlugin::AudioStreamEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
audio_editor = memnew(AudioStreamEditor);
add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM, audio_editor);
diff --git a/editor/plugins/audio_stream_editor_plugin.h b/editor/plugins/audio_stream_editor_plugin.h
index 2191b541f6..5936b91fa1 100644
--- a/editor/plugins/audio_stream_editor_plugin.h
+++ b/editor/plugins/audio_stream_editor_plugin.h
@@ -38,7 +38,6 @@
#include "scene/resources/texture.h"
class AudioStreamEditor : public ColorRect {
-
GDCLASS(AudioStreamEditor, ColorRect);
Ref<AudioStream> stream;
@@ -48,8 +47,8 @@ class AudioStreamEditor : public ColorRect {
Label *_current_label;
Label *_duration_label;
- ToolButton *_play_button;
- ToolButton *_stop_button;
+ Button *_play_button;
+ Button *_stop_button;
float _current;
bool _dragging;
@@ -64,7 +63,7 @@ protected:
void _draw_indicator();
void _on_input_indicator(Ref<InputEvent> p_event);
void _seek_to(real_t p_x);
- void _changed_callback(Object *p_changed, const char *p_prop);
+ void _changed_callback(Object *p_changed, const char *p_prop) override;
static void _bind_methods();
public:
@@ -73,18 +72,17 @@ public:
};
class AudioStreamEditorPlugin : public EditorPlugin {
-
GDCLASS(AudioStreamEditorPlugin, EditorPlugin);
AudioStreamEditor *audio_editor;
EditorNode *editor;
public:
- virtual String get_name() const { return "Audio"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "Audio"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
AudioStreamEditorPlugin(EditorNode *p_node);
~AudioStreamEditorPlugin();
diff --git a/editor/plugins/baked_lightmap_editor_plugin.cpp b/editor/plugins/baked_lightmap_editor_plugin.cpp
index 7db936ccb8..e5d4e4a761 100644
--- a/editor/plugins/baked_lightmap_editor_plugin.cpp
+++ b/editor/plugins/baked_lightmap_editor_plugin.cpp
@@ -30,20 +30,33 @@
#include "baked_lightmap_editor_plugin.h"
-void BakedLightmapEditorPlugin::_bake() {
-
+void BakedLightmapEditorPlugin::_bake_select_file(const String &p_file) {
if (lightmap) {
BakedLightmap::BakeError err;
if (get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root() == lightmap) {
- err = lightmap->bake(lightmap);
+ err = lightmap->bake(lightmap, p_file, bake_func_step);
} else {
- err = lightmap->bake(lightmap->get_parent());
+ err = lightmap->bake(lightmap->get_parent(), p_file, bake_func_step);
}
+ bake_func_end();
+
switch (err) {
- case BakedLightmap::BAKE_ERROR_NO_SAVE_PATH:
- EditorNode::get_singleton()->show_warning(TTR("Can't determine a save path for lightmap images.\nSave your scene (for images to be saved in the same dir), or pick a save path from the BakedLightmap properties."));
- break;
+ case BakedLightmap::BAKE_ERROR_NO_SAVE_PATH: {
+ String scene_path = lightmap->get_filename();
+ if (scene_path == String()) {
+ scene_path = lightmap->get_owner()->get_filename();
+ }
+ if (scene_path == String()) {
+ EditorNode::get_singleton()->show_warning(TTR("Can't determine a save path for lightmap images.\nSave your scene and try again."));
+ break;
+ }
+ scene_path = scene_path.get_basename() + ".lmbake";
+
+ file_dialog->set_current_path(scene_path);
+ file_dialog->popup_file_dialog();
+
+ } break;
case BakedLightmap::BAKE_ERROR_NO_MESHES:
EditorNode::get_singleton()->show_warning(TTR("No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake Light' flag is on."));
break;
@@ -56,70 +69,69 @@ void BakedLightmapEditorPlugin::_bake() {
}
}
-void BakedLightmapEditorPlugin::edit(Object *p_object) {
+void BakedLightmapEditorPlugin::_bake() {
+ _bake_select_file("");
+}
+void BakedLightmapEditorPlugin::edit(Object *p_object) {
BakedLightmap *s = Object::cast_to<BakedLightmap>(p_object);
- if (!s)
+ if (!s) {
return;
+ }
lightmap = s;
}
bool BakedLightmapEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("BakedLightmap");
}
void BakedLightmapEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
bake->show();
} else {
-
bake->hide();
}
}
-EditorProgress *BakedLightmapEditorPlugin::tmp_progress = NULL;
-
-void BakedLightmapEditorPlugin::bake_func_begin(int p_steps) {
-
- ERR_FAIL_COND(tmp_progress != NULL);
-
- tmp_progress = memnew(EditorProgress("bake_lightmaps", TTR("Bake Lightmaps"), p_steps, true));
-}
-
-bool BakedLightmapEditorPlugin::bake_func_step(int p_step, const String &p_description) {
+EditorProgress *BakedLightmapEditorPlugin::tmp_progress = nullptr;
- ERR_FAIL_COND_V(tmp_progress == NULL, false);
- return tmp_progress->step(p_description, p_step, false);
+bool BakedLightmapEditorPlugin::bake_func_step(float p_progress, const String &p_description, void *, bool p_refresh) {
+ if (!tmp_progress) {
+ tmp_progress = memnew(EditorProgress("bake_lightmaps", TTR("Bake Lightmaps"), 1000, false));
+ ERR_FAIL_COND_V(tmp_progress == nullptr, false);
+ }
+ return tmp_progress->step(p_description, p_progress * 1000, p_refresh);
}
void BakedLightmapEditorPlugin::bake_func_end() {
- ERR_FAIL_COND(tmp_progress == NULL);
- memdelete(tmp_progress);
- tmp_progress = NULL;
+ if (tmp_progress != nullptr) {
+ memdelete(tmp_progress);
+ tmp_progress = nullptr;
+ }
}
void BakedLightmapEditorPlugin::_bind_methods() {
-
ClassDB::bind_method("_bake", &BakedLightmapEditorPlugin::_bake);
}
BakedLightmapEditorPlugin::BakedLightmapEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
- bake = memnew(ToolButton);
- bake->set_icon(editor->get_gui_base()->get_icon("Bake", "EditorIcons"));
+ bake = memnew(Button);
+ bake->set_flat(true);
+ bake->set_icon(editor->get_gui_base()->get_theme_icon("Bake", "EditorIcons"));
bake->set_text(TTR("Bake Lightmaps"));
bake->hide();
- bake->connect("pressed", this, "_bake");
+ bake->connect("pressed", Callable(this, "_bake"));
add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, bake);
- lightmap = NULL;
-
- BakedLightmap::bake_begin_function = bake_func_begin;
- BakedLightmap::bake_step_function = bake_func_step;
- BakedLightmap::bake_end_function = bake_func_end;
+ lightmap = nullptr;
+
+ file_dialog = memnew(EditorFileDialog);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+ file_dialog->add_filter("*.lmbake ; LightMap Bake");
+ file_dialog->set_title(TTR("Select lightmap bake file:"));
+ file_dialog->connect("file_selected", callable_mp(this, &BakedLightmapEditorPlugin::_bake_select_file));
+ bake->add_child(file_dialog);
}
BakedLightmapEditorPlugin::~BakedLightmapEditorPlugin() {
diff --git a/editor/plugins/baked_lightmap_editor_plugin.h b/editor/plugins/baked_lightmap_editor_plugin.h
index 8b94257a62..b4c7c07562 100644
--- a/editor/plugins/baked_lightmap_editor_plugin.h
+++ b/editor/plugins/baked_lightmap_editor_plugin.h
@@ -37,33 +37,33 @@
#include "scene/resources/material.h"
class BakedLightmapEditorPlugin : public EditorPlugin {
-
GDCLASS(BakedLightmapEditorPlugin, EditorPlugin);
BakedLightmap *lightmap;
- ToolButton *bake;
+ Button *bake;
EditorNode *editor;
+ EditorFileDialog *file_dialog;
static EditorProgress *tmp_progress;
- static void bake_func_begin(int p_steps);
- static bool bake_func_step(int p_step, const String &p_description);
+ static bool bake_func_step(float p_progress, const String &p_description, void *, bool p_refresh);
static void bake_func_end();
+ void _bake_select_file(const String &p_file);
void _bake();
protected:
static void _bind_methods();
public:
- virtual String get_name() const { return "BakedLightmap"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "BakedLightmap"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
BakedLightmapEditorPlugin(EditorNode *p_node);
~BakedLightmapEditorPlugin();
};
-#endif // BAKED_LIGHTMAP_EDITOR_PLUGIN_H
+#endif
diff --git a/editor/plugins/camera_3d_editor_plugin.cpp b/editor/plugins/camera_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..48f9f208a5
--- /dev/null
+++ b/editor/plugins/camera_3d_editor_plugin.cpp
@@ -0,0 +1,116 @@
+/*************************************************************************/
+/* camera_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "camera_3d_editor_plugin.h"
+
+#include "node_3d_editor_plugin.h"
+
+void Camera3DEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ Node3DEditor::get_singleton()->set_custom_camera(nullptr);
+ hide();
+ }
+}
+
+void Camera3DEditor::_pressed() {
+ Node *sn = (node && preview->is_pressed()) ? node : nullptr;
+ Node3DEditor::get_singleton()->set_custom_camera(sn);
+}
+
+void Camera3DEditor::_bind_methods() {
+}
+
+void Camera3DEditor::edit(Node *p_camera) {
+ node = p_camera;
+
+ if (!node) {
+ preview->set_pressed(false);
+ Node3DEditor::get_singleton()->set_custom_camera(nullptr);
+ } else {
+ if (preview->is_pressed()) {
+ Node3DEditor::get_singleton()->set_custom_camera(p_camera);
+ } else {
+ Node3DEditor::get_singleton()->set_custom_camera(nullptr);
+ }
+ }
+}
+
+Camera3DEditor::Camera3DEditor() {
+ preview = memnew(Button);
+ add_child(preview);
+
+ preview->set_text(TTR("Preview"));
+ preview->set_toggle_mode(true);
+ preview->set_anchor(MARGIN_LEFT, Control::ANCHOR_END);
+ preview->set_anchor(MARGIN_RIGHT, Control::ANCHOR_END);
+ preview->set_margin(MARGIN_LEFT, -60);
+ preview->set_margin(MARGIN_RIGHT, 0);
+ preview->set_margin(MARGIN_TOP, 0);
+ preview->set_margin(MARGIN_BOTTOM, 10);
+ preview->connect("pressed", callable_mp(this, &Camera3DEditor::_pressed));
+}
+
+void Camera3DEditorPlugin::edit(Object *p_object) {
+ Node3DEditor::get_singleton()->set_can_preview(Object::cast_to<Camera3D>(p_object));
+ //camera_editor->edit(Object::cast_to<Node>(p_object));
+}
+
+bool Camera3DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("Camera3D");
+}
+
+void Camera3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ //Node3DEditor::get_singleton()->set_can_preview(Object::cast_to<Camera3D>(p_object));
+ } else {
+ Node3DEditor::get_singleton()->set_can_preview(nullptr);
+ }
+}
+
+Camera3DEditorPlugin::Camera3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ /* camera_editor = memnew( CameraEditor );
+ editor->get_viewport()->add_child(camera_editor);
+
+ camera_editor->set_anchor(MARGIN_LEFT,Control::ANCHOR_END);
+ camera_editor->set_anchor(MARGIN_RIGHT,Control::ANCHOR_END);
+ camera_editor->set_margin(MARGIN_LEFT,60);
+ camera_editor->set_margin(MARGIN_RIGHT,0);
+ camera_editor->set_margin(MARGIN_TOP,0);
+ camera_editor->set_margin(MARGIN_BOTTOM,10);
+
+
+ camera_editor->hide();
+*/
+}
+
+Camera3DEditorPlugin::~Camera3DEditorPlugin() {
+}
diff --git a/editor/plugins/camera_3d_editor_plugin.h b/editor/plugins/camera_3d_editor_plugin.h
new file mode 100644
index 0000000000..023f1866df
--- /dev/null
+++ b/editor/plugins/camera_3d_editor_plugin.h
@@ -0,0 +1,73 @@
+/*************************************************************************/
+/* camera_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef CAMERA_EDITOR_PLUGIN_H
+#define CAMERA_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/3d/camera_3d.h"
+
+class Camera3DEditor : public Control {
+ GDCLASS(Camera3DEditor, Control);
+
+ Panel *panel;
+ Button *preview;
+ Node *node;
+
+ void _pressed();
+
+protected:
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+public:
+ void edit(Node *p_camera);
+ Camera3DEditor();
+};
+
+class Camera3DEditorPlugin : public EditorPlugin {
+ GDCLASS(Camera3DEditorPlugin, EditorPlugin);
+
+ //CameraEditor *camera_editor;
+ EditorNode *editor;
+
+public:
+ virtual String get_name() const override { return "Camera3D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ Camera3DEditorPlugin(EditorNode *p_node);
+ ~Camera3DEditorPlugin();
+};
+
+#endif // CAMERA_EDITOR_PLUGIN_H
diff --git a/editor/plugins/camera_editor_plugin.cpp b/editor/plugins/camera_editor_plugin.cpp
deleted file mode 100644
index 6f5bc69bd1..0000000000
--- a/editor/plugins/camera_editor_plugin.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/*************************************************************************/
-/* camera_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "camera_editor_plugin.h"
-
-#include "spatial_editor_plugin.h"
-
-void CameraEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- SpatialEditor::get_singleton()->set_custom_camera(NULL);
- hide();
- }
-}
-
-void CameraEditor::_pressed() {
-
- Node *sn = (node && preview->is_pressed()) ? node : NULL;
- SpatialEditor::get_singleton()->set_custom_camera(sn);
-}
-
-void CameraEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_pressed"), &CameraEditor::_pressed);
-}
-
-void CameraEditor::edit(Node *p_camera) {
-
- node = p_camera;
-
- if (!node) {
- preview->set_pressed(false);
- SpatialEditor::get_singleton()->set_custom_camera(NULL);
- } else {
-
- if (preview->is_pressed())
- SpatialEditor::get_singleton()->set_custom_camera(p_camera);
- else
- SpatialEditor::get_singleton()->set_custom_camera(NULL);
- }
-}
-
-CameraEditor::CameraEditor() {
-
- preview = memnew(Button);
- add_child(preview);
-
- preview->set_text(TTR("Preview"));
- preview->set_toggle_mode(true);
- preview->set_anchor(MARGIN_LEFT, Control::ANCHOR_END);
- preview->set_anchor(MARGIN_RIGHT, Control::ANCHOR_END);
- preview->set_margin(MARGIN_LEFT, -60);
- preview->set_margin(MARGIN_RIGHT, 0);
- preview->set_margin(MARGIN_TOP, 0);
- preview->set_margin(MARGIN_BOTTOM, 10);
- preview->connect("pressed", this, "_pressed");
-}
-
-void CameraEditorPlugin::edit(Object *p_object) {
-
- SpatialEditor::get_singleton()->set_can_preview(Object::cast_to<Camera>(p_object));
- //camera_editor->edit(Object::cast_to<Node>(p_object));
-}
-
-bool CameraEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("Camera");
-}
-
-void CameraEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- //SpatialEditor::get_singleton()->set_can_preview(Object::cast_to<Camera>(p_object));
- } else {
- SpatialEditor::get_singleton()->set_can_preview(NULL);
- }
-}
-
-CameraEditorPlugin::CameraEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- /* camera_editor = memnew( CameraEditor );
- editor->get_viewport()->add_child(camera_editor);
-
- camera_editor->set_anchor(MARGIN_LEFT,Control::ANCHOR_END);
- camera_editor->set_anchor(MARGIN_RIGHT,Control::ANCHOR_END);
- camera_editor->set_margin(MARGIN_LEFT,60);
- camera_editor->set_margin(MARGIN_RIGHT,0);
- camera_editor->set_margin(MARGIN_TOP,0);
- camera_editor->set_margin(MARGIN_BOTTOM,10);
-
-
- camera_editor->hide();
-*/
-}
-
-CameraEditorPlugin::~CameraEditorPlugin() {
-}
diff --git a/editor/plugins/camera_editor_plugin.h b/editor/plugins/camera_editor_plugin.h
deleted file mode 100644
index 9758a1ffbd..0000000000
--- a/editor/plugins/camera_editor_plugin.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*************************************************************************/
-/* camera_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef CAMERA_EDITOR_PLUGIN_H
-#define CAMERA_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/3d/camera.h"
-
-class CameraEditor : public Control {
-
- GDCLASS(CameraEditor, Control);
-
- Panel *panel;
- Button *preview;
- Node *node;
-
- void _pressed();
-
-protected:
- void _node_removed(Node *p_node);
- static void _bind_methods();
-
-public:
- void edit(Node *p_camera);
- CameraEditor();
-};
-
-class CameraEditorPlugin : public EditorPlugin {
-
- GDCLASS(CameraEditorPlugin, EditorPlugin);
-
- //CameraEditor *camera_editor;
- EditorNode *editor;
-
-public:
- virtual String get_name() const { return "Camera"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- CameraEditorPlugin(EditorNode *p_node);
- ~CameraEditorPlugin();
-};
-
-#endif // CAMERA_EDITOR_PLUGIN_H
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 1d8f3a2bbd..9427f82f9e 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -30,37 +30,40 @@
#include "canvas_item_editor_plugin.h"
-#include "core/os/input.h"
+#include "core/input/input.h"
+#include "core/math/geometry_2d.h"
#include "core/os/keyboard.h"
#include "core/print_string.h"
#include "core/project_settings.h"
+#include "editor/debugger/editor_debugger_node.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor/plugins/script_editor_plugin.h"
-#include "editor/script_editor_debugger.h"
+#include "scene/2d/gpu_particles_2d.h"
#include "scene/2d/light_2d.h"
-#include "scene/2d/particles_2d.h"
#include "scene/2d/polygon_2d.h"
#include "scene/2d/skeleton_2d.h"
-#include "scene/2d/sprite.h"
+#include "scene/2d/sprite_2d.h"
#include "scene/2d/touch_screen_button.h"
#include "scene/gui/grid_container.h"
#include "scene/gui/nine_patch_rect.h"
-#include "scene/gui/viewport_container.h"
+#include "scene/gui/subviewport_container.h"
#include "scene/main/canvas_layer.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/resources/packed_scene.h"
-#define MIN_ZOOM 0.01
-#define MAX_ZOOM 100
+// Min and Max are power of two in order to play nicely with successive increment.
+// That way, we can naturally reach a 100% zoom from boundaries.
+#define MIN_ZOOM 1. / 128
+#define MAX_ZOOM 128
#define RULER_WIDTH (15 * EDSCALE)
#define SCALE_HANDLE_DISTANCE 25
+#define MOVE_HANDLE_DISTANCE 25
class SnapDialog : public ConfirmationDialog {
-
GDCLASS(SnapDialog, ConfirmationDialog);
friend class CanvasItemEditor;
@@ -86,7 +89,6 @@ public:
GridContainer *child_container;
set_title(TTR("Configure Snap"));
- get_ok()->set_text(TTR("Close"));
container = memnew(VBoxContainer);
add_child(container);
@@ -98,7 +100,7 @@ public:
label = memnew(Label);
label->set_text(TTR("Grid Offset:"));
child_container->add_child(label);
- label->set_h_size_flags(SIZE_EXPAND_FILL);
+ label->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grid_offset_x = memnew(SpinBox);
grid_offset_x->set_min(-SPIN_BOX_GRID_RANGE);
@@ -106,7 +108,7 @@ public:
grid_offset_x->set_allow_lesser(true);
grid_offset_x->set_allow_greater(true);
grid_offset_x->set_suffix("px");
- grid_offset_x->set_h_size_flags(SIZE_EXPAND_FILL);
+ grid_offset_x->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(grid_offset_x);
grid_offset_y = memnew(SpinBox);
@@ -115,20 +117,20 @@ public:
grid_offset_y->set_allow_lesser(true);
grid_offset_y->set_allow_greater(true);
grid_offset_y->set_suffix("px");
- grid_offset_y->set_h_size_flags(SIZE_EXPAND_FILL);
+ grid_offset_y->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(grid_offset_y);
label = memnew(Label);
label->set_text(TTR("Grid Step:"));
child_container->add_child(label);
- label->set_h_size_flags(SIZE_EXPAND_FILL);
+ label->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grid_step_x = memnew(SpinBox);
grid_step_x->set_min(0.01);
grid_step_x->set_max(SPIN_BOX_GRID_RANGE);
grid_step_x->set_allow_greater(true);
grid_step_x->set_suffix("px");
- grid_step_x->set_h_size_flags(SIZE_EXPAND_FILL);
+ grid_step_x->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(grid_step_x);
grid_step_y = memnew(SpinBox);
@@ -136,7 +138,7 @@ public:
grid_step_y->set_max(SPIN_BOX_GRID_RANGE);
grid_step_y->set_allow_greater(true);
grid_step_y->set_suffix("px");
- grid_step_y->set_h_size_flags(SIZE_EXPAND_FILL);
+ grid_step_y->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(grid_step_y);
child_container = memnew(GridContainer);
@@ -145,7 +147,7 @@ public:
label = memnew(Label);
label->set_text(TTR("Primary Line Every:"));
- label->set_h_size_flags(SIZE_EXPAND_FILL);
+ label->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(label);
primary_grid_steps = memnew(SpinBox);
@@ -154,7 +156,7 @@ public:
primary_grid_steps->set_max(100);
primary_grid_steps->set_allow_greater(true);
primary_grid_steps->set_suffix(TTR("steps"));
- primary_grid_steps->set_h_size_flags(SIZE_EXPAND_FILL);
+ primary_grid_steps->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(primary_grid_steps);
container->add_child(memnew(HSeparator));
@@ -168,25 +170,25 @@ public:
label = memnew(Label);
label->set_text(TTR("Rotation Offset:"));
child_container->add_child(label);
- label->set_h_size_flags(SIZE_EXPAND_FILL);
+ label->set_h_size_flags(Control::SIZE_EXPAND_FILL);
rotation_offset = memnew(SpinBox);
rotation_offset->set_min(-SPIN_BOX_ROTATION_RANGE);
rotation_offset->set_max(SPIN_BOX_ROTATION_RANGE);
rotation_offset->set_suffix("deg");
- rotation_offset->set_h_size_flags(SIZE_EXPAND_FILL);
+ rotation_offset->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(rotation_offset);
label = memnew(Label);
label->set_text(TTR("Rotation Step:"));
child_container->add_child(label);
- label->set_h_size_flags(SIZE_EXPAND_FILL);
+ label->set_h_size_flags(Control::SIZE_EXPAND_FILL);
rotation_step = memnew(SpinBox);
rotation_step->set_min(-SPIN_BOX_ROTATION_RANGE);
rotation_step->set_max(SPIN_BOX_ROTATION_RANGE);
rotation_step->set_suffix("deg");
- rotation_step->set_h_size_flags(SIZE_EXPAND_FILL);
+ rotation_step->set_h_size_flags(Control::SIZE_EXPAND_FILL);
child_container->add_child(rotation_step);
container->add_child(memnew(HSeparator));
@@ -197,13 +199,13 @@ public:
label = memnew(Label);
label->set_text(TTR("Scale Step:"));
child_container->add_child(label);
- label->set_h_size_flags(SIZE_EXPAND_FILL);
+ label->set_h_size_flags(Control::SIZE_EXPAND_FILL);
scale_step = memnew(SpinBox);
scale_step->set_min(SPIN_BOX_SCALE_MIN);
scale_step->set_max(SPIN_BOX_SCALE_MAX);
scale_step->set_allow_greater(true);
- scale_step->set_h_size_flags(SIZE_EXPAND_FILL);
+ scale_step->set_h_size_flags(Control::SIZE_EXPAND_FILL);
scale_step->set_step(0.01f);
child_container->add_child(scale_step);
}
@@ -251,7 +253,6 @@ void CanvasItemEditor::_snap_if_closer_float(
float &r_current_snap, SnapTarget &r_current_snap_target,
float p_target_value, SnapTarget p_snap_target,
float p_radius) {
-
float radius = p_radius / zoom;
float dist = Math::abs(p_value - p_target_value);
if ((p_radius < 0 || dist < radius) && (r_current_snap_target == SNAP_TARGET_NONE || dist < Math::abs(r_current_snap - p_value))) {
@@ -266,7 +267,6 @@ void CanvasItemEditor::_snap_if_closer_point(
Point2 p_target_value, SnapTarget p_snap_target,
real_t rotation,
float p_radius) {
-
Transform2D rot_trans = Transform2D(rotation, Point2());
p_value = rot_trans.inverse().xform(p_value);
p_target_value = rot_trans.inverse().xform(p_target_value);
@@ -329,7 +329,6 @@ void CanvasItemEditor::_snap_other_nodes(
}
Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, unsigned int p_forced_modes, const CanvasItem *p_self_canvas_item, List<CanvasItem *> p_other_nodes_exceptions) {
-
snap_target[0] = SNAP_TARGET_NONE;
snap_target[1] = SNAP_TARGET_NONE;
@@ -461,17 +460,25 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, unsig
}
float CanvasItemEditor::snap_angle(float p_target, float p_start) const {
- return (((smart_snap_active || snap_rotation) ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL)) && snap_rotation_step != 0) ? Math::stepify(p_target - snap_rotation_offset, snap_rotation_step) + snap_rotation_offset : p_target;
+ if (((smart_snap_active || snap_rotation) ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL)) && snap_rotation_step != 0) {
+ if (snap_relative) {
+ return Math::stepify(p_target - snap_rotation_offset, snap_rotation_step) + snap_rotation_offset + (p_start - (int)(p_start / snap_rotation_step) * snap_rotation_step);
+ } else {
+ return Math::stepify(p_target - snap_rotation_offset, snap_rotation_step) + snap_rotation_offset;
+ }
+ } else {
+ return p_target;
+ }
}
void CanvasItemEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
-
Ref<InputEventKey> k = p_ev;
- if (!is_visible_in_tree() || get_viewport()->gui_has_modal_stack())
+ if (!is_visible_in_tree()) {
return;
+ }
- if (k->get_scancode() == KEY_CONTROL || k->get_scancode() == KEY_ALT || k->get_scancode() == KEY_SHIFT) {
+ if (k->get_keycode() == KEY_CONTROL || k->get_keycode() == KEY_ALT || k->get_keycode() == KEY_SHIFT) {
viewport->update();
}
@@ -483,28 +490,29 @@ void CanvasItemEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
} else if ((grid_snap_active || show_grid) && divide_grid_step_shortcut.is_valid() && divide_grid_step_shortcut->is_shortcut(p_ev)) {
// Divide the grid size
Point2 new_grid_step = grid_step * Math::pow(2.0, grid_step_multiplier - 1);
- if (new_grid_step.x >= 1.0 && new_grid_step.y >= 1.0)
+ if (new_grid_step.x >= 1.0 && new_grid_step.y >= 1.0) {
grid_step_multiplier--;
+ }
viewport->update();
}
}
}
Object *CanvasItemEditor::_get_editor_data(Object *p_what) {
-
CanvasItem *ci = Object::cast_to<CanvasItem>(p_what);
- if (!ci)
- return NULL;
+ if (!ci) {
+ return nullptr;
+ }
return memnew(CanvasItemEditorSelectedItem);
}
void CanvasItemEditor::_keying_changed() {
-
- if (AnimationPlayerEditor::singleton->get_track_editor()->is_visible_in_tree())
+ if (AnimationPlayerEditor::singleton->get_track_editor()->is_visible_in_tree()) {
animation_hb->show();
- else
+ } else {
animation_hb->hide();
+ }
}
Rect2 CanvasItemEditor::_get_encompassing_rect_from_list(List<CanvasItem *> p_list) {
@@ -530,10 +538,12 @@ Rect2 CanvasItemEditor::_get_encompassing_rect_from_list(List<CanvasItem *> p_li
}
void CanvasItemEditor::_expand_encompassing_rect_using_children(Rect2 &r_rect, const Node *p_node, bool &r_first, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, bool include_locked_nodes) {
- if (!p_node)
+ if (!p_node) {
return;
- if (Object::cast_to<Viewport>(p_node))
+ }
+ if (Object::cast_to<Viewport>(p_node)) {
return;
+ }
const CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node);
@@ -569,10 +579,12 @@ Rect2 CanvasItemEditor::_get_encompassing_rect(const Node *p_node) {
}
void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, Vector<_SelectResult> &r_items, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform) {
- if (!p_node)
+ if (!p_node) {
return;
- if (Object::cast_to<Viewport>(p_node))
+ }
+ if (Object::cast_to<Viewport>(p_node)) {
return;
+ }
const real_t grab_distance = EDITOR_GET("editors/poly_editor/point_grab_radius");
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node);
@@ -605,8 +617,7 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no
}
}
-void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items) {
-
+void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items, bool p_allow_locked) {
Node *scene = editor->get_edited_scene();
_find_canvas_items_at_pos(p_pos, scene, r_items);
@@ -620,14 +631,16 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel
node = node->get_parent();
};
- // Replace the node by the group if grouped
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(node);
- while (node && node != scene->get_parent()) {
- CanvasItem *canvas_item_tmp = Object::cast_to<CanvasItem>(node);
- if (canvas_item_tmp && node->has_meta("_edit_group_")) {
- canvas_item = canvas_item_tmp;
+ if (!p_allow_locked) {
+ // Replace the node by the group if grouped
+ while (node && node != scene->get_parent()) {
+ CanvasItem *canvas_item_tmp = Object::cast_to<CanvasItem>(node);
+ if (canvas_item_tmp && node->has_meta("_edit_group_")) {
+ canvas_item = canvas_item_tmp;
+ }
+ node = node->get_parent();
}
- node = node->get_parent();
}
// Check if the canvas item is already in the list (for groups or scenes)
@@ -640,7 +653,7 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel
}
//Remove the item if invalid
- if (!canvas_item || duplicate || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner())) || _is_node_locked(canvas_item)) {
+ if (!canvas_item || duplicate || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner())) || (!p_allow_locked && _is_node_locked(canvas_item))) {
r_items.remove(i);
i--;
} else {
@@ -656,11 +669,12 @@ void CanvasItemEditor::_get_bones_at_pos(const Point2 &p_pos, Vector<_SelectResu
Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(E->key().from));
Vector<Vector2> bone_shape;
- if (!_get_bone_shape(&bone_shape, NULL, E))
+ if (!_get_bone_shape(&bone_shape, nullptr, E)) {
continue;
+ }
// Check if the point is inside the Polygon2D
- if (Geometry::is_point_in_polygon(screen_pos, bone_shape)) {
+ if (Geometry2D::is_point_in_polygon(screen_pos, bone_shape)) {
// Check if the item is already in the list
bool duplicate = false;
for (int i = 0; i < r_items.size(); i++) {
@@ -669,8 +683,9 @@ void CanvasItemEditor::_get_bones_at_pos(const Point2 &p_pos, Vector<_SelectResu
break;
}
}
- if (duplicate)
+ if (duplicate) {
continue;
+ }
// Else, add it
_SelectResult res;
@@ -689,21 +704,25 @@ bool CanvasItemEditor::_get_bone_shape(Vector<Vector2> *shape, Vector<Vector2> *
Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(bone->key().from));
Node2D *to_node = Object::cast_to<Node2D>(ObjectDB::get_instance(bone->key().to));
- if (!from_node)
+ if (!from_node) {
return false;
- if (!from_node->is_inside_tree())
+ }
+ if (!from_node->is_inside_tree()) {
return false; //may have been removed
+ }
- if (!to_node && bone->get().length == 0)
+ if (!to_node && bone->get().length == 0) {
return false;
+ }
Vector2 from = transform.xform(from_node->get_global_position());
Vector2 to;
- if (to_node)
+ if (to_node) {
to = transform.xform(to_node->get_global_position());
- else
+ } else {
to = transform.xform(from_node->get_global_transform().xform(Vector2(bone->get().length, 0)));
+ }
Vector2 rel = to - from;
Vector2 relt = rel.tangent().normalized() * bone_width;
@@ -731,10 +750,12 @@ bool CanvasItemEditor::_get_bone_shape(Vector<Vector2> *shape, Vector<Vector2> *
}
void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_node, List<CanvasItem *> *r_items, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform) {
- if (!p_node)
+ if (!p_node) {
return;
- if (Object::cast_to<Viewport>(p_node))
+ }
+ if (Object::cast_to<Viewport>(p_node)) {
return;
+ }
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node);
Node *scene = editor->get_edited_scene();
@@ -767,7 +788,6 @@ void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_n
p_rect.has_point(xform.xform(rect.position + Vector2(rect.size.x, 0))) &&
p_rect.has_point(xform.xform(rect.position + Vector2(rect.size.x, rect.size.y))) &&
p_rect.has_point(xform.xform(rect.position + Vector2(0, rect.size.y)))) {
-
r_items->push_back(canvas_item);
}
} else {
@@ -850,10 +870,12 @@ Vector2 CanvasItemEditor::_position_to_anchor(const Control *p_control, Vector2
}
void CanvasItemEditor::_save_canvas_item_ik_chain(const CanvasItem *p_canvas_item, List<float> *p_bones_length, List<Dictionary> *p_bones_state) {
- if (p_bones_length)
+ if (p_bones_length) {
*p_bones_length = List<float>();
- if (p_bones_state)
+ }
+ if (p_bones_state) {
*p_bones_state = List<Dictionary>();
+ }
const Node2D *bone = Object::cast_to<Node2D>(p_canvas_item);
if (bone && bone->has_meta("_edit_bone_")) {
@@ -879,10 +901,12 @@ void CanvasItemEditor::_save_canvas_item_ik_chain(const CanvasItem *p_canvas_ite
for (List<const Node2D *>::Element *bone_E = bone_ik_list.front(); bone_E; bone_E = bone_E->next()) {
bone_xform = bone_xform * bone->get_transform().affine_inverse();
const Node2D *parent_bone = bone_E->get();
- if (p_bones_length)
+ if (p_bones_length) {
p_bones_length->push_back(parent_bone->get_global_transform().get_origin().distance_to(bone->get_global_position()));
- if (p_bones_state)
+ }
+ if (p_bones_state) {
p_bones_state->push_back(parent_bone->_edit_get_state());
+ }
bone = parent_bone;
}
}
@@ -954,18 +978,18 @@ void CanvasItemEditor::_snap_changed() {
}
void CanvasItemEditor::_selection_result_pressed(int p_result) {
-
- if (selection_results.size() <= p_result)
+ if (selection_results.size() <= p_result) {
return;
+ }
CanvasItem *item = selection_results[p_result].item;
- if (item)
+ if (item) {
_select_click_on_item(item, Point2(), selection_menu_additive_selection);
+ }
}
void CanvasItemEditor::_selection_menu_hide() {
-
selection_results.clear();
selection_menu->clear();
selection_menu->set_size(Vector2(0, 0));
@@ -1016,7 +1040,6 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve
// Start dragging a guide
if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) {
-
// Press button
if (b->get_position().x < RULER_WIDTH && b->get_position().y < RULER_WIDTH) {
// Drag a new double guide
@@ -1184,7 +1207,26 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve
bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted) {
Ref<InputEventMouseButton> b = p_event;
if (b.is_valid() && !p_already_accepted) {
- bool pan_on_scroll = bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan")) && !b->get_control();
+ const bool pan_on_scroll = bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan")) && !b->get_control();
+
+ if (pan_on_scroll) {
+ // Perform horizontal scrolling first so we can check for Shift being held.
+ if (b->is_pressed() &&
+ (b->get_button_index() == BUTTON_WHEEL_LEFT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_UP))) {
+ // Pan left
+ view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
+ update_viewport();
+ return true;
+ }
+
+ if (b->is_pressed() &&
+ (b->get_button_index() == BUTTON_WHEEL_RIGHT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_DOWN))) {
+ // Pan right
+ view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
+ update_viewport();
+ return true;
+ }
+ }
if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_DOWN) {
// Scroll or pan down
@@ -1192,7 +1234,11 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo
view_offset.y += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
update_viewport();
} else {
- _zoom_on_position(zoom * (1 - (0.05 * b->get_factor())), b->get_position());
+ float new_zoom = _get_next_zoom_value(-1);
+ if (b->get_factor() != 1.f) {
+ new_zoom = zoom * ((new_zoom / zoom - 1.f) * b->get_factor() + 1.f);
+ }
+ _zoom_on_position(new_zoom, b->get_position());
}
return true;
}
@@ -1203,29 +1249,15 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo
view_offset.y -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
update_viewport();
} else {
- _zoom_on_position(zoom * ((0.95 + (0.05 * b->get_factor())) / 0.95), b->get_position());
+ float new_zoom = _get_next_zoom_value(1);
+ if (b->get_factor() != 1.f) {
+ new_zoom = zoom * ((new_zoom / zoom - 1.f) * b->get_factor() + 1.f);
+ }
+ _zoom_on_position(new_zoom, b->get_position());
}
return true;
}
- if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_LEFT) {
- // Pan left
- if (pan_on_scroll) {
- view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
- update_viewport();
- return true;
- }
- }
-
- if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_RIGHT) {
- // Pan right
- if (pan_on_scroll) {
- view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
- update_viewport();
- return true;
- }
- }
-
if (!panning) {
if (b->is_pressed() &&
(b->get_button_index() == BUTTON_MIDDLE ||
@@ -1263,8 +1295,9 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo
}
}
- if (is_pan_key)
+ if (is_pan_key) {
pan_pressed = k->is_pressed();
+ }
}
Ref<InputEventMouseMotion> m = p_event;
@@ -1293,6 +1326,18 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo
Ref<InputEventPanGesture> pan_gesture = p_event;
if (pan_gesture.is_valid() && !p_already_accepted) {
+ // If control key pressed, then zoom instead of pan
+ if (pan_gesture->get_control()) {
+ const float factor = pan_gesture->get_delta().y;
+ float new_zoom = _get_next_zoom_value(-1);
+
+ if (factor != 1.f) {
+ new_zoom = zoom * ((new_zoom / zoom - 1.f) * factor + 1.f);
+ }
+ _zoom_on_position(new_zoom, pan_gesture->get_position());
+ return true;
+ }
+
// Pan gesture
const Vector2 delta = (int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom) * pan_gesture->get_delta();
view_offset.x += delta.x;
@@ -1312,7 +1357,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) {
// Drag the pivot (in pivot mode / with V key)
if (drag_type == DRAG_NONE) {
if ((b.is_valid() && b->is_pressed() && b->get_button_index() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) ||
- (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_scancode() == KEY_V)) {
+ (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == KEY_V)) {
List<CanvasItem *> selection = _get_edited_canvas_items();
// Filters the selection with nodes that allow setting the pivot
@@ -1332,7 +1377,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) {
if (drag_selection.size() == 1) {
new_pos = snap_point(drag_from, SNAP_NODE_SIDES | SNAP_NODE_CENTER | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, drag_selection[0]);
} else {
- new_pos = snap_point(drag_from, SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, NULL, drag_selection);
+ new_pos = snap_point(drag_from, SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, nullptr, drag_selection);
}
for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = E->get();
@@ -1351,10 +1396,11 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) {
drag_to = transform.affine_inverse().xform(m->get_position());
_restore_canvas_item_state(drag_selection);
Vector2 new_pos;
- if (drag_selection.size() == 1)
+ if (drag_selection.size() == 1) {
new_pos = snap_point(drag_to, SNAP_NODE_SIDES | SNAP_NODE_CENTER | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL, 0, drag_selection[0]);
- else
+ } else {
new_pos = snap_point(drag_to, SNAP_OTHER_NODES | SNAP_GRID | SNAP_PIXEL);
+ }
for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = E->get();
canvas_item->_edit_set_pivot(canvas_item->get_global_transform_with_canvas().affine_inverse().xform(new_pos));
@@ -1364,7 +1410,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) {
// Confirm the pivot move
if ((b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) ||
- (k.is_valid() && !k->is_pressed() && k->get_scancode() == KEY_V)) {
+ (k.is_valid() && !k->is_pressed() && k->get_keycode() == KEY_V)) {
_commit_canvas_item_state(drag_selection, TTR("Move pivot"));
drag_type = DRAG_NONE;
return true;
@@ -1386,7 +1432,6 @@ void CanvasItemEditor::_solve_IK(Node2D *leaf_node, Point2 target_position) {
if (se) {
int nb_bones = se->pre_drag_bones_undo_state.size();
if (nb_bones > 0) {
-
// Build the node list
Point2 leaf_pos = target_position;
@@ -1426,13 +1471,13 @@ void CanvasItemEditor::_solve_IK(Node2D *leaf_node, Point2 target_position) {
Vector2 direction = (joints_pos[node_id + 1] - joints_pos[node_id]).normalized();
int len = E->get();
if (E == se->pre_drag_bones_length.front()) {
- joints_pos[1] = joints_pos[1].linear_interpolate(joints_pos[0] + len * direction, solver_k);
+ joints_pos[1] = joints_pos[1].lerp(joints_pos[0] + len * direction, solver_k);
} else if (E == se->pre_drag_bones_length.back()) {
- joints_pos[node_id] = joints_pos[node_id].linear_interpolate(joints_pos[node_id + 1] - len * direction, solver_k);
+ joints_pos[node_id] = joints_pos[node_id].lerp(joints_pos[node_id + 1] - len * direction, solver_k);
} else {
Vector2 center = (joints_pos[node_id + 1] + joints_pos[node_id]) / 2.0;
- joints_pos[node_id] = joints_pos[node_id].linear_interpolate(center - (direction * len) / 2.0, solver_k);
- joints_pos[node_id + 1] = joints_pos[node_id + 1].linear_interpolate(center + (direction * len) / 2.0, solver_k);
+ joints_pos[node_id] = joints_pos[node_id].lerp(center - (direction * len) / 2.0, solver_k);
+ joints_pos[node_id + 1] = joints_pos[node_id + 1].lerp(center + (direction * len) / 2.0, solver_k);
}
node_id++;
}
@@ -1464,8 +1509,9 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) {
// Remove not movable nodes
for (List<CanvasItem *>::Element *E = selection.front(); E; E = E->next()) {
- if (!_is_node_movable(E->get(), true))
+ if (!_is_node_movable(E->get(), true)) {
selection.erase(E);
+ }
}
drag_selection = selection;
@@ -1613,20 +1659,36 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) {
switch (drag_type) {
case DRAG_ANCHOR_TOP_LEFT:
- if (!use_single_axis || !use_y) control->set_anchor(MARGIN_LEFT, new_anchor.x, false, false);
- if (!use_single_axis || use_y) control->set_anchor(MARGIN_TOP, new_anchor.y, false, false);
+ if (!use_single_axis || !use_y) {
+ control->set_anchor(MARGIN_LEFT, new_anchor.x, false, false);
+ }
+ if (!use_single_axis || use_y) {
+ control->set_anchor(MARGIN_TOP, new_anchor.y, false, false);
+ }
break;
case DRAG_ANCHOR_TOP_RIGHT:
- if (!use_single_axis || !use_y) control->set_anchor(MARGIN_RIGHT, new_anchor.x, false, false);
- if (!use_single_axis || use_y) control->set_anchor(MARGIN_TOP, new_anchor.y, false, false);
+ if (!use_single_axis || !use_y) {
+ control->set_anchor(MARGIN_RIGHT, new_anchor.x, false, false);
+ }
+ if (!use_single_axis || use_y) {
+ control->set_anchor(MARGIN_TOP, new_anchor.y, false, false);
+ }
break;
case DRAG_ANCHOR_BOTTOM_RIGHT:
- if (!use_single_axis || !use_y) control->set_anchor(MARGIN_RIGHT, new_anchor.x, false, false);
- if (!use_single_axis || use_y) control->set_anchor(MARGIN_BOTTOM, new_anchor.y, false, false);
+ if (!use_single_axis || !use_y) {
+ control->set_anchor(MARGIN_RIGHT, new_anchor.x, false, false);
+ }
+ if (!use_single_axis || use_y) {
+ control->set_anchor(MARGIN_BOTTOM, new_anchor.y, false, false);
+ }
break;
case DRAG_ANCHOR_BOTTOM_LEFT:
- if (!use_single_axis || !use_y) control->set_anchor(MARGIN_LEFT, new_anchor.x, false, false);
- if (!use_single_axis || use_y) control->set_anchor(MARGIN_BOTTOM, new_anchor.y, false, false);
+ if (!use_single_axis || !use_y) {
+ control->set_anchor(MARGIN_LEFT, new_anchor.x, false, false);
+ }
+ if (!use_single_axis || use_y) {
+ control->set_anchor(MARGIN_BOTTOM, new_anchor.y, false, false);
+ }
break;
case DRAG_ANCHOR_ALL:
if (!use_single_axis || !use_y) {
@@ -1704,13 +1766,15 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) {
Vector2 ofs = ((endpoints[i] - endpoints[prev]).normalized() + ((endpoints[i] - endpoints[next]).normalized())).normalized();
ofs *= (select_handle->get_size().width / 2);
ofs += endpoints[i];
- if (ofs.distance_to(b->get_position()) < radius)
+ if (ofs.distance_to(b->get_position()) < radius) {
resize_drag = dragger[i * 2];
+ }
ofs = (endpoints[i] + endpoints[next]) / 2;
ofs += (endpoints[next] - endpoints[i]).tangent().normalized() * (select_handle->get_size().width / 2);
- if (ofs.distance_to(b->get_position()) < radius)
+ if (ofs.distance_to(b->get_position()) < radius) {
resize_drag = dragger[i * 2 + 1];
+ }
}
if (resize_drag != DRAG_NONE) {
@@ -1847,7 +1911,6 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) {
}
bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseButton> b = p_event;
Ref<InputEventMouseMotion> m = p_event;
@@ -1859,21 +1922,22 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) {
CanvasItem *canvas_item = selection[0];
if (_is_node_movable(canvas_item)) {
-
Transform2D xform = transform * canvas_item->get_global_transform_with_canvas();
Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized();
Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
drag_type = DRAG_SCALE_BOTH;
- Size2 scale_factor = Size2(SCALE_HANDLE_DISTANCE, SCALE_HANDLE_DISTANCE);
- Rect2 x_handle_rect = Rect2(scale_factor.x * EDSCALE, -5 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
- if (x_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
- drag_type = DRAG_SCALE_X;
- }
- Rect2 y_handle_rect = Rect2(-5 * EDSCALE, -(scale_factor.y + 10) * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
- if (y_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
- drag_type = DRAG_SCALE_Y;
+ if (show_transformation_gizmos) {
+ Size2 scale_factor = Size2(SCALE_HANDLE_DISTANCE, SCALE_HANDLE_DISTANCE);
+ Rect2 x_handle_rect = Rect2(scale_factor.x * EDSCALE, -5 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ if (x_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
+ drag_type = DRAG_SCALE_X;
+ }
+ Rect2 y_handle_rect = Rect2(-5 * EDSCALE, scale_factor.y * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ if (y_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
+ drag_type = DRAG_SCALE_Y;
+ }
}
drag_from = transform.affine_inverse().xform(b->get_position());
@@ -1906,6 +1970,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) {
Point2 offset = drag_to_local - drag_from_local;
Size2 scale = canvas_item->call("get_scale");
+ Size2 original_scale = scale;
float ratio = scale.y / scale.x;
if (drag_type == DRAG_SCALE_BOTH) {
Size2 scale_factor = drag_to_local / drag_from_local;
@@ -1918,13 +1983,14 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) {
Size2 scale_factor = Vector2(offset.x, -offset.y) / SCALE_HANDLE_DISTANCE;
Size2 parent_scale = parent_xform.get_scale();
scale_factor *= Vector2(1.0 / parent_scale.x, 1.0 / parent_scale.y);
+
if (drag_type == DRAG_SCALE_X) {
scale.x += scale_factor.x;
if (uniform) {
scale.y = scale.x * ratio;
}
} else if (drag_type == DRAG_SCALE_Y) {
- scale.y += scale_factor.y;
+ scale.y -= scale_factor.y;
if (uniform) {
scale.x = scale.y / ratio;
}
@@ -1932,8 +1998,13 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) {
}
if (snap_scale && !is_ctrl) {
- scale.x = roundf(scale.x / snap_scale_step) * snap_scale_step;
- scale.y = roundf(scale.y / snap_scale_step) * snap_scale_step;
+ if (snap_relative) {
+ scale.x = original_scale.x * (roundf((scale.x / original_scale.x) / snap_scale_step) * snap_scale_step);
+ scale.y = original_scale.y * (roundf((scale.y / original_scale.y) / snap_scale_step) * snap_scale_step);
+ } else {
+ scale.x = roundf(scale.x / snap_scale_step) * snap_scale_step;
+ scale.y = roundf(scale.y / snap_scale_step) * snap_scale_step;
+ }
}
canvas_item->call("set_scale", scale);
@@ -1974,17 +2045,34 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
if ((b->get_alt() && !b->get_control()) || tool == TOOL_MOVE) {
List<CanvasItem *> selection = _get_edited_canvas_items();
- // Remove not movable nodes
+ drag_selection.clear();
for (int i = 0; i < selection.size(); i++) {
- if (!_is_node_movable(selection[i], true)) {
- selection.erase(selection[i]);
+ if (_is_node_movable(selection[i], true)) {
+ drag_selection.push_back(selection[i]);
}
}
if (selection.size() > 0) {
drag_type = DRAG_MOVE;
+
+ CanvasItem *canvas_item = selection[0];
+ Transform2D parent_xform = canvas_item->get_global_transform_with_canvas() * canvas_item->get_transform().affine_inverse();
+ Transform2D unscaled_transform = (transform * parent_xform * canvas_item->_edit_get_transform()).orthonormalized();
+ Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
+
+ if (show_transformation_gizmos) {
+ Size2 move_factor = Size2(MOVE_HANDLE_DISTANCE, MOVE_HANDLE_DISTANCE);
+ Rect2 x_handle_rect = Rect2(move_factor.x * EDSCALE, -5 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ if (x_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
+ drag_type = DRAG_MOVE_X;
+ }
+ Rect2 y_handle_rect = Rect2(-5 * EDSCALE, move_factor.y * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ if (y_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
+ drag_type = DRAG_MOVE_Y;
+ }
+ }
+
drag_from = transform.affine_inverse().xform(b->get_position());
- drag_selection = selection;
_save_canvas_item_state(drag_selection);
}
return true;
@@ -1992,15 +2080,14 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
}
}
- if (drag_type == DRAG_MOVE) {
+ if (drag_type == DRAG_MOVE || drag_type == DRAG_MOVE_X || drag_type == DRAG_MOVE_Y) {
// Move the nodes
if (m.is_valid()) {
-
// Save the ik chain for reapplying before IK solve
- Vector<List<Dictionary> > all_bones_ik_states;
+ Vector<List<Dictionary>> all_bones_ik_states;
for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) {
List<Dictionary> bones_ik_states;
- _save_canvas_item_ik_chain(E->get(), NULL, &bones_ik_states);
+ _save_canvas_item_ik_chain(E->get(), nullptr, &bones_ik_states);
all_bones_ik_states.push_back(bones_ik_states);
}
@@ -2014,7 +2101,15 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
} else {
previous_pos = _get_encompassing_rect_from_list(drag_selection).position;
}
- Point2 new_pos = snap_point(previous_pos + (drag_to - drag_from), SNAP_GRID | SNAP_GUIDES | SNAP_PIXEL | SNAP_NODE_PARENT | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES, 0, NULL, drag_selection);
+
+ Point2 new_pos = snap_point(previous_pos + (drag_to - drag_from), SNAP_GRID | SNAP_GUIDES | SNAP_PIXEL | SNAP_NODE_PARENT | SNAP_NODE_ANCHORS | SNAP_OTHER_NODES, 0, nullptr, drag_selection);
+
+ if (drag_type == DRAG_MOVE_X) {
+ new_pos.y = previous_pos.y;
+ } else if (drag_type == DRAG_MOVE_Y) {
+ new_pos.x = previous_pos.x;
+ }
+
bool single_axis = m->get_shift();
if (single_axis) {
if (ABS(new_pos.x - previous_pos.x) > ABS(new_pos.y - previous_pos.y)) {
@@ -2077,8 +2172,8 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
}
// Move the canvas items with the arrow keys
- if (k.is_valid() && k->is_pressed() && tool == TOOL_SELECT &&
- (k->get_scancode() == KEY_UP || k->get_scancode() == KEY_DOWN || k->get_scancode() == KEY_LEFT || k->get_scancode() == KEY_RIGHT)) {
+ if (k.is_valid() && k->is_pressed() && (tool == TOOL_SELECT || tool == TOOL_MOVE) &&
+ (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_LEFT || k->get_keycode() == KEY_RIGHT)) {
if (!k->is_echo()) {
// Start moving the canvas items with the keyboard
drag_selection = _get_edited_canvas_items();
@@ -2089,12 +2184,11 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
}
if (drag_selection.size() > 0) {
-
// Save the ik chain for reapplying before IK solve
- Vector<List<Dictionary> > all_bones_ik_states;
+ Vector<List<Dictionary>> all_bones_ik_states;
for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) {
List<Dictionary> bones_ik_states;
- _save_canvas_item_ik_chain(E->get(), NULL, &bones_ik_states);
+ _save_canvas_item_ik_chain(E->get(), nullptr, &bones_ik_states);
all_bones_ik_states.push_back(bones_ik_states);
}
@@ -2104,20 +2198,23 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
bool move_local_base_rotated = k->get_control() || k->get_metakey();
Vector2 dir;
- if (k->get_scancode() == KEY_UP)
+ if (k->get_keycode() == KEY_UP) {
dir += Vector2(0, -1);
- else if (k->get_scancode() == KEY_DOWN)
+ } else if (k->get_keycode() == KEY_DOWN) {
dir += Vector2(0, 1);
- else if (k->get_scancode() == KEY_LEFT)
+ } else if (k->get_keycode() == KEY_LEFT) {
dir += Vector2(-1, 0);
- else if (k->get_scancode() == KEY_RIGHT)
+ } else if (k->get_keycode() == KEY_RIGHT) {
dir += Vector2(1, 0);
- if (k->get_shift())
+ }
+ if (k->get_shift()) {
dir *= grid_step * Math::pow(2.0, grid_step_multiplier);
+ }
drag_to += dir;
- if (k->get_shift())
+ if (k->get_shift()) {
drag_to = drag_to.snapped(grid_step * Math::pow(2.0, grid_step_multiplier));
+ }
Point2 previous_pos;
if (drag_selection.size() == 1) {
@@ -2165,8 +2262,8 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
return true;
}
- if (k.is_valid() && !k->is_pressed() && drag_type == DRAG_KEY_MOVE && tool == TOOL_SELECT &&
- (k->get_scancode() == KEY_UP || k->get_scancode() == KEY_DOWN || k->get_scancode() == KEY_LEFT || k->get_scancode() == KEY_RIGHT)) {
+ if (k.is_valid() && !k->is_pressed() && drag_type == DRAG_KEY_MOVE && (tool == TOOL_SELECT || tool == TOOL_MOVE) &&
+ (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_LEFT || k->get_keycode() == KEY_RIGHT)) {
// Confirm canvas items move by arrow keys
if ((!Input::get_singleton()->is_key_pressed(KEY_UP)) &&
(!Input::get_singleton()->is_key_pressed(KEY_DOWN)) &&
@@ -2179,7 +2276,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
return true;
}
- return (k.is_valid() && (k->get_scancode() == KEY_UP || k->get_scancode() == KEY_DOWN || k->get_scancode() == KEY_LEFT || k->get_scancode() == KEY_RIGHT)); // Accept the key event in any case
+ return (k.is_valid() && (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_LEFT || k->get_keycode() == KEY_RIGHT)); // Accept the key event in any case
}
bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
@@ -2194,7 +2291,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
// Popup the selection menu list
Point2 click = transform.affine_inverse().xform(b->get_position());
- _get_canvas_items_at_pos(click, selection_results);
+ _get_canvas_items_at_pos(click, selection_results, b->get_alt() && tool != TOOL_LIST_SELECT);
if (selection_results.size() == 1) {
CanvasItem *item = selection_results[0].item;
@@ -2213,17 +2310,39 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
for (int i = 0; i < selection_results.size(); i++) {
CanvasItem *item = selection_results[i].item;
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(item, "Node");
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(item, "Node");
String node_path = "/" + root_name + "/" + root_path.rel_path_to(item->get_path());
- selection_menu->add_item(item->get_name());
+ int locked = 0;
+ if (_is_node_locked(item)) {
+ locked = 1;
+ } else {
+ Node *scene = editor->get_edited_scene();
+ Node *node = item;
+
+ while (node && node != scene->get_parent()) {
+ CanvasItem *canvas_item_tmp = Object::cast_to<CanvasItem>(node);
+ if (canvas_item_tmp && node->has_meta("_edit_group_")) {
+ locked = 2;
+ }
+ node = node->get_parent();
+ }
+ }
+
+ String suffix = String();
+ if (locked == 1) {
+ suffix = " (" + TTR("Locked") + ")";
+ } else if (locked == 2) {
+ suffix = " (" + TTR("Grouped") + ")";
+ }
+ selection_menu->add_item((String)item->get_name() + suffix);
selection_menu->set_item_icon(i, icon);
selection_menu->set_item_metadata(i, node_path);
selection_menu->set_item_tooltip(i, String(item->get_name()) + "\nType: " + item->get_class() + "\nPath: " + node_path);
}
selection_menu_additive_selection = b->get_shift();
- selection_menu->set_global_position(b->get_global_position());
+ selection_menu->set_position(get_screen_transform().xform(b->get_position()));
selection_menu->popup();
return true;
}
@@ -2234,11 +2353,12 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
Point2 click = transform.affine_inverse().xform(b->get_position());
Node *scene = editor->get_edited_scene();
- if (!scene)
+ if (!scene) {
return true;
+ }
// Find the item to select
- CanvasItem *canvas_item = NULL;
+ CanvasItem *canvas_item = nullptr;
// Retrieve the bones
Vector<_SelectResult> selection = Vector<_SelectResult>();
@@ -2274,16 +2394,15 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
// Drag the node(s) if requested
List<CanvasItem *> selection2 = _get_edited_canvas_items();
- // Remove not movable nodes
+ drag_selection.clear();
for (int i = 0; i < selection2.size(); i++) {
- if (!_is_node_movable(selection2[i], true)) {
- selection2.erase(selection2[i]);
+ if (_is_node_movable(selection2[i], true)) {
+ drag_selection.push_back(selection2[i]);
}
}
if (selection2.size() > 0) {
drag_type = DRAG_MOVE;
- drag_selection = selection2;
drag_from = click;
_save_canvas_item_state(drag_selection);
}
@@ -2303,10 +2422,12 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
Point2 bsfrom = drag_from;
Point2 bsto = box_selecting_to;
- if (bsfrom.x > bsto.x)
+ if (bsfrom.x > bsto.x) {
SWAP(bsfrom.x, bsto.x);
- if (bsfrom.y > bsto.y)
+ }
+ if (bsfrom.y > bsto.y) {
SWAP(bsfrom.y, bsto.y);
+ }
_find_canvas_items_in_rect(Rect2(bsfrom, bsto - bsfrom), scene, &selitems);
for (List<CanvasItem *>::Element *E = selitems.front(); E; E = E->next()) {
@@ -2334,7 +2455,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
}
}
- if (k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_ESCAPE && drag_type == DRAG_NONE && tool == TOOL_SELECT) {
+ if (k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_ESCAPE && drag_type == DRAG_NONE && tool == TOOL_SELECT) {
// Unselect everything
editor_selection->clear();
viewport->update();
@@ -2343,16 +2464,17 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
}
bool CanvasItemEditor::_gui_input_ruler_tool(const Ref<InputEvent> &p_event) {
-
- if (tool != TOOL_RULER)
+ if (tool != TOOL_RULER) {
return false;
+ }
Ref<InputEventMouseButton> b = p_event;
Ref<InputEventMouseMotion> m = p_event;
Point2 previous_origin = ruler_tool_origin;
- if (!ruler_tool_active)
+ if (!ruler_tool_active) {
ruler_tool_origin = snap_point(viewport->get_local_mouse_position() / zoom + view_offset);
+ }
if (b.is_valid() && b->get_button_index() == BUTTON_LEFT) {
if (b->is_pressed()) {
@@ -2366,7 +2488,6 @@ bool CanvasItemEditor::_gui_input_ruler_tool(const Ref<InputEvent> &p_event) {
}
if (m.is_valid() && (ruler_tool_active || (grid_snap_active && previous_origin != ruler_tool_origin))) {
-
viewport->update();
return true;
}
@@ -2375,7 +2496,6 @@ bool CanvasItemEditor::_gui_input_ruler_tool(const Ref<InputEvent> &p_event) {
}
bool CanvasItemEditor::_gui_input_hover(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseMotion> m = p_event;
if (m.is_valid()) {
Point2 click = transform.affine_inverse().xform(m->get_position());
@@ -2390,8 +2510,9 @@ bool CanvasItemEditor::_gui_input_hover(const Ref<InputEvent> &p_event) {
for (int i = 0; i < hovering_results_items.size(); i++) {
CanvasItem *canvas_item = hovering_results_items[i].item;
- if (canvas_item->_edit_use_rect())
+ if (canvas_item->_edit_use_rect()) {
continue;
+ }
_HoverResult hover_result;
hover_result.position = canvas_item->get_global_transform_with_canvas().get_origin();
@@ -2460,14 +2581,29 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
accepted = (_gui_input_zoom_or_pan(p_event, accepted) || accepted);
- if (accepted)
+ if (accepted) {
accept_event();
+ }
// Handles the mouse hovering
_gui_input_hover(p_event);
// Change the cursor
+ _update_cursor();
+
+ // Grab focus
+ if (!viewport->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field())) {
+ viewport->call_deferred("grab_focus");
+ }
+}
+
+void CanvasItemEditor::_update_cursor() {
CursorShape c = CURSOR_ARROW;
+ bool should_switch = false;
+ if (drag_selection.size() != 0) {
+ float angle = drag_selection[0]->_edit_get_rotation();
+ should_switch = abs(Math::cos(angle)) < Math_SQRT12;
+ }
switch (drag_type) {
case DRAG_NONE:
switch (tool) {
@@ -2490,21 +2626,37 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
case DRAG_LEFT:
case DRAG_RIGHT:
case DRAG_V_GUIDE:
- c = CURSOR_HSIZE;
+ if (should_switch) {
+ c = CURSOR_VSIZE;
+ } else {
+ c = CURSOR_HSIZE;
+ }
break;
case DRAG_TOP:
case DRAG_BOTTOM:
case DRAG_H_GUIDE:
- c = CURSOR_VSIZE;
+ if (should_switch) {
+ c = CURSOR_HSIZE;
+ } else {
+ c = CURSOR_VSIZE;
+ }
break;
case DRAG_TOP_LEFT:
case DRAG_BOTTOM_RIGHT:
case DRAG_DOUBLE_GUIDE:
- c = CURSOR_FDIAGSIZE;
+ if (should_switch) {
+ c = CURSOR_BDIAGSIZE;
+ } else {
+ c = CURSOR_FDIAGSIZE;
+ }
break;
case DRAG_TOP_RIGHT:
case DRAG_BOTTOM_LEFT:
- c = CURSOR_BDIAGSIZE;
+ if (should_switch) {
+ c = CURSOR_FDIAGSIZE;
+ } else {
+ c = CURSOR_BDIAGSIZE;
+ }
break;
case DRAG_MOVE:
c = CURSOR_MOVE;
@@ -2513,23 +2665,19 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
break;
}
- if (is_hovering_h_guide)
+ if (is_hovering_h_guide) {
c = CURSOR_VSIZE;
- else if (is_hovering_v_guide)
+ } else if (is_hovering_v_guide) {
c = CURSOR_HSIZE;
+ }
viewport->set_default_cursor_shape(c);
-
- // Grab focus
- if (!viewport->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field())) {
- viewport->call_deferred("grab_focus");
- }
}
void CanvasItemEditor::_draw_text_at_position(Point2 p_position, String p_string, Margin p_side) {
- Color color = get_color("font_color", "Editor");
+ Color color = get_theme_color("font_color", "Editor");
color.a = 0.8;
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
Size2 text_size = font->get_string_size(p_string);
switch (p_side) {
case MARGIN_LEFT:
@@ -2565,12 +2713,11 @@ void CanvasItemEditor::_draw_percentage_at_position(float p_value, Point2 p_posi
void CanvasItemEditor::_draw_focus() {
// Draw the focus around the base viewport
if (viewport->has_focus()) {
- get_stylebox("Focus", "EditorStyles")->draw(viewport->get_canvas_item(), Rect2(Point2(), viewport->get_size()));
+ get_theme_stylebox("Focus", "EditorStyles")->draw(viewport->get_canvas_item(), Rect2(Point2(), viewport->get_size()));
}
}
void CanvasItemEditor::_draw_guides() {
-
Color guide_color = EditorSettings::get_singleton()->get("editors/2d/guides_color");
Transform2D xform = viewport_scrollable->get_transform() * transform;
@@ -2578,8 +2725,9 @@ void CanvasItemEditor::_draw_guides() {
if (EditorNode::get_singleton()->get_edited_scene() && EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) {
Array vguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_vertical_guides_");
for (int i = 0; i < vguides.size(); i++) {
- if (drag_type == DRAG_V_GUIDE && i == dragged_guide_index)
+ if (drag_type == DRAG_V_GUIDE && i == dragged_guide_index) {
continue;
+ }
float x = xform.xform(Point2(vguides[i], 0)).x;
viewport->draw_line(Point2(x, 0), Point2(x, viewport->get_size().y), guide_color, Math::round(EDSCALE));
}
@@ -2588,26 +2736,27 @@ void CanvasItemEditor::_draw_guides() {
if (EditorNode::get_singleton()->get_edited_scene() && EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_horizontal_guides_")) {
Array hguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_horizontal_guides_");
for (int i = 0; i < hguides.size(); i++) {
- if (drag_type == DRAG_H_GUIDE && i == dragged_guide_index)
+ if (drag_type == DRAG_H_GUIDE && i == dragged_guide_index) {
continue;
+ }
float y = xform.xform(Point2(0, hguides[i])).y;
viewport->draw_line(Point2(0, y), Point2(viewport->get_size().x, y), guide_color, Math::round(EDSCALE));
}
}
// Dragged guide
- Color text_color = get_color("font_color", "Editor");
+ Color text_color = get_theme_color("font_color", "Editor");
text_color.a = 0.5;
if (drag_type == DRAG_DOUBLE_GUIDE || drag_type == DRAG_V_GUIDE) {
String str = vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).x));
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
Size2 text_size = font->get_string_size(str);
viewport->draw_string(font, Point2(dragged_guide_pos.x + 10, RULER_WIDTH + text_size.y / 2 + 10), str, text_color);
viewport->draw_line(Point2(dragged_guide_pos.x, 0), Point2(dragged_guide_pos.x, viewport->get_size().y), guide_color, Math::round(EDSCALE));
}
if (drag_type == DRAG_DOUBLE_GUIDE || drag_type == DRAG_H_GUIDE) {
String str = vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).y));
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
Size2 text_size = font->get_string_size(str);
viewport->draw_string(font, Point2(RULER_WIDTH + 10, dragged_guide_pos.y + text_size.y / 2 + 10), str, text_color);
viewport->draw_line(Point2(0, dragged_guide_pos.y), Point2(viewport->get_size().x, dragged_guide_pos.y), guide_color, Math::round(EDSCALE));
@@ -2629,11 +2778,11 @@ void CanvasItemEditor::_draw_smart_snapping() {
}
void CanvasItemEditor::_draw_rulers() {
- Color bg_color = get_color("dark_color_2", "Editor");
- Color graduation_color = get_color("font_color", "Editor").linear_interpolate(bg_color, 0.5);
- Color font_color = get_color("font_color", "Editor");
+ Color bg_color = get_theme_color("dark_color_2", "Editor");
+ Color graduation_color = get_theme_color("font_color", "Editor").lerp(bg_color, 0.5);
+ Color font_color = get_theme_color("font_color", "Editor");
font_color.a = 0.8;
- Ref<Font> font = get_font("rulers", "EditorFonts");
+ Ref<Font> font = get_theme_font("rulers", "EditorFonts");
// The rule transform
Transform2D ruler_transform = Transform2D();
@@ -2717,7 +2866,6 @@ void CanvasItemEditor::_draw_rulers() {
}
void CanvasItemEditor::_draw_grid() {
-
if (show_grid || grid_snap_active) {
// Draw the grid
Vector2 real_grid_offset;
@@ -2790,12 +2938,12 @@ void CanvasItemEditor::_draw_grid() {
}
void CanvasItemEditor::_draw_ruler_tool() {
-
- if (tool != TOOL_RULER)
+ if (tool != TOOL_RULER) {
return;
+ }
if (ruler_tool_active) {
- Color ruler_primary_color = get_color("accent_color", "Editor");
+ Color ruler_primary_color = get_theme_color("accent_color", "Editor");
Color ruler_secondary_color = ruler_primary_color;
ruler_secondary_color.a = 0.5;
@@ -2806,14 +2954,14 @@ void CanvasItemEditor::_draw_ruler_tool() {
bool draw_secondary_lines = !(Math::is_equal_approx(begin.y, corner.y) || Math::is_equal_approx(end.x, corner.x));
- viewport->draw_line(begin, end, ruler_primary_color, Math::round(EDSCALE * 3), true);
+ viewport->draw_line(begin, end, ruler_primary_color, Math::round(EDSCALE * 3));
if (draw_secondary_lines) {
viewport->draw_line(begin, corner, ruler_secondary_color, Math::round(EDSCALE));
viewport->draw_line(corner, end, ruler_secondary_color, Math::round(EDSCALE));
}
- Ref<Font> font = get_font("bold", "EditorFonts");
- Color font_color = get_color("font_color", "Editor");
+ Ref<Font> font = get_theme_font("bold", "EditorFonts");
+ Color font_color = get_theme_color("font_color", "Editor");
Color font_secondary_color = font_color;
font_secondary_color.a = 0.5;
float text_height = font->get_height();
@@ -2891,7 +3039,6 @@ void CanvasItemEditor::_draw_ruler_tool() {
}
if (grid_snap_active) {
-
text_pos = (begin + end) / 2 + Vector2(-text_width / 2, text_height / 2);
text_pos.x = CLAMP(text_pos.x, text_width / 2, viewport->get_rect().size.x - text_width * 1.5);
text_pos.y = CLAMP(text_pos.y, text_height * 2.5, viewport->get_rect().size.y - text_height / 2);
@@ -2911,10 +3058,9 @@ void CanvasItemEditor::_draw_ruler_tool() {
}
}
} else {
-
if (grid_snap_active) {
- Ref<Texture> position_icon = get_icon("EditorPosition", "EditorIcons");
- viewport->draw_texture(get_icon("EditorPosition", "EditorIcons"), (ruler_tool_origin - view_offset) * zoom - position_icon->get_size() / 2);
+ Ref<Texture2D> position_icon = get_theme_icon("EditorPosition", "EditorIcons");
+ viewport->draw_texture(get_theme_icon("EditorPosition", "EditorIcons"), (ruler_tool_origin - view_offset) * zoom - position_icon->get_size() / 2);
}
}
}
@@ -2923,7 +3069,6 @@ void CanvasItemEditor::_draw_control_anchors(Control *control) {
Transform2D xform = transform * control->get_global_transform_with_canvas();
RID ci = viewport->get_canvas_item();
if (tool == TOOL_SELECT && !Object::cast_to<Container>(control->get_parent())) {
-
// Compute the anchors
float anchors_values[4];
anchors_values[0] = control->get_anchor(MARGIN_LEFT);
@@ -3004,8 +3149,8 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
Vector2 line_ends[4];
for (int i = 0; i < 4; i++) {
float anchor_val = (i >= 2) ? ANCHOR_END - anchors_values[i] : anchors_values[i];
- line_starts[i] = Vector2::linear_interpolate(corners_pos[i], corners_pos[(i + 1) % 4], anchor_val);
- line_ends[i] = Vector2::linear_interpolate(corners_pos[(i + 3) % 4], corners_pos[(i + 2) % 4], anchor_val);
+ line_starts[i] = corners_pos[i].lerp(corners_pos[(i + 1) % 4], anchor_val);
+ line_ends[i] = corners_pos[(i + 3) % 4].lerp(corners_pos[(i + 2) % 4], anchor_val);
anchor_snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0;
viewport->draw_line(line_starts[i], line_ends[i], anchor_snapped ? color_snapped : color_base, (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) ? 2 : 1);
}
@@ -3047,7 +3192,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
case DRAG_TOP_LEFT:
case DRAG_BOTTOM_LEFT:
_draw_margin_at_position(control->get_size().width, parent_transform.xform(Vector2((node_pos_in_parent[0] + node_pos_in_parent[2]) / 2, node_pos_in_parent[3])) + Vector2(0, 5), MARGIN_BOTTOM);
- FALLTHROUGH;
+ [[fallthrough]];
case DRAG_MOVE:
start = Vector2(node_pos_in_parent[0], Math::lerp(node_pos_in_parent[1], node_pos_in_parent[3], ratio));
end = start - Vector2(control->get_margin(MARGIN_LEFT), 0);
@@ -3062,7 +3207,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
case DRAG_TOP_RIGHT:
case DRAG_BOTTOM_RIGHT:
_draw_margin_at_position(control->get_size().width, parent_transform.xform(Vector2((node_pos_in_parent[0] + node_pos_in_parent[2]) / 2, node_pos_in_parent[3])) + Vector2(0, 5), MARGIN_BOTTOM);
- FALLTHROUGH;
+ [[fallthrough]];
case DRAG_MOVE:
start = Vector2(node_pos_in_parent[2], Math::lerp(node_pos_in_parent[3], node_pos_in_parent[1], ratio));
end = start - Vector2(control->get_margin(MARGIN_RIGHT), 0);
@@ -3077,7 +3222,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
case DRAG_TOP_LEFT:
case DRAG_TOP_RIGHT:
_draw_margin_at_position(control->get_size().height, parent_transform.xform(Vector2(node_pos_in_parent[2], (node_pos_in_parent[1] + node_pos_in_parent[3]) / 2)) + Vector2(5, 0), MARGIN_RIGHT);
- FALLTHROUGH;
+ [[fallthrough]];
case DRAG_MOVE:
start = Vector2(Math::lerp(node_pos_in_parent[0], node_pos_in_parent[2], ratio), node_pos_in_parent[1]);
end = start - Vector2(0, control->get_margin(MARGIN_TOP));
@@ -3092,7 +3237,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
case DRAG_BOTTOM_LEFT:
case DRAG_BOTTOM_RIGHT:
_draw_margin_at_position(control->get_size().height, parent_transform.xform(Vector2(node_pos_in_parent[2], (node_pos_in_parent[1] + node_pos_in_parent[3]) / 2) + Vector2(5, 0)), MARGIN_RIGHT);
- FALLTHROUGH;
+ [[fallthrough]];
case DRAG_MOVE:
start = Vector2(Math::lerp(node_pos_in_parent[2], node_pos_in_parent[0], ratio), node_pos_in_parent[3]);
end = start - Vector2(0, control->get_margin(MARGIN_BOTTOM));
@@ -3126,19 +3271,21 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
}
void CanvasItemEditor::_draw_selection() {
- Ref<Texture> pivot_icon = get_icon("EditorPivot", "EditorIcons");
- Ref<Texture> position_icon = get_icon("EditorPosition", "EditorIcons");
- Ref<Texture> previous_position_icon = get_icon("EditorPositionPrevious", "EditorIcons");
+ Ref<Texture2D> pivot_icon = get_theme_icon("EditorPivot", "EditorIcons");
+ Ref<Texture2D> position_icon = get_theme_icon("EditorPosition", "EditorIcons");
+ Ref<Texture2D> previous_position_icon = get_theme_icon("EditorPositionPrevious", "EditorIcons");
RID ci = viewport->get_canvas_item();
- List<CanvasItem *> selection = _get_edited_canvas_items(false, false);
+ List<CanvasItem *> selection = _get_edited_canvas_items(true, false);
bool single = selection.size() == 1;
for (List<CanvasItem *>::Element *E = selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get());
CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
+ bool item_locked = canvas_item->has_meta("_edit_lock_");
+
// Draw the previous position if we are dragging the node
if (show_helpers &&
(drag_type == DRAG_MOVE || drag_type == DRAG_ROTATE ||
@@ -3157,7 +3304,7 @@ void CanvasItemEditor::_draw_selection() {
};
for (int i = 0; i < 4; i++) {
- viewport->draw_line(pre_drag_endpoints[i], pre_drag_endpoints[(i + 1) % 4], pre_drag_color, Math::round(2 * EDSCALE), true);
+ viewport->draw_line(pre_drag_endpoints[i], pre_drag_endpoints[(i + 1) % 4], pre_drag_color, Math::round(2 * EDSCALE));
}
} else {
viewport->draw_texture(previous_position_icon, (pre_drag_xform.xform(Point2()) - (previous_position_icon->get_size() / 2)).floor());
@@ -3178,11 +3325,14 @@ void CanvasItemEditor::_draw_selection() {
Color c = Color(1, 0.6, 0.4, 0.7);
+ if (item_locked) {
+ c = Color(0.7, 0.7, 0.7, 0.7);
+ }
+
for (int i = 0; i < 4; i++) {
- viewport->draw_line(endpoints[i], endpoints[(i + 1) % 4], c, Math::round(2 * EDSCALE), true);
+ viewport->draw_line(endpoints[i], endpoints[(i + 1) % 4], c, Math::round(2 * EDSCALE));
}
} else {
-
Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized();
Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
viewport->draw_set_transform_matrix(simple_xform);
@@ -3190,10 +3340,9 @@ void CanvasItemEditor::_draw_selection() {
viewport->draw_set_transform_matrix(viewport->get_transform());
}
- if (single && (tool == TOOL_SELECT || tool == TOOL_MOVE || tool == TOOL_SCALE || tool == TOOL_ROTATE || tool == TOOL_EDIT_PIVOT)) { //kind of sucks
+ if (single && !item_locked && (tool == TOOL_SELECT || tool == TOOL_MOVE || tool == TOOL_SCALE || tool == TOOL_ROTATE || tool == TOOL_EDIT_PIVOT)) { //kind of sucks
// Draw the pivot
if (canvas_item->_edit_use_pivot()) {
-
// Draw the node's pivot
Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized();
Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
@@ -3235,10 +3384,39 @@ void CanvasItemEditor::_draw_selection() {
}
}
- // Draw the rescale handles
+ // Draw the move handles
bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
bool is_alt = Input::get_singleton()->is_key_pressed(KEY_ALT);
- if ((is_alt && is_ctrl) || tool == TOOL_SCALE || drag_type == DRAG_SCALE_X || drag_type == DRAG_SCALE_Y) {
+ if (tool == TOOL_MOVE && show_transformation_gizmos) {
+ if (_is_node_movable(canvas_item)) {
+ Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized();
+ Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
+
+ Size2 move_factor = Size2(MOVE_HANDLE_DISTANCE, MOVE_HANDLE_DISTANCE);
+ viewport->draw_set_transform_matrix(simple_xform);
+
+ Vector<Point2> points;
+ points.push_back(Vector2(move_factor.x * EDSCALE, 5 * EDSCALE));
+ points.push_back(Vector2(move_factor.x * EDSCALE, -5 * EDSCALE));
+ points.push_back(Vector2((move_factor.x + 10) * EDSCALE, 0));
+
+ viewport->draw_colored_polygon(points, get_theme_color("axis_x_color", "Editor"));
+ viewport->draw_line(Point2(), Point2(move_factor.x * EDSCALE, 0), get_theme_color("axis_x_color", "Editor"), Math::round(EDSCALE));
+
+ points.clear();
+ points.push_back(Vector2(5 * EDSCALE, move_factor.y * EDSCALE));
+ points.push_back(Vector2(-5 * EDSCALE, move_factor.y * EDSCALE));
+ points.push_back(Vector2(0, (move_factor.y + 10) * EDSCALE));
+
+ viewport->draw_colored_polygon(points, get_theme_color("axis_y_color", "Editor"));
+ viewport->draw_line(Point2(), Point2(0, move_factor.y * EDSCALE), get_theme_color("axis_y_color", "Editor"), Math::round(EDSCALE));
+
+ viewport->draw_set_transform_matrix(viewport->get_transform());
+ }
+ }
+
+ // Draw the rescale handles
+ if (show_transformation_gizmos && ((is_alt && is_ctrl) || tool == TOOL_SCALE || drag_type == DRAG_SCALE_X || drag_type == DRAG_SCALE_Y)) {
if (_is_node_movable(canvas_item)) {
Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized();
Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
@@ -3253,20 +3431,20 @@ void CanvasItemEditor::_draw_selection() {
scale_factor.y += offset.x;
}
} else if (drag_type == DRAG_SCALE_Y) {
- scale_factor.y -= offset.y;
+ scale_factor.y += offset.y;
if (uniform) {
- scale_factor.x -= offset.y;
+ scale_factor.x += offset.y;
}
}
viewport->draw_set_transform_matrix(simple_xform);
Rect2 x_handle_rect = Rect2(scale_factor.x * EDSCALE, -5 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
- viewport->draw_rect(x_handle_rect, get_color("axis_x_color", "Editor"));
- viewport->draw_line(Point2(), Point2(scale_factor.x * EDSCALE, 0), get_color("axis_x_color", "Editor"), Math::round(EDSCALE), true);
+ viewport->draw_rect(x_handle_rect, get_theme_color("axis_x_color", "Editor"));
+ viewport->draw_line(Point2(), Point2(scale_factor.x * EDSCALE, 0), get_theme_color("axis_x_color", "Editor"), Math::round(EDSCALE));
- Rect2 y_handle_rect = Rect2(-5 * EDSCALE, -(scale_factor.y + 10) * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
- viewport->draw_rect(y_handle_rect, get_color("axis_y_color", "Editor"));
- viewport->draw_line(Point2(), Point2(0, -scale_factor.y * EDSCALE), get_color("axis_y_color", "Editor"), Math::round(EDSCALE), true);
+ Rect2 y_handle_rect = Rect2(-5 * EDSCALE, scale_factor.y * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ viewport->draw_rect(y_handle_rect, get_theme_color("axis_y_color", "Editor"));
+ viewport->draw_line(Point2(), Point2(0, scale_factor.y * EDSCALE), get_theme_color("axis_y_color", "Editor"), Math::round(EDSCALE));
viewport->draw_set_transform_matrix(viewport->get_transform());
}
@@ -3281,11 +3459,11 @@ void CanvasItemEditor::_draw_selection() {
viewport->draw_rect(
Rect2(bsfrom, bsto - bsfrom),
- get_color("box_selection_fill_color", "Editor"));
+ get_theme_color("box_selection_fill_color", "Editor"));
viewport->draw_rect(
Rect2(bsfrom, bsto - bsfrom),
- get_color("box_selection_stroke_color", "Editor"),
+ get_theme_color("box_selection_stroke_color", "Editor"),
false,
Math::round(EDSCALE));
}
@@ -3295,9 +3473,8 @@ void CanvasItemEditor::_draw_selection() {
viewport->draw_line(
transform.xform(drag_rotation_center),
transform.xform(drag_to),
- get_color("accent_color", "Editor") * Color(1, 1, 1, 0.6),
- Math::round(2 * EDSCALE),
- true);
+ get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.6),
+ Math::round(2 * EDSCALE));
}
}
@@ -3338,20 +3515,17 @@ void CanvasItemEditor::_draw_straight_line(Point2 p_from, Point2 p_to, Color p_c
}
}
if (points.size() >= 2) {
- VisualServer::get_singleton()->canvas_item_add_line(ci, points[0], points[1], p_color);
+ RenderingServer::get_singleton()->canvas_item_add_line(ci, points[0], points[1], p_color);
}
}
void CanvasItemEditor::_draw_axis() {
-
if (show_origin) {
-
- _draw_straight_line(Point2(), Point2(1, 0), get_color("axis_x_color", "Editor") * Color(1, 1, 1, 0.75));
- _draw_straight_line(Point2(), Point2(0, 1), get_color("axis_y_color", "Editor") * Color(1, 1, 1, 0.75));
+ _draw_straight_line(Point2(), Point2(1, 0), get_theme_color("axis_x_color", "Editor") * Color(1, 1, 1, 0.75));
+ _draw_straight_line(Point2(), Point2(0, 1), get_theme_color("axis_y_color", "Editor") * Color(1, 1, 1, 0.75));
}
if (show_viewport) {
-
RID ci = viewport->get_canvas_item();
Color area_axis_color = EditorSettings::get_singleton()->get("editors/2d/viewport_border_color");
@@ -3366,7 +3540,7 @@ void CanvasItemEditor::_draw_axis() {
};
for (int i = 0; i < 4; i++) {
- VisualServer::get_singleton()->canvas_item_add_line(ci, screen_endpoints[i], screen_endpoints[(i + 1) % 4], area_axis_color);
+ RenderingServer::get_singleton()->canvas_item_add_line(ci, screen_endpoints[i], screen_endpoints[(i + 1) % 4], area_axis_color);
}
}
}
@@ -3382,15 +3556,16 @@ void CanvasItemEditor::_draw_bones() {
Color bone_selected_color = EditorSettings::get_singleton()->get("editors/2d/bone_selected_color");
for (Map<BoneKey, BoneList>::Element *E = bone_list.front(); E; E = E->next()) {
-
Vector<Vector2> bone_shape;
Vector<Vector2> bone_shape_outline;
- if (!_get_bone_shape(&bone_shape, &bone_shape_outline, E))
+ if (!_get_bone_shape(&bone_shape, &bone_shape_outline, E)) {
continue;
+ }
Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(E->key().from));
- if (!from_node->is_visible_in_tree())
+ if (!from_node->is_visible_in_tree()) {
continue;
+ }
Vector<Color> colors;
if (from_node->has_meta("_edit_ik_")) {
@@ -3423,8 +3598,8 @@ void CanvasItemEditor::_draw_bones() {
outline_colors.push_back(bone_outline_color);
}
- VisualServer::get_singleton()->canvas_item_add_polygon(ci, bone_shape_outline, outline_colors);
- VisualServer::get_singleton()->canvas_item_add_primitive(ci, bone_shape, colors, Vector<Vector2>(), RID());
+ RenderingServer::get_singleton()->canvas_item_add_polygon(ci, bone_shape_outline, outline_colors);
+ RenderingServer::get_singleton()->canvas_item_add_primitive(ci, bone_shape, colors, Vector<Vector2>(), RID());
}
}
}
@@ -3433,11 +3608,13 @@ void CanvasItemEditor::_draw_invisible_nodes_positions(Node *p_node, const Trans
ERR_FAIL_COND(!p_node);
Node *scene = editor->get_edited_scene();
- if (p_node != scene && p_node->get_owner() != scene && !scene->is_editable_instance(p_node->get_owner()))
+ if (p_node != scene && p_node->get_owner() != scene && !scene->is_editable_instance(p_node->get_owner())) {
return;
+ }
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node);
- if (canvas_item && !canvas_item->is_visible())
+ if (canvas_item && !canvas_item->is_visible()) {
return;
+ }
Transform2D parent_xform = p_parent_xform;
Transform2D canvas_xform = p_canvas_xform;
@@ -3458,7 +3635,7 @@ void CanvasItemEditor::_draw_invisible_nodes_positions(Node *p_node, const Trans
Transform2D xform = transform * canvas_xform * parent_xform;
// Draw the node's position
- Ref<Texture> position_icon = get_icon("EditorPositionUnselected", "EditorIcons");
+ Ref<Texture2D> position_icon = get_theme_icon("EditorPositionUnselected", "EditorIcons");
Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized();
Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
viewport->draw_set_transform_matrix(simple_xform);
@@ -3471,11 +3648,10 @@ void CanvasItemEditor::_draw_hover() {
List<Rect2> previous_rects;
for (int i = 0; i < hovering_results.size(); i++) {
-
- Ref<Texture> node_icon = hovering_results[i].icon;
+ Ref<Texture2D> node_icon = hovering_results[i].icon;
String node_name = hovering_results[i].name;
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
Size2 node_name_size = font->get_string_size(node_name);
Size2 item_size = Size2(node_icon->get_size().x + 4 + node_name_size.x, MAX(node_icon->get_size().y, node_name_size.y - 3));
@@ -3501,11 +3677,13 @@ void CanvasItemEditor::_draw_locks_and_groups(Node *p_node, const Transform2D &p
ERR_FAIL_COND(!p_node);
Node *scene = editor->get_edited_scene();
- if (p_node != scene && p_node->get_owner() != scene && !scene->is_editable_instance(p_node->get_owner()))
+ if (p_node != scene && p_node->get_owner() != scene && !scene->is_editable_instance(p_node->get_owner())) {
return;
+ }
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node);
- if (canvas_item && !canvas_item->is_visible())
+ if (canvas_item && !canvas_item->is_visible()) {
return;
+ }
Transform2D parent_xform = p_parent_xform;
Transform2D canvas_xform = p_canvas_xform;
@@ -3526,13 +3704,13 @@ void CanvasItemEditor::_draw_locks_and_groups(Node *p_node, const Transform2D &p
if (canvas_item) {
float offset = 0;
- Ref<Texture> lock = get_icon("LockViewport", "EditorIcons");
+ Ref<Texture2D> lock = get_theme_icon("LockViewport", "EditorIcons");
if (p_node->has_meta("_edit_lock_") && show_edit_locks) {
lock->draw(viewport_canvas_item, (transform * canvas_xform * parent_xform).xform(Point2(0, 0)) + Point2(offset, 0));
offset += lock->get_size().x;
}
- Ref<Texture> group = get_icon("GroupViewport", "EditorIcons");
+ Ref<Texture2D> group = get_theme_icon("GroupViewport", "EditorIcons");
if (canvas_item->has_meta("_edit_group_") && show_edit_locks) {
group->draw(viewport_canvas_item, (transform * canvas_xform * parent_xform).xform(Point2(0, 0)) + Point2(offset, 0));
//offset += group->get_size().x;
@@ -3578,7 +3756,7 @@ bool CanvasItemEditor::_build_bones_list(Node *p_node) {
// Add a last bone if the Bone2D has no Bone2D child
BoneKey bk;
bk.from = canvas_item->get_instance_id();
- bk.to = 0;
+ bk.to = ObjectID();
if (!bone_list.has(bk)) {
BoneList b;
b.length = 0;
@@ -3607,7 +3785,6 @@ bool CanvasItemEditor::_build_bones_list(Node *p_node) {
}
void CanvasItemEditor::_draw_viewport() {
-
// Update the transform
transform = Transform2D();
transform.scale_basis(Size2(zoom, zoom));
@@ -3655,7 +3832,7 @@ void CanvasItemEditor::_draw_viewport() {
}
RID ci = viewport->get_canvas_item();
- VisualServer::get_singleton()->canvas_item_add_set_transform(ci, Transform2D());
+ RenderingServer::get_singleton()->canvas_item_add_set_transform(ci, Transform2D());
EditorPluginList *over_plugin_list = editor->get_editor_plugins_over();
if (!over_plugin_list->empty()) {
@@ -3667,10 +3844,12 @@ void CanvasItemEditor::_draw_viewport() {
}
_draw_bones();
- if (show_rulers)
+ if (show_rulers) {
_draw_rulers();
- if (show_guides)
+ }
+ if (show_guides) {
_draw_guides();
+ }
_draw_smart_snapping();
_draw_focus();
_draw_hover();
@@ -3686,7 +3865,6 @@ void CanvasItemEditor::set_current_tool(Tool p_tool) {
}
void CanvasItemEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_PHYSICS_PROCESS) {
EditorNode::get_singleton()->get_scene_root()->set_snap_controls_to_pixels(GLOBAL_GET("gui/common/snap_controls_to_pixels"));
@@ -3772,10 +3950,8 @@ void CanvasItemEditor::_notification(int p_what) {
// Update the viewport if bones changes
for (Map<BoneKey, BoneList>::Element *E = bone_list.front(); E; E = E->next()) {
-
Object *b = ObjectDB::get_instance(E->key().from);
if (!b) {
-
viewport->update();
break;
}
@@ -3788,14 +3964,12 @@ void CanvasItemEditor::_notification(int p_what) {
Transform2D global_xform = b2->get_global_transform();
if (global_xform != E->get().xform) {
-
E->get().xform = global_xform;
viewport->update();
}
Bone2D *bone = Object::cast_to<Bone2D>(b);
if (bone && bone->get_default_length() != E->get().length) {
-
E->get().length = bone->get_default_length();
viewport->update();
}
@@ -3803,115 +3977,113 @@ void CanvasItemEditor::_notification(int p_what) {
}
if (p_what == NOTIFICATION_ENTER_TREE) {
-
- select_sb->set_texture(get_icon("EditorRect2D", "EditorIcons"));
+ select_sb->set_texture(get_theme_icon("EditorRect2D", "EditorIcons"));
for (int i = 0; i < 4; i++) {
select_sb->set_margin_size(Margin(i), 4);
select_sb->set_default_margin(Margin(i), 4);
}
- AnimationPlayerEditor::singleton->get_track_editor()->connect("visibility_changed", this, "_keying_changed");
+ AnimationPlayerEditor::singleton->get_track_editor()->connect("visibility_changed", callable_mp(this, &CanvasItemEditor::_keying_changed));
_keying_changed();
- get_tree()->connect("node_added", this, "_tree_changed", varray());
- get_tree()->connect("node_removed", this, "_tree_changed", varray());
+ get_tree()->connect("node_added", callable_mp(this, &CanvasItemEditor::_tree_changed), varray());
+ get_tree()->connect("node_removed", callable_mp(this, &CanvasItemEditor::_tree_changed), varray());
} else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-
- select_sb->set_texture(get_icon("EditorRect2D", "EditorIcons"));
+ select_sb->set_texture(get_theme_icon("EditorRect2D", "EditorIcons"));
}
if (p_what == NOTIFICATION_EXIT_TREE) {
- get_tree()->disconnect("node_added", this, "_tree_changed");
- get_tree()->disconnect("node_removed", this, "_tree_changed");
+ get_tree()->disconnect("node_added", callable_mp(this, &CanvasItemEditor::_tree_changed));
+ get_tree()->disconnect("node_removed", callable_mp(this, &CanvasItemEditor::_tree_changed));
}
if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
- select_button->set_icon(get_icon("ToolSelect", "EditorIcons"));
- list_select_button->set_icon(get_icon("ListSelect", "EditorIcons"));
- move_button->set_icon(get_icon("ToolMove", "EditorIcons"));
- scale_button->set_icon(get_icon("ToolScale", "EditorIcons"));
- rotate_button->set_icon(get_icon("ToolRotate", "EditorIcons"));
- smart_snap_button->set_icon(get_icon("Snap", "EditorIcons"));
- grid_snap_button->set_icon(get_icon("SnapGrid", "EditorIcons"));
- snap_config_menu->set_icon(get_icon("GuiTabMenu", "EditorIcons"));
- skeleton_menu->set_icon(get_icon("Bone", "EditorIcons"));
- override_camera_button->set_icon(get_icon("Camera2D", "EditorIcons"));
- pan_button->set_icon(get_icon("ToolPan", "EditorIcons"));
- ruler_button->set_icon(get_icon("Ruler", "EditorIcons"));
- pivot_button->set_icon(get_icon("EditPivot", "EditorIcons"));
- select_handle = get_icon("EditorHandle", "EditorIcons");
- anchor_handle = get_icon("EditorControlAnchor", "EditorIcons");
- lock_button->set_icon(get_icon("Lock", "EditorIcons"));
- unlock_button->set_icon(get_icon("Unlock", "EditorIcons"));
- group_button->set_icon(get_icon("Group", "EditorIcons"));
- ungroup_button->set_icon(get_icon("Ungroup", "EditorIcons"));
- key_loc_button->set_icon(get_icon("KeyPosition", "EditorIcons"));
- key_rot_button->set_icon(get_icon("KeyRotation", "EditorIcons"));
- key_scale_button->set_icon(get_icon("KeyScale", "EditorIcons"));
- key_insert_button->set_icon(get_icon("Key", "EditorIcons"));
- key_auto_insert_button->set_icon(get_icon("AutoKey", "EditorIcons"));
- animation_menu->set_icon(get_icon("GuiTabMenu", "EditorIcons"));
-
- zoom_minus->set_icon(get_icon("ZoomLess", "EditorIcons"));
- zoom_plus->set_icon(get_icon("ZoomMore", "EditorIcons"));
-
- presets_menu->set_icon(get_icon("ControlLayout", "EditorIcons"));
+ select_button->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ list_select_button->set_icon(get_theme_icon("ListSelect", "EditorIcons"));
+ move_button->set_icon(get_theme_icon("ToolMove", "EditorIcons"));
+ scale_button->set_icon(get_theme_icon("ToolScale", "EditorIcons"));
+ rotate_button->set_icon(get_theme_icon("ToolRotate", "EditorIcons"));
+ smart_snap_button->set_icon(get_theme_icon("Snap", "EditorIcons"));
+ grid_snap_button->set_icon(get_theme_icon("SnapGrid", "EditorIcons"));
+ snap_config_menu->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons"));
+ skeleton_menu->set_icon(get_theme_icon("Bone", "EditorIcons"));
+ override_camera_button->set_icon(get_theme_icon("Camera2D", "EditorIcons"));
+ pan_button->set_icon(get_theme_icon("ToolPan", "EditorIcons"));
+ ruler_button->set_icon(get_theme_icon("Ruler", "EditorIcons"));
+ pivot_button->set_icon(get_theme_icon("EditPivot", "EditorIcons"));
+ select_handle = get_theme_icon("EditorHandle", "EditorIcons");
+ anchor_handle = get_theme_icon("EditorControlAnchor", "EditorIcons");
+ lock_button->set_icon(get_theme_icon("Lock", "EditorIcons"));
+ unlock_button->set_icon(get_theme_icon("Unlock", "EditorIcons"));
+ group_button->set_icon(get_theme_icon("Group", "EditorIcons"));
+ ungroup_button->set_icon(get_theme_icon("Ungroup", "EditorIcons"));
+ key_loc_button->set_icon(get_theme_icon("KeyPosition", "EditorIcons"));
+ key_rot_button->set_icon(get_theme_icon("KeyRotation", "EditorIcons"));
+ key_scale_button->set_icon(get_theme_icon("KeyScale", "EditorIcons"));
+ key_insert_button->set_icon(get_theme_icon("Key", "EditorIcons"));
+ key_auto_insert_button->set_icon(get_theme_icon("AutoKey", "EditorIcons"));
+ animation_menu->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons"));
+
+ zoom_minus->set_icon(get_theme_icon("ZoomLess", "EditorIcons"));
+ zoom_plus->set_icon(get_theme_icon("ZoomMore", "EditorIcons"));
+
+ presets_menu->set_icon(get_theme_icon("ControlLayout", "EditorIcons"));
PopupMenu *p = presets_menu->get_popup();
p->clear();
- p->add_icon_item(get_icon("ControlAlignTopLeft", "EditorIcons"), TTR("Top Left"), ANCHORS_AND_MARGINS_PRESET_TOP_LEFT);
- p->add_icon_item(get_icon("ControlAlignTopRight", "EditorIcons"), TTR("Top Right"), ANCHORS_AND_MARGINS_PRESET_TOP_RIGHT);
- p->add_icon_item(get_icon("ControlAlignBottomRight", "EditorIcons"), TTR("Bottom Right"), ANCHORS_AND_MARGINS_PRESET_BOTTOM_RIGHT);
- p->add_icon_item(get_icon("ControlAlignBottomLeft", "EditorIcons"), TTR("Bottom Left"), ANCHORS_AND_MARGINS_PRESET_BOTTOM_LEFT);
+ p->add_icon_item(get_theme_icon("ControlAlignTopLeft", "EditorIcons"), TTR("Top Left"), ANCHORS_AND_MARGINS_PRESET_TOP_LEFT);
+ p->add_icon_item(get_theme_icon("ControlAlignTopRight", "EditorIcons"), TTR("Top Right"), ANCHORS_AND_MARGINS_PRESET_TOP_RIGHT);
+ p->add_icon_item(get_theme_icon("ControlAlignBottomRight", "EditorIcons"), TTR("Bottom Right"), ANCHORS_AND_MARGINS_PRESET_BOTTOM_RIGHT);
+ p->add_icon_item(get_theme_icon("ControlAlignBottomLeft", "EditorIcons"), TTR("Bottom Left"), ANCHORS_AND_MARGINS_PRESET_BOTTOM_LEFT);
p->add_separator();
- p->add_icon_item(get_icon("ControlAlignLeftCenter", "EditorIcons"), TTR("Center Left"), ANCHORS_AND_MARGINS_PRESET_CENTER_LEFT);
- p->add_icon_item(get_icon("ControlAlignTopCenter", "EditorIcons"), TTR("Center Top"), ANCHORS_AND_MARGINS_PRESET_CENTER_TOP);
- p->add_icon_item(get_icon("ControlAlignRightCenter", "EditorIcons"), TTR("Center Right"), ANCHORS_AND_MARGINS_PRESET_CENTER_RIGHT);
- p->add_icon_item(get_icon("ControlAlignBottomCenter", "EditorIcons"), TTR("Center Bottom"), ANCHORS_AND_MARGINS_PRESET_CENTER_BOTTOM);
- p->add_icon_item(get_icon("ControlAlignCenter", "EditorIcons"), TTR("Center"), ANCHORS_AND_MARGINS_PRESET_CENTER);
+ p->add_icon_item(get_theme_icon("ControlAlignLeftCenter", "EditorIcons"), TTR("Center Left"), ANCHORS_AND_MARGINS_PRESET_CENTER_LEFT);
+ p->add_icon_item(get_theme_icon("ControlAlignTopCenter", "EditorIcons"), TTR("Center Top"), ANCHORS_AND_MARGINS_PRESET_CENTER_TOP);
+ p->add_icon_item(get_theme_icon("ControlAlignRightCenter", "EditorIcons"), TTR("Center Right"), ANCHORS_AND_MARGINS_PRESET_CENTER_RIGHT);
+ p->add_icon_item(get_theme_icon("ControlAlignBottomCenter", "EditorIcons"), TTR("Center Bottom"), ANCHORS_AND_MARGINS_PRESET_CENTER_BOTTOM);
+ p->add_icon_item(get_theme_icon("ControlAlignCenter", "EditorIcons"), TTR("Center"), ANCHORS_AND_MARGINS_PRESET_CENTER);
p->add_separator();
- p->add_icon_item(get_icon("ControlAlignLeftWide", "EditorIcons"), TTR("Left Wide"), ANCHORS_AND_MARGINS_PRESET_LEFT_WIDE);
- p->add_icon_item(get_icon("ControlAlignTopWide", "EditorIcons"), TTR("Top Wide"), ANCHORS_AND_MARGINS_PRESET_TOP_WIDE);
- p->add_icon_item(get_icon("ControlAlignRightWide", "EditorIcons"), TTR("Right Wide"), ANCHORS_AND_MARGINS_PRESET_RIGHT_WIDE);
- p->add_icon_item(get_icon("ControlAlignBottomWide", "EditorIcons"), TTR("Bottom Wide"), ANCHORS_AND_MARGINS_PRESET_BOTTOM_WIDE);
- p->add_icon_item(get_icon("ControlVcenterWide", "EditorIcons"), TTR("VCenter Wide"), ANCHORS_AND_MARGINS_PRESET_VCENTER_WIDE);
- p->add_icon_item(get_icon("ControlHcenterWide", "EditorIcons"), TTR("HCenter Wide"), ANCHORS_AND_MARGINS_PRESET_HCENTER_WIDE);
+ p->add_icon_item(get_theme_icon("ControlAlignLeftWide", "EditorIcons"), TTR("Left Wide"), ANCHORS_AND_MARGINS_PRESET_LEFT_WIDE);
+ p->add_icon_item(get_theme_icon("ControlAlignTopWide", "EditorIcons"), TTR("Top Wide"), ANCHORS_AND_MARGINS_PRESET_TOP_WIDE);
+ p->add_icon_item(get_theme_icon("ControlAlignRightWide", "EditorIcons"), TTR("Right Wide"), ANCHORS_AND_MARGINS_PRESET_RIGHT_WIDE);
+ p->add_icon_item(get_theme_icon("ControlAlignBottomWide", "EditorIcons"), TTR("Bottom Wide"), ANCHORS_AND_MARGINS_PRESET_BOTTOM_WIDE);
+ p->add_icon_item(get_theme_icon("ControlVcenterWide", "EditorIcons"), TTR("VCenter Wide"), ANCHORS_AND_MARGINS_PRESET_VCENTER_WIDE);
+ p->add_icon_item(get_theme_icon("ControlHcenterWide", "EditorIcons"), TTR("HCenter Wide"), ANCHORS_AND_MARGINS_PRESET_HCENTER_WIDE);
p->add_separator();
- p->add_icon_item(get_icon("ControlAlignWide", "EditorIcons"), TTR("Full Rect"), ANCHORS_AND_MARGINS_PRESET_WIDE);
- p->add_icon_item(get_icon("Anchor", "EditorIcons"), TTR("Keep Ratio"), ANCHORS_AND_MARGINS_PRESET_KEEP_RATIO);
+ p->add_icon_item(get_theme_icon("ControlAlignWide", "EditorIcons"), TTR("Full Rect"), ANCHORS_AND_MARGINS_PRESET_WIDE);
+ p->add_icon_item(get_theme_icon("Anchor", "EditorIcons"), TTR("Keep Ratio"), ANCHORS_AND_MARGINS_PRESET_KEEP_RATIO);
p->add_separator();
p->add_submenu_item(TTR("Anchors only"), "Anchors");
- p->set_item_icon(21, get_icon("Anchor", "EditorIcons"));
+ p->set_item_icon(21, get_theme_icon("Anchor", "EditorIcons"));
anchors_popup->clear();
- anchors_popup->add_icon_item(get_icon("ControlAlignTopLeft", "EditorIcons"), TTR("Top Left"), ANCHORS_PRESET_TOP_LEFT);
- anchors_popup->add_icon_item(get_icon("ControlAlignTopRight", "EditorIcons"), TTR("Top Right"), ANCHORS_PRESET_TOP_RIGHT);
- anchors_popup->add_icon_item(get_icon("ControlAlignBottomRight", "EditorIcons"), TTR("Bottom Right"), ANCHORS_PRESET_BOTTOM_RIGHT);
- anchors_popup->add_icon_item(get_icon("ControlAlignBottomLeft", "EditorIcons"), TTR("Bottom Left"), ANCHORS_PRESET_BOTTOM_LEFT);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignTopLeft", "EditorIcons"), TTR("Top Left"), ANCHORS_PRESET_TOP_LEFT);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignTopRight", "EditorIcons"), TTR("Top Right"), ANCHORS_PRESET_TOP_RIGHT);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignBottomRight", "EditorIcons"), TTR("Bottom Right"), ANCHORS_PRESET_BOTTOM_RIGHT);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignBottomLeft", "EditorIcons"), TTR("Bottom Left"), ANCHORS_PRESET_BOTTOM_LEFT);
anchors_popup->add_separator();
- anchors_popup->add_icon_item(get_icon("ControlAlignLeftCenter", "EditorIcons"), TTR("Center Left"), ANCHORS_PRESET_CENTER_LEFT);
- anchors_popup->add_icon_item(get_icon("ControlAlignTopCenter", "EditorIcons"), TTR("Center Top"), ANCHORS_PRESET_CENTER_TOP);
- anchors_popup->add_icon_item(get_icon("ControlAlignRightCenter", "EditorIcons"), TTR("Center Right"), ANCHORS_PRESET_CENTER_RIGHT);
- anchors_popup->add_icon_item(get_icon("ControlAlignBottomCenter", "EditorIcons"), TTR("Center Bottom"), ANCHORS_PRESET_CENTER_BOTTOM);
- anchors_popup->add_icon_item(get_icon("ControlAlignCenter", "EditorIcons"), TTR("Center"), ANCHORS_PRESET_CENTER);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignLeftCenter", "EditorIcons"), TTR("Center Left"), ANCHORS_PRESET_CENTER_LEFT);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignTopCenter", "EditorIcons"), TTR("Center Top"), ANCHORS_PRESET_CENTER_TOP);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignRightCenter", "EditorIcons"), TTR("Center Right"), ANCHORS_PRESET_CENTER_RIGHT);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignBottomCenter", "EditorIcons"), TTR("Center Bottom"), ANCHORS_PRESET_CENTER_BOTTOM);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignCenter", "EditorIcons"), TTR("Center"), ANCHORS_PRESET_CENTER);
anchors_popup->add_separator();
- anchors_popup->add_icon_item(get_icon("ControlAlignLeftWide", "EditorIcons"), TTR("Left Wide"), ANCHORS_PRESET_LEFT_WIDE);
- anchors_popup->add_icon_item(get_icon("ControlAlignTopWide", "EditorIcons"), TTR("Top Wide"), ANCHORS_PRESET_TOP_WIDE);
- anchors_popup->add_icon_item(get_icon("ControlAlignRightWide", "EditorIcons"), TTR("Right Wide"), ANCHORS_PRESET_RIGHT_WIDE);
- anchors_popup->add_icon_item(get_icon("ControlAlignBottomWide", "EditorIcons"), TTR("Bottom Wide"), ANCHORS_PRESET_BOTTOM_WIDE);
- anchors_popup->add_icon_item(get_icon("ControlVcenterWide", "EditorIcons"), TTR("VCenter Wide"), ANCHORS_PRESET_VCENTER_WIDE);
- anchors_popup->add_icon_item(get_icon("ControlHcenterWide", "EditorIcons"), TTR("HCenter Wide"), ANCHORS_PRESET_HCENTER_WIDE);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignLeftWide", "EditorIcons"), TTR("Left Wide"), ANCHORS_PRESET_LEFT_WIDE);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignTopWide", "EditorIcons"), TTR("Top Wide"), ANCHORS_PRESET_TOP_WIDE);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignRightWide", "EditorIcons"), TTR("Right Wide"), ANCHORS_PRESET_RIGHT_WIDE);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignBottomWide", "EditorIcons"), TTR("Bottom Wide"), ANCHORS_PRESET_BOTTOM_WIDE);
+ anchors_popup->add_icon_item(get_theme_icon("ControlVcenterWide", "EditorIcons"), TTR("VCenter Wide"), ANCHORS_PRESET_VCENTER_WIDE);
+ anchors_popup->add_icon_item(get_theme_icon("ControlHcenterWide", "EditorIcons"), TTR("HCenter Wide"), ANCHORS_PRESET_HCENTER_WIDE);
anchors_popup->add_separator();
- anchors_popup->add_icon_item(get_icon("ControlAlignWide", "EditorIcons"), TTR("Full Rect"), ANCHORS_PRESET_WIDE);
+ anchors_popup->add_icon_item(get_theme_icon("ControlAlignWide", "EditorIcons"), TTR("Full Rect"), ANCHORS_PRESET_WIDE);
- anchor_mode_button->set_icon(get_icon("Anchor", "EditorIcons"));
+ anchor_mode_button->set_icon(get_theme_icon("Anchor", "EditorIcons"));
}
if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
if (!is_visible() && override_camera_button->is_pressed()) {
- ScriptEditorDebugger *debugger = ScriptEditor::get_singleton()->get_debugger();
+ EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE);
override_camera_button->set_pressed(false);
}
}
@@ -3924,10 +4096,12 @@ void CanvasItemEditor::_selection_changed() {
List<Node *> selection = editor_selection->get_selected_node_list();
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
Control *control = Object::cast_to<Control>(E->get());
- if (!control)
+ if (!control) {
continue;
- if (Object::cast_to<Container>(control->get_parent()))
+ }
+ if (Object::cast_to<Container>(control->get_parent())) {
continue;
+ }
nbValidControls++;
if (control->has_meta("_edit_use_anchors_") && control->get_meta("_edit_use_anchors_")) {
@@ -3944,7 +4118,6 @@ void CanvasItemEditor::_selection_changed() {
}
void CanvasItemEditor::edit(CanvasItem *p_canvas_item) {
-
Array selection = editor_selection->get_selected_nodes();
if (selection.size() != 1 || (Node *)selection[0] != p_canvas_item) {
drag_type = DRAG_NONE;
@@ -3956,16 +4129,15 @@ void CanvasItemEditor::edit(CanvasItem *p_canvas_item) {
}
void CanvasItemEditor::_queue_update_bone_list() {
-
- if (bone_list_dirty)
+ if (bone_list_dirty) {
return;
+ }
call_deferred("_update_bone_list");
bone_list_dirty = true;
}
void CanvasItemEditor::_update_bone_list() {
-
bone_last_frame++;
if (editor->get_edited_scene()) {
@@ -3997,7 +4169,6 @@ void CanvasItemEditor::_tree_changed(Node *) {
}
void CanvasItemEditor::_update_scrollbars() {
-
updating_scroll = true;
// Move the zoom buttons.
@@ -4100,7 +4271,7 @@ void CanvasItemEditor::_popup_warning_temporarily(Control *p_control, const floa
Timer *timer;
if (!popup_temporarily_timers.has(p_control)) {
timer = memnew(Timer);
- timer->connect("timeout", this, "_popup_warning_depop", varray(p_control));
+ timer->connect("timeout", callable_mp(this, &CanvasItemEditor::_popup_warning_depop), varray(p_control));
timer->set_one_shot(true);
add_child(timer);
@@ -4115,9 +4286,9 @@ void CanvasItemEditor::_popup_warning_temporarily(Control *p_control, const floa
}
void CanvasItemEditor::_update_scroll(float) {
-
- if (updating_scroll)
+ if (updating_scroll) {
return;
+ }
view_offset.x = h_scroll->get_value();
view_offset.y = v_scroll->get_value();
@@ -4130,7 +4301,6 @@ void CanvasItemEditor::_set_anchors_and_margins_preset(Control::LayoutPreset p_p
undo_redo->create_action(TTR("Change Anchors and Margins"));
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
Control *control = Object::cast_to<Control>(E->get());
if (control) {
undo_redo->add_do_method(control, "set_anchors_preset", p_preset);
@@ -4172,7 +4342,6 @@ void CanvasItemEditor::_set_anchors_and_margins_to_keep_ratio() {
undo_redo->create_action(TTR("Change Anchors and Margins"));
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
Control *control = Object::cast_to<Control>(E->get());
if (control) {
Point2 top_left_anchor = _position_to_anchor(control, Point2());
@@ -4200,7 +4369,6 @@ void CanvasItemEditor::_set_anchors_preset(Control::LayoutPreset p_preset) {
undo_redo->create_action(TTR("Change Anchors"));
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
Control *control = Object::cast_to<Control>(E->get());
if (control) {
undo_redo->add_do_method(control, "set_anchors_preset", p_preset);
@@ -4211,16 +4379,56 @@ void CanvasItemEditor::_set_anchors_preset(Control::LayoutPreset p_preset) {
undo_redo->commit_action();
}
+float CanvasItemEditor::_get_next_zoom_value(int p_increment_count) const {
+ // Base increment factor defined as the twelveth root of two.
+ // This allow a smooth geometric evolution of the zoom, with the advantage of
+ // visiting all integer power of two scale factors.
+ // note: this is analogous to the 'semitones' interval in the music world
+ // In order to avoid numerical imprecisions, we compute and edit a zoom index
+ // with the following relation: zoom = 2 ^ (index / 12)
+
+ if (zoom < CMP_EPSILON || p_increment_count == 0) {
+ return 1.f;
+ }
+
+ // Remove Editor scale from the index computation
+ float zoom_noscale = zoom / MAX(1, EDSCALE);
+
+ // zoom = 2**(index/12) => log2(zoom) = index/12
+ float closest_zoom_index = Math::round(Math::log(zoom_noscale) * 12.f / Math::log(2.f));
+
+ float new_zoom_index = closest_zoom_index + p_increment_count;
+ float new_zoom = Math::pow(2.f, new_zoom_index / 12.f);
+
+ // Restore Editor scale transformation
+ new_zoom *= MAX(1, EDSCALE);
+
+ return new_zoom;
+}
+
void CanvasItemEditor::_zoom_on_position(float p_zoom, Point2 p_position) {
- if (p_zoom < MIN_ZOOM || p_zoom > MAX_ZOOM)
+ p_zoom = CLAMP(p_zoom, MIN_ZOOM, MAX_ZOOM);
+
+ if (p_zoom == zoom) {
return;
+ }
float prev_zoom = zoom;
zoom = p_zoom;
- Point2 ofs = p_position;
- ofs = ofs / prev_zoom - ofs / zoom;
- view_offset.x = Math::round(view_offset.x + ofs.x);
- view_offset.y = Math::round(view_offset.y + ofs.y);
+
+ view_offset += p_position / prev_zoom - p_position / zoom;
+
+ // We want to align in-scene pixels to screen pixels, this prevents blurry rendering
+ // in small details (texts, lines).
+ // This correction adds a jitter movement when zooming, so we correct only when the
+ // zoom factor is an integer. (in the other cases, all pixels won't be aligned anyway)
+ float closest_zoom_factor = Math::round(zoom);
+ if (Math::is_zero_approx(zoom - closest_zoom_factor)) {
+ // make sure scene pixel at view_offset is aligned on a screen pixel
+ Vector2 view_offset_int = view_offset.floor();
+ Vector2 view_offset_frac = view_offset - view_offset_int;
+ view_offset = view_offset_int + (view_offset_frac * closest_zoom_factor).round() / closest_zoom_factor;
+ }
_update_zoom_label();
update_viewport();
@@ -4243,7 +4451,7 @@ void CanvasItemEditor::_update_zoom_label() {
}
void CanvasItemEditor::_button_zoom_minus() {
- _zoom_on_position(zoom / Math_SQRT2, viewport_scrollable->get_size() / 2.0);
+ _zoom_on_position(_get_next_zoom_value(-6), viewport_scrollable->get_size() / 2.0);
}
void CanvasItemEditor::_button_zoom_reset() {
@@ -4251,7 +4459,7 @@ void CanvasItemEditor::_button_zoom_reset() {
}
void CanvasItemEditor::_button_zoom_plus() {
- _zoom_on_position(zoom * Math_SQRT2, viewport_scrollable->get_size() / 2.0);
+ _zoom_on_position(_get_next_zoom_value(6), viewport_scrollable->get_size() / 2.0);
}
void CanvasItemEditor::_button_toggle_smart_snap(bool p_status) {
@@ -4263,49 +4471,58 @@ void CanvasItemEditor::_button_toggle_grid_snap(bool p_status) {
grid_snap_active = p_status;
viewport->update();
}
+
void CanvasItemEditor::_button_override_camera(bool p_pressed) {
- ScriptEditorDebugger *debugger = ScriptEditor::get_singleton()->get_debugger();
+ EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
if (p_pressed) {
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_2D);
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_2D);
} else {
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE);
}
}
void CanvasItemEditor::_button_tool_select(int p_index) {
-
- ToolButton *tb[TOOL_MAX] = { select_button, list_select_button, move_button, scale_button, rotate_button, pivot_button, pan_button, ruler_button };
+ Button *tb[TOOL_MAX] = { select_button, list_select_button, move_button, scale_button, rotate_button, pivot_button, pan_button, ruler_button };
for (int i = 0; i < TOOL_MAX; i++) {
tb[i]->set_pressed(i == p_index);
}
tool = (Tool)p_index;
+
viewport->update();
+ _update_cursor();
+
+ // Request immediate refresh of cursor when using hot-keys to switch between tools
+ DisplayServer::CursorShape ds_cursor_shape = (DisplayServer::CursorShape)viewport->get_default_cursor_shape();
+ DisplayServer::get_singleton()->cursor_set_shape(ds_cursor_shape);
}
void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, bool p_scale, bool p_on_existing) {
-
Map<Node *, Object *> &selection = editor_selection->get_selection();
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
- if (!canvas_item || !canvas_item->is_visible_in_tree())
+ if (!canvas_item || !canvas_item->is_visible_in_tree()) {
continue;
+ }
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
+ }
if (Object::cast_to<Node2D>(canvas_item)) {
Node2D *n2d = Object::cast_to<Node2D>(canvas_item);
- if (key_pos && p_location)
+ if (key_pos && p_location) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(n2d, "position", n2d->get_position(), p_on_existing);
- if (key_rot && p_rotation)
+ }
+ if (key_rot && p_rotation) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(n2d, "rotation_degrees", Math::rad2deg(n2d->get_rotation()), p_on_existing);
- if (key_scale && p_scale)
+ }
+ if (key_scale && p_scale) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(n2d, "scale", n2d->get_scale(), p_on_existing);
+ }
if (n2d->has_meta("_edit_bone_") && n2d->get_parent_item()) {
//look for an IK chain
@@ -4315,42 +4532,45 @@ void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation,
bool has_chain = false;
while (n) {
-
ik_chain.push_back(n);
if (n->has_meta("_edit_ik_")) {
has_chain = true;
break;
}
- if (!n->get_parent_item())
+ if (!n->get_parent_item()) {
break;
+ }
n = Object::cast_to<Node2D>(n->get_parent_item());
}
if (has_chain && ik_chain.size()) {
-
for (List<Node2D *>::Element *F = ik_chain.front(); F; F = F->next()) {
-
- if (key_pos)
+ if (key_pos) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(F->get(), "position", F->get()->get_position(), p_on_existing);
- if (key_rot)
+ }
+ if (key_rot) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(F->get(), "rotation_degrees", Math::rad2deg(F->get()->get_rotation()), p_on_existing);
- if (key_scale)
+ }
+ if (key_scale) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(F->get(), "scale", F->get()->get_scale(), p_on_existing);
+ }
}
}
}
} else if (Object::cast_to<Control>(canvas_item)) {
-
Control *ctrl = Object::cast_to<Control>(canvas_item);
- if (key_pos)
+ if (key_pos) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl, "rect_position", ctrl->get_position(), p_on_existing);
- if (key_rot)
+ }
+ if (key_rot) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl, "rect_rotation", ctrl->get_rotation_degrees(), p_on_existing);
- if (key_scale)
+ }
+ if (key_scale) {
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl, "rect_size", ctrl->get_size(), p_on_existing);
+ }
}
}
}
@@ -4359,8 +4579,9 @@ void CanvasItemEditor::_button_toggle_anchor_mode(bool p_status) {
List<CanvasItem *> selection = _get_edited_canvas_items(false, false);
for (List<CanvasItem *>::Element *E = selection.front(); E; E = E->next()) {
Control *control = Object::cast_to<Control>(E->get());
- if (!control || Object::cast_to<Container>(control->get_parent()))
+ if (!control || Object::cast_to<Container>(control->get_parent())) {
continue;
+ }
control->set_meta("_edit_use_anchors_", p_status);
}
@@ -4381,10 +4602,8 @@ void CanvasItemEditor::_update_override_camera_button(bool p_game_running) {
}
void CanvasItemEditor::_popup_callback(int p_op) {
-
last_option = MenuOption(p_op);
switch (p_op) {
-
case SHOW_GRID: {
show_grid = !show_grid;
int idx = view_menu->get_popup()->get_item_index(SHOW_GRID);
@@ -4409,6 +4628,12 @@ void CanvasItemEditor::_popup_callback(int p_op) {
view_menu->get_popup()->set_item_checked(idx, show_edit_locks);
viewport->update();
} break;
+ case SHOW_TRANSFORMATION_GIZMOS: {
+ show_transformation_gizmos = !show_transformation_gizmos;
+ int idx = view_menu->get_popup()->get_item_index(SHOW_TRANSFORMATION_GIZMOS);
+ view_menu->get_popup()->set_item_checked(idx, show_transformation_gizmos);
+ viewport->update();
+ } break;
case SNAP_USE_NODE_PARENT: {
snap_node_parent = !snap_node_parent;
int idx = smartsnap_config_popup->get_item_index(SNAP_USE_NODE_PARENT);
@@ -4495,10 +4720,12 @@ void CanvasItemEditor::_popup_callback(int p_op) {
List<Node *> selection = editor_selection->get_selected_node_list();
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get());
- if (!canvas_item || !canvas_item->is_inside_tree())
+ if (!canvas_item || !canvas_item->is_inside_tree()) {
continue;
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ }
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
+ }
undo_redo->add_do_method(canvas_item, "set_meta", "_edit_lock_", true);
undo_redo->add_undo_method(canvas_item, "remove_meta", "_edit_lock_");
@@ -4515,10 +4742,12 @@ void CanvasItemEditor::_popup_callback(int p_op) {
List<Node *> selection = editor_selection->get_selected_node_list();
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get());
- if (!canvas_item || !canvas_item->is_inside_tree())
+ if (!canvas_item || !canvas_item->is_inside_tree()) {
continue;
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ }
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
+ }
undo_redo->add_do_method(canvas_item, "remove_meta", "_edit_lock_");
undo_redo->add_undo_method(canvas_item, "set_meta", "_edit_lock_", true);
@@ -4535,10 +4764,12 @@ void CanvasItemEditor::_popup_callback(int p_op) {
List<Node *> selection = editor_selection->get_selected_node_list();
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get());
- if (!canvas_item || !canvas_item->is_inside_tree())
+ if (!canvas_item || !canvas_item->is_inside_tree()) {
continue;
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ }
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
+ }
undo_redo->add_do_method(canvas_item, "set_meta", "_edit_group_", true);
undo_redo->add_undo_method(canvas_item, "remove_meta", "_edit_group_");
@@ -4555,10 +4786,12 @@ void CanvasItemEditor::_popup_callback(int p_op) {
List<Node *> selection = editor_selection->get_selected_node_list();
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get());
- if (!canvas_item || !canvas_item->is_inside_tree())
+ if (!canvas_item || !canvas_item->is_inside_tree()) {
continue;
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ }
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
+ }
undo_redo->add_do_method(canvas_item, "remove_meta", "_edit_group_");
undo_redo->add_undo_method(canvas_item, "set_meta", "_edit_group_", true);
@@ -4672,41 +4905,36 @@ void CanvasItemEditor::_popup_callback(int p_op) {
case ANIM_INSERT_KEY:
case ANIM_INSERT_KEY_EXISTING: {
-
bool existing = p_op == ANIM_INSERT_KEY_EXISTING;
_insert_animation_keys(true, true, true, existing);
} break;
case ANIM_INSERT_POS: {
-
key_pos = key_loc_button->is_pressed();
} break;
case ANIM_INSERT_ROT: {
-
key_rot = key_rot_button->is_pressed();
} break;
case ANIM_INSERT_SCALE: {
-
key_scale = key_scale_button->is_pressed();
} break;
case ANIM_COPY_POSE: {
-
pose_clipboard.clear();
Map<Node *, Object *> &selection = editor_selection->get_selection();
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
- if (!canvas_item || !canvas_item->is_visible_in_tree())
+ if (!canvas_item || !canvas_item->is_visible_in_tree()) {
continue;
+ }
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
+ }
if (Object::cast_to<Node2D>(canvas_item)) {
-
Node2D *n2d = Object::cast_to<Node2D>(canvas_item);
PoseClipboard pc;
pc.pos = n2d->get_position();
@@ -4719,16 +4947,16 @@ void CanvasItemEditor::_popup_callback(int p_op) {
} break;
case ANIM_PASTE_POSE: {
-
- if (!pose_clipboard.size())
+ if (!pose_clipboard.size()) {
break;
+ }
undo_redo->create_action(TTR("Paste Pose"));
for (List<PoseClipboard>::Element *E = pose_clipboard.front(); E; E = E->next()) {
-
Node2D *n2d = Object::cast_to<Node2D>(ObjectDB::get_instance(E->get().id));
- if (!n2d)
+ if (!n2d) {
continue;
+ }
undo_redo->add_do_method(n2d, "set_position", E->get().pos);
undo_redo->add_do_method(n2d, "set_rotation", E->get().rot);
undo_redo->add_do_method(n2d, "set_scale", E->get().scale);
@@ -4740,33 +4968,36 @@ void CanvasItemEditor::_popup_callback(int p_op) {
} break;
case ANIM_CLEAR_POSE: {
-
Map<Node *, Object *> &selection = editor_selection->get_selection();
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
- if (!canvas_item || !canvas_item->is_visible_in_tree())
+ if (!canvas_item || !canvas_item->is_visible_in_tree()) {
continue;
+ }
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
+ }
if (Object::cast_to<Node2D>(canvas_item)) {
Node2D *n2d = Object::cast_to<Node2D>(canvas_item);
- if (key_pos)
+ if (key_pos) {
n2d->set_position(Vector2());
- if (key_rot)
+ }
+ if (key_rot) {
n2d->set_rotation(0);
- if (key_scale)
+ }
+ if (key_scale) {
n2d->set_scale(Vector2(1, 1));
+ }
} else if (Object::cast_to<Control>(canvas_item)) {
-
Control *ctrl = Object::cast_to<Control>(canvas_item);
- if (key_pos)
+ if (key_pos) {
ctrl->set_position(Point2());
+ }
/*
if (key_scale)
AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl,"rect/size",ctrl->get_size());
@@ -4776,7 +5007,6 @@ void CanvasItemEditor::_popup_callback(int p_op) {
} break;
case CLEAR_GUIDES: {
-
Node *const root = EditorNode::get_singleton()->get_edited_scene();
if (root && (root->has_meta("_edit_horizontal_guides_") || root->has_meta("_edit_vertical_guides_"))) {
@@ -4800,34 +5030,34 @@ void CanvasItemEditor::_popup_callback(int p_op) {
} break;
case VIEW_CENTER_TO_SELECTION:
case VIEW_FRAME_TO_SELECTION: {
-
_focus_selection(p_op);
} break;
case PREVIEW_CANVAS_SCALE: {
-
bool preview = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(PREVIEW_CANVAS_SCALE));
preview = !preview;
- VS::get_singleton()->canvas_set_disable_scale(!preview);
+ RS::get_singleton()->canvas_set_disable_scale(!preview);
view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(PREVIEW_CANVAS_SCALE), preview);
} break;
case SKELETON_MAKE_BONES: {
-
Map<Node *, Object *> &selection = editor_selection->get_selection();
undo_redo->create_action(TTR("Create Custom Bone(s) from Node(s)"));
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
Node2D *n2d = Object::cast_to<Node2D>(E->key());
- if (!n2d)
+ if (!n2d) {
continue;
- if (!n2d->is_visible_in_tree())
+ }
+ if (!n2d->is_visible_in_tree()) {
continue;
- if (!n2d->get_parent_item())
+ }
+ if (!n2d->get_parent_item()) {
continue;
- if (n2d->has_meta("_edit_bone_") && n2d->get_meta("_edit_bone_"))
+ }
+ if (n2d->has_meta("_edit_bone_") && n2d->get_meta("_edit_bone_")) {
continue;
+ }
undo_redo->add_do_method(n2d, "set_meta", "_edit_bone_", true);
undo_redo->add_undo_method(n2d, "remove_meta", "_edit_bone_");
@@ -4840,19 +5070,20 @@ void CanvasItemEditor::_popup_callback(int p_op) {
} break;
case SKELETON_CLEAR_BONES: {
-
Map<Node *, Object *> &selection = editor_selection->get_selection();
undo_redo->create_action(TTR("Clear Bones"));
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
Node2D *n2d = Object::cast_to<Node2D>(E->key());
- if (!n2d)
+ if (!n2d) {
continue;
- if (!n2d->is_visible_in_tree())
+ }
+ if (!n2d->is_visible_in_tree()) {
continue;
- if (!n2d->has_meta("_edit_bone_"))
+ }
+ if (!n2d->has_meta("_edit_bone_")) {
continue;
+ }
undo_redo->add_do_method(n2d, "remove_meta", "_edit_bone_");
undo_redo->add_undo_method(n2d, "set_meta", "_edit_bone_", n2d->get_meta("_edit_bone_"));
@@ -4865,19 +5096,20 @@ void CanvasItemEditor::_popup_callback(int p_op) {
} break;
case SKELETON_SET_IK_CHAIN: {
-
List<Node *> selection = editor_selection->get_selected_node_list();
undo_redo->create_action(TTR("Make IK Chain"));
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get());
- if (!canvas_item || !canvas_item->is_visible_in_tree())
+ if (!canvas_item || !canvas_item->is_visible_in_tree()) {
continue;
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ }
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
continue;
- if (canvas_item->has_meta("_edit_ik_") && canvas_item->get_meta("_edit_ik_"))
+ }
+ if (canvas_item->has_meta("_edit_ik_") && canvas_item->get_meta("_edit_ik_")) {
continue;
+ }
undo_redo->add_do_method(canvas_item, "set_meta", "_edit_ik_", true);
undo_redo->add_undo_method(canvas_item, "remove_meta", "_edit_ik_");
@@ -4888,19 +5120,20 @@ void CanvasItemEditor::_popup_callback(int p_op) {
} break;
case SKELETON_CLEAR_IK_CHAIN: {
-
Map<Node *, Object *> &selection = editor_selection->get_selection();
undo_redo->create_action(TTR("Clear IK Chain"));
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
CanvasItem *n2d = Object::cast_to<CanvasItem>(E->key());
- if (!n2d)
+ if (!n2d) {
continue;
- if (!n2d->is_visible_in_tree())
+ }
+ if (!n2d->is_visible_in_tree()) {
continue;
- if (!n2d->has_meta("_edit_ik_"))
+ }
+ if (!n2d->has_meta("_edit_ik_")) {
continue;
+ }
undo_redo->add_do_method(n2d, "remove_meta", "_edit_ik_");
undo_redo->add_undo_method(n2d, "set_meta", "_edit_ik_", n2d->get_meta("_edit_ik_"));
@@ -4921,9 +5154,12 @@ void CanvasItemEditor::_focus_selection(int p_op) {
Map<Node *, Object *> &selection = editor_selection->get_selection();
for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
- if (!canvas_item) continue;
- if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root())
+ if (!canvas_item) {
continue;
+ }
+ if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
+ continue;
+ }
// counting invisible items, for now
//if (!canvas_item->is_visible_in_tree()) continue;
@@ -4949,10 +5185,11 @@ void CanvasItemEditor::_focus_selection(int p_op) {
rect = rect.merge(canvas_item_rect);
}
};
- if (count == 0) return;
+ if (count == 0) {
+ return;
+ }
if (p_op == VIEW_CENTER_TO_SELECTION) {
-
center = rect.position + rect.size / 2;
Vector2 offset = viewport->get_size() / 2 - editor->get_scene_root()->get_global_canvas_transform().xform(center);
view_offset.x -= Math::round(offset.x / zoom);
@@ -4967,38 +5204,18 @@ void CanvasItemEditor::_focus_selection(int p_op) {
zoom = scale_x < scale_y ? scale_x : scale_y;
zoom *= 0.90;
viewport->update();
+ _update_zoom_label();
call_deferred("_popup_callback", VIEW_CENTER_TO_SELECTION);
}
}
}
void CanvasItemEditor::_bind_methods() {
-
- ClassDB::bind_method("_button_zoom_minus", &CanvasItemEditor::_button_zoom_minus);
- ClassDB::bind_method("_button_zoom_reset", &CanvasItemEditor::_button_zoom_reset);
- ClassDB::bind_method("_button_zoom_plus", &CanvasItemEditor::_button_zoom_plus);
- ClassDB::bind_method("_button_toggle_smart_snap", &CanvasItemEditor::_button_toggle_smart_snap);
- ClassDB::bind_method("_button_toggle_grid_snap", &CanvasItemEditor::_button_toggle_grid_snap);
- ClassDB::bind_method(D_METHOD("_button_override_camera", "pressed"), &CanvasItemEditor::_button_override_camera);
ClassDB::bind_method(D_METHOD("_update_override_camera_button", "game_running"), &CanvasItemEditor::_update_override_camera_button);
- ClassDB::bind_method("_button_toggle_anchor_mode", &CanvasItemEditor::_button_toggle_anchor_mode);
- ClassDB::bind_method("_update_scroll", &CanvasItemEditor::_update_scroll);
- ClassDB::bind_method("_update_scrollbars", &CanvasItemEditor::_update_scrollbars);
- ClassDB::bind_method("_popup_callback", &CanvasItemEditor::_popup_callback);
ClassDB::bind_method("_get_editor_data", &CanvasItemEditor::_get_editor_data);
- ClassDB::bind_method("_button_tool_select", &CanvasItemEditor::_button_tool_select);
- ClassDB::bind_method("_keying_changed", &CanvasItemEditor::_keying_changed);
ClassDB::bind_method("_unhandled_key_input", &CanvasItemEditor::_unhandled_key_input);
- ClassDB::bind_method("_draw_viewport", &CanvasItemEditor::_draw_viewport);
- ClassDB::bind_method("_gui_input_viewport", &CanvasItemEditor::_gui_input_viewport);
- ClassDB::bind_method("_snap_changed", &CanvasItemEditor::_snap_changed);
ClassDB::bind_method("_queue_update_bone_list", &CanvasItemEditor::_update_bone_list);
ClassDB::bind_method("_update_bone_list", &CanvasItemEditor::_update_bone_list);
- ClassDB::bind_method("_tree_changed", &CanvasItemEditor::_tree_changed);
- ClassDB::bind_method("_selection_changed", &CanvasItemEditor::_selection_changed);
- ClassDB::bind_method("_popup_warning_depop", &CanvasItemEditor::_popup_warning_depop);
- ClassDB::bind_method(D_METHOD("_selection_result_pressed"), &CanvasItemEditor::_selection_result_pressed);
- ClassDB::bind_method(D_METHOD("_selection_menu_hide"), &CanvasItemEditor::_selection_menu_hide);
ClassDB::bind_method(D_METHOD("set_state"), &CanvasItemEditor::set_state);
ClassDB::bind_method(D_METHOD("update_viewport"), &CanvasItemEditor::update_viewport);
@@ -5007,7 +5224,6 @@ void CanvasItemEditor::_bind_methods() {
}
Dictionary CanvasItemEditor::get_state() const {
-
Dictionary state;
// Take the editor scale into account.
state["zoom"] = zoom / MAX(1, EDSCALE);
@@ -5034,6 +5250,7 @@ Dictionary CanvasItemEditor::get_state() const {
state["show_helpers"] = show_helpers;
state["show_zoom_control"] = zoom_hb->is_visible();
state["show_edit_locks"] = show_edit_locks;
+ state["show_transformation_gizmos"] = show_transformation_gizmos;
state["snap_rotation"] = snap_rotation;
state["snap_scale"] = snap_scale;
state["snap_relative"] = snap_relative;
@@ -5043,7 +5260,6 @@ Dictionary CanvasItemEditor::get_state() const {
}
void CanvasItemEditor::set_state(const Dictionary &p_state) {
-
bool update_scrollbars = false;
Dictionary state = p_state;
if (state.has("zoom")) {
@@ -5172,6 +5388,12 @@ void CanvasItemEditor::set_state(const Dictionary &p_state) {
view_menu->get_popup()->set_item_checked(idx, show_edit_locks);
}
+ if (state.has("show_transformation_gizmos")) {
+ show_transformation_gizmos = state["show_transformation_gizmos"];
+ int idx = view_menu->get_popup()->get_item_index(SHOW_TRANSFORMATION_GIZMOS);
+ view_menu->get_popup()->set_item_checked(idx, show_transformation_gizmos);
+ }
+
if (state.has("show_zoom_control")) {
// This one is not user-controllable, but instrumentable
zoom_hb->set_visible(state["show_zoom_control"]);
@@ -5222,7 +5444,6 @@ void CanvasItemEditor::add_control_to_info_overlay(Control *p_control) {
}
void CanvasItemEditor::remove_control_from_info_overlay(Control *p_control) {
-
info_overlay->remove_child(p_control);
info_overlay->set_margin(MARGIN_LEFT, (show_rulers ? RULER_WIDTH : 0) + 10);
}
@@ -5234,17 +5455,14 @@ void CanvasItemEditor::add_control_to_menu_panel(Control *p_control) {
}
void CanvasItemEditor::remove_control_from_menu_panel(Control *p_control) {
-
hb->remove_child(p_control);
}
HSplitContainer *CanvasItemEditor::get_palette_split() {
-
return palette_split;
}
VSplitContainer *CanvasItemEditor::get_bottom_split() {
-
return bottom_split;
}
@@ -5253,7 +5471,6 @@ void CanvasItemEditor::focus_selection() {
}
CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
-
key_pos = true;
key_rot = true;
key_scale = false;
@@ -5264,6 +5481,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
show_helpers = false;
show_rulers = true;
show_guides = true;
+ show_transformation_gizmos = true;
show_edit_locks = true;
zoom = 1.0 / MAX(1, EDSCALE);
view_offset = Point2(-150 - RULER_WIDTH, -95 - RULER_WIDTH);
@@ -5316,11 +5534,11 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
editor = p_editor;
editor_selection = p_editor->get_editor_selection();
editor_selection->add_editor_plugin(this);
- editor_selection->connect("selection_changed", this, "update");
- editor_selection->connect("selection_changed", this, "_selection_changed");
+ editor_selection->connect("selection_changed", callable_mp((CanvasItem *)this, &CanvasItem::update));
+ editor_selection->connect("selection_changed", callable_mp(this, &CanvasItemEditor::_selection_changed));
- editor->call_deferred("connect", "play_pressed", this, "_update_override_camera_button", make_binds(true));
- editor->call_deferred("connect", "stop_pressed", this, "_update_override_camera_button", make_binds(false));
+ editor->call_deferred("connect", "play_pressed", Callable(this, "_update_override_camera_button"), make_binds(true));
+ editor->call_deferred("connect", "stop_pressed", Callable(this, "_update_override_camera_button"), make_binds(false));
hb = memnew(HBoxContainer);
add_child(hb);
@@ -5328,21 +5546,21 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
bottom_split = memnew(VSplitContainer);
add_child(bottom_split);
- bottom_split->set_v_size_flags(SIZE_EXPAND_FILL);
+ bottom_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
palette_split = memnew(HSplitContainer);
bottom_split->add_child(palette_split);
- palette_split->set_v_size_flags(SIZE_EXPAND_FILL);
+ palette_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
viewport_scrollable = memnew(Control);
palette_split->add_child(viewport_scrollable);
viewport_scrollable->set_mouse_filter(MOUSE_FILTER_PASS);
viewport_scrollable->set_clip_contents(true);
- viewport_scrollable->set_v_size_flags(SIZE_EXPAND_FILL);
- viewport_scrollable->set_h_size_flags(SIZE_EXPAND_FILL);
- viewport_scrollable->connect("draw", this, "_update_scrollbars");
+ viewport_scrollable->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ viewport_scrollable->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ viewport_scrollable->connect("draw", callable_mp(this, &CanvasItemEditor::_update_scrollbars));
- ViewportContainer *scene_tree = memnew(ViewportContainer);
+ SubViewportContainer *scene_tree = memnew(SubViewportContainer);
viewport_scrollable->add_child(scene_tree);
scene_tree->set_stretch(true);
scene_tree->set_anchors_and_margins_preset(Control::PRESET_WIDE);
@@ -5353,7 +5571,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
zoom_hb = memnew(HBoxContainer);
// Bring the zoom percentage closer to the zoom buttons
- zoom_hb->add_constant_override("separation", Math::round(-8 * EDSCALE));
+ zoom_hb->add_theme_constant_override("separation", Math::round(-8 * EDSCALE));
controls_vb->add_child(zoom_hb);
viewport = memnew(CanvasItemEditorViewport(p_editor, this));
@@ -5362,15 +5580,15 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
viewport->set_anchors_and_margins_preset(Control::PRESET_WIDE);
viewport->set_clip_contents(true);
viewport->set_focus_mode(FOCUS_ALL);
- viewport->connect("draw", this, "_draw_viewport");
- viewport->connect("gui_input", this, "_gui_input_viewport");
+ viewport->connect("draw", callable_mp(this, &CanvasItemEditor::_draw_viewport));
+ viewport->connect("gui_input", callable_mp(this, &CanvasItemEditor::_gui_input_viewport));
info_overlay = memnew(VBoxContainer);
info_overlay->set_anchors_and_margins_preset(Control::PRESET_BOTTOM_LEFT);
info_overlay->set_margin(MARGIN_LEFT, 10);
info_overlay->set_margin(MARGIN_BOTTOM, -15);
info_overlay->set_v_grow_direction(Control::GROW_DIRECTION_BEGIN);
- info_overlay->add_constant_override("separation", 10);
+ info_overlay->add_theme_constant_override("separation", 10);
viewport_scrollable->add_child(info_overlay);
Theme *info_overlay_theme = memnew(Theme);
@@ -5385,116 +5603,130 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
warning_child_of_container = memnew(Label);
warning_child_of_container->hide();
warning_child_of_container->set_text(TTR("Warning: Children of a container get their position and size determined only by their parent."));
- warning_child_of_container->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("warning_color", "Editor"));
- warning_child_of_container->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("main", "EditorFonts"));
+ warning_child_of_container->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("warning_color", "Editor"));
+ warning_child_of_container->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("main", "EditorFonts"));
add_control_to_info_overlay(warning_child_of_container);
h_scroll = memnew(HScrollBar);
viewport->add_child(h_scroll);
- h_scroll->connect("value_changed", this, "_update_scroll");
+ h_scroll->connect("value_changed", callable_mp(this, &CanvasItemEditor::_update_scroll));
h_scroll->hide();
v_scroll = memnew(VScrollBar);
viewport->add_child(v_scroll);
- v_scroll->connect("value_changed", this, "_update_scroll");
+ v_scroll->connect("value_changed", callable_mp(this, &CanvasItemEditor::_update_scroll));
v_scroll->hide();
viewport->add_child(controls_vb);
- zoom_minus = memnew(ToolButton);
+ zoom_minus = memnew(Button);
+ zoom_minus->set_flat(true);
zoom_hb->add_child(zoom_minus);
- zoom_minus->connect("pressed", this, "_button_zoom_minus");
+ zoom_minus->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_zoom_minus));
zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS));
zoom_minus->set_focus_mode(FOCUS_NONE);
- zoom_reset = memnew(ToolButton);
+ zoom_reset = memnew(Button);
+ zoom_reset->set_flat(true);
zoom_hb->add_child(zoom_reset);
- zoom_reset->connect("pressed", this, "_button_zoom_reset");
+ zoom_reset->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_zoom_reset));
zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KEY_MASK_CMD | KEY_0));
zoom_reset->set_focus_mode(FOCUS_NONE);
zoom_reset->set_text_align(Button::TextAlign::ALIGN_CENTER);
// Prevent the button's size from changing when the text size changes
zoom_reset->set_custom_minimum_size(Size2(75 * EDSCALE, 0));
- zoom_plus = memnew(ToolButton);
+ zoom_plus = memnew(Button);
+ zoom_plus->set_flat(true);
zoom_hb->add_child(zoom_plus);
- zoom_plus->connect("pressed", this, "_button_zoom_plus");
+ zoom_plus->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_zoom_plus));
zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS
zoom_plus->set_focus_mode(FOCUS_NONE);
updating_scroll = false;
- select_button = memnew(ToolButton);
+ select_button = memnew(Button);
+ select_button->set_flat(true);
hb->add_child(select_button);
select_button->set_toggle_mode(true);
- select_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_SELECT));
+ select_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_SELECT));
select_button->set_pressed(true);
select_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/select_mode", TTR("Select Mode"), KEY_Q));
select_button->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate") + "\n" + TTR("Alt+Drag: Move") + "\n" + TTR("Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving).") + "\n" + TTR("Alt+RMB: Depth list selection"));
hb->add_child(memnew(VSeparator));
- move_button = memnew(ToolButton);
+ move_button = memnew(Button);
+ move_button->set_flat(true);
hb->add_child(move_button);
move_button->set_toggle_mode(true);
- move_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_MOVE));
+ move_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_MOVE));
move_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/move_mode", TTR("Move Mode"), KEY_W));
move_button->set_tooltip(TTR("Move Mode"));
- rotate_button = memnew(ToolButton);
+ rotate_button = memnew(Button);
+ rotate_button->set_flat(true);
hb->add_child(rotate_button);
rotate_button->set_toggle_mode(true);
- rotate_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_ROTATE));
+ rotate_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_ROTATE));
rotate_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/rotate_mode", TTR("Rotate Mode"), KEY_E));
rotate_button->set_tooltip(TTR("Rotate Mode"));
- scale_button = memnew(ToolButton);
+ scale_button = memnew(Button);
+ scale_button->set_flat(true);
hb->add_child(scale_button);
scale_button->set_toggle_mode(true);
- scale_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_SCALE));
+ scale_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_SCALE));
scale_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/scale_mode", TTR("Scale Mode"), KEY_S));
scale_button->set_tooltip(TTR("Scale Mode"));
hb->add_child(memnew(VSeparator));
- list_select_button = memnew(ToolButton);
+ list_select_button = memnew(Button);
+ list_select_button->set_flat(true);
hb->add_child(list_select_button);
list_select_button->set_toggle_mode(true);
- list_select_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_LIST_SELECT));
+ list_select_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_LIST_SELECT));
list_select_button->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."));
- pivot_button = memnew(ToolButton);
+ pivot_button = memnew(Button);
+ pivot_button->set_flat(true);
hb->add_child(pivot_button);
pivot_button->set_toggle_mode(true);
- pivot_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_EDIT_PIVOT));
+ pivot_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_EDIT_PIVOT));
pivot_button->set_tooltip(TTR("Click to change object's rotation pivot."));
- pan_button = memnew(ToolButton);
+ pan_button = memnew(Button);
+ pan_button->set_flat(true);
hb->add_child(pan_button);
pan_button->set_toggle_mode(true);
- pan_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_PAN));
+ pan_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_PAN));
+ pan_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/pan_mode", TTR("Pan Mode"), KEY_G));
pan_button->set_tooltip(TTR("Pan Mode"));
- ruler_button = memnew(ToolButton);
+ ruler_button = memnew(Button);
+ ruler_button->set_flat(true);
hb->add_child(ruler_button);
ruler_button->set_toggle_mode(true);
- ruler_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_RULER));
+ ruler_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_RULER));
ruler_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/ruler_mode", TTR("Ruler Mode"), KEY_R));
ruler_button->set_tooltip(TTR("Ruler Mode"));
hb->add_child(memnew(VSeparator));
- smart_snap_button = memnew(ToolButton);
+ smart_snap_button = memnew(Button);
+ smart_snap_button->set_flat(true);
hb->add_child(smart_snap_button);
smart_snap_button->set_toggle_mode(true);
- smart_snap_button->connect("toggled", this, "_button_toggle_smart_snap");
+ smart_snap_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_smart_snap));
smart_snap_button->set_tooltip(TTR("Toggle smart snapping."));
smart_snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_smart_snap", TTR("Use Smart Snap"), KEY_MASK_SHIFT | KEY_S));
- grid_snap_button = memnew(ToolButton);
+ grid_snap_button = memnew(Button);
+ grid_snap_button->set_flat(true);
hb->add_child(grid_snap_button);
grid_snap_button->set_toggle_mode(true);
- grid_snap_button->connect("toggled", this, "_button_toggle_grid_snap");
+ grid_snap_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_grid_snap));
grid_snap_button->set_tooltip(TTR("Toggle grid snapping."));
grid_snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_grid_snap", TTR("Use Grid Snap"), KEY_MASK_SHIFT | KEY_G));
@@ -5505,7 +5737,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
snap_config_menu->set_switch_on_hover(true);
PopupMenu *p = snap_config_menu->get_popup();
- p->connect("id_pressed", this, "_popup_callback");
+ p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
p->set_hide_on_checkable_item_selection(false);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_rotation_snap", TTR("Use Rotation Snap")), SNAP_USE_ROTATION);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_scale_snap", TTR("Use Scale Snap")), SNAP_USE_SCALE);
@@ -5519,7 +5751,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
smartsnap_config_popup = memnew(PopupMenu);
p->add_child(smartsnap_config_popup);
smartsnap_config_popup->set_name("SmartSnapping");
- smartsnap_config_popup->connect("id_pressed", this, "_popup_callback");
+ smartsnap_config_popup->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
smartsnap_config_popup->set_hide_on_checkable_item_selection(false);
smartsnap_config_popup->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/snap_node_parent", TTR("Snap to Parent")), SNAP_USE_NODE_PARENT);
smartsnap_config_popup->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/snap_node_anchors", TTR("Snap to Node Anchor")), SNAP_USE_NODE_ANCHORS);
@@ -5530,25 +5762,29 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
hb->add_child(memnew(VSeparator));
- lock_button = memnew(ToolButton);
+ lock_button = memnew(Button);
+ lock_button->set_flat(true);
hb->add_child(lock_button);
- lock_button->connect("pressed", this, "_popup_callback", varray(LOCK_SELECTED));
+ lock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(LOCK_SELECTED));
lock_button->set_tooltip(TTR("Lock the selected object in place (can't be moved)."));
- unlock_button = memnew(ToolButton);
+ unlock_button = memnew(Button);
+ unlock_button->set_flat(true);
hb->add_child(unlock_button);
- unlock_button->connect("pressed", this, "_popup_callback", varray(UNLOCK_SELECTED));
+ unlock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNLOCK_SELECTED));
unlock_button->set_tooltip(TTR("Unlock the selected object (can be moved)."));
- group_button = memnew(ToolButton);
+ group_button = memnew(Button);
+ group_button->set_flat(true);
hb->add_child(group_button);
- group_button->connect("pressed", this, "_popup_callback", varray(GROUP_SELECTED));
+ group_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(GROUP_SELECTED));
group_button->set_tooltip(TTR("Makes sure the object's children are not selectable."));
- ungroup_button = memnew(ToolButton);
+ ungroup_button = memnew(Button);
+ ungroup_button->set_flat(true);
hb->add_child(ungroup_button);
- ungroup_button->connect("pressed", this, "_popup_callback", varray(UNGROUP_SELECTED));
+ ungroup_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNGROUP_SELECTED));
ungroup_button->set_tooltip(TTR("Restores the object's children's ability to be selected."));
hb->add_child(memnew(VSeparator));
@@ -5567,13 +5803,14 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
p->add_separator();
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_make_bones", TTR("Make Custom Bone(s) from Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_B), SKELETON_MAKE_BONES);
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_clear_bones", TTR("Clear Custom Bones")), SKELETON_CLEAR_BONES);
- p->connect("id_pressed", this, "_popup_callback");
+ p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
hb->add_child(memnew(VSeparator));
- override_camera_button = memnew(ToolButton);
+ override_camera_button = memnew(Button);
+ override_camera_button->set_flat(true);
hb->add_child(override_camera_button);
- override_camera_button->connect("toggled", this, "_button_override_camera");
+ override_camera_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_override_camera));
override_camera_button->set_toggle_mode(true);
override_camera_button->set_disabled(true);
_update_override_camera_button(false);
@@ -5583,7 +5820,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
view_menu = memnew(MenuButton);
view_menu->set_text(TTR("View"));
hb->add_child(view_menu);
- view_menu->get_popup()->connect("id_pressed", this, "_popup_callback");
+ view_menu->get_popup()->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
view_menu->set_switch_on_hover(true);
p = view_menu->get_popup();
@@ -5595,6 +5832,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_origin", TTR("Show Origin")), SHOW_ORIGIN);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_viewport", TTR("Show Viewport")), SHOW_VIEWPORT);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_edit_locks", TTR("Show Group And Lock Icons")), SHOW_EDIT_LOCKS);
+ p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_transformation_gizmos", TTR("Show Transformation Gizmos")), SHOW_TRANSFORMATION_GIZMOS);
p->add_separator();
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/center_selection", TTR("Center Selection"), KEY_F), VIEW_CENTER_TO_SELECTION);
@@ -5610,18 +5848,19 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
presets_menu->set_switch_on_hover(true);
p = presets_menu->get_popup();
- p->connect("id_pressed", this, "_popup_callback");
+ p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
anchors_popup = memnew(PopupMenu);
p->add_child(anchors_popup);
anchors_popup->set_name("Anchors");
- anchors_popup->connect("id_pressed", this, "_popup_callback");
+ anchors_popup->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
- anchor_mode_button = memnew(ToolButton);
+ anchor_mode_button = memnew(Button);
+ anchor_mode_button->set_flat(true);
hb->add_child(anchor_mode_button);
anchor_mode_button->set_toggle_mode(true);
anchor_mode_button->hide();
- anchor_mode_button->connect("toggled", this, "_button_toggle_anchor_mode");
+ anchor_mode_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_anchor_mode));
animation_hb = memnew(HBoxContainer);
hb->add_child(animation_hb);
@@ -5633,7 +5872,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
key_loc_button->set_flat(true);
key_loc_button->set_pressed(true);
key_loc_button->set_focus_mode(FOCUS_NONE);
- key_loc_button->connect("pressed", this, "_popup_callback", varray(ANIM_INSERT_POS));
+ key_loc_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(ANIM_INSERT_POS));
key_loc_button->set_tooltip(TTR("Translation mask for inserting keys."));
animation_hb->add_child(key_loc_button);
key_rot_button = memnew(Button);
@@ -5641,20 +5880,20 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
key_rot_button->set_flat(true);
key_rot_button->set_pressed(true);
key_rot_button->set_focus_mode(FOCUS_NONE);
- key_rot_button->connect("pressed", this, "_popup_callback", varray(ANIM_INSERT_ROT));
+ key_rot_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(ANIM_INSERT_ROT));
key_rot_button->set_tooltip(TTR("Rotation mask for inserting keys."));
animation_hb->add_child(key_rot_button);
key_scale_button = memnew(Button);
key_scale_button->set_toggle_mode(true);
key_scale_button->set_flat(true);
key_scale_button->set_focus_mode(FOCUS_NONE);
- key_scale_button->connect("pressed", this, "_popup_callback", varray(ANIM_INSERT_SCALE));
+ key_scale_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(ANIM_INSERT_SCALE));
key_scale_button->set_tooltip(TTR("Scale mask for inserting keys."));
animation_hb->add_child(key_scale_button);
key_insert_button = memnew(Button);
key_insert_button->set_flat(true);
key_insert_button->set_focus_mode(FOCUS_NONE);
- key_insert_button->connect("pressed", this, "_popup_callback", varray(ANIM_INSERT_KEY));
+ key_insert_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(ANIM_INSERT_KEY));
key_insert_button->set_tooltip(TTR("Insert keys (based on mask)."));
key_insert_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key", TTR("Insert Key"), KEY_INSERT));
animation_hb->add_child(key_insert_button);
@@ -5670,7 +5909,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
animation_menu = memnew(MenuButton);
animation_menu->set_tooltip(TTR("Animation Key and Pose Options"));
animation_hb->add_child(animation_menu);
- animation_menu->get_popup()->connect("id_pressed", this, "_popup_callback");
+ animation_menu->get_popup()->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
animation_menu->set_switch_on_hover(true);
p = animation_menu->get_popup();
@@ -5683,16 +5922,16 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_clear_pose", TTR("Clear Pose"), KEY_MASK_SHIFT | KEY_K), ANIM_CLEAR_POSE);
snap_dialog = memnew(SnapDialog);
- snap_dialog->connect("confirmed", this, "_snap_changed");
+ snap_dialog->connect("confirmed", callable_mp(this, &CanvasItemEditor::_snap_changed));
add_child(snap_dialog);
select_sb = Ref<StyleBoxTexture>(memnew(StyleBoxTexture));
selection_menu = memnew(PopupMenu);
add_child(selection_menu);
- selection_menu->set_custom_minimum_size(Vector2(100, 0));
- selection_menu->connect("id_pressed", this, "_selection_result_pressed");
- selection_menu->connect("popup_hide", this, "_selection_menu_hide");
+ selection_menu->set_min_size(Vector2(100, 0));
+ selection_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_selection_result_pressed));
+ selection_menu->connect("popup_hide", callable_mp(this, &CanvasItemEditor::_selection_menu_hide));
multiply_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/multiply_grid_step", TTR("Multiply grid step by 2"), KEY_KP_MULTIPLY);
divide_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/divide_grid_step", TTR("Divide grid step by 2"), KEY_KP_DIVIDE);
@@ -5707,45 +5946,39 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
call_deferred("set_state", get_state());
}
-CanvasItemEditor *CanvasItemEditor::singleton = NULL;
+CanvasItemEditor *CanvasItemEditor::singleton = nullptr;
void CanvasItemEditorPlugin::edit(Object *p_object) {
-
canvas_item_editor->set_undo_redo(&get_undo_redo());
canvas_item_editor->edit(Object::cast_to<CanvasItem>(p_object));
}
bool CanvasItemEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("CanvasItem");
}
void CanvasItemEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
canvas_item_editor->show();
canvas_item_editor->set_physics_process(true);
- VisualServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(), false);
+ RenderingServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(), false);
} else {
-
canvas_item_editor->hide();
canvas_item_editor->set_physics_process(false);
- VisualServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(), true);
+ RenderingServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(), true);
}
}
Dictionary CanvasItemEditorPlugin::get_state() const {
-
return canvas_item_editor->get_state();
}
-void CanvasItemEditorPlugin::set_state(const Dictionary &p_state) {
+void CanvasItemEditorPlugin::set_state(const Dictionary &p_state) {
canvas_item_editor->set_state(p_state);
}
CanvasItemEditorPlugin::CanvasItemEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
canvas_item_editor = memnew(CanvasItemEditor(editor));
canvas_item_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
@@ -5771,8 +6004,9 @@ void CanvasItemEditorViewport::_on_select_type(Object *selected) {
}
void CanvasItemEditorViewport::_on_change_type_confirmed() {
- if (!button_group->get_pressed_button())
+ if (!button_group->get_pressed_button()) {
return;
+ }
CheckBox *check = Object::cast_to<CheckBox>(button_group->get_pressed_button());
default_type = check->get_text();
@@ -5781,7 +6015,6 @@ void CanvasItemEditorViewport::_on_change_type_confirmed() {
}
void CanvasItemEditorViewport::_on_change_type_closed() {
-
_remove_preview();
}
@@ -5791,11 +6024,11 @@ void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) cons
String path = files[i];
RES res = ResourceLoader::load(path);
ERR_FAIL_COND(res.is_null());
- Ref<Texture> texture = Ref<Texture>(Object::cast_to<Texture>(*res));
+ Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(*res));
Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
- if (texture != NULL || scene != NULL) {
- if (texture != NULL) {
- Sprite *sprite = memnew(Sprite);
+ if (texture != nullptr || scene != nullptr) {
+ if (texture != nullptr) {
+ Sprite2D *sprite = memnew(Sprite2D);
sprite->set_texture(texture);
sprite->set_modulate(Color(1, 1, 1, 0.7f));
preview_node->add_child(sprite);
@@ -5813,8 +6046,9 @@ void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) cons
}
}
- if (add_preview)
+ if (add_preview) {
editor->get_scene_root()->add_child(preview_node);
+ }
}
void CanvasItemEditorViewport::_remove_preview() {
@@ -5848,7 +6082,7 @@ bool CanvasItemEditorViewport::_cyclical_dependency_exists(const String &p_targe
void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String &path, const Point2 &p_point) {
child->set_name(path.get_file().get_basename());
- Ref<Texture> texture = Ref<Texture>(Object::cast_to<Texture>(ResourceCache::get(path)));
+ Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(ResourceCache::get(path)));
Size2 texture_size = texture->get_size();
if (parent) {
@@ -5860,14 +6094,14 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String &
editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", child);
editor_data->get_undo_redo().add_do_method(child, "set_owner", editor->get_edited_scene());
editor_data->get_undo_redo().add_do_reference(child);
- editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)NULL);
+ editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr);
}
if (parent) {
String new_name = parent->validate_child_name(child);
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_create_node", editor->get_edited_scene()->get_path_to(parent), child->get_class(), new_name);
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name));
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_create_node", editor->get_edited_scene()->get_path_to(parent), child->get_class(), new_name);
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name));
}
// handle with different property for texture
@@ -5892,7 +6126,7 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String &
if (default_type == "NinePatchRect") {
editor_data->get_undo_redo().add_do_property(child, "rect/size", texture_size);
} else if (default_type == "Polygon2D") {
- PoolVector<Vector2> list;
+ Vector<Vector2> list;
list.push_back(Vector2(0, 0));
list.push_back(Vector2(texture_size.width, 0));
list.push_back(Vector2(texture_size.width, texture_size.height));
@@ -5935,15 +6169,20 @@ bool CanvasItemEditorViewport::_create_instance(Node *parent, String &path, cons
editor_data->get_undo_redo().add_undo_method(parent, "remove_child", instanced_scene);
String new_name = parent->validate_child_name(instanced_scene);
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_instance_node", editor->get_edited_scene()->get_path_to(parent), path, new_name);
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name));
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_instance_node", editor->get_edited_scene()->get_path_to(parent), path, new_name);
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name));
CanvasItem *parent_ci = Object::cast_to<CanvasItem>(parent);
if (parent_ci) {
Vector2 target_pos = canvas_item_editor->get_canvas_transform().affine_inverse().xform(p_point);
target_pos = canvas_item_editor->snap_point(target_pos);
target_pos = parent_ci->get_global_transform_with_canvas().affine_inverse().xform(target_pos);
+ // Preserve instance position of the original scene.
+ CanvasItem *instance_ci = Object::cast_to<CanvasItem>(instanced_scene);
+ if (instance_ci) {
+ target_pos += instance_ci->_edit_get_position();
+ }
editor_data->get_undo_redo().add_do_method(instanced_scene, "set_position", target_pos);
}
@@ -5956,7 +6195,7 @@ void CanvasItemEditorViewport::_perform_drop_data() {
// Without root dropping multiple files is not allowed
if (!target_node && selected_files.size() > 1) {
accept->set_text(TTR("Cannot instantiate multiple nodes without root."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
@@ -5971,7 +6210,7 @@ void CanvasItemEditorViewport::_perform_drop_data() {
continue;
}
Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
- if (scene != NULL && scene.is_valid()) {
+ if (scene != nullptr && scene.is_valid()) {
if (!target_node) {
// Without root node act the same as "Load Inherited Scene"
Error err = EditorNode::get_singleton()->load_scene(path, false, true);
@@ -5985,23 +6224,24 @@ void CanvasItemEditorViewport::_perform_drop_data() {
}
}
} else {
- Ref<Texture> texture = Ref<Texture>(Object::cast_to<Texture>(*res));
- if (texture != NULL && texture.is_valid()) {
+ Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(*res));
+ if (texture != nullptr && texture.is_valid()) {
Node *child;
- if (default_type == "Light2D")
+ if (default_type == "Light2D") {
child = memnew(Light2D);
- else if (default_type == "Particles2D")
- child = memnew(Particles2D);
- else if (default_type == "Polygon2D")
+ } else if (default_type == "GPUParticles2D") {
+ child = memnew(GPUParticles2D);
+ } else if (default_type == "Polygon2D") {
child = memnew(Polygon2D);
- else if (default_type == "TouchScreenButton")
+ } else if (default_type == "TouchScreenButton") {
child = memnew(TouchScreenButton);
- else if (default_type == "TextureRect")
+ } else if (default_type == "TextureRect") {
child = memnew(TextureRect);
- else if (default_type == "NinePatchRect")
+ } else if (default_type == "NinePatchRect") {
child = memnew(NinePatchRect);
- else
- child = memnew(Sprite); // default
+ } else {
+ child = memnew(Sprite2D); // default
+ }
_create_nodes(target_node, child, path, drop_pos);
}
@@ -6016,8 +6256,8 @@ void CanvasItemEditorViewport::_perform_drop_data() {
files_str += error_files[i].get_file().get_basename() + ",";
}
files_str = files_str.substr(0, files_str.length() - 1);
- accept->set_text(vformat(TTR("Error instancing scene from %s"), files_str.c_str()));
- accept->popup_centered_minsize();
+ accept->set_text(vformat(TTR("Error instancing scene from %s"), files_str.get_data()));
+ accept->popup_centered();
}
}
@@ -6040,15 +6280,15 @@ bool CanvasItemEditorViewport::can_drop_data(const Point2 &p_point, const Varian
continue;
}
memdelete(instanced_scene);
- } else if (type == "Texture" ||
+ } else if (type == "Texture2D" ||
type == "ImageTexture" ||
type == "ViewportTexture" ||
type == "CurveTexture" ||
type == "GradientTexture" ||
- type == "StreamTexture" ||
+ type == "StreamTexture2D" ||
type == "AtlasTexture" ||
type == "LargeTexture") {
- Ref<Texture> texture = Ref<Texture>(Object::cast_to<Texture>(*res));
+ Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(*res));
if (!texture.is_valid()) {
continue;
}
@@ -6083,11 +6323,10 @@ void CanvasItemEditorViewport::_show_resource_type_selector() {
check->set_pressed(check->get_text() == default_type);
}
selector->set_title(vformat(TTR("Add %s"), default_type));
- selector->popup_centered_minsize();
+ selector->popup_centered();
}
bool CanvasItemEditorViewport::_only_packed_scenes_selected() const {
-
for (int i = 0; i < selected_files.size(); ++i) {
if (ResourceLoader::load(selected_files[i])->get_class() != "PackedScene") {
return false;
@@ -6106,8 +6345,9 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p
if (d.has("type") && String(d["type"]) == "files") {
selected_files = d["files"];
}
- if (selected_files.size() == 0)
+ if (selected_files.size() == 0) {
return;
+ }
List<Node *> list = editor->get_editor_selection()->get_selected_node_list();
if (list.size() == 0) {
@@ -6116,7 +6356,7 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p
list.push_back(root_node);
} else {
drop_pos = p_point;
- target_node = NULL;
+ target_node = nullptr;
}
}
@@ -6139,37 +6379,34 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p
void CanvasItemEditorViewport::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- connect("mouse_exited", this, "_on_mouse_exit");
- label->add_color_override("font_color", get_color("warning_color", "Editor"));
+ connect("mouse_exited", callable_mp(this, &CanvasItemEditorViewport::_on_mouse_exit));
+ label->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor"));
} break;
case NOTIFICATION_EXIT_TREE: {
- disconnect("mouse_exited", this, "_on_mouse_exit");
+ disconnect("mouse_exited", callable_mp(this, &CanvasItemEditorViewport::_on_mouse_exit));
} break;
- default: break;
+ default:
+ break;
}
}
void CanvasItemEditorViewport::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_on_select_type"), &CanvasItemEditorViewport::_on_select_type);
- ClassDB::bind_method(D_METHOD("_on_change_type_confirmed"), &CanvasItemEditorViewport::_on_change_type_confirmed);
- ClassDB::bind_method(D_METHOD("_on_change_type_closed"), &CanvasItemEditorViewport::_on_change_type_closed);
- ClassDB::bind_method(D_METHOD("_on_mouse_exit"), &CanvasItemEditorViewport::_on_mouse_exit);
}
CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas_item_editor) {
- default_type = "Sprite";
+ default_type = "Sprite2D";
// Node2D
- types.push_back("Sprite");
+ types.push_back("Sprite2D");
types.push_back("Light2D");
- types.push_back("Particles2D");
+ types.push_back("GPUParticles2D");
types.push_back("Polygon2D");
types.push_back("TouchScreenButton");
// Control
types.push_back("TextureRect");
types.push_back("NinePatchRect");
- target_node = NULL;
+ target_node = nullptr;
editor = p_node;
editor_data = editor->get_scene_tree_dock()->get_editor_data();
canvas_item_editor = p_canvas_item_editor;
@@ -6181,14 +6418,14 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte
selector = memnew(AcceptDialog);
editor->get_gui_base()->add_child(selector);
selector->set_title(TTR("Change Default Type"));
- selector->connect("confirmed", this, "_on_change_type_confirmed");
- selector->connect("popup_hide", this, "_on_change_type_closed");
+ selector->connect("confirmed", callable_mp(this, &CanvasItemEditorViewport::_on_change_type_confirmed));
+ selector->connect("cancelled", callable_mp(this, &CanvasItemEditorViewport::_on_change_type_closed));
VBoxContainer *vbc = memnew(VBoxContainer);
selector->add_child(vbc);
- vbc->set_h_size_flags(SIZE_EXPAND_FILL);
- vbc->set_v_size_flags(SIZE_EXPAND_FILL);
- vbc->set_custom_minimum_size(Size2(200, 260) * EDSCALE);
+ vbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ vbc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ vbc->set_custom_minimum_size(Size2(240, 260) * EDSCALE);
btn_group = memnew(VBoxContainer);
vbc->add_child(btn_group);
@@ -6199,26 +6436,26 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte
CheckBox *check = memnew(CheckBox);
btn_group->add_child(check);
check->set_text(types[i]);
- check->connect("button_down", this, "_on_select_type", varray(check));
+ check->connect("button_down", callable_mp(this, &CanvasItemEditorViewport::_on_select_type), varray(check));
check->set_button_group(button_group);
}
label = memnew(Label);
- label->add_color_override("font_color_shadow", Color(0, 0, 0, 1));
- label->add_constant_override("shadow_as_outline", 1 * EDSCALE);
+ label->add_theme_color_override("font_color_shadow", Color(0, 0, 0, 1));
+ label->add_theme_constant_override("shadow_as_outline", 1 * EDSCALE);
label->hide();
canvas_item_editor->get_controls_container()->add_child(label);
label_desc = memnew(Label);
label_desc->set_text(TTR("Drag & drop + Shift : Add node as sibling\nDrag & drop + Alt : Change node type"));
- label_desc->add_color_override("font_color", Color(0.6f, 0.6f, 0.6f, 1));
- label_desc->add_color_override("font_color_shadow", Color(0.2f, 0.2f, 0.2f, 1));
- label_desc->add_constant_override("shadow_as_outline", 1 * EDSCALE);
- label_desc->add_constant_override("line_spacing", 0);
+ label_desc->add_theme_color_override("font_color", Color(0.6f, 0.6f, 0.6f, 1));
+ label_desc->add_theme_color_override("font_color_shadow", Color(0.2f, 0.2f, 0.2f, 1));
+ label_desc->add_theme_constant_override("shadow_as_outline", 1 * EDSCALE);
+ label_desc->add_theme_constant_override("line_spacing", 0);
label_desc->hide();
canvas_item_editor->get_controls_container()->add_child(label_desc);
- VS::get_singleton()->canvas_set_disable_scale(true);
+ RS::get_singleton()->canvas_set_disable_scale(true);
}
CanvasItemEditorViewport::~CanvasItemEditorViewport() {
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
index 3291d6b9bf..859e80befe 100644
--- a/editor/plugins/canvas_item_editor_plugin.h
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -33,25 +33,24 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-#include "scene/2d/canvas_item.h"
#include "scene/gui/box_container.h"
#include "scene/gui/check_box.h"
#include "scene/gui/label.h"
#include "scene/gui/panel_container.h"
#include "scene/gui/spin_box.h"
+#include "scene/main/canvas_item.h"
class CanvasItemEditorViewport;
class CanvasItemEditorSelectedItem : public Object {
-
GDCLASS(CanvasItemEditorSelectedItem, Object);
public:
Transform2D prev_xform;
- float prev_rot;
+ float prev_rot = 0;
Rect2 prev_rect;
Vector2 prev_pivot;
- float prev_anchors[4];
+ float prev_anchors[4] = { 0.0f };
Transform2D pre_drag_xform;
Rect2 pre_drag_rect;
@@ -61,14 +60,10 @@ public:
Dictionary undo_state;
- CanvasItemEditorSelectedItem() :
- prev_anchors() {
- prev_rot = 0;
- }
+ CanvasItemEditorSelectedItem() {}
};
class CanvasItemEditor : public VBoxContainer {
-
GDCLASS(CanvasItemEditor, VBoxContainer);
public:
@@ -119,6 +114,7 @@ private:
SHOW_ORIGIN,
SHOW_VIEWPORT,
SHOW_EDIT_LOCKS,
+ SHOW_TRANSFORMATION_GIZMOS,
LOCK_SELECTED,
UNLOCK_SELECTED,
GROUP_SELECTED,
@@ -189,7 +185,6 @@ private:
SKELETON_SHOW_BONES,
SKELETON_SET_IK_CHAIN,
SKELETON_CLEAR_IK_CHAIN
-
};
enum DragType {
@@ -209,6 +204,8 @@ private:
DRAG_ANCHOR_BOTTOM_LEFT,
DRAG_ANCHOR_ALL,
DRAG_MOVE,
+ DRAG_MOVE_X,
+ DRAG_MOVE_Y,
DRAG_SCALE_X,
DRAG_SCALE_Y,
DRAG_SCALE_BOTH,
@@ -231,9 +228,9 @@ private:
VScrollBar *v_scroll;
HBoxContainer *hb;
- ToolButton *zoom_minus;
- ToolButton *zoom_reset;
- ToolButton *zoom_plus;
+ Button *zoom_minus;
+ Button *zoom_reset;
+ Button *zoom_plus;
Map<Control *, Timer *> popup_temporarily_timers;
@@ -248,6 +245,8 @@ private:
bool show_viewport;
bool show_helpers;
bool show_edit_locks;
+ bool show_transformation_gizmos;
+
float zoom;
Point2 view_offset;
Point2 previous_update_view_offset;
@@ -289,7 +288,6 @@ private:
MenuOption last_option;
struct _SelectResult {
-
CanvasItem *item;
float z_index;
bool has_z;
@@ -300,22 +298,18 @@ private:
Vector<_SelectResult> selection_results;
struct _HoverResult {
-
Point2 position;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
String name;
};
Vector<_HoverResult> hovering_results;
struct BoneList {
-
Transform2D xform;
- float length;
- uint64_t last_pass;
+ float length = 0.f;
+ uint64_t last_pass = 0;
- BoneList() :
- length(0.f),
- last_pass(0) {}
+ BoneList() {}
};
uint64_t bone_last_frame;
@@ -324,10 +318,11 @@ private:
ObjectID from;
ObjectID to;
_FORCE_INLINE_ bool operator<(const BoneKey &p_key) const {
- if (from == p_key.from)
+ if (from == p_key.from) {
return to < p_key.to;
- else
+ } else {
return from < p_key.from;
+ }
}
};
@@ -341,31 +336,31 @@ private:
};
List<PoseClipboard> pose_clipboard;
- ToolButton *select_button;
+ Button *select_button;
- ToolButton *move_button;
- ToolButton *scale_button;
- ToolButton *rotate_button;
+ Button *move_button;
+ Button *scale_button;
+ Button *rotate_button;
- ToolButton *list_select_button;
- ToolButton *pivot_button;
- ToolButton *pan_button;
+ Button *list_select_button;
+ Button *pivot_button;
+ Button *pan_button;
- ToolButton *ruler_button;
+ Button *ruler_button;
- ToolButton *smart_snap_button;
- ToolButton *grid_snap_button;
+ Button *smart_snap_button;
+ Button *grid_snap_button;
MenuButton *snap_config_menu;
PopupMenu *smartsnap_config_popup;
- ToolButton *lock_button;
- ToolButton *unlock_button;
+ Button *lock_button;
+ Button *unlock_button;
- ToolButton *group_button;
- ToolButton *ungroup_button;
+ Button *group_button;
+ Button *ungroup_button;
MenuButton *skeleton_menu;
- ToolButton *override_camera_button;
+ Button *override_camera_button;
MenuButton *view_menu;
HBoxContainer *animation_hb;
MenuButton *animation_menu;
@@ -374,7 +369,7 @@ private:
PopupMenu *anchors_and_margins_popup;
PopupMenu *anchors_popup;
- ToolButton *anchor_mode_button;
+ Button *anchor_mode_button;
Button *key_loc_button;
Button *key_rot_button;
@@ -402,19 +397,19 @@ private:
Point2 box_selecting_to;
Ref<StyleBoxTexture> select_sb;
- Ref<Texture> select_handle;
- Ref<Texture> anchor_handle;
+ Ref<Texture2D> select_handle;
+ Ref<Texture2D> anchor_handle;
- Ref<ShortCut> drag_pivot_shortcut;
- Ref<ShortCut> set_pivot_shortcut;
- Ref<ShortCut> multiply_grid_step_shortcut;
- Ref<ShortCut> divide_grid_step_shortcut;
- Ref<ShortCut> pan_view_shortcut;
+ Ref<Shortcut> drag_pivot_shortcut;
+ Ref<Shortcut> set_pivot_shortcut;
+ Ref<Shortcut> multiply_grid_step_shortcut;
+ Ref<Shortcut> divide_grid_step_shortcut;
+ Ref<Shortcut> pan_view_shortcut;
bool _is_node_locked(const Node *p_node);
bool _is_node_movable(const Node *p_node, bool p_popup_warning = false);
void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, Vector<_SelectResult> &r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
- void _get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items);
+ void _get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items, bool p_allow_locked = false);
void _get_bones_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items);
void _find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_node, List<CanvasItem *> *r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
@@ -497,6 +492,7 @@ private:
bool _gui_input_hover(const Ref<InputEvent> &p_event);
void _gui_input_viewport(const Ref<InputEvent> &p_event);
+ void _update_cursor();
void _selection_changed();
@@ -533,6 +529,7 @@ private:
VBoxContainer *controls_vb;
HBoxContainer *zoom_hb;
+ float _get_next_zoom_value(int p_increment_count) const;
void _zoom_on_position(float p_zoom, Point2 p_position = Point2());
void _update_zoom_label();
void _button_zoom_minus();
@@ -609,7 +606,7 @@ public:
SNAP_DEFAULT = SNAP_GRID | SNAP_GUIDES | SNAP_PIXEL,
};
- Point2 snap_point(Point2 p_target, unsigned int p_modes = SNAP_DEFAULT, unsigned int p_forced_modes = 0, const CanvasItem *p_self_canvas_item = NULL, List<CanvasItem *> p_other_nodes_exceptions = List<CanvasItem *>());
+ Point2 snap_point(Point2 p_target, unsigned int p_modes = SNAP_DEFAULT, unsigned int p_forced_modes = 0, const CanvasItem *p_self_canvas_item = nullptr, List<CanvasItem *> p_other_nodes_exceptions = List<CanvasItem *>());
float snap_angle(float p_target, float p_start = 0) const;
Transform2D get_canvas_transform() const { return transform; }
@@ -647,20 +644,19 @@ public:
};
class CanvasItemEditorPlugin : public EditorPlugin {
-
GDCLASS(CanvasItemEditorPlugin, EditorPlugin);
CanvasItemEditor *canvas_item_editor;
EditorNode *editor;
public:
- virtual String get_name() const { return "2D"; }
- bool has_main_screen() const { return true; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
- virtual Dictionary get_state() const;
- virtual void set_state(const Dictionary &p_state);
+ virtual String get_name() const override { return "2D"; }
+ bool has_main_screen() const override { return true; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+ virtual Dictionary get_state() const override;
+ virtual void set_state(const Dictionary &p_state) override;
CanvasItemEditor *get_canvas_item_editor() { return canvas_item_editor; }
@@ -683,7 +679,7 @@ class CanvasItemEditorViewport : public Control {
CanvasItemEditor *canvas_item_editor;
Node2D *preview_node;
AcceptDialog *accept;
- WindowDialog *selector;
+ AcceptDialog *selector;
Label *selector_label;
Label *label;
Label *label_desc;
@@ -711,8 +707,8 @@ protected:
void _notification(int p_what);
public:
- virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
- virtual void drop_data(const Point2 &p_point, const Variant &p_data);
+ virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override;
+ virtual void drop_data(const Point2 &p_point, const Variant &p_data) override;
CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas_item_editor);
~CanvasItemEditorViewport();
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.cpp b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
index 3d32c0b698..08d6fc966d 100644
--- a/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
@@ -31,18 +31,16 @@
#include "collision_polygon_2d_editor_plugin.h"
Node2D *CollisionPolygon2DEditor::_get_node() const {
-
return node;
}
void CollisionPolygon2DEditor::_set_node(Node *p_polygon) {
-
node = Object::cast_to<CollisionPolygon2D>(p_polygon);
}
CollisionPolygon2DEditor::CollisionPolygon2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
- node = NULL;
+ node = nullptr;
}
CollisionPolygon2DEditorPlugin::CollisionPolygon2DEditorPlugin(EditorNode *p_node) :
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.h b/editor/plugins/collision_polygon_2d_editor_plugin.h
index a4fa7c7b3b..482f00a7f7 100644
--- a/editor/plugins/collision_polygon_2d_editor_plugin.h
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.h
@@ -35,21 +35,19 @@
#include "scene/2d/collision_polygon_2d.h"
class CollisionPolygon2DEditor : public AbstractPolygon2DEditor {
-
GDCLASS(CollisionPolygon2DEditor, AbstractPolygon2DEditor);
CollisionPolygon2D *node;
protected:
- virtual Node2D *_get_node() const;
- virtual void _set_node(Node *p_polygon);
+ virtual Node2D *_get_node() const override;
+ virtual void _set_node(Node *p_polygon) override;
public:
CollisionPolygon2DEditor(EditorNode *p_editor);
};
class CollisionPolygon2DEditorPlugin : public AbstractPolygon2DEditorPlugin {
-
GDCLASS(CollisionPolygon2DEditorPlugin, AbstractPolygon2DEditorPlugin);
public:
diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/collision_polygon_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..6eb17685f6
--- /dev/null
+++ b/editor/plugins/collision_polygon_3d_editor_plugin.cpp
@@ -0,0 +1,577 @@
+/*************************************************************************/
+/* collision_polygon_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "collision_polygon_3d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "core/input/input.h"
+#include "core/math/geometry_2d.h"
+#include "core/os/file_access.h"
+#include "core/os/keyboard.h"
+#include "editor/editor_settings.h"
+#include "node_3d_editor_plugin.h"
+#include "scene/3d/camera_3d.h"
+
+void CollisionPolygon3DEditor::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_READY: {
+ button_create->set_icon(get_theme_icon("Edit", "EditorIcons"));
+ button_edit->set_icon(get_theme_icon("MovePoint", "EditorIcons"));
+ button_edit->set_pressed(true);
+ get_tree()->connect("node_removed", callable_mp(this, &CollisionPolygon3DEditor::_node_removed));
+
+ } break;
+ case NOTIFICATION_PROCESS: {
+ if (!node) {
+ return;
+ }
+
+ if (_get_depth() != prev_depth) {
+ _polygon_draw();
+ prev_depth = _get_depth();
+ }
+
+ } break;
+ }
+}
+
+void CollisionPolygon3DEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ if (imgeom->get_parent() == p_node) {
+ p_node->remove_child(imgeom);
+ }
+ hide();
+ set_process(false);
+ }
+}
+
+void CollisionPolygon3DEditor::_menu_option(int p_option) {
+ switch (p_option) {
+ case MODE_CREATE: {
+ mode = MODE_CREATE;
+ button_create->set_pressed(true);
+ button_edit->set_pressed(false);
+ } break;
+ case MODE_EDIT: {
+ mode = MODE_EDIT;
+ button_create->set_pressed(false);
+ button_edit->set_pressed(true);
+ } break;
+ }
+}
+
+void CollisionPolygon3DEditor::_wip_close() {
+ undo_redo->create_action(TTR("Create Polygon3D"));
+ undo_redo->add_undo_method(node, "set_polygon", node->call("get_polygon"));
+ undo_redo->add_do_method(node, "set_polygon", wip);
+ undo_redo->add_do_method(this, "_polygon_draw");
+ undo_redo->add_undo_method(this, "_polygon_draw");
+ wip.clear();
+ wip_active = false;
+ mode = MODE_EDIT;
+ button_edit->set_pressed(true);
+ button_create->set_pressed(false);
+ edited_point = -1;
+ undo_redo->commit_action();
+}
+
+bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) {
+ if (!node) {
+ return false;
+ }
+
+ Transform gt = node->get_global_transform();
+ Transform gi = gt.affine_inverse();
+ float depth = _get_depth() * 0.5;
+ Vector3 n = gt.basis.get_axis(2).normalized();
+ Plane p(gt.origin + n * depth, n);
+
+ Ref<InputEventMouseButton> mb = p_event;
+
+ if (mb.is_valid()) {
+ Vector2 gpoint = mb->get_position();
+ Vector3 ray_from = p_camera->project_ray_origin(gpoint);
+ Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
+
+ Vector3 spoint;
+
+ if (!p.intersects_ray(ray_from, ray_dir, &spoint)) {
+ return false;
+ }
+
+ spoint = gi.xform(spoint);
+
+ Vector2 cpoint(spoint.x, spoint.y);
+
+ //DO NOT snap here, it's confusing in 3D for adding points.
+ //Let the snap happen when the point is being moved, instead.
+ //cpoint = CanvasItemEditor::get_singleton()->snap_point(cpoint);
+
+ Vector<Vector2> poly = node->call("get_polygon");
+
+ //first check if a point is to be added (segment split)
+ real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
+
+ switch (mode) {
+ case MODE_CREATE: {
+ if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
+ if (!wip_active) {
+ wip.clear();
+ wip.push_back(cpoint);
+ wip_active = true;
+ edited_point_pos = cpoint;
+ snap_ignore = false;
+ _polygon_draw();
+ edited_point = 1;
+ return true;
+ } else {
+ if (wip.size() > 1 && p_camera->unproject_position(gt.xform(Vector3(wip[0].x, wip[0].y, depth))).distance_to(gpoint) < grab_threshold) {
+ //wip closed
+ _wip_close();
+
+ return true;
+ } else {
+ wip.push_back(cpoint);
+ edited_point = wip.size();
+ snap_ignore = false;
+ _polygon_draw();
+ return true;
+ }
+ }
+ } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && wip_active) {
+ _wip_close();
+ }
+
+ } break;
+
+ case MODE_EDIT: {
+ if (mb->get_button_index() == BUTTON_LEFT) {
+ if (mb->is_pressed()) {
+ if (mb->get_control()) {
+ if (poly.size() < 3) {
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_undo_method(node, "set_polygon", poly);
+ poly.push_back(cpoint);
+ undo_redo->add_do_method(node, "set_polygon", poly);
+ undo_redo->add_do_method(this, "_polygon_draw");
+ undo_redo->add_undo_method(this, "_polygon_draw");
+ undo_redo->commit_action();
+ return true;
+ }
+
+ //search edges
+ int closest_idx = -1;
+ Vector2 closest_pos;
+ real_t closest_dist = 1e10;
+ for (int i = 0; i < poly.size(); i++) {
+ Vector2 points[2] = {
+ p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth))),
+ p_camera->unproject_position(gt.xform(Vector3(poly[(i + 1) % poly.size()].x, poly[(i + 1) % poly.size()].y, depth)))
+ };
+
+ Vector2 cp = Geometry2D::get_closest_point_to_segment(gpoint, points);
+ if (cp.distance_squared_to(points[0]) < CMP_EPSILON2 || cp.distance_squared_to(points[1]) < CMP_EPSILON2) {
+ continue; //not valid to reuse point
+ }
+
+ real_t d = cp.distance_to(gpoint);
+ if (d < closest_dist && d < grab_threshold) {
+ closest_dist = d;
+ closest_pos = cp;
+ closest_idx = i;
+ }
+ }
+
+ if (closest_idx >= 0) {
+ pre_move_edit = poly;
+ poly.insert(closest_idx + 1, cpoint);
+ edited_point = closest_idx + 1;
+ edited_point_pos = cpoint;
+ node->call("set_polygon", poly);
+ _polygon_draw();
+ snap_ignore = true;
+
+ return true;
+ }
+ } else {
+ //look for points to move
+
+ int closest_idx = -1;
+ Vector2 closest_pos;
+ real_t closest_dist = 1e10;
+ for (int i = 0; i < poly.size(); i++) {
+ Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth)));
+
+ real_t d = cp.distance_to(gpoint);
+ if (d < closest_dist && d < grab_threshold) {
+ closest_dist = d;
+ closest_pos = cp;
+ closest_idx = i;
+ }
+ }
+
+ if (closest_idx >= 0) {
+ pre_move_edit = poly;
+ edited_point = closest_idx;
+ edited_point_pos = poly[closest_idx];
+ _polygon_draw();
+ snap_ignore = false;
+ return true;
+ }
+ }
+ } else {
+ snap_ignore = false;
+
+ if (edited_point != -1) {
+ //apply
+
+ ERR_FAIL_INDEX_V(edited_point, poly.size(), false);
+ poly.write[edited_point] = edited_point_pos;
+ undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->add_do_method(node, "set_polygon", poly);
+ undo_redo->add_undo_method(node, "set_polygon", pre_move_edit);
+ undo_redo->add_do_method(this, "_polygon_draw");
+ undo_redo->add_undo_method(this, "_polygon_draw");
+ undo_redo->commit_action();
+
+ edited_point = -1;
+ return true;
+ }
+ }
+ }
+ if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) {
+ int closest_idx = -1;
+ Vector2 closest_pos;
+ real_t closest_dist = 1e10;
+ for (int i = 0; i < poly.size(); i++) {
+ Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth)));
+
+ real_t d = cp.distance_to(gpoint);
+ if (d < closest_dist && d < grab_threshold) {
+ closest_dist = d;
+ closest_pos = cp;
+ closest_idx = i;
+ }
+ }
+
+ if (closest_idx >= 0) {
+ undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->add_undo_method(node, "set_polygon", poly);
+ poly.remove(closest_idx);
+ undo_redo->add_do_method(node, "set_polygon", poly);
+ undo_redo->add_do_method(this, "_polygon_draw");
+ undo_redo->add_undo_method(this, "_polygon_draw");
+ undo_redo->commit_action();
+ return true;
+ }
+ }
+
+ } break;
+ }
+ }
+
+ Ref<InputEventMouseMotion> mm = p_event;
+
+ if (mm.is_valid()) {
+ if (edited_point != -1 && (wip_active || mm->get_button_mask() & BUTTON_MASK_LEFT)) {
+ Vector2 gpoint = mm->get_position();
+
+ Vector3 ray_from = p_camera->project_ray_origin(gpoint);
+ Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
+
+ Vector3 spoint;
+
+ if (!p.intersects_ray(ray_from, ray_dir, &spoint)) {
+ return false;
+ }
+
+ spoint = gi.xform(spoint);
+
+ Vector2 cpoint(spoint.x, spoint.y);
+
+ if (snap_ignore && !Input::get_singleton()->is_key_pressed(KEY_CONTROL)) {
+ snap_ignore = false;
+ }
+
+ if (!snap_ignore && Node3DEditor::get_singleton()->is_snap_enabled()) {
+ cpoint = cpoint.snapped(Vector2(
+ Node3DEditor::get_singleton()->get_translate_snap(),
+ Node3DEditor::get_singleton()->get_translate_snap()));
+ }
+ edited_point_pos = cpoint;
+
+ _polygon_draw();
+ }
+ }
+
+ return false;
+}
+
+float CollisionPolygon3DEditor::_get_depth() {
+ if (bool(node->call("_has_editable_3d_polygon_no_depth"))) {
+ return 0;
+ }
+
+ return float(node->call("get_depth"));
+}
+
+void CollisionPolygon3DEditor::_polygon_draw() {
+ if (!node) {
+ return;
+ }
+
+ Vector<Vector2> poly;
+
+ if (wip_active) {
+ poly = wip;
+ } else {
+ poly = node->call("get_polygon");
+ }
+
+ float depth = _get_depth() * 0.5;
+
+ imgeom->clear();
+ imgeom->set_material_override(line_material);
+ imgeom->begin(Mesh::PRIMITIVE_LINES, Ref<Texture2D>());
+
+ Rect2 rect;
+
+ for (int i = 0; i < poly.size(); i++) {
+ Vector2 p, p2;
+ p = i == edited_point ? edited_point_pos : poly[i];
+ if ((wip_active && i == poly.size() - 1) || (((i + 1) % poly.size()) == edited_point)) {
+ p2 = edited_point_pos;
+ } else {
+ p2 = poly[(i + 1) % poly.size()];
+ }
+
+ if (i == 0) {
+ rect.position = p;
+ } else {
+ rect.expand_to(p);
+ }
+
+ Vector3 point = Vector3(p.x, p.y, depth);
+ Vector3 next_point = Vector3(p2.x, p2.y, depth);
+
+ imgeom->set_color(Color(1, 0.3, 0.1, 0.8));
+ imgeom->add_vertex(point);
+ imgeom->set_color(Color(1, 0.3, 0.1, 0.8));
+ imgeom->add_vertex(next_point);
+
+ //Color col=Color(1,0.3,0.1,0.8);
+ //vpc->draw_line(point,next_point,col,2);
+ //vpc->draw_texture(handle,point-handle->get_size()*0.5);
+ }
+
+ rect = rect.grow(1);
+
+ AABB r;
+ r.position.x = rect.position.x;
+ r.position.y = rect.position.y;
+ r.position.z = depth;
+ r.size.x = rect.size.x;
+ r.size.y = rect.size.y;
+ r.size.z = 0;
+
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position);
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(0.3, 0, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position);
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(0.0, 0.3, 0));
+
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0) - Vector3(0.3, 0, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0) + Vector3(0, 0.3, 0));
+
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0) - Vector3(0, 0.3, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0) + Vector3(0.3, 0, 0));
+
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + r.size);
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + r.size - Vector3(0.3, 0, 0));
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + r.size);
+ imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
+ imgeom->add_vertex(r.position + r.size - Vector3(0.0, 0.3, 0));
+
+ imgeom->end();
+
+ m->clear_surfaces();
+
+ if (poly.size() == 0) {
+ return;
+ }
+
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ Vector<Vector3> va;
+ {
+ va.resize(poly.size());
+ Vector3 *w = va.ptrw();
+ for (int i = 0; i < poly.size(); i++) {
+ Vector2 p, p2;
+ p = i == edited_point ? edited_point_pos : poly[i];
+
+ Vector3 point = Vector3(p.x, p.y, depth);
+ w[i] = point;
+ }
+ }
+ a[Mesh::ARRAY_VERTEX] = va;
+ m->add_surface_from_arrays(Mesh::PRIMITIVE_POINTS, a);
+ m->surface_set_material(0, handle_material);
+}
+
+void CollisionPolygon3DEditor::edit(Node *p_collision_polygon) {
+ if (p_collision_polygon) {
+ node = Object::cast_to<Node3D>(p_collision_polygon);
+ //Enable the pencil tool if the polygon is empty
+ if (Vector<Vector2>(node->call("get_polygon")).size() == 0) {
+ _menu_option(MODE_CREATE);
+ }
+ wip.clear();
+ wip_active = false;
+ edited_point = -1;
+ p_collision_polygon->add_child(imgeom);
+ _polygon_draw();
+ set_process(true);
+ prev_depth = -1;
+
+ } else {
+ node = nullptr;
+
+ if (imgeom->get_parent()) {
+ imgeom->get_parent()->remove_child(imgeom);
+ }
+
+ set_process(false);
+ }
+}
+
+void CollisionPolygon3DEditor::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_polygon_draw"), &CollisionPolygon3DEditor::_polygon_draw);
+}
+
+CollisionPolygon3DEditor::CollisionPolygon3DEditor(EditorNode *p_editor) {
+ node = nullptr;
+ editor = p_editor;
+ undo_redo = EditorNode::get_undo_redo();
+
+ add_child(memnew(VSeparator));
+ button_create = memnew(Button);
+ button_create->set_flat(true);
+ add_child(button_create);
+ button_create->connect("pressed", callable_mp(this, &CollisionPolygon3DEditor::_menu_option), varray(MODE_CREATE));
+ button_create->set_toggle_mode(true);
+
+ button_edit = memnew(Button);
+ button_edit->set_flat(true);
+ add_child(button_edit);
+ button_edit->connect("pressed", callable_mp(this, &CollisionPolygon3DEditor::_menu_option), varray(MODE_EDIT));
+ button_edit->set_toggle_mode(true);
+
+ mode = MODE_EDIT;
+ wip_active = false;
+ imgeom = memnew(ImmediateGeometry3D);
+ imgeom->set_transform(Transform(Basis(), Vector3(0, 0, 0.00001)));
+
+ line_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
+ line_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ line_material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ line_material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ line_material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ line_material->set_albedo(Color(1, 1, 1));
+
+ handle_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
+ handle_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ handle_material->set_flag(StandardMaterial3D::FLAG_USE_POINT_SIZE, true);
+ handle_material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ handle_material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ handle_material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ Ref<Texture2D> handle = editor->get_gui_base()->get_theme_icon("Editor3DHandle", "EditorIcons");
+ handle_material->set_point_size(handle->get_width());
+ handle_material->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, handle);
+
+ pointsm = memnew(MeshInstance3D);
+ imgeom->add_child(pointsm);
+ m.instance();
+ pointsm->set_mesh(m);
+ pointsm->set_transform(Transform(Basis(), Vector3(0, 0, 0.00001)));
+
+ snap_ignore = false;
+}
+
+CollisionPolygon3DEditor::~CollisionPolygon3DEditor() {
+ memdelete(imgeom);
+}
+
+void Polygon3DEditorPlugin::edit(Object *p_object) {
+ collision_polygon_editor->edit(Object::cast_to<Node>(p_object));
+}
+
+bool Polygon3DEditorPlugin::handles(Object *p_object) const {
+ return Object::cast_to<Node3D>(p_object) && bool(p_object->call("_is_editable_3d_polygon"));
+}
+
+void Polygon3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ collision_polygon_editor->show();
+ } else {
+ collision_polygon_editor->hide();
+ collision_polygon_editor->edit(nullptr);
+ }
+}
+
+Polygon3DEditorPlugin::Polygon3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ collision_polygon_editor = memnew(CollisionPolygon3DEditor(p_node));
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
+
+ collision_polygon_editor->hide();
+}
+
+Polygon3DEditorPlugin::~Polygon3DEditorPlugin() {
+}
diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.h b/editor/plugins/collision_polygon_3d_editor_plugin.h
new file mode 100644
index 0000000000..98f499031a
--- /dev/null
+++ b/editor/plugins/collision_polygon_3d_editor_plugin.h
@@ -0,0 +1,116 @@
+/*************************************************************************/
+/* collision_polygon_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef COLLISION_POLYGON_EDITOR_PLUGIN_H
+#define COLLISION_POLYGON_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/3d/collision_polygon_3d.h"
+#include "scene/3d/immediate_geometry_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
+
+class CanvasItemEditor;
+
+class CollisionPolygon3DEditor : public HBoxContainer {
+ GDCLASS(CollisionPolygon3DEditor, HBoxContainer);
+
+ UndoRedo *undo_redo;
+ enum Mode {
+
+ MODE_CREATE,
+ MODE_EDIT,
+
+ };
+
+ Mode mode;
+
+ Button *button_create;
+ Button *button_edit;
+
+ Ref<StandardMaterial3D> line_material;
+ Ref<StandardMaterial3D> handle_material;
+
+ EditorNode *editor;
+ Panel *panel;
+ Node3D *node;
+ ImmediateGeometry3D *imgeom;
+ MeshInstance3D *pointsm;
+ Ref<ArrayMesh> m;
+
+ MenuButton *options;
+
+ int edited_point;
+ Vector2 edited_point_pos;
+ Vector<Vector2> pre_move_edit;
+ Vector<Vector2> wip;
+ bool wip_active;
+ bool snap_ignore;
+
+ float prev_depth;
+
+ void _wip_close();
+ void _polygon_draw();
+ void _menu_option(int p_option);
+
+ float _get_depth();
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+public:
+ virtual bool forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event);
+ void edit(Node *p_collision_polygon);
+ CollisionPolygon3DEditor(EditorNode *p_editor);
+ ~CollisionPolygon3DEditor();
+};
+
+class Polygon3DEditorPlugin : public EditorPlugin {
+ GDCLASS(Polygon3DEditorPlugin, EditorPlugin);
+
+ CollisionPolygon3DEditor *collision_polygon_editor;
+ EditorNode *editor;
+
+public:
+ virtual bool forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) override { return collision_polygon_editor->forward_spatial_gui_input(p_camera, p_event); }
+
+ virtual String get_name() const override { return "Polygon3DEditor"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ Polygon3DEditorPlugin(EditorNode *p_node);
+ ~Polygon3DEditorPlugin();
+};
+
+#endif // COLLISION_POLYGON_EDITOR_PLUGIN_H
diff --git a/editor/plugins/collision_polygon_editor_plugin.cpp b/editor/plugins/collision_polygon_editor_plugin.cpp
deleted file mode 100644
index 8620437ac6..0000000000
--- a/editor/plugins/collision_polygon_editor_plugin.cpp
+++ /dev/null
@@ -1,613 +0,0 @@
-/*************************************************************************/
-/* collision_polygon_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "collision_polygon_editor_plugin.h"
-
-#include "canvas_item_editor_plugin.h"
-#include "core/os/file_access.h"
-#include "core/os/input.h"
-#include "core/os/keyboard.h"
-#include "editor/editor_settings.h"
-#include "scene/3d/camera.h"
-#include "spatial_editor_plugin.h"
-
-void Polygon3DEditor::_notification(int p_what) {
-
- switch (p_what) {
-
- case NOTIFICATION_READY: {
-
- button_create->set_icon(get_icon("Edit", "EditorIcons"));
- button_edit->set_icon(get_icon("MovePoint", "EditorIcons"));
- button_edit->set_pressed(true);
- get_tree()->connect("node_removed", this, "_node_removed");
-
- } break;
- case NOTIFICATION_PROCESS: {
- if (!node) {
- return;
- }
-
- if (_get_depth() != prev_depth) {
- _polygon_draw();
- prev_depth = _get_depth();
- }
-
- } break;
- }
-}
-void Polygon3DEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- if (imgeom->get_parent() == p_node)
- p_node->remove_child(imgeom);
- hide();
- set_process(false);
- }
-}
-
-void Polygon3DEditor::_menu_option(int p_option) {
-
- switch (p_option) {
-
- case MODE_CREATE: {
-
- mode = MODE_CREATE;
- button_create->set_pressed(true);
- button_edit->set_pressed(false);
- } break;
- case MODE_EDIT: {
-
- mode = MODE_EDIT;
- button_create->set_pressed(false);
- button_edit->set_pressed(true);
- } break;
- }
-}
-
-void Polygon3DEditor::_wip_close() {
-
- undo_redo->create_action(TTR("Create Polygon3D"));
- undo_redo->add_undo_method(node, "set_polygon", node->call("get_polygon"));
- undo_redo->add_do_method(node, "set_polygon", wip);
- undo_redo->add_do_method(this, "_polygon_draw");
- undo_redo->add_undo_method(this, "_polygon_draw");
- wip.clear();
- wip_active = false;
- mode = MODE_EDIT;
- button_edit->set_pressed(true);
- button_create->set_pressed(false);
- edited_point = -1;
- undo_redo->commit_action();
-}
-
-bool Polygon3DEditor::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event) {
-
- if (!node)
- return false;
-
- Transform gt = node->get_global_transform();
- Transform gi = gt.affine_inverse();
- float depth = _get_depth() * 0.5;
- Vector3 n = gt.basis.get_axis(2).normalized();
- Plane p(gt.origin + n * depth, n);
-
- Ref<InputEventMouseButton> mb = p_event;
-
- if (mb.is_valid()) {
-
- Vector2 gpoint = mb->get_position();
- Vector3 ray_from = p_camera->project_ray_origin(gpoint);
- Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
-
- Vector3 spoint;
-
- if (!p.intersects_ray(ray_from, ray_dir, &spoint))
- return false;
-
- spoint = gi.xform(spoint);
-
- Vector2 cpoint(spoint.x, spoint.y);
-
- //DO NOT snap here, it's confusing in 3D for adding points.
- //Let the snap happen when the point is being moved, instead.
- //cpoint = CanvasItemEditor::get_singleton()->snap_point(cpoint);
-
- Vector<Vector2> poly = node->call("get_polygon");
-
- //first check if a point is to be added (segment split)
- real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
-
- switch (mode) {
-
- case MODE_CREATE: {
-
- if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
-
- if (!wip_active) {
-
- wip.clear();
- wip.push_back(cpoint);
- wip_active = true;
- edited_point_pos = cpoint;
- snap_ignore = false;
- _polygon_draw();
- edited_point = 1;
- return true;
- } else {
-
- if (wip.size() > 1 && p_camera->unproject_position(gt.xform(Vector3(wip[0].x, wip[0].y, depth))).distance_to(gpoint) < grab_threshold) {
- //wip closed
- _wip_close();
-
- return true;
- } else {
-
- wip.push_back(cpoint);
- edited_point = wip.size();
- snap_ignore = false;
- _polygon_draw();
- return true;
- }
- }
- } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && wip_active) {
- _wip_close();
- }
-
- } break;
-
- case MODE_EDIT: {
-
- if (mb->get_button_index() == BUTTON_LEFT) {
- if (mb->is_pressed()) {
-
- if (mb->get_control()) {
-
- if (poly.size() < 3) {
-
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_undo_method(node, "set_polygon", poly);
- poly.push_back(cpoint);
- undo_redo->add_do_method(node, "set_polygon", poly);
- undo_redo->add_do_method(this, "_polygon_draw");
- undo_redo->add_undo_method(this, "_polygon_draw");
- undo_redo->commit_action();
- return true;
- }
-
- //search edges
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 points[2] = {
- p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth))),
- p_camera->unproject_position(gt.xform(Vector3(poly[(i + 1) % poly.size()].x, poly[(i + 1) % poly.size()].y, depth)))
- };
-
- Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint, points);
- if (cp.distance_squared_to(points[0]) < CMP_EPSILON2 || cp.distance_squared_to(points[1]) < CMP_EPSILON2)
- continue; //not valid to reuse point
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- pre_move_edit = poly;
- poly.insert(closest_idx + 1, cpoint);
- edited_point = closest_idx + 1;
- edited_point_pos = cpoint;
- node->call("set_polygon", poly);
- _polygon_draw();
- snap_ignore = true;
-
- return true;
- }
- } else {
-
- //look for points to move
-
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth)));
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- pre_move_edit = poly;
- edited_point = closest_idx;
- edited_point_pos = poly[closest_idx];
- _polygon_draw();
- snap_ignore = false;
- return true;
- }
- }
- } else {
-
- snap_ignore = false;
-
- if (edited_point != -1) {
-
- //apply
-
- ERR_FAIL_INDEX_V(edited_point, poly.size(), false);
- poly.write[edited_point] = edited_point_pos;
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_do_method(node, "set_polygon", poly);
- undo_redo->add_undo_method(node, "set_polygon", pre_move_edit);
- undo_redo->add_do_method(this, "_polygon_draw");
- undo_redo->add_undo_method(this, "_polygon_draw");
- undo_redo->commit_action();
-
- edited_point = -1;
- return true;
- }
- }
- }
- if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) {
-
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth)));
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
- undo_redo->add_undo_method(node, "set_polygon", poly);
- poly.remove(closest_idx);
- undo_redo->add_do_method(node, "set_polygon", poly);
- undo_redo->add_do_method(this, "_polygon_draw");
- undo_redo->add_undo_method(this, "_polygon_draw");
- undo_redo->commit_action();
- return true;
- }
- }
-
- } break;
- }
- }
-
- Ref<InputEventMouseMotion> mm = p_event;
-
- if (mm.is_valid()) {
- if (edited_point != -1 && (wip_active || mm->get_button_mask() & BUTTON_MASK_LEFT)) {
-
- Vector2 gpoint = mm->get_position();
-
- Vector3 ray_from = p_camera->project_ray_origin(gpoint);
- Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
-
- Vector3 spoint;
-
- if (!p.intersects_ray(ray_from, ray_dir, &spoint))
- return false;
-
- spoint = gi.xform(spoint);
-
- Vector2 cpoint(spoint.x, spoint.y);
-
- if (snap_ignore && !Input::get_singleton()->is_key_pressed(KEY_CONTROL)) {
- snap_ignore = false;
- }
-
- if (!snap_ignore && SpatialEditor::get_singleton()->is_snap_enabled()) {
- cpoint = cpoint.snapped(Vector2(
- SpatialEditor::get_singleton()->get_translate_snap(),
- SpatialEditor::get_singleton()->get_translate_snap()));
- }
- edited_point_pos = cpoint;
-
- _polygon_draw();
- }
- }
-
- return false;
-}
-
-float Polygon3DEditor::_get_depth() {
-
- if (bool(node->call("_has_editable_3d_polygon_no_depth")))
- return 0;
-
- return float(node->call("get_depth"));
-}
-
-void Polygon3DEditor::_polygon_draw() {
-
- if (!node)
- return;
-
- Vector<Vector2> poly;
-
- if (wip_active)
- poly = wip;
- else
- poly = node->call("get_polygon");
-
- float depth = _get_depth() * 0.5;
-
- imgeom->clear();
- imgeom->set_material_override(line_material);
- imgeom->begin(Mesh::PRIMITIVE_LINES, Ref<Texture>());
-
- Rect2 rect;
-
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 p, p2;
- p = i == edited_point ? edited_point_pos : poly[i];
- if ((wip_active && i == poly.size() - 1) || (((i + 1) % poly.size()) == edited_point))
- p2 = edited_point_pos;
- else
- p2 = poly[(i + 1) % poly.size()];
-
- if (i == 0)
- rect.position = p;
- else
- rect.expand_to(p);
-
- Vector3 point = Vector3(p.x, p.y, depth);
- Vector3 next_point = Vector3(p2.x, p2.y, depth);
-
- imgeom->set_color(Color(1, 0.3, 0.1, 0.8));
- imgeom->add_vertex(point);
- imgeom->set_color(Color(1, 0.3, 0.1, 0.8));
- imgeom->add_vertex(next_point);
-
- //Color col=Color(1,0.3,0.1,0.8);
- //vpc->draw_line(point,next_point,col,2);
- //vpc->draw_texture(handle,point-handle->get_size()*0.5);
- }
-
- rect = rect.grow(1);
-
- AABB r;
- r.position.x = rect.position.x;
- r.position.y = rect.position.y;
- r.position.z = depth;
- r.size.x = rect.size.x;
- r.size.y = rect.size.y;
- r.size.z = 0;
-
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position);
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(0.3, 0, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position);
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(0.0, 0.3, 0));
-
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0) - Vector3(0.3, 0, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0) + Vector3(0, 0.3, 0));
-
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0) - Vector3(0, 0.3, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0) + Vector3(0.3, 0, 0));
-
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + r.size);
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + r.size - Vector3(0.3, 0, 0));
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + r.size);
- imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2));
- imgeom->add_vertex(r.position + r.size - Vector3(0.0, 0.3, 0));
-
- imgeom->end();
-
- while (m->get_surface_count()) {
- m->surface_remove(0);
- }
-
- if (poly.size() == 0)
- return;
-
- Array a;
- a.resize(Mesh::ARRAY_MAX);
- PoolVector<Vector3> va;
- {
-
- va.resize(poly.size());
- PoolVector<Vector3>::Write w = va.write();
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 p, p2;
- p = i == edited_point ? edited_point_pos : poly[i];
-
- Vector3 point = Vector3(p.x, p.y, depth);
- w[i] = point;
- }
- }
- a[Mesh::ARRAY_VERTEX] = va;
- m->add_surface_from_arrays(Mesh::PRIMITIVE_POINTS, a);
- m->surface_set_material(0, handle_material);
-}
-
-void Polygon3DEditor::edit(Node *p_collision_polygon) {
-
- if (p_collision_polygon) {
-
- node = Object::cast_to<Spatial>(p_collision_polygon);
- //Enable the pencil tool if the polygon is empty
- if (Vector<Vector2>(node->call("get_polygon")).size() == 0) {
- _menu_option(MODE_CREATE);
- }
- wip.clear();
- wip_active = false;
- edited_point = -1;
- p_collision_polygon->add_child(imgeom);
- _polygon_draw();
- set_process(true);
- prev_depth = -1;
-
- } else {
- node = NULL;
-
- if (imgeom->get_parent())
- imgeom->get_parent()->remove_child(imgeom);
-
- set_process(false);
- }
-}
-
-void Polygon3DEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_menu_option"), &Polygon3DEditor::_menu_option);
- ClassDB::bind_method(D_METHOD("_polygon_draw"), &Polygon3DEditor::_polygon_draw);
- ClassDB::bind_method(D_METHOD("_node_removed"), &Polygon3DEditor::_node_removed);
-}
-
-Polygon3DEditor::Polygon3DEditor(EditorNode *p_editor) {
-
- node = NULL;
- editor = p_editor;
- undo_redo = EditorNode::get_undo_redo();
-
- add_child(memnew(VSeparator));
- button_create = memnew(ToolButton);
- add_child(button_create);
- button_create->connect("pressed", this, "_menu_option", varray(MODE_CREATE));
- button_create->set_toggle_mode(true);
-
- button_edit = memnew(ToolButton);
- add_child(button_edit);
- button_edit->connect("pressed", this, "_menu_option", varray(MODE_EDIT));
- button_edit->set_toggle_mode(true);
-
- mode = MODE_EDIT;
- wip_active = false;
- imgeom = memnew(ImmediateGeometry);
- imgeom->set_transform(Transform(Basis(), Vector3(0, 0, 0.00001)));
-
- line_material = Ref<SpatialMaterial>(memnew(SpatialMaterial));
- line_material->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- line_material->set_line_width(3.0);
- line_material->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- line_material->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- line_material->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
- line_material->set_albedo(Color(1, 1, 1));
-
- handle_material = Ref<SpatialMaterial>(memnew(SpatialMaterial));
- handle_material->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- handle_material->set_flag(SpatialMaterial::FLAG_USE_POINT_SIZE, true);
- handle_material->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- handle_material->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- handle_material->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
- Ref<Texture> handle = editor->get_gui_base()->get_icon("Editor3DHandle", "EditorIcons");
- handle_material->set_point_size(handle->get_width());
- handle_material->set_texture(SpatialMaterial::TEXTURE_ALBEDO, handle);
-
- pointsm = memnew(MeshInstance);
- imgeom->add_child(pointsm);
- m.instance();
- pointsm->set_mesh(m);
- pointsm->set_transform(Transform(Basis(), Vector3(0, 0, 0.00001)));
-
- snap_ignore = false;
-}
-
-Polygon3DEditor::~Polygon3DEditor() {
-
- memdelete(imgeom);
-}
-
-void Polygon3DEditorPlugin::edit(Object *p_object) {
-
- collision_polygon_editor->edit(Object::cast_to<Node>(p_object));
-}
-
-bool Polygon3DEditorPlugin::handles(Object *p_object) const {
-
- return Object::cast_to<Spatial>(p_object) && bool(p_object->call("_is_editable_3d_polygon"));
-}
-
-void Polygon3DEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- collision_polygon_editor->show();
- } else {
-
- collision_polygon_editor->hide();
- collision_polygon_editor->edit(NULL);
- }
-}
-
-Polygon3DEditorPlugin::Polygon3DEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- collision_polygon_editor = memnew(Polygon3DEditor(p_node));
- SpatialEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
-
- collision_polygon_editor->hide();
-}
-
-Polygon3DEditorPlugin::~Polygon3DEditorPlugin() {
-}
diff --git a/editor/plugins/collision_polygon_editor_plugin.h b/editor/plugins/collision_polygon_editor_plugin.h
deleted file mode 100644
index 1871c6ee7e..0000000000
--- a/editor/plugins/collision_polygon_editor_plugin.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*************************************************************************/
-/* collision_polygon_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef COLLISION_POLYGON_EDITOR_PLUGIN_H
-#define COLLISION_POLYGON_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/3d/collision_polygon.h"
-#include "scene/3d/immediate_geometry.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/gui/tool_button.h"
-
-class CanvasItemEditor;
-
-class Polygon3DEditor : public HBoxContainer {
-
- GDCLASS(Polygon3DEditor, HBoxContainer);
-
- UndoRedo *undo_redo;
- enum Mode {
-
- MODE_CREATE,
- MODE_EDIT,
-
- };
-
- Mode mode;
-
- ToolButton *button_create;
- ToolButton *button_edit;
-
- Ref<SpatialMaterial> line_material;
- Ref<SpatialMaterial> handle_material;
-
- EditorNode *editor;
- Panel *panel;
- Spatial *node;
- ImmediateGeometry *imgeom;
- MeshInstance *pointsm;
- Ref<ArrayMesh> m;
-
- MenuButton *options;
-
- int edited_point;
- Vector2 edited_point_pos;
- Vector<Vector2> pre_move_edit;
- Vector<Vector2> wip;
- bool wip_active;
- bool snap_ignore;
-
- float prev_depth;
-
- void _wip_close();
- void _polygon_draw();
- void _menu_option(int p_option);
-
- float _get_depth();
-
-protected:
- void _notification(int p_what);
- void _node_removed(Node *p_node);
- static void _bind_methods();
-
-public:
- virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event);
- void edit(Node *p_collision_polygon);
- Polygon3DEditor(EditorNode *p_editor);
- ~Polygon3DEditor();
-};
-
-class Polygon3DEditorPlugin : public EditorPlugin {
-
- GDCLASS(Polygon3DEditorPlugin, EditorPlugin);
-
- Polygon3DEditor *collision_polygon_editor;
- EditorNode *editor;
-
-public:
- virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event) { return collision_polygon_editor->forward_spatial_gui_input(p_camera, p_event); }
-
- virtual String get_name() const { return "Polygon3DEditor"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- Polygon3DEditorPlugin(EditorNode *p_node);
- ~Polygon3DEditorPlugin();
-};
-
-#endif // COLLISION_POLYGON_EDITOR_PLUGIN_H
diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp
index be9e5b0e3a..105ac24950 100644
--- a/editor/plugins/collision_shape_2d_editor_plugin.cpp
+++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -36,11 +36,17 @@
#include "scene/resources/concave_polygon_shape_2d.h"
#include "scene/resources/convex_polygon_shape_2d.h"
#include "scene/resources/line_shape_2d.h"
+#include "scene/resources/ray_shape_2d.h"
#include "scene/resources/rectangle_shape_2d.h"
#include "scene/resources/segment_shape_2d.h"
-Variant CollisionShape2DEditor::get_handle_value(int idx) const {
+void CollisionShape2DEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ }
+}
+Variant CollisionShape2DEditor::get_handle_value(int idx) const {
switch (shape_type) {
case CAPSULE_SHAPE: {
Ref<CapsuleShape2D> capsule = node->get_shape();
@@ -63,18 +69,16 @@ Variant CollisionShape2DEditor::get_handle_value(int idx) const {
} break;
case CONCAVE_POLYGON_SHAPE: {
-
} break;
case CONVEX_POLYGON_SHAPE: {
-
} break;
case LINE_SHAPE: {
Ref<LineShape2D> line = node->get_shape();
if (idx == 0) {
- return line->get_d();
+ return line->get_distance();
} else {
return line->get_normal();
}
@@ -115,7 +119,6 @@ Variant CollisionShape2DEditor::get_handle_value(int idx) const {
}
void CollisionShape2DEditor::set_handle(int idx, Point2 &p_point) {
-
switch (shape_type) {
case CAPSULE_SHAPE: {
if (idx < 2) {
@@ -143,11 +146,9 @@ void CollisionShape2DEditor::set_handle(int idx, Point2 &p_point) {
} break;
case CONCAVE_POLYGON_SHAPE: {
-
} break;
case CONVEX_POLYGON_SHAPE: {
-
} break;
case LINE_SHAPE: {
@@ -155,7 +156,7 @@ void CollisionShape2DEditor::set_handle(int idx, Point2 &p_point) {
Ref<LineShape2D> line = node->get_shape();
if (idx == 0) {
- line->set_d(p_point.length());
+ line->set_distance(p_point.length());
} else {
line->set_normal(p_point.normalized());
}
@@ -210,7 +211,6 @@ void CollisionShape2DEditor::set_handle(int idx, Point2 &p_point) {
}
void CollisionShape2DEditor::commit_handle(int idx, Variant &p_org) {
-
undo_redo->create_action(TTR("Set Handle"));
switch (shape_type) {
@@ -242,20 +242,20 @@ void CollisionShape2DEditor::commit_handle(int idx, Variant &p_org) {
} break;
case CONCAVE_POLYGON_SHAPE: {
-
+ // Cannot be edited directly, use CollisionPolygon2D instead.
} break;
case CONVEX_POLYGON_SHAPE: {
-
+ // Cannot be edited directly, use CollisionPolygon2D instead.
} break;
case LINE_SHAPE: {
Ref<LineShape2D> line = node->get_shape();
if (idx == 0) {
- undo_redo->add_do_method(line.ptr(), "set_d", line->get_d());
+ undo_redo->add_do_method(line.ptr(), "set_distance", line->get_distance());
undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(line.ptr(), "set_d", p_org);
+ undo_redo->add_undo_method(line.ptr(), "set_distance", p_org);
undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
} else {
undo_redo->add_do_method(line.ptr(), "set_normal", line->get_normal());
@@ -307,7 +307,6 @@ void CollisionShape2DEditor::commit_handle(int idx, Variant &p_org) {
}
bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
-
if (!node) {
return false;
}
@@ -324,7 +323,6 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
if (mb.is_valid()) {
-
Vector2 gpoint = mb->get_position();
if (mb->get_button_index() == BUTTON_LEFT) {
@@ -366,7 +364,6 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid()) {
-
if (edit_handle == -1 || !pressed) {
return false;
}
@@ -383,7 +380,6 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e
}
void CollisionShape2DEditor::_get_current_shape_type() {
-
if (!node) {
return;
}
@@ -418,7 +414,6 @@ void CollisionShape2DEditor::_get_current_shape_type() {
}
void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
if (!node) {
return;
}
@@ -435,7 +430,7 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
- Ref<Texture> h = get_icon("EditorHandle", "EditorIcons");
+ Ref<Texture2D> h = get_theme_icon("EditorHandle", "EditorIcons");
Vector2 size = h->get_size() * 0.5;
handles.clear();
@@ -448,8 +443,8 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
float radius = shape->get_radius();
float height = shape->get_height() / 2;
- handles.write[0] = Point2(radius, -height);
- handles.write[1] = Point2(0, -(height + radius));
+ handles.write[0] = Point2(radius, height);
+ handles.write[1] = Point2(0, height + radius);
p_overlay->draw_texture(h, gt.xform(handles[0]) - size);
p_overlay->draw_texture(h, gt.xform(handles[1]) - size);
@@ -467,19 +462,17 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
} break;
case CONCAVE_POLYGON_SHAPE: {
-
} break;
case CONVEX_POLYGON_SHAPE: {
-
} break;
case LINE_SHAPE: {
Ref<LineShape2D> shape = node->get_shape();
handles.resize(2);
- handles.write[0] = shape->get_normal() * shape->get_d();
- handles.write[1] = shape->get_normal() * (shape->get_d() + 30.0);
+ handles.write[0] = shape->get_normal() * shape->get_distance();
+ handles.write[1] = shape->get_normal() * (shape->get_distance() + 30.0);
p_overlay->draw_texture(h, gt.xform(handles[0]) - size);
p_overlay->draw_texture(h, gt.xform(handles[1]) - size);
@@ -502,8 +495,8 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
handles.resize(3);
Vector2 ext = shape->get_extents();
handles.write[0] = Point2(ext.x, 0);
- handles.write[1] = Point2(0, -ext.y);
- handles.write[2] = Point2(ext.x, -ext.y);
+ handles.write[1] = Point2(0, ext.y);
+ handles.write[2] = Point2(ext.x, ext.y);
p_overlay->draw_texture(h, gt.xform(handles[0]) - size);
p_overlay->draw_texture(h, gt.xform(handles[1]) - size);
@@ -525,8 +518,19 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
}
}
-void CollisionShape2DEditor::edit(Node *p_node) {
+void CollisionShape2DEditor::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ get_tree()->connect("node_removed", callable_mp(this, &CollisionShape2DEditor::_node_removed));
+ } break;
+
+ case NOTIFICATION_EXIT_TREE: {
+ get_tree()->disconnect("node_removed", callable_mp(this, &CollisionShape2DEditor::_node_removed));
+ } break;
+ }
+}
+void CollisionShape2DEditor::edit(Node *p_node) {
if (!canvas_item_editor) {
canvas_item_editor = CanvasItemEditor::get_singleton();
}
@@ -540,21 +544,19 @@ void CollisionShape2DEditor::edit(Node *p_node) {
edit_handle = -1;
shape_type = -1;
- node = NULL;
+ node = nullptr;
}
canvas_item_editor->update_viewport();
}
void CollisionShape2DEditor::_bind_methods() {
-
ClassDB::bind_method("_get_current_shape_type", &CollisionShape2DEditor::_get_current_shape_type);
}
CollisionShape2DEditor::CollisionShape2DEditor(EditorNode *p_editor) {
-
- node = NULL;
- canvas_item_editor = NULL;
+ node = nullptr;
+ canvas_item_editor = nullptr;
editor = p_editor;
undo_redo = p_editor->get_undo_redo();
@@ -564,24 +566,20 @@ CollisionShape2DEditor::CollisionShape2DEditor(EditorNode *p_editor) {
}
void CollisionShape2DEditorPlugin::edit(Object *p_obj) {
-
collision_shape_2d_editor->edit(Object::cast_to<Node>(p_obj));
}
bool CollisionShape2DEditorPlugin::handles(Object *p_obj) const {
-
return p_obj->is_class("CollisionShape2D");
}
void CollisionShape2DEditorPlugin::make_visible(bool visible) {
-
if (!visible) {
- edit(NULL);
+ edit(nullptr);
}
}
CollisionShape2DEditorPlugin::CollisionShape2DEditorPlugin(EditorNode *p_editor) {
-
editor = p_editor;
collision_shape_2d_editor = memnew(CollisionShape2DEditor(p_editor));
diff --git a/editor/plugins/collision_shape_2d_editor_plugin.h b/editor/plugins/collision_shape_2d_editor_plugin.h
index 025420a886..083ceb4b38 100644
--- a/editor/plugins/collision_shape_2d_editor_plugin.h
+++ b/editor/plugins/collision_shape_2d_editor_plugin.h
@@ -71,6 +71,8 @@ class CollisionShape2DEditor : public Control {
void _get_current_shape_type();
protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
static void _bind_methods();
public:
@@ -88,14 +90,14 @@ class CollisionShape2DEditorPlugin : public EditorPlugin {
EditorNode *editor;
public:
- virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return collision_shape_2d_editor->forward_canvas_gui_input(p_event); }
- virtual void forward_canvas_draw_over_viewport(Control *p_overlay) { collision_shape_2d_editor->forward_canvas_draw_over_viewport(p_overlay); }
-
- virtual String get_name() const { return "CollisionShape2D"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_obj);
- virtual bool handles(Object *p_obj) const;
- virtual void make_visible(bool visible);
+ virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return collision_shape_2d_editor->forward_canvas_gui_input(p_event); }
+ virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override { collision_shape_2d_editor->forward_canvas_draw_over_viewport(p_overlay); }
+
+ virtual String get_name() const override { return "CollisionShape2D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_obj) override;
+ virtual bool handles(Object *p_obj) const override;
+ virtual void make_visible(bool visible) override;
CollisionShape2DEditorPlugin(EditorNode *p_editor);
~CollisionShape2DEditorPlugin();
diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp
index 655048c271..32f7d02af2 100644
--- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp
+++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp
@@ -37,53 +37,42 @@
#include "scene/resources/particles_material.h"
void CPUParticles2DEditorPlugin::edit(Object *p_object) {
-
particles = Object::cast_to<CPUParticles2D>(p_object);
}
bool CPUParticles2DEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("CPUParticles2D");
}
void CPUParticles2DEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
-
toolbar->show();
} else {
-
toolbar->hide();
}
}
void CPUParticles2DEditorPlugin::_file_selected(const String &p_file) {
-
source_emission_file = p_file;
- emission_mask->popup_centered_minsize();
+ emission_mask->popup_centered();
}
void CPUParticles2DEditorPlugin::_menu_callback(int p_idx) {
-
switch (p_idx) {
case MENU_LOAD_EMISSION_MASK: {
-
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} break;
case MENU_CLEAR_EMISSION_MASK: {
-
- emission_mask->popup_centered_minsize();
+ emission_mask->popup_centered();
} break;
case MENU_RESTART: {
-
particles->restart();
}
}
}
void CPUParticles2DEditorPlugin::_generate_emission_mask() {
-
Ref<Image> img;
img.instance();
Error err = ImageLoader::load_image(source_emission_file, img);
@@ -118,18 +107,15 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
int vpc = 0;
{
- PoolVector<uint8_t> data = img->get_data();
- PoolVector<uint8_t>::Read r = data.read();
+ Vector<uint8_t> data = img->get_data();
+ const uint8_t *r = data.ptr();
for (int i = 0; i < s.width; i++) {
for (int j = 0; j < s.height; j++) {
-
uint8_t a = r[(j * s.width + i) * 4 + 3];
if (a > 128) {
-
if (emode == EMISSION_MODE_SOLID) {
-
if (capture_colors) {
valid_colors.write[vpc * 4 + 0] = r[(j * s.width + i) * 4 + 0];
valid_colors.write[vpc * 4 + 1] = r[(j * s.width + i) * 4 + 1];
@@ -139,19 +125,18 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
valid_positions.write[vpc++] = Point2(i, j);
} else {
-
bool on_border = false;
for (int x = i - 1; x <= i + 1; x++) {
for (int y = j - 1; y <= j + 1; y++) {
-
if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) {
on_border = true;
break;
}
}
- if (on_border)
+ if (on_border) {
break;
+ }
}
if (on_border) {
@@ -161,9 +146,9 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
Vector2 normal;
for (int x = i - 2; x <= i + 2; x++) {
for (int y = j - 2; y <= j + 2; y++) {
-
- if (x == i && y == j)
+ if (x == i && y == j) {
continue;
+ }
if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) {
normal += Vector2(x - i, y - j).normalized();
@@ -198,9 +183,9 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
ERR_FAIL_COND_MSG(valid_positions.size() == 0, "No pixels with transparency > 128 in image...");
if (capture_colors) {
- PoolColorArray pca;
+ PackedColorArray pca;
pca.resize(vpc);
- PoolColorArray::Write pcaw = pca.write();
+ Color *pcaw = pca.ptrw();
for (int i = 0; i < vpc; i += 1) {
Color color;
color.r = valid_colors[i * 4 + 0] / 255.0f;
@@ -214,9 +199,9 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
if (valid_normals.size()) {
particles->set_emission_shape(CPUParticles2D::EMISSION_SHAPE_DIRECTED_POINTS);
- PoolVector2Array norms;
+ PackedVector2Array norms;
norms.resize(valid_normals.size());
- PoolVector2Array::Write normsw = norms.write();
+ Vector2 *normsw = norms.ptrw();
for (int i = 0; i < valid_normals.size(); i += 1) {
normsw[i] = valid_normals[i];
}
@@ -226,9 +211,9 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
}
{
- PoolVector2Array points;
+ PackedVector2Array points;
points.resize(valid_positions.size());
- PoolVector2Array::Write pointsw = points.write();
+ Vector2 *pointsw = points.ptrw();
for (int i = 0; i < valid_positions.size(); i += 1) {
pointsw[i] = valid_positions[i];
}
@@ -237,25 +222,18 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
}
void CPUParticles2DEditorPlugin::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
-
- menu->get_popup()->connect("id_pressed", this, "_menu_callback");
- menu->set_icon(menu->get_popup()->get_icon("Particles2D", "EditorIcons"));
- file->connect("file_selected", this, "_file_selected");
+ menu->get_popup()->connect("id_pressed", callable_mp(this, &CPUParticles2DEditorPlugin::_menu_callback));
+ menu->set_icon(epoints->get_theme_icon("CPUParticles2D", "EditorIcons"));
+ file->connect("file_selected", callable_mp(this, &CPUParticles2DEditorPlugin::_file_selected));
}
}
void CPUParticles2DEditorPlugin::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_menu_callback"), &CPUParticles2DEditorPlugin::_menu_callback);
- ClassDB::bind_method(D_METHOD("_file_selected"), &CPUParticles2DEditorPlugin::_file_selected);
- ClassDB::bind_method(D_METHOD("_generate_emission_mask"), &CPUParticles2DEditorPlugin::_generate_emission_mask);
}
CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin(EditorNode *p_node) {
-
- particles = NULL;
+ particles = nullptr;
editor = p_node;
undo_redo = editor->get_undo_redo();
@@ -266,11 +244,9 @@ CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin(EditorNode *p_node) {
toolbar->add_child(memnew(VSeparator));
menu = memnew(MenuButton);
- menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK);
- menu->get_popup()->add_separator();
menu->get_popup()->add_item(TTR("Restart"), MENU_RESTART);
- // menu->get_popup()->add_item(TTR("Clear Emission Mask"), MENU_CLEAR_EMISSION_MASK);
- menu->set_text(TTR("Particles"));
+ menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK);
+ menu->set_text(TTR("CPUParticles2D"));
menu->set_switch_on_hover(true);
toolbar->add_child(menu);
@@ -280,7 +256,7 @@ CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin(EditorNode *p_node) {
for (List<String>::Element *E = ext.front(); E; E = E->next()) {
file->add_filter("*." + E->get() + "; " + E->get().to_upper());
}
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
toolbar->add_child(file);
epoints = memnew(SpinBox);
@@ -305,7 +281,7 @@ CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin(EditorNode *p_node) {
toolbar->add_child(emission_mask);
- emission_mask->connect("confirmed", this, "_generate_emission_mask");
+ emission_mask->connect("confirmed", callable_mp(this, &CPUParticles2DEditorPlugin::_generate_emission_mask));
}
CPUParticles2DEditorPlugin::~CPUParticles2DEditorPlugin() {
diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.h b/editor/plugins/cpu_particles_2d_editor_plugin.h
index 21b06b6489..58984d6d16 100644
--- a/editor/plugins/cpu_particles_2d_editor_plugin.h
+++ b/editor/plugins/cpu_particles_2d_editor_plugin.h
@@ -39,7 +39,6 @@
#include "scene/gui/file_dialog.h"
class CPUParticles2DEditorPlugin : public EditorPlugin {
-
GDCLASS(CPUParticles2DEditorPlugin, EditorPlugin);
enum {
@@ -80,11 +79,11 @@ protected:
static void _bind_methods();
public:
- virtual String get_name() const { return "CPUParticles2D"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "CPUParticles2D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
CPUParticles2DEditorPlugin(EditorNode *p_node);
~CPUParticles2DEditorPlugin();
diff --git a/editor/plugins/cpu_particles_3d_editor_plugin.cpp b/editor/plugins/cpu_particles_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..d44e487ae4
--- /dev/null
+++ b/editor/plugins/cpu_particles_3d_editor_plugin.cpp
@@ -0,0 +1,131 @@
+/*************************************************************************/
+/* cpu_particles_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "cpu_particles_3d_editor_plugin.h"
+
+#include "editor/plugins/node_3d_editor_plugin.h"
+
+void CPUParticles3DEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ hide();
+ }
+}
+
+void CPUParticles3DEditor::_notification(int p_notification) {
+ if (p_notification == NOTIFICATION_ENTER_TREE) {
+ options->set_icon(get_theme_icon("CPUParticles3D", "EditorIcons"));
+ }
+}
+
+void CPUParticles3DEditor::_menu_option(int p_option) {
+ switch (p_option) {
+ case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE: {
+ emission_tree_dialog->popup_scenetree_dialog();
+
+ } break;
+
+ case MENU_OPTION_RESTART: {
+ node->restart();
+
+ } break;
+ }
+}
+
+void CPUParticles3DEditor::edit(CPUParticles3D *p_particles) {
+ base_node = p_particles;
+ node = p_particles;
+}
+
+void CPUParticles3DEditor::_generate_emission_points() {
+ /// hacer codigo aca
+ Vector<Vector3> points;
+ Vector<Vector3> normals;
+
+ if (!_generate(points, normals)) {
+ return;
+ }
+
+ if (normals.size() == 0) {
+ node->set_emission_shape(CPUParticles3D::EMISSION_SHAPE_POINTS);
+ node->set_emission_points(points);
+ } else {
+ node->set_emission_shape(CPUParticles3D::EMISSION_SHAPE_DIRECTED_POINTS);
+ node->set_emission_points(points);
+ node->set_emission_normals(normals);
+ }
+}
+
+void CPUParticles3DEditor::_bind_methods() {
+}
+
+CPUParticles3DEditor::CPUParticles3DEditor() {
+ particles_editor_hb = memnew(HBoxContainer);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb);
+ options = memnew(MenuButton);
+ options->set_switch_on_hover(true);
+ particles_editor_hb->add_child(options);
+ particles_editor_hb->hide();
+
+ options->set_text(TTR("CPUParticles3D"));
+ options->get_popup()->add_item(TTR("Restart"), MENU_OPTION_RESTART);
+ options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE);
+ options->get_popup()->connect("id_pressed", callable_mp(this, &CPUParticles3DEditor::_menu_option));
+}
+
+void CPUParticles3DEditorPlugin::edit(Object *p_object) {
+ particles_editor->edit(Object::cast_to<CPUParticles3D>(p_object));
+}
+
+bool CPUParticles3DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("CPUParticles3D");
+}
+
+void CPUParticles3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ particles_editor->show();
+ particles_editor->particles_editor_hb->show();
+ } else {
+ particles_editor->particles_editor_hb->hide();
+ particles_editor->hide();
+ particles_editor->edit(nullptr);
+ }
+}
+
+CPUParticles3DEditorPlugin::CPUParticles3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ particles_editor = memnew(CPUParticles3DEditor);
+ editor->get_viewport()->add_child(particles_editor);
+
+ particles_editor->hide();
+}
+
+CPUParticles3DEditorPlugin::~CPUParticles3DEditorPlugin() {
+}
diff --git a/editor/plugins/cpu_particles_3d_editor_plugin.h b/editor/plugins/cpu_particles_3d_editor_plugin.h
new file mode 100644
index 0000000000..90300daf71
--- /dev/null
+++ b/editor/plugins/cpu_particles_3d_editor_plugin.h
@@ -0,0 +1,83 @@
+/*************************************************************************/
+/* cpu_particles_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef CPU_PARTICLES_EDITOR_PLUGIN_H
+#define CPU_PARTICLES_EDITOR_PLUGIN_H
+
+#include "editor/plugins/gpu_particles_3d_editor_plugin.h"
+#include "scene/3d/cpu_particles_3d.h"
+
+class CPUParticles3DEditor : public GPUParticles3DEditorBase {
+ GDCLASS(CPUParticles3DEditor, GPUParticles3DEditorBase);
+
+ enum Menu {
+
+ MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE,
+ MENU_OPTION_CLEAR_EMISSION_VOLUME,
+ MENU_OPTION_RESTART
+
+ };
+
+ CPUParticles3D *node;
+
+ void _menu_option(int);
+
+ friend class CPUParticles3DEditorPlugin;
+
+ virtual void _generate_emission_points() override;
+
+protected:
+ void _notification(int p_notification);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+public:
+ void edit(CPUParticles3D *p_particles);
+ CPUParticles3DEditor();
+};
+
+class CPUParticles3DEditorPlugin : public EditorPlugin {
+ GDCLASS(CPUParticles3DEditorPlugin, EditorPlugin);
+
+ CPUParticles3DEditor *particles_editor;
+ EditorNode *editor;
+
+public:
+ virtual String get_name() const override { return "CPUParticles3D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ CPUParticles3DEditorPlugin(EditorNode *p_node);
+ ~CPUParticles3DEditorPlugin();
+};
+
+#endif // CPU_PARTICLES_EDITOR_PLUGIN_H
diff --git a/editor/plugins/cpu_particles_editor_plugin.cpp b/editor/plugins/cpu_particles_editor_plugin.cpp
deleted file mode 100644
index 2074ba6b99..0000000000
--- a/editor/plugins/cpu_particles_editor_plugin.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*************************************************************************/
-/* cpu_particles_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "cpu_particles_editor_plugin.h"
-
-#include "editor/plugins/spatial_editor_plugin.h"
-
-void CPUParticlesEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- hide();
- }
-}
-
-void CPUParticlesEditor::_notification(int p_notification) {
-
- if (p_notification == NOTIFICATION_ENTER_TREE) {
- options->set_icon(options->get_popup()->get_icon("CPUParticles", "EditorIcons"));
- }
-}
-
-void CPUParticlesEditor::_menu_option(int p_option) {
-
- switch (p_option) {
-
- case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH: {
-
- emission_file_dialog->popup_centered_ratio();
-
- } break;
-
- case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE: {
-
- emission_tree_dialog->popup_centered_ratio();
-
- } break;
-
- case MENU_OPTION_RESTART: {
-
- node->restart();
-
- } break;
- }
-}
-
-void CPUParticlesEditor::edit(CPUParticles *p_particles) {
-
- base_node = p_particles;
- node = p_particles;
-}
-
-void CPUParticlesEditor::_generate_emission_points() {
-
- /// hacer codigo aca
- PoolVector<Vector3> points;
- PoolVector<Vector3> normals;
-
- if (!_generate(points, normals)) {
- return;
- }
-
- if (normals.size() == 0) {
- node->set_emission_shape(CPUParticles::EMISSION_SHAPE_POINTS);
- node->set_emission_points(points);
- } else {
- node->set_emission_shape(CPUParticles::EMISSION_SHAPE_DIRECTED_POINTS);
- node->set_emission_points(points);
- node->set_emission_normals(normals);
- }
-}
-
-void CPUParticlesEditor::_bind_methods() {
-
- ClassDB::bind_method("_menu_option", &CPUParticlesEditor::_menu_option);
-}
-
-CPUParticlesEditor::CPUParticlesEditor() {
-
- particles_editor_hb = memnew(HBoxContainer);
- SpatialEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb);
- options = memnew(MenuButton);
- options->set_switch_on_hover(true);
- particles_editor_hb->add_child(options);
- particles_editor_hb->hide();
-
- options->set_text(TTR("CPUParticles"));
- options->get_popup()->add_item(TTR("Create Emission Points From Mesh"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH);
- options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Restart"), MENU_OPTION_RESTART);
- options->get_popup()->connect("id_pressed", this, "_menu_option");
-}
-
-void CPUParticlesEditorPlugin::edit(Object *p_object) {
-
- particles_editor->edit(Object::cast_to<CPUParticles>(p_object));
-}
-
-bool CPUParticlesEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("CPUParticles");
-}
-
-void CPUParticlesEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- particles_editor->show();
- particles_editor->particles_editor_hb->show();
- } else {
- particles_editor->particles_editor_hb->hide();
- particles_editor->hide();
- particles_editor->edit(NULL);
- }
-}
-
-CPUParticlesEditorPlugin::CPUParticlesEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- particles_editor = memnew(CPUParticlesEditor);
- editor->get_viewport()->add_child(particles_editor);
-
- particles_editor->hide();
-}
-
-CPUParticlesEditorPlugin::~CPUParticlesEditorPlugin() {
-}
diff --git a/editor/plugins/cpu_particles_editor_plugin.h b/editor/plugins/cpu_particles_editor_plugin.h
deleted file mode 100644
index deaced9ad9..0000000000
--- a/editor/plugins/cpu_particles_editor_plugin.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*************************************************************************/
-/* cpu_particles_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef CPU_PARTICLES_EDITOR_PLUGIN_H
-#define CPU_PARTICLES_EDITOR_PLUGIN_H
-
-#include "editor/plugins/particles_editor_plugin.h"
-#include "scene/3d/cpu_particles.h"
-
-class CPUParticlesEditor : public ParticlesEditorBase {
-
- GDCLASS(CPUParticlesEditor, ParticlesEditorBase);
-
- enum Menu {
-
- MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE,
- MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH,
- MENU_OPTION_CLEAR_EMISSION_VOLUME,
- MENU_OPTION_RESTART
-
- };
-
- CPUParticles *node;
-
- void _menu_option(int);
-
- friend class CPUParticlesEditorPlugin;
-
- virtual void _generate_emission_points();
-
-protected:
- void _notification(int p_notification);
- void _node_removed(Node *p_node);
- static void _bind_methods();
-
-public:
- void edit(CPUParticles *p_particles);
- CPUParticlesEditor();
-};
-
-class CPUParticlesEditorPlugin : public EditorPlugin {
-
- GDCLASS(CPUParticlesEditorPlugin, EditorPlugin);
-
- CPUParticlesEditor *particles_editor;
- EditorNode *editor;
-
-public:
- virtual String get_name() const { return "CPUParticles"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- CPUParticlesEditorPlugin(EditorNode *p_node);
- ~CPUParticlesEditorPlugin();
-};
-
-#endif // CPU_PARTICLES_EDITOR_PLUGIN_H
diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp
index a4fc9b37ad..539ab03f5b 100644
--- a/editor/plugins/curve_editor_plugin.cpp
+++ b/editor/plugins/curve_editor_plugin.cpp
@@ -32,7 +32,7 @@
#include "canvas_item_editor_plugin.h"
#include "core/core_string_names.h"
-#include "core/os/input.h"
+#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
@@ -49,7 +49,7 @@ CurveEditor::CurveEditor() {
set_clip_contents(true);
_context_menu = memnew(PopupMenu);
- _context_menu->connect("id_pressed", this, "_on_context_menu_item_selected");
+ _context_menu->connect("id_pressed", callable_mp(this, &CurveEditor::on_context_menu_item_selected));
add_child(_context_menu);
_presets_menu = memnew(PopupMenu);
@@ -60,25 +60,25 @@ CurveEditor::CurveEditor() {
_presets_menu->add_item(TTR("Ease In"), PRESET_EASE_IN);
_presets_menu->add_item(TTR("Ease Out"), PRESET_EASE_OUT);
_presets_menu->add_item(TTR("Smoothstep"), PRESET_SMOOTHSTEP);
- _presets_menu->connect("id_pressed", this, "_on_preset_item_selected");
+ _presets_menu->connect("id_pressed", callable_mp(this, &CurveEditor::on_preset_item_selected));
_context_menu->add_child(_presets_menu);
}
void CurveEditor::set_curve(Ref<Curve> curve) {
-
- if (curve == _curve_ref)
+ if (curve == _curve_ref) {
return;
+ }
if (_curve_ref.is_valid()) {
- _curve_ref->disconnect(CoreStringNames::get_singleton()->changed, this, "_curve_changed");
- _curve_ref->disconnect(Curve::SIGNAL_RANGE_CHANGED, this, "_curve_changed");
+ _curve_ref->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &CurveEditor::_curve_changed));
+ _curve_ref->disconnect(Curve::SIGNAL_RANGE_CHANGED, callable_mp(this, &CurveEditor::_curve_changed));
}
_curve_ref = curve;
if (_curve_ref.is_valid()) {
- _curve_ref->connect(CoreStringNames::get_singleton()->changed, this, "_curve_changed");
- _curve_ref->connect(Curve::SIGNAL_RANGE_CHANGED, this, "_curve_changed");
+ _curve_ref->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &CurveEditor::_curve_changed));
+ _curve_ref->connect(Curve::SIGNAL_RANGE_CHANGED, callable_mp(this, &CurveEditor::_curve_changed));
}
_selected_point = -1;
@@ -96,24 +96,23 @@ Size2 CurveEditor::get_minimum_size() const {
}
void CurveEditor::_notification(int p_what) {
- if (p_what == NOTIFICATION_DRAW)
+ if (p_what == NOTIFICATION_DRAW) {
_draw();
+ }
}
void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseButton> mb_ref = p_event;
if (mb_ref.is_valid()) {
-
const InputEventMouseButton &mb = **mb_ref;
if (mb.is_pressed() && !_dragging) {
-
Vector2 mpos = mb.get_position();
_selected_tangent = get_tangent_at(mpos);
- if (_selected_tangent == TANGENT_NONE)
+ if (_selected_tangent == TANGENT_NONE) {
set_selected_point(get_point_at(mpos));
+ }
switch (mb.get_button_index()) {
case BUTTON_RIGHT:
@@ -134,7 +133,6 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
if (!mb.is_pressed() && _dragging && mb.get_button_index() == BUTTON_LEFT) {
_dragging = false;
if (_has_undo_data) {
-
UndoRedo &ur = *EditorNode::get_singleton()->get_undo_redo();
ur.create_action(_selected_tangent == TANGENT_NONE ? TTR("Modify Curve Point") : TTR("Modify Curve Tangent"));
@@ -151,13 +149,11 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm_ref = p_event;
if (mm_ref.is_valid()) {
-
const InputEventMouseMotion &mm = **mm_ref;
Vector2 mpos = mm.get_position();
if (_dragging && _curve_ref.is_valid()) {
-
if (_selected_point != -1) {
Curve &curve = **_curve_ref;
@@ -189,10 +185,11 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
set_selected_point(i);
// This is to prevent the user from losing a point out of view.
- if (point_pos.y < curve.get_min_value())
+ if (point_pos.y < curve.get_min_value()) {
point_pos.y = curve.get_min_value();
- else if (point_pos.y > curve.get_max_value())
+ } else if (point_pos.y > curve.get_max_value()) {
point_pos.y = curve.get_max_value();
+ }
curve.set_point_value(_selected_point, point_pos.y);
@@ -205,10 +202,11 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
Vector2 dir = (control_pos - point_pos).normalized();
real_t tangent;
- if (!Math::is_zero_approx(dir.x))
+ if (!Math::is_zero_approx(dir.x)) {
tangent = dir.y / dir.x;
- else
+ } else {
tangent = 9999 * (dir.y >= 0 ? 1 : -1);
+ }
bool link = !Input::get_singleton()->is_key_pressed(KEY_SHIFT);
@@ -216,14 +214,16 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
curve.set_point_left_tangent(_selected_point, tangent);
// Note: if a tangent is set to linear, it shouldn't be linked to the other
- if (link && _selected_point != (curve.get_point_count() - 1) && curve.get_point_right_mode(_selected_point) != Curve::TANGENT_LINEAR)
+ if (link && _selected_point != (curve.get_point_count() - 1) && curve.get_point_right_mode(_selected_point) != Curve::TANGENT_LINEAR) {
curve.set_point_right_tangent(_selected_point, tangent);
+ }
} else {
curve.set_point_right_tangent(_selected_point, tangent);
- if (link && _selected_point != 0 && curve.get_point_left_mode(_selected_point) != Curve::TANGENT_LINEAR)
+ if (link && _selected_point != 0 && curve.get_point_left_mode(_selected_point) != Curve::TANGENT_LINEAR) {
curve.set_point_left_tangent(_selected_point, tangent);
+ }
}
}
}
@@ -238,8 +238,9 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
const InputEventKey &key = **key_ref;
if (key.is_pressed() && _selected_point != -1) {
- if (key.get_scancode() == KEY_DELETE)
+ if (key.get_keycode() == KEY_DELETE) {
remove_point(_selected_point);
+ }
}
}
}
@@ -358,8 +359,9 @@ void CurveEditor::open_context_menu(Vector2 pos) {
_context_menu->set_item_checked(_context_menu->get_item_index(CONTEXT_LINEAR), is_linear);
} else {
- if (_selected_point > 0 || _selected_point + 1 < _curve_ref->get_point_count())
+ if (_selected_point > 0 || _selected_point + 1 < _curve_ref->get_point_count()) {
_context_menu->add_separator();
+ }
if (_selected_point > 0) {
_context_menu->add_check_item(TTR("Left Linear"), CONTEXT_LEFT_LINEAR);
@@ -384,8 +386,9 @@ void CurveEditor::open_context_menu(Vector2 pos) {
}
int CurveEditor::get_point_at(Vector2 pos) const {
- if (_curve_ref.is_null())
+ if (_curve_ref.is_null()) {
return -1;
+ }
const Curve &curve = **_curve_ref;
const float r = _hover_radius * _hover_radius;
@@ -401,8 +404,9 @@ int CurveEditor::get_point_at(Vector2 pos) const {
}
CurveEditor::TangentIndex CurveEditor::get_tangent_at(Vector2 pos) const {
- if (_curve_ref.is_null() || _selected_point < 0)
+ if (_curve_ref.is_null() || _selected_point < 0) {
return TANGENT_NONE;
+ }
if (_selected_point != 0) {
Vector2 control_pos = get_tangent_view_pos(_selected_point, TANGENT_LEFT);
@@ -428,10 +432,11 @@ void CurveEditor::add_point(Vector2 pos) {
ur.create_action(TTR("Remove Curve Point"));
Vector2 point_pos = get_world_pos(pos);
- if (point_pos.y < 0.0)
+ if (point_pos.y < 0.0) {
point_pos.y = 0.0;
- else if (point_pos.y > 1.0)
+ } else if (point_pos.y > 1.0) {
point_pos.y = 1.0;
+ }
// Small trick to get the point index to feed the undo method
int i = _curve_ref->add_point(point_pos);
@@ -454,11 +459,13 @@ void CurveEditor::remove_point(int index) {
ur.add_do_method(*_curve_ref, "remove_point", index);
ur.add_undo_method(*_curve_ref, "add_point", p.pos, p.left_tangent, p.right_tangent, p.left_mode, p.right_mode);
- if (index == _selected_point)
+ if (index == _selected_point) {
set_selected_point(-1);
+ }
- if (index == _hover_point)
+ if (index == _hover_point) {
set_hover_point_index(-1);
+ }
ur.commit_action();
}
@@ -469,11 +476,11 @@ void CurveEditor::toggle_linear(TangentIndex tangent) {
UndoRedo &ur = *EditorNode::get_singleton()->get_undo_redo();
ur.create_action(TTR("Toggle Curve Linear Tangent"));
- if (tangent == TANGENT_NONE)
+ if (tangent == TANGENT_NONE) {
tangent = _selected_tangent;
+ }
if (tangent == TANGENT_LEFT) {
-
bool is_linear = _curve_ref->get_point_left_mode(_selected_point) == Curve::TANGENT_LINEAR;
Curve::TangentMode prev_mode = _curve_ref->get_point_left_mode(_selected_point);
@@ -483,7 +490,6 @@ void CurveEditor::toggle_linear(TangentIndex tangent) {
ur.add_undo_method(*_curve_ref, "set_point_left_mode", _selected_point, prev_mode);
} else {
-
bool is_linear = _curve_ref->get_point_right_mode(_selected_point) == Curve::TANGENT_LINEAR;
Curve::TangentMode prev_mode = _curve_ref->get_point_right_mode(_selected_point);
@@ -511,7 +517,7 @@ void CurveEditor::set_hover_point_index(int index) {
}
void CurveEditor::update_view_transform() {
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
const real_t margin = font->get_height() + 2 * EDSCALE;
float min_y = 0;
@@ -538,12 +544,12 @@ void CurveEditor::update_view_transform() {
}
Vector2 CurveEditor::get_tangent_view_pos(int i, TangentIndex tangent) const {
-
Vector2 dir;
- if (tangent == TANGENT_LEFT)
+ if (tangent == TANGENT_LEFT) {
dir = -Vector2(1, _curve_ref->get_point_left_tangent(i));
- else
+ } else {
dir = Vector2(1, _curve_ref->get_point_right_tangent(i));
+ }
Vector2 point_pos = get_view_pos(_curve_ref->get_point_position(i));
Vector2 control_pos = get_view_pos(_curve_ref->get_point_position(i) + dir);
@@ -562,7 +568,6 @@ Vector2 CurveEditor::get_world_pos(Vector2 view_pos) const {
// Uses non-baked points, but takes advantage of ordered iteration to be faster
template <typename T>
static void plot_curve_accurate(const Curve &curve, float step, T plot_func) {
-
if (curve.get_point_count() <= 1) {
// Not enough points to make a curve, so it's just a straight line
float y = curve.interpolate(0);
@@ -600,7 +605,6 @@ static void plot_curve_accurate(const Curve &curve, float step, T plot_func) {
}
struct CanvasItemPlotCurve {
-
CanvasItem &ci;
Color color1;
Color color2;
@@ -612,13 +616,14 @@ struct CanvasItemPlotCurve {
void operator()(Vector2 pos0, Vector2 pos1, bool in_definition) {
// FIXME: Using a line width greater than 1 breaks curve rendering
- ci.draw_line(pos0, pos1, in_definition ? color1 : color2, 1, true);
+ ci.draw_line(pos0, pos1, in_definition ? color1 : color2, 1);
}
};
void CurveEditor::_draw() {
- if (_curve_ref.is_null())
+ if (_curve_ref.is_null()) {
return;
+ }
Curve &curve = **_curve_ref;
update_view_transform();
@@ -626,7 +631,7 @@ void CurveEditor::_draw() {
// Background
Vector2 view_size = get_rect().size;
- draw_style_box(get_stylebox("bg", "Tree"), Rect2(Point2(), view_size));
+ draw_style_box(get_theme_stylebox("bg", "Tree"), Rect2(Point2(), view_size));
// Grid
@@ -635,8 +640,8 @@ void CurveEditor::_draw() {
Vector2 min_edge = get_world_pos(Vector2(0, view_size.y));
Vector2 max_edge = get_world_pos(Vector2(view_size.x, 0));
- const Color grid_color0 = get_color("mono_color", "Editor") * Color(1, 1, 1, 0.15);
- const Color grid_color1 = get_color("mono_color", "Editor") * Color(1, 1, 1, 0.07);
+ const Color grid_color0 = get_theme_color("mono_color", "Editor") * Color(1, 1, 1, 0.15);
+ const Color grid_color1 = get_theme_color("mono_color", "Editor") * Color(1, 1, 1, 0.07);
draw_line(Vector2(min_edge.x, curve.get_min_value()), Vector2(max_edge.x, curve.get_min_value()), grid_color0);
draw_line(Vector2(max_edge.x, curve.get_max_value()), Vector2(min_edge.x, curve.get_max_value()), grid_color0);
draw_line(Vector2(0, min_edge.y), Vector2(0, max_edge.y), grid_color0);
@@ -656,9 +661,9 @@ void CurveEditor::_draw() {
draw_set_transform_matrix(Transform2D());
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
float font_height = font->get_height();
- Color text_color = get_color("font_color", "Editor");
+ Color text_color = get_theme_color("font_color", "Editor");
{
// X axis
@@ -685,21 +690,20 @@ void CurveEditor::_draw() {
// Draw tangents for current point
if (_selected_point >= 0) {
-
- const Color tangent_color = get_color("accent_color", "Editor");
+ const Color tangent_color = get_theme_color("accent_color", "Editor");
int i = _selected_point;
Vector2 pos = curve.get_point_position(i);
if (i != 0) {
Vector2 control_pos = get_tangent_view_pos(i, TANGENT_LEFT);
- draw_line(get_view_pos(pos), control_pos, tangent_color, Math::round(EDSCALE), true);
+ draw_line(get_view_pos(pos), control_pos, tangent_color, Math::round(EDSCALE));
draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(2), tangent_color);
}
if (i != curve.get_point_count() - 1) {
Vector2 control_pos = get_tangent_view_pos(i, TANGENT_RIGHT);
- draw_line(get_view_pos(pos), control_pos, tangent_color, Math::round(EDSCALE), true);
+ draw_line(get_view_pos(pos), control_pos, tangent_color, Math::round(EDSCALE));
draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(2), tangent_color);
}
}
@@ -708,8 +712,8 @@ void CurveEditor::_draw() {
draw_set_transform_matrix(_world_to_view);
- const Color line_color = get_color("font_color", "Editor");
- const Color edge_line_color = get_color("highlight_color", "Editor");
+ const Color line_color = get_theme_color("font_color", "Editor");
+ const Color edge_line_color = get_theme_color("highlight_color", "Editor");
CanvasItemPlotCurve plot_func(*this, line_color, edge_line_color);
plot_curve_accurate(curve, 4.f / view_size.x, plot_func);
@@ -718,8 +722,8 @@ void CurveEditor::_draw() {
draw_set_transform_matrix(Transform2D());
- const Color point_color = get_color("font_color", "Editor");
- const Color selected_point_color = get_color("accent_color", "Editor");
+ const Color point_color = get_theme_color("font_color", "Editor");
+ const Color selected_point_color = get_theme_color("accent_color", "Editor");
for (int i = 0; i < curve.get_point_count(); ++i) {
Vector2 pos = curve.get_point_position(i);
@@ -749,20 +753,15 @@ void CurveEditor::_draw() {
void CurveEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_gui_input"), &CurveEditor::on_gui_input);
- ClassDB::bind_method(D_METHOD("_on_preset_item_selected"), &CurveEditor::on_preset_item_selected);
- ClassDB::bind_method(D_METHOD("_curve_changed"), &CurveEditor::_curve_changed);
- ClassDB::bind_method(D_METHOD("_on_context_menu_item_selected"), &CurveEditor::on_context_menu_item_selected);
}
//---------------
bool EditorInspectorPluginCurve::can_handle(Object *p_object) {
-
- return Object::cast_to<Curve>(p_object) != NULL;
+ return Object::cast_to<Curve>(p_object) != nullptr;
}
void EditorInspectorPluginCurve::parse_begin(Object *p_object) {
-
Curve *curve = Object::cast_to<Curve>(p_object);
ERR_FAIL_COND(!curve);
Ref<Curve> c(curve);
@@ -787,10 +786,9 @@ bool CurvePreviewGenerator::handles(const String &p_type) const {
return p_type == "Curve";
}
-Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> CurvePreviewGenerator::generate(const Ref<Resource> &p_from, const Size2 &p_size) const {
Ref<Curve> curve_ref = p_from;
- ERR_FAIL_COND_V_MSG(curve_ref.is_null(), Ref<Texture>(), "It's not a reference to a valid Resource object.");
+ ERR_FAIL_COND_V_MSG(curve_ref.is_null(), Ref<Texture2D>(), "It's not a reference to a valid Resource object.");
Curve &curve = **curve_ref;
// FIXME: Should be ported to use p_size as done in b2633a97
@@ -800,9 +798,7 @@ Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from, const
img_ref.instance();
Image &im = **img_ref;
- im.create(thumbnail_size, thumbnail_size / 2, 0, Image::FORMAT_RGBA8);
-
- im.lock();
+ im.create(thumbnail_size, thumbnail_size / 2, false, Image::FORMAT_RGBA8);
Color bg_color(0.1, 0.1, 0.1, 1.0);
for (int i = 0; i < thumbnail_size; i++) {
@@ -816,7 +812,6 @@ Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from, const
int prev_y = 0;
for (int x = 0; x < im.get_width(); ++x) {
-
float t = static_cast<float>(x) / im.get_width();
float v = (curve.interpolate_baked(t) - curve.get_min_value()) / range_y;
int y = CLAMP(im.get_height() - v * im.get_height(), 0, im.get_height());
@@ -844,10 +839,8 @@ Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from, const
prev_y = y;
}
- im.unlock();
-
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
- ptex->create_from_image(img_ref, 0);
+ ptex->create_from_image(img_ref);
return ptex;
}
diff --git a/editor/plugins/curve_editor_plugin.h b/editor/plugins/curve_editor_plugin.h
index 06e2692373..2872f65730 100644
--- a/editor/plugins/curve_editor_plugin.h
+++ b/editor/plugins/curve_editor_plugin.h
@@ -43,7 +43,7 @@ class CurveEditor : public Control {
public:
CurveEditor();
- Size2 get_minimum_size() const;
+ Size2 get_minimum_size() const override;
void set_curve(Ref<Curve> curve);
@@ -123,8 +123,8 @@ class EditorInspectorPluginCurve : public EditorInspectorPlugin {
GDCLASS(EditorInspectorPluginCurve, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
};
class CurveEditorPlugin : public EditorPlugin {
@@ -133,15 +133,15 @@ class CurveEditorPlugin : public EditorPlugin {
public:
CurveEditorPlugin(EditorNode *p_node);
- virtual String get_name() const { return "Curve"; }
+ virtual String get_name() const override { return "Curve"; }
};
class CurvePreviewGenerator : public EditorResourcePreviewGenerator {
GDCLASS(CurvePreviewGenerator, EditorResourcePreviewGenerator);
public:
- virtual bool handles(const String &p_type) const;
- virtual Ref<Texture> generate(const Ref<Resource> &p_from, const Size2 &p_size) const;
+ virtual bool handles(const String &p_type) const override;
+ virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const override;
};
#endif // CURVE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp
new file mode 100644
index 0000000000..0747e42045
--- /dev/null
+++ b/editor/plugins/debugger_editor_plugin.cpp
@@ -0,0 +1,214 @@
+/*************************************************************************/
+/* debugger_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "debugger_editor_plugin.h"
+
+#include "core/os/keyboard.h"
+#include "editor/debugger/editor_debugger_node.h"
+#include "editor/debugger/editor_debugger_server.h"
+#include "editor/editor_node.h"
+#include "editor/fileserver/editor_file_server.h"
+#include "scene/gui/menu_button.h"
+
+DebuggerEditorPlugin::DebuggerEditorPlugin(EditorNode *p_editor, MenuButton *p_debug_menu) {
+ EditorDebuggerServer::initialize();
+
+ ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11);
+ ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10);
+ ED_SHORTCUT("debugger/break", TTR("Break"));
+ ED_SHORTCUT("debugger/continue", TTR("Continue"), KEY_F12);
+ ED_SHORTCUT("debugger/keep_debugger_open", TTR("Keep Debugger Open"));
+ ED_SHORTCUT("debugger/debug_with_external_editor", TTR("Debug with External Editor"));
+
+ // File Server for deploy with remote filesystem.
+ file_server = memnew(EditorFileServer);
+
+ EditorDebuggerNode *debugger = memnew(EditorDebuggerNode);
+ Button *db = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Debugger"), debugger);
+ debugger->set_tool_button(db);
+
+ // Main editor debug menu.
+ debug_menu = p_debug_menu;
+ PopupMenu *p = debug_menu->get_popup();
+ p->set_hide_on_checkable_item_selection(false);
+ p->add_check_shortcut(ED_SHORTCUT("editor/deploy_with_remote_debug", TTR("Deploy with Remote Debug")), RUN_DEPLOY_REMOTE_DEBUG);
+ p->set_item_tooltip(
+ p->get_item_count() - 1,
+ TTR("When this option is enabled, using one-click deploy will make the executable attempt to connect to this computer's IP so the running project can be debugged.\nThis option is intended to be used for remote debugging (typically with a mobile device).\nYou don't need to enable it to use the GDScript debugger locally."));
+ p->add_check_shortcut(ED_SHORTCUT("editor/small_deploy_with_network_fs", TTR("Small Deploy with Network Filesystem")), RUN_FILE_SERVER);
+ p->set_item_tooltip(
+ p->get_item_count() - 1,
+ TTR("When this option is enabled, using one-click deploy for Android will only export an executable without the project data.\nThe filesystem will be provided from the project by the editor over the network.\nOn Android, deploying will use the USB cable for faster performance. This option speeds up testing for projects with large assets."));
+ p->add_separator();
+ p->add_check_shortcut(ED_SHORTCUT("editor/visible_collision_shapes", TTR("Visible Collision Shapes")), RUN_DEBUG_COLLISONS);
+ p->set_item_tooltip(
+ p->get_item_count() - 1,
+ TTR("When this option is enabled, collision shapes and raycast nodes (for 2D and 3D) will be visible in the running project."));
+ p->add_check_shortcut(ED_SHORTCUT("editor/visible_navigation", TTR("Visible Navigation")), RUN_DEBUG_NAVIGATION);
+ p->set_item_tooltip(
+ p->get_item_count() - 1,
+ TTR("When this option is enabled, navigation meshes and polygons will be visible in the running project."));
+ p->add_separator();
+ p->add_check_shortcut(ED_SHORTCUT("editor/sync_scene_changes", TTR("Synchronize Scene Changes")), RUN_LIVE_DEBUG);
+ p->set_item_tooltip(
+ p->get_item_count() - 1,
+ TTR("When this option is enabled, any changes made to the scene in the editor will be replicated in the running project.\nWhen used remotely on a device, this is more efficient when the network filesystem option is enabled."));
+ p->add_check_shortcut(ED_SHORTCUT("editor/sync_script_changes", TTR("Synchronize Script Changes")), RUN_RELOAD_SCRIPTS);
+ p->set_item_tooltip(
+ p->get_item_count() - 1,
+ TTR("When this option is enabled, any script that is saved will be reloaded in the running project.\nWhen used remotely on a device, this is more efficient when the network filesystem option is enabled."));
+
+ // Multi-instance, start/stop
+ instances_menu = memnew(PopupMenu);
+ instances_menu->set_name("run_instances");
+ instances_menu->set_hide_on_checkable_item_selection(false);
+
+ p->add_child(instances_menu);
+ p->add_separator();
+ p->add_submenu_item(TTR("Run Multiple Instances"), "run_instances");
+
+ instances_menu->add_radio_check_item(TTR("Run 1 Instance"));
+ instances_menu->set_item_metadata(0, 1);
+ instances_menu->add_radio_check_item(TTR("Run 2 Instances"));
+ instances_menu->set_item_metadata(1, 2);
+ instances_menu->add_radio_check_item(TTR("Run 3 Instances"));
+ instances_menu->set_item_metadata(2, 3);
+ instances_menu->add_radio_check_item(TTR("Run 4 Instances"));
+ instances_menu->set_item_metadata(3, 4);
+ instances_menu->set_item_checked(0, true);
+ instances_menu->connect("index_pressed", callable_mp(this, &DebuggerEditorPlugin::_select_run_count));
+ p->connect("id_pressed", callable_mp(this, &DebuggerEditorPlugin::_menu_option));
+}
+
+DebuggerEditorPlugin::~DebuggerEditorPlugin() {
+ EditorDebuggerServer::deinitialize();
+ memdelete(file_server);
+}
+
+void DebuggerEditorPlugin::_select_run_count(int p_index) {
+ int len = instances_menu->get_item_count();
+ for (int idx = 0; idx < len; idx++) {
+ instances_menu->set_item_checked(idx, idx == p_index);
+ }
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_instances", instances_menu->get_item_metadata(p_index));
+}
+
+void DebuggerEditorPlugin::_menu_option(int p_option) {
+ switch (p_option) {
+ case RUN_FILE_SERVER: {
+ bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_FILE_SERVER));
+
+ if (ischecked) {
+ file_server->stop();
+ } else {
+ file_server->start();
+ }
+
+ debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_FILE_SERVER), !ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_file_server", !ischecked);
+
+ } break;
+ case RUN_LIVE_DEBUG: {
+ bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_LIVE_DEBUG));
+
+ debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_LIVE_DEBUG), !ischecked);
+ EditorDebuggerNode::get_singleton()->set_live_debugging(!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_live_debug", !ischecked);
+
+ } break;
+ case RUN_DEPLOY_REMOTE_DEBUG: {
+ bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEPLOY_REMOTE_DEBUG));
+ debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEPLOY_REMOTE_DEBUG), !ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_deploy_remote_debug", !ischecked);
+
+ } break;
+ case RUN_DEBUG_COLLISONS: {
+ bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_COLLISONS));
+ debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_COLLISONS), !ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_collisons", !ischecked);
+
+ } break;
+ case RUN_DEBUG_NAVIGATION: {
+ bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION));
+ debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION), !ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_navigation", !ischecked);
+
+ } break;
+ case RUN_RELOAD_SCRIPTS: {
+ bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_RELOAD_SCRIPTS));
+ debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_RELOAD_SCRIPTS), !ischecked);
+
+ ScriptEditor::get_singleton()->set_live_auto_reload_running_scripts(!ischecked);
+ EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_reload_scripts", !ischecked);
+
+ } break;
+ }
+}
+
+void DebuggerEditorPlugin::_notification(int p_what) {
+ if (p_what == NOTIFICATION_READY) {
+ _update_debug_options();
+ }
+}
+
+void DebuggerEditorPlugin::_update_debug_options() {
+ bool check_deploy_remote = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", false);
+ bool check_file_server = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false);
+ bool check_debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false);
+ bool check_debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false);
+ bool check_live_debug = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_live_debug", true);
+ bool check_reload_scripts = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_reload_scripts", true);
+ int instances = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_instances", 1);
+
+ if (check_deploy_remote) {
+ _menu_option(RUN_DEPLOY_REMOTE_DEBUG);
+ }
+ if (check_file_server) {
+ _menu_option(RUN_FILE_SERVER);
+ }
+ if (check_debug_collisions) {
+ _menu_option(RUN_DEBUG_COLLISONS);
+ }
+ if (check_debug_navigation) {
+ _menu_option(RUN_DEBUG_NAVIGATION);
+ }
+ if (check_live_debug) {
+ _menu_option(RUN_LIVE_DEBUG);
+ }
+ if (check_reload_scripts) {
+ _menu_option(RUN_RELOAD_SCRIPTS);
+ }
+
+ int len = instances_menu->get_item_count();
+ for (int idx = 0; idx < len; idx++) {
+ bool checked = (int)instances_menu->get_item_metadata(idx) == instances;
+ instances_menu->set_item_checked(idx, checked);
+ }
+}
diff --git a/editor/plugins/debugger_editor_plugin.h b/editor/plugins/debugger_editor_plugin.h
new file mode 100644
index 0000000000..c5ae4cd8a9
--- /dev/null
+++ b/editor/plugins/debugger_editor_plugin.h
@@ -0,0 +1,71 @@
+/*************************************************************************/
+/* debugger_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef DEBUGGER_EDITOR_PLUGIN_H
+#define DEBUGGER_EDITOR_PLUGIN_H
+
+#include "editor/editor_plugin.h"
+
+class EditorNode;
+class EditorFileServer;
+class MenuButton;
+class PopupMenu;
+
+class DebuggerEditorPlugin : public EditorPlugin {
+ GDCLASS(DebuggerEditorPlugin, EditorPlugin);
+
+private:
+ MenuButton *debug_menu;
+ EditorFileServer *file_server;
+ PopupMenu *instances_menu;
+
+ enum MenuOptions {
+ RUN_FILE_SERVER,
+ RUN_LIVE_DEBUG,
+ RUN_DEBUG_COLLISONS,
+ RUN_DEBUG_NAVIGATION,
+ RUN_DEPLOY_REMOTE_DEBUG,
+ RUN_RELOAD_SCRIPTS,
+ };
+
+ void _update_debug_options();
+ void _notification(int p_what);
+ void _select_run_count(int p_index);
+ void _menu_option(int p_option);
+
+public:
+ virtual String get_name() const override { return "Debugger"; }
+ bool has_main_screen() const override { return false; }
+
+ DebuggerEditorPlugin(EditorNode *p_node, MenuButton *p_menu);
+ ~DebuggerEditorPlugin();
+};
+
+#endif // DEBUGGER_EDITOR_PLUGIN_H
diff --git a/editor/plugins/editor_debugger_plugin.cpp b/editor/plugins/editor_debugger_plugin.cpp
new file mode 100644
index 0000000000..b775e871e2
--- /dev/null
+++ b/editor/plugins/editor_debugger_plugin.cpp
@@ -0,0 +1,124 @@
+/*************************************************************************/
+/* editor_debugger_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_debugger_plugin.h"
+
+#include "editor/debugger/script_editor_debugger.h"
+
+void EditorDebuggerPlugin::_breaked(bool p_really_did, bool p_can_debug) {
+ if (p_really_did) {
+ emit_signal("breaked", p_can_debug);
+ } else {
+ emit_signal("continued");
+ }
+}
+
+void EditorDebuggerPlugin::_started() {
+ emit_signal("started");
+}
+
+void EditorDebuggerPlugin::_stopped() {
+ emit_signal("stopped");
+}
+
+void EditorDebuggerPlugin::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("send_message", "message", "data"), &EditorDebuggerPlugin::send_message);
+ ClassDB::bind_method(D_METHOD("register_message_capture", "name", "callable"), &EditorDebuggerPlugin::register_message_capture);
+ ClassDB::bind_method(D_METHOD("unregister_message_capture", "name"), &EditorDebuggerPlugin::unregister_message_capture);
+ ClassDB::bind_method(D_METHOD("has_capture", "name"), &EditorDebuggerPlugin::has_capture);
+ ClassDB::bind_method(D_METHOD("is_breaked"), &EditorDebuggerPlugin::is_breaked);
+ ClassDB::bind_method(D_METHOD("is_debuggable"), &EditorDebuggerPlugin::is_debuggable);
+ ClassDB::bind_method(D_METHOD("is_session_active"), &EditorDebuggerPlugin::is_session_active);
+
+ ADD_SIGNAL(MethodInfo("started"));
+ ADD_SIGNAL(MethodInfo("stopped"));
+ ADD_SIGNAL(MethodInfo("breaked", PropertyInfo(Variant::BOOL, "can_debug")));
+ ADD_SIGNAL(MethodInfo("continued"));
+}
+
+void EditorDebuggerPlugin::attach_debugger(ScriptEditorDebugger *p_debugger) {
+ debugger = p_debugger;
+ if (debugger) {
+ debugger->connect("started", callable_mp(this, &EditorDebuggerPlugin::_started));
+ debugger->connect("stopped", callable_mp(this, &EditorDebuggerPlugin::_stopped));
+ debugger->connect("breaked", callable_mp(this, &EditorDebuggerPlugin::_breaked));
+ }
+}
+
+void EditorDebuggerPlugin::detach_debugger(bool p_call_debugger) {
+ if (debugger) {
+ debugger->disconnect("started", callable_mp(this, &EditorDebuggerPlugin::_started));
+ debugger->disconnect("stopped", callable_mp(this, &EditorDebuggerPlugin::_stopped));
+ debugger->disconnect("breaked", callable_mp(this, &EditorDebuggerPlugin::_breaked));
+ if (p_call_debugger && get_script_instance()) {
+ debugger->remove_debugger_plugin(get_script_instance()->get_script());
+ }
+ debugger = nullptr;
+ }
+}
+
+void EditorDebuggerPlugin::send_message(const String &p_message, const Array &p_args) {
+ ERR_FAIL_COND_MSG(!debugger, "Plugin is not attached to debugger");
+ debugger->send_message(p_message, p_args);
+}
+
+void EditorDebuggerPlugin::register_message_capture(const StringName &p_name, const Callable &p_callable) {
+ ERR_FAIL_COND_MSG(!debugger, "Plugin is not attached to debugger");
+ debugger->register_message_capture(p_name, p_callable);
+}
+
+void EditorDebuggerPlugin::unregister_message_capture(const StringName &p_name) {
+ ERR_FAIL_COND_MSG(!debugger, "Plugin is not attached to debugger");
+ debugger->unregister_message_capture(p_name);
+}
+
+bool EditorDebuggerPlugin::has_capture(const StringName &p_name) {
+ ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger");
+ return debugger->has_capture(p_name);
+}
+
+bool EditorDebuggerPlugin::is_breaked() {
+ ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger");
+ return debugger->is_breaked();
+}
+
+bool EditorDebuggerPlugin::is_debuggable() {
+ ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger");
+ return debugger->is_debuggable();
+}
+
+bool EditorDebuggerPlugin::is_session_active() {
+ ERR_FAIL_COND_V_MSG(!debugger, false, "Plugin is not attached to debugger");
+ return debugger->is_session_active();
+}
+
+EditorDebuggerPlugin::~EditorDebuggerPlugin() {
+ detach_debugger(true);
+}
diff --git a/editor/plugins/editor_debugger_plugin.h b/editor/plugins/editor_debugger_plugin.h
new file mode 100644
index 0000000000..10fd1151de
--- /dev/null
+++ b/editor/plugins/editor_debugger_plugin.h
@@ -0,0 +1,64 @@
+/*************************************************************************/
+/* editor_debugger_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_DEBUGGER_PLUGIN_H
+#define EDITOR_DEBUGGER_PLUGIN_H
+
+#include "scene/gui/control.h"
+
+class ScriptEditorDebugger;
+
+class EditorDebuggerPlugin : public Control {
+ GDCLASS(EditorDebuggerPlugin, Control);
+
+private:
+ ScriptEditorDebugger *debugger = nullptr;
+
+ void _breaked(bool p_really_did, bool p_can_debug);
+ void _started();
+ void _stopped();
+
+protected:
+ static void _bind_methods();
+
+public:
+ void attach_debugger(ScriptEditorDebugger *p_debugger);
+ void detach_debugger(bool p_call_debugger);
+ void send_message(const String &p_message, const Array &p_args);
+ void register_message_capture(const StringName &p_name, const Callable &p_callable);
+ void unregister_message_capture(const StringName &p_name);
+ bool has_capture(const StringName &p_name);
+ bool is_breaked();
+ bool is_debuggable();
+ bool is_session_active();
+ ~EditorDebuggerPlugin();
+};
+
+#endif // EDITOR_DEBUGGER_PLUGIN_H
diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp
index 9b0d5d3daf..3cf4dc5ac8 100644
--- a/editor/plugins/editor_preview_plugins.cpp
+++ b/editor/plugins/editor_preview_plugins.cpp
@@ -43,11 +43,9 @@
#include "servers/audio/audio_stream.h"
void post_process_preview(Ref<Image> p_image) {
-
- if (p_image->get_format() != Image::FORMAT_RGBA8)
+ if (p_image->get_format() != Image::FORMAT_RGBA8) {
p_image->convert(Image::FORMAT_RGBA8);
-
- p_image->lock();
+ }
const int w = p_image->get_width();
const int h = p_image->get_height();
@@ -70,40 +68,36 @@ void post_process_preview(Ref<Image> p_image) {
}
}
}
-
- p_image->unlock();
}
bool EditorTexturePreviewPlugin::handles(const String &p_type) const {
-
- return ClassDB::is_parent_class(p_type, "Texture");
+ return ClassDB::is_parent_class(p_type, "Texture2D");
}
bool EditorTexturePreviewPlugin::generate_small_preview_automatically() const {
return true;
}
-Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
Ref<Image> img;
Ref<AtlasTexture> atex = p_from;
Ref<LargeTexture> ltex = p_from;
if (atex.is_valid()) {
- Ref<Texture> tex = atex->get_atlas();
+ Ref<Texture2D> tex = atex->get_atlas();
if (!tex.is_valid()) {
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
Ref<Image> atlas = tex->get_data();
if (!atlas.is_valid()) {
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
img = atlas->get_rect(atex->get_region());
} else if (ltex.is_valid()) {
img = ltex->to_image();
} else {
- Ref<Texture> tex = p_from;
+ Ref<Texture2D> tex = p_from;
if (tex.is_valid()) {
img = tex->get_data();
if (img.is_valid()) {
@@ -112,14 +106,16 @@ Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2
}
}
- if (img.is_null() || img->empty())
- return Ref<Texture>();
+ if (img.is_null() || img->empty()) {
+ return Ref<Texture2D>();
+ }
img->clear_mipmaps();
if (img->is_compressed()) {
- if (img->decompress() != OK)
- return Ref<Texture>();
+ if (img->decompress() != OK) {
+ return Ref<Texture2D>();
+ }
} else if (img->get_format() != Image::FORMAT_RGB8 && img->get_format() != Image::FORMAT_RGBA8) {
img->convert(Image::FORMAT_RGBA8);
}
@@ -131,13 +127,14 @@ Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2
if (new_size.y > p_size.y) {
new_size = Vector2(new_size.x * p_size.y / new_size.y, p_size.y);
}
- img->resize(new_size.x, new_size.y, Image::INTERPOLATE_CUBIC);
+ Vector2i new_size_i(MAX(1, (int)new_size.x), MAX(1, (int)new_size.y));
+ img->resize(new_size_i.x, new_size_i.y, Image::INTERPOLATE_CUBIC);
post_process_preview(img);
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
}
@@ -147,23 +144,23 @@ EditorTexturePreviewPlugin::EditorTexturePreviewPlugin() {
////////////////////////////////////////////////////////////////////////////
bool EditorImagePreviewPlugin::handles(const String &p_type) const {
-
return p_type == "Image";
}
-Ref<Texture> EditorImagePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorImagePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
Ref<Image> img = p_from;
- if (img.is_null() || img->empty())
+ if (img.is_null() || img->empty()) {
return Ref<Image>();
+ }
img = img->duplicate();
img->clear_mipmaps();
if (img->is_compressed()) {
- if (img->decompress() != OK)
+ if (img->decompress() != OK) {
return Ref<Image>();
+ }
} else if (img->get_format() != Image::FORMAT_RGB8 && img->get_format() != Image::FORMAT_RGBA8) {
img->convert(Image::FORMAT_RGBA8);
}
@@ -182,7 +179,7 @@ Ref<Texture> EditorImagePreviewPlugin::generate(const RES &p_from, const Size2 &
Ref<ImageTexture> ptex;
ptex.instance();
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
}
@@ -192,34 +189,33 @@ EditorImagePreviewPlugin::EditorImagePreviewPlugin() {
bool EditorImagePreviewPlugin::generate_small_preview_automatically() const {
return true;
}
+
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
bool EditorBitmapPreviewPlugin::handles(const String &p_type) const {
-
return ClassDB::is_parent_class(p_type, "BitMap");
}
-Ref<Texture> EditorBitmapPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorBitmapPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
Ref<BitMap> bm = p_from;
if (bm->get_size() == Size2()) {
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
- PoolVector<uint8_t> data;
+ Vector<uint8_t> data;
data.resize(bm->get_size().width * bm->get_size().height);
{
- PoolVector<uint8_t>::Write w = data.write();
+ uint8_t *w = data.ptrw();
for (int i = 0; i < bm->get_size().width; i++) {
for (int j = 0; j < bm->get_size().height; j++) {
if (bm->get_bit(Point2i(i, j))) {
- w[j * bm->get_size().width + i] = 255;
+ w[j * (int)bm->get_size().width + i] = 255;
} else {
- w[j * bm->get_size().width + i] = 0;
+ w[j * (int)bm->get_size().width + i] = 0;
}
}
}
@@ -227,11 +223,12 @@ Ref<Texture> EditorBitmapPreviewPlugin::generate(const RES &p_from, const Size2
Ref<Image> img;
img.instance();
- img->create(bm->get_size().width, bm->get_size().height, 0, Image::FORMAT_L8, data);
+ img->create(bm->get_size().width, bm->get_size().height, false, Image::FORMAT_L8, data);
if (img->is_compressed()) {
- if (img->decompress() != OK)
- return Ref<Texture>();
+ if (img->decompress() != OK) {
+ return Ref<Texture2D>();
+ }
} else if (img->get_format() != Image::FORMAT_RGB8 && img->get_format() != Image::FORMAT_RGBA8) {
img->convert(Image::FORMAT_RGBA8);
}
@@ -249,7 +246,7 @@ Ref<Texture> EditorBitmapPreviewPlugin::generate(const RES &p_from, const Size2
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
}
@@ -263,16 +260,14 @@ EditorBitmapPreviewPlugin::EditorBitmapPreviewPlugin() {
///////////////////////////////////////////////////////////////////////////
bool EditorPackedScenePreviewPlugin::handles(const String &p_type) const {
-
return ClassDB::is_parent_class(p_type, "PackedScene");
}
-Ref<Texture> EditorPackedScenePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
+Ref<Texture2D> EditorPackedScenePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
return generate_from_path(p_from->get_path(), p_size);
}
-Ref<Texture> EditorPackedScenePreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorPackedScenePreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const {
String temp_path = EditorSettings::get_singleton()->get_cache_dir();
String cache_base = ProjectSettings::get_singleton()->globalize_path(p_path).md5_text();
cache_base = temp_path.plus_file("resthumb-" + cache_base);
@@ -281,22 +276,22 @@ Ref<Texture> EditorPackedScenePreviewPlugin::generate_from_path(const String &p_
String path = cache_base + ".png";
- if (!FileAccess::exists(path))
- return Ref<Texture>();
+ if (!FileAccess::exists(path)) {
+ return Ref<Texture2D>();
+ }
Ref<Image> img;
img.instance();
Error err = img->load(path);
if (err == OK) {
-
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
post_process_preview(img);
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
} else {
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
}
@@ -306,17 +301,14 @@ EditorPackedScenePreviewPlugin::EditorPackedScenePreviewPlugin() {
//////////////////////////////////////////////////////////////////
void EditorMaterialPreviewPlugin::_preview_done(const Variant &p_udata) {
-
preview_done = true;
}
void EditorMaterialPreviewPlugin::_bind_methods() {
-
ClassDB::bind_method("_preview_done", &EditorMaterialPreviewPlugin::_preview_done);
}
bool EditorMaterialPreviewPlugin::handles(const String &p_type) const {
-
return ClassDB::is_parent_class(p_type, "Material"); //any material
}
@@ -324,26 +316,24 @@ bool EditorMaterialPreviewPlugin::generate_small_preview_automatically() const {
return true;
}
-Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
Ref<Material> material = p_from;
- ERR_FAIL_COND_V(material.is_null(), Ref<Texture>());
+ ERR_FAIL_COND_V(material.is_null(), Ref<Texture2D>());
if (material->get_shader_mode() == Shader::MODE_SPATIAL) {
+ RS::get_singleton()->mesh_surface_set_material(sphere, 0, material->get_rid());
- VS::get_singleton()->mesh_surface_set_material(sphere, 0, material->get_rid());
-
- VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture
+ RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture
preview_done = false;
- VS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMaterialPreviewPlugin *>(this), "_preview_done", Variant());
+ RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMaterialPreviewPlugin *>(this), "_preview_done", Variant());
while (!preview_done) {
OS::get_singleton()->delay_usec(10);
}
- Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture);
- VS::get_singleton()->mesh_surface_set_material(sphere, 0, RID());
+ Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture);
+ RS::get_singleton()->mesh_surface_set_material(sphere, 0, RID());
ERR_FAIL_COND_V(!img.is_valid(), Ref<ImageTexture>());
@@ -352,54 +342,52 @@ Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Size
img->resize(thumbnail_size, thumbnail_size, Image::INTERPOLATE_CUBIC);
post_process_preview(img);
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
}
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
+ scenario = RS::get_singleton()->scenario_create();
- scenario = VS::get_singleton()->scenario_create();
-
- viewport = VS::get_singleton()->viewport_create();
- VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED);
- VS::get_singleton()->viewport_set_scenario(viewport, scenario);
- VS::get_singleton()->viewport_set_size(viewport, 128, 128);
- VS::get_singleton()->viewport_set_transparent_background(viewport, true);
- VS::get_singleton()->viewport_set_active(viewport, true);
- VS::get_singleton()->viewport_set_vflip(viewport, true);
- viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
+ viewport = RS::get_singleton()->viewport_create();
+ RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_DISABLED);
+ RS::get_singleton()->viewport_set_scenario(viewport, scenario);
+ RS::get_singleton()->viewport_set_size(viewport, 128, 128);
+ RS::get_singleton()->viewport_set_transparent_background(viewport, true);
+ RS::get_singleton()->viewport_set_active(viewport, true);
+ viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
- camera = VS::get_singleton()->camera_create();
- VS::get_singleton()->viewport_attach_camera(viewport, camera);
- VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3)));
- VS::get_singleton()->camera_set_perspective(camera, 45, 0.1, 10);
+ camera = RS::get_singleton()->camera_create();
+ RS::get_singleton()->viewport_attach_camera(viewport, camera);
+ RS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3)));
+ RS::get_singleton()->camera_set_perspective(camera, 45, 0.1, 10);
- light = VS::get_singleton()->directional_light_create();
- light_instance = VS::get_singleton()->instance_create2(light, scenario);
- VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
+ light = RS::get_singleton()->directional_light_create();
+ light_instance = RS::get_singleton()->instance_create2(light, scenario);
+ RS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
- light2 = VS::get_singleton()->directional_light_create();
- VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
- //VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
+ light2 = RS::get_singleton()->directional_light_create();
+ RS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
+ //RS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
- light_instance2 = VS::get_singleton()->instance_create2(light2, scenario);
+ light_instance2 = RS::get_singleton()->instance_create2(light2, scenario);
- VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
+ RS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
- sphere = VS::get_singleton()->mesh_create();
- sphere_instance = VS::get_singleton()->instance_create2(sphere, scenario);
+ sphere = RS::get_singleton()->mesh_create();
+ sphere_instance = RS::get_singleton()->instance_create2(sphere, scenario);
int lats = 32;
int lons = 32;
float radius = 1.0;
- PoolVector<Vector3> vertices;
- PoolVector<Vector3> normals;
- PoolVector<Vector2> uvs;
- PoolVector<float> tangents;
+ Vector<Vector3> vertices;
+ Vector<Vector3> normals;
+ Vector<Vector2> uvs;
+ Vector<float> tangents;
Basis tt = Basis(Vector3(0, 1, 0), Math_PI * 0.5);
for (int i = 1; i <= lats; i++) {
@@ -412,7 +400,6 @@ EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
double zr1 = Math::cos(lat1);
for (int j = lons; j >= 1; j--) {
-
double lng0 = 2 * Math_PI * (double)(j - 1) / lons;
double x0 = Math::cos(lng0);
double y0 = Math::sin(lng0);
@@ -457,48 +444,46 @@ EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
}
Array arr;
- arr.resize(VS::ARRAY_MAX);
- arr[VS::ARRAY_VERTEX] = vertices;
- arr[VS::ARRAY_NORMAL] = normals;
- arr[VS::ARRAY_TANGENT] = tangents;
- arr[VS::ARRAY_TEX_UV] = uvs;
- VS::get_singleton()->mesh_add_surface_from_arrays(sphere, VS::PRIMITIVE_TRIANGLES, arr);
+ arr.resize(RS::ARRAY_MAX);
+ arr[RS::ARRAY_VERTEX] = vertices;
+ arr[RS::ARRAY_NORMAL] = normals;
+ arr[RS::ARRAY_TANGENT] = tangents;
+ arr[RS::ARRAY_TEX_UV] = uvs;
+ RS::get_singleton()->mesh_add_surface_from_arrays(sphere, RS::PRIMITIVE_TRIANGLES, arr);
}
EditorMaterialPreviewPlugin::~EditorMaterialPreviewPlugin() {
-
- VS::get_singleton()->free(sphere);
- VS::get_singleton()->free(sphere_instance);
- VS::get_singleton()->free(viewport);
- VS::get_singleton()->free(light);
- VS::get_singleton()->free(light_instance);
- VS::get_singleton()->free(light2);
- VS::get_singleton()->free(light_instance2);
- VS::get_singleton()->free(camera);
- VS::get_singleton()->free(scenario);
+ RS::get_singleton()->free(sphere);
+ RS::get_singleton()->free(sphere_instance);
+ RS::get_singleton()->free(viewport);
+ RS::get_singleton()->free(light);
+ RS::get_singleton()->free(light_instance);
+ RS::get_singleton()->free(light2);
+ RS::get_singleton()->free(light_instance2);
+ RS::get_singleton()->free(camera);
+ RS::get_singleton()->free(scenario);
}
///////////////////////////////////////////////////////////////////////////
-static bool _is_text_char(CharType c) {
-
+static bool _is_text_char(char32_t c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_';
}
bool EditorScriptPreviewPlugin::handles(const String &p_type) const {
-
return ClassDB::is_parent_class(p_type, "Script");
}
-Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
Ref<Script> scr = p_from;
- if (scr.is_null())
- return Ref<Texture>();
+ if (scr.is_null()) {
+ return Ref<Texture2D>();
+ }
String code = scr->get_source_code().strip_edges();
- if (code == "")
- return Ref<Texture>();
+ if (code == "") {
+ return Ref<Texture2D>();
+ }
List<String> kwors;
scr->get_language()->get_reserved_words(&kwors);
@@ -506,7 +491,6 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2
Set<String> keywords;
for (List<String>::Element *E = kwors.front(); E; E = E->next()) {
-
keywords.insert(E->get());
}
@@ -515,17 +499,16 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2
Ref<Image> img;
img.instance();
int thumbnail_size = MAX(p_size.x, p_size.y);
- img->create(thumbnail_size, thumbnail_size, 0, Image::FORMAT_RGBA8);
+ img->create(thumbnail_size, thumbnail_size, false, Image::FORMAT_RGBA8);
Color bg_color = EditorSettings::get_singleton()->get("text_editor/highlighting/background_color");
Color keyword_color = EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color");
Color text_color = EditorSettings::get_singleton()->get("text_editor/highlighting/text_color");
Color symbol_color = EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color");
- img->lock();
-
- if (bg_color.a == 0)
+ if (bg_color.a == 0) {
bg_color = Color(0, 0, 0, 0);
+ }
bg_color.a = MAX(bg_color.a, 0.2); // some background
for (int i = 0; i < thumbnail_size; i++) {
@@ -542,8 +525,7 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2
bool prev_is_text = false;
bool in_keyword = false;
for (int i = 0; i < code.length(); i++) {
-
- CharType c = code[i];
+ char32_t c = code[i];
if (c > 32) {
if (col < thumbnail_size) {
Color color = text_color;
@@ -559,15 +541,17 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2
pos++;
}
String word = code.substr(i, pos - i);
- if (keywords.has(word))
+ if (keywords.has(word)) {
in_keyword = true;
+ }
} else if (!_is_text_char(c)) {
in_keyword = false;
}
- if (in_keyword)
+ if (in_keyword) {
color = keyword_color;
+ }
Color ul = color;
ul.a *= 0.5;
@@ -577,15 +561,15 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2
prev_is_text = _is_text_char(c);
}
} else {
-
prev_is_text = false;
in_keyword = false;
if (c == '\n') {
col = x0;
line++;
- if (line >= available_height / 2)
+ if (line >= available_height / 2) {
break;
+ }
} else if (c == '\t') {
col += 3;
}
@@ -593,41 +577,38 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2
col++;
}
- img->unlock();
-
post_process_preview(img);
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
}
EditorScriptPreviewPlugin::EditorScriptPreviewPlugin() {
}
+
///////////////////////////////////////////////////////////////////
bool EditorAudioStreamPreviewPlugin::handles(const String &p_type) const {
-
return ClassDB::is_parent_class(p_type, "AudioStream");
}
-Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
Ref<AudioStream> stream = p_from;
- ERR_FAIL_COND_V(stream.is_null(), Ref<Texture>());
+ ERR_FAIL_COND_V(stream.is_null(), Ref<Texture2D>());
- PoolVector<uint8_t> img;
+ Vector<uint8_t> img;
int w = p_size.x;
int h = p_size.y;
img.resize(w * h * 3);
- PoolVector<uint8_t>::Write imgdata = img.write();
- uint8_t *imgw = imgdata.ptr();
+ uint8_t *imgdata = img.ptrw();
+ uint8_t *imgw = imgdata;
Ref<AudioStreamPlayback> playback = stream->instance_playback();
- ERR_FAIL_COND_V(playback.is_null(), Ref<Texture>());
+ ERR_FAIL_COND_V(playback.is_null(), Ref<Texture2D>());
float len_s = stream->get_length();
if (len_s == 0) {
@@ -643,7 +624,6 @@ Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const S
playback->stop();
for (int i = 0; i < w; i++) {
-
float max = -1000;
float min = 1000;
int from = uint64_t(i) * frame_length / w;
@@ -655,7 +635,6 @@ Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const S
}
for (int j = from; j < to; j++) {
-
max = MAX(max, frames[j].l);
max = MAX(max, frames[j].r);
@@ -680,14 +659,13 @@ Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const S
}
}
- imgdata.release();
//post_process_preview(img);
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
Ref<Image> image;
image.instance();
image->create(w, h, false, Image::FORMAT_RGB8, img);
- ptex->create_from_image(image, 0);
+ ptex->create_from_image(image);
return ptex;
}
@@ -697,25 +675,22 @@ EditorAudioStreamPreviewPlugin::EditorAudioStreamPreviewPlugin() {
///////////////////////////////////////////////////////////////////////////
void EditorMeshPreviewPlugin::_preview_done(const Variant &p_udata) {
-
preview_done = true;
}
void EditorMeshPreviewPlugin::_bind_methods() {
-
ClassDB::bind_method("_preview_done", &EditorMeshPreviewPlugin::_preview_done);
}
-bool EditorMeshPreviewPlugin::handles(const String &p_type) const {
+bool EditorMeshPreviewPlugin::handles(const String &p_type) const {
return ClassDB::is_parent_class(p_type, "Mesh"); //any Mesh
}
-Ref<Texture> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
Ref<Mesh> mesh = p_from;
- ERR_FAIL_COND_V(mesh.is_null(), Ref<Texture>());
+ ERR_FAIL_COND_V(mesh.is_null(), Ref<Texture2D>());
- VS::get_singleton()->instance_set_base(mesh_instance, mesh->get_rid());
+ RS::get_singleton()->instance_set_base(mesh_instance, mesh->get_rid());
AABB aabb = mesh->get_aabb();
Vector3 ofs = aabb.position + aabb.size * 0.5;
@@ -725,28 +700,29 @@ Ref<Texture> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p
xform.basis = Basis().rotated(Vector3(1, 0, 0), Math_PI * 0.125) * xform.basis;
AABB rot_aabb = xform.xform(aabb);
float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5;
- if (m == 0)
- return Ref<Texture>();
+ if (m == 0) {
+ return Ref<Texture2D>();
+ }
m = 1.0 / m;
m *= 0.5;
xform.basis.scale(Vector3(m, m, m));
xform.origin = -xform.basis.xform(ofs); //-ofs*m;
xform.origin.z -= rot_aabb.size.z * 2;
- VS::get_singleton()->instance_set_transform(mesh_instance, xform);
+ RS::get_singleton()->instance_set_transform(mesh_instance, xform);
- VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture
+ RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture
preview_done = false;
- VS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMeshPreviewPlugin *>(this), "_preview_done", Variant());
+ RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMeshPreviewPlugin *>(this), "_preview_done", Variant());
while (!preview_done) {
OS::get_singleton()->delay_usec(10);
}
- Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture);
+ Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture);
ERR_FAIL_COND_V(img.is_null(), Ref<ImageTexture>());
- VS::get_singleton()->instance_set_base(mesh_instance, RID());
+ RS::get_singleton()->instance_set_base(mesh_instance, RID());
img->convert(Image::FORMAT_RGBA8);
@@ -762,77 +738,70 @@ Ref<Texture> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p
post_process_preview(img);
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
}
EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() {
+ scenario = RS::get_singleton()->scenario_create();
- scenario = VS::get_singleton()->scenario_create();
-
- viewport = VS::get_singleton()->viewport_create();
- VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED);
- VS::get_singleton()->viewport_set_vflip(viewport, true);
- VS::get_singleton()->viewport_set_scenario(viewport, scenario);
- VS::get_singleton()->viewport_set_size(viewport, 128, 128);
- VS::get_singleton()->viewport_set_transparent_background(viewport, true);
- VS::get_singleton()->viewport_set_active(viewport, true);
- viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
+ viewport = RS::get_singleton()->viewport_create();
+ RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_DISABLED);
+ RS::get_singleton()->viewport_set_scenario(viewport, scenario);
+ RS::get_singleton()->viewport_set_size(viewport, 128, 128);
+ RS::get_singleton()->viewport_set_transparent_background(viewport, true);
+ RS::get_singleton()->viewport_set_active(viewport, true);
+ viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
- camera = VS::get_singleton()->camera_create();
- VS::get_singleton()->viewport_attach_camera(viewport, camera);
- VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3)));
- //VS::get_singleton()->camera_set_perspective(camera,45,0.1,10);
- VS::get_singleton()->camera_set_orthogonal(camera, 1.0, 0.01, 1000.0);
+ camera = RS::get_singleton()->camera_create();
+ RS::get_singleton()->viewport_attach_camera(viewport, camera);
+ RS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3)));
+ //RS::get_singleton()->camera_set_perspective(camera,45,0.1,10);
+ RS::get_singleton()->camera_set_orthogonal(camera, 1.0, 0.01, 1000.0);
- light = VS::get_singleton()->directional_light_create();
- light_instance = VS::get_singleton()->instance_create2(light, scenario);
- VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
+ light = RS::get_singleton()->directional_light_create();
+ light_instance = RS::get_singleton()->instance_create2(light, scenario);
+ RS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
- light2 = VS::get_singleton()->directional_light_create();
- VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
- //VS::get_singleton()->light_set_color(light2, VS::LIGHT_COLOR_SPECULAR, Color(0.0, 0.0, 0.0));
- light_instance2 = VS::get_singleton()->instance_create2(light2, scenario);
+ light2 = RS::get_singleton()->directional_light_create();
+ RS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
+ //RS::get_singleton()->light_set_color(light2, RS::LIGHT_COLOR_SPECULAR, Color(0.0, 0.0, 0.0));
+ light_instance2 = RS::get_singleton()->instance_create2(light2, scenario);
- VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
+ RS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
- //sphere = VS::get_singleton()->mesh_create();
- mesh_instance = VS::get_singleton()->instance_create();
- VS::get_singleton()->instance_set_scenario(mesh_instance, scenario);
+ //sphere = RS::get_singleton()->mesh_create();
+ mesh_instance = RS::get_singleton()->instance_create();
+ RS::get_singleton()->instance_set_scenario(mesh_instance, scenario);
}
EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() {
-
- //VS::get_singleton()->free(sphere);
- VS::get_singleton()->free(mesh_instance);
- VS::get_singleton()->free(viewport);
- VS::get_singleton()->free(light);
- VS::get_singleton()->free(light_instance);
- VS::get_singleton()->free(light2);
- VS::get_singleton()->free(light_instance2);
- VS::get_singleton()->free(camera);
- VS::get_singleton()->free(scenario);
+ //RS::get_singleton()->free(sphere);
+ RS::get_singleton()->free(mesh_instance);
+ RS::get_singleton()->free(viewport);
+ RS::get_singleton()->free(light);
+ RS::get_singleton()->free(light_instance);
+ RS::get_singleton()->free(light2);
+ RS::get_singleton()->free(light_instance2);
+ RS::get_singleton()->free(camera);
+ RS::get_singleton()->free(scenario);
}
///////////////////////////////////////////////////////////////////////////
void EditorFontPreviewPlugin::_preview_done(const Variant &p_udata) {
-
preview_done = true;
}
void EditorFontPreviewPlugin::_bind_methods() {
-
ClassDB::bind_method("_preview_done", &EditorFontPreviewPlugin::_preview_done);
}
bool EditorFontPreviewPlugin::handles(const String &p_type) const {
-
return ClassDB::is_parent_class(p_type, "DynamicFontData") || ClassDB::is_parent_class(p_type, "DynamicFont");
}
-Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorFontPreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const {
RES res = ResourceLoader::load(p_path);
Ref<DynamicFont> sampled_font;
if (res->is_class("DynamicFont")) {
@@ -859,16 +828,16 @@ Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, c
font->draw(canvas_item, pos, sampled_text);
preview_done = false;
- VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture
- VS::get_singleton()->request_frame_drawn_callback(const_cast<EditorFontPreviewPlugin *>(this), "_preview_done", Variant());
+ RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture
+ RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorFontPreviewPlugin *>(this), "_preview_done", Variant());
while (!preview_done) {
OS::get_singleton()->delay_usec(10);
}
- VS::get_singleton()->canvas_item_clear(canvas_item);
+ RS::get_singleton()->canvas_item_clear(canvas_item);
- Ref<Image> img = VS::get_singleton()->texture_get_data(viewport_texture);
+ Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture);
ERR_FAIL_COND_V(img.is_null(), Ref<ImageTexture>());
img->convert(Image::FORMAT_RGBA8);
@@ -885,39 +854,35 @@ Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, c
post_process_preview(img);
Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
- ptex->create_from_image(img, 0);
+ ptex->create_from_image(img);
return ptex;
}
-Ref<Texture> EditorFontPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
-
+Ref<Texture2D> EditorFontPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const {
String path = p_from->get_path();
if (!FileAccess::exists(path)) {
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
return generate_from_path(path, p_size);
}
EditorFontPreviewPlugin::EditorFontPreviewPlugin() {
+ viewport = RS::get_singleton()->viewport_create();
+ RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_DISABLED);
+ RS::get_singleton()->viewport_set_size(viewport, 128, 128);
+ RS::get_singleton()->viewport_set_active(viewport, true);
+ viewport_texture = RS::get_singleton()->viewport_get_texture(viewport);
- viewport = VS::get_singleton()->viewport_create();
- VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED);
- VS::get_singleton()->viewport_set_vflip(viewport, true);
- VS::get_singleton()->viewport_set_size(viewport, 128, 128);
- VS::get_singleton()->viewport_set_active(viewport, true);
- viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
+ canvas = RS::get_singleton()->canvas_create();
+ canvas_item = RS::get_singleton()->canvas_item_create();
- canvas = VS::get_singleton()->canvas_create();
- canvas_item = VS::get_singleton()->canvas_item_create();
-
- VS::get_singleton()->viewport_attach_canvas(viewport, canvas);
- VS::get_singleton()->canvas_item_set_parent(canvas_item, canvas);
+ RS::get_singleton()->viewport_attach_canvas(viewport, canvas);
+ RS::get_singleton()->canvas_item_set_parent(canvas_item, canvas);
}
EditorFontPreviewPlugin::~EditorFontPreviewPlugin() {
-
- VS::get_singleton()->free(canvas_item);
- VS::get_singleton()->free(canvas);
- VS::get_singleton()->free(viewport);
+ RS::get_singleton()->free(canvas_item);
+ RS::get_singleton()->free(canvas);
+ RS::get_singleton()->free(viewport);
}
diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h
index e6e4aff8de..9885efc2b5 100644
--- a/editor/plugins/editor_preview_plugins.h
+++ b/editor/plugins/editor_preview_plugins.h
@@ -39,9 +39,9 @@ class EditorTexturePreviewPlugin : public EditorResourcePreviewGenerator {
GDCLASS(EditorTexturePreviewPlugin, EditorResourcePreviewGenerator);
public:
- virtual bool handles(const String &p_type) const;
- virtual bool generate_small_preview_automatically() const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual bool handles(const String &p_type) const override;
+ virtual bool generate_small_preview_automatically() const override;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const override;
EditorTexturePreviewPlugin();
};
@@ -50,9 +50,9 @@ class EditorImagePreviewPlugin : public EditorResourcePreviewGenerator {
GDCLASS(EditorImagePreviewPlugin, EditorResourcePreviewGenerator);
public:
- virtual bool handles(const String &p_type) const;
- virtual bool generate_small_preview_automatically() const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual bool handles(const String &p_type) const override;
+ virtual bool generate_small_preview_automatically() const override;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const override;
EditorImagePreviewPlugin();
};
@@ -61,25 +61,23 @@ class EditorBitmapPreviewPlugin : public EditorResourcePreviewGenerator {
GDCLASS(EditorBitmapPreviewPlugin, EditorResourcePreviewGenerator);
public:
- virtual bool handles(const String &p_type) const;
- virtual bool generate_small_preview_automatically() const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual bool handles(const String &p_type) const override;
+ virtual bool generate_small_preview_automatically() const override;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const override;
EditorBitmapPreviewPlugin();
};
class EditorPackedScenePreviewPlugin : public EditorResourcePreviewGenerator {
-
public:
virtual bool handles(const String &p_type) const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
- virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 &p_size) const;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual Ref<Texture2D> generate_from_path(const String &p_path, const Size2 &p_size) const;
EditorPackedScenePreviewPlugin();
};
class EditorMaterialPreviewPlugin : public EditorResourcePreviewGenerator {
-
GDCLASS(EditorMaterialPreviewPlugin, EditorResourcePreviewGenerator);
RID scenario;
@@ -100,9 +98,9 @@ protected:
static void _bind_methods();
public:
- virtual bool handles(const String &p_type) const;
- virtual bool generate_small_preview_automatically() const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual bool handles(const String &p_type) const override;
+ virtual bool generate_small_preview_automatically() const override;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const override;
EditorMaterialPreviewPlugin();
~EditorMaterialPreviewPlugin();
@@ -111,7 +109,7 @@ public:
class EditorScriptPreviewPlugin : public EditorResourcePreviewGenerator {
public:
virtual bool handles(const String &p_type) const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const;
EditorScriptPreviewPlugin();
};
@@ -119,13 +117,12 @@ public:
class EditorAudioStreamPreviewPlugin : public EditorResourcePreviewGenerator {
public:
virtual bool handles(const String &p_type) const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const;
EditorAudioStreamPreviewPlugin();
};
class EditorMeshPreviewPlugin : public EditorResourcePreviewGenerator {
-
GDCLASS(EditorMeshPreviewPlugin, EditorResourcePreviewGenerator);
RID scenario;
@@ -145,15 +142,14 @@ protected:
static void _bind_methods();
public:
- virtual bool handles(const String &p_type) const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
+ virtual bool handles(const String &p_type) const override;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const override;
EditorMeshPreviewPlugin();
~EditorMeshPreviewPlugin();
};
class EditorFontPreviewPlugin : public EditorResourcePreviewGenerator {
-
GDCLASS(EditorFontPreviewPlugin, EditorResourcePreviewGenerator);
RID viewport;
@@ -168,9 +164,9 @@ protected:
static void _bind_methods();
public:
- virtual bool handles(const String &p_type) const;
- virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const;
- virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 &p_size) const;
+ virtual bool handles(const String &p_type) const override;
+ virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const override;
+ virtual Ref<Texture2D> generate_from_path(const String &p_path, const Size2 &p_size) const override;
EditorFontPreviewPlugin();
~EditorFontPreviewPlugin();
diff --git a/editor/plugins/gi_probe_editor_plugin.cpp b/editor/plugins/gi_probe_editor_plugin.cpp
index 8914e0ed01..2f5dd36ef1 100644
--- a/editor/plugins/gi_probe_editor_plugin.cpp
+++ b/editor/plugins/gi_probe_editor_plugin.cpp
@@ -31,72 +31,138 @@
#include "gi_probe_editor_plugin.h"
void GIProbeEditorPlugin::_bake() {
-
if (gi_probe) {
+ if (gi_probe->get_probe_data().is_null()) {
+ String path = get_tree()->get_edited_scene_root()->get_filename();
+ if (path == String()) {
+ path = "res://" + gi_probe->get_name() + "_data.res";
+ } else {
+ String ext = path.get_extension();
+ path = path.get_basename() + "." + gi_probe->get_name() + "_data.res";
+ }
+ probe_file->set_current_path(path);
+ probe_file->popup_file_dialog();
+ return;
+ }
gi_probe->bake();
}
}
void GIProbeEditorPlugin::edit(Object *p_object) {
-
GIProbe *s = Object::cast_to<GIProbe>(p_object);
- if (!s)
+ if (!s) {
return;
+ }
gi_probe = s;
}
bool GIProbeEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("GIProbe");
}
-void GIProbeEditorPlugin::make_visible(bool p_visible) {
+void GIProbeEditorPlugin::_notification(int p_what) {
+ if (p_what == NOTIFICATION_PROCESS) {
+ if (!gi_probe) {
+ return;
+ }
+
+ const Vector3i size = gi_probe->get_estimated_cell_size();
+ String text = vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z);
+ int data_size = 4;
+ if (GLOBAL_GET("rendering/quality/gi_probes/anisotropic")) {
+ data_size += 4;
+ }
+ const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0);
+ text += " - " + vformat(TTR("VRAM Size: %s MB"), String::num(size_mb, 2));
+
+ if (bake_info->get_text() == text) {
+ return;
+ }
+
+ // Color the label depending on the estimated performance level.
+ Color color;
+ if (size_mb <= 16.0 + CMP_EPSILON) {
+ // Fast.
+ color = bake_info->get_theme_color("success_color", "Editor");
+ } else if (size_mb <= 64.0 + CMP_EPSILON) {
+ // Medium.
+ color = bake_info->get_theme_color("warning_color", "Editor");
+ } else {
+ // Slow.
+ color = bake_info->get_theme_color("error_color", "Editor");
+ }
+ bake_info->add_theme_color_override("font_color", color);
+
+ bake_info->set_text(text);
+ }
+}
+void GIProbeEditorPlugin::make_visible(bool p_visible) {
if (p_visible) {
- bake->show();
+ bake_hb->show();
+ set_process(true);
} else {
-
- bake->hide();
+ bake_hb->hide();
+ set_process(false);
}
}
-EditorProgress *GIProbeEditorPlugin::tmp_progress = NULL;
+EditorProgress *GIProbeEditorPlugin::tmp_progress = nullptr;
void GIProbeEditorPlugin::bake_func_begin(int p_steps) {
-
- ERR_FAIL_COND(tmp_progress != NULL);
+ ERR_FAIL_COND(tmp_progress != nullptr);
tmp_progress = memnew(EditorProgress("bake_gi", TTR("Bake GI Probe"), p_steps));
}
void GIProbeEditorPlugin::bake_func_step(int p_step, const String &p_description) {
-
- ERR_FAIL_COND(tmp_progress == NULL);
+ ERR_FAIL_COND(tmp_progress == nullptr);
tmp_progress->step(p_description, p_step, false);
}
void GIProbeEditorPlugin::bake_func_end() {
- ERR_FAIL_COND(tmp_progress == NULL);
+ ERR_FAIL_COND(tmp_progress == nullptr);
memdelete(tmp_progress);
- tmp_progress = NULL;
+ tmp_progress = nullptr;
}
-void GIProbeEditorPlugin::_bind_methods() {
+void GIProbeEditorPlugin::_giprobe_save_path_and_bake(const String &p_path) {
+ probe_file->hide();
+ if (gi_probe) {
+ gi_probe->bake();
+ ERR_FAIL_COND(gi_probe->get_probe_data().is_null());
+ ResourceSaver::save(p_path, gi_probe->get_probe_data(), ResourceSaver::FLAG_CHANGE_PATH);
+ }
+}
- ClassDB::bind_method("_bake", &GIProbeEditorPlugin::_bake);
+void GIProbeEditorPlugin::_bind_methods() {
}
GIProbeEditorPlugin::GIProbeEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
- bake = memnew(ToolButton);
- bake->set_icon(editor->get_gui_base()->get_icon("Bake", "EditorIcons"));
+ bake_hb = memnew(HBoxContainer);
+ bake_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ bake_hb->hide();
+ bake = memnew(Button);
+ bake->set_flat(true);
+ bake->set_icon(editor->get_gui_base()->get_theme_icon("Bake", "EditorIcons"));
bake->set_text(TTR("Bake GI Probe"));
- bake->hide();
- bake->connect("pressed", this, "_bake");
- add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, bake);
- gi_probe = NULL;
+ bake->connect("pressed", callable_mp(this, &GIProbeEditorPlugin::_bake));
+ bake_hb->add_child(bake);
+ bake_info = memnew(Label);
+ bake_info->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ bake_info->set_clip_text(true);
+ bake_hb->add_child(bake_info);
+
+ add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, bake_hb);
+ gi_probe = nullptr;
+ probe_file = memnew(EditorFileDialog);
+ probe_file->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+ probe_file->add_filter("*.res");
+ probe_file->connect("file_selected", callable_mp(this, &GIProbeEditorPlugin::_giprobe_save_path_and_bake));
+ get_editor_interface()->get_base_control()->add_child(probe_file);
+ probe_file->set_title(TTR("Select path for GIProbe Data File"));
GIProbe::bake_begin_function = bake_func_begin;
GIProbe::bake_step_function = bake_func_step;
diff --git a/editor/plugins/gi_probe_editor_plugin.h b/editor/plugins/gi_probe_editor_plugin.h
index 5db682835d..85d2b6f449 100644
--- a/editor/plugins/gi_probe_editor_plugin.h
+++ b/editor/plugins/gi_probe_editor_plugin.h
@@ -37,30 +37,35 @@
#include "scene/resources/material.h"
class GIProbeEditorPlugin : public EditorPlugin {
-
GDCLASS(GIProbeEditorPlugin, EditorPlugin);
GIProbe *gi_probe;
- ToolButton *bake;
+ HBoxContainer *bake_hb;
+ Label *bake_info;
+ Button *bake;
EditorNode *editor;
+ EditorFileDialog *probe_file;
+
static EditorProgress *tmp_progress;
static void bake_func_begin(int p_steps);
static void bake_func_step(int p_step, const String &p_description);
static void bake_func_end();
void _bake();
+ void _giprobe_save_path_and_bake(const String &p_path);
protected:
static void _bind_methods();
+ void _notification(int p_what);
public:
- virtual String get_name() const { return "GIProbe"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "GIProbe"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
GIProbeEditorPlugin(EditorNode *p_node);
~GIProbeEditorPlugin();
diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..d27df1d063
--- /dev/null
+++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp
@@ -0,0 +1,410 @@
+/*************************************************************************/
+/* gpu_particles_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "gpu_particles_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "core/io/image_loader.h"
+#include "scene/2d/cpu_particles_2d.h"
+#include "scene/gui/separator.h"
+#include "scene/resources/particles_material.h"
+
+void GPUParticles2DEditorPlugin::edit(Object *p_object) {
+ particles = Object::cast_to<GPUParticles2D>(p_object);
+}
+
+bool GPUParticles2DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("GPUParticles2D");
+}
+
+void GPUParticles2DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ toolbar->show();
+ } else {
+ toolbar->hide();
+ }
+}
+
+void GPUParticles2DEditorPlugin::_file_selected(const String &p_file) {
+ source_emission_file = p_file;
+ emission_mask->popup_centered();
+}
+
+void GPUParticles2DEditorPlugin::_menu_callback(int p_idx) {
+ switch (p_idx) {
+ case MENU_GENERATE_VISIBILITY_RECT: {
+ float gen_time = particles->get_lifetime();
+ if (gen_time < 1.0) {
+ generate_seconds->set_value(1.0);
+ } else {
+ generate_seconds->set_value(trunc(gen_time) + 1.0);
+ }
+ generate_visibility_rect->popup_centered();
+ } break;
+ case MENU_LOAD_EMISSION_MASK: {
+ file->popup_file_dialog();
+
+ } break;
+ case MENU_CLEAR_EMISSION_MASK: {
+ emission_mask->popup_centered();
+ } break;
+ case MENU_OPTION_CONVERT_TO_CPU_PARTICLES: {
+ CPUParticles2D *cpu_particles = memnew(CPUParticles2D);
+ cpu_particles->convert_from_particles(particles);
+ cpu_particles->set_name(particles->get_name());
+ cpu_particles->set_transform(particles->get_transform());
+ cpu_particles->set_visible(particles->is_visible());
+ cpu_particles->set_pause_mode(particles->get_pause_mode());
+ cpu_particles->set_z_index(particles->get_z_index());
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Convert to CPUParticles2D"));
+ ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", particles, cpu_particles, true, false);
+ ur->add_do_reference(cpu_particles);
+ ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", cpu_particles, particles, false, false);
+ ur->add_undo_reference(particles);
+ ur->commit_action();
+
+ } break;
+ case MENU_RESTART: {
+ particles->restart();
+ }
+ }
+}
+
+void GPUParticles2DEditorPlugin::_generate_visibility_rect() {
+ float time = generate_seconds->get_value();
+
+ float running = 0.0;
+
+ EditorProgress ep("gen_vrect", TTR("Generating Visibility Rect"), int(time));
+
+ bool was_emitting = particles->is_emitting();
+ if (!was_emitting) {
+ particles->set_emitting(true);
+ OS::get_singleton()->delay_usec(1000);
+ }
+
+ Rect2 rect;
+ while (running < time) {
+ uint64_t ticks = OS::get_singleton()->get_ticks_usec();
+ ep.step("Generating...", int(running), true);
+ OS::get_singleton()->delay_usec(1000);
+
+ Rect2 capture = particles->capture_rect();
+ if (rect == Rect2()) {
+ rect = capture;
+ } else {
+ rect = rect.merge(capture);
+ }
+
+ running += (OS::get_singleton()->get_ticks_usec() - ticks) / 1000000.0;
+ }
+
+ if (!was_emitting) {
+ particles->set_emitting(false);
+ }
+
+ undo_redo->create_action(TTR("Generate Visibility Rect"));
+ undo_redo->add_do_method(particles, "set_visibility_rect", rect);
+ undo_redo->add_undo_method(particles, "set_visibility_rect", particles->get_visibility_rect());
+ undo_redo->commit_action();
+}
+
+void GPUParticles2DEditorPlugin::_generate_emission_mask() {
+ Ref<ParticlesMaterial> pm = particles->get_process_material();
+ if (!pm.is_valid()) {
+ EditorNode::get_singleton()->show_warning(TTR("Can only set point into a ParticlesMaterial process material"));
+ return;
+ }
+
+ Ref<Image> img;
+ img.instance();
+ Error err = ImageLoader::load_image(source_emission_file, img);
+ ERR_FAIL_COND_MSG(err != OK, "Error loading image '" + source_emission_file + "'.");
+
+ if (img->is_compressed()) {
+ img->decompress();
+ }
+ img->convert(Image::FORMAT_RGBA8);
+ ERR_FAIL_COND(img->get_format() != Image::FORMAT_RGBA8);
+ Size2i s = Size2(img->get_width(), img->get_height());
+ ERR_FAIL_COND(s.width == 0 || s.height == 0);
+
+ Vector<Point2> valid_positions;
+ Vector<Point2> valid_normals;
+ Vector<uint8_t> valid_colors;
+
+ valid_positions.resize(s.width * s.height);
+
+ EmissionMode emode = (EmissionMode)emission_mask_mode->get_selected();
+
+ if (emode == EMISSION_MODE_BORDER_DIRECTED) {
+ valid_normals.resize(s.width * s.height);
+ }
+
+ bool capture_colors = emission_colors->is_pressed();
+
+ if (capture_colors) {
+ valid_colors.resize(s.width * s.height * 4);
+ }
+
+ int vpc = 0;
+
+ {
+ Vector<uint8_t> data = img->get_data();
+ const uint8_t *r = data.ptr();
+
+ for (int i = 0; i < s.width; i++) {
+ for (int j = 0; j < s.height; j++) {
+ uint8_t a = r[(j * s.width + i) * 4 + 3];
+
+ if (a > 128) {
+ if (emode == EMISSION_MODE_SOLID) {
+ if (capture_colors) {
+ valid_colors.write[vpc * 4 + 0] = r[(j * s.width + i) * 4 + 0];
+ valid_colors.write[vpc * 4 + 1] = r[(j * s.width + i) * 4 + 1];
+ valid_colors.write[vpc * 4 + 2] = r[(j * s.width + i) * 4 + 2];
+ valid_colors.write[vpc * 4 + 3] = r[(j * s.width + i) * 4 + 3];
+ }
+ valid_positions.write[vpc++] = Point2(i, j);
+
+ } else {
+ bool on_border = false;
+ for (int x = i - 1; x <= i + 1; x++) {
+ for (int y = j - 1; y <= j + 1; y++) {
+ if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) {
+ on_border = true;
+ break;
+ }
+ }
+
+ if (on_border) {
+ break;
+ }
+ }
+
+ if (on_border) {
+ valid_positions.write[vpc] = Point2(i, j);
+
+ if (emode == EMISSION_MODE_BORDER_DIRECTED) {
+ Vector2 normal;
+ for (int x = i - 2; x <= i + 2; x++) {
+ for (int y = j - 2; y <= j + 2; y++) {
+ if (x == i && y == j) {
+ continue;
+ }
+
+ if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) {
+ normal += Vector2(x - i, y - j).normalized();
+ }
+ }
+ }
+
+ normal.normalize();
+ valid_normals.write[vpc] = normal;
+ }
+
+ if (capture_colors) {
+ valid_colors.write[vpc * 4 + 0] = r[(j * s.width + i) * 4 + 0];
+ valid_colors.write[vpc * 4 + 1] = r[(j * s.width + i) * 4 + 1];
+ valid_colors.write[vpc * 4 + 2] = r[(j * s.width + i) * 4 + 2];
+ valid_colors.write[vpc * 4 + 3] = r[(j * s.width + i) * 4 + 3];
+ }
+
+ vpc++;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ valid_positions.resize(vpc);
+ if (valid_normals.size()) {
+ valid_normals.resize(vpc);
+ }
+
+ ERR_FAIL_COND_MSG(valid_positions.size() == 0, "No pixels with transparency > 128 in image...");
+
+ Vector<uint8_t> texdata;
+
+ int w = 2048;
+ int h = (vpc / 2048) + 1;
+
+ texdata.resize(w * h * 2 * sizeof(float));
+
+ {
+ uint8_t *tw = texdata.ptrw();
+ float *twf = (float *)tw;
+ for (int i = 0; i < vpc; i++) {
+ twf[i * 2 + 0] = valid_positions[i].x;
+ twf[i * 2 + 1] = valid_positions[i].y;
+ }
+ }
+
+ img.instance();
+ img->create(w, h, false, Image::FORMAT_RGF, texdata);
+
+ Ref<ImageTexture> imgt;
+ imgt.instance();
+ imgt->create_from_image(img);
+
+ pm->set_emission_point_texture(imgt);
+ pm->set_emission_point_count(vpc);
+
+ if (capture_colors) {
+ Vector<uint8_t> colordata;
+ colordata.resize(w * h * 4); //use RG texture
+
+ {
+ uint8_t *tw = colordata.ptrw();
+ for (int i = 0; i < vpc * 4; i++) {
+ tw[i] = valid_colors[i];
+ }
+ }
+
+ img.instance();
+ img->create(w, h, false, Image::FORMAT_RGBA8, colordata);
+
+ imgt.instance();
+ imgt->create_from_image(img);
+ pm->set_emission_color_texture(imgt);
+ }
+
+ if (valid_normals.size()) {
+ pm->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_DIRECTED_POINTS);
+
+ Vector<uint8_t> normdata;
+ normdata.resize(w * h * 2 * sizeof(float)); //use RG texture
+
+ {
+ uint8_t *tw = normdata.ptrw();
+ float *twf = (float *)tw;
+ for (int i = 0; i < vpc; i++) {
+ twf[i * 2 + 0] = valid_normals[i].x;
+ twf[i * 2 + 1] = valid_normals[i].y;
+ }
+ }
+
+ img.instance();
+ img->create(w, h, false, Image::FORMAT_RGF, normdata);
+
+ imgt.instance();
+ imgt->create_from_image(img);
+ pm->set_emission_normal_texture(imgt);
+
+ } else {
+ pm->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_POINTS);
+ }
+}
+
+void GPUParticles2DEditorPlugin::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ menu->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles2DEditorPlugin::_menu_callback));
+ menu->set_icon(menu->get_theme_icon("GPUParticles2D", "EditorIcons"));
+ file->connect("file_selected", callable_mp(this, &GPUParticles2DEditorPlugin::_file_selected));
+ }
+}
+
+void GPUParticles2DEditorPlugin::_bind_methods() {
+}
+
+GPUParticles2DEditorPlugin::GPUParticles2DEditorPlugin(EditorNode *p_node) {
+ particles = nullptr;
+ editor = p_node;
+ undo_redo = editor->get_undo_redo();
+
+ toolbar = memnew(HBoxContainer);
+ add_control_to_container(CONTAINER_CANVAS_EDITOR_MENU, toolbar);
+ toolbar->hide();
+
+ toolbar->add_child(memnew(VSeparator));
+
+ menu = memnew(MenuButton);
+ menu->get_popup()->add_item(TTR("Restart"), MENU_RESTART);
+ menu->get_popup()->add_item(TTR("Generate Visibility Rect"), MENU_GENERATE_VISIBILITY_RECT);
+ menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK);
+ // menu->get_popup()->add_item(TTR("Clear Emission Mask"), MENU_CLEAR_EMISSION_MASK);
+ menu->get_popup()->add_item(TTR("Convert to CPUParticles2D"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES);
+ menu->set_text(TTR("GPUParticles2D"));
+ menu->set_switch_on_hover(true);
+ toolbar->add_child(menu);
+
+ file = memnew(EditorFileDialog);
+ List<String> ext;
+ ImageLoader::get_recognized_extensions(&ext);
+ for (List<String>::Element *E = ext.front(); E; E = E->next()) {
+ file->add_filter("*." + E->get() + "; " + E->get().to_upper());
+ }
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ toolbar->add_child(file);
+
+ epoints = memnew(SpinBox);
+ epoints->set_min(1);
+ epoints->set_max(8192);
+ epoints->set_step(1);
+ epoints->set_value(512);
+ file->get_vbox()->add_margin_child(TTR("Generated Point Count:"), epoints);
+
+ generate_visibility_rect = memnew(ConfirmationDialog);
+ generate_visibility_rect->set_title(TTR("Generate Visibility Rect"));
+ VBoxContainer *genvb = memnew(VBoxContainer);
+ generate_visibility_rect->add_child(genvb);
+ generate_seconds = memnew(SpinBox);
+ genvb->add_margin_child(TTR("Generation Time (sec):"), generate_seconds);
+ generate_seconds->set_min(0.1);
+ generate_seconds->set_max(25);
+ generate_seconds->set_value(2);
+
+ toolbar->add_child(generate_visibility_rect);
+
+ generate_visibility_rect->connect("confirmed", callable_mp(this, &GPUParticles2DEditorPlugin::_generate_visibility_rect));
+
+ emission_mask = memnew(ConfirmationDialog);
+ emission_mask->set_title(TTR("Load Emission Mask"));
+ VBoxContainer *emvb = memnew(VBoxContainer);
+ emission_mask->add_child(emvb);
+ emission_mask_mode = memnew(OptionButton);
+ emvb->add_margin_child(TTR("Emission Mask"), emission_mask_mode);
+ emission_mask_mode->add_item(TTR("Solid Pixels"), EMISSION_MODE_SOLID);
+ emission_mask_mode->add_item(TTR("Border Pixels"), EMISSION_MODE_BORDER);
+ emission_mask_mode->add_item(TTR("Directed Border Pixels"), EMISSION_MODE_BORDER_DIRECTED);
+ emission_colors = memnew(CheckBox);
+ emission_colors->set_text(TTR("Capture from Pixel"));
+ emvb->add_margin_child(TTR("Emission Colors"), emission_colors);
+
+ toolbar->add_child(emission_mask);
+
+ emission_mask->connect("confirmed", callable_mp(this, &GPUParticles2DEditorPlugin::_generate_emission_mask));
+}
+
+GPUParticles2DEditorPlugin::~GPUParticles2DEditorPlugin() {
+}
diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.h b/editor/plugins/gpu_particles_2d_editor_plugin.h
new file mode 100644
index 0000000000..86e89bd0b0
--- /dev/null
+++ b/editor/plugins/gpu_particles_2d_editor_plugin.h
@@ -0,0 +1,99 @@
+/*************************************************************************/
+/* gpu_particles_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef PARTICLES_2D_EDITOR_PLUGIN_H
+#define PARTICLES_2D_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/2d/collision_polygon_2d.h"
+#include "scene/2d/gpu_particles_2d.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/file_dialog.h"
+
+class GPUParticles2DEditorPlugin : public EditorPlugin {
+ GDCLASS(GPUParticles2DEditorPlugin, EditorPlugin);
+
+ enum {
+
+ MENU_GENERATE_VISIBILITY_RECT,
+ MENU_LOAD_EMISSION_MASK,
+ MENU_CLEAR_EMISSION_MASK,
+ MENU_OPTION_CONVERT_TO_CPU_PARTICLES,
+ MENU_RESTART
+ };
+
+ enum EmissionMode {
+ EMISSION_MODE_SOLID,
+ EMISSION_MODE_BORDER,
+ EMISSION_MODE_BORDER_DIRECTED
+ };
+
+ GPUParticles2D *particles;
+
+ EditorFileDialog *file;
+ EditorNode *editor;
+
+ HBoxContainer *toolbar;
+ MenuButton *menu;
+
+ SpinBox *epoints;
+
+ ConfirmationDialog *generate_visibility_rect;
+ SpinBox *generate_seconds;
+
+ ConfirmationDialog *emission_mask;
+ OptionButton *emission_mask_mode;
+ CheckBox *emission_colors;
+
+ String source_emission_file;
+
+ UndoRedo *undo_redo;
+ void _file_selected(const String &p_file);
+ void _menu_callback(int p_idx);
+ void _generate_visibility_rect();
+ void _generate_emission_mask();
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ virtual String get_name() const override { return "GPUParticles2D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ GPUParticles2DEditorPlugin(EditorNode *p_node);
+ ~GPUParticles2DEditorPlugin();
+};
+
+#endif // PARTICLES_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..c98ba25db5
--- /dev/null
+++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp
@@ -0,0 +1,463 @@
+/*************************************************************************/
+/* gpu_particles_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "gpu_particles_3d_editor_plugin.h"
+
+#include "core/io/resource_loader.h"
+#include "editor/plugins/node_3d_editor_plugin.h"
+#include "scene/3d/cpu_particles_3d.h"
+#include "scene/resources/particles_material.h"
+
+bool GPUParticles3DEditorBase::_generate(Vector<Vector3> &points, Vector<Vector3> &normals) {
+ bool use_normals = emission_fill->get_selected() == 1;
+
+ if (emission_fill->get_selected() < 2) {
+ float area_accum = 0;
+ Map<float, int> triangle_area_map;
+
+ for (int i = 0; i < geometry.size(); i++) {
+ float area = geometry[i].get_area();
+ if (area < CMP_EPSILON) {
+ continue;
+ }
+ triangle_area_map[area_accum] = i;
+ area_accum += area;
+ }
+
+ if (!triangle_area_map.size() || area_accum == 0) {
+ EditorNode::get_singleton()->show_warning(TTR("The geometry's faces don't contain any area."));
+ return false;
+ }
+
+ int emissor_count = emission_amount->get_value();
+
+ for (int i = 0; i < emissor_count; i++) {
+ float areapos = Math::random(0.0f, area_accum);
+
+ Map<float, int>::Element *E = triangle_area_map.find_closest(areapos);
+ ERR_FAIL_COND_V(!E, false);
+ int index = E->get();
+ ERR_FAIL_INDEX_V(index, geometry.size(), false);
+
+ // ok FINALLY get face
+ Face3 face = geometry[index];
+ //now compute some position inside the face...
+
+ Vector3 pos = face.get_random_point_inside();
+
+ points.push_back(pos);
+
+ if (use_normals) {
+ Vector3 normal = face.get_plane().normal;
+ normals.push_back(normal);
+ }
+ }
+ } else {
+ int gcount = geometry.size();
+
+ if (gcount == 0) {
+ EditorNode::get_singleton()->show_warning(TTR("The geometry doesn't contain any faces."));
+ return false;
+ }
+
+ const Face3 *r = geometry.ptr();
+
+ AABB aabb;
+
+ for (int i = 0; i < gcount; i++) {
+ for (int j = 0; j < 3; j++) {
+ if (i == 0 && j == 0) {
+ aabb.position = r[i].vertex[j];
+ } else {
+ aabb.expand_to(r[i].vertex[j]);
+ }
+ }
+ }
+
+ int emissor_count = emission_amount->get_value();
+
+ for (int i = 0; i < emissor_count; i++) {
+ int attempts = 5;
+
+ for (int j = 0; j < attempts; j++) {
+ Vector3 dir;
+ dir[Math::rand() % 3] = 1.0;
+ Vector3 ofs = (Vector3(1, 1, 1) - dir) * Vector3(Math::randf(), Math::randf(), Math::randf()) * aabb.size + aabb.position;
+
+ Vector3 ofsv = ofs + aabb.size * dir;
+
+ //space it a little
+ ofs -= dir;
+ ofsv += dir;
+
+ float max = -1e7, min = 1e7;
+
+ for (int k = 0; k < gcount; k++) {
+ const Face3 &f3 = r[k];
+
+ Vector3 res;
+ if (f3.intersects_segment(ofs, ofsv, &res)) {
+ res -= ofs;
+ float d = dir.dot(res);
+
+ if (d < min) {
+ min = d;
+ }
+ if (d > max) {
+ max = d;
+ }
+ }
+ }
+
+ if (max < min) {
+ continue; //lost attempt
+ }
+
+ float val = min + (max - min) * Math::randf();
+
+ Vector3 point = ofs + dir * val;
+
+ points.push_back(point);
+ break;
+ }
+ }
+ }
+
+ return true;
+}
+
+void GPUParticles3DEditorBase::_node_selected(const NodePath &p_path) {
+ Node *sel = get_node(p_path);
+ if (!sel) {
+ return;
+ }
+
+ if (!sel->is_class("Node3D")) {
+ EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't inherit from Node3D."), sel->get_name()));
+ return;
+ }
+
+ VisualInstance3D *vi = Object::cast_to<VisualInstance3D>(sel);
+ if (!vi) {
+ EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't contain geometry."), sel->get_name()));
+ return;
+ }
+
+ geometry = vi->get_faces(VisualInstance3D::FACES_SOLID);
+
+ if (geometry.size() == 0) {
+ EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't contain face geometry."), sel->get_name()));
+ return;
+ }
+
+ Transform geom_xform = base_node->get_global_transform().affine_inverse() * vi->get_global_transform();
+
+ int gc = geometry.size();
+ Face3 *w = geometry.ptrw();
+
+ for (int i = 0; i < gc; i++) {
+ for (int j = 0; j < 3; j++) {
+ w[i].vertex[j] = geom_xform.xform(w[i].vertex[j]);
+ }
+ }
+
+ emission_dialog->popup_centered(Size2(300, 130));
+}
+
+void GPUParticles3DEditorBase::_bind_methods() {
+}
+
+GPUParticles3DEditorBase::GPUParticles3DEditorBase() {
+ emission_dialog = memnew(ConfirmationDialog);
+ emission_dialog->set_title(TTR("Create Emitter"));
+ add_child(emission_dialog);
+ VBoxContainer *emd_vb = memnew(VBoxContainer);
+ emission_dialog->add_child(emd_vb);
+
+ emission_amount = memnew(SpinBox);
+ emission_amount->set_min(1);
+ emission_amount->set_max(100000);
+ emission_amount->set_value(512);
+ emd_vb->add_margin_child(TTR("Emission Points:"), emission_amount);
+
+ emission_fill = memnew(OptionButton);
+ emission_fill->add_item(TTR("Surface Points"));
+ emission_fill->add_item(TTR("Surface Points+Normal (Directed)"));
+ emission_fill->add_item(TTR("Volume"));
+ emd_vb->add_margin_child(TTR("Emission Source: "), emission_fill);
+
+ emission_dialog->get_ok()->set_text(TTR("Create"));
+ emission_dialog->connect("confirmed", callable_mp(this, &GPUParticles3DEditorBase::_generate_emission_points));
+
+ emission_tree_dialog = memnew(SceneTreeDialog);
+ add_child(emission_tree_dialog);
+ emission_tree_dialog->connect("selected", callable_mp(this, &GPUParticles3DEditorBase::_node_selected));
+}
+
+void GPUParticles3DEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ hide();
+ }
+}
+
+void GPUParticles3DEditor::_notification(int p_notification) {
+ if (p_notification == NOTIFICATION_ENTER_TREE) {
+ options->set_icon(options->get_popup()->get_theme_icon("GPUParticles3D", "EditorIcons"));
+ get_tree()->connect("node_removed", callable_mp(this, &GPUParticles3DEditor::_node_removed));
+ }
+}
+
+void GPUParticles3DEditor::_menu_option(int p_option) {
+ switch (p_option) {
+ case MENU_OPTION_GENERATE_AABB: {
+ float gen_time = node->get_lifetime();
+
+ if (gen_time < 1.0) {
+ generate_seconds->set_value(1.0);
+ } else {
+ generate_seconds->set_value(trunc(gen_time) + 1.0);
+ }
+ generate_aabb->popup_centered();
+ } break;
+ case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE: {
+ Ref<ParticlesMaterial> material = node->get_process_material();
+ if (material.is_null()) {
+ EditorNode::get_singleton()->show_warning(TTR("A processor material of type 'ParticlesMaterial' is required."));
+ return;
+ }
+
+ emission_tree_dialog->popup_scenetree_dialog();
+
+ } break;
+ case MENU_OPTION_CONVERT_TO_CPU_PARTICLES: {
+ CPUParticles3D *cpu_particles = memnew(CPUParticles3D);
+ cpu_particles->convert_from_particles(node);
+ cpu_particles->set_name(node->get_name());
+ cpu_particles->set_transform(node->get_transform());
+ cpu_particles->set_visible(node->is_visible());
+ cpu_particles->set_pause_mode(node->get_pause_mode());
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Convert to CPUParticles3D"));
+ ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", node, cpu_particles, true, false);
+ ur->add_do_reference(cpu_particles);
+ ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", cpu_particles, node, false, false);
+ ur->add_undo_reference(node);
+ ur->commit_action();
+
+ } break;
+ case MENU_OPTION_RESTART: {
+ node->restart();
+
+ } break;
+ }
+}
+
+void GPUParticles3DEditor::_generate_aabb() {
+ float time = generate_seconds->get_value();
+
+ float running = 0.0;
+
+ EditorProgress ep("gen_aabb", TTR("Generating AABB"), int(time));
+
+ bool was_emitting = node->is_emitting();
+ if (!was_emitting) {
+ node->set_emitting(true);
+ OS::get_singleton()->delay_usec(1000);
+ }
+
+ AABB rect;
+
+ while (running < time) {
+ uint64_t ticks = OS::get_singleton()->get_ticks_usec();
+ ep.step("Generating...", int(running), true);
+ OS::get_singleton()->delay_usec(1000);
+
+ AABB capture = node->capture_aabb();
+ if (rect == AABB()) {
+ rect = capture;
+ } else {
+ rect.merge_with(capture);
+ }
+
+ running += (OS::get_singleton()->get_ticks_usec() - ticks) / 1000000.0;
+ }
+
+ if (!was_emitting) {
+ node->set_emitting(false);
+ }
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Generate Visibility AABB"));
+ ur->add_do_method(node, "set_visibility_aabb", rect);
+ ur->add_undo_method(node, "set_visibility_aabb", node->get_visibility_aabb());
+ ur->commit_action();
+}
+
+void GPUParticles3DEditor::edit(GPUParticles3D *p_particles) {
+ base_node = p_particles;
+ node = p_particles;
+}
+
+void GPUParticles3DEditor::_generate_emission_points() {
+ /// hacer codigo aca
+ Vector<Vector3> points;
+ Vector<Vector3> normals;
+
+ if (!_generate(points, normals)) {
+ return;
+ }
+
+ int point_count = points.size();
+
+ int w = 2048;
+ int h = (point_count / 2048) + 1;
+
+ Vector<uint8_t> point_img;
+ point_img.resize(w * h * 3 * sizeof(float));
+
+ {
+ uint8_t *iw = point_img.ptrw();
+ zeromem(iw, w * h * 3 * sizeof(float));
+ const Vector3 *r = points.ptr();
+ float *wf = (float *)iw;
+ for (int i = 0; i < point_count; i++) {
+ wf[i * 3 + 0] = r[i].x;
+ wf[i * 3 + 1] = r[i].y;
+ wf[i * 3 + 2] = r[i].z;
+ }
+ }
+
+ Ref<Image> image = memnew(Image(w, h, false, Image::FORMAT_RGBF, point_img));
+
+ Ref<ImageTexture> tex;
+ tex.instance();
+
+ Ref<ParticlesMaterial> material = node->get_process_material();
+ ERR_FAIL_COND(material.is_null());
+
+ if (normals.size() > 0) {
+ material->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_DIRECTED_POINTS);
+ material->set_emission_point_count(point_count);
+ material->set_emission_point_texture(tex);
+
+ Vector<uint8_t> point_img2;
+ point_img2.resize(w * h * 3 * sizeof(float));
+
+ {
+ uint8_t *iw = point_img2.ptrw();
+ zeromem(iw, w * h * 3 * sizeof(float));
+ const Vector3 *r = normals.ptr();
+ float *wf = (float *)iw;
+ for (int i = 0; i < point_count; i++) {
+ wf[i * 3 + 0] = r[i].x;
+ wf[i * 3 + 1] = r[i].y;
+ wf[i * 3 + 2] = r[i].z;
+ }
+ }
+
+ Ref<Image> image2 = memnew(Image(w, h, false, Image::FORMAT_RGBF, point_img2));
+
+ Ref<ImageTexture> tex2;
+ tex2.instance();
+
+ material->set_emission_normal_texture(tex2);
+ } else {
+ material->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_POINTS);
+ material->set_emission_point_count(point_count);
+ material->set_emission_point_texture(tex);
+ }
+}
+
+void GPUParticles3DEditor::_bind_methods() {
+}
+
+GPUParticles3DEditor::GPUParticles3DEditor() {
+ node = nullptr;
+ particles_editor_hb = memnew(HBoxContainer);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb);
+ options = memnew(MenuButton);
+ options->set_switch_on_hover(true);
+ particles_editor_hb->add_child(options);
+ particles_editor_hb->hide();
+
+ options->set_text(TTR("GPUParticles3D"));
+ options->get_popup()->add_item(TTR("Restart"), MENU_OPTION_RESTART);
+ options->get_popup()->add_item(TTR("Generate AABB"), MENU_OPTION_GENERATE_AABB);
+ options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE);
+ options->get_popup()->add_item(TTR("Convert to CPUParticles3D"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES);
+
+ options->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles3DEditor::_menu_option));
+
+ generate_aabb = memnew(ConfirmationDialog);
+ generate_aabb->set_title(TTR("Generate Visibility AABB"));
+ VBoxContainer *genvb = memnew(VBoxContainer);
+ generate_aabb->add_child(genvb);
+ generate_seconds = memnew(SpinBox);
+ genvb->add_margin_child(TTR("Generation Time (sec):"), generate_seconds);
+ generate_seconds->set_min(0.1);
+ generate_seconds->set_max(25);
+ generate_seconds->set_value(2);
+
+ add_child(generate_aabb);
+
+ generate_aabb->connect("confirmed", callable_mp(this, &GPUParticles3DEditor::_generate_aabb));
+}
+
+void GPUParticles3DEditorPlugin::edit(Object *p_object) {
+ particles_editor->edit(Object::cast_to<GPUParticles3D>(p_object));
+}
+
+bool GPUParticles3DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("GPUParticles3D");
+}
+
+void GPUParticles3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ particles_editor->show();
+ particles_editor->particles_editor_hb->show();
+ } else {
+ particles_editor->particles_editor_hb->hide();
+ particles_editor->hide();
+ particles_editor->edit(nullptr);
+ }
+}
+
+GPUParticles3DEditorPlugin::GPUParticles3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ particles_editor = memnew(GPUParticles3DEditor);
+ editor->get_viewport()->add_child(particles_editor);
+
+ particles_editor->hide();
+}
+
+GPUParticles3DEditorPlugin::~GPUParticles3DEditorPlugin() {
+}
diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.h b/editor/plugins/gpu_particles_3d_editor_plugin.h
new file mode 100644
index 0000000000..1665b3676a
--- /dev/null
+++ b/editor/plugins/gpu_particles_3d_editor_plugin.h
@@ -0,0 +1,118 @@
+/*************************************************************************/
+/* gpu_particles_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef PARTICLES_EDITOR_PLUGIN_H
+#define PARTICLES_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/3d/gpu_particles_3d.h"
+#include "scene/gui/spin_box.h"
+
+class GPUParticles3DEditorBase : public Control {
+ GDCLASS(GPUParticles3DEditorBase, Control);
+
+protected:
+ Node3D *base_node;
+ Panel *panel;
+ MenuButton *options;
+ HBoxContainer *particles_editor_hb;
+
+ SceneTreeDialog *emission_tree_dialog;
+
+ ConfirmationDialog *emission_dialog;
+ SpinBox *emission_amount;
+ OptionButton *emission_fill;
+
+ Vector<Face3> geometry;
+
+ bool _generate(Vector<Vector3> &points, Vector<Vector3> &normals);
+ virtual void _generate_emission_points() = 0;
+ void _node_selected(const NodePath &p_path);
+
+ static void _bind_methods();
+
+public:
+ GPUParticles3DEditorBase();
+};
+
+class GPUParticles3DEditor : public GPUParticles3DEditorBase {
+ GDCLASS(GPUParticles3DEditor, GPUParticles3DEditorBase);
+
+ ConfirmationDialog *generate_aabb;
+ SpinBox *generate_seconds;
+ GPUParticles3D *node;
+
+ enum Menu {
+
+ MENU_OPTION_GENERATE_AABB,
+ MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE,
+ MENU_OPTION_CLEAR_EMISSION_VOLUME,
+ MENU_OPTION_CONVERT_TO_CPU_PARTICLES,
+ MENU_OPTION_RESTART,
+
+ };
+
+ void _generate_aabb();
+
+ void _menu_option(int);
+
+ friend class GPUParticles3DEditorPlugin;
+
+ virtual void _generate_emission_points() override;
+
+protected:
+ void _notification(int p_notification);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+public:
+ void edit(GPUParticles3D *p_particles);
+ GPUParticles3DEditor();
+};
+
+class GPUParticles3DEditorPlugin : public EditorPlugin {
+ GDCLASS(GPUParticles3DEditorPlugin, EditorPlugin);
+
+ GPUParticles3DEditor *particles_editor;
+ EditorNode *editor;
+
+public:
+ virtual String get_name() const override { return "GPUParticles3D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ GPUParticles3DEditorPlugin(EditorNode *p_node);
+ ~GPUParticles3DEditorPlugin();
+};
+
+#endif // PARTICLES_EDITOR_PLUGIN_H
diff --git a/editor/plugins/gradient_editor_plugin.cpp b/editor/plugins/gradient_editor_plugin.cpp
index 0a3a994eb7..13b5c8cef5 100644
--- a/editor/plugins/gradient_editor_plugin.cpp
+++ b/editor/plugins/gradient_editor_plugin.cpp
@@ -32,15 +32,16 @@
#include "canvas_item_editor_plugin.h"
#include "editor/editor_scale.h"
-#include "spatial_editor_plugin.h"
+#include "node_3d_editor_plugin.h"
Size2 GradientEditor::get_minimum_size() const {
return Size2(0, 60) * EDSCALE;
}
-void GradientEditor::_gradient_changed() {
- if (editing)
+void GradientEditor::_gradient_changed() {
+ if (editing) {
return;
+ }
editing = true;
Vector<Gradient::Point> points = gradient->get_points();
@@ -49,7 +50,6 @@ void GradientEditor::_gradient_changed() {
}
void GradientEditor::_ramp_changed() {
-
editing = true;
UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
undo_redo->create_action(TTR("Gradient Edited"));
@@ -62,15 +62,12 @@ void GradientEditor::_ramp_changed() {
}
void GradientEditor::_bind_methods() {
-
- ClassDB::bind_method("_gradient_changed", &GradientEditor::_gradient_changed);
- ClassDB::bind_method("_ramp_changed", &GradientEditor::_ramp_changed);
}
void GradientEditor::set_gradient(const Ref<Gradient> &p_gradient) {
gradient = p_gradient;
- connect("ramp_changed", this, "_ramp_changed");
- gradient->connect("changed", this, "_gradient_changed");
+ connect("ramp_changed", callable_mp(this, &GradientEditor::_ramp_changed));
+ gradient->connect("changed", callable_mp(this, &GradientEditor::_gradient_changed));
set_points(gradient->get_points());
}
@@ -81,12 +78,10 @@ GradientEditor::GradientEditor() {
///////////////////////
bool EditorInspectorPluginGradient::can_handle(Object *p_object) {
-
- return Object::cast_to<Gradient>(p_object) != NULL;
+ return Object::cast_to<Gradient>(p_object) != nullptr;
}
void EditorInspectorPluginGradient::parse_begin(Object *p_object) {
-
Gradient *gradient = Object::cast_to<Gradient>(p_object);
Ref<Gradient> g(gradient);
@@ -96,7 +91,6 @@ void EditorInspectorPluginGradient::parse_begin(Object *p_object) {
}
GradientEditorPlugin::GradientEditorPlugin(EditorNode *p_node) {
-
Ref<EditorInspectorPluginGradient> plugin;
plugin.instance();
add_inspector_plugin(plugin);
diff --git a/editor/plugins/gradient_editor_plugin.h b/editor/plugins/gradient_editor_plugin.h
index 9ebd9610e5..59cf787020 100644
--- a/editor/plugins/gradient_editor_plugin.h
+++ b/editor/plugins/gradient_editor_plugin.h
@@ -48,7 +48,7 @@ protected:
static void _bind_methods();
public:
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void set_gradient(const Ref<Gradient> &p_gradient);
GradientEditor();
};
@@ -57,16 +57,15 @@ class EditorInspectorPluginGradient : public EditorInspectorPlugin {
GDCLASS(EditorInspectorPluginGradient, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
};
class GradientEditorPlugin : public EditorPlugin {
-
GDCLASS(GradientEditorPlugin, EditorPlugin);
public:
- virtual String get_name() const { return "ColorRamp"; }
+ virtual String get_name() const override { return "ColorRamp"; }
GradientEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp
index 9f836ed0d3..b4dcbdfe20 100644
--- a/editor/plugins/item_list_editor_plugin.cpp
+++ b/editor/plugins/item_list_editor_plugin.cpp
@@ -34,16 +34,15 @@
#include "editor/editor_scale.h"
bool ItemListPlugin::_set(const StringName &p_name, const Variant &p_value) {
-
String name = p_name;
int idx = name.get_slice("/", 0).to_int();
String what = name.get_slice("/", 1);
- if (what == "text")
+ if (what == "text") {
set_item_text(idx, p_value);
- else if (what == "icon")
+ } else if (what == "icon") {
set_item_icon(idx, p_value);
- else if (what == "checkable") {
+ } else if (what == "checkable") {
// This keeps compatibility to/from versions where this property was a boolean, before radio buttons
switch ((int)p_value) {
case 0:
@@ -54,58 +53,58 @@ bool ItemListPlugin::_set(const StringName &p_name, const Variant &p_value) {
set_item_radio_checkable(idx, true);
break;
}
- } else if (what == "checked")
+ } else if (what == "checked") {
set_item_checked(idx, p_value);
- else if (what == "id")
+ } else if (what == "id") {
set_item_id(idx, p_value);
- else if (what == "enabled")
+ } else if (what == "enabled") {
set_item_enabled(idx, p_value);
- else if (what == "separator")
+ } else if (what == "separator") {
set_item_separator(idx, p_value);
- else
+ } else {
return false;
+ }
return true;
}
bool ItemListPlugin::_get(const StringName &p_name, Variant &r_ret) const {
-
String name = p_name;
int idx = name.get_slice("/", 0).to_int();
String what = name.get_slice("/", 1);
- if (what == "text")
+ if (what == "text") {
r_ret = get_item_text(idx);
- else if (what == "icon")
+ } else if (what == "icon") {
r_ret = get_item_icon(idx);
- else if (what == "checkable") {
+ } else if (what == "checkable") {
// This keeps compatibility to/from versions where this property was a boolean, before radio buttons
if (!is_item_checkable(idx)) {
r_ret = 0;
} else {
r_ret = is_item_radio_checkable(idx) ? 2 : 1;
}
- } else if (what == "checked")
+ } else if (what == "checked") {
r_ret = is_item_checked(idx);
- else if (what == "id")
+ } else if (what == "id") {
r_ret = get_item_id(idx);
- else if (what == "enabled")
+ } else if (what == "enabled") {
r_ret = is_item_enabled(idx);
- else if (what == "separator")
+ } else if (what == "separator") {
r_ret = is_item_separator(idx);
- else
+ } else {
return false;
+ }
return true;
}
-void ItemListPlugin::_get_property_list(List<PropertyInfo> *p_list) const {
+void ItemListPlugin::_get_property_list(List<PropertyInfo> *p_list) const {
for (int i = 0; i < get_item_count(); i++) {
-
String base = itos(i) + "/";
p_list->push_back(PropertyInfo(Variant::STRING, base + "text"));
- p_list->push_back(PropertyInfo(Variant::OBJECT, base + "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture"));
+ p_list->push_back(PropertyInfo(Variant::OBJECT, base + "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"));
int flags = get_flags();
@@ -114,14 +113,17 @@ void ItemListPlugin::_get_property_list(List<PropertyInfo> *p_list) const {
p_list->push_back(PropertyInfo(Variant::BOOL, base + "checked"));
}
- if (flags & FLAG_ID)
+ if (flags & FLAG_ID) {
p_list->push_back(PropertyInfo(Variant::INT, base + "id", PROPERTY_HINT_RANGE, "-1,4096"));
+ }
- if (flags & FLAG_ENABLE)
+ if (flags & FLAG_ENABLE) {
p_list->push_back(PropertyInfo(Variant::BOOL, base + "enabled"));
+ }
- if (flags & FLAG_SEPARATOR)
+ if (flags & FLAG_SEPARATOR) {
p_list->push_back(PropertyInfo(Variant::BOOL, base + "separator"));
+ }
}
}
@@ -130,121 +132,101 @@ void ItemListPlugin::_get_property_list(List<PropertyInfo> *p_list) const {
///////////////////////////////////////////////////////////////
void ItemListOptionButtonPlugin::set_object(Object *p_object) {
-
ob = Object::cast_to<OptionButton>(p_object);
}
bool ItemListOptionButtonPlugin::handles(Object *p_object) const {
-
return p_object->is_class("OptionButton");
}
int ItemListOptionButtonPlugin::get_flags() const {
-
return FLAG_ICON | FLAG_ID | FLAG_ENABLE;
}
void ItemListOptionButtonPlugin::add_item() {
-
ob->add_item(vformat(TTR("Item %d"), ob->get_item_count()));
_change_notify();
}
int ItemListOptionButtonPlugin::get_item_count() const {
-
return ob->get_item_count();
}
void ItemListOptionButtonPlugin::erase(int p_idx) {
-
ob->remove_item(p_idx);
_change_notify();
}
ItemListOptionButtonPlugin::ItemListOptionButtonPlugin() {
-
- ob = NULL;
+ ob = nullptr;
}
///////////////////////////////////////////////////////////////
void ItemListPopupMenuPlugin::set_object(Object *p_object) {
-
- if (p_object->is_class("MenuButton"))
+ if (p_object->is_class("MenuButton")) {
pp = Object::cast_to<MenuButton>(p_object)->get_popup();
- else
+ } else {
pp = Object::cast_to<PopupMenu>(p_object);
+ }
}
bool ItemListPopupMenuPlugin::handles(Object *p_object) const {
-
return p_object->is_class("PopupMenu") || p_object->is_class("MenuButton");
}
int ItemListPopupMenuPlugin::get_flags() const {
-
return FLAG_ICON | FLAG_CHECKABLE | FLAG_ID | FLAG_ENABLE | FLAG_SEPARATOR;
}
void ItemListPopupMenuPlugin::add_item() {
-
pp->add_item(vformat(TTR("Item %d"), pp->get_item_count()));
_change_notify();
}
int ItemListPopupMenuPlugin::get_item_count() const {
-
return pp->get_item_count();
}
void ItemListPopupMenuPlugin::erase(int p_idx) {
-
pp->remove_item(p_idx);
_change_notify();
}
ItemListPopupMenuPlugin::ItemListPopupMenuPlugin() {
-
- pp = NULL;
+ pp = nullptr;
}
///////////////////////////////////////////////////////////////
void ItemListItemListPlugin::set_object(Object *p_object) {
-
pp = Object::cast_to<ItemList>(p_object);
}
bool ItemListItemListPlugin::handles(Object *p_object) const {
-
return p_object->is_class("ItemList");
}
int ItemListItemListPlugin::get_flags() const {
-
return FLAG_ICON | FLAG_ENABLE;
}
void ItemListItemListPlugin::add_item() {
-
pp->add_item(vformat(TTR("Item %d"), pp->get_item_count()));
_change_notify();
}
int ItemListItemListPlugin::get_item_count() const {
-
return pp->get_item_count();
}
void ItemListItemListPlugin::erase(int p_idx) {
-
pp->remove_item(p_idx);
_change_notify();
}
ItemListItemListPlugin::ItemListItemListPlugin() {
-
- pp = NULL;
+ pp = nullptr;
}
///////////////////////////////////////////////////////////////
@@ -252,43 +234,40 @@ ItemListItemListPlugin::ItemListItemListPlugin() {
///////////////////////////////////////////////////////////////
void ItemListEditor::_node_removed(Node *p_node) {
-
if (p_node == item_list) {
- item_list = NULL;
+ item_list = nullptr;
hide();
dialog->hide();
}
}
void ItemListEditor::_notification(int p_notification) {
-
if (p_notification == NOTIFICATION_ENTER_TREE || p_notification == NOTIFICATION_THEME_CHANGED) {
-
- add_button->set_icon(get_icon("Add", "EditorIcons"));
- del_button->set_icon(get_icon("Remove", "EditorIcons"));
+ add_button->set_icon(get_theme_icon("Add", "EditorIcons"));
+ del_button->set_icon(get_theme_icon("Remove", "EditorIcons"));
} else if (p_notification == NOTIFICATION_READY) {
-
- get_tree()->connect("node_removed", this, "_node_removed");
+ get_tree()->connect("node_removed", callable_mp(this, &ItemListEditor::_node_removed));
}
}
void ItemListEditor::_add_pressed() {
-
- if (selected_idx == -1)
+ if (selected_idx == -1) {
return;
+ }
item_plugins[selected_idx]->add_item();
}
void ItemListEditor::_delete_pressed() {
-
- if (selected_idx == -1)
+ if (selected_idx == -1) {
return;
+ }
String current_selected = (String)property_editor->get_selected_path();
- if (current_selected == "")
+ if (current_selected == "") {
return;
+ }
// FIXME: Currently relying on selecting a *property* to derive what item to delete
// e.g. you select "1/enabled" to delete item 1.
@@ -301,23 +280,20 @@ void ItemListEditor::_delete_pressed() {
}
void ItemListEditor::_edit_items() {
-
dialog->popup_centered_clamped(Vector2(425, 1200) * EDSCALE, 0.8);
}
void ItemListEditor::edit(Node *p_item_list) {
-
item_list = p_item_list;
if (!item_list) {
selected_idx = -1;
- property_editor->edit(NULL);
+ property_editor->edit(nullptr);
return;
}
for (int i = 0; i < item_plugins.size(); i++) {
if (item_plugins[i]->handles(p_item_list)) {
-
item_plugins[i]->set_object(p_item_list);
property_editor->edit(item_plugins[i]);
@@ -329,11 +305,10 @@ void ItemListEditor::edit(Node *p_item_list) {
}
selected_idx = -1;
- property_editor->edit(NULL);
+ property_editor->edit(nullptr);
}
bool ItemListEditor::handles(Object *p_object) const {
-
for (int i = 0; i < item_plugins.size(); i++) {
if (item_plugins[i]->handles(p_object)) {
return true;
@@ -344,22 +319,17 @@ bool ItemListEditor::handles(Object *p_object) const {
}
void ItemListEditor::_bind_methods() {
-
- ClassDB::bind_method("_node_removed", &ItemListEditor::_node_removed);
- ClassDB::bind_method("_edit_items", &ItemListEditor::_edit_items);
- ClassDB::bind_method("_add_button", &ItemListEditor::_add_pressed);
- ClassDB::bind_method("_delete_button", &ItemListEditor::_delete_pressed);
}
ItemListEditor::ItemListEditor() {
-
selected_idx = -1;
- item_list = NULL;
+ item_list = nullptr;
- toolbar_button = memnew(ToolButton);
+ toolbar_button = memnew(Button);
+ toolbar_button->set_flat(true);
toolbar_button->set_text(TTR("Items"));
add_child(toolbar_button);
- toolbar_button->connect("pressed", this, "_edit_items");
+ toolbar_button->connect("pressed", callable_mp(this, &ItemListEditor::_edit_items));
dialog = memnew(AcceptDialog);
dialog->set_title(TTR("Item List Editor"));
@@ -376,14 +346,14 @@ ItemListEditor::ItemListEditor() {
add_button = memnew(Button);
add_button->set_text(TTR("Add"));
hbc->add_child(add_button);
- add_button->connect("pressed", this, "_add_button");
+ add_button->connect("pressed", callable_mp(this, &ItemListEditor::_add_pressed));
hbc->add_spacer();
del_button = memnew(Button);
del_button->set_text(TTR("Delete"));
hbc->add_child(del_button);
- del_button->connect("pressed", this, "_delete_button");
+ del_button->connect("pressed", callable_mp(this, &ItemListEditor::_delete_pressed));
property_editor = memnew(EditorInspector);
vbc->add_child(property_editor);
@@ -391,34 +361,29 @@ ItemListEditor::ItemListEditor() {
}
ItemListEditor::~ItemListEditor() {
-
- for (int i = 0; i < item_plugins.size(); i++)
+ for (int i = 0; i < item_plugins.size(); i++) {
memdelete(item_plugins[i]);
+ }
}
void ItemListEditorPlugin::edit(Object *p_object) {
-
item_list_editor->edit(Object::cast_to<Node>(p_object));
}
bool ItemListEditorPlugin::handles(Object *p_object) const {
-
return item_list_editor->handles(p_object);
}
void ItemListEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
item_list_editor->show();
} else {
-
item_list_editor->hide();
- item_list_editor->edit(NULL);
+ item_list_editor->edit(nullptr);
}
}
ItemListEditorPlugin::ItemListEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
item_list_editor = memnew(ItemListEditor);
CanvasItemEditor::get_singleton()->add_control_to_menu_panel(item_list_editor);
diff --git a/editor/plugins/item_list_editor_plugin.h b/editor/plugins/item_list_editor_plugin.h
index 8a73367bf7..87586904a3 100644
--- a/editor/plugins/item_list_editor_plugin.h
+++ b/editor/plugins/item_list_editor_plugin.h
@@ -40,7 +40,6 @@
#include "scene/gui/popup_menu.h"
class ItemListPlugin : public Object {
-
GDCLASS(ItemListPlugin, Object);
protected:
@@ -66,8 +65,8 @@ public:
virtual void set_item_text(int p_idx, const String &p_text) {}
virtual String get_item_text(int p_idx) const { return ""; };
- virtual void set_item_icon(int p_idx, const Ref<Texture> &p_tex) {}
- virtual Ref<Texture> get_item_icon(int p_idx) const { return Ref<Texture>(); };
+ virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) {}
+ virtual Ref<Texture2D> get_item_icon(int p_idx) const { return Ref<Texture2D>(); };
virtual void set_item_checkable(int p_idx, bool p_check) {}
virtual void set_item_radio_checkable(int p_idx, bool p_check) {}
@@ -96,72 +95,70 @@ public:
///////////////////////////////////////////////////////////////
class ItemListOptionButtonPlugin : public ItemListPlugin {
-
GDCLASS(ItemListOptionButtonPlugin, ItemListPlugin);
OptionButton *ob;
public:
- virtual void set_object(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual int get_flags() const;
+ virtual void set_object(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual int get_flags() const override;
- virtual void set_item_text(int p_idx, const String &p_text) { ob->set_item_text(p_idx, p_text); }
- virtual String get_item_text(int p_idx) const { return ob->get_item_text(p_idx); }
+ virtual void set_item_text(int p_idx, const String &p_text) override { ob->set_item_text(p_idx, p_text); }
+ virtual String get_item_text(int p_idx) const override { return ob->get_item_text(p_idx); }
- virtual void set_item_icon(int p_idx, const Ref<Texture> &p_tex) { ob->set_item_icon(p_idx, p_tex); }
- virtual Ref<Texture> get_item_icon(int p_idx) const { return ob->get_item_icon(p_idx); }
+ virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) override { ob->set_item_icon(p_idx, p_tex); }
+ virtual Ref<Texture2D> get_item_icon(int p_idx) const override { return ob->get_item_icon(p_idx); }
- virtual void set_item_enabled(int p_idx, int p_enabled) { ob->set_item_disabled(p_idx, !p_enabled); }
- virtual bool is_item_enabled(int p_idx) const { return !ob->is_item_disabled(p_idx); }
+ virtual void set_item_enabled(int p_idx, int p_enabled) override { ob->set_item_disabled(p_idx, !p_enabled); }
+ virtual bool is_item_enabled(int p_idx) const override { return !ob->is_item_disabled(p_idx); }
- virtual void set_item_id(int p_idx, int p_id) { ob->set_item_id(p_idx, p_id); }
- virtual int get_item_id(int p_idx) const { return ob->get_item_id(p_idx); }
+ virtual void set_item_id(int p_idx, int p_id) override { ob->set_item_id(p_idx, p_id); }
+ virtual int get_item_id(int p_idx) const override { return ob->get_item_id(p_idx); }
- virtual void add_item();
- virtual int get_item_count() const;
- virtual void erase(int p_idx);
+ virtual void add_item() override;
+ virtual int get_item_count() const override;
+ virtual void erase(int p_idx) override;
ItemListOptionButtonPlugin();
};
class ItemListPopupMenuPlugin : public ItemListPlugin {
-
GDCLASS(ItemListPopupMenuPlugin, ItemListPlugin);
PopupMenu *pp;
public:
- virtual void set_object(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual int get_flags() const;
+ virtual void set_object(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual int get_flags() const override;
- virtual void set_item_text(int p_idx, const String &p_text) { pp->set_item_text(p_idx, p_text); }
- virtual String get_item_text(int p_idx) const { return pp->get_item_text(p_idx); }
+ virtual void set_item_text(int p_idx, const String &p_text) override { pp->set_item_text(p_idx, p_text); }
+ virtual String get_item_text(int p_idx) const override { return pp->get_item_text(p_idx); }
- virtual void set_item_icon(int p_idx, const Ref<Texture> &p_tex) { pp->set_item_icon(p_idx, p_tex); }
- virtual Ref<Texture> get_item_icon(int p_idx) const { return pp->get_item_icon(p_idx); }
+ virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) override { pp->set_item_icon(p_idx, p_tex); }
+ virtual Ref<Texture2D> get_item_icon(int p_idx) const override { return pp->get_item_icon(p_idx); }
- virtual void set_item_checkable(int p_idx, bool p_check) { pp->set_item_as_checkable(p_idx, p_check); }
- virtual void set_item_radio_checkable(int p_idx, bool p_check) { pp->set_item_as_radio_checkable(p_idx, p_check); }
- virtual bool is_item_checkable(int p_idx) const { return pp->is_item_checkable(p_idx); }
- virtual bool is_item_radio_checkable(int p_idx) const { return pp->is_item_radio_checkable(p_idx); }
+ virtual void set_item_checkable(int p_idx, bool p_check) override { pp->set_item_as_checkable(p_idx, p_check); }
+ virtual void set_item_radio_checkable(int p_idx, bool p_check) override { pp->set_item_as_radio_checkable(p_idx, p_check); }
+ virtual bool is_item_checkable(int p_idx) const override { return pp->is_item_checkable(p_idx); }
+ virtual bool is_item_radio_checkable(int p_idx) const override { return pp->is_item_radio_checkable(p_idx); }
- virtual void set_item_checked(int p_idx, bool p_checked) { pp->set_item_checked(p_idx, p_checked); }
- virtual bool is_item_checked(int p_idx) const { return pp->is_item_checked(p_idx); }
+ virtual void set_item_checked(int p_idx, bool p_checked) override { pp->set_item_checked(p_idx, p_checked); }
+ virtual bool is_item_checked(int p_idx) const override { return pp->is_item_checked(p_idx); }
- virtual void set_item_enabled(int p_idx, int p_enabled) { pp->set_item_disabled(p_idx, !p_enabled); }
- virtual bool is_item_enabled(int p_idx) const { return !pp->is_item_disabled(p_idx); }
+ virtual void set_item_enabled(int p_idx, int p_enabled) override { pp->set_item_disabled(p_idx, !p_enabled); }
+ virtual bool is_item_enabled(int p_idx) const override { return !pp->is_item_disabled(p_idx); }
- virtual void set_item_id(int p_idx, int p_id) { pp->set_item_id(p_idx, p_id); }
- virtual int get_item_id(int p_idx) const { return pp->get_item_id(p_idx); }
+ virtual void set_item_id(int p_idx, int p_id) override { pp->set_item_id(p_idx, p_id); }
+ virtual int get_item_id(int p_idx) const override { return pp->get_item_id(p_idx); }
- virtual void set_item_separator(int p_idx, bool p_separator) { pp->set_item_as_separator(p_idx, p_separator); }
- virtual bool is_item_separator(int p_idx) const { return pp->is_item_separator(p_idx); }
+ virtual void set_item_separator(int p_idx, bool p_separator) override { pp->set_item_as_separator(p_idx, p_separator); }
+ virtual bool is_item_separator(int p_idx) const override { return pp->is_item_separator(p_idx); }
- virtual void add_item();
- virtual int get_item_count() const;
- virtual void erase(int p_idx);
+ virtual void add_item() override;
+ virtual int get_item_count() const override;
+ virtual void erase(int p_idx) override;
ItemListPopupMenuPlugin();
};
@@ -169,28 +166,27 @@ public:
///////////////////////////////////////////////////////////////
class ItemListItemListPlugin : public ItemListPlugin {
-
GDCLASS(ItemListItemListPlugin, ItemListPlugin);
ItemList *pp;
public:
- virtual void set_object(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual int get_flags() const;
+ virtual void set_object(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual int get_flags() const override;
- virtual void set_item_text(int p_idx, const String &p_text) { pp->set_item_text(p_idx, p_text); }
- virtual String get_item_text(int p_idx) const { return pp->get_item_text(p_idx); }
+ virtual void set_item_text(int p_idx, const String &p_text) override { pp->set_item_text(p_idx, p_text); }
+ virtual String get_item_text(int p_idx) const override { return pp->get_item_text(p_idx); }
- virtual void set_item_icon(int p_idx, const Ref<Texture> &p_tex) { pp->set_item_icon(p_idx, p_tex); }
- virtual Ref<Texture> get_item_icon(int p_idx) const { return pp->get_item_icon(p_idx); }
+ virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) override { pp->set_item_icon(p_idx, p_tex); }
+ virtual Ref<Texture2D> get_item_icon(int p_idx) const override { return pp->get_item_icon(p_idx); }
- virtual void set_item_enabled(int p_idx, int p_enabled) { pp->set_item_disabled(p_idx, !p_enabled); }
- virtual bool is_item_enabled(int p_idx) const { return !pp->is_item_disabled(p_idx); }
+ virtual void set_item_enabled(int p_idx, int p_enabled) override { pp->set_item_disabled(p_idx, !p_enabled); }
+ virtual bool is_item_enabled(int p_idx) const override { return !pp->is_item_disabled(p_idx); }
- virtual void add_item();
- virtual int get_item_count() const;
- virtual void erase(int p_idx);
+ virtual void add_item() override;
+ virtual int get_item_count() const override;
+ virtual void erase(int p_idx) override;
ItemListItemListPlugin();
};
@@ -198,12 +194,11 @@ public:
///////////////////////////////////////////////////////////////
class ItemListEditor : public HBoxContainer {
-
GDCLASS(ItemListEditor, HBoxContainer);
Node *item_list;
- ToolButton *toolbar_button;
+ Button *toolbar_button;
AcceptDialog *dialog;
EditorInspector *property_editor;
@@ -235,18 +230,17 @@ public:
};
class ItemListEditorPlugin : public EditorPlugin {
-
GDCLASS(ItemListEditorPlugin, EditorPlugin);
ItemListEditor *item_list_editor;
EditorNode *editor;
public:
- virtual String get_name() const { return "ItemList"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "ItemList"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
ItemListEditorPlugin(EditorNode *p_node);
~ItemListEditorPlugin();
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp
index 22df287f97..e422140efa 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.cpp
+++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp
@@ -31,10 +31,8 @@
#include "light_occluder_2d_editor_plugin.h"
Ref<OccluderPolygon2D> LightOccluder2DEditor::_ensure_occluder() const {
-
Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
if (!occluder.is_valid()) {
-
occluder = Ref<OccluderPolygon2D>(memnew(OccluderPolygon2D));
node->set_occluder_polygon(occluder);
}
@@ -42,64 +40,59 @@ Ref<OccluderPolygon2D> LightOccluder2DEditor::_ensure_occluder() const {
}
Node2D *LightOccluder2DEditor::_get_node() const {
-
return node;
}
void LightOccluder2DEditor::_set_node(Node *p_polygon) {
-
node = Object::cast_to<LightOccluder2D>(p_polygon);
}
bool LightOccluder2DEditor::_is_line() const {
-
Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
- if (occluder.is_valid())
+ if (occluder.is_valid()) {
return !occluder->is_closed();
- else
+ } else {
return false;
+ }
}
int LightOccluder2DEditor::_get_polygon_count() const {
-
Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
- if (occluder.is_valid())
+ if (occluder.is_valid()) {
return occluder->get_polygon().size();
- else
+ } else {
return 0;
+ }
}
Variant LightOccluder2DEditor::_get_polygon(int p_idx) const {
-
Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
- if (occluder.is_valid())
+ if (occluder.is_valid()) {
return occluder->get_polygon();
- else
+ } else {
return Variant(Vector<Vector2>());
+ }
}
void LightOccluder2DEditor::_set_polygon(int p_idx, const Variant &p_polygon) const {
-
Ref<OccluderPolygon2D> occluder = _ensure_occluder();
occluder->set_polygon(p_polygon);
}
void LightOccluder2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) {
-
Ref<OccluderPolygon2D> occluder = _ensure_occluder();
undo_redo->add_do_method(occluder.ptr(), "set_polygon", p_polygon);
undo_redo->add_undo_method(occluder.ptr(), "set_polygon", p_previous);
}
bool LightOccluder2DEditor::_has_resource() const {
-
return node && node->get_occluder_polygon().is_valid();
}
void LightOccluder2DEditor::_create_resource() {
-
- if (!node)
+ if (!node) {
return;
+ }
undo_redo->create_action(TTR("Create Occluder Polygon"));
undo_redo->add_do_method(node, "set_occluder_polygon", Ref<OccluderPolygon2D>(memnew(OccluderPolygon2D)));
@@ -111,8 +104,7 @@ void LightOccluder2DEditor::_create_resource() {
LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
-
- node = NULL;
+ node = nullptr;
}
LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) :
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h
index 74ae9e0889..e034a41ddc 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.h
+++ b/editor/plugins/light_occluder_2d_editor_plugin.h
@@ -35,7 +35,6 @@
#include "scene/2d/light_occluder_2d.h"
class LightOccluder2DEditor : public AbstractPolygon2DEditor {
-
GDCLASS(LightOccluder2DEditor, AbstractPolygon2DEditor);
LightOccluder2D *node;
@@ -43,25 +42,24 @@ class LightOccluder2DEditor : public AbstractPolygon2DEditor {
Ref<OccluderPolygon2D> _ensure_occluder() const;
protected:
- virtual Node2D *_get_node() const;
- virtual void _set_node(Node *p_polygon);
+ virtual Node2D *_get_node() const override;
+ virtual void _set_node(Node *p_polygon) override;
- virtual bool _is_line() const;
- virtual int _get_polygon_count() const;
- virtual Variant _get_polygon(int p_idx) const;
- virtual void _set_polygon(int p_idx, const Variant &p_polygon) const;
+ virtual bool _is_line() const override;
+ virtual int _get_polygon_count() const override;
+ virtual Variant _get_polygon(int p_idx) const override;
+ virtual void _set_polygon(int p_idx, const Variant &p_polygon) const override;
- virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon);
+ virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) override;
- virtual bool _has_resource() const;
- virtual void _create_resource();
+ virtual bool _has_resource() const override;
+ virtual void _create_resource() override;
public:
LightOccluder2DEditor(EditorNode *p_editor);
};
class LightOccluder2DEditorPlugin : public AbstractPolygon2DEditorPlugin {
-
GDCLASS(LightOccluder2DEditorPlugin, AbstractPolygon2DEditorPlugin);
public:
diff --git a/editor/plugins/line_2d_editor_plugin.cpp b/editor/plugins/line_2d_editor_plugin.cpp
index 4ac9d0af3b..77eeb19d26 100644
--- a/editor/plugins/line_2d_editor_plugin.cpp
+++ b/editor/plugins/line_2d_editor_plugin.cpp
@@ -31,32 +31,26 @@
#include "line_2d_editor_plugin.h"
Node2D *Line2DEditor::_get_node() const {
-
return node;
}
void Line2DEditor::_set_node(Node *p_line) {
-
node = Object::cast_to<Line2D>(p_line);
}
bool Line2DEditor::_is_line() const {
-
return true;
}
Variant Line2DEditor::_get_polygon(int p_idx) const {
-
return _get_node()->get("points");
}
void Line2DEditor::_set_polygon(int p_idx, const Variant &p_polygon) const {
-
_get_node()->set("points", p_polygon);
}
void Line2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) {
-
Node2D *node = _get_node();
undo_redo->add_do_method(node, "set_points", p_polygon);
undo_redo->add_undo_method(node, "set_points", p_previous);
@@ -64,7 +58,7 @@ void Line2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, con
Line2DEditor::Line2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
- node = NULL;
+ node = nullptr;
}
Line2DEditorPlugin::Line2DEditorPlugin(EditorNode *p_node) :
diff --git a/editor/plugins/line_2d_editor_plugin.h b/editor/plugins/line_2d_editor_plugin.h
index ef54dbc3f7..b3bc9df3a5 100644
--- a/editor/plugins/line_2d_editor_plugin.h
+++ b/editor/plugins/line_2d_editor_plugin.h
@@ -35,26 +35,24 @@
#include "scene/2d/line_2d.h"
class Line2DEditor : public AbstractPolygon2DEditor {
-
GDCLASS(Line2DEditor, AbstractPolygon2DEditor);
Line2D *node;
protected:
- virtual Node2D *_get_node() const;
- virtual void _set_node(Node *p_line);
+ virtual Node2D *_get_node() const override;
+ virtual void _set_node(Node *p_line) override;
- virtual bool _is_line() const;
- virtual Variant _get_polygon(int p_idx) const;
- virtual void _set_polygon(int p_idx, const Variant &p_polygon) const;
- virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon);
+ virtual bool _is_line() const override;
+ virtual Variant _get_polygon(int p_idx) const override;
+ virtual void _set_polygon(int p_idx, const Variant &p_polygon) const override;
+ virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) override;
public:
Line2DEditor(EditorNode *p_editor);
};
class Line2DEditorPlugin : public AbstractPolygon2DEditorPlugin {
-
GDCLASS(Line2DEditorPlugin, AbstractPolygon2DEditorPlugin);
public:
diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp
index 750f814319..e49cfd51f7 100644
--- a/editor/plugins/material_editor_plugin.cpp
+++ b/editor/plugins/material_editor_plugin.cpp
@@ -31,35 +31,33 @@
#include "material_editor_plugin.h"
#include "editor/editor_scale.h"
-#include "scene/gui/viewport_container.h"
+#include "scene/gui/subviewport_container.h"
#include "scene/resources/particles_material.h"
+#include "scene/resources/sky_material.h"
void MaterialEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_READY) {
-
//get_scene()->connect("node_removed",this,"_node_removed");
if (first_enter) {
//it's in propertyeditor so.. could be moved around
- light_1_switch->set_normal_texture(get_icon("MaterialPreviewLight1", "EditorIcons"));
- light_1_switch->set_pressed_texture(get_icon("MaterialPreviewLight1Off", "EditorIcons"));
- light_2_switch->set_normal_texture(get_icon("MaterialPreviewLight2", "EditorIcons"));
- light_2_switch->set_pressed_texture(get_icon("MaterialPreviewLight2Off", "EditorIcons"));
+ light_1_switch->set_normal_texture(get_theme_icon("MaterialPreviewLight1", "EditorIcons"));
+ light_1_switch->set_pressed_texture(get_theme_icon("MaterialPreviewLight1Off", "EditorIcons"));
+ light_2_switch->set_normal_texture(get_theme_icon("MaterialPreviewLight2", "EditorIcons"));
+ light_2_switch->set_pressed_texture(get_theme_icon("MaterialPreviewLight2Off", "EditorIcons"));
- sphere_switch->set_normal_texture(get_icon("MaterialPreviewSphereOff", "EditorIcons"));
- sphere_switch->set_pressed_texture(get_icon("MaterialPreviewSphere", "EditorIcons"));
- box_switch->set_normal_texture(get_icon("MaterialPreviewCubeOff", "EditorIcons"));
- box_switch->set_pressed_texture(get_icon("MaterialPreviewCube", "EditorIcons"));
+ sphere_switch->set_normal_texture(get_theme_icon("MaterialPreviewSphereOff", "EditorIcons"));
+ sphere_switch->set_pressed_texture(get_theme_icon("MaterialPreviewSphere", "EditorIcons"));
+ box_switch->set_normal_texture(get_theme_icon("MaterialPreviewCubeOff", "EditorIcons"));
+ box_switch->set_pressed_texture(get_theme_icon("MaterialPreviewCube", "EditorIcons"));
first_enter = false;
}
}
if (p_what == NOTIFICATION_DRAW) {
-
- Ref<Texture> checkerboard = get_icon("Checkerboard", "EditorIcons");
+ Ref<Texture2D> checkerboard = get_theme_icon("Checkerboard", "EditorIcons");
Size2 size = get_size();
draw_texture_rect(checkerboard, Rect2(Point2(), size), true);
@@ -67,20 +65,17 @@ void MaterialEditor::_notification(int p_what) {
}
void MaterialEditor::edit(Ref<Material> p_material, const Ref<Environment> &p_env) {
-
material = p_material;
camera->set_environment(p_env);
if (!material.is_null()) {
sphere_instance->set_material_override(material);
box_instance->set_material_override(material);
} else {
-
hide();
}
}
void MaterialEditor::_button_pressed(Node *p_button) {
-
if (p_button == light_1_switch) {
light1->set_visible(!light_1_switch->is_pressed());
}
@@ -94,6 +89,7 @@ void MaterialEditor::_button_pressed(Node *p_button) {
sphere_instance->hide();
box_switch->set_pressed(true);
sphere_switch->set_pressed(false);
+ EditorSettings::get_singleton()->set_project_metadata("inspector_options", "material_preview_on_sphere", false);
}
if (p_button == sphere_switch) {
@@ -101,48 +97,46 @@ void MaterialEditor::_button_pressed(Node *p_button) {
sphere_instance->show();
box_switch->set_pressed(false);
sphere_switch->set_pressed(true);
+ EditorSettings::get_singleton()->set_project_metadata("inspector_options", "material_preview_on_sphere", true);
}
}
void MaterialEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_button_pressed"), &MaterialEditor::_button_pressed);
}
MaterialEditor::MaterialEditor() {
-
- vc = memnew(ViewportContainer);
+ vc = memnew(SubViewportContainer);
vc->set_stretch(true);
add_child(vc);
vc->set_anchors_and_margins_preset(PRESET_WIDE);
- viewport = memnew(Viewport);
- Ref<World> world;
- world.instance();
- viewport->set_world(world); //use own world
+ viewport = memnew(SubViewport);
+ Ref<World3D> world_3d;
+ world_3d.instance();
+ viewport->set_world_3d(world_3d); //use own world
vc->add_child(viewport);
viewport->set_disable_input(true);
viewport->set_transparent_background(true);
viewport->set_msaa(Viewport::MSAA_4X);
- camera = memnew(Camera);
+ camera = memnew(Camera3D);
camera->set_transform(Transform(Basis(), Vector3(0, 0, 3)));
camera->set_perspective(45, 0.1, 10);
camera->make_current();
viewport->add_child(camera);
- light1 = memnew(DirectionalLight);
+ light1 = memnew(DirectionalLight3D);
light1->set_transform(Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
viewport->add_child(light1);
- light2 = memnew(DirectionalLight);
+ light2 = memnew(DirectionalLight3D);
light2->set_transform(Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
light2->set_color(Color(0.7, 0.7, 0.7));
viewport->add_child(light2);
- sphere_instance = memnew(MeshInstance);
+ sphere_instance = memnew(MeshInstance3D);
viewport->add_child(sphere_instance);
- box_instance = memnew(MeshInstance);
+ box_instance = memnew(MeshInstance3D);
viewport->add_child(box_instance);
Transform box_xform;
@@ -156,7 +150,6 @@ MaterialEditor::MaterialEditor() {
sphere_instance->set_mesh(sphere_mesh);
box_mesh.instance();
box_instance->set_mesh(box_mesh);
- box_instance->hide();
set_custom_minimum_size(Size2(1, 150) * EDSCALE);
@@ -171,13 +164,13 @@ MaterialEditor::MaterialEditor() {
sphere_switch->set_toggle_mode(true);
sphere_switch->set_pressed(true);
vb_shape->add_child(sphere_switch);
- sphere_switch->connect("pressed", this, "_button_pressed", varray(sphere_switch));
+ sphere_switch->connect("pressed", callable_mp(this, &MaterialEditor::_button_pressed), varray(sphere_switch));
box_switch = memnew(TextureButton);
box_switch->set_toggle_mode(true);
box_switch->set_pressed(false);
vb_shape->add_child(box_switch);
- box_switch->connect("pressed", this, "_button_pressed", varray(box_switch));
+ box_switch->connect("pressed", callable_mp(this, &MaterialEditor::_button_pressed), varray(box_switch));
hb->add_spacer();
@@ -187,29 +180,37 @@ MaterialEditor::MaterialEditor() {
light_1_switch = memnew(TextureButton);
light_1_switch->set_toggle_mode(true);
vb_light->add_child(light_1_switch);
- light_1_switch->connect("pressed", this, "_button_pressed", varray(light_1_switch));
+ light_1_switch->connect("pressed", callable_mp(this, &MaterialEditor::_button_pressed), varray(light_1_switch));
light_2_switch = memnew(TextureButton);
light_2_switch->set_toggle_mode(true);
vb_light->add_child(light_2_switch);
- light_2_switch->connect("pressed", this, "_button_pressed", varray(light_2_switch));
+ light_2_switch->connect("pressed", callable_mp(this, &MaterialEditor::_button_pressed), varray(light_2_switch));
first_enter = true;
+
+ if (EditorSettings::get_singleton()->get_project_metadata("inspector_options", "material_preview_on_sphere", true)) {
+ box_instance->hide();
+ } else {
+ box_instance->show();
+ sphere_instance->hide();
+ box_switch->set_pressed(true);
+ sphere_switch->set_pressed(false);
+ }
}
///////////////////////
bool EditorInspectorPluginMaterial::can_handle(Object *p_object) {
-
Material *material = Object::cast_to<Material>(p_object);
- if (!material)
+ if (!material) {
return false;
+ }
return material->get_shader_mode() == Shader::MODE_SPATIAL;
}
void EditorInspectorPluginMaterial::parse_begin(Object *p_object) {
-
Material *material = Object::cast_to<Material>(p_object);
if (!material) {
return;
@@ -223,30 +224,30 @@ void EditorInspectorPluginMaterial::parse_begin(Object *p_object) {
EditorInspectorPluginMaterial::EditorInspectorPluginMaterial() {
env.instance();
- Ref<ProceduralSky> proc_sky = memnew(ProceduralSky(true));
- env->set_sky(proc_sky);
- env->set_background(Environment::BG_COLOR_SKY);
+ Ref<Sky> sky = memnew(Sky());
+ env->set_sky(sky);
+ env->set_background(Environment::BG_COLOR);
+ env->set_ambient_source(Environment::AMBIENT_SOURCE_SKY);
+ env->set_reflection_source(Environment::REFLECTION_SOURCE_SKY);
}
MaterialEditorPlugin::MaterialEditorPlugin(EditorNode *p_node) {
-
Ref<EditorInspectorPluginMaterial> plugin;
plugin.instance();
add_inspector_plugin(plugin);
}
-String SpatialMaterialConversionPlugin::converts_to() const {
-
+String StandardMaterial3DConversionPlugin::converts_to() const {
return "ShaderMaterial";
}
-bool SpatialMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
- Ref<SpatialMaterial> mat = p_resource;
+bool StandardMaterial3DConversionPlugin::handles(const Ref<Resource> &p_resource) const {
+ Ref<StandardMaterial3D> mat = p_resource;
return mat.is_valid();
}
-Ref<Resource> SpatialMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
- Ref<SpatialMaterial> mat = p_resource;
+Ref<Resource> StandardMaterial3DConversionPlugin::convert(const Ref<Resource> &p_resource) const {
+ Ref<StandardMaterial3D> mat = p_resource;
ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>());
Ref<ShaderMaterial> smat;
@@ -255,24 +256,23 @@ Ref<Resource> SpatialMaterialConversionPlugin::convert(const Ref<Resource> &p_re
Ref<Shader> shader;
shader.instance();
- String code = VS::get_singleton()->shader_get_code(mat->get_shader_rid());
+ String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid());
shader->set_code(code);
smat->set_shader(shader);
List<PropertyInfo> params;
- VS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
+ RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
for (List<PropertyInfo>::Element *E = params.front(); E; E = E->next()) {
-
- // Texture parameter has to be treated specially since SpatialMaterial saved it
+ // Texture parameter has to be treated specially since StandardMaterial3D saved it
// as RID but ShaderMaterial needs Texture itself
- Ref<Texture> texture = mat->get_texture_by_name(E->get().name);
+ Ref<Texture2D> texture = mat->get_texture_by_name(E->get().name);
if (texture.is_valid()) {
smat->set_shader_param(E->get().name, texture);
} else {
- Variant value = VS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
+ Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
smat->set_shader_param(E->get().name, value);
}
}
@@ -282,16 +282,15 @@ Ref<Resource> SpatialMaterialConversionPlugin::convert(const Ref<Resource> &p_re
}
String ParticlesMaterialConversionPlugin::converts_to() const {
-
return "ShaderMaterial";
}
-bool ParticlesMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
+bool ParticlesMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
Ref<ParticlesMaterial> mat = p_resource;
return mat.is_valid();
}
-Ref<Resource> ParticlesMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
+Ref<Resource> ParticlesMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
Ref<ParticlesMaterial> mat = p_resource;
ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>());
@@ -301,17 +300,17 @@ Ref<Resource> ParticlesMaterialConversionPlugin::convert(const Ref<Resource> &p_
Ref<Shader> shader;
shader.instance();
- String code = VS::get_singleton()->shader_get_code(mat->get_shader_rid());
+ String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid());
shader->set_code(code);
smat->set_shader(shader);
List<PropertyInfo> params;
- VS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
+ RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
for (List<PropertyInfo>::Element *E = params.front(); E; E = E->next()) {
- Variant value = VS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
+ Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
smat->set_shader_param(E->get().name, value);
}
@@ -320,16 +319,15 @@ Ref<Resource> ParticlesMaterialConversionPlugin::convert(const Ref<Resource> &p_
}
String CanvasItemMaterialConversionPlugin::converts_to() const {
-
return "ShaderMaterial";
}
-bool CanvasItemMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
+bool CanvasItemMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
Ref<CanvasItemMaterial> mat = p_resource;
return mat.is_valid();
}
-Ref<Resource> CanvasItemMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
+Ref<Resource> CanvasItemMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
Ref<CanvasItemMaterial> mat = p_resource;
ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>());
@@ -339,17 +337,128 @@ Ref<Resource> CanvasItemMaterialConversionPlugin::convert(const Ref<Resource> &p
Ref<Shader> shader;
shader.instance();
- String code = VS::get_singleton()->shader_get_code(mat->get_shader_rid());
+ String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid());
+
+ shader->set_code(code);
+
+ smat->set_shader(shader);
+
+ List<PropertyInfo> params;
+ RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
+
+ for (List<PropertyInfo>::Element *E = params.front(); E; E = E->next()) {
+ Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
+ smat->set_shader_param(E->get().name, value);
+ }
+
+ smat->set_render_priority(mat->get_render_priority());
+ return smat;
+}
+
+String ProceduralSkyMaterialConversionPlugin::converts_to() const {
+ return "ShaderMaterial";
+}
+
+bool ProceduralSkyMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
+ Ref<ProceduralSkyMaterial> mat = p_resource;
+ return mat.is_valid();
+}
+
+Ref<Resource> ProceduralSkyMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
+ Ref<ProceduralSkyMaterial> mat = p_resource;
+ ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>());
+
+ Ref<ShaderMaterial> smat;
+ smat.instance();
+
+ Ref<Shader> shader;
+ shader.instance();
+
+ String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid());
+
+ shader->set_code(code);
+
+ smat->set_shader(shader);
+
+ List<PropertyInfo> params;
+ RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
+
+ for (List<PropertyInfo>::Element *E = params.front(); E; E = E->next()) {
+ Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
+ smat->set_shader_param(E->get().name, value);
+ }
+
+ smat->set_render_priority(mat->get_render_priority());
+ return smat;
+}
+
+String PanoramaSkyMaterialConversionPlugin::converts_to() const {
+ return "ShaderMaterial";
+}
+
+bool PanoramaSkyMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
+ Ref<PanoramaSkyMaterial> mat = p_resource;
+ return mat.is_valid();
+}
+
+Ref<Resource> PanoramaSkyMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
+ Ref<PanoramaSkyMaterial> mat = p_resource;
+ ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>());
+
+ Ref<ShaderMaterial> smat;
+ smat.instance();
+
+ Ref<Shader> shader;
+ shader.instance();
+
+ String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid());
+
+ shader->set_code(code);
+
+ smat->set_shader(shader);
+
+ List<PropertyInfo> params;
+ RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
+
+ for (List<PropertyInfo>::Element *E = params.front(); E; E = E->next()) {
+ Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
+ smat->set_shader_param(E->get().name, value);
+ }
+
+ smat->set_render_priority(mat->get_render_priority());
+ return smat;
+}
+
+String PhysicalSkyMaterialConversionPlugin::converts_to() const {
+ return "ShaderMaterial";
+}
+
+bool PhysicalSkyMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const {
+ Ref<PhysicalSkyMaterial> mat = p_resource;
+ return mat.is_valid();
+}
+
+Ref<Resource> PhysicalSkyMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const {
+ Ref<PhysicalSkyMaterial> mat = p_resource;
+ ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>());
+
+ Ref<ShaderMaterial> smat;
+ smat.instance();
+
+ Ref<Shader> shader;
+ shader.instance();
+
+ String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid());
shader->set_code(code);
smat->set_shader(shader);
List<PropertyInfo> params;
- VS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
+ RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), &params);
for (List<PropertyInfo>::Element *E = params.front(); E; E = E->next()) {
- Variant value = VS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
+ Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E->get().name);
smat->set_shader_param(E->get().name, value);
}
diff --git a/editor/plugins/material_editor_plugin.h b/editor/plugins/material_editor_plugin.h
index 7f0a373dc7..a6df790620 100644
--- a/editor/plugins/material_editor_plugin.h
+++ b/editor/plugins/material_editor_plugin.h
@@ -36,24 +36,23 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-#include "scene/3d/camera.h"
-#include "scene/3d/light.h"
-#include "scene/3d/mesh_instance.h"
+#include "scene/3d/camera_3d.h"
+#include "scene/3d/light_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
#include "scene/resources/material.h"
-class ViewportContainer;
+class SubViewportContainer;
class MaterialEditor : public Control {
-
GDCLASS(MaterialEditor, Control);
- ViewportContainer *vc;
- Viewport *viewport;
- MeshInstance *sphere_instance;
- MeshInstance *box_instance;
- DirectionalLight *light1;
- DirectionalLight *light2;
- Camera *camera;
+ SubViewportContainer *vc;
+ SubViewport *viewport;
+ MeshInstance3D *sphere_instance;
+ MeshInstance3D *box_instance;
+ DirectionalLight3D *light1;
+ DirectionalLight3D *light2;
+ Camera3D *camera;
Ref<SphereMesh> sphere_mesh;
Ref<CubeMesh> box_mesh;
@@ -84,47 +83,73 @@ class EditorInspectorPluginMaterial : public EditorInspectorPlugin {
Ref<Environment> env;
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
EditorInspectorPluginMaterial();
};
class MaterialEditorPlugin : public EditorPlugin {
-
GDCLASS(MaterialEditorPlugin, EditorPlugin);
public:
- virtual String get_name() const { return "Material"; }
+ virtual String get_name() const override { return "Material"; }
MaterialEditorPlugin(EditorNode *p_node);
};
-class SpatialMaterialConversionPlugin : public EditorResourceConversionPlugin {
- GDCLASS(SpatialMaterialConversionPlugin, EditorResourceConversionPlugin);
+class StandardMaterial3DConversionPlugin : public EditorResourceConversionPlugin {
+ GDCLASS(StandardMaterial3DConversionPlugin, EditorResourceConversionPlugin);
public:
- virtual String converts_to() const;
- virtual bool handles(const Ref<Resource> &p_resource) const;
- virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const;
+ virtual String converts_to() const override;
+ virtual bool handles(const Ref<Resource> &p_resource) const override;
+ virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override;
};
class ParticlesMaterialConversionPlugin : public EditorResourceConversionPlugin {
GDCLASS(ParticlesMaterialConversionPlugin, EditorResourceConversionPlugin);
public:
- virtual String converts_to() const;
- virtual bool handles(const Ref<Resource> &p_resource) const;
- virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const;
+ virtual String converts_to() const override;
+ virtual bool handles(const Ref<Resource> &p_resource) const override;
+ virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override;
};
class CanvasItemMaterialConversionPlugin : public EditorResourceConversionPlugin {
GDCLASS(CanvasItemMaterialConversionPlugin, EditorResourceConversionPlugin);
public:
- virtual String converts_to() const;
- virtual bool handles(const Ref<Resource> &p_resource) const;
- virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const;
+ virtual String converts_to() const override;
+ virtual bool handles(const Ref<Resource> &p_resource) const override;
+ virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override;
+};
+
+class ProceduralSkyMaterialConversionPlugin : public EditorResourceConversionPlugin {
+ GDCLASS(ProceduralSkyMaterialConversionPlugin, EditorResourceConversionPlugin);
+
+public:
+ virtual String converts_to() const override;
+ virtual bool handles(const Ref<Resource> &p_resource) const override;
+ virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override;
+};
+
+class PanoramaSkyMaterialConversionPlugin : public EditorResourceConversionPlugin {
+ GDCLASS(PanoramaSkyMaterialConversionPlugin, EditorResourceConversionPlugin);
+
+public:
+ virtual String converts_to() const override;
+ virtual bool handles(const Ref<Resource> &p_resource) const override;
+ virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override;
+};
+
+class PhysicalSkyMaterialConversionPlugin : public EditorResourceConversionPlugin {
+ GDCLASS(PhysicalSkyMaterialConversionPlugin, EditorResourceConversionPlugin);
+
+public:
+ virtual String converts_to() const override;
+ virtual bool handles(const Ref<Resource> &p_resource) const override;
+ virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override;
};
#endif // MATERIAL_EDITOR_PLUGIN_H
diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp
index d06e5b6349..9d396467c3 100644
--- a/editor/plugins/mesh_editor_plugin.cpp
+++ b/editor/plugins/mesh_editor_plugin.cpp
@@ -33,15 +33,13 @@
#include "editor/editor_scale.h"
void MeshEditor::_gui_input(Ref<InputEvent> p_event) {
-
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
-
rot_x -= mm->get_relative().y * 0.01;
rot_y -= mm->get_relative().x * 0.01;
- if (rot_x < -Math_PI / 2)
+ if (rot_x < -Math_PI / 2) {
rot_x = -Math_PI / 2;
- else if (rot_x > Math_PI / 2) {
+ } else if (rot_x > Math_PI / 2) {
rot_x = Math_PI / 2;
}
_update_rotation();
@@ -49,25 +47,22 @@ void MeshEditor::_gui_input(Ref<InputEvent> p_event) {
}
void MeshEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_READY) {
-
//get_scene()->connect("node_removed",this,"_node_removed");
if (first_enter) {
//it's in propertyeditor so. could be moved around
- light_1_switch->set_normal_texture(get_icon("MaterialPreviewLight1", "EditorIcons"));
- light_1_switch->set_pressed_texture(get_icon("MaterialPreviewLight1Off", "EditorIcons"));
- light_2_switch->set_normal_texture(get_icon("MaterialPreviewLight2", "EditorIcons"));
- light_2_switch->set_pressed_texture(get_icon("MaterialPreviewLight2Off", "EditorIcons"));
+ light_1_switch->set_normal_texture(get_theme_icon("MaterialPreviewLight1", "EditorIcons"));
+ light_1_switch->set_pressed_texture(get_theme_icon("MaterialPreviewLight1Off", "EditorIcons"));
+ light_2_switch->set_normal_texture(get_theme_icon("MaterialPreviewLight2", "EditorIcons"));
+ light_2_switch->set_pressed_texture(get_theme_icon("MaterialPreviewLight2Off", "EditorIcons"));
first_enter = false;
}
}
}
void MeshEditor::_update_rotation() {
-
Transform t;
t.basis.rotate(Vector3(0, 1, 0), -rot_y);
t.basis.rotate(Vector3(1, 0, 0), -rot_x);
@@ -75,7 +70,6 @@ void MeshEditor::_update_rotation() {
}
void MeshEditor::edit(Ref<Mesh> p_mesh) {
-
mesh = p_mesh;
mesh_instance->set_mesh(mesh);
@@ -98,7 +92,6 @@ void MeshEditor::edit(Ref<Mesh> p_mesh) {
}
void MeshEditor::_button_pressed(Node *p_button) {
-
if (p_button == light_1_switch) {
light1->set_visible(!light_1_switch->is_pressed());
}
@@ -109,38 +102,35 @@ void MeshEditor::_button_pressed(Node *p_button) {
}
void MeshEditor::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_gui_input"), &MeshEditor::_gui_input);
- ClassDB::bind_method(D_METHOD("_button_pressed"), &MeshEditor::_button_pressed);
}
MeshEditor::MeshEditor() {
-
- viewport = memnew(Viewport);
- Ref<World> world;
- world.instance();
- viewport->set_world(world); //use own world
+ viewport = memnew(SubViewport);
+ Ref<World3D> world_3d;
+ world_3d.instance();
+ viewport->set_world_3d(world_3d); //use own world
add_child(viewport);
viewport->set_disable_input(true);
viewport->set_msaa(Viewport::MSAA_2X);
set_stretch(true);
- camera = memnew(Camera);
+ camera = memnew(Camera3D);
camera->set_transform(Transform(Basis(), Vector3(0, 0, 1.1)));
camera->set_perspective(45, 0.1, 10);
viewport->add_child(camera);
- light1 = memnew(DirectionalLight);
+ light1 = memnew(DirectionalLight3D);
light1->set_transform(Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
viewport->add_child(light1);
- light2 = memnew(DirectionalLight);
+ light2 = memnew(DirectionalLight3D);
light2->set_transform(Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
light2->set_color(Color(0.7, 0.7, 0.7));
viewport->add_child(light2);
- rotation = memnew(Spatial);
+ rotation = memnew(Node3D);
viewport->add_child(rotation);
- mesh_instance = memnew(MeshInstance);
+ mesh_instance = memnew(MeshInstance3D);
rotation->add_child(mesh_instance);
set_custom_minimum_size(Size2(1, 150) * EDSCALE);
@@ -157,12 +147,12 @@ MeshEditor::MeshEditor() {
light_1_switch = memnew(TextureButton);
light_1_switch->set_toggle_mode(true);
vb_light->add_child(light_1_switch);
- light_1_switch->connect("pressed", this, "_button_pressed", varray(light_1_switch));
+ light_1_switch->connect("pressed", callable_mp(this, &MeshEditor::_button_pressed), varray(light_1_switch));
light_2_switch = memnew(TextureButton);
light_2_switch->set_toggle_mode(true);
vb_light->add_child(light_2_switch);
- light_2_switch->connect("pressed", this, "_button_pressed", varray(light_2_switch));
+ light_2_switch->connect("pressed", callable_mp(this, &MeshEditor::_button_pressed), varray(light_2_switch));
first_enter = true;
@@ -173,12 +163,10 @@ MeshEditor::MeshEditor() {
///////////////////////
bool EditorInspectorPluginMesh::can_handle(Object *p_object) {
-
- return Object::cast_to<Mesh>(p_object) != NULL;
+ return Object::cast_to<Mesh>(p_object) != nullptr;
}
void EditorInspectorPluginMesh::parse_begin(Object *p_object) {
-
Mesh *mesh = Object::cast_to<Mesh>(p_object);
if (!mesh) {
return;
@@ -191,7 +179,6 @@ void EditorInspectorPluginMesh::parse_begin(Object *p_object) {
}
MeshEditorPlugin::MeshEditorPlugin(EditorNode *p_node) {
-
Ref<EditorInspectorPluginMesh> plugin;
plugin.instance();
add_inspector_plugin(plugin);
diff --git a/editor/plugins/mesh_editor_plugin.h b/editor/plugins/mesh_editor_plugin.h
index 87c4a1776b..1fb0babb10 100644
--- a/editor/plugins/mesh_editor_plugin.h
+++ b/editor/plugins/mesh_editor_plugin.h
@@ -33,25 +33,24 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-#include "scene/3d/camera.h"
-#include "scene/3d/light.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/gui/viewport_container.h"
+#include "scene/3d/camera_3d.h"
+#include "scene/3d/light_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/gui/subviewport_container.h"
#include "scene/resources/material.h"
-class MeshEditor : public ViewportContainer {
-
- GDCLASS(MeshEditor, ViewportContainer);
+class MeshEditor : public SubViewportContainer {
+ GDCLASS(MeshEditor, SubViewportContainer);
float rot_x;
float rot_y;
- Viewport *viewport;
- MeshInstance *mesh_instance;
- Spatial *rotation;
- DirectionalLight *light1;
- DirectionalLight *light2;
- Camera *camera;
+ SubViewport *viewport;
+ MeshInstance3D *mesh_instance;
+ Node3D *rotation;
+ DirectionalLight3D *light1;
+ DirectionalLight3D *light2;
+ Camera3D *camera;
Ref<Mesh> mesh;
@@ -77,16 +76,15 @@ class EditorInspectorPluginMesh : public EditorInspectorPlugin {
GDCLASS(EditorInspectorPluginMesh, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
};
class MeshEditorPlugin : public EditorPlugin {
-
GDCLASS(MeshEditorPlugin, EditorPlugin);
public:
- virtual String get_name() const { return "Mesh"; }
+ virtual String get_name() const override { return "Mesh"; }
MeshEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..5b241deab0
--- /dev/null
+++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp
@@ -0,0 +1,514 @@
+/*************************************************************************/
+/* mesh_instance_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "mesh_instance_3d_editor_plugin.h"
+
+#include "editor/editor_scale.h"
+#include "node_3d_editor_plugin.h"
+#include "scene/3d/collision_shape_3d.h"
+#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/physics_body_3d.h"
+#include "scene/gui/box_container.h"
+
+void MeshInstance3DEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ options->hide();
+ }
+}
+
+void MeshInstance3DEditor::edit(MeshInstance3D *p_mesh) {
+ node = p_mesh;
+}
+
+void MeshInstance3DEditor::_menu_option(int p_option) {
+ Ref<Mesh> mesh = node->get_mesh();
+ if (mesh.is_null()) {
+ err_dialog->set_text(TTR("Mesh is empty!"));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ switch (p_option) {
+ case MENU_OPTION_CREATE_STATIC_TRIMESH_BODY: {
+ EditorSelection *editor_selection = EditorNode::get_singleton()->get_editor_selection();
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ List<Node *> selection = editor_selection->get_selected_node_list();
+
+ if (selection.empty()) {
+ Ref<Shape3D> shape = mesh->create_trimesh_shape();
+ if (shape.is_null()) {
+ err_dialog->set_text(TTR("Couldn't create a Trimesh collision shape."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
+ cshape->set_shape(shape);
+ StaticBody3D *body = memnew(StaticBody3D);
+ body->add_child(cshape);
+
+ Node *owner = node == get_tree()->get_edited_scene_root() ? node : node->get_owner();
+
+ ur->create_action(TTR("Create Static Trimesh Body"));
+ ur->add_do_method(node, "add_child", body);
+ ur->add_do_method(body, "set_owner", owner);
+ ur->add_do_method(cshape, "set_owner", owner);
+ ur->add_do_reference(body);
+ ur->add_undo_method(node, "remove_child", body);
+ ur->commit_action();
+ return;
+ }
+
+ ur->create_action(TTR("Create Static Trimesh Body"));
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ MeshInstance3D *instance = Object::cast_to<MeshInstance3D>(E->get());
+ if (!instance) {
+ continue;
+ }
+
+ Ref<Mesh> m = instance->get_mesh();
+ if (m.is_null()) {
+ continue;
+ }
+
+ Ref<Shape3D> shape = m->create_trimesh_shape();
+ if (shape.is_null()) {
+ continue;
+ }
+
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
+ cshape->set_shape(shape);
+ StaticBody3D *body = memnew(StaticBody3D);
+ body->add_child(cshape);
+
+ Node *owner = instance == get_tree()->get_edited_scene_root() ? instance : instance->get_owner();
+
+ ur->add_do_method(instance, "add_child", body);
+ ur->add_do_method(body, "set_owner", owner);
+ ur->add_do_method(cshape, "set_owner", owner);
+ ur->add_do_reference(body);
+ ur->add_undo_method(instance, "remove_child", body);
+ }
+
+ ur->commit_action();
+
+ } break;
+
+ case MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE: {
+ if (node == get_tree()->get_edited_scene_root()) {
+ err_dialog->set_text(TTR("This doesn't work on scene root!"));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Ref<Shape3D> shape = mesh->create_trimesh_shape();
+ if (shape.is_null()) {
+ return;
+ }
+
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
+ cshape->set_shape(shape);
+ cshape->set_transform(node->get_transform());
+
+ Node *owner = node->get_owner();
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("Create Trimesh Static Shape"));
+
+ ur->add_do_method(node->get_parent(), "add_child", cshape);
+ ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1);
+ ur->add_do_method(cshape, "set_owner", owner);
+ ur->add_do_reference(cshape);
+ ur->add_undo_method(node->get_parent(), "remove_child", cshape);
+ ur->commit_action();
+ } break;
+ case MENU_OPTION_CREATE_SINGLE_CONVEX_COLLISION_SHAPE: {
+ if (node == get_tree()->get_edited_scene_root()) {
+ err_dialog->set_text(TTR("Can't create a single convex collision shape for the scene root."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Ref<Shape3D> shape = mesh->create_convex_shape();
+
+ if (shape.is_null()) {
+ err_dialog->set_text(TTR("Couldn't create a single convex collision shape."));
+ err_dialog->popup_centered();
+ return;
+ }
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("Create Single Convex Shape"));
+
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
+ cshape->set_shape(shape);
+ cshape->set_transform(node->get_transform());
+
+ Node *owner = node->get_owner();
+
+ ur->add_do_method(node->get_parent(), "add_child", cshape);
+ ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1);
+ ur->add_do_method(cshape, "set_owner", owner);
+ ur->add_do_reference(cshape);
+ ur->add_undo_method(node->get_parent(), "remove_child", cshape);
+
+ ur->commit_action();
+
+ } break;
+ case MENU_OPTION_CREATE_MULTIPLE_CONVEX_COLLISION_SHAPES: {
+ if (node == get_tree()->get_edited_scene_root()) {
+ err_dialog->set_text(TTR("Can't create multiple convex collision shapes for the scene root."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Vector<Ref<Shape3D>> shapes = mesh->convex_decompose();
+
+ if (!shapes.size()) {
+ err_dialog->set_text(TTR("Couldn't create any collision shapes."));
+ err_dialog->popup_centered();
+ return;
+ }
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("Create Multiple Convex Shapes"));
+
+ for (int i = 0; i < shapes.size(); i++) {
+ CollisionShape3D *cshape = memnew(CollisionShape3D);
+ cshape->set_shape(shapes[i]);
+ cshape->set_transform(node->get_transform());
+
+ Node *owner = node->get_owner();
+
+ ur->add_do_method(node->get_parent(), "add_child", cshape);
+ ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1);
+ ur->add_do_method(cshape, "set_owner", owner);
+ ur->add_do_reference(cshape);
+ ur->add_undo_method(node->get_parent(), "remove_child", cshape);
+ }
+ ur->commit_action();
+
+ } break;
+
+ case MENU_OPTION_CREATE_NAVMESH: {
+ Ref<NavigationMesh> nmesh = memnew(NavigationMesh);
+
+ if (nmesh.is_null()) {
+ return;
+ }
+
+ nmesh->create_from_mesh(mesh);
+ NavigationRegion3D *nmi = memnew(NavigationRegion3D);
+ nmi->set_navigation_mesh(nmesh);
+
+ Node *owner = node == get_tree()->get_edited_scene_root() ? node : node->get_owner();
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Create Navigation Mesh"));
+
+ ur->add_do_method(node, "add_child", nmi);
+ ur->add_do_method(nmi, "set_owner", owner);
+
+ ur->add_do_reference(nmi);
+ ur->add_undo_method(node, "remove_child", nmi);
+ ur->commit_action();
+ } break;
+
+ case MENU_OPTION_CREATE_OUTLINE_MESH: {
+ outline_dialog->popup_centered(Vector2(200, 90));
+ } break;
+ case MENU_OPTION_CREATE_UV2: {
+ Ref<ArrayMesh> mesh2 = node->get_mesh();
+ if (!mesh2.is_valid()) {
+ err_dialog->set_text(TTR("Contained Mesh is not of type ArrayMesh."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Error err = mesh2->lightmap_unwrap(node->get_global_transform());
+ if (err != OK) {
+ err_dialog->set_text(TTR("UV Unwrap failed, mesh may not be manifold?"));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ } break;
+ case MENU_OPTION_DEBUG_UV1: {
+ Ref<Mesh> mesh2 = node->get_mesh();
+ if (!mesh2.is_valid()) {
+ err_dialog->set_text(TTR("No mesh to debug."));
+ err_dialog->popup_centered();
+ return;
+ }
+ _create_uv_lines(0);
+ } break;
+ case MENU_OPTION_DEBUG_UV2: {
+ Ref<Mesh> mesh2 = node->get_mesh();
+ if (!mesh2.is_valid()) {
+ err_dialog->set_text(TTR("No mesh to debug."));
+ err_dialog->popup_centered();
+ return;
+ }
+ _create_uv_lines(1);
+ } break;
+ }
+}
+
+struct MeshInstance3DEditorEdgeSort {
+ Vector2 a;
+ Vector2 b;
+
+ bool operator<(const MeshInstance3DEditorEdgeSort &p_b) const {
+ if (a == p_b.a) {
+ return b < p_b.b;
+ } else {
+ return a < p_b.a;
+ }
+ }
+
+ MeshInstance3DEditorEdgeSort() {}
+ MeshInstance3DEditorEdgeSort(const Vector2 &p_a, const Vector2 &p_b) {
+ if (p_a < p_b) {
+ a = p_a;
+ b = p_b;
+ } else {
+ b = p_a;
+ a = p_b;
+ }
+ }
+};
+
+void MeshInstance3DEditor::_create_uv_lines(int p_layer) {
+ Ref<Mesh> mesh = node->get_mesh();
+ ERR_FAIL_COND(!mesh.is_valid());
+
+ Set<MeshInstance3DEditorEdgeSort> edges;
+ uv_lines.clear();
+ for (int i = 0; i < mesh->get_surface_count(); i++) {
+ if (mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) {
+ continue;
+ }
+ Array a = mesh->surface_get_arrays(i);
+
+ Vector<Vector2> uv = a[p_layer == 0 ? Mesh::ARRAY_TEX_UV : Mesh::ARRAY_TEX_UV2];
+ if (uv.size() == 0) {
+ err_dialog->set_text(TTR("Model has no UV in this layer"));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ const Vector2 *r = uv.ptr();
+
+ Vector<int> indices = a[Mesh::ARRAY_INDEX];
+ const int *ri = nullptr;
+
+ int ic;
+
+ if (indices.size()) {
+ ic = indices.size();
+ ri = indices.ptr();
+ } else {
+ ic = uv.size();
+ }
+
+ for (int j = 0; j < ic; j += 3) {
+ for (int k = 0; k < 3; k++) {
+ MeshInstance3DEditorEdgeSort edge;
+ if (ri) {
+ edge.a = r[ri[j + k]];
+ edge.b = r[ri[j + ((k + 1) % 3)]];
+ } else {
+ edge.a = r[j + k];
+ edge.b = r[j + ((k + 1) % 3)];
+ }
+
+ if (edges.has(edge)) {
+ continue;
+ }
+
+ uv_lines.push_back(edge.a);
+ uv_lines.push_back(edge.b);
+ edges.insert(edge);
+ }
+ }
+ }
+
+ debug_uv_dialog->popup_centered();
+}
+
+void MeshInstance3DEditor::_debug_uv_draw() {
+ if (uv_lines.size() == 0) {
+ return;
+ }
+
+ debug_uv->set_clip_contents(true);
+ debug_uv->draw_rect(Rect2(Vector2(), debug_uv->get_size()), Color(0.2, 0.2, 0.0));
+ debug_uv->draw_set_transform(Vector2(), 0, debug_uv->get_size());
+ debug_uv->draw_multiline(uv_lines, Color(1.0, 0.8, 0.7));
+}
+
+void MeshInstance3DEditor::_create_outline_mesh() {
+ Ref<Mesh> mesh = node->get_mesh();
+ if (mesh.is_null()) {
+ err_dialog->set_text(TTR("MeshInstance3D lacks a Mesh."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ if (mesh->get_surface_count() == 0) {
+ err_dialog->set_text(TTR("Mesh has not surface to create outlines from."));
+ err_dialog->popup_centered();
+ return;
+ } else if (mesh->get_surface_count() == 1 && mesh->surface_get_primitive_type(0) != Mesh::PRIMITIVE_TRIANGLES) {
+ err_dialog->set_text(TTR("Mesh primitive type is not PRIMITIVE_TRIANGLES."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Ref<Mesh> mesho = mesh->create_outline(outline_size->get_value());
+
+ if (mesho.is_null()) {
+ err_dialog->set_text(TTR("Could not create outline."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ MeshInstance3D *mi = memnew(MeshInstance3D);
+ mi->set_mesh(mesho);
+ Node *owner = node->get_owner();
+ if (get_tree()->get_edited_scene_root() == node) {
+ owner = node;
+ }
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+
+ ur->create_action(TTR("Create Outline"));
+
+ ur->add_do_method(node, "add_child", mi);
+ ur->add_do_method(mi, "set_owner", owner);
+
+ ur->add_do_reference(mi);
+ ur->add_undo_method(node, "remove_child", mi);
+ ur->commit_action();
+}
+
+void MeshInstance3DEditor::_bind_methods() {
+}
+
+MeshInstance3DEditor::MeshInstance3DEditor() {
+ options = memnew(MenuButton);
+ options->set_switch_on_hover(true);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(options);
+
+ options->set_text(TTR("Mesh"));
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("MeshInstance3D", "EditorIcons"));
+
+ options->get_popup()->add_item(TTR("Create Trimesh Static Body"), MENU_OPTION_CREATE_STATIC_TRIMESH_BODY);
+ options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a StaticBody3D and assigns a polygon-based collision shape to it automatically.\nThis is the most accurate (but slowest) option for collision detection."));
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create Trimesh Collision Sibling"), MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE);
+ options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a polygon-based collision shape.\nThis is the most accurate (but slowest) option for collision detection."));
+ options->get_popup()->add_item(TTR("Create Single Convex Collision Sibling"), MENU_OPTION_CREATE_SINGLE_CONVEX_COLLISION_SHAPE);
+ options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a single convex collision shape.\nThis is the fastest (but least accurate) option for collision detection."));
+ options->get_popup()->add_item(TTR("Create Multiple Convex Collision Siblings"), MENU_OPTION_CREATE_MULTIPLE_CONVEX_COLLISION_SHAPES);
+ options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a polygon-based collision shape.\nThis is a performance middle-ground between the two above options."));
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create Navigation Mesh"), MENU_OPTION_CREATE_NAVMESH);
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("Create Outline Mesh..."), MENU_OPTION_CREATE_OUTLINE_MESH);
+ options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a static outline mesh. The outline mesh will have its normals flipped automatically.\nThis can be used instead of the StandardMaterial Grow property when using that property isn't possible."));
+ options->get_popup()->add_separator();
+ options->get_popup()->add_item(TTR("View UV1"), MENU_OPTION_DEBUG_UV1);
+ options->get_popup()->add_item(TTR("View UV2"), MENU_OPTION_DEBUG_UV2);
+ options->get_popup()->add_item(TTR("Unwrap UV2 for Lightmap/AO"), MENU_OPTION_CREATE_UV2);
+
+ options->get_popup()->connect("id_pressed", callable_mp(this, &MeshInstance3DEditor::_menu_option));
+
+ outline_dialog = memnew(ConfirmationDialog);
+ outline_dialog->set_title(TTR("Create Outline Mesh"));
+ outline_dialog->get_ok()->set_text(TTR("Create"));
+
+ VBoxContainer *outline_dialog_vbc = memnew(VBoxContainer);
+ outline_dialog->add_child(outline_dialog_vbc);
+ //outline_dialog->set_child_rect(outline_dialog_vbc);
+
+ outline_size = memnew(SpinBox);
+ outline_size->set_min(0.001);
+ outline_size->set_max(1024);
+ outline_size->set_step(0.001);
+ outline_size->set_value(0.05);
+ outline_dialog_vbc->add_margin_child(TTR("Outline Size:"), outline_size);
+
+ add_child(outline_dialog);
+ outline_dialog->connect("confirmed", callable_mp(this, &MeshInstance3DEditor::_create_outline_mesh));
+
+ err_dialog = memnew(AcceptDialog);
+ add_child(err_dialog);
+
+ debug_uv_dialog = memnew(AcceptDialog);
+ debug_uv_dialog->set_title(TTR("UV Channel Debug"));
+ add_child(debug_uv_dialog);
+ debug_uv = memnew(Control);
+ debug_uv->set_custom_minimum_size(Size2(600, 600) * EDSCALE);
+ debug_uv->connect("draw", callable_mp(this, &MeshInstance3DEditor::_debug_uv_draw));
+ debug_uv_dialog->add_child(debug_uv);
+}
+
+void MeshInstance3DEditorPlugin::edit(Object *p_object) {
+ mesh_editor->edit(Object::cast_to<MeshInstance3D>(p_object));
+}
+
+bool MeshInstance3DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("MeshInstance3D");
+}
+
+void MeshInstance3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ mesh_editor->options->show();
+ } else {
+ mesh_editor->options->hide();
+ mesh_editor->edit(nullptr);
+ }
+}
+
+MeshInstance3DEditorPlugin::MeshInstance3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ mesh_editor = memnew(MeshInstance3DEditor);
+ editor->get_viewport()->add_child(mesh_editor);
+
+ mesh_editor->options->hide();
+}
+
+MeshInstance3DEditorPlugin::~MeshInstance3DEditorPlugin() {
+}
diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.h b/editor/plugins/mesh_instance_3d_editor_plugin.h
new file mode 100644
index 0000000000..77a2b8ec34
--- /dev/null
+++ b/editor/plugins/mesh_instance_3d_editor_plugin.h
@@ -0,0 +1,102 @@
+/*************************************************************************/
+/* mesh_instance_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef MESH_INSTANCE_EDITOR_PLUGIN_H
+#define MESH_INSTANCE_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/gui/spin_box.h"
+
+class MeshInstance3DEditor : public Control {
+ GDCLASS(MeshInstance3DEditor, Control);
+
+ enum Menu {
+
+ MENU_OPTION_CREATE_STATIC_TRIMESH_BODY,
+ MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE,
+ MENU_OPTION_CREATE_SINGLE_CONVEX_COLLISION_SHAPE,
+ MENU_OPTION_CREATE_MULTIPLE_CONVEX_COLLISION_SHAPES,
+ MENU_OPTION_CREATE_NAVMESH,
+ MENU_OPTION_CREATE_OUTLINE_MESH,
+ MENU_OPTION_CREATE_UV2,
+ MENU_OPTION_DEBUG_UV1,
+ MENU_OPTION_DEBUG_UV2,
+ };
+
+ MeshInstance3D *node;
+
+ MenuButton *options;
+
+ ConfirmationDialog *outline_dialog;
+ SpinBox *outline_size;
+
+ AcceptDialog *err_dialog;
+
+ AcceptDialog *debug_uv_dialog;
+ Control *debug_uv;
+ Vector<Vector2> uv_lines;
+
+ void _menu_option(int p_option);
+ void _create_outline_mesh();
+
+ void _create_uv_lines(int p_layer);
+ friend class MeshInstance3DEditorPlugin;
+
+ void _debug_uv_draw();
+
+protected:
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+public:
+ void edit(MeshInstance3D *p_mesh);
+ MeshInstance3DEditor();
+};
+
+class MeshInstance3DEditorPlugin : public EditorPlugin {
+ GDCLASS(MeshInstance3DEditorPlugin, EditorPlugin);
+
+ MeshInstance3DEditor *mesh_editor;
+ EditorNode *editor;
+
+public:
+ virtual String get_name() const override { return "MeshInstance3D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ MeshInstance3DEditorPlugin(EditorNode *p_node);
+ ~MeshInstance3DEditorPlugin();
+};
+
+#endif // MESH_EDITOR_PLUGIN_H
diff --git a/editor/plugins/mesh_instance_editor_plugin.cpp b/editor/plugins/mesh_instance_editor_plugin.cpp
deleted file mode 100644
index 25329906a9..0000000000
--- a/editor/plugins/mesh_instance_editor_plugin.cpp
+++ /dev/null
@@ -1,499 +0,0 @@
-/*************************************************************************/
-/* mesh_instance_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "mesh_instance_editor_plugin.h"
-
-#include "editor/editor_scale.h"
-#include "scene/3d/collision_shape.h"
-#include "scene/3d/navigation_mesh.h"
-#include "scene/3d/physics_body.h"
-#include "scene/gui/box_container.h"
-#include "spatial_editor_plugin.h"
-
-void MeshInstanceEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- options->hide();
- }
-}
-
-void MeshInstanceEditor::edit(MeshInstance *p_mesh) {
-
- node = p_mesh;
-}
-
-void MeshInstanceEditor::_menu_option(int p_option) {
-
- Ref<Mesh> mesh = node->get_mesh();
- if (mesh.is_null()) {
- err_dialog->set_text(TTR("Mesh is empty!"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- switch (p_option) {
- case MENU_OPTION_CREATE_STATIC_TRIMESH_BODY:
- case MENU_OPTION_CREATE_STATIC_CONVEX_BODY: {
-
- bool trimesh_shape = (p_option == MENU_OPTION_CREATE_STATIC_TRIMESH_BODY);
-
- EditorSelection *editor_selection = EditorNode::get_singleton()->get_editor_selection();
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
-
- List<Node *> selection = editor_selection->get_selected_node_list();
-
- if (selection.empty()) {
- Ref<Shape> shape = trimesh_shape ? mesh->create_trimesh_shape() : mesh->create_convex_shape();
- if (shape.is_null())
- return;
-
- CollisionShape *cshape = memnew(CollisionShape);
- cshape->set_shape(shape);
- StaticBody *body = memnew(StaticBody);
- body->add_child(cshape);
-
- Node *owner = node == get_tree()->get_edited_scene_root() ? node : node->get_owner();
-
- if (trimesh_shape)
- ur->create_action(TTR("Create Static Trimesh Body"));
- else
- ur->create_action(TTR("Create Static Convex Body"));
-
- ur->add_do_method(node, "add_child", body);
- ur->add_do_method(body, "set_owner", owner);
- ur->add_do_method(cshape, "set_owner", owner);
- ur->add_do_reference(body);
- ur->add_undo_method(node, "remove_child", body);
- ur->commit_action();
- return;
- }
-
- ur->create_action(TTR("Create Static Trimesh Body"));
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- MeshInstance *instance = Object::cast_to<MeshInstance>(E->get());
- if (!instance)
- continue;
-
- Ref<Mesh> m = instance->get_mesh();
- if (m.is_null())
- continue;
-
- Ref<Shape> shape = trimesh_shape ? m->create_trimesh_shape() : m->create_convex_shape();
- if (shape.is_null())
- continue;
-
- CollisionShape *cshape = memnew(CollisionShape);
- cshape->set_shape(shape);
- StaticBody *body = memnew(StaticBody);
- body->add_child(cshape);
-
- Node *owner = instance == get_tree()->get_edited_scene_root() ? instance : instance->get_owner();
-
- ur->add_do_method(instance, "add_child", body);
- ur->add_do_method(body, "set_owner", owner);
- ur->add_do_method(cshape, "set_owner", owner);
- ur->add_do_reference(body);
- ur->add_undo_method(instance, "remove_child", body);
- }
-
- ur->commit_action();
-
- } break;
-
- case MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE: {
-
- if (node == get_tree()->get_edited_scene_root()) {
- err_dialog->set_text(TTR("This doesn't work on scene root!"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- Ref<Shape> shape = mesh->create_trimesh_shape();
- if (shape.is_null())
- return;
-
- CollisionShape *cshape = memnew(CollisionShape);
- cshape->set_shape(shape);
-
- Node *owner = node->get_owner();
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
-
- ur->create_action(TTR("Create Trimesh Static Shape"));
-
- ur->add_do_method(node->get_parent(), "add_child", cshape);
- ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1);
- ur->add_do_method(cshape, "set_owner", owner);
- ur->add_do_reference(cshape);
- ur->add_undo_method(node->get_parent(), "remove_child", cshape);
- ur->commit_action();
- } break;
- case MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE: {
-
- if (node == get_tree()->get_edited_scene_root()) {
- err_dialog->set_text(TTR("This doesn't work on scene root!"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- Vector<Ref<Shape> > shapes = mesh->convex_decompose();
-
- if (!shapes.size()) {
- err_dialog->set_text(TTR("Failed creating shapes!"));
- err_dialog->popup_centered_minsize();
- return;
- }
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
-
- ur->create_action(TTR("Create Convex Shape(s)"));
-
- for (int i = 0; i < shapes.size(); i++) {
-
- CollisionShape *cshape = memnew(CollisionShape);
- cshape->set_shape(shapes[i]);
- cshape->set_transform(node->get_transform());
-
- Node *owner = node->get_owner();
-
- ur->add_do_method(node->get_parent(), "add_child", cshape);
- ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1);
- ur->add_do_method(cshape, "set_owner", owner);
- ur->add_do_reference(cshape);
- ur->add_undo_method(node->get_parent(), "remove_child", cshape);
- }
- ur->commit_action();
-
- } break;
-
- case MENU_OPTION_CREATE_NAVMESH: {
-
- Ref<NavigationMesh> nmesh = memnew(NavigationMesh);
-
- if (nmesh.is_null())
- return;
-
- nmesh->create_from_mesh(mesh);
- NavigationMeshInstance *nmi = memnew(NavigationMeshInstance);
- nmi->set_navigation_mesh(nmesh);
-
- Node *owner = node == get_tree()->get_edited_scene_root() ? node : node->get_owner();
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Create Navigation Mesh"));
-
- ur->add_do_method(node, "add_child", nmi);
- ur->add_do_method(nmi, "set_owner", owner);
-
- ur->add_do_reference(nmi);
- ur->add_undo_method(node, "remove_child", nmi);
- ur->commit_action();
- } break;
-
- case MENU_OPTION_CREATE_OUTLINE_MESH: {
-
- outline_dialog->popup_centered(Vector2(200, 90));
- } break;
- case MENU_OPTION_CREATE_UV2: {
-
- Ref<ArrayMesh> mesh2 = node->get_mesh();
- if (!mesh2.is_valid()) {
- err_dialog->set_text(TTR("Contained Mesh is not of type ArrayMesh."));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- Error err = mesh2->lightmap_unwrap(node->get_global_transform());
- if (err != OK) {
- err_dialog->set_text(TTR("UV Unwrap failed, mesh may not be manifold?"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- } break;
- case MENU_OPTION_DEBUG_UV1: {
- Ref<Mesh> mesh2 = node->get_mesh();
- if (!mesh2.is_valid()) {
- err_dialog->set_text(TTR("No mesh to debug."));
- err_dialog->popup_centered_minsize();
- return;
- }
- _create_uv_lines(0);
- } break;
- case MENU_OPTION_DEBUG_UV2: {
- Ref<Mesh> mesh2 = node->get_mesh();
- if (!mesh2.is_valid()) {
- err_dialog->set_text(TTR("No mesh to debug."));
- err_dialog->popup_centered_minsize();
- return;
- }
- _create_uv_lines(1);
- } break;
- }
-}
-
-struct MeshInstanceEditorEdgeSort {
-
- Vector2 a;
- Vector2 b;
-
- bool operator<(const MeshInstanceEditorEdgeSort &p_b) const {
- if (a == p_b.a)
- return b < p_b.b;
- else
- return a < p_b.a;
- }
-
- MeshInstanceEditorEdgeSort() {}
- MeshInstanceEditorEdgeSort(const Vector2 &p_a, const Vector2 &p_b) {
- if (p_a < p_b) {
- a = p_a;
- b = p_b;
- } else {
- b = p_a;
- a = p_b;
- }
- }
-};
-
-void MeshInstanceEditor::_create_uv_lines(int p_layer) {
-
- Ref<Mesh> mesh = node->get_mesh();
- ERR_FAIL_COND(!mesh.is_valid());
-
- Set<MeshInstanceEditorEdgeSort> edges;
- uv_lines.clear();
- for (int i = 0; i < mesh->get_surface_count(); i++) {
- if (mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES)
- continue;
- Array a = mesh->surface_get_arrays(i);
-
- PoolVector<Vector2> uv = a[p_layer == 0 ? Mesh::ARRAY_TEX_UV : Mesh::ARRAY_TEX_UV2];
- if (uv.size() == 0) {
- err_dialog->set_text(TTR("Model has no UV in this layer"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- PoolVector<Vector2>::Read r = uv.read();
-
- PoolVector<int> indices = a[Mesh::ARRAY_INDEX];
- PoolVector<int>::Read ri;
-
- int ic;
- bool use_indices;
-
- if (indices.size()) {
- ic = indices.size();
- ri = indices.read();
- use_indices = true;
- } else {
- ic = uv.size();
- use_indices = false;
- }
-
- for (int j = 0; j < ic; j += 3) {
-
- for (int k = 0; k < 3; k++) {
-
- MeshInstanceEditorEdgeSort edge;
- if (use_indices) {
- edge.a = r[ri[j + k]];
- edge.b = r[ri[j + ((k + 1) % 3)]];
- } else {
- edge.a = r[j + k];
- edge.b = r[j + ((k + 1) % 3)];
- }
-
- if (edges.has(edge))
- continue;
-
- uv_lines.push_back(edge.a);
- uv_lines.push_back(edge.b);
- edges.insert(edge);
- }
- }
- }
-
- debug_uv_dialog->popup_centered_minsize();
-}
-
-void MeshInstanceEditor::_debug_uv_draw() {
-
- if (uv_lines.size() == 0)
- return;
-
- debug_uv->set_clip_contents(true);
- debug_uv->draw_rect(Rect2(Vector2(), debug_uv->get_size()), Color(0.2, 0.2, 0.0));
- debug_uv->draw_set_transform(Vector2(), 0, debug_uv->get_size());
- debug_uv->draw_multiline(uv_lines, Color(1.0, 0.8, 0.7));
-}
-
-void MeshInstanceEditor::_create_outline_mesh() {
-
- Ref<Mesh> mesh = node->get_mesh();
- if (mesh.is_null()) {
- err_dialog->set_text(TTR("MeshInstance lacks a Mesh!"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- if (mesh->get_surface_count() == 0) {
- err_dialog->set_text(TTR("Mesh has not surface to create outlines from!"));
- err_dialog->popup_centered_minsize();
- return;
- } else if (mesh->get_surface_count() == 1 && mesh->surface_get_primitive_type(0) != Mesh::PRIMITIVE_TRIANGLES) {
- err_dialog->set_text(TTR("Mesh primitive type is not PRIMITIVE_TRIANGLES!"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- Ref<Mesh> mesho = mesh->create_outline(outline_size->get_value());
-
- if (mesho.is_null()) {
- err_dialog->set_text(TTR("Could not create outline!"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- MeshInstance *mi = memnew(MeshInstance);
- mi->set_mesh(mesho);
- Node *owner = node->get_owner();
- if (get_tree()->get_edited_scene_root() == node) {
- owner = node;
- }
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
-
- ur->create_action(TTR("Create Outline"));
-
- ur->add_do_method(node, "add_child", mi);
- ur->add_do_method(mi, "set_owner", owner);
-
- ur->add_do_reference(mi);
- ur->add_undo_method(node, "remove_child", mi);
- ur->commit_action();
-}
-
-void MeshInstanceEditor::_bind_methods() {
-
- ClassDB::bind_method("_menu_option", &MeshInstanceEditor::_menu_option);
- ClassDB::bind_method("_create_outline_mesh", &MeshInstanceEditor::_create_outline_mesh);
- ClassDB::bind_method("_debug_uv_draw", &MeshInstanceEditor::_debug_uv_draw);
-}
-
-MeshInstanceEditor::MeshInstanceEditor() {
-
- options = memnew(MenuButton);
- options->set_switch_on_hover(true);
- SpatialEditor::get_singleton()->add_control_to_menu_panel(options);
-
- options->set_text(TTR("Mesh"));
- options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("MeshInstance", "EditorIcons"));
-
- options->get_popup()->add_item(TTR("Create Trimesh Static Body"), MENU_OPTION_CREATE_STATIC_TRIMESH_BODY);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Create Trimesh Collision Sibling"), MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE);
- options->get_popup()->add_item(TTR("Create Convex Collision Sibling(s)"), MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Create Navigation Mesh"), MENU_OPTION_CREATE_NAVMESH);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Create Outline Mesh..."), MENU_OPTION_CREATE_OUTLINE_MESH);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("View UV1"), MENU_OPTION_DEBUG_UV1);
- options->get_popup()->add_item(TTR("View UV2"), MENU_OPTION_DEBUG_UV2);
- options->get_popup()->add_item(TTR("Unwrap UV2 for Lightmap/AO"), MENU_OPTION_CREATE_UV2);
-
- options->get_popup()->connect("id_pressed", this, "_menu_option");
-
- outline_dialog = memnew(ConfirmationDialog);
- outline_dialog->set_title(TTR("Create Outline Mesh"));
- outline_dialog->get_ok()->set_text(TTR("Create"));
-
- VBoxContainer *outline_dialog_vbc = memnew(VBoxContainer);
- outline_dialog->add_child(outline_dialog_vbc);
- //outline_dialog->set_child_rect(outline_dialog_vbc);
-
- outline_size = memnew(SpinBox);
- outline_size->set_min(0.001);
- outline_size->set_max(1024);
- outline_size->set_step(0.001);
- outline_size->set_value(0.05);
- outline_dialog_vbc->add_margin_child(TTR("Outline Size:"), outline_size);
-
- add_child(outline_dialog);
- outline_dialog->connect("confirmed", this, "_create_outline_mesh");
-
- err_dialog = memnew(AcceptDialog);
- add_child(err_dialog);
-
- debug_uv_dialog = memnew(AcceptDialog);
- debug_uv_dialog->set_title(TTR("UV Channel Debug"));
- add_child(debug_uv_dialog);
- debug_uv = memnew(Control);
- debug_uv->set_custom_minimum_size(Size2(600, 600) * EDSCALE);
- debug_uv->connect("draw", this, "_debug_uv_draw");
- debug_uv_dialog->add_child(debug_uv);
-}
-
-void MeshInstanceEditorPlugin::edit(Object *p_object) {
-
- mesh_editor->edit(Object::cast_to<MeshInstance>(p_object));
-}
-
-bool MeshInstanceEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("MeshInstance");
-}
-
-void MeshInstanceEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- mesh_editor->options->show();
- } else {
-
- mesh_editor->options->hide();
- mesh_editor->edit(NULL);
- }
-}
-
-MeshInstanceEditorPlugin::MeshInstanceEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- mesh_editor = memnew(MeshInstanceEditor);
- editor->get_viewport()->add_child(mesh_editor);
-
- mesh_editor->options->hide();
-}
-
-MeshInstanceEditorPlugin::~MeshInstanceEditorPlugin() {
-}
diff --git a/editor/plugins/mesh_instance_editor_plugin.h b/editor/plugins/mesh_instance_editor_plugin.h
deleted file mode 100644
index 5c95676fc4..0000000000
--- a/editor/plugins/mesh_instance_editor_plugin.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*************************************************************************/
-/* mesh_instance_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef MESH_INSTANCE_EDITOR_PLUGIN_H
-#define MESH_INSTANCE_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/gui/spin_box.h"
-
-class MeshInstanceEditor : public Control {
-
- GDCLASS(MeshInstanceEditor, Control);
-
- enum Menu {
-
- MENU_OPTION_CREATE_STATIC_TRIMESH_BODY,
- MENU_OPTION_CREATE_STATIC_CONVEX_BODY,
- MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE,
- MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE,
- MENU_OPTION_CREATE_NAVMESH,
- MENU_OPTION_CREATE_OUTLINE_MESH,
- MENU_OPTION_CREATE_UV2,
- MENU_OPTION_DEBUG_UV1,
- MENU_OPTION_DEBUG_UV2,
- };
-
- MeshInstance *node;
-
- MenuButton *options;
-
- ConfirmationDialog *outline_dialog;
- SpinBox *outline_size;
-
- AcceptDialog *err_dialog;
-
- AcceptDialog *debug_uv_dialog;
- Control *debug_uv;
- Vector<Vector2> uv_lines;
-
- void _menu_option(int p_option);
- void _create_outline_mesh();
-
- void _create_uv_lines(int p_layer);
- friend class MeshInstanceEditorPlugin;
-
- void _debug_uv_draw();
-
-protected:
- void _node_removed(Node *p_node);
- static void _bind_methods();
-
-public:
- void edit(MeshInstance *p_mesh);
- MeshInstanceEditor();
-};
-
-class MeshInstanceEditorPlugin : public EditorPlugin {
-
- GDCLASS(MeshInstanceEditorPlugin, EditorPlugin);
-
- MeshInstanceEditor *mesh_editor;
- EditorNode *editor;
-
-public:
- virtual String get_name() const { return "MeshInstance"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- MeshInstanceEditorPlugin(EditorNode *p_node);
- ~MeshInstanceEditorPlugin();
-};
-
-#endif // MESH_EDITOR_PLUGIN_H
diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp
index 92898ff9c3..374a8c8290 100644
--- a/editor/plugins/mesh_library_editor_plugin.cpp
+++ b/editor/plugins/mesh_library_editor_plugin.cpp
@@ -33,26 +33,23 @@
#include "editor/editor_node.h"
#include "editor/editor_settings.h"
#include "main/main.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/3d/navigation_mesh.h"
-#include "scene/3d/physics_body.h"
-#include "scene/main/viewport.h"
+#include "node_3d_editor_plugin.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/physics_body_3d.h"
+#include "scene/main/window.h"
#include "scene/resources/packed_scene.h"
-#include "spatial_editor_plugin.h"
void MeshLibraryEditor::edit(const Ref<MeshLibrary> &p_mesh_library) {
-
mesh_library = p_mesh_library;
- if (mesh_library.is_valid())
+ if (mesh_library.is_valid()) {
menu->get_popup()->set_item_disabled(menu->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE), !mesh_library->has_meta("_editor_source_scene"));
+ }
}
void MeshLibraryEditor::_menu_confirm() {
-
switch (option) {
-
case MENU_OPTION_REMOVE_ITEM: {
-
mesh_library->remove_item(to_erase);
} break;
case MENU_OPTION_UPDATE_FROM_SCENE: {
@@ -67,31 +64,32 @@ void MeshLibraryEditor::_menu_confirm() {
}
void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge) {
-
- if (!p_merge)
+ if (!p_merge) {
p_library->clear();
+ }
- Map<int, MeshInstance *> mesh_instances;
+ Map<int, MeshInstance3D *> mesh_instances;
for (int i = 0; i < p_scene->get_child_count(); i++) {
-
Node *child = p_scene->get_child(i);
- if (!Object::cast_to<MeshInstance>(child)) {
+ if (!Object::cast_to<MeshInstance3D>(child)) {
if (child->get_child_count() > 0) {
child = child->get_child(0);
- if (!Object::cast_to<MeshInstance>(child)) {
+ if (!Object::cast_to<MeshInstance3D>(child)) {
continue;
}
- } else
+ } else {
continue;
+ }
}
- MeshInstance *mi = Object::cast_to<MeshInstance>(child);
+ MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(child);
Ref<Mesh> mesh = mi->get_mesh();
- if (mesh.is_null())
+ if (mesh.is_null()) {
continue;
+ }
mesh = mesh->duplicate();
for (int j = 0; j < mesh->get_surface_count(); ++j) {
@@ -104,7 +102,6 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
int id = p_library->find_item_by_name(mi->get_name());
if (id < 0) {
-
id = p_library->get_last_unused_item_id();
p_library->create_item(id);
p_library->set_item_name(id, mi->get_name());
@@ -116,28 +113,29 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
Vector<MeshLibrary::ShapeData> collisions;
for (int j = 0; j < mi->get_child_count(); j++) {
-
Node *child2 = mi->get_child(j);
- if (!Object::cast_to<StaticBody>(child2))
+ if (!Object::cast_to<StaticBody3D>(child2)) {
continue;
+ }
- StaticBody *sb = Object::cast_to<StaticBody>(child2);
+ StaticBody3D *sb = Object::cast_to<StaticBody3D>(child2);
List<uint32_t> shapes;
sb->get_shape_owners(&shapes);
for (List<uint32_t>::Element *E = shapes.front(); E; E = E->next()) {
- if (sb->is_shape_owner_disabled(E->get()))
+ if (sb->is_shape_owner_disabled(E->get())) {
continue;
+ }
//Transform shape_transform = sb->shape_owner_get_transform(E->get());
//shape_transform.set_origin(shape_transform.get_origin() - phys_offset);
for (int k = 0; k < sb->shape_owner_get_shape_count(E->get()); k++) {
-
- Ref<Shape> collision = sb->shape_owner_get_shape(E->get(), k);
- if (!collision.is_valid())
+ Ref<Shape3D> collision = sb->shape_owner_get_shape(E->get(), k);
+ if (!collision.is_valid()) {
continue;
+ }
MeshLibrary::ShapeData shape_data;
shape_data.shape = collision;
shape_data.local_transform = sb->get_transform() * sb->shape_owner_get_transform(E->get());
@@ -152,13 +150,15 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
Transform navmesh_transform;
for (int j = 0; j < mi->get_child_count(); j++) {
Node *child2 = mi->get_child(j);
- if (!Object::cast_to<NavigationMeshInstance>(child2))
+ if (!Object::cast_to<NavigationRegion3D>(child2)) {
continue;
- NavigationMeshInstance *sb = Object::cast_to<NavigationMeshInstance>(child2);
+ }
+ NavigationRegion3D *sb = Object::cast_to<NavigationRegion3D>(child2);
navmesh = sb->get_navigation_mesh();
navmesh_transform = sb->get_transform();
- if (!navmesh.is_null())
+ if (!navmesh.is_null()) {
break;
+ }
}
if (!navmesh.is_null()) {
p_library->set_item_navmesh(id, navmesh);
@@ -168,26 +168,21 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
//generate previews!
- if (1) {
-
- Vector<Ref<Mesh> > meshes;
+ if (true) {
+ Vector<Ref<Mesh>> meshes;
Vector<Transform> transforms;
Vector<int> ids = p_library->get_item_list();
for (int i = 0; i < ids.size(); i++) {
-
if (mesh_instances.find(ids[i])) {
-
meshes.push_back(p_library->get_item_mesh(ids[i]));
transforms.push_back(mesh_instances[ids[i]]->get_transform());
}
}
- Vector<Ref<Texture> > textures = EditorInterface::get_singleton()->make_mesh_previews(meshes, &transforms, EditorSettings::get_singleton()->get("editors/grid_map/preview_size"));
+ Vector<Ref<Texture2D>> textures = EditorInterface::get_singleton()->make_mesh_previews(meshes, &transforms, EditorSettings::get_singleton()->get("editors/grid_map/preview_size"));
int j = 0;
for (int i = 0; i < ids.size(); i++) {
-
if (mesh_instances.find(ids[i])) {
-
p_library->set_item_preview(ids[i], textures[j]);
j++;
}
@@ -196,7 +191,6 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
}
void MeshLibraryEditor::_import_scene_cbk(const String &p_str) {
-
Ref<PackedScene> ps = ResourceLoader::load(p_str, "PackedScene");
ERR_FAIL_COND(ps.is_null());
Node *scene = ps->instance();
@@ -211,36 +205,28 @@ void MeshLibraryEditor::_import_scene_cbk(const String &p_str) {
}
Error MeshLibraryEditor::update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml, bool p_merge) {
-
_import_scene(p_base_scene, ml, p_merge);
return OK;
}
void MeshLibraryEditor::_menu_cbk(int p_option) {
-
option = p_option;
switch (p_option) {
-
case MENU_OPTION_ADD_ITEM: {
-
mesh_library->create_item(mesh_library->get_last_unused_item_id());
} break;
case MENU_OPTION_REMOVE_ITEM: {
-
String p = editor->get_inspector()->get_selected_path();
if (p.begins_with("/MeshLibrary/item") && p.get_slice_count("/") >= 3) {
-
to_erase = p.get_slice("/", 3).to_int();
cd->set_text(vformat(TTR("Remove item %d?"), to_erase));
cd->popup_centered(Size2(300, 60));
}
} break;
case MENU_OPTION_IMPORT_FROM_SCENE: {
-
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} break;
case MENU_OPTION_UPDATE_FROM_SCENE: {
-
cd->set_text(vformat(TTR("Update from existing scene?:\n%s"), String(mesh_library->get_meta("_editor_source_scene"))));
cd->popup_centered(Size2(500, 60));
} break;
@@ -248,64 +234,56 @@ void MeshLibraryEditor::_menu_cbk(int p_option) {
}
void MeshLibraryEditor::_bind_methods() {
-
- ClassDB::bind_method("_menu_cbk", &MeshLibraryEditor::_menu_cbk);
- ClassDB::bind_method("_menu_confirm", &MeshLibraryEditor::_menu_confirm);
- ClassDB::bind_method("_import_scene_cbk", &MeshLibraryEditor::_import_scene_cbk);
}
MeshLibraryEditor::MeshLibraryEditor(EditorNode *p_editor) {
-
file = memnew(EditorFileDialog);
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
//not for now?
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions);
file->clear_filters();
file->set_title(TTR("Import Scene"));
for (int i = 0; i < extensions.size(); i++) {
-
file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
add_child(file);
- file->connect("file_selected", this, "_import_scene_cbk");
+ file->connect("file_selected", callable_mp(this, &MeshLibraryEditor::_import_scene_cbk));
menu = memnew(MenuButton);
- SpatialEditor::get_singleton()->add_control_to_menu_panel(menu);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(menu);
menu->set_position(Point2(1, 1));
menu->set_text(TTR("Mesh Library"));
- menu->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("MeshLibrary", "EditorIcons"));
+ menu->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("MeshLibrary", "EditorIcons"));
menu->get_popup()->add_item(TTR("Add Item"), MENU_OPTION_ADD_ITEM);
menu->get_popup()->add_item(TTR("Remove Selected Item"), MENU_OPTION_REMOVE_ITEM);
menu->get_popup()->add_separator();
menu->get_popup()->add_item(TTR("Import from Scene"), MENU_OPTION_IMPORT_FROM_SCENE);
menu->get_popup()->add_item(TTR("Update from Scene"), MENU_OPTION_UPDATE_FROM_SCENE);
menu->get_popup()->set_item_disabled(menu->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE), true);
- menu->get_popup()->connect("id_pressed", this, "_menu_cbk");
+ menu->get_popup()->connect("id_pressed", callable_mp(this, &MeshLibraryEditor::_menu_cbk));
menu->hide();
editor = p_editor;
cd = memnew(ConfirmationDialog);
add_child(cd);
- cd->get_ok()->connect("pressed", this, "_menu_confirm");
+ cd->get_ok()->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_confirm));
}
void MeshLibraryEditorPlugin::edit(Object *p_node) {
-
if (Object::cast_to<MeshLibrary>(p_node)) {
mesh_library_editor->edit(Object::cast_to<MeshLibrary>(p_node));
mesh_library_editor->show();
- } else
+ } else {
mesh_library_editor->hide();
+ }
}
bool MeshLibraryEditorPlugin::handles(Object *p_node) const {
-
return p_node->is_class("MeshLibrary");
}
void MeshLibraryEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
mesh_library_editor->show();
mesh_library_editor->get_menu_button()->show();
@@ -316,7 +294,6 @@ void MeshLibraryEditorPlugin::make_visible(bool p_visible) {
}
MeshLibraryEditorPlugin::MeshLibraryEditorPlugin(EditorNode *p_node) {
-
EDITOR_DEF("editors/grid_map/preview_size", 64);
mesh_library_editor = memnew(MeshLibraryEditor(p_node));
diff --git a/editor/plugins/mesh_library_editor_plugin.h b/editor/plugins/mesh_library_editor_plugin.h
index 74b0a280e3..ea13303740 100644
--- a/editor/plugins/mesh_library_editor_plugin.h
+++ b/editor/plugins/mesh_library_editor_plugin.h
@@ -35,7 +35,6 @@
#include "scene/resources/mesh_library.h"
class MeshLibraryEditor : public Control {
-
GDCLASS(MeshLibraryEditor, Control);
Ref<MeshLibrary> mesh_library;
@@ -74,18 +73,17 @@ public:
};
class MeshLibraryEditorPlugin : public EditorPlugin {
-
GDCLASS(MeshLibraryEditorPlugin, EditorPlugin);
MeshLibraryEditor *mesh_library_editor;
EditorNode *editor;
public:
- virtual String get_name() const { return "MeshLibrary"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_node);
- virtual bool handles(Object *p_node) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "MeshLibrary"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_node) override;
+ virtual bool handles(Object *p_node) const override;
+ virtual void make_visible(bool p_visible) override;
MeshLibraryEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp
index 5dc222f84c..bd1384967f 100644
--- a/editor/plugins/multimesh_editor_plugin.cpp
+++ b/editor/plugins/multimesh_editor_plugin.cpp
@@ -30,113 +30,101 @@
#include "multimesh_editor_plugin.h"
-#include "scene/3d/mesh_instance.h"
+#include "node_3d_editor_plugin.h"
+#include "scene/3d/mesh_instance_3d.h"
#include "scene/gui/box_container.h"
-#include "spatial_editor_plugin.h"
void MultiMeshEditor::_node_removed(Node *p_node) {
-
if (p_node == node) {
- node = NULL;
+ node = nullptr;
hide();
}
}
void MultiMeshEditor::_populate() {
-
- if (!node)
+ if (!node) {
return;
+ }
Ref<Mesh> mesh;
if (mesh_source->get_text() == "") {
-
Ref<MultiMesh> multimesh;
multimesh = node->get_multimesh();
if (multimesh.is_null()) {
-
err_dialog->set_text(TTR("No mesh source specified (and no MultiMesh set in node)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
if (multimesh->get_mesh().is_null()) {
-
err_dialog->set_text(TTR("No mesh source specified (and MultiMesh contains no Mesh)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
mesh = multimesh->get_mesh();
} else {
-
Node *ms_node = node->get_node(mesh_source->get_text());
if (!ms_node) {
-
err_dialog->set_text(TTR("Mesh source is invalid (invalid path)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
- MeshInstance *ms_instance = Object::cast_to<MeshInstance>(ms_node);
+ MeshInstance3D *ms_instance = Object::cast_to<MeshInstance3D>(ms_node);
if (!ms_instance) {
-
- err_dialog->set_text(TTR("Mesh source is invalid (not a MeshInstance)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->set_text(TTR("Mesh source is invalid (not a MeshInstance3D)."));
+ err_dialog->popup_centered();
return;
}
mesh = ms_instance->get_mesh();
if (mesh.is_null()) {
-
err_dialog->set_text(TTR("Mesh source is invalid (contains no Mesh resource)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
}
if (surface_source->get_text() == "") {
-
err_dialog->set_text(TTR("No surface source specified."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
Node *ss_node = node->get_node(surface_source->get_text());
if (!ss_node) {
-
err_dialog->set_text(TTR("Surface source is invalid (invalid path)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
- GeometryInstance *ss_instance = Object::cast_to<MeshInstance>(ss_node);
+ GeometryInstance3D *ss_instance = Object::cast_to<MeshInstance3D>(ss_node);
if (!ss_instance) {
-
err_dialog->set_text(TTR("Surface source is invalid (no geometry)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
Transform geom_xform = node->get_global_transform().affine_inverse() * ss_instance->get_global_transform();
- PoolVector<Face3> geometry = ss_instance->get_faces(VisualInstance::FACES_SOLID);
+ Vector<Face3> geometry = ss_instance->get_faces(VisualInstance3D::FACES_SOLID);
if (geometry.size() == 0) {
-
err_dialog->set_text(TTR("Surface source is invalid (no faces)."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
//make all faces local
int gc = geometry.size();
- PoolVector<Face3>::Write w = geometry.write();
+ Face3 *w = geometry.ptrw();
for (int i = 0; i < gc; i++) {
for (int j = 0; j < 3; j++) {
@@ -144,21 +132,19 @@ void MultiMeshEditor::_populate() {
}
}
- w.release();
-
- PoolVector<Face3> faces = geometry;
+ Vector<Face3> faces = geometry;
int facecount = faces.size();
ERR_FAIL_COND_MSG(!facecount, "Parent has no solid faces to populate.");
- PoolVector<Face3>::Read r = faces.read();
+ const Face3 *r = faces.ptr();
float area_accum = 0;
Map<float, int> triangle_area_map;
for (int i = 0; i < facecount; i++) {
-
float area = r[i].get_area();
- if (area < CMP_EPSILON)
+ if (area < CMP_EPSILON) {
continue;
+ }
triangle_area_map[area_accum] = i;
area_accum += area;
}
@@ -172,7 +158,7 @@ void MultiMeshEditor::_populate() {
int instance_count = populate_amount->get_value();
multimesh->set_transform_format(MultiMesh::TRANSFORM_3D);
- multimesh->set_color_format(MultiMesh::COLOR_NONE);
+ multimesh->set_use_colors(false);
multimesh->set_instance_count(instance_count);
float _tilt_random = populate_tilt_random->get_value();
@@ -190,7 +176,6 @@ void MultiMeshEditor::_populate() {
}
for (int i = 0; i < instance_count; i++) {
-
float areapos = Math::random(0.0f, area_accum);
Map<float, int>::Element *E = triangle_area_map.find_closest(areapos);
@@ -229,23 +214,19 @@ void MultiMeshEditor::_populate() {
}
void MultiMeshEditor::_browsed(const NodePath &p_path) {
-
NodePath path = node->get_path_to(get_node(p_path));
- if (browsing_source)
+ if (browsing_source) {
mesh_source->set_text(path);
- else
+ } else {
surface_source->set_text(path);
+ }
}
void MultiMeshEditor::_menu_option(int p_option) {
-
switch (p_option) {
-
case MENU_OPTION_POPULATE: {
-
if (_last_pp_node != node) {
-
surface_source->set_text("..");
mesh_source->set_text("..");
populate_axis->select(1);
@@ -263,41 +244,34 @@ void MultiMeshEditor::_menu_option(int p_option) {
}
}
-void MultiMeshEditor::edit(MultiMeshInstance *p_multimesh) {
-
+void MultiMeshEditor::edit(MultiMeshInstance3D *p_multimesh) {
node = p_multimesh;
}
void MultiMeshEditor::_browse(bool p_source) {
-
browsing_source = p_source;
std->get_scene_tree()->set_marked(node, false);
- std->popup_centered_ratio();
- if (p_source)
+ std->popup_scenetree_dialog();
+ if (p_source) {
std->set_title(TTR("Select a Source Mesh:"));
- else
+ } else {
std->set_title(TTR("Select a Target Surface:"));
+ }
}
void MultiMeshEditor::_bind_methods() {
-
- ClassDB::bind_method("_menu_option", &MultiMeshEditor::_menu_option);
- ClassDB::bind_method("_populate", &MultiMeshEditor::_populate);
- ClassDB::bind_method("_browsed", &MultiMeshEditor::_browsed);
- ClassDB::bind_method("_browse", &MultiMeshEditor::_browse);
}
MultiMeshEditor::MultiMeshEditor() {
-
options = memnew(MenuButton);
options->set_switch_on_hover(true);
- SpatialEditor::get_singleton()->add_control_to_menu_panel(options);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(options);
options->set_text("MultiMesh");
- options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("MultiMeshInstance", "EditorIcons"));
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("MultiMeshInstance3D", "EditorIcons"));
options->get_popup()->add_item(TTR("Populate Surface"));
- options->get_popup()->connect("id_pressed", this, "_menu_option");
+ options->get_popup()->connect("id_pressed", callable_mp(this, &MultiMeshEditor::_menu_option));
populate_dialog = memnew(ConfirmationDialog);
populate_dialog->set_title(TTR("Populate MultiMesh"));
@@ -315,7 +289,7 @@ MultiMeshEditor::MultiMeshEditor() {
Button *b = memnew(Button);
hbc->add_child(b);
b->set_text("..");
- b->connect("pressed", this, "_browse", make_binds(false));
+ b->connect("pressed", callable_mp(this, &MultiMeshEditor::_browse), make_binds(false));
vbc->add_margin_child(TTR("Target Surface:"), hbc);
@@ -327,7 +301,7 @@ MultiMeshEditor::MultiMeshEditor() {
hbc->add_child(b);
b->set_text("..");
vbc->add_margin_child(TTR("Source Mesh:"), hbc);
- b->connect("pressed", this, "_browse", make_binds(true));
+ b->connect("pressed", callable_mp(this, &MultiMeshEditor::_browse), make_binds(true));
populate_axis = memnew(OptionButton);
populate_axis->add_item(TTR("X-Axis"));
@@ -373,40 +347,35 @@ MultiMeshEditor::MultiMeshEditor() {
populate_dialog->get_ok()->set_text(TTR("Populate"));
- populate_dialog->get_ok()->connect("pressed", this, "_populate");
+ populate_dialog->get_ok()->connect("pressed", callable_mp(this, &MultiMeshEditor::_populate));
std = memnew(SceneTreeDialog);
populate_dialog->add_child(std);
- std->connect("selected", this, "_browsed");
+ std->connect("selected", callable_mp(this, &MultiMeshEditor::_browsed));
- _last_pp_node = NULL;
+ _last_pp_node = nullptr;
err_dialog = memnew(AcceptDialog);
add_child(err_dialog);
}
void MultiMeshEditorPlugin::edit(Object *p_object) {
-
- multimesh_editor->edit(Object::cast_to<MultiMeshInstance>(p_object));
+ multimesh_editor->edit(Object::cast_to<MultiMeshInstance3D>(p_object));
}
bool MultiMeshEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("MultiMeshInstance");
+ return p_object->is_class("MultiMeshInstance3D");
}
void MultiMeshEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
multimesh_editor->options->show();
} else {
-
multimesh_editor->options->hide();
- multimesh_editor->edit(NULL);
+ multimesh_editor->edit(nullptr);
}
}
MultiMeshEditorPlugin::MultiMeshEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
multimesh_editor = memnew(MultiMeshEditor);
editor->get_viewport()->add_child(multimesh_editor);
diff --git a/editor/plugins/multimesh_editor_plugin.h b/editor/plugins/multimesh_editor_plugin.h
index 2c7b98cfbc..d1f8a3b74a 100644
--- a/editor/plugins/multimesh_editor_plugin.h
+++ b/editor/plugins/multimesh_editor_plugin.h
@@ -33,22 +33,21 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-#include "scene/3d/multimesh_instance.h"
+#include "scene/3d/multimesh_instance_3d.h"
#include "scene/gui/spin_box.h"
class MultiMeshEditor : public Control {
-
GDCLASS(MultiMeshEditor, Control);
friend class MultiMeshEditorPlugin;
AcceptDialog *err_dialog;
MenuButton *options;
- MultiMeshInstance *_last_pp_node;
+ MultiMeshInstance3D *_last_pp_node;
bool browsing_source;
Panel *panel;
- MultiMeshInstance *node;
+ MultiMeshInstance3D *node;
LineEdit *surface_source;
LineEdit *mesh_source;
@@ -78,23 +77,22 @@ protected:
static void _bind_methods();
public:
- void edit(MultiMeshInstance *p_multimesh);
+ void edit(MultiMeshInstance3D *p_multimesh);
MultiMeshEditor();
};
class MultiMeshEditorPlugin : public EditorPlugin {
-
GDCLASS(MultiMeshEditorPlugin, EditorPlugin);
MultiMeshEditor *multimesh_editor;
EditorNode *editor;
public:
- virtual String get_name() const { return "MultiMesh"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "MultiMesh"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
MultiMeshEditorPlugin(EditorNode *p_node);
~MultiMeshEditorPlugin();
diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp
index c4e61f2488..8cf9f01fa0 100644
--- a/editor/plugins/navigation_polygon_editor_plugin.cpp
+++ b/editor/plugins/navigation_polygon_editor_plugin.cpp
@@ -31,10 +31,8 @@
#include "navigation_polygon_editor_plugin.h"
Ref<NavigationPolygon> NavigationPolygonEditor::_ensure_navpoly() const {
-
Ref<NavigationPolygon> navpoly = node->get_navigation_polygon();
if (!navpoly.is_valid()) {
-
navpoly = Ref<NavigationPolygon>(memnew(NavigationPolygon));
node->set_navigation_polygon(navpoly);
}
@@ -42,42 +40,38 @@ Ref<NavigationPolygon> NavigationPolygonEditor::_ensure_navpoly() const {
}
Node2D *NavigationPolygonEditor::_get_node() const {
-
return node;
}
void NavigationPolygonEditor::_set_node(Node *p_polygon) {
-
- node = Object::cast_to<NavigationPolygonInstance>(p_polygon);
+ node = Object::cast_to<NavigationRegion2D>(p_polygon);
}
int NavigationPolygonEditor::_get_polygon_count() const {
-
Ref<NavigationPolygon> navpoly = node->get_navigation_polygon();
- if (navpoly.is_valid())
+ if (navpoly.is_valid()) {
return navpoly->get_outline_count();
- else
+ } else {
return 0;
+ }
}
Variant NavigationPolygonEditor::_get_polygon(int p_idx) const {
-
Ref<NavigationPolygon> navpoly = node->get_navigation_polygon();
- if (navpoly.is_valid())
+ if (navpoly.is_valid()) {
return navpoly->get_outline(p_idx);
- else
+ } else {
return Variant(Vector<Vector2>());
+ }
}
void NavigationPolygonEditor::_set_polygon(int p_idx, const Variant &p_polygon) const {
-
Ref<NavigationPolygon> navpoly = _ensure_navpoly();
navpoly->set_outline(p_idx, p_polygon);
navpoly->make_polygons_from_outlines();
}
void NavigationPolygonEditor::_action_add_polygon(const Variant &p_polygon) {
-
Ref<NavigationPolygon> navpoly = _ensure_navpoly();
undo_redo->add_do_method(navpoly.ptr(), "add_outline", p_polygon);
undo_redo->add_undo_method(navpoly.ptr(), "remove_outline", navpoly->get_outline_count());
@@ -86,7 +80,6 @@ void NavigationPolygonEditor::_action_add_polygon(const Variant &p_polygon) {
}
void NavigationPolygonEditor::_action_remove_polygon(int p_idx) {
-
Ref<NavigationPolygon> navpoly = _ensure_navpoly();
undo_redo->add_do_method(navpoly.ptr(), "remove_outline", p_idx);
undo_redo->add_undo_method(navpoly.ptr(), "add_outline_at_index", navpoly->get_outline(p_idx), p_idx);
@@ -95,7 +88,6 @@ void NavigationPolygonEditor::_action_remove_polygon(int p_idx) {
}
void NavigationPolygonEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) {
-
Ref<NavigationPolygon> navpoly = _ensure_navpoly();
undo_redo->add_do_method(navpoly.ptr(), "set_outline", p_idx, p_polygon);
undo_redo->add_undo_method(navpoly.ptr(), "set_outline", p_idx, p_previous);
@@ -104,14 +96,13 @@ void NavigationPolygonEditor::_action_set_polygon(int p_idx, const Variant &p_pr
}
bool NavigationPolygonEditor::_has_resource() const {
-
return node && node->get_navigation_polygon().is_valid();
}
void NavigationPolygonEditor::_create_resource() {
-
- if (!node)
+ if (!node) {
return;
+ }
undo_redo->create_action(TTR("Create Navigation Polygon"));
undo_redo->add_do_method(node, "set_navigation_polygon", Ref<NavigationPolygon>(memnew(NavigationPolygon)));
@@ -123,9 +114,9 @@ void NavigationPolygonEditor::_create_resource() {
NavigationPolygonEditor::NavigationPolygonEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
- node = NULL;
+ node = nullptr;
}
NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin(EditorNode *p_node) :
- AbstractPolygon2DEditorPlugin(p_node, memnew(NavigationPolygonEditor(p_node)), "NavigationPolygonInstance") {
+ AbstractPolygon2DEditorPlugin(p_node, memnew(NavigationPolygonEditor(p_node)), "NavigationRegion2D") {
}
diff --git a/editor/plugins/navigation_polygon_editor_plugin.h b/editor/plugins/navigation_polygon_editor_plugin.h
index 1cab336381..3c5a7c2829 100644
--- a/editor/plugins/navigation_polygon_editor_plugin.h
+++ b/editor/plugins/navigation_polygon_editor_plugin.h
@@ -32,37 +32,35 @@
#define NAVIGATIONPOLYGONEDITORPLUGIN_H
#include "editor/plugins/abstract_polygon_2d_editor.h"
-#include "scene/2d/navigation_polygon.h"
+#include "scene/2d/navigation_region_2d.h"
class NavigationPolygonEditor : public AbstractPolygon2DEditor {
-
GDCLASS(NavigationPolygonEditor, AbstractPolygon2DEditor);
- NavigationPolygonInstance *node;
+ NavigationRegion2D *node;
Ref<NavigationPolygon> _ensure_navpoly() const;
protected:
- virtual Node2D *_get_node() const;
- virtual void _set_node(Node *p_polygon);
+ virtual Node2D *_get_node() const override;
+ virtual void _set_node(Node *p_polygon) override;
- virtual int _get_polygon_count() const;
- virtual Variant _get_polygon(int p_idx) const;
- virtual void _set_polygon(int p_idx, const Variant &p_polygon) const;
+ virtual int _get_polygon_count() const override;
+ virtual Variant _get_polygon(int p_idx) const override;
+ virtual void _set_polygon(int p_idx, const Variant &p_polygon) const override;
- virtual void _action_add_polygon(const Variant &p_polygon);
- virtual void _action_remove_polygon(int p_idx);
- virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon);
+ virtual void _action_add_polygon(const Variant &p_polygon) override;
+ virtual void _action_remove_polygon(int p_idx) override;
+ virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) override;
- virtual bool _has_resource() const;
- virtual void _create_resource();
+ virtual bool _has_resource() const override;
+ virtual void _create_resource() override;
public:
NavigationPolygonEditor(EditorNode *p_editor);
};
class NavigationPolygonEditorPlugin : public AbstractPolygon2DEditorPlugin {
-
GDCLASS(NavigationPolygonEditorPlugin, AbstractPolygon2DEditorPlugin);
public:
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..d28bbadf39
--- /dev/null
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -0,0 +1,6831 @@
+/*************************************************************************/
+/* node_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "node_3d_editor_plugin.h"
+
+#include "core/input/input.h"
+#include "core/math/camera_matrix.h"
+#include "core/os/keyboard.h"
+#include "core/print_string.h"
+#include "core/project_settings.h"
+#include "core/sort_array.h"
+#include "editor/debugger/editor_debugger_node.h"
+#include "editor/editor_node.h"
+#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
+#include "editor/node_3d_editor_gizmos.h"
+#include "editor/plugins/animation_player_editor_plugin.h"
+#include "editor/plugins/script_editor_plugin.h"
+#include "scene/3d/camera_3d.h"
+#include "scene/3d/collision_shape_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/3d/physics_body_3d.h"
+#include "scene/3d/visual_instance_3d.h"
+#include "scene/gui/subviewport_container.h"
+#include "scene/resources/packed_scene.h"
+#include "scene/resources/surface_tool.h"
+
+#define DISTANCE_DEFAULT 4
+
+#define GIZMO_ARROW_SIZE 0.35
+#define GIZMO_RING_HALF_WIDTH 0.1
+#define GIZMO_SCALE_DEFAULT 0.15
+#define GIZMO_PLANE_SIZE 0.2
+#define GIZMO_PLANE_DST 0.3
+#define GIZMO_CIRCLE_SIZE 1.1
+#define GIZMO_SCALE_OFFSET (GIZMO_CIRCLE_SIZE + 0.3)
+#define GIZMO_ARROW_OFFSET (GIZMO_CIRCLE_SIZE + 0.3)
+
+#define ZOOM_MIN_DISTANCE 0.001
+#define ZOOM_MULTIPLIER 1.08
+#define ZOOM_INDICATOR_DELAY_S 1.5
+
+#define FREELOOK_MIN_SPEED 0.01
+#define FREELOOK_SPEED_MULTIPLIER 1.08
+
+#define MIN_Z 0.01
+#define MAX_Z 1000000.0
+
+#define MIN_FOV 0.01
+#define MAX_FOV 179
+
+void ViewportRotationControl::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ axis_menu_options.clear();
+ axis_menu_options.push_back(Node3DEditorViewport::VIEW_RIGHT);
+ axis_menu_options.push_back(Node3DEditorViewport::VIEW_TOP);
+ axis_menu_options.push_back(Node3DEditorViewport::VIEW_FRONT);
+ axis_menu_options.push_back(Node3DEditorViewport::VIEW_LEFT);
+ axis_menu_options.push_back(Node3DEditorViewport::VIEW_BOTTOM);
+ axis_menu_options.push_back(Node3DEditorViewport::VIEW_REAR);
+
+ axis_colors.clear();
+ axis_colors.push_back(get_theme_color("axis_x_color", "Editor"));
+ axis_colors.push_back(get_theme_color("axis_y_color", "Editor"));
+ axis_colors.push_back(get_theme_color("axis_z_color", "Editor"));
+ update();
+
+ if (!is_connected("mouse_exited", callable_mp(this, &ViewportRotationControl::_on_mouse_exited))) {
+ connect("mouse_exited", callable_mp(this, &ViewportRotationControl::_on_mouse_exited));
+ }
+ }
+
+ if (p_what == NOTIFICATION_DRAW && viewport != nullptr) {
+ _draw();
+ }
+}
+
+void ViewportRotationControl::_draw() {
+ Vector2i center = get_size() / 2.0;
+ float radius = get_size().x / 2.0;
+
+ if (focused_axis > -2 || orbiting) {
+ draw_circle(center, radius, Color(0.5, 0.5, 0.5, 0.25));
+ }
+
+ Vector<Axis2D> axis_to_draw;
+ _get_sorted_axis(axis_to_draw);
+ for (int i = 0; i < axis_to_draw.size(); ++i) {
+ _draw_axis(axis_to_draw[i]);
+ }
+}
+
+void ViewportRotationControl::_draw_axis(const Axis2D &p_axis) {
+ bool focused = focused_axis == p_axis.axis;
+ bool positive = p_axis.axis < 3;
+ bool front = (Math::abs(p_axis.z_axis) <= 0.001 && positive) || p_axis.z_axis > 0.001;
+ int direction = p_axis.axis % 3;
+
+ Color axis_color = axis_colors[direction];
+
+ if (!front) {
+ axis_color = axis_color.darkened(0.4);
+ }
+ Color c = focused ? Color(0.9, 0.9, 0.9) : axis_color;
+
+ if (positive) {
+ Vector2i center = get_size() / 2.0;
+ draw_line(center, p_axis.screen_point, c, 1.5 * EDSCALE);
+ }
+
+ if (front) {
+ String axis_name = direction == 0 ? "X" : (direction == 1 ? "Y" : "Z");
+ draw_circle(p_axis.screen_point, AXIS_CIRCLE_RADIUS, c);
+ draw_char(get_theme_font("rotation_control", "EditorFonts"), p_axis.screen_point + Vector2i(-4, 5) * EDSCALE, axis_name, "", Color(0.3, 0.3, 0.3));
+ } else {
+ draw_circle(p_axis.screen_point, AXIS_CIRCLE_RADIUS * (0.55 + (0.2 * (1.0 + p_axis.z_axis))), c);
+ }
+}
+
+void ViewportRotationControl::_get_sorted_axis(Vector<Axis2D> &r_axis) {
+ Vector2i center = get_size() / 2.0;
+ float radius = get_size().x / 2.0;
+
+ float axis_radius = radius - AXIS_CIRCLE_RADIUS - 2.0 * EDSCALE;
+ Basis camera_basis = viewport->to_camera_transform(viewport->cursor).get_basis().inverse();
+
+ for (int i = 0; i < 3; ++i) {
+ Vector3 axis_3d = camera_basis.get_axis(i);
+ Vector2i axis_vector = Vector2(axis_3d.x, -axis_3d.y) * axis_radius;
+
+ if (Math::abs(axis_3d.z) < 1.0) {
+ Axis2D pos_axis;
+ pos_axis.axis = i;
+ pos_axis.screen_point = center + axis_vector;
+ pos_axis.z_axis = axis_3d.z;
+ r_axis.push_back(pos_axis);
+
+ Axis2D neg_axis;
+ neg_axis.axis = i + 3;
+ neg_axis.screen_point = center - axis_vector;
+ neg_axis.z_axis = -axis_3d.z;
+ r_axis.push_back(neg_axis);
+ } else {
+ // Special case when the camera is aligned with one axis
+ Axis2D axis;
+ axis.axis = i + (axis_3d.z < 0 ? 0 : 3);
+ axis.screen_point = center;
+ axis.z_axis = 1.0;
+ r_axis.push_back(axis);
+ }
+ }
+
+ r_axis.sort_custom<Axis2DCompare>();
+}
+
+void ViewportRotationControl::_gui_input(Ref<InputEvent> p_event) {
+ const Ref<InputEventMouseButton> mb = p_event;
+ if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) {
+ Vector2 pos = mb->get_position();
+ if (mb->is_pressed()) {
+ if (pos.distance_to(get_size() / 2.0) < get_size().x / 2.0) {
+ orbiting = true;
+ }
+ } else {
+ if (focused_axis > -1) {
+ viewport->_menu_option(axis_menu_options[focused_axis]);
+ _update_focus();
+ }
+ orbiting = false;
+ if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_CAPTURED) {
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
+ Input::get_singleton()->warp_mouse_position(orbiting_mouse_start);
+ }
+ }
+ }
+
+ const Ref<InputEventMouseMotion> mm = p_event;
+ if (mm.is_valid()) {
+ if (orbiting) {
+ if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_VISIBLE) {
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
+ orbiting_mouse_start = mm->get_global_position();
+ }
+ viewport->_nav_orbit(mm, viewport->_get_warped_mouse_motion(mm));
+ focused_axis = -1;
+ } else {
+ _update_focus();
+ }
+ }
+}
+
+void ViewportRotationControl::_update_focus() {
+ int original_focus = focused_axis;
+ focused_axis = -2;
+ Vector2 mouse_pos = get_local_mouse_position();
+
+ if (mouse_pos.distance_to(get_size() / 2.0) < get_size().x / 2.0) {
+ focused_axis = -1;
+ }
+
+ Vector<Axis2D> axes;
+ _get_sorted_axis(axes);
+
+ for (int i = 0; i < axes.size(); i++) {
+ const Axis2D &axis = axes[i];
+ if (mouse_pos.distance_to(axis.screen_point) < AXIS_CIRCLE_RADIUS) {
+ focused_axis = axis.axis;
+ }
+ }
+
+ if (focused_axis != original_focus) {
+ update();
+ }
+}
+
+void ViewportRotationControl::_on_mouse_exited() {
+ focused_axis = -2;
+ update();
+}
+
+void ViewportRotationControl::set_viewport(Node3DEditorViewport *p_viewport) {
+ viewport = p_viewport;
+}
+
+void ViewportRotationControl::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_gui_input"), &ViewportRotationControl::_gui_input);
+}
+
+void Node3DEditorViewport::_update_camera(float p_interp_delta) {
+ bool is_orthogonal = camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL;
+
+ Cursor old_camera_cursor = camera_cursor;
+ camera_cursor = cursor;
+
+ if (p_interp_delta > 0) {
+ //-------
+ // Perform smoothing
+
+ if (is_freelook_active()) {
+ // Higher inertia should increase "lag" (lerp with factor between 0 and 1)
+ // Inertia of zero should produce instant movement (lerp with factor of 1) in this case it returns a really high value and gets clamped to 1.
+ real_t inertia = EDITOR_GET("editors/3d/freelook/freelook_inertia");
+ inertia = MAX(0.001, inertia);
+ real_t factor = (1.0 / inertia) * p_interp_delta;
+
+ // We interpolate a different point here, because in freelook mode the focus point (cursor.pos) orbits around eye_pos
+ camera_cursor.eye_pos = old_camera_cursor.eye_pos.lerp(cursor.eye_pos, CLAMP(factor, 0, 1));
+
+ float orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
+ orbit_inertia = MAX(0.0001, orbit_inertia);
+ camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
+ camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
+
+ if (Math::abs(camera_cursor.x_rot - cursor.x_rot) < 0.1) {
+ camera_cursor.x_rot = cursor.x_rot;
+ }
+
+ if (Math::abs(camera_cursor.y_rot - cursor.y_rot) < 0.1) {
+ camera_cursor.y_rot = cursor.y_rot;
+ }
+
+ Vector3 forward = to_camera_transform(camera_cursor).basis.xform(Vector3(0, 0, -1));
+ camera_cursor.pos = camera_cursor.eye_pos + forward * camera_cursor.distance;
+
+ } else {
+ //when not being manipulated, move softly
+ float free_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
+ float free_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/translation_inertia");
+ //when being manipulated, move more quickly
+ float manip_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_orbit_inertia");
+ float manip_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_translation_inertia");
+
+ float zoom_inertia = EDITOR_GET("editors/3d/navigation_feel/zoom_inertia");
+
+ //determine if being manipulated
+ bool manipulated = Input::get_singleton()->get_mouse_button_mask() & (2 | 4);
+ manipulated |= Input::get_singleton()->is_key_pressed(KEY_SHIFT);
+ manipulated |= Input::get_singleton()->is_key_pressed(KEY_ALT);
+ manipulated |= Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+
+ float orbit_inertia = MAX(0.00001, manipulated ? manip_orbit_inertia : free_orbit_inertia);
+ float translation_inertia = MAX(0.0001, manipulated ? manip_translation_inertia : free_translation_inertia);
+ zoom_inertia = MAX(0.0001, zoom_inertia);
+
+ camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
+ camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
+
+ if (Math::abs(camera_cursor.x_rot - cursor.x_rot) < 0.1) {
+ camera_cursor.x_rot = cursor.x_rot;
+ }
+
+ if (Math::abs(camera_cursor.y_rot - cursor.y_rot) < 0.1) {
+ camera_cursor.y_rot = cursor.y_rot;
+ }
+
+ camera_cursor.pos = old_camera_cursor.pos.lerp(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia)));
+ camera_cursor.distance = Math::lerp(old_camera_cursor.distance, cursor.distance, MIN(1.f, p_interp_delta * (1 / zoom_inertia)));
+ }
+ }
+
+ //-------
+ // Apply camera transform
+
+ real_t tolerance = 0.001;
+ bool equal = true;
+ if (!Math::is_equal_approx(old_camera_cursor.x_rot, camera_cursor.x_rot, tolerance) || !Math::is_equal_approx(old_camera_cursor.y_rot, camera_cursor.y_rot, tolerance)) {
+ equal = false;
+ } else if (!old_camera_cursor.pos.is_equal_approx(camera_cursor.pos)) {
+ equal = false;
+ } else if (!Math::is_equal_approx(old_camera_cursor.distance, camera_cursor.distance, tolerance)) {
+ equal = false;
+ }
+
+ if (!equal || p_interp_delta == 0 || is_freelook_active() || is_orthogonal != orthogonal) {
+ camera->set_global_transform(to_camera_transform(camera_cursor));
+
+ if (orthogonal) {
+ float half_fov = Math::deg2rad(get_fov()) / 2.0;
+ float height = 2.0 * cursor.distance * Math::tan(half_fov);
+ camera->set_orthogonal(height, get_znear(), get_zfar());
+ } else {
+ camera->set_perspective(get_fov(), get_znear(), get_zfar());
+ }
+
+ update_transform_gizmo_view();
+ rotation_control->update();
+ }
+ spatial_editor->update_grid();
+}
+
+Transform Node3DEditorViewport::to_camera_transform(const Cursor &p_cursor) const {
+ Transform camera_transform;
+ camera_transform.translate(p_cursor.pos);
+ camera_transform.basis.rotate(Vector3(1, 0, 0), -p_cursor.x_rot);
+ camera_transform.basis.rotate(Vector3(0, 1, 0), -p_cursor.y_rot);
+
+ if (orthogonal) {
+ camera_transform.translate(0, 0, (get_zfar() - get_znear()) / 2.0);
+ } else {
+ camera_transform.translate(0, 0, p_cursor.distance);
+ }
+
+ return camera_transform;
+}
+
+int Node3DEditorViewport::get_selected_count() const {
+ Map<Node *, Object *> &selection = editor_selection->get_selection();
+
+ int count = 0;
+
+ for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->key());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ count++;
+ }
+
+ return count;
+}
+
+float Node3DEditorViewport::get_znear() const {
+ return CLAMP(spatial_editor->get_znear(), MIN_Z, MAX_Z);
+}
+
+float Node3DEditorViewport::get_zfar() const {
+ return CLAMP(spatial_editor->get_zfar(), MIN_Z, MAX_Z);
+}
+
+float Node3DEditorViewport::get_fov() const {
+ return CLAMP(spatial_editor->get_fov(), MIN_FOV, MAX_FOV);
+}
+
+Transform Node3DEditorViewport::_get_camera_transform() const {
+ return camera->get_global_transform();
+}
+
+Vector3 Node3DEditorViewport::_get_camera_position() const {
+ return _get_camera_transform().origin;
+}
+
+Point2 Node3DEditorViewport::_point_to_screen(const Vector3 &p_point) {
+ return camera->unproject_position(p_point) * subviewport_container->get_stretch_shrink();
+}
+
+Vector3 Node3DEditorViewport::_get_ray_pos(const Vector2 &p_pos) const {
+ return camera->project_ray_origin(p_pos / subviewport_container->get_stretch_shrink());
+}
+
+Vector3 Node3DEditorViewport::_get_camera_normal() const {
+ return -_get_camera_transform().basis.get_axis(2);
+}
+
+Vector3 Node3DEditorViewport::_get_ray(const Vector2 &p_pos) const {
+ return camera->project_ray_normal(p_pos / subviewport_container->get_stretch_shrink());
+}
+
+void Node3DEditorViewport::_clear_selected() {
+ editor_selection->clear();
+}
+
+void Node3DEditorViewport::_select_clicked(bool p_append, bool p_single, bool p_allow_locked) {
+ if (clicked.is_null()) {
+ return;
+ }
+
+ Node *node = Object::cast_to<Node>(ObjectDB::get_instance(clicked));
+ Node3D *selected = Object::cast_to<Node3D>(node);
+ if (!selected) {
+ return;
+ }
+
+ if (!p_allow_locked) {
+ // Replace the node by the group if grouped
+ while (node && node != editor->get_edited_scene()->get_parent()) {
+ Node3D *selected_tmp = Object::cast_to<Node3D>(node);
+ if (selected_tmp && node->has_meta("_edit_group_")) {
+ selected = selected_tmp;
+ }
+ node = node->get_parent();
+ }
+ }
+
+ if (p_allow_locked || !_is_node_locked(selected)) {
+ _select(selected, clicked_wants_append, true);
+ }
+}
+
+void Node3DEditorViewport::_select(Node *p_node, bool p_append, bool p_single) {
+ if (!p_append) {
+ editor_selection->clear();
+ }
+
+ if (editor_selection->is_selected(p_node)) {
+ //erase
+ editor_selection->remove_node(p_node);
+ } else {
+ editor_selection->add_node(p_node);
+ }
+
+ if (p_single) {
+ if (Engine::get_singleton()->is_editor_hint()) {
+ editor->call("edit_node", p_node);
+ }
+ }
+}
+
+ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, bool &r_includes_current, int *r_gizmo_handle, bool p_alt_select) {
+ if (r_gizmo_handle) {
+ *r_gizmo_handle = -1;
+ }
+
+ Vector3 ray = _get_ray(p_pos);
+ Vector3 pos = _get_ray_pos(p_pos);
+ Vector2 shrinked_pos = p_pos / subviewport_container->get_stretch_shrink();
+
+ if (viewport->get_debug_draw() == Viewport::DEBUG_DRAW_SDFGI_PROBES) {
+ RS::get_singleton()->sdfgi_set_debug_probe_select(pos, ray);
+ }
+
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario());
+ Set<Ref<EditorNode3DGizmo>> found_gizmos;
+
+ Node *edited_scene = get_tree()->get_edited_scene_root();
+ ObjectID closest;
+ Node *item = nullptr;
+ float closest_dist = 1e20;
+ int selected_handle = -1;
+
+ for (int i = 0; i < instances.size(); i++) {
+ Node3D *spat = Object::cast_to<Node3D>(ObjectDB::get_instance(instances[i]));
+
+ if (!spat) {
+ continue;
+ }
+
+ Ref<EditorNode3DGizmo> seg = spat->get_gizmo();
+
+ if ((!seg.is_valid()) || found_gizmos.has(seg)) {
+ continue;
+ }
+
+ found_gizmos.insert(seg);
+ Vector3 point;
+ Vector3 normal;
+
+ int handle = -1;
+ bool inters = seg->intersect_ray(camera, shrinked_pos, point, normal, &handle, p_alt_select);
+
+ if (!inters) {
+ continue;
+ }
+
+ float dist = pos.distance_to(point);
+
+ if (dist < 0) {
+ continue;
+ }
+
+ if (dist < closest_dist) {
+ item = Object::cast_to<Node>(spat);
+ while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) {
+ item = item->get_owner();
+ }
+
+ closest = item->get_instance_id();
+ closest_dist = dist;
+ selected_handle = handle;
+ }
+ }
+
+ if (!item) {
+ return ObjectID();
+ }
+
+ if (!editor_selection->is_selected(item) || (r_gizmo_handle && selected_handle >= 0)) {
+ if (r_gizmo_handle) {
+ *r_gizmo_handle = selected_handle;
+ }
+ }
+
+ return closest;
+}
+
+void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select) {
+ Vector3 ray = _get_ray(p_pos);
+ Vector3 pos = _get_ray_pos(p_pos);
+
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario());
+ Set<Ref<EditorNode3DGizmo>> found_gizmos;
+
+ r_includes_current = false;
+
+ for (int i = 0; i < instances.size(); i++) {
+ Node3D *spat = Object::cast_to<Node3D>(ObjectDB::get_instance(instances[i]));
+
+ if (!spat) {
+ continue;
+ }
+
+ Ref<EditorNode3DGizmo> seg = spat->get_gizmo();
+
+ if (!seg.is_valid()) {
+ continue;
+ }
+
+ if (found_gizmos.has(seg)) {
+ continue;
+ }
+
+ found_gizmos.insert(seg);
+ Vector3 point;
+ Vector3 normal;
+
+ int handle = -1;
+ bool inters = seg->intersect_ray(camera, p_pos, point, normal, nullptr, p_alt_select);
+
+ if (!inters) {
+ continue;
+ }
+
+ float dist = pos.distance_to(point);
+
+ if (dist < 0) {
+ continue;
+ }
+
+ if (editor_selection->is_selected(spat)) {
+ r_includes_current = true;
+ }
+
+ _RayResult res;
+ res.item = spat;
+ res.depth = dist;
+ res.handle = handle;
+ results.push_back(res);
+ }
+
+ if (results.empty()) {
+ return;
+ }
+
+ results.sort();
+}
+
+Vector3 Node3DEditorViewport::_get_screen_to_space(const Vector3 &p_vector3) {
+ CameraMatrix cm;
+ if (orthogonal) {
+ cm.set_orthogonal(camera->get_size(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar());
+ } else {
+ cm.set_perspective(get_fov(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar());
+ }
+ Vector2 screen_he = cm.get_viewport_half_extents();
+
+ Transform camera_transform;
+ camera_transform.translate(cursor.pos);
+ camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot);
+ camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot);
+ camera_transform.translate(0, 0, cursor.distance);
+
+ return camera_transform.xform(Vector3(((p_vector3.x / get_size().width) * 2.0 - 1.0) * screen_he.x, ((1.0 - (p_vector3.y / get_size().height)) * 2.0 - 1.0) * screen_he.y, -(get_znear() + p_vector3.z)));
+}
+
+void Node3DEditorViewport::_select_region() {
+ if (cursor.region_begin == cursor.region_end) {
+ return; //nothing really
+ }
+
+ float z_offset = MAX(0.0, 5.0 - get_znear());
+
+ Vector3 box[4] = {
+ Vector3(
+ MIN(cursor.region_begin.x, cursor.region_end.x),
+ MIN(cursor.region_begin.y, cursor.region_end.y),
+ z_offset),
+ Vector3(
+ MAX(cursor.region_begin.x, cursor.region_end.x),
+ MIN(cursor.region_begin.y, cursor.region_end.y),
+ z_offset),
+ Vector3(
+ MAX(cursor.region_begin.x, cursor.region_end.x),
+ MAX(cursor.region_begin.y, cursor.region_end.y),
+ z_offset),
+ Vector3(
+ MIN(cursor.region_begin.x, cursor.region_end.x),
+ MAX(cursor.region_begin.y, cursor.region_end.y),
+ z_offset)
+ };
+
+ Vector<Plane> frustum;
+
+ Vector3 cam_pos = _get_camera_position();
+
+ for (int i = 0; i < 4; i++) {
+ Vector3 a = _get_screen_to_space(box[i]);
+ Vector3 b = _get_screen_to_space(box[(i + 1) % 4]);
+ if (orthogonal) {
+ frustum.push_back(Plane(a, (a - b).normalized()));
+ } else {
+ frustum.push_back(Plane(a, b, cam_pos));
+ }
+ }
+
+ Plane near(cam_pos, -_get_camera_normal());
+ near.d -= get_znear();
+ frustum.push_back(near);
+
+ Plane far = -near;
+ far.d += get_zfar();
+ frustum.push_back(far);
+
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world_3d()->get_scenario());
+ Vector<Node *> selected;
+
+ Node *edited_scene = get_tree()->get_edited_scene_root();
+
+ for (int i = 0; i < instances.size(); i++) {
+ Node3D *sp = Object::cast_to<Node3D>(ObjectDB::get_instance(instances[i]));
+ if (!sp || _is_node_locked(sp)) {
+ continue;
+ }
+
+ Node *item = Object::cast_to<Node>(sp);
+ while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) {
+ item = item->get_owner();
+ }
+
+ // Replace the node by the group if grouped
+ if (item->is_class("Node3D")) {
+ Node3D *sel = Object::cast_to<Node3D>(item);
+ while (item && item != editor->get_edited_scene()->get_parent()) {
+ Node3D *selected_tmp = Object::cast_to<Node3D>(item);
+ if (selected_tmp && item->has_meta("_edit_group_")) {
+ sel = selected_tmp;
+ }
+ item = item->get_parent();
+ }
+ item = sel;
+ }
+
+ if (selected.find(item) != -1) {
+ continue;
+ }
+
+ if (_is_node_locked(item)) {
+ continue;
+ }
+
+ Ref<EditorNode3DGizmo> seg = sp->get_gizmo();
+
+ if (!seg.is_valid()) {
+ continue;
+ }
+
+ if (seg->intersect_frustum(camera, frustum)) {
+ selected.push_back(item);
+ }
+ }
+
+ bool single = selected.size() == 1;
+ for (int i = 0; i < selected.size(); i++) {
+ _select(selected[i], true, single);
+ }
+}
+
+void Node3DEditorViewport::_update_name() {
+ String view_mode = orthogonal ? TTR("Orthogonal") : TTR("Perspective");
+
+ if (auto_orthogonal) {
+ view_mode += " [auto]";
+ }
+
+ if (name != "") {
+ view_menu->set_text(name + " " + view_mode);
+ } else {
+ view_menu->set_text(view_mode);
+ }
+
+ view_menu->set_size(Vector2(0, 0)); // resets the button size
+}
+
+void Node3DEditorViewport::_compute_edit(const Point2 &p_point) {
+ _edit.click_ray = _get_ray(Vector2(p_point.x, p_point.y));
+ _edit.click_ray_pos = _get_ray_pos(Vector2(p_point.x, p_point.y));
+ _edit.plane = TRANSFORM_VIEW;
+ spatial_editor->update_transform_gizmo();
+ _edit.center = spatial_editor->get_gizmo_transform().origin;
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ se->original = se->sp->get_global_gizmo_transform();
+ se->original_local = se->sp->get_local_gizmo_transform();
+ }
+}
+
+static int _get_key_modifier_setting(const String &p_property) {
+ switch (EditorSettings::get_singleton()->get(p_property).operator int()) {
+ case 0:
+ return 0;
+ case 1:
+ return KEY_SHIFT;
+ case 2:
+ return KEY_ALT;
+ case 3:
+ return KEY_META;
+ case 4:
+ return KEY_CONTROL;
+ }
+ return 0;
+}
+
+static int _get_key_modifier(Ref<InputEventWithModifiers> e) {
+ if (e->get_shift()) {
+ return KEY_SHIFT;
+ }
+ if (e->get_alt()) {
+ return KEY_ALT;
+ }
+ if (e->get_control()) {
+ return KEY_CONTROL;
+ }
+ if (e->get_metakey()) {
+ return KEY_META;
+ }
+ return 0;
+}
+
+bool Node3DEditorViewport::_gizmo_select(const Vector2 &p_screenpos, bool p_highlight_only) {
+ if (!spatial_editor->is_gizmo_visible()) {
+ return false;
+ }
+ if (get_selected_count() == 0) {
+ if (p_highlight_only) {
+ spatial_editor->select_gizmo_highlight_axis(-1);
+ }
+ return false;
+ }
+
+ Vector3 ray_pos = _get_ray_pos(Vector2(p_screenpos.x, p_screenpos.y));
+ Vector3 ray = _get_ray(Vector2(p_screenpos.x, p_screenpos.y));
+
+ Transform gt = spatial_editor->get_gizmo_transform();
+ float gs = gizmo_scale;
+
+ if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE) {
+ int col_axis = -1;
+ float col_d = 1e20;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 grabber_pos = gt.origin + gt.basis.get_axis(i) * gs * (GIZMO_ARROW_OFFSET + (GIZMO_ARROW_SIZE * 0.5));
+ float grabber_radius = gs * GIZMO_ARROW_SIZE;
+
+ Vector3 r;
+
+ if (Geometry3D::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) {
+ float d = r.distance_to(ray_pos);
+ if (d < col_d) {
+ col_d = d;
+ col_axis = i;
+ }
+ }
+ }
+
+ bool is_plane_translate = false;
+ // plane select
+ if (col_axis == -1) {
+ col_d = 1e20;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ivec2 = gt.basis.get_axis((i + 1) % 3).normalized();
+ Vector3 ivec3 = gt.basis.get_axis((i + 2) % 3).normalized();
+
+ Vector3 grabber_pos = gt.origin + (ivec2 + ivec3) * gs * (GIZMO_PLANE_SIZE + GIZMO_PLANE_DST);
+
+ Vector3 r;
+ Plane plane(gt.origin, gt.basis.get_axis(i).normalized());
+
+ if (plane.intersects_ray(ray_pos, ray, &r)) {
+ float dist = r.distance_to(grabber_pos);
+ if (dist < (gs * GIZMO_PLANE_SIZE)) {
+ float d = ray_pos.distance_to(r);
+ if (d < col_d) {
+ col_d = d;
+ col_axis = i;
+
+ is_plane_translate = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (col_axis != -1) {
+ if (p_highlight_only) {
+ spatial_editor->select_gizmo_highlight_axis(col_axis + (is_plane_translate ? 6 : 0));
+
+ } else {
+ //handle plane translate
+ _edit.mode = TRANSFORM_TRANSLATE;
+ _compute_edit(Point2(p_screenpos.x, p_screenpos.y));
+ _edit.plane = TransformPlane(TRANSFORM_X_AXIS + col_axis + (is_plane_translate ? 3 : 0));
+ }
+ return true;
+ }
+ }
+
+ if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) {
+ int col_axis = -1;
+ float col_d = 1e20;
+
+ for (int i = 0; i < 3; i++) {
+ Plane plane(gt.origin, gt.basis.get_axis(i).normalized());
+ Vector3 r;
+ if (!plane.intersects_ray(ray_pos, ray, &r)) {
+ continue;
+ }
+
+ float dist = r.distance_to(gt.origin);
+
+ if (dist > gs * (GIZMO_CIRCLE_SIZE - GIZMO_RING_HALF_WIDTH) && dist < gs * (GIZMO_CIRCLE_SIZE + GIZMO_RING_HALF_WIDTH)) {
+ float d = ray_pos.distance_to(r);
+ if (d < col_d) {
+ col_d = d;
+ col_axis = i;
+ }
+ }
+ }
+
+ if (col_axis != -1) {
+ if (p_highlight_only) {
+ spatial_editor->select_gizmo_highlight_axis(col_axis + 3);
+ } else {
+ //handle rotate
+ _edit.mode = TRANSFORM_ROTATE;
+ _compute_edit(Point2(p_screenpos.x, p_screenpos.y));
+ _edit.plane = TransformPlane(TRANSFORM_X_AXIS + col_axis);
+ }
+ return true;
+ }
+ }
+
+ if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE) {
+ int col_axis = -1;
+ float col_d = 1e20;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 grabber_pos = gt.origin + gt.basis.get_axis(i) * gs * GIZMO_SCALE_OFFSET;
+ float grabber_radius = gs * GIZMO_ARROW_SIZE;
+
+ Vector3 r;
+
+ if (Geometry3D::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) {
+ float d = r.distance_to(ray_pos);
+ if (d < col_d) {
+ col_d = d;
+ col_axis = i;
+ }
+ }
+ }
+
+ bool is_plane_scale = false;
+ // plane select
+ if (col_axis == -1) {
+ col_d = 1e20;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 ivec2 = gt.basis.get_axis((i + 1) % 3).normalized();
+ Vector3 ivec3 = gt.basis.get_axis((i + 2) % 3).normalized();
+
+ Vector3 grabber_pos = gt.origin + (ivec2 + ivec3) * gs * (GIZMO_PLANE_SIZE + GIZMO_PLANE_DST);
+
+ Vector3 r;
+ Plane plane(gt.origin, gt.basis.get_axis(i).normalized());
+
+ if (plane.intersects_ray(ray_pos, ray, &r)) {
+ float dist = r.distance_to(grabber_pos);
+ if (dist < (gs * GIZMO_PLANE_SIZE)) {
+ float d = ray_pos.distance_to(r);
+ if (d < col_d) {
+ col_d = d;
+ col_axis = i;
+
+ is_plane_scale = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (col_axis != -1) {
+ if (p_highlight_only) {
+ spatial_editor->select_gizmo_highlight_axis(col_axis + (is_plane_scale ? 12 : 9));
+
+ } else {
+ //handle scale
+ _edit.mode = TRANSFORM_SCALE;
+ _compute_edit(Point2(p_screenpos.x, p_screenpos.y));
+ _edit.plane = TransformPlane(TRANSFORM_X_AXIS + col_axis + (is_plane_scale ? 3 : 0));
+ }
+ return true;
+ }
+ }
+
+ if (p_highlight_only) {
+ spatial_editor->select_gizmo_highlight_axis(-1);
+ }
+
+ return false;
+}
+
+void Node3DEditorViewport::_surface_mouse_enter() {
+ if (!surface->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field())) {
+ surface->grab_focus();
+ }
+}
+
+void Node3DEditorViewport::_surface_mouse_exit() {
+ _remove_preview();
+}
+
+void Node3DEditorViewport::_surface_focus_enter() {
+ view_menu->set_disable_shortcuts(false);
+}
+
+void Node3DEditorViewport::_surface_focus_exit() {
+ view_menu->set_disable_shortcuts(true);
+}
+
+bool Node3DEditorViewport ::_is_node_locked(const Node *p_node) {
+ return p_node->has_meta("_edit_lock_") && p_node->get_meta("_edit_lock_");
+}
+
+void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) {
+ _find_items_at_pos(b->get_position(), clicked_includes_current, selection_results, b->get_shift());
+
+ Node *scene = editor->get_edited_scene();
+
+ for (int i = 0; i < selection_results.size(); i++) {
+ Node3D *item = selection_results[i].item;
+ if (item != scene && item->get_owner() != scene && !scene->is_editable_instance(item->get_owner())) {
+ //invalid result
+ selection_results.remove(i);
+ i--;
+ }
+ }
+
+ clicked_wants_append = b->get_shift();
+
+ if (selection_results.size() == 1) {
+ clicked = selection_results[0].item->get_instance_id();
+ selection_results.clear();
+
+ if (clicked.is_valid()) {
+ _select_clicked(clicked_wants_append, true, spatial_editor->get_tool_mode() != Node3DEditor::TOOL_MODE_LIST_SELECT);
+ clicked = ObjectID();
+ }
+
+ } else if (!selection_results.empty()) {
+ NodePath root_path = get_tree()->get_edited_scene_root()->get_path();
+ StringName root_name = root_path.get_name(root_path.get_name_count() - 1);
+
+ for (int i = 0; i < selection_results.size(); i++) {
+ Node3D *spat = selection_results[i].item;
+
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(spat, "Node");
+
+ String node_path = "/" + root_name + "/" + root_path.rel_path_to(spat->get_path());
+
+ int locked = 0;
+ if (_is_node_locked(spat)) {
+ locked = 1;
+ } else {
+ Node *ed_scene = editor->get_edited_scene();
+ Node *node = spat;
+
+ while (node && node != ed_scene->get_parent()) {
+ Node3D *selected_tmp = Object::cast_to<Node3D>(node);
+ if (selected_tmp && node->has_meta("_edit_group_")) {
+ locked = 2;
+ }
+ node = node->get_parent();
+ }
+ }
+
+ String suffix = String();
+ if (locked == 1) {
+ suffix = " (" + TTR("Locked") + ")";
+ } else if (locked == 2) {
+ suffix = " (" + TTR("Grouped") + ")";
+ }
+ selection_menu->add_item((String)spat->get_name() + suffix);
+ selection_menu->set_item_icon(i, icon);
+ selection_menu->set_item_metadata(i, node_path);
+ selection_menu->set_item_tooltip(i, String(spat->get_name()) + "\nType: " + spat->get_class() + "\nPath: " + node_path);
+ }
+
+ selection_menu->set_position(get_screen_transform().xform(b->get_position()));
+ selection_menu->popup();
+ }
+}
+
+void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
+ if (previewing) {
+ return; //do NONE
+ }
+
+ {
+ EditorNode *en = editor;
+ EditorPluginList *force_input_forwarding_list = en->get_editor_plugins_force_input_forwarding();
+ if (!force_input_forwarding_list->empty()) {
+ bool discard = force_input_forwarding_list->forward_spatial_gui_input(camera, p_event, true);
+ if (discard) {
+ return;
+ }
+ }
+ }
+ {
+ EditorNode *en = editor;
+ EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
+ if (!over_plugin_list->empty()) {
+ bool discard = over_plugin_list->forward_spatial_gui_input(camera, p_event, false);
+ if (discard) {
+ return;
+ }
+ }
+ }
+
+ Ref<InputEventMouseButton> b = p_event;
+
+ if (b.is_valid()) {
+ emit_signal("clicked", this);
+
+ float zoom_factor = 1 + (ZOOM_MULTIPLIER - 1) * b->get_factor();
+ switch (b->get_button_index()) {
+ case BUTTON_WHEEL_UP: {
+ if (is_freelook_active()) {
+ scale_freelook_speed(zoom_factor);
+ } else {
+ scale_cursor_distance(1.0 / zoom_factor);
+ }
+ } break;
+
+ case BUTTON_WHEEL_DOWN: {
+ if (is_freelook_active()) {
+ scale_freelook_speed(1.0 / zoom_factor);
+ } else {
+ scale_cursor_distance(zoom_factor);
+ }
+ } break;
+
+ case BUTTON_RIGHT: {
+ NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
+
+ if (b->is_pressed() && _edit.gizmo.is_valid()) {
+ //restore
+ _edit.gizmo->commit_handle(_edit.gizmo_handle, _edit.gizmo_initial_value, true);
+ _edit.gizmo = Ref<EditorNode3DGizmo>();
+ }
+
+ if (_edit.mode == TRANSFORM_NONE && b->is_pressed()) {
+ if (b->get_alt()) {
+ if (nav_scheme == NAVIGATION_MAYA) {
+ break;
+ }
+
+ _list_select(b);
+ return;
+ }
+ }
+
+ if (_edit.mode != TRANSFORM_NONE && b->is_pressed()) {
+ //cancel motion
+ _edit.mode = TRANSFORM_NONE;
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ sp->set_global_transform(se->original);
+ }
+ surface->update();
+ set_message(TTR("Transform Aborted."), 3);
+ }
+
+ if (b->is_pressed()) {
+ const int mod = _get_key_modifier(b);
+ if (!orthogonal) {
+ if (mod == _get_key_modifier_setting("editors/3d/freelook/freelook_activation_modifier")) {
+ set_freelook_active(true);
+ }
+ }
+ } else {
+ set_freelook_active(false);
+ }
+
+ if (freelook_active && !surface->has_focus()) {
+ // Focus usually doesn't trigger on right-click, but in case of freelook it should,
+ // otherwise using keyboard navigation would misbehave
+ surface->grab_focus();
+ }
+
+ } break;
+ case BUTTON_MIDDLE: {
+ if (b->is_pressed() && _edit.mode != TRANSFORM_NONE) {
+ switch (_edit.plane) {
+ case TRANSFORM_VIEW: {
+ _edit.plane = TRANSFORM_X_AXIS;
+ set_message(TTR("X-Axis Transform."), 2);
+ name = "";
+ _update_name();
+ } break;
+ case TRANSFORM_X_AXIS: {
+ _edit.plane = TRANSFORM_Y_AXIS;
+ set_message(TTR("Y-Axis Transform."), 2);
+
+ } break;
+ case TRANSFORM_Y_AXIS: {
+ _edit.plane = TRANSFORM_Z_AXIS;
+ set_message(TTR("Z-Axis Transform."), 2);
+
+ } break;
+ case TRANSFORM_Z_AXIS: {
+ _edit.plane = TRANSFORM_VIEW;
+ set_message(TTR("View Plane Transform."), 2);
+
+ } break;
+ case TRANSFORM_YZ:
+ case TRANSFORM_XZ:
+ case TRANSFORM_XY: {
+ } break;
+ }
+ }
+ } break;
+ case BUTTON_LEFT: {
+ if (b->is_pressed()) {
+ NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
+ if ((nav_scheme == NAVIGATION_MAYA || nav_scheme == NAVIGATION_MODO) && b->get_alt()) {
+ break;
+ }
+
+ if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_LIST_SELECT) {
+ _list_select(b);
+ break;
+ }
+
+ _edit.mouse_pos = b->get_position();
+ _edit.snap = spatial_editor->is_snap_enabled();
+ _edit.mode = TRANSFORM_NONE;
+
+ //gizmo has priority over everything
+
+ bool can_select_gizmos = true;
+
+ {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
+ can_select_gizmos = view_menu->get_popup()->is_item_checked(idx);
+ }
+
+ if (can_select_gizmos && spatial_editor->get_selected()) {
+ Ref<EditorNode3DGizmo> seg = spatial_editor->get_selected()->get_gizmo();
+ if (seg.is_valid()) {
+ int handle = -1;
+ Vector3 point;
+ Vector3 normal;
+ bool inters = seg->intersect_ray(camera, _edit.mouse_pos, point, normal, &handle, b->get_shift());
+ if (inters && handle != -1) {
+ _edit.gizmo = seg;
+ _edit.gizmo_handle = handle;
+ _edit.gizmo_initial_value = seg->get_handle_value(handle);
+ break;
+ }
+ }
+ }
+
+ if (_gizmo_select(_edit.mouse_pos)) {
+ break;
+ }
+
+ clicked = ObjectID();
+ clicked_includes_current = false;
+
+ if ((spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT && b->get_control()) || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) {
+ /* HANDLE ROTATION */
+ if (get_selected_count() == 0) {
+ break; //bye
+ }
+ //handle rotate
+ _edit.mode = TRANSFORM_ROTATE;
+ _compute_edit(b->get_position());
+ break;
+ }
+
+ if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE) {
+ if (get_selected_count() == 0) {
+ break; //bye
+ }
+ //handle translate
+ _edit.mode = TRANSFORM_TRANSLATE;
+ _compute_edit(b->get_position());
+ break;
+ }
+
+ if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE) {
+ if (get_selected_count() == 0) {
+ break; //bye
+ }
+ //handle scale
+ _edit.mode = TRANSFORM_SCALE;
+ _compute_edit(b->get_position());
+ break;
+ }
+
+ // todo scale
+
+ int gizmo_handle = -1;
+
+ clicked = _select_ray(b->get_position(), b->get_shift(), clicked_includes_current, &gizmo_handle, b->get_shift());
+
+ //clicking is always deferred to either move or release
+
+ clicked_wants_append = b->get_shift();
+
+ if (clicked.is_null()) {
+ if (!clicked_wants_append) {
+ _clear_selected();
+ }
+
+ //default to regionselect
+ cursor.region_select = true;
+ cursor.region_begin = b->get_position();
+ cursor.region_end = b->get_position();
+ }
+
+ if (clicked.is_valid() && gizmo_handle >= 0) {
+ Node3D *spa = Object::cast_to<Node3D>(ObjectDB::get_instance(clicked));
+ if (spa) {
+ Ref<EditorNode3DGizmo> seg = spa->get_gizmo();
+ if (seg.is_valid()) {
+ _edit.gizmo = seg;
+ _edit.gizmo_handle = gizmo_handle;
+ _edit.gizmo_initial_value = seg->get_handle_value(gizmo_handle);
+ break;
+ }
+ }
+ }
+
+ surface->update();
+ } else {
+ if (_edit.gizmo.is_valid()) {
+ _edit.gizmo->commit_handle(_edit.gizmo_handle, _edit.gizmo_initial_value, false);
+ _edit.gizmo = Ref<EditorNode3DGizmo>();
+ break;
+ }
+ if (clicked.is_valid()) {
+ _select_clicked(clicked_wants_append, true);
+ // Processing was deferred.
+ clicked = ObjectID();
+ }
+
+ if (cursor.region_select) {
+ if (!clicked_wants_append) {
+ _clear_selected();
+ }
+
+ _select_region();
+ cursor.region_select = false;
+ surface->update();
+ }
+
+ if (_edit.mode != TRANSFORM_NONE) {
+ static const char *_transform_name[4] = { "None", "Rotate", "Translate", "Scale" };
+ undo_redo->create_action(_transform_name[_edit.mode]);
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ undo_redo->add_do_method(sp, "set_global_transform", sp->get_global_gizmo_transform());
+ undo_redo->add_undo_method(sp, "set_global_transform", se->original);
+ }
+ undo_redo->commit_action();
+ _edit.mode = TRANSFORM_NONE;
+ set_message("");
+ }
+
+ surface->update();
+ }
+
+ } break;
+ }
+ }
+
+ Ref<InputEventMouseMotion> m = p_event;
+
+ if (m.is_valid()) {
+ _edit.mouse_pos = m->get_position();
+
+ if (spatial_editor->get_selected()) {
+ Ref<EditorNode3DGizmo> seg = spatial_editor->get_selected()->get_gizmo();
+ if (seg.is_valid()) {
+ int selected_handle = -1;
+
+ int handle = -1;
+ Vector3 point;
+ Vector3 normal;
+ bool inters = seg->intersect_ray(camera, _edit.mouse_pos, point, normal, &handle, false);
+ if (inters && handle != -1) {
+ selected_handle = handle;
+ }
+
+ if (selected_handle != spatial_editor->get_over_gizmo_handle()) {
+ spatial_editor->set_over_gizmo_handle(selected_handle);
+ spatial_editor->get_selected()->update_gizmo();
+ if (selected_handle != -1) {
+ spatial_editor->select_gizmo_highlight_axis(-1);
+ }
+ }
+ }
+ }
+
+ if (spatial_editor->get_over_gizmo_handle() == -1 && !(m->get_button_mask() & 1) && !_edit.gizmo.is_valid()) {
+ _gizmo_select(_edit.mouse_pos, true);
+ }
+
+ NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
+ NavigationMode nav_mode = NAVIGATION_NONE;
+
+ if (_edit.gizmo.is_valid()) {
+ _edit.gizmo->set_handle(_edit.gizmo_handle, camera, m->get_position());
+ Variant v = _edit.gizmo->get_handle_value(_edit.gizmo_handle);
+ String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle);
+ set_message(n + ": " + String(v));
+
+ } else if (m->get_button_mask() & BUTTON_MASK_LEFT) {
+ if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) {
+ nav_mode = NAVIGATION_ORBIT;
+ } else if (nav_scheme == NAVIGATION_MODO && m->get_alt() && m->get_shift()) {
+ nav_mode = NAVIGATION_PAN;
+ } else if (nav_scheme == NAVIGATION_MODO && m->get_alt() && m->get_control()) {
+ nav_mode = NAVIGATION_ZOOM;
+ } else if (nav_scheme == NAVIGATION_MODO && m->get_alt()) {
+ nav_mode = NAVIGATION_ORBIT;
+ } else {
+ if (clicked.is_valid()) {
+ if (!clicked_includes_current) {
+ _select_clicked(clicked_wants_append, true);
+ // Processing was deferred.
+ }
+
+ _compute_edit(_edit.mouse_pos);
+ clicked = ObjectID();
+
+ _edit.mode = TRANSFORM_TRANSLATE;
+ }
+
+ if (cursor.region_select) {
+ cursor.region_end = m->get_position();
+ surface->update();
+ return;
+ }
+
+ if (_edit.mode == TRANSFORM_NONE) {
+ return;
+ }
+
+ Vector3 ray_pos = _get_ray_pos(m->get_position());
+ Vector3 ray = _get_ray(m->get_position());
+ float snap = EDITOR_GET("interface/inspector/default_float_step");
+ int snap_step_decimals = Math::range_step_decimals(snap);
+
+ switch (_edit.mode) {
+ case TRANSFORM_SCALE: {
+ Vector3 motion_mask;
+ Plane plane;
+ bool plane_mv = false;
+
+ switch (_edit.plane) {
+ case TRANSFORM_VIEW:
+ motion_mask = Vector3(0, 0, 0);
+ plane = Plane(_edit.center, _get_camera_normal());
+ break;
+ case TRANSFORM_X_AXIS:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0);
+ plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Y_AXIS:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1);
+ plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Z_AXIS:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2);
+ plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_YZ:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2) + spatial_editor->get_gizmo_transform().basis.get_axis(1);
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0));
+ plane_mv = true;
+ break;
+ case TRANSFORM_XZ:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2) + spatial_editor->get_gizmo_transform().basis.get_axis(0);
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1));
+ plane_mv = true;
+ break;
+ case TRANSFORM_XY:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0) + spatial_editor->get_gizmo_transform().basis.get_axis(1);
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2));
+ plane_mv = true;
+ break;
+ }
+
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos, ray, &intersection)) {
+ break;
+ }
+
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) {
+ break;
+ }
+
+ Vector3 motion = intersection - click;
+ if (_edit.plane != TRANSFORM_VIEW) {
+ if (!plane_mv) {
+ motion = motion_mask.dot(motion) * motion_mask;
+
+ } else {
+ // Alternative planar scaling mode
+ if (_get_key_modifier(m) != KEY_SHIFT) {
+ motion = motion_mask.dot(motion) * motion_mask;
+ }
+ }
+
+ } else {
+ float center_click_dist = click.distance_to(_edit.center);
+ float center_inters_dist = intersection.distance_to(_edit.center);
+ if (center_click_dist == 0) {
+ break;
+ }
+
+ float scale = center_inters_dist - center_click_dist;
+ motion = Vector3(scale, scale, scale);
+ }
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ // Disable local transformation for TRANSFORM_VIEW
+ bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW);
+
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ snap = spatial_editor->get_scale_snap() / 100;
+ }
+ Vector3 motion_snapped = motion;
+ motion_snapped.snap(Vector3(snap, snap, snap));
+ // This might not be necessary anymore after issue #288 is solved (in 4.0?).
+ set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
+ String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ if (sp->has_meta("_edit_lock_")) {
+ continue;
+ }
+
+ Transform original = se->original;
+ Transform original_local = se->original_local;
+ Transform base = Transform(Basis(), _edit.center);
+ Transform t;
+ Vector3 local_scale;
+
+ if (local_coords) {
+ Basis g = original.basis.orthonormalized();
+ Vector3 local_motion = g.inverse().xform(motion);
+
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ local_motion.snap(Vector3(snap, snap, snap));
+ }
+
+ local_scale = original_local.basis.get_scale() * (local_motion + Vector3(1, 1, 1));
+
+ // Prevent scaling to 0 it would break the gizmo
+ Basis check = original_local.basis;
+ check.scale(local_scale);
+ if (check.determinant() != 0) {
+ // Apply scale
+ sp->set_scale(local_scale);
+ }
+
+ } else {
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ motion.snap(Vector3(snap, snap, snap));
+ }
+
+ Transform r;
+ r.basis.scale(motion + Vector3(1, 1, 1));
+ t = base * (r * (base.inverse() * original));
+
+ // Apply scale
+ sp->set_global_transform(t);
+ }
+ }
+
+ surface->update();
+
+ } break;
+
+ case TRANSFORM_TRANSLATE: {
+ Vector3 motion_mask;
+ Plane plane;
+ bool plane_mv = false;
+
+ switch (_edit.plane) {
+ case TRANSFORM_VIEW:
+ plane = Plane(_edit.center, _get_camera_normal());
+ break;
+ case TRANSFORM_X_AXIS:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0);
+ plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Y_AXIS:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1);
+ plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Z_AXIS:
+ motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2);
+ plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_YZ:
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0));
+ plane_mv = true;
+ break;
+ case TRANSFORM_XZ:
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1));
+ plane_mv = true;
+ break;
+ case TRANSFORM_XY:
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2));
+ plane_mv = true;
+ break;
+ }
+
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos, ray, &intersection)) {
+ break;
+ }
+
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) {
+ break;
+ }
+
+ Vector3 motion = intersection - click;
+ if (_edit.plane != TRANSFORM_VIEW) {
+ if (!plane_mv) {
+ motion = motion_mask.dot(motion) * motion_mask;
+ }
+ }
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ // Disable local transformation for TRANSFORM_VIEW
+ bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW);
+
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ snap = spatial_editor->get_translate_snap();
+ }
+ Vector3 motion_snapped = motion;
+ motion_snapped.snap(Vector3(snap, snap, snap));
+ set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
+ String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ if (sp->has_meta("_edit_lock_")) {
+ continue;
+ }
+
+ Transform original = se->original;
+ Transform t;
+
+ if (local_coords) {
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ Basis g = original.basis.orthonormalized();
+ Vector3 local_motion = g.inverse().xform(motion);
+ local_motion.snap(Vector3(snap, snap, snap));
+
+ motion = g.xform(local_motion);
+ }
+
+ } else {
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ motion.snap(Vector3(snap, snap, snap));
+ }
+ }
+
+ // Apply translation
+ t = original;
+ t.origin += motion;
+ sp->set_global_transform(t);
+ }
+
+ surface->update();
+
+ } break;
+
+ case TRANSFORM_ROTATE: {
+ Plane plane;
+ Vector3 axis;
+
+ switch (_edit.plane) {
+ case TRANSFORM_VIEW:
+ plane = Plane(_edit.center, _get_camera_normal());
+ break;
+ case TRANSFORM_X_AXIS:
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0));
+ axis = Vector3(1, 0, 0);
+ break;
+ case TRANSFORM_Y_AXIS:
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1));
+ axis = Vector3(0, 1, 0);
+ break;
+ case TRANSFORM_Z_AXIS:
+ plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2));
+ axis = Vector3(0, 0, 1);
+ break;
+ case TRANSFORM_YZ:
+ case TRANSFORM_XZ:
+ case TRANSFORM_XY:
+ break;
+ }
+
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos, ray, &intersection)) {
+ break;
+ }
+
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) {
+ break;
+ }
+
+ Vector3 y_axis = (click - _edit.center).normalized();
+ Vector3 x_axis = plane.normal.cross(y_axis).normalized();
+
+ float angle = Math::atan2(x_axis.dot(intersection - _edit.center), y_axis.dot(intersection - _edit.center));
+
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ snap = spatial_editor->get_rotate_snap();
+ }
+ angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180
+ angle -= Math::fmod(angle, snap);
+ set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals)));
+ angle = Math::deg2rad(angle);
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); // Disable local transformation for TRANSFORM_VIEW
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ if (sp->has_meta("_edit_lock_")) {
+ continue;
+ }
+
+ Transform t;
+
+ if (local_coords) {
+ Transform original_local = se->original_local;
+ Basis rot = Basis(axis, angle);
+
+ t.basis = original_local.get_basis().orthonormalized() * rot;
+ t.origin = original_local.origin;
+
+ // Apply rotation
+ sp->set_transform(t);
+ sp->set_scale(original_local.basis.get_scale()); // re-apply original scale
+
+ } else {
+ Transform original = se->original;
+ Transform r;
+ Transform base = Transform(Basis(), _edit.center);
+
+ r.basis.rotate(plane.normal, angle);
+ t = base * r * base.inverse() * original;
+
+ // Apply rotation
+ sp->set_global_transform(t);
+ }
+ }
+
+ surface->update();
+
+ } break;
+ default: {
+ }
+ }
+ }
+
+ } else if ((m->get_button_mask() & BUTTON_MASK_RIGHT) || freelook_active) {
+ if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) {
+ nav_mode = NAVIGATION_ZOOM;
+ } else if (freelook_active) {
+ nav_mode = NAVIGATION_LOOK;
+ } else if (orthogonal) {
+ nav_mode = NAVIGATION_PAN;
+ }
+
+ } else if (m->get_button_mask() & BUTTON_MASK_MIDDLE) {
+ if (nav_scheme == NAVIGATION_GODOT) {
+ const int mod = _get_key_modifier(m);
+
+ if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) {
+ nav_mode = NAVIGATION_PAN;
+ } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) {
+ nav_mode = NAVIGATION_ZOOM;
+ } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) {
+ // Always allow Alt as a modifier to better support graphic tablets.
+ nav_mode = NAVIGATION_ORBIT;
+ }
+
+ } else if (nav_scheme == NAVIGATION_MAYA) {
+ if (m->get_alt()) {
+ nav_mode = NAVIGATION_PAN;
+ }
+ }
+
+ } else if (EditorSettings::get_singleton()->get("editors/3d/navigation/emulate_3_button_mouse")) {
+ // Handle trackpad (no external mouse) use case
+ const int mod = _get_key_modifier(m);
+
+ if (mod) {
+ if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) {
+ nav_mode = NAVIGATION_PAN;
+ } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) {
+ nav_mode = NAVIGATION_ZOOM;
+ } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) {
+ // Always allow Alt as a modifier to better support graphic tablets.
+ nav_mode = NAVIGATION_ORBIT;
+ }
+ }
+ }
+
+ switch (nav_mode) {
+ case NAVIGATION_PAN: {
+ _nav_pan(m, _get_warped_mouse_motion(m));
+
+ } break;
+
+ case NAVIGATION_ZOOM: {
+ _nav_zoom(m, m->get_relative());
+
+ } break;
+
+ case NAVIGATION_ORBIT: {
+ _nav_orbit(m, _get_warped_mouse_motion(m));
+
+ } break;
+
+ case NAVIGATION_LOOK: {
+ _nav_look(m, _get_warped_mouse_motion(m));
+
+ } break;
+
+ default: {
+ }
+ }
+ }
+
+ Ref<InputEventMagnifyGesture> magnify_gesture = p_event;
+ if (magnify_gesture.is_valid()) {
+ if (is_freelook_active()) {
+ scale_freelook_speed(magnify_gesture->get_factor());
+ } else {
+ scale_cursor_distance(1.0 / magnify_gesture->get_factor());
+ }
+ }
+
+ Ref<InputEventPanGesture> pan_gesture = p_event;
+ if (pan_gesture.is_valid()) {
+ NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
+ NavigationMode nav_mode = NAVIGATION_NONE;
+
+ if (nav_scheme == NAVIGATION_GODOT) {
+ const int mod = _get_key_modifier(pan_gesture);
+
+ if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) {
+ nav_mode = NAVIGATION_PAN;
+ } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) {
+ nav_mode = NAVIGATION_ZOOM;
+ } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) {
+ // Always allow Alt as a modifier to better support graphic tablets.
+ nav_mode = NAVIGATION_ORBIT;
+ }
+
+ } else if (nav_scheme == NAVIGATION_MAYA) {
+ if (pan_gesture->get_alt()) {
+ nav_mode = NAVIGATION_PAN;
+ }
+ }
+
+ switch (nav_mode) {
+ case NAVIGATION_PAN: {
+ _nav_pan(pan_gesture, pan_gesture->get_delta());
+
+ } break;
+
+ case NAVIGATION_ZOOM: {
+ _nav_zoom(pan_gesture, pan_gesture->get_delta());
+
+ } break;
+
+ case NAVIGATION_ORBIT: {
+ _nav_orbit(pan_gesture, pan_gesture->get_delta());
+
+ } break;
+
+ case NAVIGATION_LOOK: {
+ _nav_look(pan_gesture, pan_gesture->get_delta());
+
+ } break;
+
+ default: {
+ }
+ }
+ }
+
+ Ref<InputEventKey> k = p_event;
+
+ if (k.is_valid()) {
+ if (!k->is_pressed()) {
+ return;
+ }
+
+ if (ED_IS_SHORTCUT("spatial_editor/snap", p_event)) {
+ if (_edit.mode != TRANSFORM_NONE) {
+ _edit.snap = !_edit.snap;
+ }
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/bottom_view", p_event)) {
+ _menu_option(VIEW_BOTTOM);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/top_view", p_event)) {
+ _menu_option(VIEW_TOP);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/rear_view", p_event)) {
+ _menu_option(VIEW_REAR);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/front_view", p_event)) {
+ _menu_option(VIEW_FRONT);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/left_view", p_event)) {
+ _menu_option(VIEW_LEFT);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/right_view", p_event)) {
+ _menu_option(VIEW_RIGHT);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/focus_origin", p_event)) {
+ _menu_option(VIEW_CENTER_TO_ORIGIN);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/focus_selection", p_event)) {
+ _menu_option(VIEW_CENTER_TO_SELECTION);
+ }
+ // Orthgonal mode doesn't work in freelook.
+ if (!freelook_active && ED_IS_SHORTCUT("spatial_editor/switch_perspective_orthogonal", p_event)) {
+ _menu_option(orthogonal ? VIEW_PERSPECTIVE : VIEW_ORTHOGONAL);
+ _update_name();
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/align_transform_with_view", p_event)) {
+ _menu_option(VIEW_ALIGN_TRANSFORM_WITH_VIEW);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/align_rotation_with_view", p_event)) {
+ _menu_option(VIEW_ALIGN_ROTATION_WITH_VIEW);
+ }
+ if (ED_IS_SHORTCUT("spatial_editor/insert_anim_key", p_event)) {
+ if (!get_selected_count() || _edit.mode != TRANSFORM_NONE) {
+ return;
+ }
+
+ if (!AnimationPlayerEditor::singleton->get_track_editor()->has_keying()) {
+ set_message(TTR("Keying is disabled (no key inserted)."));
+ return;
+ }
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ spatial_editor->emit_signal("transform_key_request", sp, "", sp->get_transform());
+ }
+
+ set_message(TTR("Animation Key Inserted."));
+ }
+
+ // Freelook doesn't work in orthogonal mode.
+ if (!orthogonal && ED_IS_SHORTCUT("spatial_editor/freelook_toggle", p_event)) {
+ set_freelook_active(!is_freelook_active());
+
+ } else if (k->get_keycode() == KEY_ESCAPE) {
+ set_freelook_active(false);
+ }
+
+ if (k->get_keycode() == KEY_SPACE) {
+ if (!k->is_pressed()) {
+ emit_signal("toggle_maximize_view", this);
+ }
+ }
+ }
+
+ // freelook uses most of the useful shortcuts, like save, so its ok
+ // to consider freelook active as end of the line for future events.
+ if (freelook_active) {
+ accept_event();
+ }
+}
+
+void Node3DEditorViewport::_nav_pan(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
+ const NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
+
+ real_t pan_speed = 1 / 150.0;
+ int pan_speed_modifier = 10;
+ if (nav_scheme == NAVIGATION_MAYA && p_event->get_shift()) {
+ pan_speed *= pan_speed_modifier;
+ }
+
+ Transform camera_transform;
+
+ camera_transform.translate(cursor.pos);
+ camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot);
+ camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot);
+ const bool invert_x_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_x_axis");
+ const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis");
+ Vector3 translation(
+ (invert_x_axis ? -1 : 1) * -p_relative.x * pan_speed,
+ (invert_y_axis ? -1 : 1) * p_relative.y * pan_speed,
+ 0);
+ translation *= cursor.distance / DISTANCE_DEFAULT;
+ camera_transform.translate(translation);
+ cursor.pos = camera_transform.origin;
+}
+
+void Node3DEditorViewport::_nav_zoom(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
+ const NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
+
+ real_t zoom_speed = 1 / 80.0;
+ int zoom_speed_modifier = 10;
+ if (nav_scheme == NAVIGATION_MAYA && p_event->get_shift()) {
+ zoom_speed *= zoom_speed_modifier;
+ }
+
+ NavigationZoomStyle zoom_style = (NavigationZoomStyle)EditorSettings::get_singleton()->get("editors/3d/navigation/zoom_style").operator int();
+ if (zoom_style == NAVIGATION_ZOOM_HORIZONTAL) {
+ if (p_relative.x > 0) {
+ scale_cursor_distance(1 - p_relative.x * zoom_speed);
+ } else if (p_relative.x < 0) {
+ scale_cursor_distance(1.0 / (1 + p_relative.x * zoom_speed));
+ }
+ } else {
+ if (p_relative.y > 0) {
+ scale_cursor_distance(1 + p_relative.y * zoom_speed);
+ } else if (p_relative.y < 0) {
+ scale_cursor_distance(1.0 / (1 - p_relative.y * zoom_speed));
+ }
+ }
+}
+
+void Node3DEditorViewport::_nav_orbit(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
+ if (lock_rotation) {
+ _nav_pan(p_event, p_relative);
+ return;
+ }
+
+ if (orthogonal && auto_orthogonal) {
+ _menu_option(VIEW_PERSPECTIVE);
+ }
+
+ const real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity");
+ const real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel);
+ const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis");
+ const bool invert_x_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_x_axis");
+
+ if (invert_y_axis) {
+ cursor.x_rot -= p_relative.y * radians_per_pixel;
+ } else {
+ cursor.x_rot += p_relative.y * radians_per_pixel;
+ }
+ // Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
+ cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57);
+
+ if (invert_x_axis) {
+ cursor.y_rot -= p_relative.x * radians_per_pixel;
+ } else {
+ cursor.y_rot += p_relative.x * radians_per_pixel;
+ }
+ name = "";
+ _update_name();
+}
+
+void Node3DEditorViewport::_nav_look(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
+ if (orthogonal) {
+ _nav_pan(p_event, p_relative);
+ return;
+ }
+
+ if (orthogonal && auto_orthogonal) {
+ _menu_option(VIEW_PERSPECTIVE);
+ }
+
+ const real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_sensitivity");
+ const real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel);
+ const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis");
+
+ // Note: do NOT assume the camera has the "current" transform, because it is interpolated and may have "lag".
+ const Transform prev_camera_transform = to_camera_transform(cursor);
+
+ if (invert_y_axis) {
+ cursor.x_rot -= p_relative.y * radians_per_pixel;
+ } else {
+ cursor.x_rot += p_relative.y * radians_per_pixel;
+ }
+ // Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
+ cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57);
+
+ cursor.y_rot += p_relative.x * radians_per_pixel;
+
+ // Look is like the opposite of Orbit: the focus point rotates around the camera
+ Transform camera_transform = to_camera_transform(cursor);
+ Vector3 pos = camera_transform.xform(Vector3(0, 0, 0));
+ Vector3 prev_pos = prev_camera_transform.xform(Vector3(0, 0, 0));
+ Vector3 diff = prev_pos - pos;
+ cursor.pos += diff;
+
+ name = "";
+ _update_name();
+}
+
+void Node3DEditorViewport::set_freelook_active(bool active_now) {
+ if (!freelook_active && active_now) {
+ // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential
+ cursor = camera_cursor;
+
+ // Make sure eye_pos is synced, because freelook referential is eye pos rather than orbit pos
+ Vector3 forward = to_camera_transform(cursor).basis.xform(Vector3(0, 0, -1));
+ cursor.eye_pos = cursor.pos - cursor.distance * forward;
+ // Also sync the camera cursor, otherwise switching to freelook will be trippy if inertia is active
+ camera_cursor.eye_pos = cursor.eye_pos;
+
+ if (EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_speed_zoom_link")) {
+ // Re-adjust freelook speed from the current zoom level
+ real_t base_speed = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_base_speed");
+ freelook_speed = base_speed * cursor.distance;
+ }
+
+ previous_mouse_position = get_local_mouse_position();
+
+ // Hide mouse like in an FPS (warping doesn't work)
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
+
+ } else if (freelook_active && !active_now) {
+ // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential
+ cursor = camera_cursor;
+
+ // Restore mouse
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
+
+ // Restore the previous mouse position when leaving freelook mode.
+ // This is done because leaving `Input.MOUSE_MODE_CAPTURED` will center the cursor
+ // due to OS limitations.
+ warp_mouse(previous_mouse_position);
+ }
+
+ freelook_active = active_now;
+}
+
+void Node3DEditorViewport::scale_cursor_distance(real_t scale) {
+ // Prevents zero distance which would short-circuit any scaling
+ if (cursor.distance < ZOOM_MIN_DISTANCE) {
+ cursor.distance = ZOOM_MIN_DISTANCE;
+ }
+
+ cursor.distance *= scale;
+
+ if (cursor.distance < ZOOM_MIN_DISTANCE) {
+ cursor.distance = ZOOM_MIN_DISTANCE;
+ }
+
+ zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S;
+ surface->update();
+}
+
+void Node3DEditorViewport::scale_freelook_speed(real_t scale) {
+ // Prevents zero distance which would short-circuit any scaling
+ if (freelook_speed < FREELOOK_MIN_SPEED) {
+ freelook_speed = FREELOOK_MIN_SPEED;
+ }
+
+ freelook_speed *= scale;
+
+ if (freelook_speed < FREELOOK_MIN_SPEED) {
+ freelook_speed = FREELOOK_MIN_SPEED;
+ }
+
+ zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S;
+ surface->update();
+}
+
+Point2i Node3DEditorViewport::_get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_ev_mouse_motion) const {
+ Point2i relative;
+ if (bool(EDITOR_DEF("editors/3d/navigation/warped_mouse_panning", false))) {
+ relative = Input::get_singleton()->warp_mouse_motion(p_ev_mouse_motion, surface->get_global_rect());
+ } else {
+ relative = p_ev_mouse_motion->get_relative();
+ }
+ return relative;
+}
+
+static bool is_shortcut_pressed(const String &p_path) {
+ Ref<Shortcut> shortcut = ED_GET_SHORTCUT(p_path);
+ if (shortcut.is_null()) {
+ return false;
+ }
+ InputEventKey *k = Object::cast_to<InputEventKey>(shortcut->get_shortcut().ptr());
+ if (k == nullptr) {
+ return false;
+ }
+ const Input &input = *Input::get_singleton();
+ int keycode = k->get_keycode();
+ return input.is_key_pressed(keycode);
+}
+
+void Node3DEditorViewport::_update_freelook(real_t delta) {
+ if (!is_freelook_active()) {
+ return;
+ }
+
+ const FreelookNavigationScheme navigation_scheme = (FreelookNavigationScheme)EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_navigation_scheme").operator int();
+
+ Vector3 forward;
+ if (navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) {
+ // Forward/backward keys will always go straight forward/backward, never moving on the Y axis.
+ forward = Vector3(0, 0, -1).rotated(Vector3(0, 1, 0), camera->get_rotation().y);
+ } else {
+ // Forward/backward keys will be relative to the camera pitch.
+ forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
+ }
+
+ const Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
+
+ Vector3 up;
+ if (navigation_scheme == FREELOOK_PARTIALLY_AXIS_LOCKED || navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) {
+ // Up/down keys will always go up/down regardless of camera pitch.
+ up = Vector3(0, 1, 0);
+ } else {
+ // Up/down keys will be relative to the camera pitch.
+ up = camera->get_transform().basis.xform(Vector3(0, 1, 0));
+ }
+
+ Vector3 direction;
+
+ if (is_shortcut_pressed("spatial_editor/freelook_left")) {
+ direction -= right;
+ }
+ if (is_shortcut_pressed("spatial_editor/freelook_right")) {
+ direction += right;
+ }
+ if (is_shortcut_pressed("spatial_editor/freelook_forward")) {
+ direction += forward;
+ }
+ if (is_shortcut_pressed("spatial_editor/freelook_backwards")) {
+ direction -= forward;
+ }
+ if (is_shortcut_pressed("spatial_editor/freelook_up")) {
+ direction += up;
+ }
+ if (is_shortcut_pressed("spatial_editor/freelook_down")) {
+ direction -= up;
+ }
+
+ real_t speed = freelook_speed;
+
+ if (is_shortcut_pressed("spatial_editor/freelook_speed_modifier")) {
+ speed *= 3.0;
+ }
+ if (is_shortcut_pressed("spatial_editor/freelook_slow_modifier")) {
+ speed *= 0.333333;
+ }
+
+ const Vector3 motion = direction * speed * delta;
+ cursor.pos += motion;
+ cursor.eye_pos += motion;
+}
+
+void Node3DEditorViewport::set_message(String p_message, float p_time) {
+ message = p_message;
+ message_time = p_time;
+}
+
+void Node3DEditorPlugin::edited_scene_changed() {
+ for (uint32_t i = 0; i < Node3DEditor::VIEWPORTS_COUNT; i++) {
+ Node3DEditorViewport *viewport = Node3DEditor::get_singleton()->get_editor_viewport(i);
+ if (viewport->is_visible()) {
+ viewport->notification(Control::NOTIFICATION_VISIBILITY_CHANGED);
+ }
+ }
+}
+
+void Node3DEditorViewport::_notification(int p_what) {
+ if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+ bool visible = is_visible_in_tree();
+
+ set_process(visible);
+
+ if (visible) {
+ orthogonal = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL));
+ _update_name();
+ _update_camera(0);
+ } else {
+ set_freelook_active(false);
+ }
+ call_deferred("update_transform_gizmo_view");
+ rotation_control->set_visible(EditorSettings::get_singleton()->get("editors/3d/navigation/show_viewport_rotation_gizmo"));
+ }
+
+ if (p_what == NOTIFICATION_RESIZED) {
+ call_deferred("update_transform_gizmo_view");
+ }
+
+ if (p_what == NOTIFICATION_PROCESS) {
+ real_t delta = get_process_delta_time();
+
+ if (zoom_indicator_delay > 0) {
+ zoom_indicator_delay -= delta;
+ if (zoom_indicator_delay <= 0) {
+ surface->update();
+ }
+ }
+
+ _update_freelook(delta);
+
+ Node *scene_root = editor->get_scene_tree_dock()->get_editor_data()->get_edited_scene_root();
+ if (previewing_cinema && scene_root != nullptr) {
+ Camera3D *cam = scene_root->get_viewport()->get_camera();
+ if (cam != nullptr && cam != previewing) {
+ //then switch the viewport's camera to the scene's viewport camera
+ if (previewing != nullptr) {
+ previewing->disconnect("tree_exited", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
+ }
+ previewing = cam;
+ previewing->connect("tree_exited", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
+ RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera());
+ surface->update();
+ }
+ }
+
+ _update_camera(delta);
+
+ Map<Node *, Object *> &selection = editor_selection->get_selection();
+
+ bool changed = false;
+ bool exist = false;
+
+ for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->key());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ Transform t = sp->get_global_gizmo_transform();
+
+ exist = true;
+ if (se->last_xform == t && !se->last_xform_dirty) {
+ continue;
+ }
+ changed = true;
+ se->last_xform_dirty = false;
+ se->last_xform = t;
+
+ VisualInstance3D *vi = Object::cast_to<VisualInstance3D>(sp);
+
+ se->aabb = vi ? vi->get_aabb() : _calculate_spatial_bounds(sp);
+
+ t.translate(se->aabb.position);
+
+ // apply AABB scaling before item's global transform
+ Basis aabb_s;
+ aabb_s.scale(se->aabb.size);
+ t.basis = t.basis * aabb_s;
+
+ RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance, t);
+ }
+
+ if (changed || (spatial_editor->is_gizmo_visible() && !exist)) {
+ spatial_editor->update_transform_gizmo();
+ }
+
+ if (message_time > 0) {
+ if (message != last_message) {
+ surface->update();
+ last_message = message;
+ }
+
+ message_time -= get_physics_process_delta_time();
+ if (message_time < 0) {
+ surface->update();
+ }
+ }
+
+ //update shadow atlas if changed
+
+ int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/size");
+ int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_0_subdiv");
+ int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_1_subdiv");
+ int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_2_subdiv");
+ int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_3_subdiv");
+
+ viewport->set_shadow_atlas_size(shadowmap_size);
+ viewport->set_shadow_atlas_quadrant_subdiv(0, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q0));
+ viewport->set_shadow_atlas_quadrant_subdiv(1, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q1));
+ viewport->set_shadow_atlas_quadrant_subdiv(2, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q2));
+ viewport->set_shadow_atlas_quadrant_subdiv(3, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q3));
+
+ bool shrink = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION));
+
+ if (shrink != (subviewport_container->get_stretch_shrink() > 1)) {
+ subviewport_container->set_stretch_shrink(shrink ? 2 : 1);
+ }
+
+ //update msaa if changed
+
+ int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/screen_filters/msaa");
+ viewport->set_msaa(Viewport::MSAA(msaa_mode));
+ int ssaa_mode = GLOBAL_GET("rendering/quality/screen_filters/screen_space_aa");
+ viewport->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode));
+
+ bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION));
+ if (show_info != info_label->is_visible()) {
+ info_label->set_visible(show_info);
+ }
+
+ Camera3D *current_camera;
+
+ if (previewing) {
+ current_camera = previewing;
+ } else {
+ current_camera = camera;
+ }
+
+ if (show_info) {
+ String text;
+ text += "X: " + rtos(current_camera->get_translation().x).pad_decimals(1) + "\n";
+ text += "Y: " + rtos(current_camera->get_translation().y).pad_decimals(1) + "\n";
+ text += "Z: " + rtos(current_camera->get_translation().z).pad_decimals(1) + "\n";
+ text += TTR("Pitch") + ": " + itos(Math::round(current_camera->get_rotation_degrees().x)) + "\n";
+ text += TTR("Yaw") + ": " + itos(Math::round(current_camera->get_rotation_degrees().y)) + "\n\n";
+ text += TTR("Objects Drawn") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_OBJECTS_IN_FRAME)) + "\n";
+ text += TTR("Material Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_MATERIAL_CHANGES_IN_FRAME)) + "\n";
+ text += TTR("Shader Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SHADER_CHANGES_IN_FRAME)) + "\n";
+ text += TTR("Surface Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SURFACE_CHANGES_IN_FRAME)) + "\n";
+ text += TTR("Draw Calls") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)) + "\n";
+ text += TTR("Vertices") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_VERTICES_IN_FRAME));
+
+ info_label->set_text(text);
+ }
+
+ // FPS Counter.
+ bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME));
+
+ if (show_fps != fps_label->is_visible()) {
+ fps_label->set_visible(show_fps);
+ RS::get_singleton()->viewport_set_measure_render_time(viewport->get_viewport_rid(), show_fps);
+ for (int i = 0; i < FRAME_TIME_HISTORY; i++) {
+ cpu_time_history[i] = 0;
+ gpu_time_history[i] = 0;
+ }
+ cpu_time_history_index = 0;
+ cpu_time_history_index = 0;
+ }
+ if (show_fps) {
+ cpu_time_history[cpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_cpu(viewport->get_viewport_rid());
+ cpu_time_history_index = (cpu_time_history_index + 1) % FRAME_TIME_HISTORY;
+ float cpu_time = 0.0;
+ for (int i = 0; i < FRAME_TIME_HISTORY; i++) {
+ cpu_time += cpu_time_history[i];
+ }
+ cpu_time /= FRAME_TIME_HISTORY;
+
+ gpu_time_history[gpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_gpu(viewport->get_viewport_rid());
+ gpu_time_history_index = (gpu_time_history_index + 1) % FRAME_TIME_HISTORY;
+ float gpu_time = 0.0;
+ for (int i = 0; i < FRAME_TIME_HISTORY; i++) {
+ gpu_time += gpu_time_history[i];
+ }
+ gpu_time /= FRAME_TIME_HISTORY;
+
+ String text;
+ text += TTR("CPU Time") + ": " + String::num(cpu_time, 1) + " ms\n";
+ text += TTR("GPU Time") + ": " + String::num(gpu_time, 1) + " ms\n";
+ text += TTR("FPS") + ": " + itos(1000.0 / gpu_time);
+
+ fps_label->set_text(text);
+ }
+
+ bool show_cinema = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
+ cinema_label->set_visible(show_cinema);
+ if (show_cinema) {
+ float cinema_half_width = cinema_label->get_size().width / 2.0f;
+ cinema_label->set_anchor_and_margin(MARGIN_LEFT, 0.5f, -cinema_half_width);
+ }
+
+ if (lock_rotation) {
+ float locked_half_width = locked_label->get_size().width / 2.0f;
+ locked_label->set_anchor_and_margin(MARGIN_LEFT, 0.5f, -locked_half_width);
+ }
+ }
+
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ surface->connect("draw", callable_mp(this, &Node3DEditorViewport::_draw));
+ surface->connect("gui_input", callable_mp(this, &Node3DEditorViewport::_sinput));
+ surface->connect("mouse_entered", callable_mp(this, &Node3DEditorViewport::_surface_mouse_enter));
+ surface->connect("mouse_exited", callable_mp(this, &Node3DEditorViewport::_surface_mouse_exit));
+ surface->connect("focus_entered", callable_mp(this, &Node3DEditorViewport::_surface_focus_enter));
+ surface->connect("focus_exited", callable_mp(this, &Node3DEditorViewport::_surface_focus_exit));
+
+ _init_gizmo_instance(index);
+ }
+
+ if (p_what == NOTIFICATION_EXIT_TREE) {
+ _finish_gizmo_instances();
+ }
+
+ if (p_what == NOTIFICATION_THEME_CHANGED) {
+ view_menu->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons"));
+ preview_camera->set_icon(get_theme_icon("Camera3D", "EditorIcons"));
+
+ view_menu->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ view_menu->add_theme_style_override("hover", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ view_menu->add_theme_style_override("pressed", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ view_menu->add_theme_style_override("focus", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ view_menu->add_theme_style_override("disabled", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+
+ preview_camera->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ preview_camera->add_theme_style_override("hover", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ preview_camera->add_theme_style_override("pressed", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ preview_camera->add_theme_style_override("focus", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ preview_camera->add_theme_style_override("disabled", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+
+ info_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ fps_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ cinema_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ locked_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox("Information3dViewport", "EditorStyles"));
+ }
+}
+
+static void draw_indicator_bar(Control &surface, real_t fill, const Ref<Texture2D> icon, const Ref<Font> font, const String &text) {
+ // Adjust bar size from control height
+ const Vector2 surface_size = surface.get_size();
+ const real_t h = surface_size.y / 2.0;
+ const real_t y = (surface_size.y - h) / 2.0;
+
+ const Rect2 r(10 * EDSCALE, y, 6 * EDSCALE, h);
+ const real_t sy = r.size.y * fill;
+
+ // Note: because this bar appears over the viewport, it has to stay readable for any background color
+ // Draw both neutral dark and bright colors to account this
+ surface.draw_rect(r, Color(1, 1, 1, 0.2));
+ surface.draw_rect(Rect2(r.position.x, r.position.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6));
+ surface.draw_rect(r.grow(1), Color(0, 0, 0, 0.7), false, Math::round(EDSCALE));
+
+ const Vector2 icon_size = icon->get_size();
+ const Vector2 icon_pos = Vector2(r.position.x - (icon_size.x - r.size.x) / 2, r.position.y + r.size.y + 2 * EDSCALE);
+ surface.draw_texture(icon, icon_pos);
+
+ // Draw text below the bar (for speed/zoom information).
+ surface.draw_string(font, Vector2(icon_pos.x, icon_pos.y + icon_size.y + 16 * EDSCALE), text);
+}
+
+void Node3DEditorViewport::_draw() {
+ EditorPluginList *over_plugin_list = EditorNode::get_singleton()->get_editor_plugins_over();
+ if (!over_plugin_list->empty()) {
+ over_plugin_list->forward_spatial_draw_over_viewport(surface);
+ }
+
+ EditorPluginList *force_over_plugin_list = editor->get_editor_plugins_force_over();
+ if (!force_over_plugin_list->empty()) {
+ force_over_plugin_list->forward_spatial_force_draw_over_viewport(surface);
+ }
+
+ if (surface->has_focus()) {
+ Size2 size = surface->get_size();
+ Rect2 r = Rect2(Point2(), size);
+ get_theme_stylebox("Focus", "EditorStyles")->draw(surface->get_canvas_item(), r);
+ }
+
+ if (cursor.region_select) {
+ const Rect2 selection_rect = Rect2(cursor.region_begin, cursor.region_end - cursor.region_begin);
+
+ surface->draw_rect(
+ selection_rect,
+ get_theme_color("box_selection_fill_color", "Editor"));
+
+ surface->draw_rect(
+ selection_rect,
+ get_theme_color("box_selection_stroke_color", "Editor"),
+ false,
+ Math::round(EDSCALE));
+ }
+
+ RID ci = surface->get_canvas_item();
+
+ if (message_time > 0) {
+ Ref<Font> font = get_theme_font("font", "Label");
+ Point2 msgpos = Point2(5, get_size().y - 20);
+ font->draw(ci, msgpos + Point2(1, 1), message, Color(0, 0, 0, 0.8));
+ font->draw(ci, msgpos + Point2(-1, -1), message, Color(0, 0, 0, 0.8));
+ font->draw(ci, msgpos, message, Color(1, 1, 1, 1));
+ }
+
+ if (_edit.mode == TRANSFORM_ROTATE) {
+ Point2 center = _point_to_screen(_edit.center);
+ RenderingServer::get_singleton()->canvas_item_add_line(
+ ci,
+ _edit.mouse_pos,
+ center,
+ get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.6),
+ Math::round(2 * EDSCALE));
+ }
+ if (previewing) {
+ Size2 ss = Size2(ProjectSettings::get_singleton()->get("display/window/size/width"), ProjectSettings::get_singleton()->get("display/window/size/height"));
+ float aspect = ss.aspect();
+ Size2 s = get_size();
+
+ Rect2 draw_rect;
+
+ switch (previewing->get_keep_aspect_mode()) {
+ case Camera3D::KEEP_WIDTH: {
+ draw_rect.size = Size2(s.width, s.width / aspect);
+ draw_rect.position.x = 0;
+ draw_rect.position.y = (s.height - draw_rect.size.y) * 0.5;
+
+ } break;
+ case Camera3D::KEEP_HEIGHT: {
+ draw_rect.size = Size2(s.height * aspect, s.height);
+ draw_rect.position.y = 0;
+ draw_rect.position.x = (s.width - draw_rect.size.x) * 0.5;
+
+ } break;
+ }
+
+ draw_rect = Rect2(Vector2(), s).clip(draw_rect);
+
+ surface->draw_rect(draw_rect, Color(0.6, 0.6, 0.1, 0.5), false, Math::round(2 * EDSCALE));
+
+ } else {
+ if (zoom_indicator_delay > 0.0) {
+ if (is_freelook_active()) {
+ // Show speed
+
+ real_t min_speed = FREELOOK_MIN_SPEED;
+ real_t max_speed = camera->get_zfar();
+ real_t scale_length = (max_speed - min_speed);
+
+ if (!Math::is_zero_approx(scale_length)) {
+ real_t logscale_t = 1.0 - Math::log(1 + freelook_speed - min_speed) / Math::log(1 + scale_length);
+
+ // There is no real maximum speed so that factor can become negative,
+ // Let's make it look asymptotic instead (will decrease slower and slower).
+ if (logscale_t < 0.25) {
+ logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0);
+ }
+
+ // Display the freelook speed to help the user get a better sense of scale.
+ const int precision = freelook_speed < 1.0 ? 2 : 1;
+ draw_indicator_bar(
+ *surface,
+ 1.0 - logscale_t,
+ get_theme_icon("ViewportSpeed", "EditorIcons"),
+ get_theme_font("font", "Label"),
+ vformat("%s u/s", String::num(freelook_speed).pad_decimals(precision)));
+ }
+
+ } else {
+ // Show zoom
+
+ real_t min_distance = ZOOM_MIN_DISTANCE; // TODO Why not pick znear to limit zoom?
+ real_t max_distance = camera->get_zfar();
+ real_t scale_length = (max_distance - min_distance);
+
+ if (!Math::is_zero_approx(scale_length)) {
+ real_t logscale_t = 1.0 - Math::log(1 + cursor.distance - min_distance) / Math::log(1 + scale_length);
+
+ // There is no real maximum distance so that factor can become negative,
+ // Let's make it look asymptotic instead (will decrease slower and slower).
+ if (logscale_t < 0.25) {
+ logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0);
+ }
+
+ // Display the zoom center distance to help the user get a better sense of scale.
+ const int precision = cursor.distance < 1.0 ? 2 : 1;
+ draw_indicator_bar(
+ *surface,
+ logscale_t,
+ get_theme_icon("ViewportZoom", "EditorIcons"),
+ get_theme_font("font", "Label"),
+ vformat("%s u", String::num(cursor.distance).pad_decimals(precision)));
+ }
+ }
+ }
+ }
+}
+
+void Node3DEditorViewport::_menu_option(int p_option) {
+ switch (p_option) {
+ case VIEW_TOP: {
+ cursor.y_rot = 0;
+ cursor.x_rot = Math_PI / 2.0;
+ set_message(TTR("Top View."), 2);
+ name = TTR("Top");
+ _set_auto_orthogonal();
+ _update_name();
+
+ } break;
+ case VIEW_BOTTOM: {
+ cursor.y_rot = 0;
+ cursor.x_rot = -Math_PI / 2.0;
+ set_message(TTR("Bottom View."), 2);
+ name = TTR("Bottom");
+ _set_auto_orthogonal();
+ _update_name();
+
+ } break;
+ case VIEW_LEFT: {
+ cursor.x_rot = 0;
+ cursor.y_rot = Math_PI / 2.0;
+ set_message(TTR("Left View."), 2);
+ name = TTR("Left");
+ _set_auto_orthogonal();
+ _update_name();
+
+ } break;
+ case VIEW_RIGHT: {
+ cursor.x_rot = 0;
+ cursor.y_rot = -Math_PI / 2.0;
+ set_message(TTR("Right View."), 2);
+ name = TTR("Right");
+ _set_auto_orthogonal();
+ _update_name();
+
+ } break;
+ case VIEW_FRONT: {
+ cursor.x_rot = 0;
+ cursor.y_rot = 0;
+ set_message(TTR("Front View."), 2);
+ name = TTR("Front");
+ _set_auto_orthogonal();
+ _update_name();
+
+ } break;
+ case VIEW_REAR: {
+ cursor.x_rot = 0;
+ cursor.y_rot = Math_PI;
+ set_message(TTR("Rear View."), 2);
+ name = TTR("Rear");
+ _set_auto_orthogonal();
+ _update_name();
+
+ } break;
+ case VIEW_CENTER_TO_ORIGIN: {
+ cursor.pos = Vector3(0, 0, 0);
+
+ } break;
+ case VIEW_CENTER_TO_SELECTION: {
+ focus_selection();
+
+ } break;
+ case VIEW_ALIGN_TRANSFORM_WITH_VIEW: {
+ if (!get_selected_count()) {
+ break;
+ }
+
+ Transform camera_transform = camera->get_global_transform();
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ undo_redo->create_action(TTR("Align Transform with View"));
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ Transform xform;
+ if (orthogonal) {
+ xform = sp->get_global_transform();
+ xform.basis.set_euler(camera_transform.basis.get_euler());
+ } else {
+ xform = camera_transform;
+ xform.scale_basis(sp->get_scale());
+ }
+
+ undo_redo->add_do_method(sp, "set_global_transform", xform);
+ undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_gizmo_transform());
+ }
+ undo_redo->commit_action();
+
+ } break;
+ case VIEW_ALIGN_ROTATION_WITH_VIEW: {
+ if (!get_selected_count()) {
+ break;
+ }
+
+ Transform camera_transform = camera->get_global_transform();
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ undo_redo->create_action(TTR("Align Rotation with View"));
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ undo_redo->add_do_method(sp, "set_rotation", camera_transform.basis.get_rotation());
+ undo_redo->add_undo_method(sp, "set_rotation", sp->get_rotation());
+ }
+ undo_redo->commit_action();
+
+ } break;
+ case VIEW_ENVIRONMENT: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ current = !current;
+ if (current) {
+ camera->set_environment(RES());
+ } else {
+ camera->set_environment(Node3DEditor::get_singleton()->get_viewport_environment());
+ }
+
+ view_menu->get_popup()->set_item_checked(idx, current);
+
+ } break;
+ case VIEW_PERSPECTIVE: {
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), true);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), false);
+ orthogonal = false;
+ auto_orthogonal = false;
+ call_deferred("update_transform_gizmo_view");
+ _update_name();
+
+ } break;
+ case VIEW_ORTHOGONAL: {
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), true);
+ orthogonal = true;
+ auto_orthogonal = false;
+ call_deferred("update_transform_gizmo_view");
+ _update_name();
+
+ } break;
+ case VIEW_AUTO_ORTHOGONAL: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_AUTO_ORTHOGONAL);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ current = !current;
+ view_menu->get_popup()->set_item_checked(idx, current);
+ if (auto_orthogonal) {
+ auto_orthogonal = false;
+ _update_name();
+ }
+ } break;
+ case VIEW_LOCK_ROTATION: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_LOCK_ROTATION);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ lock_rotation = !current;
+ view_menu->get_popup()->set_item_checked(idx, !current);
+ if (lock_rotation) {
+ locked_label->show();
+ } else {
+ locked_label->hide();
+ }
+
+ } break;
+ case VIEW_AUDIO_LISTENER: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ current = !current;
+ viewport->set_as_audio_listener(current);
+ view_menu->get_popup()->set_item_checked(idx, current);
+
+ } break;
+ case VIEW_AUDIO_DOPPLER: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ current = !current;
+ camera->set_doppler_tracking(current ? Camera3D::DOPPLER_TRACKING_IDLE_STEP : Camera3D::DOPPLER_TRACKING_DISABLED);
+ view_menu->get_popup()->set_item_checked(idx, current);
+
+ } break;
+ case VIEW_CINEMATIC_PREVIEW: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ current = !current;
+ view_menu->get_popup()->set_item_checked(idx, current);
+ previewing_cinema = true;
+ _toggle_cinema_preview(current);
+
+ if (current) {
+ preview_camera->hide();
+ } else {
+ if (previewing != nullptr) {
+ preview_camera->show();
+ }
+ }
+ } break;
+ case VIEW_GIZMOS: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ current = !current;
+ if (current) {
+ camera->set_cull_mask(((1 << 20) - 1) | (1 << (GIZMO_BASE_LAYER + index)) | (1 << GIZMO_EDIT_LAYER) | (1 << GIZMO_GRID_LAYER));
+ } else {
+ camera->set_cull_mask(((1 << 20) - 1) | (1 << (GIZMO_BASE_LAYER + index)) | (1 << GIZMO_GRID_LAYER));
+ }
+ view_menu->get_popup()->set_item_checked(idx, current);
+
+ } break;
+ case VIEW_HALF_RESOLUTION: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ current = !current;
+ view_menu->get_popup()->set_item_checked(idx, current);
+ } break;
+ case VIEW_INFORMATION: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_INFORMATION);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ view_menu->get_popup()->set_item_checked(idx, !current);
+
+ } break;
+ case VIEW_FRAME_TIME: {
+ int idx = view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME);
+ bool current = view_menu->get_popup()->is_item_checked(idx);
+ view_menu->get_popup()->set_item_checked(idx, !current);
+
+ } break;
+ case VIEW_DISPLAY_NORMAL:
+ case VIEW_DISPLAY_WIREFRAME:
+ case VIEW_DISPLAY_OVERDRAW:
+ case VIEW_DISPLAY_SHADELESS:
+ case VIEW_DISPLAY_LIGHTING:
+ case VIEW_DISPLAY_NORMAL_BUFFER:
+ case VIEW_DISPLAY_DEBUG_SHADOW_ATLAS:
+ case VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS:
+ case VIEW_DISPLAY_DEBUG_GIPROBE_ALBEDO:
+ case VIEW_DISPLAY_DEBUG_GIPROBE_LIGHTING:
+ case VIEW_DISPLAY_DEBUG_GIPROBE_EMISSION:
+ case VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE:
+ case VIEW_DISPLAY_DEBUG_SSAO:
+ case VIEW_DISPLAY_DEBUG_PSSM_SPLITS:
+ case VIEW_DISPLAY_DEBUG_DECAL_ATLAS:
+ case VIEW_DISPLAY_DEBUG_SDFGI:
+ case VIEW_DISPLAY_DEBUG_SDFGI_PROBES:
+ case VIEW_DISPLAY_DEBUG_GI_BUFFER: {
+ static const int display_options[] = {
+ VIEW_DISPLAY_NORMAL,
+ VIEW_DISPLAY_WIREFRAME,
+ VIEW_DISPLAY_OVERDRAW,
+ 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_GIPROBE_ALBEDO,
+ VIEW_DISPLAY_DEBUG_GIPROBE_LIGHTING,
+ VIEW_DISPLAY_DEBUG_GIPROBE_EMISSION,
+ VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE,
+ VIEW_DISPLAY_DEBUG_SSAO,
+ VIEW_DISPLAY_DEBUG_GI_BUFFER,
+ VIEW_DISPLAY_DEBUG_PSSM_SPLITS,
+ VIEW_DISPLAY_DEBUG_DECAL_ATLAS,
+ VIEW_DISPLAY_DEBUG_SDFGI,
+ VIEW_DISPLAY_DEBUG_SDFGI_PROBES,
+ VIEW_MAX
+ };
+ static const Viewport::DebugDraw debug_draw_modes[] = {
+ Viewport::DEBUG_DRAW_DISABLED,
+ Viewport::DEBUG_DRAW_WIREFRAME,
+ Viewport::DEBUG_DRAW_OVERDRAW,
+ 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_GI_PROBE_ALBEDO,
+ Viewport::DEBUG_DRAW_GI_PROBE_LIGHTING,
+ Viewport::DEBUG_DRAW_GI_PROBE_EMISSION,
+ Viewport::DEBUG_DRAW_SCENE_LUMINANCE,
+ Viewport::DEBUG_DRAW_SSAO,
+ Viewport::DEBUG_DRAW_GI_BUFFER,
+ Viewport::DEBUG_DRAW_PSSM_SPLITS,
+ Viewport::DEBUG_DRAW_DECAL_ATLAS,
+ Viewport::DEBUG_DRAW_SDFGI,
+ Viewport::DEBUG_DRAW_SDFGI_PROBES,
+ };
+
+ int idx = 0;
+
+ while (display_options[idx] != VIEW_MAX) {
+ int id = display_options[idx];
+ int item_idx = view_menu->get_popup()->get_item_index(id);
+ if (item_idx != -1) {
+ view_menu->get_popup()->set_item_checked(item_idx, id == p_option);
+ }
+ item_idx = display_submenu->get_item_index(id);
+ if (item_idx != -1) {
+ display_submenu->set_item_checked(item_idx, id == p_option);
+ }
+
+ if (id == p_option) {
+ viewport->set_debug_draw(debug_draw_modes[idx]);
+ }
+ idx++;
+ }
+ } break;
+ }
+}
+
+void Node3DEditorViewport::_set_auto_orthogonal() {
+ if (!orthogonal && view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUTO_ORTHOGONAL))) {
+ _menu_option(VIEW_ORTHOGONAL);
+ auto_orthogonal = true;
+ }
+}
+
+void Node3DEditorViewport::_preview_exited_scene() {
+ preview_camera->disconnect("toggled", callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview));
+ preview_camera->set_pressed(false);
+ _toggle_camera_preview(false);
+ preview_camera->connect("toggled", callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview));
+ view_menu->show();
+}
+
+void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
+ uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx);
+
+ for (int i = 0; i < 3; i++) {
+ move_gizmo_instance[i] = RS::get_singleton()->instance_create();
+ RS::get_singleton()->instance_set_base(move_gizmo_instance[i], spatial_editor->get_move_gizmo(i)->get_rid());
+ RS::get_singleton()->instance_set_scenario(move_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_set_visible(move_gizmo_instance[i], false);
+ RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
+ RS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i], layer);
+
+ move_plane_gizmo_instance[i] = RS::get_singleton()->instance_create();
+ RS::get_singleton()->instance_set_base(move_plane_gizmo_instance[i], spatial_editor->get_move_plane_gizmo(i)->get_rid());
+ RS::get_singleton()->instance_set_scenario(move_plane_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false);
+ RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
+ RS::get_singleton()->instance_set_layer_mask(move_plane_gizmo_instance[i], layer);
+
+ rotate_gizmo_instance[i] = RS::get_singleton()->instance_create();
+ RS::get_singleton()->instance_set_base(rotate_gizmo_instance[i], spatial_editor->get_rotate_gizmo(i)->get_rid());
+ RS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false);
+ RS::get_singleton()->instance_geometry_set_cast_shadows_setting(rotate_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
+ RS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i], layer);
+
+ scale_gizmo_instance[i] = RS::get_singleton()->instance_create();
+ RS::get_singleton()->instance_set_base(scale_gizmo_instance[i], spatial_editor->get_scale_gizmo(i)->get_rid());
+ RS::get_singleton()->instance_set_scenario(scale_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false);
+ RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
+ RS::get_singleton()->instance_set_layer_mask(scale_gizmo_instance[i], layer);
+
+ scale_plane_gizmo_instance[i] = RS::get_singleton()->instance_create();
+ RS::get_singleton()->instance_set_base(scale_plane_gizmo_instance[i], spatial_editor->get_scale_plane_gizmo(i)->get_rid());
+ RS::get_singleton()->instance_set_scenario(scale_plane_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false);
+ RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
+ RS::get_singleton()->instance_set_layer_mask(scale_plane_gizmo_instance[i], layer);
+ }
+}
+
+void Node3DEditorViewport::_finish_gizmo_instances() {
+ for (int i = 0; i < 3; i++) {
+ RS::get_singleton()->free(move_gizmo_instance[i]);
+ RS::get_singleton()->free(move_plane_gizmo_instance[i]);
+ RS::get_singleton()->free(rotate_gizmo_instance[i]);
+ RS::get_singleton()->free(scale_gizmo_instance[i]);
+ RS::get_singleton()->free(scale_plane_gizmo_instance[i]);
+ }
+}
+
+void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
+ ERR_FAIL_COND(p_activate && !preview);
+ ERR_FAIL_COND(!p_activate && !previewing);
+
+ rotation_control->set_visible(!p_activate);
+
+ if (!p_activate) {
+ previewing->disconnect("tree_exiting", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
+ previewing = nullptr;
+ RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
+ if (!preview) {
+ preview_camera->hide();
+ }
+ view_menu->set_disabled(false);
+ surface->update();
+
+ } else {
+ previewing = preview;
+ previewing->connect("tree_exiting", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
+ RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), preview->get_camera()); //replace
+ view_menu->set_disabled(true);
+ surface->update();
+ }
+}
+
+void Node3DEditorViewport::_toggle_cinema_preview(bool p_activate) {
+ previewing_cinema = p_activate;
+ if (!previewing_cinema) {
+ if (previewing != nullptr) {
+ previewing->disconnect("tree_exited", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
+ }
+
+ previewing = nullptr;
+ RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
+ preview_camera->set_pressed(false);
+ if (!preview) {
+ preview_camera->hide();
+ } else {
+ preview_camera->show();
+ }
+ view_menu->show();
+ surface->update();
+ }
+}
+
+void Node3DEditorViewport::_selection_result_pressed(int p_result) {
+ if (selection_results.size() <= p_result) {
+ return;
+ }
+
+ clicked = selection_results[p_result].item->get_instance_id();
+
+ if (clicked.is_valid()) {
+ _select_clicked(clicked_wants_append, true, spatial_editor->get_tool_mode() != Node3DEditor::TOOL_MODE_LIST_SELECT);
+ clicked = ObjectID();
+ }
+}
+
+void Node3DEditorViewport::_selection_menu_hide() {
+ selection_results.clear();
+ selection_menu->clear();
+ selection_menu->set_size(Vector2(0, 0));
+}
+
+void Node3DEditorViewport::set_can_preview(Camera3D *p_preview) {
+ preview = p_preview;
+
+ if (!preview_camera->is_pressed() && !previewing_cinema) {
+ preview_camera->set_visible(p_preview);
+ }
+}
+
+void Node3DEditorViewport::update_transform_gizmo_view() {
+ if (!is_visible_in_tree()) {
+ return;
+ }
+
+ Transform xform = spatial_editor->get_gizmo_transform();
+
+ Transform camera_xform = camera->get_transform();
+
+ if (xform.origin.distance_squared_to(camera_xform.origin) < 0.01) {
+ for (int i = 0; i < 3; i++) {
+ RenderingServer::get_singleton()->instance_set_visible(move_gizmo_instance[i], false);
+ RenderingServer::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false);
+ RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false);
+ RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false);
+ RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false);
+ }
+ return;
+ }
+
+ Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized();
+ Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized();
+ Plane p(camera_xform.origin, camz);
+ float gizmo_d = MAX(Math::abs(p.distance_to(xform.origin)), CMP_EPSILON);
+ float d0 = camera->unproject_position(camera_xform.origin + camz * gizmo_d).y;
+ float d1 = camera->unproject_position(camera_xform.origin + camz * gizmo_d + camy).y;
+ float dd = Math::abs(d0 - d1);
+ if (dd == 0) {
+ dd = 0.0001;
+ }
+
+ float gizmo_size = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_size");
+ // At low viewport heights, multiply the gizmo scale based on the viewport height.
+ // This prevents the gizmo from growing very large and going outside the viewport.
+ const int viewport_base_height = 400 * MAX(1, EDSCALE);
+ gizmo_scale =
+ (gizmo_size / Math::abs(dd)) * MAX(1, EDSCALE) *
+ MIN(viewport_base_height, subviewport_container->get_size().height) / viewport_base_height /
+ subviewport_container->get_stretch_shrink();
+ Vector3 scale = Vector3(1, 1, 1) * gizmo_scale;
+
+ xform.basis.scale(scale);
+
+ for (int i = 0; i < 3; i++) {
+ RenderingServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], xform);
+ RenderingServer::get_singleton()->instance_set_visible(move_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE));
+ RenderingServer::get_singleton()->instance_set_transform(move_plane_gizmo_instance[i], xform);
+ RenderingServer::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE));
+ RenderingServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[i], xform);
+ RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE));
+ RenderingServer::get_singleton()->instance_set_transform(scale_gizmo_instance[i], xform);
+ RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE));
+ RenderingServer::get_singleton()->instance_set_transform(scale_plane_gizmo_instance[i], xform);
+ RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE));
+ }
+}
+
+void Node3DEditorViewport::set_state(const Dictionary &p_state) {
+ if (p_state.has("position")) {
+ cursor.pos = p_state["position"];
+ }
+ if (p_state.has("x_rotation")) {
+ cursor.x_rot = p_state["x_rotation"];
+ }
+ if (p_state.has("y_rotation")) {
+ cursor.y_rot = p_state["y_rotation"];
+ }
+ if (p_state.has("distance")) {
+ cursor.distance = p_state["distance"];
+ }
+
+ if (p_state.has("use_orthogonal")) {
+ bool orth = p_state["use_orthogonal"];
+
+ if (orth) {
+ _menu_option(VIEW_ORTHOGONAL);
+ } else {
+ _menu_option(VIEW_PERSPECTIVE);
+ }
+ }
+ if (p_state.has("view_name")) {
+ name = p_state["view_name"];
+ _update_name();
+ }
+ if (p_state.has("auto_orthogonal")) {
+ auto_orthogonal = p_state["auto_orthogonal"];
+ _update_name();
+ }
+ if (p_state.has("auto_orthogonal_enabled")) {
+ bool enabled = p_state["auto_orthogonal_enabled"];
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUTO_ORTHOGONAL), enabled);
+ }
+ if (p_state.has("display_mode")) {
+ int display = p_state["display_mode"];
+
+ int idx = view_menu->get_popup()->get_item_index(display);
+ if (!view_menu->get_popup()->is_item_checked(idx)) {
+ _menu_option(display);
+ }
+ }
+ if (p_state.has("lock_rotation")) {
+ lock_rotation = p_state["lock_rotation"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_LOCK_ROTATION);
+ view_menu->get_popup()->set_item_checked(idx, lock_rotation);
+ }
+ if (p_state.has("use_environment")) {
+ bool env = p_state["use_environment"];
+
+ if (env != camera->get_environment().is_valid()) {
+ _menu_option(VIEW_ENVIRONMENT);
+ }
+ }
+ if (p_state.has("listener")) {
+ bool listener = p_state["listener"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER);
+ viewport->set_as_audio_listener(listener);
+ view_menu->get_popup()->set_item_checked(idx, listener);
+ }
+ if (p_state.has("doppler")) {
+ bool doppler = p_state["doppler"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER);
+ camera->set_doppler_tracking(doppler ? Camera3D::DOPPLER_TRACKING_IDLE_STEP : Camera3D::DOPPLER_TRACKING_DISABLED);
+ view_menu->get_popup()->set_item_checked(idx, doppler);
+ }
+ if (p_state.has("gizmos")) {
+ bool gizmos = p_state["gizmos"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
+ if (view_menu->get_popup()->is_item_checked(idx) != gizmos) {
+ _menu_option(VIEW_GIZMOS);
+ }
+ }
+ if (p_state.has("information")) {
+ bool information = p_state["information"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_INFORMATION);
+ if (view_menu->get_popup()->is_item_checked(idx) != information) {
+ _menu_option(VIEW_INFORMATION);
+ }
+ }
+ if (p_state.has("frame_time")) {
+ bool fps = p_state["frame_time"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME);
+ if (view_menu->get_popup()->is_item_checked(idx) != fps) {
+ _menu_option(VIEW_FRAME_TIME);
+ }
+ }
+ if (p_state.has("half_res")) {
+ bool half_res = p_state["half_res"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION);
+ view_menu->get_popup()->set_item_checked(idx, half_res);
+ }
+ if (p_state.has("cinematic_preview")) {
+ previewing_cinema = p_state["cinematic_preview"];
+
+ int idx = view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
+ view_menu->get_popup()->set_item_checked(idx, previewing_cinema);
+ }
+
+ if (preview_camera->is_connected("toggled", callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview))) {
+ preview_camera->disconnect("toggled", callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview));
+ }
+ if (p_state.has("previewing")) {
+ Node *pv = EditorNode::get_singleton()->get_edited_scene()->get_node(p_state["previewing"]);
+ if (Object::cast_to<Camera3D>(pv)) {
+ previewing = Object::cast_to<Camera3D>(pv);
+ previewing->connect("tree_exiting", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
+ RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace
+ view_menu->set_disabled(true);
+ surface->update();
+ preview_camera->set_pressed(true);
+ preview_camera->show();
+ }
+ }
+ preview_camera->connect("toggled", callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview));
+}
+
+Dictionary Node3DEditorViewport::get_state() const {
+ Dictionary d;
+ d["position"] = cursor.pos;
+ d["x_rotation"] = cursor.x_rot;
+ d["y_rotation"] = cursor.y_rot;
+ d["distance"] = cursor.distance;
+ d["use_environment"] = camera->get_environment().is_valid();
+ d["use_orthogonal"] = camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL;
+ d["view_name"] = name;
+ d["auto_orthogonal"] = auto_orthogonal;
+ d["auto_orthogonal_enabled"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUTO_ORTHOGONAL));
+ if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL))) {
+ d["display_mode"] = VIEW_DISPLAY_NORMAL;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME))) {
+ d["display_mode"] = VIEW_DISPLAY_WIREFRAME;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW))) {
+ d["display_mode"] = VIEW_DISPLAY_OVERDRAW;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS))) {
+ d["display_mode"] = VIEW_DISPLAY_SHADELESS;
+ }
+ d["listener"] = viewport->is_audio_listener();
+ d["doppler"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER));
+ d["gizmos"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS));
+ d["information"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION));
+ d["frame_time"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME));
+ d["half_res"] = subviewport_container->get_stretch_shrink() > 1;
+ d["cinematic_preview"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
+ if (previewing) {
+ d["previewing"] = EditorNode::get_singleton()->get_edited_scene()->get_path_to(previewing);
+ }
+ if (lock_rotation) {
+ d["lock_rotation"] = lock_rotation;
+ }
+
+ return d;
+}
+
+void Node3DEditorViewport::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("update_transform_gizmo_view"), &Node3DEditorViewport::update_transform_gizmo_view); // Used by call_deferred.
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &Node3DEditorViewport::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &Node3DEditorViewport::drop_data_fw);
+
+ ADD_SIGNAL(MethodInfo("toggle_maximize_view", PropertyInfo(Variant::OBJECT, "viewport")));
+ ADD_SIGNAL(MethodInfo("clicked", PropertyInfo(Variant::OBJECT, "viewport")));
+}
+
+void Node3DEditorViewport::reset() {
+ orthogonal = false;
+ auto_orthogonal = false;
+ lock_rotation = false;
+ message_time = 0;
+ message = "";
+ last_message = "";
+ name = "";
+
+ cursor = Cursor();
+ _update_name();
+}
+
+void Node3DEditorViewport::focus_selection() {
+ if (!get_selected_count()) {
+ return;
+ }
+
+ Vector3 center;
+ int count = 0;
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ center += sp->get_global_gizmo_transform().origin;
+ count++;
+ }
+
+ if (count != 0) {
+ center /= float(count);
+ }
+
+ cursor.pos = center;
+}
+
+void Node3DEditorViewport::assign_pending_data_pointers(Node3D *p_preview_node, AABB *p_preview_bounds, AcceptDialog *p_accept) {
+ preview_node = p_preview_node;
+ preview_bounds = p_preview_bounds;
+ accept = p_accept;
+}
+
+Vector3 Node3DEditorViewport::_get_instance_position(const Point2 &p_pos) const {
+ const float MAX_DISTANCE = 10;
+
+ Vector3 world_ray = _get_ray(p_pos);
+ Vector3 world_pos = _get_ray_pos(p_pos);
+
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(world_pos, world_ray, get_tree()->get_root()->get_world_3d()->get_scenario());
+ Set<Ref<EditorNode3DGizmo>> found_gizmos;
+
+ float closest_dist = MAX_DISTANCE;
+
+ Vector3 point = world_pos + world_ray * MAX_DISTANCE;
+ Vector3 normal = Vector3(0.0, 0.0, 0.0);
+
+ for (int i = 0; i < instances.size(); i++) {
+ MeshInstance3D *mesh_instance = Object::cast_to<MeshInstance3D>(ObjectDB::get_instance(instances[i]));
+
+ if (!mesh_instance) {
+ continue;
+ }
+
+ Ref<EditorNode3DGizmo> seg = mesh_instance->get_gizmo();
+
+ if ((!seg.is_valid()) || found_gizmos.has(seg)) {
+ continue;
+ }
+
+ found_gizmos.insert(seg);
+
+ Vector3 hit_point;
+ Vector3 hit_normal;
+ bool inters = seg->intersect_ray(camera, p_pos, hit_point, hit_normal, nullptr, false);
+
+ if (!inters) {
+ continue;
+ }
+
+ float dist = world_pos.distance_to(hit_point);
+
+ if (dist < 0) {
+ continue;
+ }
+
+ if (dist < closest_dist) {
+ closest_dist = dist;
+ point = hit_point;
+ normal = hit_normal;
+ }
+ }
+ Vector3 offset = Vector3();
+ for (int i = 0; i < 3; i++) {
+ if (normal[i] > 0.0) {
+ offset[i] = (preview_bounds->get_size()[i] - (preview_bounds->get_size()[i] + preview_bounds->get_position()[i]));
+ } else if (normal[i] < 0.0) {
+ offset[i] = -(preview_bounds->get_size()[i] + preview_bounds->get_position()[i]);
+ }
+ }
+ return point + offset;
+}
+
+AABB Node3DEditorViewport::_calculate_spatial_bounds(const Node3D *p_parent, bool p_exclude_toplevel_transform) {
+ AABB bounds;
+
+ const MeshInstance3D *mesh_instance = Object::cast_to<MeshInstance3D>(p_parent);
+ if (mesh_instance) {
+ bounds = mesh_instance->get_aabb();
+ }
+
+ for (int i = 0; i < p_parent->get_child_count(); i++) {
+ Node3D *child = Object::cast_to<Node3D>(p_parent->get_child(i));
+ if (child) {
+ AABB child_bounds = _calculate_spatial_bounds(child, false);
+
+ if (bounds.size == Vector3() && p_parent->get_class_name() == StringName("Node3D")) {
+ bounds = child_bounds;
+ } else {
+ bounds.merge_with(child_bounds);
+ }
+ }
+ }
+
+ if (bounds.size == Vector3() && p_parent->get_class_name() != StringName("Node3D")) {
+ bounds = AABB(Vector3(-0.2, -0.2, -0.2), Vector3(0.4, 0.4, 0.4));
+ }
+
+ if (!p_exclude_toplevel_transform) {
+ bounds = p_parent->get_transform().xform(bounds);
+ }
+
+ return bounds;
+}
+
+void Node3DEditorViewport::_create_preview(const Vector<String> &files) const {
+ for (int i = 0; i < files.size(); i++) {
+ String path = files[i];
+ RES res = ResourceLoader::load(path);
+ ERR_CONTINUE(res.is_null());
+ Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
+ Ref<Mesh> mesh = Ref<Mesh>(Object::cast_to<Mesh>(*res));
+ if (mesh != nullptr || scene != nullptr) {
+ if (mesh != nullptr) {
+ MeshInstance3D *mesh_instance = memnew(MeshInstance3D);
+ mesh_instance->set_mesh(mesh);
+ preview_node->add_child(mesh_instance);
+ } else {
+ if (scene.is_valid()) {
+ Node *instance = scene->instance();
+ if (instance) {
+ preview_node->add_child(instance);
+ }
+ }
+ }
+ editor->get_scene_root()->add_child(preview_node);
+ }
+ }
+ *preview_bounds = _calculate_spatial_bounds(preview_node);
+}
+
+void Node3DEditorViewport::_remove_preview() {
+ if (preview_node->get_parent()) {
+ for (int i = preview_node->get_child_count() - 1; i >= 0; i--) {
+ Node *node = preview_node->get_child(i);
+ node->queue_delete();
+ preview_node->remove_child(node);
+ }
+ editor->get_scene_root()->remove_child(preview_node);
+ }
+}
+
+bool Node3DEditorViewport::_cyclical_dependency_exists(const String &p_target_scene_path, Node *p_desired_node) {
+ if (p_desired_node->get_filename() == p_target_scene_path) {
+ return true;
+ }
+
+ int childCount = p_desired_node->get_child_count();
+ for (int i = 0; i < childCount; i++) {
+ Node *child = p_desired_node->get_child(i);
+ if (_cyclical_dependency_exists(p_target_scene_path, child)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool Node3DEditorViewport::_create_instance(Node *parent, String &path, const Point2 &p_point) {
+ RES res = ResourceLoader::load(path);
+ ERR_FAIL_COND_V(res.is_null(), false);
+
+ Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
+ Ref<Mesh> mesh = Ref<Mesh>(Object::cast_to<Mesh>(*res));
+
+ Node *instanced_scene = nullptr;
+
+ if (mesh != nullptr || scene != nullptr) {
+ if (mesh != nullptr) {
+ MeshInstance3D *mesh_instance = memnew(MeshInstance3D);
+ mesh_instance->set_mesh(mesh);
+ mesh_instance->set_name(path.get_file().get_basename());
+ instanced_scene = mesh_instance;
+ } else {
+ if (!scene.is_valid()) { // invalid scene
+ return false;
+ } else {
+ instanced_scene = scene->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
+ }
+ }
+ }
+
+ if (instanced_scene == nullptr) {
+ return false;
+ }
+
+ if (editor->get_edited_scene()->get_filename() != "") { // cyclical instancing
+ if (_cyclical_dependency_exists(editor->get_edited_scene()->get_filename(), instanced_scene)) {
+ memdelete(instanced_scene);
+ return false;
+ }
+ }
+
+ if (scene != nullptr) {
+ instanced_scene->set_filename(ProjectSettings::get_singleton()->localize_path(path));
+ }
+
+ editor_data->get_undo_redo().add_do_method(parent, "add_child", instanced_scene);
+ editor_data->get_undo_redo().add_do_method(instanced_scene, "set_owner", editor->get_edited_scene());
+ editor_data->get_undo_redo().add_do_reference(instanced_scene);
+ editor_data->get_undo_redo().add_undo_method(parent, "remove_child", instanced_scene);
+
+ String new_name = parent->validate_child_name(instanced_scene);
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_instance_node", editor->get_edited_scene()->get_path_to(parent), path, new_name);
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name));
+
+ Node3D *node3d = Object::cast_to<Node3D>(instanced_scene);
+ if (node3d) {
+ Transform global_transform;
+ Node3D *parent_node3d = Object::cast_to<Node3D>(parent);
+ if (parent_node3d) {
+ global_transform = parent_node3d->get_global_gizmo_transform();
+ }
+
+ global_transform.origin = spatial_editor->snap_point(_get_instance_position(p_point));
+ global_transform.basis *= node3d->get_transform().basis;
+
+ editor_data->get_undo_redo().add_do_method(instanced_scene, "set_global_transform", global_transform);
+ }
+
+ return true;
+}
+
+void Node3DEditorViewport::_perform_drop_data() {
+ _remove_preview();
+
+ Vector<String> error_files;
+
+ editor_data->get_undo_redo().create_action(TTR("Create Node"));
+
+ for (int i = 0; i < selected_files.size(); i++) {
+ String path = selected_files[i];
+ RES res = ResourceLoader::load(path);
+ if (res.is_null()) {
+ continue;
+ }
+ Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
+ Ref<Mesh> mesh = Ref<Mesh>(Object::cast_to<Mesh>(*res));
+ if (mesh != nullptr || scene != nullptr) {
+ bool success = _create_instance(target_node, path, drop_pos);
+ if (!success) {
+ error_files.push_back(path);
+ }
+ }
+ }
+
+ editor_data->get_undo_redo().commit_action();
+
+ if (error_files.size() > 0) {
+ String files_str;
+ for (int i = 0; i < error_files.size(); i++) {
+ files_str += error_files[i].get_file().get_basename() + ",";
+ }
+ files_str = files_str.substr(0, files_str.length() - 1);
+ accept->set_text(vformat(TTR("Error instancing scene from %s"), files_str.get_data()));
+ accept->popup_centered();
+ }
+}
+
+bool Node3DEditorViewport::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
+ bool can_instance = false;
+
+ if (!preview_node->is_inside_tree()) {
+ Dictionary d = p_data;
+ if (d.has("type") && (String(d["type"]) == "files")) {
+ Vector<String> files = d["files"];
+
+ List<String> scene_extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions);
+ List<String> mesh_extensions;
+ ResourceLoader::get_recognized_extensions_for_type("Mesh", &mesh_extensions);
+
+ for (int i = 0; i < files.size(); i++) {
+ if (mesh_extensions.find(files[i].get_extension()) || scene_extensions.find(files[i].get_extension())) {
+ RES res = ResourceLoader::load(files[i]);
+ if (res.is_null()) {
+ continue;
+ }
+
+ String type = res->get_class();
+ if (type == "PackedScene") {
+ Ref<PackedScene> sdata = ResourceLoader::load(files[i]);
+ Node *instanced_scene = sdata->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
+ if (!instanced_scene) {
+ continue;
+ }
+ memdelete(instanced_scene);
+ } else if (type == "Mesh" || type == "ArrayMesh" || type == "PrimitiveMesh") {
+ Ref<Mesh> mesh = ResourceLoader::load(files[i]);
+ if (!mesh.is_valid()) {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ can_instance = true;
+ break;
+ }
+ }
+ if (can_instance) {
+ _create_preview(files);
+ }
+ }
+ } else {
+ can_instance = true;
+ }
+
+ if (can_instance) {
+ Transform global_transform = Transform(Basis(), _get_instance_position(p_point));
+ preview_node->set_global_transform(global_transform);
+ }
+
+ return can_instance;
+}
+
+void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
+ return;
+ }
+
+ bool is_shift = Input::get_singleton()->is_key_pressed(KEY_SHIFT);
+
+ selected_files.clear();
+ Dictionary d = p_data;
+ if (d.has("type") && String(d["type"]) == "files") {
+ selected_files = d["files"];
+ }
+
+ List<Node *> list = editor->get_editor_selection()->get_selected_node_list();
+ if (list.size() == 0) {
+ Node *root_node = editor->get_edited_scene();
+ if (root_node) {
+ list.push_back(root_node);
+ } else {
+ accept->set_text(TTR("No parent to instance a child at."));
+ accept->popup_centered();
+ _remove_preview();
+ return;
+ }
+ }
+ if (list.size() != 1) {
+ accept->set_text(TTR("This operation requires a single selected node."));
+ accept->popup_centered();
+ _remove_preview();
+ return;
+ }
+
+ target_node = list[0];
+ if (is_shift && target_node != editor->get_edited_scene()) {
+ target_node = target_node->get_parent();
+ }
+ drop_pos = p_point;
+
+ _perform_drop_data();
+}
+
+Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, EditorNode *p_editor, int p_index) {
+ cpu_time_history_index = 0;
+ gpu_time_history_index = 0;
+
+ _edit.mode = TRANSFORM_NONE;
+ _edit.plane = TRANSFORM_VIEW;
+ _edit.edited_gizmo = 0;
+ _edit.snap = true;
+ _edit.gizmo_handle = 0;
+
+ index = p_index;
+ editor = p_editor;
+ editor_data = editor->get_scene_tree_dock()->get_editor_data();
+ editor_selection = editor->get_editor_selection();
+ undo_redo = editor->get_undo_redo();
+
+ clicked_includes_current = false;
+ orthogonal = false;
+ auto_orthogonal = false;
+ lock_rotation = false;
+ message_time = 0;
+ zoom_indicator_delay = 0.0;
+
+ spatial_editor = p_spatial_editor;
+ SubViewportContainer *c = memnew(SubViewportContainer);
+ subviewport_container = c;
+ c->set_stretch(true);
+ add_child(c);
+ c->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ viewport = memnew(SubViewport);
+ viewport->set_disable_input(true);
+
+ c->add_child(viewport);
+ surface = memnew(Control);
+ surface->set_drag_forwarding(this);
+ add_child(surface);
+ surface->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ surface->set_clip_contents(true);
+ camera = memnew(Camera3D);
+ camera->set_disable_gizmo(true);
+ camera->set_cull_mask(((1 << 20) - 1) | (1 << (GIZMO_BASE_LAYER + p_index)) | (1 << GIZMO_EDIT_LAYER) | (1 << GIZMO_GRID_LAYER));
+ viewport->add_child(camera);
+ camera->make_current();
+ surface->set_focus_mode(FOCUS_ALL);
+
+ VBoxContainer *vbox = memnew(VBoxContainer);
+ surface->add_child(vbox);
+ vbox->set_position(Point2(10, 10) * EDSCALE);
+
+ view_menu = memnew(MenuButton);
+ view_menu->set_flat(false);
+ vbox->add_child(view_menu);
+ view_menu->set_h_size_flags(0);
+
+ display_submenu = memnew(PopupMenu);
+ view_menu->get_popup()->add_child(display_submenu);
+
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/top_view"), VIEW_TOP);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/bottom_view"), VIEW_BOTTOM);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/left_view"), VIEW_LEFT);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/right_view"), VIEW_RIGHT);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/front_view"), VIEW_FRONT);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/rear_view"), VIEW_REAR);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_radio_check_item(TTR("Perspective") + " (" + ED_GET_SHORTCUT("spatial_editor/switch_perspective_orthogonal")->get_as_text() + ")", VIEW_PERSPECTIVE);
+ view_menu->get_popup()->add_radio_check_item(TTR("Orthogonal") + " (" + ED_GET_SHORTCUT("spatial_editor/switch_perspective_orthogonal")->get_as_text() + ")", VIEW_ORTHOGONAL);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), true);
+ view_menu->get_popup()->add_check_item(TTR("Auto Orthogonal Enabled"), VIEW_AUTO_ORTHOGONAL);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUTO_ORTHOGONAL), true);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_lock_rotation", TTR("Lock View Rotation")), VIEW_LOCK_ROTATION);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_normal", TTR("Display Normal")), VIEW_DISPLAY_NORMAL);
+ view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_wireframe", TTR("Display Wireframe")), VIEW_DISPLAY_WIREFRAME);
+ view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_overdraw", TTR("Display Overdraw")), VIEW_DISPLAY_OVERDRAW);
+ view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_lighting", TTR("Display Lighting")), VIEW_DISPLAY_LIGHTING);
+ view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_unshaded", TTR("Display Unshaded")), VIEW_DISPLAY_SHADELESS);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL), true);
+ display_submenu->add_radio_check_item(TTR("Directional Shadow Splits"), VIEW_DISPLAY_DEBUG_PSSM_SPLITS);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("Normal Buffer"), VIEW_DISPLAY_NORMAL_BUFFER);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("Shadow Atlas"), VIEW_DISPLAY_DEBUG_SHADOW_ATLAS);
+ display_submenu->add_radio_check_item(TTR("Directional Shadow"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("Decal Atlas"), VIEW_DISPLAY_DEBUG_DECAL_ATLAS);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("GIProbe Lighting"), VIEW_DISPLAY_DEBUG_GIPROBE_LIGHTING);
+ display_submenu->add_radio_check_item(TTR("GIProbe Albedo"), VIEW_DISPLAY_DEBUG_GIPROBE_ALBEDO);
+ display_submenu->add_radio_check_item(TTR("GIProbe Emission"), VIEW_DISPLAY_DEBUG_GIPROBE_EMISSION);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("SDFGI Cascades"), VIEW_DISPLAY_DEBUG_SDFGI);
+ display_submenu->add_radio_check_item(TTR("SDFGI Probes"), VIEW_DISPLAY_DEBUG_SDFGI_PROBES);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("Scene Luminance"), VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("SSAO"), VIEW_DISPLAY_DEBUG_SSAO);
+ display_submenu->add_separator();
+ display_submenu->add_radio_check_item(TTR("GI Buffer"), VIEW_DISPLAY_DEBUG_GI_BUFFER);
+ display_submenu->set_name("display_advanced");
+ view_menu->get_popup()->add_submenu_item(TTR("Display Advanced..."), "display_advanced", VIEW_DISPLAY_ADVANCED);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_environment", TTR("View Environment")), VIEW_ENVIRONMENT);
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_gizmos", TTR("View Gizmos")), VIEW_GIZMOS);
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_information", TTR("View Information")), VIEW_INFORMATION);
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_fps", TTR("View Frame Time")), VIEW_FRAME_TIME);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT), true);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_half_resolution", TTR("Half Resolution")), VIEW_HALF_RESOLUTION);
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_listener", TTR("Audio Listener")), VIEW_AUDIO_LISTENER);
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_doppler", TTR("Enable Doppler")), VIEW_AUDIO_DOPPLER);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS), true);
+
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_cinematic_preview", TTR("Cinematic Preview")), VIEW_CINEMATIC_PREVIEW);
+
+ view_menu->get_popup()->add_separator();
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_origin"), VIEW_CENTER_TO_ORIGIN);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_selection"), VIEW_CENTER_TO_SELECTION);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_transform_with_view"), VIEW_ALIGN_TRANSFORM_WITH_VIEW);
+ view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_rotation_with_view"), VIEW_ALIGN_ROTATION_WITH_VIEW);
+ view_menu->get_popup()->connect("id_pressed", callable_mp(this, &Node3DEditorViewport::_menu_option));
+ display_submenu->connect("id_pressed", callable_mp(this, &Node3DEditorViewport::_menu_option));
+ view_menu->set_disable_shortcuts(true);
+#ifndef _MSC_VER
+#warning this needs to be fixed
+#endif
+ //if (OS::get_singleton()->get_current_video_driver() == OS::VIDEO_DRIVER_GLES2) {
+ if (false) {
+ // Alternate display modes only work when using the Vulkan renderer; make this explicit.
+ const int normal_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL);
+ const int wireframe_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME);
+ const int overdraw_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW);
+ const int shadeless_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS);
+ const String unsupported_tooltip = TTR("Not available when using the GLES2 renderer.");
+
+ view_menu->get_popup()->set_item_disabled(normal_idx, true);
+ view_menu->get_popup()->set_item_tooltip(normal_idx, unsupported_tooltip);
+ view_menu->get_popup()->set_item_disabled(wireframe_idx, true);
+ view_menu->get_popup()->set_item_tooltip(wireframe_idx, unsupported_tooltip);
+ view_menu->get_popup()->set_item_disabled(overdraw_idx, true);
+ view_menu->get_popup()->set_item_tooltip(overdraw_idx, unsupported_tooltip);
+ view_menu->get_popup()->set_item_disabled(shadeless_idx, true);
+ view_menu->get_popup()->set_item_tooltip(shadeless_idx, unsupported_tooltip);
+ }
+
+ ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), KEY_A);
+ ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), KEY_D);
+ ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), KEY_W);
+ ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), KEY_S);
+ ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), KEY_E);
+ ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), KEY_Q);
+ ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), KEY_SHIFT);
+ ED_SHORTCUT("spatial_editor/freelook_slow_modifier", TTR("Freelook Slow Modifier"), KEY_ALT);
+
+ preview_camera = memnew(CheckBox);
+ preview_camera->set_text(TTR("Preview"));
+ vbox->add_child(preview_camera);
+ preview_camera->set_h_size_flags(0);
+ preview_camera->hide();
+ preview_camera->connect("toggled", callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview));
+ previewing = nullptr;
+ gizmo_scale = 1.0;
+
+ preview_node = nullptr;
+
+ info_label = memnew(Label);
+ info_label->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, -90 * EDSCALE);
+ info_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_END, -90 * EDSCALE);
+ info_label->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE);
+ info_label->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -10 * EDSCALE);
+ info_label->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+ info_label->set_v_grow_direction(GROW_DIRECTION_BEGIN);
+ surface->add_child(info_label);
+ info_label->hide();
+
+ fps_label = memnew(Label);
+ fps_label->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, -90 * EDSCALE);
+ fps_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE);
+ fps_label->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE);
+ fps_label->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+ fps_label->set_tooltip(TTR("Note: The FPS is estimated on a 60hz refresh rate."));
+ fps_label->set_mouse_filter(MOUSE_FILTER_PASS); // Otherwise tooltip doesn't show.
+ surface->add_child(fps_label);
+ fps_label->hide();
+
+ cinema_label = memnew(Label);
+ cinema_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE);
+ cinema_label->set_h_grow_direction(GROW_DIRECTION_END);
+ cinema_label->set_align(Label::ALIGN_CENTER);
+ surface->add_child(cinema_label);
+ cinema_label->set_text(TTR("Cinematic Preview"));
+ cinema_label->hide();
+ previewing_cinema = false;
+
+ locked_label = memnew(Label);
+ locked_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_END, -20 * EDSCALE);
+ locked_label->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -10 * EDSCALE);
+ locked_label->set_h_grow_direction(GROW_DIRECTION_END);
+ locked_label->set_v_grow_direction(GROW_DIRECTION_BEGIN);
+ locked_label->set_align(Label::ALIGN_CENTER);
+ surface->add_child(locked_label);
+ locked_label->set_text(TTR("View Rotation Locked"));
+ locked_label->hide();
+
+ top_right_vbox = memnew(VBoxContainer);
+ top_right_vbox->set_anchors_and_margins_preset(PRESET_TOP_RIGHT, PRESET_MODE_MINSIZE, 2.0 * EDSCALE);
+ top_right_vbox->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+
+ rotation_control = memnew(ViewportRotationControl);
+ rotation_control->set_custom_minimum_size(Size2(80, 80) * EDSCALE);
+ rotation_control->set_h_size_flags(SIZE_SHRINK_END);
+ rotation_control->set_viewport(this);
+ top_right_vbox->add_child(rotation_control);
+
+ fps_label = memnew(Label);
+ fps_label->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, -90 * EDSCALE);
+ fps_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE);
+ fps_label->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE);
+ fps_label->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+ fps_label->set_tooltip(TTR("Note: The FPS value displayed is the editor's framerate.\nIt cannot be used as a reliable indication of in-game performance."));
+ fps_label->set_mouse_filter(MOUSE_FILTER_PASS); // Otherwise tooltip doesn't show.
+ top_right_vbox->add_child(fps_label);
+ fps_label->hide();
+
+ surface->add_child(top_right_vbox);
+
+ accept = nullptr;
+
+ freelook_active = false;
+ freelook_speed = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_base_speed");
+
+ selection_menu = memnew(PopupMenu);
+ add_child(selection_menu);
+ selection_menu->set_min_size(Size2(100, 0) * EDSCALE);
+ selection_menu->connect("id_pressed", callable_mp(this, &Node3DEditorViewport::_selection_result_pressed));
+ selection_menu->connect("popup_hide", callable_mp(this, &Node3DEditorViewport::_selection_menu_hide));
+
+ if (p_index == 0) {
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER), true);
+ viewport->set_as_audio_listener(true);
+ }
+
+ name = "";
+ _update_name();
+
+ EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &Node3DEditorViewport::update_transform_gizmo_view));
+}
+
+//////////////////////////////////////////////////////////////
+
+void Node3DEditorViewportContainer::_gui_input(const Ref<InputEvent> &p_event) {
+ Ref<InputEventMouseButton> mb = p_event;
+
+ if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) {
+ if (mb->is_pressed()) {
+ Vector2 size = get_size();
+
+ int h_sep = get_theme_constant("separation", "HSplitContainer");
+ int v_sep = get_theme_constant("separation", "VSplitContainer");
+
+ int mid_w = size.width * ratio_h;
+ int mid_h = size.height * ratio_v;
+
+ dragging_h = mb->get_position().x > (mid_w - h_sep / 2) && mb->get_position().x < (mid_w + h_sep / 2);
+ dragging_v = mb->get_position().y > (mid_h - v_sep / 2) && mb->get_position().y < (mid_h + v_sep / 2);
+
+ drag_begin_pos = mb->get_position();
+ drag_begin_ratio.x = ratio_h;
+ drag_begin_ratio.y = ratio_v;
+
+ switch (view) {
+ case VIEW_USE_1_VIEWPORT: {
+ dragging_h = false;
+ dragging_v = false;
+
+ } break;
+ case VIEW_USE_2_VIEWPORTS: {
+ dragging_h = false;
+
+ } break;
+ case VIEW_USE_2_VIEWPORTS_ALT: {
+ dragging_v = false;
+
+ } break;
+ case VIEW_USE_3_VIEWPORTS:
+ case VIEW_USE_3_VIEWPORTS_ALT:
+ case VIEW_USE_4_VIEWPORTS: {
+ // Do nothing.
+
+ } break;
+ }
+ } else {
+ dragging_h = false;
+ dragging_v = false;
+ }
+ }
+
+ Ref<InputEventMouseMotion> mm = p_event;
+
+ if (mm.is_valid()) {
+ if (view == VIEW_USE_3_VIEWPORTS || view == VIEW_USE_3_VIEWPORTS_ALT || view == VIEW_USE_4_VIEWPORTS) {
+ Vector2 size = get_size();
+
+ int h_sep = get_theme_constant("separation", "HSplitContainer");
+ int v_sep = get_theme_constant("separation", "VSplitContainer");
+
+ int mid_w = size.width * ratio_h;
+ int mid_h = size.height * ratio_v;
+
+ bool was_hovering_h = hovering_h;
+ bool was_hovering_v = hovering_v;
+ hovering_h = mm->get_position().x > (mid_w - h_sep / 2) && mm->get_position().x < (mid_w + h_sep / 2);
+ hovering_v = mm->get_position().y > (mid_h - v_sep / 2) && mm->get_position().y < (mid_h + v_sep / 2);
+
+ if (was_hovering_h != hovering_h || was_hovering_v != hovering_v) {
+ update();
+ }
+ }
+
+ if (dragging_h) {
+ float new_ratio = drag_begin_ratio.x + (mm->get_position().x - drag_begin_pos.x) / get_size().width;
+ new_ratio = CLAMP(new_ratio, 40 / get_size().width, (get_size().width - 40) / get_size().width);
+ ratio_h = new_ratio;
+ queue_sort();
+ update();
+ }
+ if (dragging_v) {
+ float new_ratio = drag_begin_ratio.y + (mm->get_position().y - drag_begin_pos.y) / get_size().height;
+ new_ratio = CLAMP(new_ratio, 40 / get_size().height, (get_size().height - 40) / get_size().height);
+ ratio_v = new_ratio;
+ queue_sort();
+ update();
+ }
+ }
+}
+
+void Node3DEditorViewportContainer::_notification(int p_what) {
+ if (p_what == NOTIFICATION_MOUSE_ENTER || p_what == NOTIFICATION_MOUSE_EXIT) {
+ mouseover = (p_what == NOTIFICATION_MOUSE_ENTER);
+ update();
+ }
+
+ if (p_what == NOTIFICATION_DRAW && mouseover) {
+ Ref<Texture2D> h_grabber = get_theme_icon("grabber", "HSplitContainer");
+ Ref<Texture2D> v_grabber = get_theme_icon("grabber", "VSplitContainer");
+
+ Ref<Texture2D> hdiag_grabber = get_theme_icon("GuiViewportHdiagsplitter", "EditorIcons");
+ Ref<Texture2D> vdiag_grabber = get_theme_icon("GuiViewportVdiagsplitter", "EditorIcons");
+ Ref<Texture2D> vh_grabber = get_theme_icon("GuiViewportVhsplitter", "EditorIcons");
+
+ Vector2 size = get_size();
+
+ int h_sep = get_theme_constant("separation", "HSplitContainer");
+
+ int v_sep = get_theme_constant("separation", "VSplitContainer");
+
+ int mid_w = size.width * ratio_h;
+ int mid_h = size.height * ratio_v;
+
+ int size_left = mid_w - h_sep / 2;
+ int size_bottom = size.height - mid_h - v_sep / 2;
+
+ switch (view) {
+ case VIEW_USE_1_VIEWPORT: {
+ // Nothing to show.
+
+ } break;
+ case VIEW_USE_2_VIEWPORTS: {
+ draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
+ set_default_cursor_shape(CURSOR_VSPLIT);
+
+ } break;
+ case VIEW_USE_2_VIEWPORTS_ALT: {
+ draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2));
+ set_default_cursor_shape(CURSOR_HSPLIT);
+
+ } break;
+ case VIEW_USE_3_VIEWPORTS: {
+ if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
+ draw_texture(hdiag_grabber, Vector2(mid_w - hdiag_grabber->get_width() / 2, mid_h - v_grabber->get_height() / 4));
+ set_default_cursor_shape(CURSOR_DRAG);
+ } else if ((hovering_v && !dragging_h) || dragging_v) {
+ draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
+ set_default_cursor_shape(CURSOR_VSPLIT);
+ } else if (hovering_h || dragging_h) {
+ draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2));
+ set_default_cursor_shape(CURSOR_HSPLIT);
+ }
+
+ } break;
+ case VIEW_USE_3_VIEWPORTS_ALT: {
+ if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
+ draw_texture(vdiag_grabber, Vector2(mid_w - vdiag_grabber->get_width() + v_grabber->get_height() / 4, mid_h - vdiag_grabber->get_height() / 2));
+ set_default_cursor_shape(CURSOR_DRAG);
+ } else if ((hovering_v && !dragging_h) || dragging_v) {
+ draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
+ set_default_cursor_shape(CURSOR_VSPLIT);
+ } else if (hovering_h || dragging_h) {
+ draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2));
+ set_default_cursor_shape(CURSOR_HSPLIT);
+ }
+
+ } break;
+ case VIEW_USE_4_VIEWPORTS: {
+ Vector2 half(mid_w, mid_h);
+ if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
+ draw_texture(vh_grabber, half - vh_grabber->get_size() / 2.0);
+ set_default_cursor_shape(CURSOR_DRAG);
+ } else if ((hovering_v && !dragging_h) || dragging_v) {
+ draw_texture(v_grabber, half - v_grabber->get_size() / 2.0);
+ set_default_cursor_shape(CURSOR_VSPLIT);
+ } else if (hovering_h || dragging_h) {
+ draw_texture(h_grabber, half - h_grabber->get_size() / 2.0);
+ set_default_cursor_shape(CURSOR_HSPLIT);
+ }
+
+ } break;
+ }
+ }
+
+ if (p_what == NOTIFICATION_SORT_CHILDREN) {
+ Node3DEditorViewport *viewports[4];
+ int vc = 0;
+ for (int i = 0; i < get_child_count(); i++) {
+ viewports[vc] = Object::cast_to<Node3DEditorViewport>(get_child(i));
+ if (viewports[vc]) {
+ vc++;
+ }
+ }
+
+ ERR_FAIL_COND(vc != 4);
+
+ Size2 size = get_size();
+
+ if (size.x < 10 || size.y < 10) {
+ for (int i = 0; i < 4; i++) {
+ viewports[i]->hide();
+ }
+ return;
+ }
+ int h_sep = get_theme_constant("separation", "HSplitContainer");
+
+ int v_sep = get_theme_constant("separation", "VSplitContainer");
+
+ int mid_w = size.width * ratio_h;
+ int mid_h = size.height * ratio_v;
+
+ int size_left = mid_w - h_sep / 2;
+ int size_right = size.width - mid_w - h_sep / 2;
+
+ int size_top = mid_h - v_sep / 2;
+ int size_bottom = size.height - mid_h - v_sep / 2;
+
+ switch (view) {
+ case VIEW_USE_1_VIEWPORT: {
+ viewports[0]->show();
+ for (int i = 1; i < 4; i++) {
+ viewports[i]->hide();
+ }
+
+ fit_child_in_rect(viewports[0], Rect2(Vector2(), size));
+
+ } break;
+ case VIEW_USE_2_VIEWPORTS: {
+ for (int i = 0; i < 4; i++) {
+ if (i == 1 || i == 3) {
+ viewports[i]->hide();
+ } else {
+ viewports[i]->show();
+ }
+ }
+
+ fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top)));
+ fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size.width, size_bottom)));
+
+ } break;
+ case VIEW_USE_2_VIEWPORTS_ALT: {
+ for (int i = 0; i < 4; i++) {
+ if (i == 1 || i == 3) {
+ viewports[i]->hide();
+ } else {
+ viewports[i]->show();
+ }
+ }
+ fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size.height)));
+ fit_child_in_rect(viewports[2], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height)));
+
+ } break;
+ case VIEW_USE_3_VIEWPORTS: {
+ for (int i = 0; i < 4; i++) {
+ if (i == 1) {
+ viewports[i]->hide();
+ } else {
+ viewports[i]->show();
+ }
+ }
+
+ fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top)));
+ fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom)));
+ fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom)));
+
+ } break;
+ case VIEW_USE_3_VIEWPORTS_ALT: {
+ for (int i = 0; i < 4; i++) {
+ if (i == 1) {
+ viewports[i]->hide();
+ } else {
+ viewports[i]->show();
+ }
+ }
+
+ fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top)));
+ fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom)));
+ fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height)));
+
+ } break;
+ case VIEW_USE_4_VIEWPORTS: {
+ for (int i = 0; i < 4; i++) {
+ viewports[i]->show();
+ }
+
+ fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top)));
+ fit_child_in_rect(viewports[1], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size_top)));
+ fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom)));
+ fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom)));
+
+ } break;
+ }
+ }
+}
+
+void Node3DEditorViewportContainer::set_view(View p_view) {
+ view = p_view;
+ queue_sort();
+}
+
+Node3DEditorViewportContainer::View Node3DEditorViewportContainer::get_view() {
+ return view;
+}
+
+void Node3DEditorViewportContainer::_bind_methods() {
+ ClassDB::bind_method("_gui_input", &Node3DEditorViewportContainer::_gui_input);
+}
+
+Node3DEditorViewportContainer::Node3DEditorViewportContainer() {
+ set_clip_contents(true);
+ view = VIEW_USE_1_VIEWPORT;
+ mouseover = false;
+ ratio_h = 0.5;
+ ratio_v = 0.5;
+ hovering_v = false;
+ hovering_h = false;
+ dragging_v = false;
+ dragging_h = false;
+}
+
+///////////////////////////////////////////////////////////////////
+
+Node3DEditor *Node3DEditor::singleton = nullptr;
+
+Node3DEditorSelectedItem::~Node3DEditorSelectedItem() {
+ if (sbox_instance.is_valid()) {
+ RenderingServer::get_singleton()->free(sbox_instance);
+ }
+}
+
+void Node3DEditor::select_gizmo_highlight_axis(int p_axis) {
+ for (int i = 0; i < 3; i++) {
+ move_gizmo[i]->surface_set_material(0, i == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
+ move_plane_gizmo[i]->surface_set_material(0, (i + 6) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]);
+ rotate_gizmo[i]->surface_set_material(0, (i + 3) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
+ scale_gizmo[i]->surface_set_material(0, (i + 9) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
+ scale_plane_gizmo[i]->surface_set_material(0, (i + 12) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]);
+ }
+}
+
+void Node3DEditor::update_transform_gizmo() {
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+ AABB center;
+ bool first = true;
+
+ Basis gizmo_basis;
+ bool local_gizmo_coords = are_local_coords_enabled();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ Transform xf = se->sp->get_global_gizmo_transform();
+
+ if (first) {
+ center.position = xf.origin;
+ first = false;
+ if (local_gizmo_coords) {
+ gizmo_basis = xf.basis;
+ gizmo_basis.orthonormalize();
+ }
+ } else {
+ center.expand_to(xf.origin);
+ gizmo_basis = Basis();
+ }
+ }
+
+ Vector3 pcenter = center.position + center.size * 0.5;
+ gizmo.visible = !first;
+ gizmo.transform.origin = pcenter;
+ gizmo.transform.basis = gizmo_basis;
+
+ for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
+ viewports[i]->update_transform_gizmo_view();
+ }
+}
+
+void _update_all_gizmos(Node *p_node) {
+ for (int i = p_node->get_child_count() - 1; 0 <= i; --i) {
+ Node3D *spatial_node = Object::cast_to<Node3D>(p_node->get_child(i));
+ if (spatial_node) {
+ spatial_node->update_gizmo();
+ }
+
+ _update_all_gizmos(p_node->get_child(i));
+ }
+}
+
+void Node3DEditor::update_all_gizmos(Node *p_node) {
+ if (!p_node) {
+ p_node = SceneTree::get_singleton()->get_root();
+ }
+ _update_all_gizmos(p_node);
+}
+
+Object *Node3DEditor::_get_editor_data(Object *p_what) {
+ Node3D *sp = Object::cast_to<Node3D>(p_what);
+ if (!sp) {
+ return nullptr;
+ }
+
+ Node3DEditorSelectedItem *si = memnew(Node3DEditorSelectedItem);
+
+ si->sp = sp;
+ si->sbox_instance = RenderingServer::get_singleton()->instance_create2(selection_box->get_rid(), sp->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_geometry_set_cast_shadows_setting(si->sbox_instance, RS::SHADOW_CASTING_SETTING_OFF);
+
+ return si;
+}
+
+void Node3DEditor::_generate_selection_box() {
+ AABB aabb(Vector3(), Vector3(1, 1, 1));
+ aabb.grow_by(aabb.get_longest_axis_size() / 20.0);
+
+ Ref<SurfaceTool> st = memnew(SurfaceTool);
+
+ st->begin(Mesh::PRIMITIVE_LINES);
+ for (int i = 0; i < 12; i++) {
+ Vector3 a, b;
+ aabb.get_edge(i, a, b);
+
+ st->add_color(Color(1.0, 1.0, 0.8, 0.8));
+ st->add_vertex(a);
+ st->add_color(Color(1.0, 1.0, 0.8, 0.4));
+ st->add_vertex(a.lerp(b, 0.2));
+
+ st->add_color(Color(1.0, 1.0, 0.8, 0.4));
+ st->add_vertex(a.lerp(b, 0.8));
+ st->add_color(Color(1.0, 1.0, 0.8, 0.8));
+ st->add_vertex(b);
+ }
+
+ Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D);
+ mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ mat->set_albedo(Color(1, 1, 1));
+ mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ mat->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ mat->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ st->set_material(mat);
+ selection_box = st->commit();
+}
+
+Dictionary Node3DEditor::get_state() const {
+ Dictionary d;
+
+ d["snap_enabled"] = snap_enabled;
+ d["translate_snap"] = get_translate_snap();
+ d["rotate_snap"] = get_rotate_snap();
+ d["scale_snap"] = get_scale_snap();
+
+ d["local_coords"] = tool_option_button[TOOL_OPT_LOCAL_COORDS]->is_pressed();
+
+ int vc = 0;
+ if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT))) {
+ vc = 1;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS))) {
+ vc = 2;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS))) {
+ vc = 3;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS))) {
+ vc = 4;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT))) {
+ vc = 5;
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT))) {
+ vc = 6;
+ }
+
+ d["viewport_mode"] = vc;
+ Array vpdata;
+ for (int i = 0; i < 4; i++) {
+ vpdata.push_back(viewports[i]->get_state());
+ }
+
+ d["viewports"] = vpdata;
+
+ d["show_grid"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID));
+ d["show_origin"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN));
+ d["fov"] = get_fov();
+ d["znear"] = get_znear();
+ d["zfar"] = get_zfar();
+
+ Dictionary gizmos_status;
+ for (int i = 0; i < gizmo_plugins_by_name.size(); i++) {
+ if (!gizmo_plugins_by_name[i]->can_be_hidden()) {
+ continue;
+ }
+ int state = gizmos_menu->get_item_state(gizmos_menu->get_item_index(i));
+ String name = gizmo_plugins_by_name[i]->get_name();
+ gizmos_status[name] = state;
+ }
+
+ d["gizmos_status"] = gizmos_status;
+
+ return d;
+}
+
+void Node3DEditor::set_state(const Dictionary &p_state) {
+ Dictionary d = p_state;
+
+ if (d.has("snap_enabled")) {
+ snap_enabled = d["snap_enabled"];
+ tool_option_button[TOOL_OPT_USE_SNAP]->set_pressed(d["snap_enabled"]);
+ }
+
+ if (d.has("translate_snap")) {
+ snap_translate_value = d["translate_snap"];
+ }
+
+ if (d.has("rotate_snap")) {
+ snap_rotate_value = d["rotate_snap"];
+ }
+
+ if (d.has("scale_snap")) {
+ snap_scale_value = d["scale_snap"];
+ }
+
+ _snap_update();
+
+ if (d.has("local_coords")) {
+ tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_pressed(d["local_coords"]);
+ update_transform_gizmo();
+ }
+
+ if (d.has("viewport_mode")) {
+ int vc = d["viewport_mode"];
+
+ if (vc == 1) {
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+ } else if (vc == 2) {
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS);
+ } else if (vc == 3) {
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS);
+ } else if (vc == 4) {
+ _menu_item_pressed(MENU_VIEW_USE_4_VIEWPORTS);
+ } else if (vc == 5) {
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS_ALT);
+ } else if (vc == 6) {
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS_ALT);
+ }
+ }
+
+ if (d.has("viewports")) {
+ Array vp = d["viewports"];
+ uint32_t vp_size = static_cast<uint32_t>(vp.size());
+ if (vp_size > VIEWPORTS_COUNT) {
+ WARN_PRINT("Ignoring superfluous viewport settings from spatial editor state.");
+ vp_size = VIEWPORTS_COUNT;
+ }
+
+ for (uint32_t i = 0; i < vp_size; i++) {
+ viewports[i]->set_state(vp[i]);
+ }
+ }
+
+ if (d.has("zfar")) {
+ settings_zfar->set_value(float(d["zfar"]));
+ }
+ if (d.has("znear")) {
+ settings_znear->set_value(float(d["znear"]));
+ }
+ if (d.has("fov")) {
+ settings_fov->set_value(float(d["fov"]));
+ }
+ if (d.has("show_grid")) {
+ bool use = d["show_grid"];
+
+ if (use != view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID))) {
+ _menu_item_pressed(MENU_VIEW_GRID);
+ }
+ }
+
+ if (d.has("show_origin")) {
+ bool use = d["show_origin"];
+
+ if (use != view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN))) {
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN), use);
+ RenderingServer::get_singleton()->instance_set_visible(origin_instance, use);
+ }
+ }
+
+ if (d.has("gizmos_status")) {
+ Dictionary gizmos_status = d["gizmos_status"];
+ List<Variant> keys;
+ gizmos_status.get_key_list(&keys);
+
+ for (int j = 0; j < gizmo_plugins_by_name.size(); ++j) {
+ if (!gizmo_plugins_by_name[j]->can_be_hidden()) {
+ continue;
+ }
+ int state = EditorNode3DGizmoPlugin::VISIBLE;
+ for (int i = 0; i < keys.size(); i++) {
+ if (gizmo_plugins_by_name.write[j]->get_name() == keys[i]) {
+ state = gizmos_status[keys[i]];
+ break;
+ }
+ }
+
+ gizmo_plugins_by_name.write[j]->set_state(state);
+ }
+ _update_gizmos_menu();
+ }
+}
+
+void Node3DEditor::edit(Node3D *p_spatial) {
+ if (p_spatial != selected) {
+ if (selected) {
+ Ref<EditorNode3DGizmo> seg = selected->get_gizmo();
+ if (seg.is_valid()) {
+ seg->set_selected(false);
+ selected->update_gizmo();
+ }
+ }
+
+ selected = p_spatial;
+ over_gizmo_handle = -1;
+
+ if (selected) {
+ Ref<EditorNode3DGizmo> seg = selected->get_gizmo();
+ if (seg.is_valid()) {
+ seg->set_selected(true);
+ selected->update_gizmo();
+ }
+ }
+ }
+}
+
+void Node3DEditor::_snap_changed() {
+ snap_translate_value = snap_translate->get_text().to_float();
+ snap_rotate_value = snap_rotate->get_text().to_float();
+ snap_scale_value = snap_scale->get_text().to_float();
+}
+
+void Node3DEditor::_snap_update() {
+ snap_translate->set_text(String::num(snap_translate_value));
+ snap_rotate->set_text(String::num(snap_rotate_value));
+ snap_scale->set_text(String::num(snap_scale_value));
+}
+
+void Node3DEditor::_xform_dialog_action() {
+ Transform t;
+ //translation
+ Vector3 scale;
+ Vector3 rotate;
+ Vector3 translate;
+
+ for (int i = 0; i < 3; i++) {
+ translate[i] = xform_translate[i]->get_text().to_float();
+ rotate[i] = Math::deg2rad(xform_rotate[i]->get_text().to_float());
+ scale[i] = xform_scale[i]->get_text().to_float();
+ }
+
+ t.basis.scale(scale);
+ t.basis.rotate(rotate);
+ t.origin = translate;
+
+ undo_redo->create_action(TTR("XForm Dialog"));
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (!sp) {
+ continue;
+ }
+
+ Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
+
+ bool post = xform_type->get_selected() > 0;
+
+ Transform tr = sp->get_global_gizmo_transform();
+ if (post) {
+ tr = tr * t;
+ } else {
+ tr.basis = t.basis * tr.basis;
+ tr.origin += t.origin;
+ }
+
+ undo_redo->add_do_method(sp, "set_global_transform", tr);
+ undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_gizmo_transform());
+ }
+ undo_redo->commit_action();
+}
+
+void Node3DEditor::_menu_item_toggled(bool pressed, int p_option) {
+ switch (p_option) {
+ case MENU_TOOL_LOCAL_COORDS: {
+ tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_pressed(pressed);
+ update_transform_gizmo();
+ } break;
+
+ case MENU_TOOL_USE_SNAP: {
+ tool_option_button[TOOL_OPT_USE_SNAP]->set_pressed(pressed);
+ snap_enabled = pressed;
+ } break;
+
+ case MENU_TOOL_OVERRIDE_CAMERA: {
+ EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
+
+ using Override = EditorDebuggerNode::CameraOverride;
+ if (pressed) {
+ debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
+ } else {
+ debugger->set_camera_override(Override::OVERRIDE_NONE);
+ }
+
+ } break;
+ }
+}
+
+void Node3DEditor::_menu_gizmo_toggled(int p_option) {
+ const int idx = gizmos_menu->get_item_index(p_option);
+ gizmos_menu->toggle_item_multistate(idx);
+
+ // Change icon
+ const int state = gizmos_menu->get_item_state(idx);
+ switch (state) {
+ case EditorNode3DGizmoPlugin::VISIBLE:
+ gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_theme_icon("visibility_visible"));
+ break;
+ case EditorNode3DGizmoPlugin::ON_TOP:
+ gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_theme_icon("visibility_xray"));
+ break;
+ case EditorNode3DGizmoPlugin::HIDDEN:
+ gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_theme_icon("visibility_hidden"));
+ break;
+ }
+
+ gizmo_plugins_by_name.write[p_option]->set_state(state);
+
+ update_all_gizmos();
+}
+
+void Node3DEditor::_update_camera_override_button(bool p_game_running) {
+ Button *const button = tool_option_button[TOOL_OPT_OVERRIDE_CAMERA];
+
+ if (p_game_running) {
+ button->set_disabled(false);
+ button->set_tooltip(TTR("Game Camera Override\nNo game instance running."));
+ } else {
+ button->set_disabled(true);
+ button->set_pressed(false);
+ button->set_tooltip(TTR("Game Camera Override\nOverrides game camera with editor viewport camera."));
+ }
+}
+
+void Node3DEditor::_update_camera_override_viewport(Object *p_viewport) {
+ Node3DEditorViewport *current_viewport = Object::cast_to<Node3DEditorViewport>(p_viewport);
+
+ if (!current_viewport) {
+ return;
+ }
+
+ EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
+
+ camera_override_viewport_id = current_viewport->index;
+ if (debugger->get_camera_override() >= EditorDebuggerNode::OVERRIDE_3D_1) {
+ using Override = EditorDebuggerNode::CameraOverride;
+
+ debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
+ }
+}
+
+void Node3DEditor::_menu_item_pressed(int p_option) {
+ switch (p_option) {
+ case MENU_TOOL_SELECT:
+ case MENU_TOOL_MOVE:
+ case MENU_TOOL_ROTATE:
+ case MENU_TOOL_SCALE:
+ case MENU_TOOL_LIST_SELECT: {
+ for (int i = 0; i < TOOL_MAX; i++) {
+ tool_button[i]->set_pressed(i == p_option);
+ }
+ tool_mode = (ToolMode)p_option;
+ update_transform_gizmo();
+
+ } break;
+ case MENU_TRANSFORM_CONFIGURE_SNAP: {
+ snap_dialog->popup_centered(Size2(200, 180));
+ } break;
+ case MENU_TRANSFORM_DIALOG: {
+ for (int i = 0; i < 3; i++) {
+ xform_translate[i]->set_text("0");
+ xform_rotate[i]->set_text("0");
+ xform_scale[i]->set_text("1");
+ }
+
+ xform_dialog->popup_centered(Size2(320, 240) * EDSCALE);
+
+ } break;
+ case MENU_VIEW_USE_1_VIEWPORT: {
+ viewport_base->set_view(Node3DEditorViewportContainer::VIEW_USE_1_VIEWPORT);
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), true);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
+
+ } break;
+ case MENU_VIEW_USE_2_VIEWPORTS: {
+ viewport_base->set_view(Node3DEditorViewportContainer::VIEW_USE_2_VIEWPORTS);
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), true);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
+
+ } break;
+ case MENU_VIEW_USE_2_VIEWPORTS_ALT: {
+ viewport_base->set_view(Node3DEditorViewportContainer::VIEW_USE_2_VIEWPORTS_ALT);
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), true);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
+
+ } break;
+ case MENU_VIEW_USE_3_VIEWPORTS: {
+ viewport_base->set_view(Node3DEditorViewportContainer::VIEW_USE_3_VIEWPORTS);
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), true);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
+
+ } break;
+ case MENU_VIEW_USE_3_VIEWPORTS_ALT: {
+ viewport_base->set_view(Node3DEditorViewportContainer::VIEW_USE_3_VIEWPORTS_ALT);
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), true);
+
+ } break;
+ case MENU_VIEW_USE_4_VIEWPORTS: {
+ viewport_base->set_view(Node3DEditorViewportContainer::VIEW_USE_4_VIEWPORTS);
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), true);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
+
+ } break;
+ case MENU_VIEW_ORIGIN: {
+ bool is_checked = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(p_option));
+
+ origin_enabled = !is_checked;
+ RenderingServer::get_singleton()->instance_set_visible(origin_instance, origin_enabled);
+ // Update the grid since its appearance depends on whether the origin is enabled
+ _finish_grid();
+ _init_grid();
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(p_option), origin_enabled);
+ } break;
+ case MENU_VIEW_GRID: {
+ bool is_checked = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(p_option));
+
+ grid_enabled = !is_checked;
+
+ for (int i = 0; i < 3; ++i) {
+ if (grid_enable[i]) {
+ grid_visible[i] = grid_enabled;
+ if (grid_instance[i].is_valid()) {
+ RenderingServer::get_singleton()->instance_set_visible(grid_instance[i], grid_enabled);
+ }
+ }
+ }
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(p_option), grid_enabled);
+
+ } break;
+ case MENU_VIEW_CAMERA_SETTINGS: {
+ settings_dialog->popup_centered(settings_vbc->get_combined_minimum_size() + Size2(50, 50));
+ } break;
+ case MENU_SNAP_TO_FLOOR: {
+ snap_selected_nodes_to_floor();
+ } break;
+ case MENU_LOCK_SELECTED: {
+ undo_redo->create_action(TTR("Lock Selected"));
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *spatial = Object::cast_to<Node3D>(E->get());
+ if (!spatial || !spatial->is_inside_tree()) {
+ continue;
+ }
+
+ if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
+ continue;
+ }
+
+ undo_redo->add_do_method(spatial, "set_meta", "_edit_lock_", true);
+ undo_redo->add_undo_method(spatial, "remove_meta", "_edit_lock_");
+ undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed");
+ undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed");
+ }
+
+ undo_redo->add_do_method(this, "_refresh_menu_icons");
+ undo_redo->add_undo_method(this, "_refresh_menu_icons");
+ undo_redo->commit_action();
+ } break;
+ case MENU_UNLOCK_SELECTED: {
+ undo_redo->create_action(TTR("Unlock Selected"));
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *spatial = Object::cast_to<Node3D>(E->get());
+ if (!spatial || !spatial->is_inside_tree()) {
+ continue;
+ }
+
+ if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
+ continue;
+ }
+
+ undo_redo->add_do_method(spatial, "remove_meta", "_edit_lock_");
+ undo_redo->add_undo_method(spatial, "set_meta", "_edit_lock_", true);
+ undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed");
+ undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed");
+ }
+
+ undo_redo->add_do_method(this, "_refresh_menu_icons");
+ undo_redo->add_undo_method(this, "_refresh_menu_icons");
+ undo_redo->commit_action();
+ } break;
+ case MENU_GROUP_SELECTED: {
+ undo_redo->create_action(TTR("Group Selected"));
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *spatial = Object::cast_to<Node3D>(E->get());
+ if (!spatial || !spatial->is_inside_tree()) {
+ continue;
+ }
+
+ if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
+ continue;
+ }
+
+ undo_redo->add_do_method(spatial, "set_meta", "_edit_group_", true);
+ undo_redo->add_undo_method(spatial, "remove_meta", "_edit_group_");
+ undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed");
+ undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed");
+ }
+
+ undo_redo->add_do_method(this, "_refresh_menu_icons");
+ undo_redo->add_undo_method(this, "_refresh_menu_icons");
+ undo_redo->commit_action();
+ } break;
+ case MENU_UNGROUP_SELECTED: {
+ undo_redo->create_action(TTR("Ungroup Selected"));
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *spatial = Object::cast_to<Node3D>(E->get());
+ if (!spatial || !spatial->is_inside_tree()) {
+ continue;
+ }
+
+ if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) {
+ continue;
+ }
+
+ undo_redo->add_do_method(spatial, "remove_meta", "_edit_group_");
+ undo_redo->add_undo_method(spatial, "set_meta", "_edit_group_", true);
+ undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed");
+ undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed");
+ }
+
+ undo_redo->add_do_method(this, "_refresh_menu_icons");
+ undo_redo->add_undo_method(this, "_refresh_menu_icons");
+ undo_redo->commit_action();
+ } break;
+ }
+}
+
+void Node3DEditor::_init_indicators() {
+ {
+ origin_enabled = true;
+ grid_enabled = true;
+
+ indicator_mat.instance();
+ indicator_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ indicator_mat->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ indicator_mat->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ indicator_mat->set_transparency(StandardMaterial3D::Transparency::TRANSPARENCY_ALPHA_DEPTH_PRE_PASS);
+
+ Vector<Color> origin_colors;
+ Vector<Vector3> origin_points;
+
+ for (int i = 0; i < 3; i++) {
+ Vector3 axis;
+ axis[i] = 1;
+ Color origin_color;
+ switch (i) {
+ case 0:
+ origin_color = get_theme_color("axis_x_color", "Editor");
+ break;
+ case 1:
+ origin_color = get_theme_color("axis_y_color", "Editor");
+ break;
+ case 2:
+ origin_color = get_theme_color("axis_z_color", "Editor");
+ break;
+ default:
+ origin_color = Color();
+ break;
+ }
+
+ grid_enable[i] = false;
+ grid_visible[i] = false;
+
+ origin_colors.push_back(origin_color);
+ origin_colors.push_back(origin_color);
+ origin_colors.push_back(origin_color);
+ origin_colors.push_back(origin_color);
+ origin_colors.push_back(origin_color);
+ origin_colors.push_back(origin_color);
+ // To both allow having a large origin size and avoid jitter
+ // at small scales, we should segment the line into pieces.
+ // 3 pieces seems to do the trick, and let's use powers of 2.
+ origin_points.push_back(axis * 1048576);
+ origin_points.push_back(axis * 1024);
+ origin_points.push_back(axis * 1024);
+ origin_points.push_back(axis * -1024);
+ origin_points.push_back(axis * -1024);
+ origin_points.push_back(axis * -1048576);
+ }
+
+ grid_enable[0] = EditorSettings::get_singleton()->get("editors/3d/grid_xy_plane");
+ grid_enable[1] = EditorSettings::get_singleton()->get("editors/3d/grid_yz_plane");
+ grid_enable[2] = EditorSettings::get_singleton()->get("editors/3d/grid_xz_plane");
+ grid_visible[0] = grid_enable[0];
+ grid_visible[1] = grid_enable[1];
+ grid_visible[2] = grid_enable[2];
+
+ _init_grid();
+
+ origin = RenderingServer::get_singleton()->mesh_create();
+ Array d;
+ d.resize(RS::ARRAY_MAX);
+ d[RenderingServer::ARRAY_VERTEX] = origin_points;
+ d[RenderingServer::ARRAY_COLOR] = origin_colors;
+
+ RenderingServer::get_singleton()->mesh_add_surface_from_arrays(origin, RenderingServer::PRIMITIVE_LINES, d);
+ RenderingServer::get_singleton()->mesh_surface_set_material(origin, 0, indicator_mat->get_rid());
+
+ origin_instance = RenderingServer::get_singleton()->instance_create2(origin, get_tree()->get_root()->get_world_3d()->get_scenario());
+ RS::get_singleton()->instance_set_layer_mask(origin_instance, 1 << Node3DEditorViewport::GIZMO_GRID_LAYER);
+
+ RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(origin_instance, RS::SHADOW_CASTING_SETTING_OFF);
+ }
+
+ {
+ //move gizmo
+
+ for (int i = 0; i < 3; i++) {
+ Color col;
+ switch (i) {
+ case 0:
+ col = get_theme_color("axis_x_color", "Editor");
+ break;
+ case 1:
+ col = get_theme_color("axis_y_color", "Editor");
+ break;
+ case 2:
+ col = get_theme_color("axis_z_color", "Editor");
+ break;
+ default:
+ col = Color();
+ break;
+ }
+
+ col.a = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_opacity");
+
+ move_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
+ move_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
+ rotate_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
+ scale_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
+ scale_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
+
+ Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D);
+ mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ mat->set_on_top_of_alpha();
+ mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ mat->set_albedo(col);
+ gizmo_color[i] = mat;
+
+ Ref<StandardMaterial3D> mat_hl = mat->duplicate();
+ mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
+ gizmo_color_hl[i] = mat_hl;
+
+ Vector3 ivec;
+ ivec[i] = 1;
+ Vector3 nivec;
+ nivec[(i + 1) % 3] = 1;
+ nivec[(i + 2) % 3] = 1;
+ Vector3 ivec2;
+ ivec2[(i + 1) % 3] = 1;
+ Vector3 ivec3;
+ ivec3[(i + 2) % 3] = 1;
+
+ //translate
+ {
+ Ref<SurfaceTool> surftool = memnew(SurfaceTool);
+ surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
+
+ // Arrow profile
+ const int arrow_points = 5;
+ Vector3 arrow[5] = {
+ nivec * 0.0 + ivec * 0.0,
+ nivec * 0.01 + ivec * 0.0,
+ nivec * 0.01 + ivec * GIZMO_ARROW_OFFSET,
+ nivec * 0.065 + ivec * GIZMO_ARROW_OFFSET,
+ nivec * 0.0 + ivec * (GIZMO_ARROW_OFFSET + GIZMO_ARROW_SIZE),
+ };
+
+ int arrow_sides = 16;
+
+ for (int k = 0; k < arrow_sides; k++) {
+ Basis ma(ivec, Math_PI * 2 * float(k) / arrow_sides);
+ Basis mb(ivec, Math_PI * 2 * float(k + 1) / arrow_sides);
+
+ for (int j = 0; j < arrow_points - 1; j++) {
+ Vector3 points[4] = {
+ ma.xform(arrow[j]),
+ mb.xform(arrow[j]),
+ mb.xform(arrow[j + 1]),
+ ma.xform(arrow[j + 1]),
+ };
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[1]);
+ surftool->add_vertex(points[2]);
+
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[2]);
+ surftool->add_vertex(points[3]);
+ }
+ }
+
+ surftool->set_material(mat);
+ surftool->commit(move_gizmo[i]);
+ }
+
+ // Plane Translation
+ {
+ Ref<SurfaceTool> surftool = memnew(SurfaceTool);
+ surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
+
+ Vector3 vec = ivec2 - ivec3;
+ Vector3 plane[4] = {
+ vec * GIZMO_PLANE_DST,
+ vec * GIZMO_PLANE_DST + ivec2 * GIZMO_PLANE_SIZE,
+ vec * (GIZMO_PLANE_DST + GIZMO_PLANE_SIZE),
+ vec * GIZMO_PLANE_DST - ivec3 * GIZMO_PLANE_SIZE
+ };
+
+ Basis ma(ivec, Math_PI / 2);
+
+ Vector3 points[4] = {
+ ma.xform(plane[0]),
+ ma.xform(plane[1]),
+ ma.xform(plane[2]),
+ ma.xform(plane[3]),
+ };
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[1]);
+ surftool->add_vertex(points[2]);
+
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[2]);
+ surftool->add_vertex(points[3]);
+
+ Ref<StandardMaterial3D> plane_mat = memnew(StandardMaterial3D);
+ plane_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ plane_mat->set_on_top_of_alpha();
+ plane_mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ plane_mat->set_cull_mode(StandardMaterial3D::CULL_DISABLED);
+ plane_mat->set_albedo(col);
+ plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides
+ surftool->set_material(plane_mat);
+ surftool->commit(move_plane_gizmo[i]);
+
+ Ref<StandardMaterial3D> plane_mat_hl = plane_mat->duplicate();
+ plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
+ plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides
+ }
+
+ // Rotate
+ {
+ Ref<SurfaceTool> surftool = memnew(SurfaceTool);
+ surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
+
+ Vector3 circle[5] = {
+ ivec * 0.02 + ivec2 * 0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
+ ivec * -0.02 + ivec2 * 0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
+ ivec * -0.02 + ivec2 * -0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
+ ivec * 0.02 + ivec2 * -0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
+ ivec * 0.02 + ivec2 * 0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
+ };
+
+ for (int k = 0; k < 64; k++) {
+ Basis ma(ivec, Math_PI * 2 * float(k) / 64);
+ Basis mb(ivec, Math_PI * 2 * float(k + 1) / 64);
+
+ for (int j = 0; j < 4; j++) {
+ Vector3 points[4] = {
+ ma.xform(circle[j]),
+ mb.xform(circle[j]),
+ mb.xform(circle[j + 1]),
+ ma.xform(circle[j + 1]),
+ };
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[1]);
+ surftool->add_vertex(points[2]);
+
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[2]);
+ surftool->add_vertex(points[3]);
+ }
+ }
+
+ surftool->set_material(mat);
+ surftool->commit(rotate_gizmo[i]);
+ }
+
+ // Scale
+ {
+ Ref<SurfaceTool> surftool = memnew(SurfaceTool);
+ surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
+
+ // Cube arrow profile
+ const int arrow_points = 6;
+ Vector3 arrow[6] = {
+ nivec * 0.0 + ivec * 0.0,
+ nivec * 0.01 + ivec * 0.0,
+ nivec * 0.01 + ivec * 1.0 * GIZMO_SCALE_OFFSET,
+ nivec * 0.07 + ivec * 1.0 * GIZMO_SCALE_OFFSET,
+ nivec * 0.07 + ivec * 1.11 * GIZMO_SCALE_OFFSET,
+ nivec * 0.0 + ivec * 1.11 * GIZMO_SCALE_OFFSET,
+ };
+
+ int arrow_sides = 4;
+
+ for (int k = 0; k < 4; k++) {
+ Basis ma(ivec, Math_PI * 2 * float(k) / arrow_sides);
+ Basis mb(ivec, Math_PI * 2 * float(k + 1) / arrow_sides);
+
+ for (int j = 0; j < arrow_points - 1; j++) {
+ Vector3 points[4] = {
+ ma.xform(arrow[j]),
+ mb.xform(arrow[j]),
+ mb.xform(arrow[j + 1]),
+ ma.xform(arrow[j + 1]),
+ };
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[1]);
+ surftool->add_vertex(points[2]);
+
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[2]);
+ surftool->add_vertex(points[3]);
+ }
+ }
+
+ surftool->set_material(mat);
+ surftool->commit(scale_gizmo[i]);
+ }
+
+ // Plane Scale
+ {
+ Ref<SurfaceTool> surftool = memnew(SurfaceTool);
+ surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
+
+ Vector3 vec = ivec2 - ivec3;
+ Vector3 plane[4] = {
+ vec * GIZMO_PLANE_DST,
+ vec * GIZMO_PLANE_DST + ivec2 * GIZMO_PLANE_SIZE,
+ vec * (GIZMO_PLANE_DST + GIZMO_PLANE_SIZE),
+ vec * GIZMO_PLANE_DST - ivec3 * GIZMO_PLANE_SIZE
+ };
+
+ Basis ma(ivec, Math_PI / 2);
+
+ Vector3 points[4] = {
+ ma.xform(plane[0]),
+ ma.xform(plane[1]),
+ ma.xform(plane[2]),
+ ma.xform(plane[3]),
+ };
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[1]);
+ surftool->add_vertex(points[2]);
+
+ surftool->add_vertex(points[0]);
+ surftool->add_vertex(points[2]);
+ surftool->add_vertex(points[3]);
+
+ Ref<StandardMaterial3D> plane_mat = memnew(StandardMaterial3D);
+ plane_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ plane_mat->set_on_top_of_alpha();
+ plane_mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ plane_mat->set_cull_mode(StandardMaterial3D::CULL_DISABLED);
+ plane_mat->set_albedo(col);
+ plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides
+ surftool->set_material(plane_mat);
+ surftool->commit(scale_plane_gizmo[i]);
+
+ Ref<StandardMaterial3D> plane_mat_hl = plane_mat->duplicate();
+ plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
+ plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides
+ }
+ }
+ }
+
+ _generate_selection_box();
+}
+
+void Node3DEditor::_update_gizmos_menu() {
+ gizmos_menu->clear();
+
+ for (int i = 0; i < gizmo_plugins_by_name.size(); ++i) {
+ if (!gizmo_plugins_by_name[i]->can_be_hidden()) {
+ continue;
+ }
+ String plugin_name = gizmo_plugins_by_name[i]->get_name();
+ const int plugin_state = gizmo_plugins_by_name[i]->get_state();
+ gizmos_menu->add_multistate_item(plugin_name, 3, plugin_state, i);
+ const int idx = gizmos_menu->get_item_index(i);
+ gizmos_menu->set_item_tooltip(
+ idx,
+ TTR("Click to toggle between visibility states.\n\nOpen eye: Gizmo is visible.\nClosed eye: Gizmo is hidden.\nHalf-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."));
+ switch (plugin_state) {
+ case EditorNode3DGizmoPlugin::VISIBLE:
+ gizmos_menu->set_item_icon(idx, gizmos_menu->get_theme_icon("visibility_visible"));
+ break;
+ case EditorNode3DGizmoPlugin::ON_TOP:
+ gizmos_menu->set_item_icon(idx, gizmos_menu->get_theme_icon("visibility_xray"));
+ break;
+ case EditorNode3DGizmoPlugin::HIDDEN:
+ gizmos_menu->set_item_icon(idx, gizmos_menu->get_theme_icon("visibility_hidden"));
+ break;
+ }
+ }
+}
+
+void Node3DEditor::_update_gizmos_menu_theme() {
+ for (int i = 0; i < gizmo_plugins_by_name.size(); ++i) {
+ if (!gizmo_plugins_by_name[i]->can_be_hidden()) {
+ continue;
+ }
+ const int plugin_state = gizmo_plugins_by_name[i]->get_state();
+ const int idx = gizmos_menu->get_item_index(i);
+ switch (plugin_state) {
+ case EditorNode3DGizmoPlugin::VISIBLE:
+ gizmos_menu->set_item_icon(idx, gizmos_menu->get_theme_icon("visibility_visible"));
+ break;
+ case EditorNode3DGizmoPlugin::ON_TOP:
+ gizmos_menu->set_item_icon(idx, gizmos_menu->get_theme_icon("visibility_xray"));
+ break;
+ case EditorNode3DGizmoPlugin::HIDDEN:
+ gizmos_menu->set_item_icon(idx, gizmos_menu->get_theme_icon("visibility_hidden"));
+ break;
+ }
+ }
+}
+
+void Node3DEditor::_init_grid() {
+ if (!grid_enabled) {
+ return;
+ }
+ Camera3D *camera = get_editor_viewport(0)->camera;
+ Vector3 camera_position = camera->get_translation();
+ if (camera_position == Vector3()) {
+ return; // Camera3D is invalid, don't draw the grid.
+ }
+
+ Vector<Color> grid_colors[3];
+ Vector<Vector3> grid_points[3];
+
+ Color primary_grid_color = EditorSettings::get_singleton()->get("editors/3d/primary_grid_color");
+ Color secondary_grid_color = EditorSettings::get_singleton()->get("editors/3d/secondary_grid_color");
+ int grid_size = EditorSettings::get_singleton()->get("editors/3d/grid_size");
+ int primary_grid_steps = EditorSettings::get_singleton()->get("editors/3d/primary_grid_steps");
+
+ // Which grid planes are enabled? Which should we generate?
+ grid_enable[0] = grid_visible[0] = EditorSettings::get_singleton()->get("editors/3d/grid_xy_plane");
+ grid_enable[1] = grid_visible[1] = EditorSettings::get_singleton()->get("editors/3d/grid_yz_plane");
+ grid_enable[2] = grid_visible[2] = EditorSettings::get_singleton()->get("editors/3d/grid_xz_plane");
+
+ // Offsets division_level for bigger or smaller grids.
+ // Default value is -0.2. -1.0 gives Blender-like behavior, 0.5 gives huge grids.
+ real_t division_level_bias = EditorSettings::get_singleton()->get("editors/3d/grid_division_level_bias");
+ // Default largest grid size is 100m, 10^2 (default value is 2).
+ int division_level_max = EditorSettings::get_singleton()->get("editors/3d/grid_division_level_max");
+ // Default smallest grid size is 1cm, 10^-2 (default value is -2).
+ int division_level_min = EditorSettings::get_singleton()->get("editors/3d/grid_division_level_min");
+ ERR_FAIL_COND_MSG(division_level_max < division_level_min, "The 3D grid's maximum division level cannot be lower than its minimum division level.");
+
+ if (primary_grid_steps != 10) { // Log10 of 10 is 1.
+ // Change of base rule, divide by ln(10).
+ real_t div = Math::log((real_t)primary_grid_steps) / (real_t)2.302585092994045901094;
+ // Trucation (towards zero) is intentional.
+ division_level_max = (int)(division_level_max / div);
+ division_level_min = (int)(division_level_min / div);
+ }
+
+ for (int a = 0; a < 3; a++) {
+ if (!grid_enable[a]) {
+ continue; // If this grid plane is disabled, skip generation.
+ }
+ int b = (a + 1) % 3;
+ int c = (a + 2) % 3;
+
+ real_t division_level = Math::log(Math::abs(camera_position[c])) / Math::log((double)primary_grid_steps) + division_level_bias;
+ division_level = CLAMP(division_level, division_level_min, division_level_max);
+ real_t division_level_floored = Math::floor(division_level);
+ real_t division_level_decimals = division_level - division_level_floored;
+
+ real_t small_step_size = Math::pow(primary_grid_steps, division_level_floored);
+ real_t large_step_size = small_step_size * primary_grid_steps;
+ real_t center_a = large_step_size * (int)(camera_position[a] / large_step_size);
+ real_t center_b = large_step_size * (int)(camera_position[b] / large_step_size);
+
+ real_t bgn_a = center_a - grid_size * small_step_size;
+ real_t end_a = center_a + grid_size * small_step_size;
+ real_t bgn_b = center_b - grid_size * small_step_size;
+ real_t end_b = center_b + grid_size * small_step_size;
+
+ // In each iteration of this loop, draw one line in each direction (so two lines per loop, in each if statement).
+ for (int i = -grid_size; i <= grid_size; i++) {
+ Color line_color;
+ // Is this a primary line? Set the appropriate color.
+ if (i % primary_grid_steps == 0) {
+ line_color = primary_grid_color.lerp(secondary_grid_color, division_level_decimals);
+ } else {
+ line_color = secondary_grid_color;
+ line_color.a = line_color.a * (1 - division_level_decimals);
+ }
+ // Makes lines farther from the center fade out.
+ // Due to limitations of lines, any that come near the camera have full opacity always.
+ // This should eventually be replaced by some kind of "distance fade" system, outside of this function.
+ // But the effect is still somewhat convincing...
+ line_color.a *= 1 - (1 - division_level_decimals * 0.9) * (Math::abs(i / (float)grid_size));
+
+ real_t position_a = center_a + i * small_step_size;
+ real_t position_b = center_b + i * small_step_size;
+
+ // Don't draw lines over the origin if it's enabled.
+ if (!(origin_enabled && Math::is_zero_approx(position_a))) {
+ Vector3 line_bgn = Vector3();
+ Vector3 line_end = Vector3();
+ line_bgn[a] = position_a;
+ line_end[a] = position_a;
+ line_bgn[b] = bgn_b;
+ line_end[b] = end_b;
+ grid_points[c].push_back(line_bgn);
+ grid_points[c].push_back(line_end);
+ grid_colors[c].push_back(line_color);
+ grid_colors[c].push_back(line_color);
+ }
+
+ if (!(origin_enabled && Math::is_zero_approx(position_b))) {
+ Vector3 line_bgn = Vector3();
+ Vector3 line_end = Vector3();
+ line_bgn[b] = position_b;
+ line_end[b] = position_b;
+ line_bgn[a] = bgn_a;
+ line_end[a] = end_a;
+ grid_points[c].push_back(line_bgn);
+ grid_points[c].push_back(line_end);
+ grid_colors[c].push_back(line_color);
+ grid_colors[c].push_back(line_color);
+ }
+ }
+
+ // Create a mesh from the pushed vector points and colors.
+ grid[c] = RenderingServer::get_singleton()->mesh_create();
+ Array d;
+ d.resize(RS::ARRAY_MAX);
+ d[RenderingServer::ARRAY_VERTEX] = grid_points[c];
+ d[RenderingServer::ARRAY_COLOR] = grid_colors[c];
+ RenderingServer::get_singleton()->mesh_add_surface_from_arrays(grid[c], RenderingServer::PRIMITIVE_LINES, d);
+ RenderingServer::get_singleton()->mesh_surface_set_material(grid[c], 0, indicator_mat->get_rid());
+ grid_instance[c] = RenderingServer::get_singleton()->instance_create2(grid[c], get_tree()->get_root()->get_world_3d()->get_scenario());
+
+ // Yes, the end of this line is supposed to be a.
+ RenderingServer::get_singleton()->instance_set_visible(grid_instance[c], grid_visible[a]);
+ RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(grid_instance[c], RS::SHADOW_CASTING_SETTING_OFF);
+ RS::get_singleton()->instance_set_layer_mask(grid_instance[c], 1 << Node3DEditorViewport::GIZMO_GRID_LAYER);
+ }
+}
+
+void Node3DEditor::_finish_indicators() {
+ RenderingServer::get_singleton()->free(origin_instance);
+ RenderingServer::get_singleton()->free(origin);
+
+ _finish_grid();
+}
+
+void Node3DEditor::_finish_grid() {
+ for (int i = 0; i < 3; i++) {
+ RenderingServer::get_singleton()->free(grid_instance[i]);
+ RenderingServer::get_singleton()->free(grid[i]);
+ }
+}
+
+void Node3DEditor::update_grid() {
+ _finish_grid();
+ _init_grid();
+}
+
+bool Node3DEditor::is_any_freelook_active() const {
+ for (unsigned int i = 0; i < VIEWPORTS_COUNT; ++i) {
+ if (viewports[i]->is_freelook_active()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void Node3DEditor::_refresh_menu_icons() {
+ bool all_locked = true;
+ bool all_grouped = true;
+
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+
+ if (selection.empty()) {
+ all_locked = false;
+ all_grouped = false;
+ } else {
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ if (Object::cast_to<Node3D>(E->get()) && !Object::cast_to<Node3D>(E->get())->has_meta("_edit_lock_")) {
+ all_locked = false;
+ break;
+ }
+ }
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ if (Object::cast_to<Node3D>(E->get()) && !Object::cast_to<Node3D>(E->get())->has_meta("_edit_group_")) {
+ all_grouped = false;
+ break;
+ }
+ }
+ }
+
+ tool_button[TOOL_LOCK_SELECTED]->set_visible(!all_locked);
+ tool_button[TOOL_LOCK_SELECTED]->set_disabled(selection.empty());
+ tool_button[TOOL_UNLOCK_SELECTED]->set_visible(all_locked);
+
+ tool_button[TOOL_GROUP_SELECTED]->set_visible(!all_grouped);
+ tool_button[TOOL_GROUP_SELECTED]->set_disabled(selection.empty());
+ tool_button[TOOL_UNGROUP_SELECTED]->set_visible(all_grouped);
+}
+
+template <typename T>
+Set<T *> _get_child_nodes(Node *parent_node) {
+ Set<T *> nodes = Set<T *>();
+ T *node = Node::cast_to<T>(parent_node);
+ if (node) {
+ nodes.insert(node);
+ }
+
+ for (int i = 0; i < parent_node->get_child_count(); i++) {
+ Node *child_node = parent_node->get_child(i);
+ Set<T *> child_nodes = _get_child_nodes<T>(child_node);
+ for (typename Set<T *>::Element *I = child_nodes.front(); I; I = I->next()) {
+ nodes.insert(I->get());
+ }
+ }
+
+ return nodes;
+}
+
+Set<RID> _get_physics_bodies_rid(Node *node) {
+ Set<RID> rids = Set<RID>();
+ PhysicsBody3D *pb = Node::cast_to<PhysicsBody3D>(node);
+ if (pb) {
+ rids.insert(pb->get_rid());
+ }
+ Set<PhysicsBody3D *> child_nodes = _get_child_nodes<PhysicsBody3D>(node);
+ for (Set<PhysicsBody3D *>::Element *I = child_nodes.front(); I; I = I->next()) {
+ rids.insert(I->get()->get_rid());
+ }
+
+ return rids;
+}
+
+void Node3DEditor::snap_selected_nodes_to_floor() {
+ List<Node *> &selection = editor_selection->get_selected_node_list();
+ Dictionary snap_data;
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node3D *sp = Object::cast_to<Node3D>(E->get());
+ if (sp) {
+ Vector3 from = Vector3();
+ Vector3 position_offset = Vector3();
+
+ // Priorities for snapping to floor are CollisionShapes, VisualInstances and then origin
+ Set<VisualInstance3D *> vi = _get_child_nodes<VisualInstance3D>(sp);
+ Set<CollisionShape3D *> cs = _get_child_nodes<CollisionShape3D>(sp);
+
+ if (cs.size()) {
+ AABB aabb = sp->get_global_transform().xform(cs.front()->get()->get_shape()->get_debug_mesh()->get_aabb());
+ for (Set<CollisionShape3D *>::Element *I = cs.front(); I; I = I->next()) {
+ aabb.merge_with(sp->get_global_transform().xform(I->get()->get_shape()->get_debug_mesh()->get_aabb()));
+ }
+ Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
+ from = aabb.position + size;
+ position_offset.y = from.y - sp->get_global_transform().origin.y;
+ } else if (vi.size()) {
+ AABB aabb = vi.front()->get()->get_transformed_aabb();
+ for (Set<VisualInstance3D *>::Element *I = vi.front(); I; I = I->next()) {
+ aabb.merge_with(I->get()->get_transformed_aabb());
+ }
+ Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
+ from = aabb.position + size;
+ position_offset.y = from.y - sp->get_global_transform().origin.y;
+ } else {
+ from = sp->get_global_transform().origin;
+ }
+
+ // We add a bit of margin to the from position to avoid it from snapping
+ // when the spatial is already on a floor and there's another floor under
+ // it
+ from = from + Vector3(0.0, 0.2, 0.0);
+
+ Dictionary d;
+
+ d["from"] = from;
+ d["position_offset"] = position_offset;
+ snap_data[sp] = d;
+ }
+ }
+
+ PhysicsDirectSpaceState3D *ss = get_tree()->get_root()->get_world_3d()->get_direct_space_state();
+ PhysicsDirectSpaceState3D::RayResult result;
+
+ Array keys = snap_data.keys();
+
+ // The maximum height an object can travel to be snapped
+ const float max_snap_height = 20.0;
+
+ // Will be set to `true` if at least one node from the selection was successfully snapped
+ bool snapped_to_floor = false;
+
+ if (keys.size()) {
+ // For snapping to be performed, there must be solid geometry under at least one of the selected nodes.
+ // We need to check this before snapping to register the undo/redo action only if needed.
+ for (int i = 0; i < keys.size(); i++) {
+ Node *node = keys[i];
+ Node3D *sp = Object::cast_to<Node3D>(node);
+ Dictionary d = snap_data[node];
+ Vector3 from = d["from"];
+ Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
+ Set<RID> excluded = _get_physics_bodies_rid(sp);
+
+ if (ss->intersect_ray(from, to, result, excluded)) {
+ snapped_to_floor = true;
+ }
+ }
+
+ if (snapped_to_floor) {
+ undo_redo->create_action(TTR("Snap Nodes To Floor"));
+
+ // Perform snapping if at least one node can be snapped
+ for (int i = 0; i < keys.size(); i++) {
+ Node *node = keys[i];
+ Node3D *sp = Object::cast_to<Node3D>(node);
+ Dictionary d = snap_data[node];
+ Vector3 from = d["from"];
+ Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
+ Set<RID> excluded = _get_physics_bodies_rid(sp);
+
+ if (ss->intersect_ray(from, to, result, excluded)) {
+ Vector3 position_offset = d["position_offset"];
+ Transform new_transform = sp->get_global_transform();
+
+ new_transform.origin.y = result.position.y;
+ new_transform.origin = new_transform.origin - position_offset;
+
+ undo_redo->add_do_method(sp, "set_global_transform", new_transform);
+ undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_transform());
+ }
+ }
+
+ undo_redo->commit_action();
+ } else {
+ EditorNode::get_singleton()->show_warning(TTR("Couldn't find a solid floor to snap the selection to."));
+ }
+ }
+}
+
+void Node3DEditor::_unhandled_key_input(Ref<InputEvent> p_event) {
+ if (!is_visible_in_tree()) {
+ return;
+ }
+
+ snap_key_enabled = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+}
+
+void Node3DEditor::_notification(int p_what) {
+ if (p_what == NOTIFICATION_READY) {
+ tool_button[Node3DEditor::TOOL_MODE_SELECT]->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_MOVE]->set_icon(get_theme_icon("ToolMove", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_ROTATE]->set_icon(get_theme_icon("ToolRotate", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_SCALE]->set_icon(get_theme_icon("ToolScale", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_theme_icon("ListSelect", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_LOCK_SELECTED]->set_icon(get_theme_icon("Lock", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_UNLOCK_SELECTED]->set_icon(get_theme_icon("Unlock", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_GROUP_SELECTED]->set_icon(get_theme_icon("Group", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_UNGROUP_SELECTED]->set_icon(get_theme_icon("Ungroup", "EditorIcons"));
+
+ tool_option_button[Node3DEditor::TOOL_OPT_LOCAL_COORDS]->set_icon(get_theme_icon("Object", "EditorIcons"));
+ tool_option_button[Node3DEditor::TOOL_OPT_USE_SNAP]->set_icon(get_theme_icon("Snap", "EditorIcons"));
+ tool_option_button[Node3DEditor::TOOL_OPT_OVERRIDE_CAMERA]->set_icon(get_theme_icon("Camera3D", "EditorIcons"));
+
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), get_theme_icon("Panels1", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), get_theme_icon("Panels2", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), get_theme_icon("Panels2Alt", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), get_theme_icon("Panels3", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_theme_icon("Panels3Alt", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_theme_icon("Panels4", "EditorIcons"));
+
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+
+ _refresh_menu_icons();
+
+ get_tree()->connect("node_removed", callable_mp(this, &Node3DEditor::_node_removed));
+ EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->connect("node_changed", callable_mp(this, &Node3DEditor::_refresh_menu_icons));
+ editor_selection->connect("selection_changed", callable_mp(this, &Node3DEditor::_refresh_menu_icons));
+
+ editor->connect("stop_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(false));
+ editor->connect("play_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(true));
+ } else if (p_what == NOTIFICATION_ENTER_TREE) {
+ _register_all_gizmos();
+ _update_gizmos_menu();
+ _init_indicators();
+ } else if (p_what == NOTIFICATION_THEME_CHANGED) {
+ _update_gizmos_menu_theme();
+ } else if (p_what == NOTIFICATION_EXIT_TREE) {
+ _finish_indicators();
+ } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
+ tool_button[Node3DEditor::TOOL_MODE_SELECT]->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_MOVE]->set_icon(get_theme_icon("ToolMove", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_ROTATE]->set_icon(get_theme_icon("ToolRotate", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_SCALE]->set_icon(get_theme_icon("ToolScale", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_theme_icon("ListSelect", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_LOCK_SELECTED]->set_icon(get_theme_icon("Lock", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_UNLOCK_SELECTED]->set_icon(get_theme_icon("Unlock", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_GROUP_SELECTED]->set_icon(get_theme_icon("Group", "EditorIcons"));
+ tool_button[Node3DEditor::TOOL_UNGROUP_SELECTED]->set_icon(get_theme_icon("Ungroup", "EditorIcons"));
+
+ tool_option_button[Node3DEditor::TOOL_OPT_LOCAL_COORDS]->set_icon(get_theme_icon("Object", "EditorIcons"));
+ tool_option_button[Node3DEditor::TOOL_OPT_USE_SNAP]->set_icon(get_theme_icon("Snap", "EditorIcons"));
+
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), get_theme_icon("Panels1", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), get_theme_icon("Panels2", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), get_theme_icon("Panels2Alt", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), get_theme_icon("Panels3", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_theme_icon("Panels3Alt", "EditorIcons"));
+ view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_theme_icon("Panels4", "EditorIcons"));
+
+ // Update grid color by rebuilding grid.
+ _finish_grid();
+ _init_grid();
+ } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+ if (!is_visible() && tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->is_pressed()) {
+ EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
+
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE);
+ tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_pressed(false);
+ }
+ }
+}
+
+void Node3DEditor::add_control_to_menu_panel(Control *p_control) {
+ hbc_menu->add_child(p_control);
+}
+
+void Node3DEditor::remove_control_from_menu_panel(Control *p_control) {
+ hbc_menu->remove_child(p_control);
+}
+
+void Node3DEditor::set_can_preview(Camera3D *p_preview) {
+ for (int i = 0; i < 4; i++) {
+ viewports[i]->set_can_preview(p_preview);
+ }
+}
+
+VSplitContainer *Node3DEditor::get_shader_split() {
+ return shader_split;
+}
+
+HSplitContainer *Node3DEditor::get_palette_split() {
+ return palette_split;
+}
+
+void Node3DEditor::_request_gizmo(Object *p_obj) {
+ Node3D *sp = Object::cast_to<Node3D>(p_obj);
+ if (!sp) {
+ return;
+ }
+ if (editor->get_edited_scene() && (sp == editor->get_edited_scene() || (sp->get_owner() && editor->get_edited_scene()->is_a_parent_of(sp)))) {
+ Ref<EditorNode3DGizmo> seg;
+
+ for (int i = 0; i < gizmo_plugins_by_priority.size(); ++i) {
+ seg = gizmo_plugins_by_priority.write[i]->get_gizmo(sp);
+
+ if (seg.is_valid()) {
+ sp->set_gizmo(seg);
+
+ if (sp == selected) {
+ seg->set_selected(true);
+ selected->update_gizmo();
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+void Node3DEditor::_toggle_maximize_view(Object *p_viewport) {
+ if (!p_viewport) {
+ return;
+ }
+ Node3DEditorViewport *current_viewport = Object::cast_to<Node3DEditorViewport>(p_viewport);
+ if (!current_viewport) {
+ return;
+ }
+
+ int index = -1;
+ bool maximized = false;
+ for (int i = 0; i < 4; i++) {
+ if (viewports[i] == current_viewport) {
+ index = i;
+ if (current_viewport->get_global_rect() == viewport_base->get_global_rect()) {
+ maximized = true;
+ }
+ break;
+ }
+ }
+ if (index == -1) {
+ return;
+ }
+
+ if (!maximized) {
+ for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
+ if (i == (uint32_t)index) {
+ viewports[i]->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ } else {
+ viewports[i]->hide();
+ }
+ }
+ } else {
+ for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
+ viewports[i]->show();
+ }
+
+ if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT))) {
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS))) {
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS);
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT))) {
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS_ALT);
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS))) {
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS);
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT))) {
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS_ALT);
+ } else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS))) {
+ _menu_item_pressed(MENU_VIEW_USE_4_VIEWPORTS);
+ }
+ }
+}
+
+void Node3DEditor::_node_removed(Node *p_node) {
+ if (p_node == selected) {
+ selected = nullptr;
+ }
+}
+
+void Node3DEditor::_register_all_gizmos() {
+ add_gizmo_plugin(Ref<Camera3DGizmoPlugin>(memnew(Camera3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<Light3DGizmoPlugin>(memnew(Light3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<AudioStreamPlayer3DGizmoPlugin>(memnew(AudioStreamPlayer3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<MeshInstance3DGizmoPlugin>(memnew(MeshInstance3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<SoftBody3DGizmoPlugin>(memnew(SoftBody3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<Sprite3DGizmoPlugin>(memnew(Sprite3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<Skeleton3DGizmoPlugin>(memnew(Skeleton3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<Position3DGizmoPlugin>(memnew(Position3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<RayCast3DGizmoPlugin>(memnew(RayCast3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<SpringArm3DGizmoPlugin>(memnew(SpringArm3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<VehicleWheel3DGizmoPlugin>(memnew(VehicleWheel3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<VisibilityNotifier3DGizmoPlugin>(memnew(VisibilityNotifier3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<GPUParticles3DGizmoPlugin>(memnew(GPUParticles3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<CPUParticles3DGizmoPlugin>(memnew(CPUParticles3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<ReflectionProbeGizmoPlugin>(memnew(ReflectionProbeGizmoPlugin)));
+ add_gizmo_plugin(Ref<DecalGizmoPlugin>(memnew(DecalGizmoPlugin)));
+ add_gizmo_plugin(Ref<GIProbeGizmoPlugin>(memnew(GIProbeGizmoPlugin)));
+ add_gizmo_plugin(Ref<BakedLightmapGizmoPlugin>(memnew(BakedLightmapGizmoPlugin)));
+ add_gizmo_plugin(Ref<LightmapProbeGizmoPlugin>(memnew(LightmapProbeGizmoPlugin)));
+ add_gizmo_plugin(Ref<CollisionShape3DGizmoPlugin>(memnew(CollisionShape3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<CollisionPolygon3DGizmoPlugin>(memnew(CollisionPolygon3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<NavigationRegion3DGizmoPlugin>(memnew(NavigationRegion3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<Joint3DGizmoPlugin>(memnew(Joint3DGizmoPlugin)));
+ add_gizmo_plugin(Ref<PhysicalBone3DGizmoPlugin>(memnew(PhysicalBone3DGizmoPlugin)));
+}
+
+void Node3DEditor::_bind_methods() {
+ ClassDB::bind_method("_unhandled_key_input", &Node3DEditor::_unhandled_key_input);
+ ClassDB::bind_method("_get_editor_data", &Node3DEditor::_get_editor_data);
+ ClassDB::bind_method("_request_gizmo", &Node3DEditor::_request_gizmo);
+ ClassDB::bind_method("_refresh_menu_icons", &Node3DEditor::_refresh_menu_icons);
+
+ ADD_SIGNAL(MethodInfo("transform_key_request"));
+ ADD_SIGNAL(MethodInfo("item_lock_status_changed"));
+ ADD_SIGNAL(MethodInfo("item_group_status_changed"));
+}
+
+void Node3DEditor::clear() {
+ settings_fov->set_value(EDITOR_DEF("editors/3d/default_fov", 70.0));
+ settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near", 0.05));
+ settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far", 1500.0));
+
+ for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
+ viewports[i]->reset();
+ }
+
+ RenderingServer::get_singleton()->instance_set_visible(origin_instance, true);
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN), true);
+ for (int i = 0; i < 3; ++i) {
+ if (grid_enable[i]) {
+ RenderingServer::get_singleton()->instance_set_visible(grid_instance[i], true);
+ grid_visible[i] = true;
+ }
+ }
+
+ for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
+ viewports[i]->view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(Node3DEditorViewport::VIEW_AUDIO_LISTENER), i == 0);
+ viewports[i]->viewport->set_as_audio_listener(i == 0);
+ }
+
+ view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID), true);
+}
+
+Node3DEditor::Node3DEditor(EditorNode *p_editor) {
+ gizmo.visible = true;
+ gizmo.scale = 1.0;
+
+ viewport_environment = Ref<Environment>(memnew(Environment));
+ undo_redo = p_editor->get_undo_redo();
+ VBoxContainer *vbc = this;
+
+ custom_camera = nullptr;
+ singleton = this;
+ editor = p_editor;
+ editor_selection = editor->get_editor_selection();
+ editor_selection->add_editor_plugin(this);
+
+ snap_enabled = false;
+ snap_key_enabled = false;
+ tool_mode = TOOL_MODE_SELECT;
+
+ camera_override_viewport_id = 0;
+
+ hbc_menu = memnew(HBoxContainer);
+ vbc->add_child(hbc_menu);
+
+ Vector<Variant> button_binds;
+ button_binds.resize(1);
+ String sct;
+
+ tool_button[TOOL_MODE_SELECT] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_MODE_SELECT]);
+ tool_button[TOOL_MODE_SELECT]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_SELECT]->set_flat(true);
+ tool_button[TOOL_MODE_SELECT]->set_pressed(true);
+ button_binds.write[0] = MENU_TOOL_SELECT;
+ tool_button[TOOL_MODE_SELECT]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_MODE_SELECT]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_select", TTR("Select Mode"), KEY_Q));
+ tool_button[TOOL_MODE_SELECT]->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate\nAlt+Drag: Move\nAlt+RMB: Depth list selection"));
+
+ hbc_menu->add_child(memnew(VSeparator));
+
+ tool_button[TOOL_MODE_MOVE] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_MODE_MOVE]);
+ tool_button[TOOL_MODE_MOVE]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_MOVE]->set_flat(true);
+ button_binds.write[0] = MENU_TOOL_MOVE;
+ tool_button[TOOL_MODE_MOVE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_MODE_MOVE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_move", TTR("Move Mode"), KEY_W));
+
+ tool_button[TOOL_MODE_ROTATE] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_MODE_ROTATE]);
+ tool_button[TOOL_MODE_ROTATE]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_ROTATE]->set_flat(true);
+ button_binds.write[0] = MENU_TOOL_ROTATE;
+ tool_button[TOOL_MODE_ROTATE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_MODE_ROTATE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Rotate Mode"), KEY_E));
+
+ tool_button[TOOL_MODE_SCALE] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_MODE_SCALE]);
+ tool_button[TOOL_MODE_SCALE]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_SCALE]->set_flat(true);
+ button_binds.write[0] = MENU_TOOL_SCALE;
+ tool_button[TOOL_MODE_SCALE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_MODE_SCALE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_scale", TTR("Scale Mode"), KEY_R));
+
+ hbc_menu->add_child(memnew(VSeparator));
+
+ tool_button[TOOL_MODE_LIST_SELECT] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_MODE_LIST_SELECT]);
+ tool_button[TOOL_MODE_LIST_SELECT]->set_toggle_mode(true);
+ tool_button[TOOL_MODE_LIST_SELECT]->set_flat(true);
+ button_binds.write[0] = MENU_TOOL_LIST_SELECT;
+ tool_button[TOOL_MODE_LIST_SELECT]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_MODE_LIST_SELECT]->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."));
+
+ tool_button[TOOL_LOCK_SELECTED] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_LOCK_SELECTED]);
+ tool_button[TOOL_LOCK_SELECTED]->set_flat(true);
+ button_binds.write[0] = MENU_LOCK_SELECTED;
+ tool_button[TOOL_LOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_LOCK_SELECTED]->set_tooltip(TTR("Lock the selected object in place (can't be moved)."));
+
+ tool_button[TOOL_UNLOCK_SELECTED] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_UNLOCK_SELECTED]);
+ tool_button[TOOL_UNLOCK_SELECTED]->set_flat(true);
+ button_binds.write[0] = MENU_UNLOCK_SELECTED;
+ tool_button[TOOL_UNLOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip(TTR("Unlock the selected object (can be moved)."));
+
+ tool_button[TOOL_GROUP_SELECTED] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_GROUP_SELECTED]);
+ tool_button[TOOL_GROUP_SELECTED]->set_flat(true);
+ button_binds.write[0] = MENU_GROUP_SELECTED;
+ tool_button[TOOL_GROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_GROUP_SELECTED]->set_tooltip(TTR("Makes sure the object's children are not selectable."));
+
+ tool_button[TOOL_UNGROUP_SELECTED] = memnew(Button);
+ hbc_menu->add_child(tool_button[TOOL_UNGROUP_SELECTED]);
+ tool_button[TOOL_UNGROUP_SELECTED]->set_flat(true);
+ button_binds.write[0] = MENU_UNGROUP_SELECTED;
+ tool_button[TOOL_UNGROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
+ tool_button[TOOL_UNGROUP_SELECTED]->set_tooltip(TTR("Restores the object's children's ability to be selected."));
+
+ hbc_menu->add_child(memnew(VSeparator));
+
+ tool_option_button[TOOL_OPT_LOCAL_COORDS] = memnew(Button);
+ hbc_menu->add_child(tool_option_button[TOOL_OPT_LOCAL_COORDS]);
+ tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_toggle_mode(true);
+ tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_flat(true);
+ button_binds.write[0] = MENU_TOOL_LOCAL_COORDS;
+ tool_option_button[TOOL_OPT_LOCAL_COORDS]->connect("toggled", callable_mp(this, &Node3DEditor::_menu_item_toggled), button_binds);
+ tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_shortcut(ED_SHORTCUT("spatial_editor/local_coords", TTR("Use Local Space"), KEY_T));
+
+ tool_option_button[TOOL_OPT_USE_SNAP] = memnew(Button);
+ hbc_menu->add_child(tool_option_button[TOOL_OPT_USE_SNAP]);
+ tool_option_button[TOOL_OPT_USE_SNAP]->set_toggle_mode(true);
+ tool_option_button[TOOL_OPT_USE_SNAP]->set_flat(true);
+ button_binds.write[0] = MENU_TOOL_USE_SNAP;
+ tool_option_button[TOOL_OPT_USE_SNAP]->connect("toggled", callable_mp(this, &Node3DEditor::_menu_item_toggled), button_binds);
+ tool_option_button[TOOL_OPT_USE_SNAP]->set_shortcut(ED_SHORTCUT("spatial_editor/snap", TTR("Use Snap"), KEY_Y));
+
+ hbc_menu->add_child(memnew(VSeparator));
+
+ tool_option_button[TOOL_OPT_OVERRIDE_CAMERA] = memnew(Button);
+ hbc_menu->add_child(tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]);
+ tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_toggle_mode(true);
+ tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_flat(true);
+ tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_disabled(true);
+ button_binds.write[0] = MENU_TOOL_OVERRIDE_CAMERA;
+ tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->connect("toggled", callable_mp(this, &Node3DEditor::_menu_item_toggled), button_binds);
+ _update_camera_override_button(false);
+
+ hbc_menu->add_child(memnew(VSeparator));
+
+ // Drag and drop support;
+ preview_node = memnew(Node3D);
+ preview_bounds = AABB();
+
+ ED_SHORTCUT("spatial_editor/bottom_view", TTR("Bottom View"), KEY_MASK_ALT + KEY_KP_7);
+ ED_SHORTCUT("spatial_editor/top_view", TTR("Top View"), KEY_KP_7);
+ ED_SHORTCUT("spatial_editor/rear_view", TTR("Rear View"), KEY_MASK_ALT + KEY_KP_1);
+ ED_SHORTCUT("spatial_editor/front_view", TTR("Front View"), KEY_KP_1);
+ ED_SHORTCUT("spatial_editor/left_view", TTR("Left View"), KEY_MASK_ALT + KEY_KP_3);
+ ED_SHORTCUT("spatial_editor/right_view", TTR("Right View"), KEY_KP_3);
+ ED_SHORTCUT("spatial_editor/switch_perspective_orthogonal", TTR("Switch Perspective/Orthogonal View"), KEY_KP_5);
+ ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), KEY_K);
+ ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), KEY_O);
+ ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F);
+ ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_M);
+ ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F);
+ ED_SHORTCUT("spatial_editor/freelook_toggle", TTR("Toggle Freelook"), KEY_MASK_SHIFT + KEY_F);
+
+ PopupMenu *p;
+
+ transform_menu = memnew(MenuButton);
+ transform_menu->set_text(TTR("Transform"));
+ transform_menu->set_switch_on_hover(true);
+ hbc_menu->add_child(transform_menu);
+
+ p = transform_menu->get_popup();
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/snap_to_floor", TTR("Snap Object to Floor"), KEY_PAGEDOWN), MENU_SNAP_TO_FLOOR);
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/transform_dialog", TTR("Transform Dialog...")), MENU_TRANSFORM_DIALOG);
+
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/configure_snap", TTR("Configure Snap...")), MENU_TRANSFORM_CONFIGURE_SNAP);
+
+ p->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed));
+
+ view_menu = memnew(MenuButton);
+ view_menu->set_text(TTR("View"));
+ view_menu->set_switch_on_hover(true);
+ hbc_menu->add_child(view_menu);
+
+ p = view_menu->get_popup();
+
+ accept = memnew(AcceptDialog);
+ editor->get_gui_base()->add_child(accept);
+
+ p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KEY_MASK_CMD + KEY_1), MENU_VIEW_USE_1_VIEWPORT);
+ p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KEY_MASK_CMD + KEY_2), MENU_VIEW_USE_2_VIEWPORTS);
+ p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports_alt", TTR("2 Viewports (Alt)"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_2), MENU_VIEW_USE_2_VIEWPORTS_ALT);
+ p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports", TTR("3 Viewports"), KEY_MASK_CMD + KEY_3), MENU_VIEW_USE_3_VIEWPORTS);
+ p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports_alt", TTR("3 Viewports (Alt)"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_3), MENU_VIEW_USE_3_VIEWPORTS_ALT);
+ p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KEY_MASK_CMD + KEY_4), MENU_VIEW_USE_4_VIEWPORTS);
+ p->add_separator();
+
+ p->add_submenu_item(TTR("Gizmos"), "GizmosMenu");
+
+ p->add_separator();
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN);
+ p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid")), MENU_VIEW_GRID);
+
+ p->add_separator();
+ p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings...")), MENU_VIEW_CAMERA_SETTINGS);
+
+ p->set_item_checked(p->get_item_index(MENU_VIEW_ORIGIN), true);
+ p->set_item_checked(p->get_item_index(MENU_VIEW_GRID), true);
+
+ p->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed));
+
+ gizmos_menu = memnew(PopupMenu);
+ p->add_child(gizmos_menu);
+ gizmos_menu->set_name("GizmosMenu");
+ gizmos_menu->set_hide_on_checkable_item_selection(false);
+ gizmos_menu->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_gizmo_toggled));
+
+ /* REST OF MENU */
+
+ palette_split = memnew(HSplitContainer);
+ palette_split->set_v_size_flags(SIZE_EXPAND_FILL);
+ vbc->add_child(palette_split);
+
+ shader_split = memnew(VSplitContainer);
+ shader_split->set_h_size_flags(SIZE_EXPAND_FILL);
+ palette_split->add_child(shader_split);
+ viewport_base = memnew(Node3DEditorViewportContainer);
+ shader_split->add_child(viewport_base);
+ viewport_base->set_v_size_flags(SIZE_EXPAND_FILL);
+ for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
+ viewports[i] = memnew(Node3DEditorViewport(this, editor, i));
+ viewports[i]->connect("toggle_maximize_view", callable_mp(this, &Node3DEditor::_toggle_maximize_view));
+ viewports[i]->connect("clicked", callable_mp(this, &Node3DEditor::_update_camera_override_viewport));
+ viewports[i]->assign_pending_data_pointers(preview_node, &preview_bounds, accept);
+ viewport_base->add_child(viewports[i]);
+ }
+
+ /* SNAP DIALOG */
+
+ snap_translate_value = 1;
+ snap_rotate_value = 15;
+ snap_scale_value = 10;
+
+ snap_dialog = memnew(ConfirmationDialog);
+ snap_dialog->set_title(TTR("Snap Settings"));
+ add_child(snap_dialog);
+ snap_dialog->connect("confirmed", callable_mp(this, &Node3DEditor::_snap_changed));
+ snap_dialog->get_cancel()->connect("pressed", callable_mp(this, &Node3DEditor::_snap_update));
+
+ VBoxContainer *snap_dialog_vbc = memnew(VBoxContainer);
+ snap_dialog->add_child(snap_dialog_vbc);
+
+ snap_translate = memnew(LineEdit);
+ snap_dialog_vbc->add_margin_child(TTR("Translate Snap:"), snap_translate);
+
+ snap_rotate = memnew(LineEdit);
+ snap_dialog_vbc->add_margin_child(TTR("Rotate Snap (deg.):"), snap_rotate);
+
+ snap_scale = memnew(LineEdit);
+ snap_dialog_vbc->add_margin_child(TTR("Scale Snap (%):"), snap_scale);
+
+ _snap_update();
+
+ /* SETTINGS DIALOG */
+
+ settings_dialog = memnew(ConfirmationDialog);
+ settings_dialog->set_title(TTR("Viewport Settings"));
+ add_child(settings_dialog);
+ settings_vbc = memnew(VBoxContainer);
+ settings_vbc->set_custom_minimum_size(Size2(200, 0) * EDSCALE);
+ settings_dialog->add_child(settings_vbc);
+
+ settings_fov = memnew(SpinBox);
+ settings_fov->set_max(MAX_FOV);
+ settings_fov->set_min(MIN_FOV);
+ settings_fov->set_step(0.01);
+ settings_fov->set_value(EDITOR_DEF("editors/3d/default_fov", 70.0));
+ settings_vbc->add_margin_child(TTR("Perspective FOV (deg.):"), settings_fov);
+
+ settings_znear = memnew(SpinBox);
+ settings_znear->set_max(MAX_Z);
+ settings_znear->set_min(MIN_Z);
+ settings_znear->set_step(0.01);
+ settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near", 0.05));
+ settings_vbc->add_margin_child(TTR("View Z-Near:"), settings_znear);
+
+ settings_zfar = memnew(SpinBox);
+ settings_zfar->set_max(MAX_Z);
+ settings_zfar->set_min(MIN_Z);
+ settings_zfar->set_step(0.01);
+ settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far", 1500));
+ settings_vbc->add_margin_child(TTR("View Z-Far:"), settings_zfar);
+
+ for (uint32_t i = 0; i < VIEWPORTS_COUNT; ++i) {
+ settings_dialog->connect("confirmed", callable_mp(viewports[i], &Node3DEditorViewport::_update_camera), varray(0.0));
+ }
+
+ /* XFORM DIALOG */
+
+ xform_dialog = memnew(ConfirmationDialog);
+ xform_dialog->set_title(TTR("Transform Change"));
+ add_child(xform_dialog);
+
+ VBoxContainer *xform_vbc = memnew(VBoxContainer);
+ xform_dialog->add_child(xform_vbc);
+
+ Label *l = memnew(Label);
+ l->set_text(TTR("Translate:"));
+ xform_vbc->add_child(l);
+
+ HBoxContainer *xform_hbc = memnew(HBoxContainer);
+ xform_vbc->add_child(xform_hbc);
+
+ for (int i = 0; i < 3; i++) {
+ xform_translate[i] = memnew(LineEdit);
+ xform_translate[i]->set_h_size_flags(SIZE_EXPAND_FILL);
+ xform_hbc->add_child(xform_translate[i]);
+ }
+
+ l = memnew(Label);
+ l->set_text(TTR("Rotate (deg.):"));
+ xform_vbc->add_child(l);
+
+ xform_hbc = memnew(HBoxContainer);
+ xform_vbc->add_child(xform_hbc);
+
+ for (int i = 0; i < 3; i++) {
+ xform_rotate[i] = memnew(LineEdit);
+ xform_rotate[i]->set_h_size_flags(SIZE_EXPAND_FILL);
+ xform_hbc->add_child(xform_rotate[i]);
+ }
+
+ l = memnew(Label);
+ l->set_text(TTR("Scale (ratio):"));
+ xform_vbc->add_child(l);
+
+ xform_hbc = memnew(HBoxContainer);
+ xform_vbc->add_child(xform_hbc);
+
+ for (int i = 0; i < 3; i++) {
+ xform_scale[i] = memnew(LineEdit);
+ xform_scale[i]->set_h_size_flags(SIZE_EXPAND_FILL);
+ xform_hbc->add_child(xform_scale[i]);
+ }
+
+ l = memnew(Label);
+ l->set_text(TTR("Transform Type"));
+ xform_vbc->add_child(l);
+
+ xform_type = memnew(OptionButton);
+ xform_type->set_h_size_flags(SIZE_EXPAND_FILL);
+ xform_type->add_item(TTR("Pre"));
+ xform_type->add_item(TTR("Post"));
+ xform_vbc->add_child(xform_type);
+
+ xform_dialog->connect("confirmed", callable_mp(this, &Node3DEditor::_xform_dialog_action));
+
+ scenario_debug = RenderingServer::SCENARIO_DEBUG_DISABLED;
+
+ selected = nullptr;
+
+ set_process_unhandled_key_input(true);
+ add_to_group("_spatial_editor_group");
+
+ EDITOR_DEF("editors/3d/manipulator_gizmo_size", 80);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "editors/3d/manipulator_gizmo_size", PROPERTY_HINT_RANGE, "16,1024,1"));
+ EDITOR_DEF("editors/3d/manipulator_gizmo_opacity", 0.4);
+ EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::FLOAT, "editors/3d/manipulator_gizmo_opacity", PROPERTY_HINT_RANGE, "0,1,0.01"));
+ EDITOR_DEF("editors/3d/navigation/show_viewport_rotation_gizmo", true);
+
+ over_gizmo_handle = -1;
+}
+
+Node3DEditor::~Node3DEditor() {
+ memdelete(preview_node);
+}
+
+void Node3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ spatial_editor->show();
+ spatial_editor->set_process(true);
+
+ } else {
+ spatial_editor->hide();
+ spatial_editor->set_process(false);
+ }
+}
+
+void Node3DEditorPlugin::edit(Object *p_object) {
+ spatial_editor->edit(Object::cast_to<Node3D>(p_object));
+}
+
+bool Node3DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("Node3D");
+}
+
+Dictionary Node3DEditorPlugin::get_state() const {
+ return spatial_editor->get_state();
+}
+
+void Node3DEditorPlugin::set_state(const Dictionary &p_state) {
+ spatial_editor->set_state(p_state);
+}
+
+void Node3DEditor::snap_cursor_to_plane(const Plane &p_plane) {
+ //cursor.pos=p_plane.project(cursor.pos);
+}
+
+Vector3 Node3DEditor::snap_point(Vector3 p_target, Vector3 p_start) const {
+ if (is_snap_enabled()) {
+ p_target.x = Math::snap_scalar(0.0, get_translate_snap(), p_target.x);
+ p_target.y = Math::snap_scalar(0.0, get_translate_snap(), p_target.y);
+ p_target.z = Math::snap_scalar(0.0, get_translate_snap(), p_target.z);
+ }
+ return p_target;
+}
+
+float Node3DEditor::get_translate_snap() const {
+ float snap_value;
+ if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
+ snap_value = snap_translate->get_text().to_float() / 10.0;
+ } else {
+ snap_value = snap_translate->get_text().to_float();
+ }
+
+ return snap_value;
+}
+
+float Node3DEditor::get_rotate_snap() const {
+ float snap_value;
+ if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
+ snap_value = snap_rotate->get_text().to_float() / 3.0;
+ } else {
+ snap_value = snap_rotate->get_text().to_float();
+ }
+
+ return snap_value;
+}
+
+float Node3DEditor::get_scale_snap() const {
+ float snap_value;
+ if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
+ snap_value = snap_scale->get_text().to_float() / 2.0;
+ } else {
+ snap_value = snap_scale->get_text().to_float();
+ }
+
+ return snap_value;
+}
+
+void Node3DEditorPlugin::_bind_methods() {
+ ClassDB::bind_method("snap_cursor_to_plane", &Node3DEditorPlugin::snap_cursor_to_plane);
+}
+
+void Node3DEditorPlugin::snap_cursor_to_plane(const Plane &p_plane) {
+ spatial_editor->snap_cursor_to_plane(p_plane);
+}
+
+struct _GizmoPluginPriorityComparator {
+ bool operator()(const Ref<EditorNode3DGizmoPlugin> &p_a, const Ref<EditorNode3DGizmoPlugin> &p_b) const {
+ if (p_a->get_priority() == p_b->get_priority()) {
+ return p_a->get_name() < p_b->get_name();
+ }
+ return p_a->get_priority() > p_b->get_priority();
+ }
+};
+
+struct _GizmoPluginNameComparator {
+ bool operator()(const Ref<EditorNode3DGizmoPlugin> &p_a, const Ref<EditorNode3DGizmoPlugin> &p_b) const {
+ return p_a->get_name() < p_b->get_name();
+ }
+};
+
+void Node3DEditor::add_gizmo_plugin(Ref<EditorNode3DGizmoPlugin> p_plugin) {
+ ERR_FAIL_NULL(p_plugin.ptr());
+
+ gizmo_plugins_by_priority.push_back(p_plugin);
+ gizmo_plugins_by_priority.sort_custom<_GizmoPluginPriorityComparator>();
+
+ gizmo_plugins_by_name.push_back(p_plugin);
+ gizmo_plugins_by_name.sort_custom<_GizmoPluginNameComparator>();
+
+ _update_gizmos_menu();
+ Node3DEditor::get_singleton()->update_all_gizmos();
+}
+
+void Node3DEditor::remove_gizmo_plugin(Ref<EditorNode3DGizmoPlugin> p_plugin) {
+ gizmo_plugins_by_priority.erase(p_plugin);
+ gizmo_plugins_by_name.erase(p_plugin);
+ _update_gizmos_menu();
+}
+
+Node3DEditorPlugin::Node3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ spatial_editor = memnew(Node3DEditor(p_node));
+ spatial_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ editor->get_viewport()->add_child(spatial_editor);
+
+ spatial_editor->hide();
+ spatial_editor->connect_compat("transform_key_request", editor->get_inspector_dock(), "_transform_keyed");
+}
+
+Node3DEditorPlugin::~Node3DEditorPlugin() {
+}
+
+void EditorNode3DGizmoPlugin::create_material(const String &p_name, const Color &p_color, bool p_billboard, bool p_on_top, bool p_use_vertex_color) {
+ Color instanced_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/instanced", Color(0.7, 0.7, 0.7, 0.6));
+
+ Vector<Ref<StandardMaterial3D>> mats;
+
+ for (int i = 0; i < 4; i++) {
+ bool selected = i % 2 == 1;
+ bool instanced = i < 2;
+
+ Ref<StandardMaterial3D> material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
+
+ Color color = instanced ? instanced_color : p_color;
+
+ if (!selected) {
+ color.a *= 0.3;
+ }
+
+ material->set_albedo(color);
+ material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ material->set_render_priority(StandardMaterial3D::RENDER_PRIORITY_MIN + 1);
+
+ if (p_use_vertex_color) {
+ material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ }
+
+ if (p_billboard) {
+ material->set_billboard_mode(StandardMaterial3D::BILLBOARD_ENABLED);
+ }
+
+ if (p_on_top && selected) {
+ material->set_on_top_of_alpha();
+ }
+
+ mats.push_back(material);
+ }
+
+ materials[p_name] = mats;
+}
+
+void EditorNode3DGizmoPlugin::create_icon_material(const String &p_name, const Ref<Texture2D> &p_texture, bool p_on_top, const Color &p_albedo) {
+ Color instanced_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/instanced", Color(0.7, 0.7, 0.7, 0.6));
+
+ Vector<Ref<StandardMaterial3D>> icons;
+
+ for (int i = 0; i < 4; i++) {
+ bool selected = i % 2 == 1;
+ bool instanced = i < 2;
+
+ Ref<StandardMaterial3D> icon = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
+
+ Color color = instanced ? instanced_color : p_albedo;
+
+ if (!selected) {
+ color.a *= 0.85;
+ }
+
+ icon->set_albedo(color);
+
+ icon->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ icon->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ icon->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ icon->set_cull_mode(StandardMaterial3D::CULL_DISABLED);
+ icon->set_depth_draw_mode(StandardMaterial3D::DEPTH_DRAW_DISABLED);
+ icon->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ icon->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, p_texture);
+ icon->set_flag(StandardMaterial3D::FLAG_FIXED_SIZE, true);
+ icon->set_billboard_mode(StandardMaterial3D::BILLBOARD_ENABLED);
+ icon->set_render_priority(StandardMaterial3D::RENDER_PRIORITY_MIN);
+
+ if (p_on_top && selected) {
+ icon->set_on_top_of_alpha();
+ }
+
+ icons.push_back(icon);
+ }
+
+ materials[p_name] = icons;
+}
+
+void EditorNode3DGizmoPlugin::create_handle_material(const String &p_name, bool p_billboard) {
+ Ref<StandardMaterial3D> handle_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
+
+ handle_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
+ handle_material->set_flag(StandardMaterial3D::FLAG_USE_POINT_SIZE, true);
+ Ref<Texture2D> handle_t = Node3DEditor::get_singleton()->get_theme_icon("Editor3DHandle", "EditorIcons");
+ handle_material->set_point_size(handle_t->get_width());
+ handle_material->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, handle_t);
+ handle_material->set_albedo(Color(1, 1, 1));
+ handle_material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
+ handle_material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
+ handle_material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
+ handle_material->set_on_top_of_alpha();
+ if (p_billboard) {
+ handle_material->set_billboard_mode(StandardMaterial3D::BILLBOARD_ENABLED);
+ handle_material->set_on_top_of_alpha();
+ }
+
+ materials[p_name] = Vector<Ref<StandardMaterial3D>>();
+ materials[p_name].push_back(handle_material);
+}
+
+void EditorNode3DGizmoPlugin::add_material(const String &p_name, Ref<StandardMaterial3D> p_material) {
+ materials[p_name] = Vector<Ref<StandardMaterial3D>>();
+ materials[p_name].push_back(p_material);
+}
+
+Ref<StandardMaterial3D> EditorNode3DGizmoPlugin::get_material(const String &p_name, const Ref<EditorNode3DGizmo> &p_gizmo) {
+ ERR_FAIL_COND_V(!materials.has(p_name), Ref<StandardMaterial3D>());
+ ERR_FAIL_COND_V(materials[p_name].size() == 0, Ref<StandardMaterial3D>());
+
+ if (p_gizmo.is_null() || materials[p_name].size() == 1) {
+ return materials[p_name][0];
+ }
+
+ int index = (p_gizmo->is_selected() ? 1 : 0) + (p_gizmo->is_editable() ? 2 : 0);
+
+ Ref<StandardMaterial3D> mat = materials[p_name][index];
+
+ if (current_state == ON_TOP && p_gizmo->is_selected()) {
+ mat->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, true);
+ } else {
+ mat->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, false);
+ }
+
+ return mat;
+}
+
+String EditorNode3DGizmoPlugin::get_name() const {
+ if (get_script_instance() && get_script_instance()->has_method("get_name")) {
+ return get_script_instance()->call("get_name");
+ }
+ return TTR("Nameless gizmo");
+}
+
+int EditorNode3DGizmoPlugin::get_priority() const {
+ if (get_script_instance() && get_script_instance()->has_method("get_priority")) {
+ return get_script_instance()->call("get_priority");
+ }
+ return 0;
+}
+
+Ref<EditorNode3DGizmo> EditorNode3DGizmoPlugin::get_gizmo(Node3D *p_spatial) {
+ if (get_script_instance() && get_script_instance()->has_method("get_gizmo")) {
+ return get_script_instance()->call("get_gizmo", p_spatial);
+ }
+
+ Ref<EditorNode3DGizmo> ref = create_gizmo(p_spatial);
+
+ if (ref.is_null()) {
+ return ref;
+ }
+
+ ref->set_plugin(this);
+ ref->set_spatial_node(p_spatial);
+ ref->set_hidden(current_state == HIDDEN);
+
+ current_gizmos.push_back(ref.ptr());
+ return ref;
+}
+
+void EditorNode3DGizmoPlugin::_bind_methods() {
+#define GIZMO_REF PropertyInfo(Variant::OBJECT, "gizmo", PROPERTY_HINT_RESOURCE_TYPE, "EditorNode3DGizmo")
+
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "has_gizmo", PropertyInfo(Variant::OBJECT, "spatial", PROPERTY_HINT_RESOURCE_TYPE, "Node3D")));
+ BIND_VMETHOD(MethodInfo(GIZMO_REF, "create_gizmo", PropertyInfo(Variant::OBJECT, "spatial", PROPERTY_HINT_RESOURCE_TYPE, "Node3D")));
+
+ ClassDB::bind_method(D_METHOD("create_material", "name", "color", "billboard", "on_top", "use_vertex_color"), &EditorNode3DGizmoPlugin::create_material, DEFVAL(false), DEFVAL(false), DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("create_icon_material", "name", "texture", "on_top", "color"), &EditorNode3DGizmoPlugin::create_icon_material, DEFVAL(false), DEFVAL(Color(1, 1, 1, 1)));
+ ClassDB::bind_method(D_METHOD("create_handle_material", "name", "billboard"), &EditorNode3DGizmoPlugin::create_handle_material, DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("add_material", "name", "material"), &EditorNode3DGizmoPlugin::add_material);
+
+ ClassDB::bind_method(D_METHOD("get_material", "name", "gizmo"), &EditorNode3DGizmoPlugin::get_material); //, DEFVAL(Ref<EditorNode3DGizmo>()));
+
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "get_name"));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "get_priority"));
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "can_be_hidden"));
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_selectable_when_hidden"));
+
+ BIND_VMETHOD(MethodInfo("redraw", GIZMO_REF));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "get_handle_name", GIZMO_REF, PropertyInfo(Variant::INT, "index")));
+
+ MethodInfo hvget(Variant::NIL, "get_handle_value", GIZMO_REF, PropertyInfo(Variant::INT, "index"));
+ hvget.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+ BIND_VMETHOD(hvget);
+
+ BIND_VMETHOD(MethodInfo("set_handle", GIZMO_REF, PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera3D"), PropertyInfo(Variant::VECTOR2, "point")));
+ MethodInfo cm = MethodInfo("commit_handle", GIZMO_REF, PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "restore"), PropertyInfo(Variant::BOOL, "cancel"));
+ cm.default_arguments.push_back(false);
+ BIND_VMETHOD(cm);
+
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_handle_highlighted", GIZMO_REF, PropertyInfo(Variant::INT, "index")));
+
+#undef GIZMO_REF
+}
+
+bool EditorNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) {
+ if (get_script_instance() && get_script_instance()->has_method("has_gizmo")) {
+ return get_script_instance()->call("has_gizmo", p_spatial);
+ }
+ return false;
+}
+
+Ref<EditorNode3DGizmo> EditorNode3DGizmoPlugin::create_gizmo(Node3D *p_spatial) {
+ if (get_script_instance() && get_script_instance()->has_method("create_gizmo")) {
+ return get_script_instance()->call("create_gizmo", p_spatial);
+ }
+
+ Ref<EditorNode3DGizmo> ref;
+ if (has_gizmo(p_spatial)) {
+ ref.instance();
+ }
+ return ref;
+}
+
+bool EditorNode3DGizmoPlugin::can_be_hidden() const {
+ if (get_script_instance() && get_script_instance()->has_method("can_be_hidden")) {
+ return get_script_instance()->call("can_be_hidden");
+ }
+ return true;
+}
+
+bool EditorNode3DGizmoPlugin::is_selectable_when_hidden() const {
+ if (get_script_instance() && get_script_instance()->has_method("is_selectable_when_hidden")) {
+ return get_script_instance()->call("is_selectable_when_hidden");
+ }
+ return false;
+}
+
+void EditorNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
+ if (get_script_instance() && get_script_instance()->has_method("redraw")) {
+ Ref<EditorNode3DGizmo> ref(p_gizmo);
+ get_script_instance()->call("redraw", ref);
+ }
+}
+
+String EditorNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_name")) {
+ return get_script_instance()->call("get_handle_name", p_gizmo, p_idx);
+ }
+ return "";
+}
+
+Variant EditorNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_value")) {
+ return get_script_instance()->call("get_handle_value", p_gizmo, p_idx);
+ }
+ return Variant();
+}
+
+void EditorNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ if (get_script_instance() && get_script_instance()->has_method("set_handle")) {
+ get_script_instance()->call("set_handle", p_gizmo, p_idx, p_camera, p_point);
+ }
+}
+
+void EditorNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ if (get_script_instance() && get_script_instance()->has_method("commit_handle")) {
+ get_script_instance()->call("commit_handle", p_gizmo, p_idx, p_restore, p_cancel);
+ }
+}
+
+bool EditorNode3DGizmoPlugin::is_handle_highlighted(const EditorNode3DGizmo *p_gizmo, int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("is_handle_highlighted")) {
+ return get_script_instance()->call("is_handle_highlighted", p_gizmo, p_idx);
+ }
+ return false;
+}
+
+void EditorNode3DGizmoPlugin::set_state(int p_state) {
+ current_state = p_state;
+ for (int i = 0; i < current_gizmos.size(); ++i) {
+ current_gizmos[i]->set_hidden(current_state == HIDDEN);
+ }
+}
+
+int EditorNode3DGizmoPlugin::get_state() const {
+ return current_state;
+}
+
+void EditorNode3DGizmoPlugin::unregister_gizmo(EditorNode3DGizmo *p_gizmo) {
+ current_gizmos.erase(p_gizmo);
+}
+
+EditorNode3DGizmoPlugin::EditorNode3DGizmoPlugin() {
+ current_state = VISIBLE;
+}
+
+EditorNode3DGizmoPlugin::~EditorNode3DGizmoPlugin() {
+ for (int i = 0; i < current_gizmos.size(); ++i) {
+ current_gizmos[i]->set_plugin(nullptr);
+ current_gizmos[i]->get_spatial_node()->set_gizmo(nullptr);
+ }
+ if (Node3DEditor::get_singleton()) {
+ Node3DEditor::get_singleton()->update_all_gizmos();
+ }
+}
diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h
new file mode 100644
index 0000000000..6a8af38742
--- /dev/null
+++ b/editor/plugins/node_3d_editor_plugin.h
@@ -0,0 +1,891 @@
+/*************************************************************************/
+/* node_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SPATIAL_EDITOR_PLUGIN_H
+#define SPATIAL_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "editor/editor_scale.h"
+#include "scene/3d/immediate_geometry_3d.h"
+#include "scene/3d/light_3d.h"
+#include "scene/3d/visual_instance_3d.h"
+#include "scene/gui/panel_container.h"
+
+class Camera3D;
+class Node3DEditor;
+class EditorNode3DGizmoPlugin;
+class Node3DEditorViewport;
+class SubViewportContainer;
+
+class EditorNode3DGizmo : public Node3DGizmo {
+ GDCLASS(EditorNode3DGizmo, Node3DGizmo);
+
+ bool selected;
+ bool instanced;
+
+public:
+ void set_selected(bool p_selected) { selected = p_selected; }
+ bool is_selected() const { return selected; }
+
+ struct Instance {
+ RID instance;
+ Ref<ArrayMesh> mesh;
+ Ref<Material> material;
+ Ref<SkinReference> skin_reference;
+ RID skeleton;
+ bool billboard;
+ bool unscaled;
+ bool can_intersect;
+ bool extra_margin;
+ Instance() {
+ billboard = false;
+ unscaled = false;
+ can_intersect = false;
+ extra_margin = false;
+ }
+
+ void create_instance(Node3D *p_base, bool p_hidden = false);
+ };
+
+ Vector<Vector3> collision_segments;
+ Ref<TriangleMesh> collision_mesh;
+
+ struct Handle {
+ Vector3 pos;
+ bool billboard;
+ };
+
+ Vector<Vector3> handles;
+ Vector<Vector3> secondary_handles;
+ float selectable_icon_size;
+ bool billboard_handle;
+
+ bool valid;
+ bool hidden;
+ Node3D *base;
+ Vector<Instance> instances;
+ Node3D *spatial_node;
+ EditorNode3DGizmoPlugin *gizmo_plugin;
+
+ void _set_spatial_node(Node *p_node) { set_spatial_node(Object::cast_to<Node3D>(p_node)); }
+
+protected:
+ static void _bind_methods();
+
+public:
+ void add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1));
+ void add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard = false, const Ref<SkinReference> &p_skin_reference = Ref<SkinReference>(), const Ref<Material> &p_material = Ref<Material>());
+ void add_collision_segments(const Vector<Vector3> &p_lines);
+ void add_collision_triangles(const Ref<TriangleMesh> &p_tmesh);
+ void add_unscaled_billboard(const Ref<Material> &p_material, float p_scale = 1, const Color &p_modulate = Color(1, 1, 1));
+ void add_handles(const Vector<Vector3> &p_handles, const Ref<Material> &p_material, bool p_billboard = false, bool p_secondary = false);
+ void add_solid_box(Ref<Material> &p_material, Vector3 p_size, Vector3 p_position = Vector3());
+
+ virtual bool is_handle_highlighted(int p_idx) const;
+ virtual String get_handle_name(int p_idx) const;
+ virtual Variant get_handle_value(int p_idx);
+ virtual void set_handle(int p_idx, Camera3D *p_camera, const Point2 &p_point);
+ virtual void commit_handle(int p_idx, const Variant &p_restore, bool p_cancel = false);
+
+ void set_spatial_node(Node3D *p_node);
+ Node3D *get_spatial_node() const { return spatial_node; }
+ Ref<EditorNode3DGizmoPlugin> get_plugin() const { return gizmo_plugin; }
+ Vector3 get_handle_pos(int p_idx) const;
+ bool intersect_frustum(const Camera3D *p_camera, const Vector<Plane> &p_frustum);
+ bool intersect_ray(Camera3D *p_camera, const Point2 &p_point, Vector3 &r_pos, Vector3 &r_normal, int *r_gizmo_handle = nullptr, bool p_sec_first = false);
+
+ virtual void clear() override;
+ virtual void create() override;
+ virtual void transform() override;
+ virtual void redraw() override;
+ virtual void free() override;
+
+ virtual bool is_editable() const;
+
+ void set_hidden(bool p_hidden);
+ void set_plugin(EditorNode3DGizmoPlugin *p_plugin);
+
+ EditorNode3DGizmo();
+ ~EditorNode3DGizmo();
+};
+
+class ViewportRotationControl : public Control {
+ GDCLASS(ViewportRotationControl, Control);
+
+ struct Axis2D {
+ Vector2i screen_point;
+ float z_axis = -99.0;
+ int axis = -1;
+ };
+
+ struct Axis2DCompare {
+ _FORCE_INLINE_ bool operator()(const Axis2D &l, const Axis2D &r) const {
+ return l.z_axis < r.z_axis;
+ }
+ };
+
+ Node3DEditorViewport *viewport = nullptr;
+ Vector<Color> axis_colors;
+ Vector<int> axis_menu_options;
+ Vector2i orbiting_mouse_start;
+ bool orbiting = false;
+ int focused_axis = -2;
+
+ const float AXIS_CIRCLE_RADIUS = 8.0f * EDSCALE;
+
+protected:
+ static void _bind_methods();
+ void _notification(int p_what);
+ void _gui_input(Ref<InputEvent> p_event);
+ void _draw();
+ void _draw_axis(const Axis2D &p_axis);
+ void _get_sorted_axis(Vector<Axis2D> &r_axis);
+ void _update_focus();
+ void _on_mouse_exited();
+
+public:
+ void set_viewport(Node3DEditorViewport *p_viewport);
+};
+
+class Node3DEditorViewport : public Control {
+ GDCLASS(Node3DEditorViewport, Control);
+ friend class Node3DEditor;
+ friend class ViewportRotationControl;
+ enum {
+
+ VIEW_TOP,
+ VIEW_BOTTOM,
+ VIEW_LEFT,
+ VIEW_RIGHT,
+ VIEW_FRONT,
+ VIEW_REAR,
+ VIEW_CENTER_TO_ORIGIN,
+ VIEW_CENTER_TO_SELECTION,
+ VIEW_ALIGN_TRANSFORM_WITH_VIEW,
+ VIEW_ALIGN_ROTATION_WITH_VIEW,
+ VIEW_PERSPECTIVE,
+ VIEW_ENVIRONMENT,
+ VIEW_ORTHOGONAL,
+ VIEW_HALF_RESOLUTION,
+ VIEW_AUDIO_LISTENER,
+ VIEW_AUDIO_DOPPLER,
+ VIEW_GIZMOS,
+ VIEW_INFORMATION,
+ VIEW_FRAME_TIME,
+ VIEW_DISPLAY_NORMAL,
+ VIEW_DISPLAY_WIREFRAME,
+ VIEW_DISPLAY_OVERDRAW,
+ VIEW_DISPLAY_SHADELESS,
+ VIEW_DISPLAY_LIGHTING,
+ VIEW_DISPLAY_ADVANCED,
+ VIEW_DISPLAY_NORMAL_BUFFER,
+ VIEW_DISPLAY_DEBUG_SHADOW_ATLAS,
+ VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS,
+ VIEW_DISPLAY_DEBUG_GIPROBE_ALBEDO,
+ VIEW_DISPLAY_DEBUG_GIPROBE_LIGHTING,
+ VIEW_DISPLAY_DEBUG_GIPROBE_EMISSION,
+ VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE,
+ VIEW_DISPLAY_DEBUG_SSAO,
+ VIEW_DISPLAY_DEBUG_PSSM_SPLITS,
+ VIEW_DISPLAY_DEBUG_DECAL_ATLAS,
+ VIEW_DISPLAY_DEBUG_SDFGI,
+ VIEW_DISPLAY_DEBUG_SDFGI_PROBES,
+ VIEW_DISPLAY_DEBUG_GI_BUFFER,
+ VIEW_LOCK_ROTATION,
+ VIEW_CINEMATIC_PREVIEW,
+ VIEW_AUTO_ORTHOGONAL,
+ VIEW_MAX
+ };
+
+public:
+ enum {
+ GIZMO_BASE_LAYER = 27,
+ GIZMO_EDIT_LAYER = 26,
+ GIZMO_GRID_LAYER = 25,
+
+ FRAME_TIME_HISTORY = 20,
+ };
+
+ enum NavigationScheme {
+ NAVIGATION_GODOT,
+ NAVIGATION_MAYA,
+ NAVIGATION_MODO,
+ };
+
+ enum FreelookNavigationScheme {
+ FREELOOK_DEFAULT,
+ FREELOOK_PARTIALLY_AXIS_LOCKED,
+ FREELOOK_FULLY_AXIS_LOCKED,
+ };
+
+private:
+ float cpu_time_history[FRAME_TIME_HISTORY];
+ int cpu_time_history_index;
+ float gpu_time_history[FRAME_TIME_HISTORY];
+ int gpu_time_history_index;
+
+ int index;
+ String name;
+ void _menu_option(int p_option);
+ void _set_auto_orthogonal();
+ Node3D *preview_node;
+ AABB *preview_bounds;
+ Vector<String> selected_files;
+ AcceptDialog *accept;
+
+ Node *target_node;
+ Point2 drop_pos;
+
+ EditorNode *editor;
+ EditorData *editor_data;
+ EditorSelection *editor_selection;
+ UndoRedo *undo_redo;
+
+ CheckBox *preview_camera;
+ SubViewportContainer *subviewport_container;
+
+ MenuButton *view_menu;
+ PopupMenu *display_submenu;
+
+ Control *surface;
+ SubViewport *viewport;
+ Camera3D *camera;
+ bool transforming;
+ bool orthogonal;
+ bool auto_orthogonal;
+ bool lock_rotation;
+ float gizmo_scale;
+
+ bool freelook_active;
+ real_t freelook_speed;
+ Vector2 previous_mouse_position;
+
+ Label *info_label;
+ Label *cinema_label;
+ Label *locked_label;
+
+ VBoxContainer *top_right_vbox;
+ ViewportRotationControl *rotation_control;
+ Label *fps_label;
+
+ struct _RayResult {
+ Node3D *item;
+ float depth;
+ int handle;
+ _FORCE_INLINE_ bool operator<(const _RayResult &p_rr) const { return depth < p_rr.depth; }
+ };
+
+ void _update_name();
+ void _compute_edit(const Point2 &p_point);
+ void _clear_selected();
+ void _select_clicked(bool p_append, bool p_single, bool p_allow_locked = false);
+ void _select(Node *p_node, bool p_append, bool p_single);
+ ObjectID _select_ray(const Point2 &p_pos, bool p_append, bool &r_includes_current, int *r_gizmo_handle = nullptr, bool p_alt_select = false);
+ void _find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select = false);
+ Vector3 _get_ray_pos(const Vector2 &p_pos) const;
+ Vector3 _get_ray(const Vector2 &p_pos) const;
+ Point2 _point_to_screen(const Vector3 &p_point);
+ Transform _get_camera_transform() const;
+ int get_selected_count() const;
+
+ Vector3 _get_camera_position() const;
+ Vector3 _get_camera_normal() const;
+ Vector3 _get_screen_to_space(const Vector3 &p_vector3);
+
+ void _select_region();
+ bool _gizmo_select(const Vector2 &p_screenpos, bool p_highlight_only = false);
+
+ void _nav_pan(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
+ void _nav_zoom(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
+ void _nav_orbit(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
+ void _nav_look(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
+
+ float get_znear() const;
+ float get_zfar() const;
+ float get_fov() const;
+
+ ObjectID clicked;
+ Vector<_RayResult> selection_results;
+ bool clicked_includes_current;
+ bool clicked_wants_append;
+
+ PopupMenu *selection_menu;
+
+ enum NavigationZoomStyle {
+ NAVIGATION_ZOOM_VERTICAL,
+ NAVIGATION_ZOOM_HORIZONTAL
+ };
+
+ enum NavigationMode {
+ NAVIGATION_NONE,
+ NAVIGATION_PAN,
+ NAVIGATION_ZOOM,
+ NAVIGATION_ORBIT,
+ NAVIGATION_LOOK
+ };
+ enum TransformMode {
+ TRANSFORM_NONE,
+ TRANSFORM_ROTATE,
+ TRANSFORM_TRANSLATE,
+ TRANSFORM_SCALE
+
+ };
+ enum TransformPlane {
+ TRANSFORM_VIEW,
+ TRANSFORM_X_AXIS,
+ TRANSFORM_Y_AXIS,
+ TRANSFORM_Z_AXIS,
+ TRANSFORM_YZ,
+ TRANSFORM_XZ,
+ TRANSFORM_XY,
+ };
+
+ struct EditData {
+ TransformMode mode;
+ TransformPlane plane;
+ Transform original;
+ Vector3 click_ray;
+ Vector3 click_ray_pos;
+ Vector3 center;
+ Vector3 orig_gizmo_pos;
+ int edited_gizmo;
+ Point2 mouse_pos;
+ bool snap;
+ Ref<EditorNode3DGizmo> gizmo;
+ int gizmo_handle;
+ Variant gizmo_initial_value;
+ Vector3 gizmo_initial_pos;
+ } _edit;
+
+ struct Cursor {
+ Vector3 pos;
+ float x_rot, y_rot, distance;
+ Vector3 eye_pos; // Used in freelook mode
+ bool region_select;
+ Point2 region_begin, region_end;
+
+ Cursor() {
+ // These rotations place the camera in +X +Y +Z, aka south east, facing north west.
+ x_rot = 0.5;
+ y_rot = -0.5;
+ distance = 4;
+ region_select = false;
+ }
+ };
+ // Viewport camera supports movement smoothing,
+ // so one cursor is the real cursor, while the other can be an interpolated version.
+ Cursor cursor; // Immediate cursor
+ Cursor camera_cursor; // That one may be interpolated (don't modify this one except for smoothing purposes)
+
+ void scale_cursor_distance(real_t scale);
+
+ void set_freelook_active(bool active_now);
+ void scale_freelook_speed(real_t scale);
+
+ real_t zoom_indicator_delay;
+
+ RID move_gizmo_instance[3], move_plane_gizmo_instance[3], rotate_gizmo_instance[3], scale_gizmo_instance[3], scale_plane_gizmo_instance[3];
+
+ String last_message;
+ String message;
+ float message_time;
+
+ void set_message(String p_message, float p_time = 5);
+
+ //
+ void _update_camera(float p_interp_delta);
+ Transform to_camera_transform(const Cursor &p_cursor) const;
+ void _draw();
+
+ void _surface_mouse_enter();
+ void _surface_mouse_exit();
+ void _surface_focus_enter();
+ void _surface_focus_exit();
+
+ void _sinput(const Ref<InputEvent> &p_event);
+ void _update_freelook(real_t delta);
+ Node3DEditor *spatial_editor;
+
+ Camera3D *previewing;
+ Camera3D *preview;
+
+ bool previewing_cinema;
+ bool _is_node_locked(const Node *p_node);
+ void _preview_exited_scene();
+ void _toggle_camera_preview(bool);
+ void _toggle_cinema_preview(bool);
+ void _init_gizmo_instance(int p_idx);
+ void _finish_gizmo_instances();
+ void _selection_result_pressed(int);
+ void _selection_menu_hide();
+ void _list_select(Ref<InputEventMouseButton> b);
+ Point2i _get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_ev_mouse_motion) const;
+
+ Vector3 _get_instance_position(const Point2 &p_pos) const;
+ static AABB _calculate_spatial_bounds(const Node3D *p_parent, bool p_exclude_toplevel_transform = true);
+ void _create_preview(const Vector<String> &files) const;
+ void _remove_preview();
+ bool _cyclical_dependency_exists(const String &p_target_scene_path, Node *p_desired_node);
+ bool _create_instance(Node *parent, String &path, const Point2 &p_point);
+ void _perform_drop_data();
+
+ bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
+ void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void update_surface() { surface->update(); }
+ void update_transform_gizmo_view();
+
+ void set_can_preview(Camera3D *p_preview);
+ void set_state(const Dictionary &p_state);
+ Dictionary get_state() const;
+ void reset();
+ bool is_freelook_active() const { return freelook_active; }
+
+ void focus_selection();
+
+ void assign_pending_data_pointers(
+ Node3D *p_preview_node,
+ AABB *p_preview_bounds,
+ AcceptDialog *p_accept);
+
+ SubViewport *get_viewport_node() { return viewport; }
+ Camera3D *get_camera() { return camera; } // return the default camera object.
+
+ Node3DEditorViewport(Node3DEditor *p_spatial_editor, EditorNode *p_editor, int p_index);
+};
+
+class Node3DEditorSelectedItem : public Object {
+ GDCLASS(Node3DEditorSelectedItem, Object);
+
+public:
+ AABB aabb;
+ Transform original; // original location when moving
+ Transform original_local;
+ Transform last_xform; // last transform
+ bool last_xform_dirty;
+ Node3D *sp;
+ RID sbox_instance;
+
+ Node3DEditorSelectedItem() {
+ sp = nullptr;
+ last_xform_dirty = true;
+ }
+ ~Node3DEditorSelectedItem();
+};
+
+class Node3DEditorViewportContainer : public Container {
+ GDCLASS(Node3DEditorViewportContainer, Container);
+
+public:
+ enum View {
+ VIEW_USE_1_VIEWPORT,
+ VIEW_USE_2_VIEWPORTS,
+ VIEW_USE_2_VIEWPORTS_ALT,
+ VIEW_USE_3_VIEWPORTS,
+ VIEW_USE_3_VIEWPORTS_ALT,
+ VIEW_USE_4_VIEWPORTS,
+ };
+
+private:
+ View view;
+ bool mouseover;
+ float ratio_h;
+ float ratio_v;
+
+ bool hovering_v;
+ bool hovering_h;
+
+ bool dragging_v;
+ bool dragging_h;
+ Vector2 drag_begin_pos;
+ Vector2 drag_begin_ratio;
+
+ void _gui_input(const Ref<InputEvent> &p_event);
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void set_view(View p_view);
+ View get_view();
+
+ Node3DEditorViewportContainer();
+};
+
+class Node3DEditor : public VBoxContainer {
+ GDCLASS(Node3DEditor, VBoxContainer);
+
+public:
+ static const unsigned int VIEWPORTS_COUNT = 4;
+
+ enum ToolMode {
+
+ TOOL_MODE_SELECT,
+ TOOL_MODE_MOVE,
+ TOOL_MODE_ROTATE,
+ TOOL_MODE_SCALE,
+ TOOL_MODE_LIST_SELECT,
+ TOOL_LOCK_SELECTED,
+ TOOL_UNLOCK_SELECTED,
+ TOOL_GROUP_SELECTED,
+ TOOL_UNGROUP_SELECTED,
+ TOOL_MAX
+ };
+
+ enum ToolOptions {
+
+ TOOL_OPT_LOCAL_COORDS,
+ TOOL_OPT_USE_SNAP,
+ TOOL_OPT_OVERRIDE_CAMERA,
+ TOOL_OPT_MAX
+
+ };
+
+private:
+ EditorNode *editor;
+ EditorSelection *editor_selection;
+
+ Node3DEditorViewportContainer *viewport_base;
+ Node3DEditorViewport *viewports[VIEWPORTS_COUNT];
+ VSplitContainer *shader_split;
+ HSplitContainer *palette_split;
+
+ /////
+
+ ToolMode tool_mode;
+ bool orthogonal;
+
+ RenderingServer::ScenarioDebugMode scenario_debug;
+
+ RID origin;
+ RID origin_instance;
+ bool origin_enabled;
+ RID grid[3];
+ RID grid_instance[3];
+ bool grid_visible[3]; //currently visible
+ bool grid_enable[3]; //should be always visible if true
+ bool grid_enabled;
+
+ Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[3], scale_gizmo[3], scale_plane_gizmo[3];
+ Ref<StandardMaterial3D> gizmo_color[3];
+ Ref<StandardMaterial3D> plane_gizmo_color[3];
+ Ref<StandardMaterial3D> gizmo_color_hl[3];
+ Ref<StandardMaterial3D> plane_gizmo_color_hl[3];
+
+ int over_gizmo_handle;
+ float snap_translate_value;
+ float snap_rotate_value;
+ float snap_scale_value;
+
+ Ref<ArrayMesh> selection_box;
+ RID indicators;
+ RID indicators_instance;
+ RID cursor_mesh;
+ RID cursor_instance;
+ Ref<StandardMaterial3D> indicator_mat;
+ Ref<StandardMaterial3D> cursor_material;
+
+ // Scene drag and drop support
+ Node3D *preview_node;
+ AABB preview_bounds;
+
+ struct Gizmo {
+ bool visible;
+ float scale;
+ Transform transform;
+ } gizmo;
+
+ enum MenuOption {
+
+ MENU_TOOL_SELECT,
+ MENU_TOOL_MOVE,
+ MENU_TOOL_ROTATE,
+ MENU_TOOL_SCALE,
+ MENU_TOOL_LIST_SELECT,
+ MENU_TOOL_LOCAL_COORDS,
+ MENU_TOOL_USE_SNAP,
+ MENU_TOOL_OVERRIDE_CAMERA,
+ MENU_TRANSFORM_CONFIGURE_SNAP,
+ MENU_TRANSFORM_DIALOG,
+ MENU_VIEW_USE_1_VIEWPORT,
+ MENU_VIEW_USE_2_VIEWPORTS,
+ MENU_VIEW_USE_2_VIEWPORTS_ALT,
+ MENU_VIEW_USE_3_VIEWPORTS,
+ MENU_VIEW_USE_3_VIEWPORTS_ALT,
+ MENU_VIEW_USE_4_VIEWPORTS,
+ MENU_VIEW_ORIGIN,
+ MENU_VIEW_GRID,
+ MENU_VIEW_GIZMOS_3D_ICONS,
+ MENU_VIEW_CAMERA_SETTINGS,
+ MENU_LOCK_SELECTED,
+ MENU_UNLOCK_SELECTED,
+ MENU_GROUP_SELECTED,
+ MENU_UNGROUP_SELECTED,
+ MENU_SNAP_TO_FLOOR
+ };
+
+ Button *tool_button[TOOL_MAX];
+ Button *tool_option_button[TOOL_OPT_MAX];
+
+ MenuButton *transform_menu;
+ PopupMenu *gizmos_menu;
+ MenuButton *view_menu;
+
+ AcceptDialog *accept;
+
+ ConfirmationDialog *snap_dialog;
+ ConfirmationDialog *xform_dialog;
+ ConfirmationDialog *settings_dialog;
+
+ bool snap_enabled;
+ bool snap_key_enabled;
+ LineEdit *snap_translate;
+ LineEdit *snap_rotate;
+ LineEdit *snap_scale;
+ PanelContainer *menu_panel;
+
+ LineEdit *xform_translate[3];
+ LineEdit *xform_rotate[3];
+ LineEdit *xform_scale[3];
+ OptionButton *xform_type;
+
+ VBoxContainer *settings_vbc;
+ SpinBox *settings_fov;
+ SpinBox *settings_znear;
+ SpinBox *settings_zfar;
+
+ void _snap_changed();
+ void _snap_update();
+ void _xform_dialog_action();
+ void _menu_item_pressed(int p_option);
+ void _menu_item_toggled(bool pressed, int p_option);
+ void _menu_gizmo_toggled(int p_option);
+ void _update_camera_override_button(bool p_game_running);
+ void _update_camera_override_viewport(Object *p_viewport);
+
+ HBoxContainer *hbc_menu;
+
+ void _generate_selection_box();
+ UndoRedo *undo_redo;
+
+ int camera_override_viewport_id;
+
+ void _init_indicators();
+ void _update_gizmos_menu();
+ void _update_gizmos_menu_theme();
+ void _init_grid();
+ void _finish_indicators();
+ void _finish_grid();
+
+ void _toggle_maximize_view(Object *p_viewport);
+
+ Node *custom_camera;
+
+ Object *_get_editor_data(Object *p_what);
+
+ Ref<Environment> viewport_environment;
+
+ Node3D *selected;
+
+ void _request_gizmo(Object *p_obj);
+
+ static Node3DEditor *singleton;
+
+ void _node_removed(Node *p_node);
+ Vector<Ref<EditorNode3DGizmoPlugin>> gizmo_plugins_by_priority;
+ Vector<Ref<EditorNode3DGizmoPlugin>> gizmo_plugins_by_name;
+
+ void _register_all_gizmos();
+
+ Node3DEditor();
+
+ bool is_any_freelook_active() const;
+
+ void _refresh_menu_icons();
+
+protected:
+ void _notification(int p_what);
+ //void _gui_input(InputEvent p_event);
+ void _unhandled_key_input(Ref<InputEvent> p_event);
+
+ static void _bind_methods();
+
+public:
+ static Node3DEditor *get_singleton() { return singleton; }
+ void snap_cursor_to_plane(const Plane &p_plane);
+
+ Vector3 snap_point(Vector3 p_target, Vector3 p_start = Vector3(0, 0, 0)) const;
+
+ float get_znear() const { return settings_znear->get_value(); }
+ float get_zfar() const { return settings_zfar->get_value(); }
+ float get_fov() const { return settings_fov->get_value(); }
+
+ Transform get_gizmo_transform() const { return gizmo.transform; }
+ bool is_gizmo_visible() const { return gizmo.visible; }
+
+ ToolMode get_tool_mode() const { return tool_mode; }
+ bool are_local_coords_enabled() const { return tool_option_button[Node3DEditor::TOOL_OPT_LOCAL_COORDS]->is_pressed(); }
+ bool is_snap_enabled() const { return snap_enabled ^ snap_key_enabled; }
+ float get_translate_snap() const;
+ float get_rotate_snap() const;
+ float get_scale_snap() const;
+
+ Ref<ArrayMesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; }
+ Ref<ArrayMesh> get_move_plane_gizmo(int idx) const { return move_plane_gizmo[idx]; }
+ Ref<ArrayMesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; }
+ Ref<ArrayMesh> get_scale_gizmo(int idx) const { return scale_gizmo[idx]; }
+ Ref<ArrayMesh> get_scale_plane_gizmo(int idx) const { return scale_plane_gizmo[idx]; }
+
+ void update_grid();
+ void update_transform_gizmo();
+ void update_all_gizmos(Node *p_node = nullptr);
+ void snap_selected_nodes_to_floor();
+ void select_gizmo_highlight_axis(int p_axis);
+ void set_custom_camera(Node *p_camera) { custom_camera = p_camera; }
+
+ void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }
+ Dictionary get_state() const;
+ void set_state(const Dictionary &p_state);
+
+ Ref<Environment> get_viewport_environment() { return viewport_environment; }
+
+ UndoRedo *get_undo_redo() { return undo_redo; }
+
+ void add_control_to_menu_panel(Control *p_control);
+ void remove_control_from_menu_panel(Control *p_control);
+
+ VSplitContainer *get_shader_split();
+ HSplitContainer *get_palette_split();
+
+ Node3D *get_selected() { return selected; }
+
+ int get_over_gizmo_handle() const { return over_gizmo_handle; }
+ void set_over_gizmo_handle(int idx) { over_gizmo_handle = idx; }
+
+ void set_can_preview(Camera3D *p_preview);
+
+ Node3DEditorViewport *get_editor_viewport(int p_idx) {
+ ERR_FAIL_INDEX_V(p_idx, static_cast<int>(VIEWPORTS_COUNT), nullptr);
+ return viewports[p_idx];
+ }
+
+ void add_gizmo_plugin(Ref<EditorNode3DGizmoPlugin> p_plugin);
+ void remove_gizmo_plugin(Ref<EditorNode3DGizmoPlugin> p_plugin);
+
+ void edit(Node3D *p_spatial);
+ void clear();
+
+ Node3DEditor(EditorNode *p_editor);
+ ~Node3DEditor();
+};
+
+class Node3DEditorPlugin : public EditorPlugin {
+ GDCLASS(Node3DEditorPlugin, EditorPlugin);
+
+ Node3DEditor *spatial_editor;
+ EditorNode *editor;
+
+protected:
+ static void _bind_methods();
+
+public:
+ void snap_cursor_to_plane(const Plane &p_plane);
+
+ Node3DEditor *get_spatial_editor() { return spatial_editor; }
+ virtual String get_name() const override { return "3D"; }
+ bool has_main_screen() const override { return true; }
+ virtual void make_visible(bool p_visible) override;
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+
+ virtual Dictionary get_state() const override;
+ virtual void set_state(const Dictionary &p_state) override;
+ virtual void clear() override { spatial_editor->clear(); }
+
+ virtual void edited_scene_changed() override;
+
+ Node3DEditorPlugin(EditorNode *p_node);
+ ~Node3DEditorPlugin();
+};
+
+class EditorNode3DGizmoPlugin : public Resource {
+ GDCLASS(EditorNode3DGizmoPlugin, Resource);
+
+public:
+ static const int VISIBLE = 0;
+ static const int HIDDEN = 1;
+ static const int ON_TOP = 2;
+
+protected:
+ int current_state;
+ List<EditorNode3DGizmo *> current_gizmos;
+ HashMap<String, Vector<Ref<StandardMaterial3D>>> materials;
+
+ static void _bind_methods();
+ virtual bool has_gizmo(Node3D *p_spatial);
+ virtual Ref<EditorNode3DGizmo> create_gizmo(Node3D *p_spatial);
+
+public:
+ void create_material(const String &p_name, const Color &p_color, bool p_billboard = false, bool p_on_top = false, bool p_use_vertex_color = false);
+ void create_icon_material(const String &p_name, const Ref<Texture2D> &p_texture, bool p_on_top = false, const Color &p_albedo = Color(1, 1, 1, 1));
+ void create_handle_material(const String &p_name, bool p_billboard = false);
+ void add_material(const String &p_name, Ref<StandardMaterial3D> p_material);
+
+ Ref<StandardMaterial3D> get_material(const String &p_name, const Ref<EditorNode3DGizmo> &p_gizmo = Ref<EditorNode3DGizmo>());
+
+ virtual String get_name() const;
+ virtual int get_priority() const;
+ virtual bool can_be_hidden() const;
+ virtual bool is_selectable_when_hidden() const;
+
+ virtual void redraw(EditorNode3DGizmo *p_gizmo);
+ virtual String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const;
+ virtual Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const;
+ virtual void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point);
+ virtual void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
+ virtual bool is_handle_highlighted(const EditorNode3DGizmo *p_gizmo, int p_idx) const;
+
+ Ref<EditorNode3DGizmo> get_gizmo(Node3D *p_spatial);
+ void set_state(int p_state);
+ int get_state() const;
+ void unregister_gizmo(EditorNode3DGizmo *p_gizmo);
+
+ EditorNode3DGizmoPlugin();
+ virtual ~EditorNode3DGizmoPlugin();
+};
+
+#endif
diff --git a/editor/plugins/packed_scene_translation_parser_plugin.cpp b/editor/plugins/packed_scene_translation_parser_plugin.cpp
new file mode 100644
index 0000000000..608b5c3104
--- /dev/null
+++ b/editor/plugins/packed_scene_translation_parser_plugin.cpp
@@ -0,0 +1,116 @@
+/*************************************************************************/
+/* packed_scene_translation_parser_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "packed_scene_translation_parser_plugin.h"
+
+#include "core/io/resource_loader.h"
+#include "scene/resources/packed_scene.h"
+
+void PackedSceneEditorTranslationParserPlugin::get_recognized_extensions(List<String> *r_extensions) const {
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene", r_extensions);
+}
+
+Error PackedSceneEditorTranslationParserPlugin::parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) {
+ // Parse specific scene Node's properties (see in constructor) that are auto-translated by the engine when set. E.g Label's text property.
+ // These properties are translated with the tr() function in the C++ code when being set or updated.
+
+ Error err;
+ RES loaded_res = ResourceLoader::load(p_path, "PackedScene", false, &err);
+ if (err) {
+ ERR_PRINT("Failed to load " + p_path);
+ return err;
+ }
+ Ref<SceneState> state = Ref<PackedScene>(loaded_res)->get_state();
+
+ Vector<String> parsed_strings;
+ String property_name;
+ Variant property_value;
+ for (int i = 0; i < state->get_node_count(); i++) {
+ if (!ClassDB::is_parent_class(state->get_node_type(i), "Control") && !ClassDB::is_parent_class(state->get_node_type(i), "Viewport")) {
+ continue;
+ }
+
+ for (int j = 0; j < state->get_node_property_count(i); j++) {
+ property_name = state->get_node_property_name(i, j);
+ if (!lookup_properties.has(property_name)) {
+ continue;
+ }
+
+ property_value = state->get_node_property_value(i, j);
+
+ if (property_name == "script" && property_value.get_type() == Variant::OBJECT && !property_value.is_null()) {
+ // Parse built-in script.
+ Ref<Script> s = Object::cast_to<Script>(property_value);
+ String extension = s->get_language()->get_extension();
+ if (EditorTranslationParser::get_singleton()->can_parse(extension)) {
+ Vector<String> temp;
+ Vector<Vector<String>> ids_context_plural;
+ EditorTranslationParser::get_singleton()->get_parser(extension)->parse_file(s->get_path(), &temp, &ids_context_plural);
+ parsed_strings.append_array(temp);
+ r_ids_ctx_plural->append_array(ids_context_plural);
+ }
+ } else if (property_name == "filters") {
+ // Extract FileDialog's filters property with values in format "*.png ; PNG Images","*.gd ; GDScript Files".
+ Vector<String> str_values = property_value;
+ for (int k = 0; k < str_values.size(); k++) {
+ String desc = str_values[k].get_slice(";", 1).strip_edges();
+ if (!desc.empty()) {
+ parsed_strings.push_back(desc);
+ }
+ }
+ } else if (property_value.get_type() == Variant::STRING) {
+ String str_value = String(property_value);
+ // Prevent reading text containing only spaces.
+ if (!str_value.strip_edges().empty()) {
+ parsed_strings.push_back(str_value);
+ }
+ }
+ }
+ }
+
+ r_ids->append_array(parsed_strings);
+
+ return OK;
+}
+
+PackedSceneEditorTranslationParserPlugin::PackedSceneEditorTranslationParserPlugin() {
+ // Scene Node's properties containing strings that will be fetched for translation.
+ lookup_properties.insert("text");
+ lookup_properties.insert("hint_tooltip");
+ lookup_properties.insert("placeholder_text");
+ lookup_properties.insert("dialog_text");
+ lookup_properties.insert("filters");
+ lookup_properties.insert("script");
+
+ //Add exception list (to prevent false positives)
+ //line edit, text edit, richtextlabel
+ //Set<String> exception_list;
+ //exception_list.insert("RichTextLabel");
+}
diff --git a/editor/plugins/packed_scene_translation_parser_plugin.h b/editor/plugins/packed_scene_translation_parser_plugin.h
new file mode 100644
index 0000000000..a0ffdf692c
--- /dev/null
+++ b/editor/plugins/packed_scene_translation_parser_plugin.h
@@ -0,0 +1,49 @@
+/*************************************************************************/
+/* packed_scene_translation_parser_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef PACKED_SCENE_TRANSLATION_PARSER_PLUGIN_H
+#define PACKED_SCENE_TRANSLATION_PARSER_PLUGIN_H
+
+#include "editor/editor_translation_parser.h"
+
+class PackedSceneEditorTranslationParserPlugin : public EditorTranslationParserPlugin {
+ GDCLASS(PackedSceneEditorTranslationParserPlugin, EditorTranslationParserPlugin);
+
+ // Scene Node's properties that contain translation strings.
+ Set<String> lookup_properties;
+
+public:
+ virtual Error parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) override;
+ virtual void get_recognized_extensions(List<String> *r_extensions) const override;
+
+ PackedSceneEditorTranslationParserPlugin();
+};
+
+#endif // PACKED_SCENE_TRANSLATION_PARSER_PLUGIN_H
diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp
deleted file mode 100644
index b036368bc8..0000000000
--- a/editor/plugins/particles_2d_editor_plugin.cpp
+++ /dev/null
@@ -1,440 +0,0 @@
-/*************************************************************************/
-/* particles_2d_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "particles_2d_editor_plugin.h"
-
-#include "canvas_item_editor_plugin.h"
-#include "core/io/image_loader.h"
-#include "scene/2d/cpu_particles_2d.h"
-#include "scene/gui/separator.h"
-#include "scene/resources/particles_material.h"
-
-void Particles2DEditorPlugin::edit(Object *p_object) {
-
- particles = Object::cast_to<Particles2D>(p_object);
-}
-
-bool Particles2DEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("Particles2D");
-}
-
-void Particles2DEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
-
- toolbar->show();
- } else {
-
- toolbar->hide();
- }
-}
-
-void Particles2DEditorPlugin::_file_selected(const String &p_file) {
-
- source_emission_file = p_file;
- emission_mask->popup_centered_minsize();
-}
-
-void Particles2DEditorPlugin::_menu_callback(int p_idx) {
-
- switch (p_idx) {
- case MENU_GENERATE_VISIBILITY_RECT: {
- float gen_time = particles->get_lifetime();
- if (gen_time < 1.0)
- generate_seconds->set_value(1.0);
- else
- generate_seconds->set_value(trunc(gen_time) + 1.0);
- generate_visibility_rect->popup_centered_minsize();
- } break;
- case MENU_LOAD_EMISSION_MASK: {
-
- file->popup_centered_ratio();
-
- } break;
- case MENU_CLEAR_EMISSION_MASK: {
-
- emission_mask->popup_centered_minsize();
- } break;
- case MENU_OPTION_CONVERT_TO_CPU_PARTICLES: {
-
- CPUParticles2D *cpu_particles = memnew(CPUParticles2D);
- cpu_particles->convert_from_particles(particles);
- cpu_particles->set_name(particles->get_name());
- cpu_particles->set_transform(particles->get_transform());
- cpu_particles->set_visible(particles->is_visible());
- cpu_particles->set_pause_mode(particles->get_pause_mode());
- cpu_particles->set_z_index(particles->get_z_index());
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Convert to CPUParticles"));
- ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", particles, cpu_particles, true, false);
- ur->add_do_reference(cpu_particles);
- ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", cpu_particles, particles, false, false);
- ur->add_undo_reference(particles);
- ur->commit_action();
-
- } break;
- case MENU_RESTART: {
-
- particles->restart();
- }
- }
-}
-
-void Particles2DEditorPlugin::_generate_visibility_rect() {
-
- float time = generate_seconds->get_value();
-
- float running = 0.0;
-
- EditorProgress ep("gen_vrect", TTR("Generating Visibility Rect"), int(time));
-
- bool was_emitting = particles->is_emitting();
- if (!was_emitting) {
- particles->set_emitting(true);
- OS::get_singleton()->delay_usec(1000);
- }
-
- Rect2 rect;
- while (running < time) {
-
- uint64_t ticks = OS::get_singleton()->get_ticks_usec();
- ep.step("Generating...", int(running), true);
- OS::get_singleton()->delay_usec(1000);
-
- Rect2 capture = particles->capture_rect();
- if (rect == Rect2())
- rect = capture;
- else
- rect = rect.merge(capture);
-
- running += (OS::get_singleton()->get_ticks_usec() - ticks) / 1000000.0;
- }
-
- if (!was_emitting) {
- particles->set_emitting(false);
- }
-
- undo_redo->create_action(TTR("Generate Visibility Rect"));
- undo_redo->add_do_method(particles, "set_visibility_rect", rect);
- undo_redo->add_undo_method(particles, "set_visibility_rect", particles->get_visibility_rect());
- undo_redo->commit_action();
-}
-
-void Particles2DEditorPlugin::_generate_emission_mask() {
-
- Ref<ParticlesMaterial> pm = particles->get_process_material();
- if (!pm.is_valid()) {
- EditorNode::get_singleton()->show_warning(TTR("Can only set point into a ParticlesMaterial process material"));
- return;
- }
-
- Ref<Image> img;
- img.instance();
- Error err = ImageLoader::load_image(source_emission_file, img);
- ERR_FAIL_COND_MSG(err != OK, "Error loading image '" + source_emission_file + "'.");
-
- if (img->is_compressed()) {
- img->decompress();
- }
- img->convert(Image::FORMAT_RGBA8);
- ERR_FAIL_COND(img->get_format() != Image::FORMAT_RGBA8);
- Size2i s = Size2(img->get_width(), img->get_height());
- ERR_FAIL_COND(s.width == 0 || s.height == 0);
-
- Vector<Point2> valid_positions;
- Vector<Point2> valid_normals;
- Vector<uint8_t> valid_colors;
-
- valid_positions.resize(s.width * s.height);
-
- EmissionMode emode = (EmissionMode)emission_mask_mode->get_selected();
-
- if (emode == EMISSION_MODE_BORDER_DIRECTED) {
- valid_normals.resize(s.width * s.height);
- }
-
- bool capture_colors = emission_colors->is_pressed();
-
- if (capture_colors) {
- valid_colors.resize(s.width * s.height * 4);
- }
-
- int vpc = 0;
-
- {
- PoolVector<uint8_t> data = img->get_data();
- PoolVector<uint8_t>::Read r = data.read();
-
- for (int i = 0; i < s.width; i++) {
- for (int j = 0; j < s.height; j++) {
-
- uint8_t a = r[(j * s.width + i) * 4 + 3];
-
- if (a > 128) {
-
- if (emode == EMISSION_MODE_SOLID) {
-
- if (capture_colors) {
- valid_colors.write[vpc * 4 + 0] = r[(j * s.width + i) * 4 + 0];
- valid_colors.write[vpc * 4 + 1] = r[(j * s.width + i) * 4 + 1];
- valid_colors.write[vpc * 4 + 2] = r[(j * s.width + i) * 4 + 2];
- valid_colors.write[vpc * 4 + 3] = r[(j * s.width + i) * 4 + 3];
- }
- valid_positions.write[vpc++] = Point2(i, j);
-
- } else {
-
- bool on_border = false;
- for (int x = i - 1; x <= i + 1; x++) {
- for (int y = j - 1; y <= j + 1; y++) {
-
- if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) {
- on_border = true;
- break;
- }
- }
-
- if (on_border)
- break;
- }
-
- if (on_border) {
- valid_positions.write[vpc] = Point2(i, j);
-
- if (emode == EMISSION_MODE_BORDER_DIRECTED) {
- Vector2 normal;
- for (int x = i - 2; x <= i + 2; x++) {
- for (int y = j - 2; y <= j + 2; y++) {
-
- if (x == i && y == j)
- continue;
-
- if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) {
- normal += Vector2(x - i, y - j).normalized();
- }
- }
- }
-
- normal.normalize();
- valid_normals.write[vpc] = normal;
- }
-
- if (capture_colors) {
- valid_colors.write[vpc * 4 + 0] = r[(j * s.width + i) * 4 + 0];
- valid_colors.write[vpc * 4 + 1] = r[(j * s.width + i) * 4 + 1];
- valid_colors.write[vpc * 4 + 2] = r[(j * s.width + i) * 4 + 2];
- valid_colors.write[vpc * 4 + 3] = r[(j * s.width + i) * 4 + 3];
- }
-
- vpc++;
- }
- }
- }
- }
- }
- }
-
- valid_positions.resize(vpc);
- if (valid_normals.size()) {
- valid_normals.resize(vpc);
- }
-
- ERR_FAIL_COND_MSG(valid_positions.size() == 0, "No pixels with transparency > 128 in image...");
-
- PoolVector<uint8_t> texdata;
-
- int w = 2048;
- int h = (vpc / 2048) + 1;
-
- texdata.resize(w * h * 2 * sizeof(float));
-
- {
- PoolVector<uint8_t>::Write tw = texdata.write();
- float *twf = (float *)tw.ptr();
- for (int i = 0; i < vpc; i++) {
-
- twf[i * 2 + 0] = valid_positions[i].x;
- twf[i * 2 + 1] = valid_positions[i].y;
- }
- }
-
- img.instance();
- img->create(w, h, false, Image::FORMAT_RGF, texdata);
-
- Ref<ImageTexture> imgt;
- imgt.instance();
- imgt->create_from_image(img, 0);
-
- pm->set_emission_point_texture(imgt);
- pm->set_emission_point_count(vpc);
-
- if (capture_colors) {
-
- PoolVector<uint8_t> colordata;
- colordata.resize(w * h * 4); //use RG texture
-
- {
- PoolVector<uint8_t>::Write tw = colordata.write();
- for (int i = 0; i < vpc * 4; i++) {
-
- tw[i] = valid_colors[i];
- }
- }
-
- img.instance();
- img->create(w, h, false, Image::FORMAT_RGBA8, colordata);
-
- imgt.instance();
- imgt->create_from_image(img, 0);
- pm->set_emission_color_texture(imgt);
- }
-
- if (valid_normals.size()) {
- pm->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_DIRECTED_POINTS);
-
- PoolVector<uint8_t> normdata;
- normdata.resize(w * h * 2 * sizeof(float)); //use RG texture
-
- {
- PoolVector<uint8_t>::Write tw = normdata.write();
- float *twf = (float *)tw.ptr();
- for (int i = 0; i < vpc; i++) {
- twf[i * 2 + 0] = valid_normals[i].x;
- twf[i * 2 + 1] = valid_normals[i].y;
- }
- }
-
- img.instance();
- img->create(w, h, false, Image::FORMAT_RGF, normdata);
-
- imgt.instance();
- imgt->create_from_image(img, 0);
- pm->set_emission_normal_texture(imgt);
-
- } else {
- pm->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_POINTS);
- }
-}
-
-void Particles2DEditorPlugin::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
-
- menu->get_popup()->connect("id_pressed", this, "_menu_callback");
- menu->set_icon(menu->get_popup()->get_icon("Particles2D", "EditorIcons"));
- file->connect("file_selected", this, "_file_selected");
- }
-}
-
-void Particles2DEditorPlugin::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_menu_callback"), &Particles2DEditorPlugin::_menu_callback);
- ClassDB::bind_method(D_METHOD("_file_selected"), &Particles2DEditorPlugin::_file_selected);
- ClassDB::bind_method(D_METHOD("_generate_visibility_rect"), &Particles2DEditorPlugin::_generate_visibility_rect);
- ClassDB::bind_method(D_METHOD("_generate_emission_mask"), &Particles2DEditorPlugin::_generate_emission_mask);
-}
-
-Particles2DEditorPlugin::Particles2DEditorPlugin(EditorNode *p_node) {
-
- particles = NULL;
- editor = p_node;
- undo_redo = editor->get_undo_redo();
-
- toolbar = memnew(HBoxContainer);
- add_control_to_container(CONTAINER_CANVAS_EDITOR_MENU, toolbar);
- toolbar->hide();
-
- toolbar->add_child(memnew(VSeparator));
-
- menu = memnew(MenuButton);
- menu->get_popup()->add_item(TTR("Generate Visibility Rect"), MENU_GENERATE_VISIBILITY_RECT);
- menu->get_popup()->add_separator();
- menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK);
- // menu->get_popup()->add_item(TTR("Clear Emission Mask"), MENU_CLEAR_EMISSION_MASK);
- menu->get_popup()->add_separator();
- menu->get_popup()->add_item(TTR("Convert to CPUParticles"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES);
- menu->get_popup()->add_separator();
- menu->get_popup()->add_item(TTR("Restart"), MENU_RESTART);
- menu->set_text(TTR("Particles"));
- menu->set_switch_on_hover(true);
- toolbar->add_child(menu);
-
- file = memnew(EditorFileDialog);
- List<String> ext;
- ImageLoader::get_recognized_extensions(&ext);
- for (List<String>::Element *E = ext.front(); E; E = E->next()) {
- file->add_filter("*." + E->get() + "; " + E->get().to_upper());
- }
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- toolbar->add_child(file);
-
- epoints = memnew(SpinBox);
- epoints->set_min(1);
- epoints->set_max(8192);
- epoints->set_step(1);
- epoints->set_value(512);
- file->get_vbox()->add_margin_child(TTR("Generated Point Count:"), epoints);
-
- generate_visibility_rect = memnew(ConfirmationDialog);
- generate_visibility_rect->set_title(TTR("Generate Visibility Rect"));
- VBoxContainer *genvb = memnew(VBoxContainer);
- generate_visibility_rect->add_child(genvb);
- generate_seconds = memnew(SpinBox);
- genvb->add_margin_child(TTR("Generation Time (sec):"), generate_seconds);
- generate_seconds->set_min(0.1);
- generate_seconds->set_max(25);
- generate_seconds->set_value(2);
-
- toolbar->add_child(generate_visibility_rect);
-
- generate_visibility_rect->connect("confirmed", this, "_generate_visibility_rect");
-
- emission_mask = memnew(ConfirmationDialog);
- emission_mask->set_title(TTR("Load Emission Mask"));
- VBoxContainer *emvb = memnew(VBoxContainer);
- emission_mask->add_child(emvb);
- emission_mask_mode = memnew(OptionButton);
- emvb->add_margin_child(TTR("Emission Mask"), emission_mask_mode);
- emission_mask_mode->add_item(TTR("Solid Pixels"), EMISSION_MODE_SOLID);
- emission_mask_mode->add_item(TTR("Border Pixels"), EMISSION_MODE_BORDER);
- emission_mask_mode->add_item(TTR("Directed Border Pixels"), EMISSION_MODE_BORDER_DIRECTED);
- emission_colors = memnew(CheckBox);
- emission_colors->set_text(TTR("Capture from Pixel"));
- emvb->add_margin_child(TTR("Emission Colors"), emission_colors);
-
- toolbar->add_child(emission_mask);
-
- emission_mask->connect("confirmed", this, "_generate_emission_mask");
-}
-
-Particles2DEditorPlugin::~Particles2DEditorPlugin() {
-}
diff --git a/editor/plugins/particles_2d_editor_plugin.h b/editor/plugins/particles_2d_editor_plugin.h
deleted file mode 100644
index 29652a1826..0000000000
--- a/editor/plugins/particles_2d_editor_plugin.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*************************************************************************/
-/* particles_2d_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef PARTICLES_2D_EDITOR_PLUGIN_H
-#define PARTICLES_2D_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/2d/collision_polygon_2d.h"
-#include "scene/2d/particles_2d.h"
-#include "scene/gui/box_container.h"
-#include "scene/gui/file_dialog.h"
-
-class Particles2DEditorPlugin : public EditorPlugin {
-
- GDCLASS(Particles2DEditorPlugin, EditorPlugin);
-
- enum {
-
- MENU_GENERATE_VISIBILITY_RECT,
- MENU_LOAD_EMISSION_MASK,
- MENU_CLEAR_EMISSION_MASK,
- MENU_OPTION_CONVERT_TO_CPU_PARTICLES,
- MENU_RESTART
- };
-
- enum EmissionMode {
- EMISSION_MODE_SOLID,
- EMISSION_MODE_BORDER,
- EMISSION_MODE_BORDER_DIRECTED
- };
-
- Particles2D *particles;
-
- EditorFileDialog *file;
- EditorNode *editor;
-
- HBoxContainer *toolbar;
- MenuButton *menu;
-
- SpinBox *epoints;
-
- ConfirmationDialog *generate_visibility_rect;
- SpinBox *generate_seconds;
-
- ConfirmationDialog *emission_mask;
- OptionButton *emission_mask_mode;
- CheckBox *emission_colors;
-
- String source_emission_file;
-
- UndoRedo *undo_redo;
- void _file_selected(const String &p_file);
- void _menu_callback(int p_idx);
- void _generate_visibility_rect();
- void _generate_emission_mask();
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- virtual String get_name() const { return "Particles2D"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- Particles2DEditorPlugin(EditorNode *p_node);
- ~Particles2DEditorPlugin();
-};
-
-#endif // PARTICLES_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/particles_editor_plugin.cpp b/editor/plugins/particles_editor_plugin.cpp
deleted file mode 100644
index f869dabf9a..0000000000
--- a/editor/plugins/particles_editor_plugin.cpp
+++ /dev/null
@@ -1,530 +0,0 @@
-/*************************************************************************/
-/* particles_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "particles_editor_plugin.h"
-
-#include "core/io/resource_loader.h"
-#include "editor/plugins/spatial_editor_plugin.h"
-#include "scene/3d/cpu_particles.h"
-#include "scene/resources/particles_material.h"
-
-bool ParticlesEditorBase::_generate(PoolVector<Vector3> &points, PoolVector<Vector3> &normals) {
-
- bool use_normals = emission_fill->get_selected() == 1;
-
- if (emission_fill->get_selected() < 2) {
-
- float area_accum = 0;
- Map<float, int> triangle_area_map;
-
- for (int i = 0; i < geometry.size(); i++) {
-
- float area = geometry[i].get_area();
- if (area < CMP_EPSILON)
- continue;
- triangle_area_map[area_accum] = i;
- area_accum += area;
- }
-
- if (!triangle_area_map.size() || area_accum == 0) {
-
- EditorNode::get_singleton()->show_warning(TTR("The geometry's faces don't contain any area."));
- return false;
- }
-
- int emissor_count = emission_amount->get_value();
-
- for (int i = 0; i < emissor_count; i++) {
-
- float areapos = Math::random(0.0f, area_accum);
-
- Map<float, int>::Element *E = triangle_area_map.find_closest(areapos);
- ERR_FAIL_COND_V(!E, false);
- int index = E->get();
- ERR_FAIL_INDEX_V(index, geometry.size(), false);
-
- // ok FINALLY get face
- Face3 face = geometry[index];
- //now compute some position inside the face...
-
- Vector3 pos = face.get_random_point_inside();
-
- points.push_back(pos);
-
- if (use_normals) {
- Vector3 normal = face.get_plane().normal;
- normals.push_back(normal);
- }
- }
- } else {
-
- int gcount = geometry.size();
-
- if (gcount == 0) {
-
- EditorNode::get_singleton()->show_warning(TTR("The geometry doesn't contain any faces."));
- return false;
- }
-
- PoolVector<Face3>::Read r = geometry.read();
-
- AABB aabb;
-
- for (int i = 0; i < gcount; i++) {
-
- for (int j = 0; j < 3; j++) {
-
- if (i == 0 && j == 0)
- aabb.position = r[i].vertex[j];
- else
- aabb.expand_to(r[i].vertex[j]);
- }
- }
-
- int emissor_count = emission_amount->get_value();
-
- for (int i = 0; i < emissor_count; i++) {
-
- int attempts = 5;
-
- for (int j = 0; j < attempts; j++) {
-
- Vector3 dir;
- dir[Math::rand() % 3] = 1.0;
- Vector3 ofs = (Vector3(1, 1, 1) - dir) * Vector3(Math::randf(), Math::randf(), Math::randf()) * aabb.size + aabb.position;
-
- Vector3 ofsv = ofs + aabb.size * dir;
-
- //space it a little
- ofs -= dir;
- ofsv += dir;
-
- float max = -1e7, min = 1e7;
-
- for (int k = 0; k < gcount; k++) {
-
- const Face3 &f3 = r[k];
-
- Vector3 res;
- if (f3.intersects_segment(ofs, ofsv, &res)) {
-
- res -= ofs;
- float d = dir.dot(res);
-
- if (d < min)
- min = d;
- if (d > max)
- max = d;
- }
- }
-
- if (max < min)
- continue; //lost attempt
-
- float val = min + (max - min) * Math::randf();
-
- Vector3 point = ofs + dir * val;
-
- points.push_back(point);
- break;
- }
- }
- }
-
- return true;
-}
-
-void ParticlesEditorBase::_node_selected(const NodePath &p_path) {
-
- Node *sel = get_node(p_path);
- if (!sel)
- return;
-
- if (!sel->is_class("Spatial")) {
-
- EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't inherit from Spatial."), sel->get_name()));
- return;
- }
-
- VisualInstance *vi = Object::cast_to<VisualInstance>(sel);
- if (!vi) {
-
- EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't contain geometry."), sel->get_name()));
- return;
- }
-
- geometry = vi->get_faces(VisualInstance::FACES_SOLID);
-
- if (geometry.size() == 0) {
-
- EditorNode::get_singleton()->show_warning(vformat(TTR("\"%s\" doesn't contain face geometry."), sel->get_name()));
- return;
- }
-
- Transform geom_xform = base_node->get_global_transform().affine_inverse() * vi->get_global_transform();
-
- int gc = geometry.size();
- PoolVector<Face3>::Write w = geometry.write();
-
- for (int i = 0; i < gc; i++) {
- for (int j = 0; j < 3; j++) {
- w[i].vertex[j] = geom_xform.xform(w[i].vertex[j]);
- }
- }
-
- w.release();
-
- emission_dialog->popup_centered(Size2(300, 130));
-}
-
-void ParticlesEditorBase::_bind_methods() {
-
- ClassDB::bind_method("_node_selected", &ParticlesEditorBase::_node_selected);
- ClassDB::bind_method("_generate_emission_points", &ParticlesEditorBase::_generate_emission_points);
-}
-
-ParticlesEditorBase::ParticlesEditorBase() {
-
- emission_dialog = memnew(ConfirmationDialog);
- emission_dialog->set_title(TTR("Create Emitter"));
- add_child(emission_dialog);
- VBoxContainer *emd_vb = memnew(VBoxContainer);
- emission_dialog->add_child(emd_vb);
-
- emission_amount = memnew(SpinBox);
- emission_amount->set_min(1);
- emission_amount->set_max(100000);
- emission_amount->set_value(512);
- emd_vb->add_margin_child(TTR("Emission Points:"), emission_amount);
-
- emission_fill = memnew(OptionButton);
- emission_fill->add_item(TTR("Surface Points"));
- emission_fill->add_item(TTR("Surface Points+Normal (Directed)"));
- emission_fill->add_item(TTR("Volume"));
- emd_vb->add_margin_child(TTR("Emission Source: "), emission_fill);
-
- emission_dialog->get_ok()->set_text(TTR("Create"));
- emission_dialog->connect("confirmed", this, "_generate_emission_points");
-
- emission_file_dialog = memnew(EditorFileDialog);
- add_child(emission_file_dialog);
- emission_file_dialog->connect("file_selected", this, "_resource_seleted");
- emission_tree_dialog = memnew(SceneTreeDialog);
- add_child(emission_tree_dialog);
- emission_tree_dialog->connect("selected", this, "_node_selected");
-
- List<String> extensions;
- ResourceLoader::get_recognized_extensions_for_type("Mesh", &extensions);
-
- emission_file_dialog->clear_filters();
- for (int i = 0; i < extensions.size(); i++) {
-
- emission_file_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
- }
-
- emission_file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
-}
-
-void ParticlesEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- hide();
- }
-}
-
-void ParticlesEditor::_notification(int p_notification) {
-
- if (p_notification == NOTIFICATION_ENTER_TREE) {
- options->set_icon(options->get_popup()->get_icon("Particles", "EditorIcons"));
- get_tree()->connect("node_removed", this, "_node_removed");
- }
-}
-
-void ParticlesEditor::_menu_option(int p_option) {
-
- switch (p_option) {
-
- case MENU_OPTION_GENERATE_AABB: {
- float gen_time = node->get_lifetime();
-
- if (gen_time < 1.0)
- generate_seconds->set_value(1.0);
- else
- generate_seconds->set_value(trunc(gen_time) + 1.0);
- generate_aabb->popup_centered_minsize();
- } break;
- case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH: {
-
- Ref<ParticlesMaterial> material = node->get_process_material();
- if (material.is_null()) {
- EditorNode::get_singleton()->show_warning(TTR("A processor material of type 'ParticlesMaterial' is required."));
- return;
- }
- emission_file_dialog->popup_centered_ratio();
-
- } break;
-
- case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE: {
- Ref<ParticlesMaterial> material = node->get_process_material();
- if (material.is_null()) {
- EditorNode::get_singleton()->show_warning(TTR("A processor material of type 'ParticlesMaterial' is required."));
- return;
- }
-
- emission_tree_dialog->popup_centered_ratio();
-
- } break;
- case MENU_OPTION_CONVERT_TO_CPU_PARTICLES: {
-
- CPUParticles *cpu_particles = memnew(CPUParticles);
- cpu_particles->convert_from_particles(node);
- cpu_particles->set_name(node->get_name());
- cpu_particles->set_transform(node->get_transform());
- cpu_particles->set_visible(node->is_visible());
- cpu_particles->set_pause_mode(node->get_pause_mode());
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Convert to CPUParticles"));
- ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", node, cpu_particles, true, false);
- ur->add_do_reference(cpu_particles);
- ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", cpu_particles, node, false, false);
- ur->add_undo_reference(node);
- ur->commit_action();
-
- } break;
- case MENU_OPTION_RESTART: {
-
- node->restart();
-
- } break;
- }
-}
-
-void ParticlesEditor::_generate_aabb() {
-
- float time = generate_seconds->get_value();
-
- float running = 0.0;
-
- EditorProgress ep("gen_aabb", TTR("Generating AABB"), int(time));
-
- bool was_emitting = node->is_emitting();
- if (!was_emitting) {
- node->set_emitting(true);
- OS::get_singleton()->delay_usec(1000);
- }
-
- AABB rect;
-
- while (running < time) {
-
- uint64_t ticks = OS::get_singleton()->get_ticks_usec();
- ep.step("Generating...", int(running), true);
- OS::get_singleton()->delay_usec(1000);
-
- AABB capture = node->capture_aabb();
- if (rect == AABB())
- rect = capture;
- else
- rect.merge_with(capture);
-
- running += (OS::get_singleton()->get_ticks_usec() - ticks) / 1000000.0;
- }
-
- if (!was_emitting) {
- node->set_emitting(false);
- }
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Generate Visibility AABB"));
- ur->add_do_method(node, "set_visibility_aabb", rect);
- ur->add_undo_method(node, "set_visibility_aabb", node->get_visibility_aabb());
- ur->commit_action();
-}
-
-void ParticlesEditor::edit(Particles *p_particles) {
-
- base_node = p_particles;
- node = p_particles;
-}
-
-void ParticlesEditor::_generate_emission_points() {
-
- /// hacer codigo aca
- PoolVector<Vector3> points;
- PoolVector<Vector3> normals;
-
- if (!_generate(points, normals)) {
- return;
- }
-
- int point_count = points.size();
-
- int w = 2048;
- int h = (point_count / 2048) + 1;
-
- PoolVector<uint8_t> point_img;
- point_img.resize(w * h * 3 * sizeof(float));
-
- {
- PoolVector<uint8_t>::Write iw = point_img.write();
- zeromem(iw.ptr(), w * h * 3 * sizeof(float));
- PoolVector<Vector3>::Read r = points.read();
- float *wf = (float *)iw.ptr();
- for (int i = 0; i < point_count; i++) {
- wf[i * 3 + 0] = r[i].x;
- wf[i * 3 + 1] = r[i].y;
- wf[i * 3 + 2] = r[i].z;
- }
- }
-
- Ref<Image> image = memnew(Image(w, h, false, Image::FORMAT_RGBF, point_img));
-
- Ref<ImageTexture> tex;
- tex.instance();
- tex->create_from_image(image, Texture::FLAG_FILTER);
-
- Ref<ParticlesMaterial> material = node->get_process_material();
- ERR_FAIL_COND(material.is_null());
-
- if (normals.size() > 0) {
-
- material->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_DIRECTED_POINTS);
- material->set_emission_point_count(point_count);
- material->set_emission_point_texture(tex);
-
- PoolVector<uint8_t> point_img2;
- point_img2.resize(w * h * 3 * sizeof(float));
-
- {
- PoolVector<uint8_t>::Write iw = point_img2.write();
- zeromem(iw.ptr(), w * h * 3 * sizeof(float));
- PoolVector<Vector3>::Read r = normals.read();
- float *wf = (float *)iw.ptr();
- for (int i = 0; i < point_count; i++) {
- wf[i * 3 + 0] = r[i].x;
- wf[i * 3 + 1] = r[i].y;
- wf[i * 3 + 2] = r[i].z;
- }
- }
-
- Ref<Image> image2 = memnew(Image(w, h, false, Image::FORMAT_RGBF, point_img2));
-
- Ref<ImageTexture> tex2;
- tex2.instance();
- tex2->create_from_image(image2, Texture::FLAG_FILTER);
-
- material->set_emission_normal_texture(tex2);
- } else {
-
- material->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_POINTS);
- material->set_emission_point_count(point_count);
- material->set_emission_point_texture(tex);
- }
-}
-
-void ParticlesEditor::_bind_methods() {
-
- ClassDB::bind_method("_menu_option", &ParticlesEditor::_menu_option);
- ClassDB::bind_method("_generate_aabb", &ParticlesEditor::_generate_aabb);
- ClassDB::bind_method("_node_removed", &ParticlesEditor::_node_removed);
-}
-
-ParticlesEditor::ParticlesEditor() {
-
- node = NULL;
- particles_editor_hb = memnew(HBoxContainer);
- SpatialEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb);
- options = memnew(MenuButton);
- options->set_switch_on_hover(true);
- particles_editor_hb->add_child(options);
- particles_editor_hb->hide();
-
- options->set_text(TTR("Particles"));
- options->get_popup()->add_item(TTR("Generate AABB"), MENU_OPTION_GENERATE_AABB);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Create Emission Points From Mesh"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH);
- options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Convert to CPUParticles"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES);
- options->get_popup()->add_separator();
- options->get_popup()->add_item(TTR("Restart"), MENU_OPTION_RESTART);
-
- options->get_popup()->connect("id_pressed", this, "_menu_option");
-
- generate_aabb = memnew(ConfirmationDialog);
- generate_aabb->set_title(TTR("Generate Visibility AABB"));
- VBoxContainer *genvb = memnew(VBoxContainer);
- generate_aabb->add_child(genvb);
- generate_seconds = memnew(SpinBox);
- genvb->add_margin_child(TTR("Generation Time (sec):"), generate_seconds);
- generate_seconds->set_min(0.1);
- generate_seconds->set_max(25);
- generate_seconds->set_value(2);
-
- add_child(generate_aabb);
-
- generate_aabb->connect("confirmed", this, "_generate_aabb");
-}
-
-void ParticlesEditorPlugin::edit(Object *p_object) {
-
- particles_editor->edit(Object::cast_to<Particles>(p_object));
-}
-
-bool ParticlesEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("Particles");
-}
-
-void ParticlesEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- particles_editor->show();
- particles_editor->particles_editor_hb->show();
- } else {
- particles_editor->particles_editor_hb->hide();
- particles_editor->hide();
- particles_editor->edit(NULL);
- }
-}
-
-ParticlesEditorPlugin::ParticlesEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- particles_editor = memnew(ParticlesEditor);
- editor->get_viewport()->add_child(particles_editor);
-
- particles_editor->hide();
-}
-
-ParticlesEditorPlugin::~ParticlesEditorPlugin() {
-}
diff --git a/editor/plugins/particles_editor_plugin.h b/editor/plugins/particles_editor_plugin.h
deleted file mode 100644
index 4b20d00670..0000000000
--- a/editor/plugins/particles_editor_plugin.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*************************************************************************/
-/* particles_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef PARTICLES_EDITOR_PLUGIN_H
-#define PARTICLES_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/3d/particles.h"
-#include "scene/gui/spin_box.h"
-
-class ParticlesEditorBase : public Control {
-
- GDCLASS(ParticlesEditorBase, Control);
-
-protected:
- Spatial *base_node;
- Panel *panel;
- MenuButton *options;
- HBoxContainer *particles_editor_hb;
-
- EditorFileDialog *emission_file_dialog;
- SceneTreeDialog *emission_tree_dialog;
-
- ConfirmationDialog *emission_dialog;
- SpinBox *emission_amount;
- OptionButton *emission_fill;
-
- PoolVector<Face3> geometry;
-
- bool _generate(PoolVector<Vector3> &points, PoolVector<Vector3> &normals);
- virtual void _generate_emission_points() = 0;
- void _node_selected(const NodePath &p_path);
-
- static void _bind_methods();
-
-public:
- ParticlesEditorBase();
-};
-
-class ParticlesEditor : public ParticlesEditorBase {
-
- GDCLASS(ParticlesEditor, ParticlesEditorBase);
-
- ConfirmationDialog *generate_aabb;
- SpinBox *generate_seconds;
- Particles *node;
-
- enum Menu {
-
- MENU_OPTION_GENERATE_AABB,
- MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE,
- MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_MESH,
- MENU_OPTION_CLEAR_EMISSION_VOLUME,
- MENU_OPTION_CONVERT_TO_CPU_PARTICLES,
- MENU_OPTION_RESTART,
-
- };
-
- void _generate_aabb();
-
- void _menu_option(int);
-
- friend class ParticlesEditorPlugin;
-
- virtual void _generate_emission_points();
-
-protected:
- void _notification(int p_notification);
- void _node_removed(Node *p_node);
- static void _bind_methods();
-
-public:
- void edit(Particles *p_particles);
- ParticlesEditor();
-};
-
-class ParticlesEditorPlugin : public EditorPlugin {
-
- GDCLASS(ParticlesEditorPlugin, EditorPlugin);
-
- ParticlesEditor *particles_editor;
- EditorNode *editor;
-
-public:
- virtual String get_name() const { return "Particles"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- ParticlesEditorPlugin(EditorNode *p_node);
- ~ParticlesEditorPlugin();
-};
-
-#endif // PARTICLES_EDITOR_PLUGIN_H
diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp
index 3737dbdd57..f79098ce5d 100644
--- a/editor/plugins/path_2d_editor_plugin.cpp
+++ b/editor/plugins/path_2d_editor_plugin.cpp
@@ -37,11 +37,8 @@
#include "editor/editor_settings.h"
void Path2DEditor::_notification(int p_what) {
-
switch (p_what) {
-
case NOTIFICATION_READY: {
-
//button_create->set_icon( get_icon("Edit","EditorIcons"));
//button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
//set_pressed_button(button_edit);
@@ -49,44 +46,43 @@ void Path2DEditor::_notification(int p_what) {
} break;
case NOTIFICATION_PHYSICS_PROCESS: {
-
} break;
}
}
-void Path2DEditor::_node_removed(Node *p_node) {
+void Path2DEditor::_node_removed(Node *p_node) {
if (p_node == node) {
- node = NULL;
+ node = nullptr;
hide();
}
}
bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
- if (!node)
+ if (!node) {
return false;
+ }
- if (!node->is_visible_in_tree())
+ if (!node->is_visible_in_tree()) {
return false;
+ }
- if (!node->get_curve().is_valid())
+ if (!node->get_curve().is_valid()) {
return false;
+ }
real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid()) {
-
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
Vector2 gpoint = mb->get_position();
Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
if (mb->is_pressed() && action == ACTION_NONE) {
-
Ref<Curve2D> curve = node->get_curve();
for (int i = 0; i < curve->get_point_count(); i++) {
-
real_t dist_to_p = gpoint.distance_to(xform.xform(curve->get_point_position(i)));
real_t dist_to_p_out = gpoint.distance_to(xform.xform(curve->get_point_position(i) + curve->get_point_out(i)));
real_t dist_to_p_in = gpoint.distance_to(xform.xform(curve->get_point_position(i) + curve->get_point_in(i)));
@@ -104,7 +100,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
} else if (mode == MODE_EDIT || mode == MODE_EDIT_CURVE) {
// In/out controls can be moved in multiple modes.
if (dist_to_p_out < grab_threshold && i < (curve->get_point_count() - 1)) {
-
action = ACTION_MOVING_OUT;
action_point = i;
moving_from = curve->get_point_out(i);
@@ -112,7 +107,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
orig_in_length = curve->get_point_in(action_point).length();
return true;
} else if (dist_to_p_in < grab_threshold && i > 0) {
-
action = ACTION_MOVING_IN;
action_point = i;
moving_from = curve->get_point_in(i);
@@ -126,7 +120,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
// Check for point deletion.
if ((mb->get_button_index() == BUTTON_RIGHT && mode == MODE_EDIT) || (mb->get_button_index() == BUTTON_LEFT && mode == MODE_DELETE)) {
if (dist_to_p < grab_threshold) {
-
undo_redo->create_action(TTR("Remove Point from Curve"));
undo_redo->add_do_method(curve.ptr(), "remove_point", i);
undo_redo->add_undo_method(curve.ptr(), "add_point", curve->get_point_position(i), curve->get_point_in(i), curve->get_point_out(i), i);
@@ -135,7 +128,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
undo_redo->commit_action();
return true;
} else if (dist_to_p_out < grab_threshold) {
-
undo_redo->create_action(TTR("Remove Out-Control from Curve"));
undo_redo->add_do_method(curve.ptr(), "set_point_out", i, Vector2());
undo_redo->add_undo_method(curve.ptr(), "set_point_out", i, curve->get_point_out(i));
@@ -144,7 +136,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
undo_redo->commit_action();
return true;
} else if (dist_to_p_in < grab_threshold) {
-
undo_redo->create_action(TTR("Remove In-Control from Curve"));
undo_redo->add_do_method(curve.ptr(), "set_point_in", i, Vector2());
undo_redo->add_undo_method(curve.ptr(), "set_point_in", i, curve->get_point_in(i));
@@ -159,7 +150,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
// Check for point creation.
if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && ((mb->get_command() && mode == MODE_EDIT) || mode == MODE_CREATE)) {
-
Ref<Curve2D> curve = node->get_curve();
undo_redo->create_action(TTR("Add Point to Curve"));
@@ -189,11 +179,13 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
int len = curve->get_point_count();
for (int i = 0; i < len - 1; i++) {
float compareLength = curve->get_closest_offset(curve->get_point_position(i + 1));
- if (mbLength >= curve->get_closest_offset(curve->get_point_position(i)) && mbLength <= compareLength)
+ if (mbLength >= curve->get_closest_offset(curve->get_point_position(i)) && mbLength <= compareLength) {
insertion_point = i;
+ }
}
- if (insertion_point == -1)
+ if (insertion_point == -1) {
insertion_point = curve->get_point_count() - 2;
+ }
undo_redo->create_action(TTR("Split Curve"));
undo_redo->add_do_method(curve.ptr(), "add_point", xform.affine_inverse().xform(gpoint2), Vector2(0, 0), Vector2(0, 0), insertion_point + 1);
@@ -216,18 +208,15 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
// Check for point movement completion.
if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && action != ACTION_NONE) {
-
Ref<Curve2D> curve = node->get_curve();
Vector2 new_pos = moving_from + xform.affine_inverse().basis_xform(gpoint - moving_screen_from);
switch (action) {
-
case ACTION_NONE:
// N/A, handled in above condition.
break;
case ACTION_MOVING_POINT: {
-
undo_redo->create_action(TTR("Move Point in Curve"));
undo_redo->add_do_method(curve.ptr(), "set_point_position", action_point, cpoint);
undo_redo->add_undo_method(curve.ptr(), "set_point_position", action_point, moving_from);
@@ -238,7 +227,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
} break;
case ACTION_MOVING_IN: {
-
undo_redo->create_action(TTR("Move In-Control in Curve"));
undo_redo->add_do_method(curve.ptr(), "set_point_in", action_point, new_pos);
undo_redo->add_undo_method(curve.ptr(), "set_point_in", action_point, moving_from);
@@ -254,7 +242,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
} break;
case ACTION_MOVING_OUT: {
-
undo_redo->create_action(TTR("Move Out-Control in Curve"));
undo_redo->add_do_method(curve.ptr(), "set_point_out", action_point, new_pos);
undo_redo->add_undo_method(curve.ptr(), "set_point_out", action_point, moving_from);
@@ -279,7 +266,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid()) {
-
if (action == ACTION_NONE && mode == MODE_EDIT) {
// Handle Edge Follow
bool old_edge = on_edge;
@@ -288,8 +274,12 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
Vector2 gpoint = mm->get_position();
Ref<Curve2D> curve = node->get_curve();
- if (curve == NULL) return true;
- if (curve->get_point_count() < 2) return true;
+ if (curve == nullptr) {
+ return true;
+ }
+ if (curve->get_point_count() < 2) {
+ return true;
+ }
// Find edge
edge_point = xform.xform(curve->get_closest_point(xform.affine_inverse().xform(mm->get_position())));
@@ -334,7 +324,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
Vector2 new_pos = moving_from + xform.affine_inverse().basis_xform(gpoint - moving_screen_from);
switch (action) {
-
case ACTION_NONE:
// N/A, handled in above condition.
break;
@@ -346,15 +335,17 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
case ACTION_MOVING_IN: {
curve->set_point_in(action_point, new_pos);
- if (mirror_handle_angle)
+ if (mirror_handle_angle) {
curve->set_point_out(action_point, mirror_handle_length ? -new_pos : (-new_pos.normalized() * orig_out_length));
+ }
} break;
case ACTION_MOVING_OUT: {
curve->set_point_out(action_point, new_pos);
- if (mirror_handle_angle)
+ if (mirror_handle_angle) {
curve->set_point_in(action_point, mirror_handle_length ? -new_pos : (-new_pos.normalized() * orig_in_length));
+ }
} break;
}
@@ -367,18 +358,18 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
}
void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
- if (!node || !node->is_visible_in_tree() || !node->get_curve().is_valid())
+ if (!node || !node->is_visible_in_tree() || !node->get_curve().is_valid()) {
return;
+ }
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
- const Ref<Texture> path_sharp_handle = get_icon("EditorPathSharpHandle", "EditorIcons");
- const Ref<Texture> path_smooth_handle = get_icon("EditorPathSmoothHandle", "EditorIcons");
+ const Ref<Texture2D> path_sharp_handle = get_theme_icon("EditorPathSharpHandle", "EditorIcons");
+ const Ref<Texture2D> path_smooth_handle = get_theme_icon("EditorPathSmoothHandle", "EditorIcons");
// Both handle icons must be of the same size
const Size2 handle_size = path_sharp_handle->get_size();
- const Ref<Texture> curve_handle = get_icon("EditorCurveHandle", "EditorIcons");
+ const Ref<Texture2D> curve_handle = get_theme_icon("EditorCurveHandle", "EditorIcons");
const Size2 curve_handle_size = curve_handle->get_size();
Ref<Curve2D> curve = node->get_curve();
@@ -396,8 +387,8 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
if (point != pointout) {
smooth = true;
// Draw the line with a dark and light color to be visible on all backgrounds
- vpc->draw_line(point, pointout, Color(0, 0, 0, 0.5), Math::round(EDSCALE), true);
- vpc->draw_line(point, pointout, Color(1, 1, 1, 0.5), Math::round(EDSCALE), true);
+ vpc->draw_line(point, pointout, Color(0, 0, 0, 0.5), Math::round(EDSCALE));
+ vpc->draw_line(point, pointout, Color(1, 1, 1, 0.5), Math::round(EDSCALE));
vpc->draw_texture_rect(curve_handle, Rect2(pointout - curve_handle_size * 0.5, curve_handle_size), false, Color(1, 1, 1, 0.75));
}
}
@@ -407,8 +398,8 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
if (point != pointin) {
smooth = true;
// Draw the line with a dark and light color to be visible on all backgrounds
- vpc->draw_line(point, pointin, Color(0, 0, 0, 0.5), Math::round(EDSCALE), true);
- vpc->draw_line(point, pointin, Color(1, 1, 1, 0.5), Math::round(EDSCALE), true);
+ vpc->draw_line(point, pointin, Color(0, 0, 0, 0.5), Math::round(EDSCALE));
+ vpc->draw_line(point, pointin, Color(1, 1, 1, 0.5), Math::round(EDSCALE));
vpc->draw_texture_rect(curve_handle, Rect2(pointin - curve_handle_size * 0.5, curve_handle_size), false, Color(1, 1, 1, 0.75));
}
}
@@ -420,86 +411,79 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
}
if (on_edge) {
- Ref<Texture> add_handle = get_icon("EditorHandleAdd", "EditorIcons");
+ Ref<Texture2D> add_handle = get_theme_icon("EditorHandleAdd", "EditorIcons");
p_overlay->draw_texture(add_handle, edge_point - add_handle->get_size() * 0.5);
}
}
void Path2DEditor::_node_visibility_changed() {
- if (!node)
+ if (!node) {
return;
+ }
canvas_item_editor->update_viewport();
}
void Path2DEditor::edit(Node *p_path2d) {
-
if (!canvas_item_editor) {
canvas_item_editor = CanvasItemEditor::get_singleton();
}
if (p_path2d) {
-
node = Object::cast_to<Path2D>(p_path2d);
- if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
- node->connect("visibility_changed", this, "_node_visibility_changed");
+ if (!node->is_connected("visibility_changed", callable_mp(this, &Path2DEditor::_node_visibility_changed))) {
+ node->connect("visibility_changed", callable_mp(this, &Path2DEditor::_node_visibility_changed));
+ }
} else {
-
// node may have been deleted at this point
- if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
- node->disconnect("visibility_changed", this, "_node_visibility_changed");
- node = NULL;
+ if (node && node->is_connected("visibility_changed", callable_mp(this, &Path2DEditor::_node_visibility_changed))) {
+ node->disconnect("visibility_changed", callable_mp(this, &Path2DEditor::_node_visibility_changed));
+ }
+ node = nullptr;
}
}
void Path2DEditor::_bind_methods() {
-
//ClassDB::bind_method(D_METHOD("_menu_option"),&Path2DEditor::_menu_option);
- ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Path2DEditor::_node_visibility_changed);
- ClassDB::bind_method(D_METHOD("_mode_selected"), &Path2DEditor::_mode_selected);
- ClassDB::bind_method(D_METHOD("_handle_option_pressed"), &Path2DEditor::_handle_option_pressed);
}
void Path2DEditor::_mode_selected(int p_mode) {
-
if (p_mode == MODE_CREATE) {
-
curve_create->set_pressed(true);
curve_edit->set_pressed(false);
curve_edit_curve->set_pressed(false);
curve_del->set_pressed(false);
} else if (p_mode == MODE_EDIT) {
-
curve_create->set_pressed(false);
curve_edit->set_pressed(true);
curve_edit_curve->set_pressed(false);
curve_del->set_pressed(false);
} else if (p_mode == MODE_EDIT_CURVE) {
-
curve_create->set_pressed(false);
curve_edit->set_pressed(false);
curve_edit_curve->set_pressed(true);
curve_del->set_pressed(false);
} else if (p_mode == MODE_DELETE) {
-
curve_create->set_pressed(false);
curve_edit->set_pressed(false);
curve_edit_curve->set_pressed(false);
curve_del->set_pressed(true);
} else if (p_mode == ACTION_CLOSE) {
-
//?
- if (!node->get_curve().is_valid())
+ if (!node->get_curve().is_valid()) {
return;
- if (node->get_curve()->get_point_count() < 3)
+ }
+ if (node->get_curve()->get_point_count() < 3) {
return;
+ }
Vector2 begin = node->get_curve()->get_point_position(0);
Vector2 end = node->get_curve()->get_point_position(node->get_curve()->get_point_count() - 1);
- if (begin.distance_to(end) < CMP_EPSILON)
+ if (begin.distance_to(end) < CMP_EPSILON) {
return;
+ }
undo_redo->create_action(TTR("Remove Point from Curve"));
undo_redo->add_do_method(node->get_curve().ptr(), "add_point", begin);
@@ -514,7 +498,6 @@ void Path2DEditor::_mode_selected(int p_mode) {
}
void Path2DEditor::_handle_option_pressed(int p_option) {
-
PopupMenu *pm;
pm = handle_menu->get_popup();
@@ -534,8 +517,7 @@ void Path2DEditor::_handle_option_pressed(int p_option) {
}
Path2DEditor::Path2DEditor(EditorNode *p_editor) {
-
- canvas_item_editor = NULL;
+ canvas_item_editor = nullptr;
editor = p_editor;
undo_redo = editor->get_undo_redo();
mirror_handle_angle = true;
@@ -550,39 +532,44 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
sep = memnew(VSeparator);
base_hb->add_child(sep);
- curve_edit = memnew(ToolButton);
- curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveEdit", "EditorIcons"));
+ curve_edit = memnew(Button);
+ curve_edit->set_flat(true);
+ curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveEdit", "EditorIcons"));
curve_edit->set_toggle_mode(true);
curve_edit->set_focus_mode(Control::FOCUS_NONE);
curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Left Click: Split Segment (in curve)") + "\n" + TTR("Right Click: Delete Point"));
- curve_edit->connect("pressed", this, "_mode_selected", varray(MODE_EDIT));
+ curve_edit->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_EDIT));
base_hb->add_child(curve_edit);
- curve_edit_curve = memnew(ToolButton);
- curve_edit_curve->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCurve", "EditorIcons"));
+ curve_edit_curve = memnew(Button);
+ curve_edit_curve->set_flat(true);
+ curve_edit_curve->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveCurve", "EditorIcons"));
curve_edit_curve->set_toggle_mode(true);
curve_edit_curve->set_focus_mode(Control::FOCUS_NONE);
curve_edit_curve->set_tooltip(TTR("Select Control Points (Shift+Drag)"));
- curve_edit_curve->connect("pressed", this, "_mode_selected", varray(MODE_EDIT_CURVE));
+ curve_edit_curve->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_EDIT_CURVE));
base_hb->add_child(curve_edit_curve);
- curve_create = memnew(ToolButton);
- curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCreate", "EditorIcons"));
+ curve_create = memnew(Button);
+ curve_create->set_flat(true);
+ curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveCreate", "EditorIcons"));
curve_create->set_toggle_mode(true);
curve_create->set_focus_mode(Control::FOCUS_NONE);
curve_create->set_tooltip(TTR("Add Point (in empty space)"));
- curve_create->connect("pressed", this, "_mode_selected", varray(MODE_CREATE));
+ curve_create->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_CREATE));
base_hb->add_child(curve_create);
- curve_del = memnew(ToolButton);
- curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveDelete", "EditorIcons"));
+ curve_del = memnew(Button);
+ curve_del->set_flat(true);
+ curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveDelete", "EditorIcons"));
curve_del->set_toggle_mode(true);
curve_del->set_focus_mode(Control::FOCUS_NONE);
curve_del->set_tooltip(TTR("Delete Point"));
- curve_del->connect("pressed", this, "_mode_selected", varray(MODE_DELETE));
+ curve_del->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_DELETE));
base_hb->add_child(curve_del);
- curve_close = memnew(ToolButton);
- curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveClose", "EditorIcons"));
+ curve_close = memnew(Button);
+ curve_close->set_flat(true);
+ curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveClose", "EditorIcons"));
curve_close->set_focus_mode(Control::FOCUS_NONE);
curve_close->set_tooltip(TTR("Close Curve"));
- curve_close->connect("pressed", this, "_mode_selected", varray(ACTION_CLOSE));
+ curve_close->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(ACTION_CLOSE));
base_hb->add_child(curve_close);
PopupMenu *menu;
@@ -596,7 +583,7 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
menu->set_item_checked(HANDLE_OPTION_ANGLE, mirror_handle_angle);
menu->add_check_item(TTR("Mirror Handle Lengths"));
menu->set_item_checked(HANDLE_OPTION_LENGTH, mirror_handle_length);
- menu->connect("id_pressed", this, "_handle_option_pressed");
+ menu->connect("id_pressed", callable_mp(this, &Path2DEditor::_handle_option_pressed));
base_hb->hide();
@@ -604,31 +591,26 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
}
void Path2DEditorPlugin::edit(Object *p_object) {
-
path2d_editor->edit(Object::cast_to<Node>(p_object));
}
bool Path2DEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("Path2D");
}
void Path2DEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
path2d_editor->show();
path2d_editor->base_hb->show();
} else {
-
path2d_editor->hide();
path2d_editor->base_hb->hide();
- path2d_editor->edit(NULL);
+ path2d_editor->edit(nullptr);
}
}
Path2DEditorPlugin::Path2DEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
path2d_editor = memnew(Path2DEditor(p_node));
CanvasItemEditor::get_singleton()->add_control_to_menu_panel(path2d_editor);
diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h
index aae0e11c99..6a7dffc7f8 100644
--- a/editor/plugins/path_2d_editor_plugin.h
+++ b/editor/plugins/path_2d_editor_plugin.h
@@ -34,12 +34,10 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
#include "scene/2d/path_2d.h"
-#include "scene/gui/tool_button.h"
class CanvasItemEditor;
class Path2DEditor : public HBoxContainer {
-
GDCLASS(Path2DEditor, HBoxContainer);
UndoRedo *undo_redo;
@@ -61,11 +59,11 @@ class Path2DEditor : public HBoxContainer {
};
Mode mode;
- ToolButton *curve_create;
- ToolButton *curve_edit;
- ToolButton *curve_edit_curve;
- ToolButton *curve_del;
- ToolButton *curve_close;
+ Button *curve_create;
+ Button *curve_edit;
+ Button *curve_edit_curve;
+ Button *curve_del;
+ Button *curve_close;
MenuButton *handle_menu;
bool mirror_handle_angle;
@@ -112,21 +110,20 @@ public:
};
class Path2DEditorPlugin : public EditorPlugin {
-
GDCLASS(Path2DEditorPlugin, EditorPlugin);
Path2DEditor *path2d_editor;
EditorNode *editor;
public:
- virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return path2d_editor->forward_gui_input(p_event); }
- virtual void forward_canvas_draw_over_viewport(Control *p_overlay) { path2d_editor->forward_canvas_draw_over_viewport(p_overlay); }
-
- virtual String get_name() const { return "Path2D"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return path2d_editor->forward_gui_input(p_event); }
+ virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override { path2d_editor->forward_canvas_draw_over_viewport(p_overlay); }
+
+ virtual String get_name() const override { return "Path2D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
Path2DEditorPlugin(EditorNode *p_node);
~Path2DEditorPlugin();
diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..f53130c24d
--- /dev/null
+++ b/editor/plugins/path_3d_editor_plugin.cpp
@@ -0,0 +1,645 @@
+/*************************************************************************/
+/* path_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "path_3d_editor_plugin.h"
+
+#include "core/math/geometry_2d.h"
+#include "core/math/geometry_3d.h"
+#include "core/os/keyboard.h"
+#include "node_3d_editor_plugin.h"
+#include "scene/resources/curve.h"
+
+String Path3DGizmo::get_handle_name(int p_idx) const {
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null()) {
+ return "";
+ }
+
+ if (p_idx < c->get_point_count()) {
+ return TTR("Curve Point #") + itos(p_idx);
+ }
+
+ p_idx = p_idx - c->get_point_count() + 1;
+
+ int idx = p_idx / 2;
+ int t = p_idx % 2;
+ String n = TTR("Curve Point #") + itos(idx);
+ if (t == 0) {
+ n += " In";
+ } else {
+ n += " Out";
+ }
+
+ return n;
+}
+
+Variant Path3DGizmo::get_handle_value(int p_idx) {
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null()) {
+ return Variant();
+ }
+
+ if (p_idx < c->get_point_count()) {
+ original = c->get_point_position(p_idx);
+ return original;
+ }
+
+ p_idx = p_idx - c->get_point_count() + 1;
+
+ int idx = p_idx / 2;
+ int t = p_idx % 2;
+
+ Vector3 ofs;
+ if (t == 0) {
+ ofs = c->get_point_in(idx);
+ } else {
+ ofs = c->get_point_out(idx);
+ }
+
+ original = ofs + c->get_point_position(idx);
+
+ return ofs;
+}
+
+void Path3DGizmo::set_handle(int p_idx, Camera3D *p_camera, const Point2 &p_point) {
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null()) {
+ return;
+ }
+
+ Transform gt = path->get_global_transform();
+ Transform gi = gt.affine_inverse();
+ Vector3 ray_from = p_camera->project_ray_origin(p_point);
+ Vector3 ray_dir = p_camera->project_ray_normal(p_point);
+
+ // Setting curve point positions
+ if (p_idx < c->get_point_count()) {
+ Plane p(gt.xform(original), p_camera->get_transform().basis.get_axis(2));
+
+ Vector3 inters;
+
+ if (p.intersects_ray(ray_from, ray_dir, &inters)) {
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ float snap = Node3DEditor::get_singleton()->get_translate_snap();
+ inters.snap(Vector3(snap, snap, snap));
+ }
+
+ Vector3 local = gi.xform(inters);
+ c->set_point_position(p_idx, local);
+ }
+
+ return;
+ }
+
+ p_idx = p_idx - c->get_point_count() + 1;
+
+ int idx = p_idx / 2;
+ int t = p_idx % 2;
+
+ Vector3 base = c->get_point_position(idx);
+
+ Plane p(gt.xform(original), p_camera->get_transform().basis.get_axis(2));
+
+ Vector3 inters;
+
+ // Setting curve in/out positions
+ if (p.intersects_ray(ray_from, ray_dir, &inters)) {
+ if (!Path3DEditorPlugin::singleton->is_handle_clicked()) {
+ orig_in_length = c->get_point_in(idx).length();
+ orig_out_length = c->get_point_out(idx).length();
+ Path3DEditorPlugin::singleton->set_handle_clicked(true);
+ }
+
+ Vector3 local = gi.xform(inters) - base;
+ if (Node3DEditor::get_singleton()->is_snap_enabled()) {
+ float snap = Node3DEditor::get_singleton()->get_translate_snap();
+ local.snap(Vector3(snap, snap, snap));
+ }
+
+ if (t == 0) {
+ c->set_point_in(idx, local);
+ if (Path3DEditorPlugin::singleton->mirror_angle_enabled()) {
+ c->set_point_out(idx, Path3DEditorPlugin::singleton->mirror_length_enabled() ? -local : (-local.normalized() * orig_out_length));
+ }
+ } else {
+ c->set_point_out(idx, local);
+ if (Path3DEditorPlugin::singleton->mirror_angle_enabled()) {
+ c->set_point_in(idx, Path3DEditorPlugin::singleton->mirror_length_enabled() ? -local : (-local.normalized() * orig_in_length));
+ }
+ }
+ }
+}
+
+void Path3DGizmo::commit_handle(int p_idx, const Variant &p_restore, bool p_cancel) {
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null()) {
+ return;
+ }
+
+ UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
+
+ if (p_idx < c->get_point_count()) {
+ if (p_cancel) {
+ c->set_point_position(p_idx, p_restore);
+ return;
+ }
+ ur->create_action(TTR("Set Curve Point Position"));
+ ur->add_do_method(c.ptr(), "set_point_position", p_idx, c->get_point_position(p_idx));
+ ur->add_undo_method(c.ptr(), "set_point_position", p_idx, p_restore);
+ ur->commit_action();
+
+ return;
+ }
+
+ p_idx = p_idx - c->get_point_count() + 1;
+
+ int idx = p_idx / 2;
+ int t = p_idx % 2;
+
+ if (t == 0) {
+ if (p_cancel) {
+ c->set_point_in(p_idx, p_restore);
+ return;
+ }
+
+ ur->create_action(TTR("Set Curve In Position"));
+ ur->add_do_method(c.ptr(), "set_point_in", idx, c->get_point_in(idx));
+ ur->add_undo_method(c.ptr(), "set_point_in", idx, p_restore);
+
+ if (Path3DEditorPlugin::singleton->mirror_angle_enabled()) {
+ ur->add_do_method(c.ptr(), "set_point_out", idx, Path3DEditorPlugin::singleton->mirror_length_enabled() ? -c->get_point_in(idx) : (-c->get_point_in(idx).normalized() * orig_out_length));
+ ur->add_undo_method(c.ptr(), "set_point_out", idx, Path3DEditorPlugin::singleton->mirror_length_enabled() ? -static_cast<Vector3>(p_restore) : (-static_cast<Vector3>(p_restore).normalized() * orig_out_length));
+ }
+ ur->commit_action();
+
+ } else {
+ if (p_cancel) {
+ c->set_point_out(idx, p_restore);
+
+ return;
+ }
+
+ ur->create_action(TTR("Set Curve Out Position"));
+ ur->add_do_method(c.ptr(), "set_point_out", idx, c->get_point_out(idx));
+ ur->add_undo_method(c.ptr(), "set_point_out", idx, p_restore);
+
+ if (Path3DEditorPlugin::singleton->mirror_angle_enabled()) {
+ ur->add_do_method(c.ptr(), "set_point_in", idx, Path3DEditorPlugin::singleton->mirror_length_enabled() ? -c->get_point_out(idx) : (-c->get_point_out(idx).normalized() * orig_in_length));
+ ur->add_undo_method(c.ptr(), "set_point_in", idx, Path3DEditorPlugin::singleton->mirror_length_enabled() ? -static_cast<Vector3>(p_restore) : (-static_cast<Vector3>(p_restore).normalized() * orig_in_length));
+ }
+ ur->commit_action();
+ }
+}
+
+void Path3DGizmo::redraw() {
+ clear();
+
+ Ref<StandardMaterial3D> path_material = gizmo_plugin->get_material("path_material", this);
+ Ref<StandardMaterial3D> path_thin_material = gizmo_plugin->get_material("path_thin_material", this);
+ Ref<StandardMaterial3D> handles_material = gizmo_plugin->get_material("handles");
+
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null()) {
+ return;
+ }
+
+ Vector<Vector3> v3a = c->tessellate();
+ //Vector<Vector3> v3a=c->get_baked_points();
+
+ int v3s = v3a.size();
+ if (v3s == 0) {
+ return;
+ }
+ Vector<Vector3> v3p;
+ const Vector3 *r = v3a.ptr();
+
+ // BUG: the following won't work when v3s, avoid drawing as a temporary workaround.
+ for (int i = 0; i < v3s - 1; i++) {
+ v3p.push_back(r[i]);
+ v3p.push_back(r[i + 1]);
+ //v3p.push_back(r[i]);
+ //v3p.push_back(r[i]+Vector3(0,0.2,0));
+ }
+
+ if (v3p.size() > 1) {
+ add_lines(v3p, path_material);
+ add_collision_segments(v3p);
+ }
+
+ if (Path3DEditorPlugin::singleton->get_edited_path() == path) {
+ v3p.clear();
+ Vector<Vector3> handles;
+ Vector<Vector3> sec_handles;
+
+ for (int i = 0; i < c->get_point_count(); i++) {
+ Vector3 p = c->get_point_position(i);
+ handles.push_back(p);
+ if (i > 0) {
+ v3p.push_back(p);
+ v3p.push_back(p + c->get_point_in(i));
+ sec_handles.push_back(p + c->get_point_in(i));
+ }
+
+ if (i < c->get_point_count() - 1) {
+ v3p.push_back(p);
+ v3p.push_back(p + c->get_point_out(i));
+ sec_handles.push_back(p + c->get_point_out(i));
+ }
+ }
+
+ if (v3p.size() > 1) {
+ add_lines(v3p, path_thin_material);
+ }
+ if (handles.size()) {
+ add_handles(handles, handles_material);
+ }
+ if (sec_handles.size()) {
+ add_handles(sec_handles, handles_material, false, true);
+ }
+ }
+}
+
+Path3DGizmo::Path3DGizmo(Path3D *p_path) {
+ path = p_path;
+ set_spatial_node(p_path);
+}
+
+bool Path3DEditorPlugin::forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) {
+ if (!path) {
+ return false;
+ }
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null()) {
+ return false;
+ }
+ Transform gt = path->get_global_transform();
+ Transform it = gt.affine_inverse();
+
+ static const int click_dist = 10; //should make global
+
+ Ref<InputEventMouseButton> mb = p_event;
+
+ if (mb.is_valid()) {
+ Point2 mbpos(mb->get_position().x, mb->get_position().y);
+
+ if (!mb->is_pressed()) {
+ set_handle_clicked(false);
+ }
+
+ if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->get_control()))) {
+ //click into curve, break it down
+ Vector<Vector3> v3a = c->tessellate();
+ int idx = 0;
+ int rc = v3a.size();
+ int closest_seg = -1;
+ Vector3 closest_seg_point;
+ float closest_d = 1e20;
+
+ if (rc >= 2) {
+ const Vector3 *r = v3a.ptr();
+
+ if (p_camera->unproject_position(gt.xform(c->get_point_position(0))).distance_to(mbpos) < click_dist) {
+ return false; //nope, existing
+ }
+
+ for (int i = 0; i < c->get_point_count() - 1; i++) {
+ //find the offset and point index of the place to break up
+ int j = idx;
+ if (p_camera->unproject_position(gt.xform(c->get_point_position(i + 1))).distance_to(mbpos) < click_dist) {
+ return false; //nope, existing
+ }
+
+ while (j < rc && c->get_point_position(i + 1) != r[j]) {
+ Vector3 from = r[j];
+ Vector3 to = r[j + 1];
+ real_t cdist = from.distance_to(to);
+ from = gt.xform(from);
+ to = gt.xform(to);
+ if (cdist > 0) {
+ Vector2 s[2];
+ s[0] = p_camera->unproject_position(from);
+ s[1] = p_camera->unproject_position(to);
+ Vector2 inters = Geometry2D::get_closest_point_to_segment(mbpos, s);
+ float d = inters.distance_to(mbpos);
+
+ if (d < 10 && d < closest_d) {
+ closest_d = d;
+ closest_seg = i;
+ Vector3 ray_from = p_camera->project_ray_origin(mbpos);
+ Vector3 ray_dir = p_camera->project_ray_normal(mbpos);
+
+ Vector3 ra, rb;
+ Geometry3D::get_closest_points_between_segments(ray_from, ray_from + ray_dir * 4096, from, to, ra, rb);
+
+ closest_seg_point = it.xform(rb);
+ }
+ }
+ j++;
+ }
+ if (idx == j) {
+ idx++; //force next
+ } else {
+ idx = j; //swap
+ }
+
+ if (j == rc) {
+ break;
+ }
+ }
+ }
+
+ UndoRedo *ur = editor->get_undo_redo();
+ if (closest_seg != -1) {
+ //subdivide
+
+ ur->create_action(TTR("Split Path"));
+ ur->add_do_method(c.ptr(), "add_point", closest_seg_point, Vector3(), Vector3(), closest_seg + 1);
+ ur->add_undo_method(c.ptr(), "remove_point", closest_seg + 1);
+ ur->commit_action();
+ return true;
+
+ } else {
+ Vector3 org;
+ if (c->get_point_count() == 0) {
+ org = path->get_transform().get_origin();
+ } else {
+ org = gt.xform(c->get_point_position(c->get_point_count() - 1));
+ }
+ Plane p(org, p_camera->get_transform().basis.get_axis(2));
+ Vector3 ray_from = p_camera->project_ray_origin(mbpos);
+ Vector3 ray_dir = p_camera->project_ray_normal(mbpos);
+
+ Vector3 inters;
+ if (p.intersects_ray(ray_from, ray_dir, &inters)) {
+ ur->create_action(TTR("Add Point to Curve"));
+ ur->add_do_method(c.ptr(), "add_point", it.xform(inters), Vector3(), Vector3(), -1);
+ ur->add_undo_method(c.ptr(), "remove_point", c->get_point_count());
+ ur->commit_action();
+ return true;
+ }
+
+ //add new at pos
+ }
+
+ } else if (mb->is_pressed() && ((mb->get_button_index() == BUTTON_LEFT && curve_del->is_pressed()) || (mb->get_button_index() == BUTTON_RIGHT && curve_edit->is_pressed()))) {
+ for (int i = 0; i < c->get_point_count(); i++) {
+ real_t dist_to_p = p_camera->unproject_position(gt.xform(c->get_point_position(i))).distance_to(mbpos);
+ real_t dist_to_p_out = p_camera->unproject_position(gt.xform(c->get_point_position(i) + c->get_point_out(i))).distance_to(mbpos);
+ real_t dist_to_p_in = p_camera->unproject_position(gt.xform(c->get_point_position(i) + c->get_point_in(i))).distance_to(mbpos);
+
+ // Find the offset and point index of the place to break up.
+ // Also check for the control points.
+ if (dist_to_p < click_dist) {
+ UndoRedo *ur = editor->get_undo_redo();
+ ur->create_action(TTR("Remove Path Point"));
+ ur->add_do_method(c.ptr(), "remove_point", i);
+ ur->add_undo_method(c.ptr(), "add_point", c->get_point_position(i), c->get_point_in(i), c->get_point_out(i), i);
+ ur->commit_action();
+ return true;
+ } else if (dist_to_p_out < click_dist) {
+ UndoRedo *ur = editor->get_undo_redo();
+ ur->create_action(TTR("Remove Out-Control Point"));
+ ur->add_do_method(c.ptr(), "set_point_out", i, Vector3());
+ ur->add_undo_method(c.ptr(), "set_point_out", i, c->get_point_out(i));
+ ur->commit_action();
+ return true;
+ } else if (dist_to_p_in < click_dist) {
+ UndoRedo *ur = editor->get_undo_redo();
+ ur->create_action(TTR("Remove In-Control Point"));
+ ur->add_do_method(c.ptr(), "set_point_in", i, Vector3());
+ ur->add_undo_method(c.ptr(), "set_point_in", i, c->get_point_in(i));
+ ur->commit_action();
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void Path3DEditorPlugin::edit(Object *p_object) {
+ if (p_object) {
+ path = Object::cast_to<Path3D>(p_object);
+ if (path) {
+ if (path->get_curve().is_valid()) {
+ path->get_curve()->emit_signal("changed");
+ }
+ }
+ } else {
+ Path3D *pre = path;
+ path = nullptr;
+ if (pre) {
+ pre->get_curve()->emit_signal("changed");
+ }
+ }
+ //collision_polygon_editor->edit(Object::cast_to<Node>(p_object));
+}
+
+bool Path3DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("Path3D");
+}
+
+void Path3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ curve_create->show();
+ curve_edit->show();
+ curve_del->show();
+ curve_close->show();
+ handle_menu->show();
+ sep->show();
+ } else {
+ curve_create->hide();
+ curve_edit->hide();
+ curve_del->hide();
+ curve_close->hide();
+ handle_menu->hide();
+ sep->hide();
+
+ {
+ Path3D *pre = path;
+ path = nullptr;
+ if (pre && pre->get_curve().is_valid()) {
+ pre->get_curve()->emit_signal("changed");
+ }
+ }
+ }
+}
+
+void Path3DEditorPlugin::_mode_changed(int p_idx) {
+ curve_create->set_pressed(p_idx == 0);
+ curve_edit->set_pressed(p_idx == 1);
+ curve_del->set_pressed(p_idx == 2);
+}
+
+void Path3DEditorPlugin::_close_curve() {
+ Ref<Curve3D> c = path->get_curve();
+ if (c.is_null()) {
+ return;
+ }
+ if (c->get_point_count() < 2) {
+ return;
+ }
+ c->add_point(c->get_point_position(0), c->get_point_in(0), c->get_point_out(0));
+}
+
+void Path3DEditorPlugin::_handle_option_pressed(int p_option) {
+ PopupMenu *pm;
+ pm = handle_menu->get_popup();
+
+ switch (p_option) {
+ case HANDLE_OPTION_ANGLE: {
+ bool is_checked = pm->is_item_checked(HANDLE_OPTION_ANGLE);
+ mirror_handle_angle = !is_checked;
+ pm->set_item_checked(HANDLE_OPTION_ANGLE, mirror_handle_angle);
+ pm->set_item_disabled(HANDLE_OPTION_LENGTH, !mirror_handle_angle);
+ } break;
+ case HANDLE_OPTION_LENGTH: {
+ bool is_checked = pm->is_item_checked(HANDLE_OPTION_LENGTH);
+ mirror_handle_length = !is_checked;
+ pm->set_item_checked(HANDLE_OPTION_LENGTH, mirror_handle_length);
+ } break;
+ }
+}
+
+void Path3DEditorPlugin::_notification(int p_what) {
+ if (p_what == NOTIFICATION_ENTER_TREE) {
+ curve_create->connect("pressed", callable_mp(this, &Path3DEditorPlugin::_mode_changed), make_binds(0));
+ curve_edit->connect("pressed", callable_mp(this, &Path3DEditorPlugin::_mode_changed), make_binds(1));
+ curve_del->connect("pressed", callable_mp(this, &Path3DEditorPlugin::_mode_changed), make_binds(2));
+ curve_close->connect("pressed", callable_mp(this, &Path3DEditorPlugin::_close_curve));
+ }
+}
+
+void Path3DEditorPlugin::_bind_methods() {
+}
+
+Path3DEditorPlugin *Path3DEditorPlugin::singleton = nullptr;
+
+Path3DEditorPlugin::Path3DEditorPlugin(EditorNode *p_node) {
+ path = nullptr;
+ editor = p_node;
+ singleton = this;
+ mirror_handle_angle = true;
+ mirror_handle_length = true;
+
+ Ref<Path3DGizmoPlugin> gizmo_plugin;
+ gizmo_plugin.instance();
+ Node3DEditor::get_singleton()->add_gizmo_plugin(gizmo_plugin);
+
+ sep = memnew(VSeparator);
+ sep->hide();
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(sep);
+ curve_edit = memnew(Button);
+ curve_edit->set_flat(true);
+ curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveEdit", "EditorIcons"));
+ curve_edit->set_toggle_mode(true);
+ curve_edit->hide();
+ curve_edit->set_focus_mode(Control::FOCUS_NONE);
+ curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point"));
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_edit);
+ curve_create = memnew(Button);
+ curve_create->set_flat(true);
+ curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveCreate", "EditorIcons"));
+ curve_create->set_toggle_mode(true);
+ curve_create->hide();
+ curve_create->set_focus_mode(Control::FOCUS_NONE);
+ curve_create->set_tooltip(TTR("Add Point (in empty space)") + "\n" + TTR("Split Segment (in curve)"));
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_create);
+ curve_del = memnew(Button);
+ curve_del->set_flat(true);
+ curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveDelete", "EditorIcons"));
+ curve_del->set_toggle_mode(true);
+ curve_del->hide();
+ curve_del->set_focus_mode(Control::FOCUS_NONE);
+ curve_del->set_tooltip(TTR("Delete Point"));
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_del);
+ curve_close = memnew(Button);
+ curve_close->set_flat(true);
+ curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveClose", "EditorIcons"));
+ curve_close->hide();
+ curve_close->set_focus_mode(Control::FOCUS_NONE);
+ curve_close->set_tooltip(TTR("Close Curve"));
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_close);
+
+ PopupMenu *menu;
+
+ handle_menu = memnew(MenuButton);
+ handle_menu->set_text(TTR("Options"));
+ handle_menu->hide();
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(handle_menu);
+
+ menu = handle_menu->get_popup();
+ menu->add_check_item(TTR("Mirror Handle Angles"));
+ menu->set_item_checked(HANDLE_OPTION_ANGLE, mirror_handle_angle);
+ menu->add_check_item(TTR("Mirror Handle Lengths"));
+ menu->set_item_checked(HANDLE_OPTION_LENGTH, mirror_handle_length);
+ menu->connect("id_pressed", callable_mp(this, &Path3DEditorPlugin::_handle_option_pressed));
+
+ curve_edit->set_pressed(true);
+ /*
+ collision_polygon_editor = memnew( PathEditor(p_node) );
+ editor->get_viewport()->add_child(collision_polygon_editor);
+ collision_polygon_editor->set_margin(MARGIN_LEFT,200);
+ collision_polygon_editor->set_margin(MARGIN_RIGHT,230);
+ collision_polygon_editor->set_margin(MARGIN_TOP,0);
+ collision_polygon_editor->set_margin(MARGIN_BOTTOM,10);
+ collision_polygon_editor->hide();
+ */
+}
+
+Path3DEditorPlugin::~Path3DEditorPlugin() {
+}
+
+Ref<EditorNode3DGizmo> Path3DGizmoPlugin::create_gizmo(Node3D *p_spatial) {
+ Ref<Path3DGizmo> ref;
+
+ Path3D *path = Object::cast_to<Path3D>(p_spatial);
+ if (path) {
+ ref = Ref<Path3DGizmo>(memnew(Path3DGizmo(path)));
+ }
+
+ return ref;
+}
+
+String Path3DGizmoPlugin::get_name() const {
+ return "Path3D";
+}
+
+int Path3DGizmoPlugin::get_priority() const {
+ return -1;
+}
+
+Path3DGizmoPlugin::Path3DGizmoPlugin() {
+ Color path_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/path", Color(0.5, 0.5, 1.0, 0.8));
+ create_material("path_material", path_color);
+ create_material("path_thin_material", Color(0.5, 0.5, 0.5));
+ create_handle_material("handles");
+}
diff --git a/editor/plugins/path_3d_editor_plugin.h b/editor/plugins/path_3d_editor_plugin.h
new file mode 100644
index 0000000000..be275944a6
--- /dev/null
+++ b/editor/plugins/path_3d_editor_plugin.h
@@ -0,0 +1,118 @@
+/*************************************************************************/
+/* path_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef PATH_EDITOR_PLUGIN_H
+#define PATH_EDITOR_PLUGIN_H
+
+#include "editor/node_3d_editor_gizmos.h"
+#include "scene/3d/path_3d.h"
+
+class Path3DGizmo : public EditorNode3DGizmo {
+ GDCLASS(Path3DGizmo, EditorNode3DGizmo);
+
+ Path3D *path;
+ mutable Vector3 original;
+ mutable float orig_in_length;
+ mutable float orig_out_length;
+
+public:
+ virtual String get_handle_name(int p_idx) const override;
+ virtual Variant get_handle_value(int p_idx) override;
+ virtual void set_handle(int p_idx, Camera3D *p_camera, const Point2 &p_point) override;
+ virtual void commit_handle(int p_idx, const Variant &p_restore, bool p_cancel = false) override;
+
+ virtual void redraw() override;
+ Path3DGizmo(Path3D *p_path = nullptr);
+};
+
+class Path3DGizmoPlugin : public EditorNode3DGizmoPlugin {
+ GDCLASS(Path3DGizmoPlugin, EditorNode3DGizmoPlugin);
+
+protected:
+ Ref<EditorNode3DGizmo> create_gizmo(Node3D *p_spatial) override;
+
+public:
+ String get_name() const override;
+ int get_priority() const override;
+ Path3DGizmoPlugin();
+};
+
+class Path3DEditorPlugin : public EditorPlugin {
+ GDCLASS(Path3DEditorPlugin, EditorPlugin);
+
+ Separator *sep;
+ Button *curve_create;
+ Button *curve_edit;
+ Button *curve_del;
+ Button *curve_close;
+ MenuButton *handle_menu;
+
+ EditorNode *editor;
+
+ Path3D *path;
+
+ void _mode_changed(int p_idx);
+ void _close_curve();
+ void _handle_option_pressed(int p_option);
+ bool handle_clicked;
+ bool mirror_handle_angle;
+ bool mirror_handle_length;
+
+ enum HandleOption {
+ HANDLE_OPTION_ANGLE,
+ HANDLE_OPTION_LENGTH
+ };
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ Path3D *get_edited_path() { return path; }
+
+ static Path3DEditorPlugin *singleton;
+ virtual bool forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) override;
+
+ virtual String get_name() const override { return "Path3D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ bool mirror_angle_enabled() { return mirror_handle_angle; }
+ bool mirror_length_enabled() { return mirror_handle_length; }
+ bool is_handle_clicked() { return handle_clicked; }
+ void set_handle_clicked(bool clicked) { handle_clicked = clicked; }
+
+ Path3DEditorPlugin(EditorNode *p_node);
+ ~Path3DEditorPlugin();
+};
+
+#endif // PATH_EDITOR_PLUGIN_H
diff --git a/editor/plugins/path_editor_plugin.cpp b/editor/plugins/path_editor_plugin.cpp
deleted file mode 100644
index 67889bc074..0000000000
--- a/editor/plugins/path_editor_plugin.cpp
+++ /dev/null
@@ -1,657 +0,0 @@
-/*************************************************************************/
-/* path_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "path_editor_plugin.h"
-
-#include "core/os/keyboard.h"
-#include "scene/resources/curve.h"
-#include "spatial_editor_plugin.h"
-
-String PathSpatialGizmo::get_handle_name(int p_idx) const {
-
- Ref<Curve3D> c = path->get_curve();
- if (c.is_null())
- return "";
-
- if (p_idx < c->get_point_count()) {
-
- return TTR("Curve Point #") + itos(p_idx);
- }
-
- p_idx = p_idx - c->get_point_count() + 1;
-
- int idx = p_idx / 2;
- int t = p_idx % 2;
- String n = TTR("Curve Point #") + itos(idx);
- if (t == 0)
- n += " In";
- else
- n += " Out";
-
- return n;
-}
-Variant PathSpatialGizmo::get_handle_value(int p_idx) {
-
- Ref<Curve3D> c = path->get_curve();
- if (c.is_null())
- return Variant();
-
- if (p_idx < c->get_point_count()) {
-
- original = c->get_point_position(p_idx);
- return original;
- }
-
- p_idx = p_idx - c->get_point_count() + 1;
-
- int idx = p_idx / 2;
- int t = p_idx % 2;
-
- Vector3 ofs;
- if (t == 0)
- ofs = c->get_point_in(idx);
- else
- ofs = c->get_point_out(idx);
-
- original = ofs + c->get_point_position(idx);
-
- return ofs;
-}
-void PathSpatialGizmo::set_handle(int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- Ref<Curve3D> c = path->get_curve();
- if (c.is_null())
- return;
-
- Transform gt = path->get_global_transform();
- Transform gi = gt.affine_inverse();
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- // Setting curve point positions
- if (p_idx < c->get_point_count()) {
-
- Plane p(gt.xform(original), p_camera->get_transform().basis.get_axis(2));
-
- Vector3 inters;
-
- if (p.intersects_ray(ray_from, ray_dir, &inters)) {
-
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- float snap = SpatialEditor::get_singleton()->get_translate_snap();
- inters.snap(Vector3(snap, snap, snap));
- }
-
- Vector3 local = gi.xform(inters);
- c->set_point_position(p_idx, local);
- }
-
- return;
- }
-
- p_idx = p_idx - c->get_point_count() + 1;
-
- int idx = p_idx / 2;
- int t = p_idx % 2;
-
- Vector3 base = c->get_point_position(idx);
-
- Plane p(gt.xform(original), p_camera->get_transform().basis.get_axis(2));
-
- Vector3 inters;
-
- // Setting curve in/out positions
- if (p.intersects_ray(ray_from, ray_dir, &inters)) {
-
- if (!PathEditorPlugin::singleton->is_handle_clicked()) {
- orig_in_length = c->get_point_in(idx).length();
- orig_out_length = c->get_point_out(idx).length();
- PathEditorPlugin::singleton->set_handle_clicked(true);
- }
-
- Vector3 local = gi.xform(inters) - base;
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- float snap = SpatialEditor::get_singleton()->get_translate_snap();
- local.snap(Vector3(snap, snap, snap));
- }
-
- if (t == 0) {
- c->set_point_in(idx, local);
- if (PathEditorPlugin::singleton->mirror_angle_enabled())
- c->set_point_out(idx, PathEditorPlugin::singleton->mirror_length_enabled() ? -local : (-local.normalized() * orig_out_length));
- } else {
- c->set_point_out(idx, local);
- if (PathEditorPlugin::singleton->mirror_angle_enabled())
- c->set_point_in(idx, PathEditorPlugin::singleton->mirror_length_enabled() ? -local : (-local.normalized() * orig_in_length));
- }
- }
-}
-
-void PathSpatialGizmo::commit_handle(int p_idx, const Variant &p_restore, bool p_cancel) {
-
- Ref<Curve3D> c = path->get_curve();
- if (c.is_null())
- return;
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
-
- if (p_idx < c->get_point_count()) {
-
- if (p_cancel) {
-
- c->set_point_position(p_idx, p_restore);
- return;
- }
- ur->create_action(TTR("Set Curve Point Position"));
- ur->add_do_method(c.ptr(), "set_point_position", p_idx, c->get_point_position(p_idx));
- ur->add_undo_method(c.ptr(), "set_point_position", p_idx, p_restore);
- ur->commit_action();
-
- return;
- }
-
- p_idx = p_idx - c->get_point_count() + 1;
-
- int idx = p_idx / 2;
- int t = p_idx % 2;
-
- if (t == 0) {
- if (p_cancel) {
- c->set_point_in(p_idx, p_restore);
- return;
- }
-
- ur->create_action(TTR("Set Curve In Position"));
- ur->add_do_method(c.ptr(), "set_point_in", idx, c->get_point_in(idx));
- ur->add_undo_method(c.ptr(), "set_point_in", idx, p_restore);
-
- if (PathEditorPlugin::singleton->mirror_angle_enabled()) {
- ur->add_do_method(c.ptr(), "set_point_out", idx, PathEditorPlugin::singleton->mirror_length_enabled() ? -c->get_point_in(idx) : (-c->get_point_in(idx).normalized() * orig_out_length));
- ur->add_undo_method(c.ptr(), "set_point_out", idx, PathEditorPlugin::singleton->mirror_length_enabled() ? -static_cast<Vector3>(p_restore) : (-static_cast<Vector3>(p_restore).normalized() * orig_out_length));
- }
- ur->commit_action();
-
- } else {
- if (p_cancel) {
- c->set_point_out(idx, p_restore);
-
- return;
- }
-
- ur->create_action(TTR("Set Curve Out Position"));
- ur->add_do_method(c.ptr(), "set_point_out", idx, c->get_point_out(idx));
- ur->add_undo_method(c.ptr(), "set_point_out", idx, p_restore);
-
- if (PathEditorPlugin::singleton->mirror_angle_enabled()) {
- ur->add_do_method(c.ptr(), "set_point_in", idx, PathEditorPlugin::singleton->mirror_length_enabled() ? -c->get_point_out(idx) : (-c->get_point_out(idx).normalized() * orig_in_length));
- ur->add_undo_method(c.ptr(), "set_point_in", idx, PathEditorPlugin::singleton->mirror_length_enabled() ? -static_cast<Vector3>(p_restore) : (-static_cast<Vector3>(p_restore).normalized() * orig_in_length));
- }
- ur->commit_action();
- }
-}
-
-void PathSpatialGizmo::redraw() {
-
- clear();
-
- Ref<SpatialMaterial> path_material = gizmo_plugin->get_material("path_material", this);
- Ref<SpatialMaterial> path_thin_material = gizmo_plugin->get_material("path_thin_material", this);
- Ref<SpatialMaterial> handles_material = gizmo_plugin->get_material("handles");
-
- Ref<Curve3D> c = path->get_curve();
- if (c.is_null())
- return;
-
- PoolVector<Vector3> v3a = c->tessellate();
- //PoolVector<Vector3> v3a=c->get_baked_points();
-
- int v3s = v3a.size();
- if (v3s == 0)
- return;
- Vector<Vector3> v3p;
- PoolVector<Vector3>::Read r = v3a.read();
-
- // BUG: the following won't work when v3s, avoid drawing as a temporary workaround.
- for (int i = 0; i < v3s - 1; i++) {
-
- v3p.push_back(r[i]);
- v3p.push_back(r[i + 1]);
- //v3p.push_back(r[i]);
- //v3p.push_back(r[i]+Vector3(0,0.2,0));
- }
-
- if (v3p.size() > 1) {
- add_lines(v3p, path_material);
- add_collision_segments(v3p);
- }
-
- if (PathEditorPlugin::singleton->get_edited_path() == path) {
- v3p.clear();
- Vector<Vector3> handles;
- Vector<Vector3> sec_handles;
-
- for (int i = 0; i < c->get_point_count(); i++) {
-
- Vector3 p = c->get_point_position(i);
- handles.push_back(p);
- if (i > 0) {
- v3p.push_back(p);
- v3p.push_back(p + c->get_point_in(i));
- sec_handles.push_back(p + c->get_point_in(i));
- }
-
- if (i < c->get_point_count() - 1) {
- v3p.push_back(p);
- v3p.push_back(p + c->get_point_out(i));
- sec_handles.push_back(p + c->get_point_out(i));
- }
- }
-
- if (v3p.size() > 1) {
- add_lines(v3p, path_thin_material);
- }
- if (handles.size()) {
- add_handles(handles, handles_material);
- }
- if (sec_handles.size()) {
- add_handles(sec_handles, handles_material, false, true);
- }
- }
-}
-
-PathSpatialGizmo::PathSpatialGizmo(Path *p_path) {
-
- path = p_path;
- set_spatial_node(p_path);
-}
-
-bool PathEditorPlugin::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event) {
-
- if (!path)
- return false;
- Ref<Curve3D> c = path->get_curve();
- if (c.is_null())
- return false;
- Transform gt = path->get_global_transform();
- Transform it = gt.affine_inverse();
-
- static const int click_dist = 10; //should make global
-
- Ref<InputEventMouseButton> mb = p_event;
-
- if (mb.is_valid()) {
-
- Point2 mbpos(mb->get_position().x, mb->get_position().y);
-
- if (!mb->is_pressed())
- set_handle_clicked(false);
-
- if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->get_control()))) {
- //click into curve, break it down
- PoolVector<Vector3> v3a = c->tessellate();
- int idx = 0;
- int rc = v3a.size();
- int closest_seg = -1;
- Vector3 closest_seg_point;
- float closest_d = 1e20;
-
- if (rc >= 2) {
- PoolVector<Vector3>::Read r = v3a.read();
-
- if (p_camera->unproject_position(gt.xform(c->get_point_position(0))).distance_to(mbpos) < click_dist)
- return false; //nope, existing
-
- for (int i = 0; i < c->get_point_count() - 1; i++) {
- //find the offset and point index of the place to break up
- int j = idx;
- if (p_camera->unproject_position(gt.xform(c->get_point_position(i + 1))).distance_to(mbpos) < click_dist)
- return false; //nope, existing
-
- while (j < rc && c->get_point_position(i + 1) != r[j]) {
-
- Vector3 from = r[j];
- Vector3 to = r[j + 1];
- real_t cdist = from.distance_to(to);
- from = gt.xform(from);
- to = gt.xform(to);
- if (cdist > 0) {
- Vector2 s[2];
- s[0] = p_camera->unproject_position(from);
- s[1] = p_camera->unproject_position(to);
- Vector2 inters = Geometry::get_closest_point_to_segment_2d(mbpos, s);
- float d = inters.distance_to(mbpos);
-
- if (d < 10 && d < closest_d) {
-
- closest_d = d;
- closest_seg = i;
- Vector3 ray_from = p_camera->project_ray_origin(mbpos);
- Vector3 ray_dir = p_camera->project_ray_normal(mbpos);
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(ray_from, ray_from + ray_dir * 4096, from, to, ra, rb);
-
- closest_seg_point = it.xform(rb);
- }
- }
- j++;
- }
- if (idx == j)
- idx++; //force next
- else
- idx = j; //swap
-
- if (j == rc)
- break;
- }
- }
-
- UndoRedo *ur = editor->get_undo_redo();
- if (closest_seg != -1) {
- //subdivide
-
- ur->create_action(TTR("Split Path"));
- ur->add_do_method(c.ptr(), "add_point", closest_seg_point, Vector3(), Vector3(), closest_seg + 1);
- ur->add_undo_method(c.ptr(), "remove_point", closest_seg + 1);
- ur->commit_action();
- return true;
-
- } else {
-
- Vector3 org;
- if (c->get_point_count() == 0)
- org = path->get_transform().get_origin();
- else
- org = gt.xform(c->get_point_position(c->get_point_count() - 1));
- Plane p(org, p_camera->get_transform().basis.get_axis(2));
- Vector3 ray_from = p_camera->project_ray_origin(mbpos);
- Vector3 ray_dir = p_camera->project_ray_normal(mbpos);
-
- Vector3 inters;
- if (p.intersects_ray(ray_from, ray_dir, &inters)) {
-
- ur->create_action(TTR("Add Point to Curve"));
- ur->add_do_method(c.ptr(), "add_point", it.xform(inters), Vector3(), Vector3(), -1);
- ur->add_undo_method(c.ptr(), "remove_point", c->get_point_count());
- ur->commit_action();
- return true;
- }
-
- //add new at pos
- }
-
- } else if (mb->is_pressed() && ((mb->get_button_index() == BUTTON_LEFT && curve_del->is_pressed()) || (mb->get_button_index() == BUTTON_RIGHT && curve_edit->is_pressed()))) {
-
- for (int i = 0; i < c->get_point_count(); i++) {
- real_t dist_to_p = p_camera->unproject_position(gt.xform(c->get_point_position(i))).distance_to(mbpos);
- real_t dist_to_p_out = p_camera->unproject_position(gt.xform(c->get_point_position(i) + c->get_point_out(i))).distance_to(mbpos);
- real_t dist_to_p_in = p_camera->unproject_position(gt.xform(c->get_point_position(i) + c->get_point_in(i))).distance_to(mbpos);
-
- // Find the offset and point index of the place to break up.
- // Also check for the control points.
- if (dist_to_p < click_dist) {
-
- UndoRedo *ur = editor->get_undo_redo();
- ur->create_action(TTR("Remove Path Point"));
- ur->add_do_method(c.ptr(), "remove_point", i);
- ur->add_undo_method(c.ptr(), "add_point", c->get_point_position(i), c->get_point_in(i), c->get_point_out(i), i);
- ur->commit_action();
- return true;
- } else if (dist_to_p_out < click_dist) {
-
- UndoRedo *ur = editor->get_undo_redo();
- ur->create_action(TTR("Remove Out-Control Point"));
- ur->add_do_method(c.ptr(), "set_point_out", i, Vector3());
- ur->add_undo_method(c.ptr(), "set_point_out", i, c->get_point_out(i));
- ur->commit_action();
- return true;
- } else if (dist_to_p_in < click_dist) {
-
- UndoRedo *ur = editor->get_undo_redo();
- ur->create_action(TTR("Remove In-Control Point"));
- ur->add_do_method(c.ptr(), "set_point_in", i, Vector3());
- ur->add_undo_method(c.ptr(), "set_point_in", i, c->get_point_in(i));
- ur->commit_action();
- return true;
- }
- }
- }
- }
-
- return false;
-}
-
-void PathEditorPlugin::edit(Object *p_object) {
-
- if (p_object) {
- path = Object::cast_to<Path>(p_object);
- if (path) {
-
- if (path->get_curve().is_valid()) {
- path->get_curve()->emit_signal("changed");
- }
- }
- } else {
- Path *pre = path;
- path = NULL;
- if (pre) {
- pre->get_curve()->emit_signal("changed");
- }
- }
- //collision_polygon_editor->edit(Object::cast_to<Node>(p_object));
-}
-
-bool PathEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("Path");
-}
-
-void PathEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
-
- curve_create->show();
- curve_edit->show();
- curve_del->show();
- curve_close->show();
- handle_menu->show();
- sep->show();
- } else {
-
- curve_create->hide();
- curve_edit->hide();
- curve_del->hide();
- curve_close->hide();
- handle_menu->hide();
- sep->hide();
-
- {
- Path *pre = path;
- path = NULL;
- if (pre && pre->get_curve().is_valid()) {
- pre->get_curve()->emit_signal("changed");
- }
- }
- }
-}
-
-void PathEditorPlugin::_mode_changed(int p_idx) {
-
- curve_create->set_pressed(p_idx == 0);
- curve_edit->set_pressed(p_idx == 1);
- curve_del->set_pressed(p_idx == 2);
-}
-
-void PathEditorPlugin::_close_curve() {
-
- Ref<Curve3D> c = path->get_curve();
- if (c.is_null())
- return;
- if (c->get_point_count() < 2)
- return;
- c->add_point(c->get_point_position(0), c->get_point_in(0), c->get_point_out(0));
-}
-
-void PathEditorPlugin::_handle_option_pressed(int p_option) {
-
- PopupMenu *pm;
- pm = handle_menu->get_popup();
-
- switch (p_option) {
- case HANDLE_OPTION_ANGLE: {
- bool is_checked = pm->is_item_checked(HANDLE_OPTION_ANGLE);
- mirror_handle_angle = !is_checked;
- pm->set_item_checked(HANDLE_OPTION_ANGLE, mirror_handle_angle);
- pm->set_item_disabled(HANDLE_OPTION_LENGTH, !mirror_handle_angle);
- } break;
- case HANDLE_OPTION_LENGTH: {
- bool is_checked = pm->is_item_checked(HANDLE_OPTION_LENGTH);
- mirror_handle_length = !is_checked;
- pm->set_item_checked(HANDLE_OPTION_LENGTH, mirror_handle_length);
- } break;
- }
-}
-
-void PathEditorPlugin::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
-
- curve_create->connect("pressed", this, "_mode_changed", make_binds(0));
- curve_edit->connect("pressed", this, "_mode_changed", make_binds(1));
- curve_del->connect("pressed", this, "_mode_changed", make_binds(2));
- curve_close->connect("pressed", this, "_close_curve");
- }
-}
-
-void PathEditorPlugin::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_mode_changed"), &PathEditorPlugin::_mode_changed);
- ClassDB::bind_method(D_METHOD("_close_curve"), &PathEditorPlugin::_close_curve);
- ClassDB::bind_method(D_METHOD("_handle_option_pressed"), &PathEditorPlugin::_handle_option_pressed);
-}
-
-PathEditorPlugin *PathEditorPlugin::singleton = NULL;
-
-PathEditorPlugin::PathEditorPlugin(EditorNode *p_node) {
-
- path = NULL;
- editor = p_node;
- singleton = this;
- mirror_handle_angle = true;
- mirror_handle_length = true;
-
- Ref<PathSpatialGizmoPlugin> gizmo_plugin;
- gizmo_plugin.instance();
- SpatialEditor::get_singleton()->add_gizmo_plugin(gizmo_plugin);
-
- sep = memnew(VSeparator);
- sep->hide();
- SpatialEditor::get_singleton()->add_control_to_menu_panel(sep);
- curve_edit = memnew(ToolButton);
- curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveEdit", "EditorIcons"));
- curve_edit->set_toggle_mode(true);
- curve_edit->hide();
- curve_edit->set_focus_mode(Control::FOCUS_NONE);
- curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point"));
- SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_edit);
- curve_create = memnew(ToolButton);
- curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCreate", "EditorIcons"));
- curve_create->set_toggle_mode(true);
- curve_create->hide();
- curve_create->set_focus_mode(Control::FOCUS_NONE);
- curve_create->set_tooltip(TTR("Add Point (in empty space)") + "\n" + TTR("Split Segment (in curve)"));
- SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_create);
- curve_del = memnew(ToolButton);
- curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveDelete", "EditorIcons"));
- curve_del->set_toggle_mode(true);
- curve_del->hide();
- curve_del->set_focus_mode(Control::FOCUS_NONE);
- curve_del->set_tooltip(TTR("Delete Point"));
- SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_del);
- curve_close = memnew(ToolButton);
- curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveClose", "EditorIcons"));
- curve_close->hide();
- curve_close->set_focus_mode(Control::FOCUS_NONE);
- curve_close->set_tooltip(TTR("Close Curve"));
- SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_close);
-
- PopupMenu *menu;
-
- handle_menu = memnew(MenuButton);
- handle_menu->set_text(TTR("Options"));
- handle_menu->hide();
- SpatialEditor::get_singleton()->add_control_to_menu_panel(handle_menu);
-
- menu = handle_menu->get_popup();
- menu->add_check_item(TTR("Mirror Handle Angles"));
- menu->set_item_checked(HANDLE_OPTION_ANGLE, mirror_handle_angle);
- menu->add_check_item(TTR("Mirror Handle Lengths"));
- menu->set_item_checked(HANDLE_OPTION_LENGTH, mirror_handle_length);
- menu->connect("id_pressed", this, "_handle_option_pressed");
-
- curve_edit->set_pressed(true);
- /*
- collision_polygon_editor = memnew( PathEditor(p_node) );
- editor->get_viewport()->add_child(collision_polygon_editor);
- collision_polygon_editor->set_margin(MARGIN_LEFT,200);
- collision_polygon_editor->set_margin(MARGIN_RIGHT,230);
- collision_polygon_editor->set_margin(MARGIN_TOP,0);
- collision_polygon_editor->set_margin(MARGIN_BOTTOM,10);
- collision_polygon_editor->hide();
- */
-}
-
-PathEditorPlugin::~PathEditorPlugin() {
-}
-
-Ref<EditorSpatialGizmo> PathSpatialGizmoPlugin::create_gizmo(Spatial *p_spatial) {
- Ref<PathSpatialGizmo> ref;
-
- Path *path = Object::cast_to<Path>(p_spatial);
- if (path) ref = Ref<PathSpatialGizmo>(memnew(PathSpatialGizmo(path)));
-
- return ref;
-}
-
-String PathSpatialGizmoPlugin::get_name() const {
- return "Path";
-}
-
-int PathSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-PathSpatialGizmoPlugin::PathSpatialGizmoPlugin() {
-
- Color path_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/path", Color(0.5, 0.5, 1.0, 0.8));
- create_material("path_material", path_color);
- create_material("path_thin_material", Color(0.5, 0.5, 0.5));
- create_handle_material("handles");
-}
diff --git a/editor/plugins/path_editor_plugin.h b/editor/plugins/path_editor_plugin.h
deleted file mode 100644
index 8ff83911f8..0000000000
--- a/editor/plugins/path_editor_plugin.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*************************************************************************/
-/* path_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef PATH_EDITOR_PLUGIN_H
-#define PATH_EDITOR_PLUGIN_H
-
-#include "editor/spatial_editor_gizmos.h"
-#include "scene/3d/path.h"
-
-class PathSpatialGizmo : public EditorSpatialGizmo {
-
- GDCLASS(PathSpatialGizmo, EditorSpatialGizmo);
-
- Path *path;
- mutable Vector3 original;
- mutable float orig_in_length;
- mutable float orig_out_length;
-
-public:
- virtual String get_handle_name(int p_idx) const;
- virtual Variant get_handle_value(int p_idx);
- virtual void set_handle(int p_idx, Camera *p_camera, const Point2 &p_point);
- virtual void commit_handle(int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- virtual void redraw();
- PathSpatialGizmo(Path *p_path = NULL);
-};
-
-class PathSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(PathSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-protected:
- Ref<EditorSpatialGizmo> create_gizmo(Spatial *p_spatial);
-
-public:
- String get_name() const;
- int get_priority() const;
- PathSpatialGizmoPlugin();
-};
-
-class PathEditorPlugin : public EditorPlugin {
-
- GDCLASS(PathEditorPlugin, EditorPlugin);
-
- Separator *sep;
- ToolButton *curve_create;
- ToolButton *curve_edit;
- ToolButton *curve_del;
- ToolButton *curve_close;
- MenuButton *handle_menu;
-
- EditorNode *editor;
-
- Path *path;
-
- void _mode_changed(int p_idx);
- void _close_curve();
- void _handle_option_pressed(int p_option);
- bool handle_clicked;
- bool mirror_handle_angle;
- bool mirror_handle_length;
-
- enum HandleOption {
- HANDLE_OPTION_ANGLE,
- HANDLE_OPTION_LENGTH
- };
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- Path *get_edited_path() { return path; }
-
- static PathEditorPlugin *singleton;
- virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event);
-
- //virtual bool forward_gui_input(const InputEvent& p_event) { return collision_polygon_editor->forward_gui_input(p_event); }
- //virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial *p_spatial);
- virtual String get_name() const { return "Path"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- bool mirror_angle_enabled() { return mirror_handle_angle; }
- bool mirror_length_enabled() { return mirror_handle_length; }
- bool is_handle_clicked() { return handle_clicked; }
- void set_handle_clicked(bool clicked) { handle_clicked = clicked; }
-
- PathEditorPlugin(EditorNode *p_node);
- ~PathEditorPlugin();
-};
-
-#endif // PATH_EDITOR_PLUGIN_H
diff --git a/editor/plugins/physical_bone_3d_editor_plugin.cpp b/editor/plugins/physical_bone_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..30bf827b3c
--- /dev/null
+++ b/editor/plugins/physical_bone_3d_editor_plugin.cpp
@@ -0,0 +1,105 @@
+/*************************************************************************/
+/* physical_bone_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "physical_bone_3d_editor_plugin.h"
+
+#include "editor/plugins/node_3d_editor_plugin.h"
+#include "scene/3d/physics_body_3d.h"
+
+void PhysicalBone3DEditor::_bind_methods() {
+}
+
+void PhysicalBone3DEditor::_on_toggle_button_transform_joint(bool p_is_pressed) {
+ _set_move_joint();
+}
+
+void PhysicalBone3DEditor::_set_move_joint() {
+ if (selected) {
+ selected->_set_gizmo_move_joint(button_transform_joint->is_pressed());
+ }
+}
+
+PhysicalBone3DEditor::PhysicalBone3DEditor(EditorNode *p_editor) :
+ editor(p_editor) {
+ spatial_editor_hb = memnew(HBoxContainer);
+ spatial_editor_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ spatial_editor_hb->set_alignment(BoxContainer::ALIGN_BEGIN);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(spatial_editor_hb);
+
+ spatial_editor_hb->add_child(memnew(VSeparator));
+
+ button_transform_joint = memnew(Button);
+ button_transform_joint->set_flat(true);
+ spatial_editor_hb->add_child(button_transform_joint);
+
+ button_transform_joint->set_text(TTR("Move Joint"));
+ button_transform_joint->set_icon(Node3DEditor::get_singleton()->get_theme_icon("PhysicalBone3D", "EditorIcons"));
+ button_transform_joint->set_toggle_mode(true);
+ button_transform_joint->connect("toggled", callable_mp(this, &PhysicalBone3DEditor::_on_toggle_button_transform_joint));
+
+ hide();
+}
+
+void PhysicalBone3DEditor::set_selected(PhysicalBone3D *p_pb) {
+ button_transform_joint->set_pressed(false);
+
+ _set_move_joint();
+ selected = p_pb;
+ _set_move_joint();
+}
+
+void PhysicalBone3DEditor::hide() {
+ spatial_editor_hb->hide();
+}
+
+void PhysicalBone3DEditor::show() {
+ spatial_editor_hb->show();
+}
+
+PhysicalBone3DEditorPlugin::PhysicalBone3DEditorPlugin(EditorNode *p_editor) :
+ editor(p_editor),
+ physical_bone_editor(editor) {}
+
+void PhysicalBone3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ physical_bone_editor.show();
+ } else {
+ physical_bone_editor.hide();
+ physical_bone_editor.set_selected(nullptr);
+ selected = nullptr;
+ }
+}
+
+void PhysicalBone3DEditorPlugin::edit(Object *p_node) {
+ selected = static_cast<PhysicalBone3D *>(p_node); // Trust it
+ ERR_FAIL_COND(!selected);
+
+ physical_bone_editor.set_selected(selected);
+}
diff --git a/editor/plugins/physical_bone_3d_editor_plugin.h b/editor/plugins/physical_bone_3d_editor_plugin.h
new file mode 100644
index 0000000000..bdfcca8878
--- /dev/null
+++ b/editor/plugins/physical_bone_3d_editor_plugin.h
@@ -0,0 +1,78 @@
+/*************************************************************************/
+/* physical_bone_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef PHYSICAL_BONE_PLUGIN_H
+#define PHYSICAL_BONE_PLUGIN_H
+
+#include "editor/editor_node.h"
+
+class PhysicalBone3DEditor : public Object {
+ GDCLASS(PhysicalBone3DEditor, Object);
+
+ EditorNode *editor;
+ HBoxContainer *spatial_editor_hb;
+ Button *button_transform_joint;
+
+ PhysicalBone3D *selected = nullptr;
+
+protected:
+ static void _bind_methods();
+
+private:
+ void _on_toggle_button_transform_joint(bool p_is_pressed);
+ void _set_move_joint();
+
+public:
+ PhysicalBone3DEditor(EditorNode *p_editor);
+ ~PhysicalBone3DEditor() {}
+
+ void set_selected(PhysicalBone3D *p_pb);
+
+ void hide();
+ void show();
+};
+
+class PhysicalBone3DEditorPlugin : public EditorPlugin {
+ GDCLASS(PhysicalBone3DEditorPlugin, EditorPlugin);
+
+ EditorNode *editor;
+ PhysicalBone3D *selected = nullptr;
+ PhysicalBone3DEditor physical_bone_editor;
+
+public:
+ virtual String get_name() const override { return "PhysicalBone3D"; }
+ virtual bool handles(Object *p_object) const override { return p_object->is_class("PhysicalBone3D"); }
+ virtual void make_visible(bool p_visible) override;
+ virtual void edit(Object *p_node) override;
+
+ PhysicalBone3DEditorPlugin(EditorNode *p_editor);
+};
+
+#endif
diff --git a/editor/plugins/physical_bone_plugin.cpp b/editor/plugins/physical_bone_plugin.cpp
deleted file mode 100644
index 28099a927b..0000000000
--- a/editor/plugins/physical_bone_plugin.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*************************************************************************/
-/* physical_bone_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "physical_bone_plugin.h"
-#include "editor/plugins/spatial_editor_plugin.h"
-#include "scene/3d/physics_body.h"
-
-void PhysicalBoneEditor::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_on_toggle_button_transform_joint", "is_pressed"), &PhysicalBoneEditor::_on_toggle_button_transform_joint);
-}
-
-void PhysicalBoneEditor::_on_toggle_button_transform_joint(bool p_is_pressed) {
-
- _set_move_joint();
-}
-
-void PhysicalBoneEditor::_set_move_joint() {
- if (selected) {
- selected->_set_gizmo_move_joint(button_transform_joint->is_pressed());
- }
-}
-
-PhysicalBoneEditor::PhysicalBoneEditor(EditorNode *p_editor) :
- editor(p_editor),
- selected(NULL) {
-
- spatial_editor_hb = memnew(HBoxContainer);
- spatial_editor_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- spatial_editor_hb->set_alignment(BoxContainer::ALIGN_BEGIN);
- SpatialEditor::get_singleton()->add_control_to_menu_panel(spatial_editor_hb);
-
- spatial_editor_hb->add_child(memnew(VSeparator));
-
- button_transform_joint = memnew(ToolButton);
- spatial_editor_hb->add_child(button_transform_joint);
-
- button_transform_joint->set_text(TTR("Move Joint"));
- button_transform_joint->set_icon(SpatialEditor::get_singleton()->get_icon("PhysicalBone", "EditorIcons"));
- button_transform_joint->set_toggle_mode(true);
- button_transform_joint->connect("toggled", this, "_on_toggle_button_transform_joint");
-
- hide();
-}
-
-PhysicalBoneEditor::~PhysicalBoneEditor() {}
-
-void PhysicalBoneEditor::set_selected(PhysicalBone *p_pb) {
-
- button_transform_joint->set_pressed(false);
-
- _set_move_joint();
- selected = p_pb;
- _set_move_joint();
-}
-
-void PhysicalBoneEditor::hide() {
- spatial_editor_hb->hide();
-}
-
-void PhysicalBoneEditor::show() {
- spatial_editor_hb->show();
-}
-
-PhysicalBonePlugin::PhysicalBonePlugin(EditorNode *p_editor) :
- editor(p_editor),
- selected(NULL),
- physical_bone_editor(editor) {}
-
-void PhysicalBonePlugin::make_visible(bool p_visible) {
- if (p_visible) {
-
- physical_bone_editor.show();
- } else {
-
- physical_bone_editor.hide();
- physical_bone_editor.set_selected(NULL);
- selected = NULL;
- }
-}
-
-void PhysicalBonePlugin::edit(Object *p_node) {
- selected = static_cast<PhysicalBone *>(p_node); // Trust it
- ERR_FAIL_COND(!selected);
-
- physical_bone_editor.set_selected(selected);
-}
diff --git a/editor/plugins/physical_bone_plugin.h b/editor/plugins/physical_bone_plugin.h
deleted file mode 100644
index 459a67db05..0000000000
--- a/editor/plugins/physical_bone_plugin.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*************************************************************************/
-/* physical_bone_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef PHYSICAL_BONE_PLUGIN_H
-#define PHYSICAL_BONE_PLUGIN_H
-
-#include "editor/editor_node.h"
-
-class PhysicalBoneEditor : public Object {
- GDCLASS(PhysicalBoneEditor, Object);
-
- EditorNode *editor;
- HBoxContainer *spatial_editor_hb;
- ToolButton *button_transform_joint;
-
- PhysicalBone *selected;
-
-protected:
- static void _bind_methods();
-
-private:
- void _on_toggle_button_transform_joint(bool p_is_pressed);
- void _set_move_joint();
-
-public:
- PhysicalBoneEditor(EditorNode *p_editor);
- ~PhysicalBoneEditor();
-
- void set_selected(PhysicalBone *p_pb);
-
- void hide();
- void show();
-};
-
-class PhysicalBonePlugin : public EditorPlugin {
- GDCLASS(PhysicalBonePlugin, EditorPlugin);
-
- EditorNode *editor;
- PhysicalBone *selected;
- PhysicalBoneEditor physical_bone_editor;
-
-public:
- virtual String get_name() const { return "PhysicalBone"; }
- virtual bool handles(Object *p_object) const { return p_object->is_class("PhysicalBone"); }
- virtual void make_visible(bool p_visible);
- virtual void edit(Object *p_node);
-
- PhysicalBonePlugin(EditorNode *p_editor);
-};
-
-#endif
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index 35c0142d4b..dd1194d020 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -31,31 +31,28 @@
#include "polygon_2d_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
+#include "core/input/input.h"
+#include "core/math/geometry_2d.h"
#include "core/os/file_access.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "scene/2d/skeleton_2d.h"
Node2D *Polygon2DEditor::_get_node() const {
-
return node;
}
void Polygon2DEditor::_set_node(Node *p_polygon) {
-
node = Object::cast_to<Polygon2D>(p_polygon);
_update_polygon_editing_state();
}
Vector2 Polygon2DEditor::_get_offset(int p_idx) const {
-
return node->get_offset();
}
int Polygon2DEditor::_get_polygon_count() const {
-
if (node->get_internal_vertex_count() > 0) {
return 0; //do not edit if internal vertices exist
} else {
@@ -64,40 +61,35 @@ int Polygon2DEditor::_get_polygon_count() const {
}
void Polygon2DEditor::_notification(int p_what) {
-
switch (p_what) {
-
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
-
- uv_edit_draw->add_style_override("panel", get_stylebox("bg", "Tree"));
- bone_scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ uv_edit_draw->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ bone_scroll->add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
} break;
case NOTIFICATION_READY: {
-
- button_uv->set_icon(get_icon("Uv", "EditorIcons"));
-
- uv_button[UV_MODE_CREATE]->set_icon(get_icon("Edit", "EditorIcons"));
- uv_button[UV_MODE_CREATE_INTERNAL]->set_icon(get_icon("EditInternal", "EditorIcons"));
- uv_button[UV_MODE_REMOVE_INTERNAL]->set_icon(get_icon("RemoveInternal", "EditorIcons"));
- uv_button[UV_MODE_EDIT_POINT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
- uv_button[UV_MODE_MOVE]->set_icon(get_icon("ToolMove", "EditorIcons"));
- uv_button[UV_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons"));
- uv_button[UV_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons"));
- uv_button[UV_MODE_ADD_POLYGON]->set_icon(get_icon("Edit", "EditorIcons"));
- uv_button[UV_MODE_REMOVE_POLYGON]->set_icon(get_icon("Close", "EditorIcons"));
- uv_button[UV_MODE_PAINT_WEIGHT]->set_icon(get_icon("PaintVertex", "EditorIcons"));
- uv_button[UV_MODE_CLEAR_WEIGHT]->set_icon(get_icon("UnpaintVertex", "EditorIcons"));
-
- b_snap_grid->set_icon(get_icon("Grid", "EditorIcons"));
- b_snap_enable->set_icon(get_icon("SnapGrid", "EditorIcons"));
- uv_icon_zoom->set_texture(get_icon("Zoom", "EditorIcons"));
+ button_uv->set_icon(get_theme_icon("Uv", "EditorIcons"));
+
+ uv_button[UV_MODE_CREATE]->set_icon(get_theme_icon("Edit", "EditorIcons"));
+ uv_button[UV_MODE_CREATE_INTERNAL]->set_icon(get_theme_icon("EditInternal", "EditorIcons"));
+ uv_button[UV_MODE_REMOVE_INTERNAL]->set_icon(get_theme_icon("RemoveInternal", "EditorIcons"));
+ uv_button[UV_MODE_EDIT_POINT]->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ uv_button[UV_MODE_MOVE]->set_icon(get_theme_icon("ToolMove", "EditorIcons"));
+ uv_button[UV_MODE_ROTATE]->set_icon(get_theme_icon("ToolRotate", "EditorIcons"));
+ uv_button[UV_MODE_SCALE]->set_icon(get_theme_icon("ToolScale", "EditorIcons"));
+ uv_button[UV_MODE_ADD_POLYGON]->set_icon(get_theme_icon("Edit", "EditorIcons"));
+ uv_button[UV_MODE_REMOVE_POLYGON]->set_icon(get_theme_icon("Close", "EditorIcons"));
+ uv_button[UV_MODE_PAINT_WEIGHT]->set_icon(get_theme_icon("PaintVertex", "EditorIcons"));
+ uv_button[UV_MODE_CLEAR_WEIGHT]->set_icon(get_theme_icon("UnpaintVertex", "EditorIcons"));
+
+ b_snap_grid->set_icon(get_theme_icon("Grid", "EditorIcons"));
+ b_snap_enable->set_icon(get_theme_icon("SnapGrid", "EditorIcons"));
+ uv_icon_zoom->set_texture(get_theme_icon("Zoom", "EditorIcons"));
uv_vscroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
uv_hscroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
-
if (!is_visible()) {
uv_edit->hide();
}
@@ -106,11 +98,10 @@ void Polygon2DEditor::_notification(int p_what) {
}
void Polygon2DEditor::_sync_bones() {
-
- Skeleton2D *skeleton = NULL;
+ Skeleton2D *skeleton = nullptr;
if (!node->has_node(node->get_skeleton())) {
error->set_text(TTR("The skeleton property of the Polygon2D does not point to a Skeleton2D node"));
- error->popup_centered_minsize();
+ error->popup_centered();
} else {
Node *sn = node->get_node(node->get_skeleton());
skeleton = Object::cast_to<Skeleton2D>(sn);
@@ -121,16 +112,16 @@ void Polygon2DEditor::_sync_bones() {
if (!skeleton) {
error->set_text(TTR("The skeleton property of the Polygon2D does not point to a Skeleton2D node"));
- error->popup_centered_minsize();
+ error->popup_centered();
} else {
for (int i = 0; i < skeleton->get_bone_count(); i++) {
NodePath path = skeleton->get_path_to(skeleton->get_bone(i));
- PoolVector<float> weights;
+ Vector<float> weights;
int wc = node->get_polygon().size();
for (int j = 0; j < prev_bones.size(); j += 2) {
NodePath pvp = prev_bones[j];
- PoolVector<float> pv = prev_bones[j + 1];
+ Vector<float> pv = prev_bones[j + 1];
if (pvp == path && pv.size() == wc) {
weights = pv;
}
@@ -138,7 +129,7 @@ void Polygon2DEditor::_sync_bones() {
if (weights.size() == 0) { //create them
weights.resize(node->get_polygon().size());
- PoolVector<float>::Write w = weights.write();
+ float *w = weights.ptrw();
for (int j = 0; j < wc; j++) {
w[j] = 0.0;
}
@@ -161,7 +152,6 @@ void Polygon2DEditor::_sync_bones() {
}
void Polygon2DEditor::_update_bone_list() {
-
NodePath selected;
while (bone_scroll_vb->get_child_count()) {
CheckBox *cb = Object::cast_to<CheckBox>(bone_scroll_vb->get_child(0));
@@ -189,10 +179,11 @@ void Polygon2DEditor::_update_bone_list() {
cb->set_focus_mode(FOCUS_NONE);
bone_scroll_vb->add_child(cb);
- if (np == selected || bone_scroll_vb->get_child_count() < 2)
+ if (np == selected || bone_scroll_vb->get_child_count() < 2) {
cb->set_pressed(true);
+ }
- cb->connect("pressed", this, "_bone_paint_selected", varray(i));
+ cb->connect("pressed", callable_mp(this, &Polygon2DEditor::_bone_paint_selected), varray(i));
}
uv_edit_draw->update();
@@ -203,7 +194,6 @@ void Polygon2DEditor::_bone_paint_selected(int p_index) {
}
void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
-
if (p_mode == 0) { //uv
uv_button[UV_MODE_CREATE]->hide();
@@ -274,27 +264,22 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
}
void Polygon2DEditor::_uv_edit_popup_hide() {
-
- EditorSettings::get_singleton()->set("interface/dialogs/uv_editor_bounds", uv_edit->get_rect());
+ EditorSettings::get_singleton()->set("interface/dialogs/uv_editor_bounds", Rect2(uv_edit->get_position(), uv_edit->get_size()));
_cancel_editing();
}
void Polygon2DEditor::_menu_option(int p_option) {
-
switch (p_option) {
-
case MODE_EDIT_UV: {
-
if (node->get_texture().is_null()) {
-
error->set_text(TTR("No texture in this polygon.\nSet a texture to be able to edit UV."));
- error->popup_centered_minsize();
+ error->popup_centered();
return;
}
- PoolVector<Vector2> points = node->get_polygon();
- PoolVector<Vector2> uvs = node->get_uv();
+ Vector<Vector2> points = node->get_polygon();
+ Vector<Vector2> uvs = node->get_uv();
if (uvs.size() != points.size()) {
undo_redo->create_action(TTR("Create UV Map"));
undo_redo->add_do_method(node, "set_uv", points);
@@ -304,18 +289,19 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->commit_action();
}
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/uv_editor_bounds"))
+ if (EditorSettings::get_singleton()->has_setting("interface/dialogs/uv_editor_bounds")) {
uv_edit->popup(EditorSettings::get_singleton()->get("interface/dialogs/uv_editor_bounds"));
- else
+ } else {
uv_edit->popup_centered_ratio(0.85);
+ }
_update_bone_list();
} break;
case UVEDIT_POLYGON_TO_UV: {
-
- PoolVector<Vector2> points = node->get_polygon();
- if (points.size() == 0)
+ Vector<Vector2> points = node->get_polygon();
+ if (points.size() == 0) {
break;
- PoolVector<Vector2> uvs = node->get_uv();
+ }
+ Vector<Vector2> uvs = node->get_uv();
undo_redo->create_action(TTR("Create UV Map"));
undo_redo->add_do_method(node, "set_uv", points);
undo_redo->add_undo_method(node, "set_uv", uvs);
@@ -324,11 +310,11 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->commit_action();
} break;
case UVEDIT_UV_TO_POLYGON: {
-
- PoolVector<Vector2> points = node->get_polygon();
- PoolVector<Vector2> uvs = node->get_uv();
- if (uvs.size() == 0)
+ Vector<Vector2> points = node->get_polygon();
+ Vector<Vector2> uvs = node->get_uv();
+ if (uvs.size() == 0) {
break;
+ }
undo_redo->create_action(TTR("Create Polygon"));
undo_redo->add_do_method(node, "set_polygon", uvs);
@@ -338,30 +324,27 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->commit_action();
} break;
case UVEDIT_UV_CLEAR: {
-
- PoolVector<Vector2> uvs = node->get_uv();
- if (uvs.size() == 0)
+ Vector<Vector2> uvs = node->get_uv();
+ if (uvs.size() == 0) {
break;
+ }
undo_redo->create_action(TTR("Create UV Map"));
- undo_redo->add_do_method(node, "set_uv", PoolVector<Vector2>());
+ undo_redo->add_do_method(node, "set_uv", Vector<Vector2>());
undo_redo->add_undo_method(node, "set_uv", uvs);
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
} break;
case UVEDIT_GRID_SETTINGS: {
-
- grid_settings->popup_centered_minsize();
+ grid_settings->popup_centered();
} break;
default: {
-
AbstractPolygon2DEditor::_menu_option(p_option);
} break;
}
}
void Polygon2DEditor::_cancel_editing() {
-
if (uv_create) {
uv_drag = false;
uv_create = false;
@@ -386,18 +369,18 @@ void Polygon2DEditor::_cancel_editing() {
}
void Polygon2DEditor::_update_polygon_editing_state() {
-
- if (!_get_node())
+ if (!_get_node()) {
return;
+ }
- if (node->get_internal_vertex_count() > 0)
+ if (node->get_internal_vertex_count() > 0) {
disable_polygon_editing(true, TTR("Polygon 2D has internal vertices, so it can no longer be edited in the viewport."));
- else
+ } else {
disable_polygon_editing(false, String());
+ }
}
void Polygon2DEditor::_commit_action() {
-
// Makes that undo/redoing actions made outside of the UV editor still affect its polygon.
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
@@ -442,7 +425,6 @@ void Polygon2DEditor::_set_snap_step_y(float p_val) {
}
void Polygon2DEditor::_uv_mode(int p_mode) {
-
polygon_create.clear();
uv_drag = false;
uv_create = false;
@@ -454,9 +436,9 @@ void Polygon2DEditor::_uv_mode(int p_mode) {
}
void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
-
- if (!_get_node())
+ if (!_get_node()) {
return;
+ }
Transform2D mtx;
mtx.elements[2] = -uv_draw_ofs;
@@ -465,11 +447,8 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouseButton> mb = p_input;
if (mb.is_valid()) {
-
if (mb->get_button_index() == BUTTON_LEFT) {
-
if (mb->is_pressed()) {
-
uv_drag_from = snap_point(Vector2(mb->get_position().x, mb->get_position().y));
uv_drag = true;
points_prev = node->get_uv();
@@ -482,9 +461,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
uv_move_current = uv_mode;
if (uv_move_current == UV_MODE_CREATE) {
-
if (!uv_create) {
-
points_prev.resize(0);
Vector2 tuv = mtx.affine_inverse().xform(snap_point(Vector2(mb->get_position().x, mb->get_position().y)));
points_prev.push_back(tuv);
@@ -506,10 +483,10 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
uv_edit_draw->update();
} else {
-
Vector2 tuv = mtx.affine_inverse().xform(snap_point(Vector2(mb->get_position().x, mb->get_position().y)));
- if (points_prev.size() > 2 && tuv.distance_to(points_prev[0]) < 8) {
+ // Close the polygon if selected point is near start. Threshold for closing scaled by zoom level
+ if (points_prev.size() > 2 && tuv.distance_to(points_prev[0]) < (8 / uv_draw_zoom)) {
undo_redo->create_action(TTR("Create Polygon & UV"));
undo_redo->add_do_method(node, "set_uv", node->get_uv());
undo_redo->add_undo_method(node, "set_uv", uv_create_uv_prev);
@@ -544,7 +521,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
if (uv_move_current == UV_MODE_CREATE_INTERNAL) {
-
uv_create_uv_prev = node->get_uv();
uv_create_poly_prev = node->get_polygon();
uv_create_colors_prev = node->get_vertex_colors();
@@ -567,7 +543,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
undo_redo->add_do_method(node, "set_vertex_colors", uv_create_colors_prev);
undo_redo->add_undo_method(node, "set_vertex_colors", node->get_vertex_colors());
for (int i = 0; i < node->get_bone_count(); i++) {
- PoolVector<float> bonew = node->get_bone_weights(i);
+ Vector<float> bonew = node->get_bone_weights(i);
bonew.push_back(0);
undo_redo->add_do_method(node, "set_bone_weights", i, bonew);
undo_redo->add_undo_method(node, "set_bone_weights", i, node->get_bone_weights(i));
@@ -582,21 +558,20 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
if (uv_move_current == UV_MODE_REMOVE_INTERNAL) {
-
uv_create_uv_prev = node->get_uv();
uv_create_poly_prev = node->get_polygon();
uv_create_colors_prev = node->get_vertex_colors();
uv_create_bones_prev = node->call("_get_bones");
int internal_vertices = node->get_internal_vertex_count();
- if (internal_vertices <= 0)
+ if (internal_vertices <= 0) {
return;
+ }
int closest = -1;
float closest_dist = 1e20;
for (int i = points_prev.size() - internal_vertices; i < points_prev.size(); i++) {
-
Vector2 tuv = mtx.xform(uv_create_poly_prev[i]);
float dist = tuv.distance_to(Vector2(mb->get_position().x, mb->get_position().y));
if (dist < 8 && dist < closest_dist) {
@@ -605,8 +580,9 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
}
- if (closest == -1)
+ if (closest == -1) {
return;
+ }
uv_create_poly_prev.remove(closest);
uv_create_uv_prev.remove(closest);
@@ -622,7 +598,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
undo_redo->add_do_method(node, "set_vertex_colors", uv_create_colors_prev);
undo_redo->add_undo_method(node, "set_vertex_colors", node->get_vertex_colors());
for (int i = 0; i < node->get_bone_count(); i++) {
- PoolVector<float> bonew = node->get_bone_weights(i);
+ Vector<float> bonew = node->get_bone_weights(i);
bonew.remove(closest);
undo_redo->add_do_method(node, "set_bone_weights", i, bonew);
undo_redo->add_undo_method(node, "set_bone_weights", i, node->get_bone_weights(i));
@@ -637,20 +613,18 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
if (uv_move_current == UV_MODE_EDIT_POINT) {
-
- if (mb->get_shift() && mb->get_command())
+ if (mb->get_shift() && mb->get_command()) {
uv_move_current = UV_MODE_SCALE;
- else if (mb->get_shift())
+ } else if (mb->get_shift()) {
uv_move_current = UV_MODE_MOVE;
- else if (mb->get_command())
+ } else if (mb->get_command()) {
uv_move_current = UV_MODE_ROTATE;
+ }
}
if (uv_move_current == UV_MODE_EDIT_POINT) {
-
point_drag_index = -1;
for (int i = 0; i < points_prev.size(); i++) {
-
Vector2 tuv = mtx.xform(points_prev[i]);
if (tuv.distance_to(Vector2(mb->get_position().x, mb->get_position().y)) < 8) {
uv_drag_from = tuv;
@@ -664,12 +638,10 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
if (uv_move_current == UV_MODE_ADD_POLYGON) {
-
int closest = -1;
float closest_dist = 1e20;
for (int i = 0; i < points_prev.size(); i++) {
-
Vector2 tuv = mtx.xform(points_prev[i]);
float dist = tuv.distance_to(Vector2(mb->get_position().x, mb->get_position().y));
if (dist < 8 && dist < closest_dist) {
@@ -683,7 +655,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
//close
if (polygon_create.size() < 3) {
error->set_text(TTR("Invalid Polygon (need 3 different vertices)"));
- error->popup_centered_minsize();
+ error->popup_centered();
} else {
Array polygons = node->get_polygons();
polygons = polygons.duplicate(); //copy because its a reference
@@ -712,17 +684,18 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
int erase_index = -1;
for (int i = polygons.size() - 1; i >= 0; i--) {
- PoolVector<int> points = polygons[i];
+ Vector<int> points = polygons[i];
Vector<Vector2> polys;
polys.resize(points.size());
for (int j = 0; j < polys.size(); j++) {
int idx = points[j];
- if (idx < 0 || idx >= points_prev.size())
+ if (idx < 0 || idx >= points_prev.size()) {
continue;
+ }
polys.write[j] = mtx.xform(points_prev[idx]);
}
- if (Geometry::is_point_in_polygon(Vector2(mb->get_position().x, mb->get_position().y), polys)) {
+ if (Geometry2D::is_point_in_polygon(Vector2(mb->get_position().x, mb->get_position().y), polys)) {
erase_index = i;
break;
}
@@ -740,7 +713,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
if (uv_move_current == UV_MODE_PAINT_WEIGHT || uv_move_current == UV_MODE_CLEAR_WEIGHT) {
-
int bone_selected = -1;
for (int i = 0; i < bone_scroll_vb->get_child_count(); i++) {
CheckBox *c = Object::cast_to<CheckBox>(bone_scroll_vb->get_child(i));
@@ -751,57 +723,54 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
if (bone_selected != -1 && node->get_bone_weights(bone_selected).size() == points_prev.size()) {
-
prev_weights = node->get_bone_weights(bone_selected);
bone_painting = true;
bone_painting_bone = bone_selected;
}
}
+ } else {
+ if (uv_drag && !uv_create) {
+ if (uv_edit_mode[0]->is_pressed()) { // Edit UV.
+ undo_redo->create_action(TTR("Transform UV Map"));
+ undo_redo->add_do_method(node, "set_uv", node->get_uv());
+ undo_redo->add_undo_method(node, "set_uv", points_prev);
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
+ } else if (uv_edit_mode[1]->is_pressed() && uv_move_current == UV_MODE_EDIT_POINT) { // Edit polygon.
+ undo_redo->create_action(TTR("Transform Polygon"));
+ undo_redo->add_do_method(node, "set_polygon", node->get_polygon());
+ undo_redo->add_undo_method(node, "set_polygon", points_prev);
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
+ }
- } else if (uv_drag && !uv_create) {
+ uv_drag = false;
+ }
- if (uv_edit_mode[0]->is_pressed()) { // Edit UV.
- undo_redo->create_action(TTR("Transform UV Map"));
- undo_redo->add_do_method(node, "set_uv", node->get_uv());
- undo_redo->add_undo_method(node, "set_uv", points_prev);
- undo_redo->add_do_method(uv_edit_draw, "update");
- undo_redo->add_undo_method(uv_edit_draw, "update");
- undo_redo->commit_action();
- } else if (uv_edit_mode[1]->is_pressed() && uv_move_current == UV_MODE_EDIT_POINT) { // Edit polygon.
- undo_redo->create_action(TTR("Transform Polygon"));
- undo_redo->add_do_method(node, "set_polygon", node->get_polygon());
- undo_redo->add_undo_method(node, "set_polygon", points_prev);
+ if (bone_painting) {
+ undo_redo->create_action(TTR("Paint Bone Weights"));
+ undo_redo->add_do_method(node, "set_bone_weights", bone_painting_bone, node->get_bone_weights(bone_painting_bone));
+ undo_redo->add_undo_method(node, "set_bone_weights", bone_painting_bone, prev_weights);
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
+ bone_painting = false;
}
-
- uv_drag = false;
- } else if (bone_painting) {
-
- undo_redo->create_action(TTR("Paint Bone Weights"));
- undo_redo->add_do_method(node, "set_bone_weights", bone_painting_bone, node->get_bone_weights(bone_painting_bone));
- undo_redo->add_undo_method(node, "set_bone_weights", bone_painting_bone, prev_weights);
- undo_redo->add_do_method(uv_edit_draw, "update");
- undo_redo->add_undo_method(uv_edit_draw, "update");
- undo_redo->commit_action();
- bone_painting = false;
}
-
} else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
-
_cancel_editing();
- if (bone_painting)
+ if (bone_painting) {
node->set_bone_weights(bone_painting_bone, prev_weights);
+ }
uv_edit_draw->update();
} else if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) {
-
uv_zoom->set_value(uv_zoom->get_value() / (1 - (0.1 * mb->get_factor())));
} else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed()) {
-
uv_zoom->set_value(uv_zoom->get_value() * (1 - (0.1 * mb->get_factor())));
}
}
@@ -809,30 +778,24 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouseMotion> mm = p_input;
if (mm.is_valid()) {
-
if ((mm->get_button_mask() & BUTTON_MASK_MIDDLE) || Input::get_singleton()->is_key_pressed(KEY_SPACE)) {
-
Vector2 drag(mm->get_relative().x, mm->get_relative().y);
uv_hscroll->set_value(uv_hscroll->get_value() - drag.x);
uv_vscroll->set_value(uv_vscroll->get_value() - drag.y);
} else if (uv_drag) {
-
Vector2 uv_drag_to = mm->get_position();
uv_drag_to = snap_point(uv_drag_to); // FIXME: Only works correctly with 'UV_MODE_EDIT_POINT', it's imprecise with the rest.
Vector2 drag = mtx.affine_inverse().xform(uv_drag_to) - mtx.affine_inverse().xform(uv_drag_from);
switch (uv_move_current) {
-
case UV_MODE_CREATE: {
-
if (uv_create) {
uv_create_to = mtx.affine_inverse().xform(snap_point(Vector2(mm->get_position().x, mm->get_position().y)));
}
} break;
case UV_MODE_EDIT_POINT: {
-
- PoolVector<Vector2> uv_new = points_prev;
+ Vector<Vector2> uv_new = points_prev;
uv_new.set(point_drag_index, uv_new[point_drag_index] + drag);
if (uv_edit_mode[0]->is_pressed()) { //edit uv
@@ -842,10 +805,10 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
} break;
case UV_MODE_MOVE: {
-
- PoolVector<Vector2> uv_new = points_prev;
- for (int i = 0; i < uv_new.size(); i++)
+ Vector<Vector2> uv_new = points_prev;
+ for (int i = 0; i < uv_new.size(); i++) {
uv_new.set(i, uv_new[i] + drag);
+ }
if (uv_edit_mode[0]->is_pressed()) { //edit uv
node->set_uv(uv_new);
@@ -854,12 +817,12 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
} break;
case UV_MODE_ROTATE: {
-
Vector2 center;
- PoolVector<Vector2> uv_new = points_prev;
+ Vector<Vector2> uv_new = points_prev;
- for (int i = 0; i < uv_new.size(); i++)
+ for (int i = 0; i < uv_new.size(); i++) {
center += points_prev[i];
+ }
center /= uv_new.size();
float angle = (uv_drag_from - mtx.xform(center)).normalized().angle_to((uv_drag_to - mtx.xform(center)).normalized());
@@ -877,18 +840,19 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
} break;
case UV_MODE_SCALE: {
-
Vector2 center;
- PoolVector<Vector2> uv_new = points_prev;
+ Vector<Vector2> uv_new = points_prev;
- for (int i = 0; i < uv_new.size(); i++)
+ for (int i = 0; i < uv_new.size(); i++) {
center += points_prev[i];
+ }
center /= uv_new.size();
float from_dist = uv_drag_from.distance_to(mtx.xform(center));
float to_dist = uv_drag_to.distance_to(mtx.xform(center));
- if (from_dist < 2)
+ if (from_dist < 2) {
break;
+ }
float scale = to_dist / from_dist;
@@ -906,7 +870,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} break;
case UV_MODE_PAINT_WEIGHT:
case UV_MODE_CLEAR_WEIGHT: {
-
bone_paint_pos = Vector2(mm->get_position().x, mm->get_position().y);
} break;
default: {
@@ -914,7 +877,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
if (bone_painting) {
- PoolVector<float> painted_weights = node->get_bone_weights(bone_painting_bone);
+ Vector<float> painted_weights = node->get_bone_weights(bone_painting_bone);
{
int pc = painted_weights.size();
@@ -925,9 +888,9 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
amount = -amount;
}
- PoolVector<float>::Write w = painted_weights.write();
- PoolVector<float>::Read r = prev_weights.read();
- PoolVector<Vector2>::Read rv = points_prev.read();
+ float *w = painted_weights.ptrw();
+ const float *r = prev_weights.ptr();
+ const Vector2 *rv = points_prev.ptr();
for (int i = 0; i < pc; i++) {
if (mtx.xform(rv[i]).distance_to(bone_paint_pos) < radius) {
@@ -952,22 +915,20 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMagnifyGesture> magnify_gesture = p_input;
if (magnify_gesture.is_valid()) {
-
uv_zoom->set_value(uv_zoom->get_value() * magnify_gesture->get_factor());
}
Ref<InputEventPanGesture> pan_gesture = p_input;
if (pan_gesture.is_valid()) {
-
uv_hscroll->set_value(uv_hscroll->get_value() + uv_hscroll->get_page() * pan_gesture->get_delta().x / 8);
uv_vscroll->set_value(uv_vscroll->get_value() + uv_vscroll->get_page() * pan_gesture->get_delta().y / 8);
}
}
void Polygon2DEditor::_uv_scroll_changed(float) {
-
- if (updating_uv_scroll)
+ if (updating_uv_scroll) {
return;
+ }
uv_draw_ofs.x = uv_hscroll->get_value();
uv_draw_ofs.y = uv_vscroll->get_value();
@@ -976,13 +937,14 @@ void Polygon2DEditor::_uv_scroll_changed(float) {
}
void Polygon2DEditor::_uv_draw() {
-
- if (!uv_edit->is_visible() || !_get_node())
+ if (!uv_edit->is_visible() || !_get_node()) {
return;
+ }
- Ref<Texture> base_tex = node->get_texture();
- if (base_tex.is_null())
+ Ref<Texture2D> base_tex = node->get_texture();
+ if (base_tex.is_null()) {
return;
+ }
String warning;
@@ -990,9 +952,9 @@ void Polygon2DEditor::_uv_draw() {
mtx.elements[2] = -uv_draw_ofs;
mtx.scale_basis(Vector2(uv_draw_zoom, uv_draw_zoom));
- VS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), mtx);
+ RS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), mtx);
uv_edit_draw->draw_texture(base_tex, Point2());
- VS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), Transform2D());
+ RS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), Transform2D());
if (snap_show_grid) {
Color grid_color = Color(1.0, 1.0, 1.0, 0.15);
@@ -1002,10 +964,12 @@ void Polygon2DEditor::_uv_draw() {
if (snap_step.x != 0) {
for (int i = 0; i < s.width; i++) {
int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(i, 0)).x - snap_offset.x) / snap_step.x));
- if (i == 0)
+ if (i == 0) {
last_cell = cell;
- if (last_cell != cell)
+ }
+ if (last_cell != cell) {
uv_edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), grid_color, Math::round(EDSCALE));
+ }
last_cell = cell;
}
}
@@ -1013,10 +977,12 @@ void Polygon2DEditor::_uv_draw() {
if (snap_step.y != 0) {
for (int i = 0; i < s.height; i++) {
int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(0, i)).y - snap_offset.y) / snap_step.y));
- if (i == 0)
+ if (i == 0) {
last_cell = cell;
- if (last_cell != cell)
+ }
+ if (last_cell != cell) {
uv_edit_draw->draw_line(Point2(0, i), Point2(s.width, i), grid_color, Math::round(EDSCALE));
+ }
last_cell = cell;
}
}
@@ -1024,14 +990,14 @@ void Polygon2DEditor::_uv_draw() {
Array polygons = node->get_polygons();
- PoolVector<Vector2> uvs;
+ Vector<Vector2> uvs;
if (uv_edit_mode[0]->is_pressed()) { //edit uv
uvs = node->get_uv();
} else { //edit polygon
uvs = node->get_polygon();
}
- PoolVector<float>::Read weight_r;
+ const float *weight_r = nullptr;
if (uv_edit_mode[3]->is_pressed()) {
int bone_selected = -1;
@@ -1044,13 +1010,12 @@ void Polygon2DEditor::_uv_draw() {
}
if (bone_selected != -1 && node->get_bone_weights(bone_selected).size() == uvs.size()) {
-
- weight_r = node->get_bone_weights(bone_selected).read();
+ weight_r = node->get_bone_weights(bone_selected).ptr();
}
}
// All UV points are sharp, so use the sharp handle icon
- Ref<Texture> handle = get_icon("EditorPathSharpHandle", "EditorIcons");
+ Ref<Texture2D> handle = get_theme_icon("EditorPathSharpHandle", "EditorIcons");
Color poly_line_color = Color(0.9, 0.5, 0.5);
if (polygons.size() || polygon_create.size()) {
@@ -1074,11 +1039,10 @@ void Polygon2DEditor::_uv_draw() {
}
for (int i = 0; i < uvs.size(); i++) {
-
int next = uv_draw_max > 0 ? (i + 1) % uv_draw_max : 0;
if (i < uv_draw_max && uv_drag && uv_move_current == UV_MODE_EDIT_POINT && EDITOR_DEF("editors/poly_editor/show_previous_outline", true)) {
- uv_edit_draw->draw_line(mtx.xform(points_prev[i]), mtx.xform(points_prev[next]), prev_color, Math::round(EDSCALE), true);
+ uv_edit_draw->draw_line(mtx.xform(points_prev[i]), mtx.xform(points_prev[next]), prev_color, Math::round(EDSCALE));
}
Vector2 next_point = uvs[next];
@@ -1086,28 +1050,29 @@ void Polygon2DEditor::_uv_draw() {
next_point = uv_create_to;
}
if (i < uv_draw_max /*&& polygons.size() == 0 && polygon_create.size() == 0*/) { //if using or creating polygons, do not show outline (will show polygons instead)
- uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), poly_line_color, Math::round(EDSCALE), true);
+ uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), poly_line_color, Math::round(EDSCALE));
}
rect.expand_to(mtx.basis_xform(uvs[i]));
}
for (int i = 0; i < polygons.size(); i++) {
-
- PoolVector<int> points = polygons[i];
+ Vector<int> points = polygons[i];
Vector<Vector2> polypoints;
for (int j = 0; j < points.size(); j++) {
int next = (j + 1) % points.size();
int idx = points[j];
int idx_next = points[next];
- if (idx < 0 || idx >= uvs.size())
+ if (idx < 0 || idx >= uvs.size()) {
continue;
+ }
polypoints.push_back(mtx.xform(uvs[idx]));
- if (idx_next < 0 || idx_next >= uvs.size())
+ if (idx_next < 0 || idx_next >= uvs.size()) {
continue;
- uv_edit_draw->draw_line(mtx.xform(uvs[idx]), mtx.xform(uvs[idx_next]), polygon_line_color, Math::round(EDSCALE), true);
+ }
+ uv_edit_draw->draw_line(mtx.xform(uvs[idx]), mtx.xform(uvs[idx_next]), polygon_line_color, Math::round(EDSCALE));
}
if (points.size() >= 3) {
uv_edit_draw->draw_polygon(polypoints, polygon_fill_color);
@@ -1115,8 +1080,7 @@ void Polygon2DEditor::_uv_draw() {
}
for (int i = 0; i < uvs.size(); i++) {
-
- if (weight_r.ptr()) {
+ if (weight_r) {
Vector2 draw_pos = mtx.xform(uvs[i]);
float weight = weight_r[i];
uv_edit_draw->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0), Math::round(EDSCALE));
@@ -1134,12 +1098,11 @@ void Polygon2DEditor::_uv_draw() {
for (int i = 0; i < polygon_create.size(); i++) {
Vector2 from = uvs[polygon_create[i]];
Vector2 to = (i + 1) < polygon_create.size() ? uvs[polygon_create[i + 1]] : uv_create_to;
- uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), polygon_line_color, Math::round(EDSCALE), true);
+ uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), polygon_line_color, Math::round(EDSCALE));
}
}
if (uv_mode == UV_MODE_PAINT_WEIGHT || uv_mode == UV_MODE_CLEAR_WEIGHT) {
-
NodePath bone_path;
for (int i = 0; i < bone_scroll_vb->get_child_count(); i++) {
CheckBox *c = Object::cast_to<CheckBox>(bone_scroll_vb->get_child(i));
@@ -1155,20 +1118,20 @@ void Polygon2DEditor::_uv_draw() {
Skeleton2D *skeleton = Object::cast_to<Skeleton2D>(node->get_node(skeleton_path));
if (skeleton) {
for (int i = 0; i < skeleton->get_bone_count(); i++) {
-
Bone2D *bone = skeleton->get_bone(i);
- if (bone->get_rest() == Transform2D(0, 0, 0, 0, 0, 0))
+ if (bone->get_rest() == Transform2D(0, 0, 0, 0, 0, 0)) {
continue; //not set
+ }
bool current = bone_path == skeleton->get_path_to(bone);
bool found_child = false;
for (int j = 0; j < bone->get_child_count(); j++) {
-
Bone2D *n = Object::cast_to<Bone2D>(bone->get_child(j));
- if (!n)
+ if (!n) {
continue;
+ }
found_child = true;
@@ -1233,23 +1196,8 @@ void Polygon2DEditor::_uv_draw() {
}
void Polygon2DEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_uv_mode"), &Polygon2DEditor::_uv_mode);
- ClassDB::bind_method(D_METHOD("_uv_draw"), &Polygon2DEditor::_uv_draw);
- ClassDB::bind_method(D_METHOD("_uv_input"), &Polygon2DEditor::_uv_input);
- ClassDB::bind_method(D_METHOD("_uv_scroll_changed"), &Polygon2DEditor::_uv_scroll_changed);
- ClassDB::bind_method(D_METHOD("_set_use_snap"), &Polygon2DEditor::_set_use_snap);
- ClassDB::bind_method(D_METHOD("_set_show_grid"), &Polygon2DEditor::_set_show_grid);
- ClassDB::bind_method(D_METHOD("_set_snap_off_x"), &Polygon2DEditor::_set_snap_off_x);
- ClassDB::bind_method(D_METHOD("_set_snap_off_y"), &Polygon2DEditor::_set_snap_off_y);
- ClassDB::bind_method(D_METHOD("_set_snap_step_x"), &Polygon2DEditor::_set_snap_step_x);
- ClassDB::bind_method(D_METHOD("_set_snap_step_y"), &Polygon2DEditor::_set_snap_step_y);
- ClassDB::bind_method(D_METHOD("_uv_edit_mode_select"), &Polygon2DEditor::_uv_edit_mode_select);
- ClassDB::bind_method(D_METHOD("_uv_edit_popup_hide"), &Polygon2DEditor::_uv_edit_popup_hide);
- ClassDB::bind_method(D_METHOD("_sync_bones"), &Polygon2DEditor::_sync_bones);
ClassDB::bind_method(D_METHOD("_update_bone_list"), &Polygon2DEditor::_update_bone_list);
ClassDB::bind_method(D_METHOD("_update_polygon_editing_state"), &Polygon2DEditor::_update_polygon_editing_state);
- ClassDB::bind_method(D_METHOD("_bone_paint_selected"), &Polygon2DEditor::_bone_paint_selected);
}
Vector2 Polygon2DEditor::snap_point(Vector2 p_target) const {
@@ -1263,24 +1211,23 @@ Vector2 Polygon2DEditor::snap_point(Vector2 p_target) const {
Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
-
- node = NULL;
+ node = nullptr;
snap_offset = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_offset", Vector2());
snap_step = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_step", Vector2(10, 10));
use_snap = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_enabled", false);
snap_show_grid = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "show_grid", false);
- button_uv = memnew(ToolButton);
+ button_uv = memnew(Button);
+ button_uv->set_flat(true);
add_child(button_uv);
button_uv->set_tooltip(TTR("Open Polygon 2D UV editor."));
- button_uv->connect("pressed", this, "_menu_option", varray(MODE_EDIT_UV));
+ button_uv->connect("pressed", callable_mp(this, &Polygon2DEditor::_menu_option), varray(MODE_EDIT_UV));
uv_mode = UV_MODE_EDIT_POINT;
uv_edit = memnew(AcceptDialog);
add_child(uv_edit);
uv_edit->set_title(TTR("Polygon 2D UV Editor"));
- uv_edit->set_resizable(true);
- uv_edit->connect("popup_hide", this, "_uv_edit_popup_hide");
+ uv_edit->connect("cancelled", callable_mp(this, &Polygon2DEditor::_uv_edit_popup_hide));
VBoxContainer *uv_main_vb = memnew(VBoxContainer);
uv_edit->add_child(uv_main_vb);
@@ -1288,16 +1235,16 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_edit_group.instance();
- uv_edit_mode[0] = memnew(ToolButton);
+ uv_edit_mode[0] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[0]);
uv_edit_mode[0]->set_toggle_mode(true);
- uv_edit_mode[1] = memnew(ToolButton);
+ uv_edit_mode[1] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[1]);
uv_edit_mode[1]->set_toggle_mode(true);
- uv_edit_mode[2] = memnew(ToolButton);
+ uv_edit_mode[2] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[2]);
uv_edit_mode[2]->set_toggle_mode(true);
- uv_edit_mode[3] = memnew(ToolButton);
+ uv_edit_mode[3] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[3]);
uv_edit_mode[3]->set_toggle_mode(true);
@@ -1312,20 +1259,19 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_edit_mode[2]->set_button_group(uv_edit_group);
uv_edit_mode[3]->set_button_group(uv_edit_group);
- uv_edit_mode[0]->connect("pressed", this, "_uv_edit_mode_select", varray(0));
- uv_edit_mode[1]->connect("pressed", this, "_uv_edit_mode_select", varray(1));
- uv_edit_mode[2]->connect("pressed", this, "_uv_edit_mode_select", varray(2));
- uv_edit_mode[3]->connect("pressed", this, "_uv_edit_mode_select", varray(3));
+ uv_edit_mode[0]->connect("pressed", callable_mp(this, &Polygon2DEditor::_uv_edit_mode_select), varray(0));
+ uv_edit_mode[1]->connect("pressed", callable_mp(this, &Polygon2DEditor::_uv_edit_mode_select), varray(1));
+ uv_edit_mode[2]->connect("pressed", callable_mp(this, &Polygon2DEditor::_uv_edit_mode_select), varray(2));
+ uv_edit_mode[3]->connect("pressed", callable_mp(this, &Polygon2DEditor::_uv_edit_mode_select), varray(3));
uv_mode_hb->add_child(memnew(VSeparator));
uv_main_vb->add_child(uv_mode_hb);
for (int i = 0; i < UV_MODE_MAX; i++) {
-
- uv_button[i] = memnew(ToolButton);
+ uv_button[i] = memnew(Button);
uv_button[i]->set_toggle_mode(true);
uv_mode_hb->add_child(uv_button[i]);
- uv_button[i]->connect("pressed", this, "_uv_mode", varray(i));
+ uv_button[i]->connect("pressed", callable_mp(this, &Polygon2DEditor::_uv_mode), varray(i));
uv_button[i]->set_focus_mode(FOCUS_NONE);
}
@@ -1388,27 +1334,29 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_menu->get_popup()->add_item(TTR("Clear UV"), UVEDIT_UV_CLEAR);
uv_menu->get_popup()->add_separator();
uv_menu->get_popup()->add_item(TTR("Grid Settings"), UVEDIT_GRID_SETTINGS);
- uv_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ uv_menu->get_popup()->connect("id_pressed", callable_mp(this, &Polygon2DEditor::_menu_option));
uv_mode_hb->add_child(memnew(VSeparator));
- b_snap_enable = memnew(ToolButton);
+ b_snap_enable = memnew(Button);
+ b_snap_enable->set_flat(true);
uv_mode_hb->add_child(b_snap_enable);
b_snap_enable->set_text(TTR("Snap"));
b_snap_enable->set_focus_mode(FOCUS_NONE);
b_snap_enable->set_toggle_mode(true);
b_snap_enable->set_pressed(use_snap);
b_snap_enable->set_tooltip(TTR("Enable Snap"));
- b_snap_enable->connect("toggled", this, "_set_use_snap");
+ b_snap_enable->connect("toggled", callable_mp(this, &Polygon2DEditor::_set_use_snap));
- b_snap_grid = memnew(ToolButton);
+ b_snap_grid = memnew(Button);
+ b_snap_grid->set_flat(true);
uv_mode_hb->add_child(b_snap_grid);
b_snap_grid->set_text(TTR("Grid"));
b_snap_grid->set_focus_mode(FOCUS_NONE);
b_snap_grid->set_toggle_mode(true);
b_snap_grid->set_pressed(snap_show_grid);
b_snap_grid->set_tooltip(TTR("Show Grid"));
- b_snap_grid->connect("toggled", this, "_set_show_grid");
+ b_snap_grid->connect("toggled", callable_mp(this, &Polygon2DEditor::_set_show_grid));
grid_settings = memnew(AcceptDialog);
grid_settings->set_title(TTR("Configure Grid:"));
@@ -1422,7 +1370,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
sb_off_x->set_step(1);
sb_off_x->set_value(snap_offset.x);
sb_off_x->set_suffix("px");
- sb_off_x->connect("value_changed", this, "_set_snap_off_x");
+ sb_off_x->connect("value_changed", callable_mp(this, &Polygon2DEditor::_set_snap_off_x));
grid_settings_vb->add_margin_child(TTR("Grid Offset X:"), sb_off_x);
SpinBox *sb_off_y = memnew(SpinBox);
@@ -1431,7 +1379,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
sb_off_y->set_step(1);
sb_off_y->set_value(snap_offset.y);
sb_off_y->set_suffix("px");
- sb_off_y->connect("value_changed", this, "_set_snap_off_y");
+ sb_off_y->connect("value_changed", callable_mp(this, &Polygon2DEditor::_set_snap_off_y));
grid_settings_vb->add_margin_child(TTR("Grid Offset Y:"), sb_off_y);
SpinBox *sb_step_x = memnew(SpinBox);
@@ -1440,7 +1388,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
sb_step_x->set_step(1);
sb_step_x->set_value(snap_step.x);
sb_step_x->set_suffix("px");
- sb_step_x->connect("value_changed", this, "_set_snap_step_x");
+ sb_step_x->connect("value_changed", callable_mp(this, &Polygon2DEditor::_set_snap_step_x));
grid_settings_vb->add_margin_child(TTR("Grid Step X:"), sb_step_x);
SpinBox *sb_step_y = memnew(SpinBox);
@@ -1449,7 +1397,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
sb_step_y->set_step(1);
sb_step_y->set_value(snap_step.y);
sb_step_y->set_suffix("px");
- sb_step_y->connect("value_changed", this, "_set_snap_step_y");
+ sb_step_y->connect("value_changed", callable_mp(this, &Polygon2DEditor::_set_snap_step_y));
grid_settings_vb->add_margin_child(TTR("Grid Step Y:"), sb_step_y);
uv_mode_hb->add_child(memnew(VSeparator));
@@ -1469,16 +1417,16 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_zoom->share(uv_zoom_value);
uv_zoom_value->set_custom_minimum_size(Size2(50, 0));
uv_mode_hb->add_child(uv_zoom_value);
- uv_zoom->connect("value_changed", this, "_uv_scroll_changed");
+ uv_zoom->connect("value_changed", callable_mp(this, &Polygon2DEditor::_uv_scroll_changed));
uv_vscroll = memnew(VScrollBar);
uv_vscroll->set_step(0.001);
uv_edit_draw->add_child(uv_vscroll);
- uv_vscroll->connect("value_changed", this, "_uv_scroll_changed");
+ uv_vscroll->connect("value_changed", callable_mp(this, &Polygon2DEditor::_uv_scroll_changed));
uv_hscroll = memnew(HScrollBar);
uv_hscroll->set_step(0.001);
uv_edit_draw->add_child(uv_hscroll);
- uv_hscroll->connect("value_changed", this, "_uv_scroll_changed");
+ uv_hscroll->connect("value_changed", callable_mp(this, &Polygon2DEditor::_uv_scroll_changed));
bone_scroll_main_vb = memnew(VBoxContainer);
bone_scroll_main_vb->hide();
@@ -1486,7 +1434,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
sync_bones = memnew(Button(TTR("Sync Bones to Polygon")));
bone_scroll_main_vb->add_child(sync_bones);
sync_bones->set_h_size_flags(0);
- sync_bones->connect("pressed", this, "_sync_bones");
+ sync_bones->connect("pressed", callable_mp(this, &Polygon2DEditor::_sync_bones));
uv_main_hsc->add_child(bone_scroll_main_vb);
bone_scroll = memnew(ScrollContainer);
bone_scroll->set_v_scroll(true);
@@ -1496,8 +1444,8 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
bone_scroll_vb = memnew(VBoxContainer);
bone_scroll->add_child(bone_scroll_vb);
- uv_edit_draw->connect("draw", this, "_uv_draw");
- uv_edit_draw->connect("gui_input", this, "_uv_input");
+ uv_edit_draw->connect("draw", callable_mp(this, &Polygon2DEditor::_uv_draw));
+ uv_edit_draw->connect("gui_input", callable_mp(this, &Polygon2DEditor::_uv_input));
uv_draw_zoom = 1.0;
point_drag_index = -1;
uv_drag = false;
diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h
index 1454a03325..77580a5604 100644
--- a/editor/plugins/polygon_2d_editor_plugin.h
+++ b/editor/plugins/polygon_2d_editor_plugin.h
@@ -35,7 +35,6 @@
#include "scene/gui/scroll_container.h"
class Polygon2DEditor : public AbstractPolygon2DEditor {
-
GDCLASS(Polygon2DEditor, AbstractPolygon2DEditor);
enum Mode {
@@ -61,16 +60,16 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
UV_MODE_MAX
};
- ToolButton *uv_edit_mode[4];
+ Button *uv_edit_mode[4];
Ref<ButtonGroup> uv_edit_group;
Polygon2D *node;
UVMode uv_mode;
AcceptDialog *uv_edit;
- ToolButton *uv_button[UV_MODE_MAX];
- ToolButton *b_snap_enable;
- ToolButton *b_snap_grid;
+ Button *uv_button[UV_MODE_MAX];
+ Button *b_snap_enable;
+ Button *b_snap_grid;
Panel *uv_edit_draw;
HSlider *uv_zoom;
SpinBox *uv_zoom_value;
@@ -88,7 +87,7 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
Label *bone_paint_radius_label;
bool bone_painting;
int bone_painting_bone;
- PoolVector<float> prev_weights;
+ Vector<float> prev_weights;
Vector2 bone_paint_pos;
AcceptDialog *grid_settings;
@@ -97,10 +96,10 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
Vector2 uv_draw_ofs;
float uv_draw_zoom;
- PoolVector<Vector2> points_prev;
- PoolVector<Vector2> uv_create_uv_prev;
- PoolVector<Vector2> uv_create_poly_prev;
- PoolVector<Color> uv_create_colors_prev;
+ Vector<Vector2> points_prev;
+ Vector<Vector2> uv_create_uv_prev;
+ Vector<Vector2> uv_create_poly_prev;
+ Vector<Color> uv_create_colors_prev;
int uv_create_prev_internal_vertices;
Array uv_create_bones_prev;
Array polygons_prev;
@@ -116,14 +115,14 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
AcceptDialog *error;
- ToolButton *button_uv;
+ Button *button_uv;
bool use_snap;
bool snap_show_grid;
Vector2 snap_offset;
Vector2 snap_step;
- virtual void _menu_option(int p_option);
+ virtual void _menu_option(int p_option) override;
void _cancel_editing();
void _update_polygon_editing_state();
@@ -144,16 +143,16 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
void _uv_edit_popup_hide();
void _bone_paint_selected(int p_index);
- int _get_polygon_count() const;
+ int _get_polygon_count() const override;
protected:
- virtual Node2D *_get_node() const;
- virtual void _set_node(Node *p_polygon);
+ virtual Node2D *_get_node() const override;
+ virtual void _set_node(Node *p_polygon) override;
- virtual Vector2 _get_offset(int p_idx) const;
+ virtual Vector2 _get_offset(int p_idx) const override;
- virtual bool _has_uv() const { return true; };
- virtual void _commit_action();
+ virtual bool _has_uv() const override { return true; };
+ virtual void _commit_action() override;
void _notification(int p_what);
static void _bind_methods();
@@ -165,7 +164,6 @@ public:
};
class Polygon2DEditorPlugin : public AbstractPolygon2DEditorPlugin {
-
GDCLASS(Polygon2DEditorPlugin, AbstractPolygon2DEditorPlugin);
public:
diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp
index fb04f50827..9ab5bfd8a3 100644
--- a/editor/plugins/resource_preloader_editor_plugin.cpp
+++ b/editor/plugins/resource_preloader_editor_plugin.cpp
@@ -39,13 +39,11 @@ void ResourcePreloaderEditor::_gui_input(Ref<InputEvent> p_event) {
}
void ResourcePreloaderEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
- load->set_icon(get_icon("Folder", "EditorIcons"));
+ load->set_icon(get_theme_icon("Folder", "EditorIcons"));
}
if (p_what == NOTIFICATION_READY) {
-
//NodePath("/root")->connect("node_removed", this,"_node_removed",Vector<Variant>(),true);
}
@@ -54,9 +52,7 @@ void ResourcePreloaderEditor::_notification(int p_what) {
}
void ResourcePreloaderEditor::_files_load_request(const Vector<String> &p_paths) {
-
for (int i = 0; i < p_paths.size(); i++) {
-
String path = p_paths[i];
RES resource;
@@ -67,7 +63,7 @@ void ResourcePreloaderEditor::_files_load_request(const Vector<String> &p_paths)
dialog->set_title(TTR("Error!"));
//dialog->get_cancel()->set_text("Close");
dialog->get_ok()->set_text(TTR("Close"));
- dialog->popup_centered_minsize();
+ dialog->popup_centered();
return; ///beh should show an error i guess
}
@@ -89,24 +85,23 @@ void ResourcePreloaderEditor::_files_load_request(const Vector<String> &p_paths)
}
void ResourcePreloaderEditor::_load_pressed() {
-
loading_scene = false;
file->clear_filters();
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("", &extensions);
- for (int i = 0; i < extensions.size(); i++)
+ for (int i = 0; i < extensions.size(); i++) {
file->add_filter("*." + extensions[i]);
+ }
- file->set_mode(EditorFileDialog::MODE_OPEN_FILES);
-
- file->popup_centered_ratio();
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILES);
+ file->popup_file_dialog();
}
void ResourcePreloaderEditor::_item_edited() {
-
- if (!tree->get_selected())
+ if (!tree->get_selected()) {
return;
+ }
TreeItem *s = tree->get_selected();
@@ -114,11 +109,11 @@ void ResourcePreloaderEditor::_item_edited() {
// renamed
String old_name = s->get_metadata(0);
String new_name = s->get_text(0);
- if (old_name == new_name)
+ if (old_name == new_name) {
return;
+ }
if (new_name == "" || new_name.find("\\") != -1 || new_name.find("/") != -1 || preloader->has_resource(new_name)) {
-
s->set_text(0, old_name);
return;
}
@@ -136,7 +131,6 @@ void ResourcePreloaderEditor::_item_edited() {
}
void ResourcePreloaderEditor::_remove_resource(const String &p_to_remove) {
-
undo_redo->create_action(TTR("Delete Resource"));
undo_redo->add_do_method(preloader, "remove_resource", p_to_remove);
undo_redo->add_undo_method(preloader, "add_resource", p_to_remove, preloader->get_resource(p_to_remove));
@@ -146,21 +140,22 @@ void ResourcePreloaderEditor::_remove_resource(const String &p_to_remove) {
}
void ResourcePreloaderEditor::_paste_pressed() {
-
RES r = EditorSettings::get_singleton()->get_resource_clipboard();
if (!r.is_valid()) {
dialog->set_text(TTR("Resource clipboard is empty!"));
dialog->set_title(TTR("Error!"));
dialog->get_ok()->set_text(TTR("Close"));
- dialog->popup_centered_minsize();
+ dialog->popup_centered();
return; ///beh should show an error i guess
}
String name = r->get_name();
- if (name == "")
+ if (name == "") {
name = r->get_path().get_file();
- if (name == "")
+ }
+ if (name == "") {
name = r->get_class();
+ }
String basename = name;
int counter = 1;
@@ -178,10 +173,9 @@ void ResourcePreloaderEditor::_paste_pressed() {
}
void ResourcePreloaderEditor::_update_library() {
-
tree->clear();
tree->set_hide_root(true);
- TreeItem *root = tree->create_item(NULL);
+ TreeItem *root = tree->create_item(nullptr);
List<StringName> rnames;
preloader->get_resource_list(&rnames);
@@ -194,7 +188,6 @@ void ResourcePreloaderEditor::_update_library() {
names.sort();
for (List<String>::Element *E = names.front(); E; E = E->next()) {
-
TreeItem *ti = tree->create_item(root);
ti->set_cell_mode(0, TreeItem::CELL_MODE_STRING);
ti->set_editable(0, true);
@@ -215,18 +208,17 @@ void ResourcePreloaderEditor::_update_library() {
ti->set_selectable(1, false);
if (type == "PackedScene") {
- ti->add_button(1, get_icon("InstanceOptions", "EditorIcons"), BUTTON_OPEN_SCENE, false, TTR("Open in Editor"));
+ ti->add_button(1, get_theme_icon("InstanceOptions", "EditorIcons"), BUTTON_OPEN_SCENE, false, TTR("Open in Editor"));
} else {
- ti->add_button(1, get_icon("Load", "EditorIcons"), BUTTON_EDIT_RESOURCE, false, TTR("Open in Editor"));
+ ti->add_button(1, get_theme_icon("Load", "EditorIcons"), BUTTON_EDIT_RESOURCE, false, TTR("Open in Editor"));
}
- ti->add_button(1, get_icon("Remove", "EditorIcons"), BUTTON_REMOVE, false, TTR("Remove"));
+ ti->add_button(1, get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE, false, TTR("Remove"));
}
//player->add_resource("default",resource);
}
void ResourcePreloaderEditor::_cell_button_pressed(Object *p_item, int p_column, int p_id) {
-
TreeItem *item = Object::cast_to<TreeItem>(p_item);
ERR_FAIL_COND(!item);
@@ -244,42 +236,42 @@ void ResourcePreloaderEditor::_cell_button_pressed(Object *p_item, int p_column,
}
void ResourcePreloaderEditor::edit(ResourcePreloader *p_preloader) {
-
preloader = p_preloader;
if (p_preloader) {
_update_library();
} else {
-
hide();
set_physics_process(false);
}
}
Variant ResourcePreloaderEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
TreeItem *ti = tree->get_item_at_position(p_point);
- if (!ti)
+ if (!ti) {
return Variant();
+ }
String name = ti->get_metadata(0);
RES res = preloader->get_resource(name);
- if (!res.is_valid())
+ if (!res.is_valid()) {
return Variant();
+ }
return EditorNode::get_singleton()->drag_resource(res, p_from);
}
bool ResourcePreloaderEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return false;
+ }
- if (d.has("from") && (Object *)(d["from"]) == tree)
+ if (d.has("from") && (Object *)(d["from"]) == tree) {
return false;
+ }
if (String(d["type"]) == "resource" && d.has("resource")) {
RES r = d["resource"];
@@ -288,7 +280,6 @@ bool ResourcePreloaderEditor::can_drop_data_fw(const Point2 &p_point, const Vari
}
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
return files.size() != 0;
@@ -297,20 +288,20 @@ bool ResourcePreloaderEditor::can_drop_data_fw(const Point2 &p_point, const Vari
}
void ResourcePreloaderEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
- if (!can_drop_data_fw(p_point, p_data, p_from))
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
return;
+ }
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return;
+ }
if (String(d["type"]) == "resource" && d.has("resource")) {
RES r = d["resource"];
if (r.is_valid()) {
-
String basename;
if (r->get_name() != "") {
basename = r->get_name();
@@ -337,7 +328,6 @@ void ResourcePreloaderEditor::drop_data_fw(const Point2 &p_point, const Variant
}
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
_files_load_request(files);
@@ -345,14 +335,8 @@ void ResourcePreloaderEditor::drop_data_fw(const Point2 &p_point, const Variant
}
void ResourcePreloaderEditor::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_gui_input"), &ResourcePreloaderEditor::_gui_input);
- ClassDB::bind_method(D_METHOD("_load_pressed"), &ResourcePreloaderEditor::_load_pressed);
- ClassDB::bind_method(D_METHOD("_item_edited"), &ResourcePreloaderEditor::_item_edited);
- ClassDB::bind_method(D_METHOD("_paste_pressed"), &ResourcePreloaderEditor::_paste_pressed);
- ClassDB::bind_method(D_METHOD("_files_load_request"), &ResourcePreloaderEditor::_files_load_request);
ClassDB::bind_method(D_METHOD("_update_library"), &ResourcePreloaderEditor::_update_library);
- ClassDB::bind_method(D_METHOD("_cell_button_pressed"), &ResourcePreloaderEditor::_cell_button_pressed);
ClassDB::bind_method(D_METHOD("_remove_resource", "to_remove"), &ResourcePreloaderEditor::_remove_resource);
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &ResourcePreloaderEditor::get_drag_data_fw);
@@ -361,7 +345,6 @@ void ResourcePreloaderEditor::_bind_methods() {
}
ResourcePreloaderEditor::ResourcePreloaderEditor() {
-
//add_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_stylebox("panel","Panel"));
VBoxContainer *vbc = memnew(VBoxContainer);
@@ -382,7 +365,7 @@ ResourcePreloaderEditor::ResourcePreloaderEditor() {
add_child(file);
tree = memnew(Tree);
- tree->connect("button_pressed", this, "_cell_button_pressed");
+ tree->connect("button_pressed", callable_mp(this, &ResourcePreloaderEditor::_cell_button_pressed));
tree->set_columns(2);
tree->set_column_min_width(0, 2);
tree->set_column_min_width(1, 3);
@@ -396,39 +379,37 @@ ResourcePreloaderEditor::ResourcePreloaderEditor() {
dialog = memnew(AcceptDialog);
add_child(dialog);
- load->connect("pressed", this, "_load_pressed");
- paste->connect("pressed", this, "_paste_pressed");
- file->connect("files_selected", this, "_files_load_request");
- tree->connect("item_edited", this, "_item_edited");
+ load->connect("pressed", callable_mp(this, &ResourcePreloaderEditor::_load_pressed));
+ paste->connect("pressed", callable_mp(this, &ResourcePreloaderEditor::_paste_pressed));
+ file->connect("files_selected", callable_mp(this, &ResourcePreloaderEditor::_files_load_request));
+ tree->connect("item_edited", callable_mp(this, &ResourcePreloaderEditor::_item_edited));
loading_scene = false;
}
void ResourcePreloaderEditorPlugin::edit(Object *p_object) {
-
preloader_editor->set_undo_redo(&get_undo_redo());
ResourcePreloader *s = Object::cast_to<ResourcePreloader>(p_object);
- if (!s)
+ if (!s) {
return;
+ }
preloader_editor->edit(s);
}
bool ResourcePreloaderEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("ResourcePreloader");
}
void ResourcePreloaderEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
//preloader_editor->show();
button->show();
editor->make_bottom_panel_item_visible(preloader_editor);
//preloader_editor->set_process(true);
} else {
-
- if (preloader_editor->is_visible_in_tree())
+ if (preloader_editor->is_visible_in_tree()) {
editor->hide_bottom_panel();
+ }
button->hide();
//preloader_editor->hide();
//preloader_editor->set_process(false);
@@ -436,7 +417,6 @@ void ResourcePreloaderEditorPlugin::make_visible(bool p_visible) {
}
ResourcePreloaderEditorPlugin::ResourcePreloaderEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
preloader_editor = memnew(ResourcePreloaderEditor);
preloader_editor->set_custom_minimum_size(Size2(0, 250) * EDSCALE);
diff --git a/editor/plugins/resource_preloader_editor_plugin.h b/editor/plugins/resource_preloader_editor_plugin.h
index 88e9cf4956..ddfb54c40b 100644
--- a/editor/plugins/resource_preloader_editor_plugin.h
+++ b/editor/plugins/resource_preloader_editor_plugin.h
@@ -39,7 +39,6 @@
#include "scene/main/resource_preloader.h"
class ResourcePreloaderEditor : public PanelContainer {
-
GDCLASS(ResourcePreloaderEditor, PanelContainer);
enum {
@@ -87,7 +86,6 @@ public:
};
class ResourcePreloaderEditorPlugin : public EditorPlugin {
-
GDCLASS(ResourcePreloaderEditorPlugin, EditorPlugin);
ResourcePreloaderEditor *preloader_editor;
@@ -95,11 +93,11 @@ class ResourcePreloaderEditorPlugin : public EditorPlugin {
Button *button;
public:
- virtual String get_name() const { return "ResourcePreloader"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "ResourcePreloader"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
ResourcePreloaderEditorPlugin(EditorNode *p_node);
~ResourcePreloaderEditorPlugin();
diff --git a/editor/plugins/root_motion_editor_plugin.cpp b/editor/plugins/root_motion_editor_plugin.cpp
index 3489537fa4..e107435373 100644
--- a/editor/plugins/root_motion_editor_plugin.cpp
+++ b/editor/plugins/root_motion_editor_plugin.cpp
@@ -30,13 +30,13 @@
#include "root_motion_editor_plugin.h"
#include "editor/editor_node.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
void EditorPropertyRootMotion::_confirmed() {
-
TreeItem *ti = filters->get_selected();
- if (!ti)
+ if (!ti) {
return;
+ }
NodePath path = ti->get_metadata(0);
emit_changed(get_edited_property(), path);
@@ -45,7 +45,6 @@ void EditorPropertyRootMotion::_confirmed() {
}
void EditorPropertyRootMotion::_node_assign() {
-
NodePath current = get_edited_object()->get(get_edited_property());
AnimationTree *atree = Object::cast_to<AnimationTree>(get_edited_object());
@@ -72,7 +71,6 @@ void EditorPropertyRootMotion::_node_assign() {
player->get_animation_list(&animations);
for (List<StringName>::Element *E = animations.front(); E; E = E->next()) {
-
Ref<Animation> anim = player->get_animation(E->get());
for (int i = 0; i < anim->get_track_count(); i++) {
paths.insert(anim->track_get_path(i));
@@ -86,9 +84,8 @@ void EditorPropertyRootMotion::_node_assign() {
Map<String, TreeItem *> parenthood;
for (Set<String>::Element *E = paths.front(); E; E = E->next()) {
-
NodePath path = E->get();
- TreeItem *ti = NULL;
+ TreeItem *ti = nullptr;
String accum;
for (int i = 0; i < path.get_name_count(); i++) {
String name = path.get_name(i);
@@ -117,18 +114,18 @@ void EditorPropertyRootMotion::_node_assign() {
}
}
- Node *node = NULL;
+ Node *node = nullptr;
if (base->has_node(accum)) {
node = base->get_node(accum);
}
- if (!node)
+ if (!node) {
continue; //no node, can't edit
+ }
if (path.get_subname_count()) {
-
String concat = path.get_concatenated_subnames();
- Skeleton *skeleton = Object::cast_to<Skeleton>(node);
+ Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node);
if (skeleton && skeleton->find_bone(concat) != -1) {
//path in skeleton
const String &bone = concat;
@@ -152,7 +149,7 @@ void EditorPropertyRootMotion::_node_assign() {
ti->set_text(0, F->get());
ti->set_selectable(0, true);
ti->set_editable(0, false);
- ti->set_icon(0, get_icon("BoneAttachment", "EditorIcons"));
+ ti->set_icon(0, get_theme_icon("BoneAttachment3D", "EditorIcons"));
ti->set_metadata(0, accum);
} else {
ti = parenthood[accum];
@@ -161,7 +158,7 @@ void EditorPropertyRootMotion::_node_assign() {
ti->set_selectable(0, true);
ti->set_text(0, concat);
- ti->set_icon(0, get_icon("BoneAttachment", "EditorIcons"));
+ ti->set_icon(0, get_theme_icon("BoneAttachment3D", "EditorIcons"));
ti->set_metadata(0, path);
if (path == current) {
ti->select(0);
@@ -194,25 +191,23 @@ void EditorPropertyRootMotion::_node_assign() {
}
void EditorPropertyRootMotion::_node_clear() {
-
emit_changed(get_edited_property(), NodePath());
update_property();
}
void EditorPropertyRootMotion::update_property() {
-
NodePath p = get_edited_object()->get(get_edited_property());
assign->set_tooltip(p);
if (p == NodePath()) {
- assign->set_icon(Ref<Texture>());
+ assign->set_icon(Ref<Texture2D>());
assign->set_text(TTR("Assign..."));
assign->set_flat(false);
return;
}
assign->set_flat(true);
- Node *base_node = NULL;
+ Node *base_node = nullptr;
if (base_hint != NodePath()) {
if (get_tree()->get_root()->has_node(base_hint)) {
base_node = get_tree()->get_root()->get_node(base_hint);
@@ -222,7 +217,7 @@ void EditorPropertyRootMotion::update_property() {
}
if (!base_node || !base_node->has_node(p)) {
- assign->set_icon(Ref<Texture>());
+ assign->set_icon(Ref<Texture2D>());
assign->set_text(p);
return;
}
@@ -235,53 +230,47 @@ void EditorPropertyRootMotion::update_property() {
}
void EditorPropertyRootMotion::setup(const NodePath &p_base_hint) {
-
base_hint = p_base_hint;
}
void EditorPropertyRootMotion::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
- Ref<Texture> t = get_icon("Clear", "EditorIcons");
+ Ref<Texture2D> t = get_theme_icon("Clear", "EditorIcons");
clear->set_icon(t);
}
}
void EditorPropertyRootMotion::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_confirmed"), &EditorPropertyRootMotion::_confirmed);
- ClassDB::bind_method(D_METHOD("_node_assign"), &EditorPropertyRootMotion::_node_assign);
- ClassDB::bind_method(D_METHOD("_node_clear"), &EditorPropertyRootMotion::_node_clear);
}
EditorPropertyRootMotion::EditorPropertyRootMotion() {
-
HBoxContainer *hbc = memnew(HBoxContainer);
add_child(hbc);
assign = memnew(Button);
assign->set_flat(true);
assign->set_h_size_flags(SIZE_EXPAND_FILL);
assign->set_clip_text(true);
- assign->connect("pressed", this, "_node_assign");
+ assign->connect("pressed", callable_mp(this, &EditorPropertyRootMotion::_node_assign));
hbc->add_child(assign);
clear = memnew(Button);
clear->set_flat(true);
- clear->connect("pressed", this, "_node_clear");
+ clear->connect("pressed", callable_mp(this, &EditorPropertyRootMotion::_node_clear));
hbc->add_child(clear);
filter_dialog = memnew(ConfirmationDialog);
add_child(filter_dialog);
filter_dialog->set_title(TTR("Edit Filtered Tracks:"));
- filter_dialog->connect("confirmed", this, "_confirmed");
+ filter_dialog->connect("confirmed", callable_mp(this, &EditorPropertyRootMotion::_confirmed));
filters = memnew(Tree);
filter_dialog->add_child(filters);
filters->set_v_size_flags(SIZE_EXPAND_FILL);
filters->set_hide_root(true);
- filters->connect("item_activated", this, "_confirmed");
+ filters->connect("item_activated", callable_mp(this, &EditorPropertyRootMotion::_confirmed));
//filters->connect("item_edited", this, "_filter_edited");
}
+
//////////////////////////
bool EditorInspectorRootMotionPlugin::can_handle(Object *p_object) {
@@ -292,8 +281,7 @@ void EditorInspectorRootMotionPlugin::parse_begin(Object *p_object) {
//do none
}
-bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
-
+bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) {
if (p_path == "root_motion_track" && p_object->is_class("AnimationTree") && p_type == Variant::NODE_PATH) {
EditorPropertyRootMotion *editor = memnew(EditorPropertyRootMotion);
if (p_hint == PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && p_hint_text != String()) {
diff --git a/editor/plugins/root_motion_editor_plugin.h b/editor/plugins/root_motion_editor_plugin.h
index 8a7691de5d..cc19228470 100644
--- a/editor/plugins/root_motion_editor_plugin.h
+++ b/editor/plugins/root_motion_editor_plugin.h
@@ -54,7 +54,7 @@ protected:
void _notification(int p_what);
public:
- virtual void update_property();
+ virtual void update_property() override;
void setup(const NodePath &p_base_hint);
EditorPropertyRootMotion();
};
@@ -63,10 +63,10 @@ class EditorInspectorRootMotionPlugin : public EditorInspectorPlugin {
GDCLASS(EditorInspectorRootMotionPlugin, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
- virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage);
- virtual void parse_end();
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
+ virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override;
+ virtual void parse_end() override;
};
#endif // ROOT_MOTION_EDITOR_PLUGIN_H
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index f13abd47a9..be8ddf789b 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -30,12 +30,13 @@
#include "script_editor_plugin.h"
+#include "core/input/input.h"
#include "core/io/resource_loader.h"
#include "core/os/file_access.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/os/os.h"
#include "core/project_settings.h"
+#include "editor/debugger/editor_debugger_node.h"
#include "editor/editor_node.h"
#include "editor/editor_run_script.h"
#include "editor/editor_scale.h"
@@ -44,16 +45,174 @@
#include "editor/find_in_files.h"
#include "editor/node_dock.h"
#include "editor/plugins/shader_editor_plugin.h"
-#include "editor/script_editor_debugger.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/scene_string_names.h"
#include "script_text_editor.h"
+#include "servers/display_server.h"
#include "text_editor.h"
+/*** SYNTAX HIGHLIGHTER ****/
+
+String EditorSyntaxHighlighter::_get_name() const {
+ ScriptInstance *si = get_script_instance();
+ if (si && si->has_method("_get_name")) {
+ return si->call("_get_name");
+ }
+ return "Unnamed";
+}
+
+Array EditorSyntaxHighlighter::_get_supported_languages() const {
+ ScriptInstance *si = get_script_instance();
+ if (si && si->has_method("_get_supported_languages")) {
+ return si->call("_get_supported_languages");
+ }
+ return Array();
+}
+
+Ref<EditorSyntaxHighlighter> EditorSyntaxHighlighter::_create() const {
+ Ref<EditorSyntaxHighlighter> syntax_highlighter;
+ syntax_highlighter.instance();
+ if (get_script_instance()) {
+ syntax_highlighter->set_script(get_script_instance()->get_script());
+ }
+ return syntax_highlighter;
+}
+
+void EditorSyntaxHighlighter::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_get_edited_resource"), &EditorSyntaxHighlighter::_get_edited_resource);
+
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_name"));
+ BIND_VMETHOD(MethodInfo(Variant::ARRAY, "_get_supported_languages"));
+ BIND_VMETHOD(MethodInfo(Variant::ARRAY, "_get_supported_extentions"));
+}
+
+////
+
+void EditorStandardSyntaxHighlighter::_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/highlighting/symbol_color"));
+ highlighter->set_function_color(EDITOR_GET("text_editor/highlighting/function_color"));
+ highlighter->set_number_color(EDITOR_GET("text_editor/highlighting/number_color"));
+ highlighter->set_member_variable_color(EDITOR_GET("text_editor/highlighting/member_variable_color"));
+
+ /* Engine types. */
+ const Color type_color = EDITOR_GET("text_editor/highlighting/engine_type_color");
+ List<StringName> types;
+ ClassDB::get_class_list(&types);
+ for (List<StringName>::Element *E = types.front(); E; E = E->next()) {
+ String n = E->get();
+ if (n.begins_with("_")) {
+ n = n.substr(1, n.length());
+ }
+ highlighter->add_keyword_color(n, type_color);
+ }
+
+ /* User types. */
+ const Color usertype_color = EDITOR_GET("text_editor/highlighting/user_type_color");
+ List<StringName> global_classes;
+ ScriptServer::get_global_class_list(&global_classes);
+ for (List<StringName>::Element *E = global_classes.front(); E; E = E->next()) {
+ highlighter->add_keyword_color(E->get(), usertype_color);
+ }
+
+ /* Autoloads. */
+ Map<StringName, ProjectSettings::AutoloadInfo> autoloads = ProjectSettings::get_singleton()->get_autoload_list();
+ for (Map<StringName, ProjectSettings::AutoloadInfo>::Element *E = autoloads.front(); E; E = E->next()) {
+ const ProjectSettings::AutoloadInfo &info = E->value();
+ if (info.is_singleton) {
+ highlighter->add_keyword_color(info.name, usertype_color);
+ }
+ }
+
+ const Ref<Script> script = _get_edited_resource();
+ if (script.is_valid()) {
+ /* Core types. */
+ const Color basetype_color = EDITOR_GET("text_editor/highlighting/base_type_color");
+ List<String> core_types;
+ script->get_language()->get_core_type_words(&core_types);
+ for (List<String>::Element *E = core_types.front(); E; E = E->next()) {
+ highlighter->add_keyword_color(E->get(), basetype_color);
+ }
+
+ /* Reserved words. */
+ const Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
+ List<String> keywords;
+ script->get_language()->get_reserved_words(&keywords);
+ for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
+ highlighter->add_keyword_color(E->get(), keyword_color);
+ }
+
+ /* Member types. */
+ const Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
+ StringName instance_base = script->get_instance_base_type();
+ if (instance_base != StringName()) {
+ List<PropertyInfo> plist;
+ ClassDB::get_property_list(instance_base, &plist);
+ for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
+ String name = E->get().name;
+ if (E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_SUBGROUP) {
+ continue;
+ }
+ if (name.find("/") != -1) {
+ continue;
+ }
+ highlighter->add_member_keyword_color(name, member_variable_color);
+ }
+
+ List<String> clist;
+ ClassDB::get_integer_constant_list(instance_base, &clist);
+ for (List<String>::Element *E = clist.front(); E; E = E->next()) {
+ highlighter->add_member_keyword_color(E->get(), member_variable_color);
+ }
+ }
+
+ /* Comments */
+ const Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
+ List<String> comments;
+ script->get_language()->get_comment_delimiters(&comments);
+ for (List<String>::Element *E = comments.front(); E; E = E->next()) {
+ String comment = E->get();
+ String beg = comment.get_slice(" ", 0);
+ String end = comment.get_slice_count(" ") > 1 ? comment.get_slice(" ", 1) : String();
+ highlighter->add_color_region(beg, end, comment_color, end == "");
+ }
+
+ /* Strings */
+ const Color string_color = EDITOR_GET("text_editor/highlighting/string_color");
+ List<String> strings;
+ script->get_language()->get_string_delimiters(&strings);
+ for (List<String>::Element *E = strings.front(); E; E = E->next()) {
+ String string = E->get();
+ String beg = string.get_slice(" ", 0);
+ String end = string.get_slice_count(" ") > 1 ? string.get_slice(" ", 1) : String();
+ highlighter->add_color_region(beg, end, string_color, end == "");
+ }
+ }
+}
+
+Ref<EditorSyntaxHighlighter> EditorStandardSyntaxHighlighter::_create() const {
+ Ref<EditorStandardSyntaxHighlighter> syntax_highlighter;
+ syntax_highlighter.instance();
+ return syntax_highlighter;
+}
+
+////
+
+Ref<EditorSyntaxHighlighter> EditorPlainTextSyntaxHighlighter::_create() const {
+ Ref<EditorPlainTextSyntaxHighlighter> syntax_highlighter;
+ syntax_highlighter.instance();
+ return syntax_highlighter;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
/*** SCRIPT EDITOR ****/
void ScriptEditorBase::_bind_methods() {
-
ADD_SIGNAL(MethodInfo("name_changed"));
ADD_SIGNAL(MethodInfo("edited_script_changed"));
ADD_SIGNAL(MethodInfo("request_help", PropertyInfo(Variant::STRING, "topic")));
@@ -62,6 +221,9 @@ void ScriptEditorBase::_bind_methods() {
ADD_SIGNAL(MethodInfo("go_to_help", PropertyInfo(Variant::STRING, "what")));
// TODO: This signal is no use for VisualScript.
ADD_SIGNAL(MethodInfo("search_in_files_requested", PropertyInfo(Variant::STRING, "text")));
+ ADD_SIGNAL(MethodInfo("replace_in_files_requested", PropertyInfo(Variant::STRING, "text")));
+
+ BIND_VMETHOD(MethodInfo("add_syntax_highlighter", PropertyInfo(Variant::OBJECT, "highlighter")));
}
static bool _is_built_in_script(Script *p_script) {
@@ -71,7 +233,6 @@ static bool _is_built_in_script(Script *p_script) {
}
class EditorScriptCodeCompletionCache : public ScriptCodeCompletionCache {
-
struct Cache {
uint64_t time_loaded;
RES cache;
@@ -84,7 +245,6 @@ public:
int max_cache_size;
void cleanup() {
-
List<Map<String, Cache>::Element *> to_clean;
Map<String, Cache>::Element *I = cached.front();
@@ -102,10 +262,8 @@ public:
}
virtual RES get_cached_resource(const String &p_path) {
-
Map<String, Cache>::Element *E = cached.find(p_path);
if (!E) {
-
Cache c;
c.cache = ResourceLoader::load(p_path);
E = cached.insert(p_path, c);
@@ -135,7 +293,6 @@ public:
}
EditorScriptCodeCompletionCache() {
-
max_cache_size = 128;
max_time_cache = 5 * 60 * 1000; //minutes, five
}
@@ -144,61 +301,56 @@ public:
};
void ScriptEditorQuickOpen::popup_dialog(const Vector<String> &p_functions, bool p_dontclear) {
-
popup_centered_ratio(0.6);
- if (p_dontclear)
+ if (p_dontclear) {
search_box->select_all();
- else
+ } else {
search_box->clear();
+ }
search_box->grab_focus();
functions = p_functions;
_update_search();
}
void ScriptEditorQuickOpen::_text_changed(const String &p_newtext) {
-
_update_search();
}
void ScriptEditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) {
-
Ref<InputEventKey> k = p_ie;
- if (k.is_valid() && (k->get_scancode() == KEY_UP ||
- k->get_scancode() == KEY_DOWN ||
- k->get_scancode() == KEY_PAGEUP ||
- k->get_scancode() == KEY_PAGEDOWN)) {
-
+ if (k.is_valid() && (k->get_keycode() == KEY_UP ||
+ k->get_keycode() == KEY_DOWN ||
+ k->get_keycode() == KEY_PAGEUP ||
+ k->get_keycode() == KEY_PAGEDOWN)) {
search_options->call("_gui_input", k);
search_box->accept_event();
}
}
void ScriptEditorQuickOpen::_update_search() {
-
search_options->clear();
TreeItem *root = search_options->create_item();
for (int i = 0; i < functions.size(); i++) {
-
String file = functions[i];
if ((search_box->get_text() == "" || file.findn(search_box->get_text()) != -1)) {
-
TreeItem *ti = search_options->create_item(root);
ti->set_text(0, file);
- if (root->get_children() == ti)
+ if (root->get_children() == ti) {
ti->select(0);
+ }
}
}
- get_ok()->set_disabled(root->get_children() == NULL);
+ get_ok()->set_disabled(root->get_children() == nullptr);
}
void ScriptEditorQuickOpen::_confirmed() {
-
TreeItem *ti = search_options->get_selected();
- if (!ti)
+ if (!ti) {
return;
+ }
int line = ti->get_text(0).get_slice(":", 1).to_int();
emit_signal("goto_line", line - 1);
@@ -206,82 +358,66 @@ void ScriptEditorQuickOpen::_confirmed() {
}
void ScriptEditorQuickOpen::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- connect("confirmed", this, "_confirmed");
+ connect("confirmed", callable_mp(this, &ScriptEditorQuickOpen::_confirmed));
search_box->set_clear_button_enabled(true);
- FALLTHROUGH;
+ [[fallthrough]];
}
- case NOTIFICATION_THEME_CHANGED: {
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ search_box->set_right_icon(search_options->get_theme_icon("Search", "EditorIcons"));
} break;
case NOTIFICATION_EXIT_TREE: {
- disconnect("confirmed", this, "_confirmed");
+ disconnect("confirmed", callable_mp(this, &ScriptEditorQuickOpen::_confirmed));
} break;
}
}
void ScriptEditorQuickOpen::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_text_changed"), &ScriptEditorQuickOpen::_text_changed);
- ClassDB::bind_method(D_METHOD("_confirmed"), &ScriptEditorQuickOpen::_confirmed);
- ClassDB::bind_method(D_METHOD("_sbox_input"), &ScriptEditorQuickOpen::_sbox_input);
-
ADD_SIGNAL(MethodInfo("goto_line", PropertyInfo(Variant::INT, "line")));
}
ScriptEditorQuickOpen::ScriptEditorQuickOpen() {
-
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
search_box = memnew(LineEdit);
vbc->add_margin_child(TTR("Search:"), search_box);
- search_box->connect("text_changed", this, "_text_changed");
- search_box->connect("gui_input", this, "_sbox_input");
+ search_box->connect("text_changed", callable_mp(this, &ScriptEditorQuickOpen::_text_changed));
+ search_box->connect("gui_input", callable_mp(this, &ScriptEditorQuickOpen::_sbox_input));
search_options = memnew(Tree);
vbc->add_margin_child(TTR("Matches:"), search_options, true);
get_ok()->set_text(TTR("Open"));
get_ok()->set_disabled(true);
register_text_enter(search_box);
set_hide_on_ok(false);
- search_options->connect("item_activated", this, "_confirmed");
+ search_options->connect("item_activated", callable_mp(this, &ScriptEditorQuickOpen::_confirmed));
search_options->set_hide_root(true);
search_options->set_hide_folding(true);
- search_options->add_constant_override("draw_guides", 1);
+ search_options->add_theme_constant_override("draw_guides", 1);
}
/////////////////////////////////
-ScriptEditor *ScriptEditor::script_editor = NULL;
+ScriptEditor *ScriptEditor::script_editor = nullptr;
/*** SCRIPT EDITOR ******/
String ScriptEditor::_get_debug_tooltip(const String &p_text, Node *_se) {
-
- String val = debugger->get_var_value(p_text);
+ String val = EditorDebuggerNode::get_singleton()->get_var_value(p_text);
if (val != String()) {
return p_text + ": " + val;
} else {
-
return String();
}
}
void ScriptEditor::_breaked(bool p_breaked, bool p_can_debug) {
-
if (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor"))) {
return;
}
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_NEXT), !(p_breaked && p_can_debug));
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_STEP), !(p_breaked && p_can_debug));
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_BREAK), p_breaked);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), !p_breaked);
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (!se) {
continue;
@@ -291,24 +427,18 @@ void ScriptEditor::_breaked(bool p_breaked, bool p_can_debug) {
}
}
-void ScriptEditor::_show_debugger(bool p_show) {
-
- //debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), p_show);
-}
-
void ScriptEditor::_script_created(Ref<Script> p_script) {
editor->push_item(p_script.operator->());
}
void ScriptEditor::_goto_script_line2(int p_line) {
-
ScriptEditorBase *current = _get_current_editor();
- if (current)
+ if (current) {
current->goto_line(p_line);
+ }
}
void ScriptEditor::_goto_script_line(REF p_script, int p_line) {
-
Ref<Script> script = Object::cast_to<Script>(*p_script);
if (script.is_valid() && (script->has_source_code() || script->get_path().is_resource_file())) {
if (edit(p_script, p_line, 0)) {
@@ -328,12 +458,12 @@ void ScriptEditor::_set_execution(REF p_script, int p_line) {
Ref<Script> script = Object::cast_to<Script>(*p_script);
if (script.is_valid() && (script->has_source_code() || script->get_path().is_resource_file())) {
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
- if ((script != NULL && se->get_edited_resource() == p_script) || se->get_edited_resource()->get_path() == script->get_path()) {
+ if ((script != nullptr && se->get_edited_resource() == p_script) || se->get_edited_resource()->get_path() == script->get_path()) {
se->set_executing_line(p_line);
}
}
@@ -344,12 +474,12 @@ void ScriptEditor::_clear_execution(REF p_script) {
Ref<Script> script = Object::cast_to<Script>(*p_script);
if (script.is_valid() && (script->has_source_code() || script->get_path().is_resource_file())) {
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
- if ((script != NULL && se->get_edited_resource() == p_script) || se->get_edited_resource()->get_path() == script->get_path()) {
+ if ((script != nullptr && se->get_edited_resource() == p_script) || se->get_edited_resource()->get_path() == script->get_path()) {
se->clear_executing_line();
}
}
@@ -357,32 +487,27 @@ void ScriptEditor::_clear_execution(REF p_script) {
}
ScriptEditorBase *ScriptEditor::_get_current_editor() const {
-
int selected = tab_container->get_current_tab();
- if (selected < 0 || selected >= tab_container->get_child_count())
- return NULL;
+ if (selected < 0 || selected >= tab_container->get_child_count()) {
+ return nullptr;
+ }
return Object::cast_to<ScriptEditorBase>(tab_container->get_child(selected));
}
void ScriptEditor::_update_history_arrows() {
-
script_back->set_disabled(history_pos <= 0);
script_forward->set_disabled(history_pos >= history.size() - 1);
}
void ScriptEditor::_save_history() {
-
if (history_pos >= 0 && history_pos < history.size() && history[history_pos].control == tab_container->get_current_tab_control()) {
-
Node *n = tab_container->get_current_tab_control();
if (Object::cast_to<ScriptEditorBase>(n)) {
-
history.write[history_pos].state = Object::cast_to<ScriptEditorBase>(n)->get_edit_state();
}
if (Object::cast_to<EditorHelp>(n)) {
-
history.write[history_pos].state = Object::cast_to<EditorHelp>(n)->get_scroll();
}
}
@@ -399,29 +524,25 @@ void ScriptEditor::_save_history() {
}
void ScriptEditor::_go_to_tab(int p_idx) {
-
ScriptEditorBase *current = _get_current_editor();
if (current) {
if (current->is_unsaved()) {
-
current->apply_code();
}
}
Control *c = Object::cast_to<Control>(tab_container->get_child(p_idx));
- if (!c)
+ if (!c) {
return;
+ }
if (history_pos >= 0 && history_pos < history.size() && history[history_pos].control == tab_container->get_current_tab_control()) {
-
Node *n = tab_container->get_current_tab_control();
if (Object::cast_to<ScriptEditorBase>(n)) {
-
history.write[history_pos].state = Object::cast_to<ScriptEditorBase>(n)->get_edit_state();
}
if (Object::cast_to<EditorHelp>(n)) {
-
history.write[history_pos].state = Object::cast_to<EditorHelp>(n)->get_scroll();
}
}
@@ -439,25 +560,25 @@ void ScriptEditor::_go_to_tab(int p_idx) {
c = tab_container->get_current_tab_control();
if (Object::cast_to<ScriptEditorBase>(c)) {
-
script_name_label->set_text(Object::cast_to<ScriptEditorBase>(c)->get_name());
- script_icon->set_texture(Object::cast_to<ScriptEditorBase>(c)->get_icon());
- if (is_visible_in_tree())
+ script_icon->set_texture(Object::cast_to<ScriptEditorBase>(c)->get_theme_icon());
+ if (is_visible_in_tree()) {
Object::cast_to<ScriptEditorBase>(c)->ensure_focus();
+ }
Ref<Script> script = Object::cast_to<ScriptEditorBase>(c)->get_edited_resource();
- if (script != NULL) {
+ if (script != nullptr) {
notify_script_changed(script);
}
Object::cast_to<ScriptEditorBase>(c)->validate();
}
if (Object::cast_to<EditorHelp>(c)) {
-
script_name_label->set_text(Object::cast_to<EditorHelp>(c)->get_class());
- script_icon->set_texture(get_icon("Help", "EditorIcons"));
- if (is_visible_in_tree())
+ script_icon->set_texture(get_theme_icon("Help", "EditorIcons"));
+ if (is_visible_in_tree()) {
Object::cast_to<EditorHelp>(c)->set_focused();
+ }
}
c->set_meta("__editor_pass", ++edit_pass);
@@ -471,7 +592,6 @@ void ScriptEditor::_go_to_tab(int p_idx) {
}
void ScriptEditor::_add_recent_script(String p_path) {
-
if (p_path.empty()) {
return;
}
@@ -490,13 +610,11 @@ void ScriptEditor::_add_recent_script(String p_path) {
}
void ScriptEditor::_update_recent_scripts() {
-
Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scripts", Array());
recent_scripts->clear();
String path;
for (int i = 0; i < rc.size(); i++) {
-
path = rc[i];
recent_scripts->add_item(path.replace("res://", ""));
}
@@ -508,7 +626,6 @@ void ScriptEditor::_update_recent_scripts() {
}
void ScriptEditor::_open_recent_script(int p_idx) {
-
// clear button
if (p_idx == recent_scripts->get_item_count() - 1) {
EditorSettings::get_singleton()->set_project_metadata("recent_files", "scripts", Array());
@@ -567,28 +684,33 @@ void ScriptEditor::_open_recent_script(int p_idx) {
}
void ScriptEditor::_show_error_dialog(String p_path) {
-
error_dialog->set_text(vformat(TTR("Can't open '%s'. The file could have been moved or deleted."), p_path));
- error_dialog->popup_centered_minsize();
+ error_dialog->popup_centered();
}
void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) {
-
int selected = p_idx;
- if (selected < 0 || selected >= tab_container->get_child_count())
+ if (selected < 0 || selected >= tab_container->get_child_count()) {
return;
+ }
Node *tselected = tab_container->get_child(selected);
- ScriptEditorBase *current = Object::cast_to<ScriptEditorBase>(tab_container->get_child(selected));
+ ScriptEditorBase *current = Object::cast_to<ScriptEditorBase>(tselected);
if (current) {
- if (p_save) {
- apply_scripts();
- }
-
Ref<Script> script = current->get_edited_resource();
- if (script != NULL) {
- previous_scripts.push_back(script->get_path());
+ if (p_save && script.is_valid()) {
+ // Do not try to save internal scripts, but prompt to save in-memory
+ // scripts which are not saved to disk yet (have empty path).
+ if (script->get_path().find("local://") == -1 && script->get_path().find("::") == -1) {
+ _menu_option(FILE_SAVE);
+ }
+ }
+ if (script.is_valid()) {
+ if (!script->get_path().empty()) {
+ // Only saved scripts can be restored.
+ previous_scripts.push_back(script->get_path());
+ }
notify_script_close(script);
}
}
@@ -618,10 +740,10 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) {
current->clear_edit_menu();
}
memdelete(tselected);
- if (idx >= tab_container->get_child_count())
+ if (idx >= tab_container->get_child_count()) {
idx = tab_container->get_child_count() - 1;
+ }
if (idx >= 0) {
-
if (history_pos >= 0) {
idx = history[history_pos].control->get_index();
}
@@ -639,7 +761,6 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) {
}
void ScriptEditor::_close_current_tab() {
-
_close_tab(tab_container->get_current_tab());
}
@@ -649,10 +770,8 @@ void ScriptEditor::_close_discard_current_tab(const String &p_str) {
}
void ScriptEditor::_close_docs_tab() {
-
int child_count = tab_container->get_child_count();
for (int i = child_count - 1; i >= 0; i--) {
-
EditorHelp *se = Object::cast_to<EditorHelp>(tab_container->get_child(i));
if (se) {
@@ -663,16 +782,16 @@ void ScriptEditor::_close_docs_tab() {
void ScriptEditor::_copy_script_path() {
ScriptEditorBase *se = _get_current_editor();
- RES script = se->get_edited_resource();
- OS::get_singleton()->set_clipboard(script->get_path());
+ if (se) {
+ RES script = se->get_edited_resource();
+ DisplayServer::get_singleton()->clipboard_set(script->get_path());
+ }
}
void ScriptEditor::_close_other_tabs() {
-
int child_count = tab_container->get_child_count();
int current_idx = tab_container->get_current_tab();
for (int i = child_count - 1; i >= 0; i--) {
-
if (i == current_idx) {
continue;
}
@@ -681,7 +800,6 @@ void ScriptEditor::_close_other_tabs() {
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se) {
-
// Maybe there are unsaved changes
if (se->is_unsaved()) {
_ask_close_current_unsaved_tab(se);
@@ -694,15 +812,12 @@ void ScriptEditor::_close_other_tabs() {
}
void ScriptEditor::_close_all_tabs() {
-
int child_count = tab_container->get_child_count();
for (int i = child_count - 1; i >= 0; i--) {
-
tab_container->set_current_tab(i);
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se) {
-
// Maybe there are unsaved changes
if (se->is_unsaved()) {
_ask_close_current_unsaved_tab(se);
@@ -716,23 +831,23 @@ void ScriptEditor::_close_all_tabs() {
void ScriptEditor::_ask_close_current_unsaved_tab(ScriptEditorBase *current) {
erase_tab_confirm->set_text(TTR("Close and save changes?") + "\n\"" + current->get_name() + "\"");
- erase_tab_confirm->popup_centered_minsize();
+ erase_tab_confirm->popup_centered();
}
void ScriptEditor::_resave_scripts(const String &p_str) {
-
apply_scripts();
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
RES script = se->get_edited_resource();
- if (script->get_path() == "" || script->get_path().find("local://") != -1 || script->get_path().find("::") != -1)
+ if (script->get_path() == "" || script->get_path().find("local://") != -1 || script->get_path().find("::") != -1) {
continue; //internal script, who cares
+ }
if (trim_trailing_whitespace_on_save) {
se->trim_trailing_whitespace();
@@ -749,7 +864,7 @@ void ScriptEditor::_resave_scripts(const String &p_str) {
}
Ref<TextFile> text_file = script;
- if (text_file != NULL) {
+ if (text_file != nullptr) {
se->apply_code();
_save_text_file(text_file, text_file->get_path());
break;
@@ -763,19 +878,15 @@ void ScriptEditor::_resave_scripts(const String &p_str) {
}
void ScriptEditor::_reload_scripts() {
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (!se) {
-
continue;
}
RES edited_res = se->get_edited_resource();
if (edited_res->get_path() == "" || edited_res->get_path().find("local://") != -1 || edited_res->get_path().find("::") != -1) {
-
continue; //internal script, who cares
}
@@ -787,7 +898,7 @@ void ScriptEditor::_reload_scripts() {
}
Ref<Script> script = edited_res;
- if (script != NULL) {
+ if (script != nullptr) {
Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), true);
ERR_CONTINUE(!rel_script.is_valid());
script->set_source_code(rel_script->get_source_code());
@@ -796,7 +907,7 @@ void ScriptEditor::_reload_scripts() {
}
Ref<TextFile> text_file = edited_res;
- if (text_file != NULL) {
+ 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());
@@ -811,12 +922,9 @@ void ScriptEditor::_reload_scripts() {
}
void ScriptEditor::_res_saved_callback(const Ref<Resource> &p_res) {
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (!se) {
-
continue;
}
@@ -827,7 +935,6 @@ void ScriptEditor::_res_saved_callback(const Ref<Resource> &p_res) {
}
if (script == p_res) {
-
se->tag_saved_version();
}
}
@@ -842,11 +949,10 @@ void ScriptEditor::_res_saved_callback(const Ref<Resource> &p_res) {
void ScriptEditor::_live_auto_reload_running_scripts() {
pending_auto_reload = false;
- debugger->reload_scripts();
+ EditorDebuggerNode::get_singleton()->reload_scripts();
}
bool ScriptEditor::_test_script_times_on_disk(RES p_for_script) {
-
disk_changed_list->clear();
TreeItem *r = disk_changed_list->create_item();
disk_changed_list->set_hide_root(true);
@@ -856,22 +962,21 @@ bool ScriptEditor::_test_script_times_on_disk(RES p_for_script) {
bool use_autoreload = bool(EDITOR_DEF("text_editor/files/auto_reload_scripts_on_external_change", false));
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se) {
-
RES edited_res = se->get_edited_resource();
- if (p_for_script.is_valid() && edited_res.is_valid() && p_for_script != edited_res)
+ if (p_for_script.is_valid() && edited_res.is_valid() && p_for_script != edited_res) {
continue;
+ }
- if (edited_res->get_path() == "" || edited_res->get_path().find("local://") != -1 || edited_res->get_path().find("::") != -1)
+ if (edited_res->get_path() == "" || edited_res->get_path().find("local://") != -1 || edited_res->get_path().find("::") != -1) {
continue; //internal script, who cares
+ }
uint64_t last_date = edited_res->get_last_modified_time();
uint64_t date = FileAccess::get_modified_time(edited_res->get_path());
if (last_date != date) {
-
TreeItem *ti = disk_changed_list->create_item(r);
ti->set_text(0, edited_res->get_path().get_file());
@@ -896,22 +1001,19 @@ bool ScriptEditor::_test_script_times_on_disk(RES p_for_script) {
}
void ScriptEditor::_file_dialog_action(String p_file) {
-
switch (file_dialog_option) {
case FILE_NEW_TEXTFILE: {
Error err;
FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
if (err) {
- memdelete(file);
editor->show_warning(TTR("Error writing TextFile:") + "\n" + p_file, TTR("Error!"));
break;
}
file->close();
memdelete(file);
- FALLTHROUGH;
+ [[fallthrough]];
}
case FILE_OPEN: {
-
List<String> extensions;
ResourceLoader::get_recognized_extensions_for_type("Script", &extensions);
if (extensions.find(p_file.get_extension())) {
@@ -941,17 +1043,19 @@ void ScriptEditor::_file_dialog_action(String p_file) {
} break;
case FILE_SAVE_AS: {
ScriptEditorBase *current = _get_current_editor();
+ if (current) {
+ RES resource = current->get_edited_resource();
+ String path = ProjectSettings::get_singleton()->localize_path(p_file);
+ Error err = _save_text_file(resource, path);
- String path = ProjectSettings::get_singleton()->localize_path(p_file);
- Error err = _save_text_file(current->get_edited_resource(), path);
+ if (err != OK) {
+ editor->show_accept(TTR("Error saving file!"), TTR("OK"));
+ return;
+ }
- if (err != OK) {
- editor->show_accept(TTR("Error saving file!"), TTR("OK"));
- return;
+ resource->set_path(path);
+ _update_script_names();
}
-
- ((Resource *)current->get_edited_resource().ptr())->set_path(path);
- _update_script_names();
} break;
case THEME_SAVE_AS: {
if (!EditorSettings::get_singleton()->save_text_editor_theme_as(p_file)) {
@@ -968,21 +1072,19 @@ void ScriptEditor::_file_dialog_action(String p_file) {
}
Ref<Script> ScriptEditor::_get_current_script() {
-
ScriptEditorBase *current = _get_current_editor();
if (current) {
Ref<Script> script = current->get_edited_resource();
- return script != NULL ? script : NULL;
+ return script != nullptr ? script : nullptr;
} else {
- return NULL;
+ return nullptr;
}
}
Array ScriptEditor::_get_open_scripts() const {
-
Array ret;
- Vector<Ref<Script> > scripts = get_open_scripts();
+ Vector<Ref<Script>> scripts = get_open_scripts();
int scrits_amount = scripts.size();
for (int idx_script = 0; idx_script < scrits_amount; idx_script++) {
ret.push_back(scripts[idx_script]);
@@ -1000,7 +1102,6 @@ bool ScriptEditor::is_scripts_panel_toggled() {
}
void ScriptEditor::_menu_option(int p_option) {
-
ScriptEditorBase *current = _get_current_editor();
switch (p_option) {
case FILE_NEW: {
@@ -1008,16 +1109,16 @@ void ScriptEditor::_menu_option(int p_option) {
script_create_dialog->popup_centered();
} break;
case FILE_NEW_TEXTFILE: {
- file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
file_dialog_option = FILE_NEW_TEXTFILE;
file_dialog->clear_filters();
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
file_dialog->set_title(TTR("New Text File..."));
} break;
case FILE_OPEN: {
- file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
file_dialog_option = FILE_OPEN;
@@ -1028,14 +1129,14 @@ void ScriptEditor::_menu_option(int p_option) {
file_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
file_dialog->set_title(TTR("Open File"));
return;
} break;
case FILE_REOPEN_CLOSED: {
-
- if (previous_scripts.empty())
+ if (previous_scripts.empty()) {
return;
+ }
String path = previous_scripts.back()->get();
previous_scripts.pop_back();
@@ -1072,8 +1173,9 @@ void ScriptEditor::_menu_option(int p_option) {
} else {
Error error;
Ref<TextFile> text_file = _load_text_file(path, &error);
- if (error != OK)
+ if (error != OK) {
editor->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!"));
+ }
if (text_file.is_valid()) {
edit(text_file);
@@ -1083,62 +1185,34 @@ void ScriptEditor::_menu_option(int p_option) {
}
} break;
case FILE_SAVE_ALL: {
-
- if (_test_script_times_on_disk())
+ if (_test_script_times_on_disk()) {
return;
+ }
save_all_scripts();
} break;
case SEARCH_IN_FILES: {
-
_on_find_in_files_requested("");
} break;
+ case REPLACE_IN_FILES: {
+ _on_replace_in_files_requested("");
+ } break;
case SEARCH_HELP: {
-
help_search_dialog->popup_dialog();
} break;
case SEARCH_WEBSITE: {
-
OS::get_singleton()->shell_open("https://docs.godotengine.org/");
} break;
- case REQUEST_DOCS: {
-
- OS::get_singleton()->shell_open("https://github.com/godotengine/godot-docs/issues/new");
- } break;
-
case WINDOW_NEXT: {
-
_history_forward();
} break;
case WINDOW_PREV: {
-
_history_back();
} break;
case WINDOW_SORT: {
_sort_list_on_update = true;
_update_script_names();
} break;
- case DEBUG_SHOW: {
- if (debugger) {
- bool visible = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(DEBUG_SHOW));
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(DEBUG_SHOW), !visible);
- if (visible)
- debugger->hide();
- else
- debugger->show();
- }
- } break;
- case DEBUG_SHOW_KEEP_OPEN: {
- bool visible = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(DEBUG_SHOW_KEEP_OPEN));
- if (debugger)
- debugger->set_hide_on_stop(visible);
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(DEBUG_SHOW_KEEP_OPEN), !visible);
- } break;
- case DEBUG_WITH_EXTERNAL_EDITOR: {
- bool debug_with_external_editor = !debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(DEBUG_WITH_EXTERNAL_EDITOR));
- debugger->set_debug_with_external_editor(debug_with_external_editor);
- debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(DEBUG_WITH_EXTERNAL_EDITOR), debug_with_external_editor);
- } break;
case TOGGLE_SCRIPTS_PANEL: {
if (current) {
ScriptTextEditor *editor = Object::cast_to<ScriptTextEditor>(current);
@@ -1153,15 +1227,15 @@ void ScriptEditor::_menu_option(int p_option) {
}
if (current) {
-
switch (p_option) {
case FILE_SAVE: {
-
- if (_test_script_times_on_disk())
+ if (_test_script_times_on_disk()) {
return;
+ }
- if (trim_trailing_whitespace_on_save)
+ if (trim_trailing_whitespace_on_save) {
current->trim_trailing_whitespace();
+ }
current->insert_final_newline();
@@ -1173,19 +1247,20 @@ void ScriptEditor::_menu_option(int p_option) {
}
}
- Ref<TextFile> text_file = current->get_edited_resource();
- if (text_file != NULL) {
+ RES resource = current->get_edited_resource();
+ Ref<TextFile> text_file = resource;
+ if (text_file != nullptr) {
current->apply_code();
_save_text_file(text_file, text_file->get_path());
break;
}
- editor->save_resource(current->get_edited_resource());
+ editor->save_resource(resource);
} break;
case FILE_SAVE_AS: {
-
- if (trim_trailing_whitespace_on_save)
+ if (trim_trailing_whitespace_on_save) {
current->trim_trailing_whitespace();
+ }
current->insert_final_newline();
@@ -1197,9 +1272,10 @@ void ScriptEditor::_menu_option(int p_option) {
}
}
- Ref<TextFile> text_file = current->get_edited_resource();
- if (text_file != NULL) {
- file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ RES resource = current->get_edited_resource();
+ Ref<TextFile> text_file = resource;
+ if (text_file != nullptr) {
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
file_dialog_option = FILE_SAVE_AS;
@@ -1208,26 +1284,24 @@ void ScriptEditor::_menu_option(int p_option) {
file_dialog->clear_filters();
file_dialog->set_current_dir(text_file->get_path().get_base_dir());
file_dialog->set_current_file(text_file->get_path().get_file());
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
file_dialog->set_title(TTR("Save File As..."));
break;
}
- editor->push_item(Object::cast_to<Object>(current->get_edited_resource().ptr()));
- editor->save_resource_as(current->get_edited_resource());
+ editor->push_item(resource.ptr());
+ editor->save_resource_as(resource);
} break;
case FILE_TOOL_RELOAD:
case FILE_TOOL_RELOAD_SOFT: {
-
current->reload(p_option == FILE_TOOL_RELOAD_SOFT);
} break;
case FILE_RUN: {
-
Ref<Script> scr = current->get_edited_resource();
- if (scr == NULL || scr.is_null()) {
+ if (scr == nullptr || scr.is_null()) {
EditorNode::get_singleton()->show_warning(TTR("Can't obtain the script for running."));
break;
}
@@ -1240,19 +1314,17 @@ void ScriptEditor::_menu_option(int p_option) {
return;
}
if (!scr->is_tool()) {
-
EditorNode::get_singleton()->show_warning(TTR("Script is not in tool mode, will not be able to run."));
return;
}
if (!ClassDB::is_parent_class(scr->get_instance_base_type(), "EditorScript")) {
-
EditorNode::get_singleton()->show_warning(TTR("To run this script, it must inherit EditorScript and be set to tool mode."));
return;
}
Ref<EditorScript> es = memnew(EditorScript);
- es->set_script(scr.get_ref_ptr());
+ es->set_script(scr);
es->set_editor(EditorNode::get_singleton());
es->_run();
@@ -1277,7 +1349,7 @@ void ScriptEditor::_menu_option(int p_option) {
file_system_dock->navigate_to_path(path);
// Ensure that the FileSystem dock is visible.
TabContainer *tab_container = (TabContainer *)file_system_dock->get_parent_control();
- tab_container->set_current_tab(file_system_dock->get_position_in_parent());
+ tab_container->set_current_tab(file_system_dock->get_index());
}
} break;
case CLOSE_DOCS: {
@@ -1289,31 +1361,7 @@ void ScriptEditor::_menu_option(int p_option) {
case CLOSE_ALL: {
_close_all_tabs();
} break;
- case DEBUG_NEXT: {
-
- if (debugger)
- debugger->debug_next();
- } break;
- case DEBUG_STEP: {
-
- if (debugger)
- debugger->debug_step();
-
- } break;
- case DEBUG_BREAK: {
-
- if (debugger)
- debugger->debug_break();
-
- } break;
- case DEBUG_CONTINUE: {
-
- if (debugger)
- debugger->debug_continue();
-
- } break;
case WINDOW_MOVE_UP: {
-
if (tab_container->get_current_tab() > 0) {
tab_container->move_child(current, tab_container->get_current_tab() - 1);
tab_container->set_current_tab(tab_container->get_current_tab() - 1);
@@ -1321,7 +1369,6 @@ void ScriptEditor::_menu_option(int p_option) {
}
} break;
case WINDOW_MOVE_DOWN: {
-
if (tab_container->get_current_tab() < tab_container->get_child_count() - 1) {
tab_container->move_child(current, tab_container->get_current_tab() + 1);
tab_container->set_current_tab(tab_container->get_current_tab() + 1);
@@ -1329,19 +1376,15 @@ void ScriptEditor::_menu_option(int p_option) {
}
} break;
default: {
-
if (p_option >= WINDOW_SELECT_BASE) {
-
tab_container->set_current_tab(p_option - WINDOW_SELECT_BASE);
_update_script_names();
}
}
}
} else {
-
EditorHelp *help = Object::cast_to<EditorHelp>(tab_container->get_current_tab_control());
if (help) {
-
switch (p_option) {
case HELP_SEARCH_FIND: {
help->popup_search();
@@ -1365,7 +1408,6 @@ void ScriptEditor::_menu_option(int p_option) {
_close_all_tabs();
} break;
case WINDOW_MOVE_UP: {
-
if (tab_container->get_current_tab() > 0) {
tab_container->move_child(help, tab_container->get_current_tab() - 1);
tab_container->set_current_tab(tab_container->get_current_tab() - 1);
@@ -1373,7 +1415,6 @@ void ScriptEditor::_menu_option(int p_option) {
}
} break;
case WINDOW_MOVE_DOWN: {
-
if (tab_container->get_current_tab() < tab_container->get_child_count() - 1) {
tab_container->move_child(help, tab_container->get_current_tab() + 1);
tab_container->set_current_tab(tab_container->get_current_tab() + 1);
@@ -1388,12 +1429,12 @@ void ScriptEditor::_menu_option(int p_option) {
void ScriptEditor::_theme_option(int p_option) {
switch (p_option) {
case THEME_IMPORT: {
- file_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
file_dialog_option = THEME_IMPORT;
file_dialog->clear_filters();
file_dialog->add_filter("*.tet");
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
file_dialog->set_title(TTR("Import Theme"));
} break;
case THEME_RELOAD: {
@@ -1413,82 +1454,70 @@ void ScriptEditor::_theme_option(int p_option) {
}
void ScriptEditor::_show_save_theme_as_dialog() {
- file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
file_dialog_option = THEME_SAVE_AS;
file_dialog->clear_filters();
file_dialog->add_filter("*.tet");
file_dialog->set_current_path(EditorSettings::get_singleton()->get_text_editor_themes_dir().plus_file(EditorSettings::get_singleton()->get("text_editor/theme/color_theme")));
- file_dialog->popup_centered_ratio();
+ file_dialog->popup_file_dialog();
file_dialog->set_title(TTR("Save Theme As..."));
}
void ScriptEditor::_tab_changed(int p_which) {
-
ensure_select_current();
}
void ScriptEditor::_notification(int p_what) {
-
switch (p_what) {
-
case NOTIFICATION_ENTER_TREE: {
+ editor->connect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop));
+ editor->connect("script_add_function_request", callable_mp(this, &ScriptEditor::_add_callback));
+ editor->connect("resource_saved", callable_mp(this, &ScriptEditor::_res_saved_callback));
+ editor->get_filesystem_dock()->connect("file_removed", callable_mp(this, &ScriptEditor::_file_removed));
+ script_list->connect("item_selected", callable_mp(this, &ScriptEditor::_script_selected));
- editor->connect("play_pressed", this, "_editor_play");
- editor->connect("pause_pressed", this, "_editor_pause");
- editor->connect("stop_pressed", this, "_editor_stop");
- editor->connect("script_add_function_request", this, "_add_callback");
- editor->connect("resource_saved", this, "_res_saved_callback");
- script_list->connect("item_selected", this, "_script_selected");
-
- members_overview->connect("item_selected", this, "_members_overview_selected");
- help_overview->connect("item_selected", this, "_help_overview_selected");
- script_split->connect("dragged", this, "_script_split_dragged");
+ members_overview->connect("item_selected", callable_mp(this, &ScriptEditor::_members_overview_selected));
+ help_overview->connect("item_selected", callable_mp(this, &ScriptEditor::_help_overview_selected));
+ script_split->connect("dragged", callable_mp(this, &ScriptEditor::_script_split_dragged));
- EditorSettings::get_singleton()->connect("settings_changed", this, "_editor_settings_changed");
- FALLTHROUGH;
+ EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &ScriptEditor::_editor_settings_changed));
+ EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &ScriptEditor::_filesystem_changed));
+ [[fallthrough]];
}
case NOTIFICATION_THEME_CHANGED: {
+ help_search->set_icon(get_theme_icon("HelpSearch", "EditorIcons"));
+ site_search->set_icon(get_theme_icon("Instance", "EditorIcons"));
- help_search->set_icon(get_icon("HelpSearch", "EditorIcons"));
- site_search->set_icon(get_icon("Instance", "EditorIcons"));
- request_docs->set_icon(get_icon("Issue", "EditorIcons"));
-
- script_forward->set_icon(get_icon("Forward", "EditorIcons"));
- script_back->set_icon(get_icon("Back", "EditorIcons"));
+ script_forward->set_icon(get_theme_icon("Forward", "EditorIcons"));
+ script_back->set_icon(get_theme_icon("Back", "EditorIcons"));
- members_overview_alphabeta_sort_button->set_icon(get_icon("Sort", "EditorIcons"));
+ members_overview_alphabeta_sort_button->set_icon(get_theme_icon("Sort", "EditorIcons"));
- filter_scripts->set_right_icon(get_icon("Search", "EditorIcons"));
- filter_methods->set_right_icon(get_icon("Search", "EditorIcons"));
+ filter_scripts->set_right_icon(get_theme_icon("Search", "EditorIcons"));
+ filter_methods->set_right_icon(get_theme_icon("Search", "EditorIcons"));
- filename->add_style_override("normal", editor->get_gui_base()->get_stylebox("normal", "LineEdit"));
+ filename->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox("normal", "LineEdit"));
recent_scripts->set_as_minsize();
} break;
case NOTIFICATION_READY: {
-
- get_tree()->connect("tree_changed", this, "_tree_changed");
- editor->get_inspector_dock()->connect("request_help", this, "_request_help");
- editor->connect("request_help_search", this, "_help_search");
+ get_tree()->connect("tree_changed", callable_mp(this, &ScriptEditor::_tree_changed));
+ editor->get_inspector_dock()->connect("request_help", callable_mp(this, &ScriptEditor::_help_class_open));
+ editor->connect("request_help_search", callable_mp(this, &ScriptEditor::_help_search));
} break;
case NOTIFICATION_EXIT_TREE: {
-
- editor->disconnect("play_pressed", this, "_editor_play");
- editor->disconnect("pause_pressed", this, "_editor_pause");
- editor->disconnect("stop_pressed", this, "_editor_stop");
+ editor->disconnect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop));
} break;
- case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
-
+ case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
_test_script_times_on_disk();
_update_modified_scripts_for_external_editor();
} break;
case CanvasItem::NOTIFICATION_VISIBILITY_CHANGED: {
-
if (is_visible()) {
find_in_files_button->show();
} else {
@@ -1506,25 +1535,23 @@ void ScriptEditor::_notification(int p_what) {
}
bool ScriptEditor::can_take_away_focus() const {
-
ScriptEditorBase *current = _get_current_editor();
- if (current)
+ if (current) {
return current->can_lose_focus_on_node_selection();
- else
+ } else {
return true;
+ }
}
void ScriptEditor::close_builtin_scripts_from_scene(const String &p_scene) {
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se) {
-
Ref<Script> script = se->get_edited_resource();
- if (script == NULL || !script.is_valid())
+ if (script == nullptr || !script.is_valid()) {
continue;
+ }
if (script->get_path().find("::") != -1 && script->get_path().begins_with(p_scene)) { //is an internal script and belongs to scene being closed
_close_tab(i);
@@ -1535,7 +1562,6 @@ void ScriptEditor::close_builtin_scripts_from_scene(const String &p_scene) {
}
void ScriptEditor::edited_scene_changed() {
-
_update_modified_scripts_for_external_editor();
}
@@ -1548,38 +1574,38 @@ void ScriptEditor::notify_script_changed(const Ref<Script> &p_script) {
}
void ScriptEditor::get_breakpoints(List<String> *p_breakpoints) {
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
Ref<Script> script = se->get_edited_resource();
- if (script == NULL) {
+ if (script == nullptr) {
continue;
}
- List<int> bpoints;
- se->get_breakpoints(&bpoints);
String base = script->get_path();
- ERR_CONTINUE(base.begins_with("local://") || base == "");
-
- for (List<int>::Element *E = bpoints.front(); E; E = E->next()) {
+ if (base.begins_with("local://") || base == "") {
+ continue;
+ }
- p_breakpoints->push_back(base + ":" + itos(E->get() + 1));
+ Array bpoints = se->get_breakpoints();
+ for (int j = 0; j < bpoints.size(); j++) {
+ p_breakpoints->push_back(base + ":" + itos((int)bpoints[j] + 1));
}
}
}
void ScriptEditor::ensure_focus_current() {
-
- if (!is_inside_tree())
+ if (!is_inside_tree()) {
return;
+ }
ScriptEditorBase *current = _get_current_editor();
- if (current)
+ if (current) {
current->ensure_focus();
+ }
}
void ScriptEditor::_members_overview_selected(int p_idx) {
@@ -1606,7 +1632,6 @@ void ScriptEditor::_help_overview_selected(int p_idx) {
}
void ScriptEditor::_script_selected(int p_idx) {
-
grab_focus_block = !Input::get_singleton()->is_mouse_button_pressed(1); //amazing hack, simply amazing
_go_to_tab(script_list->get_item_metadata(p_idx));
@@ -1614,28 +1639,30 @@ void ScriptEditor::_script_selected(int p_idx) {
}
void ScriptEditor::ensure_select_current() {
-
if (tab_container->get_child_count() && tab_container->get_current_tab() >= 0) {
-
ScriptEditorBase *se = _get_current_editor();
if (se) {
+ se->enable_editor();
- if (!grab_focus_block && is_visible_in_tree())
+ if (!grab_focus_block && is_visible_in_tree()) {
se->ensure_focus();
+ }
}
}
_update_selected_editor_menu();
}
-void ScriptEditor::_find_scripts(Node *p_base, Node *p_current, Set<Ref<Script> > &used) {
- if (p_current != p_base && p_current->get_owner() != p_base)
+void ScriptEditor::_find_scripts(Node *p_base, Node *p_current, Set<Ref<Script>> &used) {
+ if (p_current != p_base && p_current->get_owner() != p_base) {
return;
+ }
if (p_current->get_script_instance()) {
Ref<Script> scr = p_current->get_script();
- if (scr.is_valid())
+ if (scr.is_valid()) {
used.insert(scr);
+ }
}
for (int i = 0; i < p_current->get_child_count(); i++) {
@@ -1644,10 +1671,9 @@ void ScriptEditor::_find_scripts(Node *p_base, Node *p_current, Set<Ref<Script>
}
struct _ScriptEditorItemData {
-
String name;
String sort_key;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
int index;
String tooltip;
bool used;
@@ -1655,7 +1681,6 @@ struct _ScriptEditorItemData {
Node *ref;
bool operator<(const _ScriptEditorItemData &id) const {
-
if (category == id.category) {
if (sort_key == id.sort_key) {
return index < id.index;
@@ -1669,7 +1694,6 @@ struct _ScriptEditorItemData {
};
void ScriptEditor::_update_members_overview_visibility() {
-
ScriptEditorBase *se = _get_current_editor();
if (!se) {
members_overview_alphabeta_sort_button->set_visible(false);
@@ -1723,7 +1747,6 @@ void ScriptEditor::_update_members_overview() {
}
void ScriptEditor::_update_help_overview_visibility() {
-
int selected = tab_container->get_current_tab();
if (selected < 0 || selected >= tab_container->get_child_count()) {
help_overview->set_visible(false);
@@ -1752,8 +1775,9 @@ void ScriptEditor::_update_help_overview() {
help_overview->clear();
int selected = tab_container->get_current_tab();
- if (selected < 0 || selected >= tab_container->get_child_count())
+ if (selected < 0 || selected >= tab_container->get_child_count()) {
return;
+ }
Node *current = tab_container->get_child(tab_container->get_current_tab());
EditorHelp *se = Object::cast_to<EditorHelp>(current);
@@ -1761,7 +1785,7 @@ void ScriptEditor::_update_help_overview() {
return;
}
- Vector<Pair<String, int> > sections = se->get_sections();
+ Vector<Pair<String, int>> sections = se->get_sections();
for (int i = 0; i < sections.size(); i++) {
help_overview->add_item(sections[i].first);
help_overview->set_item_metadata(i, sections[i].second);
@@ -1769,20 +1793,19 @@ void ScriptEditor::_update_help_overview() {
}
void ScriptEditor::_update_script_colors() {
-
bool script_temperature_enabled = EditorSettings::get_singleton()->get("text_editor/script_list/script_temperature_enabled");
bool highlight_current = EditorSettings::get_singleton()->get("text_editor/script_list/highlight_current_script");
int hist_size = EditorSettings::get_singleton()->get("text_editor/script_list/script_temperature_history_size");
- Color hot_color = get_color("accent_color", "Editor");
- Color cold_color = get_color("font_color", "Editor");
+ Color hot_color = get_theme_color("accent_color", "Editor");
+ Color cold_color = get_theme_color("font_color", "Editor");
for (int i = 0; i < script_list->get_item_count(); i++) {
-
int c = script_list->get_item_metadata(i);
Node *n = tab_container->get_child(c);
- if (!n)
+ if (!n) {
continue;
+ }
script_list->set_item_custom_bg_color(i, Color(0, 0, 0, 0));
@@ -1791,7 +1814,6 @@ void ScriptEditor::_update_script_colors() {
script_list->set_item_custom_bg_color(i, EditorSettings::get_singleton()->get("text_editor/script_list/current_script_background_color"));
} else if (script_temperature_enabled) {
-
if (!n->has_meta("__editor_pass")) {
continue;
}
@@ -1804,17 +1826,17 @@ void ScriptEditor::_update_script_colors() {
int non_zero_hist_size = (hist_size == 0) ? 1 : hist_size;
float v = Math::ease((edit_pass - pass) / float(non_zero_hist_size), 0.4);
- script_list->set_item_custom_fg_color(i, hot_color.linear_interpolate(cold_color, v));
+ script_list->set_item_custom_fg_color(i, hot_color.lerp(cold_color, v));
}
}
}
void ScriptEditor::_update_script_names() {
-
- if (restoring_layout)
+ if (restoring_layout) {
return;
+ }
- Set<Ref<Script> > used;
+ Set<Ref<Script>> used;
Node *edited = EditorNode::get_singleton()->get_edited_scene();
if (edited) {
_find_scripts(edited, edited, used);
@@ -1828,31 +1850,35 @@ void ScriptEditor::_update_script_names() {
Vector<_ScriptEditorItemData> sedata;
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se) {
-
- Ref<Texture> icon = se->get_icon();
+ Ref<Texture2D> icon = se->get_theme_icon();
String path = se->get_edited_resource()->get_path();
+ bool saved = !path.empty();
+ if (saved) {
+ // The script might be deleted, moved, or renamed, so make sure
+ // to update original path to previously edited resource.
+ se->set_meta("_edit_res_path", path);
+ }
bool built_in = !path.is_resource_file();
String name;
if (built_in) {
-
name = path.get_file();
- String resource_name = se->get_edited_resource()->get_name();
+ const String &resource_name = se->get_edited_resource()->get_name();
if (resource_name != "") {
- name = name.substr(0, name.find("::", 0) + 2) + resource_name;
+ // If the built-in script has a custom resource name defined,
+ // display the built-in script name as follows: `ResourceName (scene_file.tscn)`
+ name = vformat("%s (%s)", resource_name, name.substr(0, name.find("::", 0)));
}
} else {
-
name = se->get_name();
}
_ScriptEditorItemData sd;
sd.icon = icon;
sd.name = name;
- sd.tooltip = path;
+ sd.tooltip = saved ? path : TTR("Unsaved file.");
sd.index = i;
sd.used = used.has(se->get_edited_resource());
sd.category = 0;
@@ -1885,15 +1911,34 @@ void ScriptEditor::_update_script_names() {
sd.name = path;
} break;
}
+ if (!saved) {
+ sd.name = se->get_name();
+ }
sedata.push_back(sd);
}
+ Vector<String> disambiguated_script_names;
+ Vector<String> full_script_paths;
+ for (int j = 0; j < sedata.size(); j++) {
+ disambiguated_script_names.append(sedata[j].name.replace("(*)", ""));
+ full_script_paths.append(sedata[j].tooltip);
+ }
+
+ EditorNode::disambiguate_filenames(full_script_paths, disambiguated_script_names);
+
+ for (int j = 0; j < sedata.size(); j++) {
+ if (sedata[j].name.ends_with("(*)")) {
+ sedata.write[j].name = disambiguated_script_names[j] + "(*)";
+ } else {
+ sedata.write[j].name = disambiguated_script_names[j];
+ }
+ }
+
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
if (eh) {
-
String name = eh->get_class();
- Ref<Texture> icon = get_icon("Help", "EditorIcons");
+ Ref<Texture2D> icon = get_theme_icon("Help", "EditorIcons");
String tooltip = vformat(TTR("%s Class Reference"), name);
_ScriptEditorItemData sd;
@@ -1926,6 +1971,10 @@ void ScriptEditor::_update_script_names() {
if (new_cur_tab == -1 && sedata[i].index == cur_tab) {
new_cur_tab = i;
}
+ // Update index of sd entries for sorted order
+ _ScriptEditorItemData sd = sedata[i];
+ sd.index = i;
+ sedata.set(i, sd);
}
tab_container->set_current_tab(new_prev_tab);
tab_container->set_current_tab(new_cur_tab);
@@ -1952,6 +2001,11 @@ void ScriptEditor::_update_script_names() {
script_list->select(index);
script_name_label->set_text(sedata_filtered[i].name);
script_icon->set_texture(sedata_filtered[i].icon);
+ ScriptEditorBase *se = _get_current_editor();
+ if (se) {
+ se->enable_editor();
+ _update_selected_editor_menu();
+ }
}
}
@@ -2034,34 +2088,34 @@ Error ScriptEditor::_save_text_file(Ref<TextFile> p_text_file, const String &p_p
}
bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_grab_focus) {
-
- if (p_resource.is_null())
+ if (p_resource.is_null()) {
return false;
+ }
Ref<Script> script = p_resource;
- // refuse to open built-in if scene is not loaded
-
- // see if already has it
-
- bool open_dominant = EditorSettings::get_singleton()->get("text_editor/files/open_dominant_script_on_scene_change");
+ // Don't open dominant script if using an external editor.
+ const bool use_external_editor =
+ EditorSettings::get_singleton()->get("text_editor/external/use_external_editor") ||
+ (script.is_valid() && script->get_language()->overrides_external_editor());
+ const bool open_dominant = EditorSettings::get_singleton()->get("text_editor/files/open_dominant_script_on_scene_change");
- const bool should_open = open_dominant || !EditorNode::get_singleton()->is_changing_scene();
+ const bool should_open = (open_dominant && !use_external_editor) || !EditorNode::get_singleton()->is_changing_scene();
- if (script != NULL && script->get_language()->overrides_external_editor()) {
+ if (script.is_valid() && script->get_language()->overrides_external_editor()) {
if (should_open) {
Error err = script->get_language()->open_in_external_editor(script, p_line >= 0 ? p_line : 0, p_col);
- if (err != OK)
+ if (err != OK) {
ERR_PRINT("Couldn't open script in the overridden external text editor");
+ }
}
return false;
}
- if ((debugger->get_dump_stack_script() != p_resource || debugger->get_debug_with_external_editor()) &&
+ if (use_external_editor &&
+ (EditorDebuggerNode::get_singleton()->get_dump_stack_script() != p_resource || EditorDebuggerNode::get_singleton()->get_debug_with_external_editor()) &&
p_resource->get_path().is_resource_file() &&
- p_resource->get_class_name() != StringName("VisualScript") &&
- bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor"))) {
-
+ p_resource->get_class_name() != StringName("VisualScript")) {
String path = EditorSettings::get_singleton()->get("text_editor/external/exec_path");
String flags = EditorSettings::get_singleton()->get("text_editor/external/exec_flags");
@@ -2081,16 +2135,13 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
bool inside_quotes = false;
for (int i = 0; i < flags.size(); i++) {
-
if (flags[i] == '"' && (!i || flags[i - 1] != '\\')) {
-
if (!inside_quotes) {
from++;
}
inside_quotes = !inside_quotes;
} else if (flags[i] == '\0' || (!inside_quotes && flags[i] == ' ')) {
-
String arg = flags.substr(from, num_chars);
if (arg.find("{file}") != -1) {
has_file_flag = true;
@@ -2115,26 +2166,29 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
}
Error err = OS::get_singleton()->execute(path, args, false);
- if (err == OK)
+ if (err == OK) {
return false;
+ }
WARN_PRINT("Couldn't open external text editor, using internal");
}
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
- if ((script != NULL && se->get_edited_resource() == p_resource) || se->get_edited_resource()->get_path() == p_resource->get_path()) {
-
+ if ((script != nullptr && se->get_edited_resource() == p_resource) || se->get_edited_resource()->get_path() == p_resource->get_path()) {
if (should_open) {
+ se->enable_editor();
+
if (tab_container->get_current_tab() != i) {
_go_to_tab(i);
_update_script_names();
}
- if (is_visible_in_tree())
+ if (is_visible_in_tree()) {
se->ensure_focus();
+ }
if (p_line > 0) {
se->goto_line(p_line - 1);
@@ -2148,24 +2202,30 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
// doesn't have it, make a new one
- ScriptEditorBase *se = NULL;
+ ScriptEditorBase *se = nullptr;
for (int i = script_editor_func_count - 1; i >= 0; i--) {
se = script_editor_funcs[i](p_resource);
- if (se)
+ if (se) {
break;
+ }
}
ERR_FAIL_COND_V(!se, false);
+ se->set_edited_resource(p_resource);
+
if (p_resource->get_class_name() != StringName("VisualScript")) {
bool highlighter_set = false;
- for (int i = 0; i < syntax_highlighters_func_count; i++) {
- SyntaxHighlighter *highlighter = syntax_highlighters_funcs[i]();
+ for (int i = 0; i < syntax_highlighters.size(); i++) {
+ Ref<EditorSyntaxHighlighter> highlighter = syntax_highlighters[i]->_create();
+ if (highlighter.is_null()) {
+ continue;
+ }
se->add_syntax_highlighter(highlighter);
- if (script != NULL && !highlighter_set) {
- List<String> languages = highlighter->get_supported_languages();
- if (languages.find(script->get_language()->get_name())) {
+ if (script != nullptr && !highlighter_set) {
+ Array languages = highlighter->_get_supported_languages();
+ if (languages.find(script->get_language()->get_name()) > -1) {
se->set_syntax_highlighter(highlighter);
highlighter_set = true;
}
@@ -2174,7 +2234,14 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
}
tab_container->add_child(se);
- se->set_edited_resource(p_resource);
+
+ if (p_grab_focus) {
+ se->enable_editor();
+ }
+
+ // If we delete a script within the filesystem, the original resource path
+ // is lost, so keep it as metadata to figure out the exact tab to delete.
+ se->set_meta("_edit_res_path", p_resource->get_path());
se->set_tooltip_request_func("_get_debug_tooltip", this);
if (se->get_edit_menu()) {
se->get_edit_menu()->hide();
@@ -2184,18 +2251,20 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
if (p_grab_focus) {
_go_to_tab(tab_container->get_tab_count() - 1);
+ _add_recent_script(p_resource->get_path());
}
_sort_list_on_update = true;
_update_script_names();
_save_layout();
- se->connect("name_changed", this, "_update_script_names");
- se->connect("edited_script_changed", this, "_script_changed");
- se->connect("request_help", this, "_help_search");
- se->connect("request_open_script_at_line", this, "_goto_script_line");
- se->connect("go_to_help", this, "_help_class_goto");
- se->connect("request_save_history", this, "_save_history");
- se->connect("search_in_files_requested", this, "_on_find_in_files_requested");
+ se->connect("name_changed", callable_mp(this, &ScriptEditor::_update_script_names));
+ se->connect("edited_script_changed", callable_mp(this, &ScriptEditor::_script_changed));
+ se->connect("request_help", callable_mp(this, &ScriptEditor::_help_search));
+ se->connect("request_open_script_at_line", callable_mp(this, &ScriptEditor::_goto_script_line));
+ se->connect("go_to_help", callable_mp(this, &ScriptEditor::_help_class_goto));
+ se->connect("request_save_history", callable_mp(this, &ScriptEditor::_save_history));
+ se->connect("search_in_files_requested", callable_mp(this, &ScriptEditor::_on_find_in_files_requested));
+ se->connect("replace_in_files_requested", callable_mp(this, &ScriptEditor::_on_replace_in_files_requested));
//test for modification, maybe the script was not edited but was loaded
@@ -2207,17 +2276,15 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
}
notify_script_changed(p_resource);
- _add_recent_script(p_resource->get_path());
return true;
}
void ScriptEditor::save_all_scripts() {
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
if (convert_indent_on_save) {
if (use_space_indentation) {
@@ -2233,8 +2300,9 @@ void ScriptEditor::save_all_scripts() {
se->insert_final_newline();
- if (!se->is_unsaved())
+ if (!se->is_unsaved()) {
continue;
+ }
RES edited_res = se->get_edited_resource();
if (edited_res.is_valid()) {
@@ -2243,7 +2311,7 @@ void ScriptEditor::save_all_scripts() {
if (edited_res->get_path() != "" && edited_res->get_path().find("local://") == -1 && edited_res->get_path().find("::") == -1) {
Ref<TextFile> text_file = edited_res;
- if (text_file != NULL) {
+ if (text_file != nullptr) {
_save_text_file(text_file, text_file->get_path());
continue;
}
@@ -2256,12 +2324,11 @@ void ScriptEditor::save_all_scripts() {
}
void ScriptEditor::apply_scripts() const {
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
se->apply_code();
}
}
@@ -2271,31 +2338,10 @@ void ScriptEditor::open_script_create_dialog(const String &p_base_name, const St
script_create_dialog->config(p_base_name, p_base_path);
}
-void ScriptEditor::_editor_play() {
-
- debugger->start();
- debug_menu->get_popup()->grab_focus();
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_NEXT), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_STEP), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_BREAK), false);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), true);
-}
-
-void ScriptEditor::_editor_pause() {
-}
void ScriptEditor::_editor_stop() {
-
- debugger->stop();
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_NEXT), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_STEP), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_BREAK), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), true);
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (!se) {
-
continue;
}
@@ -2303,8 +2349,7 @@ void ScriptEditor::_editor_stop() {
}
}
-void ScriptEditor::_add_callback(Object *p_obj, const String &p_function, const PoolStringArray &p_args) {
-
+void ScriptEditor::_add_callback(Object *p_obj, const String &p_function, const PackedStringArray &p_args) {
ERR_FAIL_COND(!p_obj);
Ref<Script> script = p_obj->get_script();
ERR_FAIL_COND(!script.is_valid());
@@ -2312,12 +2357,13 @@ void ScriptEditor::_add_callback(Object *p_obj, const String &p_function, const
editor->push_item(script.ptr());
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
- if (se->get_edited_resource() != script)
+ }
+ if (se->get_edited_resource() != script) {
continue;
+ }
se->add_callback(p_function, p_args);
@@ -2330,7 +2376,6 @@ void ScriptEditor::_add_callback(Object *p_obj, const String &p_function, const
}
void ScriptEditor::_save_layout() {
-
if (restoring_layout) {
return;
}
@@ -2339,7 +2384,6 @@ void ScriptEditor::_save_layout() {
}
void ScriptEditor::_editor_settings_changed() {
-
trim_trailing_whitespace_on_save = EditorSettings::get_singleton()->get("text_editor/files/trim_trailing_whitespace_on_save");
convert_indent_on_save = EditorSettings::get_singleton()->get("text_editor/indent/convert_indent_on_save");
use_space_indentation = EditorSettings::get_singleton()->get("text_editor/indent/type");
@@ -2359,10 +2403,10 @@ void ScriptEditor::_editor_settings_changed() {
}
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
se->update_settings();
}
@@ -2372,13 +2416,28 @@ void ScriptEditor::_editor_settings_changed() {
ScriptServer::set_reload_scripts_on_save(EDITOR_DEF("text_editor/files/auto_reload_and_parse_scripts_on_save", true));
}
-void ScriptEditor::_autosave_scripts() {
+void ScriptEditor::_filesystem_changed() {
+ _update_script_names();
+}
+
+void ScriptEditor::_file_removed(const String &p_removed_file) {
+ for (int i = 0; i < tab_container->get_child_count(); i++) {
+ ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
+ if (!se) {
+ continue;
+ }
+ if (se->get_meta("_edit_res_path") == p_removed_file) {
+ // The script is deleted with no undo, so just close the tab.
+ _close_tab(i, false, false);
+ }
+ }
+}
+void ScriptEditor::_autosave_scripts() {
save_all_scripts();
}
void ScriptEditor::_update_autosave_timer() {
-
if (!autosave_timer->is_inside_tree()) {
return;
}
@@ -2393,9 +2452,9 @@ void ScriptEditor::_update_autosave_timer() {
}
void ScriptEditor::_tree_changed() {
-
- if (waiting_update_names)
+ if (waiting_update_names) {
return;
+ }
waiting_update_names = true;
call_deferred("_update_script_names");
@@ -2403,30 +2462,29 @@ void ScriptEditor::_tree_changed() {
}
void ScriptEditor::_script_split_dragged(float) {
-
_save_layout();
}
Variant ScriptEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
- if (tab_container->get_child_count() == 0)
+ if (tab_container->get_child_count() == 0) {
return Variant();
+ }
Node *cur_node = tab_container->get_child(tab_container->get_current_tab());
HBoxContainer *drag_preview = memnew(HBoxContainer);
String preview_name = "";
- Ref<Texture> preview_icon;
+ Ref<Texture2D> preview_icon;
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(cur_node);
if (se) {
preview_name = se->get_name();
- preview_icon = se->get_icon();
+ preview_icon = se->get_theme_icon();
}
EditorHelp *eh = Object::cast_to<EditorHelp>(cur_node);
if (eh) {
preview_name = eh->get_class();
- preview_icon = get_icon("Help", "EditorIcons");
+ preview_icon = get_theme_icon("Help", "EditorIcons");
}
if (!preview_icon.is_null()) {
@@ -2446,13 +2504,12 @@ Variant ScriptEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
}
bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return false;
+ }
if (String(d["type"]) == "script_list_element") {
-
Node *node = d["script_list_element"];
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(node);
@@ -2466,10 +2523,10 @@ bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data
}
if (String(d["type"]) == "nodes") {
-
Array nodes = d["nodes"];
- if (nodes.size() == 0)
+ if (nodes.size() == 0) {
return false;
+ }
Node *node = get_node((nodes[0]));
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(node);
@@ -2483,16 +2540,17 @@ bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data
}
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
- if (files.size() == 0)
+ if (files.size() == 0) {
return false; //weird
+ }
for (int i = 0; i < files.size(); i++) {
String file = files[i];
- if (file == "" || !FileAccess::exists(file))
+ if (file == "" || !FileAccess::exists(file)) {
continue;
+ }
Ref<Script> scr = ResourceLoader::load(file);
if (scr.is_valid()) {
return true;
@@ -2505,16 +2563,16 @@ bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data
}
void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
- if (!can_drop_data_fw(p_point, p_data, p_from))
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
return;
+ }
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return;
+ }
if (String(d["type"]) == "script_list_element") {
-
Node *node = d["script_list_element"];
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(node);
@@ -2531,10 +2589,10 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co
}
if (String(d["type"]) == "nodes") {
-
Array nodes = d["nodes"];
- if (nodes.size() == 0)
+ if (nodes.size() == 0) {
return;
+ }
Node *node = get_node(nodes[0]);
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(node);
@@ -2551,7 +2609,6 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co
}
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
int new_index = 0;
@@ -2561,8 +2618,9 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co
int num_tabs_before = tab_container->get_child_count();
for (int i = 0; i < files.size(); i++) {
String file = files[i];
- if (file == "" || !FileAccess::exists(file))
+ if (file == "" || !FileAccess::exists(file)) {
continue;
+ }
Ref<Script> scr = ResourceLoader::load(file);
if (scr.is_valid()) {
edit(scr);
@@ -2580,8 +2638,9 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co
}
void ScriptEditor::_unhandled_input(const Ref<InputEvent> &p_event) {
- if (!is_visible_in_tree() || !p_event->is_pressed() || p_event->is_echo())
+ if (!is_visible_in_tree() || !p_event->is_pressed() || p_event->is_echo()) {
return;
+ }
if (ED_IS_SHORTCUT("script_editor/next_script", p_event)) {
if (script_list->get_item_count() > 1) {
int next_tab = script_list->get_current() + 1;
@@ -2607,11 +2666,9 @@ void ScriptEditor::_unhandled_input(const Ref<InputEvent> &p_event) {
}
void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) {
-
Ref<InputEventMouseButton> mb = ev;
if (mb.is_valid() && mb->is_pressed()) {
switch (mb->get_button_index()) {
-
case BUTTON_MIDDLE: {
// Right-click selects automatically; middle-click does not.
int idx = script_list->get_item_at_position(mb->get_position(), true);
@@ -2630,12 +2687,12 @@ void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) {
}
void ScriptEditor::_make_script_list_context_menu() {
-
context_menu->clear();
int selected = tab_container->get_current_tab();
- if (selected < 0 || selected >= tab_container->get_child_count())
+ if (selected < 0 || selected >= tab_container->get_child_count()) {
return;
+ }
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(selected));
if (se) {
@@ -2648,7 +2705,7 @@ void ScriptEditor::_make_script_list_context_menu() {
context_menu->add_separator();
if (se) {
Ref<Script> scr = se->get_edited_resource();
- if (scr != NULL) {
+ if (scr != nullptr) {
context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/reload_script_soft"), FILE_TOOL_RELOAD_SOFT);
if (!scr.is_null() && scr->is_tool()) {
context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/run_file"), FILE_RUN);
@@ -2671,18 +2728,19 @@ void ScriptEditor::_make_script_list_context_menu() {
}
void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
-
if (!bool(EDITOR_DEF("text_editor/files/restore_scripts_on_load", true))) {
return;
}
- if (!p_layout->has_section_key("ScriptEditor", "open_scripts") && !p_layout->has_section_key("ScriptEditor", "open_help"))
+ if (!p_layout->has_section_key("ScriptEditor", "open_scripts") && !p_layout->has_section_key("ScriptEditor", "open_help")) {
return;
+ }
Array scripts = p_layout->get_value("ScriptEditor", "open_scripts");
Array helps;
- if (p_layout->has_section_key("ScriptEditor", "open_help"))
+ if (p_layout->has_section_key("ScriptEditor", "open_help")) {
helps = p_layout->get_value("ScriptEditor", "open_help");
+ }
restoring_layout = true;
@@ -2690,7 +2748,6 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
ResourceLoader::get_recognized_extensions_for_type("Script", &extensions);
for (int i = 0; i < scripts.size(); i++) {
-
String path = scripts[i];
Dictionary script_info = scripts[i];
@@ -2698,15 +2755,16 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
path = script_info["path"];
}
- if (!FileAccess::exists(path))
+ if (!FileAccess::exists(path)) {
continue;
+ }
if (extensions.find(path.get_extension())) {
Ref<Script> scr = ResourceLoader::load(path);
if (!scr.is_valid()) {
continue;
}
- if (!edit(scr)) {
+ if (!edit(scr, false)) {
continue;
}
} else {
@@ -2715,7 +2773,7 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
if (error != OK || !text_file.is_valid()) {
continue;
}
- if (!edit(text_file)) {
+ if (!edit(text_file, false)) {
continue;
}
}
@@ -2729,7 +2787,6 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
}
for (int i = 0; i < helps.size(); i++) {
-
String path = helps[i];
if (path == "") { // invalid, skip
continue;
@@ -2751,18 +2808,16 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
}
void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) {
-
Array scripts;
Array helps;
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se) {
-
String path = se->get_edited_resource()->get_path();
- if (!path.is_resource_file())
+ if (!path.is_resource_file()) {
continue;
+ }
Dictionary script_info;
script_info["path"] = path;
@@ -2774,7 +2829,6 @@ void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) {
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
if (eh) {
-
helps.push_back(eh->get_class());
}
}
@@ -2785,16 +2839,14 @@ void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) {
}
void ScriptEditor::_help_class_open(const String &p_class) {
-
- if (p_class == "")
+ if (p_class == "") {
return;
+ }
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
if (eh && eh->get_class() == p_class) {
-
_go_to_tab(i);
_update_script_names();
return;
@@ -2807,7 +2859,7 @@ void ScriptEditor::_help_class_open(const String &p_class) {
tab_container->add_child(eh);
_go_to_tab(tab_container->get_tab_count() - 1);
eh->go_to_class(p_class, 0);
- eh->connect("go_to_help", this, "_help_class_goto");
+ eh->connect("go_to_help", callable_mp(this, &ScriptEditor::_help_class_goto));
_add_recent_script(p_class);
_sort_list_on_update = true;
_update_script_names();
@@ -2815,15 +2867,12 @@ void ScriptEditor::_help_class_open(const String &p_class) {
}
void ScriptEditor::_help_class_goto(const String &p_desc) {
-
String cname = p_desc.get_slice(":", 1);
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
if (eh && eh->get_class() == cname) {
-
_go_to_tab(i);
eh->go_to_help(p_desc);
_update_script_names();
@@ -2837,7 +2886,7 @@ void ScriptEditor::_help_class_goto(const String &p_desc) {
tab_container->add_child(eh);
_go_to_tab(tab_container->get_tab_count() - 1);
eh->go_to_help(p_desc);
- eh->connect("go_to_help", this, "_help_class_goto");
+ eh->connect("go_to_help", callable_mp(this, &ScriptEditor::_help_class_goto));
_add_recent_script(eh->get_class());
_sort_list_on_update = true;
_update_script_names();
@@ -2845,25 +2894,22 @@ void ScriptEditor::_help_class_goto(const String &p_desc) {
}
void ScriptEditor::_update_selected_editor_menu() {
-
for (int i = 0; i < tab_container->get_child_count(); i++) {
-
bool current = tab_container->get_current_tab() == i;
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se && se->get_edit_menu()) {
-
- if (current)
+ if (current) {
se->get_edit_menu()->show();
- else
+ } else {
se->get_edit_menu()->hide();
+ }
}
}
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_current_tab_control());
script_search_menu->get_popup()->clear();
if (eh) {
-
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F), HELP_SEARCH_FIND);
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), HELP_SEARCH_FIND_NEXT);
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_previous", TTR("Find Previous"), KEY_MASK_SHIFT | KEY_F3), HELP_SEARCH_FIND_PREVIOUS);
@@ -2871,7 +2917,6 @@ void ScriptEditor::_update_selected_editor_menu() {
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F), SEARCH_IN_FILES);
script_search_menu->show();
} else {
-
if (tab_container->get_child_count() == 0) {
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F), SEARCH_IN_FILES);
script_search_menu->show();
@@ -2882,15 +2927,12 @@ void ScriptEditor::_update_selected_editor_menu() {
}
void ScriptEditor::_update_history_pos(int p_new_pos) {
-
Node *n = tab_container->get_current_tab_control();
if (Object::cast_to<ScriptEditorBase>(n)) {
-
history.write[history_pos].state = Object::cast_to<ScriptEditorBase>(n)->get_edit_state();
}
if (Object::cast_to<EditorHelp>(n)) {
-
history.write[history_pos].state = Object::cast_to<EditorHelp>(n)->get_scroll();
}
@@ -2900,18 +2942,16 @@ void ScriptEditor::_update_history_pos(int p_new_pos) {
n = history[history_pos].control;
if (Object::cast_to<ScriptEditorBase>(n)) {
-
Object::cast_to<ScriptEditorBase>(n)->set_edit_state(history[history_pos].state);
Object::cast_to<ScriptEditorBase>(n)->ensure_focus();
Ref<Script> script = Object::cast_to<ScriptEditorBase>(n)->get_edited_resource();
- if (script != NULL) {
+ if (script != nullptr) {
notify_script_changed(script);
}
}
if (Object::cast_to<EditorHelp>(n)) {
-
Object::cast_to<EditorHelp>(n)->set_scroll(history[history_pos].state);
Object::cast_to<EditorHelp>(n)->set_focused();
}
@@ -2923,30 +2963,28 @@ void ScriptEditor::_update_history_pos(int p_new_pos) {
}
void ScriptEditor::_history_forward() {
-
if (history_pos < history.size() - 1) {
_update_history_pos(history_pos + 1);
}
}
void ScriptEditor::_history_back() {
-
if (history_pos > 0) {
_update_history_pos(history_pos - 1);
}
}
-Vector<Ref<Script> > ScriptEditor::get_open_scripts() const {
-
- Vector<Ref<Script> > out_scripts = Vector<Ref<Script> >();
+Vector<Ref<Script>> ScriptEditor::get_open_scripts() const {
+ Vector<Ref<Script>> out_scripts = Vector<Ref<Script>>();
for (int i = 0; i < tab_container->get_child_count(); i++) {
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
- if (!se)
+ if (!se) {
continue;
+ }
Ref<Script> script = se->get_edited_resource();
- if (script != NULL) {
+ if (script != nullptr) {
out_scripts.push_back(script);
}
}
@@ -2954,30 +2992,41 @@ Vector<Ref<Script> > ScriptEditor::get_open_scripts() const {
return out_scripts;
}
-void ScriptEditor::set_scene_root_script(Ref<Script> p_script) {
-
- bool open_dominant = EditorSettings::get_singleton()->get("text_editor/files/open_dominant_script_on_scene_change");
+Array ScriptEditor::_get_open_script_editors() const {
+ Array script_editors;
+ for (int i = 0; i < tab_container->get_child_count(); i++) {
+ ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
+ if (!se) {
+ continue;
+ }
+ script_editors.push_back(se);
+ }
+ return script_editors;
+}
- if (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")))
- return;
+void ScriptEditor::set_scene_root_script(Ref<Script> p_script) {
+ // Don't open dominant script if using an external editor.
+ const bool use_external_editor =
+ EditorSettings::get_singleton()->get("text_editor/external/use_external_editor") ||
+ (p_script.is_valid() && p_script->get_language()->overrides_external_editor());
+ const bool open_dominant = EditorSettings::get_singleton()->get("text_editor/files/open_dominant_script_on_scene_change");
- if (open_dominant && p_script.is_valid()) {
+ if (open_dominant && !use_external_editor && p_script.is_valid()) {
edit(p_script);
}
}
bool ScriptEditor::script_goto_method(Ref<Script> p_script, const String &p_method) {
-
int line = p_script->get_member_line(p_method);
- if (line == -1)
+ if (line == -1) {
return false;
+ }
return edit(p_script, line, 0);
}
void ScriptEditor::set_live_auto_reload_running_scripts(bool p_enabled) {
-
auto_reload_running_scripts = p_enabled;
}
@@ -2986,7 +3035,6 @@ void ScriptEditor::_help_search(String p_text) {
}
void ScriptEditor::_open_script_request(const String &p_path) {
-
Ref<Script> script = ResourceLoader::load(p_path);
if (script.is_valid()) {
script_editor->edit(script, false);
@@ -3001,36 +3049,46 @@ void ScriptEditor::_open_script_request(const String &p_path) {
}
}
-int ScriptEditor::syntax_highlighters_func_count = 0;
-CreateSyntaxHighlighterFunc ScriptEditor::syntax_highlighters_funcs[ScriptEditor::SYNTAX_HIGHLIGHTER_FUNC_MAX];
+void ScriptEditor::register_syntax_highlighter(const Ref<EditorSyntaxHighlighter> &p_syntax_highlighter) {
+ ERR_FAIL_COND(p_syntax_highlighter.is_null());
-void ScriptEditor::register_create_syntax_highlighter_function(CreateSyntaxHighlighterFunc p_func) {
- ERR_FAIL_COND(syntax_highlighters_func_count == SYNTAX_HIGHLIGHTER_FUNC_MAX);
- syntax_highlighters_funcs[syntax_highlighters_func_count++] = p_func;
+ if (syntax_highlighters.find(p_syntax_highlighter) == -1) {
+ syntax_highlighters.push_back(p_syntax_highlighter);
+ }
+}
+
+void ScriptEditor::unregister_syntax_highlighter(const Ref<EditorSyntaxHighlighter> &p_syntax_highlighter) {
+ ERR_FAIL_COND(p_syntax_highlighter.is_null());
+
+ syntax_highlighters.erase(p_syntax_highlighter);
}
int ScriptEditor::script_editor_func_count = 0;
CreateScriptEditorFunc ScriptEditor::script_editor_funcs[ScriptEditor::SCRIPT_EDITOR_FUNC_MAX];
void ScriptEditor::register_create_script_editor_function(CreateScriptEditorFunc p_func) {
-
ERR_FAIL_COND(script_editor_func_count == SCRIPT_EDITOR_FUNC_MAX);
script_editor_funcs[script_editor_func_count++] = p_func;
}
void ScriptEditor::_script_changed() {
-
NodeDock::singleton->update_lists();
}
void ScriptEditor::_on_find_in_files_requested(String text) {
+ find_in_files_dialog->set_find_in_files_mode(FindInFilesDialog::SEARCH_MODE);
+ find_in_files_dialog->set_search_text(text);
+ find_in_files_dialog->popup_centered();
+}
+void ScriptEditor::_on_replace_in_files_requested(String text) {
+ find_in_files_dialog->set_find_in_files_mode(FindInFilesDialog::REPLACE_MODE);
find_in_files_dialog->set_search_text(text);
- find_in_files_dialog->popup_centered_minsize();
+ find_in_files_dialog->set_replace_text("");
+ find_in_files_dialog->popup_centered();
}
void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_number, int begin, int end) {
-
if (ResourceLoader::exists(fpath)) {
RES res = ResourceLoader::load(fpath);
@@ -3068,7 +3126,6 @@ void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_numb
}
void ScriptEditor::_start_find_in_files(bool with_replace) {
-
FindInFiles *f = find_in_files->get_finder();
f->set_search_text(find_in_files_dialog->get_search_text());
@@ -3078,13 +3135,13 @@ void ScriptEditor::_start_find_in_files(bool with_replace) {
f->set_filter(find_in_files_dialog->get_filter());
find_in_files->set_with_replace(with_replace);
+ find_in_files->set_replace_text(find_in_files_dialog->get_replace_text());
find_in_files->start_search();
editor->make_bottom_panel_item_visible(find_in_files);
}
-void ScriptEditor::_on_find_in_files_modified_files(PoolStringArray paths) {
-
+void ScriptEditor::_on_find_in_files_modified_files(PackedStringArray paths) {
_test_script_times_on_disk();
_update_modified_scripts_for_external_editor();
}
@@ -3098,64 +3155,25 @@ void ScriptEditor::_filter_methods_text_changed(const String &p_newtext) {
}
void ScriptEditor::_bind_methods() {
-
- ClassDB::bind_method("_file_dialog_action", &ScriptEditor::_file_dialog_action);
- ClassDB::bind_method("_tab_changed", &ScriptEditor::_tab_changed);
- ClassDB::bind_method("_menu_option", &ScriptEditor::_menu_option);
- ClassDB::bind_method("_close_current_tab", &ScriptEditor::_close_current_tab);
- ClassDB::bind_method("_close_discard_current_tab", &ScriptEditor::_close_discard_current_tab);
ClassDB::bind_method("_close_docs_tab", &ScriptEditor::_close_docs_tab);
ClassDB::bind_method("_close_all_tabs", &ScriptEditor::_close_all_tabs);
ClassDB::bind_method("_close_other_tabs", &ScriptEditor::_close_other_tabs);
- ClassDB::bind_method("_open_recent_script", &ScriptEditor::_open_recent_script);
- ClassDB::bind_method("_theme_option", &ScriptEditor::_theme_option);
- ClassDB::bind_method("_editor_play", &ScriptEditor::_editor_play);
- ClassDB::bind_method("_editor_pause", &ScriptEditor::_editor_pause);
- ClassDB::bind_method("_editor_stop", &ScriptEditor::_editor_stop);
- ClassDB::bind_method("_add_callback", &ScriptEditor::_add_callback);
- ClassDB::bind_method("_reload_scripts", &ScriptEditor::_reload_scripts);
- ClassDB::bind_method("_resave_scripts", &ScriptEditor::_resave_scripts);
- ClassDB::bind_method("_res_saved_callback", &ScriptEditor::_res_saved_callback);
- ClassDB::bind_method("_goto_script_line", &ScriptEditor::_goto_script_line);
ClassDB::bind_method("_goto_script_line2", &ScriptEditor::_goto_script_line2);
- ClassDB::bind_method("_set_execution", &ScriptEditor::_set_execution);
- ClassDB::bind_method("_clear_execution", &ScriptEditor::_clear_execution);
- ClassDB::bind_method("_help_search", &ScriptEditor::_help_search);
- ClassDB::bind_method("_save_history", &ScriptEditor::_save_history);
ClassDB::bind_method("_copy_script_path", &ScriptEditor::_copy_script_path);
- ClassDB::bind_method("_breaked", &ScriptEditor::_breaked);
- ClassDB::bind_method("_show_debugger", &ScriptEditor::_show_debugger);
ClassDB::bind_method("_get_debug_tooltip", &ScriptEditor::_get_debug_tooltip);
- ClassDB::bind_method("_autosave_scripts", &ScriptEditor::_autosave_scripts);
- ClassDB::bind_method("_update_autosave_timer", &ScriptEditor::_update_autosave_timer);
- ClassDB::bind_method("_editor_settings_changed", &ScriptEditor::_editor_settings_changed);
- ClassDB::bind_method("_update_script_names", &ScriptEditor::_update_script_names);
ClassDB::bind_method("_update_script_connections", &ScriptEditor::_update_script_connections);
- ClassDB::bind_method("_tree_changed", &ScriptEditor::_tree_changed);
- ClassDB::bind_method("_members_overview_selected", &ScriptEditor::_members_overview_selected);
- ClassDB::bind_method("_help_overview_selected", &ScriptEditor::_help_overview_selected);
- ClassDB::bind_method("_script_selected", &ScriptEditor::_script_selected);
- ClassDB::bind_method("_script_created", &ScriptEditor::_script_created);
- ClassDB::bind_method("_script_split_dragged", &ScriptEditor::_script_split_dragged);
ClassDB::bind_method("_help_class_open", &ScriptEditor::_help_class_open);
- ClassDB::bind_method("_help_class_goto", &ScriptEditor::_help_class_goto);
- ClassDB::bind_method("_request_help", &ScriptEditor::_help_class_open);
- ClassDB::bind_method("_history_forward", &ScriptEditor::_history_forward);
- ClassDB::bind_method("_history_back", &ScriptEditor::_history_back);
ClassDB::bind_method("_live_auto_reload_running_scripts", &ScriptEditor::_live_auto_reload_running_scripts);
ClassDB::bind_method("_unhandled_input", &ScriptEditor::_unhandled_input);
- ClassDB::bind_method("_script_list_gui_input", &ScriptEditor::_script_list_gui_input);
- ClassDB::bind_method("_toggle_members_overview_alpha_sort", &ScriptEditor::_toggle_members_overview_alpha_sort);
ClassDB::bind_method("_update_members_overview", &ScriptEditor::_update_members_overview);
- ClassDB::bind_method("_script_changed", &ScriptEditor::_script_changed);
- ClassDB::bind_method("_filter_scripts_text_changed", &ScriptEditor::_filter_scripts_text_changed);
- ClassDB::bind_method("_filter_methods_text_changed", &ScriptEditor::_filter_methods_text_changed);
ClassDB::bind_method("_update_recent_scripts", &ScriptEditor::_update_recent_scripts);
- ClassDB::bind_method("_on_find_in_files_requested", &ScriptEditor::_on_find_in_files_requested);
- ClassDB::bind_method("_start_find_in_files", &ScriptEditor::_start_find_in_files);
- ClassDB::bind_method("_on_find_in_files_result_selected", &ScriptEditor::_on_find_in_files_result_selected);
- ClassDB::bind_method("_on_find_in_files_modified_files", &ScriptEditor::_on_find_in_files_modified_files);
+
+ ClassDB::bind_method("get_current_editor", &ScriptEditor::_get_current_editor);
+ ClassDB::bind_method("get_open_script_editors", &ScriptEditor::_get_open_script_editors);
+
+ ClassDB::bind_method(D_METHOD("register_syntax_highlighter", "syntax_highlighter"), &ScriptEditor::register_syntax_highlighter);
+ ClassDB::bind_method(D_METHOD("unregister_syntax_highlighter", "syntax_highlighter"), &ScriptEditor::unregister_syntax_highlighter);
ClassDB::bind_method(D_METHOD("get_drag_data_fw", "point", "from"), &ScriptEditor::get_drag_data_fw);
ClassDB::bind_method(D_METHOD("can_drop_data_fw", "point", "data", "from"), &ScriptEditor::can_drop_data_fw);
@@ -3171,7 +3189,6 @@ void ScriptEditor::_bind_methods() {
}
ScriptEditor::ScriptEditor(EditorNode *p_editor) {
-
current_theme = "";
completion_cache = memnew(EditorScriptCodeCompletionCache);
@@ -3204,23 +3221,22 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
filter_scripts = memnew(LineEdit);
filter_scripts->set_placeholder(TTR("Filter scripts"));
filter_scripts->set_clear_button_enabled(true);
- filter_scripts->connect("text_changed", this, "_filter_scripts_text_changed");
+ filter_scripts->connect("text_changed", callable_mp(this, &ScriptEditor::_filter_scripts_text_changed));
scripts_vbox->add_child(filter_scripts);
script_list = memnew(ItemList);
scripts_vbox->add_child(script_list);
- script_list->set_custom_minimum_size(Size2(150, 90) * EDSCALE); //need to give a bit of limit to avoid it from disappearing
+ script_list->set_custom_minimum_size(Size2(150, 60) * EDSCALE); //need to give a bit of limit to avoid it from disappearing
script_list->set_v_size_flags(SIZE_EXPAND_FILL);
- script_split->set_split_offset(140);
+ script_split->set_split_offset(70 * EDSCALE);
_sort_list_on_update = true;
- script_list->connect("gui_input", this, "_script_list_gui_input", varray(), CONNECT_DEFERRED);
+ script_list->connect("gui_input", callable_mp(this, &ScriptEditor::_script_list_gui_input), varray(), CONNECT_DEFERRED);
script_list->set_allow_rmb_select(true);
script_list->set_drag_forwarding(this);
context_menu = memnew(PopupMenu);
add_child(context_menu);
- context_menu->connect("id_pressed", this, "_menu_option");
- context_menu->set_hide_on_window_lose_focus(true);
+ context_menu->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option));
overview_vbox = memnew(VBoxContainer);
overview_vbox->set_custom_minimum_size(Size2(0, 90));
@@ -3233,35 +3249,36 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
filename = memnew(Label);
filename->set_clip_text(true);
filename->set_h_size_flags(SIZE_EXPAND_FILL);
- filename->add_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_stylebox("normal", "LineEdit"));
+ filename->add_theme_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("normal", "LineEdit"));
buttons_hbox->add_child(filename);
- members_overview_alphabeta_sort_button = memnew(ToolButton);
+ members_overview_alphabeta_sort_button = memnew(Button);
+ members_overview_alphabeta_sort_button->set_flat(true);
members_overview_alphabeta_sort_button->set_tooltip(TTR("Toggle alphabetical sorting of the method list."));
members_overview_alphabeta_sort_button->set_toggle_mode(true);
members_overview_alphabeta_sort_button->set_pressed(EditorSettings::get_singleton()->get("text_editor/tools/sort_members_outline_alphabetically"));
- members_overview_alphabeta_sort_button->connect("toggled", this, "_toggle_members_overview_alpha_sort");
+ members_overview_alphabeta_sort_button->connect("toggled", callable_mp(this, &ScriptEditor::_toggle_members_overview_alpha_sort));
buttons_hbox->add_child(members_overview_alphabeta_sort_button);
filter_methods = memnew(LineEdit);
filter_methods->set_placeholder(TTR("Filter methods"));
filter_methods->set_clear_button_enabled(true);
- filter_methods->connect("text_changed", this, "_filter_methods_text_changed");
+ filter_methods->connect("text_changed", callable_mp(this, &ScriptEditor::_filter_methods_text_changed));
overview_vbox->add_child(filter_methods);
members_overview = memnew(ItemList);
overview_vbox->add_child(members_overview);
members_overview->set_allow_reselect(true);
- members_overview->set_custom_minimum_size(Size2(0, 90) * EDSCALE); //need to give a bit of limit to avoid it from disappearing
+ members_overview->set_custom_minimum_size(Size2(0, 60) * EDSCALE); //need to give a bit of limit to avoid it from disappearing
members_overview->set_v_size_flags(SIZE_EXPAND_FILL);
members_overview->set_allow_rmb_select(true);
help_overview = memnew(ItemList);
overview_vbox->add_child(help_overview);
help_overview->set_allow_reselect(true);
- help_overview->set_custom_minimum_size(Size2(0, 90) * EDSCALE); //need to give a bit of limit to avoid it from disappearing
+ help_overview->set_custom_minimum_size(Size2(0, 60) * EDSCALE); //need to give a bit of limit to avoid it from disappearing
help_overview->set_v_size_flags(SIZE_EXPAND_FILL);
tab_container = memnew(TabContainer);
@@ -3281,7 +3298,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
menu_hb->add_child(file_menu);
file_menu->set_text(TTR("File"));
file_menu->set_switch_on_hover(true);
- file_menu->get_popup()->set_hide_on_window_lose_focus(true);
+
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script...")), FILE_NEW);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New Text File...")), FILE_NEW_TEXTFILE);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open...")), FILE_OPEN);
@@ -3291,15 +3308,15 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
recent_scripts = memnew(PopupMenu);
recent_scripts->set_name("RecentScripts");
file_menu->get_popup()->add_child(recent_scripts);
- recent_scripts->connect("id_pressed", this, "_open_recent_script");
+ recent_scripts->connect("id_pressed", callable_mp(this, &ScriptEditor::_open_recent_script));
_update_recent_scripts();
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save", TTR("Save"), KEY_MASK_ALT | KEY_MASK_CMD | KEY_S), FILE_SAVE);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_as", TTR("Save As...")), FILE_SAVE_AS);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_S), FILE_SAVE_ALL);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_S), FILE_SAVE_ALL);
file_menu->get_popup()->add_separator();
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R), FILE_TOOL_RELOAD_SOFT);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_R), FILE_TOOL_RELOAD_SOFT);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/copy_path", TTR("Copy Script Path")), FILE_COPY_PATH);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/show_in_file_system", TTR("Show in FileSystem")), SHOW_IN_FILE_SYSTEM);
file_menu->get_popup()->add_separator();
@@ -3313,7 +3330,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
theme_submenu = memnew(PopupMenu);
theme_submenu->set_name("Theme");
file_menu->get_popup()->add_child(theme_submenu);
- theme_submenu->connect("id_pressed", this, "_theme_option");
+ theme_submenu->connect("id_pressed", callable_mp(this, &ScriptEditor::_theme_option));
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme...")), THEME_IMPORT);
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/reload_theme", TTR("Reload Theme")), THEME_RELOAD);
@@ -3332,35 +3349,24 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/toggle_scripts_panel", TTR("Toggle Scripts Panel"), KEY_MASK_CMD | KEY_BACKSLASH), TOGGLE_SCRIPTS_PANEL);
- file_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ file_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option));
script_search_menu = memnew(MenuButton);
menu_hb->add_child(script_search_menu);
script_search_menu->set_text(TTR("Search"));
script_search_menu->set_switch_on_hover(true);
- script_search_menu->get_popup()->set_hide_on_window_lose_focus(true);
- script_search_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ script_search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option));
- debug_menu = memnew(MenuButton);
+ MenuButton *debug_menu = memnew(MenuButton);
menu_hb->add_child(debug_menu);
- debug_menu->set_text(TTR("Debug"));
- debug_menu->set_switch_on_hover(true);
- debug_menu->get_popup()->set_hide_on_window_lose_focus(true);
- debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11), DEBUG_STEP);
- debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10), DEBUG_NEXT);
- debug_menu->get_popup()->add_separator();
- debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/break", TTR("Break")), DEBUG_BREAK);
- debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/continue", TTR("Continue"), KEY_F12), DEBUG_CONTINUE);
- debug_menu->get_popup()->add_separator();
- //debug_menu->get_popup()->add_check_item("Show Debugger",DEBUG_SHOW);
- debug_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("debugger/keep_debugger_open", TTR("Keep Debugger Open")), DEBUG_SHOW_KEEP_OPEN);
- debug_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("debugger/debug_with_external_editor", TTR("Debug with External Editor")), DEBUG_WITH_EXTERNAL_EDITOR);
- debug_menu->get_popup()->connect("id_pressed", this, "_menu_option");
-
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_NEXT), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_STEP), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_BREAK), true);
- debug_menu->get_popup()->set_item_disabled(debug_menu->get_popup()->get_item_index(DEBUG_CONTINUE), true);
+ debug_menu->hide(); // Handled by EditorDebuggerNode below.
+
+ EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
+ debugger->set_script_debug_button(debug_menu);
+ debugger->connect("goto_script_line", callable_mp(this, &ScriptEditor::_goto_script_line));
+ debugger->connect("set_execution", callable_mp(this, &ScriptEditor::_set_execution));
+ debugger->connect("clear_execution", callable_mp(this, &ScriptEditor::_clear_execution));
+ debugger->connect("breaked", callable_mp(this, &ScriptEditor::_breaked));
menu_hb->add_spacer();
@@ -3374,66 +3380,58 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
menu_hb->add_spacer();
- site_search = memnew(ToolButton);
+ site_search = memnew(Button);
+ site_search->set_flat(true);
site_search->set_text(TTR("Online Docs"));
- site_search->connect("pressed", this, "_menu_option", varray(SEARCH_WEBSITE));
+ site_search->connect("pressed", callable_mp(this, &ScriptEditor::_menu_option), varray(SEARCH_WEBSITE));
menu_hb->add_child(site_search);
site_search->set_tooltip(TTR("Open Godot online documentation."));
- request_docs = memnew(ToolButton);
- request_docs->set_text(TTR("Request Docs"));
- request_docs->connect("pressed", this, "_menu_option", varray(REQUEST_DOCS));
- menu_hb->add_child(request_docs);
- request_docs->set_tooltip(TTR("Help improve the Godot documentation by giving feedback."));
-
- help_search = memnew(ToolButton);
+ help_search = memnew(Button);
+ help_search->set_flat(true);
help_search->set_text(TTR("Search Help"));
- help_search->connect("pressed", this, "_menu_option", varray(SEARCH_HELP));
+ help_search->connect("pressed", callable_mp(this, &ScriptEditor::_menu_option), varray(SEARCH_HELP));
menu_hb->add_child(help_search);
help_search->set_tooltip(TTR("Search the reference documentation."));
menu_hb->add_child(memnew(VSeparator));
- script_back = memnew(ToolButton);
- script_back->connect("pressed", this, "_history_back");
+ script_back = memnew(Button);
+ script_back->set_flat(true);
+ script_back->connect("pressed", callable_mp(this, &ScriptEditor::_history_back));
menu_hb->add_child(script_back);
script_back->set_disabled(true);
script_back->set_tooltip(TTR("Go to previous edited document."));
- script_forward = memnew(ToolButton);
- script_forward->connect("pressed", this, "_history_forward");
+ script_forward = memnew(Button);
+ script_forward->set_flat(true);
+ script_forward->connect("pressed", callable_mp(this, &ScriptEditor::_history_forward));
menu_hb->add_child(script_forward);
script_forward->set_disabled(true);
script_forward->set_tooltip(TTR("Go to next edited document."));
- tab_container->connect("tab_changed", this, "_tab_changed");
+ tab_container->connect("tab_changed", callable_mp(this, &ScriptEditor::_tab_changed));
erase_tab_confirm = memnew(ConfirmationDialog);
erase_tab_confirm->get_ok()->set_text(TTR("Save"));
- erase_tab_confirm->add_button(TTR("Discard"), OS::get_singleton()->get_swap_ok_cancel(), "discard");
- erase_tab_confirm->connect("confirmed", this, "_close_current_tab");
- erase_tab_confirm->connect("custom_action", this, "_close_discard_current_tab");
+ erase_tab_confirm->add_button(TTR("Discard"), DisplayServer::get_singleton()->get_swap_cancel_ok(), "discard");
+ erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab));
+ erase_tab_confirm->connect("custom_action", callable_mp(this, &ScriptEditor::_close_discard_current_tab));
add_child(erase_tab_confirm);
script_create_dialog = memnew(ScriptCreateDialog);
script_create_dialog->set_title(TTR("Create Script"));
add_child(script_create_dialog);
- script_create_dialog->connect("script_created", this, "_script_created");
+ script_create_dialog->connect("script_created", callable_mp(this, &ScriptEditor::_script_created));
file_dialog_option = -1;
file_dialog = memnew(EditorFileDialog);
add_child(file_dialog);
- file_dialog->connect("file_selected", this, "_file_dialog_action");
+ file_dialog->connect("file_selected", callable_mp(this, &ScriptEditor::_file_dialog_action));
error_dialog = memnew(AcceptDialog);
add_child(error_dialog);
- debugger = memnew(ScriptEditorDebugger(editor));
- debugger->connect("goto_script_line", this, "_goto_script_line");
- debugger->connect("set_execution", this, "_set_execution");
- debugger->connect("clear_execution", this, "_clear_execution");
- debugger->connect("show_debugger", this, "_show_debugger");
-
disk_changed = memnew(ConfirmationDialog);
{
VBoxContainer *vbc = memnew(VBoxContainer);
@@ -3447,48 +3445,42 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
vbc->add_child(disk_changed_list);
disk_changed_list->set_v_size_flags(SIZE_EXPAND_FILL);
- disk_changed->connect("confirmed", this, "_reload_scripts");
+ disk_changed->connect("confirmed", callable_mp(this, &ScriptEditor::_reload_scripts));
disk_changed->get_ok()->set_text(TTR("Reload"));
- disk_changed->add_button(TTR("Resave"), !OS::get_singleton()->get_swap_ok_cancel(), "resave");
- disk_changed->connect("custom_action", this, "_resave_scripts");
+ disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave");
+ disk_changed->connect("custom_action", callable_mp(this, &ScriptEditor::_resave_scripts));
}
add_child(disk_changed);
script_editor = this;
- Button *db = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Debugger"), debugger);
- debugger->set_tool_button(db);
-
- debugger->connect("breaked", this, "_breaked");
-
autosave_timer = memnew(Timer);
autosave_timer->set_one_shot(false);
- autosave_timer->connect(SceneStringNames::get_singleton()->tree_entered, this, "_update_autosave_timer");
- autosave_timer->connect("timeout", this, "_autosave_scripts");
+ autosave_timer->connect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &ScriptEditor::_update_autosave_timer));
+ autosave_timer->connect("timeout", callable_mp(this, &ScriptEditor::_autosave_scripts));
add_child(autosave_timer);
grab_focus_block = false;
help_search_dialog = memnew(EditorHelpSearch);
add_child(help_search_dialog);
- help_search_dialog->connect("go_to_help", this, "_help_class_goto");
+ help_search_dialog->connect("go_to_help", callable_mp(this, &ScriptEditor::_help_class_goto));
find_in_files_dialog = memnew(FindInFilesDialog);
- find_in_files_dialog->connect(FindInFilesDialog::SIGNAL_FIND_REQUESTED, this, "_start_find_in_files", varray(false));
- find_in_files_dialog->connect(FindInFilesDialog::SIGNAL_REPLACE_REQUESTED, this, "_start_find_in_files", varray(true));
+ find_in_files_dialog->connect(FindInFilesDialog::SIGNAL_FIND_REQUESTED, callable_mp(this, &ScriptEditor::_start_find_in_files), varray(false));
+ find_in_files_dialog->connect(FindInFilesDialog::SIGNAL_REPLACE_REQUESTED, callable_mp(this, &ScriptEditor::_start_find_in_files), varray(true));
add_child(find_in_files_dialog);
find_in_files = memnew(FindInFilesPanel);
find_in_files_button = editor->add_bottom_panel_item(TTR("Search Results"), find_in_files);
find_in_files->set_custom_minimum_size(Size2(0, 200) * EDSCALE);
- find_in_files->connect(FindInFilesPanel::SIGNAL_RESULT_SELECTED, this, "_on_find_in_files_result_selected");
- find_in_files->connect(FindInFilesPanel::SIGNAL_FILES_MODIFIED, this, "_on_find_in_files_modified_files");
+ find_in_files->connect(FindInFilesPanel::SIGNAL_RESULT_SELECTED, callable_mp(this, &ScriptEditor::_on_find_in_files_result_selected));
+ find_in_files->connect(FindInFilesPanel::SIGNAL_FILES_MODIFIED, callable_mp(this, &ScriptEditor::_on_find_in_files_modified_files));
find_in_files->hide();
find_in_files_button->hide();
history_pos = -1;
- //debugger_gui->hide();
edit_pass = 0;
trim_trailing_whitespace_on_save = EditorSettings::get_singleton()->get("text_editor/files/trim_trailing_whitespace_on_save");
@@ -3497,19 +3489,16 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
ScriptServer::edit_request_func = _open_script_request;
- add_style_override("panel", editor->get_gui_base()->get_stylebox("ScriptEditorPanel", "EditorStyles"));
- tab_container->add_style_override("panel", editor->get_gui_base()->get_stylebox("ScriptEditor", "EditorStyles"));
+ add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox("ScriptEditorPanel", "EditorStyles"));
+ tab_container->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox("ScriptEditor", "EditorStyles"));
}
ScriptEditor::~ScriptEditor() {
-
memdelete(completion_cache);
}
void ScriptEditorPlugin::edit(Object *p_object) {
-
if (Object::cast_to<Script>(p_object)) {
-
Script *p_script = Object::cast_to<Script>(p_object);
String res_path = p_script->get_path().get_slice("::", 0);
@@ -3529,7 +3518,6 @@ void ScriptEditorPlugin::edit(Object *p_object) {
}
bool ScriptEditorPlugin::handles(Object *p_object) const {
-
if (Object::cast_to<TextFile>(p_object)) {
return true;
}
@@ -3542,30 +3530,25 @@ bool ScriptEditorPlugin::handles(Object *p_object) const {
}
void ScriptEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
script_editor->show();
script_editor->set_process(true);
script_editor->ensure_select_current();
} else {
-
script_editor->hide();
script_editor->set_process(false);
}
}
void ScriptEditorPlugin::selected_notify() {
-
script_editor->ensure_select_current();
}
void ScriptEditorPlugin::save_external_data() {
-
script_editor->save_all_scripts();
}
void ScriptEditorPlugin::apply_changes() {
-
script_editor->apply_scripts();
}
@@ -3576,27 +3559,22 @@ void ScriptEditorPlugin::save_global_state() {
}
void ScriptEditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) {
-
script_editor->set_window_layout(p_layout);
}
void ScriptEditorPlugin::get_window_layout(Ref<ConfigFile> p_layout) {
-
script_editor->get_window_layout(p_layout);
}
void ScriptEditorPlugin::get_breakpoints(List<String> *p_breakpoints) {
-
script_editor->get_breakpoints(p_breakpoints);
}
void ScriptEditorPlugin::edited_scene_changed() {
-
script_editor->edited_scene_changed();
}
ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
script_editor = memnew(ScriptEditor(p_node));
editor->get_viewport()->add_child(script_editor);
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index a41480c80d..c2b0b458eb 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -43,13 +43,58 @@
#include "scene/gui/split_container.h"
#include "scene/gui/tab_container.h"
#include "scene/gui/text_edit.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
#include "scene/main/timer.h"
#include "scene/resources/text_file.h"
-class ScriptEditorQuickOpen : public ConfirmationDialog {
+class EditorSyntaxHighlighter : public SyntaxHighlighter {
+ GDCLASS(EditorSyntaxHighlighter, SyntaxHighlighter)
+
+private:
+ REF edited_resourse;
+
+protected:
+ static void _bind_methods();
+
+public:
+ virtual String _get_name() const;
+ virtual Array _get_supported_languages() const;
+
+ void _set_edited_resource(const RES &p_res) { edited_resourse = p_res; }
+ REF _get_edited_resource() { return edited_resourse; }
+
+ virtual Ref<EditorSyntaxHighlighter> _create() const;
+};
+
+class EditorStandardSyntaxHighlighter : public EditorSyntaxHighlighter {
+ GDCLASS(EditorStandardSyntaxHighlighter, EditorSyntaxHighlighter)
+
+private:
+ Ref<CodeHighlighter> highlighter;
+
+public:
+ virtual void _update_cache() override;
+ virtual Dictionary _get_line_syntax_highlighting(int p_line) override { return highlighter->get_line_syntax_highlighting(p_line); }
+
+ virtual String _get_name() const override { return TTR("Standard"); }
+
+ virtual Ref<EditorSyntaxHighlighter> _create() const override;
+ EditorStandardSyntaxHighlighter() { highlighter.instance(); }
+};
+
+class EditorPlainTextSyntaxHighlighter : public EditorSyntaxHighlighter {
+ GDCLASS(EditorPlainTextSyntaxHighlighter, EditorSyntaxHighlighter)
+
+public:
+ virtual String _get_name() const override { return TTR("Plain Text"); }
+
+ virtual Ref<EditorSyntaxHighlighter> _create() const override;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class ScriptEditorQuickOpen : public ConfirmationDialog {
GDCLASS(ScriptEditorQuickOpen, ConfirmationDialog);
LineEdit *search_box;
@@ -73,26 +118,26 @@ public:
ScriptEditorQuickOpen();
};
-class ScriptEditorDebugger;
+class EditorDebuggerNode;
class ScriptEditorBase : public VBoxContainer {
-
GDCLASS(ScriptEditorBase, VBoxContainer);
protected:
static void _bind_methods();
public:
- virtual void add_syntax_highlighter(SyntaxHighlighter *p_highlighter) = 0;
- virtual void set_syntax_highlighter(SyntaxHighlighter *p_highlighter) = 0;
+ virtual void add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) = 0;
+ virtual void set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) = 0;
virtual void apply_code() = 0;
virtual RES get_edited_resource() const = 0;
virtual Vector<String> get_functions() = 0;
virtual void set_edited_resource(const RES &p_res) = 0;
+ virtual void enable_editor() = 0;
virtual void reload_text() = 0;
virtual String get_name() = 0;
- virtual Ref<Texture> get_icon() = 0;
+ virtual Ref<Texture2D> get_theme_icon() = 0;
virtual bool is_unsaved() = 0;
virtual Variant get_edit_state() = 0;
virtual void set_edit_state(const Variant &p_state) = 0;
@@ -106,8 +151,8 @@ public:
virtual void ensure_focus() = 0;
virtual void tag_saved_version() = 0;
virtual void reload(bool p_soft) {}
- virtual void get_breakpoints(List<int> *p_breakpoints) = 0;
- virtual void add_callback(const String &p_function, PoolStringArray p_args) = 0;
+ virtual Array get_breakpoints() = 0;
+ virtual void add_callback(const String &p_function, PackedStringArray p_args) = 0;
virtual void update_settings() = 0;
virtual void set_debugger_active(bool p_active) = 0;
virtual bool can_lose_focus_on_node_selection() { return true; }
@@ -123,7 +168,6 @@ public:
ScriptEditorBase() {}
};
-typedef SyntaxHighlighter *(*CreateSyntaxHighlighterFunc)();
typedef ScriptEditorBase *(*CreateScriptEditorFunc)(const RES &p_resource);
class EditorScriptCodeCompletionCache;
@@ -131,7 +175,6 @@ class FindInFilesDialog;
class FindInFilesPanel;
class ScriptEditor : public PanelContainer {
-
GDCLASS(ScriptEditor, PanelContainer);
EditorNode *editor;
@@ -155,17 +198,10 @@ class ScriptEditor : public PanelContainer {
FILE_COPY_PATH,
FILE_TOOL_RELOAD,
FILE_TOOL_RELOAD_SOFT,
- DEBUG_NEXT,
- DEBUG_STEP,
- DEBUG_BREAK,
- DEBUG_CONTINUE,
- DEBUG_SHOW,
- DEBUG_SHOW_KEEP_OPEN,
- DEBUG_WITH_EXTERNAL_EDITOR,
SEARCH_IN_FILES,
+ REPLACE_IN_FILES,
SEARCH_HELP,
SEARCH_WEBSITE,
- REQUEST_DOCS,
HELP_SEARCH_FIND,
HELP_SEARCH_FIND_NEXT,
HELP_SEARCH_FIND_PREVIOUS,
@@ -210,7 +246,6 @@ class ScriptEditor : public PanelContainer {
Button *help_search;
Button *site_search;
- Button *request_docs;
EditorHelpSearch *help_search_dialog;
ItemList *script_list;
@@ -222,7 +257,7 @@ class ScriptEditor : public PanelContainer {
VBoxContainer *overview_vbox;
HBoxContainer *buttons_hbox;
Label *filename;
- ToolButton *members_overview_alphabeta_sort_button;
+ Button *members_overview_alphabeta_sort_button;
bool members_overview_enabled;
ItemList *help_overview;
bool help_overview_enabled;
@@ -232,16 +267,15 @@ class ScriptEditor : public PanelContainer {
AcceptDialog *error_dialog;
ConfirmationDialog *erase_tab_confirm;
ScriptCreateDialog *script_create_dialog;
- ScriptEditorDebugger *debugger;
- ToolButton *scripts_visible;
+ Button *scripts_visible;
String current_theme;
TextureRect *script_icon;
Label *script_name_label;
- ToolButton *script_back;
- ToolButton *script_forward;
+ Button *script_back;
+ Button *script_forward;
FindInFilesDialog *find_in_files_dialog;
FindInFilesPanel *find_in_files;
@@ -249,17 +283,14 @@ class ScriptEditor : public PanelContainer {
enum {
SCRIPT_EDITOR_FUNC_MAX = 32,
- SYNTAX_HIGHLIGHTER_FUNC_MAX = 32
};
static int script_editor_func_count;
static CreateScriptEditorFunc script_editor_funcs[SCRIPT_EDITOR_FUNC_MAX];
- static int syntax_highlighters_func_count;
- static CreateSyntaxHighlighterFunc syntax_highlighters_funcs[SYNTAX_HIGHLIGHTER_FUNC_MAX];
+ Vector<Ref<EditorSyntaxHighlighter>> syntax_highlighters;
struct ScriptHistory {
-
Control *control;
Variant state;
};
@@ -314,13 +345,11 @@ class ScriptEditor : public PanelContainer {
EditorScriptCodeCompletionCache *completion_cache;
- void _editor_play();
- void _editor_pause();
void _editor_stop();
int edit_pass;
- void _add_callback(Object *p_obj, const String &p_function, const PoolStringArray &p_args);
+ void _add_callback(Object *p_obj, const String &p_function, const PackedStringArray &p_args);
void _res_saved_callback(const Ref<Resource> &p_res);
bool trim_trailing_whitespace_on_save;
@@ -334,14 +363,16 @@ class ScriptEditor : public PanelContainer {
void _set_execution(REF p_script, int p_line);
void _clear_execution(REF p_script);
void _breaked(bool p_breaked, bool p_can_debug);
- void _show_debugger(bool p_show);
void _update_window_menu();
void _script_created(Ref<Script> p_script);
ScriptEditorBase *_get_current_editor() const;
+ Array _get_open_script_editors() const;
void _save_layout();
void _editor_settings_changed();
+ void _filesystem_changed();
+ void _file_removed(const String &p_file);
void _autosave_scripts();
void _update_autosave_timer();
@@ -361,7 +392,7 @@ class ScriptEditor : public PanelContainer {
void _update_help_overview();
void _help_overview_selected(int p_idx);
- void _find_scripts(Node *p_base, Node *p_current, Set<Ref<Script> > &used);
+ void _find_scripts(Node *p_base, Node *p_current, Set<Ref<Script>> &used);
void _tree_changed();
@@ -404,9 +435,10 @@ class ScriptEditor : public PanelContainer {
Error _save_text_file(Ref<TextFile> p_text_file, const String &p_path);
void _on_find_in_files_requested(String text);
+ void _on_replace_in_files_requested(String text);
void _on_find_in_files_result_selected(String fpath, int line_number, int begin, int end);
void _start_find_in_files(bool with_replace);
- void _on_find_in_files_modified_files(PoolStringArray paths);
+ void _on_find_in_files_modified_files(PackedStringArray paths);
static void _open_script_request(const String &p_path);
@@ -438,7 +470,7 @@ public:
void get_window_layout(Ref<ConfigFile> p_layout);
void set_scene_root_script(Ref<Script> p_script);
- Vector<Ref<Script> > get_open_scripts() const;
+ Vector<Ref<Script>> get_open_scripts() const;
bool script_goto_method(Ref<Script> p_script, const String &p_method);
@@ -455,10 +487,11 @@ public:
VSplitContainer *get_left_list_split() { return list_split; }
- ScriptEditorDebugger *get_debugger() { return debugger; }
void set_live_auto_reload_running_scripts(bool p_enabled);
- static void register_create_syntax_highlighter_function(CreateSyntaxHighlighterFunc p_func);
+ void register_syntax_highlighter(const Ref<EditorSyntaxHighlighter> &p_syntax_highlighter);
+ void unregister_syntax_highlighter(const Ref<EditorSyntaxHighlighter> &p_syntax_highlighter);
+
static void register_create_script_editor_function(CreateScriptEditorFunc p_func);
ScriptEditor(EditorNode *p_editor);
@@ -466,32 +499,31 @@ public:
};
class ScriptEditorPlugin : public EditorPlugin {
-
GDCLASS(ScriptEditorPlugin, EditorPlugin);
ScriptEditor *script_editor;
EditorNode *editor;
public:
- virtual String get_name() const { return "Script"; }
- bool has_main_screen() const { return true; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
- virtual void selected_notify();
+ virtual String get_name() const override { return "Script"; }
+ bool has_main_screen() const override { return true; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+ virtual void selected_notify() override;
- virtual void save_external_data();
- virtual void apply_changes();
+ virtual void save_external_data() override;
+ virtual void apply_changes() override;
- virtual void restore_global_state();
- virtual void save_global_state();
+ virtual void restore_global_state() override;
+ virtual void save_global_state() override;
- virtual void set_window_layout(Ref<ConfigFile> p_layout);
- virtual void get_window_layout(Ref<ConfigFile> p_layout);
+ virtual void set_window_layout(Ref<ConfigFile> p_layout) override;
+ virtual void get_window_layout(Ref<ConfigFile> p_layout) override;
- virtual void get_breakpoints(List<String> *p_breakpoints);
+ virtual void get_breakpoints(List<String> *p_breakpoints) override;
- virtual void edited_scene_changed();
+ virtual void edited_scene_changed() override;
ScriptEditorPlugin(EditorNode *p_node);
~ScriptEditorPlugin();
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index 1432c3fc63..7feb7cb3d3 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -32,10 +32,10 @@
#include "core/math/expression.h"
#include "core/os/keyboard.h"
+#include "editor/debugger/editor_debugger_node.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
-#include "editor/script_editor_debugger.h"
void ConnectionInfoDialog::ok_pressed() {
}
@@ -53,40 +53,41 @@ void ConnectionInfoDialog::popup_connections(String p_method, Vector<Node *> p_n
for (List<Connection>::Element *E = all_connections.front(); E; E = E->next()) {
Connection connection = E->get();
- if (connection.method != p_method) {
+ if (connection.callable.get_method() != p_method) {
continue;
}
TreeItem *node_item = tree->create_item(root);
- node_item->set_text(0, Object::cast_to<Node>(connection.source)->get_name());
- node_item->set_icon(0, EditorNode::get_singleton()->get_object_icon(connection.source, "Node"));
+ node_item->set_text(0, Object::cast_to<Node>(connection.signal.get_object())->get_name());
+ node_item->set_icon(0, EditorNode::get_singleton()->get_object_icon(connection.signal.get_object(), "Node"));
node_item->set_selectable(0, false);
node_item->set_editable(0, false);
- node_item->set_text(1, connection.signal);
- node_item->set_icon(1, get_parent_control()->get_icon("Slot", "EditorIcons"));
+ node_item->set_text(1, connection.signal.get_name());
+ Control *p = Object::cast_to<Control>(get_parent());
+ node_item->set_icon(1, p->get_theme_icon("Slot", "EditorIcons"));
node_item->set_selectable(1, false);
node_item->set_editable(1, false);
- node_item->set_text(2, Object::cast_to<Node>(connection.target)->get_name());
- node_item->set_icon(2, EditorNode::get_singleton()->get_object_icon(connection.target, "Node"));
+ node_item->set_text(2, Object::cast_to<Node>(connection.callable.get_object())->get_name());
+ node_item->set_icon(2, EditorNode::get_singleton()->get_object_icon(connection.callable.get_object(), "Node"));
node_item->set_selectable(2, false);
node_item->set_editable(2, false);
}
}
- popup_centered(Size2(400, 300) * EDSCALE);
+ popup_centered(Size2(600, 300) * EDSCALE);
}
ConnectionInfoDialog::ConnectionInfoDialog() {
set_title(TTR("Connections to method:"));
VBoxContainer *vbc = memnew(VBoxContainer);
- vbc->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -8 * EDSCALE);
- vbc->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, 8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -8 * EDSCALE);
+ vbc->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -8 * EDSCALE);
add_child(vbc);
method = memnew(Label);
@@ -101,26 +102,23 @@ ConnectionInfoDialog::ConnectionInfoDialog() {
tree->set_column_title(1, TTR("Signal"));
tree->set_column_title(2, TTR("Target"));
vbc->add_child(tree);
- tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
tree->set_allow_rmb_select(true);
}
////////////////////////////////////////////////////////////////////////////////
Vector<String> ScriptTextEditor::get_functions() {
-
String errortxt;
int line = -1, col;
- TextEdit *te = code_editor->get_text_edit();
+ CodeEdit *te = code_editor->get_text_editor();
String text = te->get_text();
List<String> fnc;
if (script->get_language()->validate(text, line, col, errortxt, script->get_path(), &fnc)) {
-
//if valid rewrite functions to latest
functions.clear();
for (List<String>::Element *E = fnc.front(); E; E = E->next()) {
-
functions.push_back(E->get());
}
}
@@ -129,12 +127,12 @@ Vector<String> ScriptTextEditor::get_functions() {
}
void ScriptTextEditor::apply_code() {
-
- if (script.is_null())
+ if (script.is_null()) {
return;
- script->set_source_code(code_editor->get_text_edit()->get_text());
+ }
+ script->set_source_code(code_editor->get_text_editor()->get_text());
script->update_exports();
- _update_member_keywords();
+ code_editor->get_text_editor()->get_syntax_highlighter()->update_cache();
}
RES ScriptTextEditor::get_edited_resource() const {
@@ -142,57 +140,45 @@ RES ScriptTextEditor::get_edited_resource() const {
}
void ScriptTextEditor::set_edited_resource(const RES &p_res) {
- ERR_FAIL_COND(!script.is_null());
+ ERR_FAIL_COND(script.is_valid());
+ ERR_FAIL_COND(p_res.is_null());
script = p_res;
- _set_theme_for_script();
- code_editor->get_text_edit()->set_text(script->get_source_code());
- code_editor->get_text_edit()->clear_undo_history();
- code_editor->get_text_edit()->tag_saved_version();
+ code_editor->get_text_editor()->set_text(script->get_source_code());
+ code_editor->get_text_editor()->clear_undo_history();
+ code_editor->get_text_editor()->tag_saved_version();
emit_signal("name_changed");
code_editor->update_line_and_column();
-
- _validate_script();
}
-void ScriptTextEditor::_update_member_keywords() {
- member_keywords.clear();
- code_editor->get_text_edit()->clear_member_keywords();
- Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
-
- StringName instance_base = script->get_instance_base_type();
-
- if (instance_base == StringName())
+void ScriptTextEditor::enable_editor() {
+ if (editor_enabled) {
return;
- List<PropertyInfo> plist;
- ClassDB::get_property_list(instance_base, &plist);
-
- for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
- String name = E->get().name;
- if (E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_GROUP)
- continue;
- if (name.find("/") != -1)
- continue;
-
- code_editor->get_text_edit()->add_member_keyword(name, member_variable_color);
}
- List<String> clist;
- ClassDB::get_integer_constant_list(instance_base, &clist);
+ editor_enabled = true;
- for (List<String>::Element *E = clist.front(); E; E = E->next()) {
+ _enable_code_editor();
+ _set_theme_for_script();
- code_editor->get_text_edit()->add_member_keyword(E->get(), member_variable_color);
- }
+ _validate_script();
}
void ScriptTextEditor::_load_theme_settings() {
-
- TextEdit *text_edit = code_editor->get_text_edit();
-
- text_edit->clear_colors();
+ CodeEdit *text_edit = code_editor->get_text_editor();
+ text_edit->clear_keywords();
+
+ Color updated_safe_line_number_color = EDITOR_GET("text_editor/highlighting/safe_line_number_color");
+ if (updated_safe_line_number_color != safe_line_number_color) {
+ safe_line_number_color = updated_safe_line_number_color;
+ for (int i = 0; i < text_edit->get_line_count(); i++) {
+ if (text_edit->get_line_gutter_item_color(i, line_number_gutter) != default_line_number_color) {
+ text_edit->set_line_gutter_item_color(i, line_number_gutter, safe_line_number_color);
+ }
+ }
+ }
Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
Color completion_background_color = EDITOR_GET("text_editor/highlighting/completion_background_color");
@@ -202,7 +188,6 @@ void ScriptTextEditor::_load_theme_settings() {
Color completion_font_color = EDITOR_GET("text_editor/highlighting/completion_font_color");
Color text_color = EDITOR_GET("text_editor/highlighting/text_color");
Color line_number_color = EDITOR_GET("text_editor/highlighting/line_number_color");
- Color safe_line_number_color = EDITOR_GET("text_editor/highlighting/safe_line_number_color");
Color caret_color = EDITOR_GET("text_editor/highlighting/caret_color");
Color caret_background_color = EDITOR_GET("text_editor/highlighting/caret_background_color");
Color text_selected_color = EDITOR_GET("text_editor/highlighting/text_selected_color");
@@ -211,9 +196,6 @@ void ScriptTextEditor::_load_theme_settings() {
Color current_line_color = EDITOR_GET("text_editor/highlighting/current_line_color");
Color line_length_guideline_color = EDITOR_GET("text_editor/highlighting/line_length_guideline_color");
Color word_highlighted_color = EDITOR_GET("text_editor/highlighting/word_highlighted_color");
- Color number_color = EDITOR_GET("text_editor/highlighting/number_color");
- Color function_color = EDITOR_GET("text_editor/highlighting/function_color");
- Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
Color mark_color = EDITOR_GET("text_editor/highlighting/mark_color");
Color bookmark_color = EDITOR_GET("text_editor/highlighting/bookmark_color");
Color breakpoint_color = EDITOR_GET("text_editor/highlighting/breakpoint_color");
@@ -221,158 +203,86 @@ void ScriptTextEditor::_load_theme_settings() {
Color code_folding_color = EDITOR_GET("text_editor/highlighting/code_folding_color");
Color search_result_color = EDITOR_GET("text_editor/highlighting/search_result_color");
Color search_result_border_color = EDITOR_GET("text_editor/highlighting/search_result_border_color");
- Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
- Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
- Color basetype_color = EDITOR_GET("text_editor/highlighting/base_type_color");
- Color type_color = EDITOR_GET("text_editor/highlighting/engine_type_color");
- Color usertype_color = EDITOR_GET("text_editor/highlighting/user_type_color");
- Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
- Color string_color = EDITOR_GET("text_editor/highlighting/string_color");
-
- text_edit->add_color_override("background_color", background_color);
- text_edit->add_color_override("completion_background_color", completion_background_color);
- text_edit->add_color_override("completion_selected_color", completion_selected_color);
- text_edit->add_color_override("completion_existing_color", completion_existing_color);
- text_edit->add_color_override("completion_scroll_color", completion_scroll_color);
- text_edit->add_color_override("completion_font_color", completion_font_color);
- text_edit->add_color_override("font_color", text_color);
- text_edit->add_color_override("line_number_color", line_number_color);
- text_edit->add_color_override("safe_line_number_color", safe_line_number_color);
- text_edit->add_color_override("caret_color", caret_color);
- text_edit->add_color_override("caret_background_color", caret_background_color);
- text_edit->add_color_override("font_color_selected", text_selected_color);
- text_edit->add_color_override("selection_color", selection_color);
- text_edit->add_color_override("brace_mismatch_color", brace_mismatch_color);
- text_edit->add_color_override("current_line_color", current_line_color);
- text_edit->add_color_override("line_length_guideline_color", line_length_guideline_color);
- text_edit->add_color_override("word_highlighted_color", word_highlighted_color);
- text_edit->add_color_override("number_color", number_color);
- text_edit->add_color_override("function_color", function_color);
- text_edit->add_color_override("member_variable_color", member_variable_color);
- text_edit->add_color_override("bookmark_color", bookmark_color);
- text_edit->add_color_override("breakpoint_color", breakpoint_color);
- text_edit->add_color_override("executing_line_color", executing_line_color);
- text_edit->add_color_override("mark_color", mark_color);
- text_edit->add_color_override("code_folding_color", code_folding_color);
- text_edit->add_color_override("search_result_color", search_result_color);
- text_edit->add_color_override("search_result_border_color", search_result_border_color);
- text_edit->add_color_override("symbol_color", symbol_color);
-
- text_edit->add_constant_override("line_spacing", EDITOR_DEF("text_editor/theme/line_spacing", 6));
-
- colors_cache.symbol_color = symbol_color;
- colors_cache.keyword_color = keyword_color;
- colors_cache.basetype_color = basetype_color;
- colors_cache.type_color = type_color;
- colors_cache.usertype_color = usertype_color;
- colors_cache.comment_color = comment_color;
- colors_cache.string_color = string_color;
+
+ text_edit->add_theme_color_override("background_color", background_color);
+ text_edit->add_theme_color_override("completion_background_color", completion_background_color);
+ text_edit->add_theme_color_override("completion_selected_color", completion_selected_color);
+ text_edit->add_theme_color_override("completion_existing_color", completion_existing_color);
+ text_edit->add_theme_color_override("completion_scroll_color", completion_scroll_color);
+ text_edit->add_theme_color_override("completion_font_color", completion_font_color);
+ text_edit->add_theme_color_override("font_color", text_color);
+ text_edit->add_theme_color_override("line_number_color", line_number_color);
+ text_edit->add_theme_color_override("caret_color", caret_color);
+ text_edit->add_theme_color_override("caret_background_color", caret_background_color);
+ text_edit->add_theme_color_override("font_color_selected", text_selected_color);
+ text_edit->add_theme_color_override("selection_color", selection_color);
+ text_edit->add_theme_color_override("brace_mismatch_color", brace_mismatch_color);
+ text_edit->add_theme_color_override("current_line_color", current_line_color);
+ text_edit->add_theme_color_override("line_length_guideline_color", line_length_guideline_color);
+ text_edit->add_theme_color_override("word_highlighted_color", word_highlighted_color);
+ text_edit->add_theme_color_override("bookmark_color", bookmark_color);
+ text_edit->add_theme_color_override("breakpoint_color", breakpoint_color);
+ text_edit->add_theme_color_override("executing_line_color", executing_line_color);
+ text_edit->add_theme_color_override("mark_color", mark_color);
+ text_edit->add_theme_color_override("code_folding_color", code_folding_color);
+ text_edit->add_theme_color_override("search_result_color", search_result_color);
+ text_edit->add_theme_color_override("search_result_border_color", search_result_border_color);
+
+ text_edit->add_theme_constant_override("line_spacing", EDITOR_DEF("text_editor/theme/line_spacing", 6));
theme_loaded = true;
- if (!script.is_null())
+ if (!script.is_null()) {
_set_theme_for_script();
+ }
}
void ScriptTextEditor::_set_theme_for_script() {
-
- if (!theme_loaded)
+ if (!theme_loaded) {
return;
+ }
- TextEdit *text_edit = code_editor->get_text_edit();
-
- List<String> keywords;
- script->get_language()->get_reserved_words(&keywords);
+ CodeEdit *text_edit = code_editor->get_text_editor();
+ text_edit->get_syntax_highlighter()->update_cache();
- for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
+ /* add keywords for auto completion */
+ // singleton autoloads (as types, just as engine singletons are)
+ Map<StringName, ProjectSettings::AutoloadInfo> autoloads = ProjectSettings::get_singleton()->get_autoload_list();
+ for (Map<StringName, ProjectSettings::AutoloadInfo>::Element *E = autoloads.front(); E; E = E->next()) {
+ const ProjectSettings::AutoloadInfo &info = E->value();
+ if (info.is_singleton) {
+ text_edit->add_keyword(info.name);
+ }
+ }
- text_edit->add_keyword_color(E->get(), colors_cache.keyword_color);
- }
-
- //colorize core types
- const Color basetype_color = colors_cache.basetype_color;
- text_edit->add_keyword_color("String", basetype_color);
- text_edit->add_keyword_color("Vector2", basetype_color);
- text_edit->add_keyword_color("Rect2", basetype_color);
- text_edit->add_keyword_color("Transform2D", basetype_color);
- text_edit->add_keyword_color("Vector3", basetype_color);
- text_edit->add_keyword_color("AABB", basetype_color);
- text_edit->add_keyword_color("Basis", basetype_color);
- text_edit->add_keyword_color("Plane", basetype_color);
- text_edit->add_keyword_color("Transform", basetype_color);
- text_edit->add_keyword_color("Quat", basetype_color);
- text_edit->add_keyword_color("Color", basetype_color);
- text_edit->add_keyword_color("Object", basetype_color);
- text_edit->add_keyword_color("NodePath", basetype_color);
- text_edit->add_keyword_color("RID", basetype_color);
- text_edit->add_keyword_color("Dictionary", basetype_color);
- text_edit->add_keyword_color("Array", basetype_color);
- text_edit->add_keyword_color("PoolByteArray", basetype_color);
- text_edit->add_keyword_color("PoolIntArray", basetype_color);
- text_edit->add_keyword_color("PoolRealArray", basetype_color);
- text_edit->add_keyword_color("PoolStringArray", basetype_color);
- text_edit->add_keyword_color("PoolVector2Array", basetype_color);
- text_edit->add_keyword_color("PoolVector3Array", basetype_color);
- text_edit->add_keyword_color("PoolColorArray", basetype_color);
-
- //colorize engine types
+ // engine types
List<StringName> types;
ClassDB::get_class_list(&types);
-
for (List<StringName>::Element *E = types.front(); E; E = E->next()) {
-
String n = E->get();
- if (n.begins_with("_"))
+ if (n.begins_with("_")) {
n = n.substr(1, n.length());
-
- text_edit->add_keyword_color(n, colors_cache.type_color);
+ }
+ text_edit->add_keyword(n);
}
- _update_member_keywords();
- //colorize user types
+ // user types
List<StringName> global_classes;
ScriptServer::get_global_class_list(&global_classes);
-
for (List<StringName>::Element *E = global_classes.front(); E; E = E->next()) {
-
- text_edit->add_keyword_color(E->get(), colors_cache.usertype_color);
+ text_edit->add_keyword(E->get());
}
- //colorize singleton autoloads (as types, just as engine singletons are)
- List<PropertyInfo> props;
- ProjectSettings::get_singleton()->get_property_list(&props);
- for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
- String s = E->get().name;
- if (!s.begins_with("autoload/")) {
- continue;
- }
- String path = ProjectSettings::get_singleton()->get(s);
- if (path.begins_with("*")) {
- text_edit->add_keyword_color(s.get_slice("/", 1), colors_cache.usertype_color);
- }
- }
-
- //colorize comments
- List<String> comments;
- script->get_language()->get_comment_delimiters(&comments);
-
- for (List<String>::Element *E = comments.front(); E; E = E->next()) {
-
- String comment = E->get();
- String beg = comment.get_slice(" ", 0);
- String end = comment.get_slice_count(" ") > 1 ? comment.get_slice(" ", 1) : String();
-
- text_edit->add_color_region(beg, end, colors_cache.comment_color, end == "");
+ List<String> keywords;
+ script->get_language()->get_reserved_words(&keywords);
+ for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
+ text_edit->add_keyword(E->get());
}
- //colorize strings
- List<String> strings;
- script->get_language()->get_string_delimiters(&strings);
- for (List<String>::Element *E = strings.front(); E; E = E->next()) {
-
- String string = E->get();
- String beg = string.get_slice(" ", 0);
- String end = string.get_slice_count(" ") > 1 ? string.get_slice(" ", 1) : String();
- text_edit->add_color_region(beg, end, colors_cache.string_color, end == "");
+ // core types
+ List<String> core_types;
+ script->get_language()->get_core_type_words(&core_types);
+ for (List<String>::Element *E = core_types.front(); E; E = E->next()) {
+ text_edit->add_keyword(E->get());
}
}
@@ -380,25 +290,20 @@ void ScriptTextEditor::_show_warnings_panel(bool p_show) {
warnings_panel->set_visible(p_show);
}
-void ScriptTextEditor::_error_pressed() {
- code_editor->goto_error();
-}
-
void ScriptTextEditor::_warning_clicked(Variant p_line) {
if (p_line.get_type() == Variant::INT) {
- code_editor->get_text_edit()->cursor_set_line(p_line.operator int64_t());
+ code_editor->get_text_editor()->cursor_set_line(p_line.operator int64_t());
} else if (p_line.get_type() == Variant::DICTIONARY) {
Dictionary meta = p_line.operator Dictionary();
- code_editor->get_text_edit()->insert_at("# warning-ignore:" + meta["code"].operator String(), meta["line"].operator int64_t() - 1);
+ code_editor->get_text_editor()->insert_at("# warning-ignore:" + meta["code"].operator String(), meta["line"].operator int64_t() - 1);
_validate_script();
}
}
void ScriptTextEditor::reload_text() {
-
ERR_FAIL_COND(script.is_null());
- TextEdit *te = code_editor->get_text_edit();
+ CodeEdit *te = code_editor->get_text_editor();
int column = te->cursor_get_column();
int row = te->cursor_get_line();
int h = te->get_h_scroll();
@@ -415,31 +320,21 @@ void ScriptTextEditor::reload_text() {
code_editor->update_line_and_column();
}
-void ScriptTextEditor::_notification(int p_what) {
-
- switch (p_what) {
- case NOTIFICATION_READY:
- _load_theme_settings();
- break;
- }
-}
-
-void ScriptTextEditor::add_callback(const String &p_function, PoolStringArray p_args) {
-
- String code = code_editor->get_text_edit()->get_text();
+void ScriptTextEditor::add_callback(const String &p_function, PackedStringArray p_args) {
+ String code = code_editor->get_text_editor()->get_text();
int pos = script->get_language()->find_function(p_function, code);
if (pos == -1) {
//does not exist
- code_editor->get_text_edit()->deselect();
- pos = code_editor->get_text_edit()->get_line_count() + 2;
+ code_editor->get_text_editor()->deselect();
+ pos = code_editor->get_text_editor()->get_line_count() + 2;
String func = script->get_language()->make_function("", p_function, p_args);
//code=code+func;
- code_editor->get_text_edit()->cursor_set_line(pos + 1);
- code_editor->get_text_edit()->cursor_set_column(1000000); //none shall be that big
- code_editor->get_text_edit()->insert_text_at_cursor("\n\n" + func);
+ code_editor->get_text_editor()->cursor_set_line(pos + 1);
+ code_editor->get_text_editor()->cursor_set_column(1000000); //none shall be that big
+ code_editor->get_text_editor()->insert_text_at_cursor("\n\n" + func);
}
- code_editor->get_text_edit()->cursor_set_line(pos);
- code_editor->get_text_edit()->cursor_set_column(1);
+ code_editor->get_text_editor()->cursor_set_line(pos);
+ code_editor->get_text_editor()->cursor_set_column(1);
}
bool ScriptTextEditor::show_members_overview() {
@@ -447,22 +342,22 @@ bool ScriptTextEditor::show_members_overview() {
}
void ScriptTextEditor::update_settings() {
-
+ code_editor->get_text_editor()->set_gutter_draw(connection_gutter, EditorSettings::get_singleton()->get("text_editor/appearance/show_info_gutter"));
code_editor->update_editor_settings();
}
bool ScriptTextEditor::is_unsaved() {
-
- return code_editor->get_text_edit()->get_version() != code_editor->get_text_edit()->get_saved_version();
+ const bool unsaved =
+ code_editor->get_text_editor()->get_version() != code_editor->get_text_editor()->get_saved_version() ||
+ script->get_path().empty(); // In memory.
+ return unsaved;
}
Variant ScriptTextEditor::get_edit_state() {
-
return code_editor->get_edit_state();
}
void ScriptTextEditor::set_edit_state(const Variant &p_state) {
-
code_editor->set_edit_state(p_state);
Dictionary state = p_state;
@@ -472,50 +367,45 @@ void ScriptTextEditor::set_edit_state(const Variant &p_state) {
_change_syntax_highlighter(idx);
}
}
+
+ if (editor_enabled) {
+ ensure_focus();
+ }
}
void ScriptTextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) {
-
code_editor->convert_case(p_case);
}
void ScriptTextEditor::trim_trailing_whitespace() {
-
code_editor->trim_trailing_whitespace();
}
void ScriptTextEditor::insert_final_newline() {
-
code_editor->insert_final_newline();
}
void ScriptTextEditor::convert_indent_to_spaces() {
-
code_editor->convert_indent_to_spaces();
}
void ScriptTextEditor::convert_indent_to_tabs() {
-
code_editor->convert_indent_to_tabs();
}
void ScriptTextEditor::tag_saved_version() {
-
- code_editor->get_text_edit()->tag_saved_version();
+ code_editor->get_text_editor()->tag_saved_version();
}
void ScriptTextEditor::goto_line(int p_line, bool p_with_error) {
-
code_editor->goto_line(p_line);
}
void ScriptTextEditor::goto_line_selection(int p_line, int p_begin, int p_end) {
-
code_editor->goto_line_selection(p_line, p_begin, p_end);
}
void ScriptTextEditor::goto_line_centered(int p_line) {
-
code_editor->goto_line_centered(p_line);
}
@@ -528,8 +418,7 @@ void ScriptTextEditor::clear_executing_line() {
}
void ScriptTextEditor::ensure_focus() {
-
- code_editor->get_text_edit()->grab_focus();
+ code_editor->get_text_editor()->grab_focus();
}
String ScriptTextEditor::get_name() {
@@ -538,30 +427,32 @@ String ScriptTextEditor::get_name() {
if (script->get_path().find("local://") == -1 && script->get_path().find("::") == -1) {
name = script->get_path().get_file();
if (is_unsaved()) {
+ if (script->get_path().empty()) {
+ name = TTR("[unsaved]");
+ }
name += "(*)";
}
- } else if (script->get_name() != "")
+ } else if (script->get_name() != "") {
name = script->get_name();
- else
+ } else {
name = script->get_class() + "(" + itos(script->get_instance_id()) + ")";
+ }
return name;
}
-Ref<Texture> ScriptTextEditor::get_icon() {
-
- if (get_parent_control() && get_parent_control()->has_icon(script->get_class(), "EditorIcons")) {
- return get_parent_control()->get_icon(script->get_class(), "EditorIcons");
+Ref<Texture2D> ScriptTextEditor::get_theme_icon() {
+ if (get_parent_control() && get_parent_control()->has_theme_icon(script->get_class(), "EditorIcons")) {
+ return get_parent_control()->get_theme_icon(script->get_class(), "EditorIcons");
}
- return Ref<Texture>();
+ return Ref<Texture2D>();
}
void ScriptTextEditor::_validate_script() {
-
String errortxt;
int line = -1, col;
- TextEdit *te = code_editor->get_text_edit();
+ CodeEdit *te = code_editor->get_text_editor();
String text = te->get_text();
List<String> fnc;
@@ -579,12 +470,11 @@ void ScriptTextEditor::_validate_script() {
if (!script->is_tool()) {
script->set_source_code(text);
script->update_exports();
- _update_member_keywords();
+ te->get_syntax_highlighter()->update_cache();
}
functions.clear();
for (List<String>::Element *E = fnc.front(); E; E = E->next()) {
-
functions.push_back(E->get());
}
script_is_valid = true;
@@ -603,12 +493,12 @@ void ScriptTextEditor::_validate_script() {
Connection connection = E->get();
String base_path = base->get_name();
- String source_path = base == connection.source ? base_path : base_path + "/" + base->get_path_to(Object::cast_to<Node>(connection.source));
- String target_path = base == connection.target ? base_path : base_path + "/" + base->get_path_to(Object::cast_to<Node>(connection.target));
+ String source_path = base == connection.signal.get_object() ? base_path : base_path + "/" + base->get_path_to(Object::cast_to<Node>(connection.signal.get_object()));
+ String target_path = base == connection.callable.get_object() ? base_path : base_path + "/" + base->get_path_to(Object::cast_to<Node>(connection.callable.get_object()));
warnings_panel->push_cell();
- warnings_panel->push_color(warnings_panel->get_color("warning_color", "Editor"));
- warnings_panel->add_text(vformat(TTR("Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."), connection.method, connection.signal, source_path, target_path));
+ warnings_panel->push_color(warnings_panel->get_theme_color("warning_color", "Editor"));
+ warnings_panel->add_text(vformat(TTR("Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."), connection.callable.get_method(), connection.signal.get_name(), source_path, target_path));
warnings_panel->pop(); // Color.
warnings_panel->pop(); // Cell.
}
@@ -625,26 +515,29 @@ void ScriptTextEditor::_validate_script() {
for (List<ScriptLanguage::Warning>::Element *E = warnings.front(); E; E = E->next()) {
ScriptLanguage::Warning w = E->get();
+ Dictionary ignore_meta;
+ ignore_meta["line"] = w.start_line;
+ ignore_meta["code"] = w.string_code.to_lower();
warnings_panel->push_cell();
- warnings_panel->push_meta(w.line - 1);
- warnings_panel->push_color(warnings_panel->get_color("warning_color", "Editor"));
- warnings_panel->add_text(TTR("Line") + " " + itos(w.line));
- warnings_panel->add_text(" (" + w.string_code + "):");
+ warnings_panel->push_meta(ignore_meta);
+ warnings_panel->push_color(
+ warnings_panel->get_theme_color("accent_color", "Editor").lerp(warnings_panel->get_theme_color("mono_color", "Editor"), 0.5));
+ warnings_panel->add_text(TTR("[Ignore]"));
warnings_panel->pop(); // Color.
- warnings_panel->pop(); // Meta goto.
+ warnings_panel->pop(); // Meta ignore.
warnings_panel->pop(); // Cell.
warnings_panel->push_cell();
- warnings_panel->add_text(w.message);
+ warnings_panel->push_meta(w.start_line - 1);
+ warnings_panel->push_color(warnings_panel->get_theme_color("warning_color", "Editor"));
+ warnings_panel->add_text(TTR("Line") + " " + itos(w.start_line));
+ warnings_panel->add_text(" (" + w.string_code + "):");
+ warnings_panel->pop(); // Color.
+ warnings_panel->pop(); // Meta goto.
warnings_panel->pop(); // Cell.
- Dictionary ignore_meta;
- ignore_meta["line"] = w.line;
- ignore_meta["code"] = w.string_code.to_lower();
warnings_panel->push_cell();
- warnings_panel->push_meta(ignore_meta);
- warnings_panel->add_text(TTR("(ignore)"));
- warnings_panel->pop(); // Meta ignore.
+ warnings_panel->add_text(w.message);
warnings_panel->pop(); // Cell.
}
warnings_panel->pop(); // Table.
@@ -656,16 +549,16 @@ void ScriptTextEditor::_validate_script() {
te->set_line_as_marked(i, line == i);
if (highlight_safe) {
if (safe_lines.has(i + 1)) {
- te->set_line_as_safe(i, true);
+ te->set_line_gutter_item_color(i, line_number_gutter, safe_line_number_color);
last_is_safe = true;
} else if (last_is_safe && (te->is_line_comment(i) || te->get_line(i).strip_edges().empty())) {
- te->set_line_as_safe(i, true);
+ te->set_line_gutter_item_color(i, line_number_gutter, safe_line_number_color);
} else {
- te->set_line_as_safe(i, false);
+ te->set_line_gutter_item_color(i, line_number_gutter, default_line_number_color);
last_is_safe = false;
}
} else {
- te->set_line_as_safe(i, false);
+ te->set_line_gutter_item_color(line, 1, default_line_number_color);
}
}
@@ -674,7 +567,6 @@ void ScriptTextEditor::_validate_script() {
}
void ScriptTextEditor::_update_bookmark_list() {
-
bookmarks_menu->clear();
bookmarks_menu->set_size(Size2(1, 1));
@@ -683,7 +575,7 @@ void ScriptTextEditor::_update_bookmark_list() {
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_bookmark"), BOOKMARK_GOTO_NEXT);
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_bookmark"), BOOKMARK_GOTO_PREV);
- Array bookmark_list = code_editor->get_text_edit()->get_bookmarks_array();
+ Array bookmark_list = code_editor->get_text_editor()->get_bookmarked_lines();
if (bookmark_list.size() == 0) {
return;
}
@@ -693,7 +585,7 @@ void ScriptTextEditor::_update_bookmark_list() {
for (int i = 0; i < bookmark_list.size(); i++) {
// Strip edges to remove spaces or tabs.
// Also replace any tabs by spaces, since we can't print tabs in the menu.
- String line = code_editor->get_text_edit()->get_line(bookmark_list[i]).replace("\t", " ").strip_edges();
+ String line = code_editor->get_text_editor()->get_line(bookmark_list[i]).replace("\t", " ").strip_edges();
// Limit the size of the line if too big.
if (line.length() > 50) {
@@ -706,17 +598,15 @@ void ScriptTextEditor::_update_bookmark_list() {
}
void ScriptTextEditor::_bookmark_item_pressed(int p_idx) {
-
if (p_idx < 4) { // Any item before the separator.
_edit_option(bookmarks_menu->get_item_id(p_idx));
} else {
code_editor->goto_line(bookmarks_menu->get_item_metadata(p_idx));
- code_editor->get_text_edit()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
+ code_editor->get_text_editor()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
}
}
static Vector<Node *> _find_all_node_for_script(Node *p_base, Node *p_current, const Ref<Script> &p_script) {
-
Vector<Node *> nodes;
if (p_current->get_owner() != p_base && p_base != p_current) {
@@ -737,29 +627,32 @@ static Vector<Node *> _find_all_node_for_script(Node *p_base, Node *p_current, c
}
static Node *_find_node_for_script(Node *p_base, Node *p_current, const Ref<Script> &p_script) {
-
- if (p_current->get_owner() != p_base && p_base != p_current)
- return NULL;
+ if (p_current->get_owner() != p_base && p_base != p_current) {
+ return nullptr;
+ }
Ref<Script> c = p_current->get_script();
- if (c == p_script)
+ if (c == p_script) {
return p_current;
+ }
for (int i = 0; i < p_current->get_child_count(); i++) {
Node *found = _find_node_for_script(p_base, p_current->get_child(i), p_script);
- if (found)
+ if (found) {
return found;
+ }
}
- return NULL;
+ return nullptr;
}
-static void _find_changed_scripts_for_external_editor(Node *p_base, Node *p_current, Set<Ref<Script> > &r_scripts) {
-
- if (p_current->get_owner() != p_base && p_base != p_current)
+static void _find_changed_scripts_for_external_editor(Node *p_base, Node *p_current, Set<Ref<Script>> &r_scripts) {
+ if (p_current->get_owner() != p_base && p_base != p_current) {
return;
+ }
Ref<Script> c = p_current->get_script();
- if (c.is_valid())
+ if (c.is_valid()) {
r_scripts.insert(c);
+ }
for (int i = 0; i < p_current->get_child_count(); i++) {
_find_changed_scripts_for_external_editor(p_base, p_current->get_child(i), r_scripts);
@@ -767,28 +660,27 @@ static void _find_changed_scripts_for_external_editor(Node *p_base, Node *p_curr
}
void ScriptEditor::_update_modified_scripts_for_external_editor(Ref<Script> p_for_script) {
-
- if (!bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")))
+ if (!bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor"))) {
return;
+ }
ERR_FAIL_COND(!get_tree());
- Set<Ref<Script> > scripts;
+ Set<Ref<Script>> scripts;
Node *base = get_tree()->get_edited_scene_root();
if (base) {
_find_changed_scripts_for_external_editor(base, base, scripts);
}
- for (Set<Ref<Script> >::Element *E = scripts.front(); E; E = E->next()) {
-
+ for (Set<Ref<Script>>::Element *E = scripts.front(); E; E = E->next()) {
Ref<Script> script = E->get();
- if (p_for_script.is_valid() && p_for_script != script)
+ if (p_for_script.is_valid() && p_for_script != script) {
continue;
+ }
if (script->get_path() == "" || script->get_path().find("local://") != -1 || script->get_path().find("::") != -1) {
-
continue; //internal script, who cares, though weird
}
@@ -796,7 +688,6 @@ void ScriptEditor::_update_modified_scripts_for_external_editor(Ref<Script> p_fo
uint64_t date = FileAccess::get_modified_time(script->get_path());
if (last_date != date) {
-
Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), true);
ERR_CONTINUE(!rel_script.is_valid());
script->set_source_code(rel_script->get_source_code());
@@ -807,14 +698,14 @@ void ScriptEditor::_update_modified_scripts_for_external_editor(Ref<Script> p_fo
}
void ScriptTextEditor::_code_complete_scripts(void *p_ud, const String &p_code, List<ScriptCodeCompletionOption> *r_options, bool &r_force) {
-
ScriptTextEditor *ste = (ScriptTextEditor *)p_ud;
ste->_code_complete_script(p_code, r_options, r_force);
}
void ScriptTextEditor::_code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options, bool &r_force) {
-
- if (color_panel->is_visible_in_tree()) return;
+ if (color_panel->is_visible()) {
+ return;
+ }
Node *base = get_tree()->get_edited_scene_root();
if (base) {
base = _find_node_for_script(base, base, script);
@@ -822,12 +713,11 @@ void ScriptTextEditor::_code_complete_script(const String &p_code, List<ScriptCo
String hint;
Error err = script->get_language()->complete_code(p_code, script->get_path(), base, r_options, r_force, hint);
if (err == OK) {
- code_editor->get_text_edit()->set_code_hint(hint);
+ code_editor->get_text_editor()->set_code_hint(hint);
}
}
void ScriptTextEditor::_update_breakpoint_list() {
-
breakpoints_menu->clear();
breakpoints_menu->set_size(Size2(1, 1));
@@ -836,7 +726,7 @@ void ScriptTextEditor::_update_breakpoint_list() {
breakpoints_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_breakpoint"), DEBUG_GOTO_NEXT_BREAKPOINT);
breakpoints_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_breakpoint"), DEBUG_GOTO_PREV_BREAKPOINT);
- Array breakpoint_list = code_editor->get_text_edit()->get_breakpoints_array();
+ Array breakpoint_list = code_editor->get_text_editor()->get_breakpointed_lines();
if (breakpoint_list.size() == 0) {
return;
}
@@ -846,7 +736,7 @@ void ScriptTextEditor::_update_breakpoint_list() {
for (int i = 0; i < breakpoint_list.size(); i++) {
// Strip edges to remove spaces or tabs.
// Also replace any tabs by spaces, since we can't print tabs in the menu.
- String line = code_editor->get_text_edit()->get_line(breakpoint_list[i]).replace("\t", " ").strip_edges();
+ String line = code_editor->get_text_editor()->get_line(breakpoint_list[i]).replace("\t", " ").strip_edges();
// Limit the size of the line if too big.
if (line.length() > 50) {
@@ -859,22 +749,19 @@ void ScriptTextEditor::_update_breakpoint_list() {
}
void ScriptTextEditor::_breakpoint_item_pressed(int p_idx) {
-
if (p_idx < 4) { // Any item before the separator.
_edit_option(breakpoints_menu->get_item_id(p_idx));
} else {
code_editor->goto_line(breakpoints_menu->get_item_metadata(p_idx));
- code_editor->get_text_edit()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
+ code_editor->get_text_editor()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
}
}
void ScriptTextEditor::_breakpoint_toggled(int p_row) {
-
- ScriptEditor::get_singleton()->get_debugger()->set_breakpoint(script->get_path(), p_row + 1, code_editor->get_text_edit()->is_line_set_as_breakpoint(p_row));
+ EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), p_row + 1, code_editor->get_text_editor()->is_line_breakpointed(p_row));
}
void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_column) {
-
Node *base = get_tree()->get_edited_scene_root();
if (base) {
base = _find_node_for_script(base, base, script);
@@ -893,15 +780,13 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
EditorNode::get_singleton()->load_resource(p_symbol);
}
- } else if (script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK) {
-
+ } else if (script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK) {
_goto_line(p_row);
result.class_name = result.class_name.trim_prefix("_");
switch (result.type) {
case ScriptLanguage::LookupResult::RESULT_SCRIPT_LOCATION: {
-
if (result.script.is_valid()) {
emit_signal("request_open_script_at_line", result.script, result.location - 1);
} else {
@@ -913,7 +798,6 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
emit_signal("go_to_help", "class_name:" + result.class_name);
} break;
case ScriptLanguage::LookupResult::RESULT_CLASS_CONSTANT: {
-
StringName cname = result.class_name;
bool success;
while (true) {
@@ -934,7 +818,6 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
} break;
case ScriptLanguage::LookupResult::RESULT_CLASS_METHOD: {
-
StringName cname = result.class_name;
while (true) {
@@ -950,7 +833,6 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
} break;
case ScriptLanguage::LookupResult::RESULT_CLASS_ENUM: {
-
StringName cname = result.class_name;
StringName success;
while (true) {
@@ -970,18 +852,74 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
emit_signal("go_to_help", "class_global:" + result.class_name + ":" + result.class_member);
} break;
}
+ } else if (ProjectSettings::get_singleton()->has_autoload(p_symbol)) {
+ // Check for Autoload scenes.
+ const ProjectSettings::AutoloadInfo &info = ProjectSettings::get_singleton()->get_autoload(p_symbol);
+ if (info.is_singleton) {
+ EditorNode::get_singleton()->load_scene(info.path);
+ }
+ } else if (p_symbol.is_rel_path()) {
+ // Every symbol other than absolute path is relative path so keep this condition at last.
+ String path = _get_absolute_path(p_symbol);
+ if (FileAccess::exists(path)) {
+ List<String> scene_extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions);
+
+ if (scene_extensions.find(path.get_extension())) {
+ EditorNode::get_singleton()->load_scene(path);
+ } else {
+ EditorNode::get_singleton()->load_resource(path);
+ }
+ }
}
}
+void ScriptTextEditor::_validate_symbol(const String &p_symbol) {
+ CodeEdit *text_edit = code_editor->get_text_editor();
+
+ Node *base = get_tree()->get_edited_scene_root();
+ if (base) {
+ base = _find_node_for_script(base, base, script);
+ }
+
+ ScriptLanguage::LookupResult result;
+ if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK || (ProjectSettings::get_singleton()->has_autoload(p_symbol) && ProjectSettings::get_singleton()->get_autoload(p_symbol).is_singleton)) {
+ text_edit->set_highlighted_word(p_symbol);
+ } else if (p_symbol.is_rel_path()) {
+ String path = _get_absolute_path(p_symbol);
+ if (FileAccess::exists(path)) {
+ text_edit->set_highlighted_word(p_symbol);
+ } else {
+ text_edit->set_highlighted_word(String());
+ }
+
+ } else {
+ text_edit->set_highlighted_word(String());
+ }
+}
+
+String ScriptTextEditor::_get_absolute_path(const String &rel_path) {
+ String base_path = script->get_path().get_base_dir();
+ String path = base_path.plus_file(rel_path);
+ return path.replace("///", "//").simplify_path();
+}
+
void ScriptTextEditor::update_toggle_scripts_button() {
- if (code_editor != NULL) {
+ if (code_editor != nullptr) {
code_editor->update_toggle_scripts_button();
}
}
void ScriptTextEditor::_update_connected_methods() {
- TextEdit *text_edit = code_editor->get_text_edit();
- text_edit->clear_info_icons();
+ CodeEdit *text_edit = code_editor->get_text_editor();
+ for (int i = 0; i < text_edit->get_line_count(); i++) {
+ if (text_edit->get_line_gutter_metadata(i, connection_gutter) == "") {
+ continue;
+ }
+ text_edit->set_line_gutter_metadata(i, connection_gutter, "");
+ text_edit->set_line_gutter_icon(i, connection_gutter, nullptr);
+ text_edit->set_line_gutter_clickable(i, connection_gutter, false);
+ }
missing_connections.clear();
if (!script_is_valid) {
@@ -1006,24 +944,26 @@ void ScriptTextEditor::_update_connected_methods() {
}
// As deleted nodes are still accessible via the undo/redo system, check if they're still on the tree.
- Node *source = Object::cast_to<Node>(connection.source);
+ Node *source = Object::cast_to<Node>(connection.signal.get_object());
if (source && !source->is_inside_tree()) {
continue;
}
- if (methods_found.has(connection.method)) {
+ if (methods_found.has(connection.callable.get_method())) {
continue;
}
- if (!ClassDB::has_method(script->get_instance_base_type(), connection.method)) {
+ if (!ClassDB::has_method(script->get_instance_base_type(), connection.callable.get_method())) {
int line = -1;
for (int j = 0; j < functions.size(); j++) {
String name = functions[j].get_slice(":", 0);
- if (name == connection.method) {
- line = functions[j].get_slice(":", 1).to_int();
- text_edit->set_line_info_icon(line - 1, get_parent_control()->get_icon("Slot", "EditorIcons"), connection.method);
- methods_found.insert(connection.method);
+ if (name == connection.callable.get_method()) {
+ line = functions[j].get_slice(":", 1).to_int() - 1;
+ text_edit->set_line_gutter_metadata(line, connection_gutter, connection.callable.get_method());
+ text_edit->set_line_gutter_icon(line, connection_gutter, get_parent_control()->get_theme_icon("Slot", "EditorIcons"));
+ text_edit->set_line_gutter_clickable(line, connection_gutter, true);
+ methods_found.insert(connection.callable.get_method());
break;
}
}
@@ -1036,7 +976,7 @@ void ScriptTextEditor::_update_connected_methods() {
bool found_inherited_function = false;
Ref<Script> inherited_script = script->get_base_script();
while (!inherited_script.is_null()) {
- if (inherited_script->has_method(connection.method)) {
+ if (inherited_script->has_method(connection.callable.get_method())) {
found_inherited_function = true;
break;
}
@@ -1052,112 +992,119 @@ void ScriptTextEditor::_update_connected_methods() {
}
}
-void ScriptTextEditor::_lookup_connections(int p_row, String p_method) {
+void ScriptTextEditor::_update_gutter_indexes() {
+ for (int i = 0; i < code_editor->get_text_editor()->get_gutter_count(); i++) {
+ if (code_editor->get_text_editor()->get_gutter_name(i) == "connection_gutter") {
+ connection_gutter = i;
+ continue;
+ }
+
+ if (code_editor->get_text_editor()->get_gutter_name(i) == "line_numbers") {
+ line_number_gutter = i;
+ continue;
+ }
+ }
+}
+
+void ScriptTextEditor::_gutter_clicked(int p_line, int p_gutter) {
+ if (p_gutter != connection_gutter) {
+ return;
+ }
+
+ String method = code_editor->get_text_editor()->get_line_gutter_metadata(p_line, p_gutter);
+ if (method == "") {
+ return;
+ }
+
Node *base = get_tree()->get_edited_scene_root();
if (!base) {
return;
}
Vector<Node *> nodes = _find_all_node_for_script(base, base, script);
- connection_info_dialog->popup_connections(p_method, nodes);
+ connection_info_dialog->popup_connections(method, nodes);
}
void ScriptTextEditor::_edit_option(int p_op) {
-
- TextEdit *tx = code_editor->get_text_edit();
+ CodeEdit *tx = code_editor->get_text_editor();
switch (p_op) {
case EDIT_UNDO: {
-
tx->undo();
tx->call_deferred("grab_focus");
} break;
case EDIT_REDO: {
-
tx->redo();
tx->call_deferred("grab_focus");
} break;
case EDIT_CUT: {
-
tx->cut();
tx->call_deferred("grab_focus");
} break;
case EDIT_COPY: {
-
tx->copy();
tx->call_deferred("grab_focus");
} break;
case EDIT_PASTE: {
-
tx->paste();
tx->call_deferred("grab_focus");
} break;
case EDIT_SELECT_ALL: {
-
tx->select_all();
tx->call_deferred("grab_focus");
} break;
case EDIT_MOVE_LINE_UP: {
-
code_editor->move_lines_up();
} break;
case EDIT_MOVE_LINE_DOWN: {
-
code_editor->move_lines_down();
} break;
case EDIT_INDENT_LEFT: {
-
Ref<Script> scr = script;
- if (scr.is_null())
+ if (scr.is_null()) {
return;
+ }
tx->indent_left();
} break;
case EDIT_INDENT_RIGHT: {
-
Ref<Script> scr = script;
- if (scr.is_null())
+ if (scr.is_null()) {
return;
+ }
tx->indent_right();
} break;
case EDIT_DELETE_LINE: {
-
code_editor->delete_lines();
} break;
case EDIT_CLONE_DOWN: {
-
code_editor->clone_lines_down();
} break;
case EDIT_TOGGLE_FOLD_LINE: {
-
tx->toggle_fold_line(tx->cursor_get_line());
tx->update();
} break;
case EDIT_FOLD_ALL_LINES: {
-
tx->fold_all_lines();
tx->update();
} break;
case EDIT_UNFOLD_ALL_LINES: {
-
tx->unhide_all_lines();
tx->update();
} break;
case EDIT_TOGGLE_COMMENT: {
-
_edit_option_toggle_inline_comment();
} break;
case EDIT_COMPLETE: {
-
tx->query_code_comple();
} break;
case EDIT_AUTO_INDENT: {
-
String text = tx->get_text();
Ref<Script> scr = script;
- if (scr.is_null())
+ if (scr.is_null()) {
return;
+ }
tx->begin_complex_operation();
int begin, end;
@@ -1181,38 +1128,30 @@ void ScriptTextEditor::_edit_option(int p_op) {
tx->end_complex_operation();
} break;
case EDIT_TRIM_TRAILING_WHITESAPCE: {
-
trim_trailing_whitespace();
} break;
case EDIT_CONVERT_INDENT_TO_SPACES: {
-
convert_indent_to_spaces();
} break;
case EDIT_CONVERT_INDENT_TO_TABS: {
-
convert_indent_to_tabs();
} break;
case EDIT_PICK_COLOR: {
-
color_panel->popup();
} break;
case EDIT_TO_UPPERCASE: {
-
_convert_case(CodeTextEditor::UPPER);
} break;
case EDIT_TO_LOWERCASE: {
-
_convert_case(CodeTextEditor::LOWER);
} break;
case EDIT_CAPITALIZE: {
-
_convert_case(CodeTextEditor::CAPITALIZE);
} break;
case EDIT_EVALUATE: {
-
Expression expression;
- Vector<String> lines = code_editor->get_text_edit()->get_selection_text().split("\n");
- PoolStringArray results;
+ Vector<String> lines = code_editor->get_text_editor()->get_selection_text().split("\n");
+ PackedStringArray results;
for (int i = 0; i < lines.size(); i++) {
String line = lines[i];
@@ -1221,91 +1160,80 @@ void ScriptTextEditor::_edit_option(int p_op) {
if (expression.parse(line) == OK) {
Variant result = expression.execute(Array(), Variant(), false);
if (expression.get_error_text() == "") {
- results.append(whitespace + result.get_construct_string());
+ results.push_back(whitespace + result.get_construct_string());
} else {
- results.append(line);
+ results.push_back(line);
}
} else {
- results.append(line);
+ results.push_back(line);
}
}
- code_editor->get_text_edit()->begin_complex_operation(); //prevents creating a two-step undo
- code_editor->get_text_edit()->insert_text_at_cursor(results.join("\n"));
- code_editor->get_text_edit()->end_complex_operation();
+ code_editor->get_text_editor()->begin_complex_operation(); //prevents creating a two-step undo
+ code_editor->get_text_editor()->insert_text_at_cursor(String("\n").join(results));
+ code_editor->get_text_editor()->end_complex_operation();
} break;
case SEARCH_FIND: {
-
code_editor->get_find_replace_bar()->popup_search();
} break;
case SEARCH_FIND_NEXT: {
-
code_editor->get_find_replace_bar()->search_next();
} break;
case SEARCH_FIND_PREV: {
-
code_editor->get_find_replace_bar()->search_prev();
} break;
case SEARCH_REPLACE: {
-
code_editor->get_find_replace_bar()->popup_replace();
} break;
case SEARCH_IN_FILES: {
-
- String selected_text = code_editor->get_text_edit()->get_selection_text();
+ String selected_text = code_editor->get_text_editor()->get_selection_text();
// Yep, because it doesn't make sense to instance this dialog for every single script open...
// So this will be delegated to the ScriptEditor.
emit_signal("search_in_files_requested", selected_text);
} break;
- case SEARCH_LOCATE_FUNCTION: {
+ case REPLACE_IN_FILES: {
+ String selected_text = code_editor->get_text_editor()->get_selection_text();
+ emit_signal("replace_in_files_requested", selected_text);
+ } break;
+ case SEARCH_LOCATE_FUNCTION: {
quick_open->popup_dialog(get_functions());
quick_open->set_title(TTR("Go to Function"));
} break;
case SEARCH_GOTO_LINE: {
-
goto_line_dialog->popup_find_line(tx);
} break;
case BOOKMARK_TOGGLE: {
-
code_editor->toggle_bookmark();
} break;
case BOOKMARK_GOTO_NEXT: {
-
code_editor->goto_next_bookmark();
} break;
case BOOKMARK_GOTO_PREV: {
-
code_editor->goto_prev_bookmark();
} break;
case BOOKMARK_REMOVE_ALL: {
-
code_editor->remove_all_bookmarks();
} break;
case DEBUG_TOGGLE_BREAKPOINT: {
-
int line = tx->cursor_get_line();
- bool dobreak = !tx->is_line_set_as_breakpoint(line);
+ bool dobreak = !tx->is_line_breakpointed(line);
tx->set_line_as_breakpoint(line, dobreak);
- ScriptEditor::get_singleton()->get_debugger()->set_breakpoint(script->get_path(), line + 1, dobreak);
+ EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak);
} break;
case DEBUG_REMOVE_ALL_BREAKPOINTS: {
+ Array bpoints = tx->get_breakpointed_lines();
- List<int> bpoints;
- tx->get_breakpoints(&bpoints);
-
- for (List<int>::Element *E = bpoints.front(); E; E = E->next()) {
- int line = E->get();
- bool dobreak = !tx->is_line_set_as_breakpoint(line);
+ for (int i = 0; i < bpoints.size(); i++) {
+ int line = bpoints[i];
+ bool dobreak = !tx->is_line_breakpointed(line);
tx->set_line_as_breakpoint(line, dobreak);
- ScriptEditor::get_singleton()->get_debugger()->set_breakpoint(script->get_path(), line + 1, dobreak);
+ EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak);
}
} break;
case DEBUG_GOTO_NEXT_BREAKPOINT: {
-
- List<int> bpoints;
- tx->get_breakpoints(&bpoints);
+ Array bpoints = tx->get_breakpointed_lines();
if (bpoints.size() <= 0) {
return;
}
@@ -1313,13 +1241,13 @@ void ScriptTextEditor::_edit_option(int p_op) {
int line = tx->cursor_get_line();
// wrap around
- if (line >= bpoints[bpoints.size() - 1]) {
+ if (line >= (int)bpoints[bpoints.size() - 1]) {
tx->unfold_line(bpoints[0]);
tx->cursor_set_line(bpoints[0]);
tx->center_viewport_to_cursor();
} else {
- for (List<int>::Element *E = bpoints.front(); E; E = E->next()) {
- int bline = E->get();
+ for (int i = 0; i < bpoints.size(); i++) {
+ int bline = bpoints[i];
if (bline > line) {
tx->unfold_line(bline);
tx->cursor_set_line(bline);
@@ -1331,22 +1259,20 @@ void ScriptTextEditor::_edit_option(int p_op) {
} break;
case DEBUG_GOTO_PREV_BREAKPOINT: {
-
- List<int> bpoints;
- tx->get_breakpoints(&bpoints);
+ Array bpoints = tx->get_breakpointed_lines();
if (bpoints.size() <= 0) {
return;
}
int line = tx->cursor_get_line();
// wrap around
- if (line <= bpoints[0]) {
+ if (line <= (int)bpoints[0]) {
tx->unfold_line(bpoints[bpoints.size() - 1]);
tx->cursor_set_line(bpoints[bpoints.size() - 1]);
tx->center_viewport_to_cursor();
} else {
- for (List<int>::Element *E = bpoints.back(); E; E = E->prev()) {
- int bline = E->get();
+ for (int i = bpoints.size(); i >= 0; i--) {
+ int bline = bpoints[i];
if (bline < line) {
tx->unfold_line(bline);
tx->cursor_set_line(bline);
@@ -1358,19 +1284,19 @@ void ScriptTextEditor::_edit_option(int p_op) {
} break;
case HELP_CONTEXTUAL: {
-
String text = tx->get_selection_text();
- if (text == "")
+ if (text == "") {
text = tx->get_word_under_cursor();
+ }
if (text != "") {
emit_signal("request_help", text);
}
} break;
case LOOKUP_SYMBOL: {
-
String text = tx->get_word_under_cursor();
- if (text == "")
+ if (text == "") {
text = tx->get_selection_text();
+ }
if (text != "") {
_lookup_symbol(text, tx->cursor_get_line(), tx->cursor_get_column());
}
@@ -1379,8 +1305,9 @@ void ScriptTextEditor::_edit_option(int p_op) {
}
void ScriptTextEditor::_edit_option_toggle_inline_comment() {
- if (script.is_null())
+ if (script.is_null()) {
return;
+ }
String delimiter = "#";
List<String> comment_delimiters;
@@ -1397,58 +1324,53 @@ void ScriptTextEditor::_edit_option_toggle_inline_comment() {
code_editor->toggle_inline_comment(delimiter);
}
-void ScriptTextEditor::add_syntax_highlighter(SyntaxHighlighter *p_highlighter) {
- highlighters[p_highlighter->get_name()] = p_highlighter;
- highlighter_menu->add_radio_check_item(p_highlighter->get_name());
-}
+void ScriptTextEditor::add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) {
+ ERR_FAIL_COND(p_highlighter.is_null());
-void ScriptTextEditor::set_syntax_highlighter(SyntaxHighlighter *p_highlighter) {
- TextEdit *te = code_editor->get_text_edit();
- te->_set_syntax_highlighting(p_highlighter);
- if (p_highlighter != NULL)
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(p_highlighter->get_name()), true);
- else
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(TTR("Standard")), true);
+ highlighters[p_highlighter->_get_name()] = p_highlighter;
+ highlighter_menu->add_radio_check_item(p_highlighter->_get_name());
}
-void ScriptTextEditor::_change_syntax_highlighter(int p_idx) {
- Map<String, SyntaxHighlighter *>::Element *el = highlighters.front();
- while (el != NULL) {
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(el->key()), false);
+void ScriptTextEditor::set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) {
+ ERR_FAIL_COND(p_highlighter.is_null());
+
+ Map<String, Ref<EditorSyntaxHighlighter>>::Element *el = highlighters.front();
+ while (el != nullptr) {
+ int highlighter_index = highlighter_menu->get_item_idx_from_text(el->key());
+ highlighter_menu->set_item_checked(highlighter_index, el->value() == p_highlighter);
el = el->next();
}
- // highlighter_menu->set_item_checked(p_idx, true);
+
+ CodeEdit *te = code_editor->get_text_editor();
+ p_highlighter->_set_edited_resource(script);
+ te->set_syntax_highlighter(p_highlighter);
+}
+
+void ScriptTextEditor::_change_syntax_highlighter(int p_idx) {
set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]);
}
-void ScriptTextEditor::_bind_methods() {
+void ScriptTextEditor::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_THEME_CHANGED: {
+ code_editor->get_text_editor()->set_gutter_width(connection_gutter, code_editor->get_text_editor()->get_row_height());
+ } break;
+ default:
+ break;
+ }
+}
- ClassDB::bind_method("_validate_script", &ScriptTextEditor::_validate_script);
- ClassDB::bind_method("_update_bookmark_list", &ScriptTextEditor::_update_bookmark_list);
- ClassDB::bind_method("_bookmark_item_pressed", &ScriptTextEditor::_bookmark_item_pressed);
- ClassDB::bind_method("_load_theme_settings", &ScriptTextEditor::_load_theme_settings);
- ClassDB::bind_method("_update_breakpoint_list", &ScriptTextEditor::_update_breakpoint_list);
- ClassDB::bind_method("_breakpoint_item_pressed", &ScriptTextEditor::_breakpoint_item_pressed);
- ClassDB::bind_method("_breakpoint_toggled", &ScriptTextEditor::_breakpoint_toggled);
- ClassDB::bind_method("_lookup_connections", &ScriptTextEditor::_lookup_connections);
+void ScriptTextEditor::_bind_methods() {
ClassDB::bind_method("_update_connected_methods", &ScriptTextEditor::_update_connected_methods);
- ClassDB::bind_method("_change_syntax_highlighter", &ScriptTextEditor::_change_syntax_highlighter);
- ClassDB::bind_method("_edit_option", &ScriptTextEditor::_edit_option);
- ClassDB::bind_method("_goto_line", &ScriptTextEditor::_goto_line);
- ClassDB::bind_method("_lookup_symbol", &ScriptTextEditor::_lookup_symbol);
- ClassDB::bind_method("_text_edit_gui_input", &ScriptTextEditor::_text_edit_gui_input);
- ClassDB::bind_method("_show_warnings_panel", &ScriptTextEditor::_show_warnings_panel);
- ClassDB::bind_method("_error_pressed", &ScriptTextEditor::_error_pressed);
- ClassDB::bind_method("_warning_clicked", &ScriptTextEditor::_warning_clicked);
- ClassDB::bind_method("_color_changed", &ScriptTextEditor::_color_changed);
ClassDB::bind_method("get_drag_data_fw", &ScriptTextEditor::get_drag_data_fw);
ClassDB::bind_method("can_drop_data_fw", &ScriptTextEditor::can_drop_data_fw);
ClassDB::bind_method("drop_data_fw", &ScriptTextEditor::drop_data_fw);
+
+ ClassDB::bind_method(D_METHOD("add_syntax_highlighter", "highlighter"), &ScriptTextEditor::add_syntax_highlighter);
}
Control *ScriptTextEditor::get_edit_menu() {
-
return edit_hb;
}
@@ -1457,43 +1379,38 @@ void ScriptTextEditor::clear_edit_menu() {
}
void ScriptTextEditor::reload(bool p_soft) {
-
- TextEdit *te = code_editor->get_text_edit();
+ CodeEdit *te = code_editor->get_text_editor();
Ref<Script> scr = script;
- if (scr.is_null())
+ if (scr.is_null()) {
return;
+ }
scr->set_source_code(te->get_text());
bool soft = p_soft || scr->get_instance_base_type() == "EditorPlugin"; //always soft-reload editor plugins
scr->get_language()->reload_tool_script(scr, soft);
}
-void ScriptTextEditor::get_breakpoints(List<int> *p_breakpoints) {
-
- code_editor->get_text_edit()->get_breakpoints(p_breakpoints);
+Array ScriptTextEditor::get_breakpoints() {
+ return code_editor->get_text_editor()->get_breakpointed_lines();
}
void ScriptTextEditor::set_tooltip_request_func(String p_method, Object *p_obj) {
-
- code_editor->get_text_edit()->set_tooltip_request_func(p_obj, p_method, this);
+ code_editor->get_text_editor()->set_tooltip_request_func(p_obj, p_method, this);
}
void ScriptTextEditor::set_debugger_active(bool p_active) {
}
Variant ScriptTextEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
return Variant();
}
bool ScriptTextEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary d = p_data;
if (d.has("type") && (String(d["type"]) == "resource" ||
String(d["type"]) == "files" ||
String(d["type"]) == "nodes" ||
String(d["type"]) == "files_and_dirs")) {
-
return true;
}
@@ -1501,34 +1418,34 @@ bool ScriptTextEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_
}
static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const Ref<Script> &script) {
-
- if (p_edited_scene != p_current_node && p_current_node->get_owner() != p_edited_scene)
- return NULL;
+ if (p_edited_scene != p_current_node && p_current_node->get_owner() != p_edited_scene) {
+ return nullptr;
+ }
Ref<Script> scr = p_current_node->get_script();
- if (scr.is_valid() && scr == script)
+ if (scr.is_valid() && scr == script) {
return p_current_node;
+ }
for (int i = 0; i < p_current_node->get_child_count(); i++) {
Node *n = _find_script_node(p_edited_scene, p_current_node->get_child(i), script);
- if (n)
+ if (n) {
return n;
+ }
}
- return NULL;
+ return nullptr;
}
void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
Dictionary d = p_data;
- TextEdit *te = code_editor->get_text_edit();
+ CodeEdit *te = code_editor->get_text_editor();
int row, col;
te->_get_mouse_pos(p_point, row, col);
if (d.has("type") && String(d["type"]) == "resource") {
-
Ref<Resource> res = d["resource"];
if (!res.is_valid()) {
return;
@@ -1545,14 +1462,13 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data
}
if (d.has("type") && (String(d["type"]) == "files" || String(d["type"]) == "files_and_dirs")) {
-
Array files = d["files"];
String text_to_drop;
for (int i = 0; i < files.size(); i++) {
-
- if (i > 0)
+ if (i > 0) {
text_to_drop += ",";
+ }
text_to_drop += "\"" + String(files[i]).c_escape() + "\"";
}
@@ -1562,7 +1478,6 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data
}
if (d.has("type") && String(d["type"]) == "nodes") {
-
Node *sn = _find_script_node(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root(), script);
if (!sn) {
@@ -1573,9 +1488,9 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data
Array nodes = d["nodes"];
String text_to_drop;
for (int i = 0; i < nodes.size(); i++) {
-
- if (i > 0)
+ if (i > 0) {
text_to_drop += ",";
+ }
NodePath np = nodes[i];
Node *node = get_node(np);
@@ -1594,17 +1509,16 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data
}
void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
-
Ref<InputEventMouseButton> mb = ev;
Ref<InputEventKey> k = ev;
Point2 local_pos;
bool create_menu = false;
- TextEdit *tx = code_editor->get_text_edit();
+ CodeEdit *tx = code_editor->get_text_editor();
if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
local_pos = mb->get_global_position() - tx->get_global_position();
create_menu = true;
- } else if (k.is_valid() && k->get_scancode() == KEY_MENU) {
+ } else if (k.is_valid() && k->get_keycode() == KEY_MENU) {
local_pos = tx->_get_cursor_pixel_pos();
create_menu = true;
}
@@ -1633,10 +1547,12 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
}
String word_at_pos = tx->get_word_at_pos(local_pos);
- if (word_at_pos == "")
+ if (word_at_pos == "") {
word_at_pos = tx->get_word_under_cursor();
- if (word_at_pos == "")
+ }
+ if (word_at_pos == "") {
word_at_pos = tx->get_selection_text();
+ }
bool has_color = (word_at_pos == "Color");
bool foldable = tx->can_fold(row) || tx->is_folded(row);
@@ -1651,7 +1567,7 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
base = _find_node_for_script(base, base, script);
}
ScriptLanguage::LookupResult result;
- if (script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), word_at_pos, script->get_path(), base, result) == OK) {
+ if (script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_lookup_completion(), word_at_pos, script->get_path(), base, result) == OK) {
open_docs = true;
}
}
@@ -1699,21 +1615,20 @@ void ScriptTextEditor::_color_changed(const Color &p_color) {
new_args = String("(" + rtos(p_color.r) + ", " + rtos(p_color.g) + ", " + rtos(p_color.b) + ", " + rtos(p_color.a) + ")");
}
- String line = code_editor->get_text_edit()->get_line(color_position.x);
+ String line = code_editor->get_text_editor()->get_line(color_position.x);
int color_args_pos = line.find(color_args, color_position.y);
String line_with_replaced_args = line;
line_with_replaced_args.erase(color_args_pos, color_args.length());
line_with_replaced_args = line_with_replaced_args.insert(color_args_pos, new_args);
color_args = new_args;
- code_editor->get_text_edit()->begin_complex_operation();
- code_editor->get_text_edit()->set_line(color_position.x, line_with_replaced_args);
- code_editor->get_text_edit()->end_complex_operation();
- code_editor->get_text_edit()->update();
+ code_editor->get_text_editor()->begin_complex_operation();
+ code_editor->get_text_editor()->set_line(color_position.x, line_with_replaced_args);
+ code_editor->get_text_editor()->end_complex_operation();
+ code_editor->get_text_editor()->update();
}
void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition, Vector2 p_pos) {
-
context_menu->clear();
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
@@ -1738,15 +1653,18 @@ void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_lowercase"), EDIT_TO_LOWERCASE);
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/evaluate_selection"), EDIT_EVALUATE);
}
- if (p_foldable)
+ if (p_foldable) {
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE);
+ }
if (p_color || p_open_docs || p_goto_definition) {
context_menu->add_separator();
- if (p_open_docs)
+ if (p_open_docs) {
context_menu->add_item(TTR("Lookup Symbol"), LOOKUP_SYMBOL);
- if (p_color)
+ }
+ if (p_color) {
context_menu->add_item(TTR("Pick Color"), EDIT_PICK_COLOR);
+ }
}
context_menu->set_position(get_global_transform().xform(p_pos));
@@ -1754,77 +1672,73 @@ void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p
context_menu->popup();
}
-ScriptTextEditor::ScriptTextEditor() {
-
- theme_loaded = false;
- script_is_valid = false;
+void ScriptTextEditor::_enable_code_editor() {
+ ERR_FAIL_COND(code_editor->get_parent());
VSplitContainer *editor_box = memnew(VSplitContainer);
add_child(editor_box);
editor_box->set_anchors_and_margins_preset(Control::PRESET_WIDE);
editor_box->set_v_size_flags(SIZE_EXPAND_FILL);
- code_editor = memnew(CodeTextEditor);
editor_box->add_child(code_editor);
- code_editor->add_constant_override("separation", 2);
- code_editor->set_anchors_and_margins_preset(Control::PRESET_WIDE);
- code_editor->connect("validate_script", this, "_validate_script");
- code_editor->connect("load_theme_settings", this, "_load_theme_settings");
- code_editor->set_code_complete_func(_code_complete_scripts, this);
- code_editor->get_text_edit()->connect("breakpoint_toggled", this, "_breakpoint_toggled");
- code_editor->get_text_edit()->connect("symbol_lookup", this, "_lookup_symbol");
- code_editor->get_text_edit()->connect("info_clicked", this, "_lookup_connections");
- code_editor->set_v_size_flags(SIZE_EXPAND_FILL);
+ code_editor->connect("show_warnings_panel", callable_mp(this, &ScriptTextEditor::_show_warnings_panel));
+ code_editor->connect("validate_script", callable_mp(this, &ScriptTextEditor::_validate_script));
+ code_editor->connect("load_theme_settings", callable_mp(this, &ScriptTextEditor::_load_theme_settings));
+ code_editor->get_text_editor()->connect("breakpoint_toggled", callable_mp(this, &ScriptTextEditor::_breakpoint_toggled));
+ code_editor->get_text_editor()->connect("symbol_lookup", callable_mp(this, &ScriptTextEditor::_lookup_symbol));
+ code_editor->get_text_editor()->connect("symbol_validate", callable_mp(this, &ScriptTextEditor::_validate_symbol));
+ code_editor->get_text_editor()->connect("gutter_added", callable_mp(this, &ScriptTextEditor::_update_gutter_indexes));
+ code_editor->get_text_editor()->connect("gutter_removed", callable_mp(this, &ScriptTextEditor::_update_gutter_indexes));
+ code_editor->get_text_editor()->connect("gutter_clicked", callable_mp(this, &ScriptTextEditor::_gutter_clicked));
+ code_editor->get_text_editor()->connect("gui_input", callable_mp(this, &ScriptTextEditor::_text_edit_gui_input));
code_editor->show_toggle_scripts_button();
+ _update_gutter_indexes();
- warnings_panel = memnew(RichTextLabel);
editor_box->add_child(warnings_panel);
- warnings_panel->set_custom_minimum_size(Size2(0, 100 * EDSCALE));
- warnings_panel->set_h_size_flags(SIZE_EXPAND_FILL);
- warnings_panel->set_meta_underline(true);
- warnings_panel->set_selection_enabled(true);
- warnings_panel->set_focus_mode(FOCUS_CLICK);
- warnings_panel->hide();
-
- code_editor->connect("error_pressed", this, "_error_pressed");
- code_editor->connect("show_warnings_panel", this, "_show_warnings_panel");
- warnings_panel->connect("meta_clicked", this, "_warning_clicked");
-
- update_settings();
-
- code_editor->get_text_edit()->set_callhint_settings(
- EditorSettings::get_singleton()->get("text_editor/completion/put_callhint_tooltip_below_current_line"),
- EditorSettings::get_singleton()->get("text_editor/completion/callhint_tooltip_offset"));
-
- code_editor->get_text_edit()->set_select_identifiers_on_hover(true);
- code_editor->get_text_edit()->set_context_menu_enabled(false);
- code_editor->get_text_edit()->connect("gui_input", this, "_text_edit_gui_input");
+ warnings_panel->add_theme_font_override(
+ "normal_font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("main", "EditorFonts"));
+ warnings_panel->connect("meta_clicked", callable_mp(this, &ScriptTextEditor::_warning_clicked));
- context_menu = memnew(PopupMenu);
add_child(context_menu);
- context_menu->connect("id_pressed", this, "_edit_option");
- context_menu->set_hide_on_window_lose_focus(true);
+ context_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
- color_panel = memnew(PopupPanel);
add_child(color_panel);
+
color_picker = memnew(ColorPicker);
color_picker->set_deferred_mode(true);
+ color_picker->connect("color_changed", callable_mp(this, &ScriptTextEditor::_color_changed));
+
color_panel->add_child(color_picker);
- color_picker->connect("color_changed", this, "_color_changed");
// get default color picker mode from editor settings
int default_color_mode = EDITOR_GET("interface/inspector/default_color_picker_mode");
- if (default_color_mode == 1)
+ if (default_color_mode == 1) {
color_picker->set_hsv_mode(true);
- else if (default_color_mode == 2)
+ } else if (default_color_mode == 2) {
color_picker->set_raw_mode(true);
+ }
- edit_hb = memnew(HBoxContainer);
+ quick_open = memnew(ScriptEditorQuickOpen);
+ quick_open->connect("goto_line", callable_mp(this, &ScriptTextEditor::_goto_line));
+ add_child(quick_open);
- edit_menu = memnew(MenuButton);
- edit_menu->set_text(TTR("Edit"));
- edit_menu->set_switch_on_hover(true);
- edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
+ goto_line_dialog = memnew(GotoLineDialog);
+ add_child(goto_line_dialog);
+
+ add_child(connection_info_dialog);
+
+ edit_hb->add_child(search_menu);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE);
+ search_menu->get_popup()->add_separator();
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_in_files"), SEARCH_IN_FILES);
+ search_menu->get_popup()->add_separator();
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/contextual_help"), HELP_CONTEXTUAL);
+ search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+
+ edit_hb->add_child(edit_menu);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
edit_menu->get_popup()->add_separator();
@@ -1851,101 +1765,149 @@ ScriptTextEditor::ScriptTextEditor() {
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_tabs"), EDIT_CONVERT_INDENT_TO_TABS);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/auto_indent"), EDIT_AUTO_INDENT);
- edit_menu->get_popup()->connect("id_pressed", this, "_edit_option");
+ edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
edit_menu->get_popup()->add_separator();
- PopupMenu *convert_case = memnew(PopupMenu);
- convert_case->set_name("convert_case");
edit_menu->get_popup()->add_child(convert_case);
edit_menu->get_popup()->add_submenu_item(TTR("Convert Case"), "convert_case");
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_uppercase", TTR("Uppercase"), KEY_MASK_SHIFT | KEY_F4), EDIT_TO_UPPERCASE);
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_lowercase", TTR("Lowercase"), KEY_MASK_SHIFT | KEY_F5), EDIT_TO_LOWERCASE);
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize"), KEY_MASK_SHIFT | KEY_F6), EDIT_CAPITALIZE);
- convert_case->connect("id_pressed", this, "_edit_option");
+ convert_case->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
- highlighters[TTR("Standard")] = NULL;
- highlighter_menu = memnew(PopupMenu);
- highlighter_menu->set_name("highlighter_menu");
edit_menu->get_popup()->add_child(highlighter_menu);
edit_menu->get_popup()->add_submenu_item(TTR("Syntax Highlighter"), "highlighter_menu");
- highlighter_menu->add_radio_check_item(TTR("Standard"));
- highlighter_menu->connect("id_pressed", this, "_change_syntax_highlighter");
-
- search_menu = memnew(MenuButton);
- edit_hb->add_child(search_menu);
- search_menu->set_text(TTR("Search"));
- search_menu->set_switch_on_hover(true);
- search_menu->get_popup()->set_hide_on_window_lose_focus(true);
- search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
- search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
- search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);
- search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE);
- search_menu->get_popup()->add_separator();
- search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_in_files"), SEARCH_IN_FILES);
- search_menu->get_popup()->add_separator();
- search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/contextual_help"), HELP_CONTEXTUAL);
- search_menu->get_popup()->connect("id_pressed", this, "_edit_option");
+ highlighter_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_change_syntax_highlighter));
- edit_hb->add_child(edit_menu);
+ _load_theme_settings();
- MenuButton *goto_menu = memnew(MenuButton);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace_in_files"), REPLACE_IN_FILES);
edit_hb->add_child(goto_menu);
- goto_menu->set_text(TTR("Go To"));
- goto_menu->set_switch_on_hover(true);
- goto_menu->get_popup()->connect("id_pressed", this, "_edit_option");
-
goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_function"), SEARCH_LOCATE_FUNCTION);
goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE);
goto_menu->get_popup()->add_separator();
- bookmarks_menu = memnew(PopupMenu);
- bookmarks_menu->set_name("Bookmarks");
goto_menu->get_popup()->add_child(bookmarks_menu);
goto_menu->get_popup()->add_submenu_item(TTR("Bookmarks"), "Bookmarks");
_update_bookmark_list();
- bookmarks_menu->connect("about_to_show", this, "_update_bookmark_list");
- bookmarks_menu->connect("index_pressed", this, "_bookmark_item_pressed");
+ bookmarks_menu->connect("about_to_popup", callable_mp(this, &ScriptTextEditor::_update_bookmark_list));
+ bookmarks_menu->connect("index_pressed", callable_mp(this, &ScriptTextEditor::_bookmark_item_pressed));
- breakpoints_menu = memnew(PopupMenu);
- breakpoints_menu->set_name("Breakpoints");
goto_menu->get_popup()->add_child(breakpoints_menu);
goto_menu->get_popup()->add_submenu_item(TTR("Breakpoints"), "Breakpoints");
_update_breakpoint_list();
- breakpoints_menu->connect("about_to_show", this, "_update_breakpoint_list");
- breakpoints_menu->connect("index_pressed", this, "_breakpoint_item_pressed");
+ breakpoints_menu->connect("about_to_popup", callable_mp(this, &ScriptTextEditor::_update_breakpoint_list));
+ breakpoints_menu->connect("index_pressed", callable_mp(this, &ScriptTextEditor::_breakpoint_item_pressed));
- quick_open = memnew(ScriptEditorQuickOpen);
- add_child(quick_open);
- quick_open->connect("goto_line", this, "_goto_line");
+ goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+}
- goto_line_dialog = memnew(GotoLineDialog);
- add_child(goto_line_dialog);
+ScriptTextEditor::ScriptTextEditor() {
+ code_editor = memnew(CodeTextEditor);
+ code_editor->add_theme_constant_override("separation", 2);
+ code_editor->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ code_editor->set_code_complete_func(_code_complete_scripts, this);
+ code_editor->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ code_editor->get_text_editor()->set_draw_breakpoints_gutter(true);
+ code_editor->get_text_editor()->set_draw_executing_lines_gutter(true);
+
+ connection_gutter = 1;
+ code_editor->get_text_editor()->add_gutter(connection_gutter);
+ code_editor->get_text_editor()->set_gutter_name(connection_gutter, "connection_gutter");
+ code_editor->get_text_editor()->set_gutter_draw(connection_gutter, false);
+ code_editor->get_text_editor()->set_gutter_overwritable(connection_gutter, true);
+ code_editor->get_text_editor()->set_gutter_type(connection_gutter, TextEdit::GUTTER_TPYE_ICON);
+
+ warnings_panel = memnew(RichTextLabel);
+ warnings_panel->set_custom_minimum_size(Size2(0, 100 * EDSCALE));
+ warnings_panel->set_h_size_flags(SIZE_EXPAND_FILL);
+ warnings_panel->set_meta_underline(true);
+ warnings_panel->set_selection_enabled(true);
+ warnings_panel->set_focus_mode(FOCUS_CLICK);
+ warnings_panel->hide();
+
+ update_settings();
+
+ code_editor->get_text_editor()->set_callhint_settings(
+ EditorSettings::get_singleton()->get("text_editor/completion/put_callhint_tooltip_below_current_line"),
+ EditorSettings::get_singleton()->get("text_editor/completion/callhint_tooltip_offset"));
+
+ code_editor->get_text_editor()->set_select_identifiers_on_hover(true);
+ code_editor->get_text_editor()->set_context_menu_enabled(false);
+
+ context_menu = memnew(PopupMenu);
+
+ color_panel = memnew(PopupPanel);
+
+ edit_hb = memnew(HBoxContainer);
+
+ edit_menu = memnew(MenuButton);
+ edit_menu->set_text(TTR("Edit"));
+ edit_menu->set_switch_on_hover(true);
+
+ convert_case = memnew(PopupMenu);
+ convert_case->set_name("convert_case");
+
+ highlighter_menu = memnew(PopupMenu);
+ highlighter_menu->set_name("highlighter_menu");
+
+ Ref<EditorPlainTextSyntaxHighlighter> plain_highlighter;
+ plain_highlighter.instance();
+ add_syntax_highlighter(plain_highlighter);
+
+ Ref<EditorStandardSyntaxHighlighter> highlighter;
+ highlighter.instance();
+ add_syntax_highlighter(highlighter);
+ set_syntax_highlighter(highlighter);
+
+ search_menu = memnew(MenuButton);
+ search_menu->set_text(TTR("Search"));
+ search_menu->set_switch_on_hover(true);
+
+ goto_menu = memnew(MenuButton);
+ goto_menu->set_text(TTR("Go To"));
+ goto_menu->set_switch_on_hover(true);
+
+ bookmarks_menu = memnew(PopupMenu);
+ bookmarks_menu->set_name("Bookmarks");
+
+ breakpoints_menu = memnew(PopupMenu);
+ breakpoints_menu->set_name("Breakpoints");
connection_info_dialog = memnew(ConnectionInfoDialog);
- add_child(connection_info_dialog);
- code_editor->get_text_edit()->set_drag_forwarding(this);
+ code_editor->get_text_editor()->set_drag_forwarding(this);
}
ScriptTextEditor::~ScriptTextEditor() {
- for (const Map<String, SyntaxHighlighter *>::Element *E = highlighters.front(); E; E = E->next()) {
- if (E->get() != NULL) {
- memdelete(E->get());
- }
- }
highlighters.clear();
+
+ if (!editor_enabled) {
+ memdelete(code_editor);
+ memdelete(warnings_panel);
+ memdelete(context_menu);
+ memdelete(color_panel);
+ memdelete(edit_hb);
+ memdelete(edit_menu);
+ memdelete(convert_case);
+ memdelete(highlighter_menu);
+ memdelete(search_menu);
+ memdelete(goto_menu);
+ memdelete(bookmarks_menu);
+ memdelete(breakpoints_menu);
+ memdelete(connection_info_dialog);
+ }
}
static ScriptEditorBase *create_editor(const RES &p_resource) {
-
if (Object::cast_to<Script>(*p_resource)) {
return memnew(ScriptTextEditor);
}
- return NULL;
+ return nullptr;
}
void ScriptTextEditor::register_editor() {
-
ED_SHORTCUT("script_text_editor/undo", TTR("Undo"), KEY_MASK_CMD | KEY_Z);
ED_SHORTCUT("script_text_editor/redo", TTR("Redo"), KEY_MASK_CMD | KEY_Y);
ED_SHORTCUT("script_text_editor/cut", TTR("Cut"), KEY_MASK_CMD | KEY_X);
@@ -1990,6 +1952,7 @@ void ScriptTextEditor::register_editor() {
#endif
ED_SHORTCUT("script_text_editor/find_in_files", TTR("Find in Files..."), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F);
+ ED_SHORTCUT("script_text_editor/replace_in_files", TTR("Replace in Files..."), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R);
#ifdef OSX_ENABLED
ED_SHORTCUT("script_text_editor/contextual_help", TTR("Contextual Help"), KEY_MASK_ALT | KEY_MASK_SHIFT | KEY_SPACE);
diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h
index 9018e9d3c2..1e436fbe65 100644
--- a/editor/plugins/script_text_editor.h
+++ b/editor/plugins/script_text_editor.h
@@ -37,13 +37,12 @@
#include "script_editor_plugin.h"
class ConnectionInfoDialog : public AcceptDialog {
-
GDCLASS(ConnectionInfoDialog, AcceptDialog);
- Label *method;
- Tree *tree;
+ Label *method = nullptr;
+ Tree *tree = nullptr;
- virtual void ok_pressed();
+ virtual void ok_pressed() override;
public:
void popup_connections(String p_method, Vector<Node *> p_nodes);
@@ -52,14 +51,14 @@ public:
};
class ScriptTextEditor : public ScriptEditorBase {
-
GDCLASS(ScriptTextEditor, ScriptEditorBase);
- CodeTextEditor *code_editor;
- RichTextLabel *warnings_panel;
+ CodeTextEditor *code_editor = nullptr;
+ RichTextLabel *warnings_panel = nullptr;
Ref<Script> script;
- bool script_is_valid;
+ bool script_is_valid = false;
+ bool editor_enabled = false;
Vector<String> functions;
@@ -67,37 +66,35 @@ class ScriptTextEditor : public ScriptEditorBase {
Vector<String> member_keywords;
- HBoxContainer *edit_hb;
+ HBoxContainer *edit_hb = nullptr;
- MenuButton *edit_menu;
- MenuButton *search_menu;
- PopupMenu *bookmarks_menu;
- PopupMenu *breakpoints_menu;
- PopupMenu *highlighter_menu;
- PopupMenu *context_menu;
+ MenuButton *edit_menu = nullptr;
+ MenuButton *search_menu = nullptr;
+ MenuButton *goto_menu = nullptr;
+ PopupMenu *bookmarks_menu = nullptr;
+ PopupMenu *breakpoints_menu = nullptr;
+ PopupMenu *highlighter_menu = nullptr;
+ PopupMenu *context_menu = nullptr;
+ PopupMenu *convert_case = nullptr;
- GotoLineDialog *goto_line_dialog;
- ScriptEditorQuickOpen *quick_open;
- ConnectionInfoDialog *connection_info_dialog;
+ GotoLineDialog *goto_line_dialog = nullptr;
+ ScriptEditorQuickOpen *quick_open = nullptr;
+ ConnectionInfoDialog *connection_info_dialog = nullptr;
- PopupPanel *color_panel;
- ColorPicker *color_picker;
- Vector2 color_position;
- String color_args;
+ int connection_gutter = -1;
+ void _gutter_clicked(int p_line, int p_gutter);
+ void _update_gutter_indexes();
- void _update_member_keywords();
+ int line_number_gutter = -1;
+ Color default_line_number_color = Color(1, 1, 1);
+ Color safe_line_number_color = Color(1, 1, 1);
- struct ColorsCache {
- Color symbol_color;
- Color keyword_color;
- Color basetype_color;
- Color type_color;
- Color usertype_color;
- Color comment_color;
- Color string_color;
- } colors_cache;
+ PopupPanel *color_panel = nullptr;
+ ColorPicker *color_picker = nullptr;
+ Vector2 color_position;
+ String color_args;
- bool theme_loaded;
+ bool theme_loaded = false;
enum {
EDIT_UNDO,
@@ -133,6 +130,7 @@ class ScriptTextEditor : public ScriptEditorBase {
SEARCH_LOCATE_FUNCTION,
SEARCH_GOTO_LINE,
SEARCH_IN_FILES,
+ REPLACE_IN_FILES,
BOOKMARK_TOGGLE,
BOOKMARK_GOTO_NEXT,
BOOKMARK_GOTO_PREV,
@@ -145,6 +143,8 @@ class ScriptTextEditor : public ScriptEditorBase {
LOOKUP_SYMBOL,
};
+ void _enable_code_editor();
+
protected:
void _update_breakpoint_list();
void _breakpoint_item_pressed(int p_idx);
@@ -160,13 +160,12 @@ protected:
void _load_theme_settings();
void _set_theme_for_script();
void _show_warnings_panel(bool p_show);
- void _error_pressed();
void _warning_clicked(Variant p_line);
void _notification(int p_what);
static void _bind_methods();
- Map<String, SyntaxHighlighter *> highlighters;
+ Map<String, Ref<EditorSyntaxHighlighter>> highlighters;
void _change_syntax_highlighter(int p_idx);
void _edit_option(int p_op);
@@ -177,8 +176,7 @@ protected:
void _goto_line(int p_line) { goto_line(p_line); }
void _lookup_symbol(const String &p_symbol, int p_row, int p_column);
-
- void _lookup_connections(int p_row, String p_method);
+ void _validate_symbol(const String &p_symbol);
void _convert_case(CodeTextEditor::CaseStyle p_case);
@@ -186,53 +184,56 @@ protected:
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+ String _get_absolute_path(const String &rel_path);
+
public:
void _update_connected_methods();
- virtual void add_syntax_highlighter(SyntaxHighlighter *p_highlighter);
- virtual void set_syntax_highlighter(SyntaxHighlighter *p_highlighter);
+ virtual void add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) override;
+ virtual void set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) override;
void update_toggle_scripts_button();
- virtual void apply_code();
- virtual RES get_edited_resource() const;
- virtual void set_edited_resource(const RES &p_res);
- virtual Vector<String> get_functions();
- virtual void reload_text();
- virtual String get_name();
- virtual Ref<Texture> get_icon();
- virtual bool is_unsaved();
- virtual Variant get_edit_state();
- virtual void set_edit_state(const Variant &p_state);
- virtual void ensure_focus();
- virtual void trim_trailing_whitespace();
- virtual void insert_final_newline();
- virtual void convert_indent_to_spaces();
- virtual void convert_indent_to_tabs();
- virtual void tag_saved_version();
-
- virtual void goto_line(int p_line, bool p_with_error = false);
+ virtual void apply_code() override;
+ virtual RES get_edited_resource() const override;
+ virtual void set_edited_resource(const RES &p_res) override;
+ virtual void enable_editor() override;
+ virtual Vector<String> get_functions() override;
+ virtual void reload_text() override;
+ virtual String get_name() override;
+ virtual Ref<Texture2D> get_theme_icon() override;
+ virtual bool is_unsaved() override;
+ virtual Variant get_edit_state() override;
+ virtual void set_edit_state(const Variant &p_state) override;
+ virtual void ensure_focus() override;
+ virtual void trim_trailing_whitespace() override;
+ virtual void insert_final_newline() override;
+ virtual void convert_indent_to_spaces() override;
+ virtual void convert_indent_to_tabs() override;
+ virtual void tag_saved_version() override;
+
+ virtual void goto_line(int p_line, bool p_with_error = false) override;
void goto_line_selection(int p_line, int p_begin, int p_end);
void goto_line_centered(int p_line);
- virtual void set_executing_line(int p_line);
- virtual void clear_executing_line();
+ virtual void set_executing_line(int p_line) override;
+ virtual void clear_executing_line() override;
- virtual void reload(bool p_soft);
- virtual void get_breakpoints(List<int> *p_breakpoints);
+ virtual void reload(bool p_soft) override;
+ virtual Array get_breakpoints() override;
- virtual void add_callback(const String &p_function, PoolStringArray p_args);
- virtual void update_settings();
+ virtual void add_callback(const String &p_function, PackedStringArray p_args) override;
+ virtual void update_settings() override;
- virtual bool show_members_overview();
+ virtual bool show_members_overview() override;
- virtual void set_tooltip_request_func(String p_method, Object *p_obj);
+ virtual void set_tooltip_request_func(String p_method, Object *p_obj) override;
- virtual void set_debugger_active(bool p_active);
+ virtual void set_debugger_active(bool p_active) override;
- Control *get_edit_menu();
- virtual void clear_edit_menu();
+ Control *get_edit_menu() override;
+ virtual void clear_edit_menu() override;
static void register_editor();
- virtual void validate();
+ virtual void validate() override;
ScriptTextEditor();
~ScriptTextEditor();
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
index c24a666c55..29db284b44 100644
--- a/editor/plugins/shader_editor_plugin.cpp
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -38,16 +38,16 @@
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "editor/property_editor.h"
-#include "servers/visual/shader_types.h"
+#include "servers/display_server.h"
+#include "servers/rendering/shader_types.h"
/*** SHADER SCRIPT EDITOR ****/
Ref<Shader> ShaderTextEditor::get_edited_shader() const {
-
return shader;
}
-void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader) {
+void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader) {
if (shader == p_shader) {
return;
}
@@ -55,8 +55,8 @@ void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader) {
_load_theme_settings();
- get_text_edit()->set_text(p_shader->get_code());
- get_text_edit()->clear_undo_history();
+ get_text_editor()->set_text(p_shader->get_code());
+ get_text_editor()->clear_undo_history();
_validate_script();
_line_col_changed();
@@ -65,7 +65,7 @@ void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader) {
void ShaderTextEditor::reload_text() {
ERR_FAIL_COND(shader.is_null());
- TextEdit *te = get_text_edit();
+ CodeEdit *te = get_text_editor();
int column = te->cursor_get_column();
int row = te->cursor_get_line();
int h = te->get_h_scroll();
@@ -83,9 +83,6 @@ void ShaderTextEditor::reload_text() {
}
void ShaderTextEditor::_load_theme_settings() {
-
- get_text_edit()->clear_colors();
-
Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
Color completion_background_color = EDITOR_GET("text_editor/highlighting/completion_background_color");
Color completion_selected_color = EDITOR_GET("text_editor/highlighting/completion_selected_color");
@@ -102,9 +99,6 @@ void ShaderTextEditor::_load_theme_settings() {
Color current_line_color = EDITOR_GET("text_editor/highlighting/current_line_color");
Color line_length_guideline_color = EDITOR_GET("text_editor/highlighting/line_length_guideline_color");
Color word_highlighted_color = EDITOR_GET("text_editor/highlighting/word_highlighted_color");
- Color number_color = EDITOR_GET("text_editor/highlighting/number_color");
- Color function_color = EDITOR_GET("text_editor/highlighting/function_color");
- Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
Color mark_color = EDITOR_GET("text_editor/highlighting/mark_color");
Color bookmark_color = EDITOR_GET("text_editor/highlighting/bookmark_color");
Color breakpoint_color = EDITOR_GET("text_editor/highlighting/breakpoint_color");
@@ -112,69 +106,77 @@ void ShaderTextEditor::_load_theme_settings() {
Color code_folding_color = EDITOR_GET("text_editor/highlighting/code_folding_color");
Color search_result_color = EDITOR_GET("text_editor/highlighting/search_result_color");
Color search_result_border_color = EDITOR_GET("text_editor/highlighting/search_result_border_color");
- Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
- Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
- Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
-
- get_text_edit()->add_color_override("background_color", background_color);
- get_text_edit()->add_color_override("completion_background_color", completion_background_color);
- get_text_edit()->add_color_override("completion_selected_color", completion_selected_color);
- get_text_edit()->add_color_override("completion_existing_color", completion_existing_color);
- get_text_edit()->add_color_override("completion_scroll_color", completion_scroll_color);
- get_text_edit()->add_color_override("completion_font_color", completion_font_color);
- get_text_edit()->add_color_override("font_color", text_color);
- get_text_edit()->add_color_override("line_number_color", line_number_color);
- get_text_edit()->add_color_override("caret_color", caret_color);
- get_text_edit()->add_color_override("caret_background_color", caret_background_color);
- get_text_edit()->add_color_override("font_color_selected", text_selected_color);
- get_text_edit()->add_color_override("selection_color", selection_color);
- get_text_edit()->add_color_override("brace_mismatch_color", brace_mismatch_color);
- get_text_edit()->add_color_override("current_line_color", current_line_color);
- get_text_edit()->add_color_override("line_length_guideline_color", line_length_guideline_color);
- get_text_edit()->add_color_override("word_highlighted_color", word_highlighted_color);
- get_text_edit()->add_color_override("number_color", number_color);
- get_text_edit()->add_color_override("function_color", function_color);
- get_text_edit()->add_color_override("member_variable_color", member_variable_color);
- get_text_edit()->add_color_override("mark_color", mark_color);
- get_text_edit()->add_color_override("bookmark_color", bookmark_color);
- get_text_edit()->add_color_override("breakpoint_color", breakpoint_color);
- get_text_edit()->add_color_override("executing_line_color", executing_line_color);
- get_text_edit()->add_color_override("code_folding_color", code_folding_color);
- get_text_edit()->add_color_override("search_result_color", search_result_color);
- get_text_edit()->add_color_override("search_result_border_color", search_result_border_color);
- get_text_edit()->add_color_override("symbol_color", symbol_color);
+
+ get_text_editor()->add_theme_color_override("background_color", background_color);
+ get_text_editor()->add_theme_color_override("completion_background_color", completion_background_color);
+ get_text_editor()->add_theme_color_override("completion_selected_color", completion_selected_color);
+ get_text_editor()->add_theme_color_override("completion_existing_color", completion_existing_color);
+ get_text_editor()->add_theme_color_override("completion_scroll_color", completion_scroll_color);
+ get_text_editor()->add_theme_color_override("completion_font_color", completion_font_color);
+ get_text_editor()->add_theme_color_override("font_color", text_color);
+ get_text_editor()->add_theme_color_override("line_number_color", line_number_color);
+ get_text_editor()->add_theme_color_override("caret_color", caret_color);
+ get_text_editor()->add_theme_color_override("caret_background_color", caret_background_color);
+ get_text_editor()->add_theme_color_override("font_color_selected", text_selected_color);
+ get_text_editor()->add_theme_color_override("selection_color", selection_color);
+ get_text_editor()->add_theme_color_override("brace_mismatch_color", brace_mismatch_color);
+ get_text_editor()->add_theme_color_override("current_line_color", current_line_color);
+ get_text_editor()->add_theme_color_override("line_length_guideline_color", line_length_guideline_color);
+ get_text_editor()->add_theme_color_override("word_highlighted_color", word_highlighted_color);
+ get_text_editor()->add_theme_color_override("mark_color", mark_color);
+ get_text_editor()->add_theme_color_override("bookmark_color", bookmark_color);
+ get_text_editor()->add_theme_color_override("breakpoint_color", breakpoint_color);
+ get_text_editor()->add_theme_color_override("executing_line_color", executing_line_color);
+ get_text_editor()->add_theme_color_override("code_folding_color", code_folding_color);
+ get_text_editor()->add_theme_color_override("search_result_color", search_result_color);
+ get_text_editor()->add_theme_color_override("search_result_border_color", search_result_border_color);
+
+ syntax_highlighter->set_number_color(EDITOR_GET("text_editor/highlighting/number_color"));
+ syntax_highlighter->set_symbol_color(EDITOR_GET("text_editor/highlighting/symbol_color"));
+ syntax_highlighter->set_function_color(EDITOR_GET("text_editor/highlighting/function_color"));
+ syntax_highlighter->set_member_variable_color(EDITOR_GET("text_editor/highlighting/member_variable_color"));
+
+ syntax_highlighter->clear_keyword_colors();
List<String> keywords;
ShaderLanguage::get_keyword_list(&keywords);
+ const Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
- if (shader.is_valid()) {
+ for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
+ syntax_highlighter->add_keyword_color(E->get(), keyword_color);
+ }
- for (const Map<StringName, ShaderLanguage::FunctionInfo>::Element *E = ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(shader->get_mode())).front(); E; E = E->next()) {
+ // Colorize built-ins like `COLOR` differently to make them easier
+ // to distinguish from keywords at a quick glance.
+ List<String> built_ins;
+ if (shader.is_valid()) {
+ for (const Map<StringName, ShaderLanguage::FunctionInfo>::Element *E = ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())).front(); E; E = E->next()) {
for (const Map<StringName, ShaderLanguage::BuiltInInfo>::Element *F = E->get().built_ins.front(); F; F = F->next()) {
- keywords.push_back(F->key());
+ built_ins.push_back(F->key());
}
}
- for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader->get_mode())).size(); i++) {
-
- keywords.push_back(ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader->get_mode()))[i]);
+ for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())).size(); i++) {
+ built_ins.push_back(ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode()))[i]);
}
}
- for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
+ const Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
- get_text_edit()->add_keyword_color(E->get(), keyword_color);
+ for (List<String>::Element *E = built_ins.front(); E; E = E->next()) {
+ syntax_highlighter->add_keyword_color(E->get(), member_variable_color);
}
- //colorize comments
- get_text_edit()->add_color_region("/*", "*/", comment_color, false);
- get_text_edit()->add_color_region("//", "", comment_color, false);
+ // Colorize comments.
+ const Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
+ syntax_highlighter->clear_color_regions();
+ syntax_highlighter->add_color_region("/*", "*/", comment_color, false);
+ syntax_highlighter->add_color_region("//", "", comment_color, true);
}
void ShaderTextEditor::_check_shader_mode() {
-
- String type = ShaderLanguage::get_shader_type(get_text_edit()->get_text());
+ String type = ShaderLanguage::get_shader_type(get_text_editor()->get_text());
Shader::Mode mode;
@@ -187,46 +189,51 @@ void ShaderTextEditor::_check_shader_mode() {
}
if (shader->get_mode() != mode) {
- shader->set_code(get_text_edit()->get_text());
+ shader->set_code(get_text_editor()->get_text());
_load_theme_settings();
}
}
-void ShaderTextEditor::_code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options) {
+static ShaderLanguage::DataType _get_global_variable_type(const StringName &p_variable) {
+ RS::GlobalVariableType gvt = RS::get_singleton()->global_variable_get_type(p_variable);
+ return RS::global_variable_type_get_shader_datatype(gvt);
+}
+void ShaderTextEditor::_code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options) {
_check_shader_mode();
ShaderLanguage sl;
String calltip;
- sl.complete(p_code, ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types(), r_options, calltip);
+ sl.complete(p_code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types(), _get_global_variable_type, r_options, calltip);
- get_text_edit()->set_code_hint(calltip);
+ get_text_editor()->set_code_hint(calltip);
}
void ShaderTextEditor::_validate_script() {
-
_check_shader_mode();
- String code = get_text_edit()->get_text();
+ String code = get_text_editor()->get_text();
//List<StringName> params;
//shader->get_param_list(&params);
ShaderLanguage sl;
- Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types());
+ Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types(), _get_global_variable_type);
if (err != OK) {
String error_text = "error(" + itos(sl.get_error_line()) + "): " + sl.get_error_text();
set_error(error_text);
set_error_pos(sl.get_error_line() - 1, 0);
- for (int i = 0; i < get_text_edit()->get_line_count(); i++)
- get_text_edit()->set_line_as_marked(i, false);
- get_text_edit()->set_line_as_marked(sl.get_error_line() - 1, true);
+ for (int i = 0; i < get_text_editor()->get_line_count(); i++) {
+ get_text_editor()->set_line_as_marked(i, false);
+ }
+ get_text_editor()->set_line_as_marked(sl.get_error_line() - 1, true);
} else {
- for (int i = 0; i < get_text_edit()->get_line_count(); i++)
- get_text_edit()->set_line_as_marked(i, false);
+ for (int i = 0; i < get_text_editor()->get_line_count(); i++) {
+ get_text_editor()->set_line_as_marked(i, false);
+ }
set_error("");
}
@@ -237,30 +244,31 @@ void ShaderTextEditor::_bind_methods() {
}
ShaderTextEditor::ShaderTextEditor() {
+ syntax_highlighter.instance();
+ get_text_editor()->set_syntax_highlighter(syntax_highlighter);
}
/*** SCRIPT EDITOR ******/
void ShaderEditor::_menu_option(int p_option) {
-
switch (p_option) {
case EDIT_UNDO: {
- shader_editor->get_text_edit()->undo();
+ shader_editor->get_text_editor()->undo();
} break;
case EDIT_REDO: {
- shader_editor->get_text_edit()->redo();
+ shader_editor->get_text_editor()->redo();
} break;
case EDIT_CUT: {
- shader_editor->get_text_edit()->cut();
+ shader_editor->get_text_editor()->cut();
} break;
case EDIT_COPY: {
- shader_editor->get_text_edit()->copy();
+ shader_editor->get_text_editor()->copy();
} break;
case EDIT_PASTE: {
- shader_editor->get_text_edit()->paste();
+ shader_editor->get_text_editor()->paste();
} break;
case EDIT_SELECT_ALL: {
- shader_editor->get_text_edit()->select_all();
+ shader_editor->get_text_editor()->select_all();
} break;
case EDIT_MOVE_LINE_UP: {
shader_editor->move_lines_up();
@@ -269,20 +277,20 @@ void ShaderEditor::_menu_option(int p_option) {
shader_editor->move_lines_down();
} break;
case EDIT_INDENT_LEFT: {
-
- if (shader.is_null())
+ if (shader.is_null()) {
return;
+ }
- TextEdit *tx = shader_editor->get_text_edit();
+ CodeEdit *tx = shader_editor->get_text_editor();
tx->indent_left();
} break;
case EDIT_INDENT_RIGHT: {
-
- if (shader.is_null())
+ if (shader.is_null()) {
return;
+ }
- TextEdit *tx = shader_editor->get_text_edit();
+ CodeEdit *tx = shader_editor->get_text_editor();
tx->indent_right();
} break;
@@ -293,51 +301,41 @@ void ShaderEditor::_menu_option(int p_option) {
shader_editor->clone_lines_down();
} break;
case EDIT_TOGGLE_COMMENT: {
-
- if (shader.is_null())
+ if (shader.is_null()) {
return;
+ }
shader_editor->toggle_inline_comment("//");
} break;
case EDIT_COMPLETE: {
-
- shader_editor->get_text_edit()->query_code_comple();
+ shader_editor->get_text_editor()->query_code_comple();
} break;
case SEARCH_FIND: {
-
shader_editor->get_find_replace_bar()->popup_search();
} break;
case SEARCH_FIND_NEXT: {
-
shader_editor->get_find_replace_bar()->search_next();
} break;
case SEARCH_FIND_PREV: {
-
shader_editor->get_find_replace_bar()->search_prev();
} break;
case SEARCH_REPLACE: {
-
shader_editor->get_find_replace_bar()->popup_replace();
} break;
case SEARCH_GOTO_LINE: {
-
- goto_line_dialog->popup_find_line(shader_editor->get_text_edit());
+ goto_line_dialog->popup_find_line(shader_editor->get_text_editor());
} break;
case BOOKMARK_TOGGLE: {
-
shader_editor->toggle_bookmark();
} break;
case BOOKMARK_GOTO_NEXT: {
-
shader_editor->goto_next_bookmark();
} break;
case BOOKMARK_GOTO_PREV: {
-
shader_editor->goto_prev_bookmark();
} break;
case BOOKMARK_REMOVE_ALL: {
-
shader_editor->remove_all_bookmarks();
} break;
case HELP_DOCS: {
@@ -345,61 +343,33 @@ void ShaderEditor::_menu_option(int p_option) {
} break;
}
if (p_option != SEARCH_FIND && p_option != SEARCH_REPLACE && p_option != SEARCH_GOTO_LINE) {
- shader_editor->get_text_edit()->call_deferred("grab_focus");
+ shader_editor->get_text_editor()->call_deferred("grab_focus");
}
}
void ShaderEditor::_notification(int p_what) {
-
- if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_IN) {
+ if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) {
_check_for_external_edit();
}
}
void ShaderEditor::_params_changed() {
-
shader_editor->_validate_script();
}
void ShaderEditor::_editor_settings_changed() {
+ shader_editor->update_editor_settings();
- shader_editor->get_text_edit()->set_auto_brace_completion(EditorSettings::get_singleton()->get("text_editor/completion/auto_brace_complete"));
- shader_editor->get_text_edit()->set_scroll_pass_end_of_file(EditorSettings::get_singleton()->get("text_editor/cursor/scroll_past_end_of_file"));
- shader_editor->get_text_edit()->set_indent_size(EditorSettings::get_singleton()->get("text_editor/indent/size"));
- shader_editor->get_text_edit()->set_indent_using_spaces(EditorSettings::get_singleton()->get("text_editor/indent/type"));
- shader_editor->get_text_edit()->set_auto_indent(EditorSettings::get_singleton()->get("text_editor/indent/auto_indent"));
- shader_editor->get_text_edit()->set_draw_tabs(EditorSettings::get_singleton()->get("text_editor/indent/draw_tabs"));
- shader_editor->get_text_edit()->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/appearance/show_line_numbers"));
- shader_editor->get_text_edit()->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
- shader_editor->get_text_edit()->set_highlight_all_occurrences(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_all_occurrences"));
- shader_editor->get_text_edit()->set_highlight_current_line(EditorSettings::get_singleton()->get("text_editor/highlighting/highlight_current_line"));
- shader_editor->get_text_edit()->cursor_set_blink_enabled(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink"));
- shader_editor->get_text_edit()->cursor_set_blink_speed(EditorSettings::get_singleton()->get("text_editor/cursor/caret_blink_speed"));
- shader_editor->get_text_edit()->add_constant_override("line_spacing", EditorSettings::get_singleton()->get("text_editor/theme/line_spacing"));
- shader_editor->get_text_edit()->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
- shader_editor->get_text_edit()->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/navigation/smooth_scrolling"));
- shader_editor->get_text_edit()->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/navigation/v_scroll_speed"));
- shader_editor->get_text_edit()->set_draw_minimap(EditorSettings::get_singleton()->get("text_editor/navigation/show_minimap"));
- shader_editor->get_text_edit()->set_minimap_width((int)EditorSettings::get_singleton()->get("text_editor/navigation/minimap_width") * EDSCALE);
+ shader_editor->get_text_editor()->add_theme_constant_override("line_spacing", EditorSettings::get_singleton()->get("text_editor/theme/line_spacing"));
+ shader_editor->get_text_editor()->set_draw_breakpoints_gutter(false);
+ shader_editor->get_text_editor()->set_draw_executing_lines_gutter(false);
}
void ShaderEditor::_bind_methods() {
-
- ClassDB::bind_method("_reload_shader_from_disk", &ShaderEditor::_reload_shader_from_disk);
- ClassDB::bind_method("_editor_settings_changed", &ShaderEditor::_editor_settings_changed);
- ClassDB::bind_method("_text_edit_gui_input", &ShaderEditor::_text_edit_gui_input);
-
- ClassDB::bind_method("_update_bookmark_list", &ShaderEditor::_update_bookmark_list);
- ClassDB::bind_method("_bookmark_item_pressed", &ShaderEditor::_bookmark_item_pressed);
-
- ClassDB::bind_method("_menu_option", &ShaderEditor::_menu_option);
ClassDB::bind_method("_params_changed", &ShaderEditor::_params_changed);
- ClassDB::bind_method("apply_shaders", &ShaderEditor::apply_shaders);
- ClassDB::bind_method("save_external_data", &ShaderEditor::save_external_data);
}
void ShaderEditor::ensure_select_current() {
-
/*
if (tab_container->get_child_count() && tab_container->get_current_tab()>=0) {
@@ -412,12 +382,10 @@ void ShaderEditor::ensure_select_current() {
}
void ShaderEditor::goto_line_selection(int p_line, int p_begin, int p_end) {
-
shader_editor->goto_line_selection(p_line, p_begin, p_end);
}
void ShaderEditor::_check_for_external_edit() {
-
if (shader.is_null() || !shader.is_valid()) {
return;
}
@@ -438,7 +406,6 @@ void ShaderEditor::_check_for_external_edit() {
}
void ShaderEditor::_reload_shader_from_disk() {
-
Ref<Shader> rel_shader = ResourceLoader::load(shader->get_path(), shader->get_class(), true);
ERR_FAIL_COND(!rel_shader.is_valid());
@@ -448,12 +415,13 @@ void ShaderEditor::_reload_shader_from_disk() {
}
void ShaderEditor::edit(const Ref<Shader> &p_shader) {
-
- if (p_shader.is_null() || !p_shader->is_text_shader())
+ if (p_shader.is_null() || !p_shader->is_text_shader()) {
return;
+ }
- if (shader == p_shader)
+ if (shader == p_shader) {
return;
+ }
shader = p_shader;
@@ -464,7 +432,6 @@ void ShaderEditor::edit(const Ref<Shader> &p_shader) {
}
void ShaderEditor::save_external_data(const String &p_str) {
-
if (shader.is_null()) {
disk_changed->hide();
return;
@@ -480,10 +447,9 @@ void ShaderEditor::save_external_data(const String &p_str) {
}
void ShaderEditor::apply_shaders() {
-
if (shader.is_valid()) {
String shader_code = shader->get_code();
- String editor_code = shader_editor->get_text_edit()->get_text();
+ String editor_code = shader_editor->get_text_editor()->get_text();
if (shader_code != editor_code) {
shader->set_code(editor_code);
shader->set_edited(true);
@@ -492,21 +458,17 @@ void ShaderEditor::apply_shaders() {
}
void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
-
Ref<InputEventMouseButton> mb = ev;
if (mb.is_valid()) {
-
if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
-
int col, row;
- TextEdit *tx = shader_editor->get_text_edit();
+ CodeEdit *tx = shader_editor->get_text_editor();
tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col);
tx->set_right_click_moves_caret(EditorSettings::get_singleton()->get("text_editor/cursor/right_click_moves_caret"));
if (tx->is_right_click_moving_caret()) {
if (tx->is_selection_active()) {
-
int from_line = tx->get_selection_from_line();
int to_line = tx->get_selection_to_line();
int from_column = tx->get_selection_from_column();
@@ -527,15 +489,14 @@ void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
}
Ref<InputEventKey> k = ev;
- if (k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_MENU) {
- TextEdit *tx = shader_editor->get_text_edit();
+ if (k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_MENU) {
+ CodeEdit *tx = shader_editor->get_text_editor();
_make_context_menu(tx->is_selection_active(), (get_global_transform().inverse() * tx->get_global_transform()).xform(tx->_get_cursor_pixel_pos()));
context_menu->grab_focus();
}
}
void ShaderEditor::_update_bookmark_list() {
-
bookmarks_menu->clear();
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE);
@@ -543,7 +504,7 @@ void ShaderEditor::_update_bookmark_list() {
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_bookmark"), BOOKMARK_GOTO_NEXT);
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_bookmark"), BOOKMARK_GOTO_PREV);
- Array bookmark_list = shader_editor->get_text_edit()->get_bookmarks_array();
+ Array bookmark_list = shader_editor->get_text_editor()->get_bookmarked_lines();
if (bookmark_list.size() == 0) {
return;
}
@@ -551,7 +512,7 @@ void ShaderEditor::_update_bookmark_list() {
bookmarks_menu->add_separator();
for (int i = 0; i < bookmark_list.size(); i++) {
- String line = shader_editor->get_text_edit()->get_line(bookmark_list[i]).strip_edges();
+ String line = shader_editor->get_text_editor()->get_line(bookmark_list[i]).strip_edges();
// Limit the size of the line if too big.
if (line.length() > 50) {
line = line.substr(0, 50);
@@ -563,7 +524,6 @@ void ShaderEditor::_update_bookmark_list() {
}
void ShaderEditor::_bookmark_item_pressed(int p_idx) {
-
if (p_idx < 4) { // Any item before the separator.
_menu_option(bookmarks_menu->get_item_id(p_idx));
} else {
@@ -572,7 +532,6 @@ void ShaderEditor::_bookmark_item_pressed(int p_idx) {
}
void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) {
-
context_menu->clear();
if (p_selection) {
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
@@ -597,29 +556,27 @@ void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) {
}
ShaderEditor::ShaderEditor(EditorNode *p_node) {
-
shader_editor = memnew(ShaderTextEditor);
shader_editor->set_v_size_flags(SIZE_EXPAND_FILL);
- shader_editor->add_constant_override("separation", 0);
+ shader_editor->add_theme_constant_override("separation", 0);
shader_editor->set_anchors_and_margins_preset(Control::PRESET_WIDE);
- shader_editor->connect("script_changed", this, "apply_shaders");
- EditorSettings::get_singleton()->connect("settings_changed", this, "_editor_settings_changed");
+ shader_editor->connect("script_changed", callable_mp(this, &ShaderEditor::apply_shaders));
+ EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &ShaderEditor::_editor_settings_changed));
- shader_editor->get_text_edit()->set_callhint_settings(
+ shader_editor->get_text_editor()->set_callhint_settings(
EditorSettings::get_singleton()->get("text_editor/completion/put_callhint_tooltip_below_current_line"),
EditorSettings::get_singleton()->get("text_editor/completion/callhint_tooltip_offset"));
- shader_editor->get_text_edit()->set_select_identifiers_on_hover(true);
- shader_editor->get_text_edit()->set_context_menu_enabled(false);
- shader_editor->get_text_edit()->connect("gui_input", this, "_text_edit_gui_input");
+ shader_editor->get_text_editor()->set_select_identifiers_on_hover(true);
+ shader_editor->get_text_editor()->set_context_menu_enabled(false);
+ shader_editor->get_text_editor()->connect("gui_input", callable_mp(this, &ShaderEditor::_text_edit_gui_input));
shader_editor->update_editor_settings();
context_menu = memnew(PopupMenu);
add_child(context_menu);
- context_menu->connect("id_pressed", this, "_menu_option");
- context_menu->set_hide_on_window_lose_focus(true);
+ context_menu->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option));
VBoxContainer *main_container = memnew(VBoxContainer);
HBoxContainer *hbc = memnew(HBoxContainer);
@@ -627,7 +584,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
edit_menu = memnew(MenuButton);
edit_menu->set_text(TTR("Edit"));
edit_menu->set_switch_on_hover(true);
- edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
+
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
edit_menu->get_popup()->add_separator();
@@ -646,22 +603,22 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN);
edit_menu->get_popup()->add_separator();
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE);
- edit_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option));
search_menu = memnew(MenuButton);
search_menu->set_text(TTR("Search"));
search_menu->set_switch_on_hover(true);
- search_menu->get_popup()->set_hide_on_window_lose_focus(true);
+
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE);
- search_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option));
MenuButton *goto_menu = memnew(MenuButton);
goto_menu->set_text(TTR("Go To"));
goto_menu->set_switch_on_hover(true);
- goto_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option));
goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE);
goto_menu->get_popup()->add_separator();
@@ -671,14 +628,14 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
goto_menu->get_popup()->add_child(bookmarks_menu);
goto_menu->get_popup()->add_submenu_item(TTR("Bookmarks"), "Bookmarks");
_update_bookmark_list();
- bookmarks_menu->connect("about_to_show", this, "_update_bookmark_list");
- bookmarks_menu->connect("index_pressed", this, "_bookmark_item_pressed");
+ bookmarks_menu->connect("about_to_popup", callable_mp(this, &ShaderEditor::_update_bookmark_list));
+ bookmarks_menu->connect("index_pressed", callable_mp(this, &ShaderEditor::_bookmark_item_pressed));
help_menu = memnew(MenuButton);
help_menu->set_text(TTR("Help"));
help_menu->set_switch_on_hover(true);
- help_menu->get_popup()->add_icon_item(p_node->get_gui_base()->get_icon("Instance", "EditorIcons"), TTR("Online Docs"), HELP_DOCS);
- help_menu->get_popup()->connect("id_pressed", this, "_menu_option");
+ help_menu->get_popup()->add_icon_item(p_node->get_gui_base()->get_theme_icon("Instance", "EditorIcons"), TTR("Online Docs"), HELP_DOCS);
+ help_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option));
add_child(main_container);
main_container->add_child(hbc);
@@ -686,7 +643,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
hbc->add_child(edit_menu);
hbc->add_child(goto_menu);
hbc->add_child(help_menu);
- hbc->add_style_override("panel", p_node->get_gui_base()->get_stylebox("ScriptEditorPanel", "EditorStyles"));
+ hbc->add_theme_style_override("panel", p_node->get_gui_base()->get_theme_stylebox("ScriptEditorPanel", "EditorStyles"));
main_container->add_child(shader_editor);
goto_line_dialog = memnew(GotoLineDialog);
@@ -701,11 +658,11 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
dl->set_text(TTR("This shader has been modified on on disk.\nWhat action should be taken?"));
vbc->add_child(dl);
- disk_changed->connect("confirmed", this, "_reload_shader_from_disk");
+ disk_changed->connect("confirmed", callable_mp(this, &ShaderEditor::_reload_shader_from_disk));
disk_changed->get_ok()->set_text(TTR("Reload"));
- disk_changed->add_button(TTR("Resave"), !OS::get_singleton()->get_swap_ok_cancel(), "resave");
- disk_changed->connect("custom_action", this, "save_external_data");
+ disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave");
+ disk_changed->connect("custom_action", callable_mp(this, &ShaderEditor::save_external_data));
add_child(disk_changed);
@@ -713,49 +670,42 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
}
void ShaderEditorPlugin::edit(Object *p_object) {
-
Shader *s = Object::cast_to<Shader>(p_object);
shader_editor->edit(s);
}
bool ShaderEditorPlugin::handles(Object *p_object) const {
-
Shader *shader = Object::cast_to<Shader>(p_object);
- return shader != NULL && shader->is_text_shader();
+ return shader != nullptr && shader->is_text_shader();
}
void ShaderEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
button->show();
editor->make_bottom_panel_item_visible(shader_editor);
} else {
-
button->hide();
- if (shader_editor->is_visible_in_tree())
+ if (shader_editor->is_visible_in_tree()) {
editor->hide_bottom_panel();
+ }
shader_editor->apply_shaders();
}
}
void ShaderEditorPlugin::selected_notify() {
-
shader_editor->ensure_select_current();
}
void ShaderEditorPlugin::save_external_data() {
-
shader_editor->save_external_data();
}
void ShaderEditorPlugin::apply_changes() {
-
shader_editor->apply_shaders();
}
ShaderEditorPlugin::ShaderEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
shader_editor = memnew(ShaderEditor(p_node));
diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h
index 900b40bd7a..904aed186a 100644
--- a/editor/plugins/shader_editor_plugin.h
+++ b/editor/plugins/shader_editor_plugin.h
@@ -39,24 +39,24 @@
#include "scene/gui/text_edit.h"
#include "scene/main/timer.h"
#include "scene/resources/shader.h"
-#include "servers/visual/shader_language.h"
+#include "servers/rendering/shader_language.h"
class ShaderTextEditor : public CodeTextEditor {
-
GDCLASS(ShaderTextEditor, CodeTextEditor);
+ Ref<CodeHighlighter> syntax_highlighter;
Ref<Shader> shader;
void _check_shader_mode();
protected:
static void _bind_methods();
- virtual void _load_theme_settings();
+ virtual void _load_theme_settings() override;
- virtual void _code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options);
+ virtual void _code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options) override;
public:
- virtual void _validate_script();
+ virtual void _validate_script() override;
void reload_text();
@@ -66,7 +66,6 @@ public:
};
class ShaderEditor : public PanelContainer {
-
GDCLASS(ShaderEditor, PanelContainer);
enum {
@@ -136,14 +135,13 @@ public:
void goto_line_selection(int p_line, int p_begin, int p_end);
- virtual Size2 get_minimum_size() const { return Size2(0, 200); }
+ virtual Size2 get_minimum_size() const override { return Size2(0, 200); }
void save_external_data(const String &p_str = "");
ShaderEditor(EditorNode *p_node);
};
class ShaderEditorPlugin : public EditorPlugin {
-
GDCLASS(ShaderEditorPlugin, EditorPlugin);
bool _2d;
@@ -152,17 +150,17 @@ class ShaderEditorPlugin : public EditorPlugin {
Button *button;
public:
- virtual String get_name() const { return "Shader"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
- virtual void selected_notify();
+ virtual String get_name() const override { return "Shader"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+ virtual void selected_notify() override;
ShaderEditor *get_shader_editor() const { return shader_editor; }
- virtual void save_external_data();
- virtual void apply_changes();
+ virtual void save_external_data() override;
+ virtual void apply_changes() override;
ShaderEditorPlugin(EditorNode *p_node);
~ShaderEditorPlugin();
diff --git a/editor/plugins/shader_file_editor_plugin.cpp b/editor/plugins/shader_file_editor_plugin.cpp
new file mode 100644
index 0000000000..f15a801530
--- /dev/null
+++ b/editor/plugins/shader_file_editor_plugin.cpp
@@ -0,0 +1,324 @@
+/*************************************************************************/
+/* shader_file_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "shader_file_editor_plugin.h"
+
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/os/keyboard.h"
+#include "core/os/os.h"
+#include "editor/editor_node.h"
+#include "editor/editor_scale.h"
+#include "editor/editor_settings.h"
+#include "editor/property_editor.h"
+#include "servers/display_server.h"
+#include "servers/rendering/shader_types.h"
+
+/*** SHADER SCRIPT EDITOR ****/
+
+/*** SCRIPT EDITOR ******/
+
+void ShaderFileEditor::_update_version(const StringName &p_version_txt, const RD::ShaderStage p_stage) {
+}
+
+void ShaderFileEditor::_version_selected(int p_option) {
+ int c = versions->get_current();
+ StringName version_txt = versions->get_item_metadata(c);
+
+ RD::ShaderStage stage = RD::SHADER_STAGE_MAX;
+ int first_found = -1;
+
+ Ref<RDShaderBytecode> bytecode = shader_file->get_bytecode(version_txt);
+ ERR_FAIL_COND(bytecode.is_null());
+
+ for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) {
+ if (bytecode->get_stage_bytecode(RD::ShaderStage(i)).empty() && bytecode->get_stage_compile_error(RD::ShaderStage(i)) == String()) {
+ stages[i]->set_icon(Ref<Texture2D>());
+ continue;
+ }
+
+ Ref<Texture2D> icon;
+ if (bytecode->get_stage_compile_error(RD::ShaderStage(i)) != String()) {
+ icon = get_theme_icon("ImportFail", "EditorIcons");
+ } else {
+ icon = get_theme_icon("ImportCheck", "EditorIcons");
+ }
+ stages[i]->set_icon(icon);
+
+ if (first_found == -1) {
+ first_found = i;
+ }
+
+ if (stages[i]->is_pressed()) {
+ stage = RD::ShaderStage(i);
+ break;
+ }
+ }
+
+ error_text->clear();
+
+ if (stage == RD::SHADER_STAGE_MAX) { //need to change stage, does not have it
+ if (first_found == -1) {
+ error_text->add_text(TTR("No valid shader stages found."));
+ return; //well you did not put any stage I guess?
+ }
+ stages[first_found]->set_pressed(true);
+ stage = RD::ShaderStage(first_found);
+ }
+
+ String error = bytecode->get_stage_compile_error(stage);
+
+ error_text->push_font(get_theme_font("source", "EditorFonts"));
+
+ if (error == String()) {
+ error_text->add_text(TTR("Shader stage compiled without errors."));
+ } else {
+ error_text->add_text(error);
+ }
+}
+
+void ShaderFileEditor::_update_options() {
+ ERR_FAIL_COND(shader_file.is_null());
+
+ if (shader_file->get_base_error() != String()) {
+ stage_hb->hide();
+ versions->hide();
+ error_text->clear();
+ error_text->push_font(get_theme_font("source", "EditorFonts"));
+ error_text->add_text(vformat(TTR("File structure for '%s' contains unrecoverable errors:\n\n"), shader_file->get_path().get_file()));
+ error_text->add_text(shader_file->get_base_error());
+ return;
+ }
+
+ stage_hb->show();
+ versions->show();
+
+ int c = versions->get_current();
+ //remember current
+ versions->clear();
+ Vector<StringName> version_list = shader_file->get_version_list();
+
+ if (c >= version_list.size()) {
+ c = version_list.size() - 1;
+ }
+ if (c < 0) {
+ c = 0;
+ }
+
+ StringName current_version;
+
+ for (int i = 0; i < version_list.size(); i++) {
+ String title = version_list[i];
+ if (title == "") {
+ title = "default";
+ }
+
+ Ref<Texture2D> icon;
+
+ Ref<RDShaderBytecode> bytecode = shader_file->get_bytecode(version_list[i]);
+ ERR_FAIL_COND(bytecode.is_null());
+
+ bool failed = false;
+ for (int j = 0; j < RD::SHADER_STAGE_MAX; j++) {
+ String error = bytecode->get_stage_compile_error(RD::ShaderStage(j));
+ if (error != String()) {
+ failed = true;
+ }
+ }
+
+ if (failed) {
+ icon = get_theme_icon("ImportFail", "EditorIcons");
+ } else {
+ icon = get_theme_icon("ImportCheck", "EditorIcons");
+ }
+
+ versions->add_item(title, icon);
+ versions->set_item_metadata(i, version_list[i]);
+
+ if (i == c) {
+ versions->select(i);
+ current_version = version_list[i];
+ }
+ }
+
+ if (version_list.size() == 0) {
+ for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) {
+ stages[i]->set_disabled(true);
+ }
+ return;
+ }
+
+ Ref<RDShaderBytecode> bytecode = shader_file->get_bytecode(current_version);
+ ERR_FAIL_COND(bytecode.is_null());
+ int first_valid = -1;
+ int current = -1;
+ for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) {
+ Vector<uint8_t> bc = bytecode->get_stage_bytecode(RD::ShaderStage(i));
+ String error = bytecode->get_stage_compile_error(RD::ShaderStage(i));
+ bool disable = error == String() && bc.empty();
+ stages[i]->set_disabled(disable);
+ if (!disable) {
+ if (stages[i]->is_pressed()) {
+ current = i;
+ }
+ first_valid = i;
+ }
+ }
+
+ if (current == -1 && first_valid != -1) {
+ stages[first_valid]->set_pressed(true);
+ }
+
+ _version_selected(0);
+}
+
+void ShaderFileEditor::_notification(int p_what) {
+ if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) {
+ if (is_visible_in_tree() && shader_file.is_valid()) {
+ _update_options();
+ }
+ }
+}
+
+void ShaderFileEditor::_editor_settings_changed() {
+ if (is_visible_in_tree() && shader_file.is_valid()) {
+ _update_options();
+ }
+}
+
+void ShaderFileEditor::_bind_methods() {
+}
+
+void ShaderFileEditor::edit(const Ref<RDShaderFile> &p_shader) {
+ if (p_shader.is_null()) {
+ if (shader_file.is_valid()) {
+ shader_file->disconnect("changed", callable_mp(this, &ShaderFileEditor::_shader_changed));
+ }
+ return;
+ }
+
+ if (shader_file == p_shader) {
+ return;
+ }
+
+ shader_file = p_shader;
+
+ if (shader_file.is_valid()) {
+ shader_file->connect("changed", callable_mp(this, &ShaderFileEditor::_shader_changed));
+ }
+
+ _update_options();
+}
+
+void ShaderFileEditor::_shader_changed() {
+ if (is_visible_in_tree()) {
+ _update_options();
+ }
+}
+
+ShaderFileEditor *ShaderFileEditor::singleton = nullptr;
+
+ShaderFileEditor::ShaderFileEditor(EditorNode *p_node) {
+ singleton = this;
+ HSplitContainer *main_hs = memnew(HSplitContainer);
+
+ add_child(main_hs);
+
+ versions = memnew(ItemList);
+ versions->connect("item_selected", callable_mp(this, &ShaderFileEditor::_version_selected));
+ versions->set_custom_minimum_size(Size2i(200 * EDSCALE, 0));
+ main_hs->add_child(versions);
+
+ VBoxContainer *main_vb = memnew(VBoxContainer);
+ main_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ main_hs->add_child(main_vb);
+
+ static const char *stage_str[RD::SHADER_STAGE_MAX] = {
+ "Vertex",
+ "Fragment",
+ "TessControl",
+ "TessEval",
+ "Compute"
+ };
+
+ stage_hb = memnew(HBoxContainer);
+ main_vb->add_child(stage_hb);
+
+ Ref<ButtonGroup> bg;
+ bg.instance();
+ for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) {
+ Button *button = memnew(Button(stage_str[i]));
+ button->set_toggle_mode(true);
+ button->set_focus_mode(FOCUS_NONE);
+ stage_hb->add_child(button);
+ stages[i] = button;
+ button->set_button_group(bg);
+ button->connect("pressed", callable_mp(this, &ShaderFileEditor::_version_selected), varray(i));
+ }
+
+ error_text = memnew(RichTextLabel);
+ error_text->set_v_size_flags(SIZE_EXPAND_FILL);
+ main_vb->add_child(error_text);
+}
+
+void ShaderFileEditorPlugin::edit(Object *p_object) {
+ RDShaderFile *s = Object::cast_to<RDShaderFile>(p_object);
+ shader_editor->edit(s);
+}
+
+bool ShaderFileEditorPlugin::handles(Object *p_object) const {
+ RDShaderFile *shader = Object::cast_to<RDShaderFile>(p_object);
+ return shader != nullptr;
+}
+
+void ShaderFileEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ button->show();
+ editor->make_bottom_panel_item_visible(shader_editor);
+
+ } else {
+ button->hide();
+ if (shader_editor->is_visible_in_tree()) {
+ editor->hide_bottom_panel();
+ }
+ }
+}
+
+ShaderFileEditorPlugin::ShaderFileEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ shader_editor = memnew(ShaderFileEditor(p_node));
+
+ shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE);
+ button = editor->add_bottom_panel_item(TTR("ShaderFile"), shader_editor);
+ button->hide();
+}
+
+ShaderFileEditorPlugin::~ShaderFileEditorPlugin() {
+}
diff --git a/editor/plugins/shader_file_editor_plugin.h b/editor/plugins/shader_file_editor_plugin.h
new file mode 100644
index 0000000000..6858f7d933
--- /dev/null
+++ b/editor/plugins/shader_file_editor_plugin.h
@@ -0,0 +1,92 @@
+/*************************************************************************/
+/* shader_file_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SHADER_FILE_EDITOR_PLUGIN_H
+#define SHADER_FILE_EDITOR_PLUGIN_H
+
+#include "editor/code_editor.h"
+#include "editor/editor_plugin.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/panel_container.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/gui/tab_container.h"
+#include "scene/gui/text_edit.h"
+#include "scene/main/timer.h"
+#include "servers/rendering/rendering_device_binds.h"
+
+class ShaderFileEditor : public PanelContainer {
+ GDCLASS(ShaderFileEditor, PanelContainer);
+
+ Ref<RDShaderFile> shader_file;
+
+ HBoxContainer *stage_hb;
+ ItemList *versions;
+ Button *stages[RD::SHADER_STAGE_MAX];
+ RichTextLabel *error_text;
+
+ void _update_version(const StringName &p_version_txt, const RenderingDevice::ShaderStage p_stage);
+ void _version_selected(int p_stage);
+ void _editor_settings_changed();
+
+ void _update_options();
+ void _shader_changed();
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ static ShaderFileEditor *singleton;
+ void edit(const Ref<RDShaderFile> &p_shader);
+
+ ShaderFileEditor(EditorNode *p_node);
+};
+
+class ShaderFileEditorPlugin : public EditorPlugin {
+ GDCLASS(ShaderFileEditorPlugin, EditorPlugin);
+
+ ShaderFileEditor *shader_editor;
+ EditorNode *editor;
+ Button *button;
+
+public:
+ virtual String get_name() const override { return "ShaderFile"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ ShaderFileEditor *get_shader_editor() const { return shader_editor; }
+
+ ShaderFileEditorPlugin(EditorNode *p_node);
+ ~ShaderFileEditorPlugin();
+};
+
+#endif // SHADER_FILE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/skeleton_2d_editor_plugin.cpp b/editor/plugins/skeleton_2d_editor_plugin.cpp
index dbe64f202d..a198e4ff8f 100644
--- a/editor/plugins/skeleton_2d_editor_plugin.cpp
+++ b/editor/plugins/skeleton_2d_editor_plugin.cpp
@@ -36,30 +36,26 @@
#include "thirdparty/misc/clipper.hpp"
void Skeleton2DEditor::_node_removed(Node *p_node) {
-
if (p_node == node) {
- node = NULL;
+ node = nullptr;
options->hide();
}
}
void Skeleton2DEditor::edit(Skeleton2D *p_sprite) {
-
node = p_sprite;
}
void Skeleton2DEditor::_menu_option(int p_option) {
-
if (!node) {
return;
}
switch (p_option) {
case MENU_OPTION_MAKE_REST: {
-
if (node->get_bone_count() == 0) {
err_dialog->set_text(TTR("This skeleton has no bones, create some children Bone2D nodes."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
@@ -75,7 +71,7 @@ void Skeleton2DEditor::_menu_option(int p_option) {
case MENU_OPTION_SET_REST: {
if (node->get_bone_count() == 0) {
err_dialog->set_text(TTR("This skeleton has no bones, create some children Bone2D nodes."));
- err_dialog->popup_centered_minsize();
+ err_dialog->popup_centered();
return;
}
UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
@@ -92,53 +88,45 @@ void Skeleton2DEditor::_menu_option(int p_option) {
}
void Skeleton2DEditor::_bind_methods() {
-
- ClassDB::bind_method("_menu_option", &Skeleton2DEditor::_menu_option);
}
Skeleton2DEditor::Skeleton2DEditor() {
-
options = memnew(MenuButton);
CanvasItemEditor::get_singleton()->add_control_to_menu_panel(options);
options->set_text(TTR("Skeleton2D"));
- options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Skeleton2D", "EditorIcons"));
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Skeleton2D", "EditorIcons"));
options->get_popup()->add_item(TTR("Make Rest Pose (From Bones)"), MENU_OPTION_MAKE_REST);
options->get_popup()->add_separator();
options->get_popup()->add_item(TTR("Set Bones to Rest Pose"), MENU_OPTION_SET_REST);
options->set_switch_on_hover(true);
- options->get_popup()->connect("id_pressed", this, "_menu_option");
+ options->get_popup()->connect("id_pressed", callable_mp(this, &Skeleton2DEditor::_menu_option));
err_dialog = memnew(AcceptDialog);
add_child(err_dialog);
}
void Skeleton2DEditorPlugin::edit(Object *p_object) {
-
sprite_editor->edit(Object::cast_to<Skeleton2D>(p_object));
}
bool Skeleton2DEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("Skeleton2D");
}
void Skeleton2DEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
sprite_editor->options->show();
} else {
-
sprite_editor->options->hide();
- sprite_editor->edit(NULL);
+ sprite_editor->edit(nullptr);
}
}
Skeleton2DEditorPlugin::Skeleton2DEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
sprite_editor = memnew(Skeleton2DEditor);
editor->get_viewport()->add_child(sprite_editor);
diff --git a/editor/plugins/skeleton_2d_editor_plugin.h b/editor/plugins/skeleton_2d_editor_plugin.h
index ebc6746b81..b8377fc914 100644
--- a/editor/plugins/skeleton_2d_editor_plugin.h
+++ b/editor/plugins/skeleton_2d_editor_plugin.h
@@ -37,7 +37,6 @@
#include "scene/gui/spin_box.h"
class Skeleton2DEditor : public Control {
-
GDCLASS(Skeleton2DEditor, Control);
enum Menu {
@@ -65,18 +64,17 @@ public:
};
class Skeleton2DEditorPlugin : public EditorPlugin {
-
GDCLASS(Skeleton2DEditorPlugin, EditorPlugin);
Skeleton2DEditor *sprite_editor;
EditorNode *editor;
public:
- virtual String get_name() const { return "Skeleton2D"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "Skeleton2D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
Skeleton2DEditorPlugin(EditorNode *p_node);
~Skeleton2DEditorPlugin();
diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..52da8dea19
--- /dev/null
+++ b/editor/plugins/skeleton_3d_editor_plugin.cpp
@@ -0,0 +1,686 @@
+/*************************************************************************/
+/* skeleton_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "skeleton_3d_editor_plugin.h"
+
+#include "core/io/resource_saver.h"
+#include "editor/editor_file_dialog.h"
+#include "editor/editor_properties.h"
+#include "editor/editor_scale.h"
+#include "editor/plugins/animation_player_editor_plugin.h"
+#include "node_3d_editor_plugin.h"
+#include "scene/3d/collision_shape_3d.h"
+#include "scene/3d/mesh_instance_3d.h"
+#include "scene/3d/physics_body_3d.h"
+#include "scene/3d/physics_joint_3d.h"
+#include "scene/resources/capsule_shape_3d.h"
+#include "scene/resources/sphere_shape_3d.h"
+
+void BoneTransformEditor::create_editors() {
+ const Color section_color = get_theme_color("prop_subsection", "Editor");
+
+ section = memnew(EditorInspectorSection);
+ section->setup("trf_properties", label, this, section_color, true);
+ add_child(section);
+
+ key_button = memnew(Button);
+ key_button->set_text(TTR("Key Transform"));
+ key_button->set_visible(keyable);
+ key_button->set_icon(get_theme_icon("Key", "EditorIcons"));
+ key_button->set_flat(true);
+ section->get_vbox()->add_child(key_button);
+
+ enabled_checkbox = memnew(CheckBox(TTR("Pose Enabled")));
+ enabled_checkbox->set_flat(true);
+ enabled_checkbox->set_visible(toggle_enabled);
+ section->get_vbox()->add_child(enabled_checkbox);
+
+ // Translation property
+ translation_property = memnew(EditorPropertyVector3());
+ translation_property->setup(-10000, 10000, 0.001f, true);
+ translation_property->set_label("Translation");
+ translation_property->set_use_folding(true);
+ translation_property->set_read_only(false);
+ translation_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_vector3));
+ section->get_vbox()->add_child(translation_property);
+
+ // Rotation property
+ rotation_property = memnew(EditorPropertyVector3());
+ rotation_property->setup(-10000, 10000, 0.001f, true);
+ rotation_property->set_label("Rotation Degrees");
+ rotation_property->set_use_folding(true);
+ rotation_property->set_read_only(false);
+ rotation_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_vector3));
+ section->get_vbox()->add_child(rotation_property);
+
+ // Scale property
+ scale_property = memnew(EditorPropertyVector3());
+ scale_property->setup(-10000, 10000, 0.001f, true);
+ scale_property->set_label("Scale");
+ scale_property->set_use_folding(true);
+ scale_property->set_read_only(false);
+ scale_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_vector3));
+ section->get_vbox()->add_child(scale_property);
+
+ // Transform/Matrix section
+ transform_section = memnew(EditorInspectorSection);
+ transform_section->setup("trf_properties_transform", "Matrix", this, section_color, true);
+ section->get_vbox()->add_child(transform_section);
+
+ // Transform/Matrix property
+ transform_property = memnew(EditorPropertyTransform());
+ transform_property->setup(-10000, 10000, 0.001f, true);
+ transform_property->set_label("Transform");
+ transform_property->set_use_folding(true);
+ transform_property->set_read_only(false);
+ transform_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_transform));
+ transform_section->get_vbox()->add_child(transform_property);
+}
+
+void BoneTransformEditor::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ create_editors();
+ key_button->connect("pressed", callable_mp(this, &BoneTransformEditor::_key_button_pressed));
+ enabled_checkbox->connect("toggled", callable_mp(this, &BoneTransformEditor::_checkbox_toggled));
+ [[fallthrough]];
+ }
+ case NOTIFICATION_SORT_CHILDREN: {
+ const Ref<Font> font = get_theme_font("font", "Tree");
+
+ Point2 buffer;
+ buffer.x += get_theme_constant("inspector_margin", "Editor");
+ buffer.y += font->get_height();
+ buffer.y += get_theme_constant("vseparation", "Tree");
+
+ const float vector_height = translation_property->get_size().y;
+ const float transform_height = transform_property->get_size().y;
+ const float button_height = key_button->get_size().y;
+
+ const float width = get_size().x - get_theme_constant("inspector_margin", "Editor");
+ Vector<Rect2> input_rects;
+ if (keyable && section->get_vbox()->is_visible()) {
+ input_rects.push_back(Rect2(key_button->get_position() + buffer, Size2(width, button_height)));
+ } else {
+ input_rects.push_back(Rect2(0, 0, 0, 0));
+ }
+
+ if (section->get_vbox()->is_visible()) {
+ input_rects.push_back(Rect2(translation_property->get_position() + buffer, Size2(width, vector_height)));
+ input_rects.push_back(Rect2(rotation_property->get_position() + buffer, Size2(width, vector_height)));
+ input_rects.push_back(Rect2(scale_property->get_position() + buffer, Size2(width, vector_height)));
+ input_rects.push_back(Rect2(transform_property->get_position() + buffer, Size2(width, transform_height)));
+ } else {
+ const int32_t start = input_rects.size();
+ const int32_t empty_input_rect_elements = 4;
+ const int32_t end = start + empty_input_rect_elements;
+ for (int i = start; i < end; ++i) {
+ input_rects.push_back(Rect2(0, 0, 0, 0));
+ }
+ }
+
+ for (int32_t i = 0; i < input_rects.size(); i++) {
+ background_rects[i] = input_rects[i];
+ }
+
+ update();
+ break;
+ }
+ case NOTIFICATION_DRAW: {
+ const Color dark_color = get_theme_color("dark_color_2", "Editor");
+
+ for (int i = 0; i < 5; ++i) {
+ draw_rect(background_rects[i], dark_color);
+ }
+
+ break;
+ }
+ }
+}
+
+void BoneTransformEditor::_value_changed(const double p_value) {
+ if (updating)
+ return;
+
+ Transform tform = compute_transform_from_vector3s();
+ _change_transform(tform);
+}
+
+void BoneTransformEditor::_value_changed_vector3(const String p_property_name, const Vector3 p_vector, const StringName p_edited_property_name, const bool p_boolean) {
+ if (updating)
+ return;
+ Transform tform = compute_transform_from_vector3s();
+ _change_transform(tform);
+}
+
+Transform BoneTransformEditor::compute_transform_from_vector3s() const {
+ // Convert rotation from degrees to radians.
+ Vector3 prop_rotation = rotation_property->get_vector();
+ prop_rotation.x = Math::deg2rad(prop_rotation.x);
+ prop_rotation.y = Math::deg2rad(prop_rotation.y);
+ prop_rotation.z = Math::deg2rad(prop_rotation.z);
+
+ return Transform(
+ Basis(prop_rotation, scale_property->get_vector()),
+ translation_property->get_vector());
+}
+
+void BoneTransformEditor::_value_changed_transform(const String p_property_name, const Transform p_transform, const StringName p_edited_property_name, const bool p_boolean) {
+ if (updating)
+ return;
+ _change_transform(p_transform);
+}
+
+void BoneTransformEditor::_change_transform(Transform p_new_transform) {
+ if (property.get_slicec('/', 0) == "bones" && property.get_slicec('/', 2) == "custom_pose") {
+ undo_redo->create_action(TTR("Set Custom Bone Pose Transform"), UndoRedo::MERGE_ENDS);
+ undo_redo->add_undo_method(skeleton, "set_bone_custom_pose", property.get_slicec('/', 1).to_int(), skeleton->get_bone_custom_pose(property.get_slicec('/', 1).to_int()));
+ undo_redo->add_do_method(skeleton, "set_bone_custom_pose", property.get_slicec('/', 1).to_int(), p_new_transform);
+ undo_redo->commit_action();
+ } else if (property.get_slicec('/', 0) == "bones") {
+ undo_redo->create_action(TTR("Set Bone Transform"), UndoRedo::MERGE_ENDS);
+ undo_redo->add_undo_property(skeleton, property, skeleton->get(property));
+ undo_redo->add_do_property(skeleton, property, p_new_transform);
+ undo_redo->commit_action();
+ }
+}
+
+void BoneTransformEditor::update_enabled_checkbox() {
+ if (enabled_checkbox) {
+ const String path = "bones/" + property.get_slicec('/', 1) + "/enabled";
+ const bool is_enabled = skeleton->get(path);
+ enabled_checkbox->set_pressed(is_enabled);
+ }
+}
+
+void BoneTransformEditor::_update_properties() {
+ if (updating)
+ return;
+
+ if (skeleton == nullptr)
+ return;
+
+ updating = true;
+
+ Transform tform = skeleton->get(property);
+ _update_transform_properties(tform);
+}
+
+void BoneTransformEditor::_update_custom_pose_properties() {
+ if (updating)
+ return;
+
+ if (skeleton == nullptr)
+ return;
+
+ updating = true;
+
+ Transform tform = skeleton->get_bone_custom_pose(property.to_int());
+ _update_transform_properties(tform);
+}
+
+void BoneTransformEditor::_update_transform_properties(Transform tform) {
+ Basis rotation_basis = tform.get_basis();
+ Vector3 rotation_radians = rotation_basis.get_rotation_euler();
+ Vector3 rotation_degrees = Vector3(Math::rad2deg(rotation_radians.x), Math::rad2deg(rotation_radians.y), Math::rad2deg(rotation_radians.z));
+ Vector3 translation = tform.get_origin();
+ Vector3 scale = tform.basis.get_scale();
+
+ translation_property->update_using_vector(translation);
+ rotation_property->update_using_vector(rotation_degrees);
+ scale_property->update_using_vector(scale);
+ transform_property->update_using_transform(tform);
+
+ update_enabled_checkbox();
+ updating = false;
+}
+
+BoneTransformEditor::BoneTransformEditor(Skeleton3D *p_skeleton) :
+ skeleton(p_skeleton),
+ key_button(nullptr),
+ enabled_checkbox(nullptr),
+ keyable(false),
+ toggle_enabled(false),
+ updating(false) {
+ undo_redo = EditorNode::get_undo_redo();
+}
+
+void BoneTransformEditor::set_target(const String &p_prop) {
+ property = p_prop;
+}
+
+void BoneTransformEditor::set_keyable(const bool p_keyable) {
+ keyable = p_keyable;
+ if (key_button) {
+ key_button->set_visible(p_keyable);
+ }
+}
+
+void BoneTransformEditor::set_toggle_enabled(const bool p_enabled) {
+ toggle_enabled = p_enabled;
+ if (enabled_checkbox) {
+ enabled_checkbox->set_visible(p_enabled);
+ }
+}
+
+void BoneTransformEditor::_key_button_pressed() {
+ if (skeleton == nullptr)
+ return;
+
+ const BoneId bone_id = property.get_slicec('/', 1).to_int();
+ const String name = skeleton->get_bone_name(bone_id);
+
+ if (name.empty())
+ return;
+
+ // Need to normalize the basis before you key it
+ Transform tform = compute_transform_from_vector3s();
+ tform.orthonormalize();
+ AnimationPlayerEditor::singleton->get_track_editor()->insert_transform_key(skeleton, name, tform);
+}
+
+void BoneTransformEditor::_checkbox_toggled(const bool p_toggled) {
+ if (enabled_checkbox) {
+ const String path = "bones/" + property.get_slicec('/', 1) + "/enabled";
+ skeleton->set(path, p_toggled);
+ }
+}
+
+void Skeleton3DEditor::_on_click_option(int p_option) {
+ if (!skeleton) {
+ return;
+ }
+
+ switch (p_option) {
+ case MENU_OPTION_CREATE_PHYSICAL_SKELETON: {
+ create_physical_skeleton();
+ break;
+ }
+ }
+}
+
+void Skeleton3DEditor::create_physical_skeleton() {
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ERR_FAIL_COND(!get_tree());
+ Node *owner = skeleton == get_tree()->get_edited_scene_root() ? skeleton : skeleton->get_owner();
+
+ const int bc = skeleton->get_bone_count();
+
+ if (!bc) {
+ return;
+ }
+
+ Vector<BoneInfo> bones_infos;
+ bones_infos.resize(bc);
+
+ for (int bone_id = 0; bc > bone_id; ++bone_id) {
+ const int parent = skeleton->get_bone_parent(bone_id);
+
+ if (parent < 0) {
+ bones_infos.write[bone_id].relative_rest = skeleton->get_bone_rest(bone_id);
+
+ } else {
+ const int parent_parent = skeleton->get_bone_parent(parent);
+
+ bones_infos.write[bone_id].relative_rest = bones_infos[parent].relative_rest * skeleton->get_bone_rest(bone_id);
+
+ /// create physical bone on parent
+ if (!bones_infos[parent].physical_bone) {
+ bones_infos.write[parent].physical_bone = create_physical_bone(parent, bone_id, bones_infos);
+
+ ur->create_action(TTR("Create physical bones"));
+ ur->add_do_method(skeleton, "add_child", bones_infos[parent].physical_bone);
+ ur->add_do_reference(bones_infos[parent].physical_bone);
+ ur->add_undo_method(skeleton, "remove_child", bones_infos[parent].physical_bone);
+ ur->commit_action();
+
+ bones_infos[parent].physical_bone->set_bone_name(skeleton->get_bone_name(parent));
+ bones_infos[parent].physical_bone->set_owner(owner);
+ bones_infos[parent].physical_bone->get_child(0)->set_owner(owner); // set shape owner
+
+ /// Create joint between parent of parent
+ if (-1 != parent_parent) {
+ bones_infos[parent].physical_bone->set_joint_type(PhysicalBone3D::JOINT_TYPE_PIN);
+ }
+ }
+ }
+ }
+}
+
+PhysicalBone3D *Skeleton3DEditor::create_physical_bone(int bone_id, int bone_child_id, const Vector<BoneInfo> &bones_infos) {
+ const Transform child_rest = skeleton->get_bone_rest(bone_child_id);
+
+ const real_t half_height(child_rest.origin.length() * 0.5);
+ const real_t radius(half_height * 0.2);
+
+ CapsuleShape3D *bone_shape_capsule = memnew(CapsuleShape3D);
+ bone_shape_capsule->set_height((half_height - radius) * 2);
+ bone_shape_capsule->set_radius(radius);
+
+ CollisionShape3D *bone_shape = memnew(CollisionShape3D);
+ bone_shape->set_shape(bone_shape_capsule);
+
+ Transform body_transform;
+ body_transform.set_look_at(Vector3(0, 0, 0), child_rest.origin, Vector3(0, 1, 0));
+ body_transform.origin = body_transform.basis.xform(Vector3(0, 0, -half_height));
+
+ Transform joint_transform;
+ joint_transform.origin = Vector3(0, 0, half_height);
+
+ PhysicalBone3D *physical_bone = memnew(PhysicalBone3D);
+ physical_bone->add_child(bone_shape);
+ physical_bone->set_name("Physical Bone " + skeleton->get_bone_name(bone_id));
+ physical_bone->set_body_offset(body_transform);
+ physical_bone->set_joint_offset(joint_transform);
+ return physical_bone;
+}
+
+Variant Skeleton3DEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
+ TreeItem *selected = joint_tree->get_selected();
+
+ if (!selected)
+ return Variant();
+
+ Ref<Texture> icon = selected->get_icon(0);
+
+ VBoxContainer *vb = memnew(VBoxContainer);
+ HBoxContainer *hb = memnew(HBoxContainer);
+ TextureRect *tf = memnew(TextureRect);
+ tf->set_texture(icon);
+ tf->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
+ hb->add_child(tf);
+ Label *label = memnew(Label(selected->get_text(0)));
+ hb->add_child(label);
+ vb->add_child(hb);
+ hb->set_modulate(Color(1, 1, 1, 1));
+
+ set_drag_preview(vb);
+ Dictionary drag_data;
+ drag_data["type"] = "nodes";
+ drag_data["node"] = selected;
+
+ return drag_data;
+}
+
+bool Skeleton3DEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
+ TreeItem *target = joint_tree->get_item_at_position(p_point);
+ if (!target)
+ return false;
+
+ const String path = target->get_metadata(0);
+ if (!path.begins_with("bones/"))
+ return false;
+
+ TreeItem *selected = Object::cast_to<TreeItem>(Dictionary(p_data)["node"]);
+ if (target == selected)
+ return false;
+
+ const String path2 = target->get_metadata(0);
+ if (!path2.begins_with("bones/"))
+ return false;
+
+ return true;
+}
+
+void Skeleton3DEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+ if (!can_drop_data_fw(p_point, p_data, p_from))
+ return;
+
+ TreeItem *target = joint_tree->get_item_at_position(p_point);
+ TreeItem *selected = Object::cast_to<TreeItem>(Dictionary(p_data)["node"]);
+
+ const BoneId target_boneidx = String(target->get_metadata(0)).get_slicec('/', 1).to_int();
+ const BoneId selected_boneidx = String(selected->get_metadata(0)).get_slicec('/', 1).to_int();
+
+ move_skeleton_bone(skeleton->get_path(), selected_boneidx, target_boneidx);
+}
+
+void Skeleton3DEditor::move_skeleton_bone(NodePath p_skeleton_path, int32_t p_selected_boneidx, int32_t p_target_boneidx) {
+ Node *node = get_node_or_null(p_skeleton_path);
+ Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node);
+ ERR_FAIL_NULL(skeleton);
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Set Bone Parentage"));
+ // If the target is a child of ourselves, we move only *us* and not our children
+ if (skeleton->is_bone_parent_of(p_target_boneidx, p_selected_boneidx)) {
+ const BoneId parent_idx = skeleton->get_bone_parent(p_selected_boneidx);
+ const int bone_count = skeleton->get_bone_count();
+ for (BoneId i = 0; i < bone_count; ++i) {
+ if (skeleton->get_bone_parent(i) == p_selected_boneidx) {
+ ur->add_undo_method(skeleton, "set_bone_parent", i, skeleton->get_bone_parent(i));
+ ur->add_do_method(skeleton, "set_bone_parent", i, parent_idx);
+ skeleton->set_bone_parent(i, parent_idx);
+ }
+ }
+ }
+ ur->add_undo_method(skeleton, "set_bone_parent", p_selected_boneidx, skeleton->get_bone_parent(p_selected_boneidx));
+ ur->add_do_method(skeleton, "set_bone_parent", p_selected_boneidx, p_target_boneidx);
+ skeleton->set_bone_parent(p_selected_boneidx, p_target_boneidx);
+
+ update_joint_tree();
+ ur->commit_action();
+}
+
+void Skeleton3DEditor::_joint_tree_selection_changed() {
+ TreeItem *selected = joint_tree->get_selected();
+ const String path = selected->get_metadata(0);
+
+ if (path.begins_with("bones/")) {
+ const int b_idx = path.get_slicec('/', 1).to_int();
+ const String bone_path = "bones/" + itos(b_idx) + "/";
+
+ pose_editor->set_target(bone_path + "pose");
+ rest_editor->set_target(bone_path + "rest");
+ custom_pose_editor->set_target(bone_path + "custom_pose");
+
+ pose_editor->set_visible(true);
+ rest_editor->set_visible(true);
+ custom_pose_editor->set_visible(true);
+ }
+}
+
+void Skeleton3DEditor::_joint_tree_rmb_select(const Vector2 &p_pos) {
+}
+
+void Skeleton3DEditor::_update_properties() {
+ if (rest_editor)
+ rest_editor->_update_properties();
+ if (pose_editor)
+ pose_editor->_update_properties();
+ if (custom_pose_editor)
+ custom_pose_editor->_update_custom_pose_properties();
+}
+
+void Skeleton3DEditor::update_joint_tree() {
+ joint_tree->clear();
+
+ if (skeleton == nullptr)
+ return;
+
+ TreeItem *root = joint_tree->create_item();
+
+ Map<int, TreeItem *> items;
+
+ items.insert(-1, root);
+
+ const Vector<int> &joint_porder = skeleton->get_bone_process_orders();
+ Ref<Texture> bone_icon = get_theme_icon("BoneAttachment3D", "EditorIcons");
+
+ for (int i = 0; i < joint_porder.size(); ++i) {
+ const int b_idx = joint_porder[i];
+
+ const int p_idx = skeleton->get_bone_parent(b_idx);
+ TreeItem *p_item = items.find(p_idx)->get();
+
+ TreeItem *joint_item = joint_tree->create_item(p_item);
+ items.insert(b_idx, joint_item);
+
+ joint_item->set_text(0, skeleton->get_bone_name(b_idx));
+ joint_item->set_icon(0, bone_icon);
+ joint_item->set_selectable(0, true);
+ joint_item->set_metadata(0, "bones/" + itos(b_idx));
+ }
+}
+
+void Skeleton3DEditor::update_editors() {
+}
+
+void Skeleton3DEditor::create_editors() {
+ set_h_size_flags(SIZE_EXPAND_FILL);
+ add_theme_constant_override("separation", 0);
+
+ set_focus_mode(FOCUS_ALL);
+
+ // Create Top Menu Bar
+ options = memnew(MenuButton);
+ Node3DEditor::get_singleton()->add_control_to_menu_panel(options);
+
+ options->set_text(TTR("Skeleton3D"));
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Skeleton3D", "EditorIcons"));
+
+ options->get_popup()->add_item(TTR("Create physical skeleton"), MENU_OPTION_CREATE_PHYSICAL_SKELETON);
+
+ options->get_popup()->connect("id_pressed", callable_mp(this, &Skeleton3DEditor::_on_click_option));
+
+ const Color section_color = get_theme_color("prop_subsection", "Editor");
+
+ EditorInspectorSection *bones_section = memnew(EditorInspectorSection);
+ bones_section->setup("bones", "Bones", skeleton, section_color, true);
+ add_child(bones_section);
+ bones_section->unfold();
+
+ ScrollContainer *s_con = memnew(ScrollContainer);
+ s_con->set_h_size_flags(SIZE_EXPAND_FILL);
+ s_con->set_custom_minimum_size(Size2(1, 350) * EDSCALE);
+ bones_section->get_vbox()->add_child(s_con);
+
+ joint_tree = memnew(Tree);
+ joint_tree->set_columns(1);
+ joint_tree->set_focus_mode(Control::FocusMode::FOCUS_NONE);
+ joint_tree->set_select_mode(Tree::SELECT_SINGLE);
+ joint_tree->set_hide_root(true);
+ joint_tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ joint_tree->set_h_size_flags(SIZE_EXPAND_FILL);
+ joint_tree->set_allow_rmb_select(true);
+ joint_tree->set_drag_forwarding(this);
+ s_con->add_child(joint_tree);
+
+ pose_editor = memnew(BoneTransformEditor(skeleton));
+ pose_editor->set_label(TTR("Bone Pose"));
+ pose_editor->set_keyable(AnimationPlayerEditor::singleton->get_track_editor()->has_keying());
+ pose_editor->set_toggle_enabled(true);
+ pose_editor->set_visible(false);
+ add_child(pose_editor);
+
+ rest_editor = memnew(BoneTransformEditor(skeleton));
+ rest_editor->set_label(TTR("Bone Rest"));
+ rest_editor->set_visible(false);
+ add_child(rest_editor);
+
+ custom_pose_editor = memnew(BoneTransformEditor(skeleton));
+ custom_pose_editor->set_label(TTR("Bone Custom Pose"));
+ custom_pose_editor->set_visible(false);
+ add_child(custom_pose_editor);
+}
+
+void Skeleton3DEditor::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ create_editors();
+ update_joint_tree();
+ update_editors();
+
+ get_tree()->connect("node_removed", callable_mp(this, &Skeleton3DEditor::_node_removed), Vector<Variant>(), Object::CONNECT_ONESHOT);
+ joint_tree->connect("item_selected", callable_mp(this, &Skeleton3DEditor::_joint_tree_selection_changed));
+ joint_tree->connect("item_rmb_selected", callable_mp(this, &Skeleton3DEditor::_joint_tree_rmb_select));
+#ifdef TOOLS_ENABLED
+ skeleton->connect("pose_updated", callable_mp(this, &Skeleton3DEditor::_update_properties));
+#endif // TOOLS_ENABLED
+
+ break;
+ }
+ }
+}
+
+void Skeleton3DEditor::_node_removed(Node *p_node) {
+ if (skeleton && p_node == skeleton) {
+ skeleton = nullptr;
+ options->hide();
+ }
+
+ _update_properties();
+}
+
+void Skeleton3DEditor::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_node_removed"), &Skeleton3DEditor::_node_removed);
+ ClassDB::bind_method(D_METHOD("_joint_tree_selection_changed"), &Skeleton3DEditor::_joint_tree_selection_changed);
+ ClassDB::bind_method(D_METHOD("_joint_tree_rmb_select"), &Skeleton3DEditor::_joint_tree_rmb_select);
+ ClassDB::bind_method(D_METHOD("_update_properties"), &Skeleton3DEditor::_update_properties);
+ ClassDB::bind_method(D_METHOD("_on_click_option"), &Skeleton3DEditor::_on_click_option);
+
+ ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &Skeleton3DEditor::get_drag_data_fw);
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &Skeleton3DEditor::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &Skeleton3DEditor::drop_data_fw);
+ ClassDB::bind_method(D_METHOD("move_skeleton_bone"), &Skeleton3DEditor::move_skeleton_bone);
+}
+
+Skeleton3DEditor::Skeleton3DEditor(EditorInspectorPluginSkeleton *e_plugin, EditorNode *p_editor, Skeleton3D *p_skeleton) :
+ editor(p_editor),
+ editor_plugin(e_plugin),
+ skeleton(p_skeleton) {
+}
+
+Skeleton3DEditor::~Skeleton3DEditor() {
+ if (options) {
+ Node3DEditor::get_singleton()->remove_control_from_menu_panel(options);
+ }
+}
+
+bool EditorInspectorPluginSkeleton::can_handle(Object *p_object) {
+ return Object::cast_to<Skeleton3D>(p_object) != nullptr;
+}
+
+void EditorInspectorPluginSkeleton::parse_begin(Object *p_object) {
+ Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(p_object);
+ ERR_FAIL_COND(!skeleton);
+
+ Skeleton3DEditor *skel_editor = memnew(Skeleton3DEditor(this, editor, skeleton));
+ add_custom_control(skel_editor);
+}
+
+Skeleton3DEditorPlugin::Skeleton3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+
+ Ref<EditorInspectorPluginSkeleton> skeleton_plugin;
+ skeleton_plugin.instance();
+ skeleton_plugin->editor = editor;
+
+ EditorInspector::add_inspector_plugin(skeleton_plugin);
+}
diff --git a/editor/plugins/skeleton_3d_editor_plugin.h b/editor/plugins/skeleton_3d_editor_plugin.h
new file mode 100644
index 0000000000..7843fc1754
--- /dev/null
+++ b/editor/plugins/skeleton_3d_editor_plugin.h
@@ -0,0 +1,208 @@
+/*************************************************************************/
+/* skeleton_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SKELETON_3D_EDITOR_PLUGIN_H
+#define SKELETON_3D_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/3d/skeleton_3d.h"
+
+class EditorInspectorPluginSkeleton;
+class Joint;
+class PhysicalBone3D;
+class Skeleton3DEditorPlugin;
+class Button;
+class CheckBox;
+class EditorPropertyTransform;
+class EditorPropertyVector3;
+
+class BoneTransformEditor : public VBoxContainer {
+ GDCLASS(BoneTransformEditor, VBoxContainer);
+
+ EditorInspectorSection *section;
+
+ EditorPropertyVector3 *translation_property;
+ EditorPropertyVector3 *rotation_property;
+ EditorPropertyVector3 *scale_property;
+ EditorInspectorSection *transform_section;
+ EditorPropertyTransform *transform_property;
+
+ Rect2 background_rects[5];
+
+ Skeleton3D *skeleton;
+ String property;
+
+ UndoRedo *undo_redo;
+
+ Button *key_button;
+ CheckBox *enabled_checkbox;
+
+ bool keyable;
+ bool toggle_enabled;
+ bool updating;
+
+ String label;
+
+ void create_editors();
+
+ // Called when one of the EditorSpinSliders are changed.
+ void _value_changed(const double p_value);
+ // Called when the one of the EditorPropertyVector3 are updated.
+ void _value_changed_vector3(const String p_property_name, const Vector3 p_vector, const StringName p_edited_property_name, const bool p_boolean);
+ // Called when the transform_property is updated.
+ void _value_changed_transform(const String p_property_name, const Transform p_transform, const StringName p_edited_property_name, const bool p_boolean);
+ // Changes the transform to the given transform and updates the UI accordingly.
+ void _change_transform(Transform p_new_transform);
+ // Creates a Transform using the EditorPropertyVector3 properties.
+ Transform compute_transform_from_vector3s() const;
+
+ void update_enabled_checkbox();
+
+protected:
+ void _notification(int p_what);
+
+public:
+ BoneTransformEditor(Skeleton3D *p_skeleton);
+
+ // Which transform target to modify
+ void set_target(const String &p_prop);
+ void set_label(const String &p_label) { label = p_label; }
+
+ void _update_properties();
+ void _update_custom_pose_properties();
+ void _update_transform_properties(Transform p_transform);
+
+ // Can/cannot modify the spinner values for the Transform
+ void set_read_only(const bool p_read_only);
+
+ // Transform can be keyed, whether or not to show the button
+ void set_keyable(const bool p_keyable);
+
+ // Bone can be toggled enabled or disabled, whether or not to show the checkbox
+ void set_toggle_enabled(const bool p_enabled);
+
+ // Key Transform Button pressed
+ void _key_button_pressed();
+
+ // Bone Enabled Checkbox toggled
+ void _checkbox_toggled(const bool p_toggled);
+};
+
+class Skeleton3DEditor : public VBoxContainer {
+ GDCLASS(Skeleton3DEditor, VBoxContainer);
+
+ friend class Skeleton3DEditorPlugin;
+
+ enum Menu {
+ MENU_OPTION_CREATE_PHYSICAL_SKELETON
+ };
+
+ struct BoneInfo {
+ PhysicalBone3D *physical_bone = nullptr;
+ Transform relative_rest; // Relative to skeleton node
+ BoneInfo() {}
+ };
+
+ EditorNode *editor;
+ EditorInspectorPluginSkeleton *editor_plugin;
+
+ Skeleton3D *skeleton;
+
+ Tree *joint_tree;
+ BoneTransformEditor *rest_editor;
+ BoneTransformEditor *pose_editor;
+ BoneTransformEditor *custom_pose_editor;
+
+ MenuButton *options;
+ EditorFileDialog *file_dialog;
+
+ UndoRedo *undo_redo;
+
+ void _on_click_option(int p_option);
+ void _file_selected(const String &p_file);
+
+ EditorFileDialog *file_export_lib;
+
+ void update_joint_tree();
+ void update_editors();
+
+ void create_editors();
+
+ void create_physical_skeleton();
+ PhysicalBone3D *create_physical_bone(int bone_id, int bone_child_id, const Vector<BoneInfo> &bones_infos);
+
+ Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
+ bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
+ void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+
+protected:
+ void _notification(int p_what);
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+public:
+ void move_skeleton_bone(NodePath p_skeleton_path, int32_t p_selected_boneidx, int32_t p_target_boneidx);
+
+ Skeleton3D *get_skeleton() const { return skeleton; };
+
+ void _joint_tree_selection_changed();
+ void _joint_tree_rmb_select(const Vector2 &p_pos);
+
+ void _update_properties();
+
+ Skeleton3DEditor(EditorInspectorPluginSkeleton *e_plugin, EditorNode *p_editor, Skeleton3D *skeleton);
+ ~Skeleton3DEditor();
+};
+
+class EditorInspectorPluginSkeleton : public EditorInspectorPlugin {
+ GDCLASS(EditorInspectorPluginSkeleton, EditorInspectorPlugin);
+
+ friend class Skeleton3DEditorPlugin;
+
+ EditorNode *editor;
+
+public:
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
+};
+
+class Skeleton3DEditorPlugin : public EditorPlugin {
+ GDCLASS(Skeleton3DEditorPlugin, EditorPlugin);
+
+ EditorNode *editor;
+
+public:
+ Skeleton3DEditorPlugin(EditorNode *p_node);
+
+ virtual String get_name() const override { return "Skeleton3D"; }
+};
+
+#endif // SKELETON_3D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/skeleton_editor_plugin.cpp b/editor/plugins/skeleton_editor_plugin.cpp
deleted file mode 100644
index 8b5fe7d2c5..0000000000
--- a/editor/plugins/skeleton_editor_plugin.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/*************************************************************************/
-/* skeleton_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "skeleton_editor_plugin.h"
-
-#include "scene/3d/collision_shape.h"
-#include "scene/3d/physics_body.h"
-#include "scene/3d/physics_joint.h"
-#include "scene/resources/capsule_shape.h"
-#include "scene/resources/sphere_shape.h"
-#include "spatial_editor_plugin.h"
-
-void SkeletonEditor::_on_click_option(int p_option) {
- if (!skeleton) {
- return;
- }
-
- switch (p_option) {
- case MENU_OPTION_CREATE_PHYSICAL_SKELETON: {
- create_physical_skeleton();
- } break;
- }
-}
-
-void SkeletonEditor::create_physical_skeleton() {
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- Node *owner = skeleton == get_tree()->get_edited_scene_root() ? skeleton : skeleton->get_owner();
-
- const int bc = skeleton->get_bone_count();
-
- if (!bc) {
- return;
- }
-
- Vector<BoneInfo> bones_infos;
- bones_infos.resize(bc);
-
- for (int bone_id = 0; bc > bone_id; ++bone_id) {
-
- const int parent = skeleton->get_bone_parent(bone_id);
-
- if (parent < 0) {
-
- bones_infos.write[bone_id].relative_rest = skeleton->get_bone_rest(bone_id);
-
- } else {
-
- const int parent_parent = skeleton->get_bone_parent(parent);
-
- bones_infos.write[bone_id].relative_rest = bones_infos[parent].relative_rest * skeleton->get_bone_rest(bone_id);
-
- /// create physical bone on parent
- if (!bones_infos[parent].physical_bone) {
-
- bones_infos.write[parent].physical_bone = create_physical_bone(parent, bone_id, bones_infos);
-
- ur->create_action(TTR("Create physical bones"));
- ur->add_do_method(skeleton, "add_child", bones_infos[parent].physical_bone);
- ur->add_do_reference(bones_infos[parent].physical_bone);
- ur->add_undo_method(skeleton, "remove_child", bones_infos[parent].physical_bone);
- ur->commit_action();
-
- bones_infos[parent].physical_bone->set_bone_name(skeleton->get_bone_name(parent));
- bones_infos[parent].physical_bone->set_owner(owner);
- bones_infos[parent].physical_bone->get_child(0)->set_owner(owner); // set shape owner
-
- /// Create joint between parent of parent
- if (-1 != parent_parent) {
-
- bones_infos[parent].physical_bone->set_joint_type(PhysicalBone::JOINT_TYPE_PIN);
- }
- }
- }
- }
-}
-
-PhysicalBone *SkeletonEditor::create_physical_bone(int bone_id, int bone_child_id, const Vector<BoneInfo> &bones_infos) {
-
- real_t half_height(skeleton->get_bone_rest(bone_child_id).origin.length() * 0.5);
- real_t radius(half_height * 0.2);
-
- CapsuleShape *bone_shape_capsule = memnew(CapsuleShape);
- bone_shape_capsule->set_height((half_height - radius) * 2);
- bone_shape_capsule->set_radius(radius);
-
- CollisionShape *bone_shape = memnew(CollisionShape);
- bone_shape->set_shape(bone_shape_capsule);
-
- Transform body_transform;
- body_transform.origin = Vector3(0, 0, -half_height);
-
- Transform joint_transform;
- joint_transform.origin = Vector3(0, 0, half_height);
-
- PhysicalBone *physical_bone = memnew(PhysicalBone);
- physical_bone->add_child(bone_shape);
- physical_bone->set_name("Physical Bone " + skeleton->get_bone_name(bone_id));
- physical_bone->set_body_offset(body_transform);
- physical_bone->set_joint_offset(joint_transform);
- return physical_bone;
-}
-
-void SkeletonEditor::edit(Skeleton *p_node) {
-
- skeleton = p_node;
-}
-
-void SkeletonEditor::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE) {
- get_tree()->connect("node_removed", this, "_node_removed");
- }
-}
-
-void SkeletonEditor::_node_removed(Node *p_node) {
-
- if (p_node == skeleton) {
- skeleton = NULL;
- options->hide();
- }
-}
-
-void SkeletonEditor::_bind_methods() {
- ClassDB::bind_method("_on_click_option", &SkeletonEditor::_on_click_option);
- ClassDB::bind_method("_node_removed", &SkeletonEditor::_node_removed);
-}
-
-SkeletonEditor::SkeletonEditor() {
- skeleton = NULL;
- options = memnew(MenuButton);
- SpatialEditor::get_singleton()->add_control_to_menu_panel(options);
-
- options->set_text(TTR("Skeleton"));
- options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Skeleton", "EditorIcons"));
-
- options->get_popup()->add_item(TTR("Create physical skeleton"), MENU_OPTION_CREATE_PHYSICAL_SKELETON);
-
- options->get_popup()->connect("id_pressed", this, "_on_click_option");
- options->hide();
-}
-
-SkeletonEditor::~SkeletonEditor() {}
-
-void SkeletonEditorPlugin::edit(Object *p_object) {
- skeleton_editor->edit(Object::cast_to<Skeleton>(p_object));
-}
-
-bool SkeletonEditorPlugin::handles(Object *p_object) const {
- return p_object->is_class("Skeleton");
-}
-
-void SkeletonEditorPlugin::make_visible(bool p_visible) {
- if (p_visible) {
- skeleton_editor->options->show();
- } else {
-
- skeleton_editor->options->hide();
- skeleton_editor->edit(NULL);
- }
-}
-
-SkeletonEditorPlugin::SkeletonEditorPlugin(EditorNode *p_node) {
- editor = p_node;
- skeleton_editor = memnew(SkeletonEditor);
- editor->get_viewport()->add_child(skeleton_editor);
-}
-
-SkeletonEditorPlugin::~SkeletonEditorPlugin() {}
diff --git a/editor/plugins/skeleton_editor_plugin.h b/editor/plugins/skeleton_editor_plugin.h
deleted file mode 100644
index 1dce6d12ed..0000000000
--- a/editor/plugins/skeleton_editor_plugin.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*************************************************************************/
-/* skeleton_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef SKELETON_EDITOR_PLUGIN_H
-#define SKELETON_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/3d/skeleton.h"
-
-class PhysicalBone;
-class Joint;
-
-class SkeletonEditor : public Node {
- GDCLASS(SkeletonEditor, Node);
-
- enum Menu {
- MENU_OPTION_CREATE_PHYSICAL_SKELETON
- };
-
- struct BoneInfo {
- PhysicalBone *physical_bone;
- Transform relative_rest; // Relative to skeleton node
- BoneInfo() :
- physical_bone(NULL) {}
- };
-
- Skeleton *skeleton;
-
- MenuButton *options;
-
- void _on_click_option(int p_option);
-
- friend class SkeletonEditorPlugin;
-
-protected:
- void _notification(int p_what);
- void _node_removed(Node *p_node);
- static void _bind_methods();
-
- void create_physical_skeleton();
- PhysicalBone *create_physical_bone(int bone_id, int bone_child_id, const Vector<BoneInfo> &bones_infos);
-
-public:
- void edit(Skeleton *p_node);
-
- SkeletonEditor();
- ~SkeletonEditor();
-};
-
-class SkeletonEditorPlugin : public EditorPlugin {
-
- GDCLASS(SkeletonEditorPlugin, EditorPlugin);
-
- EditorNode *editor;
- SkeletonEditor *skeleton_editor;
-
-public:
- virtual String get_name() const { return "Skeleton"; }
- virtual bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- SkeletonEditorPlugin(EditorNode *p_node);
- ~SkeletonEditorPlugin();
-};
-
-#endif // SKELETON_EDITOR_PLUGIN_H
diff --git a/editor/plugins/skeleton_ik_3d_editor_plugin.cpp b/editor/plugins/skeleton_ik_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..8fc789b94a
--- /dev/null
+++ b/editor/plugins/skeleton_ik_3d_editor_plugin.cpp
@@ -0,0 +1,95 @@
+/*************************************************************************/
+/* skeleton_ik_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "skeleton_ik_3d_editor_plugin.h"
+
+#include "scene/3d/skeleton_ik_3d.h"
+
+void SkeletonIK3DEditorPlugin::_play() {
+ if (!skeleton_ik) {
+ return;
+ }
+
+ if (!skeleton_ik->get_parent_skeleton()) {
+ return;
+ }
+
+ if (play_btn->is_pressed()) {
+ skeleton_ik->start();
+ } else {
+ skeleton_ik->stop();
+ skeleton_ik->get_parent_skeleton()->clear_bones_global_pose_override();
+ }
+}
+
+void SkeletonIK3DEditorPlugin::edit(Object *p_object) {
+ if (p_object != skeleton_ik) {
+ if (skeleton_ik) {
+ play_btn->set_pressed(false);
+ _play();
+ }
+ }
+
+ SkeletonIK3D *s = Object::cast_to<SkeletonIK3D>(p_object);
+ if (!s) {
+ return;
+ }
+
+ skeleton_ik = s;
+}
+
+bool SkeletonIK3DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("SkeletonIK3D");
+}
+
+void SkeletonIK3DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ play_btn->show();
+ } else {
+ play_btn->hide();
+ }
+}
+
+void SkeletonIK3DEditorPlugin::_bind_methods() {
+}
+
+SkeletonIK3DEditorPlugin::SkeletonIK3DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ play_btn = memnew(Button);
+ play_btn->set_icon(editor->get_gui_base()->get_theme_icon("Play", "EditorIcons"));
+ play_btn->set_text(TTR("Play IK"));
+ play_btn->set_toggle_mode(true);
+ play_btn->hide();
+ play_btn->connect("pressed", callable_mp(this, &SkeletonIK3DEditorPlugin::_play));
+ add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, play_btn);
+ skeleton_ik = nullptr;
+}
+
+SkeletonIK3DEditorPlugin::~SkeletonIK3DEditorPlugin() {}
diff --git a/editor/plugins/skeleton_ik_3d_editor_plugin.h b/editor/plugins/skeleton_ik_3d_editor_plugin.h
new file mode 100644
index 0000000000..c1585ea670
--- /dev/null
+++ b/editor/plugins/skeleton_ik_3d_editor_plugin.h
@@ -0,0 +1,63 @@
+/*************************************************************************/
+/* skeleton_ik_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SKELETON_IK_3D_EDITOR_PLUGIN_H
+#define SKELETON_IK_3D_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+
+class SkeletonIK3D;
+
+class SkeletonIK3DEditorPlugin : public EditorPlugin {
+ GDCLASS(SkeletonIK3DEditorPlugin, EditorPlugin);
+
+ SkeletonIK3D *skeleton_ik;
+
+ Button *play_btn;
+ EditorNode *editor;
+
+ void _play();
+
+protected:
+ static void _bind_methods();
+
+public:
+ virtual String get_name() const override { return "SkeletonIK3D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ SkeletonIK3DEditorPlugin(EditorNode *p_node);
+ ~SkeletonIK3DEditorPlugin();
+};
+
+#endif // SKELETON_IK_3D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/skeleton_ik_editor_plugin.cpp b/editor/plugins/skeleton_ik_editor_plugin.cpp
deleted file mode 100644
index 43dc13b270..0000000000
--- a/editor/plugins/skeleton_ik_editor_plugin.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*************************************************************************/
-/* skeleton_ik_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "skeleton_ik_editor_plugin.h"
-
-#include "scene/animation/skeleton_ik.h"
-
-void SkeletonIKEditorPlugin::_play() {
-
- if (!skeleton_ik)
- return;
-
- if (!skeleton_ik->get_parent_skeleton())
- return;
-
- if (play_btn->is_pressed()) {
-
- initial_bone_poses.resize(skeleton_ik->get_parent_skeleton()->get_bone_count());
- for (int i = 0; i < skeleton_ik->get_parent_skeleton()->get_bone_count(); ++i) {
- initial_bone_poses.write[i] = skeleton_ik->get_parent_skeleton()->get_bone_pose(i);
- }
-
- skeleton_ik->start();
- } else {
- skeleton_ik->stop();
-
- if (initial_bone_poses.size() != skeleton_ik->get_parent_skeleton()->get_bone_count())
- return;
-
- for (int i = 0; i < skeleton_ik->get_parent_skeleton()->get_bone_count(); ++i) {
- skeleton_ik->get_parent_skeleton()->set_bone_pose(i, initial_bone_poses[i]);
- }
- }
-}
-
-void SkeletonIKEditorPlugin::edit(Object *p_object) {
-
- if (p_object != skeleton_ik) {
- if (skeleton_ik) {
- play_btn->set_pressed(false);
- _play();
- }
- }
-
- SkeletonIK *s = Object::cast_to<SkeletonIK>(p_object);
- if (!s)
- return;
-
- skeleton_ik = s;
-}
-
-bool SkeletonIKEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("SkeletonIK");
-}
-
-void SkeletonIKEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible)
- play_btn->show();
- else
- play_btn->hide();
-}
-
-void SkeletonIKEditorPlugin::_bind_methods() {
-
- ClassDB::bind_method("_play", &SkeletonIKEditorPlugin::_play);
-}
-
-SkeletonIKEditorPlugin::SkeletonIKEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- play_btn = memnew(Button);
- play_btn->set_icon(editor->get_gui_base()->get_icon("Play", "EditorIcons"));
- play_btn->set_text(TTR("Play IK"));
- play_btn->set_toggle_mode(true);
- play_btn->hide();
- play_btn->connect("pressed", this, "_play");
- add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, play_btn);
- skeleton_ik = NULL;
-}
-
-SkeletonIKEditorPlugin::~SkeletonIKEditorPlugin() {}
diff --git a/editor/plugins/skeleton_ik_editor_plugin.h b/editor/plugins/skeleton_ik_editor_plugin.h
deleted file mode 100644
index 06c07031f6..0000000000
--- a/editor/plugins/skeleton_ik_editor_plugin.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*************************************************************************/
-/* skeleton_ik_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef SKELETON_IK_EDITOR_PLUGIN_H
-#define SKELETON_IK_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-
-class SkeletonIK;
-
-class SkeletonIKEditorPlugin : public EditorPlugin {
-
- GDCLASS(SkeletonIKEditorPlugin, EditorPlugin);
-
- SkeletonIK *skeleton_ik;
-
- Button *play_btn;
- EditorNode *editor;
- Vector<Transform> initial_bone_poses;
-
- void _play();
-
-protected:
- static void _bind_methods();
-
-public:
- virtual String get_name() const { return "SkeletonIK"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- SkeletonIKEditorPlugin(EditorNode *p_node);
- ~SkeletonIKEditorPlugin();
-};
-
-#endif // SKELETON_IK_EDITOR_PLUGIN_H
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp
deleted file mode 100644
index 31e6b65640..0000000000
--- a/editor/plugins/spatial_editor_plugin.cpp
+++ /dev/null
@@ -1,6412 +0,0 @@
-/*************************************************************************/
-/* spatial_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "spatial_editor_plugin.h"
-
-#include "core/math/camera_matrix.h"
-#include "core/os/input.h"
-#include "core/os/keyboard.h"
-#include "core/print_string.h"
-#include "core/project_settings.h"
-#include "core/sort_array.h"
-#include "editor/editor_node.h"
-#include "editor/editor_scale.h"
-#include "editor/editor_settings.h"
-#include "editor/plugins/animation_player_editor_plugin.h"
-#include "editor/plugins/script_editor_plugin.h"
-#include "editor/script_editor_debugger.h"
-#include "editor/spatial_editor_gizmos.h"
-#include "scene/3d/camera.h"
-#include "scene/3d/collision_shape.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/3d/physics_body.h"
-#include "scene/3d/visual_instance.h"
-#include "scene/gui/viewport_container.h"
-#include "scene/resources/packed_scene.h"
-#include "scene/resources/surface_tool.h"
-
-#define DISTANCE_DEFAULT 4
-
-#define GIZMO_ARROW_SIZE 0.35
-#define GIZMO_RING_HALF_WIDTH 0.1
-#define GIZMO_SCALE_DEFAULT 0.15
-#define GIZMO_PLANE_SIZE 0.2
-#define GIZMO_PLANE_DST 0.3
-#define GIZMO_CIRCLE_SIZE 1.1
-#define GIZMO_SCALE_OFFSET (GIZMO_CIRCLE_SIZE + 0.3)
-#define GIZMO_ARROW_OFFSET (GIZMO_CIRCLE_SIZE + 0.3)
-
-#define ZOOM_MIN_DISTANCE 0.001
-#define ZOOM_MULTIPLIER 1.08
-#define ZOOM_INDICATOR_DELAY_S 1.5
-
-#define FREELOOK_MIN_SPEED 0.01
-#define FREELOOK_SPEED_MULTIPLIER 1.08
-
-#define MIN_Z 0.01
-#define MAX_Z 1000000.0
-
-#define MIN_FOV 0.01
-#define MAX_FOV 179
-
-void SpatialEditorViewport::_update_camera(float p_interp_delta) {
-
- bool is_orthogonal = camera->get_projection() == Camera::PROJECTION_ORTHOGONAL;
-
- Cursor old_camera_cursor = camera_cursor;
- camera_cursor = cursor;
-
- if (p_interp_delta > 0) {
-
- //-------
- // Perform smoothing
-
- if (is_freelook_active()) {
-
- // Higher inertia should increase "lag" (lerp with factor between 0 and 1)
- // Inertia of zero should produce instant movement (lerp with factor of 1) in this case it returns a really high value and gets clamped to 1.
- real_t inertia = EDITOR_GET("editors/3d/freelook/freelook_inertia");
- inertia = MAX(0.001, inertia);
- real_t factor = (1.0 / inertia) * p_interp_delta;
-
- // We interpolate a different point here, because in freelook mode the focus point (cursor.pos) orbits around eye_pos
- camera_cursor.eye_pos = old_camera_cursor.eye_pos.linear_interpolate(cursor.eye_pos, CLAMP(factor, 0, 1));
-
- float orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
- orbit_inertia = MAX(0.0001, orbit_inertia);
- camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
- camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
-
- Vector3 forward = to_camera_transform(camera_cursor).basis.xform(Vector3(0, 0, -1));
- camera_cursor.pos = camera_cursor.eye_pos + forward * camera_cursor.distance;
-
- } else {
-
- //when not being manipulated, move softly
- float free_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
- float free_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/translation_inertia");
- //when being manipulated, move more quickly
- float manip_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_orbit_inertia");
- float manip_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_translation_inertia");
-
- float zoom_inertia = EDITOR_GET("editors/3d/navigation_feel/zoom_inertia");
-
- //determine if being manipulated
- bool manipulated = Input::get_singleton()->get_mouse_button_mask() & (2 | 4);
- manipulated |= Input::get_singleton()->is_key_pressed(KEY_SHIFT);
- manipulated |= Input::get_singleton()->is_key_pressed(KEY_ALT);
- manipulated |= Input::get_singleton()->is_key_pressed(KEY_CONTROL);
-
- float orbit_inertia = MAX(0.00001, manipulated ? manip_orbit_inertia : free_orbit_inertia);
- float translation_inertia = MAX(0.0001, manipulated ? manip_translation_inertia : free_translation_inertia);
- zoom_inertia = MAX(0.0001, zoom_inertia);
-
- camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
- camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
-
- camera_cursor.pos = old_camera_cursor.pos.linear_interpolate(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia)));
- camera_cursor.distance = Math::lerp(old_camera_cursor.distance, cursor.distance, MIN(1.f, p_interp_delta * (1 / zoom_inertia)));
- }
- }
-
- //-------
- // Apply camera transform
-
- float tolerance = 0.001;
- bool equal = true;
- if (Math::abs(old_camera_cursor.x_rot - camera_cursor.x_rot) > tolerance || Math::abs(old_camera_cursor.y_rot - camera_cursor.y_rot) > tolerance) {
- equal = false;
- }
-
- if (equal && old_camera_cursor.pos.distance_squared_to(camera_cursor.pos) > tolerance * tolerance) {
- equal = false;
- }
-
- if (equal && Math::abs(old_camera_cursor.distance - camera_cursor.distance) > tolerance) {
- equal = false;
- }
-
- if (!equal || p_interp_delta == 0 || is_freelook_active() || is_orthogonal != orthogonal) {
-
- camera->set_global_transform(to_camera_transform(camera_cursor));
-
- if (orthogonal)
- camera->set_orthogonal(2 * cursor.distance, 0.1, 8192);
- else
- camera->set_perspective(get_fov(), get_znear(), get_zfar());
-
- update_transform_gizmo_view();
- }
-}
-
-Transform SpatialEditorViewport::to_camera_transform(const Cursor &p_cursor) const {
- Transform camera_transform;
- camera_transform.translate(p_cursor.pos);
- camera_transform.basis.rotate(Vector3(1, 0, 0), -p_cursor.x_rot);
- camera_transform.basis.rotate(Vector3(0, 1, 0), -p_cursor.y_rot);
-
- if (orthogonal)
- camera_transform.translate(0, 0, 4096);
- else
- camera_transform.translate(0, 0, p_cursor.distance);
-
- return camera_transform;
-}
-
-int SpatialEditorViewport::get_selected_count() const {
-
- Map<Node *, Object *> &selection = editor_selection->get_selection();
-
- int count = 0;
-
- for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->key());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- count++;
- }
-
- return count;
-}
-
-float SpatialEditorViewport::get_znear() const {
-
- return CLAMP(spatial_editor->get_znear(), MIN_Z, MAX_Z);
-}
-float SpatialEditorViewport::get_zfar() const {
-
- return CLAMP(spatial_editor->get_zfar(), MIN_Z, MAX_Z);
-}
-float SpatialEditorViewport::get_fov() const {
-
- return CLAMP(spatial_editor->get_fov(), MIN_FOV, MAX_FOV);
-}
-
-Transform SpatialEditorViewport::_get_camera_transform() const {
-
- return camera->get_global_transform();
-}
-
-Vector3 SpatialEditorViewport::_get_camera_position() const {
-
- return _get_camera_transform().origin;
-}
-
-Point2 SpatialEditorViewport::_point_to_screen(const Vector3 &p_point) {
-
- return camera->unproject_position(p_point) * viewport_container->get_stretch_shrink();
-}
-
-Vector3 SpatialEditorViewport::_get_ray_pos(const Vector2 &p_pos) const {
-
- return camera->project_ray_origin(p_pos / viewport_container->get_stretch_shrink());
-}
-
-Vector3 SpatialEditorViewport::_get_camera_normal() const {
-
- return -_get_camera_transform().basis.get_axis(2);
-}
-
-Vector3 SpatialEditorViewport::_get_ray(const Vector2 &p_pos) const {
-
- return camera->project_ray_normal(p_pos / viewport_container->get_stretch_shrink());
-}
-
-void SpatialEditorViewport::_clear_selected() {
-
- editor_selection->clear();
-}
-
-void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) {
-
- if (!clicked)
- return;
-
- Node *node = Object::cast_to<Node>(ObjectDB::get_instance(clicked));
- Spatial *selected = Object::cast_to<Spatial>(node);
- if (!selected)
- return;
-
- // Replace the node by the group if grouped
- while (node && node != editor->get_edited_scene()->get_parent()) {
- Spatial *selected_tmp = Object::cast_to<Spatial>(node);
- if (selected_tmp && node->has_meta("_edit_group_")) {
- selected = selected_tmp;
- }
- node = node->get_parent();
- }
-
- if (!_is_node_locked(selected))
- _select(selected, clicked_wants_append, true);
-}
-
-void SpatialEditorViewport::_select(Node *p_node, bool p_append, bool p_single) {
-
- if (!p_append) {
- editor_selection->clear();
- }
-
- if (editor_selection->is_selected(p_node)) {
- //erase
- editor_selection->remove_node(p_node);
- } else {
-
- editor_selection->add_node(p_node);
- }
-
- if (p_single) {
- if (Engine::get_singleton()->is_editor_hint())
- editor->call("edit_node", p_node);
- }
-}
-
-ObjectID SpatialEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, bool &r_includes_current, int *r_gizmo_handle, bool p_alt_select) {
-
- if (r_gizmo_handle)
- *r_gizmo_handle = -1;
-
- Vector3 ray = _get_ray(p_pos);
- Vector3 pos = _get_ray_pos(p_pos);
- Vector2 shrinked_pos = p_pos / viewport_container->get_stretch_shrink();
-
- Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world()->get_scenario());
- Set<Ref<EditorSpatialGizmo> > found_gizmos;
-
- Node *edited_scene = get_tree()->get_edited_scene_root();
- ObjectID closest = 0;
- Node *item = NULL;
- float closest_dist = 1e20;
- int selected_handle = -1;
-
- for (int i = 0; i < instances.size(); i++) {
-
- Spatial *spat = Object::cast_to<Spatial>(ObjectDB::get_instance(instances[i]));
-
- if (!spat)
- continue;
-
- Ref<EditorSpatialGizmo> seg = spat->get_gizmo();
-
- if ((!seg.is_valid()) || found_gizmos.has(seg)) {
- continue;
- }
-
- found_gizmos.insert(seg);
- Vector3 point;
- Vector3 normal;
-
- int handle = -1;
- bool inters = seg->intersect_ray(camera, shrinked_pos, point, normal, &handle, p_alt_select);
-
- if (!inters)
- continue;
-
- float dist = pos.distance_to(point);
-
- if (dist < 0)
- continue;
-
- if (dist < closest_dist) {
-
- item = Object::cast_to<Node>(spat);
- while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) {
- item = item->get_owner();
- }
-
- closest = item->get_instance_id();
- closest_dist = dist;
- selected_handle = handle;
- }
- }
-
- if (!item)
- return 0;
-
- if (!editor_selection->is_selected(item) || (r_gizmo_handle && selected_handle >= 0)) {
-
- if (r_gizmo_handle)
- *r_gizmo_handle = selected_handle;
- }
-
- return closest;
-}
-
-void SpatialEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select) {
-
- Vector3 ray = _get_ray(p_pos);
- Vector3 pos = _get_ray_pos(p_pos);
-
- Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world()->get_scenario());
- Set<Ref<EditorSpatialGizmo> > found_gizmos;
-
- r_includes_current = false;
-
- for (int i = 0; i < instances.size(); i++) {
-
- Spatial *spat = Object::cast_to<Spatial>(ObjectDB::get_instance(instances[i]));
-
- if (!spat)
- continue;
-
- Ref<EditorSpatialGizmo> seg = spat->get_gizmo();
-
- if (!seg.is_valid())
- continue;
-
- if (found_gizmos.has(seg))
- continue;
-
- found_gizmos.insert(seg);
- Vector3 point;
- Vector3 normal;
-
- int handle = -1;
- bool inters = seg->intersect_ray(camera, p_pos, point, normal, NULL, p_alt_select);
-
- if (!inters)
- continue;
-
- float dist = pos.distance_to(point);
-
- if (dist < 0)
- continue;
-
- if (editor_selection->is_selected(spat))
- r_includes_current = true;
-
- _RayResult res;
- res.item = spat;
- res.depth = dist;
- res.handle = handle;
- results.push_back(res);
- }
-
- if (results.empty())
- return;
-
- results.sort();
-}
-
-Vector3 SpatialEditorViewport::_get_screen_to_space(const Vector3 &p_vector3) {
-
- CameraMatrix cm;
- if (orthogonal) {
- cm.set_orthogonal(camera->get_size(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar());
- } else {
- cm.set_perspective(get_fov(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar());
- }
- Vector2 screen_he = cm.get_viewport_half_extents();
-
- Transform camera_transform;
- camera_transform.translate(cursor.pos);
- camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot);
- camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot);
- camera_transform.translate(0, 0, cursor.distance);
-
- return camera_transform.xform(Vector3(((p_vector3.x / get_size().width) * 2.0 - 1.0) * screen_he.x, ((1.0 - (p_vector3.y / get_size().height)) * 2.0 - 1.0) * screen_he.y, -(get_znear() + p_vector3.z)));
-}
-
-void SpatialEditorViewport::_select_region() {
-
- if (cursor.region_begin == cursor.region_end)
- return; //nothing really
-
- float z_offset = MAX(0.0, 5.0 - get_znear());
-
- Vector3 box[4] = {
- Vector3(
- MIN(cursor.region_begin.x, cursor.region_end.x),
- MIN(cursor.region_begin.y, cursor.region_end.y),
- z_offset),
- Vector3(
- MAX(cursor.region_begin.x, cursor.region_end.x),
- MIN(cursor.region_begin.y, cursor.region_end.y),
- z_offset),
- Vector3(
- MAX(cursor.region_begin.x, cursor.region_end.x),
- MAX(cursor.region_begin.y, cursor.region_end.y),
- z_offset),
- Vector3(
- MIN(cursor.region_begin.x, cursor.region_end.x),
- MAX(cursor.region_begin.y, cursor.region_end.y),
- z_offset)
- };
-
- Vector<Plane> frustum;
-
- Vector3 cam_pos = _get_camera_position();
-
- for (int i = 0; i < 4; i++) {
-
- Vector3 a = _get_screen_to_space(box[i]);
- Vector3 b = _get_screen_to_space(box[(i + 1) % 4]);
- if (orthogonal) {
- frustum.push_back(Plane(a, (a - b).normalized()));
- } else {
- frustum.push_back(Plane(a, b, cam_pos));
- }
- }
-
- if (!orthogonal) {
- Plane near(cam_pos, -_get_camera_normal());
- near.d -= get_znear();
-
- frustum.push_back(near);
-
- Plane far = -near;
- far.d += get_zfar();
-
- frustum.push_back(far);
- }
-
- Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world()->get_scenario());
- Vector<Node *> selected;
-
- Node *edited_scene = get_tree()->get_edited_scene_root();
-
- for (int i = 0; i < instances.size(); i++) {
-
- Spatial *sp = Object::cast_to<Spatial>(ObjectDB::get_instance(instances[i]));
- if (!sp || _is_node_locked(sp))
- continue;
-
- Node *item = Object::cast_to<Node>(sp);
- while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) {
- item = item->get_owner();
- }
-
- // Replace the node by the group if grouped
- if (item->is_class("Spatial")) {
- Spatial *sel = Object::cast_to<Spatial>(item);
- while (item && item != editor->get_edited_scene()->get_parent()) {
- Spatial *selected_tmp = Object::cast_to<Spatial>(item);
- if (selected_tmp && item->has_meta("_edit_group_")) {
- sel = selected_tmp;
- }
- item = item->get_parent();
- }
- item = sel;
- }
-
- if (selected.find(item) != -1) continue;
-
- if (_is_node_locked(item)) continue;
-
- Ref<EditorSpatialGizmo> seg = sp->get_gizmo();
-
- if (!seg.is_valid())
- continue;
-
- if (seg->intersect_frustum(camera, frustum)) {
- selected.push_back(item);
- }
- }
-
- bool single = selected.size() == 1;
- for (int i = 0; i < selected.size(); i++) {
- _select(selected[i], true, single);
- }
-}
-
-void SpatialEditorViewport::_update_name() {
-
- String view_mode = orthogonal ? TTR("Orthogonal") : TTR("Perspective");
-
- if (name != "")
- view_menu->set_text(name + " " + view_mode);
- else
- view_menu->set_text(view_mode);
-
- view_menu->set_size(Vector2(0, 0)); // resets the button size
-}
-
-void SpatialEditorViewport::_compute_edit(const Point2 &p_point) {
-
- _edit.click_ray = _get_ray(Vector2(p_point.x, p_point.y));
- _edit.click_ray_pos = _get_ray_pos(Vector2(p_point.x, p_point.y));
- _edit.plane = TRANSFORM_VIEW;
- spatial_editor->update_transform_gizmo();
- _edit.center = spatial_editor->get_gizmo_transform().origin;
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- se->original = se->sp->get_global_gizmo_transform();
- se->original_local = se->sp->get_local_gizmo_transform();
- }
-}
-
-static int _get_key_modifier_setting(const String &p_property) {
-
- switch (EditorSettings::get_singleton()->get(p_property).operator int()) {
-
- case 0: return 0;
- case 1: return KEY_SHIFT;
- case 2: return KEY_ALT;
- case 3: return KEY_META;
- case 4: return KEY_CONTROL;
- }
- return 0;
-}
-
-static int _get_key_modifier(Ref<InputEventWithModifiers> e) {
- if (e->get_shift())
- return KEY_SHIFT;
- if (e->get_alt())
- return KEY_ALT;
- if (e->get_control())
- return KEY_CONTROL;
- if (e->get_metakey())
- return KEY_META;
- return 0;
-}
-
-bool SpatialEditorViewport::_gizmo_select(const Vector2 &p_screenpos, bool p_highlight_only) {
-
- if (!spatial_editor->is_gizmo_visible())
- return false;
- if (get_selected_count() == 0) {
- if (p_highlight_only)
- spatial_editor->select_gizmo_highlight_axis(-1);
- return false;
- }
-
- Vector3 ray_pos = _get_ray_pos(Vector2(p_screenpos.x, p_screenpos.y));
- Vector3 ray = _get_ray(Vector2(p_screenpos.x, p_screenpos.y));
-
- Transform gt = spatial_editor->get_gizmo_transform();
- float gs = gizmo_scale;
-
- if (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_MOVE) {
-
- int col_axis = -1;
- float col_d = 1e20;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 grabber_pos = gt.origin + gt.basis.get_axis(i) * gs * (GIZMO_ARROW_OFFSET + (GIZMO_ARROW_SIZE * 0.5));
- float grabber_radius = gs * GIZMO_ARROW_SIZE;
-
- Vector3 r;
-
- if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) {
- float d = r.distance_to(ray_pos);
- if (d < col_d) {
- col_d = d;
- col_axis = i;
- }
- }
- }
-
- bool is_plane_translate = false;
- // plane select
- if (col_axis == -1) {
- col_d = 1e20;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ivec2 = gt.basis.get_axis((i + 1) % 3).normalized();
- Vector3 ivec3 = gt.basis.get_axis((i + 2) % 3).normalized();
-
- Vector3 grabber_pos = gt.origin + (ivec2 + ivec3) * gs * (GIZMO_PLANE_SIZE + GIZMO_PLANE_DST);
-
- Vector3 r;
- Plane plane(gt.origin, gt.basis.get_axis(i).normalized());
-
- if (plane.intersects_ray(ray_pos, ray, &r)) {
-
- float dist = r.distance_to(grabber_pos);
- if (dist < (gs * GIZMO_PLANE_SIZE)) {
-
- float d = ray_pos.distance_to(r);
- if (d < col_d) {
- col_d = d;
- col_axis = i;
-
- is_plane_translate = true;
- }
- }
- }
- }
- }
-
- if (col_axis != -1) {
-
- if (p_highlight_only) {
-
- spatial_editor->select_gizmo_highlight_axis(col_axis + (is_plane_translate ? 6 : 0));
-
- } else {
- //handle plane translate
- _edit.mode = TRANSFORM_TRANSLATE;
- _compute_edit(Point2(p_screenpos.x, p_screenpos.y));
- _edit.plane = TransformPlane(TRANSFORM_X_AXIS + col_axis + (is_plane_translate ? 3 : 0));
- }
- return true;
- }
- }
-
- if (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_ROTATE) {
-
- int col_axis = -1;
- float col_d = 1e20;
-
- for (int i = 0; i < 3; i++) {
-
- Plane plane(gt.origin, gt.basis.get_axis(i).normalized());
- Vector3 r;
- if (!plane.intersects_ray(ray_pos, ray, &r))
- continue;
-
- float dist = r.distance_to(gt.origin);
-
- if (dist > gs * (GIZMO_CIRCLE_SIZE - GIZMO_RING_HALF_WIDTH) && dist < gs * (GIZMO_CIRCLE_SIZE + GIZMO_RING_HALF_WIDTH)) {
-
- float d = ray_pos.distance_to(r);
- if (d < col_d) {
- col_d = d;
- col_axis = i;
- }
- }
- }
-
- if (col_axis != -1) {
-
- if (p_highlight_only) {
-
- spatial_editor->select_gizmo_highlight_axis(col_axis + 3);
- } else {
- //handle rotate
- _edit.mode = TRANSFORM_ROTATE;
- _compute_edit(Point2(p_screenpos.x, p_screenpos.y));
- _edit.plane = TransformPlane(TRANSFORM_X_AXIS + col_axis);
- }
- return true;
- }
- }
-
- if (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SCALE) {
-
- int col_axis = -1;
- float col_d = 1e20;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 grabber_pos = gt.origin + gt.basis.get_axis(i) * gs * GIZMO_SCALE_OFFSET;
- float grabber_radius = gs * GIZMO_ARROW_SIZE;
-
- Vector3 r;
-
- if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) {
- float d = r.distance_to(ray_pos);
- if (d < col_d) {
- col_d = d;
- col_axis = i;
- }
- }
- }
-
- bool is_plane_scale = false;
- // plane select
- if (col_axis == -1) {
- col_d = 1e20;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ivec2 = gt.basis.get_axis((i + 1) % 3).normalized();
- Vector3 ivec3 = gt.basis.get_axis((i + 2) % 3).normalized();
-
- Vector3 grabber_pos = gt.origin + (ivec2 + ivec3) * gs * (GIZMO_PLANE_SIZE + GIZMO_PLANE_DST);
-
- Vector3 r;
- Plane plane(gt.origin, gt.basis.get_axis(i).normalized());
-
- if (plane.intersects_ray(ray_pos, ray, &r)) {
-
- float dist = r.distance_to(grabber_pos);
- if (dist < (gs * GIZMO_PLANE_SIZE)) {
-
- float d = ray_pos.distance_to(r);
- if (d < col_d) {
- col_d = d;
- col_axis = i;
-
- is_plane_scale = true;
- }
- }
- }
- }
- }
-
- if (col_axis != -1) {
-
- if (p_highlight_only) {
-
- spatial_editor->select_gizmo_highlight_axis(col_axis + (is_plane_scale ? 12 : 9));
-
- } else {
- //handle scale
- _edit.mode = TRANSFORM_SCALE;
- _compute_edit(Point2(p_screenpos.x, p_screenpos.y));
- _edit.plane = TransformPlane(TRANSFORM_X_AXIS + col_axis + (is_plane_scale ? 3 : 0));
- }
- return true;
- }
- }
-
- if (p_highlight_only)
- spatial_editor->select_gizmo_highlight_axis(-1);
-
- return false;
-}
-
-void SpatialEditorViewport::_surface_mouse_enter() {
-
- if (!surface->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field()))
- surface->grab_focus();
-}
-
-void SpatialEditorViewport::_surface_mouse_exit() {
-
- _remove_preview();
-}
-
-void SpatialEditorViewport::_surface_focus_enter() {
-
- view_menu->set_disable_shortcuts(false);
-}
-
-void SpatialEditorViewport::_surface_focus_exit() {
-
- view_menu->set_disable_shortcuts(true);
-}
-bool SpatialEditorViewport ::_is_node_locked(const Node *p_node) {
- return p_node->has_meta("_edit_lock_") && p_node->get_meta("_edit_lock_");
-}
-void SpatialEditorViewport::_list_select(Ref<InputEventMouseButton> b) {
-
- _find_items_at_pos(b->get_position(), clicked_includes_current, selection_results, b->get_shift());
-
- Node *scene = editor->get_edited_scene();
-
- for (int i = 0; i < selection_results.size(); i++) {
- Spatial *item = selection_results[i].item;
- if (item != scene && item->get_owner() != scene && !scene->is_editable_instance(item->get_owner())) {
- //invalid result
- selection_results.remove(i);
- i--;
- }
- }
-
- clicked_wants_append = b->get_shift();
-
- if (selection_results.size() == 1) {
-
- clicked = selection_results[0].item->get_instance_id();
- selection_results.clear();
-
- if (clicked) {
- _select_clicked(clicked_wants_append, true);
- clicked = 0;
- }
-
- } else if (!selection_results.empty()) {
-
- NodePath root_path = get_tree()->get_edited_scene_root()->get_path();
- StringName root_name = root_path.get_name(root_path.get_name_count() - 1);
-
- for (int i = 0; i < selection_results.size(); i++) {
-
- Spatial *spat = selection_results[i].item;
-
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(spat, "Node");
-
- String node_path = "/" + root_name + "/" + root_path.rel_path_to(spat->get_path());
-
- selection_menu->add_item(spat->get_name());
- selection_menu->set_item_icon(i, icon);
- selection_menu->set_item_metadata(i, node_path);
- selection_menu->set_item_tooltip(i, String(spat->get_name()) + "\nType: " + spat->get_class() + "\nPath: " + node_path);
- }
-
- selection_menu->set_global_position(b->get_global_position());
- selection_menu->popup();
- }
-}
-
-void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
-
- if (previewing)
- return; //do NONE
-
- {
- EditorNode *en = editor;
- EditorPluginList *force_input_forwarding_list = en->get_editor_plugins_force_input_forwarding();
- if (!force_input_forwarding_list->empty()) {
- bool discard = force_input_forwarding_list->forward_spatial_gui_input(camera, p_event, true);
- if (discard)
- return;
- }
- }
- {
- EditorNode *en = editor;
- EditorPluginList *over_plugin_list = en->get_editor_plugins_over();
- if (!over_plugin_list->empty()) {
- bool discard = over_plugin_list->forward_spatial_gui_input(camera, p_event, false);
- if (discard)
- return;
- }
- }
-
- Ref<InputEventMouseButton> b = p_event;
-
- if (b.is_valid()) {
- emit_signal("clicked", this);
-
- float zoom_factor = 1 + (ZOOM_MULTIPLIER - 1) * b->get_factor();
- switch (b->get_button_index()) {
-
- case BUTTON_WHEEL_UP: {
- if (is_freelook_active())
- scale_freelook_speed(zoom_factor);
- else
- scale_cursor_distance(1.0 / zoom_factor);
- } break;
-
- case BUTTON_WHEEL_DOWN: {
- if (is_freelook_active())
- scale_freelook_speed(1.0 / zoom_factor);
- else
- scale_cursor_distance(zoom_factor);
- } break;
-
- case BUTTON_RIGHT: {
-
- NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
-
- if (b->is_pressed() && _edit.gizmo.is_valid()) {
- //restore
- _edit.gizmo->commit_handle(_edit.gizmo_handle, _edit.gizmo_initial_value, true);
- _edit.gizmo = Ref<EditorSpatialGizmo>();
- }
-
- if (_edit.mode == TRANSFORM_NONE && b->is_pressed()) {
-
- if (b->get_alt()) {
-
- if (nav_scheme == NAVIGATION_MAYA)
- break;
-
- _list_select(b);
- return;
- }
- }
-
- if (_edit.mode != TRANSFORM_NONE && b->is_pressed()) {
- //cancel motion
- _edit.mode = TRANSFORM_NONE;
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- sp->set_global_transform(se->original);
- }
- surface->update();
- set_message(TTR("Transform Aborted."), 3);
- }
-
- if (b->is_pressed()) {
- const int mod = _get_key_modifier(b);
- if (!orthogonal) {
- if (mod == _get_key_modifier_setting("editors/3d/freelook/freelook_activation_modifier")) {
- set_freelook_active(true);
- }
- }
- } else {
- set_freelook_active(false);
- }
-
- if (freelook_active && !surface->has_focus()) {
- // Focus usually doesn't trigger on right-click, but in case of freelook it should,
- // otherwise using keyboard navigation would misbehave
- surface->grab_focus();
- }
-
- } break;
- case BUTTON_MIDDLE: {
-
- if (b->is_pressed() && _edit.mode != TRANSFORM_NONE) {
-
- switch (_edit.plane) {
-
- case TRANSFORM_VIEW: {
-
- _edit.plane = TRANSFORM_X_AXIS;
- set_message(TTR("X-Axis Transform."), 2);
- name = "";
- _update_name();
- } break;
- case TRANSFORM_X_AXIS: {
-
- _edit.plane = TRANSFORM_Y_AXIS;
- set_message(TTR("Y-Axis Transform."), 2);
-
- } break;
- case TRANSFORM_Y_AXIS: {
-
- _edit.plane = TRANSFORM_Z_AXIS;
- set_message(TTR("Z-Axis Transform."), 2);
-
- } break;
- case TRANSFORM_Z_AXIS: {
-
- _edit.plane = TRANSFORM_VIEW;
- set_message(TTR("View Plane Transform."), 2);
-
- } break;
- case TRANSFORM_YZ:
- case TRANSFORM_XZ:
- case TRANSFORM_XY: {
- } break;
- }
- }
- } break;
- case BUTTON_LEFT: {
-
- if (b->is_pressed()) {
-
- NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
- if ((nav_scheme == NAVIGATION_MAYA || nav_scheme == NAVIGATION_MODO) && b->get_alt()) {
- break;
- }
-
- if (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_LIST_SELECT) {
- _list_select(b);
- break;
- }
-
- _edit.mouse_pos = b->get_position();
- _edit.snap = spatial_editor->is_snap_enabled();
- _edit.mode = TRANSFORM_NONE;
-
- //gizmo has priority over everything
-
- bool can_select_gizmos = true;
-
- {
- int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
- can_select_gizmos = view_menu->get_popup()->is_item_checked(idx);
- }
-
- if (can_select_gizmos && spatial_editor->get_selected()) {
-
- Ref<EditorSpatialGizmo> seg = spatial_editor->get_selected()->get_gizmo();
- if (seg.is_valid()) {
- int handle = -1;
- Vector3 point;
- Vector3 normal;
- bool inters = seg->intersect_ray(camera, _edit.mouse_pos, point, normal, &handle, b->get_shift());
- if (inters && handle != -1) {
-
- _edit.gizmo = seg;
- _edit.gizmo_handle = handle;
- _edit.gizmo_initial_value = seg->get_handle_value(handle);
- break;
- }
- }
- }
-
- if (_gizmo_select(_edit.mouse_pos))
- break;
-
- clicked = 0;
- clicked_includes_current = false;
-
- if ((spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SELECT && b->get_control()) || spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_ROTATE) {
-
- /* HANDLE ROTATION */
- if (get_selected_count() == 0)
- break; //bye
- //handle rotate
- _edit.mode = TRANSFORM_ROTATE;
- _compute_edit(b->get_position());
- break;
- }
-
- if (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_MOVE) {
-
- if (get_selected_count() == 0)
- break; //bye
- //handle translate
- _edit.mode = TRANSFORM_TRANSLATE;
- _compute_edit(b->get_position());
- break;
- }
-
- if (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SCALE) {
-
- if (get_selected_count() == 0)
- break; //bye
- //handle scale
- _edit.mode = TRANSFORM_SCALE;
- _compute_edit(b->get_position());
- break;
- }
-
- // todo scale
-
- int gizmo_handle = -1;
-
- clicked = _select_ray(b->get_position(), b->get_shift(), clicked_includes_current, &gizmo_handle, b->get_shift());
-
- //clicking is always deferred to either move or release
-
- clicked_wants_append = b->get_shift();
-
- if (!clicked) {
-
- if (!clicked_wants_append)
- _clear_selected();
-
- //default to regionselect
- cursor.region_select = true;
- cursor.region_begin = b->get_position();
- cursor.region_end = b->get_position();
- }
-
- if (clicked && gizmo_handle >= 0) {
-
- Spatial *spa = Object::cast_to<Spatial>(ObjectDB::get_instance(clicked));
- if (spa) {
-
- Ref<EditorSpatialGizmo> seg = spa->get_gizmo();
- if (seg.is_valid()) {
-
- _edit.gizmo = seg;
- _edit.gizmo_handle = gizmo_handle;
- _edit.gizmo_initial_value = seg->get_handle_value(gizmo_handle);
- break;
- }
- }
- }
-
- surface->update();
- } else {
-
- if (_edit.gizmo.is_valid()) {
-
- _edit.gizmo->commit_handle(_edit.gizmo_handle, _edit.gizmo_initial_value, false);
- _edit.gizmo = Ref<EditorSpatialGizmo>();
- break;
- }
- if (clicked) {
- _select_clicked(clicked_wants_append, true);
- // Processing was deferred.
- clicked = 0;
- }
-
- if (cursor.region_select) {
-
- if (!clicked_wants_append) _clear_selected();
-
- _select_region();
- cursor.region_select = false;
- surface->update();
- }
-
- if (_edit.mode != TRANSFORM_NONE) {
-
- static const char *_transform_name[4] = { "None", "Rotate", "Translate", "Scale" };
- undo_redo->create_action(_transform_name[_edit.mode]);
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- undo_redo->add_do_method(sp, "set_global_transform", sp->get_global_gizmo_transform());
- undo_redo->add_undo_method(sp, "set_global_transform", se->original);
- }
- undo_redo->commit_action();
- _edit.mode = TRANSFORM_NONE;
- set_message("");
- }
-
- surface->update();
- }
-
- } break;
- }
- }
-
- Ref<InputEventMouseMotion> m = p_event;
-
- if (m.is_valid()) {
-
- _edit.mouse_pos = m->get_position();
-
- if (spatial_editor->get_selected()) {
-
- Ref<EditorSpatialGizmo> seg = spatial_editor->get_selected()->get_gizmo();
- if (seg.is_valid()) {
-
- int selected_handle = -1;
-
- int handle = -1;
- Vector3 point;
- Vector3 normal;
- bool inters = seg->intersect_ray(camera, _edit.mouse_pos, point, normal, &handle, false);
- if (inters && handle != -1) {
-
- selected_handle = handle;
- }
-
- if (selected_handle != spatial_editor->get_over_gizmo_handle()) {
- spatial_editor->set_over_gizmo_handle(selected_handle);
- spatial_editor->get_selected()->update_gizmo();
- if (selected_handle != -1)
- spatial_editor->select_gizmo_highlight_axis(-1);
- }
- }
- }
-
- if (spatial_editor->get_over_gizmo_handle() == -1 && !(m->get_button_mask() & 1) && !_edit.gizmo.is_valid()) {
-
- _gizmo_select(_edit.mouse_pos, true);
- }
-
- NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
- NavigationMode nav_mode = NAVIGATION_NONE;
-
- if (_edit.gizmo.is_valid()) {
-
- _edit.gizmo->set_handle(_edit.gizmo_handle, camera, m->get_position());
- Variant v = _edit.gizmo->get_handle_value(_edit.gizmo_handle);
- String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle);
- set_message(n + ": " + String(v));
-
- } else if (m->get_button_mask() & BUTTON_MASK_LEFT) {
-
- if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) {
- nav_mode = NAVIGATION_ORBIT;
- } else if (nav_scheme == NAVIGATION_MODO && m->get_alt() && m->get_shift()) {
- nav_mode = NAVIGATION_PAN;
- } else if (nav_scheme == NAVIGATION_MODO && m->get_alt() && m->get_control()) {
- nav_mode = NAVIGATION_ZOOM;
- } else if (nav_scheme == NAVIGATION_MODO && m->get_alt()) {
- nav_mode = NAVIGATION_ORBIT;
- } else {
- if (clicked) {
-
- if (!clicked_includes_current) {
-
- _select_clicked(clicked_wants_append, true);
- // Processing was deferred.
- }
-
- _compute_edit(_edit.mouse_pos);
- clicked = 0;
-
- _edit.mode = TRANSFORM_TRANSLATE;
- }
-
- if (cursor.region_select) {
- cursor.region_end = m->get_position();
- surface->update();
- return;
- }
-
- if (_edit.mode == TRANSFORM_NONE)
- return;
-
- Vector3 ray_pos = _get_ray_pos(m->get_position());
- Vector3 ray = _get_ray(m->get_position());
- float snap = EDITOR_GET("interface/inspector/default_float_step");
- int snap_step_decimals = Math::range_step_decimals(snap);
-
- switch (_edit.mode) {
-
- case TRANSFORM_SCALE: {
-
- Vector3 motion_mask;
- Plane plane;
- bool plane_mv = false;
-
- switch (_edit.plane) {
- case TRANSFORM_VIEW:
- motion_mask = Vector3(0, 0, 0);
- plane = Plane(_edit.center, _get_camera_normal());
- break;
- case TRANSFORM_X_AXIS:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0);
- plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_Y_AXIS:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1);
- plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_Z_AXIS:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2);
- plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_YZ:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2) + spatial_editor->get_gizmo_transform().basis.get_axis(1);
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0));
- plane_mv = true;
- break;
- case TRANSFORM_XZ:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2) + spatial_editor->get_gizmo_transform().basis.get_axis(0);
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1));
- plane_mv = true;
- break;
- case TRANSFORM_XY:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0) + spatial_editor->get_gizmo_transform().basis.get_axis(1);
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2));
- plane_mv = true;
- break;
- }
-
- Vector3 intersection;
- if (!plane.intersects_ray(ray_pos, ray, &intersection))
- break;
-
- Vector3 click;
- if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click))
- break;
-
- Vector3 motion = intersection - click;
- if (_edit.plane != TRANSFORM_VIEW) {
-
- if (!plane_mv) {
-
- motion = motion_mask.dot(motion) * motion_mask;
-
- } else {
-
- // Alternative planar scaling mode
- if (_get_key_modifier(m) != KEY_SHIFT) {
- motion = motion_mask.dot(motion) * motion_mask;
- }
- }
-
- } else {
- float center_click_dist = click.distance_to(_edit.center);
- float center_inters_dist = intersection.distance_to(_edit.center);
- if (center_click_dist == 0)
- break;
-
- float scale = center_inters_dist - center_click_dist;
- motion = Vector3(scale, scale, scale);
- }
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- // Disable local transformation for TRANSFORM_VIEW
- bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW);
-
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
- snap = spatial_editor->get_scale_snap() / 100;
- }
- Vector3 motion_snapped = motion;
- motion_snapped.snap(Vector3(snap, snap, snap));
- // This might not be necessary anymore after issue #288 is solved (in 4.0?).
- set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
- String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp) {
- continue;
- }
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se) {
- continue;
- }
-
- if (sp->has_meta("_edit_lock_")) {
- continue;
- }
-
- Transform original = se->original;
- Transform original_local = se->original_local;
- Transform base = Transform(Basis(), _edit.center);
- Transform t;
- Vector3 local_scale;
-
- if (local_coords) {
-
- Basis g = original.basis.orthonormalized();
- Vector3 local_motion = g.inverse().xform(motion);
-
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
- local_motion.snap(Vector3(snap, snap, snap));
- }
-
- local_scale = original_local.basis.get_scale() * (local_motion + Vector3(1, 1, 1));
-
- // Prevent scaling to 0 it would break the gizmo
- Basis check = original_local.basis;
- check.scale(local_scale);
- if (check.determinant() != 0) {
-
- // Apply scale
- sp->set_scale(local_scale);
- }
-
- } else {
-
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
- motion.snap(Vector3(snap, snap, snap));
- }
-
- Transform r;
- r.basis.scale(motion + Vector3(1, 1, 1));
- t = base * (r * (base.inverse() * original));
-
- // Apply scale
- sp->set_global_transform(t);
- }
- }
-
- surface->update();
-
- } break;
-
- case TRANSFORM_TRANSLATE: {
-
- Vector3 motion_mask;
- Plane plane;
- bool plane_mv = false;
-
- switch (_edit.plane) {
- case TRANSFORM_VIEW:
- plane = Plane(_edit.center, _get_camera_normal());
- break;
- case TRANSFORM_X_AXIS:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0);
- plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_Y_AXIS:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1);
- plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_Z_AXIS:
- motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2);
- plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_YZ:
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0));
- plane_mv = true;
- break;
- case TRANSFORM_XZ:
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1));
- plane_mv = true;
- break;
- case TRANSFORM_XY:
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2));
- plane_mv = true;
- break;
- }
-
- Vector3 intersection;
- if (!plane.intersects_ray(ray_pos, ray, &intersection))
- break;
-
- Vector3 click;
- if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click))
- break;
-
- Vector3 motion = intersection - click;
- if (_edit.plane != TRANSFORM_VIEW) {
- if (!plane_mv) {
- motion = motion_mask.dot(motion) * motion_mask;
- }
- }
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- // Disable local transformation for TRANSFORM_VIEW
- bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW);
-
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
- snap = spatial_editor->get_translate_snap();
- }
- Vector3 motion_snapped = motion;
- motion_snapped.snap(Vector3(snap, snap, snap));
- set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
- String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp) {
- continue;
- }
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se) {
- continue;
- }
-
- if (sp->has_meta("_edit_lock_")) {
- continue;
- }
-
- Transform original = se->original;
- Transform t;
-
- if (local_coords) {
-
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
- Basis g = original.basis.orthonormalized();
- Vector3 local_motion = g.inverse().xform(motion);
- local_motion.snap(Vector3(snap, snap, snap));
-
- motion = g.xform(local_motion);
- }
-
- } else {
-
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
- motion.snap(Vector3(snap, snap, snap));
- }
- }
-
- // Apply translation
- t = original;
- t.origin += motion;
- sp->set_global_transform(t);
- }
-
- surface->update();
-
- } break;
-
- case TRANSFORM_ROTATE: {
-
- Plane plane;
- Vector3 axis;
-
- switch (_edit.plane) {
- case TRANSFORM_VIEW:
- plane = Plane(_edit.center, _get_camera_normal());
- break;
- case TRANSFORM_X_AXIS:
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0));
- axis = Vector3(1, 0, 0);
- break;
- case TRANSFORM_Y_AXIS:
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1));
- axis = Vector3(0, 1, 0);
- break;
- case TRANSFORM_Z_AXIS:
- plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2));
- axis = Vector3(0, 0, 1);
- break;
- case TRANSFORM_YZ:
- case TRANSFORM_XZ:
- case TRANSFORM_XY:
- break;
- }
-
- Vector3 intersection;
- if (!plane.intersects_ray(ray_pos, ray, &intersection))
- break;
-
- Vector3 click;
- if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click))
- break;
-
- Vector3 y_axis = (click - _edit.center).normalized();
- Vector3 x_axis = plane.normal.cross(y_axis).normalized();
-
- float angle = Math::atan2(x_axis.dot(intersection - _edit.center), y_axis.dot(intersection - _edit.center));
-
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
- snap = spatial_editor->get_rotate_snap();
- }
- angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180
- angle -= Math::fmod(angle, snap);
- set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals)));
- angle = Math::deg2rad(angle);
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); // Disable local transformation for TRANSFORM_VIEW
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- if (sp->has_meta("_edit_lock_")) {
- continue;
- }
-
- Transform t;
-
- if (local_coords) {
-
- Transform original_local = se->original_local;
- Basis rot = Basis(axis, angle);
-
- t.basis = original_local.get_basis().orthonormalized() * rot;
- t.origin = original_local.origin;
-
- // Apply rotation
- sp->set_transform(t);
- sp->set_scale(original_local.basis.get_scale()); // re-apply original scale
-
- } else {
-
- Transform original = se->original;
- Transform r;
- Transform base = Transform(Basis(), _edit.center);
-
- r.basis.rotate(plane.normal, angle);
- t = base * r * base.inverse() * original;
-
- // Apply rotation
- sp->set_global_transform(t);
- }
- }
-
- surface->update();
-
- } break;
- default: {
- }
- }
- }
-
- } else if ((m->get_button_mask() & BUTTON_MASK_RIGHT) || freelook_active) {
-
- if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) {
- nav_mode = NAVIGATION_ZOOM;
- } else if (freelook_active) {
- nav_mode = NAVIGATION_LOOK;
- } else if (orthogonal) {
- nav_mode = NAVIGATION_PAN;
- }
-
- } else if (m->get_button_mask() & BUTTON_MASK_MIDDLE) {
-
- if (nav_scheme == NAVIGATION_GODOT) {
-
- const int mod = _get_key_modifier(m);
-
- if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) {
- nav_mode = NAVIGATION_PAN;
- } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) {
- nav_mode = NAVIGATION_ZOOM;
- } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) {
- // Always allow Alt as a modifier to better support graphic tablets.
- nav_mode = NAVIGATION_ORBIT;
- }
-
- } else if (nav_scheme == NAVIGATION_MAYA) {
- if (m->get_alt())
- nav_mode = NAVIGATION_PAN;
- }
-
- } else if (EditorSettings::get_singleton()->get("editors/3d/navigation/emulate_3_button_mouse")) {
- // Handle trackpad (no external mouse) use case
- const int mod = _get_key_modifier(m);
-
- if (mod) {
- if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) {
- nav_mode = NAVIGATION_PAN;
- } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) {
- nav_mode = NAVIGATION_ZOOM;
- } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) {
- // Always allow Alt as a modifier to better support graphic tablets.
- nav_mode = NAVIGATION_ORBIT;
- }
- }
- }
-
- switch (nav_mode) {
- case NAVIGATION_PAN: {
- _nav_pan(m, _get_warped_mouse_motion(m));
-
- } break;
-
- case NAVIGATION_ZOOM: {
- _nav_zoom(m, m->get_relative());
-
- } break;
-
- case NAVIGATION_ORBIT: {
- _nav_orbit(m, _get_warped_mouse_motion(m));
-
- } break;
-
- case NAVIGATION_LOOK: {
- _nav_look(m, _get_warped_mouse_motion(m));
-
- } break;
-
- default: {
- }
- }
- }
-
- Ref<InputEventMagnifyGesture> magnify_gesture = p_event;
- if (magnify_gesture.is_valid()) {
-
- if (is_freelook_active())
- scale_freelook_speed(magnify_gesture->get_factor());
- else
- scale_cursor_distance(1.0 / magnify_gesture->get_factor());
- }
-
- Ref<InputEventPanGesture> pan_gesture = p_event;
- if (pan_gesture.is_valid()) {
-
- NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
- NavigationMode nav_mode = NAVIGATION_NONE;
-
- if (nav_scheme == NAVIGATION_GODOT) {
-
- const int mod = _get_key_modifier(pan_gesture);
-
- if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) {
- nav_mode = NAVIGATION_PAN;
- } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) {
- nav_mode = NAVIGATION_ZOOM;
- } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) {
- // Always allow Alt as a modifier to better support graphic tablets.
- nav_mode = NAVIGATION_ORBIT;
- }
-
- } else if (nav_scheme == NAVIGATION_MAYA) {
- if (pan_gesture->get_alt())
- nav_mode = NAVIGATION_PAN;
- }
-
- switch (nav_mode) {
- case NAVIGATION_PAN: {
- _nav_pan(m, pan_gesture->get_delta());
-
- } break;
-
- case NAVIGATION_ZOOM: {
- _nav_zoom(m, pan_gesture->get_delta());
-
- } break;
-
- case NAVIGATION_ORBIT: {
- _nav_orbit(m, pan_gesture->get_delta());
-
- } break;
-
- case NAVIGATION_LOOK: {
- _nav_look(m, pan_gesture->get_delta());
-
- } break;
-
- default: {
- }
- }
- }
-
- Ref<InputEventKey> k = p_event;
-
- if (k.is_valid()) {
- if (!k->is_pressed())
- return;
-
- if (ED_IS_SHORTCUT("spatial_editor/snap", p_event)) {
- if (_edit.mode != TRANSFORM_NONE) {
- _edit.snap = !_edit.snap;
- }
- }
- if (ED_IS_SHORTCUT("spatial_editor/bottom_view", p_event)) {
- _menu_option(VIEW_BOTTOM);
- }
- if (ED_IS_SHORTCUT("spatial_editor/top_view", p_event)) {
- _menu_option(VIEW_TOP);
- }
- if (ED_IS_SHORTCUT("spatial_editor/rear_view", p_event)) {
- _menu_option(VIEW_REAR);
- }
- if (ED_IS_SHORTCUT("spatial_editor/front_view", p_event)) {
- _menu_option(VIEW_FRONT);
- }
- if (ED_IS_SHORTCUT("spatial_editor/left_view", p_event)) {
- _menu_option(VIEW_LEFT);
- }
- if (ED_IS_SHORTCUT("spatial_editor/right_view", p_event)) {
- _menu_option(VIEW_RIGHT);
- }
- if (ED_IS_SHORTCUT("spatial_editor/focus_origin", p_event)) {
- _menu_option(VIEW_CENTER_TO_ORIGIN);
- }
- if (ED_IS_SHORTCUT("spatial_editor/focus_selection", p_event)) {
- _menu_option(VIEW_CENTER_TO_SELECTION);
- }
- // Orthgonal mode doesn't work in freelook.
- if (!freelook_active && ED_IS_SHORTCUT("spatial_editor/switch_perspective_orthogonal", p_event)) {
- _menu_option(orthogonal ? VIEW_PERSPECTIVE : VIEW_ORTHOGONAL);
- _update_name();
- }
- if (ED_IS_SHORTCUT("spatial_editor/align_transform_with_view", p_event)) {
- _menu_option(VIEW_ALIGN_TRANSFORM_WITH_VIEW);
- }
- if (ED_IS_SHORTCUT("spatial_editor/align_rotation_with_view", p_event)) {
- _menu_option(VIEW_ALIGN_ROTATION_WITH_VIEW);
- }
- if (ED_IS_SHORTCUT("spatial_editor/insert_anim_key", p_event)) {
- if (!get_selected_count() || _edit.mode != TRANSFORM_NONE)
- return;
-
- if (!AnimationPlayerEditor::singleton->get_track_editor()->has_keying()) {
- set_message(TTR("Keying is disabled (no key inserted)."));
- return;
- }
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- spatial_editor->emit_signal("transform_key_request", sp, "", sp->get_transform());
- }
-
- set_message(TTR("Animation Key Inserted."));
- }
-
- // Freelook doesn't work in orthogonal mode.
- if (!orthogonal && ED_IS_SHORTCUT("spatial_editor/freelook_toggle", p_event)) {
- set_freelook_active(!is_freelook_active());
-
- } else if (k->get_scancode() == KEY_ESCAPE) {
- set_freelook_active(false);
- }
-
- if (k->get_scancode() == KEY_SPACE) {
- if (!k->is_pressed()) emit_signal("toggle_maximize_view", this);
- }
- }
-
- // freelook uses most of the useful shortcuts, like save, so its ok
- // to consider freelook active as end of the line for future events.
- if (freelook_active)
- accept_event();
-}
-
-void SpatialEditorViewport::_nav_pan(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
-
- const NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
-
- real_t pan_speed = 1 / 150.0;
- int pan_speed_modifier = 10;
- if (nav_scheme == NAVIGATION_MAYA && p_event->get_shift())
- pan_speed *= pan_speed_modifier;
-
- Transform camera_transform;
-
- camera_transform.translate(cursor.pos);
- camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot);
- camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot);
- Vector3 translation(-p_relative.x * pan_speed, p_relative.y * pan_speed, 0);
- translation *= cursor.distance / DISTANCE_DEFAULT;
- camera_transform.translate(translation);
- cursor.pos = camera_transform.origin;
-}
-
-void SpatialEditorViewport::_nav_zoom(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
-
- const NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
-
- real_t zoom_speed = 1 / 80.0;
- int zoom_speed_modifier = 10;
- if (nav_scheme == NAVIGATION_MAYA && p_event->get_shift())
- zoom_speed *= zoom_speed_modifier;
-
- NavigationZoomStyle zoom_style = (NavigationZoomStyle)EditorSettings::get_singleton()->get("editors/3d/navigation/zoom_style").operator int();
- if (zoom_style == NAVIGATION_ZOOM_HORIZONTAL) {
- if (p_relative.x > 0)
- scale_cursor_distance(1 - p_relative.x * zoom_speed);
- else if (p_relative.x < 0)
- scale_cursor_distance(1.0 / (1 + p_relative.x * zoom_speed));
- } else {
- if (p_relative.y > 0)
- scale_cursor_distance(1 + p_relative.y * zoom_speed);
- else if (p_relative.y < 0)
- scale_cursor_distance(1.0 / (1 - p_relative.y * zoom_speed));
- }
-}
-
-void SpatialEditorViewport::_nav_orbit(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
-
- if (lock_rotation) {
- _nav_pan(p_event, p_relative);
- return;
- }
-
- real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity");
- real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel);
- bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis");
-
- if (invert_y_axis) {
- cursor.x_rot -= p_relative.y * radians_per_pixel;
- } else {
- cursor.x_rot += p_relative.y * radians_per_pixel;
- }
- cursor.y_rot += p_relative.x * radians_per_pixel;
- if (cursor.x_rot > Math_PI / 2.0)
- cursor.x_rot = Math_PI / 2.0;
- if (cursor.x_rot < -Math_PI / 2.0)
- cursor.x_rot = -Math_PI / 2.0;
- name = "";
- _update_name();
-}
-
-void SpatialEditorViewport::_nav_look(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative) {
-
- if (orthogonal) {
- _nav_pan(p_event, p_relative);
- return;
- }
-
- real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity");
- real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel);
- bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis");
-
- // Note: do NOT assume the camera has the "current" transform, because it is interpolated and may have "lag".
- Transform prev_camera_transform = to_camera_transform(cursor);
-
- if (invert_y_axis) {
- cursor.x_rot -= p_relative.y * radians_per_pixel;
- } else {
- cursor.x_rot += p_relative.y * radians_per_pixel;
- }
- cursor.y_rot += p_relative.x * radians_per_pixel;
- if (cursor.x_rot > Math_PI / 2.0)
- cursor.x_rot = Math_PI / 2.0;
- if (cursor.x_rot < -Math_PI / 2.0)
- cursor.x_rot = -Math_PI / 2.0;
-
- // Look is like the opposite of Orbit: the focus point rotates around the camera
- Transform camera_transform = to_camera_transform(cursor);
- Vector3 pos = camera_transform.xform(Vector3(0, 0, 0));
- Vector3 prev_pos = prev_camera_transform.xform(Vector3(0, 0, 0));
- Vector3 diff = prev_pos - pos;
- cursor.pos += diff;
-
- name = "";
- _update_name();
-}
-
-void SpatialEditorViewport::set_freelook_active(bool active_now) {
-
- if (!freelook_active && active_now) {
- // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential
- cursor = camera_cursor;
-
- // Make sure eye_pos is synced, because freelook referential is eye pos rather than orbit pos
- Vector3 forward = to_camera_transform(cursor).basis.xform(Vector3(0, 0, -1));
- cursor.eye_pos = cursor.pos - cursor.distance * forward;
- // Also sync the camera cursor, otherwise switching to freelook will be trippy if inertia is active
- camera_cursor.eye_pos = cursor.eye_pos;
-
- if (EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_speed_zoom_link")) {
- // Re-adjust freelook speed from the current zoom level
- real_t base_speed = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_base_speed");
- freelook_speed = base_speed * cursor.distance;
- }
-
- // Hide mouse like in an FPS (warping doesn't work)
- OS::get_singleton()->set_mouse_mode(OS::MOUSE_MODE_CAPTURED);
-
- } else if (freelook_active && !active_now) {
- // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential
- cursor = camera_cursor;
-
- // Restore mouse
- OS::get_singleton()->set_mouse_mode(OS::MOUSE_MODE_VISIBLE);
- }
-
- freelook_active = active_now;
-}
-
-void SpatialEditorViewport::scale_cursor_distance(real_t scale) {
-
- // Prevents zero distance which would short-circuit any scaling
- if (cursor.distance < ZOOM_MIN_DISTANCE)
- cursor.distance = ZOOM_MIN_DISTANCE;
-
- cursor.distance *= scale;
-
- if (cursor.distance < ZOOM_MIN_DISTANCE)
- cursor.distance = ZOOM_MIN_DISTANCE;
-
- zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S;
- surface->update();
-}
-
-void SpatialEditorViewport::scale_freelook_speed(real_t scale) {
-
- // Prevents zero distance which would short-circuit any scaling
- if (freelook_speed < FREELOOK_MIN_SPEED)
- freelook_speed = FREELOOK_MIN_SPEED;
-
- freelook_speed *= scale;
-
- if (freelook_speed < FREELOOK_MIN_SPEED)
- freelook_speed = FREELOOK_MIN_SPEED;
-
- zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S;
- surface->update();
-}
-
-Point2i SpatialEditorViewport::_get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_ev_mouse_motion) const {
- Point2i relative;
- if (bool(EDITOR_DEF("editors/3d/navigation/warped_mouse_panning", false))) {
- relative = Input::get_singleton()->warp_mouse_motion(p_ev_mouse_motion, surface->get_global_rect());
- } else {
- relative = p_ev_mouse_motion->get_relative();
- }
- return relative;
-}
-
-static bool is_shortcut_pressed(const String &p_path) {
- Ref<ShortCut> shortcut = ED_GET_SHORTCUT(p_path);
- if (shortcut.is_null()) {
- return false;
- }
- InputEventKey *k = Object::cast_to<InputEventKey>(shortcut->get_shortcut().ptr());
- if (k == NULL) {
- return false;
- }
- const Input &input = *Input::get_singleton();
- int scancode = k->get_scancode();
- return input.is_key_pressed(scancode);
-}
-
-void SpatialEditorViewport::_update_freelook(real_t delta) {
-
- if (!is_freelook_active()) {
- return;
- }
-
- const Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
- const Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
- const Vector3 up = camera->get_transform().basis.xform(Vector3(0, 1, 0));
-
- Vector3 direction;
-
- if (is_shortcut_pressed("spatial_editor/freelook_left")) {
- direction -= right;
- }
- if (is_shortcut_pressed("spatial_editor/freelook_right")) {
- direction += right;
- }
- if (is_shortcut_pressed("spatial_editor/freelook_forward")) {
- direction += forward;
- }
- if (is_shortcut_pressed("spatial_editor/freelook_backwards")) {
- direction -= forward;
- }
- if (is_shortcut_pressed("spatial_editor/freelook_up")) {
- direction += up;
- }
- if (is_shortcut_pressed("spatial_editor/freelook_down")) {
- direction -= up;
- }
-
- real_t speed = freelook_speed;
-
- if (is_shortcut_pressed("spatial_editor/freelook_speed_modifier")) {
- speed *= 3.0;
- }
- if (is_shortcut_pressed("spatial_editor/freelook_slow_modifier")) {
- speed *= 0.333333;
- }
-
- const Vector3 motion = direction * speed * delta;
- cursor.pos += motion;
- cursor.eye_pos += motion;
-}
-
-void SpatialEditorViewport::set_message(String p_message, float p_time) {
-
- message = p_message;
- message_time = p_time;
-}
-
-void SpatialEditorPlugin::edited_scene_changed() {
- for (uint32_t i = 0; i < SpatialEditor::VIEWPORTS_COUNT; i++) {
- SpatialEditorViewport *viewport = SpatialEditor::get_singleton()->get_editor_viewport(i);
- if (viewport->is_visible()) {
- viewport->notification(Control::NOTIFICATION_VISIBILITY_CHANGED);
- }
- }
-}
-
-void SpatialEditorViewport::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
-
- bool visible = is_visible_in_tree();
-
- set_process(visible);
-
- if (visible) {
- _update_camera(0);
- } else {
- set_freelook_active(false);
- }
- call_deferred("update_transform_gizmo_view");
- }
-
- if (p_what == NOTIFICATION_RESIZED) {
-
- call_deferred("update_transform_gizmo_view");
- }
-
- if (p_what == NOTIFICATION_READY) {
- // The crosshair icon doesn't depend on the editor theme.
- crosshair->set_texture(get_icon("Crosshair", "EditorIcons"));
- // Set the anchors and margins after changing the icon to ensure it's centered correctly.
- crosshair->set_anchors_and_margins_preset(PRESET_CENTER);
- }
-
- if (p_what == NOTIFICATION_PROCESS) {
-
- real_t delta = get_process_delta_time();
-
- if (zoom_indicator_delay > 0) {
- zoom_indicator_delay -= delta;
- if (zoom_indicator_delay <= 0) {
- surface->update();
- }
- }
-
- _update_freelook(delta);
-
- Node *scene_root = editor->get_scene_tree_dock()->get_editor_data()->get_edited_scene_root();
- if (previewing_cinema && scene_root != NULL) {
- Camera *cam = scene_root->get_viewport()->get_camera();
- if (cam != NULL && cam != previewing) {
- //then switch the viewport's camera to the scene's viewport camera
- if (previewing != NULL) {
- previewing->disconnect("tree_exited", this, "_preview_exited_scene");
- }
- previewing = cam;
- previewing->connect("tree_exited", this, "_preview_exited_scene");
- VS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera());
- surface->update();
- }
- }
-
- _update_camera(delta);
-
- Map<Node *, Object *> &selection = editor_selection->get_selection();
-
- bool changed = false;
- bool exist = false;
-
- for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->key());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- VisualInstance *vi = Object::cast_to<VisualInstance>(sp);
-
- se->aabb = vi ? vi->get_aabb() : _calculate_spatial_bounds(sp);
-
- Transform t = sp->get_global_gizmo_transform();
- t.translate(se->aabb.position);
-
- // apply AABB scaling before item's global transform
- Basis aabb_s;
- aabb_s.scale(se->aabb.size);
- t.basis = t.basis * aabb_s;
-
- exist = true;
- if (se->last_xform == t)
- continue;
- changed = true;
- se->last_xform = t;
- VisualServer::get_singleton()->instance_set_transform(se->sbox_instance, t);
- }
-
- if (changed || (spatial_editor->is_gizmo_visible() && !exist)) {
- spatial_editor->update_transform_gizmo();
- }
-
- if (message_time > 0) {
-
- if (message != last_message) {
- surface->update();
- last_message = message;
- }
-
- message_time -= get_physics_process_delta_time();
- if (message_time < 0)
- surface->update();
- }
-
- //update shadow atlas if changed
-
- int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/size");
- int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_0_subdiv");
- int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_1_subdiv");
- int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_2_subdiv");
- int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_3_subdiv");
-
- viewport->set_shadow_atlas_size(shadowmap_size);
- viewport->set_shadow_atlas_quadrant_subdiv(0, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q0));
- viewport->set_shadow_atlas_quadrant_subdiv(1, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q1));
- viewport->set_shadow_atlas_quadrant_subdiv(2, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q2));
- viewport->set_shadow_atlas_quadrant_subdiv(3, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q3));
-
- bool shrink = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION));
-
- if (shrink != (viewport_container->get_stretch_shrink() > 1)) {
- viewport_container->set_stretch_shrink(shrink ? 2 : 1);
- }
-
- //update msaa if changed
-
- int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/filters/msaa");
- viewport->set_msaa(Viewport::MSAA(msaa_mode));
-
- bool hdr = ProjectSettings::get_singleton()->get("rendering/quality/depth/hdr");
- viewport->set_hdr(hdr);
-
- bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION));
- info_label->set_visible(show_info);
-
- Camera *current_camera;
-
- if (previewing) {
- current_camera = previewing;
- } else {
- current_camera = camera;
- }
-
- // Display the crosshair only while freelooking. Hide it otherwise,
- // as the crosshair can be distracting.
- crosshair->set_visible(freelook_active);
-
- if (show_info) {
- String text;
- text += "X: " + rtos(current_camera->get_translation().x).pad_decimals(1) + "\n";
- text += "Y: " + rtos(current_camera->get_translation().y).pad_decimals(1) + "\n";
- text += "Z: " + rtos(current_camera->get_translation().z).pad_decimals(1) + "\n";
- text += TTR("Pitch") + ": " + itos(Math::round(current_camera->get_rotation_degrees().x)) + "\n";
- text += TTR("Yaw") + ": " + itos(Math::round(current_camera->get_rotation_degrees().y)) + "\n\n";
- text += TTR("Objects Drawn") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_OBJECTS_IN_FRAME)) + "\n";
- text += TTR("Material Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_MATERIAL_CHANGES_IN_FRAME)) + "\n";
- text += TTR("Shader Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SHADER_CHANGES_IN_FRAME)) + "\n";
- text += TTR("Surface Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SURFACE_CHANGES_IN_FRAME)) + "\n";
- text += TTR("Draw Calls") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)) + "\n";
- text += TTR("Vertices") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_VERTICES_IN_FRAME));
- info_label->set_text(text);
- }
-
- // FPS Counter.
- bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FPS));
- fps_label->set_visible(show_fps);
-
- if (show_fps) {
- String text;
- const float temp_fps = Engine::get_singleton()->get_frames_per_second();
- text += TTR(vformat("FPS: %d (%s ms)", temp_fps, String::num(1000.0f / temp_fps, 2)));
- fps_label->set_text(text);
- }
-
- bool show_cinema = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
- cinema_label->set_visible(show_cinema);
- if (show_cinema) {
- float cinema_half_width = cinema_label->get_size().width / 2.0f;
- cinema_label->set_anchor_and_margin(MARGIN_LEFT, 0.5f, -cinema_half_width);
- }
-
- if (lock_rotation) {
- float locked_half_width = locked_label->get_size().width / 2.0f;
- locked_label->set_anchor_and_margin(MARGIN_LEFT, 0.5f, -locked_half_width);
- }
- }
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
-
- surface->connect("draw", this, "_draw");
- surface->connect("gui_input", this, "_sinput");
- surface->connect("mouse_entered", this, "_surface_mouse_enter");
- surface->connect("mouse_exited", this, "_surface_mouse_exit");
- surface->connect("focus_entered", this, "_surface_focus_enter");
- surface->connect("focus_exited", this, "_surface_focus_exit");
-
- _init_gizmo_instance(index);
- }
-
- if (p_what == NOTIFICATION_EXIT_TREE) {
-
- _finish_gizmo_instances();
- }
-
- if (p_what == NOTIFICATION_THEME_CHANGED) {
-
- view_menu->set_icon(get_icon("GuiTabMenu", "EditorIcons"));
- preview_camera->set_icon(get_icon("Camera", "EditorIcons"));
-
- view_menu->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- view_menu->add_style_override("hover", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- view_menu->add_style_override("pressed", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- view_menu->add_style_override("focus", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- view_menu->add_style_override("disabled", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
-
- preview_camera->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- preview_camera->add_style_override("hover", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- preview_camera->add_style_override("pressed", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- preview_camera->add_style_override("focus", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- preview_camera->add_style_override("disabled", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
-
- info_label->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- fps_label->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- cinema_label->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- locked_label->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));
- }
-}
-
-static void draw_indicator_bar(Control &surface, real_t fill, Ref<Texture> icon) {
-
- // Adjust bar size from control height
- Vector2 surface_size = surface.get_size();
- real_t h = surface_size.y / 2.0;
- real_t y = (surface_size.y - h) / 2.0;
-
- Rect2 r(10, y, 6, h);
- real_t sy = r.size.y * fill;
-
- // Note: because this bar appears over the viewport, it has to stay readable for any background color
- // Draw both neutral dark and bright colors to account this
- surface.draw_rect(r, Color(1, 1, 1, 0.2));
- surface.draw_rect(Rect2(r.position.x, r.position.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6));
- surface.draw_rect(r.grow(1), Color(0, 0, 0, 0.7), false, Math::round(EDSCALE));
-
- Vector2 icon_size = icon->get_size();
- Vector2 icon_pos = Vector2(r.position.x - (icon_size.x - r.size.x) / 2, r.position.y + r.size.y + 2);
- surface.draw_texture(icon, icon_pos);
-}
-
-void SpatialEditorViewport::_draw() {
-
- EditorPluginList *over_plugin_list = EditorNode::get_singleton()->get_editor_plugins_over();
- if (!over_plugin_list->empty()) {
- over_plugin_list->forward_spatial_draw_over_viewport(surface);
- }
-
- EditorPluginList *force_over_plugin_list = editor->get_editor_plugins_force_over();
- if (!force_over_plugin_list->empty()) {
- force_over_plugin_list->forward_spatial_force_draw_over_viewport(surface);
- }
-
- if (surface->has_focus()) {
- Size2 size = surface->get_size();
- Rect2 r = Rect2(Point2(), size);
- get_stylebox("Focus", "EditorStyles")->draw(surface->get_canvas_item(), r);
- }
-
- if (cursor.region_select) {
- const Rect2 selection_rect = Rect2(cursor.region_begin, cursor.region_end - cursor.region_begin);
-
- surface->draw_rect(
- selection_rect,
- get_color("box_selection_fill_color", "Editor"));
-
- surface->draw_rect(
- selection_rect,
- get_color("box_selection_stroke_color", "Editor"),
- false,
- Math::round(EDSCALE));
- }
-
- RID ci = surface->get_canvas_item();
-
- if (message_time > 0) {
- Ref<Font> font = get_font("font", "Label");
- Point2 msgpos = Point2(5, get_size().y - 20);
- font->draw(ci, msgpos + Point2(1, 1), message, Color(0, 0, 0, 0.8));
- font->draw(ci, msgpos + Point2(-1, -1), message, Color(0, 0, 0, 0.8));
- font->draw(ci, msgpos, message, Color(1, 1, 1, 1));
- }
-
- if (_edit.mode == TRANSFORM_ROTATE) {
-
- Point2 center = _point_to_screen(_edit.center);
- VisualServer::get_singleton()->canvas_item_add_line(
- ci,
- _edit.mouse_pos,
- center,
- get_color("accent_color", "Editor") * Color(1, 1, 1, 0.6),
- Math::round(2 * EDSCALE),
- true);
- }
- if (previewing) {
-
- Size2 ss = Size2(ProjectSettings::get_singleton()->get("display/window/size/width"), ProjectSettings::get_singleton()->get("display/window/size/height"));
- float aspect = ss.aspect();
- Size2 s = get_size();
-
- Rect2 draw_rect;
-
- switch (previewing->get_keep_aspect_mode()) {
- case Camera::KEEP_WIDTH: {
-
- draw_rect.size = Size2(s.width, s.width / aspect);
- draw_rect.position.x = 0;
- draw_rect.position.y = (s.height - draw_rect.size.y) * 0.5;
-
- } break;
- case Camera::KEEP_HEIGHT: {
-
- draw_rect.size = Size2(s.height * aspect, s.height);
- draw_rect.position.y = 0;
- draw_rect.position.x = (s.width - draw_rect.size.x) * 0.5;
-
- } break;
- }
-
- draw_rect = Rect2(Vector2(), s).clip(draw_rect);
-
- surface->draw_rect(draw_rect, Color(0.6, 0.6, 0.1, 0.5), false, Math::round(2 * EDSCALE));
-
- } else {
-
- if (zoom_indicator_delay > 0.0) {
-
- if (is_freelook_active()) {
- // Show speed
-
- real_t min_speed = FREELOOK_MIN_SPEED;
- real_t max_speed = camera->get_zfar();
- real_t scale_length = (max_speed - min_speed);
-
- if (!Math::is_zero_approx(scale_length)) {
- real_t logscale_t = 1.0 - Math::log(1 + freelook_speed - min_speed) / Math::log(1 + scale_length);
-
- // There is no real maximum speed so that factor can become negative,
- // Let's make it look asymptotic instead (will decrease slower and slower).
- if (logscale_t < 0.25)
- logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0);
-
- draw_indicator_bar(*surface, 1.0 - logscale_t, get_icon("ViewportSpeed", "EditorIcons"));
- }
-
- } else {
- // Show zoom
-
- real_t min_distance = ZOOM_MIN_DISTANCE; // TODO Why not pick znear to limit zoom?
- real_t max_distance = camera->get_zfar();
- real_t scale_length = (max_distance - min_distance);
-
- if (!Math::is_zero_approx(scale_length)) {
- real_t logscale_t = 1.0 - Math::log(1 + cursor.distance - min_distance) / Math::log(1 + scale_length);
-
- // There is no real maximum distance so that factor can become negative,
- // Let's make it look asymptotic instead (will decrease slower and slower).
- if (logscale_t < 0.25)
- logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0);
-
- draw_indicator_bar(*surface, logscale_t, get_icon("ViewportZoom", "EditorIcons"));
- }
- }
- }
- }
-}
-
-void SpatialEditorViewport::_menu_option(int p_option) {
-
- switch (p_option) {
-
- case VIEW_TOP: {
-
- cursor.y_rot = 0;
- cursor.x_rot = Math_PI / 2.0;
- set_message(TTR("Top View."), 2);
- name = TTR("Top");
- _update_name();
-
- } break;
- case VIEW_BOTTOM: {
-
- cursor.y_rot = 0;
- cursor.x_rot = -Math_PI / 2.0;
- set_message(TTR("Bottom View."), 2);
- name = TTR("Bottom");
- _update_name();
-
- } break;
- case VIEW_LEFT: {
-
- cursor.x_rot = 0;
- cursor.y_rot = Math_PI / 2.0;
- set_message(TTR("Left View."), 2);
- name = TTR("Left");
- _update_name();
-
- } break;
- case VIEW_RIGHT: {
-
- cursor.x_rot = 0;
- cursor.y_rot = -Math_PI / 2.0;
- set_message(TTR("Right View."), 2);
- name = TTR("Right");
- _update_name();
-
- } break;
- case VIEW_FRONT: {
-
- cursor.x_rot = 0;
- cursor.y_rot = 0;
- set_message(TTR("Front View."), 2);
- name = TTR("Front");
- _update_name();
-
- } break;
- case VIEW_REAR: {
-
- cursor.x_rot = 0;
- cursor.y_rot = Math_PI;
- set_message(TTR("Rear View."), 2);
- name = TTR("Rear");
- _update_name();
-
- } break;
- case VIEW_CENTER_TO_ORIGIN: {
-
- cursor.pos = Vector3(0, 0, 0);
-
- } break;
- case VIEW_CENTER_TO_SELECTION: {
-
- focus_selection();
-
- } break;
- case VIEW_ALIGN_TRANSFORM_WITH_VIEW: {
-
- if (!get_selected_count())
- break;
-
- Transform camera_transform = camera->get_global_transform();
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- undo_redo->create_action(TTR("Align Transform with View"));
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- Transform xform;
- if (orthogonal) {
- xform = sp->get_global_transform();
- xform.basis.set_euler(camera_transform.basis.get_euler());
- } else {
- xform = camera_transform;
- xform.scale_basis(sp->get_scale());
- }
-
- undo_redo->add_do_method(sp, "set_global_transform", xform);
- undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_gizmo_transform());
- }
- undo_redo->commit_action();
- focus_selection();
-
- } break;
- case VIEW_ALIGN_ROTATION_WITH_VIEW: {
-
- if (!get_selected_count())
- break;
-
- Transform camera_transform = camera->get_global_transform();
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- undo_redo->create_action(TTR("Align Rotation with View"));
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- undo_redo->add_do_method(sp, "set_rotation", camera_transform.basis.get_rotation());
- undo_redo->add_undo_method(sp, "set_rotation", sp->get_rotation());
- }
- undo_redo->commit_action();
-
- } break;
- case VIEW_ENVIRONMENT: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- current = !current;
- if (current) {
-
- camera->set_environment(RES());
- } else {
-
- camera->set_environment(SpatialEditor::get_singleton()->get_viewport_environment());
- }
-
- view_menu->get_popup()->set_item_checked(idx, current);
-
- } break;
- case VIEW_PERSPECTIVE: {
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), false);
- orthogonal = false;
- call_deferred("update_transform_gizmo_view");
- _update_name();
-
- } break;
- case VIEW_ORTHOGONAL: {
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), true);
- orthogonal = true;
- call_deferred("update_transform_gizmo_view");
- _update_name();
-
- } break;
- case VIEW_LOCK_ROTATION: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_LOCK_ROTATION);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- lock_rotation = !current;
- view_menu->get_popup()->set_item_checked(idx, !current);
- if (lock_rotation) {
- locked_label->show();
- } else {
- locked_label->hide();
- }
-
- } break;
- case VIEW_AUDIO_LISTENER: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- current = !current;
- viewport->set_as_audio_listener(current);
- view_menu->get_popup()->set_item_checked(idx, current);
-
- } break;
- case VIEW_AUDIO_DOPPLER: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- current = !current;
- camera->set_doppler_tracking(current ? Camera::DOPPLER_TRACKING_IDLE_STEP : Camera::DOPPLER_TRACKING_DISABLED);
- view_menu->get_popup()->set_item_checked(idx, current);
-
- } break;
- case VIEW_CINEMATIC_PREVIEW: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- current = !current;
- view_menu->get_popup()->set_item_checked(idx, current);
- previewing_cinema = true;
- _toggle_cinema_preview(current);
-
- if (current) {
- preview_camera->hide();
- } else {
- if (previewing != NULL)
- preview_camera->show();
- }
- } break;
- case VIEW_GIZMOS: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- current = !current;
- if (current)
- camera->set_cull_mask(((1 << 20) - 1) | (1 << (GIZMO_BASE_LAYER + index)) | (1 << GIZMO_EDIT_LAYER) | (1 << GIZMO_GRID_LAYER));
- else
- camera->set_cull_mask(((1 << 20) - 1) | (1 << (GIZMO_BASE_LAYER + index)) | (1 << GIZMO_GRID_LAYER));
- view_menu->get_popup()->set_item_checked(idx, current);
-
- } break;
- case VIEW_HALF_RESOLUTION: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- current = !current;
- view_menu->get_popup()->set_item_checked(idx, current);
- } break;
- case VIEW_INFORMATION: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_INFORMATION);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- view_menu->get_popup()->set_item_checked(idx, !current);
-
- } break;
- case VIEW_FPS: {
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_FPS);
- bool current = view_menu->get_popup()->is_item_checked(idx);
- view_menu->get_popup()->set_item_checked(idx, !current);
-
- } break;
- case VIEW_DISPLAY_NORMAL: {
-
- viewport->set_debug_draw(Viewport::DEBUG_DRAW_DISABLED);
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS), false);
- } break;
- case VIEW_DISPLAY_WIREFRAME: {
-
- viewport->set_debug_draw(Viewport::DEBUG_DRAW_WIREFRAME);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS), false);
-
- } break;
- case VIEW_DISPLAY_OVERDRAW: {
-
- viewport->set_debug_draw(Viewport::DEBUG_DRAW_OVERDRAW);
- VisualServer::get_singleton()->scenario_set_debug(get_tree()->get_root()->get_world()->get_scenario(), VisualServer::SCENARIO_DEBUG_OVERDRAW);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS), false);
-
- } break;
- case VIEW_DISPLAY_SHADELESS: {
-
- viewport->set_debug_draw(Viewport::DEBUG_DRAW_UNSHADED);
- VisualServer::get_singleton()->scenario_set_debug(get_tree()->get_root()->get_world()->get_scenario(), VisualServer::SCENARIO_DEBUG_SHADELESS);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS), true);
-
- } break;
- }
-}
-
-void SpatialEditorViewport::_preview_exited_scene() {
-
- preview_camera->disconnect("toggled", this, "_toggle_camera_preview");
- preview_camera->set_pressed(false);
- _toggle_camera_preview(false);
- preview_camera->connect("toggled", this, "_toggle_camera_preview");
- view_menu->show();
-}
-
-void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
-
- uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx);
-
- for (int i = 0; i < 3; i++) {
- move_gizmo_instance[i] = VS::get_singleton()->instance_create();
- VS::get_singleton()->instance_set_base(move_gizmo_instance[i], spatial_editor->get_move_gizmo(i)->get_rid());
- VS::get_singleton()->instance_set_scenario(move_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
- VS::get_singleton()->instance_set_visible(move_gizmo_instance[i], false);
- VS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_gizmo_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
- VS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i], layer);
-
- move_plane_gizmo_instance[i] = VS::get_singleton()->instance_create();
- VS::get_singleton()->instance_set_base(move_plane_gizmo_instance[i], spatial_editor->get_move_plane_gizmo(i)->get_rid());
- VS::get_singleton()->instance_set_scenario(move_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
- VS::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false);
- VS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_plane_gizmo_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
- VS::get_singleton()->instance_set_layer_mask(move_plane_gizmo_instance[i], layer);
-
- rotate_gizmo_instance[i] = VS::get_singleton()->instance_create();
- VS::get_singleton()->instance_set_base(rotate_gizmo_instance[i], spatial_editor->get_rotate_gizmo(i)->get_rid());
- VS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
- VS::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false);
- VS::get_singleton()->instance_geometry_set_cast_shadows_setting(rotate_gizmo_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
- VS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i], layer);
-
- scale_gizmo_instance[i] = VS::get_singleton()->instance_create();
- VS::get_singleton()->instance_set_base(scale_gizmo_instance[i], spatial_editor->get_scale_gizmo(i)->get_rid());
- VS::get_singleton()->instance_set_scenario(scale_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
- VS::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false);
- VS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_gizmo_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
- VS::get_singleton()->instance_set_layer_mask(scale_gizmo_instance[i], layer);
-
- scale_plane_gizmo_instance[i] = VS::get_singleton()->instance_create();
- VS::get_singleton()->instance_set_base(scale_plane_gizmo_instance[i], spatial_editor->get_scale_plane_gizmo(i)->get_rid());
- VS::get_singleton()->instance_set_scenario(scale_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
- VS::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false);
- VS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_plane_gizmo_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
- VS::get_singleton()->instance_set_layer_mask(scale_plane_gizmo_instance[i], layer);
- }
-}
-
-void SpatialEditorViewport::_finish_gizmo_instances() {
-
- for (int i = 0; i < 3; i++) {
- VS::get_singleton()->free(move_gizmo_instance[i]);
- VS::get_singleton()->free(move_plane_gizmo_instance[i]);
- VS::get_singleton()->free(rotate_gizmo_instance[i]);
- VS::get_singleton()->free(scale_gizmo_instance[i]);
- VS::get_singleton()->free(scale_plane_gizmo_instance[i]);
- }
-}
-void SpatialEditorViewport::_toggle_camera_preview(bool p_activate) {
-
- ERR_FAIL_COND(p_activate && !preview);
- ERR_FAIL_COND(!p_activate && !previewing);
-
- if (!p_activate) {
-
- previewing->disconnect("tree_exiting", this, "_preview_exited_scene");
- previewing = NULL;
- VS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
- if (!preview)
- preview_camera->hide();
- view_menu->set_disabled(false);
- surface->update();
-
- } else {
-
- previewing = preview;
- previewing->connect("tree_exiting", this, "_preview_exited_scene");
- VS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), preview->get_camera()); //replace
- view_menu->set_disabled(true);
- surface->update();
- }
-}
-
-void SpatialEditorViewport::_toggle_cinema_preview(bool p_activate) {
- previewing_cinema = p_activate;
- if (!previewing_cinema) {
- if (previewing != NULL)
- previewing->disconnect("tree_exited", this, "_preview_exited_scene");
-
- previewing = NULL;
- VS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
- preview_camera->set_pressed(false);
- if (!preview) {
- preview_camera->hide();
- } else {
- preview_camera->show();
- }
- view_menu->show();
- surface->update();
- }
-}
-
-void SpatialEditorViewport::_selection_result_pressed(int p_result) {
-
- if (selection_results.size() <= p_result)
- return;
-
- clicked = selection_results[p_result].item->get_instance_id();
-
- if (clicked) {
- _select_clicked(clicked_wants_append, true);
- clicked = 0;
- }
-}
-
-void SpatialEditorViewport::_selection_menu_hide() {
-
- selection_results.clear();
- selection_menu->clear();
- selection_menu->set_size(Vector2(0, 0));
-}
-
-void SpatialEditorViewport::set_can_preview(Camera *p_preview) {
-
- preview = p_preview;
-
- if (!preview_camera->is_pressed() && !previewing_cinema)
- preview_camera->set_visible(p_preview);
-}
-
-void SpatialEditorViewport::update_transform_gizmo_view() {
-
- if (!is_visible_in_tree())
- return;
-
- Transform xform = spatial_editor->get_gizmo_transform();
-
- Transform camera_xform = camera->get_transform();
-
- if (xform.origin.distance_squared_to(camera_xform.origin) < 0.01) {
- for (int i = 0; i < 3; i++) {
- VisualServer::get_singleton()->instance_set_visible(move_gizmo_instance[i], false);
- VisualServer::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false);
- VisualServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false);
- VisualServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false);
- VisualServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false);
- }
- return;
- }
-
- Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized();
- Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized();
- Plane p(camera_xform.origin, camz);
- float gizmo_d = Math::abs(p.distance_to(xform.origin));
- float d0 = camera->unproject_position(camera_xform.origin + camz * gizmo_d).y;
- float d1 = camera->unproject_position(camera_xform.origin + camz * gizmo_d + camy).y;
- float dd = Math::abs(d0 - d1);
- if (dd == 0)
- dd = 0.0001;
-
- float gizmo_size = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_size");
- // At low viewport heights, multiply the gizmo scale based on the viewport height.
- // This prevents the gizmo from growing very large and going outside the viewport.
- const int viewport_base_height = 400 * MAX(1, EDSCALE);
- gizmo_scale =
- (gizmo_size / Math::abs(dd)) * MAX(1, EDSCALE) *
- MIN(viewport_base_height, viewport_container->get_size().height) / viewport_base_height /
- viewport_container->get_stretch_shrink();
- Vector3 scale = Vector3(1, 1, 1) * gizmo_scale;
-
- xform.basis.scale(scale);
-
- for (int i = 0; i < 3; i++) {
- VisualServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], xform);
- VisualServer::get_singleton()->instance_set_visible(move_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_MOVE));
- VisualServer::get_singleton()->instance_set_transform(move_plane_gizmo_instance[i], xform);
- VisualServer::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_MOVE));
- VisualServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[i], xform);
- VisualServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_ROTATE));
- VisualServer::get_singleton()->instance_set_transform(scale_gizmo_instance[i], xform);
- VisualServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SCALE));
- VisualServer::get_singleton()->instance_set_transform(scale_plane_gizmo_instance[i], xform);
- VisualServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == SpatialEditor::TOOL_MODE_SCALE));
- }
-}
-
-void SpatialEditorViewport::set_state(const Dictionary &p_state) {
-
- if (p_state.has("position"))
- cursor.pos = p_state["position"];
- if (p_state.has("x_rotation"))
- cursor.x_rot = p_state["x_rotation"];
- if (p_state.has("y_rotation"))
- cursor.y_rot = p_state["y_rotation"];
- if (p_state.has("distance"))
- cursor.distance = p_state["distance"];
-
- if (p_state.has("use_orthogonal")) {
- bool orth = p_state["use_orthogonal"];
-
- if (orth)
- _menu_option(VIEW_ORTHOGONAL);
- else
- _menu_option(VIEW_PERSPECTIVE);
- }
- if (p_state.has("display_mode")) {
- int display = p_state["display_mode"];
-
- int idx = view_menu->get_popup()->get_item_index(display);
- if (!view_menu->get_popup()->is_item_checked(idx))
- _menu_option(display);
- }
- if (p_state.has("lock_rotation")) {
- lock_rotation = p_state["lock_rotation"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_LOCK_ROTATION);
- view_menu->get_popup()->set_item_checked(idx, lock_rotation);
- }
- if (p_state.has("use_environment")) {
- bool env = p_state["use_environment"];
-
- if (env != camera->get_environment().is_valid())
- _menu_option(VIEW_ENVIRONMENT);
- }
- if (p_state.has("listener")) {
- bool listener = p_state["listener"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER);
- viewport->set_as_audio_listener(listener);
- view_menu->get_popup()->set_item_checked(idx, listener);
- }
- if (p_state.has("doppler")) {
- bool doppler = p_state["doppler"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER);
- camera->set_doppler_tracking(doppler ? Camera::DOPPLER_TRACKING_IDLE_STEP : Camera::DOPPLER_TRACKING_DISABLED);
- view_menu->get_popup()->set_item_checked(idx, doppler);
- }
- if (p_state.has("gizmos")) {
- bool gizmos = p_state["gizmos"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS);
- if (view_menu->get_popup()->is_item_checked(idx) != gizmos)
- _menu_option(VIEW_GIZMOS);
- }
- if (p_state.has("information")) {
- bool information = p_state["information"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_INFORMATION);
- if (view_menu->get_popup()->is_item_checked(idx) != information)
- _menu_option(VIEW_INFORMATION);
- }
- if (p_state.has("fps")) {
- bool fps = p_state["fps"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_FPS);
- if (view_menu->get_popup()->is_item_checked(idx) != fps)
- _menu_option(VIEW_FPS);
- }
- if (p_state.has("half_res")) {
- bool half_res = p_state["half_res"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION);
- view_menu->get_popup()->set_item_checked(idx, half_res);
- }
- if (p_state.has("cinematic_preview")) {
- previewing_cinema = p_state["cinematic_preview"];
-
- int idx = view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
- view_menu->get_popup()->set_item_checked(idx, previewing_cinema);
- }
-
- if (preview_camera->is_connected("toggled", this, "_toggle_camera_preview")) {
- preview_camera->disconnect("toggled", this, "_toggle_camera_preview");
- }
- if (p_state.has("previewing")) {
- Node *pv = EditorNode::get_singleton()->get_edited_scene()->get_node(p_state["previewing"]);
- if (Object::cast_to<Camera>(pv)) {
- previewing = Object::cast_to<Camera>(pv);
- previewing->connect("tree_exiting", this, "_preview_exited_scene");
- VS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace
- view_menu->set_disabled(true);
- surface->update();
- preview_camera->set_pressed(true);
- preview_camera->show();
- }
- }
- preview_camera->connect("toggled", this, "_toggle_camera_preview");
-}
-
-Dictionary SpatialEditorViewport::get_state() const {
-
- Dictionary d;
- d["position"] = cursor.pos;
- d["x_rotation"] = cursor.x_rot;
- d["y_rotation"] = cursor.y_rot;
- d["distance"] = cursor.distance;
- d["use_environment"] = camera->get_environment().is_valid();
- d["use_orthogonal"] = camera->get_projection() == Camera::PROJECTION_ORTHOGONAL;
- if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL)))
- d["display_mode"] = VIEW_DISPLAY_NORMAL;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME)))
- d["display_mode"] = VIEW_DISPLAY_WIREFRAME;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW)))
- d["display_mode"] = VIEW_DISPLAY_OVERDRAW;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS)))
- d["display_mode"] = VIEW_DISPLAY_SHADELESS;
- d["listener"] = viewport->is_audio_listener();
- d["doppler"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER));
- d["gizmos"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS));
- d["information"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION));
- d["fps"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FPS));
- d["half_res"] = viewport_container->get_stretch_shrink() > 1;
- d["cinematic_preview"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
- if (previewing)
- d["previewing"] = EditorNode::get_singleton()->get_edited_scene()->get_path_to(previewing);
- if (lock_rotation)
- d["lock_rotation"] = lock_rotation;
-
- return d;
-}
-
-void SpatialEditorViewport::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_draw"), &SpatialEditorViewport::_draw);
-
- ClassDB::bind_method(D_METHOD("_surface_mouse_enter"), &SpatialEditorViewport::_surface_mouse_enter);
- ClassDB::bind_method(D_METHOD("_surface_mouse_exit"), &SpatialEditorViewport::_surface_mouse_exit);
- ClassDB::bind_method(D_METHOD("_surface_focus_enter"), &SpatialEditorViewport::_surface_focus_enter);
- ClassDB::bind_method(D_METHOD("_surface_focus_exit"), &SpatialEditorViewport::_surface_focus_exit);
- ClassDB::bind_method(D_METHOD("_sinput"), &SpatialEditorViewport::_sinput);
- ClassDB::bind_method(D_METHOD("_menu_option"), &SpatialEditorViewport::_menu_option);
- ClassDB::bind_method(D_METHOD("_toggle_camera_preview"), &SpatialEditorViewport::_toggle_camera_preview);
- ClassDB::bind_method(D_METHOD("_preview_exited_scene"), &SpatialEditorViewport::_preview_exited_scene);
- ClassDB::bind_method(D_METHOD("update_transform_gizmo_view"), &SpatialEditorViewport::update_transform_gizmo_view);
- ClassDB::bind_method(D_METHOD("_selection_result_pressed"), &SpatialEditorViewport::_selection_result_pressed);
- ClassDB::bind_method(D_METHOD("_selection_menu_hide"), &SpatialEditorViewport::_selection_menu_hide);
- ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &SpatialEditorViewport::can_drop_data_fw);
- ClassDB::bind_method(D_METHOD("drop_data_fw"), &SpatialEditorViewport::drop_data_fw);
-
- ADD_SIGNAL(MethodInfo("toggle_maximize_view", PropertyInfo(Variant::OBJECT, "viewport")));
- ADD_SIGNAL(MethodInfo("clicked", PropertyInfo(Variant::OBJECT, "viewport")));
-}
-
-void SpatialEditorViewport::reset() {
-
- orthogonal = false;
- lock_rotation = false;
- message_time = 0;
- message = "";
- last_message = "";
- name = "";
-
- cursor.x_rot = 0.5;
- cursor.y_rot = 0.5;
- cursor.distance = 4;
- cursor.region_select = false;
- cursor.pos = Vector3();
- _update_name();
-}
-
-void SpatialEditorViewport::focus_selection() {
- if (!get_selected_count())
- return;
-
- Vector3 center;
- int count = 0;
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- center += sp->get_global_gizmo_transform().origin;
- count++;
- }
-
- if (count != 0) {
- center /= float(count);
- }
-
- cursor.pos = center;
-}
-
-void SpatialEditorViewport::assign_pending_data_pointers(Spatial *p_preview_node, AABB *p_preview_bounds, AcceptDialog *p_accept) {
- preview_node = p_preview_node;
- preview_bounds = p_preview_bounds;
- accept = p_accept;
-}
-
-Vector3 SpatialEditorViewport::_get_instance_position(const Point2 &p_pos) const {
- const float MAX_DISTANCE = 10;
-
- Vector3 world_ray = _get_ray(p_pos);
- Vector3 world_pos = _get_ray_pos(p_pos);
-
- Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_ray(world_pos, world_ray, get_tree()->get_root()->get_world()->get_scenario());
- Set<Ref<EditorSpatialGizmo> > found_gizmos;
-
- float closest_dist = MAX_DISTANCE;
-
- Vector3 point = world_pos + world_ray * MAX_DISTANCE;
- Vector3 normal = Vector3(0.0, 0.0, 0.0);
-
- for (int i = 0; i < instances.size(); i++) {
-
- MeshInstance *mesh_instance = Object::cast_to<MeshInstance>(ObjectDB::get_instance(instances[i]));
-
- if (!mesh_instance)
- continue;
-
- Ref<EditorSpatialGizmo> seg = mesh_instance->get_gizmo();
-
- if ((!seg.is_valid()) || found_gizmos.has(seg)) {
- continue;
- }
-
- found_gizmos.insert(seg);
-
- Vector3 hit_point;
- Vector3 hit_normal;
- bool inters = seg->intersect_ray(camera, p_pos, hit_point, hit_normal, NULL, false);
-
- if (!inters)
- continue;
-
- float dist = world_pos.distance_to(hit_point);
-
- if (dist < 0)
- continue;
-
- if (dist < closest_dist) {
- closest_dist = dist;
- point = hit_point;
- normal = hit_normal;
- }
- }
- Vector3 offset = Vector3();
- for (int i = 0; i < 3; i++) {
- if (normal[i] > 0.0)
- offset[i] = (preview_bounds->get_size()[i] - (preview_bounds->get_size()[i] + preview_bounds->get_position()[i]));
- else if (normal[i] < 0.0)
- offset[i] = -(preview_bounds->get_size()[i] + preview_bounds->get_position()[i]);
- }
- return point + offset;
-}
-
-AABB SpatialEditorViewport::_calculate_spatial_bounds(const Spatial *p_parent, bool p_exclude_toplevel_transform) {
- AABB bounds;
-
- const MeshInstance *mesh_instance = Object::cast_to<MeshInstance>(p_parent);
- if (mesh_instance) {
- bounds = mesh_instance->get_aabb();
- }
-
- for (int i = 0; i < p_parent->get_child_count(); i++) {
- Spatial *child = Object::cast_to<Spatial>(p_parent->get_child(i));
- if (child) {
- AABB child_bounds = _calculate_spatial_bounds(child, false);
-
- if (bounds.size == Vector3() && p_parent->get_class_name() == StringName("Spatial")) {
- bounds = child_bounds;
- } else {
- bounds.merge_with(child_bounds);
- }
- }
- }
-
- if (bounds.size == Vector3() && p_parent->get_class_name() != StringName("Spatial")) {
- bounds = AABB(Vector3(-0.2, -0.2, -0.2), Vector3(0.4, 0.4, 0.4));
- }
-
- if (!p_exclude_toplevel_transform) {
- bounds = p_parent->get_transform().xform(bounds);
- }
-
- return bounds;
-}
-
-void SpatialEditorViewport::_create_preview(const Vector<String> &files) const {
- for (int i = 0; i < files.size(); i++) {
- String path = files[i];
- RES res = ResourceLoader::load(path);
- ERR_CONTINUE(res.is_null());
- Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
- Ref<Mesh> mesh = Ref<Mesh>(Object::cast_to<Mesh>(*res));
- if (mesh != NULL || scene != NULL) {
- if (mesh != NULL) {
- MeshInstance *mesh_instance = memnew(MeshInstance);
- mesh_instance->set_mesh(mesh);
- preview_node->add_child(mesh_instance);
- } else {
- if (scene.is_valid()) {
- Node *instance = scene->instance();
- if (instance) {
- preview_node->add_child(instance);
- }
- }
- }
- editor->get_scene_root()->add_child(preview_node);
- }
- }
- *preview_bounds = _calculate_spatial_bounds(preview_node);
-}
-
-void SpatialEditorViewport::_remove_preview() {
- if (preview_node->get_parent()) {
- for (int i = preview_node->get_child_count() - 1; i >= 0; i--) {
- Node *node = preview_node->get_child(i);
- node->queue_delete();
- preview_node->remove_child(node);
- }
- editor->get_scene_root()->remove_child(preview_node);
- }
-}
-
-bool SpatialEditorViewport::_cyclical_dependency_exists(const String &p_target_scene_path, Node *p_desired_node) {
- if (p_desired_node->get_filename() == p_target_scene_path) {
- return true;
- }
-
- int childCount = p_desired_node->get_child_count();
- for (int i = 0; i < childCount; i++) {
- Node *child = p_desired_node->get_child(i);
- if (_cyclical_dependency_exists(p_target_scene_path, child)) {
- return true;
- }
- }
- return false;
-}
-
-bool SpatialEditorViewport::_create_instance(Node *parent, String &path, const Point2 &p_point) {
- RES res = ResourceLoader::load(path);
- ERR_FAIL_COND_V(res.is_null(), false);
-
- Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
- Ref<Mesh> mesh = Ref<Mesh>(Object::cast_to<Mesh>(*res));
-
- Node *instanced_scene = NULL;
-
- if (mesh != NULL || scene != NULL) {
- if (mesh != NULL) {
- MeshInstance *mesh_instance = memnew(MeshInstance);
- mesh_instance->set_mesh(mesh);
- mesh_instance->set_name(path.get_file().get_basename());
- instanced_scene = mesh_instance;
- } else {
- if (!scene.is_valid()) { // invalid scene
- return false;
- } else {
- instanced_scene = scene->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
- }
- }
- }
-
- if (instanced_scene == NULL) {
- return false;
- }
-
- if (editor->get_edited_scene()->get_filename() != "") { // cyclical instancing
- if (_cyclical_dependency_exists(editor->get_edited_scene()->get_filename(), instanced_scene)) {
- memdelete(instanced_scene);
- return false;
- }
- }
-
- if (scene != NULL) {
- instanced_scene->set_filename(ProjectSettings::get_singleton()->localize_path(path));
- }
-
- editor_data->get_undo_redo().add_do_method(parent, "add_child", instanced_scene);
- editor_data->get_undo_redo().add_do_method(instanced_scene, "set_owner", editor->get_edited_scene());
- editor_data->get_undo_redo().add_do_reference(instanced_scene);
- editor_data->get_undo_redo().add_undo_method(parent, "remove_child", instanced_scene);
-
- String new_name = parent->validate_child_name(instanced_scene);
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_instance_node", editor->get_edited_scene()->get_path_to(parent), path, new_name);
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name));
-
- Transform global_transform;
- Spatial *parent_spatial = Object::cast_to<Spatial>(parent);
- if (parent_spatial)
- global_transform = parent_spatial->get_global_gizmo_transform();
-
- global_transform.origin = spatial_editor->snap_point(_get_instance_position(p_point));
-
- editor_data->get_undo_redo().add_do_method(instanced_scene, "set_global_transform", global_transform);
-
- return true;
-}
-
-void SpatialEditorViewport::_perform_drop_data() {
- _remove_preview();
-
- Vector<String> error_files;
-
- editor_data->get_undo_redo().create_action(TTR("Create Node"));
-
- for (int i = 0; i < selected_files.size(); i++) {
- String path = selected_files[i];
- RES res = ResourceLoader::load(path);
- if (res.is_null()) {
- continue;
- }
- Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
- Ref<Mesh> mesh = Ref<Mesh>(Object::cast_to<Mesh>(*res));
- if (mesh != NULL || scene != NULL) {
- bool success = _create_instance(target_node, path, drop_pos);
- if (!success) {
- error_files.push_back(path);
- }
- }
- }
-
- editor_data->get_undo_redo().commit_action();
-
- if (error_files.size() > 0) {
- String files_str;
- for (int i = 0; i < error_files.size(); i++) {
- files_str += error_files[i].get_file().get_basename() + ",";
- }
- files_str = files_str.substr(0, files_str.length() - 1);
- accept->set_text(vformat(TTR("Error instancing scene from %s"), files_str.c_str()));
- accept->popup_centered_minsize();
- }
-}
-
-bool SpatialEditorViewport::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
- bool can_instance = false;
-
- if (!preview_node->is_inside_tree()) {
- Dictionary d = p_data;
- if (d.has("type") && (String(d["type"]) == "files")) {
- Vector<String> files = d["files"];
-
- List<String> scene_extensions;
- ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions);
- List<String> mesh_extensions;
- ResourceLoader::get_recognized_extensions_for_type("Mesh", &mesh_extensions);
-
- for (int i = 0; i < files.size(); i++) {
- if (mesh_extensions.find(files[i].get_extension()) || scene_extensions.find(files[i].get_extension())) {
- RES res = ResourceLoader::load(files[i]);
- if (res.is_null()) {
- continue;
- }
-
- String type = res->get_class();
- if (type == "PackedScene") {
- Ref<PackedScene> sdata = ResourceLoader::load(files[i]);
- Node *instanced_scene = sdata->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
- if (!instanced_scene) {
- continue;
- }
- memdelete(instanced_scene);
- } else if (type == "Mesh" || type == "ArrayMesh" || type == "PrimitiveMesh") {
- Ref<Mesh> mesh = ResourceLoader::load(files[i]);
- if (!mesh.is_valid()) {
- continue;
- }
- } else {
- continue;
- }
- can_instance = true;
- break;
- }
- }
- if (can_instance) {
- _create_preview(files);
- }
- }
- } else {
- can_instance = true;
- }
-
- if (can_instance) {
- Transform global_transform = Transform(Basis(), _get_instance_position(p_point));
- preview_node->set_global_transform(global_transform);
- }
-
- return can_instance;
-}
-
-void SpatialEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
- if (!can_drop_data_fw(p_point, p_data, p_from))
- return;
-
- bool is_shift = Input::get_singleton()->is_key_pressed(KEY_SHIFT);
-
- selected_files.clear();
- Dictionary d = p_data;
- if (d.has("type") && String(d["type"]) == "files") {
- selected_files = d["files"];
- }
-
- List<Node *> list = editor->get_editor_selection()->get_selected_node_list();
- if (list.size() == 0) {
- Node *root_node = editor->get_edited_scene();
- if (root_node) {
- list.push_back(root_node);
- } else {
- accept->set_text(TTR("No parent to instance a child at."));
- accept->popup_centered_minsize();
- _remove_preview();
- return;
- }
- }
- if (list.size() != 1) {
- accept->set_text(TTR("This operation requires a single selected node."));
- accept->popup_centered_minsize();
- _remove_preview();
- return;
- }
-
- target_node = list[0];
- if (is_shift && target_node != editor->get_edited_scene()) {
- target_node = target_node->get_parent();
- }
- drop_pos = p_point;
-
- _perform_drop_data();
-}
-
-SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, EditorNode *p_editor, int p_index) {
-
- _edit.mode = TRANSFORM_NONE;
- _edit.plane = TRANSFORM_VIEW;
- _edit.edited_gizmo = 0;
- _edit.snap = 1;
- _edit.gizmo_handle = 0;
-
- index = p_index;
- editor = p_editor;
- editor_data = editor->get_scene_tree_dock()->get_editor_data();
- editor_selection = editor->get_editor_selection();
- undo_redo = editor->get_undo_redo();
- clicked = 0;
- clicked_includes_current = false;
- orthogonal = false;
- lock_rotation = false;
- message_time = 0;
- zoom_indicator_delay = 0.0;
-
- spatial_editor = p_spatial_editor;
- ViewportContainer *c = memnew(ViewportContainer);
- viewport_container = c;
- c->set_stretch(true);
- add_child(c);
- c->set_anchors_and_margins_preset(Control::PRESET_WIDE);
- viewport = memnew(Viewport);
- viewport->set_disable_input(true);
-
- c->add_child(viewport);
- surface = memnew(Control);
- surface->set_drag_forwarding(this);
- add_child(surface);
- surface->set_anchors_and_margins_preset(Control::PRESET_WIDE);
- surface->set_clip_contents(true);
- camera = memnew(Camera);
- camera->set_disable_gizmo(true);
- camera->set_cull_mask(((1 << 20) - 1) | (1 << (GIZMO_BASE_LAYER + p_index)) | (1 << GIZMO_EDIT_LAYER) | (1 << GIZMO_GRID_LAYER));
- viewport->add_child(camera);
- camera->make_current();
- surface->set_focus_mode(FOCUS_ALL);
-
- crosshair = memnew(TextureRect);
- crosshair->set_mouse_filter(MOUSE_FILTER_IGNORE);
- surface->add_child(crosshair);
-
- VBoxContainer *vbox = memnew(VBoxContainer);
- surface->add_child(vbox);
- vbox->set_position(Point2(10, 10) * EDSCALE);
-
- view_menu = memnew(MenuButton);
- view_menu->set_flat(false);
- vbox->add_child(view_menu);
- view_menu->set_h_size_flags(0);
-
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/top_view"), VIEW_TOP);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/bottom_view"), VIEW_BOTTOM);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/left_view"), VIEW_LEFT);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/right_view"), VIEW_RIGHT);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/front_view"), VIEW_FRONT);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/rear_view"), VIEW_REAR);
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_radio_check_item(TTR("Perspective") + " (" + ED_GET_SHORTCUT("spatial_editor/switch_perspective_orthogonal")->get_as_text() + ")", VIEW_PERSPECTIVE);
- view_menu->get_popup()->add_radio_check_item(TTR("Orthogonal") + " (" + ED_GET_SHORTCUT("spatial_editor/switch_perspective_orthogonal")->get_as_text() + ")", VIEW_ORTHOGONAL);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), true);
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_lock_rotation", TTR("Lock View Rotation")), VIEW_LOCK_ROTATION);
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_normal", TTR("Display Normal")), VIEW_DISPLAY_NORMAL);
- view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_wireframe", TTR("Display Wireframe")), VIEW_DISPLAY_WIREFRAME);
- view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_overdraw", TTR("Display Overdraw")), VIEW_DISPLAY_OVERDRAW);
- view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_unshaded", TTR("Display Unshaded")), VIEW_DISPLAY_SHADELESS);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL), true);
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_environment", TTR("View Environment")), VIEW_ENVIRONMENT);
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_gizmos", TTR("View Gizmos")), VIEW_GIZMOS);
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_information", TTR("View Information")), VIEW_INFORMATION);
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_fps", TTR("View FPS")), VIEW_FPS);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT), true);
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_half_resolution", TTR("Half Resolution")), VIEW_HALF_RESOLUTION);
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_listener", TTR("Audio Listener")), VIEW_AUDIO_LISTENER);
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_audio_doppler", TTR("Enable Doppler")), VIEW_AUDIO_DOPPLER);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS), true);
-
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_cinematic_preview", TTR("Cinematic Preview")), VIEW_CINEMATIC_PREVIEW);
-
- view_menu->get_popup()->add_separator();
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_origin"), VIEW_CENTER_TO_ORIGIN);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_selection"), VIEW_CENTER_TO_SELECTION);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_transform_with_view"), VIEW_ALIGN_TRANSFORM_WITH_VIEW);
- view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_rotation_with_view"), VIEW_ALIGN_ROTATION_WITH_VIEW);
- view_menu->get_popup()->connect("id_pressed", this, "_menu_option");
-
- view_menu->set_disable_shortcuts(true);
-
- if (OS::get_singleton()->get_current_video_driver() == OS::VIDEO_DRIVER_GLES2) {
- // Alternate display modes only work when using the GLES3 renderer; make this explicit.
- const int normal_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL);
- const int wireframe_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME);
- const int overdraw_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW);
- const int shadeless_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS);
- const String unsupported_tooltip = TTR("Not available when using the GLES2 renderer.");
-
- view_menu->get_popup()->set_item_disabled(normal_idx, true);
- view_menu->get_popup()->set_item_tooltip(normal_idx, unsupported_tooltip);
- view_menu->get_popup()->set_item_disabled(wireframe_idx, true);
- view_menu->get_popup()->set_item_tooltip(wireframe_idx, unsupported_tooltip);
- view_menu->get_popup()->set_item_disabled(overdraw_idx, true);
- view_menu->get_popup()->set_item_tooltip(overdraw_idx, unsupported_tooltip);
- view_menu->get_popup()->set_item_disabled(shadeless_idx, true);
- view_menu->get_popup()->set_item_tooltip(shadeless_idx, unsupported_tooltip);
- }
-
- ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), KEY_A);
- ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), KEY_D);
- ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), KEY_W);
- ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), KEY_S);
- ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), KEY_E);
- ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), KEY_Q);
- ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), KEY_SHIFT);
- ED_SHORTCUT("spatial_editor/freelook_slow_modifier", TTR("Freelook Slow Modifier"), KEY_ALT);
-
- preview_camera = memnew(CheckBox);
- preview_camera->set_text(TTR("Preview"));
- vbox->add_child(preview_camera);
- preview_camera->set_h_size_flags(0);
- preview_camera->hide();
- preview_camera->connect("toggled", this, "_toggle_camera_preview");
- previewing = NULL;
- gizmo_scale = 1.0;
-
- preview_node = NULL;
-
- info_label = memnew(Label);
- info_label->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, -90 * EDSCALE);
- info_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_END, -90 * EDSCALE);
- info_label->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE);
- info_label->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -10 * EDSCALE);
- info_label->set_h_grow_direction(GROW_DIRECTION_BEGIN);
- info_label->set_v_grow_direction(GROW_DIRECTION_BEGIN);
- surface->add_child(info_label);
- info_label->hide();
-
- fps_label = memnew(Label);
- fps_label->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, -90 * EDSCALE);
- fps_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE);
- fps_label->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE);
- fps_label->set_h_grow_direction(GROW_DIRECTION_BEGIN);
- fps_label->set_tooltip(TTR("Note: The FPS value displayed is the editor's framerate.\nIt cannot be used as a reliable indication of in-game performance."));
- fps_label->set_mouse_filter(MOUSE_FILTER_PASS); // Otherwise tooltip doesn't show.
- surface->add_child(fps_label);
- fps_label->hide();
-
- cinema_label = memnew(Label);
- cinema_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE);
- cinema_label->set_h_grow_direction(GROW_DIRECTION_END);
- cinema_label->set_align(Label::ALIGN_CENTER);
- surface->add_child(cinema_label);
- cinema_label->set_text(TTR("Cinematic Preview"));
- cinema_label->hide();
- previewing_cinema = false;
-
- locked_label = memnew(Label);
- locked_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_END, -20 * EDSCALE);
- locked_label->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -10 * EDSCALE);
- locked_label->set_h_grow_direction(GROW_DIRECTION_END);
- locked_label->set_v_grow_direction(GROW_DIRECTION_BEGIN);
- locked_label->set_align(Label::ALIGN_CENTER);
- surface->add_child(locked_label);
- locked_label->set_text(TTR("View Rotation Locked"));
- locked_label->hide();
-
- accept = NULL;
-
- freelook_active = false;
- freelook_speed = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_base_speed");
-
- selection_menu = memnew(PopupMenu);
- add_child(selection_menu);
- selection_menu->set_custom_minimum_size(Size2(100, 0) * EDSCALE);
- selection_menu->connect("id_pressed", this, "_selection_result_pressed");
- selection_menu->connect("popup_hide", this, "_selection_menu_hide");
-
- if (p_index == 0) {
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_LISTENER), true);
- viewport->set_as_audio_listener(true);
- }
-
- name = "";
- _update_name();
-
- EditorSettings::get_singleton()->connect("settings_changed", this, "update_transform_gizmo_view");
-}
-
-//////////////////////////////////////////////////////////////
-
-void SpatialEditorViewportContainer::_gui_input(const Ref<InputEvent> &p_event) {
-
- Ref<InputEventMouseButton> mb = p_event;
-
- if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) {
-
- if (mb->is_pressed()) {
- Vector2 size = get_size();
-
- int h_sep = get_constant("separation", "HSplitContainer");
- int v_sep = get_constant("separation", "VSplitContainer");
-
- int mid_w = size.width * ratio_h;
- int mid_h = size.height * ratio_v;
-
- dragging_h = mb->get_position().x > (mid_w - h_sep / 2) && mb->get_position().x < (mid_w + h_sep / 2);
- dragging_v = mb->get_position().y > (mid_h - v_sep / 2) && mb->get_position().y < (mid_h + v_sep / 2);
-
- drag_begin_pos = mb->get_position();
- drag_begin_ratio.x = ratio_h;
- drag_begin_ratio.y = ratio_v;
-
- switch (view) {
- case VIEW_USE_1_VIEWPORT: {
-
- dragging_h = false;
- dragging_v = false;
-
- } break;
- case VIEW_USE_2_VIEWPORTS: {
-
- dragging_h = false;
-
- } break;
- case VIEW_USE_2_VIEWPORTS_ALT: {
-
- dragging_v = false;
-
- } break;
- case VIEW_USE_3_VIEWPORTS:
- case VIEW_USE_3_VIEWPORTS_ALT:
- case VIEW_USE_4_VIEWPORTS: {
-
- // Do nothing.
-
- } break;
- }
- } else {
- dragging_h = false;
- dragging_v = false;
- }
- }
-
- Ref<InputEventMouseMotion> mm = p_event;
-
- if (mm.is_valid()) {
-
- if (view == VIEW_USE_3_VIEWPORTS || view == VIEW_USE_3_VIEWPORTS_ALT || view == VIEW_USE_4_VIEWPORTS) {
- Vector2 size = get_size();
-
- int h_sep = get_constant("separation", "HSplitContainer");
- int v_sep = get_constant("separation", "VSplitContainer");
-
- int mid_w = size.width * ratio_h;
- int mid_h = size.height * ratio_v;
-
- bool was_hovering_h = hovering_h;
- bool was_hovering_v = hovering_v;
- hovering_h = mm->get_position().x > (mid_w - h_sep / 2) && mm->get_position().x < (mid_w + h_sep / 2);
- hovering_v = mm->get_position().y > (mid_h - v_sep / 2) && mm->get_position().y < (mid_h + v_sep / 2);
-
- if (was_hovering_h != hovering_h || was_hovering_v != hovering_v) {
- update();
- }
- }
-
- if (dragging_h) {
- float new_ratio = drag_begin_ratio.x + (mm->get_position().x - drag_begin_pos.x) / get_size().width;
- new_ratio = CLAMP(new_ratio, 40 / get_size().width, (get_size().width - 40) / get_size().width);
- ratio_h = new_ratio;
- queue_sort();
- update();
- }
- if (dragging_v) {
- float new_ratio = drag_begin_ratio.y + (mm->get_position().y - drag_begin_pos.y) / get_size().height;
- new_ratio = CLAMP(new_ratio, 40 / get_size().height, (get_size().height - 40) / get_size().height);
- ratio_v = new_ratio;
- queue_sort();
- update();
- }
- }
-}
-
-void SpatialEditorViewportContainer::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_MOUSE_ENTER || p_what == NOTIFICATION_MOUSE_EXIT) {
-
- mouseover = (p_what == NOTIFICATION_MOUSE_ENTER);
- update();
- }
-
- if (p_what == NOTIFICATION_DRAW && mouseover) {
-
- Ref<Texture> h_grabber = get_icon("grabber", "HSplitContainer");
- Ref<Texture> v_grabber = get_icon("grabber", "VSplitContainer");
-
- Ref<Texture> hdiag_grabber = get_icon("GuiViewportHdiagsplitter", "EditorIcons");
- Ref<Texture> vdiag_grabber = get_icon("GuiViewportVdiagsplitter", "EditorIcons");
- Ref<Texture> vh_grabber = get_icon("GuiViewportVhsplitter", "EditorIcons");
-
- Vector2 size = get_size();
-
- int h_sep = get_constant("separation", "HSplitContainer");
-
- int v_sep = get_constant("separation", "VSplitContainer");
-
- int mid_w = size.width * ratio_h;
- int mid_h = size.height * ratio_v;
-
- int size_left = mid_w - h_sep / 2;
- int size_bottom = size.height - mid_h - v_sep / 2;
-
- switch (view) {
-
- case VIEW_USE_1_VIEWPORT: {
-
- // Nothing to show.
-
- } break;
- case VIEW_USE_2_VIEWPORTS: {
-
- draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
- set_default_cursor_shape(CURSOR_VSPLIT);
-
- } break;
- case VIEW_USE_2_VIEWPORTS_ALT: {
-
- draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2));
- set_default_cursor_shape(CURSOR_HSPLIT);
-
- } break;
- case VIEW_USE_3_VIEWPORTS: {
-
- if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
- draw_texture(hdiag_grabber, Vector2(mid_w - hdiag_grabber->get_width() / 2, mid_h - v_grabber->get_height() / 4));
- set_default_cursor_shape(CURSOR_DRAG);
- } else if ((hovering_v && !dragging_h) || dragging_v) {
- draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
- set_default_cursor_shape(CURSOR_VSPLIT);
- } else if (hovering_h || dragging_h) {
- draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2));
- set_default_cursor_shape(CURSOR_HSPLIT);
- }
-
- } break;
- case VIEW_USE_3_VIEWPORTS_ALT: {
-
- if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
- draw_texture(vdiag_grabber, Vector2(mid_w - vdiag_grabber->get_width() + v_grabber->get_height() / 4, mid_h - vdiag_grabber->get_height() / 2));
- set_default_cursor_shape(CURSOR_DRAG);
- } else if ((hovering_v && !dragging_h) || dragging_v) {
- draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
- set_default_cursor_shape(CURSOR_VSPLIT);
- } else if (hovering_h || dragging_h) {
- draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2));
- set_default_cursor_shape(CURSOR_HSPLIT);
- }
-
- } break;
- case VIEW_USE_4_VIEWPORTS: {
-
- Vector2 half(mid_w, mid_h);
- if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
- draw_texture(vh_grabber, half - vh_grabber->get_size() / 2.0);
- set_default_cursor_shape(CURSOR_DRAG);
- } else if ((hovering_v && !dragging_h) || dragging_v) {
- draw_texture(v_grabber, half - v_grabber->get_size() / 2.0);
- set_default_cursor_shape(CURSOR_VSPLIT);
- } else if (hovering_h || dragging_h) {
- draw_texture(h_grabber, half - h_grabber->get_size() / 2.0);
- set_default_cursor_shape(CURSOR_HSPLIT);
- }
-
- } break;
- }
- }
-
- if (p_what == NOTIFICATION_SORT_CHILDREN) {
-
- SpatialEditorViewport *viewports[4];
- int vc = 0;
- for (int i = 0; i < get_child_count(); i++) {
- viewports[vc] = Object::cast_to<SpatialEditorViewport>(get_child(i));
- if (viewports[vc]) {
- vc++;
- }
- }
-
- ERR_FAIL_COND(vc != 4);
-
- Size2 size = get_size();
-
- if (size.x < 10 || size.y < 10) {
- for (int i = 0; i < 4; i++) {
- viewports[i]->hide();
- }
- return;
- }
- int h_sep = get_constant("separation", "HSplitContainer");
-
- int v_sep = get_constant("separation", "VSplitContainer");
-
- int mid_w = size.width * ratio_h;
- int mid_h = size.height * ratio_v;
-
- int size_left = mid_w - h_sep / 2;
- int size_right = size.width - mid_w - h_sep / 2;
-
- int size_top = mid_h - v_sep / 2;
- int size_bottom = size.height - mid_h - v_sep / 2;
-
- switch (view) {
-
- case VIEW_USE_1_VIEWPORT: {
-
- viewports[0]->show();
- for (int i = 1; i < 4; i++) {
-
- viewports[i]->hide();
- }
-
- fit_child_in_rect(viewports[0], Rect2(Vector2(), size));
-
- } break;
- case VIEW_USE_2_VIEWPORTS: {
-
- for (int i = 0; i < 4; i++) {
-
- if (i == 1 || i == 3)
- viewports[i]->hide();
- else
- viewports[i]->show();
- }
-
- fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top)));
- fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size.width, size_bottom)));
-
- } break;
- case VIEW_USE_2_VIEWPORTS_ALT: {
-
- for (int i = 0; i < 4; i++) {
-
- if (i == 1 || i == 3)
- viewports[i]->hide();
- else
- viewports[i]->show();
- }
- fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size.height)));
- fit_child_in_rect(viewports[2], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height)));
-
- } break;
- case VIEW_USE_3_VIEWPORTS: {
-
- for (int i = 0; i < 4; i++) {
-
- if (i == 1)
- viewports[i]->hide();
- else
- viewports[i]->show();
- }
-
- fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top)));
- fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom)));
- fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom)));
-
- } break;
- case VIEW_USE_3_VIEWPORTS_ALT: {
-
- for (int i = 0; i < 4; i++) {
-
- if (i == 1)
- viewports[i]->hide();
- else
- viewports[i]->show();
- }
-
- fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top)));
- fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom)));
- fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height)));
-
- } break;
- case VIEW_USE_4_VIEWPORTS: {
-
- for (int i = 0; i < 4; i++) {
-
- viewports[i]->show();
- }
-
- fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top)));
- fit_child_in_rect(viewports[1], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size_top)));
- fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom)));
- fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom)));
-
- } break;
- }
- }
-}
-
-void SpatialEditorViewportContainer::set_view(View p_view) {
-
- view = p_view;
- queue_sort();
-}
-
-SpatialEditorViewportContainer::View SpatialEditorViewportContainer::get_view() {
-
- return view;
-}
-
-void SpatialEditorViewportContainer::_bind_methods() {
-
- ClassDB::bind_method("_gui_input", &SpatialEditorViewportContainer::_gui_input);
-}
-
-SpatialEditorViewportContainer::SpatialEditorViewportContainer() {
-
- set_clip_contents(true);
- view = VIEW_USE_1_VIEWPORT;
- mouseover = false;
- ratio_h = 0.5;
- ratio_v = 0.5;
- hovering_v = false;
- hovering_h = false;
- dragging_v = false;
- dragging_h = false;
-}
-
-///////////////////////////////////////////////////////////////////
-
-SpatialEditor *SpatialEditor::singleton = NULL;
-
-SpatialEditorSelectedItem::~SpatialEditorSelectedItem() {
-
- if (sbox_instance.is_valid())
- VisualServer::get_singleton()->free(sbox_instance);
-}
-
-void SpatialEditor::select_gizmo_highlight_axis(int p_axis) {
-
- for (int i = 0; i < 3; i++) {
-
- move_gizmo[i]->surface_set_material(0, i == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
- move_plane_gizmo[i]->surface_set_material(0, (i + 6) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]);
- rotate_gizmo[i]->surface_set_material(0, (i + 3) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
- scale_gizmo[i]->surface_set_material(0, (i + 9) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
- scale_plane_gizmo[i]->surface_set_material(0, (i + 12) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]);
- }
-}
-
-void SpatialEditor::update_transform_gizmo() {
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
- AABB center;
- bool first = true;
-
- Basis gizmo_basis;
- bool local_gizmo_coords = are_local_coords_enabled();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- Transform xf = se->sp->get_global_gizmo_transform();
-
- if (first) {
- center.position = xf.origin;
- first = false;
- if (local_gizmo_coords) {
- gizmo_basis = xf.basis;
- gizmo_basis.orthonormalize();
- }
- } else {
- center.expand_to(xf.origin);
- gizmo_basis = Basis();
- }
- }
-
- Vector3 pcenter = center.position + center.size * 0.5;
- gizmo.visible = !first;
- gizmo.transform.origin = pcenter;
- gizmo.transform.basis = gizmo_basis;
-
- for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
- viewports[i]->update_transform_gizmo_view();
- }
-}
-
-void _update_all_gizmos(Node *p_node) {
- for (int i = p_node->get_child_count() - 1; 0 <= i; --i) {
- Spatial *spatial_node = Object::cast_to<Spatial>(p_node->get_child(i));
- if (spatial_node) {
- spatial_node->update_gizmo();
- }
-
- _update_all_gizmos(p_node->get_child(i));
- }
-}
-
-void SpatialEditor::update_all_gizmos(Node *p_node) {
- if (!p_node) {
- p_node = SceneTree::get_singleton()->get_root();
- }
- _update_all_gizmos(p_node);
-}
-
-Object *SpatialEditor::_get_editor_data(Object *p_what) {
-
- Spatial *sp = Object::cast_to<Spatial>(p_what);
- if (!sp)
- return NULL;
-
- SpatialEditorSelectedItem *si = memnew(SpatialEditorSelectedItem);
-
- si->sp = sp;
- si->sbox_instance = VisualServer::get_singleton()->instance_create2(selection_box->get_rid(), sp->get_world()->get_scenario());
- VS::get_singleton()->instance_geometry_set_cast_shadows_setting(si->sbox_instance, VS::SHADOW_CASTING_SETTING_OFF);
-
- return si;
-}
-
-void SpatialEditor::_generate_selection_box() {
-
- AABB aabb(Vector3(), Vector3(1, 1, 1));
- aabb.grow_by(aabb.get_longest_axis_size() / 20.0);
-
- Ref<SurfaceTool> st = memnew(SurfaceTool);
-
- st->begin(Mesh::PRIMITIVE_LINES);
- for (int i = 0; i < 12; i++) {
-
- Vector3 a, b;
- aabb.get_edge(i, a, b);
-
- st->add_color(Color(1.0, 1.0, 0.8, 0.8));
- st->add_vertex(a);
- st->add_color(Color(1.0, 1.0, 0.8, 0.4));
- st->add_vertex(a.linear_interpolate(b, 0.2));
-
- st->add_color(Color(1.0, 1.0, 0.8, 0.4));
- st->add_vertex(a.linear_interpolate(b, 0.8));
- st->add_color(Color(1.0, 1.0, 0.8, 0.8));
- st->add_vertex(b);
- }
-
- Ref<SpatialMaterial> mat = memnew(SpatialMaterial);
- mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- mat->set_albedo(Color(1, 1, 1));
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- mat->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
- st->set_material(mat);
- selection_box = st->commit();
-}
-
-Dictionary SpatialEditor::get_state() const {
-
- Dictionary d;
-
- d["snap_enabled"] = snap_enabled;
- d["translate_snap"] = get_translate_snap();
- d["rotate_snap"] = get_rotate_snap();
- d["scale_snap"] = get_scale_snap();
-
- d["local_coords"] = tool_option_button[TOOL_OPT_LOCAL_COORDS]->is_pressed();
-
- int vc = 0;
- if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT)))
- vc = 1;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS)))
- vc = 2;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS)))
- vc = 3;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS)))
- vc = 4;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT)))
- vc = 5;
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT)))
- vc = 6;
-
- d["viewport_mode"] = vc;
- Array vpdata;
- for (int i = 0; i < 4; i++) {
- vpdata.push_back(viewports[i]->get_state());
- }
-
- d["viewports"] = vpdata;
-
- d["show_grid"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID));
- d["show_origin"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN));
- d["fov"] = get_fov();
- d["znear"] = get_znear();
- d["zfar"] = get_zfar();
-
- Dictionary gizmos_status;
- for (int i = 0; i < gizmo_plugins_by_name.size(); i++) {
- if (!gizmo_plugins_by_name[i]->can_be_hidden()) continue;
- int state = gizmos_menu->get_item_state(gizmos_menu->get_item_index(i));
- String name = gizmo_plugins_by_name[i]->get_name();
- gizmos_status[name] = state;
- }
-
- d["gizmos_status"] = gizmos_status;
-
- return d;
-}
-void SpatialEditor::set_state(const Dictionary &p_state) {
-
- Dictionary d = p_state;
-
- if (d.has("snap_enabled")) {
- snap_enabled = d["snap_enabled"];
- tool_option_button[TOOL_OPT_USE_SNAP]->set_pressed(d["snap_enabled"]);
- }
-
- if (d.has("translate_snap"))
- snap_translate->set_text(d["translate_snap"]);
-
- if (d.has("rotate_snap"))
- snap_rotate->set_text(d["rotate_snap"]);
-
- if (d.has("scale_snap"))
- snap_scale->set_text(d["scale_snap"]);
-
- if (d.has("local_coords")) {
- tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_pressed(d["local_coords"]);
- update_transform_gizmo();
- }
-
- if (d.has("viewport_mode")) {
- int vc = d["viewport_mode"];
-
- if (vc == 1)
- _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
- else if (vc == 2)
- _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS);
- else if (vc == 3)
- _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS);
- else if (vc == 4)
- _menu_item_pressed(MENU_VIEW_USE_4_VIEWPORTS);
- else if (vc == 5)
- _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS_ALT);
- else if (vc == 6)
- _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS_ALT);
- }
-
- if (d.has("viewports")) {
- Array vp = d["viewports"];
- uint32_t vp_size = static_cast<uint32_t>(vp.size());
- if (vp_size > VIEWPORTS_COUNT) {
- WARN_PRINT("Ignoring superfluous viewport settings from spatial editor state.");
- vp_size = VIEWPORTS_COUNT;
- }
-
- for (uint32_t i = 0; i < vp_size; i++) {
- viewports[i]->set_state(vp[i]);
- }
- }
-
- if (d.has("zfar"))
- settings_zfar->set_value(float(d["zfar"]));
- if (d.has("znear"))
- settings_znear->set_value(float(d["znear"]));
- if (d.has("fov"))
- settings_fov->set_value(float(d["fov"]));
- if (d.has("show_grid")) {
- bool use = d["show_grid"];
-
- if (use != view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID))) {
- _menu_item_pressed(MENU_VIEW_GRID);
- }
- }
-
- if (d.has("show_origin")) {
- bool use = d["show_origin"];
-
- if (use != view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN))) {
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN), use);
- VisualServer::get_singleton()->instance_set_visible(origin_instance, use);
- }
- }
-
- if (d.has("gizmos_status")) {
- Dictionary gizmos_status = d["gizmos_status"];
- List<Variant> keys;
- gizmos_status.get_key_list(&keys);
-
- for (int j = 0; j < gizmo_plugins_by_name.size(); ++j) {
- if (!gizmo_plugins_by_name[j]->can_be_hidden()) continue;
- int state = EditorSpatialGizmoPlugin::VISIBLE;
- for (int i = 0; i < keys.size(); i++) {
- if (gizmo_plugins_by_name.write[j]->get_name() == keys[i]) {
- state = gizmos_status[keys[i]];
- break;
- }
- }
-
- gizmo_plugins_by_name.write[j]->set_state(state);
- }
- _update_gizmos_menu();
- }
-}
-
-void SpatialEditor::edit(Spatial *p_spatial) {
-
- if (p_spatial != selected) {
- if (selected) {
-
- Ref<EditorSpatialGizmo> seg = selected->get_gizmo();
- if (seg.is_valid()) {
- seg->set_selected(false);
- selected->update_gizmo();
- }
- }
-
- selected = p_spatial;
- over_gizmo_handle = -1;
-
- if (selected) {
-
- Ref<EditorSpatialGizmo> seg = selected->get_gizmo();
- if (seg.is_valid()) {
- seg->set_selected(true);
- selected->update_gizmo();
- }
- }
- }
-}
-
-void SpatialEditor::_xform_dialog_action() {
-
- Transform t;
- //translation
- Vector3 scale;
- Vector3 rotate;
- Vector3 translate;
-
- for (int i = 0; i < 3; i++) {
- translate[i] = xform_translate[i]->get_text().to_double();
- rotate[i] = Math::deg2rad(xform_rotate[i]->get_text().to_double());
- scale[i] = xform_scale[i]->get_text().to_double();
- }
-
- t.basis.scale(scale);
- t.basis.rotate(rotate);
- t.origin = translate;
-
- undo_redo->create_action(TTR("XForm Dialog"));
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (!sp)
- continue;
-
- SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
-
- bool post = xform_type->get_selected() > 0;
-
- Transform tr = sp->get_global_gizmo_transform();
- if (post)
- tr = tr * t;
- else {
-
- tr.basis = t.basis * tr.basis;
- tr.origin += t.origin;
- }
-
- undo_redo->add_do_method(sp, "set_global_transform", tr);
- undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_gizmo_transform());
- }
- undo_redo->commit_action();
-}
-
-void SpatialEditor::_menu_item_toggled(bool pressed, int p_option) {
-
- switch (p_option) {
- case MENU_TOOL_LOCAL_COORDS: {
-
- tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_pressed(pressed);
- update_transform_gizmo();
- } break;
-
- case MENU_TOOL_USE_SNAP: {
- tool_option_button[TOOL_OPT_USE_SNAP]->set_pressed(pressed);
- snap_enabled = pressed;
- } break;
-
- case MENU_TOOL_OVERRIDE_CAMERA: {
- ScriptEditorDebugger *const debugger = ScriptEditor::get_singleton()->get_debugger();
-
- if (pressed) {
- using Override = ScriptEditorDebugger::CameraOverride;
-
- debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
- } else {
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
- }
-
- } break;
- }
-}
-
-void SpatialEditor::_menu_gizmo_toggled(int p_option) {
-
- const int idx = gizmos_menu->get_item_index(p_option);
- gizmos_menu->toggle_item_multistate(idx);
-
- // Change icon
- const int state = gizmos_menu->get_item_state(idx);
- switch (state) {
- case EditorSpatialGizmoPlugin::VISIBLE:
- gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_visible"));
- break;
- case EditorSpatialGizmoPlugin::ON_TOP:
- gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_xray"));
- break;
- case EditorSpatialGizmoPlugin::HIDDEN:
- gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_hidden"));
- break;
- }
-
- gizmo_plugins_by_name.write[p_option]->set_state(state);
-
- update_all_gizmos();
-}
-
-void SpatialEditor::_update_camera_override_button(bool p_game_running) {
- Button *const button = tool_option_button[TOOL_OPT_OVERRIDE_CAMERA];
-
- if (p_game_running) {
- button->set_disabled(false);
- button->set_tooltip(TTR("Game Camera Override\nNo game instance running."));
- } else {
- button->set_disabled(true);
- button->set_pressed(false);
- button->set_tooltip(TTR("Game Camera Override\nOverrides game camera with editor viewport camera."));
- }
-}
-
-void SpatialEditor::_update_camera_override_viewport(Object *p_viewport) {
- SpatialEditorViewport *current_viewport = Object::cast_to<SpatialEditorViewport>(p_viewport);
-
- if (!current_viewport)
- return;
-
- ScriptEditorDebugger *const debugger = ScriptEditor::get_singleton()->get_debugger();
-
- camera_override_viewport_id = current_viewport->index;
- if (debugger->get_camera_override() >= ScriptEditorDebugger::OVERRIDE_3D_1) {
- using Override = ScriptEditorDebugger::CameraOverride;
-
- debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
- }
-}
-
-void SpatialEditor::_menu_item_pressed(int p_option) {
-
- switch (p_option) {
-
- case MENU_TOOL_SELECT:
- case MENU_TOOL_MOVE:
- case MENU_TOOL_ROTATE:
- case MENU_TOOL_SCALE:
- case MENU_TOOL_LIST_SELECT: {
-
- for (int i = 0; i < TOOL_MAX; i++)
- tool_button[i]->set_pressed(i == p_option);
- tool_mode = (ToolMode)p_option;
- update_transform_gizmo();
-
- } break;
- case MENU_TRANSFORM_CONFIGURE_SNAP: {
-
- snap_dialog->popup_centered(Size2(200, 180));
- } break;
- case MENU_TRANSFORM_DIALOG: {
-
- for (int i = 0; i < 3; i++) {
-
- xform_translate[i]->set_text("0");
- xform_rotate[i]->set_text("0");
- xform_scale[i]->set_text("1");
- }
-
- xform_dialog->popup_centered(Size2(320, 240) * EDSCALE);
-
- } break;
- case MENU_VIEW_USE_1_VIEWPORT: {
-
- viewport_base->set_view(SpatialEditorViewportContainer::VIEW_USE_1_VIEWPORT);
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
-
- } break;
- case MENU_VIEW_USE_2_VIEWPORTS: {
-
- viewport_base->set_view(SpatialEditorViewportContainer::VIEW_USE_2_VIEWPORTS);
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
-
- } break;
- case MENU_VIEW_USE_2_VIEWPORTS_ALT: {
-
- viewport_base->set_view(SpatialEditorViewportContainer::VIEW_USE_2_VIEWPORTS_ALT);
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
-
- } break;
- case MENU_VIEW_USE_3_VIEWPORTS: {
-
- viewport_base->set_view(SpatialEditorViewportContainer::VIEW_USE_3_VIEWPORTS);
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
-
- } break;
- case MENU_VIEW_USE_3_VIEWPORTS_ALT: {
-
- viewport_base->set_view(SpatialEditorViewportContainer::VIEW_USE_3_VIEWPORTS_ALT);
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), true);
-
- } break;
- case MENU_VIEW_USE_4_VIEWPORTS: {
-
- viewport_base->set_view(SpatialEditorViewportContainer::VIEW_USE_4_VIEWPORTS);
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), false);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), false);
-
- } break;
- case MENU_VIEW_ORIGIN: {
-
- bool is_checked = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(p_option));
-
- origin_enabled = !is_checked;
- VisualServer::get_singleton()->instance_set_visible(origin_instance, origin_enabled);
- // Update the grid since its appearance depends on whether the origin is enabled
- _finish_grid();
- _init_grid();
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(p_option), origin_enabled);
- } break;
- case MENU_VIEW_GRID: {
-
- bool is_checked = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(p_option));
-
- grid_enabled = !is_checked;
-
- for (int i = 0; i < 3; ++i) {
- if (grid_enable[i]) {
- VisualServer::get_singleton()->instance_set_visible(grid_instance[i], grid_enabled);
- grid_visible[i] = grid_enabled;
- }
- }
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(p_option), grid_enabled);
-
- } break;
- case MENU_VIEW_CAMERA_SETTINGS: {
-
- settings_dialog->popup_centered(settings_vbc->get_combined_minimum_size() + Size2(50, 50));
- } break;
- case MENU_SNAP_TO_FLOOR: {
- snap_selected_nodes_to_floor();
- } break;
- case MENU_LOCK_SELECTED: {
- undo_redo->create_action(TTR("Lock Selected"));
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *spatial = Object::cast_to<Spatial>(E->get());
- if (!spatial || !spatial->is_visible_in_tree())
- continue;
-
- if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root())
- continue;
-
- undo_redo->add_do_method(spatial, "set_meta", "_edit_lock_", true);
- undo_redo->add_undo_method(spatial, "remove_meta", "_edit_lock_");
- undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed");
- undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed");
- }
-
- undo_redo->add_do_method(this, "_refresh_menu_icons", Variant());
- undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant());
- undo_redo->commit_action();
- } break;
- case MENU_UNLOCK_SELECTED: {
- undo_redo->create_action(TTR("Unlock Selected"));
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *spatial = Object::cast_to<Spatial>(E->get());
- if (!spatial || !spatial->is_visible_in_tree())
- continue;
-
- if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root())
- continue;
-
- undo_redo->add_do_method(spatial, "remove_meta", "_edit_lock_");
- undo_redo->add_undo_method(spatial, "set_meta", "_edit_lock_", true);
- undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed");
- undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed");
- }
-
- undo_redo->add_do_method(this, "_refresh_menu_icons", Variant());
- undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant());
- undo_redo->commit_action();
- } break;
- case MENU_GROUP_SELECTED: {
- undo_redo->create_action(TTR("Group Selected"));
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *spatial = Object::cast_to<Spatial>(E->get());
- if (!spatial || !spatial->is_visible_in_tree())
- continue;
-
- if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root())
- continue;
-
- undo_redo->add_do_method(spatial, "set_meta", "_edit_group_", true);
- undo_redo->add_undo_method(spatial, "remove_meta", "_edit_group_");
- undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed");
- undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed");
- }
-
- undo_redo->add_do_method(this, "_refresh_menu_icons", Variant());
- undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant());
- undo_redo->commit_action();
- } break;
- case MENU_UNGROUP_SELECTED: {
- undo_redo->create_action(TTR("Ungroup Selected"));
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
- Spatial *spatial = Object::cast_to<Spatial>(E->get());
- if (!spatial || !spatial->is_visible_in_tree())
- continue;
-
- if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root())
- continue;
-
- undo_redo->add_do_method(spatial, "remove_meta", "_edit_group_");
- undo_redo->add_undo_method(spatial, "set_meta", "_edit_group_", true);
- undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed");
- undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed");
- }
-
- undo_redo->add_do_method(this, "_refresh_menu_icons", Variant());
- undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant());
- undo_redo->commit_action();
- } break;
- }
-}
-
-void SpatialEditor::_init_indicators() {
-
- {
- origin_enabled = true;
- grid_enabled = true;
-
- indicator_mat.instance();
- indicator_mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- indicator_mat->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- indicator_mat->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
-
- Vector<Color> origin_colors;
- Vector<Vector3> origin_points;
-
- for (int i = 0; i < 3; i++) {
- Vector3 axis;
- axis[i] = 1;
- Color origin_color;
- switch (i) {
- case 0:
- origin_color = get_color("axis_x_color", "Editor");
- break;
- case 1:
- origin_color = get_color("axis_y_color", "Editor");
- break;
- case 2:
- origin_color = get_color("axis_z_color", "Editor");
- break;
- default:
- origin_color = Color();
- break;
- }
-
- grid_enable[i] = false;
- grid_visible[i] = false;
-
- origin_colors.push_back(origin_color);
- origin_colors.push_back(origin_color);
- origin_points.push_back(axis * 4096);
- origin_points.push_back(axis * -4096);
- }
-
- grid_enable[1] = true;
- grid_visible[1] = true;
-
- _init_grid();
-
- origin = VisualServer::get_singleton()->mesh_create();
- Array d;
- d.resize(VS::ARRAY_MAX);
- d[VisualServer::ARRAY_VERTEX] = origin_points;
- d[VisualServer::ARRAY_COLOR] = origin_colors;
-
- VisualServer::get_singleton()->mesh_add_surface_from_arrays(origin, VisualServer::PRIMITIVE_LINES, d);
- VisualServer::get_singleton()->mesh_surface_set_material(origin, 0, indicator_mat->get_rid());
-
- origin_instance = VisualServer::get_singleton()->instance_create2(origin, get_tree()->get_root()->get_world()->get_scenario());
- VS::get_singleton()->instance_set_layer_mask(origin_instance, 1 << SpatialEditorViewport::GIZMO_GRID_LAYER);
-
- VisualServer::get_singleton()->instance_geometry_set_cast_shadows_setting(origin_instance, VS::SHADOW_CASTING_SETTING_OFF);
- }
-
- {
-
- //move gizmo
-
- for (int i = 0; i < 3; i++) {
-
- Color col;
- switch (i) {
- case 0:
- col = get_color("axis_x_color", "Editor");
- break;
- case 1:
- col = get_color("axis_y_color", "Editor");
- break;
- case 2:
- col = get_color("axis_z_color", "Editor");
- break;
- default:
- col = Color();
- break;
- }
-
- col.a = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_opacity");
-
- move_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
- move_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
- rotate_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
- scale_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
- scale_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
-
- Ref<SpatialMaterial> mat = memnew(SpatialMaterial);
- mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- mat->set_on_top_of_alpha();
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_albedo(col);
- gizmo_color[i] = mat;
-
- Ref<SpatialMaterial> mat_hl = mat->duplicate();
- mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
- gizmo_color_hl[i] = mat_hl;
-
- Vector3 ivec;
- ivec[i] = 1;
- Vector3 nivec;
- nivec[(i + 1) % 3] = 1;
- nivec[(i + 2) % 3] = 1;
- Vector3 ivec2;
- ivec2[(i + 1) % 3] = 1;
- Vector3 ivec3;
- ivec3[(i + 2) % 3] = 1;
-
- //translate
- {
-
- Ref<SurfaceTool> surftool = memnew(SurfaceTool);
- surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
-
- // Arrow profile
- const int arrow_points = 5;
- Vector3 arrow[5] = {
- nivec * 0.0 + ivec * 0.0,
- nivec * 0.01 + ivec * 0.0,
- nivec * 0.01 + ivec * GIZMO_ARROW_OFFSET,
- nivec * 0.065 + ivec * GIZMO_ARROW_OFFSET,
- nivec * 0.0 + ivec * (GIZMO_ARROW_OFFSET + GIZMO_ARROW_SIZE),
- };
-
- int arrow_sides = 16;
-
- for (int k = 0; k < arrow_sides; k++) {
-
- Basis ma(ivec, Math_PI * 2 * float(k) / arrow_sides);
- Basis mb(ivec, Math_PI * 2 * float(k + 1) / arrow_sides);
-
- for (int j = 0; j < arrow_points - 1; j++) {
-
- Vector3 points[4] = {
- ma.xform(arrow[j]),
- mb.xform(arrow[j]),
- mb.xform(arrow[j + 1]),
- ma.xform(arrow[j + 1]),
- };
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[1]);
- surftool->add_vertex(points[2]);
-
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[2]);
- surftool->add_vertex(points[3]);
- }
- }
-
- surftool->set_material(mat);
- surftool->commit(move_gizmo[i]);
- }
-
- // Plane Translation
- {
- Ref<SurfaceTool> surftool = memnew(SurfaceTool);
- surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
-
- Vector3 vec = ivec2 - ivec3;
- Vector3 plane[4] = {
- vec * GIZMO_PLANE_DST,
- vec * GIZMO_PLANE_DST + ivec2 * GIZMO_PLANE_SIZE,
- vec * (GIZMO_PLANE_DST + GIZMO_PLANE_SIZE),
- vec * GIZMO_PLANE_DST - ivec3 * GIZMO_PLANE_SIZE
- };
-
- Basis ma(ivec, Math_PI / 2);
-
- Vector3 points[4] = {
- ma.xform(plane[0]),
- ma.xform(plane[1]),
- ma.xform(plane[2]),
- ma.xform(plane[3]),
- };
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[1]);
- surftool->add_vertex(points[2]);
-
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[2]);
- surftool->add_vertex(points[3]);
-
- Ref<SpatialMaterial> plane_mat = memnew(SpatialMaterial);
- plane_mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- plane_mat->set_on_top_of_alpha();
- plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED);
- plane_mat->set_albedo(col);
- plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides
- surftool->set_material(plane_mat);
- surftool->commit(move_plane_gizmo[i]);
-
- Ref<SpatialMaterial> plane_mat_hl = plane_mat->duplicate();
- plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
- plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides
- }
-
- // Rotate
- {
-
- Ref<SurfaceTool> surftool = memnew(SurfaceTool);
- surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
-
- Vector3 circle[5] = {
- ivec * 0.02 + ivec2 * 0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
- ivec * -0.02 + ivec2 * 0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
- ivec * -0.02 + ivec2 * -0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
- ivec * 0.02 + ivec2 * -0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
- ivec * 0.02 + ivec2 * 0.02 + ivec2 * GIZMO_CIRCLE_SIZE,
- };
-
- for (int k = 0; k < 64; k++) {
-
- Basis ma(ivec, Math_PI * 2 * float(k) / 64);
- Basis mb(ivec, Math_PI * 2 * float(k + 1) / 64);
-
- for (int j = 0; j < 4; j++) {
-
- Vector3 points[4] = {
- ma.xform(circle[j]),
- mb.xform(circle[j]),
- mb.xform(circle[j + 1]),
- ma.xform(circle[j + 1]),
- };
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[1]);
- surftool->add_vertex(points[2]);
-
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[2]);
- surftool->add_vertex(points[3]);
- }
- }
-
- surftool->set_material(mat);
- surftool->commit(rotate_gizmo[i]);
- }
-
- // Scale
- {
- Ref<SurfaceTool> surftool = memnew(SurfaceTool);
- surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
-
- // Cube arrow profile
- const int arrow_points = 6;
- Vector3 arrow[6] = {
- nivec * 0.0 + ivec * 0.0,
- nivec * 0.01 + ivec * 0.0,
- nivec * 0.01 + ivec * 1.0 * GIZMO_SCALE_OFFSET,
- nivec * 0.07 + ivec * 1.0 * GIZMO_SCALE_OFFSET,
- nivec * 0.07 + ivec * 1.11 * GIZMO_SCALE_OFFSET,
- nivec * 0.0 + ivec * 1.11 * GIZMO_SCALE_OFFSET,
- };
-
- int arrow_sides = 4;
-
- for (int k = 0; k < 4; k++) {
-
- Basis ma(ivec, Math_PI * 2 * float(k) / arrow_sides);
- Basis mb(ivec, Math_PI * 2 * float(k + 1) / arrow_sides);
-
- for (int j = 0; j < arrow_points - 1; j++) {
-
- Vector3 points[4] = {
- ma.xform(arrow[j]),
- mb.xform(arrow[j]),
- mb.xform(arrow[j + 1]),
- ma.xform(arrow[j + 1]),
- };
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[1]);
- surftool->add_vertex(points[2]);
-
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[2]);
- surftool->add_vertex(points[3]);
- }
- }
-
- surftool->set_material(mat);
- surftool->commit(scale_gizmo[i]);
- }
-
- // Plane Scale
- {
- Ref<SurfaceTool> surftool = memnew(SurfaceTool);
- surftool->begin(Mesh::PRIMITIVE_TRIANGLES);
-
- Vector3 vec = ivec2 - ivec3;
- Vector3 plane[4] = {
- vec * GIZMO_PLANE_DST,
- vec * GIZMO_PLANE_DST + ivec2 * GIZMO_PLANE_SIZE,
- vec * (GIZMO_PLANE_DST + GIZMO_PLANE_SIZE),
- vec * GIZMO_PLANE_DST - ivec3 * GIZMO_PLANE_SIZE
- };
-
- Basis ma(ivec, Math_PI / 2);
-
- Vector3 points[4] = {
- ma.xform(plane[0]),
- ma.xform(plane[1]),
- ma.xform(plane[2]),
- ma.xform(plane[3]),
- };
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[1]);
- surftool->add_vertex(points[2]);
-
- surftool->add_vertex(points[0]);
- surftool->add_vertex(points[2]);
- surftool->add_vertex(points[3]);
-
- Ref<SpatialMaterial> plane_mat = memnew(SpatialMaterial);
- plane_mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- plane_mat->set_on_top_of_alpha();
- plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED);
- plane_mat->set_albedo(col);
- plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides
- surftool->set_material(plane_mat);
- surftool->commit(scale_plane_gizmo[i]);
-
- Ref<SpatialMaterial> plane_mat_hl = plane_mat->duplicate();
- plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
- plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides
- }
- }
- }
-
- _generate_selection_box();
-}
-
-void SpatialEditor::_update_gizmos_menu() {
-
- gizmos_menu->clear();
-
- for (int i = 0; i < gizmo_plugins_by_name.size(); ++i) {
- if (!gizmo_plugins_by_name[i]->can_be_hidden()) continue;
- String plugin_name = gizmo_plugins_by_name[i]->get_name();
- const int plugin_state = gizmo_plugins_by_name[i]->get_state();
- gizmos_menu->add_multistate_item(TTR(plugin_name), 3, plugin_state, i);
- const int idx = gizmos_menu->get_item_index(i);
- switch (plugin_state) {
- case EditorSpatialGizmoPlugin::VISIBLE:
- gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_visible"));
- break;
- case EditorSpatialGizmoPlugin::ON_TOP:
- gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_xray"));
- break;
- case EditorSpatialGizmoPlugin::HIDDEN:
- gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_hidden"));
- break;
- }
- }
-}
-
-void SpatialEditor::_update_gizmos_menu_theme() {
- for (int i = 0; i < gizmo_plugins_by_name.size(); ++i) {
- if (!gizmo_plugins_by_name[i]->can_be_hidden()) continue;
- const int plugin_state = gizmo_plugins_by_name[i]->get_state();
- const int idx = gizmos_menu->get_item_index(i);
- switch (plugin_state) {
- case EditorSpatialGizmoPlugin::VISIBLE:
- gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_visible"));
- break;
- case EditorSpatialGizmoPlugin::ON_TOP:
- gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_xray"));
- break;
- case EditorSpatialGizmoPlugin::HIDDEN:
- gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_hidden"));
- break;
- }
- }
-}
-
-void SpatialEditor::_init_grid() {
-
- PoolVector<Color> grid_colors[3];
- PoolVector<Vector3> grid_points[3];
-
- Color primary_grid_color = EditorSettings::get_singleton()->get("editors/3d/primary_grid_color");
- Color secondary_grid_color = EditorSettings::get_singleton()->get("editors/3d/secondary_grid_color");
- int grid_size = EditorSettings::get_singleton()->get("editors/3d/grid_size");
- int primary_grid_steps = EditorSettings::get_singleton()->get("editors/3d/primary_grid_steps");
-
- for (int i = 0; i < 3; i++) {
- Vector3 axis;
- axis[i] = 1;
- Vector3 axis_n1;
- axis_n1[(i + 1) % 3] = 1;
- Vector3 axis_n2;
- axis_n2[(i + 2) % 3] = 1;
-
- for (int j = -grid_size; j <= grid_size; j++) {
- Vector3 p1 = axis_n1 * j + axis_n2 * -grid_size;
- Vector3 p1_dest = p1 * (-axis_n2 + axis_n1);
- Vector3 p2 = axis_n2 * j + axis_n1 * -grid_size;
- Vector3 p2_dest = p2 * (-axis_n1 + axis_n2);
-
- Color line_color = secondary_grid_color;
- if (origin_enabled && j == 0) {
- // Don't draw the center lines of the grid if the origin is enabled
- // The origin would overlap the grid lines in this case, causing flickering
- continue;
- } else if (j % primary_grid_steps == 0) {
- line_color = primary_grid_color;
- }
-
- grid_points[i].push_back(p1);
- grid_points[i].push_back(p1_dest);
- grid_colors[i].push_back(line_color);
- grid_colors[i].push_back(line_color);
-
- grid_points[i].push_back(p2);
- grid_points[i].push_back(p2_dest);
- grid_colors[i].push_back(line_color);
- grid_colors[i].push_back(line_color);
- }
-
- grid[i] = VisualServer::get_singleton()->mesh_create();
- Array d;
- d.resize(VS::ARRAY_MAX);
- d[VisualServer::ARRAY_VERTEX] = grid_points[i];
- d[VisualServer::ARRAY_COLOR] = grid_colors[i];
- VisualServer::get_singleton()->mesh_add_surface_from_arrays(grid[i], VisualServer::PRIMITIVE_LINES, d);
- VisualServer::get_singleton()->mesh_surface_set_material(grid[i], 0, indicator_mat->get_rid());
- grid_instance[i] = VisualServer::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world()->get_scenario());
-
- VisualServer::get_singleton()->instance_set_visible(grid_instance[i], grid_visible[i]);
- VisualServer::get_singleton()->instance_geometry_set_cast_shadows_setting(grid_instance[i], VS::SHADOW_CASTING_SETTING_OFF);
- VS::get_singleton()->instance_set_layer_mask(grid_instance[i], 1 << SpatialEditorViewport::GIZMO_GRID_LAYER);
- }
-}
-
-void SpatialEditor::_finish_indicators() {
-
- VisualServer::get_singleton()->free(origin_instance);
- VisualServer::get_singleton()->free(origin);
-
- _finish_grid();
-}
-
-void SpatialEditor::_finish_grid() {
- for (int i = 0; i < 3; i++) {
- VisualServer::get_singleton()->free(grid_instance[i]);
- VisualServer::get_singleton()->free(grid[i]);
- }
-}
-
-bool SpatialEditor::is_any_freelook_active() const {
- for (unsigned int i = 0; i < VIEWPORTS_COUNT; ++i) {
- if (viewports[i]->is_freelook_active())
- return true;
- }
- return false;
-}
-
-void SpatialEditor::_refresh_menu_icons() {
-
- bool all_locked = true;
- bool all_grouped = true;
-
- List<Node *> &selection = editor_selection->get_selected_node_list();
-
- if (selection.empty()) {
- all_locked = false;
- all_grouped = false;
- } else {
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
- if (Object::cast_to<Spatial>(E->get()) && !Object::cast_to<Spatial>(E->get())->has_meta("_edit_lock_")) {
- all_locked = false;
- break;
- }
- }
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
- if (Object::cast_to<Spatial>(E->get()) && !Object::cast_to<Spatial>(E->get())->has_meta("_edit_group_")) {
- all_grouped = false;
- break;
- }
- }
- }
-
- tool_button[TOOL_LOCK_SELECTED]->set_visible(!all_locked);
- tool_button[TOOL_LOCK_SELECTED]->set_disabled(selection.empty());
- tool_button[TOOL_UNLOCK_SELECTED]->set_visible(all_locked);
-
- tool_button[TOOL_GROUP_SELECTED]->set_visible(!all_grouped);
- tool_button[TOOL_GROUP_SELECTED]->set_disabled(selection.empty());
- tool_button[TOOL_UNGROUP_SELECTED]->set_visible(all_grouped);
-}
-
-template <typename T>
-Set<T *> _get_child_nodes(Node *parent_node) {
- Set<T *> nodes = Set<T *>();
- T *node = Node::cast_to<T>(parent_node);
- if (node) {
- nodes.insert(node);
- }
-
- for (int i = 0; i < parent_node->get_child_count(); i++) {
- Node *child_node = parent_node->get_child(i);
- Set<T *> child_nodes = _get_child_nodes<T>(child_node);
- for (typename Set<T *>::Element *I = child_nodes.front(); I; I = I->next()) {
- nodes.insert(I->get());
- }
- }
-
- return nodes;
-}
-
-Set<RID> _get_physics_bodies_rid(Node *node) {
- Set<RID> rids = Set<RID>();
- PhysicsBody *pb = Node::cast_to<PhysicsBody>(node);
- if (pb) {
- rids.insert(pb->get_rid());
- }
- Set<PhysicsBody *> child_nodes = _get_child_nodes<PhysicsBody>(node);
- for (Set<PhysicsBody *>::Element *I = child_nodes.front(); I; I = I->next()) {
- rids.insert(I->get()->get_rid());
- }
-
- return rids;
-}
-
-void SpatialEditor::snap_selected_nodes_to_floor() {
- List<Node *> &selection = editor_selection->get_selected_node_list();
- Dictionary snap_data;
-
- for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
- Spatial *sp = Object::cast_to<Spatial>(E->get());
- if (sp) {
- Vector3 from = Vector3();
- Vector3 position_offset = Vector3();
-
- // Priorities for snapping to floor are CollisionShapes, VisualInstances and then origin
- Set<VisualInstance *> vi = _get_child_nodes<VisualInstance>(sp);
- Set<CollisionShape *> cs = _get_child_nodes<CollisionShape>(sp);
-
- if (cs.size()) {
- AABB aabb = sp->get_global_transform().xform(cs.front()->get()->get_shape()->get_debug_mesh()->get_aabb());
- for (Set<CollisionShape *>::Element *I = cs.front(); I; I = I->next()) {
- aabb.merge_with(sp->get_global_transform().xform(I->get()->get_shape()->get_debug_mesh()->get_aabb()));
- }
- Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
- from = aabb.position + size;
- position_offset.y = from.y - sp->get_global_transform().origin.y;
- } else if (vi.size()) {
- AABB aabb = vi.front()->get()->get_transformed_aabb();
- for (Set<VisualInstance *>::Element *I = vi.front(); I; I = I->next()) {
- aabb.merge_with(I->get()->get_transformed_aabb());
- }
- Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
- from = aabb.position + size;
- position_offset.y = from.y - sp->get_global_transform().origin.y;
- } else {
- from = sp->get_global_transform().origin;
- }
-
- // We add a bit of margin to the from position to avoid it from snapping
- // when the spatial is already on a floor and there's another floor under
- // it
- from = from + Vector3(0.0, 0.2, 0.0);
-
- Dictionary d;
-
- d["from"] = from;
- d["position_offset"] = position_offset;
- snap_data[sp] = d;
- }
- }
-
- PhysicsDirectSpaceState *ss = get_tree()->get_root()->get_world()->get_direct_space_state();
- PhysicsDirectSpaceState::RayResult result;
-
- Array keys = snap_data.keys();
-
- // The maximum height an object can travel to be snapped
- const float max_snap_height = 20.0;
-
- // Will be set to `true` if at least one node from the selection was successfully snapped
- bool snapped_to_floor = false;
-
- if (keys.size()) {
- // For snapping to be performed, there must be solid geometry under at least one of the selected nodes.
- // We need to check this before snapping to register the undo/redo action only if needed.
- for (int i = 0; i < keys.size(); i++) {
- Node *node = keys[i];
- Spatial *sp = Object::cast_to<Spatial>(node);
- Dictionary d = snap_data[node];
- Vector3 from = d["from"];
- Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
- Set<RID> excluded = _get_physics_bodies_rid(sp);
-
- if (ss->intersect_ray(from, to, result, excluded)) {
- snapped_to_floor = true;
- }
- }
-
- if (snapped_to_floor) {
- undo_redo->create_action(TTR("Snap Nodes To Floor"));
-
- // Perform snapping if at least one node can be snapped
- for (int i = 0; i < keys.size(); i++) {
- Node *node = keys[i];
- Spatial *sp = Object::cast_to<Spatial>(node);
- Dictionary d = snap_data[node];
- Vector3 from = d["from"];
- Vector3 to = from - Vector3(0.0, max_snap_height, 0.0);
- Set<RID> excluded = _get_physics_bodies_rid(sp);
-
- if (ss->intersect_ray(from, to, result, excluded)) {
- Vector3 position_offset = d["position_offset"];
- Transform new_transform = sp->get_global_transform();
-
- new_transform.origin.y = result.position.y;
- new_transform.origin = new_transform.origin - position_offset;
-
- undo_redo->add_do_method(sp, "set_global_transform", new_transform);
- undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_transform());
- }
- }
-
- undo_redo->commit_action();
- } else {
- EditorNode::get_singleton()->show_warning(TTR("Couldn't find a solid floor to snap the selection to."));
- }
- }
-}
-
-void SpatialEditor::_unhandled_key_input(Ref<InputEvent> p_event) {
-
- if (!is_visible_in_tree() || get_viewport()->gui_has_modal_stack())
- return;
-
- snap_key_enabled = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
-}
-void SpatialEditor::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_READY) {
-
- tool_button[SpatialEditor::TOOL_MODE_SELECT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_MOVE]->set_icon(get_icon("ToolMove", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_icon("ListSelect", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_LOCK_SELECTED]->set_icon(get_icon("Lock", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_UNLOCK_SELECTED]->set_icon(get_icon("Unlock", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_GROUP_SELECTED]->set_icon(get_icon("Group", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_UNGROUP_SELECTED]->set_icon(get_icon("Ungroup", "EditorIcons"));
-
- tool_option_button[SpatialEditor::TOOL_OPT_LOCAL_COORDS]->set_icon(get_icon("Object", "EditorIcons"));
- tool_option_button[SpatialEditor::TOOL_OPT_USE_SNAP]->set_icon(get_icon("Snap", "EditorIcons"));
- tool_option_button[SpatialEditor::TOOL_OPT_OVERRIDE_CAMERA]->set_icon(get_icon("Camera", "EditorIcons"));
-
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), get_icon("Panels1", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), get_icon("Panels2", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), get_icon("Panels2Alt", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), get_icon("Panels3", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_icon("Panels3Alt", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_icon("Panels4", "EditorIcons"));
-
- _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
-
- _refresh_menu_icons();
-
- get_tree()->connect("node_removed", this, "_node_removed");
- EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->connect("node_changed", this, "_refresh_menu_icons");
- editor_selection->connect("selection_changed", this, "_refresh_menu_icons");
-
- editor->connect("stop_pressed", this, "_update_camera_override_button", make_binds(false));
- editor->connect("play_pressed", this, "_update_camera_override_button", make_binds(true));
- } else if (p_what == NOTIFICATION_ENTER_TREE) {
-
- _register_all_gizmos();
- _update_gizmos_menu();
- _init_indicators();
- } else if (p_what == NOTIFICATION_THEME_CHANGED) {
- _update_gizmos_menu_theme();
- } else if (p_what == NOTIFICATION_EXIT_TREE) {
-
- _finish_indicators();
- } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
- tool_button[SpatialEditor::TOOL_MODE_SELECT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_MOVE]->set_icon(get_icon("ToolMove", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_icon("ListSelect", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_LOCK_SELECTED]->set_icon(get_icon("Lock", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_UNLOCK_SELECTED]->set_icon(get_icon("Unlock", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_GROUP_SELECTED]->set_icon(get_icon("Group", "EditorIcons"));
- tool_button[SpatialEditor::TOOL_UNGROUP_SELECTED]->set_icon(get_icon("Ungroup", "EditorIcons"));
-
- tool_option_button[SpatialEditor::TOOL_OPT_LOCAL_COORDS]->set_icon(get_icon("Object", "EditorIcons"));
- tool_option_button[SpatialEditor::TOOL_OPT_USE_SNAP]->set_icon(get_icon("Snap", "EditorIcons"));
-
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), get_icon("Panels1", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), get_icon("Panels2", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT), get_icon("Panels2Alt", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), get_icon("Panels3", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_icon("Panels3Alt", "EditorIcons"));
- view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_icon("Panels4", "EditorIcons"));
-
- // Update grid color by rebuilding grid.
- _finish_grid();
- _init_grid();
- } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
- if (!is_visible() && tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->is_pressed()) {
- ScriptEditorDebugger *debugger = ScriptEditor::get_singleton()->get_debugger();
-
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
- tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_pressed(false);
- }
- }
-}
-
-void SpatialEditor::add_control_to_menu_panel(Control *p_control) {
-
- hbc_menu->add_child(p_control);
-}
-
-void SpatialEditor::remove_control_from_menu_panel(Control *p_control) {
-
- hbc_menu->remove_child(p_control);
-}
-
-void SpatialEditor::set_can_preview(Camera *p_preview) {
-
- for (int i = 0; i < 4; i++) {
- viewports[i]->set_can_preview(p_preview);
- }
-}
-
-VSplitContainer *SpatialEditor::get_shader_split() {
-
- return shader_split;
-}
-
-HSplitContainer *SpatialEditor::get_palette_split() {
-
- return palette_split;
-}
-
-void SpatialEditor::_request_gizmo(Object *p_obj) {
-
- Spatial *sp = Object::cast_to<Spatial>(p_obj);
- if (!sp)
- return;
- if (editor->get_edited_scene() && (sp == editor->get_edited_scene() || (sp->get_owner() && editor->get_edited_scene()->is_a_parent_of(sp)))) {
-
- Ref<EditorSpatialGizmo> seg;
-
- for (int i = 0; i < gizmo_plugins_by_priority.size(); ++i) {
- seg = gizmo_plugins_by_priority.write[i]->get_gizmo(sp);
-
- if (seg.is_valid()) {
- sp->set_gizmo(seg);
-
- if (sp == selected) {
- seg->set_selected(true);
- selected->update_gizmo();
- }
-
- break;
- }
- }
- }
-}
-
-void SpatialEditor::_toggle_maximize_view(Object *p_viewport) {
- if (!p_viewport) return;
- SpatialEditorViewport *current_viewport = Object::cast_to<SpatialEditorViewport>(p_viewport);
- if (!current_viewport) return;
-
- int index = -1;
- bool maximized = false;
- for (int i = 0; i < 4; i++) {
- if (viewports[i] == current_viewport) {
- index = i;
- if (current_viewport->get_global_rect() == viewport_base->get_global_rect())
- maximized = true;
- break;
- }
- }
- if (index == -1) return;
-
- if (!maximized) {
-
- for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
- if (i == (uint32_t)index)
- viewports[i]->set_anchors_and_margins_preset(Control::PRESET_WIDE);
- else
- viewports[i]->hide();
- }
- } else {
-
- for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++)
- viewports[i]->show();
-
- if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT)))
- _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS)))
- _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS);
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS_ALT)))
- _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS_ALT);
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS)))
- _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS);
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT)))
- _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS_ALT);
- else if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS)))
- _menu_item_pressed(MENU_VIEW_USE_4_VIEWPORTS);
- }
-}
-
-void SpatialEditor::_node_removed(Node *p_node) {
-
- if (p_node == selected)
- selected = NULL;
-}
-
-void SpatialEditor::_register_all_gizmos() {
- add_gizmo_plugin(Ref<CameraSpatialGizmoPlugin>(memnew(CameraSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<LightSpatialGizmoPlugin>(memnew(LightSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<AudioStreamPlayer3DSpatialGizmoPlugin>(memnew(AudioStreamPlayer3DSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<MeshInstanceSpatialGizmoPlugin>(memnew(MeshInstanceSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<SoftBodySpatialGizmoPlugin>(memnew(SoftBodySpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<Sprite3DSpatialGizmoPlugin>(memnew(Sprite3DSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<SkeletonSpatialGizmoPlugin>(memnew(SkeletonSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<Position3DSpatialGizmoPlugin>(memnew(Position3DSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<RayCastSpatialGizmoPlugin>(memnew(RayCastSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<SpringArmSpatialGizmoPlugin>(memnew(SpringArmSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<VehicleWheelSpatialGizmoPlugin>(memnew(VehicleWheelSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<VisibilityNotifierGizmoPlugin>(memnew(VisibilityNotifierGizmoPlugin)));
- add_gizmo_plugin(Ref<ParticlesGizmoPlugin>(memnew(ParticlesGizmoPlugin)));
- add_gizmo_plugin(Ref<CPUParticlesGizmoPlugin>(memnew(CPUParticlesGizmoPlugin)));
- add_gizmo_plugin(Ref<ReflectionProbeGizmoPlugin>(memnew(ReflectionProbeGizmoPlugin)));
- add_gizmo_plugin(Ref<GIProbeGizmoPlugin>(memnew(GIProbeGizmoPlugin)));
- add_gizmo_plugin(Ref<BakedIndirectLightGizmoPlugin>(memnew(BakedIndirectLightGizmoPlugin)));
- add_gizmo_plugin(Ref<CollisionShapeSpatialGizmoPlugin>(memnew(CollisionShapeSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<CollisionPolygonSpatialGizmoPlugin>(memnew(CollisionPolygonSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<NavigationMeshSpatialGizmoPlugin>(memnew(NavigationMeshSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<JointSpatialGizmoPlugin>(memnew(JointSpatialGizmoPlugin)));
- add_gizmo_plugin(Ref<PhysicalBoneSpatialGizmoPlugin>(memnew(PhysicalBoneSpatialGizmoPlugin)));
-}
-
-void SpatialEditor::_bind_methods() {
-
- ClassDB::bind_method("_unhandled_key_input", &SpatialEditor::_unhandled_key_input);
- ClassDB::bind_method("_node_removed", &SpatialEditor::_node_removed);
- ClassDB::bind_method("_menu_item_pressed", &SpatialEditor::_menu_item_pressed);
- ClassDB::bind_method("_menu_gizmo_toggled", &SpatialEditor::_menu_gizmo_toggled);
- ClassDB::bind_method("_menu_item_toggled", &SpatialEditor::_menu_item_toggled);
- ClassDB::bind_method("_xform_dialog_action", &SpatialEditor::_xform_dialog_action);
- ClassDB::bind_method("_get_editor_data", &SpatialEditor::_get_editor_data);
- ClassDB::bind_method("_request_gizmo", &SpatialEditor::_request_gizmo);
- ClassDB::bind_method("_toggle_maximize_view", &SpatialEditor::_toggle_maximize_view);
- ClassDB::bind_method("_refresh_menu_icons", &SpatialEditor::_refresh_menu_icons);
- ClassDB::bind_method("_update_camera_override_button", &SpatialEditor::_update_camera_override_button);
- ClassDB::bind_method("_update_camera_override_viewport", &SpatialEditor::_update_camera_override_viewport);
-
- ADD_SIGNAL(MethodInfo("transform_key_request"));
- ADD_SIGNAL(MethodInfo("item_lock_status_changed"));
- ADD_SIGNAL(MethodInfo("item_group_status_changed"));
-}
-
-void SpatialEditor::clear() {
-
- settings_fov->set_value(EDITOR_DEF("editors/3d/default_fov", 70.0));
- settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near", 0.05));
- settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far", 1500.0));
-
- for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
- viewports[i]->reset();
- }
-
- VisualServer::get_singleton()->instance_set_visible(origin_instance, true);
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN), true);
- for (int i = 0; i < 3; ++i) {
- if (grid_enable[i]) {
- VisualServer::get_singleton()->instance_set_visible(grid_instance[i], true);
- grid_visible[i] = true;
- }
- }
-
- for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
-
- viewports[i]->view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(SpatialEditorViewport::VIEW_AUDIO_LISTENER), i == 0);
- viewports[i]->viewport->set_as_audio_listener(i == 0);
- }
-
- view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID), true);
-}
-
-SpatialEditor::SpatialEditor(EditorNode *p_editor) {
-
- gizmo.visible = true;
- gizmo.scale = 1.0;
-
- viewport_environment = Ref<Environment>(memnew(Environment));
- undo_redo = p_editor->get_undo_redo();
- VBoxContainer *vbc = this;
-
- custom_camera = NULL;
- singleton = this;
- editor = p_editor;
- editor_selection = editor->get_editor_selection();
- editor_selection->add_editor_plugin(this);
-
- snap_enabled = false;
- snap_key_enabled = false;
- tool_mode = TOOL_MODE_SELECT;
-
- camera_override_viewport_id = 0;
-
- hbc_menu = memnew(HBoxContainer);
- vbc->add_child(hbc_menu);
-
- Vector<Variant> button_binds;
- button_binds.resize(1);
- String sct;
-
- tool_button[TOOL_MODE_SELECT] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_MODE_SELECT]);
- tool_button[TOOL_MODE_SELECT]->set_toggle_mode(true);
- tool_button[TOOL_MODE_SELECT]->set_flat(true);
- tool_button[TOOL_MODE_SELECT]->set_pressed(true);
- button_binds.write[0] = MENU_TOOL_SELECT;
- tool_button[TOOL_MODE_SELECT]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_SELECT]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_select", TTR("Select Mode"), KEY_Q));
- tool_button[TOOL_MODE_SELECT]->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate\nAlt+Drag: Move\nAlt+RMB: Depth list selection"));
-
- hbc_menu->add_child(memnew(VSeparator));
-
- tool_button[TOOL_MODE_MOVE] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_MODE_MOVE]);
- tool_button[TOOL_MODE_MOVE]->set_toggle_mode(true);
- tool_button[TOOL_MODE_MOVE]->set_flat(true);
- button_binds.write[0] = MENU_TOOL_MOVE;
- tool_button[TOOL_MODE_MOVE]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_MOVE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_move", TTR("Move Mode"), KEY_W));
-
- tool_button[TOOL_MODE_ROTATE] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_MODE_ROTATE]);
- tool_button[TOOL_MODE_ROTATE]->set_toggle_mode(true);
- tool_button[TOOL_MODE_ROTATE]->set_flat(true);
- button_binds.write[0] = MENU_TOOL_ROTATE;
- tool_button[TOOL_MODE_ROTATE]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_ROTATE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Rotate Mode"), KEY_E));
-
- tool_button[TOOL_MODE_SCALE] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_MODE_SCALE]);
- tool_button[TOOL_MODE_SCALE]->set_toggle_mode(true);
- tool_button[TOOL_MODE_SCALE]->set_flat(true);
- button_binds.write[0] = MENU_TOOL_SCALE;
- tool_button[TOOL_MODE_SCALE]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_SCALE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_scale", TTR("Scale Mode"), KEY_R));
-
- hbc_menu->add_child(memnew(VSeparator));
-
- tool_button[TOOL_MODE_LIST_SELECT] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_MODE_LIST_SELECT]);
- tool_button[TOOL_MODE_LIST_SELECT]->set_toggle_mode(true);
- tool_button[TOOL_MODE_LIST_SELECT]->set_flat(true);
- button_binds.write[0] = MENU_TOOL_LIST_SELECT;
- tool_button[TOOL_MODE_LIST_SELECT]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_MODE_LIST_SELECT]->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."));
-
- tool_button[TOOL_LOCK_SELECTED] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_LOCK_SELECTED]);
- button_binds.write[0] = MENU_LOCK_SELECTED;
- tool_button[TOOL_LOCK_SELECTED]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_LOCK_SELECTED]->set_tooltip(TTR("Lock the selected object in place (can't be moved)."));
-
- tool_button[TOOL_UNLOCK_SELECTED] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_UNLOCK_SELECTED]);
- button_binds.write[0] = MENU_UNLOCK_SELECTED;
- tool_button[TOOL_UNLOCK_SELECTED]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip(TTR("Unlock the selected object (can be moved)."));
-
- tool_button[TOOL_GROUP_SELECTED] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_GROUP_SELECTED]);
- button_binds.write[0] = MENU_GROUP_SELECTED;
- tool_button[TOOL_GROUP_SELECTED]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_GROUP_SELECTED]->set_tooltip(TTR("Makes sure the object's children are not selectable."));
-
- tool_button[TOOL_UNGROUP_SELECTED] = memnew(ToolButton);
- hbc_menu->add_child(tool_button[TOOL_UNGROUP_SELECTED]);
- button_binds.write[0] = MENU_UNGROUP_SELECTED;
- tool_button[TOOL_UNGROUP_SELECTED]->connect("pressed", this, "_menu_item_pressed", button_binds);
- tool_button[TOOL_UNGROUP_SELECTED]->set_tooltip(TTR("Restores the object's children's ability to be selected."));
-
- hbc_menu->add_child(memnew(VSeparator));
-
- tool_option_button[TOOL_OPT_LOCAL_COORDS] = memnew(ToolButton);
- hbc_menu->add_child(tool_option_button[TOOL_OPT_LOCAL_COORDS]);
- tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_toggle_mode(true);
- tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_flat(true);
- button_binds.write[0] = MENU_TOOL_LOCAL_COORDS;
- tool_option_button[TOOL_OPT_LOCAL_COORDS]->connect("toggled", this, "_menu_item_toggled", button_binds);
- tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_shortcut(ED_SHORTCUT("spatial_editor/local_coords", TTR("Use Local Space"), KEY_T));
-
- tool_option_button[TOOL_OPT_USE_SNAP] = memnew(ToolButton);
- hbc_menu->add_child(tool_option_button[TOOL_OPT_USE_SNAP]);
- tool_option_button[TOOL_OPT_USE_SNAP]->set_toggle_mode(true);
- tool_option_button[TOOL_OPT_USE_SNAP]->set_flat(true);
- button_binds.write[0] = MENU_TOOL_USE_SNAP;
- tool_option_button[TOOL_OPT_USE_SNAP]->connect("toggled", this, "_menu_item_toggled", button_binds);
- tool_option_button[TOOL_OPT_USE_SNAP]->set_shortcut(ED_SHORTCUT("spatial_editor/snap", TTR("Use Snap"), KEY_Y));
-
- hbc_menu->add_child(memnew(VSeparator));
-
- tool_option_button[TOOL_OPT_OVERRIDE_CAMERA] = memnew(ToolButton);
- hbc_menu->add_child(tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]);
- tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_toggle_mode(true);
- tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_flat(true);
- tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_disabled(true);
- button_binds.write[0] = MENU_TOOL_OVERRIDE_CAMERA;
- tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->connect("toggled", this, "_menu_item_toggled", button_binds);
- _update_camera_override_button(false);
-
- hbc_menu->add_child(memnew(VSeparator));
-
- // Drag and drop support;
- preview_node = memnew(Spatial);
- preview_bounds = AABB();
-
- ED_SHORTCUT("spatial_editor/bottom_view", TTR("Bottom View"), KEY_MASK_ALT + KEY_KP_7);
- ED_SHORTCUT("spatial_editor/top_view", TTR("Top View"), KEY_KP_7);
- ED_SHORTCUT("spatial_editor/rear_view", TTR("Rear View"), KEY_MASK_ALT + KEY_KP_1);
- ED_SHORTCUT("spatial_editor/front_view", TTR("Front View"), KEY_KP_1);
- ED_SHORTCUT("spatial_editor/left_view", TTR("Left View"), KEY_MASK_ALT + KEY_KP_3);
- ED_SHORTCUT("spatial_editor/right_view", TTR("Right View"), KEY_KP_3);
- ED_SHORTCUT("spatial_editor/switch_perspective_orthogonal", TTR("Switch Perspective/Orthogonal View"), KEY_KP_5);
- ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), KEY_K);
- ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), KEY_O);
- ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F);
- ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_M);
- ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F);
- ED_SHORTCUT("spatial_editor/freelook_toggle", TTR("Toggle Freelook"), KEY_MASK_SHIFT + KEY_F);
-
- PopupMenu *p;
-
- transform_menu = memnew(MenuButton);
- transform_menu->set_text(TTR("Transform"));
- transform_menu->set_switch_on_hover(true);
- hbc_menu->add_child(transform_menu);
-
- p = transform_menu->get_popup();
- p->add_shortcut(ED_SHORTCUT("spatial_editor/snap_to_floor", TTR("Snap Object to Floor"), KEY_PAGEDOWN), MENU_SNAP_TO_FLOOR);
- p->add_shortcut(ED_SHORTCUT("spatial_editor/transform_dialog", TTR("Transform Dialog...")), MENU_TRANSFORM_DIALOG);
-
- p->add_separator();
- p->add_shortcut(ED_SHORTCUT("spatial_editor/configure_snap", TTR("Configure Snap...")), MENU_TRANSFORM_CONFIGURE_SNAP);
-
- p->connect("id_pressed", this, "_menu_item_pressed");
-
- view_menu = memnew(MenuButton);
- view_menu->set_text(TTR("View"));
- view_menu->set_switch_on_hover(true);
- hbc_menu->add_child(view_menu);
-
- p = view_menu->get_popup();
-
- accept = memnew(AcceptDialog);
- editor->get_gui_base()->add_child(accept);
-
- p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KEY_MASK_CMD + KEY_1), MENU_VIEW_USE_1_VIEWPORT);
- p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KEY_MASK_CMD + KEY_2), MENU_VIEW_USE_2_VIEWPORTS);
- p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports_alt", TTR("2 Viewports (Alt)"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_2), MENU_VIEW_USE_2_VIEWPORTS_ALT);
- p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports", TTR("3 Viewports"), KEY_MASK_CMD + KEY_3), MENU_VIEW_USE_3_VIEWPORTS);
- p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports_alt", TTR("3 Viewports (Alt)"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_3), MENU_VIEW_USE_3_VIEWPORTS_ALT);
- p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KEY_MASK_CMD + KEY_4), MENU_VIEW_USE_4_VIEWPORTS);
- p->add_separator();
-
- p->add_submenu_item(TTR("Gizmos"), "GizmosMenu");
-
- p->add_separator();
- p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN);
- p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid")), MENU_VIEW_GRID);
-
- p->add_separator();
- p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings...")), MENU_VIEW_CAMERA_SETTINGS);
-
- p->set_item_checked(p->get_item_index(MENU_VIEW_ORIGIN), true);
- p->set_item_checked(p->get_item_index(MENU_VIEW_GRID), true);
-
- p->connect("id_pressed", this, "_menu_item_pressed");
-
- gizmos_menu = memnew(PopupMenu);
- p->add_child(gizmos_menu);
- gizmos_menu->set_name("GizmosMenu");
- gizmos_menu->set_hide_on_checkable_item_selection(false);
- gizmos_menu->connect("id_pressed", this, "_menu_gizmo_toggled");
-
- /* REST OF MENU */
-
- palette_split = memnew(HSplitContainer);
- palette_split->set_v_size_flags(SIZE_EXPAND_FILL);
- vbc->add_child(palette_split);
-
- shader_split = memnew(VSplitContainer);
- shader_split->set_h_size_flags(SIZE_EXPAND_FILL);
- palette_split->add_child(shader_split);
- viewport_base = memnew(SpatialEditorViewportContainer);
- shader_split->add_child(viewport_base);
- viewport_base->set_v_size_flags(SIZE_EXPAND_FILL);
- for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) {
-
- viewports[i] = memnew(SpatialEditorViewport(this, editor, i));
- viewports[i]->connect("toggle_maximize_view", this, "_toggle_maximize_view");
- viewports[i]->connect("clicked", this, "_update_camera_override_viewport");
- viewports[i]->assign_pending_data_pointers(preview_node, &preview_bounds, accept);
- viewport_base->add_child(viewports[i]);
- }
-
- /* SNAP DIALOG */
-
- snap_dialog = memnew(ConfirmationDialog);
- snap_dialog->set_title(TTR("Snap Settings"));
- add_child(snap_dialog);
-
- VBoxContainer *snap_dialog_vbc = memnew(VBoxContainer);
- snap_dialog->add_child(snap_dialog_vbc);
-
- snap_translate = memnew(LineEdit);
- snap_translate->set_text("1");
- snap_dialog_vbc->add_margin_child(TTR("Translate Snap:"), snap_translate);
-
- snap_rotate = memnew(LineEdit);
- snap_rotate->set_text("15");
- snap_dialog_vbc->add_margin_child(TTR("Rotate Snap (deg.):"), snap_rotate);
-
- snap_scale = memnew(LineEdit);
- snap_scale->set_text("10");
- snap_dialog_vbc->add_margin_child(TTR("Scale Snap (%):"), snap_scale);
-
- /* SETTINGS DIALOG */
-
- settings_dialog = memnew(ConfirmationDialog);
- settings_dialog->set_title(TTR("Viewport Settings"));
- add_child(settings_dialog);
- settings_vbc = memnew(VBoxContainer);
- settings_vbc->set_custom_minimum_size(Size2(200, 0) * EDSCALE);
- settings_dialog->add_child(settings_vbc);
-
- settings_fov = memnew(SpinBox);
- settings_fov->set_max(MAX_FOV);
- settings_fov->set_min(MIN_FOV);
- settings_fov->set_step(0.01);
- settings_fov->set_value(EDITOR_DEF("editors/3d/default_fov", 70.0));
- settings_vbc->add_margin_child(TTR("Perspective FOV (deg.):"), settings_fov);
-
- settings_znear = memnew(SpinBox);
- settings_znear->set_max(MAX_Z);
- settings_znear->set_min(MIN_Z);
- settings_znear->set_step(0.01);
- settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near", 0.05));
- settings_vbc->add_margin_child(TTR("View Z-Near:"), settings_znear);
-
- settings_zfar = memnew(SpinBox);
- settings_zfar->set_max(MAX_Z);
- settings_zfar->set_min(MIN_Z);
- settings_zfar->set_step(0.01);
- settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far", 1500));
- settings_vbc->add_margin_child(TTR("View Z-Far:"), settings_zfar);
-
- /* XFORM DIALOG */
-
- xform_dialog = memnew(ConfirmationDialog);
- xform_dialog->set_title(TTR("Transform Change"));
- add_child(xform_dialog);
-
- VBoxContainer *xform_vbc = memnew(VBoxContainer);
- xform_dialog->add_child(xform_vbc);
-
- Label *l = memnew(Label);
- l->set_text(TTR("Translate:"));
- xform_vbc->add_child(l);
-
- HBoxContainer *xform_hbc = memnew(HBoxContainer);
- xform_vbc->add_child(xform_hbc);
-
- for (int i = 0; i < 3; i++) {
-
- xform_translate[i] = memnew(LineEdit);
- xform_translate[i]->set_h_size_flags(SIZE_EXPAND_FILL);
- xform_hbc->add_child(xform_translate[i]);
- }
-
- l = memnew(Label);
- l->set_text(TTR("Rotate (deg.):"));
- xform_vbc->add_child(l);
-
- xform_hbc = memnew(HBoxContainer);
- xform_vbc->add_child(xform_hbc);
-
- for (int i = 0; i < 3; i++) {
- xform_rotate[i] = memnew(LineEdit);
- xform_rotate[i]->set_h_size_flags(SIZE_EXPAND_FILL);
- xform_hbc->add_child(xform_rotate[i]);
- }
-
- l = memnew(Label);
- l->set_text(TTR("Scale (ratio):"));
- xform_vbc->add_child(l);
-
- xform_hbc = memnew(HBoxContainer);
- xform_vbc->add_child(xform_hbc);
-
- for (int i = 0; i < 3; i++) {
- xform_scale[i] = memnew(LineEdit);
- xform_scale[i]->set_h_size_flags(SIZE_EXPAND_FILL);
- xform_hbc->add_child(xform_scale[i]);
- }
-
- l = memnew(Label);
- l->set_text(TTR("Transform Type"));
- xform_vbc->add_child(l);
-
- xform_type = memnew(OptionButton);
- xform_type->set_h_size_flags(SIZE_EXPAND_FILL);
- xform_type->add_item(TTR("Pre"));
- xform_type->add_item(TTR("Post"));
- xform_vbc->add_child(xform_type);
-
- xform_dialog->connect("confirmed", this, "_xform_dialog_action");
-
- scenario_debug = VisualServer::SCENARIO_DEBUG_DISABLED;
-
- selected = NULL;
-
- set_process_unhandled_key_input(true);
- add_to_group("_spatial_editor_group");
-
- EDITOR_DEF("editors/3d/manipulator_gizmo_size", 80);
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "editors/3d/manipulator_gizmo_size", PROPERTY_HINT_RANGE, "16,1024,1"));
- EDITOR_DEF("editors/3d/manipulator_gizmo_opacity", 0.4);
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::REAL, "editors/3d/manipulator_gizmo_opacity", PROPERTY_HINT_RANGE, "0,1,0.01"));
-
- over_gizmo_handle = -1;
-}
-
-SpatialEditor::~SpatialEditor() {
- memdelete(preview_node);
-}
-
-void SpatialEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
-
- spatial_editor->show();
- spatial_editor->set_process(true);
-
- } else {
-
- spatial_editor->hide();
- spatial_editor->set_process(false);
- }
-}
-void SpatialEditorPlugin::edit(Object *p_object) {
-
- spatial_editor->edit(Object::cast_to<Spatial>(p_object));
-}
-
-bool SpatialEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("Spatial");
-}
-
-Dictionary SpatialEditorPlugin::get_state() const {
- return spatial_editor->get_state();
-}
-
-void SpatialEditorPlugin::set_state(const Dictionary &p_state) {
-
- spatial_editor->set_state(p_state);
-}
-
-void SpatialEditor::snap_cursor_to_plane(const Plane &p_plane) {
-
- //cursor.pos=p_plane.project(cursor.pos);
-}
-
-Vector3 SpatialEditor::snap_point(Vector3 p_target, Vector3 p_start) const {
- if (is_snap_enabled()) {
- p_target.x = Math::snap_scalar(0.0, get_translate_snap(), p_target.x);
- p_target.y = Math::snap_scalar(0.0, get_translate_snap(), p_target.y);
- p_target.z = Math::snap_scalar(0.0, get_translate_snap(), p_target.z);
- }
- return p_target;
-}
-
-float SpatialEditor::get_translate_snap() const {
- float snap_value;
- if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
- snap_value = snap_translate->get_text().to_double() / 10.0;
- } else {
- snap_value = snap_translate->get_text().to_double();
- }
-
- return snap_value;
-}
-
-float SpatialEditor::get_rotate_snap() const {
- float snap_value;
- if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
- snap_value = snap_rotate->get_text().to_double() / 3.0;
- } else {
- snap_value = snap_rotate->get_text().to_double();
- }
-
- return snap_value;
-}
-
-float SpatialEditor::get_scale_snap() const {
- float snap_value;
- if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
- snap_value = snap_scale->get_text().to_double() / 2.0;
- } else {
- snap_value = snap_scale->get_text().to_double();
- }
-
- return snap_value;
-}
-
-void SpatialEditorPlugin::_bind_methods() {
-
- ClassDB::bind_method("snap_cursor_to_plane", &SpatialEditorPlugin::snap_cursor_to_plane);
-}
-
-void SpatialEditorPlugin::snap_cursor_to_plane(const Plane &p_plane) {
-
- spatial_editor->snap_cursor_to_plane(p_plane);
-}
-
-struct _GizmoPluginPriorityComparator {
-
- bool operator()(const Ref<EditorSpatialGizmoPlugin> &p_a, const Ref<EditorSpatialGizmoPlugin> &p_b) const {
- if (p_a->get_priority() == p_b->get_priority()) {
- return p_a->get_name() < p_b->get_name();
- }
- return p_a->get_priority() > p_b->get_priority();
- }
-};
-
-struct _GizmoPluginNameComparator {
-
- bool operator()(const Ref<EditorSpatialGizmoPlugin> &p_a, const Ref<EditorSpatialGizmoPlugin> &p_b) const {
- return p_a->get_name() < p_b->get_name();
- }
-};
-
-void SpatialEditor::add_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin) {
- ERR_FAIL_NULL(p_plugin.ptr());
-
- gizmo_plugins_by_priority.push_back(p_plugin);
- gizmo_plugins_by_priority.sort_custom<_GizmoPluginPriorityComparator>();
-
- gizmo_plugins_by_name.push_back(p_plugin);
- gizmo_plugins_by_name.sort_custom<_GizmoPluginNameComparator>();
-
- _update_gizmos_menu();
- SpatialEditor::get_singleton()->update_all_gizmos();
-}
-
-void SpatialEditor::remove_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin) {
- gizmo_plugins_by_priority.erase(p_plugin);
- gizmo_plugins_by_name.erase(p_plugin);
- _update_gizmos_menu();
-}
-
-SpatialEditorPlugin::SpatialEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- spatial_editor = memnew(SpatialEditor(p_node));
- spatial_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- editor->get_viewport()->add_child(spatial_editor);
-
- spatial_editor->hide();
- spatial_editor->connect("transform_key_request", editor->get_inspector_dock(), "_transform_keyed");
-}
-
-SpatialEditorPlugin::~SpatialEditorPlugin() {
-}
-
-void EditorSpatialGizmoPlugin::create_material(const String &p_name, const Color &p_color, bool p_billboard, bool p_on_top, bool p_use_vertex_color) {
-
- Color instanced_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/instanced", Color(0.7, 0.7, 0.7, 0.6));
-
- Vector<Ref<SpatialMaterial> > mats;
-
- for (int i = 0; i < 4; i++) {
- bool selected = i % 2 == 1;
- bool instanced = i < 2;
-
- Ref<SpatialMaterial> material = Ref<SpatialMaterial>(memnew(SpatialMaterial));
-
- Color color = instanced ? instanced_color : p_color;
-
- if (!selected) {
- color.a *= 0.3;
- }
-
- material->set_albedo(color);
- material->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- material->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- material->set_render_priority(SpatialMaterial::RENDER_PRIORITY_MIN + 1);
-
- if (p_use_vertex_color) {
- material->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- material->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
- }
-
- if (p_billboard) {
- material->set_billboard_mode(SpatialMaterial::BILLBOARD_ENABLED);
- }
-
- if (p_on_top && selected) {
- material->set_on_top_of_alpha();
- }
-
- mats.push_back(material);
- }
-
- materials[p_name] = mats;
-}
-
-void EditorSpatialGizmoPlugin::create_icon_material(const String &p_name, const Ref<Texture> &p_texture, bool p_on_top, const Color &p_albedo) {
-
- Color instanced_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/instanced", Color(0.7, 0.7, 0.7, 0.6));
-
- Vector<Ref<SpatialMaterial> > icons;
-
- for (int i = 0; i < 4; i++) {
- bool selected = i % 2 == 1;
- bool instanced = i < 2;
-
- Ref<SpatialMaterial> icon = Ref<SpatialMaterial>(memnew(SpatialMaterial));
-
- Color color = instanced ? instanced_color : p_albedo;
-
- if (!selected) {
- color.a *= 0.85;
- }
-
- icon->set_albedo(color);
-
- icon->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- icon->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- icon->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
- icon->set_cull_mode(SpatialMaterial::CULL_DISABLED);
- icon->set_depth_draw_mode(SpatialMaterial::DEPTH_DRAW_DISABLED);
- icon->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- icon->set_texture(SpatialMaterial::TEXTURE_ALBEDO, p_texture);
- icon->set_flag(SpatialMaterial::FLAG_FIXED_SIZE, true);
- icon->set_billboard_mode(SpatialMaterial::BILLBOARD_ENABLED);
- icon->set_render_priority(SpatialMaterial::RENDER_PRIORITY_MIN);
-
- if (p_on_top && selected) {
- icon->set_on_top_of_alpha();
- }
-
- icons.push_back(icon);
- }
-
- materials[p_name] = icons;
-}
-
-void EditorSpatialGizmoPlugin::create_handle_material(const String &p_name, bool p_billboard) {
- Ref<SpatialMaterial> handle_material = Ref<SpatialMaterial>(memnew(SpatialMaterial));
-
- handle_material->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- handle_material->set_flag(SpatialMaterial::FLAG_USE_POINT_SIZE, true);
- Ref<Texture> handle_t = SpatialEditor::get_singleton()->get_icon("Editor3DHandle", "EditorIcons");
- handle_material->set_point_size(handle_t->get_width());
- handle_material->set_texture(SpatialMaterial::TEXTURE_ALBEDO, handle_t);
- handle_material->set_albedo(Color(1, 1, 1));
- handle_material->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- handle_material->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- handle_material->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
- handle_material->set_on_top_of_alpha();
- if (p_billboard) {
- handle_material->set_billboard_mode(SpatialMaterial::BILLBOARD_ENABLED);
- handle_material->set_on_top_of_alpha();
- }
-
- materials[p_name] = Vector<Ref<SpatialMaterial> >();
- materials[p_name].push_back(handle_material);
-}
-
-void EditorSpatialGizmoPlugin::add_material(const String &p_name, Ref<SpatialMaterial> p_material) {
- materials[p_name] = Vector<Ref<SpatialMaterial> >();
- materials[p_name].push_back(p_material);
-}
-
-Ref<SpatialMaterial> EditorSpatialGizmoPlugin::get_material(const String &p_name, const Ref<EditorSpatialGizmo> &p_gizmo) {
- ERR_FAIL_COND_V(!materials.has(p_name), Ref<SpatialMaterial>());
- ERR_FAIL_COND_V(materials[p_name].size() == 0, Ref<SpatialMaterial>());
-
- if (p_gizmo.is_null() || materials[p_name].size() == 1) return materials[p_name][0];
-
- int index = (p_gizmo->is_selected() ? 1 : 0) + (p_gizmo->is_editable() ? 2 : 0);
-
- Ref<SpatialMaterial> mat = materials[p_name][index];
-
- if (current_state == ON_TOP && p_gizmo->is_selected()) {
- mat->set_flag(SpatialMaterial::FLAG_DISABLE_DEPTH_TEST, true);
- } else {
- mat->set_flag(SpatialMaterial::FLAG_DISABLE_DEPTH_TEST, false);
- }
-
- return mat;
-}
-
-String EditorSpatialGizmoPlugin::get_name() const {
- if (get_script_instance() && get_script_instance()->has_method("get_name")) {
- return get_script_instance()->call("get_name");
- }
- return TTR("Nameless gizmo");
-}
-
-int EditorSpatialGizmoPlugin::get_priority() const {
- if (get_script_instance() && get_script_instance()->has_method("get_priority")) {
- return get_script_instance()->call("get_priority");
- }
- return 0;
-}
-
-Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::get_gizmo(Spatial *p_spatial) {
-
- if (get_script_instance() && get_script_instance()->has_method("get_gizmo")) {
- return get_script_instance()->call("get_gizmo", p_spatial);
- }
-
- Ref<EditorSpatialGizmo> ref = create_gizmo(p_spatial);
-
- if (ref.is_null()) return ref;
-
- ref->set_plugin(this);
- ref->set_spatial_node(p_spatial);
- ref->set_hidden(current_state == HIDDEN);
-
- current_gizmos.push_back(ref.ptr());
- return ref;
-}
-
-void EditorSpatialGizmoPlugin::_bind_methods() {
-#define GIZMO_REF PropertyInfo(Variant::OBJECT, "gizmo", PROPERTY_HINT_RESOURCE_TYPE, "EditorSpatialGizmo")
-
- BIND_VMETHOD(MethodInfo(Variant::BOOL, "has_gizmo", PropertyInfo(Variant::OBJECT, "spatial", PROPERTY_HINT_RESOURCE_TYPE, "Spatial")));
- BIND_VMETHOD(MethodInfo(GIZMO_REF, "create_gizmo", PropertyInfo(Variant::OBJECT, "spatial", PROPERTY_HINT_RESOURCE_TYPE, "Spatial")));
-
- ClassDB::bind_method(D_METHOD("create_material", "name", "color", "billboard", "on_top", "use_vertex_color"), &EditorSpatialGizmoPlugin::create_material, DEFVAL(false), DEFVAL(false), DEFVAL(false));
- ClassDB::bind_method(D_METHOD("create_icon_material", "name", "texture", "on_top", "color"), &EditorSpatialGizmoPlugin::create_icon_material, DEFVAL(false), DEFVAL(Color(1, 1, 1, 1)));
- ClassDB::bind_method(D_METHOD("create_handle_material", "name", "billboard"), &EditorSpatialGizmoPlugin::create_handle_material, DEFVAL(false));
- ClassDB::bind_method(D_METHOD("add_material", "name", "material"), &EditorSpatialGizmoPlugin::add_material);
-
- ClassDB::bind_method(D_METHOD("get_material", "name", "gizmo"), &EditorSpatialGizmoPlugin::get_material); //, DEFVAL(Ref<EditorSpatialGizmo>()));
-
- BIND_VMETHOD(MethodInfo(Variant::STRING, "get_name"));
- BIND_VMETHOD(MethodInfo(Variant::STRING, "get_priority"));
- BIND_VMETHOD(MethodInfo(Variant::BOOL, "can_be_hidden"));
- BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_selectable_when_hidden"));
-
- BIND_VMETHOD(MethodInfo("redraw", GIZMO_REF));
- BIND_VMETHOD(MethodInfo(Variant::STRING, "get_handle_name", GIZMO_REF, PropertyInfo(Variant::INT, "index")));
-
- MethodInfo hvget(Variant::NIL, "get_handle_value", GIZMO_REF, PropertyInfo(Variant::INT, "index"));
- hvget.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
- BIND_VMETHOD(hvget);
-
- BIND_VMETHOD(MethodInfo("set_handle", GIZMO_REF, PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::VECTOR2, "point")));
- MethodInfo cm = MethodInfo("commit_handle", GIZMO_REF, PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "restore"), PropertyInfo(Variant::BOOL, "cancel"));
- cm.default_arguments.push_back(false);
- BIND_VMETHOD(cm);
-
- BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_handle_highlighted", GIZMO_REF, PropertyInfo(Variant::INT, "index")));
-
-#undef GIZMO_REF
-}
-
-bool EditorSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- if (get_script_instance() && get_script_instance()->has_method("has_gizmo")) {
- return get_script_instance()->call("has_gizmo", p_spatial);
- }
- return false;
-}
-
-Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::create_gizmo(Spatial *p_spatial) {
-
- if (get_script_instance() && get_script_instance()->has_method("create_gizmo")) {
- return get_script_instance()->call("create_gizmo", p_spatial);
- }
-
- Ref<EditorSpatialGizmo> ref;
- if (has_gizmo(p_spatial)) ref.instance();
- return ref;
-}
-
-bool EditorSpatialGizmoPlugin::can_be_hidden() const {
- if (get_script_instance() && get_script_instance()->has_method("can_be_hidden")) {
- return get_script_instance()->call("can_be_hidden");
- }
- return true;
-}
-
-bool EditorSpatialGizmoPlugin::is_selectable_when_hidden() const {
- if (get_script_instance() && get_script_instance()->has_method("is_selectable_when_hidden")) {
- return get_script_instance()->call("is_selectable_when_hidden");
- }
- return false;
-}
-
-void EditorSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
- if (get_script_instance() && get_script_instance()->has_method("redraw")) {
- Ref<EditorSpatialGizmo> ref(p_gizmo);
- get_script_instance()->call("redraw", ref);
- }
-}
-
-String EditorSpatialGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
- if (get_script_instance() && get_script_instance()->has_method("get_handle_name")) {
- return get_script_instance()->call("get_handle_name", p_gizmo, p_idx);
- }
- return "";
-}
-
-Variant EditorSpatialGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
- if (get_script_instance() && get_script_instance()->has_method("get_handle_value")) {
- return get_script_instance()->call("get_handle_value", p_gizmo, p_idx);
- }
- return Variant();
-}
-
-void EditorSpatialGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
- if (get_script_instance() && get_script_instance()->has_method("set_handle")) {
- get_script_instance()->call("set_handle", p_gizmo, p_idx, p_camera, p_point);
- }
-}
-
-void EditorSpatialGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
- if (get_script_instance() && get_script_instance()->has_method("commit_handle")) {
- get_script_instance()->call("commit_handle", p_gizmo, p_idx, p_restore, p_cancel);
- }
-}
-
-bool EditorSpatialGizmoPlugin::is_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
- if (get_script_instance() && get_script_instance()->has_method("is_handle_highlighted")) {
- return get_script_instance()->call("is_handle_highlighted", p_gizmo, p_idx);
- }
- return false;
-}
-
-void EditorSpatialGizmoPlugin::set_state(int p_state) {
- current_state = p_state;
- for (int i = 0; i < current_gizmos.size(); ++i) {
- current_gizmos[i]->set_hidden(current_state == HIDDEN);
- }
-}
-
-int EditorSpatialGizmoPlugin::get_state() const {
- return current_state;
-}
-
-void EditorSpatialGizmoPlugin::unregister_gizmo(EditorSpatialGizmo *p_gizmo) {
- current_gizmos.erase(p_gizmo);
-}
-
-EditorSpatialGizmoPlugin::EditorSpatialGizmoPlugin() {
- current_state = VISIBLE;
-}
-
-EditorSpatialGizmoPlugin::~EditorSpatialGizmoPlugin() {
- for (int i = 0; i < current_gizmos.size(); ++i) {
- current_gizmos[i]->set_plugin(NULL);
- current_gizmos[i]->get_spatial_node()->set_gizmo(NULL);
- }
- if (SpatialEditor::get_singleton()) {
- SpatialEditor::get_singleton()->update_all_gizmos();
- }
-}
diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h
deleted file mode 100644
index 5cc2b24cbb..0000000000
--- a/editor/plugins/spatial_editor_plugin.h
+++ /dev/null
@@ -1,815 +0,0 @@
-/*************************************************************************/
-/* spatial_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef SPATIAL_EDITOR_PLUGIN_H
-#define SPATIAL_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/3d/immediate_geometry.h"
-#include "scene/3d/light.h"
-#include "scene/3d/visual_instance.h"
-#include "scene/gui/panel_container.h"
-
-class Camera;
-class SpatialEditor;
-class EditorSpatialGizmoPlugin;
-class ViewportContainer;
-
-class EditorSpatialGizmo : public SpatialGizmo {
-
- GDCLASS(EditorSpatialGizmo, SpatialGizmo);
-
- bool selected;
- bool instanced;
-
-public:
- void set_selected(bool p_selected) { selected = p_selected; }
- bool is_selected() const { return selected; }
-
- struct Instance {
-
- RID instance;
- Ref<ArrayMesh> mesh;
- Ref<Material> material;
- Ref<SkinReference> skin_reference;
- RID skeleton;
- bool billboard;
- bool unscaled;
- bool can_intersect;
- bool extra_margin;
- Instance() {
-
- billboard = false;
- unscaled = false;
- can_intersect = false;
- extra_margin = false;
- }
-
- void create_instance(Spatial *p_base, bool p_hidden = false);
- };
-
- Vector<Vector3> collision_segments;
- Ref<TriangleMesh> collision_mesh;
-
- struct Handle {
- Vector3 pos;
- bool billboard;
- };
-
- Vector<Vector3> handles;
- Vector<Vector3> secondary_handles;
- float selectable_icon_size;
- bool billboard_handle;
-
- bool valid;
- bool hidden;
- Spatial *base;
- Vector<Instance> instances;
- Spatial *spatial_node;
- EditorSpatialGizmoPlugin *gizmo_plugin;
-
- void _set_spatial_node(Node *p_node) { set_spatial_node(Object::cast_to<Spatial>(p_node)); }
-
-protected:
- static void _bind_methods();
-
-public:
- void add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1));
- void add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard = false, const Ref<SkinReference> &p_skin_reference = Ref<SkinReference>(), const Ref<Material> &p_material = Ref<Material>());
- void add_collision_segments(const Vector<Vector3> &p_lines);
- void add_collision_triangles(const Ref<TriangleMesh> &p_tmesh);
- void add_unscaled_billboard(const Ref<Material> &p_material, float p_scale = 1, const Color &p_modulate = Color(1, 1, 1));
- void add_handles(const Vector<Vector3> &p_handles, const Ref<Material> &p_material, bool p_billboard = false, bool p_secondary = false);
- void add_solid_box(Ref<Material> &p_material, Vector3 p_size, Vector3 p_position = Vector3());
-
- virtual bool is_handle_highlighted(int p_idx) const;
- virtual String get_handle_name(int p_idx) const;
- virtual Variant get_handle_value(int p_idx);
- virtual void set_handle(int p_idx, Camera *p_camera, const Point2 &p_point);
- virtual void commit_handle(int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- void set_spatial_node(Spatial *p_node);
- Spatial *get_spatial_node() const { return spatial_node; }
- Ref<EditorSpatialGizmoPlugin> get_plugin() const { return gizmo_plugin; }
- Vector3 get_handle_pos(int p_idx) const;
- bool intersect_frustum(const Camera *p_camera, const Vector<Plane> &p_frustum);
- bool intersect_ray(Camera *p_camera, const Point2 &p_point, Vector3 &r_pos, Vector3 &r_normal, int *r_gizmo_handle = NULL, bool p_sec_first = false);
-
- virtual void clear();
- virtual void create();
- virtual void transform();
- virtual void redraw();
- virtual void free();
-
- virtual bool is_editable() const;
-
- void set_hidden(bool p_hidden);
- void set_plugin(EditorSpatialGizmoPlugin *p_plugin);
-
- EditorSpatialGizmo();
- ~EditorSpatialGizmo();
-};
-
-class SpatialEditorViewport : public Control {
-
- GDCLASS(SpatialEditorViewport, Control);
- friend class SpatialEditor;
- enum {
-
- VIEW_TOP,
- VIEW_BOTTOM,
- VIEW_LEFT,
- VIEW_RIGHT,
- VIEW_FRONT,
- VIEW_REAR,
- VIEW_CENTER_TO_ORIGIN,
- VIEW_CENTER_TO_SELECTION,
- VIEW_ALIGN_TRANSFORM_WITH_VIEW,
- VIEW_ALIGN_ROTATION_WITH_VIEW,
- VIEW_PERSPECTIVE,
- VIEW_ENVIRONMENT,
- VIEW_ORTHOGONAL,
- VIEW_HALF_RESOLUTION,
- VIEW_AUDIO_LISTENER,
- VIEW_AUDIO_DOPPLER,
- VIEW_GIZMOS,
- VIEW_INFORMATION,
- VIEW_FPS,
- VIEW_DISPLAY_NORMAL,
- VIEW_DISPLAY_WIREFRAME,
- VIEW_DISPLAY_OVERDRAW,
- VIEW_DISPLAY_SHADELESS,
- VIEW_LOCK_ROTATION,
- VIEW_CINEMATIC_PREVIEW
- };
-
-public:
- enum {
- GIZMO_BASE_LAYER = 27,
- GIZMO_EDIT_LAYER = 26,
- GIZMO_GRID_LAYER = 25
- };
-
- enum NavigationScheme {
- NAVIGATION_GODOT,
- NAVIGATION_MAYA,
- NAVIGATION_MODO,
- };
-
-private:
- int index;
- String name;
- void _menu_option(int p_option);
- Spatial *preview_node;
- AABB *preview_bounds;
- Vector<String> selected_files;
- AcceptDialog *accept;
-
- Node *target_node;
- Point2 drop_pos;
-
- EditorNode *editor;
- EditorData *editor_data;
- EditorSelection *editor_selection;
- UndoRedo *undo_redo;
-
- CheckBox *preview_camera;
- ViewportContainer *viewport_container;
-
- MenuButton *view_menu;
-
- Control *surface;
- Viewport *viewport;
- Camera *camera;
- bool transforming;
- bool orthogonal;
- bool lock_rotation;
- float gizmo_scale;
-
- bool freelook_active;
- real_t freelook_speed;
-
- TextureRect *crosshair;
- Label *info_label;
- Label *fps_label;
- Label *cinema_label;
- Label *locked_label;
-
- struct _RayResult {
-
- Spatial *item;
- float depth;
- int handle;
- _FORCE_INLINE_ bool operator<(const _RayResult &p_rr) const { return depth < p_rr.depth; }
- };
-
- void _update_name();
- void _compute_edit(const Point2 &p_point);
- void _clear_selected();
- void _select_clicked(bool p_append, bool p_single);
- void _select(Node *p_node, bool p_append, bool p_single);
- ObjectID _select_ray(const Point2 &p_pos, bool p_append, bool &r_includes_current, int *r_gizmo_handle = NULL, bool p_alt_select = false);
- void _find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select = false);
- Vector3 _get_ray_pos(const Vector2 &p_pos) const;
- Vector3 _get_ray(const Vector2 &p_pos) const;
- Point2 _point_to_screen(const Vector3 &p_point);
- Transform _get_camera_transform() const;
- int get_selected_count() const;
-
- Vector3 _get_camera_position() const;
- Vector3 _get_camera_normal() const;
- Vector3 _get_screen_to_space(const Vector3 &p_vector3);
-
- void _select_region();
- bool _gizmo_select(const Vector2 &p_screenpos, bool p_highlight_only = false);
-
- void _nav_pan(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
- void _nav_zoom(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
- void _nav_orbit(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
- void _nav_look(Ref<InputEventWithModifiers> p_event, const Vector2 &p_relative);
-
- float get_znear() const;
- float get_zfar() const;
- float get_fov() const;
-
- ObjectID clicked;
- Vector<_RayResult> selection_results;
- bool clicked_includes_current;
- bool clicked_wants_append;
-
- PopupMenu *selection_menu;
-
- enum NavigationZoomStyle {
- NAVIGATION_ZOOM_VERTICAL,
- NAVIGATION_ZOOM_HORIZONTAL
- };
-
- enum NavigationMode {
- NAVIGATION_NONE,
- NAVIGATION_PAN,
- NAVIGATION_ZOOM,
- NAVIGATION_ORBIT,
- NAVIGATION_LOOK
- };
- enum TransformMode {
- TRANSFORM_NONE,
- TRANSFORM_ROTATE,
- TRANSFORM_TRANSLATE,
- TRANSFORM_SCALE
-
- };
- enum TransformPlane {
- TRANSFORM_VIEW,
- TRANSFORM_X_AXIS,
- TRANSFORM_Y_AXIS,
- TRANSFORM_Z_AXIS,
- TRANSFORM_YZ,
- TRANSFORM_XZ,
- TRANSFORM_XY,
- };
-
- struct EditData {
- TransformMode mode;
- TransformPlane plane;
- Transform original;
- Vector3 click_ray;
- Vector3 click_ray_pos;
- Vector3 center;
- Vector3 orig_gizmo_pos;
- int edited_gizmo;
- Point2 mouse_pos;
- bool snap;
- Ref<EditorSpatialGizmo> gizmo;
- int gizmo_handle;
- Variant gizmo_initial_value;
- Vector3 gizmo_initial_pos;
- } _edit;
-
- struct Cursor {
-
- Vector3 pos;
- float x_rot, y_rot, distance;
- Vector3 eye_pos; // Used in freelook mode
- bool region_select;
- Point2 region_begin, region_end;
-
- Cursor() {
- x_rot = y_rot = 0.5;
- distance = 4;
- region_select = false;
- }
- };
- // Viewport camera supports movement smoothing,
- // so one cursor is the real cursor, while the other can be an interpolated version.
- Cursor cursor; // Immediate cursor
- Cursor camera_cursor; // That one may be interpolated (don't modify this one except for smoothing purposes)
-
- void scale_cursor_distance(real_t scale);
-
- void set_freelook_active(bool active_now);
- void scale_freelook_speed(real_t scale);
-
- real_t zoom_indicator_delay;
-
- RID move_gizmo_instance[3], move_plane_gizmo_instance[3], rotate_gizmo_instance[3], scale_gizmo_instance[3], scale_plane_gizmo_instance[3];
-
- String last_message;
- String message;
- float message_time;
-
- void set_message(String p_message, float p_time = 5);
-
- //
- void _update_camera(float p_interp_delta);
- Transform to_camera_transform(const Cursor &p_cursor) const;
- void _draw();
-
- void _surface_mouse_enter();
- void _surface_mouse_exit();
- void _surface_focus_enter();
- void _surface_focus_exit();
-
- void _sinput(const Ref<InputEvent> &p_event);
- void _update_freelook(real_t delta);
- SpatialEditor *spatial_editor;
-
- Camera *previewing;
- Camera *preview;
-
- bool previewing_cinema;
- bool _is_node_locked(const Node *p_node);
- void _preview_exited_scene();
- void _toggle_camera_preview(bool);
- void _toggle_cinema_preview(bool);
- void _init_gizmo_instance(int p_idx);
- void _finish_gizmo_instances();
- void _selection_result_pressed(int);
- void _selection_menu_hide();
- void _list_select(Ref<InputEventMouseButton> b);
- Point2i _get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_ev_mouse_motion) const;
-
- Vector3 _get_instance_position(const Point2 &p_pos) const;
- static AABB _calculate_spatial_bounds(const Spatial *p_parent, bool p_exclude_toplevel_transform = true);
- void _create_preview(const Vector<String> &files) const;
- void _remove_preview();
- bool _cyclical_dependency_exists(const String &p_target_scene_path, Node *p_desired_node);
- bool _create_instance(Node *parent, String &path, const Point2 &p_point);
- void _perform_drop_data();
-
- bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
- void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void update_surface() { surface->update(); }
- void update_transform_gizmo_view();
-
- void set_can_preview(Camera *p_preview);
- void set_state(const Dictionary &p_state);
- Dictionary get_state() const;
- void reset();
- bool is_freelook_active() const { return freelook_active; }
-
- void focus_selection();
-
- void assign_pending_data_pointers(
- Spatial *p_preview_node,
- AABB *p_preview_bounds,
- AcceptDialog *p_accept);
-
- Viewport *get_viewport_node() { return viewport; }
- Camera *get_camera() { return camera; } // return the default camera object.
-
- SpatialEditorViewport(SpatialEditor *p_spatial_editor, EditorNode *p_editor, int p_index);
-};
-
-class SpatialEditorSelectedItem : public Object {
-
- GDCLASS(SpatialEditorSelectedItem, Object);
-
-public:
- AABB aabb;
- Transform original; // original location when moving
- Transform original_local;
- Transform last_xform; // last transform
- Spatial *sp;
- RID sbox_instance;
-
- SpatialEditorSelectedItem() { sp = NULL; }
- ~SpatialEditorSelectedItem();
-};
-
-class SpatialEditorViewportContainer : public Container {
-
- GDCLASS(SpatialEditorViewportContainer, Container);
-
-public:
- enum View {
- VIEW_USE_1_VIEWPORT,
- VIEW_USE_2_VIEWPORTS,
- VIEW_USE_2_VIEWPORTS_ALT,
- VIEW_USE_3_VIEWPORTS,
- VIEW_USE_3_VIEWPORTS_ALT,
- VIEW_USE_4_VIEWPORTS,
- };
-
-private:
- View view;
- bool mouseover;
- float ratio_h;
- float ratio_v;
-
- bool hovering_v;
- bool hovering_h;
-
- bool dragging_v;
- bool dragging_h;
- Vector2 drag_begin_pos;
- Vector2 drag_begin_ratio;
-
- void _gui_input(const Ref<InputEvent> &p_event);
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void set_view(View p_view);
- View get_view();
-
- SpatialEditorViewportContainer();
-};
-
-class SpatialEditor : public VBoxContainer {
-
- GDCLASS(SpatialEditor, VBoxContainer);
-
-public:
- static const unsigned int VIEWPORTS_COUNT = 4;
-
- enum ToolMode {
-
- TOOL_MODE_SELECT,
- TOOL_MODE_MOVE,
- TOOL_MODE_ROTATE,
- TOOL_MODE_SCALE,
- TOOL_MODE_LIST_SELECT,
- TOOL_LOCK_SELECTED,
- TOOL_UNLOCK_SELECTED,
- TOOL_GROUP_SELECTED,
- TOOL_UNGROUP_SELECTED,
- TOOL_MAX
- };
-
- enum ToolOptions {
-
- TOOL_OPT_LOCAL_COORDS,
- TOOL_OPT_USE_SNAP,
- TOOL_OPT_OVERRIDE_CAMERA,
- TOOL_OPT_MAX
-
- };
-
-private:
- EditorNode *editor;
- EditorSelection *editor_selection;
-
- SpatialEditorViewportContainer *viewport_base;
- SpatialEditorViewport *viewports[VIEWPORTS_COUNT];
- VSplitContainer *shader_split;
- HSplitContainer *palette_split;
-
- /////
-
- ToolMode tool_mode;
- bool orthogonal;
-
- VisualServer::ScenarioDebugMode scenario_debug;
-
- RID origin;
- RID origin_instance;
- bool origin_enabled;
- RID grid[3];
- RID grid_instance[3];
- bool grid_visible[3]; //currently visible
- bool grid_enable[3]; //should be always visible if true
- bool grid_enabled;
-
- Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[3], scale_gizmo[3], scale_plane_gizmo[3];
- Ref<SpatialMaterial> gizmo_color[3];
- Ref<SpatialMaterial> plane_gizmo_color[3];
- Ref<SpatialMaterial> gizmo_color_hl[3];
- Ref<SpatialMaterial> plane_gizmo_color_hl[3];
-
- int over_gizmo_handle;
-
- Ref<ArrayMesh> selection_box;
- RID indicators;
- RID indicators_instance;
- RID cursor_mesh;
- RID cursor_instance;
- Ref<SpatialMaterial> indicator_mat;
- Ref<SpatialMaterial> cursor_material;
-
- // Scene drag and drop support
- Spatial *preview_node;
- AABB preview_bounds;
-
- struct Gizmo {
-
- bool visible;
- float scale;
- Transform transform;
- } gizmo;
-
- enum MenuOption {
-
- MENU_TOOL_SELECT,
- MENU_TOOL_MOVE,
- MENU_TOOL_ROTATE,
- MENU_TOOL_SCALE,
- MENU_TOOL_LIST_SELECT,
- MENU_TOOL_LOCAL_COORDS,
- MENU_TOOL_USE_SNAP,
- MENU_TOOL_OVERRIDE_CAMERA,
- MENU_TRANSFORM_CONFIGURE_SNAP,
- MENU_TRANSFORM_DIALOG,
- MENU_VIEW_USE_1_VIEWPORT,
- MENU_VIEW_USE_2_VIEWPORTS,
- MENU_VIEW_USE_2_VIEWPORTS_ALT,
- MENU_VIEW_USE_3_VIEWPORTS,
- MENU_VIEW_USE_3_VIEWPORTS_ALT,
- MENU_VIEW_USE_4_VIEWPORTS,
- MENU_VIEW_ORIGIN,
- MENU_VIEW_GRID,
- MENU_VIEW_GIZMOS_3D_ICONS,
- MENU_VIEW_CAMERA_SETTINGS,
- MENU_LOCK_SELECTED,
- MENU_UNLOCK_SELECTED,
- MENU_GROUP_SELECTED,
- MENU_UNGROUP_SELECTED,
- MENU_SNAP_TO_FLOOR
- };
-
- Button *tool_button[TOOL_MAX];
- Button *tool_option_button[TOOL_OPT_MAX];
-
- MenuButton *transform_menu;
- PopupMenu *gizmos_menu;
- MenuButton *view_menu;
-
- AcceptDialog *accept;
-
- ConfirmationDialog *snap_dialog;
- ConfirmationDialog *xform_dialog;
- ConfirmationDialog *settings_dialog;
-
- bool snap_enabled;
- bool snap_key_enabled;
- LineEdit *snap_translate;
- LineEdit *snap_rotate;
- LineEdit *snap_scale;
- PanelContainer *menu_panel;
-
- LineEdit *xform_translate[3];
- LineEdit *xform_rotate[3];
- LineEdit *xform_scale[3];
- OptionButton *xform_type;
-
- VBoxContainer *settings_vbc;
- SpinBox *settings_fov;
- SpinBox *settings_znear;
- SpinBox *settings_zfar;
-
- void _xform_dialog_action();
- void _menu_item_pressed(int p_option);
- void _menu_item_toggled(bool pressed, int p_option);
- void _menu_gizmo_toggled(int p_option);
- void _update_camera_override_button(bool p_game_running);
- void _update_camera_override_viewport(Object *p_viewport);
-
- HBoxContainer *hbc_menu;
-
- void _generate_selection_box();
- UndoRedo *undo_redo;
-
- int camera_override_viewport_id;
-
- void _init_indicators();
- void _update_gizmos_menu();
- void _update_gizmos_menu_theme();
- void _init_grid();
- void _finish_indicators();
- void _finish_grid();
-
- void _toggle_maximize_view(Object *p_viewport);
-
- Node *custom_camera;
-
- Object *_get_editor_data(Object *p_what);
-
- Ref<Environment> viewport_environment;
-
- Spatial *selected;
-
- void _request_gizmo(Object *p_obj);
-
- static SpatialEditor *singleton;
-
- void _node_removed(Node *p_node);
- Vector<Ref<EditorSpatialGizmoPlugin> > gizmo_plugins_by_priority;
- Vector<Ref<EditorSpatialGizmoPlugin> > gizmo_plugins_by_name;
-
- void _register_all_gizmos();
-
- SpatialEditor();
-
- bool is_any_freelook_active() const;
-
- void _refresh_menu_icons();
-
-protected:
- void _notification(int p_what);
- //void _gui_input(InputEvent p_event);
- void _unhandled_key_input(Ref<InputEvent> p_event);
-
- static void _bind_methods();
-
-public:
- static SpatialEditor *get_singleton() { return singleton; }
- void snap_cursor_to_plane(const Plane &p_plane);
-
- Vector3 snap_point(Vector3 p_target, Vector3 p_start = Vector3(0, 0, 0)) const;
-
- float get_znear() const { return settings_znear->get_value(); }
- float get_zfar() const { return settings_zfar->get_value(); }
- float get_fov() const { return settings_fov->get_value(); }
-
- Transform get_gizmo_transform() const { return gizmo.transform; }
- bool is_gizmo_visible() const { return gizmo.visible; }
-
- ToolMode get_tool_mode() const { return tool_mode; }
- bool are_local_coords_enabled() const { return tool_option_button[SpatialEditor::TOOL_OPT_LOCAL_COORDS]->is_pressed(); }
- bool is_snap_enabled() const { return snap_enabled ^ snap_key_enabled; }
- float get_translate_snap() const;
- float get_rotate_snap() const;
- float get_scale_snap() const;
-
- Ref<ArrayMesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; }
- Ref<ArrayMesh> get_move_plane_gizmo(int idx) const { return move_plane_gizmo[idx]; }
- Ref<ArrayMesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; }
- Ref<ArrayMesh> get_scale_gizmo(int idx) const { return scale_gizmo[idx]; }
- Ref<ArrayMesh> get_scale_plane_gizmo(int idx) const { return scale_plane_gizmo[idx]; }
-
- void update_transform_gizmo();
- void update_all_gizmos(Node *p_node = NULL);
- void snap_selected_nodes_to_floor();
- void select_gizmo_highlight_axis(int p_axis);
- void set_custom_camera(Node *p_camera) { custom_camera = p_camera; }
-
- void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }
- Dictionary get_state() const;
- void set_state(const Dictionary &p_state);
-
- Ref<Environment> get_viewport_environment() { return viewport_environment; }
-
- UndoRedo *get_undo_redo() { return undo_redo; }
-
- void add_control_to_menu_panel(Control *p_control);
- void remove_control_from_menu_panel(Control *p_control);
-
- VSplitContainer *get_shader_split();
- HSplitContainer *get_palette_split();
-
- Spatial *get_selected() { return selected; }
-
- int get_over_gizmo_handle() const { return over_gizmo_handle; }
- void set_over_gizmo_handle(int idx) { over_gizmo_handle = idx; }
-
- void set_can_preview(Camera *p_preview);
-
- SpatialEditorViewport *get_editor_viewport(int p_idx) {
- ERR_FAIL_INDEX_V(p_idx, static_cast<int>(VIEWPORTS_COUNT), NULL);
- return viewports[p_idx];
- }
-
- void add_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin);
- void remove_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin);
-
- void edit(Spatial *p_spatial);
- void clear();
-
- SpatialEditor(EditorNode *p_editor);
- ~SpatialEditor();
-};
-
-class SpatialEditorPlugin : public EditorPlugin {
-
- GDCLASS(SpatialEditorPlugin, EditorPlugin);
-
- SpatialEditor *spatial_editor;
- EditorNode *editor;
-
-protected:
- static void _bind_methods();
-
-public:
- void snap_cursor_to_plane(const Plane &p_plane);
-
- SpatialEditor *get_spatial_editor() { return spatial_editor; }
- virtual String get_name() const { return "3D"; }
- bool has_main_screen() const { return true; }
- virtual void make_visible(bool p_visible);
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
-
- virtual Dictionary get_state() const;
- virtual void set_state(const Dictionary &p_state);
- virtual void clear() { spatial_editor->clear(); }
-
- virtual void edited_scene_changed();
-
- SpatialEditorPlugin(EditorNode *p_node);
- ~SpatialEditorPlugin();
-};
-
-class EditorSpatialGizmoPlugin : public Resource {
-
- GDCLASS(EditorSpatialGizmoPlugin, Resource);
-
-public:
- static const int VISIBLE = 0;
- static const int HIDDEN = 1;
- static const int ON_TOP = 2;
-
-private:
- int current_state;
- List<EditorSpatialGizmo *> current_gizmos;
- HashMap<String, Vector<Ref<SpatialMaterial> > > materials;
-
-protected:
- static void _bind_methods();
- virtual bool has_gizmo(Spatial *p_spatial);
- virtual Ref<EditorSpatialGizmo> create_gizmo(Spatial *p_spatial);
-
-public:
- void create_material(const String &p_name, const Color &p_color, bool p_billboard = false, bool p_on_top = false, bool p_use_vertex_color = false);
- void create_icon_material(const String &p_name, const Ref<Texture> &p_texture, bool p_on_top = false, const Color &p_albedo = Color(1, 1, 1, 1));
- void create_handle_material(const String &p_name, bool p_billboard = false);
- void add_material(const String &p_name, Ref<SpatialMaterial> p_material);
-
- Ref<SpatialMaterial> get_material(const String &p_name, const Ref<EditorSpatialGizmo> &p_gizmo = Ref<EditorSpatialGizmo>());
-
- virtual String get_name() const;
- virtual int get_priority() const;
- virtual bool can_be_hidden() const;
- virtual bool is_selectable_when_hidden() const;
-
- virtual void redraw(EditorSpatialGizmo *p_gizmo);
- virtual String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- virtual Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- virtual void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- virtual void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
- virtual bool is_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
-
- Ref<EditorSpatialGizmo> get_gizmo(Spatial *p_spatial);
- void set_state(int p_state);
- int get_state() const;
- void unregister_gizmo(EditorSpatialGizmo *p_gizmo);
-
- EditorSpatialGizmoPlugin();
- virtual ~EditorSpatialGizmoPlugin();
-};
-
-#endif
diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp
new file mode 100644
index 0000000000..f5fafb68a5
--- /dev/null
+++ b/editor/plugins/sprite_2d_editor_plugin.cpp
@@ -0,0 +1,593 @@
+/*************************************************************************/
+/* sprite_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "sprite_2d_editor_plugin.h"
+
+#include "canvas_item_editor_plugin.h"
+#include "core/math/geometry_2d.h"
+#include "editor/editor_scale.h"
+#include "scene/2d/collision_polygon_2d.h"
+#include "scene/2d/light_occluder_2d.h"
+#include "scene/2d/mesh_instance_2d.h"
+#include "scene/2d/polygon_2d.h"
+#include "scene/gui/box_container.h"
+#include "thirdparty/misc/clipper.hpp"
+
+void Sprite2DEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ options->hide();
+ }
+}
+
+void Sprite2DEditor::edit(Sprite2D *p_sprite) {
+ node = p_sprite;
+}
+
+#define PRECISION 10.0
+
+Vector<Vector2> expand(const Vector<Vector2> &points, const Rect2i &rect, float epsilon = 2.0) {
+ int size = points.size();
+ ERR_FAIL_COND_V(size < 2, Vector<Vector2>());
+
+ ClipperLib::Path subj;
+ ClipperLib::PolyTree solution;
+ ClipperLib::PolyTree out;
+
+ for (int i = 0; i < points.size(); i++) {
+ subj << ClipperLib::IntPoint(points[i].x * PRECISION, points[i].y * PRECISION);
+ }
+ ClipperLib::ClipperOffset co;
+ co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
+ co.Execute(solution, epsilon * PRECISION);
+
+ ClipperLib::PolyNode *p = solution.GetFirst();
+
+ ERR_FAIL_COND_V(!p, points);
+
+ while (p->IsHole()) {
+ p = p->GetNext();
+ }
+
+ //turn the result into simply polygon (AKA, fix overlap)
+
+ //clamp into the specified rect
+ ClipperLib::Clipper cl;
+ cl.StrictlySimple(true);
+ cl.AddPath(p->Contour, ClipperLib::ptSubject, true);
+ //create the clipping rect
+ ClipperLib::Path clamp;
+ clamp.push_back(ClipperLib::IntPoint(0, 0));
+ clamp.push_back(ClipperLib::IntPoint(rect.size.width * PRECISION, 0));
+ clamp.push_back(ClipperLib::IntPoint(rect.size.width * PRECISION, rect.size.height * PRECISION));
+ clamp.push_back(ClipperLib::IntPoint(0, rect.size.height * PRECISION));
+ cl.AddPath(clamp, ClipperLib::ptClip, true);
+ cl.Execute(ClipperLib::ctIntersection, out);
+
+ Vector<Vector2> outPoints;
+ ClipperLib::PolyNode *p2 = out.GetFirst();
+ ERR_FAIL_COND_V(!p2, points);
+
+ while (p2->IsHole()) {
+ p2 = p2->GetNext();
+ }
+
+ int lasti = p2->Contour.size() - 1;
+ Vector2 prev = Vector2(p2->Contour[lasti].X / PRECISION, p2->Contour[lasti].Y / PRECISION);
+ for (uint64_t i = 0; i < p2->Contour.size(); i++) {
+ Vector2 cur = Vector2(p2->Contour[i].X / PRECISION, p2->Contour[i].Y / PRECISION);
+ if (cur.distance_to(prev) > 0.5) {
+ outPoints.push_back(cur);
+ prev = cur;
+ }
+ }
+ return outPoints;
+}
+
+void Sprite2DEditor::_menu_option(int p_option) {
+ if (!node) {
+ return;
+ }
+
+ selected_menu_item = (Menu)p_option;
+
+ switch (p_option) {
+ case MENU_OPTION_CONVERT_TO_MESH_2D: {
+ debug_uv_dialog->get_ok()->set_text(TTR("Create Mesh2D"));
+ debug_uv_dialog->set_title(TTR("Mesh2D Preview"));
+
+ _update_mesh_data();
+ debug_uv_dialog->popup_centered();
+ debug_uv->update();
+
+ } break;
+ case MENU_OPTION_CONVERT_TO_POLYGON_2D: {
+ debug_uv_dialog->get_ok()->set_text(TTR("Create Polygon2D"));
+ debug_uv_dialog->set_title(TTR("Polygon2D Preview"));
+
+ _update_mesh_data();
+ debug_uv_dialog->popup_centered();
+ debug_uv->update();
+ } break;
+ case MENU_OPTION_CREATE_COLLISION_POLY_2D: {
+ debug_uv_dialog->get_ok()->set_text(TTR("Create CollisionPolygon2D"));
+ debug_uv_dialog->set_title(TTR("CollisionPolygon2D Preview"));
+
+ _update_mesh_data();
+ debug_uv_dialog->popup_centered();
+ debug_uv->update();
+
+ } break;
+ case MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D: {
+ debug_uv_dialog->get_ok()->set_text(TTR("Create LightOccluder2D"));
+ debug_uv_dialog->set_title(TTR("LightOccluder2D Preview"));
+
+ _update_mesh_data();
+ debug_uv_dialog->popup_centered();
+ debug_uv->update();
+
+ } break;
+ }
+}
+
+void Sprite2DEditor::_update_mesh_data() {
+ Ref<Texture2D> texture = node->get_texture();
+ if (texture.is_null()) {
+ err_dialog->set_text(TTR("Sprite2D is empty!"));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ if (node->get_hframes() > 1 || node->get_vframes() > 1) {
+ err_dialog->set_text(TTR("Can't convert a sprite using animation frames to mesh."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Ref<Image> image = texture->get_data();
+ ERR_FAIL_COND(image.is_null());
+ Rect2 rect;
+ if (node->is_region()) {
+ rect = node->get_region_rect();
+ } else {
+ rect.size = Size2(image->get_width(), image->get_height());
+ }
+
+ Ref<BitMap> bm;
+ bm.instance();
+ bm->create_from_image_alpha(image);
+
+ int shrink = shrink_pixels->get_value();
+ if (shrink > 0) {
+ bm->shrink_mask(shrink, rect);
+ }
+
+ int grow = grow_pixels->get_value();
+ if (grow > 0) {
+ bm->grow_mask(grow, rect);
+ }
+
+ float epsilon = simplification->get_value();
+
+ Vector<Vector<Vector2>> lines = bm->clip_opaque_to_polygons(rect, epsilon);
+
+ uv_lines.clear();
+
+ computed_vertices.clear();
+ computed_uv.clear();
+ computed_indices.clear();
+
+ Size2 img_size = Vector2(image->get_width(), image->get_height());
+ for (int i = 0; i < lines.size(); i++) {
+ lines.write[i] = expand(lines[i], rect, epsilon);
+ }
+
+ if (selected_menu_item == MENU_OPTION_CONVERT_TO_MESH_2D) {
+ for (int j = 0; j < lines.size(); j++) {
+ int index_ofs = computed_vertices.size();
+
+ for (int i = 0; i < lines[j].size(); i++) {
+ Vector2 vtx = lines[j][i];
+ computed_uv.push_back(vtx / img_size);
+
+ vtx -= rect.position; //offset by rect position
+
+ //flip if flipped
+ if (node->is_flipped_h()) {
+ vtx.x = rect.size.x - vtx.x - 1.0;
+ }
+ if (node->is_flipped_v()) {
+ vtx.y = rect.size.y - vtx.y - 1.0;
+ }
+
+ if (node->is_centered()) {
+ vtx -= rect.size / 2.0;
+ }
+
+ computed_vertices.push_back(vtx);
+ }
+
+ Vector<int> poly = Geometry2D::triangulate_polygon(lines[j]);
+
+ for (int i = 0; i < poly.size(); i += 3) {
+ for (int k = 0; k < 3; k++) {
+ int idx = i + k;
+ int idxn = i + (k + 1) % 3;
+ uv_lines.push_back(lines[j][poly[idx]]);
+ uv_lines.push_back(lines[j][poly[idxn]]);
+
+ computed_indices.push_back(poly[idx] + index_ofs);
+ }
+ }
+ }
+ }
+
+ outline_lines.clear();
+ computed_outline_lines.clear();
+
+ if (selected_menu_item == MENU_OPTION_CONVERT_TO_POLYGON_2D || selected_menu_item == MENU_OPTION_CREATE_COLLISION_POLY_2D || selected_menu_item == MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D) {
+ outline_lines.resize(lines.size());
+ computed_outline_lines.resize(lines.size());
+ for (int pi = 0; pi < lines.size(); pi++) {
+ Vector<Vector2> ol;
+ Vector<Vector2> col;
+
+ ol.resize(lines[pi].size());
+ col.resize(lines[pi].size());
+
+ for (int i = 0; i < lines[pi].size(); i++) {
+ Vector2 vtx = lines[pi][i];
+
+ ol.write[i] = vtx;
+
+ vtx -= rect.position; //offset by rect position
+
+ //flip if flipped
+ if (node->is_flipped_h()) {
+ vtx.x = rect.size.x - vtx.x - 1.0;
+ }
+ if (node->is_flipped_v()) {
+ vtx.y = rect.size.y - vtx.y - 1.0;
+ }
+
+ if (node->is_centered()) {
+ vtx -= rect.size / 2.0;
+ }
+
+ col.write[i] = vtx;
+ }
+
+ outline_lines.write[pi] = ol;
+ computed_outline_lines.write[pi] = col;
+ }
+ }
+
+ debug_uv->update();
+}
+
+void Sprite2DEditor::_create_node() {
+ switch (selected_menu_item) {
+ case MENU_OPTION_CONVERT_TO_MESH_2D: {
+ _convert_to_mesh_2d_node();
+ } break;
+ case MENU_OPTION_CONVERT_TO_POLYGON_2D: {
+ _convert_to_polygon_2d_node();
+ } break;
+ case MENU_OPTION_CREATE_COLLISION_POLY_2D: {
+ _create_collision_polygon_2d_node();
+ } break;
+ case MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D: {
+ _create_light_occluder_2d_node();
+ } break;
+ }
+}
+
+void Sprite2DEditor::_convert_to_mesh_2d_node() {
+ if (computed_vertices.size() < 3) {
+ err_dialog->set_text(TTR("Invalid geometry, can't replace by mesh."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Ref<ArrayMesh> mesh;
+ mesh.instance();
+
+ Array a;
+ a.resize(Mesh::ARRAY_MAX);
+ a[Mesh::ARRAY_VERTEX] = computed_vertices;
+ a[Mesh::ARRAY_TEX_UV] = computed_uv;
+ a[Mesh::ARRAY_INDEX] = computed_indices;
+
+ mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, a, Array(), Dictionary(), Mesh::ARRAY_FLAG_USE_2D_VERTICES);
+
+ MeshInstance2D *mesh_instance = memnew(MeshInstance2D);
+ mesh_instance->set_mesh(mesh);
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Convert to Mesh2D"));
+ ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", node, mesh_instance, true, false);
+ ur->add_do_reference(mesh_instance);
+ ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", mesh_instance, node, false, false);
+ ur->add_undo_reference(node);
+ ur->commit_action();
+}
+
+void Sprite2DEditor::_convert_to_polygon_2d_node() {
+ if (computed_outline_lines.empty()) {
+ err_dialog->set_text(TTR("Invalid geometry, can't create polygon."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ Polygon2D *polygon_2d_instance = memnew(Polygon2D);
+
+ int total_point_count = 0;
+ for (int i = 0; i < computed_outline_lines.size(); i++) {
+ total_point_count += computed_outline_lines[i].size();
+ }
+
+ PackedVector2Array polygon;
+ polygon.resize(total_point_count);
+ Vector2 *polygon_write = polygon.ptrw();
+
+ PackedVector2Array uvs;
+ uvs.resize(total_point_count);
+ Vector2 *uvs_write = uvs.ptrw();
+
+ int current_point_index = 0;
+
+ Array polys;
+ polys.resize(computed_outline_lines.size());
+
+ for (int i = 0; i < computed_outline_lines.size(); i++) {
+ Vector<Vector2> outline = computed_outline_lines[i];
+ Vector<Vector2> uv_outline = outline_lines[i];
+
+ PackedInt32Array pia;
+ pia.resize(outline.size());
+ int *pia_write = pia.ptrw();
+
+ for (int pi = 0; pi < outline.size(); pi++) {
+ polygon_write[current_point_index] = outline[pi];
+ uvs_write[current_point_index] = uv_outline[pi];
+ pia_write[pi] = current_point_index;
+ current_point_index++;
+ }
+
+ polys[i] = pia;
+ }
+
+ polygon_2d_instance->set_uv(uvs);
+ polygon_2d_instance->set_polygon(polygon);
+ polygon_2d_instance->set_polygons(polys);
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Convert to Polygon2D"));
+ ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", node, polygon_2d_instance, true, false);
+ ur->add_do_reference(polygon_2d_instance);
+ ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", polygon_2d_instance, node, false, false);
+ ur->add_undo_reference(node);
+ ur->commit_action();
+}
+
+void Sprite2DEditor::_create_collision_polygon_2d_node() {
+ if (computed_outline_lines.empty()) {
+ err_dialog->set_text(TTR("Invalid geometry, can't create collision polygon."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ for (int i = 0; i < computed_outline_lines.size(); i++) {
+ Vector<Vector2> outline = computed_outline_lines[i];
+
+ CollisionPolygon2D *collision_polygon_2d_instance = memnew(CollisionPolygon2D);
+ collision_polygon_2d_instance->set_polygon(outline);
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Create CollisionPolygon2D Sibling"));
+ ur->add_do_method(this, "_add_as_sibling_or_child", node, collision_polygon_2d_instance);
+ ur->add_do_reference(collision_polygon_2d_instance);
+ ur->add_undo_method(node != this->get_tree()->get_edited_scene_root() ? node->get_parent() : this->get_tree()->get_edited_scene_root(), "remove_child", collision_polygon_2d_instance);
+ ur->commit_action();
+ }
+}
+
+void Sprite2DEditor::_create_light_occluder_2d_node() {
+ if (computed_outline_lines.empty()) {
+ err_dialog->set_text(TTR("Invalid geometry, can't create light occluder."));
+ err_dialog->popup_centered();
+ return;
+ }
+
+ for (int i = 0; i < computed_outline_lines.size(); i++) {
+ Vector<Vector2> outline = computed_outline_lines[i];
+
+ Ref<OccluderPolygon2D> polygon;
+ polygon.instance();
+
+ PackedVector2Array a;
+ a.resize(outline.size());
+ Vector2 *aw = a.ptrw();
+ for (int io = 0; io < outline.size(); io++) {
+ aw[io] = outline[io];
+ }
+ polygon->set_polygon(a);
+
+ LightOccluder2D *light_occluder_2d_instance = memnew(LightOccluder2D);
+ light_occluder_2d_instance->set_occluder_polygon(polygon);
+
+ UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+ ur->create_action(TTR("Create LightOccluder2D Sibling"));
+ ur->add_do_method(this, "_add_as_sibling_or_child", node, light_occluder_2d_instance);
+ ur->add_do_reference(light_occluder_2d_instance);
+ ur->add_undo_method(node != this->get_tree()->get_edited_scene_root() ? node->get_parent() : this->get_tree()->get_edited_scene_root(), "remove_child", light_occluder_2d_instance);
+ ur->commit_action();
+ }
+}
+
+void Sprite2DEditor::_add_as_sibling_or_child(Node *p_own_node, Node *p_new_node) {
+ // Can't make sibling if own node is scene root
+ if (p_own_node != this->get_tree()->get_edited_scene_root()) {
+ p_own_node->get_parent()->add_child(p_new_node, true);
+ Object::cast_to<Node2D>(p_new_node)->set_transform(Object::cast_to<Node2D>(p_own_node)->get_transform());
+ } else {
+ p_own_node->add_child(p_new_node, true);
+ }
+
+ p_new_node->set_owner(this->get_tree()->get_edited_scene_root());
+}
+
+void Sprite2DEditor::_debug_uv_draw() {
+ Ref<Texture2D> tex = node->get_texture();
+ ERR_FAIL_COND(!tex.is_valid());
+
+ Point2 draw_pos_offset = Point2(1.0, 1.0);
+ Size2 draw_size_offset = Size2(2.0, 2.0);
+
+ debug_uv->set_clip_contents(true);
+ debug_uv->draw_texture(tex, draw_pos_offset);
+ debug_uv->set_custom_minimum_size(tex->get_size() + draw_size_offset);
+ debug_uv->draw_set_transform(draw_pos_offset, 0, Size2(1.0, 1.0));
+
+ Color color = Color(1.0, 0.8, 0.7);
+
+ if (selected_menu_item == MENU_OPTION_CONVERT_TO_MESH_2D && uv_lines.size() > 0) {
+ debug_uv->draw_multiline(uv_lines, color);
+
+ } else if ((selected_menu_item == MENU_OPTION_CONVERT_TO_POLYGON_2D || selected_menu_item == MENU_OPTION_CREATE_COLLISION_POLY_2D || selected_menu_item == MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D) && outline_lines.size() > 0) {
+ for (int i = 0; i < outline_lines.size(); i++) {
+ Vector<Vector2> outline = outline_lines[i];
+
+ debug_uv->draw_polyline(outline, color);
+ debug_uv->draw_line(outline[0], outline[outline.size() - 1], color);
+ }
+ }
+}
+
+void Sprite2DEditor::_bind_methods() {
+ ClassDB::bind_method("_add_as_sibling_or_child", &Sprite2DEditor::_add_as_sibling_or_child);
+}
+
+Sprite2DEditor::Sprite2DEditor() {
+ options = memnew(MenuButton);
+
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(options);
+
+ options->set_text(TTR("Sprite2D"));
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Sprite2D", "EditorIcons"));
+
+ options->get_popup()->add_item(TTR("Convert to Mesh2D"), MENU_OPTION_CONVERT_TO_MESH_2D);
+ options->get_popup()->add_item(TTR("Convert to Polygon2D"), MENU_OPTION_CONVERT_TO_POLYGON_2D);
+ options->get_popup()->add_item(TTR("Create CollisionPolygon2D Sibling"), MENU_OPTION_CREATE_COLLISION_POLY_2D);
+ options->get_popup()->add_item(TTR("Create LightOccluder2D Sibling"), MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D);
+ options->set_switch_on_hover(true);
+
+ options->get_popup()->connect("id_pressed", callable_mp(this, &Sprite2DEditor::_menu_option));
+
+ err_dialog = memnew(AcceptDialog);
+ add_child(err_dialog);
+
+ debug_uv_dialog = memnew(ConfirmationDialog);
+ debug_uv_dialog->get_ok()->set_text(TTR("Create Mesh2D"));
+ debug_uv_dialog->set_title("Mesh 2D Preview");
+ VBoxContainer *vb = memnew(VBoxContainer);
+ debug_uv_dialog->add_child(vb);
+ ScrollContainer *scroll = memnew(ScrollContainer);
+ scroll->set_custom_minimum_size(Size2(800, 500) * EDSCALE);
+ scroll->set_enable_h_scroll(true);
+ scroll->set_enable_v_scroll(true);
+ vb->add_margin_child(TTR("Preview:"), scroll, true);
+ debug_uv = memnew(Control);
+ debug_uv->connect("draw", callable_mp(this, &Sprite2DEditor::_debug_uv_draw));
+ scroll->add_child(debug_uv);
+ debug_uv_dialog->connect("confirmed", callable_mp(this, &Sprite2DEditor::_create_node));
+
+ HBoxContainer *hb = memnew(HBoxContainer);
+ hb->add_child(memnew(Label(TTR("Simplification: "))));
+ simplification = memnew(SpinBox);
+ simplification->set_min(0.01);
+ simplification->set_max(10.00);
+ simplification->set_step(0.01);
+ simplification->set_value(2);
+ hb->add_child(simplification);
+ hb->add_spacer();
+ hb->add_child(memnew(Label(TTR("Shrink (Pixels): "))));
+ shrink_pixels = memnew(SpinBox);
+ shrink_pixels->set_min(0);
+ shrink_pixels->set_max(10);
+ shrink_pixels->set_step(1);
+ shrink_pixels->set_value(0);
+ hb->add_child(shrink_pixels);
+ hb->add_spacer();
+ hb->add_child(memnew(Label(TTR("Grow (Pixels): "))));
+ grow_pixels = memnew(SpinBox);
+ grow_pixels->set_min(0);
+ grow_pixels->set_max(10);
+ grow_pixels->set_step(1);
+ grow_pixels->set_value(2);
+ hb->add_child(grow_pixels);
+ hb->add_spacer();
+ update_preview = memnew(Button);
+ update_preview->set_text(TTR("Update Preview"));
+ update_preview->connect("pressed", callable_mp(this, &Sprite2DEditor::_update_mesh_data));
+ hb->add_child(update_preview);
+ vb->add_margin_child(TTR("Settings:"), hb);
+
+ add_child(debug_uv_dialog);
+}
+
+void Sprite2DEditorPlugin::edit(Object *p_object) {
+ sprite_editor->edit(Object::cast_to<Sprite2D>(p_object));
+}
+
+bool Sprite2DEditorPlugin::handles(Object *p_object) const {
+ return p_object->is_class("Sprite2D");
+}
+
+void Sprite2DEditorPlugin::make_visible(bool p_visible) {
+ if (p_visible) {
+ sprite_editor->options->show();
+ } else {
+ sprite_editor->options->hide();
+ sprite_editor->edit(nullptr);
+ }
+}
+
+Sprite2DEditorPlugin::Sprite2DEditorPlugin(EditorNode *p_node) {
+ editor = p_node;
+ sprite_editor = memnew(Sprite2DEditor);
+ editor->get_viewport()->add_child(sprite_editor);
+ make_visible(false);
+
+ //sprite_editor->options->hide();
+}
+
+Sprite2DEditorPlugin::~Sprite2DEditorPlugin() {
+}
diff --git a/editor/plugins/sprite_2d_editor_plugin.h b/editor/plugins/sprite_2d_editor_plugin.h
new file mode 100644
index 0000000000..8769f19b5c
--- /dev/null
+++ b/editor/plugins/sprite_2d_editor_plugin.h
@@ -0,0 +1,115 @@
+/*************************************************************************/
+/* sprite_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SPRITE_EDITOR_PLUGIN_H
+#define SPRITE_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/2d/sprite_2d.h"
+#include "scene/gui/spin_box.h"
+
+class Sprite2DEditor : public Control {
+ GDCLASS(Sprite2DEditor, Control);
+
+ enum Menu {
+ MENU_OPTION_CONVERT_TO_MESH_2D,
+ MENU_OPTION_CONVERT_TO_POLYGON_2D,
+ MENU_OPTION_CREATE_COLLISION_POLY_2D,
+ MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D
+ };
+
+ Menu selected_menu_item;
+
+ Sprite2D *node;
+
+ MenuButton *options;
+
+ ConfirmationDialog *outline_dialog;
+
+ AcceptDialog *err_dialog;
+
+ ConfirmationDialog *debug_uv_dialog;
+ Control *debug_uv;
+ Vector<Vector2> uv_lines;
+ Vector<Vector<Vector2>> outline_lines;
+ Vector<Vector<Vector2>> computed_outline_lines;
+ Vector<Vector2> computed_vertices;
+ Vector<Vector2> computed_uv;
+ Vector<int> computed_indices;
+
+ SpinBox *simplification;
+ SpinBox *grow_pixels;
+ SpinBox *shrink_pixels;
+ Button *update_preview;
+
+ void _menu_option(int p_option);
+
+ //void _create_uv_lines();
+ friend class Sprite2DEditorPlugin;
+
+ void _debug_uv_draw();
+ void _update_mesh_data();
+
+ void _create_node();
+ void _convert_to_mesh_2d_node();
+ void _convert_to_polygon_2d_node();
+ void _create_collision_polygon_2d_node();
+ void _create_light_occluder_2d_node();
+
+ void _add_as_sibling_or_child(Node *p_own_node, Node *p_new_node);
+
+protected:
+ void _node_removed(Node *p_node);
+ static void _bind_methods();
+
+public:
+ void edit(Sprite2D *p_sprite);
+ Sprite2DEditor();
+};
+
+class Sprite2DEditorPlugin : public EditorPlugin {
+ GDCLASS(Sprite2DEditorPlugin, EditorPlugin);
+
+ Sprite2DEditor *sprite_editor;
+ EditorNode *editor;
+
+public:
+ virtual String get_name() const override { return "Sprite2D"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+
+ Sprite2DEditorPlugin(EditorNode *p_node);
+ ~Sprite2DEditorPlugin();
+};
+
+#endif // SPRITE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/sprite_editor_plugin.cpp b/editor/plugins/sprite_editor_plugin.cpp
deleted file mode 100644
index 6757b180a3..0000000000
--- a/editor/plugins/sprite_editor_plugin.cpp
+++ /dev/null
@@ -1,615 +0,0 @@
-/*************************************************************************/
-/* sprite_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "sprite_editor_plugin.h"
-
-#include "canvas_item_editor_plugin.h"
-#include "editor/editor_scale.h"
-#include "scene/2d/collision_polygon_2d.h"
-#include "scene/2d/light_occluder_2d.h"
-#include "scene/2d/mesh_instance_2d.h"
-#include "scene/2d/polygon_2d.h"
-#include "scene/gui/box_container.h"
-#include "thirdparty/misc/clipper.hpp"
-
-void SpriteEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- options->hide();
- }
-}
-
-void SpriteEditor::edit(Sprite *p_sprite) {
-
- node = p_sprite;
-}
-
-#define PRECISION 10.0
-
-Vector<Vector2> expand(const Vector<Vector2> &points, const Rect2i &rect, float epsilon = 2.0) {
- int size = points.size();
- ERR_FAIL_COND_V(size < 2, Vector<Vector2>());
-
- ClipperLib::Path subj;
- ClipperLib::PolyTree solution;
- ClipperLib::PolyTree out;
-
- for (int i = 0; i < points.size(); i++) {
-
- subj << ClipperLib::IntPoint(points[i].x * PRECISION, points[i].y * PRECISION);
- }
- ClipperLib::ClipperOffset co;
- co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
- co.Execute(solution, epsilon * PRECISION);
-
- ClipperLib::PolyNode *p = solution.GetFirst();
-
- ERR_FAIL_COND_V(!p, points);
-
- while (p->IsHole()) {
- p = p->GetNext();
- }
-
- //turn the result into simply polygon (AKA, fix overlap)
-
- //clamp into the specified rect
- ClipperLib::Clipper cl;
- cl.StrictlySimple(true);
- cl.AddPath(p->Contour, ClipperLib::ptSubject, true);
- //create the clipping rect
- ClipperLib::Path clamp;
- clamp.push_back(ClipperLib::IntPoint(0, 0));
- clamp.push_back(ClipperLib::IntPoint(rect.size.width * PRECISION, 0));
- clamp.push_back(ClipperLib::IntPoint(rect.size.width * PRECISION, rect.size.height * PRECISION));
- clamp.push_back(ClipperLib::IntPoint(0, rect.size.height * PRECISION));
- cl.AddPath(clamp, ClipperLib::ptClip, true);
- cl.Execute(ClipperLib::ctIntersection, out);
-
- Vector<Vector2> outPoints;
- ClipperLib::PolyNode *p2 = out.GetFirst();
- ERR_FAIL_COND_V(!p2, points);
-
- while (p2->IsHole()) {
- p2 = p2->GetNext();
- }
-
- int lasti = p2->Contour.size() - 1;
- Vector2 prev = Vector2(p2->Contour[lasti].X / PRECISION, p2->Contour[lasti].Y / PRECISION);
- for (uint64_t i = 0; i < p2->Contour.size(); i++) {
-
- Vector2 cur = Vector2(p2->Contour[i].X / PRECISION, p2->Contour[i].Y / PRECISION);
- if (cur.distance_to(prev) > 0.5) {
- outPoints.push_back(cur);
- prev = cur;
- }
- }
- return outPoints;
-}
-
-void SpriteEditor::_menu_option(int p_option) {
-
- if (!node) {
- return;
- }
-
- selected_menu_item = (Menu)p_option;
-
- switch (p_option) {
- case MENU_OPTION_CONVERT_TO_MESH_2D: {
-
- debug_uv_dialog->get_ok()->set_text(TTR("Create Mesh2D"));
- debug_uv_dialog->set_title(TTR("Mesh2D Preview"));
-
- _update_mesh_data();
- debug_uv_dialog->popup_centered();
- debug_uv->update();
-
- } break;
- case MENU_OPTION_CONVERT_TO_POLYGON_2D: {
-
- debug_uv_dialog->get_ok()->set_text(TTR("Create Polygon2D"));
- debug_uv_dialog->set_title(TTR("Polygon2D Preview"));
-
- _update_mesh_data();
- debug_uv_dialog->popup_centered();
- debug_uv->update();
- } break;
- case MENU_OPTION_CREATE_COLLISION_POLY_2D: {
-
- debug_uv_dialog->get_ok()->set_text(TTR("Create CollisionPolygon2D"));
- debug_uv_dialog->set_title(TTR("CollisionPolygon2D Preview"));
-
- _update_mesh_data();
- debug_uv_dialog->popup_centered();
- debug_uv->update();
-
- } break;
- case MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D: {
-
- debug_uv_dialog->get_ok()->set_text(TTR("Create LightOccluder2D"));
- debug_uv_dialog->set_title(TTR("LightOccluder2D Preview"));
-
- _update_mesh_data();
- debug_uv_dialog->popup_centered();
- debug_uv->update();
-
- } break;
- }
-}
-
-void SpriteEditor::_update_mesh_data() {
-
- Ref<Texture> texture = node->get_texture();
- if (texture.is_null()) {
- err_dialog->set_text(TTR("Sprite is empty!"));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- if (node->get_hframes() > 1 || node->get_vframes() > 1) {
- err_dialog->set_text(TTR("Can't convert a sprite using animation frames to mesh."));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- Ref<Image> image = texture->get_data();
- ERR_FAIL_COND(image.is_null());
- Rect2 rect;
- if (node->is_region())
- rect = node->get_region_rect();
- else
- rect.size = Size2(image->get_width(), image->get_height());
-
- Ref<BitMap> bm;
- bm.instance();
- bm->create_from_image_alpha(image);
-
- int shrink = shrink_pixels->get_value();
- if (shrink > 0) {
- bm->shrink_mask(shrink, rect);
- }
-
- int grow = grow_pixels->get_value();
- if (grow > 0) {
- bm->grow_mask(grow, rect);
- }
-
- float epsilon = simplification->get_value();
-
- Vector<Vector<Vector2> > lines = bm->clip_opaque_to_polygons(rect, epsilon);
-
- uv_lines.clear();
-
- computed_vertices.clear();
- computed_uv.clear();
- computed_indices.clear();
-
- Size2 img_size = Vector2(image->get_width(), image->get_height());
- for (int i = 0; i < lines.size(); i++) {
- lines.write[i] = expand(lines[i], rect, epsilon);
- }
-
- if (selected_menu_item == MENU_OPTION_CONVERT_TO_MESH_2D) {
-
- for (int j = 0; j < lines.size(); j++) {
- int index_ofs = computed_vertices.size();
-
- for (int i = 0; i < lines[j].size(); i++) {
- Vector2 vtx = lines[j][i];
- computed_uv.push_back(vtx / img_size);
-
- vtx -= rect.position; //offset by rect position
-
- //flip if flipped
- if (node->is_flipped_h())
- vtx.x = rect.size.x - vtx.x - 1.0;
- if (node->is_flipped_v())
- vtx.y = rect.size.y - vtx.y - 1.0;
-
- if (node->is_centered())
- vtx -= rect.size / 2.0;
-
- computed_vertices.push_back(vtx);
- }
-
- Vector<int> poly = Geometry::triangulate_polygon(lines[j]);
-
- for (int i = 0; i < poly.size(); i += 3) {
- for (int k = 0; k < 3; k++) {
- int idx = i + k;
- int idxn = i + (k + 1) % 3;
- uv_lines.push_back(lines[j][poly[idx]]);
- uv_lines.push_back(lines[j][poly[idxn]]);
-
- computed_indices.push_back(poly[idx] + index_ofs);
- }
- }
- }
- }
-
- outline_lines.clear();
- computed_outline_lines.clear();
-
- if (selected_menu_item == MENU_OPTION_CONVERT_TO_POLYGON_2D || selected_menu_item == MENU_OPTION_CREATE_COLLISION_POLY_2D || selected_menu_item == MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D) {
- outline_lines.resize(lines.size());
- computed_outline_lines.resize(lines.size());
- for (int pi = 0; pi < lines.size(); pi++) {
-
- Vector<Vector2> ol;
- Vector<Vector2> col;
-
- ol.resize(lines[pi].size());
- col.resize(lines[pi].size());
-
- for (int i = 0; i < lines[pi].size(); i++) {
- Vector2 vtx = lines[pi][i];
-
- ol.write[i] = vtx;
-
- vtx -= rect.position; //offset by rect position
-
- //flip if flipped
- if (node->is_flipped_h())
- vtx.x = rect.size.x - vtx.x - 1.0;
- if (node->is_flipped_v())
- vtx.y = rect.size.y - vtx.y - 1.0;
-
- if (node->is_centered())
- vtx -= rect.size / 2.0;
-
- col.write[i] = vtx;
- }
-
- outline_lines.write[pi] = ol;
- computed_outline_lines.write[pi] = col;
- }
- }
-
- debug_uv->update();
-}
-
-void SpriteEditor::_create_node() {
- switch (selected_menu_item) {
- case MENU_OPTION_CONVERT_TO_MESH_2D: {
- _convert_to_mesh_2d_node();
- } break;
- case MENU_OPTION_CONVERT_TO_POLYGON_2D: {
- _convert_to_polygon_2d_node();
- } break;
- case MENU_OPTION_CREATE_COLLISION_POLY_2D: {
- _create_collision_polygon_2d_node();
- } break;
- case MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D: {
- _create_light_occluder_2d_node();
- } break;
- }
-}
-
-void SpriteEditor::_convert_to_mesh_2d_node() {
-
- if (computed_vertices.size() < 3) {
- err_dialog->set_text(TTR("Invalid geometry, can't replace by mesh."));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- Ref<ArrayMesh> mesh;
- mesh.instance();
-
- Array a;
- a.resize(Mesh::ARRAY_MAX);
- a[Mesh::ARRAY_VERTEX] = computed_vertices;
- a[Mesh::ARRAY_TEX_UV] = computed_uv;
- a[Mesh::ARRAY_INDEX] = computed_indices;
-
- mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, a, Array(), Mesh::ARRAY_FLAG_USE_2D_VERTICES);
-
- MeshInstance2D *mesh_instance = memnew(MeshInstance2D);
- mesh_instance->set_mesh(mesh);
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Convert to Mesh2D"));
- ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", node, mesh_instance, true, false);
- ur->add_do_reference(mesh_instance);
- ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", mesh_instance, node, false, false);
- ur->add_undo_reference(node);
- ur->commit_action();
-}
-
-void SpriteEditor::_convert_to_polygon_2d_node() {
-
- if (computed_outline_lines.empty()) {
- err_dialog->set_text(TTR("Invalid geometry, can't create polygon."));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- Polygon2D *polygon_2d_instance = memnew(Polygon2D);
-
- int total_point_count = 0;
- for (int i = 0; i < computed_outline_lines.size(); i++)
- total_point_count += computed_outline_lines[i].size();
-
- PoolVector2Array polygon;
- polygon.resize(total_point_count);
- PoolVector2Array::Write polygon_write = polygon.write();
-
- PoolVector2Array uvs;
- uvs.resize(total_point_count);
- PoolVector2Array::Write uvs_write = uvs.write();
-
- int current_point_index = 0;
-
- Array polys;
- polys.resize(computed_outline_lines.size());
-
- for (int i = 0; i < computed_outline_lines.size(); i++) {
-
- Vector<Vector2> outline = computed_outline_lines[i];
- Vector<Vector2> uv_outline = outline_lines[i];
-
- PoolIntArray pia;
- pia.resize(outline.size());
- PoolIntArray::Write pia_write = pia.write();
-
- for (int pi = 0; pi < outline.size(); pi++) {
- polygon_write[current_point_index] = outline[pi];
- uvs_write[current_point_index] = uv_outline[pi];
- pia_write[pi] = current_point_index;
- current_point_index++;
- }
-
- polys[i] = pia;
- }
-
- polygon_2d_instance->set_uv(uvs);
- polygon_2d_instance->set_polygon(polygon);
- polygon_2d_instance->set_polygons(polys);
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Convert to Polygon2D"));
- ur->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", node, polygon_2d_instance, true, false);
- ur->add_do_reference(polygon_2d_instance);
- ur->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock(), "replace_node", polygon_2d_instance, node, false, false);
- ur->add_undo_reference(node);
- ur->commit_action();
-}
-
-void SpriteEditor::_create_collision_polygon_2d_node() {
-
- if (computed_outline_lines.empty()) {
- err_dialog->set_text(TTR("Invalid geometry, can't create collision polygon."));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- for (int i = 0; i < computed_outline_lines.size(); i++) {
-
- Vector<Vector2> outline = computed_outline_lines[i];
-
- CollisionPolygon2D *collision_polygon_2d_instance = memnew(CollisionPolygon2D);
- collision_polygon_2d_instance->set_polygon(outline);
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Create CollisionPolygon2D Sibling"));
- ur->add_do_method(this, "_add_as_sibling_or_child", node, collision_polygon_2d_instance);
- ur->add_do_reference(collision_polygon_2d_instance);
- ur->add_undo_method(node != this->get_tree()->get_edited_scene_root() ? node->get_parent() : this->get_tree()->get_edited_scene_root(), "remove_child", collision_polygon_2d_instance);
- ur->commit_action();
- }
-}
-
-void SpriteEditor::_create_light_occluder_2d_node() {
-
- if (computed_outline_lines.empty()) {
- err_dialog->set_text(TTR("Invalid geometry, can't create light occluder."));
- err_dialog->popup_centered_minsize();
- return;
- }
-
- for (int i = 0; i < computed_outline_lines.size(); i++) {
-
- Vector<Vector2> outline = computed_outline_lines[i];
-
- Ref<OccluderPolygon2D> polygon;
- polygon.instance();
-
- PoolVector2Array a;
- a.resize(outline.size());
- PoolVector2Array::Write aw = a.write();
- for (int io = 0; io < outline.size(); io++) {
- aw[io] = outline[io];
- }
- polygon->set_polygon(a);
-
- LightOccluder2D *light_occluder_2d_instance = memnew(LightOccluder2D);
- light_occluder_2d_instance->set_occluder_polygon(polygon);
-
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Create LightOccluder2D Sibling"));
- ur->add_do_method(this, "_add_as_sibling_or_child", node, light_occluder_2d_instance);
- ur->add_do_reference(light_occluder_2d_instance);
- ur->add_undo_method(node != this->get_tree()->get_edited_scene_root() ? node->get_parent() : this->get_tree()->get_edited_scene_root(), "remove_child", light_occluder_2d_instance);
- ur->commit_action();
- }
-}
-
-void SpriteEditor::_add_as_sibling_or_child(Node *p_own_node, Node *p_new_node) {
- // Can't make sibling if own node is scene root
- if (p_own_node != this->get_tree()->get_edited_scene_root()) {
- p_own_node->get_parent()->add_child(p_new_node, true);
- Object::cast_to<Node2D>(p_new_node)->set_transform(Object::cast_to<Node2D>(p_own_node)->get_transform());
- } else {
- p_own_node->add_child(p_new_node, true);
- }
-
- p_new_node->set_owner(this->get_tree()->get_edited_scene_root());
-}
-
-void SpriteEditor::_debug_uv_draw() {
-
- Ref<Texture> tex = node->get_texture();
- ERR_FAIL_COND(!tex.is_valid());
-
- Point2 draw_pos_offset = Point2(1.0, 1.0);
- Size2 draw_size_offset = Size2(2.0, 2.0);
-
- debug_uv->set_clip_contents(true);
- debug_uv->draw_texture(tex, draw_pos_offset);
- debug_uv->set_custom_minimum_size(tex->get_size() + draw_size_offset);
- debug_uv->draw_set_transform(draw_pos_offset, 0, Size2(1.0, 1.0));
-
- Color color = Color(1.0, 0.8, 0.7);
-
- if (selected_menu_item == MENU_OPTION_CONVERT_TO_MESH_2D && uv_lines.size() > 0) {
- debug_uv->draw_multiline(uv_lines, color);
-
- } else if ((selected_menu_item == MENU_OPTION_CONVERT_TO_POLYGON_2D || selected_menu_item == MENU_OPTION_CREATE_COLLISION_POLY_2D || selected_menu_item == MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D) && outline_lines.size() > 0) {
- for (int i = 0; i < outline_lines.size(); i++) {
- Vector<Vector2> outline = outline_lines[i];
-
- debug_uv->draw_polyline(outline, color);
- debug_uv->draw_line(outline[0], outline[outline.size() - 1], color);
- }
- }
-}
-
-void SpriteEditor::_bind_methods() {
-
- ClassDB::bind_method("_menu_option", &SpriteEditor::_menu_option);
- ClassDB::bind_method("_debug_uv_draw", &SpriteEditor::_debug_uv_draw);
- ClassDB::bind_method("_update_mesh_data", &SpriteEditor::_update_mesh_data);
- ClassDB::bind_method("_create_node", &SpriteEditor::_create_node);
- ClassDB::bind_method("_add_as_sibling_or_child", &SpriteEditor::_add_as_sibling_or_child);
-}
-
-SpriteEditor::SpriteEditor() {
-
- options = memnew(MenuButton);
-
- CanvasItemEditor::get_singleton()->add_control_to_menu_panel(options);
-
- options->set_text(TTR("Sprite"));
- options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Sprite", "EditorIcons"));
-
- options->get_popup()->add_item(TTR("Convert to Mesh2D"), MENU_OPTION_CONVERT_TO_MESH_2D);
- options->get_popup()->add_item(TTR("Convert to Polygon2D"), MENU_OPTION_CONVERT_TO_POLYGON_2D);
- options->get_popup()->add_item(TTR("Create CollisionPolygon2D Sibling"), MENU_OPTION_CREATE_COLLISION_POLY_2D);
- options->get_popup()->add_item(TTR("Create LightOccluder2D Sibling"), MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D);
- options->set_switch_on_hover(true);
-
- options->get_popup()->connect("id_pressed", this, "_menu_option");
-
- err_dialog = memnew(AcceptDialog);
- add_child(err_dialog);
-
- debug_uv_dialog = memnew(ConfirmationDialog);
- debug_uv_dialog->get_ok()->set_text(TTR("Create Mesh2D"));
- debug_uv_dialog->set_title("Mesh 2D Preview");
- VBoxContainer *vb = memnew(VBoxContainer);
- debug_uv_dialog->add_child(vb);
- ScrollContainer *scroll = memnew(ScrollContainer);
- scroll->set_custom_minimum_size(Size2(800, 500) * EDSCALE);
- scroll->set_enable_h_scroll(true);
- scroll->set_enable_v_scroll(true);
- vb->add_margin_child(TTR("Preview:"), scroll, true);
- debug_uv = memnew(Control);
- debug_uv->connect("draw", this, "_debug_uv_draw");
- scroll->add_child(debug_uv);
- debug_uv_dialog->connect("confirmed", this, "_create_node");
-
- HBoxContainer *hb = memnew(HBoxContainer);
- hb->add_child(memnew(Label(TTR("Simplification: "))));
- simplification = memnew(SpinBox);
- simplification->set_min(0.01);
- simplification->set_max(10.00);
- simplification->set_step(0.01);
- simplification->set_value(2);
- hb->add_child(simplification);
- hb->add_spacer();
- hb->add_child(memnew(Label(TTR("Shrink (Pixels): "))));
- shrink_pixels = memnew(SpinBox);
- shrink_pixels->set_min(0);
- shrink_pixels->set_max(10);
- shrink_pixels->set_step(1);
- shrink_pixels->set_value(0);
- hb->add_child(shrink_pixels);
- hb->add_spacer();
- hb->add_child(memnew(Label(TTR("Grow (Pixels): "))));
- grow_pixels = memnew(SpinBox);
- grow_pixels->set_min(0);
- grow_pixels->set_max(10);
- grow_pixels->set_step(1);
- grow_pixels->set_value(2);
- hb->add_child(grow_pixels);
- hb->add_spacer();
- update_preview = memnew(Button);
- update_preview->set_text(TTR("Update Preview"));
- update_preview->connect("pressed", this, "_update_mesh_data");
- hb->add_child(update_preview);
- vb->add_margin_child(TTR("Settings:"), hb);
-
- add_child(debug_uv_dialog);
-}
-
-void SpriteEditorPlugin::edit(Object *p_object) {
-
- sprite_editor->edit(Object::cast_to<Sprite>(p_object));
-}
-
-bool SpriteEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("Sprite");
-}
-
-void SpriteEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- sprite_editor->options->show();
- } else {
-
- sprite_editor->options->hide();
- sprite_editor->edit(NULL);
- }
-}
-
-SpriteEditorPlugin::SpriteEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- sprite_editor = memnew(SpriteEditor);
- editor->get_viewport()->add_child(sprite_editor);
- make_visible(false);
-
- //sprite_editor->options->hide();
-}
-
-SpriteEditorPlugin::~SpriteEditorPlugin() {
-}
diff --git a/editor/plugins/sprite_editor_plugin.h b/editor/plugins/sprite_editor_plugin.h
deleted file mode 100644
index 13177c9142..0000000000
--- a/editor/plugins/sprite_editor_plugin.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*************************************************************************/
-/* sprite_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef SPRITE_EDITOR_PLUGIN_H
-#define SPRITE_EDITOR_PLUGIN_H
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "scene/2d/sprite.h"
-#include "scene/gui/spin_box.h"
-
-class SpriteEditor : public Control {
-
- GDCLASS(SpriteEditor, Control);
-
- enum Menu {
- MENU_OPTION_CONVERT_TO_MESH_2D,
- MENU_OPTION_CONVERT_TO_POLYGON_2D,
- MENU_OPTION_CREATE_COLLISION_POLY_2D,
- MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D
- };
-
- Menu selected_menu_item;
-
- Sprite *node;
-
- MenuButton *options;
-
- ConfirmationDialog *outline_dialog;
-
- AcceptDialog *err_dialog;
-
- ConfirmationDialog *debug_uv_dialog;
- Control *debug_uv;
- Vector<Vector2> uv_lines;
- Vector<Vector<Vector2> > outline_lines;
- Vector<Vector<Vector2> > computed_outline_lines;
- Vector<Vector2> computed_vertices;
- Vector<Vector2> computed_uv;
- Vector<int> computed_indices;
-
- SpinBox *simplification;
- SpinBox *grow_pixels;
- SpinBox *shrink_pixels;
- Button *update_preview;
-
- void _menu_option(int p_option);
-
- //void _create_uv_lines();
- friend class SpriteEditorPlugin;
-
- void _debug_uv_draw();
- void _update_mesh_data();
-
- void _create_node();
- void _convert_to_mesh_2d_node();
- void _convert_to_polygon_2d_node();
- void _create_collision_polygon_2d_node();
- void _create_light_occluder_2d_node();
-
- void _add_as_sibling_or_child(Node *p_own_node, Node *p_new_node);
-
-protected:
- void _node_removed(Node *p_node);
- static void _bind_methods();
-
-public:
- void edit(Sprite *p_sprite);
- SpriteEditor();
-};
-
-class SpriteEditorPlugin : public EditorPlugin {
-
- GDCLASS(SpriteEditorPlugin, EditorPlugin);
-
- SpriteEditor *sprite_editor;
- EditorNode *editor;
-
-public:
- virtual String get_name() const { return "Sprite"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- SpriteEditorPlugin(EditorNode *p_node);
- ~SpriteEditorPlugin();
-};
-
-#endif // SPRITE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp
index 4101980e29..5007983581 100644
--- a/editor/plugins/sprite_frames_editor_plugin.cpp
+++ b/editor/plugins/sprite_frames_editor_plugin.cpp
@@ -36,24 +36,24 @@
#include "editor/editor_settings.h"
#include "scene/3d/sprite_3d.h"
#include "scene/gui/center_container.h"
+#include "scene/gui/margin_container.h"
+#include "scene/gui/panel_container.h"
void SpriteFramesEditor::_gui_input(Ref<InputEvent> p_event) {
}
void SpriteFramesEditor::_open_sprite_sheet() {
-
file_split_sheet->clear_filters();
List<String> extensions;
- ResourceLoader::get_recognized_extensions_for_type("Texture", &extensions);
+ ResourceLoader::get_recognized_extensions_for_type("Texture2D", &extensions);
for (int i = 0; i < extensions.size(); i++) {
file_split_sheet->add_filter("*." + extensions[i]);
}
- file_split_sheet->popup_centered_ratio();
+ file_split_sheet->popup_file_dialog();
}
void SpriteFramesEditor::_sheet_preview_draw() {
-
Size2i size = split_sheet_preview->get_size();
int h = split_sheet_h->get_value();
int v = split_sheet_v->get_value();
@@ -61,13 +61,11 @@ void SpriteFramesEditor::_sheet_preview_draw() {
int height = size.height / v;
const float a = 0.3;
for (int i = 1; i < h; i++) {
-
int x = i * width;
split_sheet_preview->draw_line(Point2(x, 0), Point2(x, size.height), Color(1, 1, 1, a));
split_sheet_preview->draw_line(Point2(x + 1, 0), Point2(x + 1, size.height), Color(0, 0, 0, a));
for (int j = 1; j < v; j++) {
-
int y = j * height;
split_sheet_preview->draw_line(Point2(0, y), Point2(size.width, y), Color(1, 1, 1, a));
@@ -81,7 +79,7 @@ void SpriteFramesEditor::_sheet_preview_draw() {
return;
}
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
for (Set<int>::Element *E = frames_selected.front(); E; E = E->next()) {
int idx = E->get();
@@ -102,8 +100,8 @@ void SpriteFramesEditor::_sheet_preview_draw() {
split_sheet_dialog->get_ok()->set_disabled(false);
split_sheet_dialog->get_ok()->set_text(vformat(TTR("Add %d Frame(s)"), frames_selected.size()));
}
-void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) {
+void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
@@ -144,9 +142,27 @@ void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) {
}
}
-void SpriteFramesEditor::_sheet_add_frames() {
+void SpriteFramesEditor::_sheet_scroll_input(const Ref<InputEvent> &p_event) {
+ const Ref<InputEventMouseButton> mb = p_event;
+
+ if (mb.is_valid()) {
+ // Zoom in/out using Ctrl + mouse wheel. This is done on the ScrollContainer
+ // to allow performing this action anywhere, even if the cursor isn't
+ // hovering the texture in the workspace.
+ if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) {
+ _sheet_zoom_in();
+ // Don't scroll up after zooming in.
+ accept_event();
+ } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) {
+ _sheet_zoom_out();
+ // Don't scroll down after zooming out.
+ accept_event();
+ }
+ }
+}
- Size2i size = split_sheet_preview->get_size();
+void SpriteFramesEditor::_sheet_add_frames() {
+ Size2i size = split_sheet_preview->get_texture()->get_size();
int h = split_sheet_h->get_value();
int v = split_sheet_v->get_value();
@@ -154,14 +170,22 @@ void SpriteFramesEditor::_sheet_add_frames() {
int fc = frames->get_frame_count(edited_anim);
+ AtlasTexture *atlas_source = Object::cast_to<AtlasTexture>(*split_sheet_preview->get_texture());
+
+ Rect2 region_rect = Rect2();
+
+ if (atlas_source && atlas_source->get_atlas().is_valid()) {
+ region_rect = atlas_source->get_region();
+ }
+
for (Set<int>::Element *E = frames_selected.front(); E; E = E->next()) {
int idx = E->get();
int width = size.width / h;
int height = size.height / v;
int xp = idx % h;
int yp = (idx - xp) / h;
- int x = xp * width;
- int y = yp * height;
+ int x = (xp * width) + region_rect.position.x;
+ int y = (yp * height) + region_rect.position.y;
Ref<AtlasTexture> at;
at.instance();
@@ -177,8 +201,29 @@ void SpriteFramesEditor::_sheet_add_frames() {
undo_redo->commit_action();
}
-void SpriteFramesEditor::_sheet_select_clear_all_frames() {
+void SpriteFramesEditor::_sheet_zoom_in() {
+ if (sheet_zoom < max_sheet_zoom) {
+ sheet_zoom *= scale_ratio;
+ Size2 texture_size = split_sheet_preview->get_texture()->get_size();
+ split_sheet_preview->set_custom_minimum_size(texture_size * sheet_zoom);
+ }
+}
+void SpriteFramesEditor::_sheet_zoom_out() {
+ if (sheet_zoom > min_sheet_zoom) {
+ sheet_zoom /= scale_ratio;
+ Size2 texture_size = split_sheet_preview->get_texture()->get_size();
+ split_sheet_preview->set_custom_minimum_size(texture_size * sheet_zoom);
+ }
+}
+
+void SpriteFramesEditor::_sheet_zoom_reset() {
+ sheet_zoom = 1.f;
+ Size2 texture_size = split_sheet_preview->get_texture()->get_size();
+ split_sheet_preview->set_custom_minimum_size(texture_size * sheet_zoom);
+}
+
+void SpriteFramesEditor::_sheet_select_clear_all_frames() {
bool should_clear = true;
for (int i = 0; i < split_sheet_h->get_value() * split_sheet_v->get_value(); i++) {
if (!frames_selected.has(i)) {
@@ -194,66 +239,70 @@ void SpriteFramesEditor::_sheet_select_clear_all_frames() {
}
void SpriteFramesEditor::_sheet_spin_changed(double) {
-
frames_selected.clear();
last_frame_selected = -1;
split_sheet_preview->update();
}
void SpriteFramesEditor::_prepare_sprite_sheet(const String &p_file) {
-
Ref<Resource> texture = ResourceLoader::load(p_file);
if (!texture.is_valid()) {
EditorNode::get_singleton()->show_warning(TTR("Unable to load images"));
ERR_FAIL_COND(!texture.is_valid());
}
- if (texture != split_sheet_preview->get_texture()) {
- //different texture, reset to 4x4
- split_sheet_h->set_value(4);
- split_sheet_v->set_value(4);
- }
+ bool new_texture = texture != split_sheet_preview->get_texture();
frames_selected.clear();
last_frame_selected = -1;
split_sheet_preview->set_texture(texture);
+ if (new_texture) {
+ //different texture, reset to 4x4
+ split_sheet_h->set_value(4);
+ split_sheet_v->set_value(4);
+ //reset zoom
+ _sheet_zoom_reset();
+ }
split_sheet_dialog->popup_centered_ratio(0.65);
}
void SpriteFramesEditor::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- load->set_icon(get_icon("Load", "EditorIcons"));
- load_sheet->set_icon(get_icon("SpriteSheet", "EditorIcons"));
- copy->set_icon(get_icon("ActionCopy", "EditorIcons"));
- paste->set_icon(get_icon("ActionPaste", "EditorIcons"));
- empty->set_icon(get_icon("InsertBefore", "EditorIcons"));
- empty2->set_icon(get_icon("InsertAfter", "EditorIcons"));
- move_up->set_icon(get_icon("MoveLeft", "EditorIcons"));
- move_down->set_icon(get_icon("MoveRight", "EditorIcons"));
- _delete->set_icon(get_icon("Remove", "EditorIcons"));
- new_anim->set_icon(get_icon("New", "EditorIcons"));
- remove_anim->set_icon(get_icon("Remove", "EditorIcons"));
- FALLTHROUGH;
+ load->set_icon(get_theme_icon("Load", "EditorIcons"));
+ load_sheet->set_icon(get_theme_icon("SpriteSheet", "EditorIcons"));
+ copy->set_icon(get_theme_icon("ActionCopy", "EditorIcons"));
+ paste->set_icon(get_theme_icon("ActionPaste", "EditorIcons"));
+ empty->set_icon(get_theme_icon("InsertBefore", "EditorIcons"));
+ empty2->set_icon(get_theme_icon("InsertAfter", "EditorIcons"));
+ move_up->set_icon(get_theme_icon("MoveLeft", "EditorIcons"));
+ move_down->set_icon(get_theme_icon("MoveRight", "EditorIcons"));
+ _delete->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ zoom_out->set_icon(get_theme_icon("ZoomLess", "EditorIcons"));
+ zoom_1->set_icon(get_theme_icon("ZoomReset", "EditorIcons"));
+ zoom_in->set_icon(get_theme_icon("ZoomMore", "EditorIcons"));
+ new_anim->set_icon(get_theme_icon("New", "EditorIcons"));
+ remove_anim->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ split_sheet_zoom_out->set_icon(get_theme_icon("ZoomLess", "EditorIcons"));
+ split_sheet_zoom_1->set_icon(get_theme_icon("ZoomReset", "EditorIcons"));
+ split_sheet_zoom_in->set_icon(get_theme_icon("ZoomMore", "EditorIcons"));
+ [[fallthrough]];
}
case NOTIFICATION_THEME_CHANGED: {
- splite_sheet_scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ splite_sheet_scroll->add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
} break;
case NOTIFICATION_READY: {
- add_constant_override("autohide", 1); // Fixes the dragger always showing up.
+ add_theme_constant_override("autohide", 1); // Fixes the dragger always showing up.
} break;
}
}
-void SpriteFramesEditor::_file_load_request(const PoolVector<String> &p_path, int p_at_pos) {
-
+void SpriteFramesEditor::_file_load_request(const Vector<String> &p_path, int p_at_pos) {
ERR_FAIL_COND(!frames->has_animation(edited_anim));
- List<Ref<Texture> > resources;
+ List<Ref<Texture2D>> resources;
for (int i = 0; i < p_path.size(); i++) {
-
- Ref<Texture> resource;
+ Ref<Texture2D> resource;
resource = ResourceLoader::load(p_path[i]);
if (resource.is_null()) {
@@ -262,7 +311,7 @@ void SpriteFramesEditor::_file_load_request(const PoolVector<String> &p_path, in
//dialog->get_cancel()->set_text("Close");
dialog->get_ok()->set_text(TTR("Close"));
- dialog->popup_centered_minsize();
+ dialog->popup_centered();
return; ///beh should show an error i guess
}
@@ -278,8 +327,7 @@ void SpriteFramesEditor::_file_load_request(const PoolVector<String> &p_path, in
int count = 0;
- for (List<Ref<Texture> >::Element *E = resources.front(); E; E = E->next()) {
-
+ for (List<Ref<Texture2D>>::Element *E = resources.front(); E; E = E->next()) {
undo_redo->add_do_method(frames, "add_frame", edited_anim, E->get(), p_at_pos == -1 ? -1 : p_at_pos + count);
undo_redo->add_undo_method(frames, "remove_frame", edited_anim, p_at_pos == -1 ? fc : p_at_pos);
count++;
@@ -291,32 +339,30 @@ void SpriteFramesEditor::_file_load_request(const PoolVector<String> &p_path, in
}
void SpriteFramesEditor::_load_pressed() {
-
ERR_FAIL_COND(!frames->has_animation(edited_anim));
loading_scene = false;
file->clear_filters();
List<String> extensions;
- ResourceLoader::get_recognized_extensions_for_type("Texture", &extensions);
- for (int i = 0; i < extensions.size(); i++)
+ ResourceLoader::get_recognized_extensions_for_type("Texture2D", &extensions);
+ for (int i = 0; i < extensions.size(); i++) {
file->add_filter("*." + extensions[i]);
+ }
- file->set_mode(EditorFileDialog::MODE_OPEN_FILES);
-
- file->popup_centered_ratio();
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILES);
+ file->popup_file_dialog();
}
void SpriteFramesEditor::_paste_pressed() {
-
ERR_FAIL_COND(!frames->has_animation(edited_anim));
- Ref<Texture> r = EditorSettings::get_singleton()->get_resource_clipboard();
+ Ref<Texture2D> r = EditorSettings::get_singleton()->get_resource_clipboard();
if (!r.is_valid()) {
dialog->set_text(TTR("Resource clipboard is empty or not a texture!"));
dialog->set_title(TTR("Error!"));
//dialog->get_cancel()->set_text("Close");
dialog->get_ok()->set_text(TTR("Close"));
- dialog->popup_centered_minsize();
+ dialog->popup_centered();
return; ///beh should show an error i guess
}
@@ -331,9 +377,10 @@ void SpriteFramesEditor::_paste_pressed() {
void SpriteFramesEditor::_copy_pressed() {
ERR_FAIL_COND(!frames->has_animation(edited_anim));
- if (tree->get_current() < 0)
+ if (tree->get_current() < 0) {
return;
- Ref<Texture> r = frames->get_frame(edited_anim, tree->get_current());
+ }
+ Ref<Texture2D> r = frames->get_frame(edited_anim, tree->get_current());
if (!r.is_valid()) {
return;
}
@@ -342,13 +389,11 @@ void SpriteFramesEditor::_copy_pressed() {
}
void SpriteFramesEditor::_empty_pressed() {
-
ERR_FAIL_COND(!frames->has_animation(edited_anim));
int from = -1;
if (tree->get_current() >= 0) {
-
from = tree->get_current();
sel = from;
@@ -356,7 +401,7 @@ void SpriteFramesEditor::_empty_pressed() {
from = frames->get_frame_count(edited_anim);
}
- Ref<Texture> r;
+ Ref<Texture2D> r;
undo_redo->create_action(TTR("Add Empty"));
undo_redo->add_do_method(frames, "add_frame", edited_anim, r, from);
@@ -367,13 +412,11 @@ void SpriteFramesEditor::_empty_pressed() {
}
void SpriteFramesEditor::_empty2_pressed() {
-
ERR_FAIL_COND(!frames->has_animation(edited_anim));
int from = -1;
if (tree->get_current() >= 0) {
-
from = tree->get_current();
sel = from;
@@ -381,7 +424,7 @@ void SpriteFramesEditor::_empty2_pressed() {
from = frames->get_frame_count(edited_anim);
}
- Ref<Texture> r;
+ Ref<Texture2D> r;
undo_redo->create_action(TTR("Add Empty"));
undo_redo->add_do_method(frames, "add_frame", edited_anim, r, from + 1);
@@ -392,15 +435,16 @@ void SpriteFramesEditor::_empty2_pressed() {
}
void SpriteFramesEditor::_up_pressed() {
-
ERR_FAIL_COND(!frames->has_animation(edited_anim));
- if (tree->get_current() < 0)
+ if (tree->get_current() < 0) {
return;
+ }
int to_move = tree->get_current();
- if (to_move < 1)
+ if (to_move < 1) {
return;
+ }
sel = to_move;
sel -= 1;
@@ -416,15 +460,16 @@ void SpriteFramesEditor::_up_pressed() {
}
void SpriteFramesEditor::_down_pressed() {
-
ERR_FAIL_COND(!frames->has_animation(edited_anim));
- if (tree->get_current() < 0)
+ if (tree->get_current() < 0) {
return;
+ }
int to_move = tree->get_current();
- if (to_move < 0 || to_move >= frames->get_frame_count(edited_anim) - 1)
+ if (to_move < 0 || to_move >= frames->get_frame_count(edited_anim) - 1) {
return;
+ }
sel = to_move;
sel += 1;
@@ -440,11 +485,11 @@ void SpriteFramesEditor::_down_pressed() {
}
void SpriteFramesEditor::_delete_pressed() {
-
ERR_FAIL_COND(!frames->has_animation(edited_anim));
- if (tree->get_current() < 0)
+ if (tree->get_current() < 0) {
return;
+ }
int to_delete = tree->get_current();
if (to_delete < 0 || to_delete >= frames->get_frame_count(edited_anim)) {
@@ -460,14 +505,15 @@ void SpriteFramesEditor::_delete_pressed() {
}
void SpriteFramesEditor::_animation_select() {
-
- if (updating)
+ if (updating) {
return;
+ }
if (frames->has_animation(edited_anim)) {
- double value = anim_speed->get_line_edit()->get_text().to_double();
- if (!Math::is_equal_approx(value, frames->get_animation_speed(edited_anim)))
+ double value = anim_speed->get_line_edit()->get_text().to_float();
+ if (!Math::is_equal_approx(value, frames->get_animation_speed(edited_anim))) {
_animation_fps_changed(value);
+ }
}
TreeItem *selected = animations->get_selected();
@@ -477,15 +523,16 @@ void SpriteFramesEditor::_animation_select() {
}
static void _find_anim_sprites(Node *p_node, List<Node *> *r_nodes, Ref<SpriteFrames> p_sfames) {
-
Node *edited = EditorNode::get_singleton()->get_edited_scene();
- if (!edited)
+ if (!edited) {
return;
- if (p_node != edited && p_node->get_owner() != edited)
+ }
+ if (p_node != edited && p_node->get_owner() != edited) {
return;
+ }
{
- AnimatedSprite *as = Object::cast_to<AnimatedSprite>(p_node);
+ AnimatedSprite2D *as = Object::cast_to<AnimatedSprite2D>(p_node);
if (as && as->get_sprite_frames() == p_sfames) {
r_nodes->push_back(p_node);
}
@@ -504,21 +551,24 @@ static void _find_anim_sprites(Node *p_node, List<Node *> *r_nodes, Ref<SpriteFr
}
void SpriteFramesEditor::_animation_name_edited() {
-
- if (updating)
+ if (updating) {
return;
+ }
- if (!frames->has_animation(edited_anim))
+ if (!frames->has_animation(edited_anim)) {
return;
+ }
TreeItem *edited = animations->get_edited();
- if (!edited)
+ if (!edited) {
return;
+ }
String new_name = edited->get_text(0);
- if (new_name == String(edited_anim))
+ if (new_name == String(edited_anim)) {
return;
+ }
new_name = new_name.replace("/", "_").replace(",", " ");
@@ -537,7 +587,6 @@ void SpriteFramesEditor::_animation_name_edited() {
undo_redo->add_undo_method(frames, "rename_animation", name, edited_anim);
for (List<Node *>::Element *E = nodes.front(); E; E = E->next()) {
-
String current = E->get()->call("get_animation");
undo_redo->add_do_method(E->get(), "set_animation", name);
undo_redo->add_undo_method(E->get(), "set_animation", edited_anim);
@@ -552,7 +601,6 @@ void SpriteFramesEditor::_animation_name_edited() {
}
void SpriteFramesEditor::_animation_add() {
-
String name = "New Anim";
int counter = 0;
while (frames->has_animation(name)) {
@@ -570,7 +618,6 @@ void SpriteFramesEditor::_animation_add() {
undo_redo->add_undo_method(this, "_update_library");
for (List<Node *>::Element *E = nodes.front(); E; E = E->next()) {
-
String current = E->get()->call("get_animation");
undo_redo->add_do_method(E->get(), "set_animation", name);
undo_redo->add_undo_method(E->get(), "set_animation", current);
@@ -583,19 +630,19 @@ void SpriteFramesEditor::_animation_add() {
}
void SpriteFramesEditor::_animation_remove() {
-
- if (updating)
+ if (updating) {
return;
+ }
- if (!frames->has_animation(edited_anim))
+ if (!frames->has_animation(edited_anim)) {
return;
+ }
delete_dialog->set_text(TTR("Delete Animation?"));
- delete_dialog->popup_centered_minsize();
+ delete_dialog->popup_centered();
}
void SpriteFramesEditor::_animation_remove_confirmed() {
-
undo_redo->create_action(TTR("Remove Animation"));
undo_redo->add_do_method(frames, "remove_animation", edited_anim);
undo_redo->add_undo_method(frames, "add_animation", edited_anim);
@@ -603,7 +650,7 @@ void SpriteFramesEditor::_animation_remove_confirmed() {
undo_redo->add_undo_method(frames, "set_animation_loop", edited_anim, frames->get_animation_loop(edited_anim));
int fc = frames->get_frame_count(edited_anim);
for (int i = 0; i < fc; i++) {
- Ref<Texture> frame = frames->get_frame(edited_anim, i);
+ Ref<Texture2D> frame = frames->get_frame(edited_anim, i);
undo_redo->add_undo_method(frames, "add_frame", edited_anim, frame);
}
undo_redo->add_do_method(this, "_update_library");
@@ -615,9 +662,9 @@ void SpriteFramesEditor::_animation_remove_confirmed() {
}
void SpriteFramesEditor::_animation_loop_changed() {
-
- if (updating)
+ if (updating) {
return;
+ }
undo_redo->create_action(TTR("Change Animation Loop"));
undo_redo->add_do_method(frames, "set_animation_loop", edited_anim, anim_loop->is_pressed());
@@ -628,9 +675,9 @@ void SpriteFramesEditor::_animation_loop_changed() {
}
void SpriteFramesEditor::_animation_fps_changed(double p_value) {
-
- if (updating)
+ if (updating) {
return;
+ }
undo_redo->create_action(TTR("Change Animation FPS"), UndoRedo::MERGE_ENDS);
undo_redo->add_do_method(frames, "set_animation_speed", edited_anim, p_value);
@@ -641,8 +688,55 @@ void SpriteFramesEditor::_animation_fps_changed(double p_value) {
undo_redo->commit_action();
}
-void SpriteFramesEditor::_update_library(bool p_skip_selector) {
+void SpriteFramesEditor::_tree_input(const Ref<InputEvent> &p_event) {
+ const Ref<InputEventMouseButton> mb = p_event;
+
+ if (mb.is_valid()) {
+ if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) {
+ _zoom_in();
+ // Don't scroll up after zooming in.
+ accept_event();
+ } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) {
+ _zoom_out();
+ // Don't scroll down after zooming out.
+ accept_event();
+ }
+ }
+}
+
+void SpriteFramesEditor::_zoom_in() {
+ // Do not zoom in or out with no visible frames
+ if (frames->get_frame_count(edited_anim) <= 0) {
+ return;
+ }
+ if (thumbnail_zoom < max_thumbnail_zoom) {
+ thumbnail_zoom *= scale_ratio;
+ int thumbnail_size = (int)(thumbnail_default_size * thumbnail_zoom);
+ tree->set_fixed_column_width(thumbnail_size * 3 / 2);
+ tree->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size));
+ }
+}
+
+void SpriteFramesEditor::_zoom_out() {
+ // Do not zoom in or out with no visible frames
+ if (frames->get_frame_count(edited_anim) <= 0) {
+ return;
+ }
+ if (thumbnail_zoom > min_thumbnail_zoom) {
+ thumbnail_zoom /= scale_ratio;
+ int thumbnail_size = (int)(thumbnail_default_size * thumbnail_zoom);
+ tree->set_fixed_column_width(thumbnail_size * 3 / 2);
+ tree->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size));
+ }
+}
+
+void SpriteFramesEditor::_zoom_reset() {
+ thumbnail_zoom = 1.0f;
+ tree->set_fixed_column_width(thumbnail_default_size * 3 / 2);
+ tree->set_fixed_icon_size(Size2(thumbnail_default_size, thumbnail_default_size));
+}
+void SpriteFramesEditor::_update_library(bool p_skip_selector) {
updating = true;
if (!p_skip_selector) {
@@ -657,7 +751,6 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) {
anim_names.sort_custom<StringName::AlphCompare>();
for (List<StringName>::Element *E = anim_names.front(); E; E = E->next()) {
-
String name = E->get();
TreeItem *it = animations->create_item(anim_root);
@@ -680,18 +773,17 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) {
return;
}
- if (sel >= frames->get_frame_count(edited_anim))
+ if (sel >= frames->get_frame_count(edited_anim)) {
sel = frames->get_frame_count(edited_anim) - 1;
- else if (sel < 0 && frames->get_frame_count(edited_anim))
+ } else if (sel < 0 && frames->get_frame_count(edited_anim)) {
sel = 0;
+ }
for (int i = 0; i < frames->get_frame_count(edited_anim); i++) {
-
String name;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
if (frames->get_frame(edited_anim, i).is_null()) {
-
name = itos(i) + ": " + TTR("(empty)");
} else {
@@ -700,10 +792,12 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) {
}
tree->add_item(name, icon);
- if (frames->get_frame(edited_anim, i).is_valid())
+ if (frames->get_frame(edited_anim, i).is_valid()) {
tree->set_item_tooltip(tree->get_item_count() - 1, frames->get_frame(edited_anim, i)->get_path());
- if (sel == i)
+ }
+ if (sel == i) {
tree->select(tree->get_item_count() - 1);
+ }
}
anim_speed->set_value(frames->get_animation_speed(edited_anim));
@@ -714,16 +808,14 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) {
}
void SpriteFramesEditor::edit(SpriteFrames *p_frames) {
-
- if (frames == p_frames)
+ if (frames == p_frames) {
return;
+ }
frames = p_frames;
if (p_frames) {
-
if (!p_frames->has_animation(edited_anim)) {
-
List<StringName> anim_names;
frames->get_animation_list(&anim_names);
anim_names.sort_custom<StringName::AlphCompare>();
@@ -735,26 +827,30 @@ void SpriteFramesEditor::edit(SpriteFrames *p_frames) {
}
_update_library();
+ // Clear zoom and split sheet texture
+ split_sheet_preview->set_texture(Ref<Texture2D>());
+ _zoom_reset();
} else {
-
hide();
}
}
Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
- if (!frames->has_animation(edited_anim))
+ if (!frames->has_animation(edited_anim)) {
return false;
+ }
int idx = tree->get_item_at_position(p_point, true);
- if (idx < 0 || idx >= frames->get_frame_count(edited_anim))
+ if (idx < 0 || idx >= frames->get_frame_count(edited_anim)) {
return Variant();
+ }
RES frame = frames->get_frame(edited_anim, idx);
- if (frame.is_null())
+ if (frame.is_null()) {
return Variant();
+ }
Dictionary drag_data = EditorNode::get_singleton()->drag_resource(frame, p_from);
drag_data["frame"] = idx; // store the frame, in case we want to reorder frames inside 'drop_data_fw'
@@ -762,39 +858,39 @@ Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_f
}
bool SpriteFramesEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return false;
+ }
// reordering frames
- if (d.has("from") && (Object *)(d["from"]) == tree)
+ if (d.has("from") && (Object *)(d["from"]) == tree) {
return true;
+ }
if (String(d["type"]) == "resource" && d.has("resource")) {
RES r = d["resource"];
- Ref<Texture> texture = r;
+ Ref<Texture2D> texture = r;
if (texture.is_valid()) {
-
return true;
}
}
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
- if (files.size() == 0)
+ if (files.size() == 0) {
return false;
+ }
for (int i = 0; i < files.size(); i++) {
String file = files[i];
String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
- if (!ClassDB::is_parent_class(ftype, "Texture")) {
+ if (!ClassDB::is_parent_class(ftype, "Texture2D")) {
return false;
}
}
@@ -805,31 +901,34 @@ bool SpriteFramesEditor::can_drop_data_fw(const Point2 &p_point, const Variant &
}
void SpriteFramesEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
- if (!can_drop_data_fw(p_point, p_data, p_from))
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
return;
+ }
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return;
+ }
int at_pos = tree->get_item_at_position(p_point, true);
if (String(d["type"]) == "resource" && d.has("resource")) {
RES r = d["resource"];
- Ref<Texture> texture = r;
+ Ref<Texture2D> texture = r;
if (texture.is_valid()) {
bool reorder = false;
- if (d.has("from") && (Object *)(d["from"]) == tree)
+ if (d.has("from") && (Object *)(d["from"]) == tree) {
reorder = true;
+ }
if (reorder) { //drop is from reordering frames
int from_frame = -1;
- if (d.has("frame"))
+ if (d.has("frame")) {
from_frame = d["frame"];
+ }
undo_redo->create_action(TTR("Move Frame"));
undo_redo->add_do_method(frames, "remove_frame", edited_anim, from_frame == -1 ? frames->get_frame_count(edited_anim) : from_frame);
@@ -851,46 +950,20 @@ void SpriteFramesEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da
}
if (String(d["type"]) == "files") {
-
- PoolVector<String> files = d["files"];
+ Vector<String> files = d["files"];
_file_load_request(files, at_pos);
}
}
void SpriteFramesEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_load_pressed"), &SpriteFramesEditor::_load_pressed);
- ClassDB::bind_method(D_METHOD("_empty_pressed"), &SpriteFramesEditor::_empty_pressed);
- ClassDB::bind_method(D_METHOD("_empty2_pressed"), &SpriteFramesEditor::_empty2_pressed);
- ClassDB::bind_method(D_METHOD("_delete_pressed"), &SpriteFramesEditor::_delete_pressed);
- ClassDB::bind_method(D_METHOD("_copy_pressed"), &SpriteFramesEditor::_copy_pressed);
- ClassDB::bind_method(D_METHOD("_paste_pressed"), &SpriteFramesEditor::_paste_pressed);
- ClassDB::bind_method(D_METHOD("_file_load_request", "files", "at_position"), &SpriteFramesEditor::_file_load_request, DEFVAL(-1));
ClassDB::bind_method(D_METHOD("_update_library", "skipsel"), &SpriteFramesEditor::_update_library, DEFVAL(false));
- ClassDB::bind_method(D_METHOD("_up_pressed"), &SpriteFramesEditor::_up_pressed);
- ClassDB::bind_method(D_METHOD("_down_pressed"), &SpriteFramesEditor::_down_pressed);
- ClassDB::bind_method(D_METHOD("_animation_select"), &SpriteFramesEditor::_animation_select);
- ClassDB::bind_method(D_METHOD("_animation_name_edited"), &SpriteFramesEditor::_animation_name_edited);
- ClassDB::bind_method(D_METHOD("_animation_add"), &SpriteFramesEditor::_animation_add);
- ClassDB::bind_method(D_METHOD("_animation_remove"), &SpriteFramesEditor::_animation_remove);
- ClassDB::bind_method(D_METHOD("_animation_remove_confirmed"), &SpriteFramesEditor::_animation_remove_confirmed);
- ClassDB::bind_method(D_METHOD("_animation_loop_changed"), &SpriteFramesEditor::_animation_loop_changed);
- ClassDB::bind_method(D_METHOD("_animation_fps_changed"), &SpriteFramesEditor::_animation_fps_changed);
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &SpriteFramesEditor::get_drag_data_fw);
ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &SpriteFramesEditor::can_drop_data_fw);
ClassDB::bind_method(D_METHOD("drop_data_fw"), &SpriteFramesEditor::drop_data_fw);
- ClassDB::bind_method(D_METHOD("_prepare_sprite_sheet"), &SpriteFramesEditor::_prepare_sprite_sheet);
- ClassDB::bind_method(D_METHOD("_open_sprite_sheet"), &SpriteFramesEditor::_open_sprite_sheet);
- ClassDB::bind_method(D_METHOD("_sheet_preview_draw"), &SpriteFramesEditor::_sheet_preview_draw);
- ClassDB::bind_method(D_METHOD("_sheet_preview_input"), &SpriteFramesEditor::_sheet_preview_input);
- ClassDB::bind_method(D_METHOD("_sheet_spin_changed"), &SpriteFramesEditor::_sheet_spin_changed);
- ClassDB::bind_method(D_METHOD("_sheet_add_frames"), &SpriteFramesEditor::_sheet_add_frames);
- ClassDB::bind_method(D_METHOD("_sheet_select_clear_all_frames"), &SpriteFramesEditor::_sheet_select_clear_all_frames);
}
SpriteFramesEditor::SpriteFramesEditor() {
-
VBoxContainer *vbc_animlist = memnew(VBoxContainer);
add_child(vbc_animlist);
vbc_animlist->set_custom_minimum_size(Size2(150, 0) * EDSCALE);
@@ -902,35 +975,42 @@ SpriteFramesEditor::SpriteFramesEditor() {
HBoxContainer *hbc_animlist = memnew(HBoxContainer);
sub_vb->add_child(hbc_animlist);
- new_anim = memnew(ToolButton);
+ new_anim = memnew(Button);
+ new_anim->set_flat(true);
new_anim->set_tooltip(TTR("New Animation"));
hbc_animlist->add_child(new_anim);
- new_anim->connect("pressed", this, "_animation_add");
+ new_anim->connect("pressed", callable_mp(this, &SpriteFramesEditor::_animation_add));
- remove_anim = memnew(ToolButton);
+ remove_anim = memnew(Button);
+ remove_anim->set_flat(true);
remove_anim->set_tooltip(TTR("Remove Animation"));
hbc_animlist->add_child(remove_anim);
- remove_anim->connect("pressed", this, "_animation_remove");
+ remove_anim->connect("pressed", callable_mp(this, &SpriteFramesEditor::_animation_remove));
animations = memnew(Tree);
sub_vb->add_child(animations);
animations->set_v_size_flags(SIZE_EXPAND_FILL);
animations->set_hide_root(true);
- animations->connect("cell_selected", this, "_animation_select");
- animations->connect("item_edited", this, "_animation_name_edited");
+ animations->connect("cell_selected", callable_mp(this, &SpriteFramesEditor::_animation_select));
+ animations->connect("item_edited", callable_mp(this, &SpriteFramesEditor::_animation_name_edited));
animations->set_allow_reselect(true);
+ HBoxContainer *hbc_anim_speed = memnew(HBoxContainer);
+ hbc_anim_speed->add_child(memnew(Label(TTR("Speed:"))));
+ vbc_animlist->add_child(hbc_anim_speed);
anim_speed = memnew(SpinBox);
- vbc_animlist->add_margin_child(TTR("Speed (FPS):"), anim_speed);
+ anim_speed->set_suffix(TTR("FPS"));
anim_speed->set_min(0);
anim_speed->set_max(100);
anim_speed->set_step(0.01);
- anim_speed->connect("value_changed", this, "_animation_fps_changed");
+ anim_speed->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbc_anim_speed->add_child(anim_speed);
+ anim_speed->connect("value_changed", callable_mp(this, &SpriteFramesEditor::_animation_fps_changed));
anim_loop = memnew(CheckButton);
anim_loop->set_text(TTR("Loop"));
vbc_animlist->add_child(anim_loop);
- anim_loop->connect("pressed", this, "_animation_loop_changed");
+ anim_loop->connect("pressed", callable_mp(this, &SpriteFramesEditor::_animation_loop_changed));
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
@@ -942,48 +1022,75 @@ SpriteFramesEditor::SpriteFramesEditor() {
HBoxContainer *hbc = memnew(HBoxContainer);
sub_vb->add_child(hbc);
- load = memnew(ToolButton);
+ load = memnew(Button);
+ load->set_flat(true);
load->set_tooltip(TTR("Add a Texture from File"));
hbc->add_child(load);
- load_sheet = memnew(ToolButton);
+ load_sheet = memnew(Button);
+ load_sheet->set_flat(true);
load_sheet->set_tooltip(TTR("Add Frames from a Sprite Sheet"));
hbc->add_child(load_sheet);
hbc->add_child(memnew(VSeparator));
- copy = memnew(ToolButton);
+ copy = memnew(Button);
+ copy->set_flat(true);
copy->set_tooltip(TTR("Copy"));
hbc->add_child(copy);
- paste = memnew(ToolButton);
+ paste = memnew(Button);
+ paste->set_flat(true);
paste->set_tooltip(TTR("Paste"));
hbc->add_child(paste);
hbc->add_child(memnew(VSeparator));
- empty = memnew(ToolButton);
+ empty = memnew(Button);
+ empty->set_flat(true);
empty->set_tooltip(TTR("Insert Empty (Before)"));
hbc->add_child(empty);
- empty2 = memnew(ToolButton);
+ empty2 = memnew(Button);
+ empty2->set_flat(true);
empty2->set_tooltip(TTR("Insert Empty (After)"));
hbc->add_child(empty2);
hbc->add_child(memnew(VSeparator));
- move_up = memnew(ToolButton);
+ move_up = memnew(Button);
+ move_up->set_flat(true);
move_up->set_tooltip(TTR("Move (Before)"));
hbc->add_child(move_up);
- move_down = memnew(ToolButton);
+ move_down = memnew(Button);
+ move_down->set_flat(true);
move_down->set_tooltip(TTR("Move (After)"));
hbc->add_child(move_down);
- _delete = memnew(ToolButton);
+ _delete = memnew(Button);
+ _delete->set_flat(true);
_delete->set_tooltip(TTR("Delete"));
hbc->add_child(_delete);
+ hbc->add_spacer();
+
+ zoom_out = memnew(Button);
+ zoom_out->connect("pressed", callable_mp(this, &SpriteFramesEditor::_zoom_out));
+ zoom_out->set_flat(true);
+ zoom_out->set_tooltip(TTR("Zoom Out"));
+ hbc->add_child(zoom_out);
+ zoom_1 = memnew(Button);
+ zoom_1->connect("pressed", callable_mp(this, &SpriteFramesEditor::_zoom_reset));
+ zoom_1->set_flat(true);
+ zoom_1->set_tooltip(TTR("Zoom Reset"));
+ hbc->add_child(zoom_1);
+ zoom_in = memnew(Button);
+ zoom_in->connect("pressed", callable_mp(this, &SpriteFramesEditor::_zoom_in));
+ zoom_in->set_flat(true);
+ zoom_in->set_tooltip(TTR("Zoom In"));
+ hbc->add_child(zoom_in);
+
file = memnew(EditorFileDialog);
add_child(file);
@@ -991,29 +1098,27 @@ SpriteFramesEditor::SpriteFramesEditor() {
tree->set_v_size_flags(SIZE_EXPAND_FILL);
tree->set_icon_mode(ItemList::ICON_MODE_TOP);
- int thumbnail_size = 96;
tree->set_max_columns(0);
tree->set_icon_mode(ItemList::ICON_MODE_TOP);
- tree->set_fixed_column_width(thumbnail_size * 3 / 2);
tree->set_max_text_lines(2);
- tree->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size));
tree->set_drag_forwarding(this);
+ tree->connect("gui_input", callable_mp(this, &SpriteFramesEditor::_tree_input));
sub_vb->add_child(tree);
dialog = memnew(AcceptDialog);
add_child(dialog);
- load->connect("pressed", this, "_load_pressed");
- load_sheet->connect("pressed", this, "_open_sprite_sheet");
- _delete->connect("pressed", this, "_delete_pressed");
- copy->connect("pressed", this, "_copy_pressed");
- paste->connect("pressed", this, "_paste_pressed");
- empty->connect("pressed", this, "_empty_pressed");
- empty2->connect("pressed", this, "_empty2_pressed");
- move_up->connect("pressed", this, "_up_pressed");
- move_down->connect("pressed", this, "_down_pressed");
- file->connect("files_selected", this, "_file_load_request");
+ load->connect("pressed", callable_mp(this, &SpriteFramesEditor::_load_pressed));
+ load_sheet->connect("pressed", callable_mp(this, &SpriteFramesEditor::_open_sprite_sheet));
+ _delete->connect("pressed", callable_mp(this, &SpriteFramesEditor::_delete_pressed));
+ copy->connect("pressed", callable_mp(this, &SpriteFramesEditor::_copy_pressed));
+ paste->connect("pressed", callable_mp(this, &SpriteFramesEditor::_paste_pressed));
+ empty->connect("pressed", callable_mp(this, &SpriteFramesEditor::_empty_pressed));
+ empty2->connect("pressed", callable_mp(this, &SpriteFramesEditor::_empty2_pressed));
+ move_up->connect("pressed", callable_mp(this, &SpriteFramesEditor::_up_pressed));
+ move_down->connect("pressed", callable_mp(this, &SpriteFramesEditor::_down_pressed));
+ file->connect("files_selected", callable_mp(this, &SpriteFramesEditor::_file_load_request), make_binds(-1));
loading_scene = false;
sel = -1;
@@ -1023,14 +1128,14 @@ SpriteFramesEditor::SpriteFramesEditor() {
delete_dialog = memnew(ConfirmationDialog);
add_child(delete_dialog);
- delete_dialog->connect("confirmed", this, "_animation_remove_confirmed");
+ delete_dialog->connect("confirmed", callable_mp(this, &SpriteFramesEditor::_animation_remove_confirmed));
split_sheet_dialog = memnew(ConfirmationDialog);
add_child(split_sheet_dialog);
VBoxContainer *split_sheet_vb = memnew(VBoxContainer);
split_sheet_dialog->add_child(split_sheet_vb);
split_sheet_dialog->set_title(TTR("Select Frames"));
- split_sheet_dialog->connect("confirmed", this, "_sheet_add_frames");
+ split_sheet_dialog->connect("confirmed", callable_mp(this, &SpriteFramesEditor::_sheet_add_frames));
HBoxContainer *split_sheet_hb = memnew(HBoxContainer);
@@ -1041,7 +1146,7 @@ SpriteFramesEditor::SpriteFramesEditor() {
split_sheet_h->set_max(128);
split_sheet_h->set_step(1);
split_sheet_hb->add_child(split_sheet_h);
- split_sheet_h->connect("value_changed", this, "_sheet_spin_changed");
+ split_sheet_h->connect("value_changed", callable_mp(this, &SpriteFramesEditor::_sheet_spin_changed));
ss_label = memnew(Label(TTR("Vertical:")));
split_sheet_hb->add_child(ss_label);
@@ -1050,82 +1155,129 @@ SpriteFramesEditor::SpriteFramesEditor() {
split_sheet_v->set_max(128);
split_sheet_v->set_step(1);
split_sheet_hb->add_child(split_sheet_v);
- split_sheet_v->connect("value_changed", this, "_sheet_spin_changed");
+ split_sheet_v->connect("value_changed", callable_mp(this, &SpriteFramesEditor::_sheet_spin_changed));
split_sheet_hb->add_spacer();
Button *select_clear_all = memnew(Button);
select_clear_all->set_text(TTR("Select/Clear All Frames"));
- select_clear_all->connect("pressed", this, "_sheet_select_clear_all_frames");
+ select_clear_all->connect("pressed", callable_mp(this, &SpriteFramesEditor::_sheet_select_clear_all_frames));
split_sheet_hb->add_child(select_clear_all);
split_sheet_vb->add_child(split_sheet_hb);
+ PanelContainer *split_sheet_panel = memnew(PanelContainer);
+ split_sheet_panel->set_h_size_flags(SIZE_EXPAND_FILL);
+ split_sheet_panel->set_v_size_flags(SIZE_EXPAND_FILL);
+ split_sheet_vb->add_child(split_sheet_panel);
+
split_sheet_preview = memnew(TextureRect);
- split_sheet_preview->set_expand(false);
+ split_sheet_preview->set_expand(true);
split_sheet_preview->set_mouse_filter(MOUSE_FILTER_PASS);
- split_sheet_preview->connect("draw", this, "_sheet_preview_draw");
- split_sheet_preview->connect("gui_input", this, "_sheet_preview_input");
+ split_sheet_preview->connect("draw", callable_mp(this, &SpriteFramesEditor::_sheet_preview_draw));
+ split_sheet_preview->connect("gui_input", callable_mp(this, &SpriteFramesEditor::_sheet_preview_input));
splite_sheet_scroll = memnew(ScrollContainer);
splite_sheet_scroll->set_enable_h_scroll(true);
splite_sheet_scroll->set_enable_v_scroll(true);
- splite_sheet_scroll->set_v_size_flags(SIZE_EXPAND_FILL);
+ splite_sheet_scroll->connect("gui_input", callable_mp(this, &SpriteFramesEditor::_sheet_scroll_input));
+ split_sheet_panel->add_child(splite_sheet_scroll);
CenterContainer *cc = memnew(CenterContainer);
cc->add_child(split_sheet_preview);
cc->set_h_size_flags(SIZE_EXPAND_FILL);
cc->set_v_size_flags(SIZE_EXPAND_FILL);
splite_sheet_scroll->add_child(cc);
- split_sheet_vb->add_child(splite_sheet_scroll);
+ MarginContainer *split_sheet_zoom_margin = memnew(MarginContainer);
+ split_sheet_panel->add_child(split_sheet_zoom_margin);
+ split_sheet_zoom_margin->set_h_size_flags(0);
+ split_sheet_zoom_margin->set_v_size_flags(0);
+ split_sheet_zoom_margin->add_theme_constant_override("margin_top", 5);
+ split_sheet_zoom_margin->add_theme_constant_override("margin_left", 5);
+ HBoxContainer *split_sheet_zoom_hb = memnew(HBoxContainer);
+ split_sheet_zoom_margin->add_child(split_sheet_zoom_hb);
+
+ split_sheet_zoom_out = memnew(Button);
+ split_sheet_zoom_out->set_flat(true);
+ split_sheet_zoom_out->set_focus_mode(FOCUS_NONE);
+ split_sheet_zoom_out->set_tooltip(TTR("Zoom Out"));
+ split_sheet_zoom_out->connect("pressed", callable_mp(this, &SpriteFramesEditor::_sheet_zoom_out));
+ split_sheet_zoom_hb->add_child(split_sheet_zoom_out);
+ split_sheet_zoom_1 = memnew(Button);
+ split_sheet_zoom_1->set_flat(true);
+ split_sheet_zoom_1->set_focus_mode(FOCUS_NONE);
+ split_sheet_zoom_1->set_tooltip(TTR("Zoom Reset"));
+ split_sheet_zoom_1->connect("pressed", callable_mp(this, &SpriteFramesEditor::_sheet_zoom_reset));
+ split_sheet_zoom_hb->add_child(split_sheet_zoom_1);
+ split_sheet_zoom_in = memnew(Button);
+ split_sheet_zoom_in->set_flat(true);
+ split_sheet_zoom_in->set_focus_mode(FOCUS_NONE);
+ split_sheet_zoom_in->set_tooltip(TTR("Zoom In"));
+ split_sheet_zoom_in->connect("pressed", callable_mp(this, &SpriteFramesEditor::_sheet_zoom_in));
+ split_sheet_zoom_hb->add_child(split_sheet_zoom_in);
file_split_sheet = memnew(EditorFileDialog);
file_split_sheet->set_title(TTR("Create Frames from Sprite Sheet"));
- file_split_sheet->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_split_sheet->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
add_child(file_split_sheet);
- file_split_sheet->connect("file_selected", this, "_prepare_sprite_sheet");
+ file_split_sheet->connect("file_selected", callable_mp(this, &SpriteFramesEditor::_prepare_sprite_sheet));
+
+ // Config scale.
+ scale_ratio = 1.2f;
+ thumbnail_default_size = 96;
+ thumbnail_zoom = 1.0f;
+ max_thumbnail_zoom = 8.0f;
+ min_thumbnail_zoom = 0.1f;
+ sheet_zoom = 1.0f;
+ max_sheet_zoom = 16.0f;
+ min_sheet_zoom = 0.01f;
+ _zoom_reset();
}
void SpriteFramesEditorPlugin::edit(Object *p_object) {
-
frames_editor->set_undo_redo(&get_undo_redo());
SpriteFrames *s;
- AnimatedSprite *animated_sprite = Object::cast_to<AnimatedSprite>(p_object);
+ AnimatedSprite2D *animated_sprite = Object::cast_to<AnimatedSprite2D>(p_object);
if (animated_sprite) {
s = *animated_sprite->get_sprite_frames();
} else {
- s = Object::cast_to<SpriteFrames>(p_object);
+ AnimatedSprite3D *animated_sprite_3d = Object::cast_to<AnimatedSprite3D>(p_object);
+ if (animated_sprite_3d) {
+ s = *animated_sprite_3d->get_sprite_frames();
+ } else {
+ s = Object::cast_to<SpriteFrames>(p_object);
+ }
}
frames_editor->edit(s);
}
bool SpriteFramesEditorPlugin::handles(Object *p_object) const {
-
- AnimatedSprite *animated_sprite = Object::cast_to<AnimatedSprite>(p_object);
+ AnimatedSprite2D *animated_sprite = Object::cast_to<AnimatedSprite2D>(p_object);
+ AnimatedSprite3D *animated_sprite_3d = Object::cast_to<AnimatedSprite3D>(p_object);
if (animated_sprite && *animated_sprite->get_sprite_frames()) {
return true;
+ } else if (animated_sprite_3d && *animated_sprite_3d->get_sprite_frames()) {
+ return true;
} else {
return p_object->is_class("SpriteFrames");
}
}
void SpriteFramesEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
button->show();
editor->make_bottom_panel_item_visible(frames_editor);
} else {
-
button->hide();
- if (frames_editor->is_visible_in_tree())
+ if (frames_editor->is_visible_in_tree()) {
editor->hide_bottom_panel();
+ }
}
}
SpriteFramesEditorPlugin::SpriteFramesEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
frames_editor = memnew(SpriteFramesEditor);
frames_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE);
diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h
index aa683605ed..0dce93f55a 100644
--- a/editor/plugins/sprite_frames_editor_plugin.h
+++ b/editor/plugins/sprite_frames_editor_plugin.h
@@ -33,33 +33,36 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-#include "scene/2d/animated_sprite.h"
+#include "scene/2d/animated_sprite_2d.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/file_dialog.h"
+#include "scene/gui/scroll_container.h"
#include "scene/gui/split_container.h"
#include "scene/gui/texture_rect.h"
#include "scene/gui/tree.h"
class SpriteFramesEditor : public HSplitContainer {
-
GDCLASS(SpriteFramesEditor, HSplitContainer);
- ToolButton *load;
- ToolButton *load_sheet;
- ToolButton *_delete;
- ToolButton *copy;
- ToolButton *paste;
- ToolButton *empty;
- ToolButton *empty2;
- ToolButton *move_up;
- ToolButton *move_down;
+ Button *load;
+ Button *load_sheet;
+ Button *_delete;
+ Button *copy;
+ Button *paste;
+ Button *empty;
+ Button *empty2;
+ Button *move_up;
+ Button *move_down;
+ Button *zoom_out;
+ Button *zoom_1;
+ Button *zoom_in;
ItemList *tree;
bool loading_scene;
int sel;
HSplitContainer *split;
- ToolButton *new_anim;
- ToolButton *remove_anim;
+ Button *new_anim;
+ Button *remove_anim;
Tree *animations;
SpinBox *anim_speed;
@@ -80,13 +83,25 @@ class SpriteFramesEditor : public HSplitContainer {
TextureRect *split_sheet_preview;
SpinBox *split_sheet_h;
SpinBox *split_sheet_v;
+ Button *split_sheet_zoom_out;
+ Button *split_sheet_zoom_1;
+ Button *split_sheet_zoom_in;
EditorFileDialog *file_split_sheet;
Set<int> frames_selected;
int last_frame_selected;
+ float scale_ratio;
+ int thumbnail_default_size;
+ float thumbnail_zoom;
+ float max_thumbnail_zoom;
+ float min_thumbnail_zoom;
+ float sheet_zoom;
+ float max_sheet_zoom;
+ float min_sheet_zoom;
+
void _load_pressed();
void _load_scene_pressed();
- void _file_load_request(const PoolVector<String> &p_path, int p_at_pos = -1);
+ void _file_load_request(const Vector<String> &p_path, int p_at_pos = -1);
void _copy_pressed();
void _paste_pressed();
void _empty_pressed();
@@ -104,6 +119,11 @@ class SpriteFramesEditor : public HSplitContainer {
void _animation_loop_changed();
void _animation_fps_changed(double p_value);
+ void _tree_input(const Ref<InputEvent> &p_event);
+ void _zoom_in();
+ void _zoom_out();
+ void _zoom_reset();
+
bool updating;
UndoRedo *undo_redo;
@@ -118,7 +138,11 @@ class SpriteFramesEditor : public HSplitContainer {
void _sheet_preview_draw();
void _sheet_spin_changed(double);
void _sheet_preview_input(const Ref<InputEvent> &p_event);
+ void _sheet_scroll_input(const Ref<InputEvent> &p_event);
void _sheet_add_frames();
+ void _sheet_zoom_in();
+ void _sheet_zoom_out();
+ void _sheet_zoom_reset();
void _sheet_select_clear_all_frames();
protected:
@@ -134,7 +158,6 @@ public:
};
class SpriteFramesEditorPlugin : public EditorPlugin {
-
GDCLASS(SpriteFramesEditorPlugin, EditorPlugin);
SpriteFramesEditor *frames_editor;
@@ -142,11 +165,11 @@ class SpriteFramesEditorPlugin : public EditorPlugin {
Button *button;
public:
- virtual String get_name() const { return "SpriteFrames"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "SpriteFrames"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
SpriteFramesEditorPlugin(EditorNode *p_node);
~SpriteFramesEditorPlugin();
diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp
index eebcd567a4..3641052a4e 100644
--- a/editor/plugins/style_box_editor_plugin.cpp
+++ b/editor/plugins/style_box_editor_plugin.cpp
@@ -33,38 +33,37 @@
#include "editor/editor_scale.h"
bool EditorInspectorPluginStyleBox::can_handle(Object *p_object) {
-
- return Object::cast_to<StyleBox>(p_object) != NULL;
+ return Object::cast_to<StyleBox>(p_object) != nullptr;
}
void EditorInspectorPluginStyleBox::parse_begin(Object *p_object) {
-
Ref<StyleBox> sb = Ref<StyleBox>(Object::cast_to<StyleBox>(p_object));
StyleBoxPreview *preview = memnew(StyleBoxPreview);
preview->edit(sb);
add_custom_control(preview);
}
-bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
+
+bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) {
return false; //do not want
}
+
void EditorInspectorPluginStyleBox::parse_end() {
}
void StyleBoxPreview::edit(const Ref<StyleBox> &p_stylebox) {
-
- if (stylebox.is_valid())
- stylebox->disconnect("changed", this, "_sb_changed");
+ if (stylebox.is_valid()) {
+ stylebox->disconnect("changed", callable_mp(this, &StyleBoxPreview::_sb_changed));
+ }
stylebox = p_stylebox;
if (p_stylebox.is_valid()) {
- preview->add_style_override("panel", stylebox);
- stylebox->connect("changed", this, "_sb_changed");
+ preview->add_theme_style_override("panel", stylebox);
+ stylebox->connect("changed", callable_mp(this, &StyleBoxPreview::_sb_changed));
}
_sb_changed();
}
void StyleBoxPreview::_sb_changed() {
-
preview->update();
}
@@ -82,21 +81,17 @@ void StyleBoxPreview::_redraw() {
}
void StyleBoxPreview::_bind_methods() {
-
- ClassDB::bind_method("_sb_changed", &StyleBoxPreview::_sb_changed);
- ClassDB::bind_method("_redraw", &StyleBoxPreview::_redraw);
}
StyleBoxPreview::StyleBoxPreview() {
preview = memnew(Control);
preview->set_custom_minimum_size(Size2(0, 150 * EDSCALE));
preview->set_clip_contents(true);
- preview->connect("draw", this, "_redraw");
+ preview->connect("draw", callable_mp(this, &StyleBoxPreview::_redraw));
add_margin_child(TTR("Preview:"), preview);
}
StyleBoxEditorPlugin::StyleBoxEditorPlugin(EditorNode *p_node) {
-
Ref<EditorInspectorPluginStyleBox> inspector_plugin;
inspector_plugin.instance();
add_inspector_plugin(inspector_plugin);
diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h
index f4a72d9d1c..41daa662db 100644
--- a/editor/plugins/style_box_editor_plugin.h
+++ b/editor/plugins/style_box_editor_plugin.h
@@ -38,7 +38,6 @@
#include "scene/resources/style_box.h"
class StyleBoxPreview : public VBoxContainer {
-
GDCLASS(StyleBoxPreview, VBoxContainer);
Control *preview;
@@ -60,18 +59,17 @@ class EditorInspectorPluginStyleBox : public EditorInspectorPlugin {
GDCLASS(EditorInspectorPluginStyleBox, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
- virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage);
- virtual void parse_end();
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
+ virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override;
+ virtual void parse_end() override;
};
class StyleBoxEditorPlugin : public EditorPlugin {
-
GDCLASS(StyleBoxEditorPlugin, EditorPlugin);
public:
- virtual String get_name() const { return "StyleBox"; }
+ virtual String get_name() const override { return "StyleBox"; }
StyleBoxEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp
index 57447abf47..8935b698b6 100644
--- a/editor/plugins/text_editor.cpp
+++ b/editor/plugins/text_editor.cpp
@@ -33,46 +33,34 @@
#include "core/os/keyboard.h"
#include "editor/editor_node.h"
-void TextEditor::add_syntax_highlighter(SyntaxHighlighter *p_highlighter) {
- highlighters[p_highlighter->get_name()] = p_highlighter;
- highlighter_menu->add_radio_check_item(p_highlighter->get_name());
+void TextEditor::add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) {
+ ERR_FAIL_COND(p_highlighter.is_null());
+
+ highlighters[p_highlighter->_get_name()] = p_highlighter;
+ highlighter_menu->add_radio_check_item(p_highlighter->_get_name());
}
-void TextEditor::set_syntax_highlighter(SyntaxHighlighter *p_highlighter) {
- TextEdit *te = code_editor->get_text_edit();
- te->_set_syntax_highlighting(p_highlighter);
- if (p_highlighter != NULL) {
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(p_highlighter->get_name()), true);
- } else {
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text("Standard"), true);
- }
+void TextEditor::set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) {
+ ERR_FAIL_COND(p_highlighter.is_null());
- // little work around. GDScript highlighter goes through text_edit for colours,
- // so to remove all colours we need to set and unset them here.
- if (p_highlighter == NULL) { // standard
- TextEdit *text_edit = code_editor->get_text_edit();
- text_edit->add_color_override("number_color", colors_cache.font_color);
- text_edit->add_color_override("function_color", colors_cache.font_color);
- text_edit->add_color_override("number_color", colors_cache.font_color);
- text_edit->add_color_override("member_variable_color", colors_cache.font_color);
- } else {
- _load_theme_settings();
+ Map<String, Ref<EditorSyntaxHighlighter>>::Element *el = highlighters.front();
+ while (el != nullptr) {
+ int highlighter_index = highlighter_menu->get_item_idx_from_text(el->key());
+ highlighter_menu->set_item_checked(highlighter_index, el->value() == p_highlighter);
+ el = el->next();
}
+
+ CodeEdit *te = code_editor->get_text_editor();
+ te->set_syntax_highlighter(p_highlighter);
}
void TextEditor::_change_syntax_highlighter(int p_idx) {
- Map<String, SyntaxHighlighter *>::Element *el = highlighters.front();
- while (el != NULL) {
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(el->key()), false);
- el = el->next();
- }
set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]);
}
void TextEditor::_load_theme_settings() {
-
- TextEdit *text_edit = code_editor->get_text_edit();
- text_edit->clear_colors();
+ CodeEdit *text_edit = code_editor->get_text_editor();
+ text_edit->get_syntax_highlighter()->update_cache();
Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
Color completion_background_color = EDITOR_GET("text_editor/highlighting/completion_background_color");
@@ -90,9 +78,6 @@ void TextEditor::_load_theme_settings() {
Color current_line_color = EDITOR_GET("text_editor/highlighting/current_line_color");
Color line_length_guideline_color = EDITOR_GET("text_editor/highlighting/line_length_guideline_color");
Color word_highlighted_color = EDITOR_GET("text_editor/highlighting/word_highlighted_color");
- Color number_color = EDITOR_GET("text_editor/highlighting/number_color");
- Color function_color = EDITOR_GET("text_editor/highlighting/function_color");
- Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
Color mark_color = EDITOR_GET("text_editor/highlighting/mark_color");
Color bookmark_color = EDITOR_GET("text_editor/highlighting/bookmark_color");
Color breakpoint_color = EDITOR_GET("text_editor/highlighting/breakpoint_color");
@@ -100,50 +85,32 @@ void TextEditor::_load_theme_settings() {
Color code_folding_color = EDITOR_GET("text_editor/highlighting/code_folding_color");
Color search_result_color = EDITOR_GET("text_editor/highlighting/search_result_color");
Color search_result_border_color = EDITOR_GET("text_editor/highlighting/search_result_border_color");
- Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
- Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
- Color basetype_color = EDITOR_GET("text_editor/highlighting/base_type_color");
- Color type_color = EDITOR_GET("text_editor/highlighting/engine_type_color");
- Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
- Color string_color = EDITOR_GET("text_editor/highlighting/string_color");
-
- text_edit->add_color_override("background_color", background_color);
- text_edit->add_color_override("completion_background_color", completion_background_color);
- text_edit->add_color_override("completion_selected_color", completion_selected_color);
- text_edit->add_color_override("completion_existing_color", completion_existing_color);
- text_edit->add_color_override("completion_scroll_color", completion_scroll_color);
- text_edit->add_color_override("completion_font_color", completion_font_color);
- text_edit->add_color_override("font_color", text_color);
- text_edit->add_color_override("line_number_color", line_number_color);
- text_edit->add_color_override("caret_color", caret_color);
- text_edit->add_color_override("caret_background_color", caret_background_color);
- text_edit->add_color_override("font_color_selected", text_selected_color);
- text_edit->add_color_override("selection_color", selection_color);
- text_edit->add_color_override("brace_mismatch_color", brace_mismatch_color);
- text_edit->add_color_override("current_line_color", current_line_color);
- text_edit->add_color_override("line_length_guideline_color", line_length_guideline_color);
- text_edit->add_color_override("word_highlighted_color", word_highlighted_color);
- text_edit->add_color_override("number_color", number_color);
- text_edit->add_color_override("function_color", function_color);
- text_edit->add_color_override("member_variable_color", member_variable_color);
- text_edit->add_color_override("breakpoint_color", breakpoint_color);
- text_edit->add_color_override("executing_line_color", executing_line_color);
- text_edit->add_color_override("mark_color", mark_color);
- text_edit->add_color_override("bookmark_color", bookmark_color);
- text_edit->add_color_override("code_folding_color", code_folding_color);
- text_edit->add_color_override("search_result_color", search_result_color);
- text_edit->add_color_override("search_result_border_color", search_result_border_color);
- text_edit->add_color_override("symbol_color", symbol_color);
-
- text_edit->add_constant_override("line_spacing", EDITOR_DEF("text_editor/theme/line_spacing", 6));
-
- colors_cache.font_color = text_color;
- colors_cache.symbol_color = symbol_color;
- colors_cache.keyword_color = keyword_color;
- colors_cache.basetype_color = basetype_color;
- colors_cache.type_color = type_color;
- colors_cache.comment_color = comment_color;
- colors_cache.string_color = string_color;
+
+ text_edit->add_theme_color_override("background_color", background_color);
+ text_edit->add_theme_color_override("completion_background_color", completion_background_color);
+ text_edit->add_theme_color_override("completion_selected_color", completion_selected_color);
+ text_edit->add_theme_color_override("completion_existing_color", completion_existing_color);
+ text_edit->add_theme_color_override("completion_scroll_color", completion_scroll_color);
+ text_edit->add_theme_color_override("completion_font_color", completion_font_color);
+ text_edit->add_theme_color_override("font_color", text_color);
+ text_edit->add_theme_color_override("line_number_color", line_number_color);
+ text_edit->add_theme_color_override("caret_color", caret_color);
+ text_edit->add_theme_color_override("caret_background_color", caret_background_color);
+ text_edit->add_theme_color_override("font_color_selected", text_selected_color);
+ text_edit->add_theme_color_override("selection_color", selection_color);
+ text_edit->add_theme_color_override("brace_mismatch_color", brace_mismatch_color);
+ text_edit->add_theme_color_override("current_line_color", current_line_color);
+ text_edit->add_theme_color_override("line_length_guideline_color", line_length_guideline_color);
+ text_edit->add_theme_color_override("word_highlighted_color", word_highlighted_color);
+ text_edit->add_theme_color_override("breakpoint_color", breakpoint_color);
+ text_edit->add_theme_color_override("executing_line_color", executing_line_color);
+ text_edit->add_theme_color_override("mark_color", mark_color);
+ text_edit->add_theme_color_override("bookmark_color", bookmark_color);
+ text_edit->add_theme_color_override("code_folding_color", code_folding_color);
+ text_edit->add_theme_color_override("search_result_color", search_result_color);
+ text_edit->add_theme_color_override("search_result_border_color", search_result_border_color);
+
+ text_edit->add_theme_constant_override("line_spacing", EDITOR_DEF("text_editor/theme/line_spacing", 6));
}
String TextEditor::get_name() {
@@ -152,6 +119,9 @@ String TextEditor::get_name() {
if (text_file->get_path().find("local://") == -1 && text_file->get_path().find("::") == -1) {
name = text_file->get_path().get_file();
if (is_unsaved()) {
+ if (text_file->get_path().empty()) {
+ name = TTR("[unsaved]");
+ }
name += "(*)";
}
} else if (text_file->get_name() != "") {
@@ -163,9 +133,8 @@ String TextEditor::get_name() {
return name;
}
-Ref<Texture> TextEditor::get_icon() {
-
- return EditorNode::get_singleton()->get_object_icon(text_file.operator->(), "");
+Ref<Texture2D> TextEditor::get_theme_icon() {
+ return EditorNode::get_singleton()->get_object_icon(text_file.ptr(), "");
}
RES TextEditor::get_edited_resource() const {
@@ -173,32 +142,43 @@ RES TextEditor::get_edited_resource() const {
}
void TextEditor::set_edited_resource(const RES &p_res) {
- ERR_FAIL_COND(!text_file.is_null());
+ ERR_FAIL_COND(text_file.is_valid());
+ ERR_FAIL_COND(p_res.is_null());
text_file = p_res;
- code_editor->get_text_edit()->set_text(text_file->get_text());
- code_editor->get_text_edit()->clear_undo_history();
- code_editor->get_text_edit()->tag_saved_version();
+ 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();
emit_signal("name_changed");
code_editor->update_line_and_column();
}
-void TextEditor::add_callback(const String &p_function, PoolStringArray p_args) {
+void TextEditor::enable_editor() {
+ if (editor_enabled) {
+ return;
+ }
+
+ editor_enabled = true;
+
+ _load_theme_settings();
+}
+
+void TextEditor::add_callback(const String &p_function, PackedStringArray p_args) {
}
void TextEditor::set_debugger_active(bool p_active) {
}
-void TextEditor::get_breakpoints(List<int> *p_breakpoints) {
+Array TextEditor::get_breakpoints() {
+ return Array();
}
void TextEditor::reload_text() {
-
ERR_FAIL_COND(text_file.is_null());
- TextEdit *te = code_editor->get_text_edit();
+ CodeEdit *te = code_editor->get_text_editor();
int column = te->cursor_get_column();
int row = te->cursor_get_line();
int h = te->get_h_scroll();
@@ -221,7 +201,6 @@ void TextEditor::_validate_script() {
}
void TextEditor::_update_bookmark_list() {
-
bookmarks_menu->clear();
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE);
@@ -229,7 +208,7 @@ void TextEditor::_update_bookmark_list() {
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_bookmark"), BOOKMARK_GOTO_NEXT);
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_bookmark"), BOOKMARK_GOTO_PREV);
- Array bookmark_list = code_editor->get_text_edit()->get_bookmarks_array();
+ Array bookmark_list = code_editor->get_text_editor()->get_bookmarked_lines();
if (bookmark_list.size() == 0) {
return;
}
@@ -237,7 +216,7 @@ void TextEditor::_update_bookmark_list() {
bookmarks_menu->add_separator();
for (int i = 0; i < bookmark_list.size(); i++) {
- String line = code_editor->get_text_edit()->get_line(bookmark_list[i]).strip_edges();
+ String line = code_editor->get_text_editor()->get_line(bookmark_list[i]).strip_edges();
// Limit the size of the line if too big.
if (line.length() > 50) {
line = line.substr(0, 50);
@@ -249,7 +228,6 @@ void TextEditor::_update_bookmark_list() {
}
void TextEditor::_bookmark_item_pressed(int p_idx) {
-
if (p_idx < 4) { // Any item before the separator.
_edit_option(bookmarks_menu->get_item_id(p_idx));
} else {
@@ -258,21 +236,21 @@ void TextEditor::_bookmark_item_pressed(int p_idx) {
}
void TextEditor::apply_code() {
- text_file->set_text(code_editor->get_text_edit()->get_text());
+ text_file->set_text(code_editor->get_text_editor()->get_text());
}
bool TextEditor::is_unsaved() {
-
- return code_editor->get_text_edit()->get_version() != code_editor->get_text_edit()->get_saved_version();
+ const bool unsaved =
+ code_editor->get_text_editor()->get_version() != code_editor->get_text_editor()->get_saved_version() ||
+ text_file->get_path().empty(); // In memory.
+ return unsaved;
}
Variant TextEditor::get_edit_state() {
-
return code_editor->get_edit_state();
}
void TextEditor::set_edit_state(const Variant &p_state) {
-
code_editor->set_edit_state(p_state);
Dictionary state = p_state;
@@ -282,45 +260,39 @@ void TextEditor::set_edit_state(const Variant &p_state) {
_change_syntax_highlighter(idx);
}
}
+
+ ensure_focus();
}
void TextEditor::trim_trailing_whitespace() {
-
code_editor->trim_trailing_whitespace();
}
void TextEditor::insert_final_newline() {
-
code_editor->insert_final_newline();
}
void TextEditor::convert_indent_to_spaces() {
-
code_editor->convert_indent_to_spaces();
}
void TextEditor::convert_indent_to_tabs() {
-
code_editor->convert_indent_to_tabs();
}
void TextEditor::tag_saved_version() {
-
- code_editor->get_text_edit()->tag_saved_version();
+ code_editor->get_text_editor()->tag_saved_version();
}
void TextEditor::goto_line(int p_line, bool p_with_error) {
-
code_editor->goto_line(p_line);
}
void TextEditor::goto_line_selection(int p_line, int p_begin, int p_end) {
-
code_editor->goto_line_selection(p_line, p_begin, p_end);
}
void TextEditor::set_executing_line(int p_line) {
-
code_editor->set_executing_line(p_line);
}
@@ -329,12 +301,10 @@ void TextEditor::clear_executing_line() {
}
void TextEditor::ensure_focus() {
-
- code_editor->get_text_edit()->grab_focus();
+ code_editor->get_text_editor()->grab_focus();
}
Vector<String> TextEditor::get_functions() {
-
return Vector<String>();
}
@@ -343,17 +313,14 @@ bool TextEditor::show_members_overview() {
}
void TextEditor::update_settings() {
-
code_editor->update_editor_settings();
}
void TextEditor::set_tooltip_request_func(String p_method, Object *p_obj) {
-
- code_editor->get_text_edit()->set_tooltip_request_func(p_obj, p_method, this);
+ code_editor->get_text_editor()->set_tooltip_request_func(p_obj, p_method, this);
}
Control *TextEditor::get_edit_menu() {
-
return edit_hb;
}
@@ -361,197 +328,150 @@ void TextEditor::clear_edit_menu() {
memdelete(edit_hb);
}
-void TextEditor::_notification(int p_what) {
-
- switch (p_what) {
- case NOTIFICATION_READY:
- _load_theme_settings();
- break;
- }
-}
-
void TextEditor::_edit_option(int p_op) {
- TextEdit *tx = code_editor->get_text_edit();
+ CodeEdit *tx = code_editor->get_text_editor();
switch (p_op) {
case EDIT_UNDO: {
-
tx->undo();
tx->call_deferred("grab_focus");
} break;
case EDIT_REDO: {
-
tx->redo();
tx->call_deferred("grab_focus");
} break;
case EDIT_CUT: {
-
tx->cut();
tx->call_deferred("grab_focus");
} break;
case EDIT_COPY: {
-
tx->copy();
tx->call_deferred("grab_focus");
} break;
case EDIT_PASTE: {
-
tx->paste();
tx->call_deferred("grab_focus");
} break;
case EDIT_SELECT_ALL: {
-
tx->select_all();
tx->call_deferred("grab_focus");
} break;
case EDIT_MOVE_LINE_UP: {
-
code_editor->move_lines_up();
} break;
case EDIT_MOVE_LINE_DOWN: {
-
code_editor->move_lines_down();
} break;
case EDIT_INDENT_LEFT: {
-
tx->indent_left();
} break;
case EDIT_INDENT_RIGHT: {
-
tx->indent_right();
} break;
case EDIT_DELETE_LINE: {
-
code_editor->delete_lines();
} break;
case EDIT_CLONE_DOWN: {
-
code_editor->clone_lines_down();
} break;
case EDIT_TOGGLE_FOLD_LINE: {
-
tx->toggle_fold_line(tx->cursor_get_line());
tx->update();
} break;
case EDIT_FOLD_ALL_LINES: {
-
tx->fold_all_lines();
tx->update();
} break;
case EDIT_UNFOLD_ALL_LINES: {
-
tx->unhide_all_lines();
tx->update();
} break;
case EDIT_TRIM_TRAILING_WHITESAPCE: {
-
trim_trailing_whitespace();
} break;
case EDIT_CONVERT_INDENT_TO_SPACES: {
-
convert_indent_to_spaces();
} break;
case EDIT_CONVERT_INDENT_TO_TABS: {
-
convert_indent_to_tabs();
} break;
case EDIT_TO_UPPERCASE: {
-
_convert_case(CodeTextEditor::UPPER);
} break;
case EDIT_TO_LOWERCASE: {
-
_convert_case(CodeTextEditor::LOWER);
} break;
case EDIT_CAPITALIZE: {
-
_convert_case(CodeTextEditor::CAPITALIZE);
} break;
case SEARCH_FIND: {
-
code_editor->get_find_replace_bar()->popup_search();
} break;
case SEARCH_FIND_NEXT: {
-
code_editor->get_find_replace_bar()->search_next();
} break;
case SEARCH_FIND_PREV: {
-
code_editor->get_find_replace_bar()->search_prev();
} break;
case SEARCH_REPLACE: {
-
code_editor->get_find_replace_bar()->popup_replace();
} break;
case SEARCH_IN_FILES: {
-
- String selected_text = code_editor->get_text_edit()->get_selection_text();
+ String selected_text = code_editor->get_text_editor()->get_selection_text();
// Yep, because it doesn't make sense to instance this dialog for every single script open...
// So this will be delegated to the ScriptEditor.
emit_signal("search_in_files_requested", selected_text);
} break;
- case SEARCH_GOTO_LINE: {
+ case REPLACE_IN_FILES: {
+ String selected_text = code_editor->get_text_editor()->get_selection_text();
+ emit_signal("replace_in_files_requested", selected_text);
+ } break;
+ case SEARCH_GOTO_LINE: {
goto_line_dialog->popup_find_line(tx);
} break;
case BOOKMARK_TOGGLE: {
-
code_editor->toggle_bookmark();
} break;
case BOOKMARK_GOTO_NEXT: {
-
code_editor->goto_next_bookmark();
} break;
case BOOKMARK_GOTO_PREV: {
-
code_editor->goto_prev_bookmark();
} break;
case BOOKMARK_REMOVE_ALL: {
-
code_editor->remove_all_bookmarks();
} break;
}
}
void TextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) {
-
code_editor->convert_case(p_case);
}
void TextEditor::_bind_methods() {
-
- ClassDB::bind_method("_validate_script", &TextEditor::_validate_script);
- ClassDB::bind_method("_update_bookmark_list", &TextEditor::_update_bookmark_list);
- ClassDB::bind_method("_bookmark_item_pressed", &TextEditor::_bookmark_item_pressed);
- ClassDB::bind_method("_load_theme_settings", &TextEditor::_load_theme_settings);
- ClassDB::bind_method("_edit_option", &TextEditor::_edit_option);
- ClassDB::bind_method("_change_syntax_highlighter", &TextEditor::_change_syntax_highlighter);
- ClassDB::bind_method("_text_edit_gui_input", &TextEditor::_text_edit_gui_input);
+ ClassDB::bind_method(D_METHOD("add_syntax_highlighter", "highlighter"), &TextEditor::add_syntax_highlighter);
}
static ScriptEditorBase *create_editor(const RES &p_resource) {
-
if (Object::cast_to<TextFile>(*p_resource)) {
return memnew(TextEditor);
}
- return NULL;
+ return nullptr;
}
void TextEditor::register_editor() {
-
ScriptEditor::register_create_script_editor_function(create_editor);
}
void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
-
Ref<InputEventMouseButton> mb = ev;
if (mb.is_valid()) {
if (mb->get_button_index() == BUTTON_RIGHT) {
-
int col, row;
- TextEdit *tx = code_editor->get_text_edit();
+ CodeEdit *tx = code_editor->get_text_editor();
tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col);
tx->set_right_click_moves_caret(EditorSettings::get_singleton()->get("text_editor/cursor/right_click_moves_caret"));
@@ -560,7 +480,6 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
if (tx->is_right_click_moving_caret()) {
if (tx->is_selection_active()) {
-
int from_line = tx->get_selection_from_line();
int to_line = tx->get_selection_to_line();
int from_column = tx->get_selection_from_column();
@@ -584,8 +503,8 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
}
Ref<InputEventKey> k = ev;
- if (k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_MENU) {
- TextEdit *tx = code_editor->get_text_edit();
+ if (k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_MENU) {
+ CodeEdit *tx = code_editor->get_text_editor();
int line = tx->cursor_get_line();
_make_context_menu(tx->is_selection_active(), tx->can_fold(line), tx->is_folded(line), (get_global_transform().inverse() * tx->get_global_transform()).xform(tx->_get_cursor_pixel_pos()));
context_menu->grab_focus();
@@ -593,7 +512,6 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
}
void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is_folded, Vector2 p_position) {
-
context_menu->clear();
if (p_selection) {
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
@@ -615,8 +533,9 @@ void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_uppercase"), EDIT_TO_UPPERCASE);
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_lowercase"), EDIT_TO_LOWERCASE);
}
- if (p_can_fold || p_is_folded)
+ if (p_can_fold || p_is_folded) {
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE);
+ }
context_menu->set_position(get_global_transform().xform(p_position));
context_menu->set_size(Vector2(1, 1));
@@ -626,20 +545,20 @@ void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is
TextEditor::TextEditor() {
code_editor = memnew(CodeTextEditor);
add_child(code_editor);
- code_editor->add_constant_override("separation", 0);
- code_editor->connect("load_theme_settings", this, "_load_theme_settings");
- code_editor->connect("validate_script", this, "_validate_script");
+ code_editor->add_theme_constant_override("separation", 0);
+ code_editor->connect("load_theme_settings", callable_mp(this, &TextEditor::_load_theme_settings));
+ code_editor->connect("validate_script", callable_mp(this, &TextEditor::_validate_script));
code_editor->set_anchors_and_margins_preset(Control::PRESET_WIDE);
code_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
update_settings();
- code_editor->get_text_edit()->set_context_menu_enabled(false);
- code_editor->get_text_edit()->connect("gui_input", this, "_text_edit_gui_input");
+ code_editor->get_text_editor()->set_context_menu_enabled(false);
+ code_editor->get_text_editor()->connect("gui_input", callable_mp(this, &TextEditor::_text_edit_gui_input));
context_menu = memnew(PopupMenu);
add_child(context_menu);
- context_menu->connect("id_pressed", this, "_edit_option");
+ context_menu->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
edit_hb = memnew(HBoxContainer);
@@ -647,7 +566,7 @@ TextEditor::TextEditor() {
edit_hb->add_child(search_menu);
search_menu->set_text(TTR("Search"));
search_menu->set_switch_on_hover(true);
- search_menu->get_popup()->connect("id_pressed", this, "_edit_option");
+ search_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
@@ -655,12 +574,13 @@ TextEditor::TextEditor() {
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE);
search_menu->get_popup()->add_separator();
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_in_files"), SEARCH_IN_FILES);
+ search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace_in_files"), REPLACE_IN_FILES);
edit_menu = memnew(MenuButton);
edit_hb->add_child(edit_menu);
edit_menu->set_text(TTR("Edit"));
edit_menu->set_switch_on_hover(true);
- edit_menu->get_popup()->connect("id_pressed", this, "_edit_option");
+ edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
@@ -693,21 +613,28 @@ TextEditor::TextEditor() {
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_uppercase", TTR("Uppercase")), EDIT_TO_UPPERCASE);
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_lowercase", TTR("Lowercase")), EDIT_TO_LOWERCASE);
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize")), EDIT_CAPITALIZE);
- convert_case->connect("id_pressed", this, "_edit_option");
+ convert_case->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
- highlighters["Standard"] = NULL;
highlighter_menu = memnew(PopupMenu);
highlighter_menu->set_name("highlighter_menu");
edit_menu->get_popup()->add_child(highlighter_menu);
edit_menu->get_popup()->add_submenu_item(TTR("Syntax Highlighter"), "highlighter_menu");
- highlighter_menu->add_radio_check_item(TTR("Standard"));
- highlighter_menu->connect("id_pressed", this, "_change_syntax_highlighter");
+ highlighter_menu->connect("id_pressed", callable_mp(this, &TextEditor::_change_syntax_highlighter));
+
+ Ref<EditorPlainTextSyntaxHighlighter> plain_highlighter;
+ plain_highlighter.instance();
+ add_syntax_highlighter(plain_highlighter);
+
+ Ref<EditorStandardSyntaxHighlighter> highlighter;
+ highlighter.instance();
+ add_syntax_highlighter(highlighter);
+ set_syntax_highlighter(plain_highlighter);
MenuButton *goto_menu = memnew(MenuButton);
edit_hb->add_child(goto_menu);
goto_menu->set_text(TTR("Go To"));
goto_menu->set_switch_on_hover(true);
- goto_menu->get_popup()->connect("id_pressed", this, "_edit_option");
+ goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE);
goto_menu->get_popup()->add_separator();
@@ -717,21 +644,16 @@ TextEditor::TextEditor() {
goto_menu->get_popup()->add_child(bookmarks_menu);
goto_menu->get_popup()->add_submenu_item(TTR("Bookmarks"), "Bookmarks");
_update_bookmark_list();
- bookmarks_menu->connect("about_to_show", this, "_update_bookmark_list");
- bookmarks_menu->connect("index_pressed", this, "_bookmark_item_pressed");
+ bookmarks_menu->connect("about_to_popup", callable_mp(this, &TextEditor::_update_bookmark_list));
+ bookmarks_menu->connect("index_pressed", callable_mp(this, &TextEditor::_bookmark_item_pressed));
goto_line_dialog = memnew(GotoLineDialog);
add_child(goto_line_dialog);
- code_editor->get_text_edit()->set_drag_forwarding(this);
+ code_editor->get_text_editor()->set_drag_forwarding(this);
}
TextEditor::~TextEditor() {
- for (const Map<String, SyntaxHighlighter *>::Element *E = highlighters.front(); E; E = E->next()) {
- if (E->get() != NULL) {
- memdelete(E->get());
- }
- }
highlighters.clear();
}
diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h
index fe157a29e6..ea425bd033 100644
--- a/editor/plugins/text_editor.h
+++ b/editor/plugins/text_editor.h
@@ -34,32 +34,22 @@
#include "script_editor_plugin.h"
class TextEditor : public ScriptEditorBase {
-
GDCLASS(TextEditor, ScriptEditorBase);
private:
- CodeTextEditor *code_editor;
+ CodeTextEditor *code_editor = nullptr;
Ref<TextFile> text_file;
+ bool editor_enabled = false;
+
+ HBoxContainer *edit_hb = nullptr;
+ MenuButton *edit_menu = nullptr;
+ PopupMenu *highlighter_menu = nullptr;
+ MenuButton *search_menu = nullptr;
+ PopupMenu *bookmarks_menu = nullptr;
+ PopupMenu *context_menu = nullptr;
- HBoxContainer *edit_hb;
- MenuButton *edit_menu;
- PopupMenu *highlighter_menu;
- MenuButton *search_menu;
- PopupMenu *bookmarks_menu;
- PopupMenu *context_menu;
-
- GotoLineDialog *goto_line_dialog;
-
- struct ColorsCache {
- Color font_color;
- Color symbol_color;
- Color keyword_color;
- Color basetype_color;
- Color type_color;
- Color comment_color;
- Color string_color;
- } colors_cache;
+ GotoLineDialog *goto_line_dialog = nullptr;
enum {
EDIT_UNDO,
@@ -88,6 +78,7 @@ private:
SEARCH_FIND_PREV,
SEARCH_REPLACE,
SEARCH_IN_FILES,
+ REPLACE_IN_FILES,
SEARCH_GOTO_LINE,
BOOKMARK_TOGGLE,
BOOKMARK_GOTO_NEXT,
@@ -98,13 +89,11 @@ private:
protected:
static void _bind_methods();
- void _notification(int p_what);
-
void _edit_option(int p_op);
void _make_context_menu(bool p_selection, bool p_can_fold, bool p_is_folded, Vector2 p_position);
void _text_edit_gui_input(const Ref<InputEvent> &ev);
- Map<String, SyntaxHighlighter *> highlighters;
+ Map<String, Ref<EditorSyntaxHighlighter>> highlighters;
void _change_syntax_highlighter(int p_idx);
void _load_theme_settings();
@@ -116,42 +105,42 @@ protected:
void _bookmark_item_pressed(int p_idx);
public:
- virtual void add_syntax_highlighter(SyntaxHighlighter *p_highlighter);
- virtual void set_syntax_highlighter(SyntaxHighlighter *p_highlighter);
-
- virtual String get_name();
- virtual Ref<Texture> get_icon();
- virtual RES get_edited_resource() const;
- virtual void set_edited_resource(const RES &p_res);
- void set_edited_file(const Ref<TextFile> &p_file);
- virtual void reload_text();
- virtual void apply_code();
- virtual bool is_unsaved();
- virtual Variant get_edit_state();
- virtual void set_edit_state(const Variant &p_state);
- virtual Vector<String> get_functions();
- virtual void get_breakpoints(List<int> *p_breakpoints);
- virtual void goto_line(int p_line, bool p_with_error = false);
+ virtual void add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) override;
+ virtual void set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) override;
+
+ virtual String get_name() override;
+ virtual Ref<Texture2D> get_theme_icon() override;
+ virtual RES get_edited_resource() const override;
+ virtual void set_edited_resource(const RES &p_res) override;
+ virtual void enable_editor() override;
+ virtual void reload_text() override;
+ virtual void apply_code() override;
+ virtual bool is_unsaved() override;
+ virtual Variant get_edit_state() override;
+ virtual void set_edit_state(const Variant &p_state) override;
+ virtual Vector<String> get_functions() override;
+ virtual Array get_breakpoints() override;
+ virtual void goto_line(int p_line, bool p_with_error = false) override;
void goto_line_selection(int p_line, int p_begin, int p_end);
- virtual void set_executing_line(int p_line);
- virtual void clear_executing_line();
- virtual void trim_trailing_whitespace();
- virtual void insert_final_newline();
- virtual void convert_indent_to_spaces();
- virtual void convert_indent_to_tabs();
- virtual void ensure_focus();
- virtual void tag_saved_version();
- virtual void update_settings();
- virtual bool show_members_overview();
- virtual bool can_lose_focus_on_node_selection() { return true; }
- virtual void set_debugger_active(bool p_active);
- virtual void set_tooltip_request_func(String p_method, Object *p_obj);
- virtual void add_callback(const String &p_function, PoolStringArray p_args);
-
- virtual Control *get_edit_menu();
- virtual void clear_edit_menu();
-
- virtual void validate();
+ virtual void set_executing_line(int p_line) override;
+ virtual void clear_executing_line() override;
+ virtual void trim_trailing_whitespace() override;
+ virtual void insert_final_newline() override;
+ virtual void convert_indent_to_spaces() override;
+ virtual void convert_indent_to_tabs() override;
+ virtual void ensure_focus() override;
+ virtual void tag_saved_version() override;
+ virtual void update_settings() override;
+ virtual bool show_members_overview() override;
+ virtual bool can_lose_focus_on_node_selection() override { return true; }
+ virtual void set_debugger_active(bool p_active) override;
+ virtual void set_tooltip_request_func(String p_method, Object *p_obj) override;
+ virtual void add_callback(const String &p_function, PackedStringArray p_args) override;
+
+ virtual Control *get_edit_menu() override;
+ virtual void clear_edit_menu() override;
+
+ virtual void validate() override;
static void register_editor();
diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp
new file mode 100644
index 0000000000..ba2eef8484
--- /dev/null
+++ b/editor/plugins/texture_3d_editor_plugin.cpp
@@ -0,0 +1,213 @@
+/*************************************************************************/
+/* texture_3d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "texture_3d_editor_plugin.h"
+
+#include "core/io/resource_loader.h"
+#include "core/project_settings.h"
+#include "editor/editor_settings.h"
+
+void Texture3DEditor::_gui_input(Ref<InputEvent> p_event) {
+}
+
+void Texture3DEditor::_texture_rect_draw() {
+ texture_rect->draw_rect(Rect2(Point2(), texture_rect->get_size()), Color(1, 1, 1, 1));
+}
+
+void Texture3DEditor::_notification(int p_what) {
+ if (p_what == NOTIFICATION_READY) {
+ //get_scene()->connect("node_removed",this,"_node_removed");
+ }
+ if (p_what == NOTIFICATION_RESIZED) {
+ _texture_rect_update_area();
+ }
+
+ if (p_what == NOTIFICATION_DRAW) {
+ Ref<Texture2D> checkerboard = get_theme_icon("Checkerboard", "EditorIcons");
+ Size2 size = get_size();
+
+ draw_texture_rect(checkerboard, Rect2(Point2(), size), true);
+ }
+}
+
+void Texture3DEditor::_changed_callback(Object *p_changed, const char *p_prop) {
+ if (!is_visible()) {
+ return;
+ }
+ update();
+}
+
+void Texture3DEditor::_update_material() {
+ material->set_shader_param("layer", (layer->get_value() + 0.5) / texture->get_depth());
+ material->set_shader_param("tex", texture->get_rid());
+
+ String format = Image::get_format_name(texture->get_format());
+
+ String text;
+ text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + "x" + itos(texture->get_depth()) + " " + format;
+
+ info->set_text(text);
+}
+
+void Texture3DEditor::_make_shaders() {
+ String shader_3d = ""
+ "shader_type canvas_item;\n"
+ "uniform sampler3D tex;\n"
+ "uniform float layer;\n"
+ "void fragment() {\n"
+ " COLOR = textureLod(tex,vec3(UV,layer),0.0);\n"
+ "}";
+
+ shader.instance();
+ shader->set_code(shader_3d);
+ material.instance();
+ material->set_shader(shader);
+}
+
+void Texture3DEditor::_texture_rect_update_area() {
+ Size2 size = get_size();
+ int tex_width = texture->get_width() * size.height / texture->get_height();
+ int tex_height = size.height;
+
+ if (tex_width > size.width) {
+ tex_width = size.width;
+ tex_height = texture->get_height() * tex_width / texture->get_width();
+ }
+
+ // Prevent the texture from being unpreviewable after the rescale, so that we can still see something
+ if (tex_height <= 0) {
+ tex_height = 1;
+ }
+ if (tex_width <= 0) {
+ tex_width = 1;
+ }
+
+ int ofs_x = (size.width - tex_width) / 2;
+ int ofs_y = (size.height - tex_height) / 2;
+
+ texture_rect->set_position(Vector2(ofs_x, ofs_y));
+ texture_rect->set_size(Vector2(tex_width, tex_height));
+}
+
+void Texture3DEditor::edit(Ref<Texture3D> p_texture) {
+ if (!texture.is_null()) {
+ texture->remove_change_receptor(this);
+ }
+
+ texture = p_texture;
+
+ if (!texture.is_null()) {
+ if (shader.is_null()) {
+ _make_shaders();
+ }
+
+ texture->add_change_receptor(this);
+ update();
+ texture_rect->set_material(material);
+ setting = true;
+ layer->set_max(texture->get_depth() - 1);
+ layer->set_value(0);
+ layer->show();
+ _update_material();
+ setting = false;
+ _texture_rect_update_area();
+ } else {
+ hide();
+ }
+}
+
+void Texture3DEditor::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_gui_input"), &Texture3DEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_layer_changed"), &Texture3DEditor::_layer_changed);
+}
+
+Texture3DEditor::Texture3DEditor() {
+ set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED);
+ set_custom_minimum_size(Size2(1, 150));
+ texture_rect = memnew(Control);
+ texture_rect->connect("draw", callable_mp(this, &Texture3DEditor::_texture_rect_draw));
+ texture_rect->set_mouse_filter(MOUSE_FILTER_IGNORE);
+ add_child(texture_rect);
+
+ layer = memnew(SpinBox);
+ layer->set_step(1);
+ layer->set_max(100);
+ add_child(layer);
+ layer->set_anchor(MARGIN_RIGHT, 1);
+ layer->set_anchor(MARGIN_LEFT, 1);
+ layer->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+ layer->set_modulate(Color(1, 1, 1, 0.8));
+ info = memnew(Label);
+ add_child(info);
+ info->set_anchor(MARGIN_RIGHT, 1);
+ info->set_anchor(MARGIN_LEFT, 1);
+ info->set_anchor(MARGIN_BOTTOM, 1);
+ info->set_anchor(MARGIN_TOP, 1);
+ info->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+ info->set_v_grow_direction(GROW_DIRECTION_BEGIN);
+ info->add_theme_color_override("font_color", Color(1, 1, 1, 1));
+ info->add_theme_color_override("font_color_shadow", Color(0, 0, 0, 0.5));
+ info->add_theme_color_override("font_color_shadow", Color(0, 0, 0, 0.5));
+ info->add_theme_constant_override("shadow_as_outline", 1);
+ info->add_theme_constant_override("shadow_offset_x", 2);
+ info->add_theme_constant_override("shadow_offset_y", 2);
+
+ setting = false;
+ layer->connect("value_changed", Callable(this, "_layer_changed"));
+}
+
+Texture3DEditor::~Texture3DEditor() {
+ if (!texture.is_null()) {
+ texture->remove_change_receptor(this);
+ }
+}
+
+//
+bool EditorInspectorPlugin3DTexture::can_handle(Object *p_object) {
+ return Object::cast_to<Texture3D>(p_object) != nullptr;
+}
+
+void EditorInspectorPlugin3DTexture::parse_begin(Object *p_object) {
+ Texture3D *texture = Object::cast_to<Texture3D>(p_object);
+ if (!texture) {
+ return;
+ }
+ Ref<Texture3D> m(texture);
+
+ Texture3DEditor *editor = memnew(Texture3DEditor);
+ editor->edit(m);
+ add_custom_control(editor);
+}
+
+Texture3DEditorPlugin::Texture3DEditorPlugin(EditorNode *p_node) {
+ Ref<EditorInspectorPlugin3DTexture> plugin;
+ plugin.instance();
+ add_inspector_plugin(plugin);
+}
diff --git a/editor/plugins/texture_3d_editor_plugin.h b/editor/plugins/texture_3d_editor_plugin.h
new file mode 100644
index 0000000000..4fbf47ecfe
--- /dev/null
+++ b/editor/plugins/texture_3d_editor_plugin.h
@@ -0,0 +1,93 @@
+/*************************************************************************/
+/* texture_3d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef TEXTURE_3D_EDITOR_PLUGIN_H
+#define TEXTURE_3D_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/resources/shader.h"
+#include "scene/resources/texture.h"
+
+class Texture3DEditor : public Control {
+ GDCLASS(Texture3DEditor, Control);
+
+ SpinBox *layer;
+ Label *info;
+ Ref<Texture3D> texture;
+
+ Ref<Shader> shader;
+ Ref<ShaderMaterial> material;
+
+ Control *texture_rect;
+
+ void _make_shaders();
+
+ void _update_material();
+ bool setting;
+ void _layer_changed(double) {
+ if (!setting) {
+ _update_material();
+ }
+ }
+
+ void _texture_rect_update_area();
+ void _texture_rect_draw();
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(Ref<InputEvent> p_event);
+ void _changed_callback(Object *p_changed, const char *p_prop) override;
+ static void _bind_methods();
+
+public:
+ void edit(Ref<Texture3D> p_texture);
+ Texture3DEditor();
+ ~Texture3DEditor();
+};
+
+class EditorInspectorPlugin3DTexture : public EditorInspectorPlugin {
+ GDCLASS(EditorInspectorPlugin3DTexture, EditorInspectorPlugin);
+
+public:
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
+};
+
+class Texture3DEditorPlugin : public EditorPlugin {
+ GDCLASS(Texture3DEditorPlugin, EditorPlugin);
+
+public:
+ virtual String get_name() const override { return "Texture3D"; }
+
+ Texture3DEditorPlugin(EditorNode *p_node);
+};
+
+#endif // TEXTURE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp
index 9489836984..b728a6700c 100644
--- a/editor/plugins/texture_editor_plugin.cpp
+++ b/editor/plugins/texture_editor_plugin.cpp
@@ -38,15 +38,12 @@ void TextureEditor::_gui_input(Ref<InputEvent> p_event) {
}
void TextureEditor::_notification(int p_what) {
-
if (p_what == NOTIFICATION_READY) {
-
//get_scene()->connect("node_removed",this,"_node_removed");
}
if (p_what == NOTIFICATION_DRAW) {
-
- Ref<Texture> checkerboard = get_icon("Checkerboard", "EditorIcons");
+ Ref<Texture2D> checkerboard = get_theme_icon("Checkerboard", "EditorIcons");
Size2 size = get_size();
draw_texture_rect(checkerboard, Rect2(Point2(), size), true);
@@ -60,10 +57,12 @@ void TextureEditor::_notification(int p_what) {
}
// Prevent the texture from being unpreviewable after the rescale, so that we can still see something
- if (tex_height <= 0)
+ if (tex_height <= 0) {
tex_height = 1;
- if (tex_width <= 0)
+ }
+ if (tex_width <= 0) {
tex_width = 1;
+ }
int ofs_x = (size.width - tex_width) / 2;
int ofs_y = (size.height - tex_height) / 2;
@@ -79,13 +78,13 @@ void TextureEditor::_notification(int p_what) {
draw_texture_rect(texture, Rect2(ofs_x, ofs_y, tex_width, tex_height));
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
String format;
if (Object::cast_to<ImageTexture>(*texture)) {
format = Image::get_format_name(Object::cast_to<ImageTexture>(*texture)->get_format());
- } else if (Object::cast_to<StreamTexture>(*texture)) {
- format = Image::get_format_name(Object::cast_to<StreamTexture>(*texture)->get_format());
+ } else if (Object::cast_to<StreamTexture2D>(*texture)) {
+ format = Image::get_format_name(Object::cast_to<StreamTexture2D>(*texture)->get_format());
} else {
format = texture->get_class();
}
@@ -94,8 +93,9 @@ void TextureEditor::_notification(int p_what) {
Size2 rect = font->get_string_size(text);
Vector2 draw_from = size - rect + Size2(-2, font->get_ascent() - 2);
- if (draw_from.x < 0)
+ if (draw_from.x < 0) {
draw_from.x = 0;
+ }
draw_string(font, draw_from + Vector2(2, 2), text, Color(0, 0, 0, 0.5), size.width);
draw_string(font, draw_from - Vector2(2, 2), text, Color(0, 0, 0, 0.5), size.width);
@@ -104,16 +104,16 @@ void TextureEditor::_notification(int p_what) {
}
void TextureEditor::_changed_callback(Object *p_changed, const char *p_prop) {
-
- if (!is_visible())
+ if (!is_visible()) {
return;
+ }
update();
}
-void TextureEditor::edit(Ref<Texture> p_texture) {
-
- if (!texture.is_null())
+void TextureEditor::edit(Ref<Texture2D> p_texture) {
+ if (!texture.is_null()) {
texture->remove_change_receptor(this);
+ }
texture = p_texture;
@@ -126,12 +126,11 @@ void TextureEditor::edit(Ref<Texture> p_texture) {
}
void TextureEditor::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_gui_input"), &TextureEditor::_gui_input);
}
TextureEditor::TextureEditor() {
-
+ set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED);
set_custom_minimum_size(Size2(1, 150));
}
@@ -140,19 +139,18 @@ TextureEditor::~TextureEditor() {
texture->remove_change_receptor(this);
}
}
+
//
bool EditorInspectorPluginTexture::can_handle(Object *p_object) {
-
- return Object::cast_to<ImageTexture>(p_object) != NULL || Object::cast_to<AtlasTexture>(p_object) != NULL || Object::cast_to<StreamTexture>(p_object) != NULL || Object::cast_to<LargeTexture>(p_object) != NULL || Object::cast_to<AnimatedTexture>(p_object) != NULL;
+ return Object::cast_to<ImageTexture>(p_object) != nullptr || Object::cast_to<AtlasTexture>(p_object) != nullptr || Object::cast_to<StreamTexture2D>(p_object) != nullptr || Object::cast_to<LargeTexture>(p_object) != nullptr || Object::cast_to<AnimatedTexture>(p_object) != nullptr;
}
void EditorInspectorPluginTexture::parse_begin(Object *p_object) {
-
- Texture *texture = Object::cast_to<Texture>(p_object);
+ Texture2D *texture = Object::cast_to<Texture2D>(p_object);
if (!texture) {
return;
}
- Ref<Texture> m(texture);
+ Ref<Texture2D> m(texture);
TextureEditor *editor = memnew(TextureEditor);
editor->edit(m);
@@ -160,7 +158,6 @@ void EditorInspectorPluginTexture::parse_begin(Object *p_object) {
}
TextureEditorPlugin::TextureEditorPlugin(EditorNode *p_node) {
-
Ref<EditorInspectorPluginTexture> plugin;
plugin.instance();
add_inspector_plugin(plugin);
diff --git a/editor/plugins/texture_editor_plugin.h b/editor/plugins/texture_editor_plugin.h
index f587579902..0d4452c662 100644
--- a/editor/plugins/texture_editor_plugin.h
+++ b/editor/plugins/texture_editor_plugin.h
@@ -36,19 +36,18 @@
#include "scene/resources/texture.h"
class TextureEditor : public Control {
-
GDCLASS(TextureEditor, Control);
- Ref<Texture> texture;
+ Ref<Texture2D> texture;
protected:
void _notification(int p_what);
void _gui_input(Ref<InputEvent> p_event);
- void _changed_callback(Object *p_changed, const char *p_prop);
+ void _changed_callback(Object *p_changed, const char *p_prop) override;
static void _bind_methods();
public:
- void edit(Ref<Texture> p_texture);
+ void edit(Ref<Texture2D> p_texture);
TextureEditor();
~TextureEditor();
};
@@ -57,16 +56,15 @@ class EditorInspectorPluginTexture : public EditorInspectorPlugin {
GDCLASS(EditorInspectorPluginTexture, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
};
class TextureEditorPlugin : public EditorPlugin {
-
GDCLASS(TextureEditorPlugin, EditorPlugin);
public:
- virtual String get_name() const { return "Texture"; }
+ virtual String get_name() const override { return "Texture2D"; }
TextureEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp
new file mode 100644
index 0000000000..59e87fb273
--- /dev/null
+++ b/editor/plugins/texture_layered_editor_plugin.cpp
@@ -0,0 +1,278 @@
+/*************************************************************************/
+/* texture_layered_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "texture_layered_editor_plugin.h"
+
+#include "core/io/resource_loader.h"
+#include "core/project_settings.h"
+#include "editor/editor_settings.h"
+
+void TextureLayeredEditor::_gui_input(Ref<InputEvent> p_event) {
+ Ref<InputEventMouseMotion> mm = p_event;
+ if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
+ y_rot += -mm->get_relative().x * 0.01;
+ x_rot += mm->get_relative().y * 0.01;
+ _update_material();
+ }
+}
+
+void TextureLayeredEditor::_texture_rect_draw() {
+ texture_rect->draw_rect(Rect2(Point2(), texture_rect->get_size()), Color(1, 1, 1, 1));
+}
+
+void TextureLayeredEditor::_notification(int p_what) {
+ if (p_what == NOTIFICATION_READY) {
+ //get_scene()->connect("node_removed",this,"_node_removed");
+ }
+ if (p_what == NOTIFICATION_RESIZED) {
+ _texture_rect_update_area();
+ }
+
+ if (p_what == NOTIFICATION_DRAW) {
+ Ref<Texture2D> checkerboard = get_theme_icon("Checkerboard", "EditorIcons");
+ Size2 size = get_size();
+
+ draw_texture_rect(checkerboard, Rect2(Point2(), size), true);
+ }
+}
+
+void TextureLayeredEditor::_changed_callback(Object *p_changed, const char *p_prop) {
+ if (!is_visible()) {
+ return;
+ }
+ update();
+}
+
+void TextureLayeredEditor::_update_material() {
+ materials[0]->set_shader_param("layer", layer->get_value());
+ materials[2]->set_shader_param("layer", layer->get_value());
+ materials[texture->get_layered_type()]->set_shader_param("tex", texture->get_rid());
+
+ Vector3 v(1, 1, 1);
+ v.normalize();
+
+ Basis b;
+ b.rotate(Vector3(1, 0, 0), x_rot);
+ b.rotate(Vector3(0, 1, 0), y_rot);
+
+ materials[1]->set_shader_param("normal", v);
+ materials[1]->set_shader_param("rot", b);
+ materials[2]->set_shader_param("normal", v);
+ materials[2]->set_shader_param("rot", b);
+
+ String format = Image::get_format_name(texture->get_format());
+
+ String text;
+ if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_2D_ARRAY) {
+ text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + " (x " + itos(texture->get_layers()) + ")" + format;
+ } else if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_CUBEMAP) {
+ text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + " " + format;
+ } else if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_CUBEMAP_ARRAY) {
+ text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + " (x " + itos(texture->get_layers() / 6) + ")" + format;
+ }
+
+ info->set_text(text);
+}
+
+void TextureLayeredEditor::_make_shaders() {
+ String shader_2d_array = ""
+ "shader_type canvas_item;\n"
+ "uniform sampler2DArray tex;\n"
+ "uniform float layer;\n"
+ "void fragment() {\n"
+ " COLOR = textureLod(tex,vec3(UV,layer),0.0);\n"
+ "}";
+
+ shaders[0].instance();
+ shaders[0]->set_code(shader_2d_array);
+
+ String shader_cube = ""
+ "shader_type canvas_item;\n"
+ "uniform samplerCube tex;\n"
+ "uniform vec3 normal;\n"
+ "uniform mat3 rot;\n"
+ "void fragment() {\n"
+ " vec3 n = rot * normalize(vec3(normal.xy*(UV * 2.0 - 1.0),normal.z));\n"
+ " COLOR = textureLod(tex,n,0.0);\n"
+ "}";
+
+ shaders[1].instance();
+ shaders[1]->set_code(shader_cube);
+
+ String shader_cube_array = ""
+ "shader_type canvas_item;\n"
+ "uniform samplerCubeArray tex;\n"
+ "uniform vec3 normal;\n"
+ "uniform mat3 rot;\n"
+ "uniform float layer;\n"
+ "void fragment() {\n"
+ " vec3 n = rot * normalize(vec3(normal.xy*(UV * 2.0 - 1.0),normal.z));\n"
+ " COLOR = textureLod(tex,vec4(n,layer),0.0);\n"
+ "}";
+
+ shaders[2].instance();
+ shaders[2]->set_code(shader_cube_array);
+
+ for (int i = 0; i < 3; i++) {
+ materials[i].instance();
+ materials[i]->set_shader(shaders[i]);
+ }
+}
+
+void TextureLayeredEditor::_texture_rect_update_area() {
+ Size2 size = get_size();
+ int tex_width = texture->get_width() * size.height / texture->get_height();
+ int tex_height = size.height;
+
+ if (tex_width > size.width) {
+ tex_width = size.width;
+ tex_height = texture->get_height() * tex_width / texture->get_width();
+ }
+
+ // Prevent the texture from being unpreviewable after the rescale, so that we can still see something
+ if (tex_height <= 0) {
+ tex_height = 1;
+ }
+ if (tex_width <= 0) {
+ tex_width = 1;
+ }
+
+ int ofs_x = (size.width - tex_width) / 2;
+ int ofs_y = (size.height - tex_height) / 2;
+
+ texture_rect->set_position(Vector2(ofs_x, ofs_y));
+ texture_rect->set_size(Vector2(tex_width, tex_height));
+}
+
+void TextureLayeredEditor::edit(Ref<TextureLayered> p_texture) {
+ if (!texture.is_null()) {
+ texture->remove_change_receptor(this);
+ }
+
+ texture = p_texture;
+
+ if (!texture.is_null()) {
+ if (shaders[0].is_null()) {
+ _make_shaders();
+ }
+
+ texture->add_change_receptor(this);
+ update();
+ texture_rect->set_material(materials[texture->get_layered_type()]);
+ setting = true;
+ if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_2D_ARRAY) {
+ layer->set_max(texture->get_layers() - 1);
+ layer->set_value(0);
+ layer->show();
+ } else if (texture->get_layered_type() == TextureLayered::LAYERED_TYPE_CUBEMAP_ARRAY) {
+ layer->set_max(texture->get_layers() / 6 - 1);
+ layer->set_value(0);
+ layer->show();
+ } else {
+ layer->hide();
+ }
+ x_rot = 0;
+ y_rot = 0;
+ _update_material();
+ setting = false;
+ _texture_rect_update_area();
+ } else {
+ hide();
+ }
+}
+
+void TextureLayeredEditor::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("_gui_input"), &TextureLayeredEditor::_gui_input);
+ ClassDB::bind_method(D_METHOD("_layer_changed"), &TextureLayeredEditor::_layer_changed);
+}
+
+TextureLayeredEditor::TextureLayeredEditor() {
+ set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED);
+ set_custom_minimum_size(Size2(1, 150));
+ texture_rect = memnew(Control);
+ texture_rect->connect("draw", callable_mp(this, &TextureLayeredEditor::_texture_rect_draw));
+ texture_rect->set_mouse_filter(MOUSE_FILTER_IGNORE);
+ add_child(texture_rect);
+
+ layer = memnew(SpinBox);
+ layer->set_step(1);
+ layer->set_max(100);
+ add_child(layer);
+ layer->set_anchor(MARGIN_RIGHT, 1);
+ layer->set_anchor(MARGIN_LEFT, 1);
+ layer->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+ layer->set_modulate(Color(1, 1, 1, 0.8));
+ info = memnew(Label);
+ add_child(info);
+ info->set_anchor(MARGIN_RIGHT, 1);
+ info->set_anchor(MARGIN_LEFT, 1);
+ info->set_anchor(MARGIN_BOTTOM, 1);
+ info->set_anchor(MARGIN_TOP, 1);
+ info->set_h_grow_direction(GROW_DIRECTION_BEGIN);
+ info->set_v_grow_direction(GROW_DIRECTION_BEGIN);
+ info->add_theme_color_override("font_color", Color(1, 1, 1, 1));
+ info->add_theme_color_override("font_color_shadow", Color(0, 0, 0, 0.5));
+ info->add_theme_color_override("font_color_shadow", Color(0, 0, 0, 0.5));
+ info->add_theme_constant_override("shadow_as_outline", 1);
+ info->add_theme_constant_override("shadow_offset_x", 2);
+ info->add_theme_constant_override("shadow_offset_y", 2);
+
+ setting = false;
+ layer->connect("value_changed", Callable(this, "_layer_changed"));
+}
+
+TextureLayeredEditor::~TextureLayeredEditor() {
+ if (!texture.is_null()) {
+ texture->remove_change_receptor(this);
+ }
+}
+
+//
+bool EditorInspectorPluginLayeredTexture::can_handle(Object *p_object) {
+ return Object::cast_to<TextureLayered>(p_object) != nullptr;
+}
+
+void EditorInspectorPluginLayeredTexture::parse_begin(Object *p_object) {
+ TextureLayered *texture = Object::cast_to<TextureLayered>(p_object);
+ if (!texture) {
+ return;
+ }
+ Ref<TextureLayered> m(texture);
+
+ TextureLayeredEditor *editor = memnew(TextureLayeredEditor);
+ editor->edit(m);
+ add_custom_control(editor);
+}
+
+TextureLayeredEditorPlugin::TextureLayeredEditorPlugin(EditorNode *p_node) {
+ Ref<EditorInspectorPluginLayeredTexture> plugin;
+ plugin.instance();
+ add_inspector_plugin(plugin);
+}
diff --git a/editor/plugins/texture_layered_editor_plugin.h b/editor/plugins/texture_layered_editor_plugin.h
new file mode 100644
index 0000000000..9a28d2dff8
--- /dev/null
+++ b/editor/plugins/texture_layered_editor_plugin.h
@@ -0,0 +1,95 @@
+/*************************************************************************/
+/* texture_layered_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef TEXTURE_LAYERED_EDITOR_PLUGIN_H
+#define TEXTURE_LAYERED_EDITOR_PLUGIN_H
+
+#include "editor/editor_node.h"
+#include "editor/editor_plugin.h"
+#include "scene/resources/shader.h"
+#include "scene/resources/texture.h"
+
+class TextureLayeredEditor : public Control {
+ GDCLASS(TextureLayeredEditor, Control);
+
+ SpinBox *layer;
+ Label *info;
+ Ref<TextureLayered> texture;
+
+ Ref<Shader> shaders[3];
+ Ref<ShaderMaterial> materials[3];
+
+ float x_rot = 0;
+ float y_rot = 0;
+ Control *texture_rect;
+
+ void _make_shaders();
+
+ void _update_material();
+ bool setting;
+ void _layer_changed(double) {
+ if (!setting) {
+ _update_material();
+ }
+ }
+
+ void _texture_rect_update_area();
+ void _texture_rect_draw();
+
+protected:
+ void _notification(int p_what);
+ void _gui_input(Ref<InputEvent> p_event);
+ void _changed_callback(Object *p_changed, const char *p_prop) override;
+ static void _bind_methods();
+
+public:
+ void edit(Ref<TextureLayered> p_texture);
+ TextureLayeredEditor();
+ ~TextureLayeredEditor();
+};
+
+class EditorInspectorPluginLayeredTexture : public EditorInspectorPlugin {
+ GDCLASS(EditorInspectorPluginLayeredTexture, EditorInspectorPlugin);
+
+public:
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
+};
+
+class TextureLayeredEditorPlugin : public EditorPlugin {
+ GDCLASS(TextureLayeredEditorPlugin, EditorPlugin);
+
+public:
+ virtual String get_name() const override { return "TextureLayered"; }
+
+ TextureLayeredEditorPlugin(EditorNode *p_node);
+};
+
+#endif // TEXTURE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
index 507ea0b83d..6e722607f7 100644
--- a/editor/plugins/texture_region_editor_plugin.cpp
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -31,7 +31,7 @@
#include "texture_region_editor_plugin.h"
#include "core/core_string_names.h"
-#include "core/os/input.h"
+#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
#include "scene/gui/check_box.h"
@@ -43,34 +43,36 @@
void draw_margin_line(Control *edit_draw, Vector2 from, Vector2 to) {
Vector2 line = (to - from).normalized() * 10;
while ((to - from).length_squared() > 200) {
- edit_draw->draw_line(from, from + line, EditorNode::get_singleton()->get_theme_base()->get_color("mono_color", "Editor"), 2);
+ edit_draw->draw_line(from, from + line, EditorNode::get_singleton()->get_theme_base()->get_theme_color("mono_color", "Editor"), 2);
from += line * 2;
}
}
void TextureRegionEditor::_region_draw() {
- Ref<Texture> base_tex = NULL;
- if (node_sprite)
+ Ref<Texture2D> base_tex = nullptr;
+ if (node_sprite) {
base_tex = node_sprite->get_texture();
- else if (node_sprite_3d)
+ } else if (node_sprite_3d) {
base_tex = node_sprite_3d->get_texture();
- else if (node_ninepatch)
+ } else if (node_ninepatch) {
base_tex = node_ninepatch->get_texture();
- else if (obj_styleBox.is_valid())
+ } else if (obj_styleBox.is_valid()) {
base_tex = obj_styleBox->get_texture();
- else if (atlas_tex.is_valid())
+ } else if (atlas_tex.is_valid()) {
base_tex = atlas_tex->get_atlas();
+ }
- if (base_tex.is_null())
+ if (base_tex.is_null()) {
return;
+ }
Transform2D mtx;
mtx.elements[2] = -draw_ofs * draw_zoom;
mtx.scale_basis(Vector2(draw_zoom, draw_zoom));
- VS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), mtx);
+ RS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), mtx);
edit_draw->draw_texture(base_tex, Point2());
- VS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), Transform2D());
+ RS::get_singleton()->canvas_item_add_set_transform(edit_draw->get_canvas_item(), Transform2D());
if (snap_mode == SNAP_GRID) {
Color grid_color = Color(1.0, 1.0, 1.0, 0.15);
@@ -78,45 +80,55 @@ void TextureRegionEditor::_region_draw() {
int last_cell = 0;
if (snap_step.x != 0) {
- if (snap_separation.x == 0)
+ if (snap_separation.x == 0) {
for (int i = 0; i < s.width; i++) {
int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(i, 0)).x - snap_offset.x) / snap_step.x));
- if (i == 0)
+ if (i == 0) {
last_cell = cell;
- if (last_cell != cell)
+ }
+ if (last_cell != cell) {
edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), grid_color);
+ }
last_cell = cell;
}
- else
+ } else {
for (int i = 0; i < s.width; i++) {
int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(i, 0)).x - snap_offset.x) / (snap_step.x + snap_separation.x)));
- if (i == 0)
+ if (i == 0) {
last_cell = cell;
- if (last_cell != cell)
+ }
+ if (last_cell != cell) {
edit_draw->draw_rect(Rect2(i - snap_separation.x * draw_zoom, 0, snap_separation.x * draw_zoom, s.height), grid_color);
+ }
last_cell = cell;
}
+ }
}
if (snap_step.y != 0) {
- if (snap_separation.y == 0)
+ if (snap_separation.y == 0) {
for (int i = 0; i < s.height; i++) {
int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(0, i)).y - snap_offset.y) / snap_step.y));
- if (i == 0)
+ if (i == 0) {
last_cell = cell;
- if (last_cell != cell)
+ }
+ if (last_cell != cell) {
edit_draw->draw_line(Point2(0, i), Point2(s.width, i), grid_color);
+ }
last_cell = cell;
}
- else
+ } else {
for (int i = 0; i < s.height; i++) {
int cell = Math::fast_ftoi(Math::floor((mtx.affine_inverse().xform(Vector2(0, i)).y - snap_offset.y) / (snap_step.y + snap_separation.y)));
- if (i == 0)
+ if (i == 0) {
last_cell = cell;
- if (last_cell != cell)
+ }
+ if (last_cell != cell) {
edit_draw->draw_rect(Rect2(0, i - snap_separation.y * draw_zoom, s.width, snap_separation.y * draw_zoom), grid_color);
+ }
last_cell = cell;
}
+ }
}
} else if (snap_mode == SNAP_AUTOSLICE) {
for (List<Rect2>::Element *E = autoslice_cache.front(); E; E = E->next()) {
@@ -134,7 +146,7 @@ void TextureRegionEditor::_region_draw() {
}
}
- Ref<Texture> select_handle = get_icon("EditorHandle", "EditorIcons");
+ Ref<Texture2D> select_handle = get_theme_icon("EditorHandle", "EditorIcons");
Rect2 scroll_rect(Point2(), base_tex->get_size());
@@ -150,9 +162,8 @@ void TextureRegionEditor::_region_draw() {
mtx.basis_xform(raw_endpoints[2]),
mtx.basis_xform(raw_endpoints[3])
};
- Color color = get_color("mono_color", "Editor");
+ Color color = get_theme_color("mono_color", "Editor");
for (int i = 0; i < 4; i++) {
-
int prev = (i + 3) % 4;
int next = (i + 1) % 4;
@@ -161,14 +172,16 @@ void TextureRegionEditor::_region_draw() {
edit_draw->draw_line(endpoints[i] - draw_ofs * draw_zoom, endpoints[next] - draw_ofs * draw_zoom, color, 2);
- if (snap_mode != SNAP_AUTOSLICE)
+ if (snap_mode != SNAP_AUTOSLICE) {
edit_draw->draw_texture(select_handle, (endpoints[i] + ofs - (select_handle->get_size() / 2)).floor() - draw_ofs * draw_zoom);
+ }
ofs = (endpoints[next] - endpoints[i]) / 2;
ofs += (endpoints[next] - endpoints[i]).tangent().normalized() * (select_handle->get_size().width / 2);
- if (snap_mode != SNAP_AUTOSLICE)
+ if (snap_mode != SNAP_AUTOSLICE) {
edit_draw->draw_texture(select_handle, (endpoints[i] + ofs - (select_handle->get_size() / 2)).floor() - draw_ofs * draw_zoom);
+ }
scroll_rect.expand_to(raw_endpoints[i]);
}
@@ -259,9 +272,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouseButton> mb = p_input;
if (mb.is_valid()) {
-
if (mb->get_button_index() == BUTTON_LEFT) {
-
if (mb->is_pressed()) {
if (node_ninepatch || obj_styleBox.is_valid()) {
edited_margin = -1;
@@ -309,16 +320,17 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
rect = E->get();
if (Input::get_singleton()->is_key_pressed(KEY_CONTROL) && !(Input::get_singleton()->is_key_pressed(KEY_SHIFT | KEY_ALT))) {
Rect2 r;
- if (node_sprite)
+ if (node_sprite) {
r = node_sprite->get_region_rect();
- else if (node_sprite_3d)
+ } else if (node_sprite_3d) {
r = node_sprite_3d->get_region_rect();
- else if (node_ninepatch)
+ } else if (node_ninepatch) {
r = node_ninepatch->get_region_rect();
- else if (obj_styleBox.is_valid())
+ } else if (obj_styleBox.is_valid()) {
r = obj_styleBox->get_region_rect();
- else if (atlas_tex.is_valid())
+ } else if (atlas_tex.is_valid()) {
r = atlas_tex->get_region();
+ }
rect.expand_to(r.position);
rect.expand_to(r.position + r.size);
}
@@ -349,21 +361,23 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
}
} else if (edited_margin < 0) {
drag_from = mtx.affine_inverse().xform(Vector2(mb->get_position().x, mb->get_position().y));
- if (snap_mode == SNAP_PIXEL)
+ if (snap_mode == SNAP_PIXEL) {
drag_from = drag_from.snapped(Vector2(1, 1));
- else if (snap_mode == SNAP_GRID)
+ } else if (snap_mode == SNAP_GRID) {
drag_from = snap_point(drag_from);
+ }
drag = true;
- if (node_sprite)
+ if (node_sprite) {
rect_prev = node_sprite->get_region_rect();
- else if (node_sprite_3d)
+ } else if (node_sprite_3d) {
rect_prev = node_sprite_3d->get_region_rect();
- else if (node_ninepatch)
+ } else if (node_ninepatch) {
rect_prev = node_ninepatch->get_region_rect();
- else if (obj_styleBox.is_valid())
+ } else if (obj_styleBox.is_valid()) {
rect_prev = obj_styleBox->get_region_rect();
- else if (atlas_tex.is_valid())
+ } else if (atlas_tex.is_valid()) {
rect_prev = atlas_tex->get_region();
+ }
for (int i = 0; i < 8; i++) {
Vector2 tuv = endpoints[i];
@@ -421,15 +435,16 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
}
} else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
-
if (drag) {
drag = false;
if (edited_margin >= 0) {
static Margin m[4] = { MARGIN_TOP, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT };
- if (node_ninepatch)
+ if (node_ninepatch) {
node_ninepatch->set_patch_margin(m[edited_margin], prev_margin);
- if (obj_styleBox.is_valid())
+ }
+ if (obj_styleBox.is_valid()) {
obj_styleBox->set_margin_size(m[edited_margin], prev_margin);
+ }
edited_margin = -1;
} else {
apply_rect(rect_prev);
@@ -448,41 +463,43 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouseMotion> mm = p_input;
if (mm.is_valid()) {
-
if (mm->get_button_mask() & BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) {
-
Vector2 dragged(mm->get_relative().x / draw_zoom, mm->get_relative().y / draw_zoom);
hscroll->set_value(hscroll->get_value() - dragged.x);
vscroll->set_value(vscroll->get_value() - dragged.y);
} else if (drag) {
-
if (edited_margin >= 0) {
float new_margin = 0;
- if (edited_margin == 0)
+ if (edited_margin == 0) {
new_margin = prev_margin + (mm->get_position().y - drag_from.y) / draw_zoom;
- else if (edited_margin == 1)
+ } else if (edited_margin == 1) {
new_margin = prev_margin - (mm->get_position().y - drag_from.y) / draw_zoom;
- else if (edited_margin == 2)
+ } else if (edited_margin == 2) {
new_margin = prev_margin + (mm->get_position().x - drag_from.x) / draw_zoom;
- else if (edited_margin == 3)
+ } else if (edited_margin == 3) {
new_margin = prev_margin - (mm->get_position().x - drag_from.x) / draw_zoom;
- else
+ } else {
ERR_PRINT("Unexpected edited_margin");
+ }
- if (new_margin < 0)
+ if (new_margin < 0) {
new_margin = 0;
+ }
static Margin m[4] = { MARGIN_TOP, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT };
- if (node_ninepatch)
+ if (node_ninepatch) {
node_ninepatch->set_patch_margin(m[edited_margin], new_margin);
- if (obj_styleBox.is_valid())
+ }
+ if (obj_styleBox.is_valid()) {
obj_styleBox->set_margin_size(m[edited_margin], new_margin);
+ }
} else {
Vector2 new_pos = mtx.affine_inverse().xform(mm->get_position());
- if (snap_mode == SNAP_PIXEL)
+ if (snap_mode == SNAP_PIXEL) {
new_pos = new_pos.snapped(Vector2(1, 1));
- else if (snap_mode == SNAP_GRID)
+ } else if (snap_mode == SNAP_GRID) {
new_pos = snap_point(new_pos);
+ }
if (creating) {
rect = Rect2(drag_from, Size2());
@@ -546,11 +563,23 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
edit_draw->update();
}
}
+
+ Ref<InputEventMagnifyGesture> magnify_gesture = p_input;
+ if (magnify_gesture.is_valid()) {
+ _zoom_on_position(draw_zoom * magnify_gesture->get_factor(), magnify_gesture->get_position());
+ }
+
+ Ref<InputEventPanGesture> pan_gesture = p_input;
+ if (pan_gesture.is_valid()) {
+ hscroll->set_value(hscroll->get_value() + hscroll->get_page() * pan_gesture->get_delta().x / 8);
+ vscroll->set_value(vscroll->get_value() + vscroll->get_page() * pan_gesture->get_delta().y / 8);
+ }
}
void TextureRegionEditor::_scroll_changed(float) {
- if (updating_scroll)
+ if (updating_scroll) {
return;
+ }
draw_ofs.x = hscroll->get_value();
draw_ofs.y = vscroll->get_value();
@@ -560,10 +589,11 @@ void TextureRegionEditor::_scroll_changed(float) {
void TextureRegionEditor::_set_snap_mode(int p_mode) {
snap_mode = p_mode;
- if (snap_mode == SNAP_GRID)
+ if (snap_mode == SNAP_GRID) {
hb_grid->show();
- else
+ } else {
hb_grid->hide();
+ }
if (snap_mode == SNAP_AUTOSLICE && is_visible() && autoslice_is_dirty) {
_update_autoslice();
@@ -603,8 +633,9 @@ void TextureRegionEditor::_set_snap_sep_y(float p_val) {
}
void TextureRegionEditor::_zoom_on_position(float p_zoom, Point2 p_position) {
- if (p_zoom < 0.25 || p_zoom > 8)
+ if (p_zoom < 0.25 || p_zoom > 8) {
return;
+ }
float prev_zoom = draw_zoom;
draw_zoom = p_zoom;
@@ -629,49 +660,52 @@ void TextureRegionEditor::_zoom_out() {
}
void TextureRegionEditor::apply_rect(const Rect2 &p_rect) {
- if (node_sprite)
+ if (node_sprite) {
node_sprite->set_region_rect(p_rect);
- else if (node_sprite_3d)
+ } else if (node_sprite_3d) {
node_sprite_3d->set_region_rect(p_rect);
- else if (node_ninepatch)
+ } else if (node_ninepatch) {
node_ninepatch->set_region_rect(p_rect);
- else if (obj_styleBox.is_valid())
+ } else if (obj_styleBox.is_valid()) {
obj_styleBox->set_region_rect(p_rect);
- else if (atlas_tex.is_valid())
+ } else if (atlas_tex.is_valid()) {
atlas_tex->set_region(p_rect);
+ }
}
void TextureRegionEditor::_update_rect() {
- if (node_sprite)
+ if (node_sprite) {
rect = node_sprite->get_region_rect();
- else if (node_sprite_3d)
+ } else if (node_sprite_3d) {
rect = node_sprite_3d->get_region_rect();
- else if (node_ninepatch) {
+ } else if (node_ninepatch) {
rect = node_ninepatch->get_region_rect();
if (rect == Rect2()) {
rect = Rect2(Vector2(), node_ninepatch->get_texture()->get_size());
}
- } else if (obj_styleBox.is_valid())
+ } else if (obj_styleBox.is_valid()) {
rect = obj_styleBox->get_region_rect();
- else if (atlas_tex.is_valid())
+ } else if (atlas_tex.is_valid()) {
rect = atlas_tex->get_region();
+ }
}
void TextureRegionEditor::_update_autoslice() {
autoslice_is_dirty = false;
autoslice_cache.clear();
- Ref<Texture> texture = NULL;
- if (node_sprite)
+ Ref<Texture2D> texture = nullptr;
+ if (node_sprite) {
texture = node_sprite->get_texture();
- else if (node_sprite_3d)
+ } else if (node_sprite_3d) {
texture = node_sprite_3d->get_texture();
- else if (node_ninepatch)
+ } else if (node_ninepatch) {
texture = node_ninepatch->get_texture();
- else if (obj_styleBox.is_valid())
+ } else if (obj_styleBox.is_valid()) {
texture = obj_styleBox->get_texture();
- else if (atlas_tex.is_valid())
+ } else if (atlas_tex.is_valid()) {
texture = atlas_tex->get_atlas();
+ }
if (texture.is_null()) {
return;
@@ -696,8 +730,9 @@ void TextureRegionEditor::_update_autoslice() {
autoslice_cache.erase(F->prev());
queue_erase = false;
}
- if (F == E)
+ if (F == E) {
continue;
+ }
if (E->get().grow(1).intersects(F->get())) {
E->get().expand_to(F->get().position);
E->get().expand_to(F->get().position + F->get().size);
@@ -730,12 +765,12 @@ void TextureRegionEditor::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
- edit_draw->add_style_override("panel", get_stylebox("bg", "Tree"));
+ edit_draw->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
} break;
case NOTIFICATION_READY: {
- zoom_out->set_icon(get_icon("ZoomLess", "EditorIcons"));
- zoom_reset->set_icon(get_icon("ZoomReset", "EditorIcons"));
- zoom_in->set_icon(get_icon("ZoomMore", "EditorIcons"));
+ zoom_out->set_icon(get_theme_icon("ZoomLess", "EditorIcons"));
+ zoom_reset->set_icon(get_theme_icon("ZoomReset", "EditorIcons"));
+ zoom_in->set_icon(get_theme_icon("ZoomMore", "EditorIcons"));
vscroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
hscroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
@@ -745,7 +780,7 @@ void TextureRegionEditor::_notification(int p_what) {
_update_autoslice();
}
} break;
- case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
+ case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
// This happens when the user leaves the Editor and returns,
// they could have changed the textures, so the cache is cleared.
cache_map.clear();
@@ -756,32 +791,19 @@ void TextureRegionEditor::_notification(int p_what) {
void TextureRegionEditor::_node_removed(Object *p_obj) {
if (p_obj == node_sprite || p_obj == node_sprite_3d || p_obj == node_ninepatch || p_obj == obj_styleBox.ptr() || p_obj == atlas_tex.ptr()) {
- node_sprite = NULL;
- node_sprite_3d = NULL;
- node_ninepatch = NULL;
- obj_styleBox = Ref<StyleBox>(NULL);
- atlas_tex = Ref<AtlasTexture>(NULL);
+ node_sprite = nullptr;
+ node_sprite_3d = nullptr;
+ node_ninepatch = nullptr;
+ obj_styleBox = Ref<StyleBox>(nullptr);
+ atlas_tex = Ref<AtlasTexture>(nullptr);
hide();
}
}
void TextureRegionEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_edit_region"), &TextureRegionEditor::_edit_region);
- ClassDB::bind_method(D_METHOD("_region_draw"), &TextureRegionEditor::_region_draw);
- ClassDB::bind_method(D_METHOD("_region_input"), &TextureRegionEditor::_region_input);
- ClassDB::bind_method(D_METHOD("_scroll_changed"), &TextureRegionEditor::_scroll_changed);
ClassDB::bind_method(D_METHOD("_node_removed"), &TextureRegionEditor::_node_removed);
- ClassDB::bind_method(D_METHOD("_set_snap_mode"), &TextureRegionEditor::_set_snap_mode);
- ClassDB::bind_method(D_METHOD("_set_snap_off_x"), &TextureRegionEditor::_set_snap_off_x);
- ClassDB::bind_method(D_METHOD("_set_snap_off_y"), &TextureRegionEditor::_set_snap_off_y);
- ClassDB::bind_method(D_METHOD("_set_snap_step_x"), &TextureRegionEditor::_set_snap_step_x);
- ClassDB::bind_method(D_METHOD("_set_snap_step_y"), &TextureRegionEditor::_set_snap_step_y);
- ClassDB::bind_method(D_METHOD("_set_snap_sep_x"), &TextureRegionEditor::_set_snap_sep_x);
- ClassDB::bind_method(D_METHOD("_set_snap_sep_y"), &TextureRegionEditor::_set_snap_sep_y);
ClassDB::bind_method(D_METHOD("_zoom_on_position"), &TextureRegionEditor::_zoom_on_position);
- ClassDB::bind_method(D_METHOD("_zoom_in"), &TextureRegionEditor::_zoom_in);
- ClassDB::bind_method(D_METHOD("_zoom_reset"), &TextureRegionEditor::_zoom_reset);
- ClassDB::bind_method(D_METHOD("_zoom_out"), &TextureRegionEditor::_zoom_out);
ClassDB::bind_method(D_METHOD("_update_rect"), &TextureRegionEditor::_update_rect);
}
@@ -790,49 +812,55 @@ bool TextureRegionEditor::is_stylebox() {
}
bool TextureRegionEditor::is_atlas_texture() {
-
return atlas_tex.is_valid();
}
bool TextureRegionEditor::is_ninepatch() {
- return node_ninepatch != NULL;
+ return node_ninepatch != nullptr;
}
Sprite3D *TextureRegionEditor::get_sprite_3d() {
return node_sprite_3d;
}
-Sprite *TextureRegionEditor::get_sprite() {
+Sprite2D *TextureRegionEditor::get_sprite() {
return node_sprite;
}
void TextureRegionEditor::edit(Object *p_obj) {
- if (node_sprite)
+ if (node_sprite) {
node_sprite->remove_change_receptor(this);
- if (node_sprite_3d)
+ }
+ if (node_sprite_3d) {
node_sprite_3d->remove_change_receptor(this);
- if (node_ninepatch)
+ }
+ if (node_ninepatch) {
node_ninepatch->remove_change_receptor(this);
- if (obj_styleBox.is_valid())
+ }
+ if (obj_styleBox.is_valid()) {
obj_styleBox->remove_change_receptor(this);
- if (atlas_tex.is_valid())
+ }
+ if (atlas_tex.is_valid()) {
atlas_tex->remove_change_receptor(this);
+ }
if (p_obj) {
- node_sprite = Object::cast_to<Sprite>(p_obj);
+ node_sprite = Object::cast_to<Sprite2D>(p_obj);
node_sprite_3d = Object::cast_to<Sprite3D>(p_obj);
node_ninepatch = Object::cast_to<NinePatchRect>(p_obj);
- if (Object::cast_to<StyleBoxTexture>(p_obj))
+ if (Object::cast_to<StyleBoxTexture>(p_obj)) {
obj_styleBox = Ref<StyleBoxTexture>(Object::cast_to<StyleBoxTexture>(p_obj));
- if (Object::cast_to<AtlasTexture>(p_obj))
+ }
+ if (Object::cast_to<AtlasTexture>(p_obj)) {
atlas_tex = Ref<AtlasTexture>(Object::cast_to<AtlasTexture>(p_obj));
+ }
p_obj->add_change_receptor(this);
_edit_region();
} else {
- node_sprite = NULL;
- node_sprite_3d = NULL;
- node_ninepatch = NULL;
- obj_styleBox = Ref<StyleBoxTexture>(NULL);
- atlas_tex = Ref<AtlasTexture>(NULL);
+ node_sprite = nullptr;
+ node_sprite_3d = nullptr;
+ node_ninepatch = nullptr;
+ obj_styleBox = Ref<StyleBoxTexture>(nullptr);
+ atlas_tex = Ref<AtlasTexture>(nullptr);
}
edit_draw->update();
if ((node_sprite && !node_sprite->is_region()) || (node_sprite_3d && !node_sprite_3d->is_region())) {
@@ -844,25 +872,27 @@ void TextureRegionEditor::edit(Object *p_obj) {
}
void TextureRegionEditor::_changed_callback(Object *p_changed, const char *p_prop) {
-
- if (!is_visible())
+ if (!is_visible()) {
return;
- if (p_prop == StringName("atlas") || p_prop == StringName("texture"))
+ }
+ if (p_prop == StringName("atlas") || p_prop == StringName("texture") || p_prop == StringName("region")) {
_edit_region();
+ }
}
void TextureRegionEditor::_edit_region() {
- Ref<Texture> texture = NULL;
- if (node_sprite)
+ Ref<Texture2D> texture = nullptr;
+ if (node_sprite) {
texture = node_sprite->get_texture();
- else if (node_sprite_3d)
+ } else if (node_sprite_3d) {
texture = node_sprite_3d->get_texture();
- else if (node_ninepatch)
+ } else if (node_ninepatch) {
texture = node_ninepatch->get_texture();
- else if (obj_styleBox.is_valid())
+ } else if (obj_styleBox.is_valid()) {
texture = obj_styleBox->get_texture();
- else if (atlas_tex.is_valid())
+ } else if (atlas_tex.is_valid()) {
texture = atlas_tex->get_atlas();
+ }
if (texture.is_null()) {
_zoom_reset();
@@ -898,11 +928,11 @@ Vector2 TextureRegionEditor::snap_point(Vector2 p_target) const {
}
TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
- node_sprite = NULL;
- node_sprite_3d = NULL;
- node_ninepatch = NULL;
- obj_styleBox = Ref<StyleBoxTexture>(NULL);
- atlas_tex = Ref<AtlasTexture>(NULL);
+ node_sprite = nullptr;
+ node_sprite_3d = nullptr;
+ node_ninepatch = nullptr;
+ obj_styleBox = Ref<StyleBoxTexture>(nullptr);
+ atlas_tex = Ref<AtlasTexture>(nullptr);
editor = p_editor;
undo_redo = editor->get_undo_redo();
@@ -924,7 +954,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
snap_mode_button->add_item(TTR("Grid Snap"), 2);
snap_mode_button->add_item(TTR("Auto Slice"), 3);
snap_mode_button->select(0);
- snap_mode_button->connect("item_selected", this, "_set_snap_mode");
+ snap_mode_button->connect("item_selected", callable_mp(this, &TextureRegionEditor::_set_snap_mode));
hb_grid = memnew(HBoxContainer);
hb_tools->add_child(hb_grid);
@@ -938,7 +968,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
sb_off_x->set_step(1);
sb_off_x->set_value(snap_offset.x);
sb_off_x->set_suffix("px");
- sb_off_x->connect("value_changed", this, "_set_snap_off_x");
+ sb_off_x->connect("value_changed", callable_mp(this, &TextureRegionEditor::_set_snap_off_x));
hb_grid->add_child(sb_off_x);
sb_off_y = memnew(SpinBox);
@@ -947,7 +977,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
sb_off_y->set_step(1);
sb_off_y->set_value(snap_offset.y);
sb_off_y->set_suffix("px");
- sb_off_y->connect("value_changed", this, "_set_snap_off_y");
+ sb_off_y->connect("value_changed", callable_mp(this, &TextureRegionEditor::_set_snap_off_y));
hb_grid->add_child(sb_off_y);
hb_grid->add_child(memnew(VSeparator));
@@ -959,7 +989,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
sb_step_x->set_step(1);
sb_step_x->set_value(snap_step.x);
sb_step_x->set_suffix("px");
- sb_step_x->connect("value_changed", this, "_set_snap_step_x");
+ sb_step_x->connect("value_changed", callable_mp(this, &TextureRegionEditor::_set_snap_step_x));
hb_grid->add_child(sb_step_x);
sb_step_y = memnew(SpinBox);
@@ -968,7 +998,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
sb_step_y->set_step(1);
sb_step_y->set_value(snap_step.y);
sb_step_y->set_suffix("px");
- sb_step_y->connect("value_changed", this, "_set_snap_step_y");
+ sb_step_y->connect("value_changed", callable_mp(this, &TextureRegionEditor::_set_snap_step_y));
hb_grid->add_child(sb_step_y);
hb_grid->add_child(memnew(VSeparator));
@@ -980,7 +1010,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
sb_sep_x->set_step(1);
sb_sep_x->set_value(snap_separation.x);
sb_sep_x->set_suffix("px");
- sb_sep_x->connect("value_changed", this, "_set_snap_sep_x");
+ sb_sep_x->connect("value_changed", callable_mp(this, &TextureRegionEditor::_set_snap_sep_x));
hb_grid->add_child(sb_sep_x);
sb_sep_y = memnew(SpinBox);
@@ -989,7 +1019,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
sb_sep_y->set_step(1);
sb_sep_y->set_value(snap_separation.y);
sb_sep_y->set_suffix("px");
- sb_sep_y->connect("value_changed", this, "_set_snap_sep_y");
+ sb_sep_y->connect("value_changed", callable_mp(this, &TextureRegionEditor::_set_snap_sep_y));
hb_grid->add_child(sb_sep_y);
hb_grid->hide();
@@ -997,8 +1027,8 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
edit_draw = memnew(Panel);
add_child(edit_draw);
edit_draw->set_v_size_flags(SIZE_EXPAND_FILL);
- edit_draw->connect("draw", this, "_region_draw");
- edit_draw->connect("gui_input", this, "_region_input");
+ edit_draw->connect("draw", callable_mp(this, &TextureRegionEditor::_region_draw));
+ edit_draw->connect("gui_input", callable_mp(this, &TextureRegionEditor::_region_input));
draw_zoom = 1.0;
edit_draw->set_clip_contents(true);
@@ -1007,31 +1037,35 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
edit_draw->add_child(zoom_hb);
zoom_hb->set_begin(Point2(5, 5));
- zoom_out = memnew(ToolButton);
+ zoom_out = memnew(Button);
+ zoom_out->set_flat(true);
zoom_out->set_tooltip(TTR("Zoom Out"));
- zoom_out->connect("pressed", this, "_zoom_out");
+ zoom_out->connect("pressed", callable_mp(this, &TextureRegionEditor::_zoom_out));
zoom_hb->add_child(zoom_out);
- zoom_reset = memnew(ToolButton);
+ zoom_reset = memnew(Button);
+ zoom_reset->set_flat(true);
zoom_reset->set_tooltip(TTR("Zoom Reset"));
- zoom_reset->connect("pressed", this, "_zoom_reset");
+ zoom_reset->connect("pressed", callable_mp(this, &TextureRegionEditor::_zoom_reset));
zoom_hb->add_child(zoom_reset);
- zoom_in = memnew(ToolButton);
+ zoom_in = memnew(Button);
+ zoom_in->set_flat(true);
zoom_in->set_tooltip(TTR("Zoom In"));
- zoom_in->connect("pressed", this, "_zoom_in");
+ zoom_in->connect("pressed", callable_mp(this, &TextureRegionEditor::_zoom_in));
zoom_hb->add_child(zoom_in);
vscroll = memnew(VScrollBar);
vscroll->set_step(0.001);
edit_draw->add_child(vscroll);
- vscroll->connect("value_changed", this, "_scroll_changed");
+ vscroll->connect("value_changed", callable_mp(this, &TextureRegionEditor::_scroll_changed));
hscroll = memnew(HScrollBar);
hscroll->set_step(0.001);
edit_draw->add_child(hscroll);
- hscroll->connect("value_changed", this, "_scroll_changed");
+ hscroll->connect("value_changed", callable_mp(this, &TextureRegionEditor::_scroll_changed));
updating_scroll = false;
+ autoslice_is_dirty = true;
}
void TextureRegionEditorPlugin::edit(Object *p_object) {
@@ -1039,7 +1073,7 @@ void TextureRegionEditorPlugin::edit(Object *p_object) {
}
bool TextureRegionEditorPlugin::handles(Object *p_object) const {
- return p_object->is_class("Sprite") || p_object->is_class("Sprite3D") || p_object->is_class("NinePatchRect") || p_object->is_class("StyleBoxTexture") || p_object->is_class("AtlasTexture");
+ return p_object->is_class("Sprite2D") || p_object->is_class("Sprite3D") || p_object->is_class("NinePatchRect") || p_object->is_class("StyleBoxTexture") || p_object->is_class("AtlasTexture");
}
void TextureRegionEditorPlugin::_editor_visiblity_changed() {
@@ -1059,12 +1093,11 @@ void TextureRegionEditorPlugin::make_visible(bool p_visible) {
manually_hidden = false;
}
texture_region_button->hide();
- region_editor->edit(NULL);
+ region_editor->edit(nullptr);
}
}
Dictionary TextureRegionEditorPlugin::get_state() const {
-
Dictionary state;
state["snap_offset"] = region_editor->snap_offset;
state["snap_step"] = region_editor->snap_step;
@@ -1074,7 +1107,6 @@ Dictionary TextureRegionEditorPlugin::get_state() const {
}
void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) {
-
Dictionary state = p_state;
if (state.has("snap_step")) {
Vector2 s = state["snap_step"];
@@ -1104,7 +1136,6 @@ void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) {
}
void TextureRegionEditorPlugin::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_editor_visiblity_changed"), &TextureRegionEditorPlugin::_editor_visiblity_changed);
}
TextureRegionEditorPlugin::TextureRegionEditorPlugin(EditorNode *p_node) {
@@ -1114,7 +1145,7 @@ TextureRegionEditorPlugin::TextureRegionEditorPlugin(EditorNode *p_node) {
region_editor = memnew(TextureRegionEditor(p_node));
region_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE);
region_editor->hide();
- region_editor->connect("visibility_changed", this, "_editor_visiblity_changed");
+ region_editor->connect("visibility_changed", callable_mp(this, &TextureRegionEditorPlugin::_editor_visiblity_changed));
texture_region_button = p_node->add_bottom_panel_item(TTR("TextureRegion"), region_editor);
texture_region_button->hide();
diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h
index d877cf9436..e9f58006a4 100644
--- a/editor/plugins/texture_region_editor_plugin.h
+++ b/editor/plugins/texture_region_editor_plugin.h
@@ -34,7 +34,7 @@
#include "canvas_item_editor_plugin.h"
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-#include "scene/2d/sprite.h"
+#include "scene/2d/sprite_2d.h"
#include "scene/3d/sprite_3d.h"
#include "scene/gui/nine_patch_rect.h"
#include "scene/resources/style_box.h"
@@ -45,7 +45,6 @@
*/
class TextureRegionEditor : public VBoxContainer {
-
GDCLASS(TextureRegionEditor, VBoxContainer);
enum SnapMode {
@@ -57,9 +56,9 @@ class TextureRegionEditor : public VBoxContainer {
friend class TextureRegionEditorPlugin;
OptionButton *snap_mode_button;
- ToolButton *zoom_in;
- ToolButton *zoom_reset;
- ToolButton *zoom_out;
+ Button *zoom_in;
+ Button *zoom_reset;
+ Button *zoom_out;
HBoxContainer *hb_grid; //For showing/hiding the grid controls when changing the SnapMode
SpinBox *sb_step_y;
SpinBox *sb_step_x;
@@ -84,7 +83,7 @@ class TextureRegionEditor : public VBoxContainer {
Vector2 snap_step;
Vector2 snap_separation;
- Sprite *node_sprite;
+ Sprite2D *node_sprite;
Sprite3D *node_sprite_3d;
NinePatchRect *node_ninepatch;
Ref<StyleBoxTexture> obj_styleBox;
@@ -94,7 +93,7 @@ class TextureRegionEditor : public VBoxContainer {
Rect2 rect_prev;
float prev_margin;
int edited_margin;
- Map<RID, List<Rect2> > cache_map;
+ Map<RID, List<Rect2>> cache_map;
List<Rect2> autoslice_cache;
bool autoslice_is_dirty;
@@ -125,7 +124,7 @@ protected:
Vector2 snap_point(Vector2 p_target) const;
- virtual void _changed_callback(Object *p_changed, const char *p_prop);
+ virtual void _changed_callback(Object *p_changed, const char *p_prop) override;
public:
void _edit_region();
@@ -136,7 +135,7 @@ public:
bool is_atlas_texture();
bool is_ninepatch();
Sprite3D *get_sprite_3d();
- Sprite *get_sprite();
+ Sprite2D *get_sprite();
void edit(Object *p_obj);
TextureRegionEditor(EditorNode *p_editor);
@@ -156,13 +155,13 @@ protected:
void _editor_visiblity_changed();
public:
- virtual String get_name() const { return "TextureRegion"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
- void set_state(const Dictionary &p_state);
- Dictionary get_state() const;
+ virtual String get_name() const override { return "TextureRegion"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
+ void set_state(const Dictionary &p_state) override;
+ Dictionary get_state() const override;
TextureRegionEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
index 22105f7ed4..932ded6938 100644
--- a/editor/plugins/theme_editor_plugin.cpp
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -36,52 +36,55 @@
#include "scene/gui/progress_bar.h"
void ThemeEditor::edit(const Ref<Theme> &p_theme) {
-
theme = p_theme;
main_panel->set_theme(p_theme);
main_container->set_theme(p_theme);
}
void ThemeEditor::_propagate_redraw(Control *p_at) {
-
p_at->notification(NOTIFICATION_THEME_CHANGED);
p_at->minimum_size_changed();
p_at->update();
for (int i = 0; i < p_at->get_child_count(); i++) {
Control *a = Object::cast_to<Control>(p_at->get_child(i));
- if (a)
+ if (a) {
_propagate_redraw(a);
+ }
}
}
void ThemeEditor::_refresh_interval() {
-
_propagate_redraw(main_panel);
_propagate_redraw(main_container);
}
void ThemeEditor::_type_menu_cbk(int p_option) {
-
type_edit->set_text(type_menu->get_popup()->get_item_text(p_option));
}
void ThemeEditor::_name_menu_about_to_show() {
-
String fromtype = type_edit->get_text();
List<StringName> names;
if (popup_mode == POPUP_ADD) {
-
switch (type_select->get_selected()) {
-
- case 0: Theme::get_default()->get_icon_list(fromtype, &names); break;
- case 1: Theme::get_default()->get_stylebox_list(fromtype, &names); break;
- case 2: Theme::get_default()->get_font_list(fromtype, &names); break;
- case 3: Theme::get_default()->get_color_list(fromtype, &names); break;
- case 4: Theme::get_default()->get_constant_list(fromtype, &names); break;
+ case 0:
+ Theme::get_default()->get_icon_list(fromtype, &names);
+ break;
+ case 1:
+ Theme::get_default()->get_stylebox_list(fromtype, &names);
+ break;
+ case 2:
+ Theme::get_default()->get_font_list(fromtype, &names);
+ break;
+ case 3:
+ Theme::get_default()->get_color_list(fromtype, &names);
+ break;
+ case 4:
+ Theme::get_default()->get_constant_list(fromtype, &names);
+ break;
}
} else if (popup_mode == POPUP_REMOVE) {
-
theme->get_icon_list(fromtype, &names);
theme->get_stylebox_list(fromtype, &names);
theme->get_font_list(fromtype, &names);
@@ -92,21 +95,17 @@ void ThemeEditor::_name_menu_about_to_show() {
name_menu->get_popup()->clear();
name_menu->get_popup()->set_size(Size2());
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
-
name_menu->get_popup()->add_item(E->get());
}
}
void ThemeEditor::_name_menu_cbk(int p_option) {
-
name_edit->set_text(name_menu->get_popup()->get_item_text(p_option));
}
struct _TECategory {
-
template <class T>
struct RefItem {
-
Ref<T> item;
StringName name;
bool operator<(const RefItem<T> &p) const { return item->get_instance_id() < p.item->get_instance_id(); }
@@ -114,22 +113,20 @@ struct _TECategory {
template <class T>
struct Item {
-
T item;
String name;
bool operator<(const Item<T> &p) const { return name < p.name; }
};
- Set<RefItem<StyleBox> > stylebox_items;
- Set<RefItem<Font> > font_items;
- Set<RefItem<Texture> > icon_items;
+ Set<RefItem<StyleBox>> stylebox_items;
+ Set<RefItem<Font>> font_items;
+ Set<RefItem<Texture2D>> icon_items;
- Set<Item<Color> > color_items;
- Set<Item<int> > constant_items;
+ Set<Item<Color>> color_items;
+ Set<Item<int>> constant_items;
};
void ThemeEditor::_save_template_cbk(String fname) {
-
String filename = file_dialog->get_current_path();
Map<String, _TECategory> categories;
@@ -143,7 +140,6 @@ void ThemeEditor::_save_template_cbk(String fname) {
// Fill default theme.
for (Map<String, _TECategory>::Element *E = categories.front(); E; E = E->next()) {
-
_TECategory &tc = E->get();
List<StringName> stylebox_list;
@@ -167,7 +163,7 @@ void ThemeEditor::_save_template_cbk(String fname) {
List<StringName> icon_list;
Theme::get_default()->get_icon_list(E->key(), &icon_list);
for (List<StringName>::Element *F = icon_list.front(); F; F = F->next()) {
- _TECategory::RefItem<Texture> it;
+ _TECategory::RefItem<Texture2D> it;
it.name = F->get();
it.item = Theme::get_default()->get_icon(F->get(), E->key());
tc.icon_items.insert(it);
@@ -210,8 +206,8 @@ void ThemeEditor::_save_template_cbk(String fname) {
file->store_line("; [value] examples:");
file->store_line("; ");
file->store_line("; Type.item = 6 ; numeric constant. ");
- file->store_line("; Type.item = #FF00FF ; HTML color ");
- file->store_line("; Type.item = #55FF00FF ; HTML color with alpha 55.");
+ file->store_line("; Type.item = #FF00FF ; HTML color (magenta).");
+ file->store_line("; Type.item = #FF00FF55 ; HTML color (magenta with alpha 0x55).");
file->store_line("; Type.item = icon(image.png) ; icon in a png file (relative to theme file).");
file->store_line("; Type.item = font(font.xres) ; font in a resource (relative to theme file).");
file->store_line("; Type.item = sbox(stylebox.xres) ; stylebox in a resource (relative to theme file).");
@@ -260,55 +256,55 @@ void ThemeEditor::_save_template_cbk(String fname) {
// Write default theme.
for (Map<String, _TECategory>::Element *E = categories.front(); E; E = E->next()) {
-
_TECategory &tc = E->get();
String underline = "; ";
- for (int i = 0; i < E->key().length(); i++)
+ for (int i = 0; i < E->key().length(); i++) {
underline += "*";
+ }
file->store_line("");
file->store_line(underline);
file->store_line("; " + E->key());
file->store_line(underline);
- if (tc.stylebox_items.size())
+ if (tc.stylebox_items.size()) {
file->store_line("\n; StyleBox Items:\n");
+ }
- for (Set<_TECategory::RefItem<StyleBox> >::Element *F = tc.stylebox_items.front(); F; F = F->next()) {
-
+ for (Set<_TECategory::RefItem<StyleBox>>::Element *F = tc.stylebox_items.front(); F; F = F->next()) {
file->store_line(E->key() + "." + F->get().name + " = default");
}
- if (tc.font_items.size())
+ if (tc.font_items.size()) {
file->store_line("\n; Font Items:\n");
+ }
- for (Set<_TECategory::RefItem<Font> >::Element *F = tc.font_items.front(); F; F = F->next()) {
-
+ for (Set<_TECategory::RefItem<Font>>::Element *F = tc.font_items.front(); F; F = F->next()) {
file->store_line(E->key() + "." + F->get().name + " = default");
}
- if (tc.icon_items.size())
+ if (tc.icon_items.size()) {
file->store_line("\n; Icon Items:\n");
+ }
- for (Set<_TECategory::RefItem<Texture> >::Element *F = tc.icon_items.front(); F; F = F->next()) {
-
+ for (Set<_TECategory::RefItem<Texture2D>>::Element *F = tc.icon_items.front(); F; F = F->next()) {
file->store_line(E->key() + "." + F->get().name + " = default");
}
- if (tc.color_items.size())
+ if (tc.color_items.size()) {
file->store_line("\n; Color Items:\n");
+ }
- for (Set<_TECategory::Item<Color> >::Element *F = tc.color_items.front(); F; F = F->next()) {
-
+ for (Set<_TECategory::Item<Color>>::Element *F = tc.color_items.front(); F; F = F->next()) {
file->store_line(E->key() + "." + F->get().name + " = default");
}
- if (tc.constant_items.size())
+ if (tc.constant_items.size()) {
file->store_line("\n; Constant Items:\n");
+ }
- for (Set<_TECategory::Item<int> >::Element *F = tc.constant_items.front(); F; F = F->next()) {
-
+ for (Set<_TECategory::Item<int>>::Element *F = tc.constant_items.front(); F; F = F->next()) {
file->store_line(E->key() + "." + F->get().name + " = default");
}
}
@@ -318,22 +314,28 @@ void ThemeEditor::_save_template_cbk(String fname) {
}
void ThemeEditor::_dialog_cbk() {
-
switch (popup_mode) {
case POPUP_ADD: {
-
switch (type_select->get_selected()) {
-
- case 0: theme->set_icon(name_edit->get_text(), type_edit->get_text(), Ref<Texture>()); break;
- case 1: theme->set_stylebox(name_edit->get_text(), type_edit->get_text(), Ref<StyleBox>()); break;
- case 2: theme->set_font(name_edit->get_text(), type_edit->get_text(), Ref<Font>()); break;
- case 3: theme->set_color(name_edit->get_text(), type_edit->get_text(), Color()); break;
- case 4: theme->set_constant(name_edit->get_text(), type_edit->get_text(), 0); break;
+ case 0:
+ theme->set_icon(name_edit->get_text(), type_edit->get_text(), Ref<Texture2D>());
+ break;
+ case 1:
+ theme->set_stylebox(name_edit->get_text(), type_edit->get_text(), Ref<StyleBox>());
+ break;
+ case 2:
+ theme->set_font(name_edit->get_text(), type_edit->get_text(), Ref<Font>());
+ break;
+ case 3:
+ theme->set_color(name_edit->get_text(), type_edit->get_text(), Color());
+ break;
+ case 4:
+ theme->set_constant(name_edit->get_text(), type_edit->get_text(), 0);
+ break;
}
} break;
case POPUP_CLASS_ADD: {
-
StringName fromtype = type_edit->get_text();
List<StringName> names;
@@ -341,7 +343,7 @@ void ThemeEditor::_dialog_cbk() {
names.clear();
Theme::get_default()->get_icon_list(fromtype, &names);
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
- theme->set_icon(E->get(), fromtype, Ref<Texture>());
+ theme->set_icon(E->get(), fromtype, Ref<Texture2D>());
}
}
{
@@ -375,12 +377,21 @@ void ThemeEditor::_dialog_cbk() {
} break;
case POPUP_REMOVE: {
switch (type_select->get_selected()) {
-
- case 0: theme->clear_icon(name_edit->get_text(), type_edit->get_text()); break;
- case 1: theme->clear_stylebox(name_edit->get_text(), type_edit->get_text()); break;
- case 2: theme->clear_font(name_edit->get_text(), type_edit->get_text()); break;
- case 3: theme->clear_color(name_edit->get_text(), type_edit->get_text()); break;
- case 4: theme->clear_constant(name_edit->get_text(), type_edit->get_text()); break;
+ case 0:
+ theme->clear_icon(name_edit->get_text(), type_edit->get_text());
+ break;
+ case 1:
+ theme->clear_stylebox(name_edit->get_text(), type_edit->get_text());
+ break;
+ case 2:
+ theme->clear_font(name_edit->get_text(), type_edit->get_text());
+ break;
+ case 3:
+ theme->clear_color(name_edit->get_text(), type_edit->get_text());
+ break;
+ case 4:
+ theme->clear_constant(name_edit->get_text(), type_edit->get_text());
+ break;
}
} break;
@@ -429,9 +440,7 @@ void ThemeEditor::_dialog_cbk() {
}
void ThemeEditor::_theme_menu_cbk(int p_option) {
-
if (p_option == POPUP_CREATE_EMPTY || p_option == POPUP_CREATE_EDITOR_EMPTY || p_option == POPUP_IMPORT_EDITOR_THEME) {
-
bool import = (p_option == POPUP_IMPORT_EDITOR_THEME);
Ref<Theme> base_theme;
@@ -443,7 +452,6 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
}
{
-
List<StringName> types;
base_theme->get_type_list(&types);
@@ -454,7 +462,7 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
base_theme->get_icon_list(type, &icons);
for (List<StringName>::Element *E = icons.front(); E; E = E->next()) {
- theme->set_icon(E->get(), type, import ? base_theme->get_icon(E->get(), type) : Ref<Texture>());
+ theme->set_icon(E->get(), type, import ? base_theme->get_icon(E->get(), type) : Ref<Texture2D>());
}
List<StringName> shaders;
@@ -525,7 +533,6 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
type_select->hide();
} else if (p_option == POPUP_REMOVE) {
-
add_del_dialog->set_title(TTR("Remove Item"));
add_del_dialog->get_ok()->set_text(TTR("Remove"));
add_del_dialog->popup_centered(Size2(490, 85) * EDSCALE);
@@ -533,7 +540,6 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
base_theme = theme;
} else if (p_option == POPUP_CLASS_REMOVE) {
-
add_del_dialog->set_title(TTR("Remove All Items"));
add_del_dialog->get_ok()->set_text(TTR("Remove All"));
add_del_dialog->popup_centered(Size2(240, 85) * EDSCALE);
@@ -559,30 +565,27 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
List<StringName> new_types;
theme->get_type_list(&new_types);
for (List<StringName>::Element *F = new_types.front(); F; F = F->next()) {
-
bool found = false;
for (List<StringName>::Element *E = types.front(); E; E = E->next()) {
-
if (E->get() == F->get()) {
found = true;
break;
}
}
- if (!found)
+ if (!found) {
types.push_back(F->get());
+ }
}
}
types.sort_custom<StringName::AlphCompare>();
for (List<StringName>::Element *E = types.front(); E; E = E->next()) {
-
type_menu->get_popup()->add_item(E->get());
}
}
void ThemeEditor::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_PROCESS: {
time_left -= get_process_delta_time();
@@ -592,23 +595,15 @@ void ThemeEditor::_notification(int p_what) {
}
} break;
case NOTIFICATION_THEME_CHANGED: {
- theme_menu->set_icon(get_icon("Theme", "EditorIcons"));
+ theme_menu->set_icon(get_theme_icon("Theme", "EditorIcons"));
} break;
}
}
void ThemeEditor::_bind_methods() {
-
- ClassDB::bind_method("_type_menu_cbk", &ThemeEditor::_type_menu_cbk);
- ClassDB::bind_method("_name_menu_about_to_show", &ThemeEditor::_name_menu_about_to_show);
- ClassDB::bind_method("_name_menu_cbk", &ThemeEditor::_name_menu_cbk);
- ClassDB::bind_method("_theme_menu_cbk", &ThemeEditor::_theme_menu_cbk);
- ClassDB::bind_method("_dialog_cbk", &ThemeEditor::_dialog_cbk);
- ClassDB::bind_method("_save_template_cbk", &ThemeEditor::_save_template_cbk);
}
ThemeEditor::ThemeEditor() {
-
time_left = 0;
HBoxContainer *top_menu = memnew(HBoxContainer);
@@ -629,12 +624,12 @@ ThemeEditor::ThemeEditor() {
theme_menu->get_popup()->add_item(TTR("Create Empty Editor Template"), POPUP_CREATE_EDITOR_EMPTY);
theme_menu->get_popup()->add_item(TTR("Create From Current Editor Theme"), POPUP_IMPORT_EDITOR_THEME);
top_menu->add_child(theme_menu);
- theme_menu->get_popup()->connect("id_pressed", this, "_theme_menu_cbk");
+ theme_menu->get_popup()->connect("id_pressed", callable_mp(this, &ThemeEditor::_theme_menu_cbk));
ScrollContainer *scroll = memnew(ScrollContainer);
add_child(scroll);
scroll->set_enable_v_scroll(true);
- scroll->set_enable_h_scroll(false);
+ scroll->set_enable_h_scroll(true);
scroll->set_v_size_flags(SIZE_EXPAND_FILL);
MarginContainer *root_container = memnew(MarginContainer);
@@ -652,10 +647,10 @@ ThemeEditor::ThemeEditor() {
main_container = memnew(MarginContainer);
root_container->add_child(main_container);
- main_container->add_constant_override("margin_right", 4 * EDSCALE);
- main_container->add_constant_override("margin_top", 4 * EDSCALE);
- main_container->add_constant_override("margin_left", 4 * EDSCALE);
- main_container->add_constant_override("margin_bottom", 4 * EDSCALE);
+ main_container->add_theme_constant_override("margin_right", 4 * EDSCALE);
+ main_container->add_theme_constant_override("margin_top", 4 * EDSCALE);
+ main_container->add_theme_constant_override("margin_left", 4 * EDSCALE);
+ main_container->add_theme_constant_override("margin_bottom", 4 * EDSCALE);
HBoxContainer *main_hb = memnew(HBoxContainer);
main_container->add_child(main_hb);
@@ -663,7 +658,7 @@ ThemeEditor::ThemeEditor() {
VBoxContainer *first_vb = memnew(VBoxContainer);
main_hb->add_child(first_vb);
first_vb->set_h_size_flags(SIZE_EXPAND_FILL);
- first_vb->add_constant_override("separation", 10 * EDSCALE);
+ first_vb->add_theme_constant_override("separation", 10 * EDSCALE);
first_vb->add_child(memnew(Label("Label")));
@@ -677,8 +672,9 @@ ThemeEditor::ThemeEditor() {
bt->set_text(TTR("Disabled Button"));
bt->set_disabled(true);
first_vb->add_child(bt);
- ToolButton *tb = memnew(ToolButton);
- tb->set_text("ToolButton");
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
+ tb->set_text("Button");
first_vb->add_child(tb);
CheckButton *cb = memnew(CheckButton);
@@ -723,7 +719,7 @@ ThemeEditor::ThemeEditor() {
VBoxContainer *second_vb = memnew(VBoxContainer);
second_vb->set_h_size_flags(SIZE_EXPAND_FILL);
main_hb->add_child(second_vb);
- second_vb->add_constant_override("separation", 10 * EDSCALE);
+ second_vb->add_theme_constant_override("separation", 10 * EDSCALE);
LineEdit *le = memnew(LineEdit);
le->set_text("LineEdit");
second_vb->add_child(le);
@@ -763,7 +759,7 @@ ThemeEditor::ThemeEditor() {
VBoxContainer *third_vb = memnew(VBoxContainer);
third_vb->set_h_size_flags(SIZE_EXPAND_FILL);
- third_vb->add_constant_override("separation", 10 * EDSCALE);
+ third_vb->add_theme_constant_override("separation", 10 * EDSCALE);
main_hb->add_child(third_vb);
TabContainer *tc = memnew(TabContainer);
@@ -783,7 +779,7 @@ ThemeEditor::ThemeEditor() {
Tree *test_tree = memnew(Tree);
third_vb->add_child(test_tree);
test_tree->set_custom_minimum_size(Size2(0, 175) * EDSCALE);
- test_tree->add_constant_override("draw_relationship_lines", 1);
+ test_tree->add_theme_constant_override("draw_relationship_lines", 1);
TreeItem *item = test_tree->create_item();
item->set_text(0, "Tree");
@@ -809,7 +805,7 @@ ThemeEditor::ThemeEditor() {
item->set_text(0, TTR("Has,Many,Options"));
item->set_range(0, 2);
- main_hb->add_constant_override("separation", 20 * EDSCALE);
+ main_hb->add_theme_constant_override("separation", 20 * EDSCALE);
////////
@@ -832,10 +828,10 @@ ThemeEditor::ThemeEditor() {
type_hbc->add_child(type_edit);
type_menu = memnew(MenuButton);
type_menu->set_flat(false);
- type_menu->set_text("..");
+ type_menu->set_text("...");
type_hbc->add_child(type_menu);
- type_menu->get_popup()->connect("id_pressed", this, "_type_menu_cbk");
+ type_menu->get_popup()->connect("id_pressed", callable_mp(this, &ThemeEditor::_type_menu_cbk));
l = memnew(Label);
l->set_text(TTR("Name:"));
@@ -850,11 +846,11 @@ ThemeEditor::ThemeEditor() {
name_hbc->add_child(name_edit);
name_menu = memnew(MenuButton);
type_menu->set_flat(false);
- name_menu->set_text("..");
+ name_menu->set_text("...");
name_hbc->add_child(name_menu);
- name_menu->get_popup()->connect("about_to_show", this, "_name_menu_about_to_show");
- name_menu->get_popup()->connect("id_pressed", this, "_name_menu_cbk");
+ name_menu->get_popup()->connect("about_to_popup", callable_mp(this, &ThemeEditor::_name_menu_about_to_show));
+ name_menu->get_popup()->connect("id_pressed", callable_mp(this, &ThemeEditor::_name_menu_cbk));
type_select_label = memnew(Label);
type_select_label->set_text(TTR("Data Type:"));
@@ -869,16 +865,15 @@ ThemeEditor::ThemeEditor() {
dialog_vbc->add_child(type_select);
- add_del_dialog->get_ok()->connect("pressed", this, "_dialog_cbk");
+ add_del_dialog->get_ok()->connect("pressed", callable_mp(this, &ThemeEditor::_dialog_cbk));
file_dialog = memnew(EditorFileDialog);
file_dialog->add_filter("*.theme ; " + TTR("Theme File"));
add_child(file_dialog);
- file_dialog->connect("file_selected", this, "_save_template_cbk");
+ file_dialog->connect("file_selected", callable_mp(this, &ThemeEditor::_save_template_cbk));
}
void ThemeEditorPlugin::edit(Object *p_node) {
-
if (Object::cast_to<Theme>(p_node)) {
theme_editor->edit(Object::cast_to<Theme>(p_node));
} else {
@@ -887,27 +882,25 @@ void ThemeEditorPlugin::edit(Object *p_node) {
}
bool ThemeEditorPlugin::handles(Object *p_node) const {
-
return p_node->is_class("Theme");
}
void ThemeEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
theme_editor->set_process(true);
button->show();
editor->make_bottom_panel_item_visible(theme_editor);
} else {
theme_editor->set_process(false);
- if (theme_editor->is_visible_in_tree())
+ if (theme_editor->is_visible_in_tree()) {
editor->hide_bottom_panel();
+ }
button->hide();
}
}
ThemeEditorPlugin::ThemeEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
theme_editor = memnew(ThemeEditor);
theme_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE);
diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h
index c51583593d..e374dd8714 100644
--- a/editor/plugins/theme_editor_plugin.h
+++ b/editor/plugins/theme_editor_plugin.h
@@ -42,7 +42,6 @@
#include "editor/editor_node.h"
class ThemeEditor : public VBoxContainer {
-
GDCLASS(ThemeEditor, VBoxContainer);
Panel *main_panel;
@@ -99,7 +98,6 @@ public:
};
class ThemeEditorPlugin : public EditorPlugin {
-
GDCLASS(ThemeEditorPlugin, EditorPlugin);
ThemeEditor *theme_editor;
@@ -107,11 +105,11 @@ class ThemeEditorPlugin : public EditorPlugin {
Button *button;
public:
- virtual String get_name() const { return "Theme"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_node);
- virtual bool handles(Object *p_node) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "Theme"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_node) override;
+ virtual bool handles(Object *p_node) const override;
+ virtual void make_visible(bool p_visible) override;
ThemeEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp
index f889228f87..8cd8aaf277 100644
--- a/editor/plugins/tile_map_editor_plugin.cpp
+++ b/editor/plugins/tile_map_editor_plugin.cpp
@@ -31,63 +31,72 @@
#include "tile_map_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
+#include "core/input/input.h"
#include "core/math/math_funcs.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "scene/gui/split_container.h"
-void TileMapEditor::_notification(int p_what) {
+void TileMapEditor::_node_removed(Node *p_node) {
+ if (p_node == node) {
+ node = nullptr;
+ }
+}
+void TileMapEditor::_notification(int p_what) {
switch (p_what) {
-
case NOTIFICATION_PROCESS: {
-
if (bucket_queue.size()) {
CanvasItemEditor::get_singleton()->update_viewport();
}
} break;
- case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ case NOTIFICATION_ENTER_TREE: {
+ get_tree()->connect("node_removed", callable_mp(this, &TileMapEditor::_node_removed));
+ [[fallthrough]];
+ }
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
if (is_visible_in_tree()) {
_update_palette();
}
- FALLTHROUGH;
- }
-
- case NOTIFICATION_ENTER_TREE: {
- paint_button->set_icon(get_icon("Edit", "EditorIcons"));
- bucket_fill_button->set_icon(get_icon("Bucket", "EditorIcons"));
- picker_button->set_icon(get_icon("ColorPick", "EditorIcons"));
- select_button->set_icon(get_icon("ActionCopy", "EditorIcons"));
+ paint_button->set_icon(get_theme_icon("Edit", "EditorIcons"));
+ line_button->set_icon(get_theme_icon("CurveLinear", "EditorIcons"));
+ rectangle_button->set_icon(get_theme_icon("RectangleShape2D", "EditorIcons"));
+ bucket_fill_button->set_icon(get_theme_icon("Bucket", "EditorIcons"));
+ picker_button->set_icon(get_theme_icon("ColorPick", "EditorIcons"));
+ select_button->set_icon(get_theme_icon("ActionCopy", "EditorIcons"));
- rotate_left_button->set_icon(get_icon("RotateLeft", "EditorIcons"));
- rotate_right_button->set_icon(get_icon("RotateRight", "EditorIcons"));
- flip_horizontal_button->set_icon(get_icon("MirrorX", "EditorIcons"));
- flip_vertical_button->set_icon(get_icon("MirrorY", "EditorIcons"));
- clear_transform_button->set_icon(get_icon("Clear", "EditorIcons"));
+ rotate_left_button->set_icon(get_theme_icon("RotateLeft", "EditorIcons"));
+ rotate_right_button->set_icon(get_theme_icon("RotateRight", "EditorIcons"));
+ flip_horizontal_button->set_icon(get_theme_icon("MirrorX", "EditorIcons"));
+ flip_vertical_button->set_icon(get_theme_icon("MirrorY", "EditorIcons"));
+ clear_transform_button->set_icon(get_theme_icon("Clear", "EditorIcons"));
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
+ search_box->set_right_icon(get_theme_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
PopupMenu *p = options->get_popup();
- p->set_item_icon(p->get_item_index(OPTION_CUT), get_icon("ActionCut", "EditorIcons"));
- p->set_item_icon(p->get_item_index(OPTION_COPY), get_icon("Duplicate", "EditorIcons"));
- p->set_item_icon(p->get_item_index(OPTION_ERASE_SELECTION), get_icon("Remove", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(OPTION_CUT), get_theme_icon("ActionCut", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(OPTION_COPY), get_theme_icon("Duplicate", "EditorIcons"));
+ p->set_item_icon(p->get_item_index(OPTION_ERASE_SELECTION), get_theme_icon("Remove", "EditorIcons"));
+
+ } break;
+ case NOTIFICATION_EXIT_TREE: {
+ get_tree()->disconnect("node_removed", callable_mp(this, &TileMapEditor::_node_removed));
} break;
}
}
void TileMapEditor::_update_button_tool() {
+ Button *tb[6] = { paint_button, line_button, rectangle_button, bucket_fill_button, picker_button, select_button };
- ToolButton *tb[4] = { paint_button, bucket_fill_button, picker_button, select_button };
// Unpress all buttons
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < 6; i++) {
tb[i]->set_pressed(false);
}
@@ -97,6 +106,12 @@ void TileMapEditor::_update_button_tool() {
case TOOL_PAINTING: {
paint_button->set_pressed(true);
} break;
+ case TOOL_LINE_PAINT: {
+ line_button->set_pressed(true);
+ } break;
+ case TOOL_RECTANGLE_PAINT: {
+ rectangle_button->set_pressed(true);
+ } break;
case TOOL_BUCKET: {
bucket_fill_button->set_pressed(true);
} break;
@@ -110,8 +125,9 @@ void TileMapEditor::_update_button_tool() {
break;
}
- if (tool != TOOL_PICKING)
+ if (tool != TOOL_PICKING) {
last_tool = tool;
+ }
}
void TileMapEditor::_button_tool_select(int p_tool) {
@@ -119,7 +135,6 @@ void TileMapEditor::_button_tool_select(int p_tool) {
_update_button_tool();
switch (tool) {
case TOOL_SELECTING: {
-
selection_active = false;
} break;
default:
@@ -129,10 +144,8 @@ void TileMapEditor::_button_tool_select(int p_tool) {
}
void TileMapEditor::_menu_option(int p_option) {
-
switch (p_option) {
case OPTION_COPY: {
-
_update_copydata();
if (selection_active) {
@@ -142,9 +155,9 @@ void TileMapEditor::_menu_option(int p_option) {
}
} break;
case OPTION_ERASE_SELECTION: {
-
- if (!selection_active)
+ if (!selection_active) {
return;
+ }
_start_undo(TTR("Erase Selection"));
_erase_selection();
@@ -156,7 +169,6 @@ void TileMapEditor::_menu_option(int p_option) {
CanvasItemEditor::get_singleton()->update_viewport();
} break;
case OPTION_FIX_INVALID: {
-
undo_redo->create_action(TTR("Fix Invalid Tiles"));
undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data"));
node->fix_invalid_tiles();
@@ -165,7 +177,6 @@ void TileMapEditor::_menu_option(int p_option) {
} break;
case OPTION_CUT: {
-
if (selection_active) {
_update_copydata();
@@ -192,20 +203,32 @@ void TileMapEditor::_palette_multi_selected(int index, bool selected) {
_update_palette();
}
-void TileMapEditor::_canvas_mouse_enter() {
+void TileMapEditor::_palette_input(const Ref<InputEvent> &p_event) {
+ const Ref<InputEventMouseButton> mb = p_event;
+
+ // Zoom in/out using Ctrl + mouse wheel.
+ if (mb.is_valid() && mb->is_pressed() && mb->get_command()) {
+ if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) {
+ size_slider->set_value(size_slider->get_value() + 0.2);
+ }
+
+ if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_DOWN) {
+ size_slider->set_value(size_slider->get_value() - 0.2);
+ }
+ }
+}
+void TileMapEditor::_canvas_mouse_enter() {
mouse_over = true;
CanvasItemEditor::get_singleton()->update_viewport();
}
void TileMapEditor::_canvas_mouse_exit() {
-
mouse_over = false;
CanvasItemEditor::get_singleton()->update_viewport();
}
Vector<int> TileMapEditor::get_selected_tiles() const {
-
Vector<int> items = palette->get_selected_items();
if (items.size() == 0) {
@@ -220,7 +243,6 @@ Vector<int> TileMapEditor::get_selected_tiles() const {
}
void TileMapEditor::set_selected_tiles(Vector<int> p_tiles) {
-
palette->unselect_all();
for (int i = p_tiles.size() - 1; i >= 0; i--) {
@@ -235,7 +257,6 @@ void TileMapEditor::set_selected_tiles(Vector<int> p_tiles) {
}
Dictionary TileMapEditor::_create_cell_dictionary(int tile, bool flip_x, bool flip_y, bool transpose, Vector2 autotile_coord) {
-
Dictionary cell;
cell["id"] = tile;
@@ -248,7 +269,6 @@ Dictionary TileMapEditor::_create_cell_dictionary(int tile, bool flip_x, bool fl
}
void TileMapEditor::_create_set_cell_undo_redo(const Vector2 &p_vec, const CellOp &p_cell_old, const CellOp &p_cell_new) {
-
Dictionary cell_old = _create_cell_dictionary(p_cell_old.idx, p_cell_old.xf, p_cell_old.yf, p_cell_old.tr, p_cell_old.ac);
Dictionary cell_new = _create_cell_dictionary(p_cell_new.idx, p_cell_new.xf, p_cell_new.yf, p_cell_new.tr, p_cell_new.ac);
@@ -257,13 +277,11 @@ void TileMapEditor::_create_set_cell_undo_redo(const Vector2 &p_vec, const CellO
}
void TileMapEditor::_start_undo(const String &p_action) {
-
undo_data.clear();
undo_redo->create_action(p_action);
}
void TileMapEditor::_finish_undo() {
-
if (undo_data.size()) {
for (Map<Point2i, CellOp>::Element *E = undo_data.front(); E; E = E->next()) {
_create_set_cell_undo_redo(E->key(), E->get(), _get_op_from_cell(E->key()));
@@ -276,11 +294,11 @@ void TileMapEditor::_finish_undo() {
}
void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord) {
-
ERR_FAIL_COND(!node);
- if (p_values.size() == 0)
+ if (p_values.size() == 0) {
return;
+ }
int p_value = p_values[Math::rand() % p_values.size()];
int prev_val = node->get_cell(p_pos.x, p_pos.y);
@@ -306,8 +324,9 @@ void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p
position = prev_position;
}
- if (p_value == prev_val && p_flip_h == prev_flip_h && p_flip_v == prev_flip_v && p_transpose == prev_transpose && prev_position == position)
+ if (p_value == prev_val && p_flip_h == prev_flip_h && p_flip_v == prev_flip_v && p_transpose == prev_transpose && prev_position == position) {
return; // Check that it's actually different.
+ }
for (int y = p_pos.y - 1; y <= p_pos.y + 1; y++) {
for (int x = p_pos.x - 1; x <= p_pos.x + 1; x++) {
@@ -320,8 +339,9 @@ void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p
node->_set_celld(p_pos, _create_cell_dictionary(p_value, p_flip_h, p_flip_v, p_transpose, p_autotile_coord));
- if (tool == TOOL_PASTING)
+ if (tool == TOOL_PASTING) {
return;
+ }
if (manual_autotile || (p_value != -1 && node->get_tileset()->tile_get_tile_mode(p_value) == TileSet::ATLAS_TILE)) {
if (current != -1) {
@@ -347,7 +367,6 @@ void TileMapEditor::_priority_toggled(bool p_enabled) {
}
void TileMapEditor::_text_entered(const String &p_text) {
-
canvas_item_editor_viewport->grab_focus();
}
@@ -356,14 +375,12 @@ void TileMapEditor::_text_changed(const String &p_text) {
}
void TileMapEditor::_sbox_input(const Ref<InputEvent> &p_ie) {
-
Ref<InputEventKey> k = p_ie;
- if (k.is_valid() && (k->get_scancode() == KEY_UP ||
- k->get_scancode() == KEY_DOWN ||
- k->get_scancode() == KEY_PAGEUP ||
- k->get_scancode() == KEY_PAGEDOWN)) {
-
+ if (k.is_valid() && (k->get_keycode() == KEY_UP ||
+ k->get_keycode() == KEY_DOWN ||
+ k->get_keycode() == KEY_PAGEUP ||
+ k->get_keycode() == KEY_PAGEDOWN)) {
palette->call("_gui_input", k);
search_box->accept_event();
}
@@ -383,9 +400,9 @@ struct _PaletteEntry {
} // namespace
void TileMapEditor::_update_palette() {
-
- if (!node)
+ if (!node) {
return;
+ }
// Update the clear button.
clear_transform_button->set_disabled(!flip_h && !flip_v && !transpose);
@@ -411,8 +428,9 @@ void TileMapEditor::_update_palette() {
List<int> tiles;
tileset->get_tile_list(&tiles);
- if (tiles.empty())
+ if (tiles.empty()) {
return;
+ }
float min_size = EDITOR_DEF("editors/tile_map/preview_size", 64);
min_size *= EDSCALE;
@@ -421,7 +439,7 @@ void TileMapEditor::_update_palette() {
bool show_tile_ids = bool(EDITOR_DEF("editors/tile_map/show_tile_ids", false));
bool sort_by_name = bool(EDITOR_DEF("editors/tile_map/sort_tiles_by_name", true));
- palette->add_constant_override("hseparation", hseparation * EDSCALE);
+ palette->add_theme_constant_override("hseparation", hseparation * EDSCALE);
palette->set_fixed_icon_size(Size2(min_size, min_size));
palette->set_fixed_column_width(min_size * MAX(size_slider->get_value(), 1));
@@ -434,7 +452,6 @@ void TileMapEditor::_update_palette() {
Vector<_PaletteEntry> entries;
for (List<int>::Element *E = tiles.front(); E; E = E->next()) {
-
String name = tileset->tile_get_name(E->get());
if (name != "") {
@@ -449,8 +466,9 @@ void TileMapEditor::_update_palette() {
name = "#" + itos(E->get());
}
- if (filter != "" && !filter.is_subsequence_ofi(name))
+ if (filter != "" && !filter.is_subsequence_ofi(name)) {
continue;
+ }
const _PaletteEntry entry = { E->get(), name };
entries.push_back(entry);
@@ -461,14 +479,13 @@ void TileMapEditor::_update_palette() {
}
for (int i = 0; i < entries.size(); i++) {
-
if (show_tile_names) {
palette->add_item(entries[i].name);
} else {
palette->add_item(String());
}
- Ref<Texture> tex = tileset->tile_get_texture(entries[i].id);
+ Ref<Texture2D> tex = tileset->tile_get_texture(entries[i].id);
if (tex.is_valid()) {
Rect2 region = tileset->tile_get_region(entries[i].id);
@@ -489,8 +506,9 @@ void TileMapEditor::_update_palette() {
}
// Set region.
- if (region.size != Size2())
+ if (region.size != Size2()) {
palette->set_item_icon_region(palette->get_item_count() - 1, region);
+ }
// Set icon.
palette->set_item_icon(palette->get_item_count() - 1, tex);
@@ -513,7 +531,6 @@ void TileMapEditor::_update_palette() {
}
if (sel_tile != TileMap::INVALID_CELL && ((manual_autotile && tileset->tile_get_tile_mode(sel_tile) == TileSet::AUTO_TILE) || (!priority_atlastile && tileset->tile_get_tile_mode(sel_tile) == TileSet::ATLAS_TILE))) {
-
const Map<Vector2, uint32_t> &tiles2 = tileset->autotile_get_bitmask_map(sel_tile);
Vector<Vector2> entries2;
@@ -528,21 +545,20 @@ void TileMapEditor::_update_palette() {
};
entries2.sort_custom<SwapComparator>();
- Ref<Texture> tex = tileset->tile_get_texture(sel_tile);
+ Ref<Texture2D> tex = tileset->tile_get_texture(sel_tile);
for (int i = 0; i < entries2.size(); i++) {
-
manual_palette->add_item(String());
if (tex.is_valid()) {
-
Rect2 region = tileset->tile_get_region(sel_tile);
int spacing = tileset->autotile_get_spacing(sel_tile);
region.size = tileset->autotile_get_size(sel_tile); // !!
region.position += (region.size + Vector2(spacing, spacing)) * entries2[i];
- if (!region.has_no_area())
+ if (!region.has_no_area()) {
manual_palette->set_item_icon_region(manual_palette->get_item_count() - 1, region);
+ }
manual_palette->set_item_icon(manual_palette->get_item_count() - 1, tex);
}
@@ -553,10 +569,12 @@ void TileMapEditor::_update_palette() {
if (manual_palette->get_item_count() > 0) {
// Only show the manual palette if at least tile exists in it.
- if (selected_manual == -1 || selected_single != palette->get_current())
+ if (selected_manual == -1 || selected_single != palette->get_current()) {
selected_manual = 0;
- if (selected_manual < manual_palette->get_item_count())
+ }
+ if (selected_manual < manual_palette->get_item_count()) {
manual_palette->set_current(selected_manual);
+ }
manual_palette->show();
}
@@ -570,11 +588,11 @@ void TileMapEditor::_update_palette() {
}
void TileMapEditor::_pick_tile(const Point2 &p_pos) {
-
int id = node->get_cell(p_pos.x, p_pos.y);
- if (id == TileMap::INVALID_CELL)
+ if (id == TileMap::INVALID_CELL) {
return;
+ }
if (search_box->get_text() != "") {
search_box->set_text("");
@@ -598,23 +616,23 @@ void TileMapEditor::_pick_tile(const Point2 &p_pos) {
CanvasItemEditor::get_singleton()->update_viewport();
}
-PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool erase, bool preview) {
-
+Vector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool erase, bool preview) {
int prev_id = node->get_cell(p_start.x, p_start.y);
Vector<int> ids;
ids.push_back(TileMap::INVALID_CELL);
if (!erase) {
ids = get_selected_tiles();
- if (ids.size() == 0 || ids[0] == TileMap::INVALID_CELL)
- return PoolVector<Vector2>();
+ if (ids.size() == 0 || ids[0] == TileMap::INVALID_CELL) {
+ return Vector<Vector2>();
+ }
} else if (prev_id == TileMap::INVALID_CELL) {
- return PoolVector<Vector2>();
+ return Vector<Vector2>();
}
if (ids.size() == 1 && ids[0] == prev_id) {
// Same ID, nothing to change
- return PoolVector<Vector2>();
+ return Vector<Vector2>();
}
Rect2i r = node->get_used_rect();
@@ -624,10 +642,11 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era
// Test if we can re-use the result from preview bucket fill
bool invalidate_cache = false;
// Area changed
- if (r != bucket_cache_rect)
+ if (r != bucket_cache_rect) {
_clear_bucket_cache();
+ }
// Cache grid is not initialized
- if (bucket_cache_visited == NULL) {
+ if (bucket_cache_visited == nullptr) {
bucket_cache_visited = new bool[area];
invalidate_cache = true;
}
@@ -638,16 +657,17 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era
invalidate_cache = true;
}
if (invalidate_cache) {
- for (int i = 0; i < area; ++i)
+ for (int i = 0; i < area; ++i) {
bucket_cache_visited[i] = false;
- bucket_cache = PoolVector<Vector2>();
+ }
+ bucket_cache = Vector<Vector2>();
bucket_cache_tile = prev_id;
bucket_cache_rect = r;
bucket_queue.clear();
}
}
- PoolVector<Vector2> points;
+ Vector<Vector2> points;
Vector<Vector2> non_preview_cache;
int count = 0;
int limit = 0;
@@ -661,24 +681,25 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era
bucket_queue.push_back(p_start);
while (bucket_queue.size()) {
-
Point2i n = bucket_queue.front()->get();
bucket_queue.pop_front();
- if (!r.has_point(n))
+ if (!r.has_point(n)) {
continue;
+ }
if (node->get_cell(n.x, n.y) == prev_id) {
-
if (preview) {
int loc = (n.x - r.position.x) + (n.y - r.position.y) * r.get_size().x;
- if (bucket_cache_visited[loc])
+ if (bucket_cache_visited[loc]) {
continue;
+ }
bucket_cache_visited[loc] = true;
bucket_cache.push_back(n);
} else {
- if (non_preview_cache.find(n) >= 0)
+ if (non_preview_cache.find(n) >= 0) {
continue;
+ }
points.push_back(n);
non_preview_cache.push_back(n);
}
@@ -698,10 +719,9 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era
return preview ? bucket_cache : points;
}
-void TileMapEditor::_fill_points(const PoolVector<Vector2> &p_points, const Dictionary &p_op) {
-
+void TileMapEditor::_fill_points(const Vector<Vector2> &p_points, const Dictionary &p_op) {
int len = p_points.size();
- PoolVector<Vector2>::Read pr = p_points.read();
+ const Vector2 *pr = p_points.ptr();
Vector<int> ids = p_op["id"];
bool xf = p_op["flip_h"];
@@ -712,32 +732,28 @@ void TileMapEditor::_fill_points(const PoolVector<Vector2> &p_points, const Dict
_set_cell(pr[i], ids, xf, yf, tr);
node->make_bitmask_area_dirty(pr[i]);
}
- if (!manual_autotile)
+ if (!manual_autotile) {
node->update_dirty_bitmask();
+ }
}
-void TileMapEditor::_erase_points(const PoolVector<Vector2> &p_points) {
-
+void TileMapEditor::_erase_points(const Vector<Vector2> &p_points) {
int len = p_points.size();
- PoolVector<Vector2>::Read pr = p_points.read();
+ const Vector2 *pr = p_points.ptr();
for (int i = 0; i < len; i++) {
-
_set_cell(pr[i], invalid_cell);
}
}
void TileMapEditor::_select(const Point2i &p_from, const Point2i &p_to) {
-
Point2i begin = p_from;
Point2i end = p_to;
if (begin.x > end.x) {
-
SWAP(begin.x, end.x);
}
if (begin.y > end.y) {
-
SWAP(begin.y, end.y);
}
@@ -748,23 +764,23 @@ void TileMapEditor::_select(const Point2i &p_from, const Point2i &p_to) {
}
void TileMapEditor::_erase_selection() {
- if (!selection_active)
+ if (!selection_active) {
return;
+ }
for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
-
_set_cell(Point2i(j, i), invalid_cell, false, false, false);
}
}
}
void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) {
+ Ref<Texture2D> t = node->get_tileset()->tile_get_texture(p_cell);
- Ref<Texture> t = node->get_tileset()->tile_get_texture(p_cell);
-
- if (t.is_null())
+ if (t.is_null()) {
return;
+ }
Vector2 tile_ofs = node->get_tileset()->tile_get_texture_offset(p_cell);
@@ -786,7 +802,6 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p
r.size = node->get_tileset()->autotile_get_size(p_cell);
r.position += (r.size + Vector2(spacing, spacing)) * offset;
}
- Size2 sc = p_xform.get_scale();
Size2 cell_size = node->get_cell_size();
bool centered_texture = node->is_centered_textures_enabled();
bool compatibility_mode_enabled = node->is_compatibility_mode_enabled();
@@ -801,11 +816,13 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p
if (compatibility_mode_enabled && !centered_texture) {
if (rect.size.y > rect.size.x) {
- if ((p_flip_h && (p_flip_v || p_transpose)) || (p_flip_v && !p_transpose))
+ if ((p_flip_h && (p_flip_v || p_transpose)) || (p_flip_v && !p_transpose)) {
tile_ofs.y += rect.size.y - rect.size.x;
+ }
} else if (rect.size.y < rect.size.x) {
- if ((p_flip_v && (p_flip_h || p_transpose)) || (p_flip_h && !p_transpose))
+ if ((p_flip_v && (p_flip_h || p_transpose)) || (p_flip_h && !p_transpose)) {
tile_ofs.x += rect.size.x - rect.size.y;
+ }
}
}
@@ -820,70 +837,70 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p
}
if (p_flip_h) {
- sc.x *= -1.0;
+ rect.size.x *= -1.0;
tile_ofs.x *= -1.0;
}
if (p_flip_v) {
- sc.y *= -1.0;
+ rect.size.y *= -1.0;
tile_ofs.y *= -1.0;
}
if (compatibility_mode_enabled && !centered_texture) {
if (node->get_tile_origin() == TileMap::TILE_ORIGIN_TOP_LEFT) {
-
rect.position += tile_ofs;
} else if (node->get_tile_origin() == TileMap::TILE_ORIGIN_BOTTOM_LEFT) {
-
rect.position += tile_ofs;
if (p_transpose) {
- if (p_flip_h)
+ if (p_flip_h) {
rect.position.x -= cell_size.x;
- else
+ } else {
rect.position.x += cell_size.x;
+ }
} else {
- if (p_flip_v)
+ if (p_flip_v) {
rect.position.y -= cell_size.y;
- else
+ } else {
rect.position.y += cell_size.y;
+ }
}
} else if (node->get_tile_origin() == TileMap::TILE_ORIGIN_CENTER) {
-
rect.position += tile_ofs;
- if (p_flip_h)
+ if (p_flip_h) {
rect.position.x -= cell_size.x / 2;
- else
+ } else {
rect.position.x += cell_size.x / 2;
+ }
- if (p_flip_v)
+ if (p_flip_v) {
rect.position.y -= cell_size.y / 2;
- else
+ } else {
rect.position.y += cell_size.y / 2;
+ }
}
} else {
rect.position += tile_ofs;
}
- rect.position = p_xform.xform(rect.position);
- rect.size *= sc;
-
Color modulate = node->get_tileset()->tile_get_modulate(p_cell);
modulate.a = 0.5;
+ Transform2D old_transform = p_viewport->get_viewport_transform();
+ p_viewport->draw_set_transform_matrix(p_xform); // Take into account TileMap transformation when displaying cell
if (r.has_no_area()) {
p_viewport->draw_texture_rect(t, rect, false, modulate, p_transpose);
} else {
p_viewport->draw_texture_rect_region(t, rect, r, modulate, p_transpose);
}
+ p_viewport->draw_set_transform_matrix(old_transform);
}
void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) {
-
- PoolVector<Vector2> points = _bucket_fill(p_point, false, true);
- PoolVector<Vector2>::Read pr = points.read();
+ Vector<Vector2> points = _bucket_fill(p_point, false, true);
+ const Vector2 *pr = points.ptr();
int len = points.size();
for (int i = 0; i < len; ++i) {
@@ -894,21 +911,19 @@ void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Po
void TileMapEditor::_clear_bucket_cache() {
if (bucket_cache_visited) {
delete[] bucket_cache_visited;
- bucket_cache_visited = NULL;
+ bucket_cache_visited = nullptr;
}
}
void TileMapEditor::_update_copydata() {
-
copydata.clear();
- if (!selection_active)
+ if (!selection_active) {
return;
+ }
for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
-
for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
-
TileData tcd;
tcd.cell = node->get_cell(j, i);
@@ -926,7 +941,6 @@ void TileMapEditor::_update_copydata() {
}
static inline Vector<Point2i> line(int x0, int x1, int y0, int y1) {
-
Vector<Point2i> points;
float dx = ABS(x1 - x0);
@@ -970,9 +984,9 @@ static inline Vector<Point2i> line(int x0, int x1, int y0, int y1) {
}
bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
-
- if (!node || !node->get_tileset().is_valid() || !node->is_visible_in_tree() || CanvasItemEditor::get_singleton()->get_current_tool() != CanvasItemEditor::TOOL_SELECT)
+ if (!node || !node->get_tileset().is_valid() || !node->is_visible_in_tree() || CanvasItemEditor::get_singleton()->get_current_tool() != CanvasItemEditor::TOOL_SELECT) {
return false;
+ }
Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
Transform2D xform_inv = xform.affine_inverse();
@@ -981,27 +995,14 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
if (mb.is_valid()) {
if (mb->get_button_index() == BUTTON_LEFT) {
-
if (mb->is_pressed()) {
-
- if (Input::get_singleton()->is_key_pressed(KEY_SPACE))
+ if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) {
return false; // Drag.
+ }
if (tool == TOOL_NONE) {
-
- if (mb->get_shift()) {
-
- if (mb->get_command())
- tool = TOOL_RECTANGLE_PAINT;
- else
- tool = TOOL_LINE_PAINT;
-
- selection_active = false;
- rectangle_begin = over_tile;
-
- _update_button_tool();
- return true;
- }
+ tool = TOOL_PAINTING;
+ _update_button_tool();
if (mb->get_command()) {
tool = TOOL_PICKING;
@@ -1010,26 +1011,24 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
return true;
}
-
- tool = TOOL_PAINTING;
- _update_button_tool();
}
- if (tool == TOOL_PAINTING) {
+ if (tool == TOOL_LINE_PAINT || tool == TOOL_RECTANGLE_PAINT) {
+ selection_active = false;
+ rectangle_begin = over_tile;
+ mouse_down = true;
+ } else if (tool == TOOL_PAINTING) {
Vector<int> ids = get_selected_tiles();
if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
-
tool = TOOL_PAINTING;
_start_undo(TTR("Paint TileMap"));
}
} else if (tool == TOOL_PICKING) {
-
_pick_tile(over_tile);
} else if (tool == TOOL_SELECTING) {
-
selection_active = true;
rectangle_begin = over_tile;
}
@@ -1040,27 +1039,25 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
} else {
// Mousebutton was released.
if (tool != TOOL_NONE) {
-
if (tool == TOOL_PAINTING) {
-
Vector<int> ids = get_selected_tiles();
if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
-
_set_cell(over_tile, ids, flip_h, flip_v, transpose);
_finish_undo();
paint_undo.clear();
}
} else if (tool == TOOL_LINE_PAINT) {
+ if (!mouse_down) {
+ return true;
+ }
Vector<int> ids = get_selected_tiles();
if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
-
_start_undo(TTR("Line Draw"));
for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
-
_set_cell(E->key(), ids, flip_h, flip_v, transpose);
}
_finish_undo();
@@ -1068,33 +1065,42 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
paint_undo.clear();
CanvasItemEditor::get_singleton()->update_viewport();
+
+ mouse_down = false;
+ return true;
}
+
+ mouse_down = false;
} else if (tool == TOOL_RECTANGLE_PAINT) {
+ if (!mouse_down) {
+ return true;
+ }
Vector<int> ids = get_selected_tiles();
if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
-
_start_undo(TTR("Rectangle Paint"));
for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
-
_set_cell(Point2i(j, i), ids, flip_h, flip_v, transpose);
}
}
_finish_undo();
CanvasItemEditor::get_singleton()->update_viewport();
+
+ mouse_down = false;
+ return true;
}
- } else if (tool == TOOL_PASTING) {
+ mouse_down = false;
+ } else if (tool == TOOL_PASTING) {
Point2 ofs = over_tile - rectangle.position;
Vector<int> ids;
_start_undo(TTR("Paste"));
ids.push_back(0);
for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
-
ids.write[0] = E->get().cell;
_set_cell(E->get().pos + ofs, ids, E->get().flip_h, E->get().flip_v, E->get().transpose, E->get().autotile_coord);
}
@@ -1104,15 +1110,14 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
return true; // We want to keep the Pasting tool.
} else if (tool == TOOL_SELECTING) {
-
CanvasItemEditor::get_singleton()->update_viewport();
} else if (tool == TOOL_BUCKET) {
+ Vector<Vector2> points = _bucket_fill(over_tile);
- PoolVector<Vector2> points = _bucket_fill(over_tile);
-
- if (points.size() == 0)
+ if (points.size() == 0) {
return false;
+ }
_start_undo(TTR("Bucket Fill"));
@@ -1140,11 +1145,8 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
}
}
} else if (mb->get_button_index() == BUTTON_RIGHT) {
-
if (mb->is_pressed()) {
-
if (tool == TOOL_SELECTING || selection_active) {
-
tool = TOOL_NONE;
selection_active = false;
@@ -1155,8 +1157,29 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
}
if (tool == TOOL_PASTING) {
-
tool = TOOL_NONE;
+
+ CanvasItemEditor::get_singleton()->update_viewport();
+
+ _update_button_tool();
+ return true;
+ }
+
+ if (tool == TOOL_LINE_PAINT) {
+ tool = TOOL_LINE_ERASE;
+ mouse_down = true;
+ rectangle_begin = over_tile;
+
+ CanvasItemEditor::get_singleton()->update_viewport();
+
+ _update_button_tool();
+ return true;
+ }
+
+ if (tool == TOOL_RECTANGLE_PAINT) {
+ tool = TOOL_RECTANGLE_ERASE;
+ mouse_down = true;
+ rectangle_begin = over_tile;
copydata.clear();
CanvasItemEditor::get_singleton()->update_viewport();
@@ -1166,48 +1189,80 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
}
if (tool == TOOL_NONE) {
-
paint_undo.clear();
Point2 local = node->world_to_map(xform_inv.xform(mb->get_position()));
_start_undo(TTR("Erase TileMap"));
+ tool = TOOL_ERASING;
+ _set_cell(local, invalid_cell);
+
+ _update_button_tool();
+ return true;
+ }
+
+ } else {
+ if (tool == TOOL_LINE_ERASE) {
+ if (!mouse_down) {
+ return true;
+ }
+
+ tool = TOOL_LINE_PAINT;
+ _update_button_tool();
- if (mb->get_shift()) {
- if (mb->get_command())
- tool = TOOL_RECTANGLE_ERASE;
- else
- tool = TOOL_LINE_ERASE;
+ Vector<int> ids = get_selected_tiles();
+
+ if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
+ _start_undo(TTR("Line Erase"));
+ for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
+ _set_cell(E->key(), invalid_cell, flip_h, flip_v, transpose);
+ }
+ _finish_undo();
+ paint_undo.clear();
- selection_active = false;
- rectangle_begin = local;
- } else {
+ CanvasItemEditor::get_singleton()->update_viewport();
- tool = TOOL_ERASING;
+ mouse_down = false;
+ return true;
+ }
- _set_cell(local, invalid_cell);
+ mouse_down = false;
+ } else if (tool == TOOL_RECTANGLE_ERASE) {
+ if (!mouse_down) {
+ return true;
}
+ tool = TOOL_RECTANGLE_PAINT;
_update_button_tool();
- return true;
- }
- } else {
- if (tool == TOOL_ERASING || tool == TOOL_RECTANGLE_ERASE || tool == TOOL_LINE_ERASE) {
+ Vector<int> ids = get_selected_tiles();
- _finish_undo();
+ if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
+ _start_undo(TTR("Rectangle Erase"));
+ for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
+ for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
+ _set_cell(Point2i(j, i), invalid_cell, flip_h, flip_v, transpose);
+ }
+ }
+ _finish_undo();
+ paint_undo.clear();
- if (tool == TOOL_RECTANGLE_ERASE || tool == TOOL_LINE_ERASE) {
CanvasItemEditor::get_singleton()->update_viewport();
+
+ mouse_down = false;
+ return true;
}
- tool = TOOL_NONE;
+ mouse_down = false;
+ tool = TOOL_RECTANGLE_PAINT;
+ }
+ if (tool == TOOL_ERASING) {
+ tool = TOOL_NONE;
_update_button_tool();
- return true;
+ return true;
} else if (tool == TOOL_BUCKET) {
-
Vector<int> ids;
ids.push_back(node->get_cell(over_tile.x, over_tile.y));
Dictionary pop;
@@ -1216,10 +1271,11 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
pop["flip_v"] = node->is_cell_y_flipped(over_tile.x, over_tile.y);
pop["transpose"] = node->is_cell_transposed(over_tile.x, over_tile.y);
- PoolVector<Vector2> points = _bucket_fill(over_tile, true);
+ Vector<Vector2> points = _bucket_fill(over_tile, true);
- if (points.size() == 0)
+ if (points.size() == 0) {
return false;
+ }
undo_redo->create_action(TTR("Bucket Fill"));
@@ -1235,12 +1291,10 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid()) {
-
Point2i new_over_tile = node->world_to_map(xform_inv.xform(mm->get_position()));
Point2i old_over_tile = over_tile;
if (new_over_tile != over_tile) {
-
over_tile = new_over_tile;
CanvasItemEditor::get_singleton()->update_viewport();
}
@@ -1248,20 +1302,19 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
int tile_under = node->get_cell(over_tile.x, over_tile.y);
String tile_name = "none";
- if (node->get_tileset()->has_tile(tile_under))
+ if (node->get_tileset()->has_tile(tile_under)) {
tile_name = node->get_tileset()->tile_get_name(tile_under);
+ }
tile_info->show();
tile_info->set_text(String::num(over_tile.x) + ", " + String::num(over_tile.y) + " [" + tile_name + "]");
if (tool == TOOL_PAINTING) {
-
// Paint using bresenham line to prevent holes in painting if the user moves fast.
Vector<Point2i> points = line(old_over_tile.x, over_tile.x, old_over_tile.y, over_tile.y);
Vector<int> ids = get_selected_tiles();
for (int i = 0; i < points.size(); ++i) {
-
Point2i pos = points[i];
if (!paint_undo.has(pos)) {
@@ -1275,13 +1328,11 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
}
if (tool == TOOL_ERASING) {
-
// Erase using bresenham line to prevent holes in painting if the user moves fast.
Vector<Point2i> points = line(old_over_tile.x, over_tile.x, old_over_tile.y, over_tile.y);
for (int i = 0; i < points.size(); ++i) {
-
Point2i pos = points[i];
_set_cell(pos, invalid_cell);
@@ -1291,23 +1342,23 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
}
if (tool == TOOL_SELECTING) {
-
_select(rectangle_begin, over_tile);
return true;
}
if (tool == TOOL_LINE_PAINT || tool == TOOL_LINE_ERASE) {
-
Vector<int> ids = get_selected_tiles();
Vector<int> tmp_cell;
bool erasing = (tool == TOOL_LINE_ERASE);
+ if (!mouse_down) {
+ return true;
+ }
+
tmp_cell.push_back(0);
if (erasing && paint_undo.size()) {
-
for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
-
tmp_cell.write[0] = E->get().idx;
_set_cell(E->key(), tmp_cell, E->get().xf, E->get().yf, E->get().tr);
}
@@ -1316,15 +1367,14 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
paint_undo.clear();
if (ids.size() > 0 && ids[0] != TileMap::INVALID_CELL) {
-
Vector<Point2i> points = line(rectangle_begin.x, over_tile.x, rectangle_begin.y, over_tile.y);
for (int i = 0; i < points.size(); i++) {
-
paint_undo[points[i]] = _get_op_from_cell(points[i]);
- if (erasing)
+ if (erasing) {
_set_cell(points[i], invalid_cell);
+ }
}
CanvasItemEditor::get_singleton()->update_viewport();
@@ -1333,18 +1383,27 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
return true;
}
if (tool == TOOL_RECTANGLE_PAINT || tool == TOOL_RECTANGLE_ERASE) {
-
Vector<int> tmp_cell;
tmp_cell.push_back(0);
- _select(rectangle_begin, over_tile);
+ Point2i end_tile = over_tile;
- if (tool == TOOL_RECTANGLE_ERASE) {
+ if (!mouse_down) {
+ return true;
+ }
- if (paint_undo.size()) {
+ if (mm->get_shift()) {
+ int size = fmax(ABS(end_tile.x - rectangle_begin.x), ABS(end_tile.y - rectangle_begin.y));
+ int xDirection = MAX(MIN(end_tile.x - rectangle_begin.x, 1), -1);
+ int yDirection = MAX(MIN(end_tile.y - rectangle_begin.y, 1), -1);
+ end_tile = rectangle_begin + Point2i(xDirection * size, yDirection * size);
+ }
- for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
+ _select(rectangle_begin, end_tile);
+ if (tool == TOOL_RECTANGLE_ERASE) {
+ if (paint_undo.size()) {
+ for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
tmp_cell.write[0] = E->get().idx;
_set_cell(E->key(), tmp_cell, E->get().xf, E->get().yf, E->get().tr);
}
@@ -1354,7 +1413,6 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
-
Point2i tile = Point2i(j, i);
paint_undo[tile] = _get_op_from_cell(tile);
@@ -1366,7 +1424,6 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
return true;
}
if (tool == TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) {
-
_pick_tile(over_tile);
return true;
@@ -1376,8 +1433,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_pressed()) {
-
- if (last_tool == TOOL_NONE && tool == TOOL_PICKING && k->get_scancode() == KEY_SHIFT && k->get_command()) {
+ if (last_tool == TOOL_NONE && tool == TOOL_PICKING && k->get_keycode() == KEY_SHIFT && k->get_command()) {
// trying to draw a rectangle with the painting tool, so change to the correct tool
tool = last_tool;
@@ -1385,12 +1441,12 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
_update_button_tool();
}
- if (k->get_scancode() == KEY_ESCAPE) {
-
- if (tool == TOOL_PASTING)
+ if (k->get_keycode() == KEY_ESCAPE) {
+ if (tool == TOOL_PASTING) {
copydata.clear();
- else if (tool == TOOL_SELECTING || selection_active)
+ } else if (tool == TOOL_SELECTING || selection_active) {
selection_active = false;
+ }
tool = TOOL_NONE;
@@ -1414,6 +1470,20 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
_update_button_tool();
return true;
}
+ if (ED_IS_SHORTCUT("tile_map_editor/line_fill", p_event)) {
+ tool = TOOL_LINE_PAINT;
+ CanvasItemEditor::get_singleton()->update_viewport();
+
+ _update_button_tool();
+ return true;
+ }
+ if (ED_IS_SHORTCUT("tile_map_editor/rectangle_fill", p_event)) {
+ tool = TOOL_RECTANGLE_PAINT;
+ CanvasItemEditor::get_singleton()->update_viewport();
+
+ _update_button_tool();
+ return true;
+ }
if (ED_IS_SHORTCUT("tile_map_editor/bucket_fill", p_event)) {
tool = TOOL_BUCKET;
CanvasItemEditor::get_singleton()->update_viewport();
@@ -1505,18 +1575,15 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
} else if (k.is_valid()) { // Release event.
if (tool == TOOL_NONE) {
-
- if (k->get_scancode() == KEY_SHIFT && k->get_command()) {
-
+ if (k->get_keycode() == KEY_SHIFT && k->get_command()) {
tool = TOOL_PICKING;
_update_button_tool();
}
} else if (tool == TOOL_PICKING) {
-
#ifdef APPLE_STYLE_KEYS
- if (k->get_scancode() == KEY_META) {
+ if (k->get_keycode() == KEY_META) {
#else
- if (k->get_scancode() == KEY_CONTROL) {
+ if (k->get_keycode() == KEY_CONTROL) {
#endif
// Go back to that last tool if KEY_CONTROL was released.
tool = last_tool;
@@ -1530,9 +1597,9 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
}
void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
- if (!node || CanvasItemEditor::get_singleton()->get_current_tool() != CanvasItemEditor::TOOL_SELECT)
+ if (!node || CanvasItemEditor::get_singleton()->get_current_tool() != CanvasItemEditor::TOOL_SELECT) {
return;
+ }
Transform2D cell_xf = node->get_cell_transform();
Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
@@ -1548,27 +1615,23 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
Rect2i si = aabb.grow(1.0);
if (node->get_half_offset() != TileMap::HALF_OFFSET_X && node->get_half_offset() != TileMap::HALF_OFFSET_NEGATIVE_X) {
-
int max_lines = 2000; //avoid crash if size too small
for (int i = (si.position.x) - 1; i <= (si.position.x + si.size.x); i++) {
-
Vector2 from = xform.xform(node->map_to_world(Vector2(i, si.position.y)));
Vector2 to = xform.xform(node->map_to_world(Vector2(i, si.position.y + si.size.y + 1)));
Color col = i == 0 ? Color(1, 0.8, 0.2, 0.5) : Color(1, 0.3, 0.1, 0.2);
p_overlay->draw_line(from, to, col, 1);
- if (max_lines-- == 0)
+ if (max_lines-- == 0) {
break;
+ }
}
} else {
-
int max_lines = 10000; //avoid crash if size too small
for (int i = (si.position.x) - 1; i <= (si.position.x + si.size.x); i++) {
-
for (int j = (si.position.y) - 1; j <= (si.position.y + si.size.y); j++) {
-
Vector2 ofs;
if (ABS(j) & 1) {
ofs = cell_xf[0] * (node->get_half_offset() == TileMap::HALF_OFFSET_X ? 0.5 : -0.5);
@@ -1580,35 +1643,33 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
Color col = i == 0 ? Color(1, 0.8, 0.2, 0.5) : Color(1, 0.3, 0.1, 0.2);
p_overlay->draw_line(from, to, col, 1);
- if (--max_lines == 0)
+ if (--max_lines == 0) {
break;
+ }
}
- if (max_lines == 0)
+ if (max_lines == 0) {
break;
+ }
}
}
int max_lines = 10000; //avoid crash if size too small
if (node->get_half_offset() != TileMap::HALF_OFFSET_Y && node->get_half_offset() != TileMap::HALF_OFFSET_NEGATIVE_Y) {
-
for (int i = (si.position.y) - 1; i <= (si.position.y + si.size.y); i++) {
-
Vector2 from = xform.xform(node->map_to_world(Vector2(si.position.x, i)));
Vector2 to = xform.xform(node->map_to_world(Vector2(si.position.x + si.size.x + 1, i)));
Color col = i == 0 ? Color(1, 0.8, 0.2, 0.5) : Color(1, 0.3, 0.1, 0.2);
p_overlay->draw_line(from, to, col, 1);
- if (max_lines-- == 0)
+ if (max_lines-- == 0) {
break;
+ }
}
} else {
-
for (int i = (si.position.y) - 1; i <= (si.position.y + si.size.y); i++) {
-
for (int j = (si.position.x) - 1; j <= (si.position.x + si.size.x); j++) {
-
Vector2 ofs;
if (ABS(j) & 1) {
ofs = cell_xf[1] * (node->get_half_offset() == TileMap::HALF_OFFSET_Y ? 0.5 : -0.5);
@@ -1620,17 +1681,18 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
Color col = i == 0 ? Color(1, 0.8, 0.2, 0.5) : Color(1, 0.3, 0.1, 0.2);
p_overlay->draw_line(from, to, col, 1);
- if (--max_lines == 0)
+ if (--max_lines == 0) {
break;
+ }
}
- if (max_lines == 0)
+ if (max_lines == 0) {
break;
+ }
}
}
}
if (selection_active) {
-
Vector<Vector2> points;
points.push_back(xform.xform(node->map_to_world((rectangle.position))));
points.push_back(xform.xform(node->map_to_world((rectangle.position + Point2(rectangle.size.x + 1, 0)))));
@@ -1641,7 +1703,6 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
}
if (mouse_over && node->get_tileset().is_valid()) {
-
Vector2 endpoints[4] = {
node->map_to_world(over_tile, true),
node->map_to_world((over_tile + Point2(1, 0)), true),
@@ -1650,24 +1711,30 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
};
for (int i = 0; i < 4; i++) {
- if (node->get_half_offset() == TileMap::HALF_OFFSET_X && ABS(over_tile.y) & 1)
+ if (node->get_half_offset() == TileMap::HALF_OFFSET_X && ABS(over_tile.y) & 1) {
endpoints[i] += cell_xf[0] * 0.5;
- if (node->get_half_offset() == TileMap::HALF_OFFSET_NEGATIVE_X && ABS(over_tile.y) & 1)
+ }
+ if (node->get_half_offset() == TileMap::HALF_OFFSET_NEGATIVE_X && ABS(over_tile.y) & 1) {
endpoints[i] += cell_xf[0] * -0.5;
- if (node->get_half_offset() == TileMap::HALF_OFFSET_Y && ABS(over_tile.x) & 1)
+ }
+ if (node->get_half_offset() == TileMap::HALF_OFFSET_Y && ABS(over_tile.x) & 1) {
endpoints[i] += cell_xf[1] * 0.5;
- if (node->get_half_offset() == TileMap::HALF_OFFSET_NEGATIVE_Y && ABS(over_tile.x) & 1)
+ }
+ if (node->get_half_offset() == TileMap::HALF_OFFSET_NEGATIVE_Y && ABS(over_tile.x) & 1) {
endpoints[i] += cell_xf[1] * -0.5;
+ }
endpoints[i] = xform.xform(endpoints[i]);
}
Color col;
- if (node->get_cell(over_tile.x, over_tile.y) != TileMap::INVALID_CELL)
+ if (node->get_cell(over_tile.x, over_tile.y) != TileMap::INVALID_CELL) {
col = Color(0.2, 0.8, 1.0, 0.8);
- else
+ } else {
col = Color(1.0, 0.4, 0.2, 0.8);
+ }
- for (int i = 0; i < 4; i++)
+ for (int i = 0; i < 4; i++) {
p_overlay->draw_line(endpoints[i], endpoints[(i + 1) % 4], col, 2);
+ }
bool bucket_preview = EditorSettings::get_singleton()->get("editors/tile_map/bucket_fill_preview");
if (tool == TOOL_SELECTING || tool == TOOL_PICKING || !bucket_preview) {
@@ -1675,49 +1742,57 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
}
if (tool == TOOL_LINE_PAINT) {
+ if (!mouse_down) {
+ return;
+ }
- if (paint_undo.empty())
+ if (paint_undo.empty()) {
return;
+ }
Vector<int> ids = get_selected_tiles();
- if (ids.size() == 1 && ids[0] == TileMap::INVALID_CELL)
+ if (ids.size() == 1 && ids[0] == TileMap::INVALID_CELL) {
return;
+ }
for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
-
_draw_cell(p_overlay, ids[0], E->key(), flip_h, flip_v, transpose, autotile_coord, xform);
}
} else if (tool == TOOL_RECTANGLE_PAINT) {
+ if (!mouse_down) {
+ return;
+ }
Vector<int> ids = get_selected_tiles();
- if (ids.size() == 1 && ids[0] == TileMap::INVALID_CELL)
+ if (ids.size() == 1 && ids[0] == TileMap::INVALID_CELL) {
return;
+ }
for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
-
_draw_cell(p_overlay, ids[0], Point2i(j, i), flip_h, flip_v, transpose, autotile_coord, xform);
}
}
} else if (tool == TOOL_PASTING) {
-
- if (copydata.empty())
+ if (copydata.empty()) {
return;
+ }
Ref<TileSet> ts = node->get_tileset();
- if (ts.is_null())
+ if (ts.is_null()) {
return;
+ }
Point2 ofs = over_tile - rectangle.position;
for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
-
- if (!ts->has_tile(E->get().cell))
+ if (!ts->has_tile(E->get().cell)) {
continue;
+ }
TileData tcd = E->get();
@@ -1736,16 +1811,15 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
p_overlay->draw_colored_polygon(points, Color(0.2, 1.0, 0.8, 0.2));
} else if (tool == TOOL_BUCKET) {
-
Vector<int> tiles = get_selected_tiles();
_draw_fill_preview(p_overlay, tiles[0], over_tile, flip_h, flip_v, transpose, autotile_coord, xform);
} else {
-
Vector<int> st = get_selected_tiles();
- if (st.size() == 1 && st[0] == TileMap::INVALID_CELL)
+ if (st.size() == 1 && st[0] == TileMap::INVALID_CELL) {
return;
+ }
_draw_cell(p_overlay, st[0], over_tile, flip_h, flip_v, transpose, autotile_coord, xform);
}
@@ -1753,44 +1827,47 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
}
void TileMapEditor::edit(Node *p_tile_map) {
-
search_box->set_text("");
if (!canvas_item_editor_viewport) {
canvas_item_editor_viewport = CanvasItemEditor::get_singleton()->get_viewport_control();
}
- if (node)
- node->disconnect("settings_changed", this, "_tileset_settings_changed");
+ if (node) {
+ node->disconnect("settings_changed", callable_mp(this, &TileMapEditor::_tileset_settings_changed));
+ }
if (p_tile_map) {
-
node = Object::cast_to<TileMap>(p_tile_map);
- if (!canvas_item_editor_viewport->is_connected("mouse_entered", this, "_canvas_mouse_enter"))
- canvas_item_editor_viewport->connect("mouse_entered", this, "_canvas_mouse_enter");
- if (!canvas_item_editor_viewport->is_connected("mouse_exited", this, "_canvas_mouse_exit"))
- canvas_item_editor_viewport->connect("mouse_exited", this, "_canvas_mouse_exit");
+ if (!canvas_item_editor_viewport->is_connected("mouse_entered", callable_mp(this, &TileMapEditor::_canvas_mouse_enter))) {
+ canvas_item_editor_viewport->connect("mouse_entered", callable_mp(this, &TileMapEditor::_canvas_mouse_enter));
+ }
+ if (!canvas_item_editor_viewport->is_connected("mouse_exited", callable_mp(this, &TileMapEditor::_canvas_mouse_exit))) {
+ canvas_item_editor_viewport->connect("mouse_exited", callable_mp(this, &TileMapEditor::_canvas_mouse_exit));
+ }
_update_palette();
} else {
- node = NULL;
+ node = nullptr;
- if (canvas_item_editor_viewport->is_connected("mouse_entered", this, "_canvas_mouse_enter"))
- canvas_item_editor_viewport->disconnect("mouse_entered", this, "_canvas_mouse_enter");
- if (canvas_item_editor_viewport->is_connected("mouse_exited", this, "_canvas_mouse_exit"))
- canvas_item_editor_viewport->disconnect("mouse_exited", this, "_canvas_mouse_exit");
+ if (canvas_item_editor_viewport->is_connected("mouse_entered", callable_mp(this, &TileMapEditor::_canvas_mouse_enter))) {
+ canvas_item_editor_viewport->disconnect("mouse_entered", callable_mp(this, &TileMapEditor::_canvas_mouse_enter));
+ }
+ if (canvas_item_editor_viewport->is_connected("mouse_exited", callable_mp(this, &TileMapEditor::_canvas_mouse_exit))) {
+ canvas_item_editor_viewport->disconnect("mouse_exited", callable_mp(this, &TileMapEditor::_canvas_mouse_exit));
+ }
_update_palette();
}
- if (node)
- node->connect("settings_changed", this, "_tileset_settings_changed");
+ if (node) {
+ node->connect("settings_changed", callable_mp(this, &TileMapEditor::_tileset_settings_changed));
+ }
_clear_bucket_cache();
}
void TileMapEditor::_tileset_settings_changed() {
-
_update_palette();
CanvasItemEditor::get_singleton()->update_viewport();
}
@@ -1804,40 +1881,23 @@ void TileMapEditor::_icon_size_changed(float p_value) {
}
void TileMapEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_manual_toggled"), &TileMapEditor::_manual_toggled);
- ClassDB::bind_method(D_METHOD("_priority_toggled"), &TileMapEditor::_priority_toggled);
- ClassDB::bind_method(D_METHOD("_text_entered"), &TileMapEditor::_text_entered);
- ClassDB::bind_method(D_METHOD("_text_changed"), &TileMapEditor::_text_changed);
- ClassDB::bind_method(D_METHOD("_sbox_input"), &TileMapEditor::_sbox_input);
- ClassDB::bind_method(D_METHOD("_button_tool_select"), &TileMapEditor::_button_tool_select);
- ClassDB::bind_method(D_METHOD("_menu_option"), &TileMapEditor::_menu_option);
- ClassDB::bind_method(D_METHOD("_canvas_mouse_enter"), &TileMapEditor::_canvas_mouse_enter);
- ClassDB::bind_method(D_METHOD("_canvas_mouse_exit"), &TileMapEditor::_canvas_mouse_exit);
- ClassDB::bind_method(D_METHOD("_tileset_settings_changed"), &TileMapEditor::_tileset_settings_changed);
- ClassDB::bind_method(D_METHOD("_rotate"), &TileMapEditor::_rotate);
- ClassDB::bind_method(D_METHOD("_flip_horizontal"), &TileMapEditor::_flip_horizontal);
- ClassDB::bind_method(D_METHOD("_flip_vertical"), &TileMapEditor::_flip_vertical);
- ClassDB::bind_method(D_METHOD("_clear_transform"), &TileMapEditor::_clear_transform);
- ClassDB::bind_method(D_METHOD("_palette_selected"), &TileMapEditor::_palette_selected);
- ClassDB::bind_method(D_METHOD("_palette_multi_selected"), &TileMapEditor::_palette_multi_selected);
-
ClassDB::bind_method(D_METHOD("_fill_points"), &TileMapEditor::_fill_points);
ClassDB::bind_method(D_METHOD("_erase_points"), &TileMapEditor::_erase_points);
-
- ClassDB::bind_method(D_METHOD("_icon_size_changed"), &TileMapEditor::_icon_size_changed);
}
TileMapEditor::CellOp TileMapEditor::_get_op_from_cell(const Point2i &p_pos) {
CellOp op;
op.idx = node->get_cell(p_pos.x, p_pos.y);
if (op.idx != TileMap::INVALID_CELL) {
- if (node->is_cell_x_flipped(p_pos.x, p_pos.y))
+ if (node->is_cell_x_flipped(p_pos.x, p_pos.y)) {
op.xf = true;
- if (node->is_cell_y_flipped(p_pos.x, p_pos.y))
+ }
+ if (node->is_cell_y_flipped(p_pos.x, p_pos.y)) {
op.yf = true;
- if (node->is_cell_transposed(p_pos.x, p_pos.y))
+ }
+ if (node->is_cell_transposed(p_pos.x, p_pos.y)) {
op.tr = true;
+ }
op.ac = node->get_cell_autotile_coord(p_pos.x, p_pos.y);
}
return op;
@@ -1907,25 +1967,25 @@ void TileMapEditor::_clear_transform() {
}
TileMapEditor::TileMapEditor(EditorNode *p_editor) {
-
- node = NULL;
+ node = nullptr;
manual_autotile = false;
priority_atlastile = false;
manual_position = Vector2(0, 0);
- canvas_item_editor_viewport = NULL;
+ canvas_item_editor_viewport = nullptr;
editor = p_editor;
undo_redo = EditorNode::get_undo_redo();
tool = TOOL_NONE;
selection_active = false;
mouse_over = false;
+ mouse_down = false;
flip_h = false;
flip_v = false;
transpose = false;
bucket_cache_tile = -1;
- bucket_cache_visited = NULL;
+ bucket_cache_visited = nullptr;
invalid_cell.resize(1);
invalid_cell.write[0] = TileMap::INVALID_CELL;
@@ -1939,20 +1999,20 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
manual_button = memnew(CheckBox);
manual_button->set_text(TTR("Disable Autotile"));
- manual_button->connect("toggled", this, "_manual_toggled");
+ manual_button->connect("toggled", callable_mp(this, &TileMapEditor::_manual_toggled));
add_child(manual_button);
priority_button = memnew(CheckBox);
priority_button->set_text(TTR("Enable Priority"));
- priority_button->connect("toggled", this, "_priority_toggled");
+ priority_button->connect("toggled", callable_mp(this, &TileMapEditor::_priority_toggled));
add_child(priority_button);
search_box = memnew(LineEdit);
search_box->set_placeholder(TTR("Filter tiles"));
search_box->set_h_size_flags(SIZE_EXPAND_FILL);
- search_box->connect("text_entered", this, "_text_entered");
- search_box->connect("text_changed", this, "_text_changed");
- search_box->connect("gui_input", this, "_sbox_input");
+ search_box->connect("text_entered", callable_mp(this, &TileMapEditor::_text_entered));
+ search_box->connect("text_changed", callable_mp(this, &TileMapEditor::_text_changed));
+ search_box->connect("gui_input", callable_mp(this, &TileMapEditor::_sbox_input));
add_child(search_box);
size_slider = memnew(HSlider);
@@ -1961,7 +2021,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
size_slider->set_max(4.0f);
size_slider->set_step(0.1f);
size_slider->set_value(1.0f);
- size_slider->connect("value_changed", this, "_icon_size_changed");
+ size_slider->connect("value_changed", callable_mp(this, &TileMapEditor::_icon_size_changed));
add_child(size_slider);
int mw = EDITOR_DEF("editors/tile_map/palette_min_width", 80);
@@ -1979,9 +2039,10 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
palette->set_icon_mode(ItemList::ICON_MODE_TOP);
palette->set_max_text_lines(2);
palette->set_select_mode(ItemList::SELECT_MULTI);
- palette->add_constant_override("vseparation", 8 * EDSCALE);
- palette->connect("item_selected", this, "_palette_selected");
- palette->connect("multi_selected", this, "_palette_multi_selected");
+ palette->add_theme_constant_override("vseparation", 8 * EDSCALE);
+ palette->connect("item_selected", callable_mp(this, &TileMapEditor::_palette_selected));
+ palette->connect("multi_selected", callable_mp(this, &TileMapEditor::_palette_multi_selected));
+ palette->connect("gui_input", callable_mp(this, &TileMapEditor::_palette_input));
palette_container->add_child(palette);
// Add message for when no texture is selected.
@@ -2012,28 +2073,48 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
toolbar->add_child(memnew(VSeparator));
// Tools.
- paint_button = memnew(ToolButton);
+ paint_button = memnew(Button);
+ paint_button->set_flat(true);
paint_button->set_shortcut(ED_SHORTCUT("tile_map_editor/paint_tile", TTR("Paint Tile"), KEY_P));
- paint_button->set_tooltip(TTR("Shift+LMB: Line Draw\nShift+Ctrl+LMB: Rectangle Paint"));
- paint_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_NONE));
+ paint_button->set_tooltip(TTR("RMB: Erase"));
+ paint_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_NONE));
paint_button->set_toggle_mode(true);
toolbar->add_child(paint_button);
- bucket_fill_button = memnew(ToolButton);
- bucket_fill_button->set_shortcut(ED_SHORTCUT("tile_map_editor/bucket_fill", TTR("Bucket Fill"), KEY_G));
- bucket_fill_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_BUCKET));
+ line_button = memnew(Button);
+ line_button->set_flat(true);
+ line_button->set_shortcut(ED_SHORTCUT("tile_map_editor/line_fill", TTR("Line Fill"), KEY_L));
+ line_button->set_tooltip(TTR("RMB: Erase"));
+ line_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_LINE_PAINT));
+ line_button->set_toggle_mode(true);
+ toolbar->add_child(line_button);
+
+ rectangle_button = memnew(Button);
+ rectangle_button->set_flat(true);
+ rectangle_button->set_shortcut(ED_SHORTCUT("tile_map_editor/rectangle_fill", TTR("Rectangle Fill"), KEY_O));
+ rectangle_button->set_tooltip(TTR("Shift+LMB: Keep 1:1 proporsions\nRMB: Erase"));
+ rectangle_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_RECTANGLE_PAINT));
+ rectangle_button->set_toggle_mode(true);
+ toolbar->add_child(rectangle_button);
+
+ bucket_fill_button = memnew(Button);
+ bucket_fill_button->set_flat(true);
+ bucket_fill_button->set_shortcut(ED_SHORTCUT("tile_map_editor/bucket_fill", TTR("Bucket Fill"), KEY_B));
+ bucket_fill_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_BUCKET));
bucket_fill_button->set_toggle_mode(true);
toolbar->add_child(bucket_fill_button);
- picker_button = memnew(ToolButton);
- picker_button->set_shortcut(ED_SHORTCUT("tile_map_editor/pick_tile", TTR("Pick Tile"), KEY_CONTROL));
- picker_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_PICKING));
+ picker_button = memnew(Button);
+ picker_button->set_flat(true);
+ picker_button->set_shortcut(ED_SHORTCUT("tile_map_editor/pick_tile", TTR("Pick Tile"), KEY_I));
+ picker_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_PICKING));
picker_button->set_toggle_mode(true);
toolbar->add_child(picker_button);
- select_button = memnew(ToolButton);
- select_button->set_shortcut(ED_SHORTCUT("tile_map_editor/select", TTR("Select"), KEY_MASK_CMD + KEY_B));
- select_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_SELECTING));
+ select_button = memnew(Button);
+ select_button->set_flat(true);
+ select_button->set_shortcut(ED_SHORTCUT("tile_map_editor/select", TTR("Select"), KEY_M));
+ select_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_SELECTING));
select_button->set_toggle_mode(true);
toolbar->add_child(select_button);
@@ -2050,7 +2131,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
tile_info = memnew(Label);
tile_info->set_modulate(Color(1, 1, 1, 0.8));
tile_info->set_mouse_filter(MOUSE_FILTER_IGNORE);
- tile_info->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("main", "EditorFonts"));
+ tile_info->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("main", "EditorFonts"));
// The tile info is only displayed after a tile has been hovered.
tile_info->hide();
CanvasItemEditor::get_singleton()->add_control_to_info_overlay(tile_info);
@@ -2058,7 +2139,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
// Menu.
options = memnew(MenuButton);
options->set_text("TileMap");
- options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("TileMap", "EditorIcons"));
+ options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("TileMap", "EditorIcons"));
options->set_process_unhandled_key_input(false);
toolbar_right->add_child(options);
@@ -2068,40 +2149,45 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
p->add_shortcut(ED_GET_SHORTCUT("tile_map_editor/erase_selection"), OPTION_ERASE_SELECTION);
p->add_separator();
p->add_item(TTR("Fix Invalid Tiles"), OPTION_FIX_INVALID);
- p->connect("id_pressed", this, "_menu_option");
+ p->connect("id_pressed", callable_mp(this, &TileMapEditor::_menu_option));
- rotate_left_button = memnew(ToolButton);
+ rotate_left_button = memnew(Button);
+ rotate_left_button->set_flat(true);
rotate_left_button->set_tooltip(TTR("Rotate Left"));
rotate_left_button->set_focus_mode(FOCUS_NONE);
- rotate_left_button->connect("pressed", this, "_rotate", varray(-1));
+ rotate_left_button->connect("pressed", callable_mp(this, &TileMapEditor::_rotate), varray(-1));
rotate_left_button->set_shortcut(ED_SHORTCUT("tile_map_editor/rotate_left", TTR("Rotate Left"), KEY_A));
tool_hb->add_child(rotate_left_button);
- rotate_right_button = memnew(ToolButton);
+ rotate_right_button = memnew(Button);
+ rotate_right_button->set_flat(true);
rotate_right_button->set_tooltip(TTR("Rotate Right"));
rotate_right_button->set_focus_mode(FOCUS_NONE);
- rotate_right_button->connect("pressed", this, "_rotate", varray(1));
+ rotate_right_button->connect("pressed", callable_mp(this, &TileMapEditor::_rotate), varray(1));
rotate_right_button->set_shortcut(ED_SHORTCUT("tile_map_editor/rotate_right", TTR("Rotate Right"), KEY_S));
tool_hb->add_child(rotate_right_button);
- flip_horizontal_button = memnew(ToolButton);
+ flip_horizontal_button = memnew(Button);
+ flip_horizontal_button->set_flat(true);
flip_horizontal_button->set_tooltip(TTR("Flip Horizontally"));
flip_horizontal_button->set_focus_mode(FOCUS_NONE);
- flip_horizontal_button->connect("pressed", this, "_flip_horizontal");
+ flip_horizontal_button->connect("pressed", callable_mp(this, &TileMapEditor::_flip_horizontal));
flip_horizontal_button->set_shortcut(ED_SHORTCUT("tile_map_editor/flip_horizontal", TTR("Flip Horizontally"), KEY_X));
tool_hb->add_child(flip_horizontal_button);
- flip_vertical_button = memnew(ToolButton);
+ flip_vertical_button = memnew(Button);
+ flip_vertical_button->set_flat(true);
flip_vertical_button->set_tooltip(TTR("Flip Vertically"));
flip_vertical_button->set_focus_mode(FOCUS_NONE);
- flip_vertical_button->connect("pressed", this, "_flip_vertical");
+ flip_vertical_button->connect("pressed", callable_mp(this, &TileMapEditor::_flip_vertical));
flip_vertical_button->set_shortcut(ED_SHORTCUT("tile_map_editor/flip_vertical", TTR("Flip Vertically"), KEY_Z));
tool_hb->add_child(flip_vertical_button);
- clear_transform_button = memnew(ToolButton);
+ clear_transform_button = memnew(Button);
+ clear_transform_button->set_flat(true);
clear_transform_button->set_tooltip(TTR("Clear Transform"));
clear_transform_button->set_focus_mode(FOCUS_NONE);
- clear_transform_button->connect("pressed", this, "_clear_transform");
+ clear_transform_button->connect("pressed", callable_mp(this, &TileMapEditor::_clear_transform));
clear_transform_button->set_shortcut(ED_SHORTCUT("tile_map_editor/clear_transform", TTR("Clear Transform"), KEY_W));
tool_hb->add_child(clear_transform_button);
@@ -2118,9 +2204,7 @@ TileMapEditor::~TileMapEditor() {
///////////////////////////////////////////////////////////////
void TileMapEditorPlugin::_notification(int p_what) {
-
if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-
switch ((int)EditorSettings::get_singleton()->get("editors/tile_map/editor_side")) {
case 0: { // Left.
CanvasItemEditor::get_singleton()->get_palette_split()->move_child(tile_map_editor, 0);
@@ -2133,19 +2217,15 @@ void TileMapEditorPlugin::_notification(int p_what) {
}
void TileMapEditorPlugin::edit(Object *p_object) {
-
tile_map_editor->edit(Object::cast_to<Node>(p_object));
}
bool TileMapEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("TileMap");
}
void TileMapEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
-
tile_map_editor->show();
tile_map_editor->get_toolbar()->show();
tile_map_editor->get_toolbar_right()->show();
@@ -2156,17 +2236,15 @@ void TileMapEditorPlugin::make_visible(bool p_visible) {
// Change to TOOL_SELECT when TileMap node is selected, to prevent accidental movement.
CanvasItemEditor::get_singleton()->set_current_tool(CanvasItemEditor::TOOL_SELECT);
} else {
-
tile_map_editor->hide();
tile_map_editor->get_toolbar()->hide();
tile_map_editor->get_toolbar_right()->hide();
tile_map_editor->get_tile_info()->hide();
- tile_map_editor->edit(NULL);
+ tile_map_editor->edit(nullptr);
}
}
TileMapEditorPlugin::TileMapEditorPlugin(EditorNode *p_node) {
-
EDITOR_DEF("editors/tile_map/preview_size", 64);
EDITOR_DEF("editors/tile_map/palette_item_hseparation", 8);
EDITOR_DEF("editors/tile_map/show_tile_names", true);
diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h
index 927f0887bb..996e904853 100644
--- a/editor/plugins/tile_map_editor_plugin.h
+++ b/editor/plugins/tile_map_editor_plugin.h
@@ -33,16 +33,13 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-
#include "scene/2d/tile_map.h"
#include "scene/gui/check_box.h"
#include "scene/gui/label.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/menu_button.h"
-#include "scene/gui/tool_button.h"
class TileMapEditor : public VBoxContainer {
-
GDCLASS(TileMapEditor, VBoxContainer);
enum Tool {
@@ -90,16 +87,18 @@ class TileMapEditor : public VBoxContainer {
Label *tile_info;
MenuButton *options;
- ToolButton *paint_button;
- ToolButton *bucket_fill_button;
- ToolButton *picker_button;
- ToolButton *select_button;
+ Button *paint_button;
+ Button *line_button;
+ Button *rectangle_button;
+ Button *bucket_fill_button;
+ Button *picker_button;
+ Button *select_button;
- ToolButton *flip_horizontal_button;
- ToolButton *flip_vertical_button;
- ToolButton *rotate_left_button;
- ToolButton *rotate_right_button;
- ToolButton *clear_transform_button;
+ Button *flip_horizontal_button;
+ Button *flip_vertical_button;
+ Button *rotate_left_button;
+ Button *rotate_right_button;
+ Button *clear_transform_button;
CheckBox *manual_button;
CheckBox *priority_button;
@@ -109,6 +108,7 @@ class TileMapEditor : public VBoxContainer {
bool selection_active;
bool mouse_over;
+ bool mouse_down;
bool flip_h;
bool flip_v;
@@ -123,38 +123,30 @@ class TileMapEditor : public VBoxContainer {
bool *bucket_cache_visited;
Rect2i bucket_cache_rect;
int bucket_cache_tile;
- PoolVector<Vector2> bucket_cache;
+ Vector<Vector2> bucket_cache;
List<Point2i> bucket_queue;
struct CellOp {
- int idx;
- bool xf;
- bool yf;
- bool tr;
+ int idx = TileMap::INVALID_CELL;
+ bool xf = false;
+ bool yf = false;
+ bool tr = false;
Vector2 ac;
- CellOp() :
- idx(TileMap::INVALID_CELL),
- xf(false),
- yf(false),
- tr(false) {}
+ CellOp() {}
};
Map<Point2i, CellOp> paint_undo;
struct TileData {
Point2i pos;
- int cell;
- bool flip_h;
- bool flip_v;
- bool transpose;
+ int cell = TileMap::INVALID_CELL;
+ bool flip_h = false;
+ bool flip_v = false;
+ bool transpose = false;
Point2i autotile_coord;
- TileData() :
- cell(TileMap::INVALID_CELL),
- flip_h(false),
- flip_v(false),
- transpose(false) {}
+ TileData() {}
};
List<TileData> copydata;
@@ -164,10 +156,10 @@ class TileMapEditor : public VBoxContainer {
void _pick_tile(const Point2 &p_pos);
- PoolVector<Vector2> _bucket_fill(const Point2i &p_start, bool erase = false, bool preview = false);
+ Vector<Vector2> _bucket_fill(const Point2i &p_start, bool erase = false, bool preview = false);
- void _fill_points(const PoolVector<Vector2> &p_points, const Dictionary &p_op);
- void _erase_points(const PoolVector<Vector2> &p_points);
+ void _fill_points(const Vector<Vector2> &p_points, const Dictionary &p_op);
+ void _erase_points(const Vector<Vector2> &p_points);
void _select(const Point2i &p_from, const Point2i &p_to);
void _erase_selection();
@@ -192,6 +184,7 @@ class TileMapEditor : public VBoxContainer {
void _menu_option(int p_option);
void _palette_selected(int index);
void _palette_multi_selected(int index, bool selected);
+ void _palette_input(const Ref<InputEvent> &p_event);
Dictionary _create_cell_dictionary(int tile, bool flip_x, bool flip_y, bool transpose, Vector2 autotile_coord);
void _start_undo(const String &p_action);
@@ -211,6 +204,7 @@ class TileMapEditor : public VBoxContainer {
protected:
void _notification(int p_what);
+ void _node_removed(Node *p_node);
static void _bind_methods();
CellOp _get_op_from_cell(const Point2i &p_pos);
@@ -229,7 +223,6 @@ public:
};
class TileMapEditorPlugin : public EditorPlugin {
-
GDCLASS(TileMapEditorPlugin, EditorPlugin);
TileMapEditor *tile_map_editor;
@@ -238,14 +231,14 @@ protected:
void _notification(int p_what);
public:
- virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return tile_map_editor->forward_gui_input(p_event); }
- virtual void forward_canvas_draw_over_viewport(Control *p_overlay) { tile_map_editor->forward_canvas_draw_over_viewport(p_overlay); }
-
- virtual String get_name() const { return "TileMap"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return tile_map_editor->forward_gui_input(p_event); }
+ virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override { tile_map_editor->forward_canvas_draw_over_viewport(p_overlay); }
+
+ virtual String get_name() const override { return "TileMap"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
TileMapEditorPlugin(EditorNode *p_node);
~TileMapEditorPlugin();
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
index b24d5add9f..684d8f0f10 100644
--- a/editor/plugins/tile_set_editor_plugin.cpp
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -30,15 +30,14 @@
#include "tile_set_editor_plugin.h"
-#include "core/os/input.h"
+#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
#include "editor/plugins/canvas_item_editor_plugin.h"
#include "scene/2d/physics_body_2d.h"
-#include "scene/2d/sprite.h"
+#include "scene/2d/sprite_2d.h"
void TileSetEditor::edit(const Ref<TileSet> &p_tileset) {
-
tileset = p_tileset;
tileset->add_change_receptor(this);
@@ -48,12 +47,10 @@ void TileSetEditor::edit(const Ref<TileSet> &p_tileset) {
}
void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) {
-
for (int i = 0; i < p_node->get_child_count(); i++) {
-
Node *child = p_node->get_child(i);
- if (!Object::cast_to<Sprite>(child)) {
+ if (!Object::cast_to<Sprite2D>(child)) {
if (child->get_child_count() > 0) {
_import_node(child, p_library);
}
@@ -61,17 +58,17 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) {
continue;
}
- Sprite *mi = Object::cast_to<Sprite>(child);
- Ref<Texture> texture = mi->get_texture();
- Ref<Texture> normal_map = mi->get_normal_map();
+ Sprite2D *mi = Object::cast_to<Sprite2D>(child);
+ Ref<Texture2D> texture = mi->get_texture();
+ Ref<Texture2D> normal_map = mi->get_normal_map();
Ref<ShaderMaterial> material = mi->get_material();
- if (texture.is_null())
+ if (texture.is_null()) {
continue;
+ }
int id = p_library->find_tile_by_name(mi->get_name());
if (id < 0) {
-
id = p_library->get_last_unused_tile_id();
p_library->create_tile(id);
p_library->tile_set_name(id, mi->get_name());
@@ -106,17 +103,19 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) {
bool found_collisions = false;
for (int j = 0; j < mi->get_child_count(); j++) {
-
Node *child2 = mi->get_child(j);
- if (Object::cast_to<NavigationPolygonInstance>(child2))
- nav_poly = Object::cast_to<NavigationPolygonInstance>(child2)->get_navigation_polygon();
+ if (Object::cast_to<NavigationRegion2D>(child2)) {
+ nav_poly = Object::cast_to<NavigationRegion2D>(child2)->get_navigation_polygon();
+ }
- if (Object::cast_to<LightOccluder2D>(child2))
+ if (Object::cast_to<LightOccluder2D>(child2)) {
occluder = Object::cast_to<LightOccluder2D>(child2)->get_occluder_polygon();
+ }
- if (!Object::cast_to<StaticBody2D>(child2))
+ if (!Object::cast_to<StaticBody2D>(child2)) {
continue;
+ }
found_collisions = true;
@@ -126,7 +125,9 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) {
sb->get_shape_owners(&shapes);
for (List<uint32_t>::Element *E = shapes.front(); E; E = E->next()) {
- if (sb->is_shape_owner_disabled(E->get())) continue;
+ if (sb->is_shape_owner_disabled(E->get())) {
+ continue;
+ }
Transform2D shape_transform = sb->get_transform() * sb->shape_owner_get_transform(E->get());
bool one_way = sb->is_shape_owner_one_way_collision_enabled(E->get());
@@ -134,7 +135,6 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) {
shape_transform[2] -= phys_offset;
for (int k = 0; k < sb->shape_owner_get_shape_count(E->get()); k++) {
-
Ref<Shape2D> shape = sb->shape_owner_get_shape(E->get(), k);
TileSet::ShapeData shape_data;
shape_data.shape = shape;
@@ -159,56 +159,53 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) {
}
void TileSetEditor::_import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_merge) {
-
- if (!p_merge)
+ if (!p_merge) {
p_library->clear();
+ }
_import_node(p_scene, p_library);
}
void TileSetEditor::_undo_redo_import_scene(Node *p_scene, bool p_merge) {
-
_import_scene(p_scene, tileset, p_merge);
}
Error TileSetEditor::update_library_file(Node *p_base_scene, Ref<TileSet> ml, bool p_merge) {
-
_import_scene(p_base_scene, ml, p_merge);
return OK;
}
Variant TileSetEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
return false;
}
bool TileSetEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return false;
+ }
- if (d.has("from") && (Object *)(d["from"]) == texture_list)
+ if (d.has("from") && (Object *)(d["from"]) == texture_list) {
return false;
+ }
if (String(d["type"]) == "resource" && d.has("resource")) {
RES r = d["resource"];
- Ref<Texture> texture = r;
+ Ref<Texture2D> texture = r;
if (texture.is_valid()) {
-
return true;
}
}
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
- if (files.size() == 0)
+ if (files.size() == 0) {
return false;
+ }
for (int i = 0; i < files.size(); i++) {
String file = files[i];
@@ -225,22 +222,24 @@ bool TileSetEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_dat
}
void TileSetEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
- if (!can_drop_data_fw(p_point, p_data, p_from))
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
return;
+ }
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return;
+ }
if (String(d["type"]) == "resource" && d.has("resource")) {
RES r = d["resource"];
- Ref<Texture> texture = r;
+ Ref<Texture2D> texture = r;
- if (texture.is_valid())
+ if (texture.is_valid()) {
add_texture(texture);
+ }
if (texture_list->get_item_count() > 0) {
update_texture_list_icon();
@@ -250,37 +249,19 @@ void TileSetEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, C
}
if (String(d["type"]) == "files") {
-
- PoolVector<String> files = d["files"];
+ Vector<String> files = d["files"];
_on_textures_added(files);
}
}
void TileSetEditor::_bind_methods() {
-
ClassDB::bind_method("_undo_redo_import_scene", &TileSetEditor::_undo_redo_import_scene);
- ClassDB::bind_method("_on_tileset_toolbar_button_pressed", &TileSetEditor::_on_tileset_toolbar_button_pressed);
- ClassDB::bind_method("_on_textures_added", &TileSetEditor::_on_textures_added);
- ClassDB::bind_method("_on_tileset_toolbar_confirm", &TileSetEditor::_on_tileset_toolbar_confirm);
- ClassDB::bind_method("_on_texture_list_selected", &TileSetEditor::_on_texture_list_selected);
- ClassDB::bind_method("_on_edit_mode_changed", &TileSetEditor::_on_edit_mode_changed);
- ClassDB::bind_method("_on_workspace_mode_changed", &TileSetEditor::_on_workspace_mode_changed);
- ClassDB::bind_method("_on_workspace_overlay_draw", &TileSetEditor::_on_workspace_overlay_draw);
- ClassDB::bind_method("_on_workspace_process", &TileSetEditor::_on_workspace_process);
- ClassDB::bind_method("_on_workspace_draw", &TileSetEditor::_on_workspace_draw);
- ClassDB::bind_method("_on_workspace_input", &TileSetEditor::_on_workspace_input);
- ClassDB::bind_method("_on_tool_clicked", &TileSetEditor::_on_tool_clicked);
- ClassDB::bind_method("_on_priority_changed", &TileSetEditor::_on_priority_changed);
- ClassDB::bind_method("_on_z_index_changed", &TileSetEditor::_on_z_index_changed);
- ClassDB::bind_method("_on_grid_snap_toggled", &TileSetEditor::_on_grid_snap_toggled);
+ ClassDB::bind_method("_on_workspace_process", &TileSetEditor::_on_workspace_process); // Still used by some connect_compat.
ClassDB::bind_method("_set_snap_step", &TileSetEditor::_set_snap_step);
ClassDB::bind_method("_set_snap_off", &TileSetEditor::_set_snap_off);
ClassDB::bind_method("_set_snap_sep", &TileSetEditor::_set_snap_sep);
ClassDB::bind_method("_validate_current_tile_id", &TileSetEditor::_validate_current_tile_id);
- ClassDB::bind_method("_zoom_in", &TileSetEditor::_zoom_in);
- ClassDB::bind_method("_zoom_out", &TileSetEditor::_zoom_out);
- ClassDB::bind_method("_zoom_reset", &TileSetEditor::_zoom_reset);
ClassDB::bind_method("_select_edited_shape_coord", &TileSetEditor::_select_edited_shape_coord);
ClassDB::bind_method("_sort_tiles", &TileSetEditor::_sort_tiles);
@@ -296,57 +277,53 @@ void TileSetEditor::_bind_methods() {
}
void TileSetEditor::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_READY: {
-
- add_constant_override("autohide", 1); // Fixes the dragger always showing up.
+ add_theme_constant_override("autohide", 1); // Fixes the dragger always showing up.
} break;
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
-
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_icon(get_icon("ToolAddNode", "EditorIcons"));
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_icon(get_icon("Remove", "EditorIcons"));
- tileset_toolbar_tools->set_icon(get_icon("Tools", "EditorIcons"));
-
- tool_workspacemode[WORKSPACE_EDIT]->set_icon(get_icon("Edit", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_SINGLE]->set_icon(get_icon("AddSingleTile", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_AUTOTILE]->set_icon(get_icon("AddAutotile", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_ATLAS]->set_icon(get_icon("AddAtlasTile", "EditorIcons"));
-
- tools[TOOL_SELECT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tools[BITMASK_COPY]->set_icon(get_icon("Duplicate", "EditorIcons"));
- tools[BITMASK_PASTE]->set_icon(get_icon("Override", "EditorIcons"));
- tools[BITMASK_CLEAR]->set_icon(get_icon("Clear", "EditorIcons"));
- tools[SHAPE_NEW_POLYGON]->set_icon(get_icon("CollisionPolygon2D", "EditorIcons"));
- tools[SHAPE_NEW_RECTANGLE]->set_icon(get_icon("CollisionShape2D", "EditorIcons"));
- tools[SELECT_PREVIOUS]->set_icon(get_icon("ArrowLeft", "EditorIcons"));
- tools[SELECT_NEXT]->set_icon(get_icon("ArrowRight", "EditorIcons"));
- tools[SHAPE_DELETE]->set_icon(get_icon("Remove", "EditorIcons"));
- tools[SHAPE_KEEP_INSIDE_TILE]->set_icon(get_icon("Snap", "EditorIcons"));
- tools[TOOL_GRID_SNAP]->set_icon(get_icon("SnapGrid", "EditorIcons"));
- tools[ZOOM_OUT]->set_icon(get_icon("ZoomLess", "EditorIcons"));
- tools[ZOOM_1]->set_icon(get_icon("ZoomReset", "EditorIcons"));
- tools[ZOOM_IN]->set_icon(get_icon("ZoomMore", "EditorIcons"));
- tools[VISIBLE_INFO]->set_icon(get_icon("InformationSign", "EditorIcons"));
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_icon(get_theme_icon("ToolAddNode", "EditorIcons"));
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ tileset_toolbar_tools->set_icon(get_theme_icon("Tools", "EditorIcons"));
+
+ tool_workspacemode[WORKSPACE_EDIT]->set_icon(get_theme_icon("Edit", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_SINGLE]->set_icon(get_theme_icon("AddSingleTile", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_AUTOTILE]->set_icon(get_theme_icon("AddAutotile", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_ATLAS]->set_icon(get_theme_icon("AddAtlasTile", "EditorIcons"));
+
+ tools[TOOL_SELECT]->set_icon(get_theme_icon("ToolSelect", "EditorIcons"));
+ tools[BITMASK_COPY]->set_icon(get_theme_icon("Duplicate", "EditorIcons"));
+ tools[BITMASK_PASTE]->set_icon(get_theme_icon("Override", "EditorIcons"));
+ tools[BITMASK_CLEAR]->set_icon(get_theme_icon("Clear", "EditorIcons"));
+ tools[SHAPE_NEW_POLYGON]->set_icon(get_theme_icon("CollisionPolygon2D", "EditorIcons"));
+ tools[SHAPE_NEW_RECTANGLE]->set_icon(get_theme_icon("CollisionShape2D", "EditorIcons"));
+ tools[SELECT_PREVIOUS]->set_icon(get_theme_icon("ArrowLeft", "EditorIcons"));
+ tools[SELECT_NEXT]->set_icon(get_theme_icon("ArrowRight", "EditorIcons"));
+ tools[SHAPE_DELETE]->set_icon(get_theme_icon("Remove", "EditorIcons"));
+ tools[SHAPE_KEEP_INSIDE_TILE]->set_icon(get_theme_icon("Snap", "EditorIcons"));
+ tools[TOOL_GRID_SNAP]->set_icon(get_theme_icon("SnapGrid", "EditorIcons"));
+ tools[ZOOM_OUT]->set_icon(get_theme_icon("ZoomLess", "EditorIcons"));
+ tools[ZOOM_1]->set_icon(get_theme_icon("ZoomReset", "EditorIcons"));
+ tools[ZOOM_IN]->set_icon(get_theme_icon("ZoomMore", "EditorIcons"));
+ tools[VISIBLE_INFO]->set_icon(get_theme_icon("InformationSign", "EditorIcons"));
_update_toggle_shape_button();
- tool_editmode[EDITMODE_REGION]->set_icon(get_icon("RegionEdit", "EditorIcons"));
- tool_editmode[EDITMODE_COLLISION]->set_icon(get_icon("StaticBody2D", "EditorIcons"));
- tool_editmode[EDITMODE_OCCLUSION]->set_icon(get_icon("LightOccluder2D", "EditorIcons"));
- tool_editmode[EDITMODE_NAVIGATION]->set_icon(get_icon("Navigation2D", "EditorIcons"));
- tool_editmode[EDITMODE_BITMASK]->set_icon(get_icon("PackedDataContainer", "EditorIcons"));
- tool_editmode[EDITMODE_PRIORITY]->set_icon(get_icon("MaterialPreviewLight1", "EditorIcons"));
- tool_editmode[EDITMODE_ICON]->set_icon(get_icon("LargeTexture", "EditorIcons"));
- tool_editmode[EDITMODE_Z_INDEX]->set_icon(get_icon("Sort", "EditorIcons"));
+ tool_editmode[EDITMODE_REGION]->set_icon(get_theme_icon("RegionEdit", "EditorIcons"));
+ tool_editmode[EDITMODE_COLLISION]->set_icon(get_theme_icon("StaticBody2D", "EditorIcons"));
+ tool_editmode[EDITMODE_OCCLUSION]->set_icon(get_theme_icon("LightOccluder2D", "EditorIcons"));
+ tool_editmode[EDITMODE_NAVIGATION]->set_icon(get_theme_icon("Navigation2D", "EditorIcons"));
+ tool_editmode[EDITMODE_BITMASK]->set_icon(get_theme_icon("PackedDataContainer", "EditorIcons"));
+ tool_editmode[EDITMODE_PRIORITY]->set_icon(get_theme_icon("MaterialPreviewLight1", "EditorIcons"));
+ tool_editmode[EDITMODE_ICON]->set_icon(get_theme_icon("LargeTexture", "EditorIcons"));
+ tool_editmode[EDITMODE_Z_INDEX]->set_icon(get_theme_icon("Sort", "EditorIcons"));
- scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ scroll->add_theme_style_override("bg", get_theme_stylebox("bg", "Tree"));
} break;
}
}
TileSetEditor::TileSetEditor(EditorNode *p_editor) {
-
editor = p_editor;
undo_redo = EditorNode::get_undo_redo();
current_tile = -1;
@@ -358,19 +335,21 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
left_container->add_child(texture_list);
texture_list->set_v_size_flags(SIZE_EXPAND_FILL);
texture_list->set_custom_minimum_size(Size2(200, 0));
- texture_list->connect("item_selected", this, "_on_texture_list_selected");
+ texture_list->connect("item_selected", callable_mp(this, &TileSetEditor::_on_texture_list_selected));
texture_list->set_drag_forwarding(this);
HBoxContainer *tileset_toolbar_container = memnew(HBoxContainer);
left_container->add_child(tileset_toolbar_container);
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE] = memnew(ToolButton);
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", varray(TOOL_TILESET_ADD_TEXTURE));
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE] = memnew(Button);
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_flat(true);
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_button_pressed), varray(TOOL_TILESET_ADD_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]);
tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_tooltip(TTR("Add Texture(s) to TileSet."));
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE] = memnew(ToolButton);
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", varray(TOOL_TILESET_REMOVE_TEXTURE));
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE] = memnew(Button);
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_flat(true);
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_button_pressed), varray(TOOL_TILESET_REMOVE_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]);
tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_tooltip(TTR("Remove selected Texture from TileSet."));
@@ -383,7 +362,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tileset_toolbar_tools->get_popup()->add_item(TTR("Create from Scene"), TOOL_TILESET_CREATE_SCENE);
tileset_toolbar_tools->get_popup()->add_item(TTR("Merge from Scene"), TOOL_TILESET_MERGE_SCENE);
- tileset_toolbar_tools->get_popup()->connect("id_pressed", this, "_on_tileset_toolbar_button_pressed");
+ tileset_toolbar_tools->get_popup()->connect("id_pressed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_button_pressed));
tileset_toolbar_container->add_child(tileset_toolbar_tools);
//---------------
@@ -416,7 +395,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tool_workspacemode[i]->set_text(workspace_label[i]);
tool_workspacemode[i]->set_toggle_mode(true);
tool_workspacemode[i]->set_button_group(g);
- tool_workspacemode[i]->connect("pressed", this, "_on_workspace_mode_changed", varray(i));
+ tool_workspacemode[i]->connect("pressed", callable_mp(this, &TileSetEditor::_on_workspace_mode_changed), varray(i));
tool_hb->add_child(tool_workspacemode[i]);
}
@@ -425,18 +404,20 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tool_hb->add_child(spacer);
tool_hb->move_child(spacer, WORKSPACE_CREATE_SINGLE);
- tools[SELECT_NEXT] = memnew(ToolButton);
+ tools[SELECT_NEXT] = memnew(Button);
tool_hb->add_child(tools[SELECT_NEXT]);
tool_hb->move_child(tools[SELECT_NEXT], WORKSPACE_CREATE_SINGLE);
+ tools[SELECT_NEXT]->set_flat(true);
tools[SELECT_NEXT]->set_shortcut(ED_SHORTCUT("tileset_editor/next_shape", TTR("Next Coordinate"), KEY_PAGEDOWN));
- tools[SELECT_NEXT]->connect("pressed", this, "_on_tool_clicked", varray(SELECT_NEXT));
+ tools[SELECT_NEXT]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SELECT_NEXT));
tools[SELECT_NEXT]->set_tooltip(TTR("Select the next shape, subtile, or Tile."));
- tools[SELECT_PREVIOUS] = memnew(ToolButton);
+ tools[SELECT_PREVIOUS] = memnew(Button);
tool_hb->add_child(tools[SELECT_PREVIOUS]);
tool_hb->move_child(tools[SELECT_PREVIOUS], WORKSPACE_CREATE_SINGLE);
+ tools[SELECT_PREVIOUS]->set_flat(true);
tools[SELECT_PREVIOUS]->set_shortcut(ED_SHORTCUT("tileset_editor/previous_shape", TTR("Previous Coordinate"), KEY_PAGEUP));
tools[SELECT_PREVIOUS]->set_tooltip(TTR("Select the previous shape, subtile, or Tile."));
- tools[SELECT_PREVIOUS]->connect("pressed", this, "_on_tool_clicked", varray(SELECT_PREVIOUS));
+ tools[SELECT_PREVIOUS]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SELECT_PREVIOUS));
VSeparator *separator_shape_selection = memnew(VSeparator);
tool_hb->add_child(separator_shape_selection);
@@ -466,7 +447,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tool_editmode[i]->set_text(label[i]);
tool_editmode[i]->set_toggle_mode(true);
tool_editmode[i]->set_button_group(g);
- tool_editmode[i]->connect("pressed", this, "_on_edit_mode_changed", varray(i));
+ tool_editmode[i]->connect("pressed", callable_mp(this, &TileSetEditor::_on_edit_mode_changed), varray(i));
tool_hb->add_child(tool_editmode[i]);
}
tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
@@ -488,50 +469,60 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
toolbar = memnew(HBoxContainer);
Ref<ButtonGroup> tg(memnew(ButtonGroup));
- tools[TOOL_SELECT] = memnew(ToolButton);
+ tools[TOOL_SELECT] = memnew(Button);
toolbar->add_child(tools[TOOL_SELECT]);
+ tools[TOOL_SELECT]->set_flat(true);
tools[TOOL_SELECT]->set_toggle_mode(true);
tools[TOOL_SELECT]->set_button_group(tg);
tools[TOOL_SELECT]->set_pressed(true);
- tools[TOOL_SELECT]->connect("pressed", this, "_on_tool_clicked", varray(TOOL_SELECT));
+ tools[TOOL_SELECT]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(TOOL_SELECT));
separator_bitmask = memnew(VSeparator);
toolbar->add_child(separator_bitmask);
- tools[BITMASK_COPY] = memnew(ToolButton);
+ tools[BITMASK_COPY] = memnew(Button);
+ tools[BITMASK_COPY]->set_flat(true);
tools[BITMASK_COPY]->set_tooltip(TTR("Copy bitmask."));
- tools[BITMASK_COPY]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_COPY));
+ tools[BITMASK_COPY]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_COPY));
toolbar->add_child(tools[BITMASK_COPY]);
- tools[BITMASK_PASTE] = memnew(ToolButton);
+ tools[BITMASK_PASTE] = memnew(Button);
+ tools[BITMASK_PASTE]->set_flat(true);
tools[BITMASK_PASTE]->set_tooltip(TTR("Paste bitmask."));
- tools[BITMASK_PASTE]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_PASTE));
+ tools[BITMASK_PASTE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_PASTE));
toolbar->add_child(tools[BITMASK_PASTE]);
- tools[BITMASK_CLEAR] = memnew(ToolButton);
+ tools[BITMASK_CLEAR] = memnew(Button);
+ tools[BITMASK_CLEAR]->set_flat(true);
tools[BITMASK_CLEAR]->set_tooltip(TTR("Erase bitmask."));
- tools[BITMASK_CLEAR]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_CLEAR));
+ tools[BITMASK_CLEAR]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_CLEAR));
toolbar->add_child(tools[BITMASK_CLEAR]);
- tools[SHAPE_NEW_RECTANGLE] = memnew(ToolButton);
+ tools[SHAPE_NEW_RECTANGLE] = memnew(Button);
toolbar->add_child(tools[SHAPE_NEW_RECTANGLE]);
+ tools[SHAPE_NEW_RECTANGLE]->set_flat(true);
tools[SHAPE_NEW_RECTANGLE]->set_toggle_mode(true);
tools[SHAPE_NEW_RECTANGLE]->set_button_group(tg);
tools[SHAPE_NEW_RECTANGLE]->set_tooltip(TTR("Create a new rectangle."));
+ tools[SHAPE_NEW_RECTANGLE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_NEW_RECTANGLE));
- tools[SHAPE_NEW_POLYGON] = memnew(ToolButton);
+ tools[SHAPE_NEW_POLYGON] = memnew(Button);
toolbar->add_child(tools[SHAPE_NEW_POLYGON]);
+ tools[SHAPE_NEW_POLYGON]->set_flat(true);
tools[SHAPE_NEW_POLYGON]->set_toggle_mode(true);
tools[SHAPE_NEW_POLYGON]->set_button_group(tg);
tools[SHAPE_NEW_POLYGON]->set_tooltip(TTR("Create a new polygon."));
+ tools[SHAPE_NEW_POLYGON]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_NEW_POLYGON));
separator_shape_toggle = memnew(VSeparator);
toolbar->add_child(separator_shape_toggle);
- tools[SHAPE_TOGGLE_TYPE] = memnew(ToolButton);
- tools[SHAPE_TOGGLE_TYPE]->connect("pressed", this, "_on_tool_clicked", varray(SHAPE_TOGGLE_TYPE));
+ tools[SHAPE_TOGGLE_TYPE] = memnew(Button);
+ tools[SHAPE_TOGGLE_TYPE]->set_flat(true);
+ tools[SHAPE_TOGGLE_TYPE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_TOGGLE_TYPE));
toolbar->add_child(tools[SHAPE_TOGGLE_TYPE]);
separator_delete = memnew(VSeparator);
toolbar->add_child(separator_delete);
- tools[SHAPE_DELETE] = memnew(ToolButton);
- tools[SHAPE_DELETE]->connect("pressed", this, "_on_tool_clicked", varray(SHAPE_DELETE));
+ tools[SHAPE_DELETE] = memnew(Button);
+ tools[SHAPE_DELETE]->set_flat(true);
+ tools[SHAPE_DELETE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_DELETE));
toolbar->add_child(tools[SHAPE_DELETE]);
spin_priority = memnew(SpinBox);
@@ -539,50 +530,56 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
spin_priority->set_max(255);
spin_priority->set_step(1);
spin_priority->set_custom_minimum_size(Size2(100, 0));
- spin_priority->connect("value_changed", this, "_on_priority_changed");
+ spin_priority->connect("value_changed", callable_mp(this, &TileSetEditor::_on_priority_changed));
spin_priority->hide();
toolbar->add_child(spin_priority);
spin_z_index = memnew(SpinBox);
- spin_z_index->set_min(VS::CANVAS_ITEM_Z_MIN);
- spin_z_index->set_max(VS::CANVAS_ITEM_Z_MAX);
+ spin_z_index->set_min(RS::CANVAS_ITEM_Z_MIN);
+ spin_z_index->set_max(RS::CANVAS_ITEM_Z_MAX);
spin_z_index->set_step(1);
spin_z_index->set_custom_minimum_size(Size2(100, 0));
- spin_z_index->connect("value_changed", this, "_on_z_index_changed");
+ spin_z_index->connect("value_changed", callable_mp(this, &TileSetEditor::_on_z_index_changed));
spin_z_index->hide();
toolbar->add_child(spin_z_index);
separator_grid = memnew(VSeparator);
toolbar->add_child(separator_grid);
- tools[SHAPE_KEEP_INSIDE_TILE] = memnew(ToolButton);
+ tools[SHAPE_KEEP_INSIDE_TILE] = memnew(Button);
+ tools[SHAPE_KEEP_INSIDE_TILE]->set_flat(true);
tools[SHAPE_KEEP_INSIDE_TILE]->set_toggle_mode(true);
tools[SHAPE_KEEP_INSIDE_TILE]->set_pressed(true);
tools[SHAPE_KEEP_INSIDE_TILE]->set_tooltip(TTR("Keep polygon inside region Rect."));
toolbar->add_child(tools[SHAPE_KEEP_INSIDE_TILE]);
- tools[TOOL_GRID_SNAP] = memnew(ToolButton);
+ tools[TOOL_GRID_SNAP] = memnew(Button);
+ tools[TOOL_GRID_SNAP]->set_flat(true);
tools[TOOL_GRID_SNAP]->set_toggle_mode(true);
tools[TOOL_GRID_SNAP]->set_tooltip(TTR("Enable snap and show grid (configurable via the Inspector)."));
- tools[TOOL_GRID_SNAP]->connect("toggled", this, "_on_grid_snap_toggled");
+ tools[TOOL_GRID_SNAP]->connect("toggled", callable_mp(this, &TileSetEditor::_on_grid_snap_toggled));
toolbar->add_child(tools[TOOL_GRID_SNAP]);
Control *separator = memnew(Control);
separator->set_h_size_flags(SIZE_EXPAND_FILL);
toolbar->add_child(separator);
- tools[ZOOM_OUT] = memnew(ToolButton);
- tools[ZOOM_OUT]->connect("pressed", this, "_zoom_out");
+ tools[ZOOM_OUT] = memnew(Button);
+ tools[ZOOM_OUT]->set_flat(true);
+ tools[ZOOM_OUT]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_out));
toolbar->add_child(tools[ZOOM_OUT]);
tools[ZOOM_OUT]->set_tooltip(TTR("Zoom Out"));
- tools[ZOOM_1] = memnew(ToolButton);
- tools[ZOOM_1]->connect("pressed", this, "_zoom_reset");
+ tools[ZOOM_1] = memnew(Button);
+ tools[ZOOM_1]->set_flat(true);
+ tools[ZOOM_1]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_reset));
toolbar->add_child(tools[ZOOM_1]);
tools[ZOOM_1]->set_tooltip(TTR("Zoom Reset"));
- tools[ZOOM_IN] = memnew(ToolButton);
- tools[ZOOM_IN]->connect("pressed", this, "_zoom_in");
+ tools[ZOOM_IN] = memnew(Button);
+ tools[ZOOM_IN]->set_flat(true);
+ tools[ZOOM_IN]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_in));
toolbar->add_child(tools[ZOOM_IN]);
tools[ZOOM_IN]->set_tooltip(TTR("Zoom In"));
- tools[VISIBLE_INFO] = memnew(ToolButton);
+ tools[VISIBLE_INFO] = memnew(Button);
+ tools[VISIBLE_INFO]->set_flat(true);
tools[VISIBLE_INFO]->set_toggle_mode(true);
tools[VISIBLE_INFO]->set_tooltip(TTR("Display Tile Names (Hold Alt Key)"));
toolbar->add_child(tools[VISIBLE_INFO]);
@@ -592,6 +589,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
scroll = memnew(ScrollContainer);
main_vb->add_child(scroll);
scroll->set_v_size_flags(SIZE_EXPAND_FILL);
+ scroll->connect("gui_input", callable_mp(this, &TileSetEditor::_on_scroll_container_input));
scroll->set_clip_contents(true);
empty_message = memnew(Label);
@@ -607,17 +605,17 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
scroll->add_child(workspace_container);
workspace_overlay = memnew(Control);
- workspace_overlay->connect("draw", this, "_on_workspace_overlay_draw");
+ workspace_overlay->connect("draw", callable_mp(this, &TileSetEditor::_on_workspace_overlay_draw));
workspace_container->add_child(workspace_overlay);
workspace = memnew(Control);
workspace->set_focus_mode(FOCUS_ALL);
- workspace->connect("draw", this, "_on_workspace_draw");
- workspace->connect("gui_input", this, "_on_workspace_input");
+ workspace->connect("draw", callable_mp(this, &TileSetEditor::_on_workspace_draw));
+ workspace->connect("gui_input", callable_mp(this, &TileSetEditor::_on_workspace_input));
workspace->set_draw_behind_parent(true);
workspace_overlay->add_child(workspace);
- preview = memnew(Sprite);
+ preview = memnew(Sprite2D);
workspace->add_child(preview);
preview->set_centered(false);
preview->set_draw_behind_parent(true);
@@ -626,7 +624,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
//---------------
cd = memnew(ConfirmationDialog);
add_child(cd);
- cd->connect("confirmed", this, "_on_tileset_toolbar_confirm");
+ cd->connect("confirmed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_confirm));
//---------------
err_dialog = memnew(AcceptDialog);
@@ -635,17 +633,16 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
//---------------
texture_dialog = memnew(EditorFileDialog);
texture_dialog->set_access(EditorFileDialog::ACCESS_RESOURCES);
- texture_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILES);
+ texture_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILES);
texture_dialog->clear_filters();
List<String> extensions;
- ResourceLoader::get_recognized_extensions_for_type("Texture", &extensions);
+ ResourceLoader::get_recognized_extensions_for_type("Texture2D", &extensions);
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
-
texture_dialog->add_filter("*." + E->get() + " ; " + E->get().to_upper());
}
add_child(texture_dialog);
- texture_dialog->connect("files_selected", this, "_on_textures_added");
+ texture_dialog->connect("files_selected", callable_mp(this, &TileSetEditor::_on_textures_added));
//---------------
helper = memnew(TilesetEditorContext(this));
@@ -658,15 +655,16 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
}
TileSetEditor::~TileSetEditor() {
- if (helper)
+ if (helper) {
memdelete(helper);
+ }
}
void TileSetEditor::_on_tileset_toolbar_button_pressed(int p_index) {
option = p_index;
switch (option) {
case TOOL_TILESET_ADD_TEXTURE: {
- texture_dialog->popup_centered_ratio();
+ texture_dialog->popup_file_dialog();
} break;
case TOOL_TILESET_REMOVE_TEXTURE: {
if (get_current_texture().is_valid()) {
@@ -678,12 +676,10 @@ void TileSetEditor::_on_tileset_toolbar_button_pressed(int p_index) {
}
} break;
case TOOL_TILESET_CREATE_SCENE: {
-
cd->set_text(TTR("Create from scene? This will overwrite all current tiles."));
cd->popup_centered(Size2(300, 60));
} break;
case TOOL_TILESET_MERGE_SCENE: {
-
cd->set_text(TTR("Merge from scene?"));
cd->popup_centered(Size2(300, 60));
} break;
@@ -711,16 +707,16 @@ void TileSetEditor::_on_tileset_toolbar_confirm() {
} break;
case TOOL_TILESET_MERGE_SCENE:
case TOOL_TILESET_CREATE_SCENE: {
-
EditorNode *en = editor;
Node *scene = en->get_edited_scene();
- if (!scene)
+ if (!scene) {
break;
+ }
List<int> ids;
tileset->get_tile_list(&ids);
- undo_redo->create_action(TTR(option == TOOL_TILESET_MERGE_SCENE ? "Merge Tileset from Scene" : "Create Tileset from Scene"));
+ undo_redo->create_action(option == TOOL_TILESET_MERGE_SCENE ? TTR("Merge Tileset from Scene") : TTR("Create Tileset from Scene"));
undo_redo->add_do_method(this, "_undo_redo_import_scene", scene, option == TOOL_TILESET_MERGE_SCENE);
undo_redo->add_undo_method(tileset.ptr(), "clear");
for (List<int>::Element *E = ids.front(); E; E = E->next()) {
@@ -741,7 +737,7 @@ void TileSetEditor::_on_texture_list_selected(int p_index) {
update_workspace_minsize();
} else {
current_item_index = -1;
- preview->set_texture(NULL);
+ preview->set_texture(nullptr);
workspace->set_custom_minimum_size(Size2i());
update_workspace_tile_mode();
}
@@ -750,10 +746,10 @@ void TileSetEditor::_on_texture_list_selected(int p_index) {
workspace->update();
}
-void TileSetEditor::_on_textures_added(const PoolStringArray &p_paths) {
+void TileSetEditor::_on_textures_added(const PackedStringArray &p_paths) {
int invalid_count = 0;
for (int i = 0; i < p_paths.size(); i++) {
- Ref<Texture> t = Ref<Texture>(ResourceLoader::load(p_paths[i]));
+ Ref<Texture2D> t = Ref<Texture2D>(ResourceLoader::load(p_paths[i]));
ERR_CONTINUE_MSG(!t.is_valid(), "'" + p_paths[i] + "' is not a valid texture.");
@@ -910,9 +906,9 @@ void TileSetEditor::_on_workspace_mode_changed(int p_workspace_mode) {
}
void TileSetEditor::_on_workspace_draw() {
-
- if (tileset.is_null() || !get_current_texture().is_valid())
+ if (tileset.is_null() || !get_current_texture().is_valid()) {
return;
+ }
const Color COLOR_AUTOTILE = Color(0.3, 0.6, 1);
const Color COLOR_SINGLE = Color(1, 1, 0.3);
@@ -1071,12 +1067,13 @@ void TileSetEditor::_on_workspace_draw() {
Rect2i region = tileset->tile_get_region(t_id);
region.position += WORKSPACE_MARGIN;
Color c;
- if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE)
+ if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE) {
c = COLOR_SINGLE;
- else if (tileset->tile_get_tile_mode(t_id) == TileSet::AUTO_TILE)
+ } else if (tileset->tile_get_tile_mode(t_id) == TileSet::AUTO_TILE) {
c = COLOR_AUTOTILE;
- else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
+ } else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE) {
c = COLOR_ATLAS;
+ }
draw_tile_subdivision(t_id, COLOR_SUBDIVISION);
workspace->draw_rect(region, c, false);
}
@@ -1087,39 +1084,43 @@ void TileSetEditor::_on_workspace_draw() {
if (workspace_mode != WORKSPACE_EDIT) {
Rect2i region = edited_region;
Color c;
- if (workspace_mode == WORKSPACE_CREATE_SINGLE)
+ if (workspace_mode == WORKSPACE_CREATE_SINGLE) {
c = COLOR_SINGLE;
- else if (workspace_mode == WORKSPACE_CREATE_AUTOTILE)
+ } else if (workspace_mode == WORKSPACE_CREATE_AUTOTILE) {
c = COLOR_AUTOTILE;
- else if (workspace_mode == WORKSPACE_CREATE_ATLAS)
+ } else if (workspace_mode == WORKSPACE_CREATE_ATLAS) {
c = COLOR_ATLAS;
+ }
workspace->draw_rect(region, c, false);
draw_edited_region_subdivision();
} else {
int t_id = get_current_tile();
- if (t_id < 0)
+ if (t_id < 0) {
return;
+ }
Rect2i region;
- if (draw_edited_region)
+ if (draw_edited_region) {
region = edited_region;
- else {
+ } else {
region = tileset->tile_get_region(t_id);
region.position += WORKSPACE_MARGIN;
}
- if (draw_edited_region)
+ if (draw_edited_region) {
draw_edited_region_subdivision();
- else
+ } else {
draw_tile_subdivision(t_id, COLOR_SUBDIVISION);
+ }
Color c;
- if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE)
+ if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE) {
c = COLOR_SINGLE;
- else if (tileset->tile_get_tile_mode(t_id) == TileSet::AUTO_TILE)
+ } else if (tileset->tile_get_tile_mode(t_id) == TileSet::AUTO_TILE) {
c = COLOR_AUTOTILE;
- else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
+ } else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE) {
c = COLOR_ATLAS;
+ }
workspace->draw_rect(region, c, false);
}
}
@@ -1128,7 +1129,6 @@ void TileSetEditor::_on_workspace_draw() {
}
void TileSetEditor::_on_workspace_process() {
-
if (Input::get_singleton()->is_key_pressed(KEY_ALT) || tools[VISIBLE_INFO]->is_pressed()) {
if (!tile_names_visible) {
tile_names_visible = true;
@@ -1141,9 +1141,9 @@ void TileSetEditor::_on_workspace_process() {
}
void TileSetEditor::_on_workspace_overlay_draw() {
-
- if (!tileset.is_valid() || !get_current_texture().is_valid())
+ if (!tileset.is_valid() || !get_current_texture().is_valid()) {
return;
+ }
const Color COLOR_AUTOTILE = Color(0.266373, 0.565288, 0.988281);
const Color COLOR_SINGLE = Color(0.988281, 0.909323, 0.266373);
@@ -1155,21 +1155,23 @@ void TileSetEditor::_on_workspace_overlay_draw() {
tileset->get_tile_list(tiles);
for (List<int>::Element *E = tiles->front(); E; E = E->next()) {
int t_id = E->get();
- if (tileset->tile_get_texture(t_id)->get_rid() != current_texture_rid)
+ if (tileset->tile_get_texture(t_id)->get_rid() != current_texture_rid) {
continue;
+ }
Rect2 region = tileset->tile_get_region(t_id);
region.position += WORKSPACE_MARGIN;
region.position *= workspace->get_scale().x;
Color c;
- if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE)
+ if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE) {
c = COLOR_SINGLE;
- else if (tileset->tile_get_tile_mode(t_id) == TileSet::AUTO_TILE)
+ } else if (tileset->tile_get_tile_mode(t_id) == TileSet::AUTO_TILE) {
c = COLOR_AUTOTILE;
- else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
+ } else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE) {
c = COLOR_ATLAS;
+ }
String tile_id_name = String::num(t_id, 0) + ": " + tileset->tile_get_name(t_id);
- Ref<Font> font = get_font("font", "Label");
+ Ref<Font> font = get_theme_font("font", "Label");
region.set_size(font->get_string_size(tile_id_name));
workspace_overlay->draw_rect(region, c);
region.position.y += region.size.y - 2;
@@ -1180,10 +1182,11 @@ void TileSetEditor::_on_workspace_overlay_draw() {
}
int t_id = get_current_tile();
- if (t_id < 0)
+ if (t_id < 0) {
return;
+ }
- Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
+ Ref<Texture2D> handle = get_theme_icon("EditorHandle", "EditorIcons");
if (draw_handles) {
for (int i = 0; i < current_shape.size(); i++) {
workspace_overlay->draw_texture(handle, current_shape[i] * workspace->get_scale().x - handle->get_size() * 0.5);
@@ -1216,10 +1219,31 @@ bool TileSetEditor::is_within_grabbing_distance_of_first_point(const Vector2 &p_
return distance < p_grab_threshold;
}
-void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
+void TileSetEditor::_on_scroll_container_input(const Ref<InputEvent> &p_event) {
+ const Ref<InputEventMouseButton> mb = p_event;
- if (tileset.is_null() || !get_current_texture().is_valid())
+ if (mb.is_valid()) {
+ // Zoom in/out using Ctrl + mouse wheel. This is done on the ScrollContainer
+ // to allow performing this action anywhere, even if the cursor isn't
+ // hovering the texture in the workspace.
+ if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) {
+ print_line("zooming in");
+ _zoom_in();
+ // Don't scroll up after zooming in.
+ accept_event();
+ } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) {
+ print_line("zooming out");
+ _zoom_out();
+ // Don't scroll down after zooming out.
+ accept_event();
+ }
+ }
+}
+
+void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
+ if (tileset.is_null() || !get_current_texture().is_valid()) {
return;
+ }
static bool dragging;
static bool erasing;
@@ -1232,8 +1256,8 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
current_tile_region.position += WORKSPACE_MARGIN;
- Ref<InputEventMouseButton> mb = p_ie;
- Ref<InputEventMouseMotion> mm = p_ie;
+ const Ref<InputEventMouseButton> mb = p_ie;
+ const Ref<InputEventMouseMotion> mm = p_ie;
if (mb.is_valid()) {
if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && !creating_shape) {
@@ -1257,13 +1281,6 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
delete tiles;
}
}
-
- // Mouse Wheel Event
- if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) {
- _zoom_in();
- } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) {
- _zoom_out();
- }
}
// Drag Middle Mouse
if (mm.is_valid()) {
@@ -1618,16 +1635,14 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
if (dragging_point >= 0) {
dragging_point = -1;
- PoolVector<Vector2> polygon;
+ Vector<Vector2> polygon;
polygon.resize(current_shape.size());
- PoolVector<Vector2>::Write w = polygon.write();
+ Vector2 *w = polygon.ptrw();
for (int i = 0; i < current_shape.size(); i++) {
w[i] = current_shape[i] - shape_anchor;
}
- w.release();
-
undo_redo->create_action(TTR("Edit Occlusion Polygon"));
undo_redo->add_do_method(edited_occlusion_shape.ptr(), "set_polygon", polygon);
undo_redo->add_undo_method(edited_occlusion_shape.ptr(), "set_polygon", edited_occlusion_shape->get_polygon());
@@ -1639,18 +1654,16 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
if (dragging_point >= 0) {
dragging_point = -1;
- PoolVector<Vector2> polygon;
+ Vector<Vector2> polygon;
Vector<int> indices;
polygon.resize(current_shape.size());
- PoolVector<Vector2>::Write w = polygon.write();
+ Vector2 *w = polygon.ptrw();
for (int i = 0; i < current_shape.size(); i++) {
w[i] = current_shape[i] - shape_anchor;
indices.push_back(i);
}
- w.release();
-
undo_redo->create_action(TTR("Edit Navigation Polygon"));
undo_redo->add_do_method(edited_navigation_shape.ptr(), "set_vertices", polygon);
undo_redo->add_undo_method(edited_navigation_shape.ptr(), "set_vertices", edited_navigation_shape->get_vertices());
@@ -1677,7 +1690,6 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
pos = snap_point(pos);
if (creating_shape) {
if (current_shape.size() > 2) {
-
if (is_within_grabbing_distance_of_first_point(mb->get_position(), grab_threshold)) {
close_shape(shape_anchor);
workspace->update();
@@ -1727,7 +1739,6 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
} else if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
if (creating_shape) {
-
// if the first two corners are within grabbing distance of one another, expand the rect to fill the tile
if (is_within_grabbing_distance_of_first_point(current_shape[1], grab_threshold)) {
current_shape.set(0, snap_point(shape_anchor));
@@ -1794,13 +1805,13 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
Array sd = tileset->call("tile_get_shapes", get_current_tile());
if (convex.is_valid()) {
- // Make concave
+ // Make concave.
undo_redo->create_action(TTR("Make Polygon Concave"));
Ref<ConcavePolygonShape2D> _concave = memnew(ConcavePolygonShape2D);
edited_collision_shape = _concave;
_set_edited_shape_points(_get_collision_shape_points(convex));
} else if (concave.is_valid()) {
- // Make convex
+ // Make convex.
undo_redo->create_action(TTR("Make Polygon Convex"));
Ref<ConvexPolygonShape2D> _convex = memnew(ConvexPolygonShape2D);
edited_collision_shape = _convex;
@@ -1810,14 +1821,20 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
if (sd[i].get("shape") == previous_shape) {
undo_redo->add_undo_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd.duplicate());
sd.remove(i);
- sd.insert(i, edited_collision_shape);
- undo_redo->add_do_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd);
- undo_redo->add_do_method(this, "_select_edited_shape_coord");
- undo_redo->add_undo_method(this, "_select_edited_shape_coord");
- undo_redo->commit_action();
break;
}
}
+
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd);
+ if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
+ undo_redo->add_do_method(tileset.ptr(), "tile_add_shape", get_current_tile(), edited_collision_shape, Transform2D(), false, edited_shape_coord);
+ } else {
+ undo_redo->add_do_method(tileset.ptr(), "tile_add_shape", get_current_tile(), edited_collision_shape, Transform2D());
+ }
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
+
_update_toggle_shape_button();
workspace->update();
workspace_container->update();
@@ -1911,7 +1928,7 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
}
}
}
- } else if (p_tool == TOOL_SELECT) {
+ } else if (p_tool == TOOL_SELECT || p_tool == SHAPE_NEW_POLYGON || p_tool == SHAPE_NEW_RECTANGLE) {
if (creating_shape) {
// Cancel Creation
creating_shape = false;
@@ -1922,8 +1939,9 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
}
void TileSetEditor::_on_priority_changed(float val) {
- if ((int)val == tileset->autotile_get_subtile_priority(get_current_tile(), edited_shape_coord))
+ if ((int)val == tileset->autotile_get_subtile_priority(get_current_tile(), edited_shape_coord)) {
return;
+ }
undo_redo->create_action(TTR("Edit Tile Priority"));
undo_redo->add_do_method(tileset.ptr(), "autotile_set_subtile_priority", get_current_tile(), edited_shape_coord, (int)val);
@@ -1934,8 +1952,9 @@ void TileSetEditor::_on_priority_changed(float val) {
}
void TileSetEditor::_on_z_index_changed(float val) {
- if ((int)val == tileset->autotile_get_z_index(get_current_tile(), edited_shape_coord))
+ if ((int)val == tileset->autotile_get_z_index(get_current_tile(), edited_shape_coord)) {
return;
+ }
undo_redo->create_action(TTR("Edit Tile Z Index"));
undo_redo->add_do_method(tileset.ptr(), "autotile_set_z_index", get_current_tile(), edited_shape_coord, (int)val);
@@ -1976,26 +1995,24 @@ void TileSetEditor::_set_edited_shape_points(const Vector<Vector2> &points) {
if (convex.is_valid()) {
undo_redo->add_do_method(convex.ptr(), "set_points", points);
undo_redo->add_undo_method(convex.ptr(), "set_points", _get_edited_shape_points());
- } else if (concave.is_valid()) {
- PoolVector2Array segments;
+ } else if (concave.is_valid() && points.size() > 1) {
+ PackedVector2Array segments;
for (int i = 0; i < points.size() - 1; i++) {
segments.push_back(points[i]);
segments.push_back(points[i + 1]);
}
segments.push_back(points[points.size() - 1]);
segments.push_back(points[0]);
- concave->set_segments(segments);
undo_redo->add_do_method(concave.ptr(), "set_segments", segments);
undo_redo->add_undo_method(concave.ptr(), "set_segments", concave->get_segments());
- } else {
- // Invalid shape
}
}
void TileSetEditor::_update_tile_data() {
current_tile_data.clear();
- if (get_current_tile() < 0)
+ if (get_current_tile() < 0) {
return;
+ }
Vector<TileSet::ShapeData> sd = tileset->tile_get_shapes(get_current_tile());
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
@@ -2036,10 +2053,10 @@ void TileSetEditor::_update_toggle_shape_button() {
separator_shape_toggle->hide();
tools[SHAPE_TOGGLE_TYPE]->hide();
} else if (concave.is_valid()) {
- tools[SHAPE_TOGGLE_TYPE]->set_icon(get_icon("ConvexPolygonShape2D", "EditorIcons"));
+ tools[SHAPE_TOGGLE_TYPE]->set_icon(get_theme_icon("ConvexPolygonShape2D", "EditorIcons"));
tools[SHAPE_TOGGLE_TYPE]->set_text(TTR("Make Convex"));
} else if (convex.is_valid()) {
- tools[SHAPE_TOGGLE_TYPE]->set_icon(get_icon("ConcavePolygonShape2D", "EditorIcons"));
+ tools[SHAPE_TOGGLE_TYPE]->set_icon(get_theme_icon("ConcavePolygonShape2D", "EditorIcons"));
tools[SHAPE_TOGGLE_TYPE]->set_text(TTR("Make Concave"));
} else {
// Shouldn't happen
@@ -2339,8 +2356,9 @@ void TileSetEditor::_set_snap_sep(Vector2 p_val) {
}
void TileSetEditor::_validate_current_tile_id() {
- if (get_current_tile() >= 0 && !tileset->has_tile(get_current_tile()))
+ if (get_current_tile() >= 0 && !tileset->has_tile(get_current_tile())) {
set_current_tile(-1);
+ }
}
void TileSetEditor::_select_edited_shape_coord() {
@@ -2367,12 +2385,12 @@ void TileSetEditor::_undo_tile_removal(int p_id) {
undo_redo->add_undo_method(tileset.ptr(), "tile_set_light_occluder", p_id, tileset->tile_get_light_occluder(p_id));
undo_redo->add_undo_method(tileset.ptr(), "tile_set_navigation_polygon", p_id, tileset->tile_get_navigation_polygon(p_id));
} else {
- Map<Vector2, Ref<OccluderPolygon2D> > oclusion_map = tileset->autotile_get_light_oclusion_map(p_id);
- for (Map<Vector2, Ref<OccluderPolygon2D> >::Element *E = oclusion_map.front(); E; E = E->next()) {
+ Map<Vector2, Ref<OccluderPolygon2D>> oclusion_map = tileset->autotile_get_light_oclusion_map(p_id);
+ for (Map<Vector2, Ref<OccluderPolygon2D>>::Element *E = oclusion_map.front(); E; E = E->next()) {
undo_redo->add_undo_method(tileset.ptr(), "autotile_set_light_occluder", p_id, E->value(), E->key());
}
- Map<Vector2, Ref<NavigationPolygon> > navigation_map = tileset->autotile_get_navigation_map(p_id);
- for (Map<Vector2, Ref<NavigationPolygon> >::Element *E = navigation_map.front(); E; E = E->next()) {
+ Map<Vector2, Ref<NavigationPolygon>> navigation_map = tileset->autotile_get_navigation_map(p_id);
+ for (Map<Vector2, Ref<NavigationPolygon>>::Element *E = navigation_map.front(); E; E = E->next()) {
undo_redo->add_undo_method(tileset.ptr(), "autotile_set_navigation_polygon", p_id, E->value(), E->key());
}
Map<Vector2, uint32_t> bitmask_map = tileset->autotile_get_bitmask_map(p_id);
@@ -2404,6 +2422,7 @@ void TileSetEditor::_zoom_in() {
workspace_overlay->set_custom_minimum_size(workspace->get_rect().size * scale);
}
}
+
void TileSetEditor::_zoom_out() {
float scale = workspace->get_scale().x;
if (scale > min_scale) {
@@ -2413,6 +2432,7 @@ void TileSetEditor::_zoom_out() {
workspace_overlay->set_custom_minimum_size(workspace->get_rect().size * scale);
}
}
+
void TileSetEditor::_zoom_reset() {
workspace->set_scale(Vector2(1, 1));
workspace_container->set_custom_minimum_size(workspace->get_rect().size);
@@ -2420,7 +2440,6 @@ void TileSetEditor::_zoom_reset() {
}
void TileSetEditor::draw_highlight_current_tile() {
-
Color shadow_color = Color(0.3, 0.3, 0.3, 0.3);
if ((workspace_mode == WORKSPACE_EDIT && get_current_tile() >= 0) || !edited_region.has_no_area()) {
Rect2 region;
@@ -2431,21 +2450,24 @@ void TileSetEditor::draw_highlight_current_tile() {
region = edited_region;
}
- if (region.position.y >= 0)
+ if (region.position.y >= 0) {
workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, region.position.y), shadow_color);
- if (region.position.x >= 0)
+ }
+ if (region.position.x >= 0) {
workspace->draw_rect(Rect2(0, MAX(0, region.position.y), region.position.x, MIN(workspace->get_rect().size.y - region.position.y, MIN(region.size.y, region.position.y + region.size.y))), shadow_color);
- if (region.position.x + region.size.x <= workspace->get_rect().size.x)
+ }
+ if (region.position.x + region.size.x <= workspace->get_rect().size.x) {
workspace->draw_rect(Rect2(region.position.x + region.size.x, MAX(0, region.position.y), workspace->get_rect().size.x - region.position.x - region.size.x, MIN(workspace->get_rect().size.y - region.position.y, MIN(region.size.y, region.position.y + region.size.y))), shadow_color);
- if (region.position.y + region.size.y <= workspace->get_rect().size.y)
+ }
+ if (region.position.y + region.size.y <= workspace->get_rect().size.y) {
workspace->draw_rect(Rect2(0, region.position.y + region.size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - region.size.y - region.position.y), shadow_color);
+ }
} else {
workspace->draw_rect(Rect2(Point2(0, 0), workspace->get_rect().size), shadow_color);
}
}
void TileSetEditor::draw_highlight_subtile(Vector2 coord, const Vector<Vector2> &other_highlighted) {
-
Color shadow_color = Color(0.3, 0.3, 0.3, 0.3);
Vector2 size = tileset->autotile_get_size(get_current_tile());
int spacing = tileset->autotile_get_spacing(get_current_tile());
@@ -2455,14 +2477,18 @@ void TileSetEditor::draw_highlight_subtile(Vector2 coord, const Vector<Vector2>
coord += region.position;
coord += WORKSPACE_MARGIN;
- if (coord.y >= 0)
+ if (coord.y >= 0) {
workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, coord.y), shadow_color);
- if (coord.x >= 0)
+ }
+ if (coord.x >= 0) {
workspace->draw_rect(Rect2(0, MAX(0, coord.y), coord.x, MIN(workspace->get_rect().size.y - coord.y, MIN(size.y, coord.y + size.y))), shadow_color);
- if (coord.x + size.x <= workspace->get_rect().size.x)
+ }
+ if (coord.x + size.x <= workspace->get_rect().size.x) {
workspace->draw_rect(Rect2(coord.x + size.x, MAX(0, coord.y), workspace->get_rect().size.x - coord.x - size.x, MIN(workspace->get_rect().size.y - coord.y, MIN(size.y, coord.y + size.y))), shadow_color);
- if (coord.y + size.y <= workspace->get_rect().size.y)
+ }
+ if (coord.y + size.y <= workspace->get_rect().size.y) {
workspace->draw_rect(Rect2(0, coord.y + size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - size.y - coord.y), shadow_color);
+ }
coord += Vector2(1, 1) / workspace->get_scale().x;
workspace->draw_rect(Rect2(coord, size - Vector2(2, 2) / workspace->get_scale().x), Color(1, 0, 0), false);
@@ -2595,10 +2621,10 @@ void TileSetEditor::draw_grid_snap() {
}
void TileSetEditor::draw_polygon_shapes() {
-
int t_id = get_current_tile();
- if (t_id < 0)
+ if (t_id < 0) {
return;
+ }
switch (edit_mode) {
case EDITMODE_COLLISION: {
@@ -2654,17 +2680,18 @@ void TileSetEditor::draw_polygon_shapes() {
}
}
- if (polygon.size() < 3)
+ if (polygon.size() < 3) {
continue;
+ }
workspace->draw_polygon(polygon, colors);
if (coord == edited_shape_coord || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
- if (!creating_shape) {
+ if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) {
- workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
}
- workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1);
}
if (shape == edited_collision_shape) {
draw_handles = true;
@@ -2697,21 +2724,19 @@ void TileSetEditor::draw_polygon_shapes() {
}
workspace->draw_polygon(polygon, colors);
- if (!creating_shape) {
- if (polygon.size() > 1) {
- for (int j = 0; j < polygon.size() - 1; j++) {
- workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
- }
- workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
+ if (!creating_shape && polygon.size() > 1) {
+ for (int j = 0; j < polygon.size() - 1; j++) {
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
}
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1);
}
if (shape == edited_occlusion_shape) {
draw_handles = true;
}
}
} else {
- Map<Vector2, Ref<OccluderPolygon2D> > map = tileset->autotile_get_light_oclusion_map(t_id);
- for (Map<Vector2, Ref<OccluderPolygon2D> >::Element *E = map.front(); E; E = E->next()) {
+ Map<Vector2, Ref<OccluderPolygon2D>> map = tileset->autotile_get_light_oclusion_map(t_id);
+ for (Map<Vector2, Ref<OccluderPolygon2D>>::Element *E = map.front(); E; E = E->next()) {
Vector2 coord = E->key();
Vector2 anchor = tileset->autotile_get_size(t_id);
anchor.x += tileset->autotile_get_spacing(t_id);
@@ -2747,11 +2772,11 @@ void TileSetEditor::draw_polygon_shapes() {
workspace->draw_polygon(polygon, colors);
if (coord == edited_shape_coord) {
- if (!creating_shape) {
+ if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) {
- workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
}
- workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1);
}
if (shape == edited_occlusion_shape) {
draw_handles = true;
@@ -2779,7 +2804,7 @@ void TileSetEditor::draw_polygon_shapes() {
colors.push_back(c_bg);
}
} else {
- PoolVector<Vector2> vertices = shape->get_vertices();
+ Vector<Vector2> vertices = shape->get_vertices();
for (int j = 0; j < shape->get_polygon(0).size(); j++) {
polygon.push_back(vertices[shape->get_polygon(0)[j]] + anchor);
colors.push_back(c_bg);
@@ -2787,19 +2812,19 @@ void TileSetEditor::draw_polygon_shapes() {
}
workspace->draw_polygon(polygon, colors);
- if (!creating_shape) {
+ if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) {
- workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
}
- workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1);
}
if (shape == edited_navigation_shape) {
draw_handles = true;
}
}
} else {
- Map<Vector2, Ref<NavigationPolygon> > map = tileset->autotile_get_navigation_map(t_id);
- for (Map<Vector2, Ref<NavigationPolygon> >::Element *E = map.front(); E; E = E->next()) {
+ Map<Vector2, Ref<NavigationPolygon>> map = tileset->autotile_get_navigation_map(t_id);
+ for (Map<Vector2, Ref<NavigationPolygon>>::Element *E = map.front(); E; E = E->next()) {
Vector2 coord = E->key();
Vector2 anchor = tileset->autotile_get_size(t_id);
anchor.x += tileset->autotile_get_spacing(t_id);
@@ -2827,7 +2852,7 @@ void TileSetEditor::draw_polygon_shapes() {
colors.push_back(c_bg);
}
} else {
- PoolVector<Vector2> vertices = shape->get_vertices();
+ Vector<Vector2> vertices = shape->get_vertices();
for (int j = 0; j < shape->get_polygon(0).size(); j++) {
polygon.push_back(vertices[shape->get_polygon(0)[j]] + anchor);
colors.push_back(c_bg);
@@ -2836,11 +2861,11 @@ void TileSetEditor::draw_polygon_shapes() {
workspace->draw_polygon(polygon, colors);
if (coord == edited_shape_coord) {
- if (!creating_shape) {
+ if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) {
- workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
}
- workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1);
}
if (shape == edited_navigation_shape) {
draw_handles = true;
@@ -2854,17 +2879,16 @@ void TileSetEditor::draw_polygon_shapes() {
}
}
- if (creating_shape) {
+ if (creating_shape && current_shape.size() > 1) {
for (int j = 0; j < current_shape.size() - 1; j++) {
- workspace->draw_line(current_shape[j], current_shape[j + 1], Color(0, 1, 1), 1, true);
+ workspace->draw_line(current_shape[j], current_shape[j + 1], Color(0, 1, 1), 1);
}
- workspace->draw_line(current_shape[current_shape.size() - 1], snap_point(workspace->get_local_mouse_position()), Color(0, 1, 1), 1, true);
+ workspace->draw_line(current_shape[current_shape.size() - 1], snap_point(workspace->get_local_mouse_position()), Color(0, 1, 1), 1);
draw_handles = true;
}
}
void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
-
creating_shape = false;
if (edit_mode == EDITMODE_COLLISION) {
@@ -2877,14 +2901,16 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
for (int i = 0; i < current_shape.size(); i++) {
points.push_back(current_shape[i] - shape_anchor);
- if (i != current_shape.size() - 1)
+ if (i != current_shape.size() - 1) {
p_total += ((current_shape[i + 1].x - current_shape[i].x) * (-current_shape[i + 1].y + (-current_shape[i].y)));
- else
+ } else {
p_total += ((current_shape[0].x - current_shape[i].x) * (-current_shape[0].y + (-current_shape[i].y)));
+ }
}
- if (p_total < 0)
+ if (p_total < 0) {
points.invert();
+ }
shape->set_points(points);
@@ -2899,10 +2925,11 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
}
}
undo_redo->add_do_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd);
- if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE)
+ if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
undo_redo->add_do_method(tileset.ptr(), "tile_add_shape", get_current_tile(), shape, Transform2D(), false, edited_shape_coord);
- else
+ } else {
undo_redo->add_do_method(tileset.ptr(), "tile_add_shape", get_current_tile(), shape, Transform2D());
+ }
tools[TOOL_SELECT]->set_pressed(true);
undo_redo->add_do_method(this, "_select_edited_shape_coord");
undo_redo->add_undo_method(this, "_select_edited_shape_coord");
@@ -2914,15 +2941,14 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
} else if (edit_mode == EDITMODE_OCCLUSION) {
Ref<OccluderPolygon2D> shape = memnew(OccluderPolygon2D);
- PoolVector<Vector2> polygon;
+ Vector<Vector2> polygon;
polygon.resize(current_shape.size());
- PoolVector<Vector2>::Write w = polygon.write();
+ Vector2 *w = polygon.ptrw();
for (int i = 0; i < current_shape.size(); i++) {
w[i] = current_shape[i] - shape_anchor;
}
- w.release();
shape->set_polygon(polygon);
undo_redo->create_action(TTR("Create Occlusion Polygon"));
@@ -2940,17 +2966,16 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
} else if (edit_mode == EDITMODE_NAVIGATION) {
Ref<NavigationPolygon> shape = memnew(NavigationPolygon);
- PoolVector<Vector2> polygon;
+ Vector<Vector2> polygon;
Vector<int> indices;
polygon.resize(current_shape.size());
- PoolVector<Vector2>::Write w = polygon.write();
+ Vector2 *w = polygon.ptrw();
for (int i = 0; i < current_shape.size(); i++) {
w[i] = current_shape[i] - shape_anchor;
indices.push_back(i);
}
- w.release();
shape->set_vertices(polygon);
shape->add_polygon(indices);
@@ -2972,18 +2997,22 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
void TileSetEditor::select_coord(const Vector2 &coord) {
_update_tile_data();
- current_shape = PoolVector2Array();
- if (get_current_tile() == -1)
+ current_shape = PackedVector2Array();
+ if (get_current_tile() == -1) {
return;
+ }
Rect2 current_tile_region = tileset->tile_get_region(get_current_tile());
current_tile_region.position += WORKSPACE_MARGIN;
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
- if (edited_collision_shape != tileset->tile_get_shape(get_current_tile(), 0))
+ if (edited_collision_shape != tileset->tile_get_shape(get_current_tile(), 0)) {
_set_edited_collision_shape(tileset->tile_get_shape(get_current_tile(), 0));
- if (edited_occlusion_shape != tileset->tile_get_light_occluder(get_current_tile()))
+ }
+ if (edited_occlusion_shape != tileset->tile_get_light_occluder(get_current_tile())) {
edited_occlusion_shape = tileset->tile_get_light_occluder(get_current_tile());
- if (edited_navigation_shape != tileset->tile_get_navigation_polygon(get_current_tile()))
+ }
+ if (edited_navigation_shape != tileset->tile_get_navigation_polygon(get_current_tile())) {
edited_navigation_shape = tileset->tile_get_navigation_polygon(get_current_tile());
+ }
if (edit_mode == EDITMODE_COLLISION) {
current_shape.resize(0);
@@ -3003,7 +3032,7 @@ void TileSetEditor::select_coord(const Vector2 &coord) {
current_shape.resize(0);
if (edited_navigation_shape.is_valid()) {
if (edited_navigation_shape->get_polygon_count() > 0) {
- PoolVector<Vector2> vertices = edited_navigation_shape->get_vertices();
+ Vector<Vector2> vertices = edited_navigation_shape->get_vertices();
for (int i = 0; i < edited_navigation_shape->get_polygon(0).size(); i++) {
current_shape.push_back(vertices[edited_navigation_shape->get_polygon(0)[i]] + current_tile_region.position);
}
@@ -3015,18 +3044,22 @@ void TileSetEditor::select_coord(const Vector2 &coord) {
bool found_collision_shape = false;
for (int i = 0; i < sd.size(); i++) {
if (sd[i].autotile_coord == coord) {
- if (edited_collision_shape != sd[i].shape)
+ if (edited_collision_shape != sd[i].shape) {
_set_edited_collision_shape(sd[i].shape);
+ }
found_collision_shape = true;
break;
}
}
- if (!found_collision_shape)
- _set_edited_collision_shape(Ref<ConvexPolygonShape2D>(NULL));
- if (edited_occlusion_shape != tileset->autotile_get_light_occluder(get_current_tile(), coord))
+ if (!found_collision_shape) {
+ _set_edited_collision_shape(Ref<ConvexPolygonShape2D>(nullptr));
+ }
+ if (edited_occlusion_shape != tileset->autotile_get_light_occluder(get_current_tile(), coord)) {
edited_occlusion_shape = tileset->autotile_get_light_occluder(get_current_tile(), coord);
- if (edited_navigation_shape != tileset->autotile_get_navigation_polygon(get_current_tile(), coord))
+ }
+ if (edited_navigation_shape != tileset->autotile_get_navigation_polygon(get_current_tile(), coord)) {
edited_navigation_shape = tileset->autotile_get_navigation_polygon(get_current_tile(), coord);
+ }
int spacing = tileset->autotile_get_spacing(get_current_tile());
Vector2 size = tileset->autotile_get_size(get_current_tile());
@@ -3052,7 +3085,7 @@ void TileSetEditor::select_coord(const Vector2 &coord) {
current_shape.resize(0);
if (edited_navigation_shape.is_valid()) {
if (edited_navigation_shape->get_polygon_count() > 0) {
- PoolVector<Vector2> vertices = edited_navigation_shape->get_vertices();
+ Vector<Vector2> vertices = edited_navigation_shape->get_vertices();
for (int i = 0; i < edited_navigation_shape->get_polygon(0).size(); i++) {
current_shape.push_back(vertices[edited_navigation_shape->get_polygon(0)[i]] + shape_anchor);
}
@@ -3076,6 +3109,7 @@ Vector2 TileSetEditor::snap_point(const Vector2 &point) {
anchor += tileset->tile_get_region(get_current_tile()).position;
anchor += WORKSPACE_MARGIN;
Rect2 region(anchor, tile_size);
+ Rect2 tile_region(tileset->tile_get_region(get_current_tile()).position + WORKSPACE_MARGIN, tileset->tile_get_region(get_current_tile()).size);
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
region.position = tileset->tile_get_region(get_current_tile()).position + WORKSPACE_MARGIN;
region.size = tileset->tile_get_region(get_current_tile()).size;
@@ -3085,26 +3119,45 @@ Vector2 TileSetEditor::snap_point(const Vector2 &point) {
p.x = Math::snap_scalar_separation(snap_offset.x, snap_step.x, p.x, snap_separation.x);
p.y = Math::snap_scalar_separation(snap_offset.y, snap_step.y, p.y, snap_separation.y);
}
+
if (tools[SHAPE_KEEP_INSIDE_TILE]->is_pressed()) {
- if (p.x < region.position.x)
+ if (p.x < region.position.x) {
p.x = region.position.x;
- if (p.y < region.position.y)
+ }
+ if (p.y < region.position.y) {
p.y = region.position.y;
- if (p.x > region.position.x + region.size.x)
+ }
+ if (p.x > region.position.x + region.size.x) {
p.x = region.position.x + region.size.x;
- if (p.y > region.position.y + region.size.y)
+ }
+ if (p.y > region.position.y + region.size.y) {
p.y = region.position.y + region.size.y;
+ }
+ }
+
+ if (p.x < tile_region.position.x) {
+ p.x = tile_region.position.x;
+ }
+ if (p.y < tile_region.position.y) {
+ p.y = tile_region.position.y;
+ }
+ if (p.x > (tile_region.position.x + tile_region.size.x)) {
+ p.x = (tile_region.position.x + tile_region.size.x);
}
+ if (p.y > (tile_region.position.y + tile_region.size.y)) {
+ p.y = (tile_region.position.y + tile_region.size.y);
+ }
+
return p;
}
-void TileSetEditor::add_texture(Ref<Texture> p_texture) {
+void TileSetEditor::add_texture(Ref<Texture2D> p_texture) {
texture_list->add_item(p_texture->get_path().get_file());
texture_map.insert(p_texture->get_rid(), p_texture);
texture_list->set_item_metadata(texture_list->get_item_count() - 1, p_texture->get_rid());
}
-void TileSetEditor::remove_texture(Ref<Texture> p_texture) {
+void TileSetEditor::remove_texture(Ref<Texture2D> p_texture) {
texture_list->remove_item(texture_list->find_metadata(p_texture->get_rid()));
texture_map.erase(p_texture->get_rid());
@@ -3117,7 +3170,7 @@ void TileSetEditor::remove_texture(Ref<Texture> p_texture) {
}
void TileSetEditor::update_texture_list() {
- Ref<Texture> selected_texture = get_current_texture();
+ Ref<Texture2D> selected_texture = get_current_texture();
helper->set_tileset(tileset);
@@ -3141,8 +3194,9 @@ void TileSetEditor::update_texture_list() {
if (texture_list->get_item_count() > 0 && selected_texture.is_valid()) {
texture_list->select(texture_list->find_metadata(selected_texture->get_rid()));
- if (texture_list->get_selected_items().size() > 0)
+ if (texture_list->get_selected_items().size() > 0) {
_on_texture_list_selected(texture_list->get_selected_items()[0]);
+ }
} else if (get_current_texture().is_valid()) {
_on_texture_list_selected(texture_list->find_metadata(get_current_texture()->get_rid()));
} else {
@@ -3155,7 +3209,6 @@ void TileSetEditor::update_texture_list() {
}
void TileSetEditor::update_texture_list_icon() {
-
for (int current_idx = 0; current_idx < texture_list->get_item_count(); current_idx++) {
RID rid = texture_list->get_item_metadata(current_idx);
texture_list->set_item_icon(current_idx, texture_map[rid]);
@@ -3166,7 +3219,6 @@ void TileSetEditor::update_texture_list_icon() {
}
void TileSetEditor::update_workspace_tile_mode() {
-
if (!get_current_texture().is_valid()) {
tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
workspace_mode = WORKSPACE_EDIT;
@@ -3242,19 +3294,21 @@ void TileSetEditor::update_workspace_tile_mode() {
tool_editmode[EDITMODE_PRIORITY]->hide();
tool_editmode[EDITMODE_Z_INDEX]->hide();
} else if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE) {
- if (edit_mode == EDITMODE_ICON)
+ if (edit_mode == EDITMODE_ICON) {
select_coord(tileset->autotile_get_icon_coordinate(get_current_tile()));
- else
+ } else {
_select_edited_shape_coord();
+ }
} else if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
if (tool_editmode[EDITMODE_PRIORITY]->is_pressed() || tool_editmode[EDITMODE_BITMASK]->is_pressed()) {
tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
edit_mode = EDITMODE_COLLISION;
}
- if (edit_mode == EDITMODE_ICON)
+ if (edit_mode == EDITMODE_ICON) {
select_coord(tileset->autotile_get_icon_coordinate(get_current_tile()));
- else
+ } else {
_select_edited_shape_coord();
+ }
tool_editmode[EDITMODE_BITMASK]->hide();
}
@@ -3326,15 +3380,15 @@ void TileSetEditor::set_current_tile(int p_id) {
}
}
-Ref<Texture> TileSetEditor::get_current_texture() {
- if (texture_list->get_selected_items().size() == 0)
- return Ref<Texture>();
- else
+Ref<Texture2D> TileSetEditor::get_current_texture() {
+ if (texture_list->get_selected_items().size() == 0) {
+ return Ref<Texture2D>();
+ } else {
return texture_map[texture_list->get_item_metadata(texture_list->get_selected_items()[0])];
+ }
}
void TilesetEditorContext::set_tileset(const Ref<TileSet> &p_tileset) {
-
tileset = p_tileset;
}
@@ -3344,7 +3398,6 @@ void TilesetEditorContext::set_snap_options_visible(bool p_visible) {
}
bool TilesetEditorContext::_set(const StringName &p_name, const Variant &p_value) {
-
String name = p_name.operator String();
if (name == "options_offset") {
@@ -3363,8 +3416,9 @@ bool TilesetEditorContext::_set(const StringName &p_name, const Variant &p_value
String name2 = p_name.operator String().right(5);
bool v = false;
- if (tileset_editor->get_current_tile() < 0 || tileset.is_null())
+ if (tileset_editor->get_current_tile() < 0 || tileset.is_null()) {
return false;
+ }
if (name2 == "autotile_bitmask_mode") {
tileset->set(String::num(tileset_editor->get_current_tile(), 0) + "/autotile/bitmask_mode", p_value, &v);
@@ -3410,7 +3464,6 @@ bool TilesetEditorContext::_set(const StringName &p_name, const Variant &p_value
}
bool TilesetEditorContext::_get(const StringName &p_name, Variant &r_ret) const {
-
String name = p_name.operator String();
bool v = false;
@@ -3426,10 +3479,12 @@ bool TilesetEditorContext::_get(const StringName &p_name, Variant &r_ret) const
} else if (name.left(5) == "tile_") {
name = name.right(5);
- if (tileset_editor->get_current_tile() < 0 || tileset.is_null())
+ if (tileset_editor->get_current_tile() < 0 || tileset.is_null()) {
return false;
- if (!tileset->has_tile(tileset_editor->get_current_tile()))
+ }
+ if (!tileset->has_tile(tileset_editor->get_current_tile())) {
return false;
+ }
if (name == "autotile_bitmask_mode") {
r_ret = tileset->get(String::num(tileset_editor->get_current_tile(), 0) + "/autotile/bitmask_mode", &v);
@@ -3476,7 +3531,6 @@ bool TilesetEditorContext::_get(const StringName &p_name, Variant &r_ret) const
}
void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const {
-
if (snap_options_visible) {
p_list->push_back(PropertyInfo(Variant::NIL, "Snap Options", PROPERTY_HINT_NONE, "options_", PROPERTY_USAGE_GROUP));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "options_offset"));
@@ -3487,7 +3541,7 @@ void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const
int id = tileset_editor->get_current_tile();
p_list->push_back(PropertyInfo(Variant::NIL, "Selected Tile", PROPERTY_HINT_NONE, "tile_", PROPERTY_USAGE_GROUP));
p_list->push_back(PropertyInfo(Variant::STRING, "tile_name"));
- p_list->push_back(PropertyInfo(Variant::OBJECT, "tile_normal_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture"));
+ p_list->push_back(PropertyInfo(Variant::OBJECT, "tile_normal_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "tile_tex_offset"));
p_list->push_back(PropertyInfo(Variant::OBJECT, "tile_material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial"));
p_list->push_back(PropertyInfo(Variant::COLOR, "tile_modulate"));
@@ -3504,13 +3558,13 @@ void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const
p_list->push_back(PropertyInfo(Variant::VECTOR2, "tile_navigation_offset"));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "tile_shape_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "tile_shape_transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR));
- p_list->push_back(PropertyInfo(Variant::INT, "tile_z_index", PROPERTY_HINT_RANGE, itos(VS::CANVAS_ITEM_Z_MIN) + "," + itos(VS::CANVAS_ITEM_Z_MAX) + ",1"));
+ p_list->push_back(PropertyInfo(Variant::INT, "tile_z_index", PROPERTY_HINT_RANGE, itos(RS::CANVAS_ITEM_Z_MIN) + "," + itos(RS::CANVAS_ITEM_Z_MAX) + ",1"));
}
if (tileset_editor->edit_mode == TileSetEditor::EDITMODE_COLLISION && tileset_editor->edited_collision_shape.is_valid()) {
p_list->push_back(PropertyInfo(Variant::OBJECT, "selected_collision", PROPERTY_HINT_RESOURCE_TYPE, tileset_editor->edited_collision_shape->get_class()));
if (tileset_editor->edited_collision_shape.is_valid()) {
p_list->push_back(PropertyInfo(Variant::BOOL, "selected_collision_one_way", PROPERTY_HINT_NONE));
- p_list->push_back(PropertyInfo(Variant::REAL, "selected_collision_one_way_margin", PROPERTY_HINT_NONE));
+ p_list->push_back(PropertyInfo(Variant::FLOAT, "selected_collision_one_way_margin", PROPERTY_HINT_NONE));
}
}
if (tileset_editor->edit_mode == TileSetEditor::EDITMODE_NAVIGATION && tileset_editor->edited_navigation_shape.is_valid()) {
@@ -3525,25 +3579,21 @@ void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const
}
void TilesetEditorContext::_bind_methods() {
-
ClassDB::bind_method("_hide_script_from_inspector", &TilesetEditorContext::_hide_script_from_inspector);
}
TilesetEditorContext::TilesetEditorContext(TileSetEditor *p_tileset_editor) {
-
tileset_editor = p_tileset_editor;
snap_options_visible = false;
}
void TileSetEditorPlugin::edit(Object *p_node) {
-
if (Object::cast_to<TileSet>(p_node)) {
tileset_editor->edit(Object::cast_to<TileSet>(p_node));
}
}
bool TileSetEditorPlugin::handles(Object *p_node) const {
-
return p_node->is_class("TileSet") || p_node->is_class("TilesetEditorContext");
}
@@ -3551,16 +3601,15 @@ void TileSetEditorPlugin::make_visible(bool p_visible) {
if (p_visible) {
tileset_editor_button->show();
editor->make_bottom_panel_item_visible(tileset_editor);
- get_tree()->connect("idle_frame", tileset_editor, "_on_workspace_process");
+ get_tree()->connect_compat("idle_frame", tileset_editor, "_on_workspace_process");
} else {
editor->hide_bottom_panel();
tileset_editor_button->hide();
- get_tree()->disconnect("idle_frame", tileset_editor, "_on_workspace_process");
+ get_tree()->disconnect_compat("idle_frame", tileset_editor, "_on_workspace_process");
}
}
Dictionary TileSetEditorPlugin::get_state() const {
-
Dictionary state;
state["snap_offset"] = tileset_editor->snap_offset;
state["snap_step"] = tileset_editor->snap_step;
@@ -3572,7 +3621,6 @@ Dictionary TileSetEditorPlugin::get_state() const {
}
void TileSetEditorPlugin::set_state(const Dictionary &p_state) {
-
Dictionary state = p_state;
if (state.has("snap_step")) {
tileset_editor->_set_snap_step(state["snap_step"]);
diff --git a/editor/plugins/tile_set_editor_plugin.h b/editor/plugins/tile_set_editor_plugin.h
index 0e0bd6448c..72eb14941c 100644
--- a/editor/plugins/tile_set_editor_plugin.h
+++ b/editor/plugins/tile_set_editor_plugin.h
@@ -32,7 +32,7 @@
#define TILE_SET_EDITOR_PLUGIN_H
#include "editor/editor_node.h"
-#include "scene/2d/sprite.h"
+#include "scene/2d/sprite_2d.h"
#include "scene/resources/concave_polygon_shape_2d.h"
#include "scene/resources/convex_polygon_shape_2d.h"
#include "scene/resources/tile_set.h"
@@ -41,13 +41,12 @@
class TilesetEditorContext;
class TileSetEditor : public HSplitContainer {
-
friend class TileSetEditorPlugin;
friend class TilesetEditorContext;
GDCLASS(TileSetEditor, HSplitContainer);
- enum TextureToolButtons {
+ enum TextureButtons {
TOOL_TILESET_ADD_TEXTURE,
TOOL_TILESET_REMOVE_TEXTURE,
TOOL_TILESET_CREATE_SCENE,
@@ -112,9 +111,9 @@ class TileSetEditor : public HSplitContainer {
ItemList *texture_list;
int option;
- ToolButton *tileset_toolbar_buttons[TOOL_TILESET_MAX];
+ Button *tileset_toolbar_buttons[TOOL_TILESET_MAX];
MenuButton *tileset_toolbar_tools;
- Map<RID, Ref<Texture> > texture_map;
+ Map<RID, Ref<Texture2D>> texture_map;
bool creating_shape;
int dragging_point;
@@ -123,7 +122,7 @@ class TileSetEditor : public HSplitContainer {
Rect2 edited_region;
bool draw_edited_region;
Vector2 edited_shape_coord;
- PoolVector2Array current_shape;
+ PackedVector2Array current_shape;
Map<Vector2i, SubtileData> current_tile_data;
Map<Vector2, uint32_t> bitmask_map_copy;
@@ -136,7 +135,7 @@ class TileSetEditor : public HSplitContainer {
Ref<NavigationPolygon> edited_navigation_shape;
int current_item_index;
- Sprite *preview;
+ Sprite2D *preview;
ScrollContainer *scroll;
Label *empty_message;
Control *workspace_container;
@@ -147,7 +146,7 @@ class TileSetEditor : public HSplitContainer {
Button *tool_editmode[EDITMODE_MAX];
HSeparator *separator_editmode;
HBoxContainer *toolbar;
- ToolButton *tools[TOOL_MAX];
+ Button *tools[TOOL_MAX];
VSeparator *separator_shape_toggle;
VSeparator *separator_bitmask;
VSeparator *separator_delete;
@@ -165,10 +164,10 @@ class TileSetEditor : public HSplitContainer {
void update_texture_list();
void update_texture_list_icon();
- void add_texture(Ref<Texture> p_texture);
- void remove_texture(Ref<Texture> p_texture);
+ void add_texture(Ref<Texture2D> p_texture);
+ void remove_texture(Ref<Texture2D> p_texture);
- Ref<Texture> get_current_texture();
+ Ref<Texture2D> get_current_texture();
static void _import_node(Node *p_node, Ref<TileSet> p_library);
static void _import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_merge);
@@ -178,7 +177,7 @@ class TileSetEditor : public HSplitContainer {
Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
- void _file_load_request(const PoolVector<String> &p_path, int p_at_pos = -1);
+ void _file_load_request(const Vector<String> &p_path, int p_at_pos = -1);
protected:
static void _bind_methods();
@@ -195,12 +194,13 @@ private:
void _on_tileset_toolbar_button_pressed(int p_index);
void _on_tileset_toolbar_confirm();
void _on_texture_list_selected(int p_index);
- void _on_textures_added(const PoolStringArray &p_paths);
+ void _on_textures_added(const PackedStringArray &p_paths);
void _on_edit_mode_changed(int p_edit_mode);
void _on_workspace_mode_changed(int p_workspace_mode);
void _on_workspace_overlay_draw();
void _on_workspace_draw();
void _on_workspace_process();
+ void _on_scroll_container_input(const Ref<InputEvent> &p_event);
void _on_workspace_input(const Ref<InputEvent> &p_ie);
void _on_tool_clicked(int p_tool);
void _on_priority_changed(float val);
@@ -252,7 +252,6 @@ private:
};
class TilesetEditorContext : public Object {
-
friend class TileSetEditor;
GDCLASS(TilesetEditorContext, Object);
@@ -278,7 +277,6 @@ public:
};
class TileSetEditorPlugin : public EditorPlugin {
-
GDCLASS(TileSetEditorPlugin, EditorPlugin);
TileSetEditor *tileset_editor;
@@ -286,13 +284,13 @@ class TileSetEditorPlugin : public EditorPlugin {
EditorNode *editor;
public:
- virtual String get_name() const { return "TileSet"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_node);
- virtual bool handles(Object *p_node) const;
- virtual void make_visible(bool p_visible);
- void set_state(const Dictionary &p_state);
- Dictionary get_state() const;
+ virtual String get_name() const override { return "TileSet"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_node) override;
+ virtual bool handles(Object *p_node) const override;
+ virtual void make_visible(bool p_visible) override;
+ void set_state(const Dictionary &p_state) override;
+ Dictionary get_state() const override;
TileSetEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp
index c53fc7e6c5..cfbe54ef61 100644
--- a/editor/plugins/version_control_editor_plugin.cpp
+++ b/editor/plugins/version_control_editor_plugin.cpp
@@ -35,18 +35,9 @@
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
-VersionControlEditorPlugin *VersionControlEditorPlugin::singleton = NULL;
+VersionControlEditorPlugin *VersionControlEditorPlugin::singleton = nullptr;
void VersionControlEditorPlugin::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_selected_a_vcs"), &VersionControlEditorPlugin::_selected_a_vcs);
- ClassDB::bind_method(D_METHOD("_initialize_vcs"), &VersionControlEditorPlugin::_initialize_vcs);
- ClassDB::bind_method(D_METHOD("_send_commit_msg"), &VersionControlEditorPlugin::_send_commit_msg);
- ClassDB::bind_method(D_METHOD("_refresh_stage_area"), &VersionControlEditorPlugin::_refresh_stage_area);
- ClassDB::bind_method(D_METHOD("_stage_all"), &VersionControlEditorPlugin::_stage_all);
- ClassDB::bind_method(D_METHOD("_stage_selected"), &VersionControlEditorPlugin::_stage_selected);
- ClassDB::bind_method(D_METHOD("_view_file_diff"), &VersionControlEditorPlugin::_view_file_diff);
- ClassDB::bind_method(D_METHOD("_refresh_file_diff"), &VersionControlEditorPlugin::_refresh_file_diff);
ClassDB::bind_method(D_METHOD("popup_vcs_set_up_dialog"), &VersionControlEditorPlugin::popup_vcs_set_up_dialog);
// Used to track the status of files in the staging area
@@ -58,20 +49,16 @@ void VersionControlEditorPlugin::_bind_methods() {
}
void VersionControlEditorPlugin::_selected_a_vcs(int p_id) {
-
List<StringName> available_addons = get_available_vcs_names();
const StringName selected_vcs = set_up_choice->get_item_text(p_id);
}
void VersionControlEditorPlugin::_populate_available_vcs_names() {
-
static bool called = false;
if (!called) {
-
List<StringName> available_addons = get_available_vcs_names();
for (int i = 0; i < available_addons.size(); i++) {
-
set_up_choice->add_item(available_addons[i]);
}
@@ -80,16 +67,13 @@ void VersionControlEditorPlugin::_populate_available_vcs_names() {
}
VersionControlEditorPlugin *VersionControlEditorPlugin::get_singleton() {
-
return singleton ? singleton : memnew(VersionControlEditorPlugin);
}
void VersionControlEditorPlugin::popup_vcs_set_up_dialog(const Control *p_gui_base) {
-
fetch_available_vcs_addon_names();
List<StringName> available_addons = get_available_vcs_names();
if (available_addons.size() >= 1) {
-
Size2 popup_size = Size2(400, 100);
Size2 window_size = p_gui_base->get_viewport_rect().size;
popup_size.x = MIN(window_size.x * 0.5, popup_size.x);
@@ -99,13 +83,11 @@ void VersionControlEditorPlugin::popup_vcs_set_up_dialog(const Control *p_gui_ba
set_up_dialog->popup_centered_clamped(popup_size * EDSCALE);
} else {
-
EditorNode::get_singleton()->show_warning(TTR("No VCS addons are available."), TTR("Error"));
}
}
void VersionControlEditorPlugin::_initialize_vcs() {
-
register_editor();
ERR_FAIL_COND_MSG(EditorVCSInterface::get_singleton(), EditorVCSInterface::get_singleton()->get_vcs_name() + " is already active");
@@ -124,10 +106,10 @@ void VersionControlEditorPlugin::_initialize_vcs() {
ERR_FAIL_COND_MSG(!addon_script_instance, "Failed to create addon script instance.");
// The addon is attached as a script to the VCS interface as a proxy end-point
- vcs_interface->set_script_and_instance(script.get_ref_ptr(), addon_script_instance);
+ vcs_interface->set_script_and_instance(script, addon_script_instance);
EditorVCSInterface::set_singleton(vcs_interface);
- EditorFileSystem::get_singleton()->connect("filesystem_changed", this, "_refresh_stage_area");
+ EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &VersionControlEditorPlugin::_refresh_stage_area));
String res_dir = OS::get_singleton()->get_resource_dir();
@@ -137,18 +119,14 @@ void VersionControlEditorPlugin::_initialize_vcs() {
}
void VersionControlEditorPlugin::_send_commit_msg() {
-
String msg = commit_message->get_text();
if (msg == "") {
-
commit_status->set_text(TTR("No commit message was provided"));
return;
}
if (EditorVCSInterface::get_singleton()) {
-
if (staged_files_count == 0) {
-
commit_status->set_text(TTR("No files added to stage"));
return;
}
@@ -158,7 +136,6 @@ void VersionControlEditorPlugin::_send_commit_msg() {
commit_message->set_text("");
version_control_dock_button->set_pressed(false);
} else {
-
WARN_PRINT("No VCS addon is initialized. Select a Version Control Addon from Project menu");
}
@@ -168,20 +145,16 @@ void VersionControlEditorPlugin::_send_commit_msg() {
}
void VersionControlEditorPlugin::_refresh_stage_area() {
-
if (EditorVCSInterface::get_singleton()) {
-
staged_files_count = 0;
clear_stage_area();
Dictionary modified_file_paths = EditorVCSInterface::get_singleton()->get_modified_files_data();
String file_path;
for (int i = 0; i < modified_file_paths.size(); i++) {
-
file_path = modified_file_paths.get_key_at_index(i);
- TreeItem *found = stage_files->search_item_text(file_path, 0, true);
+ TreeItem *found = stage_files->search_item_text(file_path, nullptr, true);
if (!found) {
-
ChangeType change_index = (ChangeType)(int)modified_file_paths.get_value_at_index(i);
String change_text = file_path + " (" + change_type_to_strings[change_index] + ")";
Color &change_color = change_type_to_color[change_index];
@@ -193,24 +166,19 @@ void VersionControlEditorPlugin::_refresh_stage_area() {
new_item->set_checked(0, true);
new_item->set_editable(0, true);
} else {
-
if (found->get_metadata(0) == diff_file_name->get_text()) {
-
_refresh_file_diff();
}
}
commit_status->set_text("New changes detected");
}
} else {
-
- WARN_PRINT("No VCS addon is initialized. Select a Version Control Addon from Project menu.")
+ WARN_PRINT("No VCS addon is initialized. Select a Version Control Addon from Project menu.");
}
}
void VersionControlEditorPlugin::_stage_selected() {
-
if (!EditorVCSInterface::get_singleton()) {
-
WARN_PRINT("No VCS addon is initialized. Select a Version Control Addon from Project menu");
return;
}
@@ -218,19 +186,15 @@ void VersionControlEditorPlugin::_stage_selected() {
staged_files_count = 0;
TreeItem *root = stage_files->get_root();
if (root) {
-
TreeItem *file_entry = root->get_children();
while (file_entry) {
-
if (file_entry->is_checked(0)) {
-
EditorVCSInterface::get_singleton()->stage_file(file_entry->get_metadata(0));
- file_entry->set_icon_modulate(0, EditorNode::get_singleton()->get_gui_base()->get_color("success_color", "Editor"));
+ file_entry->set_icon_modulate(0, EditorNode::get_singleton()->get_gui_base()->get_theme_color("success_color", "Editor"));
staged_files_count++;
} else {
-
EditorVCSInterface::get_singleton()->unstage_file(file_entry->get_metadata(0));
- file_entry->set_icon_modulate(0, EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ file_entry->set_icon_modulate(0, EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor"));
}
file_entry = file_entry->get_next();
@@ -241,9 +205,7 @@ void VersionControlEditorPlugin::_stage_selected() {
}
void VersionControlEditorPlugin::_stage_all() {
-
if (!EditorVCSInterface::get_singleton()) {
-
WARN_PRINT("No VCS addon is initialized. Select a Version Control Addon from Project menu");
return;
}
@@ -251,12 +213,10 @@ void VersionControlEditorPlugin::_stage_all() {
staged_files_count = 0;
TreeItem *root = stage_files->get_root();
if (root) {
-
TreeItem *file_entry = root->get_children();
while (file_entry) {
-
EditorVCSInterface::get_singleton()->stage_file(file_entry->get_metadata(0));
- file_entry->set_icon_modulate(0, EditorNode::get_singleton()->get_gui_base()->get_color("success_color", "Editor"));
+ file_entry->set_icon_modulate(0, EditorNode::get_singleton()->get_gui_base()->get_theme_color("success_color", "Editor"));
file_entry->set_checked(0, true);
staged_files_count++;
@@ -268,7 +228,6 @@ void VersionControlEditorPlugin::_stage_all() {
}
void VersionControlEditorPlugin::_view_file_diff() {
-
version_control_dock_button->set_pressed(true);
String file_path = stage_files->get_selected()->get_metadata(0);
@@ -277,26 +236,21 @@ void VersionControlEditorPlugin::_view_file_diff() {
}
void VersionControlEditorPlugin::_display_file_diff(String p_file_path) {
-
Array diff_content = EditorVCSInterface::get_singleton()->get_file_diff(p_file_path);
diff_file_name->set_text(p_file_path);
diff->clear();
- diff->push_font(EditorNode::get_singleton()->get_gui_base()->get_font("source", "EditorFonts"));
+ diff->push_font(EditorNode::get_singleton()->get_gui_base()->get_theme_font("source", "EditorFonts"));
for (int i = 0; i < diff_content.size(); i++) {
-
Dictionary line_result = diff_content[i];
if (line_result["status"] == "+") {
-
- diff->push_color(EditorNode::get_singleton()->get_gui_base()->get_color("success_color", "Editor"));
+ diff->push_color(EditorNode::get_singleton()->get_gui_base()->get_theme_color("success_color", "Editor"));
} else if (line_result["status"] == "-") {
-
- diff->push_color(EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ diff->push_color(EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor"));
} else {
-
- diff->push_color(EditorNode::get_singleton()->get_gui_base()->get_color("font_color", "Label"));
+ diff->push_color(EditorNode::get_singleton()->get_gui_base()->get_theme_color("font_color", "Label"));
}
diff->add_text((String)line_result["content"]);
@@ -307,42 +261,33 @@ void VersionControlEditorPlugin::_display_file_diff(String p_file_path) {
}
void VersionControlEditorPlugin::_refresh_file_diff() {
-
String open_file = diff_file_name->get_text();
if (open_file != "") {
-
_display_file_diff(diff_file_name->get_text());
}
}
void VersionControlEditorPlugin::_clear_file_diff() {
-
diff->clear();
diff_file_name->set_text("");
version_control_dock_button->set_pressed(false);
}
void VersionControlEditorPlugin::_update_stage_status() {
-
String status;
if (staged_files_count == 1) {
-
status = "Stage contains 1 file";
} else {
-
status = "Stage contains " + String::num_int64(staged_files_count) + " files";
}
commit_status->set_text(status);
}
void VersionControlEditorPlugin::_update_commit_status() {
-
String status;
if (staged_files_count == 1) {
-
status = "Committed 1 file";
} else {
-
status = "Committed " + String::num_int64(staged_files_count) + " files ";
}
commit_status->set_text(status);
@@ -350,50 +295,43 @@ void VersionControlEditorPlugin::_update_commit_status() {
}
void VersionControlEditorPlugin::register_editor() {
-
if (!EditorVCSInterface::get_singleton()) {
-
EditorNode::get_singleton()->add_control_to_dock(EditorNode::DOCK_SLOT_RIGHT_UL, version_commit_dock);
TabContainer *dock_vbc = (TabContainer *)version_commit_dock->get_parent_control();
dock_vbc->set_tab_title(version_commit_dock->get_index(), TTR("Commit"));
- ToolButton *vc = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Version Control"), version_control_dock);
+ Button *vc = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Version Control"), version_control_dock);
set_version_control_tool_button(vc);
}
}
void VersionControlEditorPlugin::fetch_available_vcs_addon_names() {
-
List<StringName> global_classes;
ScriptServer::get_global_class_list(&global_classes);
for (int i = 0; i != global_classes.size(); i++) {
-
String path = ScriptServer::get_global_class_path(global_classes[i]);
Ref<Script> script = ResourceLoader::load(path);
ERR_FAIL_COND(script.is_null());
if (script->get_instance_base_type() == "EditorVCSInterface") {
-
available_addons.push_back(global_classes[i]);
}
}
}
void VersionControlEditorPlugin::clear_stage_area() {
-
stage_files->get_root()->clear_children();
}
void VersionControlEditorPlugin::shut_down() {
-
if (EditorVCSInterface::get_singleton()) {
- if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", this, "_refresh_stage_area")) {
- EditorFileSystem::get_singleton()->disconnect("filesystem_changed", this, "_refresh_stage_area");
+ if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &VersionControlEditorPlugin::_refresh_stage_area))) {
+ EditorFileSystem::get_singleton()->disconnect("filesystem_changed", callable_mp(this, &VersionControlEditorPlugin::_refresh_stage_area));
}
EditorVCSInterface::get_singleton()->shut_down();
memdelete(EditorVCSInterface::get_singleton());
- EditorVCSInterface::set_singleton(NULL);
+ EditorVCSInterface::set_singleton(nullptr);
EditorNode::get_singleton()->remove_control_from_dock(version_commit_dock);
EditorNode::get_singleton()->remove_bottom_panel_item(version_control_dock);
@@ -401,26 +339,22 @@ void VersionControlEditorPlugin::shut_down() {
}
bool VersionControlEditorPlugin::is_vcs_initialized() const {
-
return EditorVCSInterface::get_singleton() ? EditorVCSInterface::get_singleton()->is_vcs_initialized() : false;
}
const String VersionControlEditorPlugin::get_vcs_name() const {
-
return EditorVCSInterface::get_singleton() ? EditorVCSInterface::get_singleton()->get_vcs_name() : "";
}
VersionControlEditorPlugin::VersionControlEditorPlugin() {
-
singleton = this;
staged_files_count = 0;
version_control_actions = memnew(PopupMenu);
- version_control_actions->set_v_size_flags(BoxContainer::SIZE_SHRINK_CENTER);
set_up_dialog = memnew(AcceptDialog);
set_up_dialog->set_title(TTR("Set Up Version Control"));
- set_up_dialog->set_custom_minimum_size(Size2(400, 100));
+ set_up_dialog->set_min_size(Size2(400, 100));
version_control_actions->add_child(set_up_dialog);
set_up_ok_button = set_up_dialog->get_ok();
@@ -444,19 +378,16 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
set_up_choice = memnew(OptionButton);
set_up_choice->set_h_size_flags(HBoxContainer::SIZE_EXPAND_FILL);
- set_up_choice->connect("item_selected", this, "_selected_a_vcs");
+ set_up_choice->connect("item_selected", callable_mp(this, &VersionControlEditorPlugin::_selected_a_vcs));
set_up_hbc->add_child(set_up_choice);
- set_up_init_settings = NULL;
+ set_up_init_settings = nullptr;
set_up_init_button = memnew(Button);
set_up_init_button->set_text(TTR("Initialize"));
- set_up_init_button->connect("pressed", this, "_initialize_vcs");
+ set_up_init_button->connect("pressed", callable_mp(this, &VersionControlEditorPlugin::_initialize_vcs));
set_up_vbc->add_child(set_up_init_button);
- version_control_actions->set_v_size_flags(PopupMenu::SIZE_EXPAND_FILL);
- version_control_actions->set_h_size_flags(PopupMenu::SIZE_EXPAND_FILL);
-
version_commit_dock = memnew(VBoxContainer);
version_commit_dock->set_visible(false);
@@ -478,8 +409,8 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
refresh_button = memnew(Button);
refresh_button->set_tooltip(TTR("Detect new changes"));
refresh_button->set_text(TTR("Refresh"));
- refresh_button->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Reload", "EditorIcons"));
- refresh_button->connect("pressed", this, "_refresh_stage_area");
+ refresh_button->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Reload", "EditorIcons"));
+ refresh_button->connect("pressed", callable_mp(this, &VersionControlEditorPlugin::_refresh_stage_area));
stage_tools->add_child(refresh_button);
stage_files = memnew(Tree);
@@ -492,7 +423,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
stage_files->set_allow_rmb_select(true);
stage_files->set_select_mode(Tree::SelectMode::SELECT_MULTI);
stage_files->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
- stage_files->connect("cell_selected", this, "_view_file_diff");
+ stage_files->connect("cell_selected", callable_mp(this, &VersionControlEditorPlugin::_view_file_diff));
stage_files->create_item();
stage_files->set_hide_root(true);
commit_box_vbc->add_child(stage_files);
@@ -503,11 +434,11 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
change_type_to_strings[CHANGE_TYPE_DELETED] = TTR("Deleted");
change_type_to_strings[CHANGE_TYPE_TYPECHANGE] = TTR("Typechange");
- change_type_to_color[CHANGE_TYPE_NEW] = EditorNode::get_singleton()->get_gui_base()->get_color("success_color", "Editor");
- change_type_to_color[CHANGE_TYPE_MODIFIED] = EditorNode::get_singleton()->get_gui_base()->get_color("warning_color", "Editor");
- change_type_to_color[CHANGE_TYPE_RENAMED] = EditorNode::get_singleton()->get_gui_base()->get_color("disabled_font_color", "Editor");
- change_type_to_color[CHANGE_TYPE_DELETED] = EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor");
- change_type_to_color[CHANGE_TYPE_TYPECHANGE] = EditorNode::get_singleton()->get_gui_base()->get_color("font_color", "Editor");
+ change_type_to_color[CHANGE_TYPE_NEW] = EditorNode::get_singleton()->get_gui_base()->get_theme_color("success_color", "Editor");
+ change_type_to_color[CHANGE_TYPE_MODIFIED] = EditorNode::get_singleton()->get_gui_base()->get_theme_color("warning_color", "Editor");
+ change_type_to_color[CHANGE_TYPE_RENAMED] = EditorNode::get_singleton()->get_gui_base()->get_theme_color("disabled_font_color", "Editor");
+ change_type_to_color[CHANGE_TYPE_DELETED] = EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor");
+ change_type_to_color[CHANGE_TYPE_TYPECHANGE] = EditorNode::get_singleton()->get_gui_base()->get_theme_color("font_color", "Editor");
stage_buttons = memnew(HSplitContainer);
stage_buttons->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN_COLLAPSED);
@@ -516,12 +447,12 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
stage_selected_button = memnew(Button);
stage_selected_button->set_h_size_flags(Button::SIZE_EXPAND_FILL);
stage_selected_button->set_text(TTR("Stage Selected"));
- stage_selected_button->connect("pressed", this, "_stage_selected");
+ stage_selected_button->connect("pressed", callable_mp(this, &VersionControlEditorPlugin::_stage_selected));
stage_buttons->add_child(stage_selected_button);
stage_all_button = memnew(Button);
stage_all_button->set_text(TTR("Stage All"));
- stage_all_button->connect("pressed", this, "_stage_all");
+ stage_all_button->connect("pressed", callable_mp(this, &VersionControlEditorPlugin::_stage_all));
stage_buttons->add_child(stage_all_button);
commit_box_vbc->add_child(memnew(HSeparator));
@@ -537,7 +468,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
commit_button = memnew(Button);
commit_button->set_text(TTR("Commit Changes"));
- commit_button->connect("pressed", this, "_send_commit_msg");
+ commit_button->connect("pressed", callable_mp(this, &VersionControlEditorPlugin::_send_commit_msg));
commit_box_vbc->add_child(commit_button);
commit_status = memnew(Label);
@@ -570,8 +501,8 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
diff_refresh_button = memnew(Button);
diff_refresh_button->set_tooltip(TTR("Detect changes in file diff"));
- diff_refresh_button->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Reload", "EditorIcons"));
- diff_refresh_button->connect("pressed", this, "_refresh_file_diff");
+ diff_refresh_button->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Reload", "EditorIcons"));
+ diff_refresh_button->connect("pressed", callable_mp(this, &VersionControlEditorPlugin::_refresh_file_diff));
diff_hbc->add_child(diff_refresh_button);
diff = memnew(RichTextLabel);
@@ -582,7 +513,6 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
}
VersionControlEditorPlugin::~VersionControlEditorPlugin() {
-
shut_down();
memdelete(version_control_dock);
memdelete(version_commit_dock);
diff --git a/editor/plugins/version_control_editor_plugin.h b/editor/plugins/version_control_editor_plugin.h
index 4a98c8580e..248a1435fd 100644
--- a/editor/plugins/version_control_editor_plugin.h
+++ b/editor/plugins/version_control_editor_plugin.h
@@ -39,7 +39,6 @@
#include "scene/gui/tree.h"
class VersionControlEditorPlugin : public EditorPlugin {
-
GDCLASS(VersionControlEditorPlugin, EditorPlugin)
public:
@@ -91,7 +90,7 @@ private:
Label *commit_status;
PanelContainer *version_control_dock;
- ToolButton *version_control_dock_button;
+ Button *version_control_dock_button;
VBoxContainer *diff_vbc;
HBoxContainer *diff_hbc;
Button *diff_refresh_button;
@@ -122,7 +121,7 @@ public:
static VersionControlEditorPlugin *get_singleton();
void popup_vcs_set_up_dialog(const Control *p_gui_base);
- void set_version_control_tool_button(ToolButton *p_button) { version_control_dock_button = p_button; }
+ void set_version_control_tool_button(Button *p_button) { version_control_dock_button = p_button; }
PopupMenu *get_version_control_actions_panel() const { return version_control_actions; }
VBoxContainer *get_version_commit_dock() const { return version_commit_dock; }
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index e334d4b093..7a70f4c5b6 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -30,38 +30,603 @@
#include "visual_shader_editor_plugin.h"
+#include "core/input/input.h"
#include "core/io/resource_loader.h"
#include "core/math/math_defs.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/project_settings.h"
+#include "core/version.h"
#include "editor/editor_log.h"
#include "editor/editor_properties.h"
#include "editor/editor_scale.h"
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/resources/visual_shader_nodes.h"
-#include "servers/visual/shader_types.h"
+#include "servers/display_server.h"
+#include "servers/rendering/shader_types.h"
Control *VisualShaderNodePlugin::create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node) {
-
if (get_script_instance()) {
return get_script_instance()->call("create_editor", p_parent_resource, p_node);
}
- return NULL;
+ return nullptr;
}
void VisualShaderNodePlugin::_bind_methods() {
-
BIND_VMETHOD(MethodInfo(Variant::OBJECT, "create_editor", PropertyInfo(Variant::OBJECT, "parent_resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"), PropertyInfo(Variant::OBJECT, "for_node", PROPERTY_HINT_RESOURCE_TYPE, "VisualShaderNode")));
}
///////////////////
-void VisualShaderEditor::edit(VisualShader *p_visual_shader) {
+static Ref<StyleBoxEmpty> make_empty_stylebox(float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_bottom = -1) {
+ Ref<StyleBoxEmpty> style(memnew(StyleBoxEmpty));
+ style->set_default_margin(MARGIN_LEFT, p_margin_left * EDSCALE);
+ style->set_default_margin(MARGIN_RIGHT, p_margin_right * EDSCALE);
+ style->set_default_margin(MARGIN_BOTTOM, p_margin_bottom * EDSCALE);
+ style->set_default_margin(MARGIN_TOP, p_margin_top * EDSCALE);
+ return style;
+}
+
+///////////////////
+
+VisualShaderGraphPlugin::VisualShaderGraphPlugin() {
+}
+
+void VisualShaderGraphPlugin::_bind_methods() {
+ ClassDB::bind_method("add_node", &VisualShaderGraphPlugin::add_node);
+ ClassDB::bind_method("remove_node", &VisualShaderGraphPlugin::remove_node);
+ ClassDB::bind_method("connect_nodes", &VisualShaderGraphPlugin::connect_nodes);
+ ClassDB::bind_method("disconnect_nodes", &VisualShaderGraphPlugin::disconnect_nodes);
+ ClassDB::bind_method("set_node_position", &VisualShaderGraphPlugin::set_node_position);
+ ClassDB::bind_method("set_node_size", &VisualShaderGraphPlugin::set_node_size);
+ ClassDB::bind_method("show_port_preview", &VisualShaderGraphPlugin::show_port_preview);
+ ClassDB::bind_method("update_node", &VisualShaderGraphPlugin::update_node);
+ ClassDB::bind_method("update_node_deferred", &VisualShaderGraphPlugin::update_node_deferred);
+ ClassDB::bind_method("set_input_port_default_value", &VisualShaderGraphPlugin::set_input_port_default_value);
+ ClassDB::bind_method("set_uniform_name", &VisualShaderGraphPlugin::set_uniform_name);
+}
+
+void VisualShaderGraphPlugin::register_shader(VisualShader *p_shader) {
+ visual_shader = Ref<VisualShader>(p_shader);
+}
+
+void VisualShaderGraphPlugin::set_connections(List<VisualShader::Connection> &p_connections) {
+ connections = p_connections;
+}
+
+void VisualShaderGraphPlugin::show_port_preview(VisualShader::Type p_type, int p_node_id, int p_port_id) {
+ if (visual_shader->get_shader_type() == p_type && links.has(p_node_id)) {
+ for (Map<int, Port>::Element *E = links[p_node_id].output_ports.front(); E; E = E->next()) {
+ E->value().preview_button->set_pressed(false);
+ }
+
+ if (links[p_node_id].preview_visible && !is_dirty() && links[p_node_id].preview_box != nullptr) {
+ links[p_node_id].graph_node->remove_child(links[p_node_id].preview_box);
+ memdelete(links[p_node_id].preview_box);
+ links[p_node_id].graph_node->set_size(Vector2(-1, -1));
+ links[p_node_id].preview_visible = false;
+ }
+
+ if (p_port_id != -1) {
+ if (is_dirty()) {
+ links[p_node_id].preview_pos = links[p_node_id].graph_node->get_child_count();
+ }
+
+ VBoxContainer *vbox = memnew(VBoxContainer);
+ links[p_node_id].graph_node->add_child(vbox);
+ if (links[p_node_id].preview_pos != -1) {
+ links[p_node_id].graph_node->move_child(vbox, links[p_node_id].preview_pos);
+ }
+
+ Control *offset = memnew(Control);
+ offset->set_custom_minimum_size(Size2(0, 5 * EDSCALE));
+ vbox->add_child(offset);
+
+ VisualShaderNodePortPreview *port_preview = memnew(VisualShaderNodePortPreview);
+ port_preview->setup(visual_shader, visual_shader->get_shader_type(), p_node_id, p_port_id);
+ port_preview->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
+ vbox->add_child(port_preview);
+ links[p_node_id].preview_visible = true;
+ links[p_node_id].preview_box = vbox;
+ links[p_node_id].output_ports[p_port_id].preview_button->set_pressed(true);
+ }
+ }
+}
+
+void VisualShaderGraphPlugin::update_node_deferred(VisualShader::Type p_type, int p_node_id) {
+ call_deferred("update_node", p_type, p_node_id);
+}
+
+void VisualShaderGraphPlugin::update_node(VisualShader::Type p_type, int p_node_id) {
+ if (p_type != visual_shader->get_shader_type() || !links.has(p_node_id)) {
+ return;
+ }
+ remove_node(p_type, p_node_id);
+ add_node(p_type, p_node_id);
+}
+
+void VisualShaderGraphPlugin::set_input_port_default_value(VisualShader::Type p_type, int p_node_id, int p_port_id, Variant p_value) {
+ if (p_type != visual_shader->get_shader_type() || !links.has(p_node_id)) {
+ return;
+ }
+
+ Button *button = links[p_node_id].input_ports[p_port_id].default_input_button;
+
+ switch (p_value.get_type()) {
+ case Variant::COLOR: {
+ button->set_custom_minimum_size(Size2(30, 0) * EDSCALE);
+ if (!button->is_connected("draw", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_draw_color_over_button))) {
+ button->connect("draw", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_draw_color_over_button), varray(button, p_value));
+ }
+ } break;
+ case Variant::BOOL: {
+ button->set_text(((bool)p_value) ? "true" : "false");
+ } break;
+ case Variant::INT:
+ case Variant::FLOAT: {
+ button->set_text(String::num(p_value, 4));
+ } break;
+ case Variant::VECTOR3: {
+ Vector3 v = p_value;
+ button->set_text(String::num(v.x, 3) + "," + String::num(v.y, 3) + "," + String::num(v.z, 3));
+ } break;
+ default: {
+ }
+ }
+}
+
+void VisualShaderGraphPlugin::set_uniform_name(VisualShader::Type p_type, int p_node_id, const String &p_name) {
+ if (visual_shader->get_shader_type() == p_type && links.has(p_node_id) && links[p_node_id].uniform_name != nullptr) {
+ links[p_node_id].uniform_name->set_text(p_name);
+ }
+}
+
+void VisualShaderGraphPlugin::register_default_input_button(int p_node_id, int p_port_id, Button *p_button) {
+ links[p_node_id].input_ports.insert(p_port_id, { p_button });
+}
+
+void VisualShaderGraphPlugin::update_uniform_refs() {
+ for (Map<int, Link>::Element *E = links.front(); E; E = E->next()) {
+ VisualShaderNodeUniformRef *ref = Object::cast_to<VisualShaderNodeUniformRef>(E->get().visual_node);
+ if (ref) {
+ remove_node(E->get().type, E->key());
+ add_node(E->get().type, E->key());
+ }
+ }
+}
+
+VisualShader::Type VisualShaderGraphPlugin::get_shader_type() const {
+ return visual_shader->get_shader_type();
+}
+
+void VisualShaderGraphPlugin::set_node_position(VisualShader::Type p_type, int p_id, const Vector2 &p_position) {
+ if (visual_shader->get_shader_type() == p_type && links.has(p_id)) {
+ links[p_id].graph_node->set_offset(p_position);
+ }
+}
+
+void VisualShaderGraphPlugin::set_node_size(VisualShader::Type p_type, int p_id, const Vector2 &p_size) {
+ if (visual_shader->get_shader_type() == p_type && links.has(p_id)) {
+ links[p_id].graph_node->set_size(p_size);
+ }
+}
+
+bool VisualShaderGraphPlugin::is_preview_visible(int p_id) const {
+ return links[p_id].preview_visible;
+}
+
+void VisualShaderGraphPlugin::clear_links() {
+ links.clear();
+}
+
+bool VisualShaderGraphPlugin::is_dirty() const {
+ return dirty;
+}
+
+void VisualShaderGraphPlugin::make_dirty(bool p_enabled) {
+ dirty = p_enabled;
+}
+
+void VisualShaderGraphPlugin::register_link(VisualShader::Type p_type, int p_id, VisualShaderNode *p_visual_node, GraphNode *p_graph_node) {
+ links.insert(p_id, { p_type, p_visual_node, p_graph_node, p_visual_node->get_output_port_for_preview() != -1, -1, Map<int, InputPort>(), Map<int, Port>(), nullptr, nullptr });
+}
+
+void VisualShaderGraphPlugin::register_output_port(int p_node_id, int p_port, TextureButton *p_button) {
+ links[p_node_id].output_ports.insert(p_port, { p_button });
+}
+
+void VisualShaderGraphPlugin::register_uniform_name(int p_node_id, LineEdit *p_uniform_name) {
+ links[p_node_id].uniform_name = p_uniform_name;
+}
+
+void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
+ if (p_type != visual_shader->get_shader_type()) {
+ return;
+ }
+
+ Control *offset;
+
+ static Ref<StyleBoxEmpty> label_style = make_empty_stylebox(2, 1, 2, 1);
+
+ static const Color type_color[6] = {
+ Color(0.38, 0.85, 0.96), // scalar (float)
+ Color(0.49, 0.78, 0.94), // scalar (int)
+ Color(0.84, 0.49, 0.93), // vector
+ Color(0.55, 0.65, 0.94), // boolean
+ Color(0.96, 0.66, 0.43), // transform
+ Color(1.0, 1.0, 0.0), // sampler
+ };
+
+ Ref<VisualShaderNode> vsnode = visual_shader->get_node(p_type, p_id);
+
+ Ref<VisualShaderNodeGroupBase> group_node = Object::cast_to<VisualShaderNodeGroupBase>(vsnode.ptr());
+ bool is_group = !group_node.is_null();
+ Size2 size = Size2(0, 0);
+
+ Ref<VisualShaderNodeExpression> expression_node = Object::cast_to<VisualShaderNodeExpression>(group_node.ptr());
+ bool is_expression = !expression_node.is_null();
+ String expression = "";
+
+ GraphNode *node = memnew(GraphNode);
+ register_link(p_type, p_id, vsnode.ptr(), node);
+
+ if (is_group) {
+ size = group_node->get_size();
+
+ node->set_resizable(true);
+ node->connect("resize_request", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_node_resized), varray((int)p_type, p_id));
+ }
+ if (is_expression) {
+ expression = expression_node->get_expression();
+ }
+
+ node->set_offset(visual_shader->get_node_position(p_type, p_id));
+ node->set_title(vsnode->get_caption());
+ node->set_name(itos(p_id));
+
+ if (p_id >= 2) {
+ node->set_show_close_button(true);
+ node->connect("close_request", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_delete_request), varray(p_id), CONNECT_DEFERRED);
+ }
+
+ node->connect("dragged", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_node_dragged), varray(p_id));
+
+ Control *custom_editor = nullptr;
+ int port_offset = 0;
+
+ if (is_group) {
+ port_offset += 2;
+ }
+
+ Ref<VisualShaderNodeUniform> uniform = vsnode;
+ if (uniform.is_valid()) {
+ VisualShaderEditor::get_singleton()->graph->add_child(node);
+ VisualShaderEditor::get_singleton()->_update_created_node(node);
+
+ LineEdit *uniform_name = memnew(LineEdit);
+ register_uniform_name(p_id, uniform_name);
+ uniform_name->set_text(uniform->get_uniform_name());
+ node->add_child(uniform_name);
+ uniform_name->connect("text_entered", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_uniform_line_edit_changed), varray(p_id));
+ uniform_name->connect("focus_exited", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_uniform_line_edit_focus_out), varray(uniform_name, p_id));
+
+ if (vsnode->get_input_port_count() == 0 && vsnode->get_output_port_count() == 1 && vsnode->get_output_port_name(0) == "") {
+ //shortcut
+ VisualShaderNode::PortType port_right = vsnode->get_output_port_type(0);
+ node->set_slot(0, false, VisualShaderNode::PORT_TYPE_SCALAR, Color(), true, port_right, type_color[port_right]);
+ if (!vsnode->is_use_prop_slots()) {
+ return;
+ }
+ }
+ port_offset++;
+ }
+
+ for (int i = 0; i < VisualShaderEditor::get_singleton()->plugins.size(); i++) {
+ vsnode->set_meta("id", p_id);
+ vsnode->set_meta("shader_type", (int)p_type);
+ custom_editor = VisualShaderEditor::get_singleton()->plugins.write[i]->create_editor(visual_shader, vsnode);
+ vsnode->remove_meta("id");
+ vsnode->remove_meta("shader_type");
+ if (custom_editor) {
+ if (vsnode->is_show_prop_names()) {
+ custom_editor->call_deferred("_show_prop_names", true);
+ }
+ break;
+ }
+ }
+
+ if (custom_editor && !vsnode->is_use_prop_slots() && vsnode->get_output_port_count() > 0 && vsnode->get_output_port_name(0) == "" && (vsnode->get_input_port_count() == 0 || vsnode->get_input_port_name(0) == "")) {
+ //will be embedded in first port
+ } else if (custom_editor) {
+ port_offset++;
+ node->add_child(custom_editor);
+ if (vsnode->is_use_prop_slots()) {
+ return;
+ }
+ custom_editor = nullptr;
+ }
+
+ if (is_group) {
+ offset = memnew(Control);
+ offset->set_custom_minimum_size(Size2(0, 6 * EDSCALE));
+ node->add_child(offset);
+
+ if (group_node->is_editable()) {
+ HBoxContainer *hb2 = memnew(HBoxContainer);
+
+ Button *add_input_btn = memnew(Button);
+ add_input_btn->set_text(TTR("Add Input"));
+ add_input_btn->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_add_input_port), varray(p_id, group_node->get_free_input_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "input" + itos(group_node->get_free_input_port_id())), CONNECT_DEFERRED);
+ hb2->add_child(add_input_btn);
+
+ hb2->add_spacer();
+
+ Button *add_output_btn = memnew(Button);
+ add_output_btn->set_text(TTR("Add Output"));
+ add_output_btn->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_add_output_port), varray(p_id, group_node->get_free_output_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "output" + itos(group_node->get_free_output_port_id())), CONNECT_DEFERRED);
+ hb2->add_child(add_output_btn);
+
+ node->add_child(hb2);
+ }
+ }
+
+ for (int i = 0; i < MAX(vsnode->get_input_port_count(), vsnode->get_output_port_count()); i++) {
+ if (vsnode->is_port_separator(i)) {
+ node->add_child(memnew(HSeparator));
+ port_offset++;
+ }
+
+ bool valid_left = i < vsnode->get_input_port_count();
+ VisualShaderNode::PortType port_left = VisualShaderNode::PORT_TYPE_SCALAR;
+ bool port_left_used = false;
+ String name_left;
+ if (valid_left) {
+ name_left = vsnode->get_input_port_name(i);
+ port_left = vsnode->get_input_port_type(i);
+ for (List<VisualShader::Connection>::Element *E = connections.front(); E; E = E->next()) {
+ if (E->get().to_node == p_id && E->get().to_port == i) {
+ port_left_used = true;
+ }
+ }
+ }
+
+ bool valid_right = i < vsnode->get_output_port_count();
+ VisualShaderNode::PortType port_right = VisualShaderNode::PORT_TYPE_SCALAR;
+ String name_right;
+ if (valid_right) {
+ name_right = vsnode->get_output_port_name(i);
+ port_right = vsnode->get_output_port_type(i);
+ }
+
+ HBoxContainer *hb = memnew(HBoxContainer);
+ hb->add_theme_constant_override("separation", 7 * EDSCALE);
+
+ Variant default_value;
+
+ if (valid_left && !port_left_used) {
+ default_value = vsnode->get_input_port_default_value(i);
+ }
+
+ Button *button = memnew(Button);
+ hb->add_child(button);
+ register_default_input_button(p_id, i, button);
+ button->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_edit_port_default_input), varray(button, p_id, i));
+ if (default_value.get_type() != Variant::NIL) { // only a label
+ set_input_port_default_value(p_type, p_id, i, default_value);
+ } else {
+ button->hide();
+ }
+
+ if (i == 0 && custom_editor) {
+ hb->add_child(custom_editor);
+ custom_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ } else {
+ if (valid_left) {
+ if (is_group) {
+ OptionButton *type_box = memnew(OptionButton);
+ hb->add_child(type_box);
+ type_box->add_item(TTR("Float"));
+ type_box->add_item(TTR("Int"));
+ type_box->add_item(TTR("Vector"));
+ type_box->add_item(TTR("Boolean"));
+ type_box->add_item(TTR("Transform"));
+ type_box->add_item(TTR("Sampler"));
+ type_box->select(group_node->get_input_port_type(i));
+ type_box->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
+ type_box->connect("item_selected", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_change_input_port_type), varray(p_id, i), CONNECT_DEFERRED);
+
+ LineEdit *name_box = memnew(LineEdit);
+ hb->add_child(name_box);
+ name_box->set_custom_minimum_size(Size2(65 * EDSCALE, 0));
+ name_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ name_box->set_text(name_left);
+ name_box->connect("text_entered", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_change_input_port_name), varray(name_box, p_id, i));
+ name_box->connect("focus_exited", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_port_name_focus_out), varray(name_box, p_id, i, false));
+
+ Button *remove_btn = memnew(Button);
+ remove_btn->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Remove", "EditorIcons"));
+ remove_btn->set_tooltip(TTR("Remove") + " " + name_left);
+ remove_btn->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_remove_input_port), varray(p_id, i), CONNECT_DEFERRED);
+ hb->add_child(remove_btn);
+ } else {
+ Label *label = memnew(Label);
+ label->set_text(name_left);
+ label->add_theme_style_override("normal", label_style); //more compact
+ hb->add_child(label);
+
+ if (vsnode->get_input_port_default_hint(i) != "" && !port_left_used) {
+ Label *hint_label = memnew(Label);
+ hint_label->set_text("[" + vsnode->get_input_port_default_hint(i) + "]");
+ hint_label->add_theme_color_override("font_color", VisualShaderEditor::get_singleton()->get_theme_color("font_color_readonly", "TextEdit"));
+ hint_label->add_theme_style_override("normal", label_style);
+ hb->add_child(hint_label);
+ }
+ }
+ }
+
+ if (!is_group) {
+ hb->add_spacer();
+ }
+
+ if (valid_right) {
+ if (is_group) {
+ Button *remove_btn = memnew(Button);
+ remove_btn->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Remove", "EditorIcons"));
+ remove_btn->set_tooltip(TTR("Remove") + " " + name_left);
+ remove_btn->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_remove_output_port), varray(p_id, i), CONNECT_DEFERRED);
+ hb->add_child(remove_btn);
+
+ LineEdit *name_box = memnew(LineEdit);
+ hb->add_child(name_box);
+ name_box->set_custom_minimum_size(Size2(65 * EDSCALE, 0));
+ name_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ name_box->set_text(name_right);
+ name_box->connect("text_entered", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_change_output_port_name), varray(name_box, p_id, i));
+ name_box->connect("focus_exited", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_port_name_focus_out), varray(name_box, p_id, i, true));
+
+ OptionButton *type_box = memnew(OptionButton);
+ hb->add_child(type_box);
+ type_box->add_item(TTR("Float"));
+ type_box->add_item(TTR("Int"));
+ type_box->add_item(TTR("Vector"));
+ type_box->add_item(TTR("Boolean"));
+ type_box->add_item(TTR("Transform"));
+ type_box->select(group_node->get_output_port_type(i));
+ type_box->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
+ type_box->connect("item_selected", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_change_output_port_type), varray(p_id, i), CONNECT_DEFERRED);
+ } else {
+ Label *label = memnew(Label);
+ label->set_text(name_right);
+ label->add_theme_style_override("normal", label_style); //more compact
+ hb->add_child(label);
+ }
+ }
+ }
+
+ if (valid_right && visual_shader->get_shader_type() == VisualShader::TYPE_FRAGMENT && port_right != VisualShaderNode::PORT_TYPE_TRANSFORM && port_right != VisualShaderNode::PORT_TYPE_SAMPLER) {
+ TextureButton *preview = memnew(TextureButton);
+ preview->set_toggle_mode(true);
+ preview->set_normal_texture(VisualShaderEditor::get_singleton()->get_theme_icon("GuiVisibilityHidden", "EditorIcons"));
+ preview->set_pressed_texture(VisualShaderEditor::get_singleton()->get_theme_icon("GuiVisibilityVisible", "EditorIcons"));
+ preview->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
+
+ register_output_port(p_id, i, preview);
+
+ preview->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_preview_select_port), varray(p_id, i), CONNECT_DEFERRED);
+ hb->add_child(preview);
+ }
+
+ if (is_group) {
+ offset = memnew(Control);
+ offset->set_custom_minimum_size(Size2(0, 5 * EDSCALE));
+ node->add_child(offset);
+ port_offset++;
+ }
+
+ node->add_child(hb);
+
+ node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], valid_right, port_right, type_color[port_right]);
+ }
+
+ if (vsnode->get_output_port_for_preview() >= 0) {
+ show_port_preview(p_type, p_id, vsnode->get_output_port_for_preview());
+ }
+
+ offset = memnew(Control);
+ offset->set_custom_minimum_size(Size2(0, 4 * EDSCALE));
+ node->add_child(offset);
+
+ String error = vsnode->get_warning(visual_shader->get_mode(), p_type);
+ if (error != String()) {
+ Label *error_label = memnew(Label);
+ error_label->add_theme_color_override("font_color", VisualShaderEditor::get_singleton()->get_theme_color("error_color", "Editor"));
+ error_label->set_text(error);
+ node->add_child(error_label);
+ }
+
+ if (is_expression) {
+ CodeEdit *expression_box = memnew(CodeEdit);
+ Ref<CodeHighlighter> expression_syntax_highlighter;
+ expression_syntax_highlighter.instance();
+ expression_node->set_control(expression_box, 0);
+ node->add_child(expression_box);
+
+ Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
+ Color text_color = EDITOR_GET("text_editor/highlighting/text_color");
+ Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
+ Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
+ Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
+ Color function_color = EDITOR_GET("text_editor/highlighting/function_color");
+ Color number_color = EDITOR_GET("text_editor/highlighting/number_color");
+ Color members_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
+
+ expression_box->set_syntax_highlighter(expression_syntax_highlighter);
+ expression_box->add_theme_color_override("background_color", background_color);
+ for (List<String>::Element *E = VisualShaderEditor::get_singleton()->keyword_list.front(); E; E = E->next()) {
+ expression_syntax_highlighter->add_keyword_color(E->get(), keyword_color);
+ }
+
+ expression_box->add_theme_font_override("font", VisualShaderEditor::get_singleton()->get_theme_font("expression", "EditorFonts"));
+ expression_box->add_theme_color_override("font_color", text_color);
+ expression_syntax_highlighter->set_number_color(number_color);
+ expression_syntax_highlighter->set_symbol_color(symbol_color);
+ expression_syntax_highlighter->set_function_color(function_color);
+ expression_syntax_highlighter->set_member_variable_color(members_color);
+ expression_syntax_highlighter->add_color_region("/*", "*/", comment_color, false);
+ expression_syntax_highlighter->add_color_region("//", "", comment_color, true);
+
+ expression_box->set_text(expression);
+ expression_box->set_context_menu_enabled(false);
+ expression_box->set_draw_line_numbers(true);
+
+ expression_box->connect("focus_exited", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_expression_focus_out), varray(expression_box, p_id));
+ }
+
+ if (!uniform.is_valid()) {
+ VisualShaderEditor::get_singleton()->graph->add_child(node);
+ VisualShaderEditor::get_singleton()->_update_created_node(node);
+ if (is_group) {
+ VisualShaderEditor::get_singleton()->call_deferred("_set_node_size", (int)p_type, p_id, size);
+ }
+ }
+}
+
+void VisualShaderGraphPlugin::remove_node(VisualShader::Type p_type, int p_id) {
+ if (visual_shader->get_shader_type() == p_type && links.has(p_id)) {
+ links[p_id].graph_node->get_parent()->remove_child(links[p_id].graph_node);
+ memdelete(links[p_id].graph_node);
+ links.erase(p_id);
+ }
+}
+
+void VisualShaderGraphPlugin::connect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) {
+ if (visual_shader->get_shader_type() == p_type) {
+ VisualShaderEditor::get_singleton()->graph->connect_node(itos(p_from_node), p_from_port, itos(p_to_node), p_to_port);
+ if (links[p_to_node].input_ports.has(p_to_port) && links[p_to_node].input_ports[p_to_port].default_input_button != nullptr) {
+ links[p_to_node].input_ports[p_to_port].default_input_button->hide();
+ }
+ }
+}
+
+void VisualShaderGraphPlugin::disconnect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) {
+ if (visual_shader->get_shader_type() == p_type) {
+ VisualShaderEditor::get_singleton()->graph->disconnect_node(itos(p_from_node), p_from_port, itos(p_to_node), p_to_port);
+ if (links[p_to_node].input_ports.has(p_to_port) && links[p_to_node].input_ports[p_to_port].default_input_button != nullptr && links[p_to_node].visual_node->get_input_port_default_value(p_to_port).get_type() != Variant::NIL) {
+ links[p_to_node].input_ports[p_to_port].default_input_button->show();
+ set_input_port_default_value(p_type, p_to_node, p_to_port, links[p_to_node].visual_node->get_input_port_default_value(p_to_port));
+ }
+ }
+}
+
+VisualShaderGraphPlugin::~VisualShaderGraphPlugin() {
+}
+
+/////////////////
+
+void VisualShaderEditor::edit(VisualShader *p_visual_shader) {
bool changed = false;
if (p_visual_shader) {
if (visual_shader.is_null()) {
@@ -72,14 +637,22 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) {
}
}
visual_shader = Ref<VisualShader>(p_visual_shader);
- if (!visual_shader->is_connected("changed", this, "_update_preview")) {
- visual_shader->connect("changed", this, "_update_preview");
+ graph_plugin->register_shader(visual_shader.ptr());
+ if (!visual_shader->is_connected("changed", callable_mp(this, &VisualShaderEditor::_update_preview))) {
+ visual_shader->connect("changed", callable_mp(this, &VisualShaderEditor::_update_preview));
}
+#ifndef DISABLE_DEPRECATED
+ String version = VERSION_BRANCH;
+ if (visual_shader->get_version() != version) {
+ visual_shader->update_version(version);
+ }
+#endif
visual_shader->set_graph_offset(graph->get_scroll_ofs() / EDSCALE);
+ _set_mode(visual_shader->get_mode());
} else {
if (visual_shader.is_valid()) {
- if (visual_shader->is_connected("changed", this, "")) {
- visual_shader->disconnect("changed", this, "_update_preview");
+ if (visual_shader->is_connected("changed", callable_mp(this, &VisualShaderEditor::_update_preview))) {
+ visual_shader->disconnect("changed", callable_mp(this, &VisualShaderEditor::_update_preview));
}
}
visual_shader.unref();
@@ -92,14 +665,15 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) {
_clear_buffer();
_update_options_menu();
_update_preview();
+ _update_graph();
}
- _update_graph();
}
}
void VisualShaderEditor::add_plugin(const Ref<VisualShaderNodePlugin> &p_plugin) {
- if (plugins.find(p_plugin) != -1)
+ if (plugins.find(p_plugin) != -1) {
return;
+ }
plugins.push_back(p_plugin);
}
@@ -116,15 +690,15 @@ void VisualShaderEditor::clear_custom_types() {
}
}
-void VisualShaderEditor::add_custom_type(const String &p_name, const Ref<Script> &p_script, const String &p_description, int p_return_icon_type, const String &p_category, const String &p_subcategory) {
-
+void VisualShaderEditor::add_custom_type(const String &p_name, const Ref<Script> &p_script, const String &p_description, int p_return_icon_type, const String &p_category, bool p_highend) {
ERR_FAIL_COND(!p_name.is_valid_identifier());
ERR_FAIL_COND(!p_script.is_valid());
for (int i = 0; i < add_options.size(); i++) {
if (add_options[i].is_custom) {
- if (add_options[i].script == p_script)
+ if (add_options[i].script == p_script) {
return;
+ }
}
}
@@ -134,14 +708,15 @@ void VisualShaderEditor::add_custom_type(const String &p_name, const Ref<Script>
ao.return_type = p_return_icon_type;
ao.description = p_description;
ao.category = p_category;
- ao.sub_category = p_subcategory;
+ ao.highend = p_highend;
ao.is_custom = true;
bool begin = false;
+ String root = p_category.split("/")[0];
for (int i = 0; i < add_options.size(); i++) {
if (add_options[i].is_custom) {
- if (add_options[i].category == p_category) {
+ if (add_options[i].category == root) {
if (!begin) {
begin = true;
}
@@ -157,40 +732,22 @@ void VisualShaderEditor::add_custom_type(const String &p_name, const Ref<Script>
}
bool VisualShaderEditor::_is_available(int p_mode) {
-
int current_mode = edit_type->get_selected();
if (p_mode != -1) {
-
switch (current_mode) {
- case VisualShader::TYPE_VERTEX:
+ case 0: // Vertex or Emit
current_mode = 1;
break;
- case VisualShader::TYPE_FRAGMENT:
+ case 1: // Fragment or Process
current_mode = 2;
break;
- case VisualShader::TYPE_LIGHT:
+ case 2: // Light or End
current_mode = 4;
break;
default:
break;
}
-
- int temp_mode = 0;
-
- if (p_mode & VisualShader::TYPE_FRAGMENT) {
- temp_mode |= 2;
- }
-
- if (p_mode & VisualShader::TYPE_LIGHT) {
- temp_mode |= 4;
- }
-
- if (temp_mode == 0) {
- temp_mode |= 1;
- }
-
- p_mode = temp_mode;
}
return (p_mode == -1 || (p_mode & current_mode) != 0);
@@ -206,7 +763,6 @@ void VisualShaderEditor::update_custom_nodes() {
Dictionary added;
for (int i = 0; i < class_list.size(); i++) {
if (ScriptServer::get_global_class_native_base(class_list[i]) == "VisualShaderNodeCustom") {
-
String script_path = ScriptServer::get_global_class_path(class_list[i]);
Ref<Resource> res = ResourceLoader::load(script_path);
ERR_FAIL_COND(res.is_null());
@@ -215,7 +771,7 @@ void VisualShaderEditor::update_custom_nodes() {
Ref<VisualShaderNodeCustom> ref;
ref.instance();
- ref->set_script(script.get_ref_ptr());
+ ref->set_script(script);
String name;
if (ref->has_method("_get_name")) {
@@ -238,31 +794,35 @@ void VisualShaderEditor::update_custom_nodes() {
if (ref->has_method("_get_category")) {
category = (String)ref->call("_get_category");
}
- if (category == "") {
- category = "Custom";
- }
String subcategory = "";
if (ref->has_method("_get_subcategory")) {
subcategory = (String)ref->call("_get_subcategory");
}
+ bool highend = false;
+ if (ref->has_method("_is_highend")) {
+ highend = (bool)ref->call("_is_highend");
+ }
+
Dictionary dict;
dict["name"] = name;
dict["script"] = script;
dict["description"] = description;
dict["return_icon_type"] = return_icon_type;
- dict["category"] = category;
- dict["subcategory"] = subcategory;
- String key;
- key = category;
- key += "/";
+ category = category.rstrip("/");
+ category = category.lstrip("/");
+ category = "Addons/" + category;
if (subcategory != "") {
- key += subcategory;
- key += "/";
+ category += "/" + subcategory;
}
- key += name;
+
+ dict["category"] = category;
+ dict["highend"] = highend;
+
+ String key;
+ key = category + "/" + name;
added[key] = dict;
}
@@ -272,216 +832,261 @@ void VisualShaderEditor::update_custom_nodes() {
keys.sort();
for (int i = 0; i < keys.size(); i++) {
-
const Variant &key = keys.get(i);
const Dictionary &value = (Dictionary)added[key];
- add_custom_type(value["name"], value["script"], value["description"], value["return_icon_type"], value["category"], value["subcategory"]);
+ add_custom_type(value["name"], value["script"], value["description"], value["return_icon_type"], value["category"], value["highend"]);
}
_update_options_menu();
}
String VisualShaderEditor::_get_description(int p_idx) {
- if (add_options[p_idx].highend) {
- return TTR("(GLES3 only)") + " " + add_options[p_idx].description; // TODO: change it to (Vulkan Only) when its ready
- } else {
- return add_options[p_idx].description;
- }
+ return add_options[p_idx].description;
}
void VisualShaderEditor::_update_options_menu() {
-
node_desc->set_text("");
members_dialog->get_ok()->set_disabled(true);
- String prev_category;
- String prev_sub_category;
-
members->clear();
TreeItem *root = members->create_item();
- TreeItem *category = NULL;
- TreeItem *sub_category = NULL;
String filter = node_filter->get_text().strip_edges();
bool use_filter = !filter.empty();
- Vector<String> categories;
- Vector<String> sub_categories;
-
- int item_count = 0;
- int item_count2 = 0;
bool is_first_item = true;
- Color unsupported_color = get_color("error_color", "Editor");
- Color supported_color = get_color("warning_color", "Editor");
+ Color unsupported_color = get_theme_color("error_color", "Editor");
+ Color supported_color = get_theme_color("warning_color", "Editor");
static bool low_driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name") == "GLES2";
+ Map<String, TreeItem *> folders;
+
int current_func = -1;
if (!visual_shader.is_null()) {
current_func = visual_shader->get_mode();
}
- for (int i = 0; i < add_options.size() + 1; i++) {
+ Vector<AddOption> custom_options;
+ Vector<AddOption> embedded_options;
- if (i == add_options.size()) {
- if (sub_category != NULL && item_count2 == 0) {
- memdelete(sub_category);
- --item_count;
+ for (int i = 0; i < add_options.size(); i++) {
+ if (!use_filter || add_options[i].name.findn(filter) != -1) {
+ if ((add_options[i].func != current_func && add_options[i].func != -1) || !_is_available(add_options[i].mode)) {
+ continue;
}
- if (category != NULL && item_count == 0) {
- memdelete(category);
+ const_cast<AddOption &>(add_options[i]).temp_idx = i; // save valid id
+ if (add_options[i].is_custom) {
+ custom_options.push_back(add_options[i]);
+ } else {
+ embedded_options.push_back(add_options[i]);
}
- break;
}
+ }
+ Vector<AddOption> options;
+ SortArray<AddOption, _OptionComparator> sorter;
+ sorter.sort(custom_options.ptrw(), custom_options.size());
- if (!use_filter || add_options[i].name.findn(filter) != -1) {
+ options.append_array(custom_options);
+ options.append_array(embedded_options);
- if ((add_options[i].func != current_func && add_options[i].func != -1) || !_is_available(add_options[i].mode))
- continue;
-
- if (prev_category != add_options[i].category) {
- if (category != NULL && item_count == 0) {
- memdelete(category);
- }
+ for (int i = 0; i < options.size(); i++) {
+ String path = options[i].category;
+ Vector<String> subfolders = path.split("/");
+ TreeItem *category = nullptr;
- item_count = 0;
- prev_sub_category = "";
- category = members->create_item(root);
- category->set_text(0, add_options[i].category);
- category->set_selectable(0, false);
- if (!use_filter)
- category->set_collapsed(true);
- }
-
- if (add_options[i].sub_category != "") {
- if (prev_sub_category != add_options[i].sub_category) {
- if (category != NULL) {
- if (sub_category != NULL && item_count2 == 0) {
- memdelete(sub_category);
- --item_count;
- }
- ++item_count;
- item_count2 = 0;
- sub_category = members->create_item(category);
- sub_category->set_text(0, add_options[i].sub_category);
- sub_category->set_selectable(0, false);
- if (!use_filter)
- sub_category->set_collapsed(true);
- }
- }
- } else {
- sub_category = NULL;
- }
-
- TreeItem *p_category = NULL;
-
- if (sub_category != NULL) {
- p_category = sub_category;
- ++item_count2;
- } else if (category != NULL) {
- p_category = category;
- ++item_count;
- }
-
- if (p_category != NULL) {
- TreeItem *item = members->create_item(p_category);
- if (add_options[i].highend && low_driver)
- item->set_custom_color(0, unsupported_color);
- else if (add_options[i].highend)
- item->set_custom_color(0, supported_color);
- item->set_text(0, add_options[i].name);
- if (is_first_item && use_filter) {
- item->select(0);
- node_desc->set_text(_get_description(i));
- is_first_item = false;
- }
- switch (add_options[i].return_type) {
- case VisualShaderNode::PORT_TYPE_SCALAR:
- item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("float", "EditorIcons"));
- break;
- case VisualShaderNode::PORT_TYPE_VECTOR:
- item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("Vector3", "EditorIcons"));
- break;
- case VisualShaderNode::PORT_TYPE_BOOLEAN:
- item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("bool", "EditorIcons"));
- break;
- case VisualShaderNode::PORT_TYPE_TRANSFORM:
- item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("Transform", "EditorIcons"));
- break;
- case VisualShaderNode::PORT_TYPE_SAMPLER:
- item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("ImageTexture", "EditorIcons"));
- break;
- default:
- break;
+ if (!folders.has(path)) {
+ category = root;
+ String path_temp = "";
+ for (int j = 0; j < subfolders.size(); j++) {
+ path_temp += subfolders[j];
+ if (!folders.has(path_temp)) {
+ category = members->create_item(category);
+ category->set_selectable(0, false);
+ category->set_collapsed(!use_filter);
+ category->set_text(0, subfolders[j]);
+ folders.insert(path_temp, category);
+ } else {
+ category = folders[path_temp];
}
- item->set_meta("id", i);
}
+ } else {
+ category = folders[path];
+ }
- prev_sub_category = add_options[i].sub_category;
- prev_category = add_options[i].category;
+ TreeItem *item = members->create_item(category);
+ if (options[i].highend && low_driver) {
+ item->set_custom_color(0, unsupported_color);
+ } else if (options[i].highend) {
+ item->set_custom_color(0, supported_color);
+ }
+ item->set_text(0, options[i].name);
+ if (is_first_item && use_filter) {
+ item->select(0);
+ node_desc->set_text(options[i].description);
+ is_first_item = false;
+ }
+ switch (options[i].return_type) {
+ case VisualShaderNode::PORT_TYPE_SCALAR:
+ item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon("float", "EditorIcons"));
+ break;
+ case VisualShaderNode::PORT_TYPE_SCALAR_INT:
+ item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon("int", "EditorIcons"));
+ break;
+ case VisualShaderNode::PORT_TYPE_VECTOR:
+ item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Vector3", "EditorIcons"));
+ break;
+ case VisualShaderNode::PORT_TYPE_BOOLEAN:
+ item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon("bool", "EditorIcons"));
+ break;
+ case VisualShaderNode::PORT_TYPE_TRANSFORM:
+ item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Transform", "EditorIcons"));
+ break;
+ case VisualShaderNode::PORT_TYPE_SAMPLER:
+ item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon("ImageTexture", "EditorIcons"));
+ break;
+ default:
+ break;
}
+ item->set_meta("id", options[i].temp_idx);
}
}
-Size2 VisualShaderEditor::get_minimum_size() const {
+void VisualShaderEditor::_set_mode(int p_which) {
+ if (p_which == VisualShader::MODE_PARTICLES) {
+ edit_type_standart->set_visible(false);
+ edit_type_particles->set_visible(true);
+ edit_type = edit_type_particles;
+ particles_mode = true;
+ } else {
+ edit_type_particles->set_visible(false);
+ edit_type_standart->set_visible(true);
+ edit_type = edit_type_standart;
+ particles_mode = false;
+ }
+ visual_shader->set_shader_type(get_current_shader_type());
+}
+Size2 VisualShaderEditor::get_minimum_size() const {
return Size2(10, 200);
}
void VisualShaderEditor::_draw_color_over_button(Object *obj, Color p_color) {
-
Button *button = Object::cast_to<Button>(obj);
- if (!button)
+ if (!button) {
return;
+ }
- Ref<StyleBox> normal = get_stylebox("normal", "Button");
+ Ref<StyleBox> normal = get_theme_stylebox("normal", "Button");
button->draw_rect(Rect2(normal->get_offset(), button->get_size() - normal->get_minimum_size()), p_color);
}
-static Ref<StyleBoxEmpty> make_empty_stylebox(float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_bottom = -1) {
- Ref<StyleBoxEmpty> style(memnew(StyleBoxEmpty));
- style->set_default_margin(MARGIN_LEFT, p_margin_left * EDSCALE);
- style->set_default_margin(MARGIN_RIGHT, p_margin_right * EDSCALE);
- style->set_default_margin(MARGIN_BOTTOM, p_margin_bottom * EDSCALE);
- style->set_default_margin(MARGIN_TOP, p_margin_top * EDSCALE);
- return style;
-}
-
void VisualShaderEditor::_update_created_node(GraphNode *node) {
-
if (EditorSettings::get_singleton()->get("interface/theme/use_graph_node_headers")) {
- Ref<StyleBoxFlat> sb = node->get_stylebox("frame", "GraphNode");
+ Ref<StyleBoxFlat> sb = node->get_theme_stylebox("frame", "GraphNode");
Color c = sb->get_border_color();
- Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0) : Color(0.0, 0.0, 0.0);
+ Color ic;
+ Color mono_color;
+ if (((c.r + c.g + c.b) / 3) < 0.7) {
+ mono_color = Color(1.0, 1.0, 1.0);
+ ic = Color(0.0, 0.0, 0.0, 0.7);
+ } else {
+ mono_color = Color(0.0, 0.0, 0.0);
+ ic = Color(1.0, 1.0, 1.0, 0.7);
+ }
mono_color.a = 0.85;
c = mono_color;
- node->add_color_override("title_color", c);
+ node->add_theme_color_override("title_color", c);
c.a = 0.7;
- node->add_color_override("close_color", c);
- node->add_color_override("resizer_color", c);
+ node->add_theme_color_override("close_color", c);
+ node->add_theme_color_override("resizer_color", ic);
+ }
+}
+
+void VisualShaderEditor::_update_uniforms(bool p_update_refs) {
+ VisualShaderNodeUniformRef::clear_uniforms();
+
+ for (int t = 0; t < VisualShader::TYPE_MAX; t++) {
+ Vector<int> tnodes = visual_shader->get_node_list((VisualShader::Type)t);
+ for (int i = 0; i < tnodes.size(); i++) {
+ Ref<VisualShaderNode> vsnode = visual_shader->get_node((VisualShader::Type)t, tnodes[i]);
+ Ref<VisualShaderNodeUniform> uniform = vsnode;
+
+ if (uniform.is_valid()) {
+ Ref<VisualShaderNodeFloatUniform> float_uniform = vsnode;
+ Ref<VisualShaderNodeIntUniform> int_uniform = vsnode;
+ Ref<VisualShaderNodeVec3Uniform> vec3_uniform = vsnode;
+ Ref<VisualShaderNodeColorUniform> color_uniform = vsnode;
+ Ref<VisualShaderNodeBooleanUniform> bool_uniform = vsnode;
+ Ref<VisualShaderNodeTransformUniform> transform_uniform = vsnode;
+
+ VisualShaderNodeUniformRef::UniformType uniform_type;
+ if (float_uniform.is_valid()) {
+ uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_FLOAT;
+ } else if (int_uniform.is_valid()) {
+ uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_INT;
+ } else if (bool_uniform.is_valid()) {
+ uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_BOOLEAN;
+ } else if (vec3_uniform.is_valid()) {
+ uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_VECTOR;
+ } else if (transform_uniform.is_valid()) {
+ uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_TRANSFORM;
+ } else if (color_uniform.is_valid()) {
+ uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_COLOR;
+ } else {
+ uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_SAMPLER;
+ }
+ VisualShaderNodeUniformRef::add_uniform(uniform->get_uniform_name(), uniform_type);
+ }
+ }
+ }
+ if (p_update_refs) {
+ graph_plugin->update_uniform_refs();
}
}
-void VisualShaderEditor::_update_graph() {
+void VisualShaderEditor::_update_uniform_refs(Set<String> &p_deleted_names) {
+ for (int i = 0; i < VisualShader::TYPE_MAX; i++) {
+ VisualShader::Type type = VisualShader::Type(i);
- if (updating)
+ Vector<int> nodes = visual_shader->get_node_list(type);
+ for (int j = 0; j < nodes.size(); j++) {
+ if (j > 0) {
+ Ref<VisualShaderNodeUniformRef> ref = visual_shader->get_node(type, nodes[j]);
+ if (ref.is_valid()) {
+ if (p_deleted_names.has(ref->get_uniform_name())) {
+ undo_redo->add_do_method(ref.ptr(), "set_uniform_name", "[None]");
+ undo_redo->add_undo_method(ref.ptr(), "set_uniform_name", ref->get_uniform_name());
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", VisualShader::Type(i), nodes[j]);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", VisualShader::Type(i), nodes[j]);
+ }
+ }
+ }
+ }
+ }
+}
+
+void VisualShaderEditor::_update_graph() {
+ if (updating) {
return;
+ }
- if (visual_shader.is_null())
+ if (visual_shader.is_null()) {
return;
+ }
graph->set_scroll_ofs(visual_shader->get_graph_offset() * EDSCALE);
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
+
graph->clear_connections();
//erase all nodes
for (int i = 0; i < graph->get_child_count(); i++) {
-
if (Object::cast_to<GraphNode>(graph->get_child(i))) {
Node *node = graph->get_child(i);
graph->remove_child(node);
@@ -490,381 +1095,24 @@ void VisualShaderEditor::_update_graph() {
}
}
- static const Color type_color[5] = {
- Color(0.38, 0.85, 0.96), // scalar
- Color(0.84, 0.49, 0.93), // vector
- Color(0.55, 0.65, 0.94), // boolean
- Color(0.96, 0.66, 0.43), // transform
- Color(1.0, 1.0, 0.0) // sampler
- };
-
List<VisualShader::Connection> connections;
visual_shader->get_node_connections(type, &connections);
-
- Ref<StyleBoxEmpty> label_style = make_empty_stylebox(2, 1, 2, 1);
+ graph_plugin->set_connections(connections);
Vector<int> nodes = visual_shader->get_node_list(type);
- Control *offset;
-
- for (int n_i = 0; n_i < nodes.size(); n_i++) {
-
- Vector2 position = visual_shader->get_node_position(type, nodes[n_i]);
- Ref<VisualShaderNode> vsnode = visual_shader->get_node(type, nodes[n_i]);
-
- Ref<VisualShaderNodeGroupBase> group_node = Object::cast_to<VisualShaderNodeGroupBase>(vsnode.ptr());
- bool is_group = !group_node.is_null();
- Size2 size = Size2(0, 0);
-
- Ref<VisualShaderNodeExpression> expression_node = Object::cast_to<VisualShaderNodeExpression>(group_node.ptr());
- bool is_expression = !expression_node.is_null();
- String expression = "";
-
- GraphNode *node = memnew(GraphNode);
-
- if (is_group) {
- size = group_node->get_size();
-
- node->set_resizable(true);
- node->connect("resize_request", this, "_node_resized", varray((int)type, nodes[n_i]));
- }
- if (is_expression) {
- expression = expression_node->get_expression();
- }
-
- /*if (!vsnode->is_connected("changed", this, "_node_changed")) {
- vsnode->connect("changed", this, "_node_changed", varray(vsnode->get_instance_id()), CONNECT_DEFERRED);
- }*/
-
- node->set_offset(position);
-
- node->set_title(vsnode->get_caption());
- node->set_name(itos(nodes[n_i]));
-
- if (nodes[n_i] >= 2) {
- node->set_show_close_button(true);
- node->connect("close_request", this, "_delete_request", varray(nodes[n_i]), CONNECT_DEFERRED);
- }
-
- node->connect("dragged", this, "_node_dragged", varray(nodes[n_i]));
-
- Control *custom_editor = NULL;
- int port_offset = 0;
-
- if (is_group) {
- port_offset += 2;
- }
-
- Ref<VisualShaderNodeUniform> uniform = vsnode;
- if (uniform.is_valid()) {
- graph->add_child(node);
- _update_created_node(node);
-
- LineEdit *uniform_name = memnew(LineEdit);
- uniform_name->set_text(uniform->get_uniform_name());
- node->add_child(uniform_name);
- uniform_name->connect("text_entered", this, "_line_edit_changed", varray(uniform_name, nodes[n_i]));
- uniform_name->connect("focus_exited", this, "_line_edit_focus_out", varray(uniform_name, nodes[n_i]));
-
- if (vsnode->get_input_port_count() == 0 && vsnode->get_output_port_count() == 1 && vsnode->get_output_port_name(0) == "") {
- //shortcut
- VisualShaderNode::PortType port_right = vsnode->get_output_port_type(0);
- node->set_slot(0, false, VisualShaderNode::PORT_TYPE_SCALAR, Color(), true, port_right, type_color[port_right]);
- continue;
- }
- port_offset++;
- }
-
- for (int i = 0; i < plugins.size(); i++) {
- custom_editor = plugins.write[i]->create_editor(visual_shader, vsnode);
- if (custom_editor) {
- break;
- }
- }
-
- if (custom_editor && vsnode->get_output_port_count() > 0 && vsnode->get_output_port_name(0) == "" && (vsnode->get_input_port_count() == 0 || vsnode->get_input_port_name(0) == "")) {
- //will be embedded in first port
- } else if (custom_editor) {
- port_offset++;
- node->add_child(custom_editor);
- custom_editor = NULL;
- }
-
- if (is_group) {
-
- offset = memnew(Control);
- offset->set_custom_minimum_size(Size2(0, 6 * EDSCALE));
- node->add_child(offset);
-
- if (group_node->is_editable()) {
- HBoxContainer *hb2 = memnew(HBoxContainer);
-
- Button *add_input_btn = memnew(Button);
- add_input_btn->set_text(TTR("Add Input"));
- add_input_btn->connect("pressed", this, "_add_input_port", varray(nodes[n_i], group_node->get_free_input_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "input" + itos(group_node->get_free_input_port_id())), CONNECT_DEFERRED);
- hb2->add_child(add_input_btn);
+ _update_uniforms(false);
- hb2->add_spacer();
+ graph_plugin->clear_links();
+ graph_plugin->make_dirty(true);
- Button *add_output_btn = memnew(Button);
- add_output_btn->set_text(TTR("Add Output"));
- add_output_btn->connect("pressed", this, "_add_output_port", varray(nodes[n_i], group_node->get_free_output_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, "output" + itos(group_node->get_free_output_port_id())), CONNECT_DEFERRED);
- hb2->add_child(add_output_btn);
-
- node->add_child(hb2);
- }
- }
-
- for (int i = 0; i < MAX(vsnode->get_input_port_count(), vsnode->get_output_port_count()); i++) {
-
- if (vsnode->is_port_separator(i)) {
- node->add_child(memnew(HSeparator));
- port_offset++;
- }
-
- bool valid_left = i < vsnode->get_input_port_count();
- VisualShaderNode::PortType port_left = VisualShaderNode::PORT_TYPE_SCALAR;
- bool port_left_used = false;
- String name_left;
- if (valid_left) {
- name_left = vsnode->get_input_port_name(i);
- port_left = vsnode->get_input_port_type(i);
- for (List<VisualShader::Connection>::Element *E = connections.front(); E; E = E->next()) {
- if (E->get().to_node == nodes[n_i] && E->get().to_port == i) {
- port_left_used = true;
- }
- }
- }
-
- bool valid_right = i < vsnode->get_output_port_count();
- VisualShaderNode::PortType port_right = VisualShaderNode::PORT_TYPE_SCALAR;
- String name_right;
- if (valid_right) {
- name_right = vsnode->get_output_port_name(i);
- port_right = vsnode->get_output_port_type(i);
- }
-
- HBoxContainer *hb = memnew(HBoxContainer);
- hb->add_constant_override("separation", 7 * EDSCALE);
-
- Variant default_value;
-
- if (valid_left && !port_left_used) {
- default_value = vsnode->get_input_port_default_value(i);
- }
-
- if (default_value.get_type() != Variant::NIL) { // only a label
- Button *button = memnew(Button);
- hb->add_child(button);
- button->connect("pressed", this, "_edit_port_default_input", varray(button, nodes[n_i], i));
-
- switch (default_value.get_type()) {
-
- case Variant::COLOR: {
- button->set_custom_minimum_size(Size2(30, 0) * EDSCALE);
- button->connect("draw", this, "_draw_color_over_button", varray(button, default_value));
- } break;
- case Variant::BOOL: {
- button->set_text(((bool)default_value) ? "true" : "false");
- } break;
- case Variant::INT:
- case Variant::REAL: {
- button->set_text(String::num(default_value, 4));
- } break;
- case Variant::VECTOR3: {
- Vector3 v = default_value;
- button->set_text(String::num(v.x, 3) + "," + String::num(v.y, 3) + "," + String::num(v.z, 3));
- } break;
- default: {
- }
- }
- }
-
- if (i == 0 && custom_editor) {
- hb->add_child(custom_editor);
- custom_editor->set_h_size_flags(SIZE_EXPAND_FILL);
- } else {
-
- if (valid_left) {
-
- if (is_group) {
- OptionButton *type_box = memnew(OptionButton);
- hb->add_child(type_box);
- type_box->add_item(TTR("Scalar"));
- type_box->add_item(TTR("Vector"));
- type_box->add_item(TTR("Boolean"));
- type_box->add_item(TTR("Transform"));
- type_box->add_item(TTR("Sampler"));
- type_box->select(group_node->get_input_port_type(i));
- type_box->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
- type_box->connect("item_selected", this, "_change_input_port_type", varray(nodes[n_i], i), CONNECT_DEFERRED);
-
- LineEdit *name_box = memnew(LineEdit);
- hb->add_child(name_box);
- name_box->set_custom_minimum_size(Size2(65 * EDSCALE, 0));
- name_box->set_h_size_flags(SIZE_EXPAND_FILL);
- name_box->set_text(name_left);
- name_box->connect("text_entered", this, "_change_input_port_name", varray(name_box, nodes[n_i], i));
- name_box->connect("focus_exited", this, "_port_name_focus_out", varray(name_box, nodes[n_i], i, false));
-
- Button *remove_btn = memnew(Button);
- remove_btn->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Remove", "EditorIcons"));
- remove_btn->set_tooltip(TTR("Remove") + " " + name_left);
- remove_btn->connect("pressed", this, "_remove_input_port", varray(nodes[n_i], i), CONNECT_DEFERRED);
- hb->add_child(remove_btn);
- } else {
-
- Label *label = memnew(Label);
- label->set_text(name_left);
- label->add_style_override("normal", label_style); //more compact
- hb->add_child(label);
-
- if (vsnode->get_input_port_default_hint(i) != "" && !port_left_used) {
-
- Label *hint_label = memnew(Label);
- hint_label->set_text("[" + vsnode->get_input_port_default_hint(i) + "]");
- hint_label->add_color_override("font_color", get_color("font_color_readonly", "TextEdit"));
- hint_label->add_style_override("normal", label_style);
- hb->add_child(hint_label);
- }
- }
- }
-
- if (!is_group) {
- hb->add_spacer();
- }
-
- if (valid_right) {
- if (is_group) {
- Button *remove_btn = memnew(Button);
- remove_btn->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Remove", "EditorIcons"));
- remove_btn->set_tooltip(TTR("Remove") + " " + name_left);
- remove_btn->connect("pressed", this, "_remove_output_port", varray(nodes[n_i], i), CONNECT_DEFERRED);
- hb->add_child(remove_btn);
-
- LineEdit *name_box = memnew(LineEdit);
- hb->add_child(name_box);
- name_box->set_custom_minimum_size(Size2(65 * EDSCALE, 0));
- name_box->set_h_size_flags(SIZE_EXPAND_FILL);
- name_box->set_text(name_right);
- name_box->connect("text_entered", this, "_change_output_port_name", varray(name_box, nodes[n_i], i));
- name_box->connect("focus_exited", this, "_port_name_focus_out", varray(name_box, nodes[n_i], i, true));
-
- OptionButton *type_box = memnew(OptionButton);
- hb->add_child(type_box);
- type_box->add_item(TTR("Scalar"));
- type_box->add_item(TTR("Vector"));
- type_box->add_item(TTR("Boolean"));
- type_box->add_item(TTR("Transform"));
- type_box->select(group_node->get_output_port_type(i));
- type_box->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
- type_box->connect("item_selected", this, "_change_output_port_type", varray(nodes[n_i], i), CONNECT_DEFERRED);
- } else {
- Label *label = memnew(Label);
- label->set_text(name_right);
- label->add_style_override("normal", label_style); //more compact
- hb->add_child(label);
- }
- }
- }
-
- if (valid_right && edit_type->get_selected() == VisualShader::TYPE_FRAGMENT && port_right != VisualShaderNode::PORT_TYPE_TRANSFORM && port_right != VisualShaderNode::PORT_TYPE_SAMPLER) {
- TextureButton *preview = memnew(TextureButton);
- preview->set_toggle_mode(true);
- preview->set_normal_texture(get_icon("GuiVisibilityHidden", "EditorIcons"));
- preview->set_pressed_texture(get_icon("GuiVisibilityVisible", "EditorIcons"));
- preview->set_v_size_flags(SIZE_SHRINK_CENTER);
-
- if (vsnode->get_output_port_for_preview() == i) {
- preview->set_pressed(true);
- }
-
- preview->connect("pressed", this, "_preview_select_port", varray(nodes[n_i], i), CONNECT_DEFERRED);
- hb->add_child(preview);
- }
-
- if (is_group) {
- offset = memnew(Control);
- offset->set_custom_minimum_size(Size2(0, 5 * EDSCALE));
- node->add_child(offset);
- port_offset++;
- }
-
- node->add_child(hb);
-
- node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], valid_right, port_right, type_color[port_right]);
- }
-
- if (vsnode->get_output_port_for_preview() >= 0) {
- int port_type = vsnode->get_output_port_type(vsnode->get_output_port_for_preview());
-
- if (port_type != VisualShaderNode::PORT_TYPE_TRANSFORM && port_type != VisualShaderNode::PORT_TYPE_SAMPLER) {
- offset = memnew(Control);
- offset->set_custom_minimum_size(Size2(0, 5 * EDSCALE));
- node->add_child(offset);
-
- VisualShaderNodePortPreview *port_preview = memnew(VisualShaderNodePortPreview);
- port_preview->setup(visual_shader, type, nodes[n_i], vsnode->get_output_port_for_preview());
- port_preview->set_h_size_flags(SIZE_SHRINK_CENTER);
- node->add_child(port_preview);
- }
- }
-
- offset = memnew(Control);
- offset->set_custom_minimum_size(Size2(0, 4 * EDSCALE));
- node->add_child(offset);
-
- String error = vsnode->get_warning(visual_shader->get_mode(), type);
- if (error != String()) {
- Label *error_label = memnew(Label);
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
- error_label->set_text(error);
- node->add_child(error_label);
- }
-
- if (is_expression) {
-
- TextEdit *expression_box = memnew(TextEdit);
- expression_node->set_control(expression_box, 0);
- node->add_child(expression_box);
-
- Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
- Color text_color = EDITOR_GET("text_editor/highlighting/text_color");
- Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
- Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
- Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
-
- expression_box->set_syntax_coloring(true);
- expression_box->add_color_override("background_color", background_color);
-
- for (List<String>::Element *E = keyword_list.front(); E; E = E->next()) {
-
- expression_box->add_keyword_color(E->get(), keyword_color);
- }
-
- expression_box->add_font_override("font", get_font("expression", "EditorFonts"));
- expression_box->add_color_override("font_color", text_color);
- expression_box->add_color_override("symbol_color", symbol_color);
- expression_box->add_color_region("/*", "*/", comment_color, false);
- expression_box->add_color_region("//", "", comment_color, false);
-
- expression_box->set_text(expression);
- expression_box->set_context_menu_enabled(false);
- expression_box->set_show_line_numbers(true);
-
- expression_box->connect("focus_exited", this, "_expression_focus_out", varray(expression_box, nodes[n_i]));
- }
-
- if (!uniform.is_valid()) {
- graph->add_child(node);
- _update_created_node(node);
- if (is_group)
- call_deferred("_set_node_size", (int)type, nodes[n_i], size);
- }
+ for (int n_i = 0; n_i < nodes.size(); n_i++) {
+ graph_plugin->add_node(type, nodes[n_i]);
}
- for (List<VisualShader::Connection>::Element *E = connections.front(); E; E = E->next()) {
+ graph_plugin->make_dirty(false);
+ for (List<VisualShader::Connection>::Element *E = connections.front(); E; E = E->next()) {
int from = E->get().from_node;
int from_idx = E->get().from_port;
int to = E->get().to_node;
@@ -874,9 +1122,18 @@ void VisualShaderEditor::_update_graph() {
}
}
-void VisualShaderEditor::_add_input_port(int p_node, int p_port, int p_port_type, const String &p_name) {
+VisualShader::Type VisualShaderEditor::get_current_shader_type() const {
+ VisualShader::Type type;
+ if (particles_mode) {
+ type = VisualShader::Type(edit_type->get_selected() + 3);
+ } else {
+ type = VisualShader::Type(edit_type->get_selected());
+ }
+ return type;
+}
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+void VisualShaderEditor::_add_input_port(int p_node, int p_port, int p_port_type, const String &p_name) {
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeExpression> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -885,16 +1142,13 @@ void VisualShaderEditor::_add_input_port(int p_node, int p_port, int p_port_type
undo_redo->create_action(TTR("Add input port"));
undo_redo->add_do_method(node.ptr(), "add_input_port", p_port, p_port_type, p_name);
undo_redo->add_undo_method(node.ptr(), "remove_input_port", p_port);
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node);
undo_redo->commit_action();
}
void VisualShaderEditor::_add_output_port(int p_node, int p_port, int p_port_type, const String &p_name) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -903,16 +1157,13 @@ void VisualShaderEditor::_add_output_port(int p_node, int p_port, int p_port_typ
undo_redo->create_action(TTR("Add output port"));
undo_redo->add_do_method(node.ptr(), "add_output_port", p_port, p_port_type, p_name);
undo_redo->add_undo_method(node.ptr(), "remove_output_port", p_port);
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node);
undo_redo->commit_action();
}
void VisualShaderEditor::_change_input_port_type(int p_type, int p_node, int p_port) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -921,16 +1172,13 @@ void VisualShaderEditor::_change_input_port_type(int p_type, int p_node, int p_p
undo_redo->create_action(TTR("Change input port type"));
undo_redo->add_do_method(node.ptr(), "set_input_port_type", p_port, p_type);
undo_redo->add_undo_method(node.ptr(), "set_input_port_type", p_port, node->get_input_port_type(p_port));
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node);
undo_redo->commit_action();
}
void VisualShaderEditor::_change_output_port_type(int p_type, int p_node, int p_port) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -939,16 +1187,13 @@ void VisualShaderEditor::_change_output_port_type(int p_type, int p_node, int p_
undo_redo->create_action(TTR("Change output port type"));
undo_redo->add_do_method(node.ptr(), "set_output_port_type", p_port, p_type);
undo_redo->add_undo_method(node.ptr(), "set_output_port_type", p_port, node->get_output_port_type(p_port));
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node);
undo_redo->commit_action();
}
void VisualShaderEditor::_change_input_port_name(const String &p_text, Object *line_edit, int p_node_id, int p_port_id) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node_id);
ERR_FAIL_COND(!node.is_valid());
@@ -956,14 +1201,13 @@ void VisualShaderEditor::_change_input_port_name(const String &p_text, Object *l
undo_redo->create_action(TTR("Change input port name"));
undo_redo->add_do_method(node.ptr(), "set_input_port_name", p_port_id, p_text);
undo_redo->add_undo_method(node.ptr(), "set_input_port_name", p_port_id, node->get_input_port_name(p_port_id));
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node_id);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node_id);
undo_redo->commit_action();
}
void VisualShaderEditor::_change_output_port_name(const String &p_text, Object *line_edit, int p_node_id, int p_port_id) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node_id);
ERR_FAIL_COND(!node.is_valid());
@@ -971,14 +1215,13 @@ void VisualShaderEditor::_change_output_port_name(const String &p_text, Object *
undo_redo->create_action(TTR("Change output port name"));
undo_redo->add_do_method(node.ptr(), "set_output_port_name", p_port_id, p_text);
undo_redo->add_undo_method(node.ptr(), "set_output_port_name", p_port_id, node->get_output_port_name(p_port_id));
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node_id);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node_id);
undo_redo->commit_action();
}
void VisualShaderEditor::_remove_input_port(int p_node, int p_port) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -989,7 +1232,6 @@ void VisualShaderEditor::_remove_input_port(int p_node, int p_port) {
List<VisualShader::Connection> conns;
visual_shader->get_node_connections(type, &conns);
for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
-
int from_node = E->get().from_node;
int from_port = E->get().from_port;
int to_node = E->get().to_node;
@@ -999,12 +1241,21 @@ void VisualShaderEditor::_remove_input_port(int p_node, int p_port) {
if (to_port == p_port) {
undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes_forced", type, from_node, from_port, to_node, to_port);
+
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, from_node, from_port, to_node, to_port);
} else if (to_port > p_port) {
undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes_forced", type, from_node, from_port, to_node, to_port);
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, from_node, from_port, to_node, to_port);
+
undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes_forced", type, from_node, from_port, to_node, to_port - 1);
undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port - 1);
+
+ undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, from_node, from_port, to_node, to_port - 1);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port - 1);
}
}
}
@@ -1012,18 +1263,14 @@ void VisualShaderEditor::_remove_input_port(int p_node, int p_port) {
undo_redo->add_do_method(node.ptr(), "remove_input_port", p_port);
undo_redo->add_undo_method(node.ptr(), "add_input_port", p_port, (int)node->get_input_port_type(p_port), node->get_input_port_name(p_port));
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
-
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node);
undo_redo->commit_action();
}
void VisualShaderEditor::_remove_output_port(int p_node, int p_port) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -1034,7 +1281,6 @@ void VisualShaderEditor::_remove_output_port(int p_node, int p_port) {
List<VisualShader::Connection> conns;
visual_shader->get_node_connections(type, &conns);
for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
-
int from_node = E->get().from_node;
int from_port = E->get().from_port;
int to_node = E->get().to_node;
@@ -1044,12 +1290,21 @@ void VisualShaderEditor::_remove_output_port(int p_node, int p_port) {
if (from_port == p_port) {
undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes_forced", type, from_node, from_port, to_node, to_port);
+
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, from_node, from_port, to_node, to_port);
} else if (from_port > p_port) {
undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes_forced", type, from_node, from_port, to_node, to_port);
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, from_node, from_port, to_node, to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, from_node, from_port, to_node, to_port);
+
undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes_forced", type, from_node, from_port - 1, to_node, to_port);
undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_port - 1, to_node, to_port);
+
+ undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, from_node, from_port - 1, to_node, to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, from_node, from_port - 1, to_node, to_port);
}
}
}
@@ -1057,46 +1312,33 @@ void VisualShaderEditor::_remove_output_port(int p_node, int p_port) {
undo_redo->add_do_method(node.ptr(), "remove_output_port", p_port);
undo_redo->add_undo_method(node.ptr(), "add_output_port", p_port, (int)node->get_output_port_type(p_port), node->get_output_port_name(p_port));
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
-
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type, p_node);
undo_redo->commit_action();
}
-void VisualShaderEditor::_expression_focus_out(Object *text_edit, int p_node) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+void VisualShaderEditor::_expression_focus_out(Object *code_edit, int p_node) {
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeExpression> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
}
- TextEdit *expression_box = Object::cast_to<TextEdit>(text_edit);
+ CodeEdit *expression_box = Object::cast_to<CodeEdit>(code_edit);
- if (node->get_expression() == expression_box->get_text())
+ if (node->get_expression() == expression_box->get_text()) {
return;
+ }
undo_redo->create_action(TTR("Set expression"));
undo_redo->add_do_method(node.ptr(), "set_expression", expression_box->get_text());
undo_redo->add_undo_method(node.ptr(), "set_expression", node->get_expression());
- undo_redo->add_do_method(this, "_rebuild");
- undo_redo->add_undo_method(this, "_rebuild");
undo_redo->commit_action();
}
-void VisualShaderEditor::_rebuild() {
- if (visual_shader != NULL) {
- EditorNode::get_singleton()->get_log()->clear();
- visual_shader->rebuild();
- }
-}
-
void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p_size) {
-
- VisualShader::Type type = VisualShader::Type(p_type);
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNode> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -1112,12 +1354,13 @@ void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p
group_node->set_size(size);
- GraphNode *gn = NULL;
+ GraphNode *gn = nullptr;
if (edit_type->get_selected() == p_type) { // check - otherwise the error will be emitted
Node *node2 = graph->get_node(itos(p_node));
gn = Object::cast_to<GraphNode>(node2);
- if (!gn)
+ if (!gn) {
return;
+ }
gn->set_custom_minimum_size(size);
gn->set_size(Size2(1, 1));
@@ -1127,7 +1370,7 @@ void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p
if (!expression_node.is_null()) {
Control *text_box = expression_node->get_control(0);
Size2 box_size = size;
- if (gn != NULL) {
+ if (gn != nullptr) {
if (box_size.x < 150 * EDSCALE || box_size.y < 0) {
box_size.x = gn->get_size().x;
}
@@ -1142,8 +1385,7 @@ void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p
}
void VisualShaderEditor::_node_resized(const Vector2 &p_new_size, int p_type, int p_node) {
-
- VisualShader::Type type = VisualShader::Type(p_type);
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
@@ -1156,54 +1398,57 @@ void VisualShaderEditor::_node_resized(const Vector2 &p_new_size, int p_type, in
}
void VisualShaderEditor::_preview_select_port(int p_node, int p_port) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNode> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
}
-
+ int prev_port = node->get_output_port_for_preview();
if (node->get_output_port_for_preview() == p_port) {
p_port = -1; //toggle it
}
- undo_redo->create_action(TTR("Set Uniform Name"));
+ undo_redo->create_action(p_port == -1 ? TTR("Hide Port Preview") : TTR("Show Port Preview"));
undo_redo->add_do_method(node.ptr(), "set_output_port_for_preview", p_port);
- undo_redo->add_undo_method(node.ptr(), "set_output_port_for_preview", node->get_output_port_for_preview());
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ undo_redo->add_undo_method(node.ptr(), "set_output_port_for_preview", prev_port);
+ undo_redo->add_do_method(graph_plugin.ptr(), "show_port_preview", (int)type, p_node, p_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "show_port_preview", (int)type, p_node, prev_port);
undo_redo->commit_action();
}
-void VisualShaderEditor::_line_edit_changed(const String &p_text, Object *line_edit, int p_node_id) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+void VisualShaderEditor::_uniform_line_edit_changed(const String &p_text, int p_node_id) {
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeUniform> node = visual_shader->get_node(type, p_node_id);
ERR_FAIL_COND(!node.is_valid());
String validated_name = visual_shader->validate_uniform_name(p_text, node);
- updating = true;
+ if (validated_name == node->get_uniform_name()) {
+ return;
+ }
+
undo_redo->create_action(TTR("Set Uniform Name"));
undo_redo->add_do_method(node.ptr(), "set_uniform_name", validated_name);
undo_redo->add_undo_method(node.ptr(), "set_uniform_name", node->get_uniform_name());
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
- undo_redo->commit_action();
- updating = false;
+ undo_redo->add_do_method(graph_plugin.ptr(), "set_uniform_name", type, p_node_id, validated_name);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "set_uniform_name", type, p_node_id, node->get_uniform_name());
- Object::cast_to<LineEdit>(line_edit)->set_text(validated_name);
-}
+ undo_redo->add_do_method(this, "_update_uniforms", true);
+ undo_redo->add_undo_method(this, "_update_uniforms", true);
-void VisualShaderEditor::_line_edit_focus_out(Object *line_edit, int p_node_id) {
+ Set<String> changed_names;
+ changed_names.insert(node->get_uniform_name());
+ _update_uniform_refs(changed_names);
- String text = Object::cast_to<LineEdit>(line_edit)->get_text();
- _line_edit_changed(text, line_edit, p_node_id);
+ undo_redo->commit_action();
}
-void VisualShaderEditor::_port_name_focus_out(Object *line_edit, int p_node_id, int p_port_id, bool p_output) {
+void VisualShaderEditor::_uniform_line_edit_focus_out(Object *line_edit, int p_node_id) {
+ _uniform_line_edit_changed(Object::cast_to<LineEdit>(line_edit)->get_text(), p_node_id);
+}
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+void VisualShaderEditor::_port_name_focus_out(Object *line_edit, int p_node_id, int p_port_id, bool p_output) {
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node_id);
ERR_FAIL_COND(!node.is_valid());
@@ -1211,22 +1456,28 @@ void VisualShaderEditor::_port_name_focus_out(Object *line_edit, int p_node_id,
String text = Object::cast_to<LineEdit>(line_edit)->get_text();
if (!p_output) {
- if (node->get_input_port_name(p_port_id) == text)
+ if (node->get_input_port_name(p_port_id) == text) {
return;
+ }
} else {
- if (node->get_output_port_name(p_port_id) == text)
+ if (node->get_output_port_name(p_port_id) == text) {
return;
+ }
}
List<String> input_names;
List<String> output_names;
for (int i = 0; i < node->get_input_port_count(); i++) {
- if (!p_output && i == p_port_id) continue;
+ if (!p_output && i == p_port_id) {
+ continue;
+ }
input_names.push_back(node->get_input_port_name(i));
}
for (int i = 0; i < node->get_output_port_count(); i++) {
- if (p_output && i == p_port_id) continue;
+ if (p_output && i == p_port_id) {
+ continue;
+ }
output_names.push_back(node->get_output_port_name(i));
}
@@ -1248,8 +1499,7 @@ void VisualShaderEditor::_port_name_focus_out(Object *line_edit, int p_node_id,
}
void VisualShaderEditor::_port_edited() {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Variant value = property_editor->get_variant();
Ref<VisualShaderNode> vsn = visual_shader->get_node(type, editing_node);
@@ -1258,31 +1508,29 @@ void VisualShaderEditor::_port_edited() {
undo_redo->create_action(TTR("Set Input Default Port"));
undo_redo->add_do_method(vsn.ptr(), "set_input_port_default_value", editing_port, value);
undo_redo->add_undo_method(vsn.ptr(), "set_input_port_default_value", editing_port, vsn->get_input_port_default_value(editing_port));
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ undo_redo->add_do_method(graph_plugin.ptr(), "set_input_port_default_value", type, editing_node, editing_port, value);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "set_input_port_default_value", type, editing_node, editing_port, vsn->get_input_port_default_value(editing_port));
undo_redo->commit_action();
property_editor->hide();
}
void VisualShaderEditor::_edit_port_default_input(Object *p_button, int p_node, int p_port) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNode> vsn = visual_shader->get_node(type, p_node);
Button *button = Object::cast_to<Button>(p_button);
ERR_FAIL_COND(!button);
Variant value = vsn->get_input_port_default_value(p_port);
- property_editor->set_global_position(button->get_global_position() + Vector2(0, button->get_size().height));
- property_editor->edit(NULL, "", value.get_type(), value, 0, "");
+ property_editor->set_position(button->get_screen_position() + Vector2(0, button->get_size().height));
+ property_editor->edit(nullptr, "", value.get_type(), value, 0, "");
property_editor->popup();
editing_node = p_node;
editing_port = p_port;
}
void VisualShaderEditor::_add_custom_node(const String &p_path) {
-
int idx = -1;
for (int i = custom_node_option_idx; i < add_options.size(); i++) {
@@ -1304,8 +1552,7 @@ void VisualShaderEditor::_add_texture_node(const String &p_path) {
}
VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
-
- ERR_FAIL_INDEX_V(p_idx, add_options.size(), NULL);
+ ERR_FAIL_INDEX_V(p_idx, add_options.size(), nullptr);
Ref<VisualShaderNode> vsnode;
@@ -1313,17 +1560,17 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
if (!is_custom && add_options[p_idx].type != String()) {
VisualShaderNode *vsn = Object::cast_to<VisualShaderNode>(ClassDB::instance(add_options[p_idx].type));
- ERR_FAIL_COND_V(!vsn, NULL);
+ ERR_FAIL_COND_V(!vsn, nullptr);
- VisualShaderNodeScalarConstant *constant = Object::cast_to<VisualShaderNodeScalarConstant>(vsn);
+ VisualShaderNodeFloatConstant *constant = Object::cast_to<VisualShaderNodeFloatConstant>(vsn);
if (constant) {
- if ((int)add_options[p_idx].value != -1)
+ if ((int)add_options[p_idx].value != -1) {
constant->set_constant(add_options[p_idx].value);
+ }
}
if (p_op_idx != -1) {
-
VisualShaderNodeInput *input = Object::cast_to<VisualShaderNodeInput>(vsn);
if (input) {
@@ -1354,16 +1601,28 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
colorFunc->set_function((VisualShaderNodeColorFunc::Function)p_op_idx);
}
- VisualShaderNodeScalarOp *scalarOp = Object::cast_to<VisualShaderNodeScalarOp>(vsn);
+ VisualShaderNodeFloatOp *floatOp = Object::cast_to<VisualShaderNodeFloatOp>(vsn);
+
+ if (floatOp) {
+ floatOp->set_operator((VisualShaderNodeFloatOp::Operator)p_op_idx);
+ }
+
+ VisualShaderNodeIntOp *intOp = Object::cast_to<VisualShaderNodeIntOp>(vsn);
- if (scalarOp) {
- scalarOp->set_operator((VisualShaderNodeScalarOp::Operator)p_op_idx);
+ if (intOp) {
+ intOp->set_operator((VisualShaderNodeIntOp::Operator)p_op_idx);
}
- VisualShaderNodeScalarFunc *scalarFunc = Object::cast_to<VisualShaderNodeScalarFunc>(vsn);
+ VisualShaderNodeFloatFunc *floatFunc = Object::cast_to<VisualShaderNodeFloatFunc>(vsn);
- if (scalarFunc) {
- scalarFunc->set_function((VisualShaderNodeScalarFunc::Function)p_op_idx);
+ if (floatFunc) {
+ floatFunc->set_function((VisualShaderNodeFloatFunc::Function)p_op_idx);
+ }
+
+ VisualShaderNodeIntFunc *intFunc = Object::cast_to<VisualShaderNodeIntFunc>(vsn);
+
+ if (intFunc) {
+ intFunc->set_function((VisualShaderNodeIntFunc::Function)p_op_idx);
}
VisualShaderNodeVectorOp *vecOp = Object::cast_to<VisualShaderNodeVectorOp>(vsn);
@@ -1395,16 +1654,22 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
if (vderFunc) {
vderFunc->set_function((VisualShaderNodeVectorDerivativeFunc::Function)p_op_idx);
}
+
+ VisualShaderNodeMultiplyAdd *fmaFunc = Object::cast_to<VisualShaderNodeMultiplyAdd>(vsn);
+
+ if (fmaFunc) {
+ fmaFunc->set_type((VisualShaderNodeMultiplyAdd::Type)p_op_idx);
+ }
}
vsnode = Ref<VisualShaderNode>(vsn);
} else {
- ERR_FAIL_COND_V(add_options[p_idx].script.is_null(), NULL);
+ ERR_FAIL_COND_V(add_options[p_idx].script.is_null(), nullptr);
String base_type = add_options[p_idx].script->get_instance_base_type();
VisualShaderNode *vsn = Object::cast_to<VisualShaderNode>(ClassDB::instance(base_type));
- ERR_FAIL_COND_V(!vsn, NULL);
+ ERR_FAIL_COND_V(!vsn, nullptr);
vsnode = Ref<VisualShaderNode>(vsn);
- vsnode->set_script(add_options[p_idx].script.get_ref_ptr());
+ vsnode->set_script(add_options[p_idx].script);
}
Point2 position = graph->get_scroll_ofs();
@@ -1417,13 +1682,15 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
}
saved_node_pos_dirty = false;
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
int id_to_use = visual_shader->get_valid_node_id(type);
undo_redo->create_action(TTR("Add Node to Visual Shader"));
undo_redo->add_do_method(visual_shader.ptr(), "add_node", type, vsnode, position, id_to_use);
undo_redo->add_undo_method(visual_shader.ptr(), "remove_node", type, id_to_use);
+ undo_redo->add_do_method(graph_plugin.ptr(), "add_node", type, id_to_use);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "remove_node", type, id_to_use);
VisualShaderNodeExpression *expr = Object::cast_to<VisualShaderNodeExpression>(vsnode.ptr());
if (expr) {
@@ -1432,51 +1699,53 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
if (to_node != -1 && to_slot != -1) {
if (vsnode->get_output_port_count() > 0) {
-
int _from_node = id_to_use;
int _from_slot = 0;
if (visual_shader->is_port_types_compatible(vsnode->get_output_port_type(_from_slot), visual_shader->get_node(type, to_node)->get_input_port_type(to_slot))) {
undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, _from_node, _from_slot, to_node, to_slot);
undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, _from_node, _from_slot, to_node, to_slot);
+ undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, _from_node, _from_slot, to_node, to_slot);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, _from_node, _from_slot, to_node, to_slot);
}
}
} else if (from_node != -1 && from_slot != -1) {
if (vsnode->get_input_port_count() > 0) {
-
int _to_node = id_to_use;
int _to_slot = 0;
if (visual_shader->is_port_types_compatible(visual_shader->get_node(type, from_node)->get_output_port_type(from_slot), vsnode->get_input_port_type(_to_slot))) {
- undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, from_node, from_slot, _to_node, _to_slot);
undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_slot, _to_node, _to_slot);
+ undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, from_node, from_slot, _to_node, _to_slot);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, from_node, from_slot, _to_node, _to_slot);
+ undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, from_node, from_slot, _to_node, _to_slot);
}
}
}
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ VisualShaderNodeUniform *uniform = Object::cast_to<VisualShaderNodeUniform>(vsnode.ptr());
+ if (uniform) {
+ undo_redo->add_do_method(this, "_update_uniforms", true);
+ undo_redo->add_undo_method(this, "_update_uniforms", true);
+ }
+
undo_redo->commit_action();
return vsnode.ptr();
}
void VisualShaderEditor::_node_dragged(const Vector2 &p_from, const Vector2 &p_to, int p_node) {
+ VisualShader::Type type = get_current_shader_type();
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
-
- updating = true;
undo_redo->create_action(TTR("Node Moved"));
undo_redo->add_do_method(visual_shader.ptr(), "set_node_position", type, p_node, p_to);
undo_redo->add_undo_method(visual_shader.ptr(), "set_node_position", type, p_node, p_from);
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ undo_redo->add_do_method(graph_plugin.ptr(), "set_node_position", type, p_node, p_to);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "set_node_position", type, p_node, p_from);
undo_redo->commit_action();
- updating = false;
}
void VisualShaderEditor::_connection_request(const String &p_from, int p_from_index, const String &p_to, int p_to_index) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
int from = p_from.to_int();
int to = p_to.to_int();
@@ -1494,33 +1763,32 @@ void VisualShaderEditor::_connection_request(const String &p_from, int p_from_in
if (E->get().to_node == to && E->get().to_port == p_to_index) {
undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
}
}
undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, from, p_from_index, to, p_to_index);
undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, from, p_from_index, to, p_to_index);
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, from, p_from_index, to, p_to_index);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, from, p_from_index, to, p_to_index);
undo_redo->commit_action();
}
void VisualShaderEditor::_disconnection_request(const String &p_from, int p_from_index, const String &p_to, int p_to_index) {
-
graph->disconnect_node(p_from, p_from_index, p_to, p_to_index);
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
int from = p_from.to_int();
int to = p_to.to_int();
- //updating = true; seems graph edit can handle this, no need to protect
undo_redo->create_action(TTR("Nodes Disconnected"));
undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, from, p_from_index, to, p_to_index);
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, from, p_from_index, to, p_to_index);
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, from, p_from_index, to, p_to_index);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, from, p_from_index, to, p_to_index);
undo_redo->commit_action();
- //updating = false;
}
void VisualShaderEditor::_connection_to_empty(const String &p_from, int p_from_slot, const Vector2 &p_release_position) {
@@ -1536,13 +1804,22 @@ void VisualShaderEditor::_connection_from_empty(const String &p_to, int p_to_slo
}
void VisualShaderEditor::_delete_request(int which) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
Ref<VisualShaderNode> node = Ref<VisualShaderNode>(visual_shader->get_node(type, which));
undo_redo->create_action(TTR("Delete Node"));
+
+ List<VisualShader::Connection> conns;
+ visual_shader->get_node_connections(type, &conns);
+ for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
+ if (E->get().from_node == which || E->get().to_node == which) {
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ }
+ }
+
undo_redo->add_do_method(visual_shader.ptr(), "remove_node", type, which);
undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, which), which);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "add_node", type, which);
undo_redo->add_do_method(this, "_clear_buffer");
undo_redo->add_undo_method(this, "_clear_buffer");
@@ -1561,23 +1838,31 @@ void VisualShaderEditor::_delete_request(int which) {
undo_redo->add_undo_method(expression, "set_expression", expression->get_expression());
}
- List<VisualShader::Connection> conns;
- visual_shader->get_node_connections(type, &conns);
-
for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
if (E->get().from_node == which || E->get().to_node == which) {
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
}
}
+ // delete a node from the graph
+ undo_redo->add_do_method(graph_plugin.ptr(), "remove_node", type, which);
+
+ VisualShaderNodeUniform *uniform = Object::cast_to<VisualShaderNodeUniform>(node.ptr());
+ if (uniform) {
+ undo_redo->add_do_method(this, "_update_uniforms", true);
+ undo_redo->add_undo_method(this, "_update_uniforms", true);
+
+ Set<String> uniform_names;
+ uniform_names.insert(uniform->get_uniform_name());
+
+ _update_uniform_refs(uniform_names);
+ }
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
undo_redo->commit_action();
}
void VisualShaderEditor::_node_selected(Object *p_node) {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+ VisualShader::Type type = get_current_shader_type();
GraphNode *gn = Object::cast_to<GraphNode>(p_node);
ERR_FAIL_COND(!gn);
@@ -1592,15 +1877,34 @@ void VisualShaderEditor::_node_selected(Object *p_node) {
}
void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> &p_event) {
-
Ref<InputEventMouseButton> mb = p_event;
- if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT)
- _show_members_dialog(true);
+ if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) {
+ List<int> to_change;
+ for (int i = 0; i < graph->get_child_count(); i++) {
+ GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
+ if (gn) {
+ if (gn->is_selected() && gn->is_close_button_visible()) {
+ to_change.push_back(gn->get_name().operator String().to_int());
+ }
+ }
+ }
+ if (to_change.empty() && copy_nodes_buffer.empty()) {
+ _show_members_dialog(true);
+ } else {
+ popup_menu->set_item_disabled(NodeMenuOptions::COPY, to_change.empty());
+ popup_menu->set_item_disabled(NodeMenuOptions::PASTE, copy_nodes_buffer.empty());
+ popup_menu->set_item_disabled(NodeMenuOptions::DELETE, to_change.empty());
+ popup_menu->set_item_disabled(NodeMenuOptions::DUPLICATE, to_change.empty());
+ menu_point = graph->get_local_mouse_position();
+ Point2 gpos = Input::get_singleton()->get_mouse_position();
+ popup_menu->set_position(gpos);
+ popup_menu->popup();
+ }
+ }
}
void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) {
-
if (at_mouse_pos) {
saved_node_pos_dirty = true;
saved_node_pos = graph->get_local_mouse_position();
@@ -1615,8 +1919,8 @@ void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) {
}
// keep dialog within window bounds
- Size2 window_size = OS::get_singleton()->get_window_size();
- Rect2 dialog_rect = members_dialog->get_global_rect();
+ Size2 window_size = DisplayServer::get_singleton()->window_get_size();
+ Rect2 dialog_rect = Rect2(members_dialog->get_position(), members_dialog->get_size());
if (dialog_rect.position.y + dialog_rect.size.y > window_size.y) {
int difference = dialog_rect.position.y + dialog_rect.size.y - window_size.y;
members_dialog->set_position(members_dialog->get_position() - Point2(0, difference));
@@ -1632,11 +1936,10 @@ void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) {
void VisualShaderEditor::_sbox_input(const Ref<InputEvent> &p_ie) {
Ref<InputEventKey> ie = p_ie;
- if (ie.is_valid() && (ie->get_scancode() == KEY_UP ||
- ie->get_scancode() == KEY_DOWN ||
- ie->get_scancode() == KEY_ENTER ||
- ie->get_scancode() == KEY_KP_ENTER)) {
-
+ if (ie.is_valid() && (ie->get_keycode() == KEY_UP ||
+ ie->get_keycode() == KEY_DOWN ||
+ ie->get_keycode() == KEY_ENTER ||
+ ie->get_keycode() == KEY_KP_ENTER)) {
members->call("_gui_input", ie);
node_filter->accept_event();
}
@@ -1644,7 +1947,6 @@ void VisualShaderEditor::_sbox_input(const Ref<InputEvent> &p_ie) {
void VisualShaderEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
-
node_filter->set_clear_button_enabled(true);
// collapse tree by default
@@ -1671,13 +1973,14 @@ void VisualShaderEditor::_notification(int p_what) {
}
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
+ highend_label->set_modulate(get_theme_color("vulkan_color", "Editor"));
- error_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
+ error_panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
- node_filter->set_right_icon(Control::get_icon("Search", "EditorIcons"));
+ node_filter->set_right_icon(Control::get_theme_icon("Search", "EditorIcons"));
- preview_shader->set_icon(Control::get_icon("Shader", "EditorIcons"));
+ preview_shader->set_icon(Control::get_theme_icon("Shader", "EditorIcons"));
{
Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
@@ -1685,42 +1988,51 @@ void VisualShaderEditor::_notification(int p_what) {
Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
+ Color function_color = EDITOR_GET("text_editor/highlighting/function_color");
+ Color number_color = EDITOR_GET("text_editor/highlighting/number_color");
+ Color members_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
- preview_text->add_color_override("background_color", background_color);
+ preview_text->add_theme_color_override("background_color", background_color);
for (List<String>::Element *E = keyword_list.front(); E; E = E->next()) {
-
- preview_text->add_keyword_color(E->get(), keyword_color);
+ syntax_highlighter->add_keyword_color(E->get(), keyword_color);
}
- preview_text->add_font_override("font", get_font("expression", "EditorFonts"));
- preview_text->add_color_override("font_color", text_color);
- preview_text->add_color_override("symbol_color", symbol_color);
- preview_text->add_color_region("/*", "*/", comment_color, false);
- preview_text->add_color_region("//", "", comment_color, false);
+ preview_text->add_theme_font_override("font", get_theme_font("expression", "EditorFonts"));
+ preview_text->add_theme_color_override("font_color", text_color);
+ syntax_highlighter->set_number_color(number_color);
+ syntax_highlighter->set_symbol_color(symbol_color);
+ syntax_highlighter->set_function_color(function_color);
+ syntax_highlighter->set_member_variable_color(members_color);
+ syntax_highlighter->clear_color_regions();
+ syntax_highlighter->add_color_region("/*", "*/", comment_color, false);
+ syntax_highlighter->add_color_region("//", "", comment_color, true);
- error_text->add_font_override("font", get_font("status_source", "EditorFonts"));
- error_text->add_color_override("font_color", get_color("error_color", "Editor"));
+ error_text->add_theme_font_override("font", get_theme_font("status_source", "EditorFonts"));
+ error_text->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
}
- tools->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("Tools", "EditorIcons"));
+ tools->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Tools", "EditorIcons"));
- if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree())
+ if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree()) {
_update_graph();
+ }
}
}
void VisualShaderEditor::_scroll_changed(const Vector2 &p_scroll) {
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
visual_shader->set_graph_offset(p_scroll / EDSCALE);
updating = false;
}
void VisualShaderEditor::_node_changed(int p_id) {
- if (updating)
+ if (updating) {
return;
+ }
if (is_visible_in_tree()) {
_update_graph();
@@ -1732,7 +2044,6 @@ void VisualShaderEditor::_dup_update_excluded(int p_type, Set<int> &r_excluded)
VisualShader::Type type = (VisualShader::Type)p_type;
for (int i = 0; i < graph->get_child_count(); i++) {
-
GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
if (gn) {
int id = String(gn->get_name()).to_int();
@@ -1748,14 +2059,12 @@ void VisualShaderEditor::_dup_update_excluded(int p_type, Set<int> &r_excluded)
}
void VisualShaderEditor::_dup_copy_nodes(int p_type, List<int> &r_nodes, Set<int> &r_excluded) {
-
VisualShader::Type type = (VisualShader::Type)p_type;
selection_center.x = 0.0f;
selection_center.y = 0.0f;
for (int i = 0; i < graph->get_child_count(); i++) {
-
GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
if (gn) {
int id = String(gn->get_name()).to_int();
@@ -1778,7 +2087,6 @@ void VisualShaderEditor::_dup_copy_nodes(int p_type, List<int> &r_nodes, Set<int
}
void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<int> &r_nodes, Set<int> &r_excluded, const Vector2 &p_offset, bool p_select) {
-
VisualShader::Type type = (VisualShader::Type)p_type;
VisualShader::Type pasted_type = (VisualShader::Type)p_pasted_type;
@@ -1788,7 +2096,6 @@ void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<in
Set<int> unsupported_set;
for (List<int>::Element *E = r_nodes.front(); E; E = E->next()) {
-
connection_remap[E->get()] = id_from;
Ref<VisualShaderNode> node = visual_shader->get_node(pasted_type, E->get());
@@ -1809,12 +2116,13 @@ void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<in
Ref<VisualShaderNode> dupli = node->duplicate();
undo_redo->add_do_method(visual_shader.ptr(), "add_node", type, dupli, visual_shader->get_node_position(pasted_type, E->get()) + p_offset, id_from);
- undo_redo->add_undo_method(visual_shader.ptr(), "remove_node", type, id_from);
+ undo_redo->add_do_method(graph_plugin.ptr(), "add_node", type, id_from);
// duplicate size, inputs and outputs if node is group
Ref<VisualShaderNodeGroupBase> group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr());
if (!group.is_null()) {
undo_redo->add_do_method(dupli.ptr(), "set_size", group->get_size());
+ undo_redo->add_do_method(graph_plugin.ptr(), "set_node_size", type, id_from, group->get_size());
undo_redo->add_do_method(dupli.ptr(), "set_inputs", group->get_inputs());
undo_redo->add_do_method(dupli.ptr(), "set_outputs", group->get_outputs());
}
@@ -1835,18 +2143,24 @@ void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<in
continue;
}
if (connection_remap.has(E->get().from_node) && connection_remap.has(E->get().to_node)) {
- undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes_forced", type, connection_remap[E->get().from_node], E->get().from_port, connection_remap[E->get().to_node], E->get().to_port);
+ undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, connection_remap[E->get().from_node], E->get().from_port, connection_remap[E->get().to_node], E->get().to_port);
+ undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, connection_remap[E->get().from_node], E->get().from_port, connection_remap[E->get().to_node], E->get().to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, connection_remap[E->get().from_node], E->get().from_port, connection_remap[E->get().to_node], E->get().to_port);
}
}
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ id_from = base_id;
+ for (List<int>::Element *E = r_nodes.front(); E; E = E->next()) {
+ undo_redo->add_undo_method(visual_shader.ptr(), "remove_node", type, id_from);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "remove_node", type, id_from);
+ id_from++;
+ }
+
undo_redo->commit_action();
if (p_select) {
// reselect duplicated nodes by excluding the other ones
for (int i = 0; i < graph->get_child_count(); i++) {
-
GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
if (gn) {
int id = String(gn->get_name()).to_int();
@@ -1861,13 +2175,11 @@ void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<in
}
void VisualShaderEditor::_clear_buffer() {
-
copy_nodes_buffer.clear();
copy_nodes_excluded_buffer.clear();
}
void VisualShaderEditor::_duplicate_nodes() {
-
int type = edit_type->get_selected();
List<int> nodes;
@@ -1875,8 +2187,9 @@ void VisualShaderEditor::_duplicate_nodes() {
_dup_copy_nodes(type, nodes, excluded);
- if (nodes.empty())
+ if (nodes.empty()) {
return;
+ }
undo_redo->create_action(TTR("Duplicate Nodes"));
@@ -1884,7 +2197,6 @@ void VisualShaderEditor::_duplicate_nodes() {
}
void VisualShaderEditor::_copy_nodes() {
-
copy_type = edit_type->get_selected();
_clear_buffer();
@@ -1892,10 +2204,10 @@ void VisualShaderEditor::_copy_nodes() {
_dup_copy_nodes(copy_type, copy_nodes_buffer, copy_nodes_excluded_buffer);
}
-void VisualShaderEditor::_paste_nodes() {
-
- if (copy_nodes_buffer.empty())
+void VisualShaderEditor::_paste_nodes(bool p_use_custom_position, const Vector2 &p_custom_position) {
+ if (copy_nodes_buffer.empty()) {
return;
+ }
int type = edit_type->get_selected();
@@ -1903,14 +2215,20 @@ void VisualShaderEditor::_paste_nodes() {
float scale = graph->get_zoom();
- _dup_paste_nodes(type, copy_type, copy_nodes_buffer, copy_nodes_excluded_buffer, (graph->get_scroll_ofs() / scale + graph->get_local_mouse_position() / scale - selection_center), false);
+ Vector2 mpos;
+ if (p_use_custom_position) {
+ mpos = p_custom_position;
+ } else {
+ mpos = graph->get_local_mouse_position();
+ }
+
+ _dup_paste_nodes(type, copy_type, copy_nodes_buffer, copy_nodes_excluded_buffer, (graph->get_scroll_ofs() / scale + mpos / scale - selection_center), false);
_dup_update_excluded(type, copy_nodes_excluded_buffer); // to prevent selection of previous copies at new paste
}
-void VisualShaderEditor::_on_nodes_delete() {
-
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
+void VisualShaderEditor::_delete_nodes() {
+ VisualShader::Type type = get_current_shader_type();
List<int> to_erase;
for (int i = 0; i < graph->get_child_count(); i++) {
@@ -1922,17 +2240,31 @@ void VisualShaderEditor::_on_nodes_delete() {
}
}
- if (to_erase.empty())
+ if (to_erase.empty()) {
return;
+ }
undo_redo->create_action(TTR("Delete Nodes"));
+ List<VisualShader::Connection> conns;
+ visual_shader->get_node_connections(type, &conns);
+
for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
+ for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
+ if (E->get().from_node == F->get() || E->get().to_node == F->get()) {
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ }
+ }
+ }
+ Set<String> uniform_names;
+
+ for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
Ref<VisualShaderNode> node = visual_shader->get_node(type, F->get());
undo_redo->add_do_method(visual_shader.ptr(), "remove_node", type, F->get());
undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, F->get()), F->get());
+ undo_redo->add_undo_method(graph_plugin.ptr(), "add_node", type, F->get());
undo_redo->add_do_method(this, "_clear_buffer");
undo_redo->add_undo_method(this, "_clear_buffer");
@@ -1950,16 +2282,17 @@ void VisualShaderEditor::_on_nodes_delete() {
if (expression) {
undo_redo->add_undo_method(expression, "set_expression", expression->get_expression());
}
- }
- List<VisualShader::Connection> conns;
- visual_shader->get_node_connections(type, &conns);
+ VisualShaderNodeUniform *uniform = Object::cast_to<VisualShaderNodeUniform>(node.ptr());
+ if (uniform) {
+ uniform_names.insert(uniform->get_uniform_name());
+ }
+ }
List<VisualShader::Connection> used_conns;
for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
if (E->get().from_node == F->get() || E->get().to_node == F->get()) {
-
bool cancel = false;
for (List<VisualShader::Connection>::Element *R = used_conns.front(); R; R = R->next()) {
if (R->get().from_node == E->get().from_node && R->get().from_port == E->get().from_port && R->get().to_node == E->get().to_node && R->get().to_port == E->get().to_port) {
@@ -1969,53 +2302,121 @@ void VisualShaderEditor::_on_nodes_delete() {
}
if (!cancel) {
undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
used_conns.push_back(E->get());
}
}
}
}
- undo_redo->add_do_method(this, "_update_graph");
- undo_redo->add_undo_method(this, "_update_graph");
+ // delete nodes from the graph
+ for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
+ undo_redo->add_do_method(graph_plugin.ptr(), "remove_node", type, F->get());
+ }
+
+ // update uniform refs if any uniform has been deleted
+ if (uniform_names.size() > 0) {
+ undo_redo->add_do_method(this, "_update_uniforms", true);
+ undo_redo->add_undo_method(this, "_update_uniforms", true);
+
+ _update_uniform_refs(uniform_names);
+ }
+
undo_redo->commit_action();
}
void VisualShaderEditor::_mode_selected(int p_id) {
-
+ visual_shader->set_shader_type(particles_mode ? VisualShader::Type(p_id + 3) : VisualShader::Type(p_id));
_update_options_menu();
_update_graph();
}
-void VisualShaderEditor::_input_select_item(Ref<VisualShaderNodeInput> input, String name) {
+void VisualShaderEditor::_input_select_item(Ref<VisualShaderNodeInput> p_input, String p_name) {
+ String prev_name = p_input->get_input_name();
- String prev_name = input->get_input_name();
-
- if (name == prev_name)
+ if (p_name == prev_name) {
return;
+ }
- bool type_changed = input->get_input_type_by_name(name) != input->get_input_type_by_name(prev_name);
+ bool type_changed = p_input->get_input_type_by_name(p_name) != p_input->get_input_type_by_name(prev_name);
UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
undo_redo->create_action(TTR("Visual Shader Input Type Changed"));
- undo_redo->add_do_method(input.ptr(), "set_input_name", name);
- undo_redo->add_undo_method(input.ptr(), "set_input_name", prev_name);
-
- if (type_changed) {
- //restore connections if type changed
- VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
- int id = visual_shader->find_node_id(type, input);
- List<VisualShader::Connection> conns;
- visual_shader->get_node_connections(type, &conns);
- for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
- if (E->get().from_node == id) {
- undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_do_method(p_input.ptr(), "set_input_name", p_name);
+ undo_redo->add_undo_method(p_input.ptr(), "set_input_name", prev_name);
+
+ // update output port
+ for (int type_id = 0; type_id < VisualShader::TYPE_MAX; type_id++) {
+ VisualShader::Type type = VisualShader::Type(type_id);
+ int id = visual_shader->find_node_id(type, p_input);
+ if (id != VisualShader::NODE_ID_INVALID) {
+ if (type_changed) {
+ List<VisualShader::Connection> conns;
+ visual_shader->get_node_connections(type, &conns);
+ for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
+ if (E->get().from_node == id) {
+ if (visual_shader->is_port_types_compatible(p_input->get_input_type_by_name(p_name), visual_shader->get_node(type, E->get().to_node)->get_input_port_type(E->get().to_port))) {
+ undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ continue;
+ }
+ undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ }
+ }
}
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type_id, id);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type_id, id);
+ break;
}
}
- undo_redo->add_do_method(VisualShaderEditor::get_singleton(), "_update_graph");
- undo_redo->add_undo_method(VisualShaderEditor::get_singleton(), "_update_graph");
+ undo_redo->commit_action();
+}
+
+void VisualShaderEditor::_uniform_select_item(Ref<VisualShaderNodeUniformRef> p_uniform_ref, String p_name) {
+ String prev_name = p_uniform_ref->get_uniform_name();
+
+ if (p_name == prev_name) {
+ return;
+ }
+
+ bool type_changed = p_uniform_ref->get_uniform_type_by_name(p_name) != p_uniform_ref->get_uniform_type_by_name(prev_name);
+
+ UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
+ undo_redo->create_action(TTR("UniformRef Name Changed"));
+
+ undo_redo->add_do_method(p_uniform_ref.ptr(), "set_uniform_name", p_name);
+ undo_redo->add_undo_method(p_uniform_ref.ptr(), "set_uniform_name", prev_name);
+
+ // update output port
+ for (int type_id = 0; type_id < VisualShader::TYPE_MAX; type_id++) {
+ VisualShader::Type type = VisualShader::Type(type_id);
+ int id = visual_shader->find_node_id(type, p_uniform_ref);
+ if (id != VisualShader::NODE_ID_INVALID) {
+ if (type_changed) {
+ List<VisualShader::Connection> conns;
+ visual_shader->get_node_connections(type, &conns);
+ for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
+ if (E->get().from_node == id) {
+ if (visual_shader->is_port_types_compatible(p_uniform_ref->get_uniform_type_by_name(p_name), visual_shader->get_node(type, E->get().to_node)->get_input_port_type(E->get().to_port))) {
+ continue;
+ }
+ undo_redo->add_do_method(visual_shader.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ }
+ }
+ }
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type_id, id);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "update_node", type_id, id);
+ break;
+ }
+ }
undo_redo->commit_action();
}
@@ -2027,10 +2428,12 @@ void VisualShaderEditor::_member_filter_changed(const String &p_text) {
void VisualShaderEditor::_member_selected() {
TreeItem *item = members->get_selected();
- if (item != NULL && item->has_meta("id")) {
+ if (item != nullptr && item->has_meta("id")) {
members_dialog->get_ok()->set_disabled(false);
+ highend_label->set_visible(add_options[item->get_meta("id")].highend);
node_desc->set_text(_get_description(item->get_meta("id")));
} else {
+ highend_label->set_visible(false);
members_dialog->get_ok()->set_disabled(true);
node_desc->set_text("");
}
@@ -2041,7 +2444,7 @@ void VisualShaderEditor::_member_unselected() {
void VisualShaderEditor::_member_create() {
TreeItem *item = members->get_selected();
- if (item != NULL && item->has_meta("id")) {
+ if (item != nullptr && item->has_meta("id")) {
int idx = members->get_selected()->get_meta("id");
_add_node(idx, add_options[idx].sub_func);
members_dialog->hide();
@@ -2056,7 +2459,6 @@ void VisualShaderEditor::_member_cancel() {
}
void VisualShaderEditor::_tools_menu_option(int p_idx) {
-
TreeItem *category = members->get_root()->get_children();
switch (p_idx) {
@@ -2092,14 +2494,35 @@ void VisualShaderEditor::_tools_menu_option(int p_idx) {
}
}
-Variant VisualShaderEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
+void VisualShaderEditor::_node_menu_id_pressed(int p_idx) {
+ switch (p_idx) {
+ case NodeMenuOptions::ADD:
+ _show_members_dialog(true);
+ break;
+ case NodeMenuOptions::COPY:
+ _copy_nodes();
+ break;
+ case NodeMenuOptions::PASTE:
+ _paste_nodes(true, menu_point);
+ break;
+ case NodeMenuOptions::DELETE:
+ _delete_nodes();
+ break;
+ case NodeMenuOptions::DUPLICATE:
+ _duplicate_nodes();
+ break;
+ }
+}
+Variant VisualShaderEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
if (p_from == members) {
TreeItem *it = members->get_item_at_position(p_point);
- if (!it)
+ if (!it) {
return Variant();
- if (!it->has_meta("id"))
+ }
+ if (!it->has_meta("id")) {
return Variant();
+ }
int id = it->get_meta("id");
AddOption op = add_options[id];
@@ -2121,9 +2544,7 @@ Variant VisualShaderEditor::get_drag_data_fw(const Point2 &p_point, Control *p_f
}
bool VisualShaderEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
if (p_from == graph) {
-
Dictionary d = p_data;
if (d.has("id")) {
@@ -2138,9 +2559,7 @@ bool VisualShaderEditor::can_drop_data_fw(const Point2 &p_point, const Variant &
}
void VisualShaderEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
if (p_from == graph) {
-
Dictionary d = p_data;
if (d.has("id")) {
@@ -2149,12 +2568,10 @@ void VisualShaderEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da
saved_node_pos_dirty = true;
_add_node(idx, add_options[idx].sub_func);
} else if (d.has("files")) {
- if (d["files"].get_type() == Variant::POOL_STRING_ARRAY) {
-
+ if (d["files"].get_type() == Variant::PACKED_STRING_ARRAY) {
int j = 0;
- PoolStringArray arr = d["files"];
+ PackedStringArray arr = d["files"];
for (int i = 0; i < arr.size(); i++) {
-
String type = ResourceLoader::get_resource_type(arr[i]);
if (type == "GDScript") {
Ref<Script> script = ResourceLoader::load(arr[i]);
@@ -2164,7 +2581,7 @@ void VisualShaderEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da
_add_custom_node(arr[i]);
j++;
}
- } else if (ClassDB::get_parent_class(type) == "Texture") {
+ } else if (ClassDB::get_parent_class(type) == "Texture2D") {
saved_node_pos = p_point + Vector2(0, j * 210 * EDSCALE);
saved_node_pos_dirty = true;
_add_texture_node(arr[i]);
@@ -2187,8 +2604,12 @@ void VisualShaderEditor::_show_preview_text() {
}
}
-void VisualShaderEditor::_update_preview() {
+static ShaderLanguage::DataType _get_global_variable_type(const StringName &p_variable) {
+ RS::GlobalVariableType gvt = RS::get_singleton()->global_variable_get_type(p_variable);
+ return RS::global_variable_type_get_shader_datatype(gvt);
+}
+void VisualShaderEditor::_update_preview() {
if (!preview_showed) {
pending_update_preview = true;
return;
@@ -2200,7 +2621,7 @@ void VisualShaderEditor::_update_preview() {
ShaderLanguage sl;
- Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(VisualServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_types());
+ Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_types(), _get_global_variable_type);
for (int i = 0; i < preview_text->get_line_count(); i++) {
preview_text->set_line_as_marked(i, false);
@@ -2219,66 +2640,27 @@ void VisualShaderEditor::_update_preview() {
}
void VisualShaderEditor::_bind_methods() {
- ClassDB::bind_method("_rebuild", &VisualShaderEditor::_rebuild);
ClassDB::bind_method("_update_graph", &VisualShaderEditor::_update_graph);
ClassDB::bind_method("_update_options_menu", &VisualShaderEditor::_update_options_menu);
- ClassDB::bind_method("_expression_focus_out", &VisualShaderEditor::_expression_focus_out);
ClassDB::bind_method("_add_node", &VisualShaderEditor::_add_node);
- ClassDB::bind_method("_node_dragged", &VisualShaderEditor::_node_dragged);
- ClassDB::bind_method("_connection_request", &VisualShaderEditor::_connection_request);
- ClassDB::bind_method("_disconnection_request", &VisualShaderEditor::_disconnection_request);
- ClassDB::bind_method("_node_selected", &VisualShaderEditor::_node_selected);
- ClassDB::bind_method("_scroll_changed", &VisualShaderEditor::_scroll_changed);
- ClassDB::bind_method("_delete_request", &VisualShaderEditor::_delete_request);
- ClassDB::bind_method("_on_nodes_delete", &VisualShaderEditor::_on_nodes_delete);
ClassDB::bind_method("_node_changed", &VisualShaderEditor::_node_changed);
- ClassDB::bind_method("_edit_port_default_input", &VisualShaderEditor::_edit_port_default_input);
- ClassDB::bind_method("_port_edited", &VisualShaderEditor::_port_edited);
- ClassDB::bind_method("_connection_to_empty", &VisualShaderEditor::_connection_to_empty);
- ClassDB::bind_method("_connection_from_empty", &VisualShaderEditor::_connection_from_empty);
- ClassDB::bind_method("_line_edit_focus_out", &VisualShaderEditor::_line_edit_focus_out);
- ClassDB::bind_method("_line_edit_changed", &VisualShaderEditor::_line_edit_changed);
- ClassDB::bind_method("_port_name_focus_out", &VisualShaderEditor::_port_name_focus_out);
- ClassDB::bind_method("_duplicate_nodes", &VisualShaderEditor::_duplicate_nodes);
- ClassDB::bind_method("_copy_nodes", &VisualShaderEditor::_copy_nodes);
- ClassDB::bind_method("_paste_nodes", &VisualShaderEditor::_paste_nodes);
- ClassDB::bind_method("_mode_selected", &VisualShaderEditor::_mode_selected);
ClassDB::bind_method("_input_select_item", &VisualShaderEditor::_input_select_item);
- ClassDB::bind_method("_preview_select_port", &VisualShaderEditor::_preview_select_port);
- ClassDB::bind_method("_graph_gui_input", &VisualShaderEditor::_graph_gui_input);
- ClassDB::bind_method("_add_input_port", &VisualShaderEditor::_add_input_port);
- ClassDB::bind_method("_change_input_port_type", &VisualShaderEditor::_change_input_port_type);
- ClassDB::bind_method("_change_input_port_name", &VisualShaderEditor::_change_input_port_name);
- ClassDB::bind_method("_remove_input_port", &VisualShaderEditor::_remove_input_port);
- ClassDB::bind_method("_add_output_port", &VisualShaderEditor::_add_output_port);
- ClassDB::bind_method("_change_output_port_type", &VisualShaderEditor::_change_output_port_type);
- ClassDB::bind_method("_change_output_port_name", &VisualShaderEditor::_change_output_port_name);
- ClassDB::bind_method("_remove_output_port", &VisualShaderEditor::_remove_output_port);
- ClassDB::bind_method("_node_resized", &VisualShaderEditor::_node_resized);
+ ClassDB::bind_method("_uniform_select_item", &VisualShaderEditor::_uniform_select_item);
ClassDB::bind_method("_set_node_size", &VisualShaderEditor::_set_node_size);
ClassDB::bind_method("_clear_buffer", &VisualShaderEditor::_clear_buffer);
- ClassDB::bind_method("_show_preview_text", &VisualShaderEditor::_show_preview_text);
- ClassDB::bind_method("_update_preview", &VisualShaderEditor::_update_preview);
+ ClassDB::bind_method("_update_uniforms", &VisualShaderEditor::_update_uniforms);
+ ClassDB::bind_method("_set_mode", &VisualShaderEditor::_set_mode);
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &VisualShaderEditor::get_drag_data_fw);
ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &VisualShaderEditor::can_drop_data_fw);
ClassDB::bind_method(D_METHOD("drop_data_fw"), &VisualShaderEditor::drop_data_fw);
ClassDB::bind_method("_is_available", &VisualShaderEditor::_is_available);
- ClassDB::bind_method("_tools_menu_option", &VisualShaderEditor::_tools_menu_option);
- ClassDB::bind_method("_show_members_dialog", &VisualShaderEditor::_show_members_dialog);
- ClassDB::bind_method("_sbox_input", &VisualShaderEditor::_sbox_input);
- ClassDB::bind_method("_member_filter_changed", &VisualShaderEditor::_member_filter_changed);
- ClassDB::bind_method("_member_selected", &VisualShaderEditor::_member_selected);
- ClassDB::bind_method("_member_unselected", &VisualShaderEditor::_member_unselected);
- ClassDB::bind_method("_member_create", &VisualShaderEditor::_member_create);
- ClassDB::bind_method("_member_cancel", &VisualShaderEditor::_member_cancel);
}
-VisualShaderEditor *VisualShaderEditor::singleton = NULL;
+VisualShaderEditor *VisualShaderEditor::singleton = nullptr;
VisualShaderEditor::VisualShaderEditor() {
-
singleton = this;
updating = false;
saved_node_pos_dirty = false;
@@ -2306,30 +2688,38 @@ VisualShaderEditor::VisualShaderEditor() {
main_box->add_child(graph);
graph->set_drag_forwarding(this);
graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SCALAR);
+ graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SCALAR_INT);
graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_BOOLEAN);
graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_VECTOR);
graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_TRANSFORM);
graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SAMPLER);
//graph->add_valid_left_disconnect_type(0);
graph->set_v_size_flags(SIZE_EXPAND_FILL);
- graph->connect("connection_request", this, "_connection_request", varray(), CONNECT_DEFERRED);
- graph->connect("disconnection_request", this, "_disconnection_request", varray(), CONNECT_DEFERRED);
- graph->connect("node_selected", this, "_node_selected");
- graph->connect("scroll_offset_changed", this, "_scroll_changed");
- graph->connect("duplicate_nodes_request", this, "_duplicate_nodes");
- graph->connect("copy_nodes_request", this, "_copy_nodes");
- graph->connect("paste_nodes_request", this, "_paste_nodes");
- graph->connect("delete_nodes_request", this, "_on_nodes_delete");
- graph->connect("gui_input", this, "_graph_gui_input");
- graph->connect("connection_to_empty", this, "_connection_to_empty");
- graph->connect("connection_from_empty", this, "_connection_from_empty");
+ graph->connect("connection_request", callable_mp(this, &VisualShaderEditor::_connection_request), varray(), CONNECT_DEFERRED);
+ graph->connect("disconnection_request", callable_mp(this, &VisualShaderEditor::_disconnection_request), varray(), CONNECT_DEFERRED);
+ graph->connect("node_selected", callable_mp(this, &VisualShaderEditor::_node_selected));
+ graph->connect("scroll_offset_changed", callable_mp(this, &VisualShaderEditor::_scroll_changed));
+ graph->connect("duplicate_nodes_request", callable_mp(this, &VisualShaderEditor::_duplicate_nodes));
+ graph->connect("copy_nodes_request", callable_mp(this, &VisualShaderEditor::_copy_nodes));
+ graph->connect("paste_nodes_request", callable_mp(this, &VisualShaderEditor::_paste_nodes));
+ graph->connect("delete_nodes_request", callable_mp(this, &VisualShaderEditor::_delete_nodes));
+ graph->connect("gui_input", callable_mp(this, &VisualShaderEditor::_graph_gui_input));
+ graph->connect("connection_to_empty", callable_mp(this, &VisualShaderEditor::_connection_to_empty));
+ graph->connect("connection_from_empty", callable_mp(this, &VisualShaderEditor::_connection_from_empty));
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_SCALAR);
+ graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_SCALAR_INT);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_VECTOR);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_BOOLEAN);
+ graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_SCALAR_INT);
+ graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_SCALAR);
+ graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_VECTOR);
+ graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_BOOLEAN);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_SCALAR);
+ graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_SCALAR_INT);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_VECTOR);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_BOOLEAN);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_SCALAR);
+ graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_SCALAR_INT);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_VECTOR);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_BOOLEAN);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShaderNode::PORT_TYPE_TRANSFORM);
@@ -2339,26 +2729,40 @@ VisualShaderEditor::VisualShaderEditor() {
graph->get_zoom_hbox()->add_child(vs);
graph->get_zoom_hbox()->move_child(vs, 0);
- edit_type = memnew(OptionButton);
- edit_type->add_item(TTR("Vertex"));
- edit_type->add_item(TTR("Fragment"));
- edit_type->add_item(TTR("Light"));
- edit_type->select(1);
- edit_type->connect("item_selected", this, "_mode_selected");
- graph->get_zoom_hbox()->add_child(edit_type);
- graph->get_zoom_hbox()->move_child(edit_type, 0);
-
- add_node = memnew(ToolButton);
+ edit_type_standart = memnew(OptionButton);
+ edit_type_standart->add_item(TTR("Vertex"));
+ edit_type_standart->add_item(TTR("Fragment"));
+ edit_type_standart->add_item(TTR("Light"));
+ edit_type_standart->select(1);
+ edit_type_standart->connect("item_selected", callable_mp(this, &VisualShaderEditor::_mode_selected));
+
+ edit_type_particles = memnew(OptionButton);
+ edit_type_particles->add_item(TTR("Emit"));
+ edit_type_particles->add_item(TTR("Process"));
+ edit_type_particles->add_item(TTR("End"));
+ edit_type_particles->select(0);
+ edit_type_particles->connect("item_selected", callable_mp(this, &VisualShaderEditor::_mode_selected));
+
+ edit_type = edit_type_standart;
+
+ graph->get_zoom_hbox()->add_child(edit_type_particles);
+ graph->get_zoom_hbox()->move_child(edit_type_particles, 0);
+ graph->get_zoom_hbox()->add_child(edit_type_standart);
+ graph->get_zoom_hbox()->move_child(edit_type_standart, 0);
+
+ add_node = memnew(Button);
+ add_node->set_flat(true);
graph->get_zoom_hbox()->add_child(add_node);
add_node->set_text(TTR("Add Node..."));
graph->get_zoom_hbox()->move_child(add_node, 0);
- add_node->connect("pressed", this, "_show_members_dialog", varray(false));
+ add_node->connect("pressed", callable_mp(this, &VisualShaderEditor::_show_members_dialog), varray(false));
- preview_shader = memnew(ToolButton);
+ preview_shader = memnew(Button);
+ preview_shader->set_flat(true);
preview_shader->set_toggle_mode(true);
preview_shader->set_tooltip(TTR("Show resulted shader code."));
graph->get_zoom_hbox()->add_child(preview_shader);
- preview_shader->connect("pressed", this, "_show_preview_text");
+ preview_shader->connect("pressed", callable_mp(this, &VisualShaderEditor::_show_preview_text));
///////////////////////////////////////
// PREVIEW PANEL
@@ -2367,13 +2771,14 @@ VisualShaderEditor::VisualShaderEditor() {
preview_vbox = memnew(VBoxContainer);
preview_vbox->set_visible(preview_showed);
main_box->add_child(preview_vbox);
- preview_text = memnew(TextEdit);
+ preview_text = memnew(CodeEdit);
+ syntax_highlighter.instance();
preview_vbox->add_child(preview_text);
preview_text->set_h_size_flags(SIZE_EXPAND_FILL);
preview_text->set_v_size_flags(SIZE_EXPAND_FILL);
preview_text->set_custom_minimum_size(Size2(400 * EDSCALE, 0));
- preview_text->set_syntax_coloring(true);
- preview_text->set_show_line_numbers(true);
+ preview_text->set_syntax_highlighter(syntax_highlighter);
+ preview_text->set_draw_line_numbers(true);
preview_text->set_readonly(true);
error_text = memnew(Label);
@@ -2381,6 +2786,20 @@ VisualShaderEditor::VisualShaderEditor() {
error_text->set_visible(false);
///////////////////////////////////////
+ // POPUP MENU
+ ///////////////////////////////////////
+
+ popup_menu = memnew(PopupMenu);
+ add_child(popup_menu);
+ popup_menu->add_item("Add Node", NodeMenuOptions::ADD);
+ popup_menu->add_separator();
+ popup_menu->add_item("Copy", NodeMenuOptions::COPY);
+ popup_menu->add_item("Paste", NodeMenuOptions::PASTE);
+ popup_menu->add_item("Delete", NodeMenuOptions::DELETE);
+ popup_menu->add_item("Duplicate", NodeMenuOptions::DUPLICATE);
+ popup_menu->connect("id_pressed", callable_mp(this, &VisualShaderEditor::_node_menu_id_pressed));
+
+ ///////////////////////////////////////
// SHADER NODES TREE
///////////////////////////////////////
@@ -2392,15 +2811,15 @@ VisualShaderEditor::VisualShaderEditor() {
node_filter = memnew(LineEdit);
filter_hb->add_child(node_filter);
- node_filter->connect("text_changed", this, "_member_filter_changed");
- node_filter->connect("gui_input", this, "_sbox_input");
+ node_filter->connect("text_changed", callable_mp(this, &VisualShaderEditor::_member_filter_changed));
+ node_filter->connect("gui_input", callable_mp(this, &VisualShaderEditor::_sbox_input));
node_filter->set_h_size_flags(SIZE_EXPAND_FILL);
node_filter->set_placeholder(TTR("Search"));
tools = memnew(MenuButton);
filter_hb->add_child(tools);
tools->set_tooltip(TTR("Options"));
- tools->get_popup()->connect("id_pressed", this, "_tools_menu_option");
+ tools->get_popup()->connect("id_pressed", callable_mp(this, &VisualShaderEditor::_tools_menu_option));
tools->get_popup()->add_item(TTR("Expand All"), EXPAND_ALL);
tools->get_popup()->add_item(TTR("Collapse All"), COLLAPSE_ALL);
@@ -2413,14 +2832,26 @@ VisualShaderEditor::VisualShaderEditor() {
members->set_allow_reselect(true);
members->set_hide_folding(false);
members->set_custom_minimum_size(Size2(180 * EDSCALE, 200 * EDSCALE));
- members->connect("item_activated", this, "_member_create");
- members->connect("item_selected", this, "_member_selected");
- members->connect("nothing_selected", this, "_member_unselected");
+ members->connect("item_activated", callable_mp(this, &VisualShaderEditor::_member_create));
+ members->connect("item_selected", callable_mp(this, &VisualShaderEditor::_member_selected));
+ members->connect("nothing_selected", callable_mp(this, &VisualShaderEditor::_member_unselected));
+
+ HBoxContainer *desc_hbox = memnew(HBoxContainer);
+ members_vb->add_child(desc_hbox);
Label *desc_label = memnew(Label);
- members_vb->add_child(desc_label);
+ desc_hbox->add_child(desc_label);
desc_label->set_text(TTR("Description:"));
+ desc_hbox->add_spacer();
+
+ highend_label = memnew(Label);
+ desc_hbox->add_child(highend_label);
+ highend_label->set_visible(false);
+ highend_label->set_text("Vulkan");
+ highend_label->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ highend_label->set_tooltip(TTR("High-end node"));
+
node_desc = memnew(RichTextLabel);
members_vb->add_child(node_desc);
node_desc->set_h_size_flags(SIZE_EXPAND_FILL);
@@ -2429,17 +2860,15 @@ VisualShaderEditor::VisualShaderEditor() {
members_dialog = memnew(ConfirmationDialog);
members_dialog->set_title(TTR("Create Shader Node"));
+ members_dialog->set_exclusive(false);
members_dialog->add_child(members_vb);
members_dialog->get_ok()->set_text(TTR("Create"));
- members_dialog->get_ok()->connect("pressed", this, "_member_create");
+ members_dialog->get_ok()->connect("pressed", callable_mp(this, &VisualShaderEditor::_member_create));
members_dialog->get_ok()->set_disabled(true);
- members_dialog->set_resizable(true);
- members_dialog->set_as_minsize();
- members_dialog->connect("hide", this, "_member_cancel");
+ members_dialog->connect("cancelled", callable_mp(this, &VisualShaderEditor::_member_cancel));
add_child(members_dialog);
alert = memnew(AcceptDialog);
- alert->set_as_minsize();
alert->get_label()->set_autowrap(true);
alert->get_label()->set_align(Label::ALIGN_CENTER);
alert->get_label()->set_valign(Label::VALIGN_CENTER);
@@ -2498,6 +2927,7 @@ VisualShaderEditor::VisualShaderEditor() {
// INPUT
// SPATIAL-FOR-ALL
+
const String input_param_shader_modes = TTR("'%s' input parameter for all shader modes.");
add_options.push_back(AddOption("Camera", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "camera"), "camera", VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL));
add_options.push_back(AddOption("InvCamera", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "inv_camera"), "inv_camera", VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL));
@@ -2528,168 +2958,252 @@ VisualShaderEditor::VisualShaderEditor() {
const String input_param_for_fragment_shader_mode = TTR("'%s' input parameter for fragment shader mode.");
const String input_param_for_light_shader_mode = TTR("'%s' input parameter for light shader mode.");
const String input_param_for_vertex_shader_mode = TTR("'%s' input parameter for vertex shader mode.");
+ const String input_param_for_emit_shader_mode = TTR("'%s' input parameter for emit shader mode.");
+ const String input_param_for_process_shader_mode = TTR("'%s' input parameter for process shader mode.");
+ const String input_param_for_end_shader_mode = TTR("'%s' input parameter for end shader mode.");
+ const String input_param_for_emit_and_process_shader_mode = TTR("'%s' input parameter for emit and process shader mode.");
const String input_param_for_vertex_and_fragment_shader_mode = TTR("'%s' input parameter for vertex and fragment shader mode.");
- add_options.push_back(AddOption("Alpha", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Binormal", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), "binormal", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("DepthTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "depth_texture"), "depth_texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("FrontFacing", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "front_facing"), "front_facing", VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture"), "screen_texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Side", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "side"), "side", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Tangent", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "tangent"), "tangent", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("UV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv"), "uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("UV2", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv2"), "uv2", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), "vertex", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("View", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), "view", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_SPATIAL));
-
- add_options.push_back(AddOption("Albedo", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "albedo"), "albedo", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Attenuation", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "attenuation"), "attenuation", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Diffuse", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "diffuse"), "diffuse", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light"), "light", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), "light_color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Roughness", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "roughness"), "roughness", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Specular", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "specular"), "specular", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Transmission", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "transmission"), "transmission", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("View", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), "view", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
-
- add_options.push_back(AddOption("Alpha", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Binormal", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), "binormal", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Color", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("ModelView", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "modelview"), "modelview", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size"), "point_size", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Tangent", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "tangent"), "tangent", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("UV", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv"), "uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("UV2", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv2"), "uv2", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
- add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), "vertex", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Alpha", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Binormal", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), "binormal", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("DepthTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "depth_texture"), "depth_texture", VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("FrontFacing", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "front_facing"), "front_facing", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture"), "screen_texture", VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Side", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "side"), "side", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Tangent", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "tangent"), "tangent", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("UV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv"), "uv", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("UV2", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv2"), "uv2", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), "vertex", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("View", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), "view", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL));
+
+ add_options.push_back(AddOption("Albedo", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "albedo"), "albedo", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Attenuation", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "attenuation"), "attenuation", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Diffuse", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "diffuse"), "diffuse", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light"), "light", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), "light_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Roughness", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "roughness"), "roughness", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Specular", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "specular"), "specular", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Transmission", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "transmission"), "transmission", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("View", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), "view", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+
+ add_options.push_back(AddOption("Alpha", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Binormal", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), "binormal", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Color", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("ModelView", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "modelview"), "modelview", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size"), "point_size", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Tangent", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "tangent"), "tangent", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("UV", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv"), "uv", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("UV2", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "uv2"), "uv2", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), "vertex", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL));
// CANVASITEM INPUTS
- add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightPass", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "light_pass"), "light_pass", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("NormalTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "normal_texture"), "normal_texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("ScreenPixelSize", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_pixel_size"), "screen_pixel_size", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture"), "screen_texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("Texture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
-
- add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_alpha"), "light_alpha", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), "light_color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightHeight", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_height"), "light_height", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_uv"), "light_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightVector", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_vec"), "light_vec", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("Normal", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal"), "normal", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("PointCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("ScreenUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("ShadowColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_color"), "shadow_color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("Texture", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
-
- add_options.push_back(AddOption("Extra", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "extra"), "extra", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightPass", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "light_pass"), "light_pass", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size"), "point_size", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("Projection", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "projection"), "projection", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "vertex"), "vertex", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("World", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "world"), "world", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightPass", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "light_pass"), "light_pass", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("NormalTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "normal_texture"), "normal_texture", VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ScreenPixelSize", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_pixel_size"), "screen_pixel_size", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture"), "screen_texture", VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("Texture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM));
+
+ add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_alpha"), "light_alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), "light_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightHeight", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_height"), "light_height", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_uv"), "light_uv", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightVector", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_vec"), "light_vec", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("Normal", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal"), "normal", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("PointCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ScreenUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ShadowAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_alpha"), "shadow_alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ShadowColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_color"), "shadow_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ShadowVec", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_vec"), "shadow_vec", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("Texture", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM));
+
+ add_options.push_back(AddOption("Extra", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "extra"), "extra", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightPass", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "light_pass"), "light_pass", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size"), "point_size", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("Projection", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "projection"), "projection", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "vertex"), "vertex", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("World", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "world"), "world", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM));
// PARTICLES INPUTS
- add_options.push_back(AddOption("Active", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "active"), "active", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Alpha", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Color", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Custom", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "custom"), "custom", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("CustomAlpha", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "custom_alpha"), "custom_alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Delta", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "delta"), "delta", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("EmissionTransform", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "emission_transform"), "emission_transform", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Index", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "index"), "index", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("LifeTime", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "lifetime"), "lifetime", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Restart", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "restart"), "restart", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Time", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "time"), "time", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Transform", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "transform"), "transform", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
- add_options.push_back(AddOption("Velocity", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "velocity"), "velocity", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_VERTEX, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Active", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "active"), "active", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Alpha", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Color", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Custom", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom"), "custom", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("CustomAlpha", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom_alpha"), "custom_alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Delta", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "delta"), "delta", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("EmissionTransform", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "emission_transform"), "emission_transform", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Index", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "index"), "index", VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("LifeTime", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "lifetime"), "lifetime", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Restart", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "restart"), "restart", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Time", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time"), "time", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Transform", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "transform"), "transform", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Velocity", "Input", "Emit", "VisualShaderNodeInput", vformat(input_param_shader_modes, "velocity"), "velocity", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES));
+
+ add_options.push_back(AddOption("Active", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "active"), "active", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Alpha", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Color", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Custom", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom"), "custom", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("CustomAlpha", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom_alpha"), "custom_alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Delta", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "delta"), "delta", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("EmissionTransform", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "emission_transform"), "emission_transform", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Index", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "index"), "index", VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("LifeTime", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "lifetime"), "lifetime", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Restart", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "restart"), "restart", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Time", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time"), "time", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Transform", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "transform"), "transform", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Velocity", "Input", "Process", "VisualShaderNodeInput", vformat(input_param_shader_modes, "velocity"), "velocity", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES));
+
+ add_options.push_back(AddOption("Active", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "active"), "active", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Alpha", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "alpha"), "alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Color", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color"), "color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Custom", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom"), "custom", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("CustomAlpha", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom_alpha"), "custom_alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Delta", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "delta"), "delta", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("EmissionTransform", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "emission_transform"), "emission_transform", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Index", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "index"), "index", VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("LifeTime", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "lifetime"), "lifetime", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Restart", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "restart"), "restart", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Time", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time"), "time", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Transform", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "transform"), "transform", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+ add_options.push_back(AddOption("Velocity", "Input", "End", "VisualShaderNodeInput", vformat(input_param_shader_modes, "velocity"), "velocity", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_END, Shader::MODE_PARTICLES));
+
+ // SKY INPUTS
+
+ add_options.push_back(AddOption("AtCubeMapPass", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "at_cubemap_pass"), "at_cubemap_pass", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("AtHalfResPass", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "at_half_res_pass"), "at_half_res_pass", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("AtQuarterResPass", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "at_quarter_res_pass"), "at_quarter_res_pass", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("EyeDir", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "eyedir"), "eyedir", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("HalfResColor", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "half_res_color"), "half_res_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("HalfResAlpha", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "half_res_alpha"), "half_res_alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light0Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light0_color"), "light0_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light0Direction", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light0_direction"), "light0_direction", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light0Enabled", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light0_enabled"), "light0_enabled", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light0Energy", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light0_energy"), "light0_energy", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light1Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light1_color"), "light1_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light1Direction", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light1_direction"), "light1_direction", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light1Enabled", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light1_enabled"), "light1_enabled", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light1Energy", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light1_energy"), "light1_energy", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light2Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light2_color"), "light2_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light2Direction", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light2_direction"), "light2_direction", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light2Enabled", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light2_enabled"), "light2_enabled", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light2Energy", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light2_energy"), "light2_energy", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light3Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light3_color"), "light3_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light3Direction", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light3_direction"), "light3_direction", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light3Enabled", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light3_enabled"), "light3_enabled", VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Light3Energy", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "light3_energy"), "light3_energy", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Position", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "position"), "position", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("QuarterResColor", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "quarter_res_color"), "quarter_res_color", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("QuarterResAlpha", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "quarter_res_alpha"), "quarter_res_alpha", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Radiance", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "radiance"), "radiance", VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("SkyCoords", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "sky_coords"), "sky_coords", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
+ add_options.push_back(AddOption("Time", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "time"), "time", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SKY));
// SCALAR
- add_options.push_back(AddOption("ScalarFunc", "Scalar", "Common", "VisualShaderNodeScalarFunc", TTR("Scalar function."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ScalarOp", "Scalar", "Common", "VisualShaderNodeScalarOp", TTR("Scalar operator."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("FloatFunc", "Scalar", "Common", "VisualShaderNodeFloatFunc", TTR("Float function."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("IntFunc", "Scalar", "Common", "VisualShaderNodeIntFunc", TTR("Integer function."), -1, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("FloatOp", "Scalar", "Common", "VisualShaderNodeFloatOp", TTR("Float operator."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("IntOp", "Scalar", "Common", "VisualShaderNodeIntOp", TTR("Integer operator."), -1, VisualShaderNode::PORT_TYPE_SCALAR_INT));
//CONSTANTS
- add_options.push_back(AddOption("E", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("E constant (2.718282). Represents the base of the natural logarithm."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_E));
- add_options.push_back(AddOption("Epsilon", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("Epsilon constant (0.00001). Smallest possible scalar number."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, CMP_EPSILON));
- add_options.push_back(AddOption("Phi", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("Phi constant (1.618034). Golden ratio."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, 1.618034f));
- add_options.push_back(AddOption("Pi/4", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("Pi/4 constant (0.785398) or 45 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_PI / 4));
- add_options.push_back(AddOption("Pi/2", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("Pi/2 constant (1.570796) or 90 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_PI / 2));
- add_options.push_back(AddOption("Pi", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("Pi constant (3.141593) or 180 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_PI));
- add_options.push_back(AddOption("Tau", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("Tau constant (6.283185) or 360 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_TAU));
- add_options.push_back(AddOption("Sqrt2", "Scalar", "Constants", "VisualShaderNodeScalarConstant", TTR("Sqrt2 constant (1.414214). Square root of 2."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_SQRT2));
+ add_options.push_back(AddOption("E", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("E constant (2.718282). Represents the base of the natural logarithm."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_E));
+ add_options.push_back(AddOption("Epsilon", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("Epsilon constant (0.00001). Smallest possible scalar number."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, CMP_EPSILON));
+ add_options.push_back(AddOption("Phi", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("Phi constant (1.618034). Golden ratio."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, 1.618034f));
+ add_options.push_back(AddOption("Pi/4", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("Pi/4 constant (0.785398) or 45 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_PI / 4));
+ add_options.push_back(AddOption("Pi/2", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("Pi/2 constant (1.570796) or 90 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_PI / 2));
+ add_options.push_back(AddOption("Pi", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("Pi constant (3.141593) or 180 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_PI));
+ add_options.push_back(AddOption("Tau", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("Tau constant (6.283185) or 360 degrees."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_TAU));
+ add_options.push_back(AddOption("Sqrt2", "Scalar", "Constants", "VisualShaderNodeFloatConstant", TTR("Sqrt2 constant (1.414214). Square root of 2."), -1, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, Math_SQRT2));
// FUNCTIONS
- add_options.push_back(AddOption("Abs", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the absolute value of the parameter."), VisualShaderNodeScalarFunc::FUNC_ABS, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ACos", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the arc-cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ACOS, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ACosH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ACOSH, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ASin", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the arc-sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ASIN, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ASinH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ASINH, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ATan", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the arc-tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_ATAN, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ATan2", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the arc-tangent of the parameters."), VisualShaderNodeScalarOp::OP_ATAN2, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ATanH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_ATANH, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Ceil", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), VisualShaderNodeScalarFunc::FUNC_CEIL, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Abs", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the absolute value of the parameter."), VisualShaderNodeFloatFunc::FUNC_ABS, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Abs", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Returns the absolute value of the parameter."), VisualShaderNodeIntFunc::FUNC_ABS, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("ACos", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-cosine of the parameter."), VisualShaderNodeFloatFunc::FUNC_ACOS, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("ACosH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), VisualShaderNodeFloatFunc::FUNC_ACOSH, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("ASin", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-sine of the parameter."), VisualShaderNodeFloatFunc::FUNC_ASIN, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("ASinH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), VisualShaderNodeFloatFunc::FUNC_ASINH, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("ATan", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-tangent of the parameter."), VisualShaderNodeFloatFunc::FUNC_ATAN, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("ATan2", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the arc-tangent of the parameters."), VisualShaderNodeFloatOp::OP_ATAN2, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("ATanH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), VisualShaderNodeFloatFunc::FUNC_ATANH, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Ceil", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), VisualShaderNodeFloatFunc::FUNC_CEIL, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Clamp", "Scalar", "Functions", "VisualShaderNodeScalarClamp", TTR("Constrains a value to lie between two further values."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Cos", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_COS, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("CosH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_COSH, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Degrees", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Converts a quantity in radians to degrees."), VisualShaderNodeScalarFunc::FUNC_DEGREES, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Exp", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Base-e Exponential."), VisualShaderNodeScalarFunc::FUNC_EXP, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Exp2", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Base-2 Exponential."), VisualShaderNodeScalarFunc::FUNC_EXP2, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Floor", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest integer less than or equal to the parameter."), VisualShaderNodeScalarFunc::FUNC_FLOOR, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Fract", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Computes the fractional part of the argument."), VisualShaderNodeScalarFunc::FUNC_FRAC, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("InverseSqrt", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the inverse of the square root of the parameter."), VisualShaderNodeScalarFunc::FUNC_INVERSE_SQRT, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Log", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Natural logarithm."), VisualShaderNodeScalarFunc::FUNC_LOG, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Log2", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Base-2 logarithm."), VisualShaderNodeScalarFunc::FUNC_LOG2, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Max", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the greater of two values."), VisualShaderNodeScalarOp::OP_MAX, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Min", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the lesser of two values."), VisualShaderNodeScalarOp::OP_MIN, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Clamp", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Constrains a value to lie between two further values."), VisualShaderNodeIntFunc::FUNC_CLAMP, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("Cos", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the cosine of the parameter."), VisualShaderNodeFloatFunc::FUNC_COS, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("CosH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic cosine of the parameter."), VisualShaderNodeFloatFunc::FUNC_COSH, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Degrees", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Converts a quantity in radians to degrees."), VisualShaderNodeFloatFunc::FUNC_DEGREES, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Exp", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-e Exponential."), VisualShaderNodeFloatFunc::FUNC_EXP, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Exp2", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-2 Exponential."), VisualShaderNodeFloatFunc::FUNC_EXP2, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Floor", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer less than or equal to the parameter."), VisualShaderNodeFloatFunc::FUNC_FLOOR, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Fract", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Computes the fractional part of the argument."), VisualShaderNodeFloatFunc::FUNC_FRAC, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("InverseSqrt", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse of the square root of the parameter."), VisualShaderNodeFloatFunc::FUNC_INVERSE_SQRT, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Log", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Natural logarithm."), VisualShaderNodeFloatFunc::FUNC_LOG, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Log2", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-2 logarithm."), VisualShaderNodeFloatFunc::FUNC_LOG2, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Max", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the greater of two values."), VisualShaderNodeFloatOp::OP_MAX, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Min", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the lesser of two values."), VisualShaderNodeFloatOp::OP_MIN, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Mix", "Scalar", "Functions", "VisualShaderNodeScalarInterp", TTR("Linear interpolation between two scalars."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Negate", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the opposite value of the parameter."), VisualShaderNodeScalarFunc::FUNC_NEGATE, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("OneMinus", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("1.0 - scalar"), VisualShaderNodeScalarFunc::FUNC_ONEMINUS, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Pow", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the value of the first parameter raised to the power of the second."), VisualShaderNodeScalarOp::OP_POW, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Radians", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Converts a quantity in degrees to radians."), VisualShaderNodeScalarFunc::FUNC_RADIANS, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Reciprocal", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("1.0 / scalar"), VisualShaderNodeScalarFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Round", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("RoundEven", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest even integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Saturate", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Clamps the value between 0.0 and 1.0."), VisualShaderNodeScalarFunc::FUNC_SATURATE, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Sign", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Extracts the sign of the parameter."), VisualShaderNodeScalarFunc::FUNC_SIGN, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Sin", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_SIN, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("SinH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Sqrt", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the square root of the parameter."), VisualShaderNodeScalarFunc::FUNC_SQRT, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("MultiplyAdd", "Scalar", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on scalars."), VisualShaderNodeMultiplyAdd::TYPE_SCALAR, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Negate", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the opposite value of the parameter."), VisualShaderNodeFloatFunc::FUNC_NEGATE, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Negate", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Returns the opposite value of the parameter."), VisualShaderNodeIntFunc::FUNC_NEGATE, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("OneMinus", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("1.0 - scalar"), VisualShaderNodeFloatFunc::FUNC_ONEMINUS, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Pow", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the value of the first parameter raised to the power of the second."), VisualShaderNodeFloatOp::OP_POW, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Radians", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Converts a quantity in degrees to radians."), VisualShaderNodeFloatFunc::FUNC_RADIANS, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Reciprocal", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("1.0 / scalar"), VisualShaderNodeFloatFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Round", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeFloatFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("RoundEven", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest even integer to the parameter."), VisualShaderNodeFloatFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Saturate", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Clamps the value between 0.0 and 1.0."), VisualShaderNodeFloatFunc::FUNC_SATURATE, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Sign", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Extracts the sign of the parameter."), VisualShaderNodeFloatFunc::FUNC_SIGN, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Sign", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Extracts the sign of the parameter."), VisualShaderNodeIntFunc::FUNC_SIGN, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("Sin", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the sine of the parameter."), VisualShaderNodeFloatFunc::FUNC_SIN, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("SinH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic sine of the parameter."), VisualShaderNodeFloatFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Sqrt", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the square root of the parameter."), VisualShaderNodeFloatFunc::FUNC_SQRT, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("SmoothStep", "Scalar", "Functions", "VisualShaderNodeScalarSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Step", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), VisualShaderNodeScalarOp::OP_STEP, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Tan", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_TAN, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("TanH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Trunc", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the truncated value of the parameter."), VisualShaderNodeScalarFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_SCALAR));
-
- add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeScalarOp", TTR("Adds scalar to scalar."), VisualShaderNodeScalarOp::OP_ADD, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeScalarOp", TTR("Divides scalar by scalar."), VisualShaderNodeScalarOp::OP_DIV, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Multiply", "Scalar", "Operators", "VisualShaderNodeScalarOp", TTR("Multiplies scalar by scalar."), VisualShaderNodeScalarOp::OP_MUL, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Remainder", "Scalar", "Operators", "VisualShaderNodeScalarOp", TTR("Returns the remainder of the two scalars."), VisualShaderNodeScalarOp::OP_MOD, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("Subtract", "Scalar", "Operators", "VisualShaderNodeScalarOp", TTR("Subtracts scalar from scalar."), VisualShaderNodeScalarOp::OP_SUB, VisualShaderNode::PORT_TYPE_SCALAR));
-
- add_options.push_back(AddOption("ScalarConstant", "Scalar", "Variables", "VisualShaderNodeScalarConstant", TTR("Scalar constant."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
- add_options.push_back(AddOption("ScalarUniform", "Scalar", "Variables", "VisualShaderNodeScalarUniform", TTR("Scalar uniform."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Step", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), VisualShaderNodeFloatOp::OP_STEP, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Tan", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the tangent of the parameter."), VisualShaderNodeFloatFunc::FUNC_TAN, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("TanH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic tangent of the parameter."), VisualShaderNodeFloatFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Trunc", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the truncated value of the parameter."), VisualShaderNodeFloatFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_SCALAR));
+
+ add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Sums two floating-point scalars."), VisualShaderNodeFloatOp::OP_ADD, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Sums two integer scalars."), VisualShaderNodeIntOp::OP_ADD, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Divides two floating-point scalars."), VisualShaderNodeFloatOp::OP_DIV, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Divides two integer scalars."), VisualShaderNodeIntOp::OP_DIV, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("Multiply", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Multiplies two floating-point scalars."), VisualShaderNodeFloatOp::OP_MUL, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Multiply", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Multiplies two integer scalars."), VisualShaderNodeIntOp::OP_MUL, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("Remainder", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Returns the remainder of the two floating-point scalars."), VisualShaderNodeFloatOp::OP_MOD, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Remainder", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the remainder of the two integer scalars."), VisualShaderNodeIntOp::OP_MOD, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("Subtract", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Subtracts two floating-point scalars."), VisualShaderNodeFloatOp::OP_SUB, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("Subtract", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Subtracts two integer scalars."), VisualShaderNodeIntOp::OP_SUB, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+
+ add_options.push_back(AddOption("FloatConstant", "Scalar", "Variables", "VisualShaderNodeFloatConstant", TTR("Scalar floating-point constant."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("IntConstant", "Scalar", "Variables", "VisualShaderNodeIntConstant", TTR("Scalar integer constant."), -1, VisualShaderNode::PORT_TYPE_SCALAR_INT));
+ add_options.push_back(AddOption("FloatUniform", "Scalar", "Variables", "VisualShaderNodeFloatUniform", TTR("Scalar floating-point uniform."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
+ add_options.push_back(AddOption("IntUniform", "Scalar", "Variables", "VisualShaderNodeIntUniform", TTR("Scalar integer uniform."), -1, VisualShaderNode::PORT_TYPE_SCALAR_INT));
// TEXTURES
- add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubeMap", TTR("Perform the cubic texture lookup."), -1, -1));
+ add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubemap", TTR("Perform the cubic texture lookup."), -1, -1));
texture_node_option_idx = add_options.size();
- add_options.push_back(AddOption("Texture", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the texture lookup."), -1, -1));
+ add_options.push_back(AddOption("Texture2D", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the 2D texture lookup."), -1, -1));
+ add_options.push_back(AddOption("Texture2DArray", "Textures", "Functions", "VisualShaderNodeTexture2DArray", TTR("Perform the 2D-array texture lookup."), -1, -1, -1, -1, -1));
+ add_options.push_back(AddOption("Texture3D", "Textures", "Functions", "VisualShaderNodeTexture3D", TTR("Perform the 3D texture lookup."), -1, -1));
- add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubeMapUniform", TTR("Cubic texture uniform lookup."), -1, -1));
+ add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubemapUniform", TTR("Cubic texture uniform lookup."), -1, -1));
add_options.push_back(AddOption("TextureUniform", "Textures", "Variables", "VisualShaderNodeTextureUniform", TTR("2D texture uniform lookup."), -1, -1));
- add_options.push_back(AddOption("TextureUniformTriplanar", "Textures", "Variables", "VisualShaderNodeTextureUniformTriplanar", TTR("2D texture uniform lookup with triplanar."), -1, -1, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("TextureUniformTriplanar", "Textures", "Variables", "VisualShaderNodeTextureUniformTriplanar", TTR("2D texture uniform lookup with triplanar."), -1, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Texture2DArrayUniform", "Textures", "Variables", "VisualShaderNodeTexture2DArrayUniform", TTR("2D array of textures uniform lookup."), -1, -1, -1, -1, -1));
+ add_options.push_back(AddOption("Texture3DUniform", "Textures", "Variables", "VisualShaderNodeTexture3DUniform", TTR("3D texture uniform lookup."), -1, -1, -1, -1, -1));
// TRANSFORM
@@ -2746,6 +3260,7 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Min", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), VisualShaderNodeVectorOp::OP_MIN, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeVectorInterp", TTR("Linear interpolation between two vectors."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("MixS", "Vector", "Functions", "VisualShaderNodeVectorScalarMix", TTR("Linear interpolation between two vectors using scalar."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
+ add_options.push_back(AddOption("MultiplyAdd", "Vector", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), VisualShaderNodeMultiplyAdd::TYPE_VECTOR, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNode::PORT_TYPE_VECTOR));
@@ -2783,16 +3298,17 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Expression", "Special", "", "VisualShaderNodeExpression", TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside.")));
add_options.push_back(AddOption("Fresnel", "Special", "", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("GlobalExpression", "Special", "", "VisualShaderNodeGlobalExpression", TTR("Custom Godot Shader Language expression, which is placed on top of the resulted shader. You can place various function definitions inside and call it later in the Expressions. You can also declare varyings, uniforms and constants.")));
+ add_options.push_back(AddOption("UniformRef", "Special", "", "VisualShaderNodeUniformRef", TTR("A reference to an existing uniform.")));
- add_options.push_back(AddOption("ScalarDerivativeFunc", "Special", "Common", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) Scalar derivative function."), -1, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
- add_options.push_back(AddOption("VectorDerivativeFunc", "Special", "Common", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) Vector derivative function."), -1, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("ScalarDerivativeFunc", "Special", "Common", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) Scalar derivative function."), -1, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("VectorDerivativeFunc", "Special", "Common", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) Vector derivative function."), -1, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
- add_options.push_back(AddOption("DdX", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
- add_options.push_back(AddOption("DdXS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
- add_options.push_back(AddOption("DdY", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
- add_options.push_back(AddOption("DdYS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
- add_options.push_back(AddOption("Sum", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeVectorDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
- add_options.push_back(AddOption("SumS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeScalarDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("DdX", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("DdXS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("DdY", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("DdYS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("Sum", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeVectorDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
+ add_options.push_back(AddOption("SumS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeScalarDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, -1, true));
custom_node_option_idx = add_options.size();
/////////////////////////////////////////////////////////////////////
@@ -2812,24 +3328,25 @@ VisualShaderEditor::VisualShaderEditor() {
default_plugin.instance();
add_plugin(default_plugin);
+ graph_plugin.instance();
+
property_editor = memnew(CustomPropertyEditor);
add_child(property_editor);
- property_editor->connect("variant_changed", this, "_port_edited");
+ property_editor->connect("variant_changed", callable_mp(this, &VisualShaderEditor::_port_edited));
}
-void VisualShaderEditorPlugin::edit(Object *p_object) {
+/////////////////
+void VisualShaderEditorPlugin::edit(Object *p_object) {
visual_shader_editor->edit(Object::cast_to<VisualShader>(p_object));
}
bool VisualShaderEditorPlugin::handles(Object *p_object) const {
-
return p_object->is_class("VisualShader");
}
void VisualShaderEditorPlugin::make_visible(bool p_visible) {
-
if (p_visible) {
//editor->hide_animation_player_editors();
//editor->animation_panel_make_visible(true);
@@ -2839,9 +3356,9 @@ void VisualShaderEditorPlugin::make_visible(bool p_visible) {
visual_shader_editor->set_process_input(true);
//visual_shader_editor->set_process(true);
} else {
-
- if (visual_shader_editor->is_visible_in_tree())
+ if (visual_shader_editor->is_visible_in_tree()) {
editor->hide_bottom_panel();
+ }
button->hide();
visual_shader_editor->set_process_input(false);
//visual_shader_editor->set_process(false);
@@ -2849,7 +3366,6 @@ void VisualShaderEditorPlugin::make_visible(bool p_visible) {
}
VisualShaderEditorPlugin::VisualShaderEditorPlugin(EditorNode *p_node) {
-
editor = p_node;
visual_shader_editor = memnew(VisualShaderEditor);
visual_shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE);
@@ -2868,15 +3384,10 @@ class VisualShaderNodePluginInputEditor : public OptionButton {
Ref<VisualShaderNodeInput> input;
-protected:
- static void _bind_methods() {
- ClassDB::bind_method("_item_selected", &VisualShaderNodePluginInputEditor::_item_selected);
- }
-
public:
void _notification(int p_what) {
if (p_what == NOTIFICATION_READY) {
- connect("item_selected", this, "_item_selected");
+ connect("item_selected", callable_mp(this, &VisualShaderNodePluginInputEditor::_item_selected));
}
}
@@ -2886,12 +3397,13 @@ public:
void setup(const Ref<VisualShaderNodeInput> &p_input) {
input = p_input;
- Ref<Texture> type_icon[5] = {
- EditorNode::get_singleton()->get_gui_base()->get_icon("float", "EditorIcons"),
- EditorNode::get_singleton()->get_gui_base()->get_icon("Vector3", "EditorIcons"),
- EditorNode::get_singleton()->get_gui_base()->get_icon("bool", "EditorIcons"),
- EditorNode::get_singleton()->get_gui_base()->get_icon("Transform", "EditorIcons"),
- EditorNode::get_singleton()->get_gui_base()->get_icon("ImageTexture", "EditorIcons"),
+ Ref<Texture2D> type_icon[6] = {
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("float", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("int", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Vector3", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("bool", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Transform", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("ImageTexture", "EditorIcons"),
};
add_item("[None]");
@@ -2909,26 +3421,75 @@ public:
}
};
+////////////////
+
+class VisualShaderNodePluginUniformRefEditor : public OptionButton {
+ GDCLASS(VisualShaderNodePluginUniformRefEditor, OptionButton);
+
+ Ref<VisualShaderNodeUniformRef> uniform_ref;
+
+public:
+ void _notification(int p_what) {
+ if (p_what == NOTIFICATION_READY) {
+ connect("item_selected", callable_mp(this, &VisualShaderNodePluginUniformRefEditor::_item_selected));
+ }
+ }
+
+ void _item_selected(int p_item) {
+ VisualShaderEditor::get_singleton()->call_deferred("_uniform_select_item", uniform_ref, get_item_text(p_item));
+ }
+
+ void setup(const Ref<VisualShaderNodeUniformRef> &p_uniform_ref) {
+ uniform_ref = p_uniform_ref;
+
+ Ref<Texture2D> type_icon[7] = {
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("float", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("int", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("bool", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Vector3", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Transform", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Color", "EditorIcons"),
+ EditorNode::get_singleton()->get_gui_base()->get_theme_icon("ImageTexture", "EditorIcons"),
+ };
+
+ add_item("[None]");
+ int to_select = -1;
+ for (int i = 0; i < p_uniform_ref->get_uniforms_count(); i++) {
+ if (p_uniform_ref->get_uniform_name() == p_uniform_ref->get_uniform_name_by_index(i)) {
+ to_select = i + 1;
+ }
+ add_icon_item(type_icon[p_uniform_ref->get_uniform_type_by_index(i)], p_uniform_ref->get_uniform_name_by_index(i));
+ }
+
+ if (to_select >= 0) {
+ select(to_select);
+ }
+ }
+};
+
+////////////////
+
class VisualShaderNodePluginDefaultEditor : public VBoxContainer {
GDCLASS(VisualShaderNodePluginDefaultEditor, VBoxContainer);
Ref<Resource> parent_resource;
+ int node_id;
+ VisualShader::Type shader_type;
public:
- void _property_changed(const String &prop, const Variant &p_value, const String &p_field, bool p_changing = false) {
-
- if (p_changing)
+ void _property_changed(const String &p_property, const Variant &p_value, const String &p_field = "", bool p_changing = false) {
+ if (p_changing) {
return;
+ }
UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
updating = true;
- undo_redo->create_action(TTR("Edit Visual Property") + ": " + prop, UndoRedo::MERGE_ENDS);
- undo_redo->add_do_property(node.ptr(), prop, p_value);
- undo_redo->add_undo_property(node.ptr(), prop, node->get(prop));
+ undo_redo->create_action(TTR("Edit Visual Property") + ": " + p_property, UndoRedo::MERGE_ENDS);
+ undo_redo->add_do_property(node.ptr(), p_property, p_value);
+ undo_redo->add_undo_property(node.ptr(), p_property, node->get(p_property));
if (p_value.get_type() == Variant::OBJECT) {
-
- RES prev_res = node->get(prop);
+ RES prev_res = node->get(p_property);
RES curr_res = p_value;
if (curr_res.is_null()) {
@@ -2941,8 +3502,10 @@ public:
} else {
undo_redo->add_undo_method(this, "_open_inspector", (RES)parent_resource.ptr());
}
- undo_redo->add_do_method(this, "_refresh_request");
- undo_redo->add_undo_method(this, "_refresh_request");
+ }
+ if (p_property != "constant") {
+ undo_redo->add_do_method(VisualShaderEditor::get_singleton()->get_graph_plugin(), "update_node_deferred", shader_type, node_id);
+ undo_redo->add_undo_method(VisualShaderEditor::get_singleton()->get_graph_plugin(), "update_node_deferred", shader_type, node_id);
}
undo_redo->commit_action();
@@ -2950,17 +3513,14 @@ public:
}
void _node_changed() {
- if (updating)
+ if (updating) {
return;
+ }
for (int i = 0; i < properties.size(); i++) {
properties[i]->update_property();
}
}
- void _refresh_request() {
- VisualShaderEditor::get_singleton()->call_deferred("_update_graph");
- }
-
void _resource_selected(const String &p_path, RES p_resource) {
_open_inspector(p_resource);
}
@@ -2972,6 +3532,13 @@ public:
bool updating;
Ref<VisualShaderNode> node;
Vector<EditorProperty *> properties;
+ Vector<Label *> prop_names;
+
+ void _show_prop_names(bool p_show) {
+ for (int i = 0; i < prop_names.size(); i++) {
+ prop_names[i]->set_visible(p_show);
+ }
+ }
void setup(Ref<Resource> p_parent_resource, Vector<EditorProperty *> p_properties, const Vector<StringName> &p_names, Ref<VisualShaderNode> p_node) {
parent_resource = p_parent_resource;
@@ -2979,34 +3546,51 @@ public:
node = p_node;
properties = p_properties;
+ node_id = (int)p_node->get_meta("id");
+ shader_type = VisualShader::Type((int)p_node->get_meta("shader_type"));
+
for (int i = 0; i < p_properties.size(); i++) {
+ HBoxContainer *hbox = memnew(HBoxContainer);
+ hbox->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(hbox);
- add_child(p_properties[i]);
+ Label *prop_name = memnew(Label);
+ String prop_name_str = p_names[i];
+ prop_name_str = prop_name_str.capitalize() + ":";
+ prop_name->set_text(prop_name_str);
+ prop_name->set_visible(false);
+ hbox->add_child(prop_name);
+ prop_names.push_back(prop_name);
+
+ p_properties[i]->set_h_size_flags(SIZE_EXPAND_FILL);
+ hbox->add_child(p_properties[i]);
bool res_prop = Object::cast_to<EditorPropertyResource>(p_properties[i]);
if (res_prop) {
- p_properties[i]->connect("resource_selected", this, "_resource_selected");
+ p_properties[i]->connect("resource_selected", callable_mp(this, &VisualShaderNodePluginDefaultEditor::_resource_selected));
}
- properties[i]->connect("property_changed", this, "_property_changed");
+ properties[i]->connect("property_changed", callable_mp(this, &VisualShaderNodePluginDefaultEditor::_property_changed));
properties[i]->set_object_and_property(node.ptr(), p_names[i]);
properties[i]->update_property();
properties[i]->set_name_split_ratio(0);
}
- node->connect("changed", this, "_node_changed");
- node->connect("editor_refresh_request", this, "_refresh_request", varray(), CONNECT_DEFERRED);
+ node->connect("changed", callable_mp(this, &VisualShaderNodePluginDefaultEditor::_node_changed));
}
static void _bind_methods() {
- ClassDB::bind_method("_property_changed", &VisualShaderNodePluginDefaultEditor::_property_changed, DEFVAL(String()), DEFVAL(false));
- ClassDB::bind_method("_node_changed", &VisualShaderNodePluginDefaultEditor::_node_changed);
- ClassDB::bind_method("_refresh_request", &VisualShaderNodePluginDefaultEditor::_refresh_request);
- ClassDB::bind_method("_resource_selected", &VisualShaderNodePluginDefaultEditor::_resource_selected);
- ClassDB::bind_method("_open_inspector", &VisualShaderNodePluginDefaultEditor::_open_inspector);
+ ClassDB::bind_method("_open_inspector", &VisualShaderNodePluginDefaultEditor::_open_inspector); // Used by UndoRedo.
+ ClassDB::bind_method("_show_prop_names", &VisualShaderNodePluginDefaultEditor::_show_prop_names); // Used with call_deferred.
}
};
Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node) {
+ if (p_node->is_class("VisualShaderNodeUniformRef")) {
+ //create input
+ VisualShaderNodePluginUniformRefEditor *uniform_editor = memnew(VisualShaderNodePluginUniformRefEditor);
+ uniform_editor->setup(p_node);
+ return uniform_editor;
+ }
if (p_node->is_class("VisualShaderNodeInput")) {
//create input
@@ -3017,7 +3601,7 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par
Vector<StringName> properties = p_node->get_editable_properties();
if (properties.size() == 0) {
- return NULL;
+ return nullptr;
}
List<PropertyInfo> props;
@@ -3026,7 +3610,6 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par
Vector<PropertyInfo> pinfo;
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
-
for (int i = 0; i < properties.size(); i++) {
if (E->get().name == String(properties[i])) {
pinfo.push_back(E->get());
@@ -3034,8 +3617,9 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par
}
}
- if (pinfo.size() == 0)
- return NULL;
+ if (pinfo.size() == 0) {
+ return nullptr;
+ }
properties.clear();
@@ -3043,10 +3627,10 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par
Vector<EditorProperty *> editors;
for (int i = 0; i < pinfo.size(); i++) {
-
EditorProperty *prop = EditorInspector::instantiate_property_editor(node.ptr(), pinfo[i].type, pinfo[i].name, pinfo[i].hint, pinfo[i].hint_string, pinfo[i].usage);
- if (!prop)
- return NULL;
+ if (!prop) {
+ return nullptr;
+ }
if (Object::cast_to<EditorPropertyResource>(prop)) {
Object::cast_to<EditorPropertyResource>(prop)->set_use_sub_inspector(false);
@@ -3069,25 +3653,28 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par
}
void EditorPropertyShaderMode::_option_selected(int p_which) {
-
//will not use this, instead will do all the logic setting manually
//emit_signal("property_changed", get_edited_property(), p_which);
Ref<VisualShader> visual_shader(Object::cast_to<VisualShader>(get_edited_object()));
- if (visual_shader->get_mode() == p_which)
+ if (visual_shader->get_mode() == p_which) {
return;
+ }
UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
undo_redo->create_action(TTR("Visual Shader Mode Changed"));
//do is easy
undo_redo->add_do_method(visual_shader.ptr(), "set_mode", p_which);
undo_redo->add_undo_method(visual_shader.ptr(), "set_mode", visual_shader->get_mode());
+
+ undo_redo->add_do_method(VisualShaderEditor::get_singleton(), "_set_mode", p_which);
+ undo_redo->add_undo_method(VisualShaderEditor::get_singleton(), "_set_mode", visual_shader->get_mode());
+
//now undo is hell
//1. restore connections to output
for (int i = 0; i < VisualShader::TYPE_MAX; i++) {
-
VisualShader::Type type = VisualShader::Type(i);
List<VisualShader::Connection> conns;
visual_shader->get_node_connections(type, &conns);
@@ -3099,7 +3686,6 @@ void EditorPropertyShaderMode::_option_selected(int p_which) {
}
//2. restore input indices
for (int i = 0; i < VisualShader::TYPE_MAX; i++) {
-
VisualShader::Type type = VisualShader::Type(i);
Vector<int> nodes = visual_shader->get_node_list(type);
for (int j = 0; j < nodes.size(); j++) {
@@ -3117,7 +3703,6 @@ void EditorPropertyShaderMode::_option_selected(int p_which) {
visual_shader->get_property_list(&props);
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
-
if (E->get().name.begins_with("flags/") || E->get().name.begins_with("modes/")) {
undo_redo->add_undo_property(visual_shader.ptr(), E->get().name, visual_shader->get(E->get().name));
}
@@ -3134,7 +3719,6 @@ void EditorPropertyShaderMode::_option_selected(int p_which) {
}
void EditorPropertyShaderMode::update_property() {
-
int which = get_edited_object()->get(get_edited_property());
options->select(which);
}
@@ -3150,8 +3734,6 @@ void EditorPropertyShaderMode::set_option_button_clip(bool p_enable) {
}
void EditorPropertyShaderMode::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_option_selected"), &EditorPropertyShaderMode::_option_selected);
}
EditorPropertyShaderMode::EditorPropertyShaderMode() {
@@ -3159,7 +3741,7 @@ EditorPropertyShaderMode::EditorPropertyShaderMode() {
options->set_clip_text(true);
add_child(options);
add_focusable(options);
- options->connect("item_selected", this, "_option_selected");
+ options->connect("item_selected", callable_mp(this, &EditorPropertyShaderMode::_option_selected));
}
bool EditorInspectorShaderModePlugin::can_handle(Object *p_object) {
@@ -3170,10 +3752,8 @@ void EditorInspectorShaderModePlugin::parse_begin(Object *p_object) {
//do none
}
-bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
-
+bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) {
if (p_path == "mode" && p_object->is_class("VisualShader") && p_type == Variant::INT) {
-
EditorPropertyShaderMode *editor = memnew(EditorPropertyShaderMode);
Vector<String> options = p_hint_text.split(",");
editor->setup(options);
@@ -3188,6 +3768,7 @@ bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, Variant::
void EditorInspectorShaderModePlugin::parse_end() {
//do none
}
+
//////////////////////////////////
void VisualShaderNodePortPreview::_shader_changed() {
@@ -3213,11 +3794,11 @@ void VisualShaderNodePortPreview::_shader_changed() {
for (int i = EditorNode::get_singleton()->get_editor_history()->get_path_size() - 1; i >= 0; i--) {
Object *object = ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_history()->get_path_object(i));
- if (!object)
+ if (!object) {
continue;
+ }
ShaderMaterial *src_mat = Object::cast_to<ShaderMaterial>(object);
if (src_mat && src_mat->get_shader().is_valid()) {
-
List<PropertyInfo> params;
src_mat->get_shader()->get_param_list(&params);
for (List<PropertyInfo>::Element *E = params.front(); E; E = E->next()) {
@@ -3230,9 +3811,8 @@ void VisualShaderNodePortPreview::_shader_changed() {
}
void VisualShaderNodePortPreview::setup(const Ref<VisualShader> &p_shader, VisualShader::Type p_type, int p_node, int p_port) {
-
shader = p_shader;
- shader->connect("changed", this, "_shader_changed");
+ shader->connect("changed", callable_mp(this, &VisualShaderNodePortPreview::_shader_changed));
type = p_type;
port = p_port;
node = p_node;
@@ -3267,7 +3847,6 @@ void VisualShaderNodePortPreview::_notification(int p_what) {
}
void VisualShaderNodePortPreview::_bind_methods() {
- ClassDB::bind_method("_shader_changed", &VisualShaderNodePortPreview::_shader_changed);
}
VisualShaderNodePortPreview::VisualShaderNodePortPreview() {
@@ -3276,18 +3855,15 @@ VisualShaderNodePortPreview::VisualShaderNodePortPreview() {
//////////////////////////////////
String VisualShaderConversionPlugin::converts_to() const {
-
return "Shader";
}
bool VisualShaderConversionPlugin::handles(const Ref<Resource> &p_resource) const {
-
Ref<VisualShader> vshader = p_resource;
return vshader.is_valid();
}
Ref<Resource> VisualShaderConversionPlugin::convert(const Ref<Resource> &p_resource) const {
-
Ref<VisualShader> vshader = p_resource;
ERR_FAIL_COND_V(!vshader.is_valid(), Ref<Resource>());
diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h
index 8c5dd8e82f..531a117156 100644
--- a/editor/plugins/visual_shader_editor_plugin.h
+++ b/editor/plugins/visual_shader_editor_plugin.h
@@ -41,7 +41,6 @@
#include "scene/resources/visual_shader.h"
class VisualShaderNodePlugin : public Reference {
-
GDCLASS(VisualShaderNodePlugin, Reference);
protected:
@@ -51,9 +50,72 @@ public:
virtual Control *create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node);
};
-class VisualShaderEditor : public VBoxContainer {
+class VisualShaderGraphPlugin : public Reference {
+ GDCLASS(VisualShaderGraphPlugin, Reference);
+
+private:
+ struct InputPort {
+ Button *default_input_button;
+ };
+
+ struct Port {
+ TextureButton *preview_button;
+ };
+
+ struct Link {
+ VisualShader::Type type;
+ VisualShaderNode *visual_node;
+ GraphNode *graph_node;
+ bool preview_visible;
+ int preview_pos;
+ Map<int, InputPort> input_ports;
+ Map<int, Port> output_ports;
+ VBoxContainer *preview_box;
+ LineEdit *uniform_name;
+ };
+
+ Ref<VisualShader> visual_shader;
+ Map<int, Link> links;
+ List<VisualShader::Connection> connections;
+ bool dirty = false;
+
+protected:
+ static void _bind_methods();
+
+public:
+ void register_shader(VisualShader *p_visual_shader);
+ void set_connections(List<VisualShader::Connection> &p_connections);
+ void register_link(VisualShader::Type p_type, int p_id, VisualShaderNode *p_visual_node, GraphNode *p_graph_node);
+ void register_output_port(int p_id, int p_port, TextureButton *p_button);
+ void register_uniform_name(int p_id, LineEdit *p_uniform_name);
+ void clear_links();
+ void set_shader_type(VisualShader::Type p_type);
+ bool is_preview_visible(int p_id) const;
+ bool is_dirty() const;
+ void make_dirty(bool p_enabled);
+ void update_node(VisualShader::Type p_type, int p_id);
+ void update_node_deferred(VisualShader::Type p_type, int p_node_id);
+ void add_node(VisualShader::Type p_type, int p_id);
+ void remove_node(VisualShader::Type p_type, int p_id);
+ void connect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port);
+ void disconnect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port);
+ void show_port_preview(VisualShader::Type p_type, int p_node_id, int p_port_id);
+ void set_node_position(VisualShader::Type p_type, int p_id, const Vector2 &p_position);
+ void set_node_size(VisualShader::Type p_type, int p_id, const Vector2 &p_size);
+ void refresh_node_ports(VisualShader::Type p_type, int p_node);
+ void set_input_port_default_value(VisualShader::Type p_type, int p_node_id, int p_port_id, Variant p_value);
+ void register_default_input_button(int p_node_id, int p_port_id, Button *p_button);
+ void update_uniform_refs();
+ void set_uniform_name(VisualShader::Type p_type, int p_node_id, const String &p_name);
+ VisualShader::Type get_shader_type() const;
+
+ VisualShaderGraphPlugin();
+ ~VisualShaderGraphPlugin();
+};
+class VisualShaderEditor : public VBoxContainer {
GDCLASS(VisualShaderEditor, VBoxContainer);
+ friend class VisualShaderGraphPlugin;
CustomPropertyEditor *property_editor;
int editing_node;
@@ -62,10 +124,12 @@ class VisualShaderEditor : public VBoxContainer {
Ref<VisualShader> visual_shader;
HSplitContainer *main_box;
GraphEdit *graph;
- ToolButton *add_node;
- ToolButton *preview_shader;
+ Button *add_node;
+ Button *preview_shader;
- OptionButton *edit_type;
+ OptionButton *edit_type = nullptr;
+ OptionButton *edit_type_standart;
+ OptionButton *edit_type_particles;
PanelContainer *error_panel;
Label *error_label;
@@ -73,7 +137,8 @@ class VisualShaderEditor : public VBoxContainer {
bool pending_update_preview;
bool shader_error;
VBoxContainer *preview_vbox;
- TextEdit *preview_text;
+ CodeEdit *preview_text;
+ Ref<CodeHighlighter> syntax_highlighter;
Label *error_text;
UndoRedo *undo_redo;
@@ -81,19 +146,43 @@ class VisualShaderEditor : public VBoxContainer {
bool saved_node_pos_dirty;
ConfirmationDialog *members_dialog;
+ PopupMenu *popup_menu;
MenuButton *tools;
bool preview_showed;
+ bool particles_mode;
+
+ enum TypeFlags {
+ TYPE_FLAGS_VERTEX = 1,
+ TYPE_FLAGS_FRAGMENT = 2,
+ TYPE_FLAGS_LIGHT = 4,
+ };
+
+ enum ParticlesTypeFlags {
+ TYPE_FLAGS_EMIT = 1,
+ TYPE_FLAGS_PROCESS = 2,
+ TYPE_FLAGS_END = 4
+ };
enum ToolsMenuOptions {
EXPAND_ALL,
COLLAPSE_ALL
};
+ enum NodeMenuOptions {
+ ADD,
+ SEPARATOR, // ignore
+ COPY,
+ PASTE,
+ DELETE,
+ DUPLICATE,
+ };
+
Tree *members;
AcceptDialog *alert;
LineEdit *node_filter;
RichTextLabel *node_desc;
+ Label *highend_label;
void _tools_menu_option(int p_idx);
void _show_members_dialog(bool at_mouse_pos);
@@ -103,7 +192,6 @@ class VisualShaderEditor : public VBoxContainer {
struct AddOption {
String name;
String category;
- String sub_category;
String type;
String description;
int sub_func;
@@ -115,12 +203,12 @@ class VisualShaderEditor : public VBoxContainer {
float value;
bool highend;
bool is_custom;
+ int temp_idx;
AddOption(const String &p_name = String(), const String &p_category = String(), const String &p_sub_category = String(), const String &p_type = String(), const String &p_description = String(), int p_sub_func = -1, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1, bool p_highend = false) {
name = p_name;
type = p_type;
- category = p_category;
- sub_category = p_sub_category;
+ category = p_category + "/" + p_sub_category;
description = p_description;
sub_func = p_sub_func;
return_type = p_return_type;
@@ -134,8 +222,7 @@ class VisualShaderEditor : public VBoxContainer {
AddOption(const String &p_name, const String &p_category, const String &p_sub_category, const String &p_type, const String &p_description, const String &p_sub_func, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1, bool p_highend = false) {
name = p_name;
type = p_type;
- category = p_category;
- sub_category = p_sub_category;
+ category = p_category + "/" + p_sub_category;
description = p_description;
sub_func = 0;
sub_func_str = p_sub_func;
@@ -147,18 +234,26 @@ class VisualShaderEditor : public VBoxContainer {
is_custom = false;
}
};
+ struct _OptionComparator {
+ _FORCE_INLINE_ bool operator()(const AddOption &a, const AddOption &b) const {
+ return a.category.count("/") > b.category.count("/") || (a.category + "/" + a.name).naturalnocasecmp_to(b.category + "/" + b.name) < 0;
+ }
+ };
Vector<AddOption> add_options;
int texture_node_option_idx;
int custom_node_option_idx;
List<String> keyword_list;
+ List<VisualShaderNodeUniformRef> uniform_refs;
+
void _draw_color_over_button(Object *obj, Color p_color);
void _add_custom_node(const String &p_path);
void _add_texture_node(const String &p_path);
VisualShaderNode *_add_node(int p_idx, int p_op_idx = -1);
void _update_options_menu();
+ void _set_mode(int p_which);
void _show_preview_text();
void _update_preview();
@@ -176,7 +271,7 @@ class VisualShaderEditor : public VBoxContainer {
void _node_selected(Object *p_node);
void _delete_request(int);
- void _on_nodes_delete();
+ void _delete_nodes();
void _removed_from_graph();
@@ -193,8 +288,8 @@ class VisualShaderEditor : public VBoxContainer {
void _connection_to_empty(const String &p_from, int p_from_slot, const Vector2 &p_release_position);
void _connection_from_empty(const String &p_to, int p_to_slot, const Vector2 &p_release_position);
- void _line_edit_changed(const String &p_text, Object *line_edit, int p_node_id);
- void _line_edit_focus_out(Object *line_edit, int p_node_id);
+ void _uniform_line_edit_changed(const String &p_text, int p_node_id);
+ void _uniform_line_edit_focus_out(Object *line_edit, int p_node_id);
void _port_name_focus_out(Object *line_edit, int p_node_id, int p_port_id, bool p_output);
@@ -211,14 +306,17 @@ class VisualShaderEditor : public VBoxContainer {
void _clear_buffer();
void _copy_nodes();
- void _paste_nodes();
+ void _paste_nodes(bool p_use_custom_position = false, const Vector2 &p_custom_position = Vector2());
- Vector<Ref<VisualShaderNodePlugin> > plugins;
+ Vector<Ref<VisualShaderNodePlugin>> plugins;
+ Ref<VisualShaderGraphPlugin> graph_plugin;
void _mode_selected(int p_id);
- void _rebuild();
void _input_select_item(Ref<VisualShaderNodeInput> input, String name);
+ void _uniform_select_item(Ref<VisualShaderNodeUniformRef> p_uniform, String p_name);
+
+ VisualShader::Type get_current_shader_type() const;
void _add_input_port(int p_node, int p_port, int p_port_type, const String &p_name);
void _remove_input_port(int p_node, int p_port);
@@ -230,7 +328,7 @@ class VisualShaderEditor : public VBoxContainer {
void _change_output_port_type(int p_type, int p_node, int p_port);
void _change_output_port_name(const String &p_text, Object *line_edit, int p_node, int p_port);
- void _expression_focus_out(Object *text_edit, int p_node);
+ void _expression_focus_out(Object *code_edit, int p_node);
void _set_node_size(int p_type, int p_node, const Size2 &p_size);
void _node_resized(const Vector2 &p_new_size, int p_type, int p_node);
@@ -245,12 +343,17 @@ class VisualShaderEditor : public VBoxContainer {
void _member_create();
void _member_cancel();
+ Vector2 menu_point;
+ void _node_menu_id_pressed(int p_idx);
+
Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
bool _is_available(int p_mode);
void _update_created_node(GraphNode *node);
+ void _update_uniforms(bool p_update_refs);
+ void _update_uniform_refs(Set<String> &p_names);
protected:
void _notification(int p_what);
@@ -262,17 +365,17 @@ public:
void remove_plugin(const Ref<VisualShaderNodePlugin> &p_plugin);
static VisualShaderEditor *get_singleton() { return singleton; }
+ VisualShaderGraphPlugin *get_graph_plugin() { return graph_plugin.ptr(); }
void clear_custom_types();
- void add_custom_type(const String &p_name, const Ref<Script> &p_script, const String &p_description, int p_return_icon_type, const String &p_category, const String &p_subcategory);
+ void add_custom_type(const String &p_name, const Ref<Script> &p_script, const String &p_description, int p_return_icon_type, const String &p_category, bool p_highend);
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void edit(VisualShader *p_visual_shader);
VisualShaderEditor();
};
class VisualShaderEditorPlugin : public EditorPlugin {
-
GDCLASS(VisualShaderEditorPlugin, EditorPlugin);
VisualShaderEditor *visual_shader_editor;
@@ -280,22 +383,21 @@ class VisualShaderEditorPlugin : public EditorPlugin {
Button *button;
public:
- virtual String get_name() const { return "VisualShader"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
+ virtual String get_name() const override { return "VisualShader"; }
+ bool has_main_screen() const override { return false; }
+ virtual void edit(Object *p_object) override;
+ virtual bool handles(Object *p_object) const override;
+ virtual void make_visible(bool p_visible) override;
VisualShaderEditorPlugin(EditorNode *p_node);
~VisualShaderEditorPlugin();
};
class VisualShaderNodePluginDefault : public VisualShaderNodePlugin {
-
GDCLASS(VisualShaderNodePluginDefault, VisualShaderNodePlugin);
public:
- virtual Control *create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node);
+ virtual Control *create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node) override;
};
class EditorPropertyShaderMode : public EditorProperty {
@@ -309,7 +411,7 @@ protected:
public:
void setup(const Vector<String> &p_options);
- virtual void update_property();
+ virtual void update_property() override;
void set_option_button_clip(bool p_enable);
EditorPropertyShaderMode();
};
@@ -318,10 +420,10 @@ class EditorInspectorShaderModePlugin : public EditorInspectorPlugin {
GDCLASS(EditorInspectorShaderModePlugin, EditorInspectorPlugin);
public:
- virtual bool can_handle(Object *p_object);
- virtual void parse_begin(Object *p_object);
- virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage);
- virtual void parse_end();
+ virtual bool can_handle(Object *p_object) override;
+ virtual void parse_begin(Object *p_object) override;
+ virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override;
+ virtual void parse_end() override;
};
class VisualShaderNodePortPreview : public Control {
@@ -336,7 +438,7 @@ protected:
static void _bind_methods();
public:
- virtual Size2 get_minimum_size() const;
+ virtual Size2 get_minimum_size() const override;
void setup(const Ref<VisualShader> &p_shader, VisualShader::Type p_type, int p_node, int p_port);
VisualShaderNodePortPreview();
};
@@ -345,9 +447,9 @@ class VisualShaderConversionPlugin : public EditorResourceConversionPlugin {
GDCLASS(VisualShaderConversionPlugin, EditorResourceConversionPlugin);
public:
- virtual String converts_to() const;
- virtual bool handles(const Ref<Resource> &p_resource) const;
- virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const;
+ virtual String converts_to() const override;
+ virtual bool handles(const Ref<Resource> &p_resource) const override;
+ virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override;
};
#endif // VISUAL_SHADER_EDITOR_PLUGIN_H
diff --git a/editor/pot_generator.cpp b/editor/pot_generator.cpp
new file mode 100644
index 0000000000..f09750efdc
--- /dev/null
+++ b/editor/pot_generator.cpp
@@ -0,0 +1,219 @@
+/*************************************************************************/
+/* pot_generator.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "pot_generator.h"
+
+#include "core/error_macros.h"
+#include "core/project_settings.h"
+#include "editor_translation_parser.h"
+#include "plugins/packed_scene_translation_parser_plugin.h"
+
+POTGenerator *POTGenerator::singleton = nullptr;
+
+#ifdef DEBUG_POT
+void POTGenerator::_print_all_translation_strings() {
+ for (auto E = all_translation_strings.front(); E; E = E.next()) {
+ Vector<MsgidData> v_md = all_translation_strings[E.key()];
+ for (int i = 0; i < v_md.size(); i++) {
+ print_line("++++++");
+ print_line("msgid: " + E.key());
+ print_line("context: " + v_md[i].ctx);
+ print_line("msgid_plural: " + v_md[i].plural);
+ for (Set<String>::Element *E = v_md[i].locations.front(); E; E = E->next()) {
+ print_line("location: " + E->get());
+ }
+ }
+ }
+}
+#endif
+
+void POTGenerator::generate_pot(const String &p_file) {
+ if (!ProjectSettings::get_singleton()->has_setting("locale/translations_pot_files")) {
+ WARN_PRINT("No files selected for POT generation.");
+ return;
+ }
+
+ // Clear all_translation_strings of the previous round.
+ all_translation_strings.clear();
+
+ Vector<String> files = ProjectSettings::get_singleton()->get("locale/translations_pot_files");
+
+ // Collect all translatable strings according to files order in "POT Generation" setting.
+ for (int i = 0; i < files.size(); i++) {
+ Vector<String> msgids;
+ Vector<Vector<String>> msgids_context_plural;
+ String file_path = files[i];
+ String file_extension = file_path.get_extension();
+
+ if (EditorTranslationParser::get_singleton()->can_parse(file_extension)) {
+ EditorTranslationParser::get_singleton()->get_parser(file_extension)->parse_file(file_path, &msgids, &msgids_context_plural);
+ } else {
+ ERR_PRINT("Unrecognized file extension " + file_extension + " in generate_pot()");
+ return;
+ }
+
+ for (int j = 0; j < msgids_context_plural.size(); j++) {
+ Vector<String> entry = msgids_context_plural[j];
+ _add_new_msgid(entry[0], entry[1], entry[2], file_path);
+ }
+ for (int j = 0; j < msgids.size(); j++) {
+ _add_new_msgid(msgids[j], "", "", file_path);
+ }
+ }
+
+ _write_to_pot(p_file);
+}
+
+void POTGenerator::_write_to_pot(const String &p_file) {
+ Error err;
+ FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
+ if (err != OK) {
+ ERR_PRINT("Failed to open " + p_file);
+ return;
+ }
+
+ String project_name = ProjectSettings::get_singleton()->get("application/config/name");
+ Vector<String> files = ProjectSettings::get_singleton()->get("locale/translations_pot_files");
+ String extracted_files = "";
+ for (int i = 0; i < files.size(); i++) {
+ extracted_files += "# " + files[i] + "\n";
+ }
+ const String header =
+ "# LANGUAGE translation for " + project_name + " for the following files:\n" + extracted_files +
+ "#\n"
+ "#\n"
+ "# FIRST AUTHOR < EMAIL @ADDRESS>, YEAR.\n"
+ "#\n"
+ "#, fuzzy\n"
+ "msgid \"\"\n"
+ "msgstr \"\"\n"
+ "\"Project-Id-Version: " +
+ project_name + "\\n\"\n"
+ "\"Content-Type: text/plain; charset=UTF-8\\n\"\n"
+ "\"Content-Transfer-Encoding: 8-bit\\n\"\n\n";
+
+ file->store_string(header);
+
+ for (OrderedHashMap<String, Vector<MsgidData>>::Element E_pair = all_translation_strings.front(); E_pair; E_pair = E_pair.next()) {
+ String msgid = E_pair.key();
+ Vector<MsgidData> v_msgid_data = E_pair.value();
+ for (int i = 0; i < v_msgid_data.size(); i++) {
+ String context = v_msgid_data[i].ctx;
+ String plural = v_msgid_data[i].plural;
+ const Set<String> &locations = v_msgid_data[i].locations;
+
+ // Write file locations.
+ for (Set<String>::Element *E = locations.front(); E; E = E->next()) {
+ file->store_line("#: " + E->get().trim_prefix("res://"));
+ }
+
+ // Write context.
+ if (!context.empty()) {
+ file->store_line("msgctxt \"" + context + "\"");
+ }
+
+ // Write msgid.
+ _write_msgid(file, msgid, false);
+
+ // Write msgid_plural
+ if (!plural.empty()) {
+ _write_msgid(file, plural, true);
+ file->store_line("msgstr[0] \"\"");
+ file->store_line("msgstr[1] \"\"\n");
+ } else {
+ file->store_line("msgstr \"\"\n");
+ }
+ }
+ }
+
+ file->close();
+}
+
+void POTGenerator::_write_msgid(FileAccess *r_file, const String &p_id, bool p_plural) {
+ // Split \\n and \n.
+ Vector<String> temp = p_id.split("\\n");
+ Vector<String> msg_lines;
+ for (int i = 0; i < temp.size(); i++) {
+ msg_lines.append_array(temp[i].split("\n"));
+ if (i < temp.size() - 1) {
+ // Add \n.
+ msg_lines.set(msg_lines.size() - 1, msg_lines[msg_lines.size() - 1] + "\\n");
+ }
+ }
+
+ if (p_plural) {
+ r_file->store_string("msgid_plural ");
+ } else {
+ r_file->store_string("msgid ");
+ }
+
+ for (int i = 0; i < msg_lines.size(); i++) {
+ r_file->store_line("\"" + msg_lines[i] + "\"");
+ }
+}
+
+void POTGenerator::_add_new_msgid(const String &p_msgid, const String &p_context, const String &p_plural, const String &p_location) {
+ // Insert new location if msgid under same context exists already.
+ if (all_translation_strings.has(p_msgid)) {
+ Vector<MsgidData> &v_mdata = all_translation_strings[p_msgid];
+ for (int i = 0; i < v_mdata.size(); i++) {
+ if (v_mdata[i].ctx == p_context) {
+ if (!v_mdata[i].plural.empty() && !p_plural.empty() && v_mdata[i].plural != p_plural) {
+ WARN_PRINT("Redefinition of plural message (msgid_plural), under the same message (msgid) and context (msgctxt)");
+ }
+ v_mdata.write[i].locations.insert(p_location);
+ return;
+ }
+ }
+ }
+
+ // Add a new entry of msgid, context, plural and location - context and plural might be empty if the inserted msgid doesn't associated
+ // context or plurals.
+ MsgidData mdata;
+ mdata.ctx = p_context;
+ mdata.plural = p_plural;
+ mdata.locations.insert(p_location);
+ all_translation_strings[p_msgid].push_back(mdata);
+}
+
+POTGenerator *POTGenerator::get_singleton() {
+ if (!singleton) {
+ singleton = memnew(POTGenerator);
+ }
+ return singleton;
+}
+
+POTGenerator::POTGenerator() {
+}
+
+POTGenerator::~POTGenerator() {
+ memdelete(singleton);
+ singleton = nullptr;
+}
diff --git a/editor/pot_generator.h b/editor/pot_generator.h
new file mode 100644
index 0000000000..8853b784ed
--- /dev/null
+++ b/editor/pot_generator.h
@@ -0,0 +1,67 @@
+/*************************************************************************/
+/* pot_generator.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef POT_GENERATOR_H
+#define POT_GENERATOR_H
+
+#include "core/ordered_hash_map.h"
+#include "core/os/file_access.h"
+#include "core/set.h"
+
+//#define DEBUG_POT
+
+class POTGenerator {
+ static POTGenerator *singleton;
+
+ struct MsgidData {
+ String ctx;
+ String plural;
+ Set<String> locations;
+ };
+ // Store msgid as key and the additional data around the msgid - if it's under a context, has plurals and its file locations.
+ OrderedHashMap<String, Vector<MsgidData>> all_translation_strings;
+
+ void _write_to_pot(const String &p_file);
+ void _write_msgid(FileAccess *r_file, const String &p_id, bool p_plural);
+ void _add_new_msgid(const String &p_msgid, const String &p_context, const String &p_plural, const String &p_location);
+
+#ifdef DEBUG_POT
+ void _print_all_translation_strings();
+#endif
+
+public:
+ static POTGenerator *get_singleton();
+ void generate_pot(const String &p_file);
+
+ POTGenerator();
+ ~POTGenerator();
+};
+
+#endif // POT_GENERATOR_H
diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp
index 0665b1d013..541cba836b 100644
--- a/editor/progress_dialog.cpp
+++ b/editor/progress_dialog.cpp
@@ -34,9 +34,9 @@
#include "core/os/os.h"
#include "editor_scale.h"
#include "main/main.h"
+#include "servers/display_server.h"
void BackgroundProgress::_add_task(const String &p_task, const String &p_label, int p_steps) {
-
_THREAD_SAFE_METHOD_
ERR_FAIL_COND_MSG(tasks.has(p_task), "Task '" + p_task + "' already exists.");
BackgroundProgress::Task t;
@@ -61,11 +61,9 @@ void BackgroundProgress::_add_task(const String &p_task, const String &p_label,
}
void BackgroundProgress::_update() {
-
_THREAD_SAFE_METHOD_
for (Map<String, int>::Element *E = updates.front(); E; E = E->next()) {
-
if (tasks.has(E->key())) {
_task_step(E->key(), E->get());
}
@@ -75,19 +73,19 @@ void BackgroundProgress::_update() {
}
void BackgroundProgress::_task_step(const String &p_task, int p_step) {
-
_THREAD_SAFE_METHOD_
ERR_FAIL_COND(!tasks.has(p_task));
Task &t = tasks[p_task];
- if (p_step < 0)
+ if (p_step < 0) {
t.progress->set_value(t.progress->get_value() + 1);
- else
+ } else {
t.progress->set_value(p_step);
+ }
}
-void BackgroundProgress::_end_task(const String &p_task) {
+void BackgroundProgress::_end_task(const String &p_task) {
_THREAD_SAFE_METHOD_
ERR_FAIL_COND(!tasks.has(p_task));
@@ -98,7 +96,6 @@ void BackgroundProgress::_end_task(const String &p_task) {
}
void BackgroundProgress::_bind_methods() {
-
ClassDB::bind_method("_add_task", &BackgroundProgress::_add_task);
ClassDB::bind_method("_task_step", &BackgroundProgress::_task_step);
ClassDB::bind_method("_end_task", &BackgroundProgress::_end_task);
@@ -106,11 +103,10 @@ void BackgroundProgress::_bind_methods() {
}
void BackgroundProgress::add_task(const String &p_task, const String &p_label, int p_steps) {
-
MessageQueue::get_singleton()->push_call(this, "_add_task", p_task, p_label, p_steps);
}
-void BackgroundProgress::task_step(const String &p_task, int p_step) {
+void BackgroundProgress::task_step(const String &p_task, int p_step) {
//this code is weird, but it prevents deadlock.
bool no_updates = true;
{
@@ -118,8 +114,9 @@ void BackgroundProgress::task_step(const String &p_task, int p_step) {
no_updates = updates.empty();
}
- if (no_updates)
+ if (no_updates) {
MessageQueue::get_singleton()->push_call(this, "_update");
+ }
{
_THREAD_SAFE_METHOD_
@@ -128,45 +125,32 @@ void BackgroundProgress::task_step(const String &p_task, int p_step) {
}
void BackgroundProgress::end_task(const String &p_task) {
-
MessageQueue::get_singleton()->push_call(this, "_end_task", p_task);
}
////////////////////////////////////////////////
-ProgressDialog *ProgressDialog::singleton = NULL;
+ProgressDialog *ProgressDialog::singleton = nullptr;
void ProgressDialog::_notification(int p_what) {
-
- switch (p_what) {
-
- case NOTIFICATION_DRAW: {
-
- Ref<StyleBox> style = get_stylebox("panel", "PopupMenu");
- draw_style_box(style, Rect2(Point2(), get_size()));
-
- } break;
- }
}
void ProgressDialog::_popup() {
-
Size2 ms = main->get_combined_minimum_size();
ms.width = MAX(500 * EDSCALE, ms.width);
- Ref<StyleBox> style = get_stylebox("panel", "PopupMenu");
+ Ref<StyleBox> style = main->get_theme_stylebox("panel", "PopupMenu");
ms += style->get_minimum_size();
main->set_margin(MARGIN_LEFT, style->get_margin(MARGIN_LEFT));
main->set_margin(MARGIN_RIGHT, -style->get_margin(MARGIN_RIGHT));
main->set_margin(MARGIN_TOP, style->get_margin(MARGIN_TOP));
main->set_margin(MARGIN_BOTTOM, -style->get_margin(MARGIN_BOTTOM));
- raise();
+ //raise();
popup_centered(ms);
}
void ProgressDialog::add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
-
if (MessageQueue::get_singleton()->is_flushing()) {
ERR_PRINT("Do not use progress dialog (task) while flushing the message queue or using call_deferred()!");
return;
@@ -201,25 +185,26 @@ void ProgressDialog::add_task(const String &p_task, const String &p_label, int p
}
bool ProgressDialog::task_step(const String &p_task, const String &p_state, int p_step, bool p_force_redraw) {
-
ERR_FAIL_COND_V(!tasks.has(p_task), cancelled);
if (!p_force_redraw) {
uint64_t tus = OS::get_singleton()->get_ticks_usec();
- if (tus - last_progress_tick < 200000) //200ms
+ if (tus - last_progress_tick < 200000) { //200ms
return cancelled;
+ }
}
Task &t = tasks[p_task];
- if (p_step < 0)
+ if (p_step < 0) {
t.progress->set_value(t.progress->get_value() + 1);
- else
+ } else {
t.progress->set_value(p_step);
+ }
t.state->set_text(p_state);
last_progress_tick = OS::get_singleton()->get_ticks_usec();
if (cancel_hb->is_visible()) {
- OS::get_singleton()->force_process_input();
+ DisplayServer::get_singleton()->process_events();
}
Main::iteration(); // this will not work on a lot of platforms, so it's only meant for the editor
@@ -227,17 +212,17 @@ bool ProgressDialog::task_step(const String &p_task, const String &p_state, int
}
void ProgressDialog::end_task(const String &p_task) {
-
ERR_FAIL_COND(!tasks.has(p_task));
Task &t = tasks[p_task];
memdelete(t.vb);
tasks.erase(p_task);
- if (tasks.empty())
+ if (tasks.empty()) {
hide();
- else
+ } else {
_popup();
+ }
}
void ProgressDialog::_cancel_pressed() {
@@ -245,11 +230,9 @@ void ProgressDialog::_cancel_pressed() {
}
void ProgressDialog::_bind_methods() {
- ClassDB::bind_method("_cancel_pressed", &ProgressDialog::_cancel_pressed);
}
ProgressDialog::ProgressDialog() {
-
main = memnew(VBoxContainer);
add_child(main);
main->set_anchors_and_margins_preset(Control::PRESET_WIDE);
@@ -264,5 +247,5 @@ ProgressDialog::ProgressDialog() {
cancel_hb->add_child(cancel);
cancel->set_text(TTR("Cancel"));
cancel_hb->add_spacer();
- cancel->connect("pressed", this, "_cancel_pressed");
+ cancel->connect("pressed", callable_mp(this, &ProgressDialog::_cancel_pressed));
}
diff --git a/editor/progress_dialog.h b/editor/progress_dialog.h
index e01c7d802b..753b6ac955 100644
--- a/editor/progress_dialog.h
+++ b/editor/progress_dialog.h
@@ -38,13 +38,11 @@
#include "scene/gui/progress_bar.h"
class BackgroundProgress : public HBoxContainer {
-
GDCLASS(BackgroundProgress, HBoxContainer);
_THREAD_SAFE_CLASS_
struct Task {
-
HBoxContainer *hb;
ProgressBar *progress;
};
@@ -68,11 +66,9 @@ public:
BackgroundProgress() {}
};
-class ProgressDialog : public Popup {
-
- GDCLASS(ProgressDialog, Popup);
+class ProgressDialog : public PopupPanel {
+ GDCLASS(ProgressDialog, PopupPanel);
struct Task {
-
String task;
VBoxContainer *vb;
ProgressBar *progress;
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index 8245264e0d..1f553ba0de 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -46,34 +46,36 @@
#include "scene/gui/margin_container.h"
#include "scene/gui/scroll_container.h"
#include "scene/gui/tab_container.h"
+#include "servers/display_server.h"
+
+void ProjectExportDialog::_theme_changed() {
+ duplicate_preset->set_icon(presets->get_theme_icon("Duplicate", "EditorIcons"));
+ delete_preset->set_icon(presets->get_theme_icon("Remove", "EditorIcons"));
+ Control *panel = custom_feature_display->get_parent_control();
+ if (panel) {
+ panel->add_theme_style_override("panel", patches->get_theme_stylebox("bg", "Tree"));
+ }
+}
void ProjectExportDialog::_notification(int p_what) {
-
switch (p_what) {
- case NOTIFICATION_READY: {
- duplicate_preset->set_icon(get_icon("Duplicate", "EditorIcons"));
- delete_preset->set_icon(get_icon("Remove", "EditorIcons"));
- connect("confirmed", this, "_export_pck_zip");
- custom_feature_display->get_parent_control()->add_style_override("panel", get_stylebox("bg", "Tree"));
- } break;
- case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "export", get_rect());
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (!is_visible()) {
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "export", Rect2(get_position(), get_size()));
+ }
} break;
- case NOTIFICATION_THEME_CHANGED: {
- duplicate_preset->set_icon(get_icon("Duplicate", "EditorIcons"));
- delete_preset->set_icon(get_icon("Remove", "EditorIcons"));
- Control *panel = custom_feature_display->get_parent_control();
- if (panel)
- panel->add_style_override("panel", get_stylebox("bg", "Tree"));
+ case NOTIFICATION_READY: {
+ duplicate_preset->set_icon(presets->get_theme_icon("Duplicate", "EditorIcons"));
+ delete_preset->set_icon(presets->get_theme_icon("Remove", "EditorIcons"));
+ connect("confirmed", callable_mp(this, &ProjectExportDialog::_export_pck_zip));
+ custom_feature_display->get_parent_control()->add_theme_style_override("panel", patches->get_theme_stylebox("bg", "Tree"));
} break;
}
}
void ProjectExportDialog::popup_export() {
-
add_preset->get_popup()->clear();
for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) {
-
Ref<EditorExportPlatform> plat = EditorExport::get_singleton()->get_export_platform(i);
add_preset->get_popup()->add_icon_item(plat->get_logo(), plat->get_name());
@@ -94,7 +96,6 @@ void ProjectExportDialog::popup_export() {
}
void ProjectExportDialog::_add_preset(int p_platform) {
-
Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_platform(p_platform)->create_preset();
ERR_FAIL_COND(!preset.is_valid());
@@ -102,7 +103,6 @@ void ProjectExportDialog::_add_preset(int p_platform) {
bool make_runnable = true;
int attempt = 1;
while (true) {
-
bool valid = true;
for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) {
@@ -116,33 +116,40 @@ void ProjectExportDialog::_add_preset(int p_platform) {
}
}
- if (valid)
+ if (valid) {
break;
+ }
attempt++;
name = EditorExport::get_singleton()->get_export_platform(p_platform)->get_name() + " " + itos(attempt);
}
preset->set_name(name);
- if (make_runnable)
+ if (make_runnable) {
preset->set_runnable(make_runnable);
+ }
EditorExport::get_singleton()->add_export_preset(preset);
_update_presets();
_edit_preset(EditorExport::get_singleton()->get_export_preset_count() - 1);
}
-void ProjectExportDialog::_update_current_preset() {
+void ProjectExportDialog::_force_update_current_preset_parameters() {
+ // Force the parameters section to refresh its UI.
+ parameters->edit(nullptr);
+ _update_current_preset();
+}
+void ProjectExportDialog::_update_current_preset() {
_edit_preset(presets->get_current());
}
void ProjectExportDialog::_update_presets() {
-
updating = true;
Ref<EditorExportPreset> current;
- if (presets->get_current() >= 0 && presets->get_current() < presets->get_item_count())
+ if (presets->get_current() >= 0 && presets->get_current() < presets->get_item_count()) {
current = get_current_preset();
+ }
int current_idx = -1;
presets->clear();
@@ -153,8 +160,10 @@ void ProjectExportDialog::_update_presets() {
}
String name = preset->get_name();
- if (preset->is_runnable())
+ if (preset->is_runnable()) {
name += " (" + TTR("Runnable") + ")";
+ }
+ preset->update_files_to_export();
presets->add_item(name, preset->get_platform()->get_logo());
}
@@ -166,7 +175,6 @@ void ProjectExportDialog::_update_presets() {
}
void ProjectExportDialog::_update_export_all() {
-
bool can_export = EditorExport::get_singleton()->get_export_preset_count() > 0;
for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) {
@@ -187,13 +195,12 @@ void ProjectExportDialog::_update_export_all() {
}
void ProjectExportDialog::_edit_preset(int p_index) {
-
if (p_index < 0 || p_index >= presets->get_item_count()) {
name->set_text("");
name->set_editable(false);
export_path->hide();
runnable->set_disabled(true);
- parameters->edit(NULL);
+ parameters->edit(nullptr);
presets->unselect_all();
duplicate_preset->set_disabled(true);
delete_preset->set_disabled(true);
@@ -243,36 +250,37 @@ void ProjectExportDialog::_edit_preset(int p_index) {
String file = patchlist[i].get_file();
patch->set_editable(0, true);
patch->set_text(0, file.get_file().replace("*", ""));
- if (file.ends_with("*"))
+ if (file.ends_with("*")) {
patch->set_checked(0, true);
+ }
patch->set_tooltip(0, patchlist[i]);
patch->set_metadata(0, i);
- patch->add_button(0, get_icon("Remove", "EditorIcons"), 0);
- patch->add_button(0, get_icon("folder", "FileDialog"), 1);
+ patch->add_button(0, presets->get_theme_icon("Remove", "EditorIcons"), 0);
+ patch->add_button(0, presets->get_theme_icon("folder", "FileDialog"), 1);
}
TreeItem *patch_add = patches->create_item(patch_root);
patch_add->set_metadata(0, patchlist.size());
- if (patchlist.size() == 0)
+ if (patchlist.size() == 0) {
patch_add->set_text(0, TTR("Add initial export..."));
- else
+ } else {
patch_add->set_text(0, TTR("Add previous patches..."));
+ }
- patch_add->add_button(0, get_icon("folder", "FileDialog"), 1);
+ patch_add->add_button(0, presets->get_theme_icon("folder", "FileDialog"), 1);
_fill_resource_tree();
bool needs_templates;
String error;
if (!current->get_platform()->can_export(current, error, needs_templates)) {
-
if (error != String()) {
-
Vector<String> items = error.split("\n", false);
error = "";
for (int i = 0; i < items.size(); i++) {
- if (i > 0)
+ if (i > 0) {
error += "\n";
+ }
error += " - " + items[i];
}
@@ -281,10 +289,11 @@ void ProjectExportDialog::_edit_preset(int p_index) {
} else {
export_error->hide();
}
- if (needs_templates)
+ if (needs_templates) {
export_templates_error->show();
- else
+ } else {
export_templates_error->hide();
+ }
export_button->set_disabled(true);
get_ok()->set_disabled(true);
@@ -299,7 +308,25 @@ void ProjectExportDialog::_edit_preset(int p_index) {
custom_features->set_text(current->get_custom_features());
_update_feature_list();
_update_export_all();
- minimum_size_changed();
+ child_controls_changed();
+
+ String enc_in_filters_str = current->get_enc_in_filter();
+ String enc_ex_filters_str = current->get_enc_ex_filter();
+ if (!updating_enc_filters) {
+ enc_in_filters->set_text(enc_in_filters_str);
+ enc_ex_filters->set_text(enc_ex_filters_str);
+ }
+
+ bool enc_pck_mode = current->get_enc_pck();
+ enc_pck->set_pressed(enc_pck_mode);
+
+ enc_directory->set_disabled(!enc_pck_mode);
+ enc_in_filters->set_editable(enc_pck_mode);
+ enc_ex_filters->set_editable(enc_pck_mode);
+ script_key->set_editable(enc_pck_mode);
+
+ bool enc_directory_mode = current->get_enc_directory();
+ enc_directory->set_pressed(enc_directory_mode);
int script_export_mode = current->get_script_export_mode();
script_mode->select(script_export_mode);
@@ -308,7 +335,7 @@ void ProjectExportDialog::_edit_preset(int p_index) {
if (!updating_script_key) {
script_key->set_text(key);
}
- if (script_export_mode == EditorExportPreset::MODE_SCRIPT_ENCRYPTED) {
+ if (enc_pck_mode) {
script_key->set_editable(true);
bool key_valid = _validate_script_encryption_key(key);
@@ -326,7 +353,6 @@ void ProjectExportDialog::_edit_preset(int p_index) {
}
void ProjectExportDialog::_update_feature_list() {
-
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
@@ -360,9 +386,9 @@ void ProjectExportDialog::_update_feature_list() {
}
void ProjectExportDialog::_custom_features_changed(const String &p_text) {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
@@ -376,7 +402,6 @@ void ProjectExportDialog::_tab_changed(int) {
}
void ProjectExportDialog::_patch_button_pressed(Object *p_item, int p_column, int p_id) {
-
TreeItem *ti = (TreeItem *)p_item;
patch_index = ti->get_metadata(0);
@@ -388,17 +413,17 @@ void ProjectExportDialog::_patch_button_pressed(Object *p_item, int p_column, in
Vector<String> patches = current->get_patches();
ERR_FAIL_INDEX(patch_index, patches.size());
patch_erase->set_text(vformat(TTR("Delete patch '%s' from list?"), patches[patch_index].get_file()));
- patch_erase->popup_centered_minsize();
+ patch_erase->popup_centered();
} else {
- patch_dialog->popup_centered_ratio();
+ patch_dialog->popup_file_dialog();
}
}
void ProjectExportDialog::_patch_edited() {
-
TreeItem *item = patches->get_edited();
- if (!item)
+ if (!item) {
return;
+ }
int index = item->get_metadata(0);
Ref<EditorExportPreset> current = get_current_preset();
@@ -418,14 +443,12 @@ void ProjectExportDialog::_patch_edited() {
}
void ProjectExportDialog::_patch_selected(const String &p_path) {
-
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Vector<String> patches = current->get_patches();
if (patch_index >= patches.size()) {
-
current->add_patch(ProjectSettings::get_singleton()->get_resource_path().path_to(p_path) + "*");
} else {
String enabled = patches[patch_index].ends_with("*") ? String("*") : String();
@@ -436,33 +459,29 @@ void ProjectExportDialog::_patch_selected(const String &p_path) {
}
void ProjectExportDialog::_patch_deleted() {
-
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Vector<String> patches = current->get_patches();
if (patch_index < patches.size()) {
-
current->remove_patch(patch_index);
_update_current_preset();
}
}
void ProjectExportDialog::_update_parameters(const String &p_edited_property) {
-
_update_current_preset();
}
void ProjectExportDialog::_runnable_pressed() {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
if (runnable->is_pressed()) {
-
for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) {
Ref<EditorExportPreset> p = EditorExport::get_singleton()->get_export_preset(i);
if (p->get_platform() == current->get_platform()) {
@@ -470,7 +489,6 @@ void ProjectExportDialog::_runnable_pressed() {
}
}
} else {
-
current->set_runnable(false);
}
@@ -478,9 +496,9 @@ void ProjectExportDialog::_runnable_pressed() {
}
void ProjectExportDialog::_name_changed(const String &p_string) {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
@@ -504,14 +522,13 @@ String ProjectExportDialog::get_export_path() {
}
Ref<EditorExportPreset> ProjectExportDialog::get_current_preset() const {
-
return EditorExport::get_singleton()->get_export_preset(presets->get_current());
}
void ProjectExportDialog::_export_path_changed(const StringName &p_property, const Variant &p_value, const String &p_field, bool p_changing) {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
@@ -520,10 +537,60 @@ void ProjectExportDialog::_export_path_changed(const StringName &p_property, con
_update_presets();
}
-void ProjectExportDialog::_script_export_mode_changed(int p_mode) {
+void ProjectExportDialog::_enc_filters_changed(const String &p_filters) {
+ if (updating) {
+ return;
+ }
+
+ Ref<EditorExportPreset> current = get_current_preset();
+ ERR_FAIL_COND(current.is_null());
- if (updating)
+ current->set_enc_in_filter(enc_in_filters->get_text());
+ current->set_enc_ex_filter(enc_ex_filters->get_text());
+
+ updating_enc_filters = true;
+ _update_current_preset();
+ updating_enc_filters = false;
+}
+
+void ProjectExportDialog::_open_key_help_link() {
+ OS::get_singleton()->shell_open("https://docs.godotengine.org/en/latest/development/compiling/compiling_with_script_encryption_key.html");
+}
+
+void ProjectExportDialog::_enc_pck_changed(bool p_pressed) {
+ if (updating) {
return;
+ }
+
+ Ref<EditorExportPreset> current = get_current_preset();
+ ERR_FAIL_COND(current.is_null());
+
+ current->set_enc_pck(p_pressed);
+ enc_directory->set_disabled(!p_pressed);
+ enc_in_filters->set_editable(p_pressed);
+ enc_ex_filters->set_editable(p_pressed);
+ script_key->set_editable(p_pressed);
+
+ _update_current_preset();
+}
+
+void ProjectExportDialog::_enc_directory_changed(bool p_pressed) {
+ if (updating) {
+ return;
+ }
+
+ Ref<EditorExportPreset> current = get_current_preset();
+ ERR_FAIL_COND(current.is_null());
+
+ current->set_enc_directory(p_pressed);
+
+ _update_current_preset();
+}
+
+void ProjectExportDialog::_script_export_mode_changed(int p_mode) {
+ if (updating) {
+ return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
@@ -534,9 +601,9 @@ void ProjectExportDialog::_script_export_mode_changed(int p_mode) {
}
void ProjectExportDialog::_script_encryption_key_changed(const String &p_key) {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
@@ -549,7 +616,6 @@ void ProjectExportDialog::_script_encryption_key_changed(const String &p_key) {
}
bool ProjectExportDialog::_validate_script_encryption_key(const String &p_key) {
-
bool is_valid = false;
if (!p_key.empty() && p_key.is_valid_hex_number(false) && p_key.length() == 64) {
@@ -559,10 +625,10 @@ bool ProjectExportDialog::_validate_script_encryption_key(const String &p_key) {
}
void ProjectExportDialog::_duplicate_preset() {
-
Ref<EditorExportPreset> current = get_current_preset();
- if (current.is_null())
+ if (current.is_null()) {
return;
+ }
Ref<EditorExportPreset> preset = current->get_platform()->create_preset();
ERR_FAIL_COND(!preset.is_valid());
@@ -570,7 +636,6 @@ void ProjectExportDialog::_duplicate_preset() {
String name = current->get_name() + " (copy)";
bool make_runnable = true;
while (true) {
-
bool valid = true;
for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) {
@@ -584,15 +649,17 @@ void ProjectExportDialog::_duplicate_preset() {
}
}
- if (valid)
+ if (valid) {
break;
+ }
name += " (copy)";
}
preset->set_name(name);
- if (make_runnable)
+ if (make_runnable) {
preset->set_runnable(make_runnable);
+ }
preset->set_export_filter(current->get_export_filter());
preset->set_include_filter(current->get_include_filter());
preset->set_exclude_filter(current->get_exclude_filter());
@@ -612,17 +679,16 @@ void ProjectExportDialog::_duplicate_preset() {
}
void ProjectExportDialog::_delete_preset() {
-
Ref<EditorExportPreset> current = get_current_preset();
- if (current.is_null())
+ if (current.is_null()) {
return;
+ }
delete_confirm->set_text(vformat(TTR("Delete preset '%s'?"), current->get_name()));
- delete_confirm->popup_centered_minsize();
+ delete_confirm->popup_centered();
}
void ProjectExportDialog::_delete_preset_confirm() {
-
int idx = presets->get_current();
_edit_preset(-1);
export_button->set_disabled(true);
@@ -632,7 +698,6 @@ void ProjectExportDialog::_delete_preset_confirm() {
}
Variant ProjectExportDialog::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
if (p_from == presets) {
int pos = presets->get_item_at_position(p_point, true);
@@ -649,16 +714,14 @@ Variant ProjectExportDialog::get_drag_data_fw(const Point2 &p_point, Control *p_
label->set_text(presets->get_item_text(pos));
drag->add_child(label);
- set_drag_preview(drag);
+ presets->set_drag_preview(drag);
return d;
}
} else if (p_from == patches) {
-
TreeItem *item = patches->get_item_at_position(p_point);
if (item && item->get_cell_mode(0) == TreeItem::CELL_MODE_CHECK) {
-
int metadata = item->get_metadata(0);
Dictionary d;
d["type"] = "export_patch";
@@ -666,7 +729,7 @@ Variant ProjectExportDialog::get_drag_data_fw(const Point2 &p_point, Control *p_
Label *label = memnew(Label);
label->set_text(item->get_text(0));
- set_drag_preview(label);
+ patches->set_drag_preview(label);
return d;
}
@@ -676,26 +739,26 @@ Variant ProjectExportDialog::get_drag_data_fw(const Point2 &p_point, Control *p_
}
bool ProjectExportDialog::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
if (p_from == presets) {
Dictionary d = p_data;
- if (!d.has("type") || String(d["type"]) != "export_preset")
+ if (!d.has("type") || String(d["type"]) != "export_preset") {
return false;
+ }
- if (presets->get_item_at_position(p_point, true) < 0 && !presets->is_pos_at_end_of_items(p_point))
+ if (presets->get_item_at_position(p_point, true) < 0 && !presets->is_pos_at_end_of_items(p_point)) {
return false;
+ }
} else if (p_from == patches) {
-
Dictionary d = p_data;
- if (!d.has("type") || String(d["type"]) != "export_patch")
+ if (!d.has("type") || String(d["type"]) != "export_patch") {
return false;
+ }
patches->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
TreeItem *item = patches->get_item_at_position(p_point);
if (!item) {
-
return false;
}
}
@@ -704,7 +767,6 @@ bool ProjectExportDialog::can_drop_data_fw(const Point2 &p_point, const Variant
}
void ProjectExportDialog::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
if (p_from == presets) {
Dictionary d = p_data;
int from_pos = d["preset"];
@@ -715,12 +777,13 @@ void ProjectExportDialog::drop_data_fw(const Point2 &p_point, const Variant &p_d
to_pos = presets->get_item_at_position(p_point, true);
}
- if (to_pos == -1 && !presets->is_pos_at_end_of_items(p_point))
+ if (to_pos == -1 && !presets->is_pos_at_end_of_items(p_point)) {
return;
+ }
- if (to_pos == from_pos)
+ if (to_pos == from_pos) {
return;
- else if (to_pos > from_pos) {
+ } else if (to_pos > from_pos) {
to_pos--;
}
@@ -729,27 +792,29 @@ void ProjectExportDialog::drop_data_fw(const Point2 &p_point, const Variant &p_d
EditorExport::get_singleton()->add_export_preset(preset, to_pos);
_update_presets();
- if (to_pos >= 0)
+ if (to_pos >= 0) {
_edit_preset(to_pos);
- else
+ } else {
_edit_preset(presets->get_item_count() - 1);
+ }
} else if (p_from == patches) {
-
Dictionary d = p_data;
- if (!d.has("type") || String(d["type"]) != "export_patch")
+ if (!d.has("type") || String(d["type"]) != "export_patch") {
return;
+ }
int from_pos = d["patch"];
TreeItem *item = patches->get_item_at_position(p_point);
- if (!item)
+ if (!item) {
return;
+ }
int to_pos = item->get_cell_mode(0) == TreeItem::CELL_MODE_CHECK ? int(item->get_metadata(0)) : -1;
- if (to_pos == from_pos)
+ if (to_pos == from_pos) {
return;
- else if (to_pos > from_pos) {
+ } else if (to_pos > from_pos) {
to_pos--;
}
@@ -763,13 +828,14 @@ void ProjectExportDialog::drop_data_fw(const Point2 &p_point, const Variant &p_d
}
void ProjectExportDialog::_export_type_changed(int p_which) {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
- if (current.is_null())
+ if (current.is_null()) {
return;
+ }
current->set_export_filter(EditorExportPreset::ExportFilter(p_which));
updating = true;
@@ -778,27 +844,28 @@ void ProjectExportDialog::_export_type_changed(int p_which) {
}
void ProjectExportDialog::_filter_changed(const String &p_filter) {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
- if (current.is_null())
+ if (current.is_null()) {
return;
+ }
current->set_include_filter(include_filters->get_text());
current->set_exclude_filter(exclude_filters->get_text());
}
void ProjectExportDialog::_fill_resource_tree() {
-
include_files->clear();
include_label->hide();
include_margin->hide();
Ref<EditorExportPreset> current = get_current_preset();
- if (current.is_null())
+ if (current.is_null()) {
return;
+ }
EditorExportPreset::ExportFilter f = current->get_export_filter();
@@ -815,13 +882,11 @@ void ProjectExportDialog::_fill_resource_tree() {
}
bool ProjectExportDialog::_fill_tree(EditorFileSystemDirectory *p_dir, TreeItem *p_item, Ref<EditorExportPreset> &current, bool p_only_scenes) {
-
- p_item->set_icon(0, get_icon("folder", "FileDialog"));
+ p_item->set_icon(0, presets->get_theme_icon("folder", "FileDialog"));
p_item->set_text(0, p_dir->get_name() + "/");
bool used = false;
for (int i = 0; i < p_dir->get_subdir_count(); i++) {
-
TreeItem *subdir = include_files->create_item(p_item);
if (_fill_tree(p_dir->get_subdir(i), subdir, current, p_only_scenes)) {
used = true;
@@ -831,10 +896,10 @@ bool ProjectExportDialog::_fill_tree(EditorFileSystemDirectory *p_dir, TreeItem
}
for (int i = 0; i < p_dir->get_file_count(); i++) {
-
String type = p_dir->get_file_type(i);
- if (p_only_scenes && type != "PackedScene")
+ if (p_only_scenes && type != "PackedScene") {
continue;
+ }
TreeItem *file = include_files->create_item(p_item);
file->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
@@ -854,17 +919,19 @@ bool ProjectExportDialog::_fill_tree(EditorFileSystemDirectory *p_dir, TreeItem
}
void ProjectExportDialog::_tree_changed() {
-
- if (updating)
+ if (updating) {
return;
+ }
Ref<EditorExportPreset> current = get_current_preset();
- if (current.is_null())
+ if (current.is_null()) {
return;
+ }
TreeItem *item = include_files->get_edited();
- if (!item)
+ if (!item) {
return;
+ }
String path = item->get_metadata(0);
bool added = item->is_checked(0);
@@ -877,12 +944,10 @@ void ProjectExportDialog::_tree_changed() {
}
void ProjectExportDialog::_export_pck_zip() {
-
- export_pck_zip->popup_centered_ratio();
+ export_pck_zip->popup_file_dialog();
}
void ProjectExportDialog::_export_pck_zip_selected(const String &p_path) {
-
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Ref<EditorExportPlatform> platform = current->get_platform();
@@ -896,7 +961,6 @@ void ProjectExportDialog::_export_pck_zip_selected(const String &p_path) {
}
void ProjectExportDialog::_open_export_template_manager() {
-
EditorNode::get_singleton()->open_export_template_manager();
hide();
}
@@ -906,22 +970,23 @@ void ProjectExportDialog::_validate_export_path(const String &p_path) {
bool invalid_path = (p_path.get_file().get_basename() == "");
// Check if state change before needlessly messing with signals
- if (invalid_path && export_project->get_ok()->is_disabled())
+ if (invalid_path && export_project->get_ok()->is_disabled()) {
return;
- if (!invalid_path && !export_project->get_ok()->is_disabled())
+ }
+ if (!invalid_path && !export_project->get_ok()->is_disabled()) {
return;
+ }
if (invalid_path) {
export_project->get_ok()->set_disabled(true);
- export_project->get_line_edit()->disconnect("text_entered", export_project, "_file_entered");
+ export_project->get_line_edit()->disconnect_compat("text_entered", export_project, "_file_entered");
} else {
export_project->get_ok()->set_disabled(false);
- export_project->get_line_edit()->connect("text_entered", export_project, "_file_entered");
+ export_project->get_line_edit()->connect_compat("text_entered", export_project, "_file_entered");
}
}
void ProjectExportDialog::_export_project() {
-
Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Ref<EditorExportPlatform> platform = current->get_platform();
@@ -945,14 +1010,17 @@ void ProjectExportDialog::_export_project() {
}
}
- // Ensure that signal is connected if previous attempt left it disconnected with _validate_export_path
- if (!export_project->get_line_edit()->is_connected("text_entered", export_project, "_file_entered")) {
+ // Ensure that signal is connected if previous attempt left it disconnected
+ // with _validate_export_path.
+ // FIXME: This is a hack, we should instead change EditorFileDialog to allow
+ // disabling validation by the "text_entered" signal.
+ if (!export_project->get_line_edit()->is_connected_compat("text_entered", export_project, "_file_entered")) {
export_project->get_ok()->set_disabled(false);
- export_project->get_line_edit()->connect("text_entered", export_project, "_file_entered");
+ export_project->get_line_edit()->connect_compat("text_entered", export_project, "_file_entered");
}
- export_project->set_mode(EditorFileDialog::MODE_SAVE_FILE);
- export_project->popup_centered_ratio();
+ export_project->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
+ export_project->popup_file_dialog();
}
void ProjectExportDialog::_export_project_to_path(const String &p_path) {
@@ -974,27 +1042,24 @@ void ProjectExportDialog::_export_project_to_path(const String &p_path) {
error_dialog->set_text(vformat(TTR("Failed to export the project for platform '%s'.\nThis might be due to a configuration issue in the export preset or your export settings."), platform->get_name()));
}
- ERR_PRINTS(vformat("Failed to export the project for platform '%s'.", platform->get_name()));
+ ERR_PRINT(vformat("Failed to export the project for platform '%s'.", platform->get_name()));
error_dialog->show();
- error_dialog->popup_centered_minsize(Size2(300, 80));
+ error_dialog->popup_centered(Size2(300, 80));
}
}
void ProjectExportDialog::_export_all_dialog() {
-
export_all_dialog->show();
- export_all_dialog->popup_centered_minsize(Size2(300, 80));
+ export_all_dialog->popup_centered(Size2(300, 80));
}
void ProjectExportDialog::_export_all_dialog_action(const String &p_str) {
-
export_all_dialog->hide();
_export_all(p_str != "release");
}
void ProjectExportDialog::_export_all(bool p_debug) {
-
String mode = p_debug ? TTR("Debug") : TTR("Release");
EditorProgress ep("exportall", TTR("Exporting All") + " " + mode, EditorExport::get_singleton()->get_export_preset_count(), true);
@@ -1014,46 +1079,17 @@ void ProjectExportDialog::_export_all(bool p_debug) {
error_dialog->set_text(TTR("Export templates for this platform are missing/corrupted:") + " " + platform->get_name());
}
error_dialog->show();
- error_dialog->popup_centered_minsize(Size2(300, 80));
+ error_dialog->popup_centered(Size2(300, 80));
ERR_PRINT("Failed to export project");
}
}
}
void ProjectExportDialog::_bind_methods() {
-
- ClassDB::bind_method("_add_preset", &ProjectExportDialog::_add_preset);
- ClassDB::bind_method("_edit_preset", &ProjectExportDialog::_edit_preset);
- ClassDB::bind_method("_update_parameters", &ProjectExportDialog::_update_parameters);
- ClassDB::bind_method("_runnable_pressed", &ProjectExportDialog::_runnable_pressed);
- ClassDB::bind_method("_name_changed", &ProjectExportDialog::_name_changed);
- ClassDB::bind_method("_duplicate_preset", &ProjectExportDialog::_duplicate_preset);
- ClassDB::bind_method("_delete_preset", &ProjectExportDialog::_delete_preset);
- ClassDB::bind_method("_delete_preset_confirm", &ProjectExportDialog::_delete_preset_confirm);
ClassDB::bind_method("get_drag_data_fw", &ProjectExportDialog::get_drag_data_fw);
ClassDB::bind_method("can_drop_data_fw", &ProjectExportDialog::can_drop_data_fw);
ClassDB::bind_method("drop_data_fw", &ProjectExportDialog::drop_data_fw);
- ClassDB::bind_method("_export_type_changed", &ProjectExportDialog::_export_type_changed);
- ClassDB::bind_method("_filter_changed", &ProjectExportDialog::_filter_changed);
- ClassDB::bind_method("_tree_changed", &ProjectExportDialog::_tree_changed);
- ClassDB::bind_method("_patch_button_pressed", &ProjectExportDialog::_patch_button_pressed);
- ClassDB::bind_method("_patch_selected", &ProjectExportDialog::_patch_selected);
- ClassDB::bind_method("_patch_deleted", &ProjectExportDialog::_patch_deleted);
- ClassDB::bind_method("_patch_edited", &ProjectExportDialog::_patch_edited);
- ClassDB::bind_method("_export_pck_zip", &ProjectExportDialog::_export_pck_zip);
- ClassDB::bind_method("_export_pck_zip_selected", &ProjectExportDialog::_export_pck_zip_selected);
- ClassDB::bind_method("_open_export_template_manager", &ProjectExportDialog::_open_export_template_manager);
- ClassDB::bind_method("_validate_export_path", &ProjectExportDialog::_validate_export_path);
- ClassDB::bind_method("_export_path_changed", &ProjectExportDialog::_export_path_changed);
- ClassDB::bind_method("_script_export_mode_changed", &ProjectExportDialog::_script_export_mode_changed);
- ClassDB::bind_method("_script_encryption_key_changed", &ProjectExportDialog::_script_encryption_key_changed);
- ClassDB::bind_method("_export_project", &ProjectExportDialog::_export_project);
- ClassDB::bind_method("_export_project_to_path", &ProjectExportDialog::_export_project_to_path);
ClassDB::bind_method("_export_all", &ProjectExportDialog::_export_all);
- ClassDB::bind_method("_export_all_dialog", &ProjectExportDialog::_export_all_dialog);
- ClassDB::bind_method("_export_all_dialog_action", &ProjectExportDialog::_export_all_dialog_action);
- ClassDB::bind_method("_custom_features_changed", &ProjectExportDialog::_custom_features_changed);
- ClassDB::bind_method("_tab_changed", &ProjectExportDialog::_tab_changed);
ClassDB::bind_method("set_export_path", &ProjectExportDialog::set_export_path);
ClassDB::bind_method("get_export_path", &ProjectExportDialog::get_export_path);
ClassDB::bind_method("get_current_preset", &ProjectExportDialog::get_current_preset);
@@ -1062,15 +1098,14 @@ void ProjectExportDialog::_bind_methods() {
}
ProjectExportDialog::ProjectExportDialog() {
-
set_title(TTR("Export"));
- set_resizable(true);
VBoxContainer *main_vb = memnew(VBoxContainer);
+ main_vb->connect("theme_changed", callable_mp(this, &ProjectExportDialog::_theme_changed));
add_child(main_vb);
HSplitContainer *hbox = memnew(HSplitContainer);
main_vb->add_child(hbox);
- hbox->set_v_size_flags(SIZE_EXPAND_FILL);
+ hbox->set_v_size_flags(Control::SIZE_EXPAND_FILL);
// Presets list.
@@ -1085,21 +1120,26 @@ ProjectExportDialog::ProjectExportDialog() {
add_preset = memnew(MenuButton);
add_preset->set_text(TTR("Add..."));
- add_preset->get_popup()->connect("index_pressed", this, "_add_preset");
+ add_preset->get_popup()->connect("index_pressed", callable_mp(this, &ProjectExportDialog::_add_preset));
preset_hb->add_child(add_preset);
MarginContainer *mc = memnew(MarginContainer);
preset_vb->add_child(mc);
- mc->set_v_size_flags(SIZE_EXPAND_FILL);
+ mc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
presets = memnew(ItemList);
- presets->set_drag_forwarding(this);
+#ifndef _MSC_VER
+#warning must reimplement drag forward
+#endif
+ //presets->set_drag_forwarding(this);
mc->add_child(presets);
- presets->connect("item_selected", this, "_edit_preset");
- duplicate_preset = memnew(ToolButton);
+ presets->connect("item_selected", callable_mp(this, &ProjectExportDialog::_edit_preset));
+ duplicate_preset = memnew(Button);
+ duplicate_preset->set_flat(true);
preset_hb->add_child(duplicate_preset);
- duplicate_preset->connect("pressed", this, "_duplicate_preset");
- delete_preset = memnew(ToolButton);
+ duplicate_preset->connect("pressed", callable_mp(this, &ProjectExportDialog::_duplicate_preset));
+ delete_preset = memnew(Button);
+ delete_preset->set_flat(true);
preset_hb->add_child(delete_preset);
- delete_preset->connect("pressed", this, "_delete_preset");
+ delete_preset->connect("pressed", callable_mp(this, &ProjectExportDialog::_delete_preset));
// Preset settings.
@@ -1109,11 +1149,11 @@ ProjectExportDialog::ProjectExportDialog() {
name = memnew(LineEdit);
settings_vb->add_margin_child(TTR("Name:"), name);
- name->connect("text_changed", this, "_name_changed");
+ name->connect("text_changed", callable_mp(this, &ProjectExportDialog::_name_changed));
runnable = memnew(CheckButton);
runnable->set_text(TTR("Runnable"));
runnable->set_tooltip(TTR("If checked, the preset will be available for use in one-click deploy.\nOnly one preset per platform may be marked as runnable."));
- runnable->connect("pressed", this, "_runnable_pressed");
+ runnable->connect("pressed", callable_mp(this, &ProjectExportDialog::_runnable_pressed));
settings_vb->add_child(runnable);
export_path = memnew(EditorPropertyPath);
@@ -1121,7 +1161,7 @@ ProjectExportDialog::ProjectExportDialog() {
export_path->set_label(TTR("Export Path"));
export_path->set_object_and_property(this, "export_path");
export_path->set_save_mode();
- export_path->connect("property_changed", this, "_export_path_changed");
+ export_path->connect("property_changed", callable_mp(this, &ProjectExportDialog::_export_path_changed));
// Subsections.
@@ -1129,15 +1169,16 @@ ProjectExportDialog::ProjectExportDialog() {
sections->set_tab_align(TabContainer::ALIGN_LEFT);
sections->set_use_hidden_tabs_for_min_size(true);
settings_vb->add_child(sections);
- sections->set_v_size_flags(SIZE_EXPAND_FILL);
+ sections->set_v_size_flags(Control::SIZE_EXPAND_FILL);
// Main preset parameters.
parameters = memnew(EditorInspector);
sections->add_child(parameters);
parameters->set_name(TTR("Options"));
- parameters->set_v_size_flags(SIZE_EXPAND_FILL);
- parameters->connect("property_edited", this, "_update_parameters");
+ parameters->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ parameters->connect("property_edited", callable_mp(this, &ProjectExportDialog::_update_parameters));
+ EditorExport::get_singleton()->connect("export_presets_updated", callable_mp(this, &ProjectExportDialog::_force_update_current_preset_parameters));
// Resources export parameters.
@@ -1150,30 +1191,36 @@ ProjectExportDialog::ProjectExportDialog() {
export_filter->add_item(TTR("Export selected scenes (and dependencies)"));
export_filter->add_item(TTR("Export selected resources (and dependencies)"));
resources_vb->add_margin_child(TTR("Export Mode:"), export_filter);
- export_filter->connect("item_selected", this, "_export_type_changed");
+ export_filter->connect("item_selected", callable_mp(this, &ProjectExportDialog::_export_type_changed));
include_label = memnew(Label);
include_label->set_text(TTR("Resources to export:"));
resources_vb->add_child(include_label);
include_margin = memnew(MarginContainer);
- include_margin->set_v_size_flags(SIZE_EXPAND_FILL);
+ include_margin->set_v_size_flags(Control::SIZE_EXPAND_FILL);
resources_vb->add_child(include_margin);
include_files = memnew(Tree);
include_margin->add_child(include_files);
- include_files->connect("item_edited", this, "_tree_changed");
+ include_files->connect("item_edited", callable_mp(this, &ProjectExportDialog::_tree_changed));
include_filters = memnew(LineEdit);
resources_vb->add_margin_child(
TTR("Filters to export non-resource files/folders\n(comma-separated, e.g: *.json, *.txt, docs/*)"),
include_filters);
- include_filters->connect("text_changed", this, "_filter_changed");
+ include_filters->connect("text_changed", callable_mp(this, &ProjectExportDialog::_filter_changed));
exclude_filters = memnew(LineEdit);
resources_vb->add_margin_child(
TTR("Filters to exclude files/folders from project\n(comma-separated, e.g: *.json, *.txt, docs/*)"),
exclude_filters);
- exclude_filters->connect("text_changed", this, "_filter_changed");
+ exclude_filters->connect("text_changed", callable_mp(this, &ProjectExportDialog::_filter_changed));
+
+ script_mode = memnew(OptionButton);
+ resources_vb->add_margin_child(TTR("Script Export Mode:"), script_mode);
+ script_mode->add_item(TTR("Text"), (int)EditorExportPreset::MODE_SCRIPT_TEXT);
+ script_mode->add_item(TTR("Compiled"), (int)EditorExportPreset::MODE_SCRIPT_COMPILED);
+ script_mode->connect("item_selected", callable_mp(this, &ProjectExportDialog::_script_export_mode_changed));
// Patch packages.
@@ -1188,11 +1235,14 @@ ProjectExportDialog::ProjectExportDialog() {
patches = memnew(Tree);
patch_vb->add_child(patches);
- patches->set_v_size_flags(SIZE_EXPAND_FILL);
+ patches->set_v_size_flags(Control::SIZE_EXPAND_FILL);
patches->set_hide_root(true);
- patches->connect("button_pressed", this, "_patch_button_pressed");
- patches->connect("item_edited", this, "_patch_edited");
- patches->set_drag_forwarding(this);
+ patches->connect("button_pressed", callable_mp(this, &ProjectExportDialog::_patch_button_pressed));
+ patches->connect("item_edited", callable_mp(this, &ProjectExportDialog::_patch_edited));
+#ifndef _MSC_VER
+#warning must reimplement drag forward
+#endif
+ //patches->set_drag_forwarding(this);
patches->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
HBoxContainer *patches_hb = memnew(HBoxContainer);
@@ -1205,13 +1255,13 @@ ProjectExportDialog::ProjectExportDialog() {
patch_dialog = memnew(EditorFileDialog);
patch_dialog->add_filter("*.pck ; " + TTR("Pack File"));
- patch_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- patch_dialog->connect("file_selected", this, "_patch_selected");
+ patch_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
+ patch_dialog->connect("file_selected", callable_mp(this, &ProjectExportDialog::_patch_selected));
add_child(patch_dialog);
patch_erase = memnew(ConfirmationDialog);
patch_erase->get_ok()->set_text(TTR("Delete"));
- patch_erase->connect("confirmed", this, "_patch_deleted");
+ patch_erase->connect("confirmed", callable_mp(this, &ProjectExportDialog::_patch_deleted));
add_child(patch_erase);
// Feature tags.
@@ -1219,38 +1269,62 @@ ProjectExportDialog::ProjectExportDialog() {
VBoxContainer *feature_vb = memnew(VBoxContainer);
feature_vb->set_name(TTR("Features"));
custom_features = memnew(LineEdit);
- custom_features->connect("text_changed", this, "_custom_features_changed");
+ custom_features->connect("text_changed", callable_mp(this, &ProjectExportDialog::_custom_features_changed));
feature_vb->add_margin_child(TTR("Custom (comma-separated):"), custom_features);
- Panel *features_panel = memnew(Panel);
custom_feature_display = memnew(RichTextLabel);
- features_panel->add_child(custom_feature_display);
- custom_feature_display->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 10 * EDSCALE);
- custom_feature_display->set_v_size_flags(SIZE_EXPAND_FILL);
- feature_vb->add_margin_child(TTR("Feature List:"), features_panel, true);
+ custom_feature_display->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ feature_vb->add_margin_child(TTR("Feature List:"), custom_feature_display, true);
sections->add_child(feature_vb);
// Script export parameters.
updating_script_key = false;
+ updating_enc_filters = false;
+
+ VBoxContainer *sec_vb = memnew(VBoxContainer);
+ sec_vb->set_name(TTR("Encryption"));
+
+ enc_pck = memnew(CheckButton);
+ enc_pck->connect("toggled", callable_mp(this, &ProjectExportDialog::_enc_pck_changed));
+ enc_pck->set_text(TTR("Encrypt exported PCK"));
+ sec_vb->add_child(enc_pck);
+
+ enc_directory = memnew(CheckButton);
+ enc_directory->connect("toggled", callable_mp(this, &ProjectExportDialog::_enc_directory_changed));
+ enc_directory->set_text("Encrypt index (file names and info).");
+ sec_vb->add_child(enc_directory);
+
+ enc_in_filters = memnew(LineEdit);
+ enc_in_filters->connect("text_changed", callable_mp(this, &ProjectExportDialog::_enc_filters_changed));
+ sec_vb->add_margin_child(
+ TTR("Filters to include files/folders\n(comma-separated, e.g: *.tscn, *.tres, scenes/*)"),
+ enc_in_filters);
+
+ enc_ex_filters = memnew(LineEdit);
+ enc_ex_filters->connect("text_changed", callable_mp(this, &ProjectExportDialog::_enc_filters_changed));
+ sec_vb->add_margin_child(
+ TTR("Filters to exclude files/folders\n(comma-separated, e.g: *.stex, *.import, music/*)"),
+ enc_ex_filters);
- VBoxContainer *script_vb = memnew(VBoxContainer);
- script_vb->set_name(TTR("Script"));
- script_mode = memnew(OptionButton);
- script_vb->add_margin_child(TTR("Script Export Mode:"), script_mode);
- script_mode->add_item(TTR("Text"), (int)EditorExportPreset::MODE_SCRIPT_TEXT);
- script_mode->add_item(TTR("Compiled"), (int)EditorExportPreset::MODE_SCRIPT_COMPILED);
- script_mode->add_item(TTR("Encrypted (Provide Key Below)"), (int)EditorExportPreset::MODE_SCRIPT_ENCRYPTED);
- script_mode->connect("item_selected", this, "_script_export_mode_changed");
script_key = memnew(LineEdit);
- script_key->connect("text_changed", this, "_script_encryption_key_changed");
+ script_key->connect("text_changed", callable_mp(this, &ProjectExportDialog::_script_encryption_key_changed));
script_key_error = memnew(Label);
script_key_error->set_text("- " + TTR("Invalid Encryption Key (must be 64 characters long)"));
- script_key_error->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
- script_vb->add_margin_child(TTR("Script Encryption Key (256-bits as hex):"), script_key);
- script_vb->add_child(script_key_error);
- sections->add_child(script_vb);
+ script_key_error->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor"));
+ sec_vb->add_margin_child(TTR("Encryption Key (256-bits as hex):"), script_key);
+ sec_vb->add_child(script_key_error);
+ sections->add_child(sec_vb);
+
+ Label *sec_info = memnew(Label);
+ sec_info->set_text(TTR("Note: Encryption key needs to be stored in the binary,\nyou need to build the export templates from source."));
+ sec_vb->add_child(sec_info);
+
+ LinkButton *sec_more_info = memnew(LinkButton);
+ sec_more_info->set_text(TTR("More Info..."));
+ sec_more_info->connect("pressed", callable_mp(this, &ProjectExportDialog::_open_key_help_link));
+ sec_vb->add_child(sec_more_info);
- sections->connect("tab_changed", this, "_tab_changed");
+ sections->connect("tab_changed", callable_mp(this, &ProjectExportDialog::_tab_changed));
// Disable by default.
name->set_editable(false);
@@ -1260,14 +1334,14 @@ ProjectExportDialog::ProjectExportDialog() {
delete_preset->set_disabled(true);
script_key_error->hide();
sections->hide();
- parameters->edit(NULL);
+ parameters->edit(nullptr);
// Deletion dialog.
delete_confirm = memnew(ConfirmationDialog);
add_child(delete_confirm);
delete_confirm->get_ok()->set_text(TTR("Delete"));
- delete_confirm->connect("confirmed", this, "_delete_preset_confirm");
+ delete_confirm->connect("confirmed", callable_mp(this, &ProjectExportDialog::_delete_preset_confirm));
// Export buttons, dialogs and errors.
@@ -1275,8 +1349,8 @@ ProjectExportDialog::ProjectExportDialog() {
get_cancel()->set_text(TTR("Close"));
get_ok()->set_text(TTR("Export PCK/Zip"));
- export_button = add_button(TTR("Export Project"), !OS::get_singleton()->get_swap_ok_cancel(), "export");
- export_button->connect("pressed", this, "_export_project");
+ export_button = add_button(TTR("Export Project"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export");
+ export_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_project));
// Disable initially before we select a valid preset
export_button->set_disabled(true);
get_ok()->set_disabled(true);
@@ -1288,24 +1362,24 @@ ProjectExportDialog::ProjectExportDialog() {
export_all_dialog->get_ok()->hide();
export_all_dialog->add_button(TTR("Debug"), true, "debug");
export_all_dialog->add_button(TTR("Release"), true, "release");
- export_all_dialog->connect("custom_action", this, "_export_all_dialog_action");
+ export_all_dialog->connect("custom_action", callable_mp(this, &ProjectExportDialog::_export_all_dialog_action));
- export_all_button = add_button(TTR("Export All"), !OS::get_singleton()->get_swap_ok_cancel(), "export");
- export_all_button->connect("pressed", this, "_export_all_dialog");
+ export_all_button = add_button(TTR("Export All"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export");
+ export_all_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_all_dialog));
export_all_button->set_disabled(true);
export_pck_zip = memnew(EditorFileDialog);
export_pck_zip->add_filter("*.zip ; " + TTR("ZIP File"));
export_pck_zip->add_filter("*.pck ; " + TTR("Godot Game Pack"));
export_pck_zip->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
- export_pck_zip->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ export_pck_zip->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
add_child(export_pck_zip);
- export_pck_zip->connect("file_selected", this, "_export_pck_zip_selected");
+ export_pck_zip->connect("file_selected", callable_mp(this, &ProjectExportDialog::_export_pck_zip_selected));
export_error = memnew(Label);
main_vb->add_child(export_error);
export_error->hide();
- export_error->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ export_error->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor"));
export_templates_error = memnew(HBoxContainer);
main_vb->add_child(export_templates_error);
@@ -1313,7 +1387,7 @@ ProjectExportDialog::ProjectExportDialog() {
Label *export_error2 = memnew(Label);
export_templates_error->add_child(export_error2);
- export_error2->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ export_error2->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor"));
export_error2->set_text(" - " + TTR("Export templates for this platform are missing:") + " ");
error_dialog = memnew(AcceptDialog);
@@ -1324,15 +1398,15 @@ ProjectExportDialog::ProjectExportDialog() {
LinkButton *download_templates = memnew(LinkButton);
download_templates->set_text(TTR("Manage Export Templates"));
- download_templates->set_v_size_flags(SIZE_SHRINK_CENTER);
+ download_templates->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
export_templates_error->add_child(download_templates);
- download_templates->connect("pressed", this, "_open_export_template_manager");
+ download_templates->connect("pressed", callable_mp(this, &ProjectExportDialog::_open_export_template_manager));
export_project = memnew(EditorFileDialog);
export_project->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
add_child(export_project);
- export_project->connect("file_selected", this, "_export_project_to_path");
- export_project->get_line_edit()->connect("text_changed", this, "_validate_export_path");
+ export_project->connect("file_selected", callable_mp(this, &ProjectExportDialog::_export_project_to_path));
+ export_project->get_line_edit()->connect("text_changed", callable_mp(this, &ProjectExportDialog::_validate_export_path));
export_debug = memnew(CheckBox);
export_debug->set_text(TTR("Export With Debug"));
diff --git a/editor/project_export.h b/editor/project_export.h
index 00e6dfd6e3..75402dc334 100644
--- a/editor/project_export.h
+++ b/editor/project_export.h
@@ -123,6 +123,7 @@ private:
void _delete_preset_confirm();
void _update_export_all();
+ void _force_update_current_preset_parameters();
void _update_current_preset();
void _update_presets();
@@ -144,6 +145,11 @@ private:
CheckBox *export_debug;
CheckBox *export_pck_zip_debug;
+ CheckButton *enc_pck;
+ CheckButton *enc_directory;
+ LineEdit *enc_in_filters;
+ LineEdit *enc_ex_filters;
+
void _open_export_template_manager();
void _export_pck_zip();
@@ -160,13 +166,20 @@ private:
void _custom_features_changed(const String &p_text);
bool updating_script_key;
+ bool updating_enc_filters;
+ void _enc_pck_changed(bool p_pressed);
+ void _enc_directory_changed(bool p_pressed);
+ void _enc_filters_changed(const String &p_text);
void _script_export_mode_changed(int p_mode);
void _script_encryption_key_changed(const String &p_key);
bool _validate_script_encryption_key(const String &p_key);
+ void _open_key_help_link();
+
void _tab_changed(int);
protected:
+ void _theme_changed();
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index 30e31cb530..1fb889d793 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -50,14 +50,14 @@
#include "scene/gui/panel_container.h"
#include "scene/gui/separator.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
+#include "scene/main/window.h"
+#include "servers/display_server.h"
static inline String get_project_key_from_path(const String &dir) {
return dir.replace("/", "::");
}
class ProjectDialog : public ConfirmationDialog {
-
GDCLASS(ProjectDialog, ConfirmationDialog);
public:
@@ -105,32 +105,27 @@ private:
String created_folder_path;
void set_message(const String &p_msg, MessageType p_type = MESSAGE_SUCCESS, InputType input_type = PROJECT_PATH) {
-
msg->set_text(p_msg);
- Ref<Texture> current_path_icon = status_rect->get_texture();
- Ref<Texture> current_install_icon = install_status_rect->get_texture();
- Ref<Texture> new_icon;
+ Ref<Texture2D> current_path_icon = status_rect->get_texture();
+ Ref<Texture2D> current_install_icon = install_status_rect->get_texture();
+ Ref<Texture2D> new_icon;
switch (p_type) {
-
case MESSAGE_ERROR: {
-
- msg->add_color_override("font_color", get_color("error_color", "Editor"));
+ msg->add_theme_color_override("font_color", msg->get_theme_color("error_color", "Editor"));
msg->set_modulate(Color(1, 1, 1, 1));
- new_icon = get_icon("StatusError", "EditorIcons");
+ new_icon = msg->get_theme_icon("StatusError", "EditorIcons");
} break;
case MESSAGE_WARNING: {
-
- msg->add_color_override("font_color", get_color("warning_color", "Editor"));
+ msg->add_theme_color_override("font_color", msg->get_theme_color("warning_color", "Editor"));
msg->set_modulate(Color(1, 1, 1, 1));
- new_icon = get_icon("StatusWarning", "EditorIcons");
+ new_icon = msg->get_theme_icon("StatusWarning", "EditorIcons");
} break;
case MESSAGE_SUCCESS: {
-
msg->set_modulate(Color(1, 1, 1, 0));
- new_icon = get_icon("StatusSuccess", "EditorIcons");
+ new_icon = msg->get_theme_icon("StatusSuccess", "EditorIcons");
} break;
}
@@ -141,11 +136,10 @@ private:
install_status_rect->set_texture(new_icon);
}
- set_size(Size2(500, 0) * EDSCALE);
+ set_size(Size2i(500, 0) * EDSCALE);
}
String _test_path() {
-
DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
String valid_path, valid_install_path;
if (d->change_dir(project_path->get_text()) == OK) {
@@ -163,7 +157,7 @@ private:
}
if (valid_path == "") {
- set_message(TTR("The path does not exist."), MESSAGE_ERROR);
+ set_message(TTR("The path specified doesn't exist."), MESSAGE_ERROR);
memdelete(d);
get_ok()->set_disabled(true);
return "";
@@ -177,7 +171,7 @@ private:
}
if (valid_install_path == "") {
- set_message(TTR("The path does not exist."), MESSAGE_ERROR, INSTALL_PATH);
+ set_message(TTR("The path specified doesn't exist."), MESSAGE_ERROR, INSTALL_PATH);
memdelete(d);
get_ok()->set_disabled(true);
return "";
@@ -185,17 +179,14 @@ private:
}
if (mode == MODE_IMPORT || mode == MODE_RENAME) {
-
if (valid_path != "" && !d->file_exists("project.godot")) {
-
if (valid_path.ends_with(".zip")) {
- FileAccess *src_f = NULL;
+ FileAccess *src_f = nullptr;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
unzFile pkg = unzOpen2(valid_path.utf8().get_data(), &io);
if (!pkg) {
-
- set_message(TTR("Error opening package file, not in ZIP format."), MESSAGE_ERROR);
+ set_message(TTR("Error opening package file (it's not in ZIP format)."), MESSAGE_ERROR);
memdelete(d);
get_ok()->set_disabled(true);
unzClose(pkg);
@@ -206,7 +197,7 @@ private:
while (ret == UNZ_OK) {
unz_file_info info;
char fname[16384];
- ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0);
+ ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0);
if (String(fname).ends_with("project.godot")) {
break;
@@ -216,7 +207,7 @@ private:
}
if (ret == UNZ_END_OF_LIST_OF_FILE) {
- set_message(TTR("Invalid '.zip' project file, does not contain a 'project.godot' file."), MESSAGE_ERROR);
+ set_message(TTR("Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."), MESSAGE_ERROR);
memdelete(d);
get_ok()->set_disabled(true);
unzClose(pkg);
@@ -230,7 +221,11 @@ private:
bool is_empty = true;
String n = d->get_next();
while (n != String()) {
- if (n != "." && n != "..") {
+ if (!n.begins_with(".")) {
+ // Allow `.`, `..` (reserved current/parent folder names)
+ // and hidden files/folders to be present.
+ // For instance, this lets users initialize a Git repository
+ // and still be able to create a project in the directory afterwards.
is_empty = false;
break;
}
@@ -239,7 +234,6 @@ private:
d->list_dir_end();
if (!is_empty) {
-
set_message(TTR("Please choose an empty folder."), MESSAGE_WARNING, INSTALL_PATH);
memdelete(d);
get_ok()->set_disabled(true);
@@ -247,7 +241,7 @@ private:
}
} else {
- set_message(TTR("Please choose a 'project.godot' or '.zip' file."), MESSAGE_ERROR);
+ set_message(TTR("Please choose a \"project.godot\" or \".zip\" file."), MESSAGE_ERROR);
memdelete(d);
install_path_container->hide();
get_ok()->set_disabled(true);
@@ -255,21 +249,23 @@ private:
}
} else if (valid_path.ends_with("zip")) {
-
- set_message(TTR("Directory already contains a Godot project."), MESSAGE_ERROR, INSTALL_PATH);
+ set_message(TTR("This directory already contains a Godot project."), MESSAGE_ERROR, INSTALL_PATH);
memdelete(d);
get_ok()->set_disabled(true);
return "";
}
} else {
-
// check if the specified folder is empty, even though this is not an error, it is good to check here
d->list_dir_begin();
bool is_empty = true;
String n = d->get_next();
while (n != String()) {
- if (n != "." && n != "..") { // i don't know if this is enough to guarantee an empty dir
+ if (!n.begins_with(".")) {
+ // Allow `.`, `..` (reserved current/parent folder names)
+ // and hidden files/folders to be present.
+ // For instance, this lets users initialize a Git repository
+ // and still be able to create a project in the directory afterwards.
is_empty = false;
break;
}
@@ -278,7 +274,6 @@ private:
d->list_dir_end();
if (!is_empty) {
-
set_message(TTR("Please choose an empty folder."), MESSAGE_ERROR);
memdelete(d);
get_ok()->set_disabled(true);
@@ -294,20 +289,19 @@ private:
}
void _path_text_changed(const String &p_path) {
-
String sp = _test_path();
if (sp != "") {
-
// If the project name is empty or default, infer the project name from the selected folder name
if (project_name->get_text() == "" || project_name->get_text() == TTR("New Game Project")) {
sp = sp.replace("\\", "/");
- int lidx = sp.find_last("/");
+ int lidx = sp.rfind("/");
if (lidx != -1) {
sp = sp.substr(lidx + 1, sp.length()).capitalize();
}
- if (sp == "" && mode == MODE_IMPORT)
+ if (sp == "" && mode == MODE_IMPORT) {
sp = TTR("Imported Project");
+ }
project_name->set_text(sp);
_text_changed(sp);
@@ -320,7 +314,6 @@ private:
}
void _file_selected(const String &p_path) {
-
String p = p_path;
if (mode == MODE_IMPORT) {
if (p.ends_with("project.godot")) {
@@ -332,11 +325,12 @@ private:
install_path_container->show();
get_ok()->set_disabled(false);
} else {
- set_message(TTR("Please choose a 'project.godot' or '.zip' file."), MESSAGE_ERROR);
+ set_message(TTR("Please choose a \"project.godot\" or \".zip\" file."), MESSAGE_ERROR);
get_ok()->set_disabled(true);
return;
}
}
+
String sp = p.simplify_path();
project_path->set_text(sp);
_path_text_changed(sp);
@@ -348,7 +342,6 @@ private:
}
void _path_selected(const String &p_path) {
-
String sp = p_path.simplify_path();
project_path->set_text(sp);
_path_text_changed(sp);
@@ -356,7 +349,6 @@ private:
}
void _install_path_selected(const String &p_path) {
-
String sp = p_path.simplify_path();
install_path->set_text(sp);
_path_text_changed(sp);
@@ -364,29 +356,26 @@ private:
}
void _browse_path() {
-
fdialog->set_current_dir(project_path->get_text());
if (mode == MODE_IMPORT) {
-
- fdialog->set_mode(FileDialog::MODE_OPEN_FILE);
+ fdialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE);
fdialog->clear_filters();
fdialog->add_filter(vformat("project.godot ; %s %s", VERSION_NAME, TTR("Project")));
fdialog->add_filter("*.zip ; " + TTR("ZIP File"));
} else {
- fdialog->set_mode(FileDialog::MODE_OPEN_DIR);
+ fdialog->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR);
}
- fdialog->popup_centered_ratio();
+ fdialog->popup_file_dialog();
}
void _browse_install_path() {
fdialog_install->set_current_dir(install_path->get_text());
- fdialog_install->set_mode(FileDialog::MODE_OPEN_DIR);
- fdialog_install->popup_centered_ratio();
+ fdialog_install->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR);
+ fdialog_install->popup_file_dialog();
}
void _create_folder() {
-
if (project_name->get_text() == "" || created_folder_path != "" || project_name->get_text().ends_with(".") || project_name->get_text().ends_with(" ")) {
set_message(TTR("Invalid Project Name."), MESSAGE_WARNING);
return;
@@ -394,11 +383,8 @@ private:
DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
if (d->change_dir(project_path->get_text()) == OK) {
-
if (!d->dir_exists(project_name->get_text())) {
-
if (d->make_dir(project_name->get_text()) == OK) {
-
d->change_dir(project_name->get_text());
String dir_str = d->get_current_dir();
project_path->set_text(dir_str);
@@ -406,14 +392,12 @@ private:
created_folder_path = d->get_current_dir();
create_dir->set_disabled(true);
} else {
-
dialog_error->set_text(TTR("Couldn't create folder."));
- dialog_error->popup_centered_minsize();
+ dialog_error->popup_centered();
}
} else {
-
dialog_error->set_text(TTR("There is already a folder in this path with the specified name."));
- dialog_error->popup_centered_minsize();
+ dialog_error->popup_centered();
}
}
@@ -421,22 +405,21 @@ private:
}
void _text_changed(const String &p_text) {
-
- if (mode != MODE_NEW)
+ if (mode != MODE_NEW) {
return;
+ }
_test_path();
- if (p_text == "")
- set_message(TTR("It would be a good idea to name your project."), MESSAGE_WARNING);
+ if (p_text == "") {
+ set_message(TTR("It would be a good idea to name your project."), MESSAGE_ERROR);
+ }
}
- void ok_pressed() {
-
+ void ok_pressed() override {
String dir = project_path->get_text();
if (mode == MODE_RENAME) {
-
String dir2 = _test_path();
if (dir2 == "") {
set_message(TTR("Invalid project path (changed anything?)."), MESSAGE_ERROR);
@@ -461,11 +444,8 @@ private:
emit_signal("projects_updated");
} else {
-
if (mode == MODE_IMPORT) {
-
if (project_path->get_text().ends_with(".zip")) {
-
mode = MODE_INSTALL;
ok_pressed();
@@ -474,10 +454,9 @@ private:
} else {
if (mode == MODE_NEW) {
-
ProjectSettings::CustomMap initial_settings;
- if (rasterizer_button_group->get_pressed_button()->get_meta("driver_name") == "GLES3") {
- initial_settings["rendering/quality/driver/driver_name"] = "GLES3";
+ if (rasterizer_button_group->get_pressed_button()->get_meta("driver_name") == "Vulkan") {
+ initial_settings["rendering/quality/driver/driver_name"] = "Vulkan";
} else {
initial_settings["rendering/quality/driver/driver_name"] = "GLES2";
initial_settings["rendering/vram_compression/import_etc2"] = false;
@@ -490,36 +469,36 @@ private:
if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("project.godot"), initial_settings, Vector<String>(), false) != OK) {
set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR);
} else {
- ResourceSaver::save(dir.plus_file("icon.png"), get_icon("DefaultProjectIcon", "EditorIcons"));
+ ResourceSaver::save(dir.plus_file("icon.png"), msg->get_theme_icon("DefaultProjectIcon", "EditorIcons"));
FileAccess *f = FileAccess::open(dir.plus_file("default_env.tres"), FileAccess::WRITE);
if (!f) {
set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR);
} else {
f->store_line("[gd_resource type=\"Environment\" load_steps=2 format=2]");
- f->store_line("[sub_resource type=\"ProceduralSky\" id=1]");
+ f->store_line("");
+ f->store_line("[sub_resource type=\"Sky\" id=1]");
+ f->store_line("");
f->store_line("[resource]");
f->store_line("background_mode = 2");
- f->store_line("background_sky = SubResource( 1 )");
+ f->store_line("sky = SubResource( 1 )");
memdelete(f);
}
}
} else if (mode == MODE_INSTALL) {
-
if (project_path->get_text().ends_with(".zip")) {
dir = install_path->get_text();
zip_path = project_path->get_text();
}
- FileAccess *src_f = NULL;
+ FileAccess *src_f = nullptr;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
unzFile pkg = unzOpen2(zip_path.utf8().get_data(), &io);
if (!pkg) {
-
dialog_error->set_text(TTR("Error opening package file, not in ZIP format."));
- dialog_error->popup_centered_minsize();
+ dialog_error->popup_centered();
return;
}
@@ -529,11 +508,10 @@ private:
int idx = 0;
while (ret == UNZ_OK) {
-
//get filename
unz_file_info info;
char fname[16384];
- ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0);
+ ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0);
String path = fname;
@@ -560,7 +538,6 @@ private:
memdelete(da);
} else {
-
Vector<uint8_t> data;
data.resize(info.uncompressed_size);
@@ -588,7 +565,6 @@ private:
if (failed_files.size()) {
String msg = TTR("The following files failed extraction from package:") + "\n\n";
for (int i = 0; i < failed_files.size(); i++) {
-
if (i > 15) {
msg += "\nAnd " + itos(failed_files.size() - i) + " more files.";
break;
@@ -597,18 +573,19 @@ private:
}
dialog_error->set_text(msg);
- dialog_error->popup_centered_minsize();
+ dialog_error->popup_centered();
} else if (!project_path->get_text().ends_with(".zip")) {
dialog_error->set_text(TTR("Package installed successfully!"));
- dialog_error->popup_centered_minsize();
+ dialog_error->popup_centered();
}
}
}
dir = dir.replace("\\", "/");
- if (dir.ends_with("/"))
+ if (dir.ends_with("/")) {
dir = dir.substr(0, dir.length() - 1);
+ }
String proj = get_project_key_from_path(dir);
EditorSettings::get_singleton()->set("projects/" + proj, dir);
EditorSettings::get_singleton()->save();
@@ -619,7 +596,6 @@ private:
}
void _remove_created_folder() {
-
if (created_folder_path != "") {
DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
d->remove(created_folder_path);
@@ -630,8 +606,7 @@ private:
}
}
- void cancel_pressed() {
-
+ void cancel_pressed() override {
_remove_created_folder();
project_path->clear();
@@ -639,22 +614,23 @@ private:
project_name->clear();
_text_changed("");
- if (status_rect->get_texture() == get_icon("StatusError", "EditorIcons"))
+ if (status_rect->get_texture() == msg->get_theme_icon("StatusError", "EditorIcons")) {
msg->show();
+ }
- if (install_status_rect->get_texture() == get_icon("StatusError", "EditorIcons"))
+ if (install_status_rect->get_texture() == msg->get_theme_icon("StatusError", "EditorIcons")) {
msg->show();
+ }
}
void _notification(int p_what) {
-
- if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST)
+ if (p_what == NOTIFICATION_WM_CLOSE_REQUEST) {
_remove_created_folder();
+ }
}
protected:
static void _bind_methods() {
-
ClassDB::bind_method("_browse_path", &ProjectDialog::_browse_path);
ClassDB::bind_method("_create_folder", &ProjectDialog::_create_folder);
ClassDB::bind_method("_text_changed", &ProjectDialog::_text_changed);
@@ -676,7 +652,6 @@ public:
}
void set_mode(Mode p_mode) {
-
mode = p_mode;
}
@@ -685,9 +660,7 @@ public:
}
void show_dialog() {
-
if (mode == MODE_RENAME) {
-
project_path->set_editable(false);
browse->hide();
install_browse->hide();
@@ -721,7 +694,6 @@ public:
create_dir->hide();
} else {
-
fav_dir = EditorSettings::get_singleton()->get("filesystem/directories/default_project_path");
if (fav_dir != "") {
project_path->set_text(fav_dir);
@@ -755,7 +727,6 @@ public:
project_path->grab_focus();
} else if (mode == MODE_NEW) {
-
set_title(TTR("Create New Project"));
get_ok()->set_text(TTR("Create & Edit"));
name_container->show();
@@ -765,7 +736,6 @@ public:
project_name->call_deferred("select_all");
} else if (mode == MODE_INSTALL) {
-
set_title(TTR("Install Project:") + " " + zip_title);
get_ok()->set_text(TTR("Install & Edit"));
project_name->set_text(zip_title);
@@ -778,11 +748,10 @@ public:
_test_path();
}
- popup_centered_minsize(Size2(500, 0) * EDSCALE);
+ popup_centered(Size2i(500, 0) * EDSCALE);
}
ProjectDialog() {
-
VBoxContainer *vb = memnew(VBoxContainer);
add_child(vb);
@@ -797,13 +766,13 @@ public:
name_container->add_child(pnhb);
project_name = memnew(LineEdit);
- project_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ project_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
pnhb->add_child(project_name);
create_dir = memnew(Button);
pnhb->add_child(create_dir);
create_dir->set_text(TTR("Create Folder"));
- create_dir->connect("pressed", this, "_create_folder");
+ create_dir->connect("pressed", callable_mp(this, &ProjectDialog::_create_folder));
path_container = memnew(VBoxContainer);
vb->add_child(path_container);
@@ -816,7 +785,7 @@ public:
path_container->add_child(pphb);
project_path = memnew(LineEdit);
- project_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ project_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
pphb->add_child(project_path);
install_path_container = memnew(VBoxContainer);
@@ -830,7 +799,7 @@ public:
install_path_container->add_child(iphb);
install_path = memnew(LineEdit);
- install_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ install_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
iphb->add_child(install_path);
// status icon
@@ -840,7 +809,7 @@ public:
browse = memnew(Button);
browse->set_text(TTR("Browse"));
- browse->connect("pressed", this, "_browse_path");
+ browse->connect("pressed", callable_mp(this, &ProjectDialog::_browse_path));
pphb->add_child(browse);
// install status icon
@@ -850,7 +819,7 @@ public:
install_browse = memnew(Button);
install_browse->set_text(TTR("Browse"));
- install_browse->connect("pressed", this, "_browse_install_path");
+ install_browse->connect("pressed", callable_mp(this, &ProjectDialog::_browse_install_path));
iphb->add_child(install_browse);
msg = memnew(Label);
@@ -868,35 +837,50 @@ public:
rasterizer_button_group.instance();
Container *rvb = memnew(VBoxContainer);
- rvb->set_h_size_flags(SIZE_EXPAND_FILL);
+ rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
rshb->add_child(rvb);
Button *rs_button = memnew(CheckBox);
rs_button->set_button_group(rasterizer_button_group);
- rs_button->set_text(TTR("OpenGL ES 3.0"));
- rs_button->set_meta("driver_name", "GLES3");
+ rs_button->set_text(TTR("Vulkan"));
+ rs_button->set_meta("driver_name", "Vulkan");
rs_button->set_pressed(true);
rvb->add_child(rs_button);
l = memnew(Label);
- l->set_text(TTR("Higher visual quality\nAll features available\nIncompatible with older hardware\nNot recommended for web games"));
+ l->set_text(TTR("- Higher visual quality\n- More accurate API, which produces very fast code\n- Some features not implemented yet - work in progress\n- Incompatible with older hardware\n- Not recommended for web and mobile games"));
+ l->set_modulate(Color(1, 1, 1, 0.7));
rvb->add_child(l);
rshb->add_child(memnew(VSeparator));
+ const String gles2_unsupported_tooltip =
+ TTR("The GLES2 renderer is currently unavailable, as it needs to be reworked for Godot 4.0.\nUse Godot 3.2 if you need GLES2 support.");
+
rvb = memnew(VBoxContainer);
- rvb->set_h_size_flags(SIZE_EXPAND_FILL);
+ rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
rshb->add_child(rvb);
rs_button = memnew(CheckBox);
rs_button->set_button_group(rasterizer_button_group);
- rs_button->set_text(TTR("OpenGL ES 2.0"));
+ rs_button->set_text(TTR("OpenGL ES 2.0 (currently unavailable)"));
rs_button->set_meta("driver_name", "GLES2");
+ rs_button->set_disabled(true);
+ rs_button->set_tooltip(gles2_unsupported_tooltip);
rvb->add_child(rs_button);
l = memnew(Label);
- l->set_text(TTR("Lower visual quality\nSome features not available\nWorks on most hardware\nRecommended for web games"));
+ l->set_text(TTR("- Lower visual quality\n- Some features not available\n- Works on most hardware\n- Recommended for web and mobile games"));
+ l->set_modulate(Color(1, 1, 1, 0.7));
+ // Also set the tooltip on the label so it appears when hovering either the checkbox or label.
+ l->set_tooltip(gles2_unsupported_tooltip);
+ // Required for the tooltip to show.
+ l->set_mouse_filter(Control::MOUSE_FILTER_STOP);
rvb->add_child(l);
l = memnew(Label);
- l->set_text(TTR("Renderer can be changed later, but scenes may need to be adjusted."));
+ l->set_text(TTR("The renderer can be changed later, but scenes may need to be adjusted."));
+ // Add some extra spacing to separate it from the list above and the buttons below.
+ l->set_custom_minimum_size(Size2(0, 40) * EDSCALE);
l->set_align(Label::ALIGN_CENTER);
+ l->set_valign(Label::VALIGN_CENTER);
+ l->set_modulate(Color(1, 1, 1, 0.7));
rasterizer_container->add_child(l);
fdialog = memnew(FileDialog);
@@ -905,13 +889,13 @@ public:
fdialog_install->set_access(FileDialog::ACCESS_FILESYSTEM);
add_child(fdialog);
add_child(fdialog_install);
- project_name->connect("text_changed", this, "_text_changed");
- project_path->connect("text_changed", this, "_path_text_changed");
- install_path->connect("text_changed", this, "_path_text_changed");
- fdialog->connect("dir_selected", this, "_path_selected");
- fdialog->connect("file_selected", this, "_file_selected");
- fdialog_install->connect("dir_selected", this, "_install_path_selected");
- fdialog_install->connect("file_selected", this, "_install_path_selected");
+ project_name->connect("text_changed", callable_mp(this, &ProjectDialog::_text_changed));
+ project_path->connect("text_changed", callable_mp(this, &ProjectDialog::_path_text_changed));
+ install_path->connect("text_changed", callable_mp(this, &ProjectDialog::_path_text_changed));
+ fdialog->connect("dir_selected", callable_mp(this, &ProjectDialog::_path_selected));
+ fdialog->connect("file_selected", callable_mp(this, &ProjectDialog::_file_selected));
+ fdialog_install->connect("dir_selected", callable_mp(this, &ProjectDialog::_install_path_selected));
+ fdialog_install->connect("file_selected", callable_mp(this, &ProjectDialog::_install_path_selected));
set_hide_on_ok(false);
mode = MODE_NEW;
@@ -930,10 +914,12 @@ public:
bool hover;
ProjectListItemControl() {
- favorite_button = NULL;
- icon = NULL;
+ favorite_button = nullptr;
+ icon = nullptr;
icon_needs_reload = true;
hover = false;
+
+ set_focus_mode(FocusMode::FOCUS_ALL);
}
void set_is_favorite(bool fav) {
@@ -952,7 +938,7 @@ public:
} break;
case NOTIFICATION_DRAW: {
if (hover) {
- draw_style_box(get_stylebox("hover", "Tree"), Rect2(Point2(), get_size() - Size2(10, 0) * EDSCALE));
+ draw_style_box(get_theme_stylebox("hover", "Tree"), Rect2(Point2(), get_size() - Size2(10, 0) * EDSCALE));
}
} break;
}
@@ -978,7 +964,7 @@ public:
String path;
String icon;
String main_scene;
- uint64_t last_modified;
+ uint64_t last_edited;
bool favorite;
bool grayed;
bool missing;
@@ -994,24 +980,23 @@ public:
const String &p_path,
const String &p_icon,
const String &p_main_scene,
- uint64_t p_last_modified,
+ uint64_t p_last_edited,
bool p_favorite,
bool p_grayed,
bool p_missing,
int p_version) {
-
project_key = p_project;
project_name = p_name;
description = p_description;
path = p_path;
icon = p_icon;
main_scene = p_main_scene;
- last_modified = p_last_modified;
+ last_edited = p_last_edited;
favorite = p_favorite;
grayed = p_grayed;
missing = p_missing;
version = p_version;
- control = NULL;
+ control = nullptr;
}
_FORCE_INLINE_ bool operator==(const Item &l) const {
@@ -1022,13 +1007,17 @@ public:
ProjectList();
~ProjectList();
+ void _global_menu_new_window(const Variant &p_tag);
+ void _global_menu_open_project(const Variant &p_tag);
+
void update_dock_menu();
void load_projects();
void set_search_term(String p_search_term);
- void set_order_option(ProjectListFilter::FilterOption p_option);
+ void set_order_option(int p_option);
void sort_projects();
int get_project_count() const;
void select_project(int p_index);
+ void select_first_visible_project();
void erase_selected_projects();
Vector<Item> get_selected_projects() const;
const Set<String> &get_selected_project_keys() const;
@@ -1057,7 +1046,7 @@ private:
static void load_project_data(const String &p_property_key, Item &p_item, bool p_favorite);
String _search_term;
- ProjectListFilter::FilterOption _order_option;
+ FilterOption _order_option;
Set<String> _selected_project_keys;
String _last_clicked; // Project key
VBoxContainer *_scroll_children;
@@ -1067,7 +1056,7 @@ private:
};
struct ProjectListComparator {
- ProjectListFilter::FilterOption order_option;
+ FilterOption order_option;
// operator<
_FORCE_INLINE_ bool operator()(const ProjectList::Item &a, const ProjectList::Item &b) const {
@@ -1078,10 +1067,10 @@ struct ProjectListComparator {
return false;
}
switch (order_option) {
- case ProjectListFilter::FILTER_PATH:
+ case PATH:
return a.project_key < b.project_key;
- case ProjectListFilter::FILTER_MODIFIED:
- return a.last_modified > b.last_modified;
+ case EDIT_DATE:
+ return a.last_edited > b.last_edited;
default:
return a.project_name < b.project_name;
}
@@ -1089,10 +1078,9 @@ struct ProjectListComparator {
};
ProjectList::ProjectList() {
- _order_option = ProjectListFilter::FILTER_MODIFIED;
-
+ _order_option = FilterOption::NAME;
_scroll_children = memnew(VBoxContainer);
- _scroll_children->set_h_size_flags(SIZE_EXPAND_FILL);
+ _scroll_children->set_h_size_flags(Control::SIZE_EXPAND_FILL);
add_child(_scroll_children);
_icon_load_index = 0;
@@ -1108,7 +1096,6 @@ void ProjectList::update_icons_async() {
void ProjectList::_notification(int p_what) {
if (p_what == NOTIFICATION_PROCESS) {
-
// Load icons as a coroutine to speed up launch when you have hundreds of projects
if (_icon_load_index < _projects.size()) {
Item &item = _projects.write[_icon_load_index];
@@ -1126,14 +1113,13 @@ void ProjectList::_notification(int p_what) {
void ProjectList::load_project_icon(int p_index) {
Item &item = _projects.write[p_index];
- Ref<Texture> default_icon = get_icon("DefaultProjectIcon", "EditorIcons");
- Ref<Texture> icon;
+ Ref<Texture2D> default_icon = get_theme_icon("DefaultProjectIcon", "EditorIcons");
+ Ref<Texture2D> icon;
if (item.icon != "") {
Ref<Image> img;
img.instance();
Error err = img->load(item.icon.replace_first("res://", item.path + "/"));
if (err == OK) {
-
img->resize(default_icon->get_width(), default_icon->get_height(), Image::INTERPOLATE_LANCZOS);
Ref<ImageTexture> it = memnew(ImageTexture);
it->create_from_image(img);
@@ -1149,7 +1135,6 @@ void ProjectList::load_project_icon(int p_index) {
}
void ProjectList::load_project_data(const String &p_property_key, Item &p_item, bool p_favorite) {
-
String path = EditorSettings::get_singleton()->get(p_property_key);
String conf = path.plus_file("project.godot");
bool grayed = false;
@@ -1162,8 +1147,9 @@ void ProjectList::load_project_data(const String &p_property_key, Item &p_item,
String project_name = TTR("Unnamed Project");
if (cf_err == OK) {
String cf_project_name = static_cast<String>(cf->get_value("application", "config/name", ""));
- if (cf_project_name != "")
+ if (cf_project_name != "") {
project_name = cf_project_name.xml_unescape();
+ }
config_version = (int)cf->get_value("", "config_version", 0);
}
@@ -1176,15 +1162,19 @@ void ProjectList::load_project_data(const String &p_property_key, Item &p_item,
String icon = cf->get_value("application", "config/icon", "");
String main_scene = cf->get_value("application", "run/main_scene", "");
- uint64_t last_modified = 0;
+ uint64_t last_edited = 0;
if (FileAccess::exists(conf)) {
- last_modified = FileAccess::get_modified_time(conf);
+ // The modification date marks the date the project was last edited.
+ // This is because the `project.godot` file will always be modified
+ // when editing a project (but not when running it).
+ last_edited = FileAccess::get_modified_time(conf);
String fscache = path.plus_file(".fscache");
if (FileAccess::exists(fscache)) {
uint64_t cache_modified = FileAccess::get_modified_time(fscache);
- if (cache_modified > last_modified)
- last_modified = cache_modified;
+ if (cache_modified > last_edited) {
+ last_edited = cache_modified;
+ }
}
} else {
grayed = true;
@@ -1194,7 +1184,7 @@ void ProjectList::load_project_data(const String &p_property_key, Item &p_item,
String project_key = p_property_key.get_slice("/", 1);
- p_item = Item(project_key, project_name, description, path, icon, main_scene, last_modified, p_favorite, grayed, missing, config_version);
+ p_item = Item(project_key, project_name, description, path, icon, main_scene, last_edited, p_favorite, grayed, missing, config_version);
}
void ProjectList::load_projects() {
@@ -1204,7 +1194,7 @@ void ProjectList::load_projects() {
// Clear whole list
for (int i = 0; i < _projects.size(); ++i) {
Item &project = _projects.write[i];
- CRASH_COND(project.control == NULL);
+ CRASH_COND(project.control == nullptr);
memdelete(project.control); // Why not queue_free()?
}
_projects.clear();
@@ -1230,8 +1220,9 @@ void ProjectList::load_projects() {
for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
// This is actually something like "projects/C:::Documents::Godot::Projects::MyGame"
String property_key = E->get().name;
- if (!property_key.begins_with("projects/"))
+ if (!property_key.begins_with("projects/")) {
continue;
+ }
String project_key = property_key.get_slice("/", 1);
bool favorite = favorites.has("favorite_projects/" + project_key);
@@ -1247,8 +1238,6 @@ void ProjectList::load_projects() {
create_project_item_control(i);
}
- sort_projects();
-
set_v_scroll(0);
update_icons_async();
@@ -1257,7 +1246,10 @@ void ProjectList::load_projects() {
}
void ProjectList::update_dock_menu() {
- OS::get_singleton()->global_menu_clear("_dock");
+ if (!DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) {
+ return;
+ }
+ DisplayServer::get_singleton()->global_menu_clear("_dock");
int favs_added = 0;
int total_added = 0;
@@ -1267,35 +1259,57 @@ void ProjectList::update_dock_menu() {
favs_added++;
} else {
if (favs_added != 0) {
- OS::get_singleton()->global_menu_add_separator("_dock");
+ DisplayServer::get_singleton()->global_menu_add_separator("_dock");
}
favs_added = 0;
}
- OS::get_singleton()->global_menu_add_item("_dock", _projects[i].project_name + " ( " + _projects[i].path + " )", GLOBAL_OPEN_PROJECT, Variant(_projects[i].path.plus_file("project.godot")));
+ DisplayServer::get_singleton()->global_menu_add_item("_dock", _projects[i].project_name + " ( " + _projects[i].path + " )", callable_mp(this, &ProjectList::_global_menu_open_project), i);
total_added++;
}
}
if (total_added != 0) {
- OS::get_singleton()->global_menu_add_separator("_dock");
+ DisplayServer::get_singleton()->global_menu_add_separator("_dock");
}
- OS::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), GLOBAL_NEW_WINDOW, Variant());
+ DisplayServer::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), callable_mp(this, &ProjectList::_global_menu_new_window));
}
-void ProjectList::create_project_item_control(int p_index) {
+void ProjectList::_global_menu_new_window(const Variant &p_tag) {
+ List<String> args;
+ args.push_back("-p");
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid = 0;
+ OS::get_singleton()->execute(exec, args, false, &pid);
+}
+
+void ProjectList::_global_menu_open_project(const Variant &p_tag) {
+ int idx = (int)p_tag;
+
+ if (idx >= 0 && idx < _projects.size()) {
+ String conf = _projects[idx].path.plus_file("project.godot");
+ List<String> args;
+ args.push_back(conf);
+ String exec = OS::get_singleton()->get_executable_path();
+
+ OS::ProcessID pid = 0;
+ OS::get_singleton()->execute(exec, args, false, &pid);
+ }
+}
+void ProjectList::create_project_item_control(int p_index) {
// Will be added last in the list, so make sure indexes match
ERR_FAIL_COND(p_index != _scroll_children->get_child_count());
Item &item = _projects.write[p_index];
- ERR_FAIL_COND(item.control != NULL); // Already created
+ ERR_FAIL_COND(item.control != nullptr); // Already created
- Ref<Texture> favorite_icon = get_icon("Favorites", "EditorIcons");
- Color font_color = get_color("font_color", "Tree");
+ Ref<Texture2D> favorite_icon = get_theme_icon("Favorites", "EditorIcons");
+ Color font_color = get_theme_color("font_color", "Tree");
ProjectListItemControl *hb = memnew(ProjectListItemControl);
- hb->connect("draw", this, "_panel_draw", varray(hb));
- hb->connect("gui_input", this, "_panel_input", varray(hb));
- hb->add_constant_override("separation", 10 * EDSCALE);
+ hb->connect("draw", callable_mp(this, &ProjectList::_panel_draw), varray(hb));
+ hb->connect("gui_input", callable_mp(this, &ProjectList::_panel_input), varray(hb));
+ hb->add_theme_constant_override("separation", 10 * EDSCALE);
hb->set_tooltip(item.description);
VBoxContainer *favorite_box = memnew(VBoxContainer);
@@ -1305,7 +1319,7 @@ void ProjectList::create_project_item_control(int p_index) {
favorite->set_normal_texture(favorite_icon);
// This makes the project's "hover" style display correctly when hovering the favorite icon
favorite->set_mouse_filter(MOUSE_FILTER_PASS);
- favorite->connect("pressed", this, "_favorite_pressed", varray(hb));
+ favorite->connect("pressed", callable_mp(this, &ProjectList::_favorite_pressed), varray(hb));
favorite_box->add_child(favorite);
favorite_box->set_alignment(BoxContainer::ALIGN_CENTER);
hb->add_child(favorite_box);
@@ -1315,7 +1329,8 @@ void ProjectList::create_project_item_control(int p_index) {
TextureRect *tf = memnew(TextureRect);
// The project icon may not be loaded by the time the control is displayed,
// so use a loading placeholder.
- tf->set_texture(get_icon("ProjectIconLoading", "EditorIcons"));
+ tf->set_texture(get_theme_icon("ProjectIconLoading", "EditorIcons"));
+ tf->set_v_size_flags(SIZE_SHRINK_CENTER);
if (item.missing) {
tf->set_modulate(Color(1, 1, 1, 0.5));
}
@@ -1323,27 +1338,28 @@ void ProjectList::create_project_item_control(int p_index) {
hb->icon = tf;
VBoxContainer *vb = memnew(VBoxContainer);
- if (item.grayed)
+ if (item.grayed) {
vb->set_modulate(Color(1, 1, 1, 0.5));
- vb->set_h_size_flags(SIZE_EXPAND_FILL);
+ }
+ vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hb->add_child(vb);
Control *ec = memnew(Control);
ec->set_custom_minimum_size(Size2(0, 1));
ec->set_mouse_filter(MOUSE_FILTER_PASS);
vb->add_child(ec);
Label *title = memnew(Label(!item.missing ? item.project_name : TTR("Missing Project")));
- title->add_font_override("font", get_font("title", "EditorFonts"));
- title->add_color_override("font_color", font_color);
+ title->add_theme_font_override("font", get_theme_font("title", "EditorFonts"));
+ title->add_theme_color_override("font_color", font_color);
title->set_clip_text(true);
vb->add_child(title);
HBoxContainer *path_hb = memnew(HBoxContainer);
- path_hb->set_h_size_flags(SIZE_EXPAND_FILL);
+ path_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
vb->add_child(path_hb);
Button *show = memnew(Button);
// Display a folder icon if the project directory can be opened, or a "broken file" icon if it can't
- show->set_icon(get_icon(!item.missing ? "Load" : "FileBroken", "EditorIcons"));
+ show->set_icon(get_theme_icon(!item.missing ? "Load" : "FileBroken", "EditorIcons"));
show->set_flat(true);
if (!item.grayed) {
// Don't make the icon less prominent if the parent is already grayed out
@@ -1352,7 +1368,7 @@ void ProjectList::create_project_item_control(int p_index) {
path_hb->add_child(show);
if (!item.missing) {
- show->connect("pressed", this, "_show_project", varray(item.path));
+ show->connect("pressed", callable_mp(this, &ProjectList::_show_project), varray(item.path));
show->set_tooltip(TTR("Show in File Manager"));
} else {
show->set_tooltip(TTR("Error: Project is missing on the filesystem."));
@@ -1360,9 +1376,9 @@ void ProjectList::create_project_item_control(int p_index) {
Label *fpath = memnew(Label(item.path));
path_hb->add_child(fpath);
- fpath->set_h_size_flags(SIZE_EXPAND_FILL);
+ fpath->set_h_size_flags(Control::SIZE_EXPAND_FILL);
fpath->set_modulate(Color(1, 1, 1, 0.5));
- fpath->add_color_override("font_color", font_color);
+ fpath->add_theme_color_override("font_color", font_color);
fpath->set_clip_text(true);
_scroll_children->add_child(hb);
@@ -1373,16 +1389,16 @@ void ProjectList::set_search_term(String p_search_term) {
_search_term = p_search_term;
}
-void ProjectList::set_order_option(ProjectListFilter::FilterOption p_option) {
- if (_order_option != p_option) {
- _order_option = p_option;
- EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)_order_option);
- EditorSettings::get_singleton()->save();
- }
+void ProjectList::set_order_option(int p_option) {
+ FilterOption selected = (FilterOption)p_option;
+ EditorSettings::get_singleton()->set("project_manager/sorting_order", p_option);
+ EditorSettings::get_singleton()->save();
+ _order_option = selected;
+
+ sort_projects();
}
void ProjectList::sort_projects() {
-
SortArray<Item, ProjectListComparator> sorter;
sorter.compare.order_option = _order_option;
sorter.sort(_projects.ptrw(), _projects.size());
@@ -1392,7 +1408,6 @@ void ProjectList::sort_projects() {
bool visible = true;
if (_search_term != "") {
-
String search_path;
if (_search_term.find("/") != -1) {
// Search path will match the whole path
@@ -1508,7 +1523,6 @@ bool ProjectList::is_any_project_missing() const {
}
void ProjectList::erase_missing_projects() {
-
if (_projects.empty()) {
return;
}
@@ -1609,7 +1623,6 @@ int ProjectList::get_project_count() const {
}
void ProjectList::select_project(int p_index) {
-
Vector<Item> previous_selected_items = get_selected_projects();
_selected_project_keys.clear();
@@ -1620,6 +1633,23 @@ void ProjectList::select_project(int p_index) {
toggle_select(p_index);
}
+void ProjectList::select_first_visible_project() {
+ bool found = false;
+
+ for (int i = 0; i < _projects.size(); i++) {
+ if (_projects[i].control->is_visible()) {
+ select_project(i);
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ // Deselect all projects if there are no visible projects in the list.
+ _selected_project_keys.clear();
+ }
+}
+
inline void sort(int &a, int &b) {
if (a > b) {
int temp = a;
@@ -1647,7 +1677,6 @@ void ProjectList::toggle_select(int p_index) {
}
void ProjectList::erase_selected_projects() {
-
if (_selected_project_keys.size() == 0) {
return;
}
@@ -1655,7 +1684,6 @@ void ProjectList::erase_selected_projects() {
for (int i = 0; i < _projects.size(); ++i) {
Item &item = _projects.write[i];
if (_selected_project_keys.has(item.project_key) && item.control->is_visible()) {
-
EditorSettings::get_singleton()->erase("projects/" + item.project_key);
EditorSettings::get_singleton()->erase("favorite_projects/" + item.project_key);
@@ -1677,26 +1705,23 @@ void ProjectList::erase_selected_projects() {
void ProjectList::_panel_draw(Node *p_hb) {
Control *hb = Object::cast_to<Control>(p_hb);
- hb->draw_line(Point2(0, hb->get_size().y + 1), Point2(hb->get_size().x - 10, hb->get_size().y + 1), get_color("guide_color", "Tree"));
+ hb->draw_line(Point2(0, hb->get_size().y + 1), Point2(hb->get_size().x - 10, hb->get_size().y + 1), get_theme_color("guide_color", "Tree"));
String key = _projects[p_hb->get_index()].project_key;
if (_selected_project_keys.has(key)) {
- hb->draw_style_box(get_stylebox("selected", "Tree"), Rect2(Point2(), hb->get_size() - Size2(10, 0) * EDSCALE));
+ hb->draw_style_box(get_theme_stylebox("selected", "Tree"), Rect2(Point2(), hb->get_size() - Size2(10, 0) * EDSCALE));
}
}
// Input for each item in the list
void ProjectList::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) {
-
Ref<InputEventMouseButton> mb = p_ev;
int clicked_index = p_hb->get_index();
const Item &clicked_project = _projects[clicked_index];
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-
if (mb->get_shift() && _selected_project_keys.size() > 0 && _last_clicked != "" && clicked_project.project_key != _last_clicked) {
-
int anchor_index = -1;
for (int i = 0; i < _projects.size(); ++i) {
const Item &p = _projects[i];
@@ -1725,7 +1750,6 @@ void ProjectList::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) {
}
void ProjectList::_favorite_pressed(Node *p_hb) {
-
ProjectListItemControl *control = Object::cast_to<ProjectListItemControl>(p_hb);
int index = control->get_index();
@@ -1759,7 +1783,6 @@ void ProjectList::_favorite_pressed(Node *p_hb) {
}
void ProjectList::_show_project(const String &p_path) {
-
OS::get_singleton()->shell_open(String("file://") + p_path);
}
@@ -1767,53 +1790,48 @@ const char *ProjectList::SIGNAL_SELECTION_CHANGED = "selection_changed";
const char *ProjectList::SIGNAL_PROJECT_ASK_OPEN = "project_ask_open";
void ProjectList::_bind_methods() {
-
- ClassDB::bind_method("_panel_draw", &ProjectList::_panel_draw);
- ClassDB::bind_method("_panel_input", &ProjectList::_panel_input);
- ClassDB::bind_method("_favorite_pressed", &ProjectList::_favorite_pressed);
- ClassDB::bind_method("_show_project", &ProjectList::_show_project);
-
ADD_SIGNAL(MethodInfo(SIGNAL_SELECTION_CHANGED));
ADD_SIGNAL(MethodInfo(SIGNAL_PROJECT_ASK_OPEN));
}
void ProjectManager::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
+ search_box->set_right_icon(get_theme_icon("Search", "EditorIcons"));
+ search_box->set_clear_button_enabled(true);
Engine::get_singleton()->set_editor_hint(false);
} break;
case NOTIFICATION_RESIZED: {
-
if (open_templates->is_visible()) {
- open_templates->popup_centered_minsize();
+ open_templates->popup_centered();
}
} break;
case NOTIFICATION_READY: {
+ int default_sorting = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order");
+ filter_option->select(default_sorting);
+ _project_list->set_order_option(default_sorting);
- if (_project_list->get_project_count() == 0 && StreamPeerSSL::is_available())
- open_templates->popup_centered_minsize();
+ if (_project_list->get_project_count() == 0 && StreamPeerSSL::is_available()) {
+ open_templates->popup_centered();
+ }
if (_project_list->get_project_count() >= 1) {
// Focus on the search box immediately to allow the user
// to search without having to reach for their mouse
- project_filter->search_box->grab_focus();
+ search_box->grab_focus();
}
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
-
set_process_unhandled_input(is_visible_in_tree());
} break;
- case NOTIFICATION_WM_QUIT_REQUEST: {
-
+ case NOTIFICATION_WM_CLOSE_REQUEST: {
_dim_window();
} break;
}
}
void ProjectManager::_dim_window() {
-
// This method must be called before calling `get_tree()->quit()`.
// Otherwise, its effect won't be visible
@@ -1821,11 +1839,10 @@ void ProjectManager::_dim_window() {
// No transition is applied, as the effect needs to be visible immediately
float c = 0.5f;
Color dim_color = Color(c, c, c);
- gui_base->set_modulate(dim_color);
+ set_modulate(dim_color);
}
void ProjectManager::_update_project_buttons() {
-
Vector<ProjectList::Item> selected_projects = _project_list->get_selected_projects();
bool empty_selection = selected_projects.empty();
@@ -1842,15 +1859,13 @@ void ProjectManager::_update_project_buttons() {
rename_btn->set_disabled(empty_selection || is_missing_project_selected);
run_btn->set_disabled(empty_selection || is_missing_project_selected);
- erase_missing_btn->set_visible(_project_list->is_any_project_missing());
+ erase_missing_btn->set_disabled(!_project_list->is_any_project_missing());
}
void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
-
Ref<InputEventKey> k = p_ev;
if (k.is_valid()) {
-
if (!k->is_pressed()) {
return;
}
@@ -1859,29 +1874,26 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
// This is handled by the platform implementation on macOS,
// so only define the shortcut on other platforms
#ifndef OSX_ENABLED
- if (k->get_scancode_with_modifiers() == (KEY_MASK_CMD | KEY_Q)) {
+ if (k->get_keycode_with_modifiers() == (KEY_MASK_CMD | KEY_Q)) {
_dim_window();
get_tree()->quit();
}
#endif
- if (tabs->get_current_tab() != 0)
+ if (tabs->get_current_tab() != 0) {
return;
+ }
- bool scancode_handled = true;
-
- switch (k->get_scancode()) {
+ bool keycode_handled = true;
+ switch (k->get_keycode()) {
case KEY_ENTER: {
-
_open_selected_projects_ask();
} break;
case KEY_DELETE: {
-
_erase_project();
} break;
case KEY_HOME: {
-
if (_project_list->get_project_count() > 0) {
_project_list->select_project(0);
_update_project_buttons();
@@ -1889,7 +1901,6 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
} break;
case KEY_END: {
-
if (_project_list->get_project_count() > 0) {
_project_list->select_project(_project_list->get_project_count() - 1);
_update_project_buttons();
@@ -1897,9 +1908,9 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
} break;
case KEY_UP: {
-
- if (k->get_shift())
+ if (k->get_shift()) {
break;
+ }
int index = _project_list->get_single_selected_index();
if (index > 0) {
@@ -1911,9 +1922,9 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
break;
}
case KEY_DOWN: {
-
- if (k->get_shift())
+ if (k->get_shift()) {
break;
+ }
int index = _project_list->get_single_selected_index();
if (index + 1 < _project_list->get_project_count()) {
@@ -1924,26 +1935,25 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
} break;
case KEY_F: {
- if (k->get_command())
- this->project_filter->search_box->grab_focus();
- else
- scancode_handled = false;
+ if (k->get_command()) {
+ this->search_box->grab_focus();
+ } else {
+ keycode_handled = false;
+ }
} break;
default: {
- scancode_handled = false;
+ keycode_handled = false;
} break;
}
- if (scancode_handled) {
+ if (keycode_handled) {
accept_event();
}
}
}
void ProjectManager::_load_recent_projects() {
-
- _project_list->set_order_option(project_order_filter->get_filter_option());
- _project_list->set_search_term(project_filter->get_search_term());
+ _project_list->set_search_term(search_box->get_text().strip_edges());
_project_list->load_projects();
_update_project_buttons();
@@ -1965,7 +1975,7 @@ void ProjectManager::_on_projects_updated() {
}
void ProjectManager::_on_project_created(const String &dir) {
- project_filter->clear();
+ search_box->clear();
int i = _project_list->refresh_project(dir);
_project_list->select_project(i);
_project_list->ensure_project_visible(i);
@@ -1978,32 +1988,7 @@ void ProjectManager::_confirm_update_settings() {
_open_selected_projects();
}
-void ProjectManager::_global_menu_action(const Variant &p_id, const Variant &p_meta) {
-
- int id = (int)p_id;
- if (id == ProjectList::GLOBAL_NEW_WINDOW) {
- List<String> args;
- args.push_back("-p");
- String exec = OS::get_singleton()->get_executable_path();
-
- OS::ProcessID pid = 0;
- OS::get_singleton()->execute(exec, args, false, &pid);
- } else if (id == ProjectList::GLOBAL_OPEN_PROJECT) {
- String conf = (String)p_meta;
-
- if (conf != String()) {
- List<String> args;
- args.push_back(conf);
- String exec = OS::get_singleton()->get_executable_path();
-
- OS::ProcessID pid = 0;
- OS::get_singleton()->execute(exec, args, false, &pid);
- }
- }
-}
-
void ProjectManager::_open_selected_projects() {
-
const Set<String> &selected_list = _project_list->get_selected_project_keys();
for (const Set<String>::Element *E = selected_list.front(); E; E = E->next()) {
@@ -2013,7 +1998,7 @@ void ProjectManager::_open_selected_projects() {
if (!FileAccess::exists(conf)) {
dialog_error->set_text(vformat(TTR("Can't open project at '%s'."), path));
- dialog_error->popup_centered_minsize();
+ dialog_error->popup_centered();
return;
}
@@ -2026,6 +2011,14 @@ void ProjectManager::_open_selected_projects() {
args.push_back("--editor");
+ if (OS::get_singleton()->is_stdout_debug_enabled()) {
+ args.push_back("--debug");
+ }
+
+ if (OS::get_singleton()->is_stdout_verbose()) {
+ args.push_back("--verbose");
+ }
+
if (OS::get_singleton()->is_disable_crash_handler()) {
args.push_back("--disable-crash-handler");
}
@@ -2042,7 +2035,6 @@ void ProjectManager::_open_selected_projects() {
}
void ProjectManager::_open_selected_projects_ask() {
-
const Set<String> &selected_list = _project_list->get_selected_project_keys();
if (selected_list.size() < 1) {
@@ -2051,7 +2043,7 @@ void ProjectManager::_open_selected_projects_ask() {
if (selected_list.size() > 1) {
multi_open_ask->set_text(TTR("Are you sure to open more than one project?"));
- multi_open_ask->popup_centered_minsize();
+ multi_open_ask->popup_centered();
return;
}
@@ -2067,19 +2059,19 @@ void ProjectManager::_open_selected_projects_ask() {
// Check if the config_version property was empty or 0
if (config_version == 0) {
ask_update_settings->set_text(vformat(TTR("The following project settings file does not specify the version of Godot through which it was created.\n\n%s\n\nIf you proceed with opening it, it will be converted to Godot's current configuration file format.\nWarning: You won't be able to open the project with previous versions of the engine anymore."), conf));
- ask_update_settings->popup_centered_minsize();
+ ask_update_settings->popup_centered();
return;
}
// Check if we need to convert project settings from an earlier engine version
if (config_version < ProjectSettings::CONFIG_VERSION) {
ask_update_settings->set_text(vformat(TTR("The following project settings file was generated by an older engine version, and needs to be converted for this version:\n\n%s\n\nDo you want to convert it?\nWarning: You won't be able to open the project with previous versions of the engine anymore."), conf));
- ask_update_settings->popup_centered_minsize();
+ ask_update_settings->popup_centered();
return;
}
// Check if the file was generated by a newer, incompatible engine version
if (config_version > ProjectSettings::CONFIG_VERSION) {
dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), project.path));
- dialog_error->popup_centered_minsize();
+ dialog_error->popup_centered();
return;
}
@@ -2088,11 +2080,9 @@ void ProjectManager::_open_selected_projects_ask() {
}
void ProjectManager::_run_project_confirm() {
-
Vector<ProjectList::Item> selected_list = _project_list->get_selected_projects();
for (int i = 0; i < selected_list.size(); ++i) {
-
const String &selected_main = selected_list[i].main_scene;
if (selected_main == "") {
run_error_diag->set_text(TTR("Can't run project: no main scene defined.\nPlease edit the project and set the main scene in the Project Settings under the \"Application\" category."));
@@ -2128,9 +2118,7 @@ void ProjectManager::_run_project_confirm() {
}
}
-// When you press the "Run" button
void ProjectManager::_run_project() {
-
const Set<String> &selected_list = _project_list->get_selected_project_keys();
if (selected_list.size() < 1) {
@@ -2139,7 +2127,7 @@ void ProjectManager::_run_project() {
if (selected_list.size() > 1) {
multi_run_ask->set_text(vformat(TTR("Are you sure to run %d projects at once?"), selected_list.size()));
- multi_run_ask->popup_centered_minsize();
+ multi_run_ask->popup_centered();
} else {
_run_project_confirm();
}
@@ -2163,7 +2151,6 @@ void ProjectManager::_scan_dir(const String &path, List<String> *r_projects) {
}
void ProjectManager::_scan_begin(const String &p_base) {
-
print_line("Scanning projects at: " + p_base);
List<String> projects;
_scan_dir(p_base, &projects);
@@ -2178,24 +2165,20 @@ void ProjectManager::_scan_begin(const String &p_base) {
}
void ProjectManager::_scan_projects() {
-
- scan_dir->popup_centered_ratio();
+ scan_dir->popup_file_dialog();
}
void ProjectManager::_new_project() {
-
npdialog->set_mode(ProjectDialog::MODE_NEW);
npdialog->show_dialog();
}
void ProjectManager::_import_project() {
-
npdialog->set_mode(ProjectDialog::MODE_IMPORT);
npdialog->show_dialog();
}
void ProjectManager::_rename_project() {
-
const Set<String> &selected_list = _project_list->get_selected_project_keys();
if (selected_list.size() == 0) {
@@ -2222,11 +2205,11 @@ void ProjectManager::_erase_missing_projects_confirm() {
}
void ProjectManager::_erase_project() {
-
const Set<String> &selected_list = _project_list->get_selected_project_keys();
- if (selected_list.size() == 0)
+ if (selected_list.size() == 0) {
return;
+ }
String confirm_message;
if (selected_list.size() >= 2) {
@@ -2236,28 +2219,23 @@ void ProjectManager::_erase_project() {
}
erase_ask->set_text(confirm_message);
- erase_ask->popup_centered_minsize();
+ erase_ask->popup_centered();
}
void ProjectManager::_erase_missing_projects() {
-
erase_missing_ask->set_text(TTR("Remove all missing projects from the list?\nThe project folders' contents won't be modified."));
- erase_missing_ask->popup_centered_minsize();
+ erase_missing_ask->popup_centered();
}
void ProjectManager::_language_selected(int p_id) {
-
String lang = language_btn->get_item_metadata(p_id);
EditorSettings::get_singleton()->set("interface/editor/editor_language", lang);
- language_btn->set_text(lang);
- language_btn->set_icon(get_icon("Environment", "EditorIcons"));
language_restart_ask->set_text(TTR("Language changed.\nThe interface will update after restarting the editor or project manager."));
language_restart_ask->popup_centered();
}
void ProjectManager::_restart_confirm() {
-
List<String> args = OS::get_singleton()->get_cmdline_args();
String exec = OS::get_singleton()->get_executable_path();
OS::ProcessID pid = 0;
@@ -2269,20 +2247,18 @@ void ProjectManager::_restart_confirm() {
}
void ProjectManager::_exit_dialog() {
-
_dim_window();
get_tree()->quit();
}
void ProjectManager::_install_project(const String &p_zip_path, const String &p_title) {
-
npdialog->set_mode(ProjectDialog::MODE_INSTALL);
npdialog->set_zip_path(p_zip_path);
npdialog->set_zip_title(p_title);
npdialog->show_dialog();
}
-void ProjectManager::_files_dropped(PoolStringArray p_files, int p_screen) {
+void ProjectManager::_files_dropped(PackedStringArray p_files, int p_screen) {
Set<String> folders_set;
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
for (int i = 0; i < p_files.size(); i++) {
@@ -2291,9 +2267,9 @@ void ProjectManager::_files_dropped(PoolStringArray p_files, int p_screen) {
}
memdelete(da);
if (folders_set.size() > 0) {
- PoolStringArray folders;
+ PackedStringArray folders;
for (Set<String>::Element *E = folders_set.front(); E; E = E->next()) {
- folders.append(E->get());
+ folders.push_back(E->get());
}
bool confirm = true;
@@ -2313,63 +2289,44 @@ void ProjectManager::_files_dropped(PoolStringArray p_files, int p_screen) {
memdelete(dir);
}
if (confirm) {
- multi_scan_ask->get_ok()->disconnect("pressed", this, "_scan_multiple_folders");
- multi_scan_ask->get_ok()->connect("pressed", this, "_scan_multiple_folders", varray(folders));
+ multi_scan_ask->get_ok()->disconnect("pressed", callable_mp(this, &ProjectManager::_scan_multiple_folders));
+ multi_scan_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_scan_multiple_folders), varray(folders));
multi_scan_ask->set_text(
vformat(TTR("Are you sure to scan %s folders for existing Godot projects?\nThis could take a while."), folders.size()));
- multi_scan_ask->popup_centered_minsize();
+ multi_scan_ask->popup_centered();
} else {
_scan_multiple_folders(folders);
}
}
}
-void ProjectManager::_scan_multiple_folders(PoolStringArray p_files) {
+void ProjectManager::_scan_multiple_folders(PackedStringArray p_files) {
for (int i = 0; i < p_files.size(); i++) {
_scan_begin(p_files.get(i));
}
}
-void ProjectManager::_on_order_option_changed() {
- _project_list->set_order_option(project_order_filter->get_filter_option());
- _project_list->sort_projects();
+void ProjectManager::_on_order_option_changed(int p_idx) {
+ if (is_inside_tree()) {
+ _project_list->set_order_option(p_idx);
+ }
}
-void ProjectManager::_on_filter_option_changed() {
- _project_list->set_search_term(project_filter->get_search_term());
+void ProjectManager::_on_search_term_changed(const String &p_term) {
+ _project_list->set_search_term(p_term);
_project_list->sort_projects();
+
+ // Select the first visible project in the list.
+ // This makes it possible to open a project without ever touching the mouse,
+ // as the search field is automatically focused on startup.
+ _project_list->select_first_visible_project();
+ _update_project_buttons();
}
void ProjectManager::_bind_methods() {
-
- ClassDB::bind_method("_open_selected_projects_ask", &ProjectManager::_open_selected_projects_ask);
- ClassDB::bind_method("_open_selected_projects", &ProjectManager::_open_selected_projects);
- ClassDB::bind_method(D_METHOD("_global_menu_action"), &ProjectManager::_global_menu_action, DEFVAL(Variant()));
- ClassDB::bind_method("_run_project", &ProjectManager::_run_project);
- ClassDB::bind_method("_run_project_confirm", &ProjectManager::_run_project_confirm);
- ClassDB::bind_method("_scan_projects", &ProjectManager::_scan_projects);
- ClassDB::bind_method("_scan_begin", &ProjectManager::_scan_begin);
- ClassDB::bind_method("_import_project", &ProjectManager::_import_project);
- ClassDB::bind_method("_new_project", &ProjectManager::_new_project);
- ClassDB::bind_method("_rename_project", &ProjectManager::_rename_project);
- ClassDB::bind_method("_erase_project", &ProjectManager::_erase_project);
- ClassDB::bind_method("_erase_missing_projects", &ProjectManager::_erase_missing_projects);
- ClassDB::bind_method("_erase_project_confirm", &ProjectManager::_erase_project_confirm);
- ClassDB::bind_method("_erase_missing_projects_confirm", &ProjectManager::_erase_missing_projects_confirm);
- ClassDB::bind_method("_language_selected", &ProjectManager::_language_selected);
- ClassDB::bind_method("_restart_confirm", &ProjectManager::_restart_confirm);
ClassDB::bind_method("_exit_dialog", &ProjectManager::_exit_dialog);
- ClassDB::bind_method("_on_order_option_changed", &ProjectManager::_on_order_option_changed);
- ClassDB::bind_method("_on_filter_option_changed", &ProjectManager::_on_filter_option_changed);
- ClassDB::bind_method("_on_projects_updated", &ProjectManager::_on_projects_updated);
- ClassDB::bind_method("_on_project_created", &ProjectManager::_on_project_created);
ClassDB::bind_method("_unhandled_input", &ProjectManager::_unhandled_input);
- ClassDB::bind_method("_install_project", &ProjectManager::_install_project);
- ClassDB::bind_method("_files_dropped", &ProjectManager::_files_dropped);
- ClassDB::bind_method("_open_asset_library", &ProjectManager::_open_asset_library);
- ClassDB::bind_method("_confirm_update_settings", &ProjectManager::_confirm_update_settings);
ClassDB::bind_method("_update_project_buttons", &ProjectManager::_update_project_buttons);
- ClassDB::bind_method(D_METHOD("_scan_multiple_folders", "files"), &ProjectManager::_scan_multiple_folders);
}
void ProjectManager::_open_asset_library() {
@@ -2378,70 +2335,80 @@ void ProjectManager::_open_asset_library() {
}
ProjectManager::ProjectManager() {
-
// load settings
- if (!EditorSettings::get_singleton())
+ if (!EditorSettings::get_singleton()) {
EditorSettings::create();
+ }
EditorSettings::get_singleton()->set_optimize_save(false); //just write settings as they came
{
int display_scale = EditorSettings::get_singleton()->get("interface/editor/display_scale");
- float custom_display_scale = EditorSettings::get_singleton()->get("interface/editor/custom_display_scale");
switch (display_scale) {
case 0: {
// Try applying a suitable display scale automatically
- const int screen = OS::get_singleton()->get_current_screen();
- editor_set_scale(OS::get_singleton()->get_screen_dpi(screen) >= 192 && OS::get_singleton()->get_screen_size(screen).x > 2000 ? 2.0 : 1.0);
+#ifdef OSX_ENABLED
+ editor_set_scale(DisplayServer::get_singleton()->screen_get_max_scale());
+#else
+ const int screen = DisplayServer::get_singleton()->window_get_current_screen();
+ editor_set_scale(DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && DisplayServer::get_singleton()->screen_get_size(screen).x > 2000 ? 2.0 : 1.0);
+#endif
} break;
- case 1: editor_set_scale(0.75); break;
- case 2: editor_set_scale(1.0); break;
- case 3: editor_set_scale(1.25); break;
- case 4: editor_set_scale(1.5); break;
- case 5: editor_set_scale(1.75); break;
- case 6: editor_set_scale(2.0); break;
-
+ case 1:
+ editor_set_scale(0.75);
+ break;
+ case 2:
+ editor_set_scale(1.0);
+ break;
+ case 3:
+ editor_set_scale(1.25);
+ break;
+ case 4:
+ editor_set_scale(1.5);
+ break;
+ case 5:
+ editor_set_scale(1.75);
+ break;
+ case 6:
+ editor_set_scale(2.0);
+ break;
default: {
- editor_set_scale(custom_display_scale);
+ editor_set_scale(EditorSettings::get_singleton()->get("interface/editor/custom_display_scale"));
} break;
}
// Define a minimum window size to prevent UI elements from overlapping or being cut off
- OS::get_singleton()->set_min_window_size(Size2(750, 420) * EDSCALE);
+ DisplayServer::get_singleton()->window_set_min_size(Size2(750, 420) * EDSCALE);
-#ifndef OSX_ENABLED
- // The macOS platform implementation uses its own hiDPI window resizing code
// TODO: Resize windows on hiDPI displays on Windows and Linux and remove the line below
- OS::get_singleton()->set_window_size(OS::get_singleton()->get_window_size() * MAX(1, EDSCALE));
-#endif
+ DisplayServer::get_singleton()->window_set_size(DisplayServer::get_singleton()->window_get_size() * MAX(1, EDSCALE));
}
+ String cp;
+ cp += 0xA9;
+ // TRANSLATORS: This refers to the application where users manage their Godot projects.
+ DisplayServer::get_singleton()->window_set_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2020 Juan Linietsky, Ariel Manzur & Godot Contributors");
+
FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"));
set_anchors_and_margins_preset(Control::PRESET_WIDE);
set_theme(create_custom_theme());
- gui_base = memnew(Control);
- add_child(gui_base);
- gui_base->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+ set_anchors_and_margins_preset(Control::PRESET_WIDE);
Panel *panel = memnew(Panel);
- gui_base->add_child(panel);
+ add_child(panel);
panel->set_anchors_and_margins_preset(Control::PRESET_WIDE);
- panel->add_style_override("panel", gui_base->get_stylebox("Background", "EditorStyles"));
+ panel->add_theme_style_override("panel", get_theme_stylebox("Background", "EditorStyles"));
VBoxContainer *vb = memnew(VBoxContainer);
panel->add_child(vb);
vb->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 8 * EDSCALE);
- String cp;
- cp += 0xA9;
- OS::get_singleton()->set_window_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2020 Juan Linietsky, Ariel Manzur & Godot Contributors");
-
Control *center_box = memnew(Control);
- center_box->set_v_size_flags(SIZE_EXPAND_FILL);
+ center_box->set_v_size_flags(Control::SIZE_EXPAND_FILL);
vb->add_child(center_box);
tabs = memnew(TabContainer);
@@ -2449,218 +2416,231 @@ ProjectManager::ProjectManager() {
tabs->set_anchors_and_margins_preset(Control::PRESET_WIDE);
tabs->set_tab_align(TabContainer::ALIGN_LEFT);
- HBoxContainer *tree_hb = memnew(HBoxContainer);
- projects_hb = tree_hb;
-
+ HBoxContainer *projects_hb = memnew(HBoxContainer);
projects_hb->set_name(TTR("Projects"));
+ tabs->add_child(projects_hb);
- tabs->add_child(tree_hb);
-
- VBoxContainer *search_tree_vb = memnew(VBoxContainer);
- tree_hb->add_child(search_tree_vb);
- search_tree_vb->set_h_size_flags(SIZE_EXPAND_FILL);
-
- HBoxContainer *sort_filters = memnew(HBoxContainer);
- Label *sort_label = memnew(Label);
- sort_label->set_text(TTR("Sort:"));
- sort_filters->add_child(sort_label);
- Vector<String> sort_filter_titles;
- sort_filter_titles.push_back(TTR("Name"));
- sort_filter_titles.push_back(TTR("Path"));
- sort_filter_titles.push_back(TTR("Last Modified"));
- project_order_filter = memnew(ProjectListFilter);
- project_order_filter->add_filter_option();
- project_order_filter->_setup_filters(sort_filter_titles);
- project_order_filter->set_filter_size(150);
- sort_filters->add_child(project_order_filter);
- project_order_filter->connect("filter_changed", this, "_on_order_option_changed");
- project_order_filter->set_custom_minimum_size(Size2(180, 10) * EDSCALE);
-
- int projects_sorting_order = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order");
- project_order_filter->set_filter_option((ProjectListFilter::FilterOption)projects_sorting_order);
-
- sort_filters->add_spacer(true);
-
- project_filter = memnew(ProjectListFilter);
- project_filter->add_search_box();
- project_filter->connect("filter_changed", this, "_on_filter_option_changed");
- project_filter->set_custom_minimum_size(Size2(280, 10) * EDSCALE);
- sort_filters->add_child(project_filter);
-
- search_tree_vb->add_child(sort_filters);
-
- PanelContainer *pc = memnew(PanelContainer);
- pc->add_style_override("panel", gui_base->get_stylebox("bg", "Tree"));
- search_tree_vb->add_child(pc);
- pc->set_v_size_flags(SIZE_EXPAND_FILL);
-
- _project_list = memnew(ProjectList);
- _project_list->connect(ProjectList::SIGNAL_SELECTION_CHANGED, this, "_update_project_buttons");
- _project_list->connect(ProjectList::SIGNAL_PROJECT_ASK_OPEN, this, "_open_selected_projects_ask");
- pc->add_child(_project_list);
- _project_list->set_enable_h_scroll(false);
-
- VBoxContainer *tree_vb = memnew(VBoxContainer);
- tree_hb->add_child(tree_vb);
-
- Button *open = memnew(Button);
- open->set_text(TTR("Edit"));
- tree_vb->add_child(open);
- open->connect("pressed", this, "_open_selected_projects_ask");
- open_btn = open;
-
- Button *run = memnew(Button);
- run->set_text(TTR("Run"));
- tree_vb->add_child(run);
- run->connect("pressed", this, "_run_project");
- run_btn = run;
-
- tree_vb->add_child(memnew(HSeparator));
-
- Button *scan = memnew(Button);
- scan->set_text(TTR("Scan"));
- tree_vb->add_child(scan);
- scan->connect("pressed", this, "_scan_projects");
-
- tree_vb->add_child(memnew(HSeparator));
-
- scan_dir = memnew(FileDialog);
- scan_dir->set_access(FileDialog::ACCESS_FILESYSTEM);
- scan_dir->set_mode(FileDialog::MODE_OPEN_DIR);
- scan_dir->set_title(TTR("Select a Folder to Scan")); // must be after mode or it's overridden
- scan_dir->set_current_dir(EditorSettings::get_singleton()->get("filesystem/directories/default_project_path"));
- gui_base->add_child(scan_dir);
- scan_dir->connect("dir_selected", this, "_scan_begin");
-
- Button *create = memnew(Button);
- create->set_text(TTR("New Project"));
- tree_vb->add_child(create);
- create->connect("pressed", this, "_new_project");
-
- Button *import = memnew(Button);
- import->set_text(TTR("Import"));
- tree_vb->add_child(import);
- import->connect("pressed", this, "_import_project");
-
- Button *rename = memnew(Button);
- rename->set_text(TTR("Rename"));
- tree_vb->add_child(rename);
- rename->connect("pressed", this, "_rename_project");
- rename_btn = rename;
-
- Button *erase = memnew(Button);
- erase->set_text(TTR("Remove"));
- tree_vb->add_child(erase);
- erase->connect("pressed", this, "_erase_project");
- erase_btn = erase;
-
- Button *erase_missing = memnew(Button);
- erase_missing->set_text(TTR("Remove Missing"));
- tree_vb->add_child(erase_missing);
- erase_missing->connect("pressed", this, "_erase_missing_projects");
- erase_missing_btn = erase_missing;
-
- tree_vb->add_spacer();
-
- if (StreamPeerSSL::is_available()) {
- asset_library = memnew(EditorAssetLibrary(true));
- asset_library->set_name(TTR("Templates"));
- tabs->add_child(asset_library);
- asset_library->connect("install_asset", this, "_install_project");
- } else {
- WARN_PRINT("Asset Library not available, as it requires SSL to work.");
- }
+ {
+ // Projects + search bar
+ VBoxContainer *search_tree_vb = memnew(VBoxContainer);
+ projects_hb->add_child(search_tree_vb);
+ search_tree_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+
+ HBoxContainer *hb = memnew(HBoxContainer);
+ hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ search_tree_vb->add_child(hb);
+
+ search_box = memnew(LineEdit);
+ search_box->set_placeholder(TTR("Search"));
+ search_box->set_tooltip(TTR("The search box filters projects by name and last path component.\nTo filter projects by name and full path, the query must contain at least one `/` character."));
+ search_box->connect("text_changed", callable_mp(this, &ProjectManager::_on_search_term_changed));
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hb->add_child(search_box);
+
+ hb->add_spacer();
+
+ Label *sort_label = memnew(Label);
+ sort_label->set_text(TTR("Sort:"));
+ hb->add_child(sort_label);
+
+ filter_option = memnew(OptionButton);
+ filter_option->set_clip_text(true);
+ filter_option->set_custom_minimum_size(Size2(150 * EDSCALE, 10 * EDSCALE));
+ filter_option->connect("item_selected", callable_mp(this, &ProjectManager::_on_order_option_changed));
+ hb->add_child(filter_option);
+
+ Vector<String> sort_filter_titles;
+ sort_filter_titles.push_back(TTR("Name"));
+ sort_filter_titles.push_back(TTR("Path"));
+ sort_filter_titles.push_back(TTR("Last Edited"));
+
+ for (int i = 0; i < sort_filter_titles.size(); i++) {
+ filter_option->add_item(sort_filter_titles[i]);
+ }
- HBoxContainer *settings_hb = memnew(HBoxContainer);
- settings_hb->set_alignment(BoxContainer::ALIGN_END);
- settings_hb->set_h_grow_direction(Control::GROW_DIRECTION_BEGIN);
+ PanelContainer *pc = memnew(PanelContainer);
+ pc->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ pc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ search_tree_vb->add_child(pc);
- Label *version_label = memnew(Label);
- String hash = String(VERSION_HASH);
- if (hash.length() != 0) {
- hash = "." + hash.left(9);
+ _project_list = memnew(ProjectList);
+ _project_list->connect(ProjectList::SIGNAL_SELECTION_CHANGED, callable_mp(this, &ProjectManager::_update_project_buttons));
+ _project_list->connect(ProjectList::SIGNAL_PROJECT_ASK_OPEN, callable_mp(this, &ProjectManager::_open_selected_projects_ask));
+ _project_list->set_enable_h_scroll(false);
+ pc->add_child(_project_list);
}
- version_label->set_text("v" VERSION_FULL_BUILD "" + hash);
- // Fade out the version label to be less prominent, but still readable
- version_label->set_self_modulate(Color(1, 1, 1, 0.6));
- version_label->set_align(Label::ALIGN_CENTER);
- settings_hb->add_child(version_label);
- language_btn = memnew(OptionButton);
- language_btn->set_flat(true);
- language_btn->set_focus_mode(Control::FOCUS_NONE);
+ {
+ // Project tab side bar
+ VBoxContainer *tree_vb = memnew(VBoxContainer);
+ tree_vb->set_custom_minimum_size(Size2(120, 120));
+ projects_hb->add_child(tree_vb);
+
+ Button *create = memnew(Button);
+ create->set_text(TTR("New Project"));
+ create->connect("pressed", callable_mp(this, &ProjectManager::_new_project));
+ tree_vb->add_child(create);
+
+ Button *import = memnew(Button);
+ import->set_text(TTR("Import"));
+ import->connect("pressed", callable_mp(this, &ProjectManager::_import_project));
+ tree_vb->add_child(import);
+
+ Button *scan = memnew(Button);
+ scan->set_text(TTR("Scan"));
+ scan->connect("pressed", callable_mp(this, &ProjectManager::_scan_projects));
+ tree_vb->add_child(scan);
+
+ tree_vb->add_child(memnew(HSeparator));
+
+ open_btn = memnew(Button);
+ open_btn->set_text(TTR("Edit"));
+ open_btn->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects_ask));
+ tree_vb->add_child(open_btn);
+
+ run_btn = memnew(Button);
+ run_btn->set_text(TTR("Run"));
+ run_btn->connect("pressed", callable_mp(this, &ProjectManager::_run_project));
+ tree_vb->add_child(run_btn);
+
+ rename_btn = memnew(Button);
+ rename_btn->set_text(TTR("Rename"));
+ rename_btn->connect("pressed", callable_mp(this, &ProjectManager::_rename_project));
+ tree_vb->add_child(rename_btn);
+
+ erase_btn = memnew(Button);
+ erase_btn->set_text(TTR("Remove"));
+ erase_btn->connect("pressed", callable_mp(this, &ProjectManager::_erase_project));
+ tree_vb->add_child(erase_btn);
+
+ erase_missing_btn = memnew(Button);
+ erase_missing_btn->set_text(TTR("Remove Missing"));
+ erase_missing_btn->connect("pressed", callable_mp(this, &ProjectManager::_erase_missing_projects));
+ tree_vb->add_child(erase_missing_btn);
+ }
- Vector<String> editor_languages;
- List<PropertyInfo> editor_settings_properties;
- EditorSettings::get_singleton()->get_property_list(&editor_settings_properties);
- for (List<PropertyInfo>::Element *E = editor_settings_properties.front(); E; E = E->next()) {
- PropertyInfo &pi = E->get();
- if (pi.name == "interface/editor/editor_language") {
- editor_languages = pi.hint_string.split(",");
+ {
+ // Version info and language options
+ HBoxContainer *settings_hb = memnew(HBoxContainer);
+ settings_hb->set_alignment(BoxContainer::ALIGN_END);
+ settings_hb->set_h_grow_direction(Control::GROW_DIRECTION_BEGIN);
+
+ Label *version_label = memnew(Label);
+ String hash = String(VERSION_HASH);
+ if (hash.length() != 0) {
+ hash = "." + hash.left(9);
}
- }
- String current_lang = EditorSettings::get_singleton()->get("interface/editor/editor_language");
- for (int i = 0; i < editor_languages.size(); i++) {
- String lang = editor_languages[i];
- String lang_name = TranslationServer::get_singleton()->get_locale_name(lang);
- language_btn->add_item(lang_name + " [" + lang + "]", i);
- language_btn->set_item_metadata(i, lang);
- if (current_lang == lang) {
- language_btn->select(i);
- language_btn->set_text(lang);
+ version_label->set_text("v" VERSION_FULL_BUILD "" + hash);
+ version_label->set_self_modulate(Color(1, 1, 1, 0.6));
+ version_label->set_align(Label::ALIGN_CENTER);
+ settings_hb->add_child(version_label);
+
+ language_btn = memnew(OptionButton);
+ language_btn->set_flat(true);
+ language_btn->set_icon(get_theme_icon("Environment", "EditorIcons"));
+ language_btn->set_focus_mode(Control::FOCUS_NONE);
+ language_btn->connect("item_selected", callable_mp(this, &ProjectManager::_language_selected));
+
+ Vector<String> editor_languages;
+ List<PropertyInfo> editor_settings_properties;
+ EditorSettings::get_singleton()->get_property_list(&editor_settings_properties);
+ for (List<PropertyInfo>::Element *E = editor_settings_properties.front(); E; E = E->next()) {
+ PropertyInfo &pi = E->get();
+ if (pi.name == "interface/editor/editor_language") {
+ editor_languages = pi.hint_string.split(",");
+ break;
+ }
}
- }
- language_btn->set_icon(get_icon("Environment", "EditorIcons"));
-
- settings_hb->add_child(language_btn);
- language_btn->connect("item_selected", this, "_language_selected");
- center_box->add_child(settings_hb);
- settings_hb->set_anchors_and_margins_preset(Control::PRESET_TOP_RIGHT);
+ String current_lang = EditorSettings::get_singleton()->get("interface/editor/editor_language");
+ language_btn->set_text(current_lang);
- //////////////////////////////////////////////////////////////
-
- language_restart_ask = memnew(ConfirmationDialog);
- language_restart_ask->get_ok()->set_text(TTR("Restart Now"));
- language_restart_ask->get_ok()->connect("pressed", this, "_restart_confirm");
- language_restart_ask->get_cancel()->set_text(TTR("Continue"));
- gui_base->add_child(language_restart_ask);
-
- erase_missing_ask = memnew(ConfirmationDialog);
- erase_missing_ask->get_ok()->set_text(TTR("Remove All"));
- erase_missing_ask->get_ok()->connect("pressed", this, "_erase_missing_projects_confirm");
- gui_base->add_child(erase_missing_ask);
-
- erase_ask = memnew(ConfirmationDialog);
- erase_ask->get_ok()->set_text(TTR("Remove"));
- erase_ask->get_ok()->connect("pressed", this, "_erase_project_confirm");
- gui_base->add_child(erase_ask);
-
- multi_open_ask = memnew(ConfirmationDialog);
- multi_open_ask->get_ok()->set_text(TTR("Edit"));
- multi_open_ask->get_ok()->connect("pressed", this, "_open_selected_projects");
- gui_base->add_child(multi_open_ask);
-
- multi_run_ask = memnew(ConfirmationDialog);
- multi_run_ask->get_ok()->set_text(TTR("Run"));
- multi_run_ask->get_ok()->connect("pressed", this, "_run_project_confirm");
- gui_base->add_child(multi_run_ask);
+ for (int i = 0; i < editor_languages.size(); i++) {
+ String lang = editor_languages[i];
+ String lang_name = TranslationServer::get_singleton()->get_locale_name(lang);
+ language_btn->add_item(lang_name + " [" + lang + "]", i);
+ language_btn->set_item_metadata(i, lang);
+ if (current_lang == lang) {
+ language_btn->select(i);
+ }
+ }
- multi_scan_ask = memnew(ConfirmationDialog);
- multi_scan_ask->get_ok()->set_text(TTR("Scan"));
- gui_base->add_child(multi_scan_ask);
+ settings_hb->add_child(language_btn);
+ center_box->add_child(settings_hb);
+ settings_hb->set_anchors_and_margins_preset(Control::PRESET_TOP_RIGHT);
+ }
- ask_update_settings = memnew(ConfirmationDialog);
- ask_update_settings->get_ok()->connect("pressed", this, "_confirm_update_settings");
- gui_base->add_child(ask_update_settings);
+ if (StreamPeerSSL::is_available()) {
+ asset_library = memnew(EditorAssetLibrary(true));
+ asset_library->set_name(TTR("Templates"));
+ tabs->add_child(asset_library);
+ asset_library->connect("install_asset", callable_mp(this, &ProjectManager::_install_project));
+ } else {
+ WARN_PRINT("Asset Library not available, as it requires SSL to work.");
+ }
- OS::get_singleton()->set_low_processor_usage_mode(true);
+ {
+ // Dialogs
+ language_restart_ask = memnew(ConfirmationDialog);
+ language_restart_ask->get_ok()->set_text(TTR("Restart Now"));
+ language_restart_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_restart_confirm));
+ language_restart_ask->get_cancel()->set_text(TTR("Continue"));
+ add_child(language_restart_ask);
+
+ scan_dir = memnew(FileDialog);
+ scan_dir->set_access(FileDialog::ACCESS_FILESYSTEM);
+ scan_dir->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR);
+ scan_dir->set_title(TTR("Select a Folder to Scan")); // must be after mode or it's overridden
+ scan_dir->set_current_dir(EditorSettings::get_singleton()->get("filesystem/directories/default_project_path"));
+ add_child(scan_dir);
+ scan_dir->connect("dir_selected", callable_mp(this, &ProjectManager::_scan_begin));
+
+ erase_missing_ask = memnew(ConfirmationDialog);
+ erase_missing_ask->get_ok()->set_text(TTR("Remove All"));
+ erase_missing_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_erase_missing_projects_confirm));
+ add_child(erase_missing_ask);
+
+ erase_ask = memnew(ConfirmationDialog);
+ erase_ask->get_ok()->set_text(TTR("Remove"));
+ erase_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_erase_project_confirm));
+ add_child(erase_ask);
+
+ multi_open_ask = memnew(ConfirmationDialog);
+ multi_open_ask->get_ok()->set_text(TTR("Edit"));
+ multi_open_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects));
+ add_child(multi_open_ask);
+
+ multi_run_ask = memnew(ConfirmationDialog);
+ multi_run_ask->get_ok()->set_text(TTR("Run"));
+ multi_run_ask->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_run_project_confirm));
+ add_child(multi_run_ask);
+
+ multi_scan_ask = memnew(ConfirmationDialog);
+ multi_scan_ask->get_ok()->set_text(TTR("Scan"));
+ add_child(multi_scan_ask);
+
+ ask_update_settings = memnew(ConfirmationDialog);
+ ask_update_settings->get_ok()->connect("pressed", callable_mp(this, &ProjectManager::_confirm_update_settings));
+ add_child(ask_update_settings);
+
+ npdialog = memnew(ProjectDialog);
+ npdialog->connect("projects_updated", callable_mp(this, &ProjectManager::_on_projects_updated));
+ npdialog->connect("project_created", callable_mp(this, &ProjectManager::_on_project_created));
+ add_child(npdialog);
+
+ run_error_diag = memnew(AcceptDialog);
+ run_error_diag->set_title(TTR("Can't run project"));
+ add_child(run_error_diag);
- npdialog = memnew(ProjectDialog);
- gui_base->add_child(npdialog);
+ dialog_error = memnew(AcceptDialog);
+ add_child(dialog_error);
- npdialog->connect("projects_updated", this, "_on_projects_updated");
- npdialog->connect("project_created", this, "_on_project_created");
+ open_templates = memnew(ConfirmationDialog);
+ open_templates->set_text(TTR("You currently don't have any projects.\nWould you like to explore official example projects in the Asset Library?"));
+ open_templates->get_ok()->set_text(TTR("Open Asset Library"));
+ open_templates->connect("confirmed", callable_mp(this, &ProjectManager::_open_asset_library));
+ add_child(open_templates);
+ }
_load_recent_projects();
@@ -2668,106 +2648,13 @@ ProjectManager::ProjectManager() {
_scan_begin(EditorSettings::get_singleton()->get("filesystem/directories/autoscan_project_path"));
}
- SceneTree::get_singleton()->connect("files_dropped", this, "_files_dropped");
- SceneTree::get_singleton()->connect("global_menu_action", this, "_global_menu_action");
-
- run_error_diag = memnew(AcceptDialog);
- gui_base->add_child(run_error_diag);
- run_error_diag->set_title(TTR("Can't run project"));
+ SceneTree::get_singleton()->get_root()->connect("files_dropped", callable_mp(this, &ProjectManager::_files_dropped));
- dialog_error = memnew(AcceptDialog);
- gui_base->add_child(dialog_error);
-
- open_templates = memnew(ConfirmationDialog);
- open_templates->set_text(TTR("You currently don't have any projects.\nWould you like to explore official example projects in the Asset Library?"));
- open_templates->get_ok()->set_text(TTR("Open Asset Library"));
- open_templates->connect("confirmed", this, "_open_asset_library");
- add_child(open_templates);
+ OS::get_singleton()->set_low_processor_usage_mode(true);
}
ProjectManager::~ProjectManager() {
-
- if (EditorSettings::get_singleton())
+ if (EditorSettings::get_singleton()) {
EditorSettings::destroy();
-}
-
-void ProjectListFilter::_setup_filters(Vector<String> options) {
-
- filter_option->clear();
- for (int i = 0; i < options.size(); i++)
- filter_option->add_item(options[i]);
-}
-
-void ProjectListFilter::_search_text_changed(const String &p_newtext) {
- emit_signal("filter_changed");
-}
-
-String ProjectListFilter::get_search_term() {
- return search_box->get_text().strip_edges();
-}
-
-ProjectListFilter::FilterOption ProjectListFilter::get_filter_option() {
- return _current_filter;
-}
-
-void ProjectListFilter::set_filter_option(FilterOption option) {
- filter_option->select((int)option);
- _filter_option_selected(0);
-}
-
-void ProjectListFilter::_filter_option_selected(int p_idx) {
- FilterOption selected = (FilterOption)(filter_option->get_selected());
- if (_current_filter != selected) {
- _current_filter = selected;
- emit_signal("filter_changed");
- }
-}
-
-void ProjectListFilter::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE && has_search_box) {
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
- search_box->set_clear_button_enabled(true);
- }
-}
-
-void ProjectListFilter::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_search_text_changed"), &ProjectListFilter::_search_text_changed);
- ClassDB::bind_method(D_METHOD("_filter_option_selected"), &ProjectListFilter::_filter_option_selected);
-
- ADD_SIGNAL(MethodInfo("filter_changed"));
-}
-
-void ProjectListFilter::add_filter_option() {
- filter_option = memnew(OptionButton);
- filter_option->set_clip_text(true);
- filter_option->connect("item_selected", this, "_filter_option_selected");
- add_child(filter_option);
-}
-
-void ProjectListFilter::add_search_box() {
- search_box = memnew(LineEdit);
- search_box->set_placeholder(TTR("Search"));
- search_box->connect("text_changed", this, "_search_text_changed");
- search_box->set_h_size_flags(SIZE_EXPAND_FILL);
- add_child(search_box);
-
- has_search_box = true;
-}
-
-void ProjectListFilter::set_filter_size(int h_size) {
- filter_option->set_custom_minimum_size(Size2(h_size * EDSCALE, 10 * EDSCALE));
-}
-
-ProjectListFilter::ProjectListFilter() {
-
- _current_filter = FILTER_NAME;
- has_search_box = false;
-}
-
-void ProjectListFilter::clear() {
- if (has_search_box) {
- search_box->clear();
}
}
diff --git a/editor/project_manager.h b/editor/project_manager.h
index b8f7403e27..407dba0c94 100644
--- a/editor/project_manager.h
+++ b/editor/project_manager.h
@@ -35,28 +35,35 @@
#include "scene/gui/dialogs.h"
#include "scene/gui/file_dialog.h"
#include "scene/gui/scroll_container.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
class ProjectDialog;
class ProjectList;
-class ProjectListFilter;
-class ProjectManager : public Control {
+enum FilterOption {
+ NAME,
+ PATH,
+ EDIT_DATE,
+};
+class ProjectManager : public Control {
GDCLASS(ProjectManager, Control);
- Button *erase_btn;
- Button *erase_missing_btn;
+ TabContainer *tabs;
+
+ ProjectList *_project_list;
+
+ LineEdit *search_box;
+ OptionButton *filter_option;
+
+ Button *run_btn;
Button *open_btn;
Button *rename_btn;
- Button *run_btn;
+ Button *erase_btn;
+ Button *erase_missing_btn;
EditorAssetLibrary *asset_library;
- ProjectListFilter *project_filter;
- ProjectListFilter *project_order_filter;
-
FileDialog *scan_dir;
ConfirmationDialog *language_restart_ask;
ConfirmationDialog *erase_ask;
@@ -66,18 +73,12 @@ class ProjectManager : public Control {
ConfirmationDialog *multi_scan_ask;
ConfirmationDialog *ask_update_settings;
ConfirmationDialog *open_templates;
+
AcceptDialog *run_error_diag;
AcceptDialog *dialog_error;
ProjectDialog *npdialog;
- HBoxContainer *projects_hb;
- TabContainer *tabs;
- ProjectList *_project_list;
-
OptionButton *language_btn;
- Control *gui_base;
-
- bool importing;
void _open_asset_library();
void _scan_projects();
@@ -96,26 +97,23 @@ class ProjectManager : public Control {
void _language_selected(int p_id);
void _restart_confirm();
void _exit_dialog();
- void _scan_begin(const String &p_base);
- void _global_menu_action(const Variant &p_id, const Variant &p_meta);
-
void _confirm_update_settings();
void _load_recent_projects();
void _on_project_created(const String &dir);
void _on_projects_updated();
- void _update_scroll_position(const String &dir);
+ void _scan_multiple_folders(PackedStringArray p_files);
+ void _scan_begin(const String &p_base);
void _scan_dir(const String &path, List<String> *r_projects);
void _install_project(const String &p_zip_path, const String &p_title);
void _dim_window();
void _unhandled_input(const Ref<InputEvent> &p_ev);
- void _files_dropped(PoolStringArray p_files, int p_screen);
- void _scan_multiple_folders(PoolStringArray p_files);
+ void _files_dropped(PackedStringArray p_files, int p_screen);
- void _on_order_option_changed();
- void _on_filter_option_changed();
+ void _on_order_option_changed(int p_idx);
+ void _on_search_term_changed(const String &p_term);
protected:
void _notification(int p_what);
@@ -126,42 +124,4 @@ public:
~ProjectManager();
};
-class ProjectListFilter : public HBoxContainer {
-
- GDCLASS(ProjectListFilter, HBoxContainer);
-
-public:
- enum FilterOption {
- FILTER_NAME,
- FILTER_PATH,
- FILTER_MODIFIED,
- };
-
-private:
- friend class ProjectManager;
-
- OptionButton *filter_option;
- LineEdit *search_box;
- bool has_search_box;
- FilterOption _current_filter;
-
- void _search_text_changed(const String &p_newtext);
- void _filter_option_selected(int p_idx);
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void _setup_filters(Vector<String> options);
- void add_filter_option();
- void add_search_box();
- void set_filter_size(int h_size);
- String get_search_term();
- FilterOption get_filter_option();
- void set_filter_option(FilterOption);
- ProjectListFilter();
- void clear();
-};
-
#endif // PROJECT_MANAGER_H
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp
index b656fd647f..b6621d0d1e 100644
--- a/editor/project_settings_editor.cpp
+++ b/editor/project_settings_editor.cpp
@@ -30,981 +30,179 @@
#include "project_settings_editor.h"
-#include "core/global_constants.h"
-#include "core/input_map.h"
-#include "core/os/keyboard.h"
#include "core/project_settings.h"
-#include "core/translation.h"
#include "editor/editor_export.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
-#include "scene/gui/margin_container.h"
-#include "scene/gui/tab_container.h"
-
-ProjectSettingsEditor *ProjectSettingsEditor::singleton = NULL;
-
-static const char *_button_names[JOY_BUTTON_MAX] = {
- "DualShock Cross, Xbox A, Nintendo B",
- "DualShock Circle, Xbox B, Nintendo A",
- "DualShock Square, Xbox X, Nintendo Y",
- "DualShock Triangle, Xbox Y, Nintendo X",
- "L, L1",
- "R, R1",
- "L2",
- "R2",
- "L3",
- "R3",
- "Select, DualShock Share, Nintendo -",
- "Start, DualShock Options, Nintendo +",
- "D-Pad Up",
- "D-Pad Down",
- "D-Pad Left",
- "D-Pad Right"
-};
-
-static const char *_axis_names[JOY_AXIS_MAX * 2] = {
- " (Left Stick Left)",
- " (Left Stick Right)",
- " (Left Stick Up)",
- " (Left Stick Down)",
- " (Right Stick Left)",
- " (Right Stick Right)",
- " (Right Stick Up)",
- " (Right Stick Down)",
- "", "", "", "",
- "", " (L2)",
- "", " (R2)"
-};
-
-void ProjectSettingsEditor::_unhandled_input(const Ref<InputEvent> &p_event) {
-
- const Ref<InputEventKey> k = p_event;
-
- if (k.is_valid() && is_window_modal_on_top() && k->is_pressed()) {
-
- if (k->get_scancode_with_modifiers() == (KEY_MASK_CMD | KEY_F)) {
- if (search_button->is_pressed()) {
- search_box->grab_focus();
- search_box->select_all();
- } else {
- // This toggles the search bar display while giving the button its "pressed" appearance
- search_button->set_pressed(true);
- }
-
- accept_event();
- }
- }
-}
-
-void ProjectSettingsEditor::_notification(int p_what) {
-
- switch (p_what) {
- case NOTIFICATION_ENTER_TREE: {
- globals_editor->edit(ProjectSettings::get_singleton());
-
- search_button->set_icon(get_icon("Search", "EditorIcons"));
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
- search_box->set_clear_button_enabled(true);
-
- action_add_error->add_color_override("font_color", get_color("error_color", "Editor"));
-
- translation_list->connect("button_pressed", this, "_translation_delete");
- _update_actions();
- popup_add->add_icon_item(get_icon("Keyboard", "EditorIcons"), TTR("Key "), INPUT_KEY); //"Key " - because the word 'key' has already been used as a key animation
- popup_add->add_icon_item(get_icon("JoyButton", "EditorIcons"), TTR("Joy Button"), INPUT_JOY_BUTTON);
- popup_add->add_icon_item(get_icon("JoyAxis", "EditorIcons"), TTR("Joy Axis"), INPUT_JOY_MOTION);
- popup_add->add_icon_item(get_icon("Mouse", "EditorIcons"), TTR("Mouse Button"), INPUT_MOUSE_BUTTON);
-
- List<String> tfn;
- ResourceLoader::get_recognized_extensions_for_type("Translation", &tfn);
- for (List<String>::Element *E = tfn.front(); E; E = E->next()) {
-
- translation_file_open->add_filter("*." + E->get());
- }
-
- List<String> rfn;
- ResourceLoader::get_recognized_extensions_for_type("Resource", &rfn);
- for (List<String>::Element *E = rfn.front(); E; E = E->next()) {
-
- translation_res_file_open->add_filter("*." + E->get());
- translation_res_option_file_open->add_filter("*." + E->get());
- }
-
- restart_close_button->set_icon(get_icon("Close", "EditorIcons"));
- restart_container->add_style_override("panel", get_stylebox("bg", "Tree"));
- restart_icon->set_texture(get_icon("StatusWarning", "EditorIcons"));
- restart_label->add_color_override("font_color", get_color("warning_color", "Editor"));
-
- } break;
- case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", get_rect());
- set_process_unhandled_input(false);
- } break;
- case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
- search_button->set_icon(get_icon("Search", "EditorIcons"));
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
- search_box->set_clear_button_enabled(true);
- action_add_error->add_color_override("font_color", get_color("error_color", "Editor"));
- popup_add->set_item_icon(popup_add->get_item_index(INPUT_KEY), get_icon("Keyboard", "EditorIcons"));
- popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_BUTTON), get_icon("JoyButton", "EditorIcons"));
- popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_MOTION), get_icon("JoyAxis", "EditorIcons"));
- popup_add->set_item_icon(popup_add->get_item_index(INPUT_MOUSE_BUTTON), get_icon("Mouse", "EditorIcons"));
- _update_actions();
- } break;
- }
-}
-
-static bool _validate_action_name(const String &p_name) {
- const CharType *cstr = p_name.c_str();
- for (int i = 0; cstr[i]; i++)
- if (cstr[i] == '/' || cstr[i] == ':' || cstr[i] == '"' ||
- cstr[i] == '=' || cstr[i] == '\\' || cstr[i] < 32)
- return false;
- return true;
-}
-
-void ProjectSettingsEditor::_action_selected() {
-
- TreeItem *ti = input_editor->get_selected();
- if (!ti || !ti->is_editable(0))
- return;
-
- add_at = "input/" + ti->get_text(0);
- edit_idx = -1;
-}
-void ProjectSettingsEditor::_action_edited() {
-
- TreeItem *ti = input_editor->get_selected();
- if (!ti)
- return;
-
- if (input_editor->get_selected_column() == 0) {
-
- String new_name = ti->get_text(0);
- String old_name = add_at.substr(add_at.find("/") + 1, add_at.length());
-
- if (new_name == old_name)
- return;
-
- if (new_name == "" || !_validate_action_name(new_name)) {
-
- ti->set_text(0, old_name);
- add_at = "input/" + old_name;
-
- message->set_text(TTR("Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or '\"'"));
- message->popup_centered(Size2(300, 100) * EDSCALE);
- return;
- }
-
- String action_prop = "input/" + new_name;
-
- if (ProjectSettings::get_singleton()->has_setting(action_prop)) {
-
- ti->set_text(0, old_name);
- add_at = "input/" + old_name;
-
- message->set_text(vformat(TTR("An action with the name '%s' already exists."), new_name));
- message->popup_centered(Size2(300, 100) * EDSCALE);
- return;
- }
-
- int order = ProjectSettings::get_singleton()->get_order(add_at);
- Dictionary action = ProjectSettings::get_singleton()->get(add_at);
-
- setting = true;
- undo_redo->create_action(TTR("Rename Input Action Event"));
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", add_at);
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_prop, action);
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", action_prop, order);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", action_prop);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", add_at, action);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", add_at, order);
- undo_redo->add_do_method(this, "_update_actions");
- undo_redo->add_undo_method(this, "_update_actions");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
- setting = false;
-
- add_at = action_prop;
- } else if (input_editor->get_selected_column() == 1) {
-
- String name = "input/" + ti->get_text(0);
- Dictionary old_action = ProjectSettings::get_singleton()->get(name);
- Dictionary new_action = old_action.duplicate();
- new_action["deadzone"] = ti->get_range(1);
-
- undo_redo->create_action(TTR("Change Action deadzone"));
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, new_action);
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_action);
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
- }
-}
-
-void ProjectSettingsEditor::_device_input_add() {
-
- Ref<InputEvent> ie;
- String name = add_at;
- int idx = edit_idx;
- Dictionary old_val = ProjectSettings::get_singleton()->get(name);
- Dictionary action = old_val.duplicate();
- Array events = action["events"];
-
- switch (add_type) {
-
- case INPUT_MOUSE_BUTTON: {
-
- Ref<InputEventMouseButton> mb;
- mb.instance();
- mb->set_button_index(device_index->get_selected() + 1);
- mb->set_device(_get_current_device());
-
- for (int i = 0; i < events.size(); i++) {
-
- Ref<InputEventMouseButton> aie = events[i];
- if (aie.is_null())
- continue;
- if (aie->get_device() == mb->get_device() && aie->get_button_index() == mb->get_button_index()) {
- return;
- }
- }
-
- ie = mb;
-
- } break;
- case INPUT_JOY_MOTION: {
-
- Ref<InputEventJoypadMotion> jm;
- jm.instance();
- jm->set_axis(device_index->get_selected() >> 1);
- jm->set_axis_value((device_index->get_selected() & 1) ? 1 : -1);
- jm->set_device(_get_current_device());
-
- for (int i = 0; i < events.size(); i++) {
-
- Ref<InputEventJoypadMotion> aie = events[i];
- if (aie.is_null())
- continue;
-
- if (aie->get_device() == jm->get_device() && aie->get_axis() == jm->get_axis() && aie->get_axis_value() == jm->get_axis_value()) {
- return;
- }
- }
+ProjectSettingsEditor *ProjectSettingsEditor::singleton = nullptr;
- ie = jm;
-
- } break;
- case INPUT_JOY_BUTTON: {
-
- Ref<InputEventJoypadButton> jb;
- jb.instance();
-
- jb->set_button_index(device_index->get_selected());
- jb->set_device(_get_current_device());
-
- for (int i = 0; i < events.size(); i++) {
-
- Ref<InputEventJoypadButton> aie = events[i];
- if (aie.is_null())
- continue;
- if (aie->get_device() == jb->get_device() && aie->get_button_index() == jb->get_button_index()) {
- return;
- }
- }
- ie = jb;
-
- } break;
- default: {
- }
- }
-
- if (idx < 0 || idx >= events.size()) {
- events.push_back(ie);
+void ProjectSettingsEditor::popup_project_settings() {
+ // Restore valid window bounds or pop up at default size.
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "project_settings", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
- events[idx] = ie;
+ popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
}
- action["events"] = events;
-
- undo_redo->create_action(TTR("Add Input Action Event"));
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
- undo_redo->add_do_method(this, "_update_actions");
- undo_redo->add_undo_method(this, "_update_actions");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
- _show_last_added(ie, name);
-}
-
-void ProjectSettingsEditor::_set_current_device(int i_device) {
- device_id->select(i_device + 1);
-}
+ _add_feature_overrides();
+ inspector->update_category_list();
-int ProjectSettingsEditor::_get_current_device() {
- return device_id->get_selected() - 1;
-}
-
-String ProjectSettingsEditor::_get_device_string(int i_device) {
- if (i_device == InputMap::ALL_DEVICES)
- return TTR("All Devices");
- return TTR("Device") + " " + itos(i_device);
+ localization_editor->update_translations();
+ autoload_settings->update_autoload();
+ plugin_settings->update_plugins();
}
-void ProjectSettingsEditor::_press_a_key_confirm() {
-
- if (last_wait_for_key.is_null())
- return;
-
- Ref<InputEventKey> ie;
- ie.instance();
- ie->set_scancode(last_wait_for_key->get_scancode());
- ie->set_shift(last_wait_for_key->get_shift());
- ie->set_alt(last_wait_for_key->get_alt());
- ie->set_control(last_wait_for_key->get_control());
- ie->set_metakey(last_wait_for_key->get_metakey());
-
- String name = add_at;
- int idx = edit_idx;
-
- Dictionary old_val = ProjectSettings::get_singleton()->get(name);
- Dictionary action = old_val.duplicate();
- Array events = action["events"];
-
- for (int i = 0; i < events.size(); i++) {
-
- Ref<InputEventKey> aie = events[i];
- if (aie.is_null())
- continue;
- if (aie->get_scancode_with_modifiers() == ie->get_scancode_with_modifiers()) {
- return;
- }
- }
-
- if (idx < 0 || idx >= events.size()) {
- events.push_back(ie);
- } else {
- events[idx] = ie;
- }
- action["events"] = events;
-
- undo_redo->create_action(TTR("Add Input Action Event"));
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
- undo_redo->add_do_method(this, "_update_actions");
- undo_redo->add_undo_method(this, "_update_actions");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-
- _show_last_added(ie, name);
+void ProjectSettingsEditor::queue_save() {
+ timer->start();
}
-void ProjectSettingsEditor::_show_last_added(const Ref<InputEvent> &p_event, const String &p_name) {
- TreeItem *r = input_editor->get_root();
-
- String name = p_name;
- name.erase(0, 6);
- if (!r)
- return;
- r = r->get_children();
- if (!r)
- return;
- bool found = false;
- while (r) {
- if (r->get_text(0) != name) {
- r = r->get_next();
- continue;
- }
- TreeItem *child = r->get_children();
- while (child) {
- Variant input = child->get_meta("__input");
- if (p_event == input) {
- r->set_collapsed(false);
- child->select(0);
- found = true;
- break;
- }
- child = child->get_next();
- }
- if (found) break;
- r = r->get_next();
- }
-
- if (found) input_editor->ensure_cursor_is_visible();
+void ProjectSettingsEditor::set_plugins_page() {
+ tab_container->set_current_tab(plugin_settings->get_index());
}
-void ProjectSettingsEditor::_wait_for_key(const Ref<InputEvent> &p_event) {
-
- Ref<InputEventKey> k = p_event;
-
- if (k.is_valid() && k->is_pressed() && k->get_scancode() != 0) {
-
- last_wait_for_key = p_event;
- const String str = keycode_get_string(k->get_scancode_with_modifiers());
-
- press_a_key_label->set_text(str);
- press_a_key->get_ok()->set_disabled(false);
- press_a_key->accept_event();
- }
+void ProjectSettingsEditor::update_plugins() {
+ plugin_settings->update_plugins();
}
-void ProjectSettingsEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_event) {
-
- add_type = InputType(p_item);
-
- switch (add_type) {
-
- case INPUT_KEY: {
-
- press_a_key_label->set_text(TTR("Press a Key..."));
- press_a_key->get_ok()->set_disabled(true);
- last_wait_for_key = Ref<InputEvent>();
- press_a_key->popup_centered(Size2(250, 80) * EDSCALE);
- press_a_key->grab_focus();
-
- } break;
- case INPUT_MOUSE_BUTTON: {
-
- device_index_label->set_text(TTR("Mouse Button Index:"));
- device_index->clear();
- device_index->add_item(TTR("Left Button"));
- device_index->add_item(TTR("Right Button"));
- device_index->add_item(TTR("Middle Button"));
- device_index->add_item(TTR("Wheel Up Button"));
- device_index->add_item(TTR("Wheel Down Button"));
- device_index->add_item(TTR("Wheel Left Button"));
- device_index->add_item(TTR("Wheel Right Button"));
- device_index->add_item(TTR("X Button 1"));
- device_index->add_item(TTR("X Button 2"));
- device_input->popup_centered_minsize(Size2(350, 95) * EDSCALE);
-
- Ref<InputEventMouseButton> mb = p_exiting_event;
- if (mb.is_valid()) {
- device_index->select(mb->get_button_index() - 1);
- _set_current_device(mb->get_device());
- device_input->get_ok()->set_text(TTR("Change"));
- } else {
- _set_current_device(0);
- device_input->get_ok()->set_text(TTR("Add"));
- }
-
- } break;
- case INPUT_JOY_MOTION: {
-
- device_index_label->set_text(TTR("Joypad Axis Index:"));
- device_index->clear();
- for (int i = 0; i < JOY_AXIS_MAX * 2; i++) {
-
- String desc = _axis_names[i];
- device_index->add_item(TTR("Axis") + " " + itos(i / 2) + " " + ((i & 1) ? "+" : "-") + desc);
- }
- device_input->popup_centered_minsize(Size2(350, 95) * EDSCALE);
-
- Ref<InputEventJoypadMotion> jm = p_exiting_event;
- if (jm.is_valid()) {
- device_index->select(jm->get_axis() * 2 + (jm->get_axis_value() > 0 ? 1 : 0));
- _set_current_device(jm->get_device());
- device_input->get_ok()->set_text(TTR("Change"));
- } else {
- _set_current_device(0);
- device_input->get_ok()->set_text(TTR("Add"));
- }
-
- } break;
- case INPUT_JOY_BUTTON: {
-
- device_index_label->set_text(TTR("Joypad Button Index:"));
- device_index->clear();
-
- for (int i = 0; i < JOY_BUTTON_MAX; i++) {
-
- device_index->add_item(itos(i) + ": " + String(_button_names[i]));
- }
- device_input->popup_centered_minsize(Size2(350, 95) * EDSCALE);
-
- Ref<InputEventJoypadButton> jb = p_exiting_event;
- if (jb.is_valid()) {
- device_index->select(jb->get_button_index());
- _set_current_device(jb->get_device());
- device_input->get_ok()->set_text(TTR("Change"));
- } else {
- _set_current_device(0);
- device_input->get_ok()->set_text(TTR("Add"));
- }
-
- } break;
- default: {
- }
- }
+void ProjectSettingsEditor::_setting_edited(const String &p_name) {
+ queue_save();
}
-void ProjectSettingsEditor::_edit_item(Ref<InputEvent> p_exiting_event) {
-
- InputType ie_type;
-
- if ((Ref<InputEventKey>(p_exiting_event)).is_valid()) {
- ie_type = INPUT_KEY;
-
- } else if ((Ref<InputEventJoypadButton>(p_exiting_event)).is_valid()) {
- ie_type = INPUT_JOY_BUTTON;
-
- } else if ((Ref<InputEventMouseButton>(p_exiting_event)).is_valid()) {
- ie_type = INPUT_MOUSE_BUTTON;
-
- } else if ((Ref<InputEventJoypadMotion>(p_exiting_event)).is_valid()) {
- ie_type = INPUT_JOY_MOTION;
-
+void ProjectSettingsEditor::_advanced_pressed() {
+ if (advanced->is_pressed()) {
+ _update_advanced_bar();
+ advanced_bar->show();
} else {
- return;
+ advanced_bar->hide();
}
-
- _add_item(ie_type, p_exiting_event);
}
-void ProjectSettingsEditor::_action_activated() {
-
- TreeItem *ti = input_editor->get_selected();
- if (!ti || ti->get_parent() == input_editor->get_root())
+void ProjectSettingsEditor::_setting_selected(const String &p_path) {
+ if (p_path == String()) {
return;
-
- String name = "input/" + ti->get_parent()->get_text(0);
- int idx = ti->get_metadata(0);
- Dictionary action = ProjectSettings::get_singleton()->get(name);
- Array events = action["events"];
-
- ERR_FAIL_INDEX(idx, events.size());
- Ref<InputEvent> event = events[idx];
- if (event.is_null())
- return;
-
- add_at = name;
- edit_idx = idx;
- _edit_item(event);
-}
-
-void ProjectSettingsEditor::_action_button_pressed(Object *p_obj, int p_column, int p_id) {
-
- TreeItem *ti = Object::cast_to<TreeItem>(p_obj);
-
- ERR_FAIL_COND(!ti);
-
- if (p_id == 1) {
- // Add action event
- Point2 ofs = input_editor->get_global_position();
- Rect2 ir = input_editor->get_item_rect(ti);
- ir.position.y -= input_editor->get_scroll().y;
- ofs += ir.position + ir.size;
- ofs.x -= 100;
- popup_add->set_position(ofs);
- popup_add->popup();
- add_at = "input/" + ti->get_text(0);
- edit_idx = -1;
-
- } else if (p_id == 2) {
- // Remove
-
- if (ti->get_parent() == input_editor->get_root()) {
- // Remove action
- String name = "input/" + ti->get_text(0);
- Dictionary old_val = ProjectSettings::get_singleton()->get(name);
- int order = ProjectSettings::get_singleton()->get_order(name);
-
- undo_redo->create_action(TTR("Erase Input Action"));
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", name);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", name, order);
- undo_redo->add_do_method(this, "_update_actions");
- undo_redo->add_undo_method(this, "_update_actions");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-
- } else {
- // Remove action event
- String name = "input/" + ti->get_parent()->get_text(0);
- Dictionary old_val = ProjectSettings::get_singleton()->get(name);
- Dictionary action = old_val.duplicate();
- int idx = ti->get_metadata(0);
-
- Array events = action["events"];
- ERR_FAIL_INDEX(idx, events.size());
- events.remove(idx);
- action["events"] = events;
-
- undo_redo->create_action(TTR("Erase Input Action Event"));
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val);
- undo_redo->add_do_method(this, "_update_actions");
- undo_redo->add_undo_method(this, "_update_actions");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
- }
- } else if (p_id == 3) {
- // Edit
-
- if (ti->get_parent() == input_editor->get_root()) {
- // Edit action name
- ti->set_as_cursor(0);
- input_editor->edit_selected();
-
- } else {
- // Edit action event
- String name = "input/" + ti->get_parent()->get_text(0);
- int idx = ti->get_metadata(0);
- Dictionary action = ProjectSettings::get_singleton()->get(name);
-
- Array events = action["events"];
- ERR_FAIL_INDEX(idx, events.size());
-
- Ref<InputEvent> event = events[idx];
-
- if (event.is_null())
- return;
-
- ti->set_as_cursor(0);
- add_at = name;
- edit_idx = idx;
- _edit_item(event);
- }
}
-}
-void ProjectSettingsEditor::_update_actions() {
+ category_box->set_text(inspector->get_current_section());
+ property_box->set_text(p_path);
- if (setting)
- return;
-
- Map<String, bool> collapsed;
-
- if (input_editor->get_root() && input_editor->get_root()->get_children()) {
- for (TreeItem *item = input_editor->get_root()->get_children(); item; item = item->get_next()) {
- collapsed[item->get_text(0)] = item->is_collapsed();
- }
+ if (advanced_bar->is_visible()) {
+ _update_advanced_bar(); // set_text doesn't trigger text_changed
}
-
- input_editor->clear();
- TreeItem *root = input_editor->create_item();
- input_editor->set_hide_root(true);
-
- List<PropertyInfo> props;
- ProjectSettings::get_singleton()->get_property_list(&props);
-
- for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
-
- const PropertyInfo &pi = E->get();
- if (!pi.name.begins_with("input/"))
- continue;
-
- String name = pi.name.get_slice("/", 1);
- if (name == "")
- continue;
-
- Dictionary action = ProjectSettings::get_singleton()->get(pi.name);
- Array events = action["events"];
-
- TreeItem *item = input_editor->create_item(root);
- item->set_text(0, name);
- item->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
- if (collapsed.has(name))
- item->set_collapsed(collapsed[name]);
-
- item->set_editable(1, true);
- item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
- item->set_range_config(1, 0.0, 1.0, 0.01);
- item->set_range(1, action["deadzone"]);
- item->set_custom_bg_color(1, get_color("prop_subsection", "Editor"));
-
- item->add_button(2, get_icon("Add", "EditorIcons"), 1, false, TTR("Add Event"));
- if (!ProjectSettings::get_singleton()->get_input_presets().find(pi.name)) {
- item->add_button(2, get_icon("Remove", "EditorIcons"), 2, false, TTR("Remove"));
- item->set_editable(0, true);
- }
-
- for (int i = 0; i < events.size(); i++) {
-
- Ref<InputEvent> event = events[i];
- if (event.is_null())
- continue;
-
- TreeItem *action2 = input_editor->create_item(item);
-
- Ref<InputEventKey> k = event;
- if (k.is_valid()) {
-
- const String str = keycode_get_string(k->get_scancode_with_modifiers());
-
- action2->set_text(0, str);
- action2->set_icon(0, get_icon("Keyboard", "EditorIcons"));
- }
-
- Ref<InputEventJoypadButton> jb = event;
-
- if (jb.is_valid()) {
-
- String str = _get_device_string(jb->get_device()) + ", " + TTR("Button") + " " + itos(jb->get_button_index());
- if (jb->get_button_index() >= 0 && jb->get_button_index() < JOY_BUTTON_MAX)
- str += String() + " (" + _button_names[jb->get_button_index()] + ").";
- else
- str += ".";
-
- action2->set_text(0, str);
- action2->set_icon(0, get_icon("JoyButton", "EditorIcons"));
- }
-
- Ref<InputEventMouseButton> mb = event;
-
- if (mb.is_valid()) {
- String str = _get_device_string(mb->get_device()) + ", ";
- switch (mb->get_button_index()) {
- case BUTTON_LEFT: str += TTR("Left Button."); break;
- case BUTTON_RIGHT: str += TTR("Right Button."); break;
- case BUTTON_MIDDLE: str += TTR("Middle Button."); break;
- case BUTTON_WHEEL_UP: str += TTR("Wheel Up."); break;
- case BUTTON_WHEEL_DOWN: str += TTR("Wheel Down."); break;
- default: str += TTR("Button") + " " + itos(mb->get_button_index()) + ".";
- }
-
- action2->set_text(0, str);
- action2->set_icon(0, get_icon("Mouse", "EditorIcons"));
- }
-
- Ref<InputEventJoypadMotion> jm = event;
-
- if (jm.is_valid()) {
-
- int ax = jm->get_axis();
- int n = 2 * ax + (jm->get_axis_value() < 0 ? 0 : 1);
- String desc = _axis_names[n];
- String str = _get_device_string(jm->get_device()) + ", " + TTR("Axis") + " " + itos(ax) + " " + (jm->get_axis_value() < 0 ? "-" : "+") + desc + ".";
- action2->set_text(0, str);
- action2->set_icon(0, get_icon("JoyAxis", "EditorIcons"));
- }
- action2->set_metadata(0, i);
- action2->set_meta("__input", event);
-
- action2->add_button(2, get_icon("Edit", "EditorIcons"), 3, false, TTR("Edit"));
- action2->add_button(2, get_icon("Remove", "EditorIcons"), 2, false, TTR("Remove"));
- }
- }
-
- _action_check(action_name->get_text());
}
-void ProjectSettingsEditor::popup_project_settings() {
-
- // Restore valid window bounds or pop up at default size.
- Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "project_settings", Rect2());
- if (saved_size != Rect2()) {
- popup(saved_size);
- } else {
- popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
- }
-
- globals_editor->update_category_list();
- _update_translations();
- autoload_settings->update_autoload();
- plugin_settings->update_plugins();
- set_process_unhandled_input(true);
-}
-
-void ProjectSettingsEditor::update_plugins() {
- plugin_settings->update_plugins();
-}
-
-void ProjectSettingsEditor::_item_selected(const String &p_path) {
-
- const String &selected_path = p_path;
- if (selected_path == String())
- return;
- category->set_text(globals_editor->get_current_section());
- property->set_text(selected_path);
- popup_copy_to_feature->set_disabled(false);
-}
-
-void ProjectSettingsEditor::_item_adds(String) {
-
- _item_add();
-}
-
-void ProjectSettingsEditor::_item_add() {
+void ProjectSettingsEditor::_add_setting() {
+ String setting = _get_setting_name();
// Initialize the property with the default value for the given type.
// The type list starts at 1 (as we exclude Nil), so add 1 to the selected value.
- Variant::CallError ce;
- const Variant value = Variant::construct(Variant::Type(type->get_selected() + 1), NULL, 0, ce);
-
- String catname = category->get_text().strip_edges();
- String propname = property->get_text().strip_edges();
-
- if (propname.empty()) {
- return;
- }
-
- if (catname.empty()) {
- catname = "global";
- }
-
- String name = catname + "/" + propname;
-
- undo_redo->create_action(TTR("Add Global Property"));
-
- undo_redo->add_do_property(ProjectSettings::get_singleton(), name, value);
-
- if (ProjectSettings::get_singleton()->has_setting(name)) {
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), name, ProjectSettings::get_singleton()->get(name));
- } else {
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), name, Variant());
- }
-
- undo_redo->add_do_method(globals_editor, "update_category_list");
- undo_redo->add_undo_method(globals_editor, "update_category_list");
+ Callable::CallError ce;
+ const Variant value = Variant::construct(Variant::Type(type->get_selected() + 1), nullptr, 0, ce);
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
+ undo_redo->create_action(TTR("Add Project Setting"));
+ undo_redo->add_do_property(ps, setting, value);
+ undo_redo->add_undo_property(ps, setting, ps->has_setting(setting) ? ps->get(setting) : Variant());
+ undo_redo->add_do_method(inspector, "update_category_list");
+ undo_redo->add_undo_method(inspector, "update_category_list");
+ undo_redo->add_do_method(this, "queue_save");
+ undo_redo->add_undo_method(this, "queue_save");
undo_redo->commit_action();
- globals_editor->set_current_section(catname);
-
- _settings_changed();
+ inspector->set_current_section(setting.get_slice("/", 1));
}
-void ProjectSettingsEditor::_item_del() {
+void ProjectSettingsEditor::_delete_setting(bool p_confirmed) {
+ String setting = _get_setting_name();
+ Variant value = ps->get(setting);
+ int order = ps->get_order(setting);
- String path = globals_editor->get_inspector()->get_selected_path();
- if (path == String()) {
- EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!"));
- return;
- }
-
- String property = globals_editor->get_current_section().plus_file(path);
-
- if (!ProjectSettings::get_singleton()->has_setting(property)) {
- EditorNode::get_singleton()->show_warning(vformat(TTR("No property '%s' exists."), property));
- return;
- }
-
- if (ProjectSettings::get_singleton()->get_order(property) < ProjectSettings::NO_BUILTIN_ORDER_BASE) {
- EditorNode::get_singleton()->show_warning(vformat(TTR("Setting '%s' is internal, and it can't be deleted."), property));
+ if (!p_confirmed) {
+ del_confirmation->set_text(vformat(TTR("Are you sure you want to delete '%s'?"), setting));
+ del_confirmation->popup_centered();
return;
}
undo_redo->create_action(TTR("Delete Item"));
- Variant value = ProjectSettings::get_singleton()->get(property);
- int order = ProjectSettings::get_singleton()->get_order(property);
-
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", property);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property, value);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", property, order);
-
- undo_redo->add_do_method(globals_editor, "update_category_list");
- undo_redo->add_undo_method(globals_editor, "update_category_list");
+ undo_redo->add_do_method(ps, "clear", setting);
+ undo_redo->add_undo_method(ps, "set", setting, value);
+ undo_redo->add_undo_method(ps, "set_order", setting, order);
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
+ undo_redo->add_do_method(inspector, "update_category_list");
+ undo_redo->add_undo_method(inspector, "update_category_list");
+ undo_redo->add_do_method(this, "queue_save");
+ undo_redo->add_undo_method(this, "queue_save");
undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::_action_check(String p_action) {
-
- if (p_action == "") {
-
- action_add->set_disabled(true);
- } else {
-
- if (!_validate_action_name(p_action)) {
- action_add_error->set_text(TTR("Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or '\"'."));
- action_add_error->show();
- action_add->set_disabled(true);
- return;
- }
- if (ProjectSettings::get_singleton()->has_setting("input/" + p_action)) {
-
- action_add_error->set_text(vformat(TTR("An action with the name '%s' already exists."), p_action));
- action_add_error->show();
- action_add->set_disabled(true);
- return;
- }
-
- action_add->set_disabled(false);
- }
-
- action_add_error->hide();
+ property_box->clear();
}
-void ProjectSettingsEditor::_action_adds(String) {
-
- if (!action_add->is_disabled()) {
- _action_add();
- }
+void ProjectSettingsEditor::_text_field_changed(const String &p_text) {
+ _update_advanced_bar();
}
-void ProjectSettingsEditor::_action_add() {
-
- Dictionary action;
- action["events"] = Array();
- action["deadzone"] = 0.5f;
- String name = "input/" + action_name->get_text();
- undo_redo->create_action(TTR("Add Input Action"));
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", name);
- undo_redo->add_do_method(this, "_update_actions");
- undo_redo->add_undo_method(this, "_update_actions");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
+void ProjectSettingsEditor::_feature_selected(int p_index) {
+ _update_advanced_bar();
+}
- TreeItem *r = input_editor->get_root();
+void ProjectSettingsEditor::_update_advanced_bar() {
+ const String property_text = property_box->get_text().strip_edges();
- if (!r)
- return;
- r = r->get_children();
- if (!r)
- return;
- while (r->get_next())
- r = r->get_next();
+ String error_msg = "";
+ bool disable_add = true;
+ bool disable_del = true;
- r->select(0);
- input_editor->ensure_cursor_is_visible();
- action_add_error->hide();
- action_name->clear();
-}
+ if (!property_box->get_text().empty()) {
+ const String setting = _get_setting_name();
+ bool setting_exists = ps->has_setting(setting);
+ if (setting_exists) {
+ error_msg = TTR(" - Cannot add already existing setting.");
-void ProjectSettingsEditor::_item_checked(const String &p_item, bool p_check) {
-}
+ disable_del = ps->is_builtin_setting(setting);
+ if (disable_del) {
+ String msg = TTR(" - Cannot delete built-in setting.");
+ error_msg += (error_msg == "") ? msg : "\n" + msg;
+ }
+ } else {
+ bool bad_category = false; // Allow empty string.
+ Vector<String> cats = category_box->get_text().strip_edges().split("/");
+ for (int i = 0; i < cats.size(); i++) {
+ if (!cats[i].is_valid_identifier()) {
+ bad_category = true;
+ error_msg = TTR(" - Invalid category name.");
+ break;
+ }
+ }
-void ProjectSettingsEditor::_save() {
+ disable_add = bad_category;
- Error err = ProjectSettings::get_singleton()->save();
- message->set_text(err != OK ? TTR("Error saving settings.") : TTR("Settings saved OK."));
- message->popup_centered(Size2(300, 100) * EDSCALE);
-}
+ if (!property_text.is_valid_identifier()) {
+ disable_add = true;
+ String msg = TTR(" - Invalid property name.");
+ error_msg += (error_msg == "") ? msg : "\n" + msg;
+ }
+ }
+ }
-void ProjectSettingsEditor::_settings_prop_edited(const String &p_name) {
+ add_button->set_disabled(disable_add);
+ del_button->set_disabled(disable_del);
- // Method needed to discard the mandatory argument of the property_edited signal
- _settings_changed();
+ error_label->set_text(error_msg);
+ error_label->set_visible(error_msg != "");
}
-void ProjectSettingsEditor::_settings_changed() {
+String ProjectSettingsEditor::_get_setting_name() const {
+ const String cat = category_box->get_text();
+ const String name = (cat.empty() ? "global" : cat.strip_edges()).plus_file(property_box->get_text().strip_edges());
+ const String feature = feature_override->get_item_text(feature_override->get_selected());
- timer->start();
-}
-
-void ProjectSettingsEditor::queue_save() {
- _settings_changed();
+ return (feature == "") ? name : (name + "." + feature);
}
-void ProjectSettingsEditor::_copy_to_platform_about_to_show() {
-
+void ProjectSettingsEditor::_add_feature_overrides() {
Set<String> presets;
presets.insert("bptc");
@@ -1018,26 +216,26 @@ void ProjectSettingsEditor::_copy_to_platform_about_to_show() {
presets.insert("standalone");
presets.insert("32");
presets.insert("64");
- // Not available as an export platform yet, so it needs to be added manually
- presets.insert("Server");
+ presets.insert("Server"); // Not available as an export platform yet, so it needs to be added manually
+
+ EditorExport *ee = EditorExport::get_singleton();
- for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) {
+ for (int i = 0; i < ee->get_export_platform_count(); i++) {
List<String> p;
- EditorExport::get_singleton()->get_export_platform(i)->get_platform_features(&p);
+ ee->get_export_platform(i)->get_platform_features(&p);
for (List<String>::Element *E = p.front(); E; E = E->next()) {
presets.insert(E->get());
}
}
- for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) {
-
+ for (int i = 0; i < ee->get_export_preset_count(); i++) {
List<String> p;
- EditorExport::get_singleton()->get_export_preset(i)->get_platform()->get_preset_features(EditorExport::get_singleton()->get_export_preset(i), &p);
+ ee->get_export_preset(i)->get_platform()->get_preset_features(ee->get_export_preset(i), &p);
for (List<String>::Element *E = p.front(); E; E = E->next()) {
presets.insert(E->get());
}
- String custom = EditorExport::get_singleton()->get_export_preset(i)->get_custom_features();
+ String custom = ee->get_export_preset(i)->get_custom_features();
Vector<String> custom_list = custom.split(",");
for (int j = 0; j < custom_list.size(); j++) {
String f = custom_list[j].strip_edges();
@@ -1047,729 +245,69 @@ void ProjectSettingsEditor::_copy_to_platform_about_to_show() {
}
}
- popup_copy_to_feature->get_popup()->clear();
- int id = 0;
+ feature_override->clear();
+ feature_override->add_item("", 0); // So it is always on top.
+ int id = 1;
for (Set<String>::Element *E = presets.front(); E; E = E->next()) {
- popup_copy_to_feature->get_popup()->add_item(E->get(), id++);
+ feature_override->add_item(E->get(), id++);
}
}
-Variant ProjectSettingsEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
- TreeItem *selected = input_editor->get_selected();
- if (!selected || selected->get_parent() != input_editor->get_root())
- return Variant();
-
- String name = selected->get_text(0);
- VBoxContainer *vb = memnew(VBoxContainer);
- HBoxContainer *hb = memnew(HBoxContainer);
- Label *label = memnew(Label(name));
- hb->set_modulate(Color(1, 1, 1, 1.0f));
- hb->add_child(label);
- vb->add_child(hb);
- set_drag_preview(vb);
-
- Dictionary drag_data;
- drag_data["type"] = "nodes";
-
- input_editor->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
-
- return drag_data;
-}
-
-bool ProjectSettingsEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
- Dictionary d = p_data;
- if (!d.has("type") || d["type"] != "nodes")
- return false;
-
- TreeItem *selected = input_editor->get_selected();
- TreeItem *item = input_editor->get_item_at_position(p_point);
- if (!selected || !item || item == selected || item->get_parent() == selected)
- return false;
-
- return true;
-}
-
-void ProjectSettingsEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
- if (!can_drop_data_fw(p_point, p_data, p_from))
- return;
-
- TreeItem *selected = input_editor->get_selected();
- TreeItem *item = input_editor->get_item_at_position(p_point);
- if (!item)
- return;
- TreeItem *target = item->get_parent() == input_editor->get_root() ? item : item->get_parent();
-
- String selected_name = "input/" + selected->get_text(0);
- int old_order = ProjectSettings::get_singleton()->get_order(selected_name);
- String target_name = "input/" + target->get_text(0);
- int target_order = ProjectSettings::get_singleton()->get_order(target_name);
-
- int order = old_order;
- bool is_below = target_order > old_order;
- TreeItem *iterator = is_below ? selected->get_next() : selected->get_prev();
-
- undo_redo->create_action(TTR("Moved Input Action Event"));
- while (iterator != target) {
-
- String iterator_name = "input/" + iterator->get_text(0);
- int iterator_order = ProjectSettings::get_singleton()->get_order(iterator_name);
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", iterator_name, order);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", iterator_name, iterator_order);
- order = iterator_order;
- iterator = is_below ? iterator->get_next() : iterator->get_prev();
- }
-
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", target_name, order);
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", selected_name, target_order);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", target_name, target_order);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", selected_name, old_order);
-
- undo_redo->add_do_method(this, "_update_actions");
- undo_redo->add_undo_method(this, "_update_actions");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::_copy_to_platform(int p_which) {
-
- String path = globals_editor->get_inspector()->get_selected_path();
- if (path == String()) {
- EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!"));
- return;
- }
-
- String property = globals_editor->get_current_section().plus_file(path);
-
- undo_redo->create_action(TTR("Override for Feature"));
-
- Variant value = ProjectSettings::get_singleton()->get(property);
- if (property.find(".") != -1) { //overwriting overwrite, keep overwrite
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", property);
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property, value);
- }
-
- String feature = popup_copy_to_feature->get_popup()->get_item_text(p_which);
- String new_path = property + "." + feature;
-
- undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", new_path, value);
- if (ProjectSettings::get_singleton()->has_setting(new_path)) {
- undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", new_path, ProjectSettings::get_singleton()->get(new_path));
- }
-
- undo_redo->add_do_method(globals_editor, "update_category_list");
- undo_redo->add_undo_method(globals_editor, "update_category_list");
-
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
-
- undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::add_translation(const String &p_translation) {
-
- _translation_add(p_translation);
-}
-
-void ProjectSettingsEditor::_translation_add(const String &p_path) {
-
- PoolStringArray translations = ProjectSettings::get_singleton()->get("locale/translations");
-
- for (int i = 0; i < translations.size(); i++) {
-
- if (translations[i] == p_path)
- return; //exists
- }
-
- translations.push_back(p_path);
- undo_redo->create_action(TTR("Add Translation"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations"));
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::_translation_file_open() {
-
- translation_file_open->popup_centered_ratio();
-}
-
-void ProjectSettingsEditor::_translation_delete(Object *p_item, int p_column, int p_button) {
-
- TreeItem *ti = Object::cast_to<TreeItem>(p_item);
- ERR_FAIL_COND(!ti);
-
- int idx = ti->get_metadata(0);
-
- PoolStringArray translations = ProjectSettings::get_singleton()->get("locale/translations");
-
- ERR_FAIL_INDEX(idx, translations.size());
-
- translations.remove(idx);
-
- undo_redo->create_action(TTR("Remove Translation"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations"));
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::_translation_res_file_open() {
-
- translation_res_file_open->popup_centered_ratio();
-}
-
-void ProjectSettingsEditor::_translation_res_add(const String &p_path) {
-
- Variant prev;
- Dictionary remaps;
-
- if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) {
- remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
- prev = remaps;
- }
-
- if (remaps.has(p_path))
- return; //pointless already has it
-
- remaps[p_path] = PoolStringArray();
-
- undo_redo->create_action(TTR("Add Remapped Path"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", prev);
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::_translation_res_option_file_open() {
-
- translation_res_option_file_open->popup_centered_ratio();
-}
-void ProjectSettingsEditor::_translation_res_option_add(const String &p_path) {
-
- ERR_FAIL_COND(!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps"));
-
- Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
-
- TreeItem *k = translation_remap->get_selected();
- ERR_FAIL_COND(!k);
-
- String key = k->get_metadata(0);
-
- ERR_FAIL_COND(!remaps.has(key));
- PoolStringArray r = remaps[key];
- r.push_back(p_path + ":" + "en");
- remaps[key] = r;
-
- undo_redo->create_action(TTR("Resource Remap Add Remap"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::_translation_res_select() {
-
- if (updating_translations)
- return;
-
- call_deferred("_update_translations");
-}
-
-void ProjectSettingsEditor::_translation_res_option_changed() {
-
- if (updating_translations)
- return;
-
- if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps"))
- return;
-
- Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
-
- TreeItem *k = translation_remap->get_selected();
- ERR_FAIL_COND(!k);
- TreeItem *ed = translation_remap_options->get_edited();
- ERR_FAIL_COND(!ed);
-
- String key = k->get_metadata(0);
- int idx = ed->get_metadata(0);
- String path = ed->get_metadata(1);
- int which = ed->get_range(1);
-
- Vector<String> langs = TranslationServer::get_all_locales();
-
- ERR_FAIL_INDEX(which, langs.size());
-
- ERR_FAIL_COND(!remaps.has(key));
- PoolStringArray r = remaps[key];
- ERR_FAIL_INDEX(idx, r.size());
- if (translation_locales_idxs_remap.size() > which) {
- r.set(idx, path + ":" + langs[translation_locales_idxs_remap[which]]);
- } else {
- r.set(idx, path + ":" + langs[which]);
- }
- remaps[key] = r;
-
- updating_translations = true;
- undo_redo->create_action(TTR("Change Resource Remap Language"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
- updating_translations = false;
-}
-
-void ProjectSettingsEditor::_translation_res_delete(Object *p_item, int p_column, int p_button) {
-
- if (updating_translations)
- return;
-
- if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps"))
- return;
-
- Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
-
- TreeItem *k = Object::cast_to<TreeItem>(p_item);
-
- String key = k->get_metadata(0);
- ERR_FAIL_COND(!remaps.has(key));
-
- remaps.erase(key);
-
- undo_redo->create_action(TTR("Remove Resource Remap"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
-}
-
-void ProjectSettingsEditor::_translation_res_option_delete(Object *p_item, int p_column, int p_button) {
-
- if (updating_translations)
- return;
-
- if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps"))
- return;
-
- Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
-
- TreeItem *k = translation_remap->get_selected();
- ERR_FAIL_COND(!k);
- TreeItem *ed = Object::cast_to<TreeItem>(p_item);
- ERR_FAIL_COND(!ed);
-
- String key = k->get_metadata(0);
- int idx = ed->get_metadata(0);
-
- ERR_FAIL_COND(!remaps.has(key));
- PoolStringArray r = remaps[key];
- ERR_FAIL_INDEX(idx, r.size());
- r.remove(idx);
- remaps[key] = r;
-
- undo_redo->create_action(TTR("Remove Resource Remap Option"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps"));
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
+void ProjectSettingsEditor::_editor_restart() {
+ EditorNode::get_singleton()->save_all_scenes();
+ EditorNode::get_singleton()->restart_editor();
}
-void ProjectSettingsEditor::_translation_filter_option_changed() {
-
- int sel_id = translation_locale_filter_mode->get_selected_id();
- TreeItem *t = translation_filter->get_edited();
- String locale = t->get_tooltip(0);
- bool checked = t->is_checked(0);
-
- Variant prev;
- Array f_locales_all;
-
- if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) {
- f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter");
- prev = f_locales_all;
-
- if (f_locales_all.size() != 2) {
- f_locales_all.clear();
- f_locales_all.append(sel_id);
- f_locales_all.append(Array());
- }
- } else {
- f_locales_all.append(sel_id);
- f_locales_all.append(Array());
- }
-
- Array f_locales = f_locales_all[1];
- int l_idx = f_locales.find(locale);
-
- if (checked) {
- if (l_idx == -1) {
- f_locales.append(locale);
- }
- } else {
- if (l_idx != -1) {
- f_locales.remove(l_idx);
- }
- }
-
- f_locales = f_locales.sort();
-
- undo_redo->create_action(TTR("Changed Locale Filter"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev);
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
+void ProjectSettingsEditor::_editor_restart_request() {
+ restart_container->show();
}
-void ProjectSettingsEditor::_translation_filter_mode_changed(int p_mode) {
-
- int sel_id = translation_locale_filter_mode->get_selected_id();
-
- Variant prev;
- Array f_locales_all;
-
- if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) {
- f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter");
- prev = f_locales_all;
-
- if (f_locales_all.size() != 2) {
- f_locales_all.clear();
- f_locales_all.append(sel_id);
- f_locales_all.append(Array());
- } else {
- f_locales_all[0] = sel_id;
- }
- } else {
- f_locales_all.append(sel_id);
- f_locales_all.append(Array());
- }
-
- undo_redo->create_action(TTR("Changed Locale Filter Mode"));
- undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all);
- undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev);
- undo_redo->add_do_method(this, "_update_translations");
- undo_redo->add_undo_method(this, "_update_translations");
- undo_redo->add_do_method(this, "_settings_changed");
- undo_redo->add_undo_method(this, "_settings_changed");
- undo_redo->commit_action();
+void ProjectSettingsEditor::_editor_restart_close() {
+ restart_container->hide();
}
-void ProjectSettingsEditor::_update_translations() {
-
- //update translations
-
- if (updating_translations)
- return;
-
- updating_translations = true;
-
- translation_list->clear();
- TreeItem *root = translation_list->create_item(NULL);
- translation_list->set_hide_root(true);
- if (ProjectSettings::get_singleton()->has_setting("locale/translations")) {
-
- PoolStringArray translations = ProjectSettings::get_singleton()->get("locale/translations");
- for (int i = 0; i < translations.size(); i++) {
-
- TreeItem *t = translation_list->create_item(root);
- t->set_editable(0, false);
- t->set_text(0, translations[i].replace_first("res://", ""));
- t->set_tooltip(0, translations[i]);
- t->set_metadata(0, i);
- t->add_button(0, get_icon("Remove", "EditorIcons"), 0, false, TTR("Remove"));
- }
- }
-
- Vector<String> langs = TranslationServer::get_all_locales();
- Vector<String> names = TranslationServer::get_all_locale_names();
-
- //update filter tab
- Array l_filter_all;
-
- bool is_arr_empty = true;
- if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) {
-
- l_filter_all = ProjectSettings::get_singleton()->get("locale/locale_filter");
-
- if (l_filter_all.size() == 2) {
-
- translation_locale_filter_mode->select(l_filter_all[0]);
- is_arr_empty = false;
- }
- }
- if (is_arr_empty) {
-
- l_filter_all.append(0);
- l_filter_all.append(Array());
- translation_locale_filter_mode->select(0);
- }
-
- int filter_mode = l_filter_all[0];
- Array l_filter = l_filter_all[1];
-
- int s = names.size();
- bool is_short_list_when_show_all_selected = filter_mode == SHOW_ALL_LOCALES && translation_filter_treeitems.size() < s;
- bool is_full_list_when_show_only_selected = filter_mode == SHOW_ONLY_SELECTED_LOCALES && translation_filter_treeitems.size() == s;
- bool should_recreate_locales_list = is_short_list_when_show_all_selected || is_full_list_when_show_only_selected;
-
- if (!translation_locales_list_created || should_recreate_locales_list) {
-
- translation_locales_list_created = true;
- translation_filter->clear();
- root = translation_filter->create_item(NULL);
- translation_filter->set_hide_root(true);
- translation_filter_treeitems.clear();
- for (int i = 0; i < s; i++) {
- String n = names[i];
- String l = langs[i];
- bool is_checked = l_filter.has(l);
- if (filter_mode == SHOW_ONLY_SELECTED_LOCALES && !is_checked) continue;
-
- TreeItem *t = translation_filter->create_item(root);
- t->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
- t->set_text(0, n);
- t->set_editable(0, true);
- t->set_tooltip(0, l);
- t->set_checked(0, is_checked);
- translation_filter_treeitems.push_back(t);
- }
- } else {
- for (int i = 0; i < translation_filter_treeitems.size(); i++) {
- TreeItem *t = translation_filter_treeitems[i];
- t->set_checked(0, l_filter.has(t->get_tooltip(0)));
- }
- }
-
- //update translation remaps
-
- String remap_selected;
- if (translation_remap->get_selected()) {
- remap_selected = translation_remap->get_selected()->get_metadata(0);
- }
-
- translation_remap->clear();
- translation_remap_options->clear();
- root = translation_remap->create_item(NULL);
- TreeItem *root2 = translation_remap_options->create_item(NULL);
- translation_remap->set_hide_root(true);
- translation_remap_options->set_hide_root(true);
- translation_res_option_add_button->set_disabled(true);
-
- translation_locales_idxs_remap.clear();
- translation_locales_idxs_remap.resize(l_filter.size());
- int fl_idx_count = translation_locales_idxs_remap.size();
-
- String langnames = "";
- int l_idx = 0;
- for (int i = 0; i < names.size(); i++) {
-
- if (filter_mode == SHOW_ONLY_SELECTED_LOCALES && fl_idx_count != 0) {
- if (l_filter.size() > 0) {
-
- if (l_filter.find(langs[i]) != -1) {
- if (langnames.length() > 0)
- langnames += ",";
- langnames += names[i];
- translation_locales_idxs_remap.write[l_idx] = i;
- l_idx++;
- }
- }
- } else {
- if (i > 0)
- langnames += ",";
- langnames += names[i];
- }
- }
-
- if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) {
-
- Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps");
- List<Variant> rk;
- remaps.get_key_list(&rk);
- Vector<String> keys;
- for (List<Variant>::Element *E = rk.front(); E; E = E->next()) {
- keys.push_back(E->get());
- }
- keys.sort();
-
- for (int i = 0; i < keys.size(); i++) {
-
- TreeItem *t = translation_remap->create_item(root);
- t->set_editable(0, false);
- t->set_text(0, keys[i].replace_first("res://", ""));
- t->set_tooltip(0, keys[i]);
- t->set_metadata(0, keys[i]);
- t->add_button(0, get_icon("Remove", "EditorIcons"), 0, false, TTR("Remove"));
- if (keys[i] == remap_selected) {
- t->select(0);
- translation_res_option_add_button->set_disabled(false);
-
- PoolStringArray selected = remaps[keys[i]];
- for (int j = 0; j < selected.size(); j++) {
-
- String s2 = selected[j];
- int qp = s2.find_last(":");
- String path = s2.substr(0, qp);
- String locale = s2.substr(qp + 1, s2.length());
-
- TreeItem *t2 = translation_remap_options->create_item(root2);
- t2->set_editable(0, false);
- t2->set_text(0, path.replace_first("res://", ""));
- t2->set_tooltip(0, path);
- t2->set_metadata(0, j);
- t2->add_button(0, get_icon("Remove", "EditorIcons"), 0, false, TTR("Remove"));
- t2->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
- t2->set_text(1, langnames);
- t2->set_editable(1, true);
- t2->set_metadata(1, path);
- int idx = langs.find(locale);
- if (idx < 0)
- idx = 0;
-
- int f_idx = translation_locales_idxs_remap.find(idx);
- if (f_idx != -1 && fl_idx_count > 0 && filter_mode == SHOW_ONLY_SELECTED_LOCALES) {
-
- t2->set_range(1, f_idx);
- } else {
-
- t2->set_range(1, idx);
- }
+void ProjectSettingsEditor::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (!is_visible()) {
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", Rect2(get_position(), get_size()));
+ if (advanced->is_pressed()) {
+ advanced->set_pressed(false);
+ advanced_bar->hide();
}
}
- }
- }
-
- updating_translations = false;
-}
-
-void ProjectSettingsEditor::_toggle_search_bar(bool p_pressed) {
-
- globals_editor->get_inspector()->set_use_filter(p_pressed);
+ } break;
+ case NOTIFICATION_ENTER_TREE: {
+ inspector->edit(ps);
- if (p_pressed) {
+ error_label->add_theme_color_override("font_color", error_label->get_theme_color("error_color", "Editor"));
+ add_button->set_icon(get_theme_icon("Add", "EditorIcons"));
+ del_button->set_icon(get_theme_icon("Remove", "EditorIcons"));
- search_bar->show();
- add_prop_bar->hide();
- search_box->grab_focus();
- search_box->select_all();
- } else {
+ search_box->set_right_icon(get_theme_icon("Search", "EditorIcons"));
+ search_box->set_clear_button_enabled(true);
- search_box->clear();
- search_bar->hide();
- add_prop_bar->show();
+ restart_close_button->set_icon(get_theme_icon("Close", "EditorIcons"));
+ restart_container->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));
+ restart_icon->set_texture(get_theme_icon("StatusWarning", "EditorIcons"));
+ restart_label->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor"));
+ } break;
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+ search_box->set_right_icon(get_theme_icon("Search", "EditorIcons"));
+ search_box->set_clear_button_enabled(true);
+ } break;
}
}
-void ProjectSettingsEditor::set_plugins_page() {
-
- tab_container->set_current_tab(plugin_settings->get_index());
-}
-
-TabContainer *ProjectSettingsEditor::get_tabs() {
-
- return tab_container;
-}
-
-void ProjectSettingsEditor::_editor_restart() {
- EditorNode::get_singleton()->save_all_scenes();
- EditorNode::get_singleton()->restart_editor();
-}
-
-void ProjectSettingsEditor::_editor_restart_request() {
- restart_container->show();
-}
-
-void ProjectSettingsEditor::_editor_restart_close() {
- restart_container->hide();
-}
-
void ProjectSettingsEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_unhandled_input"), &ProjectSettingsEditor::_unhandled_input);
- ClassDB::bind_method(D_METHOD("_item_selected"), &ProjectSettingsEditor::_item_selected);
- ClassDB::bind_method(D_METHOD("_item_add"), &ProjectSettingsEditor::_item_add);
- ClassDB::bind_method(D_METHOD("_item_adds"), &ProjectSettingsEditor::_item_adds);
- ClassDB::bind_method(D_METHOD("_item_del"), &ProjectSettingsEditor::_item_del);
- ClassDB::bind_method(D_METHOD("_item_checked"), &ProjectSettingsEditor::_item_checked);
- ClassDB::bind_method(D_METHOD("_save"), &ProjectSettingsEditor::_save);
- ClassDB::bind_method(D_METHOD("_action_add"), &ProjectSettingsEditor::_action_add);
- ClassDB::bind_method(D_METHOD("_action_adds"), &ProjectSettingsEditor::_action_adds);
- ClassDB::bind_method(D_METHOD("_action_check"), &ProjectSettingsEditor::_action_check);
- ClassDB::bind_method(D_METHOD("_action_selected"), &ProjectSettingsEditor::_action_selected);
- ClassDB::bind_method(D_METHOD("_action_edited"), &ProjectSettingsEditor::_action_edited);
- ClassDB::bind_method(D_METHOD("_action_activated"), &ProjectSettingsEditor::_action_activated);
- ClassDB::bind_method(D_METHOD("_action_button_pressed"), &ProjectSettingsEditor::_action_button_pressed);
- ClassDB::bind_method(D_METHOD("_update_actions"), &ProjectSettingsEditor::_update_actions);
- ClassDB::bind_method(D_METHOD("_wait_for_key"), &ProjectSettingsEditor::_wait_for_key);
- ClassDB::bind_method(D_METHOD("_add_item"), &ProjectSettingsEditor::_add_item, DEFVAL(Variant()));
- ClassDB::bind_method(D_METHOD("_device_input_add"), &ProjectSettingsEditor::_device_input_add);
- ClassDB::bind_method(D_METHOD("_press_a_key_confirm"), &ProjectSettingsEditor::_press_a_key_confirm);
- ClassDB::bind_method(D_METHOD("_settings_prop_edited"), &ProjectSettingsEditor::_settings_prop_edited);
- ClassDB::bind_method(D_METHOD("_copy_to_platform"), &ProjectSettingsEditor::_copy_to_platform);
- ClassDB::bind_method(D_METHOD("_update_translations"), &ProjectSettingsEditor::_update_translations);
- ClassDB::bind_method(D_METHOD("_translation_delete"), &ProjectSettingsEditor::_translation_delete);
- ClassDB::bind_method(D_METHOD("_settings_changed"), &ProjectSettingsEditor::_settings_changed);
- ClassDB::bind_method(D_METHOD("_translation_add"), &ProjectSettingsEditor::_translation_add);
- ClassDB::bind_method(D_METHOD("_translation_file_open"), &ProjectSettingsEditor::_translation_file_open);
-
- ClassDB::bind_method(D_METHOD("_translation_res_add"), &ProjectSettingsEditor::_translation_res_add);
- ClassDB::bind_method(D_METHOD("_translation_res_file_open"), &ProjectSettingsEditor::_translation_res_file_open);
- ClassDB::bind_method(D_METHOD("_translation_res_option_add"), &ProjectSettingsEditor::_translation_res_option_add);
- ClassDB::bind_method(D_METHOD("_translation_res_option_file_open"), &ProjectSettingsEditor::_translation_res_option_file_open);
- ClassDB::bind_method(D_METHOD("_translation_res_select"), &ProjectSettingsEditor::_translation_res_select);
- ClassDB::bind_method(D_METHOD("_translation_res_option_changed"), &ProjectSettingsEditor::_translation_res_option_changed);
- ClassDB::bind_method(D_METHOD("_translation_res_delete"), &ProjectSettingsEditor::_translation_res_delete);
- ClassDB::bind_method(D_METHOD("_translation_res_option_delete"), &ProjectSettingsEditor::_translation_res_option_delete);
-
- ClassDB::bind_method(D_METHOD("_translation_filter_option_changed"), &ProjectSettingsEditor::_translation_filter_option_changed);
- ClassDB::bind_method(D_METHOD("_translation_filter_mode_changed"), &ProjectSettingsEditor::_translation_filter_mode_changed);
-
- ClassDB::bind_method(D_METHOD("_toggle_search_bar"), &ProjectSettingsEditor::_toggle_search_bar);
-
- ClassDB::bind_method(D_METHOD("_copy_to_platform_about_to_show"), &ProjectSettingsEditor::_copy_to_platform_about_to_show);
-
- ClassDB::bind_method(D_METHOD("_editor_restart_request"), &ProjectSettingsEditor::_editor_restart_request);
- ClassDB::bind_method(D_METHOD("_editor_restart"), &ProjectSettingsEditor::_editor_restart);
- ClassDB::bind_method(D_METHOD("_editor_restart_close"), &ProjectSettingsEditor::_editor_restart_close);
-
- ClassDB::bind_method(D_METHOD("get_tabs"), &ProjectSettingsEditor::get_tabs);
-
- ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &ProjectSettingsEditor::get_drag_data_fw);
- ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &ProjectSettingsEditor::can_drop_data_fw);
- ClassDB::bind_method(D_METHOD("drop_data_fw"), &ProjectSettingsEditor::drop_data_fw);
+ ClassDB::bind_method(D_METHOD("queue_save"), &ProjectSettingsEditor::queue_save);
}
ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
-
singleton = this;
set_title(TTR("Project Settings (project.godot)"));
- set_resizable(true);
+
+ ps = ProjectSettings::get_singleton();
undo_redo = &p_data->get_undo_redo();
data = p_data;
@@ -1778,348 +316,152 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
tab_container->set_use_hidden_tabs_for_min_size(true);
add_child(tab_container);
- VBoxContainer *props_base = memnew(VBoxContainer);
- props_base->set_alignment(BoxContainer::ALIGN_BEGIN);
- props_base->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- tab_container->add_child(props_base);
- props_base->set_name(TTR("General"));
-
- HBoxContainer *hbc = memnew(HBoxContainer);
- hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- props_base->add_child(hbc);
-
- search_button = memnew(Button);
- search_button->set_toggle_mode(true);
- search_button->set_pressed(false);
- search_button->set_text(TTR("Search"));
- hbc->add_child(search_button);
- search_button->connect("toggled", this, "_toggle_search_bar");
-
- hbc->add_child(memnew(VSeparator));
-
- add_prop_bar = memnew(HBoxContainer);
- add_prop_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- hbc->add_child(add_prop_bar);
-
- Label *l = memnew(Label);
- add_prop_bar->add_child(l);
- l->set_text(TTR("Category:"));
-
- category = memnew(LineEdit);
- category->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- add_prop_bar->add_child(category);
- category->connect("text_entered", this, "_item_adds");
-
- l = memnew(Label);
- add_prop_bar->add_child(l);
- l->set_text(TTR("Property:"));
-
- property = memnew(LineEdit);
- property->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- add_prop_bar->add_child(property);
- property->connect("text_entered", this, "_item_adds");
-
- l = memnew(Label);
- add_prop_bar->add_child(l);
- l->set_text(TTR("Type:"));
-
- type = memnew(OptionButton);
- type->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- add_prop_bar->add_child(type);
-
- // Start at 1 to avoid adding "Nil" as an option
- for (int i = 1; i < Variant::VARIANT_MAX; i++) {
- type->add_item(Variant::get_type_name(Variant::Type(i)));
- }
+ VBoxContainer *general_editor = memnew(VBoxContainer);
+ general_editor->set_name(TTR("General"));
+ general_editor->set_alignment(BoxContainer::ALIGN_BEGIN);
+ general_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tab_container->add_child(general_editor);
+
+ VBoxContainer *header = memnew(VBoxContainer);
+ header->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ general_editor->add_child(header);
+
+ {
+ // Search bar.
+ search_bar = memnew(HBoxContainer);
+ search_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ header->add_child(search_bar);
- Button *add = memnew(Button);
- add_prop_bar->add_child(add);
- add->set_text(TTR("Add"));
- add->connect("pressed", this, "_item_add");
+ search_box = memnew(LineEdit);
+ search_box->set_placeholder(TTR("Search"));
+ search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ search_bar->add_child(search_box);
- search_bar = memnew(HBoxContainer);
- search_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- hbc->add_child(search_bar);
- search_bar->hide();
+ advanced = memnew(CheckButton);
+ advanced->set_text(TTR("Advanced"));
+ advanced->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_advanced_pressed));
+ search_bar->add_child(advanced);
+ }
- search_box = memnew(LineEdit);
- search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- search_bar->add_child(search_box);
+ {
+ // Advanced bar.
+ advanced_bar = memnew(VBoxContainer);
+ advanced_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ advanced_bar->hide();
+ header->add_child(advanced_bar);
+
+ advanced_bar->add_child(memnew(HSeparator));
+
+ HBoxContainer *hbc = memnew(HBoxContainer);
+ hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ advanced_bar->add_margin_child(TTR("Add or Remove Custom Project Settings:"), hbc, true);
+
+ category_box = memnew(LineEdit);
+ category_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ category_box->connect("text_changed", callable_mp(this, &ProjectSettingsEditor::_text_field_changed));
+ category_box->set_placeholder(TTR("Category"));
+ hbc->add_child(category_box);
+
+ Label *l = memnew(Label);
+ l->set_text("/");
+ hbc->add_child(l);
+
+ property_box = memnew(LineEdit);
+ property_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ property_box->set_placeholder(TTR("Property"));
+ property_box->connect("text_changed", callable_mp(this, &ProjectSettingsEditor::_text_field_changed));
+ hbc->add_child(property_box);
+
+ l = memnew(Label);
+ l->set_text(TTR("Type:"));
+ hbc->add_child(l);
+
+ type = memnew(OptionButton);
+ type->set_custom_minimum_size(Size2(100, 0) * EDSCALE);
+ hbc->add_child(type);
+
+ // Start at 1 to avoid adding "Nil" as an option
+ for (int i = 1; i < Variant::VARIANT_MAX; i++) {
+ type->add_item(Variant::get_type_name(Variant::Type(i)));
+ }
- globals_editor = memnew(SectionedInspector);
- props_base->add_child(globals_editor);
- globals_editor->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
- globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- globals_editor->register_search_box(search_box);
- globals_editor->get_inspector()->connect("property_selected", this, "_item_selected");
- globals_editor->get_inspector()->connect("property_edited", this, "_settings_prop_edited");
- globals_editor->get_inspector()->connect("restart_requested", this, "_editor_restart_request");
+ l = memnew(Label);
+ l->set_text(TTR("Feature Override:"));
+ hbc->add_child(l);
- Button *del = memnew(Button);
- hbc->add_child(del);
- del->set_text(TTR("Delete"));
- del->connect("pressed", this, "_item_del");
+ feature_override = memnew(OptionButton);
+ feature_override->set_custom_minimum_size(Size2(100, 0) * EDSCALE);
+ feature_override->connect("item_selected", callable_mp(this, &ProjectSettingsEditor::_feature_selected));
+ hbc->add_child(feature_override);
- add_prop_bar->add_child(memnew(VSeparator));
+ add_button = memnew(Button);
+ add_button->set_flat(true);
+ add_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_add_setting));
+ hbc->add_child(add_button);
- popup_copy_to_feature = memnew(MenuButton);
- popup_copy_to_feature->set_text(TTR("Override For..."));
- popup_copy_to_feature->set_disabled(true);
- add_prop_bar->add_child(popup_copy_to_feature);
+ del_button = memnew(Button);
+ del_button->set_flat(true);
+ del_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(false));
+ hbc->add_child(del_button);
- popup_copy_to_feature->get_popup()->connect("id_pressed", this, "_copy_to_platform");
- popup_copy_to_feature->get_popup()->connect("about_to_show", this, "_copy_to_platform_about_to_show");
+ error_label = memnew(Label);
+ advanced_bar->add_child(error_label);
+ }
- get_ok()->set_text(TTR("Close"));
- set_hide_on_ok(true);
+ inspector = memnew(SectionedInspector);
+ inspector->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
+ inspector->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ inspector->register_search_box(search_box);
+ inspector->get_inspector()->connect("property_selected", callable_mp(this, &ProjectSettingsEditor::_setting_selected));
+ inspector->get_inspector()->connect("property_edited", callable_mp(this, &ProjectSettingsEditor::_setting_edited));
+ inspector->get_inspector()->connect("restart_requested", callable_mp(this, &ProjectSettingsEditor::_editor_restart_request));
+ general_editor->add_child(inspector);
restart_container = memnew(PanelContainer);
- props_base->add_child(restart_container);
+ general_editor->add_child(restart_container);
+
HBoxContainer *restart_hb = memnew(HBoxContainer);
+ restart_container->hide();
restart_container->add_child(restart_hb);
+
restart_icon = memnew(TextureRect);
- restart_icon->set_v_size_flags(SIZE_SHRINK_CENTER);
+ restart_icon->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
restart_hb->add_child(restart_icon);
+
restart_label = memnew(Label);
- restart_label->set_text(TTR("The editor must be restarted for changes to take effect."));
+ restart_label->set_text(TTR("Changed settings will be applied to the editor after restarting."));
restart_hb->add_child(restart_label);
restart_hb->add_spacer();
+
Button *restart_button = memnew(Button);
- restart_button->connect("pressed", this, "_editor_restart");
+ restart_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart));
restart_hb->add_child(restart_button);
restart_button->set_text(TTR("Save & Restart"));
- restart_close_button = memnew(ToolButton);
- restart_close_button->connect("pressed", this, "_editor_restart_close");
+
+ restart_close_button = memnew(Button);
+ restart_close_button->set_flat(true);
+ restart_close_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart_close));
restart_hb->add_child(restart_close_button);
- restart_container->hide();
- message = memnew(AcceptDialog);
- add_child(message);
-
- Control *input_base = memnew(Control);
- input_base->set_name(TTR("Input Map"));
- tab_container->add_child(input_base);
-
- VBoxContainer *vbc = memnew(VBoxContainer);
- input_base->add_child(vbc);
- vbc->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 0);
- vbc->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, 0);
- vbc->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 0);
- vbc->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, 0);
-
- hbc = memnew(HBoxContainer);
- vbc->add_child(hbc);
-
- l = memnew(Label);
- hbc->add_child(l);
- l->set_text(TTR("Action:"));
-
- action_name = memnew(LineEdit);
- action_name->set_h_size_flags(SIZE_EXPAND_FILL);
- hbc->add_child(action_name);
- action_name->connect("text_entered", this, "_action_adds");
- action_name->connect("text_changed", this, "_action_check");
-
- action_add_error = memnew(Label);
- hbc->add_child(action_add_error);
- action_add_error->hide();
-
- add = memnew(Button);
- hbc->add_child(add);
- add->set_text(TTR("Add"));
- add->set_disabled(true);
- add->connect("pressed", this, "_action_add");
- action_add = add;
-
- input_editor = memnew(Tree);
- vbc->add_child(input_editor);
- input_editor->set_v_size_flags(SIZE_EXPAND_FILL);
- input_editor->set_columns(3);
- input_editor->set_column_titles_visible(true);
- input_editor->set_column_title(0, TTR("Action"));
- input_editor->set_column_title(1, TTR("Deadzone"));
- input_editor->set_column_expand(1, false);
- input_editor->set_column_min_width(1, 80 * EDSCALE);
- input_editor->set_column_expand(2, false);
- input_editor->set_column_min_width(2, 50 * EDSCALE);
- input_editor->connect("item_edited", this, "_action_edited");
- input_editor->connect("item_activated", this, "_action_activated");
- input_editor->connect("cell_selected", this, "_action_selected");
- input_editor->connect("button_pressed", this, "_action_button_pressed");
- input_editor->set_drag_forwarding(this);
-
- popup_add = memnew(PopupMenu);
- add_child(popup_add);
- popup_add->connect("id_pressed", this, "_add_item");
-
- press_a_key = memnew(ConfirmationDialog);
- press_a_key->set_focus_mode(FOCUS_ALL);
- add_child(press_a_key);
-
- l = memnew(Label);
- l->set_text(TTR("Press a Key..."));
- l->set_anchors_and_margins_preset(Control::PRESET_WIDE);
- l->set_align(Label::ALIGN_CENTER);
- l->set_margin(MARGIN_TOP, 20);
- l->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_BEGIN, 30);
- press_a_key->get_ok()->set_disabled(true);
- press_a_key_label = l;
- press_a_key->add_child(l);
- press_a_key->connect("gui_input", this, "_wait_for_key");
- press_a_key->connect("confirmed", this, "_press_a_key_confirm");
-
- device_input = memnew(ConfirmationDialog);
- add_child(device_input);
- device_input->get_ok()->set_text(TTR("Add"));
- device_input->connect("confirmed", this, "_device_input_add");
-
- hbc = memnew(HBoxContainer);
- device_input->add_child(hbc);
-
- VBoxContainer *vbc_left = memnew(VBoxContainer);
- hbc->add_child(vbc_left);
-
- l = memnew(Label);
- l->set_text(TTR("Device:"));
- vbc_left->add_child(l);
-
- device_id = memnew(OptionButton);
- for (int i = -1; i < 8; i++)
- device_id->add_item(_get_device_string(i));
- _set_current_device(0);
- vbc_left->add_child(device_id);
-
- VBoxContainer *vbc_right = memnew(VBoxContainer);
- hbc->add_child(vbc_right);
- vbc_right->set_h_size_flags(SIZE_EXPAND_FILL);
-
- l = memnew(Label);
- l->set_text(TTR("Index:"));
- vbc_right->add_child(l);
- device_index_label = l;
-
- device_index = memnew(OptionButton);
- vbc_right->add_child(device_index);
-
- setting = false;
-
- //translations
- TabContainer *translations = memnew(TabContainer);
- translations->set_tab_align(TabContainer::ALIGN_LEFT);
- translations->set_name(TTR("Localization"));
- tab_container->add_child(translations);
- //remap for properly select language in popup
- translation_locales_idxs_remap = Vector<int>();
- translation_locales_list_created = false;
+ inputmap_editor = memnew(InputMapEditor);
+ inputmap_editor->set_name(TTR("Input Map"));
+ inputmap_editor->connect("inputmap_changed", callable_mp(this, &ProjectSettingsEditor::queue_save));
+ tab_container->add_child(inputmap_editor);
- {
-
- VBoxContainer *tvb = memnew(VBoxContainer);
- translations->add_child(tvb);
- tvb->set_name(TTR("Translations"));
- HBoxContainer *thb = memnew(HBoxContainer);
- tvb->add_child(thb);
- thb->add_child(memnew(Label(TTR("Translations:"))));
- thb->add_spacer();
- Button *addtr = memnew(Button(TTR("Add...")));
- addtr->connect("pressed", this, "_translation_file_open");
- thb->add_child(addtr);
- VBoxContainer *tmc = memnew(VBoxContainer);
- tvb->add_child(tmc);
- tmc->set_v_size_flags(SIZE_EXPAND_FILL);
- translation_list = memnew(Tree);
- translation_list->set_v_size_flags(SIZE_EXPAND_FILL);
- tmc->add_child(translation_list);
-
- translation_file_open = memnew(EditorFileDialog);
- add_child(translation_file_open);
- translation_file_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- translation_file_open->connect("file_selected", this, "_translation_add");
- }
-
- {
- VBoxContainer *tvb = memnew(VBoxContainer);
- translations->add_child(tvb);
- tvb->set_name(TTR("Remaps"));
- HBoxContainer *thb = memnew(HBoxContainer);
- tvb->add_child(thb);
- thb->add_child(memnew(Label(TTR("Resources:"))));
- thb->add_spacer();
- Button *addtr = memnew(Button(TTR("Add...")));
- addtr->connect("pressed", this, "_translation_res_file_open");
- thb->add_child(addtr);
- VBoxContainer *tmc = memnew(VBoxContainer);
- tvb->add_child(tmc);
- tmc->set_v_size_flags(SIZE_EXPAND_FILL);
- translation_remap = memnew(Tree);
- translation_remap->set_v_size_flags(SIZE_EXPAND_FILL);
- translation_remap->connect("cell_selected", this, "_translation_res_select");
- tmc->add_child(translation_remap);
- translation_remap->connect("button_pressed", this, "_translation_res_delete");
-
- translation_res_file_open = memnew(EditorFileDialog);
- add_child(translation_res_file_open);
- translation_res_file_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- translation_res_file_open->connect("file_selected", this, "_translation_res_add");
-
- thb = memnew(HBoxContainer);
- tvb->add_child(thb);
- thb->add_child(memnew(Label(TTR("Remaps by Locale:"))));
- thb->add_spacer();
- addtr = memnew(Button(TTR("Add...")));
- addtr->connect("pressed", this, "_translation_res_option_file_open");
- translation_res_option_add_button = addtr;
- thb->add_child(addtr);
- tmc = memnew(VBoxContainer);
- tvb->add_child(tmc);
- tmc->set_v_size_flags(SIZE_EXPAND_FILL);
- translation_remap_options = memnew(Tree);
- translation_remap_options->set_v_size_flags(SIZE_EXPAND_FILL);
- tmc->add_child(translation_remap_options);
-
- translation_remap_options->set_columns(2);
- translation_remap_options->set_column_title(0, TTR("Path"));
- translation_remap_options->set_column_title(1, TTR("Locale"));
- translation_remap_options->set_column_titles_visible(true);
- translation_remap_options->set_column_expand(0, true);
- translation_remap_options->set_column_expand(1, false);
- translation_remap_options->set_column_min_width(1, 200);
- translation_remap_options->connect("item_edited", this, "_translation_res_option_changed");
- translation_remap_options->connect("button_pressed", this, "_translation_res_option_delete");
-
- translation_res_option_file_open = memnew(EditorFileDialog);
- add_child(translation_res_option_file_open);
- translation_res_option_file_open->set_mode(EditorFileDialog::MODE_OPEN_FILE);
- translation_res_option_file_open->connect("file_selected", this, "_translation_res_option_add");
- }
-
- {
- VBoxContainer *tvb = memnew(VBoxContainer);
- translations->add_child(tvb);
- tvb->set_name(TTR("Locales Filter"));
- VBoxContainer *tmc = memnew(VBoxContainer);
- tmc->set_v_size_flags(SIZE_EXPAND_FILL);
- tvb->add_child(tmc);
-
- translation_locale_filter_mode = memnew(OptionButton);
- translation_locale_filter_mode->add_item(TTR("Show All Locales"), SHOW_ALL_LOCALES);
- translation_locale_filter_mode->add_item(TTR("Show Selected Locales Only"), SHOW_ONLY_SELECTED_LOCALES);
- translation_locale_filter_mode->select(0);
- tmc->add_margin_child(TTR("Filter mode:"), translation_locale_filter_mode);
- translation_locale_filter_mode->connect("item_selected", this, "_translation_filter_mode_changed");
-
- translation_filter = memnew(Tree);
- translation_filter->set_v_size_flags(SIZE_EXPAND_FILL);
- translation_filter->set_columns(1);
- tmc->add_child(memnew(Label(TTR("Locales:"))));
- tmc->add_child(translation_filter);
- translation_filter->connect("item_edited", this, "_translation_filter_option_changed");
- }
+ localization_editor = memnew(LocalizationEditor);
+ localization_editor->set_name(TTR("Localization"));
+ localization_editor->connect("localization_changed", callable_mp(this, &ProjectSettingsEditor::queue_save));
+ tab_container->add_child(localization_editor);
autoload_settings = memnew(EditorAutoloadSettings);
autoload_settings->set_name(TTR("AutoLoad"));
+ autoload_settings->connect("autoload_changed", callable_mp(this, &ProjectSettingsEditor::queue_save));
tab_container->add_child(autoload_settings);
- autoload_settings->connect("autoload_changed", this, "_settings_changed");
+
+ shaders_global_variables_editor = memnew(ShaderGlobalsEditor);
+ shaders_global_variables_editor->set_name(TTR("Shader Globals"));
+ shaders_global_variables_editor->connect("globals_changed", callable_mp(this, &ProjectSettingsEditor::queue_save));
+ tab_container->add_child(shaders_global_variables_editor);
plugin_settings = memnew(EditorPluginSettings);
plugin_settings->set_name(TTR("Plugins"));
@@ -2127,9 +469,14 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
timer = memnew(Timer);
timer->set_wait_time(1.5);
- timer->connect("timeout", ProjectSettings::get_singleton(), "save");
+ timer->connect("timeout", callable_mp(ps, &ProjectSettings::save));
timer->set_one_shot(true);
add_child(timer);
- updating_translations = false;
+ del_confirmation = memnew(ConfirmationDialog);
+ del_confirmation->connect("confirmed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(true));
+ add_child(del_confirmation);
+
+ get_ok()->set_text(TTR("Close"));
+ set_hide_on_ok(true);
}
diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h
index 5755b258c3..4ecd28e514 100644
--- a/editor/project_settings_editor.h
+++ b/editor/project_settings_editor.h
@@ -28,178 +28,99 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef PROJECT_SETTINGS_H
-#define PROJECT_SETTINGS_H
+#ifndef PROJECT_SETTINGS_EDITOR_H
+#define PROJECT_SETTINGS_EDITOR_H
#include "core/undo_redo.h"
-#include "editor/editor_autoload_settings.h"
#include "editor/editor_data.h"
#include "editor/editor_plugin_settings.h"
#include "editor/editor_sectioned_inspector.h"
-#include "scene/gui/dialogs.h"
+#include "editor/input_map_editor.h"
+#include "editor/localization_editor.h"
+#include "editor/shader_globals_editor.h"
+#include "editor_autoload_settings.h"
#include "scene/gui/tab_container.h"
class ProjectSettingsEditor : public AcceptDialog {
-
GDCLASS(ProjectSettingsEditor, AcceptDialog);
enum InputType {
INPUT_KEY,
+ INPUT_KEY_PHYSICAL,
INPUT_JOY_BUTTON,
INPUT_JOY_MOTION,
INPUT_MOUSE_BUTTON
};
- enum LocaleFilter {
- SHOW_ALL_LOCALES,
- SHOW_ONLY_SELECTED_LOCALES,
- };
-
- TabContainer *tab_container;
-
+ static ProjectSettingsEditor *singleton;
+ ProjectSettings *ps;
Timer *timer;
- InputType add_type;
- String add_at;
- int edit_idx;
- EditorData *data;
- UndoRedo *undo_redo;
- SectionedInspector *globals_editor;
+ TabContainer *tab_container;
+ SectionedInspector *inspector;
+ InputMapEditor *inputmap_editor;
+ LocalizationEditor *localization_editor;
+ EditorAutoloadSettings *autoload_settings;
+ ShaderGlobalsEditor *shaders_global_variables_editor;
+ EditorPluginSettings *plugin_settings;
HBoxContainer *search_bar;
- Button *search_button;
LineEdit *search_box;
+ CheckButton *advanced;
- HBoxContainer *add_prop_bar;
- AcceptDialog *message;
- LineEdit *category;
- LineEdit *property;
+ VBoxContainer *advanced_bar;
+ LineEdit *category_box;
+ LineEdit *property_box;
+ Button *add_button;
+ Button *del_button;
OptionButton *type;
- PopupMenu *popup_add;
- ConfirmationDialog *press_a_key;
- Label *press_a_key_label;
- ConfirmationDialog *device_input;
- OptionButton *device_id;
- OptionButton *device_index;
- Label *device_index_label;
- MenuButton *popup_copy_to_feature;
-
- LineEdit *action_name;
- Button *action_add;
- Label *action_add_error;
- Tree *input_editor;
- bool setting;
- bool updating_translations;
-
- Ref<InputEventKey> last_wait_for_key;
-
- EditorFileDialog *translation_file_open;
- Tree *translation_list;
-
- Button *translation_res_option_add_button;
- EditorFileDialog *translation_res_file_open;
- EditorFileDialog *translation_res_option_file_open;
- Tree *translation_remap;
- Tree *translation_remap_options;
- Tree *translation_filter;
- bool translation_locales_list_created;
- OptionButton *translation_locale_filter_mode;
- Vector<TreeItem *> translation_filter_treeitems;
- Vector<int> translation_locales_idxs_remap;
-
- EditorAutoloadSettings *autoload_settings;
-
- EditorPluginSettings *plugin_settings;
-
- void _item_selected(const String &);
- void _item_adds(String);
- void _item_add();
- void _item_del();
- void _update_actions();
- void _save();
- void _add_item(int p_item, Ref<InputEvent> p_exiting_event = NULL);
- void _edit_item(Ref<InputEvent> p_exiting_event);
-
- void _action_check(String p_action);
- void _action_adds(String);
- void _action_add();
- void _device_input_add();
-
- void _item_checked(const String &p_item, bool p_check);
- void _action_selected();
- void _action_edited();
- void _action_activated();
- void _action_button_pressed(Object *p_obj, int p_column, int p_id);
- void _wait_for_key(const Ref<InputEvent> &p_event);
- void _press_a_key_confirm();
- void _show_last_added(const Ref<InputEvent> &p_event, const String &p_name);
-
- void _settings_prop_edited(const String &p_name);
- void _settings_changed();
-
- void _copy_to_platform(int p_which);
-
- void _translation_file_open();
- void _translation_add(const String &p_path);
- void _translation_delete(Object *p_item, int p_column, int p_button);
- void _update_translations();
-
- void _translation_res_file_open();
- void _translation_res_add(const String &p_path);
- void _translation_res_delete(Object *p_item, int p_column, int p_button);
- void _translation_res_select();
- void _translation_res_option_file_open();
- void _translation_res_option_add(const String &p_path);
- void _translation_res_option_changed();
- void _translation_res_option_delete(Object *p_item, int p_column, int p_button);
-
- void _translation_filter_option_changed();
- void _translation_filter_mode_changed(int p_mode);
-
- void _toggle_search_bar(bool p_pressed);
-
- Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
- bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
- void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
-
- void _copy_to_platform_about_to_show();
+ OptionButton *feature_override;
+ Label *error_label;
- ProjectSettingsEditor();
-
- static ProjectSettingsEditor *singleton;
+ ConfirmationDialog *del_confirmation;
Label *restart_label;
TextureRect *restart_icon;
PanelContainer *restart_container;
- ToolButton *restart_close_button;
+ Button *restart_close_button;
+
+ EditorData *data;
+ UndoRedo *undo_redo;
+
+ void _advanced_pressed();
+ void _update_advanced_bar();
+ void _text_field_changed(const String &p_text);
+ void _feature_selected(int p_index);
+
+ String _get_setting_name() const;
+ void _setting_edited(const String &p_name);
+ void _setting_selected(const String &p_path);
+ void _add_setting();
+ void _delete_setting(bool p_confirmed);
void _editor_restart_request();
void _editor_restart();
void _editor_restart_close();
+ void _add_feature_overrides();
+ ProjectSettingsEditor();
+
protected:
- void _unhandled_input(const Ref<InputEvent> &p_event);
void _notification(int p_what);
static void _bind_methods();
- int _get_current_device();
- void _set_current_device(int i_device);
- String _get_device_string(int i_device);
-
public:
- void add_translation(const String &p_translation);
static ProjectSettingsEditor *get_singleton() { return singleton; }
void popup_project_settings();
void set_plugins_page();
void update_plugins();
EditorAutoloadSettings *get_autoload_settings() { return autoload_settings; }
-
- TabContainer *get_tabs();
+ TabContainer *get_tabs() { return tab_container; }
void queue_save();
ProjectSettingsEditor(EditorData *p_data);
};
-#endif // PROJECT_SETTINGS_H
+#endif // PROJECT_SETTINGS_EDITOR_H
diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp
index 2dcbc4c14c..cb56358ae6 100644
--- a/editor/property_editor.cpp
+++ b/editor/property_editor.cpp
@@ -31,11 +31,11 @@
#include "property_editor.h"
#include "core/class_db.h"
+#include "core/input/input.h"
#include "core/io/image_loader.h"
#include "core/io/marshalls.h"
#include "core/io/resource_loader.h"
#include "core/math/expression.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/pair.h"
#include "core/print_string.h"
@@ -53,13 +53,12 @@
#include "editor/multi_node_edit.h"
#include "editor/property_selector.h"
#include "scene/gui/label.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/resources/font.h"
#include "scene/resources/packed_scene.h"
#include "scene/scene_string_names.h"
void EditorResourceConversionPlugin::_bind_methods() {
-
MethodInfo mi;
mi.name = "_convert";
mi.return_val.type = Variant::OBJECT;
@@ -78,53 +77,42 @@ void EditorResourceConversionPlugin::_bind_methods() {
}
String EditorResourceConversionPlugin::converts_to() const {
-
- if (get_script_instance())
+ if (get_script_instance()) {
return get_script_instance()->call("_converts_to");
+ }
return "";
}
bool EditorResourceConversionPlugin::handles(const Ref<Resource> &p_resource) const {
-
- if (get_script_instance())
+ if (get_script_instance()) {
return get_script_instance()->call("_handles", p_resource);
+ }
return false;
}
Ref<Resource> EditorResourceConversionPlugin::convert(const Ref<Resource> &p_resource) const {
-
- if (get_script_instance())
+ if (get_script_instance()) {
return get_script_instance()->call("_convert", p_resource);
+ }
return Ref<Resource>();
}
void CustomPropertyEditor::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_DRAW) {
-
- RID ci = get_canvas_item();
- get_stylebox("panel", "PopupMenu")->draw(ci, Rect2(Point2(), get_size()));
- }
- if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST) {
+ if (p_what == NOTIFICATION_WM_CLOSE_REQUEST) {
hide();
}
}
void CustomPropertyEditor::_menu_option(int p_which) {
-
switch (type) {
-
case Variant::INT: {
-
if (hint == PROPERTY_HINT_FLAGS) {
-
int val = v;
if (val & (1 << p_which)) {
-
val &= ~(1 << p_which);
} else {
val |= (1 << p_which);
@@ -133,30 +121,24 @@ void CustomPropertyEditor::_menu_option(int p_which) {
v = val;
emit_signal("variant_changed");
} else if (hint == PROPERTY_HINT_ENUM) {
-
v = menu->get_item_metadata(p_which);
emit_signal("variant_changed");
}
} break;
case Variant::STRING: {
-
if (hint == PROPERTY_HINT_ENUM) {
-
v = hint_text.get_slice(",", p_which);
emit_signal("variant_changed");
}
} break;
case Variant::OBJECT: {
-
switch (p_which) {
case OBJ_MENU_LOAD: {
-
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
String type = (hint == PROPERTY_HINT_RESOURCE_TYPE) ? hint_text : String();
List<String> extensions;
for (int i = 0; i < type.get_slice_count(","); i++) {
-
ResourceLoader::get_recognized_extensions_for_type(type.get_slice(",", i), &extensions);
}
@@ -167,47 +149,40 @@ void CustomPropertyEditor::_menu_option(int p_which) {
file->clear_filters();
for (Set<String>::Element *E = valid_extensions.front(); E; E = E->next()) {
-
file->add_filter("*." + E->get() + " ; " + E->get().to_upper());
}
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} break;
case OBJ_MENU_EDIT: {
+ REF r = v;
- RefPtr RefPtr = v;
-
- if (!RefPtr.is_null()) {
-
+ if (!r.is_null()) {
emit_signal("resource_edit_request");
hide();
}
} break;
case OBJ_MENU_CLEAR: {
-
v = Variant();
emit_signal("variant_changed");
hide();
} break;
case OBJ_MENU_MAKE_UNIQUE: {
-
- RefPtr RefPtr = v;
- Ref<Resource> res_orig = RefPtr;
- if (res_orig.is_null())
+ Ref<Resource> res_orig = v;
+ if (res_orig.is_null()) {
return;
+ }
List<PropertyInfo> property_list;
res_orig->get_property_list(&property_list);
- List<Pair<String, Variant> > propvalues;
+ List<Pair<String, Variant>> propvalues;
for (List<PropertyInfo>::Element *E = property_list.front(); E; E = E->next()) {
-
Pair<String, Variant> p;
PropertyInfo &pi = E->get();
if (pi.usage & PROPERTY_USAGE_STORAGE) {
-
p.first = pi.name;
p.second = res_orig->get(pi.name);
}
@@ -223,38 +198,35 @@ void CustomPropertyEditor::_menu_option(int p_which) {
ERR_FAIL_COND(res.is_null());
- for (List<Pair<String, Variant> >::Element *E = propvalues.front(); E; E = E->next()) {
-
+ for (List<Pair<String, Variant>>::Element *E = propvalues.front(); E; E = E->next()) {
Pair<String, Variant> &p = E->get();
res->set(p.first, p.second);
}
- v = res.get_ref_ptr();
+ v = res;
emit_signal("variant_changed");
hide();
} break;
case OBJ_MENU_COPY: {
-
EditorSettings::get_singleton()->set_resource_clipboard(v);
} break;
case OBJ_MENU_PASTE: {
-
v = EditorSettings::get_singleton()->get_resource_clipboard();
emit_signal("variant_changed");
} break;
case OBJ_MENU_NEW_SCRIPT: {
-
- if (Object::cast_to<Node>(owner))
+ if (Object::cast_to<Node>(owner)) {
EditorNode::get_singleton()->get_scene_tree_dock()->open_script_dialog(Object::cast_to<Node>(owner), false);
+ }
} break;
case OBJ_MENU_EXTEND_SCRIPT: {
-
- if (Object::cast_to<Node>(owner))
+ if (Object::cast_to<Node>(owner)) {
EditorNode::get_singleton()->get_scene_tree_dock()->open_script_dialog(Object::cast_to<Node>(owner), true);
+ }
} break;
case OBJ_MENU_SHOW_IN_FILE_SYSTEM: {
@@ -263,15 +235,13 @@ void CustomPropertyEditor::_menu_option(int p_which) {
file_system_dock->navigate_to_path(r->get_path());
// Ensure that the FileSystem dock is visible.
TabContainer *tab_container = (TabContainer *)file_system_dock->get_parent_control();
- tab_container->set_current_tab(file_system_dock->get_position_in_parent());
+ tab_container->set_current_tab(file_system_dock->get_index());
} break;
default: {
-
if (p_which >= CONVERT_BASE_ID) {
-
int to_type = p_which - CONVERT_BASE_ID;
- Vector<Ref<EditorResourceConversionPlugin> > conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(RES(v));
+ Vector<Ref<EditorResourceConversionPlugin>> conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(RES(v));
ERR_FAIL_INDEX(to_type, conversions.size());
@@ -286,9 +256,8 @@ void CustomPropertyEditor::_menu_option(int p_which) {
String intype = inheritors_array[p_which - TYPE_BASE_ID];
if (intype == "ViewportTexture") {
-
scene_tree->set_title(TTR("Pick a Viewport"));
- scene_tree->popup_centered_ratio();
+ scene_tree->popup_scenetree_dialog();
picking_viewport = true;
return;
}
@@ -311,7 +280,7 @@ void CustomPropertyEditor::_menu_option(int p_which) {
res->call("set_instance_base_type", owner->get_class());
}
- v = Ref<Resource>(res).get_ref_ptr();
+ v = res;
emit_signal("variant_changed");
} break;
@@ -328,17 +297,14 @@ void CustomPropertyEditor::hide_menu() {
}
Variant CustomPropertyEditor::get_variant() const {
-
return v;
}
String CustomPropertyEditor::get_name() const {
-
return name;
}
bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::Type p_type, const Variant &p_variant, int p_hint, String p_hint_text) {
-
owner = p_owner;
updating = true;
name = p_name;
@@ -347,8 +313,9 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
hint = p_hint;
hint_text = p_hint_text;
type_button->hide();
- if (color_picker)
+ if (color_picker) {
color_picker->hide();
+ }
texture_preview->hide();
inheritors_array.clear();
text_edit->hide();
@@ -359,28 +326,29 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
menu->set_size(Size2(1, 1) * EDSCALE);
for (int i = 0; i < MAX_VALUE_EDITORS; i++) {
-
+ if (i < MAX_VALUE_EDITORS / 4) {
+ value_hboxes[i]->hide();
+ }
value_editor[i]->hide();
value_label[i]->hide();
- if (i < 4)
+ if (i < 4) {
scroll[i]->hide();
+ }
}
for (int i = 0; i < MAX_ACTION_BUTTONS; i++) {
-
action_buttons[i]->hide();
}
checks20gc->hide();
- for (int i = 0; i < 20; i++)
+ for (int i = 0; i < 20; i++) {
checks20[i]->hide();
+ }
type = (p_variant.get_type() != Variant::NIL && p_variant.get_type() != Variant::_RID && p_type != Variant::OBJECT) ? p_variant.get_type() : p_type;
switch (type) {
-
case Variant::BOOL: {
-
checks20gc->show();
CheckBox *c = checks20[0];
@@ -394,27 +362,25 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::INT:
- case Variant::REAL: {
-
+ case Variant::FLOAT: {
if (hint == PROPERTY_HINT_RANGE) {
-
int c = hint_text.get_slice_count(",");
- float min = 0, max = 100, step = type == Variant::REAL ? .01 : 1;
+ float min = 0, max = 100, step = type == Variant::FLOAT ? .01 : 1;
if (c >= 1) {
-
- if (!hint_text.get_slice(",", 0).empty())
- min = hint_text.get_slice(",", 0).to_double();
+ if (!hint_text.get_slice(",", 0).empty()) {
+ min = hint_text.get_slice(",", 0).to_float();
+ }
}
if (c >= 2) {
-
- if (!hint_text.get_slice(",", 1).empty())
- max = hint_text.get_slice(",", 1).to_double();
+ if (!hint_text.get_slice(",", 1).empty()) {
+ max = hint_text.get_slice(",", 1).to_float();
+ }
}
if (c >= 3) {
-
- if (!hint_text.get_slice(",", 2).empty())
- step = hint_text.get_slice(",", 2).to_double();
+ if (!hint_text.get_slice(",", 2).empty()) {
+ step = hint_text.get_slice(",", 2).to_float();
+ }
}
if (c >= 4 && hint_text.get_slice(",", 3) == "slider") {
@@ -434,13 +400,13 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
}
} else if (hint == PROPERTY_HINT_ENUM) {
-
Vector<String> options = hint_text.split(",");
int current_val = 0;
for (int i = 0; i < options.size(); i++) {
Vector<String> text_split = options[i].split(":");
- if (text_split.size() != 1)
+ if (text_split.size() != 1) {
current_val = text_split[1].to_int();
+ }
menu->add_item(text_split[0]);
menu->set_item_metadata(i, current_val);
current_val += 1;
@@ -452,7 +418,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
return false;
} else if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || hint == PROPERTY_HINT_LAYERS_2D_RENDER || hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || hint == PROPERTY_HINT_LAYERS_3D_RENDER) {
-
String basename;
switch (hint) {
case PROPERTY_HINT_LAYERS_2D_RENDER:
@@ -472,11 +437,9 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
checks20gc->show();
uint32_t flgs = v;
for (int i = 0; i < 2; i++) {
-
Point2 ofs(4, 4);
ofs.y += 22 * i;
for (int j = 0; j < 10; j++) {
-
int idx = i * 10 + j;
CheckBox *c = checks20[idx];
c->set_text(ProjectSettings::get_singleton()->get(basename + "/layer_" + itos(idx + 1)));
@@ -493,15 +456,14 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
set_size(Vector2(4, 4) * EDSCALE + checks20gc->get_position() + checks20gc->get_size());
} else if (hint == PROPERTY_HINT_EXP_EASING) {
-
- easing_draw->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 5 * EDSCALE);
- easing_draw->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -5 * EDSCALE);
- easing_draw->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 5 * EDSCALE);
- easing_draw->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -30 * EDSCALE);
- type_button->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 3 * EDSCALE);
- type_button->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -3 * EDSCALE);
- type_button->set_anchor_and_margin(MARGIN_TOP, ANCHOR_END, -25 * EDSCALE);
- type_button->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -7 * EDSCALE);
+ easing_draw->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 5 * EDSCALE);
+ easing_draw->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -5 * EDSCALE);
+ easing_draw->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, 5 * EDSCALE);
+ easing_draw->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -30 * EDSCALE);
+ type_button->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, 3 * EDSCALE);
+ type_button->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -3 * EDSCALE);
+ type_button->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_END, -25 * EDSCALE);
+ type_button->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -7 * EDSCALE);
type_button->set_text(TTR("Preset..."));
type_button->get_popup()->clear();
type_button->get_popup()->add_item(TTR("Linear"), EASING_LINEAR);
@@ -520,12 +482,14 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
Vector<String> flags = hint_text.split(",");
for (int i = 0; i < flags.size(); i++) {
String flag = flags[i];
- if (flag == "")
+ if (flag == "") {
continue;
+ }
menu->add_check_item(flag, i);
int f = v;
- if (f & (1 << i))
+ if (f & (1 << i)) {
menu->set_item_checked(menu->get_item_index(i), true);
+ }
}
menu->set_position(get_position());
menu->popup();
@@ -542,22 +506,18 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::STRING: {
-
if (hint == PROPERTY_HINT_FILE || hint == PROPERTY_HINT_GLOBAL_FILE) {
-
List<String> names;
names.push_back(TTR("File..."));
names.push_back(TTR("Clear"));
config_action_buttons(names);
} else if (hint == PROPERTY_HINT_DIR || hint == PROPERTY_HINT_GLOBAL_DIR) {
-
List<String> names;
names.push_back(TTR("Dir..."));
names.push_back(TTR("Clear"));
config_action_buttons(names);
} else if (hint == PROPERTY_HINT_ENUM) {
-
Vector<String> options = hint_text.split(",");
for (int i = 0; i < options.size(); i++) {
menu->add_item(options[i], i);
@@ -569,28 +529,26 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
return false;
} else if (hint == PROPERTY_HINT_MULTILINE_TEXT) {
-
text_edit->show();
text_edit->set_text(v);
text_edit->deselect();
- int button_margin = get_constant("button_margin", "Dialogs");
- int margin = get_constant("margin", "Dialogs");
+ int button_margin = text_edit->get_theme_constant("button_margin", "Dialogs");
+ int margin = text_edit->get_theme_constant("margin", "Dialogs");
- action_buttons[0]->set_anchor(MARGIN_LEFT, ANCHOR_END);
- action_buttons[0]->set_anchor(MARGIN_TOP, ANCHOR_END);
- action_buttons[0]->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- action_buttons[0]->set_anchor(MARGIN_BOTTOM, ANCHOR_END);
+ action_buttons[0]->set_anchor(MARGIN_LEFT, Control::ANCHOR_END);
+ action_buttons[0]->set_anchor(MARGIN_TOP, Control::ANCHOR_END);
+ action_buttons[0]->set_anchor(MARGIN_RIGHT, Control::ANCHOR_END);
+ action_buttons[0]->set_anchor(MARGIN_BOTTOM, Control::ANCHOR_END);
action_buttons[0]->set_begin(Point2(-70 * EDSCALE, -button_margin + 5 * EDSCALE));
action_buttons[0]->set_end(Point2(-margin, -margin));
action_buttons[0]->set_text(TTR("Close"));
action_buttons[0]->show();
} else if (hint == PROPERTY_HINT_TYPE_STRING) {
-
if (!create_dialog) {
create_dialog = memnew(CreateDialog);
- create_dialog->connect("create", this, "_create_dialog_callback");
+ create_dialog->connect("create", callable_mp(this, &CustomPropertyEditor::_create_dialog_callback));
add_child(create_dialog);
}
@@ -606,12 +564,12 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
return false;
} else if (hint == PROPERTY_HINT_METHOD_OF_VARIANT_TYPE) {
-#define MAKE_PROPSELECT \
- if (!property_select) { \
- property_select = memnew(PropertySelector); \
- property_select->connect("selected", this, "_create_selected_property"); \
- add_child(property_select); \
- } \
+#define MAKE_PROPSELECT \
+ if (!property_select) { \
+ property_select = memnew(PropertySelector); \
+ property_select->connect("selected", callable_mp(this, &CustomPropertyEditor::_create_selected_property)); \
+ add_child(property_select); \
+ } \
hide();
MAKE_PROPSELECT;
@@ -622,8 +580,9 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
type = Variant::Type(i);
}
}
- if (type != Variant::NIL)
+ if (type != Variant::NIL) {
property_select->select_method_from_basic_type(type, v);
+ }
updating = false;
return false;
@@ -636,19 +595,19 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
return false;
} else if (hint == PROPERTY_HINT_METHOD_OF_INSTANCE) {
-
MAKE_PROPSELECT
- Object *instance = ObjectDB::get_instance(hint_text.to_int64());
- if (instance)
+ Object *instance = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
+ if (instance) {
property_select->select_method_from_instance(instance, v);
+ }
updating = false;
return false;
} else if (hint == PROPERTY_HINT_METHOD_OF_SCRIPT) {
MAKE_PROPSELECT
- Object *obj = ObjectDB::get_instance(hint_text.to_int64());
+ Object *obj = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
if (Object::cast_to<Script>(obj)) {
property_select->select_method_from_script(Object::cast_to<Script>(obj), v);
}
@@ -657,26 +616,26 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
return false;
} else if (hint == PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE) {
-
MAKE_PROPSELECT
Variant::Type type = Variant::NIL;
String tname = hint_text;
- if (tname.find(".") != -1)
+ if (tname.find(".") != -1) {
tname = tname.get_slice(".", 0);
+ }
for (int i = 0; i < Variant::VARIANT_MAX; i++) {
if (tname == Variant::get_type_name(Variant::Type(i))) {
type = Variant::Type(Variant::Type(i));
}
}
- if (type != Variant::NIL)
+ if (type != Variant::NIL) {
property_select->select_property_from_basic_type(type, v);
+ }
updating = false;
return false;
} else if (hint == PROPERTY_HINT_PROPERTY_OF_BASE_TYPE) {
-
MAKE_PROPSELECT
property_select->select_property_from_base_type(hint_text, v);
@@ -685,12 +644,12 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
return false;
} else if (hint == PROPERTY_HINT_PROPERTY_OF_INSTANCE) {
-
MAKE_PROPSELECT
- Object *instance = ObjectDB::get_instance(hint_text.to_int64());
- if (instance)
+ Object *instance = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
+ if (instance) {
property_select->select_property_from_instance(instance, v);
+ }
updating = false;
return false;
@@ -698,7 +657,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} else if (hint == PROPERTY_HINT_PROPERTY_OF_SCRIPT) {
MAKE_PROPSELECT
- Object *obj = ObjectDB::get_instance(hint_text.to_int64());
+ Object *obj = ObjectDB::get_instance(ObjectID(hint_text.to_int()));
if (Object::cast_to<Script>(obj)) {
property_select->select_property_from_script(Object::cast_to<Script>(obj), v);
}
@@ -715,7 +674,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::VECTOR2: {
-
field_names.push_back("x");
field_names.push_back("y");
config_value_editors(2, 2, 10, field_names);
@@ -724,7 +682,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
value_editor[1]->set_text(String::num(vec.y));
} break;
case Variant::RECT2: {
-
field_names.push_back("x");
field_names.push_back("y");
field_names.push_back("w");
@@ -737,7 +694,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
value_editor[3]->set_text(String::num(r.size.y));
} break;
case Variant::VECTOR3: {
-
field_names.push_back("x");
field_names.push_back("y");
field_names.push_back("z");
@@ -748,7 +704,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
value_editor[2]->set_text(String::num(vec.z));
} break;
case Variant::PLANE: {
-
field_names.push_back("x");
field_names.push_back("y");
field_names.push_back("z");
@@ -762,7 +717,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::QUAT: {
-
field_names.push_back("x");
field_names.push_back("y");
field_names.push_back("z");
@@ -776,7 +730,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::AABB: {
-
field_names.push_back("px");
field_names.push_back("py");
field_names.push_back("pz");
@@ -795,7 +748,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::TRANSFORM2D: {
-
field_names.push_back("xx");
field_names.push_back("xy");
field_names.push_back("yx");
@@ -806,13 +758,11 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
Transform2D basis = v;
for (int i = 0; i < 6; i++) {
-
value_editor[i]->set_text(String::num(basis.elements[i / 2][i % 2]));
}
} break;
case Variant::BASIS: {
-
field_names.push_back("xx");
field_names.push_back("xy");
field_names.push_back("xz");
@@ -826,13 +776,11 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
Basis basis = v;
for (int i = 0; i < 9; i++) {
-
value_editor[i]->set_text(String::num(basis.elements[i / 3][i % 3]));
}
} break;
case Variant::TRANSFORM: {
-
field_names.push_back("xx");
field_names.push_back("xy");
field_names.push_back("xz");
@@ -849,7 +797,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
Transform tr = v;
for (int i = 0; i < 9; i++) {
-
value_editor[(i / 3) * 4 + i % 3]->set_text(String::num(tr.basis.elements[i / 3][i % 3]));
}
@@ -859,21 +806,21 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::COLOR: {
-
if (!color_picker) {
//late init for performance
color_picker = memnew(ColorPicker);
color_picker->set_deferred_mode(true);
add_child(color_picker);
color_picker->hide();
- color_picker->connect("color_changed", this, "_color_changed");
+ color_picker->connect("color_changed", callable_mp(this, &CustomPropertyEditor::_color_changed));
// get default color picker mode from editor settings
int default_color_mode = EDITOR_GET("interface/inspector/default_color_picker_mode");
- if (default_color_mode == 1)
+ if (default_color_mode == 1) {
color_picker->set_hsv_mode(true);
- else if (default_color_mode == 2)
+ } else if (default_color_mode == 2) {
color_picker->set_raw_mode(true);
+ }
}
color_picker->show();
@@ -884,24 +831,24 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
} break;
case Variant::NODE_PATH: {
-
List<String> names;
names.push_back(TTR("Assign"));
names.push_back(TTR("Clear"));
- if (owner && owner->is_class("Node") && (v.get_type() == Variant::NODE_PATH) && Object::cast_to<Node>(owner)->has_node(v))
+ if (owner && owner->is_class("Node") && (v.get_type() == Variant::NODE_PATH) && Object::cast_to<Node>(owner)->has_node(v)) {
names.push_back(TTR("Select Node"));
+ }
config_action_buttons(names);
} break;
case Variant::OBJECT: {
-
- if (hint != PROPERTY_HINT_RESOURCE_TYPE)
+ if (hint != PROPERTY_HINT_RESOURCE_TYPE) {
break;
+ }
if (p_name == "script" && hint_text == "Script" && Object::cast_to<Node>(owner)) {
- menu->add_icon_item(get_icon("Script", "EditorIcons"), TTR("New Script"), OBJ_MENU_NEW_SCRIPT);
+ menu->add_item(TTR("New Script"), OBJ_MENU_NEW_SCRIPT);
menu->add_separator();
} else if (hint_text != "") {
int idx = 0;
@@ -913,7 +860,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
}
for (int i = 0; i < hint_text.get_slice_count(","); i++) {
-
String base = hint_text.get_slice(",", i);
Set<String> valid_inheritors;
@@ -935,52 +881,45 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
const String &t = j->get();
bool is_custom_resource = false;
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
if (!custom_resources.empty()) {
for (int k = 0; k < custom_resources.size(); k++) {
if (custom_resources[k].name == t) {
is_custom_resource = true;
- if (custom_resources[k].icon.is_valid())
+ if (custom_resources[k].icon.is_valid()) {
icon = custom_resources[k].icon;
+ }
break;
}
}
}
- if (!is_custom_resource && !ClassDB::can_instance(t))
+ if (!is_custom_resource && !ClassDB::can_instance(t)) {
continue;
+ }
inheritors_array.push_back(t);
int id = TYPE_BASE_ID + idx;
- if (!icon.is_valid() && has_icon(t, "EditorIcons")) {
- icon = get_icon(t, "EditorIcons");
- }
-
- if (icon.is_valid()) {
-
- menu->add_icon_item(icon, vformat(TTR("New %s"), t), id);
- } else {
-
- menu->add_item(vformat(TTR("New %s"), t), id);
- }
+ menu->add_item(vformat(TTR("New %s"), t), id);
idx++;
}
}
- if (menu->get_item_count())
+ if (menu->get_item_count()) {
menu->add_separator();
+ }
}
- menu->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Load"), OBJ_MENU_LOAD);
+ menu->add_item(TTR("Load"), OBJ_MENU_LOAD);
if (!RES(v).is_null()) {
+ menu->add_item(TTR("Edit"), OBJ_MENU_EDIT);
+ menu->add_item(TTR("Clear"), OBJ_MENU_CLEAR);
+ menu->add_item(TTR("Make Unique"), OBJ_MENU_MAKE_UNIQUE);
- menu->add_icon_item(get_icon("Edit", "EditorIcons"), TTR("Edit"), OBJ_MENU_EDIT);
- menu->add_icon_item(get_icon("Clear", "EditorIcons"), TTR("Clear"), OBJ_MENU_CLEAR);
- menu->add_icon_item(get_icon("Duplicate", "EditorIcons"), TTR("Make Unique"), OBJ_MENU_MAKE_UNIQUE);
RES r = v;
if (r.is_valid() && r->get_path().is_resource_file()) {
menu->add_separator();
@@ -991,48 +930,38 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
RES cb = EditorSettings::get_singleton()->get_resource_clipboard();
bool paste_valid = false;
if (cb.is_valid()) {
- if (hint_text == "")
+ if (hint_text == "") {
paste_valid = true;
- else
- for (int i = 0; i < hint_text.get_slice_count(","); i++)
+ } else {
+ for (int i = 0; i < hint_text.get_slice_count(","); i++) {
if (ClassDB::is_parent_class(cb->get_class(), hint_text.get_slice(",", i))) {
paste_valid = true;
break;
}
+ }
+ }
}
if (!RES(v).is_null() || paste_valid) {
menu->add_separator();
if (!RES(v).is_null()) {
-
menu->add_item(TTR("Copy"), OBJ_MENU_COPY);
}
if (paste_valid) {
-
menu->add_item(TTR("Paste"), OBJ_MENU_PASTE);
}
}
if (!RES(v).is_null()) {
-
- Vector<Ref<EditorResourceConversionPlugin> > conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(RES(v));
+ Vector<Ref<EditorResourceConversionPlugin>> conversions = EditorNode::get_singleton()->find_resource_conversion_plugin(RES(v));
if (conversions.size()) {
menu->add_separator();
}
for (int i = 0; i < conversions.size(); i++) {
String what = conversions[i]->converts_to();
- Ref<Texture> icon;
- if (has_icon(what, "EditorIcons")) {
-
- icon = get_icon(what, "EditorIcons");
- } else {
-
- icon = get_icon(what, "Resource");
- }
-
- menu->add_icon_item(icon, vformat(TTR("Convert To %s"), what), CONVERT_BASE_ID + i);
+ menu->add_item(vformat(TTR("Convert To %s"), what), CONVERT_BASE_ID + i);
}
}
@@ -1041,28 +970,24 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
hide();
updating = false;
return false;
-
} break;
case Variant::DICTIONARY: {
-
} break;
- case Variant::POOL_BYTE_ARRAY: {
-
+ case Variant::PACKED_BYTE_ARRAY: {
} break;
- case Variant::POOL_INT_ARRAY: {
-
+ case Variant::PACKED_INT32_ARRAY: {
} break;
- case Variant::POOL_REAL_ARRAY: {
-
+ case Variant::PACKED_FLOAT32_ARRAY: {
} break;
- case Variant::POOL_STRING_ARRAY: {
-
+ case Variant::PACKED_INT64_ARRAY: {
} break;
- case Variant::POOL_VECTOR3_ARRAY: {
-
+ case Variant::PACKED_FLOAT64_ARRAY: {
} break;
- case Variant::POOL_COLOR_ARRAY: {
-
+ case Variant::PACKED_STRING_ARRAY: {
+ } break;
+ case Variant::PACKED_VECTOR3_ARRAY: {
+ } break;
+ case Variant::PACKED_COLOR_ARRAY: {
} break;
default: {
}
@@ -1073,20 +998,15 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant::
}
void CustomPropertyEditor::_file_selected(String p_file) {
-
switch (type) {
-
case Variant::STRING: {
-
if (hint == PROPERTY_HINT_FILE || hint == PROPERTY_HINT_DIR) {
-
v = ProjectSettings::get_singleton()->localize_path(p_file);
emit_signal("variant_changed");
hide();
}
if (hint == PROPERTY_HINT_GLOBAL_FILE || hint == PROPERTY_HINT_GLOBAL_DIR) {
-
v = p_file;
emit_signal("variant_changed");
hide();
@@ -1094,16 +1014,15 @@ void CustomPropertyEditor::_file_selected(String p_file) {
} break;
case Variant::OBJECT: {
-
String type = (hint == PROPERTY_HINT_RESOURCE_TYPE) ? hint_text : String();
RES res = ResourceLoader::load(p_file, type);
if (res.is_null()) {
error->set_text(TTR("Error loading file: Not a resource!"));
- error->popup_centered_minsize();
+ error->popup_centered();
break;
}
- v = res.get_ref_ptr();
+ v = res;
emit_signal("variant_changed");
hide();
} break;
@@ -1113,29 +1032,22 @@ void CustomPropertyEditor::_file_selected(String p_file) {
}
void CustomPropertyEditor::_type_create_selected(int p_idx) {
-
- if (type == Variant::INT || type == Variant::REAL) {
-
+ if (type == Variant::INT || type == Variant::FLOAT) {
float newval = 0;
switch (p_idx) {
-
case EASING_LINEAR: {
-
newval = 1;
} break;
case EASING_EASE_IN: {
-
newval = 2.0;
} break;
case EASING_EASE_OUT: {
newval = 0.5;
} break;
case EASING_ZERO: {
-
newval = 0;
} break;
case EASING_IN_OUT: {
-
newval = -0.5;
} break;
case EASING_OUT_IN: {
@@ -1148,7 +1060,6 @@ void CustomPropertyEditor::_type_create_selected(int p_idx) {
easing_draw->update();
} else if (type == Variant::OBJECT) {
-
ERR_FAIL_INDEX(p_idx, inheritors_array.size());
String intype = inheritors_array[p_idx];
@@ -1168,22 +1079,19 @@ void CustomPropertyEditor::_type_create_selected(int p_idx) {
Resource *res = Object::cast_to<Resource>(obj);
ERR_FAIL_COND(!res);
- v = Ref<Resource>(res).get_ref_ptr();
+ v = res;
emit_signal("variant_changed");
hide();
}
}
void CustomPropertyEditor::_color_changed(const Color &p_color) {
-
v = p_color;
emit_signal("variant_changed");
}
void CustomPropertyEditor::_node_path_selected(NodePath p_path) {
-
if (picking_viewport) {
-
Node *to_node = get_node(p_path);
if (!Object::cast_to<Viewport>(to_node)) {
EditorNode::get_singleton()->show_warning(TTR("Selected node is not a Viewport!"));
@@ -1200,10 +1108,8 @@ void CustomPropertyEditor::_node_path_selected(NodePath p_path) {
}
if (hint == PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && hint_text != String()) {
-
Node *node = get_node(hint_text);
if (node) {
-
Node *tonode = node->get_node(p_path);
if (tonode) {
p_path = node->get_path_to(tonode);
@@ -1211,15 +1117,15 @@ void CustomPropertyEditor::_node_path_selected(NodePath p_path) {
}
} else if (owner) {
+ Node *node = nullptr;
- Node *node = NULL;
-
- if (owner->is_class("Node"))
+ if (owner->is_class("Node")) {
node = Object::cast_to<Node>(owner);
- else if (owner->is_class("ArrayPropertyEdit"))
+ } else if (owner->is_class("ArrayPropertyEdit")) {
node = Object::cast_to<ArrayPropertyEdit>(owner)->get_node();
- else if (owner->is_class("DictionaryPropertyEdit"))
+ } else if (owner->is_class("DictionaryPropertyEdit")) {
node = Object::cast_to<DictionaryPropertyEdit>(owner)->get_node();
+ }
if (!node) {
v = p_path;
emit_signal("variant_changed");
@@ -1239,9 +1145,9 @@ void CustomPropertyEditor::_node_path_selected(NodePath p_path) {
}
void CustomPropertyEditor::_action_pressed(int p_which) {
-
- if (updating)
+ if (updating) {
return;
+ }
switch (type) {
case Variant::BOOL: {
@@ -1249,14 +1155,13 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
emit_signal("variant_changed");
} break;
case Variant::INT: {
-
if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || hint == PROPERTY_HINT_LAYERS_2D_RENDER || hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || hint == PROPERTY_HINT_LAYERS_3D_RENDER) {
-
uint32_t f = v;
- if (checks20[p_which]->is_pressed())
+ if (checks20[p_which]->is_pressed()) {
f |= (1 << p_which);
- else
+ } else {
f &= ~(1 << p_which);
+ }
v = f;
emit_signal("variant_changed");
@@ -1264,20 +1169,18 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
} break;
case Variant::STRING: {
-
if (hint == PROPERTY_HINT_MULTILINE_TEXT) {
-
hide();
} else if (hint == PROPERTY_HINT_FILE || hint == PROPERTY_HINT_GLOBAL_FILE) {
if (p_which == 0) {
-
- if (hint == PROPERTY_HINT_FILE)
+ if (hint == PROPERTY_HINT_FILE) {
file->set_access(EditorFileDialog::ACCESS_RESOURCES);
- else
+ } else {
file->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
+ }
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file->clear_filters();
file->clear_filters();
@@ -1285,37 +1188,34 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
if (hint_text != "") {
Vector<String> extensions = hint_text.split(",");
for (int i = 0; i < extensions.size(); i++) {
-
String filter = extensions[i];
- if (filter.begins_with("."))
+ if (filter.begins_with(".")) {
filter = "*" + extensions[i];
- else if (!filter.begins_with("*"))
+ } else if (!filter.begins_with("*")) {
filter = "*." + extensions[i];
+ }
file->add_filter(filter + " ; " + extensions[i].to_upper());
}
}
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} else {
-
v = "";
emit_signal("variant_changed");
hide();
}
} else if (hint == PROPERTY_HINT_DIR || hint == PROPERTY_HINT_GLOBAL_DIR) {
-
if (p_which == 0) {
-
- if (hint == PROPERTY_HINT_DIR)
+ if (hint == PROPERTY_HINT_DIR) {
file->set_access(EditorFileDialog::ACCESS_RESOURCES);
- else
+ } else {
file->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
- file->set_mode(EditorFileDialog::MODE_OPEN_DIR);
+ }
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR);
file->clear_filters();
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} else {
-
v = "";
emit_signal("variant_changed");
hide();
@@ -1324,22 +1224,17 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
} break;
case Variant::NODE_PATH: {
-
if (p_which == 0) {
-
picking_viewport = false;
scene_tree->set_title(TTR("Pick a Node"));
- scene_tree->popup_centered_ratio();
+ scene_tree->popup_scenetree_dialog();
} else if (p_which == 1) {
-
v = NodePath();
emit_signal("variant_changed");
hide();
} else if (p_which == 2) {
-
if (owner->is_class("Node") && (v.get_type() == Variant::NODE_PATH) && Object::cast_to<Node>(owner)->has_node(v)) {
-
Node *target_node = Object::cast_to<Node>(owner)->get_node(v);
EditorNode::get_singleton()->get_editor_selection()->clear();
EditorNode::get_singleton()->get_scene_tree_dock()->set_selected(target_node);
@@ -1350,15 +1245,12 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
} break;
case Variant::OBJECT: {
-
if (p_which == 0) {
-
ERR_FAIL_COND(inheritors_array.empty());
String intype = inheritors_array[0];
if (hint == PROPERTY_HINT_RESOURCE_TYPE) {
-
Object *obj = ClassDB::instance(intype);
if (!obj) {
@@ -1373,58 +1265,50 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
Resource *res = Object::cast_to<Resource>(obj);
ERR_BREAK(!res);
- v = Ref<Resource>(res).get_ref_ptr();
+ v = res;
emit_signal("variant_changed");
hide();
}
} else if (p_which == 1) {
-
file->set_access(EditorFileDialog::ACCESS_RESOURCES);
- file->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
List<String> extensions;
String type = (hint == PROPERTY_HINT_RESOURCE_TYPE) ? hint_text : String();
ResourceLoader::get_recognized_extensions_for_type(type, &extensions);
file->clear_filters();
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
-
file->add_filter("*." + E->get() + " ; " + E->get().to_upper());
}
- file->popup_centered_ratio();
+ file->popup_file_dialog();
} else if (p_which == 2) {
+ RES r = v;
- RefPtr RefPtr = v;
-
- if (!RefPtr.is_null()) {
-
+ if (!r.is_null()) {
emit_signal("resource_edit_request");
hide();
}
} else if (p_which == 3) {
-
v = Variant();
emit_signal("variant_changed");
hide();
} else if (p_which == 4) {
-
- RefPtr RefPtr = v;
- Ref<Resource> res_orig = RefPtr;
- if (res_orig.is_null())
+ Ref<Resource> res_orig = v;
+ if (res_orig.is_null()) {
return;
+ }
List<PropertyInfo> property_list;
res_orig->get_property_list(&property_list);
- List<Pair<String, Variant> > propvalues;
+ List<Pair<String, Variant>> propvalues;
for (List<PropertyInfo>::Element *E = property_list.front(); E; E = E->next()) {
-
Pair<String, Variant> p;
PropertyInfo &pi = E->get();
if (pi.usage & PROPERTY_USAGE_STORAGE) {
-
p.first = pi.name;
p.second = res_orig->get(pi.name);
}
@@ -1436,13 +1320,12 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
ERR_FAIL_COND(res.is_null());
- for (List<Pair<String, Variant> >::Element *E = propvalues.front(); E; E = E->next()) {
-
+ for (List<Pair<String, Variant>>::Element *E = propvalues.front(); E; E = E->next()) {
Pair<String, Variant> &p = E->get();
res->set(p.first, p.second);
}
- v = res.get_ref_ptr();
+ v = res;
emit_signal("variant_changed");
hide();
}
@@ -1455,23 +1338,24 @@ void CustomPropertyEditor::_action_pressed(int p_which) {
}
void CustomPropertyEditor::_drag_easing(const Ref<InputEvent> &p_ev) {
-
Ref<InputEventMouseMotion> mm = p_ev;
if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
-
float rel = mm->get_relative().x;
- if (rel == 0)
+ if (rel == 0) {
return;
+ }
bool flip = hint_text == "attenuation";
- if (flip)
+ if (flip) {
rel = -rel;
+ }
float val = v;
- if (val == 0)
+ if (val == 0) {
return;
+ }
bool sg = val < 0;
val = Math::absf(val);
@@ -1480,8 +1364,9 @@ void CustomPropertyEditor::_drag_easing(const Ref<InputEvent> &p_ev) {
val += rel * 0.05;
val = Math::pow(2.0f, val);
- if (sg)
+ if (sg) {
val = -val;
+ }
v = val;
easing_draw->update();
@@ -1490,13 +1375,12 @@ void CustomPropertyEditor::_drag_easing(const Ref<InputEvent> &p_ev) {
}
void CustomPropertyEditor::_draw_easing() {
-
RID ci = easing_draw->get_canvas_item();
Size2 s = easing_draw->get_size();
Rect2 r(Point2(), s);
r = r.grow(3);
- get_stylebox("normal", "LineEdit")->draw(ci, r);
+ easing_draw->get_theme_stylebox("normal", "LineEdit")->draw(ci, r);
int points = 48;
@@ -1504,11 +1388,10 @@ void CustomPropertyEditor::_draw_easing() {
float exp = v;
bool flip = hint_text == "attenuation";
- Ref<Font> f = get_font("font", "Label");
- Color color = get_color("font_color", "Label");
+ Ref<Font> f = easing_draw->get_theme_font("font", "Label");
+ Color color = easing_draw->get_theme_color("font_color", "Label");
for (int i = 1; i <= points; i++) {
-
float ifl = i / float(points);
float iflp = (i - 1) / float(points);
@@ -1519,7 +1402,7 @@ void CustomPropertyEditor::_draw_easing() {
iflp = 1.0 - iflp;
}
- VisualServer::get_singleton()->canvas_item_add_line(ci, Point2(iflp * s.width, prev * s.height), Point2(ifl * s.width, h * s.height), color);
+ RenderingServer::get_singleton()->canvas_item_add_line(ci, Point2(iflp * s.width, prev * s.height), Point2(ifl * s.width, h * s.height), color);
prev = h;
}
@@ -1527,27 +1410,24 @@ void CustomPropertyEditor::_draw_easing() {
}
void CustomPropertyEditor::_text_edit_changed() {
-
v = text_edit->get_text();
emit_signal("variant_changed");
}
void CustomPropertyEditor::_create_dialog_callback() {
-
v = create_dialog->get_selected_type();
emit_signal("variant_changed");
}
void CustomPropertyEditor::_create_selected_property(const String &p_prop) {
-
v = p_prop;
emit_signal("variant_changed");
}
void CustomPropertyEditor::_modified(String p_string) {
-
- if (updating)
+ if (updating) {
return;
+ }
updating = true;
switch (type) {
@@ -1560,13 +1440,12 @@ void CustomPropertyEditor::_modified(String p_string) {
v = value_editor[0]->get_text().to_int();
return;
} else {
- v = expr->execute(Array(), NULL, false);
+ v = expr->execute(Array(), nullptr, false);
}
emit_signal("variant_changed");
} break;
- case Variant::REAL: {
-
+ case Variant::FLOAT: {
if (hint != PROPERTY_HINT_EXP_EASING) {
String text = value_editor[0]->get_text();
v = _parse_real_expression(text);
@@ -1575,12 +1454,10 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::STRING: {
-
v = value_editor[0]->get_text();
emit_signal("variant_changed");
} break;
case Variant::VECTOR2: {
-
Vector2 vec;
vec.x = _parse_real_expression(value_editor[0]->get_text());
vec.y = _parse_real_expression(value_editor[1]->get_text());
@@ -1589,7 +1466,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::RECT2: {
-
Rect2 r2;
r2.position.x = _parse_real_expression(value_editor[0]->get_text());
@@ -1602,7 +1478,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::VECTOR3: {
-
Vector3 vec;
vec.x = _parse_real_expression(value_editor[0]->get_text());
vec.y = _parse_real_expression(value_editor[1]->get_text());
@@ -1612,7 +1487,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::PLANE: {
-
Plane pl;
pl.normal.x = _parse_real_expression(value_editor[0]->get_text());
pl.normal.y = _parse_real_expression(value_editor[1]->get_text());
@@ -1623,7 +1497,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::QUAT: {
-
Quat q;
q.x = _parse_real_expression(value_editor[0]->get_text());
q.y = _parse_real_expression(value_editor[1]->get_text());
@@ -1634,7 +1507,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::AABB: {
-
Vector3 pos;
Vector3 size;
@@ -1649,7 +1521,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::TRANSFORM2D: {
-
Transform2D m;
for (int i = 0; i < 6; i++) {
m.elements[i / 2][i % 2] = _parse_real_expression(value_editor[i]->get_text());
@@ -1660,7 +1531,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::BASIS: {
-
Basis m;
for (int i = 0; i < 9; i++) {
m.elements[i / 3][i % 3] = _parse_real_expression(value_editor[i]->get_text());
@@ -1671,7 +1541,6 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::TRANSFORM: {
-
Basis basis;
for (int i = 0; i < 9; i++) {
basis.elements[i / 3][i % 3] = _parse_real_expression(value_editor[(i / 3) * 4 + i % 3]->get_text());
@@ -1688,34 +1557,25 @@ void CustomPropertyEditor::_modified(String p_string) {
} break;
case Variant::COLOR: {
-
} break;
case Variant::NODE_PATH: {
-
v = NodePath(value_editor[0]->get_text());
emit_signal("variant_changed");
} break;
case Variant::DICTIONARY: {
-
} break;
- case Variant::POOL_BYTE_ARRAY: {
-
+ case Variant::PACKED_BYTE_ARRAY: {
} break;
- case Variant::POOL_INT_ARRAY: {
-
+ case Variant::PACKED_INT32_ARRAY: {
} break;
- case Variant::POOL_REAL_ARRAY: {
-
+ case Variant::PACKED_FLOAT32_ARRAY: {
} break;
- case Variant::POOL_STRING_ARRAY: {
-
+ case Variant::PACKED_STRING_ARRAY: {
} break;
- case Variant::POOL_VECTOR3_ARRAY: {
-
+ case Variant::PACKED_VECTOR3_ARRAY: {
} break;
- case Variant::POOL_COLOR_ARRAY: {
-
+ case Variant::PACKED_COLOR_ARRAY: {
} break;
default: {
}
@@ -1730,15 +1590,14 @@ real_t CustomPropertyEditor::_parse_real_expression(String text) {
Error err = expr->parse(text);
real_t out;
if (err != OK) {
- out = value_editor[0]->get_text().to_double();
+ out = value_editor[0]->get_text().to_float();
} else {
- out = expr->execute(Array(), NULL, false);
+ out = expr->execute(Array(), nullptr, false);
}
return out;
}
void CustomPropertyEditor::_emit_changed_whole_or_field() {
-
if (!Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
emit_signal("variant_changed");
} else {
@@ -1753,7 +1612,7 @@ void CustomPropertyEditor::_range_modified(double p_value) {
void CustomPropertyEditor::_focus_enter() {
switch (type) {
- case Variant::REAL:
+ case Variant::FLOAT:
case Variant::STRING:
case Variant::VECTOR2:
case Variant::RECT2:
@@ -1779,7 +1638,7 @@ void CustomPropertyEditor::_focus_enter() {
void CustomPropertyEditor::_focus_exit() {
switch (type) {
- case Variant::REAL:
+ case Variant::FLOAT:
case Variant::STRING:
case Variant::VECTOR2:
case Variant::RECT2:
@@ -1800,8 +1659,7 @@ void CustomPropertyEditor::_focus_exit() {
}
void CustomPropertyEditor::config_action_buttons(const List<String> &p_strings) {
-
- Ref<StyleBox> sb = get_stylebox("panel");
+ Ref<StyleBox> sb = action_buttons[0]->get_theme_stylebox("panel");
int margin_top = sb->get_margin(MARGIN_TOP);
int margin_left = sb->get_margin(MARGIN_LEFT);
int margin_bottom = sb->get_margin(MARGIN_BOTTOM);
@@ -1811,15 +1669,14 @@ void CustomPropertyEditor::config_action_buttons(const List<String> &p_strings)
int height = 0;
for (int i = 0; i < MAX_ACTION_BUTTONS; i++) {
-
if (i < p_strings.size()) {
-
action_buttons[i]->show();
action_buttons[i]->set_text(p_strings[i]);
Size2 btn_m_size = action_buttons[i]->get_minimum_size();
- if (btn_m_size.width > max_width)
+ if (btn_m_size.width > max_width) {
max_width = btn_m_size.width;
+ }
} else {
action_buttons[i]->hide();
@@ -1827,7 +1684,6 @@ void CustomPropertyEditor::config_action_buttons(const List<String> &p_strings)
}
for (int i = 0; i < p_strings.size(); i++) {
-
Size2 btn_m_size = action_buttons[i]->get_size();
action_buttons[i]->set_position(Point2(0, height) + Point2(margin_left, margin_top));
action_buttons[i]->set_size(Size2(max_width, btn_m_size.height));
@@ -1838,7 +1694,6 @@ void CustomPropertyEditor::config_action_buttons(const List<String> &p_strings)
}
void CustomPropertyEditor::config_value_editors(int p_amount, int p_columns, int p_label_w, const List<String> &p_strings) {
-
int cell_width = 95;
int cell_height = 25;
int cell_margin = 5;
@@ -1849,6 +1704,13 @@ void CustomPropertyEditor::config_value_editors(int p_amount, int p_columns, int
set_size(Size2(cell_margin + p_label_w + (cell_width + cell_margin + p_label_w) * p_columns, cell_margin + (cell_height + cell_margin) * rows) * EDSCALE);
for (int i = 0; i < MAX_VALUE_EDITORS; i++) {
+ if (i < MAX_VALUE_EDITORS / 4) {
+ if (i <= p_amount / 4) {
+ value_hboxes[i]->show();
+ } else {
+ value_hboxes[i]->hide();
+ }
+ }
int c = i % p_columns;
int r = i / p_columns;
@@ -1869,49 +1731,39 @@ void CustomPropertyEditor::config_value_editors(int p_amount, int p_columns, int
}
void CustomPropertyEditor::_bind_methods() {
-
- ClassDB::bind_method("_focus_enter", &CustomPropertyEditor::_focus_enter);
- ClassDB::bind_method("_focus_exit", &CustomPropertyEditor::_focus_exit);
- ClassDB::bind_method("_modified", &CustomPropertyEditor::_modified);
- ClassDB::bind_method("_range_modified", &CustomPropertyEditor::_range_modified);
- ClassDB::bind_method("_action_pressed", &CustomPropertyEditor::_action_pressed);
- ClassDB::bind_method("_file_selected", &CustomPropertyEditor::_file_selected);
- ClassDB::bind_method("_type_create_selected", &CustomPropertyEditor::_type_create_selected);
- ClassDB::bind_method("_node_path_selected", &CustomPropertyEditor::_node_path_selected);
- ClassDB::bind_method("_color_changed", &CustomPropertyEditor::_color_changed);
- ClassDB::bind_method("_draw_easing", &CustomPropertyEditor::_draw_easing);
- ClassDB::bind_method("_drag_easing", &CustomPropertyEditor::_drag_easing);
- ClassDB::bind_method("_text_edit_changed", &CustomPropertyEditor::_text_edit_changed);
- ClassDB::bind_method("_menu_option", &CustomPropertyEditor::_menu_option);
- ClassDB::bind_method("_create_dialog_callback", &CustomPropertyEditor::_create_dialog_callback);
- ClassDB::bind_method("_create_selected_property", &CustomPropertyEditor::_create_selected_property);
-
ADD_SIGNAL(MethodInfo("variant_changed"));
ADD_SIGNAL(MethodInfo("variant_field_changed", PropertyInfo(Variant::STRING, "field")));
ADD_SIGNAL(MethodInfo("resource_edit_request"));
}
CustomPropertyEditor::CustomPropertyEditor() {
-
read_only = false;
updating = false;
- for (int i = 0; i < MAX_VALUE_EDITORS; i++) {
+ value_vbox = memnew(VBoxContainer);
+ add_child(value_vbox);
- value_editor[i] = memnew(LineEdit);
- add_child(value_editor[i]);
+ for (int i = 0; i < MAX_VALUE_EDITORS; i++) {
+ if (i < MAX_VALUE_EDITORS / 4) {
+ value_hboxes[i] = memnew(HBoxContainer);
+ value_vbox->add_child(value_hboxes[i]);
+ value_hboxes[i]->hide();
+ }
+ int hbox_idx = i / 4;
value_label[i] = memnew(Label);
- add_child(value_label[i]);
- value_editor[i]->hide();
+ value_hboxes[hbox_idx]->add_child(value_label[i]);
value_label[i]->hide();
- value_editor[i]->connect("text_entered", this, "_modified");
- value_editor[i]->connect("focus_entered", this, "_focus_enter");
- value_editor[i]->connect("focus_exited", this, "_focus_exit");
+ value_editor[i] = memnew(LineEdit);
+ value_hboxes[hbox_idx]->add_child(value_editor[i]);
+ value_editor[i]->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ value_editor[i]->hide();
+ value_editor[i]->connect("text_entered", callable_mp(this, &CustomPropertyEditor::_modified));
+ value_editor[i]->connect("focus_entered", callable_mp(this, &CustomPropertyEditor::_focus_enter));
+ value_editor[i]->connect("focus_exited", callable_mp(this, &CustomPropertyEditor::_focus_exit));
}
focused_value_editor = -1;
for (int i = 0; i < 4; i++) {
-
scroll[i] = memnew(HScrollBar);
scroll[i]->hide();
scroll[i]->set_min(0);
@@ -1933,10 +1785,10 @@ CustomPropertyEditor::CustomPropertyEditor() {
checks20[i] = memnew(CheckBox);
checks20[i]->set_toggle_mode(true);
- checks20[i]->set_focus_mode(FOCUS_NONE);
+ checks20[i]->set_focus_mode(Control::FOCUS_NONE);
checks20gc->add_child(checks20[i]);
checks20[i]->hide();
- checks20[i]->connect("pressed", this, "_action_pressed", make_binds(i));
+ checks20[i]->connect("pressed", callable_mp(this, &CustomPropertyEditor::_action_pressed), make_binds(i));
checks20[i]->set_tooltip(vformat(TTR("Bit %d, val %d."), i, 1 << i));
}
@@ -1946,28 +1798,26 @@ CustomPropertyEditor::CustomPropertyEditor() {
text_edit->set_margin(MARGIN_BOTTOM, -30);
text_edit->hide();
- text_edit->connect("text_changed", this, "_text_edit_changed");
+ text_edit->connect("text_changed", callable_mp(this, &CustomPropertyEditor::_text_edit_changed));
for (int i = 0; i < MAX_ACTION_BUTTONS; i++) {
-
action_buttons[i] = memnew(Button);
action_buttons[i]->hide();
add_child(action_buttons[i]);
Vector<Variant> binds;
binds.push_back(i);
- action_buttons[i]->connect("pressed", this, "_action_pressed", binds);
+ action_buttons[i]->connect("pressed", callable_mp(this, &CustomPropertyEditor::_action_pressed), binds);
action_buttons[i]->set_flat(true);
}
- color_picker = NULL;
+ color_picker = nullptr;
- set_as_toplevel(true);
file = memnew(EditorFileDialog);
add_child(file);
file->hide();
- file->connect("file_selected", this, "_file_selected");
- file->connect("dir_selected", this, "_file_selected");
+ file->connect("file_selected", callable_mp(this, &CustomPropertyEditor::_file_selected));
+ file->connect("dir_selected", callable_mp(this, &CustomPropertyEditor::_file_selected));
error = memnew(ConfirmationDialog);
error->set_title(TTR("Error!"));
@@ -1975,7 +1825,7 @@ CustomPropertyEditor::CustomPropertyEditor() {
scene_tree = memnew(SceneTreeDialog);
add_child(scene_tree);
- scene_tree->connect("selected", this, "_node_path_selected");
+ scene_tree->connect("selected", callable_mp(this, &CustomPropertyEditor::_node_path_selected));
scene_tree->get_scene_tree()->set_show_enabled_subscene(true);
texture_preview = memnew(TextureRect);
@@ -1985,32 +1835,32 @@ CustomPropertyEditor::CustomPropertyEditor() {
easing_draw = memnew(Control);
add_child(easing_draw);
easing_draw->hide();
- easing_draw->connect("draw", this, "_draw_easing");
- easing_draw->connect("gui_input", this, "_drag_easing");
+ easing_draw->connect("draw", callable_mp(this, &CustomPropertyEditor::_draw_easing));
+ easing_draw->connect("gui_input", callable_mp(this, &CustomPropertyEditor::_drag_easing));
easing_draw->set_default_cursor_shape(Control::CURSOR_MOVE);
type_button = memnew(MenuButton);
add_child(type_button);
type_button->hide();
- type_button->get_popup()->connect("id_pressed", this, "_type_create_selected");
+ type_button->get_popup()->connect("id_pressed", callable_mp(this, &CustomPropertyEditor::_type_create_selected));
menu = memnew(PopupMenu);
- menu->set_pass_on_modal_close_click(false);
+ // menu->set_pass_on_modal_close_click(false);
add_child(menu);
- menu->connect("id_pressed", this, "_menu_option");
+ menu->connect("id_pressed", callable_mp(this, &CustomPropertyEditor::_menu_option));
- evaluator = NULL;
+ evaluator = nullptr;
spinbox = memnew(SpinBox);
add_child(spinbox);
spinbox->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 5);
- spinbox->connect("value_changed", this, "_range_modified");
+ spinbox->connect("value_changed", callable_mp(this, &CustomPropertyEditor::_range_modified));
slider = memnew(HSlider);
add_child(slider);
slider->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 5);
- slider->connect("value_changed", this, "_range_modified");
+ slider->connect("value_changed", callable_mp(this, &CustomPropertyEditor::_range_modified));
- create_dialog = NULL;
- property_select = NULL;
+ create_dialog = nullptr;
+ property_select = nullptr;
}
diff --git a/editor/property_editor.h b/editor/property_editor.h
index bc2a222714..75c6fd372b 100644
--- a/editor/property_editor.h
+++ b/editor/property_editor.h
@@ -51,7 +51,6 @@ class CreateDialog;
class PropertySelector;
class EditorResourceConversionPlugin : public Reference {
-
GDCLASS(EditorResourceConversionPlugin, Reference);
protected:
@@ -63,9 +62,8 @@ public:
virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const;
};
-class CustomPropertyEditor : public Popup {
-
- GDCLASS(CustomPropertyEditor, Popup);
+class CustomPropertyEditor : public PopupPanel {
+ GDCLASS(CustomPropertyEditor, PopupPanel);
enum {
MAX_VALUE_EDITORS = 12,
@@ -102,6 +100,8 @@ class CustomPropertyEditor : public Popup {
List<String> field_names;
int hint;
String hint_text;
+ HBoxContainer *value_hboxes[MAX_VALUE_EDITORS / 4];
+ VBoxContainer *value_vbox;
LineEdit *value_editor[MAX_VALUE_EDITORS];
int focused_value_editor;
Label *value_label[MAX_VALUE_EDITORS];
diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp
index 426ec51e4c..27b11e4fb5 100644
--- a/editor/property_selector.cpp
+++ b/editor/property_selector.cpp
@@ -35,28 +35,25 @@
#include "editor_scale.h"
void PropertySelector::_text_changed(const String &p_newtext) {
-
_update_search();
}
void PropertySelector::_sbox_input(const Ref<InputEvent> &p_ie) {
-
Ref<InputEventKey> k = p_ie;
if (k.is_valid()) {
-
- switch (k->get_scancode()) {
+ switch (k->get_keycode()) {
case KEY_UP:
case KEY_DOWN:
case KEY_PAGEUP:
case KEY_PAGEDOWN: {
-
search_options->call("_gui_input", k);
search_box->accept_event();
TreeItem *root = search_options->get_root();
- if (!root->get_children())
+ if (!root->get_children()) {
break;
+ }
TreeItem *current = search_options->get_selected();
@@ -74,36 +71,36 @@ void PropertySelector::_sbox_input(const Ref<InputEvent> &p_ie) {
}
void PropertySelector::_update_search() {
-
- if (properties)
+ if (properties) {
set_title(TTR("Select Property"));
- else if (virtuals_only)
+ } else if (virtuals_only) {
set_title(TTR("Select Virtual Method"));
- else
+ } else {
set_title(TTR("Select Method"));
+ }
search_options->clear();
help_bit->set_text("");
TreeItem *root = search_options->create_item();
- if (properties) {
+ // Allow using spaces in place of underscores in the search string (makes the search more fault-tolerant).
+ const String search_text = search_box->get_text().replace(" ", "_");
+ if (properties) {
List<PropertyInfo> props;
if (instance) {
instance->get_property_list(&props, true);
} else if (type != Variant::NIL) {
Variant v;
- Variant::CallError ce;
- v = Variant::construct(type, NULL, 0, ce);
+ Callable::CallError ce;
+ v = Variant::construct(type, nullptr, 0, ce);
v.get_property_list(&props);
} else {
-
Object *obj = ObjectDB::get_instance(script);
if (Object::cast_to<Script>(obj)) {
-
props.push_back(PropertyInfo(Variant::NIL, "Script Variables", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_CATEGORY));
Object::cast_to<Script>(obj)->get_script_property_list(&props);
}
@@ -116,52 +113,52 @@ void PropertySelector::_update_search() {
}
}
- TreeItem *category = NULL;
+ TreeItem *category = nullptr;
bool found = false;
- Ref<Texture> type_icons[Variant::VARIANT_MAX] = {
- Control::get_icon("Variant", "EditorIcons"),
- Control::get_icon("bool", "EditorIcons"),
- Control::get_icon("int", "EditorIcons"),
- Control::get_icon("float", "EditorIcons"),
- Control::get_icon("String", "EditorIcons"),
- Control::get_icon("Vector2", "EditorIcons"),
- Control::get_icon("Rect2", "EditorIcons"),
- Control::get_icon("Vector3", "EditorIcons"),
- Control::get_icon("Transform2D", "EditorIcons"),
- Control::get_icon("Plane", "EditorIcons"),
- Control::get_icon("Quat", "EditorIcons"),
- Control::get_icon("AABB", "EditorIcons"),
- Control::get_icon("Basis", "EditorIcons"),
- Control::get_icon("Transform", "EditorIcons"),
- Control::get_icon("Color", "EditorIcons"),
- Control::get_icon("Path", "EditorIcons"),
- Control::get_icon("RID", "EditorIcons"),
- Control::get_icon("Object", "EditorIcons"),
- Control::get_icon("Dictionary", "EditorIcons"),
- Control::get_icon("Array", "EditorIcons"),
- Control::get_icon("PoolByteArray", "EditorIcons"),
- Control::get_icon("PoolIntArray", "EditorIcons"),
- Control::get_icon("PoolRealArray", "EditorIcons"),
- Control::get_icon("PoolStringArray", "EditorIcons"),
- Control::get_icon("PoolVector2Array", "EditorIcons"),
- Control::get_icon("PoolVector3Array", "EditorIcons"),
- Control::get_icon("PoolColorArray", "EditorIcons")
+ Ref<Texture2D> type_icons[Variant::VARIANT_MAX] = {
+ search_options->get_theme_icon("Variant", "EditorIcons"),
+ search_options->get_theme_icon("bool", "EditorIcons"),
+ search_options->get_theme_icon("int", "EditorIcons"),
+ search_options->get_theme_icon("float", "EditorIcons"),
+ search_options->get_theme_icon("String", "EditorIcons"),
+ search_options->get_theme_icon("Vector2", "EditorIcons"),
+ search_options->get_theme_icon("Rect2", "EditorIcons"),
+ search_options->get_theme_icon("Vector3", "EditorIcons"),
+ search_options->get_theme_icon("Transform2D", "EditorIcons"),
+ search_options->get_theme_icon("Plane", "EditorIcons"),
+ search_options->get_theme_icon("Quat", "EditorIcons"),
+ search_options->get_theme_icon("AABB", "EditorIcons"),
+ search_options->get_theme_icon("Basis", "EditorIcons"),
+ search_options->get_theme_icon("Transform", "EditorIcons"),
+ search_options->get_theme_icon("Color", "EditorIcons"),
+ search_options->get_theme_icon("Path", "EditorIcons"),
+ search_options->get_theme_icon("RID", "EditorIcons"),
+ search_options->get_theme_icon("Object", "EditorIcons"),
+ search_options->get_theme_icon("Dictionary", "EditorIcons"),
+ search_options->get_theme_icon("Array", "EditorIcons"),
+ search_options->get_theme_icon("PackedByteArray", "EditorIcons"),
+ search_options->get_theme_icon("PackedInt32Array", "EditorIcons"),
+ search_options->get_theme_icon("PackedFloat32Array", "EditorIcons"),
+ search_options->get_theme_icon("PackedStringArray", "EditorIcons"),
+ search_options->get_theme_icon("PackedVector2Array", "EditorIcons"),
+ search_options->get_theme_icon("PackedVector3Array", "EditorIcons"),
+ search_options->get_theme_icon("PackedColorArray", "EditorIcons")
};
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
if (E->get().usage == PROPERTY_USAGE_CATEGORY) {
- if (category && category->get_children() == NULL) {
+ if (category && category->get_children() == nullptr) {
memdelete(category); //old category was unused
}
category = search_options->create_item(root);
category->set_text(0, E->get().name);
category->set_selectable(0, false);
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
if (E->get().name == "Script Variables") {
- icon = get_icon("Script", "EditorIcons");
+ icon = search_options->get_theme_icon("Script", "EditorIcons");
} else {
icon = EditorNode::get_singleton()->get_class_icon(E->get().name);
}
@@ -169,21 +166,24 @@ void PropertySelector::_update_search() {
continue;
}
- if (!(E->get().usage & PROPERTY_USAGE_EDITOR) && !(E->get().usage & PROPERTY_USAGE_SCRIPT_VARIABLE))
+ if (!(E->get().usage & PROPERTY_USAGE_EDITOR) && !(E->get().usage & PROPERTY_USAGE_SCRIPT_VARIABLE)) {
continue;
+ }
- if (search_box->get_text() != String() && E->get().name.find(search_box->get_text()) == -1)
+ if (search_box->get_text() != String() && E->get().name.findn(search_text) == -1) {
continue;
+ }
- if (type_filter.size() && type_filter.find(E->get().type) == -1)
+ if (type_filter.size() && type_filter.find(E->get().type) == -1) {
continue;
+ }
TreeItem *item = search_options->create_item(category ? category : root);
item->set_text(0, E->get().name);
item->set_metadata(0, E->get().name);
item->set_icon(0, type_icons[E->get().type]);
- if (!found && search_box->get_text() != String() && E->get().name.find(search_box->get_text()) != -1) {
+ if (!found && search_box->get_text() != String() && E->get().name.findn(search_text) != -1) {
item->select(0);
found = true;
}
@@ -191,23 +191,20 @@ void PropertySelector::_update_search() {
item->set_selectable(0, true);
}
- if (category && category->get_children() == NULL) {
+ if (category && category->get_children() == nullptr) {
memdelete(category); //old category was unused
}
} else {
-
List<MethodInfo> methods;
if (type != Variant::NIL) {
Variant v;
- Variant::CallError ce;
- v = Variant::construct(type, NULL, 0, ce);
+ Callable::CallError ce;
+ v = Variant::construct(type, nullptr, 0, ce);
v.get_method_list(&methods);
} else {
-
Object *obj = ObjectDB::get_instance(script);
if (Object::cast_to<Script>(obj)) {
-
methods.push_back(MethodInfo("*Script Methods"));
Object::cast_to<Script>(obj)->get_script_method_list(&methods);
}
@@ -220,25 +217,25 @@ void PropertySelector::_update_search() {
}
}
- TreeItem *category = NULL;
+ TreeItem *category = nullptr;
bool found = false;
bool script_methods = false;
for (List<MethodInfo>::Element *E = methods.front(); E; E = E->next()) {
if (E->get().name.begins_with("*")) {
- if (category && category->get_children() == NULL) {
+ if (category && category->get_children() == nullptr) {
memdelete(category); //old category was unused
}
category = search_options->create_item(root);
category->set_text(0, E->get().name.replace_first("*", ""));
category->set_selectable(0, false);
- Ref<Texture> icon;
+ Ref<Texture2D> icon;
script_methods = false;
String rep = E->get().name.replace("*", "");
if (E->get().name == "*Script Methods") {
- icon = get_icon("Script", "EditorIcons");
+ icon = search_options->get_theme_icon("Script", "EditorIcons");
script_methods = true;
} else {
icon = EditorNode::get_singleton()->get_class_icon(rep);
@@ -249,17 +246,21 @@ void PropertySelector::_update_search() {
}
String name = E->get().name.get_slice(":", 0);
- if (!script_methods && name.begins_with("_") && !(E->get().flags & METHOD_FLAG_VIRTUAL))
+ if (!script_methods && name.begins_with("_") && !(E->get().flags & METHOD_FLAG_VIRTUAL)) {
continue;
+ }
- if (virtuals_only && !(E->get().flags & METHOD_FLAG_VIRTUAL))
+ if (virtuals_only && !(E->get().flags & METHOD_FLAG_VIRTUAL)) {
continue;
+ }
- if (!virtuals_only && (E->get().flags & METHOD_FLAG_VIRTUAL))
+ if (!virtuals_only && (E->get().flags & METHOD_FLAG_VIRTUAL)) {
continue;
+ }
- if (search_box->get_text() != String() && name.find(search_box->get_text()) == -1)
+ if (search_box->get_text() != String() && name.findn(search_text) == -1) {
continue;
+ }
TreeItem *item = search_options->create_item(category ? category : root);
@@ -269,71 +270,75 @@ void PropertySelector::_update_search() {
if (mi.name.find(":") != -1) {
desc = mi.name.get_slice(":", 1) + " ";
mi.name = mi.name.get_slice(":", 0);
- } else if (mi.return_val.type != Variant::NIL)
+ } else if (mi.return_val.type != Variant::NIL) {
desc = Variant::get_type_name(mi.return_val.type);
- else
- desc = "void ";
+ } else {
+ desc = "void";
+ }
- desc += " " + mi.name + " ( ";
+ desc += vformat(" %s(", mi.name);
for (int i = 0; i < mi.arguments.size(); i++) {
-
- if (i > 0)
+ if (i > 0) {
desc += ", ";
-
- if (mi.arguments[i].type == Variant::NIL)
- desc += "var ";
- else if (mi.arguments[i].name.find(":") != -1) {
- desc += mi.arguments[i].name.get_slice(":", 1) + " ";
- mi.arguments[i].name = mi.arguments[i].name.get_slice(":", 0);
- } else
- desc += Variant::get_type_name(mi.arguments[i].type) + " ";
+ }
desc += mi.arguments[i].name;
+
+ if (mi.arguments[i].type == Variant::NIL) {
+ desc += ": Variant";
+ } else if (mi.arguments[i].name.find(":") != -1) {
+ desc += vformat(": %s", mi.arguments[i].name.get_slice(":", 1));
+ mi.arguments[i].name = mi.arguments[i].name.get_slice(":", 0);
+ } else {
+ desc += vformat(": %s", Variant::get_type_name(mi.arguments[i].type));
+ }
}
- desc += " )";
+ desc += ")";
- if (E->get().flags & METHOD_FLAG_CONST)
+ if (E->get().flags & METHOD_FLAG_CONST) {
desc += " const";
+ }
- if (E->get().flags & METHOD_FLAG_VIRTUAL)
+ if (E->get().flags & METHOD_FLAG_VIRTUAL) {
desc += " virtual";
+ }
item->set_text(0, desc);
item->set_metadata(0, name);
item->set_selectable(0, true);
- if (!found && search_box->get_text() != String() && name.find(search_box->get_text()) != -1) {
+ if (!found && search_box->get_text() != String() && name.findn(search_text) != -1) {
item->select(0);
found = true;
}
}
- if (category && category->get_children() == NULL) {
+ if (category && category->get_children() == nullptr) {
memdelete(category); //old category was unused
}
}
- get_ok()->set_disabled(root->get_children() == NULL);
+ get_ok()->set_disabled(root->get_children() == nullptr);
}
void PropertySelector::_confirmed() {
-
TreeItem *ti = search_options->get_selected();
- if (!ti)
+ if (!ti) {
return;
+ }
emit_signal("selected", ti->get_metadata(0));
hide();
}
void PropertySelector::_item_selected() {
-
help_bit->set_text("");
TreeItem *item = search_options->get_selected();
- if (!item)
+ if (!item) {
return;
+ }
String name = item->get_metadata(0);
String class_type;
@@ -348,16 +353,14 @@ void PropertySelector::_item_selected() {
String text;
if (properties) {
-
String at_class = class_type;
while (at_class != String()) {
-
Map<String, DocData::ClassDoc>::Element *E = dd->class_list.find(at_class);
if (E) {
for (int i = 0; i < E->get().properties.size(); i++) {
if (E->get().properties[i].name == name) {
- text = E->get().properties[i].description;
+ text = DTR(E->get().properties[i].description);
}
}
}
@@ -365,16 +368,14 @@ void PropertySelector::_item_selected() {
at_class = ClassDB::get_parent_class(at_class);
}
} else {
-
String at_class = class_type;
while (at_class != String()) {
-
Map<String, DocData::ClassDoc>::Element *E = dd->class_list.find(at_class);
if (E) {
for (int i = 0; i < E->get().methods.size(); i++) {
if (E->get().methods[i].name == name) {
- text = E->get().methods[i].description;
+ text = DTR(E->get().methods[i].description);
}
}
}
@@ -383,30 +384,32 @@ void PropertySelector::_item_selected() {
}
}
- if (text == String())
+ if (text == String()) {
return;
+ }
help_bit->set_text(text);
}
-void PropertySelector::_notification(int p_what) {
+void PropertySelector::_hide_requested() {
+ _cancel_pressed(); // From AcceptDialog.
+}
+void PropertySelector::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
-
- connect("confirmed", this, "_confirmed");
+ connect("confirmed", callable_mp(this, &PropertySelector::_confirmed));
} else if (p_what == NOTIFICATION_EXIT_TREE) {
- disconnect("confirmed", this, "_confirmed");
+ disconnect("confirmed", callable_mp(this, &PropertySelector::_confirmed));
}
}
void PropertySelector::select_method_from_base_type(const String &p_base, const String &p_current, bool p_virtuals_only) {
-
base_type = p_base;
selected = p_current;
type = Variant::NIL;
- script = 0;
+ script = ObjectID();
properties = false;
- instance = NULL;
+ instance = nullptr;
virtuals_only = p_virtuals_only;
popup_centered_ratio(0.6);
@@ -416,14 +419,13 @@ void PropertySelector::select_method_from_base_type(const String &p_base, const
}
void PropertySelector::select_method_from_script(const Ref<Script> &p_script, const String &p_current) {
-
ERR_FAIL_COND(p_script.is_null());
base_type = p_script->get_instance_base_type();
selected = p_current;
type = Variant::NIL;
script = p_script->get_instance_id();
properties = false;
- instance = NULL;
+ instance = nullptr;
virtuals_only = false;
popup_centered_ratio(0.6);
@@ -431,15 +433,15 @@ void PropertySelector::select_method_from_script(const Ref<Script> &p_script, co
search_box->grab_focus();
_update_search();
}
-void PropertySelector::select_method_from_basic_type(Variant::Type p_type, const String &p_current) {
+void PropertySelector::select_method_from_basic_type(Variant::Type p_type, const String &p_current) {
ERR_FAIL_COND(p_type == Variant::NIL);
base_type = "";
selected = p_current;
type = p_type;
- script = 0;
+ script = ObjectID();
properties = false;
- instance = NULL;
+ instance = nullptr;
virtuals_only = false;
popup_centered_ratio(0.6);
@@ -449,18 +451,18 @@ void PropertySelector::select_method_from_basic_type(Variant::Type p_type, const
}
void PropertySelector::select_method_from_instance(Object *p_instance, const String &p_current) {
-
base_type = p_instance->get_class();
selected = p_current;
type = Variant::NIL;
- script = 0;
+ script = ObjectID();
{
Ref<Script> scr = p_instance->get_script();
- if (scr.is_valid())
+ if (scr.is_valid()) {
script = scr->get_instance_id();
+ }
}
properties = false;
- instance = NULL;
+ instance = nullptr;
virtuals_only = false;
popup_centered_ratio(0.6);
@@ -470,13 +472,12 @@ void PropertySelector::select_method_from_instance(Object *p_instance, const Str
}
void PropertySelector::select_property_from_base_type(const String &p_base, const String &p_current) {
-
base_type = p_base;
selected = p_current;
type = Variant::NIL;
- script = 0;
+ script = ObjectID();
properties = true;
- instance = NULL;
+ instance = nullptr;
virtuals_only = false;
popup_centered_ratio(0.6);
@@ -486,7 +487,6 @@ void PropertySelector::select_property_from_base_type(const String &p_base, cons
}
void PropertySelector::select_property_from_script(const Ref<Script> &p_script, const String &p_current) {
-
ERR_FAIL_COND(p_script.is_null());
base_type = p_script->get_instance_base_type();
@@ -494,7 +494,7 @@ void PropertySelector::select_property_from_script(const Ref<Script> &p_script,
type = Variant::NIL;
script = p_script->get_instance_id();
properties = true;
- instance = NULL;
+ instance = nullptr;
virtuals_only = false;
popup_centered_ratio(0.6);
@@ -504,14 +504,13 @@ void PropertySelector::select_property_from_script(const Ref<Script> &p_script,
}
void PropertySelector::select_property_from_basic_type(Variant::Type p_type, const String &p_current) {
-
ERR_FAIL_COND(p_type == Variant::NIL);
base_type = "";
selected = p_current;
type = p_type;
- script = 0;
+ script = ObjectID();
properties = true;
- instance = NULL;
+ instance = nullptr;
virtuals_only = false;
popup_centered_ratio(0.6);
@@ -521,11 +520,10 @@ void PropertySelector::select_property_from_basic_type(Variant::Type p_type, con
}
void PropertySelector::select_property_from_instance(Object *p_instance, const String &p_current) {
-
base_type = "";
selected = p_current;
type = Variant::NIL;
- script = 0;
+ script = ObjectID();
properties = true;
instance = p_instance;
virtuals_only = false;
@@ -541,37 +539,30 @@ void PropertySelector::set_type_filter(const Vector<Variant::Type> &p_type_filte
}
void PropertySelector::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_text_changed"), &PropertySelector::_text_changed);
- ClassDB::bind_method(D_METHOD("_confirmed"), &PropertySelector::_confirmed);
- ClassDB::bind_method(D_METHOD("_sbox_input"), &PropertySelector::_sbox_input);
- ClassDB::bind_method(D_METHOD("_item_selected"), &PropertySelector::_item_selected);
-
ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "name")));
}
PropertySelector::PropertySelector() {
-
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
//set_child_rect(vbc);
search_box = memnew(LineEdit);
vbc->add_margin_child(TTR("Search:"), search_box);
- search_box->connect("text_changed", this, "_text_changed");
- search_box->connect("gui_input", this, "_sbox_input");
+ search_box->connect("text_changed", callable_mp(this, &PropertySelector::_text_changed));
+ search_box->connect("gui_input", callable_mp(this, &PropertySelector::_sbox_input));
search_options = memnew(Tree);
vbc->add_margin_child(TTR("Matches:"), search_options, true);
get_ok()->set_text(TTR("Open"));
get_ok()->set_disabled(true);
register_text_enter(search_box);
set_hide_on_ok(false);
- search_options->connect("item_activated", this, "_confirmed");
- search_options->connect("cell_selected", this, "_item_selected");
+ search_options->connect("item_activated", callable_mp(this, &PropertySelector::_confirmed));
+ search_options->connect("cell_selected", callable_mp(this, &PropertySelector::_item_selected));
search_options->set_hide_root(true);
search_options->set_hide_folding(true);
virtuals_only = false;
help_bit = memnew(EditorHelpBit);
vbc->add_margin_child(TTR("Description:"), help_bit);
- help_bit->connect("request_hide", this, "_closed");
+ help_bit->connect("request_hide", callable_mp(this, &PropertySelector::_hide_requested));
}
diff --git a/editor/property_selector.h b/editor/property_selector.h
index 8a190189ff..f579c0404c 100644
--- a/editor/property_selector.h
+++ b/editor/property_selector.h
@@ -41,12 +41,12 @@ class PropertySelector : public ConfirmationDialog {
LineEdit *search_box;
Tree *search_options;
- void _update_search();
-
+ void _text_changed(const String &p_newtext);
void _sbox_input(const Ref<InputEvent> &p_ie);
-
+ void _update_search();
void _confirmed();
- void _text_changed(const String &p_newtext);
+ void _item_selected();
+ void _hide_requested();
EditorHelpBit *help_bit;
@@ -58,8 +58,6 @@ class PropertySelector : public ConfirmationDialog {
Object *instance;
bool virtuals_only;
- void _item_selected();
-
Vector<Variant::Type> type_filter;
protected:
diff --git a/editor/pvrtc_compress.cpp b/editor/pvrtc_compress.cpp
index 43963d3aae..23bcf9540e 100644
--- a/editor/pvrtc_compress.cpp
+++ b/editor/pvrtc_compress.cpp
@@ -38,25 +38,25 @@
#include "editor_settings.h"
#include "scene/resources/texture.h"
-static void (*_base_image_compress_pvrtc2_func)(Image *) = NULL;
-static void (*_base_image_compress_pvrtc4_func)(Image *) = NULL;
+static void (*_base_image_compress_pvrtc2_func)(Image *) = nullptr;
+static void (*_base_image_compress_pvrtc4_func)(Image *) = nullptr;
static void _compress_image(Image::CompressMode p_mode, Image *p_image) {
-
String ttpath = EditorSettings::get_singleton()->get("filesystem/import/pvrtc_texture_tool");
if (ttpath.strip_edges() == "" || !FileAccess::exists(ttpath)) {
switch (p_mode) {
-
case Image::COMPRESS_PVRTC2:
- if (_base_image_compress_pvrtc2_func)
+ if (_base_image_compress_pvrtc2_func) {
_base_image_compress_pvrtc2_func(p_image);
- else if (_base_image_compress_pvrtc4_func)
+ } else if (_base_image_compress_pvrtc4_func) {
_base_image_compress_pvrtc4_func(p_image);
+ }
break;
case Image::COMPRESS_PVRTC4:
- if (_base_image_compress_pvrtc4_func)
+ if (_base_image_compress_pvrtc4_func) {
_base_image_compress_pvrtc4_func(p_image);
+ }
break;
default:
ERR_FAIL_MSG("Unsupported Image compress mode used in PVRTC module.");
@@ -98,7 +98,7 @@ static void _compress_image(Image::CompressMode p_mode, Image *p_image) {
// Save source PNG.
Ref<ImageTexture> t = memnew(ImageTexture);
- t->create_from_image(Ref<Image>(p_image), 0);
+ t->create_from_image(Ref<Image>(p_image));
ResourceSaver::save(src_img, t);
Error err = OS::get_singleton()->execute(ttpath, args, true);
@@ -109,7 +109,7 @@ static void _compress_image(Image::CompressMode p_mode, Image *p_image) {
ERR_FAIL_MSG("Could not execute PVRTC tool: " + ttpath);
}
- t = ResourceLoader::load(dst_img, "Texture");
+ t = ResourceLoader::load(dst_img, "Texture2D");
if (t.is_null()) {
// Clean up generated files.
DirAccess::remove_file_or_error(src_img);
@@ -125,17 +125,14 @@ static void _compress_image(Image::CompressMode p_mode, Image *p_image) {
}
static void _compress_pvrtc2(Image *p_image) {
-
_compress_image(Image::COMPRESS_PVRTC2, p_image);
}
static void _compress_pvrtc4(Image *p_image) {
-
_compress_image(Image::COMPRESS_PVRTC4, p_image);
}
void _pvrtc_register_compressors() {
-
_base_image_compress_pvrtc2_func = Image::_image_compress_pvrtc2_func;
_base_image_compress_pvrtc4_func = Image::_image_compress_pvrtc4_func;
diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp
index 4cd70b0f8e..e1308b4895 100644
--- a/editor/quick_open.cpp
+++ b/editor/quick_open.cpp
@@ -32,278 +32,230 @@
#include "core/os/keyboard.h"
-void EditorQuickOpen::popup_dialog(const StringName &p_base, bool p_enable_multi, bool p_add_dirs, bool p_dontclear) {
+void EditorQuickOpen::popup_dialog(const StringName &p_base, bool p_enable_multi, bool p_dontclear) {
+ base_type = p_base;
+ allow_multi_select = p_enable_multi;
+ search_options->set_select_mode(allow_multi_select ? Tree::SELECT_MULTI : Tree::SELECT_SINGLE);
+ popup_centered_clamped(Size2i(600, 440), 0.8f);
+
+ EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->get_filesystem();
+ _build_search_cache(efsd);
- add_directories = p_add_dirs;
- popup_centered_ratio(0.6);
- if (p_dontclear)
+ if (p_dontclear) {
search_box->select_all();
- else
- search_box->clear();
- if (p_enable_multi)
- search_options->set_select_mode(Tree::SELECT_MULTI);
- else
- search_options->set_select_mode(Tree::SELECT_SINGLE);
+ _update_search();
+ } else {
+ search_box->clear(); // This will emit text_changed.
+ }
search_box->grab_focus();
- base_type = p_base;
- _update_search();
}
-String EditorQuickOpen::get_selected() const {
+void EditorQuickOpen::_build_search_cache(EditorFileSystemDirectory *p_efsd) {
+ for (int i = 0; i < p_efsd->get_subdir_count(); i++) {
+ _build_search_cache(p_efsd->get_subdir(i));
+ }
- TreeItem *ti = search_options->get_selected();
- if (!ti)
- return String();
+ for (int i = 0; i < p_efsd->get_file_count(); i++) {
+ String file_type = p_efsd->get_file_type(i);
+ if (ClassDB::is_parent_class(file_type, base_type)) {
+ String file = p_efsd->get_file_path(i);
+ files.push_back(file.substr(6, file.length()));
- return "res://" + ti->get_text(0);
+ // Store refs to used icons.
+ String ext = file.get_extension();
+ if (!icons.has(ext)) {
+ icons.insert(ext, get_theme_icon((has_theme_icon(file_type, "EditorIcons") ? file_type : "Object"), "EditorIcons"));
+ }
+ }
+ }
}
-Vector<String> EditorQuickOpen::get_selected_files() const {
+void EditorQuickOpen::_update_search() {
+ const String search_text = search_box->get_text();
+ const bool empty_search = search_text == "";
+
+ // Filter possible candidates.
+ Vector<Entry> entries;
+ for (int i = 0; i < files.size(); i++) {
+ if (empty_search || search_text.is_subsequence_ofi(files[i])) {
+ Entry r;
+ r.path = files[i];
+ r.score = empty_search ? 0 : _score_path(search_text, files[i].to_lower());
+ entries.push_back(r);
+ }
+ }
- Vector<String> files;
+ // Display results
+ TreeItem *root = search_options->get_root();
+ root->clear_children();
- TreeItem *item = search_options->get_next_selected(search_options->get_root());
- while (item) {
+ if (entries.size() > 0) {
+ if (!empty_search) {
+ SortArray<Entry, EntryComparator> sorter;
+ sorter.sort(entries.ptrw(), entries.size());
+ }
- files.push_back("res://" + item->get_text(0));
+ const int entry_limit = MIN(entries.size(), 300);
+ for (int i = 0; i < entry_limit; i++) {
+ TreeItem *ti = search_options->create_item(root);
+ ti->set_text(0, entries[i].path);
+ ti->set_icon(0, *icons.lookup_ptr(entries[i].path.get_extension()));
+ }
- item = search_options->get_next_selected(item);
+ TreeItem *to_select = root->get_children();
+ to_select->select(0);
+ to_select->set_as_cursor(0);
+ search_options->scroll_to_item(to_select);
+
+ get_ok()->set_disabled(false);
+ } else {
+ search_options->deselect_all();
+
+ get_ok()->set_disabled(true);
+ }
+}
+
+float EditorQuickOpen::_score_path(const String &p_search, const String &p_path) {
+ float score = 0.9f + .1f * (p_search.length() / (float)p_path.length());
+
+ // Positive bias for matches close to the beginning of the file name.
+ String file = p_path.get_file();
+ int pos = file.findn(p_search);
+ if (pos != -1) {
+ return score * (1.0f - 0.1f * (float(pos) / file.length()));
}
- return files;
+ // Positive bias for matches close to the end of the path.
+ pos = p_path.rfindn(p_search);
+ if (pos != -1) {
+ return score * (0.8f - 0.1f * (float(p_path.length() - pos) / p_path.length()));
+ }
+
+ // Remaining results belong to the same class of results.
+ return score * 0.69f;
}
-void EditorQuickOpen::_text_changed(const String &p_newtext) {
+void EditorQuickOpen::_confirmed() {
+ if (!search_options->get_selected()) {
+ return;
+ }
+ _cleanup();
+ emit_signal("quick_open");
+ hide();
+}
+
+void EditorQuickOpen::cancel_pressed() {
+ _cleanup();
+}
+
+void EditorQuickOpen::_cleanup() {
+ files.clear();
+ icons.clear();
+}
+void EditorQuickOpen::_text_changed(const String &p_newtext) {
_update_search();
}
void EditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) {
-
Ref<InputEventKey> k = p_ie;
if (k.is_valid()) {
-
- switch (k->get_scancode()) {
+ switch (k->get_keycode()) {
case KEY_UP:
case KEY_DOWN:
case KEY_PAGEUP:
case KEY_PAGEDOWN: {
-
search_options->call("_gui_input", k);
search_box->accept_event();
- TreeItem *root = search_options->get_root();
- if (!root->get_children())
- break;
-
- TreeItem *current = search_options->get_selected();
-
- TreeItem *item = search_options->get_next_selected(root);
- while (item) {
- item->deselect(0);
- item = search_options->get_next_selected(item);
- }
-
- current->select(0);
-
- } break;
- }
- }
-}
-
-float EditorQuickOpen::_path_cmp(String search, String path) const {
-
- if (search == path) {
- return 1.2f;
- }
- if (path.findn(search) != -1) {
- return 1.1f;
- }
- return path.to_lower().similarity(search.to_lower());
-}
-
-void EditorQuickOpen::_parse_fs(EditorFileSystemDirectory *efsd, Vector<Pair<String, Ref<Texture> > > &list) {
-
- if (!add_directories) {
- for (int i = 0; i < efsd->get_subdir_count(); i++) {
-
- _parse_fs(efsd->get_subdir(i), list);
- }
- }
-
- String search_text = search_box->get_text();
-
- if (add_directories) {
- String path = efsd->get_path();
- if (!path.ends_with("/"))
- path += "/";
- if (path != "res://") {
- path = path.substr(6, path.length());
- if (search_text.is_subsequence_ofi(path)) {
- Pair<String, Ref<Texture> > pair;
- pair.first = path;
- pair.second = get_icon("folder", "FileDialog");
-
- if (search_text != String() && list.size() > 0) {
-
- float this_sim = _path_cmp(search_text, path);
- float other_sim = _path_cmp(list[0].first, path);
- int pos = 1;
-
- while (pos < list.size() && this_sim <= other_sim) {
- other_sim = _path_cmp(list[pos++].first, path);
+ if (allow_multi_select) {
+ TreeItem *root = search_options->get_root();
+ if (!root->get_children()) {
+ break;
}
- pos = this_sim >= other_sim ? pos - 1 : pos;
- list.insert(pos, pair);
+ TreeItem *current = search_options->get_selected();
+ TreeItem *item = search_options->get_next_selected(root);
+ while (item) {
+ item->deselect(0);
+ item = search_options->get_next_selected(item);
+ }
- } else {
- list.push_back(pair);
+ current->select(0);
+ current->set_as_cursor(0);
}
- }
- }
- }
- for (int i = 0; i < efsd->get_file_count(); i++) {
-
- String file = efsd->get_file_path(i);
- file = file.substr(6, file.length());
-
- if (ClassDB::is_parent_class(efsd->get_file_type(i), base_type) && (search_text.is_subsequence_ofi(file))) {
- Pair<String, Ref<Texture> > pair;
- pair.first = file;
- pair.second = get_icon((has_icon(efsd->get_file_type(i), ei) ? efsd->get_file_type(i) : ot), ei);
- list.push_back(pair);
- }
- }
-
- if (add_directories) {
- for (int i = 0; i < efsd->get_subdir_count(); i++) {
-
- _parse_fs(efsd->get_subdir(i), list);
+ } break;
}
}
}
-Vector<Pair<String, Ref<Texture> > > EditorQuickOpen::_sort_fs(Vector<Pair<String, Ref<Texture> > > &list) {
-
- String search_text = search_box->get_text();
- Vector<Pair<String, Ref<Texture> > > sorted_list;
-
- if (search_text == String() || list.size() == 0)
- return list;
-
- Vector<float> scores;
- scores.resize(list.size());
- for (int i = 0; i < list.size(); i++)
- scores.write[i] = _path_cmp(search_text, list[i].first);
-
- while (list.size() > 0) {
-
- float best_score = 0.0f;
- int best_idx = 0;
-
- for (int i = 0; i < list.size(); i++) {
- float current_score = scores[i];
- if (current_score > best_score) {
- best_score = current_score;
- best_idx = i;
- }
- }
-
- sorted_list.push_back(list[best_idx]);
- list.remove(best_idx);
- scores.remove(best_idx);
+String EditorQuickOpen::get_selected() const {
+ TreeItem *ti = search_options->get_selected();
+ if (!ti) {
+ return String();
}
- return sorted_list;
+ return "res://" + ti->get_text(0);
}
-void EditorQuickOpen::_update_search() {
-
- search_options->clear();
- TreeItem *root = search_options->create_item();
- EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->get_filesystem();
- Vector<Pair<String, Ref<Texture> > > list;
-
- _parse_fs(efsd, list);
- list = _sort_fs(list);
-
- for (int i = 0; i < list.size(); i++) {
- TreeItem *ti = search_options->create_item(root);
- ti->set_text(0, list[i].first);
- ti->set_icon(0, list[i].second);
- }
-
- if (root->get_children()) {
- TreeItem *ti = root->get_children();
+Vector<String> EditorQuickOpen::get_selected_files() const {
+ Vector<String> selected_files;
- ti->select(0);
- ti->set_as_cursor(0);
+ TreeItem *item = search_options->get_next_selected(search_options->get_root());
+ while (item) {
+ selected_files.push_back("res://" + item->get_text(0));
+ item = search_options->get_next_selected(item);
}
- get_ok()->set_disabled(root->get_children() == NULL);
+ return selected_files;
}
-void EditorQuickOpen::_confirmed() {
-
- TreeItem *ti = search_options->get_selected();
- if (!ti)
- return;
- emit_signal("quick_open");
- hide();
+StringName EditorQuickOpen::get_base_type() const {
+ return base_type;
}
void EditorQuickOpen::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- connect("confirmed", this, "_confirmed");
+ connect("confirmed", callable_mp(this, &EditorQuickOpen::_confirmed));
search_box->set_clear_button_enabled(true);
- FALLTHROUGH;
- }
- case NOTIFICATION_THEME_CHANGED: {
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
} break;
case NOTIFICATION_EXIT_TREE: {
- disconnect("confirmed", this, "_confirmed");
+ disconnect("confirmed", callable_mp(this, &EditorQuickOpen::_confirmed));
} break;
}
}
-StringName EditorQuickOpen::get_base_type() const {
-
- return base_type;
+void EditorQuickOpen::_theme_changed() {
+ search_box->set_right_icon(search_options->get_theme_icon("Search", "EditorIcons"));
}
void EditorQuickOpen::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_text_changed"), &EditorQuickOpen::_text_changed);
- ClassDB::bind_method(D_METHOD("_confirmed"), &EditorQuickOpen::_confirmed);
- ClassDB::bind_method(D_METHOD("_sbox_input"), &EditorQuickOpen::_sbox_input);
-
ADD_SIGNAL(MethodInfo("quick_open"));
}
EditorQuickOpen::EditorQuickOpen() {
+ allow_multi_select = false;
VBoxContainer *vbc = memnew(VBoxContainer);
+ vbc->connect("theme_changed", callable_mp(this, &EditorQuickOpen::_theme_changed));
add_child(vbc);
+
search_box = memnew(LineEdit);
+ search_box->connect("text_changed", callable_mp(this, &EditorQuickOpen::_text_changed));
+ search_box->connect("gui_input", callable_mp(this, &EditorQuickOpen::_sbox_input));
vbc->add_margin_child(TTR("Search:"), search_box);
- search_box->connect("text_changed", this, "_text_changed");
- search_box->connect("gui_input", this, "_sbox_input");
+ register_text_enter(search_box);
+
search_options = memnew(Tree);
+ search_options->connect("item_activated", callable_mp(this, &EditorQuickOpen::_confirmed));
+ search_options->create_item();
+ search_options->set_hide_root(true);
+ search_options->set_hide_folding(true);
+ search_options->add_theme_constant_override("draw_guides", 1);
vbc->add_margin_child(TTR("Matches:"), search_options, true);
+
get_ok()->set_text(TTR("Open"));
- get_ok()->set_disabled(true);
- register_text_enter(search_box);
set_hide_on_ok(false);
- search_options->connect("item_activated", this, "_confirmed");
- search_options->set_hide_root(true);
- search_options->set_hide_folding(true);
- search_options->add_constant_override("draw_guides", 1);
- ei = "EditorIcons";
- ot = "Object";
- add_directories = false;
}
diff --git a/editor/quick_open.h b/editor/quick_open.h
index a4eb44c805..6486ee0221 100644
--- a/editor/quick_open.h
+++ b/editor/quick_open.h
@@ -31,31 +31,46 @@
#ifndef EDITOR_QUICK_OPEN_H
#define EDITOR_QUICK_OPEN_H
-#include "core/pair.h"
+#include "core/oa_hash_map.h"
#include "editor_file_system.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/tree.h"
-class EditorQuickOpen : public ConfirmationDialog {
+class EditorQuickOpen : public ConfirmationDialog {
GDCLASS(EditorQuickOpen, ConfirmationDialog);
LineEdit *search_box;
Tree *search_options;
StringName base_type;
- StringName ei;
- StringName ot;
- bool add_directories;
+ bool allow_multi_select;
- void _update_search();
+ Vector<String> files;
+ OAHashMap<String, Ref<Texture2D>> icons;
- void _sbox_input(const Ref<InputEvent> &p_ie);
- void _parse_fs(EditorFileSystemDirectory *efsd, Vector<Pair<String, Ref<Texture> > > &list);
- Vector<Pair<String, Ref<Texture> > > _sort_fs(Vector<Pair<String, Ref<Texture> > > &list);
- float _path_cmp(String search, String path) const;
+ struct Entry {
+ String path;
+ float score;
+ };
+
+ struct EntryComparator {
+ _FORCE_INLINE_ bool operator()(const Entry &A, const Entry &B) const {
+ return A.score > B.score;
+ }
+ };
+
+ void _update_search();
+ void _build_search_cache(EditorFileSystemDirectory *p_efsd);
+ float _score_path(const String &p_search, const String &p_path);
void _confirmed();
+ virtual void cancel_pressed() override;
+ void _cleanup();
+
+ void _sbox_input(const Ref<InputEvent> &p_ie);
void _text_changed(const String &p_newtext);
+ void _theme_changed();
+
protected:
void _notification(int p_what);
static void _bind_methods();
@@ -66,7 +81,7 @@ public:
String get_selected() const;
Vector<String> get_selected_files() const;
- void popup_dialog(const StringName &p_base, bool p_enable_multi = false, bool p_add_dirs = false, bool p_dontclear = false);
+ void popup_dialog(const StringName &p_base, bool p_enable_multi = false, bool p_dontclear = false);
EditorQuickOpen();
};
diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp
index 7586f6eac1..23990bca07 100644
--- a/editor/rename_dialog.cpp
+++ b/editor/rename_dialog.cpp
@@ -42,10 +42,9 @@
#include "scene/gui/tab_container.h"
RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_undo_redo) {
-
scene_tree_editor = p_scene_tree_editor;
undo_redo = p_undo_redo;
- preview_node = NULL;
+ preview_node = nullptr;
set_title(TTR("Batch Rename"));
@@ -56,26 +55,24 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
GridContainer *grd_main = memnew(GridContainer);
grd_main->set_columns(2);
- grd_main->set_v_size_flags(SIZE_EXPAND_FILL);
+ grd_main->set_v_size_flags(Control::SIZE_EXPAND_FILL);
vbc->add_child(grd_main);
// ---- 1st & 2nd row
Label *lbl_search = memnew(Label);
- lbl_search->set_text(TTR("Search"));
+ lbl_search->set_text(TTR("Search:"));
lne_search = memnew(LineEdit);
- lne_search->set_placeholder(TTR("Search"));
lne_search->set_name("lne_search");
- lne_search->set_h_size_flags(SIZE_EXPAND_FILL);
+ lne_search->set_h_size_flags(Control::SIZE_EXPAND_FILL);
Label *lbl_replace = memnew(Label);
- lbl_replace->set_text(TTR("Replace"));
+ lbl_replace->set_text(TTR("Replace:"));
lne_replace = memnew(LineEdit);
- lne_replace->set_placeholder(TTR("Replace"));
lne_replace->set_name("lne_replace");
- lne_replace->set_h_size_flags(SIZE_EXPAND_FILL);
+ lne_replace->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_main->add_child(lbl_search);
grd_main->add_child(lbl_replace);
@@ -85,20 +82,18 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
// ---- 3rd & 4th row
Label *lbl_prefix = memnew(Label);
- lbl_prefix->set_text(TTR("Prefix"));
+ lbl_prefix->set_text(TTR("Prefix:"));
lne_prefix = memnew(LineEdit);
- lne_prefix->set_placeholder(TTR("Prefix"));
lne_prefix->set_name("lne_prefix");
- lne_prefix->set_h_size_flags(SIZE_EXPAND_FILL);
+ lne_prefix->set_h_size_flags(Control::SIZE_EXPAND_FILL);
Label *lbl_suffix = memnew(Label);
- lbl_suffix->set_text(TTR("Suffix"));
+ lbl_suffix->set_text(TTR("Suffix:"));
lne_suffix = memnew(LineEdit);
- lne_suffix->set_placeholder(TTR("Suffix"));
lne_suffix->set_name("lne_suffix");
- lne_suffix->set_h_size_flags(SIZE_EXPAND_FILL);
+ lne_suffix->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_main->add_child(lbl_prefix);
grd_main->add_child(lbl_suffix);
@@ -107,8 +102,6 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
// -- Feature Tabs
- const int feature_min_height = 160 * EDSCALE;
-
cbut_regex = memnew(CheckButton);
cbut_regex->set_text(TTR("Use Regular Expressions"));
vbc->add_child(cbut_regex);
@@ -119,13 +112,13 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
tabc_features = memnew(TabContainer);
tabc_features->set_tab_align(TabContainer::ALIGN_LEFT);
+ tabc_features->set_use_hidden_tabs_for_min_size(true);
vbc->add_child(tabc_features);
// ---- Tab Substitute
VBoxContainer *vbc_substitute = memnew(VBoxContainer);
- vbc_substitute->set_h_size_flags(SIZE_EXPAND_FILL);
- vbc_substitute->set_custom_minimum_size(Size2(0, feature_min_height));
+ vbc_substitute->set_h_size_flags(Control::SIZE_EXPAND_FILL);
vbc_substitute->set_name(TTR("Substitute"));
tabc_features->add_child(vbc_substitute);
@@ -142,50 +135,50 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
but_insert_name = memnew(Button);
but_insert_name->set_text("NAME");
- but_insert_name->set_tooltip(String("${NAME}\n") + TTR("Node name"));
- but_insert_name->set_focus_mode(FOCUS_NONE);
- but_insert_name->connect("pressed", this, "_insert_text", make_binds("${NAME}"));
- but_insert_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ but_insert_name->set_tooltip(String("${NAME}\n") + TTR("Node name."));
+ but_insert_name->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_name->connect("pressed", callable_mp(this, &RenameDialog::_insert_text), make_binds("${NAME}"));
+ but_insert_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_substitute->add_child(but_insert_name);
// Parent
but_insert_parent = memnew(Button);
but_insert_parent->set_text("PARENT");
- but_insert_parent->set_tooltip(String("${PARENT}\n") + TTR("Node's parent name, if available"));
- but_insert_parent->set_focus_mode(FOCUS_NONE);
- but_insert_parent->connect("pressed", this, "_insert_text", make_binds("${PARENT}"));
- but_insert_parent->set_h_size_flags(SIZE_EXPAND_FILL);
+ but_insert_parent->set_tooltip(String("${PARENT}\n") + TTR("Node's parent name, if available."));
+ but_insert_parent->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_parent->connect("pressed", callable_mp(this, &RenameDialog::_insert_text), make_binds("${PARENT}"));
+ but_insert_parent->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_substitute->add_child(but_insert_parent);
// Type
but_insert_type = memnew(Button);
but_insert_type->set_text("TYPE");
- but_insert_type->set_tooltip(String("${TYPE}\n") + TTR("Node type"));
- but_insert_type->set_focus_mode(FOCUS_NONE);
- but_insert_type->connect("pressed", this, "_insert_text", make_binds("${TYPE}"));
- but_insert_type->set_h_size_flags(SIZE_EXPAND_FILL);
+ but_insert_type->set_tooltip(String("${TYPE}\n") + TTR("Node type."));
+ but_insert_type->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_type->connect("pressed", callable_mp(this, &RenameDialog::_insert_text), make_binds("${TYPE}"));
+ but_insert_type->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_substitute->add_child(but_insert_type);
// Scene
but_insert_scene = memnew(Button);
but_insert_scene->set_text("SCENE");
- but_insert_scene->set_tooltip(String("${SCENE}\n") + TTR("Current scene name"));
- but_insert_scene->set_focus_mode(FOCUS_NONE);
- but_insert_scene->connect("pressed", this, "_insert_text", make_binds("${SCENE}"));
- but_insert_scene->set_h_size_flags(SIZE_EXPAND_FILL);
+ but_insert_scene->set_tooltip(String("${SCENE}\n") + TTR("Current scene name."));
+ but_insert_scene->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_scene->connect("pressed", callable_mp(this, &RenameDialog::_insert_text), make_binds("${SCENE}"));
+ but_insert_scene->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_substitute->add_child(but_insert_scene);
// Root
but_insert_root = memnew(Button);
but_insert_root->set_text("ROOT");
- but_insert_root->set_tooltip(String("${ROOT}\n") + TTR("Root node name"));
- but_insert_root->set_focus_mode(FOCUS_NONE);
- but_insert_root->connect("pressed", this, "_insert_text", make_binds("${ROOT}"));
- but_insert_root->set_h_size_flags(SIZE_EXPAND_FILL);
+ but_insert_root->set_tooltip(String("${ROOT}\n") + TTR("Root node name."));
+ but_insert_root->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_root->connect("pressed", callable_mp(this, &RenameDialog::_insert_text), make_binds("${ROOT}"));
+ but_insert_root->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_substitute->add_child(but_insert_root);
// Count
@@ -193,14 +186,14 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
but_insert_count = memnew(Button);
but_insert_count->set_text("COUNTER");
but_insert_count->set_tooltip(String("${COUNTER}\n") + TTR("Sequential integer counter.\nCompare counter options."));
- but_insert_count->set_focus_mode(FOCUS_NONE);
- but_insert_count->connect("pressed", this, "_insert_text", make_binds("${COUNTER}"));
- but_insert_count->set_h_size_flags(SIZE_EXPAND_FILL);
+ but_insert_count->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_count->connect("pressed", callable_mp(this, &RenameDialog::_insert_text), make_binds("${COUNTER}"));
+ but_insert_count->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grd_substitute->add_child(but_insert_count);
chk_per_level_counter = memnew(CheckBox);
chk_per_level_counter->set_text(TTR("Per-level Counter"));
- chk_per_level_counter->set_tooltip(TTR("If set the counter restarts for each group of child nodes"));
+ chk_per_level_counter->set_tooltip(TTR("If set, the counter restarts for each group of child nodes."));
vbc_substitute->add_child(chk_per_level_counter);
HBoxContainer *hbc_count_options = memnew(HBoxContainer);
@@ -208,22 +201,22 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
Label *lbl_count_start = memnew(Label);
lbl_count_start->set_text(TTR("Start"));
- lbl_count_start->set_tooltip(TTR("Initial value for the counter"));
+ lbl_count_start->set_tooltip(TTR("Initial value for the counter."));
hbc_count_options->add_child(lbl_count_start);
spn_count_start = memnew(SpinBox);
- spn_count_start->set_tooltip(TTR("Initial value for the counter"));
+ spn_count_start->set_tooltip(TTR("Initial value for the counter."));
spn_count_start->set_step(1);
spn_count_start->set_min(0);
hbc_count_options->add_child(spn_count_start);
Label *lbl_count_step = memnew(Label);
lbl_count_step->set_text(TTR("Step"));
- lbl_count_step->set_tooltip(TTR("Amount by which counter is incremented for each node"));
+ lbl_count_step->set_tooltip(TTR("Amount by which counter is incremented for each node."));
hbc_count_options->add_child(lbl_count_step);
spn_count_step = memnew(SpinBox);
- spn_count_step->set_tooltip(TTR("Amount by which counter is incremented for each node"));
+ spn_count_step->set_tooltip(TTR("Amount by which counter is incremented for each node."));
spn_count_step->set_step(1);
hbc_count_options->add_child(spn_count_step);
@@ -240,9 +233,8 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
// ---- Tab Process
VBoxContainer *vbc_process = memnew(VBoxContainer);
- vbc_process->set_h_size_flags(SIZE_EXPAND_FILL);
+ vbc_process->set_h_size_flags(Control::SIZE_EXPAND_FILL);
vbc_process->set_name(TTR("Post-Process"));
- vbc_process->set_custom_minimum_size(Size2(0, feature_min_height));
tabc_features->add_child(vbc_process);
cbut_process = memnew(CheckBox);
@@ -286,18 +278,14 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
vbc->add_child(sep_preview);
lbl_preview_title = memnew(Label);
- lbl_preview_title->set_text(TTR("Preview"));
vbc->add_child(lbl_preview_title);
lbl_preview = memnew(Label);
- lbl_preview->set_text("");
- lbl_preview->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
vbc->add_child(lbl_preview);
// ---- Dialog related
- set_custom_minimum_size(Size2(383, 0));
- set_as_toplevel(true);
+ set_min_size(Size2(383, 0));
get_ok()->set_text(TTR("Rename"));
Button *but_reset = add_button(TTR("Reset"));
@@ -306,54 +294,46 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und
// ---- Connections
- cbut_collapse_features->connect("toggled", this, "_features_toggled");
+ cbut_collapse_features->connect("toggled", callable_mp(this, &RenameDialog::_features_toggled));
- // Substitite Buttons
+ // Substitute Buttons
- lne_search->connect("focus_entered", this, "_update_substitute");
- lne_search->connect("focus_exited", this, "_update_substitute");
- lne_replace->connect("focus_entered", this, "_update_substitute");
- lne_replace->connect("focus_exited", this, "_update_substitute");
- lne_prefix->connect("focus_entered", this, "_update_substitute");
- lne_prefix->connect("focus_exited", this, "_update_substitute");
- lne_suffix->connect("focus_entered", this, "_update_substitute");
- lne_suffix->connect("focus_exited", this, "_update_substitute");
+ lne_search->connect("focus_entered", callable_mp(this, &RenameDialog::_update_substitute));
+ lne_search->connect("focus_exited", callable_mp(this, &RenameDialog::_update_substitute));
+ lne_replace->connect("focus_entered", callable_mp(this, &RenameDialog::_update_substitute));
+ lne_replace->connect("focus_exited", callable_mp(this, &RenameDialog::_update_substitute));
+ lne_prefix->connect("focus_entered", callable_mp(this, &RenameDialog::_update_substitute));
+ lne_prefix->connect("focus_exited", callable_mp(this, &RenameDialog::_update_substitute));
+ lne_suffix->connect("focus_entered", callable_mp(this, &RenameDialog::_update_substitute));
+ lne_suffix->connect("focus_exited", callable_mp(this, &RenameDialog::_update_substitute));
// Preview
- lne_prefix->connect("text_changed", this, "_update_preview");
- lne_suffix->connect("text_changed", this, "_update_preview");
- lne_search->connect("text_changed", this, "_update_preview");
- lne_replace->connect("text_changed", this, "_update_preview");
- spn_count_start->connect("value_changed", this, "_update_preview_int");
- spn_count_step->connect("value_changed", this, "_update_preview_int");
- spn_count_padding->connect("value_changed", this, "_update_preview_int");
- opt_style->connect("item_selected", this, "_update_preview_int");
- opt_case->connect("item_selected", this, "_update_preview_int");
- cbut_substitute->connect("pressed", this, "_update_preview", varray(""));
- cbut_regex->connect("pressed", this, "_update_preview", varray(""));
- cbut_process->connect("pressed", this, "_update_preview", varray(""));
-
- but_reset->connect("pressed", this, "reset");
+ lne_prefix->connect("text_changed", callable_mp(this, &RenameDialog::_update_preview));
+ lne_suffix->connect("text_changed", callable_mp(this, &RenameDialog::_update_preview));
+ lne_search->connect("text_changed", callable_mp(this, &RenameDialog::_update_preview));
+ lne_replace->connect("text_changed", callable_mp(this, &RenameDialog::_update_preview));
+ spn_count_start->connect("value_changed", callable_mp(this, &RenameDialog::_update_preview_int));
+ spn_count_step->connect("value_changed", callable_mp(this, &RenameDialog::_update_preview_int));
+ spn_count_padding->connect("value_changed", callable_mp(this, &RenameDialog::_update_preview_int));
+ opt_style->connect("item_selected", callable_mp(this, &RenameDialog::_update_preview_int));
+ opt_case->connect("item_selected", callable_mp(this, &RenameDialog::_update_preview_int));
+ cbut_substitute->connect("pressed", callable_mp(this, &RenameDialog::_update_preview), varray(""));
+ cbut_regex->connect("pressed", callable_mp(this, &RenameDialog::_update_preview), varray(""));
+ cbut_process->connect("pressed", callable_mp(this, &RenameDialog::_update_preview), varray(""));
+
+ but_reset->connect("pressed", callable_mp(this, &RenameDialog::reset));
reset();
_features_toggled(false);
}
void RenameDialog::_bind_methods() {
-
- ClassDB::bind_method("_features_toggled", &RenameDialog::_features_toggled);
- ClassDB::bind_method("_update_preview", &RenameDialog::_update_preview);
- ClassDB::bind_method("_update_preview_int", &RenameDialog::_update_preview_int);
- ClassDB::bind_method("_insert_text", &RenameDialog::_insert_text);
- ClassDB::bind_method("_update_substitute", &RenameDialog::_update_substitute);
- ClassDB::bind_method("reset", &RenameDialog::reset);
ClassDB::bind_method("rename", &RenameDialog::rename);
}
void RenameDialog::_update_substitute() {
-
- LineEdit *focus_owner_line_edit = Object::cast_to<LineEdit>(get_focus_owner());
+ LineEdit *focus_owner_line_edit = Object::cast_to<LineEdit>(scene_tree_editor->get_focus_owner());
bool is_main_field = _is_main_field(focus_owner_line_edit);
but_insert_name->set_disabled(!is_main_field);
@@ -364,18 +344,17 @@ void RenameDialog::_update_substitute() {
but_insert_count->set_disabled(!is_main_field);
// The focus mode seems to be reset when disabling/re-enabling
- but_insert_name->set_focus_mode(FOCUS_NONE);
- but_insert_parent->set_focus_mode(FOCUS_NONE);
- but_insert_type->set_focus_mode(FOCUS_NONE);
- but_insert_scene->set_focus_mode(FOCUS_NONE);
- but_insert_root->set_focus_mode(FOCUS_NONE);
- but_insert_count->set_focus_mode(FOCUS_NONE);
+ but_insert_name->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_parent->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_type->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_scene->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_root->set_focus_mode(Control::FOCUS_NONE);
+ but_insert_count->set_focus_mode(Control::FOCUS_NONE);
}
void RenameDialog::_post_popup() {
-
EditorSelection *editor_selection = EditorNode::get_singleton()->get_editor_selection();
- preview_node = NULL;
+ preview_node = nullptr;
Array selected_node_list = editor_selection->get_selected_nodes();
ERR_FAIL_COND(selected_node_list.size() == 0);
@@ -391,9 +370,9 @@ void RenameDialog::_update_preview_int(int new_value) {
}
void RenameDialog::_update_preview(String new_text) {
-
- if (lock_preview_update || preview_node == NULL)
+ if (lock_preview_update || preview_node == nullptr) {
return;
+ }
has_errors = false;
add_error_handler(&eh);
@@ -401,17 +380,16 @@ void RenameDialog::_update_preview(String new_text) {
String new_name = _apply_rename(preview_node, spn_count_start->get_value());
if (!has_errors) {
-
- lbl_preview_title->set_text(TTR("Preview"));
+ lbl_preview_title->set_text(TTR("Preview:"));
lbl_preview->set_text(new_name);
if (new_name == preview_node->get_name()) {
// New name is identical to the old one. Don't color it as much to avoid distracting the user.
- const Color accent_color = EditorNode::get_singleton()->get_gui_base()->get_color("accent_color", "Editor");
- const Color text_color = EditorNode::get_singleton()->get_gui_base()->get_color("default_color", "RichTextLabel");
- lbl_preview->add_color_override("font_color", accent_color.linear_interpolate(text_color, 0.5));
+ const Color accent_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color("accent_color", "Editor");
+ const Color text_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color("default_color", "RichTextLabel");
+ lbl_preview->add_theme_color_override("font_color", accent_color.lerp(text_color, 0.5));
} else {
- lbl_preview->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("success_color", "Editor"));
+ lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("success_color", "Editor"));
}
}
@@ -419,7 +397,6 @@ void RenameDialog::_update_preview(String new_text) {
}
String RenameDialog::_apply_rename(const Node *node, int count) {
-
String search = lne_search->get_text();
String replace = lne_replace->get_text();
String prefix = lne_prefix->get_text();
@@ -434,7 +411,6 @@ String RenameDialog::_apply_rename(const Node *node, int count) {
}
if (cbut_regex->is_pressed()) {
-
new_name = _regex(search, new_name, replace);
} else {
new_name = new_name.replace(search, replace);
@@ -450,7 +426,6 @@ String RenameDialog::_apply_rename(const Node *node, int count) {
}
String RenameDialog::_substitute(const String &subject, const Node *node, int count) {
-
String result = subject.replace("${COUNTER}", vformat("%0" + itos(spn_count_padding->get_value()) + "d", count));
if (node) {
@@ -480,13 +455,13 @@ String RenameDialog::_substitute(const String &subject, const Node *node, int co
}
void RenameDialog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type) {
-
RenameDialog *self = (RenameDialog *)p_self;
String source_file(p_file);
// Only show first error that is related to "regex"
- if (self->has_errors || source_file.find("regex") < 0)
+ if (self->has_errors || source_file.find("regex") < 0) {
return;
+ }
String err_str;
if (p_errorexp && p_errorexp[0]) {
@@ -496,20 +471,18 @@ void RenameDialog::_error_handler(void *p_self, const char *p_func, const char *
}
self->has_errors = true;
- self->lbl_preview_title->set_text(TTR("Regular Expression Error"));
- self->lbl_preview->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ self->lbl_preview_title->set_text(TTR("Regular Expression Error:"));
+ self->lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("error_color", "Editor"));
self->lbl_preview->set_text(vformat(TTR("At character %s"), err_str));
}
String RenameDialog::_regex(const String &pattern, const String &subject, const String &replacement) {
-
RegEx regex(pattern);
return regex.sub(subject, replacement, true);
}
String RenameDialog::_postprocess(const String &subject) {
-
int style_id = opt_style->get_selected();
String result = subject;
@@ -556,12 +529,11 @@ String RenameDialog::_postprocess(const String &subject) {
}
void RenameDialog::_iterate_scene(const Node *node, const Array &selection, int *counter) {
-
- if (!node)
+ if (!node) {
return;
+ }
if (selection.has(node)) {
-
String new_name = _apply_rename(node, *counter);
if (node->get_name() != new_name) {
@@ -587,7 +559,6 @@ void RenameDialog::_iterate_scene(const Node *node, const Array &selection, int
}
void RenameDialog::rename() {
-
// Editor selection is not ordered via scene tree. Instead iterate
// over scene tree until all selected nodes are found in order.
@@ -602,17 +573,15 @@ void RenameDialog::rename() {
_iterate_scene(root_node, selected_node_list, &global_count);
if (undo_redo && !to_rename.empty()) {
-
undo_redo->create_action(TTR("Batch Rename"));
// Make sure to iterate reversed so that child nodes will find parents.
for (int i = to_rename.size() - 1; i >= 0; --i) {
-
Node *n = root_node->get_node(to_rename[i].first);
const String &new_name = to_rename[i].second;
if (!n) {
- ERR_PRINTS("Skipping missing node: " + to_rename[i].first.get_concatenated_subnames());
+ ERR_PRINT("Skipping missing node: " + to_rename[i].first.get_concatenated_subnames());
continue;
}
@@ -626,7 +595,6 @@ void RenameDialog::rename() {
}
void RenameDialog::reset() {
-
lock_preview_update = true;
lne_prefix->clear();
@@ -657,8 +625,7 @@ bool RenameDialog::_is_main_field(LineEdit *line_edit) {
}
void RenameDialog::_insert_text(String text) {
-
- LineEdit *focus_owner = Object::cast_to<LineEdit>(get_focus_owner());
+ LineEdit *focus_owner = Object::cast_to<LineEdit>(scene_tree_editor->get_focus_owner());
if (_is_main_field(focus_owner)) {
focus_owner->selection_delete();
diff --git a/editor/rename_dialog.h b/editor/rename_dialog.h
index 2825cb2cd2..100426af4f 100644
--- a/editor/rename_dialog.h
+++ b/editor/rename_dialog.h
@@ -44,11 +44,10 @@
*/
class RenameDialog : public ConfirmationDialog {
-
GDCLASS(RenameDialog, ConfirmationDialog);
- virtual void ok_pressed() { rename(); };
- void _cancel_pressed(){};
+ virtual void ok_pressed() override { rename(); };
+ void _cancel_pressed() {}
void _features_toggled(bool pressed);
void _insert_text(String text);
void _update_substitute();
@@ -96,23 +95,22 @@ class RenameDialog : public ConfirmationDialog {
Label *lbl_preview_title;
Label *lbl_preview;
- List<Pair<NodePath, String> > to_rename;
+ List<Pair<NodePath, String>> to_rename;
Node *preview_node;
bool lock_preview_update;
ErrorHandlerList eh;
bool has_errors;
protected:
- void _notification(int p_what){};
static void _bind_methods();
- virtual void _post_popup();
+ virtual void _post_popup() override;
public:
void reset();
void rename();
- RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_undo_redo = NULL);
- ~RenameDialog(){};
+ RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_undo_redo = nullptr);
+ ~RenameDialog() {}
};
#endif
diff --git a/editor/reparent_dialog.cpp b/editor/reparent_dialog.cpp
index dd35f41b7a..1615336a4b 100644
--- a/editor/reparent_dialog.cpp
+++ b/editor/reparent_dialog.cpp
@@ -35,53 +35,38 @@
#include "scene/gui/label.h"
void ReparentDialog::_notification(int p_what) {
-
if (p_what == NOTIFICATION_ENTER_TREE) {
-
- connect("confirmed", this, "_reparent");
+ connect("confirmed", callable_mp(this, &ReparentDialog::_reparent));
}
if (p_what == NOTIFICATION_EXIT_TREE) {
-
- disconnect("confirmed", this, "_reparent");
- }
-
- if (p_what == NOTIFICATION_DRAW) {
-
- //RID ci = get_canvas_item();
- //get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size()));
+ disconnect("confirmed", callable_mp(this, &ReparentDialog::_reparent));
}
}
void ReparentDialog::_cancel() {
-
hide();
}
-void ReparentDialog::_reparent() {
+void ReparentDialog::_reparent() {
if (tree->get_selected()) {
-
emit_signal("reparent", tree->get_selected()->get_path(), keep_transform->is_pressed());
hide();
}
}
void ReparentDialog::set_current(const Set<Node *> &p_selection) {
-
tree->set_marked(p_selection, false, false);
//tree->set_selected(p_node->get_parent());
}
void ReparentDialog::_bind_methods() {
-
- ClassDB::bind_method("_reparent", &ReparentDialog::_reparent);
ClassDB::bind_method("_cancel", &ReparentDialog::_cancel);
ADD_SIGNAL(MethodInfo("reparent", PropertyInfo(Variant::NODE_PATH, "path"), PropertyInfo(Variant::BOOL, "keep_global_xform")));
}
ReparentDialog::ReparentDialog() {
-
set_title(TTR("Reparent Node"));
VBoxContainer *vbc = memnew(VBoxContainer);
@@ -90,14 +75,8 @@ ReparentDialog::ReparentDialog() {
tree = memnew(SceneTreeEditor(false));
tree->set_show_enabled_subscene(true);
-
- vbc->add_margin_child(TTR("Reparent Location (Select new Parent):"), tree, true);
-
- tree->get_scene_tree()->connect("item_activated", this, "_reparent");
-
- //Label *label = memnew( Label );
- //label->set_position( Point2( 15,8) );
- //label->set_text("Reparent Location (Select new Parent):");
+ tree->get_scene_tree()->connect("item_activated", callable_mp(this, &ReparentDialog::_reparent));
+ vbc->add_margin_child(TTR("Select new parent:"), tree, true);
keep_transform = memnew(CheckBox);
keep_transform->set_text(TTR("Keep Global Transform"));
diff --git a/editor/reparent_dialog.h b/editor/reparent_dialog.h
index 29db70baa5..4566e3a02a 100644
--- a/editor/reparent_dialog.h
+++ b/editor/reparent_dialog.h
@@ -41,7 +41,6 @@
@author Juan Linietsky <reduzio@gmail.com>
*/
class ReparentDialog : public ConfirmationDialog {
-
GDCLASS(ReparentDialog, ConfirmationDialog);
SceneTreeEditor *tree;
diff --git a/editor/run_settings_dialog.cpp b/editor/run_settings_dialog.cpp
index 3a8d17b54e..b6dda4c5bb 100644
--- a/editor/run_settings_dialog.cpp
+++ b/editor/run_settings_dialog.cpp
@@ -31,46 +31,39 @@
#include "run_settings_dialog.h"
void RunSettingsDialog::popup_run_settings() {
-
popup_centered(Size2(300, 150));
}
void RunSettingsDialog::set_custom_arguments(const String &p_arguments) {
-
arguments->set_text(p_arguments);
}
-String RunSettingsDialog::get_custom_arguments() const {
+String RunSettingsDialog::get_custom_arguments() const {
return arguments->get_text();
}
void RunSettingsDialog::_bind_methods() {
-
- ClassDB::bind_method("_run_mode_changed", &RunSettingsDialog::_run_mode_changed);
//ClassDB::bind_method("_browse_selected_file",&RunSettingsDialog::_browse_selected_file);
}
void RunSettingsDialog::_run_mode_changed(int idx) {
-
- if (idx == 0)
+ if (idx == 0) {
arguments->set_editable(false);
- else
+ } else {
arguments->set_editable(true);
+ }
}
int RunSettingsDialog::get_run_mode() const {
-
return run_mode->get_selected();
}
void RunSettingsDialog::set_run_mode(int p_run_mode) {
-
run_mode->select(p_run_mode);
arguments->set_editable(p_run_mode);
}
RunSettingsDialog::RunSettingsDialog() {
-
/* SNAP DIALOG */
VBoxContainer *vbc = memnew(VBoxContainer);
@@ -81,7 +74,7 @@ RunSettingsDialog::RunSettingsDialog() {
vbc->add_margin_child(TTR("Run Mode:"), run_mode);
run_mode->add_item(TTR("Current Scene"));
run_mode->add_item(TTR("Main Scene"));
- run_mode->connect("item_selected", this, "_run_mode_changed");
+ run_mode->connect("item_selected", callable_mp(this, &RunSettingsDialog::_run_mode_changed));
arguments = memnew(LineEdit);
vbc->add_margin_child(TTR("Main Scene Arguments:"), arguments);
arguments->set_editable(false);
diff --git a/editor/run_settings_dialog.h b/editor/run_settings_dialog.h
index b812bbfa9e..4d6d842de0 100644
--- a/editor/run_settings_dialog.h
+++ b/editor/run_settings_dialog.h
@@ -37,7 +37,6 @@
#include "scene/gui/line_edit.h"
class RunSettingsDialog : public AcceptDialog {
-
GDCLASS(RunSettingsDialog, AcceptDialog);
public:
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index dca6087f8b..d9c95b1944 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -30,11 +30,11 @@
#include "scene_tree_dock.h"
+#include "core/input/input.h"
#include "core/io/resource_saver.h"
-#include "core/os/input.h"
#include "core/os/keyboard.h"
#include "core/project_settings.h"
-
+#include "editor/debugger/editor_debugger_node.h"
#include "editor/editor_feature_profile.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
@@ -42,14 +42,14 @@
#include "editor/multi_node_edit.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor/plugins/canvas_item_editor_plugin.h"
+#include "editor/plugins/node_3d_editor_plugin.h"
#include "editor/plugins/script_editor_plugin.h"
-#include "editor/plugins/spatial_editor_plugin.h"
-#include "editor/script_editor_debugger.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/resources/packed_scene.h"
+#include "servers/display_server.h"
+#include "servers/rendering_server.h"
void SceneTreeDock::_nodes_drag_begin() {
-
if (restore_script_editor_on_drag) {
EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
restore_script_editor_on_drag = false;
@@ -64,7 +64,6 @@ void SceneTreeDock::_quick_open() {
}
void SceneTreeDock::_input(Ref<InputEvent> p_event) {
-
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
@@ -73,15 +72,13 @@ void SceneTreeDock::_input(Ref<InputEvent> p_event) {
}
void SceneTreeDock::_unhandled_key_input(Ref<InputEvent> p_event) {
-
- if (get_viewport()->get_modal_stack_top())
- return; //ignore because of modal window
-
- if (get_focus_owner() && get_focus_owner()->is_text_field())
+ if (get_focus_owner() && get_focus_owner()->is_text_field()) {
return;
+ }
- if (!p_event->is_pressed() || p_event->is_echo())
+ if (!p_event->is_pressed() || p_event->is_echo()) {
return;
+ }
if (ED_IS_SHORTCUT("scene_tree/batch_rename", p_event)) {
_tool_selected(TOOL_BATCH_RENAME);
@@ -99,8 +96,8 @@ void SceneTreeDock::_unhandled_key_input(Ref<InputEvent> p_event) {
_tool_selected(TOOL_DUPLICATE);
} else if (ED_IS_SHORTCUT("scene_tree/attach_script", p_event)) {
_tool_selected(TOOL_ATTACH_SCRIPT);
- } else if (ED_IS_SHORTCUT("scene_tree/clear_script", p_event)) {
- _tool_selected(TOOL_CLEAR_SCRIPT);
+ } else if (ED_IS_SHORTCUT("scene_tree/detach_script", p_event)) {
+ _tool_selected(TOOL_DETACH_SCRIPT);
} else if (ED_IS_SHORTCUT("scene_tree/move_up", p_event)) {
_tool_selected(TOOL_MOVE_UP);
} else if (ED_IS_SHORTCUT("scene_tree/move_down", p_event)) {
@@ -121,7 +118,6 @@ void SceneTreeDock::_unhandled_key_input(Ref<InputEvent> p_event) {
}
void SceneTreeDock::instance(const String &p_file) {
-
Node *parent = scene_tree->get_selected();
if (!parent) {
@@ -129,10 +125,9 @@ void SceneTreeDock::instance(const String &p_file) {
};
if (!edited_scene) {
-
current_option = -1;
accept->set_text(TTR("No parent to instance a child at."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
};
@@ -144,7 +139,6 @@ void SceneTreeDock::instance(const String &p_file) {
}
void SceneTreeDock::instance_scenes(const Vector<String> &p_files, Node *p_parent) {
-
Node *parent = p_parent;
if (!parent) {
@@ -152,9 +146,8 @@ void SceneTreeDock::instance_scenes(const Vector<String> &p_files, Node *p_paren
}
if (!parent || !edited_scene) {
-
accept->set_text(TTR("No parent to instance the scenes at."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
};
@@ -162,7 +155,6 @@ void SceneTreeDock::instance_scenes(const Vector<String> &p_files, Node *p_paren
}
void SceneTreeDock::_perform_instance_scenes(const Vector<String> &p_files, Node *parent, int p_pos) {
-
ERR_FAIL_COND(!parent);
Vector<Node *> instances;
@@ -170,12 +162,11 @@ void SceneTreeDock::_perform_instance_scenes(const Vector<String> &p_files, Node
bool error = false;
for (int i = 0; i < p_files.size(); i++) {
-
Ref<PackedScene> sdata = ResourceLoader::load(p_files[i]);
if (!sdata.is_valid()) {
current_option = -1;
accept->set_text(vformat(TTR("Error loading scene from %s"), p_files[i]));
- accept->popup_centered_minsize();
+ accept->popup_centered();
error = true;
break;
}
@@ -184,17 +175,15 @@ void SceneTreeDock::_perform_instance_scenes(const Vector<String> &p_files, Node
if (!instanced_scene) {
current_option = -1;
accept->set_text(vformat(TTR("Error instancing scene from %s"), p_files[i]));
- accept->popup_centered_minsize();
+ accept->popup_centered();
error = true;
break;
}
if (edited_scene->get_filename() != "") {
-
if (_cyclical_dependency_exists(edited_scene->get_filename(), instanced_scene)) {
-
accept->set_text(vformat(TTR("Cannot instance the scene '%s' because the current scene exists within one of its nodes."), p_files[i]));
- accept->popup_centered_minsize();
+ accept->popup_centered();
error = true;
break;
}
@@ -215,7 +204,6 @@ void SceneTreeDock::_perform_instance_scenes(const Vector<String> &p_files, Node
editor_data->get_undo_redo().create_action(TTR("Instance Scene(s)"));
for (int i = 0; i < instances.size(); i++) {
-
Node *instanced_scene = instances[i];
editor_data->get_undo_redo().add_do_method(parent, "add_child", instanced_scene);
@@ -229,9 +217,9 @@ void SceneTreeDock::_perform_instance_scenes(const Vector<String> &p_files, Node
editor_data->get_undo_redo().add_undo_method(parent, "remove_child", instanced_scene);
String new_name = parent->validate_child_name(instanced_scene);
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_instance_node", edited_scene->get_path_to(parent), p_files[i], new_name);
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).plus_file(new_name)));
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_instance_node", edited_scene->get_path_to(parent), p_files[i], new_name);
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).plus_file(new_name)));
}
editor_data->get_undo_redo().commit_action();
@@ -241,14 +229,14 @@ void SceneTreeDock::_replace_with_branch_scene(const String &p_file, Node *base)
Ref<PackedScene> sdata = ResourceLoader::load(p_file);
if (!sdata.is_valid()) {
accept->set_text(vformat(TTR("Error loading scene from %s"), p_file));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
Node *instanced_scene = sdata->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
if (!instanced_scene) {
accept->set_text(vformat(TTR("Error instancing scene from %s"), p_file));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
@@ -318,13 +306,16 @@ bool SceneTreeDock::_track_inherit(const String &p_target_scene_path, Node *p_de
Ref<PackedScene> data = ResourceLoader::load(path);
if (data.is_valid()) {
p = data->instance(PackedScene::GEN_EDIT_STATE_INSTANCE);
- if (!p)
+ if (!p) {
continue;
+ }
instances.push_back(p);
- } else
+ } else {
break;
- } else
+ }
+ } else {
break;
+ }
}
for (int i = 0; i < instances.size(); i++) {
memdelete(instances[i]);
@@ -333,11 +324,9 @@ bool SceneTreeDock::_track_inherit(const String &p_target_scene_path, Node *p_de
}
void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
-
current_option = p_tool;
switch (p_tool) {
-
case TOOL_BATCH_RENAME: {
if (!profile_allow_editing) {
break;
@@ -358,25 +347,32 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} break;
case TOOL_NEW:
case TOOL_REPARENT_TO_NEW_NODE: {
-
if (!profile_allow_editing) {
break;
}
- String preferred = "";
- Node *current_edited_scene_root = EditorNode::get_singleton()->get_edited_scene();
+ // Prefer nodes that inherit from the current scene root.
+ Node *current_edited_scene_root = EditorNode::get_singleton()->get_edited_scene();
if (current_edited_scene_root) {
+ String root_class = current_edited_scene_root->get_class_name();
+ static Vector<String> preferred_types;
+ if (preferred_types.empty()) {
+ preferred_types.push_back("Control");
+ preferred_types.push_back("Node2D");
+ preferred_types.push_back("Node3D");
+ }
- if (ClassDB::is_parent_class(current_edited_scene_root->get_class_name(), "Node2D"))
- preferred = "Node2D";
- else if (ClassDB::is_parent_class(current_edited_scene_root->get_class_name(), "Spatial"))
- preferred = "Spatial";
+ for (int i = 0; i < preferred_types.size(); i++) {
+ if (ClassDB::is_parent_class(root_class, preferred_types[i])) {
+ create_dialog->set_preferred_search_result_type(preferred_types[i]);
+ break;
+ }
+ }
}
- create_dialog->set_preferred_search_result_type(preferred);
+
create_dialog->popup_create(true);
} break;
case TOOL_INSTANCE: {
-
if (!profile_allow_editing) {
break;
}
@@ -392,15 +388,16 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} break;
case TOOL_EXPAND_COLLAPSE: {
-
- if (!scene_tree->get_selected())
+ if (!scene_tree->get_selected()) {
break;
+ }
Tree *tree = scene_tree->get_scene_tree();
TreeItem *selected_item = tree->get_selected();
- if (!selected_item)
+ if (!selected_item) {
selected_item = tree->get_root();
+ }
bool collapsed = _is_collapsed_recursive(selected_item);
_set_collapsed_recursive(selected_item, !collapsed);
@@ -409,17 +406,18 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} break;
case TOOL_REPLACE: {
-
if (!profile_allow_editing) {
break;
}
Node *selected = scene_tree->get_selected();
- if (!selected && !editor_selection->get_selected_node_list().empty())
+ if (!selected && !editor_selection->get_selected_node_list().empty()) {
selected = editor_selection->get_selected_node_list().front()->get();
+ }
- if (selected)
+ if (selected) {
create_dialog->popup_create(false, true, selected->get_class());
+ }
} break;
case TOOL_EXTEND_SCRIPT: {
@@ -428,22 +426,21 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
case TOOL_ATTACH_SCRIPT: {
attach_script_to_selected(false);
} break;
- case TOOL_CLEAR_SCRIPT: {
-
+ case TOOL_DETACH_SCRIPT: {
if (!profile_allow_script_editing) {
break;
}
Array selection = editor_selection->get_selected_nodes();
- if (selection.empty())
+ if (selection.empty()) {
return;
+ }
- editor_data->get_undo_redo().create_action(TTR("Clear Script"));
- editor_data->get_undo_redo().add_do_method(editor, "push_item", (Script *)NULL);
+ editor_data->get_undo_redo().create_action(TTR("Detach Script"));
+ editor_data->get_undo_redo().add_do_method(editor, "push_item", (Script *)nullptr);
for (int i = 0; i < selection.size(); i++) {
-
Node *n = Object::cast_to<Node>(selection[i]);
Ref<Script> existing = n->get_script();
Ref<Script> empty = EditorNode::get_singleton()->get_object_custom_type_base(n);
@@ -460,24 +457,24 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} break;
case TOOL_MOVE_UP:
case TOOL_MOVE_DOWN: {
-
if (!profile_allow_editing) {
break;
}
- if (!scene_tree->get_selected())
+ if (!scene_tree->get_selected()) {
break;
+ }
if (scene_tree->get_selected() == edited_scene) {
-
current_option = -1;
accept->set_text(TTR("This operation can't be done on the tree root."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
break;
}
- if (!_validate_no_foreign())
+ if (!_validate_no_foreign()) {
break;
+ }
bool MOVING_DOWN = (p_tool == TOOL_MOVE_DOWN);
bool MOVING_UP = !MOVING_DOWN;
@@ -485,26 +482,37 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
Node *common_parent = scene_tree->get_selected()->get_parent();
List<Node *> selection = editor_selection->get_selected_node_list();
selection.sort_custom<Node::Comparator>(); // sort by index
- if (MOVING_DOWN)
+ if (MOVING_DOWN) {
selection.invert();
+ }
int lowest_id = common_parent->get_child_count() - 1;
int highest_id = 0;
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
int index = E->get()->get_index();
- if (index > highest_id) highest_id = index;
- if (index < lowest_id) lowest_id = index;
+ if (index > highest_id) {
+ highest_id = index;
+ }
+ if (index < lowest_id) {
+ lowest_id = index;
+ }
- if (E->get()->get_parent() != common_parent)
- common_parent = NULL;
+ if (E->get()->get_parent() != common_parent) {
+ common_parent = nullptr;
+ }
}
- if (!common_parent || (MOVING_DOWN && highest_id >= common_parent->get_child_count() - MOVING_DOWN) || (MOVING_UP && lowest_id == 0))
+ if (!common_parent || (MOVING_DOWN && highest_id >= common_parent->get_child_count() - MOVING_DOWN) || (MOVING_UP && lowest_id == 0)) {
break; // one or more nodes can not be moved
+ }
- if (selection.size() == 1) editor_data->get_undo_redo().create_action(TTR("Move Node In Parent"));
- if (selection.size() > 1) editor_data->get_undo_redo().create_action(TTR("Move Nodes In Parent"));
+ if (selection.size() == 1) {
+ editor_data->get_undo_redo().create_action(TTR("Move Node In Parent"));
+ }
+ if (selection.size() > 1) {
+ editor_data->get_undo_redo().create_action(TTR("Move Nodes In Parent"));
+ }
for (int i = 0; i < selection.size(); i++) {
Node *top_node = selection[i];
@@ -524,42 +532,43 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} break;
case TOOL_DUPLICATE: {
-
if (!profile_allow_editing) {
break;
}
- if (!edited_scene)
+ if (!edited_scene) {
break;
+ }
if (editor_selection->is_selected(edited_scene)) {
-
current_option = -1;
accept->set_text(TTR("This operation can't be done on the tree root."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
break;
}
- if (!_validate_no_foreign())
+ if (!_validate_no_foreign()) {
break;
+ }
List<Node *> selection = editor_selection->get_selected_node_list();
- if (selection.size() == 0)
+ if (selection.size() == 0) {
break;
+ }
editor_data->get_undo_redo().create_action(TTR("Duplicate Node(s)"));
editor_data->get_undo_redo().add_do_method(editor_selection, "clear");
- Node *dupsingle = NULL;
+ Node *dupsingle = nullptr;
List<Node *> editable_children;
selection.sort_custom<Node::Comparator>();
- for (List<Node *>::Element *E = selection.back(); E; E = E->prev()) {
+ Node *add_below_node = selection.back()->get();
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
Node *node = E->get();
Node *parent = node->get_parent();
- Node *selection_tail = _get_selection_group_tail(node, selection);
List<Node *> owned;
node->get_owned_by(node->get_owner(), &owned);
@@ -567,77 +576,79 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
Map<const Node *, Node *> duplimap;
Node *dup = node->duplicate_from_editor(duplimap);
- if (EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(node))
+ if (EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(node)) {
editable_children.push_back(dup);
+ }
ERR_CONTINUE(!dup);
- if (selection.size() == 1)
+ if (selection.size() == 1) {
dupsingle = dup;
+ }
dup->set_name(parent->validate_child_name(dup));
- editor_data->get_undo_redo().add_do_method(parent, "add_child_below_node", selection_tail, dup);
- for (List<Node *>::Element *F = owned.front(); F; F = F->next()) {
+ editor_data->get_undo_redo().add_do_method(add_below_node, "add_sibling", dup);
+ for (List<Node *>::Element *F = owned.front(); F; F = F->next()) {
if (!duplimap.has(F->get())) {
-
continue;
}
Node *d = duplimap[F->get()];
- editor_data->get_undo_redo().add_do_method(d, "set_owner", selection_tail->get_owner());
+ editor_data->get_undo_redo().add_do_method(d, "set_owner", node->get_owner());
}
editor_data->get_undo_redo().add_do_method(editor_selection, "add_node", dup);
editor_data->get_undo_redo().add_undo_method(parent, "remove_child", dup);
editor_data->get_undo_redo().add_do_reference(dup);
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_duplicate_node", edited_scene->get_path_to(node), dup->get_name());
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).plus_file(dup->get_name())));
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_duplicate_node", edited_scene->get_path_to(node), dup->get_name());
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).plus_file(dup->get_name())));
+
+ add_below_node = dup;
}
editor_data->get_undo_redo().commit_action();
- if (dupsingle)
+ if (dupsingle) {
editor->push_item(dupsingle);
+ }
- for (List<Node *>::Element *E = editable_children.front(); E; E = E->next())
+ for (List<Node *>::Element *E = editable_children.back(); E; E = E->prev()) {
_toggle_editable_children(E->get());
+ }
} break;
case TOOL_REPARENT: {
-
if (!profile_allow_editing) {
break;
}
- if (!scene_tree->get_selected())
+ if (!scene_tree->get_selected()) {
break;
+ }
if (editor_selection->is_selected(edited_scene)) {
-
current_option = -1;
accept->set_text(TTR("This operation can't be done on the tree root."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
break;
}
- if (!_validate_no_foreign())
+ if (!_validate_no_foreign()) {
break;
+ }
List<Node *> nodes = editor_selection->get_selected_node_list();
Set<Node *> nodeset;
for (List<Node *>::Element *E = nodes.front(); E; E = E->next()) {
-
nodeset.insert(E->get());
}
- reparent_dialog->popup_centered_ratio();
reparent_dialog->set_current(nodeset);
-
+ reparent_dialog->popup_centered_clamped(Size2(350, 700) * EDSCALE);
} break;
case TOOL_MAKE_ROOT: {
-
if (!profile_allow_editing) {
break;
}
@@ -648,26 +659,27 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
Node *node = nodes.front()->get();
Node *root = get_tree()->get_edited_scene_root();
- if (node == root)
+ if (node == root) {
return;
+ }
//check that from node to root, all owners are right
if (root->get_scene_inherited_state().is_valid()) {
accept->set_text(TTR("Can't reparent nodes in inherited scenes, order of nodes can't change."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
if (node->get_owner() != root) {
accept->set_text(TTR("Node must belong to the edited scene to become root."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
if (node->get_filename() != String()) {
accept->set_text(TTR("Instantiated scenes can't become root"));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
@@ -677,7 +689,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
editor_data->get_undo_redo().add_do_method(node, "add_child", root);
editor_data->get_undo_redo().add_do_method(node, "set_filename", root->get_filename());
editor_data->get_undo_redo().add_do_method(root, "set_filename", String());
- editor_data->get_undo_redo().add_do_method(node, "set_owner", (Object *)NULL);
+ editor_data->get_undo_redo().add_do_method(node, "set_owner", (Object *)nullptr);
editor_data->get_undo_redo().add_do_method(root, "set_owner", node);
_node_replace_owner(root, root, node, MODE_DO);
@@ -687,7 +699,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", root);
editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node);
editor_data->get_undo_redo().add_undo_method(node->get_parent(), "move_child", node, node->get_index());
- editor_data->get_undo_redo().add_undo_method(root, "set_owner", (Object *)NULL);
+ editor_data->get_undo_redo().add_undo_method(root, "set_owner", (Object *)nullptr);
editor_data->get_undo_redo().add_undo_method(node, "set_owner", root);
_node_replace_owner(root, root, root, MODE_UNDO);
@@ -696,14 +708,14 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
editor_data->get_undo_redo().commit_action();
} break;
case TOOL_MULTI_EDIT: {
-
if (!profile_allow_editing) {
break;
}
Node *root = EditorNode::get_singleton()->get_edited_scene();
- if (!root)
+ if (!root) {
break;
+ }
Ref<MultiNodeEdit> mne = memnew(MultiNodeEdit);
for (const Map<Node *, Object *>::Element *E = EditorNode::get_singleton()->get_editor_selection()->get_selection().front(); E; E = E->next()) {
mne->add_node(root->get_path_to(E->key()));
@@ -714,44 +726,55 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} break;
case TOOL_ERASE: {
-
if (!profile_allow_editing) {
break;
}
List<Node *> remove_list = editor_selection->get_selected_node_list();
- if (remove_list.empty())
+ if (remove_list.empty()) {
return;
+ }
- if (!_validate_no_foreign())
+ if (!_validate_no_foreign()) {
break;
+ }
if (p_confirm_override) {
_delete_confirm();
} else {
- if (remove_list.size() >= 2) {
- delete_dialog->set_text(vformat(TTR("Delete %d nodes?"), remove_list.size()));
- } else if (remove_list.size() == 1 && remove_list[0] == editor_data->get_edited_scene_root()) {
- delete_dialog->set_text(vformat(TTR("Delete the root node \"%s\"?"), remove_list[0]->get_name()));
- } else if (remove_list.size() == 1 && remove_list[0]->get_filename() == "" && remove_list[0]->get_child_count() >= 1) {
- // Display this message only for non-instanced scenes
- delete_dialog->set_text(vformat(TTR("Delete node \"%s\" and its children?"), remove_list[0]->get_name()));
+ String msg;
+ if (remove_list.size() > 1) {
+ bool any_children = false;
+ for (int i = 0; !any_children && i < remove_list.size(); i++) {
+ any_children = remove_list[i]->get_child_count() > 0;
+ }
+
+ msg = vformat(any_children ? TTR("Delete %d nodes and any children?") : TTR("Delete %d nodes?"), remove_list.size());
} else {
- delete_dialog->set_text(vformat(TTR("Delete node \"%s\"?"), remove_list[0]->get_name()));
+ Node *node = remove_list[0];
+ if (node == editor_data->get_edited_scene_root()) {
+ msg = vformat(TTR("Delete the root node \"%s\"?"), node->get_name());
+ } else if (node->get_filename() == "" && node->get_child_count() > 0) {
+ // Display this message only for non-instanced scenes
+ msg = vformat(TTR("Delete node \"%s\" and its children?"), node->get_name());
+ } else {
+ msg = vformat(TTR("Delete node \"%s\"?"), node->get_name());
+ }
}
+ delete_dialog->set_text(msg);
+
// Resize the dialog to its minimum size.
// This prevents the dialog from being too wide after displaying
// a deletion confirmation for a node with a long name.
delete_dialog->set_size(Size2());
- delete_dialog->popup_centered_minsize();
+ delete_dialog->popup_centered();
}
} break;
case TOOL_MERGE_FROM_SCENE: {
-
if (!profile_allow_editing) {
break;
}
@@ -759,7 +782,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
EditorNode::get_singleton()->merge_from_scene();
} break;
case TOOL_NEW_SCENE_FROM: {
-
if (!profile_allow_editing) {
break;
}
@@ -768,7 +790,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (!scene) {
accept->set_text(TTR("This operation can't be done without a scene."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
break;
}
@@ -776,7 +798,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (selection.size() != 1) {
accept->set_text(TTR("This operation requires a single selected node."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
break;
}
@@ -784,17 +806,17 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (tocopy == scene) {
accept->set_text(TTR("Can not perform with the root node."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
break;
}
if (tocopy != editor_data->get_edited_scene_root() && tocopy->get_filename() != "") {
accept->set_text(TTR("This operation can't be done on instanced scenes."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
break;
}
- new_scene_from_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ new_scene_from_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
List<String> extensions;
Ref<PackedScene> sd = memnew(PackedScene);
@@ -811,11 +833,10 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
}
new_scene_from_dialog->set_current_path(existing);
- new_scene_from_dialog->popup_centered_ratio();
new_scene_from_dialog->set_title(TTR("Save New Scene As..."));
+ new_scene_from_dialog->popup_file_dialog();
} break;
case TOOL_COPY_NODE_PATH: {
-
List<Node *> selection = editor_selection->get_selected_node_list();
List<Node *>::Element *e = selection.front();
if (e) {
@@ -823,7 +844,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (node) {
Node *root = EditorNode::get_singleton()->get_edited_scene();
NodePath path = root->get_path().rel_path_to(node->get_path());
- OS::get_singleton()->set_clipboard(path);
+ DisplayServer::get_singleton()->clipboard_set(path);
}
}
} break;
@@ -835,7 +856,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
} break;
case TOOL_SCENE_EDITABLE_CHILDREN: {
-
if (!profile_allow_editing) {
break;
}
@@ -849,7 +869,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (editable) {
editable_instance_remove_dialog->set_text(TTR("Disabling \"editable_instance\" will cause all properties of the node to be reverted to their default."));
- editable_instance_remove_dialog->popup_centered_minsize();
+ editable_instance_remove_dialog->popup_centered();
break;
}
_toggle_editable_children(node);
@@ -857,7 +877,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
}
} break;
case TOOL_SCENE_USE_PLACEHOLDER: {
-
if (!profile_allow_editing) {
break;
}
@@ -873,14 +892,15 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
// Fire confirmation dialog when children are editable.
if (editable && !placeholder) {
placeholder_editable_instance_remove_dialog->set_text(TTR("Enabling \"Load As Placeholder\" will disable \"Editable Children\" and cause all properties of the node to be reverted to their default."));
- placeholder_editable_instance_remove_dialog->popup_centered_minsize();
+ placeholder_editable_instance_remove_dialog->popup_centered();
break;
}
placeholder = !placeholder;
- if (placeholder)
+ if (placeholder) {
EditorNode::get_singleton()->get_edited_scene()->set_editable_instance(node, false);
+ }
node->set_scene_instance_load_placeholder(placeholder);
scene_tree->update_tree();
@@ -888,7 +908,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
}
} break;
case TOOL_SCENE_MAKE_LOCAL: {
-
if (!profile_allow_editing) {
break;
}
@@ -900,8 +919,9 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (node) {
Node *root = EditorNode::get_singleton()->get_edited_scene();
UndoRedo *undo_redo = &editor_data->get_undo_redo();
- if (!root)
+ if (!root) {
break;
+ }
ERR_FAIL_COND(node->get_filename() == String());
undo_redo->create_action(TTR("Make Local"));
@@ -915,7 +935,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
}
} break;
case TOOL_SCENE_OPEN: {
-
List<Node *> selection = editor_selection->get_selected_node_list();
List<Node *>::Element *e = selection.front();
if (e) {
@@ -930,7 +949,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
break;
}
- clear_inherit_confirm->popup_centered_minsize();
+ clear_inherit_confirm->popup_centered();
} break;
case TOOL_SCENE_CLEAR_INHERITANCE_CONFIRM: {
if (!profile_allow_editing) {
@@ -949,7 +968,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
}
} break;
case TOOL_SCENE_OPEN_INHERITED: {
-
List<Node *> selection = editor_selection->get_selected_node_list();
List<Node *>::Element *e = selection.front();
if (e) {
@@ -963,8 +981,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
case TOOL_CREATE_3D_SCENE:
case TOOL_CREATE_USER_INTERFACE:
case TOOL_CREATE_FAVORITE: {
-
- Node *new_node = NULL;
+ Node *new_node = nullptr;
if (TOOL_CREATE_FAVORITE == p_tool) {
String name = selected_favorite_root.get_slicec(' ', 0);
@@ -972,7 +989,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
new_node = Object::cast_to<Node>(ClassDB::instance(ScriptServer::get_global_class_native_base(name)));
Ref<Script> script = ResourceLoader::load(ScriptServer::get_global_class_path(name), "Script");
if (new_node && script.is_valid()) {
- new_node->set_script(script.get_ref_ptr());
+ new_node->set_script(script);
new_node->set_name(name);
}
} else {
@@ -981,12 +998,16 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (!new_node) {
new_node = memnew(Node);
- ERR_PRINTS("Creating root from favorite '" + selected_favorite_root + "' failed. Creating 'Node' instead.");
+ ERR_PRINT("Creating root from favorite '" + selected_favorite_root + "' failed. Creating 'Node' instead.");
}
} else {
switch (p_tool) {
- case TOOL_CREATE_2D_SCENE: new_node = memnew(Node2D); break;
- case TOOL_CREATE_3D_SCENE: new_node = memnew(Spatial); break;
+ case TOOL_CREATE_2D_SCENE:
+ new_node = memnew(Node2D);
+ break;
+ case TOOL_CREATE_3D_SCENE:
+ new_node = memnew(Node3D);
+ break;
case TOOL_CREATE_USER_INTERFACE: {
Control *node = memnew(Control);
node->set_anchors_and_margins_preset(PRESET_WIDE); //more useful for resizable UIs.
@@ -1000,7 +1021,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", new_node);
editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree");
editor_data->get_undo_redo().add_do_reference(new_node);
- editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)NULL);
+ editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr);
editor_data->get_undo_redo().commit_action();
editor->edit_node(new_node);
@@ -1010,9 +1031,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
} break;
default: {
-
if (p_tool >= EDIT_SUBRESOURCE_BASE) {
-
int idx = p_tool - EDIT_SUBRESOURCE_BASE;
ERR_FAIL_INDEX(idx, subresources.size());
@@ -1027,10 +1046,10 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
}
void SceneTreeDock::_node_collapsed(Object *p_obj) {
-
TreeItem *ti = Object::cast_to<TreeItem>(p_obj);
- if (!ti)
+ if (!ti) {
return;
+ }
if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
_set_collapsed_recursive(ti, ti->is_collapsed());
@@ -1038,37 +1057,36 @@ void SceneTreeDock::_node_collapsed(Object *p_obj) {
}
void SceneTreeDock::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_READY: {
-
- if (!first_enter)
+ if (!first_enter) {
break;
+ }
first_enter = false;
- EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", this, "_feature_profile_changed");
+ EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &SceneTreeDock::_feature_profile_changed));
CanvasItemEditorPlugin *canvas_item_plugin = Object::cast_to<CanvasItemEditorPlugin>(editor_data->get_editor("2D"));
if (canvas_item_plugin) {
- canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", scene_tree, "_update_tree");
- canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", scene_tree, "_update_tree");
- scene_tree->connect("node_changed", canvas_item_plugin->get_canvas_item_editor()->get_viewport_control(), "update");
+ canvas_item_plugin->get_canvas_item_editor()->connect_compat("item_lock_status_changed", scene_tree, "_update_tree");
+ canvas_item_plugin->get_canvas_item_editor()->connect_compat("item_group_status_changed", scene_tree, "_update_tree");
+ scene_tree->connect("node_changed", callable_mp((CanvasItem *)canvas_item_plugin->get_canvas_item_editor()->get_viewport_control(), &CanvasItem::update));
}
- SpatialEditorPlugin *spatial_editor_plugin = Object::cast_to<SpatialEditorPlugin>(editor_data->get_editor("3D"));
- spatial_editor_plugin->get_spatial_editor()->connect("item_lock_status_changed", scene_tree, "_update_tree");
- spatial_editor_plugin->get_spatial_editor()->connect("item_group_status_changed", scene_tree, "_update_tree");
+ Node3DEditorPlugin *spatial_editor_plugin = Object::cast_to<Node3DEditorPlugin>(editor_data->get_editor("3D"));
+ spatial_editor_plugin->get_spatial_editor()->connect_compat("item_lock_status_changed", scene_tree, "_update_tree");
+ spatial_editor_plugin->get_spatial_editor()->connect_compat("item_group_status_changed", scene_tree, "_update_tree");
- button_add->set_icon(get_icon("Add", "EditorIcons"));
- button_instance->set_icon(get_icon("Instance", "EditorIcons"));
- button_create_script->set_icon(get_icon("ScriptCreate", "EditorIcons"));
- button_clear_script->set_icon(get_icon("ScriptRemove", "EditorIcons"));
+ button_add->set_icon(get_theme_icon("Add", "EditorIcons"));
+ button_instance->set_icon(get_theme_icon("Instance", "EditorIcons"));
+ button_create_script->set_icon(get_theme_icon("ScriptCreate", "EditorIcons"));
+ button_detach_script->set_icon(get_theme_icon("ScriptRemove", "EditorIcons"));
- filter->set_right_icon(get_icon("Search", "EditorIcons"));
+ filter->set_right_icon(get_theme_icon("Search", "EditorIcons"));
filter->set_clear_button_enabled(true);
- EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", this, "_selection_changed");
- scene_tree->get_scene_tree()->connect("item_collapsed", this, "_node_collapsed");
+ EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &SceneTreeDock::_selection_changed));
+ scene_tree->get_scene_tree()->connect("item_collapsed", callable_mp(this, &SceneTreeDock::_node_collapsed));
// create_root_dialog
HBoxContainer *top_row = memnew(HBoxContainer);
@@ -1077,13 +1095,15 @@ void SceneTreeDock::_notification(int p_what) {
top_row->add_child(memnew(Label(TTR("Create Root Node:"))));
top_row->add_spacer();
- ToolButton *node_shortcuts_toggle = memnew(ToolButton);
+ Button *node_shortcuts_toggle = memnew(Button);
+ node_shortcuts_toggle->set_flat(true);
node_shortcuts_toggle->set_name("NodeShortcutsToggle");
- node_shortcuts_toggle->set_icon(get_icon("Favorites", "EditorIcons"));
+ node_shortcuts_toggle->set_icon(get_theme_icon("Favorites", "EditorIcons"));
node_shortcuts_toggle->set_toggle_mode(true);
+ node_shortcuts_toggle->set_tooltip(TTR("Switch to Favorite Nodes"));
node_shortcuts_toggle->set_pressed(EDITOR_GET("_use_favorites_root_selection"));
node_shortcuts_toggle->set_anchors_and_margins_preset(Control::PRESET_CENTER_RIGHT);
- node_shortcuts_toggle->connect("pressed", this, "_update_create_root_dialog");
+ node_shortcuts_toggle->connect("pressed", callable_mp(this, &SceneTreeDock::_update_create_root_dialog));
top_row->add_child(node_shortcuts_toggle);
create_root_dialog->add_child(top_row);
@@ -1095,32 +1115,33 @@ void SceneTreeDock::_notification(int p_what) {
beginner_node_shortcuts->set_name("BeginnerNodeShortcuts");
node_shortcuts->add_child(beginner_node_shortcuts);
- Button *button_2d = memnew(Button);
+ button_2d = memnew(Button);
beginner_node_shortcuts->add_child(button_2d);
button_2d->set_text(TTR("2D Scene"));
- button_2d->set_icon(get_icon("Node2D", "EditorIcons"));
- button_2d->connect("pressed", this, "_tool_selected", make_binds(TOOL_CREATE_2D_SCENE, false));
+ button_2d->set_icon(get_theme_icon("Node2D", "EditorIcons"));
+ button_2d->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_CREATE_2D_SCENE, false));
+
button_3d = memnew(Button);
beginner_node_shortcuts->add_child(button_3d);
button_3d->set_text(TTR("3D Scene"));
- button_3d->set_icon(get_icon("Spatial", "EditorIcons"));
- button_3d->connect("pressed", this, "_tool_selected", make_binds(TOOL_CREATE_3D_SCENE, false));
+ button_3d->set_icon(get_theme_icon("Node3D", "EditorIcons"));
+ button_3d->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_CREATE_3D_SCENE, false));
- Button *button_ui = memnew(Button);
+ button_ui = memnew(Button);
beginner_node_shortcuts->add_child(button_ui);
button_ui->set_text(TTR("User Interface"));
- button_ui->set_icon(get_icon("Control", "EditorIcons"));
- button_ui->connect("pressed", this, "_tool_selected", make_binds(TOOL_CREATE_USER_INTERFACE, false));
+ button_ui->set_icon(get_theme_icon("Control", "EditorIcons"));
+ button_ui->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_CREATE_USER_INTERFACE, false));
VBoxContainer *favorite_node_shortcuts = memnew(VBoxContainer);
favorite_node_shortcuts->set_name("FavoriteNodeShortcuts");
node_shortcuts->add_child(favorite_node_shortcuts);
- Button *button_custom = memnew(Button);
+ button_custom = memnew(Button);
node_shortcuts->add_child(button_custom);
button_custom->set_text(TTR("Other Node"));
- button_custom->set_icon(get_icon("Add", "EditorIcons"));
- button_custom->connect("pressed", this, "_tool_selected", make_binds(TOOL_NEW, false));
+ button_custom->set_icon(get_theme_icon("Add", "EditorIcons"));
+ button_custom->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_NEW, false));
node_shortcuts->add_spacer();
create_root_dialog->add_child(node_shortcuts);
@@ -1128,24 +1149,27 @@ void SceneTreeDock::_notification(int p_what) {
} break;
case NOTIFICATION_ENTER_TREE: {
- clear_inherit_confirm->connect("confirmed", this, "_tool_selected", varray(TOOL_SCENE_CLEAR_INHERITANCE_CONFIRM));
+ clear_inherit_confirm->connect("confirmed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_SCENE_CLEAR_INHERITANCE_CONFIRM, false));
} break;
case NOTIFICATION_EXIT_TREE: {
- clear_inherit_confirm->disconnect("confirmed", this, "_tool_selected");
+ clear_inherit_confirm->disconnect("confirmed", callable_mp(this, &SceneTreeDock::_tool_selected));
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
- button_add->set_icon(get_icon("Add", "EditorIcons"));
- button_instance->set_icon(get_icon("Instance", "EditorIcons"));
- button_create_script->set_icon(get_icon("ScriptCreate", "EditorIcons"));
- button_clear_script->set_icon(get_icon("ScriptRemove", "EditorIcons"));
-
- filter->set_right_icon(get_icon("Search", "EditorIcons"));
+ button_add->set_icon(get_theme_icon("Add", "EditorIcons"));
+ button_instance->set_icon(get_theme_icon("Instance", "EditorIcons"));
+ button_create_script->set_icon(get_theme_icon("ScriptCreate", "EditorIcons"));
+ button_detach_script->set_icon(get_theme_icon("ScriptRemove", "EditorIcons"));
+ button_2d->set_icon(get_theme_icon("Node2D", "EditorIcons"));
+ button_3d->set_icon(get_theme_icon("Node3D", "EditorIcons"));
+ button_ui->set_icon(get_theme_icon("Control", "EditorIcons"));
+ button_custom->set_icon(get_theme_icon("Add", "EditorIcons"));
+
+ filter->set_right_icon(get_theme_icon("Search", "EditorIcons"));
filter->set_clear_button_enabled(true);
} break;
case NOTIFICATION_PROCESS: {
-
- bool show_create_root = bool(EDITOR_GET("interface/editors/show_scene_tree_root_selection")) && get_tree()->get_edited_scene_root() == NULL;
+ bool show_create_root = bool(EDITOR_GET("interface/editors/show_scene_tree_root_selection")) && get_tree()->get_edited_scene_root() == nullptr;
if (show_create_root != create_root_dialog->is_visible_in_tree() && !remote_tree->is_visible()) {
if (show_create_root) {
@@ -1162,7 +1186,6 @@ void SceneTreeDock::_notification(int p_what) {
}
void SceneTreeDock::_node_replace_owner(Node *p_base, Node *p_node, Node *p_root, ReplaceOwnerMode p_mode) {
-
if (p_node->get_owner() == p_base && p_node != p_root) {
UndoRedo *undo_redo = &editor_data->get_undo_redo();
switch (p_mode) {
@@ -1188,22 +1211,17 @@ void SceneTreeDock::_node_replace_owner(Node *p_base, Node *p_node, Node *p_root
}
void SceneTreeDock::_load_request(const String &p_path) {
-
editor->open_request(p_path);
}
void SceneTreeDock::_script_open_request(const Ref<Script> &p_script) {
-
editor->edit_resource(p_script);
}
void SceneTreeDock::_node_selected() {
-
Node *node = scene_tree->get_selected();
if (!node) {
-
- editor->push_item(NULL);
return;
}
@@ -1215,31 +1233,30 @@ void SceneTreeDock::_node_selected() {
}
void SceneTreeDock::_node_renamed() {
-
_node_selected();
}
void SceneTreeDock::_set_owners(Node *p_owner, const Array &p_nodes) {
-
for (int i = 0; i < p_nodes.size(); i++) {
-
Node *n = Object::cast_to<Node>(p_nodes[i]);
- if (!n)
+ if (!n) {
continue;
+ }
n->set_owner(p_owner);
}
}
-void SceneTreeDock::_fill_path_renames(Vector<StringName> base_path, Vector<StringName> new_base_path, Node *p_node, List<Pair<NodePath, NodePath> > *p_renames) {
-
+void SceneTreeDock::_fill_path_renames(Vector<StringName> base_path, Vector<StringName> new_base_path, Node *p_node, List<Pair<NodePath, NodePath>> *p_renames) {
base_path.push_back(p_node->get_name());
- if (new_base_path.size())
+ if (new_base_path.size()) {
new_base_path.push_back(p_node->get_name());
+ }
NodePath from(base_path, true);
NodePath to;
- if (new_base_path.size())
+ if (new_base_path.size()) {
to = NodePath(new_base_path, true);
+ }
Pair<NodePath, NodePath> npp;
npp.first = from;
@@ -1248,15 +1265,14 @@ void SceneTreeDock::_fill_path_renames(Vector<StringName> base_path, Vector<Stri
p_renames->push_back(npp);
for (int i = 0; i < p_node->get_child_count(); i++) {
-
_fill_path_renames(base_path, new_base_path, p_node->get_child(i), p_renames);
}
}
-void SceneTreeDock::fill_path_renames(Node *p_node, Node *p_new_parent, List<Pair<NodePath, NodePath> > *p_renames) {
-
- if (!bool(EDITOR_DEF("editors/animation/autorename_animation_tracks", true)))
+void SceneTreeDock::fill_path_renames(Node *p_node, Node *p_new_parent, List<Pair<NodePath, NodePath>> *p_renames) {
+ if (!bool(EDITOR_DEF("editors/animation/autorename_animation_tracks", true))) {
return;
+ }
Vector<StringName> base_path;
Node *n = p_node->get_parent();
@@ -1280,40 +1296,35 @@ void SceneTreeDock::fill_path_renames(Node *p_node, Node *p_new_parent, List<Pai
_fill_path_renames(base_path, new_base_path, p_node, p_renames);
}
-void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodePath> > *p_renames, Map<Ref<Animation>, Set<int> > *r_rem_anims) {
+void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodePath>> *p_renames, Map<Ref<Animation>, Set<int>> *r_rem_anims) {
+ Map<Ref<Animation>, Set<int>> rem_anims;
- Map<Ref<Animation>, Set<int> > rem_anims;
-
- if (!r_rem_anims)
+ if (!r_rem_anims) {
r_rem_anims = &rem_anims;
+ }
if (!p_base) {
-
p_base = edited_scene;
}
- if (!p_base)
+ if (!p_base) {
return;
+ }
// Renaming node paths used in script instances
if (p_base->get_script_instance()) {
-
ScriptInstance *si = p_base->get_script_instance();
if (si) {
-
List<PropertyInfo> properties;
si->get_property_list(&properties);
for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
-
String propertyname = E->get().name;
Variant p = p_base->get(propertyname);
if (p.get_type() == Variant::NODE_PATH) {
-
// Goes through all paths to check if its matching
- for (List<Pair<NodePath, NodePath> >::Element *F = p_renames->front(); F; F = F->next()) {
-
+ for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) {
NodePath root_path = p_base->get_path();
NodePath rel_path_old = root_path.rel_path_to(F->get().first);
@@ -1327,7 +1338,6 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
// if old path detected, then it needs to be replaced with the new one
if (p == rel_path_old) {
-
editor_data->get_undo_redo().add_do_property(p_base, propertyname, rel_path_new);
editor_data->get_undo_redo().add_undo_property(p_base, propertyname, rel_path_old);
@@ -1343,19 +1353,16 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
bool autorename_animation_tracks = bool(EDITOR_DEF("editors/animation/autorename_animation_tracks", true));
if (autorename_animation_tracks && Object::cast_to<AnimationPlayer>(p_base)) {
-
AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_base);
List<StringName> anims;
ap->get_animation_list(&anims);
Node *root = ap->get_node(ap->get_root());
if (root) {
-
NodePath root_path = root->get_path();
NodePath new_root_path = root_path;
- for (List<Pair<NodePath, NodePath> >::Element *E = p_renames->front(); E; E = E->next()) {
-
+ for (List<Pair<NodePath, NodePath>>::Element *E = p_renames->front(); E; E = E->next()) {
if (E->get().first == root_path) {
new_root_path = E->get().second;
break;
@@ -1366,22 +1373,22 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
//will not be erased
for (List<StringName>::Element *E = anims.front(); E; E = E->next()) {
-
Ref<Animation> anim = ap->get_animation(E->get());
if (!r_rem_anims->has(anim)) {
r_rem_anims->insert(anim, Set<int>());
Set<int> &ran = r_rem_anims->find(anim)->get();
- for (int i = 0; i < anim->get_track_count(); i++)
+ for (int i = 0; i < anim->get_track_count(); i++) {
ran.insert(i);
+ }
}
Set<int> &ran = r_rem_anims->find(anim)->get();
- if (anim.is_null())
+ if (anim.is_null()) {
continue;
+ }
for (int i = 0; i < anim->get_track_count(); i++) {
-
NodePath track_np = anim->track_get_path(i);
Node *n = root->get_node(track_np);
if (!n) {
@@ -1390,13 +1397,12 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
NodePath old_np = n->get_path();
- if (!ran.has(i))
+ if (!ran.has(i)) {
continue; //channel was removed
+ }
- for (List<Pair<NodePath, NodePath> >::Element *F = p_renames->front(); F; F = F->next()) {
-
+ for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) {
if (F->get().first == old_np) {
-
if (F->get().second == NodePath()) {
//will be erased
@@ -1414,7 +1420,6 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
editor_data->get_undo_redo().add_undo_method(anim.ptr(), "track_set_path", idx, track_np);
editor_data->get_undo_redo().add_undo_method(anim.ptr(), "track_set_interpolation_type", idx, anim->track_get_interpolation_type(i));
for (int j = 0; j < anim->track_get_key_count(i); j++) {
-
editor_data->get_undo_redo().add_undo_method(anim.ptr(), "track_insert_key", idx, anim->track_get_key_time(i, j), anim->track_get_key_value(i, j), anim->track_get_key_transition(i, j));
}
@@ -1425,8 +1430,9 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
NodePath rel_path = new_root_path.rel_path_to(F->get().second);
NodePath new_path = NodePath(rel_path.get_names(), track_np.get_subnames(), false);
- if (new_path == track_np)
+ if (new_path == track_np) {
continue; //bleh
+ }
editor_data->get_undo_redo().add_do_method(anim.ptr(), "track_set_path", i, new_path);
editor_data->get_undo_redo().add_undo_method(anim.ptr(), "track_set_path", i, track_np);
}
@@ -1438,13 +1444,13 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP
}
}
- for (int i = 0; i < p_base->get_child_count(); i++)
+ for (int i = 0; i < p_base->get_child_count(); i++) {
perform_node_renames(p_base->get_child(i), p_renames, r_rem_anims);
+ }
}
void SceneTreeDock::_node_prerenamed(Node *p_node, const String &p_new_name) {
-
- List<Pair<NodePath, NodePath> > path_renames;
+ List<Pair<NodePath, NodePath>> path_renames;
Vector<StringName> base_path;
Node *n = p_node->get_parent();
@@ -1464,22 +1470,20 @@ void SceneTreeDock::_node_prerenamed(Node *p_node, const String &p_new_name) {
npp.second = NodePath(new_base_path, true);
path_renames.push_back(npp);
- for (int i = 0; i < p_node->get_child_count(); i++)
+ for (int i = 0; i < p_node->get_child_count(); i++) {
_fill_path_renames(base_path, new_base_path, p_node->get_child(i), &path_renames);
+ }
- perform_node_renames(NULL, &path_renames);
+ perform_node_renames(nullptr, &path_renames);
}
bool SceneTreeDock::_validate_no_foreign() {
-
List<Node *> selection = editor_selection->get_selected_node_list();
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
-
if (E->get() != edited_scene && E->get()->get_owner() != edited_scene) {
-
accept->set_text(TTR("Can't operate on nodes from a foreign scene!"));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return false;
}
@@ -1491,9 +1495,8 @@ bool SceneTreeDock::_validate_no_foreign() {
}
if (edited_scene->get_scene_inherited_state().is_valid() && edited_scene->get_scene_inherited_state()->find_node_by_path(edited_scene->get_path_to(E->get())) >= 0) {
-
accept->set_text(TTR("Can't operate on nodes the current scene inherits from!"));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return false;
}
}
@@ -1502,14 +1505,14 @@ bool SceneTreeDock::_validate_no_foreign() {
}
void SceneTreeDock::_node_reparent(NodePath p_path, bool p_keep_global_xform) {
-
Node *new_parent = scene_root->get_node(p_path);
ERR_FAIL_COND(!new_parent);
List<Node *> selection = editor_selection->get_selected_node_list();
- if (selection.empty())
+ if (selection.empty()) {
return; // Nothing to reparent.
+ }
Vector<Node *> nodes;
@@ -1521,31 +1524,32 @@ void SceneTreeDock::_node_reparent(NodePath p_path, bool p_keep_global_xform) {
}
void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, Vector<Node *> p_nodes, bool p_keep_global_xform) {
-
Node *new_parent = p_new_parent;
ERR_FAIL_COND(!new_parent);
- if (p_nodes.size() == 0)
+ if (p_nodes.size() == 0) {
return; // Nothing to reparent.
+ }
p_nodes.sort_custom<Node::Comparator>(); //Makes result reliable.
bool no_change = true;
for (int ni = 0; ni < p_nodes.size(); ni++) {
-
- if (p_nodes[ni] == p_new_parent)
+ if (p_nodes[ni] == p_new_parent) {
return; // Attempt to reparent to itself.
+ }
- if (p_nodes[ni]->get_parent() != p_new_parent || p_position_in_parent + ni != p_nodes[ni]->get_position_in_parent())
+ if (p_nodes[ni]->get_parent() != p_new_parent || p_position_in_parent + ni != p_nodes[ni]->get_index()) {
no_change = false;
+ }
}
- if (no_change)
+ if (no_change) {
return; // Position and parent didn't change.
+ }
Node *validate = new_parent;
while (validate) {
-
ERR_FAIL_COND_MSG(p_nodes.find(validate) != -1, "Selection changed at some point. Can't reparent.");
validate = validate->get_parent();
}
@@ -1555,13 +1559,12 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V
editor_data->get_undo_redo().create_action(TTR("Reparent Node"));
- List<Pair<NodePath, NodePath> > path_renames;
+ List<Pair<NodePath, NodePath>> path_renames;
Vector<StringName> former_names;
int inc = 0;
for (int ni = 0; ni < p_nodes.size(); ni++) {
-
// No undo implemented for this yet.
Node *node = p_nodes[ni];
@@ -1575,22 +1578,23 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V
owners.push_back(E->get());
}
- if (new_parent == node->get_parent() && node->get_index() < p_position_in_parent + ni)
+ if (new_parent == node->get_parent() && node->get_index() < p_position_in_parent + ni) {
inc--; // If the child will generate a gap when moved, adjust.
+ }
editor_data->get_undo_redo().add_do_method(node->get_parent(), "remove_child", node);
editor_data->get_undo_redo().add_do_method(new_parent, "add_child", node);
- if (p_position_in_parent >= 0)
+ if (p_position_in_parent >= 0) {
editor_data->get_undo_redo().add_do_method(new_parent, "move_child", node, p_position_in_parent + inc);
+ }
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
String old_name = former_names[ni];
String new_name = new_parent->validate_child_name(node);
// Name was modified, fix the path renames.
if (old_name.casecmp_to(new_name) != 0) {
-
// Fix the to name to have the new name.
NodePath old_new_name = path_renames[ni].second;
NodePath new_path;
@@ -1609,22 +1613,26 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V
path_renames[ni].second = fixed_node_path;
}
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_reparent_node", edited_scene->get_path_to(node), edited_scene->get_path_to(new_parent), new_name, p_position_in_parent + inc);
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_reparent_node", NodePath(String(edited_scene->get_path_to(new_parent)).plus_file(new_name)), edited_scene->get_path_to(node->get_parent()), node->get_name(), node->get_index());
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_reparent_node", edited_scene->get_path_to(node), edited_scene->get_path_to(new_parent), new_name, p_position_in_parent + inc);
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_reparent_node", NodePath(String(edited_scene->get_path_to(new_parent)).plus_file(new_name)), edited_scene->get_path_to(node->get_parent()), node->get_name(), node->get_index());
if (p_keep_global_xform) {
- if (Object::cast_to<Node2D>(node))
+ if (Object::cast_to<Node2D>(node)) {
editor_data->get_undo_redo().add_do_method(node, "set_global_transform", Object::cast_to<Node2D>(node)->get_global_transform());
- if (Object::cast_to<Spatial>(node))
- editor_data->get_undo_redo().add_do_method(node, "set_global_transform", Object::cast_to<Spatial>(node)->get_global_transform());
- if (Object::cast_to<Control>(node))
+ }
+ if (Object::cast_to<Node3D>(node)) {
+ editor_data->get_undo_redo().add_do_method(node, "set_global_transform", Object::cast_to<Node3D>(node)->get_global_transform());
+ }
+ if (Object::cast_to<Control>(node)) {
editor_data->get_undo_redo().add_do_method(node, "set_global_position", Object::cast_to<Control>(node)->get_global_position());
+ }
}
editor_data->get_undo_redo().add_do_method(this, "_set_owners", edited_scene, owners);
- if (AnimationPlayerEditor::singleton->get_track_editor()->get_root() == node)
+ if (AnimationPlayerEditor::singleton->get_track_editor()->get_root() == node) {
editor_data->get_undo_redo().add_do_method(AnimationPlayerEditor::singleton->get_track_editor(), "set_root", node);
+ }
editor_data->get_undo_redo().add_undo_method(new_parent, "remove_child", node);
editor_data->get_undo_redo().add_undo_method(node, "set_name", former_names[ni]);
@@ -1634,49 +1642,49 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V
// Add and move in a second step (so old order is preserved).
for (int ni = 0; ni < p_nodes.size(); ni++) {
-
Node *node = p_nodes[ni];
List<Node *> owned;
node->get_owned_by(node->get_owner(), &owned);
Array owners;
for (List<Node *>::Element *E = owned.front(); E; E = E->next()) {
-
owners.push_back(E->get());
}
- int child_pos = node->get_position_in_parent();
+ int child_pos = node->get_index();
editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node);
editor_data->get_undo_redo().add_undo_method(node->get_parent(), "move_child", node, child_pos);
editor_data->get_undo_redo().add_undo_method(this, "_set_owners", edited_scene, owners);
- if (AnimationPlayerEditor::singleton->get_track_editor()->get_root() == node)
+ if (AnimationPlayerEditor::singleton->get_track_editor()->get_root() == node) {
editor_data->get_undo_redo().add_undo_method(AnimationPlayerEditor::singleton->get_track_editor(), "set_root", node);
+ }
if (p_keep_global_xform) {
- if (Object::cast_to<Node2D>(node))
+ if (Object::cast_to<Node2D>(node)) {
editor_data->get_undo_redo().add_undo_method(node, "set_transform", Object::cast_to<Node2D>(node)->get_transform());
- if (Object::cast_to<Spatial>(node))
- editor_data->get_undo_redo().add_undo_method(node, "set_transform", Object::cast_to<Spatial>(node)->get_transform());
- if (Object::cast_to<Control>(node))
+ }
+ if (Object::cast_to<Node3D>(node)) {
+ editor_data->get_undo_redo().add_undo_method(node, "set_transform", Object::cast_to<Node3D>(node)->get_transform());
+ }
+ if (Object::cast_to<Control>(node)) {
editor_data->get_undo_redo().add_undo_method(node, "set_position", Object::cast_to<Control>(node)->get_position());
+ }
}
}
- perform_node_renames(NULL, &path_renames);
+ perform_node_renames(nullptr, &path_renames);
editor_data->get_undo_redo().commit_action();
}
bool SceneTreeDock::_is_collapsed_recursive(TreeItem *p_item) const {
-
bool is_branch_collapsed = false;
List<TreeItem *> needs_check;
needs_check.push_back(p_item);
while (!needs_check.empty()) {
-
TreeItem *item = needs_check.back()->get();
needs_check.pop_back();
@@ -1695,12 +1703,10 @@ bool SceneTreeDock::_is_collapsed_recursive(TreeItem *p_item) const {
}
void SceneTreeDock::_set_collapsed_recursive(TreeItem *p_item, bool p_collapsed) {
-
List<TreeItem *> to_collapse;
to_collapse.push_back(p_item);
while (!to_collapse.empty()) {
-
TreeItem *item = to_collapse.back()->get();
to_collapse.pop_back();
@@ -1715,17 +1721,16 @@ void SceneTreeDock::_set_collapsed_recursive(TreeItem *p_item, bool p_collapsed)
}
void SceneTreeDock::_script_created(Ref<Script> p_script) {
-
List<Node *> selected = editor_selection->get_selected_node_list();
- if (selected.empty())
+ if (selected.empty()) {
return;
+ }
editor_data->get_undo_redo().create_action(TTR("Attach Script"));
for (List<Node *>::Element *E = selected.front(); E; E = E->next()) {
-
Ref<Script> existing = E->get()->get_script();
- editor_data->get_undo_redo().add_do_method(E->get(), "set_script", p_script.get_ref_ptr());
+ editor_data->get_undo_redo().add_do_method(E->get(), "set_script", p_script);
editor_data->get_undo_redo().add_undo_method(E->get(), "set_script", existing);
editor_data->get_undo_redo().add_do_method(this, "_update_script_button");
editor_data->get_undo_redo().add_undo_method(this, "_update_script_button");
@@ -1738,11 +1743,10 @@ void SceneTreeDock::_script_created(Ref<Script> p_script) {
}
void SceneTreeDock::_script_creation_closed() {
- script_create_dialog->disconnect("script_created", this, "_script_created");
+ script_create_dialog->disconnect("script_created", callable_mp(this, &SceneTreeDock::_script_created));
}
void SceneTreeDock::_toggle_editable_children_from_selection() {
-
List<Node *> selection = editor_selection->get_selected_node_list();
List<Node *>::Element *e = selection.front();
@@ -1752,7 +1756,6 @@ void SceneTreeDock::_toggle_editable_children_from_selection() {
}
void SceneTreeDock::_toggle_placeholder_from_selection() {
-
List<Node *> selection = editor_selection->get_selected_node_list();
List<Node *>::Element *e = selection.front();
@@ -1771,25 +1774,25 @@ void SceneTreeDock::_toggle_placeholder_from_selection() {
}
void SceneTreeDock::_toggle_editable_children(Node *p_node) {
-
if (p_node) {
bool editable = !EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(p_node);
EditorNode::get_singleton()->get_edited_scene()->set_editable_instance(p_node, editable);
- if (editable)
+ if (editable) {
p_node->set_scene_instance_load_placeholder(false);
+ }
- SpatialEditor::get_singleton()->update_all_gizmos(p_node);
+ Node3DEditor::get_singleton()->update_all_gizmos(p_node);
scene_tree->update_tree();
}
}
void SceneTreeDock::_delete_confirm() {
-
List<Node *> remove_list = editor_selection->get_selected_node_list();
- if (remove_list.empty())
+ if (remove_list.empty()) {
return;
+ }
editor->get_editor_plugins_over()->make_visible(false);
@@ -1798,69 +1801,69 @@ void SceneTreeDock::_delete_confirm() {
bool entire_scene = false;
for (List<Node *>::Element *E = remove_list.front(); E; E = E->next()) {
-
if (E->get() == edited_scene) {
entire_scene = true;
}
}
if (entire_scene) {
-
- editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", (Object *)NULL);
+ editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", (Object *)nullptr);
editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", edited_scene);
editor_data->get_undo_redo().add_undo_method(edited_scene, "set_owner", edited_scene->get_owner());
editor_data->get_undo_redo().add_undo_method(scene_tree, "update_tree");
editor_data->get_undo_redo().add_undo_reference(edited_scene);
} else {
-
remove_list.sort_custom<Node::Comparator>(); //sort nodes to keep positions
- List<Pair<NodePath, NodePath> > path_renames;
+ List<Pair<NodePath, NodePath>> path_renames;
//delete from animation
for (List<Node *>::Element *E = remove_list.front(); E; E = E->next()) {
Node *n = E->get();
- if (!n->is_inside_tree() || !n->get_parent())
+ if (!n->is_inside_tree() || !n->get_parent()) {
continue;
+ }
- fill_path_renames(n, NULL, &path_renames);
+ fill_path_renames(n, nullptr, &path_renames);
}
- perform_node_renames(NULL, &path_renames);
+ perform_node_renames(nullptr, &path_renames);
//delete for read
for (List<Node *>::Element *E = remove_list.front(); E; E = E->next()) {
Node *n = E->get();
- if (!n->is_inside_tree() || !n->get_parent())
+ if (!n->is_inside_tree() || !n->get_parent()) {
continue;
+ }
List<Node *> owned;
n->get_owned_by(n->get_owner(), &owned);
Array owners;
for (List<Node *>::Element *F = owned.front(); F; F = F->next()) {
-
owners.push_back(F->get());
}
editor_data->get_undo_redo().add_do_method(n->get_parent(), "remove_child", n);
editor_data->get_undo_redo().add_undo_method(n->get_parent(), "add_child", n);
editor_data->get_undo_redo().add_undo_method(n->get_parent(), "move_child", n, n->get_index());
- if (AnimationPlayerEditor::singleton->get_track_editor()->get_root() == n)
+ if (AnimationPlayerEditor::singleton->get_track_editor()->get_root() == n) {
editor_data->get_undo_redo().add_undo_method(AnimationPlayerEditor::singleton->get_track_editor(), "set_root", n);
+ }
editor_data->get_undo_redo().add_undo_method(this, "_set_owners", edited_scene, owners);
editor_data->get_undo_redo().add_undo_reference(n);
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_remove_and_keep_node", edited_scene->get_path_to(n), n->get_instance_id());
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_restore_node", n->get_instance_id(), edited_scene->get_path_to(n->get_parent()), n->get_index());
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_remove_and_keep_node", edited_scene->get_path_to(n), n->get_instance_id());
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_restore_node", n->get_instance_id(), edited_scene->get_path_to(n->get_parent()), n->get_index());
}
}
editor_data->get_undo_redo().commit_action();
// hack, force 2d editor viewport to refresh after deletion
- if (CanvasItemEditor *editor = CanvasItemEditor::get_singleton())
+ if (CanvasItemEditor *editor = CanvasItemEditor::get_singleton()) {
editor->get_viewport_control()->update();
+ }
- editor->push_item(NULL);
+ editor->push_item(nullptr);
// Fixes the EditorHistory from still offering deleted notes
EditorHistory *editor_history = EditorNode::get_singleton()->get_editor_history();
@@ -1869,22 +1872,20 @@ void SceneTreeDock::_delete_confirm() {
}
void SceneTreeDock::_update_script_button() {
-
if (!profile_allow_script_editing) {
-
button_create_script->hide();
- button_clear_script->hide();
+ button_detach_script->hide();
} else if (EditorNode::get_singleton()->get_editor_selection()->get_selection().size() == 0) {
button_create_script->hide();
- button_clear_script->hide();
+ button_detach_script->hide();
} else if (EditorNode::get_singleton()->get_editor_selection()->get_selection().size() == 1) {
Node *n = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list()[0];
if (n->get_script().is_null()) {
button_create_script->show();
- button_clear_script->hide();
+ button_detach_script->hide();
} else {
button_create_script->hide();
- button_clear_script->show();
+ button_detach_script->show();
}
} else {
button_create_script->hide();
@@ -1892,40 +1893,38 @@ void SceneTreeDock::_update_script_button() {
for (int i = 0; i < selection.size(); i++) {
Node *n = Object::cast_to<Node>(selection[i]);
if (!n->get_script().is_null()) {
- button_clear_script->show();
+ button_detach_script->show();
return;
}
}
- button_clear_script->hide();
+ button_detach_script->hide();
}
}
void SceneTreeDock::_selection_changed() {
-
int selection_size = EditorNode::get_singleton()->get_editor_selection()->get_selection().size();
if (selection_size > 1) {
//automatically turn on multi-edit
_tool_selected(TOOL_MULTI_EDIT);
- } else if (selection_size == 1) {
- editor->push_item(EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list()[0]);
- } else {
- editor->push_item(NULL);
+ } else if (selection_size == 0) {
+ editor->push_item(nullptr);
}
+
_update_script_button();
}
Node *SceneTreeDock::_get_selection_group_tail(Node *p_node, List<Node *> p_list) {
-
Node *tail = p_node;
Node *parent = tail->get_parent();
- for (int i = p_node->get_position_in_parent(); i < parent->get_child_count(); i++) {
+ for (int i = p_node->get_index(); i < parent->get_child_count(); i++) {
Node *sibling = parent->get_child(i);
- if (p_list.find(sibling))
+ if (p_list.find(sibling)) {
tail = sibling;
- else
+ } else {
break;
+ }
}
return tail;
@@ -1941,7 +1940,6 @@ void SceneTreeDock::_do_create(Node *p_parent) {
editor_data->get_undo_redo().create_action(TTR("Create Node"));
if (edited_scene) {
-
editor_data->get_undo_redo().add_do_method(p_parent, "add_child", child);
editor_data->get_undo_redo().add_do_method(child, "set_owner", edited_scene);
editor_data->get_undo_redo().add_do_method(editor_selection, "clear");
@@ -1950,16 +1948,15 @@ void SceneTreeDock::_do_create(Node *p_parent) {
editor_data->get_undo_redo().add_undo_method(p_parent, "remove_child", child);
String new_name = p_parent->validate_child_name(child);
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
- editor_data->get_undo_redo().add_do_method(sed, "live_debug_create_node", edited_scene->get_path_to(p_parent), child->get_class(), new_name);
- editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(p_parent)).plus_file(new_name)));
+ EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
+ editor_data->get_undo_redo().add_do_method(ed, "live_debug_create_node", edited_scene->get_path_to(p_parent), child->get_class(), new_name);
+ editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(p_parent)).plus_file(new_name)));
} else {
-
editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", child);
editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree");
editor_data->get_undo_redo().add_do_reference(child);
- editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)NULL);
+ editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr);
}
editor_data->get_undo_redo().commit_action();
@@ -1971,25 +1968,26 @@ void SceneTreeDock::_do_create(Node *p_parent) {
Control *ct = Object::cast_to<Control>(c);
Size2 ms = ct->get_minimum_size();
- if (ms.width < 4)
+ if (ms.width < 4) {
ms.width = 40;
- if (ms.height < 4)
+ }
+ if (ms.height < 4) {
ms.height = 40;
+ }
ct->set_size(ms);
}
}
void SceneTreeDock::_create() {
-
if (current_option == TOOL_NEW) {
-
- Node *parent = NULL;
+ Node *parent = nullptr;
if (edited_scene) {
// If root exists in edited scene
parent = scene_tree->get_selected();
- if (!parent)
+ if (!parent) {
parent = edited_scene;
+ }
} else {
// If no root exist in edited scene
@@ -2047,17 +2045,19 @@ void SceneTreeDock::_create() {
smaller_path_to_top = path_length;
only_one_top_node = true;
} else if (smaller_path_to_top == path_length) {
- if (only_one_top_node && top_node->get_parent() != n->get_parent())
+ if (only_one_top_node && top_node->get_parent() != n->get_parent()) {
only_one_top_node = false;
+ }
}
}
}
- Node *parent = NULL;
- if (only_one_top_node)
+ Node *parent = nullptr;
+ if (only_one_top_node) {
parent = top_node->get_parent();
- else
+ } else {
parent = top_node->get_parent()->get_parent();
+ }
_do_create(parent);
@@ -2075,7 +2075,6 @@ void SceneTreeDock::_create() {
}
void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_properties, bool p_remove_old) {
-
Node *n = p_node;
Node *newnode = p_by_node;
@@ -2085,10 +2084,24 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
n->get_property_list(&pinfo);
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
- if (!(E->get().usage & PROPERTY_USAGE_STORAGE))
+ if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) {
continue;
- if (E->get().name == "__meta__")
+ }
+
+ if (E->get().name == "__meta__") {
+ if (Object::cast_to<CanvasItem>(newnode)) {
+ Dictionary metadata = n->get(E->get().name);
+ if (metadata.has("_edit_group_") && metadata["_edit_group_"]) {
+ newnode->set_meta("_edit_group_", true);
+ }
+ if (metadata.has("_edit_lock_") && metadata["_edit_lock_"]) {
+ newnode->set_meta("_edit_lock_", true);
+ }
+ }
+
continue;
+ }
+
if (default_oldnode->get(E->get().name) != n->get(E->get().name)) {
newnode->set(E->get().name, n->get(E->get().name));
}
@@ -2097,23 +2110,22 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
memdelete(default_oldnode);
}
- editor->push_item(NULL);
+ editor->push_item(nullptr);
//reconnect signals
List<MethodInfo> sl;
n->get_signal_list(&sl);
for (List<MethodInfo>::Element *E = sl.front(); E; E = E->next()) {
-
List<Object::Connection> cl;
n->get_signal_connection_list(E->get().name, &cl);
for (List<Object::Connection>::Element *F = cl.front(); F; F = F->next()) {
-
Object::Connection &c = F->get();
- if (!(c.flags & Object::CONNECT_PERSIST))
+ if (!(c.flags & Object::CONNECT_PERSIST)) {
continue;
- newnode->connect(c.signal, c.target, c.method, c.binds, Object::CONNECT_PERSIST);
+ }
+ newnode->connect(c.signal.get_name(), c.callable, c.binds, Object::CONNECT_PERSIST);
}
}
@@ -2121,7 +2133,7 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
List<Node *> to_erase;
for (int i = 0; i < n->get_child_count(); i++) {
- if (n->get_child(i)->get_owner() == NULL && n->is_owned_by_parent()) {
+ if (n->get_child(i)->get_owner() == nullptr && n->is_owned_by_parent()) {
to_erase.push_back(n->get_child(i));
}
}
@@ -2139,8 +2151,9 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
c->call("set_transform", c->call("get_transform"));
}
//p_remove_old was added to support undo
- if (p_remove_old)
+ if (p_remove_old) {
editor_data->get_undo_redo().clear_history();
+ }
newnode->set_name(newname);
editor->push_item(newnode);
@@ -2156,22 +2169,18 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
}
void SceneTreeDock::set_edited_scene(Node *p_scene) {
-
edited_scene = p_scene;
}
void SceneTreeDock::set_selected(Node *p_node, bool p_emit_selected) {
-
scene_tree->set_selected(p_node, p_emit_selected);
}
void SceneTreeDock::import_subscene() {
-
import_subscene_dialog->popup_centered_clamped(Size2(500, 800) * EDSCALE, 0.8);
}
void SceneTreeDock::_import_subscene() {
-
Node *parent = scene_tree->get_selected();
if (!parent) {
parent = editor_data->get_edited_scene_root();
@@ -2183,18 +2192,17 @@ void SceneTreeDock::_import_subscene() {
}
void SceneTreeDock::_new_scene_from(String p_file) {
-
List<Node *> selection = editor_selection->get_selected_node_list();
if (selection.size() != 1) {
accept->set_text(TTR("This operation requires a single selected node."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
if (EditorNode::get_singleton()->is_scene_open(p_file)) {
accept->set_text(TTR("Can't overwrite scene that is still open!"));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
@@ -2204,56 +2212,57 @@ void SceneTreeDock::_new_scene_from(String p_file) {
reown[editor_data->get_edited_scene_root()] = base;
Node *copy = base->duplicate_and_reown(reown);
if (copy) {
-
Ref<PackedScene> sdata = memnew(PackedScene);
Error err = sdata->pack(copy);
memdelete(copy);
if (err != OK) {
accept->set_text(TTR("Couldn't save new scene. Likely dependencies (instances) couldn't be satisfied."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
int flg = 0;
- if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources"))
+ if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources")) {
flg |= ResourceSaver::FLAG_COMPRESS;
+ }
err = ResourceSaver::save(p_file, sdata, flg);
if (err != OK) {
accept->set_text(TTR("Error saving scene."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
_replace_with_branch_scene(p_file, base);
} else {
accept->set_text(TTR("Error duplicating scene to save it."));
- accept->popup_centered_minsize();
+ accept->popup_centered();
return;
}
}
static bool _is_node_visible(Node *p_node) {
-
- if (!p_node->get_owner())
+ if (!p_node->get_owner()) {
return false;
- if (p_node->get_owner() != EditorNode::get_singleton()->get_edited_scene() && !EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(p_node->get_owner()))
+ }
+ if (p_node->get_owner() != EditorNode::get_singleton()->get_edited_scene() && !EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(p_node->get_owner())) {
return false;
+ }
return true;
}
static bool _has_visible_children(Node *p_node) {
-
bool collapsed = p_node->is_displayed_folded();
- if (collapsed)
+ if (collapsed) {
return false;
+ }
for (int i = 0; i < p_node->get_child_count(); i++) {
-
Node *child = p_node->get_child(i);
- if (!_is_node_visible(child))
+ if (!_is_node_visible(child)) {
continue;
+ }
return true;
}
@@ -2262,13 +2271,12 @@ static bool _has_visible_children(Node *p_node) {
}
void SceneTreeDock::_normalize_drop(Node *&to_node, int &to_pos, int p_type) {
-
to_pos = -1;
if (p_type == -1) {
//drop at above selected node
if (to_node == EditorNode::get_singleton()->get_edited_scene()) {
- to_node = NULL;
+ to_node = nullptr;
ERR_FAIL_MSG("Cannot perform drop above the root node!");
}
@@ -2283,7 +2291,7 @@ void SceneTreeDock::_normalize_drop(Node *&to_node, int &to_pos, int p_type) {
return;
}
- Node *lower_sibling = NULL;
+ Node *lower_sibling = nullptr;
if (_has_visible_children(to_node)) {
to_pos = 0;
@@ -2305,7 +2313,6 @@ void SceneTreeDock::_normalize_drop(Node *&to_node, int &to_pos, int p_type) {
}
void SceneTreeDock::_files_dropped(Vector<String> p_files, NodePath p_to, int p_type) {
-
Node *node = get_node(p_to);
ERR_FAIL_COND(!node);
@@ -2329,15 +2336,16 @@ void SceneTreeDock::_script_dropped(String p_file, NodePath p_to) {
}
void SceneTreeDock::_nodes_dragged(Array p_nodes, NodePath p_to, int p_type) {
-
List<Node *> selection = editor_selection->get_selected_node_list();
- if (selection.empty())
+ if (selection.empty()) {
return; //nothing to reparent
+ }
Node *to_node = get_node(p_to);
- if (!to_node)
+ if (!to_node) {
return;
+ }
Vector<Node *> nodes;
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
@@ -2351,27 +2359,30 @@ void SceneTreeDock::_nodes_dragged(Array p_nodes, NodePath p_to, int p_type) {
}
void SceneTreeDock::_add_children_to_popup(Object *p_obj, int p_depth) {
-
- if (p_depth > 8)
+ if (p_depth > 8) {
return;
+ }
List<PropertyInfo> pinfo;
p_obj->get_property_list(&pinfo);
for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
- if (!(E->get().usage & PROPERTY_USAGE_EDITOR))
+ if (!(E->get().usage & PROPERTY_USAGE_EDITOR)) {
continue;
- if (E->get().hint != PROPERTY_HINT_RESOURCE_TYPE)
+ }
+ if (E->get().hint != PROPERTY_HINT_RESOURCE_TYPE) {
continue;
+ }
Variant value = p_obj->get(E->get().name);
- if (value.get_type() != Variant::OBJECT)
+ if (value.get_type() != Variant::OBJECT) {
continue;
+ }
Object *obj = value;
- if (!obj)
+ if (!obj) {
continue;
+ }
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj);
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj);
if (menu->get_item_count() == 0) {
menu->add_submenu_item(TTR("Sub-Resources"), "Sub-Resources");
@@ -2386,17 +2397,15 @@ void SceneTreeDock::_add_children_to_popup(Object *p_obj, int p_depth) {
}
void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
-
if (!EditorNode::get_singleton()->get_edited_scene()) {
-
menu->clear();
if (profile_allow_editing) {
- menu->add_icon_shortcut(get_icon("Add", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
- menu->add_icon_shortcut(get_icon("Instance", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
+ menu->add_icon_shortcut(get_theme_icon("Add", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
+ menu->add_icon_shortcut(get_theme_icon("Instance", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
}
menu->set_size(Size2(1, 1));
- menu->set_position(p_menu_pos);
+ menu->set_position(get_screen_position() + p_menu_pos);
menu->popup();
return;
}
@@ -2404,15 +2413,15 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
List<Node *> selection = editor_selection->get_selected_node_list();
List<Node *> full_selection = editor_selection->get_full_selected_node_list(); // Above method only returns nodes with common parent.
- if (selection.size() == 0)
+ if (selection.size() == 0) {
return;
+ }
menu->clear();
Ref<Script> existing_script;
- bool exisiting_script_removable = true;
+ bool existing_script_removable = true;
if (selection.size() == 1) {
-
Node *selected = selection[0];
if (profile_allow_editing) {
@@ -2420,19 +2429,20 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
menu_subresources->clear();
menu_subresources->set_size(Size2(1, 1));
_add_children_to_popup(selection.front()->get(), 0);
- if (menu->get_item_count() > 0)
+ if (menu->get_item_count() > 0) {
menu->add_separator();
+ }
- menu->add_icon_shortcut(get_icon("Add", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
- menu->add_icon_shortcut(get_icon("Instance", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
+ menu->add_icon_shortcut(get_theme_icon("Add", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
+ menu->add_icon_shortcut(get_theme_icon("Instance", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
}
- menu->add_icon_shortcut(get_icon("Collapse", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/expand_collapse_all"), TOOL_EXPAND_COLLAPSE);
+ menu->add_icon_shortcut(get_theme_icon("Collapse", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/expand_collapse_all"), TOOL_EXPAND_COLLAPSE);
menu->add_separator();
existing_script = selected->get_script();
if (EditorNode::get_singleton()->get_object_custom_type_base(selected) == existing_script) {
- exisiting_script_removable = false;
+ existing_script_removable = false;
}
}
@@ -2441,14 +2451,14 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
if (full_selection.size() == 1) {
add_separator = true;
- menu->add_icon_shortcut(get_icon("ScriptCreate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/attach_script"), TOOL_ATTACH_SCRIPT);
+ menu->add_icon_shortcut(get_theme_icon("ScriptCreate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/attach_script"), TOOL_ATTACH_SCRIPT);
if (existing_script.is_valid()) {
- menu->add_icon_shortcut(get_icon("ScriptExtend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/extend_script"), TOOL_EXTEND_SCRIPT);
+ menu->add_icon_shortcut(get_theme_icon("ScriptExtend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/extend_script"), TOOL_EXTEND_SCRIPT);
}
}
- if (existing_script.is_valid() && exisiting_script_removable) {
+ if (existing_script.is_valid() && existing_script_removable) {
add_separator = true;
- menu->add_icon_shortcut(get_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/clear_script"), TOOL_CLEAR_SCRIPT);
+ menu->add_icon_shortcut(get_theme_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/detach_script"), TOOL_DETACH_SCRIPT);
} else if (full_selection.size() > 1) {
bool script_exists = false;
for (List<Node *>::Element *E = full_selection.front(); E; E = E->next()) {
@@ -2460,7 +2470,7 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
if (script_exists) {
add_separator = true;
- menu->add_icon_shortcut(get_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/clear_script"), TOOL_CLEAR_SCRIPT);
+ menu->add_icon_shortcut(get_theme_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/detach_script"), TOOL_DETACH_SCRIPT);
}
}
@@ -2471,44 +2481,43 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
if (profile_allow_editing) {
if (full_selection.size() == 1) {
- menu->add_icon_shortcut(get_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/rename"), TOOL_RENAME);
+ menu->add_icon_shortcut(get_theme_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/rename"), TOOL_RENAME);
}
- menu->add_icon_shortcut(get_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE);
+ menu->add_icon_shortcut(get_theme_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE);
if (scene_tree->get_selected() != edited_scene) {
menu->add_separator();
- menu->add_icon_shortcut(get_icon("MoveUp", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_up"), TOOL_MOVE_UP);
- menu->add_icon_shortcut(get_icon("MoveDown", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_down"), TOOL_MOVE_DOWN);
- menu->add_icon_shortcut(get_icon("Duplicate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/duplicate"), TOOL_DUPLICATE);
- menu->add_icon_shortcut(get_icon("Reparent", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent"), TOOL_REPARENT);
- menu->add_icon_shortcut(get_icon("ReparentToNewNode", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent_to_new_node"), TOOL_REPARENT_TO_NEW_NODE);
+ menu->add_icon_shortcut(get_theme_icon("MoveUp", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_up"), TOOL_MOVE_UP);
+ menu->add_icon_shortcut(get_theme_icon("MoveDown", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_down"), TOOL_MOVE_DOWN);
+ menu->add_icon_shortcut(get_theme_icon("Duplicate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/duplicate"), TOOL_DUPLICATE);
+ menu->add_icon_shortcut(get_theme_icon("Reparent", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent"), TOOL_REPARENT);
+ menu->add_icon_shortcut(get_theme_icon("ReparentToNewNode", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent_to_new_node"), TOOL_REPARENT_TO_NEW_NODE);
if (selection.size() == 1) {
- menu->add_icon_shortcut(get_icon("NewRoot", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/make_root"), TOOL_MAKE_ROOT);
+ menu->add_icon_shortcut(get_theme_icon("NewRoot", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/make_root"), TOOL_MAKE_ROOT);
}
}
}
if (selection.size() == 1) {
-
if (profile_allow_editing) {
menu->add_separator();
- menu->add_icon_shortcut(get_icon("Blend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/merge_from_scene"), TOOL_MERGE_FROM_SCENE);
- menu->add_icon_shortcut(get_icon("CreateNewSceneFrom", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/save_branch_as_scene"), TOOL_NEW_SCENE_FROM);
+ menu->add_icon_shortcut(get_theme_icon("Blend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/merge_from_scene"), TOOL_MERGE_FROM_SCENE);
+ menu->add_icon_shortcut(get_theme_icon("CreateNewSceneFrom", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/save_branch_as_scene"), TOOL_NEW_SCENE_FROM);
}
if (full_selection.size() == 1) {
menu->add_separator();
- menu->add_icon_shortcut(get_icon("CopyNodePath", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/copy_node_path"), TOOL_COPY_NODE_PATH);
+ menu->add_icon_shortcut(get_theme_icon("CopyNodePath", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/copy_node_path"), TOOL_COPY_NODE_PATH);
}
bool is_external = (selection[0]->get_filename() != "");
if (is_external) {
- bool is_inherited = selection[0]->get_scene_inherited_state() != NULL;
- bool is_top_level = selection[0]->get_owner() == NULL;
+ bool is_inherited = selection[0]->get_scene_inherited_state() != nullptr;
+ bool is_top_level = selection[0]->get_owner() == nullptr;
if (is_inherited && is_top_level) {
menu->add_separator();
if (profile_allow_editing) {
menu->add_item(TTR("Clear Inheritance"), TOOL_SCENE_CLEAR_INHERITANCE);
}
- menu->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Open in Editor"), TOOL_SCENE_OPEN_INHERITED);
+ menu->add_icon_item(get_theme_icon("Load", "EditorIcons"), TTR("Open in Editor"), TOOL_SCENE_OPEN_INHERITED);
} else if (!is_top_level) {
menu->add_separator();
bool editable = EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(selection[0]);
@@ -2518,7 +2527,7 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
menu->add_check_item(TTR("Load As Placeholder"), TOOL_SCENE_USE_PLACEHOLDER);
menu->add_item(TTR("Make Local"), TOOL_SCENE_MAKE_LOCAL);
}
- menu->add_icon_item(get_icon("Load", "EditorIcons"), TTR("Open in Editor"), TOOL_SCENE_OPEN);
+ menu->add_icon_item(get_theme_icon("Load", "EditorIcons"), TTR("Open in Editor"), TOOL_SCENE_OPEN);
if (profile_allow_editing) {
menu->set_item_checked(menu->get_item_idx_from_text(TTR("Editable Children")), editable);
menu->set_item_checked(menu->get_item_idx_from_text(TTR("Load As Placeholder")), placeholder);
@@ -2530,14 +2539,14 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
if (profile_allow_editing && selection.size() > 1) {
//this is not a commonly used action, it makes no sense for it to be where it was nor always present.
menu->add_separator();
- menu->add_icon_shortcut(get_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/batch_rename"), TOOL_BATCH_RENAME);
+ menu->add_icon_shortcut(get_theme_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/batch_rename"), TOOL_BATCH_RENAME);
}
menu->add_separator();
- menu->add_icon_item(get_icon("Help", "EditorIcons"), TTR("Open Documentation"), TOOL_OPEN_DOCUMENTATION);
+ menu->add_icon_item(get_theme_icon("Help", "EditorIcons"), TTR("Open Documentation"), TOOL_OPEN_DOCUMENTATION);
if (profile_allow_editing) {
menu->add_separator();
- menu->add_icon_shortcut(get_icon("Remove", "EditorIcons"), ED_SHORTCUT("scene_tree/delete", TTR("Delete Node(s)"), KEY_DELETE), TOOL_ERASE);
+ menu->add_icon_shortcut(get_theme_icon("Remove", "EditorIcons"), ED_SHORTCUT("scene_tree/delete", TTR("Delete Node(s)"), KEY_DELETE), TOOL_ERASE);
}
menu->set_size(Size2(1, 1));
menu->set_position(p_menu_pos);
@@ -2545,23 +2554,19 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
}
void SceneTreeDock::_filter_changed(const String &p_filter) {
-
scene_tree->set_filter(p_filter);
}
String SceneTreeDock::get_filter() {
-
return filter->get_text();
}
void SceneTreeDock::set_filter(const String &p_filter) {
-
filter->set_text(p_filter);
scene_tree->set_filter(p_filter);
}
void SceneTreeDock::_focus_node() {
-
Node *node = scene_tree->get_selected();
ERR_FAIL_COND(!node);
@@ -2569,23 +2574,30 @@ void SceneTreeDock::_focus_node() {
CanvasItemEditorPlugin *editor = Object::cast_to<CanvasItemEditorPlugin>(editor_data->get_editor("2D"));
editor->get_canvas_item_editor()->focus_selection();
} else {
- SpatialEditorPlugin *editor = Object::cast_to<SpatialEditorPlugin>(editor_data->get_editor("3D"));
+ Node3DEditorPlugin *editor = Object::cast_to<Node3DEditorPlugin>(editor_data->get_editor("3D"));
editor->get_spatial_editor()->get_editor_viewport(0)->focus_selection();
}
}
void SceneTreeDock::attach_script_to_selected(bool p_extend) {
+ if (ScriptServer::get_language_count() == 0) {
+ EditorNode::get_singleton()->show_warning(TTR("Cannot attach a script: there are no languages registered.\nThis is probably because this editor was built with all language modules disabled."));
+ return;
+ }
+
if (!profile_allow_script_editing) {
return;
}
List<Node *> selection = editor_selection->get_selected_node_list();
- if (selection.empty())
+ if (selection.empty()) {
return;
+ }
Node *selected = scene_tree->get_selected();
- if (!selected)
+ if (!selected) {
selected = selection.front()->get();
+ }
Ref<Script> existing = selected->get_script();
@@ -2616,15 +2628,14 @@ void SceneTreeDock::attach_script_to_selected(bool p_extend) {
}
}
- script_create_dialog->connect("script_created", this, "_script_created");
- script_create_dialog->connect("popup_hide", this, "_script_creation_closed", varray(), CONNECT_ONESHOT);
+ script_create_dialog->connect("script_created", callable_mp(this, &SceneTreeDock::_script_created));
+ script_create_dialog->connect("popup_hide", callable_mp(this, &SceneTreeDock::_script_creation_closed), varray(), CONNECT_ONESHOT);
script_create_dialog->set_inheritance_base_type("Node");
script_create_dialog->config(inherits, path);
script_create_dialog->popup_centered();
}
void SceneTreeDock::open_script_dialog(Node *p_for_node, bool p_extend) {
-
scene_tree->set_selected(p_for_node, false);
if (p_extend) {
@@ -2635,38 +2646,34 @@ void SceneTreeDock::open_script_dialog(Node *p_for_node, bool p_extend) {
}
void SceneTreeDock::add_remote_tree_editor(Control *p_remote) {
- ERR_FAIL_COND(remote_tree != NULL);
+ ERR_FAIL_COND(remote_tree != nullptr);
add_child(p_remote);
remote_tree = p_remote;
remote_tree->hide();
}
void SceneTreeDock::show_remote_tree() {
-
_remote_tree_selected();
}
void SceneTreeDock::hide_remote_tree() {
-
_local_tree_selected();
}
void SceneTreeDock::show_tab_buttons() {
-
button_hb->show();
}
void SceneTreeDock::hide_tab_buttons() {
-
button_hb->hide();
}
void SceneTreeDock::_remote_tree_selected() {
-
scene_tree->hide();
create_root_dialog->hide();
- if (remote_tree)
+ if (remote_tree) {
remote_tree->show();
+ }
edit_remote->set_pressed(true);
edit_local->set_pressed(false);
@@ -2674,32 +2681,34 @@ void SceneTreeDock::_remote_tree_selected() {
}
void SceneTreeDock::_local_tree_selected() {
-
- scene_tree->show();
- if (remote_tree)
+ if (!bool(EDITOR_GET("interface/editors/show_scene_tree_root_selection")) || get_tree()->get_edited_scene_root() != nullptr) {
+ scene_tree->show();
+ }
+ if (remote_tree) {
remote_tree->hide();
+ }
edit_remote->set_pressed(false);
edit_local->set_pressed(true);
}
void SceneTreeDock::_update_create_root_dialog() {
-
BaseButton *toggle = Object::cast_to<BaseButton>(create_root_dialog->get_node(String("NodeShortcutsTopRow/NodeShortcutsToggle")));
Node *node_shortcuts = create_root_dialog->get_node(String("NodeShortcuts"));
- if (!toggle || !node_shortcuts)
+ if (!toggle || !node_shortcuts) {
return;
+ }
Control *beginner_nodes = Object::cast_to<Control>(node_shortcuts->get_node(String("BeginnerNodeShortcuts")));
Control *favorite_nodes = Object::cast_to<Control>(node_shortcuts->get_node(String("FavoriteNodeShortcuts")));
- if (!beginner_nodes || !favorite_nodes)
+ if (!beginner_nodes || !favorite_nodes) {
return;
+ }
EditorSettings::get_singleton()->set_setting("_use_favorites_root_selection", toggle->is_pressed());
EditorSettings::get_singleton()->save();
if (toggle->is_pressed()) {
-
for (int i = 0; i < favorite_nodes->get_child_count(); i++) {
favorite_nodes->get_child(i)->queue_delete();
}
@@ -2707,19 +2716,19 @@ void SceneTreeDock::_update_create_root_dialog() {
FileAccess *f = FileAccess::open(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("favorites.Node"), FileAccess::READ);
if (f) {
-
while (!f->eof_reached()) {
String l = f->get_line().strip_edges();
if (l != String()) {
Button *button = memnew(Button);
favorite_nodes->add_child(button);
- button->set_text(TTR(l));
+ button->set_text(l);
String name = l.get_slicec(' ', 0);
- if (ScriptServer::is_global_class(name))
+ if (ScriptServer::is_global_class(name)) {
name = ScriptServer::get_global_class_native_base(name);
+ }
button->set_icon(EditorNode::get_singleton()->get_class_icon(name));
- button->connect("pressed", this, "_favorite_root_selected", make_binds(l));
+ button->connect("pressed", callable_mp(this, &SceneTreeDock::_favorite_root_selected), make_binds(l));
}
}
@@ -2740,15 +2749,13 @@ void SceneTreeDock::_update_create_root_dialog() {
void SceneTreeDock::_favorite_root_selected(const String &p_class) {
selected_favorite_root = p_class;
- _tool_selected(TOOL_CREATE_FAVORITE, false);
+ _tool_selected(TOOL_CREATE_FAVORITE);
}
void SceneTreeDock::_feature_profile_changed() {
-
Ref<EditorFeatureProfile> profile = EditorFeatureProfileManager::get_singleton()->get_current_profile();
if (profile.is_valid()) {
-
profile_allow_editing = !profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCENE_TREE);
profile_allow_script_editing = !profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT);
bool profile_allow_3d = !profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D);
@@ -2771,41 +2778,10 @@ void SceneTreeDock::_feature_profile_changed() {
}
void SceneTreeDock::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_tool_selected"), &SceneTreeDock::_tool_selected, DEFVAL(false));
- ClassDB::bind_method(D_METHOD("_create"), &SceneTreeDock::_create);
- ClassDB::bind_method(D_METHOD("_node_reparent"), &SceneTreeDock::_node_reparent);
ClassDB::bind_method(D_METHOD("_set_owners"), &SceneTreeDock::_set_owners);
- ClassDB::bind_method(D_METHOD("_node_selected"), &SceneTreeDock::_node_selected);
- ClassDB::bind_method(D_METHOD("_node_renamed"), &SceneTreeDock::_node_renamed);
- ClassDB::bind_method(D_METHOD("_script_created"), &SceneTreeDock::_script_created);
- ClassDB::bind_method(D_METHOD("_script_creation_closed"), &SceneTreeDock::_script_creation_closed);
- ClassDB::bind_method(D_METHOD("_load_request"), &SceneTreeDock::_load_request);
- ClassDB::bind_method(D_METHOD("_script_open_request"), &SceneTreeDock::_script_open_request);
ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &SceneTreeDock::_unhandled_key_input);
ClassDB::bind_method(D_METHOD("_input"), &SceneTreeDock::_input);
- ClassDB::bind_method(D_METHOD("_nodes_drag_begin"), &SceneTreeDock::_nodes_drag_begin);
- ClassDB::bind_method(D_METHOD("_delete_confirm"), &SceneTreeDock::_delete_confirm);
- ClassDB::bind_method(D_METHOD("_toggle_editable_children_from_selection"), &SceneTreeDock::_toggle_editable_children_from_selection);
- ClassDB::bind_method(D_METHOD("_toggle_placeholder_from_selection"), &SceneTreeDock::_toggle_placeholder_from_selection);
- ClassDB::bind_method(D_METHOD("_node_prerenamed"), &SceneTreeDock::_node_prerenamed);
- ClassDB::bind_method(D_METHOD("_import_subscene"), &SceneTreeDock::_import_subscene);
- ClassDB::bind_method(D_METHOD("_selection_changed"), &SceneTreeDock::_selection_changed);
- ClassDB::bind_method(D_METHOD("_node_collapsed"), &SceneTreeDock::_node_collapsed);
- ClassDB::bind_method(D_METHOD("_new_scene_from"), &SceneTreeDock::_new_scene_from);
- ClassDB::bind_method(D_METHOD("_nodes_dragged"), &SceneTreeDock::_nodes_dragged);
- ClassDB::bind_method(D_METHOD("_files_dropped"), &SceneTreeDock::_files_dropped);
- ClassDB::bind_method(D_METHOD("_quick_open"), &SceneTreeDock::_quick_open);
- ClassDB::bind_method(D_METHOD("_script_dropped"), &SceneTreeDock::_script_dropped);
- ClassDB::bind_method(D_METHOD("_tree_rmb"), &SceneTreeDock::_tree_rmb);
- ClassDB::bind_method(D_METHOD("_filter_changed"), &SceneTreeDock::_filter_changed);
- ClassDB::bind_method(D_METHOD("_focus_node"), &SceneTreeDock::_focus_node);
- ClassDB::bind_method(D_METHOD("_remote_tree_selected"), &SceneTreeDock::_remote_tree_selected);
- ClassDB::bind_method(D_METHOD("_local_tree_selected"), &SceneTreeDock::_local_tree_selected);
ClassDB::bind_method(D_METHOD("_update_script_button"), &SceneTreeDock::_update_script_button);
- ClassDB::bind_method(D_METHOD("_favorite_root_selected"), &SceneTreeDock::_favorite_root_selected);
- ClassDB::bind_method(D_METHOD("_update_create_root_dialog"), &SceneTreeDock::_update_create_root_dialog);
- ClassDB::bind_method(D_METHOD("_feature_profile_changed"), &SceneTreeDock::_feature_profile_changed);
ClassDB::bind_method(D_METHOD("instance"), &SceneTreeDock::instance);
ClassDB::bind_method(D_METHOD("get_tree_editor"), &SceneTreeDock::get_tree_editor);
@@ -2815,10 +2791,9 @@ void SceneTreeDock::_bind_methods() {
}
SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data) {
-
set_name("Scene");
editor = p_editor;
- edited_scene = NULL;
+ edited_scene = nullptr;
editor_data = &p_editor_data;
editor_selection = p_editor_selection;
scene_root = p_scene_root;
@@ -2826,7 +2801,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
VBoxContainer *vbc = this;
HBoxContainer *filter_hbc = memnew(HBoxContainer);
- filter_hbc->add_constant_override("separate", 0);
+ filter_hbc->add_theme_constant_override("separate", 0);
ED_SHORTCUT("scene_tree/rename", TTR("Rename"));
ED_SHORTCUT("scene_tree/batch_rename", TTR("Batch Rename"), KEY_MASK_CMD | KEY_F2);
@@ -2836,7 +2811,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
ED_SHORTCUT("scene_tree/change_node_type", TTR("Change Type"));
ED_SHORTCUT("scene_tree/attach_script", TTR("Attach Script"));
ED_SHORTCUT("scene_tree/extend_script", TTR("Extend Script"));
- ED_SHORTCUT("scene_tree/clear_script", TTR("Clear Script"));
+ ED_SHORTCUT("scene_tree/detach_script", TTR("Detach Script"));
ED_SHORTCUT("scene_tree/move_up", TTR("Move Up"), KEY_MASK_CMD | KEY_UP);
ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KEY_MASK_CMD | KEY_DOWN);
ED_SHORTCUT("scene_tree/duplicate", TTR("Duplicate"), KEY_MASK_CMD | KEY_D);
@@ -2849,14 +2824,16 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KEY_MASK_SHIFT | KEY_DELETE);
ED_SHORTCUT("scene_tree/delete", TTR("Delete"), KEY_DELETE);
- button_add = memnew(ToolButton);
- button_add->connect("pressed", this, "_tool_selected", make_binds(TOOL_NEW, false));
+ button_add = memnew(Button);
+ button_add->set_flat(true);
+ button_add->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_NEW, false));
button_add->set_tooltip(TTR("Add/Create a New Node."));
button_add->set_shortcut(ED_GET_SHORTCUT("scene_tree/add_child_node"));
filter_hbc->add_child(button_add);
- button_instance = memnew(ToolButton);
- button_instance->connect("pressed", this, "_tool_selected", make_binds(TOOL_INSTANCE, false));
+ button_instance = memnew(Button);
+ button_instance->set_flat(true);
+ button_instance->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_INSTANCE, false));
button_instance->set_tooltip(TTR("Instance a scene file as a Node. Creates an inherited scene if no root node exists."));
button_instance->set_shortcut(ED_GET_SHORTCUT("scene_tree/instance_scene"));
filter_hbc->add_child(button_instance);
@@ -2866,41 +2843,46 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
filter->set_h_size_flags(SIZE_EXPAND_FILL);
filter->set_placeholder(TTR("Filter nodes"));
filter_hbc->add_child(filter);
- filter->add_constant_override("minimum_spaces", 0);
- filter->connect("text_changed", this, "_filter_changed");
+ filter->add_theme_constant_override("minimum_spaces", 0);
+ filter->connect("text_changed", callable_mp(this, &SceneTreeDock::_filter_changed));
- button_create_script = memnew(ToolButton);
- button_create_script->connect("pressed", this, "_tool_selected", make_binds(TOOL_ATTACH_SCRIPT, false));
- button_create_script->set_tooltip(TTR("Attach a new or existing script for the selected node."));
+ button_create_script = memnew(Button);
+ button_create_script->set_flat(true);
+ button_create_script->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_ATTACH_SCRIPT, false));
+ button_create_script->set_tooltip(TTR("Attach a new or existing script to the selected node."));
button_create_script->set_shortcut(ED_GET_SHORTCUT("scene_tree/attach_script"));
filter_hbc->add_child(button_create_script);
button_create_script->hide();
- button_clear_script = memnew(ToolButton);
- button_clear_script->connect("pressed", this, "_tool_selected", make_binds(TOOL_CLEAR_SCRIPT, false));
- button_clear_script->set_tooltip(TTR("Clear a script for the selected node."));
- button_clear_script->set_shortcut(ED_GET_SHORTCUT("scene_tree/clear_script"));
- filter_hbc->add_child(button_clear_script);
- button_clear_script->hide();
+ button_detach_script = memnew(Button);
+ button_detach_script->set_flat(true);
+ button_detach_script->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_DETACH_SCRIPT, false));
+ button_detach_script->set_tooltip(TTR("Detach the script from the selected node."));
+ button_detach_script->set_shortcut(ED_GET_SHORTCUT("scene_tree/detach_script"));
+ filter_hbc->add_child(button_detach_script);
+ button_detach_script->hide();
button_hb = memnew(HBoxContainer);
vbc->add_child(button_hb);
- edit_remote = memnew(ToolButton);
+ edit_remote = memnew(Button);
+ edit_remote->set_flat(true);
button_hb->add_child(edit_remote);
edit_remote->set_h_size_flags(SIZE_EXPAND_FILL);
edit_remote->set_text(TTR("Remote"));
edit_remote->set_toggle_mode(true);
- edit_remote->connect("pressed", this, "_remote_tree_selected");
+ edit_remote->connect("pressed", callable_mp(this, &SceneTreeDock::_remote_tree_selected));
- edit_local = memnew(ToolButton);
+ edit_local = memnew(Button);
+ edit_local->set_flat(true);
button_hb->add_child(edit_local);
edit_local->set_h_size_flags(SIZE_EXPAND_FILL);
edit_local->set_text(TTR("Local"));
edit_local->set_toggle_mode(true);
- edit_local->connect("pressed", this, "_local_tree_selected");
+ edit_local->set_pressed(true);
+ edit_local->connect("pressed", callable_mp(this, &SceneTreeDock::_local_tree_selected));
- remote_tree = NULL;
+ remote_tree = nullptr;
button_hb->hide();
create_root_dialog = memnew(VBoxContainer);
@@ -2911,19 +2893,19 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
vbc->add_child(scene_tree);
scene_tree->set_v_size_flags(SIZE_EXPAND | SIZE_FILL);
- scene_tree->connect("rmb_pressed", this, "_tree_rmb");
+ scene_tree->connect("rmb_pressed", callable_mp(this, &SceneTreeDock::_tree_rmb));
- scene_tree->connect("node_selected", this, "_node_selected", varray(), CONNECT_DEFERRED);
- scene_tree->connect("node_renamed", this, "_node_renamed", varray(), CONNECT_DEFERRED);
- scene_tree->connect("node_prerename", this, "_node_prerenamed");
- scene_tree->connect("open", this, "_load_request");
- scene_tree->connect("open_script", this, "_script_open_request");
- scene_tree->connect("nodes_rearranged", this, "_nodes_dragged");
- scene_tree->connect("files_dropped", this, "_files_dropped");
- scene_tree->connect("script_dropped", this, "_script_dropped");
- scene_tree->connect("nodes_dragged", this, "_nodes_drag_begin");
+ scene_tree->connect("node_selected", callable_mp(this, &SceneTreeDock::_node_selected), varray(), CONNECT_DEFERRED);
+ scene_tree->connect("node_renamed", callable_mp(this, &SceneTreeDock::_node_renamed), varray(), CONNECT_DEFERRED);
+ scene_tree->connect("node_prerename", callable_mp(this, &SceneTreeDock::_node_prerenamed));
+ scene_tree->connect("open", callable_mp(this, &SceneTreeDock::_load_request));
+ scene_tree->connect("open_script", callable_mp(this, &SceneTreeDock::_script_open_request));
+ scene_tree->connect("nodes_rearranged", callable_mp(this, &SceneTreeDock::_nodes_dragged));
+ scene_tree->connect("files_dropped", callable_mp(this, &SceneTreeDock::_files_dropped));
+ scene_tree->connect("script_dropped", callable_mp(this, &SceneTreeDock::_script_dropped));
+ scene_tree->connect("nodes_dragged", callable_mp(this, &SceneTreeDock::_nodes_drag_begin));
- scene_tree->get_scene_tree()->connect("item_double_clicked", this, "_focus_node");
+ scene_tree->get_scene_tree()->connect("item_double_clicked", callable_mp(this, &SceneTreeDock::_focus_node));
scene_tree->set_undo_redo(&editor_data->get_undo_redo());
scene_tree->set_editor_selection(editor_selection);
@@ -2931,8 +2913,8 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
create_dialog = memnew(CreateDialog);
create_dialog->set_base_type("Node");
add_child(create_dialog);
- create_dialog->connect("create", this, "_create");
- create_dialog->connect("favorites_updated", this, "_update_create_root_dialog");
+ create_dialog->connect("create", callable_mp(this, &SceneTreeDock::_create));
+ create_dialog->connect("favorites_updated", callable_mp(this, &SceneTreeDock::_update_create_root_dialog));
rename_dialog = memnew(RenameDialog(scene_tree, &editor_data->get_undo_redo()));
add_child(rename_dialog);
@@ -2943,44 +2925,44 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
reparent_dialog = memnew(ReparentDialog);
add_child(reparent_dialog);
- reparent_dialog->connect("reparent", this, "_node_reparent");
+ reparent_dialog->connect("reparent", callable_mp(this, &SceneTreeDock::_node_reparent));
accept = memnew(AcceptDialog);
add_child(accept);
quick_open = memnew(EditorQuickOpen);
add_child(quick_open);
- quick_open->connect("quick_open", this, "_quick_open");
+ quick_open->connect("quick_open", callable_mp(this, &SceneTreeDock::_quick_open));
set_process_unhandled_key_input(true);
delete_dialog = memnew(ConfirmationDialog);
add_child(delete_dialog);
- delete_dialog->connect("confirmed", this, "_delete_confirm");
+ delete_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_delete_confirm));
editable_instance_remove_dialog = memnew(ConfirmationDialog);
add_child(editable_instance_remove_dialog);
- editable_instance_remove_dialog->connect("confirmed", this, "_toggle_editable_children_from_selection");
+ editable_instance_remove_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_toggle_editable_children_from_selection));
placeholder_editable_instance_remove_dialog = memnew(ConfirmationDialog);
add_child(placeholder_editable_instance_remove_dialog);
- placeholder_editable_instance_remove_dialog->connect("confirmed", this, "_toggle_placeholder_from_selection");
+ placeholder_editable_instance_remove_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_toggle_placeholder_from_selection));
import_subscene_dialog = memnew(EditorSubScene);
add_child(import_subscene_dialog);
- import_subscene_dialog->connect("subscene_selected", this, "_import_subscene");
+ import_subscene_dialog->connect("subscene_selected", callable_mp(this, &SceneTreeDock::_import_subscene));
new_scene_from_dialog = memnew(EditorFileDialog);
- new_scene_from_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ new_scene_from_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
add_child(new_scene_from_dialog);
- new_scene_from_dialog->connect("file_selected", this, "_new_scene_from");
+ new_scene_from_dialog->connect("file_selected", callable_mp(this, &SceneTreeDock::_new_scene_from));
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", this, "_tool_selected");
- menu->set_hide_on_window_lose_focus(true);
+ menu->connect("id_pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(false));
+
menu_subresources = memnew(PopupMenu);
menu_subresources->set_name("Sub-Resources");
- menu_subresources->connect("id_pressed", this, "_tool_selected");
+ menu_subresources->connect("id_pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(false));
menu->add_child(menu_subresources);
first_enter = true;
restore_script_editor_on_drag = false;
diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h
index c6ddbc3dfe..c2c877bf68 100644
--- a/editor/scene_tree_dock.h
+++ b/editor/scene_tree_dock.h
@@ -46,14 +46,12 @@
#include "scene/gui/control.h"
#include "scene/gui/label.h"
#include "scene/gui/popup_menu.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
#include "scene_tree_editor.h"
class EditorNode;
class SceneTreeDock : public VBoxContainer {
-
GDCLASS(SceneTreeDock, VBoxContainer);
enum Tool {
@@ -66,7 +64,7 @@ class SceneTreeDock : public VBoxContainer {
TOOL_REPLACE,
TOOL_EXTEND_SCRIPT,
TOOL_ATTACH_SCRIPT,
- TOOL_CLEAR_SCRIPT,
+ TOOL_DETACH_SCRIPT,
TOOL_MOVE_UP,
TOOL_MOVE_DOWN,
TOOL_DUPLICATE,
@@ -107,15 +105,18 @@ class SceneTreeDock : public VBoxContainer {
CreateDialog *create_dialog;
RenameDialog *rename_dialog;
- ToolButton *button_add;
- ToolButton *button_instance;
- ToolButton *button_create_script;
- ToolButton *button_clear_script;
+ Button *button_add;
+ Button *button_instance;
+ Button *button_create_script;
+ Button *button_detach_script;
+ Button *button_2d;
Button *button_3d;
+ Button *button_ui;
+ Button *button_custom;
HBoxContainer *button_hb;
- ToolButton *edit_local, *edit_remote;
+ Button *edit_local, *edit_remote;
SceneTreeEditor *scene_tree;
Control *remote_tree;
@@ -205,7 +206,7 @@ class SceneTreeDock : public VBoxContainer {
void _update_script_button();
Node *_get_selection_group_tail(Node *p_node, List<Node *> p_list);
- void _fill_path_renames(Vector<StringName> base_path, Vector<StringName> new_base_path, Node *p_node, List<Pair<NodePath, NodePath> > *p_renames);
+ void _fill_path_renames(Vector<StringName> base_path, Vector<StringName> new_base_path, Node *p_node, List<Pair<NodePath, NodePath>> *p_renames);
void _normalize_drop(Node *&to_node, int &to_pos, int p_type);
@@ -247,10 +248,10 @@ public:
void import_subscene();
void set_edited_scene(Node *p_scene);
void instance(const String &p_file);
- void instance_scenes(const Vector<String> &p_files, Node *p_parent = NULL);
+ void instance_scenes(const Vector<String> &p_files, Node *p_parent = nullptr);
void set_selected(Node *p_node, bool p_emit_selected = false);
- void fill_path_renames(Node *p_node, Node *p_new_parent, List<Pair<NodePath, NodePath> > *p_renames);
- void perform_node_renames(Node *p_base, List<Pair<NodePath, NodePath> > *p_renames, Map<Ref<Animation>, Set<int> > *r_rem_anims = NULL);
+ void fill_path_renames(Node *p_node, Node *p_new_parent, List<Pair<NodePath, NodePath>> *p_renames);
+ void perform_node_renames(Node *p_base, List<Pair<NodePath, NodePath>> *p_renames, Map<Ref<Animation>, Set<int>> *r_rem_anims = nullptr);
SceneTreeEditor *get_tree_editor() { return scene_tree; }
EditorData *get_editor_data() { return editor_data; }
diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp
index c49ea72e99..5a504da397 100644
--- a/editor/scene_tree_editor.cpp
+++ b/editor/scene_tree_editor.cpp
@@ -33,22 +33,21 @@
#include "core/message_queue.h"
#include "core/print_string.h"
#include "editor/editor_node.h"
+#include "editor/editor_scale.h"
#include "editor/node_dock.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor/plugins/canvas_item_editor_plugin.h"
#include "scene/gui/label.h"
-#include "scene/main/viewport.h"
+#include "scene/main/window.h"
#include "scene/resources/packed_scene.h"
Node *SceneTreeEditor::get_scene_node() {
-
- ERR_FAIL_COND_V(!is_inside_tree(), NULL);
+ ERR_FAIL_COND_V(!is_inside_tree(), nullptr);
return get_tree()->get_edited_scene_root();
}
void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_id) {
-
if (connect_to_script_mode) {
return; //don't do anything in this mode
}
@@ -70,16 +69,16 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
emit_signal("open", n->get_filename());
}
} else if (p_id == BUTTON_SCRIPT) {
- RefPtr script = n->get_script();
- Ref<Script> script_typed = script;
- if (!script_typed.is_null())
- emit_signal("open_script", script);
+ Ref<Script> script_typed = n->get_script();
+ if (!script_typed.is_null()) {
+ emit_signal("open_script", script_typed);
+ }
} else if (p_id == BUTTON_VISIBILITY) {
undo_redo->create_action(TTR("Toggle Visible"));
_toggle_visible(n);
List<Node *> selection = editor_selection->get_selected_node_list();
- if (selection.size() > 1 && selection.find(n) != NULL) {
+ if (selection.size() > 1 && selection.find(n) != nullptr) {
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
Node *nv = E->get();
ERR_FAIL_COND(!nv);
@@ -93,8 +92,7 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
} else if (p_id == BUTTON_LOCK) {
undo_redo->create_action(TTR("Unlock Node"));
- if (n->is_class("CanvasItem") || n->is_class("Spatial")) {
-
+ if (n->is_class("CanvasItem") || n->is_class("Node3D")) {
undo_redo->add_do_method(n, "remove_meta", "_edit_lock_");
undo_redo->add_undo_method(n, "set_meta", "_edit_lock_", true);
undo_redo->add_do_method(this, "_update_tree", Variant());
@@ -104,7 +102,6 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
}
undo_redo->commit_action();
} else if (p_id == BUTTON_PIN) {
-
if (n->is_class("AnimationPlayer")) {
AnimationPlayerEditor::singleton->unpin();
_update_tree();
@@ -113,8 +110,7 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
} else if (p_id == BUTTON_GROUP) {
undo_redo->create_action(TTR("Button Group"));
- if (n->is_class("CanvasItem") || n->is_class("Spatial")) {
-
+ if (n->is_class("CanvasItem") || n->is_class("Node3D")) {
undo_redo->add_do_method(n, "remove_meta", "_edit_group_");
undo_redo->add_undo_method(n, "set_meta", "_edit_group_", true);
undo_redo->add_do_method(this, "_update_tree", Variant());
@@ -124,16 +120,15 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
}
undo_redo->commit_action();
} else if (p_id == BUTTON_WARNING) {
-
String config_err = n->get_configuration_warning();
- if (config_err == String())
+ if (config_err == String()) {
return;
+ }
config_err = config_err.word_wrap(80);
warning->set_text(config_err);
- warning->popup_centered_minsize();
+ warning->popup_centered();
} else if (p_id == BUTTON_SIGNALS) {
-
editor_selection->clear();
editor_selection->add_node(n);
@@ -143,7 +138,6 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
NodeDock::singleton->show_connections();
} else if (p_id == BUTTON_GROUPS) {
-
editor_selection->clear();
editor_selection->add_node(n);
@@ -153,6 +147,7 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
NodeDock::singleton->show_groups();
}
}
+
void SceneTreeEditor::_toggle_visible(Node *p_node) {
if (p_node->has_method("is_visible") && p_node->has_method("set_visible")) {
bool v = bool(p_node->call("is_visible"));
@@ -162,9 +157,9 @@ void SceneTreeEditor::_toggle_visible(Node *p_node) {
}
bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
-
- if (!p_node)
+ if (!p_node) {
return false;
+ }
// only owned nodes are editable, since nodes can create their own (manually owned) child nodes,
// which the editor needs not to know about.
@@ -172,9 +167,7 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
bool part_of_subscene = false;
if (!display_foreign && p_node->get_owner() != get_scene_node() && p_node != get_scene_node()) {
-
if ((show_enabled_subscene || can_open_instance) && p_node->get_owner() && (get_scene_node()->is_editable_instance(p_node->get_owner()))) {
-
part_of_subscene = true;
//allow
} else {
@@ -187,42 +180,36 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
TreeItem *item = tree->create_item(p_parent);
item->set_text(0, p_node->get_name());
- if (can_rename && !part_of_subscene /*(p_node->get_owner() == get_scene_node() || p_node==get_scene_node())*/)
+ if (can_rename && !part_of_subscene) {
item->set_editable(0, true);
+ }
item->set_selectable(0, true);
if (can_rename) {
-#ifndef DISABLE_DEPRECATED
- if (p_node->has_meta("_editor_collapsed")) {
- //remove previous way of storing folding, which did not get along with scene inheritance and instancing
- if ((bool)p_node->get_meta("_editor_collapsed"))
- p_node->set_display_folded(true);
- p_node->set_meta("_editor_collapsed", Variant());
- }
-#endif
bool collapsed = p_node->is_displayed_folded();
- if (collapsed)
+ if (collapsed) {
item->set_collapsed(true);
+ }
}
- Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(p_node, "Node");
+ Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(p_node, "Node");
item->set_icon(0, icon);
item->set_metadata(0, p_node->get_path());
if (connect_to_script_mode) {
- Color accent = get_color("accent_color", "Editor");
+ Color accent = get_theme_color("accent_color", "Editor");
Ref<Script> script = p_node->get_script();
if (!script.is_null() && EditorNode::get_singleton()->get_object_custom_type_base(p_node) != script) {
//has script
- item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT);
+ item->add_button(0, get_theme_icon("Script", "EditorIcons"), BUTTON_SCRIPT);
} else {
//has no script (or script is a custom type)
- item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
+ item->set_custom_color(0, get_theme_color("disabled_font_color", "Editor"));
item->set_selectable(0, false);
if (!script.is_null()) { // make sure to mark the script if a custom type
- item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT);
+ item->add_button(0, get_theme_icon("Script", "EditorIcons"), BUTTON_SCRIPT);
item->set_button_disabled(0, item->get_button_count(0) - 1, true);
}
@@ -238,26 +225,23 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
item->set_custom_color(0, accent);
}
} else if (part_of_subscene) {
-
if (valid_types.size() == 0) {
- item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
+ item->set_custom_color(0, get_theme_color("disabled_font_color", "Editor"));
}
} else if (marked.has(p_node)) {
-
String node_name = p_node->get_name();
if (connecting_signal) {
node_name += " " + TTR("(Connecting From)");
}
item->set_text(0, node_name);
item->set_selectable(0, marked_selectable);
- item->set_custom_color(0, get_color("accent_color", "Editor"));
+ item->set_custom_color(0, get_theme_color("accent_color", "Editor"));
} else if (!marked_selectable && !marked_children_selectable) {
-
Node *node = p_node;
while (node) {
if (marked.has(node)) {
item->set_selectable(0, false);
- item->set_custom_color(0, get_color("error_color", "Editor"));
+ item->set_custom_color(0, get_theme_color("error_color", "Editor"));
break;
}
node = node->get_parent();
@@ -268,38 +252,46 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
String warning = p_node->get_configuration_warning();
if (warning != String()) {
- item->add_button(0, get_icon("NodeWarning", "EditorIcons"), BUTTON_WARNING, false, TTR("Node configuration warning:") + "\n" + p_node->get_configuration_warning());
+ item->add_button(0, get_theme_icon("NodeWarning", "EditorIcons"), BUTTON_WARNING, false, TTR("Node configuration warning:") + "\n" + p_node->get_configuration_warning());
}
int num_connections = p_node->get_persistent_signal_connection_count();
int num_groups = p_node->get_persistent_group_count();
+ String msg_temp;
+ if (num_connections >= 1) {
+ Array arr;
+ arr.push_back(num_connections);
+ msg_temp += TTRN("Node has one connection.", "Node has {num} connections.", num_connections).format(arr, "{num}");
+ msg_temp += " ";
+ }
+ if (num_groups >= 1) {
+ Array arr;
+ arr.push_back(num_groups);
+ msg_temp += TTRN("Node is in one group.", "Node is in {num} groups.", num_groups).format(arr, "{num}");
+ }
+ if (num_connections >= 1 || num_groups >= 1) {
+ msg_temp += "\n" + TTR("Click to show signals dock.");
+ }
+
+ Ref<Texture2D> icon_temp;
+ auto signal_temp = BUTTON_SIGNALS;
if (num_connections >= 1 && num_groups >= 1) {
- item->add_button(
- 0,
- get_icon("SignalsAndGroups", "EditorIcons"),
- BUTTON_SIGNALS,
- false,
- vformat(TTR("Node has %s connection(s) and %s group(s).\nClick to show signals dock."), num_connections, num_groups));
+ icon_temp = get_theme_icon("SignalsAndGroups", "EditorIcons");
} else if (num_connections >= 1) {
- item->add_button(
- 0,
- get_icon("Signals", "EditorIcons"),
- BUTTON_SIGNALS,
- false,
- vformat(TTR("Node has %s connection(s).\nClick to show signals dock."), num_connections));
+ icon_temp = get_theme_icon("Signals", "EditorIcons");
} else if (num_groups >= 1) {
- item->add_button(
- 0,
- get_icon("Groups", "EditorIcons"),
- BUTTON_GROUPS,
- false,
- vformat(TTR("Node is in %s group(s).\nClick to show groups dock."), num_groups));
+ icon_temp = get_theme_icon("Groups", "EditorIcons");
+ signal_temp = BUTTON_GROUPS;
+ }
+
+ if (num_connections >= 1 || num_groups >= 1) {
+ item->add_button(0, icon_temp, signal_temp, false, msg_temp);
}
}
if (p_node == get_scene_node() && p_node->get_scene_inherited_state().is_valid()) {
- item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Open in Editor"));
+ item->add_button(0, get_theme_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Open in Editor"));
String tooltip = TTR("Inherits:") + " " + p_node->get_scene_inherited_state()->get_path() + "\n" + TTR("Type:") + " " + p_node->get_class();
if (p_node->get_editor_description() != String()) {
@@ -308,7 +300,7 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
item->set_tooltip(0, tooltip);
} else if (p_node != get_scene_node() && p_node->get_filename() != "" && can_open_instance) {
- item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Open in Editor"));
+ item->add_button(0, get_theme_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Open in Editor"));
String tooltip = TTR("Instance:") + " " + p_node->get_filename() + "\n" + TTR("Type:") + " " + p_node->get_class();
if (p_node->get_editor_description() != String()) {
@@ -332,84 +324,89 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
if (can_open_instance && undo_redo) { //Show buttons only when necessary(SceneTreeDock) to avoid crashes
- if (!p_node->is_connected("script_changed", this, "_node_script_changed"))
- p_node->connect("script_changed", this, "_node_script_changed", varray(p_node));
+ if (!p_node->is_connected("script_changed", callable_mp(this, &SceneTreeEditor::_node_script_changed))) {
+ p_node->connect("script_changed", callable_mp(this, &SceneTreeEditor::_node_script_changed), varray(p_node));
+ }
Ref<Script> script = p_node->get_script();
if (!script.is_null()) {
- item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT, false, TTR("Open Script:") + " " + script->get_path());
+ item->add_button(0, get_theme_icon("Script", "EditorIcons"), BUTTON_SCRIPT, false, TTR("Open Script:") + " " + script->get_path());
if (EditorNode::get_singleton()->get_object_custom_type_base(p_node) == script) {
item->set_button_color(0, item->get_button_count(0) - 1, Color(1, 1, 1, 0.5));
}
}
if (p_node->is_class("CanvasItem")) {
-
bool is_locked = p_node->has_meta("_edit_lock_"); //_edit_group_
- if (is_locked)
- item->add_button(0, get_icon("Lock", "EditorIcons"), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it."));
+ if (is_locked) {
+ item->add_button(0, get_theme_icon("Lock", "EditorIcons"), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it."));
+ }
bool is_grouped = p_node->has_meta("_edit_group_");
- if (is_grouped)
- item->add_button(0, get_icon("Group", "EditorIcons"), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make selectable."));
+ if (is_grouped) {
+ item->add_button(0, get_theme_icon("Group", "EditorIcons"), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make selectable."));
+ }
bool v = p_node->call("is_visible");
- if (v)
- item->add_button(0, get_icon("GuiVisibilityVisible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
- else
- item->add_button(0, get_icon("GuiVisibilityHidden", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
+ if (v) {
+ item->add_button(0, get_theme_icon("GuiVisibilityVisible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
+ } else {
+ item->add_button(0, get_theme_icon("GuiVisibilityHidden", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
+ }
- if (!p_node->is_connected("visibility_changed", this, "_node_visibility_changed"))
- p_node->connect("visibility_changed", this, "_node_visibility_changed", varray(p_node));
+ if (!p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) {
+ p_node->connect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed), varray(p_node));
+ }
_update_visibility_color(p_node, item);
- } else if (p_node->is_class("Spatial")) {
-
+ } else if (p_node->is_class("Node3D")) {
bool is_locked = p_node->has_meta("_edit_lock_");
- if (is_locked)
- item->add_button(0, get_icon("Lock", "EditorIcons"), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it."));
+ if (is_locked) {
+ item->add_button(0, get_theme_icon("Lock", "EditorIcons"), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it."));
+ }
bool is_grouped = p_node->has_meta("_edit_group_");
- if (is_grouped)
- item->add_button(0, get_icon("Group", "EditorIcons"), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make selectable."));
+ if (is_grouped) {
+ item->add_button(0, get_theme_icon("Group", "EditorIcons"), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make selectable."));
+ }
bool v = p_node->call("is_visible");
- if (v)
- item->add_button(0, get_icon("GuiVisibilityVisible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
- else
- item->add_button(0, get_icon("GuiVisibilityHidden", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
+ if (v) {
+ item->add_button(0, get_theme_icon("GuiVisibilityVisible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
+ } else {
+ item->add_button(0, get_theme_icon("GuiVisibilityHidden", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
+ }
- if (!p_node->is_connected("visibility_changed", this, "_node_visibility_changed"))
- p_node->connect("visibility_changed", this, "_node_visibility_changed", varray(p_node));
+ if (!p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) {
+ p_node->connect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed), varray(p_node));
+ }
_update_visibility_color(p_node, item);
} else if (p_node->is_class("AnimationPlayer")) {
-
bool is_pinned = AnimationPlayerEditor::singleton->get_player() == p_node && AnimationPlayerEditor::singleton->is_pinned();
if (is_pinned) {
- item->add_button(0, get_icon("Pin", "EditorIcons"), BUTTON_PIN, false, TTR("AnimationPlayer is pinned.\nClick to unpin."));
+ item->add_button(0, get_theme_icon("Pin", "EditorIcons"), BUTTON_PIN, false, TTR("AnimationPlayer is pinned.\nClick to unpin."));
}
}
}
if (editor_selection) {
if (editor_selection->is_selected(p_node)) {
-
item->select(0);
}
}
if (selected == p_node) {
- if (!editor_selection)
+ if (!editor_selection) {
item->select(0);
+ }
item->set_as_cursor(0);
}
bool keep = (filter.is_subsequence_ofi(String(p_node->get_name())));
for (int i = 0; i < p_node->get_child_count(); i++) {
-
bool child_keep = _add_nodes(p_node->get_child(i), item);
keep = keep || child_keep;
@@ -426,7 +423,7 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
if (!valid) {
//item->set_selectable(0,marked_selectable);
- item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
+ item->set_custom_color(0, get_theme_color("disabled_font_color", "Editor"));
item->set_selectable(0, false);
}
}
@@ -446,9 +443,7 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
}
void SceneTreeEditor::_node_visibility_changed(Node *p_node) {
-
if (!p_node || (p_node != get_scene_node() && !p_node->get_owner())) {
-
return;
}
@@ -466,20 +461,21 @@ void SceneTreeEditor::_node_visibility_changed(Node *p_node) {
if (p_node->is_class("CanvasItem")) {
visible = p_node->call("is_visible");
CanvasItemEditor::get_singleton()->get_viewport_control()->update();
- } else if (p_node->is_class("Spatial")) {
+ } else if (p_node->is_class("Node3D")) {
visible = p_node->call("is_visible");
}
- if (visible)
- item->set_button(0, idx, get_icon("GuiVisibilityVisible", "EditorIcons"));
- else
- item->set_button(0, idx, get_icon("GuiVisibilityHidden", "EditorIcons"));
+ if (visible) {
+ item->set_button(0, idx, get_theme_icon("GuiVisibilityVisible", "EditorIcons"));
+ } else {
+ item->set_button(0, idx, get_theme_icon("GuiVisibilityHidden", "EditorIcons"));
+ }
_update_visibility_color(p_node, item);
}
void SceneTreeEditor::_update_visibility_color(Node *p_node, TreeItem *p_item) {
- if (p_node->is_class("CanvasItem") || p_node->is_class("Spatial")) {
+ if (p_node->is_class("CanvasItem") || p_node->is_class("Node3D")) {
Color color(1, 1, 1, 1);
bool visible_on_screen = p_node->call("is_visible_in_tree");
if (!visible_on_screen) {
@@ -491,50 +487,36 @@ void SceneTreeEditor::_update_visibility_color(Node *p_node, TreeItem *p_item) {
}
void SceneTreeEditor::_node_script_changed(Node *p_node) {
-
- if (tree_dirty)
+ if (tree_dirty) {
return;
+ }
MessageQueue::get_singleton()->push_call(this, "_update_tree");
tree_dirty = true;
- /*
- changes the order :|
- TreeItem* item=p_node?_find(tree->get_root(),p_node->get_path()):NULL;
- if (p_node->get_script().is_null()) {
-
- int idx=item->get_button_by_id(0,2);
- if (idx>=0)
- item->erase_button(0,idx);
- } else {
-
- int idx=item->get_button_by_id(0,2);
- if (idx<0)
- item->add_button(0,get_icon("Script","EditorIcons"),2);
-
- }*/
}
void SceneTreeEditor::_node_removed(Node *p_node) {
-
- if (EditorNode::get_singleton()->is_exiting())
+ if (EditorNode::get_singleton()->is_exiting()) {
return; //speed up exit
+ }
- if (p_node->is_connected("script_changed", this, "_node_script_changed"))
- p_node->disconnect("script_changed", this, "_node_script_changed");
+ if (p_node->is_connected("script_changed", callable_mp(this, &SceneTreeEditor::_node_script_changed))) {
+ p_node->disconnect("script_changed", callable_mp(this, &SceneTreeEditor::_node_script_changed));
+ }
- if (p_node->is_class("Spatial") || p_node->is_class("CanvasItem")) {
- if (p_node->is_connected("visibility_changed", this, "_node_visibility_changed"))
- p_node->disconnect("visibility_changed", this, "_node_visibility_changed");
+ if (p_node->is_class("Node3D") || p_node->is_class("CanvasItem")) {
+ if (p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) {
+ p_node->disconnect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed));
+ }
}
if (p_node == selected) {
- selected = NULL;
+ selected = nullptr;
emit_signal("node_selected");
}
}
void SceneTreeEditor::_node_renamed(Node *p_node) {
-
emit_signal("node_renamed");
if (!tree_dirty) {
@@ -544,7 +526,6 @@ void SceneTreeEditor::_node_renamed(Node *p_node) {
}
void SceneTreeEditor::_update_tree() {
-
if (!is_inside_tree()) {
tree_dirty = false;
return;
@@ -553,7 +534,7 @@ void SceneTreeEditor::_update_tree() {
updating_tree = true;
tree->clear();
if (get_scene_node()) {
- _add_nodes(get_scene_node(), NULL);
+ _add_nodes(get_scene_node(), nullptr);
last_hash = hash_djb2_one_64(0);
_compute_hash(get_scene_node(), last_hash);
}
@@ -563,61 +544,65 @@ void SceneTreeEditor::_update_tree() {
}
void SceneTreeEditor::_compute_hash(Node *p_node, uint64_t &hash) {
-
hash = hash_djb2_one_64(p_node->get_instance_id(), hash);
- if (p_node->get_parent())
+ if (p_node->get_parent()) {
hash = hash_djb2_one_64(p_node->get_parent()->get_instance_id(), hash); //so a reparent still produces a different hash
+ }
for (int i = 0; i < p_node->get_child_count(); i++) {
-
_compute_hash(p_node->get_child(i), hash);
}
}
void SceneTreeEditor::_test_update_tree() {
-
pending_test_update = false;
- if (!is_inside_tree())
+ if (!is_inside_tree()) {
return;
+ }
- if (tree_dirty)
+ if (tree_dirty) {
return; // don't even bother
+ }
uint64_t hash = hash_djb2_one_64(0);
- if (get_scene_node())
+ if (get_scene_node()) {
_compute_hash(get_scene_node(), hash);
+ }
//test hash
- if (hash == last_hash)
+ if (hash == last_hash) {
return; // did not change
+ }
MessageQueue::get_singleton()->push_call(this, "_update_tree");
tree_dirty = true;
}
void SceneTreeEditor::_tree_changed() {
-
- if (EditorNode::get_singleton()->is_exiting())
+ if (EditorNode::get_singleton()->is_exiting()) {
return; //speed up exit
- if (pending_test_update)
+ }
+ if (pending_test_update) {
return;
- if (tree_dirty)
+ }
+ if (tree_dirty) {
return;
+ }
MessageQueue::get_singleton()->push_call(this, "_test_update_tree");
pending_test_update = true;
}
void SceneTreeEditor::_selected_changed() {
-
TreeItem *s = tree->get_selected();
ERR_FAIL_COND(!s);
NodePath np = s->get_metadata(0);
Node *n = get_node(np);
- if (n == selected)
+ if (n == selected) {
return;
+ }
selected = get_node(np);
@@ -627,7 +612,6 @@ void SceneTreeEditor::_selected_changed() {
}
void SceneTreeEditor::_deselect_items() {
-
// Clear currently elected items in scene tree dock.
if (editor_selection) {
editor_selection->clear();
@@ -636,7 +620,6 @@ void SceneTreeEditor::_deselect_items() {
}
void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_selected) {
-
TreeItem *item = Object::cast_to<TreeItem>(p_object);
ERR_FAIL_COND(!item);
@@ -644,11 +627,13 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_
Node *n = get_node(np);
- if (!n)
+ if (!n) {
return;
+ }
- if (!editor_selection)
+ if (!editor_selection) {
return;
+ }
if (p_selected) {
editor_selection->add_node(n);
@@ -660,68 +645,67 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_
}
void SceneTreeEditor::_notification(int p_what) {
-
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
+ get_tree()->connect("tree_changed", callable_mp(this, &SceneTreeEditor::_tree_changed));
+ get_tree()->connect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed));
+ get_tree()->connect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed));
+ get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed));
- get_tree()->connect("tree_changed", this, "_tree_changed");
- get_tree()->connect("node_removed", this, "_node_removed");
- get_tree()->connect("node_renamed", this, "_node_renamed");
- get_tree()->connect("node_configuration_warning_changed", this, "_warning_changed");
-
- tree->connect("item_collapsed", this, "_cell_collapsed");
+ tree->connect("item_collapsed", callable_mp(this, &SceneTreeEditor::_cell_collapsed));
_update_tree();
} break;
case NOTIFICATION_EXIT_TREE: {
-
- get_tree()->disconnect("tree_changed", this, "_tree_changed");
- get_tree()->disconnect("node_removed", this, "_node_removed");
- get_tree()->disconnect("node_renamed", this, "_node_renamed");
- tree->disconnect("item_collapsed", this, "_cell_collapsed");
- get_tree()->disconnect("node_configuration_warning_changed", this, "_warning_changed");
+ get_tree()->disconnect("tree_changed", callable_mp(this, &SceneTreeEditor::_tree_changed));
+ get_tree()->disconnect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed));
+ get_tree()->disconnect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed));
+ tree->disconnect("item_collapsed", callable_mp(this, &SceneTreeEditor::_cell_collapsed));
+ get_tree()->disconnect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed));
} break;
case NOTIFICATION_THEME_CHANGED: {
-
_update_tree();
} break;
}
}
TreeItem *SceneTreeEditor::_find(TreeItem *p_node, const NodePath &p_path) {
-
- if (!p_node)
- return NULL;
+ if (!p_node) {
+ return nullptr;
+ }
NodePath np = p_node->get_metadata(0);
- if (np == p_path)
+ if (np == p_path) {
return p_node;
+ }
TreeItem *children = p_node->get_children();
while (children) {
-
TreeItem *n = _find(children, p_path);
- if (n)
+ if (n) {
return n;
+ }
children = children->get_next();
}
- return NULL;
+ return nullptr;
}
void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) {
-
ERR_FAIL_COND(blocked > 0);
- if (pending_test_update)
+ if (pending_test_update) {
_test_update_tree();
- if (tree_dirty)
+ }
+ if (tree_dirty) {
_update_tree();
+ }
- if (selected == p_node)
+ if (selected == p_node) {
return;
+ }
- TreeItem *item = p_node ? _find(tree->get_root(), p_node->get_path()) : NULL;
+ TreeItem *item = p_node ? _find(tree->get_root(), p_node->get_path()) : nullptr;
if (item) {
// make visible when it's collapsed
@@ -736,8 +720,9 @@ void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) {
tree->ensure_cursor_is_visible();
} else {
- if (!p_node)
- selected = NULL;
+ if (!p_node) {
+ selected = nullptr;
+ }
_update_tree();
selected = p_node;
}
@@ -748,7 +733,6 @@ void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) {
}
void SceneTreeEditor::_rename_node(ObjectID p_node, const String &p_name) {
-
Object *o = ObjectDB::get_instance(p_node);
ERR_FAIL_COND(!o);
Node *n = Object::cast_to<Node>(o);
@@ -762,7 +746,6 @@ void SceneTreeEditor::_rename_node(ObjectID p_node, const String &p_name) {
}
void SceneTreeEditor::_renamed() {
-
TreeItem *which = tree->get_edited();
ERR_FAIL_COND(!which);
@@ -779,9 +762,8 @@ void SceneTreeEditor::_renamed() {
String new_name = which->get_text(0);
if (!Node::_validate_node_name(new_name)) {
-
error->set_text(TTR("Invalid node name, the following characters are not allowed:") + "\n" + Node::invalid_character);
- error->popup_centered_minsize();
+ error->popup_centered();
if (new_name.empty()) {
which->set_text(0, n->get_name());
@@ -791,8 +773,12 @@ void SceneTreeEditor::_renamed() {
which->set_text(0, new_name);
}
- if (new_name == n->get_name())
+ if (new_name == n->get_name()) {
return;
+ }
+
+ // Trim leading/trailing whitespace to prevent node names from containing accidental whitespace, which would make it more difficult to get the node via `get_node()`.
+ new_name = new_name.strip_edges();
if (!undo_redo) {
n->set_name(new_name);
@@ -808,14 +794,13 @@ void SceneTreeEditor::_renamed() {
}
Node *SceneTreeEditor::get_selected() {
-
return selected;
}
void SceneTreeEditor::set_marked(const Set<Node *> &p_marked, bool p_selectable, bool p_children_selectable) {
-
- if (tree_dirty)
+ if (tree_dirty) {
_update_tree();
+ }
marked = p_marked;
marked_selectable = p_selectable;
marked_children_selectable = p_children_selectable;
@@ -823,31 +808,28 @@ void SceneTreeEditor::set_marked(const Set<Node *> &p_marked, bool p_selectable,
}
void SceneTreeEditor::set_marked(Node *p_marked, bool p_selectable, bool p_children_selectable) {
-
Set<Node *> s;
- if (p_marked)
+ if (p_marked) {
s.insert(p_marked);
+ }
set_marked(s, p_selectable, p_children_selectable);
}
void SceneTreeEditor::set_filter(const String &p_filter) {
-
filter = p_filter;
_update_tree();
}
String SceneTreeEditor::get_filter() const {
-
return filter;
}
void SceneTreeEditor::set_display_foreign_nodes(bool p_display) {
-
display_foreign = p_display;
_update_tree();
}
-bool SceneTreeEditor::get_display_foreign_nodes() const {
+bool SceneTreeEditor::get_display_foreign_nodes() const {
return display_foreign;
}
@@ -856,63 +838,66 @@ void SceneTreeEditor::set_valid_types(const Vector<StringName> &p_valid) {
}
void SceneTreeEditor::set_editor_selection(EditorSelection *p_selection) {
-
editor_selection = p_selection;
tree->set_select_mode(Tree::SELECT_MULTI);
tree->set_cursor_can_exit_tree(false);
- editor_selection->connect("selection_changed", this, "_selection_changed");
+ editor_selection->connect("selection_changed", callable_mp(this, &SceneTreeEditor::_selection_changed));
}
void SceneTreeEditor::_update_selection(TreeItem *item) {
-
ERR_FAIL_COND(!item);
NodePath np = item->get_metadata(0);
- if (!has_node(np))
+ if (!has_node(np)) {
return;
+ }
Node *n = get_node(np);
- if (!n)
+ if (!n) {
return;
+ }
- if (editor_selection->is_selected(n))
+ if (editor_selection->is_selected(n)) {
item->select(0);
- else
+ } else {
item->deselect(0);
+ }
TreeItem *c = item->get_children();
while (c) {
-
_update_selection(c);
c = c->get_next();
}
}
void SceneTreeEditor::_selection_changed() {
-
- if (!editor_selection)
+ if (!editor_selection) {
return;
+ }
TreeItem *root = tree->get_root();
- if (!root)
+ if (!root) {
return;
+ }
_update_selection(root);
}
void SceneTreeEditor::_cell_collapsed(Object *p_obj) {
-
- if (updating_tree)
+ if (updating_tree) {
return;
- if (!can_rename)
+ }
+ if (!can_rename) {
return;
+ }
TreeItem *ti = Object::cast_to<TreeItem>(p_obj);
- if (!ti)
+ if (!ti) {
return;
+ }
bool collapsed = ti->is_collapsed();
@@ -925,14 +910,18 @@ void SceneTreeEditor::_cell_collapsed(Object *p_obj) {
}
Variant SceneTreeEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
- if (!can_rename)
+ if (!can_rename) {
return Variant(); //not editable tree
+ }
+
+ if (tree->get_button_id_at_position(p_point) != -1) {
+ return Variant(); //dragging from button
+ }
Vector<Node *> selected;
- Vector<Ref<Texture> > icons;
- TreeItem *next = tree->get_next_selected(NULL);
+ Vector<Ref<Texture2D>> icons;
+ TreeItem *next = tree->get_next_selected(nullptr);
while (next) {
-
NodePath np = next->get_metadata(0);
Node *n = get_node(np);
@@ -946,8 +935,9 @@ Variant SceneTreeEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from
next = tree->get_next_selected(next);
}
- if (selected.empty())
+ if (selected.empty()) {
return Variant();
+ }
VBoxContainer *vb = memnew(VBoxContainer);
Array objs;
@@ -955,7 +945,6 @@ Variant SceneTreeEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from
float opacity_step = 1.0f / list_max;
float opacity_item = 1.0f;
for (int i = 0; i < selected.size(); i++) {
-
if (i < list_max) {
HBoxContainer *hb = memnew(HBoxContainer);
TextureRect *tf = memnew(TextureRect);
@@ -988,30 +977,34 @@ bool SceneTreeEditor::_is_script_type(const StringName &p_type) const {
}
bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
- if (!can_rename)
+ if (!can_rename) {
return false; //not editable tree
- if (filter != String())
+ }
+ if (filter != String()) {
return false; //can't rearrange tree with filter turned on
+ }
Dictionary d = p_data;
- if (!d.has("type"))
+ if (!d.has("type")) {
return false;
+ }
TreeItem *item = tree->get_item_at_position(p_point);
- if (!item)
+ if (!item) {
return false;
+ }
int section = tree->get_drop_section_at_position(p_point);
- if (section < -1 || (section == -1 && !item->get_parent()))
+ if (section < -1 || (section == -1 && !item->get_parent())) {
return false;
+ }
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
- if (files.size() == 0)
+ if (files.size() == 0) {
return false; //weird
+ }
if (_is_script_type(EditorFileSystem::get_singleton()->get_file_type(files[0]))) {
tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
@@ -1021,8 +1014,9 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d
for (int i = 0; i < files.size(); i++) {
String file = files[i];
String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
- if (ftype != "PackedScene")
+ if (ftype != "PackedScene") {
return false;
+ }
}
tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN | Tree::DROP_MODE_ON_ITEM); //so it works..
@@ -1043,22 +1037,26 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d
return String(d["type"]) == "nodes";
}
-void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
- if (!can_drop_data_fw(p_point, p_data, p_from))
+void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+ if (!can_drop_data_fw(p_point, p_data, p_from)) {
return;
+ }
TreeItem *item = tree->get_item_at_position(p_point);
- if (!item)
+ if (!item) {
return;
+ }
int section = tree->get_drop_section_at_position(p_point);
- if (section < -1)
+ if (section < -1) {
return;
+ }
NodePath np = item->get_metadata(0);
Node *n = get_node(np);
- if (!n)
+ if (!n) {
return;
+ }
Dictionary d = p_data;
@@ -1068,7 +1066,6 @@ void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data,
}
if (String(d["type"]) == "files") {
-
Vector<String> files = d["files"];
String ftype = EditorFileSystem::get_singleton()->get_file_type(files[0]);
@@ -1091,12 +1088,10 @@ void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data,
}
void SceneTreeEditor::_rmb_select(const Vector2 &p_pos) {
-
- emit_signal("rmb_pressed", tree->get_global_transform().xform(p_pos));
+ emit_signal("rmb_pressed", tree->get_screen_transform().xform(p_pos));
}
void SceneTreeEditor::_warning_changed(Node *p_for_node) {
-
//should use a timer
update_timer->start();
}
@@ -1112,25 +1107,9 @@ void SceneTreeEditor::set_connecting_signal(bool p_enable) {
}
void SceneTreeEditor::_bind_methods() {
-
- ClassDB::bind_method("_tree_changed", &SceneTreeEditor::_tree_changed);
- ClassDB::bind_method("_update_tree", &SceneTreeEditor::_update_tree);
- ClassDB::bind_method("_node_removed", &SceneTreeEditor::_node_removed);
- ClassDB::bind_method("_node_renamed", &SceneTreeEditor::_node_renamed);
- ClassDB::bind_method("_selected_changed", &SceneTreeEditor::_selected_changed);
- ClassDB::bind_method("_deselect_items", &SceneTreeEditor::_deselect_items);
- ClassDB::bind_method("_renamed", &SceneTreeEditor::_renamed);
+ ClassDB::bind_method("_update_tree", &SceneTreeEditor::_update_tree); // Still used by some connect_compat.
ClassDB::bind_method("_rename_node", &SceneTreeEditor::_rename_node);
ClassDB::bind_method("_test_update_tree", &SceneTreeEditor::_test_update_tree);
- ClassDB::bind_method("_cell_multi_selected", &SceneTreeEditor::_cell_multi_selected);
- ClassDB::bind_method("_selection_changed", &SceneTreeEditor::_selection_changed);
- ClassDB::bind_method("_cell_button_pressed", &SceneTreeEditor::_cell_button_pressed);
- ClassDB::bind_method("_cell_collapsed", &SceneTreeEditor::_cell_collapsed);
- ClassDB::bind_method("_rmb_select", &SceneTreeEditor::_rmb_select);
- ClassDB::bind_method("_warning_changed", &SceneTreeEditor::_warning_changed);
-
- ClassDB::bind_method("_node_script_changed", &SceneTreeEditor::_node_script_changed);
- ClassDB::bind_method("_node_visibility_changed", &SceneTreeEditor::_node_visibility_changed);
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &SceneTreeEditor::get_drag_data_fw);
ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &SceneTreeEditor::can_drop_data_fw);
@@ -1144,7 +1123,7 @@ void SceneTreeEditor::_bind_methods() {
ADD_SIGNAL(MethodInfo("node_changed"));
ADD_SIGNAL(MethodInfo("nodes_dragged"));
ADD_SIGNAL(MethodInfo("nodes_rearranged", PropertyInfo(Variant::ARRAY, "paths"), PropertyInfo(Variant::NODE_PATH, "to_path"), PropertyInfo(Variant::INT, "type")));
- ADD_SIGNAL(MethodInfo("files_dropped", PropertyInfo(Variant::POOL_STRING_ARRAY, "files"), PropertyInfo(Variant::NODE_PATH, "to_path"), PropertyInfo(Variant::INT, "type")));
+ ADD_SIGNAL(MethodInfo("files_dropped", PropertyInfo(Variant::PACKED_STRING_ARRAY, "files"), PropertyInfo(Variant::NODE_PATH, "to_path"), PropertyInfo(Variant::INT, "type")));
ADD_SIGNAL(MethodInfo("script_dropped", PropertyInfo(Variant::STRING, "file"), PropertyInfo(Variant::NODE_PATH, "to_path")));
ADD_SIGNAL(MethodInfo("rmb_pressed", PropertyInfo(Variant::VECTOR2, "position")));
@@ -1153,19 +1132,18 @@ void SceneTreeEditor::_bind_methods() {
}
SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_open_instance) {
-
connect_to_script_mode = false;
connecting_signal = false;
- undo_redo = NULL;
+ undo_redo = nullptr;
tree_dirty = true;
- selected = NULL;
+ selected = nullptr;
marked_selectable = false;
marked_children_selectable = false;
can_rename = p_can_rename;
can_open_instance = p_can_open_instance;
display_foreign = false;
- editor_selection = NULL;
+ editor_selection = nullptr;
if (p_label) {
Label *label = memnew(Label);
@@ -1180,22 +1158,22 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope
tree->set_anchor(MARGIN_BOTTOM, ANCHOR_END);
tree->set_begin(Point2(0, p_label ? 18 : 0));
tree->set_end(Point2(0, 0));
- tree->add_constant_override("button_margin", 0);
+ tree->add_theme_constant_override("button_margin", 0);
add_child(tree);
tree->set_drag_forwarding(this);
if (p_can_rename) {
tree->set_allow_rmb_select(true);
- tree->connect("item_rmb_selected", this, "_rmb_select");
- tree->connect("empty_tree_rmb_selected", this, "_rmb_select");
+ tree->connect("item_rmb_selected", callable_mp(this, &SceneTreeEditor::_rmb_select));
+ tree->connect("empty_tree_rmb_selected", callable_mp(this, &SceneTreeEditor::_rmb_select));
}
- tree->connect("cell_selected", this, "_selected_changed");
- tree->connect("item_edited", this, "_renamed", varray(), CONNECT_DEFERRED);
- tree->connect("multi_selected", this, "_cell_multi_selected");
- tree->connect("button_pressed", this, "_cell_button_pressed");
- tree->connect("nothing_selected", this, "_deselect_items");
+ tree->connect("cell_selected", callable_mp(this, &SceneTreeEditor::_selected_changed));
+ tree->connect("item_edited", callable_mp(this, &SceneTreeEditor::_renamed), varray(), CONNECT_DEFERRED);
+ tree->connect("multi_selected", callable_mp(this, &SceneTreeEditor::_cell_multi_selected));
+ tree->connect("button_pressed", callable_mp(this, &SceneTreeEditor::_cell_button_pressed));
+ tree->connect("nothing_selected", callable_mp(this, &SceneTreeEditor::_deselect_items));
//tree->connect("item_edited", this,"_renamed",Vector<Variant>(),true);
error = memnew(AcceptDialog);
@@ -1213,7 +1191,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope
blocked = 0;
update_timer = memnew(Timer);
- update_timer->connect("timeout", this, "_update_tree");
+ update_timer->connect("timeout", callable_mp(this, &SceneTreeEditor::_update_tree));
update_timer->set_one_shot(true);
update_timer->set_wait_time(0.5);
add_child(update_timer);
@@ -1223,36 +1201,38 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope
}
SceneTreeEditor::~SceneTreeEditor() {
-
memdelete(script_types);
}
/******** DIALOG *********/
-void SceneTreeDialog::_notification(int p_what) {
+void SceneTreeDialog::popup_scenetree_dialog() {
+ popup_centered_clamped(Size2(350, 700) * EDSCALE);
+}
+void SceneTreeDialog::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (is_visible()) {
+ tree->update_tree();
+ }
+ } break;
case NOTIFICATION_ENTER_TREE: {
- connect("confirmed", this, "_select");
- filter->set_right_icon(get_icon("Search", "EditorIcons"));
+ connect("confirmed", callable_mp(this, &SceneTreeDialog::_select));
+ filter->set_right_icon(tree->get_theme_icon("Search", "EditorIcons"));
filter->set_clear_button_enabled(true);
} break;
case NOTIFICATION_EXIT_TREE: {
- disconnect("confirmed", this, "_select");
- } break;
- case NOTIFICATION_VISIBILITY_CHANGED: {
- if (is_visible_in_tree())
- tree->update_tree();
+ disconnect("confirmed", callable_mp(this, &SceneTreeDialog::_select));
} break;
}
}
void SceneTreeDialog::_cancel() {
-
hide();
}
-void SceneTreeDialog::_select() {
+void SceneTreeDialog::_select() {
if (tree->get_selected()) {
emit_signal("selected", tree->get_selected()->get_path());
hide();
@@ -1260,35 +1240,30 @@ void SceneTreeDialog::_select() {
}
void SceneTreeDialog::_filter_changed(const String &p_filter) {
-
tree->set_filter(p_filter);
}
void SceneTreeDialog::_bind_methods() {
-
- ClassDB::bind_method("_select", &SceneTreeDialog::_select);
ClassDB::bind_method("_cancel", &SceneTreeDialog::_cancel);
- ClassDB::bind_method(D_METHOD("_filter_changed"), &SceneTreeDialog::_filter_changed);
ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::NODE_PATH, "path")));
}
SceneTreeDialog::SceneTreeDialog() {
-
set_title(TTR("Select a Node"));
VBoxContainer *vbc = memnew(VBoxContainer);
add_child(vbc);
filter = memnew(LineEdit);
- filter->set_h_size_flags(SIZE_EXPAND_FILL);
+ filter->set_h_size_flags(Control::SIZE_EXPAND_FILL);
filter->set_placeholder(TTR("Filter nodes"));
- filter->add_constant_override("minimum_spaces", 0);
- filter->connect("text_changed", this, "_filter_changed");
+ filter->add_theme_constant_override("minimum_spaces", 0);
+ filter->connect("text_changed", callable_mp(this, &SceneTreeDialog::_filter_changed));
vbc->add_child(filter);
tree = memnew(SceneTreeEditor(false, false, true));
- tree->set_v_size_flags(SIZE_EXPAND_FILL);
- tree->get_scene_tree()->connect("item_activated", this, "_select");
+ tree->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ tree->get_scene_tree()->connect("item_activated", callable_mp(this, &SceneTreeDialog::_select));
vbc->add_child(tree);
}
diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h
index 17ee5ace66..21bb0ec062 100644
--- a/editor/scene_tree_editor.h
+++ b/editor/scene_tree_editor.h
@@ -39,7 +39,6 @@
#include "scene/gui/tree.h"
class SceneTreeEditor : public Control {
-
GDCLASS(SceneTreeEditor, Control);
EditorSelection *editor_selection;
@@ -163,7 +162,6 @@ public:
};
class SceneTreeDialog : public ConfirmationDialog {
-
GDCLASS(SceneTreeDialog, ConfirmationDialog);
SceneTreeEditor *tree;
@@ -181,6 +179,7 @@ protected:
static void _bind_methods();
public:
+ void popup_scenetree_dialog();
SceneTreeEditor *get_scene_tree() { return tree; }
SceneTreeDialog();
~SceneTreeDialog();
diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp
index a982724d4c..90efb11b7d 100644
--- a/editor/script_create_dialog.cpp
+++ b/editor/script_create_dialog.cpp
@@ -40,51 +40,50 @@
#include "editor/editor_scale.h"
#include "editor_file_system.h"
-void ScriptCreateDialog::_notification(int p_what) {
+void ScriptCreateDialog::_theme_changed() {
+ for (int i = 0; i < ScriptServer::get_language_count(); i++) {
+ String lang = ScriptServer::get_language(i)->get_type();
+ Ref<Texture2D> lang_icon = gc->get_theme_icon(lang, "EditorIcons");
+ if (lang_icon.is_valid()) {
+ language_menu->set_item_icon(i, lang_icon);
+ }
+ }
- switch (p_what) {
- case NOTIFICATION_THEME_CHANGED:
- case NOTIFICATION_ENTER_TREE: {
- for (int i = 0; i < ScriptServer::get_language_count(); i++) {
- String lang = ScriptServer::get_language(i)->get_type();
- Ref<Texture> lang_icon = get_icon(lang, "EditorIcons");
- if (lang_icon.is_valid()) {
- language_menu->set_item_icon(i, lang_icon);
- }
+ String last_lang = EditorSettings::get_singleton()->get_project_metadata("script_setup", "last_selected_language", "");
+ if (!last_lang.empty()) {
+ for (int i = 0; i < language_menu->get_item_count(); i++) {
+ if (language_menu->get_item_text(i) == last_lang) {
+ language_menu->select(i);
+ current_language = i;
+ break;
}
- String last_lang = EditorSettings::get_singleton()->get_project_metadata("script_setup", "last_selected_language", "");
- Ref<Texture> last_lang_icon;
- if (!last_lang.empty()) {
-
- for (int i = 0; i < language_menu->get_item_count(); i++) {
- if (language_menu->get_item_text(i) == last_lang) {
- language_menu->select(i);
- current_language = i;
- break;
- }
- }
+ }
+ } else {
+ language_menu->select(default_language);
+ }
- last_lang_icon = get_icon(last_lang, "EditorIcons");
- } else {
- last_lang_icon = language_menu->get_item_icon(default_language);
- }
- if (last_lang_icon.is_valid()) {
- language_menu->set_icon(last_lang_icon);
- }
- path_button->set_icon(get_icon("Folder", "EditorIcons"));
- parent_browse_button->set_icon(get_icon("Folder", "EditorIcons"));
- parent_search_button->set_icon(get_icon("ClassList", "EditorIcons"));
- status_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
+ path_button->set_icon(gc->get_theme_icon("Folder", "EditorIcons"));
+ parent_browse_button->set_icon(gc->get_theme_icon("Folder", "EditorIcons"));
+ parent_search_button->set_icon(gc->get_theme_icon("ClassList", "EditorIcons"));
+ status_panel->add_theme_style_override("panel", gc->get_theme_stylebox("bg", "Tree"));
+}
+
+void ScriptCreateDialog::_notification(int p_what) {
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ _theme_changed();
} break;
}
}
void ScriptCreateDialog::_path_hbox_sorted() {
if (is_visible()) {
- int filename_start_pos = initial_bp.find_last("/") + 1;
+ int filename_start_pos = initial_bp.rfind("/") + 1;
int filename_end_pos = initial_bp.length();
- file_path->select(filename_start_pos, filename_end_pos);
+ if (!is_built_in) {
+ file_path->select(filename_start_pos, filename_end_pos);
+ }
// First set cursor to the end of line to scroll LineEdit view
// to the right and then set the actual cursor position.
@@ -100,7 +99,6 @@ bool ScriptCreateDialog::_can_be_built_in() {
}
void ScriptCreateDialog::config(const String &p_base_name, const String &p_base_path, bool p_built_in_enabled, bool p_load_enabled) {
-
class_name->set_text("");
class_name->deselect();
parent_name->set_text(p_base_name);
@@ -125,54 +123,60 @@ void ScriptCreateDialog::config(const String &p_base_name, const String &p_base_
}
void ScriptCreateDialog::set_inheritance_base_type(const String &p_base) {
-
base_type = p_base;
}
bool ScriptCreateDialog::_validate_parent(const String &p_string) {
-
- if (p_string.length() == 0)
+ if (p_string.length() == 0) {
return false;
+ }
if (can_inherit_from_file && p_string.is_quoted()) {
String p = p_string.substr(1, p_string.length() - 2);
- if (_validate_path(p, true) == "")
+ if (_validate_path(p, true) == "") {
return true;
+ }
}
return ClassDB::class_exists(p_string) || ScriptServer::is_global_class(p_string);
}
bool ScriptCreateDialog::_validate_class(const String &p_string) {
-
- if (p_string.length() == 0)
+ if (p_string.length() == 0) {
return false;
+ }
for (int i = 0; i < p_string.length(); i++) {
-
if (i == 0) {
- if (p_string[0] >= '0' && p_string[0] <= '9')
+ if (p_string[0] >= '0' && p_string[0] <= '9') {
return false; // no start with number plz
+ }
}
bool valid_char = (p_string[i] >= '0' && p_string[i] <= '9') || (p_string[i] >= 'a' && p_string[i] <= 'z') || (p_string[i] >= 'A' && p_string[i] <= 'Z') || p_string[i] == '_' || p_string[i] == '.';
- if (!valid_char)
+ if (!valid_char) {
return false;
+ }
}
return true;
}
String ScriptCreateDialog::_validate_path(const String &p_path, bool p_file_must_exist) {
-
String p = p_path.strip_edges();
- if (p == "") return TTR("Path is empty.");
- if (p.get_file().get_basename() == "") return TTR("Filename is empty.");
+ if (p == "") {
+ return TTR("Path is empty.");
+ }
+ if (p.get_file().get_basename() == "") {
+ return TTR("Filename is empty.");
+ }
p = ProjectSettings::get_singleton()->localize_path(p);
- if (!p.begins_with("res://")) return TTR("Path is not local.");
+ if (!p.begins_with("res://")) {
+ return TTR("Path is not local.");
+ }
DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
if (d->change_dir(p.get_base_dir()) != OK) {
@@ -217,19 +221,24 @@ String ScriptCreateDialog::_validate_path(const String &p_path, bool p_file_must
index++;
}
- if (!found) return TTR("Invalid extension.");
- if (!match) return TTR("Wrong extension chosen.");
+ if (!found) {
+ return TTR("Invalid extension.");
+ }
+ if (!match) {
+ return TTR("Wrong extension chosen.");
+ }
/* Let ScriptLanguage do custom validation */
String path_error = ScriptServer::get_language(language_menu->get_selected())->validate_path(p);
- if (path_error != "") return path_error;
+ if (path_error != "") {
+ return path_error;
+ }
/* All checks passed */
return "";
}
void ScriptCreateDialog::_class_name_changed(const String &p_name) {
-
if (_validate_class(class_name->get_text())) {
is_class_name_valid = true;
} else {
@@ -239,7 +248,6 @@ void ScriptCreateDialog::_class_name_changed(const String &p_name) {
}
void ScriptCreateDialog::_parent_name_changed(const String &p_parent) {
-
if (_validate_parent(parent_name->get_text())) {
is_parent_name_valid = true;
} else {
@@ -249,7 +257,6 @@ void ScriptCreateDialog::_parent_name_changed(const String &p_parent) {
}
void ScriptCreateDialog::_template_changed(int p_template) {
-
String selected_template = p_template == 0 ? "" : template_menu->get_item_text(p_template);
EditorSettings::get_singleton()->set_project_metadata("script_setup", "last_selected_template", selected_template);
if (p_template == 0) {
@@ -269,7 +276,6 @@ void ScriptCreateDialog::_template_changed(int p_template) {
}
void ScriptCreateDialog::ok_pressed() {
-
if (is_new_script_created) {
_create_new();
} else {
@@ -281,7 +287,6 @@ void ScriptCreateDialog::ok_pressed() {
}
void ScriptCreateDialog::_create_new() {
-
String cname_param;
if (has_named_classes) {
@@ -306,8 +311,9 @@ void ScriptCreateDialog::_create_new() {
if (has_named_classes) {
String cname = class_name->get_text();
- if (cname.length())
+ if (cname.length()) {
scr->set_name(cname);
+ }
}
if (!is_built_in) {
@@ -326,7 +332,6 @@ void ScriptCreateDialog::_create_new() {
}
void ScriptCreateDialog::_load_exist() {
-
String path = file_path->get_text();
RES p_script = ResourceLoader::load(path, "Script");
if (p_script.is_null()) {
@@ -335,19 +340,19 @@ void ScriptCreateDialog::_load_exist() {
return;
}
- emit_signal("script_created", p_script.get_ref_ptr());
+ emit_signal("script_created", p_script);
hide();
}
void ScriptCreateDialog::_lang_changed(int l) {
-
ScriptLanguage *language = ScriptServer::get_language(l);
has_named_classes = language->has_named_classes();
can_inherit_from_file = language->can_inherit_from_file();
supports_built_in = language->supports_builtin_mode();
- if (!supports_built_in)
+ if (!supports_built_in) {
is_built_in = false;
+ }
String selected_ext = "." + language->get_extension();
String path = file_path->get_text();
@@ -404,7 +409,6 @@ void ScriptCreateDialog::_lang_changed(int l) {
// Populate script template items previously sorted and now grouped by origin
for (int i = 0; i < template_list.size(); i++) {
-
if (int(templates[i].origin) != cur_origin) {
template_menu->add_separator();
@@ -422,7 +426,7 @@ void ScriptCreateDialog::_lang_changed(int l) {
templates[i].id = new_id;
}
// Disable overridden
- for (Map<String, Vector<int> >::Element *E = template_overrides.front(); E; E = E->next()) {
+ for (Map<String, Vector<int>>::Element *E = template_overrides.front(); E; E = E->next()) {
const Vector<int> &overrides = E->get();
if (overrides.size() == 1) {
@@ -445,7 +449,7 @@ void ScriptCreateDialog::_lang_changed(int l) {
override_info += ", ";
}
}
- template_menu->set_item_icon(extended.id, get_icon("Override", "EditorIcons"));
+ template_menu->set_item_icon(extended.id, gc->get_theme_icon("Override", "EditorIcons"));
template_menu->get_popup()->set_item_tooltip(extended.id, override_info.as_string());
}
// Reselect last selected template
@@ -469,7 +473,6 @@ void ScriptCreateDialog::_lang_changed(int l) {
}
void ScriptCreateDialog::_update_script_templates(const String &p_extension) {
-
template_list.clear();
template_overrides.clear();
@@ -480,7 +483,6 @@ void ScriptCreateDialog::_update_script_templates(const String &p_extension) {
dirs.push_back(EditorSettings::get_singleton()->get_script_templates_dir());
for (int i = 0; i < dirs.size(); i++) {
-
Vector<String> list = EditorSettings::get_singleton()->get_script_templates(p_extension, dirs[i]);
for (int j = 0; j < list.size(); j++) {
@@ -504,7 +506,6 @@ void ScriptCreateDialog::_update_script_templates(const String &p_extension) {
}
void ScriptCreateDialog::_built_in_pressed() {
-
if (internal->is_pressed()) {
is_built_in = true;
is_new_script_created = true;
@@ -516,15 +517,14 @@ void ScriptCreateDialog::_built_in_pressed() {
}
void ScriptCreateDialog::_browse_path(bool browse_parent, bool p_save) {
-
is_browsing_parent = browse_parent;
if (p_save) {
- file_browse->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ file_browse->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE);
file_browse->set_title(TTR("Open Script / Choose Location"));
file_browse->get_ok()->set_text(TTR("Open"));
} else {
- file_browse->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_browse->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file_browse->set_title(TTR("Open Script"));
}
@@ -540,11 +540,10 @@ void ScriptCreateDialog::_browse_path(bool browse_parent, bool p_save) {
}
file_browse->set_current_path(file_path->get_text());
- file_browse->popup_centered_ratio();
+ file_browse->popup_file_dialog();
}
void ScriptCreateDialog::_file_selected(const String &p_file) {
-
String p = ProjectSettings::get_singleton()->localize_path(p_file);
if (is_browsing_parent) {
parent_name->set_text("\"" + p + "\"");
@@ -554,7 +553,7 @@ void ScriptCreateDialog::_file_selected(const String &p_file) {
_path_changed(p);
String filename = p.get_file().get_basename();
- int select_start = p.find_last(filename);
+ int select_start = p.rfind(filename);
file_path->select(select_start, select_start + filename.length());
file_path->set_cursor_position(select_start + filename.length());
file_path->grab_focus();
@@ -562,18 +561,19 @@ void ScriptCreateDialog::_file_selected(const String &p_file) {
}
void ScriptCreateDialog::_create() {
-
parent_name->set_text(select_class->get_selected_type().split(" ")[0]);
_parent_name_changed(parent_name->get_text());
}
void ScriptCreateDialog::_browse_class_in_tree() {
-
select_class->set_base_type(base_type);
select_class->popup_create(true);
}
void ScriptCreateDialog::_path_changed(const String &p_path) {
+ if (is_built_in) {
+ return;
+ }
is_path_valid = false;
is_new_script_created = true;
@@ -603,27 +603,24 @@ void ScriptCreateDialog::_path_entered(const String &p_path) {
}
void ScriptCreateDialog::_msg_script_valid(bool valid, const String &p_msg) {
-
- error_label->set_text("- " + TTR(p_msg));
+ error_label->set_text("- " + p_msg);
if (valid) {
- error_label->add_color_override("font_color", get_color("success_color", "Editor"));
+ error_label->add_theme_color_override("font_color", gc->get_theme_color("success_color", "Editor"));
} else {
- error_label->add_color_override("font_color", get_color("error_color", "Editor"));
+ error_label->add_theme_color_override("font_color", gc->get_theme_color("error_color", "Editor"));
}
}
void ScriptCreateDialog::_msg_path_valid(bool valid, const String &p_msg) {
-
- path_error_label->set_text("- " + TTR(p_msg));
+ path_error_label->set_text("- " + p_msg);
if (valid) {
- path_error_label->add_color_override("font_color", get_color("success_color", "Editor"));
+ path_error_label->add_theme_color_override("font_color", gc->get_theme_color("success_color", "Editor"));
} else {
- path_error_label->add_color_override("font_color", get_color("error_color", "Editor"));
+ path_error_label->add_theme_color_override("font_color", gc->get_theme_color("error_color", "Editor"));
}
}
void ScriptCreateDialog::_update_dialog() {
-
/* "Add Script Dialog" GUI logic and script checks. */
bool script_ok = true;
@@ -686,6 +683,8 @@ void ScriptCreateDialog::_update_dialog() {
// Is Script created or loaded from existing file?
+ builtin_warning_label->set_visible(is_built_in);
+
if (is_built_in) {
get_ok()->set_text(TTR("Create"));
parent_name->set_editable(true);
@@ -723,37 +722,33 @@ void ScriptCreateDialog::_update_dialog() {
}
get_ok()->set_disabled(!script_ok);
+
+ Callable entered_call = callable_mp(this, &ScriptCreateDialog::_path_entered);
+ if (script_ok) {
+ if (!file_path->is_connected("text_entered", entered_call)) {
+ file_path->connect("text_entered", entered_call);
+ }
+ } else if (file_path->is_connected("text_entered", entered_call)) {
+ file_path->disconnect("text_entered", entered_call);
+ }
}
void ScriptCreateDialog::_bind_methods() {
-
- ClassDB::bind_method("_path_hbox_sorted", &ScriptCreateDialog::_path_hbox_sorted);
- ClassDB::bind_method("_class_name_changed", &ScriptCreateDialog::_class_name_changed);
- ClassDB::bind_method("_parent_name_changed", &ScriptCreateDialog::_parent_name_changed);
- ClassDB::bind_method("_lang_changed", &ScriptCreateDialog::_lang_changed);
- ClassDB::bind_method("_built_in_pressed", &ScriptCreateDialog::_built_in_pressed);
- ClassDB::bind_method("_browse_path", &ScriptCreateDialog::_browse_path);
- ClassDB::bind_method("_file_selected", &ScriptCreateDialog::_file_selected);
- ClassDB::bind_method("_path_changed", &ScriptCreateDialog::_path_changed);
- ClassDB::bind_method("_path_entered", &ScriptCreateDialog::_path_entered);
- ClassDB::bind_method("_template_changed", &ScriptCreateDialog::_template_changed);
- ClassDB::bind_method("_create", &ScriptCreateDialog::_create);
- ClassDB::bind_method("_browse_class_in_tree", &ScriptCreateDialog::_browse_class_in_tree);
-
ClassDB::bind_method(D_METHOD("config", "inherits", "path", "built_in_enabled", "load_enabled"), &ScriptCreateDialog::config, DEFVAL(true), DEFVAL(true));
ADD_SIGNAL(MethodInfo("script_created", PropertyInfo(Variant::OBJECT, "script", PROPERTY_HINT_RESOURCE_TYPE, "Script")));
}
ScriptCreateDialog::ScriptCreateDialog() {
-
/* DIALOG */
/* Main Controls */
- GridContainer *gc = memnew(GridContainer);
+ gc = memnew(GridContainer);
gc->set_columns(2);
+ gc->connect("theme_changed", callable_mp(this, &ScriptCreateDialog::_theme_changed));
+
/* Error Messages Field */
VBoxContainer *vb = memnew(VBoxContainer);
@@ -764,6 +759,13 @@ ScriptCreateDialog::ScriptCreateDialog() {
path_error_label = memnew(Label);
vb->add_child(path_error_label);
+ builtin_warning_label = memnew(Label);
+ builtin_warning_label->set_text(
+ TTR("Note: Built-in scripts have some limitations and can't be edited using an external editor."));
+ vb->add_child(builtin_warning_label);
+ builtin_warning_label->set_autowrap(true);
+ builtin_warning_label->hide();
+
status_panel = memnew(PanelContainer);
status_panel->set_h_size_flags(Control::SIZE_FILL);
status_panel->add_child(vb);
@@ -786,42 +788,42 @@ ScriptCreateDialog::ScriptCreateDialog() {
language_menu = memnew(OptionButton);
language_menu->set_custom_minimum_size(Size2(250, 0) * EDSCALE);
- language_menu->set_h_size_flags(SIZE_EXPAND_FILL);
+ language_menu->set_h_size_flags(Control::SIZE_EXPAND_FILL);
gc->add_child(memnew(Label(TTR("Language:"))));
gc->add_child(language_menu);
- default_language = 0;
+ default_language = -1;
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
-
String lang = ScriptServer::get_language(i)->get_name();
language_menu->add_item(lang);
if (lang == "GDScript") {
default_language = i;
}
}
-
- language_menu->select(default_language);
+ if (default_language >= 0) {
+ language_menu->select(default_language);
+ }
current_language = default_language;
- language_menu->connect("item_selected", this, "_lang_changed");
+ language_menu->connect("item_selected", callable_mp(this, &ScriptCreateDialog::_lang_changed));
/* Inherits */
base_type = "Object";
hb = memnew(HBoxContainer);
- hb->set_h_size_flags(SIZE_EXPAND_FILL);
+ hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
parent_name = memnew(LineEdit);
- parent_name->connect("text_changed", this, "_parent_name_changed");
- parent_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ parent_name->connect("text_changed", callable_mp(this, &ScriptCreateDialog::_parent_name_changed));
+ parent_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hb->add_child(parent_name);
parent_search_button = memnew(Button);
parent_search_button->set_flat(true);
- parent_search_button->connect("pressed", this, "_browse_class_in_tree");
+ parent_search_button->connect("pressed", callable_mp(this, &ScriptCreateDialog::_browse_class_in_tree));
hb->add_child(parent_search_button);
parent_browse_button = memnew(Button);
parent_browse_button->set_flat(true);
- parent_browse_button->connect("pressed", this, "_browse_path", varray(true, false));
+ parent_browse_button->connect("pressed", callable_mp(this, &ScriptCreateDialog::_browse_path), varray(true, false));
hb->add_child(parent_browse_button);
gc->add_child(memnew(Label(TTR("Inherits:"))));
gc->add_child(hb);
@@ -830,8 +832,8 @@ ScriptCreateDialog::ScriptCreateDialog() {
/* Class Name */
class_name = memnew(LineEdit);
- class_name->connect("text_changed", this, "_class_name_changed");
- class_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ class_name->connect("text_changed", callable_mp(this, &ScriptCreateDialog::_class_name_changed));
+ class_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
gc->add_child(memnew(Label(TTR("Class Name:"))));
gc->add_child(class_name);
@@ -840,28 +842,27 @@ ScriptCreateDialog::ScriptCreateDialog() {
template_menu = memnew(OptionButton);
gc->add_child(memnew(Label(TTR("Template:"))));
gc->add_child(template_menu);
- template_menu->connect("item_selected", this, "_template_changed");
+ template_menu->connect("item_selected", callable_mp(this, &ScriptCreateDialog::_template_changed));
/* Built-in Script */
internal = memnew(CheckBox);
internal->set_text(TTR("On"));
- internal->connect("pressed", this, "_built_in_pressed");
+ internal->connect("pressed", callable_mp(this, &ScriptCreateDialog::_built_in_pressed));
gc->add_child(memnew(Label(TTR("Built-in Script:"))));
gc->add_child(internal);
/* Path */
hb = memnew(HBoxContainer);
- hb->connect("sort_children", this, "_path_hbox_sorted");
+ hb->connect("sort_children", callable_mp(this, &ScriptCreateDialog::_path_hbox_sorted));
file_path = memnew(LineEdit);
- file_path->connect("text_changed", this, "_path_changed");
- file_path->connect("text_entered", this, "_path_entered");
- file_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ file_path->connect("text_changed", callable_mp(this, &ScriptCreateDialog::_path_changed));
+ file_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hb->add_child(file_path);
path_button = memnew(Button);
path_button->set_flat(true);
- path_button->connect("pressed", this, "_browse_path", varray(false, true));
+ path_button->connect("pressed", callable_mp(this, &ScriptCreateDialog::_browse_path), varray(false, true));
hb->add_child(path_button);
gc->add_child(memnew(Label(TTR("Path:"))));
gc->add_child(hb);
@@ -870,23 +871,21 @@ ScriptCreateDialog::ScriptCreateDialog() {
/* Dialog Setup */
select_class = memnew(CreateDialog);
- select_class->connect("create", this, "_create");
+ select_class->connect("create", callable_mp(this, &ScriptCreateDialog::_create));
add_child(select_class);
file_browse = memnew(EditorFileDialog);
- file_browse->connect("file_selected", this, "_file_selected");
- file_browse->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ file_browse->connect("file_selected", callable_mp(this, &ScriptCreateDialog::_file_selected));
+ file_browse->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
add_child(file_browse);
get_ok()->set_text(TTR("Create"));
alert = memnew(AcceptDialog);
- alert->set_as_minsize();
alert->get_label()->set_autowrap(true);
alert->get_label()->set_align(Label::ALIGN_CENTER);
alert->get_label()->set_valign(Label::VALIGN_CENTER);
alert->get_label()->set_custom_minimum_size(Size2(325, 60) * EDSCALE);
add_child(alert);
- set_as_minsize();
set_hide_on_ok(false);
set_title(TTR("Attach Node Script"));
diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h
index 00f642fcf7..40415ea209 100644
--- a/editor/script_create_dialog.h
+++ b/editor/script_create_dialog.h
@@ -45,9 +45,11 @@ class CreateDialog;
class ScriptCreateDialog : public ConfirmationDialog {
GDCLASS(ScriptCreateDialog, ConfirmationDialog);
+ GridContainer *gc;
LineEdit *class_name;
Label *error_label;
Label *path_error_label;
+ Label *builtin_warning_label;
PanelContainer *status_panel;
LineEdit *parent_name;
Button *parent_browse_button;
@@ -93,7 +95,7 @@ class ScriptCreateDialog : public ConfirmationDialog {
String script_template;
Vector<ScriptTemplateInfo> template_list;
- Map<String, Vector<int> > template_overrides; // name : indices
+ Map<String, Vector<int>> template_overrides; // name : indices
void _update_script_templates(const String &p_extension);
@@ -115,7 +117,7 @@ class ScriptCreateDialog : public ConfirmationDialog {
void _file_selected(const String &p_file);
void _create();
void _browse_class_in_tree();
- virtual void ok_pressed();
+ virtual void ok_pressed() override;
void _create_new();
void _load_exist();
void _msg_script_valid(bool valid, const String &p_msg = String());
@@ -123,6 +125,7 @@ class ScriptCreateDialog : public ConfirmationDialog {
void _update_dialog();
protected:
+ void _theme_changed();
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp
deleted file mode 100644
index ab4501bb8a..0000000000
--- a/editor/script_editor_debugger.cpp
+++ /dev/null
@@ -1,2640 +0,0 @@
-/*************************************************************************/
-/* script_editor_debugger.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "script_editor_debugger.h"
-
-#include "core/io/marshalls.h"
-#include "core/project_settings.h"
-#include "core/ustring.h"
-#include "editor/plugins/canvas_item_editor_plugin.h"
-#include "editor/plugins/spatial_editor_plugin.h"
-#include "editor_log.h"
-#include "editor_network_profiler.h"
-#include "editor_node.h"
-#include "editor_profiler.h"
-#include "editor_scale.h"
-#include "editor_settings.h"
-#include "main/performance.h"
-#include "property_editor.h"
-#include "scene/gui/dialogs.h"
-#include "scene/gui/label.h"
-#include "scene/gui/line_edit.h"
-#include "scene/gui/margin_container.h"
-#include "scene/gui/rich_text_label.h"
-#include "scene/gui/separator.h"
-#include "scene/gui/split_container.h"
-#include "scene/gui/tab_container.h"
-#include "scene/gui/texture_button.h"
-#include "scene/gui/tree.h"
-#include "scene/resources/packed_scene.h"
-
-class ScriptEditorDebuggerVariables : public Object {
-
- GDCLASS(ScriptEditorDebuggerVariables, Object);
-
- List<PropertyInfo> props;
- Map<StringName, Variant> values;
-
-protected:
- bool _set(const StringName &p_name, const Variant &p_value) {
-
- return false;
- }
-
- bool _get(const StringName &p_name, Variant &r_ret) const {
-
- if (!values.has(p_name))
- return false;
- r_ret = values[p_name];
- return true;
- }
- void _get_property_list(List<PropertyInfo> *p_list) const {
-
- for (const List<PropertyInfo>::Element *E = props.front(); E; E = E->next())
- p_list->push_back(E->get());
- }
-
-public:
- void clear() {
-
- props.clear();
- values.clear();
- }
-
- String get_var_value(const String &p_var) const {
-
- for (Map<StringName, Variant>::Element *E = values.front(); E; E = E->next()) {
- String v = E->key().operator String().get_slice("/", 1);
- if (v == p_var)
- return E->get();
- }
-
- return "";
- }
-
- void add_property(const String &p_name, const Variant &p_value, const PropertyHint &p_hint, const String p_hint_string) {
-
- PropertyInfo pinfo;
- pinfo.name = p_name;
- pinfo.type = p_value.get_type();
- pinfo.hint = p_hint;
- pinfo.hint_string = p_hint_string;
- props.push_back(pinfo);
- values[p_name] = p_value;
- }
-
- void update() {
- _change_notify();
- }
-
- ScriptEditorDebuggerVariables() {
- }
-};
-
-class ScriptEditorDebuggerInspectedObject : public Object {
-
- GDCLASS(ScriptEditorDebuggerInspectedObject, Object);
-
-protected:
- bool _set(const StringName &p_name, const Variant &p_value) {
-
- if (!prop_values.has(p_name) || String(p_name).begins_with("Constants/"))
- return false;
-
- prop_values[p_name] = p_value;
- emit_signal("value_edited", p_name, p_value);
- return true;
- }
-
- bool _get(const StringName &p_name, Variant &r_ret) const {
-
- if (!prop_values.has(p_name))
- return false;
-
- r_ret = prop_values[p_name];
- return true;
- }
-
- void _get_property_list(List<PropertyInfo> *p_list) const {
-
- p_list->clear(); //sorry, no want category
- for (const List<PropertyInfo>::Element *E = prop_list.front(); E; E = E->next()) {
- p_list->push_back(E->get());
- }
- }
-
- static void _bind_methods() {
-
- ClassDB::bind_method(D_METHOD("get_title"), &ScriptEditorDebuggerInspectedObject::get_title);
- ClassDB::bind_method(D_METHOD("get_variant"), &ScriptEditorDebuggerInspectedObject::get_variant);
- ClassDB::bind_method(D_METHOD("clear"), &ScriptEditorDebuggerInspectedObject::clear);
- ClassDB::bind_method(D_METHOD("get_remote_object_id"), &ScriptEditorDebuggerInspectedObject::get_remote_object_id);
-
- ADD_SIGNAL(MethodInfo("value_edited"));
- }
-
-public:
- String type_name;
- ObjectID remote_object_id;
- List<PropertyInfo> prop_list;
- Map<StringName, Variant> prop_values;
-
- ObjectID get_remote_object_id() {
- return remote_object_id;
- }
-
- String get_title() {
- if (remote_object_id)
- return TTR("Remote ") + String(type_name) + ": " + itos(remote_object_id);
- else
- return "<null>";
- }
- Variant get_variant(const StringName &p_name) {
-
- Variant var;
- _get(p_name, var);
- return var;
- }
-
- void clear() {
-
- prop_list.clear();
- prop_values.clear();
- }
- void update() {
- _change_notify();
- }
- void update_single(const char *p_prop) {
- _change_notify(p_prop);
- }
-
- ScriptEditorDebuggerInspectedObject() {
- remote_object_id = 0;
- }
-};
-
-void ScriptEditorDebugger::debug_copy() {
- String msg = reason->get_text();
- if (msg == "") return;
- OS::get_singleton()->set_clipboard(msg);
-}
-
-void ScriptEditorDebugger::debug_skip_breakpoints() {
- skip_breakpoints_value = !skip_breakpoints_value;
- if (skip_breakpoints_value)
- skip_breakpoints->set_icon(get_icon("DebugSkipBreakpointsOn", "EditorIcons"));
- else
- skip_breakpoints->set_icon(get_icon("DebugSkipBreakpointsOff", "EditorIcons"));
-
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("set_skip_breakpoints");
- msg.push_back(skip_breakpoints_value);
- ppeer->put_var(msg);
- }
-}
-
-void ScriptEditorDebugger::debug_next() {
-
- ERR_FAIL_COND(!breaked);
- ERR_FAIL_COND(connection.is_null());
- ERR_FAIL_COND(!connection->is_connected_to_host());
- Array msg;
- msg.push_back("next");
- ppeer->put_var(msg);
- _clear_execution();
- stack_dump->clear();
-}
-void ScriptEditorDebugger::debug_step() {
-
- ERR_FAIL_COND(!breaked);
- ERR_FAIL_COND(connection.is_null());
- ERR_FAIL_COND(!connection->is_connected_to_host());
-
- Array msg;
- msg.push_back("step");
- ppeer->put_var(msg);
- _clear_execution();
- stack_dump->clear();
-}
-
-void ScriptEditorDebugger::debug_break() {
-
- ERR_FAIL_COND(breaked);
- ERR_FAIL_COND(connection.is_null());
- ERR_FAIL_COND(!connection->is_connected_to_host());
-
- Array msg;
- msg.push_back("break");
- ppeer->put_var(msg);
-}
-
-void ScriptEditorDebugger::debug_continue() {
-
- ERR_FAIL_COND(!breaked);
- ERR_FAIL_COND(connection.is_null());
- ERR_FAIL_COND(!connection->is_connected_to_host());
-
- OS::get_singleton()->enable_for_stealing_focus(EditorNode::get_singleton()->get_child_process_id());
-
- Array msg;
- _clear_execution();
- msg.push_back("continue");
- ppeer->put_var(msg);
-}
-
-void ScriptEditorDebugger::_scene_tree_folded(Object *obj) {
-
- if (updating_scene_tree) {
-
- return;
- }
- TreeItem *item = Object::cast_to<TreeItem>(obj);
-
- if (!item)
- return;
-
- ObjectID id = item->get_metadata(0);
- if (unfold_cache.has(id)) {
- unfold_cache.erase(id);
- } else {
- unfold_cache.insert(id);
- }
-}
-
-void ScriptEditorDebugger::_scene_tree_selected() {
-
- if (updating_scene_tree) {
-
- return;
- }
- TreeItem *item = inspect_scene_tree->get_selected();
- if (!item) {
-
- return;
- }
-
- inspected_object_id = item->get_metadata(0);
-
- Array msg;
- msg.push_back("inspect_object");
- msg.push_back(inspected_object_id);
- ppeer->put_var(msg);
-}
-
-void ScriptEditorDebugger::_scene_tree_rmb_selected(const Vector2 &p_position) {
-
- TreeItem *item = inspect_scene_tree->get_item_at_position(p_position);
- if (!item)
- return;
-
- item->select(0);
-
- item_menu->clear();
- item_menu->add_icon_item(get_icon("CreateNewSceneFrom", "EditorIcons"), TTR("Save Branch as Scene"), ITEM_MENU_SAVE_REMOTE_NODE);
- item_menu->add_icon_item(get_icon("CopyNodePath", "EditorIcons"), TTR("Copy Node Path"), ITEM_MENU_COPY_NODE_PATH);
- item_menu->set_global_position(get_global_mouse_position());
- item_menu->popup();
-}
-
-void ScriptEditorDebugger::_file_selected(const String &p_file) {
- switch (file_dialog_mode) {
- case SAVE_NODE: {
- Array msg;
- msg.push_back("save_node");
- msg.push_back(inspected_object_id);
- msg.push_back(p_file);
- ppeer->put_var(msg);
- } break;
- case SAVE_CSV: {
- Error err;
- FileAccessRef file = FileAccess::open(p_file, FileAccess::WRITE, &err);
-
- if (err != OK) {
- ERR_PRINTS("Failed to open " + p_file);
- return;
- }
- Vector<String> line;
- line.resize(Performance::MONITOR_MAX);
-
- // signatures
- for (int i = 0; i < Performance::MONITOR_MAX; i++) {
- line.write[i] = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i));
- }
- file->store_csv_line(line);
-
- // values
- List<Vector<float> >::Element *E = perf_history.back();
- while (E) {
-
- Vector<float> &perf_data = E->get();
- for (int i = 0; i < perf_data.size(); i++) {
-
- line.write[i] = String::num_real(perf_data[i]);
- }
- file->store_csv_line(line);
- E = E->prev();
- }
- file->store_string("\n");
-
- Vector<Vector<String> > profiler_data = profiler->get_data_as_csv();
- for (int i = 0; i < profiler_data.size(); i++) {
- file->store_csv_line(profiler_data[i]);
- }
-
- } break;
- }
-}
-
-void ScriptEditorDebugger::_scene_tree_property_value_edited(const String &p_prop, const Variant &p_value) {
-
- Array msg;
- msg.push_back("set_object_property");
- msg.push_back(inspected_object_id);
- msg.push_back(p_prop);
- msg.push_back(p_value);
- ppeer->put_var(msg);
- inspect_edited_object_timeout = 0.7; //avoid annoyance, don't request soon after editing
-}
-
-void ScriptEditorDebugger::_scene_tree_property_select_object(ObjectID p_object) {
-
- inspected_object_id = p_object;
- Array msg;
- msg.push_back("inspect_object");
- msg.push_back(inspected_object_id);
- ppeer->put_var(msg);
-}
-
-void ScriptEditorDebugger::_scene_tree_request() {
-
- ERR_FAIL_COND(connection.is_null());
- ERR_FAIL_COND(!connection->is_connected_to_host());
-
- Array msg;
- msg.push_back("request_scene_tree");
- ppeer->put_var(msg);
-}
-
-/// Populates inspect_scene_tree recursively given data in nodes.
-/// Nodes is an array containing 4 elements for each node, it follows this pattern:
-/// nodes[i] == number of direct children of this node
-/// nodes[i + 1] == node name
-/// nodes[i + 2] == node class
-/// nodes[i + 3] == node instance id
-///
-/// Returns the number of items parsed in nodes from current_index.
-///
-/// Given a nodes array like [R,A,B,C,D,E] the following Tree will be generated, assuming
-/// filter is an empty String, R and A child count are 2, B is 1 and C, D and E are 0.
-///
-/// R
-/// |-A
-/// | |-B
-/// | | |-C
-/// | |
-/// | |-D
-/// |
-/// |-E
-///
-int ScriptEditorDebugger::_update_scene_tree(TreeItem *parent, const Array &nodes, int current_index) {
- String filter = EditorNode::get_singleton()->get_scene_tree_dock()->get_filter();
- String item_text = nodes[current_index + 1];
- String item_type = nodes[current_index + 2];
- bool keep = filter.is_subsequence_ofi(item_text);
-
- TreeItem *item = inspect_scene_tree->create_item(parent);
- item->set_text(0, item_text);
- item->set_tooltip(0, TTR("Type:") + " " + item_type);
- ObjectID id = ObjectID(nodes[current_index + 3]);
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(nodes[current_index + 2], "");
- if (icon.is_valid()) {
- item->set_icon(0, icon);
- }
- item->set_metadata(0, id);
-
- if (id == inspected_object_id) {
- TreeItem *cti = item->get_parent();
- while (cti) {
- cti->set_collapsed(false);
- cti = cti->get_parent();
- }
- item->select(0);
- }
-
- // Set current item as collapsed if necessary
- if (parent) {
- if (!unfold_cache.has(id)) {
- item->set_collapsed(true);
- }
- }
-
- int children_count = nodes[current_index];
- // Tracks the total number of items parsed in nodes, this is used to skips nodes that
- // are not direct children of the current node since we can't know in advance the total
- // number of children, direct and not, of a node without traversing the nodes array previously.
- // Keeping track of this allows us to build our remote scene tree by traversing the node
- // array just once.
- int items_count = 1;
- for (int i = 0; i < children_count; i++) {
- // Called for each direct child of item.
- // Direct children of current item might not be adjacent so items_count must
- // be incremented by the number of items parsed until now, otherwise we would not
- // be able to access the next child of the current item.
- // items_count is multiplied by 4 since that's the number of elements in the nodes
- // array needed to represent a single node.
- items_count += _update_scene_tree(item, nodes, current_index + items_count * 4);
- }
-
- // If item has not children and should not be kept delete it
- if (!keep && !item->get_children() && parent) {
- parent->remove_child(item);
- memdelete(item);
- }
-
- return items_count;
-}
-
-void ScriptEditorDebugger::_video_mem_request() {
-
- if (connection.is_null() || !connection->is_connected_to_host()) {
- // Video RAM usage is only available while a project is being debugged.
- return;
- }
-
- Array msg;
- msg.push_back("request_video_mem");
- ppeer->put_var(msg);
-}
-
-Size2 ScriptEditorDebugger::get_minimum_size() const {
-
- Size2 ms = MarginContainer::get_minimum_size();
- ms.y = MAX(ms.y, 250 * EDSCALE);
- return ms;
-}
-
-void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_data) {
-
- if (p_msg == "debug_enter") {
- Array msg;
- msg.push_back("get_stack_dump");
- ppeer->put_var(msg);
- ERR_FAIL_COND(p_data.size() != 2);
- bool can_continue = p_data[0];
- String error = p_data[1];
- step->set_disabled(!can_continue);
- next->set_disabled(!can_continue);
- _set_reason_text(error, MESSAGE_ERROR);
- copy->set_disabled(false);
- breaked = true;
- dobreak->set_disabled(true);
- docontinue->set_disabled(false);
- emit_signal("breaked", true, can_continue);
- OS::get_singleton()->move_window_to_foreground();
- if (error != "") {
- tabs->set_current_tab(0);
- }
- profiler->set_enabled(false);
- EditorNode::get_singleton()->get_pause_button()->set_pressed(true);
- EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
- _clear_remote_objects();
-
- } else if (p_msg == "debug_exit") {
-
- breaked = false;
- _clear_execution();
- copy->set_disabled(true);
- step->set_disabled(true);
- next->set_disabled(true);
- reason->set_text("");
- reason->set_tooltip("");
- back->set_disabled(true);
- forward->set_disabled(true);
- dobreak->set_disabled(false);
- docontinue->set_disabled(true);
- emit_signal("breaked", false, false, Variant());
- profiler->set_enabled(true);
- profiler->disable_seeking();
- EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
- } else if (p_msg == "message:click_ctrl") {
-
- clicked_ctrl->set_text(p_data[0]);
- clicked_ctrl_type->set_text(p_data[1]);
-
- } else if (p_msg == "message:scene_tree") {
-
- inspect_scene_tree->clear();
- Map<int, TreeItem *> lv;
-
- updating_scene_tree = true;
-
- _update_scene_tree(NULL, p_data, 0);
-
- updating_scene_tree = false;
-
- le_clear->set_disabled(false);
- le_set->set_disabled(false);
- } else if (p_msg == "message:inspect_object") {
-
- ScriptEditorDebuggerInspectedObject *debugObj = NULL;
-
- ObjectID id = p_data[0];
- String type = p_data[1];
- Array properties = p_data[2];
-
- if (remote_objects.has(id)) {
- debugObj = remote_objects[id];
- } else {
- debugObj = memnew(ScriptEditorDebuggerInspectedObject);
- debugObj->remote_object_id = id;
- debugObj->type_name = type;
- remote_objects[id] = debugObj;
- debugObj->connect("value_edited", this, "_scene_tree_property_value_edited");
- }
-
- int old_prop_size = debugObj->prop_list.size();
-
- debugObj->prop_list.clear();
- int new_props_added = 0;
- Set<String> changed;
- for (int i = 0; i < properties.size(); i++) {
-
- Array prop = properties[i];
- if (prop.size() != 6)
- continue;
-
- PropertyInfo pinfo;
- pinfo.name = prop[0];
- pinfo.type = Variant::Type(int(prop[1]));
- pinfo.hint = PropertyHint(int(prop[2]));
- pinfo.hint_string = prop[3];
- pinfo.usage = PropertyUsageFlags(int(prop[4]));
- Variant var = prop[5];
-
- if (pinfo.type == Variant::OBJECT) {
- if (var.is_zero()) {
- var = RES();
- } else if (var.get_type() == Variant::STRING) {
- String path = var;
- if (path.find("::") != -1) {
- // built-in resource
- String base_path = path.get_slice("::", 0);
- if (ResourceLoader::get_resource_type(base_path) == "PackedScene") {
- if (!EditorNode::get_singleton()->is_scene_open(base_path)) {
- EditorNode::get_singleton()->load_scene(base_path);
- }
- } else {
- EditorNode::get_singleton()->load_resource(base_path);
- }
- }
- var = ResourceLoader::load(path);
-
- if (pinfo.hint_string == "Script") {
- if (debugObj->get_script() != var) {
- debugObj->set_script(RefPtr());
- Ref<Script> script(var);
- if (!script.is_null()) {
- ScriptInstance *script_instance = script->placeholder_instance_create(debugObj);
- debugObj->set_script_and_instance(var, script_instance);
- }
- }
- }
- } else if (var.get_type() == Variant::OBJECT) {
- if (((Object *)var)->is_class("EncodedObjectAsID")) {
- var = Object::cast_to<EncodedObjectAsID>(var)->get_object_id();
- pinfo.type = var.get_type();
- pinfo.hint = PROPERTY_HINT_OBJECT_ID;
- pinfo.hint_string = "Object";
- }
- }
- }
-
- //always add the property, since props may have been added or removed
- debugObj->prop_list.push_back(pinfo);
-
- if (!debugObj->prop_values.has(pinfo.name)) {
- new_props_added++;
- debugObj->prop_values[pinfo.name] = var;
- } else {
-
- if (bool(Variant::evaluate(Variant::OP_NOT_EQUAL, debugObj->prop_values[pinfo.name], var))) {
- debugObj->prop_values[pinfo.name] = var;
- changed.insert(pinfo.name);
- }
- }
- }
-
- if (editor->get_editor_history()->get_current() != debugObj->get_instance_id()) {
- editor->push_item(debugObj, "");
- } else {
-
- if (old_prop_size == debugObj->prop_list.size() && new_props_added == 0) {
- //only some may have changed, if so, then update those, if exist
- for (Set<String>::Element *E = changed.front(); E; E = E->next()) {
- EditorNode::get_singleton()->get_inspector()->update_property(E->get());
- }
- } else {
- //full update, because props were added or removed
- debugObj->update();
- }
- }
- } else if (p_msg == "message:video_mem") {
-
- vmem_tree->clear();
- TreeItem *root = vmem_tree->create_item();
-
- int total = 0;
-
- for (int i = 0; i < p_data.size(); i += 4) {
-
- TreeItem *it = vmem_tree->create_item(root);
- String type = p_data[i + 1];
- int bytes = p_data[i + 3].operator int();
- it->set_text(0, p_data[i + 0]); //path
- it->set_text(1, type); //type
- it->set_text(2, p_data[i + 2]); //type
- it->set_text(3, String::humanize_size(bytes)); //type
- total += bytes;
-
- if (has_icon(type, "EditorIcons"))
- it->set_icon(0, get_icon(type, "EditorIcons"));
- }
-
- vmem_total->set_tooltip(TTR("Bytes:") + " " + itos(total));
- vmem_total->set_text(String::humanize_size(total));
-
- } else if (p_msg == "stack_dump") {
-
- stack_dump->clear();
- TreeItem *r = stack_dump->create_item();
-
- for (int i = 0; i < p_data.size(); i++) {
-
- Dictionary d = p_data[i];
- ERR_CONTINUE(!d.has("function"));
- ERR_CONTINUE(!d.has("file"));
- ERR_CONTINUE(!d.has("line"));
- ERR_CONTINUE(!d.has("id"));
- TreeItem *s = stack_dump->create_item(r);
- d["frame"] = i;
- s->set_metadata(0, d);
-
- String line = itos(i) + " - " + String(d["file"]) + ":" + itos(d["line"]) + " - at function: " + d["function"];
- s->set_text(0, line);
-
- if (i == 0)
- s->select(0);
- }
- } else if (p_msg == "stack_frame_vars") {
-
- variables->clear();
-
- int ofs = 0;
- int mcount = p_data[ofs];
- ofs++;
- for (int i = 0; i < mcount; i++) {
-
- String n = p_data[ofs + i * 2 + 0];
- Variant v = p_data[ofs + i * 2 + 1];
-
- PropertyHint h = PROPERTY_HINT_NONE;
- String hs = String();
-
- if (v.get_type() == Variant::OBJECT) {
- v = Object::cast_to<EncodedObjectAsID>(v)->get_object_id();
- h = PROPERTY_HINT_OBJECT_ID;
- hs = "Object";
- }
-
- variables->add_property("Locals/" + n, v, h, hs);
- }
-
- ofs += mcount * 2;
- mcount = p_data[ofs];
- ofs++;
- for (int i = 0; i < mcount; i++) {
-
- String n = p_data[ofs + i * 2 + 0];
- Variant v = p_data[ofs + i * 2 + 1];
- PropertyHint h = PROPERTY_HINT_NONE;
- String hs = String();
-
- if (v.get_type() == Variant::OBJECT) {
- v = Object::cast_to<EncodedObjectAsID>(v)->get_object_id();
- h = PROPERTY_HINT_OBJECT_ID;
- hs = "Object";
- }
-
- variables->add_property("Members/" + n, v, h, hs);
-
- if (n == "self") {
- _scene_tree_property_select_object(v);
- }
- }
-
- ofs += mcount * 2;
- mcount = p_data[ofs];
- ofs++;
- for (int i = 0; i < mcount; i++) {
-
- String n = p_data[ofs + i * 2 + 0];
- Variant v = p_data[ofs + i * 2 + 1];
- PropertyHint h = PROPERTY_HINT_NONE;
- String hs = String();
-
- if (v.get_type() == Variant::OBJECT) {
- v = Object::cast_to<EncodedObjectAsID>(v)->get_object_id();
- h = PROPERTY_HINT_OBJECT_ID;
- hs = "Object";
- }
-
- variables->add_property("Globals/" + n, v, h, hs);
- }
-
- variables->update();
- inspector->edit(variables);
-
- } else if (p_msg == "output") {
-
- //OUT
- for (int i = 0; i < p_data.size(); i++) {
-
- String t = p_data[i];
- //LOG
-
- if (!EditorNode::get_log()->is_visible()) {
- if (EditorNode::get_singleton()->are_bottom_panels_hidden()) {
- if (EDITOR_GET("run/output/always_open_output_on_play")) {
- EditorNode::get_singleton()->make_bottom_panel_item_visible(EditorNode::get_log());
- }
- }
- }
- EditorNode::get_log()->add_message(t);
- }
-
- } else if (p_msg == "performance") {
- Array arr = p_data[0];
- Vector<float> p;
- p.resize(arr.size());
- for (int i = 0; i < arr.size(); i++) {
- p.write[i] = arr[i];
- if (i < perf_items.size()) {
-
- const float value = p[i];
- String label = rtos(value);
- String tooltip = label;
- switch (Performance::MonitorType((int)perf_items[i]->get_metadata(1))) {
- case Performance::MONITOR_TYPE_MEMORY: {
- label = String::humanize_size(value);
- tooltip = label;
- } break;
- case Performance::MONITOR_TYPE_TIME: {
- label = rtos(value * 1000).pad_decimals(2) + " ms";
- tooltip = label;
- } break;
- default: {
- tooltip += " " + perf_items[i]->get_text(0);
- } break;
- }
-
- perf_items[i]->set_text(1, label);
- perf_items[i]->set_tooltip(1, tooltip);
- if (p[i] > perf_max[i])
- perf_max.write[i] = p[i];
- }
- }
- perf_history.push_front(p);
- perf_draw->update();
-
- } else if (p_msg == "error") {
-
- // Should have at least two elements, error array and stack items count.
- ERR_FAIL_COND_MSG(p_data.size() < 2, "Malformed error message from script debugger.");
-
- // Error or warning data.
- Array err = p_data[0];
- ERR_FAIL_COND_MSG(err.size() < 10, "Malformed error message from script debugger.");
-
- // Format time.
- Array time_vals;
- time_vals.push_back(err[0]);
- time_vals.push_back(err[1]);
- time_vals.push_back(err[2]);
- time_vals.push_back(err[3]);
- bool e;
- String time = String("%d:%02d:%02d.%03d").sprintf(time_vals, &e);
-
- // Rest of the error data.
- String method = err[4];
- String source_file = err[5];
- String source_line = err[6];
- String error_cond = err[7];
- String error_msg = err[8];
- bool is_warning = err[9];
- bool has_method = !method.empty();
- bool has_error_msg = !error_msg.empty();
- bool source_is_project_file = source_file.begins_with("res://");
-
- // Metadata to highlight error line in scripts.
- Array source_meta;
- source_meta.push_back(source_file);
- source_meta.push_back(source_line);
-
- // Create error tree to display above error or warning details.
- TreeItem *r = error_tree->get_root();
- if (!r) {
- r = error_tree->create_item();
- }
-
- // Also provide the relevant details as tooltip to quickly check without
- // uncollapsing the tree.
- String tooltip = is_warning ? TTR("Warning:") : TTR("Error:");
-
- TreeItem *error = error_tree->create_item(r);
- error->set_collapsed(true);
-
- error->set_icon(0, get_icon(is_warning ? "Warning" : "Error", "EditorIcons"));
- error->set_text(0, time);
- error->set_text_align(0, TreeItem::ALIGN_LEFT);
-
- String error_title;
- // Include method name, when given, in error title.
- if (has_method)
- error_title += method + ": ";
- // If we have a (custom) error message, use it as title, and add a C++ Error
- // item with the original error condition.
- error_title += error_msg.empty() ? error_cond : error_msg;
- error->set_text(1, error_title);
- tooltip += " " + error_title + "\n";
-
- if (has_error_msg) {
- // Add item for C++ error condition.
- TreeItem *cpp_cond = error_tree->create_item(error);
- cpp_cond->set_text(0, "<" + TTR("C++ Error") + ">");
- cpp_cond->set_text(1, error_cond);
- cpp_cond->set_text_align(0, TreeItem::ALIGN_LEFT);
- tooltip += TTR("C++ Error:") + " " + error_cond + "\n";
- if (source_is_project_file)
- cpp_cond->set_metadata(0, source_meta);
- }
-
- // Source of the error.
- String source_txt = (source_is_project_file ? source_file.get_file() : source_file) + ":" + source_line;
- if (has_method)
- source_txt += " @ " + method + "()";
-
- TreeItem *cpp_source = error_tree->create_item(error);
- cpp_source->set_text(0, "<" + (source_is_project_file ? TTR("Source") : TTR("C++ Source")) + ">");
- cpp_source->set_text(1, source_txt);
- cpp_source->set_text_align(0, TreeItem::ALIGN_LEFT);
- tooltip += (source_is_project_file ? TTR("Source:") : TTR("C++ Source:")) + " " + source_txt + "\n";
-
- // Set metadata to highlight error line in scripts.
- if (source_is_project_file) {
- error->set_metadata(0, source_meta);
- cpp_source->set_metadata(0, source_meta);
- }
-
- error->set_tooltip(0, tooltip);
- error->set_tooltip(1, tooltip);
-
- // Format stack trace.
- // stack_items_count is the number of elements to parse, with 3 items per frame
- // of the stack trace (script, method, line).
- int stack_items_count = p_data[1];
-
- for (int i = 0; i < stack_items_count; i += 3) {
- String script = p_data[2 + i];
- String method2 = p_data[3 + i];
- int line = p_data[4 + i];
- TreeItem *stack_trace = error_tree->create_item(error);
-
- Array meta;
- meta.push_back(script);
- meta.push_back(line);
- stack_trace->set_metadata(0, meta);
-
- if (i == 0) {
- stack_trace->set_text(0, "<" + TTR("Stack Trace") + ">");
- stack_trace->set_text_align(0, TreeItem::ALIGN_LEFT);
- error->set_metadata(0, meta);
- }
- stack_trace->set_text(1, script.get_file() + ":" + itos(line) + " @ " + method2 + "()");
- }
-
- if (is_warning)
- warning_count++;
- else
- error_count++;
-
- } else if (p_msg == "profile_sig") {
- //cache a signature
- profiler_signature[p_data[1]] = p_data[0];
-
- } else if (p_msg == "profile_frame" || p_msg == "profile_total") {
-
- EditorProfiler::Metric metric;
- metric.valid = true;
- metric.frame_number = p_data[0];
- metric.frame_time = p_data[1];
- metric.idle_time = p_data[2];
- metric.physics_time = p_data[3];
- metric.physics_frame_time = p_data[4];
- int frame_data_amount = p_data[6];
- int frame_function_amount = p_data[7];
-
- if (frame_data_amount) {
- EditorProfiler::Metric::Category frame_time;
- frame_time.signature = "category_frame_time";
- frame_time.name = "Frame Time";
- frame_time.total_time = metric.frame_time;
-
- EditorProfiler::Metric::Category::Item item;
- item.calls = 1;
- item.line = 0;
-
- item.name = "Physics Time";
- item.total = metric.physics_time;
- item.self = item.total;
- item.signature = "physics_time";
-
- frame_time.items.push_back(item);
-
- item.name = "Idle Time";
- item.total = metric.idle_time;
- item.self = item.total;
- item.signature = "idle_time";
-
- frame_time.items.push_back(item);
-
- item.name = "Physics Frame Time";
- item.total = metric.physics_frame_time;
- item.self = item.total;
- item.signature = "physics_frame_time";
-
- frame_time.items.push_back(item);
-
- metric.categories.push_back(frame_time);
- }
-
- int idx = 8;
- for (int i = 0; i < frame_data_amount; i++) {
-
- EditorProfiler::Metric::Category c;
- String name = p_data[idx++];
- Array values = p_data[idx++];
- c.name = name.capitalize();
- c.items.resize(values.size() / 2);
- c.total_time = 0;
- c.signature = "categ::" + name;
- for (int j = 0; j < values.size(); j += 2) {
-
- EditorProfiler::Metric::Category::Item item;
- item.calls = 1;
- item.line = 0;
- item.name = values[j];
- item.self = values[j + 1];
- item.total = item.self;
- item.signature = "categ::" + name + "::" + item.name;
- item.name = item.name.capitalize();
- c.total_time += item.total;
- c.items.write[j / 2] = item;
- }
- metric.categories.push_back(c);
- }
-
- EditorProfiler::Metric::Category funcs;
- funcs.total_time = p_data[5]; //script time
- funcs.items.resize(frame_function_amount);
- funcs.name = "Script Functions";
- funcs.signature = "script_functions";
- for (int i = 0; i < frame_function_amount; i++) {
-
- int signature = p_data[idx++];
- int calls = p_data[idx++];
- float total = p_data[idx++];
- float self = p_data[idx++];
-
- EditorProfiler::Metric::Category::Item item;
- if (profiler_signature.has(signature)) {
-
- item.signature = profiler_signature[signature];
-
- String name = profiler_signature[signature];
- Vector<String> strings = name.split("::");
- if (strings.size() == 3) {
- item.name = strings[2];
- item.script = strings[0];
- item.line = strings[1].to_int();
- } else if (strings.size() == 4) { //Built-in scripts have an :: in their name
- item.name = strings[3];
- item.script = strings[0] + "::" + strings[1];
- item.line = strings[2].to_int();
- }
-
- } else {
- item.name = "SigErr " + itos(signature);
- }
-
- item.calls = calls;
- item.self = self;
- item.total = total;
- funcs.items.write[i] = item;
- }
-
- metric.categories.push_back(funcs);
-
- if (p_msg == "profile_frame")
- profiler->add_frame_metric(metric, false);
- else
- profiler->add_frame_metric(metric, true);
- } else if (p_msg == "network_profile") {
- int frame_size = 6;
- for (int i = 0; i < p_data.size(); i += frame_size) {
- MultiplayerAPI::ProfilingInfo pi;
- pi.node = p_data[i + 0];
- pi.node_path = p_data[i + 1];
- pi.incoming_rpc = p_data[i + 2];
- pi.incoming_rset = p_data[i + 3];
- pi.outgoing_rpc = p_data[i + 4];
- pi.outgoing_rset = p_data[i + 5];
- network_profiler->add_node_frame_data(pi);
- }
- } else if (p_msg == "network_bandwidth") {
- network_profiler->set_bandwidth(p_data[0], p_data[1]);
- } else if (p_msg == "kill_me") {
-
- editor->call_deferred("stop_child_process");
- }
-}
-
-void ScriptEditorDebugger::_set_reason_text(const String &p_reason, MessageType p_type) {
- switch (p_type) {
- case MESSAGE_ERROR:
- reason->add_color_override("font_color", get_color("error_color", "Editor"));
- break;
- case MESSAGE_WARNING:
- reason->add_color_override("font_color", get_color("warning_color", "Editor"));
- break;
- default:
- reason->add_color_override("font_color", get_color("success_color", "Editor"));
- }
- reason->set_text(p_reason);
- reason->set_tooltip(p_reason.word_wrap(80));
-}
-
-void ScriptEditorDebugger::_performance_select() {
-
- perf_draw->update();
-}
-
-void ScriptEditorDebugger::_performance_draw() {
-
- Vector<int> which;
- for (int i = 0; i < perf_items.size(); i++) {
-
- if (perf_items[i]->is_checked(0))
- which.push_back(i);
- }
-
- if (which.empty()) {
- info_message->show();
- return;
- }
-
- info_message->hide();
-
- Ref<StyleBox> graph_sb = get_stylebox("normal", "TextEdit");
- Ref<Font> graph_font = get_font("font", "TextEdit");
-
- int cols = Math::ceil(Math::sqrt((float)which.size()));
- int rows = Math::ceil((float)which.size() / cols);
- if (which.size() == 1)
- rows = 1;
-
- int margin = 3;
- int point_sep = 5;
- Size2i s = Size2i(perf_draw->get_size()) / Size2i(cols, rows);
- for (int i = 0; i < which.size(); i++) {
-
- Point2i p(i % cols, i / cols);
- Rect2i r(p * s, s);
- r.position += Point2(margin, margin);
- r.size -= Point2(margin, margin) * 2.0;
- perf_draw->draw_style_box(graph_sb, r);
- r.position += graph_sb->get_offset();
- r.size -= graph_sb->get_minimum_size();
- int pi = which[i];
- Color c = get_color("accent_color", "Editor");
- float h = (float)which[i] / (float)(perf_items.size());
- // Use a darker color on light backgrounds for better visibility
- float value_multiplier = EditorSettings::get_singleton()->is_dark_theme() ? 1.4 : 0.55;
- c.set_hsv(Math::fmod(h + 0.4, 0.9), c.get_s() * 0.9, c.get_v() * value_multiplier);
-
- c.a = 0.6;
- perf_draw->draw_string(graph_font, r.position + Point2(0, graph_font->get_ascent()), perf_items[pi]->get_text(0), c, r.size.x);
- c.a = 0.9;
- perf_draw->draw_string(graph_font, r.position + Point2(0, graph_font->get_ascent() + graph_font->get_height()), perf_items[pi]->get_text(1), c, r.size.y);
-
- float spacing = point_sep / float(cols);
- float from = r.size.width;
-
- List<Vector<float> >::Element *E = perf_history.front();
- float prev = -1;
- while (from >= 0 && E) {
-
- float m = perf_max[pi];
- if (m == 0)
- m = 0.00001;
- float h2 = E->get()[pi] / m;
- h2 = (1.0 - h2) * r.size.y;
-
- if (E != perf_history.front())
- perf_draw->draw_line(r.position + Point2(from, h2), r.position + Point2(from + spacing, prev), c, Math::round(EDSCALE), true);
- prev = h2;
- E = E->next();
- from -= spacing;
- }
- }
-}
-
-void ScriptEditorDebugger::_notification(int p_what) {
-
- switch (p_what) {
-
- case NOTIFICATION_ENTER_TREE: {
-
- inspector->edit(variables);
- skip_breakpoints->set_icon(get_icon("DebugSkipBreakpointsOff", "EditorIcons"));
- copy->set_icon(get_icon("ActionCopy", "EditorIcons"));
-
- step->set_icon(get_icon("DebugStep", "EditorIcons"));
- next->set_icon(get_icon("DebugNext", "EditorIcons"));
- back->set_icon(get_icon("Back", "EditorIcons"));
- forward->set_icon(get_icon("Forward", "EditorIcons"));
- dobreak->set_icon(get_icon("Pause", "EditorIcons"));
- docontinue->set_icon(get_icon("DebugContinue", "EditorIcons"));
- le_set->connect("pressed", this, "_live_edit_set");
- le_clear->connect("pressed", this, "_live_edit_clear");
- error_tree->connect("item_selected", this, "_error_selected");
- error_tree->connect("item_activated", this, "_error_activated");
- vmem_refresh->set_icon(get_icon("Reload", "EditorIcons"));
-
- reason->add_color_override("font_color", get_color("error_color", "Editor"));
-
- } break;
- case NOTIFICATION_PROCESS: {
-
- if (connection.is_valid()) {
-
- inspect_scene_tree_timeout -= get_process_delta_time();
- if (inspect_scene_tree_timeout < 0) {
- inspect_scene_tree_timeout = EditorSettings::get_singleton()->get("debugger/remote_scene_tree_refresh_interval");
- if (inspect_scene_tree->is_visible_in_tree()) {
- _scene_tree_request();
- }
- }
-
- inspect_edited_object_timeout -= get_process_delta_time();
- if (inspect_edited_object_timeout < 0) {
- inspect_edited_object_timeout = EditorSettings::get_singleton()->get("debugger/remote_inspect_refresh_interval");
- if (inspected_object_id) {
- if (ScriptEditorDebuggerInspectedObject *obj = Object::cast_to<ScriptEditorDebuggerInspectedObject>(ObjectDB::get_instance(editor->get_editor_history()->get_current()))) {
- if (obj->remote_object_id == inspected_object_id) {
- //take the chance and re-inspect selected object
- Array msg;
- msg.push_back("inspect_object");
- msg.push_back(inspected_object_id);
- ppeer->put_var(msg);
- }
- }
- }
- }
-
- if (camera_override == OVERRIDE_2D) {
- CanvasItemEditor *editor = CanvasItemEditor::get_singleton();
-
- Dictionary state = editor->get_state();
- float zoom = state["zoom"];
- Point2 offset = state["ofs"];
- Transform2D transform;
-
- transform.scale_basis(Size2(zoom, zoom));
- transform.elements[2] = -offset * zoom;
-
- Array msg;
- msg.push_back("override_camera_2D:transform");
- msg.push_back(transform);
- ppeer->put_var(msg);
-
- } else if (camera_override >= OVERRIDE_3D_1) {
- int viewport_idx = camera_override - OVERRIDE_3D_1;
- SpatialEditorViewport *viewport = SpatialEditor::get_singleton()->get_editor_viewport(viewport_idx);
- Camera *const cam = viewport->get_camera();
-
- Array msg;
- msg.push_back("override_camera_3D:transform");
- msg.push_back(cam->get_camera_transform());
- if (cam->get_projection() == Camera::PROJECTION_ORTHOGONAL) {
- msg.push_back(false);
- msg.push_back(cam->get_size());
- } else {
- msg.push_back(true);
- msg.push_back(cam->get_fov());
- }
- msg.push_back(cam->get_znear());
- msg.push_back(cam->get_zfar());
- ppeer->put_var(msg);
- }
- }
-
- if (error_count != last_error_count || warning_count != last_warning_count) {
-
- if (error_count == 0 && warning_count == 0) {
- errors_tab->set_name(TTR("Errors"));
- debugger_button->set_text(TTR("Debugger"));
- debugger_button->set_icon(Ref<Texture>());
- tabs->set_tab_icon(errors_tab->get_index(), Ref<Texture>());
- } else {
- errors_tab->set_name(TTR("Errors") + " (" + itos(error_count + warning_count) + ")");
- debugger_button->set_text(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")");
- if (error_count == 0) {
- debugger_button->set_icon(get_icon("Warning", "EditorIcons"));
- tabs->set_tab_icon(errors_tab->get_index(), get_icon("Warning", "EditorIcons"));
- } else {
- debugger_button->set_icon(get_icon("Error", "EditorIcons"));
- tabs->set_tab_icon(errors_tab->get_index(), get_icon("Error", "EditorIcons"));
- }
- }
- last_error_count = error_count;
- last_warning_count = warning_count;
- }
-
- if (server->is_connection_available()) {
- if (connection.is_valid()) {
- // We already have a valid connection. Disconnecting any new connecting client to prevent it from hanging.
- // (If we don't keep a reference to the connection it will be destroyed and disconnect_from_host will be called internally)
- server->take_connection();
- } else {
- // We just got the first connection.
- connection = server->take_connection();
- if (connection.is_null())
- break;
-
- EditorNode::get_log()->add_message("--- Debugging process started ---", EditorLog::MSG_TYPE_EDITOR);
-
- ppeer->set_stream_peer(connection);
-
- //EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
- //emit_signal("show_debugger",true);
-
- dobreak->set_disabled(false);
- tabs->set_current_tab(0);
-
- _set_reason_text(TTR("Child process connected."), MESSAGE_SUCCESS);
- profiler->clear();
-
- inspect_scene_tree->clear();
- le_set->set_disabled(true);
- le_clear->set_disabled(false);
- vmem_refresh->set_disabled(false);
- error_tree->clear();
- error_count = 0;
- warning_count = 0;
- profiler_signature.clear();
- //live_edit_root->set_text("/root");
-
- EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
- EditorNode::get_singleton()->get_pause_button()->set_disabled(false);
-
- update_live_edit_root();
- if (profiler->is_profiling()) {
- _profiler_activate(true);
- }
-
- if (network_profiler->is_profiling()) {
- _network_profiler_activate(true);
- }
- }
- }
-
- if (connection.is_null())
- break;
-
- if (!connection->is_connected_to_host()) {
- stop();
- editor->notify_child_process_exited(); //somehow, exited
- break;
- };
-
- if (ppeer->get_available_packet_count() <= 0) {
- break;
- };
-
- const uint64_t until = OS::get_singleton()->get_ticks_msec() + 20;
-
- while (ppeer->get_available_packet_count() > 0) {
-
- if (pending_in_queue) {
-
- int todo = MIN(ppeer->get_available_packet_count(), pending_in_queue);
-
- for (int i = 0; i < todo; i++) {
-
- Variant cmd;
- Error ret = ppeer->get_var(cmd);
- if (ret != OK) {
- stop();
- ERR_FAIL_COND(ret != OK);
- }
-
- message.push_back(cmd);
- pending_in_queue--;
- }
-
- if (pending_in_queue == 0) {
- _parse_message(message_type, message);
- message.clear();
- }
-
- } else {
-
- if (ppeer->get_available_packet_count() >= 2) {
-
- Variant cmd;
- Error ret = ppeer->get_var(cmd);
- if (ret != OK) {
- stop();
- ERR_FAIL_COND(ret != OK);
- }
- if (cmd.get_type() != Variant::STRING) {
- stop();
- ERR_FAIL_COND(cmd.get_type() != Variant::STRING);
- }
-
- message_type = cmd;
-
- ret = ppeer->get_var(cmd);
- if (ret != OK) {
- stop();
- ERR_FAIL_COND(ret != OK);
- }
- if (cmd.get_type() != Variant::INT) {
- stop();
- ERR_FAIL_COND(cmd.get_type() != Variant::INT);
- }
-
- pending_in_queue = cmd;
-
- if (pending_in_queue == 0) {
- _parse_message(message_type, Array());
- message.clear();
- }
-
- } else {
-
- break;
- }
- }
-
- if (OS::get_singleton()->get_ticks_msec() > until)
- break;
- }
- } break;
- case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-
- add_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT));
- add_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT));
-
- tabs->add_style_override("panel", editor->get_gui_base()->get_stylebox("DebuggerPanel", "EditorStyles"));
- tabs->add_style_override("tab_fg", editor->get_gui_base()->get_stylebox("DebuggerTabFG", "EditorStyles"));
- tabs->add_style_override("tab_bg", editor->get_gui_base()->get_stylebox("DebuggerTabBG", "EditorStyles"));
-
- copy->set_icon(get_icon("ActionCopy", "EditorIcons"));
- step->set_icon(get_icon("DebugStep", "EditorIcons"));
- next->set_icon(get_icon("DebugNext", "EditorIcons"));
- back->set_icon(get_icon("Back", "EditorIcons"));
- forward->set_icon(get_icon("Forward", "EditorIcons"));
- dobreak->set_icon(get_icon("Pause", "EditorIcons"));
- docontinue->set_icon(get_icon("DebugContinue", "EditorIcons"));
- vmem_refresh->set_icon(get_icon("Reload", "EditorIcons"));
- } break;
- }
-}
-
-void ScriptEditorDebugger::_clear_execution() {
- TreeItem *ti = stack_dump->get_selected();
- if (!ti)
- return;
-
- Dictionary d = ti->get_metadata(0);
-
- stack_script = ResourceLoader::load(d["file"]);
- emit_signal("clear_execution", stack_script);
- stack_script.unref();
-}
-
-void ScriptEditorDebugger::start() {
-
- stop();
-
- if (is_visible_in_tree()) {
- EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
- }
-
- perf_history.clear();
- for (int i = 0; i < Performance::MONITOR_MAX; i++) {
-
- perf_max.write[i] = 0;
- }
-
- int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
- if (server->listen(remote_port) != OK) {
- EditorNode::get_log()->add_message(String("Error listening on port ") + itos(remote_port), EditorLog::MSG_TYPE_ERROR);
- return;
- }
-
- EditorNode::get_singleton()->get_scene_tree_dock()->show_tab_buttons();
- auto_switch_remote_scene_tree = (bool)EditorSettings::get_singleton()->get("debugger/auto_switch_to_remote_scene_tree");
- if (auto_switch_remote_scene_tree) {
- EditorNode::get_singleton()->get_scene_tree_dock()->show_remote_tree();
- }
-
- set_process(true);
- breaked = false;
- camera_override = OVERRIDE_NONE;
-}
-
-void ScriptEditorDebugger::pause() {
-}
-
-void ScriptEditorDebugger::unpause() {
-}
-
-void ScriptEditorDebugger::stop() {
-
- set_process(false);
- breaked = false;
- _clear_execution();
-
- server->stop();
- _clear_remote_objects();
- ppeer->set_stream_peer(Ref<StreamPeer>());
-
- if (connection.is_valid()) {
- EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR);
- connection.unref();
-
- reason->set_text("");
- reason->set_tooltip("");
- }
-
- pending_in_queue = 0;
- message.clear();
-
- node_path_cache.clear();
- res_path_cache.clear();
- profiler_signature.clear();
- le_clear->set_disabled(false);
- le_set->set_disabled(true);
- profiler->set_enabled(true);
- vmem_refresh->set_disabled(true);
-
- inspect_scene_tree->clear();
- inspector->edit(NULL);
- EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
- EditorNode::get_singleton()->get_pause_button()->set_disabled(true);
- EditorNode::get_singleton()->get_scene_tree_dock()->hide_remote_tree();
- EditorNode::get_singleton()->get_scene_tree_dock()->hide_tab_buttons();
-
- if (hide_on_stop) {
- if (is_visible_in_tree())
- EditorNode::get_singleton()->hide_bottom_panel();
- emit_signal("show_debugger", false);
- }
-}
-
-void ScriptEditorDebugger::_profiler_activate(bool p_enable) {
-
- if (!connection.is_valid())
- return;
-
- if (p_enable) {
- profiler_signature.clear();
- Array msg;
- msg.push_back("start_profiling");
- int max_funcs = EditorSettings::get_singleton()->get("debugger/profiler_frame_max_functions");
- max_funcs = CLAMP(max_funcs, 16, 512);
- msg.push_back(max_funcs);
- ppeer->put_var(msg);
- print_verbose("Starting profiling.");
-
- } else {
- Array msg;
- msg.push_back("stop_profiling");
- ppeer->put_var(msg);
- print_verbose("Ending profiling.");
- }
-}
-
-void ScriptEditorDebugger::_network_profiler_activate(bool p_enable) {
-
- if (!connection.is_valid())
- return;
-
- if (p_enable) {
- Array msg;
- msg.push_back("start_network_profiling");
- ppeer->put_var(msg);
- print_verbose("Starting network profiling.");
-
- } else {
- Array msg;
- msg.push_back("stop_network_profiling");
- ppeer->put_var(msg);
- print_verbose("Ending network profiling.");
- }
-}
-
-void ScriptEditorDebugger::_profiler_seeked() {
-
- if (!connection.is_valid() || !connection->is_connected_to_host())
- return;
-
- if (breaked)
- return;
- debug_break();
-}
-
-void ScriptEditorDebugger::_stack_dump_frame_selected() {
-
- TreeItem *ti = stack_dump->get_selected();
- if (!ti)
- return;
-
- Dictionary d = ti->get_metadata(0);
-
- stack_script = ResourceLoader::load(d["file"]);
- emit_signal("goto_script_line", stack_script, int(d["line"]) - 1);
- emit_signal("set_execution", stack_script, int(d["line"]) - 1);
- stack_script.unref();
-
- if (connection.is_valid() && connection->is_connected_to_host()) {
- Array msg;
- msg.push_back("get_stack_frame_vars");
- msg.push_back(d["frame"]);
- ppeer->put_var(msg);
- } else {
- inspector->edit(NULL);
- }
-}
-
-void ScriptEditorDebugger::_output_clear() {
-
- //output->clear();
- //output->push_color(Color(0,0,0));
-}
-
-void ScriptEditorDebugger::_export_csv() {
-
- file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
- file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
- file_dialog_mode = SAVE_CSV;
- file_dialog->popup_centered_ratio();
-}
-
-String ScriptEditorDebugger::get_var_value(const String &p_var) const {
- if (!breaked)
- return String();
- return variables->get_var_value(p_var);
-}
-
-int ScriptEditorDebugger::_get_node_path_cache(const NodePath &p_path) {
-
- const int *r = node_path_cache.getptr(p_path);
- if (r)
- return *r;
-
- last_path_id++;
-
- node_path_cache[p_path] = last_path_id;
- Array msg;
- msg.push_back("live_node_path");
- msg.push_back(p_path);
- msg.push_back(last_path_id);
- ppeer->put_var(msg);
-
- return last_path_id;
-}
-
-int ScriptEditorDebugger::_get_res_path_cache(const String &p_path) {
-
- Map<String, int>::Element *E = res_path_cache.find(p_path);
-
- if (E)
- return E->get();
-
- last_path_id++;
-
- res_path_cache[p_path] = last_path_id;
- Array msg;
- msg.push_back("live_res_path");
- msg.push_back(p_path);
- msg.push_back(last_path_id);
- ppeer->put_var(msg);
-
- return last_path_id;
-}
-
-void ScriptEditorDebugger::_method_changed(Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE) {
-
- if (!p_base || !live_debug || !connection.is_valid() || !editor->get_edited_scene())
- return;
-
- Node *node = Object::cast_to<Node>(p_base);
-
- VARIANT_ARGPTRS
-
- for (int i = 0; i < VARIANT_ARG_MAX; i++) {
- //no pointers, sorry
- if (argptr[i] && (argptr[i]->get_type() == Variant::OBJECT || argptr[i]->get_type() == Variant::_RID))
- return;
- }
-
- if (node) {
-
- NodePath path = editor->get_edited_scene()->get_path_to(node);
- int pathid = _get_node_path_cache(path);
-
- Array msg;
- msg.push_back("live_node_call");
- msg.push_back(pathid);
- msg.push_back(p_name);
- for (int i = 0; i < VARIANT_ARG_MAX; i++) {
- //no pointers, sorry
- msg.push_back(*argptr[i]);
- }
- ppeer->put_var(msg);
-
- return;
- }
-
- Resource *res = Object::cast_to<Resource>(p_base);
-
- if (res && res->get_path() != String()) {
-
- String respath = res->get_path();
- int pathid = _get_res_path_cache(respath);
-
- Array msg;
- msg.push_back("live_res_call");
- msg.push_back(pathid);
- msg.push_back(p_name);
- for (int i = 0; i < VARIANT_ARG_MAX; i++) {
- //no pointers, sorry
- msg.push_back(*argptr[i]);
- }
- ppeer->put_var(msg);
-
- return;
- }
-}
-
-void ScriptEditorDebugger::_property_changed(Object *p_base, const StringName &p_property, const Variant &p_value) {
-
- if (!p_base || !live_debug || !connection.is_valid() || !editor->get_edited_scene())
- return;
-
- Node *node = Object::cast_to<Node>(p_base);
-
- if (node) {
-
- NodePath path = editor->get_edited_scene()->get_path_to(node);
- int pathid = _get_node_path_cache(path);
-
- if (p_value.is_ref()) {
- Ref<Resource> res = p_value;
- if (res.is_valid() && res->get_path() != String()) {
-
- Array msg;
- msg.push_back("live_node_prop_res");
- msg.push_back(pathid);
- msg.push_back(p_property);
- msg.push_back(res->get_path());
- ppeer->put_var(msg);
- }
- } else {
-
- Array msg;
- msg.push_back("live_node_prop");
- msg.push_back(pathid);
- msg.push_back(p_property);
- msg.push_back(p_value);
- ppeer->put_var(msg);
- }
-
- return;
- }
-
- Resource *res = Object::cast_to<Resource>(p_base);
-
- if (res && res->get_path() != String()) {
-
- String respath = res->get_path();
- int pathid = _get_res_path_cache(respath);
-
- if (p_value.is_ref()) {
- Ref<Resource> res2 = p_value;
- if (res2.is_valid() && res2->get_path() != String()) {
-
- Array msg;
- msg.push_back("live_res_prop_res");
- msg.push_back(pathid);
- msg.push_back(p_property);
- msg.push_back(res2->get_path());
- ppeer->put_var(msg);
- }
- } else {
-
- Array msg;
- msg.push_back("live_res_prop");
- msg.push_back(pathid);
- msg.push_back(p_property);
- msg.push_back(p_value);
- ppeer->put_var(msg);
- }
-
- return;
- }
-}
-
-void ScriptEditorDebugger::_method_changeds(void *p_ud, Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE) {
-
- ScriptEditorDebugger *sed = (ScriptEditorDebugger *)p_ud;
- sed->_method_changed(p_base, p_name, VARIANT_ARG_PASS);
-}
-
-void ScriptEditorDebugger::_property_changeds(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value) {
-
- ScriptEditorDebugger *sed = (ScriptEditorDebugger *)p_ud;
- sed->_property_changed(p_base, p_property, p_value);
-}
-
-void ScriptEditorDebugger::set_live_debugging(bool p_enable) {
-
- live_debug = p_enable;
-}
-
-void ScriptEditorDebugger::_live_edit_set() {
-
- if (!connection.is_valid())
- return;
-
- TreeItem *ti = inspect_scene_tree->get_selected();
- if (!ti)
- return;
- String path;
-
- while (ti) {
- String lp = ti->get_text(0);
- path = "/" + lp + path;
- ti = ti->get_parent();
- }
-
- NodePath np = path;
-
- editor->get_editor_data().set_edited_scene_live_edit_root(np);
-
- update_live_edit_root();
-}
-
-void ScriptEditorDebugger::_live_edit_clear() {
-
- NodePath np = NodePath("/root");
- editor->get_editor_data().set_edited_scene_live_edit_root(np);
-
- update_live_edit_root();
-}
-
-void ScriptEditorDebugger::update_live_edit_root() {
-
- NodePath np = editor->get_editor_data().get_edited_scene_live_edit_root();
-
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("live_set_root");
- msg.push_back(np);
- if (editor->get_edited_scene())
- msg.push_back(editor->get_edited_scene()->get_filename());
- else
- msg.push_back("");
- ppeer->put_var(msg);
- }
- live_edit_root->set_text(np);
-}
-
-void ScriptEditorDebugger::live_debug_create_node(const NodePath &p_parent, const String &p_type, const String &p_name) {
-
- if (live_debug && connection.is_valid()) {
- Array msg;
- msg.push_back("live_create_node");
- msg.push_back(p_parent);
- msg.push_back(p_type);
- msg.push_back(p_name);
- ppeer->put_var(msg);
- }
-}
-
-void ScriptEditorDebugger::live_debug_instance_node(const NodePath &p_parent, const String &p_path, const String &p_name) {
-
- if (live_debug && connection.is_valid()) {
- Array msg;
- msg.push_back("live_instance_node");
- msg.push_back(p_parent);
- msg.push_back(p_path);
- msg.push_back(p_name);
- ppeer->put_var(msg);
- }
-}
-void ScriptEditorDebugger::live_debug_remove_node(const NodePath &p_at) {
-
- if (live_debug && connection.is_valid()) {
- Array msg;
- msg.push_back("live_remove_node");
- msg.push_back(p_at);
- ppeer->put_var(msg);
- }
-}
-void ScriptEditorDebugger::live_debug_remove_and_keep_node(const NodePath &p_at, ObjectID p_keep_id) {
-
- if (live_debug && connection.is_valid()) {
- Array msg;
- msg.push_back("live_remove_and_keep_node");
- msg.push_back(p_at);
- msg.push_back(p_keep_id);
- ppeer->put_var(msg);
- }
-}
-void ScriptEditorDebugger::live_debug_restore_node(ObjectID p_id, const NodePath &p_at, int p_at_pos) {
-
- if (live_debug && connection.is_valid()) {
- Array msg;
- msg.push_back("live_restore_node");
- msg.push_back(p_id);
- msg.push_back(p_at);
- msg.push_back(p_at_pos);
- ppeer->put_var(msg);
- }
-}
-void ScriptEditorDebugger::live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name) {
-
- if (live_debug && connection.is_valid()) {
- Array msg;
- msg.push_back("live_duplicate_node");
- msg.push_back(p_at);
- msg.push_back(p_new_name);
- ppeer->put_var(msg);
- }
-}
-void ScriptEditorDebugger::live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos) {
-
- if (live_debug && connection.is_valid()) {
- Array msg;
- msg.push_back("live_reparent_node");
- msg.push_back(p_at);
- msg.push_back(p_new_place);
- msg.push_back(p_new_name);
- msg.push_back(p_at_pos);
- ppeer->put_var(msg);
- }
-}
-
-ScriptEditorDebugger::CameraOverride ScriptEditorDebugger::get_camera_override() const {
- return camera_override;
-}
-
-void ScriptEditorDebugger::set_camera_override(CameraOverride p_override) {
-
- if (p_override == OVERRIDE_2D && camera_override != OVERRIDE_2D) {
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("override_camera_2D:set");
- msg.push_back(true);
- ppeer->put_var(msg);
- }
- } else if (p_override != OVERRIDE_2D && camera_override == OVERRIDE_2D) {
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("override_camera_2D:set");
- msg.push_back(false);
- ppeer->put_var(msg);
- }
- } else if (p_override >= OVERRIDE_3D_1 && camera_override < OVERRIDE_3D_1) {
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("override_camera_3D:set");
- msg.push_back(true);
- ppeer->put_var(msg);
- }
- } else if (p_override < OVERRIDE_3D_1 && camera_override >= OVERRIDE_3D_1) {
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("override_camera_3D:set");
- msg.push_back(false);
- ppeer->put_var(msg);
- }
- }
-
- camera_override = p_override;
-}
-
-void ScriptEditorDebugger::set_breakpoint(const String &p_path, int p_line, bool p_enabled) {
-
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("breakpoint");
- msg.push_back(p_path);
- msg.push_back(p_line);
- msg.push_back(p_enabled);
- ppeer->put_var(msg);
- }
-}
-
-void ScriptEditorDebugger::reload_scripts() {
-
- if (connection.is_valid()) {
- Array msg;
- msg.push_back("reload_scripts");
- ppeer->put_var(msg);
- }
-}
-
-bool ScriptEditorDebugger::is_skip_breakpoints() {
- return skip_breakpoints_value;
-}
-
-void ScriptEditorDebugger::_error_activated() {
- TreeItem *selected = error_tree->get_selected();
-
- TreeItem *ci = selected->get_children();
- if (ci) {
- selected->set_collapsed(!selected->is_collapsed());
- }
-}
-
-void ScriptEditorDebugger::_error_selected() {
- TreeItem *selected = error_tree->get_selected();
-
- Array meta = selected->get_metadata(0);
-
- if (meta.size() == 0) {
- return;
- }
-
- Ref<Script> s = ResourceLoader::load(meta[0]);
- emit_signal("goto_script_line", s, int(meta[1]) - 1);
-}
-
-void ScriptEditorDebugger::_expand_errors_list() {
-
- TreeItem *root = error_tree->get_root();
- if (!root)
- return;
-
- TreeItem *item = root->get_children();
- while (item) {
- item->set_collapsed(false);
- item = item->get_next();
- }
-}
-
-void ScriptEditorDebugger::_collapse_errors_list() {
-
- TreeItem *root = error_tree->get_root();
- if (!root)
- return;
-
- TreeItem *item = root->get_children();
- while (item) {
- item->set_collapsed(true);
- item = item->get_next();
- }
-}
-
-void ScriptEditorDebugger::set_hide_on_stop(bool p_hide) {
-
- hide_on_stop = p_hide;
-}
-
-bool ScriptEditorDebugger::get_debug_with_external_editor() const {
-
- return enable_external_editor;
-}
-
-void ScriptEditorDebugger::set_debug_with_external_editor(bool p_enabled) {
-
- enable_external_editor = p_enabled;
-}
-
-Ref<Script> ScriptEditorDebugger::get_dump_stack_script() const {
-
- return stack_script;
-}
-
-void ScriptEditorDebugger::_paused() {
-
- ERR_FAIL_COND(connection.is_null());
- ERR_FAIL_COND(!connection->is_connected_to_host());
-
- if (!breaked && EditorNode::get_singleton()->get_pause_button()->is_pressed()) {
- debug_break();
- }
-
- if (breaked && !EditorNode::get_singleton()->get_pause_button()->is_pressed()) {
- debug_continue();
- }
-}
-
-void ScriptEditorDebugger::_set_remote_object(ObjectID p_id, ScriptEditorDebuggerInspectedObject *p_obj) {
-
- if (remote_objects.has(p_id))
- memdelete(remote_objects[p_id]);
- remote_objects[p_id] = p_obj;
-}
-
-void ScriptEditorDebugger::_clear_remote_objects() {
-
- for (Map<ObjectID, ScriptEditorDebuggerInspectedObject *>::Element *E = remote_objects.front(); E; E = E->next()) {
- if (editor->get_editor_history()->get_current() == E->value()->get_instance_id()) {
- editor->push_item(NULL);
- }
- memdelete(E->value());
- }
- remote_objects.clear();
-}
-
-void ScriptEditorDebugger::_clear_errors_list() {
-
- error_tree->clear();
- error_count = 0;
- warning_count = 0;
- _notification(NOTIFICATION_PROCESS);
-}
-
-// Right click on specific file(s) or folder(s).
-void ScriptEditorDebugger::_error_tree_item_rmb_selected(const Vector2 &p_pos) {
-
- item_menu->clear();
- item_menu->set_size(Size2(1, 1));
-
- if (error_tree->is_anything_selected()) {
- item_menu->add_icon_item(get_icon("ActionCopy", "EditorIcons"), TTR("Copy Error"), ITEM_MENU_COPY_ERROR);
- }
-
- if (item_menu->get_item_count() > 0) {
- item_menu->set_position(error_tree->get_global_position() + p_pos);
- item_menu->popup();
- }
-}
-
-void ScriptEditorDebugger::_item_menu_id_pressed(int p_option) {
-
- switch (p_option) {
-
- case ITEM_MENU_COPY_ERROR: {
- TreeItem *ti = error_tree->get_selected();
- while (ti->get_parent() != error_tree->get_root())
- ti = ti->get_parent();
-
- String type;
-
- if (ti->get_icon(0) == get_icon("Warning", "EditorIcons")) {
- type = "W ";
- } else if (ti->get_icon(0) == get_icon("Error", "EditorIcons")) {
- type = "E ";
- }
-
- String text = ti->get_text(0) + " ";
- int rpad_len = text.length();
-
- text = type + text + ti->get_text(1) + "\n";
- TreeItem *ci = ti->get_children();
- while (ci) {
- text += " " + ci->get_text(0).rpad(rpad_len) + ci->get_text(1) + "\n";
- ci = ci->get_next();
- }
-
- OS::get_singleton()->set_clipboard(text);
-
- } break;
- case ITEM_MENU_SAVE_REMOTE_NODE: {
-
- file_dialog->set_access(EditorFileDialog::ACCESS_RESOURCES);
- file_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE);
- file_dialog_mode = SAVE_NODE;
-
- List<String> extensions;
- Ref<PackedScene> sd = memnew(PackedScene);
- ResourceSaver::get_recognized_extensions(sd, &extensions);
- file_dialog->clear_filters();
- for (int i = 0; i < extensions.size(); i++) {
- file_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
- }
-
- file_dialog->popup_centered_ratio();
- } break;
- case ITEM_MENU_COPY_NODE_PATH: {
-
- TreeItem *ti = inspect_scene_tree->get_selected();
- String text = ti->get_text(0);
-
- if (ti->get_parent() == NULL) {
- text = ".";
- } else if (ti->get_parent()->get_parent() == NULL) {
- text = ".";
- } else {
- while (ti->get_parent()->get_parent() != inspect_scene_tree->get_root()) {
- ti = ti->get_parent();
- text = ti->get_text(0) + "/" + text;
- }
- }
-
- OS::get_singleton()->set_clipboard(text);
- } break;
- }
-}
-
-void ScriptEditorDebugger::_tab_changed(int p_tab) {
- if (tabs->get_tab_title(p_tab) == TTR("Video RAM")) {
- // "Video RAM" tab was clicked, refresh the data it's dislaying when entering the tab.
- _video_mem_request();
- }
-}
-
-void ScriptEditorDebugger::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_stack_dump_frame_selected"), &ScriptEditorDebugger::_stack_dump_frame_selected);
-
- ClassDB::bind_method(D_METHOD("debug_skip_breakpoints"), &ScriptEditorDebugger::debug_skip_breakpoints);
- ClassDB::bind_method(D_METHOD("debug_copy"), &ScriptEditorDebugger::debug_copy);
-
- ClassDB::bind_method(D_METHOD("debug_next"), &ScriptEditorDebugger::debug_next);
- ClassDB::bind_method(D_METHOD("debug_step"), &ScriptEditorDebugger::debug_step);
- ClassDB::bind_method(D_METHOD("debug_break"), &ScriptEditorDebugger::debug_break);
- ClassDB::bind_method(D_METHOD("debug_continue"), &ScriptEditorDebugger::debug_continue);
- ClassDB::bind_method(D_METHOD("_output_clear"), &ScriptEditorDebugger::_output_clear);
- ClassDB::bind_method(D_METHOD("_export_csv"), &ScriptEditorDebugger::_export_csv);
- ClassDB::bind_method(D_METHOD("_performance_draw"), &ScriptEditorDebugger::_performance_draw);
- ClassDB::bind_method(D_METHOD("_performance_select"), &ScriptEditorDebugger::_performance_select);
- ClassDB::bind_method(D_METHOD("_scene_tree_request"), &ScriptEditorDebugger::_scene_tree_request);
- ClassDB::bind_method(D_METHOD("_video_mem_request"), &ScriptEditorDebugger::_video_mem_request);
- ClassDB::bind_method(D_METHOD("_live_edit_set"), &ScriptEditorDebugger::_live_edit_set);
- ClassDB::bind_method(D_METHOD("_live_edit_clear"), &ScriptEditorDebugger::_live_edit_clear);
-
- ClassDB::bind_method(D_METHOD("_error_selected"), &ScriptEditorDebugger::_error_selected);
- ClassDB::bind_method(D_METHOD("_error_activated"), &ScriptEditorDebugger::_error_activated);
- ClassDB::bind_method(D_METHOD("_expand_errors_list"), &ScriptEditorDebugger::_expand_errors_list);
- ClassDB::bind_method(D_METHOD("_collapse_errors_list"), &ScriptEditorDebugger::_collapse_errors_list);
- ClassDB::bind_method(D_METHOD("_profiler_activate"), &ScriptEditorDebugger::_profiler_activate);
- ClassDB::bind_method(D_METHOD("_network_profiler_activate"), &ScriptEditorDebugger::_network_profiler_activate);
- ClassDB::bind_method(D_METHOD("_profiler_seeked"), &ScriptEditorDebugger::_profiler_seeked);
- ClassDB::bind_method(D_METHOD("_clear_errors_list"), &ScriptEditorDebugger::_clear_errors_list);
-
- ClassDB::bind_method(D_METHOD("_error_tree_item_rmb_selected"), &ScriptEditorDebugger::_error_tree_item_rmb_selected);
- ClassDB::bind_method(D_METHOD("_item_menu_id_pressed"), &ScriptEditorDebugger::_item_menu_id_pressed);
- ClassDB::bind_method(D_METHOD("_tab_changed"), &ScriptEditorDebugger::_tab_changed);
-
- ClassDB::bind_method(D_METHOD("_paused"), &ScriptEditorDebugger::_paused);
-
- ClassDB::bind_method(D_METHOD("_scene_tree_selected"), &ScriptEditorDebugger::_scene_tree_selected);
- ClassDB::bind_method(D_METHOD("_scene_tree_folded"), &ScriptEditorDebugger::_scene_tree_folded);
- ClassDB::bind_method(D_METHOD("_scene_tree_rmb_selected"), &ScriptEditorDebugger::_scene_tree_rmb_selected);
- ClassDB::bind_method(D_METHOD("_file_selected"), &ScriptEditorDebugger::_file_selected);
-
- ClassDB::bind_method(D_METHOD("live_debug_create_node"), &ScriptEditorDebugger::live_debug_create_node);
- ClassDB::bind_method(D_METHOD("live_debug_instance_node"), &ScriptEditorDebugger::live_debug_instance_node);
- ClassDB::bind_method(D_METHOD("live_debug_remove_node"), &ScriptEditorDebugger::live_debug_remove_node);
- ClassDB::bind_method(D_METHOD("live_debug_remove_and_keep_node"), &ScriptEditorDebugger::live_debug_remove_and_keep_node);
- ClassDB::bind_method(D_METHOD("live_debug_restore_node"), &ScriptEditorDebugger::live_debug_restore_node);
- ClassDB::bind_method(D_METHOD("live_debug_duplicate_node"), &ScriptEditorDebugger::live_debug_duplicate_node);
- ClassDB::bind_method(D_METHOD("live_debug_reparent_node"), &ScriptEditorDebugger::live_debug_reparent_node);
- ClassDB::bind_method(D_METHOD("_scene_tree_property_select_object"), &ScriptEditorDebugger::_scene_tree_property_select_object);
- ClassDB::bind_method(D_METHOD("_scene_tree_property_value_edited"), &ScriptEditorDebugger::_scene_tree_property_value_edited);
-
- ADD_SIGNAL(MethodInfo("goto_script_line"));
- ADD_SIGNAL(MethodInfo("set_execution", PropertyInfo("script"), PropertyInfo(Variant::INT, "line")));
- ADD_SIGNAL(MethodInfo("clear_execution", PropertyInfo("script")));
- ADD_SIGNAL(MethodInfo("breaked", PropertyInfo(Variant::BOOL, "reallydid"), PropertyInfo(Variant::BOOL, "can_debug")));
- ADD_SIGNAL(MethodInfo("show_debugger", PropertyInfo(Variant::BOOL, "reallydid")));
-}
-
-ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
-
- add_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT));
- add_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT));
-
- ppeer = Ref<PacketPeerStream>(memnew(PacketPeerStream));
- ppeer->set_input_buffer_max_size((1024 * 1024 * 8) - 4); // 8 MiB should be enough, minus 4 bytes for separator.
- editor = p_editor;
- editor->get_inspector()->connect("object_id_selected", this, "_scene_tree_property_select_object");
-
- tabs = memnew(TabContainer);
- tabs->set_tab_align(TabContainer::ALIGN_LEFT);
- tabs->add_style_override("panel", editor->get_gui_base()->get_stylebox("DebuggerPanel", "EditorStyles"));
- tabs->add_style_override("tab_fg", editor->get_gui_base()->get_stylebox("DebuggerTabFG", "EditorStyles"));
- tabs->add_style_override("tab_bg", editor->get_gui_base()->get_stylebox("DebuggerTabBG", "EditorStyles"));
- tabs->connect("tab_changed", this, "_tab_changed");
-
- add_child(tabs);
-
- { //debugger
- VBoxContainer *vbc = memnew(VBoxContainer);
- vbc->set_name(TTR("Debugger"));
- Control *dbg = vbc;
-
- HBoxContainer *hbc = memnew(HBoxContainer);
- vbc->add_child(hbc);
-
- reason = memnew(Label);
- reason->set_text("");
- hbc->add_child(reason);
- reason->set_h_size_flags(SIZE_EXPAND_FILL);
- reason->set_autowrap(true);
- reason->set_max_lines_visible(3);
- reason->set_mouse_filter(Control::MOUSE_FILTER_PASS);
-
- hbc->add_child(memnew(VSeparator));
-
- skip_breakpoints = memnew(ToolButton);
- hbc->add_child(skip_breakpoints);
- skip_breakpoints->set_tooltip(TTR("Skip Breakpoints"));
- skip_breakpoints->connect("pressed", this, "debug_skip_breakpoints");
-
- hbc->add_child(memnew(VSeparator));
-
- copy = memnew(ToolButton);
- hbc->add_child(copy);
- copy->set_tooltip(TTR("Copy Error"));
- copy->connect("pressed", this, "debug_copy");
-
- hbc->add_child(memnew(VSeparator));
-
- step = memnew(ToolButton);
- hbc->add_child(step);
- step->set_tooltip(TTR("Step Into"));
- step->set_shortcut(ED_GET_SHORTCUT("debugger/step_into"));
- step->connect("pressed", this, "debug_step");
-
- next = memnew(ToolButton);
- hbc->add_child(next);
- next->set_tooltip(TTR("Step Over"));
- next->set_shortcut(ED_GET_SHORTCUT("debugger/step_over"));
- next->connect("pressed", this, "debug_next");
-
- hbc->add_child(memnew(VSeparator));
-
- dobreak = memnew(ToolButton);
- hbc->add_child(dobreak);
- dobreak->set_tooltip(TTR("Break"));
- dobreak->set_shortcut(ED_GET_SHORTCUT("debugger/break"));
- dobreak->connect("pressed", this, "debug_break");
-
- docontinue = memnew(ToolButton);
- hbc->add_child(docontinue);
- docontinue->set_tooltip(TTR("Continue"));
- docontinue->set_shortcut(ED_GET_SHORTCUT("debugger/continue"));
- docontinue->connect("pressed", this, "debug_continue");
-
- back = memnew(Button);
- hbc->add_child(back);
- back->set_tooltip(TTR("Inspect Previous Instance"));
- back->hide();
-
- forward = memnew(Button);
- hbc->add_child(forward);
- forward->set_tooltip(TTR("Inspect Next Instance"));
- forward->hide();
-
- HSplitContainer *sc = memnew(HSplitContainer);
- vbc->add_child(sc);
- sc->set_v_size_flags(SIZE_EXPAND_FILL);
-
- stack_dump = memnew(Tree);
- stack_dump->set_allow_reselect(true);
- stack_dump->set_columns(1);
- stack_dump->set_column_titles_visible(true);
- stack_dump->set_column_title(0, TTR("Stack Frames"));
- stack_dump->set_h_size_flags(SIZE_EXPAND_FILL);
- stack_dump->set_hide_root(true);
- stack_dump->connect("cell_selected", this, "_stack_dump_frame_selected");
- sc->add_child(stack_dump);
-
- inspector = memnew(EditorInspector);
- inspector->set_h_size_flags(SIZE_EXPAND_FILL);
- inspector->set_enable_capitalize_paths(false);
- inspector->set_read_only(true);
- inspector->connect("object_id_selected", this, "_scene_tree_property_select_object");
- sc->add_child(inspector);
-
- server.instance();
-
- pending_in_queue = 0;
-
- variables = memnew(ScriptEditorDebuggerVariables);
-
- breaked = false;
-
- tabs->add_child(dbg);
- }
-
- { //errors
- errors_tab = memnew(VBoxContainer);
- errors_tab->set_name(TTR("Errors"));
-
- HBoxContainer *errhb = memnew(HBoxContainer);
- errors_tab->add_child(errhb);
-
- Button *expand_all = memnew(Button);
- expand_all->set_text(TTR("Expand All"));
- expand_all->connect("pressed", this, "_expand_errors_list");
- errhb->add_child(expand_all);
-
- Button *collapse_all = memnew(Button);
- collapse_all->set_text(TTR("Collapse All"));
- collapse_all->connect("pressed", this, "_collapse_errors_list");
- errhb->add_child(collapse_all);
-
- Control *space = memnew(Control);
- space->set_h_size_flags(SIZE_EXPAND_FILL);
- errhb->add_child(space);
-
- clearbutton = memnew(Button);
- clearbutton->set_text(TTR("Clear"));
- clearbutton->set_h_size_flags(0);
- clearbutton->connect("pressed", this, "_clear_errors_list");
- errhb->add_child(clearbutton);
-
- error_tree = memnew(Tree);
- error_tree->set_columns(2);
-
- error_tree->set_column_expand(0, false);
- error_tree->set_column_min_width(0, 140);
-
- error_tree->set_column_expand(1, true);
-
- error_tree->set_select_mode(Tree::SELECT_ROW);
- error_tree->set_hide_root(true);
- error_tree->set_v_size_flags(SIZE_EXPAND_FILL);
- error_tree->set_allow_rmb_select(true);
- error_tree->connect("item_rmb_selected", this, "_error_tree_item_rmb_selected");
- errors_tab->add_child(error_tree);
-
- item_menu = memnew(PopupMenu);
- item_menu->connect("id_pressed", this, "_item_menu_id_pressed");
- error_tree->add_child(item_menu);
-
- tabs->add_child(errors_tab);
- }
-
- { // remote scene tree
-
- inspect_scene_tree = memnew(Tree);
- EditorNode::get_singleton()->get_scene_tree_dock()->add_remote_tree_editor(inspect_scene_tree);
- EditorNode::get_singleton()->get_scene_tree_dock()->connect("remote_tree_selected", this, "_scene_tree_selected");
- inspect_scene_tree->set_v_size_flags(SIZE_EXPAND_FILL);
- inspect_scene_tree->connect("cell_selected", this, "_scene_tree_selected");
- inspect_scene_tree->connect("item_collapsed", this, "_scene_tree_folded");
- inspect_scene_tree->set_allow_rmb_select(true);
- inspect_scene_tree->connect("item_rmb_selected", this, "_scene_tree_rmb_selected");
- auto_switch_remote_scene_tree = EDITOR_DEF("debugger/auto_switch_to_remote_scene_tree", false);
- inspect_scene_tree_timeout = EDITOR_DEF("debugger/remote_scene_tree_refresh_interval", 1.0);
- inspect_edited_object_timeout = EDITOR_DEF("debugger/remote_inspect_refresh_interval", 0.2);
- inspected_object_id = 0;
- updating_scene_tree = false;
- }
-
- { // File dialog
- file_dialog = memnew(EditorFileDialog);
- file_dialog->connect("file_selected", this, "_file_selected");
- add_child(file_dialog);
- }
-
- { //profiler
- profiler = memnew(EditorProfiler);
- profiler->set_name(TTR("Profiler"));
- tabs->add_child(profiler);
- profiler->connect("enable_profiling", this, "_profiler_activate");
- profiler->connect("break_request", this, "_profiler_seeked");
- }
-
- { //network profiler
- network_profiler = memnew(EditorNetworkProfiler);
- network_profiler->set_name(TTR("Network Profiler"));
- tabs->add_child(network_profiler);
- network_profiler->connect("enable_profiling", this, "_network_profiler_activate");
- }
-
- { //monitors
-
- HSplitContainer *hsp = memnew(HSplitContainer);
-
- perf_monitors = memnew(Tree);
- perf_monitors->set_columns(2);
- perf_monitors->set_column_title(0, TTR("Monitor"));
- perf_monitors->set_column_title(1, TTR("Value"));
- perf_monitors->set_column_titles_visible(true);
- perf_monitors->connect("item_edited", this, "_performance_select");
- hsp->add_child(perf_monitors);
-
- perf_draw = memnew(Control);
- perf_draw->set_clip_contents(true);
- perf_draw->connect("draw", this, "_performance_draw");
- hsp->add_child(perf_draw);
-
- hsp->set_name(TTR("Monitors"));
- hsp->set_split_offset(340 * EDSCALE);
- tabs->add_child(hsp);
- perf_max.resize(Performance::MONITOR_MAX);
-
- Map<String, TreeItem *> bases;
- TreeItem *root = perf_monitors->create_item();
- perf_monitors->set_hide_root(true);
- for (int i = 0; i < Performance::MONITOR_MAX; i++) {
-
- String n = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i));
- Performance::MonitorType mtype = Performance::get_singleton()->get_monitor_type(Performance::Monitor(i));
- String base = n.get_slice("/", 0);
- String name = n.get_slice("/", 1);
- if (!bases.has(base)) {
- TreeItem *b = perf_monitors->create_item(root);
- b->set_text(0, base.capitalize());
- b->set_editable(0, false);
- b->set_selectable(0, false);
- b->set_expand_right(0, true);
- bases[base] = b;
- }
-
- TreeItem *it = perf_monitors->create_item(bases[base]);
- it->set_metadata(1, mtype);
- it->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
- it->set_editable(0, true);
- it->set_selectable(0, false);
- it->set_selectable(1, false);
- it->set_text(0, name.capitalize());
- perf_items.push_back(it);
- perf_max.write[i] = 0;
- }
-
- info_message = memnew(Label);
- info_message->set_text(TTR("Pick one or more items from the list to display the graph."));
- info_message->set_valign(Label::VALIGN_CENTER);
- info_message->set_align(Label::ALIGN_CENTER);
- info_message->set_autowrap(true);
- info_message->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
- info_message->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE);
- perf_draw->add_child(info_message);
- }
-
- { //vmem inspect
- VBoxContainer *vmem_vb = memnew(VBoxContainer);
- HBoxContainer *vmem_hb = memnew(HBoxContainer);
- Label *vmlb = memnew(Label(TTR("List of Video Memory Usage by Resource:") + " "));
- vmlb->set_h_size_flags(SIZE_EXPAND_FILL);
- vmem_hb->add_child(vmlb);
- vmem_hb->add_child(memnew(Label(TTR("Total:") + " ")));
- vmem_total = memnew(LineEdit);
- vmem_total->set_editable(false);
- vmem_total->set_custom_minimum_size(Size2(100, 0) * EDSCALE);
- vmem_hb->add_child(vmem_total);
- vmem_refresh = memnew(ToolButton);
- vmem_refresh->set_disabled(true);
- vmem_hb->add_child(vmem_refresh);
- vmem_vb->add_child(vmem_hb);
- vmem_refresh->connect("pressed", this, "_video_mem_request");
-
- VBoxContainer *vmmc = memnew(VBoxContainer);
- vmem_tree = memnew(Tree);
- vmem_tree->set_v_size_flags(SIZE_EXPAND_FILL);
- vmem_tree->set_h_size_flags(SIZE_EXPAND_FILL);
- vmmc->add_child(vmem_tree);
- vmmc->set_v_size_flags(SIZE_EXPAND_FILL);
- vmem_vb->add_child(vmmc);
-
- vmem_vb->set_name(TTR("Video RAM"));
- vmem_tree->set_columns(4);
- vmem_tree->set_column_titles_visible(true);
- vmem_tree->set_column_title(0, TTR("Resource Path"));
- vmem_tree->set_column_expand(0, true);
- vmem_tree->set_column_expand(1, false);
- vmem_tree->set_column_title(1, TTR("Type"));
- vmem_tree->set_column_min_width(1, 100 * EDSCALE);
- vmem_tree->set_column_expand(2, false);
- vmem_tree->set_column_title(2, TTR("Format"));
- vmem_tree->set_column_min_width(2, 150 * EDSCALE);
- vmem_tree->set_column_expand(3, false);
- vmem_tree->set_column_title(3, TTR("Usage"));
- vmem_tree->set_column_min_width(3, 80 * EDSCALE);
- vmem_tree->set_hide_root(true);
-
- tabs->add_child(vmem_vb);
- }
-
- { // misc
- VBoxContainer *misc = memnew(VBoxContainer);
- misc->set_name(TTR("Misc"));
- tabs->add_child(misc);
-
- GridContainer *info_left = memnew(GridContainer);
- info_left->set_columns(2);
- misc->add_child(info_left);
- clicked_ctrl = memnew(LineEdit);
- clicked_ctrl->set_h_size_flags(SIZE_EXPAND_FILL);
- info_left->add_child(memnew(Label(TTR("Clicked Control:"))));
- info_left->add_child(clicked_ctrl);
- clicked_ctrl_type = memnew(LineEdit);
- info_left->add_child(memnew(Label(TTR("Clicked Control Type:"))));
- info_left->add_child(clicked_ctrl_type);
-
- live_edit_root = memnew(LineEdit);
- live_edit_root->set_h_size_flags(SIZE_EXPAND_FILL);
-
- {
- HBoxContainer *lehb = memnew(HBoxContainer);
- Label *l = memnew(Label(TTR("Live Edit Root:")));
- info_left->add_child(l);
- lehb->add_child(live_edit_root);
- le_set = memnew(Button(TTR("Set From Tree")));
- lehb->add_child(le_set);
- le_clear = memnew(Button(TTR("Clear")));
- lehb->add_child(le_clear);
- info_left->add_child(lehb);
- le_set->set_disabled(true);
- le_clear->set_disabled(true);
- }
-
- misc->add_child(memnew(VSeparator));
-
- HBoxContainer *buttons = memnew(HBoxContainer);
-
- export_csv = memnew(Button(TTR("Export measures as CSV")));
- export_csv->connect("pressed", this, "_export_csv");
- buttons->add_child(export_csv);
-
- misc->add_child(buttons);
- }
-
- msgdialog = memnew(AcceptDialog);
- add_child(msgdialog);
-
- p_editor->get_undo_redo()->set_method_notify_callback(_method_changeds, this);
- p_editor->get_undo_redo()->set_property_notify_callback(_property_changeds, this);
- live_debug = true;
- camera_override = OVERRIDE_NONE;
- last_path_id = false;
- error_count = 0;
- warning_count = 0;
- hide_on_stop = true;
- enable_external_editor = false;
- last_error_count = 0;
- last_warning_count = 0;
-
- EditorNode::get_singleton()->get_pause_button()->connect("pressed", this, "_paused");
-}
-
-ScriptEditorDebugger::~ScriptEditorDebugger() {
-
- memdelete(variables);
-
- ppeer->set_stream_peer(Ref<StreamPeer>());
-
- server->stop();
- _clear_remote_objects();
-}
diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h
deleted file mode 100644
index 589a011bff..0000000000
--- a/editor/script_editor_debugger.h
+++ /dev/null
@@ -1,293 +0,0 @@
-/*************************************************************************/
-/* script_editor_debugger.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef SCRIPT_EDITOR_DEBUGGER_H
-#define SCRIPT_EDITOR_DEBUGGER_H
-
-#include "core/io/packet_peer.h"
-#include "core/io/tcp_server.h"
-#include "editor/editor_inspector.h"
-#include "editor/property_editor.h"
-#include "scene/3d/camera.h"
-#include "scene/gui/box_container.h"
-#include "scene/gui/button.h"
-
-class Tree;
-class EditorNode;
-class ScriptEditorDebuggerVariables;
-class LineEdit;
-class TabContainer;
-class RichTextLabel;
-class TextureButton;
-class AcceptDialog;
-class TreeItem;
-class HSplitContainer;
-class ItemList;
-class EditorProfiler;
-class EditorNetworkProfiler;
-
-class ScriptEditorDebuggerInspectedObject;
-
-class ScriptEditorDebugger : public MarginContainer {
-
- GDCLASS(ScriptEditorDebugger, MarginContainer);
-
-public:
- enum CameraOverride {
- OVERRIDE_NONE,
- OVERRIDE_2D,
- OVERRIDE_3D_1, // 3D Viewport 1
- OVERRIDE_3D_2, // 3D Viewport 2
- OVERRIDE_3D_3, // 3D Viewport 3
- OVERRIDE_3D_4 // 3D Viewport 4
- };
-
-private:
- enum MessageType {
- MESSAGE_ERROR,
- MESSAGE_WARNING,
- MESSAGE_SUCCESS,
- };
-
- enum ItemMenu {
- ITEM_MENU_COPY_ERROR,
- ITEM_MENU_SAVE_REMOTE_NODE,
- ITEM_MENU_COPY_NODE_PATH,
- };
-
- AcceptDialog *msgdialog;
-
- Button *debugger_button;
-
- LineEdit *clicked_ctrl;
- LineEdit *clicked_ctrl_type;
- LineEdit *live_edit_root;
- Button *le_set;
- Button *le_clear;
- Button *export_csv;
-
- bool updating_scene_tree;
- float inspect_scene_tree_timeout;
- float inspect_edited_object_timeout;
- bool auto_switch_remote_scene_tree;
- ObjectID inspected_object_id;
- ScriptEditorDebuggerVariables *variables;
- Map<ObjectID, ScriptEditorDebuggerInspectedObject *> remote_objects;
- Set<ObjectID> unfold_cache;
-
- VBoxContainer *errors_tab;
- Tree *error_tree;
- Tree *inspect_scene_tree;
- Button *clearbutton;
- PopupMenu *item_menu;
-
- EditorFileDialog *file_dialog;
- enum FileDialogMode {
- SAVE_CSV,
- SAVE_NODE,
- };
- FileDialogMode file_dialog_mode;
-
- int error_count;
- int warning_count;
- int last_error_count;
- int last_warning_count;
-
- bool hide_on_stop;
- bool enable_external_editor;
-
- bool skip_breakpoints_value = false;
- Ref<Script> stack_script;
-
- TabContainer *tabs;
-
- Label *reason;
-
- Button *skip_breakpoints;
- Button *copy;
- Button *step;
- Button *next;
- Button *back;
- Button *forward;
- Button *dobreak;
- Button *docontinue;
-
- List<Vector<float> > perf_history;
- Vector<float> perf_max;
- Vector<TreeItem *> perf_items;
-
- Map<int, String> profiler_signature;
-
- Tree *perf_monitors;
- Control *perf_draw;
- Label *info_message;
-
- Tree *vmem_tree;
- Button *vmem_refresh;
- LineEdit *vmem_total;
-
- Tree *stack_dump;
- EditorInspector *inspector;
-
- Ref<TCP_Server> server;
- Ref<StreamPeerTCP> connection;
- Ref<PacketPeerStream> ppeer;
-
- String message_type;
- Array message;
- int pending_in_queue;
-
- HashMap<NodePath, int> node_path_cache;
- int last_path_id;
- Map<String, int> res_path_cache;
-
- EditorProfiler *profiler;
- EditorNetworkProfiler *network_profiler;
-
- EditorNode *editor;
-
- bool breaked;
-
- bool live_debug;
-
- CameraOverride camera_override;
-
- void _performance_draw();
- void _performance_select();
- void _stack_dump_frame_selected();
- void _output_clear();
-
- void _scene_tree_folded(Object *obj);
- void _scene_tree_selected();
- void _scene_tree_rmb_selected(const Vector2 &p_position);
- void _file_selected(const String &p_file);
- void _scene_tree_request();
- void _parse_message(const String &p_msg, const Array &p_data);
- void _set_reason_text(const String &p_reason, MessageType p_type);
- void _scene_tree_property_select_object(ObjectID p_object);
- void _scene_tree_property_value_edited(const String &p_prop, const Variant &p_value);
- int _update_scene_tree(TreeItem *parent, const Array &nodes, int current_index);
-
- void _video_mem_request();
-
- int _get_node_path_cache(const NodePath &p_path);
-
- int _get_res_path_cache(const String &p_path);
-
- void _live_edit_set();
- void _live_edit_clear();
-
- void _method_changed(Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE);
- void _property_changed(Object *p_base, const StringName &p_property, const Variant &p_value);
-
- void _error_activated();
- void _error_selected();
-
- void _expand_errors_list();
- void _collapse_errors_list();
-
- void _profiler_activate(bool p_enable);
- void _profiler_seeked();
-
- void _network_profiler_activate(bool p_enable);
-
- void _paused();
-
- void _set_remote_object(ObjectID p_id, ScriptEditorDebuggerInspectedObject *p_obj);
- void _clear_remote_objects();
- void _clear_errors_list();
-
- void _error_tree_item_rmb_selected(const Vector2 &p_pos);
- void _item_menu_id_pressed(int p_option);
- void _tab_changed(int p_tab);
-
- void _export_csv();
-
- void _clear_execution();
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void start();
- void pause();
- void unpause();
- void stop();
-
- void debug_skip_breakpoints();
- void debug_copy();
-
- void debug_next();
- void debug_step();
- void debug_break();
- void debug_continue();
-
- String get_var_value(const String &p_var) const;
-
- void set_live_debugging(bool p_enable);
-
- static void _method_changeds(void *p_ud, Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE);
- static void _property_changeds(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value);
-
- void live_debug_create_node(const NodePath &p_parent, const String &p_type, const String &p_name);
- void live_debug_instance_node(const NodePath &p_parent, const String &p_path, const String &p_name);
- void live_debug_remove_node(const NodePath &p_at);
- void live_debug_remove_and_keep_node(const NodePath &p_at, ObjectID p_keep_id);
- void live_debug_restore_node(ObjectID p_id, const NodePath &p_at, int p_at_pos);
- void live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name);
- void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos);
-
- CameraOverride get_camera_override() const;
- void set_camera_override(CameraOverride p_override);
-
- void set_breakpoint(const String &p_path, int p_line, bool p_enabled);
-
- void update_live_edit_root();
-
- void set_hide_on_stop(bool p_hide);
-
- bool get_debug_with_external_editor() const;
- void set_debug_with_external_editor(bool p_enabled);
-
- Ref<Script> get_dump_stack_script() const;
-
- void set_tool_button(Button *p_tb) { debugger_button = p_tb; }
-
- void reload_scripts();
-
- bool is_skip_breakpoints();
-
- virtual Size2 get_minimum_size() const;
- ScriptEditorDebugger(EditorNode *p_editor = NULL);
- ~ScriptEditorDebugger();
-};
-
-#endif // SCRIPT_EDITOR_DEBUGGER_H
diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp
index 44962323e5..5da682a148 100644
--- a/editor/settings_config_dialog.cpp
+++ b/editor/settings_config_dialog.cpp
@@ -32,30 +32,28 @@
#include "core/os/keyboard.h"
#include "core/project_settings.h"
+#include "editor/debugger/editor_debugger_node.h"
#include "editor_file_system.h"
#include "editor_log.h"
#include "editor_node.h"
#include "editor_scale.h"
#include "editor_settings.h"
#include "scene/gui/margin_container.h"
-#include "script_editor_debugger.h"
void EditorSettingsDialog::ok_pressed() {
-
- if (!EditorSettings::get_singleton())
+ if (!EditorSettings::get_singleton()) {
return;
+ }
_settings_save();
timer->stop();
}
void EditorSettingsDialog::_settings_changed() {
-
timer->start();
}
void EditorSettingsDialog::_settings_property_edited(const String &p_name) {
-
String full_name = inspector->get_full_item_path(p_name);
if (full_name == "interface/theme/accent_color" || full_name == "interface/theme/base_color" || full_name == "interface/theme/contrast") {
@@ -66,23 +64,22 @@ void EditorSettingsDialog::_settings_property_edited(const String &p_name) {
}
void EditorSettingsDialog::_settings_save() {
-
EditorSettings::get_singleton()->notify_changes();
EditorSettings::get_singleton()->save();
}
void EditorSettingsDialog::cancel_pressed() {
-
- if (!EditorSettings::get_singleton())
+ if (!EditorSettings::get_singleton()) {
return;
+ }
EditorSettings::get_singleton()->notify_changes();
}
void EditorSettingsDialog::popup_edit_settings() {
-
- if (!EditorSettings::get_singleton())
+ if (!EditorSettings::get_singleton()) {
return;
+ }
EditorSettings::get_singleton()->list_text_editor_themes(); // make sure we have an up to date list of themes
@@ -116,21 +113,21 @@ void EditorSettingsDialog::_undo_redo_callback(void *p_self, const String &p_nam
}
void EditorSettingsDialog::_notification(int p_what) {
-
switch (p_what) {
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (!is_visible()) {
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "editor_settings", Rect2(get_position(), get_size()));
+ set_process_unhandled_input(false);
+ }
+ } break;
case NOTIFICATION_READY: {
- ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger();
- undo_redo->set_method_notify_callback(sed->_method_changeds, sed);
- undo_redo->set_property_notify_callback(sed->_property_changeds, sed);
+ undo_redo->set_method_notify_callback(EditorDebuggerNode::_method_changeds, nullptr);
+ undo_redo->set_property_notify_callback(EditorDebuggerNode::_property_changeds, nullptr);
undo_redo->set_commit_notify_callback(_undo_redo_callback, this);
} break;
case NOTIFICATION_ENTER_TREE: {
_update_icons();
} break;
- case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "editor_settings", get_rect());
- set_process_unhandled_input(false);
- } break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
_update_icons();
// Update theme colors.
@@ -141,17 +138,16 @@ void EditorSettingsDialog::_notification(int p_what) {
}
void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
-
const Ref<InputEventKey> k = p_event;
- if (k.is_valid() && is_window_modal_on_top() && k->is_pressed()) {
-
+ if (k.is_valid() && k->is_pressed()) {
bool handled = false;
if (ED_IS_SHORTCUT("editor/undo", p_event)) {
String action = undo_redo->get_current_action_name();
- if (action != "")
+ if (action != "") {
EditorNode::get_log()->add_message("Undo: " + action, EditorLog::MSG_TYPE_EDITOR);
+ }
undo_redo->undo();
handled = true;
}
@@ -159,37 +155,36 @@ void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
if (ED_IS_SHORTCUT("editor/redo", p_event)) {
undo_redo->redo();
String action = undo_redo->get_current_action_name();
- if (action != "")
+ if (action != "") {
EditorNode::get_log()->add_message("Redo: " + action, EditorLog::MSG_TYPE_EDITOR);
+ }
handled = true;
}
- if (k->get_scancode_with_modifiers() == (KEY_MASK_CMD | KEY_F)) {
+ if (k->get_keycode_with_modifiers() == (KEY_MASK_CMD | KEY_F)) {
_focus_current_search_box();
handled = true;
}
if (handled) {
- accept_event();
+ set_input_as_handled();
}
}
}
void EditorSettingsDialog::_update_icons() {
-
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
+ search_box->set_right_icon(shortcuts->get_theme_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
- shortcut_search_box->set_right_icon(get_icon("Search", "EditorIcons"));
+ shortcut_search_box->set_right_icon(shortcuts->get_theme_icon("Search", "EditorIcons"));
shortcut_search_box->set_clear_button_enabled(true);
- restart_close_button->set_icon(get_icon("Close", "EditorIcons"));
- restart_container->add_style_override("panel", get_stylebox("bg", "Tree"));
- restart_icon->set_texture(get_icon("StatusWarning", "EditorIcons"));
- restart_label->add_color_override("font_color", get_color("warning_color", "Editor"));
+ restart_close_button->set_icon(shortcuts->get_theme_icon("Close", "EditorIcons"));
+ restart_container->add_theme_style_override("panel", shortcuts->get_theme_stylebox("bg", "Tree"));
+ restart_icon->set_texture(shortcuts->get_theme_icon("StatusWarning", "EditorIcons"));
+ restart_label->add_theme_color_override("font_color", shortcuts->get_theme_color("warning_color", "Editor"));
}
void EditorSettingsDialog::_update_shortcuts() {
-
Map<String, bool> collapsed;
if (shortcuts->get_root() && shortcuts->get_root()->get_children()) {
@@ -207,10 +202,10 @@ void EditorSettingsDialog::_update_shortcuts() {
Map<String, TreeItem *> sections;
for (List<String>::Element *E = slist.front(); E; E = E->next()) {
-
- Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(E->get());
- if (!sc->has_meta("original"))
+ Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(E->get());
+ if (!sc->has_meta("original")) {
continue;
+ }
Ref<InputEvent> original = sc->get_meta("original");
@@ -231,8 +226,8 @@ void EditorSettingsDialog::_update_shortcuts() {
}
sections[section_name] = section;
- section->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
- section->set_custom_bg_color(1, get_color("prop_subsection", "Editor"));
+ section->set_custom_bg_color(0, shortcuts->get_theme_color("prop_subsection", "Editor"));
+ section->set_custom_bg_color(1, shortcuts->get_theme_color("prop_subsection", "Editor"));
}
// Don't match unassigned shortcuts when searching for assigned keys in search results.
@@ -244,16 +239,16 @@ void EditorSettingsDialog::_update_shortcuts() {
item->set_text(1, sc->get_as_text());
if (!sc->is_shortcut(original) && !(sc->get_shortcut().is_null() && original.is_null())) {
- item->add_button(1, get_icon("Reload", "EditorIcons"), 2);
+ item->add_button(1, shortcuts->get_theme_icon("Reload", "EditorIcons"), 2);
}
if (sc->get_as_text() == "None") {
// Fade out unassigned shortcut labels for easier visual grepping.
- item->set_custom_color(1, get_color("font_color", "Label") * Color(1, 1, 1, 0.5));
+ item->set_custom_color(1, shortcuts->get_theme_color("font_color", "Label") * Color(1, 1, 1, 0.5));
}
- item->add_button(1, get_icon("Edit", "EditorIcons"), 0);
- item->add_button(1, get_icon("Close", "EditorIcons"), 1);
+ item->add_button(1, shortcuts->get_theme_icon("Edit", "EditorIcons"), 0);
+ item->add_button(1, shortcuts->get_theme_icon("Close", "EditorIcons"), 1);
item->set_tooltip(0, E->get());
item->set_metadata(0, E->get());
}
@@ -262,32 +257,32 @@ void EditorSettingsDialog::_update_shortcuts() {
// remove sections with no shortcuts
for (Map<String, TreeItem *>::Element *E = sections.front(); E; E = E->next()) {
TreeItem *section = E->get();
- if (section->get_children() == NULL) {
+ if (section->get_children() == nullptr) {
root->remove_child(section);
}
}
}
void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column, int p_idx) {
-
TreeItem *ti = Object::cast_to<TreeItem>(p_item);
ERR_FAIL_COND(!ti);
String item = ti->get_metadata(0);
- Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(item);
+ Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(item);
if (p_idx == 0) {
press_a_key_label->set_text(TTR("Press a Key..."));
last_wait_for_key = Ref<InputEventKey>();
press_a_key->popup_centered(Size2(250, 80) * EDSCALE);
- press_a_key->grab_focus();
- press_a_key->get_ok()->set_focus_mode(FOCUS_NONE);
- press_a_key->get_cancel()->set_focus_mode(FOCUS_NONE);
+ //press_a_key->grab_focus();
+ press_a_key->get_ok()->set_focus_mode(Control::FOCUS_NONE);
+ press_a_key->get_cancel()->set_focus_mode(Control::FOCUS_NONE);
shortcut_configured = item;
} else if (p_idx == 1) { //erase
- if (!sc.is_valid())
+ if (!sc.is_valid()) {
return; //pointless, there is nothing
+ }
undo_redo->create_action(TTR("Erase Shortcut"));
undo_redo->add_do_method(sc.ptr(), "set_shortcut", Ref<InputEvent>());
@@ -298,8 +293,9 @@ void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column
undo_redo->add_undo_method(this, "_settings_changed");
undo_redo->commit_action();
} else if (p_idx == 2) { //revert to original
- if (!sc.is_valid())
+ if (!sc.is_valid()) {
return; //pointless, there is nothing
+ }
Ref<InputEvent> original = sc->get_meta("original");
@@ -315,33 +311,31 @@ void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column
}
void EditorSettingsDialog::_wait_for_key(const Ref<InputEvent> &p_event) {
-
Ref<InputEventKey> k = p_event;
- if (k.is_valid() && k->is_pressed() && k->get_scancode() != 0) {
-
+ if (k.is_valid() && k->is_pressed() && k->get_keycode() != 0) {
last_wait_for_key = k;
- const String str = keycode_get_string(k->get_scancode_with_modifiers());
+ const String str = keycode_get_string(k->get_keycode_with_modifiers());
press_a_key_label->set_text(str);
- press_a_key->accept_event();
+ press_a_key->set_input_as_handled();
}
}
void EditorSettingsDialog::_press_a_key_confirm() {
-
- if (last_wait_for_key.is_null())
+ if (last_wait_for_key.is_null()) {
return;
+ }
Ref<InputEventKey> ie;
ie.instance();
- ie->set_scancode(last_wait_for_key->get_scancode());
+ ie->set_keycode(last_wait_for_key->get_keycode());
ie->set_shift(last_wait_for_key->get_shift());
ie->set_control(last_wait_for_key->get_control());
ie->set_alt(last_wait_for_key->get_alt());
ie->set_metakey(last_wait_for_key->get_metakey());
- Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(shortcut_configured);
+ Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(shortcut_configured);
undo_redo->create_action(TTR("Change Shortcut") + " '" + shortcut_configured + "'");
undo_redo->add_do_method(sc.ptr(), "set_shortcut", ie);
@@ -354,18 +348,17 @@ void EditorSettingsDialog::_press_a_key_confirm() {
}
void EditorSettingsDialog::_tabs_tab_changed(int p_tab) {
-
_focus_current_search_box();
}
void EditorSettingsDialog::_focus_current_search_box() {
-
Control *tab = tabs->get_current_tab_control();
- LineEdit *current_search_box = NULL;
- if (tab == tab_general)
+ LineEdit *current_search_box = nullptr;
+ if (tab == tab_general) {
current_search_box = search_box;
- else if (tab == tab_shortcuts)
+ } else if (tab == tab_shortcuts) {
current_search_box = shortcut_search_box;
+ }
if (current_search_box) {
current_search_box->grab_focus();
@@ -387,32 +380,18 @@ void EditorSettingsDialog::_editor_restart_close() {
}
void EditorSettingsDialog::_bind_methods() {
-
ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorSettingsDialog::_unhandled_input);
- ClassDB::bind_method(D_METHOD("_settings_save"), &EditorSettingsDialog::_settings_save);
- ClassDB::bind_method(D_METHOD("_settings_changed"), &EditorSettingsDialog::_settings_changed);
- ClassDB::bind_method(D_METHOD("_settings_property_edited"), &EditorSettingsDialog::_settings_property_edited);
- ClassDB::bind_method(D_METHOD("_shortcut_button_pressed"), &EditorSettingsDialog::_shortcut_button_pressed);
- ClassDB::bind_method(D_METHOD("_filter_shortcuts"), &EditorSettingsDialog::_filter_shortcuts);
ClassDB::bind_method(D_METHOD("_update_shortcuts"), &EditorSettingsDialog::_update_shortcuts);
- ClassDB::bind_method(D_METHOD("_press_a_key_confirm"), &EditorSettingsDialog::_press_a_key_confirm);
- ClassDB::bind_method(D_METHOD("_wait_for_key"), &EditorSettingsDialog::_wait_for_key);
- ClassDB::bind_method(D_METHOD("_tabs_tab_changed"), &EditorSettingsDialog::_tabs_tab_changed);
-
- ClassDB::bind_method(D_METHOD("_editor_restart_request"), &EditorSettingsDialog::_editor_restart_request);
- ClassDB::bind_method(D_METHOD("_editor_restart"), &EditorSettingsDialog::_editor_restart);
- ClassDB::bind_method(D_METHOD("_editor_restart_close"), &EditorSettingsDialog::_editor_restart_close);
}
EditorSettingsDialog::EditorSettingsDialog() {
-
set_title(TTR("Editor Settings"));
- set_resizable(true);
+
undo_redo = memnew(UndoRedo);
tabs = memnew(TabContainer);
tabs->set_tab_align(TabContainer::ALIGN_LEFT);
- tabs->connect("tab_changed", this, "_tabs_tab_changed");
+ tabs->connect("tab_changed", callable_mp(this, &EditorSettingsDialog::_tabs_tab_changed));
add_child(tabs);
// General Tab
@@ -426,6 +405,7 @@ EditorSettingsDialog::EditorSettingsDialog() {
tab_general->add_child(hbc);
search_box = memnew(LineEdit);
+ search_box->set_placeholder(TTR("Search"));
search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hbc->add_child(search_box);
@@ -435,26 +415,27 @@ EditorSettingsDialog::EditorSettingsDialog() {
inspector->set_v_size_flags(Control::SIZE_EXPAND_FILL);
inspector->get_inspector()->set_undo_redo(undo_redo);
tab_general->add_child(inspector);
- inspector->get_inspector()->connect("property_edited", this, "_settings_property_edited");
- inspector->get_inspector()->connect("restart_requested", this, "_editor_restart_request");
+ inspector->get_inspector()->connect("property_edited", callable_mp(this, &EditorSettingsDialog::_settings_property_edited));
+ inspector->get_inspector()->connect("restart_requested", callable_mp(this, &EditorSettingsDialog::_editor_restart_request));
restart_container = memnew(PanelContainer);
tab_general->add_child(restart_container);
HBoxContainer *restart_hb = memnew(HBoxContainer);
restart_container->add_child(restart_hb);
restart_icon = memnew(TextureRect);
- restart_icon->set_v_size_flags(SIZE_SHRINK_CENTER);
+ restart_icon->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
restart_hb->add_child(restart_icon);
restart_label = memnew(Label);
restart_label->set_text(TTR("The editor must be restarted for changes to take effect."));
restart_hb->add_child(restart_label);
restart_hb->add_spacer();
Button *restart_button = memnew(Button);
- restart_button->connect("pressed", this, "_editor_restart");
+ restart_button->connect("pressed", callable_mp(this, &EditorSettingsDialog::_editor_restart));
restart_hb->add_child(restart_button);
restart_button->set_text(TTR("Save & Restart"));
- restart_close_button = memnew(ToolButton);
- restart_close_button->connect("pressed", this, "_editor_restart_close");
+ restart_close_button = memnew(Button);
+ restart_close_button->set_flat(true);
+ restart_close_button->connect("pressed", callable_mp(this, &EditorSettingsDialog::_editor_restart_close));
restart_hb->add_child(restart_close_button);
restart_container->hide();
@@ -469,22 +450,23 @@ EditorSettingsDialog::EditorSettingsDialog() {
tab_shortcuts->add_child(hbc);
shortcut_search_box = memnew(LineEdit);
+ shortcut_search_box->set_placeholder(TTR("Search"));
shortcut_search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL);
hbc->add_child(shortcut_search_box);
- shortcut_search_box->connect("text_changed", this, "_filter_shortcuts");
+ shortcut_search_box->connect("text_changed", callable_mp(this, &EditorSettingsDialog::_filter_shortcuts));
shortcuts = memnew(Tree);
tab_shortcuts->add_child(shortcuts, true);
- shortcuts->set_v_size_flags(SIZE_EXPAND_FILL);
+ shortcuts->set_v_size_flags(Control::SIZE_EXPAND_FILL);
shortcuts->set_columns(2);
shortcuts->set_hide_root(true);
shortcuts->set_column_titles_visible(true);
shortcuts->set_column_title(0, TTR("Name"));
shortcuts->set_column_title(1, TTR("Binding"));
- shortcuts->connect("button_pressed", this, "_shortcut_button_pressed");
+ shortcuts->connect("button_pressed", callable_mp(this, &EditorSettingsDialog::_shortcut_button_pressed));
press_a_key = memnew(ConfirmationDialog);
- press_a_key->set_focus_mode(FOCUS_ALL);
+ //press_a_key->set_focus_mode(Control::FOCUS_ALL);
add_child(press_a_key);
Label *l = memnew(Label);
@@ -492,20 +474,20 @@ EditorSettingsDialog::EditorSettingsDialog() {
l->set_anchors_and_margins_preset(Control::PRESET_WIDE);
l->set_align(Label::ALIGN_CENTER);
l->set_margin(MARGIN_TOP, 20);
- l->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_BEGIN, 30);
+ l->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_BEGIN, 30);
press_a_key_label = l;
press_a_key->add_child(l);
- press_a_key->connect("gui_input", this, "_wait_for_key");
- press_a_key->connect("confirmed", this, "_press_a_key_confirm");
+ press_a_key->connect("window_input", callable_mp(this, &EditorSettingsDialog::_wait_for_key));
+ press_a_key->connect("confirmed", callable_mp(this, &EditorSettingsDialog::_press_a_key_confirm));
set_hide_on_ok(true);
timer = memnew(Timer);
timer->set_wait_time(1.5);
- timer->connect("timeout", this, "_settings_save");
+ timer->connect("timeout", callable_mp(this, &EditorSettingsDialog::_settings_save));
timer->set_one_shot(true);
add_child(timer);
- EditorSettings::get_singleton()->connect("settings_changed", this, "_settings_changed");
+ EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &EditorSettingsDialog::_settings_changed));
get_ok()->set_text(TTR("Close"));
updating = false;
diff --git a/editor/settings_config_dialog.h b/editor/settings_config_dialog.h
index 03dd18d23f..044519cb4d 100644
--- a/editor/settings_config_dialog.h
+++ b/editor/settings_config_dialog.h
@@ -38,10 +38,8 @@
#include "scene/gui/rich_text_label.h"
#include "scene/gui/tab_container.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class EditorSettingsDialog : public AcceptDialog {
-
GDCLASS(EditorSettingsDialog, AcceptDialog);
bool updating;
@@ -65,8 +63,8 @@ class EditorSettingsDialog : public AcceptDialog {
String shortcut_configured;
String shortcut_filter;
- virtual void cancel_pressed();
- virtual void ok_pressed();
+ virtual void cancel_pressed() override;
+ virtual void ok_pressed() override;
void _settings_changed();
void _settings_property_edited(const String &p_name);
@@ -95,7 +93,7 @@ class EditorSettingsDialog : public AcceptDialog {
Label *restart_label;
TextureRect *restart_icon;
PanelContainer *restart_container;
- ToolButton *restart_close_button;
+ Button *restart_close_button;
void _editor_restart_request();
void _editor_restart();
diff --git a/editor/shader_globals_editor.cpp b/editor/shader_globals_editor.cpp
new file mode 100644
index 0000000000..aa88b0ef39
--- /dev/null
+++ b/editor/shader_globals_editor.cpp
@@ -0,0 +1,479 @@
+/*************************************************************************/
+/* shader_globals_editor.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "shader_globals_editor.h"
+#include "editor_node.h"
+
+static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = {
+ "bool",
+ "bvec2",
+ "bvec3",
+ "bvec4",
+ "int",
+ "ivec2",
+ "ivec3",
+ "ivec4",
+ "rect2i",
+ "uint",
+ "uvec2",
+ "uvec3",
+ "uvec4",
+ "float",
+ "vec2",
+ "vec3",
+ "vec4",
+ "color",
+ "rect2",
+ "mat2",
+ "mat3",
+ "mat4",
+ "transform_2d",
+ "transform",
+ "sampler2D",
+ "sampler2DArray",
+ "sampler3D",
+ "samplerCube",
+};
+
+class ShaderGlobalsEditorInterface : public Object {
+ GDCLASS(ShaderGlobalsEditorInterface, Object)
+
+ void _var_changed() {
+ emit_signal("var_changed");
+ }
+
+protected:
+ static void _bind_methods() {
+ ClassDB::bind_method("_var_changed", &ShaderGlobalsEditorInterface::_var_changed);
+ ADD_SIGNAL(MethodInfo("var_changed"));
+ }
+
+ bool _set(const StringName &p_name, const Variant &p_value) {
+ Variant existing = RS::get_singleton()->global_variable_get(p_name);
+
+ if (existing.get_type() == Variant::NIL) {
+ return false;
+ }
+
+ UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
+
+ undo_redo->create_action("Set Shader Global Variable");
+ undo_redo->add_do_method(RS::get_singleton(), "global_variable_set", p_name, p_value);
+ undo_redo->add_undo_method(RS::get_singleton(), "global_variable_set", p_name, existing);
+ RS::GlobalVariableType type = RS::get_singleton()->global_variable_get_type(p_name);
+ Dictionary gv;
+ gv["type"] = global_var_type_names[type];
+ if (type >= RS::GLOBAL_VAR_TYPE_SAMPLER2D) {
+ RES res = p_value;
+ if (res.is_valid()) {
+ gv["value"] = res->get_path();
+ } else {
+ gv["value"] = "";
+ }
+ } else {
+ gv["value"] = p_value;
+ }
+
+ String path = "shader_globals/" + String(p_name);
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), path, gv);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), path, ProjectSettings::get_singleton()->get(path));
+ undo_redo->add_do_method(this, "_var_changed");
+ undo_redo->add_undo_method(this, "_var_changed");
+ block_update = true;
+ undo_redo->commit_action();
+ block_update = false;
+
+ print_line("all good?");
+ return true;
+ }
+
+ bool _get(const StringName &p_name, Variant &r_ret) const {
+ r_ret = RS::get_singleton()->global_variable_get(p_name);
+ return r_ret.get_type() != Variant::NIL;
+ }
+ void _get_property_list(List<PropertyInfo> *p_list) const {
+ Vector<StringName> variables;
+ variables = RS::get_singleton()->global_variable_get_list();
+ for (int i = 0; i < variables.size(); i++) {
+ PropertyInfo pinfo;
+ pinfo.name = variables[i];
+
+ switch (RS::get_singleton()->global_variable_get_type(variables[i])) {
+ case RS::GLOBAL_VAR_TYPE_BOOL: {
+ pinfo.type = Variant::BOOL;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_BVEC2: {
+ pinfo.type = Variant::INT;
+ pinfo.hint = PROPERTY_HINT_FLAGS;
+ pinfo.hint_string = "x,y";
+ } break;
+ case RS::GLOBAL_VAR_TYPE_BVEC3: {
+ pinfo.type = Variant::INT;
+ pinfo.hint = PROPERTY_HINT_FLAGS;
+ pinfo.hint_string = "x,y,z";
+ } break;
+ case RS::GLOBAL_VAR_TYPE_BVEC4: {
+ pinfo.type = Variant::INT;
+ pinfo.hint = PROPERTY_HINT_FLAGS;
+ pinfo.hint_string = "x,y,z,w";
+ } break;
+ case RS::GLOBAL_VAR_TYPE_INT: {
+ pinfo.type = Variant::INT;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_IVEC2: {
+ pinfo.type = Variant::VECTOR2I;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_IVEC3: {
+ pinfo.type = Variant::VECTOR3I;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_IVEC4: {
+ pinfo.type = Variant::PACKED_INT32_ARRAY;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_RECT2I: {
+ pinfo.type = Variant::RECT2I;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_UINT: {
+ pinfo.type = Variant::INT;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_UVEC2: {
+ pinfo.type = Variant::VECTOR2I;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_UVEC3: {
+ pinfo.type = Variant::VECTOR3I;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_UVEC4: {
+ pinfo.type = Variant::PACKED_INT32_ARRAY;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_FLOAT: {
+ pinfo.type = Variant::FLOAT;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_VEC2: {
+ pinfo.type = Variant::VECTOR2;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_VEC3: {
+ pinfo.type = Variant::VECTOR3;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_VEC4: {
+ pinfo.type = Variant::PLANE;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_RECT2: {
+ pinfo.type = Variant::RECT2;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_COLOR: {
+ pinfo.type = Variant::COLOR;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_MAT2: {
+ pinfo.type = Variant::PACKED_INT32_ARRAY;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_MAT3: {
+ pinfo.type = Variant::BASIS;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: {
+ pinfo.type = Variant::TRANSFORM2D;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_TRANSFORM: {
+ pinfo.type = Variant::TRANSFORM;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_MAT4: {
+ pinfo.type = Variant::PACKED_INT32_ARRAY;
+ } break;
+ case RS::GLOBAL_VAR_TYPE_SAMPLER2D: {
+ pinfo.type = Variant::OBJECT;
+ pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE;
+ pinfo.hint_string = "Texture2D";
+ } break;
+ case RS::GLOBAL_VAR_TYPE_SAMPLER2DARRAY: {
+ pinfo.type = Variant::OBJECT;
+ pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE;
+ pinfo.hint_string = "Texture2DArray";
+ } break;
+ case RS::GLOBAL_VAR_TYPE_SAMPLER3D: {
+ pinfo.type = Variant::OBJECT;
+ pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE;
+ pinfo.hint_string = "Texture3D";
+ } break;
+ case RS::GLOBAL_VAR_TYPE_SAMPLERCUBE: {
+ pinfo.type = Variant::OBJECT;
+ pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE;
+ pinfo.hint_string = "Cubemap";
+ } break;
+ default: {
+ } break;
+ }
+
+ p_list->push_back(pinfo);
+ }
+ }
+
+public:
+ bool block_update = false;
+
+ ShaderGlobalsEditorInterface() {
+ }
+};
+
+static Variant create_var(RS::GlobalVariableType p_type) {
+ switch (p_type) {
+ case RS::GLOBAL_VAR_TYPE_BOOL: {
+ return false;
+ }
+ case RS::GLOBAL_VAR_TYPE_BVEC2: {
+ return 0; //bits
+ }
+ case RS::GLOBAL_VAR_TYPE_BVEC3: {
+ return 0; //bits
+ }
+ case RS::GLOBAL_VAR_TYPE_BVEC4: {
+ return 0; //bits
+ }
+ case RS::GLOBAL_VAR_TYPE_INT: {
+ return 0; //bits
+ }
+ case RS::GLOBAL_VAR_TYPE_IVEC2: {
+ return Vector2i();
+ }
+ case RS::GLOBAL_VAR_TYPE_IVEC3: {
+ return Vector3i();
+ }
+ case RS::GLOBAL_VAR_TYPE_IVEC4: {
+ Vector<int> v4;
+ v4.resize(4);
+ v4.write[0] = 0;
+ v4.write[1] = 0;
+ v4.write[2] = 0;
+ v4.write[3] = 0;
+ return v4;
+ }
+ case RS::GLOBAL_VAR_TYPE_RECT2I: {
+ return Rect2i();
+ }
+ case RS::GLOBAL_VAR_TYPE_UINT: {
+ return 0;
+ }
+ case RS::GLOBAL_VAR_TYPE_UVEC2: {
+ return Vector2i();
+ }
+ case RS::GLOBAL_VAR_TYPE_UVEC3: {
+ return Vector3i();
+ }
+ case RS::GLOBAL_VAR_TYPE_UVEC4: {
+ return Rect2i();
+ }
+ case RS::GLOBAL_VAR_TYPE_FLOAT: {
+ return 0.0;
+ }
+ case RS::GLOBAL_VAR_TYPE_VEC2: {
+ return Vector2();
+ }
+ case RS::GLOBAL_VAR_TYPE_VEC3: {
+ return Vector3();
+ }
+ case RS::GLOBAL_VAR_TYPE_VEC4: {
+ return Plane();
+ }
+ case RS::GLOBAL_VAR_TYPE_RECT2: {
+ return Rect2();
+ }
+ case RS::GLOBAL_VAR_TYPE_COLOR: {
+ return Color();
+ }
+ case RS::GLOBAL_VAR_TYPE_MAT2: {
+ Vector<real_t> xform;
+ xform.resize(4);
+ xform.write[0] = 1;
+ xform.write[1] = 0;
+ xform.write[2] = 0;
+ xform.write[3] = 1;
+ return xform;
+ }
+ case RS::GLOBAL_VAR_TYPE_MAT3: {
+ return Basis();
+ }
+ case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: {
+ return Transform2D();
+ }
+ case RS::GLOBAL_VAR_TYPE_TRANSFORM: {
+ return Transform();
+ }
+ case RS::GLOBAL_VAR_TYPE_MAT4: {
+ Vector<real_t> xform;
+ xform.resize(4);
+ xform.write[0] = 1;
+ xform.write[1] = 0;
+ xform.write[2] = 0;
+ xform.write[3] = 0;
+
+ xform.write[4] = 0;
+ xform.write[5] = 1;
+ xform.write[6] = 0;
+ xform.write[7] = 0;
+
+ xform.write[8] = 0;
+ xform.write[9] = 0;
+ xform.write[10] = 1;
+ xform.write[11] = 0;
+
+ xform.write[12] = 0;
+ xform.write[13] = 0;
+ xform.write[14] = 0;
+ xform.write[15] = 1;
+
+ return xform;
+ }
+ case RS::GLOBAL_VAR_TYPE_SAMPLER2D: {
+ return "";
+ }
+ case RS::GLOBAL_VAR_TYPE_SAMPLER2DARRAY: {
+ return "";
+ }
+ case RS::GLOBAL_VAR_TYPE_SAMPLER3D: {
+ return "";
+ }
+ case RS::GLOBAL_VAR_TYPE_SAMPLERCUBE: {
+ return "";
+ }
+ default: {
+ return Variant();
+ }
+ }
+}
+
+void ShaderGlobalsEditor::_variable_added() {
+ String var = variable_name->get_text().strip_edges();
+ if (var == "" || !var.is_valid_identifier()) {
+ EditorNode::get_singleton()->show_warning(TTR("Please specify a valid variable identifier name."));
+ return;
+ }
+
+ if (RenderingServer::get_singleton()->global_variable_get(var).get_type() != Variant::NIL) {
+ EditorNode::get_singleton()->show_warning(vformat(TTR("Global variable '%s' already exists'"), var));
+ return;
+ }
+
+ List<String> keywords;
+ ShaderLanguage::get_keyword_list(&keywords);
+
+ if (keywords.find(var) != nullptr || var == "script") {
+ EditorNode::get_singleton()->show_warning(vformat(TTR("Name '%s' is a reserved shader language keyword."), var));
+ return;
+ }
+
+ UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
+
+ Variant value = create_var(RS::GlobalVariableType(variable_type->get_selected()));
+
+ undo_redo->create_action("Add Shader Global Variable");
+ undo_redo->add_do_method(RS::get_singleton(), "global_variable_add", var, RS::GlobalVariableType(variable_type->get_selected()), value);
+ undo_redo->add_undo_method(RS::get_singleton(), "global_variable_remove", var);
+ Dictionary gv;
+ gv["type"] = global_var_type_names[variable_type->get_selected()];
+ gv["value"] = value;
+
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "shader_globals/" + var, gv);
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "shader_globals/" + var, Variant());
+ undo_redo->add_do_method(this, "_changed");
+ undo_redo->add_undo_method(this, "_changed");
+ undo_redo->commit_action();
+}
+
+void ShaderGlobalsEditor::_variable_deleted(const String &p_variable) {
+ print_line("deleted " + p_variable);
+ UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
+
+ undo_redo->create_action("Add Shader Global Variable");
+ undo_redo->add_do_method(RS::get_singleton(), "global_variable_remove", p_variable);
+ undo_redo->add_undo_method(RS::get_singleton(), "global_variable_add", p_variable, RS::get_singleton()->global_variable_get_type(p_variable), RS::get_singleton()->global_variable_get(p_variable));
+
+ undo_redo->add_do_property(ProjectSettings::get_singleton(), "shader_globals/" + p_variable, Variant());
+ undo_redo->add_undo_property(ProjectSettings::get_singleton(), "shader_globals/" + p_variable, ProjectSettings::get_singleton()->get("shader_globals/" + p_variable));
+ undo_redo->add_do_method(this, "_changed");
+ undo_redo->add_undo_method(this, "_changed");
+ undo_redo->commit_action();
+}
+
+void ShaderGlobalsEditor::_changed() {
+ emit_signal("globals_changed");
+ if (!interface->block_update) {
+ interface->_change_notify();
+ }
+}
+
+void ShaderGlobalsEditor::_bind_methods() {
+ ClassDB::bind_method("_changed", &ShaderGlobalsEditor::_changed);
+ ADD_SIGNAL(MethodInfo("globals_changed"));
+}
+
+void ShaderGlobalsEditor::_notification(int p_what) {
+ if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+ if (is_visible_in_tree()) {
+ print_line("OK load settings in globalseditor");
+ inspector->edit(interface);
+ }
+ }
+}
+
+ShaderGlobalsEditor::ShaderGlobalsEditor() {
+ HBoxContainer *add_menu_hb = memnew(HBoxContainer);
+ add_child(add_menu_hb);
+
+ add_menu_hb->add_child(memnew(Label(TTR("Name:"))));
+ variable_name = memnew(LineEdit);
+ variable_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_menu_hb->add_child(variable_name);
+
+ add_menu_hb->add_child(memnew(Label(TTR("Type:"))));
+ variable_type = memnew(OptionButton);
+ variable_type->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_menu_hb->add_child(variable_type);
+
+ for (int i = 0; i < RS::GLOBAL_VAR_TYPE_MAX; i++) {
+ variable_type->add_item(global_var_type_names[i]);
+ }
+
+ variable_add = memnew(Button(TTR("Add")));
+ add_menu_hb->add_child(variable_add);
+ variable_add->connect("pressed", callable_mp(this, &ShaderGlobalsEditor::_variable_added));
+
+ inspector = memnew(EditorInspector);
+ inspector->set_v_size_flags(SIZE_EXPAND_FILL);
+ add_child(inspector);
+ inspector->set_use_wide_editors(true);
+ inspector->set_enable_capitalize_paths(false);
+ inspector->set_use_deletable_properties(true);
+ inspector->connect("property_deleted", callable_mp(this, &ShaderGlobalsEditor::_variable_deleted), varray(), CONNECT_DEFERRED);
+
+ interface = memnew(ShaderGlobalsEditorInterface);
+ interface->connect("var_changed", Callable(this, "_changed"));
+}
+
+ShaderGlobalsEditor::~ShaderGlobalsEditor() {
+ inspector->edit(nullptr);
+ memdelete(interface);
+}
diff --git a/editor/shader_globals_editor.h b/editor/shader_globals_editor.h
new file mode 100644
index 0000000000..33f527f314
--- /dev/null
+++ b/editor/shader_globals_editor.h
@@ -0,0 +1,67 @@
+/*************************************************************************/
+/* shader_globals_editor.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef SHADER_GLOBALS_EDITOR_H
+#define SHADER_GLOBALS_EDITOR_H
+
+#include "core/undo_redo.h"
+#include "editor/editor_autoload_settings.h"
+#include "editor/editor_data.h"
+#include "editor/editor_plugin_settings.h"
+#include "editor/editor_sectioned_inspector.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/tab_container.h"
+
+class ShaderGlobalsEditorInterface;
+
+class ShaderGlobalsEditor : public VBoxContainer {
+ GDCLASS(ShaderGlobalsEditor, VBoxContainer)
+
+ ShaderGlobalsEditorInterface *interface;
+ EditorInspector *inspector;
+
+ LineEdit *variable_name;
+ OptionButton *variable_type;
+ Button *variable_add;
+
+ void _variable_added();
+ void _variable_deleted(const String &p_variable);
+ void _changed();
+
+protected:
+ static void _bind_methods();
+ void _notification(int p_what);
+
+public:
+ ShaderGlobalsEditor();
+ ~ShaderGlobalsEditor();
+};
+
+#endif // SHADER_GLOBALS_EDITOR_H
diff --git a/editor/spatial_editor_gizmos.cpp b/editor/spatial_editor_gizmos.cpp
deleted file mode 100644
index c94b0eeab0..0000000000
--- a/editor/spatial_editor_gizmos.cpp
+++ /dev/null
@@ -1,4503 +0,0 @@
-/*************************************************************************/
-/* spatial_editor_gizmos.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "spatial_editor_gizmos.h"
-
-#include "core/math/geometry.h"
-#include "core/math/quick_hull.h"
-#include "scene/3d/audio_stream_player_3d.h"
-#include "scene/3d/baked_lightmap.h"
-#include "scene/3d/collision_polygon.h"
-#include "scene/3d/collision_shape.h"
-#include "scene/3d/cpu_particles.h"
-#include "scene/3d/gi_probe.h"
-#include "scene/3d/light.h"
-#include "scene/3d/listener.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/3d/navigation_mesh.h"
-#include "scene/3d/particles.h"
-#include "scene/3d/physics_joint.h"
-#include "scene/3d/position_3d.h"
-#include "scene/3d/ray_cast.h"
-#include "scene/3d/reflection_probe.h"
-#include "scene/3d/soft_body.h"
-#include "scene/3d/spring_arm.h"
-#include "scene/3d/sprite_3d.h"
-#include "scene/3d/vehicle_body.h"
-#include "scene/3d/visibility_notifier.h"
-#include "scene/resources/box_shape.h"
-#include "scene/resources/capsule_shape.h"
-#include "scene/resources/concave_polygon_shape.h"
-#include "scene/resources/convex_polygon_shape.h"
-#include "scene/resources/cylinder_shape.h"
-#include "scene/resources/height_map_shape.h"
-#include "scene/resources/plane_shape.h"
-#include "scene/resources/primitive_meshes.h"
-#include "scene/resources/ray_shape.h"
-#include "scene/resources/sphere_shape.h"
-#include "scene/resources/surface_tool.h"
-
-#define HANDLE_HALF_SIZE 9.5
-
-bool EditorSpatialGizmo::is_editable() const {
-
- ERR_FAIL_COND_V(!spatial_node, false);
- Node *edited_root = spatial_node->get_tree()->get_edited_scene_root();
- if (spatial_node == edited_root)
- return true;
- if (spatial_node->get_owner() == edited_root)
- return true;
-
- if (edited_root->is_editable_instance(spatial_node->get_owner()))
- return true;
-
- return false;
-}
-
-void EditorSpatialGizmo::clear() {
-
- for (int i = 0; i < instances.size(); i++) {
-
- if (instances[i].instance.is_valid())
- VS::get_singleton()->free(instances[i].instance);
- }
-
- billboard_handle = false;
- collision_segments.clear();
- collision_mesh = Ref<TriangleMesh>();
- instances.clear();
- handles.clear();
- secondary_handles.clear();
-}
-
-void EditorSpatialGizmo::redraw() {
-
- if (get_script_instance() && get_script_instance()->has_method("redraw")) {
- get_script_instance()->call("redraw");
- return;
- }
-
- ERR_FAIL_COND(!gizmo_plugin);
- gizmo_plugin->redraw(this);
-}
-
-String EditorSpatialGizmo::get_handle_name(int p_idx) const {
-
- if (get_script_instance() && get_script_instance()->has_method("get_handle_name")) {
- return get_script_instance()->call("get_handle_name", p_idx);
- }
-
- ERR_FAIL_COND_V(!gizmo_plugin, "");
- return gizmo_plugin->get_handle_name(this, p_idx);
-}
-
-bool EditorSpatialGizmo::is_handle_highlighted(int p_idx) const {
-
- if (get_script_instance() && get_script_instance()->has_method("is_handle_highlighted")) {
- return get_script_instance()->call("is_handle_highlighted", p_idx);
- }
-
- ERR_FAIL_COND_V(!gizmo_plugin, false);
- return gizmo_plugin->is_handle_highlighted(this, p_idx);
-}
-
-Variant EditorSpatialGizmo::get_handle_value(int p_idx) {
-
- if (get_script_instance() && get_script_instance()->has_method("get_handle_value")) {
- return get_script_instance()->call("get_handle_value", p_idx);
- }
-
- ERR_FAIL_COND_V(!gizmo_plugin, Variant());
- return gizmo_plugin->get_handle_value(this, p_idx);
-}
-
-void EditorSpatialGizmo::set_handle(int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- if (get_script_instance() && get_script_instance()->has_method("set_handle")) {
- get_script_instance()->call("set_handle", p_idx, p_camera, p_point);
- return;
- }
-
- ERR_FAIL_COND(!gizmo_plugin);
- gizmo_plugin->set_handle(this, p_idx, p_camera, p_point);
-}
-
-void EditorSpatialGizmo::commit_handle(int p_idx, const Variant &p_restore, bool p_cancel) {
-
- if (get_script_instance() && get_script_instance()->has_method("commit_handle")) {
- get_script_instance()->call("commit_handle", p_idx, p_restore, p_cancel);
- return;
- }
-
- ERR_FAIL_COND(!gizmo_plugin);
- gizmo_plugin->commit_handle(this, p_idx, p_restore, p_cancel);
-}
-
-void EditorSpatialGizmo::set_spatial_node(Spatial *p_node) {
-
- ERR_FAIL_NULL(p_node);
- spatial_node = p_node;
-}
-
-void EditorSpatialGizmo::Instance::create_instance(Spatial *p_base, bool p_hidden) {
-
- instance = VS::get_singleton()->instance_create2(mesh->get_rid(), p_base->get_world()->get_scenario());
- VS::get_singleton()->instance_attach_object_instance_id(instance, p_base->get_instance_id());
- if (skin_reference.is_valid())
- VS::get_singleton()->instance_attach_skeleton(instance, skin_reference->get_skeleton());
- if (extra_margin)
- VS::get_singleton()->instance_set_extra_visibility_margin(instance, 1);
- VS::get_singleton()->instance_geometry_set_cast_shadows_setting(instance, VS::SHADOW_CASTING_SETTING_OFF);
- int layer = p_hidden ? 0 : 1 << SpatialEditorViewport::GIZMO_EDIT_LAYER;
- VS::get_singleton()->instance_set_layer_mask(instance, layer); //gizmos are 26
-}
-
-void EditorSpatialGizmo::add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard, const Ref<SkinReference> &p_skin_reference, const Ref<Material> &p_material) {
-
- ERR_FAIL_COND(!spatial_node);
- Instance ins;
-
- ins.billboard = p_billboard;
- ins.mesh = p_mesh;
- ins.skin_reference = p_skin_reference;
- ins.material = p_material;
- if (valid) {
- ins.create_instance(spatial_node, hidden);
- VS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
- if (ins.material.is_valid()) {
- VS::get_singleton()->instance_geometry_set_material_override(ins.instance, p_material->get_rid());
- }
- }
-
- instances.push_back(ins);
-}
-
-void EditorSpatialGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard, const Color &p_modulate) {
- if (p_lines.empty()) {
- return;
- }
-
- ERR_FAIL_COND(!spatial_node);
- Instance ins;
-
- Ref<ArrayMesh> mesh = memnew(ArrayMesh);
- Array a;
- a.resize(Mesh::ARRAY_MAX);
-
- a[Mesh::ARRAY_VERTEX] = p_lines;
-
- PoolVector<Color> color;
- color.resize(p_lines.size());
- {
- PoolVector<Color>::Write w = color.write();
- for (int i = 0; i < p_lines.size(); i++) {
- if (is_selected())
- w[i] = Color(1, 1, 1, 0.8) * p_modulate;
- else
- w[i] = Color(1, 1, 1, 0.2) * p_modulate;
- }
- }
-
- a[Mesh::ARRAY_COLOR] = color;
-
- mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, a);
- mesh->surface_set_material(0, p_material);
-
- if (p_billboard) {
- float md = 0;
- for (int i = 0; i < p_lines.size(); i++) {
-
- md = MAX(0, p_lines[i].length());
- }
- if (md) {
- mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0));
- }
- }
-
- ins.billboard = p_billboard;
- ins.mesh = mesh;
- if (valid) {
- ins.create_instance(spatial_node, hidden);
- VS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
- }
-
- instances.push_back(ins);
-}
-
-void EditorSpatialGizmo::add_unscaled_billboard(const Ref<Material> &p_material, float p_scale, const Color &p_modulate) {
-
- ERR_FAIL_COND(!spatial_node);
- Instance ins;
-
- Vector<Vector3> vs;
- Vector<Vector2> uv;
- Vector<Color> colors;
-
- vs.push_back(Vector3(-p_scale, p_scale, 0));
- vs.push_back(Vector3(p_scale, p_scale, 0));
- vs.push_back(Vector3(p_scale, -p_scale, 0));
- vs.push_back(Vector3(-p_scale, -p_scale, 0));
-
- uv.push_back(Vector2(0, 0));
- uv.push_back(Vector2(1, 0));
- uv.push_back(Vector2(1, 1));
- uv.push_back(Vector2(0, 1));
-
- colors.push_back(p_modulate);
- colors.push_back(p_modulate);
- colors.push_back(p_modulate);
- colors.push_back(p_modulate);
-
- Ref<ArrayMesh> mesh = memnew(ArrayMesh);
- Array a;
- a.resize(Mesh::ARRAY_MAX);
- a[Mesh::ARRAY_VERTEX] = vs;
- a[Mesh::ARRAY_TEX_UV] = uv;
- a[Mesh::ARRAY_COLOR] = colors;
- mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLE_FAN, a);
- mesh->surface_set_material(0, p_material);
-
- float md = 0;
- for (int i = 0; i < vs.size(); i++) {
-
- md = MAX(0, vs[i].length());
- }
- if (md) {
- mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0));
- }
-
- selectable_icon_size = p_scale;
- mesh->set_custom_aabb(AABB(Vector3(-selectable_icon_size, -selectable_icon_size, -selectable_icon_size) * 100.0f, Vector3(selectable_icon_size, selectable_icon_size, selectable_icon_size) * 200.0f));
-
- ins.mesh = mesh;
- ins.unscaled = true;
- ins.billboard = true;
- if (valid) {
- ins.create_instance(spatial_node, hidden);
- VS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
- }
-
- selectable_icon_size = p_scale;
-
- instances.push_back(ins);
-}
-
-void EditorSpatialGizmo::add_collision_triangles(const Ref<TriangleMesh> &p_tmesh) {
- collision_mesh = p_tmesh;
-}
-
-void EditorSpatialGizmo::add_collision_segments(const Vector<Vector3> &p_lines) {
-
- int from = collision_segments.size();
- collision_segments.resize(from + p_lines.size());
- for (int i = 0; i < p_lines.size(); i++) {
-
- collision_segments.write[from + i] = p_lines[i];
- }
-}
-
-void EditorSpatialGizmo::add_handles(const Vector<Vector3> &p_handles, const Ref<Material> &p_material, bool p_billboard, bool p_secondary) {
-
- billboard_handle = p_billboard;
-
- if (!is_selected() || !is_editable())
- return;
-
- ERR_FAIL_COND(!spatial_node);
-
- Instance ins;
-
- Ref<ArrayMesh> mesh = memnew(ArrayMesh);
-
- Array a;
- a.resize(VS::ARRAY_MAX);
- a[VS::ARRAY_VERTEX] = p_handles;
- PoolVector<Color> colors;
- {
- colors.resize(p_handles.size());
- PoolVector<Color>::Write w = colors.write();
- for (int i = 0; i < p_handles.size(); i++) {
-
- Color col(1, 1, 1, 1);
- if (is_handle_highlighted(i))
- col = Color(0, 0, 1, 0.9);
-
- if (SpatialEditor::get_singleton()->get_over_gizmo_handle() != i)
- col.a = 0.8;
-
- w[i] = col;
- }
- }
- a[VS::ARRAY_COLOR] = colors;
- mesh->add_surface_from_arrays(Mesh::PRIMITIVE_POINTS, a);
- mesh->surface_set_material(0, p_material);
-
- if (p_billboard) {
- float md = 0;
- for (int i = 0; i < p_handles.size(); i++) {
-
- md = MAX(0, p_handles[i].length());
- }
- if (md) {
- mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0));
- }
- }
-
- ins.mesh = mesh;
- ins.billboard = p_billboard;
- ins.extra_margin = true;
- if (valid) {
- ins.create_instance(spatial_node, hidden);
- VS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
- }
- instances.push_back(ins);
- if (!p_secondary) {
- int chs = handles.size();
- handles.resize(chs + p_handles.size());
- for (int i = 0; i < p_handles.size(); i++) {
- handles.write[i + chs] = p_handles[i];
- }
- } else {
-
- int chs = secondary_handles.size();
- secondary_handles.resize(chs + p_handles.size());
- for (int i = 0; i < p_handles.size(); i++) {
- secondary_handles.write[i + chs] = p_handles[i];
- }
- }
-}
-
-void EditorSpatialGizmo::add_solid_box(Ref<Material> &p_material, Vector3 p_size, Vector3 p_position) {
- ERR_FAIL_COND(!spatial_node);
-
- CubeMesh cubem;
- cubem.set_size(p_size);
-
- Array arrays = cubem.surface_get_arrays(0);
- PoolVector3Array vertex = arrays[VS::ARRAY_VERTEX];
- PoolVector3Array::Write w = vertex.write();
-
- for (int i = 0; i < vertex.size(); ++i) {
- w[i] += p_position;
- }
-
- arrays[VS::ARRAY_VERTEX] = vertex;
-
- Ref<ArrayMesh> m = memnew(ArrayMesh);
- m->add_surface_from_arrays(cubem.surface_get_primitive_type(0), arrays);
- m->surface_set_material(0, p_material);
- add_mesh(m);
-}
-
-bool EditorSpatialGizmo::intersect_frustum(const Camera *p_camera, const Vector<Plane> &p_frustum) {
-
- ERR_FAIL_COND_V(!spatial_node, false);
- ERR_FAIL_COND_V(!valid, false);
-
- if (hidden && !gizmo_plugin->is_selectable_when_hidden()) return false;
-
- if (selectable_icon_size > 0.0f) {
- Vector3 origin = spatial_node->get_global_transform().get_origin();
-
- const Plane *p = p_frustum.ptr();
- int fc = p_frustum.size();
-
- bool any_out = false;
-
- for (int j = 0; j < fc; j++) {
-
- if (p[j].is_point_over(origin)) {
- any_out = true;
- break;
- }
- }
-
- return !any_out;
- }
-
- if (collision_segments.size()) {
-
- const Plane *p = p_frustum.ptr();
- int fc = p_frustum.size();
-
- int vc = collision_segments.size();
- const Vector3 *vptr = collision_segments.ptr();
- Transform t = spatial_node->get_global_transform();
-
- bool any_out = false;
- for (int j = 0; j < fc; j++) {
- for (int i = 0; i < vc; i++) {
- Vector3 v = t.xform(vptr[i]);
- if (p[j].is_point_over(v)) {
- any_out = true;
- break;
- }
- }
- if (any_out) break;
- }
-
- if (!any_out) return true;
- }
-
- if (collision_mesh.is_valid()) {
- Transform t = spatial_node->get_global_transform();
-
- Vector3 mesh_scale = t.get_basis().get_scale();
- t.orthonormalize();
-
- Transform it = t.affine_inverse();
-
- Vector<Plane> transformed_frustum;
-
- for (int i = 0; i < 4; i++) {
- transformed_frustum.push_back(it.xform(p_frustum[i]));
- }
-
- if (collision_mesh->inside_convex_shape(transformed_frustum.ptr(), transformed_frustum.size(), mesh_scale)) {
- return true;
- }
- }
-
- return false;
-}
-
-bool EditorSpatialGizmo::intersect_ray(Camera *p_camera, const Point2 &p_point, Vector3 &r_pos, Vector3 &r_normal, int *r_gizmo_handle, bool p_sec_first) {
-
- ERR_FAIL_COND_V(!spatial_node, false);
- ERR_FAIL_COND_V(!valid, false);
-
- if (hidden && !gizmo_plugin->is_selectable_when_hidden()) return false;
-
- if (r_gizmo_handle && !hidden) {
-
- Transform t = spatial_node->get_global_transform();
- if (billboard_handle) {
- t.set_look_at(t.origin, t.origin - p_camera->get_transform().basis.get_axis(2), p_camera->get_transform().basis.get_axis(1));
- }
-
- float min_d = 1e20;
- int idx = -1;
-
- for (int i = 0; i < secondary_handles.size(); i++) {
-
- Vector3 hpos = t.xform(secondary_handles[i]);
- Vector2 p = p_camera->unproject_position(hpos);
-
- if (p.distance_to(p_point) < HANDLE_HALF_SIZE) {
-
- real_t dp = p_camera->get_transform().origin.distance_to(hpos);
- if (dp < min_d) {
-
- r_pos = t.xform(hpos);
- r_normal = p_camera->get_transform().basis.get_axis(2);
- min_d = dp;
- idx = i + handles.size();
- }
- }
- }
-
- if (p_sec_first && idx != -1) {
-
- *r_gizmo_handle = idx;
- return true;
- }
-
- min_d = 1e20;
-
- for (int i = 0; i < handles.size(); i++) {
-
- Vector3 hpos = t.xform(handles[i]);
- Vector2 p = p_camera->unproject_position(hpos);
-
- if (p.distance_to(p_point) < HANDLE_HALF_SIZE) {
-
- real_t dp = p_camera->get_transform().origin.distance_to(hpos);
- if (dp < min_d) {
-
- r_pos = t.xform(hpos);
- r_normal = p_camera->get_transform().basis.get_axis(2);
- min_d = dp;
- idx = i;
- }
- }
- }
-
- if (idx >= 0) {
- *r_gizmo_handle = idx;
- return true;
- }
- }
-
- if (selectable_icon_size > 0.0f) {
-
- Transform t = spatial_node->get_global_transform();
- Vector3 camera_position = p_camera->get_camera_transform().origin;
- if (camera_position.distance_squared_to(t.origin) > 0.01) {
- t.set_look_at(t.origin, camera_position, Vector3(0, 1, 0));
- }
-
- float scale = t.origin.distance_to(p_camera->get_camera_transform().origin);
-
- if (p_camera->get_projection() == Camera::PROJECTION_ORTHOGONAL) {
- float aspect = p_camera->get_viewport()->get_visible_rect().size.aspect();
- float size = p_camera->get_size();
- scale = size / aspect;
- }
-
- Point2 center = p_camera->unproject_position(t.origin);
-
- Transform orig_camera_transform = p_camera->get_camera_transform();
-
- if (orig_camera_transform.origin.distance_squared_to(t.origin) > 0.01 &&
- ABS(orig_camera_transform.basis.get_axis(Vector3::AXIS_Z).dot(Vector3(0, 1, 0))) < 0.99) {
- p_camera->look_at(t.origin, Vector3(0, 1, 0));
- }
-
- Vector3 c0 = t.xform(Vector3(selectable_icon_size, selectable_icon_size, 0) * scale);
- Vector3 c1 = t.xform(Vector3(-selectable_icon_size, -selectable_icon_size, 0) * scale);
-
- Point2 p0 = p_camera->unproject_position(c0);
- Point2 p1 = p_camera->unproject_position(c1);
-
- p_camera->set_global_transform(orig_camera_transform);
-
- Rect2 rect(p0, (p1 - p0).abs());
-
- rect.set_position(center - rect.get_size() / 2.0);
-
- if (rect.has_point(p_point)) {
- r_pos = t.origin;
- r_normal = -p_camera->project_ray_normal(p_point);
- return true;
- }
-
- return false;
- }
-
- if (collision_segments.size()) {
-
- Plane camp(p_camera->get_transform().origin, (-p_camera->get_transform().basis.get_axis(2)).normalized());
-
- int vc = collision_segments.size();
- const Vector3 *vptr = collision_segments.ptr();
- Transform t = spatial_node->get_global_transform();
- if (billboard_handle) {
- t.set_look_at(t.origin, t.origin - p_camera->get_transform().basis.get_axis(2), p_camera->get_transform().basis.get_axis(1));
- }
-
- Vector3 cp;
- float cpd = 1e20;
-
- for (int i = 0; i < vc / 2; i++) {
-
- Vector3 a = t.xform(vptr[i * 2 + 0]);
- Vector3 b = t.xform(vptr[i * 2 + 1]);
- Vector2 s[2];
- s[0] = p_camera->unproject_position(a);
- s[1] = p_camera->unproject_position(b);
-
- Vector2 p = Geometry::get_closest_point_to_segment_2d(p_point, s);
-
- float pd = p.distance_to(p_point);
-
- if (pd < cpd) {
-
- float d = s[0].distance_to(s[1]);
- Vector3 tcp;
- if (d > 0) {
-
- float d2 = s[0].distance_to(p) / d;
- tcp = a + (b - a) * d2;
-
- } else {
- tcp = a;
- }
-
- if (camp.distance_to(tcp) < p_camera->get_znear())
- continue;
- cp = tcp;
- cpd = pd;
- }
- }
-
- if (cpd < 8) {
-
- r_pos = cp;
- r_normal = -p_camera->project_ray_normal(p_point);
- return true;
- }
-
- return false;
- }
-
- if (collision_mesh.is_valid()) {
- Transform gt = spatial_node->get_global_transform();
-
- if (billboard_handle) {
- gt.set_look_at(gt.origin, gt.origin - p_camera->get_transform().basis.get_axis(2), p_camera->get_transform().basis.get_axis(1));
- }
-
- Transform ai = gt.affine_inverse();
- Vector3 ray_from = ai.xform(p_camera->project_ray_origin(p_point));
- Vector3 ray_dir = ai.basis.xform(p_camera->project_ray_normal(p_point)).normalized();
- Vector3 rpos, rnorm;
-
- if (collision_mesh->intersect_ray(ray_from, ray_dir, rpos, rnorm)) {
-
- r_pos = gt.xform(rpos);
- r_normal = gt.basis.xform(rnorm).normalized();
- return true;
- }
- }
-
- return false;
-}
-
-void EditorSpatialGizmo::create() {
-
- ERR_FAIL_COND(!spatial_node);
- ERR_FAIL_COND(valid);
- valid = true;
-
- for (int i = 0; i < instances.size(); i++) {
-
- instances.write[i].create_instance(spatial_node, hidden);
- }
-
- transform();
-}
-
-void EditorSpatialGizmo::transform() {
-
- ERR_FAIL_COND(!spatial_node);
- ERR_FAIL_COND(!valid);
- for (int i = 0; i < instances.size(); i++) {
- VS::get_singleton()->instance_set_transform(instances[i].instance, spatial_node->get_global_transform());
- }
-}
-
-void EditorSpatialGizmo::free() {
-
- ERR_FAIL_COND(!spatial_node);
- ERR_FAIL_COND(!valid);
-
- for (int i = 0; i < instances.size(); i++) {
-
- if (instances[i].instance.is_valid())
- VS::get_singleton()->free(instances[i].instance);
- instances.write[i].instance = RID();
- }
-
- clear();
-
- valid = false;
-}
-
-void EditorSpatialGizmo::set_hidden(bool p_hidden) {
- hidden = p_hidden;
- int layer = hidden ? 0 : 1 << SpatialEditorViewport::GIZMO_EDIT_LAYER;
- for (int i = 0; i < instances.size(); ++i) {
- VS::get_singleton()->instance_set_layer_mask(instances[i].instance, layer);
- }
-}
-
-void EditorSpatialGizmo::set_plugin(EditorSpatialGizmoPlugin *p_plugin) {
- gizmo_plugin = p_plugin;
-}
-
-void EditorSpatialGizmo::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("add_lines", "lines", "material", "billboard", "modulate"), &EditorSpatialGizmo::add_lines, DEFVAL(false), DEFVAL(Color(1, 1, 1)));
- ClassDB::bind_method(D_METHOD("add_mesh", "mesh", "billboard", "skeleton", "material"), &EditorSpatialGizmo::add_mesh, DEFVAL(false), DEFVAL(Ref<SkinReference>()), DEFVAL(Variant()));
- ClassDB::bind_method(D_METHOD("add_collision_segments", "segments"), &EditorSpatialGizmo::add_collision_segments);
- ClassDB::bind_method(D_METHOD("add_collision_triangles", "triangles"), &EditorSpatialGizmo::add_collision_triangles);
- ClassDB::bind_method(D_METHOD("add_unscaled_billboard", "material", "default_scale", "modulate"), &EditorSpatialGizmo::add_unscaled_billboard, DEFVAL(1), DEFVAL(Color(1, 1, 1)));
- ClassDB::bind_method(D_METHOD("add_handles", "handles", "material", "billboard", "secondary"), &EditorSpatialGizmo::add_handles, DEFVAL(false), DEFVAL(false));
- ClassDB::bind_method(D_METHOD("set_spatial_node", "node"), &EditorSpatialGizmo::_set_spatial_node);
- ClassDB::bind_method(D_METHOD("get_spatial_node"), &EditorSpatialGizmo::get_spatial_node);
- ClassDB::bind_method(D_METHOD("get_plugin"), &EditorSpatialGizmo::get_plugin);
- ClassDB::bind_method(D_METHOD("clear"), &EditorSpatialGizmo::clear);
- ClassDB::bind_method(D_METHOD("set_hidden", "hidden"), &EditorSpatialGizmo::set_hidden);
-
- BIND_VMETHOD(MethodInfo("redraw"));
- BIND_VMETHOD(MethodInfo(Variant::STRING, "get_handle_name", PropertyInfo(Variant::INT, "index")));
- BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_handle_highlighted", PropertyInfo(Variant::INT, "index")));
-
- MethodInfo hvget(Variant::NIL, "get_handle_value", PropertyInfo(Variant::INT, "index"));
- hvget.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
- BIND_VMETHOD(hvget);
-
- BIND_VMETHOD(MethodInfo("set_handle", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::VECTOR2, "point")));
- MethodInfo cm = MethodInfo("commit_handle", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "restore"), PropertyInfo(Variant::BOOL, "cancel"));
- cm.default_arguments.push_back(false);
- BIND_VMETHOD(cm);
-}
-
-EditorSpatialGizmo::EditorSpatialGizmo() {
- valid = false;
- billboard_handle = false;
- hidden = false;
- base = NULL;
- selected = false;
- instanced = false;
- spatial_node = NULL;
- gizmo_plugin = NULL;
- selectable_icon_size = -1.0f;
-}
-
-EditorSpatialGizmo::~EditorSpatialGizmo() {
-
- if (gizmo_plugin != NULL) gizmo_plugin->unregister_gizmo(this);
- clear();
-}
-
-Vector3 EditorSpatialGizmo::get_handle_pos(int p_idx) const {
-
- ERR_FAIL_INDEX_V(p_idx, handles.size(), Vector3());
-
- return handles[p_idx];
-}
-
-//// light gizmo
-
-LightSpatialGizmoPlugin::LightSpatialGizmoPlugin() {
-
- // Enable vertex colors for the materials below as the gizmo color depends on the light color.
- create_material("lines_primary", Color(1, 1, 1), false, false, true);
- create_material("lines_secondary", Color(1, 1, 1, 0.35), false, false, true);
- create_material("lines_billboard", Color(1, 1, 1), true, false, true);
-
- create_icon_material("light_directional_icon", SpatialEditor::get_singleton()->get_icon("GizmoDirectionalLight", "EditorIcons"));
- create_icon_material("light_omni_icon", SpatialEditor::get_singleton()->get_icon("GizmoLight", "EditorIcons"));
- create_icon_material("light_spot_icon", SpatialEditor::get_singleton()->get_icon("GizmoSpotLight", "EditorIcons"));
-
- create_handle_material("handles");
- create_handle_material("handles_billboard", true);
-}
-
-bool LightSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<Light>(p_spatial) != NULL;
-}
-
-String LightSpatialGizmoPlugin::get_name() const {
- return "Lights";
-}
-
-int LightSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-String LightSpatialGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- if (p_idx == 0)
- return "Radius";
- else
- return "Aperture";
-}
-
-Variant LightSpatialGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- Light *light = Object::cast_to<Light>(p_gizmo->get_spatial_node());
- if (p_idx == 0)
- return light->get_param(Light::PARAM_RANGE);
- if (p_idx == 1)
- return light->get_param(Light::PARAM_SPOT_ANGLE);
-
- return Variant();
-}
-
-static float _find_closest_angle_to_half_pi_arc(const Vector3 &p_from, const Vector3 &p_to, float p_arc_radius, const Transform &p_arc_xform) {
-
- //bleh, discrete is simpler
- static const int arc_test_points = 64;
- float min_d = 1e20;
- Vector3 min_p;
-
- for (int i = 0; i < arc_test_points; i++) {
-
- float a = i * Math_PI * 0.5 / arc_test_points;
- float an = (i + 1) * Math_PI * 0.5 / arc_test_points;
- Vector3 p = Vector3(Math::cos(a), 0, -Math::sin(a)) * p_arc_radius;
- Vector3 n = Vector3(Math::cos(an), 0, -Math::sin(an)) * p_arc_radius;
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(p, n, p_from, p_to, ra, rb);
-
- float d = ra.distance_to(rb);
- if (d < min_d) {
- min_d = d;
- min_p = ra;
- }
- }
-
- //min_p = p_arc_xform.affine_inverse().xform(min_p);
- float a = (Math_PI * 0.5) - Vector2(min_p.x, -min_p.z).angle();
- return a * 180.0 / Math_PI;
-}
-
-void LightSpatialGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- Light *light = Object::cast_to<Light>(p_gizmo->get_spatial_node());
- Transform gt = light->get_global_transform();
- Transform gi = gt.affine_inverse();
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 s[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
- if (p_idx == 0) {
-
- if (Object::cast_to<SpotLight>(light)) {
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), Vector3(0, 0, -4096), s[0], s[1], ra, rb);
-
- float d = -ra.z;
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d <= 0) // Equal is here for negative zero.
- d = 0;
-
- light->set_param(Light::PARAM_RANGE, d);
- } else if (Object::cast_to<OmniLight>(light)) {
-
- Plane cp = Plane(gt.origin, p_camera->get_transform().basis.get_axis(2));
-
- Vector3 inters;
- if (cp.intersects_ray(ray_from, ray_dir, &inters)) {
-
- float r = inters.distance_to(gt.origin);
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- r = Math::stepify(r, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- light->set_param(Light::PARAM_RANGE, r);
- }
- }
-
- } else if (p_idx == 1) {
-
- float a = _find_closest_angle_to_half_pi_arc(s[0], s[1], light->get_param(Light::PARAM_RANGE), gt);
- light->set_param(Light::PARAM_SPOT_ANGLE, CLAMP(a, 0.01, 89.99));
- }
-}
-
-void LightSpatialGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- Light *light = Object::cast_to<Light>(p_gizmo->get_spatial_node());
- if (p_cancel) {
-
- light->set_param(p_idx == 0 ? Light::PARAM_RANGE : Light::PARAM_SPOT_ANGLE, p_restore);
-
- } else if (p_idx == 0) {
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Light Radius"));
- ur->add_do_method(light, "set_param", Light::PARAM_RANGE, light->get_param(Light::PARAM_RANGE));
- ur->add_undo_method(light, "set_param", Light::PARAM_RANGE, p_restore);
- ur->commit_action();
- } else if (p_idx == 1) {
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Light Radius"));
- ur->add_do_method(light, "set_param", Light::PARAM_SPOT_ANGLE, light->get_param(Light::PARAM_SPOT_ANGLE));
- ur->add_undo_method(light, "set_param", Light::PARAM_SPOT_ANGLE, p_restore);
- ur->commit_action();
- }
-}
-
-void LightSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- Light *light = Object::cast_to<Light>(p_gizmo->get_spatial_node());
-
- Color color = light->get_color();
- // Make the gizmo color as bright as possible for better visibility
- color.set_hsv(color.get_h(), color.get_s(), 1);
-
- p_gizmo->clear();
-
- if (Object::cast_to<DirectionalLight>(light)) {
-
- Ref<Material> material = get_material("lines_primary", p_gizmo);
- Ref<Material> icon = get_material("light_directional_icon", p_gizmo);
-
- const int arrow_points = 7;
- const float arrow_length = 1.5;
-
- Vector3 arrow[arrow_points] = {
- Vector3(0, 0, -1),
- Vector3(0, 0.8, 0),
- Vector3(0, 0.3, 0),
- Vector3(0, 0.3, arrow_length),
- Vector3(0, -0.3, arrow_length),
- Vector3(0, -0.3, 0),
- Vector3(0, -0.8, 0)
- };
-
- int arrow_sides = 2;
-
- Vector<Vector3> lines;
-
- for (int i = 0; i < arrow_sides; i++) {
- for (int j = 0; j < arrow_points; j++) {
- Basis ma(Vector3(0, 0, 1), Math_PI * i / arrow_sides);
-
- Vector3 v1 = arrow[j] - Vector3(0, 0, arrow_length);
- Vector3 v2 = arrow[(j + 1) % arrow_points] - Vector3(0, 0, arrow_length);
-
- lines.push_back(ma.xform(v1));
- lines.push_back(ma.xform(v2));
- }
- }
-
- p_gizmo->add_lines(lines, material, false, color);
- p_gizmo->add_unscaled_billboard(icon, 0.05, color);
- }
-
- if (Object::cast_to<OmniLight>(light)) {
-
- // Use both a billboard circle and 3 non-billboard circles for a better sphere-like representation
- const Ref<Material> lines_material = get_material("lines_secondary", p_gizmo);
- const Ref<Material> lines_billboard_material = get_material("lines_billboard", p_gizmo);
- const Ref<Material> icon = get_material("light_omni_icon", p_gizmo);
-
- OmniLight *on = Object::cast_to<OmniLight>(light);
- const float r = on->get_param(Light::PARAM_RANGE);
- Vector<Vector3> points;
- Vector<Vector3> points_billboard;
-
- for (int i = 0; i < 120; i++) {
-
- // Create a circle
- const float ra = Math::deg2rad((float)(i * 3));
- const float rb = Math::deg2rad((float)((i + 1) * 3));
- const Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
- const Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
-
- // Draw axis-aligned circles
- points.push_back(Vector3(a.x, 0, a.y));
- points.push_back(Vector3(b.x, 0, b.y));
- points.push_back(Vector3(0, a.x, a.y));
- points.push_back(Vector3(0, b.x, b.y));
- points.push_back(Vector3(a.x, a.y, 0));
- points.push_back(Vector3(b.x, b.y, 0));
-
- // Draw a billboarded circle
- points_billboard.push_back(Vector3(a.x, a.y, 0));
- points_billboard.push_back(Vector3(b.x, b.y, 0));
- }
-
- p_gizmo->add_lines(points, lines_material, true, color);
- p_gizmo->add_lines(points_billboard, lines_billboard_material, true, color);
- p_gizmo->add_unscaled_billboard(icon, 0.05, color);
-
- Vector<Vector3> handles;
- handles.push_back(Vector3(r, 0, 0));
- p_gizmo->add_handles(handles, get_material("handles_billboard"), true);
- }
-
- if (Object::cast_to<SpotLight>(light)) {
-
- const Ref<Material> material_primary = get_material("lines_primary", p_gizmo);
- const Ref<Material> material_secondary = get_material("lines_secondary", p_gizmo);
- const Ref<Material> icon = get_material("light_spot_icon", p_gizmo);
-
- Vector<Vector3> points_primary;
- Vector<Vector3> points_secondary;
- SpotLight *sl = Object::cast_to<SpotLight>(light);
-
- float r = sl->get_param(Light::PARAM_RANGE);
- float w = r * Math::sin(Math::deg2rad(sl->get_param(Light::PARAM_SPOT_ANGLE)));
- float d = r * Math::cos(Math::deg2rad(sl->get_param(Light::PARAM_SPOT_ANGLE)));
-
- for (int i = 0; i < 120; i++) {
-
- // Draw a circle
- const float ra = Math::deg2rad((float)(i * 3));
- const float rb = Math::deg2rad((float)((i + 1) * 3));
- const Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
- const Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * w;
-
- points_primary.push_back(Vector3(a.x, a.y, -d));
- points_primary.push_back(Vector3(b.x, b.y, -d));
-
- if (i % 15 == 0) {
- // Draw 8 lines from the cone origin to the sides of the circle
- points_secondary.push_back(Vector3(a.x, a.y, -d));
- points_secondary.push_back(Vector3());
- }
- }
-
- points_primary.push_back(Vector3(0, 0, -r));
- points_primary.push_back(Vector3());
-
- p_gizmo->add_lines(points_primary, material_primary, false, color);
- p_gizmo->add_lines(points_secondary, material_secondary, false, color);
-
- const float ra = 16 * Math_PI * 2.0 / 64.0;
- const Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
-
- Vector<Vector3> handles;
- handles.push_back(Vector3(0, 0, -r));
- handles.push_back(Vector3(a.x, a.y, -d));
-
- p_gizmo->add_handles(handles, get_material("handles"));
- p_gizmo->add_unscaled_billboard(icon, 0.05, color);
- }
-}
-
-//////
-
-//// player gizmo
-AudioStreamPlayer3DSpatialGizmoPlugin::AudioStreamPlayer3DSpatialGizmoPlugin() {
-
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/stream_player_3d", Color(0.4, 0.8, 1));
-
- create_icon_material("stream_player_3d_icon", SpatialEditor::get_singleton()->get_icon("GizmoSpatialSamplePlayer", "EditorIcons"));
- create_material("stream_player_3d_material_primary", gizmo_color);
- create_material("stream_player_3d_material_secondary", gizmo_color * Color(1, 1, 1, 0.35));
- create_handle_material("handles");
-}
-
-bool AudioStreamPlayer3DSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<AudioStreamPlayer3D>(p_spatial) != NULL;
-}
-
-String AudioStreamPlayer3DSpatialGizmoPlugin::get_name() const {
- return "AudioStreamPlayer3D";
-}
-
-int AudioStreamPlayer3DSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-String AudioStreamPlayer3DSpatialGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- return "Emission Radius";
-}
-
-Variant AudioStreamPlayer3DSpatialGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
- AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
- return player->get_emission_angle();
-}
-
-void AudioStreamPlayer3DSpatialGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
-
- Transform gt = player->get_global_transform();
- Transform gi = gt.affine_inverse();
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
- Vector3 ray_to = ray_from + ray_dir * 4096;
-
- ray_from = gi.xform(ray_from);
- ray_to = gi.xform(ray_to);
-
- float closest_dist = 1e20;
- float closest_angle = 1e20;
-
- for (int i = 0; i < 180; i++) {
-
- float a = i * Math_PI / 180.0;
- float an = (i + 1) * Math_PI / 180.0;
-
- Vector3 from(Math::sin(a), 0, -Math::cos(a));
- Vector3 to(Math::sin(an), 0, -Math::cos(an));
-
- Vector3 r1, r2;
- Geometry::get_closest_points_between_segments(from, to, ray_from, ray_to, r1, r2);
- float d = r1.distance_to(r2);
- if (d < closest_dist) {
- closest_dist = d;
- closest_angle = i;
- }
- }
-
- if (closest_angle < 91) {
- player->set_emission_angle(closest_angle);
- }
-}
-
-void AudioStreamPlayer3DSpatialGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
-
- if (p_cancel) {
-
- player->set_emission_angle(p_restore);
-
- } else {
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change AudioStreamPlayer3D Emission Angle"));
- ur->add_do_method(player, "set_emission_angle", player->get_emission_angle());
- ur->add_undo_method(player, "set_emission_angle", p_restore);
- ur->commit_action();
- }
-}
-
-void AudioStreamPlayer3DSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- const AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- const Ref<Material> icon = get_material("stream_player_3d_icon", p_gizmo);
-
- if (player->is_emission_angle_enabled()) {
-
- const float pc = player->get_emission_angle();
- const float ofs = -Math::cos(Math::deg2rad(pc));
- const float radius = Math::sin(Math::deg2rad(pc));
-
- Vector<Vector3> points_primary;
- points_primary.resize(200);
-
- for (int i = 0; i < 100; i++) {
-
- const float a = i * 2.0 * Math_PI / 100.0;
- const float an = (i + 1) * 2.0 * Math_PI / 100.0;
-
- const Vector3 from(Math::sin(a) * radius, Math::cos(a) * radius, ofs);
- const Vector3 to(Math::sin(an) * radius, Math::cos(an) * radius, ofs);
-
- points_primary.write[i * 2 + 0] = from;
- points_primary.write[i * 2 + 1] = to;
- }
-
- const Ref<Material> material_primary = get_material("stream_player_3d_material_primary", p_gizmo);
- p_gizmo->add_lines(points_primary, material_primary);
-
- Vector<Vector3> points_secondary;
- points_secondary.resize(16);
-
- for (int i = 0; i < 8; i++) {
-
- const float a = i * 2.0 * Math_PI / 8.0;
- const Vector3 from(Math::sin(a) * radius, Math::cos(a) * radius, ofs);
-
- points_secondary.write[i * 2 + 0] = from;
- points_secondary.write[i * 2 + 1] = Vector3();
- }
-
- const Ref<Material> material_secondary = get_material("stream_player_3d_material_secondary", p_gizmo);
- p_gizmo->add_lines(points_secondary, material_secondary);
-
- Vector<Vector3> handles;
- const float ha = Math::deg2rad(player->get_emission_angle());
- handles.push_back(Vector3(Math::sin(ha), 0, -Math::cos(ha)));
- p_gizmo->add_handles(handles, get_material("handles"));
- }
-
- p_gizmo->add_unscaled_billboard(icon, 0.05);
-}
-
-//////
-
-CameraSpatialGizmoPlugin::CameraSpatialGizmoPlugin() {
-
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/camera", Color(0.8, 0.4, 0.8));
-
- create_material("camera_material", gizmo_color);
- create_icon_material("camera_icon", SpatialEditor::get_singleton()->get_icon("GizmoCamera", "EditorIcons"));
- create_handle_material("handles");
-}
-
-bool CameraSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<Camera>(p_spatial) != NULL;
-}
-
-String CameraSpatialGizmoPlugin::get_name() const {
- return "Camera";
-}
-
-int CameraSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-String CameraSpatialGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- Camera *camera = Object::cast_to<Camera>(p_gizmo->get_spatial_node());
-
- if (camera->get_projection() == Camera::PROJECTION_PERSPECTIVE) {
- return "FOV";
- } else {
- return "Size";
- }
-}
-
-Variant CameraSpatialGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- Camera *camera = Object::cast_to<Camera>(p_gizmo->get_spatial_node());
-
- if (camera->get_projection() == Camera::PROJECTION_PERSPECTIVE) {
- return camera->get_fov();
- } else {
-
- return camera->get_size();
- }
-}
-
-void CameraSpatialGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- Camera *camera = Object::cast_to<Camera>(p_gizmo->get_spatial_node());
-
- Transform gt = camera->get_global_transform();
- Transform gi = gt.affine_inverse();
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 s[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
-
- if (camera->get_projection() == Camera::PROJECTION_PERSPECTIVE) {
- Transform gt2 = camera->get_global_transform();
- float a = _find_closest_angle_to_half_pi_arc(s[0], s[1], 1.0, gt2);
- camera->set("fov", CLAMP(a * 2.0, 1, 179));
- } else {
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(0, 0, -1), Vector3(4096, 0, -1), s[0], s[1], ra, rb);
- float d = ra.x * 2.0;
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- d = CLAMP(d, 0.1, 16384);
-
- camera->set("size", d);
- }
-}
-
-void CameraSpatialGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- Camera *camera = Object::cast_to<Camera>(p_gizmo->get_spatial_node());
-
- if (camera->get_projection() == Camera::PROJECTION_PERSPECTIVE) {
-
- if (p_cancel) {
-
- camera->set("fov", p_restore);
- } else {
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Camera FOV"));
- ur->add_do_property(camera, "fov", camera->get_fov());
- ur->add_undo_property(camera, "fov", p_restore);
- ur->commit_action();
- }
-
- } else {
-
- if (p_cancel) {
-
- camera->set("size", p_restore);
- } else {
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Camera Size"));
- ur->add_do_property(camera, "size", camera->get_size());
- ur->add_undo_property(camera, "size", p_restore);
- ur->commit_action();
- }
- }
-}
-
-void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- Camera *camera = Object::cast_to<Camera>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
- Vector<Vector3> handles;
-
- Ref<Material> material = get_material("camera_material", p_gizmo);
- Ref<Material> icon = get_material("camera_icon", p_gizmo);
-
-#define ADD_TRIANGLE(m_a, m_b, m_c) \
- { \
- lines.push_back(m_a); \
- lines.push_back(m_b); \
- lines.push_back(m_b); \
- lines.push_back(m_c); \
- lines.push_back(m_c); \
- lines.push_back(m_a); \
- }
-
-#define ADD_QUAD(m_a, m_b, m_c, m_d) \
- { \
- lines.push_back(m_a); \
- lines.push_back(m_b); \
- lines.push_back(m_b); \
- lines.push_back(m_c); \
- lines.push_back(m_c); \
- lines.push_back(m_d); \
- lines.push_back(m_d); \
- lines.push_back(m_a); \
- }
-
- switch (camera->get_projection()) {
-
- case Camera::PROJECTION_PERSPECTIVE: {
-
- // The real FOV is halved for accurate representation
- float fov = camera->get_fov() / 2.0;
-
- Vector3 side = Vector3(Math::sin(Math::deg2rad(fov)), 0, -Math::cos(Math::deg2rad(fov)));
- Vector3 nside = side;
- nside.x = -nside.x;
- Vector3 up = Vector3(0, side.x, 0);
-
- ADD_TRIANGLE(Vector3(), side + up, side - up);
- ADD_TRIANGLE(Vector3(), nside + up, nside - up);
- ADD_TRIANGLE(Vector3(), side + up, nside + up);
- ADD_TRIANGLE(Vector3(), side - up, nside - up);
-
- handles.push_back(side);
- side.x *= 0.25;
- nside.x *= 0.25;
- Vector3 tup(0, up.y * 3 / 2, side.z);
- ADD_TRIANGLE(tup, side + up, nside + up);
-
- } break;
- case Camera::PROJECTION_ORTHOGONAL: {
-
- float size = camera->get_size();
-
- float hsize = size * 0.5;
- Vector3 right(hsize, 0, 0);
- Vector3 up(0, hsize, 0);
- Vector3 back(0, 0, -1.0);
- Vector3 front(0, 0, 0);
-
- ADD_QUAD(-up - right, -up + right, up + right, up - right);
- ADD_QUAD(-up - right + back, -up + right + back, up + right + back, up - right + back);
- ADD_QUAD(up + right, up + right + back, up - right + back, up - right);
- ADD_QUAD(-up + right, -up + right + back, -up - right + back, -up - right);
-
- handles.push_back(right + back);
-
- right.x *= 0.25;
- Vector3 tup(0, up.y * 3 / 2, back.z);
- ADD_TRIANGLE(tup, right + up + back, -right + up + back);
-
- } break;
- case Camera::PROJECTION_FRUSTUM: {
- float hsize = camera->get_size() / 2.0;
-
- Vector3 side = Vector3(hsize, 0, -camera->get_znear()).normalized();
- Vector3 nside = side;
- nside.x = -nside.x;
- Vector3 up = Vector3(0, side.x, 0);
- Vector3 offset = Vector3(camera->get_frustum_offset().x, camera->get_frustum_offset().y, 0.0);
-
- ADD_TRIANGLE(Vector3(), side + up + offset, side - up + offset);
- ADD_TRIANGLE(Vector3(), nside + up + offset, nside - up + offset);
- ADD_TRIANGLE(Vector3(), side + up + offset, nside + up + offset);
- ADD_TRIANGLE(Vector3(), side - up + offset, nside - up + offset);
-
- side.x *= 0.25;
- nside.x *= 0.25;
- Vector3 tup(0, up.y * 3 / 2, side.z);
- ADD_TRIANGLE(tup + offset, side + up + offset, nside + up + offset);
- }
- }
-
-#undef ADD_TRIANGLE
-#undef ADD_QUAD
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_unscaled_billboard(icon, 0.05);
- p_gizmo->add_handles(handles, get_material("handles"));
-
- ClippedCamera *clipcam = Object::cast_to<ClippedCamera>(camera);
- if (clipcam) {
- Spatial *parent = Object::cast_to<Spatial>(camera->get_parent());
- if (!parent) {
- return;
- }
- Vector3 cam_normal = -camera->get_global_transform().basis.get_axis(Vector3::AXIS_Z).normalized();
- Vector3 cam_x = camera->get_global_transform().basis.get_axis(Vector3::AXIS_X).normalized();
- Vector3 cam_y = camera->get_global_transform().basis.get_axis(Vector3::AXIS_Y).normalized();
- Vector3 cam_pos = camera->get_global_transform().origin;
- Vector3 parent_pos = parent->get_global_transform().origin;
-
- Plane parent_plane(parent_pos, cam_normal);
- Vector3 ray_from = parent_plane.project(cam_pos);
-
- lines.clear();
- lines.push_back(ray_from + cam_x * 0.5 + cam_y * 0.5);
- lines.push_back(ray_from + cam_x * 0.5 + cam_y * -0.5);
-
- lines.push_back(ray_from + cam_x * 0.5 + cam_y * -0.5);
- lines.push_back(ray_from + cam_x * -0.5 + cam_y * -0.5);
-
- lines.push_back(ray_from + cam_x * -0.5 + cam_y * -0.5);
- lines.push_back(ray_from + cam_x * -0.5 + cam_y * 0.5);
-
- lines.push_back(ray_from + cam_x * -0.5 + cam_y * 0.5);
- lines.push_back(ray_from + cam_x * 0.5 + cam_y * 0.5);
-
- if (parent_plane.distance_to(cam_pos) < 0) {
- lines.push_back(ray_from);
- lines.push_back(cam_pos);
- }
-
- Transform local = camera->get_global_transform().affine_inverse();
- for (int i = 0; i < lines.size(); i++) {
- lines.write[i] = local.xform(lines[i]);
- }
-
- p_gizmo->add_lines(lines, material);
- }
-}
-
-//////
-
-MeshInstanceSpatialGizmoPlugin::MeshInstanceSpatialGizmoPlugin() {
-}
-
-bool MeshInstanceSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<MeshInstance>(p_spatial) != NULL && Object::cast_to<SoftBody>(p_spatial) == NULL;
-}
-
-String MeshInstanceSpatialGizmoPlugin::get_name() const {
- return "MeshInstance";
-}
-
-int MeshInstanceSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-bool MeshInstanceSpatialGizmoPlugin::can_be_hidden() const {
- return false;
-}
-
-void MeshInstanceSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- MeshInstance *mesh = Object::cast_to<MeshInstance>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Ref<Mesh> m = mesh->get_mesh();
-
- if (!m.is_valid())
- return; //none
-
- Ref<TriangleMesh> tm = m->generate_triangle_mesh();
- if (tm.is_valid()) {
- p_gizmo->add_collision_triangles(tm);
- }
-}
-
-/////
-Sprite3DSpatialGizmoPlugin::Sprite3DSpatialGizmoPlugin() {
-}
-
-bool Sprite3DSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<Sprite3D>(p_spatial) != NULL;
-}
-
-String Sprite3DSpatialGizmoPlugin::get_name() const {
- return "Sprite3D";
-}
-
-int Sprite3DSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-bool Sprite3DSpatialGizmoPlugin::can_be_hidden() const {
- return false;
-}
-
-void Sprite3DSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- Sprite3D *sprite = Object::cast_to<Sprite3D>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Ref<TriangleMesh> tm = sprite->generate_triangle_mesh();
- if (tm.is_valid()) {
- p_gizmo->add_collision_triangles(tm);
- }
-}
-
-///
-
-Position3DSpatialGizmoPlugin::Position3DSpatialGizmoPlugin() {
- pos3d_mesh = Ref<ArrayMesh>(memnew(ArrayMesh));
- cursor_points = Vector<Vector3>();
-
- PoolVector<Color> cursor_colors;
- float cs = 0.25;
- cursor_points.push_back(Vector3(+cs, 0, 0));
- cursor_points.push_back(Vector3(-cs, 0, 0));
- cursor_points.push_back(Vector3(0, +cs, 0));
- cursor_points.push_back(Vector3(0, -cs, 0));
- cursor_points.push_back(Vector3(0, 0, +cs));
- cursor_points.push_back(Vector3(0, 0, -cs));
- cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_color("axis_x_color", "Editor"));
- cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_color("axis_x_color", "Editor"));
- cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_color("axis_y_color", "Editor"));
- cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_color("axis_y_color", "Editor"));
- cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_color("axis_z_color", "Editor"));
- cursor_colors.push_back(EditorNode::get_singleton()->get_gui_base()->get_color("axis_z_color", "Editor"));
-
- Ref<SpatialMaterial> mat = memnew(SpatialMaterial);
- mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
- mat->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
- mat->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true);
- mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
- mat->set_line_width(3);
- Array d;
- d.resize(VS::ARRAY_MAX);
- d[Mesh::ARRAY_VERTEX] = cursor_points;
- d[Mesh::ARRAY_COLOR] = cursor_colors;
- pos3d_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, d);
- pos3d_mesh->surface_set_material(0, mat);
-}
-
-bool Position3DSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<Position3D>(p_spatial) != NULL;
-}
-
-String Position3DSpatialGizmoPlugin::get_name() const {
- return "Position3D";
-}
-
-int Position3DSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void Position3DSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- p_gizmo->clear();
- p_gizmo->add_mesh(pos3d_mesh);
- p_gizmo->add_collision_segments(cursor_points);
-}
-
-/////
-
-SkeletonSpatialGizmoPlugin::SkeletonSpatialGizmoPlugin() {
-
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/skeleton", Color(1, 0.8, 0.4));
- create_material("skeleton_material", gizmo_color);
-}
-
-bool SkeletonSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<Skeleton>(p_spatial) != NULL;
-}
-
-String SkeletonSpatialGizmoPlugin::get_name() const {
- return "Skeleton";
-}
-
-int SkeletonSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void SkeletonSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- Skeleton *skel = Object::cast_to<Skeleton>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Ref<Material> material = get_material("skeleton_material", p_gizmo);
-
- Ref<SurfaceTool> surface_tool(memnew(SurfaceTool));
-
- surface_tool->begin(Mesh::PRIMITIVE_LINES);
- surface_tool->set_material(material);
- Vector<Transform> grests;
- grests.resize(skel->get_bone_count());
-
- Vector<int> bones;
- Vector<float> weights;
- bones.resize(4);
- weights.resize(4);
-
- for (int i = 0; i < 4; i++) {
- bones.write[i] = 0;
- weights.write[i] = 0;
- }
-
- weights.write[0] = 1;
-
- AABB aabb;
-
- Color bonecolor = Color(1.0, 0.4, 0.4, 0.3);
- Color rootcolor = Color(0.4, 1.0, 0.4, 0.1);
-
- for (int i_bone = 0; i_bone < skel->get_bone_count(); i_bone++) {
-
- int i = skel->get_process_order(i_bone);
-
- int parent = skel->get_bone_parent(i);
-
- if (parent >= 0) {
- grests.write[i] = grests[parent] * skel->get_bone_rest(i);
-
- Vector3 v0 = grests[parent].origin;
- Vector3 v1 = grests[i].origin;
- Vector3 d = (v1 - v0).normalized();
- float dist = v0.distance_to(v1);
-
- //find closest axis
- int closest = -1;
- float closest_d = 0.0;
-
- for (int j = 0; j < 3; j++) {
- float dp = Math::abs(grests[parent].basis[j].normalized().dot(d));
- if (j == 0 || dp > closest_d)
- closest = j;
- }
-
- //find closest other
- Vector3 first;
- Vector3 points[4];
- int pointidx = 0;
- for (int j = 0; j < 3; j++) {
-
- bones.write[0] = parent;
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(rootcolor);
- surface_tool->add_vertex(v0 - grests[parent].basis[j].normalized() * dist * 0.05);
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(rootcolor);
- surface_tool->add_vertex(v0 + grests[parent].basis[j].normalized() * dist * 0.05);
-
- if (j == closest)
- continue;
-
- Vector3 axis;
- if (first == Vector3()) {
- axis = d.cross(d.cross(grests[parent].basis[j])).normalized();
- first = axis;
- } else {
- axis = d.cross(first).normalized();
- }
-
- for (int k = 0; k < 2; k++) {
-
- if (k == 1)
- axis = -axis;
- Vector3 point = v0 + d * dist * 0.2;
- point += axis * dist * 0.1;
-
- bones.write[0] = parent;
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(bonecolor);
- surface_tool->add_vertex(v0);
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(bonecolor);
- surface_tool->add_vertex(point);
-
- bones.write[0] = parent;
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(bonecolor);
- surface_tool->add_vertex(point);
- bones.write[0] = i;
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(bonecolor);
- surface_tool->add_vertex(v1);
- points[pointidx++] = point;
- }
- }
-
- SWAP(points[1], points[2]);
- for (int j = 0; j < 4; j++) {
-
- bones.write[0] = parent;
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(bonecolor);
- surface_tool->add_vertex(points[j]);
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(bonecolor);
- surface_tool->add_vertex(points[(j + 1) % 4]);
- }
-
- /*
- bones[0]=parent;
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(Color(0.4,1,0.4,0.4));
- surface_tool->add_vertex(v0);
- bones[0]=i;
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(Color(0.4,1,0.4,0.4));
- surface_tool->add_vertex(v1);
-*/
- } else {
-
- grests.write[i] = skel->get_bone_rest(i);
- bones.write[0] = i;
- }
- /*
- Transform t = grests[i];
- t.orthonormalize();
-
- for (int i=0;i<6;i++) {
-
-
- Vector3 face_points[4];
-
- for (int j=0;j<4;j++) {
-
- float v[3];
- v[0]=1.0;
- v[1]=1-2*((j>>1)&1);
- v[2]=v[1]*(1-2*(j&1));
-
- for (int k=0;k<3;k++) {
-
- if (i<3)
- face_points[j][(i+k)%3]=v[k]*(i>=3?-1:1);
- else
- face_points[3-j][(i+k)%3]=v[k]*(i>=3?-1:1);
- }
- }
-
- for(int j=0;j<4;j++) {
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(Color(1.0,0.4,0.4,0.4));
- surface_tool->add_vertex(t.xform(face_points[j]*0.04));
- surface_tool->add_bones(bones);
- surface_tool->add_weights(weights);
- surface_tool->add_color(Color(1.0,0.4,0.4,0.4));
- surface_tool->add_vertex(t.xform(face_points[(j+1)%4]*0.04));
- }
-
- }
- */
- }
-
- Ref<ArrayMesh> m = surface_tool->commit();
- p_gizmo->add_mesh(m, false, skel->register_skin(Ref<Skin>()));
-}
-
-////
-
-PhysicalBoneSpatialGizmoPlugin::PhysicalBoneSpatialGizmoPlugin() {
- create_material("joint_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1)));
-}
-
-bool PhysicalBoneSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<PhysicalBone>(p_spatial) != NULL;
-}
-
-String PhysicalBoneSpatialGizmoPlugin::get_name() const {
- return "PhysicalBones";
-}
-
-int PhysicalBoneSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void PhysicalBoneSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- p_gizmo->clear();
-
- PhysicalBone *physical_bone = Object::cast_to<PhysicalBone>(p_gizmo->get_spatial_node());
-
- if (!physical_bone)
- return;
-
- Skeleton *sk(physical_bone->find_skeleton_parent());
- if (!sk)
- return;
-
- PhysicalBone *pb(sk->get_physical_bone(physical_bone->get_bone_id()));
- if (!pb)
- return;
-
- PhysicalBone *pbp(sk->get_physical_bone_parent(physical_bone->get_bone_id()));
- if (!pbp)
- return;
-
- Vector<Vector3> points;
-
- switch (physical_bone->get_joint_type()) {
- case PhysicalBone::JOINT_TYPE_PIN: {
-
- JointSpatialGizmoPlugin::CreatePinJointGizmo(physical_bone->get_joint_offset(), points);
- } break;
- case PhysicalBone::JOINT_TYPE_CONE: {
-
- const PhysicalBone::ConeJointData *cjd(static_cast<const PhysicalBone::ConeJointData *>(physical_bone->get_joint_data()));
- JointSpatialGizmoPlugin::CreateConeTwistJointGizmo(
- physical_bone->get_joint_offset(),
- physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
- pb->get_global_transform(),
- pbp->get_global_transform(),
- cjd->swing_span,
- cjd->twist_span,
- &points,
- &points);
- } break;
- case PhysicalBone::JOINT_TYPE_HINGE: {
-
- const PhysicalBone::HingeJointData *hjd(static_cast<const PhysicalBone::HingeJointData *>(physical_bone->get_joint_data()));
- JointSpatialGizmoPlugin::CreateHingeJointGizmo(
- physical_bone->get_joint_offset(),
- physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
- pb->get_global_transform(),
- pbp->get_global_transform(),
- hjd->angular_limit_lower,
- hjd->angular_limit_upper,
- hjd->angular_limit_enabled,
- points,
- &points,
- &points);
- } break;
- case PhysicalBone::JOINT_TYPE_SLIDER: {
-
- const PhysicalBone::SliderJointData *sjd(static_cast<const PhysicalBone::SliderJointData *>(physical_bone->get_joint_data()));
- JointSpatialGizmoPlugin::CreateSliderJointGizmo(
- physical_bone->get_joint_offset(),
- physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
- pb->get_global_transform(),
- pbp->get_global_transform(),
- sjd->angular_limit_lower,
- sjd->angular_limit_upper,
- sjd->linear_limit_lower,
- sjd->linear_limit_upper,
- points,
- &points,
- &points);
- } break;
- case PhysicalBone::JOINT_TYPE_6DOF: {
-
- const PhysicalBone::SixDOFJointData *sdofjd(static_cast<const PhysicalBone::SixDOFJointData *>(physical_bone->get_joint_data()));
- JointSpatialGizmoPlugin::CreateGeneric6DOFJointGizmo(
- physical_bone->get_joint_offset(),
-
- physical_bone->get_global_transform() * physical_bone->get_joint_offset(),
- pb->get_global_transform(),
- pbp->get_global_transform(),
-
- sdofjd->axis_data[0].angular_limit_lower,
- sdofjd->axis_data[0].angular_limit_upper,
- sdofjd->axis_data[0].linear_limit_lower,
- sdofjd->axis_data[0].linear_limit_upper,
- sdofjd->axis_data[0].angular_limit_enabled,
- sdofjd->axis_data[0].linear_limit_enabled,
-
- sdofjd->axis_data[1].angular_limit_lower,
- sdofjd->axis_data[1].angular_limit_upper,
- sdofjd->axis_data[1].linear_limit_lower,
- sdofjd->axis_data[1].linear_limit_upper,
- sdofjd->axis_data[1].angular_limit_enabled,
- sdofjd->axis_data[1].linear_limit_enabled,
-
- sdofjd->axis_data[2].angular_limit_lower,
- sdofjd->axis_data[2].angular_limit_upper,
- sdofjd->axis_data[2].linear_limit_lower,
- sdofjd->axis_data[2].linear_limit_upper,
- sdofjd->axis_data[2].angular_limit_enabled,
- sdofjd->axis_data[2].linear_limit_enabled,
-
- points,
- &points,
- &points);
- } break;
- default:
- return;
- }
-
- Ref<Material> material = get_material("joint_material", p_gizmo);
-
- p_gizmo->add_collision_segments(points);
- p_gizmo->add_lines(points, material);
-}
-
-/////
-
-RayCastSpatialGizmoPlugin::RayCastSpatialGizmoPlugin() {
-
- const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
- create_material("shape_material", gizmo_color);
- const float gizmo_value = gizmo_color.get_v();
- const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
- create_material("shape_material_disabled", gizmo_color_disabled);
-}
-
-bool RayCastSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<RayCast>(p_spatial) != NULL;
-}
-
-String RayCastSpatialGizmoPlugin::get_name() const {
- return "RayCast";
-}
-
-int RayCastSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void RayCastSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- RayCast *raycast = Object::cast_to<RayCast>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
-
- lines.push_back(Vector3());
- lines.push_back(raycast->get_cast_to());
-
- const Ref<SpatialMaterial> material =
- get_material(raycast->is_enabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
-}
-
-/////
-
-void SpringArmSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- SpringArm *spring_arm = Object::cast_to<SpringArm>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
-
- lines.push_back(Vector3());
- lines.push_back(Vector3(0, 0, 1.0) * spring_arm->get_length());
-
- Ref<SpatialMaterial> material = get_material("shape_material", p_gizmo);
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
-}
-
-SpringArmSpatialGizmoPlugin::SpringArmSpatialGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
- create_material("shape_material", gizmo_color);
-}
-
-bool SpringArmSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<SpringArm>(p_spatial) != NULL;
-}
-
-String SpringArmSpatialGizmoPlugin::get_name() const {
- return "SpringArm";
-}
-
-int SpringArmSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-/////
-
-VehicleWheelSpatialGizmoPlugin::VehicleWheelSpatialGizmoPlugin() {
-
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
- create_material("shape_material", gizmo_color);
-}
-
-bool VehicleWheelSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<VehicleWheel>(p_spatial) != NULL;
-}
-
-String VehicleWheelSpatialGizmoPlugin::get_name() const {
- return "VehicleWheel";
-}
-
-int VehicleWheelSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void VehicleWheelSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- VehicleWheel *car_wheel = Object::cast_to<VehicleWheel>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector3> points;
-
- float r = car_wheel->get_radius();
- const int skip = 10;
- for (int i = 0; i <= 360; i += skip) {
-
- float ra = Math::deg2rad((float)i);
- float rb = Math::deg2rad((float)i + skip);
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
-
- points.push_back(Vector3(0, a.x, a.y));
- points.push_back(Vector3(0, b.x, b.y));
-
- const int springsec = 4;
-
- for (int j = 0; j < springsec; j++) {
- float t = car_wheel->get_suspension_rest_length() * 5;
- points.push_back(Vector3(a.x, i / 360.0 * t / springsec + j * (t / springsec), a.y) * 0.2);
- points.push_back(Vector3(b.x, (i + skip) / 360.0 * t / springsec + j * (t / springsec), b.y) * 0.2);
- }
- }
-
- //travel
- points.push_back(Vector3(0, 0, 0));
- points.push_back(Vector3(0, car_wheel->get_suspension_rest_length(), 0));
-
- //axis
- points.push_back(Vector3(r * 0.2, car_wheel->get_suspension_rest_length(), 0));
- points.push_back(Vector3(-r * 0.2, car_wheel->get_suspension_rest_length(), 0));
- //axis
- points.push_back(Vector3(r * 0.2, 0, 0));
- points.push_back(Vector3(-r * 0.2, 0, 0));
-
- //forward line
- points.push_back(Vector3(0, -r, 0));
- points.push_back(Vector3(0, -r, r * 2));
- points.push_back(Vector3(0, -r, r * 2));
- points.push_back(Vector3(r * 2 * 0.2, -r, r * 2 * 0.8));
- points.push_back(Vector3(0, -r, r * 2));
- points.push_back(Vector3(-r * 2 * 0.2, -r, r * 2 * 0.8));
-
- Ref<Material> material = get_material("shape_material", p_gizmo);
-
- p_gizmo->add_lines(points, material);
- p_gizmo->add_collision_segments(points);
-}
-
-///////////
-
-SoftBodySpatialGizmoPlugin::SoftBodySpatialGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
- create_material("shape_material", gizmo_color);
- create_handle_material("handles");
-}
-
-bool SoftBodySpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<SoftBody>(p_spatial) != NULL;
-}
-
-String SoftBodySpatialGizmoPlugin::get_name() const {
- return "SoftBody";
-}
-
-int SoftBodySpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-bool SoftBodySpatialGizmoPlugin::is_selectable_when_hidden() const {
- return true;
-}
-
-void SoftBodySpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
- SoftBody *soft_body = Object::cast_to<SoftBody>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- if (!soft_body || soft_body->get_mesh().is_null()) {
- return;
- }
-
- // find mesh
-
- Vector<Vector3> lines;
-
- soft_body->get_mesh()->generate_debug_mesh_lines(lines);
-
- if (!lines.size()) {
- return;
- }
-
- Ref<TriangleMesh> tm = soft_body->get_mesh()->generate_triangle_mesh();
-
- Vector<Vector3> points;
- soft_body->get_mesh()->generate_debug_mesh_indices(points);
-
- Ref<Material> material = get_material("shape_material", p_gizmo);
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_handles(points, get_material("handles"));
- p_gizmo->add_collision_triangles(tm);
-}
-
-String SoftBodySpatialGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
- return "SoftBody pin point";
-}
-
-Variant SoftBodySpatialGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
- SoftBody *soft_body = Object::cast_to<SoftBody>(p_gizmo->get_spatial_node());
- return Variant(soft_body->is_point_pinned(p_idx));
-}
-
-void SoftBodySpatialGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
- SoftBody *soft_body = Object::cast_to<SoftBody>(p_gizmo->get_spatial_node());
- soft_body->pin_point_toggle(p_idx);
-}
-
-bool SoftBodySpatialGizmoPlugin::is_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int idx) const {
- SoftBody *soft_body = Object::cast_to<SoftBody>(p_gizmo->get_spatial_node());
- return soft_body->is_point_pinned(idx);
-}
-
-///////////
-
-VisibilityNotifierGizmoPlugin::VisibilityNotifierGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/visibility_notifier", Color(0.8, 0.5, 0.7));
- create_material("visibility_notifier_material", gizmo_color);
- gizmo_color.a = 0.1;
- create_material("visibility_notifier_solid_material", gizmo_color);
- create_handle_material("handles");
-}
-
-bool VisibilityNotifierGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<VisibilityNotifier>(p_spatial) != NULL;
-}
-
-String VisibilityNotifierGizmoPlugin::get_name() const {
- return "VisibilityNotifier";
-}
-
-int VisibilityNotifierGizmoPlugin::get_priority() const {
- return -1;
-}
-
-String VisibilityNotifierGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- switch (p_idx) {
- case 0: return "Size X";
- case 1: return "Size Y";
- case 2: return "Size Z";
- case 3: return "Pos X";
- case 4: return "Pos Y";
- case 5: return "Pos Z";
- }
-
- return "";
-}
-
-Variant VisibilityNotifierGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- VisibilityNotifier *notifier = Object::cast_to<VisibilityNotifier>(p_gizmo->get_spatial_node());
- return notifier->get_aabb();
-}
-void VisibilityNotifierGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- VisibilityNotifier *notifier = Object::cast_to<VisibilityNotifier>(p_gizmo->get_spatial_node());
-
- Transform gt = notifier->get_global_transform();
-
- Transform gi = gt.affine_inverse();
-
- bool move = p_idx >= 3;
- p_idx = p_idx % 3;
-
- AABB aabb = notifier->get_aabb();
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
-
- Vector3 ofs = aabb.position + aabb.size * 0.5;
-
- Vector3 axis;
- axis[p_idx] = 1.0;
-
- if (move) {
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(ofs - axis * 4096, ofs + axis * 4096, sg[0], sg[1], ra, rb);
-
- float d = ra[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- aabb.position[p_idx] = d - 1.0 - aabb.size[p_idx] * 0.5;
- notifier->set_aabb(aabb);
-
- } else {
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(ofs, ofs + axis * 4096, sg[0], sg[1], ra, rb);
-
- float d = ra[p_idx] - ofs[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
- //resize
- aabb.position[p_idx] = (aabb.position[p_idx] + aabb.size[p_idx] * 0.5) - d;
- aabb.size[p_idx] = d * 2;
- notifier->set_aabb(aabb);
- }
-}
-
-void VisibilityNotifierGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- VisibilityNotifier *notifier = Object::cast_to<VisibilityNotifier>(p_gizmo->get_spatial_node());
-
- if (p_cancel) {
- notifier->set_aabb(p_restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Notifier AABB"));
- ur->add_do_method(notifier, "set_aabb", notifier->get_aabb());
- ur->add_undo_method(notifier, "set_aabb", p_restore);
- ur->commit_action();
-}
-
-void VisibilityNotifierGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- VisibilityNotifier *notifier = Object::cast_to<VisibilityNotifier>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
- AABB aabb = notifier->get_aabb();
-
- for (int i = 0; i < 12; i++) {
- Vector3 a, b;
- aabb.get_edge(i, a, b);
- lines.push_back(a);
- lines.push_back(b);
- }
-
- Vector<Vector3> handles;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = aabb.position[i] + aabb.size[i];
- ax[(i + 1) % 3] = aabb.position[(i + 1) % 3] + aabb.size[(i + 1) % 3] * 0.5;
- ax[(i + 2) % 3] = aabb.position[(i + 2) % 3] + aabb.size[(i + 2) % 3] * 0.5;
- handles.push_back(ax);
- }
-
- Vector3 center = aabb.position + aabb.size * 0.5;
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = 1.0;
- handles.push_back(center + ax);
- lines.push_back(center);
- lines.push_back(center + ax);
- }
-
- Ref<Material> material = get_material("visibility_notifier_material", p_gizmo);
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
-
- if (p_gizmo->is_selected()) {
- Ref<Material> solid_material = get_material("visibility_notifier_solid_material", p_gizmo);
- p_gizmo->add_solid_box(solid_material, aabb.get_size(), aabb.get_position() + aabb.get_size() / 2.0);
- }
-
- p_gizmo->add_handles(handles, get_material("handles"));
-}
-
-////
-
-CPUParticlesGizmoPlugin::CPUParticlesGizmoPlugin() {
- create_icon_material("particles_icon", SpatialEditor::get_singleton()->get_icon("GizmoCPUParticles", "EditorIcons"));
-}
-
-bool CPUParticlesGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<CPUParticles>(p_spatial) != NULL;
-}
-
-String CPUParticlesGizmoPlugin::get_name() const {
- return "CPUParticles";
-}
-
-int CPUParticlesGizmoPlugin::get_priority() const {
- return -1;
-}
-
-bool CPUParticlesGizmoPlugin::is_selectable_when_hidden() const {
- return true;
-}
-
-void CPUParticlesGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
- Ref<Material> icon = get_material("particles_icon", p_gizmo);
- p_gizmo->add_unscaled_billboard(icon, 0.05);
-}
-
-////
-
-ParticlesGizmoPlugin::ParticlesGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/particles", Color(0.8, 0.7, 0.4));
- create_material("particles_material", gizmo_color);
- gizmo_color.a = 0.1;
- create_material("particles_solid_material", gizmo_color);
- create_icon_material("particles_icon", SpatialEditor::get_singleton()->get_icon("GizmoParticles", "EditorIcons"));
- create_handle_material("handles");
-}
-
-bool ParticlesGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<Particles>(p_spatial) != NULL;
-}
-
-String ParticlesGizmoPlugin::get_name() const {
- return "Particles";
-}
-
-int ParticlesGizmoPlugin::get_priority() const {
- return -1;
-}
-
-bool ParticlesGizmoPlugin::is_selectable_when_hidden() const {
- return true;
-}
-
-String ParticlesGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- switch (p_idx) {
- case 0: return "Size X";
- case 1: return "Size Y";
- case 2: return "Size Z";
- case 3: return "Pos X";
- case 4: return "Pos Y";
- case 5: return "Pos Z";
- }
-
- return "";
-}
-Variant ParticlesGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- Particles *particles = Object::cast_to<Particles>(p_gizmo->get_spatial_node());
- return particles->get_visibility_aabb();
-}
-void ParticlesGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- Particles *particles = Object::cast_to<Particles>(p_gizmo->get_spatial_node());
-
- Transform gt = particles->get_global_transform();
- Transform gi = gt.affine_inverse();
-
- bool move = p_idx >= 3;
- p_idx = p_idx % 3;
-
- AABB aabb = particles->get_visibility_aabb();
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
-
- Vector3 ofs = aabb.position + aabb.size * 0.5;
-
- Vector3 axis;
- axis[p_idx] = 1.0;
-
- if (move) {
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(ofs - axis * 4096, ofs + axis * 4096, sg[0], sg[1], ra, rb);
-
- float d = ra[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- aabb.position[p_idx] = d - 1.0 - aabb.size[p_idx] * 0.5;
- particles->set_visibility_aabb(aabb);
-
- } else {
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(ofs, ofs + axis * 4096, sg[0], sg[1], ra, rb);
-
- float d = ra[p_idx] - ofs[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
- //resize
- aabb.position[p_idx] = (aabb.position[p_idx] + aabb.size[p_idx] * 0.5) - d;
- aabb.size[p_idx] = d * 2;
- particles->set_visibility_aabb(aabb);
- }
-}
-
-void ParticlesGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- Particles *particles = Object::cast_to<Particles>(p_gizmo->get_spatial_node());
-
- if (p_cancel) {
- particles->set_visibility_aabb(p_restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Particles AABB"));
- ur->add_do_method(particles, "set_visibility_aabb", particles->get_visibility_aabb());
- ur->add_undo_method(particles, "set_visibility_aabb", p_restore);
- ur->commit_action();
-}
-
-void ParticlesGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- Particles *particles = Object::cast_to<Particles>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
- AABB aabb = particles->get_visibility_aabb();
-
- for (int i = 0; i < 12; i++) {
- Vector3 a, b;
- aabb.get_edge(i, a, b);
- lines.push_back(a);
- lines.push_back(b);
- }
-
- Vector<Vector3> handles;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = aabb.position[i] + aabb.size[i];
- ax[(i + 1) % 3] = aabb.position[(i + 1) % 3] + aabb.size[(i + 1) % 3] * 0.5;
- ax[(i + 2) % 3] = aabb.position[(i + 2) % 3] + aabb.size[(i + 2) % 3] * 0.5;
- handles.push_back(ax);
- }
-
- Vector3 center = aabb.position + aabb.size * 0.5;
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = 1.0;
- handles.push_back(center + ax);
- lines.push_back(center);
- lines.push_back(center + ax);
- }
-
- Ref<Material> material = get_material("particles_material", p_gizmo);
- Ref<Material> icon = get_material("particles_icon", p_gizmo);
-
- p_gizmo->add_lines(lines, material);
-
- if (p_gizmo->is_selected()) {
- Ref<Material> solid_material = get_material("particles_solid_material", p_gizmo);
- p_gizmo->add_solid_box(solid_material, aabb.get_size(), aabb.get_position() + aabb.get_size() / 2.0);
- }
-
- p_gizmo->add_handles(handles, get_material("handles"));
- p_gizmo->add_unscaled_billboard(icon, 0.05);
-}
-////
-
-ReflectionProbeGizmoPlugin::ReflectionProbeGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/reflection_probe", Color(0.6, 1, 0.5));
-
- create_material("reflection_probe_material", gizmo_color);
-
- gizmo_color.a = 0.5;
- create_material("reflection_internal_material", gizmo_color);
-
- gizmo_color.a = 0.1;
- create_material("reflection_probe_solid_material", gizmo_color);
-
- create_icon_material("reflection_probe_icon", SpatialEditor::get_singleton()->get_icon("GizmoReflectionProbe", "EditorIcons"));
- create_handle_material("handles");
-}
-
-bool ReflectionProbeGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<ReflectionProbe>(p_spatial) != NULL;
-}
-
-String ReflectionProbeGizmoPlugin::get_name() const {
- return "ReflectionProbe";
-}
-
-int ReflectionProbeGizmoPlugin::get_priority() const {
- return -1;
-}
-
-String ReflectionProbeGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- switch (p_idx) {
- case 0: return "Extents X";
- case 1: return "Extents Y";
- case 2: return "Extents Z";
- case 3: return "Origin X";
- case 4: return "Origin Y";
- case 5: return "Origin Z";
- }
-
- return "";
-}
-Variant ReflectionProbeGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
- return AABB(probe->get_extents(), probe->get_origin_offset());
-}
-void ReflectionProbeGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
- Transform gt = probe->get_global_transform();
-
- Transform gi = gt.affine_inverse();
-
- if (p_idx < 3) {
- Vector3 extents = probe->get_extents();
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
-
- Vector3 axis;
- axis[p_idx] = 1.0;
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), axis * 16384, sg[0], sg[1], ra, rb);
- float d = ra[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- extents[p_idx] = d;
- probe->set_extents(extents);
- } else {
-
- p_idx -= 3;
-
- Vector3 origin = probe->get_origin_offset();
- origin[p_idx] = 0;
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
-
- Vector3 axis;
- axis[p_idx] = 1.0;
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(origin - axis * 16384, origin + axis * 16384, sg[0], sg[1], ra, rb);
- // Adjust the actual position to account for the gizmo handle position
- float d = ra[p_idx] + 0.25;
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- origin[p_idx] = d;
- probe->set_origin_offset(origin);
- }
-}
-
-void ReflectionProbeGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
-
- AABB restore = p_restore;
-
- if (p_cancel) {
- probe->set_extents(restore.position);
- probe->set_origin_offset(restore.size);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Probe Extents"));
- ur->add_do_method(probe, "set_extents", probe->get_extents());
- ur->add_do_method(probe, "set_origin_offset", probe->get_origin_offset());
- ur->add_undo_method(probe, "set_extents", restore.position);
- ur->add_undo_method(probe, "set_origin_offset", restore.size);
- ur->commit_action();
-}
-
-void ReflectionProbeGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- ReflectionProbe *probe = Object::cast_to<ReflectionProbe>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
- Vector<Vector3> internal_lines;
- Vector3 extents = probe->get_extents();
-
- AABB aabb;
- aabb.position = -extents;
- aabb.size = extents * 2;
-
- for (int i = 0; i < 12; i++) {
- Vector3 a, b;
- aabb.get_edge(i, a, b);
- lines.push_back(a);
- lines.push_back(b);
- }
-
- for (int i = 0; i < 8; i++) {
- Vector3 ep = aabb.get_endpoint(i);
- internal_lines.push_back(probe->get_origin_offset());
- internal_lines.push_back(ep);
- }
-
- Vector<Vector3> handles;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = aabb.position[i] + aabb.size[i];
- handles.push_back(ax);
- }
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 orig_handle = probe->get_origin_offset();
- orig_handle[i] -= 0.25;
- lines.push_back(orig_handle);
- handles.push_back(orig_handle);
-
- orig_handle[i] += 0.5;
- lines.push_back(orig_handle);
- }
-
- Ref<Material> material = get_material("reflection_probe_material", p_gizmo);
- Ref<Material> material_internal = get_material("reflection_internal_material", p_gizmo);
- Ref<Material> icon = get_material("reflection_probe_icon", p_gizmo);
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_lines(internal_lines, material_internal);
-
- if (p_gizmo->is_selected()) {
- Ref<Material> solid_material = get_material("reflection_probe_solid_material", p_gizmo);
- p_gizmo->add_solid_box(solid_material, probe->get_extents() * 2.0);
- }
-
- p_gizmo->add_unscaled_billboard(icon, 0.05);
- p_gizmo->add_handles(handles, get_material("handles"));
-}
-
-GIProbeGizmoPlugin::GIProbeGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/gi_probe", Color(0.5, 1, 0.6));
-
- create_material("gi_probe_material", gizmo_color);
-
- gizmo_color.a = 0.5;
- create_material("gi_probe_internal_material", gizmo_color);
-
- gizmo_color.a = 0.1;
- create_material("gi_probe_solid_material", gizmo_color);
-
- create_icon_material("gi_probe_icon", SpatialEditor::get_singleton()->get_icon("GizmoGIProbe", "EditorIcons"));
- create_handle_material("handles");
-}
-
-bool GIProbeGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<GIProbe>(p_spatial) != NULL;
-}
-
-String GIProbeGizmoPlugin::get_name() const {
- return "GIProbe";
-}
-
-int GIProbeGizmoPlugin::get_priority() const {
- return -1;
-}
-
-String GIProbeGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- switch (p_idx) {
- case 0: return "Extents X";
- case 1: return "Extents Y";
- case 2: return "Extents Z";
- }
-
- return "";
-}
-Variant GIProbeGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
- return probe->get_extents();
-}
-void GIProbeGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
-
- Transform gt = probe->get_global_transform();
- Transform gi = gt.affine_inverse();
-
- Vector3 extents = probe->get_extents();
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
-
- Vector3 axis;
- axis[p_idx] = 1.0;
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), axis * 16384, sg[0], sg[1], ra, rb);
- float d = ra[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- extents[p_idx] = d;
- probe->set_extents(extents);
-}
-
-void GIProbeGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
-
- Vector3 restore = p_restore;
-
- if (p_cancel) {
- probe->set_extents(restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Probe Extents"));
- ur->add_do_method(probe, "set_extents", probe->get_extents());
- ur->add_undo_method(probe, "set_extents", restore);
- ur->commit_action();
-}
-
-void GIProbeGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- GIProbe *probe = Object::cast_to<GIProbe>(p_gizmo->get_spatial_node());
-
- Ref<Material> material = get_material("gi_probe_material", p_gizmo);
- Ref<Material> icon = get_material("gi_probe_icon", p_gizmo);
- Ref<Material> material_internal = get_material("gi_probe_internal_material", p_gizmo);
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
- Vector3 extents = probe->get_extents();
-
- static const int subdivs[GIProbe::SUBDIV_MAX] = { 64, 128, 256, 512 };
-
- AABB aabb = AABB(-extents, extents * 2);
- int subdiv = subdivs[probe->get_subdiv()];
- float cell_size = aabb.get_longest_axis_size() / subdiv;
-
- for (int i = 0; i < 12; i++) {
- Vector3 a, b;
- aabb.get_edge(i, a, b);
- lines.push_back(a);
- lines.push_back(b);
- }
-
- p_gizmo->add_lines(lines, material);
-
- lines.clear();
-
- for (int i = 1; i < subdiv; i++) {
-
- for (int j = 0; j < 3; j++) {
-
- if (cell_size * i > aabb.size[j]) {
- continue;
- }
-
- Vector2 dir;
- dir[j] = 1.0;
- Vector2 ta, tb;
- int j_n1 = (j + 1) % 3;
- int j_n2 = (j + 2) % 3;
- ta[j_n1] = 1.0;
- tb[j_n2] = 1.0;
-
- for (int k = 0; k < 4; k++) {
-
- Vector3 from = aabb.position, to = aabb.position;
- from[j] += cell_size * i;
- to[j] += cell_size * i;
-
- if (k & 1) {
- to[j_n1] += aabb.size[j_n1];
- } else {
-
- to[j_n2] += aabb.size[j_n2];
- }
-
- if (k & 2) {
- from[j_n1] += aabb.size[j_n1];
- from[j_n2] += aabb.size[j_n2];
- }
-
- lines.push_back(from);
- lines.push_back(to);
- }
- }
- }
-
- p_gizmo->add_lines(lines, material_internal);
-
- Vector<Vector3> handles;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = aabb.position[i] + aabb.size[i];
- handles.push_back(ax);
- }
-
- if (p_gizmo->is_selected()) {
- Ref<Material> solid_material = get_material("gi_probe_solid_material", p_gizmo);
- p_gizmo->add_solid_box(solid_material, aabb.get_size());
- }
-
- p_gizmo->add_unscaled_billboard(icon, 0.05);
- p_gizmo->add_handles(handles, get_material("handles"));
-}
-
-////
-
-BakedIndirectLightGizmoPlugin::BakedIndirectLightGizmoPlugin() {
- Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/baked_indirect_light", Color(0.5, 0.6, 1));
-
- create_material("baked_indirect_light_material", gizmo_color);
-
- gizmo_color.a = 0.1;
- create_material("baked_indirect_light_internal_material", gizmo_color);
-
- create_icon_material("baked_indirect_light_icon", SpatialEditor::get_singleton()->get_icon("GizmoBakedLightmap", "EditorIcons"));
- create_handle_material("handles");
-}
-
-String BakedIndirectLightGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- switch (p_idx) {
- case 0: return "Extents X";
- case 1: return "Extents Y";
- case 2: return "Extents Z";
- }
-
- return "";
-}
-Variant BakedIndirectLightGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- BakedLightmap *baker = Object::cast_to<BakedLightmap>(p_gizmo->get_spatial_node());
- return baker->get_extents();
-}
-void BakedIndirectLightGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- BakedLightmap *baker = Object::cast_to<BakedLightmap>(p_gizmo->get_spatial_node());
-
- Transform gt = baker->get_global_transform();
- Transform gi = gt.affine_inverse();
-
- Vector3 extents = baker->get_extents();
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) };
-
- Vector3 axis;
- axis[p_idx] = 1.0;
-
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), axis * 16384, sg[0], sg[1], ra, rb);
- float d = ra[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- extents[p_idx] = d;
- baker->set_extents(extents);
-}
-
-void BakedIndirectLightGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- BakedLightmap *baker = Object::cast_to<BakedLightmap>(p_gizmo->get_spatial_node());
-
- Vector3 restore = p_restore;
-
- if (p_cancel) {
- baker->set_extents(restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Probe Extents"));
- ur->add_do_method(baker, "set_extents", baker->get_extents());
- ur->add_undo_method(baker, "set_extents", restore);
- ur->commit_action();
-}
-
-bool BakedIndirectLightGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<BakedLightmap>(p_spatial) != NULL;
-}
-
-String BakedIndirectLightGizmoPlugin::get_name() const {
- return "BakedLightmap";
-}
-
-int BakedIndirectLightGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void BakedIndirectLightGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- BakedLightmap *baker = Object::cast_to<BakedLightmap>(p_gizmo->get_spatial_node());
-
- Ref<Material> material = get_material("baked_indirect_light_material", p_gizmo);
- Ref<Material> icon = get_material("baked_indirect_light_icon", p_gizmo);
- Ref<Material> material_internal = get_material("baked_indirect_light_internal_material", p_gizmo);
-
- p_gizmo->clear();
-
- Vector<Vector3> lines;
- Vector3 extents = baker->get_extents();
-
- AABB aabb = AABB(-extents, extents * 2);
-
- for (int i = 0; i < 12; i++) {
- Vector3 a, b;
- aabb.get_edge(i, a, b);
- lines.push_back(a);
- lines.push_back(b);
- }
-
- p_gizmo->add_lines(lines, material);
-
- Vector<Vector3> handles;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = aabb.position[i] + aabb.size[i];
- handles.push_back(ax);
- }
-
- if (p_gizmo->is_selected()) {
- p_gizmo->add_solid_box(material_internal, aabb.get_size());
- }
-
- p_gizmo->add_unscaled_billboard(icon, 0.05);
- p_gizmo->add_handles(handles, get_material("handles"));
-}
-
-////
-
-CollisionShapeSpatialGizmoPlugin::CollisionShapeSpatialGizmoPlugin() {
- const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
- create_material("shape_material", gizmo_color);
- const float gizmo_value = gizmo_color.get_v();
- const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
- create_material("shape_material_disabled", gizmo_color_disabled);
- create_handle_material("handles");
-}
-
-bool CollisionShapeSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<CollisionShape>(p_spatial) != NULL;
-}
-
-String CollisionShapeSpatialGizmoPlugin::get_name() const {
- return "CollisionShape";
-}
-
-int CollisionShapeSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-String CollisionShapeSpatialGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- const CollisionShape *cs = Object::cast_to<CollisionShape>(p_gizmo->get_spatial_node());
-
- Ref<Shape> s = cs->get_shape();
- if (s.is_null())
- return "";
-
- if (Object::cast_to<SphereShape>(*s)) {
-
- return "Radius";
- }
-
- if (Object::cast_to<BoxShape>(*s)) {
-
- return "Extents";
- }
-
- if (Object::cast_to<CapsuleShape>(*s)) {
-
- return p_idx == 0 ? "Radius" : "Height";
- }
-
- if (Object::cast_to<CylinderShape>(*s)) {
-
- return p_idx == 0 ? "Radius" : "Height";
- }
-
- if (Object::cast_to<RayShape>(*s)) {
-
- return "Length";
- }
-
- return "";
-}
-
-Variant CollisionShapeSpatialGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
-
- CollisionShape *cs = Object::cast_to<CollisionShape>(p_gizmo->get_spatial_node());
-
- Ref<Shape> s = cs->get_shape();
- if (s.is_null())
- return Variant();
-
- if (Object::cast_to<SphereShape>(*s)) {
-
- Ref<SphereShape> ss = s;
- return ss->get_radius();
- }
-
- if (Object::cast_to<BoxShape>(*s)) {
-
- Ref<BoxShape> bs = s;
- return bs->get_extents();
- }
-
- if (Object::cast_to<CapsuleShape>(*s)) {
-
- Ref<CapsuleShape> cs2 = s;
- return p_idx == 0 ? cs2->get_radius() : cs2->get_height();
- }
-
- if (Object::cast_to<CylinderShape>(*s)) {
-
- Ref<CylinderShape> cs2 = s;
- return p_idx == 0 ? cs2->get_radius() : cs2->get_height();
- }
-
- if (Object::cast_to<RayShape>(*s)) {
-
- Ref<RayShape> cs2 = s;
- return cs2->get_length();
- }
-
- return Variant();
-}
-void CollisionShapeSpatialGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
-
- CollisionShape *cs = Object::cast_to<CollisionShape>(p_gizmo->get_spatial_node());
-
- Ref<Shape> s = cs->get_shape();
- if (s.is_null())
- return;
-
- Transform gt = cs->get_global_transform();
- Transform gi = gt.affine_inverse();
-
- Vector3 ray_from = p_camera->project_ray_origin(p_point);
- Vector3 ray_dir = p_camera->project_ray_normal(p_point);
-
- Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) };
-
- if (Object::cast_to<SphereShape>(*s)) {
-
- Ref<SphereShape> ss = s;
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), Vector3(4096, 0, 0), sg[0], sg[1], ra, rb);
- float d = ra.x;
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- ss->set_radius(d);
- }
-
- if (Object::cast_to<RayShape>(*s)) {
-
- Ref<RayShape> rs = s;
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), Vector3(0, 0, 4096), sg[0], sg[1], ra, rb);
- float d = ra.z;
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- rs->set_length(d);
- }
-
- if (Object::cast_to<BoxShape>(*s)) {
-
- Vector3 axis;
- axis[p_idx] = 1.0;
- Ref<BoxShape> bs = s;
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb);
- float d = ra[p_idx];
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- Vector3 he = bs->get_extents();
- he[p_idx] = d;
- bs->set_extents(he);
- }
-
- if (Object::cast_to<CapsuleShape>(*s)) {
-
- Vector3 axis;
- axis[p_idx == 0 ? 0 : 2] = 1.0;
- Ref<CapsuleShape> cs2 = s;
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb);
- float d = axis.dot(ra);
- if (p_idx == 1)
- d -= cs2->get_radius();
-
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- if (p_idx == 0)
- cs2->set_radius(d);
- else if (p_idx == 1)
- cs2->set_height(d * 2.0);
- }
-
- if (Object::cast_to<CylinderShape>(*s)) {
-
- Vector3 axis;
- axis[p_idx == 0 ? 0 : 1] = 1.0;
- Ref<CylinderShape> cs2 = s;
- Vector3 ra, rb;
- Geometry::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb);
- float d = axis.dot(ra);
- if (SpatialEditor::get_singleton()->is_snap_enabled()) {
- d = Math::stepify(d, SpatialEditor::get_singleton()->get_translate_snap());
- }
-
- if (d < 0.001)
- d = 0.001;
-
- if (p_idx == 0)
- cs2->set_radius(d);
- else if (p_idx == 1)
- cs2->set_height(d * 2.0);
- }
-}
-void CollisionShapeSpatialGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
-
- CollisionShape *cs = Object::cast_to<CollisionShape>(p_gizmo->get_spatial_node());
-
- Ref<Shape> s = cs->get_shape();
- if (s.is_null())
- return;
-
- if (Object::cast_to<SphereShape>(*s)) {
-
- Ref<SphereShape> ss = s;
- if (p_cancel) {
- ss->set_radius(p_restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Sphere Shape Radius"));
- ur->add_do_method(ss.ptr(), "set_radius", ss->get_radius());
- ur->add_undo_method(ss.ptr(), "set_radius", p_restore);
- ur->commit_action();
- }
-
- if (Object::cast_to<BoxShape>(*s)) {
-
- Ref<BoxShape> ss = s;
- if (p_cancel) {
- ss->set_extents(p_restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Box Shape Extents"));
- ur->add_do_method(ss.ptr(), "set_extents", ss->get_extents());
- ur->add_undo_method(ss.ptr(), "set_extents", p_restore);
- ur->commit_action();
- }
-
- if (Object::cast_to<CapsuleShape>(*s)) {
-
- Ref<CapsuleShape> ss = s;
- if (p_cancel) {
- if (p_idx == 0)
- ss->set_radius(p_restore);
- else
- ss->set_height(p_restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- if (p_idx == 0) {
- ur->create_action(TTR("Change Capsule Shape Radius"));
- ur->add_do_method(ss.ptr(), "set_radius", ss->get_radius());
- ur->add_undo_method(ss.ptr(), "set_radius", p_restore);
- } else {
- ur->create_action(TTR("Change Capsule Shape Height"));
- ur->add_do_method(ss.ptr(), "set_height", ss->get_height());
- ur->add_undo_method(ss.ptr(), "set_height", p_restore);
- }
-
- ur->commit_action();
- }
-
- if (Object::cast_to<CylinderShape>(*s)) {
-
- Ref<CylinderShape> ss = s;
- if (p_cancel) {
- if (p_idx == 0)
- ss->set_radius(p_restore);
- else
- ss->set_height(p_restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- if (p_idx == 0) {
- ur->create_action(TTR("Change Cylinder Shape Radius"));
- ur->add_do_method(ss.ptr(), "set_radius", ss->get_radius());
- ur->add_undo_method(ss.ptr(), "set_radius", p_restore);
- } else {
- ur->create_action(
- ///
-
- ////////
- TTR("Change Cylinder Shape Height"));
- ur->add_do_method(ss.ptr(), "set_height", ss->get_height());
- ur->add_undo_method(ss.ptr(), "set_height", p_restore);
- }
-
- ur->commit_action();
- }
-
- if (Object::cast_to<RayShape>(*s)) {
-
- Ref<RayShape> ss = s;
- if (p_cancel) {
- ss->set_length(p_restore);
- return;
- }
-
- UndoRedo *ur = SpatialEditor::get_singleton()->get_undo_redo();
- ur->create_action(TTR("Change Ray Shape Length"));
- ur->add_do_method(ss.ptr(), "set_length", ss->get_length());
- ur->add_undo_method(ss.ptr(), "set_length", p_restore);
- ur->commit_action();
- }
-}
-void CollisionShapeSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- CollisionShape *cs = Object::cast_to<CollisionShape>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Ref<Shape> s = cs->get_shape();
- if (s.is_null())
- return;
-
- const Ref<Material> material =
- get_material(!cs->is_disabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
- Ref<Material> handles_material = get_material("handles");
-
- if (Object::cast_to<SphereShape>(*s)) {
-
- Ref<SphereShape> sp = s;
- float r = sp->get_radius();
-
- Vector<Vector3> points;
-
- for (int i = 0; i <= 360; i++) {
-
- float ra = Math::deg2rad((float)i);
- float rb = Math::deg2rad((float)i + 1);
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
-
- points.push_back(Vector3(a.x, 0, a.y));
- points.push_back(Vector3(b.x, 0, b.y));
- points.push_back(Vector3(0, a.x, a.y));
- points.push_back(Vector3(0, b.x, b.y));
- points.push_back(Vector3(a.x, a.y, 0));
- points.push_back(Vector3(b.x, b.y, 0));
- }
-
- Vector<Vector3> collision_segments;
-
- for (int i = 0; i < 64; i++) {
-
- float ra = i * Math_PI * 2.0 / 64.0;
- float rb = (i + 1) * Math_PI * 2.0 / 64.0;
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * r;
-
- collision_segments.push_back(Vector3(a.x, 0, a.y));
- collision_segments.push_back(Vector3(b.x, 0, b.y));
- collision_segments.push_back(Vector3(0, a.x, a.y));
- collision_segments.push_back(Vector3(0, b.x, b.y));
- collision_segments.push_back(Vector3(a.x, a.y, 0));
- collision_segments.push_back(Vector3(b.x, b.y, 0));
- }
-
- p_gizmo->add_lines(points, material);
- p_gizmo->add_collision_segments(collision_segments);
- Vector<Vector3> handles;
- handles.push_back(Vector3(r, 0, 0));
- p_gizmo->add_handles(handles, handles_material);
- }
-
- if (Object::cast_to<BoxShape>(*s)) {
-
- Ref<BoxShape> bs = s;
- Vector<Vector3> lines;
- AABB aabb;
- aabb.position = -bs->get_extents();
- aabb.size = aabb.position * -2;
-
- for (int i = 0; i < 12; i++) {
- Vector3 a, b;
- aabb.get_edge(i, a, b);
- lines.push_back(a);
- lines.push_back(b);
- }
-
- Vector<Vector3> handles;
-
- for (int i = 0; i < 3; i++) {
-
- Vector3 ax;
- ax[i] = bs->get_extents()[i];
- handles.push_back(ax);
- }
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
- p_gizmo->add_handles(handles, handles_material);
- }
-
- if (Object::cast_to<CapsuleShape>(*s)) {
-
- Ref<CapsuleShape> cs2 = s;
- float radius = cs2->get_radius();
- float height = cs2->get_height();
-
- Vector<Vector3> points;
-
- Vector3 d(0, 0, height * 0.5);
- for (int i = 0; i < 360; i++) {
-
- float ra = Math::deg2rad((float)i);
- float rb = Math::deg2rad((float)i + 1);
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
-
- points.push_back(Vector3(a.x, a.y, 0) + d);
- points.push_back(Vector3(b.x, b.y, 0) + d);
-
- points.push_back(Vector3(a.x, a.y, 0) - d);
- points.push_back(Vector3(b.x, b.y, 0) - d);
-
- if (i % 90 == 0) {
-
- points.push_back(Vector3(a.x, a.y, 0) + d);
- points.push_back(Vector3(a.x, a.y, 0) - d);
- }
-
- Vector3 dud = i < 180 ? d : -d;
-
- points.push_back(Vector3(0, a.y, a.x) + dud);
- points.push_back(Vector3(0, b.y, b.x) + dud);
- points.push_back(Vector3(a.y, 0, a.x) + dud);
- points.push_back(Vector3(b.y, 0, b.x) + dud);
- }
-
- p_gizmo->add_lines(points, material);
-
- Vector<Vector3> collision_segments;
-
- for (int i = 0; i < 64; i++) {
-
- float ra = i * Math_PI * 2.0 / 64.0;
- float rb = (i + 1) * Math_PI * 2.0 / 64.0;
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
-
- collision_segments.push_back(Vector3(a.x, a.y, 0) + d);
- collision_segments.push_back(Vector3(b.x, b.y, 0) + d);
-
- collision_segments.push_back(Vector3(a.x, a.y, 0) - d);
- collision_segments.push_back(Vector3(b.x, b.y, 0) - d);
-
- if (i % 16 == 0) {
-
- collision_segments.push_back(Vector3(a.x, a.y, 0) + d);
- collision_segments.push_back(Vector3(a.x, a.y, 0) - d);
- }
-
- Vector3 dud = i < 32 ? d : -d;
-
- collision_segments.push_back(Vector3(0, a.y, a.x) + dud);
- collision_segments.push_back(Vector3(0, b.y, b.x) + dud);
- collision_segments.push_back(Vector3(a.y, 0, a.x) + dud);
- collision_segments.push_back(Vector3(b.y, 0, b.x) + dud);
- }
-
- p_gizmo->add_collision_segments(collision_segments);
-
- Vector<Vector3> handles;
- handles.push_back(Vector3(cs2->get_radius(), 0, 0));
- handles.push_back(Vector3(0, 0, cs2->get_height() * 0.5 + cs2->get_radius()));
- p_gizmo->add_handles(handles, handles_material);
- }
-
- if (Object::cast_to<CylinderShape>(*s)) {
-
- Ref<CylinderShape> cs2 = s;
- float radius = cs2->get_radius();
- float height = cs2->get_height();
-
- Vector<Vector3> points;
-
- Vector3 d(0, height * 0.5, 0);
- for (int i = 0; i < 360; i++) {
-
- float ra = Math::deg2rad((float)i);
- float rb = Math::deg2rad((float)i + 1);
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
-
- points.push_back(Vector3(a.x, 0, a.y) + d);
- points.push_back(Vector3(b.x, 0, b.y) + d);
-
- points.push_back(Vector3(a.x, 0, a.y) - d);
- points.push_back(Vector3(b.x, 0, b.y) - d);
-
- if (i % 90 == 0) {
-
- points.push_back(Vector3(a.x, 0, a.y) + d);
- points.push_back(Vector3(a.x, 0, a.y) - d);
- }
- }
-
- p_gizmo->add_lines(points, material);
-
- Vector<Vector3> collision_segments;
-
- for (int i = 0; i < 64; i++) {
-
- float ra = i * Math_PI * 2.0 / 64.0;
- float rb = (i + 1) * Math_PI * 2.0 / 64.0;
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * radius;
-
- collision_segments.push_back(Vector3(a.x, 0, a.y) + d);
- collision_segments.push_back(Vector3(b.x, 0, b.y) + d);
-
- collision_segments.push_back(Vector3(a.x, 0, a.y) - d);
- collision_segments.push_back(Vector3(b.x, 0, b.y) - d);
-
- if (i % 16 == 0) {
-
- collision_segments.push_back(Vector3(a.x, 0, a.y) + d);
- collision_segments.push_back(Vector3(a.x, 0, a.y) - d);
- }
- }
-
- p_gizmo->add_collision_segments(collision_segments);
-
- Vector<Vector3> handles;
- handles.push_back(Vector3(cs2->get_radius(), 0, 0));
- handles.push_back(Vector3(0, cs2->get_height() * 0.5, 0));
- p_gizmo->add_handles(handles, handles_material);
- }
-
- if (Object::cast_to<PlaneShape>(*s)) {
-
- Ref<PlaneShape> ps = s;
- Plane p = ps->get_plane();
- Vector<Vector3> points;
-
- Vector3 n1 = p.get_any_perpendicular_normal();
- Vector3 n2 = p.normal.cross(n1).normalized();
-
- Vector3 pface[4] = {
- p.normal * p.d + n1 * 10.0 + n2 * 10.0,
- p.normal * p.d + n1 * 10.0 + n2 * -10.0,
- p.normal * p.d + n1 * -10.0 + n2 * -10.0,
- p.normal * p.d + n1 * -10.0 + n2 * 10.0,
- };
-
- points.push_back(pface[0]);
- points.push_back(pface[1]);
- points.push_back(pface[1]);
- points.push_back(pface[2]);
- points.push_back(pface[2]);
- points.push_back(pface[3]);
- points.push_back(pface[3]);
- points.push_back(pface[0]);
- points.push_back(p.normal * p.d);
- points.push_back(p.normal * p.d + p.normal * 3);
-
- p_gizmo->add_lines(points, material);
- p_gizmo->add_collision_segments(points);
- }
-
- if (Object::cast_to<ConvexPolygonShape>(*s)) {
-
- PoolVector<Vector3> points = Object::cast_to<ConvexPolygonShape>(*s)->get_points();
-
- if (points.size() > 3) {
-
- Vector<Vector3> varr = Variant(points);
- Geometry::MeshData md;
- Error err = QuickHull::build(varr, md);
- if (err == OK) {
- Vector<Vector3> points2;
- points2.resize(md.edges.size() * 2);
- for (int i = 0; i < md.edges.size(); i++) {
- points2.write[i * 2 + 0] = md.vertices[md.edges[i].a];
- points2.write[i * 2 + 1] = md.vertices[md.edges[i].b];
- }
-
- p_gizmo->add_lines(points2, material);
- p_gizmo->add_collision_segments(points2);
- }
- }
- }
-
- if (Object::cast_to<ConcavePolygonShape>(*s)) {
-
- Ref<ConcavePolygonShape> cs2 = s;
- Ref<ArrayMesh> mesh = cs2->get_debug_mesh();
- p_gizmo->add_mesh(mesh, false, Ref<SkinReference>(), material);
- p_gizmo->add_collision_segments(cs2->get_debug_mesh_lines());
- }
-
- if (Object::cast_to<RayShape>(*s)) {
-
- Ref<RayShape> rs = s;
-
- Vector<Vector3> points;
- points.push_back(Vector3());
- points.push_back(Vector3(0, 0, rs->get_length()));
- p_gizmo->add_lines(points, material);
- p_gizmo->add_collision_segments(points);
- Vector<Vector3> handles;
- handles.push_back(Vector3(0, 0, rs->get_length()));
- p_gizmo->add_handles(handles, handles_material);
- }
-
- if (Object::cast_to<HeightMapShape>(*s)) {
-
- Ref<HeightMapShape> hms = s;
-
- Ref<ArrayMesh> mesh = hms->get_debug_mesh();
- p_gizmo->add_mesh(mesh, false, Ref<SkinReference>(), material);
- }
-}
-
-/////
-
-CollisionPolygonSpatialGizmoPlugin::CollisionPolygonSpatialGizmoPlugin() {
- const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1));
- create_material("shape_material", gizmo_color);
- const float gizmo_value = gizmo_color.get_v();
- const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65);
- create_material("shape_material_disabled", gizmo_color_disabled);
-}
-
-bool CollisionPolygonSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<CollisionPolygon>(p_spatial) != NULL;
-}
-
-String CollisionPolygonSpatialGizmoPlugin::get_name() const {
- return "CollisionPolygon";
-}
-
-int CollisionPolygonSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void CollisionPolygonSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- CollisionPolygon *polygon = Object::cast_to<CollisionPolygon>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Vector<Vector2> points = polygon->get_polygon();
- float depth = polygon->get_depth() * 0.5;
-
- Vector<Vector3> lines;
- for (int i = 0; i < points.size(); i++) {
-
- int n = (i + 1) % points.size();
- lines.push_back(Vector3(points[i].x, points[i].y, depth));
- lines.push_back(Vector3(points[n].x, points[n].y, depth));
- lines.push_back(Vector3(points[i].x, points[i].y, -depth));
- lines.push_back(Vector3(points[n].x, points[n].y, -depth));
- lines.push_back(Vector3(points[i].x, points[i].y, depth));
- lines.push_back(Vector3(points[i].x, points[i].y, -depth));
- }
-
- const Ref<Material> material =
- get_material(!polygon->is_disabled() ? "shape_material" : "shape_material_disabled", p_gizmo);
-
- p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
-}
-
-////
-
-NavigationMeshSpatialGizmoPlugin::NavigationMeshSpatialGizmoPlugin() {
- create_material("navigation_edge_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_edge", Color(0.5, 1, 1)));
- create_material("navigation_edge_material_disabled", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_edge_disabled", Color(0.7, 0.7, 0.7)));
- create_material("navigation_solid_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_solid", Color(0.5, 1, 1, 0.4)));
- create_material("navigation_solid_material_disabled", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_solid_disabled", Color(0.7, 0.7, 0.7, 0.4)));
-}
-
-bool NavigationMeshSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<NavigationMeshInstance>(p_spatial) != NULL;
-}
-
-String NavigationMeshSpatialGizmoPlugin::get_name() const {
- return "NavigationMeshInstance";
-}
-
-int NavigationMeshSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void NavigationMeshSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
-
- NavigationMeshInstance *navmesh = Object::cast_to<NavigationMeshInstance>(p_gizmo->get_spatial_node());
-
- Ref<Material> edge_material = get_material("navigation_edge_material", p_gizmo);
- Ref<Material> edge_material_disabled = get_material("navigation_edge_material_disabled", p_gizmo);
- Ref<Material> solid_material = get_material("navigation_solid_material", p_gizmo);
- Ref<Material> solid_material_disabled = get_material("navigation_solid_material_disabled", p_gizmo);
-
- p_gizmo->clear();
- Ref<NavigationMesh> navmeshie = navmesh->get_navigation_mesh();
- if (navmeshie.is_null())
- return;
-
- PoolVector<Vector3> vertices = navmeshie->get_vertices();
- PoolVector<Vector3>::Read vr = vertices.read();
- List<Face3> faces;
- for (int i = 0; i < navmeshie->get_polygon_count(); i++) {
- Vector<int> p = navmeshie->get_polygon(i);
-
- for (int j = 2; j < p.size(); j++) {
- Face3 f;
- f.vertex[0] = vr[p[0]];
- f.vertex[1] = vr[p[j - 1]];
- f.vertex[2] = vr[p[j]];
-
- faces.push_back(f);
- }
- }
-
- if (faces.empty())
- return;
-
- Map<_EdgeKey, bool> edge_map;
- PoolVector<Vector3> tmeshfaces;
- tmeshfaces.resize(faces.size() * 3);
-
- {
- PoolVector<Vector3>::Write tw = tmeshfaces.write();
- int tidx = 0;
-
- for (List<Face3>::Element *E = faces.front(); E; E = E->next()) {
-
- const Face3 &f = E->get();
-
- for (int j = 0; j < 3; j++) {
-
- tw[tidx++] = f.vertex[j];
- _EdgeKey ek;
- ek.from = f.vertex[j].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON));
- ek.to = f.vertex[(j + 1) % 3].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON));
- if (ek.from < ek.to)
- SWAP(ek.from, ek.to);
-
- Map<_EdgeKey, bool>::Element *F = edge_map.find(ek);
-
- if (F) {
-
- F->get() = false;
-
- } else {
-
- edge_map[ek] = true;
- }
- }
- }
- }
- Vector<Vector3> lines;
-
- for (Map<_EdgeKey, bool>::Element *E = edge_map.front(); E; E = E->next()) {
-
- if (E->get()) {
- lines.push_back(E->key().from);
- lines.push_back(E->key().to);
- }
- }
-
- Ref<TriangleMesh> tmesh = memnew(TriangleMesh);
- tmesh->create(tmeshfaces);
-
- if (lines.size())
- p_gizmo->add_lines(lines, navmesh->is_enabled() ? edge_material : edge_material_disabled);
- p_gizmo->add_collision_triangles(tmesh);
- Ref<ArrayMesh> m = memnew(ArrayMesh);
- Array a;
- a.resize(Mesh::ARRAY_MAX);
- a[0] = tmeshfaces;
- m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, a);
- m->surface_set_material(0, navmesh->is_enabled() ? solid_material : solid_material_disabled);
- p_gizmo->add_mesh(m);
- p_gizmo->add_collision_segments(lines);
-}
-
-//////
-
-#define BODY_A_RADIUS 0.25
-#define BODY_B_RADIUS 0.27
-
-Basis JointGizmosDrawer::look_body(const Transform &p_joint_transform, const Transform &p_body_transform) {
- const Vector3 &p_eye(p_joint_transform.origin);
- const Vector3 &p_target(p_body_transform.origin);
-
- Vector3 v_x, v_y, v_z;
-
- // Look the body with X
- v_x = p_target - p_eye;
- v_x.normalize();
-
- v_z = v_x.cross(Vector3(0, 1, 0));
- v_z.normalize();
-
- v_y = v_z.cross(v_x);
- v_y.normalize();
-
- Basis base;
- base.set(v_x, v_y, v_z);
-
- // Absorb current joint transform
- base = p_joint_transform.basis.inverse() * base;
-
- return base;
-}
-
-Basis JointGizmosDrawer::look_body_toward(Vector3::Axis p_axis, const Transform &joint_transform, const Transform &body_transform) {
-
- switch (p_axis) {
- case Vector3::AXIS_X:
- return look_body_toward_x(joint_transform, body_transform);
- case Vector3::AXIS_Y:
- return look_body_toward_y(joint_transform, body_transform);
- case Vector3::AXIS_Z:
- return look_body_toward_z(joint_transform, body_transform);
- default:
- return Basis();
- }
-}
-
-Basis JointGizmosDrawer::look_body_toward_x(const Transform &p_joint_transform, const Transform &p_body_transform) {
-
- const Vector3 &p_eye(p_joint_transform.origin);
- const Vector3 &p_target(p_body_transform.origin);
-
- const Vector3 p_front(p_joint_transform.basis.get_axis(0));
-
- Vector3 v_x, v_y, v_z;
-
- // Look the body with X
- v_x = p_target - p_eye;
- v_x.normalize();
-
- v_y = p_front.cross(v_x);
- v_y.normalize();
-
- v_z = v_y.cross(p_front);
- v_z.normalize();
-
- // Clamp X to FRONT axis
- v_x = p_front;
- v_x.normalize();
-
- Basis base;
- base.set(v_x, v_y, v_z);
-
- // Absorb current joint transform
- base = p_joint_transform.basis.inverse() * base;
-
- return base;
-}
-
-Basis JointGizmosDrawer::look_body_toward_y(const Transform &p_joint_transform, const Transform &p_body_transform) {
-
- const Vector3 &p_eye(p_joint_transform.origin);
- const Vector3 &p_target(p_body_transform.origin);
-
- const Vector3 p_up(p_joint_transform.basis.get_axis(1));
-
- Vector3 v_x, v_y, v_z;
-
- // Look the body with X
- v_x = p_target - p_eye;
- v_x.normalize();
-
- v_z = v_x.cross(p_up);
- v_z.normalize();
-
- v_x = p_up.cross(v_z);
- v_x.normalize();
-
- // Clamp Y to UP axis
- v_y = p_up;
- v_y.normalize();
-
- Basis base;
- base.set(v_x, v_y, v_z);
-
- // Absorb current joint transform
- base = p_joint_transform.basis.inverse() * base;
-
- return base;
-}
-
-Basis JointGizmosDrawer::look_body_toward_z(const Transform &p_joint_transform, const Transform &p_body_transform) {
-
- const Vector3 &p_eye(p_joint_transform.origin);
- const Vector3 &p_target(p_body_transform.origin);
-
- const Vector3 p_lateral(p_joint_transform.basis.get_axis(2));
-
- Vector3 v_x, v_y, v_z;
-
- // Look the body with X
- v_x = p_target - p_eye;
- v_x.normalize();
-
- v_z = p_lateral;
- v_z.normalize();
-
- v_y = v_z.cross(v_x);
- v_y.normalize();
-
- // Clamp X to Z axis
- v_x = v_y.cross(v_z);
- v_x.normalize();
-
- Basis base;
- base.set(v_x, v_y, v_z);
-
- // Absorb current joint transform
- base = p_joint_transform.basis.inverse() * base;
-
- return base;
-}
-
-void JointGizmosDrawer::draw_circle(Vector3::Axis p_axis, real_t p_radius, const Transform &p_offset, const Basis &p_base, real_t p_limit_lower, real_t p_limit_upper, Vector<Vector3> &r_points, bool p_inverse) {
-
- if (p_limit_lower == p_limit_upper) {
-
- r_points.push_back(p_offset.translated(Vector3()).origin);
- r_points.push_back(p_offset.translated(p_base.xform(Vector3(0.5, 0, 0))).origin);
-
- } else {
-
- if (p_limit_lower > p_limit_upper) {
- p_limit_lower = -Math_PI;
- p_limit_upper = Math_PI;
- }
-
- const int points = 32;
-
- for (int i = 0; i < points; i++) {
-
- real_t s = p_limit_lower + i * (p_limit_upper - p_limit_lower) / points;
- real_t n = p_limit_lower + (i + 1) * (p_limit_upper - p_limit_lower) / points;
-
- Vector3 from;
- Vector3 to;
- switch (p_axis) {
- case Vector3::AXIS_X:
- if (p_inverse) {
- from = p_base.xform(Vector3(0, Math::sin(s), Math::cos(s))) * p_radius;
- to = p_base.xform(Vector3(0, Math::sin(n), Math::cos(n))) * p_radius;
- } else {
- from = p_base.xform(Vector3(0, -Math::sin(s), Math::cos(s))) * p_radius;
- to = p_base.xform(Vector3(0, -Math::sin(n), Math::cos(n))) * p_radius;
- }
- break;
- case Vector3::AXIS_Y:
- if (p_inverse) {
- from = p_base.xform(Vector3(Math::cos(s), 0, -Math::sin(s))) * p_radius;
- to = p_base.xform(Vector3(Math::cos(n), 0, -Math::sin(n))) * p_radius;
- } else {
- from = p_base.xform(Vector3(Math::cos(s), 0, Math::sin(s))) * p_radius;
- to = p_base.xform(Vector3(Math::cos(n), 0, Math::sin(n))) * p_radius;
- }
- break;
- case Vector3::AXIS_Z:
- from = p_base.xform(Vector3(Math::cos(s), Math::sin(s), 0)) * p_radius;
- to = p_base.xform(Vector3(Math::cos(n), Math::sin(n), 0)) * p_radius;
- break;
- }
-
- if (i == points - 1) {
- r_points.push_back(p_offset.translated(to).origin);
- r_points.push_back(p_offset.translated(Vector3()).origin);
- }
- if (i == 0) {
- r_points.push_back(p_offset.translated(from).origin);
- r_points.push_back(p_offset.translated(Vector3()).origin);
- }
-
- r_points.push_back(p_offset.translated(from).origin);
- r_points.push_back(p_offset.translated(to).origin);
- }
-
- r_points.push_back(p_offset.translated(Vector3(0, p_radius * 1.5, 0)).origin);
- r_points.push_back(p_offset.translated(Vector3()).origin);
- }
-}
-
-void JointGizmosDrawer::draw_cone(const Transform &p_offset, const Basis &p_base, real_t p_swing, real_t p_twist, Vector<Vector3> &r_points) {
-
- float r = 1.0;
- float w = r * Math::sin(p_swing);
- float d = r * Math::cos(p_swing);
-
- //swing
- for (int i = 0; i < 360; i += 10) {
-
- float ra = Math::deg2rad((float)i);
- float rb = Math::deg2rad((float)i + 10);
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * w;
-
- r_points.push_back(p_offset.translated(p_base.xform(Vector3(d, a.x, a.y))).origin);
- r_points.push_back(p_offset.translated(p_base.xform(Vector3(d, b.x, b.y))).origin);
-
- if (i % 90 == 0) {
-
- r_points.push_back(p_offset.translated(p_base.xform(Vector3(d, a.x, a.y))).origin);
- r_points.push_back(p_offset.translated(p_base.xform(Vector3())).origin);
- }
- }
-
- r_points.push_back(p_offset.translated(p_base.xform(Vector3())).origin);
- r_points.push_back(p_offset.translated(p_base.xform(Vector3(1, 0, 0))).origin);
-
- /// Twist
- float ts = Math::rad2deg(p_twist);
- ts = MIN(ts, 720);
-
- for (int i = 0; i < int(ts); i += 5) {
-
- float ra = Math::deg2rad((float)i);
- float rb = Math::deg2rad((float)i + 5);
- float c = i / 720.0;
- float cn = (i + 5) / 720.0;
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w * c;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * w * cn;
-
- r_points.push_back(p_offset.translated(p_base.xform(Vector3(c, a.x, a.y))).origin);
- r_points.push_back(p_offset.translated(p_base.xform(Vector3(cn, b.x, b.y))).origin);
- }
-}
-
-////
-
-JointSpatialGizmoPlugin::JointSpatialGizmoPlugin() {
- create_material("joint_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1)));
- create_material("joint_body_a_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint_body_a", Color(0.6, 0.8, 1)));
- create_material("joint_body_b_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint_body_b", Color(0.6, 0.9, 1)));
-}
-
-bool JointSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
- return Object::cast_to<Joint>(p_spatial) != NULL;
-}
-
-String JointSpatialGizmoPlugin::get_name() const {
- return "Joints";
-}
-
-int JointSpatialGizmoPlugin::get_priority() const {
- return -1;
-}
-
-void JointSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
- Joint *joint = Object::cast_to<Joint>(p_gizmo->get_spatial_node());
-
- p_gizmo->clear();
-
- Spatial *node_body_a = NULL;
- if (!joint->get_node_a().is_empty()) {
- node_body_a = Object::cast_to<Spatial>(joint->get_node(joint->get_node_a()));
- }
-
- Spatial *node_body_b = NULL;
- if (!joint->get_node_b().is_empty()) {
- node_body_b = Object::cast_to<Spatial>(joint->get_node(joint->get_node_b()));
- }
-
- if (!node_body_a && !node_body_b) {
- return;
- }
-
- Ref<Material> common_material = get_material("joint_material", p_gizmo);
- Ref<Material> body_a_material = get_material("joint_body_a_material", p_gizmo);
- Ref<Material> body_b_material = get_material("joint_body_b_material", p_gizmo);
-
- Vector<Vector3> points;
- Vector<Vector3> body_a_points;
- Vector<Vector3> body_b_points;
-
- if (Object::cast_to<PinJoint>(joint)) {
- CreatePinJointGizmo(Transform(), points);
- p_gizmo->add_collision_segments(points);
- p_gizmo->add_lines(points, common_material);
- }
-
- HingeJoint *hinge = Object::cast_to<HingeJoint>(joint);
- if (hinge) {
-
- CreateHingeJointGizmo(
- Transform(),
- hinge->get_global_transform(),
- node_body_a ? node_body_a->get_global_transform() : Transform(),
- node_body_b ? node_body_b->get_global_transform() : Transform(),
- hinge->get_param(HingeJoint::PARAM_LIMIT_LOWER),
- hinge->get_param(HingeJoint::PARAM_LIMIT_UPPER),
- hinge->get_flag(HingeJoint::FLAG_USE_LIMIT),
- points,
- node_body_a ? &body_a_points : NULL,
- node_body_b ? &body_b_points : NULL);
-
- p_gizmo->add_collision_segments(points);
- p_gizmo->add_collision_segments(body_a_points);
- p_gizmo->add_collision_segments(body_b_points);
-
- p_gizmo->add_lines(points, common_material);
- p_gizmo->add_lines(body_a_points, body_a_material);
- p_gizmo->add_lines(body_b_points, body_b_material);
- }
-
- SliderJoint *slider = Object::cast_to<SliderJoint>(joint);
- if (slider) {
-
- CreateSliderJointGizmo(
- Transform(),
- slider->get_global_transform(),
- node_body_a ? node_body_a->get_global_transform() : Transform(),
- node_body_b ? node_body_b->get_global_transform() : Transform(),
- slider->get_param(SliderJoint::PARAM_ANGULAR_LIMIT_LOWER),
- slider->get_param(SliderJoint::PARAM_ANGULAR_LIMIT_UPPER),
- slider->get_param(SliderJoint::PARAM_LINEAR_LIMIT_LOWER),
- slider->get_param(SliderJoint::PARAM_LINEAR_LIMIT_UPPER),
- points,
- node_body_a ? &body_a_points : NULL,
- node_body_b ? &body_b_points : NULL);
-
- p_gizmo->add_collision_segments(points);
- p_gizmo->add_collision_segments(body_a_points);
- p_gizmo->add_collision_segments(body_b_points);
-
- p_gizmo->add_lines(points, common_material);
- p_gizmo->add_lines(body_a_points, body_a_material);
- p_gizmo->add_lines(body_b_points, body_b_material);
- }
-
- ConeTwistJoint *cone = Object::cast_to<ConeTwistJoint>(joint);
- if (cone) {
-
- CreateConeTwistJointGizmo(
- Transform(),
- cone->get_global_transform(),
- node_body_a ? node_body_a->get_global_transform() : Transform(),
- node_body_b ? node_body_b->get_global_transform() : Transform(),
- cone->get_param(ConeTwistJoint::PARAM_SWING_SPAN),
- cone->get_param(ConeTwistJoint::PARAM_TWIST_SPAN),
- node_body_a ? &body_a_points : NULL,
- node_body_b ? &body_b_points : NULL);
-
- p_gizmo->add_collision_segments(body_a_points);
- p_gizmo->add_collision_segments(body_b_points);
-
- p_gizmo->add_lines(body_a_points, body_a_material);
- p_gizmo->add_lines(body_b_points, body_b_material);
- }
-
- Generic6DOFJoint *gen = Object::cast_to<Generic6DOFJoint>(joint);
- if (gen) {
-
- CreateGeneric6DOFJointGizmo(
- Transform(),
- gen->get_global_transform(),
- node_body_a ? node_body_a->get_global_transform() : Transform(),
- node_body_b ? node_body_b->get_global_transform() : Transform(),
-
- gen->get_param_x(Generic6DOFJoint::PARAM_ANGULAR_LOWER_LIMIT),
- gen->get_param_x(Generic6DOFJoint::PARAM_ANGULAR_UPPER_LIMIT),
- gen->get_param_x(Generic6DOFJoint::PARAM_LINEAR_LOWER_LIMIT),
- gen->get_param_x(Generic6DOFJoint::PARAM_LINEAR_UPPER_LIMIT),
- gen->get_flag_x(Generic6DOFJoint::FLAG_ENABLE_ANGULAR_LIMIT),
- gen->get_flag_x(Generic6DOFJoint::FLAG_ENABLE_LINEAR_LIMIT),
-
- gen->get_param_y(Generic6DOFJoint::PARAM_ANGULAR_LOWER_LIMIT),
- gen->get_param_y(Generic6DOFJoint::PARAM_ANGULAR_UPPER_LIMIT),
- gen->get_param_y(Generic6DOFJoint::PARAM_LINEAR_LOWER_LIMIT),
- gen->get_param_y(Generic6DOFJoint::PARAM_LINEAR_UPPER_LIMIT),
- gen->get_flag_y(Generic6DOFJoint::FLAG_ENABLE_ANGULAR_LIMIT),
- gen->get_flag_y(Generic6DOFJoint::FLAG_ENABLE_LINEAR_LIMIT),
-
- gen->get_param_z(Generic6DOFJoint::PARAM_ANGULAR_LOWER_LIMIT),
- gen->get_param_z(Generic6DOFJoint::PARAM_ANGULAR_UPPER_LIMIT),
- gen->get_param_z(Generic6DOFJoint::PARAM_LINEAR_LOWER_LIMIT),
- gen->get_param_z(Generic6DOFJoint::PARAM_LINEAR_UPPER_LIMIT),
- gen->get_flag_z(Generic6DOFJoint::FLAG_ENABLE_ANGULAR_LIMIT),
- gen->get_flag_z(Generic6DOFJoint::FLAG_ENABLE_LINEAR_LIMIT),
-
- points,
- node_body_a ? &body_a_points : NULL,
- node_body_a ? &body_b_points : NULL);
-
- p_gizmo->add_collision_segments(points);
- p_gizmo->add_collision_segments(body_a_points);
- p_gizmo->add_collision_segments(body_b_points);
-
- p_gizmo->add_lines(points, common_material);
- p_gizmo->add_lines(body_a_points, body_a_material);
- p_gizmo->add_lines(body_b_points, body_b_material);
- }
-}
-
-void JointSpatialGizmoPlugin::CreatePinJointGizmo(const Transform &p_offset, Vector<Vector3> &r_cursor_points) {
- float cs = 0.25;
-
- r_cursor_points.push_back(p_offset.translated(Vector3(+cs, 0, 0)).origin);
- r_cursor_points.push_back(p_offset.translated(Vector3(-cs, 0, 0)).origin);
- r_cursor_points.push_back(p_offset.translated(Vector3(0, +cs, 0)).origin);
- r_cursor_points.push_back(p_offset.translated(Vector3(0, -cs, 0)).origin);
- r_cursor_points.push_back(p_offset.translated(Vector3(0, 0, +cs)).origin);
- r_cursor_points.push_back(p_offset.translated(Vector3(0, 0, -cs)).origin);
-}
-
-void JointSpatialGizmoPlugin::CreateHingeJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_limit_lower, real_t p_limit_upper, bool p_use_limit, Vector<Vector3> &r_common_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) {
-
- r_common_points.push_back(p_offset.translated(Vector3(0, 0, 0.5)).origin);
- r_common_points.push_back(p_offset.translated(Vector3(0, 0, -0.5)).origin);
-
- if (!p_use_limit) {
- p_limit_upper = -1;
- p_limit_lower = 0;
- }
-
- if (r_body_a_points) {
-
- JointGizmosDrawer::draw_circle(Vector3::AXIS_Z,
- BODY_A_RADIUS,
- p_offset,
- JointGizmosDrawer::look_body_toward_z(p_trs_joint, p_trs_body_a),
- p_limit_lower,
- p_limit_upper,
- *r_body_a_points);
- }
-
- if (r_body_b_points) {
- JointGizmosDrawer::draw_circle(Vector3::AXIS_Z,
- BODY_B_RADIUS,
- p_offset,
- JointGizmosDrawer::look_body_toward_z(p_trs_joint, p_trs_body_b),
- p_limit_lower,
- p_limit_upper,
- *r_body_b_points);
- }
-}
-
-void JointSpatialGizmoPlugin::CreateSliderJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_angular_limit_lower, real_t p_angular_limit_upper, real_t p_linear_limit_lower, real_t p_linear_limit_upper, Vector<Vector3> &r_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) {
-
- p_linear_limit_lower = -p_linear_limit_lower;
- p_linear_limit_upper = -p_linear_limit_upper;
-
- float cs = 0.25;
- r_points.push_back(p_offset.translated(Vector3(0, 0, 0.5)).origin);
- r_points.push_back(p_offset.translated(Vector3(0, 0, -0.5)).origin);
-
- if (p_linear_limit_lower >= p_linear_limit_upper) {
-
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, 0, 0)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, 0, 0)).origin);
-
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, -cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, -cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, cs, -cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_upper, -cs, -cs)).origin);
-
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, -cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, -cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, cs, -cs)).origin);
- r_points.push_back(p_offset.translated(Vector3(p_linear_limit_lower, -cs, -cs)).origin);
-
- } else {
-
- r_points.push_back(p_offset.translated(Vector3(+cs * 2, 0, 0)).origin);
- r_points.push_back(p_offset.translated(Vector3(-cs * 2, 0, 0)).origin);
- }
-
- if (r_body_a_points)
- JointGizmosDrawer::draw_circle(
- Vector3::AXIS_X,
- BODY_A_RADIUS,
- p_offset,
- JointGizmosDrawer::look_body_toward(Vector3::AXIS_X, p_trs_joint, p_trs_body_a),
- p_angular_limit_lower,
- p_angular_limit_upper,
- *r_body_a_points);
-
- if (r_body_b_points)
- JointGizmosDrawer::draw_circle(
- Vector3::AXIS_X,
- BODY_B_RADIUS,
- p_offset,
- JointGizmosDrawer::look_body_toward(Vector3::AXIS_X, p_trs_joint, p_trs_body_b),
- p_angular_limit_lower,
- p_angular_limit_upper,
- *r_body_b_points,
- true);
-}
-
-void JointSpatialGizmoPlugin::CreateConeTwistJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_swing, real_t p_twist, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) {
-
- if (r_body_a_points)
- JointGizmosDrawer::draw_cone(
- p_offset,
- JointGizmosDrawer::look_body(p_trs_joint, p_trs_body_a),
- p_swing,
- p_twist,
- *r_body_a_points);
-
- if (r_body_b_points)
- JointGizmosDrawer::draw_cone(
- p_offset,
- JointGizmosDrawer::look_body(p_trs_joint, p_trs_body_b),
- p_swing,
- p_twist,
- *r_body_b_points);
-}
-
-void JointSpatialGizmoPlugin::CreateGeneric6DOFJointGizmo(
- const Transform &p_offset,
- const Transform &p_trs_joint,
- const Transform &p_trs_body_a,
- const Transform &p_trs_body_b,
- real_t p_angular_limit_lower_x,
- real_t p_angular_limit_upper_x,
- real_t p_linear_limit_lower_x,
- real_t p_linear_limit_upper_x,
- bool p_enable_angular_limit_x,
- bool p_enable_linear_limit_x,
- real_t p_angular_limit_lower_y,
- real_t p_angular_limit_upper_y,
- real_t p_linear_limit_lower_y,
- real_t p_linear_limit_upper_y,
- bool p_enable_angular_limit_y,
- bool p_enable_linear_limit_y,
- real_t p_angular_limit_lower_z,
- real_t p_angular_limit_upper_z,
- real_t p_linear_limit_lower_z,
- real_t p_linear_limit_upper_z,
- bool p_enable_angular_limit_z,
- bool p_enable_linear_limit_z,
- Vector<Vector3> &r_points,
- Vector<Vector3> *r_body_a_points,
- Vector<Vector3> *r_body_b_points) {
-
- float cs = 0.25;
-
- for (int ax = 0; ax < 3; ax++) {
- float ll = 0;
- float ul = 0;
- float lll = 0;
- float lul = 0;
-
- int a1 = 0;
- int a2 = 0;
- int a3 = 0;
- bool enable_ang = false;
- bool enable_lin = false;
-
- switch (ax) {
- case 0:
- ll = p_angular_limit_lower_x;
- ul = p_angular_limit_upper_x;
- lll = -p_linear_limit_lower_x;
- lul = -p_linear_limit_upper_x;
- enable_ang = p_enable_angular_limit_x;
- enable_lin = p_enable_linear_limit_x;
- a1 = 0;
- a2 = 1;
- a3 = 2;
- break;
- case 1:
- ll = p_angular_limit_lower_y;
- ul = p_angular_limit_upper_y;
- lll = -p_linear_limit_lower_y;
- lul = -p_linear_limit_upper_y;
- enable_ang = p_enable_angular_limit_y;
- enable_lin = p_enable_linear_limit_y;
- a1 = 1;
- a2 = 2;
- a3 = 0;
- break;
- case 2:
- ll = p_angular_limit_lower_z;
- ul = p_angular_limit_upper_z;
- lll = -p_linear_limit_lower_z;
- lul = -p_linear_limit_upper_z;
- enable_ang = p_enable_angular_limit_z;
- enable_lin = p_enable_linear_limit_z;
- a1 = 2;
- a2 = 0;
- a3 = 1;
- break;
- }
-
-#define ADD_VTX(x, y, z) \
- { \
- Vector3 v; \
- v[a1] = (x); \
- v[a2] = (y); \
- v[a3] = (z); \
- r_points.push_back(p_offset.translated(v).origin); \
- }
-
- if (enable_lin && lll >= lul) {
-
- ADD_VTX(lul, 0, 0);
- ADD_VTX(lll, 0, 0);
-
- ADD_VTX(lul, -cs, -cs);
- ADD_VTX(lul, -cs, cs);
- ADD_VTX(lul, -cs, cs);
- ADD_VTX(lul, cs, cs);
- ADD_VTX(lul, cs, cs);
- ADD_VTX(lul, cs, -cs);
- ADD_VTX(lul, cs, -cs);
- ADD_VTX(lul, -cs, -cs);
-
- ADD_VTX(lll, -cs, -cs);
- ADD_VTX(lll, -cs, cs);
- ADD_VTX(lll, -cs, cs);
- ADD_VTX(lll, cs, cs);
- ADD_VTX(lll, cs, cs);
- ADD_VTX(lll, cs, -cs);
- ADD_VTX(lll, cs, -cs);
- ADD_VTX(lll, -cs, -cs);
-
- } else {
-
- ADD_VTX(+cs * 2, 0, 0);
- ADD_VTX(-cs * 2, 0, 0);
- }
-
- if (!enable_ang) {
- ll = 0;
- ul = -1;
- }
-
- if (r_body_a_points)
- JointGizmosDrawer::draw_circle(
- static_cast<Vector3::Axis>(ax),
- BODY_A_RADIUS,
- p_offset,
- JointGizmosDrawer::look_body_toward(static_cast<Vector3::Axis>(ax), p_trs_joint, p_trs_body_a),
- ll,
- ul,
- *r_body_a_points,
- true);
-
- if (r_body_b_points)
- JointGizmosDrawer::draw_circle(
- static_cast<Vector3::Axis>(ax),
- BODY_B_RADIUS,
- p_offset,
- JointGizmosDrawer::look_body_toward(static_cast<Vector3::Axis>(ax), p_trs_joint, p_trs_body_b),
- ll,
- ul,
- *r_body_b_points);
- }
-
-#undef ADD_VTX
-}
diff --git a/editor/spatial_editor_gizmos.h b/editor/spatial_editor_gizmos.h
deleted file mode 100644
index 81b62981ac..0000000000
--- a/editor/spatial_editor_gizmos.h
+++ /dev/null
@@ -1,433 +0,0 @@
-/*************************************************************************/
-/* spatial_editor_gizmos.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef SPATIAL_EDITOR_GIZMOS_H
-#define SPATIAL_EDITOR_GIZMOS_H
-
-#include "editor/plugins/spatial_editor_plugin.h"
-#include "scene/3d/camera.h"
-
-class Camera;
-
-class LightSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(LightSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- LightSpatialGizmoPlugin();
-};
-
-class AudioStreamPlayer3DSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(AudioStreamPlayer3DSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- AudioStreamPlayer3DSpatialGizmoPlugin();
-};
-
-class CameraSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(CameraSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- CameraSpatialGizmoPlugin();
-};
-
-class MeshInstanceSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(MeshInstanceSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- bool can_be_hidden() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- MeshInstanceSpatialGizmoPlugin();
-};
-
-class Sprite3DSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(Sprite3DSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- bool can_be_hidden() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- Sprite3DSpatialGizmoPlugin();
-};
-
-class Position3DSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(Position3DSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
- Ref<ArrayMesh> pos3d_mesh;
- Vector<Vector3> cursor_points;
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- Position3DSpatialGizmoPlugin();
-};
-
-class SkeletonSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(SkeletonSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- SkeletonSpatialGizmoPlugin();
-};
-
-class PhysicalBoneSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(PhysicalBoneSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- PhysicalBoneSpatialGizmoPlugin();
-};
-
-class RayCastSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(RayCastSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- RayCastSpatialGizmoPlugin();
-};
-
-class SpringArmSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(SpringArmSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- SpringArmSpatialGizmoPlugin();
-};
-
-class VehicleWheelSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(VehicleWheelSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- VehicleWheelSpatialGizmoPlugin();
-};
-
-class SoftBodySpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(SoftBodySpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- bool is_selectable_when_hidden() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel);
- bool is_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int idx) const;
-
- SoftBodySpatialGizmoPlugin();
-};
-
-class VisibilityNotifierGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(VisibilityNotifierGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- VisibilityNotifierGizmoPlugin();
-};
-
-class CPUParticlesGizmoPlugin : public EditorSpatialGizmoPlugin {
- GDCLASS(CPUParticlesGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- bool is_selectable_when_hidden() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
- CPUParticlesGizmoPlugin();
-};
-
-class ParticlesGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(ParticlesGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- bool is_selectable_when_hidden() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- ParticlesGizmoPlugin();
-};
-
-class ReflectionProbeGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(ReflectionProbeGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- ReflectionProbeGizmoPlugin();
-};
-
-class GIProbeGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(GIProbeGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- GIProbeGizmoPlugin();
-};
-
-class BakedIndirectLightGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(BakedIndirectLightGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- BakedIndirectLightGizmoPlugin();
-};
-
-class CollisionShapeSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(CollisionShapeSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
- Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
- void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
- void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
-
- CollisionShapeSpatialGizmoPlugin();
-};
-
-class CollisionPolygonSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
- GDCLASS(CollisionPolygonSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
- CollisionPolygonSpatialGizmoPlugin();
-};
-
-class NavigationMeshSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(NavigationMeshSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
- struct _EdgeKey {
-
- Vector3 from;
- Vector3 to;
-
- bool operator<(const _EdgeKey &p_with) const { return from == p_with.from ? to < p_with.to : from < p_with.from; }
- };
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- NavigationMeshSpatialGizmoPlugin();
-};
-
-class JointGizmosDrawer {
-public:
- static Basis look_body(const Transform &p_joint_transform, const Transform &p_body_transform);
- static Basis look_body_toward(Vector3::Axis p_axis, const Transform &joint_transform, const Transform &body_transform);
- static Basis look_body_toward_x(const Transform &p_joint_transform, const Transform &p_body_transform);
- static Basis look_body_toward_y(const Transform &p_joint_transform, const Transform &p_body_transform);
- /// Special function just used for physics joints, it returns a basis constrained toward Joint Z axis
- /// with axis X and Y that are looking toward the body and oriented toward up
- static Basis look_body_toward_z(const Transform &p_joint_transform, const Transform &p_body_transform);
-
- // Draw circle around p_axis
- static void draw_circle(Vector3::Axis p_axis, real_t p_radius, const Transform &p_offset, const Basis &p_base, real_t p_limit_lower, real_t p_limit_upper, Vector<Vector3> &r_points, bool p_inverse = false);
- static void draw_cone(const Transform &p_offset, const Basis &p_base, real_t p_swing, real_t p_twist, Vector<Vector3> &r_points);
-};
-
-class JointSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
-
- GDCLASS(JointSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
-
-public:
- bool has_gizmo(Spatial *p_spatial);
- String get_name() const;
- int get_priority() const;
- void redraw(EditorSpatialGizmo *p_gizmo);
-
- static void CreatePinJointGizmo(const Transform &p_offset, Vector<Vector3> &r_cursor_points);
- static void CreateHingeJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_limit_lower, real_t p_limit_upper, bool p_use_limit, Vector<Vector3> &r_common_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points);
- static void CreateSliderJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_angular_limit_lower, real_t p_angular_limit_upper, real_t p_linear_limit_lower, real_t p_linear_limit_upper, Vector<Vector3> &r_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points);
- static void CreateConeTwistJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_swing, real_t p_twist, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points);
- static void CreateGeneric6DOFJointGizmo(
- const Transform &p_offset,
- const Transform &p_trs_joint,
- const Transform &p_trs_body_a,
- const Transform &p_trs_body_b,
- real_t p_angular_limit_lower_x,
- real_t p_angular_limit_upper_x,
- real_t p_linear_limit_lower_x,
- real_t p_linear_limit_upper_x,
- bool p_enable_angular_limit_x,
- bool p_enable_linear_limit_x,
- real_t p_angular_limit_lower_y,
- real_t p_angular_limit_upper_y,
- real_t p_linear_limit_lower_y,
- real_t p_linear_limit_upper_y,
- bool p_enable_angular_limit_y,
- bool p_enable_linear_limit_y,
- real_t p_angular_limit_lower_z,
- real_t p_angular_limit_upper_z,
- real_t p_linear_limit_lower_z,
- real_t p_linear_limit_upper_z,
- bool p_enable_angular_limit_z,
- bool p_enable_linear_limit_z,
- Vector<Vector3> &r_points,
- Vector<Vector3> *r_body_a_points,
- Vector<Vector3> *r_body_b_points);
-
- JointSpatialGizmoPlugin();
-};
-
-#endif // SPATIAL_EDITOR_GIZMOS_H
diff --git a/editor/translations/af.po b/editor/translations/af.po
index 23917c09e6..19a9e724ba 100644
--- a/editor/translations/af.po
+++ b/editor/translations/af.po
@@ -545,6 +545,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -711,8 +712,9 @@ msgid "Line Number:"
msgstr "Reël Nommer:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Het %d verskynsel(s) vervang."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Vervang"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -731,7 +733,7 @@ msgstr "Pas Letterkas"
msgid "Whole Words"
msgstr "Hele Woorde"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Vervang"
@@ -783,6 +785,11 @@ msgstr "Metode in teiken Nodus moet gespesifiseer word!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metode in teiken Nodus moet gespesifiseer word!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -869,7 +876,6 @@ msgstr "Koppel tans Sein:"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -931,6 +937,11 @@ msgid "Signals"
msgstr "Seine"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Eienskappe"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -972,7 +983,7 @@ msgid "Recent:"
msgstr "Onlangse:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Soek:"
@@ -1159,6 +1170,9 @@ msgstr "Projek Stigters"
msgid "Lead Developer"
msgstr "Hoof Ontwikkelaar"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
#, fuzzy
msgid "Project Manager "
@@ -1181,6 +1195,16 @@ msgid "Gold Sponsors"
msgstr "Goue Borge"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Silver Skenkers"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Brons Skenkers"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Borge"
@@ -1504,7 +1528,7 @@ msgstr "Skuif AutoLaai"
msgid "Remove Autoload"
msgstr "Hernoem AutoLaai"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Aktiveer"
@@ -1512,18 +1536,9 @@ msgstr "Aktiveer"
msgid "Rearrange Autoloads"
msgstr "Herrangskik AutoLaaie"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Ongeldige Pad."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Lêer bestaan nie."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Nie in hulpbron pad nie."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1550,6 +1565,10 @@ msgstr "Naam"
msgid "Singleton"
msgstr "EnkelHouer"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Toneel word Opgedateer"
@@ -1674,16 +1693,17 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
#, fuzzy
msgid "Node Dock"
msgstr "Nodus Naam:"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Deursoek Klasse"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1849,7 +1869,7 @@ msgstr "Open 'n Lêer"
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Verfris"
@@ -1969,7 +1989,7 @@ msgstr "Gidse & Lêers:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Voorskou:"
@@ -2403,10 +2423,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2492,11 +2508,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Open Lêer(s)"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2769,10 +2788,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2834,22 +2849,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2858,8 +2877,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2868,32 +2887,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2955,7 +2974,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Soek"
@@ -2969,7 +2988,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3356,7 +3379,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3383,6 +3407,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -4005,19 +4033,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+#, fuzzy
+msgid "%d Files"
+msgstr "Vind"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -4034,7 +4067,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4070,10 +4103,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "Hulpbron"
@@ -5170,7 +5199,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5930,11 +5959,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Kon nie vouer skep nie."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5946,12 +5976,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "Skep Nuwe"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "Kon nie vouer skep nie."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Skep Nuwe"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6003,19 +6051,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Skep Intekening"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Skep Intekening"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6877,14 +6963,6 @@ msgid "Open Godot online documentation."
msgstr "Opnoemings"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6950,15 +7028,15 @@ msgid ""
msgstr "Koppel '%s' aan '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "Reël:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "Maak Funksie"
@@ -7334,6 +7412,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7423,17 +7505,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7784,7 +7875,7 @@ msgid "New Animation"
msgstr "Optimaliseer Animasie"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8480,7 +8571,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9594,11 +9685,18 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "Lêer bestaan nie."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Fout met oopmaak, die pakket-lêer is nie in zip format nie."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9606,11 +9704,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9830,6 +9928,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Projek Bestuurder"
@@ -9878,6 +9977,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10260,11 +10366,20 @@ msgid "Batch Rename"
msgstr "Pas Letterkas"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Vervang"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10304,11 +10419,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10335,10 +10450,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10347,11 +10458,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10371,6 +10482,15 @@ msgstr ""
msgid "Reset"
msgstr "Herset Zoem"
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Geldige karakters:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10434,8 +10554,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Deursoek Hulp"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10471,6 +10592,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Skrap"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Skrap"
@@ -10598,6 +10724,13 @@ msgid "Open Documentation"
msgstr "Opnoemings"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10647,11 +10780,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10776,6 +10909,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Lêer bestaan nie."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Moet 'n geldige uitbreiding gebruik."
@@ -10818,6 +10955,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Ongeldige Pad."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Ongeldige naam."
@@ -10826,7 +10968,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10853,6 +10995,12 @@ msgid "Script file already exists."
msgstr "AutoLaai '%s' bestaan reeds!"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Klas:"
@@ -10928,6 +11076,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Skep"
@@ -10978,7 +11130,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11871,6 +12023,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11895,6 +12051,32 @@ msgstr "Ongeldige naam."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12082,6 +12264,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12269,6 +12457,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12289,6 +12482,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12512,6 +12710,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
@@ -12540,6 +12742,12 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Not in resource path."
+#~ msgstr "Nie in hulpbron pad nie."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Het %d verskynsel(s) vervang."
+
#, fuzzy
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
index 6a3dba2b43..6335b82b15 100644
--- a/editor/translations/ar.po
+++ b/editor/translations/ar.po
@@ -7,7 +7,7 @@
# Basil Al-Khateeb <basil.y.alkhateeb@gmail.com>, 2017.
# Jamal Alyafei <jamal.qassim@gmail.com>, 2017.
# john lennon <khoanantonio@outlook.com>, 2017.
-# Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016.
+# Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016, 2020.
# Mr ChaosXD <mrchaosxd3@gmail.com>, 2018.
# Mrwan Ashraf <mrwan.ashraf94@gmail.com>, 2017.
# noureldin sharaf <sharaf.noureldin@yahoo.com>, 2017.
@@ -33,12 +33,24 @@
# traveller010 <manar.bushnaq.001@gmail.com>, 2019.
# 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.
+# merouche djallal <kbordora@gmail.com>, 2020.
+# Airbus5717 <Abdussamadf350@gmail.com>, 2020.
+# tamsamani mohamed <tamsmoha@gmail.com>, 2020.
+# Anas <anas.ghamdi61@gmail.com>, 2020.
+# R-K <raouf9005@gmail.com>, 2020.
+# HeroFight dev <abdkafi2002@gmail.com>, 2020.
+# أحمد مصطفى الطبراني <eltabaraniahmed@gmail.com>, 2020.
+# ChemicalInk <aladdinalkhafaji@gmail.com>, 2020.
+# Musab Alasaifer <mousablasefer@gmail.com>, 2020.
+# Yassine Oudjana <y.oudjana@protonmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-16 22:23+0000\n"
-"Last-Translator: hshw <shw@tutanota.com>\n"
+"PO-Revision-Date: 2020-09-12 00:46+0000\n"
+"Last-Translator: Yassine Oudjana <y.oudjana@protonmail.com>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/"
"godot/ar/>\n"
"Language: ar\n"
@@ -47,12 +59,12 @@ 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 3.10.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "نوع معامل خاطئ للدالة convert()، إستخدم ثوابت TYPE_*."
+msgstr "معامل خاطئ لدالة ()Convert, استخدم احدى الثوابت من مجموعة TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
@@ -146,11 +158,11 @@ msgstr "أدخل المفتاح هنا"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "استنساخ المفاتيح المحدد(ة)"
+msgstr "تكرار المفتاح(المفاتيح) المحدد(ة)"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "إمسح المفاتيح المحدد(ة)"
+msgstr "إمسح المفتاح(المفاتيح) المحدد(ة)"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
@@ -174,7 +186,7 @@ msgstr "تغيير وقت الإطار الرئيسي للحركة"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "تغيير إنتقالية التحريك"
+msgstr "تغيير إنتقالية الرسوم المتحركة"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
@@ -243,11 +255,11 @@ msgstr "شريط ضبط الحركة"
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr "مدة الحركة (frames)"
+msgstr "مدة الحركة (بالإطارات)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
-msgstr "مدة الحركة (seconds)"
+msgstr "مدة الحركة (بالثواني)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
@@ -342,7 +354,7 @@ msgstr "التفاف الحلقة المثبتة"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "أدخل مفتاح"
+msgstr "أدخل المفتاح"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
@@ -370,7 +382,7 @@ msgstr "حذف مسار التحريك"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr "أنشئ مسار جديد لـ %s و أدخل مفتاح؟"
+msgstr "أنشئ مسار جديد لـ %s و إدخال مفتاح؟"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
@@ -434,11 +446,11 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr "مسارات الحركة يمكنها فقط أن تشير إلى عقد مشغّل الحركة."
+msgstr "مسارات الحركة يمكنها فقط أن تشير إلى عُقد مشغّل الحركة."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr "مشغل الحركة لا يمكنه تحريك نفسه, فقط الاعبين الأخرين."
+msgstr "مشغل الحركة لا يمكنه أن يحرك نفسه, فقط الاعبين الأخرين."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
@@ -446,11 +458,11 @@ msgstr "لا يمكن إضافة مقطع جديد بدون جذر"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "مقطع غير متوافق مع منحنى بيزر (Bezier) (خصائص فرعية غير متوافقة)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
-msgstr "إضافة مسار لمنحنى بريزير"
+msgstr "إضافة مسار لمنحنى بيزر"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -458,7 +470,7 @@ msgstr "مسار المقطع غير صالح, إذن لا يمكن إضافة
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr "المقطع ليس من نوع مكاني (Spatial), لا يمكن إضافة مفتاح."
+msgstr "المقطع ليس من نوع مكاني (Spatial), لا يمكن إضافة مفتاح"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
@@ -486,7 +498,7 @@ msgstr "مفتاح حركة التحريك"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr "ذاكرة التخزين المؤقت (Clipboard) فارغة"
+msgstr "الحافظة (Clipboard) فارغة"
#: editor/animation_track_editor.cpp
msgid "Paste Tracks"
@@ -499,7 +511,7 @@ msgstr "مفتاح تكبير حركة"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr "هذا الخيار لا يعمل لتعديل خط (Bezier), لأنه فقط مقطع واحد."
+msgstr "هذا الخيار لا يعمل لتعديل منحنى بيزر (Bezier), لأنه فقط مقطع واحد."
#: editor/animation_track_editor.cpp
msgid ""
@@ -513,12 +525,14 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
-"هذا الانيميشن ينتمي الى مشهد مستورد، لذا فإن أي تغييرات في المسارات "
-"المستوردة لن يتم حفظها.\n"
+"هذه الحركة (رسوم متحركة) تنتمي الى مشهد مستورد، لذا فإن أي تغييرات في "
+"المسارات المستوردة لن يتم حفظها.\n"
"\n"
"لتشغيل الامكانية لإضافة مسارات خاصة، انتقل إلى إعدادات استيراد المشهد واضبط "
-"\"Animation > Storage\" إلى \"Files\"، شغل \"Animation > Keep Custom Tracks"
-"\"، ثم ..."
+"\"رسوم متحركة > تخزين\" إلى \"ملفات\"،\n"
+"شغل \"رسوم متحركة > أحتفظ بالمقاطع (المسارات) المخصصة\"، ثم اعد الاستيراد.\n"
+"يمكنك ايضاً استخدام إعدادات استيراد مسبقة تقوم باستيراد الرسم المتحرك الى "
+"ملفات متفرقة."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
@@ -549,6 +563,7 @@ msgid "Seconds"
msgstr "ثواني"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "إطار خلال ثانية"
@@ -584,7 +599,7 @@ msgstr "تكرير المحدد"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "نسخ محمّل"
+msgstr "نقل مكرر"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
@@ -592,11 +607,11 @@ msgstr "إحدف المحدد (المجموعة المختارة)"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
-msgstr "إذهب إلي الخطوة التالية"
+msgstr "إذهب إلى الخطوة التالية"
#: editor/animation_track_editor.cpp
msgid "Go to Previous Step"
-msgstr "إذهب إلي الخطوة السابقة"
+msgstr "إذهب إلى الخطوة السابقة"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -612,7 +627,7 @@ msgstr "إختار العقدة التي سوف يتم تحريكها:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr "إستعمل منحنيات بيزية"
+msgstr "إستعمل منحنيات بيزر"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -669,7 +684,7 @@ msgstr "إختر المقاطع المراد نسخها"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr "أنسخ"
+msgstr "نسخ"
#: editor/animation_track_editor.cpp
msgid "Select All/None"
@@ -708,8 +723,8 @@ msgid "Line Number:"
msgstr "رقم الخط:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "إستبُدل %d حادثة(حوادث)."
+msgid "%d replaced."
+msgstr "تم إستبدال %d."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -727,7 +742,7 @@ msgstr "قضية تشابه"
msgid "Whole Words"
msgstr "كل الكلمات"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "إستبدال"
@@ -746,19 +761,19 @@ msgstr "معياري"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "تحديد التبويب البرمجي"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "تقريب"
+msgstr "تكبير"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "إبعاد"
+msgstr "تصغير"
#: editor/code_editor.cpp
msgid "Reset Zoom"
@@ -777,11 +792,15 @@ msgid "Method in target node must be specified."
msgstr "يجب تحديد الدالة في العقدة المستهدفة."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "اسم الدالة يجب أن تكون مميزاً و صالحاً."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
-"لم يتم العثور على الدالة المستهدفة. حدّد دالة سليمة أو أرفق كود للعقدة "
+"لم يتم العثور على الدالة المستهدفة. حدّد دالة سليمة أو أرفق نص برمجي للعقدة "
"المستهدفة."
#: editor/connections_dialog.cpp
@@ -826,9 +845,8 @@ msgid "Extra Call Arguments:"
msgstr "وسائط إستدعاء إضافية :"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "إختر طريقة"
+msgstr "الدالة المُتلقنة:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -859,7 +877,6 @@ msgstr "إشارة غير قادر على الاتصال"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -868,14 +885,13 @@ msgstr "إشارة غير قادر على الاتصال"
#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Close"
-msgstr "اغلاق"
+msgstr "إغلاق"
#: editor/connections_dialog.cpp
msgid "Connect"
msgstr "وصل"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
msgstr "إشارة:"
@@ -910,15 +926,20 @@ msgstr "تعديل الإتصال:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "هل أنت(ي) متأكد(ة) أنك تود إزالة كل الإتصالات من الإشارة \"%s\"؟"
+msgstr "هل أنت متأكد أنك تود إزالة كل الإتصالات من الإشارة \"%s\"؟"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr "إشارات"
+msgstr "الإشارات"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "تنقية البلاطات"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr "هل أنت(ي) متأكد(ة) أنك تود إزالة كل الإتصالات من هذه الإشارة؟"
+msgstr "هل أنت متأكد أنك تود إزالة كل الإتصالات من هذه الإشارة؟"
#: editor/connections_dialog.cpp
msgid "Disconnect All"
@@ -954,7 +975,7 @@ msgid "Recent:"
msgstr "الحالي:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "بحث:"
@@ -979,7 +1000,7 @@ msgstr "البحث عن بديل لـ:"
#: editor/dependency_editor.cpp
msgid "Dependencies For:"
-msgstr "تابعة لـ:"
+msgstr "تبعيات لـ:"
#: editor/dependency_editor.cpp
msgid ""
@@ -1084,7 +1105,7 @@ msgstr "اخطاء في التحميل!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "إمسح نهائيا %d عنصر(عناصر)؟ (بلا رجعة!)"
+msgstr "هل تريد حذف %d عنصر (عناصر) نهائيًا؟ (لا تراجع!)"
#: editor/dependency_editor.cpp
msgid "Show Dependencies"
@@ -1100,7 +1121,7 @@ msgstr "متصفح الموارد أورفان"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr "مسح"
+msgstr "حذف"
#: editor/dependency_editor.cpp
msgid "Owns"
@@ -1120,11 +1141,11 @@ msgstr "تغيير قيمة في القاموس"
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
-msgstr "شكراً من مجتمع Godot!"
+msgstr "شكراً من مجتمع غودوت!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
-msgstr "المسهامين في محرك Godot"
+msgstr "المسهامين في محرك غودوت"
#: editor/editor_about.cpp
msgid "Project Founders"
@@ -1134,6 +1155,9 @@ msgstr "مؤسسون المشروع"
msgid "Lead Developer"
msgstr "قائد المطوريين"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "مدير المشروع "
@@ -1155,6 +1179,14 @@ msgid "Gold Sponsors"
msgstr "الرعاة الذهبيين"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "المانحين الفضيين"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "المانحين البرنزيين"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "الرعاة الصغار"
@@ -1189,9 +1221,9 @@ msgid ""
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
-"محرك \"Godot\" يعتمد على عدد من المكتبات و المكونات البرمجية لملاك اخرين و "
-"لكنها مجانية و مفتوحة المصدر، و كلها متفقة مع شروط الاستخدام لرخصة \"MIT\". "
-"في ما يلي قائمة تحوي جميع هذه المكونات اضافة الى حقوق النشر و شروط الاستخدام "
+"محرك غودوت يعتمد على عدد من المكتبات و المكونات البرمجية لملاك اخرين و لكنها "
+"مجانية و مفتوحة المصدر، و كلها متفقة مع شروط الاستخدام لرخصة \"MIT\". في ما "
+"يلي قائمة تحوي جميع هذه المكونات اضافة الى حقوق النشر و شروط الاستخدام "
"الخاصة بها."
#: editor/editor_about.cpp
@@ -1211,9 +1243,8 @@ msgid "Error opening package file, not in ZIP format."
msgstr "حدث خطأ عندفتح ملف الحزمة بسبب أن الملف ليس في صيغة \"ZIP\"."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "التحميل التلقائي '%s' موجود اصلا!"
+msgstr "%s (موجود بالفعل!)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1224,9 +1255,8 @@ msgid "The following files failed extraction from package:"
msgstr "فشل استخراج الملفات التالية من الحزمة:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "%d مزيد من الملفات"
+msgstr "و %s أيضاً من الملفات."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
@@ -1238,9 +1268,8 @@ msgid "Success!"
msgstr "تم بشكل ناجح!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "المحتويات:"
+msgstr "محتويات الرزمة:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1260,39 +1289,39 @@ msgstr "أضف تأثير"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
-msgstr "إعادة تسمية بيوس الصوت"
+msgstr "إعادة تسمية مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Change Audio Bus Volume"
-msgstr "تغيير حجم صوت البيوس"
+msgstr "تغيير حجم صوت مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
-msgstr "تبديل بيوس الصوت إلي فردي"
+msgstr "تبديل مسار الصوت إلي فردي"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr "تبديل بيوس الصوت إلي صامت"
+msgstr "تبديل مسار الصوت إلي صامت"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr "تبديل بيوس الصوت إلي موثرات التبديل"
+msgstr "تبديل مسار الصوت إلي موثرات التبديل"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr "حدد بيوس الصوت للإرسال"
+msgstr "حدد مسار الصوت للإرسال"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr "أضف موثرات إلي بيوس الصوت"
+msgstr "أضف موثرات إلي مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr "حرك مؤثر البيوس"
+msgstr "حرك ثأثير مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr "مسح تأثير البيوس"
+msgstr "مسح تأثير مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
@@ -1312,7 +1341,7 @@ msgstr "تخطي"
#: editor/editor_audio_buses.cpp
msgid "Bus options"
-msgstr "إعدادات البيوس"
+msgstr "إعدادات مسار الصوت"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -1333,31 +1362,31 @@ msgstr "الصوت"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
-msgstr "أضف بيوس الصوت"
+msgstr "أضف مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr "البيوس الأساسي لا يمكن مسحة!"
+msgstr "مسار الصوت الأساسي لا يمكن مسحة!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr "إمسح بيوس الصوت"
+msgstr "إمسح مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
-msgstr "تكرير بيوس الصوت"
+msgstr "تكرار مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Reset Bus Volume"
-msgstr "إرجاع صوت البيس"
+msgstr "إرجاع صوت المسار"
#: editor/editor_audio_buses.cpp
msgid "Move Audio Bus"
-msgstr "تحريك بيوس الصوت"
+msgstr "تحريك مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
-msgstr "إحفظ نسق بيوس الصوت كـ..."
+msgstr "حفظ تخطيط مسار الصوت كـ…"
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
@@ -1365,7 +1394,7 @@ msgstr "المكان للنسق الجديد..."
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
-msgstr "إفتح نسق بيوس الصوت"
+msgstr "إفتح نسق مسار الصوت"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
@@ -1377,16 +1406,15 @@ msgstr "المخطط"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr "ملف خطأ، ليس ملف نسق بيوس الصوت."
+msgstr "ملف خطأ، ليس ملف نسق مسار الصوت."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "خطأ في حفظ مجموعة البلاط!"
+msgstr "خطأ في تحميل الملف: s%"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr "أضف بيوس"
+msgstr "أضف مسار"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
@@ -1400,7 +1428,7 @@ msgstr "تحميل"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr "تحميل نسق بيوس موجود مسبقاً."
+msgstr "تحميل نسق مسار موجود مسبقاً."
#: editor/editor_audio_buses.cpp
msgid "Save As"
@@ -1408,7 +1436,7 @@ msgstr "حفظ بأسم"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr "إحفظ نسق البيوس هذا إلي ملف."
+msgstr "إحفظ نسق هذا مسار إلي ملف."
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
@@ -1416,11 +1444,11 @@ msgstr "تحميل الإفتراضي"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr "تحميل نسق البيوس الإفتراضي."
+msgstr "تحميل نسق المسار الإفتراضي."
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr "أنشئ نسق بيوس جديد."
+msgstr "أنشئ نسق مسار جديد."
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
@@ -1435,18 +1463,16 @@ msgid "Must not collide with an existing engine class name."
msgstr "إسم غير صالح، يجب أن لا يتصادم مع أسم فئة خاصة بالمحرك."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
-msgstr "إسم غير صالح، يجب أن لا يتصادم مع الأسماء المبنية تلقائياً الموجودة."
+msgstr "اسم غير صالح يجب ألا يتضارب مع اسم موجود ومبني ضمناً بالمحرك."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
-msgstr "إسم غير صالح، ييجب ألاّ يتصادم مع إسم موجود لثابت عمومي."
+msgstr "اإسم غير صالح، ييجب ألاّ يتضارب مع اسم ثابت عام موجود سلفاً."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "لا يمكن استخدام الكلمة المفتاحية كاسم التحميل التلقائي."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
@@ -1468,26 +1494,17 @@ msgstr "نقل التحميل التلقائي"
msgid "Remove Autoload"
msgstr "ازالة التحميل التلقائي"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
-msgstr "تمكين"
+msgstr "تفعيل"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
msgstr "اعادة ترتيب التحميلات التلقائية"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "مسار غير صالح."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "الملف غير موجود."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "ليس في مسار الموارد."
+msgid "Can't add autoload:"
+msgstr "لا يمكن إضافة التحميل التلقائي:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1514,6 +1531,10 @@ msgstr "الأسم"
msgid "Singleton"
msgstr "الفردية"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "لصق المُعامل"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "يُحدث المشهد"
@@ -1535,9 +1556,8 @@ msgid "[unsaved]"
msgstr "[غير محفوظ]"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first."
-msgstr "من فضلك حدد الوجهة الأساسية أولاً"
+msgstr "من فضلك حدد الوجهة الأساسية أولاً."
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
@@ -1600,13 +1620,16 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"تتطلب المنصة المستهدفة ضغط الرسومات النقشية 'ETC' texture ليرجع المعرّف إلى "
+"GLES2.\n"
+"مكّن 'استيراد Etc' في إعدادات المشروع، أو عطّل 'تمكين التوافق الرجعي للتعريفات "
+"Driver Fallback Enabled'."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "ملف النموذج غير موجود:"
+msgstr "نمودج تصحيح الأخطاء غير موجود."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1620,121 +1643,106 @@ msgstr "ملف النموذج غير موجود:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
+msgstr "لا يمكن لمُصدرات 32-bit التي تتضمن PCK أن تكون أكبر من 4 GiB."
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "المُعدل"
+msgstr "محرر تلاثي الأبعاد"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "فتح مُعدل الكود"
+msgstr "محرر النص البرمجي"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr "مكتبة الأصول"
+msgstr "مكتبة المُلحقات"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "إستيراد"
+msgstr "تعديل شجرة المشهد"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
-msgstr "وضع التحريك"
+msgstr "رصيف العُقد"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "نظام الملفات"
#: editor/editor_feature_profile.cpp
-#, fuzzy
+msgid "Import Dock"
+msgstr "رصيف الاستيراد"
+
+#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr "إستبدال الكل"
+msgstr "مسح الملف الشخصي '%s'؟ (لا تراجع)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
+msgstr "ينبغي أن يكون الملف الشخصي اسم ملف صالح وألّا يحتوي '.'"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Profile with this name already exists."
-msgstr "ملف أو مجلد مع هذا الأسم موجود بالفعل."
+msgstr "ملفٌ بهذا الاسم موجود بالفعل."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(المحرر مُعطّل، الخاصيات مُعطّلة)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "خصائص فقط"
+msgstr "(الخاصيات مُعطّلة)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "معطّل"
+msgstr "(المُحرر مُعطّل)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "وصف الصف:"
+msgstr "إعدادات الصف (Class):"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enable Contextual Editor"
-msgstr "فتح في المُعدل التالي"
+msgstr "مكّن المحرر السياقي Contextual"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "خصائص:"
+msgstr "الخصائص المُمكّنة:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
-msgstr "الميزات المفعلة:"
+msgstr "الميزات المُمكّنة:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Classes:"
-msgstr "إبحث في الأصناف"
+msgstr "الصفوف المُمكّنة:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "لاحقة الملف '%s' غير صالحة، أجهض الإستيراد."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
-msgstr ""
+msgstr "الملف'%s' موجود سلفاً، قم بإزالته بداية قبل الاستيراد، أجهض الإستيراد."
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "خطأ في حفظ مجموعة البلاط!"
+msgstr "خطأ في حفظ الملف إلى المسار: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "غير مُحدد"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "النسخة الحالية:"
+msgstr "الملف (النسخة) الحالية:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "الحالي:"
+msgstr "إجعل الحالي"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1752,44 +1760,36 @@ msgid "Export"
msgstr "تصدير"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "خصائص:"
+msgstr "الملفات المتوافرة:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "وصف الصف"
+msgstr "إعدادات الصف Class"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "New profile name:"
-msgstr "إسم جديد:"
+msgstr "اسم مَلف (profile) جديد:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "زر الفأرة الأيمن: مسح النقطة."
+msgstr "مسح الملف"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "إدارة قوالب التصدير"
+msgstr "ملفات غودوت المُرشّحة"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Import Profile(s)"
-msgstr "%d مزيد من الملفات"
+msgstr "استيراد الملف(الملفات)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Export Profile"
-msgstr "تصدير المشروع"
+msgstr "تصدير الملف"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Manage Editor Feature Profiles"
-msgstr "إدارة قوالب التصدير"
+msgstr "تدبير محرر الملفات المُرشحة"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
@@ -1800,7 +1800,6 @@ msgid "File Exists, Overwrite?"
msgstr "الملف موجود، إستبدال؟"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "حدد هذا المجلد"
@@ -1809,13 +1808,11 @@ msgid "Copy Path"
msgstr "نسخ المسار"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "أظهر في مدير الملفات"
+msgstr "افتح في مدير الملفات"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
msgstr "أظهر في مدير الملفات"
@@ -1823,7 +1820,7 @@ msgstr "أظهر في مدير الملفات"
msgid "New Folder..."
msgstr "مجلد جديد..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "تحديث"
@@ -1865,15 +1862,15 @@ msgstr "حفظ ملف"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr "إرجع للخلف"
+msgstr "الرجوع للخلف"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr "إذهب للأمام"
+msgstr "الذهاب للأمام"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr "إذهب للأعلي"
+msgstr "إذهب للأعلى"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
@@ -1893,51 +1890,43 @@ msgstr "مسار التركيز"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "حرك المُفضلة للأعلي"
+msgstr "حرك المُفضلة للأعلى"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
msgstr "حرك المُفضلة للأسفل"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "إذهب إلي المجلد السابق"
+msgstr "إرجع إلي المجلد السابق."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "إذهب إلي المجلد السابق"
+msgstr "إذهب إلي المجلد التالي."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "إذهب إلي المجلد السابق"
+msgstr "إذهب إلي مجلد الأصل."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "إبحث في الأصناف"
+msgstr "حَدِّث الملفات."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "لا يمكن إنشاء المجلد."
+msgstr "إضافة المجلد إلى المفضلة / إخراجه من المفضلة."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "أظهر الملفات المخفية"
+msgstr "إظهار/إخفاء الملفات المخفية."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "أظهر العناصر كشبكة من الصور المصغرة"
+msgstr "أظهر العناصر كشبكة من الصور المصغرة."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "أظهر العناصر كقائمة"
+msgstr "أظهر العناصر كقائمة."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
@@ -1945,7 +1934,7 @@ msgstr "الوجهات والملفات:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "إستعراض:"
@@ -1965,7 +1954,7 @@ msgstr "فحص المصادر"
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
-msgstr ""
+msgstr "هناك عدة مستوردات مخصوصة لعدة أنواع حددت الملف %s، أجهض الإستيراد"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
@@ -1989,14 +1978,12 @@ msgid "Inherited by:"
msgstr "مورث بواسطة:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "الوصف:"
+msgstr "الوصف"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "الدورس علي الإنترنت:"
+msgstr "التعليمات على الإنترنت"
#: editor/editor_help.cpp
msgid "Properties"
@@ -2004,20 +1991,19 @@ msgstr "خصائص"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "يتجاوز:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "الإفتراضي"
+msgstr "الافتراضي:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "قائمة الطرق"
+msgstr "الطُرق"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "خصائص الثمة"
+msgstr "خصائص الثِمة"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2028,14 +2014,12 @@ msgid "Constants"
msgstr "الثوابت"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "وصف الملكية:"
+msgstr "أوصاف المُلكية"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "القيمة:"
+msgstr "(القيمة)"
#: editor/editor_help.cpp
msgid ""
@@ -2046,9 +2030,8 @@ msgstr ""
"المساهمة واحد [color=$color][url=$url]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "وصف الطريقة:"
+msgstr "أوصاف الدوال"
#: editor/editor_help.cpp
msgid ""
@@ -2061,16 +2044,15 @@ msgstr ""
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr "إبحث في المساعدة"
+msgstr "ابحث في المساعدة"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
msgstr "حساسة لحالة الأحرف"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "أظهر المساعدات"
+msgstr "اظهر التراتبية"
#: editor/editor_help_search.cpp
msgid "Display All"
@@ -2097,9 +2079,8 @@ msgid "Properties Only"
msgstr "خصائص فقط"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "خصائص"
+msgstr "خصائص الموضوع Theme فقط"
#: editor/editor_help_search.cpp
msgid "Member Type"
@@ -2107,35 +2088,31 @@ msgstr "نوع العضو"
#: editor/editor_help_search.cpp
msgid "Class"
-msgstr "الصنف"
+msgstr "الصف"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "قائمة الطرق"
+msgstr "دالة"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "إشارات"
+msgstr "الإشاراة"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
msgstr "ثابت"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "خصيصة:"
+msgstr "خاصية"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "خصائص الثمة"
+msgstr "خاصية الموضوع (Theme)"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr "خصيصة:"
+msgstr "خاصية:"
#: editor/editor_inspector.cpp
msgid "Set"
@@ -2143,16 +2120,15 @@ msgstr "مجموعة"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "تحديد التكرار:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr "الخرج:"
+msgstr "المُخرجات:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "حذف المُحدد"
+msgstr "نسخ المُحدد"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2162,11 +2138,11 @@ msgstr "حذف المُحدد"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr "خالي"
+msgstr "مسح"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr "أخلاء الخرج"
+msgstr "مسح المُخرجات"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2175,22 +2151,20 @@ msgstr "إيقاف"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "بدء!"
+msgstr "بدء"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "تنزيل"
+msgstr "أسفل"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr "فوق"
+msgstr "أعلى"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
@@ -2198,19 +2172,19 @@ msgstr "عقدة"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "نداء إجراء بعيد وادر"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "RSET (ناقل الحالة التمثيلية) وارد"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "نداء الإجراء البعيد RPC صادر"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "ناقل الحالة التمثيلية RSET صادر"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
@@ -2218,7 +2192,7 @@ msgstr "نافذة جديدة"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "لا يمكن حفظ الموارد المستوردة."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
@@ -2234,6 +2208,8 @@ msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"لا يمكن حفظ هذا المورد كونه لا ينتمي إلى المشهد الذي تم تحريره. اجعله مميزاً "
+"بداية."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
@@ -2253,7 +2229,7 @@ msgstr "خطأ خلال الحفظ."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "لا يمكن فتح '%s'. ربما تم حذف الملف أو نقله."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2277,7 +2253,7 @@ msgstr "حفظ المشهد"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr "يحلل"
+msgstr "جاري التحليل"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
@@ -2285,13 +2261,15 @@ msgstr "ينشئ الصورة المصغرة"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
-msgstr "هذه العملية لا يمكنها الإكتمال من غير جزر الشجرة."
+msgstr "هذه العملية لا يمكنها الإكتمال من غير شجرة رئيسة."
#: editor/editor_node.cpp
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"لا يمكن حفظ هذا المشهد كونخ يتضمن نمذجة دورية cyclic instancing.\n"
+"من فضلك قم بحل تلك المشكلة ومن ثمَّ حاول من جديد."
#: editor/editor_node.cpp
msgid ""
@@ -2301,7 +2279,7 @@ msgstr "لا يمكن حفظ المشهد. على الأرجح لا يمكن إ
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "لا يمكن الكتابة عنوة (استبدال overwrite ) المشهد كونه ما زال مفتوحاً!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2346,7 +2324,6 @@ msgstr ""
"هذا النظام."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
@@ -2363,7 +2340,6 @@ msgstr ""
"الإستيراد ومن ثم أعد إستيراده."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This scene was imported, so changes to it won't be kept.\n"
"Instancing it or inheriting will allow making changes to it.\n"
@@ -2376,13 +2352,12 @@ msgstr ""
"هذا النظام."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This is a remote object, so changes to it won't be kept.\n"
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"هذا المصدر ينتمي إلي مشهد قد تم إستيراده، إذا لا يمكن تعديله.\n"
+"هذا المصدر ينتمي إلي مشهد قد تم إستيراده، التعديلات لن تحفظ.\n"
"من فضلك إقرأ التوثيق المرتبط بإستيراد المشاهد لكي تفهم بشكل أفضل كيفية عمل "
"هذا النظام."
@@ -2391,10 +2366,6 @@ msgid "There is no defined scene to run."
msgstr "ليس هناك مشهد محدد ليتم تشغيله."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "المشهد الحالي لم يتم حفظه. الرجاء حفظ المشهد قبل تشغيله و اختباره."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "لا يمكن بدء عملية جانبية!"
@@ -2407,9 +2378,8 @@ msgid "Open Base Scene"
msgstr "فتح مشهد أساسي"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "فتح سريع للمشهد..."
+msgstr "فتح سريع ..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2428,17 +2398,16 @@ msgid "Save changes to '%s' before closing?"
msgstr "هل تريد حفظ التغييرات إلي'%s' قبل الإغلاق؟"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "فشل تحميل المورد."
+msgstr "حفظت %s الموارد المعدلة."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr ""
+msgstr "يتطلب حفظ المشهد توافر عُقدة رئيسة."
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr "حفظ المشهد كـ..."
+msgstr "حفظ المشهد كـ…"
#: editor/editor_node.cpp
msgid "No"
@@ -2481,12 +2450,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "لا يمكن إعادة تحميل مشهد لم يتم حفظه من قبل."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "إرجاع"
+msgid "Reload Saved Scene"
+msgstr "إعادة تحميل المشهد المحفوظ"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "هذا الفعل لا يمكن إرجاعة. إرجاع علي أية حال؟"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"يحتوي المشهد الحالي على تغييرات غير محفوظة.\n"
+"إعادة تحميل المشهد المحفوظ على أي حال؟ لا يمكن التراجع عن هذا الإجراء."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2494,7 +2467,7 @@ msgstr "تشغيل مشهد بسرعة..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr "خروج"
+msgstr "إنهاء"
#: editor/editor_node.cpp
msgid "Exit the editor?"
@@ -2535,9 +2508,8 @@ msgid "Close Scene"
msgstr "اغلاق المشهد"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "اغلاق المشهد"
+msgstr "إعادة فتح المشهد"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2546,31 +2518,33 @@ msgstr "غير قادر علي تفعيل إضافة البرنامج المُس
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
msgstr ""
-"غير قادر علي إيجاد منطقة الكود من أجل إضافة البرنامج في: 'res://addons/%s'."
+"غير قادر علي إيجاد منطقة النص البرمجي من أجل إضافة البرنامج في: 'res://"
+"addons/%s'."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "غير قادر علي تحميل كود الإضافة من المسار: '%s'."
+msgstr "غير قادر علي تحميل النص البرمجي للإضافة من المسار: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"غير قادر علي تحميل كود الإضافة من المسار: '%s' الكود ليس في وضع الأداة."
+"غير قادر علي تحميل النص البرمجي الإضافب من المسار: '%s' يبدو أن شِفرة "
+"البرمجية يوجد بها أخطاء , الرجاء مراجعة الشِفرة البرمجية."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
-"غير قادر علي تحميل كود الإضافة من المسار: '%s' النوع الأساسي ليس إضافة "
-"للمُعدل."
+"غير قادر علي تحميل النص البرمجي الإضافي من المسار: '%s' النوع الأساسي ليس "
+"إضافة المُعدل."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
-"غير قادر علي تحميل كود الإضافة من المسار: '%s' الكود ليس في وضع الأداة."
+"غير قادر علي تحميل النص البرمجي الإضافي من المسار: '%s' النص البرمجي ليس في "
+"وضع الأداة."
#: editor/editor_node.cpp
msgid ""
@@ -2638,24 +2612,20 @@ msgstr "الإفتراضي"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "أظهر في مدير الملفات"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
msgstr "تشغيل المشهد"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "اغلاق"
+msgstr "اغلاق التبويب"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "اغلاق"
+msgstr "تراجع عن ‭‬إغلاق التبويب"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2663,12 +2633,11 @@ msgstr "أغلق الألسنة الاخرى"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "أغلق التبويبات على اليمين"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "اغلاق"
+msgstr "اغلاق جميع نوافذ التبويب"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2711,9 +2680,8 @@ msgid "Go to previously opened scene."
msgstr "اذهب الي المشهد المفتوح مسبقا."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "نسخ المسار"
+msgstr "نسخ النص"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2752,21 +2720,20 @@ msgid "Save Scene"
msgstr "حفظ المشهد"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "حفظ جميع المشاهد"
#: editor/editor_node.cpp
msgid "Convert To..."
-msgstr "تحويل الي..."
+msgstr "تحويل إلى..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
-msgstr "مكتبة الميش..."
+msgstr "مكتبة مجسّمات..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr "مجموعة البلاط..."
+msgstr "مجموعة بلاط..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2776,15 +2743,11 @@ msgstr "تراجع"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "إعادة"
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "إعادة المشهد"
+msgstr "إعادة تراجع"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
-msgstr "ادوات لكل-المشهد او لمشاريع متنوعه."
+msgstr "أدوات مشروع أو مشهد متنوعة."
#: editor/editor_node.cpp editor/project_manager.cpp
#: editor/script_create_dialog.cpp
@@ -2792,49 +2755,44 @@ msgid "Project"
msgstr "مشروع"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "إعدادات المشروع"
+msgstr "إعدادات المشروع..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "النسخة:"
+msgstr "التحكم بالإصدار"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "إعداد التحكم بالنسخة"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "إطفاء التحكم بالنسخة Version Control"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "تصدير"
+msgstr "تصدير..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "تحميل قالب البناء للأندرويد..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "فتح مدير المشروع؟"
+msgstr "فتح مجلد بيانات المشروع"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
-msgstr "ادوات"
+msgstr "أدوات"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "متصفح الموارد أورفان"
+msgstr "متصفح الموارد أورفان..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "غادر الي قائمه المشاريع"
+msgstr "العودة إلى قائمة المشاريع"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -2847,63 +2805,72 @@ msgstr "نشر مع تصحيح الأخطاء عن بعد"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"حينما يتم التصدير أو النشر، ملف التشغيل الناتج سوف يحاول الإتصال إلي عنوان "
-"الأي بي الخاص بهذا الكمبيوتر من أجل تصحيح الأخطاء."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "نشر مصغر مع نظام شبكات الملفات"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
-"حينما يتم تفعيل هذا الإعداد، التصدير او النشر سوف ينتج ملف تشغيل بالحد "
-"الأدني.\n"
+"حينما يتم تفعيل هذا الإعداد، التصدير أو النشر سوف ينتج ملف تشغيل بالحد "
+"الأدنى (مبسط).\n"
"نظام الملفات سوف يتم توفيره بواسطة المُعدل من خلال الشبكة.\n"
-"علي الأندرويد، النشر سوف يستخدم وصلة اليو اس بي من أجل أداء أسرع. هذا "
-"الأعداد يسرع الإختبار للإلعاب مع الملفات الكثيرة."
+"على الأندرويد، النشر سوف يستخدم وصلة اليو إس بي من أجل أداء أسرع. هذا "
+"الإعداد يسرّع إختبار الألعاب ذو الحجم الكبير."
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
msgstr "أشكال إصطدام ظاهرة"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
-"أشكال الإصطدام و وعقد الراي كاست (من أجل 2D و 3D) سوف تكون ظاهرة في اللعبة "
-"العاملة إذا كان هذا الإعداد مُفعل."
+"أشكال الإصطدام و عُقد الراي كاست (من أجل 2D و 3D) سوف تكون ظاهرة في اللعبة "
+"العاملة إذا كان هذا الإعداد مُفعّل."
#: editor/editor_node.cpp
msgid "Visible Navigation"
msgstr "الإنتقال المرئي"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
-msgstr "ميشات التنقل والبوليجين سوف يكونون ظاهرين حينما يتم تفعيل هذا الإعداد."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
+msgstr ""
+"مجسمات التنقل والأشكال المضلعة سوف تكون ظاهرة حينما يتم تفعيل هذا الإعداد."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "مزامنة تغييرات المشهد"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"حينما يكون هذا الإعداد مُفعل، أي تغيير يحدث في المشهد من خلال المُعدل سوف يتم "
"تطبيقة في اللعبة العاملة.\n"
@@ -2911,76 +2878,70 @@ msgstr ""
"الملفات."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "مزامنة تغييرات الكود"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"حينما يكون هذا الإعداد مُفعل، أي كود يتم حفظه سيتم إعادة تشغيلة في اللعبة "
-"العاملة.\n"
-"حينما يتم إستخدامة عن بعد علي جهاز، سيكون هذا أكثر فعالية مع نظام شبكات "
+"حينما يكون هذا الإعداد مُفعل، أي نص برمجي يتم حفظه سيتم إعادة تحميله في "
+"اللعبة العاملة.\n"
+"حينما يتم إستخدامه عن بُعد على جهاز، سيكون هذا أكثر فعالية مع نظام شبكات "
"الملفات."
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
-msgstr "المُعدل"
+msgstr "المحرّر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "إعدادات المُعدل"
+msgstr "إعدادات المحرّر…"
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr "نسق المُعدل"
+msgstr "تنسيق المحرّر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "حفظ المشهد"
+msgstr "أخذ صورة للشاشة"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "إعدادات المُعدل"
+msgstr "لقطات الشاشة تكون محفوظة في مجلّد بيانات/إعدادات المحرّر."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "إلغاء/تفعيل وضع الشاشة الكاملة"
+msgstr "تفعيل/إلغاء وضع الشاشة الكاملة"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "أظهر المود"
+msgstr "إظهار/إخفاء وحدة التحكم بالنظام"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "إعدادات المُعدل"
+msgstr "فتح مجلّد بيانات/إعدادات المحرّر"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "فتح مجلّد بيانات المحرّر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "إعدادات المُعدل"
+msgstr "فتح مجلّد إعدادات المحرّر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "إدارة قوالب التصدير"
+msgstr "إدارة ميّزات المحرّر…"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "إدارة قوالب التصدير"
+msgstr "إدارة قوالب التصدير..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2991,7 +2952,7 @@ msgstr "مساعدة"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "بحث"
@@ -3005,8 +2966,12 @@ msgid "Q&A"
msgstr "الأسئلة و الأجوبة"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "متتبع الأخطاء"
+msgid "Report a Bug"
+msgstr "إرسال تقرير عن خلل برمجي"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "إرسال مستندات التغذية الراجعة Feedback"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3014,7 +2979,7 @@ msgstr "المجتمع"
#: editor/editor_node.cpp
msgid "About"
-msgstr "عن"
+msgstr "عن هذا التطبيق"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -3026,11 +2991,11 @@ msgstr "تشغيل"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "إيقاف المشهد الحالي من أجل المعالجة البرمجية."
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr "إيقاف مؤقت للمشهد"
+msgstr "إيقاف مؤقّت للمشهد"
#: editor/editor_node.cpp
msgid "Stop the scene."
@@ -3038,7 +3003,7 @@ msgstr "إيقاف المشهد."
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr "تشغيل المشهد المُعدل."
+msgstr "تشغيل المشهد المُعدّل."
#: editor/editor_node.cpp
msgid "Play Scene"
@@ -3054,33 +3019,28 @@ msgstr "تشغيل المشهد المخصص"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "تعديل معرّف الفيديو video driver يتطلب إعادة تشغيل المحرر."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "حفظ و خروج"
+msgstr "حفظ و إعادة تشغيل"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Spins when the editor window redraws."
-msgstr "يدور حينما نافذة المُعدل يتم إعادة دهانة!"
+msgstr "قم بالتدوير أثناء إعادة رسم نافذة المحرّر."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "متواصل"
+msgstr "تحديث متواصل"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "تحديث التغييرات"
+msgstr "تحديث عند التغيير"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "تعطيل دوار التحديث"
+msgstr "إخفاء دوران التحديث"
#: editor/editor_node.cpp
msgid "FileSystem"
@@ -3088,12 +3048,11 @@ msgstr "نظام الملفات"
#: editor/editor_node.cpp
msgid "Inspector"
-msgstr "مُراقب"
+msgstr "المُراقب"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Expand Bottom Panel"
-msgstr "توسيع الكل"
+msgstr "توسيع التبويب السفلي"
#: editor/editor_node.cpp
msgid "Output"
@@ -3105,12 +3064,11 @@ msgstr "لا تحفظ"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
-msgstr ""
+msgstr "قالب البناء الخاص بالأندرويد مفقود، من فضلك نزل قوالب ذات صلة."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "إدارة قوالب التصدير"
+msgstr "إدارة القوالب"
#: editor/editor_node.cpp
msgid ""
@@ -3122,6 +3080,13 @@ msgid ""
"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."
#: editor/editor_node.cpp
msgid ""
@@ -3130,15 +3095,17 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
+"إن قالب البناء الخاص بالأندرويد تم تنزيله سلفاً لأجل هذا المشروع ولا يمكنه "
+"الكتابة فوق البيانات السابقة.\n"
+"قم بإزالة \"res://android/build\" يدوياً قبل الشروع بهذه العملية مرة أخرى."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
msgstr "إستيراد القوالب من ملف مضغوط بصيغة Zip"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "‌تصدير مدير القوالب"
+msgstr "رزمة القوالب"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3166,35 +3133,33 @@ msgstr "حدد"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "فتح المُعدل 2D"
+msgstr "فتح المُحرر 2D"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr "فتح المُعدل 3D"
+msgstr "فتح المُحرر 3D"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "فتح مُعدل الكود"
+msgstr "فتح محرر النص البرمجي"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr "فتح مكتبة الأصول"
+msgstr "فتح مكتبة المُلحقات"
#: editor/editor_node.cpp
msgid "Open the next Editor"
-msgstr "فتح في المُعدل التالي"
+msgstr "فتح في المُحرر التالي"
#: editor/editor_node.cpp
msgid "Open the previous Editor"
-msgstr "إفتح المُعدل السابق"
+msgstr "إفتح المُحرر السابق"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "تحذيرات"
+msgstr "تحذيرات!"
#: editor/editor_path.cpp
-#, fuzzy
msgid "No sub-resources found."
msgstr "لا مصدر للسطح تم تحديده."
@@ -3207,14 +3172,12 @@ msgid "Thumbnail..."
msgstr "الصورة المصغرة..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "فتح الكود"
+msgstr "النص البرمجي الأصلي :"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "تعديل البولي"
+msgstr "تعديل الإضافة"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -3238,9 +3201,8 @@ msgid "Status:"
msgstr "الحالة:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "المُعدل"
+msgstr "تحرير:"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -3272,7 +3234,7 @@ msgstr "ذاتي"
#: editor/editor_profiler.cpp
msgid "Frame #:"
-msgstr "اطار #:"
+msgstr "إطار #:"
#: editor/editor_profiler.cpp
msgid "Time"
@@ -3280,49 +3242,50 @@ msgstr "الوقت"
#: editor/editor_profiler.cpp
msgid "Calls"
-msgstr "ندائات"
+msgstr "إستدعاءات"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "الأعضاء"
+msgstr "تحرير النص:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
-msgstr ""
+msgstr "فعّال"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "طبقة"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "Bit %d، القيمة %d"
#: editor/editor_properties.cpp
msgid "[Empty]"
-msgstr ""
+msgstr "[فارغ]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr ""
+msgstr "إلحاق..."
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "اسم غير صالح."
+msgstr "RID غير صالح"
#: editor/editor_properties.cpp
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
msgstr ""
+"يلا يتطابق نوع المورد المختار (%s) مع أي نوع متوقع لأجل هذه الخاصية (%s)."
#: editor/editor_properties.cpp
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"لا يمكن إنشاء نقشة إطار العرض ViewportTexture على مورد تم حفظه كملف.\n"
+"ينبغي أن ينتمي المورد إلى مشهد ما."
#: editor/editor_properties.cpp
msgid ""
@@ -3331,23 +3294,26 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"لا يمكن إنشاء نقشة إطار العرض ViewportTexture اعتماداً على هذا المصدر كونه "
+"ليس محلياً بالنسبة للمشهد.\n"
+"قم بتشغيل خاصية 'محلي بالنسبة للمشهد local to scene' لذلك المورد (ولكل "
+"الموارد التي تضمنتها وصولاً إلى العقدة)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
-msgstr ""
+msgstr "اختر إطار عرض"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
-msgstr ""
+msgstr "نص برمجي جديد"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "فتح الكود"
+msgstr "فتح الكود البرمجي"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
-msgstr ""
+msgstr "%s جديدة"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Make Unique"
@@ -3365,7 +3331,7 @@ msgstr "إجعلة مميزاً"
#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
-msgstr ""
+msgstr "لصق"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Convert To %s"
@@ -3373,39 +3339,39 @@ msgstr "تحويل إلي %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
-msgstr ""
+msgstr "العُقدة المختارة ليست إطار عرض Viewport!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "الحجم: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "الصفحة: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr ""
+msgstr "إزالة عنصر"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "إسم جديد:"
+msgstr "مفتاح جديد:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "إسم جديد:"
+msgstr "قيمة جديدة:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "إضافة زوج مفتاح/قيمة"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"لا يوجد إعداد تصدير مسبق عامل لهذه المنصة.\n"
"من فضلك أضف إعداد تصدير عامل في قائمة التصدير."
@@ -3434,13 +3400,18 @@ msgstr "لم نستطع تشغيل الكود:"
msgid "Did you forget the '_run' method?"
msgstr "هل نسيت الطريقة '_run' ؟"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"امسك Ctrl للتدوير للأعداد الصحيحة. اضغط على Shift لإجراء تغييرات أكثر دقة."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "إختيار عقدة(عقد) للإستيراد"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
-msgstr ""
+msgstr "تصفح"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
@@ -3451,9 +3422,8 @@ msgid "Import From Node:"
msgstr "إستيراد من عقدة:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Redownload"
-msgstr "اعادة التحميل"
+msgstr "إعادة التحميل"
#: editor/export_template_manager.cpp
msgid "Uninstall"
@@ -3470,7 +3440,7 @@ msgstr "تنزيل"
#: editor/export_template_manager.cpp
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "قوالب التصدير الرسمية غير مدعومة لأجل البناء الخاص بالتطوير."
#: editor/export_template_manager.cpp
msgid "(Missing)"
@@ -3493,9 +3463,8 @@ msgid "Can't open export templates zip."
msgstr "لم نستطع فتح الملف المضغوط المُورد."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "صيغة غير صالحة لـ version.txt داخل القالب."
+msgstr "صيغة غير صالحة ل version.txt داخل القالب: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -3515,11 +3484,13 @@ msgstr "يستورد:"
#: editor/export_template_manager.cpp
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "هناك خطأ في جلب قائمة المرايا mirrors."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
msgstr ""
+"حدث خطأ في فك (تفسير parsing) ملف JSON الخاص بقائمة المرايا. من فضلك بلّغ عن "
+"هذه المشكلة!"
#: editor/export_template_manager.cpp
msgid ""
@@ -3562,20 +3533,20 @@ msgid "Download Complete."
msgstr "التحميل إكتمل."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "لا يمكن المسح:"
+msgstr "لا يمكن حذف ملف مؤقت:"
#: editor/export_template_manager.cpp
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"أخفق تنصيب القوالب.\n"
+"يمكن إيجاد أرشيف القوالب المعطوبة في '%s'."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "خطأ في طلب الرابط: "
+msgstr "خطأ في طلب الرابط:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3624,9 +3595,8 @@ msgid "SSL Handshake Error"
msgstr "خطأ مطابقة ssl"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "يفكك الضغط عن الأصول"
+msgstr "يتم تفكيك مصادر بناء أندرويد Android"
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3645,14 +3615,12 @@ msgid "Remove Template"
msgstr "مسح القالب"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
msgstr "حدد ملف القالب"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "إدارة قوالب التصدير"
+msgstr "إدارة قوالب التصدير لغودوت"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3663,14 +3631,12 @@ msgid "Download Templates"
msgstr "تنزيل القوالب"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "حدد السرفر من القائمة: "
+msgstr "حدد السرفر من القائمة: (Shift+Click: للفتح في المتصفح)"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "المفضلة:"
+msgstr "المفضلات"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -3701,9 +3667,8 @@ msgid "No name provided."
msgstr "لا أسم مُقدم."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "الأسم المُقدم يحتوي علي حروف خاطئة"
+msgstr "الإسم المُقدم يحتوي على أحرف خاطئة."
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
@@ -3730,33 +3695,28 @@ msgid "Duplicating folder:"
msgstr "تكرار مجلد:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "مشهد مورث جديد..."
+msgstr "مشهد مُوّرَث جديد"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "إختر المشهد الأساسي"
+msgstr "تعيين كمشهد أساسي"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "فتح مشهد"
+msgstr "فتح المَشاهِد"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr "نموذج"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "المفضلة:"
+msgstr "إضافة إلى المفضلات"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "حذف من المجموعة"
+msgstr "حذف من المفضلات"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3779,29 +3739,24 @@ msgid "Move To..."
msgstr "تحريك إلي..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "مشهد جديد"
+msgstr "مشهد جديد..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "فتح سريع للكود..."
+msgstr "فتح النص البرمجي..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "حفظ المورد باسم..."
+msgstr "مصدر جديد..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
msgstr "توسيع الكل"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
msgstr "طوي الكل"
@@ -3813,28 +3768,24 @@ msgid "Rename"
msgstr "إعادة التسمية"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "المجلد السابق"
+msgstr "المجلد/الملف السابق"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "المجلد اللاحق"
+msgstr "المجلد/الملف التالي"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
msgstr "إعادة فحص نظام الملفات"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle Split Mode"
-msgstr "أظهر المود"
+msgstr "تعيين وضعية الإنقسام"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "إبحث في الأصناف"
+msgstr "بحث الملفات"
#: editor/filesystem_dock.cpp
msgid ""
@@ -3849,86 +3800,77 @@ msgid "Move"
msgstr "تحريك"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "ملف أو مجلد مع هذا الأسم موجود بالفعل."
+msgstr "يوجد بالفعل ملف أو مجلد بنفس الاسم في هذا المكان."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "الكتابة المُتراكبة Overwrite"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "حفظ المشهد"
+msgstr "إنشاء المشهد"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr ""
+msgstr "إنشاء نص برمجي"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "%d مزيد من الملفات"
+msgstr "إبحث في الملفات"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "جد"
+msgstr "إيجاد:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "أنشئ مجلد"
+msgstr "مجلد:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "وضع المُصفي:"
+msgstr "تنقيات:"
#: editor/find_in_files.cpp
msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
msgstr ""
+"يتضمن الملفات ذات الإضافات التالية. قم بإضافتهم أو إزالتهم في إعدادات "
+"المشروع."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr ""
+msgstr "ابحث..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
-msgstr ""
+msgstr "استبدال..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
msgstr "إلغاء"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "جد"
+msgstr "إيجاد: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "إستبدال"
+msgstr "إستبدال: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "إستبدال الكل"
+msgstr "إستبدال الكل (بلا تراجع)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "جاري الحفظ..."
+msgstr "جاري البحث..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "إبحث عن كتابة"
+msgstr "إكتمل البحث"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3939,57 +3881,49 @@ msgid "Remove from Group"
msgstr "حذف من المجموعة"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "خطأ: إسم الحركة موجود بالفعل!"
+msgstr "توجد مجموعة بهذا الاسم."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "اسم غير صالح."
+msgstr "اسم المجموعة غير صالح."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "المجموعات"
+msgstr "إعادة تسمية المجموعة"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "مسح المخطط"
+msgstr "حذف المجموعة"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "المجموعات"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes Not in Group"
-msgstr "إضافة إلي مجموعة"
+msgstr "العُقد خارج المجموعة"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
msgid "Filter nodes"
-msgstr ""
+msgstr "تصفية العُقد"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "إضافة إلي مجموعة"
+msgstr "العُقد في المجموعة"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
-msgstr ""
+msgstr "ستزال المجموعات الفارغة تلقائياً."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "فتح مُعدل الكود"
+msgstr "محرر المجموعات"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "المجموعات"
+msgstr "إدارة المجموعات"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3997,7 +3931,7 @@ msgstr "إستيراد كمشهد واحد"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Animations"
-msgstr "إستيراد مع إنميشن منفصلة"
+msgstr "إستيراد مع رسوم متحركة منفصلة"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials"
@@ -4013,15 +3947,15 @@ msgstr "إستيراد مع عناصر+موارد منفصلة"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Animations"
-msgstr "إستيراد مع عناصر + إنميشن منفصلة"
+msgstr "إستيراد مع عناصر + رسوم متحركة منفصلة"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr "إستيراد مع مصادر+ إنميشن منفصلة"
+msgstr "إستيراد مع مصادر+ رسوم متحركة منفصلة"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "إستيراد مع عناصر + مصادر + إنميشين منفصلين"
+msgstr "إستيراد مع عناصر + مصادر + رسوم متحركة منفصلين"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
@@ -4046,79 +3980,80 @@ msgstr "انشاء خارطة الضوء"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr "انشاء من اجل الميش: "
+msgstr "انشاء من اجل المجسم: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
-msgstr "تشغيل الكود المُخصص..."
+msgstr "تشغيل النص البرمجي المُخصص..."
#: editor/import/resource_importer_scene.cpp
msgid "Couldn't load post-import script:"
-msgstr "لا يمكن تحميل الكود المستورد أو المطبوع:"
+msgstr "لا يمكن تحميل النص البرمجي المستورد أو المطبوع:"
#: editor/import/resource_importer_scene.cpp
msgid "Invalid/broken script for post-import (check console):"
-msgstr "كود مستورد-ملصق متضرر/خاطئ (تحقق من وحدة التحكم):"
+msgstr "النص البرمجي مستورد-ملصق متضرر/خاطئ (تحقق من وحدة التحكم):"
#: editor/import/resource_importer_scene.cpp
msgid "Error running post-import script:"
-msgstr "خطأ في تشغيل الكود الملصق- المستورد:"
+msgstr "خطأ في تشغيل النص البرمجي الملصق- المستورد:"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "هل قمت بإرجاع كائن مشتق من العقدة في دالة`post_import ()`؟"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "جاري الحفظ..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d ملفات"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "حدد كإفتراضي من أجل '%s'"
#: editor/import_dock.cpp
msgid "Clear Default for '%s'"
-msgstr "إخلاء الإفتراضي لـ '%s'"
-
-#: editor/import_dock.cpp
-msgid " Files"
-msgstr " ملفات"
+msgstr "إخلاء الإفتراضي ل '%s'"
#: editor/import_dock.cpp
msgid "Import As:"
-msgstr "إستيراد كـ:"
+msgstr "إستيراد ك:"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "إعداد مُسبق..."
+msgstr "إعداد مُسبق"
#: editor/import_dock.cpp
msgid "Reimport"
msgstr "إعادة إستيراد"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr ""
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "احفظ المشاهد، إعادة-الإستيراد، وإعادة التشغيل"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
-msgstr ""
+msgstr "يتطلب تعديل نوع الملفات المستوردة إعادة تشغيل المحرر."
#: editor/import_dock.cpp
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
-msgstr ""
+msgstr "تحذير: هناك مُلحقات تستخدم هذا المورد، ربما سيتوقف تحميلها بشكل صحيح."
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
msgstr "فشل تحميل المورد."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
-msgstr "توسيع كل التفاصيل"
+msgstr "توسيع كل الخصائص"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "طي كل التفاصيل"
+msgstr "طي كل الخصائص"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -4130,13 +4065,8 @@ msgid "Copy Params"
msgstr "إنسخ المُعامل"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "لصق المُعامل"
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "خطأ: لا مصدر حركة علي الحافظة!"
+msgstr "تحرير حافظة الموارد"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4183,9 +4113,8 @@ msgid "Object properties."
msgstr "خصائص العنصر."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "خصائص العنصر."
+msgstr "تصفية الخصائص"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -4196,90 +4125,78 @@ msgid "MultiNode Set"
msgstr "تحديد عقد متعددة"
#: editor/node_dock.cpp
-#, fuzzy
msgid "Select a single node to edit its signals and groups."
-msgstr "حدد عقدة لكي تُعدل الإشارات والمجموعات."
+msgstr "حدد عقدة لكي تُعدل إشاراتها ومجموعاتها."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "تعديل البولي"
+msgstr "تعديل إضافة"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "إنشاء حل C#‎"
+msgstr "إنشاء إضافة"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "إضافات"
+msgstr "اسم الإضافة:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "المجلد الفرعي:"
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
msgid "Language:"
-msgstr ""
+msgstr "اللغة:"
#: editor/plugin_config_dialog.cpp
msgid "Script Name:"
-msgstr ""
+msgstr "اسم النص البرمجي:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "التفعيل الآن؟"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "إنشاء بولي"
+msgstr "إنشاء مضلع"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "مسح النقاط"
+msgstr "إنشاء نقاط."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid ""
"Edit points.\n"
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
-"تعديل المضلعات الموجودة:\n"
-"زر الفأرة الأيسر: لتحريك النقطة.\n"
-"Ctrl+زر الفأرة الأيسر: لتقسيم الجزء.\n"
-"زر الفأرة الأيمن: مسح النقطة."
+"تعديل النقاط.\n"
+"زر الفأرة الأيسر: لتحريك النقطة\n"
+"زر الفأرة الأيمن: مسح النقطة"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Erase points."
-msgstr "زر الفأرة الأيمن: مسح النقطة."
+msgstr "مسح النقاط."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
-msgstr "تعديل البولي"
+msgstr "تعديل مضلع"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr "إدخال نقطة"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon (Remove Point)"
-msgstr "تعديل البولي (مسح النقطة)"
+msgstr "تعديل المضلع (مسح النقطة)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Remove Polygon And Point"
-msgstr "مسح البولي والنقطة"
+msgstr "مسح المضلع والنقطة"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4293,52 +4210,46 @@ msgstr "أضف حركة"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load..."
-msgstr "تحميل"
+msgstr "تحميل..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "مسح النقطة"
+msgstr "تحريك نقطة العقدة"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Limits"
-msgstr "تغيير وقت الدمج"
+msgstr "تغيير حدود BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Labels"
-msgstr "تغيير وقت الدمج"
+msgstr "تغيير ملصقات BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"لا يمكن استخدام هذا النوع من العُقد. فقط العُقد الرئيسة root nodes مسموحة."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "إضافة نقطة"
+msgstr "إضافة نقطة العقدة"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "أضف حركة"
+msgstr "أضف نقطة حركة"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace1D Point"
-msgstr "مسح البولي والنقطة"
+msgstr "إزالة نقطة BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
-msgstr ""
+msgstr "حرك نقطعة العُقدة BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4348,95 +4259,91 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"شجرة الرسومات المتحركة غير فعالة.\n"
+"فعلها لتتمكن من التشغيل playback، تفقد التنبيه الذي تصدره العُقدة إن فشل "
+"التفعيل."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "حدد مكان الخلط blending position ضمن الفراغ"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "حدد وحرك النقاط، أنشئ النقاط باستخدام RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
msgid "Enable snap and show grid."
-msgstr ""
+msgstr "تمكين المحاذاة وإظهار الشبكة."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Point"
-msgstr ""
+msgstr "نقطة"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "فتح المُعدل 2D"
+msgstr "فتح المُحرر ثنائي الأبعاد 2D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "عقدة الحركة"
+msgstr "فتح عُقدة الرسم المتحرك Animation"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "خطأ: إسم الحركة موجود بالفعل!"
+msgstr "المثلثات موجودة سلفاً."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "إضافة مسار"
+msgstr "إضافة مثلث"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace2D Limits"
-msgstr "تغيير وقت الدمج"
+msgstr "تغيير حدود(إمكانيات) BlendSpace2D \"الدمج_الفضائي_ثنائي البُعد\""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace2D Labels"
-msgstr "تغيير وقت الدمج"
+msgstr "تعديل لصاقات BlendSpace2D \"الدمج الفضائي ثنائي البُعد\""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace2D Point"
-msgstr "مسح البولي والنقطة"
+msgstr "إزالة نقاط الدمج الفضائي ثنائي البُعد BlendSpace2D"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
-msgstr ""
+msgstr "إزالة مثلث الدمج الفضائي ثنائي البُعد BlendSpace2D"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
msgstr ""
+"إن BlendSpace2D لا ينتمي إلى عُقدة شجرة الرسومات المتحركة AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "لا وجود لأي من المثلثات، لذا لا يمكن أن يتم الخلط."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Toggle Auto Triangles"
-msgstr "تبديل التحميل التلقائي العام"
+msgstr "تفعيل المثلثات التلقائية"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "إنشاء المثلثات عن طريق وصل النقاط."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "مسح النقط والمثلثات."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "توليد مثلثات دمج بصورة تلقائية (بدلاً من اليدوية)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4444,78 +4351,73 @@ msgid "Blend:"
msgstr "الدمج:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Parameter Changed"
-msgstr "تحديث التغييرات"
+msgstr "لقد تم تغيير المَعلم"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Filters"
-msgstr "تعديل المصافي"
+msgstr "تعديل المُرشحات"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "لا يمكن إضافة عُقدة المخرجات إلى شجرة الدمج."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Add Node to BlendTree"
-msgstr ""
+msgstr "إضافة عُقدة إلى شجرة الدمج BlendTree"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Node Moved"
-msgstr "وضع التحريك"
+msgstr "لقد تحركت العُقدة"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"غير قادر على الاتصال، ربما البوابة قيد الاستخدام أو أن الإتصال غير صالح."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Connected"
-msgstr "متصل"
+msgstr "العُقد متصلة"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Disconnected"
-msgstr "غير متصل"
+msgstr "العُقد غير متصلة"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "صورة متحركة"
+msgstr "تحديد الرسومية المتحركة"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Node"
-msgstr "إنشاء عقدة"
+msgstr "حذف العُقدة"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
-msgstr ""
+msgstr "حذف عُقدة (عُقد)"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "تمكين/إيقاف هذا المسار."
+msgstr "تعديل المُرشحات تشغيل/إيقاف"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Change Filter"
-msgstr "تغيير خط الحركة"
+msgstr "تغيير المُرشح Filter"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"لم يتم تحديد أي من الرسومات المتحركة للاعب، لذا لا يمكن استرجاع أسماء "
+"المقاطع."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
+msgstr "المسار المحدد للاعب غير مناسب، لا يمكن استرجاع أسماء المقاطع."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -4523,43 +4425,39 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"الرسومات المتحركة الخاصة باللاعب لا تملك مسار عُقدة صالح، غير قادر على "
+"استرجاع أسماء المقاطع."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "مقاطع الرسوم المتحركة:"
+msgstr "مقاطع الرسوم المتحركة"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "مقاطع صوتية:"
+msgstr "مقاطع صوتية"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "الإعدادات:"
+msgstr "الوظائف البرمجية"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Renamed"
-msgstr "إسم العقدة:"
+msgstr "العُقدة معادة التسمية"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node..."
-msgstr ""
+msgstr "إضافة عُقدة..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "تعديل المصافي"
+msgstr "تحرير المقاطع المُرشحة Filtered Tracks:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable Filtering"
-msgstr "تغيير خط الحركة"
+msgstr "تمكين الترشيح Filtering"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4567,40 +4465,38 @@ msgstr "إلغاء/تفعيل التشغيل التلقائي"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr "إسم الحركة الجديد:"
+msgstr "إسم رسم المتحرك جديد:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
-msgstr "حركة جديدة"
+msgstr "رسم متحرك جديدة"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr "تغيير إسم الحركة:"
+msgstr "تغيير إسم الرسم المتحرك:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Animation?"
-msgstr "مسح الحركة؟"
+msgstr "مسح الرسم المتحرك؟"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Remove Animation"
-msgstr "مسح الحركة"
+msgstr "مسح الرسم المتحرك"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "خطأ: إسم حركة خاطئ!"
+msgstr "إسم الرسم المتحرك خاطئ!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "خطأ: إسم الحركة موجود بالفعل!"
+msgstr "إسم الرسم المتحرك موجود بالفعل!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Rename Animation"
-msgstr "إعادة تسمية الحركة"
+msgstr "إعادة تسمية الرسم المتحرك"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
@@ -4612,80 +4508,75 @@ msgstr "تغيير وقت الدمج"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
-msgstr "تحميل حركة"
+msgstr "تحميل الرسم المتحرك"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
-msgstr "تكرير الحركة"
+msgstr "تكرار الرسم المتحرك"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "خطأ: لا حركة لنسخها!"
+msgstr "لا رسم متحرك لنسخها!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "خطأ: لا مصدر حركة علي الحافظة!"
+msgstr "لا يوجد مورد لرسم متحرك في الحافظة clipboard!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
-msgstr "حركة مُلصقة"
+msgstr "تم لصق الرسوم المتحركة"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Paste Animation"
-msgstr "لصق الحركة"
+msgstr "لصق الرسوم المتحركة"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "خطأ: لا حركة لتعديلها!"
+msgstr "لا رسومات متحركة لتحريرها!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
-msgstr "تشغيل الحركة المختارة بشكل عكسي من الموقع الحالي. (زر A)"
+msgstr "تشغيل الرسم المتحرك المختار بشكل عكسي من الموقع الحالي. (زر A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "تشيل الحركة المختارة بشكل عكسي من النهاية. (Shift+ش)"
+msgstr "تشغيل الرسم المتحرك المختار بشكل عكسي من النهاية. (Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
-msgstr "إيقاف تشغيل الحركة. (س)"
+msgstr "إيقاف تشغيل الرسم المتحرك. (S)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
-msgstr "تشغيل الحركة المحددة من البداية. (Shift+ي)"
+msgstr "تشغيل الرسم المتحرك المحدد من البداية. (Shift+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
-msgstr "تشغيل الحركة المختارة من الموقع الحالي. (زر D)"
+msgstr "تشغيل الرسم المتحرك المختار من الموقع الحالي. (D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation position (in seconds)."
-msgstr "موقع الحركة (بالثواني)."
+msgstr "موقع الرسم المتحرك (بالثواني)."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Scale animation playback globally for the node."
-msgstr "تكبير تشغيل الحركة عالمياً من العقدة."
+msgstr "تكبير تشغيل الرسم المتحرك عالمياً من العقدة."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
-msgstr "أدوات الحركة"
+msgstr "أدوات الرسم المتحرك"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation"
-msgstr "صورة متحركة"
+msgstr "الرسم المتحرك"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "تحويلات"
+msgstr "تحرير الانتقالات..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "مُراقب"
+msgstr "افتح في المُتصفح"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -4700,9 +4591,8 @@ msgid "Enable Onion Skinning"
msgstr "تفعيل تقشير البصل"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Onion Skinning Options"
-msgstr "تقشير البصل"
+msgstr "إعدادت شفافية طبقات البصل"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Directions"
@@ -4722,7 +4612,7 @@ msgstr "العمق"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
-msgstr "الخطوة 1"
+msgstr "خطوة واحدة"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "2 steps"
@@ -4745,17 +4635,16 @@ msgid "Include Gizmos (3D)"
msgstr "تضمين جيزموس (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "لصق الحركة"
+msgstr "تثبيت مُشغّل الرسوميات المتحركة"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
-msgstr "إنشاء حركة جديدة"
+msgstr "إنشاء رسوم متحركة جديدة"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Name:"
-msgstr "إسم الحركة:"
+msgstr "إسم الرسم المتحرك:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
@@ -4777,67 +4666,61 @@ msgid "Cross-Animation Blend Times"
msgstr "وقت الدمج عبر الحركة"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Move Node"
-msgstr "وضع التحريك"
+msgstr "تحريك العُقدة"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "تحول"
+msgstr "الإنتقال موجود سلفاً!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "تحول"
+msgstr "إضافة انتقال"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node"
-msgstr ""
+msgstr "إضافة عُقدة"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "النهاية"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "فوري"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "مزامنة"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "في النهاية"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "السفر"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "عُقد البداية والنهاية مطلوبة لأجل الانتقال الجزيئ sub-transition."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "ليس في مسار الموارد."
+msgstr "لم يتم تعيين موارد التشغيل في المسار:٪ s."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
-msgstr "مُسِح:"
+msgstr "مُسِحت العقدة"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "عقدة التنقل"
+msgstr "تمت إزالة النقل"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
-msgstr ""
+msgstr "تحديد عُقدة البداية (التشغيل التلقائي)"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4845,44 +4728,45 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"اختر وحرّك العُقد.\n"
+"RMB (زر الفأرة الأيمن) لإضافة عُقد جديدة.\n"
+"LMB + Shift (زر الفأرة الأيسر) لإنشاء الوصلات."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "إنشاء %s جديد"
+msgstr "إنشاء عُقد جديدة."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "صلها بالعقدة:"
+msgstr "توصيل عقد."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Remove selected node or transition."
-msgstr "ازالة المسار المحدد."
+msgstr "ازالة الكائن المحدد او الإنتقال المحدد."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"تبديل (نعم/لا) التشغيل التلقائي لهذا الرسم المتحرك ليشتغل، يعيد التشغيل، أو "
+"يسعى للصفر."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
+"تحديد الرسومية المتحركة الخاصة بالنهاية. سيكون ذلك مفيداً للحركات الفرعية."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "تحول"
+msgstr "الانتقال: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "وضع السحب"
+msgstr "وضع اللعب:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr "مسارات التحريك"
+msgstr "شجرة التحريك"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -5010,7 +4894,7 @@ msgstr "عقدة التنقل"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Import Animations..."
-msgstr "إستيراد الحركة..."
+msgstr "إستيراد الرسوم المتحركة..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
@@ -5049,37 +4933,32 @@ msgid "Request failed, return code:"
msgstr "فشل إتمام الطلب٫ الرمز الذي تم إرجاعه:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed."
msgstr "فشل الطلب."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Cannot save response to:"
-msgstr "لا يمكن المسح:"
+msgstr "لا يمكن الحفظ بسبب:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Write error."
-msgstr ""
+msgstr "كتابة خطأ."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "فشل الطلب٫ السبب هو اعادة التحويل مرات اكثر من اللازم"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Redirect loop."
msgstr "اعادة توجيه حلقة التكرار."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed, timeout"
-msgstr "فشل إتمام الطلب٫ الرمز الذي تم إرجاعه:"
+msgstr "فشل الطلب ، انتهت المهلة"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Timeout."
-msgstr "الوقت"
+msgstr "انتهت المهلة."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -5102,14 +4981,12 @@ msgid "Asset Download Error:"
msgstr "خطأ في تنزيل الأصول:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "جاري التنزيل"
+msgstr "جاري التنزيل (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "جاري التنزيل"
+msgstr "‫جاري التنزيل..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -5121,12 +4998,11 @@ msgstr "خطأ في إنشاء الطلب"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Idle"
-msgstr "عاطل"
+msgstr "الخمول (idle)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "تثبيت"
+msgstr "تثبيت..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -5142,39 +5018,35 @@ msgstr "تحميل هذا الأصل قيد التنفيذ أصلاً!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "حُدّث منذ فترة وجيزة"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "آخر تحديث قريب الأمد"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "الاسم (ألف بائياً)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "الاسم (ترتيب ألف بائي معكوس)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "الرخصة"
+msgstr "الرخصة (أ-ي)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "الرخصة"
+msgstr "الرخصة (ي-أ)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
msgstr "الأول"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "التبويب السابق"
+msgstr "السابق"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -5182,7 +5054,7 @@ msgstr "التالي"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "الأخير"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "All"
@@ -5190,17 +5062,15 @@ msgstr "الكل"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr ""
+msgstr "لا نتائج من أجل \"%s\"."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Import..."
-msgstr "إستيراد"
+msgstr "استيراد..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Plugins..."
-msgstr "إضافات"
+msgstr "إضافات..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
@@ -5216,9 +5086,8 @@ msgid "Site:"
msgstr "الموقع:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Support"
-msgstr "الدعم..."
+msgstr "الدعم"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -5229,9 +5098,8 @@ msgid "Testing"
msgstr "أختبار"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Loading..."
-msgstr "تحميل"
+msgstr "جاري التحميل..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
@@ -5261,12 +5129,12 @@ msgstr "لا يمكن انشاء خرائط الضوء, تاكد من ان ال
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Bake Lightmaps"
-msgstr "اعداد خرائط الضوء"
+msgstr "إعداد خرائط الضوء"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
-msgstr "إستعراض"
+msgstr "استعراض"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
@@ -5282,12 +5150,11 @@ msgstr "خطوة الشبكة:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
-msgstr ""
+msgstr "الأخط الأولي كُل:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "steps"
-msgstr "خطوتان"
+msgstr "خطوات"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -5298,42 +5165,34 @@ msgid "Rotation Step:"
msgstr "خطوة الدوران:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Step:"
-msgstr "تكبير/تصغير:"
+msgstr "خطوة التحجيم:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
msgstr "تحريك الموجه العمودي"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
msgstr "إنشاء موجه عمودي جديد"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
msgstr "مسح الموجه العمودي"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
msgstr "تحريك الموجه الأفقي"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
msgstr "إنشاء موجه أفقي جديد"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
msgstr "مسح الموجه الأفقي"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
msgstr "إنشاء موجه عمودي وأفقي جديد"
@@ -5376,85 +5235,76 @@ msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
msgstr ""
+"عندما يكون فعالاً، إن تحريك عُقد التحكم سيغير نقطة التثبيت anchors الخاص بها "
+"بدلاً من الهوامش."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Left"
-msgstr "وضع التدوير"
+msgstr "في الأعلى يساراً"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Right"
-msgstr "وضع التدوير"
+msgstr "في الأعلى يميناً"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Right"
-msgstr "وضع التدوير"
+msgstr "في الأسفل يميناً"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Left"
-msgstr "وضع التدوير"
+msgstr "في الأسفل يساراً"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Left"
-msgstr "نصف المُحدد"
+msgstr "في المنتصف يساراً"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Top"
-msgstr "نصف المُحدد"
+msgstr "في أعلى المنتصف"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Right"
-msgstr "وضع التدوير"
+msgstr "في المنتصف يميناً"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Bottom"
-msgstr "نصف المُحدد"
+msgstr "في أسفل المنتصف"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "المنتصف"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
-msgstr "الخط الشمالي"
+msgstr "بالعرض يساراً"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Wide"
-msgstr ""
+msgstr "بالعرض بالأعلى"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
-msgstr "الخط اليميني"
+msgstr "بالعرض يميناً"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Wide"
-msgstr ""
+msgstr "بالعرض بالأسفل"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr ""
+msgstr "بالعرض بالمنتصف شاقولياً"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr ""
+msgstr "بالعرض بالمنتصف أفقياً"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Full Rect"
-msgstr ""
+msgstr "على كامل المستطيل"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "نسبة التكبير:"
+msgstr "نسبة التكبير"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5474,6 +5324,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"تجاوز كاميرا اللعبة.\n"
+"تجاوز كاميرا اللعبة عن طريق كاميرا إطار العرض في المحرر."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5481,48 +5333,44 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"تجاوز كاميرا اللعبة.\n"
+"ليس هناك لعبة منمذجة قيد التشغيل."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "حدد"
+msgstr "حُدد القفل"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock Selected"
-msgstr ""
+msgstr "حُدد إلغاء القفل"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Group Selected"
-msgstr "حذف المُحدد"
+msgstr "حُدد التجميع"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Ungroup Selected"
-msgstr "حذف المُحدد"
+msgstr "حُدد إلغاء التجميع"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
msgstr "لصق الوضع"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Guides"
-msgstr "إخلاء الوضع"
+msgstr "مسح الموجهات"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
-msgstr "أنشئ نقاط إنبعاث من الشبكة"
+msgstr "إنشاء عظمة (عظام) مخصوصة من عُقدة (عُقد)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Bones"
-msgstr "إخلاء الوضع"
+msgstr "مسح العظام"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
@@ -5577,9 +5425,8 @@ msgstr "وضع التدوير"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "تحديد الوضع"
+msgstr "وضع التحجيم"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5599,91 +5446,77 @@ msgid "Pan Mode"
msgstr "وضع السحب"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "تحديد الوضع"
+msgstr "وضع المسطرة"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle smart snapping."
-msgstr "إلغاء/تفعيل الكبس"
+msgstr "إلغاء/تفعيل محاذاة الشبكة بذكاء."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Smart Snap"
-msgstr "إستخدم الكبس"
+msgstr "استخدام المحاذاة الذكية"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle grid snapping."
-msgstr "إلغاء/تفعيل الكبس"
+msgstr "إلغاء/تفعيل المحاذاة للشبكة."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Grid Snap"
-msgstr "إستخدم الكبس"
+msgstr "استخادم المحاذاة للشبكة"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
-msgstr "إعدادات الكبس"
+msgstr "إعدادت المحاذاة"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
-msgstr "إستعمال كبس التدوير"
+msgstr "استعمال محاذاة التدوير"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Scale Snap"
-msgstr "إستخدم الكبس"
+msgstr "استخدام محاذاة التحجيم"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
-msgstr "نسبية الكبس"
+msgstr "نسبية المحاذاة"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Pixel Snap"
msgstr "إستخدام كبس البكسل"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Smart Snapping"
-msgstr "الكبس الذكي"
+msgstr "المحاذاة الذكية"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Configure Snap..."
-msgstr "تعديل الكبس..."
+msgstr "تعديل المحاذاة..."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Parent"
-msgstr "الكبس إلي الطفل"
+msgstr "المحاذاة بالنسبة للأصل Parent"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Anchor"
-msgstr "إكبس إلي مرتكز العقدة"
+msgstr "حاذي إلي مرتكز العقدة"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Sides"
-msgstr "إكبس إلي جوانب العقدة"
+msgstr "حاذي إلي جوانب العقدة"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Center"
-msgstr "إكبس إلي مرتكز العقدة"
+msgstr "حاذي إلي مُنتصف العقدة"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Other Nodes"
-msgstr "إكبس إلي العقد الأخري"
+msgstr "حاذي إلى العقد الأخرى"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Guides"
-msgstr "أكبس إلي الموجهات"
+msgstr "حاذي إلى الموجهات"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5706,9 +5539,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "إرجاع مقدرة تحديد الطفل للعنصر."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "الفردية"
+msgstr "إعدادات الهكيل العظمي"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -5716,12 +5548,11 @@ msgstr "إظهار العظام"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "إنشاء عظمة (عظام) مخصوصة من عُقدة (عُقد)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "إخلاء العظام"
+msgstr "مسح العظام المخصوصة"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5729,9 +5560,8 @@ msgid "View"
msgstr "أظهر"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Always Show Grid"
-msgstr "إظهار الشبكة"
+msgstr "إظهار الشبكة دوماً"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
@@ -5755,7 +5585,7 @@ msgstr "أظهر الشاشة"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "إظهار أيقونات المجوعة والقفل"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -5763,28 +5593,27 @@ msgstr "نصف المُحدد"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "إملئ الشاشة بالمحدد"
+msgstr "تحديد الإطار"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
-msgstr ""
+msgstr "إظهار تحجيم اللوحة Canvas"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
-msgstr ""
+msgstr "قناع الترجمة لأجل إدخال المفاتيح."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
-msgstr ""
+msgstr "قناع التدوير لأجل إدخال المفاتيح."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale mask for inserting keys."
-msgstr ""
+msgstr "قناع التحجيم لأجل إدخال المفاتيح."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys (based on mask)."
-msgstr "أدخل مفتاح (مسارات موجودة بالفعل)"
+msgstr "أدخل المفاتيح (على أساس القناع)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5793,16 +5622,18 @@ msgid ""
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
+"إدخال تلقائي للمفاتيح عندما تترجم، تُدار أو تحجم الأشياء objects (بناء على "
+"القناع).\n"
+"تُضاف المفاتيح فقط للمقاطع الموجودة سلفاً، فلا يتم إنشاء مقاطع جديدة.\n"
+"يجب إدخال المفاتيح يدوياً في أول مرة."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Auto Insert Key"
-msgstr "أضف مفتاح الحركة"
+msgstr "مفتاح مُدخل بصورة تلقائية"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "مدة الحركة (seconds)"
+msgstr "إعدادت المفتاح والوضعية للرسومات المتحركة"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5825,9 +5656,8 @@ msgid "Divide grid step by 2"
msgstr "قسم خطوة الشبكة بـ 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Pan View"
-msgstr "أظهر"
+msgstr "إظهار شامل"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -5852,9 +5682,8 @@ msgid "Error instancing scene from %s"
msgstr "خطأ في توضيح المشهد من %s"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Change Default Type"
-msgstr "غير النوع الإفتراضي"
+msgstr "تغير النوع الإفتراضي"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5865,17 +5694,16 @@ msgstr ""
"سحب و إسقاط + Alt : تغيير نوع العقدة"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon3D"
-msgstr "إنشاء بولي"
+msgstr "إنشاء متعدد سطوح ثلاثي الأبعاد"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
-msgstr "تعديل البولي"
+msgstr "تعديل مُتعدد السطوح"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly (Remove Point)"
-msgstr "تعديل البولي (مسح النقطة)"
+msgstr "تعديل متعدد السطوح (مسح النقطة)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -5890,14 +5718,13 @@ msgstr "حمل قناع الانبعاث"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "إعادة تشغيل (ثواني):"
+msgstr "إعادة التشغيل"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Clear Emission Mask"
-msgstr "إمسح قناع الانبعاث"
+msgstr "امسح قناع الانبعاث"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5918,18 +5745,17 @@ msgstr "قناع الانبعاث"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Solid Pixels"
-msgstr ""
+msgstr "البكسيلات الأساسية Solid Pixels"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Border Pixels"
-msgstr ""
+msgstr "البكسلات المحيطية (الحدودية)"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "الوجهات والملفات:"
+msgstr "البكسلات المحيطية (الحدودية) الموجهة"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5942,9 +5768,8 @@ msgid "Emission Colors"
msgstr "الوان الإنبعاث"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "جسيمات"
+msgstr "جزيئات وحدة المعالجة المركزية"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -5957,22 +5782,20 @@ msgid "Create Emission Points From Node"
msgstr "أنشئ نقاط إنبعاث من العقدة"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Flat 0"
-msgstr "مسطح0"
+msgstr "السطح 0"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Flat 1"
-msgstr "مسطح1"
+msgstr "السطح 1"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
msgid "Ease In"
-msgstr ""
+msgstr "دخول متسارع Ease In"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
msgid "Ease Out"
-msgstr ""
+msgstr "تراجع مُتباطئ Ease Out"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Smoothstep"
@@ -5980,7 +5803,7 @@ msgstr "خطوة ناعمة"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Point"
-msgstr "نعديل نقطة الإنحناء"
+msgstr "تعديل نقطة الإنحناء"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Tangent"
@@ -5991,29 +5814,24 @@ msgid "Load Curve Preset"
msgstr "تحميل إعداد مسبق للإنحناء"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
msgstr "إضافة نقطة"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
msgstr "مسح النقطة"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Left Linear"
-msgstr "الخط الشمالي"
+msgstr "الخط اليساري"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right Linear"
msgstr "الخط اليميني"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Load Preset"
-msgstr "تحميل الإعداد المعد مسبقاً"
+msgstr "تحميل إعداد مسبق"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove Curve Point"
@@ -6025,12 +5843,11 @@ msgstr "إلغاء/تفعيل مماس خط المنحني"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Hold Shift to edit tangents individually"
-msgstr "إبقي ضاغطاً علي Shift لتعديل المماس فردياً"
+msgstr "إبقى ضاغطاً على Shift لتعديل المماس فردياً"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right click to add point"
-msgstr "إظغط: أضف نقطة"
+msgstr "اضغط بالزر الأيمن لإضافة نقطة"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
@@ -6038,7 +5855,7 @@ msgstr "طبخ مجس GI"
#: editor/plugins/gradient_editor_plugin.cpp
msgid "Gradient Edited"
-msgstr ""
+msgstr "التدرج المُحرر"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
@@ -6061,38 +5878,52 @@ msgid "Mesh is empty!"
msgstr "الميش فارغ!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "أنشئ جسم تراميش ثابت"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "لا يمكن إنشاء شكل Trimesh تصادمي."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "أنشئ جسم محدب ثابت"
+msgid "Create Static Trimesh Body"
+msgstr "أنشئ جسم تراميش ثابت"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
-msgstr "هذا لا يعمل علي جزر المشهد!"
+msgstr "لا يعمل هذا على المشهد الرئيس!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Trimesh Static Shape"
-msgstr "أنشئ شكل تراميش"
+msgstr "أنشئ شكل Trimesh ساكن"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr ""
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "لا يمكن إنشاء شكل تصادمي مُحدب لأجل المشهد الرئيس."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Shape(s)"
-msgstr "أنشئ شكل محدب"
+msgid "Couldn't create a single convex collision shape."
+msgstr "لم يتم إنشاء شكل محدب تصادمي وحيد."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "أنشئ شكل محدب وحيد"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "لا يمكن إنشاء أشكال تصادم محدبة عديدة لأجل المشهد الرئيس."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "لا يمكن إنشاء أي شكل تصادمي."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "أنشئ أشكال محدبة متعددة"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
-msgstr "أنشئ ميش التنقل"
+msgstr "أنشئ سطح Mesh التنقل"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr "الميش المتضمن ليس من النوع الميش المتعدد."
+msgstr "السطح المتضمن ليس نوعاً من مصفوفة السطوح ArrayMesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
@@ -6135,19 +5966,67 @@ msgid "Create Trimesh Static Body"
msgstr "إنشاء جسم تراميش ثابت"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"إنشاء جسم سكوني وقرنه مع جسم تصادمي شبيه بالمُضلع تلقائياً.\n"
+"هذا الخيار هو الأفضل والأكثر دقة (ولكنه الأبطئ) لأجل الكشف عن وجود تصادمات."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "إنشاء متصادم تراميش قريب"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
-msgstr "إنشاء متصادم محدب قريب"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"إنشاء شكل تصادمي مُضلعي الشكل.\n"
+"هذا هو الخيار الأكثر دقة (لكنه الأبطئ) لأجل للكشف عن وقوع التصادم."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "إنشاء شقيق تصادم محدب مفرد"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"إنشاء شكل تصادمي ذو تحدب وحيد.\n"
+"هذا هو الخيار الأسرع (لكنه الأقل دقة) للكشف عن وقوع التصادم."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "إنشاء أشقاء تصادم محدب متعددة"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"إنشاء شكل تصادمي مُضلعي الهيئة.\n"
+"هذا الخيار \\مُتوسط الأداء بين الخيارين أعلاه."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "إنشاء شبكة الخطوط العريضة ..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"يُنشى سطحاً مخططاً outline mesh سكونياً. هذا السطح تكون قيمه الطبيعية مقلوبة "
+"بصورة تلقائية.\n"
+"يمكن أن يستخدم بدلاً من خاصية التمدد (Grow ) لمادة الحيز المكاني "
+"SpatialMaterial عندما يكون استخدام هذه الخاصية غير مقدور عليه."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "أظهر UV1"
@@ -6169,23 +6048,23 @@ msgstr "حجم الخطوط:"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Channel Debug"
-msgstr ""
+msgstr "منقح أخطاء قناة UV"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
msgstr "مسح العنصر %d؟"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "تحديث من المشهد"
+msgstr ""
+"التحديث من المشهد المتواجد؟:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid "Mesh Library"
-msgstr "مكتبة الميش..."
+msgstr "مكتبة المجسم"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6303,12 +6182,10 @@ msgstr "إنشاء مُضلع التنقل"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Convert to CPUParticles"
-msgstr "تحويل إلي %s"
+msgstr "تحويل إلى %s"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
msgstr "توليد Rect الرؤية"
@@ -6327,26 +6204,23 @@ msgstr "وقت التوليد (تانية):"
#: editor/plugins/particles_editor_plugin.cpp
msgid "The geometry's faces don't contain any area."
-msgstr ""
+msgstr "الوجوه الهندسية لا تتضمن أي منطقة."
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "The geometry doesn't contain any faces."
-msgstr "العقدة لا تحتوي على هندسة (الوجوه)."
+msgstr "الهندسة لا تحتوي على وجوه."
#: editor/plugins/particles_editor_plugin.cpp
msgid "\"%s\" doesn't inherit from Spatial."
-msgstr ""
+msgstr "\"%s\" لا يرث الفراغي Spatial."
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "\"%s\" doesn't contain geometry."
-msgstr "العقدة لا تحتوي على هندسة."
+msgstr "\"%s\" لا تحتوي على هندسة."
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "\"%s\" doesn't contain face geometry."
-msgstr "العقدة لا تحتوي على هندسة."
+msgstr "\"%s\" لا تحتوي على هندسة وجه."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6362,7 +6236,7 @@ msgstr "نقاط المساحة"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Surface Points+Normal (Directed)"
-msgstr ""
+msgstr "نقاط السطح + طبيعي (مُوجّه)"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Volume"
@@ -6406,9 +6280,8 @@ msgid "Add Point to Curve"
msgstr "أضف نقطة للمنحنى"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Split Curve"
-msgstr "تحرير منحنى العقدة"
+msgstr "تقسيم المنحنى"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
@@ -6439,31 +6312,31 @@ msgstr "إظغط: أضف نقطة"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Left Click: Split Segment (in curve)"
-msgstr ""
+msgstr "بالزر الأيسر: فصل القطعة (من المنحنى)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr ""
+msgstr "بالزر الأيمن: احذف النقطة"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
-msgstr ""
+msgstr "اختر العُقد الآباء (بالسحب + Shift)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Add Point (in empty space)"
-msgstr ""
+msgstr "إضافة عُقدة (في فُسحة فارغة)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
-msgstr ""
+msgstr "احذف النقطة"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Close Curve"
-msgstr ""
+msgstr "إغلاق المنحنى"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
@@ -6474,16 +6347,16 @@ msgstr "الإعدادات"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "زوايا مقبض المرآة"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "أطول مقابض المرآة"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
-msgstr ""
+msgstr "نُقطة المنحنى #"
#: editor/plugins/path_editor_plugin.cpp
msgid "Set Curve Point Position"
@@ -6499,11 +6372,11 @@ msgstr "حدد موقع خروج الإنحناء"
#: editor/plugins/path_editor_plugin.cpp
msgid "Split Path"
-msgstr ""
+msgstr "فصل المسار"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove Path Point"
-msgstr ""
+msgstr "إزالة نُقطة المسار"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove Out-Control Point"
@@ -6511,367 +6384,346 @@ msgstr "مسح نقطة خروج التحكم"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove In-Control Point"
-msgstr ""
+msgstr "إزالة النُقطة داخلية التحكم In-Control"
#: editor/plugins/path_editor_plugin.cpp
msgid "Split Segment (in curve)"
-msgstr ""
+msgstr "فصل القطعة (من المُنحنى)"
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move Joint"
-msgstr "مسح النقطة"
+msgstr "تحريك النُقطة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
msgstr ""
+"إن خاصية الهيكل الخاص بالمضلع ثنائي الأبعاد لا تشير إلى عُقدة هيكلية ثنائية "
+"الأبعاد Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones"
-msgstr "إظهار العظام"
+msgstr "مُزامنة العظام"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
msgstr ""
+"لا نقوش في هذا المُضلع.\n"
+"حدد نقشاً لتتمكن من تعديل UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
-msgstr ""
+msgstr "إنشاء خريطة UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"Polygon 2D has internal vertices, so it can no longer be edited in the "
"viewport."
msgstr ""
+"يمتلك المُضلع ثنائي الأبعاد رؤوساً داخلياً، لذا لا يمكن الاستمرار بتعديله في "
+"إطار العرض."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "إنشاء بولي"
+msgstr "إنشاء مُضلع وUV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Internal Vertex"
-msgstr "إنشاء موجه أفقي جديد"
+msgstr "إنشاء رأس داخلي"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Internal Vertex"
-msgstr "مسح الموجه العمودي"
+msgstr "إزالة الرأس الداخلي"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Invalid Polygon (need 3 different vertices)"
-msgstr ""
+msgstr "مُضلع غير صالح (يحتاج لثلاثة رؤوس مختلفة)"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Add Custom Polygon"
-msgstr "تعديل البولي"
+msgstr "إضافة مُضلع مخصوص"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Custom Polygon"
-msgstr "مسح البولي والنقطة"
+msgstr "إزالة المُضلع المخصوص"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
-msgstr ""
+msgstr "إعادة تشكيل خريطة UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Transform Polygon"
-msgstr "إنشاء بولي"
+msgstr "إعادة تشكيل المُضلع"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint Bone Weights"
-msgstr ""
+msgstr "طلاء العظام وزنياً"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Open Polygon 2D UV editor."
-msgstr "فتح المُعدل 2D"
+msgstr "فتح مُحرر UV الخاص بالمُضلعات ثنائية البُعد."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
-msgstr ""
+msgstr "مُحرر UV الخاص بالمُضلعات ثنائية البُعد"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "ال UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Points"
-msgstr "مسح النقطة"
+msgstr "النقاط"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Polygons"
-msgstr "تعديل البولي"
+msgstr "المُضلعات"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "أنشئ عظام"
+msgstr "العظام"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Points"
-msgstr "مسح النقطة"
+msgstr "تحريك النقاط"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
-msgstr ""
+msgstr "Ctrl: تدوير"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
-msgstr ""
+msgstr "Shift: تحريك الكُل"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
-msgstr ""
+msgstr "Shift+Ctrl: تحجيم"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
-msgstr ""
+msgstr "تحريك المُضلع"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Rotate Polygon"
-msgstr ""
+msgstr "تدوير المُضلع"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Scale Polygon"
-msgstr ""
+msgstr "تحجيم المُضلع"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create a custom polygon. Enables custom polygon rendering."
-msgstr ""
+msgstr "إنشاء مُضلع مخصوص. تمكين إخراج المُضلع المخصوص بصرياً."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"Remove a custom polygon. If none remain, custom polygon rendering is "
"disabled."
msgstr ""
+"إزالة المُضلع المخصوص. إن لم يتبق شيء، سيتم تعطيل إخراج المُضلع المخصوص بصرياً."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint weights with specified intensity."
-msgstr ""
+msgstr "طلاء الأوزان بشدات محددة."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Unpaint weights with specified intensity."
-msgstr ""
+msgstr "إزالة طلاء الأوزان بشدات محددة."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "نصف القطر:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
-msgstr ""
+msgstr "مُضلع > UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV->Polygon"
-msgstr ""
+msgstr "UV > مُضلع"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Clear UV"
-msgstr ""
+msgstr "إزالة UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "إعدادات المُعدل"
+msgstr "إعدادات الشبكة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
-msgstr ""
+msgstr "محاذاة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
-msgstr ""
+msgstr "تمكين المحاذاة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
-msgstr ""
+msgstr "الشبكة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Show Grid"
msgstr "إظهار الشبكة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "تعديل اللقطة"
+msgstr "تهيئة الشكبة:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "معادل الشبكة:"
+msgstr "معادل الشبكة على المحور الأفقي X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "معادل الشبكة:"
+msgstr "معادل الشبكة على المحور Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "خطوة الشبكة:"
+msgstr "خطوة الشبكة على المحور X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "خطوة الشبكة:"
+msgstr "خطوة الشبكة على المحور Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Sync Bones to Polygon"
-msgstr ""
+msgstr "مزامنة العظام مع المُضلع"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
-msgstr ""
+msgstr "خطأ: لا يمكن تحميل المورد!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
-msgstr ""
+msgstr "إضافة مورد"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Rename Resource"
-msgstr ""
+msgstr "إعادة تسمية المورد"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Resource"
-msgstr ""
+msgstr "حذف المورد"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Resource clipboard is empty!"
-msgstr ""
+msgstr "حافظة الموارد فارغة!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Paste Resource"
-msgstr "لصق الموارد"
+msgstr "لصق المورد"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
-msgstr ""
+msgstr "نمذجة:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Type:"
-msgstr ""
+msgstr "نوع:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
msgid "Open in Editor"
-msgstr ""
+msgstr "افتح في المُحرر"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Load Resource"
-msgstr ""
+msgstr "تحميل المورد"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ResourcePreloader"
-msgstr "محدث مسبق للموارد"
+msgstr "مورد محمل سلفاً"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "لا تملك شجرة الرسومات المتحركة مساراً لمشغل الرسومات المتحركة"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "شجرة الحركة خاطئة."
+msgstr "المسار لمشغل الرسومات المتحركة غير صالح"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
-msgstr ""
+msgstr "إزالة الملفات الحديثة"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close and save changes?"
-msgstr ""
+msgstr "الإغلاق مع حفظ التعديلات؟"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "خطأ في حفظ مجموعة البلاط!"
+msgstr "خطأ في كتابة الملف النصي TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "لا يمكن إنشاء المجلد."
+msgstr "لا يمكن تحميل المجلد في:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "خطأ في حفظ مجموعة البلاط!"
+msgstr "خطأ في حفظ الملف!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "خطأ خلال الحفظ."
+msgstr "خطأ أثناء حفظ الموضوع (Theme)."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
-msgstr "خطأ في تحريك:"
+msgstr "خطأ في الحفظ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "خطأ في تحريك:"
+msgstr "خطأ في استيراد الموضوع (Theme)."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
-msgstr "خطأ في تحريك:"
+msgstr "خطأ في الاستيراد"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
-msgstr "مجلد جديد..."
+msgstr "ملف نصي جديد..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "إفتح ملف"
+msgstr "افتح الملف"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "حفظ باسم..."
+msgstr "حفظ الملف ك..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "لا يمكن الحصول على النص البرمجي للتشغيل."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "أخفق تحميل النص البرمجي، تفقد الأخطاء في العارض console."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "النص البرمجي ليس في وضعية الأداة، لم ينجح التشغيل."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
+"ليتم تشغيل النص البرمجي، ينبغي أن يرث النص البرمجي للمحرر EditorScript وأن "
+"يُضع في وضعية الأداة."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
-msgstr ""
+msgstr "استيراد الموضوع Theme"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error while saving theme"
-msgstr ""
+msgstr "خطأ أثناء حفظ الموضوع Theme"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving"
@@ -6879,36 +6731,33 @@ msgstr "خطأ في الحفظ"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
-msgstr ""
+msgstr "حفظ الموضوع Theme ك..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "%s Class Reference"
-msgstr " مرجع الصنف"
+msgstr "%s مرجعية الصف Class"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr "بحث عن التالي"
+msgstr "إيجاد التالي"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
-msgstr ""
+msgstr "إيجاد السابق"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "خصائص العنصر."
+msgstr "تشريح النصوص البرمجية"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "تفعيل الترتيب الألفبائي لقائمة الدوال."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter methods"
-msgstr "وضع المُصفي:"
+msgstr "ترشيح الدوال"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -6924,256 +6773,237 @@ msgstr "تحريك لأعلى"
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr "تحرك لأسفل"
+msgstr "تحريك لأسفل"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
-msgstr ""
+msgstr "النص البرمجي التالي"
#: editor/plugins/script_editor_plugin.cpp
msgid "Previous script"
-msgstr ""
+msgstr "النص البرمجي السابق"
#: editor/plugins/script_editor_plugin.cpp
msgid "File"
msgstr "ملف"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open..."
-msgstr "إفتح"
+msgstr "افتح..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Reopen Closed Script"
-msgstr "فتح الكود"
+msgstr "إعادة فتح النص البرمجي المُغلق"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
-msgstr "احفظ الكل"
+msgstr "إحفظ الكل"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr ""
+msgstr "إعادة تحميل النص البرمجي بلطف"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
-msgstr "نسخ مسار الكود"
+msgstr "نسخ مسار النص البرمجي"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
-msgstr "التبويب السابق"
+msgstr "التاريخ السابق"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
-msgstr ""
+msgstr "التاريخ التالي"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme"
-msgstr ""
+msgstr "الموضوع"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Import Theme..."
-msgstr "حاري إستيراد المشهد..."
+msgstr "استيراد الموضوع…"
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
-msgstr ""
+msgstr "إعادة تحميل الموضوع"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme"
-msgstr ""
+msgstr "احفظ الموضوع"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
-msgstr ""
+msgstr "إغلاق الكل"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
-msgstr ""
+msgstr "إغلاق المستندات"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
-msgstr ""
+msgstr "تشغيل"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
-msgstr ""
+msgstr "اخط خطوة ضمن"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
-msgstr ""
+msgstr "اخط خطوة متجاوزة"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
-msgstr ""
+msgstr "توقف"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
msgid "Continue"
-msgstr ""
+msgstr "استمرار"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
-msgstr ""
+msgstr "إبقاء منُقتح الأخطاء البرمجية مفتوحاً"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "فتح في المُعدل التالي"
+msgstr "تنقيح الأخطاء في محرر خارجي"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "فُتح مؤخراً"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
+msgstr "افتح مستندات غودوت على الشبكة."
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
-msgstr ""
+msgstr "ابحث في الوثائق المرجعية."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to previous edited document."
-msgstr ""
+msgstr "التوجه إلى المستند المُحرر السابق."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
-msgstr ""
+msgstr "التوجه إلى المستند المُحرر التالي."
#: editor/plugins/script_editor_plugin.cpp
msgid "Discard"
-msgstr ""
+msgstr "تجاهل"
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?:"
msgstr ""
+"الملفات التالية أحدث على القرص.\n"
+"ما الإجراء الذي ينبغي اتخاذه؟:"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Reload"
-msgstr ""
+msgstr "إعادة تحميل"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Resave"
-msgstr ""
+msgstr "إعادة حفظ"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
-msgstr ""
+msgstr "مُنقح الأخطاء"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "إبحث في المساعدة"
+msgstr "نتائج البحث"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Clear Recent Scripts"
-msgstr "إخلاء المشاهد الحالية"
+msgstr "إخلاء النصوص البرمجية الحديثة"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Connections to method:"
-msgstr "صلها بالعقدة:"
+msgstr "الاتصالات لدالة:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source"
-msgstr "مورد"
+msgstr "مصدر"
#: editor/plugins/script_text_editor.cpp
msgid "Target"
-msgstr ""
+msgstr "الهدف"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "قطع إتصال'%s' من '%s'"
+msgstr ""
+"الدالة المتصلة '%s' للاشارة '%s' مفقودة من العقدة '%s' إلى العقدة '%s'."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Line"
-msgstr "الخط:"
+msgid "[Ignore]"
+msgstr "(تجاهل)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
+msgid "Line"
+msgstr "خط"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "مسح المهمة"
+msgstr "انتقل الى الوظيفة البرمجية"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
-msgstr ""
+msgstr "يمكن إسقاط موارد ملفات النظام filesystem فقط."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
-msgstr ""
+msgstr "لا يمكن إسقاط العُقد لأن النص البرمجي '%s' غير مُستخدم في هذا المشهد."
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
-msgstr ""
+msgstr "رمز البحث"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
-msgstr ""
+msgstr "اختر لوناً"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Convert Case"
-msgstr ""
+msgstr "حالة التحويل"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Uppercase"
-msgstr ""
+msgstr "الأحرف الكبيرة (Uppercase)"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Lowercase"
-msgstr ""
+msgstr "الأحرف الصغيرة (Lowercase)"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr ""
+msgstr "تكبير الحروف Capitalize"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
+msgstr "مُعلّم التركيب Syntax"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
-msgstr ""
+msgstr "التوجه إلى"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Bookmarks"
-msgstr ""
+msgstr "المحفوظات"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Breakpoints"
-msgstr "مسح النقاط"
+msgstr "نقاط التكسّر"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
-msgstr ""
+msgstr "قص"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -7182,19 +7012,19 @@ msgstr "تحديد الكل"
#: editor/plugins/script_text_editor.cpp
msgid "Delete Line"
-msgstr ""
+msgstr "حذف الخط"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
-msgstr ""
+msgstr "المسافة البادئة يساراً"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Right"
-msgstr ""
+msgstr "المسافة البادئة يميناً"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
-msgstr ""
+msgstr "تفعيل Toggle التعليقات"
#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
@@ -7202,187 +7032,172 @@ msgstr "إلغاء/تفعيل طي الخط"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
-msgstr ""
+msgstr "طي جميع الخطوط"
#: editor/plugins/script_text_editor.cpp
msgid "Unfold All Lines"
-msgstr ""
+msgstr "كشف جميع الخطوط"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr ""
+msgstr "استنساخ أدناه"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr ""
+msgstr "رمز التمام"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Evaluate Selection"
-msgstr "تكبير المحدد"
+msgstr "تقييم الاختيار"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr ""
+msgstr "تشذيب الفراغات البيضاء الزائدة"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
-msgstr "تحويل إلي %s"
+msgstr "تحويل المسافة البادئة إلى مسافات"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
-msgstr "تحويل إلي %s"
+msgstr "تحويل المسافة البادئة إلى تبويبات"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr ""
+msgstr "مسافة بادئة تلقائية"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
-msgstr "فلتر الملفات..."
+msgstr "جِد في الملفات..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
-msgstr ""
+msgstr "مساعدة سياقية"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Toggle Bookmark"
-msgstr "إلغاء/تفعيل وضع النظرة الحرة"
+msgstr "تبديل العلامة المرجعية"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Bookmark"
-msgstr "إذهب إلي الخطوة التالية"
+msgstr "الانتقال إلى العلامة المرجعية التالية"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Bookmark"
-msgstr "إذهب إلي الخطوة السابقة"
+msgstr "الانتقال إلى العلامة المرجعية السابقة"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Remove All Bookmarks"
-msgstr "مسح الكل"
+msgstr "إزالة جميع الإشارات المرجعية"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
-msgstr "مسح المهمة"
+msgstr "الذهاب إلى وظيفة برمجية..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "إذهب إلي الخط"
+msgstr "الذهاب إلى خط..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr ""
+msgstr "تفعيل/إلغاء تفعيل نقطة التكسّر"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr ""
+msgstr "إزالة جميع نقاط التكسّر"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
-msgstr "إذهب إلي الخطوة التالية"
+msgstr "الذهاب إلى نقطة التكسّر التالية"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
-msgstr "إذهب إلي الخطوة السابقة"
+msgstr "الذهاب إلى نقطة التكسّر السابقة"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
+"لقد تم تعديل هذا المُظلل على القرص.\n"
+"ما الإجراء الذي ينبغي اتخاذه؟"
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
-msgstr ""
+msgstr "مُظلل"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "لا يملك هذا الهكيل أيّة عظام، أنشئ بعض عُقد العظام ثنائية البُعد كأبناء."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Rest Pose from Bones"
-msgstr "أنشئ نقاط إنبعاث من الشبكة"
+msgstr "إنشاء وضعية الراحة من العظام"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Rest Pose to Bones"
-msgstr ""
+msgstr "تحديد وضعية الراحة على العظام"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "الفردية"
+msgstr "هيكل ثنائي البُعد"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "إنشاء وضعية الراحة (من العظام)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "تحديد العظام لتكون في وضعية الراحة"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "أنشئ ميش التنقل"
+msgstr "إنشاء عظام مادية"
#: editor/plugins/skeleton_editor_plugin.cpp
msgid "Skeleton"
msgstr "الهيكل"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "إنشاء حل C#‎"
+msgstr "إنشاء هيكل عظمي مادي"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "تشغيل"
+msgstr "تشغيل IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
-msgstr ""
+msgstr "متعامد"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective"
-msgstr ""
+msgstr "منظوري"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
-msgstr ""
+msgstr "أجهض التحول."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "X-Axis Transform."
-msgstr ""
+msgstr "التحوّل المحوري X."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Y-Axis Transform."
-msgstr ""
+msgstr "التحوّل المحوري Y."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Z-Axis Transform."
-msgstr ""
+msgstr "التحوّل المحوري Z."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr ""
+msgstr "إظهار تحولات المستوى."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scaling: "
-msgstr ""
+msgstr "يُحجم: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translating: "
@@ -7390,220 +7205,238 @@ msgstr "يترجم: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
-msgstr ""
+msgstr "يُدير %s من الدرجات."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Keying is disabled (no key inserted)."
-msgstr ""
+msgstr "تم تعطيل تعيين المفاتيح (لم يتم إدخال أيّة مفاتيح)."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Animation Key Inserted."
-msgstr ""
+msgstr "أُدخل مفتاح الرسوم المتحركة."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pitch"
-msgstr ""
+msgstr "حدّة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "الإنحراف Yaw"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
-msgstr ""
+msgstr "كائنات مرسومة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Material Changes"
-msgstr ""
+msgstr "تُغيرات المادة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Shader Changes"
-msgstr ""
+msgstr "تغيرات المُظلل"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Surface Changes"
-msgstr ""
+msgstr "تغيرات السطح"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
-msgstr ""
+msgstr "رسم الاستدعاءات"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Vertices"
-msgstr ""
+msgstr "القمم"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View."
-msgstr ""
+msgstr "الواجهة العلوية."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View."
-msgstr ""
+msgstr "الواجهة السفلية."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom"
-msgstr ""
+msgstr "الأسفل"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View."
-msgstr ""
+msgstr "الواجهة اليُسرى."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left"
-msgstr ""
+msgstr "اليسار"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View."
-msgstr ""
+msgstr "الواجهة اليُمنى."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right"
-msgstr ""
+msgstr "اليمين"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View."
-msgstr ""
+msgstr "الواجهة الأمامية."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front"
-msgstr ""
+msgstr "الأمام"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View."
-msgstr ""
+msgstr "الواجهة الخلفية."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear"
-msgstr ""
+msgstr "الخلف"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr ""
+msgstr "محاذاة التحوّل مع الواجهة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
-msgstr ""
+msgstr "محاذاة التدوير مع الواجهة"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
-msgstr "لا أب للصق الطفل عليه."
+msgstr "لا أب لنمذجة ابن له."
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "This operation requires a single selected node."
msgstr "هذه العملية تتطلب عقدة واحدة محددة."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "الإسقاط العمودي مُمكن تلقائياً"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
-msgstr ""
+msgstr "قفل تدوير الواجهة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
-msgstr ""
+msgstr "عرض الطبيعي"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Wireframe"
-msgstr ""
+msgstr "عرض المُخطط Wireframe"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Overdraw"
-msgstr ""
+msgstr "عرض تراكبات الرسم Overdraw"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Unshaded"
-msgstr ""
+msgstr "عرض من غير ظلال"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Environment"
-msgstr ""
+msgstr "عرض البيئة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Gizmos"
-msgstr ""
+msgstr "إظهار الأدوات Gizmos"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
-msgstr ""
+msgstr "إظهار المعلومات"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View FPS"
-msgstr "إظهار الفريم/ثانية"
+msgstr "إظهار عدد الإطارات بالثانية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Half Resolution"
-msgstr "نصف حجم الشاشة"
+msgstr "نصف دقة الشاشة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Audio Listener"
-msgstr ""
+msgstr "المستمع الصوتي"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Enable Doppler"
-msgstr "تغيير خط الحركة"
+msgstr "تفعيل دوبلر"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "يُنشئ مستعرضات الميش"
+msgstr "معاينة سينمائية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
-msgstr ""
+msgstr "غير متوافر عند استخدام الخرج البصري GLES2 ."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr ""
+msgstr "الرؤية الحُرة Freelook يساراً"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr ""
+msgstr "الرؤية الحرة Freelook يميناً"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr ""
+msgstr "الرؤية الحرة Freelook قُدماً"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr ""
+msgstr "الرؤية الحُرة Freelook تراجعياً"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr ""
+msgstr "الرؤية الحُرة Freelook للأعلى"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr ""
+msgstr "الرؤية الحُرة للأسفل"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
-msgstr ""
+msgstr "مُعدّل سرعة الرؤية الحُرة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Slow Modifier"
-msgstr ""
+msgstr "مُعدّل تباطؤ الرؤية الحُرة"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "تدوير الرؤية مقفول"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
+"ملاحظة: إن قيمة عدد الإطارات بالثانية الظاهر هو مُعدل خاص بالمحرر.\n"
+"لا يمكن الاعتماد على تلك القيمة كمؤشر لأداء اللعبة."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr ""
+msgid "XForm Dialog"
+msgstr "نافذة XForm"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
+"انقر للتبديل بين حالات الرؤية.\n"
+"\n"
+"العين المفتوحة: الأداة مرئية.\n"
+"العين المغلقة: الأداة مخفية.\n"
+"العين نصف مفتوحة: الأداة مرئية أيضا من خلال الأسطح المعتمة (\"الأشعة السينية"
+"\")."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Snap Nodes To Floor"
-msgstr "الكبس إلي الشبكة"
+msgstr "محاذاة العُقد إلى الأرضية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr ""
+msgstr "لم يتم إيجاد أرضية صُلبة لمحاذاة ما تم اختياره إليها."
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7611,375 +7444,358 @@ msgid ""
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
msgstr ""
+"السحب: تدوير.\n"
+"Alt+السحب: تحريك.\n"
+"Alt+ كبسة الزر الأيمن للفأرةRMB : اختيار قائمة العُمق"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Local Space"
-msgstr ""
+msgstr "استخدام الحيّز المحلي"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "إستخدم الكبس"
+msgstr "استخدام المحاذاة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr ""
+msgstr "الواجهة View السفلية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
-msgstr ""
+msgstr "الواجهة View العلوية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr ""
+msgstr "الواجهة View الخلفية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr ""
+msgstr "الواجهة View الأمامية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
-msgstr ""
+msgstr "الواجهة View اليُسرى"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View"
-msgstr ""
+msgstr "الواجهة View اليُمنى"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr ""
+msgstr "التبديل بين الرؤية المنظورية / الإسقاطية Orthogonal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
-msgstr ""
+msgstr "إدخال مفتاح للرسوميات المتحركة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr ""
+msgstr "مصدر التركيز"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
-msgstr ""
+msgstr "اختيار التركيز"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
-msgstr "إلغاء/تفعيل وضع النظرة الحرة"
+msgstr "إلغاء/تفعيل وضع الرؤية الحُرة"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform"
-msgstr ""
+msgstr "التحوّل"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Snap Object to Floor"
-msgstr "الكبس إلي الشبكة"
+msgstr "محاذاة الشيء إلى الأرض"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
-msgstr ""
+msgstr "نافذة التحويلات ..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
-msgstr ""
+msgstr "ساحة رؤية واحدة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports"
-msgstr ""
+msgstr "ساحتان للرؤية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr ""
+msgstr "ساحتان للرؤية (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
-msgstr ""
+msgstr "3 ساحات للرؤية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr ""
+msgstr "3 ساحات للرؤية (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
-msgstr ""
+msgstr "4 ساحات للرؤية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Gizmos"
-msgstr ""
+msgstr "الأدوات Gizmos"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
-msgstr ""
+msgstr "إظهار الأصل (المصدر)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Grid"
-msgstr ""
+msgstr "إظهار الشبكة"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Settings..."
-msgstr "جاري الإعداد..."
+msgstr "اعدادات..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
-msgstr ""
+msgstr "إعدادات المحاذاة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate Snap:"
-msgstr ""
+msgstr "ترجمة المحاذاة:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
-msgstr ""
+msgstr "تدوير المحاذاة (بالدرجات):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
-msgstr ""
+msgstr "تحجيم المحاذاة (%):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
-msgstr ""
+msgstr "إعدادات إطار العرض"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective FOV (deg.):"
-msgstr ""
+msgstr "مجال الرؤية FOV المنظورية (بالدرجات):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Near:"
-msgstr ""
+msgstr "إظهار Z-Near:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Far:"
-msgstr ""
+msgstr "إظهار Z-Far:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Change"
-msgstr ""
+msgstr "تعديل التحولات"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
-msgstr ""
+msgstr "الترجمة:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate (deg.):"
-msgstr ""
+msgstr "التدوير (بالدرجات):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale (ratio):"
-msgstr ""
+msgstr "التحجيم (نسبةً):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Type"
-msgstr ""
+msgstr "نوع التحوّل"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pre"
-msgstr ""
+msgstr "سابق"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Post"
-msgstr ""
+msgstr "لاحق"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Nameless gizmo"
-msgstr ""
+msgstr "أداة (gizmo) غير مسماة"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Mesh2D"
-msgstr "إنشاء شبكة الخطوط العريضة"
+msgstr "إنشاء Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Mesh2D Preview"
-msgstr "يُنشئ مستعرضات الميش"
+msgstr "معاينة Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon2D"
-msgstr "إنشاء بولي"
+msgstr "إنشاء مُضلع ثنائي الأبعاد"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Polygon2D Preview"
-msgstr ""
+msgstr "مُعاينة المُضلع ثنائي الأبعاد"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D"
-msgstr "إنشاء مُضلع التنقل"
+msgstr "إنشاء مُضلع تصادم ثنائي الأبعاد"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "CollisionPolygon2D Preview"
-msgstr "إنشاء مُضلع التنقل"
+msgstr "معاينة مُضلع التصادم ثنائي الأبعاد"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D"
-msgstr "أنشئ شكل مُطبق"
+msgstr "إنشاء LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "LightOccluder2D Preview"
-msgstr "أنشئ شكل مُطبق"
+msgstr "معاينة LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "الميش فارغ!"
+msgstr "الرسومية فارغة!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
+"لا يمكن تحويل الرسومية (sprite) إلى سطح (mesh) باستخدام إطارات الرسوم "
+"المتحركة."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "هندسياً غير صالح، لا يمكن استبداله بسطح (mesh)."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Mesh2D"
-msgstr "تحويل إلي %s"
+msgstr "تحويل إلى Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
-msgstr ""
+msgstr "هندسياصً غير صالح، لا يمكن إنشاء مُضلّع."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Polygon2D"
-msgstr "تحويل إلي %s"
+msgstr "تحويل إلى مُضلع ثنائي الأبعاد"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
-msgstr ""
+msgstr "هندسياً غير صالح، لا يمكن إنشاء مُضلع تصادم."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D Sibling"
-msgstr "إنشاء مُضلع التنقل"
+msgstr "إنشاء شقيق لمُضلع التصادم ثنائي الأبعاد"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
-msgstr ""
+msgstr "هندسياً غير صالح، لا يمكن إنشاء حِظار (occluder) الضوء."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D Sibling"
-msgstr "أنشئ شكل مُطبق"
+msgstr "أنشاء ضوء محجوب ثنائي الأبعاد"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite"
-msgstr ""
+msgstr "رسومية"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "التبسيط: "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Shrink (Pixels): "
-msgstr ""
+msgstr "التقلص (Pixels): "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
-msgstr ""
+msgstr "التكبير (Pixels): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "إستعراض"
+msgstr "تحديث المُعاينة"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "إعدادات المُعدل"
+msgstr "الإعدادات:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "إملئ الشاشة بالمحدد"
+msgstr "لا إطارات مُحددة"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add %d Frame(s)"
-msgstr ""
+msgstr "إضافة %d إطار(ات)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
-msgstr ""
+msgstr "إضافة إطار"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "فشل تحميل المورد."
+msgstr "غير قادر على تحميل الصور"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
-msgstr ""
+msgstr "خطأ: لم يتم تحميل مورد الإطار!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Resource clipboard is empty or not a texture!"
-msgstr ""
+msgstr "إما أن تكون حافظة الموارد فارغة أو ليست نقشاً!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste Frame"
-msgstr ""
+msgstr "الصق إطاراً"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Empty"
-msgstr ""
+msgstr "إضافته فارغاً"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation FPS"
-msgstr ""
+msgstr "تغيير مُعدل الإطارات في الثانية FPS للرسوم المتحركة"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "(empty)"
-msgstr ""
+msgstr "(فارغ)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move Frame"
-msgstr "وضع التحريك"
+msgstr "تحريك الإطار"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animations:"
-msgstr "صورة متحركة"
+msgstr "الرسومات المتحركة:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "New Animation"
-msgstr "صورة متحركة"
+msgstr "رسومية متحركة جديدة"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
-msgstr ""
+#, fuzzy
+msgid "Speed:"
+msgstr "السرعة (إطار ف. ث. FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Loop"
-msgstr ""
+msgstr "حلقة Loop"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animation Frames:"
-msgstr "إسم الحركة:"
+msgstr "إطارات الرسومات المتحركة:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "التقط من البيكسل"
+msgstr "إضافة ملمس من الملف"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr ""
+msgstr "إضافة الإطارات من ورقة الرسوميات Sprite Sheet"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
-msgstr ""
+msgstr "إضافته فارغاً (قبل)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (After)"
-msgstr ""
+msgstr "إضافته فارغاً (بَعد)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (Before)"
@@ -7990,100 +7806,97 @@ msgid "Move (After)"
msgstr "تحريك (للتالي)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "تحديد الوضع"
+msgstr "تحديد الإطارات"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
-msgstr ""
+msgstr "عَرضياً:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Vertical:"
-msgstr ""
+msgstr "شاقولياً:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Select/Clear All Frames"
-msgstr ""
+msgstr "اختيار / مسح جميع الإطارات"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Create Frames from Sprite Sheet"
-msgstr ""
+msgstr "إنشاء الإطارات من ورقة الرسومية Sprite Sheet"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "SpriteFrames"
-msgstr ""
+msgstr "إطارات الرسوميات SpriteFrames"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Region Rect"
-msgstr ""
+msgstr "تحديد مستطيل المنطقة"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "Set Margin"
-msgstr "حدد المعامل"
+msgstr "تحديد الهامش"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
-msgstr ""
+msgstr "وضع المحاذاة:"
#: editor/plugins/texture_region_editor_plugin.cpp
#: scene/resources/visual_shader.cpp
msgid "None"
-msgstr ""
+msgstr "لا شيء"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
-msgstr ""
+msgstr "محاذاة البكسل"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Grid Snap"
-msgstr ""
+msgstr "شبكة المحاذاة"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
-msgstr ""
+msgstr "الاقتطاع التلقائي"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Offset:"
-msgstr ""
+msgstr "المُعادل:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Step:"
-msgstr ""
+msgstr "الخطوة:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "الفاصل:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "TextureRegion"
-msgstr ""
+msgstr "منطقة النقش TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
-msgstr ""
+msgstr "إضافة جميع العناصر"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All"
-msgstr ""
+msgstr "إضافة الجميع"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove All Items"
-msgstr ""
+msgstr "إزالة جميع العناصر"
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
msgid "Remove All"
msgstr "مسح الكل"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "الأعضاء"
+msgstr "تحرير الموضوع"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
-msgstr ""
+msgstr "قائمة تحرير الموضوع."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
@@ -8095,34 +7908,31 @@ msgstr "حذف بنود من الصنف"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Template"
-msgstr ""
+msgstr "إنشاء قالب فارغ"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Editor Template"
-msgstr ""
+msgstr "إنشاء قالب مُحرر فارغ"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create From Current Editor Theme"
-msgstr ""
+msgstr "إنشاء مستمد من موضوع Theme المحرر الحالي"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Button"
-msgstr "إلغاء/تفعيل التشغيل التلقائي"
+msgstr "زر التبديل"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Button"
-msgstr "معطّل"
+msgstr "زر معطّل"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Item"
msgstr "عنصر"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Item"
-msgstr "معطّل"
+msgstr "عنصر معطّل"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Check Item"
@@ -8142,34 +7952,31 @@ msgstr "عنصر مُفعل اختياري"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Named Sep."
-msgstr ""
+msgstr "الفاصل المُسمّى."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
-msgstr ""
+msgstr "القائمة الفرعية"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Subitem 1"
-msgstr "عنصر"
+msgstr "العنصر الفرعي 1"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Subitem 2"
-msgstr "عنصر"
+msgstr "العنصر الفرعي 2"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
-msgstr ""
+msgstr "يملك"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Many"
-msgstr ""
+msgstr "العديد"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled LineEdit"
-msgstr "معطّل"
+msgstr "تعديل الخط معطّل"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -8184,364 +7991,337 @@ msgid "Tab 3"
msgstr "علامة التبويب 3"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Editable Item"
-msgstr "عنصر انتقاء"
+msgstr "عنصر قابل للتعديل"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
-msgstr ""
+msgstr "الشجرة الفرعية"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Has,Many,Options"
-msgstr "بكثير، خيارات عديدة،!"
+msgstr "يمتلك، خيارات، عديدة"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
-msgstr ""
+msgstr "نوع البيانات:"
#: editor/plugins/theme_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon"
-msgstr ""
+msgstr "الأيقونة"
#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Style"
-msgstr ""
+msgstr "الأسلوب"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Font"
-msgstr ""
+msgstr "الخط"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Color"
-msgstr ""
+msgstr "اللون"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme File"
-msgstr "إفتح ملف"
+msgstr "ملف الثيم"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
-msgstr ""
+msgstr "إزالة عملية الاختيار"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "اسم غير صالح."
+msgstr "أصلح البلاطة غير الصالحة"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "نصف المُحدد"
+msgstr "قص المُحدد"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
-msgstr ""
+msgstr "طلاء خريطة البلاط TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Line Draw"
-msgstr ""
+msgstr "رسم الخط"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
-msgstr ""
+msgstr "مستطيل الطلاء"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
-msgstr ""
+msgstr "وعاء التعبئة"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
-msgstr ""
+msgstr "مسح خريطة البلاط TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "جد"
+msgstr "جد البلاطة"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
-msgstr ""
+msgstr "المصفوفة المنقولة Transpose"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Disable Autotile"
-msgstr ""
+msgstr "تعطيل البلاط التلقائي Autotile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Enable Priority"
-msgstr "تعديل المصافي"
+msgstr "تمكين الأولوية"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter tiles"
-msgstr "فلتر الملفات..."
+msgstr "تنقية البلاطات"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
msgstr ""
+"منح مورد مُحدد البلاطات TileSet لخريطة البلاط TileMap هذه كي تستخدم بلاطاتها."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr ""
+msgstr "طلاء البلاط"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
"Shift+LMB: Line Draw\n"
"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
+"Shift+ الزر الأيسر للفأرة: الرسم خطياً\n"
+"Shift+Ctrl+الزر الأيسر للفأرة: طلاء المستطيلات"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr ""
+msgstr "اختيار البلاط"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Left"
-msgstr "وضع التدوير"
+msgstr "تدوير لليسار"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Right"
-msgstr "وضع التدوير"
+msgstr "تدوير لليمين"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
-msgstr ""
+msgstr "القلب أفقياً"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Vertically"
-msgstr ""
+msgstr "القلب عموديًا"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Transform"
-msgstr "تحويل تغيير التحريك"
+msgstr "محو التَحَوّل"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet."
-msgstr ""
+msgstr "إضافة نقش(نقوش) إلى مُحدد البلاط TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "مسح المدخلة الحالية"
+msgstr "مسح النقش المُختار من رزمة البلاطات."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
-msgstr ""
+msgstr "إنشاء من المشهد"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
-msgstr ""
+msgstr "دمج من المشهد"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
-msgstr ""
+msgstr "بلاطة مُفردة جديدة"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Autotile"
-msgstr "إظهار الملفات"
+msgstr "بلاط-تلقائي جديد"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Atlas"
-msgstr ""
+msgstr "أطلس جديد"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Next Coordinate"
-msgstr ""
+msgstr "الإحداثيات التالية"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
-msgstr ""
+msgstr "اختر الشكل أو البلاط الفرعي أو البلاط التالي."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Previous Coordinate"
-msgstr "التبويب السابق"
+msgstr "الإحداثيات السابقة"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
-msgstr ""
+msgstr "اختر الشكل أو البلاط الفرعي أو البلاط، السابق."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region"
-msgstr "وضع التدوير"
+msgstr "الإقليم"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision"
-msgstr "وضعية الأستيفاء"
+msgstr "التصادم"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion"
-msgstr "تعديل البولي"
+msgstr "الإطباق Occlusion"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation"
-msgstr "أنشئ ميش التنقل"
+msgstr "التنقل"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask"
-msgstr "وضع التدوير"
+msgstr "قناع البِت"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority"
-msgstr "تصدير المشروع"
+msgstr "الأولية"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index"
-msgstr "وضع السحب"
+msgstr "ترتيبية المحور Z"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region Mode"
-msgstr "وضع التدوير"
+msgstr "وضع الأقليم"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision Mode"
-msgstr "وضعية الأستيفاء"
+msgstr "وضع التصادم"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion Mode"
-msgstr "تعديل البولي"
+msgstr "وضع الإطباق"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation Mode"
-msgstr "أنشئ ميش التنقل"
+msgstr "وضع التنقل"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask Mode"
-msgstr "وضع التدوير"
+msgstr "وضع قناع-البِت"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "تصدير المشروع"
+msgstr "وضع الأولية"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Icon Mode"
-msgstr "وضع السحب"
+msgstr "وضع الأيقونة"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index Mode"
-msgstr "وضع السحب"
+msgstr "وضع ترتيبية المحور Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
-msgstr ""
+msgstr "نسخ قناع-البِت."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste bitmask."
-msgstr "لصق الحركة"
+msgstr "لصق قناع-البِت"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Erase bitmask."
-msgstr "زر الفأرة الأيمن: مسح النقطة."
+msgstr "مسح قناع-البِت."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "إنشاء %s جديد"
+msgstr "إنشاء مستطيل جديد."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new polygon."
-msgstr "أنشئ شكل جديد من لا شئ."
+msgstr "إنشاء مُضلع جديد."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
-msgstr ""
+msgstr "إبقاء المُضلع داخل مستطيل المنطقة."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
-msgstr ""
+msgstr "تمكين المحاذاة وإظهار الشبكة (التهيئة عبر المُتفحص)."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display Tile Names (Hold Alt Key)"
-msgstr ""
+msgstr "تعطيل أسماء البلاطات (اضغط على زر Alt)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Add or select a texture on the left panel to edit the tiles bound to it."
-msgstr ""
+msgstr "أضف أو اختر نقشاً من اللوحة على اليسار لتحرير البلاطات المقترنة بها."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "مسح المدخلة الحالية"
+msgstr "مسح النقش المُختار؟ هذا سيزيل جميع البلاطات التي تستخدمه."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "لم تختر نقشاً لإزالته."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
+"إنشاء اعتماداً على مشهد؟ هذا سيكتب متجاوزاً overwrite جميع البلاطات الحالية."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
-msgstr ""
+msgstr "دمج من مشهد؟"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Texture"
-msgstr "مسح القالب"
+msgstr "إزالة النقش"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
-msgstr ""
+msgstr "%s الملف(ات) لم تضف بسبب كونها موجودة سلفاً بالقائمة."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"اسحب المقابض لتحرير المستطيل.\n"
+"اضغط على بلاطة أخرى لتحريرها."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "إمسح الملفات المحددة؟"
+msgstr "مسح المستطيلات المحددة."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr "حفظ العنوان الفرعي الذي يتم تعديله حاليا."
+msgstr ""
+"اختر البلاطات الفرعية المُحددة حديثاً.\n"
+"اضغط على بلاطة أخرى لتحريرها."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
-msgstr "مسح النقاط"
+msgstr "مسح المُضلع."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"LMB: Set bit on.\n"
"RMB: Set bit off.\n"
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
-msgstr "حفظ العنوان الفرعي الذي يتم تعديله حاليا."
+msgstr ""
+"الزر الأيسر للفأرة: تشغيل bit.\n"
+"الزر الأيمن للفأرة: إطفاء bit.\n"
+"Shift+الزر الأيسر للفأرة: تحديد wildcard bit.\n"
+"اضغط على بلاطة أخرى لتحريرها."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8549,725 +8329,690 @@ msgid ""
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
+"اختر بلاطة فرعية لاستخدامها كأيقونة، حيث سيتم استخدامها في قرن البلاط "
+"التلقائي غير الصالح.\n"
+"اضغط على بلاطة أخرى لتحريرها."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
+"اختر بلاطة فرعية لتغير التفاضل الخاص بها.\n"
+"اختر بلاطة أخرى لتحريرها."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
-msgstr "حفظ العنوان الفرعي الذي يتم تعديله حاليا."
+msgstr ""
+"اختر بلاطة فرعية لتغير ترتيبها على المحور Z.\n"
+"اضغط على بلاطة أخرى لتحريرها."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Region"
-msgstr ""
+msgstr "تحديد منطقة البلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Tile"
-msgstr "أنشئ مجلد"
+msgstr "إنشاء بلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Icon"
-msgstr ""
+msgstr "تحديد أيقونة البلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Tile Bitmask"
-msgstr "تعديل المصافي"
+msgstr "تحرير قناع البِت Bitmask البلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Collision Polygon"
-msgstr "تعديل الشكل الموجود بالفعل:"
+msgstr "تعديل مُضلع التصادم"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Occlusion Polygon"
-msgstr "تعديل البولي"
+msgstr "تحرير مُضلع الإطباق"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Navigation Polygon"
-msgstr "إنشاء مُضلع التنقل"
+msgstr "تحرير مُضلع التصفح"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste Tile Bitmask"
-msgstr "لصق الحركة"
+msgstr "لصق قناع بِت Bitmask البلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Clear Tile Bitmask"
-msgstr ""
+msgstr "مسح قناع بِت Bitmask البلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Polygon Concave"
-msgstr ""
+msgstr "جعل المُضلع مُقعراً"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Polygon Convex"
-msgstr "إنشاء بولي"
+msgstr "جعل المُضلع مُحدّباً"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Tile"
-msgstr "مسح القالب"
+msgstr "إزالة البلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Collision Polygon"
-msgstr "مسح البولي والنقطة"
+msgstr "إزالة مُضلع التصادم"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Occlusion Polygon"
-msgstr "أنشئ شكل مُطبق"
+msgstr "إزالة مُضلع الإطباق"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Navigation Polygon"
-msgstr "إنشاء مُضلع التنقل"
+msgstr "إزالة مُضلع التنقل"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Tile Priority"
-msgstr "تعديل المصافي"
+msgstr "تعديل تفاضل البلاط"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
-msgstr ""
+msgstr "تعديل تراتبية البلاط على المحور Z"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Convex"
-msgstr "إنشاء بولي"
+msgstr "جعله مُحدباً"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
-msgstr "أنشئ عظام"
+msgstr "جعله مُقعراً"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Collision Polygon"
-msgstr "إنشاء مُضلع التنقل"
+msgstr "إنشاء مُضلع التصادم"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Occlusion Polygon"
-msgstr "أنشئ شكل مُطبق"
+msgstr "إنشاء مُضلع الإطباق Occlusion"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "هذه العملية لا يمكن الإكتمال من غير مشهد."
+msgstr "لا يمكن تعديل هذه الخاصية."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "TileSet"
-msgstr "مجموعة البلاط"
+msgstr "مُحدد البلاط"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No VCS addons are available."
-msgstr ""
+msgstr "لا يوجد إضافات VCS متوافرة."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
-msgstr ""
+msgstr "خطأ"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "No commit message was provided"
-msgstr "لا أسم مُقدم"
+msgstr "لم يتم تقديم رسالة ارتكاب commit"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr ""
+msgstr "لم يتم إضافة ملفات إلى المرحلة"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Commit"
-msgstr "المجتمع"
+msgstr "ارتكاب"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "VCS Addon is not initialized"
-msgstr ""
+msgstr "لم يتم تهيئة إضافات VCS"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control System"
-msgstr ""
+msgstr "نظام التحكم بالإصدار VCS"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Initialize"
-msgstr ""
+msgstr "الشروع"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
-msgstr ""
+msgstr "حيز التدريج"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Detect new changes"
-msgstr "إنشاء %s جديد"
+msgstr "الكشف عن التغيرات الجديدة"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Changes"
-msgstr "تغير"
+msgstr "التغيرات"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Modified"
-msgstr ""
+msgstr "مُعدّل"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Renamed"
-msgstr "إعادة التسمية"
+msgstr "مُعاد تسميته"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Deleted"
-msgstr "مسح"
+msgstr "مُزال"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Typechange"
-msgstr "تغير"
+msgstr "تعديل النوع"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Stage Selected"
-msgstr "تكبير المحدد"
+msgstr "حُددت المرحلة"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Stage All"
-msgstr "احفظ الكل"
+msgstr "مُجمل المراحل"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
-msgstr ""
+msgstr "إضافة رسالة إجراء"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Commit Changes"
-msgstr "مزامنة تغييرات الكود"
+msgstr "اقتراف التعديلا"
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Status"
-msgstr ""
+msgstr "الحالة"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "View file diffs before committing them to the latest version"
-msgstr ""
+msgstr "إظهار آخر تعديلات الملف قبل قبولهم في آخر نسخة"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No file diff is active"
-msgstr ""
+msgstr "لا ملف فروق نشط"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect changes in file diff"
-msgstr ""
+msgstr "الكشف عن التغييرات في ملف الفروق"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(GLES3 only)"
-msgstr ""
+msgstr "(GLES3 فقط)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Output"
-msgstr "أضف مدخله"
+msgstr "إضافة مُخرج"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "تكبير/تصغير:"
+msgstr "كمية قياسية Scalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector"
-msgstr "متجه"
+msgstr "مُتجه"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
-msgstr ""
+msgstr "منطق Boolean"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sampler"
msgstr "عينات (صوتية)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "أضف مدخله"
+msgstr "أضف بوابة المُدخلات"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr ""
+msgstr "أضف منفذ المُخرجات"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "غير النوع الإفتراضي"
+msgstr "غيّر نوع منفذ المُدخلات"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "غير النوع الإفتراضي"
+msgstr "غيّر نوع منفذ المُخرجات"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "تغيير إسم الحركة:"
+msgstr "غيّر اسم منفذ المُدخلات"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Change output port name"
-msgstr ""
+msgstr "غيّر اسم منفذ المُخرجات"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "مسح النقطة"
+msgstr "إزالة منفذ المُدخلات"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "مسح النقطة"
+msgstr "إزالة منفذ المُخرجات"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set expression"
-msgstr "النسخة الحالية:"
+msgstr "تحديد التعبير"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Resize VisualShader node"
-msgstr ""
+msgstr "تغيير حجم عُقدة VisualShader (التظليل البصري)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
-msgstr ""
+msgstr "تحديد اسم موحد"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set Input Default Port"
-msgstr "حدد كإفتراضي من أجل '%s'"
+msgstr "تحديد منفذ المدخلات الافتراضي"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node to Visual Shader"
-msgstr ""
+msgstr "إضافة عُقدة للتظليل البصري Visual Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Nodes"
-msgstr "مفاتيح نسخ التحريك"
+msgstr "مضاعفة العُقد"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste Nodes"
-msgstr ""
+msgstr "لصق العُقد"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Nodes"
-msgstr "إنشاء عقدة"
+msgstr "حذف العُقد"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Input Type Changed"
-msgstr ""
+msgstr "تعدل نوع مُدخلات التظليل البصري Visual Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
-msgstr ""
+msgstr "رأس"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
-msgstr "البراهين:"
+msgstr "شظايا"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Light"
-msgstr ""
+msgstr "ضوء"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Show resulted shader code."
-msgstr "إنشاء عقدة"
+msgstr "إظهار نص التظليل البرمجي الناتج."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Create Shader Node"
-msgstr "إنشاء عقدة"
+msgstr "إنشاء عُقدة تظليل"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "مسح المهمة"
+msgstr "الوظيفة البرمجية للون."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
-msgstr ""
+msgstr "مُشغّل اللون."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "إصنع دالة"
+msgstr "وظيفة التدرج الرمادي."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
+msgstr "تحويل مُتجه HSV إلى معادله من RGB."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
+msgstr "تحويل مُتجه RGB إلى معادله من HSV."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "إصنع دالة"
+msgstr "وظيفة البُني الداكن."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
-msgstr ""
+msgstr "مُشغل الحرق."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Darken operator."
-msgstr ""
+msgstr "مُشغل التعتيم."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Difference operator."
-msgstr "الإختلافات فقط"
+msgstr "مُشغل الفارق."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr ""
+msgstr "مُشغل التملص Dodge."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator."
-msgstr ""
+msgstr "مُشغل الضوء الساطع."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr ""
+msgstr "مُشغل التفتيح."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr ""
+msgstr "مُشغل التراكم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "مُشغل الشاشة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "مُشغل الضوء الخافت."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "ثابت"
+msgstr "ثابت اللون."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "تحويل تغيير التحريك"
+msgstr "اللون المُوحد."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
+msgstr "يُرجع المنطق الناتج عن مقارنة %s بين اثنين من المُعاملات."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "يُعادل (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "أكبر من (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "أكبر أو يساوي (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
msgstr ""
+"يُرجع المُتجه المقرون إذا كانت القيمة القياسية المُقدمة مساوية، أكبر أو أصغر."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
msgstr ""
+"يُرجع قيمة المنطق (صح/خطأ) من المقارنة بين INF ومَعلم الكمية القياسية scalar "
+"parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
msgstr ""
+"يُرجع منطق المقارنة (صحيح/خاطئ) بين NaN (ليس عدداً) و مَعلم الكمية القياسية "
+"scalar parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "أصغر من (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "أصغر أو يساوي (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "لا يُعادل (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
-msgstr ""
+msgstr "يُرجع المٌتجه المقرون إن كانت قيمة المنطق المزود صحيحة أو خاطئة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated scalar if the provided boolean value is true or false."
msgstr ""
+"يُرجع قيمة الكمية القياسية scalar المقرونة إن كانت قيمة المنطق المزود صحيحة "
+"أو خاطئة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
+msgstr "يُرجع نتيجة المنطق (صحيح/خاطئ) بعد المقارنة بين اثنين من المعالم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
msgstr ""
+"يُرجع نتيجة المنطق (صحيح/خاطئ) الناتج عن المقارنة ما بين INF (أو NaN \"ليس "
+"عدداً\") و مَعلم كمية قياسية scalar parameter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
-msgstr ""
+msgstr "ثابت المنطق (صحيح/خاطئ)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
-msgstr ""
+msgstr "المنطق (صحيح/خاطئ) المُوحد."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "'%s' مَعلم المُدخل لأجل جميع أساليب التظليل shader modes."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "الكبس إلي الطفل"
+msgstr "مَعلم المُدخل."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
+msgstr "'%s' مَعلم المُدخل لأجل أساليب تظليل الرأس والقطع."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "'%s' مَعلم المُدخل لأجل أساليب تظليل القطع والإضاءة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "'%s' مَعلم المُدخل لأجل أساليب تظليل القطع."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "'%s' مَعلم المُدخل لأسلوب تظليل الإضاءة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
+msgstr "'%s' مَعلم المُدخل لأجل تظليل الرأس vertex."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
+msgstr "'%s' مَعلم المُدخل لأجل أساليب تظليل الرأس والقِطع."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "تكبير المحدد"
+msgstr "وظيفة الكمية القياسية Scalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar operator."
-msgstr ""
+msgstr "مُشغل الكمية القياسية Scalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
msgstr ""
+"الثابت E وتعادل قيمته (2.718282)، وهو يمثل الأساس في اللوغاريتم الطبيعي."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
+msgstr "ثابت إيبسلون (0.00001)، أصغر الأعداد على الإطلاق."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
+msgstr "ثابت فاي (1.618034)، ويمثل النسبة الذهبية ذاتها."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
+msgstr "ثابت باي/4 (0.785398) أو 45 درجة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
+msgstr "ثابت باي/2 (1.570796) أو 90 درجة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
+msgstr "ثابت باي (3.141593) أو 180 درجة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
+msgstr "ثابت تاو Tau وقيمته (6.283185) أو 360 درجة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "ثابت جذر-العدد2 (1.414214)، أي قيمة جذر العدد 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr ""
+msgstr "يُرجع القيمة المطلقة لقيمة المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة جيب التمام للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة جيب تمام القطع الزائد العكسي للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة الجيب العكسية للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة جيب القطع الزائد العكسي للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة ظل الزاوية العكسية للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr ""
+msgstr "يُرجع قيمة ظل الزاوية العكسي للمَعالم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
msgstr ""
+"يُرجع قيمة ظل الزاوية العكسي (قطع زائد) \"inverse hyperbolic tangent\" للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr ""
+msgstr "يجد أقرب رقم أكبر أو يساوي المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
-msgstr ""
+msgstr "يُجبر قيمة على التوضع بين قيميتن إضافيتين."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "يُرجع جيب التمام \"cosine \" لقيمة المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة جيب التمام الزائدي \"hyperbolic cosine\" لقيمة المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "يحوّل قيمة (كمية) من الراديان إلى الدرجات."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
-msgstr ""
+msgstr "الدالة الأسية Base-e."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 Exponential."
-msgstr ""
+msgstr "الدالة الأسية Base-2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
+msgstr "يجد أقرب رقم أصغر أو يساوي المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "يحسب الجزء الكسري من المعامل."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "يُرجع عكس قيمة الجذر التربيعي للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
-msgstr ""
+msgstr "اللوغاريتم الطبيعي."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "اللوغاريتم Base-2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "يُرجع القيمة الكُبرى بين القيمتين."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "يُرجع القيمة الأصغر بين القيمتين."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "استيفاء (استقراء داخلي interpolation ) خطي بين كميتين قياسيتين scalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr ""
+msgstr "يُرجع القيمة المعاكسة للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
-msgstr ""
+msgstr "1.0 - الكمية القياسية"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the value of the first parameter raised to the power of the second."
-msgstr ""
+msgstr "يُرجع قيمة المَعلم الأول مرفوعاً إلى قوّة الثاني."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "يحول الكمية المقاسة بالدرجات إلى الراديان (الدائري)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
-msgstr ""
+msgstr "1.0 \\ الكمية القياسية"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "يوجد الرقم الأقرب للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "يجد العدد الزوجي الأقرب لقيمة المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "يُمخلب (يحصر) القيمة بين 0.0 و 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
-msgstr ""
+msgstr "يستخرج إشارة المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr ""
+msgstr "يُرجع جيب المَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة الجيب العكس للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة الجذر التربيعي للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9277,6 +9022,12 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"الوظيفة البرمجية \"الخطوة الناعمة\" SmoothStep وهي function( scalar(edge0), "
+"scalar(edge1), scalar(x) ).\n"
+"\n"
+"تُرجع 0.0 إذا كان 'x' أصغر من 'edge0' و 1.0 إذا كان x أكبر من 'edge1'. عدا "
+"ذلك سيتم استيفاء (استقراء داخلي interpolated) للقيمة ما بين 0.0 و 1.0 "
+"باستخدام متعددات الحدود لهيرمت Hermite polynomials."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9284,72 +9035,74 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"الوظيفة البرمجية \"الخطوة\" function( scalar(edge), scalar(x) ).\n"
+"\n"
+"تُرجع 0.0 إذا كان 'x' أصغر من 'edge' وعدا ذلك 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة ظل الزاوية للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "يُرجع قيمة ظل الزاوية العكسي للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
-msgstr ""
+msgstr "يجد قيمة الاقتطاع للمَعلم."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
-msgstr ""
+msgstr "إضافة كمية قياسية إلى كمية قياسية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "تقسيم كمية قياسية على كمية قياسية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "الضرب الرياضي لكمية قياسية بكمية قياسية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr ""
+msgstr "يُرجع باقي الكميتين القياسيتين."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
-msgstr ""
+msgstr "طرح كمية قياسية من كمية قياسية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar constant."
-msgstr ""
+msgstr "ثابت الكمية القياسية Scalar constant."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "تحويل تغيير التحريك"
+msgstr "الكمية القياسية المُوحدة Scalar uniform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
-msgstr ""
+msgstr "إجراء البحث عن النقش المكعبي."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr ""
+msgstr "إجراء البحث عن النقش."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Cubic texture uniform lookup."
-msgstr ""
+msgstr "البحث عن النقش المكعبي الموحد."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "2D texture uniform lookup."
-msgstr ""
+msgstr "البحث عن النقش الموحد ثنائي البُعد."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "2D texture uniform lookup with triplanar."
msgstr ""
+"البحث عن النقش ثنائي البُعد الموحد باستخدام الإسقاط ثلاثي المستويات triplanar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "إنشاء بولي"
+msgstr "وظيفة التحويل."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9361,73 +9114,77 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
+"يحسب الجداء السلمي لزوج من المُتجهات (الأشعة). \n"
+"\n"
+"يعامل OuterProduct (الجداء السلمي) المعامل الأول 'c' كمتجه عمودي (مصفوفة "
+"بعمود واحد) بينما يعامل المعامل الثاني 'r' كمُتجه أفقي (مصفوفة بصف واحد) حيث "
+"يقوم بالجداء الجبري الخطي للمصفوفتين بضرب 'c * r'، الأمر الذي ينتج عنه "
+"مصفوفة عدد صفوفها يساوي عدد مكونات 'c' وعدد الأعمدة فيها يكون عدد المكونات "
+"في 'r'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr ""
+msgstr "تأليف التحوّل من أربع مُتجهات vectors."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
-msgstr ""
+msgstr "فكّ التحوّل إلى أربع مُتجهات vectors."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr ""
+msgstr "حساب مُحدد determinant التحوّل."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "حساب عكس التحوّل."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr ""
+msgstr "حساب تبدل موضع التحوّل."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr ""
+msgstr "مضاعفة التحوّلات بالتحوّل."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr ""
+msgstr "مُضاعفة المُتجهات بالتحوّل."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "إنشاء بولي"
+msgstr "ثابت التحوّل."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "إنشاء بولي"
+msgstr "مُوحد التحوّل Transform uniform."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "التعيين لتعمل."
+msgstr "وظيفة المُتجه Vector ."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector operator."
-msgstr ""
+msgstr "مُشغّل المُتجه."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "تأليف المُتجه من ثلاث كميات قياسية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "فكّ تركيب المُتجه إلى ثلاث كميات قياسية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "حساب حاصل الضرب الاتجاهي لمتجهين."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "يُرجع المسافة ما بين نقطتين."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "حساب الجداء السلمي dot product للمُتجهين (الشعاعين)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9436,40 +9193,49 @@ msgid ""
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
+"يُرجع المُتجه (الشعاع) الذي يشير إلى ذات اتجاه المُتجه المرجعي. ولدى هذه "
+"الوظيفة البرمجية ثلاث مَعالم كمتجهات: N، المُتجه الموجه، I، المُتجه المُسقط "
+"وأخيراً Nref الذي يمثل المُوجه المرجعي. إذا كان الجداء السُلمي dot product لكل "
+"من I وNref أصغر من الصفر فإن القيمة المُرجعة وقتها ستكون N. عدا ذلك سيتم "
+"إرجاع -N."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "حساب طول المُتجه (الشعاع)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "الاستيفاء (الاستقراء الداخلي interpolation ) بين مُتجهين."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors using scalar."
msgstr ""
+"الاستيفاء (الاستقراء الداخلي interpolation) بين مُتجهين باستخدام الكمية "
+"القياسية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
-msgstr ""
+msgstr "يحسب قيمة المُتجه (الشعاع) نسبة للواحد normalize product."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - vector"
-msgstr ""
+msgstr "1.0 - مُتجه (شعاع)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / vector"
-msgstr ""
+msgstr "1.0 \\ المُتجه (الشعاع)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
+"يُرجع المُتجه الذي يشير إلى باتجاه الانعكاس (أ: المُتجه (الشعاع) المُسقَط، ب: "
+"المُتجه (الشعاع) الطبيعي)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
+msgstr "يُرجع المُتجه (الشعاع) الذي يشير باتجاه الانكسار."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9479,6 +9245,11 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
+"\n"
+"تُرجع قيمة 0.0 إذا كان 'x' أصغر من 'edge0' و 1.0 إذا كان 'x' أكبر من 'edge1'. "
+"بخلاف ذلك القيمة المُرجعة سيتم استيفاؤها (استقراء داخلي) بين 0.0 و1.0 "
+"باستخدام متعددات الحدود لهيرمت Hermite polynomials."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9488,6 +9259,11 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
+"\n"
+"تُرجع قيمة 0.0 إذا كان 'x' أصغر من 'edge0' و 1.0 إذا كان 'x' أكبر من 'edge1'. "
+"بخلاف ذلك القيمة المُرجعة سيتم استيفاؤها (استقراء داخلي) بين 0.0 و1.0 "
+"باستخدام متعددات الحدود لهيرمت Hermite polynomials."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9495,6 +9271,9 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( vector(edge), vector(x) ).\n"
+"\n"
+"يُرجع القيمة 0.0 إذا كان 'x' أصغر من 'edge' وعدا ذلك ستُرجع القيمة 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9502,35 +9281,37 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( scalar(edge), vector(x) ).\n"
+"\n"
+"يُرجع القيمة 0.0 إذا كان 'x' أصغر من 'edge' وعدا ذلك ستُرجع القيمة 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr ""
+msgstr "إضافة مُتجه (شعاع) إلى مُتجه (شعاع)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "يُقسّم المُتجه (الشعاع) على المُتجه."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "جداء (مضاعفة) مُتجه بمُتجه."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr ""
+msgstr "يُرجع باقي قسمة كل من المُتجهين (الشعاعين)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
-msgstr ""
+msgstr "طرح مُتجه (شعاع) من مُتجه."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
-msgstr ""
+msgstr "ثابت المُتجه."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector uniform."
-msgstr "التعين للإنتظام."
+msgstr "مُتجهات موحدة."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9538,12 +9319,18 @@ msgid ""
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
+"تعبير إصلاحي (لغوي) خاص بمُظلل غودوت، بواسطة كمية مُخصصة من منافذ المُدخلات "
+"والمُخرجات. إنه إقحام مباشر للنص البرمجي ضمن الوظائف الخاصة بالقمة vertex/ "
+"بالجزء fragment/ بالضوء light ، لذا لا تستخدمها لكي تكتب تعريف وتوضيح "
+"الوظيفة البرمجية داخلها."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
+"يُرجع الإسقاط المبني على الجداء السُلمي لكل من السطح الطبيعي وتوجيه الكاميرا "
+"(يمرر المُدخلات المرتبطة بها)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9552,90 +9339,107 @@ msgid ""
"it later in the Expressions. You can also declare varyings, uniforms and "
"constants."
msgstr ""
+"تعبير (إصطلاحي) لغوي خاص بمُظلل غودوت، والذي يكون أعلى المُظلل الناتج. يمكنك "
+"أن تضع تعريفات وظيفية برمجية مختلفة ضمنه واستدعاءها لاحقاً في التعابير عنها. "
+"كما يمكنك أيضاً أن تُصرّح (تعرّف) عن المتحولات، الموحدات (uniforms)، وكذلك "
+"الثوابت."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) وظيفية برمجية اشتقاقية للكمية القياسية "
+"Scalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Vector derivative function."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) وظيفية برمجية اشتقاقية للمُتجه (الشعاع)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) (مُتجه) مُشتق في 'x' باستخدام الاختلافات "
+"المحلية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) (كمية قياسية Scalar) مُشتقة في 'x' باستخدام "
+"الاختلافات المحلية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) (مُتجه) مُشتق في 'y' باستخدام الاختلافات "
+"المحلية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) (كمية قياسية Scalar) مُشتقة في 'y' باستخدام "
+"الاختلافات المحلية."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) (مُتجه)مجموع الاشتقاق المُطلق في 'x' و 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(فقط وضع القِطع Fragment/ الضوء) (كمية قياسية Scalar) مُشتق مُطلق في 'x' و'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
-msgstr ""
+msgstr "المُظلل البصري"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "تعديل المصافي"
+msgstr "تحرير الخاصية البصرية"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Mode Changed"
-msgstr ""
+msgstr "تغيير وضع المُظلل البصري"
#: editor/project_export.cpp
msgid "Runnable"
-msgstr ""
+msgstr "قابل للتشغيل"
#: editor/project_export.cpp
-#, fuzzy
msgid "Add initial export..."
-msgstr "أضف مدخله"
+msgstr "إضافة تصدير مبدئي..."
#: editor/project_export.cpp
msgid "Add previous patches..."
-msgstr ""
+msgstr "إضافة الرُقع السابقة..."
#: editor/project_export.cpp
msgid "Delete patch '%s' from list?"
-msgstr ""
+msgstr "حذف رُقعة '%s' من القائمة؟"
#: editor/project_export.cpp
msgid "Delete preset '%s'?"
-msgstr ""
+msgstr "حذف المُعد مُسبقاً '%s'؟"
#: editor/project_export.cpp
msgid ""
"Failed to export the project for platform '%s'.\n"
"Export templates seem to be missing or invalid."
msgstr ""
+"أخفق تصدير المشروع لمنصة '%s'.\n"
+"على ما يبدو قوالب التصدير مفقودة أو غير صالحة."
#: editor/project_export.cpp
msgid ""
@@ -9643,165 +9447,165 @@ msgid ""
"This might be due to a configuration issue in the export preset or your "
"export settings."
msgstr ""
+"أخفق تصدير المشروع لمنصة '%s'.\n"
+"قد يعود ذلك إلى خلل تهيئة في الإعدادات المُعدّة سلفاً أو إعدادات التصدير الخاصة "
+"بك."
#: editor/project_export.cpp
msgid "Release"
-msgstr ""
+msgstr "الإصدار"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "التصدير كـ %s"
+msgstr "تصدير الكُل"
#: editor/project_export.cpp
-#, fuzzy
msgid "The given export path doesn't exist:"
-msgstr "هذا المسار غير موجود."
+msgstr "مسار التصدير المُزود غير موجود:"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
-msgstr ""
+msgstr "قوالب تصدير هذه المنصة مفقودة / تالفة:"
#: editor/project_export.cpp
msgid "Presets"
-msgstr ""
+msgstr "مُعد سلفاً"
#: editor/project_export.cpp editor/project_settings_editor.cpp
msgid "Add..."
-msgstr ""
+msgstr "إضافة..."
#: editor/project_export.cpp
msgid ""
"If checked, the preset will be available for use in one-click deploy.\n"
"Only one preset per platform may be marked as runnable."
msgstr ""
+"إن تم تحدديها، ستتم إتاحة المُعدّة سلفاً لتكون جاهزة للنشر deploy بضغط واحدة.\n"
+"فقط واحدة من المُعدّة سلفاً preset لكل منصة ستوسم على أنها قابلة للتشغيل."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path"
-msgstr "تصدير المشروع"
+msgstr "مسار التصدير"
#: editor/project_export.cpp
msgid "Resources"
-msgstr ""
+msgstr "الموراد"
#: editor/project_export.cpp
msgid "Export all resources in the project"
-msgstr ""
+msgstr "تصدير جميع الموارد في المشروع"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
-msgstr ""
+msgstr "تصدير المشاهد المُختارة (وتبعاتها)"
#: editor/project_export.cpp
msgid "Export selected resources (and dependencies)"
-msgstr ""
+msgstr "تصدير الموارد المُختارة (وتبعياتها)"
#: editor/project_export.cpp
msgid "Export Mode:"
-msgstr ""
+msgstr "وضع التصدير:"
#: editor/project_export.cpp
msgid "Resources to export:"
-msgstr ""
+msgstr "الموارد المُعدّة للتصدير:"
#: editor/project_export.cpp
msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
+"مُرشحات Filters تصدير الملفات / المجلدات من غير الموارد\n"
+"(تلك المفصولة بالفاصلة، على سبيل المثال: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
+"مُرشحات Filters تصدير الملفات/المُجلدات من المشروع\n"
+"(المفصولة بفاصلة، مثلاً: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
-msgstr ""
+msgstr "الرُقع Patches"
#: editor/project_export.cpp
msgid "Make Patch"
-msgstr ""
+msgstr "إنشاء رُقعة Patch"
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " ملفات"
+msgstr "ملف الحِزمة"
#: editor/project_export.cpp
msgid "Features"
-msgstr ""
+msgstr "المزايا"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
-msgstr ""
+msgstr "مُخصص (مفصول بفاصلة):"
#: editor/project_export.cpp
msgid "Feature List:"
-msgstr ""
+msgstr "قائمة المزايا:"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script"
-msgstr "تشغيل الكود"
+msgstr "النص البرمجي"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script Export Mode:"
-msgstr "تصدير المشروع"
+msgstr "وضع تصدير النص البرمجي:"
#: editor/project_export.cpp
msgid "Text"
-msgstr ""
+msgstr "نص"
#: editor/project_export.cpp
msgid "Compiled"
-msgstr ""
+msgstr "مُحولة برمجياً"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
-msgstr ""
+msgstr "مشفّرة (قدّم المفتاح أدناه)"
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr ""
+msgstr "مفتاح تشفير غير صالح (ينبغي أن يكون طوله 46 حرف)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
-msgstr ""
+msgstr "مفتاح تشفير النص البرمجي (256-bits ك hex ):"
#: editor/project_export.cpp
msgid "Export PCK/Zip"
-msgstr ""
+msgstr "تصدير PCK/ ملف مضغوط Zip"
#: editor/project_export.cpp
msgid "Export Project"
msgstr "تصدير المشروع"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "تصدير المشروع"
+msgstr "وضع التصدير؟"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "تصدير"
+msgstr "تصدير الكُل"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " ملفات"
+msgstr "الملف المضغوط ZIP File"
#: editor/project_export.cpp
msgid "Godot Game Pack"
-msgstr ""
+msgstr "رُزمة لعبة غودوت"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
-msgstr ""
+msgstr "قوالب التصدير لهذه المنصة مفقودة:"
#: editor/project_export.cpp
msgid "Manage Export Templates"
@@ -9809,40 +9613,44 @@ msgstr "إدارة قوالب التصدير"
#: editor/project_export.cpp
msgid "Export With Debug"
-msgstr ""
+msgstr "التصدير مع مُنقح الأخطاء"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "هذا المسار غير موجود."
+msgid "The path specified doesn't exist."
+msgstr "المسار المُحدد غير موجود."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr ""
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "حدث خطأ عندفتح ملف الحزمة بسبب أن الملف ليس في صيغة \"ZIP\"."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "ملف المشروع \".zip\" غير صالح؛ لا يحوي ملف \"project.godot\"."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
-msgstr ""
+msgstr "من فضلك اختر مُجلداً فارغاً."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr ""
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "من فضلك اختر ملف \"project.godot\" أو \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr ""
+msgid "This directory already contains a Godot project."
+msgstr "الدليل المُختار يتضمن بالفعل مشروعاً لغودوت."
#: editor/project_manager.cpp
msgid "New Game Project"
-msgstr ""
+msgstr "مشروع لعبة جديد"
#: editor/project_manager.cpp
msgid "Imported Project"
-msgstr ""
+msgstr "المشاريع المستوردة"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "اسم غير صالح."
+msgstr "اسم مشروع غير صالح."
#: editor/project_manager.cpp
msgid "Couldn't create folder."
@@ -9850,37 +9658,38 @@ msgstr "لا يمكن إنشاء المجلد."
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
-msgstr ""
+msgstr "يوجد ملف بالفعل بالمسار المُختار بذات الاسم المُختار."
#: editor/project_manager.cpp
msgid "It would be a good idea to name your project."
-msgstr ""
+msgstr "إنها لفكرة جيدة أن تقوم بتسمية مشروعك."
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr ""
+msgstr "مسار مشروع غير صالح (أعدلت شيء؟)."
#: editor/project_manager.cpp
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
+"لم يتم تحميل project.godot من مسار المشروع (خطأ %d). قد يكون مفقوداً أو تالفاً."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
-msgstr ""
+msgstr "لا قدرة على تحرير project.godot في مسار المشروع."
#: editor/project_manager.cpp
msgid "Couldn't create project.godot in project path."
-msgstr ""
+msgstr "لا قدرة على إنشاء project.godot في مسار المشروع."
#: editor/project_manager.cpp
msgid "Rename Project"
-msgstr ""
+msgstr "إعادة تسمية المشروع"
#: editor/project_manager.cpp
msgid "Import Existing Project"
-msgstr ""
+msgstr "استيراد مشروع موجود"
#: editor/project_manager.cpp
msgid "Import & Edit"
@@ -9888,7 +9697,7 @@ msgstr "إستيراد و تعديل"
#: editor/project_manager.cpp
msgid "Create New Project"
-msgstr ""
+msgstr "إنشاء مشروع جديد"
#: editor/project_manager.cpp
msgid "Create & Edit"
@@ -9896,7 +9705,7 @@ msgstr "إنشاء و تعديل"
#: editor/project_manager.cpp
msgid "Install Project:"
-msgstr ""
+msgstr "تنصيب المشروع:"
#: editor/project_manager.cpp
msgid "Install & Edit"
@@ -9904,23 +9713,23 @@ msgstr "تثبيت و تعديل"
#: editor/project_manager.cpp
msgid "Project Name:"
-msgstr ""
+msgstr "اسم المشروع:"
#: editor/project_manager.cpp
msgid "Project Path:"
-msgstr ""
+msgstr "مسار المشروع:"
#: editor/project_manager.cpp
msgid "Project Installation Path:"
-msgstr ""
+msgstr "مسار تنصيب المشروع:"
#: editor/project_manager.cpp
msgid "Renderer:"
-msgstr ""
+msgstr "مُحرك الإخراج البصري:"
#: editor/project_manager.cpp
msgid "OpenGL ES 3.0"
-msgstr ""
+msgstr "OpenGL ES 3.0"
#: editor/project_manager.cpp
msgid ""
@@ -9929,10 +9738,14 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"جودة بصرية أعلى\n"
+"جميع الميزات المتاحة\n"
+"غير متوافق مع الأجهزة القديمة\n"
+"لا ينصح به لألعاب الويب"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
-msgstr ""
+msgstr "OpenGL ES 2.0"
#: editor/project_manager.cpp
msgid ""
@@ -9941,32 +9754,34 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"جودة بصرية أقل\n"
+"بعض الميزات غير متوفرة \n"
+"يعمل على معظم الأجهزة\n"
+"يوصى به لألعاب الويب"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
+msgstr "يمكن تعديل جهاز العرض لاحقاً، ولكن قد تحتاج المشاهد إلى تعديل."
#: editor/project_manager.cpp
msgid "Unnamed Project"
-msgstr ""
+msgstr "مشروع غير مسمى"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "بناء المشروع"
+msgstr "مشروع مفقود"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr ""
+msgstr "خطأ: المشروع مفقود في نظام الملفات."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't open project at '%s'."
-msgstr "لا يمكن فتح المشروع"
+msgstr "لا يمكن فتح المشروع في '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
-msgstr ""
+msgstr "هل أنت واثق من فتح أكثر من مشروع؟"
#: editor/project_manager.cpp
msgid ""
@@ -9980,6 +9795,14 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"إن ملف إعدادت المشروع المرفق لا يُحدد نسخة غودوت التي تم بناؤه بها. \n"
+"\n"
+"%s\n"
+"\n"
+"إن أصريت على فتحه، سيتم تحويله لبنية ملف التهيئة (التكوين) الحالي الخاص "
+"بغودوت. \n"
+"تحذير: لن تعد قادارً على فتح المشروع باستخدام النُسخ السابقة من المُحرك بعد "
+"الآن."
#: editor/project_manager.cpp
msgid ""
@@ -9992,337 +9815,369 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"إن ملف إعدادات المشروع المرفق كان قد تم إنشاؤه باستخدام إصدار أقدم من "
+"المحرك، لذا إنه بحاجة لتحويله إلى النسخة الحالية:\n"
+"\n"
+"%s\n"
+"\n"
+"هل ترغب في تحويله؟\n"
+"تحذير: لن تعد قادراً على فتح المشروع بالنُسخ السابقة من المُحرك بعد الآن."
#: editor/project_manager.cpp
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
+"لقد تم إنشاء إعدادات المشروع هذا بإصدار أحدث من المُحرك، تلك الإعدادات غير "
+"متوافقة مع هذا الإصدار."
#: editor/project_manager.cpp
-#, fuzzy
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"
-"يمكنك تغييره لاحقاً في \"إعدادات المشروع\" تحت قسم 'التطبيق'."
+"لا يمكن تشغيل المشروع: لم يتم تحديد مشهد رئيس.\n"
+"من فضلك حرر المشروع وحدد مشهداً رئيساً في إعدادات المشروع تحت خيار \"التطبيق\"."
#: editor/project_manager.cpp
msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
+"لا يمكن تشغيل المشروع: يجب استيراد المُلحقات.\n"
+"من فضلك حرر المشروع لتحريض الشروع بالاستيراد."
#: editor/project_manager.cpp
msgid "Are you sure to run %d projects at once?"
-msgstr ""
+msgstr "هل أنت متأكد من فتح %d مشاريع مرّة واحدة؟"
#: editor/project_manager.cpp
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
+"إزالة %d مشاريع من القائمة؟\n"
+"لن يتم تعديل محتويات مُجلدات المشاريع."
#: editor/project_manager.cpp
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
msgstr ""
+"إزالة هذا المشروع من القائمة؟\n"
+"لن يتم تعديل محتوى مُجلد المشروع."
#: editor/project_manager.cpp
msgid ""
"Remove all missing projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
+"إزالة جميع المشاريع المفقودة من القائمة؟\n"
+"لن يتم تعديل محتوى مُجلدات المشاريع."
#: editor/project_manager.cpp
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
+"تم تغيير اللُغة.\n"
+"ستتحدث الواجهة بعد إعادة تشغيل المُحرر أو مُدير المشاريع."
#: editor/project_manager.cpp
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
+"هل أنت متأكد من فحص %s من المجلدات بحثاً عن مشاريع غودوت متوافرة؟\n"
+"قد يستغرق وقتاً."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "مدير المشروع"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
-msgstr "مشروع"
+msgstr "المشاريع"
#: editor/project_manager.cpp
msgid "Last Modified"
-msgstr ""
+msgstr "آخر ما تم تعديله"
#: editor/project_manager.cpp
msgid "Scan"
-msgstr ""
+msgstr "فحص"
#: editor/project_manager.cpp
msgid "Select a Folder to Scan"
-msgstr ""
+msgstr "اختر مُجلداً لفحصه"
#: editor/project_manager.cpp
msgid "New Project"
-msgstr ""
+msgstr "مشروع جديد"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "مسح النقطة"
+msgstr "إزالة المفقود"
#: editor/project_manager.cpp
msgid "Templates"
-msgstr ""
+msgstr "القوالب"
#: editor/project_manager.cpp
msgid "Restart Now"
-msgstr ""
+msgstr "إعادة التشغيل الآن"
#: editor/project_manager.cpp
msgid "Can't run project"
-msgstr ""
+msgstr "غير قادر على تشغيل المشروع"
#: editor/project_manager.cpp
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+"لا تملك حالياً أية مشاريع.\n"
+"هل ترغب في استكشاف مشاريع الأمثلة الرسمية في مكتبة المُلحقات؟"
+
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"صندوق البحث يُرشح (يُغربل) المشاريع وفقاً للاسم و مكون المسار الأخير.\n"
+"لتشريح (غربلة) المشاريع باستخدام الاسم والمسار الكامل، يجب أن تحتوي المبحوث "
+"عنه query على الأقل حرف `/` واحد."
#: editor/project_settings_editor.cpp
msgid "Key "
-msgstr ""
+msgstr "زر "
#: editor/project_settings_editor.cpp
msgid "Joy Button"
-msgstr ""
+msgstr "زر Joy"
#: editor/project_settings_editor.cpp
msgid "Joy Axis"
-msgstr ""
+msgstr "محور Joy"
#: editor/project_settings_editor.cpp
msgid "Mouse Button"
-msgstr ""
+msgstr "زر الفأرة"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
+"اسم فعالية غير صحيح. لا يمكن أن يكون فارغاً أو يتضمن '/'، ':'، '='، '\\' أو "
+"'\"'"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "خطأ: إسم الحركة موجود بالفعل!"
+msgstr "فعالية action بهذا الاسم '%s' موجودة سلفاً."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
-msgstr ""
+msgstr "إعادة تسمية حدث فعالية الإدخال"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "تغيير إسم الحركة:"
+msgstr "تغيير المنطقة الميتة للفعالية Action deadzone"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
-msgstr ""
+msgstr "إضافة حدث فعالية الإدخال"
#: editor/project_settings_editor.cpp
msgid "All Devices"
-msgstr ""
+msgstr "جميع الأجهزة"
#: editor/project_settings_editor.cpp
msgid "Device"
-msgstr ""
+msgstr "الجهاز"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Press a Key..."
-msgstr ""
+msgstr "اضغط زراً..."
#: editor/project_settings_editor.cpp
msgid "Mouse Button Index:"
-msgstr ""
+msgstr "مؤشر Index زر الفأرة:"
#: editor/project_settings_editor.cpp
msgid "Left Button"
-msgstr ""
+msgstr "الزر الأيسر"
#: editor/project_settings_editor.cpp
msgid "Right Button"
-msgstr ""
+msgstr "الزر الأيمن"
#: editor/project_settings_editor.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "الزر الأوسط"
#: editor/project_settings_editor.cpp
msgid "Wheel Up Button"
-msgstr ""
+msgstr "زر العجلة للأعلى"
#: editor/project_settings_editor.cpp
msgid "Wheel Down Button"
-msgstr ""
+msgstr "زر العجلة للأسفل"
#: editor/project_settings_editor.cpp
msgid "Wheel Left Button"
-msgstr ""
+msgstr "زر العجلة يساراً"
#: editor/project_settings_editor.cpp
msgid "Wheel Right Button"
-msgstr ""
+msgstr "زر العجلة يميناً"
#: editor/project_settings_editor.cpp
msgid "X Button 1"
-msgstr ""
+msgstr "زر X 1"
#: editor/project_settings_editor.cpp
msgid "X Button 2"
-msgstr ""
+msgstr "زر X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
-msgstr ""
+msgstr "مؤشر محور القبضة Joypad :"
#: editor/project_settings_editor.cpp
msgid "Axis"
-msgstr ""
+msgstr "محاور"
#: editor/project_settings_editor.cpp
msgid "Joypad Button Index:"
-msgstr ""
+msgstr "مؤشر زر القبضة Joypad:"
#: editor/project_settings_editor.cpp
msgid "Erase Input Action"
-msgstr ""
+msgstr "مسح إجراء الإدخال"
#: editor/project_settings_editor.cpp
msgid "Erase Input Action Event"
-msgstr ""
+msgstr "مسح حدث إجراء الإضافة"
#: editor/project_settings_editor.cpp
msgid "Add Event"
-msgstr ""
+msgstr "إضافة حَدث"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr ""
+msgstr "زر"
#: editor/project_settings_editor.cpp
msgid "Left Button."
-msgstr ""
+msgstr "الزر الأيسر."
#: editor/project_settings_editor.cpp
msgid "Right Button."
-msgstr ""
+msgstr "الزر الأيمن."
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr ""
+msgstr "الزر الأوسط."
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
-msgstr ""
+msgstr "العجلة نحو الأقصى."
#: editor/project_settings_editor.cpp
msgid "Wheel Down."
-msgstr ""
+msgstr "العجلة نحو الأدنى."
#: editor/project_settings_editor.cpp
msgid "Add Global Property"
-msgstr ""
+msgstr "إضافة خاصية شمولية"
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
-msgstr ""
+msgstr "اختر عنصر إعدادات بدايةً!"
#: editor/project_settings_editor.cpp
msgid "No property '%s' exists."
-msgstr ""
+msgstr "لا خاصية '%s' موجودة."
#: editor/project_settings_editor.cpp
msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr ""
+msgstr "الإعداد '%s' ضمني، ولا يمكن حذفه."
#: editor/project_settings_editor.cpp
msgid "Delete Item"
-msgstr ""
+msgstr "حذف العُنصر"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
+"اسم إجراء غير صالح. لا يجوز أن يكون الاسم فارغاً أو متضمناً '/'، ':'،'='، '\\' "
+"أو'\"'."
#: editor/project_settings_editor.cpp
msgid "Add Input Action"
-msgstr ""
+msgstr "إضافة إجراء إدخال"
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
-msgstr ""
+msgstr "خطأ في حفظ الإعدادات."
#: editor/project_settings_editor.cpp
msgid "Settings saved OK."
-msgstr ""
+msgstr "تيسّر حفظ الإعدادات."
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Moved Input Action Event"
-msgstr "حرك النقطة داخل المنحنى"
+msgstr "حدث إجراء إدخال الذي تم نقله"
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
-msgstr ""
+msgstr "التجاوز للميزة"
#: editor/project_settings_editor.cpp
msgid "Add Translation"
-msgstr ""
+msgstr "إضافة ترجمة"
#: editor/project_settings_editor.cpp
msgid "Remove Translation"
-msgstr ""
+msgstr "إزالة الترجمة"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
-msgstr ""
+msgstr "إضافة مسار مُعاد تعيينه Remapped"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr ""
+msgstr "مورد إعادة رسم الخريطة يُضيف إعادة رسم خريطة"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
-msgstr ""
+msgstr "تغيير لغة مورد إعادة تعيين الخريطة"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap"
-msgstr ""
+msgstr "إزالة مورد إعادة تعيين الخريطة"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap Option"
-msgstr ""
+msgstr "إزالة إعداد مورد إعادة تعيين الخريطة"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter"
-msgstr ""
+msgstr "مُرشح محلي مُعدّل"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter Mode"
-msgstr ""
+msgstr "وضع المُرشح (المُغربل) المحلي المُعدّل"
#: editor/project_settings_editor.cpp
msgid "Project Settings (project.godot)"
-msgstr ""
+msgstr "إعدادات المشروع (project.godot)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
@@ -10330,89 +10185,87 @@ msgstr "بشكل عام"
#: editor/project_settings_editor.cpp
msgid "Override For..."
-msgstr ""
+msgstr "تجاوز لأجل..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
-msgstr ""
+msgstr "لكي يظهر تأثير التغييرات ينبغي إعادة تشغيل المُحرر."
#: editor/project_settings_editor.cpp
msgid "Input Map"
-msgstr ""
+msgstr "خريطة الإدخال"
#: editor/project_settings_editor.cpp
msgid "Action:"
-msgstr ""
+msgstr "إجراء:"
#: editor/project_settings_editor.cpp
msgid "Action"
-msgstr "الفعل"
+msgstr "إجراء"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "الحيز الميّت"
#: editor/project_settings_editor.cpp
msgid "Device:"
-msgstr ""
+msgstr "الجهاز:"
#: editor/project_settings_editor.cpp
msgid "Index:"
-msgstr ""
+msgstr "الفهرس:"
#: editor/project_settings_editor.cpp
msgid "Localization"
-msgstr ""
+msgstr "توطين"
#: editor/project_settings_editor.cpp
msgid "Translations"
-msgstr ""
+msgstr "الترجمات"
#: editor/project_settings_editor.cpp
msgid "Translations:"
-msgstr ""
+msgstr "الترجمات:"
#: editor/project_settings_editor.cpp
msgid "Remaps"
-msgstr ""
+msgstr "إعادة تعيين الخرائط"
#: editor/project_settings_editor.cpp
msgid "Resources:"
-msgstr ""
+msgstr "الموارد:"
#: editor/project_settings_editor.cpp
msgid "Remaps by Locale:"
-msgstr ""
+msgstr "إعادة تعيين الخرائط محلياً:"
#: editor/project_settings_editor.cpp
msgid "Locale"
-msgstr ""
+msgstr "محلي"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
-msgstr ""
+msgstr "مُرشح المحليّات Locales"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
-msgstr "إظهار العظام"
+msgstr "إظهار جميع المَحليّات Locales"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
-msgstr "المحدد فقط"
+msgstr "إظهار المَحليّات المُختارة فحسب"
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
-msgstr "وضع المُصفي:"
+msgstr "وضع المُرشح:"
#: editor/project_settings_editor.cpp
msgid "Locales:"
-msgstr ""
+msgstr "مَحليّات:"
#: editor/project_settings_editor.cpp
msgid "AutoLoad"
-msgstr ""
+msgstr "تحميل تلقائي"
#: editor/project_settings_editor.cpp
msgid "Plugins"
@@ -10424,384 +10277,399 @@ msgstr "إعداد مُسبق..."
#: editor/property_editor.cpp
msgid "Zero"
-msgstr ""
+msgstr "صفر"
#: editor/property_editor.cpp
msgid "Easing In-Out"
-msgstr ""
+msgstr "تسارع بعد بداية بطيئة"
#: editor/property_editor.cpp
msgid "Easing Out-In"
-msgstr ""
+msgstr "تباطؤ بعد بداية سريعة"
#: editor/property_editor.cpp
msgid "File..."
-msgstr ""
+msgstr "ملف..."
#: editor/property_editor.cpp
msgid "Dir..."
-msgstr ""
+msgstr "مسار..."
#: editor/property_editor.cpp
msgid "Assign"
-msgstr ""
+msgstr "ألحق"
#: editor/property_editor.cpp
msgid "Select Node"
-msgstr ""
+msgstr "اختر عُقدة"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
-msgstr ""
+msgstr "خطأ في تحميل الملف: ليس مورداً!"
#: editor/property_editor.cpp
msgid "Pick a Node"
-msgstr ""
+msgstr "اختر عُقدة"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
-msgstr ""
+msgstr "Bit %d، قيمة%d."
#: editor/property_selector.cpp
msgid "Select Property"
-msgstr ""
+msgstr "انتقاء الخاصية"
#: editor/property_selector.cpp
msgid "Select Virtual Method"
-msgstr "إختر طريقة إفتراضية"
+msgstr "اختر الطريقة الإفتراضية"
#: editor/property_selector.cpp
msgid "Select Method"
msgstr "إختر طريقة"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "إعادة التسمية"
+msgstr "إعادة تسمية الدفعة"
#: editor/rename_dialog.cpp
-msgid "Prefix"
-msgstr ""
+#, fuzzy
+msgid "Replace:"
+msgstr "إستبدال: "
#: editor/rename_dialog.cpp
-msgid "Suffix"
-msgstr ""
+#, fuzzy
+msgid "Prefix:"
+msgstr "بادئة"
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Suffix:"
+msgstr "لاحقة"
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "استخدام التعبيرات الاعتيادية Regular Expressions"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
-msgstr "إعدادات الكبس"
+msgstr "إعدادات مُتقدمة"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "استبدال"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "إسم العقدة:"
+msgstr "إسم العقدة"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "اسم العُقدة الأب، إن توافر"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "إسم العقدة:"
+msgstr "نوع العُقدة"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "لم يتم حفظ المشهد الحالي. إفتحه علي أية حال؟"
+msgstr "اسم المشهد الحالي"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "إعادة التسمية"
+msgstr "اسم العُقدة الرئيسة (الجذر)"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"عداد الأعداد الصحيحة التسلسلية.\n"
+"يقارن إعدادات العداد."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr ""
+msgid "Per-level Counter"
+msgstr "العداد وفق-المستوى"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
+msgstr "إذا تم تحديده فإن العداد سيعيد البدء لكل مجموعة من العُقد الأبناء"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "القيمة المبدئية للعداد"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "خطوة (ثانية):"
+msgstr "الخطوة"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "مقدار الزيادة للعداد لكل عُقدة"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "الحدود المُبطنة Padding"
#: editor/rename_dialog.cpp
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
+"أصغر عدد خانات للعداد.\n"
+"الخانات الناقصة ستعوض padded بأصفار قياسية."
#: editor/rename_dialog.cpp
msgid "Post-Process"
-msgstr ""
+msgstr "المعالجة-اللاحقة Post-Process"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr ""
+msgstr "احتفظ"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr ""
+msgid "PascalCase to snake_case"
+msgstr "حالة أحرف PascalCase إلى snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr ""
+msgid "snake_case to PascalCase"
+msgstr "حالة أحرف snake_case إلى PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "حالة"
#: editor/rename_dialog.cpp
msgid "To Lowercase"
-msgstr ""
+msgstr "لأحرف صغيرة Lowercase"
#: editor/rename_dialog.cpp
msgid "To Uppercase"
-msgstr ""
+msgstr "لأحرف كبيرة Uppercase"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "إرجاع التكبير"
+msgstr "إعادة تعيين"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "خطأ ذو علاقة بالتعبير الاعتيادي Regular Expression"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "عند الحرف %s"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
-msgstr ""
+msgstr "إعادة اختيار أبوة العُقدة"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
-msgstr ""
+msgstr "إعادة اختيار أبوة المكان (اختر أب جديد):"
#: editor/reparent_dialog.cpp
msgid "Keep Global Transform"
-msgstr ""
+msgstr "الاحتفاظ بالتحوّل الشمولي Global"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent"
-msgstr ""
+msgstr "إعادة اختيار الأبوة"
#: editor/run_settings_dialog.cpp
msgid "Run Mode:"
-msgstr ""
+msgstr "وضع التشغيل:"
#: editor/run_settings_dialog.cpp
msgid "Current Scene"
-msgstr ""
+msgstr "المشهد الحالي"
#: editor/run_settings_dialog.cpp
msgid "Main Scene"
-msgstr ""
+msgstr "المشهد الرئيس"
#: editor/run_settings_dialog.cpp
msgid "Main Scene Arguments:"
-msgstr ""
+msgstr "معاملات المشهد الرئيس:"
#: editor/run_settings_dialog.cpp
msgid "Scene Run Settings"
-msgstr ""
+msgstr "إعدادت تشغيل المشهد"
#: editor/scene_tree_dock.cpp
msgid "No parent to instance the scenes at."
-msgstr ""
+msgstr "لا أب لنمذجة المشاهد عنده."
#: editor/scene_tree_dock.cpp
msgid "Error loading scene from %s"
-msgstr ""
+msgstr "خطأ في تحميل المشهد من %s"
#: editor/scene_tree_dock.cpp
msgid ""
"Cannot instance the scene '%s' because the current scene exists within one "
"of its nodes."
-msgstr ""
+msgstr "لا يمكن نمذجة المشهد '%s' لأن المشهد الحالي مُتضَمن في واحد من عُقده."
#: editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
-msgstr ""
+msgstr "نمذجة المشهد(المشاهد)"
#: editor/scene_tree_dock.cpp
msgid "Replace with Branch Scene"
-msgstr ""
+msgstr "استبدال بمشهد فرعي"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
-msgstr ""
+msgstr "نمذجة المشهد الابن"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "إخلاء الكود"
+msgid "Detach Script"
+msgstr "فصل النص البرمجي"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
-msgstr ""
+msgstr "لا يمكن إجراء هذه العملية على جذر الشجرة."
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
-msgstr ""
+msgstr "نقل العُقدة عند الأب"
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr ""
+msgstr "تحريك العُقد عند الأب"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr ""
+msgstr "مضاعفة العُقدة(العُقد)"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
msgstr ""
+"لا يمكن إعادة اختيار أبوة العُقدة في المشاهد الموروثة، لا يمكن تغيير ترتيب "
+"العُقد."
#: editor/scene_tree_dock.cpp
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "لكي تصبح هذه العُقدة رئيسة (جذر) عليها أن تنتمي إلى المشهد المُحرر."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "لا يمكن أن تصبح المشاهد المنمذجة مشاهد رئيسة (جذر)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "حفظ المشهد"
+msgstr "جعل العقدة المشهد الرئيس"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "حذف العُقدة %d مع جميع أبنائها؟"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete %d nodes?"
-msgstr "إنشاء عقدة"
+msgstr "حذف العُقد %d؟"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
-msgstr ""
+msgstr "حذف العُقدة الرئيسة (الجذر) \"%s\"؟"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "حذف العُقدة \"%s\" مع جميع أبنائها؟"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "إنشاء عقدة"
+msgstr "حذف العقدة \"%s\"؟"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
-msgstr ""
+msgstr "لا يمكن التنفيذ مع العُقدة الرئيسة (الجذر)."
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
-msgstr ""
+msgstr "لا يمكن تنفيذ هذا الإجراء على المشاهد المُنمذجة."
#: editor/scene_tree_dock.cpp
msgid "Save New Scene As..."
-msgstr ""
+msgstr "احفظ المشهد الجديد كـ..."
#: editor/scene_tree_dock.cpp
msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"سيسبب تعطيل خاصية \"النمذجة_المُحررة\" \"editable_instance\" عودة قيم العُقد "
+"إلى القيم الافتراضية لها."
#: editor/scene_tree_dock.cpp
msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
+"سيسبب تمكين \"التحميل كعنصر نائب\" \"Load As Placeholder\" تعطيل \"ابن قابل "
+"للتحرير\" \"Editable Children\" والذي ينجم عنه عودة قيم جميع العُقد إلى قيمها "
+"الافتراضية."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "أنشئ عظام"
+msgstr "اجعله محلياً"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "حفظ المشهد"
+msgstr "مشهد رئيس (جذر) جديد"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "إنشاء عقدة"
+msgstr "إنشاء العُقدة الرئيسة (الجذر):"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "مشهد"
+msgstr "مشهد ثنائي البُعد"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "مشهد"
+msgstr "مشهد ثلاثي الأبعاد"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
-msgstr ""
+msgstr "واجهة المستخدم"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "إنشاء عقدة"
+msgstr "عقدة أخرى"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
-msgstr ""
+msgstr "لا يمكن تنفيذ الإجراء على عُقدة من مشهد أجنبي!"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
-msgstr ""
+msgstr "لا يمكن تنفيذ الإجراء على عُقد يرثها المشهد الحالي!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr ""
+msgstr "إلحاق نص برمجي"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
-msgstr ""
+msgstr "إزالة عُقدة (عُقد)"
#: editor/scene_tree_dock.cpp
msgid "Change type of node(s)"
-msgstr ""
+msgstr "تغيير نوع العُقدة(العُقد)"
#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
-msgstr ""
+msgstr "لم ينجح حفظ المشهد الجديد. غالباً لا يمكن إشباع التبعات (النماذج)."
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
-msgstr ""
+msgstr "خطأ في حفظ المشهد."
#: editor/scene_tree_dock.cpp
msgid "Error duplicating scene to save it."
-msgstr ""
+msgstr "خطأ في مضاعفة المشهد لحفظه."
#: editor/scene_tree_dock.cpp
msgid "Sub-Resources"
@@ -10809,78 +10677,84 @@ msgstr "مورد فرعي"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance"
-msgstr ""
+msgstr "مسح الميراث"
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
-msgstr ""
+msgstr "أبناء قابلين للتعديل"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
-msgstr ""
+msgstr "تحميله كعنصر نائب"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
-msgstr "فُتح مؤخراً"
+msgstr "فتح الوثائق"
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
msgstr ""
+"لا يمكن إرفاق نص برمجي: لا توجد لغات مسجلة.\n"
+"ربما يكون هذا بسبب أن المحرر تم إنشاؤه مع تعطيل جميع وحدات اللغة."
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "إضافة عُقدة ابن"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "طوي الكل"
+msgstr "توسيع / طي الكل"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
-msgstr ""
+msgstr "تغيير النوع"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "إنشاء %s جديد"
+msgstr "تعين لعقدة جديدة"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "حفظ المشهد"
+msgstr "جعل المشهد الرئيس"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
-msgstr ""
+msgstr "دمج من المشهد"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Save Branch as Scene"
-msgstr ""
+msgstr "حفظ الفرع كمشهد"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr ""
+msgstr "نسخ مسار العُقدة"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
-msgstr ""
+msgstr "حذف (دون تأكيد)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "إنشاء %s جديد"
+msgstr "إضافة/إنشاء عقدة جديدة."
#: editor/scene_tree_dock.cpp
msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
+"نمذجة ملف المشهد كعُقدة. إن لم يكن هناك عُقدة رئيسة (جذر) سيتم إنشاء مشهد "
+"موروث."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
+msgid "Attach a new or existing script to the selected node."
+msgstr "إلحاق نص برمجي موجود أو جديد للعُقدة المختارة."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+msgid "Detach the script from the selected node."
+msgstr "فصل النص البرمجي من العُقدة المختارة."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10888,225 +10762,231 @@ msgstr "عن بعد"
#: editor/scene_tree_dock.cpp
msgid "Local"
-msgstr ""
+msgstr "محلي"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance? (No Undo!)"
-msgstr ""
+msgstr "مسح الموروث؟ (لا تراجع!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "أظهر الملفات المخفية"
+msgstr "تشغيل/إطفاء الوضوحية"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "عقدة اللقطة الواحدة"
+msgstr "إلغاء تأمين العقدة"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Button Group"
-msgstr "إضافة إلي مجموعة"
+msgstr "مجموعة الأزرار"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "خطأ في الإتصال"
+msgstr "(الإتصال من)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
-msgstr ""
+msgstr "تحذير تهيئة العُقدة:"
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
+"تملك هذه العُقدة %s اتصال(ات) و %s مجموعة(مجموعات).\n"
+"اضغط لإظهار رصيف (ميناء) الإشارات."
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
+"تملك العُقدة %s اتصال(ات).\n"
+"اضغط لإظهار رصيف (ميناء) الإشارات."
#: editor/scene_tree_editor.cpp
msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
+"العُقدة ضمن %s مجموعة(مجموعات).\n"
+"اضغط لإظهار رصيف (ميناء) المجموعات."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "فتح الكود"
+msgstr "فتح النص البرمجي:"
#: editor/scene_tree_editor.cpp
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
+"إن العُقدة مقفولة. \n"
+"اضغط لفكّ القفل."
#: editor/scene_tree_editor.cpp
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
+"الابن غير قابل للاختيار.\n"
+"اضغط لجعله قابلاً للاختيار."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
-msgstr ""
+msgstr "تشغيل/إطفاء الوضوحية Visibility"
#: editor/scene_tree_editor.cpp
msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"تم تعليق مُشغل الرسومات المُتحركة.\n"
+"اضغط لإزالة تعليقه."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
-msgstr ""
+msgstr "اسم عُقدة غير صالح، إن الأحرف التالية غير مسموحة:"
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
-msgstr ""
+msgstr "إعادة تسمية العُقدة"
#: editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
-msgstr ""
+msgstr "شجرة المشهد (العُقد):"
#: editor/scene_tree_editor.cpp
msgid "Node Configuration Warning!"
-msgstr ""
+msgstr "تحذير تهيئة العُقدة!"
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
-msgstr ""
+msgstr "اختر عُقدة"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "الميش فارغ!"
+msgstr "المسار فارغ!."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "الميش فارغ!"
+msgstr "اسم الملف فارغ."
#: editor/script_create_dialog.cpp
msgid "Path is not local."
-msgstr ""
+msgstr "المسار ليس محلياً."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid base path."
msgstr "مسار غير صالح."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "ملف أو مجلد مع هذا الأسم موجود بالفعل."
+msgstr "يوجد ملف/مجلد بنفس الاسم."
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "الملف غير موجود."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "يجب أن يستخدم صيغة صحيحة."
+msgstr "صيغة غير صالحة."
#: editor/script_create_dialog.cpp
msgid "Wrong extension chosen."
-msgstr ""
+msgstr "لاحقة مُختارة غير مناسبة."
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
-msgstr ""
+msgstr "خطأ في تحميل القالب '%s'"
#: editor/script_create_dialog.cpp
msgid "Error - Could not create script in filesystem."
-msgstr ""
+msgstr "خطأ - فشل إنشاء النص البرمجي في نظام الملفات filesystem."
#: editor/script_create_dialog.cpp
msgid "Error loading script from %s"
-msgstr ""
+msgstr "خطأ في تحميل النص البرمجي من %s"
#: editor/script_create_dialog.cpp
msgid "Overrides"
-msgstr ""
+msgstr "يتجاوز"
#: editor/script_create_dialog.cpp
msgid "N/A"
-msgstr ""
+msgstr "غير متوافق N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "فتح مُعدل الكود"
+msgstr "فتح النص البرمجي / انتقاء الموقع"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
-msgstr "فتح الكود"
+msgstr "فتح النص البرمجي"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, it will be reused."
-msgstr "الملف موجود، سيعاد إستخدامه"
+msgstr "إن الملف موجود، سيعاد إستخدامه."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "مسار غير صالح."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid class name."
-msgstr "إسم صنف غير صالح"
+msgstr "إسم صف غير صالح."
#: editor/script_create_dialog.cpp
msgid "Invalid inherited parent name or path."
-msgstr ""
+msgstr "إن اسم أو مسار الأب (الأصل parent) الموروث غير صالح."
#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Script is valid."
-msgstr "شجرة الحركة صحيحة."
+msgid "Script path/name is valid."
+msgstr "مسار/اسم البرنامج النصي صالح."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr ""
+msgstr "المسموح: a-z، A-Z ، 0-9 ، _ و ."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in script (into scene file)."
-msgstr "عمليات مع ملفات المشهد."
+msgstr "نص برمجي مدموج (داخل ملف المشهد)."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "إنشاء ملف كود جديد"
+msgstr "سيتم إنشاء ملف برمجي جديد."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "تحميل نسق بيوس موجود مسبقاً."
+msgstr "سيتم تحميل ملف برمجي موجود مسبقاً."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "التحميل التلقائي '%s' موجود اصلا!"
+msgstr "الملف البرمجي موجود بالفعل."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"ملاحظة: النصوص البرمجية المبنية ضمناً تملك مقيدة ولها إمكانيات محددة ولا يمكن "
+"تعديلها باستخدام مُحرر خارجي."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name:"
-msgstr "إسم صنف"
+msgstr "اسم الفئة:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "مسح القالب"
+msgstr "القالب:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "فتح الكود"
+msgstr "ملف النص المُدمج:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
-msgstr ""
+msgstr "ألحق نص برمجي للعُقدة"
#: editor/script_editor_debugger.cpp
msgid "Remote "
@@ -11114,167 +10994,159 @@ msgstr "من بعد "
#: editor/script_editor_debugger.cpp
msgid "Bytes:"
-msgstr ""
+msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Warning:"
-msgstr "تحذيرات"
+msgstr "تحذير:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Error:"
-msgstr "خطأ!"
+msgstr "خطأ:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error"
-msgstr "خطأ في نسخ"
+msgstr "خطأ في C++"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error:"
-msgstr "خطأ في نسخ"
+msgstr "خطأ C++ :"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source"
-msgstr "مورد"
+msgstr "مصدر C++"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
-msgstr "مورد"
+msgstr "مصدر:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "مورد"
+msgstr "مصدر C++:"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
-msgstr ""
+msgstr "تتبع المُكدس Stack Trace"
#: editor/script_editor_debugger.cpp
msgid "Errors"
-msgstr ""
+msgstr "أخطاء"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Child process connected."
-msgstr "غير متصل"
+msgstr "العملية التابعة متصلة."
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
msgstr "خطأ في نسخ"
#: editor/script_editor_debugger.cpp
-#, fuzzy
+msgid "Video RAM"
+msgstr "الذاكرة العشوائية للفيديو"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
-msgstr "مسح النقاط"
+msgstr "تخطي نقاط التكسّر"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
-msgstr ""
+msgstr "تفحص النمذجة السابقة"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
-msgstr ""
+msgstr "تفحص النمذجة التالية"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
-msgstr ""
+msgstr "حزم الإطارات Stack Frames"
#: editor/script_editor_debugger.cpp
msgid "Profiler"
-msgstr ""
+msgstr "مُنشئ الملفات التعريفية Profiler"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Network Profiler"
-msgstr "تصدير المشروع"
+msgstr "ملف تعريف الشبكة Network Profiler"
#: editor/script_editor_debugger.cpp
msgid "Monitor"
-msgstr ""
+msgstr "المراقب Monitor"
#: editor/script_editor_debugger.cpp
msgid "Value"
-msgstr ""
+msgstr "القيمة"
#: editor/script_editor_debugger.cpp
msgid "Monitors"
-msgstr ""
+msgstr "المراقبون Monitors"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
-msgstr ""
+msgstr "اختر واحدة أو كثر من العناصر في القائمة لعرض الرسم البياني graph."
#: editor/script_editor_debugger.cpp
msgid "List of Video Memory Usage by Resource:"
-msgstr ""
+msgstr "قائمة باستخدام ذاكرة الفيديو لكل من الموارد:"
#: editor/script_editor_debugger.cpp
msgid "Total:"
-msgstr ""
+msgstr "المجموع الكلي:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+msgid "Export list to a CSV file"
+msgstr "تصدير القائمة إلى ملف CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
-msgstr ""
+msgstr "مسار المورد"
#: editor/script_editor_debugger.cpp
msgid "Type"
-msgstr ""
+msgstr "النوع"
#: editor/script_editor_debugger.cpp
msgid "Format"
-msgstr ""
+msgstr "البنية (اللاحقة)"
#: editor/script_editor_debugger.cpp
msgid "Usage"
-msgstr ""
+msgstr "الاستخدام"
#: editor/script_editor_debugger.cpp
msgid "Misc"
-msgstr ""
+msgstr "المتنوعات Misc"
#: editor/script_editor_debugger.cpp
msgid "Clicked Control:"
-msgstr ""
+msgstr "التحكم بالنقر Clicked Control:"
#: editor/script_editor_debugger.cpp
msgid "Clicked Control Type:"
-msgstr ""
+msgstr "نوع التحكم بالنقر Clicked Control:"
#: editor/script_editor_debugger.cpp
msgid "Live Edit Root:"
-msgstr ""
+msgstr "جذر التعديل المباشر:"
#: editor/script_editor_debugger.cpp
msgid "Set From Tree"
-msgstr ""
+msgstr "التحديد من الشجرة"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "تصدير القياسات ك CSV"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Erase Shortcut"
-msgstr "تخفيف للخارج"
+msgstr "حذف الاختصار"
#: editor/settings_config_dialog.cpp
msgid "Restore Shortcut"
-msgstr ""
+msgstr "إعادة تعيين الاختصارات"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Change Shortcut"
-msgstr "تغيير المرتكزات"
+msgstr "تغيير الاختصارات"
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
@@ -11282,94 +11154,92 @@ msgstr "إعدادات المُعدل"
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
-msgstr ""
+msgstr "الاختصارات"
#: editor/settings_config_dialog.cpp
msgid "Binding"
-msgstr ""
+msgstr "الربط"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Light Radius"
-msgstr ""
+msgstr "تغيير نصف قطر الإنارة"
#: editor/spatial_editor_gizmos.cpp
msgid "Change AudioStreamPlayer3D Emission Angle"
msgstr ""
+"تعديل زاوية انبعاث (إصدار) مُشغل الصوت ثلاثي الأبعاد AudioStreamPlayer3D"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
-msgstr ""
+msgstr "تعديل حقل رؤية الكاميرا Camera FOV"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera Size"
-msgstr ""
+msgstr "غيّر حجم الكاميرا"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Notifier AABB"
-msgstr ""
+msgstr "تعديل Notifier AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
-msgstr ""
+msgstr "تعديل جُزيئات AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Probe Extents"
-msgstr ""
+msgstr "تعديل نطاقات المسبر Probe Extents"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Sphere Shape Radius"
-msgstr ""
+msgstr "تعديل نصف قطر الشكل الكروي"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
-msgstr ""
+msgstr "تعديل حجم الشكل الصندوقي"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr ""
+msgstr "تعديل نصف قطر الشكل الكبسولي Capsule Shape"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr ""
+msgstr "تعديل ارتفاع الشكل الكبسولي Capsule Shape"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Radius"
-msgstr ""
+msgstr "تعديل نصف قطر الشكل الأسطواني"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Height"
-msgstr ""
+msgstr "تعديل ارتفاع الشكل الأسطواني"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
-msgstr ""
+msgstr "تعديل طول الشكل الشعاعي"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "تغيير وقت الدمج"
+msgstr "تغيير نصف قطر الاسطوانة"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "تغيير وقت الدمج"
+msgstr "تغيير ارتفاع الاسطوانة"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "تغيير المرتكزات و الهوامش"
+msgstr "تغيير نصف قطر الدائرة الداخلي"
#: modules/csg/csg_gizmos.cpp
msgid "Change Torus Outer Radius"
-msgstr ""
+msgstr "تعديل نصف القطر الخارجي للطارة Torus Outer Radius"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
-msgstr ""
+msgstr "اختر المكتبة المطاوعة (الديناميكية) لأجل هذا الإدخال"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select dependencies of the library for this entry"
-msgstr ""
+msgstr "اختر تبعيات المكتبة لأجل هذا الإدخال"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Remove current entry"
@@ -11377,61 +11247,59 @@ msgstr "مسح المدخلة الحالية"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "الضغط المزدوج لإنشاء إدخال جديد"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
-msgstr ""
+msgstr "المنصة:"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform"
-msgstr ""
+msgstr "منصة"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dynamic Library"
-msgstr ""
+msgstr "مكتبة مطاوعة (ديناميكية)"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Add an architecture entry"
-msgstr ""
+msgstr "إضافة إدخال معماري architecture entry"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "GDNativeLibrary"
-msgstr ""
+msgstr "مكتبة GDNativeLibrary"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Enabled GDNative Singleton"
-msgstr ""
+msgstr "تمكين نمط البرمجة Singleton لـ GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "تعطيل دوار التحديث"
+msgstr "تعطيل نمط البرمجة Singleton لـ GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
-msgstr ""
+msgstr "مكتبة"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
-msgstr ""
+msgstr "مكتبات: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr ""
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Step argument is zero!"
-msgstr "الخطوة (المتغيرة المدخلة/argument) تساوي صفر !"
+msgstr "معامل الخطوة تساوي صفر!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
-msgstr "ليس كود مع نموذج"
+msgstr "ليس نص برمجي مع نموذج"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not based on a script"
-msgstr "لا تستند الى شفرة مصدرية"
+msgstr "لا تستند الى نص برمجي"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not based on a resource file"
@@ -11439,175 +11307,165 @@ msgstr "لا تستند على ملف مورد"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (missing @path)"
-msgstr ""
-"instance dictionary format نموذج الشكل القاموسي غير صالح - المسار مفقود"
+msgstr "نموذج الشكل القاموسي غير صالح (@المسار مفقود)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (can't load script at @path)"
-msgstr ""
-"instance dictionary format نموذج الشكل القاموسي غير صالح - لا يمكن تحميل "
-"السكريبت من المسار"
+msgstr "نموذج الشكل القاموسي غير صالح (لا يمكن تحميل النص البرمجي من @المسار)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr ""
-"instance dictionary format نموذج الشكل القاموسي غير صالح - السكريبت في "
-"المسار غير صالح"
+msgstr "نموذج الشكل القاموسي غير صالح ( النص البرمجي غير صالح في @المسار)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary (invalid subclasses)"
-msgstr "مجسّد القاموس غير صالح (أصناف فرعية غير صالحة)"
+msgstr "نموذج القاموس غير صالح (أصناف فرعية غير صالحة)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
-msgstr ""
+msgstr "لا يمكن للكائن أن يمنح طولاً."
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Next Plane"
msgstr "التبويب التالي"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Previous Plane"
msgstr "التبويب السابق"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Plane:"
-msgstr ""
+msgstr "التبويت:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Next Floor"
-msgstr ""
+msgstr "الطابق التالي"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Previous Floor"
-msgstr ""
+msgstr "الطابق السابق"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Floor:"
-msgstr ""
+msgstr "الطابق:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Delete Selection"
-msgstr ""
+msgstr "خريطة الشبكة GridMap لحذف المُختار"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "كُل المُحدد"
+msgstr "تحديد الملئ خريطة-الشبكة"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "كُل المُحدد"
+msgstr "تحديد اللصق خريطة-الشبكة"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Paint"
-msgstr ""
+msgstr "تلوين (طلاء) خريطة الشبكة GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Grid Map"
-msgstr ""
+msgstr "خريطة الشبكة"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Snap View"
-msgstr ""
+msgstr "مظهر المحاذاة"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Disabled"
-msgstr ""
+msgstr "القص Clip مُعطّل"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Above"
-msgstr ""
+msgstr "القص Clip أعلاه"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Below"
-msgstr ""
+msgstr "القص Clip أدناه"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit X Axis"
-msgstr ""
+msgstr "تعديل المحور X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Y Axis"
-msgstr ""
+msgstr "تعديل المحور Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Z Axis"
-msgstr ""
+msgstr "تعديل المحور Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate X"
-msgstr ""
+msgstr "تدوير المؤشر X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Y"
-msgstr ""
+msgstr "تدوير المؤشر Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Z"
-msgstr ""
+msgstr "تدوير المؤشر Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
-msgstr ""
+msgstr "تدوير المؤشر عكساً على X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Y"
-msgstr ""
+msgstr "تدوير المؤشر عكساً على Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Z"
-msgstr ""
+msgstr "تدوير المؤشر عكساً على Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Clear Rotation"
-msgstr ""
+msgstr "مسح تدوير المؤشر"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "كُل المُحدد"
+msgstr "تحديد اللصق"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
msgstr "إخلاء المحدد"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "كُل المُحدد"
+msgstr "تعبئة المُحدد"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
-msgstr ""
+msgstr "إعدادات خريطة الشبكة"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Pick Distance:"
-msgstr ""
+msgstr "اختر المسافة:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "وضع المُصفي:"
+msgstr "تنقية المجسمات"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
msgstr ""
+"امنح مكتبة السطوح MeshLibrary وصولاً لخريطة الشبكة لتستخدم السطوح المجسمة "
+"الخاصة بها meshes."
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
-msgstr ""
+msgstr "لا يمكن أن يكون اسم الصف كلمة محجوزة"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
-msgstr ""
+msgstr "نهاية تتبع مكدس الاستثناء الداخلي"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "اطبخ شبكة ملاحة"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -11670,197 +11528,198 @@ msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
msgstr ""
+"عقدة حُصِلت بدون ذاكرة فعالة,الرجاء قراءة الدليل عن كيفية تحصيلها بطريقة صحيحة!"
#: modules/visual_script/visual_script.cpp
msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
-msgstr ""
+msgstr "العقدة حُصِلت,ولكنها لم ترجع حالة الوظيفة في اول ذاكرة فعالة."
#: modules/visual_script/visual_script.cpp
msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
msgstr ""
+"يجب أن تكون القيمة المُرجهة مقرونة بالعنصر الأول من العُقدة العاملة بالذاكرة! "
+"أصلح العقدة من فضلك."
#: modules/visual_script/visual_script.cpp
msgid "Node returned an invalid sequence output: "
-msgstr ""
+msgstr "أرجعت العُقدة تسلسلاً مُخرجاً غير صالح: "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr ""
+msgstr "عثر على تسلسل بت ولكن ليس العقدة في المكدس ,ارفع تقرير عن الخطأ!"
#: modules/visual_script/visual_script.cpp
msgid "Stack overflow with stack depth: "
-msgstr ""
+msgstr "حدوث تجاوز للتكدس ( Stack overflow) مع عمق التكدس: "
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Signal Arguments"
-msgstr ""
+msgstr "تعديل معاملات الإشارات"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument Type"
-msgstr ""
+msgstr "تعديل نوع المعامل"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument name"
-msgstr ""
+msgstr "تعديل اسم المعامل"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr ""
+msgstr "تحديد القيمة الافتراضية للمتغير"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
-msgstr ""
+msgstr "تحيد نوع المتغير"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "أضف مدخله"
+msgstr "أضف منفذ أدخال"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "أضف مدخله"
+msgstr "أضف منفذ إخراج"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Override an existing built-in function."
-msgstr "إسم غير صالح، يجب أن لا يتصادم مع الأسماء المبنية تلقائياً الموجودة."
+msgstr "تجاوز لدالة مُدمجة موجودة مسبقًا."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "إنشاء %s جديد"
+msgstr "إنشاء دالة جديدة."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
-msgstr ""
+msgstr "المتغيرات:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "إنشاء %s جديد"
+msgstr "إنشاء متغير جديد."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr "الإشارات:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "أنشئ شكل جديد من لا شئ."
+msgstr "إنشاء إشارة جديدة."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
-msgstr ""
+msgstr "هذا الاسم ليس مُعرفاً مميزاً صالحاً:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name already in use by another func/var/signal:"
-msgstr ""
+msgstr "لقد تم استخدام هذا الاسم في وظيفة برمجية/ مُتغيّر/ إشارة، من قبل:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Function"
-msgstr ""
+msgstr "إعادة تسمية الوظيفة البرمجية"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Variable"
-msgstr ""
+msgstr "إعادة تسمية المُتغيّر"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Signal"
-msgstr ""
+msgstr "إعادة تسمية الإشارة"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Function"
-msgstr ""
+msgstr "إضافة وظيفة برمجية"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
-msgstr "مسح النقطة"
+msgstr "مسح منفذ إدخال"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
-msgstr ""
+msgstr "إضافة مُتغيّر"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Signal"
-msgstr ""
+msgstr "إضافة إشارة"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "مسح النقطة"
+msgstr "حذف منفذ إدخال"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "مسح النقطة"
+msgstr "حذف منفذ إخراج"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
-msgstr ""
+msgstr "تعديل التعبير"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr ""
+msgstr "إزالة عُقد البرمجة البصرية VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr ""
+msgstr "مُضاعفة عُقد البرمجة البصرية VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
+"اضغط مطولاً %s لإسقاط جالب Getter. اضغط مطولاً على Shift لإسقاط توقيع عام "
+"generic signature."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
+"اضغط مطولاً على Ctrl لإسقاط جالب Getter. اضغط مطولاً على Shift لإسقاط توقيع "
+"عام generic signature."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
-msgstr ""
+msgstr "اضغط مطولاً على %s لإسقاط مرجعية بسيطة للعُقدة."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr ""
+msgstr "اضغط مطولاً على Ctrl لإسقاط مرجعية بسيطة للعُقدة."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
-msgstr ""
+msgstr "اضغط مطولاً على %s لإسقاط مُحدد المُتغير Variable Setter."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr ""
+msgstr "اضغط مطولاً على Ctrl لإسقاط مُحدد المُتغيّر Variable Setter."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
-msgstr ""
+msgstr "إضافة عُقدة مسبقة التحميل"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node(s) From Tree"
-msgstr ""
+msgstr "إضافة عُقدة (عُقد) من الشجرة"
#: modules/visual_script/visual_script_editor.cpp
msgid ""
"Can't drop properties because script '%s' is not used in this scene.\n"
"Drop holding 'Shift' to just copy the signature."
msgstr ""
+"لا يمكن إضافة (إسقاط) الخاصيات لأن النص البرمجي '%s' ليس موجوداً في هذا "
+"المشهد.\n"
+"للإضافة (للإسقاط) اضغط مطولاً 'Shift' ببساطة لنسخ التوقيع signature."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
-msgstr ""
+msgstr "إضافية خاصية جالب Getter Property"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Setter Property"
-msgstr ""
+msgstr "إضافة خاصية مُحدد Setter Property"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Base Type"
-msgstr ""
+msgstr "تعديل النوع الأساس"
#: modules/visual_script/visual_script_editor.cpp
msgid "Move Node(s)"
@@ -11868,72 +11727,68 @@ msgstr "تحريك العقدة(عقدات)"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
-msgstr ""
+msgstr "إزالة عُقدة البرمجة البصرية VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Nodes"
-msgstr ""
+msgstr "وصل العُقد"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "غير متصل"
+msgstr "عُقد غير متصلة"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "صلها بالعقدة:"
+msgstr "ربط بيانات العقدة"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "صلها بالعقدة:"
+msgstr "ربط تسلسل العقدة"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
-msgstr ""
+msgstr "يملك النص البرمجي سلفاً الوظيفة البرمجية '%s'"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Input Value"
-msgstr ""
+msgstr "تعديل قيمة الإدخال"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "تعديل العنصر القماشي"
+msgstr "تغيير حجم التعليق"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr ""
+msgstr "لا يمكن نسخ الوظيفة البرمجية للعُقدة."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
-msgstr ""
+msgstr "الحافظة فارغة!"
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste VisualScript Nodes"
-msgstr ""
+msgstr "لصق عُقد البرمجة البصرية VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function with a function node."
-msgstr ""
+msgstr "لا يمكن إنشاء وظيفة برمجية من دون عُقدة وظيفية."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
msgstr ""
+"لا يمكن إنشاء وظيفة برمجية لعُقد من عُقد تابعة للعديد من الوظائف البرمجية."
#: modules/visual_script/visual_script_editor.cpp
msgid "Select at least one node with sequence port."
-msgstr ""
+msgstr "اختر على الأقل واحدة من العقد التي تملك منفذ تسلسل sequence port."
#: modules/visual_script/visual_script_editor.cpp
msgid "Try to only have one sequence input in selection."
-msgstr ""
+msgstr "حاول أن يكون لديك تسلسل إدخال واحد من المُختار."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "عمل اشتراك"
+msgstr "إنشاء دالة"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
@@ -11941,219 +11796,258 @@ msgstr "مسح المهمة"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Variable"
-msgstr ""
+msgstr "إزالة المُتغيّر"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Variable:"
-msgstr ""
+msgstr "تحرير المُتغيّر:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
-msgstr ""
+msgstr "إزالة الإشارة"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Signal:"
-msgstr ""
+msgstr "تحرير الإشارة:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Tool:"
-msgstr "أنشئ عظام"
+msgstr "عمل أداة:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
msgstr "الأعضاء:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "غير نوع %s"
+msgstr "تغيير اساس النوع:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "إضافة %s..."
+msgstr "إضافة عُقد..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "مسح المهمة"
+msgstr "إضافة دالة…"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "الإعدادات:"
+msgstr "أسم_الدالة"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
-msgstr ""
+msgstr "اختر أو أنشئ وظيفة برمجية لتحرير الرسم الخاص بها (graph)."
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr ""
+msgstr "حذف المُختار"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
-msgstr ""
+msgstr "إيجاد نوع العُقدة"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr ""
+msgstr "نسخ العُقد"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr ""
+msgstr "قص العُقد"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "مسح المهمة"
+msgstr "عمل دالة"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "تحديث"
+msgstr "تحديث الرسم البياني"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "الأعضاء"
+msgstr "تعديل العضو"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
-msgstr ""
+msgstr "نوع الإدخال غير متوقع: "
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid"
-msgstr ""
+msgstr "أصبح المُكرر غير صالحاً"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid: "
-msgstr ""
+msgstr "أصبح المُكرر غير صالحاً: "
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name."
-msgstr ""
+msgstr "اسم خاصية المؤشر index property غير صالح."
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
-msgstr ""
+msgstr "الكائن الأساس ليس بعُقدة!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Path does not lead Node!"
-msgstr ""
+msgstr "لا يؤدي المسار للوصول لعُقدة!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
-msgstr ""
+msgstr "اسم خاصية المؤشر \"الفهرس\" '%s' في العُقدة %s غير صالح."
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
-msgstr ""
+msgstr ": معامل النوع غير صحيح: "
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid arguments: "
-msgstr ""
+msgstr ": معاملات غير صالحة: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableGet not found in script: "
-msgstr ""
+msgstr "لم يتم إيجاد VariableGet في النص البرمجي: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableSet not found in script: "
-msgstr ""
+msgstr "لم يتم إيجاد (مُحدد المُتغير) VariableSet في النص البرمجي: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "Custom node has no _step() method, can't process graph."
-msgstr "العقدة المخصصة لا تحتوي طريقة ()step_ ، لا يمكن معالجة المخطوط."
+msgstr "العقدة المخصصة لا تحتوي طريقة ()step_ ، لا يمكن معالجة الشكل البياني."
#: modules/visual_script/visual_script_nodes.cpp
msgid ""
"Invalid return value from _step(), must be integer (seq out), or string "
"(error)."
msgstr ""
+"القيمة المُرجعة من _step() غير صالحة، ينبغي أن تكون رقماً (تسلسل)، أو نصاً "
+"(خطأ)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "إخلاء الكود"
+msgstr "بحث VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "جلب %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
-msgstr ""
+msgstr "تحديد %s"
#: platform/android/export/export.cpp
msgid "Package name is missing."
-msgstr ""
+msgstr "اسم الرُزمة مفقود."
#: platform/android/export/export.cpp
msgid "Package segments must be of non-zero length."
-msgstr ""
+msgstr "أقسام الرُزمة ينبغي أن تكون ذات مسافات غير-صفرية non-zero length."
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
+msgstr "إن الحرف '%s' غير مسموح في أسماء حِزم تطبيقات الأندرويد."
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
-msgstr ""
+msgstr "لا يمكن أن يكون الرقم هو أول حرف في مقطع الرُزمة."
#: platform/android/export/export.cpp
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
+msgstr "الحرف '%s' لا يمكن أن يكون الحرف الأول من مقطع الرُزمة."
#: platform/android/export/export.cpp
msgid "The package must have at least one '.' separator."
-msgstr ""
+msgstr "يجب أن تتضمن الرزمة على الأقل واحد من الفواصل '.' ."
#: platform/android/export/export.cpp
msgid "Select device from the list"
-msgstr "اختار جهاز من القائمة"
+msgstr "اختر جهازاً من القائمة"
#: platform/android/export/export.cpp
msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
+msgstr "لم يتم تهيئة مُنفّذ ADB في إعدادات المُحرر."
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
msgstr ""
+"‌مُوقّع ملفات الجار jarsigner المفتوح الخاص بحزمة التطوير OpenJDK غير مُهيّئ في "
+"إعدادات المُحرر."
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
+"مُنقح أخطاء مفتاح المتجر keystore غير مُهيئ في إعدادت المُحرر أو في الإعدادات "
+"الموضوعة سلفاً."
+
+#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "تحرر مخزن المفاتيح غير مُهيئ بشكل صحيح في إعدادت المسبقة للتصدير."
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
+"البُنى المخصوصة تتطلب مساراً لحزمة تطوير Android SDK صالحة في إعدادات المُحرر."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
msgstr ""
+"مسار حزمة تطوير Android SDK للبُنى المخصوصة، غير صالح في إعدادات المُحرر."
#: platform/android/export/export.cpp
msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
msgstr ""
+"لم يتم تنزيل قالب بناء Android لهذا المشروع. نزّل واحداً من قائمة المشروع."
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr ""
+msgstr "مفتاح عام غير صالح لأجل تصدير حزمة تطبيق أندرويد APK."
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "إسم صنف غير صالح"
+msgstr "اسم رُزمة غير صالح:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"وحدة \"GodotPaymentV3\" المضمنة في إعدادات المشروع \"android / modules\" غير "
+"صالحة (تم تغييره في Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "يجب تفعيل \"Use Custom Build\" لإستخدام الإضافات."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" تكون صالحة فقط عندما يكون وضع الـ \"Xr Mode\"هو "
+"\"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" تكون صالحة فقط عندما يكون وضع الـ \"Xr Mode\"هو \"Oculus "
+"Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" تكون صالحة فقط عندما يكون وضع الـ \"Xr Mode\"هو \"Oculus "
+"Mobile VR\"."
#: platform/android/export/export.cpp
msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
+"تتم محاولة البناء من قالب بناء مُخصص، ولكن لا تتواجد معلومات النسخة. من فضلك "
+"أعد التحميل من قائمة \"المشروع\"."
#: platform/android/export/export.cpp
msgid ""
@@ -12162,45 +12056,52 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
+"نسخ بناء Android غير متوافقة:\n"
+"\tقوالب مُنصبة: %s\n"
+"\tإصدار غودوت: %s\n"
+"من فضلك أعد تنصيب قالب بناء الأندرويد Android من قائمة \"المشروع\"."
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "بناء مشروع الأندرويد (gradle)"
#: platform/android/export/export.cpp
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"أخفق بناء مشروع الأندرويد، تفقد المُخرجات للإطلاع على الخطأ.\n"
+"بصورة بديلة يمكنك زيارة docs.godotengine.org لأجل مستندات البناء للأندرويد."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr ""
+msgstr "لم يتم توليد حزمة أندرويد apk في: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
-msgstr ""
+msgstr "المُحدد مفقود."
#: platform/iphone/export/export.cpp
msgid "The character '%s' is not allowed in Identifier."
-msgstr ""
+msgstr "إن الحرف '%s' غير مسموح في المُحدد Identifier."
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
msgstr ""
+"لم يتم تحديد ID الفُرق الخاص بمتجر التطبيقات - لا يمكن تهيئة configure "
+"المشروع."
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "حجم الخط غير صالح"
+msgstr "مُحدد غير صالح:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
-msgstr ""
+msgstr "الأيقونة المطلوبة لم تُحدد في الإعدادات المُسبقة."
#: platform/javascript/export/export.cpp
msgid "Stop HTTP Server"
-msgstr ""
+msgstr "إيقاف مُخدم HTTP"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -12232,80 +12133,75 @@ msgstr "لا يمكن قراءة ملف الإقلاع الصوري:"
#: platform/javascript/export/export.cpp
msgid "Using default boot splash image."
-msgstr ""
+msgstr "استخدام الصورة الافتراضية للشروع بالتشغيل."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package short name."
-msgstr "إسم صنف غير صالح"
+msgstr "اسم الرُزمة القصير غير صالح."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package unique name."
-msgstr "اسم غير صالح."
+msgstr "الاسم المميز للرُزمة غير صالح."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "اسم غير صالح."
+msgstr "اسم الناشر المعروض للرُزمة غير صالح."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid product GUID."
-msgstr "اسم غير صالح."
+msgstr "مُعرف GUID (المُعرّف الفريد العالمي) للمنتج غير صالح."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid publisher GUID."
-msgstr "مسار غير صالح."
+msgstr "المُعرف الفريد العالمي للناشر GUID غير صالح."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid background color."
-msgstr "اسم غير صالح."
+msgstr "لون خلفية غير صالح."
#: platform/uwp/export/export.cpp
msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr ""
+msgstr "أبعاد صورة الشعار الخاص بالمتجر غير صالحة (ينبغي أن تكون50 × 50)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr ""
+msgstr "أبعاد صورة الشعار المربع 44×44 غير صالحة (ينبغي أن تكون 44×44)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr ""
+msgstr "أبعاد صورة شعار 71×71 غير صالحة (ينبغي أن تكون 71×71)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr ""
+msgstr "أبعاد صورة الشعار المُربع 150×150 غير صالحة (ينبغي أن تكون 150×150)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr ""
+msgstr "أبعاد صورة الشعار المُربع 310×310 غير صالحة (ينبغي أن تكون 310×310)."
#: platform/uwp/export/export.cpp
msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr ""
+msgstr "أبعاد صورة الشعار المربع 310x150 غير صالحة (ينبغي أن تكون 310x150)."
#: platform/uwp/export/export.cpp
msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr ""
+msgstr "أبعاد شاشة البداية غير صالحة (ينبغي أن تكون 620×300)."
#: scene/2d/animated_sprite.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
-"ليتم إظهار الأطر (اللقطات) في الAnimatedSprite (النقوش المتحركة), يجب تكوين "
-"مصدر لها من نوع SpriteFrames و ضبط خاصية الFrames (الأطر) بها."
+"ليتم إظهار الإطارات في الAnimatedSprite (النقوش المتحركة), يجب تكوين مصدر "
+"لها من نوع SpriteFrames و ضبط خاصية الFrames (الأطر) بها."
#: scene/2d/canvas_modulate.cpp
msgid ""
"Only one visible CanvasModulate is allowed per scene (or set of instanced "
"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
+"يُسمح بواحد فقط من CanvasModulate (مُعدلات اللوحة) في كُل مشهد (أو مجموعة "
+"المشاهد المُنمذجة). سيعمل أول واحد فقط، بينما الباقي سيتم تجاهلهم."
#: scene/2d/collision_object_2d.cpp
msgid ""
@@ -12313,6 +12209,11 @@ msgid ""
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
+"لا تملك هذه العُقدة شكلاً، بالتالي إنها غير قادرة على التصادم أو التفاعل مع "
+"الكائنات الأخرى.\n"
+"ضع في الحسبان إضافة عُقدة بنت كالشكل التصادمي ثنائي الأبعاد CollisionShape2D "
+"أو الشكل التصادمي المُضلع ثنائي الأبعاد CollisionPolygon2D لتحديد الشكل "
+"الخاصة بها."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -12320,10 +12221,17 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
+"يعمل مُضلع التصادم ثنائي الأبعاد CollisionPolygon2D فقط كشكل تصادمي لكل العُقد "
+"المشتقة من الكائن التصادمي ثنائي الأبعاد CollisionObject2D. من فضلك استخدمه "
+"فقط لكل أبناء الحيز ثنائي الأبعاد Area2D، الجسم السكوني ثنائي الأبعاد "
+"StaticBody2D و الجسم الجامد ثنائي الأبعاد RigidBody2D، والجسم المتحرك ثنائي "
+"الأبعاد KinematicBody2D إلخ.. لكي تمنح كل منهم شكلاً."
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
msgstr ""
+"مُضلع تصادم ثنائي الأبعاد (CollisionPolygon2D) الفارغ ليس له أي تأثير على "
+"التصادم."
#: scene/2d/collision_shape_2d.cpp
msgid ""
@@ -12331,52 +12239,77 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
+"يعمل جسم-تصادم-ثنائي-البُعد (CollisionPolygon2D) فقط كشكل تصادمي لكل العُقد "
+"المشتقة من الكائن التصادمي ثنائي الأبعاد (CollisionObject2D). من فضلك "
+"استخدمه فقط لكل أبناء الحيز-ثنائي-البُعد (Area2D)، الجسم-الثابت-ثنائي-البُعد "
+"(StaticBody2D) و الجسم-الصلب-ثنائي-البُعد (RigidBody2D)، والجسم-المتحرك-ثنائي-"
+"البُعد (KinematicBody2D) إلخ.. لكي تمنح كل منهم شكلاً."
#: scene/2d/collision_shape_2d.cpp
msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
-"يجب تزويد ال CollisionShape2D بإحدى الأشكال (من نوع Shape2D) لتعمل بالشكل "
-"المطلوب. الرجاء تكوين و ضبط الشكل لها اولا!"
+"يجب تزويد جسم-تصادم-ثنائي-البُعد (CollisionShape2D) بإحدى الأشكال (من نوع "
+"Shape2D) لتعمل بالشكل المطلوب. الرجاء تكوين و ضبط الشكل لها اولا!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"الأشكال المستندة إلى المضلع (Polygon-based shapes) لا تعني انك قادر على "
+"استخدامها او تعديلها بشكل مباشر من خلال عقدة جسم-تصادم-ثنائي-البُعد "
+"(CollisionShape2D). الرجاء استخدام عقدة مضلع-تصادم-ثنائي-البُعد "
+"(CollisionPolygon2D) بدلاً من ذلك."
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"تتطلب الرسوم المتحركة للجسيمات-وحدة-المعالجة-المركزية-ثنائية-الأبعاد "
+"(CPUParticles2D) استخدام لوحة-مادة-العنصر (CanvasItemMaterial) مع تفعيل"
+"\"الرسوم المتحركة للجزيئات\"."
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
-msgstr ""
+msgstr "يجب توريد نقش بهيئة الضوء لخاصية \"النقش\"."
#: scene/2d/light_occluder_2d.cpp
msgid ""
"An occluder polygon must be set (or drawn) for this occluder to take effect."
msgstr ""
+"المُضلع المُغلق(occluder polygon) يجب تعينه (او رسمه) ليأخذ هذا الغَلق تأثيره."
#: scene/2d/light_occluder_2d.cpp
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
-msgstr ""
+msgstr "المُضلع المُغلق لهذا الغَلق فارغ. الرجاء رسم مُضلع."
#: scene/2d/navigation_polygon.cpp
msgid ""
"A NavigationPolygon resource must be set or created for this node to work. "
"Please set a property or draw a polygon."
msgstr ""
+"يجب تعيين مصدر مُضلع-التنقل (NavigationPolygon) أو إنشاؤه حتى تعمل هذه "
+"العقدة. يُرجى تعيين خاصية أو رسم مضلع."
#: scene/2d/navigation_polygon.cpp
msgid ""
"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
"node. It only provides navigation data."
msgstr ""
+"يجب أن يكون نموذج-المضلع-المتنقل (NavigationPolygonInstance) تابعًا أو حفيدًا "
+"لعقدة التنقل-ثنائي-الأبعاد (Navigation2D). انه فقط يوفر بيانات التنقل."
#: scene/2d/parallax_layer.cpp
msgid ""
"ParallaxLayer node only works when set as child of a ParallaxBackground node."
msgstr ""
+"تعمل عقدة طبقة-المنظهر (ParallaxLayer) فقط عند تعيينها كعقدة تابعة لعقدة "
+"خلفية-المنظر ParallaxBackground."
#: scene/2d/particles_2d.cpp
msgid ""
@@ -12384,22 +12317,31 @@ msgid ""
"Use the CPUParticles2D node instead. You can use the \"Convert to "
"CPUParticles\" option for this purpose."
msgstr ""
+"لا يدعم برنامج تشغيل الفيديو GLES2 الجسيمات القائمة على وحدة معالجة الرسومات "
+"(GPU-based particles).\n"
+"استخدم عقدة جسيمات-وحدة-المعالجة-المركزية-ثنائية-البُعد (CPUParticles2D) بدلاً "
+"من ذلك. يمكنك استخدام خيار \"التحويل إلى CPUParticles\" لهذا الغرض."
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
"A material to process the particles is not assigned, so no behavior is "
"imprinted."
msgstr ""
+"لا يوجد مادة (material) لمعالجة الجسيمات ، لذلك لا يتم طبع او عمل أي سلوك."
#: scene/2d/particles_2d.cpp
msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"تتطلب الرسوم المتحركة للجسيمات-ثنائية-البُعد (Particles2D) استخدام لوحة-مادة-"
+"العنصر (CanvasItemMaterial) مع تمكين \"الرسوم المتحركة للجسيمات\"."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
+"لا يعمل اتباع-المسار-ثنائي-البُعد (PathFollow2D) إلا عند جعل عقدة مسار-ثنائي-"
+"البُعد (Path2D) تابعًا له."
#: scene/2d/physics_body_2d.cpp
msgid ""
@@ -12407,23 +12349,33 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"تغييرات الحجم للجسم-صلب-ثنائي-البُعد (RigidBody2D) (في أوضاع الشخصيات أو "
+"الأوضاع الصلبة) سيتم تجاوزها بواسطة محرك الفيزياء عند التشغيل.\n"
+"قم بتغيير الحجم في أشكال تصادم التابعين له بدلاً من ذلك."
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
msgstr ""
+"يجب أن تشير خاصية المسار إلى عُقدة-ثنائية-البُعد (Node2D) صالحة لكي تعمل."
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
msgstr ""
+"سلسلة العظم ثنائي البُعد Bone2D هذه، ينبغي أن تنتهي في عُقدة هيكل ثنائي البُعد "
+"Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"يعمل عظم-ثنائي-البُعد (Bone2D) فقط مع هيكلية-ثنائية-البُعد (Skeleton2D) أو "
+"Bone2D آخر كعقدة رئيسية."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"هذا العظم يفتقر إلى وضع الراحة المناسب. انتقل إلى عقدة هيكلية ثنائية "
+"البُعد(Skeleton2D) وقم بتعيين واحدة."
#: scene/2d/tile_map.cpp
msgid ""
@@ -12431,64 +12383,80 @@ msgid ""
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
+"يحتاج خريطة-البلاط (TileMap) مع تفعيل خاصية إستخدام الأصل (Use Parent) إلى "
+"ان يكون تابعًا لكائن-تصادمي-ثنائي-البُعد (CollisionObject2D) لإعطاء الأشكال. "
+"يرجى استخدامه كتابع لحيز-ثنائي-البُعد(ِArea2D)، جسم-ثابت-ثنائي-البُعد "
+"(StaticBody2D)، جسم-صلب-ثنائي-البُعد (RigidBody2D)، أو جسم-متحرك-ثنائي-البُعد "
+"(KinematicBody2D)، وما إلى ذلك لمنحهم شكلاً."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
msgstr ""
+"يعمل مُمَكِن-الرؤية-ثنائي-البُعد (VisibilityEnabler2D) بشكل أفضل عند استخدامه مع "
+"المشهد الرئيس الذي تم تحريره مباشرةً باعتباره الأصل."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "يجب أن تحتوي ARVRCamera على عقدة ARVROrigin كأصل لها."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "يجب أن تحتوي ARVRController على عقدة ARVROrigin كأصل لها."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
msgstr ""
+"يجب ألا يكون معرف وحدة التحكم تساوي 0 أو لن تكون وحدة التحكم هذه مقيدة بوحدة "
+"تحكم فعلية."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "يجب أن يحتوي ARVRController على عقدة ARVROrigin كأصل له."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
msgstr ""
+"يجب ألا يكون معرف الإرتكاز (The anchor) يساوي 0 أو لن يكون هذا الإرتكاز مقيد "
+"بإرتكاز فِعلي."
#: scene/3d/arvr_nodes.cpp
msgid "ARVROrigin requires an ARVRCamera child node."
msgstr ""
+"يحتاج خريطة-البلاط (TileMap) مع تفعيل خاصية إستخدام الأصل (Use Parent) إلى "
+"ان يكون تابعًا لكائن-تصادمي-ثنائي-البُعد (CollisionObject2D) لإعطاء الأشكال. "
+"يرجى استخدامه كتابع لحيز-ثنائي-البُعد(ِArea2D)، جسم-ثابت-ثنائي-البُعد "
+"(StaticBody2D)، جسم-صلب-ثنائي-البُعد (RigidBody2D)، أو جسم-متحرك-ثنائي-البُعد "
+"(KinematicBody2D)، وما إلى ذلك لمنحهم شكلاً."
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
-msgstr ""
+msgstr "%d%%"
#: scene/3d/baked_lightmap.cpp
msgid "(Time Left: %d:%02d s)"
-msgstr ""
+msgstr "(الوقت المتبقي: %d:%02d ثانية)"
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Meshes: "
-msgstr ""
+msgstr "تخطيط المجسمات: "
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Lights:"
-msgstr ""
+msgstr "تخطيط الإضاءات:"
#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
msgid "Finishing Plot"
-msgstr ""
+msgstr "الانتهاء من التخطيط"
#: scene/3d/baked_lightmap.cpp
msgid "Lighting Meshes: "
-msgstr ""
+msgstr "إضاءة المجسمات: "
#: scene/3d/collision_object.cpp
msgid ""
@@ -12496,6 +12464,8 @@ msgid ""
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
+"هذه العقدة ليس لها شكل، لذلك لا يمكن أن تصطدم أو تتفاعل مع الكائنات الأخرى.\n"
+"ضع في الإعتبار إضافة شكل تصادم أو مضلع تصادم كتابع لتعريف شكله."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -12503,6 +12473,10 @@ msgid ""
"CollisionObject derived node. Please only use it as a child of Area, "
"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
+"يعمل مضلع التصادم (CollisionPolygon) فقط على توفير شكل تصادم لعقدة كائن "
+"التصادم (CollisionObject) المشتقة. يُرجى استخدامه فقط كتابع لحيز (Area)، جسم "
+"ثابت (StaticBody)، جسم صلب (StaticBody)، أو جسم حركي (KinematicBody)، وما "
+"إلى ذلك لمنحهم شكلاً."
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
@@ -12514,55 +12488,80 @@ msgid ""
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
"KinematicBody, etc. to give them a shape."
msgstr ""
+"يعمل شكل التصادم (CollisionPolygon) فقط على توفير شكل تصادم لعقدة كائن "
+"التصادم (CollisionObject) المشتقة. يُرجى استخدامه فقط كتابع لحيز (Area)، جسم "
+"ثابت (StaticBody)، جسم صلب (StaticBody)، أو جسم حركي (KinematicBody)، وما "
+"إلى ذلك لمنحهم شكلاً."
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"يجب تزويد ال CollisionShape2D بإحدى الأشكال (من نوع Shape2D) لتعمل بالشكل "
-"المطلوب. الرجاء تكوين و ضبط الشكل لها اولا!"
+"يجب توفير شكل لـ CollisionShape2D بإحدى الأشكال (من نوع Shape2D) لتعمل "
+"بالشكل المطلوب. الرجاء تكوين و ضبط الشكل لها."
#: scene/3d/collision_shape.cpp
msgid ""
"Plane shapes don't work well and will be removed in future versions. Please "
"don't use them."
msgstr ""
+"لا تعمل أشكال التبويت (Plane shapes) بشكل جيد وسيتم إزالتها في الإصدارات "
+"المستقبلية. من فضلك لا تستخدمها."
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"الشكل المضلع المُقعر (ConcavePolygonShape) لا يدعم الجسم الصلب (RigidBody) في "
+"أي وضع غير الوضع الثابت."
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
+msgstr "لا شيء مرئي لأنه لم يتم تعيين أي مجسم."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial whose "
"Billboard Mode is set to \"Particle Billboard\"."
msgstr ""
+"تتطلب الرسوم المتحركة لجسيمات وحدة المعالجة المركزية( CPUParticles) استخدام "
+"مادة مكانية (SpatialMaterial) التي تم ضبط وضع اللوحة (Billboard Mode) الخاص "
+"بها على \"لوحة الجسيمات\"."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
-msgstr ""
+msgstr "تخطيط المجسمات"
#: scene/3d/gi_probe.cpp
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
+"GIProbes لا يدعم برنامج تشغيل الفيديو GLES2.\n"
+"استخدم BakedLightmap بدلاً من ذلك."
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr ""
+msgstr "بقعة الضوء بزاوية أكبر من 90 درجة لا يمكنها إلقاء الظلال."
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
+"يجب تعيين مصدر مجسم-التنقل (NavigationMesh) أو إنشاؤه حتى تعمل هذه العقدة."
#: scene/3d/navigation_mesh.cpp
msgid ""
"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
"It only provides navigation data."
msgstr ""
+"يجب أن يكون نموذج-مجسم-التنقل (NavigationMeshInstance) تابعًا أو حفيدًا لعقدة "
+"التنقل (Navigation node). انه يوفر فقط بيانات التنقل."
#: scene/3d/particles.cpp
msgid ""
@@ -12570,27 +12569,35 @@ msgid ""
"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
"\" option for this purpose."
msgstr ""
+"الجسيمات القائمة على وحدة معالجة الرسومات (GPU-based particles) لا تدعم "
+"برنامج تشغيل الفيديو GLES2 .\n"
+"استخدم عقدة CPUParticles بدلاً من ذلك. يمكنك استخدام خيار \"التحويل إلى "
+"CPUParticles\" لهذا الغرض."
#: scene/3d/particles.cpp
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr ""
+msgstr "لا يوجد شيء مرئي لأن المجسمات لم يتم تعيين لها رسم التمريرات."
#: scene/3d/particles.cpp
msgid ""
"Particles animation requires the usage of a SpatialMaterial whose Billboard "
"Mode is set to \"Particle Billboard\"."
msgstr ""
+"تتطلب الرسوم المتحركة للجسيمات استخدام مادة مكانية (SpatialMaterial) التي تم "
+"ضبط وضع اللوحة (Billboard Mode) الخاص بها على \"لوحة الجسيمات\"."
#: scene/3d/path.cpp
msgid "PathFollow only works when set as a child of a Path node."
-msgstr ""
+msgstr "يعمل تتبع المسار PathFollow فقط عندما يكون ابناً لعُقدة مسار Path."
#: scene/3d/path.cpp
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
+"يتطلب ROTATION_ORIENTED الخاص بأتباع-المسار (PathFollow) تمكين \"Up Vector\" "
+"في مصدر منحنى مسار الأصل (Parent Path's)."
#: scene/3d/physics_body.cpp
msgid ""
@@ -12598,16 +12605,21 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"تغير حجم الجسم الصلب (RigidBody) (في الشخصية أو الأوضاع الصلبة) سيتم تجاوزها "
+"بواسطة محرك الفيزياء عند التشغيل.\n"
+"قم بتغيير الحجم في أشكال تصادم الأتباع (Children) بدلاً من ذلك."
#: scene/3d/remote_transform.cpp
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
+"يجب أن تشير خاصية \"المسار البعيد\" إلى عقدة مكانية أو مشتقة مكانية صالحة "
+"لكي تعمل."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
-msgstr ""
+msgstr "سيتم تجاهل هذا الجسم حتى تضع تحدد له مجسمًا."
#: scene/3d/soft_body.cpp
msgid ""
@@ -12615,83 +12627,91 @@ msgid ""
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"تغير حجم الجسم الناعم (SoftBody) سيتم تجاوزها بواسطة محرك الفيزياء عند "
+"التشغيل.\n"
+"قم بتغيير الحجم في أشكال تصادم الأتباع (Children) بدلاً من ذلك."
#: scene/3d/sprite_3d.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
msgstr ""
-"ليتم إظهار الأطر (اللقطات) في الAnimatedSprite (النقوش المتحركة), يجب تكوين "
-"مصدر لها من نوع SpriteFrames و ضبط خاصية الFrames (الأطر) بها."
+"يجب إنشاء مصدر إطارات الرسم (SpriteFrames) أو تعيينه في خاصية \"الإطارات\" "
+"حتى يتمكن الرسوم المتحركة للرسم ثلاثي الُعد (AnimatedSprite3D) من عرض "
+"الإطارات."
#: scene/3d/vehicle_body.cpp
msgid ""
"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
"it as a child of a VehicleBody."
msgstr ""
+"تعمل عجلة المركبة (VehicleWheel) على توفير نظام عجلات لجسم "
+"المركبة(VehicleBody). يرجى استخدامه كتابع لجسم المركبة."
#: scene/3d/world_environment.cpp
msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"تتطلب بيئة-العالم (WorldEnvironment) خاصية\"البيئة\" الخاصة بها لاحتواء بيئة "
+"ليكون لها تأثير مرئي."
#: scene/3d/world_environment.cpp
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
-msgstr ""
+msgstr "يُسمح فقط ببيئة عالمية واحدة لكل مشهد (أو مجموعة من المشاهد المتوافقة)."
#: scene/3d/world_environment.cpp
msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"يتم تجاهل هذه البيئة العالمية. إما أن تضيف كاميرا (للمشاهد ثلاثية البُعد) أو "
+"اضبط وضع الخلفية لهذه البيئة على لوحة (Canvas) (للمشاهد ثنائية البُعد)."
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
+"في عقدة خليط-الشجرة (BlendTree) '%s'، لم يتم العثور على الرسوم المتحركة:'%s '"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "أدوات الحركة"
+msgstr "لم يتم إيجاد الرسم المتحرك: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "في العُقدة '%s'، رسومية متحركة غير صالحة: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "خطأ: إسم حركة خاطئ!"
+msgstr "رسومية متحركة غير صالحة: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "قطع إتصال'%s' من '%s'"
+msgstr "ليس هناك وصل بين أي من مُدخلات '%s' للعُقدة '%s'."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
-msgstr ""
+msgstr "لم يتم تحديد عُقدة رئيسة لعُقدة الرسومات المتحركة لأجل الرسم graph."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "حدد مشغل حركة من شجرة المشهد لكي تعدل الحركة."
+msgstr "لم يتم تحديد مسار يحتوي ارسومات المتحركة لعُقدة مُشغل الرسومات المتحركة."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"المسار المُحدد لمُشغل الرسومات المتحركة لا يقود إلى عُقدة مُشغل رسومات مُتحركة."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
-msgstr "شجرة الحركة خاطئة."
+msgstr "العُقدة الرئيسة لمُشغل الرسومات المتحركة ليست عُقدة صالحة."
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
msgstr ""
+"لقد تم إهمال هذه العُقدةز استخدم شجرة الرسومات المتحركة AnimationTree بدلاً عن "
+"ذلك."
#: scene/gui/color_picker.cpp
msgid ""
@@ -12699,27 +12719,29 @@ msgid ""
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"اللون: #%s\n"
+"الزر الأيسر للفأرة: تحديد اللون\n"
+"الزر الأيمن للفأرة: إزالة اللون الحالي"
#: scene/gui/color_picker.cpp
msgid "Pick a color from the editor window."
-msgstr ""
+msgstr "اختر لوناً من نافذة المُحرر."
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
msgid "Raw"
-msgstr ""
+msgstr "خام"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
-msgstr ""
+msgstr "بدّل بين القيم البرمجية والسداسية العشرية."
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "أضف اللون الحالي كإعداد مسبق"
+msgstr "أضف اللون الحالي كإعداد مسبق."
#: scene/gui/container.cpp
msgid ""
@@ -12727,12 +12749,18 @@ msgid ""
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
+"لا تخدم الحاوية في حد ذاتها أي غرض ما لم يقم النص البرمجي بتكوين سلوك وضع "
+"الأتباع الخاص به .\n"
+"إذا كنت لا تنوي إضافة نص برمجي ، فاستخدم عقدة تحكم عادية بدلاً من ذلك."
#: scene/gui/control.cpp
msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"لن يتم عرض أداة التلميح أثناء تعيين عامل تصفية الفأره الخاص بعنصر التحكم, تم "
+"وضعه على \"تجاهل\". لحل هذه المشكلة ، اضبط تصفية الفأره على \"إيقاف\" أو "
+"\"تمرير\"."
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -12740,7 +12768,7 @@ msgstr "تنبيه!"
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
-msgstr "يرجى التاكيد..."
+msgstr "يُرجى التأكيد..."
#: scene/gui/popup.cpp
msgid ""
@@ -12748,10 +12776,13 @@ msgid ""
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
+"ستختفي النوافذ المنبثقة افتراضيًا ما لم تقم باستدعاء popup() أو أي من وظائف "
+"popup(). من الجيد جعلها مرئية للتحرير ، لكنها ستختفي عند التشغيل."
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
msgstr ""
+"إذا تم تفعيل الـ\"Exp Edit\" يجب على ان يكون \"Min Value\" اعلى من صفر."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -12759,16 +12790,21 @@ msgid ""
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
+"تم تصميم ScrollContainer للعمل مع عنصر تحكم تابع واحد.\n"
+"استخدم حاوية كتابع (VBox ، HBox ، إلخ) ، أو عنصر تحكم واضبط الحد الأدنى "
+"المخصص للحجم يدويًا."
#: scene/gui/tree.cpp
msgid "(Other)"
-msgstr ""
+msgstr "(أخرى)"
#: scene/main/scene_tree.cpp
msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
+"تعذر تحميل البيئة الافتراضية كما هو محدد في إعدادات المشروع (التقديم -> "
+"البيئة -> البيئة الافتراضية)."
#: scene/main/viewport.cpp
msgid ""
@@ -12777,6 +12813,13 @@ msgid ""
"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
"texture to some node for display."
msgstr ""
+"لم يتم تعيين منفذ العرض هذا كهدف عرض. إذا كنت تنوي عرض محتوياته مباشرة على "
+"الشاشة ، اجعله تابعًا لعنصر تحكم حتى يتمكن من الحصول على الحجم. خلاف ذلك ، "
+"اجعلها RenderTarget وقم بتعيين نسيجها الداخلي لبعض العقد لعرضها."
+
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "ينبغي أن يكون حجم إطار العرض أكبر من 0 ليتم الإخراج البصري لأي شيء."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
@@ -12788,11 +12831,11 @@ msgstr "مصدر غير صالح لتظليل."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid comparison function for that type."
-msgstr "comparison function غير صالحة لهذا النوع."
+msgstr "وظيفة برمجية مُقارِنة غير صالحة لأجل ذلك النوع."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr "التعيين لتعمل."
+msgstr "تكليفها لوظيفة برمجية."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
@@ -12806,6 +12849,43 @@ msgstr "يمكن تعيين المتغيرات فقط في الذروة ."
msgid "Constants cannot be modified."
msgstr "لا يمكن تعديل الثوابت."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "رصيف نظام الملفات و الاستيراد"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "حينما يتم التصدير أو النشر، ملف التشغيل الناتج سوف يحاول الإتصال إلي "
+#~ "عنوان الأي بي الخاص بهذا الكمبيوتر من أجل تصحيح الأخطاء."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "المشهد الحالي لم يتم حفظه. الرجاء حفظ المشهد قبل تشغيله و اختباره."
+
+#~ msgid "Not in resource path."
+#~ msgstr "ليس في مسار الموارد."
+
+#~ msgid "Revert"
+#~ msgstr "إرجاع"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "هذا الفعل لا يمكن إرجاعة. إرجاع علي أية حال؟"
+
+#~ msgid "Revert Scene"
+#~ msgstr "إعادة المشهد"
+
+#~ msgid "Clear Script"
+#~ msgstr "إخلاء الكود"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "متتبع الأخطاء"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "إستبُدل %d حادثة(حوادث)."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "أنشئ جسم محدب ثابت"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/bg.po b/editor/translations/bg.po
index a42e873790..3bb60a79e0 100644
--- a/editor/translations/bg.po
+++ b/editor/translations/bg.po
@@ -4,16 +4,18 @@
# This file is distributed under the same license as the Godot source code.
# Bojidar Marinov <bojidar.marinov.bg@gmail.com>, 2016.
# Иван Пенев (Адмирал АнимЕ) <aeternus.arcis@gmail.com>, 2016-2017.
-# Любомир Василев <lyubomirv@abv.bg>, 2018.
+# Любомир Василев <lyubomirv@abv.bg>, 2018, 2020.
# MaresPW <marespw206@gmail.com>, 2018.
-# PakoSt <kokotekilata@gmail.com>, 2018.
+# PakoSt <kokotekilata@gmail.com>, 2018, 2020.
# Damyan Dichev <mwshock2@gmail.com>, 2019.
+# Whod <whodizhod@gmail.com>, 2020.
+# Stoyan <stoyan.stoyanov99@protonmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-02-13 07:10+0000\n"
-"Last-Translator: Damyan Dichev <mwshock2@gmail.com>\n"
+"PO-Revision-Date: 2020-09-15 07:17+0000\n"
+"Last-Translator: Stoyan <stoyan.stoyanov99@protonmail.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/"
"godot/bg/>\n"
"Language: bg\n"
@@ -21,153 +23,149 @@ 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 3.5-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
-"Невалиден агрумент тип на convert(), използвайте константите започващи с "
+"Неправилен тип аргумент на convert(). Използвайте константите започващи с "
"TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Очаква се низ с дължина 1 (един знак)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Недостатъчно байтове за разкодиране или недействителен формат."
+msgstr "Недостатъчно байтове за разкодиране или неправилен формат."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Неправилно въведени дани %i (не подаден) в израза"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"self не може да се ползва, тъй като инстанцията е null (не е била подадена)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
msgstr "Невалидни операнди към оператор %s, %s и %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
msgstr "Невалиден индекс от тип %s за базов тип %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Невалидно наименован индекс '%s' за базов тип %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "Невалидени агрументи за конструкция '%s'"
+msgstr "Неправилни аргументи за създаване на „%s“"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "При обаждане към '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "Б"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "КиБ"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "МиБ"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "ГиБ"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "ТиБ"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "ПиБ"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "ЕиБ"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Free"
-msgstr "Свободен"
+msgstr "Свободно"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Балансиран"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Отрази (огледално)"
+msgstr "Огледално"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
-msgstr ""
+msgstr "Време:"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Value:"
-msgstr "Стойност"
+msgstr "Стойност:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr ""
+msgstr "Вмъкване на ключ тук"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr ""
+msgstr "Копиране на избран(и) ключ(ове)"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr ""
+msgstr "Изтриване на избран(и) ключ(ове)"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr ""
+msgstr "Добавяне на точка на Безие"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "LMB: Премести Точка."
+msgstr "Преместване на точки на Безие"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr ""
+msgstr "Копиране на ключ(ове) (Анимация)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr ""
+msgstr "Изтриване на ключ(ове) (Анимация)"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr ""
+msgstr "Промяна на момент на ключов кадър (Анимация)"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr ""
+msgstr "Промяна на вид преход (Анимация)"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr ""
+msgstr "Промяна на трансформация (Анимация)"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr ""
+msgstr "Промяна на стойност на ключов кадър (Анимация)"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr ""
+msgstr "Промяна на повикана функция (Анимация)"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Time"
@@ -190,18 +188,17 @@ msgid "Anim Multi Change Call"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "Промени Името на Анимацията:"
+msgstr "Промяна на продължителността на анимацията"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "Промени анимационния цикъл"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Път за промяна на свойството"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
@@ -224,24 +221,20 @@ msgid "Animation Playback Track"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (frames)"
-msgstr "Ново Име на Анимация:"
+msgstr "Продължителност на анимацията (в кадри)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
-msgstr "Промени Името на Анимацията:"
+msgstr "Продължителност на анимацията (в секунди)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Добавяне на нови пътечки."
+msgstr "Добавяне на пътечка"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Изтриване на анимацията?"
+msgstr "Повтаряне на анимацията"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -277,14 +270,12 @@ msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
msgstr "Премахване на пътечката."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Стъпка (сек.):"
+msgstr "Време (сек): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
@@ -333,29 +324,24 @@ msgid "Insert Key"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Направи дупликат на Key(s)"
+msgstr "Дублиране на ключа/ключовете"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Изтрий Key(s)"
+msgstr "Изтриване на ключа/ключовете"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
-msgstr "Промени Името на Анимацията:"
+msgstr "Промяна на режима на обновяване на анимацията"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "Промени Името на Анимацията:"
+msgstr "Промяна на режима на интерполиране на анимацията"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "Промени Името на Анимацията:"
+msgstr "Промяна на режима на повтаряне на анимацията"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -363,7 +349,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr ""
+msgstr "Създаване на НОВА пътечка за %s и вмъкване на ключ?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
@@ -402,14 +388,12 @@ msgid "Anim Insert Key"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "Промени Името на Анимацията:"
+msgstr "Промяна на стъпката на анимацията"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "Поставяне на възелите"
+msgstr "Пренареждане на пътечките"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
@@ -440,9 +424,8 @@ msgid "Invalid track for Bezier (no suitable sub-properties)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "Добавяне на нови пътечки."
+msgstr "Добавяне на нова пътечка на Безие"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -457,18 +440,16 @@ msgid "Add Transform Track Key"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "Добавяне на нови пътечки."
+msgstr "Добавяне на ключ за пътечката"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "Добавяне на нови пътечки."
+msgstr "Добавяне на ключ за пътечка с метод"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
@@ -483,9 +464,8 @@ msgid "Clipboard is empty"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Поставяне на възелите"
+msgstr "Поставяне на пътечки"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -526,20 +506,19 @@ msgid "Group tracks by node or display them as plain list."
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "Стъпка (сек.):"
+msgstr "Прилепване:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Изтриване на анимацията?"
+msgstr "Стойност за стъпката на анимацията."
#: editor/animation_track_editor.cpp
msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -555,7 +534,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation properties."
-msgstr "Характеристики на анимацията."
+msgstr "Свойства на анимацията."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
@@ -579,17 +558,15 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
-msgstr "Изтрий Селекцията"
+msgstr "Изтриване на избраното"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "Отиди на Следваща Стъпка"
+msgstr "Преминаване към следващата стъпка"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "Отиди на Предишна Стъпка"
+msgstr "Преминаване към предходната стъпка"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -601,7 +578,7 @@ msgstr "Почистване на анимацията"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr "Избери възелa, който да бъде анимиран:"
+msgstr "Изберете възелa, който да бъде анимиран:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
@@ -625,7 +602,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Optimize"
-msgstr "Оптимизирай"
+msgstr "Оптимизиране"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
@@ -652,9 +629,8 @@ msgid "Scale Ratio:"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "Изберете свойство"
+msgstr "Изберете пътечки за копиране"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -666,14 +642,12 @@ msgid "Copy"
msgstr "Копиране"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "Избиране на всичко"
+msgstr "Избиране на всичко/нищо"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "Добавяне на нови пътечки."
+msgstr "Добавяне на аудио клип"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -697,25 +671,24 @@ msgstr ""
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "Отиди на Ред"
+msgstr "Преминаване към ред"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr "Номер на Реда:"
+msgstr "Номер на реда:"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Replaced %d occurrence(s)."
-msgstr "Готово - %d заместване(ния)."
+msgid "%d replaced."
+msgstr "Замяна..."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "Няма Съвпадения"
+msgstr "%d съвпадения."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -723,19 +696,19 @@ msgstr ""
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr "Цели Думи"
+msgstr "Цели думи"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr "Преименувай"
+msgstr "Замяна"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr "Преименувай Всички"
+msgstr "Замяна на всички"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr "Само Селекцията"
+msgstr "Само избраното"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
@@ -743,21 +716,20 @@ msgid "Standard"
msgstr ""
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Scripts Panel"
-msgstr "Видимост на Панела със Скриптове"
+msgstr "Превключване на панела за скриптове"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "Приближи"
+msgstr "Приближаване"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "Отдалечи"
+msgstr "Отдалечаване"
#: editor/code_editor.cpp
msgid "Reset Zoom"
@@ -776,36 +748,36 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "Изрязване на възелите"
+msgstr "Свързване към възел:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "Свържи Сигнала: "
+msgstr "Свързване към скрипт:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "Свържи Сигнала: "
+msgstr "От сигнал:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Scene does not contain any script."
-msgstr "Възелът не съдържа геометрия."
+msgstr "Сцената не съдържа скриптове."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr "Добави"
+msgstr "Добавяне"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
@@ -816,7 +788,7 @@ msgstr "Добави"
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr "Премахни"
+msgstr "Премахване"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
@@ -827,9 +799,8 @@ msgid "Extra Call Arguments:"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "Изберете метод"
+msgstr "Метод-получател:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -853,15 +824,13 @@ msgid "Disconnects the signal after its first emission."
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "Свържи Сигнала: "
+msgstr "Сигналът не може да бъде свързан"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -874,43 +843,40 @@ msgstr "Затваряне"
#: editor/connections_dialog.cpp
msgid "Connect"
-msgstr "Свържи"
+msgstr "Свързване"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "Настройки на редактора"
+msgstr "Сигнал:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr "Свържи '%s' с '%s'"
+msgstr "Свързване на „%s“ с „%s“"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr "Разкачи '%s' от '%s'"
+msgstr "Разкачване на „%s“ от „%s“"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr "Разкачи всички сигнали: '%s'"
+msgstr "Разкачване на всички от сигнала: „%s“"
#: editor/connections_dialog.cpp
msgid "Connect..."
-msgstr "Свържи..."
+msgstr "Свързване…"
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr "Разкачи"
+msgstr "Разкачване"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "Свържи Сигнала: "
+msgstr "Свързване на сигнала към метод"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "Промени Връзката: "
+msgstr "Редактиране на Връзката:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
@@ -921,22 +887,25 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Поставяне на възелите"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
#: editor/connections_dialog.cpp
msgid "Disconnect All"
-msgstr "Разкачи Всички"
+msgstr "Разкачване на всички"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Изнасяне..."
+msgstr "Редактиране..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Методи"
+msgstr "Преминаване към метода"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -948,7 +917,7 @@ msgstr ""
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr "Създайте нов/а %s"
+msgstr "Създаване на %s"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
@@ -957,10 +926,10 @@ msgstr "Любими:"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
msgid "Recent:"
-msgstr "Скорошни:"
+msgstr "Последни:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Търсене:"
@@ -969,7 +938,7 @@ msgstr "Търсене:"
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr "Съвпадащи:"
+msgstr "Съвпадения:"
#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
@@ -1037,16 +1006,16 @@ msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
-msgstr "Отвори"
+msgstr "Отваряне"
#: editor/dependency_editor.cpp
msgid "Owners Of:"
msgstr ""
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "Премахни селектираните файлове от проекта? (необратимо)"
+msgstr ""
+"Да се премахнат ли избраните файлове от проекта? (Действието е необратимо)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1064,13 +1033,12 @@ msgid "Error loading:"
msgstr "Грешка при зареждане:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "Сцената не успя да се зареди заради липсващи зависимости:"
+msgstr "Зареждането беше неуспешно заради липсващи зависимости:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
-msgstr "Отвори Въпреки това"
+msgstr "Отваряне въпреки това"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
@@ -1078,7 +1046,7 @@ msgstr "Кое действие да се изпълни?"
#: editor/dependency_editor.cpp
msgid "Fix Dependencies"
-msgstr "Поправи Зависимостите"
+msgstr "Поправяне на зависимостите"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
@@ -1089,9 +1057,8 @@ msgid "Permanently delete %d item(s)? (No undo!)"
msgstr ""
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "Зависимости"
+msgstr "Показване на зависимостите"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
@@ -1103,7 +1070,7 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr "Изтрий"
+msgstr "Изтриване"
#: editor/dependency_editor.cpp
msgid "Owns"
@@ -1123,7 +1090,7 @@ msgstr ""
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
-msgstr "Благодаря! От общността на Godot!"
+msgstr "Благодарности от общността на Godot!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
@@ -1134,10 +1101,12 @@ msgid "Project Founders"
msgstr "Основатели на проекта"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Lead Developer"
-msgstr "Главен Разработчик"
+msgstr "Главен разработчик"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Ръководител на проекта "
@@ -1159,6 +1128,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1211,22 +1188,20 @@ msgid "Error opening package file, not in ZIP format."
msgstr ""
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "Група с това име вече съществува."
+msgstr "%s (Вече съществува)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr "Разархивиране на активи"
+msgstr "Разархивиране на ресурсите"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
msgstr ""
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "Неуспешно създаване на папка."
+msgstr "И още %s файл(а)."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
@@ -1238,9 +1213,8 @@ msgid "Success!"
msgstr "Готово!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "Съдържание:"
+msgstr "Съдържание на пакета:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1341,7 +1315,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr "Изтриване звуковата шина"
+msgstr "Изтриване на звуковата шина"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
@@ -1380,9 +1354,8 @@ msgid "Invalid file, not an audio bus layout."
msgstr ""
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Грешка при записването на файла!"
+msgstr "Грешка при запазването на файла: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
@@ -1466,7 +1439,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1474,19 +1447,9 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "невалидно име на Група."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-#, fuzzy
-msgid "Not in resource path."
-msgstr "Обектът не е базиран на ресурсен файл"
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1513,6 +1476,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Обновяване на сцената"
@@ -1534,13 +1501,12 @@ msgid "[unsaved]"
msgstr ""
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first."
-msgstr "Моля, първо изберете основна папка"
+msgstr "Моля, първо изберете основна папка."
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
-msgstr "Избери Директория"
+msgstr "Изберете папка"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
@@ -1558,11 +1524,11 @@ msgstr "Име:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr "Неуспешно създаване на папка."
+msgstr "Папката не може да бъде създадена."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr "Избери"
+msgstr "Избиране"
#: editor/editor_export.cpp
msgid "Storing File:"
@@ -1617,38 +1583,33 @@ msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "Нова сцена"
+msgstr "3-измерен редактор"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "Отвори Кодов Редактор"
+msgstr "Редактор на скриптове"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Asset Library"
-msgstr "Отваряне на библиотеката"
+msgstr "Библиотека с ресурси"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Scene Tree Editing"
-msgstr "Настройки за пускане на сцена"
+msgstr "Редактиране на дървото на сцената"
#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "Внасяне"
+msgid "Node Dock"
+msgstr "Панел за възлите"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Node Dock"
-msgstr "Режим на Преместване"
+msgid "FileSystem Dock"
+msgstr "Показване във файловата система"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr ""
+msgid "Import Dock"
+msgstr "Панел за внасяне"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1659,46 +1620,40 @@ msgid "Profile must be a valid filename and must not contain '.'"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Profile with this name already exists."
-msgstr "Вече съществува файл или папка с това име."
+msgstr "Вече съществува профил с това име."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "Изберете свойство"
+msgstr "(Свойствата са заключени)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "Изключено"
+msgstr "(Редакторът е заключен)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "Описание:"
+msgstr "Настройки на класа:"
#: editor/editor_feature_profile.cpp
msgid "Enable Contextual Editor"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "Поставяне на възелите"
+msgstr "Включени свойства:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Classes:"
-msgstr "Търси Класове"
+msgstr "Включени класове:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
@@ -1711,18 +1666,16 @@ msgid ""
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "Грешка при зареждането на шрифта."
+msgstr "Грешка при запазването на профила в: „%s“."
#: editor/editor_feature_profile.cpp
msgid "Unset"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "Избиране на текущата папка"
+msgstr "Текущ профил:"
#: editor/editor_feature_profile.cpp
msgid "Make Current"
@@ -1744,38 +1697,32 @@ msgid "Export"
msgstr "Изнасяне"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "Поставяне на възелите"
+msgstr "Налични профили:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "Описание"
+msgstr "Настройки на класа"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "New profile name:"
-msgstr "Ново име:"
+msgstr "Ново име на профила:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "Изтрий точки."
+msgstr "Изтриване на профила"
#: editor/editor_feature_profile.cpp
msgid "Godot Feature Profile"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Import Profile(s)"
-msgstr "Внесен проект"
+msgstr "Внасяне на профил(и)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Export Profile"
-msgstr "Изнасяне на проекта"
+msgstr "Изнасяне на профила"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
@@ -1790,57 +1737,54 @@ msgid "File Exists, Overwrite?"
msgstr "Файлът съществува. Искате ли да го презапишете?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Изберете метод"
+msgstr "Избиране на тази папка"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "Диспечер на проектите"
+msgstr "Отваряне във файловия мениджър"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Покажи във Файлов Мениджър"
+msgstr "Показване във файловия мениджър"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
msgstr "Нова папка..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
-msgstr "Всички Разпознати"
+msgstr "Всички разпознати"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr "Всички Файлове (*)"
+msgstr "Всички файлове (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
-msgstr "Отвори Файл"
+msgstr "Отваряне на файл"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr "Отвори Файл(ове)"
+msgstr "Отваряне на файл(ове)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
-msgstr "Отвори Директория"
+msgstr "Отваряне на папка"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File or Directory"
-msgstr "Отвори Файл или Директория"
+msgstr "Отваряне на файл или папка"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/editor_properties.cpp editor/inspector_dock.cpp
@@ -1867,11 +1811,11 @@ msgstr ""
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "Покажи Скрити Файлове"
+msgstr "Превключване на скритите файлове"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "Покажи Любими"
+msgstr "Превключване на любимите"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
@@ -1890,34 +1834,28 @@ msgid "Move Favorite Down"
msgstr ""
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Към горната папка"
+msgstr "Преминаване към горната папка."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Към горната папка"
+msgstr "Преминаване към горната папка."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "Към горната папка"
+msgstr "Преминаване към горната папка."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Търсене"
+msgstr "Опресняване на файловете."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "Неуспешно създаване на папка."
+msgstr "Добавяне/премахване на текущата папка в любимите."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "Покажи Скрити Файлове"
+msgstr "Превключване на видимостта на скритите файлове."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -1933,7 +1871,7 @@ msgstr "Папки и файлове:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -1957,7 +1895,7 @@ msgstr ""
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr "Извършва се повторно внасяне"
+msgstr "(Повторно) внасяне на ресурсите"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
@@ -1977,9 +1915,8 @@ msgid "Inherited by:"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Описание:"
+msgstr "Описание"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -2002,9 +1939,8 @@ msgid "Methods"
msgstr "Методи"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Поставяне на възелите"
+msgstr "Свойства на темата"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2015,14 +1951,12 @@ msgid "Constants"
msgstr "Константи"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Кратко Описание:"
+msgstr "Описания на свойствата"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Стойност"
+msgstr "(стойност)"
#: editor/editor_help.cpp
msgid ""
@@ -2031,9 +1965,8 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Описание"
+msgstr "Описания на методите"
#: editor/editor_help.cpp
msgid ""
@@ -2044,84 +1977,71 @@ msgstr ""
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr "Търси в Помощ"
+msgstr "Търсене в помощната информация"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Case Sensitive"
-msgstr "Затваряне на сцената"
+msgstr "Чувствителност към регистъра"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "Търсене"
+msgstr "Показване на йерархията"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Преименувай Всички"
+msgstr "Показване на всичко"
#: editor/editor_help_search.cpp
msgid "Classes Only"
msgstr ""
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Методи"
+msgstr "Само методи"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Само Селекцията"
+msgstr "Само сигнали"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Константи"
+msgstr "Само константи"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Изберете свойство"
+msgstr "Само свойства"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Изберете свойство"
+msgstr "Само свойства на теми"
#: editor/editor_help_search.cpp
msgid "Member Type"
msgstr ""
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Клас:"
+msgstr "Клас"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "Методи"
+msgstr "Метод"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "Настройки на редактора"
+msgstr "Сигнал"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr "Постоянно"
+msgstr "Константа"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "Изберете свойство"
+msgstr "Свойство"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "Поставяне на възелите"
+msgstr "Свойство на тема"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2140,9 +2060,8 @@ msgid "Output:"
msgstr ""
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Нова сцена"
+msgstr "Копиране на избраното"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2155,9 +2074,8 @@ msgid "Clear"
msgstr "Изчистване"
#: editor/editor_log.cpp
-#, fuzzy
msgid "Clear Output"
-msgstr "Нова сцена"
+msgstr "Изчистване на изхода"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2174,9 +2092,8 @@ msgid "%s/s"
msgstr ""
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "Премести Надоло"
+msgstr "Надолу"
#: editor/editor_network_profiler.cpp
msgid "Up"
@@ -2231,11 +2148,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr "Файлът не може да бъде отворен за записване:"
+msgstr "Файлът не може да бъде отворен за запис:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr "Форматът на избрания файл е неразпознат:"
+msgstr "Форматът на избрания файл е непознат:"
#: editor/editor_node.cpp
msgid "Error while saving."
@@ -2251,7 +2168,7 @@ msgstr "Грешка при анализа на „%s“."
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr "Неочакван край на файла '%s'."
+msgstr "Неочакван край на файла „%s“."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
@@ -2267,7 +2184,7 @@ msgstr "Запазване на сцената"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr "Анализира се"
+msgstr "Анализиране"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
@@ -2364,11 +2281,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Сегашната сцена никога не е била запазена, моля, запазете я преди изпълнение."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2381,9 +2293,8 @@ msgid "Open Base Scene"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "Бързо отваряне на сцена..."
+msgstr "Бързо отваряне..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2402,9 +2313,8 @@ msgid "Save changes to '%s' before closing?"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "Неуспешно зареждане на ресурсите."
+msgstr "%s променени ресурса бяха запазени."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
@@ -2424,7 +2334,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr "Тази сцена не е била запазвана преди. Запази преди да пуснеш?"
+msgstr "Тази сцена не е била запазвана преди. Запазване преди изпълнението?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
@@ -2448,18 +2358,21 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr "Текущата сцена не е запазена. Отвори въпреки това?"
+msgstr "Текущата сцена не е запазена. Отваряне въпреки това?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr "Сцена, която никога не е била запазвана, не може да се презареди."
+msgstr "Сцена, която никога не е била запазвана, не може да бъде презаредена."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Запазване на сцената"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2475,9 +2388,8 @@ msgid "Exit the editor?"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Manager?"
-msgstr "Диспечер на проектите"
+msgstr "Да се отвори ли мениджърът на проекти?"
#: editor/editor_node.cpp
msgid "Save & Quit"
@@ -2506,9 +2418,8 @@ msgid "Close Scene"
msgstr "Затваряне на сцената"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "Затваряне на сцената"
+msgstr "Повторно отваряне на затворена сцена"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2519,9 +2430,8 @@ msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Unable to load addon script from path: '%s'."
-msgstr "Грешка при зареждането на шрифта."
+msgstr "Не може да се зареди скриптът на добавка от: „%s“."
#: editor/editor_node.cpp
msgid ""
@@ -2552,12 +2462,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Scene '%s' has broken dependencies:"
-msgstr "Сцената '%s' има нарушени зависимости:"
+msgstr "Сцената „%s“ има нарушени зависимости:"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Clear Recent Scenes"
-msgstr "Затваряне на сцената"
+msgstr "Изчистване на последните сцени"
#: editor/editor_node.cpp
msgid ""
@@ -2595,24 +2504,20 @@ msgstr ""
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "Покажи във Файлова Система"
+msgstr "Показване във файловата система"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Възпроизвеждане на сцената"
+msgstr "Пускане на сцената"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Затваряне"
+msgstr "Затваряне на раздела"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "Затваряне"
+msgstr "Отмяна на затварянето на раздела"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2623,9 +2528,8 @@ msgid "Close Tabs to the Right"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "Затваряне на всичко"
+msgstr "Затваряне на всички раздели"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2636,9 +2540,8 @@ msgid "%d more files or folders"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "%d more folders"
-msgstr "Неуспешно създаване на папка."
+msgstr "Още %d папки"
#: editor/editor_node.cpp
msgid "%d more files"
@@ -2657,9 +2560,8 @@ msgid "Toggle distraction-free mode."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Add a new scene."
-msgstr "Добавяне на нови пътечки."
+msgstr "Добавяне на нови нова сцена."
#: editor/editor_node.cpp
msgid "Scene"
@@ -2670,17 +2572,16 @@ msgid "Go to previously opened scene."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Копиране"
+msgstr "Копиране на текста"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr "Следващ подпрозорец"
+msgstr "Следващ раздел"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "Предишен подпрозорец"
+msgstr "Предишен раздел"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -2711,7 +2612,6 @@ msgid "Save Scene"
msgstr "Запазване на сцената"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Запазване на всички сцени"
@@ -2738,10 +2638,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2751,14 +2647,12 @@ msgid "Project"
msgstr "Проект"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "Настройки на проекта"
+msgstr "Настройки на проекта..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "Версия:"
+msgstr "Контрол на версиите"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
@@ -2769,22 +2663,20 @@ msgid "Shut Down Version Control"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "Изнасяне"
+msgstr "Изнасяне..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Диспечер на проектите"
+msgstr "Отваряне на папката с данни на проекта"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
-msgstr "Сечива"
+msgstr "Инструменти"
#: editor/editor_node.cpp
msgid "Orphan Resource Explorer..."
@@ -2792,12 +2684,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "Изход до списъка с проекти"
+msgstr "Изход към списъка с проекти"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr "Отстраняване на грешки"
+msgstr "Дебъгване"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
@@ -2805,22 +2697,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2829,8 +2725,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2839,32 +2735,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2872,55 +2768,48 @@ msgid "Editor"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "Настройки на редактора"
+msgstr "Настройки на редактора..."
#: editor/editor_node.cpp
msgid "Editor Layout"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "Запазване на сцената"
+msgstr "Заснемане на екрана"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "Настройки на редактора"
+msgstr "Снимките на екрана се пазят в папката с данни/настройки на редактора."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "Покажи Любими"
+msgstr "Превключване на системната конзола"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Настройки на редактора"
+msgstr "Отваряне на папката с данни/настройки на редактора"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Настройки на редактора"
+msgstr "Отваряне на папката с настройки на редактора"
#: editor/editor_node.cpp
msgid "Manage Editor Features..."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "Шаблони"
+msgstr "Управление на шаблоните за изнасяне..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2931,7 +2820,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Търсене"
@@ -2945,7 +2834,12 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Повторно внасяне"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -2958,7 +2852,7 @@ msgstr "Относно"
#: editor/editor_node.cpp
msgid "Play the project."
-msgstr "Възпроизвеждане на проекта."
+msgstr "Пускане на проекта."
#: editor/editor_node.cpp
msgid "Play"
@@ -2970,7 +2864,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr "Преустановяване на сцената"
+msgstr "Спиране на сцената на пауза"
#: editor/editor_node.cpp
msgid "Stop the scene."
@@ -2978,19 +2872,19 @@ msgstr "Спиране на сцената."
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr "Възпроизвеждане на редактирана сцена."
+msgstr "Пускане на редактираната сцена."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr "Възпроизвеждане на сцената"
+msgstr "Пускане на сцената"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr "Възпроизвеждане на сцена по избор"
+msgstr "Пускане на персонализирана сцена"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Възпроизвеждане на сцена по избор"
+msgstr "Пускане на персонализирана сцена"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
@@ -2998,9 +2892,8 @@ msgstr ""
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Запазване и повторно внасяне"
+msgstr "Запазване и рестартиране"
#: editor/editor_node.cpp
msgid "Spins when the editor window redraws."
@@ -3028,7 +2921,7 @@ msgstr "Инспектор"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Разшири Долния Панел"
+msgstr "Разширяване на долния панел"
#: editor/editor_node.cpp
msgid "Output"
@@ -3036,16 +2929,15 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Don't Save"
-msgstr "Не Запазвай"
+msgstr "Без запазване"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "Шаблони"
+msgstr "Управление на шаблоните"
#: editor/editor_node.cpp
msgid ""
@@ -3071,9 +2963,8 @@ msgid "Import Templates From ZIP File"
msgstr "Внасяне на шаблони от архив във формат ZIP"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Шаблони"
+msgstr "Пакет с шаблони"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3110,11 +3001,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "Отвори Кодов Редактор"
+msgstr "Отваряне на редактора на скриптове"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr "Отваряне на библиотеката"
+msgstr "Отваряне на библиотеката с ресурсите"
#: editor/editor_node.cpp
msgid "Open the next Editor"
@@ -3125,9 +3016,8 @@ msgid "Open the previous Editor"
msgstr ""
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "Предупреждения:"
+msgstr "Внимание!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
@@ -3142,14 +3032,12 @@ msgid "Thumbnail..."
msgstr ""
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "Нова сцена"
+msgstr "Основен скрипт:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Приставки"
+msgstr "Редактиране на приставката"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -3217,9 +3105,8 @@ msgid "Calls"
msgstr ""
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Файл:"
+msgstr "Редактиране на текста:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3274,9 +3161,8 @@ msgid "New Script"
msgstr "Нов скрипт"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Нова сцена"
+msgstr "Разширяване на скрипта"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
@@ -3326,9 +3212,8 @@ msgid "New Key:"
msgstr ""
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Стойност"
+msgstr "Нова стойност:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
@@ -3337,7 +3222,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3364,6 +3250,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3381,18 +3271,16 @@ msgid "Import From Node:"
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Redownload"
-msgstr "Презареди"
+msgstr "Повторно сваляне"
#: editor/export_template_manager.cpp
msgid "Uninstall"
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "(Installed)"
-msgstr "Инсталирани приставки:"
+msgstr "(Инсталирано)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3432,9 +3320,8 @@ msgid "No version.txt found inside templates."
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error creating path for templates:"
-msgstr "Имаше грешка при изнасяне на проекта!"
+msgstr "Грешка при създаването на път за шаблоните:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
@@ -3445,9 +3332,8 @@ msgid "Importing:"
msgstr "Внасяне:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error getting the list of mirrors."
-msgstr "Имаше грешка при изнасяне на проекта!"
+msgstr "Грешка при получаването на списъка от огледални местоположения."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
@@ -3475,9 +3361,8 @@ msgid "No response."
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Request Failed."
-msgstr "Запитване..."
+msgstr "Заявката беше неуспешна."
#: editor/export_template_manager.cpp
msgid "Redirect Loop."
@@ -3493,9 +3378,8 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "Не може да се премахне:"
+msgstr "Временният файл не може да бъде премахнат:"
#: editor/export_template_manager.cpp
msgid ""
@@ -3504,14 +3388,12 @@ msgid ""
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "Имаше грешка при внасянето:"
+msgstr "Грешка при заявката за адрес:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connecting to Mirror..."
-msgstr "Свързване..."
+msgstr "Свързване с огледалното местоположение..."
#: editor/export_template_manager.cpp
msgid "Disconnected"
@@ -3531,14 +3413,12 @@ msgid "Connecting..."
msgstr "Свързване..."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Can't Connect"
-msgstr "Създаване на нов проект"
+msgstr "Не може да се установи връзка"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connected"
-msgstr "Изрязване на възелите"
+msgstr "Свързан"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3550,27 +3430,24 @@ msgid "Downloading"
msgstr "Изтегляне"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connection Error"
-msgstr "Свързване..."
+msgstr "Грешка във връзката"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "Разархивиране на активи"
+msgstr "Разархивиране на изходния код на компилацията за Андроид"
#: editor/export_template_manager.cpp
msgid "Current Version:"
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Installed Versions:"
-msgstr "Инсталирани приставки:"
+msgstr "Инсталирани версии:"
#: editor/export_template_manager.cpp
msgid "Install From File"
@@ -3581,32 +3458,28 @@ msgid "Remove Template"
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
-msgstr "Избиране на всичко"
+msgstr "Избор на шаблонен файл"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Шаблони"
+msgstr "Шаблони за изнасяне на Godot"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Download Templates"
-msgstr "Шаблони"
+msgstr "Сваляне на шаблони"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Любими:"
+msgstr "Любими"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -3621,19 +3494,16 @@ msgid "Cannot move a folder into itself."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error moving:"
-msgstr "Имаше грешка при внасянето:"
+msgstr "Грешка при преместването:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error duplicating:"
-msgstr "Имаше грешка при внасянето:"
+msgstr "Грешка при дублирането:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Unable to update dependencies:"
-msgstr "Сцената '%s' има нарушени зависимости:"
+msgstr "Зависимостите не могат да бъдат обновени:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
@@ -3652,18 +3522,16 @@ msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Renaming file:"
-msgstr "Имаше грешка при внасянето:"
+msgstr "Преименуване на файла:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating file:"
-msgstr "Имаше грешка при внасянето:"
+msgstr "Дублиране на файла:"
#: editor/filesystem_dock.cpp
msgid "Duplicating folder:"
@@ -3675,28 +3543,24 @@ msgid "New Inherited Scene"
msgstr "Нов скрипт"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Изберете главна сцена"
+msgstr "Задаване като главна сцена"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Отваряне на сцена"
+msgstr "Отваряне на сцените"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "Любими:"
+msgstr "Добавяне в любимите"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "Премахни Всички Breakpoint-ове"
+msgstr "Премахване от любимите"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3719,19 +3583,16 @@ msgid "Move To..."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "Нова сцена"
+msgstr "Нова сцена..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "Нов скрипт"
+msgstr "Нов скрипт..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Нова папка..."
+msgstr "Нов ресурс..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
@@ -3740,9 +3601,8 @@ msgstr ""
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "Затваряне на всичко"
+msgstr "Свиване на всичко"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3752,28 +3612,24 @@ msgid "Rename"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "Предишен подпрозорец"
+msgstr "Предишна папка/файл"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "Създаване на папка"
+msgstr "Следваща папка/файл"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle Split Mode"
-msgstr "Покажи Любими"
+msgstr "Превключване на разделения режим"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "Търсене"
+msgstr "Търсене на файлове"
#: editor/filesystem_dock.cpp
msgid ""
@@ -3794,33 +3650,28 @@ msgid "Overwrite"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "Запазване на сцената"
+msgstr "Създаване на сцена"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "Намери във файлове"
+msgstr "Търсене във файловете"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Намери: "
+msgstr "Търсене:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Папка: "
+msgstr "Папка:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Поставяне на възелите"
+msgstr "Филтри:"
#: editor/find_in_files.cpp
msgid ""
@@ -3831,11 +3682,11 @@ msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr "Намери..."
+msgstr "Търсене..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
-msgstr "Замести..."
+msgstr "Замяна..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
@@ -3843,20 +3694,19 @@ msgstr "Отказ"
#: editor/find_in_files.cpp
msgid "Find: "
-msgstr "Намери: "
+msgstr "Търсене: "
#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Замести: "
+msgstr "Замяна: "
#: editor/find_in_files.cpp
msgid "Replace all (no undo)"
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Търсене"
+msgstr "Търсене..."
#: editor/find_in_files.cpp
msgid "Search complete"
@@ -3871,24 +3721,20 @@ msgid "Remove from Group"
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "Група с това име вече съществува."
+msgstr "Вече съществува група с това име."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "невалидно име на Група."
+msgstr "Неправилно име на група."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "Нов проект"
+msgstr "Преименуване на групата"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "Избиране на всичко"
+msgstr "Изтриване на групата"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3900,9 +3746,8 @@ msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Filter nodes"
-msgstr "Поставяне на възелите"
+msgstr "Филтриране на възлите"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
@@ -3913,63 +3758,52 @@ msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "Отвори Кодов Редактор"
+msgstr "Редактор на групи"
#: editor/groups_editor.cpp
msgid "Manage Groups"
msgstr ""
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import as Single Scene"
-msgstr "Внасяне на сцената..."
+msgstr "Внасяне като самостоятелна сцена"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Animations"
-msgstr "Внеси с Анимации поотделно"
+msgstr "Внасяне с отделени анимации"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Materials"
-msgstr "Внеси с Материалите поотделно"
+msgstr "Внасяне с отделени материали"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Objects"
-msgstr "Внеси с Обектите поотделно"
+msgstr "Внасяне с отделени обекти"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Objects+Materials"
-msgstr "Внеси с Обектите и Материалите поотделно"
+msgstr "Внасяне с отделени обекти и материали"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Objects+Animations"
-msgstr "Внеси с Обектите и Анимациите поотделно"
+msgstr "Внасяне с отделени обекти и анимации"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Materials+Animations"
-msgstr "Внеси с Материалите и Анимациите поотделно"
+msgstr "Внасяне с отделени материали и анимации"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "Внеси с Обектите, Материалите и Анимациите поотделно"
+msgstr "Внасяне с отделени обекти, материали и анимации"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import as Multiple Scenes"
-msgstr "Внеси като Няколко Сцени"
+msgstr "Внасяне като няколко сцени"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import as Multiple Scenes+Materials"
-msgstr "Внеси като Няколко Сцени и Материали"
+msgstr "Внасяне като няколко сцени и материали"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
@@ -4005,23 +3839,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Запазване..."
#: editor/import_dock.cpp
-#, fuzzy
-msgid "Set as Default for '%s'"
-msgstr "Задай по Подразбиране за '%s'"
+msgid "%d Files"
+msgstr "%d Файлове"
#: editor/import_dock.cpp
-#, fuzzy
-msgid "Clear Default for '%s'"
-msgstr "Изчисти по Подразбиране за '%s'"
+msgid "Set as Default for '%s'"
+msgstr "Задаване по подразбиране за „%s“"
#: editor/import_dock.cpp
-#, fuzzy
-msgid " Files"
-msgstr "Файл:"
+msgid "Clear Default for '%s'"
+msgstr "Изчистване на подразбирането за „%s“"
#: editor/import_dock.cpp
msgid "Import As:"
@@ -4036,7 +3871,7 @@ msgid "Reimport"
msgstr "Повторно внасяне"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4049,33 +3884,27 @@ msgid ""
msgstr ""
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Failed to load resource."
-msgstr "Неуспешно зареждане на ресурсите."
+msgstr "Ресурсът не може да бъде зареден."
#: editor/inspector_dock.cpp
msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "Поставяне на възелите"
+msgstr "Свиване на всички свойства"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Save As..."
-msgstr "Запази Като..."
+msgstr "Запазване като..."
#: editor/inspector_dock.cpp
msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4092,9 +3921,8 @@ msgid "Make Sub-Resources Unique"
msgstr ""
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Open in Help"
-msgstr "Отвори в Помощника"
+msgstr "Отваряне в помощната информация"
#: editor/inspector_dock.cpp
msgid "Create a new resource in memory and edit it."
@@ -4118,17 +3946,15 @@ msgstr ""
#: editor/inspector_dock.cpp
msgid "History of recently edited objects."
-msgstr ""
+msgstr "История на последно редактираните обекти."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Object properties."
-msgstr "Характеристики на обекта."
+msgstr "Свойства на обекта."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Поставяне на възелите"
+msgstr "Филтриране на свойствата"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -4143,71 +3969,62 @@ msgid "Select a single node to edit its signals and groups."
msgstr ""
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Приставки"
+msgstr "Редактиране на приставка"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Създаване"
+msgstr "Създаване на приставка"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Приставки"
+msgstr "Име на приставката:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
msgstr "Подпапка:"
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Внасяне на езици:"
+msgstr "Език:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Име:"
+msgstr "Име на скрипта:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr "Активирай сега?"
+msgstr "Активиране сега?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "Създаване на папка"
+msgstr "Създаване на полигон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create points."
-msgstr "Създай точки."
+msgstr "Създаване на точки."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid ""
"Edit points.\n"
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
-"Промени съществуващ полигон:\n"
-"LMB: Премести Точка.\n"
-"Ctrl+LMB: Раздели Сегмент.\n"
-"RMB: Изтрии Точка."
+"Редактиране на точки.\n"
+"Ляв бутон на мишката: преместване на точката\n"
+"Ctrl+ляв бутон: Изтриване на точката"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Erase points."
-msgstr "Изтрий точки."
+msgstr "Изтриване на точки."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
-msgstr "Приставки"
+msgstr "Редактиране на полигона"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
@@ -4218,9 +4035,8 @@ msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Remove Polygon And Point"
-msgstr "Преместване на Полигон"
+msgstr "Премахване на полигона и точката"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4228,21 +4044,19 @@ msgstr "Преместване на Полигон"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Animation"
-msgstr "Добави Анимация"
+msgstr "Добавяне не анимация"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load..."
-msgstr "Зареди..."
+msgstr "Зареждане..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "LMB: Премести Точка."
+msgstr "Преместване на точката на възела"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Limits"
@@ -4260,20 +4074,17 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "Добави Възел..."
+msgstr "Добавяне на точка за възел"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "Добави Анимация"
+msgstr "Добавяне на точки за анимация"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace1D Point"
-msgstr "Преместване на Полигон"
+msgstr "Премахване на точка на BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
@@ -4295,9 +4106,8 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Select and move points, create points with RMB."
-msgstr "Селектирай и мести точки, създай точки с RMB."
+msgstr "Избиране и преместване на точки; създаване на точки с десен бутон."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
@@ -4312,27 +4122,23 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Нова сцена"
+msgstr "Отваряне на редактора"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Отвори Анимационен Възел"
+msgstr "Отваряне на възела за анимация"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "Група с това име вече съществува."
+msgstr "Триъгълникът вече съществува."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "Добавяне на нови пътечки."
+msgstr "Добавяне на триъгълник"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Limits"
@@ -4343,27 +4149,24 @@ msgid "Change BlendSpace2D Labels"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace2D Point"
-msgstr "Преместване на Полигон"
+msgstr "Преместване на точка на BlendSpace2D"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr "BlendSpace2D не принадлежи на възел тип AnimationTree."
+msgstr "BlendSpace2D не принадлежи на възел от тип AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Toggle Auto Triangles"
-msgstr "Покажи Любими"
+msgstr "Превключване на автоматичните триъгълници"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
@@ -4388,9 +4191,8 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filters"
-msgstr "Промени Филтрите"
+msgstr "Редактиране на филтрите"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
@@ -4402,9 +4204,8 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Node Moved"
-msgstr "Режим на Преместване"
+msgstr "Възелът е преместен"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
@@ -4412,26 +4213,22 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Connected"
-msgstr "Изрязване на възелите"
+msgstr "Възлите са свързани"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Disconnected"
-msgstr "Разкачи"
+msgstr "Възлите са разкачени"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "Ново Име на Анимация:"
+msgstr "Задаване на анимация"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Node"
-msgstr "Избиране на всичко"
+msgstr "Изтриване на възела"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
@@ -4439,9 +4236,8 @@ msgid "Delete Node(s)"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "Покажи Любими"
+msgstr "Превключване на филтъра ВКЛ/ИЗКЛ"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Change Filter"
@@ -4467,37 +4263,31 @@ msgid "Anim Clips"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "Добавяне на нови пътечки."
+msgstr "Аудио клипове"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Отиди на Ред"
+msgstr "Функции"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Renamed"
-msgstr "Възел"
+msgstr "Възелът е преименуван"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Node..."
-msgstr "Добави Възел..."
+msgstr "Добавяне на възел..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Файл:"
+msgstr "Редактиране на филтрираните пътечки:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable Filtering"
-msgstr "Позволи филтриране"
+msgstr "Включване на филтрирането"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4505,7 +4295,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr "Ново Име на Анимация:"
+msgstr "Ново име на анимацията:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
@@ -4513,7 +4303,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr "Промени Името на Анимацията:"
+msgstr "Промяна на името на анимацията:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -4559,9 +4349,8 @@ msgid "No animation to copy!"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "Обектът не е базиран на ресурсен файл"
+msgstr "Няма ресурс–анимация в буфера за обмен!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -4573,7 +4362,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to edit!"
-msgstr "Няма анимация за променяне!"
+msgstr "Няма анимация за редактиране!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -4605,16 +4394,15 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
-msgstr "Анимационни Инструменти"
+msgstr "Инструменти за анимациите"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Преходи"
+msgstr "Редактиране на преходите..."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Open in Inspector"
@@ -4637,9 +4425,8 @@ msgid "Onion Skinning Options"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Directions"
-msgstr "Описание:"
+msgstr "Указания"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -4711,19 +4498,16 @@ msgid "Cross-Animation Blend Times"
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Move Node"
-msgstr "Режим на Преместване"
+msgstr "Преместване на възела"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Преход"
+msgstr "Преходът вече съществува!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "Добавяне на превод"
+msgstr "Добавяне на преход"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -4760,14 +4544,12 @@ msgid "No playback resource set at path: %s."
msgstr "Обектът не е базиран на ресурсен файл"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
-msgstr "Премахни"
+msgstr "Възелът е премахнат"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "Преход"
+msgstr "Преходът е премахнат"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
@@ -4781,19 +4563,16 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Създай нови възли."
+msgstr "Създаване на нови възли."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Свържи възли."
+msgstr "Свързване на възли."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Remove selected node or transition."
-msgstr "Премахни селектирания възел или преход."
+msgstr "Премахване на избрания възел или преход."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -4804,14 +4583,12 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Преход"
+msgstr "Преход: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Панорамен режим на Отместване (на работния прозорец)"
+msgstr "Режим на възпроизвеждане:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4845,9 +4622,8 @@ msgid "Mix"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Auto Restart:"
-msgstr "Автоматично Рестартиране:"
+msgstr "Автоматично рестартиране:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
@@ -4910,7 +4686,7 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation Node"
-msgstr "Анимационен Възел"
+msgstr "Анимационен възел"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "OneShot Node"
@@ -4950,7 +4726,7 @@ msgstr "Внасяне на анимации..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr "Промени Възлови Филтри"
+msgstr "Промяна на филтрите за възлите"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
@@ -4966,7 +4742,7 @@ msgstr "Преглед на файловете"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
-msgstr "Грешка във връзката, моля опитай отново."
+msgstr "Грешка във връзката. Моля, опитайте отново."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect to host:"
@@ -4982,7 +4758,7 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
-msgstr "Заявката се провали, върнат код:"
+msgstr "Заявката се провали. Код:"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
@@ -5000,16 +4776,15 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
-msgstr "Заявката се провали, твърде много пренасочвания"
+msgstr "Заявката се провали. Твърде много пренасочвания"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect loop."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed, timeout"
-msgstr "Заявката се провали, върнат код:"
+msgstr "Заявката е неуспешна, изчакването е неуспешно"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Timeout."
@@ -5029,7 +4804,7 @@ msgstr "Получено:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed sha256 hash check"
-msgstr "Неуспешна проверка на sha256 hash"
+msgstr "Неуспешна проверка на хеш от вид „sha256“"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
@@ -5037,49 +4812,47 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
-msgstr "Изтегляне (%s / %s)..."
+msgstr "Сваляне (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading..."
-msgstr "Изтегля се..."
+msgstr "Сваляне..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
-msgstr "Уреждане на връзката..."
+msgstr "Инициализиране..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Error making request"
-msgstr "Имаше грешка при направата на заявката за изтегляне"
+msgstr "Грешка при извършването на заявката"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Idle"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Инсталиране"
+msgstr "Инсталирате..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
-msgstr "Опитай пак"
+msgstr "Повторен опит"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
-msgstr "Грешка при изтеглянето"
+msgstr "Грешка при свалянето"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Download for this asset is already in progress!"
-msgstr "Този актив вече се сваля!"
+msgstr "Този ресурс вече се сваля!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "Последно обновени"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Обновени отдавна"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
@@ -5101,7 +4874,7 @@ msgstr "Лиценз"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
-msgstr "Начална"
+msgstr "Първа"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Previous"
@@ -5129,13 +4902,12 @@ msgid "Import..."
msgstr "Повторно внасяне..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Plugins..."
-msgstr "Приставки"
+msgstr "Приставки ..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
-msgstr "Подреждане:"
+msgstr "Сортиране:"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -5144,20 +4916,19 @@ msgstr "Категория:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Site:"
-msgstr "Място:"
+msgstr "Уеб сайт:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Support"
-msgstr "Поддръжка..."
+msgstr "Поддръжка"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
-msgstr "Официална"
+msgstr "Официално"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Testing"
-msgstr "Тестова"
+msgstr "Тестово"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
@@ -5190,7 +4961,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Преглед"
@@ -5215,13 +4986,12 @@ msgid "steps"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotation Offset:"
-msgstr "Изместване при Завъртане:"
+msgstr "Изместване на въртенето:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
-msgstr "Съпка при Завъртане:"
+msgstr "Стъпка при завъртане:"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5453,11 +5223,11 @@ msgstr "Възпроизвеждане на сцена по избор"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
-msgstr "Направи IK Връзка"
+msgstr "Създаване на верига за IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear IK Chain"
-msgstr "Изчисти IK Връзка"
+msgstr "Изчистване на веригата за IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5475,15 +5245,15 @@ msgstr "Оригинално увеличение"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr "Режим на Селектиране"
+msgstr "Режим на избиране"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
-msgstr "Дърпане: Завъртане"
+msgstr "Влачене: завъртане"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
-msgstr "Alt+Дърпане: Преместване"
+msgstr "Alt+Влачене: преместване"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
@@ -5496,12 +5266,12 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
-msgstr "Режим на Преместване"
+msgstr "Режим на преместване"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Режим на Завъртане"
+msgstr "Режим на завъртане"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5515,8 +5285,8 @@ msgid ""
"Show a list of all objects at the position clicked\n"
"(same as Alt+RMB in select mode)."
msgstr ""
-"Покажи списък с всички обекти на кликнатата позиция\n"
-"(същото като Alt+RMB в режим на селектиране)."
+"Показване на списък с всички обекти на щракнатата позиция\n"
+"(същото като Alt+Десен бутон в режим на избиране)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
@@ -5524,26 +5294,23 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan Mode"
-msgstr "Панорамен режим на Отместване (на работния прозорец)"
+msgstr "Панорамен режим"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "Режим на Селектиране"
+msgstr "Режим на линията"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle smart snapping."
-msgstr "Добави Breakpoint"
+msgstr "Превключване на умното прилепване."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Smart Snap"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle grid snapping."
-msgstr "Добави Breakpoint"
+msgstr "Превключване на прилепването към решетката."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
@@ -5587,49 +5354,44 @@ msgid "Snap to Node Anchor"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Sides"
-msgstr "Избиране на всичко"
+msgstr "Прилепване към страните на възела"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Center"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Other Nodes"
-msgstr "Поставяне на възелите"
+msgstr "Прилепване към другите възли"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Guides"
-msgstr "Избиране на всичко"
+msgstr "Прилепване към водачите"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr "Заключи селектирания обект на място (за да не може да се премества)."
+msgstr "Заключване на избрания обект на място (за да не може да се премества)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
-msgstr "Отключи селектирания обект (за да може да се премества)."
+msgstr "Отключване на избрания обект (за да може да се премества)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Makes sure the object's children are not selectable."
-msgstr "Гарантирай че децата на този обект няма да могат да бъдат селектирани."
+msgstr "Прави така, че децата на този обект да не могат да бъдат избирани."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
-msgstr "Възвръщане на способността да се селектират децата на обекта."
+msgstr "Възстановява на способността да се избират децата на обекта."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Само Селекцията"
+msgstr "Опции на скелета"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -5640,15 +5402,13 @@ msgid "Make Custom Bone(s) from Node(s)"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Възпроизвеждане на сцена по избор"
+msgstr "Изчистване на персонализираните кости"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View"
-msgstr "Изглед"
+msgstr "Преглед"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
@@ -5680,7 +5440,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "Центрирай върху Селекцията"
+msgstr "Центриране върху избраното"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5751,7 +5511,7 @@ msgstr "Изглед Отзад."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
-msgstr "Добави %s"
+msgstr "Добавяне на %s"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Adding %s..."
@@ -5764,7 +5524,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Create Node"
-msgstr "Създай Възел"
+msgstr "Създаване на възел"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -5782,9 +5542,8 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon3D"
-msgstr "Създаване на папка"
+msgstr "Създаване на Polygon3D"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
@@ -5807,9 +5566,8 @@ msgstr ""
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "Автоматично Рестартиране:"
+msgstr "Рестартиране"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5905,14 +5663,12 @@ msgid "Load Curve Preset"
msgstr ""
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
-msgstr "Добави Възел..."
+msgstr "Добавяне на точка"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
-msgstr "LMB: Премести Точка."
+msgstr "Премахване на точката"
#: editor/plugins/curve_editor_plugin.cpp
#, fuzzy
@@ -5973,11 +5729,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Неуспешно създаване на папка."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5989,12 +5746,29 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "Създай нови възли."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Не могат да бъдат създадени никакви форми за колизии."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Multiple Convex Shapes"
msgstr "Създай нови възли."
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6031,11 +5805,11 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
-msgstr "Не можа да се създаде очертание!"
+msgstr "Контурът не може да бъде създаден!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline"
-msgstr "Създай Очертание"
+msgstr "Създаване на контур"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
@@ -6046,25 +5820,63 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Създаване на папка"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Създаване на папка"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
-msgstr "Покажи UV1"
+msgstr "Показване на UV1"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV2"
-msgstr "Покажи UV2"
+msgstr "Показване на UV2"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Unwrap UV2 for Lightmap/AO"
@@ -6076,7 +5888,7 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Outline Size:"
-msgstr "Размер на Очертанието:"
+msgstr "Размер на контура:"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Channel Debug"
@@ -6087,11 +5899,12 @@ msgid "Remove item %d?"
msgstr ""
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Обновяване от Cцена"
+msgstr ""
+"Обновяване от съществуващата сцена?:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
#, fuzzy
@@ -6109,11 +5922,11 @@ msgstr ""
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import from Scene"
-msgstr "Внасяне от Cцена"
+msgstr "Внасяне от сцена"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Update from Scene"
-msgstr "Обновяване от Cцена"
+msgstr "Обновяване от сцена"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
@@ -6248,9 +6061,8 @@ msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "\"%s\" doesn't contain geometry."
-msgstr "Възелът не съдържа геометрия."
+msgstr "„%s“ не съдържа геометрия."
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -6366,7 +6178,7 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
-msgstr "Изтрий Точка"
+msgstr "Изтриване на точка"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -6426,9 +6238,8 @@ msgid "Split Segment (in curve)"
msgstr ""
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move Joint"
-msgstr "LMB: Премести Точка."
+msgstr "Преместване на ставата"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
@@ -6460,28 +6271,24 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Internal Vertex"
-msgstr "Създай нова хоризонтална помощна линия"
+msgstr "Създаване на вътрешен вертекс"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Internal Vertex"
-msgstr "Премахни вертикална помощна линия"
+msgstr "Премахване на вътрешния вертекс"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Add Custom Polygon"
-msgstr "Приставки"
+msgstr "Добавяне на персонализиран полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Custom Polygon"
-msgstr "Преместване на Полигон"
+msgstr "Премахване на персонализирания полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
@@ -6509,48 +6316,44 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Points"
-msgstr "LMB: Премести Точка."
+msgstr "Точки"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Polygons"
-msgstr "Полигон->UV"
+msgstr "Полигони"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Points"
-msgstr "LMB: Премести Точка."
+msgstr "Преместване на точките"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Ctrl: Rotate"
msgstr "Ctrl: Завъртане"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
-msgstr "Shift: Преместване на Всичко"
+msgstr "Shift: преместване на всичко"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
-msgstr "Shift+Ctrl: Управление на Мащаб (размер)"
+msgstr "Shift+Ctrl: мащабиране"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
-msgstr "Преместване на Полигон"
+msgstr "Преместване на полигона"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Rotate Polygon"
-msgstr "Завъртане на Полигон"
+msgstr "Завъртане на полигона"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Scale Polygon"
-msgstr "Мащаб на Полигон"
+msgstr "Мащабиране на полигона"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create a custom polygon. Enables custom polygon rendering."
@@ -6576,20 +6379,19 @@ msgstr "Радиус:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
-msgstr "Полигон->UV"
+msgstr "Полигон -> UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV->Polygon"
-msgstr "UV->Полигон"
+msgstr "UV -> Полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Clear UV"
-msgstr "Изчисти UV"
+msgstr "Изчистване на UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Настройки"
+msgstr "Настройки на решетката"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
@@ -6633,7 +6435,7 @@ msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
-msgstr "ГРЕШКА: Ресурсът не можа да бъде зареден!"
+msgstr "ГРЕШКА: Ресурсът не може да бъде зареден!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
@@ -6691,57 +6493,51 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
-msgstr ""
+msgstr "Изчистване на последните файлове"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close and save changes?"
-msgstr "Затвори и запази промените?"
+msgstr "Затвяране и запазване на промените?"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error writing TextFile:"
-msgstr "Грешка при записване на TextFile:"
+msgstr "Грешка при записването:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "Грешка, не можа да се зареди файла."
+msgstr "Файлът не може да бъде зареден:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
msgstr "Грешка при записването на файла!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "Грешка при записване."
+msgstr "Грешка при запазването на темата."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
msgstr "Грешка при запазване"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "Грешка при внасяне на темата"
+msgstr "Грешка при внасянето на темата."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
-msgstr "Имаше грешка при внасянето"
+msgstr "Грешка при внасянето"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
-msgstr "Нов TextFile..."
+msgstr "Нов текстов файл…"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open File"
-msgstr "Отвори Файл"
+msgstr "Отваряне на файл"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save File As..."
-msgstr "Запази Файла Като..."
+msgstr "Запазване на файла като..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
@@ -6770,11 +6566,11 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving"
-msgstr "Грешка при запазване"
+msgstr "Грешка при запазването"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
-msgstr "Запази Темата Като..."
+msgstr "Запазване на темата като..."
#: editor/plugins/script_editor_plugin.cpp
msgid "%s Class Reference"
@@ -6783,7 +6579,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr "Намери Напред"
+msgstr "Търсене напред"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -6791,35 +6587,32 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "Поставяне на възелите"
+msgstr "Филтриране на скриптовете"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter methods"
-msgstr "Поставяне на възелите"
+msgstr "Филтриране на методите"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Sort"
-msgstr "Подреждане:"
+msgstr "Сортиране"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Up"
-msgstr "Премести Нагоре"
+msgstr "Преместване нагоре"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr "Премести Надоло"
+msgstr "Преместване надолу"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
@@ -6834,18 +6627,16 @@ msgid "File"
msgstr "Файл"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open..."
-msgstr "Отвори"
+msgstr "Отваряне…"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Reopen Closed Script"
-msgstr "Нова сцена"
+msgstr "Повторно отваряне на затворения скрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
-msgstr "Запази Всичко"
+msgstr "Запазване на всичко"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
@@ -6862,7 +6653,7 @@ msgstr "История Назад"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
-msgstr "История Напред"
+msgstr "Напред в историята"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6870,17 +6661,16 @@ msgid "Theme"
msgstr "Тема"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Import Theme..."
-msgstr "Внасяне на тема"
+msgstr "Внасяне на тема…"
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
-msgstr "Зареди Темата наново"
+msgstr "Презареждане на темата"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme"
-msgstr "Запази Темата"
+msgstr "Запазване на темата"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
@@ -6888,7 +6678,7 @@ msgstr "Затваряне на всичко"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
-msgstr "Затвори Документацията"
+msgstr "Затваряне на документацията"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
@@ -6913,24 +6703,15 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
-msgstr "Отстранителя на грешки да седи отворен"
+msgstr "Дебъгерът да остане отворен"
#: editor/plugins/script_editor_plugin.cpp
msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "Отвори документацията на Godot онлайн"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
+msgstr "Отваряне на документацията на Godot в Интернет."
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
@@ -6938,15 +6719,15 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to previous edited document."
-msgstr "Отиди в предходния променен документ."
+msgstr "Към предходния променен документ."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
-msgstr "Отиди в следващия променен документ."
+msgstr "Към следващия променен документ."
#: editor/plugins/script_editor_plugin.cpp
msgid "Discard"
-msgstr "Захвърли (промените)"
+msgstr "Отхвърляне"
#: editor/plugins/script_editor_plugin.cpp
msgid ""
@@ -6959,31 +6740,28 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Reload"
-msgstr "Презареди"
+msgstr "Презареждане"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Resave"
-msgstr "Презапиши"
+msgstr "Презаписване"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
-msgstr "Отстранител на грешки"
+msgstr "Дебъгер"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "Търсене"
+msgstr "Резултати от търсенето"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Clear Recent Scripts"
-msgstr "Затваряне на сцената"
+msgstr "Изчистване на последните скриптове"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Connections to method:"
-msgstr "Свързване..."
+msgstr "Връзки към метода:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
msgid "Source"
@@ -6999,17 +6777,16 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Ред"
+msgid "[Ignore]"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
+msgid "Line"
+msgstr "Ред"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Отиди на Ред"
+msgstr "Към функция"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -7042,7 +6819,7 @@ msgstr "Малки букви"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "Всяка дума с Главна буква"
+msgstr "Всяка дума с главна буква"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
@@ -7059,9 +6836,8 @@ msgid "Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Breakpoints"
-msgstr "Създай точки."
+msgstr "Точки на прекъсване"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -7075,7 +6851,7 @@ msgstr "Избиране на всичко"
#: editor/plugins/script_text_editor.cpp
msgid "Delete Line"
-msgstr "Изтрий Ред"
+msgstr "Изтриване на ред"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
@@ -7087,37 +6863,35 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
-msgstr "Вкарай Коментар"
+msgstr "Превключване на коментар"
#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
-msgstr "Разтвори/Събери Реда"
+msgstr "Разгъване/свиване на реда"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
-msgstr "Събери всички Редове"
+msgstr "Свиване на всички редове"
#: editor/plugins/script_text_editor.cpp
msgid "Unfold All Lines"
-msgstr "Разтвори Всички Редове"
+msgstr "Разгъване на всички редове"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr "Копирай на Долен ред"
+msgstr "Копиране на долния ред"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr "Завърши Символа (предложения за довършване)"
+msgstr "Знак за авт. довършване"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Evaluate Selection"
-msgstr "Центрирай върху Селекцията"
+msgstr "Изчисляване на избраното"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Trim Trailing Whitespace"
-msgstr "Премахни Празните символи в края на реда"
+msgstr "Премахване на празните места в края на редовете"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
@@ -7132,70 +6906,61 @@ msgid "Auto Indent"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
-msgstr "Намери във файлове"
+msgstr "Търсене във файловете…"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Toggle Bookmark"
-msgstr "Добави Breakpoint"
+msgstr "Превключване на отметка"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Bookmark"
-msgstr "Отиди на следващия Breakpoint"
+msgstr "Към следващата отметка"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Bookmark"
-msgstr "Отиди на Предишния Breakpoint"
+msgstr "Към предходната отметка"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Remove All Bookmarks"
-msgstr "Премахни Всички Breakpoint-ове"
+msgstr "Премахване на всички отметки"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "Отиди на Ред"
+msgstr "Към ред…"
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Добави Breakpoint"
+msgstr "Превключване на точка на прекъсване"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Премахни Всички Breakpoint-ове"
+msgstr "Премахване на всички точки на прекъсване"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
-msgstr "Отиди на следващия Breakpoint"
+msgstr "Към следващата точка на прекъсване"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
-msgstr "Отиди на Предишния Breakpoint"
+msgstr "Към предходната точка на прекъсване"
#: editor/plugins/shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"Следните файлове са по-нови на диска.\n"
-"Кое действие трябва да се предприеме?:"
+"Този шеъдър е бил променен на диска.\n"
+"Какво да се предприеме?"
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
@@ -7325,11 +7090,11 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View."
-msgstr "Изглед Отгоре."
+msgstr "Изглед отгоре."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View."
-msgstr "Изглед Отдолу."
+msgstr "Изглед отдолу."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom"
@@ -7337,7 +7102,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View."
-msgstr "Изглед Отляво."
+msgstr "Изглед отляво."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left"
@@ -7345,7 +7110,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View."
-msgstr "Изглед Отдясно."
+msgstr "Изглед отдясно."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right"
@@ -7353,7 +7118,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View."
-msgstr "Изглед Отпред."
+msgstr "Изглед отпред."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front"
@@ -7361,7 +7126,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View."
-msgstr "Изглед Отзад."
+msgstr "Изглед отзад."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear"
@@ -7386,6 +7151,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7445,27 +7214,27 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr "Свободен Изглед Отляво"
+msgstr "Свободен изглед отляво"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr "Свободен Изглед Отдясно"
+msgstr "Свободен изглед отдясно"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "Свободен Изглед Отпред"
+msgstr "Свободен изглед отпред"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Свободен Изглед Отзад"
+msgstr "Свободен изглед отзад"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "Свободен Изглед Отгоре"
+msgstr "Свободен изглед отгоре"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "Свободен Изглед Отдолу"
+msgstr "Свободен изглед отдолу"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
@@ -7477,17 +7246,26 @@ msgid "Freelook Slow Modifier"
msgstr "Свободен Изглед Отпред"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7696,24 +7474,20 @@ msgid "Polygon2D Preview"
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D"
-msgstr "Създаване на папка"
+msgstr "Създаване на CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "CollisionPolygon2D Preview"
-msgstr "Създаване на папка"
+msgstr "Предварителен преглед на CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D"
-msgstr "Създаване на папка"
+msgstr "Създаване на LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "LightOccluder2D Preview"
-msgstr "Създаване на папка"
+msgstr "Предварителен преглед на LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
@@ -7736,9 +7510,8 @@ msgid "Invalid geometry, can't create polygon."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Polygon2D"
-msgstr "Преместване на Полигон"
+msgstr "Превръщане в Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
@@ -7774,19 +7547,16 @@ msgid "Grow (Pixels): "
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Обновяване от сцена"
+msgstr "Обновяване на предварителния преглед"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Настройки"
+msgstr "Настройки:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "Покажи Селекцията (вмести в целия прозорец)"
+msgstr "Няма избрани кадри"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add %d Frame(s)"
@@ -7797,9 +7567,8 @@ msgid "Add Frame"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "Неуспешно зареждане на ресурсите."
+msgstr "Изображенията не могат да бъдат заредени"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -7826,22 +7595,20 @@ msgid "(empty)"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move Frame"
-msgstr "Режим на Преместване"
+msgstr "Преместване на кадъра"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animations:"
-msgstr "Анимационни Инструменти"
+msgstr "Анимации:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "New Animation"
-msgstr "Ново Име на Анимация:"
+msgstr "Нова анимация"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Скорост (кадри в секунда):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7849,14 +7616,12 @@ msgid "Loop"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animation Frames:"
-msgstr "Ново Име на Анимация:"
+msgstr "Кадри на анимацията:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "Преместване на пътечката нагоре."
+msgstr "Добавяне на текстура от файл"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
@@ -7871,18 +7636,16 @@ msgid "Insert Empty (After)"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move (Before)"
-msgstr "Поставяне на възелите"
+msgstr "Преместване (преди)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (After)"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "Режим на Селектиране"
+msgstr "Избиране на кадри"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
@@ -7893,9 +7656,8 @@ msgid "Vertical:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select/Clear All Frames"
-msgstr "Избиране на всичко"
+msgstr "Избиране/изчистване на всички кадри"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Create Frames from Sprite Sheet"
@@ -7964,14 +7726,12 @@ msgid "Remove All Items"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Remove All"
-msgstr "Затваряне на всичко"
+msgstr "Премахване на всичко"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "Файл:"
+msgstr "Редактиране на темата"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
@@ -8003,18 +7763,16 @@ msgid "Toggle Button"
msgstr "Средно копче"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Button"
-msgstr "Средно копче"
+msgstr "Заключен бутон"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Item"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Item"
-msgstr "Изключено"
+msgstr "Заключен елемент"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Check Item"
@@ -8057,9 +7815,8 @@ msgid "Many"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled LineEdit"
-msgstr "Изключено"
+msgstr "Заключено текстово поле"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -8074,9 +7831,8 @@ msgid "Tab 3"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Editable Item"
-msgstr "Промени Филтрите"
+msgstr "Редактируем елемент"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
@@ -8567,7 +8323,7 @@ msgstr "Файл:"
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8717,52 +8473,45 @@ msgid "Change output port name"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "Затваряне на всичко"
+msgstr "Премахване на входния порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "Внасяне на текстури"
+msgstr "Премахване на изходния порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set expression"
-msgstr "Двуизмерна текстура"
+msgstr "Задаване на израз"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Resize VisualShader node"
-msgstr "Поставяне на възелите"
+msgstr "Преоразмеряване на възела VisualShader"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set Input Default Port"
-msgstr "Задай по Подразбиране за '%s'"
+msgstr "Задаване на входен порт по подразбиране"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node to Visual Shader"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Nodes"
-msgstr "Направи дупликат на Key(s)"
+msgstr "Дублиране на възлите"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste Nodes"
-msgstr "Поставяне на възелите"
+msgstr "Поставяне на възлите"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Nodes"
-msgstr "Избиране на всичко"
+msgstr "Изтриване на възлите"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Input Type Changed"
@@ -8781,19 +8530,16 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Show resulted shader code."
-msgstr "Създай Възел"
+msgstr "Показване на получения код на шейдъра."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Create Shader Node"
-msgstr "Създай Възел"
+msgstr "Създаване на възел с шейдър"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "Отиди на Ред"
+msgstr "Функция за цвят."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
@@ -8852,14 +8598,12 @@ msgid "SoftLight operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "Постоянно"
+msgstr "Константа за цвят."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "Изнасяне към платформа"
+msgstr "Uniform за цвят."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
@@ -9481,9 +9225,8 @@ msgid "VisualShader"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "Промени Филтрите"
+msgstr "Редактиране на визуалното свойство"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Mode Changed"
@@ -9528,9 +9271,8 @@ msgid "Release"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Изнасяне за %s"
+msgstr "Изнасяне на всичко"
#: editor/project_export.cpp
msgid "The given export path doesn't exist:"
@@ -9555,9 +9297,8 @@ msgid ""
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path"
-msgstr "Изнасяне на проекта"
+msgstr "Път за изнасяне"
#: editor/project_export.cpp
msgid "Resources"
@@ -9604,9 +9345,8 @@ msgid "Make Patch"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr "Файл:"
+msgstr "Пакетен файл"
#: editor/project_export.cpp
msgid "Features"
@@ -9621,14 +9361,12 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Script"
-msgstr "Нов скрипт"
+msgstr "Скрипт"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script Export Mode:"
-msgstr "Режим на изнасяне:"
+msgstr "Режим на изнасяне на скриптове:"
#: editor/project_export.cpp
msgid "Text"
@@ -9651,28 +9389,24 @@ msgid "Script Encryption Key (256-bits as hex):"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Export PCK/Zip"
-msgstr "Изнасяне"
+msgstr "Изнасяне на PCK/Zip"
#: editor/project_export.cpp
msgid "Export Project"
msgstr "Изнасяне на проекта"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Режим на изнасяне:"
+msgstr "Режим на изнасяне?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Изнасяне"
+msgstr "Изнасяне на всичко"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr "Файл:"
+msgstr "Файл ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
@@ -9691,25 +9425,28 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose an empty folder."
-msgstr "Моля, изнесете извън папката на проекта!"
+msgstr "Моля, изберете празна папка."
#: editor/project_manager.cpp
-#, fuzzy
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Моля, изнесете извън папката на проекта!"
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Моля, изберете файл от тип „project.godot“ или „.zip“."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9721,14 +9458,12 @@ msgid "Imported Project"
msgstr "Внесен проект"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "Име:"
+msgstr "Неправилно име на проект."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Couldn't create folder."
-msgstr "Неуспешно създаване на папка."
+msgstr "Папката не може да бъде създадена."
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
@@ -9757,49 +9492,44 @@ msgid "Couldn't create project.godot in project path."
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
msgid "Rename Project"
-msgstr "Нов проект"
+msgstr "Преименуване на проекта"
#: editor/project_manager.cpp
msgid "Import Existing Project"
msgstr "Внасяне на съществуващ проект"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Import & Edit"
-msgstr "Внасяне и отваряне"
+msgstr "Внасяне и редактиране"
#: editor/project_manager.cpp
msgid "Create New Project"
msgstr "Създаване на нов проект"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Create & Edit"
-msgstr "Създаване"
+msgstr "Създаване и редактиране"
#: editor/project_manager.cpp
msgid "Install Project:"
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
msgid "Install & Edit"
-msgstr "Инсталиране"
+msgstr "Инсталиране и редактиране"
#: editor/project_manager.cpp
msgid "Project Name:"
-msgstr "Име:"
+msgstr "Име на проекта:"
#: editor/project_manager.cpp
msgid "Project Path:"
-msgstr "Път:"
+msgstr "Път до проекта:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Път:"
+msgstr "Път на инсталация на проекта:"
#: editor/project_manager.cpp
msgid "Renderer:"
@@ -9838,18 +9568,16 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "Внасяне на съществуващ проект"
+msgstr "Проектът липсва"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't open project at '%s'."
-msgstr "Създаване на нов проект"
+msgstr "Не може да бъде отворен проектът в „%s“."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -9933,14 +9661,14 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr "Диспечер на проектите"
+msgstr "Управление на проектите"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
-msgstr "Проект"
+msgstr "Проекти"
#: editor/project_manager.cpp
msgid "Last Modified"
@@ -9959,9 +9687,8 @@ msgid "New Project"
msgstr "Нов проект"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "Затваряне на всичко"
+msgstr "Премахване на липсващите"
#: editor/project_manager.cpp
msgid "Templates"
@@ -9972,9 +9699,8 @@ msgid "Restart Now"
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't run project"
-msgstr "Създаване на нов проект"
+msgstr "Проектът не може да бъде пуснат"
#: editor/project_manager.cpp
msgid ""
@@ -9982,6 +9708,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10005,9 +9738,8 @@ msgid ""
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "Вече съществува файл или папка с това име."
+msgstr "Вече съществува действие с името „%s“."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
@@ -10022,9 +9754,8 @@ msgid "Add Input Action Event"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Устройство"
+msgstr "Всички устройства"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -10040,15 +9771,15 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Left Button"
-msgstr "Ляво копче"
+msgstr "Ляв бутон"
#: editor/project_settings_editor.cpp
msgid "Right Button"
-msgstr "Дясно копче"
+msgstr "Десен бутон"
#: editor/project_settings_editor.cpp
msgid "Middle Button"
-msgstr "Средно копче"
+msgstr "Среден бутон"
#: editor/project_settings_editor.cpp
msgid "Wheel Up Button"
@@ -10059,24 +9790,20 @@ msgid "Wheel Down Button"
msgstr "Колелце надолу"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Колелце нагоре"
+msgstr "Ляв бутон на колелцето"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Дясно копче"
+msgstr "Десен бутон на колелцето"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Копче 6"
+msgstr "Бутон X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Копче 6"
+msgstr "Бутон X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -10104,19 +9831,19 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Копче"
+msgstr "Бутон"
#: editor/project_settings_editor.cpp
msgid "Left Button."
-msgstr "Ляво копче."
+msgstr "Ляв бутон."
#: editor/project_settings_editor.cpp
msgid "Right Button."
-msgstr "Дясно копче."
+msgstr "Десен бутон."
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr "Средно копче."
+msgstr "Среден бутон."
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
@@ -10210,7 +9937,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Project Settings (project.godot)"
-msgstr "Настройки на проекта"
+msgstr "Настройки на проекта (project.godot)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
@@ -10233,9 +9960,8 @@ msgid "Action:"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "Описание:"
+msgstr "Действие"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
@@ -10282,19 +10008,16 @@ msgid "Locales Filter"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
-msgstr "Събери всички Редове"
+msgstr "Показване на всички езици"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
-msgstr "Само Селекцията"
+msgstr "Показване само на избраните езици"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Filter mode:"
-msgstr "Поставяне на възелите"
+msgstr "Режим на филтриране:"
#: editor/project_settings_editor.cpp
msgid "Locales:"
@@ -10337,18 +10060,16 @@ msgid "Assign"
msgstr ""
#: editor/property_editor.cpp
-#, fuzzy
msgid "Select Node"
-msgstr "Избиране на всичко"
+msgstr "Избиране на възел"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
msgstr ""
#: editor/property_editor.cpp
-#, fuzzy
msgid "Pick a Node"
-msgstr "Поставяне"
+msgstr "Изберете възел"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
@@ -10356,30 +10077,38 @@ msgstr ""
#: editor/property_selector.cpp
msgid "Select Property"
-msgstr "Изберете свойство"
+msgstr "Избиране на свойство"
#: editor/property_selector.cpp
-#, fuzzy
msgid "Select Virtual Method"
-msgstr "Изберете метод"
+msgstr "Избиране на виртуален метод"
#: editor/property_selector.cpp
msgid "Select Method"
-msgstr "Изберете метод"
+msgstr "Избиране на метод"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Замяна: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Използване на регулярни изрази"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr ""
@@ -10388,18 +10117,16 @@ msgid "Substitute"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Възел"
+msgstr "Име на възела"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Възел"
+msgstr "Тип на възела"
#: editor/rename_dialog.cpp
msgid "Current scene name"
@@ -10416,11 +10143,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10428,9 +10155,8 @@ msgid "Initial value for the counter"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Стъпка (сек.):"
+msgstr "Стъпка"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
@@ -10447,10 +10173,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10459,11 +10181,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10482,6 +10204,15 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Използване на регулярни изрази"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10546,8 +10277,8 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Clear Script"
-msgstr "Нова сцена"
+msgid "Detach Script"
+msgstr "Закачане на скрипт"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10578,14 +10309,17 @@ msgid "Instantiated scenes can't become root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "Запазване на сцената"
+msgstr "Превръщане на възела в корен"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Изтриване на %d възела?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Избиране на всичко"
+msgstr "Изтриване на %d възела?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10596,9 +10330,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Избиране на всичко"
+msgstr "Изтриване на възела „%s“?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10629,33 +10362,28 @@ msgid "Make Local"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "Запазване на сцената"
+msgstr "Нов корен на сцената"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Създаване на папка"
+msgstr "Създаване на коренен възел:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Сцена"
+msgstr "2-измерна сцена"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Сцена"
+msgstr "3-измерна сцена"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Избиране на всичко"
+msgstr "Друг възел"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -10666,9 +10394,8 @@ msgid "Can't operate on nodes the current scene inherits from!"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach Script"
-msgstr "Нова сцена"
+msgstr "Закачане на скрипт"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
@@ -10709,18 +10436,23 @@ msgid "Load As Placeholder"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
-msgstr "Отвори документацията на Godot онлайн"
+msgstr "Отваряне на документацията"
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "Затваряне на всичко"
+msgstr "Разгъване/свиване на всичко"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
@@ -10765,11 +10497,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10896,6 +10628,10 @@ msgid "A directory with the same name exists."
msgstr "Вече съществува файл или папка с това име."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Трябва да се използва правилно разширение."
@@ -10942,6 +10678,10 @@ msgid "File exists, it will be reused."
msgstr "Файлът съществува. Искате ли да го презапишете?"
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Неправилен път."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid class name."
msgstr "невалидно име на Група."
@@ -10951,7 +10691,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10977,6 +10717,12 @@ msgid "Script file already exists."
msgstr "Група с това име вече съществува."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Клас:"
@@ -11051,14 +10797,16 @@ msgid "Child process connected."
msgstr "Разкачи"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Copy Error"
-msgstr "Грешки"
+msgstr "Копиране на грешката"
+
+#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Skip Breakpoints"
-msgstr "Създай точки."
+msgstr "Пропускане на точките на прекъсване"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -11106,8 +10854,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Изнасяне на профила"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11254,9 +11003,8 @@ msgid "Select dependencies of the library for this entry"
msgstr ""
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "Преместване на пътечката нагоре."
+msgstr "Премахване на текущия елемент"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
@@ -11267,14 +11015,12 @@ msgid "Platform:"
msgstr ""
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Platform"
-msgstr "Изнасяне към платформа"
+msgstr "Платформа"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Dynamic Library"
-msgstr "Изнасяне на библиотеката"
+msgstr "Динамична библиотека"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Add an architecture entry"
@@ -11294,9 +11040,8 @@ msgid "Disabled GDNative Singleton"
msgstr ""
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Library"
-msgstr "Изнасяне на библиотеката"
+msgstr "Библиотека"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
@@ -11307,9 +11052,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Step argument is zero!"
-msgstr "Стъпката на range() е нула!"
+msgstr "Аргументът за стъпката е нула!"
#: modules/gdscript/gdscript_functions.cpp
#, fuzzy
@@ -11334,13 +11078,13 @@ msgstr "Невалиден формат на инстанцията в речн
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (can't load script at @path)"
msgstr ""
-"Невалиден формат на инстанцията в речника (скриптът в @path не може да бъде "
+"Неправилен формат на инстанцията в речника (скриптът в @path не може да бъде "
"зареден)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (invalid script at @path)"
msgstr ""
-"Невалиден формат на инстанцията в речника (скриптът в @path е невалиден)"
+"Неправилен формат на инстанцията в речника (скриптът в @path е невалиден)"
#: modules/gdscript/gdscript_functions.cpp
#, fuzzy
@@ -11895,7 +11639,7 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr "Изрязване на възелите"
+msgstr "Изрязване на възлите"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -12019,6 +11763,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12043,6 +11791,32 @@ msgstr "невалидно име на Група."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12146,9 +11920,8 @@ msgid "Invalid package publisher display name."
msgstr "невалидно име на Група."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid product GUID."
-msgstr "Име:"
+msgstr "Невалиден продуктов GUID."
#: platform/uwp/export/export.cpp
msgid "Invalid publisher GUID."
@@ -12218,13 +11991,14 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionPolygon2D служи само за да даде форма за колизии на "
-"CollisionObject2D. Моля, използвайте го само като наследник на Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, и т.н. за да им дадете форма."
+"CollisionPolygon2D служи само, за да даде форма за колизии на "
+"CollisionObject2D. Моля, използвайте го като наследник на Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D и т.н. само, за да им дадете "
+"форма."
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
-msgstr "Празен CollisionPolygon2D няма никакъв ефект на колизията."
+msgstr "Празен CollisionPolygon2D не влияе на колизиите."
#: scene/2d/collision_shape_2d.cpp
msgid ""
@@ -12232,9 +12006,10 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D служи само за да даде форма за колизии на "
-"CollisionObject2D. Моля, използвайте го само като наследник на Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, и т.н. за да им дадете форма."
+"CollisionShape2D служи само, за да даде форма за колизии на "
+"CollisionObject2D. Моля, използвайте го като наследник на Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, и т.н. само, за да им дадете "
+"форма."
#: scene/2d/collision_shape_2d.cpp
#, fuzzy
@@ -12245,6 +12020,12 @@ msgstr ""
"За да работи CollisionShape2D, е нужно да му се даде форма. Моля, създайте "
"му Shape2D ресурс."
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12264,8 +12045,8 @@ msgstr ""
msgid ""
"An occluder polygon must be set (or drawn) for this occluder to take effect."
msgstr ""
-"Затъмняващият многоъгълник трябва да бъде зададен (или нарисуван) за да може "
-"да работи тази сянка."
+"Закриващият полигон трябва да бъде зададен (или нарисуван), за да може да "
+"работи прикриването."
#: scene/2d/light_occluder_2d.cpp
#, fuzzy
@@ -12277,21 +12058,21 @@ msgid ""
"A NavigationPolygon resource must be set or created for this node to work. "
"Please set a property or draw a polygon."
msgstr ""
-"За този възел трябва да бъде зададен или създаден един ресурс "
-"NavigationPolygon. Моля, задайте или нарисувайте един многоъгълник."
+"За този възел трябва да бъде зададен или създаден ресурс NavigationPolygon. "
+"Моля, задайте свойство или нарисувайте полигон."
#: scene/2d/navigation_polygon.cpp
msgid ""
"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
"node. It only provides navigation data."
msgstr ""
-"NavigationPolygonInstance трябва да бъде наследник или наследник на "
-"наследник на Navigation2D. Той само дава навигационна информация."
+"NavigationPolygonInstance трябва да бъде наследник или поднаследник на "
+"Navigation2D. Той дава само навигационна информация."
#: scene/2d/parallax_layer.cpp
msgid ""
"ParallaxLayer node only works when set as child of a ParallaxBackground node."
-msgstr "ParallaxLayer работи само когато е наследник на ParallaxBackground."
+msgstr "ParallaxLayer работи само, когато е наследник на ParallaxBackground."
#: scene/2d/particles_2d.cpp
msgid ""
@@ -12314,7 +12095,7 @@ msgstr ""
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
-msgstr "PathFollow2D работи само когато е наследник на Path2D."
+msgstr "PathFollow2D работи само, когато е наследник на Path2D."
#: scene/2d/physics_body_2d.cpp
msgid ""
@@ -12326,8 +12107,7 @@ msgstr ""
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
msgstr ""
-"Параметърът 'Path' трябва да сочи към действителен възел Node2D, за да "
-"работи."
+"Свойството Path трябва да сочи към действителен възел Node2D, за да работи."
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
@@ -12451,6 +12231,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12471,6 +12256,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12697,6 +12487,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
@@ -12723,7 +12517,21 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "Константите не могат да бъдат променени."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Текущата сцена никога не е била запазена. Моля, запазете я преди "
+#~ "изпълнение."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Не е в пътя на ресурсите."
+
+#~ msgid "Clear Script"
+#~ msgstr "Премахване на скрипта"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Заменени съвпадения: %d ."
#, fuzzy
#~ msgid "Brief Description"
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
index 3cfcc98809..8415bb30bd 100644
--- a/editor/translations/bn.po
+++ b/editor/translations/bn.po
@@ -7,12 +7,13 @@
# Tahmid Karim <tahmidk15@gmail.com>, 2016.
# Tawhid H. <Tawhidk757@yahoo.com>, 2019.
# Hasibul Hasan <hasibeng78@gmail.com>, 2019.
+# Oymate <dhruboadittya96@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-12-13 09:38+0000\n"
-"Last-Translator: Hasibul Hasan <hasibeng78@gmail.com>\n"
+"PO-Revision-Date: 2020-05-04 15:11+0000\n"
+"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/"
"godot/bn/>\n"
"Language: bn\n"
@@ -20,7 +21,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 3.10-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -29,7 +30,7 @@ msgstr "অবৈধ প্রকার রূপান্তর করার
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "১ (একটি অক্ষর) দৈর্ঘ্য এর স্ট্রিং প্রত্যাশিত।"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -566,6 +567,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "এফ পি এস"
@@ -733,8 +735,9 @@ msgid "Line Number:"
msgstr "লাইন নাম্বার:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d সংখ্যক সংঘটন প্রতিস্থাপিত হয়েছে ।"
+#, fuzzy
+msgid "%d replaced."
+msgstr "প্রতিস্থাপন..."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -753,7 +756,7 @@ msgstr "অক্ষরের মাত্রা (বড়/ছোট-হাতে
msgid "Whole Words"
msgstr "সম্পূর্ণ শব্দ"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "প্রতিস্থাপন করুন"
@@ -807,6 +810,11 @@ msgstr "নির্দেশিত নোডের মেথড নির্দ
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "নামটি কার্যকর সনাক্তকারী নয়:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -895,7 +903,6 @@ msgstr "সংযোজক সংকেত/সিগন্যাল:"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -958,6 +965,11 @@ msgid "Signals"
msgstr "সংকেতসমূহ"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "দ্রুত ফাইলসমূহ ফিল্টার করুন..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -1000,7 +1012,7 @@ msgid "Recent:"
msgstr "সাম্প্রতিক:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "অনুসন্ধান করুন:"
@@ -1187,6 +1199,9 @@ msgstr "প্রজেক্ট ফাউন্ডার"
msgid "Lead Developer"
msgstr "মূল ডেভেলপার"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
#, fuzzy
msgid "Project Manager "
@@ -1209,6 +1224,16 @@ msgid "Gold Sponsors"
msgstr "গোল্ড স্পনসর"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "সিলভার ডোনার"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "ব্রোঞ্জ ডোনার"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "মিনি স্পনসর"
@@ -1536,7 +1561,7 @@ msgstr "Autoload স্থানান্তর করুন"
msgid "Remove Autoload"
msgstr "Autoload অপসারণ করুন"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "সক্রিয় করুন"
@@ -1544,18 +1569,9 @@ msgstr "সক্রিয় করুন"
msgid "Rearrange Autoloads"
msgstr "Autoload সমূহ পুনর্বিন্যস্ত করুন"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "অকার্যকর পথ।"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "ফাইলটি বিদ্যমান নয়।"
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "রিসোর্সের পথে নয়।"
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1582,6 +1598,10 @@ msgstr "নাম"
msgid "Singleton"
msgstr "একক-বস্তু/সিঙ্গেলটোন"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "মানসমূহ প্রতিলেপন/পেস্ট করুন"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "দৃশ্য হাল নাগাদ হচ্ছে"
@@ -1714,21 +1734,21 @@ msgstr "দৃশ্যের শাখা (নোডসমূহ):"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "ইম্পোর্ট"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
msgstr "মোড (Mode) সরান"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "ফাইলসিস্টেম"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "ইম্পোর্ট"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "সমস্তগুলি প্রতিস্থাপন করুন"
@@ -1898,7 +1918,7 @@ msgstr "ফাইল-ম্যানেজারে দেখুন"
msgid "New Folder..."
msgstr "ফোল্ডার তৈরি করুন"
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "রিফ্রেস করুন"
@@ -2020,7 +2040,7 @@ msgstr "পথ এবং ফাইল:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "প্রিভিউ:"
@@ -2489,11 +2509,6 @@ msgid "There is no defined scene to run."
msgstr "চালানোর জন্য কোনো দৃশ্য নির্দিষ্ট করা নেই।"
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"বর্তমান দৃশ্যটি কখনোই সংরক্ষণ করা হয় নি, অনুগ্রহ করে চালানোর পূর্বে এটি সংরক্ষণ করুন।"
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "উপ-প্রক্রিয়াকে শুরু করা সম্ভব হয়নি!"
@@ -2585,12 +2600,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "পূর্বে কখনোই সংরক্ষিত হয়নি এমন দৃশ্য পুনরায়-লোড (রিলোড) করা অসম্ভব।"
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "প্রত্যাবর্তন করুন"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "দৃশ্য সংরক্ষণ করুন"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "এই কাজটি অসম্পাদিত করা সম্ভব হবে না। তবুও প্রত্যাবর্তন করবেন?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2894,10 +2912,6 @@ msgid "Redo"
msgstr "পুনরায় করুন"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "দৃশ্য প্রত্যাবৃত্ত করুন"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "প্রকল্প অথবা দৃশ্যে-ব্যাপী বিবিধ সরঞ্জাম-সমূহ।"
@@ -2962,24 +2976,28 @@ msgstr "দূরবর্তী ডিবাগের সহিত ডিপ্
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"এক্সপোর্ট (Export) বা ডিপ্লয় (Deploy)-এর সময় প্রস্তুতকৃত এক্সিকিউটেবল (executable) "
-"ডিবাগ (debug)-এর উদ্দেশ্যে এই কম্পিউটারের আইপি (IP)-তে সংযোগ করার চেষ্টা করবে।"
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "নেটওয়ার্ক ফাইল-সিস্টেমের সহিত ক্ষুদ্র-ডিপ্লয় করুন"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"এই সিদ্ধান্তটি (অপশন) সক্রিয় করলে, এক্সপোর্ট (Export) বা ডিপ্লয় (Deploy)-এ স্বল্পতম "
"মানের এক্সিকিউটেবল (executable) উৎপাদন হবে।\n"
@@ -2993,9 +3011,10 @@ msgid "Visible Collision Shapes"
msgstr "দৃশ্যমান সাংঘর্ষিক আকারসমূহ (Collision Shapes)"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"এই সিদ্ধান্তটি (অপশন) সক্রিয় করলে চলমান গেমে কলিশ়ন (Collision) আকৃতি এবং রে-কাস্ট "
"(RayCast) নোড (2D এবং 3D) দৃশ্যমান হবে।"
@@ -3005,23 +3024,26 @@ msgid "Visible Navigation"
msgstr "দৃশ্যমান নেভিগেশন (Navigation)"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"এই সিদ্ধান্তটি (অপশন) সক্রিয় করলে চলমান গেমে ন্যাভিগেশন (Navigation) মেস এবং "
"পলিগন-সমূহ দৃশ্যমান হবে।"
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "দৃশ্যের পরিবর্তনসমূহ সুসংগত/সমন্বয় করুন"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"এই সিদ্ধান্তটি (অপশন) সক্রিয় থাকলে, এডিটরে কোনো দৃশ্যের পরিবর্তন করলে তা চলমান "
"গেমে প্রতিফলিত হবে।\n"
@@ -3029,15 +3051,17 @@ msgstr ""
"কার্যকর করবে।"
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "স্ক্রিপ্টের পরিবর্তনসমূহ সুসংগত/সমন্বয় করুন"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"এই সিদ্ধান্তটি (অপশন) সক্রিয় থাকলে, কোনো স্ক্রিপ্টের পরিবর্তন সংরক্ষণে তা চলমান গেমে "
"প্রতিফলিত হবে।\n"
@@ -3110,7 +3134,7 @@ msgstr "হেল্প"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "অনুসন্ধান করুন"
@@ -3125,8 +3149,13 @@ msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "ইস্যু ট্র্যাকার"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "পুন-ইম্পোর্ট"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3542,9 +3571,11 @@ msgid "Add Key/Value Pair"
msgstr ""
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"কাংখিত প্ল্যাটফর্মের জন্য গ্রহণযোগ্য কোন এক্সপোর্ট প্রিসেট খুঁজে পাওয়া যায়নি।\n"
"অনুগ্রহ করে এক্সপোর্ট মেনুতে একটি সঠিক প্রিসেট যোগ করুন।"
@@ -3573,6 +3604,13 @@ msgstr "স্ক্রিপ্ট চালানো সম্ভব হয়ন
msgid "Did you forget the '_run' method?"
msgstr "আপনি কি '_run' মেথডটি দিতে ভুলেছেন?"
+#: editor/editor_spin_slider.cpp
+#, fuzzy
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"গেটার (Getter) তৈরি করতে/নামাতে কন্ট্রোল কী (Ctrl) চেপে রাখুন। জেনেরিক সিগনেচার "
+"(generic signature) তৈরি করতে/নামাতে শিফট কী (Shift) চেপে রাখুন।"
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "ইম্পোর্টের জন্য নোড(সমূহ) নির্বাচন করুন"
@@ -4254,10 +4292,19 @@ msgid "Error running post-import script:"
msgstr "ইম্পোর্ট-পরবর্তী স্ক্রিপ্ট চালানোয় সমস্যা হয়েছে:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "সংরক্ষিত হচ্ছে..."
#: editor/import_dock.cpp
+#, fuzzy
+msgid "%d Files"
+msgstr "ফাইল"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "'%s' এর জন্য ডিফল্ট হিসাবে সেট করুন"
@@ -4267,11 +4314,6 @@ msgstr "'%s' এর জন্য ডিফল্ট ক্লিয়ার ক
#: editor/import_dock.cpp
#, fuzzy
-msgid " Files"
-msgstr "ফাইল"
-
-#: editor/import_dock.cpp
-#, fuzzy
msgid "Import As:"
msgstr "ইম্পোর্ট"
@@ -4286,7 +4328,7 @@ msgid "Reimport"
msgstr "পুন-ইম্পোর্ট"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4322,10 +4364,6 @@ msgid "Copy Params"
msgstr "মানসমূহ প্রতিলিপি/কপি করুন"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "মানসমূহ প্রতিলেপন/পেস্ট করুন"
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "রিসোর্সের ক্লীপবোর্ড খালি!"
@@ -5475,7 +5513,7 @@ msgid "Bake Lightmaps"
msgstr "লাইট্ম্যাপে হস্তান্তর করুন:"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "প্রিভিউ"
@@ -6302,12 +6340,13 @@ msgid "Mesh is empty!"
msgstr "মেসটি খালি!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "স্থিত-ট্রাইমেস বডি গঠন করুন"
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "ট্রাইমেস কলিশ়ন সহোদর তৈরি করুন"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "স্থিত-কনভেক্স বডি গঠন করুন"
+msgid "Create Static Trimesh Body"
+msgstr "স্থিত-ট্রাইমেস বডি গঠন করুন"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -6319,12 +6358,30 @@ msgid "Create Trimesh Static Shape"
msgstr "ট্রাইমেস আকার তৈরি করুন"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "কনভেক্স আকার তৈরি করুন"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "কনভেক্স আকার তৈরি করুন"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6376,19 +6433,57 @@ msgid "Create Trimesh Static Body"
msgstr "স্থিত-ট্রাইমেস বডি তৈরি করুন"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "ট্রাইমেস কলিশ়ন সহোদর তৈরি করুন"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "কনভেক্স কলিশ়ন সহোদর তৈরি করুন"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "কনভেক্স কলিশ়ন সহোদর তৈরি করুন"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "প্রান্তরেখা মেস তৈরি করুন..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV1"
msgstr "দৃশ্য/পরিদর্শন"
@@ -7296,14 +7391,6 @@ msgid "Open Godot online documentation."
msgstr "রেফারেন্সের ডকুমেন্টেশনে খুঁজুন।"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "রেফারেন্সের ডকুমেন্টেশনে খুঁজুন।"
@@ -7373,15 +7460,15 @@ msgid ""
msgstr "'%s' এর সাথে '%s' সংযুক্ত করুন"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "লাইন:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "ফাংশনে যান..."
@@ -7778,6 +7865,11 @@ msgstr "এই কাজটি করার জন্য একটি একক
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
+msgid "Auto Orthogonal Enabled"
+msgstr "সমকোণীয় (Orthogonal)"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Lock View Rotation"
msgstr "তথ্য দেখুন"
@@ -7877,21 +7969,30 @@ msgid "Freelook Slow Modifier"
msgstr "ফ্রি লুক স্পিড মডিফায়ার"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "তথ্য দেখুন"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "তথ্য দেখুন"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm এর সংলাপ"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Snap Nodes To Floor"
msgstr "স্ন্যাপ মোড:"
@@ -8256,7 +8357,8 @@ msgid "New Animation"
msgstr "অ্যানিমেশন"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "গতি (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -9005,7 +9107,7 @@ msgstr "TileSet (টাইল-সেট)..."
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "সমস্যা/ভুল"
@@ -10180,12 +10282,18 @@ msgstr "Tile Set এক্সপোর্ট করুন"
#: editor/project_manager.cpp
#, fuzzy
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr "ফাইলটি বিদ্যমান নয়।"
#: editor/project_manager.cpp
#, fuzzy
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "জিপ ফরম্যাট খুঁজে পেতে ব্যার্থ, প্যাকেজ ফাইল ওপেন করা যায়নি।"
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr "এমন একটি ফোল্ডার বাছাই করুন যেখানে 'project.godot' নামে কোন ফাইল নেই।"
#: editor/project_manager.cpp
@@ -10195,11 +10303,11 @@ msgstr "অনুগ্রহ করে প্রকল্পের ফোল্
#: editor/project_manager.cpp
#, fuzzy
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr "অনুগ্রহ করে প্রকল্পের ফোল্ডারের বাইরে এক্সপোর্ট করুন!"
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -10442,6 +10550,7 @@ msgstr ""
"বিদ্যমান Godot প্রজেক্টের খোঁজে আপনি %s ফোল্ডারসমূহ স্ক্যান করতে যাচ্ছেন। আপনি কি "
"সুনিশ্চিত?"
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "প্রজেক্ট ম্যানেজার"
@@ -10493,6 +10602,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "কী/চাবি "
@@ -10896,15 +11012,25 @@ msgid "Batch Rename"
msgstr "পুনঃনামকরণ করুন"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "প্রতিস্থাপন করুন"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "অভিব্যক্তি (Expression) পরিবর্তন করুন"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Advanced Options"
msgstr "অ্যানিমেশনের সিদ্ধান্তসমূহ"
@@ -10943,11 +11069,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10975,11 +11101,6 @@ msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
-msgid "Regular Expressions"
-msgstr "অভিব্যক্তি (Expression) পরিবর্তন করুন"
-
-#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
msgstr "প্রক্রিয়া-পরবর্তী স্ক্রিপ্ট:"
@@ -10988,11 +11109,11 @@ msgid "Keep"
msgstr "রাখুন"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -11014,6 +11135,16 @@ msgstr "বড় হাতের অক্ষর"
msgid "Reset"
msgstr "সম্প্রসারন/সংকোচন অপসারণ করুন (রিসেট জুম্)"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "অভিব্যক্তি (Expression) পরিবর্তন করুন"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "গ্রহনযোগ্য অক্ষরসমূহ:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "নোডের নতুন অভিভাবক দান করুন"
@@ -11080,8 +11211,9 @@ msgid "Instance Child Scene"
msgstr "শীষ্য নোড ইন্সট্যান্স করুন"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "স্ক্রিপ্ট পরিস্কার করুন"
+#, fuzzy
+msgid "Detach Script"
+msgstr "স্ক্রিপ্ট সংযুক্ত করুন"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -11118,6 +11250,11 @@ msgstr "অর্থপূর্ন!"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "নোড(সমূহ) অপসারণ করুন"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "নোড(সমূহ) অপসারণ করুন"
@@ -11253,6 +11390,13 @@ msgid "Open Documentation"
msgstr "রেফারেন্সের ডকুমেন্টেশনে খুঁজুন।"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "শীষ্য নোড তৈরি করুন"
@@ -11306,11 +11450,13 @@ msgstr ""
"উত্তরাধিকারী দৃশ্য তৈরি করে।"
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
msgstr "একটি নতুন বা বিদ্যমান স্ক্রিপ্ট নির্বাচিত নোডে সংযুক্ত করুন।"
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+#, fuzzy
+msgid "Detach the script from the selected node."
msgstr "নির্বাচিত নোড হতে একটি স্ক্রিপ্ট পরিস্কার করুন।"
#: editor/scene_tree_dock.cpp
@@ -11458,6 +11604,10 @@ msgid "A directory with the same name exists."
msgstr "একই নামের ডিরেক্টরি বিদ্যমান"
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "ফাইলটি বিদ্যমান নয়।"
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "অগ্রহণযোগ্য এক্সটেনশন"
@@ -11507,6 +11657,11 @@ msgstr "একই নামের ফাইল উপস্থিত, তা ম
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "অকার্যকর পথ।"
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "অগ্রহণযোগ্য ক্লাস নাম"
@@ -11517,7 +11672,7 @@ msgstr "সূচক/ইনডেক্স মানের অগ্রহনয
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr "স্ক্রিপ্ট"
#: editor/script_create_dialog.cpp
@@ -11546,6 +11701,12 @@ msgid "Script file already exists."
msgstr "'%s' অ্যাকশন ইতিমধ্যেই বিদ্যমান!"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "ক্লাস নাম:"
@@ -11628,6 +11789,11 @@ msgstr "ভুল/সমস্যা-সমূহ লোড করুন"
#: editor/script_editor_debugger.cpp
#, fuzzy
+msgid "Video RAM"
+msgstr "ভিডিও মেমোরি"
+
+#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Skip Breakpoints"
msgstr "বিন্দু অপসারণ করুন"
@@ -11677,8 +11843,9 @@ msgid "Total:"
msgstr "সর্বমোট:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "ভিডিও মেমোরি"
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "প্রকল্প এক্সপোর্ট করুন"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12647,6 +12814,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12671,6 +12842,32 @@ msgstr "অগ্রহণযোগ্য ক্লাস নাম"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12873,6 +13070,12 @@ msgstr ""
"সফল্ভাবে কাজ করতে CollisionShape2D এর একটি আকৃতি প্রয়োজন। অনুগ্রহ করে তার জন্য "
"একটি আকৃতি তৈরি করুন!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -13088,6 +13291,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -13109,6 +13317,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -13353,6 +13566,10 @@ msgstr ""
"আকার ধারণ করতে পারে। অন্যথায়, এটিকে একটি RenderTarget করুন এবং এর অভ্যন্তরীণ "
"দৃশ্যাবলিকে (texture) দৃশ্যমান করতে কোনো নোডে হস্তান্তর করুন।"
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -13385,6 +13602,47 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "ফাইলসিস্টেম"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "এক্সপোর্ট (Export) বা ডিপ্লয় (Deploy)-এর সময় প্রস্তুতকৃত এক্সিকিউটেবল "
+#~ "(executable) ডিবাগ (debug)-এর উদ্দেশ্যে এই কম্পিউটারের আইপি (IP)-তে সংযোগ "
+#~ "করার চেষ্টা করবে।"
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "বর্তমান দৃশ্যটি কখনোই সংরক্ষণ করা হয় নি, অনুগ্রহ করে চালানোর পূর্বে এটি সংরক্ষণ "
+#~ "করুন।"
+
+#~ msgid "Not in resource path."
+#~ msgstr "রিসোর্সের পথে নয়।"
+
+#~ msgid "Revert"
+#~ msgstr "প্রত্যাবর্তন করুন"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "এই কাজটি অসম্পাদিত করা সম্ভব হবে না। তবুও প্রত্যাবর্তন করবেন?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "দৃশ্য প্রত্যাবৃত্ত করুন"
+
+#~ msgid "Clear Script"
+#~ msgstr "স্ক্রিপ্ট পরিস্কার করুন"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "ইস্যু ট্র্যাকার"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d সংখ্যক সংঘটন প্রতিস্থাপিত হয়েছে ।"
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "স্থিত-কনভেক্স বডি গঠন করুন"
+
+#, fuzzy
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/ca.po b/editor/translations/ca.po
index dc618c880f..629583d816 100644
--- a/editor/translations/ca.po
+++ b/editor/translations/ca.po
@@ -4,18 +4,20 @@
# This file is distributed under the same license as the Godot source code.
# BennyBeat <bennybeat@gmail.com>, 2017.
# Javier Ocampos <xavier.ocampos@gmail.com>, 2018.
-# Roger Blanco Ribera <roger.blancoribera@gmail.com>, 2016-2018.
+# Roger Blanco Ribera <roger.blancoribera@gmail.com>, 2016-2018, 2020.
# Rubén Moreno <ruben.moreno.romero@gmail.com>, 2018.
-# roger <616steam@gmail.com>, 2019.
+# roger <616steam@gmail.com>, 2019, 2020.
# Roger BR <drai_kin@hotmail.com>, 2019.
# Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2020.
# Xavier Gomez <hiulit@gmail.com>, 2020.
+# Aina <ainasoga@gmail.com>, 2020.
+# Alex Mancha <codingstain@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
-"Last-Translator: Xavier Gomez <hiulit@gmail.com>\n"
+"PO-Revision-Date: 2020-06-15 01:48+0000\n"
+"Last-Translator: roger <616steam@gmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/"
"godot/ca/>\n"
"Language: ca\n"
@@ -23,7 +25,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 3.11-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -31,9 +33,8 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "L'argument per a convert() no és vàlid, utilitzeu constants TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Expected a string of length 1 (a character)."
-msgstr "S'esperava una cadena de longitud 1 (un caràcter)."
+msgstr "S'esperava una cadena de caràcters de longitud 1 (un caràcter)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -166,29 +167,24 @@ msgid "Anim Change Call"
msgstr "Canviar crida d'animació"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Modifica el temps de la clau"
+msgstr "Modifica el temps de diverses claus d'animació"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Modifica la Transició d'Animació"
+msgstr "Modifica diverses transicions d'animació"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Modifica la Transformació de l'Animació"
+msgstr "Modifica diverses transformacions de l'animació"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Modifica el valor de la clau"
+msgstr "Modifica el valor de diverses claus d'animació"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Canviar crida d'animació"
+msgstr "Canviar diverses crides d'animació"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -540,6 +536,7 @@ msgid "Seconds"
msgstr "Segons"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -571,7 +568,7 @@ msgstr "Escala amb el Cursor"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "Duplica la Selecció"
+msgstr "Duplicar la Selecció"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
@@ -579,7 +576,7 @@ msgstr "Duplica'l Transposat"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
-msgstr "Elimina la Selecció"
+msgstr "Suprimir la Selecció"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
@@ -660,7 +657,7 @@ msgstr "Seleccioneu les Pistes a Copiar"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr "Copia"
+msgstr "Copiar"
#: editor/animation_track_editor.cpp
msgid "Select All/None"
@@ -692,23 +689,21 @@ msgstr "Modifica el Valor de la Taula"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "Vés a la Línia"
+msgstr "Anar a la Línia"
#: editor/code_editor.cpp
msgid "Line Number:"
msgstr "Línia:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocurrència/es reemplaçades."
+msgid "%d replaced."
+msgstr "%d reemplaçat."
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d match."
msgstr "%d coincidència."
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
msgstr "%d coincidències."
@@ -720,9 +715,10 @@ msgstr "Distingeix entre majúscules i minúscules"
msgid "Whole Words"
msgstr "Paraules senceres"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
+#, fuzzy
msgid "Replace"
-msgstr "Reemplaça"
+msgstr "Reemplaçar"
#: editor/code_editor.cpp
msgid "Replace All"
@@ -770,6 +766,11 @@ msgid "Method in target node must be specified."
msgstr "S'ha d'especificar el mètode al node de destinació."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "El nom no és un identificador vàlid:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -853,7 +854,6 @@ msgstr "No es pot connectar el senyal"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -911,6 +911,11 @@ msgid "Signals"
msgstr "Senyals"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrat de Fitxers"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Esteu segur que voleu eliminar totes les connexions d'aquest senyal?"
@@ -948,7 +953,7 @@ msgid "Recent:"
msgstr "Recents:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cerca:"
@@ -1128,6 +1133,9 @@ msgstr "Fundadors del Projecte"
msgid "Lead Developer"
msgstr "Desenvolupador Principal"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Gestor del Projecte "
@@ -1149,6 +1157,16 @@ msgid "Gold Sponsors"
msgstr "Patrocinadors Gold"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Donants Silver"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Donants Bronze"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Patrocinadors"
@@ -1334,7 +1352,7 @@ msgstr "El Bus Principal no es pot pas eliminar!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr "Elimina Bus d'Àudio"
+msgstr "Elimina Bus d'Àudio"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
@@ -1458,7 +1476,7 @@ msgstr "Mou l'AutoCàrrega"
msgid "Remove Autoload"
msgstr "Treu Autocàrrega"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Activa"
@@ -1466,17 +1484,9 @@ msgstr "Activa"
msgid "Rearrange Autoloads"
msgstr "Reorganitza AutoCàrregues"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Camí no vàlid."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "El Fitxer no existeix."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Fora del camí dels recursos."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1503,6 +1513,10 @@ msgstr "Nom"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Enganxa els Paràmetres"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Actualitzant l'Escena"
@@ -1631,21 +1645,19 @@ msgid "Scene Tree Editing"
msgstr "Edició de l'arbre d'escenes"
#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "Importa"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
-msgstr "Node mogut"
+msgstr "Nodes"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "Sistema de Fitxers"
#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importació"
+
+#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
msgstr "Esborra el perfil '%s'? (no es pot desfer)"
@@ -1714,9 +1726,8 @@ msgid "Current Profile:"
msgstr "Perfil Actual:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "Fer Actual"
+msgstr "Fés l'actual"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1750,9 +1761,8 @@ msgid "Erase Profile"
msgstr "Esborrar Perfil"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "Administra els Perfils de Característiques de l'Editor"
+msgstr "Perfil de les funcionalitats del Godot"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
@@ -1795,7 +1805,7 @@ msgstr "Mostrar en el Gestor de Fitxers"
msgid "New Folder..."
msgstr "Nou Directori..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Refresca"
@@ -1909,7 +1919,7 @@ msgstr "Directoris i Fitxers:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Vista prèvia:"
@@ -1955,28 +1965,24 @@ msgid "Inherited by:"
msgstr "Heretat per:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Descripció:"
+msgstr "Descripció"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "Tutorials en línia:"
+msgstr "Tutorials en línia"
#: editor/editor_help.cpp
msgid "Properties"
msgstr "Propietats"
#: editor/editor_help.cpp
-#, fuzzy
msgid "override:"
-msgstr "Sobreescriu"
+msgstr "Sobreescriu:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "Predeterminat"
+msgstr "predeterminat:"
#: editor/editor_help.cpp
msgid "Methods"
@@ -1995,13 +2001,13 @@ msgid "Constants"
msgstr "Constants"
#: editor/editor_help.cpp
+#, fuzzy
msgid "Property Descriptions"
msgstr "Descripcions de la Propietat"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Valor"
+msgstr "(valor)"
#: editor/editor_help.cpp
msgid ""
@@ -2012,6 +2018,7 @@ msgstr ""
"$color][url=$url] totaportant-ne una[/url][/color]!"
#: editor/editor_help.cpp
+#, fuzzy
msgid "Method Descriptions"
msgstr "Descripcions del Mètode"
@@ -2020,7 +2027,7 @@ msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"Aquest mètode no disposa de cap descripció. Podeu contribuir [color=$color]"
+"Aquest mètode no disposa de cap descripció. Podeu contribuir [color=$color]"
"[url=$url] tot aportant-ne una[/url][/color]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
@@ -2033,9 +2040,8 @@ msgid "Case Sensitive"
msgstr "Majúscules i minúscules"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "Mostrar els Ajudants"
+msgstr "Mostra la jerarquia"
#: editor/editor_help_search.cpp
msgid "Display All"
@@ -2074,9 +2080,8 @@ msgid "Class"
msgstr "Classe"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "Mètodes"
+msgstr "Mètode"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
msgid "Signal"
@@ -2087,12 +2092,10 @@ msgid "Constant"
msgstr "Constant"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "Propietat:"
+msgstr "Propietat"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
msgstr "Propietats del tema"
@@ -2145,9 +2148,8 @@ msgid "%s/s"
msgstr "%s/s"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "Baixa"
+msgstr "Avall"
#: editor/editor_network_profiler.cpp
msgid "Up"
@@ -2158,32 +2160,28 @@ msgid "Node"
msgstr "Node"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Incoming RPC"
msgstr "RPC Entrant"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Incoming RSET"
msgstr "RSET Entrant"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Outgoing RPC"
msgstr "RPC Sortint"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Outgoing RSET"
msgstr "RSET Sortint"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr "Nova finestra"
+msgstr "Finestra nova"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr "Els recursos importats no es poden guardar."
+msgstr "Els recursos importats no es poden desar."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
@@ -2192,7 +2190,7 @@ msgstr "D'acord"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr "Error en desar recurs!"
+msgstr "Error en desar el recurs!"
#: editor/editor_node.cpp
msgid ""
@@ -2200,11 +2198,11 @@ msgid ""
"Make it unique first."
msgstr ""
"Aquest recurs no es pot desar perquè no pertany a l'escena editada. Feu-lo "
-"únic primer."
+"únic abans."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr "Anomena i Desa el Recurs..."
+msgstr "Anomena i Desa el recurs..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
@@ -2259,6 +2257,9 @@ msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"Aquesta escena no es pot desar per culpa d'una inclusió cíclica de "
+"l'instanciació.\n"
+"Resol-la i torna a desar altre cop."
#: editor/editor_node.cpp
msgid ""
@@ -2343,7 +2344,6 @@ msgstr ""
"més informació."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This is a remote object, so changes to it won't be kept.\n"
"Please read the documentation relevant to debugging to better understand "
@@ -2358,11 +2358,6 @@ msgid "There is no defined scene to run."
msgstr "No s'ha definit cap escena per executar."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"L'escena actual no s'ha desat encara. Desa l'escena abans d'executar-la."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "No s'ha pogut començar el subprocés!"
@@ -2395,9 +2390,8 @@ msgid "Save changes to '%s' before closing?"
msgstr "Desar els canvis a '%s' abans de tancar?"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "Desat(s) el(s) recurs(os) modificat(s) %s."
+msgstr "Desat(s) el(s) %s recurs(os) modificat(s)."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
@@ -2449,12 +2443,19 @@ msgid "Can't reload a scene that was never saved."
msgstr "No es pot recarregar una escena mai desada."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Reverteix"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Desa Escena"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Aquesta acció no es pot desfer. N'esteu segur?"
+#, fuzzy
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"L'escena actual té canvis sense desar.\n"
+"Voleu torna a carregar l'escena desada de totes maneres? Aquesta acció no es "
+"pot desfer."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2503,14 +2504,13 @@ msgid "Close Scene"
msgstr "Tanca l'Escena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "Tanca l'Escena"
+msgstr "Reobrir l'escena tancada"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
-"No es pot habilitar el complement a: '%s' ha fallat l'anàlisi de la "
+"No es pot habilitar el complement a: '%s' ha fallat l'anàlisi de la "
"configuració."
#: editor/editor_node.cpp
@@ -2528,7 +2528,7 @@ msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"No es pot carregar el script d'addon des del camí: '%s' Sembla que hi ha un "
+"No es pot carregar l'script d'addon des del camí: '%s' Sembla que hi ha un "
"error en el codi, si us plau comproveu la sintaxi."
#: editor/editor_node.cpp
@@ -2549,8 +2549,8 @@ msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
-"En ser importada automàticament, l'escena '%s' no es pot modificar. Per fer-"
-"hi canvis, creeu una nova escena heretada."
+"En ser importada automàticament, l'escena '%s' no es pot modificar. \n"
+"Per fer-hi canvis, creeu una nova escena heretada."
#: editor/editor_node.cpp
msgid ""
@@ -2626,9 +2626,8 @@ msgid "Close Tab"
msgstr "Tanca la Pestanya"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "Tanca la Pestanya"
+msgstr "Desfer Tancament de Pestanya"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2749,10 +2748,6 @@ msgid "Redo"
msgstr "Refés"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Reverteix Escena"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Eines vàries o d'escena."
@@ -2762,34 +2757,28 @@ msgid "Project"
msgstr "Projecte"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "Configuració del Projecte"
+msgstr "Configuració del Projecte..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "Versió:"
+msgstr "Control de Versions"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Set Up Version Control"
msgstr "Configurar Control de Versions"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Shut Down Version Control"
msgstr "Desactivar el control de versions"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "Exportar"
+msgstr "Exportar..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Install Android Build Template..."
-msgstr "Instal·lar plantilla de compilació d'Android"
+msgstr "Instal·lar Plantilla de Compilació d'Android..."
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
@@ -2800,9 +2789,8 @@ msgid "Tools"
msgstr "Eines"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "Navegador de Recursos Orfes"
+msgstr "Navegador de Recursos Orfes..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2819,24 +2807,28 @@ msgstr "Desplegar amb Depuració Remota"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"En ser exportat o desplegat, l'executable resultant intenta connectar-se a "
-"l'IP d'aquest equip per iniciar-ne la depuració."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Desplegament Reduït amb Sistema de Fitxers en Xarxa"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Amb aquesta opció activada, 'Exportar' o 'Desplegar' generen un executable "
"reduït.\n"
@@ -2850,9 +2842,10 @@ msgid "Visible Collision Shapes"
msgstr "Formes de Col·lisió Visibles"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Les formes de col·lisió i nodes de difusió de raigs (raycast) (per a 2D i "
"3D), son visibles durant l'execució del joc quan s'activa aquesta opció."
@@ -2862,23 +2855,26 @@ msgid "Visible Navigation"
msgstr "Navegació Visible"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Aquesta opció fa visibles les malles i polígons de Navegació durant "
"l'execució del joc."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sincronitzar Canvis en Escena"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"En activar aquesta opció, els canvis fets en l'Editor es repliquen en el joc "
"en execució.\n"
@@ -2886,15 +2882,17 @@ msgstr ""
"millora el rendiment."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sincronitzar Canvis en Scripts"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"En activar aquesta opció, els Scripts, en ser desats, es recarreguen en el "
"joc en execució.\n"
@@ -2906,9 +2904,8 @@ msgid "Editor"
msgstr "Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "Configuració de l'Editor"
+msgstr "Configuració de l'Editor..."
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2945,14 +2942,12 @@ msgid "Open Editor Settings Folder"
msgstr "Obre el directori de Configuració de l'Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "Administrar Característiques de l'Editor"
+msgstr "Administrar Característiques de l'Editor..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "Gestor de Plantilles d'Exportació"
+msgstr "Administrar Plantilles d'Exportació..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2963,7 +2958,7 @@ msgstr "Ajuda"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Cerca"
@@ -2977,8 +2972,14 @@ msgid "Q&A"
msgstr "Preguntes i Respostes"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Seguiment d'Incidències"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "ReImportar"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Send Docs Feedback"
+msgstr "Enviar suggeriments sobre la documentació"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3091,6 +3092,12 @@ msgid ""
"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ó."
#: editor/editor_node.cpp
#, fuzzy
@@ -3232,7 +3239,7 @@ msgstr "% del Fotograma"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr "Fotograma de Física %"
+msgstr "Fotograma de Física %"
#: editor/editor_profiler.cpp
msgid "Inclusive"
@@ -3295,6 +3302,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"No es pot crear una ViewportTexture en recursos desats en fitxers.\n"
+"El Recurs ha de pertànyer a un escena."
#: editor/editor_properties.cpp
msgid ""
@@ -3303,6 +3312,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"No es pot crear una ViewportTexture en aquest recurs ja que no s'ha definit "
+"com local per a l'escena.\n"
+"Activeu la propietat \"local a l'escena\" del recurs i també en tots els "
+"recurs intermitjos que el continguin fins a un node."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -3314,7 +3327,7 @@ msgstr "Script Nou"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
msgid "Extend Script"
-msgstr "Estendre el script"
+msgstr "Estendre l'script"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
@@ -3372,11 +3385,13 @@ msgid "Add Key/Value Pair"
msgstr "Afegeix una Parella de Clau/Valor"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
-"No s'ha trobat cap patró d'exportació executable per aquesta plataforma. \n"
+"No s'ha trobat cap patró d'exportació executable per aquesta plataforma. \n"
"Afegiu un patró predeterminat en el menú d'exportació."
#: editor/editor_run_script.cpp
@@ -3403,6 +3418,13 @@ msgstr "No s'ha pogut executar l'Script:"
msgid "Did you forget the '_run' method?"
msgstr "Podria mancar el mètode '_run'?"
+#: editor/editor_spin_slider.cpp
+#, fuzzy
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Retén Ctrl per dipositar un mètode Accessor (Getter). Retén Maj per "
+"dipositar una firma genèrica."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Selecciona Node(s) per Importar"
@@ -3491,6 +3513,8 @@ msgstr "No s'ha pogut l'objecte signatura."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
msgstr ""
+"S'ha produït un error en analitzar la llista JSON de rèpliques. Si us plau, "
+"informeu d'aquest problema!"
#: editor/export_template_manager.cpp
msgid ""
@@ -3543,13 +3567,12 @@ msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
-"No s'han pogut instal·lar les plantilles. Els fitxers problemàtics es troben "
-"a '%s'."
+"No s'han pogut instal·lar les plantilles. \n"
+"Les plantilles problemàtics es troben a '%s'."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "Error en la sol·licitud de l'url: "
+msgstr "Error en sol·licitar l'URL:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3744,9 +3767,8 @@ msgid "Move To..."
msgstr "Mou cap a..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "Nova Escena"
+msgstr "Nova Escena..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
@@ -3797,7 +3819,9 @@ msgstr "Cerca Fitxers"
msgid ""
"Scanning Files,\n"
"Please Wait..."
-msgstr "Analitzant Fitxers..."
+msgstr ""
+"Analitzant Fitxers,\n"
+"Si Us Plau Espereu..."
#: editor/filesystem_dock.cpp
msgid "Move"
@@ -3936,7 +3960,7 @@ msgstr "Gestiona Grups"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
-msgstr "Importar com a Única Escena"
+msgstr "Importar com a Única Escena"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Animations"
@@ -4008,10 +4032,18 @@ msgid "Error running post-import script:"
msgstr "Error en l'execució de l'Script de post-importació:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Desant..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Fitxers"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Establir com a valor Predeterminat per a '%s'"
@@ -4020,10 +4052,6 @@ msgid "Clear Default for '%s'"
msgstr "Neteja el valor Predeterminat de '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Fitxers"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importar com a:"
@@ -4037,7 +4065,8 @@ msgid "Reimport"
msgstr "ReImportar"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+#, fuzzy
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Guardar escenes, reimportar i reiniciar"
#: editor/import_dock.cpp
@@ -4073,10 +4102,6 @@ msgid "Copy Params"
msgstr "Copia els Paràmetres"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Enganxa els Paràmetres"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Edita el Porta-retalls de Recursos"
@@ -4454,9 +4479,8 @@ msgid "Audio Clips"
msgstr "Talls d'Àudio:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Funcions:"
+msgstr "Funcions"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4766,14 +4790,12 @@ msgid "Remove selected node or transition."
msgstr "Eliminar el node o transició seleccionats."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
-"Commuta auto reproducció d'aquesta animació en iniciar, reiniciar o buscar a "
-"zero."
+"Commuta l'auto reproducció d'aquesta animació en iniciar, reiniciar o buscar "
+"a zero."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Set the end animation. This is useful for sub-transitions."
msgstr "Definiu l'animació final. Això és útil per a sub-transicions."
@@ -4782,9 +4804,8 @@ msgid "Transition: "
msgstr "Transició: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Mode d'Escombratge lateral"
+msgstr "Mode de Reproducció:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4847,7 +4868,7 @@ msgstr "Mescla 1:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "X-Fade Time (s):"
-msgstr "Durada de la fosa (s):"
+msgstr "Durada de la fosa (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Current:"
@@ -4981,12 +5002,12 @@ msgstr "Bucle de redirecció."
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Request failed, timeout"
-msgstr "Ha fallat la sol·licitud, codi de devolució:"
+msgstr "La sol·licitud ha fallat, s'ha esgotat el temps d'espera"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Timeout."
-msgstr "Temps"
+msgstr "Temps esgotat."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -5045,20 +5066,23 @@ msgid "Download for this asset is already in progress!"
msgstr "Ja s'està baixant aquest actiu!"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Recently Updated"
-msgstr ""
+msgstr "Actualitzat Recentment"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Actualitzacions menys recents"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Name (A-Z)"
-msgstr ""
+msgstr "Nom (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Name (Z-A)"
-msgstr ""
+msgstr "Nom (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
@@ -5165,7 +5189,7 @@ msgid "Bake Lightmaps"
msgstr "Precalcular Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Previsualització"
@@ -5269,16 +5293,15 @@ msgstr ""
"anul·lats pels seus pares."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Presets for the anchors and margins values of a Control node."
-msgstr ""
-"Predefinits per als ancoratges i els valors dels marges d'un node Control."
+msgstr "Valors predefinits per als ancoratges i els marges d'un node Control."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
msgstr ""
+"En activar-se, els nodes de Control afectaren les àncores enlloc dels marges."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5322,7 +5345,7 @@ msgstr "Part inferior"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "Centre"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5346,20 +5369,19 @@ msgstr "Vista Inferior"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr ""
+msgstr "CentreV Ample"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr ""
+msgstr "CentreH Ample"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Full Rect"
-msgstr ""
+msgstr "Rect. Complet"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "Relació d'Escala:"
+msgstr "Mantenir Proporcions"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5379,6 +5401,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"Substitueix la càmera del joc.\n"
+"Substitueix la càmera del joc per la càmera de l'editor."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5386,12 +5410,13 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"Substitueix la càmera del joc.\n"
+"Cap instància del joc en execució."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "Bloca el Seleccionat"
+msgstr "Bloca la selecció"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5505,9 +5530,8 @@ msgid "Pan Mode"
msgstr "Mode d'Escombratge lateral"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "Mode d'Execució:"
+msgstr "Mode Regla"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5548,9 +5572,8 @@ msgid "Snap Relative"
msgstr "Ajustament Relatiu"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Pixel Snap"
-msgstr "Utilitzar Ajustament amb els Píxels"
+msgstr "Utilitzar ajustament amb els Píxels"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Smart Snapping"
@@ -5571,7 +5594,6 @@ msgid "Snap to Node Anchor"
msgstr "Ajustar a l'Àncora del Node"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Sides"
msgstr "Ajustar als costats del node"
@@ -5708,9 +5730,8 @@ msgid "Auto Insert Key"
msgstr "Inserir Clau Automàticament"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "S'ha insertit una Clau d'Animació."
+msgstr "Opcions de Clau d'Animació i Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5768,7 +5789,7 @@ msgid ""
"Drag & drop + Shift : Add node as sibling\n"
"Drag & drop + Alt : Change node type"
msgstr ""
-"Arrossegar i deixar anar + Maj: Afegeix un node com a germà\n"
+"Arrossegar i deixar anar + Maj: Afegeix un node com a germà\n"
"Arrossegar i deixar anar + Maj: Canvia el tipus del node"
#: editor/plugins/collision_polygon_editor_plugin.cpp
@@ -5824,12 +5845,13 @@ msgstr "Màscara d'Emissió"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Solid Pixels"
-msgstr ""
+msgstr "Píxels sòlids"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
+#, fuzzy
msgid "Border Pixels"
-msgstr ""
+msgstr "Píxels de la vora"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5882,7 +5904,7 @@ msgstr "Sortida Lenta"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Smoothstep"
-msgstr "pas de Suavització"
+msgstr "Progressió Suau (SmoothStep)"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Point"
@@ -5963,12 +5985,13 @@ msgid "Mesh is empty!"
msgstr "La malla és buida!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Crea un Cos Estàtic a partir d'una malla de triangles"
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Crea una Col·lisió entre malles de triangles germanes."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Crea un Cos Estàtic Convex"
+msgid "Create Static Trimesh Body"
+msgstr "Crea un Cos Estàtic a partir d'una malla de triangles"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5981,12 +6004,32 @@ msgstr "Crea un forma amb una malla de triangles"
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Failed creating shapes!"
-msgstr "Ha fallat la creació de formes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"No es pot crear una sola forma de col·lisió convexa per a l'arrel de "
+"l'escena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "No s'ha pogut crear una forma de col·lisió convexa."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "Crea una Forma Convexa"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "No s'ha pogut crear el directori."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Crea una Forma Convexa"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6038,19 +6081,57 @@ msgid "Create Trimesh Static Body"
msgstr "Crea un Cos Estàtic a partir d'una malla de triangles"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Crea una Col·lisió entre malles de triangles germanes"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Crea col·lisions convexes entre nodes germans"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Crea col·lisions convexes entre nodes germans"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Crea una malla de contorn..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Visualitza UV1"
@@ -6072,7 +6153,7 @@ msgstr "Mida del Contorn:"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Channel Debug"
-msgstr ""
+msgstr "Depuració del canal UV"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
@@ -6083,12 +6164,14 @@ msgstr "Elimina l'element %d?"
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Actualitza des de l'Escena"
+msgstr ""
+"Actualitzar des d'una 'Escena existent?:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
#, fuzzy
msgid "Mesh Library"
-msgstr "Biblioteca de Models (MeshLibrary)..."
+msgstr "Biblioteca de Models (MeshLibrary)"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6332,7 +6415,7 @@ msgstr "Selecciona Punts"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Shift+Drag: Select Control Points"
-msgstr "Maj.+ Arrossegar: Selecciona Punts de Control"
+msgstr "Maj.+ Arrossegar: Selecciona Punts de Control"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -6376,12 +6459,12 @@ msgstr "Opcions"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Reflecteix els Angles de la Nansa"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Reflecteix les mides de la Nansa"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -6449,6 +6532,8 @@ msgid ""
"Polygon 2D has internal vertices, so it can no longer be edited in the "
"viewport."
msgstr ""
+"El polígon 2D no pot ser editat en l'àrea de visualització ja que conté "
+"vèrtexs interns."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create Polygon & UV"
@@ -6605,7 +6690,7 @@ msgstr "Configurar Quadrícula:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Offset X:"
-msgstr "Desplaçament X de la quadrícula:"
+msgstr "Desplaçament X de la quadrícula:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Offset Y:"
@@ -6675,7 +6760,7 @@ msgstr "ResourcePreloader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "L'AnimationTree no té ruta assignada cap a un AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
@@ -6734,20 +6819,22 @@ msgstr "Anomena i Desa..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "No s'ha trobat l'script per executar-lo."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "L'script ha fallat al recarregar, comproveu els errors en la consola."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "L'script no està en mode d'eina, no es podrà executar."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
+"Si es vol executar l'script, ha d'heretar de EditorScript i configuar-se en "
+"mode Eina (tool)."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6909,15 +6996,6 @@ msgid "Open Godot online documentation."
msgstr "Obrir la documentació en línia de Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Sol·licitar Documentació"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Ajudeu a millorar la documentació de Godot donant comentaris"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Cerca dins la documentació de referència."
@@ -6984,12 +7062,13 @@ msgstr ""
"'%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Línia"
+#, fuzzy
+msgid "[Ignore]"
+msgstr "(ignorar)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignorar)"
+msgid "Line"
+msgstr "Línia"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7003,6 +7082,7 @@ msgstr "Només s'hi poden deixar caure Recursos del sistema de fitxers."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
msgstr ""
+"No s'hi poden afegir els nodes ja que l'escena no utilitza l'script '%s' ."
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7044,9 +7124,8 @@ msgid "Bookmarks"
msgstr "Marcadors"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Breakpoints"
-msgstr "Crea punts."
+msgstr "Punts d’interrupció"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -7080,7 +7159,7 @@ msgstr "(Des)Plega la línia"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
-msgstr "Plega totes les Línies"
+msgstr "Plega totes les Línies"
#: editor/plugins/script_text_editor.cpp
msgid "Unfold All Lines"
@@ -7200,7 +7279,7 @@ msgstr "Esquelet2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
#, fuzzy
msgid "Make Rest Pose (From Bones)"
-msgstr "Crear Pose de Repòs (A partir dels Ossos)"
+msgstr "Crear Pose de Repòs (A partir dels Ossos)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
#, fuzzy
@@ -7250,7 +7329,7 @@ msgstr "Transformació de l'Eix Z."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr "Transformació de la Vista."
+msgstr "Transformació en el Pla de la Vista."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scaling: "
@@ -7258,7 +7337,7 @@ msgstr "Escala: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translating: "
-msgstr "Traslladant: "
+msgstr "Translació: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
@@ -7266,7 +7345,7 @@ msgstr "Rotació de %s graus."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Keying is disabled (no key inserted)."
-msgstr "l'Edició de Claus està inhabilitada (no s'ha inserit cap Clau)."
+msgstr "l'Edició de Claus està inhabilitada (no s'ha inserit cap Clau)."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Animation Key Inserted."
@@ -7279,7 +7358,7 @@ msgstr "commutador"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "Guinyada"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -7368,6 +7447,11 @@ msgid "This operation requires a single selected node."
msgstr "Aquesta operació requereix un únic node seleccionat."
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Auto Orthogonal Enabled"
+msgstr "Ortogonal"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Bloquejar Rotació de la Vista"
@@ -7421,8 +7505,9 @@ msgid "Cinematic Preview"
msgstr "Previsualització Cinemàtica"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Not available when using the GLES2 renderer."
-msgstr ""
+msgstr "No disponible quan s'utilitza el renderitzador GLES2."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7458,6 +7543,10 @@ msgid "Freelook Slow Modifier"
msgstr "Modificador de la Velocitat de la Vista Lliure"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotació de la Vista Bloquejada"
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
@@ -7467,14 +7556,19 @@ msgstr ""
"No es pot utilitzar com una indicació fiable del rendiment en el joc."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Rotació de la Vista Bloquejada"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Diàleg XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Ajustar Nodes al Terra"
@@ -7489,9 +7583,9 @@ msgid ""
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
msgstr ""
-"Arrossegar: Gira\n"
+"Arrossegar: Gira\n"
"Alt+Arrossegar: Mou\n"
-"Alt+Clic Dret: Selecció de llista de profunditat"
+"Alt+Clic Dret: Selecció de llista de profunditat"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -7598,9 +7692,8 @@ msgstr "Mostra la Graella"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Settings..."
-msgstr "Configuració"
+msgstr "Configuració..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7685,7 +7778,7 @@ msgstr "Crear Polígon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Polygon2D Preview"
-msgstr ""
+msgstr "Previsualització del Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7762,11 +7855,11 @@ msgstr "Simplificació: "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Shrink (Pixels): "
-msgstr ""
+msgstr "Redueix (Píxels): "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
-msgstr ""
+msgstr "Engrandeix (Píxels): "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Update Preview"
@@ -7791,9 +7884,8 @@ msgid "Add Frame"
msgstr "Afegeix Fotograma"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "No s'ha pogut carregar el recurs."
+msgstr "No s'han pogut carregar les imatges"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -7833,7 +7925,8 @@ msgid "New Animation"
msgstr "Nova Animació"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Velocitat (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8023,7 +8116,7 @@ msgstr "Element de ràdio validat"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Named Sep."
-msgstr ""
+msgstr "Separador amb nom."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
@@ -8157,11 +8250,11 @@ msgstr "Habilitar Prioritat"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
msgid "Filter tiles"
-msgstr "Filtrat de Fitxers..."
+msgstr "Filtrat de Fitxers"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
-msgstr ""
+msgstr "Assigna un recurs TileSet a aquest TileMap per a usar-ne les peces."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
@@ -8203,12 +8296,12 @@ msgstr "Restablir Transformació"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "Add Texture(s) to TileSet."
-msgstr "Afegeix Nodes des d'Arbre"
+msgstr "Afegeix Nodes des d'Arbre."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "Elimina l'entrada actual"
+msgstr "Elimineu la textura seleccionada de TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -8220,7 +8313,7 @@ msgstr "Combina-ho a partir de l'Escena"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
-msgstr ""
+msgstr "Nova peça individual"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8362,6 +8455,8 @@ msgstr "Mostrar noms de les rajoles (manteniu pressionada la tecla Alt)"
msgid ""
"Add or select a texture on the left panel to edit the tiles bound to it."
msgstr ""
+"Afegeix o selecciona una textura en el plafó esquerra per a editar-ne les "
+"peces assignades."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected texture? This will remove all tiles which use it."
@@ -8394,6 +8489,8 @@ msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Arrossega les nanses per editar el Rect.\n"
+"Clica en una altra Peça per a editar-lo."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8553,11 +8650,10 @@ msgid "TileSet"
msgstr "Conjunt de rajoles"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "No VCS addons are available."
-msgstr "Nom del pare del node, si està disponible"
+msgstr "No hi ha addons VCS disponibles."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Error"
@@ -8568,7 +8664,7 @@ msgstr "Manca Nom"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr ""
+msgstr "No hi ha fitxers afegits a l'escenari"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8576,12 +8672,13 @@ msgid "Commit"
msgstr "Comunitat"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "VCS Addon is not initialized"
-msgstr ""
+msgstr "L'Addon VCS no està inicialitzat"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control System"
-msgstr ""
+msgstr "Sistema de control de versions"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8590,12 +8687,11 @@ msgstr "Converteix a Majúscules"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
-msgstr ""
+msgstr "Zona de posada en escena"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Detect new changes"
-msgstr "Crear un nou rectangle."
+msgstr "Detectar nous canvis"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8604,7 +8700,7 @@ msgstr "Modifica"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Modified"
-msgstr ""
+msgstr "Modificat"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8632,8 +8728,9 @@ msgid "Stage All"
msgstr "Desa-ho Tot"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Add a commit message"
-msgstr ""
+msgstr "Afegir un missatge de commit"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8648,6 +8745,8 @@ msgstr "Estat"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "View file diffs before committing them to the latest version"
msgstr ""
+"Verifica les diferències entre fitxers abans de publicar-les a la darrera "
+"versió"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8656,7 +8755,7 @@ msgstr "Cap fitxer seleccionat!"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect changes in file diff"
-msgstr ""
+msgstr "Detecta els canvis en el fitxer"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(GLES3 only)"
@@ -8668,9 +8767,8 @@ msgid "Add Output"
msgstr "Afegeix una Entrada"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "Escala:"
+msgstr "Escalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector"
@@ -8791,7 +8889,7 @@ msgstr "Crear node Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Color function."
-msgstr "Vés a la Funció"
+msgstr "Funció color."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
@@ -8812,11 +8910,11 @@ msgstr "Converteix el vector RGB en un equivalent de HSV."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Sepia function."
-msgstr "Reanomena Funció"
+msgstr "Funció sèpia."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
-msgstr ""
+msgstr "Operador de gravació."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8829,7 +8927,7 @@ msgstr "Operador diferencial."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr ""
+msgstr "Operador Dodge (sobreexposició)."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8843,15 +8941,15 @@ msgstr "Operador Aclarir."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr ""
+msgstr "Operador de superposició."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "Operador Screen (trama)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "Operador de llum suau."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color constant."
@@ -8860,7 +8958,7 @@ msgstr "Constant de color."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Color uniform."
-msgstr "Transforma"
+msgstr "Color uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8945,13 +9043,12 @@ msgstr ""
"escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Boolean constant."
-msgstr "Modificar una constant vectorial"
+msgstr "Constant booleana."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
-msgstr ""
+msgstr "Booleà uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8993,14 +9090,12 @@ msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr "paràmetre d'entrada 'alpha' per modes shader vèrtex i el fragment."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "Modifica una Funció Escalar"
+msgstr "Funció escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "Modifica un operador escalar"
+msgstr "Operador escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
@@ -9041,7 +9136,7 @@ msgstr "Retorna el valor absolut del paràmetre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr "Retorna el l'arc cosinus del paràmetre."
+msgstr "Retorna el l'arc cosinus del paràmetre."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9165,7 +9260,7 @@ msgstr "(Només GLES3) Troba l'enter parell més proper al paràmetre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "Restringeix el valor entre 0.0 i 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
@@ -9192,6 +9287,11 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"Retorna 0,0 si \"x\" és menor que \"edge0\" i 1,0 si x és més gran que "
+"\"edge1\". En cas contrari, el valor retornat s’interpola entre 0,0 i 1,0 "
+"amb polinomis Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9199,6 +9299,9 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"Retorna 0.0 si 'x' és menor que 'edge' o 1.0 en cas contrari."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
@@ -9235,14 +9338,13 @@ msgid "Subtracts scalar from scalar."
msgstr "Resta escalar d'escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar constant."
-msgstr "Modificar una constant escalar"
+msgstr "Constant escalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Scalar uniform."
-msgstr "Modificar un Uniforme Escalar"
+msgstr "Escalar uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9257,7 +9359,7 @@ msgstr "Realitza la cerca de textures."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Cubic texture uniform lookup."
-msgstr "Modifica un Uniforme Textura"
+msgstr "Modifica un Uniforme Textura."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9284,6 +9386,11 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
+"Calcula el producte exterior d'un parell de vector. \n"
+"\n"
+"OuterProduct tracta el primer paràmetre 'c' com un vector de columna (m x 1) "
+"i el segon paràmetre 'r' com a vector de fila (1 x n) i en fa una "
+"multiplicació de matrius 'c * r', produint una matriu de mida ( m x n )."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
@@ -9333,7 +9440,7 @@ msgstr "Funció vector."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vector operator."
-msgstr "Modifica un operador vectorial"
+msgstr "Operador de vector."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
@@ -9416,6 +9523,11 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
+"\n"
+"Retorna 0,0 si 'x' és menor que'edge0 'i 1,0 si 'x' és més gran que'edge1 '. "
+"Altrament s'interpola el valor entre 0,0 i 1,0 utilitzant polinomis "
+"d'Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9425,6 +9537,11 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
+"\n"
+"Retorna 0,0 si 'x' és menor que'edge0 'i 1,0 si 'x' és més gran que'edge1 '. "
+"Altrament s'interpola el valor entre 0,0 i 1,0 utilitzant polinomis "
+"d'Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9432,6 +9549,9 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"SmoothStep function(vector(edge), vector(x)).\n"
+"\n"
+"Retorna 0,0 si 'x' és menor que'edge0 ' o 1.0 en cas contrari."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9471,16 +9591,15 @@ msgid "Vector uniform."
msgstr "Modifica un Uniforme Vectorial"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Custom Godot Shader Language expression, with custom amount of input and "
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
"Expressió personalitzada del llenguatge de Shader de Godot, amb una "
-"quantitat de ports d'entrada i sortida personalitzats. Això es una una "
-"injecció de codi directa en la funció vertex/fragment/light, no lo utilitzau "
-"per a escriure les declaracions de la funció dins seu."
+"quantitat de ports d'entrada i sortida personalitzats. Això es una injecció "
+"de codi directa en la funció vertex/fragment/light, no lo utilitzau per a "
+"escriure les declaracions de la funció dins seu."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9605,7 +9724,7 @@ msgstr "El camí d'exportació donat no existeix:"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
-msgstr "Manquen d'exportació per aquesta plataforma o s'han malmès:"
+msgstr "Manquen d'exportació per aquesta plataforma o s'han malmès:"
#: editor/project_export.cpp
msgid "Presets"
@@ -9650,22 +9769,20 @@ msgid "Resources to export:"
msgstr "Recursos per exportar:"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Filtres per a l'exportació fitxers no-recurs (separats per comes, ex: *."
-"json, *. txt)"
+"Filtres per a l'exportació de fitxers/carpetes no-recurs \n"
+"(separats per comes, ex: *.json, *. txt, docs/*)"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Filtres per excloure fitxers del projecte (separats per comes, ex:*.json, *."
-"txt)"
+"Filtres per excloure fitxers/carpetes del projecte\n"
+"(separats per comes, ex:*.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
@@ -9678,7 +9795,7 @@ msgstr "Crea un Pedaç"
#: editor/project_export.cpp
#, fuzzy
msgid "Pack File"
-msgstr " Fitxers"
+msgstr "Fitxers"
#: editor/project_export.cpp
msgid "Features"
@@ -9738,9 +9855,8 @@ msgid "Export All"
msgstr "Exportar Tot"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " Fitxers"
+msgstr "Fitxer ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
@@ -9759,11 +9875,20 @@ msgid "Export With Debug"
msgstr "Exporta en mode Depuració"
#: editor/project_manager.cpp
-msgid "The path does not exist."
+#, fuzzy
+msgid "The path specified doesn't exist."
msgstr "El camí no existeix."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+"S'ha produit un error en obrir el fitxer comprimit, no té el format ZIP."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr "Fitxer de projecte '.zip' invalid, no conte un fitxer 'project.godot'."
#: editor/project_manager.cpp
@@ -9771,11 +9896,13 @@ msgid "Please choose an empty folder."
msgstr "Selecciona un directori buit."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+#, fuzzy
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr "Si us plau seleccioneu un fitxer 'project.godot' o '.zip'."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+#, fuzzy
+msgid "This directory already contains a Godot project."
msgstr "El directori ja conté un projecte de Godot."
#: editor/project_manager.cpp
@@ -10042,6 +10169,7 @@ msgstr ""
"existents?\n"
"Això pot trigar una estona."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Gestor del Projecte"
@@ -10093,6 +10221,13 @@ msgstr ""
"Actualment no teniu cap projecte.\n"
"Us agradaria explorar projectes d'exemple oficials a la biblioteca d'actius?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Tecla "
@@ -10114,7 +10249,7 @@ msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"Nom d'acció no vàlid. No pot estar buit ni contenir '/', ':', '=', '\\' o "
+"Nom d'acció no vàlid. No pot estar buit ni contenir '/', ':', '=', '\\' o "
"'\"'"
#: editor/project_settings_editor.cpp
@@ -10480,14 +10615,26 @@ msgid "Batch Rename"
msgstr "Reanomena"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Reemplaça: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Prefix"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Sufix"
#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Expressions Regulars"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Opcions Avançades"
@@ -10524,11 +10671,13 @@ msgstr ""
"Comparar opcions de comptador."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+#, fuzzy
+msgid "Per-level Counter"
msgstr "Comptador per nivell"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Si s'estableix el comptador es reinicia per a cada grup de nodes fills"
#: editor/rename_dialog.cpp
@@ -10555,10 +10704,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Expressions Regulars"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Post-Processat"
@@ -10568,11 +10713,11 @@ msgid "Keep"
msgstr "Mantenir"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10592,6 +10737,16 @@ msgstr "A Majúscules"
msgid "Reset"
msgstr "Resetejar"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Expressions Regulars"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Al caràcter %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Torna a Parentar el Node"
@@ -10658,8 +10813,9 @@ msgid "Instance Child Scene"
msgstr "Instancia una Escena Filla"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Esborra l'Script"
+#, fuzzy
+msgid "Detach Script"
+msgstr "Adjunta-li un Script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10700,13 +10856,16 @@ msgstr "Convertir node en arrel"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Voleu suprimir el node \"%s\" i els seus fills?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Eliminar Nodes"
+msgstr "Suprimir %d nodes?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete the root node \"%s\"?"
-msgstr "Elimina el(s) Node(s) de Graf d'Ombreig"
+msgstr "Voleu suprimir el node arrel \"% s\"?"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10714,9 +10873,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr "Voleu suprimir el node \"%s\" i els seus fills?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Eliminar Nodes"
+msgstr "Suprimir el node \"% s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10835,6 +10993,13 @@ msgid "Open Documentation"
msgstr "Obrir documentació"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Afegeix un Node Fill"
@@ -10887,11 +11052,13 @@ msgstr ""
"node arrel."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
msgstr "Adjunta un Script nou o existent per al Node Seleccionat."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+#, fuzzy
+msgid "Detach the script from the selected node."
msgstr "Reestableix un Script per al node Seleccionat."
#: editor/scene_tree_dock.cpp
@@ -11027,6 +11194,10 @@ msgid "A directory with the same name exists."
msgstr "Ja existeix un directori amb el mateix nom."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "El Fitxer no existeix."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "L'extensió no és vàlida."
@@ -11068,6 +11239,10 @@ msgid "File exists, it will be reused."
msgstr "El fitxer ja existeix, es reutilitzarà."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Camí no vàlid."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Nom de classe no vàlid."
@@ -11076,8 +11251,9 @@ msgid "Invalid inherited parent name or path."
msgstr "El nom o camí del pare heretat no és vàlid."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "El script és vàlid."
+#, fuzzy
+msgid "Script path/name is valid."
+msgstr "L' script és vàlid."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11102,19 +11278,22 @@ msgid "Script file already exists."
msgstr "L'Acció '%s' ja existeix!"
#: editor/script_create_dialog.cpp
-#, fuzzy
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
-msgstr "Nom de Classe"
+msgstr "Nom de la Classe:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "Plantilla"
+msgstr "Plantilla:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "Script Integrat"
+msgstr "Script integrat:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -11153,14 +11332,13 @@ msgid "C++ Source"
msgstr "Font"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
-msgstr "Font"
+msgstr "Font:"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "C++ Source:"
-msgstr "Font"
+msgstr "Font de C++:"
#: editor/script_editor_debugger.cpp
#, fuzzy
@@ -11182,6 +11360,11 @@ msgstr "Error de Còpia"
#: editor/script_editor_debugger.cpp
#, fuzzy
+msgid "Video RAM"
+msgstr "Memòria de Vídeo"
+
+#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Skip Breakpoints"
msgstr "Crea punts."
@@ -11204,7 +11387,7 @@ msgstr "Perfilador"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Network Profiler"
-msgstr "Exportar Perfil"
+msgstr "Profiler de xarxa"
#: editor/script_editor_debugger.cpp
msgid "Monitor"
@@ -11231,8 +11414,9 @@ msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Memòria de Vídeo"
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Exportar Perfil"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11601,7 +11785,7 @@ msgstr "Trieu la distància:"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Filter meshes"
-msgstr "Filtra Mode:"
+msgstr "Filtrar malles"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
@@ -11915,7 +12099,7 @@ msgstr "Connecta els Nodes"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
-msgstr "La funció '%s' ja existeix en l'Script"
+msgstr "La funció '%s' ja existeix en l'Script"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Input Value"
@@ -11984,7 +12168,7 @@ msgstr "Edició del Senyal:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Make Tool:"
-msgstr "Fer Local"
+msgstr "Convertir en Eina:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
@@ -11993,7 +12177,7 @@ msgstr "Membres:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Change Base Type:"
-msgstr "Modifica el Tipus de Base"
+msgstr "Canviar Tipus de Base:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -12008,7 +12192,7 @@ msgstr "Afegeix una Funció"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "function_name"
-msgstr "Funció:"
+msgstr "nom_funció"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -12156,13 +12340,17 @@ msgstr "L'executable ADB no està configurat a la configuració de l'editor."
#: platform/android/export/export.cpp
#, fuzzy
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr "OpenJDK Jarsigner no està configurat en la configuració de l'editor."
+msgstr "OpenJDK Jarsigner no està configurat en la configuració de l'editor."
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
#, fuzzy
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12194,6 +12382,32 @@ msgid "Invalid package name:"
msgstr "El nom del paquet no és vàlid:"
#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
#, fuzzy
msgid ""
"Trying to build from a custom built template, but no version info for it "
@@ -12298,7 +12512,7 @@ msgstr "Utilitzant la imatge de presentació per defecte."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid package short name."
-msgstr "El nom del paquet no és vàlid:"
+msgstr "El nom curt del paquet no és vàlid."
#: platform/uwp/export/export.cpp
msgid "Invalid package unique name."
@@ -12413,6 +12627,12 @@ msgstr ""
"S'ha de proporcionar una forma perquè *CollisionShape2D pugui funcionar. "
"Creeu-li un recurs de forma (shape)!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12654,6 +12874,11 @@ msgstr ""
"Les formes de tipus pla no funcionen bé i se suprimiran en futures versions. "
"Si us plau, no els utilitzeu."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Res és visible perquè no s'ha assignat cap malla."
@@ -12677,6 +12902,11 @@ msgstr ""
"Les GIProbes no estan suportades pel controlador de vídeo GLES2.\n"
"Utilitzeu un BakedLightmap en el seu lloc."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
#, fuzzy
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
@@ -12846,11 +13076,15 @@ msgid "This node has been deprecated. Use AnimationTree instead."
msgstr ""
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid ""
"Color: #%s\n"
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"Color: #%s\n"
+"LMB: Defineix el color\n"
+"RMB: Elimina la configuració preestablerta"
#: scene/gui/color_picker.cpp
#, fuzzy
@@ -12920,7 +13154,7 @@ msgid ""
msgstr ""
"ScrollContainer fou pensat per treballar-hi amb un sol Control fill.\n"
"Utilitzeu un contenidor (VBox, HBox, ...) com a fill, o un utilitzeu Control "
-"i personalitzeu-hi la mida mínima manualment."
+"i personalitzeu-hi la mida mínima manualment."
#: scene/gui/tree.cpp
msgid "(Other)"
@@ -12946,6 +13180,10 @@ msgstr ""
"forma per tal d'obtenir-ne la mida. Altrament, establiu-la com a Destinació "
"de Renderització i assigneu-ne la textura interna a algun node."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12976,6 +13214,55 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Les constants no es poden modificar."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Importació i sistema de fitxers"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "En ser exportat o desplegat, l'executable resultant intenta connectar-se "
+#~ "a l'IP d'aquest equip per iniciar-ne la depuració."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "L'escena actual no s'ha desat encara. Desa l'escena abans d'executar-la."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Fora del camí dels recursos."
+
+#~ msgid "Revert"
+#~ msgstr "Reverteix"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Aquesta acció no es pot desfer. N'esteu segur?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Reverteix Escena"
+
+#~ msgid "Clear Script"
+#~ msgstr "Esborra l'Script"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Seguiment d'Incidències"
+
+#~ msgid "Request Docs"
+#~ msgstr "Sol·licitar Documentació"
+
+#, fuzzy
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Ajudeu a millorar la documentació de Godot donant comentaris"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d ocurrència/es reemplaçades."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Crea un Cos Estàtic Convex"
+
+#, fuzzy
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Ha fallat la creació de formes!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/cs.po b/editor/translations/cs.po
index b060c0c234..2839053135 100644
--- a/editor/translations/cs.po
+++ b/editor/translations/cs.po
@@ -9,7 +9,7 @@
# Luděk Novotný <gladosicek@gmail.com>, 2016, 2018.
# Martin Novák <maidx@seznam.cz>, 2017, 2019.
# zxey <r.hozak@seznam.cz>, 2018.
-# Vojtěch Šamla <auzkok@seznam.cz>, 2018, 2019.
+# Vojtěch Šamla <auzkok@seznam.cz>, 2018, 2019, 2020.
# Peeter Angelo <contact@peeterangelo.com>, 2019.
# VojtechBrezina <vojta.brezina@gmail.com>, 2019.
# Garrom Orc Shaman <garromorcshaman@gmail.com>, 2019.
@@ -17,12 +17,17 @@
# Luboš Nečas <lubosnecas506@seznam.cz>, 2019.
# David Kubeš <kubesdavid@email.cz>, 2019.
# Emil Jiří Tywoniak <emil.tywoniak@gmail.com>, 2020.
+# Filip Vincůrek <vincurek.f@gmail.com>, 2020.
+# Ondrej Pavelka <ondrej.pavelka@outlook.com>, 2020.
+# Zbyněk <zbynek.fiala@gmail.com>, 2020.
+# Daniel Kříž <Daniel.kriz@protonmail.com>, 2020.
+# VladimirBlazek <vblazek042@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-03 21:21+0000\n"
-"Last-Translator: Emil Jiří Tywoniak <emil.tywoniak@gmail.com>\n"
+"PO-Revision-Date: 2020-09-12 00:46+0000\n"
+"Last-Translator: VladimirBlazek <vblazek042@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/"
"cs/>\n"
"Language: cs\n"
@@ -30,7 +35,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 3.10\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -50,7 +55,7 @@ msgstr "Nedostatek bajtů pro dekódování bajtů, nebo neplatný formát."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Neplatný vstup %i (neprošel) ve výrazu"
+msgstr "Neplatný vstup %i (nepředán) ve výrazu"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -131,11 +136,11 @@ msgstr "Vložit klíč zde"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "Duplikovat klíč(e)"
+msgstr "Duplikovat vybrané klíč(e)"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "Smazat klíč(e)"
+msgstr "Smazat vybrané klíč(e)"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
@@ -290,7 +295,7 @@ msgstr "Přepínací Stopa Povolena"
#: editor/animation_track_editor.cpp
msgid "Continuous"
-msgstr "Spojité"
+msgstr "Nepřetržité"
#: editor/animation_track_editor.cpp
msgid "Discrete"
@@ -542,6 +547,7 @@ msgid "Seconds"
msgstr "Sekundy"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -701,8 +707,8 @@ msgid "Line Number:"
msgstr "Číslo řádku:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Nahrazeno %d výskytů."
+msgid "%d replaced."
+msgstr "%d nahrazeno."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -720,7 +726,7 @@ msgstr "Rozlišovat malá/velká"
msgid "Whole Words"
msgstr "Celá slova"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Nahradit"
@@ -745,13 +751,13 @@ msgstr "Přepnout panel skriptů"
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "Přiblížit"
+msgstr "Zvětšit"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "Oddálit"
+msgstr "Změnšit"
#: editor/code_editor.cpp
msgid "Reset Zoom"
@@ -770,6 +776,10 @@ msgid "Method in target node must be specified."
msgstr "Je nutné zadat metodu v cílovém uzlu."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Jméno metody musí být platný identifikátor."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -820,7 +830,7 @@ msgstr "Další argumenty volání:"
#: editor/connections_dialog.cpp
msgid "Receiver Method:"
-msgstr "Metoda přijímače:"
+msgstr "Metoda příjemce:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -851,7 +861,6 @@ msgstr "Připojit Signál"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -909,6 +918,11 @@ msgid "Signals"
msgstr "Signály"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrovat soubory..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Jste si jistí, že chcete odstranit všechna připojení z tohoto signálu?"
@@ -946,7 +960,7 @@ msgid "Recent:"
msgstr "Nedávné:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Hledat:"
@@ -1055,9 +1069,8 @@ msgid "Error loading:"
msgstr "Chyba při načítání:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "Scénu se nepodařilo načíst kvůli chybějícím závislostem:"
+msgstr "Načtení selhalo kvůli chybějícím závislostem:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1117,7 +1130,7 @@ msgstr "Děkujeme za komunitu Godotu!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
-msgstr "Přispívající do Godot Enginu"
+msgstr "Přispěvatelé do Godot Enginu"
#: editor/editor_about.cpp
msgid "Project Founders"
@@ -1127,6 +1140,9 @@ msgstr "Zakladatelé projektu"
msgid "Lead Developer"
msgstr "Vedoucí vývojář"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Správce projektu "
@@ -1148,6 +1164,16 @@ msgid "Gold Sponsors"
msgstr "Zlatí sponzoři"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Stříbrní dárci"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronzoví dárci"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Malí sponzoři"
@@ -1204,9 +1230,8 @@ msgid "Error opening package file, not in ZIP format."
msgstr "Nepodařilo se otevřít balíček, není ve formátu ZIP."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "Již existující"
+msgstr "%s (již existuje)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1214,12 +1239,11 @@ msgstr "Dekomprese uživatelského obsahu"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "Selhala extrakce následujících souborů z balíčku:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "%d více souborů"
+msgstr "A %s dalších souborů."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
@@ -1231,9 +1255,8 @@ msgid "Success!"
msgstr "Úspěch!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "Obsah:"
+msgstr "Obsah balíčku:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1293,7 +1316,7 @@ msgstr "Přetažením uspořádejte."
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr "Solo"
+msgstr "Sólo"
#: editor/editor_audio_buses.cpp
msgid "Mute"
@@ -1373,9 +1396,8 @@ msgid "Invalid file, not an audio bus layout."
msgstr "Neplatný soubor, neni to rozložení Audio Busu."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Chyba při ukládání souboru!"
+msgstr "Chyba při ukládání souboru: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
@@ -1459,7 +1481,7 @@ msgstr "Přemístit Autoload"
msgid "Remove Autoload"
msgstr "Odstranit Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Povolit"
@@ -1467,17 +1489,9 @@ msgstr "Povolit"
msgid "Rearrange Autoloads"
msgstr "Přeskupit Autoloady"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Neplatná cesta."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Soubor neexistuje."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Není v cestě ke zdroji."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1502,7 +1516,11 @@ msgstr "Název"
#: editor/editor_autoload_settings.cpp
msgid "Singleton"
-msgstr "Singleton"
+msgstr "Singleton (jedináček)"
+
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Vložit parametry"
#: editor/editor_data.cpp
msgid "Updating Scene"
@@ -1583,7 +1601,6 @@ msgstr ""
"Etc 2' v nastaveních projektu."
#: editor/editor_export.cpp
-#, fuzzy
msgid ""
"Target platform requires 'ETC' texture compression for the driver fallback "
"to GLES2.\n"
@@ -1591,8 +1608,9 @@ msgid ""
"Enabled'."
msgstr ""
"Cílová platforma vyžaduje kompresi textur 'ETC' pro použití GLES2 jako "
-"zálohy. Povolte 'Import Etc' v nastaveních projektu, nebo vypněte 'Driver "
-"Fallback Enabled'."
+"zálohy.\n"
+"Povolte 'Import Etc' v nastaveních projektu, nebo vypněte 'Driver Fallback "
+"Enabled'."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1624,27 +1642,27 @@ msgstr "Editor skriptů"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr "Knihovna assetů"
+msgstr "Knihovna zdrojů (AssetLib)"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
msgstr "Úpravy stromu scény"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importovat dok"
-
-#: editor/editor_feature_profile.cpp
#, fuzzy
msgid "Node Dock"
msgstr "Uzel přesunut"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "Souborový systém"
#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importovat dok"
+
+#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
msgstr "Smazat profil '%s'? (bez možnosti vrácení)"
@@ -1661,14 +1679,12 @@ msgid "(Editor Disabled, Properties Disabled)"
msgstr "(Editor zakázán, Vlastnosti zakázány)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "Pouze vlastnosti"
+msgstr "(Vlastnosti deaktivovány)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "Vypnuto"
+msgstr "(Editor deaktivován)"
#: editor/editor_feature_profile.cpp
msgid "Class Options:"
@@ -1793,7 +1809,7 @@ msgstr "Zobrazit ve správci souborů"
msgid "New Folder..."
msgstr "Nová složka..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Obnovit"
@@ -1859,7 +1875,7 @@ msgstr "Přepnout režim"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr ""
+msgstr "Zvýraznit cestu"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
@@ -1887,12 +1903,11 @@ msgstr "Obnovit soubory."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr "Přidat/odebrat složku z oblíbených"
+msgstr "Přidat/odebrat složku z oblíbených."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "Zobrazit skryté soubory"
+msgstr "Změnit viditelnost skrytých souborů."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -1908,7 +1923,7 @@ msgstr "Složky a soubory:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Náhled:"
@@ -1954,9 +1969,8 @@ msgid "Inherited by:"
msgstr "Děděná z:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Popis:"
+msgstr "Popis"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -1967,14 +1981,12 @@ msgid "Properties"
msgstr "Vlastnosti"
#: editor/editor_help.cpp
-#, fuzzy
msgid "override:"
-msgstr "Přepsat"
+msgstr "přepsat:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "Výchozí"
+msgstr "výchozí:"
#: editor/editor_help.cpp
msgid "Methods"
@@ -1994,12 +2006,11 @@ msgstr "Konstanty"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr "Popis vlastnosti"
+msgstr "Popisy vlastnosti"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Hodnota"
+msgstr "(hodnota)"
#: editor/editor_help.cpp
msgid ""
@@ -2011,7 +2022,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Popis metody"
+msgstr "Popisy metod"
#: editor/editor_help.cpp
msgid ""
@@ -2031,9 +2042,8 @@ msgid "Case Sensitive"
msgstr "Rozlišovat velká a malá písmena"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "Zobrazit pomocníky"
+msgstr "Zobrazit hierarchii"
#: editor/editor_help_search.cpp
msgid "Display All"
@@ -2073,28 +2083,24 @@ msgid "Class"
msgstr "Třída"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "Metody"
+msgstr "Metoda"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "Signály"
+msgstr "Signál"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
msgstr "Konstantní"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "Vlastnost:"
+msgstr "Vlastnost"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "Vlastnosti motivu"
+msgstr "Vlastnost motivu"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2133,7 +2139,7 @@ msgstr "Vymazat výstup"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr "Zastavit"
+msgstr "Stop"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
@@ -2142,12 +2148,11 @@ msgstr "Start"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "Stáhnout"
+msgstr "Dolů"
#: editor/editor_network_profiler.cpp
msgid "Up"
@@ -2159,15 +2164,15 @@ msgstr "Uzel"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "Příchozí RPC"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "Příchozí RSET"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "Odchozí RPC"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
@@ -2270,7 +2275,7 @@ msgstr "Nelze přepsat scénu, která je stále otevřená!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr ""
+msgstr "Nelze načíst MeshLibrary ke sloučení!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
@@ -2278,7 +2283,7 @@ msgstr "Chyba při ukládání MeshLibrary!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr ""
+msgstr "Nelze načíst TileSet ke sloučení!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
@@ -2311,7 +2316,6 @@ msgstr ""
"pochopili tento proces."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
@@ -2328,7 +2332,6 @@ msgstr ""
"panelu Import a znovu ho importujte."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This scene was imported, so changes to it won't be kept.\n"
"Instancing it or inheriting will allow making changes to it.\n"
@@ -2341,7 +2344,6 @@ msgstr ""
"pochopili tento proces."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This is a remote object, so changes to it won't be kept.\n"
"Please read the documentation relevant to debugging to better understand "
@@ -2356,10 +2358,6 @@ msgid "There is no defined scene to run."
msgstr "Neexistuje žádná scéna pro spuštění."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Aktuální scéna nebyla nikdy uložena, prosím uložte jí před spuštěním."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Nelze spustit podproces!"
@@ -2392,9 +2390,8 @@ msgid "Save changes to '%s' before closing?"
msgstr "Uložit změny '%s' před zavřením?"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "Selhalo nahrání zdroje."
+msgstr "Uloženo %s upravených zdrojů."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
@@ -2445,12 +2442,14 @@ msgid "Can't reload a scene that was never saved."
msgstr "Nelze načíst scénu, která nebyla nikdy uložena."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Vrátit zpět"
+msgid "Reload Saved Scene"
+msgstr "Znovunačíst uloženou scénu"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Tuto akci nelze vrátit zpět. Pokračovat?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2497,9 +2496,8 @@ msgid "Close Scene"
msgstr "Zavřít scénu"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "Zavřít scénu"
+msgstr "Znovu otevřít zavřenou scénu"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2575,6 +2573,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"Vybraná scéna '%s' neexistuje, vybrat platnou? \n"
+"Později to můžete změnit v \"Nastavení projektu\" v kategorii 'application'."
#: editor/editor_node.cpp
msgid ""
@@ -2610,9 +2610,8 @@ msgid "Close Tab"
msgstr "Zavřít záložku"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "Zavřít záložku"
+msgstr "Obnovit zavřenou záložku"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2620,12 +2619,11 @@ msgstr "Zavřít ostatní záložky"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "Zavřít záložky napravo"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "Zavřít vše"
+msgstr "Zavřít všechny záložky"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2649,7 +2647,7 @@ msgstr "Pozice doku"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr "Nerozptylující režim"
+msgstr "Nerozptylující režitm"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
@@ -2668,17 +2666,16 @@ msgid "Go to previously opened scene."
msgstr "Přejít na předchozí scénu."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Kopírovat cestu"
+msgstr "Kopírovat text"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr "Další záložka"
+msgstr "Další panel"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "Předchozí záložka"
+msgstr "Předchozí tab"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -2735,10 +2732,6 @@ msgid "Redo"
msgstr "Znovu"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Vrátit scénu"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Různé nástroje pro projekt nebo scény."
@@ -2748,27 +2741,24 @@ msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "Nastavení projektu"
+msgstr "Nastavení projektu..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "Verze:"
+msgstr "Správa verzí"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "Nastavit správu verzí"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "Vypnout správu verzí"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "Exportovat"
+msgstr "Exportovat..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
@@ -2783,9 +2773,8 @@ msgid "Tools"
msgstr "Nástroje"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "Průzkumník osiřelých zdrojů"
+msgstr "Průzkumník osiřelých zdrojů..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2802,24 +2791,28 @@ msgstr "Nasazení se vzdáleným laděním"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Při exportu nebo nasazení, se výsledný spustitelný soubor pokusí připojit k "
-"IP tohoto počítače, aby ho bylo možné ladit."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Minimální nasazení se síťovým FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Když je tato možnost povolena, export nebo nasazení bude vytvářet minimální "
"spustitelný soubor.\n"
@@ -2832,9 +2825,10 @@ msgid "Visible Collision Shapes"
msgstr "Viditelné kolizní tvary"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Kolizní tvary a raycast uzly (pro 2D a 3D) budou viditelné během hry, po "
"aktivaci této volby."
@@ -2844,22 +2838,25 @@ msgid "Visible Navigation"
msgstr "Viditelná navigace"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigační meshe a polygony budou viditelné během hry, po aktivaci této volby."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Synchronizovat změny scény"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Když je zapnuta tato možnost, všechny změny provedené ve scéně v editoru "
"budou replikovány v běžící hře.\n"
@@ -2867,15 +2864,17 @@ msgstr ""
"síťového souborového systému."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Synchornizace změn skriptu"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Když je zapnuta tato volba, jakýkoliv skript, který je uložen bude znovu "
"nahrán do spuštěné hry.\n"
@@ -2887,18 +2886,16 @@ msgid "Editor"
msgstr "Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "Nastavení editoru"
+msgstr "Nastavení editoru..."
#: editor/editor_node.cpp
msgid "Editor Layout"
msgstr "Rozložení editoru"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "Dává smysl!"
+msgstr "Vytvořit snímek obrazovky"
#: editor/editor_node.cpp
#, fuzzy
@@ -2907,7 +2904,7 @@ msgstr "Otevřít složku s daty a nastavením editoru"
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Celá obrazovka"
+msgstr "Přepnout celou obrazovku"
#: editor/editor_node.cpp
#, fuzzy
@@ -2932,9 +2929,8 @@ msgid "Manage Editor Features..."
msgstr "Spravovat exportní šablony"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "Spravovat exportní šablony"
+msgstr "Spravovat exportní šablony..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2945,7 +2941,7 @@ msgstr "Nápověda"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Hledat"
@@ -2956,11 +2952,15 @@ msgstr "Online dokumentace"
#: editor/editor_node.cpp
msgid "Q&A"
-msgstr "Q&A"
+msgstr "Otázky a odpovědi"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Sledování chyb"
+msgid "Report a Bug"
+msgstr "Nahlásit chybu"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2976,7 +2976,7 @@ msgstr "Spustit projekt."
#: editor/editor_node.cpp
msgid "Play"
-msgstr "Spustit"
+msgstr "Hrát"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
@@ -2996,7 +2996,7 @@ msgstr "Spustit upravenou scénu."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr "Spustit scénu"
+msgstr "Přehrát scénu"
#: editor/editor_node.cpp
msgid "Play custom scene"
@@ -3004,7 +3004,7 @@ msgstr "Přehrát vlastní scénu"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Spustit vlastní scénu"
+msgstr "Přehrát upravenou scénu"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
@@ -3020,19 +3020,16 @@ msgid "Spins when the editor window redraws."
msgstr "Točí se, když se okno editoru překresluje."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "Spojité"
+msgstr "Aktualizovat průběžně"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "Akualizovat změny"
+msgstr "Akualizovat při změně"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "Vypnout aktualizační kolečko"
+msgstr "Schovat aktualizační kolečko"
#: editor/editor_node.cpp
msgid "FileSystem"
@@ -3059,9 +3056,8 @@ msgid "Android build template is missing, please install relevant templates."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "Spravovat exportní šablony"
+msgstr "Spravovat šablony"
#: editor/editor_node.cpp
msgid ""
@@ -3087,9 +3083,8 @@ msgid "Import Templates From ZIP File"
msgstr "Importovat šablony ze ZIP souboru"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Správce exportních šablon"
+msgstr "Balíček šablon"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3117,15 +3112,15 @@ msgstr "Vybrat"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "Otevřít 2D editor"
+msgstr "Otevřít 2D Editor"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr "Otevřít 3D editor"
+msgstr "Otevřít 3D Editor"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "Otevřít editor skriptů"
+msgstr "Otevřít Editor Skriptů"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -3140,14 +3135,12 @@ msgid "Open the previous Editor"
msgstr "Otevřít předchozí editor"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "Varování"
+msgstr "Varování!"
#: editor/editor_path.cpp
-#, fuzzy
msgid "No sub-resources found."
-msgstr "Dílčí zdroje"
+msgstr "Nebyly nalezeny žádné dílčí zdroje."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
@@ -3158,9 +3151,8 @@ msgid "Thumbnail..."
msgstr "Náhled..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "Otevřít skript"
+msgstr "Hlavní skript:"
#: editor/editor_plugin_settings.cpp
msgid "Edit Plugin"
@@ -3213,7 +3205,7 @@ msgstr "Fyzikální snímek %"
#: editor/editor_profiler.cpp
msgid "Inclusive"
-msgstr ""
+msgstr "Inkluzivní"
#: editor/editor_profiler.cpp
msgid "Self"
@@ -3232,9 +3224,8 @@ msgid "Calls"
msgstr "Volání"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Editovat téma..."
+msgstr "Editovat text:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3353,12 +3344,15 @@ msgid "Add Key/Value Pair"
msgstr "Vložte pár klíč/hodnota"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
-"Nenalezen žádný spustitelný preset pro export pro tuto platformu.\n"
-"rosím přidejte spustitelný preset v menu exportu."
+"Nebylo nalezeno žádné spustilené přednastavení pro exportování na tuto "
+"platformu.\n"
+"Přidejte prosím spustitelné přednastavení v exportovacím menu."
#: editor/editor_run_script.cpp
msgid "Write your logic in the _run() method."
@@ -3384,9 +3378,17 @@ msgstr "Nelze spustit skript:"
msgid "Did you forget the '_run' method?"
msgstr "Nezapoměl jste metodu '_run'?"
+#: editor/editor_spin_slider.cpp
+#, fuzzy
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Podržte Ctrl k uvolnění getteru. Podržte Shift k uvolnění generického "
+"podpisu."
+
#: editor/editor_sub_scene.cpp
+#, fuzzy
msgid "Select Node(s) to Import"
-msgstr ""
+msgstr "Vyberte uzly (Node) pro import"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
@@ -3394,14 +3396,13 @@ msgstr "Procházet"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
-msgstr ""
+msgstr "Cesta ke scéně:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
msgstr "Import z uzlu:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Redownload"
msgstr "Stáhnout znovu"
@@ -3463,9 +3464,8 @@ msgid "Importing:"
msgstr "Importování:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error getting the list of mirrors."
-msgstr "Chyba při vytváření podpisového objektu."
+msgstr "Chyba při získávání seznamu zrcadel."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
@@ -3512,22 +3512,20 @@ msgid "Download Complete."
msgstr "Stahování dokončeno."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "Nelze uložit motiv do souboru:"
+msgstr "Nelze odstranit dočasný soubor:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
-"Instalace šablon selhala. Problémové archivy šablon lze nalézt na '%s'."
+"Instalace šablon selhala.\n"
+"Problémové archivy šablon lze nalézt na '%s'."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "Chyba požadavku o url: "
+msgstr "Chyba žádosti o URL:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3597,14 +3595,12 @@ msgid "Remove Template"
msgstr "Odstranit šablonu"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
msgstr "Vybrat soubor šablony"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Spravovat exportní šablony"
+msgstr "Exportní šablony Godotu"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3653,9 +3649,8 @@ msgid "No name provided."
msgstr "Nebylo poskytnuto žádné jméno."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "Poskytnuté jméno obsahuje neplatné znaky"
+msgstr "Poskytnuté jméno obsahuje neplatné znaky."
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
@@ -3682,31 +3677,26 @@ msgid "Duplicating folder:"
msgstr "Duplikace složky:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "Nová odvozená scéna..."
+msgstr "Nová odvozená scéna"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Hlavní scéna"
+msgstr "Nastavit jako hlavní scénu"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Otevřít scénu"
+msgstr "Otevřít scény"
#: editor/filesystem_dock.cpp
msgid "Instance"
-msgstr "Instance"
+msgstr "Instance:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
msgstr "Přidat do oblíbených"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
msgstr "Odebrat z oblíbených"
@@ -3731,9 +3721,8 @@ msgid "Move To..."
msgstr "Přesunout do..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "Nová scéna"
+msgstr "Nová scéna..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
@@ -3761,21 +3750,18 @@ msgid "Rename"
msgstr "Přejmenovat"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "Předchozí složka"
+msgstr "Předchozí složka/soubor"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "Další složka"
+msgstr "Další složka/soubor"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
msgstr "Znovu skenovat souborový systém"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle Split Mode"
msgstr "Přepnout režim rozdělení"
@@ -3804,9 +3790,8 @@ msgid "Overwrite"
msgstr "Přepsat"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "Vytvořit ze scény"
+msgstr "Vytvořit scénu"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
@@ -3884,14 +3869,12 @@ msgid "Invalid group name."
msgstr "Neplatný název skupiny."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "Spravovat skupiny"
+msgstr "Přejmenovat skupinu"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "Odstranit rozložení"
+msgstr "Odstranit skupinu"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3916,9 +3899,8 @@ msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "Otevřít editor skriptů"
+msgstr "Editor skupin"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3986,15 +3968,20 @@ msgid "Running Custom Script..."
msgstr ""
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Couldn't load post-import script:"
-msgstr ""
+msgstr "Nepodařilo se načíst post-import script:"
#: editor/import/resource_importer_scene.cpp
msgid "Invalid/broken script for post-import (check console):"
-msgstr ""
+msgstr "Neplatný/rozbitý skript pro post-import (viz konzole):"
#: editor/import/resource_importer_scene.cpp
msgid "Error running post-import script:"
+msgstr "Chyba při spuštění post-import scriptu:"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
msgstr ""
#: editor/import/resource_importer_scene.cpp
@@ -4002,6 +3989,10 @@ msgid "Saving..."
msgstr "Ukládání..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d souborů"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Nastavit jako výchozí pro '%s'"
@@ -4010,10 +4001,6 @@ msgid "Clear Default for '%s'"
msgstr "Vyčistit výchozí pro '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Soubory"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importovat jako:"
@@ -4027,7 +4014,7 @@ msgid "Reimport"
msgstr "Znovu importovat"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4062,10 +4049,6 @@ msgid "Copy Params"
msgstr "Kopírovat parametry"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Vložit parametry"
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "Schránka zdroje je prázdná!"
@@ -4080,7 +4063,7 @@ msgstr ""
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr ""
+msgstr "Udělat Sub-prostředky unikátní"
#: editor/inspector_dock.cpp
msgid "Open in Help"
@@ -4127,9 +4110,8 @@ msgid "MultiNode Set"
msgstr ""
#: editor/node_dock.cpp
-#, fuzzy
msgid "Select a single node to edit its signals and groups."
-msgstr "Zvolit uzel pro editaci signálů a skupin."
+msgstr "Zvolte vybraný uzel pro editaci jeho signálů a skupin."
#: editor/plugin_config_dialog.cpp
msgid "Edit a Plugin"
@@ -4300,9 +4282,8 @@ msgid "Open Animation Node"
msgstr "Otevřít uzel animace"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "Trojúhelník již existuje"
+msgstr "Trojúhelník již existuje."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Add Triangle"
@@ -4407,9 +4388,8 @@ msgid "Delete Node(s)"
msgstr "Odstranit uzel/uzly"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "Aktivovat/Deaktivovat tuto stopu."
+msgstr "Aktivovat/Deaktivovat filtr"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Change Filter"
@@ -4431,9 +4411,8 @@ msgid ""
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "Animační klipy:"
+msgstr "Animační klipy"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Audio Clips"
@@ -4464,7 +4443,7 @@ msgstr "Povolit filtrování"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
-msgstr ""
+msgstr "Zapnout Autoplay"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
@@ -4507,7 +4486,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
-msgstr ""
+msgstr "Změnit Blend Time"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
@@ -4562,8 +4541,9 @@ msgid "Animation position (in seconds)."
msgstr "Pozice animace (v sekundách)."
#: editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
msgid "Scale animation playback globally for the node."
-msgstr ""
+msgstr "Škálovat playback animace globálně pro uzel"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
@@ -4586,8 +4566,9 @@ msgid "Display list of animations in player."
msgstr "Zobrazit seznam animací v přehrávači."
#: editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
msgid "Autoplay on Load"
-msgstr ""
+msgstr "Autoplay při načtení"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Enable Onion Skinning"
@@ -4664,7 +4645,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
-msgstr ""
+msgstr "Další (Automatická řada):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
@@ -4675,9 +4656,8 @@ msgid "Move Node"
msgstr "Přesunout uzel"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Přechod: "
+msgstr "Přechod existuje!"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Add Transition"
@@ -4779,8 +4759,9 @@ msgid "Scale:"
msgstr "Zvětšení:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#, fuzzy
msgid "Fade In (s):"
-msgstr ""
+msgstr "Zmizení do (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade Out (s):"
@@ -4800,11 +4781,11 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
-msgstr ""
+msgstr "Restart (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Random Restart (s):"
-msgstr ""
+msgstr "Náhodný Restart (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Start!"
@@ -4839,7 +4820,7 @@ msgstr "Přidat vstup"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
-msgstr ""
+msgstr "Čistý Auto-Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
@@ -5029,11 +5010,11 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "Název (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "Název (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "License (A-Z)"
@@ -5126,12 +5107,11 @@ msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
#: editor/plugins/baked_lightmap_editor_plugin.cpp
-#, fuzzy
msgid "Bake Lightmaps"
msgstr "Zapéct lightmapy"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Náhled"
@@ -5169,7 +5149,6 @@ msgid "Scale Step:"
msgstr "Zvětšení:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
msgstr "Přesunout svislé vodítko"
@@ -5254,9 +5233,8 @@ msgid "Bottom Left"
msgstr "Vlevo dole"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Left"
-msgstr "Odsadit zleva"
+msgstr "Vlevo uprostřed"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Top"
@@ -5307,9 +5285,8 @@ msgid "Full Rect"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "Poměr zvětšení:"
+msgstr "Ponechat poměr"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5339,15 +5316,13 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "Nástroj Výběr"
+msgstr "Uzamčít vybraný"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Unlock Selected"
-msgstr "Smazat vybraný"
+msgstr "Odemčít vybraný"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5366,9 +5341,8 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Guides"
-msgstr "Vymazat pózu"
+msgstr "Vymazat vodítka"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5376,9 +5350,8 @@ msgid "Create Custom Bone(s) from Node(s)"
msgstr "Vytvořit ze scény"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Bones"
-msgstr "Vymazat pózu"
+msgstr "Vymazat kosti"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
@@ -5398,7 +5371,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Resetovat zoom"
+msgstr "Obnovení lupy"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5453,9 +5426,8 @@ msgid "Pan Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "Režim škálování"
+msgstr "Režim pravítka"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5463,9 +5435,8 @@ msgid "Toggle smart snapping."
msgstr "Přepnout přichycování."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Smart Snap"
-msgstr "Použít přichycování"
+msgstr "Použít chytré přichycování"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5792,7 +5763,7 @@ msgstr ""
#: editor/plugins/cpu_particles_editor_plugin.cpp
msgid "CPUParticles"
-msgstr "CPUParticles"
+msgstr "CPUParticles (částice)"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -5839,12 +5810,10 @@ msgid "Load Curve Preset"
msgstr ""
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
msgstr "Přidat bod"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
msgstr "Odstranit bod"
@@ -5909,11 +5878,12 @@ msgid "Mesh is empty!"
msgstr "Mesh je prázdný!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Nelze vytvořit složku."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5926,12 +5896,30 @@ msgid "Create Trimesh Static Shape"
msgstr "Vytvořit Trimesh Shape"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "Vytvořit Convex Shape"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "Nelze vytvořit složku."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Vytvořit Convex Shape"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5983,19 +5971,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Vytvořit navigační polygon"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Vytvořit navigační polygon"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Zobrazit UV1"
@@ -6025,11 +6051,12 @@ msgid "Remove item %d?"
msgstr "Odstranit %d?"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Aktualizovat ze scény"
+msgstr ""
+"Aktualizovat z existující scény?:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
#, fuzzy
@@ -6594,7 +6621,7 @@ msgstr "Vložit zdroj"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
-msgstr "Instance:"
+msgstr "Instance"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
@@ -6637,9 +6664,8 @@ msgid "Error writing TextFile:"
msgstr "Chyba při zápisu textového souboru:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "Chyba: nelze načíst soubor."
+msgstr "Nelze načíst soubor:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -6662,7 +6688,6 @@ msgid "Error Importing"
msgstr "Chyba importu"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
msgstr "Nový textový soubor..."
@@ -6708,9 +6733,8 @@ msgid "Save Theme As..."
msgstr "Uložit motiv jako..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "%s Class Reference"
-msgstr " Reference třídy"
+msgstr "Reference třídy %s"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -6723,18 +6747,16 @@ msgid "Find Previous"
msgstr "Najít předchozí"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "Filtrovat vlastnosti"
+msgstr "Filtrovat skripty"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
msgstr "Přepnout abecední řazení seznamu metod."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter methods"
-msgstr "Režim filtru:"
+msgstr "Filtrovat metody"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -6769,9 +6791,8 @@ msgid "Open..."
msgstr "Otevřít..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Reopen Closed Script"
-msgstr "Otevřít skript"
+msgstr "Znovu otevřít zavřený skript"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -6786,7 +6807,6 @@ msgid "Copy Script Path"
msgstr "Zkopírovat cestu ke skriptu"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
msgstr "Historie předchozí"
@@ -6824,9 +6844,8 @@ msgid "Run"
msgstr "Spustit"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Step Into"
-msgstr "Vstoupit"
+msgstr "Vstoupit do"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
@@ -6850,17 +6869,8 @@ msgid "Debug with External Editor"
msgstr "Debugovat v externím editoru"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "Otevřít Godot online dokumentaci"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
+msgstr "Otevřít online dokumentaci Godotu."
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
@@ -6905,9 +6915,8 @@ msgid "Search Results"
msgstr "Výsledky hledání"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Clear Recent Scripts"
-msgstr "Vymazat nedávné scény"
+msgstr "Vymazat nedávné skripty"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6915,9 +6924,8 @@ msgid "Connections to method:"
msgstr "Připojit k uzlu:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source"
-msgstr "Zdroj:"
+msgstr "Zdroj"
#: editor/plugins/script_text_editor.cpp
msgid "Target"
@@ -6930,12 +6938,13 @@ msgid ""
msgstr "Odpojit '%s' od '%s'"
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Řádek"
+#, fuzzy
+msgid "[Ignore]"
+msgstr "(ignorovat)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignorovat)"
+msgid "Line"
+msgstr "Řádek"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7114,13 +7123,12 @@ msgid "Go to Previous Breakpoint"
msgstr "Přejít na předchozí breakpoint"
#: editor/plugins/shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"Následující soubory mají novější verzi na disku.\n"
-"Jaká akce se má vykonat?:"
+"Tento shader byl na disku upraven.\n"
+"Jaká akce se má vykonat?"
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
@@ -7141,7 +7149,7 @@ msgstr ""
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Skeleton2D"
-msgstr "Skeleton2D"
+msgstr "Skeleton2D (Kostra 2D)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
@@ -7311,6 +7319,11 @@ msgstr "Tato operace vyžaduje jeden vybraný uzel."
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
+msgid "Auto Orthogonal Enabled"
+msgstr "Ortogonální"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Lock View Rotation"
msgstr "Zobrazit informace"
@@ -7401,21 +7414,30 @@ msgid "Freelook Slow Modifier"
msgstr "Rychlost volného pohledu"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Zobrazit informace"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "Zobrazit informace"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm Dialog"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Snap Nodes To Floor"
msgstr "Přichytit k mřížce"
@@ -7759,9 +7781,8 @@ msgid "(empty)"
msgstr "(prázdný)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move Frame"
-msgstr "Vložit snímek"
+msgstr "Posunout snímek"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Animations:"
@@ -7772,7 +7793,8 @@ msgid "New Animation"
msgstr "Nová animace"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Rychlost (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7780,9 +7802,8 @@ msgid "Loop"
msgstr "Smyčka"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animation Frames:"
-msgstr "Snímky animace"
+msgstr "Snímky animace:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -7810,9 +7831,8 @@ msgid "Move (After)"
msgstr "Přemístit (za)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "Vybrat uzel"
+msgstr "Vybrat snímky"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -7869,7 +7889,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Offset:"
-msgstr "Offset:"
+msgstr "Offset(Posun):"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Step:"
@@ -7901,9 +7921,8 @@ msgid "Remove All"
msgstr "Odebrat vše"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "Editovat téma..."
+msgstr "Editovat téma"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
@@ -8043,9 +8062,8 @@ msgid "Color"
msgstr "Barva"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme File"
-msgstr "Téma"
+msgstr "Soubor tématu"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
@@ -8087,7 +8105,7 @@ msgstr "Najít dlaždici"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
-msgstr ""
+msgstr "Transponovat"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Disable Autotile"
@@ -8122,22 +8140,18 @@ msgid "Pick Tile"
msgstr "Vybrat dlaždici"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Left"
msgstr "Otočit doleva"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Right"
msgstr "Otočit doprava"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Flip Horizontally"
msgstr "Převrátit horizontálně"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Flip Vertically"
msgstr "Převrátit vertikálně"
@@ -8152,9 +8166,8 @@ msgid "Add Texture(s) to TileSet."
msgstr "Přidat uzel(y) ze stromu"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "Odstranit aktuální texturu z TileSetu"
+msgstr "Odstranit vybranou texturu z TileSetu."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -8212,9 +8225,8 @@ msgid "Occlusion"
msgstr "Editovat polygon"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation"
-msgstr "Vytvořit Navigation Mesh"
+msgstr "Navigace"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8232,14 +8244,12 @@ msgid "Z Index"
msgstr "Index:"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region Mode"
-msgstr "Režim otáčení"
+msgstr "Režim oblasti"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision Mode"
-msgstr "Interpolační režim"
+msgstr "Kolizní režim"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8247,14 +8257,12 @@ msgid "Occlusion Mode"
msgstr "Editovat polygon"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation Mode"
-msgstr "Vytvořit Navigation Mesh"
+msgstr "Navigační režim"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask Mode"
-msgstr "Režim otáčení"
+msgstr "Režim bitové masky"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8262,9 +8270,8 @@ msgid "Priority Mode"
msgstr "Expertní režim:"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Icon Mode"
-msgstr "Režim přesouvání"
+msgstr "Režim ikony"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Z Index Mode"
@@ -8474,9 +8481,8 @@ msgid "Make Concave"
msgstr "Přesunout polygon"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Collision Polygon"
-msgstr "Vytvořit navigační polygon"
+msgstr "Vytvořit kolizní polygon"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8489,14 +8495,14 @@ msgstr "Tato vlastnost nemůže být změněna."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "TileSet"
-msgstr "TileSet"
+msgstr "TileSet (Sada dlaždic)"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
msgid "No VCS addons are available."
msgstr "Jméno rodiče uzlu, pokud dostupné"
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Chyba"
@@ -8598,17 +8604,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(GLES3 only)"
-msgstr ""
+msgstr "(Pouze GLES3)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Output"
-msgstr "Přidat vstup"
+msgstr "Přidat výstup"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "Zvětšení:"
+msgstr "Skalár"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector"
@@ -8616,7 +8620,7 @@ msgstr "Vektor"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
-msgstr ""
+msgstr "Boolean"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sampler"
@@ -8910,14 +8914,12 @@ msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr "'%s' vstupní parametr pro mód vertexového a fragmentového shaderu."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "Změnit skalární funkci"
+msgstr "Skalární funkce."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "Změnit skalární operátor"
+msgstr "Skalární operátor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
@@ -8960,18 +8962,16 @@ msgid "Returns the arc-cosine of the parameter."
msgstr "Vrátí arkus kosinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr "(Pouze GLES3) Vrátí inverzní hyperbolický kosinus parametru."
+msgstr "Vrátí inverzní hyperbolický kosinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
msgstr "Vrátí arkus sinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr "(Pouze GLES3) Vrátí inverzní hyperbolický sinus parametru."
+msgstr "Vrátí inverzní hyperbolický sinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
@@ -8982,9 +8982,8 @@ msgid "Returns the arc-tangent of the parameters."
msgstr "Vrátí arkus tangent parametrů."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr "(Pouze GLES3) Vrátí inverzní hyperbolický tangent parametru."
+msgstr "Vrátí inverzní hyperbolický tangent parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9001,13 +9000,12 @@ msgid "Returns the cosine of the parameter."
msgstr "Vrátí kosinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr "(Pouze GLES3) Vrátí hyperbolický kosinus parametru."
+msgstr "Vrátí hyperbolický kosinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr "Konvertuje množství v radiánech na stupně."
+msgstr "Konvertuje hodnotu v radiánech na stupně."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
@@ -9023,7 +9021,7 @@ msgstr "Nalezne nejbližší celé číslo menší nebo stejné jako parametr."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "Vypočítá desetinnou část argumentu."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
@@ -9064,21 +9062,19 @@ msgstr "Vrátí hodnotu prvního parametru umocněného druhým."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr "Konvertuje množství ve stupních na radiány."
+msgstr "Konvertuje hodnotu ve stupních na radiány."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
msgstr "1.0 / skalár"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the nearest integer to the parameter."
-msgstr "(Pouze GLES3) Nalezne nejbližší celé číslo k parametru."
+msgstr "Nalezne nejbližší celé číslo k parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Finds the nearest even integer to the parameter."
-msgstr "(Pouze GLES3) Nalezne nejbližší sudé celé číslo k parametru."
+msgstr "Nalezne nejbližší sudé celé číslo k parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
@@ -9093,9 +9089,8 @@ msgid "Returns the sine of the parameter."
msgstr "Vrátí sinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic sine of the parameter."
-msgstr "(Pouze GLES3) Vrátí hyperbolický sinus parametru."
+msgstr "Vrátí hyperbolický sinus parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
@@ -9122,9 +9117,8 @@ msgid "Returns the tangent of the parameter."
msgstr "Vrátí tangens parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr "(Pouze GLES3) Vrátí hyperbolický tangens parametru."
+msgstr "Vrátí hyperbolický tangens parametru."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9562,13 +9556,12 @@ msgid "Make Patch"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " Soubory"
+msgstr "Soubour balíčk"
#: editor/project_export.cpp
msgid "Features"
-msgstr "Funkce"
+msgstr "Vlastnosti"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
@@ -9596,7 +9589,7 @@ msgstr "Zkompilovaný"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
-msgstr ""
+msgstr "Šifrovaný (Poskytněte klíč níže)"
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
@@ -9604,7 +9597,7 @@ msgstr "Neplatný šifrovací klíč (musí být dlouhý 64 znaků)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
-msgstr ""
+msgstr "Šifrovací klíč skriptu (256 bitový hexadecimální):"
#: editor/project_export.cpp
msgid "Export PCK/Zip"
@@ -9623,9 +9616,8 @@ msgid "Export All"
msgstr "Exportovat vše"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " Soubory"
+msgstr "Soubor ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
@@ -9644,11 +9636,19 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+#, fuzzy
+msgid "The path specified doesn't exist."
msgstr "Cesta neexistuje."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Nepodařilo se otevřít balíček, není ve formátu ZIP."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr "Neplatný projektový '.zip' soubor; neobsahuje soubor 'project.godot'."
#: editor/project_manager.cpp
@@ -9656,20 +9656,22 @@ msgid "Please choose an empty folder."
msgstr "Zvolte prosím prázdnou složku."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+#, fuzzy
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr "Zvolte prosím soubor 'project.godot' nebo '.zip'."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr ""
+#, fuzzy
+msgid "This directory already contains a Godot project."
+msgstr "Složka již obsahuje projekt Godotu."
#: editor/project_manager.cpp
msgid "New Game Project"
-msgstr ""
+msgstr "Nový projekt hry"
#: editor/project_manager.cpp
msgid "Imported Project"
-msgstr ""
+msgstr "Importovaný projekt"
#: editor/project_manager.cpp
msgid "Invalid Project Name."
@@ -9681,29 +9683,31 @@ msgstr "Nelze vytvořit složku."
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
-msgstr ""
+msgstr "V tomto umístění již existuje složka s daným názvem."
#: editor/project_manager.cpp
msgid "It would be a good idea to name your project."
-msgstr ""
+msgstr "Bylo by dobré pojmenovat váš projekt."
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr ""
+msgstr "Neplatná cesta k projektu (něco se změnilo?)."
#: editor/project_manager.cpp
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
+"Nelze načíst project.godot v umístění projektu (chyba %d). Může chybět nebo "
+"být poškozený."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
-msgstr ""
+msgstr "Nelze upravit project.godot v umístění projektu."
#: editor/project_manager.cpp
msgid "Couldn't create project.godot in project path."
-msgstr ""
+msgstr "Nelze vytvořit project.godot v umístění projektu."
#: editor/project_manager.cpp
msgid "Rename Project"
@@ -9711,7 +9715,7 @@ msgstr "Přejmenovat projekt"
#: editor/project_manager.cpp
msgid "Import Existing Project"
-msgstr ""
+msgstr "Importovat existující projekt"
#: editor/project_manager.cpp
msgid "Import & Edit"
@@ -9742,17 +9746,16 @@ msgid "Project Path:"
msgstr "Cesta k projektu:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Cesta k projektu:"
+msgstr "Instalační cesta k projektu:"
#: editor/project_manager.cpp
msgid "Renderer:"
-msgstr ""
+msgstr "Renderer:"
#: editor/project_manager.cpp
msgid "OpenGL ES 3.0"
-msgstr ""
+msgstr "OpenGL ES 3.0"
#: editor/project_manager.cpp
msgid ""
@@ -9761,10 +9764,14 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"Vyšší vizuální kvalita\n"
+"Všechny funkce dostupné\n"
+"Nekompatibilní se starším hardwarem\n"
+"Nedoporučené pro webové hry"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
-msgstr ""
+msgstr "OpenGL ES 2.0"
#: editor/project_manager.cpp
msgid ""
@@ -9773,23 +9780,26 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"Nižší vizuální kvalita\n"
+"Některé funkce nejsou dostupné\n"
+"Funguje na většině hardwaru\n"
+"Doporučené pro webové hry"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
+msgstr "Renderer je možné změnit později, ale scény mohou vyžadovat úpravy."
#: editor/project_manager.cpp
msgid "Unnamed Project"
msgstr "Nepojmenovaný projekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "Sestavit projekt"
+msgstr "Chybějící projekt"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr ""
+msgstr "Chyba: Projek se nevyskytuje v souborovém systému."
#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
@@ -9811,6 +9821,14 @@ msgid ""
"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"
+"%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."
#: editor/project_manager.cpp
msgid ""
@@ -9823,12 +9841,21 @@ msgid ""
"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"
+"%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."
#: editor/project_manager.cpp
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
+"Konfigurační soubor projektu byl vytvořen novější verzí enginu, jehož "
+"konfigurace není kompatibilní s touto verzí."
#: editor/project_manager.cpp
msgid ""
@@ -9836,6 +9863,9 @@ msgid ""
"Please edit the project and set the main scene in the Project Settings under "
"the \"Application\" category."
msgstr ""
+"Nelze spustit projekt: není definovaná hlavní scéna,\n"
+"Upravte prosím projekt a nastavte hlavní scénu v nastaveních projektu v "
+"kategorii \"Application\"."
#: editor/project_manager.cpp
msgid ""
@@ -9856,11 +9886,12 @@ msgid ""
msgstr "Odstranit projekt ze seznamu? (Obsah složky zůstane nedotčen)"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
-msgstr "Odstranit projekt ze seznamu? (Obsah složky zůstane nedotčen)"
+msgstr ""
+"Odstranit projekt ze seznamu?\n"
+"Obsah složky zůstane nedotčen."
#: editor/project_manager.cpp
#, fuzzy
@@ -9881,14 +9912,14 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Správce projektů"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
-msgstr "Projekt"
+msgstr "Projekty"
#: editor/project_manager.cpp
msgid "Last Modified"
@@ -9907,9 +9938,8 @@ msgid "New Project"
msgstr "Nový projekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "Odstranit bod"
+msgstr "Odstranit nenalezené"
#: editor/project_manager.cpp
msgid "Templates"
@@ -9924,7 +9954,6 @@ msgid "Can't run project"
msgstr "Nelze spustit projekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
@@ -9932,6 +9961,13 @@ msgstr ""
"V této chvíli nemáte žádný projekt.\n"
"Přejete si prozkoumat oficiální ukázkové projekty v knihovně assetů?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Klávesa "
@@ -9957,9 +9993,8 @@ msgstr ""
"nebo '\"'"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "Akce '%s' již existuje!"
+msgstr "Akce s názvem \"%s\" již existuje."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
@@ -10057,7 +10092,7 @@ msgstr "Přidat akci"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Tlačítko"
+msgstr "Button"
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -10324,15 +10359,27 @@ msgid "Batch Rename"
msgstr "Dávkové přejmenování"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Nahradit: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Prefix"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Sufix"
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Regulární výrazy"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Advanced Options"
msgstr "Pokročilé možnosti"
@@ -10367,11 +10414,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10388,7 +10435,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Odsazení"
#: editor/rename_dialog.cpp
msgid ""
@@ -10399,10 +10446,6 @@ msgstr ""
"Chybějící číslice budou nahrazeny nulami."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Regulární výrazy"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10411,12 +10454,12 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr ""
+msgid "PascalCase to snake_case"
+msgstr "PascalCase na snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr ""
+msgid "snake_case to PascalCase"
+msgstr "snake_case na PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10434,6 +10477,15 @@ msgstr "Na velká písmena"
msgid "Reset"
msgstr "Resetovat"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Chyba regulárního výrazu"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Na znaku %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10472,7 +10524,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "No parent to instance the scenes at."
-msgstr ""
+msgstr "Chybí rodič pro instancování scény."
#: editor/scene_tree_dock.cpp
msgid "Error loading scene from %s"
@@ -10486,7 +10538,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
-msgstr ""
+msgstr "Scéna/Scény instance"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10498,8 +10550,8 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Vymazat skript"
+msgid "Detach Script"
+msgstr "Odpojit skript"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10530,14 +10582,17 @@ msgid "Instantiated scenes can't become root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "Dává smysl!"
+msgstr "Nastavit uzel jako zdrojový"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Smazat %d uzlů?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Smazat uzel"
+msgstr "Smazat %d uzlů?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10548,9 +10603,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Smazat uzel"
+msgstr "Smazat uzel \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10602,9 +10656,8 @@ msgid "User Interface"
msgstr "Uživatelské rozhraní"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Smazat uzel"
+msgstr "Jiný uzel"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -10658,11 +10711,17 @@ msgid "Load As Placeholder"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
msgstr "Otevřít dokumentaci"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Přidat podřízený uzel"
@@ -10681,9 +10740,8 @@ msgid "Reparent to New Node"
msgstr "Přidat/Vytvořit nový uzel"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "Dává smysl!"
+msgstr "Nastav scénu jako zdrojovou"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10702,9 +10760,8 @@ msgid "Delete (No Confirm)"
msgstr "Odstranit (bez potvrzení)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Přidat/Vytvořit nový uzel"
+msgstr "Přidat/Vytvořit nový uzel."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10713,12 +10770,14 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
msgstr "Připojit nový, nebo existující skript k vybranému uzlu."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Detach the script from the selected node."
+msgstr "Připojit nový, nebo existující skript k vybranému uzlu."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10738,9 +10797,8 @@ msgid "Toggle Visible"
msgstr "Přepnout viditelnost"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "Vybrat uzel"
+msgstr "Odemknout uzel"
#: editor/scene_tree_editor.cpp
#, fuzzy
@@ -10775,15 +10833,16 @@ msgid ""
msgstr ""
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "Otevřít skript"
+msgstr "Otevřít skript:"
#: editor/scene_tree_editor.cpp
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
+"Uzel je zamčený.\n"
+"Klikněte pro odemčení."
#: editor/scene_tree_editor.cpp
msgid ""
@@ -10803,7 +10862,7 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
-msgstr ""
+msgstr "Neplatný název uzlu, následující znaky nejsou povoleny:"
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
@@ -10822,39 +10881,36 @@ msgid "Select a Node"
msgstr "Vybrat uzel"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "Cesta je prázdná"
+msgstr "Cesta je prázdná."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "Název souboru je prázdný"
+msgstr "Název souboru je prázdný."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "Cesta není místní"
+msgstr "Cesta není místní."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid base path."
-msgstr "Neplatná základní cesta"
+msgstr "Neplatná základní cesta."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "Složka se stejným jménem již existuje"
+msgstr "Složka se stejným jménem již existuje."
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Soubor neexistuje."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "Neplatná přípona"
+msgstr "Neplatná přípona."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Wrong extension chosen."
-msgstr "Vybrána špatná přípona"
+msgstr "Vybrána špatná přípona."
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
@@ -10878,23 +10934,24 @@ msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "Otevřít editor skriptů"
+msgstr "Otevřít skript / Vybrat umístění"
#: editor/script_create_dialog.cpp
msgid "Open Script"
msgstr "Otevřít skript"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, it will be reused."
-msgstr "Soubor již existuje, bude znovu použit"
+msgstr "Soubor již existuje, bude znovu použit."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Neplatná cesta."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid class name."
-msgstr "Neplatné jméno třídy"
+msgstr "Neplatné jméno třídy."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -10903,13 +10960,12 @@ msgstr "Neplatné jméno vlastnosti."
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
-msgstr "Skript je validní"
+msgid "Script path/name is valid."
+msgstr "Skript je validní."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "Povoleno: a-z, A-Z, 0-9 a _"
+msgstr "Povoleno: a-z, A-Z, 0-9, _ a ."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -10917,34 +10973,34 @@ msgid "Built-in script (into scene file)."
msgstr "Možností scén."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "Vytvořit nový soubor skriptu"
+msgstr "Vytvoří nový soubor skriptu."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "Načíst existující soubor skriptu"
+msgstr "Načte existující soubor skriptu."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "Akce '%s' již existuje!"
+msgstr "Soubor skriptu již existuje."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name:"
-msgstr "Jméno třídy"
+msgstr "Jméno třídy:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "Šablona"
+msgstr "Šablona:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "Vestavěný skript"
+msgstr "Vestavěný skript:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -10959,7 +11015,6 @@ msgid "Bytes:"
msgstr "Bajtů:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Warning:"
msgstr "Varování:"
@@ -10968,29 +11023,24 @@ msgid "Error:"
msgstr "Chyba:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error"
-msgstr "Kopírovat chybu"
+msgstr "Chyba C++"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error:"
-msgstr "Chyba:"
+msgstr "Chyba C++:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source"
-msgstr "Zdroj:"
+msgstr "Zdroj C++"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
msgstr "Zdroj:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "Zdroj:"
+msgstr "Zdroj C++:"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
@@ -11010,6 +11060,10 @@ msgid "Copy Error"
msgstr "Kopírovat chybu"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Video RAM"
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Vytvořit body."
@@ -11059,8 +11113,9 @@ msgid "Total:"
msgstr "Celkem:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Video pamět"
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Exportovat profil"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11212,16 +11267,15 @@ msgstr ""
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select dependencies of the library for this entry"
-msgstr ""
+msgstr "Vyberte závislosti knihovny pro tento vstup"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "Odstranit signál"
+msgstr "Odstranit aktuální vstup"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "Stiskněte dvakrát pro vytvoření nového vstupu"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
@@ -11299,7 +11353,7 @@ msgstr "Neplatná instance slovníku (neplatné podtřídy)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
-msgstr ""
+msgstr "Objekt nemůže poskytnout délku."
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
@@ -11332,19 +11386,16 @@ msgid "GridMap Delete Selection"
msgstr "GridMap Smazat výběr"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "GridMap Smazat výběr"
+msgstr "GridMap Vyplnit výběr"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "GridMap Smazat výběr"
+msgstr "GridMap Vložit výběr"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paint"
-msgstr "Nastavení GridMap"
+msgstr "Vykreslit GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Grid Map"
@@ -11417,9 +11468,8 @@ msgid "Clear Selection"
msgstr "Vymazat výběr"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Všechny vybrané"
+msgstr "Vyplnit výběr"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -11427,12 +11477,11 @@ msgstr "Nastavení GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Pick Distance:"
-msgstr ""
+msgstr "Vybrat vzdálenost:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "Režim filtru:"
+msgstr "Filtrovat meshe"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
@@ -11504,7 +11553,7 @@ msgstr ""
#: modules/recast/navigation_mesh_generator.cpp
msgid "Done!"
-msgstr ""
+msgstr "Hotovo!"
#: modules/visual_script/visual_script.cpp
#, fuzzy
@@ -11557,21 +11606,19 @@ msgstr "Změnit název argumentu"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr ""
+msgstr "Nastavit výchozí hodnotu proměnné"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
msgstr "Nastavit typ proměnné"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "Přidat vstup"
+msgstr "Přidat vstupní port"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "Přidat vstup"
+msgstr "Přidat výstupní port"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -11580,27 +11627,24 @@ msgstr ""
"Neplatný název. Nesmí kolidovat s existujícím jménem zabudovaného typu."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "Vytvořit nové uzly."
+msgstr "Vytvořit novou funkci."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Proměnné:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "Vytvořit nové uzly."
+msgstr "Vytvořit novou proměnnou."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr "Signály:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "Vytvořit nový polygon."
+msgstr "Vytvořit nový signál."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
@@ -11627,9 +11671,8 @@ msgid "Add Function"
msgstr "Přidat funkci"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
-msgstr "Odstranit bod"
+msgstr "Smazat vstupní port"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
@@ -11640,14 +11683,12 @@ msgid "Add Signal"
msgstr "Přidat signál"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "Odstranit bod"
+msgstr "Odstranit vstupní port"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "Odstranit bod"
+msgstr "Odstranit výstupní port"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
@@ -11659,7 +11700,7 @@ msgstr "Odstranit uzly VisualScriptu"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr ""
+msgstr "Duplikovat uzly VisualScriptu"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
@@ -11730,9 +11771,8 @@ msgid "Connect Nodes"
msgstr "Připojit uzly"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "Odpojit uzly grafu"
+msgstr "Odpojit uzly"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -11753,9 +11793,8 @@ msgid "Change Input Value"
msgstr "Změnit vstupní hodnotu"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "Změnit velikost CanvasItem"
+msgstr "Změnit velikost komentáře"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
@@ -11820,24 +11859,20 @@ msgid "Members:"
msgstr "Členové:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "Změnit základní typ"
+msgstr "Změnit základní typ:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "Přidat uzel..."
+msgstr "Přidat uzly..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Přidat funkci"
+msgstr "Přidat funkci..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "Funkce:"
+msgstr "název_funkce"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -11861,19 +11896,16 @@ msgid "Cut Nodes"
msgstr "Vyjmout uzly"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "Přejmenovat funkci"
+msgstr "Vytvořit funkci"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "Obnovit"
+msgstr "Obnovit graf"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Členové"
+msgstr "Upravit členy"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -11985,6 +12017,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12009,6 +12045,32 @@ msgstr "Neplatné jméno třídy"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12213,6 +12275,12 @@ msgid ""
"shape resource for it!"
msgstr "CollisionShape2D musí obsahovat tvar. Prosím vytvořte zdrojový tvar."
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12429,6 +12497,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12449,6 +12522,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12621,16 +12699,15 @@ msgstr "HSV"
#: scene/gui/color_picker.cpp
msgid "Raw"
-msgstr ""
+msgstr "Raw"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
-msgstr ""
+msgstr "Přepni mezi hexadecimálními a kódovými hodnotami."
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "Přidat aktuální barvu jako předvolbu"
+msgstr "Přidat aktuální barvu jako předvolbu."
#: scene/gui/container.cpp
msgid ""
@@ -12701,10 +12778,14 @@ msgstr ""
"mohl získat velikost. Jinak ho nastavte jako render target a přiřaďte jeho "
"vnitřní texturu nějakému uzlu k zobrazení."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"Velikost pohledu musí být větší než 0, aby bylo možné cokoliv renderovat."
+
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "Neplatný zdroj pro shader."
+msgstr "Neplatný zdroj pro náhled."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
@@ -12717,20 +12798,59 @@ msgstr "Neplatný zdroj pro shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Přiřazeno funkci."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Přiřazeno uniformu."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Odlišnosti mohou být přiřazeny pouze ve vertex funkci."
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
msgstr "Konstanty není možné upravovat."
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Souborový systém"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Při exportu nebo nasazení, se výsledný spustitelný soubor pokusí připojit "
+#~ "k IP tohoto počítače, aby ho bylo možné ladit."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Aktuální scéna nebyla nikdy uložena, prosím uložte jí před spuštěním."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Není v cestě ke zdroji."
+
+#~ msgid "Revert"
+#~ msgstr "Vrátit zpět"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Tuto akci nelze vrátit zpět. Pokračovat?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Vrátit scénu"
+
+#~ msgid "Clear Script"
+#~ msgstr "Vymazat skript"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Sledování chyb"
+
+#~ msgid "Request Docs"
+#~ msgstr "Požádat o dokumentaci"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Nahrazeno %d výskytů."
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/da.po b/editor/translations/da.po
index aed35d2dc6..95a5d793e0 100644
--- a/editor/translations/da.po
+++ b/editor/translations/da.po
@@ -15,12 +15,14 @@
# Mads K. Bredager <mbredager@gmail.com>, 2019.
# Kristoffer Andersen <kjaa@google.com>, 2019.
# Joe Osborne <reachjoe.o@gmail.com>, 2020.
+# Autowinto <happymansi@hotmail.com>, 2020.
+# Mikkel Mouridsen <mikkelmouridsen@me.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-16 22:23+0000\n"
-"Last-Translator: Joe Osborne <reachjoe.o@gmail.com>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: Mikkel Mouridsen <mikkelmouridsen@me.com>\n"
"Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/"
"godot/da/>\n"
"Language: da\n"
@@ -28,7 +30,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 3.10.2-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -37,7 +39,7 @@ msgstr "Ugyldigt type argument til convert(), brug TYPE_* konstanter."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Forventede en streng med længden 1 (en karakter)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -134,9 +136,8 @@ msgid "Delete Selected Key(s)"
msgstr "Slet valgte nøgle(r)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Add Bezier Point"
-msgstr "Tilføj punkt"
+msgstr "Tilføj Bezier-punkt"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
@@ -443,7 +444,7 @@ msgstr "Det er ikke muligt at tilføje et nyt spor uden en rod"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Ugyldigt spor for Bezier (ingen passende underegenskaber)"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -559,6 +560,7 @@ msgid "Seconds"
msgstr "Sekunder"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -721,8 +723,9 @@ msgid "Line Number:"
msgstr "Linjenummer:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Erstattede %d forekomst(er)."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Erstat"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -741,7 +744,7 @@ msgstr "Match stor/lille"
msgid "Whole Words"
msgstr "Hele Ord"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Erstat"
@@ -784,7 +787,7 @@ msgstr "Advarsler"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "Linje- og kolonnenumre."
#: editor/connections_dialog.cpp
#, fuzzy
@@ -793,6 +796,11 @@ msgstr "Metode i target Node skal angives!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Navnet er ikke et gyldigt id:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -880,7 +888,6 @@ msgstr "Forbind Signal: "
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -941,6 +948,11 @@ msgid "Signals"
msgstr "Signaler"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrer filer..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Er du sikker på at du vil fjerne alle forbindelser fra dette signal?"
@@ -978,7 +990,7 @@ msgid "Recent:"
msgstr "Seneste:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Søgning:"
@@ -1162,6 +1174,9 @@ msgstr "Projekt grundlæggere"
msgid "Lead Developer"
msgstr "Ledende Udvikler"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Projektleder "
@@ -1183,6 +1198,16 @@ msgid "Gold Sponsors"
msgstr "Guld Sponsorer"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Sølv Donorer"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronze Donorer"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsorer"
@@ -1252,7 +1277,7 @@ msgstr "Udpakker Aktiver"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "De følgende filer kunne ikke trækkes ud af pakken:"
#: editor/editor_asset_installer.cpp
#, fuzzy
@@ -1507,7 +1532,7 @@ msgstr "Flyt Autoload"
msgid "Remove Autoload"
msgstr "Fjern Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Aktivér"
@@ -1515,18 +1540,9 @@ msgstr "Aktivér"
msgid "Rearrange Autoloads"
msgstr "Flytte om på Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Ugyldig Sti."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Fil eksisterer ikke."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Ikke i stien for ressource."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1553,6 +1569,10 @@ msgstr "Navn"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Indsæt Parametre"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Opdatere Scene"
@@ -1678,21 +1698,21 @@ msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "Importer"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
msgstr "Node Navn:"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "Fil System"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "Importer"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "Erstat Alle"
@@ -1857,7 +1877,7 @@ msgstr "Vis i Filhåndtering"
msgid "New Folder..."
msgstr "Opret mappe..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Opdater"
@@ -1979,7 +1999,7 @@ msgstr "Mapper & Filer:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Forhåndsvisning:"
@@ -2425,10 +2445,6 @@ msgid "There is no defined scene to run."
msgstr "Der er ingen defineret scene at køre."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Den nuværende scene er aldrig gemt, venligst gem før du kører den."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Kunne ikke starte underproces!"
@@ -2515,12 +2531,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "Kan ikke genindlæse en scene, der aldrig blev gemt."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Vend tilbage"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Gem Scene"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Denne handling kan ikke fortrydes. Vend tilbage alligevel?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2811,10 +2830,6 @@ msgid "Redo"
msgstr "Annuller Fortyd"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Gendan scene"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Diverse projekt eller scene redskaber."
@@ -2878,24 +2893,28 @@ msgstr "Indsætte med Fjern Fejlfind"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Ved eksport eller deploy, vil den resulterende eksekverbare fil forsøge at "
-"oprette forbindelse til denne computers IP adresse for at blive debugged."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Lille Indsættelse med Nætværks FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Når denne indstilling er aktiveret, vil eksport eller deploy producere en "
"minimal eksekverbar.\n"
@@ -2908,9 +2927,10 @@ msgid "Visible Collision Shapes"
msgstr "Synlig Kollisionsformer"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Kollisionsformer og raycast-noder (til 2D og 3D) vil være synlige på det "
"kørende spil, hvis denne indstilling er tændt."
@@ -2920,23 +2940,26 @@ msgid "Visible Navigation"
msgstr "Synlig Navigation"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigationsmasker og polygoner vil være synlige på det kørende spil, hvis "
"denne indstilling er tændt."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Synkroniser Scene Ændringer"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Når denne indstilling er tændt, vil eventuelle ændringer til scenen i "
"editoren blive overført til det kørende spil.\n"
@@ -2944,15 +2967,17 @@ msgstr ""
"filsystem."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Synkroniser Script Ændringer"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Når denne indstilling er tændt, genindlæses gemte script, på det kørende "
"spil.\n"
@@ -3022,7 +3047,7 @@ msgstr "Hjælp"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Søg"
@@ -3036,8 +3061,13 @@ msgid "Q&A"
msgstr "Spørgsmål og Svar"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Problem Tracker"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Genimporter"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3428,9 +3458,11 @@ msgid "Add Key/Value Pair"
msgstr ""
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Ingen kørbare eksport forudindstillinger fundet til denne platform.\n"
"Tilføj venligst en kørbar forudindstilling i eksportmenuen."
@@ -3459,6 +3491,10 @@ msgstr "Kunne ikke køre script:"
msgid "Did you forget the '_run' method?"
msgstr "Glemte du '_run' metoden?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Vælg Noder at Importere"
@@ -4098,10 +4134,18 @@ msgid "Error running post-import script:"
msgstr "Fejl ved kørsel af efter-import script:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Gemmer..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Filer"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Sæt som Standard for '%s'"
@@ -4110,10 +4154,6 @@ msgid "Clear Default for '%s'"
msgstr "Fjern Standard for '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Filer"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importer Som:"
@@ -4127,7 +4167,7 @@ msgid "Reimport"
msgstr "Genimporter"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4163,10 +4203,6 @@ msgid "Copy Params"
msgstr "Kopier Parametre"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Indsæt Parametre"
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "FEJL: Ingen animationsressource i udklipsholder!"
@@ -5289,7 +5325,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -6062,11 +6098,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Kunne ikke oprette mappe."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6078,12 +6115,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "Opret Ny %s"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "Kunne ikke oprette mappe."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Opret Ny %s"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6135,19 +6190,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Opret Poly"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Opret Poly"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV1"
msgstr "Vis FPS"
@@ -7025,14 +7118,6 @@ msgid "Open Godot online documentation."
msgstr "Åben Seneste"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -7099,15 +7184,15 @@ msgid ""
msgstr "Afbryd '%s' fra '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "Linje:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "Tilføj Funktion"
@@ -7488,6 +7573,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7578,17 +7667,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7943,7 +8041,7 @@ msgid "New Animation"
msgstr "Ny Animation Navn:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8660,7 +8758,7 @@ msgstr "TileSet..."
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9793,11 +9891,18 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "Fil eksisterer ikke."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Fejl ved åbning af pakke fil, ikke i zip format."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9805,11 +9910,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -10035,9 +10140,10 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr "Projektleder"
+msgstr "Projekt Manager"
#: editor/project_manager.cpp
#, fuzzy
@@ -10083,6 +10189,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10472,14 +10585,24 @@ msgid "Batch Rename"
msgstr "Omdøb"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Erstat"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Skift udtryk"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr ""
@@ -10518,11 +10641,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10549,11 +10672,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "Regular Expressions"
-msgstr "Skift udtryk"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10562,11 +10680,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10587,6 +10705,16 @@ msgstr ""
msgid "Reset"
msgstr "Nulstil Zoom"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Skift udtryk"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Gyldige karakterer:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10650,7 +10778,8 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+#, fuzzy
+msgid "Detach Script"
msgstr "Ryd Script"
#: editor/scene_tree_dock.cpp
@@ -10688,6 +10817,11 @@ msgstr "Gem Scene"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Vælg Node"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Vælg Node"
@@ -10819,6 +10953,13 @@ msgid "Open Documentation"
msgstr "Åben Seneste"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10869,11 +11010,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -11004,6 +11145,10 @@ msgid "A directory with the same name exists."
msgstr "En fil eller mappe med dette navn findes allerede."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Fil eksisterer ikke."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Du skal bruge en gyldig udvidelse."
@@ -11049,6 +11194,11 @@ msgstr "Filen findes, vil blive genbrugt"
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Ugyldig Sti."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Ugyldigt navn."
@@ -11058,7 +11208,7 @@ msgid "Invalid inherited parent name or path."
msgstr "Ugyldigt inherited parent navn eller sti"
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -11086,6 +11236,12 @@ msgid "Script file already exists."
msgstr "Autoload '%s' eksisterer allerede!"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Klasse:"
@@ -11167,6 +11323,10 @@ msgid "Copy Error"
msgstr "Indlæs Fejl"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Slet points"
@@ -11217,8 +11377,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Eksporter Projekt"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12130,6 +12291,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12154,6 +12319,32 @@ msgstr "Ugyldigt navn."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12359,6 +12550,12 @@ msgstr ""
"En figur skal gives CollisionShape2D for at det fungerer. Opret venligst en "
"figur ressource for den!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12573,6 +12770,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12593,6 +12795,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12837,6 +13044,10 @@ msgstr ""
"den kan opnå en størrelse. Ellers gør den til en RenderTarget og tildel dens "
"indre textur til en node så den kan vises."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12868,6 +13079,39 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Konstanter kan ikke ændres."
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Fil System"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Ved eksport eller deploy, vil den resulterende eksekverbare fil forsøge "
+#~ "at oprette forbindelse til denne computers IP adresse for at blive "
+#~ "debugged."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "Den nuværende scene er aldrig gemt, venligst gem før du kører den."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Ikke i stien for ressource."
+
+#~ msgid "Revert"
+#~ msgstr "Vend tilbage"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Denne handling kan ikke fortrydes. Vend tilbage alligevel?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Gendan scene"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Problem Tracker"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Erstattede %d forekomst(er)."
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/de.po b/editor/translations/de.po
index 1b1ada4825..082f22322b 100644
--- a/editor/translations/de.po
+++ b/editor/translations/de.po
@@ -48,12 +48,24 @@
# David May <wasser@gmail.com>, 2019.
# Draco Drache <jan.holger.te@gmail.com>, 2019.
# Jonas <dotchucknorris@gmx.de>, 2019.
+# PagDev <pag.develop@gmail.com>, 2020.
+# artism90 <artism90@googlemail.com>, 2020.
+# Jaigskim <filzstift112@gmail.com>, 2020.
+# Jacqueline Ulken <Jacqueline.Ulken@protonmail.com>, 2020.
+# Günther Bohn <ciscouser@gmx.de>, 2020.
+# Tom Wor <mail@tomwor.com>, 2020.
+# Bjarne Hiller <bjarne.hiller@gmail.com>, 2020.
+# Dirk Federmann <weblategodot@dirkfedermann.de>, 2020.
+# Helmut Hirtes <helmut.h@gmx.de>, 2020.
+# Michal695 <michalek.jedrzejak@gmail.com>, 2020.
+# Leon Marz <leon.marz@kabelmail.de>, 2020.
+# Patric Wust <patric.wust@gmx.de>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-20 11:39+0000\n"
-"Last-Translator: So Wieso <sowieso@dukun.de>\n"
+"PO-Revision-Date: 2020-09-22 03:23+0000\n"
+"Last-Translator: Patric Wust <patric.wust@gmx.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
"godot/de/>\n"
"Language: de\n"
@@ -61,23 +73,22 @@ 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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
-"Ungültiger Argument-Typ in convert()-Aufruf, TYPE_*-Konstanten benötigt."
+msgstr "Ungültiger Argument-Typ in convert(), TYPE_*-Konstanten benötigt."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "Zeichenkette der Länge 1 erwartet (ein Zeichen)."
+msgstr "Zeichenkette der Länge 1 erwartet (exakt ein Zeichen)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Nicht genügend Bytes zum Dekodieren oder ungültiges Format."
+msgstr "Nicht genügend Bytes zur Dekodierung oder ungültiges Format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -94,7 +105,7 @@ msgstr "Ungültige Operanden für Operator %s, %s und %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "Ungültiger Index des Typs ‚%s‘ für Grundtyp %s"
+msgstr "Ungültiger Index des Typs %s für Grundtyp %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
@@ -434,7 +445,7 @@ msgstr "Spuren neu anordnen"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr "Transformationsspuren gelten nur für Nodes die auf Spatial basieren."
+msgstr "Transformationsspuren gelten nur für Nodes, die auf Spatial basieren."
#: editor/animation_track_editor.cpp
msgid ""
@@ -537,11 +548,11 @@ msgstr ""
"Diese Animation gehört zu einer importierten Szene, Änderungen an "
"importierten Spuren werden nicht gespeichert.\n"
"\n"
-"Um neue Spuren hinzufügen zu können muss unter den Importeinstellungen\n"
+"Um neue Spuren hinzufügen zu können muss unter den Importeinstellungen der "
+"Szene\n"
"„Animation > Storage“ zu „Files“ gesetzt und „Animation > Keep Custom "
-"Tracks“ aktiviert werden.\n"
-"Danach ist die Szene erneut zu importieren.\n"
-"Alternativ kann eine Importeinstllung benutzt werden welche Animationen in "
+"Tracks“ aktiviert werden, danach ist die Szene erneut zu importieren.\n"
+"Alternativ kann eine Importeinstellung benutzt werden, welche Animationen in "
"separate Dateien importiert."
#: editor/animation_track_editor.cpp
@@ -551,7 +562,7 @@ msgstr "Achtung: Es wird eine importierte Animation bearbeitet"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
msgstr ""
-"Ein AnimationPlayer-Node auswählen um Animationen zu erzeugen oder zu "
+"Ein AnimationPlayer-Node auswählen, um Animationen zu erzeugen oder zu "
"bearbeiten."
#: editor/animation_track_editor.cpp
@@ -575,6 +586,7 @@ msgid "Seconds"
msgstr "Sekunden"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -734,8 +746,8 @@ msgid "Line Number:"
msgstr "Zeilennummer:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Suchbegriff wurde %d mal ersetzt."
+msgid "%d replaced."
+msgstr "%d ersetzt."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -753,7 +765,7 @@ msgstr "Groß-/Kleinschreibung berücksichtigen"
msgid "Whole Words"
msgstr "Ganze Wörter"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Ersetzen"
@@ -772,7 +784,7 @@ msgstr "Standard"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr "Seitenleiste umschalten"
+msgstr "Skript-Panel umschalten"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -803,6 +815,10 @@ msgid "Method in target node must be specified."
msgstr "Methode des Ziel-Nodes muss angegeben werden."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Methodenname muss ein gültiger Bezeichner sein."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -886,7 +902,6 @@ msgstr "Signal kann nicht verbunden werden"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -943,6 +958,11 @@ msgid "Signals"
msgstr "Signale"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Kacheln filtern"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Sollen wirklich alle Verbindungen mit diesem Signal entfernt werden?"
@@ -980,7 +1000,7 @@ msgid "Recent:"
msgstr "Kürzlich:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Suche:"
@@ -1164,9 +1184,12 @@ msgstr "Projektgründer"
msgid "Lead Developer"
msgstr "Hauptentwickler"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr "Projektverwaltung "
+msgstr "Projektleiter "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1185,6 +1208,14 @@ msgid "Gold Sponsors"
msgstr "Gold-Sponsoren"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Silber-Sponsoren"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Bronze-Sponsoren"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini-Sponsoren"
@@ -1493,7 +1524,7 @@ msgstr "Autoload verschieben"
msgid "Remove Autoload"
msgstr "Autoload entfernen"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Aktivieren"
@@ -1501,17 +1532,9 @@ msgstr "Aktivieren"
msgid "Rearrange Autoloads"
msgstr "Autoloads neu anordnen"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Ungültiger Pfad."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Datei existiert nicht."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Nicht im Ressourcen-Pfad."
+msgid "Can't add autoload:"
+msgstr "Autoload konnte nicht hinzugefügt werden:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1538,6 +1561,10 @@ msgstr "Name"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Parameter einfügen"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Aktualisiere Szene"
@@ -1624,8 +1651,9 @@ msgid ""
"Enabled'."
msgstr ""
"Die Zielplattform benötigt ‚ETC‘-Texturkompression für den Treiber-Fallback "
-"auf GLES2. Bitte ‚Import Etc‘ in den Projekteinstellungen aktivieren oder "
-"‚Driver Fallback Enabled‘ ausschalten."
+"auf GLES2. \n"
+"Bitte ‚Import Etc‘ in den Projekteinstellungen aktivieren oder ‚Driver "
+"Fallback Enabled‘ ausschalten."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1654,27 +1682,28 @@ msgstr "3D-Editor"
#: editor/editor_feature_profile.cpp
msgid "Script Editor"
-msgstr "Skripteditor"
+msgstr "Skript Editor"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr "Nutzerinhaltesammlung"
+msgstr "Bestandsbibliothek"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
msgstr "Szenenbaum-Bearbeitung"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importleiste"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Node-Leiste"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Dateisystem- und Import-Leiste"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Dateisystem"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importleiste"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1825,7 +1854,7 @@ msgstr "Im Dateimanager anzeigen"
msgid "New Folder..."
msgstr "Neuer Ordner..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Aktualisieren"
@@ -1939,7 +1968,7 @@ msgstr "Verzeichnisse & Dateien:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Vorschau:"
@@ -2010,7 +2039,7 @@ msgstr "Methoden"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "Motiv-Eigenschaften"
+msgstr "Theme-Eigenschaften"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2087,11 +2116,11 @@ msgstr "Nur Eigenschaften"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr "Nur Motiv-Eigenschaften"
+msgstr "Nur Theme-Eigenschaften"
#: editor/editor_help_search.cpp
msgid "Member Type"
-msgstr "Mitgliedstyp"
+msgstr "Attribut-Typ"
#: editor/editor_help_search.cpp
msgid "Class"
@@ -2107,7 +2136,7 @@ msgstr "Signal"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr "Konstant"
+msgstr "Konstante"
#: editor/editor_help_search.cpp
msgid "Property"
@@ -2115,7 +2144,7 @@ msgstr "Eigenschaft"
#: editor/editor_help_search.cpp
msgid "Theme Property"
-msgstr "Motiv-Eigenschaft"
+msgstr "Theme-Eigenschaft"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2123,11 +2152,11 @@ msgstr "Eigenschaft:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr "Setze"
+msgstr "Set"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr "Mehrfach einstellen:"
+msgstr "Mehrfach festlegen:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -2154,7 +2183,7 @@ msgstr "Ausgabe löschen"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr "Stop"
+msgstr "Stopp"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
@@ -2167,7 +2196,7 @@ msgstr "%s/s"
#: editor/editor_network_profiler.cpp
msgid "Down"
-msgstr "Herunter"
+msgstr "Runter"
#: editor/editor_network_profiler.cpp
msgid "Up"
@@ -2208,7 +2237,7 @@ msgstr "OK"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr "Fehler beim speichern der Ressource!"
+msgstr "Fehler beim Speichern der Ressource!"
#: editor/editor_node.cpp
msgid ""
@@ -2224,7 +2253,7 @@ msgstr "Speichere Ressource als..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr "Datei kann nicht zum schreiben geöffnet werden:"
+msgstr "Datei kann nicht zum Schreiben geöffnet werden:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
@@ -2232,13 +2261,13 @@ msgstr "Angefordertes Dateiformat unbekannt:"
#: editor/editor_node.cpp
msgid "Error while saving."
-msgstr "Fehler beim speichern."
+msgstr "Fehler beim Speichern."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
"Datei ‚%s‘ kann nicht geöffnet werden. Die Datei könnte verschoben oder "
-"gelöscht sein."
+"gelöscht worden sein."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2277,8 +2306,8 @@ msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
-"Diese Szene kann nicht gespeichert werden da sie eine zyklische "
-"Instantiierungshierarchie enthält.\n"
+"Diese Szene kann nicht gespeichert werden, da sie eine zyklische "
+"Instanziierungshierarchie enthält.\n"
"Speichern ist erst nach Beheben des Konflikts möglich."
#: editor/editor_node.cpp
@@ -2295,23 +2324,23 @@ msgstr "Momentan geöffnete Szenen können nicht überschrieben werden!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr "MeshLibrary konnte nicht zum vereinen geladen werden!"
+msgstr "MeshLibrary konnte nicht zum Vereinen geladen werden!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr "Fehler beim speichern der MeshLibrary!"
+msgstr "Fehler beim Speichern der MeshLibrary!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr "TileSet konnte nicht zum vereinen geladen werden!"
+msgstr "TileSet konnte nicht zum Vereinen geladen werden!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr "Fehler beim speichern des TileSet!"
+msgstr "Fehler beim Speichern des TileSet!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
-msgstr "Fehler beim speichern des Layouts!"
+msgstr "Fehler beim Speichern des Layouts!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
@@ -2319,7 +2348,7 @@ msgstr "Standard-Editorlayout überschrieben."
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr "Layout Name nicht gefunden!"
+msgstr "Layout-Name nicht gefunden!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
@@ -2340,7 +2369,7 @@ msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
-"Diese Ressource gehört zu einer instantiierten oder geerbten Szene.\n"
+"Diese Ressource gehört zu einer instanziierten oder geerbten Szene.\n"
"Änderungen an der Ressource werden beim Speichern der aktuellen Szene nicht "
"mitgespeichert."
@@ -2361,7 +2390,7 @@ msgid ""
"understand this workflow."
msgstr ""
"Diese Szene wurde importiert, Änderungen an ihr werden nicht gespeichert.\n"
-"Instantiierung oder Vererbung sind nötig um Änderungen vorzunehmen.\n"
+"Instanziierung oder Vererbung ist nötig, um Änderungen vorzunehmen.\n"
"Die Dokumentation zum Szenenimport beschreibt den nötigen Arbeitsablauf."
#: editor/editor_node.cpp
@@ -2370,18 +2399,13 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"Dies ist ein Fern-Objekt, Änderungen an ihm werden nicht gespeichert.\n"
+"Dies ist ein nicht-lokales Objekt, Änderungen an ihm werden nicht "
+"gespeichert.\n"
"Die Dokumentation zum Debugging beschreibt den nötigen Arbeitsablauf."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
-msgstr "Es ist keine zu startende Szene definiert."
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Die aktuelle Szene wurde noch nicht gespeichert, bitte speichere sie vor dem "
-"Starten."
+msgstr "Es ist keine abzuspielende Szene definiert."
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
@@ -2469,13 +2493,17 @@ msgstr ""
"Szene kann nicht neu geladen werden, wenn sie vorher nicht gespeichert wurde."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Zurücksetzen"
+msgid "Reload Saved Scene"
+msgstr "Gespeicherte Szene neu laden"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
-"Diese Aktion kann nicht rückgängig gemacht werden. Trotzdem zurücksetzen?"
+"Die aktuelle Szene enthält ungesicherte Änderungen.\n"
+"Soll die Szene trotzdem neu geladen werden? Diese Aktion kann nicht "
+"rückgängig gemacht werden."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2607,9 +2635,10 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"Die ausgewählte Szene ‚%s‘ existiert nicht.\n"
-"Wähle eine gültige Szene in den Projekteinstellungen unter der Kategorie "
-"„Anwendung“."
+"Die ausgewählte Szene ‚%s‘ existiert nicht, soll eine gültige ausgewählt "
+"werden?\n"
+"Dies kann später in den Projekteinstellungen unter der Kategorie ‚Anwendung‘ "
+"geändert werden."
#: editor/editor_node.cpp
msgid ""
@@ -2617,9 +2646,10 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"Die ausgewählte Szene ‚%s‘ ist keine gültige Datei für eine Szene.\n"
-"Wähle eine gültige Szene in den Projekteinstellungen unter der Kategorie "
-"„Anwendung“."
+"Die ausgewählte Szene ‚%s‘ ist keine gültige Datei für eine Szene, soll eine "
+"andere ausgewählt werden?\n"
+"Dies kann später in den Projekteinstellungen unter der Kategorie ‚Anwendung‘ "
+"geändert werden."
#: editor/editor_node.cpp
msgid "Save Layout"
@@ -2770,10 +2800,6 @@ msgid "Redo"
msgstr "Wiederherstellen"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Szene zurücksetzen"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Sonstiges Projekt oder szenenübergreifende Werkzeuge."
@@ -2825,7 +2851,7 @@ msgstr "Zur Projektverwaltung zurückkehren"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr "Debuggen"
+msgstr "Fehlersuche (debuggen)"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
@@ -2833,24 +2859,28 @@ msgstr "Mit Fern-Fehlerbehebung starten"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Beim Exportieren oder Starten wird das Programm versuchen, sich mit der IP-"
-"Adresse dieses Computers zu verbinden, um Fehler beheben zu können."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Kleine Programmdatei über ein Netzwerkdateisystem"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Wenn diese Option aktiviert ist, wird das Exportieren bzw. Starten nur eine "
"kleine Programmdatei erzeugen.\n"
@@ -2864,9 +2894,10 @@ msgid "Visible Collision Shapes"
msgstr "Collision-Shapes sichtbar"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Collision-Shapes und Raycast-Nodes (für 2D und 3D) werden im laufenden Spiel "
"angezeigt, falls diese Option aktiviert ist."
@@ -2876,23 +2907,26 @@ msgid "Visible Navigation"
msgstr "Navigation sichtbar"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigations- Meshes und Polygone werden im laufenden Spiel sichtbar sein "
"wenn diese Option gewählt ist."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Szenenänderungen synchronisieren"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Wenn diese Option gewählt ist, werden jegliche Änderungen der Szene im "
"Editor im laufenden Spiel dargestellt.\n"
@@ -2900,15 +2934,17 @@ msgstr ""
"effizientesten das Netzwerk-Dateisystem zu nutzen."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Skriptänderungen synchronisieren"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Wenn diese Option gewählt ist, werden erneut gespeicherte Skripte während "
"des laufenden Spiels neu geladen.\n"
@@ -2973,7 +3009,7 @@ msgstr "Hilfe"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Suchen"
@@ -2987,12 +3023,16 @@ msgid "Q&A"
msgstr "Fragen & Antworten"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Problem-Melder"
+msgid "Report a Bug"
+msgstr "Fehler berichten"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Dokumentationsvorschläge senden"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr "Internetgemeinschaft"
+msgstr "Community"
#: editor/editor_node.cpp
msgid "About"
@@ -3004,7 +3044,7 @@ msgstr "Projekt abspielen."
#: editor/editor_node.cpp
msgid "Play"
-msgstr "Starten"
+msgstr "Abspielen"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
@@ -3024,7 +3064,7 @@ msgstr "Spiele die bearbeitete Szene."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr "Szene starten"
+msgstr "Szene abspielen"
#: editor/editor_node.cpp
msgid "Play custom scene"
@@ -3032,7 +3072,7 @@ msgstr "Spiele angepasste Szene"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Spiele angepasste Szene"
+msgstr "Angepasste Szene abspielen"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
@@ -3249,7 +3289,7 @@ msgstr "Gesamt"
#: editor/editor_profiler.cpp
msgid "Self"
-msgstr "Eigenanteil"
+msgstr "Selbst"
#: editor/editor_profiler.cpp
msgid "Frame #:"
@@ -3388,9 +3428,11 @@ msgid "Add Key/Value Pair"
msgstr "Schlüssel-Wert-Paar hinzufügen"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Keine Soforteinsatz-Exportvorlage für diese Plattform gefunden.\n"
"Im Exportmenü kann eine Vorlage als Soforteinsatz markiert werden."
@@ -3419,6 +3461,12 @@ msgstr "Skript konnte nicht ausgeführt werden:"
msgid "Did you forget the '_run' method?"
msgstr "Hast du die '_run' Methode vergessen?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Strg-Taste halten um auf Ganzzahlen zu runden. Umschalt-Taste halten für "
+"präzisere Änderungen."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Selektiere Node(s) für den Import"
@@ -3930,7 +3978,7 @@ msgstr "Nodes filtern"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
-msgstr "Nodes in der Gruppe"
+msgstr "Nodes in Gruppe"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
@@ -4018,10 +4066,20 @@ msgid "Error running post-import script:"
msgstr "Fehler beim ausführen des Post-Import Skripts:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+"Wurde ein von Node abstammendes Objekt in der ‚post_import()‘-Methode "
+"zurückgegeben?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Speichere..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Dateien"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Als Standard für ‚%s‘ setzen"
@@ -4030,10 +4088,6 @@ msgid "Clear Default for '%s'"
msgstr "Standard für ‚%s‘ löschen"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Dateien"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importiere als:"
@@ -4046,7 +4100,7 @@ msgid "Reimport"
msgstr "Neuimport"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Szenen speichern, reimportieren und neu starten"
#: editor/import_dock.cpp
@@ -4084,10 +4138,6 @@ msgid "Copy Params"
msgstr "Parameter kopieren"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Parameter einfügen"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Ressourcen-Zwischenablage bearbeiten"
@@ -4576,7 +4626,7 @@ msgstr "Spiele ausgewählte Animation vom Start. (Umschalt+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
-msgstr "Ausgewählte Animation von aktueller Position aus abspielen. (D)"
+msgstr "Spiele ausgewählte Animation von aktueller Position. (D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation position (in seconds)."
@@ -4616,7 +4666,7 @@ msgstr "Zwiebelhaut aktivieren"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Onion Skinning Options"
-msgstr "Zwiebelhaut-Einstellugen"
+msgstr "Zwiebelhaut-Einstellungen"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Directions"
@@ -5158,7 +5208,7 @@ msgid "Bake Lightmaps"
msgstr "Lightmaps vorrendern"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Vorschau"
@@ -5263,8 +5313,8 @@ msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
msgstr ""
-"Wenn aktiviert ändert das Verschieben von Control-Nodes ihre Anker anstatt "
-"ihre Ausmaße."
+"Wenn aktiviert, ändert das Verschieben von Control-Nodes deren Bezugspunkte "
+"statt ihre Randabstände."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Left"
@@ -5420,7 +5470,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Zoom Zurücksetzen"
+msgstr "Zoom zurücksetzen"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5619,7 +5669,7 @@ msgstr "Zeige Ansichtsfenster (Viewport)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr "Gruppe zeigen und Icons sperren"
+msgstr "Gruppen und Symbole anzeigen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -5667,9 +5717,8 @@ msgid "Auto Insert Key"
msgstr "Schlüsselbild automatisch einfügen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Animationsschlüsselbild eingefügt."
+msgstr "Schlüsselbild- und Posen-Optionen für Animationen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5681,7 +5730,7 @@ msgstr "Pose kopieren"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Pose"
-msgstr "Pose zurücksetzen"
+msgstr "Pose/Stellung löschen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
@@ -5914,12 +5963,12 @@ msgid "Mesh is empty!"
msgstr "Mesh ist leer!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Statischen Trimesh-Körper erzeugen"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Trimesh-Kollisions-Shape konnte nicht erstellt werden."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Statischen Konvex-Körper erzeugen"
+msgid "Create Static Trimesh Body"
+msgstr "Statischen Trimesh-Körper erzeugen"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5930,12 +5979,32 @@ msgid "Create Trimesh Static Shape"
msgstr "Trimesh-Statische-Form erzeugen"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Form-Erstellung fehlgeschlagen!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"Aus der Szenenwurzel kann ein einzelnes konvexes Kollisionselement nicht "
+"erzeugt werden."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Ein einzelnes konvexes Kollisionselement konnte nicht erzeugt werden."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Konvexe Form(en) erstellen"
+msgid "Create Single Convex Shape"
+msgstr "Einzelne konvexe Form erstellen"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Aus der Szenenwurzel konnten mehrere konvexe Kollisionselemente nicht "
+"erzeugt werden."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Konnte kein einziges Kollisionselement erzeugen."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Mehrere konvexe Formen erstellen"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5987,18 +6056,68 @@ msgid "Create Trimesh Static Body"
msgstr "Statischen Trimesh-Körper erzeugen"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Erstellt einen StaticBody und weist ein polygon-basiertes Kollisionselement "
+"automatisch zu.\n"
+"Dies ist die präziseste (aber langsamste) Methode für Kollisionsberechnungen."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Trimesh-Kollisionselement erzeugen"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Konvexe(s) Kollisionselement(e) erzeugen"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Erstellt ein polygon-basiertes Kollisionselement.\n"
+"Dies ist die präziseste (aber langsamste) Methode für Kollisionsberechnungen."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Ein einzelnes konvexes Kollisionsnachbarelement erzeugen"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Erstellt ein einzelnes konvexes Kollisionselement.\n"
+"Dies ist die schnellste (aber ungenauste) Methode für Kollisionsberechnungen."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Mehrere konvexe Kollisionsunterelemente erzeugen"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Erstellt ein polygon-basiertes Kollisionselement.\n"
+"Dies liegt von der Geschwindigkeit in der Mitte der beiden anderen Methoden."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Umriss-Mesh erzeugen..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Erstellt ein statisches Outline-Mesh. Outline-Meshes haben ihre "
+"Normalenvektoren automatisch invertiert.\n"
+"Dies kann als Ersatz für die SpatialMaterial-Grow-Eigenschaft genutzt werden "
+"wenn sie nicht verfügbar ist."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "UV1 zeigen"
@@ -6695,11 +6814,11 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
-msgstr "Motiv importieren"
+msgstr "Theme importieren"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error while saving theme"
-msgstr "Fehler beim Speichern des Motivs"
+msgstr "Fehler beim Speichern des Themes"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving"
@@ -6707,7 +6826,7 @@ msgstr "Fehler beim Speichern"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
-msgstr "Motiv speichern als..."
+msgstr "Theme speichern als..."
#: editor/plugins/script_editor_plugin.cpp
msgid "%s Class Reference"
@@ -6749,7 +6868,7 @@ msgstr "Schiebe hoch"
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr "Schiebe herunter"
+msgstr "Schiebe runter"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
@@ -6794,7 +6913,7 @@ msgstr "Vorwärts im Verlauf"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme"
-msgstr "Motiv"
+msgstr "Designvorlagen (Thema)"
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme..."
@@ -6802,11 +6921,11 @@ msgstr "Thema importieren..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
-msgstr "Motiv neu laden"
+msgstr "Theme neu laden"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme"
-msgstr "Motiv speichern"
+msgstr "Theme speichern"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
@@ -6850,15 +6969,6 @@ msgid "Open Godot online documentation."
msgstr "Godot-Onlinedokumentation öffnen."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Dokumentation anfragen"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-"Mithelfen die Godot-Dokumentation durch Meinungsäußerungen zu verbessern."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Durchsuche die Referenzdokumentation."
@@ -6923,12 +7033,12 @@ msgstr ""
"Fehlende verbundene Methode ‚%s‘ für Signal ‚%s‘ von Node ‚%s‘ zu Node ‚%s‘."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Zeile"
+msgid "[Ignore]"
+msgstr "[Ignorieren]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignorieren)"
+msgid "Line"
+msgstr "Zeile"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7035,7 +7145,7 @@ msgstr "Symbol vervollständigen"
#: editor/plugins/script_text_editor.cpp
msgid "Evaluate Selection"
-msgstr "Auswahl auswerten"
+msgstr "Springe zum vorigen Haltepunkt"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
@@ -7298,6 +7408,10 @@ msgid "This operation requires a single selected node."
msgstr "Diese Aktion benötigt einen einzelnen ausgewählten Node."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Auto-Orthogonal aktiviert"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Sichtrotation sperren"
@@ -7386,6 +7500,10 @@ msgid "Freelook Slow Modifier"
msgstr "Freisicht Trägheitsregler"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Sichtrotation gesperrt"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7394,14 +7512,25 @@ msgstr ""
"Sie ist kein zuverlässiger Vergleichswert für die In-Spiel-Leistung."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Sichtrotation gesperrt"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Transformationsdialog"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Klicken um zwischen Sichtbarkeitsmodi umzuschalten.\n"
+"\n"
+"Offenes Auge: Griffe sind sichtbar.\n"
+"Geschlossenes Auge: Griffe sind unsichtbar.\n"
+"Halb offenes Auge: Griffe sind auch durch deckende Oberflächen sichtbar "
+"(\"Röntgenblick\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Nodes am Boden einrasten"
@@ -7742,7 +7871,8 @@ msgid "New Animation"
msgstr "Neue Animation"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Geschwindigkeit (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7892,7 +8022,7 @@ msgstr "Aus derzeitigem Editor-Thema erstellen"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Toggle Button"
-msgstr "Knopf umschalten"
+msgstr "Umschaltknopf"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Disabled Button"
@@ -7997,7 +8127,7 @@ msgstr "Farbe"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme File"
-msgstr "Motiv-Datei"
+msgstr "Theme-Datei"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
@@ -8127,7 +8257,7 @@ msgstr "Nächste Koordinate"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
-msgstr "Die nächste Form oder Kachel auswählen."
+msgstr "Die nächste Form oder (Unter-)Kachel auswählen."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Previous Coordinate"
@@ -8135,7 +8265,7 @@ msgstr "Vorherige Koordinate"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
-msgstr "Die vorherige Form oder Kachel auswählen."
+msgstr "Die vorherige Form oder (Unter-)Kachel auswählen."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region"
@@ -8175,7 +8305,7 @@ msgstr "Kollisionsmodus"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Occlusion Mode"
-msgstr "Verschlussmodus"
+msgstr "Verdeckungsmodus"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Navigation Mode"
@@ -8422,7 +8552,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "Keine Versionsverwaltungserweiterungen verfügbar."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Fehler"
@@ -9248,7 +9378,7 @@ msgid ""
msgstr ""
"Stufenfunktion ( Vektor(Kante), Vektor(x) ).\n"
"\n"
-"Gibt 0.0 zurück falls ‚x‘ kleiner als ‚Kante‘, ansonsten 1.0."
+"Gibt 0.0 zurück falls ‚x‘ kleiner als ‚Kante‘, ansonsten 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9304,9 +9434,9 @@ msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
-"Gibt den Fresnelabfall abgeleitet aus dem Skalarprodukt aus "
-"Oberflächennormalenvektor und Kamerablickrichtung zurück (zugeordnete "
-"Eingänge müssen übergeben werden)."
+"Gibt den Abfall basierend auf dem Punktprodukt der Oberflächennormalen und "
+"der Blickrichtung der Kamera zurück (übergeben Sie die zugehörigen Eingaben "
+"an diese)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9517,7 +9647,7 @@ msgstr "Pack-Datei"
#: editor/project_export.cpp
msgid "Features"
-msgstr "Funktionen"
+msgstr "Eigenschaften"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
@@ -9592,24 +9722,29 @@ msgid "Export With Debug"
msgstr "Exportiere mit Debuginformationen"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Dieser Pfad existiert nicht."
+msgid "The path specified doesn't exist."
+msgstr "Der angegebene Pfad existiert nicht."
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Fehler beim Öffnen der Paketdatei (kein ZIP-Format)."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Ungültige Projekt-Zipdatei, enthält keine ‚project.godot‘-Datei."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "Ungültige „.zip“-Projektdatei, enthält keine „project.godot“-Datei."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Bitte einen leeren Ordner auswählen."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Eine ‚project.godot‘-Datei oder Zipdatei auswählen."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Eine „project.godot” oder „.zip“-Datei auswählen."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "Das Verzeichnis beinhaltet bereits ein Godot-Projekt."
+msgid "This directory already contains a Godot project."
+msgstr "Dieses Verzeichnis beinhaltet bereits ein Godot-Projekt."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9873,6 +10008,7 @@ msgstr ""
"Sollen wirklich %s Ordner nach Godot-Projekten durchsucht werden?\n"
"Dies kann eine Weile dauern."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Projektverwaltung"
@@ -9922,6 +10058,17 @@ msgstr ""
"Sollen offizielle Beispielprojekte aus der Nutzerinhaltesammlung angezeigt "
"werden?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Die Suchmaske filtert Projekte nach ihrem Namen oder der letzten Komponente "
+"ihres Pfadnamens.\n"
+"Um den Filter auf den gesamten Pfadnamen anzuwenden muss mindestens ein ‚/‘-"
+"Zeichen in der Suchanfrage vorhanden sein."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Taste "
@@ -10040,7 +10187,7 @@ msgstr "Ereignis hinzufügen"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Knopf"
+msgstr "Schaltfläche (Button)"
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -10213,7 +10360,7 @@ msgstr "Umleitungen nach Lokalisierung:"
#: editor/project_settings_editor.cpp
msgid "Locale"
-msgstr "Lokalisierung"
+msgstr "Gebietsschema"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
@@ -10304,14 +10451,25 @@ msgid "Batch Rename"
msgstr "Stapelweise Umbenennung"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Ersetzen: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Prefix"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Suffix"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Reguläre Ausdrücke verwenden"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Erweiterte Einstellungen"
@@ -10348,11 +10506,12 @@ msgstr ""
"Zahleroptionen vergleichen."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Pro-Ebene-Zähler"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
"Falls gesetzt startet dieser Zähler für jede Gruppe aus Unterobjekten neu"
@@ -10381,10 +10540,6 @@ msgstr ""
"Fehlende Ziffern werden mit führenden Nullen ergänzt."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Reguläre Ausdrücke"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Nachbearbeitung"
@@ -10393,11 +10548,11 @@ msgid "Keep"
msgstr "Behalten"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr "CamelCase zu unter_strich"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr "unter_strich zu CamelCase"
#: editor/rename_dialog.cpp
@@ -10416,6 +10571,15 @@ msgstr "Zu Großbuchstaben"
msgid "Reset"
msgstr "Zurücksetzen"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Fehler in regulärem Ausdruck"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Bei Zeichen %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Node umhängen"
@@ -10482,8 +10646,8 @@ msgid "Instance Child Scene"
msgstr "Szene hier instantiieren"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Skript leeren"
+msgid "Detach Script"
+msgstr "Skript loslösen"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10520,6 +10684,10 @@ msgid "Make node as Root"
msgstr "Node zur Szenenwurzel machen"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "%d Nodes und ihre Unterobjekte löschen?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "%d Nodes löschen?"
@@ -10634,11 +10802,11 @@ msgstr "Unter-Ressourcen"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance"
-msgstr "Leere Vererbung"
+msgstr "Löse Vererbung"
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
-msgstr "bearbeitbare Unterobjekte"
+msgstr "Bearbeitbare Unterobjekte"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
@@ -10649,6 +10817,15 @@ msgid "Open Documentation"
msgstr "Dokumentation öffnen"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Skript konnte nicht angehängt werden: Keine Sprachen registriert.\n"
+"Vermutliche Ursache ist dass der Editor ohne Sprachmodulen gebaut wurde."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Node hier anhängen"
@@ -10666,7 +10843,7 @@ msgstr "Node unter neues Node hängen"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Szenen-Wurzel erstellen"
+msgstr "Als Szenen-Wurzel festlegen"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10697,12 +10874,12 @@ msgstr ""
"kein Root-Node existiert."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Ein neues oder existierendes Skript zum ausgewählten Node hinzufügen."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Ein neues oder existierendes Skript dem ausgewählten Node anhängen."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Entferne Skript von ausgewähltem Node."
+msgid "Detach the script from the selected node."
+msgstr "Skript vom ausgewählten Node loslösen."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10714,7 +10891,7 @@ msgstr "Lokal"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance? (No Undo!)"
-msgstr "Vererbung wirklich leeren? (Lässt sich nicht rückgängig machen!)"
+msgstr "Vererbung wirklich lösen? (Lässt sich nicht rückgängig machen!)"
#: editor/scene_tree_editor.cpp
msgid "Toggle Visible"
@@ -10757,12 +10934,12 @@ msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
-"Node ist %s Gruppe(n).\n"
+"Node gehört zu %s Gruppe(n).\n"
"Hier klicken zur Gruppenverwaltung."
#: editor/scene_tree_editor.cpp
msgid "Open Script:"
-msgstr "Offenes Skript:"
+msgstr "Skript öffnen:"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -10834,6 +11011,10 @@ msgid "A directory with the same name exists."
msgstr "Ein Verzeichnis mit gleichem Namen existiert bereits."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Datei existiert nicht."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Ungültige Dateiendung."
@@ -10874,6 +11055,10 @@ msgid "File exists, it will be reused."
msgstr "Datei existiert bereits, wird erneut verwendet."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Ungültiger Pfad."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Ungültiger Klassenname."
@@ -10882,8 +11067,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Ungültiger geerbter Name oder Pfad."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Skript ist gültig."
+msgid "Script path/name is valid."
+msgstr "Skript-Pfad oder -Name ist gültig."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10906,6 +11091,14 @@ msgid "Script file already exists."
msgstr "Skriptdatei existiert bereits."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Hinweis: Eingebettete Skripte unterliegen gewissen Einschränkungen und "
+"können nicht mit einem externen Editor bearbeitet werden."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Klassenname:"
@@ -10974,6 +11167,10 @@ msgid "Copy Error"
msgstr "Fehlermeldung kopieren"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Video RAM"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Haltepunkte auslassen"
@@ -11022,8 +11219,8 @@ msgid "Total:"
msgstr "Insgesamt:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Grafikspeicher"
+msgid "Export list to a CSV file"
+msgstr "Liste als CSV-Datei exportieren"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11775,7 +11972,7 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr "Ausgewähltes löschen"
+msgstr "Auswahl löschen"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
@@ -11791,7 +11988,7 @@ msgstr "Nodes trennen"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Function"
-msgstr "Funktion bauen"
+msgstr "Funktion erstellen"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
@@ -11881,7 +12078,7 @@ msgstr "Paketsegmente dürfen keine Länge gleich Null haben."
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr "Das Zeichen ‚%s‘ ist in Android-Anwendungs-Paketnamen nicht gestattet."
+msgstr "Das Zeichen ‚%s‘ ist in Android-Anwendungspaketnamen nicht gestattet."
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
@@ -11915,6 +12112,11 @@ msgstr ""
"konfiguriert."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Release-Keystore wurde nicht korrekt konfiguriert in den Exporteinstellungen."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Eigene Builds erfordern gültigen Android-SDK-Pfad in den Editoreinstellungen."
@@ -11942,6 +12144,41 @@ msgstr "Ungültiger Paketname:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Ungültiges „GodotPaymentV3“-Modul eingebunden in den „android/modules“-"
+"Projekteinstellungen (wurde in Godot 3.2.2 geändert).\n"
+
+#: platform/android/export/export.cpp
+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."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"„Degrees Of Freedom“ ist nur gültig wenn „Xr Mode“ als „Occulus Mobile VR“ "
+"gesetzt wurde."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"„Hand Tracking“ ist nur gültig wenn „Xr Mode“ als „Occulus Mobile VR“ "
+"gesetzt wurde."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"„Focus Awareness“ ist nur gültig wenn „Xr Mode“ als „Occulus Mobile VR“ "
+"gesetzt wurde."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12038,7 +12275,7 @@ msgstr "Verwende Standard-Startbildschirm-Bilddatei."
#: platform/uwp/export/export.cpp
msgid "Invalid package short name."
-msgstr "Ungültiger Paketekurzname."
+msgstr "Ungültiger Paket-Kurzname."
#: platform/uwp/export/export.cpp
msgid "Invalid package unique name."
@@ -12124,7 +12361,7 @@ msgid ""
msgstr ""
"CollisionPolygon2D liefert nur eine Kollisionsform für ein von "
"CollisionObject2D abgeleitetes Node. Es kann nur als Unterobjekt von Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden um diesen "
+"StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden, um diesen "
"eine Form zu geben."
#: scene/2d/collision_polygon_2d.cpp
@@ -12139,7 +12376,7 @@ msgid ""
msgstr ""
"CollisionShape2D liefert nur eine Kollisionsform für ein von "
"CollisionObject2D abgeleitetes Node. Es kann nur als Unterobjekt von Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden um diesen "
+"StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden, um diesen "
"eine Form zu geben."
#: scene/2d/collision_shape_2d.cpp
@@ -12150,6 +12387,15 @@ msgstr ""
"Damit CollisionShape2D funktionieren kann, muss eine Form angegeben werden. "
"Bitte erzeuge eine Shape-Ressource dafür!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Polygon basierte Formen sollten nicht direkt in CollisionShape2D-Nodes "
+"genutzt oder bearbeitet werden. Zu diesem Zweck sollte das CollsionPolygon2D-"
+"Node verwendet werden."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12193,9 +12439,9 @@ msgid ""
"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
"node. It only provides navigation data."
msgstr ""
-"Eine NavigationPolygon-Instanz muss ein Unterobjekt erster oder zweiter "
-"Ordnung unterhalb eines Navigation2D-Node sein. Sie liefert nur "
-"Navigationsdaten."
+"NavigationPolygonInstance muss ein Unterobjekt erster oder zweiter Ordnung "
+"unterhalb eines Navigation2D-Node sein. Es liefert nur "
+"Navigationsinformationen."
#: scene/2d/parallax_layer.cpp
msgid ""
@@ -12276,10 +12522,10 @@ msgid ""
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
-"Ein TileMap mit aktivierter „Use Parent“-Option benötigt ein "
-"CollisionObject2D-Elternnode dem es Form verleiht. Das TileMap sollte als "
-"als Unterobjekt von Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, usw. "
-"verwendet werden um ihnen eine Form zu geben."
+"Eine TileMap mit aktivierter „Use Parent“-Option benötigt ein Eltern-Node "
+"des Typs CollisionObject2D, welcher der TileMap eine Form verleiht. Sie "
+"sollte als Unterobjekt von Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D, usw. verwendet werden, um ihnen eine Form zu geben."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -12364,7 +12610,8 @@ msgid ""
msgstr ""
"CollisionPolygon liefert nur eine Kollisionsform für ein von CollisionObject "
"abgeleitetes Node. Es kann nur als Unterobjekt von Area, StaticBody, "
-"RigidBody, KinematicBody usw. eingehängt werden um diesen eine Form zu geben."
+"RigidBody, KinematicBody usw. eingehängt werden, um diesen eine Form zu "
+"verleihen."
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
@@ -12378,7 +12625,8 @@ msgid ""
msgstr ""
"CollisionShape liefert nur eine Kollisionsform für ein von CollisionObject "
"abgeleitetes Node. Es kann nur als Unterobjekt von Area, StaticBody, "
-"RigidBody, KinematicBody usw. eingehängt werden um diesen eine Form zu geben."
+"RigidBody, KinematicBody usw. eingehängt werden, um diesen eine Form zu "
+"geben."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12396,6 +12644,11 @@ msgstr ""
"Plane-Shapes funktionieren nicht gut und werden in einer zukünftigen Version "
"entfernt. Von der Nutzung wird abgeraten."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr "ConcavePolygonShape unterstützt RigidBody nur im Modus Statisch."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Nichts ist sichtbar da kein Mesh zugewiesen wurden."
@@ -12420,6 +12673,11 @@ msgstr ""
"GIProbes werden vom GLES2-Videotreiber nicht unterstützt.\n"
"BakedLightmaps können als Alternative verwendet werden."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12437,8 +12695,8 @@ msgid ""
"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
"It only provides navigation data."
msgstr ""
-"Eine NavigationMesh-Instanz muss ein Unterobjekt erster oder höherer Ordnung "
-"eines Navigation-Nodes sein. Es liefert nur Navigationsdaten."
+"NavigationMeshInstance muss ein Unterobjekt erster oder zweiter Ordnung "
+"eines Navigation-Nodes sein. Es liefert nur Navigationsinformationen."
#: scene/3d/particles.cpp
msgid ""
@@ -12709,6 +12967,11 @@ msgstr ""
"Eigenschaft ‚Render Target‘ des Viewports aktiviert und seine Textur "
"irgendeinem Node zum Anzeigen zugewiesen werden."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"Die Größe des Viewports muss größer als 0 sein um etwas rendern zu können."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Ungültige Quelle für Vorschau."
@@ -12737,6 +13000,56 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden."
msgid "Constants cannot be modified."
msgstr "Konstanten können nicht verändert werden."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Dateisystem- und Import-Leiste"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Beim Exportieren oder Starten wird das Programm versuchen, sich mit der "
+#~ "IP-Adresse dieses Computers zu verbinden, um Fehler beheben zu können."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Die aktuelle Szene wurde noch nicht gespeichert, bitte vor dem Abspielen "
+#~ "sichern."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Nicht im Ressourcen-Pfad."
+
+#~ msgid "Revert"
+#~ msgstr "Zurücksetzen"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr ""
+#~ "Diese Aktion kann nicht rückgängig gemacht werden. Trotzdem zurücksetzen?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Szene zurücksetzen"
+
+#~ msgid "Clear Script"
+#~ msgstr "Skript leeren"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Problem-Melder"
+
+#~ msgid "Request Docs"
+#~ msgstr "Dokumentation anfragen"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr ""
+#~ "Mithelfen die Godot-Dokumentation durch Meinungsäußerungen zu verbessern."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Suchbegriff wurde %d mal ersetzt."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Statischen Konvex-Körper erzeugen"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Form-Erstellung fehlgeschlagen!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po
deleted file mode 100644
index fc524de9ad..0000000000
--- a/editor/translations/de_CH.po
+++ /dev/null
@@ -1,12857 +0,0 @@
-# Swiss High German translation of the Godot Engine editor
-# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
-# This file is distributed under the same license as the Godot source code.
-# Christian Fisch <christian.fiesel@gmail.com>, 2016.
-# Nils <nfa106008@iet-gibb.ch>, 2020.
-msgid ""
-msgstr ""
-"Project-Id-Version: Godot Engine editor\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-20 11:39+0000\n"
-"Last-Translator: Nils <nfa106008@iet-gibb.ch>\n"
-"Language-Team: German (Swiss High) <https://hosted.weblate.org/projects/"
-"godot-engine/godot/de_CH/>\n"
-"Language: de_CH\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 3.11-dev\n"
-
-#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/visual_script/visual_script_builtin_funcs.cpp
-msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
-
-#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-msgid "Expected a string of length 1 (a character)."
-msgstr ""
-
-#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/gd_glue.cpp
-#: modules/visual_script/visual_script_builtin_funcs.cpp
-msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
-
-#: core/math/expression.cpp
-msgid "Invalid input %i (not passed) in expression"
-msgstr ""
-
-#: core/math/expression.cpp
-msgid "self can't be used because instance is null (not passed)"
-msgstr "self cha nid brucht wärde wöu d Instanz null isch (nid düre cho)"
-
-#: core/math/expression.cpp
-msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Invalidi Operande füre Operator %s, %s und %s."
-
-#: core/math/expression.cpp
-msgid "Invalid index of type %s for base type %s"
-msgstr "Invalide index vom Typ %s füre Basis Typ %s"
-
-#: core/math/expression.cpp
-msgid "Invalid named index '%s' for base type %s"
-msgstr "Invalid benamslete index '%s' füre Basis Typ %s"
-
-#: core/math/expression.cpp
-msgid "Invalid arguments to construct '%s'"
-msgstr "Invalidi argumänt für s '%s' z konstruiere"
-
-#: core/math/expression.cpp
-msgid "On call to '%s':"
-msgstr "Ufem ufruef für '%s':"
-
-#: core/ustring.cpp
-msgid "B"
-msgstr "B"
-
-#: core/ustring.cpp
-msgid "KiB"
-msgstr "KiB"
-
-#: core/ustring.cpp
-msgid "MiB"
-msgstr "MiB"
-
-#: core/ustring.cpp
-msgid "GiB"
-msgstr "GiB"
-
-#: core/ustring.cpp
-msgid "TiB"
-msgstr "TiB"
-
-#: core/ustring.cpp
-msgid "PiB"
-msgstr "PiB"
-
-#: core/ustring.cpp
-msgid "EiB"
-msgstr "EiB"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Free"
-msgstr "Gratis"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Balanced"
-msgstr "Usgliche"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Mirror"
-msgstr "Spiegu"
-
-#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
-msgid "Time:"
-msgstr "Zit:"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Value:"
-msgstr "Wärt:"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Insert Key Here"
-msgstr "Schlüssu hie ifüege"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Duplicate Selected Key(s)"
-msgstr "Usgwäuti Schlüssle dupliziere"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Delete Selected Key(s)"
-msgstr "Usgwäuti Schlüssle lösche"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Add Bezier Point"
-msgstr "Dr Bezier Punkt hinzuefüege"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Move Bezier Points"
-msgstr "Dr Bezier Punkt bewege"
-
-#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-msgid "Anim Duplicate Keys"
-msgstr "Anim Schlüssle Dupliziere"
-
-#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-msgid "Anim Delete Keys"
-msgstr "Anim Schlüssle lösche"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Keyframe Time"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Transition"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Transform"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Keyframe Value"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Call"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Keyframe Time"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Transition"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Transform"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Keyframe Value"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Call"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Change Animation Length"
-msgstr "Typ ändern"
-
-#: editor/animation_track_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Change Animation Loop"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Property Track"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "3D Transform Track"
-msgstr "Transformationstyp"
-
-#: editor/animation_track_editor.cpp
-msgid "Call Method Track"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Bezier Curve Track"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Audio Playback Track"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Animation Playback Track"
-msgstr "Stoppe Animations-Wiedergabe. (S)"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Animation length (frames)"
-msgstr "Animations-Node"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Animation length (seconds)"
-msgstr "Animations-Node"
-
-#: editor/animation_track_editor.cpp
-msgid "Add Track"
-msgstr "Spur hinzuefüege"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation Looping"
-msgstr "Animationswiderholig"
-
-#: editor/animation_track_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Functions:"
-msgstr "Funktione:"
-
-#: editor/animation_track_editor.cpp
-msgid "Audio Clips:"
-msgstr "Audioclips:"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Clips:"
-msgstr "Animationsclips:"
-
-#: editor/animation_track_editor.cpp
-msgid "Change Track Path"
-msgstr "D Spur wächsle"
-
-#: editor/animation_track_editor.cpp
-msgid "Toggle this track on/off."
-msgstr "Die Spur ah-/abschaute"
-
-#: editor/animation_track_editor.cpp
-msgid "Update Mode (How this property is set)"
-msgstr "Update Modus (Wie die Eigeschaft gsetzt isch)"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Interpolation Mode"
-msgstr "Animations-Node"
-
-#: editor/animation_track_editor.cpp
-msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Remove this track."
-msgstr "Ungültige Bilder löschen"
-
-#: editor/animation_track_editor.cpp
-msgid "Time (s): "
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Toggle Track Enabled"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Continuous"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Discrete"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Trigger"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Capture"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Nearest"
-msgstr ""
-
-#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
-#: editor/property_editor.cpp
-msgid "Linear"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Cubic"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Clamp Loop Interp"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Wrap Loop Interp"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Insert Key"
-msgstr "Bild einfügen"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Duplicate Key(s)"
-msgstr "Node(s) duplizieren"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Delete Key(s)"
-msgstr "Node(s) löschen"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Change Animation Update Mode"
-msgstr "Typ ändern"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Change Animation Interpolation Mode"
-msgstr "Animations-Node"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Change Animation Loop Mode"
-msgstr "Animations-Node"
-
-#: editor/animation_track_editor.cpp
-msgid "Remove Anim Track"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Create NEW track for %s and insert key?"
-msgstr "Willst du eine neue Ebene inklusiv Bild in %s einfügen?"
-
-#: editor/animation_track_editor.cpp
-msgid "Create %d NEW tracks and insert keys?"
-msgstr "Erstelle %d in neuer Ebene inklusiv Bild?"
-
-#: editor/animation_track_editor.cpp editor/create_dialog.cpp
-#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#: editor/script_create_dialog.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Create"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Insert"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Create & Insert"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Insert Track & Key"
-msgstr "Anim Ebene und Bild einfügen"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Insert Key"
-msgstr "Anim Bild einfügen"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Change Animation Step"
-msgstr "Bild einfügen"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Rearrange Tracks"
-msgstr "Node erstellen"
-
-#: editor/animation_track_editor.cpp
-msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid ""
-"Audio tracks can only point to nodes of type:\n"
-"-AudioStreamPlayer\n"
-"-AudioStreamPlayer2D\n"
-"-AudioStreamPlayer3D"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "An animation player can't animate itself, only other players."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Not possible to add a new track without a root"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Add Bezier Track"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Track path is invalid, so can't add a key."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Add Transform Track Key"
-msgstr "Transformationstyp"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Add Track Key"
-msgstr "Anim Ebene und Bild einfügen"
-
-#: editor/animation_track_editor.cpp
-msgid "Track path is invalid, so can't add a method key."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Add Method Track Key"
-msgstr "Anim Ebene und Bild einfügen"
-
-#: editor/animation_track_editor.cpp
-msgid "Method not found in object: "
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Move Keys"
-msgstr "Anim Bilder bewegen"
-
-#: editor/animation_track_editor.cpp
-msgid "Clipboard is empty"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Paste Tracks"
-msgstr "Node erstellen"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Scale Keys"
-msgstr "Anim verlängern"
-
-#: editor/animation_track_editor.cpp
-msgid ""
-"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid ""
-"This animation belongs to an imported scene, so changes to imported tracks "
-"will not be saved.\n"
-"\n"
-"To enable the ability to add custom tracks, navigate to the scene's import "
-"settings and set\n"
-"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks"
-"\", then re-import.\n"
-"Alternatively, use an import preset that imports animations to separate "
-"files."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Warning: Editing imported animation"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Only show tracks from nodes selected in tree."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Group tracks by node or display them as plain list."
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Snap:"
-msgstr "Selektiere Node(s) zum Importieren aus"
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Animation step value."
-msgstr "Animations-Node"
-
-#: editor/animation_track_editor.cpp
-msgid "Seconds"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "FPS"
-msgstr ""
-
-#: editor/animation_track_editor.cpp editor/editor_properties.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Edit"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Animation properties."
-msgstr "Animations-Node"
-
-#: editor/animation_track_editor.cpp
-msgid "Copy Tracks"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Scale Selection"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Scale From Cursor"
-msgstr ""
-
-#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Duplicate Selection"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Duplicate Transposed"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Delete Selection"
-msgstr "Script hinzufügen"
-
-#: editor/animation_track_editor.cpp
-msgid "Go to Next Step"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Go to Previous Step"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Optimize Animation"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-Up Animation"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Pick the node that will be animated:"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Use Bezier Curves"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Anim. Optimizer"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Max. Linear Error:"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Max. Angular Error:"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Max Optimizable Angle:"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Optimize"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Remove invalid keys"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/animation_track_editor.cpp
-msgid "Remove unresolved and empty tracks"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-up all animations"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-Up"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Scale Ratio:"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-msgid "Select Tracks to Copy"
-msgstr ""
-
-#: editor/animation_track_editor.cpp editor/editor_log.cpp
-#: editor/editor_properties.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Copy"
-msgstr ""
-
-#: editor/animation_track_editor.cpp
-#, fuzzy
-msgid "Select All/None"
-msgstr "Node(s) löschen"
-
-#: editor/animation_track_editor_plugins.cpp
-msgid "Add Audio Track Clip"
-msgstr ""
-
-#: editor/animation_track_editor_plugins.cpp
-msgid "Change Audio Track Clip Start Offset"
-msgstr ""
-
-#: editor/animation_track_editor_plugins.cpp
-msgid "Change Audio Track Clip End Offset"
-msgstr ""
-
-#: editor/array_property_edit.cpp
-msgid "Resize Array"
-msgstr ""
-
-#: editor/array_property_edit.cpp
-msgid "Change Array Value Type"
-msgstr ""
-
-#: editor/array_property_edit.cpp
-msgid "Change Array Value"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Go to Line"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Line Number:"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
-
-#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "%d match."
-msgstr ""
-
-#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "%d matches."
-msgstr ""
-
-#: editor/code_editor.cpp editor/find_in_files.cpp
-msgid "Match Case"
-msgstr ""
-
-#: editor/code_editor.cpp editor/find_in_files.cpp
-msgid "Whole Words"
-msgstr ""
-
-#: editor/code_editor.cpp editor/rename_dialog.cpp
-msgid "Replace"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Replace All"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Selection Only"
-msgstr ""
-
-#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
-#: editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
-#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Toggle Scripts Panel"
-msgstr ""
-
-#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-msgid "Zoom In"
-msgstr ""
-
-#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-msgid "Zoom Out"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Reset Zoom"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Warnings"
-msgstr ""
-
-#: editor/code_editor.cpp
-msgid "Line and column numbers."
-msgstr ""
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Method in target node must be specified."
-msgstr "Die Methode muss im Ziel Node definiert werden!"
-
-#: editor/connections_dialog.cpp
-msgid ""
-"Target method not found. Specify a valid method or attach a script to the "
-"target node."
-msgstr ""
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Connect to Node:"
-msgstr "Verbindung zu Node:"
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Connect to Script:"
-msgstr "Verbindung zu Node:"
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "From Signal:"
-msgstr "Connections editieren"
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Scene does not contain any script."
-msgstr "Node enthält keine Geometrie (Flächen)."
-
-#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
-#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-msgid "Add"
-msgstr ""
-
-#: editor/connections_dialog.cpp editor/dependency_editor.cpp
-#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp
-msgid "Remove"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Add Extra Call Argument:"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Extra Call Arguments:"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Receiver Method:"
-msgstr "Node erstellen"
-
-#: editor/connections_dialog.cpp
-msgid "Advanced"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Deferred"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid ""
-"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Oneshot"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Disconnects the signal after its first emission."
-msgstr ""
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Cannot connect signal"
-msgstr "Connections editieren"
-
-#: editor/connections_dialog.cpp editor/dependency_editor.cpp
-#: editor/export_template_manager.cpp editor/groups_editor.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#: editor/plugins/version_control_editor_plugin.cpp editor/project_export.cpp
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Close"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Connect"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Signal:"
-msgstr "Script hinzufügen"
-
-#: editor/connections_dialog.cpp
-msgid "Connect '%s' to '%s'"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Disconnect '%s' from '%s'"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Disconnect all from signal: '%s'"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Connect..."
-msgstr ""
-
-#: editor/connections_dialog.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Disconnect"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Connect a Signal to a Method"
-msgstr "Connections editieren"
-
-#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Edit Connection:"
-msgstr "Connections editieren"
-
-#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr ""
-
-#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
-msgid "Signals"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Disconnect All"
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Edit..."
-msgstr ""
-
-#: editor/connections_dialog.cpp
-msgid "Go To Method"
-msgstr ""
-
-#: editor/create_dialog.cpp
-#, fuzzy
-msgid "Change %s Type"
-msgstr "Typ ändern"
-
-#: editor/create_dialog.cpp editor/project_settings_editor.cpp
-#, fuzzy
-msgid "Change"
-msgstr "Typ ändern"
-
-#: editor/create_dialog.cpp
-#, fuzzy
-msgid "Create New %s"
-msgstr "Node erstellen"
-
-#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/filesystem_dock.cpp
-msgid "Favorites:"
-msgstr ""
-
-#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
-msgid "Recent:"
-msgstr ""
-
-#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Search:"
-msgstr ""
-
-#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Matches:"
-msgstr ""
-
-#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
-#: editor/plugin_config_dialog.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Description:"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Search Replacement For:"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Dependencies For:"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid ""
-"Scene '%s' is currently being edited.\n"
-"Changes will only take effect when reloaded."
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid ""
-"Resource '%s' is in use.\n"
-"Changes will only take effect when reloaded."
-msgstr ""
-
-#: editor/dependency_editor.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Dependencies"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Resource"
-msgstr ""
-
-#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-msgid "Path"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Dependencies:"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Fix Broken"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Dependency Editor"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Search Replacement Resource:"
-msgstr ""
-
-#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help_search.cpp editor/editor_node.cpp
-#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
-#: editor/script_create_dialog.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-#: scene/gui/file_dialog.cpp
-msgid "Open"
-msgstr "Öffnen"
-
-#: editor/dependency_editor.cpp
-msgid "Owners Of:"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Remove selected files from the project? (Can't be restored)"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid ""
-"The files being removed are required by other resources in order for them to "
-"work.\n"
-"Remove them anyway? (no undo)"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Cannot remove:"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Error loading:"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-#, fuzzy
-msgid "Load failed due to missing dependencies:"
-msgstr "Szene '%s' hat kapute Abhängigkeiten:"
-
-#: editor/dependency_editor.cpp editor/editor_node.cpp
-msgid "Open Anyway"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Which action should be taken?"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Fix Dependencies"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Errors loading!"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Show Dependencies"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Orphan Resource Explorer"
-msgstr ""
-
-#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
-#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
-#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
-msgid "Delete"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Owns"
-msgstr ""
-
-#: editor/dependency_editor.cpp
-msgid "Resources Without Explicit Ownership:"
-msgstr ""
-
-#: editor/dictionary_property_edit.cpp
-msgid "Change Dictionary Key"
-msgstr ""
-
-#: editor/dictionary_property_edit.cpp
-#, fuzzy
-msgid "Change Dictionary Value"
-msgstr "Typ ändern"
-
-#: editor/editor_about.cpp
-msgid "Thanks from the Godot community!"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Godot Engine contributors"
-msgstr ""
-
-#: editor/editor_about.cpp
-#, fuzzy
-msgid "Project Founders"
-msgstr "Projekt exportieren"
-
-#: editor/editor_about.cpp
-msgid "Lead Developer"
-msgstr ""
-
-#: editor/editor_about.cpp
-#, fuzzy
-msgid "Project Manager "
-msgstr "Projektname:"
-
-#: editor/editor_about.cpp
-msgid "Developers"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Authors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Platinum Sponsors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Gold Sponsors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Mini Sponsors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Gold Donors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Silver Donors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Bronze Donors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Donors"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "License"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Third-party Licenses"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid ""
-"Godot Engine relies on a number of third-party free and open source "
-"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such third-party components with their "
-"respective copyright statements and license terms."
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "All Components"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Components"
-msgstr ""
-
-#: editor/editor_about.cpp
-msgid "Licenses"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in ZIP format."
-msgstr ""
-
-#: editor/editor_asset_installer.cpp
-msgid "%s (Already Exists)"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp
-msgid "Uncompressing Assets"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "The following files failed extraction from package:"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp
-#, fuzzy
-msgid "And %s more files."
-msgstr "Node erstellen"
-
-#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package installed successfully!"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Success!"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp
-msgid "Package Contents:"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp editor/editor_node.cpp
-msgid "Install"
-msgstr ""
-
-#: editor/editor_asset_installer.cpp
-msgid "Package Installer"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Speakers"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Effect"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Rename Audio Bus"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-#, fuzzy
-msgid "Change Audio Bus Volume"
-msgstr "Autoplay Umschalten"
-
-#: editor/editor_audio_buses.cpp
-#, fuzzy
-msgid "Toggle Audio Bus Solo"
-msgstr "Autoplay Umschalten"
-
-#: editor/editor_audio_buses.cpp
-msgid "Toggle Audio Bus Mute"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Toggle Audio Bus Bypass Effects"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Select Audio Bus Send"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Audio Bus Effect"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Move Bus Effect"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Delete Bus Effect"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Drag & drop to rearrange."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Solo"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Mute"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Bypass"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Bus options"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "Duplicate"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Reset Volume"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Delete Effect"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Audio"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Audio Bus"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Master bus can't be deleted!"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-#, fuzzy
-msgid "Delete Audio Bus"
-msgstr "Bild einfügen"
-
-#: editor/editor_audio_buses.cpp
-#, fuzzy
-msgid "Duplicate Audio Bus"
-msgstr "Node(s) duplizieren"
-
-#: editor/editor_audio_buses.cpp
-msgid "Reset Bus Volume"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-#, fuzzy
-msgid "Move Audio Bus"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/editor_audio_buses.cpp
-msgid "Save Audio Bus Layout As..."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Location for New Layout..."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Open Audio Bus Layout"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "There is no '%s' file."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Layout"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Invalid file, not an audio bus layout."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-#, fuzzy
-msgid "Error saving file: %s"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Bus"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Add a new Audio Bus to this layout."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
-#: editor/script_create_dialog.cpp
-msgid "Load"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Load an existing Bus Layout."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Save As"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Save this Bus Layout to a file."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp editor/import_dock.cpp
-msgid "Load Default"
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Load the default Bus Layout."
-msgstr ""
-
-#: editor/editor_audio_buses.cpp
-msgid "Create a new Bus Layout."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Invalid name."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Valid characters:"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Must not collide with an existing engine class name."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Must not collide with an existing built-in type name."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Must not collide with an existing global constant name."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Keyword cannot be used as an autoload name."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Autoload '%s' already exists!"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Rename Autoload"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Toggle AutoLoad Globals"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Move Autoload"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Remove Autoload"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Enable"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Rearrange Autoloads"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Projektname:"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Add AutoLoad"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: editor/editor_plugin_settings.cpp
-#: editor/plugins/animation_tree_editor_plugin.cpp
-#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Path:"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Node Name:"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
-#: editor/editor_profiler.cpp editor/project_manager.cpp
-#: editor/settings_config_dialog.cpp
-msgid "Name"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp
-msgid "Singleton"
-msgstr ""
-
-#: editor/editor_data.cpp
-msgid "Updating Scene"
-msgstr ""
-
-#: editor/editor_data.cpp
-msgid "Storing local changes..."
-msgstr ""
-
-#: editor/editor_data.cpp
-msgid "Updating scene..."
-msgstr ""
-
-#: editor/editor_data.cpp editor/editor_properties.cpp
-msgid "[empty]"
-msgstr ""
-
-#: editor/editor_data.cpp
-msgid "[unsaved]"
-msgstr ""
-
-#: editor/editor_dir_dialog.cpp
-msgid "Please select a base directory first."
-msgstr ""
-
-#: editor/editor_dir_dialog.cpp
-msgid "Choose a Directory"
-msgstr ""
-
-#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#: scene/gui/file_dialog.cpp
-msgid "Create Folder"
-msgstr ""
-
-#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
-#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
-#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp
-msgid "Name:"
-msgstr ""
-
-#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
-msgid "Could not create folder."
-msgstr ""
-
-#: editor/editor_dir_dialog.cpp
-msgid "Choose"
-msgstr ""
-
-#: editor/editor_export.cpp
-msgid "Storing File:"
-msgstr ""
-
-#: editor/editor_export.cpp
-msgid "No export template found at the expected path:"
-msgstr ""
-
-#: editor/editor_export.cpp
-msgid "Packing"
-msgstr ""
-
-#: editor/editor_export.cpp
-msgid ""
-"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
-"Etc' in Project Settings."
-msgstr ""
-
-#: editor/editor_export.cpp
-msgid ""
-"Target platform requires 'ETC2' texture compression for GLES3. Enable "
-"'Import Etc 2' in Project Settings."
-msgstr ""
-
-#: editor/editor_export.cpp
-msgid ""
-"Target platform requires 'ETC' texture compression for the driver fallback "
-"to GLES2.\n"
-"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
-"Enabled'."
-msgstr ""
-
-#: editor/editor_export.cpp platform/android/export/export.cpp
-#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
-#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-msgid "Custom debug template not found."
-msgstr ""
-
-#: editor/editor_export.cpp platform/android/export/export.cpp
-#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
-#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-msgid "Custom release template not found."
-msgstr ""
-
-#: editor/editor_export.cpp platform/javascript/export/export.cpp
-msgid "Template file not found:"
-msgstr ""
-
-#: editor/editor_export.cpp
-msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "3D Editor"
-msgstr "Verzeichnis öffnen"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Script Editor"
-msgstr "Verzeichnis öffnen"
-
-#: editor/editor_feature_profile.cpp
-msgid "Asset Library"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "Scene Tree Editing"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "Importierte Projekte"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Node Dock"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "Erase profile '%s'? (no undo)"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "Profile with this name already exists."
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "(Properties Disabled)"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "(Editor Disabled)"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Class Options:"
-msgstr "Script hinzufügen"
-
-#: editor/editor_feature_profile.cpp
-msgid "Enable Contextual Editor"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Enabled Properties:"
-msgstr "Node erstellen"
-
-#: editor/editor_feature_profile.cpp
-msgid "Enabled Features:"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "Enabled Classes:"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid "File '%s' format is invalid, import aborted."
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-msgid ""
-"Profile '%s' already exists. Remove it first before importing, import "
-"aborted."
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Error saving profile to path: '%s'."
-msgstr "Fehler beim Instanzieren der %s Szene"
-
-#: editor/editor_feature_profile.cpp
-msgid "Unset"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Current Profile:"
-msgstr "Node(s) löschen"
-
-#: editor/editor_feature_profile.cpp
-msgid "Make Current"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "New"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_manager.cpp
-msgid "Import"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp editor/project_export.cpp
-msgid "Export"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Available Profiles:"
-msgstr "TimeScale-Node"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Class Options"
-msgstr "Script hinzufügen"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "New profile name:"
-msgstr "Node"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Erase Profile"
-msgstr "Oberfläche %d"
-
-#: editor/editor_feature_profile.cpp
-msgid "Godot Feature Profile"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Profile(s)"
-msgstr "Importierte Projekte"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Export Profile"
-msgstr "Projekt exportieren"
-
-#: editor/editor_feature_profile.cpp
-msgid "Manage Editor Feature Profiles"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select Current Folder"
-msgstr "Node(s) löschen"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "File Exists, Overwrite?"
-msgstr "Datei existiert, Überschreiben?"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select This Folder"
-msgstr "Node(s) löschen"
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Copy Path"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open in File Manager"
-msgstr "Datei öffnen"
-
-#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
-msgid "Show in File Manager"
-msgstr "Datei öffnen"
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "New Folder..."
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Refresh"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "All Recognized"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "All Files (*)"
-msgstr "Alle Dateien (*)"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open a File"
-msgstr "Datei öffnen"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open File(s)"
-msgstr "Datei(en) öffnen"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open a Directory"
-msgstr "Verzeichnis öffnen"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open a File or Directory"
-msgstr "Datei oder Verzeichnis öffnen"
-
-#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/editor_properties.cpp editor/inspector_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
-msgid "Save"
-msgstr "Speichern"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Save a File"
-msgstr "Datei speichern"
-
-#: editor/editor_file_dialog.cpp
-msgid "Go Back"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Go Forward"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Go Up"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Toggle Hidden Files"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Toggle Favorite"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Toggle Mode"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Focus Path"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Move Favorite Up"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "Move Favorite Down"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-#, fuzzy
-msgid "Go to previous folder."
-msgstr "Node erstellen"
-
-#: editor/editor_file_dialog.cpp
-#, fuzzy
-msgid "Go to next folder."
-msgstr "Node erstellen"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Go to parent folder."
-msgstr "Node erstellen"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Refresh files."
-msgstr ""
-
-#: editor/editor_file_dialog.cpp
-msgid "(Un)favorite current folder."
-msgstr ""
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Toggle the visibility of hidden files."
-msgstr ""
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "View items as a grid of thumbnails."
-msgstr ""
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "View items as a list."
-msgstr ""
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Directories & Files:"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
-#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Preview:"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "File:"
-msgstr ""
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Must use a valid extension."
-msgstr ""
-
-#: editor/editor_file_system.cpp
-msgid "ScanSources"
-msgstr ""
-
-#: editor/editor_file_system.cpp
-msgid ""
-"There are multiple importers for different types pointing to file %s, import "
-"aborted"
-msgstr ""
-
-#: editor/editor_file_system.cpp
-msgid "(Re)Importing Assets"
-msgstr ""
-
-#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
-msgid "Top"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class:"
-msgstr ""
-
-#: editor/editor_help.cpp editor/scene_tree_editor.cpp
-#: editor/script_create_dialog.cpp
-msgid "Inherits:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Inherited by:"
-msgstr ""
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Description"
-msgstr "Script hinzufügen"
-
-#: editor/editor_help.cpp
-msgid "Online Tutorials"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "override:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "default:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Theme Properties"
-msgstr "Node erstellen"
-
-#: editor/editor_help.cpp
-msgid "Enumerations"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Constants"
-msgstr ""
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Property Descriptions"
-msgstr "Script hinzufügen"
-
-#: editor/editor_help.cpp
-msgid "(value)"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid ""
-"There is currently no description for this property. Please help us by "
-"[color=$color][url=$url]contributing one[/url][/color]!"
-msgstr ""
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Method Descriptions"
-msgstr "Script hinzufügen"
-
-#: editor/editor_help.cpp
-msgid ""
-"There is currently no description for this method. Please help us by [color="
-"$color][url=$url]contributing one[/url][/color]!"
-msgstr ""
-
-#: editor/editor_help_search.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Case Sensitive"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Show Hierarchy"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Display All"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Classes Only"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Methods Only"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Signals Only"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Constants Only"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Properties Only"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Theme Properties Only"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Member Type"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Class"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Method"
-msgstr ""
-
-#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Signal"
-msgstr "Script hinzufügen"
-
-#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
-msgid "Constant"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-msgid "Property"
-msgstr ""
-
-#: editor/editor_help_search.cpp
-#, fuzzy
-msgid "Theme Property"
-msgstr "Node erstellen"
-
-#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
-msgid "Property:"
-msgstr ""
-
-#: editor/editor_inspector.cpp
-msgid "Set"
-msgstr ""
-
-#: editor/editor_inspector.cpp
-msgid "Set Multiple:"
-msgstr ""
-
-#: editor/editor_log.cpp
-msgid "Output:"
-msgstr ""
-
-#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Copy Selection"
-msgstr "Script hinzufügen"
-
-#: editor/editor_log.cpp editor/editor_network_profiler.cpp
-#: editor/editor_profiler.cpp editor/editor_properties.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/property_editor.cpp editor/scene_tree_dock.cpp
-#: editor/script_editor_debugger.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
-#: scene/gui/text_edit.cpp
-msgid "Clear"
-msgstr ""
-
-#: editor/editor_log.cpp
-#, fuzzy
-msgid "Clear Output"
-msgstr "Script hinzufügen"
-
-#: editor/editor_network_profiler.cpp editor/editor_node.cpp
-#: editor/editor_profiler.cpp
-msgid "Stop"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
-#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
-msgid "Start"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp
-msgid "%s/s"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp
-msgid "Down"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp
-msgid "Up"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_network_profiler.cpp
-msgid "Incoming RPC"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp
-msgid "Incoming RSET"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp
-msgid "Outgoing RPC"
-msgstr ""
-
-#: editor/editor_network_profiler.cpp
-msgid "Outgoing RSET"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_manager.cpp
-msgid "New Window"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Imported resources can't be saved."
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#: scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Okay"
-
-#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Error saving resource!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource can't be saved because it does not belong to the edited scene. "
-"Make it unique first."
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Save Resource As..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Can't open file for writing:"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Requested file format unknown:"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Error while saving."
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Error while parsing '%s'."
-msgstr "Fehler beim Instanzieren der %s Szene"
-
-#: editor/editor_node.cpp
-msgid "Unexpected end of file '%s'."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Missing '%s' or its dependencies."
-msgstr "Szene '%s' hat kapute Abhängigkeiten:"
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Error while loading '%s'."
-msgstr "Fehler beim Instanzieren der %s Szene"
-
-#: editor/editor_node.cpp
-msgid "Saving Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Analyzing"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Creating Thumbnail"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "This operation can't be done without a tree root."
-msgstr "Ohne eine Szene kann das nicht funktionieren."
-
-#: editor/editor_node.cpp
-msgid ""
-"This scene can't be saved because there is a cyclic instancing inclusion.\n"
-"Please resolve it and then attempt to save again."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
-"be satisfied."
-msgstr ""
-
-#: editor/editor_node.cpp editor/scene_tree_dock.cpp
-msgid "Can't overwrite scene that is still open!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Can't load MeshLibrary for merging!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Error saving MeshLibrary!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Can't load TileSet for merging!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Error saving TileSet!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Error trying to save layout!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Default editor layout overridden."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Layout name not found!"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Restored default layout to base settings."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource belongs to a scene that was imported, so it's not editable.\n"
-"Please read the documentation relevant to importing scenes to better "
-"understand this workflow."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource belongs to a scene that was instanced or inherited.\n"
-"Changes to it won't be kept when saving the current scene."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource was imported, so it's not editable. Change its settings in the "
-"import panel and then re-import."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"This scene was imported, so changes to it won't be kept.\n"
-"Instancing it or inheriting will allow making changes to it.\n"
-"Please read the documentation relevant to importing scenes to better "
-"understand this workflow."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"This is a remote object, so changes to it won't be kept.\n"
-"Please read the documentation relevant to debugging to better understand "
-"this workflow."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "There is no defined scene to run."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Could not start subprocess!"
-msgstr ""
-
-#: editor/editor_node.cpp editor/filesystem_dock.cpp
-msgid "Open Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open Base Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Quick Open..."
-msgstr "Öffnen"
-
-#: editor/editor_node.cpp
-msgid "Quick Open Scene..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Quick Open Script..."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Save & Close"
-msgstr "Datei speichern"
-
-#: editor/editor_node.cpp
-msgid "Save changes to '%s' before closing?"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Saved %s modified resource(s)."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "A root node is required to save the scene."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Save Scene As..."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "No"
-msgstr "Node"
-
-#: editor/editor_node.cpp
-msgid "Yes"
-msgstr "Ja"
-
-#: editor/editor_node.cpp
-msgid "This scene has never been saved. Save before running?"
-msgstr ""
-
-#: editor/editor_node.cpp editor/scene_tree_dock.cpp
-msgid "This operation can't be done without a scene."
-msgstr "Ohne eine Szene kann das nicht funktionieren."
-
-#: editor/editor_node.cpp
-msgid "Export Mesh Library"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "This operation can't be done without a root node."
-msgstr "Ohne eine Szene kann das nicht funktionieren."
-
-#: editor/editor_node.cpp
-msgid "Export Tile Set"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "This operation can't be done without a selected node."
-msgstr "Ohne eine Szene kann das nicht funktionieren."
-
-#: editor/editor_node.cpp
-msgid "Current scene not saved. Open anyway?"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Can't reload a scene that was never saved."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Quick Run Scene..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Quit"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Exit the editor?"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open Project Manager?"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Save & Quit"
-msgstr "Datei speichern"
-
-#: editor/editor_node.cpp
-msgid "Save changes to the following scene(s) before quitting?"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"This option is deprecated. Situations where refresh must be forced are now "
-"considered a bug. Please report."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Pick a Main Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Reopen Closed Scene"
-msgstr "Datei(en) öffnen"
-
-#: editor/editor_node.cpp
-msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Unable to load addon script from path: '%s'."
-msgstr "Fehler beim Instanzieren der %s Szene"
-
-#: editor/editor_node.cpp
-msgid ""
-"Unable to load addon script from path: '%s' There seems to be an error in "
-"the code, please check the syntax."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"Scene '%s' was automatically imported, so it can't be modified.\n"
-"To make changes to it, a new inherited scene can be created."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"Error loading scene, it must be inside the project path. Use 'Import' to "
-"open the scene, then save it inside the project path."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Scene '%s' has broken dependencies:"
-msgstr "Szene '%s' hat kapute Abhängigkeiten:"
-
-#: editor/editor_node.cpp
-msgid "Clear Recent Scenes"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"No main scene has ever been defined, select one?\n"
-"You can change it later in \"Project Settings\" under the 'application' "
-"category."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"Selected scene '%s' does not exist, select a valid one?\n"
-"You can change it later in \"Project Settings\" under the 'application' "
-"category."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"Selected scene '%s' is not a scene file, select a valid one?\n"
-"You can change it later in \"Project Settings\" under the 'application' "
-"category."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Save Layout"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Delete Layout"
-msgstr ""
-
-#: editor/editor_node.cpp editor/import_dock.cpp
-#: editor/script_create_dialog.cpp
-msgid "Default"
-msgstr ""
-
-#: editor/editor_node.cpp editor/editor_properties.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
-msgid "Show in FileSystem"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Play This Scene"
-msgstr "Szene starten"
-
-#: editor/editor_node.cpp
-msgid "Close Tab"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Undo Close Tab"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Close Other Tabs"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Close Tabs to the Right"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Close All Tabs"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Switch Scene Tab"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "%d more files or folders"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "%d more folders"
-msgstr "Node erstellen"
-
-#: editor/editor_node.cpp
-msgid "%d more files"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Dock Position"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Distraction Free Mode"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Toggle distraction-free mode."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Add a new scene."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Go to previously opened scene."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Copy Text"
-msgstr "Script hinzufügen"
-
-#: editor/editor_node.cpp
-msgid "Next tab"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Previous tab"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Filter Files..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Operations with scene files."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "New Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "New Inherited Scene..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open Scene..."
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Save Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Save All Scenes"
-msgstr "Neue Szene speichern als..."
-
-#: editor/editor_node.cpp
-msgid "Convert To..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "MeshLibrary..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "TileSet..."
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Undo"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Redo"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Miscellaneous project or scene-wide tools."
-msgstr "Verschiedene Projekte oder Szenenweite Werkzeuge."
-
-#: editor/editor_node.cpp editor/project_manager.cpp
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Project"
-msgstr "Projektname:"
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Project Settings..."
-msgstr "Projekteinstellungen"
-
-#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-msgid "Version Control"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-msgid "Set Up Version Control"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Shut Down Version Control"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Export..."
-msgstr "Projekt exportieren"
-
-#: editor/editor_node.cpp
-msgid "Install Android Build Template..."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Open Project Data Folder"
-msgstr "Projekt exportieren"
-
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Orphan Resource Explorer..."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Quit to Project List"
-msgstr "Zurück zur Projektliste"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/project_export.cpp
-msgid "Debug"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Deploy with Remote Debug"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
-"The filesystem will be provided from the project by the editor over the "
-"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Visible Collision Shapes"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
-msgstr ""
-"Collision-Formen und Raycast Nodes (für 2D und 3D) werden im laufenden Spiel "
-"angezeigt, falls diese Option aktiviert ist."
-
-#: editor/editor_node.cpp
-msgid "Visible Navigation"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
-msgstr ""
-
-#: editor/editor_node.cpp editor/script_create_dialog.cpp
-msgid "Editor"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Editor Settings..."
-msgstr "Connections editieren"
-
-#: editor/editor_node.cpp
-msgid "Editor Layout"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Take Screenshot"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Toggle Fullscreen"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Toggle System Console"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open Editor Data/Settings Folder"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open Editor Data Folder"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open Editor Settings Folder"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Manage Editor Features..."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Manage Export Templates..."
-msgstr "Ungültige Bilder löschen"
-
-#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
-msgid "Help"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
-msgid "Search"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Online Docs"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Q&A"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
-msgid "Community"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "About"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Play the project."
-msgstr "Projekt starten."
-
-#: editor/editor_node.cpp
-msgid "Play"
-msgstr "Abspielen"
-
-#: editor/editor_node.cpp
-msgid "Pause the scene execution for debugging."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Pause Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Stop the scene."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Play the edited scene."
-msgstr "Spiele die editierte Szene."
-
-#: editor/editor_node.cpp
-msgid "Play Scene"
-msgstr "Szene starten"
-
-#: editor/editor_node.cpp
-msgid "Play custom scene"
-msgstr "Spiele angepasste Szene"
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Play Custom Scene"
-msgstr "Spiele angepasste Szene"
-
-#: editor/editor_node.cpp
-msgid "Changing the video driver requires restarting the editor."
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_settings_editor.cpp
-#: editor/settings_config_dialog.cpp
-#, fuzzy
-msgid "Save & Restart"
-msgstr "Datei speichern"
-
-#: editor/editor_node.cpp
-msgid "Spins when the editor window redraws."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Update Continuously"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Update When Changed"
-msgstr "Typ ändern"
-
-#: editor/editor_node.cpp
-msgid "Hide Update Spinner"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "FileSystem"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Expand Bottom Panel"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Output"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Don't Save"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Android build template is missing, please install relevant templates."
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Manage Templates"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/editor_node.cpp
-msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid ""
-"The Android build template is already installed in this project and it won't "
-"be overwritten.\n"
-"Remove the \"res://android/build\" directory manually before attempting this "
-"operation again."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Import Templates From ZIP File"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Template Package"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/editor_node.cpp
-msgid "Export Library"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Merge With Existing"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open & Run a Script"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "New Inherited"
-msgstr "Script hinzufügen"
-
-#: editor/editor_node.cpp
-msgid "Load Errors"
-msgstr ""
-
-#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
-msgid "Select"
-msgstr ""
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Open 2D Editor"
-msgstr "Verzeichnis öffnen"
-
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Open 3D Editor"
-msgstr "Verzeichnis öffnen"
-
-#: editor/editor_node.cpp
-msgid "Open Script Editor"
-msgstr ""
-
-#: editor/editor_node.cpp editor/project_manager.cpp
-msgid "Open Asset Library"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open the next Editor"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Open the previous Editor"
-msgstr ""
-
-#: editor/editor_node.h
-msgid "Warning!"
-msgstr ""
-
-#: editor/editor_path.cpp
-#, fuzzy
-msgid "No sub-resources found."
-msgstr "Keine Oberflächen Quelle spezifiziert."
-
-#: editor/editor_plugin.cpp
-msgid "Creating Mesh Previews"
-msgstr ""
-
-#: editor/editor_plugin.cpp
-msgid "Thumbnail..."
-msgstr ""
-
-#: editor/editor_plugin_settings.cpp
-#, fuzzy
-msgid "Main Script:"
-msgstr "Script hinzufügen"
-
-#: editor/editor_plugin_settings.cpp
-#, fuzzy
-msgid "Edit Plugin"
-msgstr "Script hinzufügen"
-
-#: editor/editor_plugin_settings.cpp
-msgid "Installed Plugins:"
-msgstr ""
-
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-msgid "Update"
-msgstr ""
-
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Version:"
-msgstr ""
-
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-msgid "Author:"
-msgstr ""
-
-#: editor/editor_plugin_settings.cpp
-msgid "Status:"
-msgstr ""
-
-#: editor/editor_plugin_settings.cpp
-msgid "Edit:"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Measure:"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Frame Time (sec)"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Average Time (sec)"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Frame %"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Physics Frame %"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Inclusive"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Self"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Frame #:"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Time"
-msgstr ""
-
-#: editor/editor_profiler.cpp
-msgid "Calls"
-msgstr ""
-
-#: editor/editor_properties.cpp
-#, fuzzy
-msgid "Edit Text:"
-msgstr "Node Filter editieren"
-
-#: editor/editor_properties.cpp editor/script_create_dialog.cpp
-msgid "On"
-msgstr ""
-
-#: editor/editor_properties.cpp
-msgid "Layer"
-msgstr ""
-
-#: editor/editor_properties.cpp
-msgid "Bit %d, value %d"
-msgstr ""
-
-#: editor/editor_properties.cpp
-msgid "[Empty]"
-msgstr ""
-
-#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign..."
-msgstr ""
-
-#: editor/editor_properties.cpp
-msgid "Invalid RID"
-msgstr ""
-
-#: editor/editor_properties.cpp
-msgid ""
-"The selected resource (%s) does not match any type expected for this "
-"property (%s)."
-msgstr ""
-
-#: editor/editor_properties.cpp
-msgid ""
-"Can't create a ViewportTexture on resources saved as a file.\n"
-"Resource needs to belong to a scene."
-msgstr ""
-
-#: editor/editor_properties.cpp
-msgid ""
-"Can't create a ViewportTexture on this resource because it's not set as "
-"local to scene.\n"
-"Please switch on the 'local to scene' property on it (and all resources "
-"containing it up to a node)."
-msgstr ""
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Pick a Viewport"
-msgstr ""
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
-msgid "New Script"
-msgstr "Script hinzufügen"
-
-#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Extend Script"
-msgstr "Script hinzufügen"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "New %s"
-msgstr ""
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Make Unique"
-msgstr ""
-
-#: editor/editor_properties.cpp
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Paste"
-msgstr ""
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
-msgid "Convert To %s"
-msgstr "Verbindung zu Node:"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
-msgid "Selected node is not a Viewport!"
-msgstr "Selektiere Node(s) zum Importieren aus"
-
-#: editor/editor_properties_array_dict.cpp
-msgid "Size: "
-msgstr ""
-
-#: editor/editor_properties_array_dict.cpp
-msgid "Page: "
-msgstr ""
-
-#: editor/editor_properties_array_dict.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Remove Item"
-msgstr ""
-
-#: editor/editor_properties_array_dict.cpp
-msgid "New Key:"
-msgstr ""
-
-#: editor/editor_properties_array_dict.cpp
-msgid "New Value:"
-msgstr ""
-
-#: editor/editor_properties_array_dict.cpp
-msgid "Add Key/Value Pair"
-msgstr ""
-
-#: editor/editor_run_native.cpp
-msgid ""
-"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
-msgstr ""
-
-#: editor/editor_run_script.cpp
-msgid "Write your logic in the _run() method."
-msgstr ""
-
-#: editor/editor_run_script.cpp
-msgid "There is an edited scene already."
-msgstr ""
-
-#: editor/editor_run_script.cpp
-msgid "Couldn't instance script:"
-msgstr ""
-
-#: editor/editor_run_script.cpp
-msgid "Did you forget the 'tool' keyword?"
-msgstr "Sieht so aus als hättest du das Schlüsselwort \"tool\" vergessen?"
-
-#: editor/editor_run_script.cpp
-msgid "Couldn't run script:"
-msgstr ""
-
-#: editor/editor_run_script.cpp
-msgid "Did you forget the '_run' method?"
-msgstr ""
-
-#: editor/editor_sub_scene.cpp
-msgid "Select Node(s) to Import"
-msgstr "Selektiere Node(s) zum Importieren aus"
-
-#: editor/editor_sub_scene.cpp editor/project_manager.cpp
-msgid "Browse"
-msgstr ""
-
-#: editor/editor_sub_scene.cpp
-msgid "Scene Path:"
-msgstr ""
-
-#: editor/editor_sub_scene.cpp
-msgid "Import From Node:"
-msgstr "Importiere von folgendem Node:"
-
-#: editor/export_template_manager.cpp
-msgid "Redownload"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Uninstall"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "(Installed)"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Download"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Official export templates aren't available for development builds."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "(Missing)"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "(Current)"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Retrieving mirrors, please wait..."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Remove template version '%s'?"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Can't open export templates zip."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Invalid version.txt format inside templates: %s."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "No version.txt found inside templates."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Error creating path for templates:"
-msgstr "Fehler beim Schreiben des Projekts PCK!"
-
-#: editor/export_template_manager.cpp
-msgid "Extracting Export Templates"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Importing:"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Error getting the list of mirrors."
-msgstr "Fehler beim Schreiben des Projekts PCK!"
-
-#: editor/export_template_manager.cpp
-msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid ""
-"No download links found for this version. Direct download is only available "
-"for official releases."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't connect."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "No response."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Request Failed."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Redirect Loop."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Failed:"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Download Complete."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Cannot remove temporary file:"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid ""
-"Templates installation failed.\n"
-"The problematic templates archives can be found at '%s'."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Error requesting URL:"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Connecting to Mirror..."
-msgstr "Connections editieren"
-
-#: editor/export_template_manager.cpp
-msgid "Disconnected"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Resolving"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Can't Resolve"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
-msgid "Connecting..."
-msgstr "Connections editieren"
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Can't Connect"
-msgstr "Neues Projekt erstellen"
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Connected"
-msgstr "Verbindung zu Node:"
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Requesting..."
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Downloading"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Connection Error"
-msgstr "Connections editieren"
-
-#: editor/export_template_manager.cpp
-msgid "SSL Handshake Error"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Uncompressing Android Build Sources"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Current Version:"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Installed Versions:"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-msgid "Install From File"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Remove Template"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Select Template File"
-msgstr "Node(s) löschen"
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Godot Export Templates"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/export_template_manager.cpp
-msgid "Export Template Manager"
-msgstr ""
-
-#: editor/export_template_manager.cpp
-#, fuzzy
-msgid "Download Templates"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/export_template_manager.cpp
-msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Favorites"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Status: Import of file failed. Please fix file and reimport manually."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Cannot move/rename resources root."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Cannot move a folder into itself."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Error moving:"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Error duplicating:"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Unable to update dependencies:"
-msgstr "Szene '%s' hat kapute Abhängigkeiten:"
-
-#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Provided name contains invalid characters."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Renaming file:"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/filesystem_dock.cpp
-msgid "Renaming folder:"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Duplicating file:"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Duplicating folder:"
-msgstr "Node(s) duplizieren"
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "New Inherited Scene"
-msgstr "Script hinzufügen"
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Set As Main Scene"
-msgstr "Neue Szene speichern als..."
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open Scenes"
-msgstr "Datei(en) öffnen"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Add to Favorites"
-msgstr "Node"
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Remove from Favorites"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/filesystem_dock.cpp
-msgid "Edit Dependencies..."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "View Owners..."
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Duplicate..."
-msgstr "Node(s) duplizieren"
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "New Scene..."
-msgstr "Neue Szene speichern als..."
-
-#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New Script..."
-msgstr "Script hinzufügen"
-
-#: editor/filesystem_dock.cpp
-msgid "New Resource..."
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
-#: editor/script_editor_debugger.cpp
-msgid "Expand All"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
-#: editor/script_editor_debugger.cpp
-msgid "Collapse All"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/project_manager.cpp editor/rename_dialog.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Rename"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Previous Folder/File"
-msgstr "Node(s) löschen"
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Next Folder/File"
-msgstr "Node erstellen"
-
-#: editor/filesystem_dock.cpp
-msgid "Re-Scan Filesystem"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Toggle Split Mode"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid ""
-"Scanning Files,\n"
-"Please Wait..."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Move"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "There is already file or folder with the same name in this location."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Overwrite"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Create Scene"
-msgstr "Node erstellen"
-
-#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Create Script"
-msgstr ""
-
-#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Find in Files"
-msgstr "Node Filter editieren"
-
-#: editor/find_in_files.cpp
-msgid "Find:"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Folder:"
-msgstr ""
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filters:"
-msgstr "Node erstellen"
-
-#: editor/find_in_files.cpp
-msgid ""
-"Include the files with the following extensions. Add or remove them in "
-"ProjectSettings."
-msgstr ""
-
-#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-msgid "Find..."
-msgstr ""
-
-#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
-msgid "Replace..."
-msgstr ""
-
-#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
-msgid "Cancel"
-msgstr "Abbrechen"
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Replace: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Replace all (no undo)"
-msgstr ""
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Searching..."
-msgstr "Connections editieren"
-
-#: editor/find_in_files.cpp
-msgid "Search complete"
-msgstr ""
-
-#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr ""
-
-#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr ""
-
-#: editor/groups_editor.cpp
-msgid "Group name already exists."
-msgstr ""
-
-#: editor/groups_editor.cpp
-#, fuzzy
-msgid "Invalid group name."
-msgstr "Projektname:"
-
-#: editor/groups_editor.cpp
-#, fuzzy
-msgid "Rename Group"
-msgstr "Neues Projekt erstellen"
-
-#: editor/groups_editor.cpp
-#, fuzzy
-msgid "Delete Group"
-msgstr "Node(s) löschen"
-
-#: editor/groups_editor.cpp editor/node_dock.cpp
-msgid "Groups"
-msgstr ""
-
-#: editor/groups_editor.cpp
-msgid "Nodes Not in Group"
-msgstr ""
-
-#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
-#: editor/scene_tree_editor.cpp
-#, fuzzy
-msgid "Filter nodes"
-msgstr "Node erstellen"
-
-#: editor/groups_editor.cpp
-msgid "Nodes in Group"
-msgstr ""
-
-#: editor/groups_editor.cpp
-msgid "Empty groups will be automatically removed."
-msgstr ""
-
-#: editor/groups_editor.cpp
-#, fuzzy
-msgid "Group Editor"
-msgstr "Verzeichnis öffnen"
-
-#: editor/groups_editor.cpp
-msgid "Manage Groups"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import as Single Scene"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Animations"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Materials"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects+Materials"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects+Animations"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Materials+Animations"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects+Materials+Animations"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import as Multiple Scenes"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import as Multiple Scenes+Materials"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Import Scene"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Importing Scene..."
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Generating Lightmaps"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Generating for Mesh: "
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Running Custom Script..."
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Couldn't load post-import script:"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Invalid/broken script for post-import (check console):"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Error running post-import script:"
-msgstr ""
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Saving..."
-msgstr ""
-
-#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
-
-#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
-msgstr ""
-
-#: editor/import_dock.cpp
-#, fuzzy
-msgid " Files"
-msgstr "Datei(en) öffnen"
-
-#: editor/import_dock.cpp
-msgid "Import As:"
-msgstr ""
-
-#: editor/import_dock.cpp
-msgid "Preset"
-msgstr ""
-
-#: editor/import_dock.cpp
-msgid "Reimport"
-msgstr ""
-
-#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr ""
-
-#: editor/import_dock.cpp
-msgid "Changing the type of an imported file requires editor restart."
-msgstr ""
-
-#: editor/import_dock.cpp
-msgid ""
-"WARNING: Assets exist that use this resource, they may stop loading properly."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Failed to load resource."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Expand All Properties"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-#, fuzzy
-msgid "Collapse All Properties"
-msgstr "Node erstellen"
-
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save As..."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Copy Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Edit Resource Clipboard"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Copy Resource"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Make Built-In"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Make Sub-Resources Unique"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Open in Help"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Create a new resource in memory and edit it."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Load an existing resource from disk and edit it."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Save the currently edited resource."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Go to the previous edited object in history."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Go to the next edited object in history."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "History of recently edited objects."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Object properties."
-msgstr ""
-
-#: editor/inspector_dock.cpp
-#, fuzzy
-msgid "Filter properties"
-msgstr "Node erstellen"
-
-#: editor/inspector_dock.cpp
-msgid "Changes may be lost!"
-msgstr ""
-
-#: editor/multi_node_edit.cpp
-#, fuzzy
-msgid "MultiNode Set"
-msgstr "MultiNode Set"
-
-#: editor/node_dock.cpp
-#, fuzzy
-msgid "Select a single node to edit its signals and groups."
-msgstr "Selektiere ein Node um deren Signale und Gruppen zu ändern."
-
-#: editor/plugin_config_dialog.cpp
-msgid "Edit a Plugin"
-msgstr ""
-
-#: editor/plugin_config_dialog.cpp
-#, fuzzy
-msgid "Create a Plugin"
-msgstr "Node erstellen"
-
-#: editor/plugin_config_dialog.cpp
-msgid "Plugin Name:"
-msgstr ""
-
-#: editor/plugin_config_dialog.cpp
-msgid "Subfolder:"
-msgstr ""
-
-#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
-msgid "Language:"
-msgstr ""
-
-#: editor/plugin_config_dialog.cpp
-#, fuzzy
-msgid "Script Name:"
-msgstr "Projektname:"
-
-#: editor/plugin_config_dialog.cpp
-msgid "Activate now?"
-msgstr ""
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Node erstellen"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Bild einfügen"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid ""
-"Edit points.\n"
-"LMB: Move Point\n"
-"RMB: Erase Point"
-msgstr ""
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Oberfläche %d"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
-msgid "Edit Polygon"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
-msgid "Insert Point"
-msgstr "Bild einfügen"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Edit Polygon (Remove Point)"
-msgstr ""
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
-msgid "Remove Polygon And Point"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Animation"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load..."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Move Node Point"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Change BlendSpace1D Limits"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Change BlendSpace1D Labels"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Add Node Point"
-msgstr "Node"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Add Animation Point"
-msgstr "Animations-Node"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Remove BlendSpace1D Point"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Move BlendSpace1D Node Point"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid ""
-"AnimationTree is inactive.\n"
-"Activate to enable playback, check node warnings if activation fails."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Set the blending position within the space"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
-msgid "Enable snap and show grid."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Point"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
-msgid "Open Editor"
-msgstr "Verzeichnis öffnen"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Open Animation Node"
-msgstr "Animations-Node"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Triangle already exists."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Add Triangle"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Change BlendSpace2D Limits"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Change BlendSpace2D Labels"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Remove BlendSpace2D Point"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Remove BlendSpace2D Triangle"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "No triangles exist, so no blending can take place."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Toggle Auto Triangles"
-msgstr "Autoplay Umschalten"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Create triangles by connecting points."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Erase points and triangles."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
-msgid "Parameter Changed"
-msgstr "Typ ändern"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Filters"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Output node can't be added to the blend tree."
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node to BlendTree"
-msgstr "Node von Szene"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Node Moved"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Nodes Connected"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Nodes Disconnected"
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
-msgid "Set Animation"
-msgstr "Bild einfügen"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Delete Node"
-msgstr "Node(s) löschen"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Delete Node(s)"
-msgstr "Node(s) löschen"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Toggle Filter On/Off"
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
-msgid "Change Filter"
-msgstr "Typ ändern"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "No animation player set, so unable to retrieve track names."
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/root_motion_editor_plugin.cpp
-msgid ""
-"Animation player has no valid root node path, so unable to retrieve track "
-"names."
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Anim Clips"
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Audio Clips"
-msgstr ""
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
-msgid "Functions"
-msgstr "Node erstellen"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Node Renamed"
-msgstr "Node"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node..."
-msgstr "Node"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Filtered Tracks:"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
-msgid "Enable Filtering"
-msgstr "Typ ändern"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Toggle Autoplay"
-msgstr "Autoplay Umschalten"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "New Animation Name:"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "New Anim"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Change Animation Name:"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Delete Animation?"
-msgstr "Bild einfügen"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Remove Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid animation name!"
-msgstr "Bild einfügen"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation name already exists!"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Rename Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Blend Next Changed"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Change Blend Time"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Load Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Duplicate Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "No animation to copy!"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "No animation resource on clipboard!"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Pasted Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Paste Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "No animation to edit!"
-msgstr "Animations-Node"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Play selected animation backwards from current pos. (A)"
-msgstr "Spiele ausgewählte Animation rückwärts von aktueller Position. (A)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "Spiele ausgewählte Animation rückwärts vom Ende. (Shift+A)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Stop animation playback. (S)"
-msgstr "Stoppe Animations-Wiedergabe. (S)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Play selected animation from start. (Shift+D)"
-msgstr "Spiele ausgewählte Animation vom Start. (Shift+D)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Play selected animation from current pos. (D)"
-msgstr "Ausgewählte Animation von der aktueller Position aus abspielen. (D)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation position (in seconds)."
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Scale animation playback globally for the node."
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation Tools"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Transitions..."
-msgstr "Connections editieren"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Open in Inspector"
-msgstr "Verzeichnis öffnen"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Display list of animations in player."
-msgstr "Liste der Animationen anzeigen."
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Autoplay on Load"
-msgstr "Beim Laden automatisch abpielen"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Enable Onion Skinning"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Onion Skinning Options"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Directions"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Past"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Future"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Depth"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "1 step"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "2 steps"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "3 steps"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Differences Only"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Force White Modulate"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Include Gizmos (3D)"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Pin AnimationPlayer"
-msgstr "Animations-Node"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Create New Animation"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation Name:"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
-msgid "Error!"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Blend Times:"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Next (Auto Queue):"
-msgstr ""
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Cross-Animation Blend Times"
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Move Node"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Transition exists!"
-msgstr "Transition-Node"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Add Transition"
-msgstr "Transition-Node"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Node"
-msgstr "Node"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "End"
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Immediate"
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Sync"
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "At End"
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Travel"
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "No playback resource set at path: %s."
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Node Removed"
-msgstr "Node"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Transition Removed"
-msgstr "Transition-Node"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Set Start Node (Autoplay)"
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid ""
-"Select and move nodes.\n"
-"RMB to add new nodes.\n"
-"Shift+LMB to create connections."
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Create new nodes."
-msgstr "Node erstellen"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Connect nodes."
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition."
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Toggle autoplay this animation on start, restart or seek to zero."
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Transition: "
-msgstr "Transition-Node"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Play Mode:"
-msgstr "Node erstellen"
-
-#: editor/plugins/animation_tree_editor_plugin.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
-msgid "AnimationTree"
-msgstr "Animations-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "New name:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Scale:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Fade In (s):"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Fade Out (s):"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Mix"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Auto Restart:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Restart (s):"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Random Restart (s):"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Start!"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Amount:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend 0:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend 1:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "X-Fade Time (s):"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Current:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Input"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Clear Auto-Advance"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Set Auto-Advance"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Delete Input"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Animation tree is valid."
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Animation tree is invalid."
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Animation Node"
-msgstr "Animations-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "OneShot Node"
-msgstr "OneShot-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Mix Node"
-msgstr "Mix-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend2 Node"
-msgstr "Blend2-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend3 Node"
-msgstr "Blend3-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend4 Node"
-msgstr "Blend4-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "TimeScale Node"
-msgstr "TimeScale-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "TimeSeek Node"
-msgstr "TimeSeek-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Transition Node"
-msgstr "Transition-Node"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Import Animations..."
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Edit Node Filters"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Filters..."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Contents:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
-msgid "View Files"
-msgstr "Datei(en) öffnen"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Connection error, please try again."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
-msgid "Can't connect to host:"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "No response from host:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed, return code:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Cannot save response to:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Write error."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed, too many redirects"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Redirect loop."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed, timeout"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Timeout."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Bad download hash, assuming file has been tampered with."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Expected:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Got:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Failed sha256 hash check"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Asset Download Error:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Downloading (%s / %s)..."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Downloading..."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Resolving..."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
-msgid "Error making request"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Idle"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Install..."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Retry"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Download Error"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Download for this asset is already in progress!"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Recently Updated"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Least Recently Updated"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Name (A-Z)"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Name (Z-A)"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "License (A-Z)"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "License (Z-A)"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "First"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Previous"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Next"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Last"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "All"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "No results for \"%s\"."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
-msgid "Import..."
-msgstr "Importierte Projekte"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Plugins..."
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
-msgid "Sort:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Category:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Site:"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Official"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Testing"
-msgstr ""
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
-msgid "Loading..."
-msgstr "Connections editieren"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Assets ZIP File"
-msgstr ""
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid ""
-"Can't determine a save path for lightmap images.\n"
-"Save your scene (for images to be saved in the same dir), or pick a save "
-"path from the BakedLightmap properties."
-msgstr ""
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid ""
-"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
-"Light' flag is on."
-msgstr ""
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid "Failed creating lightmap images, make sure path is writable."
-msgstr ""
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid "Bake Lightmaps"
-msgstr ""
-
-#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
-msgid "Preview"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Configure Snap"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Grid Offset:"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Grid Step:"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Primary Line Every:"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "steps"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotation Offset:"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotation Step:"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Scale Step:"
-msgstr "TimeScale-Node"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Move Vertical Guide"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Create Vertical Guide"
-msgstr "Neues Projekt erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Vertical Guide"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Move Horizontal Guide"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Create Horizontal Guide"
-msgstr "Neues Projekt erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Horizontal Guide"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Create Horizontal and Vertical Guides"
-msgstr "Neues Projekt erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Move pivot"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotate CanvasItem"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Move anchor"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Resize CanvasItem"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Scale CanvasItem"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Move CanvasItem"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Children of containers have their anchors and margins values overridden by "
-"their parent."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Presets for the anchors and margins values of a Control node."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"When active, moving Control nodes changes their anchors instead of their "
-"margins."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Top Left"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Top Right"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Bottom Right"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Bottom Left"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Center Left"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Top"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Center Right"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Bottom"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Left Wide"
-msgstr "Bild einfügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Top Wide"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Right Wide"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Bottom Wide"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "VCenter Wide"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "HCenter Wide"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Full Rect"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Keep Ratio"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Anchors only"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Change Anchors and Margins"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Change Anchors"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Game Camera Override\n"
-"Overrides game camera with editor viewport camera."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Game Camera Override\n"
-"No game instance running."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Lock Selected"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Unlock Selected"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Group Selected"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Ungroup Selected"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Paste Pose"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Clear Guides"
-msgstr "Spiele angepasste Szene"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Create Custom Bone(s) from Node(s)"
-msgstr "Spiele angepasste Szene"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Clear Bones"
-msgstr "Spiele angepasste Szene"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Make IK Chain"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Clear IK Chain"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Warning: Children of a container get their position and size determined only "
-"by their parent."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-msgid "Zoom Reset"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Drag: Rotate"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Alt+Drag: Move"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Alt+RMB: Depth list selection"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Move Mode"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Rotate Mode"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Scale Mode"
-msgstr "TimeScale-Node"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Show a list of all objects at the position clicked\n"
-"(same as Alt+RMB in select mode)."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Click to change object's rotation pivot."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Pan Mode"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Ruler Mode"
-msgstr "TimeScale-Node"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Toggle smart snapping."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Smart Snap"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Toggle grid snapping."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Grid Snap"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snapping Options"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Rotation Snap"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Scale Snap"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap Relative"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Pixel Snap"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Smart Snapping"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Parent"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Node Anchor"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Snap to Node Sides"
-msgstr "Selektiere Node(s) zum Importieren aus"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Node Center"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Snap to Other Nodes"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Snap to Guides"
-msgstr "Selektiere Node(s) zum Importieren aus"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Lock the selected object in place (can't be moved)."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Unlock the selected object (can be moved)."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Makes sure the object's children are not selectable."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Restores the object's children's ability to be selected."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Skeleton Options"
-msgstr "Bild einfügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Bones"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Clear Custom Bones"
-msgstr "Spiele angepasste Szene"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Always Show Grid"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Helpers"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Rulers"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Guides"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Origin"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Viewport"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Group And Lock Icons"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Selection"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Frame Selection"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Preview Canvas Scale"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Translation mask for inserting keys."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotation mask for inserting keys."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Scale mask for inserting keys."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Insert keys (based on mask)."
-msgstr "Bilder (innerhalb) einfügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Auto insert keys when objects are translated, rotated or scaled (based on "
-"mask).\n"
-"Keys are only added to existing tracks, no new tracks will be created.\n"
-"Keys must be inserted manually for the first time."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Auto Insert Key"
-msgstr "Anim Bild einfügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Animation Key and Pose Options"
-msgstr "Animationsbild eingefügt."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Insert Key (Existing Tracks)"
-msgstr "Bild in bestehende Ebene einfügen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Copy Pose"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Clear Pose"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Multiply grid step by 2"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Divide grid step by 2"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Pan View"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Add %s"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Adding %s..."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Cannot instantiate multiple nodes without root."
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "Create Node"
-msgstr "Node erstellen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "Error instancing scene from %s"
-msgstr "Fehler beim Instanzieren der %s Szene"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Change Default Type"
-msgstr "Typ ändern"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Drag & drop + Shift : Add node as sibling\n"
-"Drag & drop + Alt : Change node type"
-msgstr ""
-
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon3D"
-msgstr "Node erstellen"
-
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
-
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
-msgstr ""
-
-#: editor/plugins/collision_shape_2d_editor_plugin.cpp
-msgid "Set Handle"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Load Emission Mask"
-msgstr "Emissions-Maske laden"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Restart"
-msgstr "Datei speichern"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Clear Emission Mask"
-msgstr "Inhalt der Emissions-Masken löschen"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Particles"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Generated Point Count:"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Emission Mask"
-msgstr "Emissions-Maske setzen"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Solid Pixels"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Border Pixels"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Directed Border Pixels"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Capture from Pixel"
-msgstr ""
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Emission Colors"
-msgstr "Emissions-Maske setzen"
-
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-msgid "CPUParticles"
-msgstr ""
-
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Create Emission Points From Mesh"
-msgstr ""
-
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Create Emission Points From Node"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Flat 0"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Flat 1"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
-msgid "Ease In"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
-msgid "Ease Out"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Smoothstep"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Modify Curve Point"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Modify Curve Tangent"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Load Curve Preset"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
-msgid "Add Point"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Point"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
-msgid "Left Linear"
-msgstr "Bild einfügen"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Right Linear"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Load Preset"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Curve Point"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Toggle Curve Linear Tangent"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Hold Shift to edit tangents individually"
-msgstr ""
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Right click to add point"
-msgstr ""
-
-#: editor/plugins/gi_probe_editor_plugin.cpp
-msgid "Bake GI Probe"
-msgstr ""
-
-#: editor/plugins/gradient_editor_plugin.cpp
-msgid "Gradient Edited"
-msgstr ""
-
-#: editor/plugins/item_list_editor_plugin.cpp
-msgid "Item %d"
-msgstr ""
-
-#: editor/plugins/item_list_editor_plugin.cpp
-msgid "Items"
-msgstr ""
-
-#: editor/plugins/item_list_editor_plugin.cpp
-msgid "Item List Editor"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Occluder Polygon"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh is empty!"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "This doesn't work on scene root!"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Trimesh Static Shape"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Shape(s)"
-msgstr "Node erstellen"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Navigation Mesh"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Contained Mesh is not of type ArrayMesh."
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "No mesh to debug."
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Model has no UV in this layer"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "MeshInstance lacks a Mesh!"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh has not surface to create outlines from!"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Could not create outline!"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Outline"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Trimesh Static Body"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Trimesh Collision Sibling"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Node erstellen"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Outline Mesh..."
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "View UV1"
-msgstr "Datei(en) öffnen"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "View UV2"
-msgstr "Datei(en) öffnen"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Unwrap UV2 for Lightmap/AO"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Outline Mesh"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Outline Size:"
-msgstr ""
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "UV Channel Debug"
-msgstr ""
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Remove item %d?"
-msgstr ""
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid ""
-"Update from existing scene?:\n"
-"%s"
-msgstr ""
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Mesh Library"
-msgstr ""
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add Item"
-msgstr ""
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Remove Selected Item"
-msgstr ""
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Import from Scene"
-msgstr ""
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Update from Scene"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "No mesh source specified (and no MultiMesh set in node)."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh source is invalid (invalid path)."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "No surface source specified."
-msgstr "Keine Oberflächen Quelle spezifiziert."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Surface source is invalid (invalid path)."
-msgstr "Oberflächen Quelle is invalid (invalider Pfad)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Surface source is invalid (no geometry)."
-msgstr "Oberflächen Quelle is invalid (keine Form)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
-msgid "Surface source is invalid (no faces)."
-msgstr "Oberflächen Quelle is invalid (kein Face)"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Select a Source Mesh:"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Select a Target Surface:"
-msgstr "Wähle eine Ziel Oberfläche aus:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Populate Surface"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Populate MultiMesh"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Target Surface:"
-msgstr "Ziel Oberfläche:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Source Mesh:"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "X-Axis"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Y-Axis"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Z-Axis"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh Up Axis:"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Random Rotation:"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Random Tilt:"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Random Scale:"
-msgstr ""
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Populate"
-msgstr ""
-
-#: editor/plugins/navigation_polygon_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create Navigation Polygon"
-msgstr ""
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Generating Visibility Rect"
-msgstr ""
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Generate Visibility Rect"
-msgstr ""
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Can only set point into a ParticlesMaterial process material"
-msgstr ""
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generation Time (sec):"
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "The geometry's faces don't contain any area."
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "The geometry doesn't contain any faces."
-msgstr "Node enthält keine Geometrie (Flächen)."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "\"%s\" doesn't inherit from Spatial."
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "\"%s\" doesn't contain geometry."
-msgstr "Node enthält keine Geometrie (Flächen)."
-
-#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "\"%s\" doesn't contain face geometry."
-msgstr "Node enthält keine Geometrie (Flächen)."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Create Emitter"
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Emission Points:"
-msgstr "Emissions-Maske setzen"
-
-#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Surface Points"
-msgstr "Oberfläche %d"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Surface Points+Normal (Directed)"
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Volume"
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Emission Source: "
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "A processor material of type 'ParticlesMaterial' is required."
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate Visibility AABB"
-msgstr ""
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Remove Point from Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Remove Out-Control from Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Remove In-Control from Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Add Point to Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Split Curve"
-msgstr "Node Kurve editieren"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Move Point in Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Move In-Control in Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Move Out-Control in Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Select Points"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Shift+Drag: Select Control Points"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Click: Add Point"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Left Click: Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Right Click: Delete Point"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Select Control Points (Shift+Drag)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Add Point (in empty space)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Delete Point"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Close Curve"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp
-msgid "Options"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Mirror Handle Angles"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Mirror Handle Lengths"
-msgstr ""
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Curve Point #"
-msgstr ""
-
-#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
-msgid "Set Curve Point Position"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
-msgid "Set Curve In Position"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
-msgid "Set Curve Out Position"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Path"
-msgstr ""
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Remove Path Point"
-msgstr ""
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Remove Out-Control Point"
-msgstr ""
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Remove In-Control Point"
-msgstr ""
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
-msgid "Move Joint"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync Bones"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"No texture in this polygon.\n"
-"Set a texture to be able to edit UV."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"Polygon 2D has internal vertices, so it can no longer be edited in the "
-"viewport."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Internal Vertex"
-msgstr "Neues Projekt erstellen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Internal Vertex"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Polygon (need 3 different vertices)"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Custom Polygon"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Custom Polygon"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Transform Polygon"
-msgstr "Transformationstyp"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint Bone Weights"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Open Polygon 2D UV editor."
-msgstr "Polygon 2D UV Editor"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
-msgstr "Polygon 2D UV Editor"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Points"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Polygons"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Move Points"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Ctrl: Rotate"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Shift: Move All"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Shift+Ctrl: Scale"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Polygon"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Rotate Polygon"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Scale Polygon"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create a custom polygon. Enables custom polygon rendering."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"Remove a custom polygon. If none remain, custom polygon rendering is "
-"disabled."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Unpaint weights with specified intensity."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Radius:"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon->UV"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV->Polygon"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Clear UV"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Grid Settings"
-msgstr "Projekteinstellungen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Snap"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Enable Snap"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Show Grid"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Configure Grid:"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Offset X:"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Offset Y:"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Step X:"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Step Y:"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync Bones to Polygon"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "ERROR: Couldn't load resource!"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Add Resource"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Rename Resource"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Delete Resource"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Resource clipboard is empty!"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Paste Resource"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_editor.cpp
-msgid "Instance:"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Type:"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Load Resource"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "ResourcePreloader"
-msgstr ""
-
-#: editor/plugins/root_motion_editor_plugin.cpp
-msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
-
-#: editor/plugins/root_motion_editor_plugin.cpp
-msgid "Path to AnimationPlayer is invalid"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Clear Recent Files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Close and save changes?"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error writing TextFile:"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Could not load file at:"
-msgstr "Neues Projekt erstellen"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error saving file!"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error while saving theme."
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error Saving"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error importing theme."
-msgstr "Fehler beim Exportieren des Projekts!"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Error Importing"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New Text File..."
-msgstr "Datei(en) öffnen"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Open File"
-msgstr "Datei öffnen"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Save File As..."
-msgstr "Datei speichern"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Can't obtain the script for running."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Script failed reloading, check console for errors."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"To run this script, it must inherit EditorScript and be set to tool mode."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Import Theme"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As..."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "%s Class Reference"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-msgid "Find Next"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Filter scripts"
-msgstr "Node erstellen"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Filter methods"
-msgstr "Node erstellen"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Sort"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Move Up"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Move Down"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Next script"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Previous script"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "File"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Open..."
-msgstr "Öffnen"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Reopen Closed Script"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save All"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Soft Reload Script"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Copy Script Path"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Previous"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Next"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Theme"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Import Theme..."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
-msgid "Run"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Step Into"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Step Over"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Break"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
-#: editor/script_editor_debugger.cpp
-msgid "Continue"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Keep Debugger Open"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with External Editor"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Open Godot online documentation."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the reference documentation."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Go to previous edited document."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Go to next edited document."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Discard"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"The following files are newer on disk.\n"
-"What action should be taken?:"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Reload"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Resave"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Debugger"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search Results"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Clear Recent Scripts"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Connections to method:"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
-msgid "Source"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Target"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid ""
-"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Only resources from filesystem can be dropped."
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't drop nodes because script '%s' is not used in this scene."
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Lookup Symbol"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Pick Color"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Convert Case"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Uppercase"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Lowercase"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Capitalize"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-msgid "Go To"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-msgid "Bookmarks"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Breakpoints"
-msgstr "Bild einfügen"
-
-#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
-#: scene/gui/text_edit.cpp
-msgid "Cut"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
-#: scene/gui/text_edit.cpp
-msgid "Select All"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Delete Line"
-msgstr "Bild einfügen"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Indent Left"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Indent Right"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Comment"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Fold/Unfold Line"
-msgstr "Bild einfügen"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Evaluate Selection"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Convert Indent to Spaces"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Convert Indent to Tabs"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Toggle Bookmark"
-msgstr "Autoplay Umschalten"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Remove All Bookmarks"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/shader_editor_plugin.cpp
-msgid ""
-"This shader has been modified on on disk.\n"
-"What action should be taken?"
-msgstr ""
-
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Shader"
-msgstr ""
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Rest Pose from Bones"
-msgstr "Spiele angepasste Szene"
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Set Rest Pose to Bones"
-msgstr ""
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Skeleton2D"
-msgstr ""
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Make Rest Pose (From Bones)"
-msgstr ""
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Set Bones to Rest Pose"
-msgstr ""
-
-#: editor/plugins/skeleton_editor_plugin.cpp
-msgid "Create physical bones"
-msgstr ""
-
-#: editor/plugins/skeleton_editor_plugin.cpp
-msgid "Skeleton"
-msgstr ""
-
-#: editor/plugins/skeleton_editor_plugin.cpp
-msgid "Create physical skeleton"
-msgstr ""
-
-#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
-msgid "Play IK"
-msgstr "Abspielen"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Orthogonal"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Perspective"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Aborted."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "X-Axis Transform."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Y-Axis Transform."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Z-Axis Transform."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Plane Transform."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scaling: "
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Translating: "
-msgstr "Transition-Node"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotating %s degrees."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Keying is disabled (no key inserted)."
-msgstr "\"keying\" ist deaktiviert (Bild nicht hinzugefügt)."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Animation Key Inserted."
-msgstr "Animationsbild eingefügt."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Pitch"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Yaw"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Objects Drawn"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Material Changes"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Shader Changes"
-msgstr "Typ ändern"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Surface Changes"
-msgstr "Oberfläche %d"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Draw Calls"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Vertices"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Top View."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Bottom View."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Bottom"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Left View."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Left"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Right View."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Right"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Front View."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Front"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rear View."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rear"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Align Transform with View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Align Rotation with View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "No parent to instance a child at."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "This operation requires a single selected node."
-msgstr "Bitte nur ein Node selektieren."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Lock View Rotation"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Normal"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Wireframe"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Overdraw"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Unshaded"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Environment"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Gizmos"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Information"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View FPS"
-msgstr "Datei(en) öffnen"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Half Resolution"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Audio Listener"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Enable Doppler"
-msgstr "Typ ändern"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Cinematic Preview"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Not available when using the GLES2 renderer."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Left"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Right"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Forward"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Backwards"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Up"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Down"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Speed Modifier"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Slow Modifier"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Note: The FPS value displayed is the editor's framerate.\n"
-"It cannot be used as a reliable indication of in-game performance."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Nodes To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Couldn't find a solid floor to snap the selection to."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Drag: Rotate\n"
-"Alt+Drag: Move\n"
-"Alt+RMB: Depth list selection"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Use Local Space"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Use Snap"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Bottom View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Top View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rear View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Front View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Left View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Right View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Switch Perspective/Orthogonal View"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Insert Animation Key"
-msgstr "Bild einfügen"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Focus Origin"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Focus Selection"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Toggle Freelook"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Transform"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Object to Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Dialog..."
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "1 Viewport"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "2 Viewports"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "2 Viewports (Alt)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "3 Viewports"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "3 Viewports (Alt)"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "4 Viewports"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Gizmos"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Origin"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Grid"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "Settings..."
-msgstr "Projekteinstellungen"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Settings"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Translate Snap:"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Snap (deg.):"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Snap (%):"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Viewport Settings"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Perspective FOV (deg.):"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Z-Near:"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Z-Far:"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Change"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Translate:"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate (deg.):"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale (ratio):"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Type"
-msgstr "Transformationstyp"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Pre"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Post"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Nameless gizmo"
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Create Mesh2D"
-msgstr "Node erstellen"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Mesh2D Preview"
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon2D"
-msgstr "Node erstellen"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Polygon2D Preview"
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Create CollisionPolygon2D"
-msgstr "Node erstellen"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "CollisionPolygon2D Preview"
-msgstr "Node erstellen"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Create LightOccluder2D"
-msgstr "Node erstellen"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "LightOccluder2D Preview"
-msgstr "Node erstellen"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Sprite is empty!"
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to Mesh2D"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't create polygon."
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to Polygon2D"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't create collision polygon."
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Create CollisionPolygon2D Sibling"
-msgstr "Node erstellen"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't create light occluder."
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Create LightOccluder2D Sibling"
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Sprite"
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Simplification: "
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Shrink (Pixels): "
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Grow (Pixels): "
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Update Preview"
-msgstr ""
-
-#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
-msgid "Settings:"
-msgstr "Projekteinstellungen"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "No Frames Selected"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add %d Frame(s)"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Frame"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Unable to load images"
-msgstr "Selektiere Node(s) zum Importieren aus"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "ERROR: Couldn't load frame resource!"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Resource clipboard is empty or not a texture!"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Paste Frame"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Empty"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Change Animation FPS"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "(empty)"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Move Frame"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Animations:"
-msgstr "Animations-Node"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "New Animation"
-msgstr "Bild einfügen"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Loop"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Animation Frames:"
-msgstr "Animations-Node"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Add a Texture from File"
-msgstr "Node von Szene"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Frames from a Sprite Sheet"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Insert Empty (Before)"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Insert Empty (After)"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Move (Before)"
-msgstr "Node(s) entfernen"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Move (After)"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
-msgid "Select Frames"
-msgstr "Node(s) löschen"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Horizontal:"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Vertical:"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Select/Clear All Frames"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Create Frames from Sprite Sheet"
-msgstr ""
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "SpriteFrames"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Set Region Rect"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Set Margin"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Snap Mode:"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Pixel Snap"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Grid Snap"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Auto Slice"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Offset:"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Step:"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Sep.:"
-msgstr ""
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
-msgid "TextureRegion"
-msgstr "2D-Textur"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add All Items"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add All"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
-msgid "Remove All Items"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
-#, fuzzy
-msgid "Remove All"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Theme"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Theme editing menu."
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add Class Items"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Remove Class Items"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Create Empty Template"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Create Empty Editor Template"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Create From Current Editor Theme"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
-msgid "Toggle Button"
-msgstr "Autoplay Umschalten"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Disabled Button"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
-msgid "Disabled Item"
-msgstr "Node(s) löschen"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Check Item"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Checked Item"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Radio Item"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Checked Radio Item"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Named Sep."
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Submenu"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Subitem 1"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Subitem 2"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Has"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Many"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Disabled LineEdit"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Tab 1"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Tab 2"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Tab 3"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
-msgid "Editable Item"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Subtree"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Has,Many,Options"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Data Type:"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Icon"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
-msgid "Style"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Font"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Color"
-msgstr ""
-
-#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
-msgid "Theme File"
-msgstr "Datei öffnen"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Erase Selection"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Fix Invalid Tiles"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "Cut Selection"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Paint TileMap"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Line Draw"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rectangle Paint"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Bucket Fill"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Erase TileMap"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Find Tile"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Transpose"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Disable Autotile"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Enable Priority"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Filter tiles"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Give a TileSet resource to this TileMap to use its tiles."
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Paint Tile"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid ""
-"Shift+LMB: Line Draw\n"
-"Shift+Ctrl+LMB: Rectangle Paint"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Pick Tile"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Rotate Left"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Rotate Right"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Flip Horizontally"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Flip Vertically"
-msgstr ""
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Clear Transform"
-msgstr "Transformationstyp"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet."
-msgstr "Node von Szene"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove selected Texture from TileSet."
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from Scene"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Merge from Scene"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "New Single Tile"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "New Autotile"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "New Atlas"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Next Coordinate"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Select the next shape, subtile, or Tile."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Previous Coordinate"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Select the previous shape, subtile, or Tile."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Region"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Collision"
-msgstr "Animations-Node"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Occlusion"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Navigation"
-msgstr "Animations-Node"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Bitmask"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Priority"
-msgstr "Projekt exportieren"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Z Index"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Region Mode"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Collision Mode"
-msgstr "Animations-Node"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Occlusion Mode"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Navigation Mode"
-msgstr "Animations-Node"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Bitmask Mode"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Priority Mode"
-msgstr "Projekt exportieren"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Icon Mode"
-msgstr "Bild bewegen/einfügen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Z Index Mode"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Copy bitmask."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Paste bitmask."
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Erase bitmask."
-msgstr "Oberfläche %d"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Create a new rectangle."
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Create a new polygon."
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Keep polygon inside region Rect."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Enable snap and show grid (configurable via the Inspector)."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display Tile Names (Hold Alt Key)"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Add or select a texture on the left panel to edit the tiles bound to it."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "You haven't selected a texture to remove."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene? This will overwrite all current tiles."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Merge from scene?"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Texture"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "%s file(s) were not added because was already on the list."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Drag handles to edit Rect.\n"
-"Click on another Tile to edit it."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Delete selected Rect."
-msgstr "Node(s) löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid ""
-"Select current edited sub-tile.\n"
-"Click on another Tile to edit it."
-msgstr "Node(s) löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Delete polygon."
-msgstr "Bild einfügen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid ""
-"LMB: Set bit on.\n"
-"RMB: Set bit off.\n"
-"Shift+LMB: Set wildcard bit.\n"
-"Click on another Tile to edit it."
-msgstr "Node(s) löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings.\n"
-"Click on another Tile to edit it."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to change its priority.\n"
-"Click on another Tile to edit it."
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid ""
-"Select sub-tile to change its z index.\n"
-"Click on another Tile to edit it."
-msgstr "Node(s) löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Set Tile Region"
-msgstr "2D-Textur"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Create Tile"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Set Tile Icon"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Tile Bitmask"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Collision Polygon"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Occlusion Polygon"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Navigation Polygon"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Paste Tile Bitmask"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Clear Tile Bitmask"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Make Polygon Concave"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Make Polygon Convex"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Tile"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Collision Polygon"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Occlusion Polygon"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Navigation Polygon"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Tile Priority"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Edit Tile Z Index"
-msgstr ""
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Make Convex"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Make Concave"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Create Collision Polygon"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Create Occlusion Polygon"
-msgstr "Node erstellen"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "This property can't be changed."
-msgstr "Ohne eine Szene kann das nicht funktionieren."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "TileSet"
-msgstr "Datei(en) öffnen"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No VCS addons are available."
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
-msgid "Error"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No commit message was provided"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No files added to stage"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Commit"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "VCS Addon is not initialized"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Version Control System"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Initialize"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Staging area"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
-msgid "Detect new changes"
-msgstr "Node erstellen"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
-msgid "Changes"
-msgstr "Typ ändern"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Modified"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
-msgid "Renamed"
-msgstr "Node"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
-msgid "Deleted"
-msgstr "Node(s) löschen"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
-msgid "Typechange"
-msgstr "Typ ändern"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
-msgid "Stage Selected"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Stage All"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Add a commit message"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
-msgid "Commit Changes"
-msgstr "Typ ändern"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Status"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "View file diffs before committing them to the latest version"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No file diff is active"
-msgstr ""
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Detect changes in file diff"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Output"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Boolean"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Sampler"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add input port"
-msgstr "Script hinzufügen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add output port"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Change input port type"
-msgstr "Typ ändern"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Change output port type"
-msgstr "Typ ändern"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Change input port name"
-msgstr "Typ ändern"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Change output port name"
-msgstr "Typ ändern"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Remove input port"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Remove output port"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Set expression"
-msgstr "Typ ändern"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Resize VisualShader node"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Set Uniform Name"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Set Input Default Port"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node to Visual Shader"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Duplicate Nodes"
-msgstr "Node(s) duplizieren"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Paste Nodes"
-msgstr "Node erstellen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Delete Nodes"
-msgstr "Node(s) löschen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vertex"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Fragment"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Light"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Show resulted shader code."
-msgstr "Node erstellen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Create Shader Node"
-msgstr "Node erstellen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Color function."
-msgstr "Script hinzufügen"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Color operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Grayscale function."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Sepia function."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Burn operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Darken operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Difference operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Dodge operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "HardLight operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Lighten operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Overlay operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Screen operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "SoftLight operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Color constant."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Color uniform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Equal (==)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Greater Than (>)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Greater Than or Equal (>=)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns an associated vector if the provided scalars are equal, greater or "
-"less."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the boolean result of the comparison between INF and a scalar "
-"parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the boolean result of the comparison between NaN and a scalar "
-"parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Less Than (<)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Less Than or Equal (<=)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Not Equal (!=)"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns an associated vector if the provided boolean value is true or false."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns an associated scalar if the provided boolean value is true or false."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the boolean result of the comparison between INF (or NaN) and a "
-"scalar parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Boolean constant."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Boolean uniform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for all shader modes."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Input parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for light shader mode."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar function."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "E constant (2.718282). Represents the base of the natural logarithm."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the absolute value of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-cosine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-sine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-tangent of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-tangent of the parameters."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Constrains a value to lie between two further values."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the cosine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts a quantity in radians to degrees."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Base-e Exponential."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Base-2 Exponential."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Computes the fractional part of the argument."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Natural logarithm."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Base-2 logarithm."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the greater of two values."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the lesser of two values."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Linear interpolation between two scalars."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the opposite value of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 - scalar"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the value of the first parameter raised to the power of the second."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts a quantity in degrees to radians."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 / scalar"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the nearest integer to the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the nearest even integer to the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Extracts the sign of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the sine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the square root of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
-"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
-"using Hermite polynomials."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Step function( scalar(edge), scalar(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the tangent of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the truncated value of the parameter."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Adds scalar to scalar."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Divides scalar by scalar."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies scalar by scalar."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the remainder of the two scalars."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Subtracts scalar from scalar."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar constant."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar uniform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Perform the cubic texture lookup."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Perform the texture lookup."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Cubic texture uniform lookup."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "2D texture uniform lookup."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "2D texture uniform lookup with triplanar."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Transform function."
-msgstr "Transformationstyp"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Calculate the outer product of a pair of vectors.\n"
-"\n"
-"OuterProduct treats the first parameter 'c' as a column vector (matrix with "
-"one column) and the second parameter 'r' as a row vector (matrix with one "
-"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix "
-"whose number of rows is the number of components in 'c' and whose number of "
-"columns is the number of components in 'r'."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Composes transform from four vectors."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Decomposes transform to four vectors."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the determinant of a transform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the inverse of a transform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the transpose of a transform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies transform by transform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies vector by transform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Transform constant."
-msgstr "Transformationstyp"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Transform uniform."
-msgstr "Transformationstyp"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector function."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector operator."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Composes vector from three scalars."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Decomposes vector to three scalars."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the cross product of two vectors."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the distance between two points."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the dot product of two vectors."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the vector that points in the same direction as a reference vector. "
-"The function has three vector parameters : N, the vector to orient, I, the "
-"incident vector, and Nref, the reference vector. If the dot product of I and "
-"Nref is smaller than zero the return value is N. Otherwise -N is returned."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the length of a vector."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Linear interpolation between two vectors."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Linear interpolation between two vectors using scalar."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the normalize product of vector."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 - vector"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 / vector"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the vector that points in the direction of reflection ( a : incident "
-"vector, b : normal vector )."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
-"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
-"using Hermite polynomials."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
-"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
-"using Hermite polynomials."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Step function( vector(edge), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Step function( scalar(edge), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Adds vector to vector."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Divides vector by vector."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies vector by vector."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the remainder of the two vectors."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Subtracts vector from vector."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector constant."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector uniform."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Custom Godot Shader Language expression, with custom amount of input and "
-"output ports. This is a direct injection of code into the vertex/fragment/"
-"light function, do not use it to write the function declarations inside."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns falloff based on the dot product of surface normal and view "
-"direction of camera (pass associated inputs to it)."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Custom Godot Shader Language expression, which is placed on top of the "
-"resulted shader. You can place various function definitions inside and call "
-"it later in the Expressions. You can also declare varyings, uniforms and "
-"constants."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
-"differencing."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
-"differencing."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
-"differencing."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
-"differencing."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
-"'y'."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
-"'y'."
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "VisualShader"
-msgstr ""
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Visual Property"
-msgstr "Node Filter editieren"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Visual Shader Mode Changed"
-msgstr "Typ ändern"
-
-#: editor/project_export.cpp
-msgid "Runnable"
-msgstr ""
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Add initial export..."
-msgstr "Script hinzufügen"
-
-#: editor/project_export.cpp
-msgid "Add previous patches..."
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Delete patch '%s' from list?"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Delete preset '%s'?"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid ""
-"Failed to export the project for platform '%s'.\n"
-"Export templates seem to be missing or invalid."
-msgstr ""
-
-#: editor/project_export.cpp
-msgid ""
-"Failed to export the project for platform '%s'.\n"
-"This might be due to a configuration issue in the export preset or your "
-"export settings."
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Release"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Exporting All"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "The given export path doesn't exist:"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Export templates for this platform are missing/corrupted:"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Presets"
-msgstr ""
-
-#: editor/project_export.cpp editor/project_settings_editor.cpp
-msgid "Add..."
-msgstr ""
-
-#: editor/project_export.cpp
-msgid ""
-"If checked, the preset will be available for use in one-click deploy.\n"
-"Only one preset per platform may be marked as runnable."
-msgstr ""
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Export Path"
-msgstr "Projekt exportieren"
-
-#: editor/project_export.cpp
-msgid "Resources"
-msgstr ""
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Export all resources in the project"
-msgstr "Exportiere alle Resources des Projekts."
-
-#: editor/project_export.cpp
-msgid "Export selected scenes (and dependencies)"
-msgstr ""
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Export selected resources (and dependencies)"
-msgstr "Exportiere alle Resources des Projekts."
-
-#: editor/project_export.cpp
-msgid "Export Mode:"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Resources to export:"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid ""
-"Filters to export non-resource files/folders\n"
-"(comma-separated, e.g: *.json, *.txt, docs/*)"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid ""
-"Filters to exclude files/folders from project\n"
-"(comma-separated, e.g: *.json, *.txt, docs/*)"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Patches"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Make Patch"
-msgstr ""
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Pack File"
-msgstr "Datei(en) öffnen"
-
-#: editor/project_export.cpp
-msgid "Features"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Custom (comma-separated):"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Feature List:"
-msgstr ""
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Script"
-msgstr "Script hinzufügen"
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Script Export Mode:"
-msgstr "Projekt exportieren"
-
-#: editor/project_export.cpp
-msgid "Text"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Compiled"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Encrypted (Provide Key Below)"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Script Encryption Key (256-bits as hex):"
-msgstr ""
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Export PCK/Zip"
-msgstr "Exportiere das Projekt PCK"
-
-#: editor/project_export.cpp
-msgid "Export Project"
-msgstr "Projekt exportieren"
-
-#: editor/project_export.cpp
-#, fuzzy
-msgid "Export mode?"
-msgstr "Projekt exportieren"
-
-#: editor/project_export.cpp
-msgid "Export All"
-msgstr ""
-
-#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
-msgid "ZIP File"
-msgstr "Datei(en) öffnen"
-
-#: editor/project_export.cpp
-msgid "Godot Game Pack"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Export templates for this platform are missing:"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Manage Export Templates"
-msgstr ""
-
-#: editor/project_export.cpp
-msgid "Export With Debug"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr ""
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Please choose an empty folder."
-msgstr "Bitte ausserhalb des Projekt Verzeichnis exportieren!"
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Bitte ausserhalb des Projekt Verzeichnis exportieren!"
-
-#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "New Game Project"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Imported Project"
-msgstr "Importierte Projekte"
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Invalid Project Name."
-msgstr "Projektname:"
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Couldn't create folder."
-msgstr "Node erstellen"
-
-#: editor/project_manager.cpp
-msgid "There is already a folder in this path with the specified name."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "It would be a good idea to name your project."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Invalid project path (changed anything?)."
-msgstr "Ungültiger Projektpfad, (wurde was geändert?)!"
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid ""
-"Couldn't load project.godot in project path (error %d). It may be missing or "
-"corrupted."
-msgstr "Die engine.cfg kann im Projektverzeichnis nicht erstellt werden."
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Couldn't edit project.godot in project path."
-msgstr "Die engine.cfg kann im Projektverzeichnis nicht erstellt werden."
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Couldn't create project.godot in project path."
-msgstr "Die engine.cfg kann im Projektverzeichnis nicht erstellt werden."
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Rename Project"
-msgstr "Neues Projekt erstellen"
-
-#: editor/project_manager.cpp
-msgid "Import Existing Project"
-msgstr "Existierendes Projekt importieren"
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Import & Edit"
-msgstr "Importiere von folgendem Node:"
-
-#: editor/project_manager.cpp
-msgid "Create New Project"
-msgstr "Neues Projekt erstellen"
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Create & Edit"
-msgstr "Node erstellen"
-
-#: editor/project_manager.cpp
-msgid "Install Project:"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Install & Edit"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Project Name:"
-msgstr "Projektname:"
-
-#: editor/project_manager.cpp
-msgid "Project Path:"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Project Installation Path:"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Renderer:"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "OpenGL ES 3.0"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Higher visual quality\n"
-"All features available\n"
-"Incompatible with older hardware\n"
-"Not recommended for web games"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "OpenGL ES 2.0"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Lower visual quality\n"
-"Some features not available\n"
-"Works on most hardware\n"
-"Recommended for web games"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Unnamed Project"
-msgstr ""
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Missing Project"
-msgstr "Existierendes Projekt importieren"
-
-#: editor/project_manager.cpp
-msgid "Error: Project is missing on the filesystem."
-msgstr ""
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Can't open project at '%s'."
-msgstr "Neues Projekt erstellen"
-
-#: editor/project_manager.cpp
-msgid "Are you sure to open more than one project?"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"The following project settings file does not specify the version of Godot "
-"through which it was created.\n"
-"\n"
-"%s\n"
-"\n"
-"If you proceed with opening it, it will be converted to Godot's current "
-"configuration file format.\n"
-"Warning: You won't be able to open the project with previous versions of the "
-"engine anymore."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"The following project settings file was generated by an older engine "
-"version, and needs to be converted for this version:\n"
-"\n"
-"%s\n"
-"\n"
-"Do you want to convert it?\n"
-"Warning: You won't be able to open the project with previous versions of the "
-"engine anymore."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"The project settings were created by a newer engine version, whose settings "
-"are not compatible with this version."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Can't run project: no main scene defined.\n"
-"Please edit the project and set the main scene in the Project Settings under "
-"the \"Application\" category."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Can't run project: Assets need to be imported.\n"
-"Please edit the project to trigger the initial import."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Are you sure to run %d projects at once?"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Remove %d projects from the list?\n"
-"The project folders' contents won't be modified."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Remove this project from the list?\n"
-"The project folder's contents won't be modified."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Remove all missing projects from the list?\n"
-"The project folders' contents won't be modified."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Language changed.\n"
-"The interface will update after restarting the editor or project manager."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid ""
-"Are you sure to scan %s folders for existing Godot projects?\n"
-"This could take a while."
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Project Manager"
-msgstr ""
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Projects"
-msgstr "Projektname:"
-
-#: editor/project_manager.cpp
-msgid "Last Modified"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Scan"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "Select a Folder to Scan"
-msgstr ""
-
-#: editor/project_manager.cpp
-msgid "New Project"
-msgstr ""
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Remove Missing"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Templates"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/project_manager.cpp
-msgid "Restart Now"
-msgstr ""
-
-#: editor/project_manager.cpp
-#, fuzzy
-msgid "Can't run project"
-msgstr "Neues Projekt erstellen"
-
-#: editor/project_manager.cpp
-msgid ""
-"You currently don't have any projects.\n"
-"Would you like to explore official example projects in the Asset Library?"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Key "
-msgstr "Taste "
-
-#: editor/project_settings_editor.cpp
-msgid "Joy Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Joy Axis"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Mouse Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid ""
-"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
-"'\"'"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "An action with the name '%s' already exists."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Rename Input Action Event"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-#, fuzzy
-msgid "Change Action deadzone"
-msgstr "Typ ändern"
-
-#: editor/project_settings_editor.cpp
-msgid "Add Input Action Event"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "All Devices"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Device"
-msgstr ""
-
-#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-msgid "Press a Key..."
-msgstr "Taste drücken..."
-
-#: editor/project_settings_editor.cpp
-msgid "Mouse Button Index:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Left Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Right Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Middle Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Up Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Down Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Left Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Right Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "X Button 1"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "X Button 2"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Joypad Axis Index:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Axis"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Joypad Button Index:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Erase Input Action"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Erase Input Action Event"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Add Event"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Button"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Left Button."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Right Button."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Middle Button."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Up."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Down."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Add Global Property"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Select a setting item first!"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "No property '%s' exists."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-#, fuzzy
-msgid "Delete Item"
-msgstr "Node(s) löschen"
-
-#: editor/project_settings_editor.cpp
-msgid ""
-"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
-"'\"'."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Add Input Action"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Error saving settings."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Settings saved OK."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Moved Input Action Event"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Override for Feature"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Add Translation"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Remove Translation"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Add Remapped Path"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Resource Remap Add Remap"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Change Resource Remap Language"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Remove Resource Remap"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Remove Resource Remap Option"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-#, fuzzy
-msgid "Changed Locale Filter"
-msgstr "Typ ändern"
-
-#: editor/project_settings_editor.cpp
-msgid "Changed Locale Filter Mode"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-#, fuzzy
-msgid "Project Settings (project.godot)"
-msgstr "Projekteinstellungen"
-
-#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-msgid "General"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Override For..."
-msgstr ""
-
-#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-msgid "The editor must be restarted for changes to take effect."
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Input Map"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Action:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-#, fuzzy
-msgid "Action"
-msgstr "Script hinzufügen"
-
-#: editor/project_settings_editor.cpp
-msgid "Deadzone"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Device:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Index:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Localization"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Translations"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Translations:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Remaps"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Resources:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Remaps by Locale:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Locale"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Locales Filter"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Show All Locales"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Show Selected Locales Only"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-#, fuzzy
-msgid "Filter mode:"
-msgstr "Node erstellen"
-
-#: editor/project_settings_editor.cpp
-msgid "Locales:"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "AutoLoad"
-msgstr ""
-
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
-msgstr ""
-
-#: editor/property_editor.cpp
-msgid "Preset..."
-msgstr ""
-
-#: editor/property_editor.cpp
-msgid "Zero"
-msgstr ""
-
-#: editor/property_editor.cpp
-msgid "Easing In-Out"
-msgstr ""
-
-#: editor/property_editor.cpp
-msgid "Easing Out-In"
-msgstr ""
-
-#: editor/property_editor.cpp
-msgid "File..."
-msgstr ""
-
-#: editor/property_editor.cpp
-msgid "Dir..."
-msgstr ""
-
-#: editor/property_editor.cpp
-msgid "Assign"
-msgstr ""
-
-#: editor/property_editor.cpp
-#, fuzzy
-msgid "Select Node"
-msgstr "Node(s) löschen"
-
-#: editor/property_editor.cpp
-msgid "Error loading file: Not a resource!"
-msgstr ""
-
-#: editor/property_editor.cpp
-#, fuzzy
-msgid "Pick a Node"
-msgstr "TimeScale-Node"
-
-#: editor/property_editor.cpp
-msgid "Bit %d, val %d."
-msgstr ""
-
-#: editor/property_selector.cpp
-msgid "Select Property"
-msgstr ""
-
-#: editor/property_selector.cpp
-msgid "Select Virtual Method"
-msgstr ""
-
-#: editor/property_selector.cpp
-msgid "Select Method"
-msgstr ""
-
-#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-msgid "Batch Rename"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Prefix"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Suffix"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Advanced Options"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Substitute"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "Node name"
-msgstr "Node"
-
-#: editor/rename_dialog.cpp
-msgid "Node's parent name, if available"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "Node type"
-msgstr "Node"
-
-#: editor/rename_dialog.cpp
-msgid "Current scene name"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Root node name"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid ""
-"Sequential integer counter.\n"
-"Compare counter options."
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Initial value for the counter"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Step"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Amount by which counter is incremented for each node"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Padding"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid ""
-"Minimum number of digits for the counter.\n"
-"Missing digits are padded with leading zeros."
-msgstr ""
-
-#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "Regular Expressions"
-msgstr "Typ ändern"
-
-#: editor/rename_dialog.cpp
-msgid "Post-Process"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Keep"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Case"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "To Lowercase"
-msgstr "Verbindung zu Node:"
-
-#: editor/rename_dialog.cpp
-msgid "To Uppercase"
-msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Reset"
-msgstr ""
-
-#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
-msgid "Reparent Node"
-msgstr ""
-
-#: editor/reparent_dialog.cpp
-msgid "Reparent Location (Select new Parent):"
-msgstr ""
-
-#: editor/reparent_dialog.cpp
-msgid "Keep Global Transform"
-msgstr ""
-
-#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
-msgid "Reparent"
-msgstr ""
-
-#: editor/run_settings_dialog.cpp
-msgid "Run Mode:"
-msgstr ""
-
-#: editor/run_settings_dialog.cpp
-msgid "Current Scene"
-msgstr ""
-
-#: editor/run_settings_dialog.cpp
-msgid "Main Scene"
-msgstr ""
-
-#: editor/run_settings_dialog.cpp
-msgid "Main Scene Arguments:"
-msgstr ""
-
-#: editor/run_settings_dialog.cpp
-msgid "Scene Run Settings"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "No parent to instance the scenes at."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Error loading scene from %s"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Cannot instance the scene '%s' because the current scene exists within one "
-"of its nodes."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Instance Scene(s)"
-msgstr "Instanziere Szene(n)"
-
-#: editor/scene_tree_dock.cpp
-msgid "Replace with Branch Scene"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Clear Script"
-msgstr "Script hinzufügen"
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "This operation can't be done on the tree root."
-msgstr "Das funktioniert nicht beim obersten Node. (tree root)"
-
-#: editor/scene_tree_dock.cpp
-msgid "Move Node In Parent"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Move Nodes In Parent"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Duplicate Node(s)"
-msgstr "Node(s) duplizieren"
-
-#: editor/scene_tree_dock.cpp
-msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Node must belong to the edited scene to become root."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Instantiated scenes can't become root"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Make node as Root"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Delete %d nodes?"
-msgstr "Node(s) löschen"
-
-#: editor/scene_tree_dock.cpp
-msgid "Delete the root node \"%s\"?"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Delete node \"%s\" and its children?"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Delete node \"%s\"?"
-msgstr "Node(s) löschen"
-
-#: editor/scene_tree_dock.cpp
-msgid "Can not perform with the root node."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "This operation can't be done on instanced scenes."
-msgstr "Das funktioniert nicht bei einer instanzierten Szene."
-
-#: editor/scene_tree_dock.cpp
-msgid "Save New Scene As..."
-msgstr "Neue Szene speichern als..."
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Disabling \"editable_instance\" will cause all properties of the node to be "
-"reverted to their default."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
-"cause all properties of the node to be reverted to their default."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Make Local"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "New Scene Root"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Create Root Node:"
-msgstr "Node erstellen"
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "2D Scene"
-msgstr "Szene starten"
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "3D Scene"
-msgstr "Szene starten"
-
-#: editor/scene_tree_dock.cpp
-msgid "User Interface"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Other Node"
-msgstr "Node(s) löschen"
-
-#: editor/scene_tree_dock.cpp
-msgid "Can't operate on nodes from a foreign scene!"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Can't operate on nodes the current scene inherits from!"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Attach Script"
-msgstr "Script hinzufügen"
-
-#: editor/scene_tree_dock.cpp
-msgid "Remove Node(s)"
-msgstr "Node(s) entfernen"
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Change type of node(s)"
-msgstr "Typ ändern"
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Couldn't save new scene. Likely dependencies (instances) couldn't be "
-"satisfied."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Error saving scene."
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/scene_tree_dock.cpp
-msgid "Error duplicating scene to save it."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Sub-Resources"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Clear Inheritance"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Editable Children"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Load As Placeholder"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Open Documentation"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Expand/Collapse All"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr "Typ ändern"
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Reparent to New Node"
-msgstr "Node erstellen"
-
-#: editor/scene_tree_dock.cpp
-msgid "Make Scene Root"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Merge From Scene"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
-msgid "Save Branch as Scene"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
-msgid "Copy Node Path"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Delete (No Confirm)"
-msgstr "Bitte bestätigen..."
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Add/Create a New Node."
-msgstr "Node erstellen"
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Instance a scene file as a Node. Creates an inherited scene if no root node "
-"exists."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
-msgid "Remote"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/scene_tree_dock.cpp
-msgid "Local"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
-msgid "Clear Inheritance? (No Undo!)"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid "Toggle Visible"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-#, fuzzy
-msgid "Unlock Node"
-msgstr "Node(s) löschen"
-
-#: editor/scene_tree_editor.cpp
-msgid "Button Group"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-#, fuzzy
-msgid "(Connecting From)"
-msgstr "Connections editieren"
-
-#: editor/scene_tree_editor.cpp
-msgid "Node configuration warning:"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node has %s connection(s) and %s group(s).\n"
-"Click to show signals dock."
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node has %s connection(s).\n"
-"Click to show signals dock."
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node is in %s group(s).\n"
-"Click to show groups dock."
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-#, fuzzy
-msgid "Open Script:"
-msgstr "Script hinzufügen"
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node is locked.\n"
-"Click to unlock it."
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Children are not selectable.\n"
-"Click to make selectable."
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid "Toggle Visibility"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"AnimationPlayer is pinned.\n"
-"Click to unpin."
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid "Invalid node name, the following characters are not allowed:"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid "Rename Node"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid "Scene Tree (Nodes):"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid "Node Configuration Warning!"
-msgstr ""
-
-#: editor/scene_tree_editor.cpp
-msgid "Select a Node"
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Path is empty."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Filename is empty."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Path is not local."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid base path."
-msgstr "Projektname:"
-
-#: editor/script_create_dialog.cpp
-msgid "A directory with the same name exists."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid extension."
-msgstr "Projektname:"
-
-#: editor/script_create_dialog.cpp
-msgid "Wrong extension chosen."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Error loading template '%s'"
-msgstr "Fehler beim Instanzieren der %s Szene"
-
-#: editor/script_create_dialog.cpp
-msgid "Error - Could not create script in filesystem."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Error loading script from %s"
-msgstr "Fehler beim Instanzieren der %s Szene"
-
-#: editor/script_create_dialog.cpp
-msgid "Overrides"
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "N/A"
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Open Script / Choose Location"
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Open Script"
-msgstr "Script hinzufügen"
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "File exists, it will be reused."
-msgstr "Datei existiert, Überschreiben?"
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid class name."
-msgstr "Projektname:"
-
-#: editor/script_create_dialog.cpp
-msgid "Invalid inherited parent name or path."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Built-in script (into scene file)."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Will create a new script file."
-msgstr "Neues Projekt erstellen"
-
-#: editor/script_create_dialog.cpp
-msgid "Will load an existing script file."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Script file already exists."
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-msgid "Class Name:"
-msgstr ""
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Template:"
-msgstr "Ungültige Bilder löschen"
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Built-in Script:"
-msgstr "Script hinzufügen"
-
-#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Attach Node Script"
-msgstr "Script hinzufügen"
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Remote "
-msgstr "Ungültige Bilder löschen"
-
-#: editor/script_editor_debugger.cpp
-msgid "Bytes:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Warning:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Error:"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "C++ Error"
-msgstr "Connections editieren"
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "C++ Error:"
-msgstr "Connections editieren"
-
-#: editor/script_editor_debugger.cpp
-msgid "C++ Source"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "C++ Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Child process connected."
-msgstr "Verbindung zu Node:"
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Copy Error"
-msgstr "Connections editieren"
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Skip Breakpoints"
-msgstr "Bild einfügen"
-
-#: editor/script_editor_debugger.cpp
-msgid "Inspect Previous Instance"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Inspect Next Instance"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Frames"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Profiler"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Network Profiler"
-msgstr "Projekt exportieren"
-
-#: editor/script_editor_debugger.cpp
-msgid "Monitor"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Value"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Monitors"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Pick one or more items from the list to display the graph."
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "List of Video Memory Usage by Resource:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Total:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Resource Path"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Type"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Format"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Usage"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Misc"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Clicked Control:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Clicked Control Type:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Live Edit Root:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Set From Tree"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Export measures as CSV"
-msgstr ""
-
-#: editor/settings_config_dialog.cpp
-msgid "Erase Shortcut"
-msgstr ""
-
-#: editor/settings_config_dialog.cpp
-msgid "Restore Shortcut"
-msgstr ""
-
-#: editor/settings_config_dialog.cpp
-msgid "Change Shortcut"
-msgstr ""
-
-#: editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr ""
-
-#: editor/settings_config_dialog.cpp
-msgid "Shortcuts"
-msgstr ""
-
-#: editor/settings_config_dialog.cpp
-msgid "Binding"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Light Radius"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change AudioStreamPlayer3D Emission Angle"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Camera FOV"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Camera Size"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Notifier AABB"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Particles AABB"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Probe Extents"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
-msgid "Change Sphere Shape Radius"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
-msgid "Change Box Shape Extents"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Capsule Shape Radius"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Capsule Shape Height"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Cylinder Shape Radius"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Cylinder Shape Height"
-msgstr ""
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Ray Shape Length"
-msgstr ""
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Cylinder Radius"
-msgstr ""
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Cylinder Height"
-msgstr ""
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Torus Inner Radius"
-msgstr ""
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Torus Outer Radius"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Select the dynamic library for this entry"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Select dependencies of the library for this entry"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current entry"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Double click to create a new entry"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Platform:"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Platform"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Dynamic Library"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Add an architecture entry"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "GDNativeLibrary"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Enabled GDNative Singleton"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Disabled GDNative Singleton"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Library"
-msgstr ""
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Libraries: "
-msgstr ""
-
-#: modules/gdnative/register_types.cpp
-msgid "GDNative"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Step argument is zero!"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Not a script with an instance"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Not based on a script"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Not based on a resource file"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary format (missing @path)"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary format (can't load script at @path)"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary (invalid subclasses)"
-msgstr ""
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Object can't provide a length."
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Next Plane"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Previous Plane"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Plane:"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Next Floor"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Previous Floor"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Floor:"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "GridMap Delete Selection"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "GridMap Fill Selection"
-msgstr "Projekteinstellungen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "GridMap Paste Selection"
-msgstr "Projekteinstellungen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "GridMap Paint"
-msgstr "Projekteinstellungen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Grid Map"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Snap View"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Clip Disabled"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Clip Above"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Clip Below"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Edit X Axis"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Edit Y Axis"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Edit Z Axis"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Rotate X"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Rotate Y"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Rotate Z"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Back Rotate X"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Back Rotate Y"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Back Rotate Z"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Clear Rotation"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "Paste Selects"
-msgstr "Projekteinstellungen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "Clear Selection"
-msgstr "Script hinzufügen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "Fill Selection"
-msgstr "Script hinzufügen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "GridMap Settings"
-msgstr "Projekteinstellungen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Pick Distance:"
-msgstr ""
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
-msgid "Filter meshes"
-msgstr "Node erstellen"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
-msgstr ""
-
-#: modules/mono/csharp_script.cpp
-msgid "Class name can't be a reserved keyword"
-msgstr ""
-
-#: modules/mono/mono_gd/gd_mono_utils.cpp
-msgid "End of inner exception stack trace"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake NavMesh"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Clear the navigation mesh."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Setting up Configuration..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Calculating grid size..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Creating heightfield..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Marking walkable triangles..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Constructing compact heightfield..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Eroding walkable area..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Partitioning..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Creating contours..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Creating polymesh..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Converting to native navigation mesh..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Navigation Mesh Generator Setup:"
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Parsing Geometry..."
-msgstr ""
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Done!"
-msgstr ""
-
-#: modules/visual_script/visual_script.cpp
-msgid ""
-"A node yielded without working memory, please read the docs on how to yield "
-"properly!"
-msgstr ""
-
-#: modules/visual_script/visual_script.cpp
-msgid ""
-"Node yielded, but did not return a function state in the first working "
-"memory."
-msgstr ""
-
-#: modules/visual_script/visual_script.cpp
-msgid ""
-"Return value must be assigned to first element of node working memory! Fix "
-"your node please."
-msgstr ""
-
-#: modules/visual_script/visual_script.cpp
-msgid "Node returned an invalid sequence output: "
-msgstr ""
-
-#: modules/visual_script/visual_script.cpp
-msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr ""
-
-#: modules/visual_script/visual_script.cpp
-msgid "Stack overflow with stack depth: "
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Signal Arguments"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Change Argument Type"
-msgstr "Typ ändern"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Argument name"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Set Variable Default Value"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Set Variable Type"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Input Port"
-msgstr "Script hinzufügen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Output Port"
-msgstr "Script hinzufügen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Override an existing built-in function."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Create a new function."
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Variables:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Create a new variable."
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Signals:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Create a new signal."
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Name is not a valid identifier:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Name already in use by another func/var/signal:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Rename Function"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Rename Variable"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Rename Signal"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Function"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Delete input port"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Variable"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Signal"
-msgstr "Script hinzufügen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Remove Input Port"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Remove Output Port"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Change Expression"
-msgstr "Typ ändern"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Remove VisualScript Nodes"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Duplicate VisualScript Nodes"
-msgstr "Node(s) duplizieren"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold %s to drop a simple reference to the node."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold %s to drop a Variable Setter."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold Ctrl to drop a Variable Setter."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Preload Node"
-msgstr "Node"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Node(s) From Tree"
-msgstr "Node von Szene"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid ""
-"Can't drop properties because script '%s' is not used in this scene.\n"
-"Drop holding 'Shift' to just copy the signature."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Getter Property"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Setter Property"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Change Base Type"
-msgstr "Typ ändern"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Move Node(s)"
-msgstr "Node(s) entfernen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Remove VisualScript Node"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Connect Nodes"
-msgstr "Verbindung zu Node:"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Disconnect Nodes"
-msgstr "Verbindung zu Node:"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Connect Node Data"
-msgstr "Verbindung zu Node:"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Connect Node Sequence"
-msgstr "Verbindung zu Node:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Script already has function '%s'"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Change Input Value"
-msgstr "Typ ändern"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Resize Comment"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't copy the function node."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Clipboard is empty!"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Paste VisualScript Nodes"
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't create function with a function node."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Select at least one node with sequence port."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Try to only have one sequence input in selection."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Create Function"
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove Function"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Remove Variable"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Editing Variable:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Remove Signal"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Editing Signal:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Make Tool:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Change Base Type:"
-msgstr "Typ ändern"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Nodes..."
-msgstr "Node"
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Add Function..."
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "function_name"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Select or create a function to edit its graph."
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Delete Selected"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Find Node Type"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Copy Nodes"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Cut Nodes"
-msgstr "Node erstellen"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Make Function"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Refresh Graph"
-msgstr ""
-
-#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Edit Member"
-msgstr "Node Filter editieren"
-
-#: modules/visual_script/visual_script_flow_control.cpp
-msgid "Input type not iterable: "
-msgstr ""
-
-#: modules/visual_script/visual_script_flow_control.cpp
-msgid "Iterator became invalid"
-msgstr ""
-
-#: modules/visual_script/visual_script_flow_control.cpp
-msgid "Iterator became invalid: "
-msgstr ""
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Invalid index property name."
-msgstr ""
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Base object is not a Node!"
-msgstr ""
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Path does not lead Node!"
-msgstr ""
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Invalid index property name '%s' in node %s."
-msgstr ""
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid ": Invalid argument of type: "
-msgstr ""
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid ": Invalid arguments: "
-msgstr ""
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid "VariableGet not found in script: "
-msgstr ""
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid "VariableSet not found in script: "
-msgstr ""
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid "Custom node has no _step() method, can't process graph."
-msgstr ""
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid ""
-"Invalid return value from _step(), must be integer (seq out), or string "
-"(error)."
-msgstr ""
-
-#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
-msgid "Search VisualScript"
-msgstr "Ungültige Bilder löschen"
-
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get %s"
-msgstr ""
-
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set %s"
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Package name is missing."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Package segments must be of non-zero length."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "A digit cannot be the first character in a package segment."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "The package must have at least one '.' separator."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Select device from the list"
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Debug keystore not configured in the Editor Settings nor in the preset."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Custom build requires a valid Android SDK path in Editor Settings."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Invalid Android SDK path for custom build in Editor Settings."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid ""
-"Android build template not installed in the project. Install it from the "
-"Project menu."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Invalid public key for APK expansion."
-msgstr ""
-
-#: platform/android/export/export.cpp
-#, fuzzy
-msgid "Invalid package name:"
-msgstr "Projektname:"
-
-#: platform/android/export/export.cpp
-msgid ""
-"Trying to build from a custom built template, but no version info for it "
-"exists. Please reinstall from the 'Project' menu."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid ""
-"Android build version mismatch:\n"
-" Template installed: %s\n"
-" Godot Version: %s\n"
-"Please reinstall Android build template from 'Project' menu."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "Building Android Project (gradle)"
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid ""
-"Building of Android project failed, check output for the error.\n"
-"Alternatively visit docs.godotengine.org for Android build documentation."
-msgstr ""
-
-#: platform/android/export/export.cpp
-msgid "No build apk generated at: "
-msgstr ""
-
-#: platform/iphone/export/export.cpp
-msgid "Identifier is missing."
-msgstr ""
-
-#: platform/iphone/export/export.cpp
-msgid "The character '%s' is not allowed in Identifier."
-msgstr ""
-
-#: platform/iphone/export/export.cpp
-msgid "App Store Team ID not specified - cannot configure the project."
-msgstr ""
-
-#: platform/iphone/export/export.cpp
-msgid "Invalid Identifier:"
-msgstr ""
-
-#: platform/iphone/export/export.cpp
-msgid "Required icon is not specified in the preset."
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-msgid "Stop HTTP Server"
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-msgid "Run in Browser"
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-msgid "Run exported HTML in the system's default browser."
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-#, fuzzy
-msgid "Could not write file:"
-msgstr "Neues Projekt erstellen"
-
-#: platform/javascript/export/export.cpp
-msgid "Could not open template for export:"
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-msgid "Invalid export template:"
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-msgid "Could not read custom HTML shell:"
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-msgid "Could not read boot splash image file:"
-msgstr ""
-
-#: platform/javascript/export/export.cpp
-msgid "Using default boot splash image."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-#, fuzzy
-msgid "Invalid package short name."
-msgstr "Projektname:"
-
-#: platform/uwp/export/export.cpp
-#, fuzzy
-msgid "Invalid package unique name."
-msgstr "Projektname:"
-
-#: platform/uwp/export/export.cpp
-#, fuzzy
-msgid "Invalid package publisher display name."
-msgstr "Projektname:"
-
-#: platform/uwp/export/export.cpp
-#, fuzzy
-msgid "Invalid product GUID."
-msgstr "Projektname:"
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid publisher GUID."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-#, fuzzy
-msgid "Invalid background color."
-msgstr "Projektname:"
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr ""
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr ""
-
-#: scene/2d/animated_sprite.cpp
-#, fuzzy
-msgid ""
-"A SpriteFrames resource must be created or set in the \"Frames\" property in "
-"order for AnimatedSprite to display frames."
-msgstr ""
-"Damit AnimatedSprite Frames anzeigen kann, muss eine SpriteFrame Resource "
-"unter der 'Frames' Property erstellt oder gesetzt sein."
-
-#: scene/2d/canvas_modulate.cpp
-msgid ""
-"Only one visible CanvasModulate is allowed per scene (or set of instanced "
-"scenes). The first created one will work, while the rest will be ignored."
-msgstr ""
-"Nur ein sichtbares CanvasModulate ist pro Szene (oder ein Satz von "
-"instanzierten Szenen) erlaubt. Das erste erstellte gewinnt der Rest wird "
-"ignoriert."
-
-#: scene/2d/collision_object_2d.cpp
-msgid ""
-"This node has no shape, so it can't collide or interact with other objects.\n"
-"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
-"define its shape."
-msgstr ""
-
-#: scene/2d/collision_polygon_2d.cpp
-msgid ""
-"CollisionPolygon2D only serves to provide a collision shape to a "
-"CollisionObject2D derived node. Please only use it as a child of Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
-msgstr ""
-
-#: scene/2d/collision_polygon_2d.cpp
-msgid "An empty CollisionPolygon2D has no effect on collision."
-msgstr "Ein leeres CollisionPolygon2D hat keinen Einfluss au die Kollision."
-
-#: scene/2d/collision_shape_2d.cpp
-msgid ""
-"CollisionShape2D only serves to provide a collision shape to a "
-"CollisionObject2D derived node. Please only use it as a child of Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
-msgstr ""
-
-#: scene/2d/collision_shape_2d.cpp
-msgid ""
-"A shape must be provided for CollisionShape2D to function. Please create a "
-"shape resource for it!"
-msgstr ""
-
-#: scene/2d/cpu_particles_2d.cpp
-msgid ""
-"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
-"\"Particles Animation\" enabled."
-msgstr ""
-
-#: scene/2d/light_2d.cpp
-msgid ""
-"A texture with the shape of the light must be supplied to the \"Texture\" "
-"property."
-msgstr ""
-
-#: scene/2d/light_occluder_2d.cpp
-msgid ""
-"An occluder polygon must be set (or drawn) for this occluder to take effect."
-msgstr ""
-"Ein Okkluder Polygon muss gesetzt oder gezeichnet werden, damit dieser "
-"Okkluder funktioniert."
-
-#: scene/2d/light_occluder_2d.cpp
-#, fuzzy
-msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
-msgstr ""
-"Das Okkluder Polygon für diesen Okkluder ist leer. Bitte zeichne ein Polygon!"
-
-#: scene/2d/navigation_polygon.cpp
-#, fuzzy
-msgid ""
-"A NavigationPolygon resource must be set or created for this node to work. "
-"Please set a property or draw a polygon."
-msgstr ""
-"Eine NavigationPolygon Ressource muss für diesen Node gesetzt oder erstellt "
-"werden, damit er funktioniert. Bitte setze eine Variable oder zeichne ein "
-"Polygon."
-
-#: scene/2d/navigation_polygon.cpp
-msgid ""
-"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
-"node. It only provides navigation data."
-msgstr ""
-"NavigationPolygonInstance muss ein Kind oder Grosskind vom Navigation2D Node "
-"sein. Es liefert nur Navigationsdaten."
-
-#: scene/2d/parallax_layer.cpp
-msgid ""
-"ParallaxLayer node only works when set as child of a ParallaxBackground node."
-msgstr ""
-
-#: scene/2d/particles_2d.cpp
-msgid ""
-"GPU-based particles are not supported by the GLES2 video driver.\n"
-"Use the CPUParticles2D node instead. You can use the \"Convert to "
-"CPUParticles\" option for this purpose."
-msgstr ""
-
-#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
-msgid ""
-"A material to process the particles is not assigned, so no behavior is "
-"imprinted."
-msgstr ""
-
-#: scene/2d/particles_2d.cpp
-msgid ""
-"Particles2D animation requires the usage of a CanvasItemMaterial with "
-"\"Particles Animation\" enabled."
-msgstr ""
-
-#: scene/2d/path_2d.cpp
-msgid "PathFollow2D only works when set as a child of a Path2D node."
-msgstr ""
-"PathFollow2D funktioniert nur, wenn sie als Unterobjekt eines Path2D Nodes "
-"gesetzt wird."
-
-#: scene/2d/physics_body_2d.cpp
-msgid ""
-"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
-"by the physics engine when running.\n"
-"Change the size in children collision shapes instead."
-msgstr ""
-
-#: scene/2d/remote_transform_2d.cpp
-msgid "Path property must point to a valid Node2D node to work."
-msgstr ""
-"Die Pfad-Variable muss auf einen gültigen Node2D Node zeigen um zu "
-"funktionieren."
-
-#: scene/2d/skeleton_2d.cpp
-msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
-
-#: scene/2d/skeleton_2d.cpp
-msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr ""
-
-#: scene/2d/skeleton_2d.cpp
-msgid ""
-"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
-msgstr ""
-
-#: scene/2d/tile_map.cpp
-msgid ""
-"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
-"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
-"KinematicBody2D, etc. to give them a shape."
-msgstr ""
-
-#: scene/2d/visibility_notifier_2d.cpp
-#, fuzzy
-msgid ""
-"VisibilityEnabler2D works best when used with the edited scene root directly "
-"as parent."
-msgstr ""
-"VisibilityEnable2D funktioniert am besten, wenn es ein Unterobjekt erster "
-"Ordnung der bearbeiteten Hauptszene ist."
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr ""
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr ""
-
-#: scene/3d/arvr_nodes.cpp
-msgid ""
-"The controller ID must not be 0 or this controller won't be bound to an "
-"actual controller."
-msgstr ""
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr ""
-
-#: scene/3d/arvr_nodes.cpp
-msgid ""
-"The anchor ID must not be 0 or this anchor won't be bound to an actual "
-"anchor."
-msgstr ""
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr ""
-
-#: scene/3d/baked_lightmap.cpp
-msgid "%d%%"
-msgstr ""
-
-#: scene/3d/baked_lightmap.cpp
-msgid "(Time Left: %d:%02d s)"
-msgstr ""
-
-#: scene/3d/baked_lightmap.cpp
-msgid "Plotting Meshes: "
-msgstr ""
-
-#: scene/3d/baked_lightmap.cpp
-msgid "Plotting Lights:"
-msgstr ""
-
-#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
-msgid "Finishing Plot"
-msgstr ""
-
-#: scene/3d/baked_lightmap.cpp
-msgid "Lighting Meshes: "
-msgstr ""
-
-#: scene/3d/collision_object.cpp
-msgid ""
-"This node has no shape, so it can't collide or interact with other objects.\n"
-"Consider adding a CollisionShape or CollisionPolygon as a child to define "
-"its shape."
-msgstr ""
-
-#: scene/3d/collision_polygon.cpp
-msgid ""
-"CollisionPolygon only serves to provide a collision shape to a "
-"CollisionObject derived node. Please only use it as a child of Area, "
-"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
-msgstr ""
-
-#: scene/3d/collision_polygon.cpp
-msgid "An empty CollisionPolygon has no effect on collision."
-msgstr ""
-
-#: scene/3d/collision_shape.cpp
-msgid ""
-"CollisionShape only serves to provide a collision shape to a CollisionObject "
-"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
-"KinematicBody, etc. to give them a shape."
-msgstr ""
-
-#: scene/3d/collision_shape.cpp
-msgid ""
-"A shape must be provided for CollisionShape to function. Please create a "
-"shape resource for it."
-msgstr ""
-
-#: scene/3d/collision_shape.cpp
-msgid ""
-"Plane shapes don't work well and will be removed in future versions. Please "
-"don't use them."
-msgstr ""
-
-#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
-
-#: scene/3d/cpu_particles.cpp
-msgid ""
-"CPUParticles animation requires the usage of a SpatialMaterial whose "
-"Billboard Mode is set to \"Particle Billboard\"."
-msgstr ""
-
-#: scene/3d/gi_probe.cpp
-msgid "Plotting Meshes"
-msgstr ""
-
-#: scene/3d/gi_probe.cpp
-msgid ""
-"GIProbes are not supported by the GLES2 video driver.\n"
-"Use a BakedLightmap instead."
-msgstr ""
-
-#: scene/3d/light.cpp
-msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr ""
-
-#: scene/3d/navigation_mesh.cpp
-msgid "A NavigationMesh resource must be set or created for this node to work."
-msgstr ""
-
-#: scene/3d/navigation_mesh.cpp
-msgid ""
-"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
-"It only provides navigation data."
-msgstr ""
-
-#: scene/3d/particles.cpp
-msgid ""
-"GPU-based particles are not supported by the GLES2 video driver.\n"
-"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
-"\" option for this purpose."
-msgstr ""
-
-#: scene/3d/particles.cpp
-msgid ""
-"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr ""
-
-#: scene/3d/particles.cpp
-msgid ""
-"Particles animation requires the usage of a SpatialMaterial whose Billboard "
-"Mode is set to \"Particle Billboard\"."
-msgstr ""
-
-#: scene/3d/path.cpp
-#, fuzzy
-msgid "PathFollow only works when set as a child of a Path node."
-msgstr ""
-"PathFollow2D funktioniert nur, wenn sie als Unterobjekt eines Path2D Nodes "
-"gesetzt wird."
-
-#: scene/3d/path.cpp
-msgid ""
-"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
-"parent Path's Curve resource."
-msgstr ""
-
-#: scene/3d/physics_body.cpp
-msgid ""
-"Size changes to RigidBody (in character or rigid modes) will be overridden "
-"by the physics engine when running.\n"
-"Change the size in children collision shapes instead."
-msgstr ""
-
-#: scene/3d/remote_transform.cpp
-#, fuzzy
-msgid ""
-"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
-"derived node to work."
-msgstr "Die Pfad-Variable muss auf einen gültigen Particles2D Node verweisen."
-
-#: scene/3d/soft_body.cpp
-msgid "This body will be ignored until you set a mesh."
-msgstr ""
-
-#: scene/3d/soft_body.cpp
-msgid ""
-"Size changes to SoftBody will be overridden by the physics engine when "
-"running.\n"
-"Change the size in children collision shapes instead."
-msgstr ""
-
-#: scene/3d/sprite_3d.cpp
-#, fuzzy
-msgid ""
-"A SpriteFrames resource must be created or set in the \"Frames\" property in "
-"order for AnimatedSprite3D to display frames."
-msgstr ""
-"Damit AnimatedSprite Frames anzeigen kann, muss eine SpriteFrame Resource "
-"unter der 'Frames' Property erstellt oder gesetzt sein."
-
-#: scene/3d/vehicle_body.cpp
-msgid ""
-"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
-"it as a child of a VehicleBody."
-msgstr ""
-
-#: scene/3d/world_environment.cpp
-msgid ""
-"WorldEnvironment requires its \"Environment\" property to contain an "
-"Environment to have a visible effect."
-msgstr ""
-
-#: scene/3d/world_environment.cpp
-msgid ""
-"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
-msgstr ""
-
-#: scene/3d/world_environment.cpp
-msgid ""
-"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
-"this environment's Background Mode to Canvas (for 2D scenes)."
-msgstr ""
-
-#: scene/animation/animation_blend_tree.cpp
-msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
-
-#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
-msgid "Animation not found: '%s'"
-msgstr "Animations-Node"
-
-#: scene/animation/animation_tree.cpp
-msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
-
-#: scene/animation/animation_tree.cpp
-msgid "Invalid animation: '%s'."
-msgstr ""
-
-#: scene/animation/animation_tree.cpp
-msgid "Nothing connected to input '%s' of node '%s'."
-msgstr ""
-
-#: scene/animation/animation_tree.cpp
-msgid "No root AnimationNode for the graph is set."
-msgstr ""
-
-#: scene/animation/animation_tree.cpp
-msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr ""
-
-#: scene/animation/animation_tree.cpp
-msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
-msgstr ""
-
-#: scene/animation/animation_tree.cpp
-msgid "The AnimationPlayer root node is not a valid node."
-msgstr ""
-
-#: scene/animation/animation_tree_player.cpp
-msgid "This node has been deprecated. Use AnimationTree instead."
-msgstr ""
-
-#: scene/gui/color_picker.cpp
-msgid ""
-"Color: #%s\n"
-"LMB: Set color\n"
-"RMB: Remove preset"
-msgstr ""
-
-#: scene/gui/color_picker.cpp
-msgid "Pick a color from the editor window."
-msgstr ""
-
-#: scene/gui/color_picker.cpp
-msgid "HSV"
-msgstr ""
-
-#: scene/gui/color_picker.cpp
-msgid "Raw"
-msgstr ""
-
-#: scene/gui/color_picker.cpp
-msgid "Switch between hexadecimal and code values."
-msgstr ""
-
-#: scene/gui/color_picker.cpp
-msgid "Add current color as a preset."
-msgstr ""
-
-#: scene/gui/container.cpp
-msgid ""
-"Container by itself serves no purpose unless a script configures its "
-"children placement behavior.\n"
-"If you don't intend to add a script, use a plain Control node instead."
-msgstr ""
-
-#: scene/gui/control.cpp
-msgid ""
-"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
-"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
-msgstr ""
-
-#: scene/gui/dialogs.cpp
-msgid "Alert!"
-msgstr "Alert!"
-
-#: scene/gui/dialogs.cpp
-msgid "Please Confirm..."
-msgstr "Bitte bestätigen..."
-
-#: scene/gui/popup.cpp
-msgid ""
-"Popups will hide by default unless you call popup() or any of the popup*() "
-"functions. Making them visible for editing is fine, but they will hide upon "
-"running."
-msgstr ""
-
-#: scene/gui/range.cpp
-msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr ""
-
-#: scene/gui/scroll_container.cpp
-msgid ""
-"ScrollContainer is intended to work with a single child control.\n"
-"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
-"minimum size manually."
-msgstr ""
-
-#: scene/gui/tree.cpp
-msgid "(Other)"
-msgstr ""
-
-#: scene/main/scene_tree.cpp
-msgid ""
-"Default Environment as specified in Project Settings (Rendering -> "
-"Environment -> Default Environment) could not be loaded."
-msgstr ""
-
-#: scene/main/viewport.cpp
-msgid ""
-"This viewport is not set as render target. If you intend for it to display "
-"its contents directly to the screen, make it a child of a Control so it can "
-"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
-"texture to some node for display."
-msgstr ""
-
-#: scene/resources/visual_shader_nodes.cpp
-msgid "Invalid source for preview."
-msgstr ""
-
-#: scene/resources/visual_shader_nodes.cpp
-msgid "Invalid source for shader."
-msgstr ""
-
-#: scene/resources/visual_shader_nodes.cpp
-msgid "Invalid comparison function for that type."
-msgstr ""
-
-#: servers/visual/shader_language.cpp
-msgid "Assignment to function."
-msgstr ""
-
-#: servers/visual/shader_language.cpp
-msgid "Assignment to uniform."
-msgstr ""
-
-#: servers/visual/shader_language.cpp
-msgid "Varyings can only be assigned in vertex function."
-msgstr ""
-
-#: servers/visual/shader_language.cpp
-msgid "Constants cannot be modified."
-msgstr ""
-
-#, fuzzy
-#~ msgid "Class Description"
-#~ msgstr "Script hinzufügen"
-
-#, fuzzy
-#~ msgid "Base Type:"
-#~ msgstr "Typ ändern"
-
-#, fuzzy
-#~ msgid "Available Nodes:"
-#~ msgstr "TimeScale-Node"
-
-#, fuzzy
-#~ msgid "Theme Properties:"
-#~ msgstr "Node erstellen"
-
-#, fuzzy
-#~ msgid "Class Description:"
-#~ msgstr "Script hinzufügen"
-
-#, fuzzy
-#~ msgid "Property Descriptions:"
-#~ msgstr "Script hinzufügen"
-
-#, fuzzy
-#~ msgid "Method Descriptions:"
-#~ msgstr "Script hinzufügen"
-
-#~ msgid "Delete Node(s)?"
-#~ msgstr "Node(s) löschen?"
-
-#~ msgid "Faces contain no area!"
-#~ msgstr "Flächen enthalten keinen Bereich!"
-
-#~ msgid "No faces!"
-#~ msgstr "Keine Flächen!"
-
-#, fuzzy
-#~ msgid "Select Mode (Q)"
-#~ msgstr "Selektiere Node(s) zum Importieren aus"
-
-#, fuzzy
-#~ msgid "Snap Mode (%s)"
-#~ msgstr "Selektiere Node(s) zum Importieren aus"
-
-#, fuzzy
-#~ msgid "Error initializing FreeType."
-#~ msgstr "Fehler bei der FreeType Inizialisierung."
-
-#, fuzzy
-#~ msgid "Previous Folder"
-#~ msgstr "Node(s) löschen"
-
-#, fuzzy
-#~ msgid "Next Folder"
-#~ msgstr "Node erstellen"
-
-#, fuzzy
-#~ msgid "Build Project"
-#~ msgstr "Projektname:"
-
-#, fuzzy
-#~ msgid "View log"
-#~ msgstr "Datei(en) öffnen"
-
-#~ msgid "Path to Node:"
-#~ msgstr "Pfad zum Node:"
-
-#, fuzzy
-#~ msgid "Create folder"
-#~ msgstr "Node erstellen"
-
-#, fuzzy
-#~ msgid "Custom Node"
-#~ msgstr "Node erstellen"
-
-#, fuzzy
-#~ msgid "Create Area"
-#~ msgstr "Node erstellen"
-
-#, fuzzy
-#~ msgid "Create Exterior Connector"
-#~ msgstr "Neues Projekt erstellen"
-
-#, fuzzy
-#~ msgid "Insert keys."
-#~ msgstr "Bild einfügen"
-
-#, fuzzy
-#~ msgid "OrientedPathFollow only works when set as a child of a Path node."
-#~ msgstr ""
-#~ "PathFollow2D funktioniert nur, wenn sie als Unterobjekt eines Path2D "
-#~ "Nodes gesetzt wird."
-
-#, fuzzy
-#~ msgid "Add Split"
-#~ msgstr "Script hinzufügen"
-
-#, fuzzy
-#~ msgid "Remove Split"
-#~ msgstr "Ungültige Bilder löschen"
-
-#, fuzzy
-#~ msgid "Add Node.."
-#~ msgstr "Node"
-
-#, fuzzy
-#~ msgid "Show current scene file."
-#~ msgstr "Node(s) löschen"
-
-#~ msgid "Ok"
-#~ msgstr "Okay"
-
-#, fuzzy
-#~ msgid "Convert To Lowercase"
-#~ msgstr "Verbindung zu Node:"
-
-#~ msgid "Anim Add Key"
-#~ msgstr "Anim Bild hinzufügen"
-
-#~ msgid "Enable editing of individual keys by clicking them."
-#~ msgstr "Aktivieren des Bildeditors mit einem click auf die jenigen."
-
-#~ msgid "Key"
-#~ msgstr "Bild"
-
-#~ msgid "Call Functions in Which Node?"
-#~ msgstr "Im welchem Node soll die Funktion aufgerufen werden?"
-
-#~ msgid "Create new animation in player."
-#~ msgstr "Neue Animation erstellen."
-
-#, fuzzy
-#~ msgid "Set pivot at mouse position"
-#~ msgstr "Ungültige Bilder löschen"
-
-#~ msgid "OK :("
-#~ msgstr "Okay :("
-
-#, fuzzy
-#~ msgid "Can't contain '/' or ':'"
-#~ msgstr "Verbindung zu Node:"
-
-#, fuzzy
-#~ msgid "Can't write file."
-#~ msgstr "Neues Projekt erstellen"
-
-#, fuzzy
-#~ msgid "Couldn't get project.godot in project path."
-#~ msgstr "Die engine.cfg kann im Projektverzeichnis nicht erstellt werden."
-
-#, fuzzy
-#~ msgid "Couldn't get project.godot in the project path."
-#~ msgstr "Die engine.cfg kann im Projektverzeichnis nicht erstellt werden."
-
-#~ msgid "Move Add Key"
-#~ msgstr "Bild bewegen/einfügen"
-
-#~ msgid "Set Emission Mask"
-#~ msgstr "Emissions-Maske setzen"
-
-#~ msgid "Surface %d"
-#~ msgstr "Oberfläche %d"
-
-#~ msgid "Import Textures for Atlas (2D)"
-#~ msgstr "Importiere Texturen für Atlas (2D)"
-
-#~ msgid "Import Large Textures (2D)"
-#~ msgstr "Importiere Große Texturen (2D)"
-
-#~ msgid "Import Textures for 2D"
-#~ msgstr "Importiere Texturen für 2D"
-
-#, fuzzy
-#~ msgid ""
-#~ "NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files "
-#~ "to the project."
-#~ msgstr ""
-#~ "MERKE: Das importieren von 2D Texturen ist nicht zwingend notwendig. "
-#~ "Kopiere einfach png/jpg Dateien in das Projekt."
-
-#, fuzzy
-#~ msgid "Add to Project (project.godot)"
-#~ msgstr "Zum Projekt hinzufügen (engine.cfg)"
-
-#~ msgid "Invalid project path, the path must exist!"
-#~ msgstr "Ungültiger Projektpfad, Pfad existiert nicht!"
-
-#, fuzzy
-#~ msgid "Invalid project path, project.godot must not exist."
-#~ msgstr "Ungültiger Projektpfad, engine.cfg vorhanden!"
-
-#, fuzzy
-#~ msgid "Invalid project path, project.godot must exist."
-#~ msgstr "Ungültiger Projektpfad, engine.cfg nicht vorhanden!"
-
-#~ msgid "Project Path (Must Exist):"
-#~ msgstr "Projektpfad (muss existieren):"
-
-#~ msgid "Node From Scene"
-#~ msgstr "Node von Szene"
-
-#~ msgid "Import assets to the project."
-#~ msgstr "Assets zum Projekt importieren."
-
-#~ msgid "Export the project to many platforms."
-#~ msgstr "Exportiere das Projekt für viele Plattformen."
-
-#~ msgid "Path property must point to a valid Particles2D node to work."
-#~ msgstr ""
-#~ "Die Pfad-Variable muss auf einen gültigen Particles2D Node verweisen."
-
-#~ msgid "Surface"
-#~ msgstr "Oberfläche"
-
-#~ msgid ""
-#~ "A SampleLibrary resource must be created or set in the 'samples' property "
-#~ "in order for SamplePlayer to play sound."
-#~ msgstr ""
-#~ "Damit SamplePlayer einen Sound abspielen kann, muss eine SampleLibrary "
-#~ "Ressource in der 'samples' Property erzeugt oder definiert werden."
-
-#~ msgid ""
-#~ "A SampleLibrary resource must be created or set in the 'samples' property "
-#~ "in order for SpatialSamplePlayer to play sound."
-#~ msgstr ""
-#~ "Damit SpatialSamplePlayer einen Sound abspielen kann, muss eine "
-#~ "SampleLibrary Ressource in der 'samples' Eigenschaft erzeugt oder "
-#~ "definiert werden."
-
-#~ msgid "Error writing the project PCK!"
-#~ msgstr "Fehler beim Schreiben des Projekts PCK!"
-
-#~ msgid "Project Export Settings"
-#~ msgstr "Projektexport Einstellungen"
-
-#~ msgid "Export all files in the project directory."
-#~ msgstr "Exportiere alle Dateien in das Projektverzeichnis."
diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot
index c1b2932a6f..743e77d7dd 100644
--- a/editor/translations/editor.pot
+++ b/editor/translations/editor.pot
@@ -502,6 +502,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -661,7 +662,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -680,7 +681,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -730,6 +731,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -809,7 +814,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -866,6 +870,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -903,7 +911,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1077,6 +1085,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1098,6 +1109,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1401,7 +1420,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1409,16 +1428,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1446,6 +1457,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1565,15 +1580,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1722,7 +1737,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1836,7 +1851,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2246,10 +2261,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2334,11 +2345,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2604,10 +2617,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2667,22 +2676,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2691,8 +2704,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2701,32 +2714,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2786,7 +2799,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2800,7 +2813,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3182,7 +3199,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3209,6 +3227,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3793,19 +3815,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3821,7 +3847,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3855,10 +3881,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4902,7 +4924,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5634,11 +5656,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5650,11 +5672,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5706,11 +5744,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5718,6 +5785,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6554,14 +6629,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6623,11 +6690,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6991,6 +7058,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7079,17 +7150,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7426,7 +7506,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8082,7 +8162,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9166,11 +9246,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9178,11 +9263,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9397,6 +9482,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9443,6 +9529,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9820,11 +9913,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9862,11 +9963,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9892,10 +9993,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9904,11 +10001,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9927,6 +10024,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -9990,7 +10095,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10026,6 +10131,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10148,6 +10257,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10194,11 +10310,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10318,6 +10434,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10358,6 +10478,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10366,7 +10490,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10390,6 +10514,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10458,6 +10588,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10506,7 +10640,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11372,6 +11506,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11395,6 +11533,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11572,6 +11736,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11759,6 +11929,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11779,6 +11954,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -11998,6 +12178,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/el.po b/editor/translations/el.po
index 99e7a49f85..2571598414 100644
--- a/editor/translations/el.po
+++ b/editor/translations/el.po
@@ -7,11 +7,13 @@
# Overloaded <manoschool@yahoo.gr>, 2019.
# Eternal Death <eternaldeath0001@gmail.com>, 2019.
# Overloaded @ Orama Interactive http://orama-interactive.com/ <manoschool@yahoo.gr>, 2020.
+# pandektis <pandektis@gmail.com>, 2020.
+# KostasMSC <kargyris@athtech.gr>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
+"PO-Revision-Date: 2020-08-11 14:04+0000\n"
"Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/"
"el/>\n"
@@ -20,7 +22,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 3.11-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -501,8 +503,8 @@ msgstr ""
"εισαγωγής της σκηνής και θέστε\n"
"το «Animation > Storage» σε «Files», ενεργοποιήστε το «Animation > Keep "
"Custom Tracks», και κάντε επαν-εισαγωγή.\n"
-"Εναλλακτικά, χρησιμοποιήστε μία διαμόρφωση εισαγωγής που εισάγει κινήσεις "
-"σε ξεχωριστά αρχεία."
+"Εναλλακτικά, χρησιμοποιήστε μία διαμόρφωση εισαγωγής που εισάγει κινήσεις σε "
+"ξεχωριστά αρχεία."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
@@ -534,6 +536,7 @@ msgid "Seconds"
msgstr "Δευτερόλεπτα"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -693,8 +696,8 @@ msgid "Line Number:"
msgstr "Αρ. γραμμής:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Αντικαταστάθηκαν %d εμφανίσεις."
+msgid "%d replaced."
+msgstr "%d αντικαταστάθηκαν."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -712,7 +715,7 @@ msgstr "Αντιστοίχηση πεζών-κεφαλαίων"
msgid "Whole Words"
msgstr "Ολόκληρες λέξεις"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Αντικατάσταση"
@@ -743,11 +746,11 @@ msgstr "Μεγέθυνση"
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "Σμύκρινση"
+msgstr "Σμίκρυνση"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Επαναφορά μεγέθυνσης"
+msgstr "Επαναφορά μεγένθυνσης"
#: editor/code_editor.cpp
msgid "Warnings"
@@ -762,6 +765,10 @@ msgid "Method in target node must be specified."
msgstr "Πρέπει να οριστεί συνάρτηση στον στοχευμένο κόμβο."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Το όνομα δεν είναι έγκυρο αναγνωριστικό."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -845,7 +852,6 @@ msgstr "Αδύνατη η σύνδεση σήματος"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -903,6 +909,11 @@ msgid "Signals"
msgstr "Σήματα"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Φιλτράρισμα πλακιδίων"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
"Είστε σίγουροι πως θέλετε να αφαιρέσετε όλες της συνδέσεις απο αυτό το σήμα;"
@@ -941,7 +952,7 @@ msgid "Recent:"
msgstr "Πρόσφατα:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Αναζήτηση:"
@@ -1121,6 +1132,9 @@ msgstr "Ιδρυτές του έργου"
msgid "Lead Developer"
msgstr "Επικεφαλής προγραμματιστής"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Διαχειριστής έργων "
@@ -1142,6 +1156,16 @@ msgid "Gold Sponsors"
msgstr "Χρυσοί Χορυγοί"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Αργυροί Δωρητές"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Χάλκινοι Δωρητές"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Μικροί Χορηγοί"
@@ -1451,7 +1475,7 @@ msgstr "Μετακίνηση AutoLoad"
msgid "Remove Autoload"
msgstr "Αφαίρεση AutoLoad"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Ενεργοποίηση"
@@ -1459,17 +1483,9 @@ msgstr "Ενεργοποίηση"
msgid "Rearrange Autoloads"
msgstr "Αναδιάταξη των AutoLoad"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Άκυρη διαδρομή."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Το αρχείο δεν υπάρχει."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Δεν υπάρχει στην διαδρομή πόρων."
+msgid "Can't add autoload:"
+msgstr "Αδυναμία προσθήκης autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1496,6 +1512,10 @@ msgstr "Όνομα"
msgid "Singleton"
msgstr "Μονοσύνολο"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Επικόλληση παραμέτρων"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Ενημέρωση σκηνής"
@@ -1596,7 +1616,7 @@ msgstr "Δεν βρέθηκε προσαρμοσμένο πακέτο αποσφ
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr "Δεν βρέθηκε προσαρμοσμένο πακέτο παραγωγής."
+msgstr "Δεν βρέθηκε προσαρμοσμένο πακέτο διανομής."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
@@ -1624,16 +1644,17 @@ msgid "Scene Tree Editing"
msgstr "Επεξεργασία Δέντρου Σκηνής"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Πλατφόρμα Εισαγωγής"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Πλατφόρμα Κόμβου"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Πλατφόρμες Συστήματος Αρχείων και Εισαγωγής"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Σύστημα αρχείων"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Πλατφόρμα Εισαγωγής"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1782,10 +1803,10 @@ msgstr "Εμφάνιση στη διαχείριση αρχείων"
msgid "New Folder..."
msgstr "Νέος φάκελος..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
-msgstr "Αναναίωση"
+msgstr "Ανανέωση"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
@@ -1896,7 +1917,7 @@ msgstr "Φάκελοι & Αρχεία:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Προεπισκόπηση:"
@@ -2336,12 +2357,6 @@ msgid "There is no defined scene to run."
msgstr "Δεν υπάρχει καθορισμένη σκηνή για εκτελέση."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Η τρέχουσα σκηνή δεν έχει αποθηκευτεί, αποθηκεύστε πριν να τρέξετε το "
-"πρόγραμμα."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Αδύνατη η εκκίνηση της υπό-εργασίας!"
@@ -2427,14 +2442,17 @@ msgstr ""
"Δεν είναι δυνατό να φορτώσετε εκ νέου μια σκηνή που δεν αποθηκεύτηκε ποτέ."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Επαναφορά"
+msgid "Reload Saved Scene"
+msgstr "Ανανέωση Αποθηκευμένης Σκηνής"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
-"Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε με την "
-"επαναφορά;"
+"Η τρέχουσα σκηνή έχει μη αποθηκευμένες αλλαγές.\n"
+"Επαναφόρτωση της αποθηκευμένης σκηνής; Αυτή η ενέργεια δεν μπορεί να "
+"αναιρεθεί."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2458,13 +2476,13 @@ msgstr "Αποθήκευση & Έξοδος"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr "Αποθήκευση αλλαγών στις ακόλουθες σκηνές σκηνές πριν την έξοδο;"
+msgstr "Αποθήκευση αλλαγών στις ακόλουθες σκηνές πριν την έξοδο;"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
msgstr ""
-"Αποθήκευση αλλαγών στις ακόλουθες σκηνές σκηνές πριν το άνοιγμα του "
-"διαχειριστή έργων;"
+"Αποθήκευση αλλαγών στις ακόλουθες σκηνές πριν το άνοιγμα του Διαχειριστή "
+"Έργων;"
#: editor/editor_node.cpp
msgid ""
@@ -2700,7 +2718,7 @@ msgstr "Άνοιγμα πρόσφατων"
#: editor/editor_node.cpp
msgid "Save Scene"
-msgstr "Αποθηκεύσετε σκηνής"
+msgstr "Αποθηκεύση σκηνής"
#: editor/editor_node.cpp
msgid "Save All Scenes"
@@ -2729,10 +2747,6 @@ msgid "Redo"
msgstr "Ακύρωση αναίρεσης"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Επαναφορά σκηνής"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Λοιπά έργα ή εργαλεία για όλη τη σκηνή."
@@ -2792,24 +2806,28 @@ msgstr "Ανέπτυξε με απομακρυσμένο εντοπισμό σφ
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Όταν εξάγετε ή αναπτύσσετε, το παραγόμενο εκτελέσιμο θα προσπαθήσει να "
-"συνδεθεί στην IP αυτού του υπολογιστή για να αποσφαλματωθεί."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Μικρή ανάπτυξη με δικτυωμένο σύστημα αρχείων"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Όταν ενεργοποιείται αυτή η επιλογή, η εξαγωγή ή η ανάπτυξη θα παράξουν ένα "
"ελαχιστοποιημένο εκτελέσιμο.\n"
@@ -2823,9 +2841,10 @@ msgid "Visible Collision Shapes"
msgstr "Ορατά σχήματα σύγκρουσης"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Σχήματα σύγκρουσης και κόμβοι raycast (για 2D και 3D) θα είναι ορατά στο "
"παιχνίδι εάν αυτή η επιλογή είναι ενεργοποιημένη."
@@ -2835,23 +2854,26 @@ msgid "Visible Navigation"
msgstr "Ορατή πλοήγηση"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Τα πλέγματα πλοήγησης και τα πολύγονα θα είναι ορατά στο παιχνίδι εάν αυτή η "
"επιλογή είναι ενεργοποιημένη."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Συγχρονισμός αλλαγών στη σκηνή"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Η ενεργοποίηση της επιλογής αυτής θα συγχρονίσει αλλαγές της σκηνής εντός "
"του επεξεργαστή με το παιχνίδι που εκτελείται.\n"
@@ -2859,15 +2881,17 @@ msgstr ""
"σύστημα αρχείων."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Συγχρονισμός αλλαγών στις δεσμές ενεργειών"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Η ενεργοποίηση της επιλογής αυτής θα συγχρονίσει κάθε δέσμη ενεργειών που "
"αποθηκεύεται με το παιχνίδι που εκτελείται.\n"
@@ -2933,22 +2957,26 @@ msgstr "Βοήθεια"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Αναζήτηση"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
-msgstr "Ηλεκτρονική τεκμηρίωση"
+msgstr "Ηλεκτρονική τεκμηρίωση"
#: editor/editor_node.cpp
msgid "Q&A"
msgstr "Ερωτήσεις & Απαντήσεις"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Διαχείριση προβλημάτων"
+msgid "Report a Bug"
+msgstr "Αναφορά Σφάλματος"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Αποστολή Σχολίων Τεκμηρίωσης"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3130,7 +3158,7 @@ msgstr "Άνοιγμα βιβλιοθήκης"
#: editor/editor_node.cpp
msgid "Open the next Editor"
-msgstr "Άνοιγμα του επόμενου επεξεργαστή"
+msgstr "Άνοιγμα του επόμενου Επεξεργαστή"
#: editor/editor_node.cpp
msgid "Open the previous Editor"
@@ -3349,9 +3377,11 @@ msgid "Add Key/Value Pair"
msgstr "Προσθήκη ζεύγους κλειδιού/τιμής"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Δεν βρέθηκε εκτελέσιμη διαμόρφωση εξαγωγής για αυτή την πλατφόρμα.\n"
"Παρακαλούμε προσθέστε μία εκτελέσιμη διαμόρφωση στο μενού εξαγωγής."
@@ -3380,6 +3410,12 @@ msgstr "Αδυναμία εκτέλεσης δέσμης ενεργειών:"
msgid "Did you forget the '_run' method?"
msgstr "Μήπως ξεχάσατε τη μέθοδο '_run';"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Πατήστε παρατεταμένα το Ctrl για στρογγυλοποίηση ακεραίων και το Shift για "
+"πιο ακριβείς αλλαγές."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Επιλέξτε κόμβους για εισαγωγή"
@@ -3474,7 +3510,7 @@ msgid ""
"for official releases."
msgstr ""
"Δεν βρέθηκαν συνδέσμοι λήψης για την τρέχουσα έκδοση. Η απευθείας λήψη είναι "
-"διαθέσιμη μόνο για τις επίσημες εκδόσεις."
+"διαθέσιμη μόνο για τις επίσημες διανομές."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3981,10 +4017,19 @@ msgid "Error running post-import script:"
msgstr "Σφάλμα κατά την εκτέλεση της δέσμης ενεργειών μετεισαγωγής:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+"Μήπως επιστρέψατε ένα αντικείμενο τύπου κόμβου στην μέθοδο `post_import()`;"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Αποθήκευση..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d αρχεία"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Ορισμός ως προεπιλογής για '%s'"
@@ -3993,10 +4038,6 @@ msgid "Clear Default for '%s'"
msgstr "Εκκαθάριση προεπιλογής για '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Αρχεία"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Εισαγωγή ώς:"
@@ -4009,8 +4050,8 @@ msgid "Reimport"
msgstr "Επανεισαγωγή"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Αποθήκευση σκηνών, επανεισαγωγή και επανεκκίνηση"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Αποθήκευση Σκηνών, Επανεισαγωγή και Επανεκκίνηση"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4044,10 +4085,6 @@ msgid "Copy Params"
msgstr "Αντιγραφή παραμέτρων"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Επικόλληση παραμέτρων"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Επεξεργασία προχείρου πόρων"
@@ -5122,7 +5159,7 @@ msgid "Bake Lightmaps"
msgstr "Προετοιμασία Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Προεπισκόπηση"
@@ -5378,8 +5415,8 @@ msgid ""
"Warning: Children of a container get their position and size determined only "
"by their parent."
msgstr ""
-"Προειδοποίηση: Τα παιδιά ενός δοχείου, παίρνουν τη θέση και το μέγεθος "
-"καθορισμένα μόνο από τον γονέα τους."
+"Προσοχή: Τα παιδιά ενός δοχείου λαμβάνουν θέση και μέγεθος μόνο από τον "
+"γονέα τους."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -5572,7 +5609,7 @@ msgstr "Εμφάνιση Χαράκων"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Guides"
-msgstr "Εμφάνιση Οδηγών"
+msgstr "Εμφάνιση Οδηγιών"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Origin"
@@ -5878,12 +5915,12 @@ msgid "Mesh is empty!"
msgstr "Το πλέγμα είναι άδειο!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Δημιουργία στατικού σώματος πλέγματος τριγώνων"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Αδυναμία δημιουργίας σχήματος σύγκρουσης τριγώνων."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Δημιουργία στατικού κυρτού σώματος"
+msgid "Create Static Trimesh Body"
+msgstr "Δημιουργία στατικού σώματος πλέγματος τριγώνων"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5894,12 +5931,32 @@ msgid "Create Trimesh Static Shape"
msgstr "Δημιουργία Στατικού Σχήματος Πλέγματος Τριγώνων"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Αποτυχία δημιουργίας σχημάτων!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"Αδυναμια δημιουργίας μοναδικού κυρτού σχήματος σύγκρουσης για την ρίζα "
+"σκηνής."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Αδυναμία δημιουργίας μοναδικού κυρτού σχήματος σύγκρουσης."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Δημιουργία Μοναδικού Κυρτού Σχήματος"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Δημιουργία Κυρτών Σχημάτων"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Αδυναμία δημιουργίας πολλαπλών κυρτών σχημάτων σύγκρουσης για την ρίζα "
+"σκηνής."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Αδυναμία δημιουργίας σχημάτων σύγκρουσης."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Δημιουργία Πολλαπλών Κυρτών Σχημάτων"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5950,18 +6007,68 @@ msgid "Create Trimesh Static Body"
msgstr "Δημιουργία στατικού σώματος πλέγματος τριγώνων"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Δημιουργεί ένα StaticBody και του αναθέτει αυτόματα ένα σχήμα σύγκρουσης "
+"βασισμένο σε πολύγωνα.\n"
+"Είναι η πιο ακριβής (αλλά αργότερη) επιλογή για εντοπισμό σύγκρουσης."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Δημιουργία αδελφού σύγκρουσης πλέγατος τριγώνων"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Δημιουργία Κυρτού Αδελφού Σύγκρουσης"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Δημιουργεί ένα σχήμα σύγκρουσης βασισμένο σε πολύγωνα.\n"
+"Είναι η πιο ακριβής (αλλά αργότερη) επιλογή για εντοπισμό σύγκρουσης."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Δημιουργία Μοναδικού Κυρτού Αδελφού Σύγκρουσης"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Δημιουργεί ένα μοναδικό κυρτό σχήμα σύγκρουσης.\n"
+"Είναι η γρηγορότερη (αλλά πιο ανακριβής) επιλογή για εντοπισμό σύγκρουσης."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Δημιουργία Πολλαπλών Κυρτών Αδελφών Σύγκρουσης"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Δημιουργεί ένα σχήμα σύγκρουσης βασισμένο σε πολύγωνα.\n"
+"Είναι μια επιλογή μέσης απόδοσης σχετικά με τις παραπάνω επιλογές."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Δημιουργία πλέγματος περιγράμματος..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Δημιουργεί ένα στατικό πλέγμα περιγράμματος με αντίστροφα κανονικά "
+"διανύσματα.\n"
+"Είναι εναλλακτική της ιδιότητας Grow του SpatialMaterial, για όταν η "
+"τελευταία δεν είναι διαθέσιμη."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Εμφάνιση UV1"
@@ -6139,7 +6246,7 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generation Time (sec):"
-msgstr "Χρόνος παραγωγής (sec):"
+msgstr "Χρόνος Παραγωγής (sec):"
#: editor/plugins/particles_editor_plugin.cpp
msgid "The geometry's faces don't contain any area."
@@ -6782,7 +6889,7 @@ msgstr "Κλείσιμο όλων"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
-msgstr "Κλείσιμο τεκμηρίωσης"
+msgstr "Κλείσιμο Τεκμηρίωσης"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
@@ -6818,14 +6925,6 @@ msgid "Open Godot online documentation."
msgstr "Άνοιγμα ηλεκτρονικής τεκμηρίωσης της Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Αίτηση Τεκμηρίωσης"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Βοηθήστε στην βελτίωση της τεκμηρίωσης σχολιάζοντας."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Αναζήτηση στην τεκμηρίωση αναφοράς."
@@ -6891,12 +6990,12 @@ msgstr ""
"κόμβο «%s»."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Γραμμή"
+msgid "[Ignore]"
+msgstr "[Παράβλεψη]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(Παράβλεψη)"
+msgid "Line"
+msgstr "Γραμμή"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6971,11 +7070,11 @@ msgstr "Διαγραφή γραμμής"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
-msgstr "στοιχειοθέτηση αριστερά"
+msgstr "Στοιχειοθέτηση Αριστερά"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Right"
-msgstr "στοιχειοθέτηση δεξιά"
+msgstr "Στοιχειοθέτηση Δεξιά"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
@@ -7019,7 +7118,7 @@ msgstr "Μετατροπή Εσοχών σε Στηλοθέτες"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "Αυτόματη στοιχειοθέτηση"
+msgstr "Αυτόματη Στοιχειοθέτηση"
#: editor/plugins/script_text_editor.cpp
msgid "Find in Files..."
@@ -7266,6 +7365,10 @@ msgid "This operation requires a single selected node."
msgstr "Αυτή η λειτουργία απαιτεί έναν μόνο επιλεγμένο κόμβο."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Αυτόματη Αξονομετρική Ενεργή"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Κλείδωμα Περιστροφής Προβολής"
@@ -7354,6 +7457,10 @@ msgid "Freelook Slow Modifier"
msgstr "Αργός Τροποποιητής Ελεύθερου Κοιτάγματος"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Κλείδωμα Περιστροφής"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7363,14 +7470,24 @@ msgstr ""
"παιχνιδιού."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Κλείδωμα Περιστροφής"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Διάλογος XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Πατήστε για εναλλαγή λειτουργίας ορατότητας.\n"
+"\n"
+"Ανοιχτό μάτι: Ορατό μαραφέτι.\n"
+"Κλειστό μάτι: Κρυμμένο μαραφέτι.\n"
+"Ημι-ανοιχτό μάτι: Μαραφέτι ορατό και μέσα από στερεές επιφάνειες (\"x-ray\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Κούμπωμα Κόμβων στο Δάπεδο"
@@ -7708,7 +7825,8 @@ msgid "New Animation"
msgstr "Νέα Κίνηση"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Ταχύτητα (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8281,7 +8399,9 @@ msgstr ""
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Επιλέξτε υποπλακίδιο για να αλλάξετε την προτεραιότητα του."
+msgstr ""
+"Επιλέξτε υποπλακίδιο για να αλλάξετε την προτεραιότητα του.\n"
+"Πατήστε σε άλλο Πλακίδιο για να το επεξεργαστείτε."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8387,7 +8507,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "Κανένα πρόσθετο VCS δεν είναι διαθέσιμο."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Σφάλμα"
@@ -8989,7 +9109,7 @@ msgstr "Επιστρέφει την υπερβολική εφαπτομένη τ
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
-msgstr "Βρίσκει την περικομμένη τιμή της παραμέτρου."
+msgstr "Βρίσκει την περικομμένη τιμή της παραμέτρου."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
@@ -9388,7 +9508,7 @@ msgstr ""
#: editor/project_export.cpp
msgid "Release"
-msgstr "Κυκλοφορία"
+msgstr "Διανομή"
#: editor/project_export.cpp
msgid "Exporting All"
@@ -9553,24 +9673,29 @@ msgid "Export With Debug"
msgstr "Εξαγωγή με αποσφαλμάτωση"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Η διαδρομή δεν υπάρχει."
+msgid "The path specified doesn't exist."
+msgstr "Η ορισμένη διαδρομή δεν υπάρχει."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Άκυρο αρχείο έργου «.zip», δεν περιέχει αρχείο «project.godot»."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Σφάλμα ανοίγματος αρχείου πακέτου (δεν είναι σε μορφή ZIP)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "Άκυρο αρχείο έργου «.zip»: Δεν περιέχει αρχείο «project.godot»."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Παρακαλούμε επιλέξτε έναν άδειο φάκελο."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr "Παρακαλούμε επιλέξτε ένα αρχείο «project.godot» ή «.zip»."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "Ο κατάλογος περιέχει ήδη ένα έργο της Godot."
+msgid "This directory already contains a Godot project."
+msgstr "Ο κατάλογος αυτός περιέχει ήδη ένα έργο της Godot."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9832,6 +9957,7 @@ msgstr ""
"Θέλετε να σαρώσετε %s φακέλους για υπαρκτά έργα Godot;\n"
"Αυτό μπορεί να πάρει κάποια ώρα."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Διαχειριστής"
@@ -9880,6 +10006,17 @@ msgstr ""
"Δεν έχετε κανένα έργο.\n"
"Θέλετε να εξερευνήσετε μερικά επίσημα παραδείγματα στην βιβλιοθήκη πόρων;"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Το κουτί αναζήτησης φιλτράρει έργα βάσει ονόματος και τελικού μέρους της "
+"διαδρομής τους.\n"
+"Για φιλτράρισμα βάσει ονόματος και πλήρης διαδρομής, το ερώτημα πρέπει να "
+"περιέχει τουλάχιστον έναν χαρακτήρα `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Κλειδί "
@@ -10050,7 +10187,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Add Input Action"
-msgstr "Προσθήκη συμβάντος ενέργειας εισόδου"
+msgstr "Προσθήκη Ενέργειας Εισόδου"
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
@@ -10261,14 +10398,25 @@ msgid "Batch Rename"
msgstr "Ομαδική Μετονομασία"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Αντικατάσταση: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Πρόθεμα"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Επίθεμα"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Χρήση Κανονικών Εκφράσεων"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Προχωρημένες Επιλογές"
@@ -10305,11 +10453,12 @@ msgstr ""
"Σύγκριση επιλογών μετρητή."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Μετρητής Ανά Επίπεδο"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Εάν ο μετρητής επανεκκινείται για κάθε ομάδα παιδικών κόμβων"
#: editor/rename_dialog.cpp
@@ -10337,10 +10486,6 @@ msgstr ""
"Τα εναπομείναντα ψηφία συμπληρώνονται με μπροστινά μηδενικά."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Κανονικές Εκφράσεις"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Μετεπεξεργασία"
@@ -10349,12 +10494,12 @@ msgid "Keep"
msgstr "Διατήρηση"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase σε under_scored"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase σε snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored σε CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case σε PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10372,9 +10517,18 @@ msgstr "Κάνε Κεφαλαία"
msgid "Reset"
msgstr "Επαναφορά"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Σφάλμα Κανονικής Εκφράσεως"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Στον χαρακτήρα %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
-msgstr "Επαναπροσδιορισμός γονέα κόμβου"
+msgstr "Επαναπροσδιορισμός Γονέα Κόμβου"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
@@ -10386,7 +10540,7 @@ msgstr "Διατήρηση παγκόσμιου μετασχηματισμού"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent"
-msgstr "Επαναπροσδιορισμός γονέα"
+msgstr "Επαναπροσδιορισμός Γονέα"
#: editor/run_settings_dialog.cpp
msgid "Run Mode:"
@@ -10437,8 +10591,8 @@ msgid "Instance Child Scene"
msgstr "Αρχικοποίηση σκηνής ως παιδί"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Εκκαθάριση Δέσμης Ενεργειών"
+msgid "Detach Script"
+msgstr "Αποσύνδεση Δέσμης Ενεργειών"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10476,6 +10630,10 @@ msgid "Make node as Root"
msgstr "Κάνε κόμβο ρίζα"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Διαγραφή %d κόμβων και τυχών παιδιών τους;"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Διαγραφή %d κόμβων;"
@@ -10489,7 +10647,7 @@ msgstr "Διαγραφή κόμβου \"%s\" και των παιδιών του
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\"?"
-msgstr "Διαγραφή κόμβων \"%s\";"
+msgstr "Διαγραφή κόμβου «%s»;"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10609,6 +10767,16 @@ msgid "Open Documentation"
msgstr "Άνοιγμα Τεκμηρίωσης"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Αδυναμία σύνδεσης δέσμης ενεργειών: Καμία γλώσσα στο μητρώο.\n"
+"Αυτό μπορεί να προκληθεί αν ο επεξεργαστής χτιστεί χωρίς καμία λειτουργική "
+"μονάδα γλώσσας."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Προσθήκη κόμβου ως παιδί"
@@ -10622,7 +10790,7 @@ msgstr "Αλλαγή τύπου"
#: editor/scene_tree_dock.cpp
msgid "Reparent to New Node"
-msgstr "Επαναπροσδιορισμός Γονέα"
+msgstr "Επαναπροσδιορισμός Γονέα σε Νέο Κόμβο"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10634,7 +10802,7 @@ msgstr "Συγχώνευση από σκηνή"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Save Branch as Scene"
-msgstr "Αποθήκευσι κλαδιού ως σκηνή"
+msgstr "Αποθήκευση Κλάδου ως Σκηνή"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
@@ -10657,12 +10825,12 @@ msgstr ""
"υπάρχει πηγαίος κόμβος."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Σύνδεση νέας ή υπαρκτής δέσμης ενεργειών για τον επιλεγμένο κόμβο."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Σύνδεση νέας ή υπαρκτής δέσμης ενεργειών στον επιλεγμένο κόμβο."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Εκκαθάριση δέσμης ενεργειών για τον επιλεγμένο κόμβο."
+msgid "Detach the script from the selected node."
+msgstr "Αποσύνδεση της δέσμης ενεργειών από τον επιλεγμένο κόμβο."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10793,6 +10961,10 @@ msgid "A directory with the same name exists."
msgstr "Υπαρκτός ομώνυμος κατάλογος."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Το αρχείο δεν υπάρχει."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Άκυρη επέκταση."
@@ -10833,6 +11005,10 @@ msgid "File exists, it will be reused."
msgstr "Υπαρκτό αρχείο, θα επαναχρησιμοποιηθεί."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Άκυρη διαδρομή."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Άκυρο όνομα κλάσης."
@@ -10841,8 +11017,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Άκυρο όνομα κληρονομημένου γονέα ή διαδρομή."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Έγκυρη δέσμη ενεργειών."
+msgid "Script path/name is valid."
+msgstr "Άκυρη διαδρομή/όνομα δέσμης ενεργειών."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10865,6 +11041,14 @@ msgid "Script file already exists."
msgstr "Υπαρκτό αρχείο δέσμης ενεργειών."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Σημείωση: Οι ενσωματωμένες δέσμες ενεργειών έχουν περιορισμούς και δεν "
+"μπορούν να ανοιχτούν σε εξωτερικό επεξεργαστή."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Όνομα Κλάσης:"
@@ -10933,6 +11117,10 @@ msgid "Copy Error"
msgstr "Αντιγραφή σφάλματος"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Βίντεο RAM"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Παράλειψη Σημείων Διακοπής"
@@ -10983,8 +11171,8 @@ msgid "Total:"
msgstr "Συνολικά:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Βίντεο μνήμη"
+msgid "Export list to a CSV file"
+msgstr "Εξαγωγή λίστας σε αρχείο CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11880,6 +12068,11 @@ msgstr ""
"διαμόρφωση."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Εσφαλμένη ρύθμιση αποθετηρίου κλειδιών διανομής στην διαμόρφωση εξαγωγής."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Η προσαρμοσμένη δόμηση απαιτεί μια έγκυρη διαδρομή για το Android SDK στις "
@@ -11909,6 +12102,41 @@ msgstr "Άκυρο όνομα πακέτου:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Εσφαλμένη λειτουργική μονάδα «GodotPaymentV3» στην ρύθμιση εργου «Android/"
+"Modules» (άλλαξε στην Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+"Η επιλογή «Use Custom Build» πρέπει να ενεργοποιηθεί για χρήση προσθέτων."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"Το «Degrees Of Freedom» είναι έγκυρο μόνο όταν το «Xr Mode» είναι «Oculus "
+"Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"Το «Hand Tracking» είναι έγκυρο μόνο όταν το «Xr Mode» είναι «Oculus Mobile "
+"VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"Το «Focus Awareness» είναι έγκυρο μόνο όταν το «Xr Mode» είναι «Oculus "
+"Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12056,13 +12284,12 @@ msgid "Invalid splash screen image dimensions (should be 620x300)."
msgstr "Άκυρες διαστάσεις εικόνας οθόνης εκκίνησης (πρέπει να είναι 620x300)."
#: scene/2d/animated_sprite.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
-"Ένας πόρος SpriteFrames πρέπει να έχει δημιουργηθεί ή ορισθεί στην ιδιότητα "
-"'Frames' για να μπορεί το AnimatedSprite να παρουσιάσει frames."
+"Απαιτείται ο ορισμός ενός πόρου SpriteFrames στην ιδιότητα «Frames» για την "
+"εμφάνιση καρέ από το AnimatedSprite."
#: scene/2d/canvas_modulate.cpp
msgid ""
@@ -12074,16 +12301,15 @@ msgstr ""
"θα αγνοηθούν."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Αυτός ο κόμβος δεν έχει παιδιά κόμβους σχήματος, οπότε δεν μπορεί να "
-"αντιδράσει με το περιβάλλον.\n"
-"Σκεφτείτε να προσθέσετε CollisionShape2D ή CollisionPolygon2D για να ορίσετε "
-"το σχήμα του."
+"Αυτός ο κόμβος δεν έχει σχήμα, οπότε δεν μπορεί συγκρουσθεί ή να "
+"αλληλεπιδράσει με άλλα αντικείμενα.\n"
+"Εξετάστε την προσθήκη ενός παιδιού CollisionShape2D ή CollisionPolygon2D για "
+"να ορίσετε το σχήμα του."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -12119,6 +12345,14 @@ msgstr ""
"Ένα σχήμα πρέπει να δοθεί στο CollisionShape2D για να λειτουργήσει. "
"Δημιουργήστε ένα πόρο σχήματος για αυτό!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Τα σχήματα βασισμένα σε πολύγωνα δεν σχεδιάστικαν ώστε να είναι επεξεργάσιμα "
+"από τον κόμβο CollisionShape2D. Χρησιμοποιήστε τον κόμβο CollisionPolygon2D."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12128,11 +12362,10 @@ msgstr ""
"«Particles Animation» ενεργό."
#: scene/2d/light_2d.cpp
-#, fuzzy
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
-msgstr "Μία υφή με το σχήμα του φωτός πρέπει να δοθεί στην ιδιότητα 'texture'."
+msgstr "Μία υφή με το σχήμα του φωτός πρέπει να τεθεί στην ιδιότητα «Texture»."
#: scene/2d/light_occluder_2d.cpp
msgid ""
@@ -12142,11 +12375,10 @@ msgstr ""
"αυτό το εμπόδιο."
#: scene/2d/light_occluder_2d.cpp
-#, fuzzy
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
-"Το πολύγωνο εμποδίου για αυτό το εμπόδιο είναι άδειο. Ζωγραφίστε ένα "
-"πολύγονο!"
+"Το πολύγωνο εμποδίου για αυτό το εμπόδιο είναι άδειο. Παρακαλούμε ζωγραφίστε "
+"ένα πολύγωνο."
#: scene/2d/navigation_polygon.cpp
msgid ""
@@ -12235,63 +12467,55 @@ msgstr ""
"ορίστε την."
#: scene/2d/tile_map.cpp
-#, fuzzy
msgid ""
"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
-"To CollisionShape2D υπάρχει μόνο για να δώσει ένα σχήμα σύγκρουσης σε έναν "
-"κόμβο που προέρχεται από το CollisionObject2D. Χρησιμοποιήστε το μόνο εάν "
-"κληρονομεί τα Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, κλπ, για "
-"να τους δώσετε ένα σχήμα."
+"Το TileMap με το «Use Parent» ενεργό χρειάζεται ένα γονικό CollisionObject2D "
+"στο οποίο θα δίνει σχήματα. Χρησιμοποιήστε το σαν παιδί των Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, κλπ, για να τους δώσετε ένα "
+"σχήμα."
#: scene/2d/visibility_notifier_2d.cpp
-#, fuzzy
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
msgstr ""
-"Το VisibilityEnable2D δουλεύει καλύτερα όταν χρησιμοποιείται μα την ρίζα της "
-"επεξεργασμένης σκηνές κατευθείαν ως γονέας."
+"Το VisibilityEnabler2D δουλεύει καλύτερα όταν η ρίζα της τρέχουσας σκηνής "
+"είναι ο άμεσος γονέας του."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr "Η ARVRCamera πρέπει να έχει έναν κόμβο ARVROrigin ως γονέα"
+msgstr "Η ARVRCamera απαιτεί γονικό κόμβο ARVROrigin."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr "Ο ARVRController πρέπει να έχει έναν κόμβο ARVROrigin ως γονέα"
+msgstr "Ο ARVRController απαιτεί γονικό κόμβο ARVROrigin."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
msgstr ""
-"Ο δείκτης χειριστή δεν πρέπει να είναι 0 για να είναι συνδεδεμένος αυτός ο "
-"χειριστής με έναν υπαρκτό χειριστή"
+"Ο δείκτης χειριστηρίου πρέπει να είναι διάφορος του 0 για να αντιπροσωπεύει "
+"πραγματικό χειριστήριο."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "Ο ARVRAnchor πρέπει να έχει έναν κόμβο ARVROrigin ως γονέα"
+msgstr "Η ARVRAnchor απαιτεί γονικό κόμβο ARVROrigin."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
msgstr ""
-"Ο δείκτης άγκυρας δεν πρέπει να είναι 0 για να είναι συνδεδεμένη αυτή η "
-"άγκυρα με μία υπαρκτή άγκυρα"
+"Ο δείκτης άγκυρας πρέπει να είναι διάφορος του 0 για να αντιπροσωπεύει "
+"πραγματική άγκυρα."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "Το ARVROrigin απαιτεί έναν κόμβο ARVRCamera ως παιδί"
+msgstr "Το ARVROrigin απαιτεί γονικό κόμβο ARVRCamera."
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
@@ -12318,16 +12542,15 @@ msgid "Lighting Meshes: "
msgstr "Φώτηση πλεγμάτων: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Αυτός ο κόμβος δεν έχει παιδιά κόμβους σχήματος, οπότε δεν μπορεί να "
-"αντιδράσει με το περιβάλλον.\n"
-"Σκεφτείτε να προσθέσετε CollisionShape ή CollisionPolygon για να ορίσετε το "
-"σχήμα του."
+"Αυτός ο κόμβος δεν έχει σχήμα, οπότε δεν μπορεί συγκρουσθεί ή να "
+"αλληλεπιδράσει με άλλα αντικείμενα.\n"
+"Εξετάστε την προσθήκη ενός παιδιού CollisionShape ή CollisionPolygon για να "
+"ορίσετε το σχήμα του."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -12356,13 +12579,12 @@ msgstr ""
"δώσετε ένα σχήμα."
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"Ένα σχήμα πρέπει να δοθεί στο CollisionShape για να λειτουργήσει. "
-"Δημιουργήστε ένα πόρο σχήματος για αυτό!"
+"Απαιτείται ένα σχήμα για την λειτουργία του CollisionShape. Παρακαλούμε "
+"δημιουργήστε ένα πόρο σχήματος για αυτό."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12372,11 +12594,16 @@ msgstr ""
"Τα επίπεδα σχήματα δεν λειτουργούν καλά και θα αφαιρεθούν σε μελλοντικές "
"εκδόσεις. Παρακαλώ μην τα χρησιμοποιήσετε."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"Το ConcavePolygonShape δεν υποστηρίζει το RigidBody εκτός της static "
+"λειτουργίας."
+
#: scene/3d/cpu_particles.cpp
-#, fuzzy
msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
-"Τίποτα δεν είναι ορατό, επειδή δεν έχουν οριστεί περάσματα για τα πλέγματα."
+msgstr "Τίποτα δεν είναι ορατό, επειδή δεν έχει οριστεί κανένα πλέγματα."
#: scene/3d/cpu_particles.cpp
msgid ""
@@ -12391,20 +12618,23 @@ msgid "Plotting Meshes"
msgstr "Τοποθέτηση πλεγμάτων"
#: scene/3d/gi_probe.cpp
-#, fuzzy
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
-"Ται GIProbes δεν υποστηρίζονται από το πρόγραμμα οδήγησης οθόνης GLES2.\n"
-"Χρησιμοποιήστε ένα BakedLightmap αντ 'αυτού."
+"Τα GIProbes δεν υποστηρίζονται από το πρόγραμμα οδήγησης οθόνης GLES2.\n"
+"Εναλλακτικά, χρησιμοποιήστε ένα BakedLightmap."
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
-#, fuzzy
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
-"Ένα SpotLight (προβολέας) με γωνία ευρύτερη από 90 μοίρες δεν μπορεί να "
-"δημιουργεί σκιές."
+"Οι προβολείς (SpotLight) με γωνία ευρύτερη των 90 μοιρών δεν μπορούν να "
+"δημιουργήσουν σκιές."
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
@@ -12445,9 +12675,8 @@ msgstr ""
"Mode ίσο με «Particle Billboard»."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr "Το PathFollow2D δουλεύει μόνο όταν κληρονομεί έναν κόμβο Path2D."
+msgstr "Το PathFollow δουλεύει μόνο ως παιδί ενός κόμβου Path."
#: scene/3d/path.cpp
msgid ""
@@ -12468,37 +12697,34 @@ msgstr ""
"Αλλάξτε μέγεθος στα σχήματα σύγκρουσης των παιδιών."
#: scene/3d/remote_transform.cpp
-#, fuzzy
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
-"Η ιδιότητα Path πρέπει να δείχνει σε έναν έγκυρο κόμβο Spatial για να "
-"δουλέψει αυτός ο κόμβος."
+"Η ιδιότητα «Remote Path» πρέπει να δείχνει σε έγκυρο κόμβο Spatial, ή κόμβο "
+"που προκύπτει από Spatial."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
msgstr "Το σώμα αυτό δε θα ληφθεί υπόψιν μέχρι να ορίσετε ένα πλέγμα (mesh)."
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Αλλαγές στο μέγεθος του RigidBody (στις λειτουργίες character ή rigid) θα "
-"αντικατασταθούνε από την μηχανή φυσικής κατά την εκτέλεση.\n"
+"Οι αλλαγές μεγέθους σε SoftBody θα παρακαμφθούν από την μηχανή φυσικής κατά "
+"την εκτέλεση.\n"
"Αλλάξτε μέγεθος στα σχήματα σύγκρουσης των παιδιών."
#: scene/3d/sprite_3d.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
msgstr ""
-"Ένας πόρος SpriteFrames πρέπει να δημιουργηθεί ή ορισθεί στην ιδιότητα "
-"'Frames' για να δείξει frames το AnimatedSprite3D."
+"Απαιτείται ο ορισμός ενός πόρου SpriteFrames στην ιδιότητα «Frames» για την "
+"εμφάνιση καρέ από το AnimatedSprite3D."
#: scene/3d/vehicle_body.cpp
msgid ""
@@ -12536,35 +12762,28 @@ msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr "Στον κόμβο BlendTree «%s», δεν βρέθηκε η κίνηση: «%s»"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Εργαλεία κινήσεων"
+msgstr "Δεν βρέθηκε η κίνηση: «%s»"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "In node '%s', invalid animation: '%s'."
-msgstr "Στον κόμβο '%s', μη έγκυρο animation: '%s'."
+msgstr "Στον κόμβο «%s», άκυρη κίνηση: «%s»."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ΣΦΑΛΜΑ: Μη έγκυρο όνομα κίνησης!"
+msgstr "Άκυρη κίνηση: «%s»."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Αποσύνδεση του '%s' απο το '%s'"
+msgstr "Τίποτα δεν είναι συνδεδεμένο στην είσοδο «%s» του κόμβου «%s»."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
msgstr "Δεν έχει οριστεί ριζικό AnimationNode για το γράφημα."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr ""
-"Επιλέξτε ένα AnimationPlayer από την ιεραρχία της σκηνής για να "
-"επεξεργαστείτε animations."
+msgstr "Δεν έχει οριστεί διαδρομή σε AnimationPlayer με κινήσεις."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
@@ -12572,9 +12791,8 @@ msgstr ""
"Το όρισμα διαδρομής AnimationPlayer δεν οδηγεί σε κόμβο AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
-msgstr "Το δέντρο κίνησης δεν είναι έγκυρο."
+msgstr "Ο ριζικός κόμβος AnimationPlayer δεν είναι έγκυρος."
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
@@ -12592,18 +12810,16 @@ msgstr ""
"RMB: Κατάργηση διαμόρφωσης"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Pick a color from the editor window."
-msgstr "Διαλέξτε ένα χρώμα από την οθόνη."
+msgstr "Επιλέξτε ένα χρώμα από το παράθυρο επεξεργασίας."
#: scene/gui/color_picker.cpp
msgid "HSV"
msgstr "HSV"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Raw"
-msgstr "Παρέκκλιση"
+msgstr "Ωμό"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
@@ -12614,16 +12830,15 @@ msgid "Add current color as a preset."
msgstr "Προσθήκη τρέχοντος χρώματος στα προκαθορισμένα."
#: scene/gui/container.cpp
-#, fuzzy
msgid ""
"Container by itself serves no purpose unless a script configures its "
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
-"Το Container από μόνο του δεν έχει κάποιο σκοπό αν κάποια δέσμη ενεργειών "
+"Ένα Container μόνο του δεν έχει κάποια λειτουργία αν κάποια δέσμη ενεργειών "
"δεν ορίσει την τοποθέτηση των παιδιών του.\n"
-"Εάν δεν σκοπεύετε να προσθέσετε κάποια δέσμη ενεργειών, χρησιμοποιήστε ένα "
-"απλό «Control»."
+"Εάν δεν σκοπεύετε να προσθέσετε κάποια δέσμη ενεργειών, χρησιμοποιήστε ένα "
+"απλό Control."
#: scene/gui/control.cpp
msgid ""
@@ -12643,15 +12858,14 @@ msgid "Please Confirm..."
msgstr "Παρακαλώ επιβεβαιώστε..."
#: scene/gui/popup.cpp
-#, fuzzy
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
-"Οι κόμβοι τύπου Popup θα είναι κρυμμένοι από προεπιλογή, εκτός κι αν "
-"καλέσετε την popup() ή καμία από τις συναρτήσεις popup*(). Το να τους κάνετε "
-"ορατούς κατά την επεξεργασία, όμως, δεν είναι πρόβλημα."
+"Τα αναδυόμενα στοιχεία (Popup) θα είναι κρυμμένα μέχρι την κλήση μιας από "
+"τις συναρτήσεις popup*(). Η εμφάνιση τους για επεξεργασία είναι αποδεκτή, "
+"αλλά θα εξαφανιστούν κατά την εκτέλεση."
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
@@ -12660,16 +12874,15 @@ msgstr ""
"του 0."
#: scene/gui/scroll_container.cpp
-#, fuzzy
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
-"Το ScrollContainer είναι φτιαγμένο για να δουλεύει με ένα μόνο υπο-στοιχείο "
-"control.\n"
-"Χρησιμοποιήστε ένα Container ως παιδί (VBox, HBox, κτλ), ή ένα Control και "
-"ορίστε το προσαρμοσμένο ελάχιστο μέγεθος χειροκίνητα."
+"Το ScrollContainer είναι σχεδιασμένο να λειτουργεί με μοναδικό παιδί τύπου "
+"Control.\n"
+"Χρησιμοποιήστε ένα Container ως παιδί (VBox, HBox, κτλ), ή ένα Control με "
+"προσαρμοσμένο ελάχιστο μέγεθος."
#: scene/gui/tree.cpp
msgid "(Other)"
@@ -12695,20 +12908,23 @@ msgstr ""
"μέγεθος. Αλλιώς, κάντε το ένα RenderTarget και ορίστε το internal texture σε "
"έναν κόμβο για απεικόνιση."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"Το μέγεθος της οπτικής γωνίας πρέπει να είναι μεγαλύτερο του 0 για να γίνει "
+"απόδοση."
+
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "Μη έγκυρη πηγή!"
+msgstr "Άκυρη πηγή για προεπισκόπηση."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Μη έγκυρη πηγή!"
+msgstr "Άκυρη πηγή προγράμματος σκίασης."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "Μη έγκυρη πηγή!"
+msgstr "Άκυρη συνάρτηση σύγκρισης για αυτόν τον τύπο."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -12726,6 +12942,56 @@ msgstr "Τα «varying» μπορούν να ανατεθούν μόνο στη
msgid "Constants cannot be modified."
msgstr "Οι σταθερές δεν μπορούν να τροποποιηθούν."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Πλατφόρμες Συστήματος Αρχείων και Εισαγωγής"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Όταν εξάγετε ή αναπτύσσετε, το παραγόμενο εκτελέσιμο θα προσπαθήσει να "
+#~ "συνδεθεί στην IP αυτού του υπολογιστή για να αποσφαλματωθεί."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Η τρέχουσα σκηνή δεν έχει αποθηκευτεί, αποθηκεύστε πριν να τρέξετε το "
+#~ "πρόγραμμα."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Δεν υπάρχει στην διαδρομή πόρων."
+
+#~ msgid "Revert"
+#~ msgstr "Επαναφορά"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr ""
+#~ "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε με την "
+#~ "επαναφορά;"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Επαναφορά σκηνής"
+
+#~ msgid "Clear Script"
+#~ msgstr "Εκκαθάριση Δέσμης Ενεργειών"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Διαχείριση προβλημάτων"
+
+#~ msgid "Request Docs"
+#~ msgstr "Αίτηση Τεκμηρίωσης"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Βοηθήστε στην βελτίωση της τεκμηρίωσης σχολιάζοντας."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Αντικαταστάθηκαν %d εμφανίσεις."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Δημιουργία στατικού κυρτού σώματος"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Αποτυχία δημιουργίας σχημάτων!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/eo.po b/editor/translations/eo.po
index f8818961c6..68dbd4f436 100644
--- a/editor/translations/eo.po
+++ b/editor/translations/eo.po
@@ -7,18 +7,20 @@
# Teashrock <kajitsu22@gmail.com>, 2019.
# Brandon Dyer <brandondyer64@gmail.com>, 2019.
# Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>, 2019.
+# Sr Half <flavio05@outlook.com>, 2020.
+# Cristian Yepez <cristianyepez@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-11-11 14:19+0000\n"
-"Last-Translator: Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>\n"
+"PO-Revision-Date: 2020-05-22 21:01+0000\n"
+"Last-Translator: Cristian Yepez <cristianyepez@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 3.10-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -27,7 +29,7 @@ msgstr "Nevalida tip-argumento por funkcio convert(). Uzu konstantojn TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Atendas ĉenon de longo 1 (unu karaktero)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -65,31 +67,31 @@ msgstr "En voko al '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "Kib"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "Gib"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -422,7 +424,7 @@ msgstr "Ĝi ne estas ebla adici novan vojeton sen radiko"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Nevalida trako por Bezier (neniu taŭga subproprietaĵoj)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
@@ -529,6 +531,7 @@ msgid "Seconds"
msgstr "Sekundoj"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -639,9 +642,8 @@ msgid "Scale Ratio:"
msgstr "Skali Rejŝo:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "Elekti vojetojn por duplikati:"
+msgstr "Elekti vojetojn por duplikati"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -690,8 +692,9 @@ msgid "Line Number:"
msgstr "Lineo-Numeron:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Anstataŭigis %d apero(j)n."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Anstataŭigi..."
#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
@@ -711,7 +714,7 @@ msgstr "Kongrui Usklon"
msgid "Whole Words"
msgstr "Plenaj Vortoj"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Anstataŭigi"
@@ -762,6 +765,11 @@ msgstr "Metodo en celo nodo devas esti specifita."
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metodo en celo nodo devas esti specifita."
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -845,7 +853,6 @@ msgstr "Ne povas konekti signalo"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -902,6 +909,11 @@ msgid "Signals"
msgstr "Signaloj"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtri nodojn"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -939,7 +951,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Serĉo:"
@@ -1113,6 +1125,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1134,6 +1149,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1340,12 +1363,13 @@ msgid "Open Audio Bus Layout"
msgstr ""
#: editor/editor_audio_buses.cpp
+#, fuzzy
msgid "There is no '%s' file."
-msgstr ""
+msgstr "Neniu '%s' dosiero."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
-msgstr ""
+msgstr "Aranĝo"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
@@ -1358,7 +1382,7 @@ msgstr "Eraro dum ŝargante tiparon."
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr ""
+msgstr "Aldoni Buso"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
@@ -1368,7 +1392,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Load"
-msgstr ""
+msgstr "Ŝarĝi"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
@@ -1438,7 +1462,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1446,16 +1470,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Nevalida dosierindiko."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1483,6 +1499,10 @@ msgstr "Nomo"
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
#, fuzzy
msgid "Updating Scene"
@@ -1607,16 +1627,17 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Enporti dokon"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Dosiersistema kaj enporta dokoj"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Dosiersistemo"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Enporti dokon"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1766,7 +1787,7 @@ msgstr "Montri en dosiermastrumilo"
msgid "New Folder..."
msgstr "Nova dosierujo..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Aktualigi"
@@ -1882,7 +1903,7 @@ msgstr "Dosierujoj kaj dosieroj:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2306,10 +2327,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2399,12 +2416,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "Ne povas reŝarĝi scenon, kiu konservis neniam."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Malfari"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Konservi scenon"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Tiun ĉi agon ne povos malfari. Certe daŭrigi?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2672,10 +2692,6 @@ msgid "Redo"
msgstr "Refari"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Malfari scenon"
-
-#: editor/editor_node.cpp
#, fuzzy
msgid "Miscellaneous project or scene-wide tools."
msgstr "Diversa projekto aŭ sceno-abundaj iloj."
@@ -2739,24 +2755,28 @@ msgstr "Disponigii kun defora sencimigo"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Kiam eksportas aŭ malfaldas, la rezulta plenumebla provos konekti al la IP "
-"de ĉi tiu komputilo por estos sencimigita."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Eta disponigo kun reta dosiersistemo"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Kiam ĉi tiun agordon estas ŝaltita, eksporti aŭ malfaldi produktos minimuman "
"plenumeblan dosieron.\n"
@@ -2769,9 +2789,10 @@ msgid "Visible Collision Shapes"
msgstr "Videblaj koliziaj formoj"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Koliziaj formoj kaj radĵetaj nodoj (por 2D kaj 3D) estos videblaj en la "
"rulas ludo, se ĉi tiu agordo estas ŝaltita."
@@ -2781,38 +2802,43 @@ msgid "Visible Navigation"
msgstr "Videbla navigacio"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigaciaj maŝoj kaj poligonoj estos videblaj en la rulas ludo, se ĉi tiu "
"agordo estas ŝaltita."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sinkronigi scenan ŝanĝojn"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Kiam tuin ĉi agordo estas ŝaltita, iuj ŝanĝoj ke faris al la scenon en la "
"editilo replikos en la rulas ludo.\n"
"Kiam uzantis malproksime en aparato, estas pli efika kun reta dosiersistemo."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sinkronigi skriptajn ŝanĝojn"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Kiam tuin ĉi agordo estas ŝaltita, iun skripton ke konservita, estos "
"reŝarĝita en la rulas ludo.\n"
@@ -2875,7 +2901,7 @@ msgstr "Helpo"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Serĉo"
@@ -2890,7 +2916,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3276,7 +3306,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3303,6 +3334,10 @@ msgstr "Ne povis ruli skripto:"
msgid "Did you forget the '_run' method?"
msgstr "Ĉu vi forgesis la '_run' metodo?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
#, fuzzy
msgid "Select Node(s) to Import"
@@ -3895,19 +3930,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+#, fuzzy
+msgid "%d Files"
+msgstr "Trovi en dosierojn"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3923,7 +3963,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3957,10 +3997,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -5009,7 +5045,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5747,11 +5783,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Ne povis krei dosierujon."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5763,11 +5800,28 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "Ne povis krei dosierujon."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5819,11 +5873,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5831,6 +5914,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6670,15 +6761,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Helpi plibonigi la Godotan dokumentadon per doni reagon."
-
-#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Search the reference documentation."
msgstr "Serĉi la referencan dokumentadon."
@@ -6741,11 +6823,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7110,6 +7192,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7198,17 +7284,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7545,7 +7640,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8203,7 +8298,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9294,11 +9389,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9306,11 +9406,11 @@ msgid "Please choose an empty folder."
msgstr "Bonvolu, elektu malplenan dosierujon."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9539,6 +9639,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9586,6 +9687,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9963,11 +10071,20 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Anstataŭigi: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10005,11 +10122,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10035,10 +10152,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10047,11 +10160,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10070,6 +10183,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10133,8 +10254,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Krei skripton"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10170,6 +10292,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Forigi Ŝlosilo(j)n"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Forigi Ŝlosilo(j)n"
@@ -10293,6 +10420,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10339,11 +10473,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10463,6 +10597,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Nevalida kromprogramo."
@@ -10503,6 +10641,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Nevalida dosierindiko."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10511,7 +10653,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10536,6 +10678,12 @@ msgid "Script file already exists."
msgstr "Grupa nomo jam ekzistas."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Nomo:"
@@ -10610,6 +10758,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10658,7 +10810,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11535,6 +11687,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11558,6 +11714,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11736,6 +11918,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11923,6 +12111,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11943,6 +12136,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12162,6 +12360,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12190,7 +12392,33 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "Konstantoj ne povas esti modifitaj."
+
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Dosiersistema kaj enporta dokoj"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Kiam eksportas aŭ malfaldas, la rezulta plenumebla provos konekti al la "
+#~ "IP de ĉi tiu komputilo por estos sencimigita."
+
+#~ msgid "Revert"
+#~ msgstr "Malfari"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Tiun ĉi agon ne povos malfari. Certe daŭrigi?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Malfari scenon"
+
+#, fuzzy
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Helpi plibonigi la Godotan dokumentadon per doni reagon."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Anstataŭigis %d apero(j)n."
#, fuzzy
#~ msgid "Brief Description"
diff --git a/editor/translations/es.po b/editor/translations/es.po
index 7ae1e60572..fa8391cf89 100644
--- a/editor/translations/es.po
+++ b/editor/translations/es.po
@@ -12,13 +12,13 @@
# David Couto <davidcouto@gmail.com>, 2017.
# Dharkael <izhe@hotmail.es>, 2017, 2019.
# Diego López <diegodario21@gmail.com>, 2017.
-# eon-s <emanuel.segretin@gmail.com>, 2018, 2019.
+# eon-s <emanuel.segretin@gmail.com>, 2018, 2019, 2020.
# Gustavo Leon <gleondiaz@gmail.com>, 2017-2018.
# Javier Ocampos <xavier.ocampos@gmail.com>, 2018, 2019, 2020.
# Jose Maria Martinez <josemar1992@hotmail.com>, 2018.
# Juan Quiroga <juanquiroga9@gmail.com>, 2017.
# Kiji Pixel <raccoon.fella@gmail.com>, 2017.
-# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017, 2019.
+# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017, 2019, 2020.
# Lonsfor <lotharw@protonmail.com>, 2017-2018.
# Mario Nachbaur <manachbaur@gmail.com>, 2018.
# Oscar Carballal <oscar.carballal@protonmail.com>, 2017-2018.
@@ -42,12 +42,21 @@
# roger <616steam@gmail.com>, 2019.
# Dario <darlex259@gmail.com>, 2019.
# Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2019.
+# Julián Luini <jluini@gmail.com>, 2020.
+# Victor S. <victorstancioiu@gmail.com>, 2020.
+# henry rujano herrera <rujhen@gmail.com>, 2020.
+# Megamega53 <Christopher.Morales21@myhunter.cuny.edu>, 2020.
+# Serk Lintur <serk.lintur@gmail.com>, 2020.
+# Pedro J. Estébanez <pedrojrulez@gmail.com>, 2020.
+# paco <pacosoftfree@protonmail.com>, 2020.
+# Jonatan <arandajonatan94@tuta.io>, 2020.
+# ACM <albertocm@tuta.io>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
-"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
+"PO-Revision-Date: 2020-09-12 00:46+0000\n"
+"Last-Translator: ACM <albertocm@tuta.io>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot/es/>\n"
"Language: es\n"
@@ -55,12 +64,13 @@ 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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Argumento de tipo inválido para convert(), utiliza constantes TYPE_*."
+msgstr ""
+"Tipo de argumento inválido para 'convert()', utiliza constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
@@ -71,11 +81,12 @@ msgstr "Se esperaba un string de longitud 1 (un carácter)."
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
-"No hay suficientes bytes para decodificar bytes, o el formato es invalido."
+"No hay suficientes bytes para decodificar los bytes, o el formato es "
+"inválido."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Entrada inválida %i (no pasó) en la expresión"
+msgstr "Entrada inválida %i (no aprobada) en la expresión"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -88,11 +99,11 @@ msgstr "Operandos inválidos para el operador %s, %s y %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "Indice inválido de tipo %s para tipo base %s"
+msgstr "Índice inválido de tipo %s para el tipo base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr "El índice de nombre «%s» no es válido para el tipo de base %s"
+msgstr "El índice de nombre '%s' no es válido para el tipo de base %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
@@ -570,6 +581,7 @@ msgid "Seconds"
msgstr "Segundos"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -613,11 +625,11 @@ msgstr "Eliminar Selección"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
-msgstr "Ir al Paso Siguiente"
+msgstr "Ir al Siguiente Paso"
#: editor/animation_track_editor.cpp
msgid "Go to Previous Step"
-msgstr "Ir al Paso Anterior"
+msgstr "Ir al Anterior Paso"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -729,8 +741,8 @@ msgid "Line Number:"
msgstr "Número de Línea:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocurrencia(s) reemplazada(s)."
+msgid "%d replaced."
+msgstr "%d reemplazado."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -748,7 +760,7 @@ msgstr "Coincidir Mayús./Minús."
msgid "Whole Words"
msgstr "Palabras Completas"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Reemplazar"
@@ -798,6 +810,10 @@ msgid "Method in target node must be specified."
msgstr "Se debe establecer un método en el nodo destino."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "El nombre del método debe ser un identificador válido."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -840,7 +856,7 @@ msgstr "Eliminar"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "Añadir Argumento de Llamada Extra:"
+msgstr "Añadir Argumento Extra de Llamada:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
@@ -881,7 +897,6 @@ msgstr "No se puede conectar la señal"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -939,6 +954,11 @@ msgid "Signals"
msgstr "Señales"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrar tiles"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
"¿Estás seguro/a que quieres eliminar todas las conexiones de esta señal?"
@@ -977,7 +997,7 @@ msgid "Recent:"
msgstr "Recientes:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Buscar:"
@@ -1159,9 +1179,12 @@ msgstr "Fundadores del Proyecto"
msgid "Lead Developer"
msgstr "Desarrollador Principal"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr "Administrador del Proyecto "
+msgstr "Gestor del Proyecto "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1180,6 +1203,14 @@ msgid "Gold Sponsors"
msgstr "Patrocinadores Oro"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Patrocinadores Plata"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Patrocinadores Bronce"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Patrocinadores"
@@ -1487,7 +1518,7 @@ msgstr "Mover Autoload"
msgid "Remove Autoload"
msgstr "Eliminar Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Activar"
@@ -1495,17 +1526,9 @@ msgstr "Activar"
msgid "Rearrange Autoloads"
msgstr "Reordenar Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Ruta inválida."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "El archivo no existe."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "No está en la ruta de recursos."
+msgid "Can't add autoload:"
+msgstr "No se puede añadir un autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1532,6 +1555,10 @@ msgstr "Nombre"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Pegar Parámetros"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Actualizando Escena"
@@ -1661,16 +1688,17 @@ msgid "Scene Tree Editing"
msgstr "Editor del Árbol de Escenas"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importación"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Nodos"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Sistema de Archivo e Importación"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Sistema de Archivos"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importación"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1755,7 +1783,7 @@ msgstr "Nuevo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "Importar"
+msgstr "Importación"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
@@ -1822,7 +1850,7 @@ msgstr "Mostrar en Explorador de Archivos"
msgid "New Folder..."
msgstr "Nueva Carpeta..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Recargar"
@@ -1936,7 +1964,7 @@ msgstr "Directorios y Archivos:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Vista Previa:"
@@ -1966,7 +1994,7 @@ msgstr "(Re)Importando Assets"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr "Cima"
+msgstr "Superior"
#: editor/editor_help.cpp
msgid "Class:"
@@ -2011,7 +2039,7 @@ msgstr "Propiedades del Tema"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "Enumeraciones"
+msgstr "Enumerados"
#: editor/editor_help.cpp
msgid "Constants"
@@ -2019,7 +2047,7 @@ msgstr "Constantes"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr "Descripción de Propiedades"
+msgstr "Descripciones de Propiedad"
#: editor/editor_help.cpp
msgid "(value)"
@@ -2035,18 +2063,15 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Descripción de Métodos"
+msgstr "Descripciones de Métodos"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"Actualmente no hay una descripción para este método. Por favor, ¡ayúdanos "
-"[color=$color][url=$url]aportando una[/url][/color]!\n"
-"\n"
-"Actualmente no existe descripción para este método. Por favor ¡ayúdanos "
-"[color=$color][url=$url]contribuyendo una[/url][/color]!"
+"Actualmente no existe descripción para este método. Por favor ¡ayúdanos con "
+"[color=$color][url=$url] contribuyendo con una[ /url][/color]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -2378,11 +2403,6 @@ msgid "There is no defined scene to run."
msgstr "No hay escena definida para ejecutar."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"La escena actual nunca se guardó. Por favor, guárdela antes de ejecutar."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "¡No se pudo comenzar el subproceso!"
@@ -2445,7 +2465,7 @@ msgstr "Esta operación no puede realizarse sin una escena."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr "Exportar Librería de Meshes"
+msgstr "Exportar Librería de Mallas"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
@@ -2468,12 +2488,17 @@ msgid "Can't reload a scene that was never saved."
msgstr "No se puede volver a cargar una escena que nunca se guardó."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Revertir"
+msgid "Reload Saved Scene"
+msgstr "Recargar Escena Guardada"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Esta acción no se puede deshacer. ¿Revertir de todos modos?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"La escena actual tiene cambios sin guardar.\n"
+"¿Quieres recargar la escena guardada igualmente? Esta acción no puede "
+"deshacerse."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2683,7 +2708,7 @@ msgstr "Posición del Dock"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr "Modo sin distracciones"
+msgstr "Modo Sin Distracciones"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
@@ -2707,11 +2732,11 @@ msgstr "Copiar Texto"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr "Pestaña siguiente"
+msgstr "Siguiente pestaña"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "Pestaña anterior"
+msgstr "Anterior pestaña"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -2768,10 +2793,6 @@ msgid "Redo"
msgstr "Rehacer"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Revertir Escena"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Herramientas variadas de proyecto o escena."
@@ -2831,24 +2852,28 @@ msgstr "Exportar con Depuración Remota"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Al exportar o distribuir, el ejecutable generado intentará conectarse a la "
-"IP de este equipo para ser depurado."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Exportación Mini con Recursos en Red"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Cuando esta opción está activa, al exportar o publicar se creará un "
"ejecutable mínimo.\n"
@@ -2861,35 +2886,39 @@ msgid "Visible Collision Shapes"
msgstr "Ver Formas de Colisión"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
-"Los Collision shapes y nodos raycast (para 2D y 3D) serán visibles durante "
-"la ejecución del juego cuando esta opción queda activada."
+"Las formas de colisión y los nodos raycast (para 2D y 3D) serán visibles "
+"durante la ejecución del juego si esta opción está activada."
#: editor/editor_node.cpp
msgid "Visible Navigation"
msgstr "Navegación Visible"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
-"Si activas esta opción podrás ver las mallas y polígonos de navegación "
-"durante la ejecución del juego."
+"Las mallas de navegación y los polígonos serán visibles durante la ejecución "
+"del juego si esta opción está activada."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sincronizar cambios de escena"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Cuando esta opción este activada, cualquier cambio hecho a la escena en el "
"editor sera replicado en el juego en ejecución.\n"
@@ -2897,15 +2926,17 @@ msgstr ""
"sistema de archivos remoto."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sincronizar Cambios en Scripts"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Cuando esta opción esté activa, cualquier script que se guarde se volverá a "
"cargar en el juego en ejecución.\n"
@@ -2971,7 +3002,7 @@ msgstr "Ayuda"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Buscar"
@@ -2985,8 +3016,12 @@ msgid "Q&A"
msgstr "Preguntas y respuestas"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Registro de problemas"
+msgid "Report a Bug"
+msgstr "Reportar un Bug"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Enviar Feedback de la Documentación"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3034,7 +3069,7 @@ msgstr "Reproducir Escena Personalizada"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr "Cambiar el driver de video requiere reiniciar el editor."
+msgstr "Cambiar el driver de vídeo requiere reiniciar el editor."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
@@ -3097,12 +3132,14 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
-"Una vez hecho ésto puedes 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 opción \"Usar Build Personalizado\" debería estar activada "
-"en el preset de exportación de Android."
+"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 \"Use Custom Build\" debería estar "
+"habilitada en la configuración de exportación de Android."
#: editor/editor_node.cpp
msgid ""
@@ -3182,7 +3219,7 @@ msgstr "No se encontró ningún sub-recurso."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr "Creando Vistas Previas de Mesh/es"
+msgstr "Creando Previsualización de Mallas"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
@@ -3371,7 +3408,7 @@ msgstr "Página: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr "Eliminar Item"
+msgstr "Eliminar Ítem"
#: editor/editor_properties_array_dict.cpp
msgid "New Key:"
@@ -3386,9 +3423,11 @@ msgid "Add Key/Value Pair"
msgstr "Agregar Par Clave/Valor"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"No se ha encontrado ningún preset de exportación ejecutable para esta "
"plataforma.\n"
@@ -3418,6 +3457,12 @@ msgstr "No se pudo ejecutar el script:"
msgid "Did you forget the '_run' method?"
msgstr "Te olvidaste del método '_run'?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Mantén pulsado Ctrl para redondear a enteros. Mantén pulsado Shift para "
+"cambios más precisos."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Selecciona nodo(s) a importar"
@@ -3998,7 +4043,7 @@ msgstr "Generando Lightmaps"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr "Generando para Mesh: "
+msgstr "Generando para la Malla: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
@@ -4018,10 +4063,18 @@ msgid "Error running post-import script:"
msgstr "Error ejecutando el script de posimportacion:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "¿Devolviste un objeto derivado de Node en el método `post_import()`?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Guardando..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d archivos"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Establecer como predeterminado para '%s'"
@@ -4030,10 +4083,6 @@ msgid "Clear Default for '%s'"
msgstr "Restablecer Predeterminado para '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Archivos"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importar como:"
@@ -4046,8 +4095,8 @@ msgid "Reimport"
msgstr "Reimportar"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Guardar escenas, reimportar y reiniciar"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Guardar Escenas, Reimportar y Reiniciar"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4082,10 +4131,6 @@ msgid "Copy Params"
msgstr "Copiar Parámetros"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Pegar Parámetros"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Editar Portapapeles de Recursos"
@@ -4351,7 +4396,7 @@ msgstr "No hay ningún triángulo, así que no se puede hacer blending."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Toggle Auto Triangles"
-msgstr "Act./Desact. Auto Triángulos"
+msgstr "Act./Desact. Triángulos Automáticos"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
@@ -4363,7 +4408,8 @@ msgstr "Borrar puntos y triángulos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr "Generar triángulos de blending automáticamente (en vez de manualmente)"
+msgstr ""
+"Generar triángulos combinados automáticamente (en lugar de manualmente)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -5144,8 +5190,8 @@ msgid ""
"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
"Light' flag is on."
msgstr ""
-"No hay meshes para hacer bake. Asegúrate que contienen un canal UV2 y que el "
-"flag 'Bake Light' esta activado."
+"No hay mallas para hacer bake. Asegúrate que contengan un canal UV2 y que la "
+"opción de 'Bake Light' está activada."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Failed creating lightmap images, make sure path is writable."
@@ -5158,7 +5204,7 @@ msgid "Bake Lightmaps"
msgstr "Bake Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Vista Previa"
@@ -5420,7 +5466,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Resetear el Zoom"
+msgstr "Resetear Zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5448,17 +5494,17 @@ msgstr "Alt + Clic Derecho: Selección en listado de solapamientos"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
-msgstr "Modo Movimiento"
+msgstr "Modo de Movimiento"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Modo Rotación"
+msgstr "Modo de Rotación"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
-msgstr "Modo Escalado"
+msgstr "Modo de Escalado"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5480,7 +5526,7 @@ msgstr "Modo desplazamiento lateral"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Ruler Mode"
-msgstr "Modo Regla"
+msgstr "Modo de Regla"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
@@ -5671,7 +5717,7 @@ msgstr "Clave de animación y Opciones de Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr "Insertar clave (pistas existentes)"
+msgstr "Insertar Clave (Pistas Existentes)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -5808,7 +5854,7 @@ msgstr "CPUParticles"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emission Points From Mesh"
-msgstr "Crear Puntos de Emisión Desde Mesh"
+msgstr "Crear Puntos de Emisión desde la Malla"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -5893,15 +5939,15 @@ msgstr "Degradado Editado"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
-msgstr "Elemento %d"
+msgstr "Ítem %d"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Items"
-msgstr "Elementos"
+msgstr "Ítems"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item List Editor"
-msgstr "Editor de Lista de Items"
+msgstr "Editor de Lista de Ítems"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
@@ -5909,15 +5955,15 @@ msgstr "Crear Polígono Oclusor"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
-msgstr "¡El Mesh está vacío!"
+msgstr "¡La malla está vacía!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Crear StaticBody Triangular"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "No se pudo crear una forma de colisión Triangular."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Crear Static Convex Body"
+msgid "Create Static Trimesh Body"
+msgstr "Crear StaticBody Triangular"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5925,31 +5971,51 @@ msgstr "¡No puedes hacer esto en una escena raíz!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Shape"
-msgstr "Crear Shape Estático Triangular"
+msgstr "Crear Forma Estática Triangular"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"No se pudo crear una única forma de colisión convexa para la raíz de la "
+"escena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "No pudo crear una única forma de colisión convexa."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "¡Falló en la creación de los shapes!"
+msgid "Create Single Convex Shape"
+msgstr "Crear una Única Forma Convexa"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Crear Shape(s) Convexo(s)"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"No se pudieron crear múltiples formas de colisión convexas para la raíz de "
+"la escena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "No pudo crear ninguna forma de colisión."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Crear Múltiples Formas Convexas"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
-msgstr "Crear Navigation Mesh"
+msgstr "Crear Malla de Navegación"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr "El Mesh contenedor no es del tipo ArrayMesh."
+msgstr "La Malla contenedora no es del tipo ArrayMesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr "Fallo el UV Unwrap ¿el mesh podría no ser manifold?"
+msgstr "Fallo del UV Unwrap ¿la malla podría no ser múltiple?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
-msgstr "No hay meshes para depurar."
+msgstr "No hay mallas para depurar."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Model has no UV in this layer"
@@ -5957,15 +6023,15 @@ msgstr "El modelo no tiene UV en esta capa"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
-msgstr "¡MeshInstance le falta un Mesh!"
+msgstr "¡MeshInstance carece de una Malla!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh has not surface to create outlines from!"
-msgstr "¡El mesh no tiene una superficie de donde crear contornos!"
+msgstr "¡La malla no tiene una superficie para crear contornos!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr "¡El tipo primitivo de mesh no es PRIMITIVE_TRIANGLES!"
+msgstr "¡El tipo primitivo de malla no es PRIMITIVE_TRIANGLES!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
@@ -5977,23 +6043,73 @@ msgstr "Crear Outline"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
-msgstr "Mesh"
+msgstr "Malla"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Body"
msgstr "Crear StaticBody Triangular"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crea un StaticBody y le asigna automáticamente una forma de colisión basada "
+"en polígonos.\n"
+"Es la opción más precisa (pero la más lenta) para la detección de colisiones."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Crear Collider Triangular Hermano"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Crear Collider Convexo Hermano(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crea una forma de colisión basada en polígonos.\n"
+"Es la opción más precisa (pero la más lenta) para la detección de colisiones."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Crear Collider Convexo Único Hermano"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Crea una única forma de colisión convexa.\n"
+"Es la opción más rápida (pero menos precisa) para la detección de colisiones."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Crear Múltiples Collider Convexos Hermanos"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Crea una forma de colisión basada en polígonos.\n"
+"Este es un punto medio de rendimiento entre las dos opciones anteriores."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
-msgstr "Crear Outline Mesh..."
+msgstr "Crear Malla de Contorno..."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Crea una malla de contorno estático. La malla de contorno tendrá sus "
+"normales invertidas automáticamente.\n"
+"Esto puede ser usado en lugar de la propiedad Grow de SpatialMaterial cuando "
+"el uso de esa propiedad no sea posible."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
@@ -6009,7 +6125,7 @@ msgstr "Desenvuelva UV2 para Lightmap/AO"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh"
-msgstr "Crear Outline Mesh"
+msgstr "Crear Malla de Contorno"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Outline Size:"
@@ -6021,7 +6137,7 @@ msgstr "Depuración del Canal UV"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
-msgstr "¿Quieres borrar el elemento %d?"
+msgstr "¿Eliminar el ítem %d?"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid ""
@@ -6033,16 +6149,16 @@ msgstr ""
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Mesh Library"
-msgstr "Librería de Meshes"
+msgstr "Librería de Mallas"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Item"
-msgstr "Añadir Item"
+msgstr "Añadir Ítem"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove Selected Item"
-msgstr "Borrar elemento seleccionado"
+msgstr "Eliminar Ítem Seleccionado"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import from Scene"
@@ -6055,23 +6171,27 @@ msgstr "Actualizar desde escena"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
msgstr ""
-"No se especificó mesh de origen (y no hay MultiMesh establecido en el nodo)."
+"No se ha especificado una malla de origen (y no se ha establecido un "
+"MultiMesh en el nodo)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr "No se especificó mesh de origen (y MultiMesh no contiene ningún Mesh)."
+msgstr ""
+"No se ha especificado una malla de origen (y MultiMesh no contiene ninguna "
+"Malla)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
-msgstr "Mesh de origen inválido (ruta inválida)."
+msgstr "El origen de la malla es inválido (ruta inválida)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr "Mesh de origen inválido (no es un MeshInstance)."
+msgstr "El origen de la malla es inválido (no es un MeshInstance)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr "Mesh de origen inválido (no contiene ningún recurso Mesh)."
+msgstr ""
+"El origen de la malla es inválido (no contiene ningún recurso de Malla)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No surface source specified."
@@ -6091,7 +6211,7 @@ msgstr "El origen de la superficie no es correcto (sin caras)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
-msgstr "Selecciona una Mesh de Origen:"
+msgstr "Selecciona una Malla de Origen:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Target Surface:"
@@ -6103,7 +6223,7 @@ msgstr "Llenar superficie"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate MultiMesh"
-msgstr "Llenar MultiMesh"
+msgstr "Rellenar MultiMesh"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
@@ -6111,7 +6231,7 @@ msgstr "Superficie objetivo:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
-msgstr "Mesh de Origen:"
+msgstr "Malla de Origen:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
@@ -6127,7 +6247,7 @@ msgstr "Eje-Z"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh Up Axis:"
-msgstr "Eje Superior del Mesh:"
+msgstr "Eje Superior de la Malla:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Rotation:"
@@ -6773,7 +6893,7 @@ msgstr "Guardar Todo"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "Recargar parcialmente el script"
+msgstr "Recargar Parcialmente el Script"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
@@ -6781,7 +6901,7 @@ msgstr "Copiar Ruta del Script"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Previous"
-msgstr "Previo en Historial"
+msgstr "Previo en el Historial"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -6818,11 +6938,11 @@ msgstr "Ejecutar"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
-msgstr "Step Into"
+msgstr "Entrar En"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
-msgstr "Step Over"
+msgstr "Salir de Aquí"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
@@ -6846,14 +6966,6 @@ msgid "Open Godot online documentation."
msgstr "Abrir la documentación en línea de Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Solicitar Documentos"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Ayuda a mejorar la documentación de Godot aportando retroalimentación."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Buscar en la documentación de referencia."
@@ -6919,12 +7031,12 @@ msgstr ""
"'%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Línea"
+msgid "[Ignore]"
+msgstr "[Ignorar]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignorar)"
+msgid "Line"
+msgstr "Línea"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7038,15 +7150,15 @@ msgstr "Eliminar Espacios Sobrantes al Final"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
-msgstr "Convertir Indentación en Espacios"
+msgstr "Convertir Sangría en Espacios"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Tabs"
-msgstr "Convertir Indentación en Tabulaciones"
+msgstr "Convertir Sangría en Tabulaciones"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "Autoindentar"
+msgstr "Auto Sangría"
#: editor/plugins/script_text_editor.cpp
msgid "Find in Files..."
@@ -7066,7 +7178,7 @@ msgstr "Ir al Siguiente Marcador"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Bookmark"
-msgstr "Ir al Marcador Anterior"
+msgstr "Ir al Anterior Marcador"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Bookmarks"
@@ -7083,19 +7195,19 @@ msgstr "Ir a Línea..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Act./Desact. Breakpoint"
+msgstr "Cambiar Punto de Ruptura"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Eliminar Todos los Breakpoints"
+msgstr "Eliminar Todos los Puntos de Ruptura"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Breakpoint"
-msgstr "Ir al Siguiente Breakpoint"
+msgstr "Ir al Siguiente Punto de Ruptura"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Breakpoint"
-msgstr "Ir al Breakpoint Anterior"
+msgstr "Ir al Anterior Punto de Ruptura"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -7275,11 +7387,11 @@ msgstr "Detrás"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "Alinear Transform con Vista"
+msgstr "Alinear la Transformación con la Vista"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
-msgstr "Alinear Rotación con Vista"
+msgstr "Alinear la Rotación con la Vista"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -7290,6 +7402,10 @@ msgid "This operation requires a single selected node."
msgstr "Esta operación requiere un solo nodo seleccionado."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Auto Ortogonal Activado"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Bloquear Rotación de Vista"
@@ -7359,7 +7475,7 @@ msgstr "Vista Libre Frontal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Vista Libre Posterior"
+msgstr "Vista Libre Trasera"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
@@ -7378,6 +7494,10 @@ msgid "Freelook Slow Modifier"
msgstr "Modificador de Velocidad de Vista Libre"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Bloquear Rotación de Vista"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7386,14 +7506,25 @@ msgstr ""
"No se puede utilizar como un indicador fiable del rendimiento en el juego."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Bloquear Rotación de Vista"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Diálogo XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Haz clic para alternar entre los estados de visibilidad.\n"
+"\n"
+"Ojo abierto: El gizmo es visible.\n"
+"Ojo cerrado: El gizmo está oculto.\n"
+"Ojo medio abierto: El gizmo también es visible a través de superficies "
+"opacas (\"x-ray\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Ajustar Nodos al Suelo"
@@ -7429,7 +7560,7 @@ msgstr "Vista Superior"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr "Vista Posterior"
+msgstr "Vista Trasera"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
@@ -7619,11 +7750,12 @@ msgstr "¡El sprite esta vacío!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr "No se puede convertir a mesh un sprite que usa frames de animación."
+msgstr ""
+"No se puede convertir en malla un sprite usando fotogramas de animación."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr "Geometría inválida, no se puede reemplazar por mesh."
+msgstr "Geometría inválida, no puede ser reemplazada por una malla."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Mesh2D"
@@ -7730,7 +7862,8 @@ msgid "New Animation"
msgstr "Nueva Animación"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Velocidad (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7747,7 +7880,7 @@ msgstr "Añadir Textura desde Archivo"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr "Añadir Frames de un Sprite Sheet"
+msgstr "Añadir Frames desde un Sprite Sheet"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
@@ -7836,7 +7969,7 @@ msgstr "Región de Textura"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
-msgstr "Añadir Todos los Elementos"
+msgstr "Añadir Todos los Ítems"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All"
@@ -7860,11 +7993,11 @@ msgstr "Menú de edición de tema."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
-msgstr "Añadir elementos de clase"
+msgstr "Añadir Clases de Ítems"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Class Items"
-msgstr "Eliminar Ítems de Clases"
+msgstr "Eliminar Clases de Ítems"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Template"
@@ -8046,7 +8179,7 @@ msgstr "Asignar un recurso TileSet a este TileMap para usas sus tiles."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Dibujar tile"
+msgstr "Dibujar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
@@ -8154,35 +8287,35 @@ msgstr "Índice Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region Mode"
-msgstr "Modo Región"
+msgstr "Modo de Región"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Collision Mode"
-msgstr "Modo Colisión"
+msgstr "Modo de Colisión"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Occlusion Mode"
-msgstr "Modo Oclusión"
+msgstr "Modo de Oclusión"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Navigation Mode"
-msgstr "Modo Navegación"
+msgstr "Modo de Navegación"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Bitmask Mode"
-msgstr "Modo Bitmask"
+msgstr "Modo de Bitmask"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Priority Mode"
-msgstr "Modo Prioridad"
+msgstr "Modo de Prioridad"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon Mode"
-msgstr "Modo Icono"
+msgstr "Modo de Icono"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Z Index Mode"
-msgstr "Modo Índice Z"
+msgstr "Modo de Índice Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
@@ -8381,11 +8514,11 @@ msgstr "Editar Índice Z de Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Convex"
-msgstr "Crear Convexo"
+msgstr "Hacerlo Convexo"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Concave"
-msgstr "Crear Cóncavo"
+msgstr "Hacerlo Cóncavo"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Collision Polygon"
@@ -8407,7 +8540,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "No hay addons de VCS disponibles."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Error"
@@ -8843,7 +8976,7 @@ msgstr "Devuelve el valor absoluto del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr "Devuelve el arcocoseno del parámetro."
+msgstr "Devuelve el arco-coseno del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
@@ -8851,7 +8984,7 @@ msgstr "Devuelve el coseno hiperbólico inverso del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr "Devuelve el arcoseno del parámetro."
+msgstr "Devuelve el arco-seno del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
@@ -8859,11 +8992,11 @@ msgstr "Devuelve el seno hiperbólico inverso del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr "Devuelve el arcotangente del parámetro."
+msgstr "Devuelve el arco-tangente del parámetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr "Devuelve el arcotangente de los parámetros."
+msgstr "Devuelve el arco-tangente de los parámetros."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
@@ -8892,11 +9025,11 @@ msgstr "Convierte una cantidad en radianes a grados."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
-msgstr "Exponencial en base e."
+msgstr "Exponencial con Base-e."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 Exponential."
-msgstr "Exponencial en base 2."
+msgstr "Exponencial con base 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
@@ -8916,7 +9049,7 @@ msgstr "Logaritmo natural."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr "Logaritmo de la base 2."
+msgstr "Logaritmo Base-2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
@@ -9293,7 +9426,7 @@ msgid ""
msgstr ""
"Los retornos decrecen en función del producto punto de la superficie normal "
"y de la dirección de visión de la cámara (pasando las entradas asociadas a "
-"esta)."
+"este)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9371,7 +9504,7 @@ msgstr "Editar Propiedad Visual"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Mode Changed"
-msgstr "Cambiar Modo de Visual Shader"
+msgstr "El Modo de Visual Shader ha cambiado"
#: editor/project_export.cpp
msgid "Runnable"
@@ -9442,7 +9575,7 @@ msgid ""
"Only one preset per platform may be marked as runnable."
msgstr ""
"Si se selecciona, la plantilla estará disponible para su uso en un "
-"despliegue con “un click”.\n"
+"despliegue con un clic.\n"
"Sólo se puede marcar como ejecutable una plantilla por plataforma."
#: editor/project_export.cpp
@@ -9459,11 +9592,11 @@ msgstr "Exportar todos los recursos del proyecto"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
-msgstr "Exportar las escenas seleccionadas (incluyendo dependencias)"
+msgstr "Exportar escenas seleccionadas (y dependencias)"
#: editor/project_export.cpp
msgid "Export selected resources (and dependencies)"
-msgstr "Exportar los recursos seleccionado (incluyendo dependencias)"
+msgstr "Exportar los recursos seleccionados (y dependencias)"
#: editor/project_export.cpp
msgid "Export Mode:"
@@ -9578,24 +9711,30 @@ msgid "Export With Debug"
msgstr "Exportar Con Depuración"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "La ruta no existe."
+msgid "The path specified doesn't exist."
+msgstr "La ruta especificada no existe."
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Error al abrir el archivo del paquete (no está en formato ZIP)."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"Archivo de projecto '.zip' inválido, no contiene un archivo 'project.godot'."
+"Archivo de proyecto \".zip\" inválido; no contiene un archivo \"project.godot"
+"\"."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Por favor elija una carpeta vacía."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Por favor selecciona un archivo 'project.godot' o '.zip'."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Por favor, elige un archivo \"project.godot\" o \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr "El directorio ya contiene un proyecto de Godot."
#: editor/project_manager.cpp
@@ -9858,6 +9997,7 @@ msgstr ""
"existentes?\n"
"Esto puede tardar un poco."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Administrador de Proyectos"
@@ -9906,6 +10046,17 @@ msgstr ""
"Actualmente no tienes ningún proyecto.\n"
"¿Quieres explorar proyectos de ejemplo oficiales en la Biblioteca de Assets?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"La casilla de búsqueda filtra los proyectos por nombre y el último "
+"componente de la ruta.\n"
+"Para filtrar los proyectos por nombre y ruta completa, la consulta debe "
+"contener al menos un carácter `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Tecla "
@@ -10287,14 +10438,25 @@ msgid "Batch Rename"
msgstr "Renombrar por lote"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Reemplazar: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Prefijo"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Sufijo"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Usa Expresiones Regulares"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Opciones Avanzadas"
@@ -10331,11 +10493,12 @@ msgstr ""
"Comparar opciones de contador."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "Contador por Nivel"
+msgid "Per-level Counter"
+msgstr "Contador Por Nivel"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Si esta activo el contador reinicia por cada grupo de nodos hijos"
#: editor/rename_dialog.cpp
@@ -10363,10 +10526,6 @@ msgstr ""
"Los dígitos faltantes serán rellenados con ceros al principio."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Expresiones regulares"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Post-Procesado"
@@ -10375,12 +10534,12 @@ msgid "Keep"
msgstr "Conservar"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase a under_scored"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase a snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored a CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case a PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10398,6 +10557,15 @@ msgstr "A mayúsculas"
msgid "Reset"
msgstr "Resetear"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Error de Expresión Regular"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "En el carácter %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Reemparentar nodo"
@@ -10463,8 +10631,8 @@ msgid "Instance Child Scene"
msgstr "Instanciar Escena Hija"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Eliminar Script"
+msgid "Detach Script"
+msgstr "Sustraer Script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10501,6 +10669,10 @@ msgid "Make node as Root"
msgstr "Convertir nodo como Raíz"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "¿Eliminar %d nodos y sus hijos?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "¿Eliminar %d nodos?"
@@ -10630,6 +10802,16 @@ msgid "Open Documentation"
msgstr "Abrir Documentación"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"No se puede adjuntar el script: no hay ningún lenguaje registrado.\n"
+"Esto es probablemente porque este editor fue construido con todos los "
+"módulos de lenguaje desactivados."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Añadir Nodo Hijo"
@@ -10678,12 +10860,12 @@ msgstr ""
"existe ningún nodo raíz."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Añadir un script nuevo o existente al nodo seleccionado."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Añadir un nuevo script o ya existente al nodo seleccionado."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Borrar el script del nodo seleccionado."
+msgid "Detach the script from the selected node."
+msgstr "Sustraer script del nodo seleccionado."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10722,7 +10904,7 @@ msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
-"El nodo tiene %s conexión(es) y %(s) grupo(s).\n"
+"El nodo tiene %s conexión(es) y %s grupo(s).\n"
"Clic para mostrar el panel de señales."
#: editor/scene_tree_editor.cpp
@@ -10815,6 +10997,10 @@ msgid "A directory with the same name exists."
msgstr "Ya existe un directorio con el mismo nombre."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "El archivo no existe."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Extensión inválida."
@@ -10855,6 +11041,10 @@ msgid "File exists, it will be reused."
msgstr "El archivo ya existe, será reutilizado."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Ruta inválida."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Nombre de clase inválido."
@@ -10863,8 +11053,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Nombre o ruta del padre heredado inválido."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "El script es válido."
+msgid "Script path/name is valid."
+msgstr "La ruta/nombre del script es correcta."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10887,6 +11077,14 @@ msgid "Script file already exists."
msgstr "El archivo de script ya existe."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Nota: Los scripts integrados tienen algunas limitaciones y no pueden ser "
+"editados usando un editor externo."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Nombre de Clase:"
@@ -10955,6 +11153,10 @@ msgid "Copy Error"
msgstr "Copiar Error"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Memoria de Vídeo"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Saltar Breakpoints"
@@ -10992,19 +11194,19 @@ msgstr "Monitores"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
-msgstr "Elige uno o más elementos de la lista para mostrar el gráfico."
+msgstr "Elige uno o más ítems de la lista para mostrar el gráfico."
#: editor/script_editor_debugger.cpp
msgid "List of Video Memory Usage by Resource:"
-msgstr "Lista de uso de memoria de video por recurso:"
+msgstr "Listado de la Memoria de Vídeo Utilizada por Recurso:"
#: editor/script_editor_debugger.cpp
msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Memoria de Vídeo"
+msgid "Export list to a CSV file"
+msgstr "Exportar lista a un archivo CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11100,31 +11302,31 @@ msgstr "Cambiar Alcance de la Sonda"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Sphere Shape Radius"
-msgstr "Cambiar Radio de Sphere Shape"
+msgstr "Cambiar Radio de la Forma Esférica"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
-msgstr "Cambiar Radio de Box Shape"
+msgstr "Cambiar Extensión de la Forma de la Caja"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr "Cambiar Radio de Capsule Shape"
+msgstr "Cambiar Radio de la Forma de la Cápsula"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr "Cambiar Altura de Capsule Shape"
+msgstr "Cambiar Altura de la Forma de la Cápsula"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Radius"
-msgstr "Cambiar Radio de Cylinder Shape"
+msgstr "Cambiar Radio de la Forma del Cilindro"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Height"
-msgstr "Cambiar Altura de Cylinder Shape"
+msgstr "Cambiar Altura de la Forma del Cilindro"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
-msgstr "Cambiar Longitud de Ray Shape"
+msgstr "Cambiar Longitud de la Forma del Rayo"
#: modules/csg/csg_gizmos.cpp
msgid "Change Cylinder Radius"
@@ -11252,15 +11454,15 @@ msgstr "Plano:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Next Floor"
-msgstr "Siguiente Suelo"
+msgstr "Siguiente Plano"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Previous Floor"
-msgstr "Anterior Suelo"
+msgstr "Anterior Plano"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Floor:"
-msgstr "Suelo:"
+msgstr "Plano:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Delete Selection"
@@ -11360,11 +11562,12 @@ msgstr "Seleccionar Distancia:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Filter meshes"
-msgstr "Filtrar meshes"
+msgstr "Filtrar mallas"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
-msgstr "Asignar un recurso MeshLibrary a este GridMap para usar sus meshes."
+msgstr ""
+"Proporciona un recurso MeshLibrary a este GridMap para usar sus mallas."
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
@@ -11380,7 +11583,7 @@ msgstr "Bake NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
-msgstr "Limpiar el navigation mesh."
+msgstr "Limpiar la malla de navegación."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Setting up Configuration..."
@@ -11420,11 +11623,11 @@ msgstr "Creando polymesh..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Converting to native navigation mesh..."
-msgstr "Convertir a navigation mesh nativo..."
+msgstr "Convertir a malla de navegación nativa..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Navigation Mesh Generator Setup:"
-msgstr "Configuración del Generador de Navigation Mesh:"
+msgstr "Configuración del Generador de Mallas de Navegación:"
#: modules/recast/navigation_mesh_generator.cpp
msgid "Parsing Geometry..."
@@ -11776,7 +11979,7 @@ msgstr "Crear Función"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "Actualizar Gráfico"
+msgstr "Refrescar Gráfico"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
@@ -11897,6 +12100,12 @@ msgstr ""
"Debug keystore no configurada en Configuración del Editor ni en el preset."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Release keystore no está configurado correctamente en el preset de "
+"exportación."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"La compilación personalizada requiere una ruta de Android SDK válida en "
@@ -11926,10 +12135,43 @@ msgstr "Nombre de paquete inválido:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"El módulo \"GodotPaymentV3\" incluido en los ajustes del proyecto \"android/"
+"modules\" es inválido (cambiado en Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "\"Use Custom Build\" debe estar activado para usar los plugins."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile "
+"VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile VR"
+"\"."
+
+#: platform/android/export/export.cpp
+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 "
+"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'."
@@ -12143,8 +12385,17 @@ msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
-"Para que CollisionShape2D funcione, se debe proporcionar un shape. Por "
-"favor, ¡crea un recurso shape para ello!"
+"Para que funcione CollisionShape2D se debe proporcionar una forma. Por "
+"favor, ¡crea un recurso de forma para ello!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Las formas basadas en polígonos no están pensadas para ser usadas ni "
+"editadas directamente a través del nodo CollisionShape2D. Por favor, usa el "
+"nodo CollisionPolygon2D en su lugar."
#: scene/2d/cpu_particles_2d.cpp
msgid ""
@@ -12236,10 +12487,9 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Los cambios en el tamaño del RigidBody2D (en los modos \"character\" o "
-"\"rigid\") serán sobre-escritos por el motor de físicas cuando éste se "
-"ejecute.\n"
-"En lugar de esto, cambie el tamaño en las formas de colisión hijas."
+"Los cambios en el tamaño de RigidBody2D (en los modos character o rigid) "
+"serán anulados por el motor de la física cuando esté ejecutándose.\n"
+"En su lugar, cambia el tamaño en las formas de colisión de los hijos."
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
@@ -12321,7 +12571,7 @@ msgstr "(Tiempo restante: %d:%02d s)"
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Meshes: "
-msgstr "Trazando Meshes: "
+msgstr "Trazando Mallas: "
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Lights:"
@@ -12333,7 +12583,7 @@ msgstr "Finalizar Trazado"
#: scene/3d/baked_lightmap.cpp
msgid "Lighting Meshes: "
-msgstr "Iluminando Meshes: "
+msgstr "Iluminación de Mallas: "
#: scene/3d/collision_object.cpp
msgid ""
@@ -12375,8 +12625,8 @@ msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"Se debe proporcionar un shape para que CollisionShape funcione. Por favor, "
-"crea un recurso shape para ello."
+"Se debe proporcionar una forma para que CollisionShape funcione. Por favor, "
+"crea un recurso de forma para ello."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12386,9 +12636,15 @@ msgstr ""
"Las formas tipo plano no funcionan bien y se eliminarán en futuras "
"versiones. Por favor, no las uses."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape no soporta RigidBody de otro modo que no sea estático."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
-msgstr "Nada visible ya que no se asignó ningún mesh."
+msgstr "No hay nada visible porque no se ha asignado ninguna malla."
#: scene/3d/cpu_particles.cpp
msgid ""
@@ -12400,16 +12656,21 @@ msgstr ""
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
-msgstr "Trazando Meshes"
+msgstr "Trazando Mallas"
#: scene/3d/gi_probe.cpp
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
-"Las GIProbes no están soportadas por el controlador de video GLES2.\n"
+"Las GIProbes no están soportadas por el controlador de vídeo GLES2.\n"
"Usa un BakedLightmap en su lugar."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12444,7 +12705,8 @@ msgstr ""
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
-"Nada es visible porque las mallas no se han asignado a los pases de dibujo."
+"No hay nada visible porque no se han asignado mallas para los pases de "
+"dibujo."
#: scene/3d/particles.cpp
msgid ""
@@ -12473,9 +12735,9 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Los cambios en el tamaño del RigidBody (en los modos \"character\" o \"rigid"
-"\") serán sobre-escritos por el motor de físicas cuando se ejecute.\n"
-"En lugar de esto, cambie el tamaño en las formas de colisión hijas."
+"Cualquier cambio en el tamaño de RigidBody (en modo character o rigid) será "
+"anulado por el motor de la física cuando esté ejecutándose.\n"
+"En su lugar, cambia el tamaño en las formas de colisión de los hijos."
#: scene/3d/remote_transform.cpp
msgid ""
@@ -12487,7 +12749,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
-msgstr "Este cuerpo será ignorado hasta que se establezca un mesh."
+msgstr "Este cuerpo será ignorado hasta que se establezca una malla."
#: scene/3d/soft_body.cpp
msgid ""
@@ -12495,9 +12757,9 @@ msgid ""
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Los cambios de tamaño a un SoftBody serán sobrescritos por el motor de "
-"física al ejecutar.\n"
-"En su lugar, cambia el tamaño de los collision shapes hijos."
+"Los cambios de tamaño de SoftBody serán anulados por el motor de física "
+"cuando esté ejecutándose.\n"
+"En su lugar, cambia el tamaño en las formas de colisión de los hijos."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -12688,6 +12950,12 @@ msgstr ""
"bien, conviértalo en un RenderTarget y asigne su textura interna a algún "
"nodo para que se muestre."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"El tamaño del Viewport debe ser mayor que 0 para poder renderizar cualquier "
+"cosa."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Fuente inválida para la vista previa."
@@ -12716,6 +12984,54 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice."
msgid "Constants cannot be modified."
msgstr "Las constantes no pueden modificarse."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Sistema de Archivo e Importación"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Al exportar o distribuir, el ejecutable generado intentará conectarse a "
+#~ "la IP de este equipo para ser depurado."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "La escena actual nunca se guardó. Por favor, guárdela antes de ejecutar."
+
+#~ msgid "Not in resource path."
+#~ msgstr "No está en la ruta de recursos."
+
+#~ msgid "Revert"
+#~ msgstr "Revertir"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Esta acción no se puede deshacer. ¿Revertir de todos modos?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Revertir Escena"
+
+#~ msgid "Clear Script"
+#~ msgstr "Eliminar Script"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Registro de problemas"
+
+#~ msgid "Request Docs"
+#~ msgstr "Solicitar Documentos"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr ""
+#~ "Ayuda a mejorar la documentación de Godot aportando retroalimentación."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d ocurrencia(s) reemplazada(s)."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Crear Static Convex Body"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "¡Falló en la creación de los shapes!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
index c367f694c1..6171c0e27d 100644
--- a/editor/translations/es_AR.po
+++ b/editor/translations/es_AR.po
@@ -11,15 +11,16 @@
# Javier Ocampos <xavier.ocampos@gmail.com>, 2018, 2019, 2020.
# Andrés S <andres.segovia.dev@gmail.com>, 2019.
# Florencia Menéndez <mariaflormz2@gmail.com>, 2019.
-# roger <616steam@gmail.com>, 2019.
+# roger <616steam@gmail.com>, 2019, 2020.
# Francisco José Carllinni <panchopepe@protonmail.com>, 2019.
# Nicolas Zirulnik <nicolaszirulnik@gmail.com>, 2020.
+# Cristian Yepez <cristianyepez@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
-"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
+"PO-Revision-Date: 2020-07-31 03:47+0000\n"
+"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/"
"godot-engine/godot/es_AR/>\n"
"Language: es_AR\n"
@@ -27,7 +28,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 3.11-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -541,6 +542,7 @@ msgid "Seconds"
msgstr "Segundos"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -681,7 +683,7 @@ msgstr "Cambiar Offset Final de Clip de Pista de Audio"
#: editor/array_property_edit.cpp
msgid "Resize Array"
-msgstr "Redimencionar Array"
+msgstr "Redimensionar Array"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
@@ -700,8 +702,8 @@ msgid "Line Number:"
msgstr "Numero de Línea:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocurrencia(s) Reemplazadas."
+msgid "%d replaced."
+msgstr "%d reemplazadas."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -719,7 +721,7 @@ msgstr "Coincidir Mayúsculas/Minúsculas"
msgid "Whole Words"
msgstr "Palabras Completas"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Reemplazar"
@@ -769,6 +771,10 @@ msgid "Method in target node must be specified."
msgstr "El método en el nodo objetivo debe ser especificado."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "El nombre del método debe ser un identificador válido."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -852,7 +858,6 @@ msgstr "No se puede conectar la señal"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -910,6 +915,11 @@ msgid "Signals"
msgstr "Señales"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrar tiles"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "¿Estás seguro/a que querés quitar todas las conexiones de esta señal?"
@@ -947,7 +957,7 @@ msgid "Recent:"
msgstr "Recientes:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Buscar:"
@@ -1129,6 +1139,9 @@ msgstr "Fundadores del Proyecto"
msgid "Lead Developer"
msgstr "Desarrollador Principal"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Gestor de Proyectos "
@@ -1150,6 +1163,16 @@ msgid "Gold Sponsors"
msgstr "Sponsor Oro"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Donantes Plata"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Donantes Bronce"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsors"
@@ -1457,7 +1480,7 @@ msgstr "Mover Autoload"
msgid "Remove Autoload"
msgstr "Quitar Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Activar"
@@ -1465,17 +1488,9 @@ msgstr "Activar"
msgid "Rearrange Autoloads"
msgstr "Reordenar Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Ruta inválida."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "El archivo existe."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "No está en la ruta de recursos."
+msgid "Can't add autoload:"
+msgstr "No se puede agregar autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1502,6 +1517,10 @@ msgstr "Nombre"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Pegar Parámetros"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Actualizando Escena"
@@ -1630,16 +1649,17 @@ msgid "Scene Tree Editing"
msgstr "Edición de Árbol de Escenas"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Dock de Importación"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Dock de Nodos"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Docks de Sistema de Archivos e Importación"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Sistema de Archivos"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Dock de Importación"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1791,7 +1811,7 @@ msgstr "Mostrar en Explorador de Archivos"
msgid "New Folder..."
msgstr "Nueva Carpeta..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Refrescar"
@@ -1905,7 +1925,7 @@ msgstr "Directorios y Archivos:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Vista Previa:"
@@ -2345,11 +2365,6 @@ msgid "There is no defined scene to run."
msgstr "No hay escena definida para ejecutar."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"La escena actual nunca se guardó. Favor de guardarla antes de ejecutar."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "No se pudo comenzar el subproceso!"
@@ -2434,12 +2449,17 @@ msgid "Can't reload a scene that was never saved."
msgstr "No se puede volver a cargar una escena que nunca se guardó."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Revertir"
+msgid "Reload Saved Scene"
+msgstr "Recargar Escena Guardada"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Esta acción no se puede deshacer. ¿Revertir de todos modos?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"La escena actual tiene cambios sin guardar.\n"
+"Querés recargar la escena guardada igualmente? Esta acción no se puede "
+"deshacer."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2734,10 +2754,6 @@ msgid "Redo"
msgstr "Rehacer"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Revertir Escena"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Herramientas misceláneas a nivel proyecto o escena."
@@ -2797,28 +2813,32 @@ msgstr "Hacer Deploy con Depuración Remota"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Al exportar o hacer deploy, el ejecutable resultante tratara de conectarse a "
-"la IP de esta computadora de manera de ser depurado."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Deploy Pequeño con recursos en red"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Cuando esta opción está activa, exportar o hacer deploy producirá un "
"ejecutable mínimo.\n"
-"El sistema de archivos sera proveido desde el proyecto por el editor sobre "
+"El sistema de archivos sera proveído desde el proyecto por el editor sobre "
"la red.\n"
"En Android, deploy usará el cable USB para mejor performance. Esta opción "
"acelera el testeo para juegos con footprint grande."
@@ -2828,9 +2848,10 @@ msgid "Visible Collision Shapes"
msgstr "Collision Shapes Visibles"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Los Collision shapes y nodos raycast (para 2D y 3D) serán visibles durante "
"la ejecución del juego cuando esta opción queda activada."
@@ -2840,23 +2861,26 @@ msgid "Visible Navigation"
msgstr "Navegación Visible"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Los meshes de navegación y los polígonos serán visibles durante la ejecución "
"del juego si esta opción queda activada."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sincronizar Cambios de Escena"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Cuando esta opción esté encendida, cualquier cambio hecho a la escena en el "
"editor será replicado en el juego en ejecución.\n"
@@ -2864,15 +2888,17 @@ msgstr ""
"sistema de archivos remoto."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sincronizar Cambios en Scripts"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Cuando esta opción está activa, cualquier script que se guarde sera vuelto a "
"cargar en el juego en ejecución.\n"
@@ -2936,7 +2962,7 @@ msgstr "Ayuda"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Buscar"
@@ -2950,8 +2976,12 @@ msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Registro de problemas"
+msgid "Report a Bug"
+msgstr "Reportar un Bug"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Enviar comentarios sobre la documentación"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3352,9 +3382,11 @@ msgid "Add Key/Value Pair"
msgstr "Agregar Par Clave/Valor"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"No se encontró ningún preset de exportación ejecutable para esta "
"plataforma.\n"
@@ -3384,6 +3416,12 @@ msgstr "No se pudo ejecutar el script:"
msgid "Did you forget the '_run' method?"
msgstr "Te olvidaste del método '_run'?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Mantené pulsado Ctrl para redondear a enteros. Mantené pulsado Shift para "
+"cambios más precisos."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Seleccionar Nodo(s) para Importar"
@@ -3983,10 +4021,18 @@ msgid "Error running post-import script:"
msgstr "Error ejecutando el script de post-importacion:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "¿Devolviste un objeto derivado de Node en el método `post_import()`?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Guardando..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Archivos"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Asignar como Predeterminado para '%s'"
@@ -3995,10 +4041,6 @@ msgid "Clear Default for '%s'"
msgstr "Restablecer Predeterminados para '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Archivos"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importar Como:"
@@ -4011,8 +4053,8 @@ msgid "Reimport"
msgstr "Reimportar"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Guardar escenas, reimportar y reiniciar"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Guardar Escenas, Reimportar y Reiniciar"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4049,10 +4091,6 @@ msgid "Copy Params"
msgstr "Copiar Parámetros"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Pegar Parámetros"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Editar Portapapeles de Recursos"
@@ -5125,7 +5163,7 @@ msgid "Bake Lightmaps"
msgstr "Bake Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Vista Previa"
@@ -5878,12 +5916,12 @@ msgid "Mesh is empty!"
msgstr "¡El Mesh está vacío!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Crear Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "No se pudo crear una forma de colisión Trimesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Crear Static Convex Body"
+msgid "Create Static Trimesh Body"
+msgstr "Crear Static Trimesh Body"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5894,12 +5932,31 @@ msgid "Create Trimesh Static Shape"
msgstr "Crear Trimesh Static Shape"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "¡Fallo al crear shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"No se pudo crear una única forma de colisión convexa para la raíz de escena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "No se pudo crear una forma de colisión única."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Crear Forma Convexa Única"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Crear Shape(s) Convexo(s)"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"No se pudo crear múltiples formas de colisión convexas para la raíz de "
+"escena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "No se pudo crear ninguna forma de colisión."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Crear Múltiples Formas Convexas"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5950,18 +6007,68 @@ msgid "Create Trimesh Static Body"
msgstr "Crear StaticBody Triangular"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crea un StaticBody y le asigna automáticamente una forma de colisión basada "
+"en polígonos .\n"
+"Esta es la opción mas exacta (pero más lenta) de detección de colisiones."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Crear Collider Triangular Hermano"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Crear Collider Convexo Hermano(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crea una forma de colisión basada en polígonos.\n"
+"Esta es la opción mas exacta (pero más lenta) de detección de colisiones."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Crear Colisión Convexa Única Hermana"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Crear forma de colisión convexa única.\n"
+"Esta es la opción mas rápida (pero menos exacta) para detectar colisiones."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Crear Múltiples Colisiones Convexas como Nodos Hermanos"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Crea una forma de colisión basada en polígonos.\n"
+"Esto está en un punto medio de rendimiento entre las dos opciones de arriba."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Crear Outline Mesh..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Crea un mesh de contorno estático. Este mesh de contorno tendrá sus normales "
+"invertidas automáticamente.\n"
+"Esto puede ser usado en vez de la propiedad Grow del SpatialMaterial cuando "
+"no sea posible usar dicha propiedad."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Ver UV1"
@@ -6646,7 +6753,7 @@ msgstr "El script falló al recargar, revisá errores en la consola."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr "Es script no esta en modo tool, no sera posible ejecutarlo."
+msgstr "El script no esta en modo tool, no sera posible ejecutarlo."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
@@ -6812,14 +6919,6 @@ msgid "Open Godot online documentation."
msgstr "Abrir la documentación en línea de Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Solicitar Docum."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Ayudá a mejorar la documentación de Godot dando feedback."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Buscar en la documentación de referencia."
@@ -6885,12 +6984,12 @@ msgstr ""
"nodo '%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Línea"
+msgid "[Ignore]"
+msgstr "[Ignorar]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignorar)"
+msgid "Line"
+msgstr "Línea"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7256,6 +7355,10 @@ msgid "This operation requires a single selected node."
msgstr "Esta operación requiere un solo nodo seleccionado."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Auto Ortogonal Activado"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Trabar Rotación de Vista"
@@ -7344,6 +7447,10 @@ msgid "Freelook Slow Modifier"
msgstr "Modificador de Velocidad de Vista Libre"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotación de Vista Trabada"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7352,14 +7459,25 @@ msgstr ""
"No se puede utilizar como un indicador fiable del rendimiento en el juego."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Rotación de Vista Trabada"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Dialogo XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Hacé clic para alternar entre los estados de visibilidad.\n"
+"\n"
+"Ojo abierto: El gizmo es visible.\n"
+"Ojo cerrado: El gizmo está oculto.\n"
+"Ojo medio abierto: El gizmo también es visible a través de superficies "
+"opacas (\"x-ray\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Ajustar Nodos al Suelo"
@@ -7696,7 +7814,8 @@ msgid "New Animation"
msgstr "Nueva Animación"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Velocidad (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8318,7 +8437,7 @@ msgstr "Crear Polígono Cóncavo"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Polygon Convex"
-msgstr "Crear Polígono Convexo"
+msgstr "Hacer el Polígono Convexo"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Tile"
@@ -8372,7 +8491,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "No hay addons de VCS disponibles."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Error"
@@ -9543,24 +9662,30 @@ msgid "Export With Debug"
msgstr "Exportar Con Depuración"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "La ruta no existe."
+msgid "The path specified doesn't exist."
+msgstr "La ruta especificada no existe."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Error al abrir el archivo de paquete (no esta en formato ZIP)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"Archivo de projecto '.zip' inválido, no contiene un archivo 'project.godot'."
+"Archivo de projecto \".zip\" inválido; no contiene un archivo \"project.godot"
+"\"."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Por favor elegí una carpeta vacía."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Por favor elegí un archivo 'project.godot' o '.zip'."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Por favor elegí un archivo \"project.godot\" o \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr "El directorio ya contiene un proyecto de Godot."
#: editor/project_manager.cpp
@@ -9824,6 +9949,7 @@ msgstr ""
"existentes?\n"
"Podría demorar un rato."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Gestor de Proyectos"
@@ -9872,6 +9998,17 @@ msgstr ""
"Actualmente no tenés ningún proyecto.\n"
"¿Te gustaría explorar los ejemplos oficiales en la Biblioteca de Assets?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"La casilla de búsqueda filtra los proyectos por nombre y el último "
+"componente de la ruta.\n"
+"Para filtrar los proyectos por nombre y ruta completa, la consulta debe "
+"contener al menos un carácter `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Tecla "
@@ -10253,14 +10390,25 @@ msgid "Batch Rename"
msgstr "Renombrar en Masa"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Reemplazar: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Prefijo"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Sufijo"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Usar Expresiones Regulares"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Opciones Avanzadas"
@@ -10297,11 +10445,12 @@ msgstr ""
"Comparar opciones de contador."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "Contador por nivel"
+msgid "Per-level Counter"
+msgstr "Contador Por Nivel"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Si esta activo el contador reinicia por cada grupo de nodos hijos"
#: editor/rename_dialog.cpp
@@ -10329,10 +10478,6 @@ msgstr ""
"Los dígitos faltantes serán rellenados con ceros al principio."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Expresiones Regulares"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Post-Procesado"
@@ -10341,12 +10486,12 @@ msgid "Keep"
msgstr "Conservar"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase a under_scored"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase a snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored a CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case a PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10364,6 +10509,15 @@ msgstr "A Mayúsculas"
msgid "Reset"
msgstr "Resetear"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Error de Expresión Regular"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "En el carácter %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Reemparentar Nodo"
@@ -10429,8 +10583,8 @@ msgid "Instance Child Scene"
msgstr "Instanciar Escena Hija"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Quitar Script"
+msgid "Detach Script"
+msgstr "Desasignar Script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10467,12 +10621,16 @@ msgid "Make node as Root"
msgstr "Convertir nodo en Raíz"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "¿Eliminar %d nodos y sus hijos?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "¿Eliminar %d nodos?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
-msgstr "¿Eliminar el nodo raiz \"%s\"?"
+msgstr "¿Eliminar el nodo raíz \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
@@ -10597,6 +10755,16 @@ msgid "Open Documentation"
msgstr "Abrir Documentación"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"No se puede asignar el script: no hay ningún lenguaje registrado.\n"
+"Esto es probablemente porque este editor fue compilado con todos los módulos "
+"de lenguaje desactivados."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Agregar Nodo Hijo"
@@ -10645,12 +10813,12 @@ msgstr ""
"existe ningún nodo raíz."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Adjuntar un script nuevo o existente para el nodo seleccionado."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Asignar un script nuevo o existente al nodo seleccionado."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Restablecer un script para el nodo seleccionado."
+msgid "Detach the script from the selected node."
+msgstr "Desasignar el script del nodo seleccionado."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10782,6 +10950,10 @@ msgid "A directory with the same name exists."
msgstr "Existe un directorio con el mismo nombre."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "El archivo existe."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Extensión inválida."
@@ -10822,6 +10994,10 @@ msgid "File exists, it will be reused."
msgstr "El archivo existe, será reutilizado."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Ruta inválida."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Nombre de clase inválido."
@@ -10830,8 +11006,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Ruta o nombre del padre heredado inválido."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "El script es válido."
+msgid "Script path/name is valid."
+msgstr "La ruta/nombre del script es correcta."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10854,6 +11030,14 @@ msgid "Script file already exists."
msgstr "El archivo de script ya existe."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Nota: Los scripts integrados tienen algunas limitaciones y no pueden ser "
+"editados con un editor externo."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Nombre de Clase:"
@@ -10922,6 +11106,10 @@ msgid "Copy Error"
msgstr "Copiar Error"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Mem. de Video"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Saltear Breakpoints"
@@ -10970,8 +11158,8 @@ msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Mem. de Video"
+msgid "Export list to a CSV file"
+msgstr "Exportar lista a un archivo CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11773,7 +11961,7 @@ msgstr "La ruta no apunta a un Nodo!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
-msgstr "Nombre de propiedad índice '%s' inválido en nodo %s."
+msgstr "Nombre de propiedad índice '%s' inválido en nodo %s."
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
@@ -11862,6 +12050,12 @@ msgstr ""
"Keystore debug no configurada en Configuración del Editor ni en el preset."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Release keystore no está configurado correctamente en el preset de "
+"exportación."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"La compilación personalizada requiere una ruta de Android SDK válida en "
@@ -11891,6 +12085,39 @@ msgstr "Nombre de paquete inválido:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"El módulo \"GodotPaymentV3\" incluido en el ajuste de proyecto \"android/"
+"modules\" es inválido (cambiado en Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "\"Use Custom Build\" debe estar activado para usar los plugins."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile "
+"VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile VR"
+"\"."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12108,6 +12335,15 @@ msgstr ""
"Se debe proveer un shape para que CollisionShape2D funcione. Creale un "
"recurso shape!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Las formas basadas en polígonos no están pensadas para ser usadas ni "
+"editadas directamente a través del nodo CollisionShape2D. Por favor, usá el "
+"nodo CollisionPolygon2D en su lugar."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12347,6 +12583,12 @@ msgstr ""
"Las formas tipo plano no funcionan bien y serán removidas en versiones "
"futuras. Evitá usarlas."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape no soporta RigidBody de otro modo que no sea estático."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Nada visible ya que no se asignó ningún mesh."
@@ -12371,6 +12613,11 @@ msgstr ""
"Las GIProbes no están soportadas por el controlador de video GLES2.\n"
"Usá un BakedLightmap en su lugar."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12647,6 +12894,10 @@ msgstr ""
"pueda obtener un tamaño. Alternativamente, haz un RenderTarget y asigna su "
"textura interna a algún otro nodo para mostrar."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "El tamaño del viewport debe ser mayor a 0 para poder renderizar."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Fuente inválida para la vista previa."
@@ -12675,6 +12926,53 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice."
msgid "Constants cannot be modified."
msgstr "Las constantes no pueden modificarse."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Docks de Sistema de Archivos e Importación"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Al exportar o hacer deploy, el ejecutable resultante tratara de "
+#~ "conectarse a la IP de esta computadora de manera de ser depurado."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "La escena actual nunca se guardó. Favor de guardarla antes de ejecutar."
+
+#~ msgid "Not in resource path."
+#~ msgstr "No está en la ruta de recursos."
+
+#~ msgid "Revert"
+#~ msgstr "Revertir"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Esta acción no se puede deshacer. ¿Revertir de todos modos?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Revertir Escena"
+
+#~ msgid "Clear Script"
+#~ msgstr "Quitar Script"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Registro de problemas"
+
+#~ msgid "Request Docs"
+#~ msgstr "Solicitar Docum."
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Ayudá a mejorar la documentación de Godot dando feedback."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d ocurrencia(s) Reemplazadas."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Crear Static Convex Body"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "¡Fallo al crear shapes!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/et.po b/editor/translations/et.po
index 1db95acc83..a8692d1332 100644
--- a/editor/translations/et.po
+++ b/editor/translations/et.po
@@ -4,18 +4,20 @@
# This file is distributed under the same license as the Godot source code.
# Jens <arrkiin@gmail.com>, 2019.
# Mattias Aabmets <mattias.aabmets@gmail.com>, 2019.
+# StReef <streef.gtx@gmail.com>, 2020.
+# René <renepiik@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-07-19 13:41+0000\n"
-"Last-Translator: Mattias Aabmets <mattias.aabmets@gmail.com>\n"
+"PO-Revision-Date: 2020-09-01 10:38+0000\n"
+"Last-Translator: StReef <streef.gtx@gmail.com>\n"
"Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/"
"godot/et/>\n"
"Language: et\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 4.2.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -25,7 +27,7 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Eeldati sõne pikkusega 1 (trükimärk)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -63,31 +65,31 @@ msgstr "'%' kutsudes:"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -111,23 +113,23 @@ msgstr "Väärtus:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "Sisesta Võti Siia"
+msgstr "Sisesta võti siia"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "Kopeeri Valitud Võti (Võtmed)"
+msgstr "Paljunda valitud võti (võtmed)"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "Kustuta Valitud Võti (Võtmed)"
+msgstr "Kustuta valitud võti (võtmed)"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr "Lisa Bezieri Punkt"
+msgstr "Lisa Bezieri punkt"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr "Liiguta Bezieri Punkte"
+msgstr "Liiguta Bezieri punkte"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -179,20 +181,20 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
-msgstr "Muuda Animatsiooni Pikkust"
+msgstr "Muuda animatsiooni pikkust"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr "Muuda Animatsiooni Silmust"
+msgstr "Muuda animatsiooni silmust"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Atribuudi rada"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "3D muundus rada"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
@@ -200,31 +202,31 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezieri kurvi rada"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Heli taasesituse rada"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
-msgstr ""
+msgstr "Animatsiooni taasesituse rada"
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr ""
+msgstr "Animatsiooni pikkus (kaadrid)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
-msgstr ""
+msgstr "Animatsiooni pikkus (sekundid)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
-msgstr ""
+msgstr "Lisa rada"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr ""
+msgstr "Animatsiooni kordus"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -237,39 +239,39 @@ msgstr "Heliklipid:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr "Animatsiooni Klipid:"
+msgstr "Animatsiooni klipid:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr ""
+msgstr "Muuda raja teed"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "Lülita see rada sisse/välja."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Uuendusrežiim (kuidas see omadus on seatud)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr ""
+msgstr "Interpolatsiooni režiim"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Korduse mähise režiim (nterpoleeri lõpp silmuse alguses)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
-msgstr ""
+msgstr "Eemalda see rada."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
-msgstr "Aeg (Ajad): "
+msgstr "Aeg (sek): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "Lülita rada sisse"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -285,7 +287,7 @@ msgstr "Päästik"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "Jäädvusta"
#: editor/animation_track_editor.cpp
msgid "Nearest"
@@ -311,35 +313,35 @@ msgstr ""
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Sisesta Võti"
+msgstr "Sisesta võti"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
-msgstr "Kopeeri Võti (Võtmed)"
+msgstr "Paljunda võti (võtmed)"
#: editor/animation_track_editor.cpp
msgid "Delete Key(s)"
-msgstr "Kustuta Võti (Võtmed)"
+msgstr "Kustuta võti (võtmed)"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
-msgstr "Muuda Animatsiooni Uuendamise Töörežiimi"
+msgstr "Muuda animatsiooni uuendamise režiimi"
#: editor/animation_track_editor.cpp
msgid "Change Animation Interpolation Mode"
-msgstr "Muuda Animatsiooni Interpolatsiooni Töörežiimi"
+msgstr "Muuda animatsiooni interpolatsiooni režiimi"
#: editor/animation_track_editor.cpp
msgid "Change Animation Loop Mode"
-msgstr "Muuda Animatsiooni Silmuse Töörežiimi"
+msgstr "Muuda animatsiooni silmuse režiimi"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr ""
+msgstr "Eemalda animatsiooni rada"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr ""
+msgstr "Loo uus rada %s-le ja sisesta võti?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
@@ -359,19 +361,19 @@ msgstr "Loo"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr ""
+msgstr "Animatsiooni sisestus"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer ei saa ennast animeerida, ainult teise mänijaid."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr ""
+msgstr "Loo ja sisesta animatsioon"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr ""
+msgstr "Sisesta animatsiooni rada ja võti"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
@@ -379,15 +381,15 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Change Animation Step"
-msgstr "Muuda Animatsiooni Sammu"
+msgstr "Muuda animatsiooni sammu"
#: editor/animation_track_editor.cpp
msgid "Rearrange Tracks"
-msgstr ""
+msgstr "Paiguta rajad ümber"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Radade muundamine rakendub ainult ruumilisele sõlmedele."
#: editor/animation_track_editor.cpp
msgid ""
@@ -396,6 +398,10 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Helirajad võivad osutada ainult järgmistele sõlmetüüpidele:\n"
+"-AudioSteamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
@@ -403,8 +409,7 @@ msgstr "Animatsiooni rajad võivad osutada ainult AnimationPlayer sõlmedele."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
-"Animatsiooni mängija ei saa animeerida iseennast, ainult teisi mängijaid."
+msgstr "AnimationPlayer ei saa animeerida iseennast, ainult teisi mängijaid."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
@@ -416,7 +421,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
-msgstr "Lisa Bezieri Rada"
+msgstr "Lisa Bezieri rada"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -424,15 +429,15 @@ msgstr "Raja tee on kehtetu, mistõttu ei sa lisada võtit."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Rada pole Spatial tüüpi, ei saa sisestada võtit"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
-msgstr ""
+msgstr "Lisa muunda raja võtit"
#: editor/animation_track_editor.cpp
msgid "Add Track Key"
-msgstr "Lisa Raja Võti"
+msgstr "Lisa raja võti"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
@@ -440,7 +445,7 @@ msgstr "Raja tee on kehtetu, mistõttu ei saa lisada meetodi võtit."
#: editor/animation_track_editor.cpp
msgid "Add Method Track Key"
-msgstr "Lisa Meetodi Raja Võti"
+msgstr "Lisa meetodi raja võti"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
@@ -456,7 +461,7 @@ msgstr "Lõikelaud on tühi"
#: editor/animation_track_editor.cpp
msgid "Paste Tracks"
-msgstr "Kleebi Rajad"
+msgstr "Kleebi rajad"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -486,7 +491,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr ""
+msgstr "Vali AnimationPlayer sõlm, et luua ja redigeerida animatsioone."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -497,20 +502,22 @@ msgid "Group tracks by node or display them as plain list."
msgstr ""
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Snap:"
-msgstr ""
+msgstr "Intervall:"
#: editor/animation_track_editor.cpp
msgid "Animation step value."
-msgstr ""
+msgstr "Animatsiooni sammu väärtus."
#: editor/animation_track_editor.cpp
msgid "Seconds"
msgstr "Sekundid"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr "Kaadrit/Sekundis"
+msgstr "K/S"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -524,7 +531,7 @@ msgstr "Muuda"
#: editor/animation_track_editor.cpp
msgid "Animation properties."
-msgstr ""
+msgstr "Animatsiooni atribuudid."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
@@ -632,9 +639,8 @@ msgid "Copy"
msgstr "Kopeeri"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "Tühista Valik"
+msgstr "Vali kõik/mitte ükski"
#: editor/animation_track_editor_plugins.cpp
msgid "Add Audio Track Clip"
@@ -669,7 +675,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -688,7 +694,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -738,6 +744,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -763,7 +773,7 @@ msgstr ""
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr ""
+msgstr "Lisa"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
@@ -774,7 +784,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr ""
+msgstr "Eemalda"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
@@ -790,7 +800,7 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Advanced"
-msgstr ""
+msgstr "Täpsem"
#: editor/connections_dialog.cpp
msgid "Deferred"
@@ -817,7 +827,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -826,7 +835,7 @@ msgstr ""
#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Close"
-msgstr ""
+msgstr "Sulge"
#: editor/connections_dialog.cpp
msgid "Connect"
@@ -871,7 +880,12 @@ msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr ""
+msgstr "Signaalid"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtreeri sõlmed"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
@@ -904,23 +918,23 @@ msgstr ""
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
msgid "Favorites:"
-msgstr ""
+msgstr "Lemmikud:"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
msgid "Recent:"
-msgstr ""
+msgstr "Hiljutised:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
-msgstr ""
+msgstr "Otsi:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr ""
+msgstr "Vasted:"
#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
@@ -928,7 +942,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
-msgstr ""
+msgstr "Kirjeldus:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
@@ -988,7 +1002,7 @@ msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
-msgstr ""
+msgstr "Ava"
#: editor/dependency_editor.cpp
msgid "Owners Of:"
@@ -1051,7 +1065,7 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr ""
+msgstr "Kustuta"
#: editor/dependency_editor.cpp
msgid "Owns"
@@ -1071,67 +1085,80 @@ msgstr ""
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
-msgstr ""
+msgstr "Suur tänu Godot kogukonnalt!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
-msgstr ""
+msgstr "Godot mängumootori panustajad"
#: editor/editor_about.cpp
msgid "Project Founders"
-msgstr ""
+msgstr "Projekti asutajad"
#: editor/editor_about.cpp
msgid "Lead Developer"
-msgstr ""
+msgstr "Juhtiv arendaja"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr ""
+msgstr "Projekti juht "
#: editor/editor_about.cpp
msgid "Developers"
-msgstr ""
+msgstr "Arendajad"
#: editor/editor_about.cpp
msgid "Authors"
-msgstr ""
+msgstr "Autorid"
#: editor/editor_about.cpp
msgid "Platinum Sponsors"
-msgstr ""
+msgstr "Plaatinumsponsorid"
#: editor/editor_about.cpp
msgid "Gold Sponsors"
-msgstr ""
+msgstr "Kuldsponsorid"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Hõbennetajad"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Pronksannetajad"
#: editor/editor_about.cpp
msgid "Mini Sponsors"
-msgstr ""
+msgstr "Väikesponsorid"
#: editor/editor_about.cpp
msgid "Gold Donors"
-msgstr ""
+msgstr "Kuldannetajad"
#: editor/editor_about.cpp
msgid "Silver Donors"
-msgstr ""
+msgstr "Hõbennetajad"
#: editor/editor_about.cpp
msgid "Bronze Donors"
-msgstr ""
+msgstr "Pronksannetajad"
#: editor/editor_about.cpp
msgid "Donors"
-msgstr ""
+msgstr "Annetajad"
#: editor/editor_about.cpp
msgid "License"
-msgstr ""
+msgstr "Litsents"
#: editor/editor_about.cpp
msgid "Third-party Licenses"
-msgstr ""
+msgstr "Kolmanda osapoole litsents"
#: editor/editor_about.cpp
msgid ""
@@ -1140,18 +1167,22 @@ msgid ""
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
+"Godot mängumootor tugineb mitmetele kolmandate osapoolte tasuta ja avatud "
+"lähtekoodiga teekidele, mis kõik on kooskõlas MIT-litsentsi tingimustega. "
+"Järgnev on kõigi selliste kolmandate osapoolte komponentide täielik loetelu "
+"koos vastavate autoriõiguste avalduste ja litsentsitingimustega."
#: editor/editor_about.cpp
msgid "All Components"
-msgstr ""
+msgstr "Kõik komponendid"
#: editor/editor_about.cpp
msgid "Components"
-msgstr ""
+msgstr "Komponendid"
#: editor/editor_about.cpp
msgid "Licenses"
-msgstr ""
+msgstr "Litsensid"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Error opening package file, not in ZIP format."
@@ -1196,11 +1227,11 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Speakers"
-msgstr ""
+msgstr "Heliväljundi"
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
-msgstr ""
+msgstr "Lisa efekt"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
@@ -1228,7 +1259,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr ""
+msgstr "Lisa helisiini efekt"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
@@ -1261,7 +1292,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr ""
+msgstr "Duplikeeri"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
@@ -1309,73 +1340,73 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
-msgstr ""
+msgstr "Ava heliliinide paigutus"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "Faili '%s' ei ole eksisteeri."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
-msgstr ""
+msgstr "Paigutus"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr ""
+msgstr "Vigane fial, ei ole heliliini paigutus."
#: editor/editor_audio_buses.cpp
msgid "Error saving file: %s"
-msgstr ""
+msgstr "Tõrge faili '%s' salvestamisel"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr ""
+msgstr "Lisa siin"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
-msgstr ""
+msgstr "Lisa uus helisiin sellele paigutusele."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Load"
-msgstr ""
+msgstr "Lae"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr ""
+msgstr "Lae olemasolev siini paigutus."
#: editor/editor_audio_buses.cpp
msgid "Save As"
-msgstr ""
+msgstr "Salvesta kui"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr ""
+msgstr "Salvesta see siini paigutus faili."
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
-msgstr ""
+msgstr "Laadi vaikimisi"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr ""
+msgstr "Lae vaikimise siini paigutus."
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr ""
+msgstr "Loo uus siini paigutus."
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
-msgstr ""
+msgstr "Vigane nimi."
#: editor/editor_autoload_settings.cpp
msgid "Valid characters:"
-msgstr ""
+msgstr "Kehtivad märgid:"
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing engine class name."
-msgstr ""
+msgstr "Ei tohi kokkupõrkuda mängumootori juba olemasoleva klassi nimega."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing built-in type name."
@@ -1387,7 +1418,7 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "Võtmesõnu ei saa kasutada automaatsete nimedena."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
@@ -1409,24 +1440,16 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
-msgstr ""
+msgstr "Luba"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1438,95 +1461,103 @@ msgstr ""
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp
msgid "Path:"
-msgstr ""
+msgstr "Tee:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr ""
+msgstr "Sõlme nimi:"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
#: editor/settings_config_dialog.cpp
msgid "Name"
-msgstr ""
+msgstr "Nimi"
#: editor/editor_autoload_settings.cpp
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Kleebi parameetrid"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
-msgstr ""
+msgstr "Värskendan stseeni"
#: editor/editor_data.cpp
msgid "Storing local changes..."
-msgstr ""
+msgstr "Salvestan kohalikud muudatused..."
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr ""
+msgstr "Värskendan stseeni..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr ""
+msgstr "[tühi]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr ""
+msgstr "[salvestamata]"
#: editor/editor_dir_dialog.cpp
msgid "Please select a base directory first."
-msgstr ""
+msgstr "Palun valige kõigepealt baaskataloog."
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
-msgstr ""
+msgstr "Vali kataloog"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
#: scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr ""
+msgstr "Loo kaust"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp
msgid "Name:"
-msgstr ""
+msgstr "Nimi:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr ""
+msgstr "Ei saanud luua kausta."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr ""
+msgstr "Vali"
#: editor/editor_export.cpp
msgid "Storing File:"
-msgstr ""
+msgstr "Salvestan faili:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "Eeldataval teekonnal ei leitud ühtegi ekspordimalli:"
#: editor/editor_export.cpp
msgid "Packing"
-msgstr ""
+msgstr "Pakin"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"Sihtplatvorm nõuab GLES2 jaoks 'ETC' tekstuuri tihendamist. Projekti "
+"seadetes lubage „Impordi ETC”."
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"Sihtplatvorm nõuab GLES3 jaoks 'ETC2' tekstuuri tihendamist. Projekti "
+"seadetes lubage „Impordi ETC2”."
#: editor/editor_export.cpp
msgid ""
@@ -1535,6 +1566,9 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"Sihtplatvorm nõuab juhi varundamiseks GLES2-ga 'ETC' tekstuuri tihendamist.\n"
+"Lülitage projekti sätetes sisse „Impordi ETC” või keelake „Draiveri "
+"tagasilangemine lubatud”."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1550,7 +1584,7 @@ msgstr ""
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
-msgstr ""
+msgstr "Mallifaili ei leitud:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
@@ -1558,11 +1592,11 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "3D Editor"
-msgstr ""
+msgstr "3D-redaktor"
#: editor/editor_feature_profile.cpp
msgid "Script Editor"
-msgstr ""
+msgstr "Skriptiredaktor"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
@@ -1570,18 +1604,19 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr ""
+msgstr "Stseenipuu redigeerimine"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
-msgstr ""
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Failikuvaja"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1591,26 +1626,27 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
msgstr ""
+"Profiil peab olema kehtiv failinimi ja see ei tohi sisaldada '.' (punkti)"
#: editor/editor_feature_profile.cpp
msgid "Profile with this name already exists."
-msgstr ""
+msgstr "Selle nimega profiil on juba olemas."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(Redaktor keelatud, atribuudid keelatud)"
#: editor/editor_feature_profile.cpp
msgid "(Properties Disabled)"
-msgstr ""
+msgstr "(Atribuudid keelatud)"
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled)"
-msgstr ""
+msgstr "(Redaktor keelatud)"
#: editor/editor_feature_profile.cpp
msgid "Class Options:"
-msgstr ""
+msgstr "Klassi valikud:"
#: editor/editor_feature_profile.cpp
msgid "Enable Contextual Editor"
@@ -1618,29 +1654,31 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Enabled Properties:"
-msgstr ""
+msgstr "Lubatud atribuudid:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
-msgstr ""
+msgstr "Lubatud funktsioonid:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Classes:"
-msgstr ""
+msgstr "Lubatud klassid:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "Faili '% s' vorming on vale, import katkestati."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
msgstr ""
+"Profiil '% s' on juba olemas. Enne importimist eemaldage see, import "
+"katkestati."
#: editor/editor_feature_profile.cpp
msgid "Error saving profile to path: '%s'."
-msgstr ""
+msgstr "Viga profiili salvestamisel teele: '% s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
@@ -1648,7 +1686,7 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Current Profile:"
-msgstr ""
+msgstr "Praegune profiil:"
#: editor/editor_feature_profile.cpp
msgid "Make Current"
@@ -1658,82 +1696,82 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "New"
-msgstr ""
+msgstr "Uus"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr ""
+msgstr "Impordi"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
-msgstr ""
+msgstr "Ekspordi"
#: editor/editor_feature_profile.cpp
msgid "Available Profiles:"
-msgstr ""
+msgstr "Saadaolevad profiilid:"
#: editor/editor_feature_profile.cpp
msgid "Class Options"
-msgstr ""
+msgstr "Klassi valikud"
#: editor/editor_feature_profile.cpp
msgid "New profile name:"
-msgstr ""
+msgstr "Uus profiilinimi:"
#: editor/editor_feature_profile.cpp
msgid "Erase Profile"
-msgstr ""
+msgstr "Kustuta profiil"
#: editor/editor_feature_profile.cpp
msgid "Godot Feature Profile"
-msgstr ""
+msgstr "Godoti funktsiooniprofiil"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
-msgstr ""
+msgstr "Impordi profiil(id)"
#: editor/editor_feature_profile.cpp
msgid "Export Profile"
-msgstr ""
+msgstr "Ekspordi profiil"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
-msgstr ""
+msgstr "Halda redaktori funktsioonide profiile"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
-msgstr ""
+msgstr "Valige praegune kaust"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr ""
+msgstr "Fail on olemas, kirjutate üle?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select This Folder"
-msgstr ""
+msgstr "Vali see kaust"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr ""
+msgstr "Kopeeri tee"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Open in File Manager"
-msgstr ""
+msgstr "Ava failihalduris"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
msgid "Show in File Manager"
-msgstr ""
+msgstr "Kuva failihalduris"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
-msgstr ""
+msgstr "Uus kaust..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
-msgstr ""
+msgstr "Värskenda"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
@@ -1741,50 +1779,50 @@ msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr ""
+msgstr "Kõik failid (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
-msgstr ""
+msgstr "Ava fail"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr ""
+msgstr "Ava fail(id)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
-msgstr ""
+msgstr "Ava kataloog"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File or Directory"
-msgstr ""
+msgstr "Ava kaust või kataloog"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/editor_properties.cpp editor/inspector_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
-msgstr ""
+msgstr "Salvesta"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Save a File"
-msgstr ""
+msgstr "Salvesta fail"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr ""
+msgstr "Mine tagasi"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr ""
+msgstr "Mine edasi"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "Mine üles"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr ""
+msgstr "Lülita varjatud failid sisse/välja"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
@@ -1796,33 +1834,31 @@ msgstr ""
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr ""
+msgstr "Fookuse tee"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr ""
+msgstr "Liiguta lemmikud üles"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr ""
+msgstr "Liiguta lemmikud alla"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Mine Eelmisele Sammule"
+msgstr "Mine eelmisesse kausta."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Mine Järgmisele Sammule"
+msgstr "Mine järmisesse kausta."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
-msgstr ""
+msgstr "Mine vanema kausta."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Refresh files."
-msgstr ""
+msgstr "Värskenda faile."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
@@ -1834,29 +1870,29 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
-msgstr ""
+msgstr "Kuva üksusi pisipiltide ruudustikuna."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr ""
+msgstr "Kuva üksused loendina."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
-msgstr ""
+msgstr "Kataloogid ja failid:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
-msgstr ""
+msgstr "Eelvaade:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
-msgstr ""
+msgstr "Fail:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr ""
+msgstr "Peab kasutama kehtivat laiendit."
#: editor/editor_file_system.cpp
msgid "ScanSources"
@@ -1867,39 +1903,41 @@ msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
msgstr ""
+"Erinevat tüüpi importijaid on mitu, mis osutavad failile % s, import "
+"katkestati"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr ""
+msgstr "(Taas)impordin varasid"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr ""
+msgstr "Ülaosa"
#: editor/editor_help.cpp
msgid "Class:"
-msgstr ""
+msgstr "Klass:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Inherits:"
-msgstr ""
+msgstr "Pärib:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr ""
+msgstr "Päritud %s poolt:"
#: editor/editor_help.cpp
msgid "Description"
-msgstr ""
+msgstr "Kirjeldus"
#: editor/editor_help.cpp
msgid "Online Tutorials"
-msgstr ""
+msgstr "Veebijuhendid"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "Atribuudid"
#: editor/editor_help.cpp
msgid "override:"
@@ -1907,32 +1945,31 @@ msgstr ""
#: editor/editor_help.cpp
msgid "default:"
-msgstr ""
+msgstr "vaikimisi:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr ""
+msgstr "Meetodid"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr ""
+msgstr "Teema atribuudid"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr ""
+msgstr "Loetelu"
#: editor/editor_help.cpp
msgid "Constants"
-msgstr ""
+msgstr "Konstandid"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr ""
+msgstr "Atribuutide kirjeldused"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Väärtus:"
+msgstr "(väärtus)"
#: editor/editor_help.cpp
msgid ""
@@ -1942,7 +1979,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr ""
+msgstr "Meetodi kirjeldused"
#: editor/editor_help.cpp
msgid ""
@@ -1953,43 +1990,43 @@ msgstr ""
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr ""
+msgstr "Otsimise abi"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
-msgstr ""
+msgstr "Tõstutundlik"
#: editor/editor_help_search.cpp
msgid "Show Hierarchy"
-msgstr ""
+msgstr "Kuva hierarhia"
#: editor/editor_help_search.cpp
msgid "Display All"
-msgstr ""
+msgstr "Kuva kõik"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr ""
+msgstr "Ainult klassid"
#: editor/editor_help_search.cpp
msgid "Methods Only"
-msgstr ""
+msgstr "Ainult meetodid"
#: editor/editor_help_search.cpp
msgid "Signals Only"
-msgstr ""
+msgstr "Ainult signaalid"
#: editor/editor_help_search.cpp
msgid "Constants Only"
-msgstr ""
+msgstr "Ainult konstandid"
#: editor/editor_help_search.cpp
msgid "Properties Only"
-msgstr ""
+msgstr "Ainult atribuudid"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr ""
+msgstr "Ainult teema atribuudid"
#: editor/editor_help_search.cpp
msgid "Member Type"
@@ -1997,47 +2034,47 @@ msgstr ""
#: editor/editor_help_search.cpp
msgid "Class"
-msgstr ""
+msgstr "Klass"
#: editor/editor_help_search.cpp
msgid "Method"
-msgstr ""
+msgstr "Meetod"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
msgid "Signal"
-msgstr ""
+msgstr "Signaal"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr ""
+msgstr "Konstant"
#: editor/editor_help_search.cpp
msgid "Property"
-msgstr ""
+msgstr "Atribuut"
#: editor/editor_help_search.cpp
msgid "Theme Property"
-msgstr ""
+msgstr "Teema atribuut"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr ""
+msgstr "Atribuut:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "Sea"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Sea mitu:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr ""
+msgstr "Väljund:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Copy Selection"
-msgstr ""
+msgstr "Kopeeri valik"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2047,21 +2084,21 @@ msgstr ""
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr ""
+msgstr "Puhasta"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr ""
+msgstr "Puhasta väljund"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr ""
+msgstr "Lõpeta"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
msgid "Start"
-msgstr ""
+msgstr "Käivita"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
@@ -2069,15 +2106,15 @@ msgstr ""
#: editor/editor_network_profiler.cpp
msgid "Down"
-msgstr ""
+msgstr "Alla"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "Üles"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
-msgstr ""
+msgstr "Sõlm"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
@@ -2097,11 +2134,11 @@ msgstr ""
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "Uus aken"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "Imporditud ressursse ei saa salvestada."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
@@ -2110,21 +2147,23 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr ""
+msgstr "Viga ressursi salvestamisel!"
#: editor/editor_node.cpp
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"Seda ressurssi ei saa salvestada, kuna see ei kuulu muudetud stseeni. Esmalt "
+"tehke see ainulaadseks."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr ""
+msgstr "Salvesta ressurss kui..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr ""
+msgstr "Faili ei saa kirjutamiseks avada:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
@@ -2132,11 +2171,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Error while saving."
-msgstr ""
+msgstr "Viga salvestamisel."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "'%si' ei saa avada. Faili võib olla teisaldatud või kustutatud."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2144,37 +2183,39 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr ""
+msgstr "Faili '%s' ootamatu lõpp."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
-msgstr ""
+msgstr "Puudub '%s' või selle sõltuvuspaketid."
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
-msgstr ""
+msgstr "Viga faili '%s' laadimisel."
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr ""
+msgstr "Stseeni salvestamine"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr ""
+msgstr "Analüüsin"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
-msgstr ""
+msgstr "Loon pisipilti"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
-msgstr ""
+msgstr "Seda toimingut ei saa teha ilma puu juureta."
#: editor/editor_node.cpp
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"Seda stseeni ei saa salvestada, kuna toimub tsükliline sisestus.\n"
+"Lahenda see ja proovige siis uuesti salvestada."
#: editor/editor_node.cpp
msgid ""
@@ -2184,27 +2225,27 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Avatud stseeni ei saa üle kirjutada!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr ""
+msgstr "MeshLibrary ei saa ühendamiseks laadida!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr ""
+msgstr "Viga MeshLibrary salvestamisel!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr ""
+msgstr "TileSeti ei saa ühendamiseks laadida!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr ""
+msgstr "Viga TileSeti salvestamisel!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
-msgstr ""
+msgstr "Viga paigutuse salvestamisel!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
@@ -2212,11 +2253,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr ""
+msgstr "Paigutuse nime ei leitud!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
-msgstr ""
+msgstr "Taastati vaikepaigutus baasseadetesse."
#: editor/editor_node.cpp
msgid ""
@@ -2257,16 +2298,12 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
#: editor/editor_node.cpp editor/filesystem_dock.cpp
msgid "Open Scene"
-msgstr ""
+msgstr "Ava stseen"
#: editor/editor_node.cpp
msgid "Open Base Scene"
@@ -2274,15 +2311,15 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Quick Open..."
-msgstr ""
+msgstr "Ava kiiresti..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr ""
+msgstr "Ava kiiresti stseen..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr ""
+msgstr "Ava kiiresti skript..."
#: editor/editor_node.cpp
msgid "Save & Close"
@@ -2302,7 +2339,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr ""
+msgstr "Salvesta stseen kui..."
#: editor/editor_node.cpp
msgid "No"
@@ -2345,11 +2382,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+msgid "Reload Saved Scene"
+msgstr "Taaslae salvestatud stseen"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2358,19 +2397,19 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Quit"
-msgstr ""
+msgstr "Välju"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr ""
+msgstr "Välju redaktorist?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr ""
+msgstr "Ava projekti juht?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr ""
+msgstr "Salvesta ja välju"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
@@ -2392,11 +2431,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Close Scene"
-msgstr ""
+msgstr "Sule stseen"
#: editor/editor_node.cpp
msgid "Reopen Closed Scene"
-msgstr ""
+msgstr "Taasava suletud stseen"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2408,22 +2447,28 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr ""
+msgstr "Lisa-skripti ei olnud võimalik laadida teelt: '%s'."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
+"Lisa-skripti ei olnud võimalik laadida teelt: '%s'. Tundub, et koodis on "
+"viga, palun kontrolli süntaksi."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
+"Lisa-skripti ei olnud võimalik laadida teelt: '%s'. Baastüüp ei ole "
+"EditorPlugin."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
+"Lisa-skripti ei olnud võimalik laadida teelt: '%s'. Skript ei ole tööriista "
+"režiimis."
#: editor/editor_node.cpp
msgid ""
@@ -2477,7 +2522,7 @@ msgstr ""
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
msgid "Default"
-msgstr ""
+msgstr "Vaikimisi"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
@@ -2486,7 +2531,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Play This Scene"
-msgstr ""
+msgstr "Mängi seda stseeni"
#: editor/editor_node.cpp
msgid "Close Tab"
@@ -2526,7 +2571,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr ""
+msgstr "Doki asukoht"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
@@ -2538,20 +2583,19 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Add a new scene."
-msgstr ""
+msgstr "Lisa uus stseen."
#: editor/editor_node.cpp
msgid "Scene"
-msgstr ""
+msgstr "Stseen"
#: editor/editor_node.cpp
msgid "Go to previously opened scene."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Kopeeri"
+msgstr "Kopeeri tekst"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2571,31 +2615,31 @@ msgstr ""
#: editor/editor_node.cpp
msgid "New Scene"
-msgstr ""
+msgstr "Uus stseen"
#: editor/editor_node.cpp
msgid "New Inherited Scene..."
-msgstr ""
+msgstr "Uus päritud stseen..."
#: editor/editor_node.cpp
msgid "Open Scene..."
-msgstr ""
+msgstr "Ava stseen..."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Open Recent"
-msgstr ""
+msgstr "Hiljuti avatud"
#: editor/editor_node.cpp
msgid "Save Scene"
-msgstr ""
+msgstr "Salvesta stseen"
#: editor/editor_node.cpp
msgid "Save All Scenes"
-msgstr ""
+msgstr "Salvesta kõik stseenid"
#: editor/editor_node.cpp
msgid "Convert To..."
-msgstr ""
+msgstr "Teisenda..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
@@ -2608,16 +2652,12 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr ""
+msgstr "Võta tagasi"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
+msgstr "Tee uuesti"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
@@ -2626,11 +2666,11 @@ msgstr ""
#: editor/editor_node.cpp editor/project_manager.cpp
#: editor/script_create_dialog.cpp
msgid "Project"
-msgstr ""
+msgstr "Projekt"
#: editor/editor_node.cpp
msgid "Project Settings..."
-msgstr ""
+msgstr "Projekti sätted..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control"
@@ -2646,7 +2686,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Export..."
-msgstr ""
+msgstr "Ekspordi..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
@@ -2658,7 +2698,7 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
-msgstr ""
+msgstr "Tööriistad"
#: editor/editor_node.cpp
msgid "Orphan Resource Explorer..."
@@ -2671,7 +2711,7 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr ""
+msgstr "Silumine"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
@@ -2679,22 +2719,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2703,8 +2747,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2713,49 +2757,51 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Scene Changes"
+msgstr "Pinna muutused"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "Varjutaja muutused"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
-msgstr ""
+msgstr "Redaktor"
#: editor/editor_node.cpp
msgid "Editor Settings..."
-msgstr ""
+msgstr "Redaktori sätted..."
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr ""
+msgstr "Redaktori paigutus"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr ""
+msgstr "Tee ekraanipilt"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
@@ -2791,73 +2837,77 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
-msgstr ""
+msgstr "Abi"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
-msgstr ""
+msgstr "Otsi"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
-msgstr ""
+msgstr "Veebidokumentatsioonid"
#: editor/editor_node.cpp
msgid "Q&A"
-msgstr ""
+msgstr "Küsimused & vastused"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr ""
+msgid "Report a Bug"
+msgstr "Teavita veast"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Saada dokumentatsioonide tagasiside"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr ""
+msgstr "Kogukond"
#: editor/editor_node.cpp
msgid "About"
-msgstr ""
+msgstr "Teave"
#: editor/editor_node.cpp
msgid "Play the project."
-msgstr ""
+msgstr "Mängi projekti."
#: editor/editor_node.cpp
msgid "Play"
-msgstr ""
+msgstr "Mängi"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "Peata stseeni töö selle silumiseks."
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr ""
+msgstr "Peata stseen"
#: editor/editor_node.cpp
msgid "Stop the scene."
-msgstr ""
+msgstr "Lõpeta stseen."
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr ""
+msgstr "Mängi redigeeritud stseeni."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr ""
+msgstr "Mängi stseeni"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr ""
+msgstr "Mängi kohandatud stseeni"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr ""
+msgstr "Mängi kohandatud stseeni"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
@@ -2886,19 +2936,19 @@ msgstr ""
#: editor/editor_node.cpp
msgid "FileSystem"
-msgstr ""
+msgstr "Failikuvaja"
#: editor/editor_node.cpp
msgid "Inspector"
-msgstr ""
+msgstr "Ülevaataja"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr ""
+msgstr "Laienda alumist paneeli"
#: editor/editor_node.cpp
msgid "Output"
-msgstr ""
+msgstr "Väljund"
#: editor/editor_node.cpp
msgid "Don't Save"
@@ -2957,7 +3007,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Load Errors"
-msgstr ""
+msgstr "Laadimisvead"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
@@ -2989,7 +3039,7 @@ msgstr ""
#: editor/editor_node.h
msgid "Warning!"
-msgstr ""
+msgstr "Hoiatus!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
@@ -3013,36 +3063,36 @@ msgstr ""
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
-msgstr ""
+msgstr "Paigaldatud pistikprogrammid:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Update"
-msgstr ""
+msgstr "Uuenda"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Version:"
-msgstr ""
+msgstr "Versioon:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Author:"
-msgstr ""
+msgstr "Autor:"
#: editor/editor_plugin_settings.cpp
msgid "Status:"
-msgstr ""
+msgstr "Olek:"
#: editor/editor_plugin_settings.cpp
msgid "Edit:"
-msgstr ""
+msgstr "Muuda:"
#: editor/editor_profiler.cpp
msgid "Measure:"
-msgstr ""
+msgstr "Mõõda:"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
-msgstr ""
+msgstr "Kaadri aeg (sek)"
#: editor/editor_profiler.cpp
msgid "Average Time (sec)"
@@ -3050,7 +3100,7 @@ msgstr ""
#: editor/editor_profiler.cpp
msgid "Frame %"
-msgstr ""
+msgstr "Kaadri %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
@@ -3066,15 +3116,15 @@ msgstr ""
#: editor/editor_profiler.cpp
msgid "Frame #:"
-msgstr ""
+msgstr "Kaader nr:"
#: editor/editor_profiler.cpp
msgid "Time"
-msgstr ""
+msgstr "Aeg"
#: editor/editor_profiler.cpp
msgid "Calls"
-msgstr ""
+msgstr "Kutsungid"
#: editor/editor_properties.cpp
msgid "Edit Text:"
@@ -3126,15 +3176,15 @@ msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
-msgstr ""
+msgstr "Vali vaateaken"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
-msgstr ""
+msgstr "Uus skript"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
msgid "Extend Script"
-msgstr ""
+msgstr "Laienda skripti"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
@@ -3185,7 +3235,7 @@ msgstr ""
#: editor/editor_properties_array_dict.cpp
msgid "New Value:"
-msgstr ""
+msgstr "Uus väärtus:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
@@ -3194,7 +3244,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3221,6 +3272,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3410,7 +3465,7 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr ""
+msgstr "Praegune versioon:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
@@ -3522,7 +3577,7 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Add to Favorites"
-msgstr ""
+msgstr "Lisa lemmikutesse"
#: editor/filesystem_dock.cpp
msgid "Remove from Favorites"
@@ -3530,60 +3585,60 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr ""
+msgstr "Redigeeri sõltuvusi..."
#: editor/filesystem_dock.cpp
msgid "View Owners..."
-msgstr ""
+msgstr "Kuva omanikud..."
#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Rename..."
-msgstr ""
+msgstr "Muuda nime..."
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
-msgstr ""
+msgstr "Duplikeeri..."
#: editor/filesystem_dock.cpp
msgid "Move To..."
-msgstr ""
+msgstr "Teisalda..."
#: editor/filesystem_dock.cpp
msgid "New Scene..."
-msgstr ""
+msgstr "Uus stseen..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr ""
+msgstr "Uus skript..."
#: editor/filesystem_dock.cpp
msgid "New Resource..."
-msgstr ""
+msgstr "Uus ressurss..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Expand All"
-msgstr ""
+msgstr "Laienda kõik"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Collapse All"
-msgstr ""
+msgstr "Ahenda kõik"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
#: editor/scene_tree_dock.cpp
msgid "Rename"
-msgstr ""
+msgstr "Nimeta ümber"
#: editor/filesystem_dock.cpp
msgid "Previous Folder/File"
-msgstr ""
+msgstr "Eelmine kaust/fail"
#: editor/filesystem_dock.cpp
msgid "Next Folder/File"
-msgstr ""
+msgstr "Järgmine kaust/fail"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
@@ -3591,11 +3646,11 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Toggle Split Mode"
-msgstr ""
+msgstr "Lülita jagamisrežiim sisse/välja"
#: editor/filesystem_dock.cpp
msgid "Search files"
-msgstr ""
+msgstr "Otsi faile"
#: editor/filesystem_dock.cpp
msgid ""
@@ -3616,13 +3671,12 @@ msgid "Overwrite"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "Loo"
+msgstr "Loo stseen"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr ""
+msgstr "Loo skript"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
msgid "Find in Files"
@@ -3657,7 +3711,7 @@ msgstr ""
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
-msgstr ""
+msgstr "Tühista"
#: editor/find_in_files.cpp
msgid "Find: "
@@ -3673,7 +3727,7 @@ msgstr ""
#: editor/find_in_files.cpp
msgid "Searching..."
-msgstr ""
+msgstr "Otsin..."
#: editor/find_in_files.cpp
msgid "Search complete"
@@ -3705,7 +3759,7 @@ msgstr ""
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
-msgstr ""
+msgstr "Rühmad"
#: editor/groups_editor.cpp
msgid "Nodes Not in Group"
@@ -3714,7 +3768,7 @@ msgstr ""
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
msgid "Filter nodes"
-msgstr ""
+msgstr "Filtreeri sõlmed"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
@@ -3730,7 +3784,7 @@ msgstr ""
#: editor/groups_editor.cpp
msgid "Manage Groups"
-msgstr ""
+msgstr "Halda gruppe"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3806,35 +3860,39 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
msgid "Import As:"
-msgstr ""
+msgstr "Impordi kui:"
#: editor/import_dock.cpp
msgid "Preset"
-msgstr ""
+msgstr "Eelseadistus"
#: editor/import_dock.cpp
msgid "Reimport"
-msgstr ""
+msgstr "Taasimpordi"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3868,10 +3926,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -3901,7 +3955,7 @@ msgstr ""
#: editor/inspector_dock.cpp
msgid "Save the currently edited resource."
-msgstr ""
+msgstr "Salvesta käesolevalt muudetud ressurss."
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
@@ -3913,15 +3967,15 @@ msgstr ""
#: editor/inspector_dock.cpp
msgid "History of recently edited objects."
-msgstr ""
+msgstr "Hiljuti muudetud objektide ajalugu."
#: editor/inspector_dock.cpp
msgid "Object properties."
-msgstr ""
+msgstr "Objekti atribuudid."
#: editor/inspector_dock.cpp
msgid "Filter properties"
-msgstr ""
+msgstr "Filtreeri atribuudid"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3937,7 +3991,7 @@ msgstr ""
#: editor/plugin_config_dialog.cpp
msgid "Edit a Plugin"
-msgstr ""
+msgstr "Pistikprogrammi muutmine"
#: editor/plugin_config_dialog.cpp
msgid "Create a Plugin"
@@ -3945,7 +3999,7 @@ msgstr ""
#: editor/plugin_config_dialog.cpp
msgid "Plugin Name:"
-msgstr ""
+msgstr "Pistikprogrammi nimi:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
@@ -3953,11 +4007,11 @@ msgstr ""
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
msgid "Language:"
-msgstr ""
+msgstr "Keel:"
#: editor/plugin_config_dialog.cpp
msgid "Script Name:"
-msgstr ""
+msgstr "Skripti nimi:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
@@ -4197,7 +4251,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
-msgstr ""
+msgstr "Kustuta sõlm(ed)"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Toggle Filter On/Off"
@@ -4223,19 +4277,16 @@ msgid ""
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "Animatsiooni Klipid:"
+msgstr "Animatsiooniklipid"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "Heliklipid:"
+msgstr "Heliklipid"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Funktsioonid:"
+msgstr "Funktsioonid"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4275,16 +4326,16 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Animation?"
-msgstr ""
+msgstr "Kustuta animatsioon?"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Remove Animation"
-msgstr ""
+msgstr "Eemalda animatioon"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Invalid animation name!"
-msgstr ""
+msgstr "Vigane animatsiooni nimi!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation name already exists!"
@@ -4361,11 +4412,11 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
-msgstr ""
+msgstr "Animatsiooni tööriistad"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation"
-msgstr ""
+msgstr "Animatsioon"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Edit Transitions..."
@@ -4373,7 +4424,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Open in Inspector"
-msgstr ""
+msgstr "Ava ülevaatajas"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -4429,7 +4480,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
-msgstr ""
+msgstr "Kaasa vidinad (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pin AnimationPlayer"
@@ -4701,7 +4752,7 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "View Files"
-msgstr ""
+msgstr "Kuva failid"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
@@ -4748,9 +4799,8 @@ msgid "Request failed, timeout"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Timeout."
-msgstr "Aeg:"
+msgstr "Aeg maha."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -4810,11 +4860,11 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "Hiljuti uuendatud"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Vanim uuendus"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
@@ -4826,11 +4876,11 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "License (A-Z)"
-msgstr ""
+msgstr "Litsents (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "License (Z-A)"
-msgstr ""
+msgstr "Litsents (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
@@ -4862,32 +4912,32 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Plugins..."
-msgstr ""
+msgstr "Pistikprogrammid..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
-msgstr ""
+msgstr "Sordi:"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
msgid "Category:"
-msgstr ""
+msgstr "Kategooria:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Site:"
-msgstr ""
+msgstr "Veebisait:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Support"
-msgstr ""
+msgstr "Toetus"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
-msgstr ""
+msgstr "Ametlik"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Testing"
-msgstr ""
+msgstr "Testimine"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Loading..."
@@ -4919,9 +4969,9 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
-msgstr ""
+msgstr "Eelvaade"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
@@ -4964,9 +5014,8 @@ msgid "Create Vertical Guide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "Eemalda kehtetud võtmed"
+msgstr "Eemalda vertikaalne juht"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Horizontal Guide"
@@ -4977,9 +5026,8 @@ msgid "Create Horizontal Guide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "Eemalda kehtetud võtmed"
+msgstr "Eemalda horisontaalne juht"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Horizontal and Vertical Guides"
@@ -5338,7 +5386,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View"
-msgstr ""
+msgstr "Kuva"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
@@ -5362,7 +5410,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Viewport"
-msgstr ""
+msgstr "Kuva vaateaken"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
@@ -5653,11 +5701,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5669,11 +5717,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5725,11 +5789,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5737,6 +5830,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6328,7 +6429,7 @@ msgstr ""
#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Type:"
-msgstr ""
+msgstr "Tüüp:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
@@ -6466,21 +6567,21 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Up"
-msgstr ""
+msgstr "Liiguta üles"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr ""
+msgstr "Liiguta allapoole"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
-msgstr ""
+msgstr "Järgmine skript"
#: editor/plugins/script_editor_plugin.cpp
msgid "Previous script"
-msgstr ""
+msgstr "Eelmine skript"
#: editor/plugins/script_editor_plugin.cpp
msgid "File"
@@ -6541,7 +6642,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
-msgstr ""
+msgstr "Käivita"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
@@ -6553,12 +6654,12 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
-msgstr ""
+msgstr "Paus"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
msgid "Continue"
-msgstr ""
+msgstr "Jätka"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
@@ -6573,14 +6674,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6614,7 +6707,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
-msgstr ""
+msgstr "Siluja"
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Results"
@@ -6642,11 +6735,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6751,9 +6844,8 @@ msgid "Complete Symbol"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Evaluate Selection"
-msgstr "Kustuta Valim"
+msgstr "Hinda valikut"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
@@ -6777,7 +6869,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
-msgstr ""
+msgstr "Kontekstuaalne abi"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Bookmark"
@@ -6876,7 +6968,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective"
-msgstr ""
+msgstr "Perspektiiv"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
@@ -6920,35 +7012,35 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pitch"
-msgstr ""
+msgstr "Frontaal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "Sagitaal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
-msgstr ""
+msgstr "Objekte kuvatud"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Material Changes"
-msgstr ""
+msgstr "Materjali muutused"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Shader Changes"
-msgstr ""
+msgstr "Varjutaja muutused"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Surface Changes"
-msgstr ""
+msgstr "Pinna muutused"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
-msgstr ""
+msgstr "Kuvamise kutsungid"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Vertices"
-msgstr ""
+msgstr "Tipud"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View."
@@ -7011,6 +7103,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7032,15 +7128,15 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Environment"
-msgstr ""
+msgstr "Kuva keskkond"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Gizmos"
-msgstr ""
+msgstr "Kuva vidinad"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
-msgstr ""
+msgstr "Kuva informatsioon"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View FPS"
@@ -7048,7 +7144,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Half Resolution"
-msgstr ""
+msgstr "Poolresolutioon"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Audio Listener"
@@ -7060,7 +7156,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
-msgstr ""
+msgstr "Kinemaatiline eelvaade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
@@ -7099,17 +7195,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7137,27 +7242,27 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr ""
+msgstr "Altvaade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
-msgstr ""
+msgstr "Ülavaade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr ""
+msgstr "Tagavaade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr ""
+msgstr "Eesvaade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
-msgstr ""
+msgstr "Vasakvaade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View"
-msgstr ""
+msgstr "Paremvaade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
@@ -7169,11 +7274,11 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr ""
+msgstr "Fookuse alge"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
-msgstr ""
+msgstr "Fookuse valik"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
@@ -7194,44 +7299,44 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
-msgstr ""
+msgstr "1 vaateaken"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports"
-msgstr ""
+msgstr "2 vaateakent"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr ""
+msgstr "2 vaateakent (alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
-msgstr ""
+msgstr "3 vaateakent"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr ""
+msgstr "3 vaateakent (alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
-msgstr ""
+msgstr "4 vaateakent"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Gizmos"
-msgstr ""
+msgstr "Vidinad"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
-msgstr ""
+msgstr "Kuva lähtekoht"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Grid"
-msgstr ""
+msgstr "Kuva ruudustik"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Settings..."
-msgstr ""
+msgstr "Sätted..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7251,7 +7356,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
-msgstr ""
+msgstr "Vaateakna sätted"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective FOV (deg.):"
@@ -7407,7 +7512,7 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Unable to load images"
-msgstr ""
+msgstr "Pilte ei saa laadida"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -7446,12 +7551,12 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Loop"
-msgstr ""
+msgstr "Kordus"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Animation Frames:"
@@ -7680,7 +7785,7 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
-msgstr ""
+msgstr "Andmetüüp:"
#: editor/plugins/theme_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -7808,7 +7913,7 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
-msgstr ""
+msgstr "Liida stseenist"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
@@ -8102,7 +8207,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8151,9 +8256,8 @@ msgid "Renamed"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Deleted"
-msgstr "Kustuta Võti (Võtmed)"
+msgstr "Kustutatud"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Typechange"
@@ -8180,7 +8284,7 @@ msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Status"
-msgstr ""
+msgstr "Olek"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "View file diffs before committing them to the latest version"
@@ -9052,7 +9156,7 @@ msgstr ""
#: editor/project_export.cpp editor/project_settings_editor.cpp
msgid "Add..."
-msgstr ""
+msgstr "Lisa..."
#: editor/project_export.cpp
msgid ""
@@ -9126,7 +9230,7 @@ msgstr ""
#: editor/project_export.cpp
msgid "Script"
-msgstr ""
+msgstr "Skript"
#: editor/project_export.cpp
msgid "Script Export Mode:"
@@ -9189,11 +9293,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9201,11 +9310,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9420,13 +9529,14 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr ""
+msgstr "projektihaldur"
#: editor/project_manager.cpp
msgid "Projects"
-msgstr ""
+msgstr "Projektid"
#: editor/project_manager.cpp
msgid "Last Modified"
@@ -9434,7 +9544,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Scan"
-msgstr ""
+msgstr "Otsi"
#: editor/project_manager.cpp
msgid "Select a Folder to Scan"
@@ -9442,7 +9552,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "New Project"
-msgstr ""
+msgstr "Uus projekt"
#: editor/project_manager.cpp
msgid "Remove Missing"
@@ -9450,7 +9560,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Templates"
-msgstr ""
+msgstr "Mallid"
#: editor/project_manager.cpp
msgid "Restart Now"
@@ -9466,6 +9576,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9688,11 +9805,11 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Project Settings (project.godot)"
-msgstr ""
+msgstr "Projekti sätted (project.godot)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
+msgstr "Üldine"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -9728,15 +9845,15 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Localization"
-msgstr ""
+msgstr "Tõlked"
#: editor/project_settings_editor.cpp
msgid "Translations"
-msgstr ""
+msgstr "Tõlked"
#: editor/project_settings_editor.cpp
msgid "Translations:"
-msgstr ""
+msgstr "Tõlked:"
#: editor/project_settings_editor.cpp
msgid "Remaps"
@@ -9780,7 +9897,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Plugins"
-msgstr ""
+msgstr "Pistikprogrammid"
#: editor/property_editor.cpp
msgid "Preset..."
@@ -9843,18 +9960,26 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Advanced Options"
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
+msgid "Advanced Options"
+msgstr "Täpsemad sätted"
+
+#: editor/rename_dialog.cpp
msgid "Substitute"
msgstr ""
@@ -9885,11 +10010,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9915,10 +10040,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9927,11 +10048,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9950,6 +10071,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10013,7 +10142,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10050,8 +10179,12 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Kustuta %d sõlmed ja iga alamsõlm?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Kustuta Võti (Võtmed)"
+msgstr "Kustuta %d sõlmed?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10062,9 +10195,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Kustuta Võti (Võtmed)"
+msgstr "Kustuta sõlm \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10112,7 +10244,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "User Interface"
-msgstr ""
+msgstr "Kasutajaliides"
#: editor/scene_tree_dock.cpp
msgid "Other Node"
@@ -10128,7 +10260,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr ""
+msgstr "Manusta skript"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
@@ -10154,7 +10286,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Sub-Resources"
-msgstr ""
+msgstr "Alamressursid"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance"
@@ -10170,19 +10302,26 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Open Documentation"
+msgstr "Ava dokumentatsioon"
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
-msgstr ""
+msgstr "Lisa alamsõlm"
#: editor/scene_tree_dock.cpp
msgid "Expand/Collapse All"
-msgstr ""
+msgstr "Laienda/ahenda kõik"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
-msgstr ""
+msgstr "Muuda tüüpi"
#: editor/scene_tree_dock.cpp
msgid "Reparent to New Node"
@@ -10190,7 +10329,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr ""
+msgstr "Tee stseeni juurikaks"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10198,11 +10337,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Save Branch as Scene"
-msgstr ""
+msgstr "Salvesta filiaal stseenina"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr ""
+msgstr "Kopeeri sõlme tee"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
@@ -10210,7 +10349,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Add/Create a New Node."
-msgstr ""
+msgstr "Lisa/loo uus sõlm."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10219,11 +10358,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
+msgid "Attach a new or existing script to the selected node."
+msgstr "Kinnita uus või olemasolev skript valitud sõlmele."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10343,6 +10482,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Faili ei ole olemas."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10376,13 +10519,17 @@ msgstr ""
#: editor/script_create_dialog.cpp
msgid "Open Script"
-msgstr ""
+msgstr "Ava skript"
#: editor/script_create_dialog.cpp
msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Kehtetu tee."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10391,7 +10538,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10415,6 +10562,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10443,9 +10596,8 @@ msgid "Warning:"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Error:"
-msgstr "Peegel"
+msgstr "Viga:"
#: editor/script_editor_debugger.cpp
msgid "C++ Error"
@@ -10473,7 +10625,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Errors"
-msgstr ""
+msgstr "Vead"
#: editor/script_editor_debugger.cpp
msgid "Child process connected."
@@ -10481,7 +10633,11 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
-msgstr ""
+msgstr "Kopeeri viga"
+
+#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Videomälu"
#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
@@ -10497,7 +10653,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
-msgstr ""
+msgstr "Virnakaadrid"
#: editor/script_editor_debugger.cpp
msgid "Profiler"
@@ -10509,15 +10665,15 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Monitor"
-msgstr ""
+msgstr "Jälgija"
#: editor/script_editor_debugger.cpp
msgid "Value"
-msgstr ""
+msgstr "Väärtus"
#: editor/script_editor_debugger.cpp
msgid "Monitors"
-msgstr ""
+msgstr "Jälgijad"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -10525,19 +10681,19 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "List of Video Memory Usage by Resource:"
-msgstr ""
+msgstr "Videomälu kasutamise loetelu ressursside kaupa:"
#: editor/script_editor_debugger.cpp
msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
-msgstr ""
+msgstr "Ressursi tee"
#: editor/script_editor_debugger.cpp
msgid "Type"
@@ -10545,15 +10701,15 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Format"
-msgstr ""
+msgstr "Formaat"
#: editor/script_editor_debugger.cpp
msgid "Usage"
-msgstr ""
+msgstr "Kasutus"
#: editor/script_editor_debugger.cpp
msgid "Misc"
-msgstr ""
+msgstr "Muud"
#: editor/script_editor_debugger.cpp
msgid "Clicked Control:"
@@ -10572,8 +10728,9 @@ msgid "Set From Tree"
msgstr ""
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Export measures as CSV"
-msgstr ""
+msgstr "Ekspordi mõõtmed/meetmed CSV-vormingus"
#: editor/settings_config_dialog.cpp
msgid "Erase Shortcut"
@@ -10589,15 +10746,15 @@ msgstr ""
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
-msgstr ""
+msgstr "Redaktori sätted"
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
-msgstr ""
+msgstr "Kiirklahvid"
#: editor/settings_config_dialog.cpp
msgid "Binding"
-msgstr ""
+msgstr "Kombinatsioon"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Light Radius"
@@ -10717,11 +10874,11 @@ msgstr ""
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
-msgstr ""
+msgstr "Teek"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
-msgstr ""
+msgstr "Teegid: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
@@ -10864,9 +11021,8 @@ msgid "Cursor Clear Rotation"
msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "Kustuta Valitud Võti (Võtmed)"
+msgstr "Kleebi valikud"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
@@ -11213,9 +11369,8 @@ msgid "Try to only have one sequence input in selection."
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "Loo"
+msgstr "Loo funktsioon"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
@@ -11254,14 +11409,12 @@ msgid "Add Nodes..."
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Funktsioonid:"
+msgstr "Lisa funktsioon..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "Funktsioonid:"
+msgstr "funktsiooni_nimi"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
@@ -11284,9 +11437,8 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "Funktsioonid:"
+msgstr "Loo funktsioon"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
@@ -11403,6 +11555,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11426,6 +11582,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11603,6 +11785,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11790,6 +11978,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11810,6 +12003,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -11991,7 +12189,7 @@ msgstr ""
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
-msgstr ""
+msgstr "Palun kinnita..."
#: scene/gui/popup.cpp
msgid ""
@@ -12029,21 +12227,25 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "Vaateakne suurus peab olema suurem kui 0, et kuvada."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
-msgstr ""
+msgstr "Vigane eelvaate lähe."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
-msgstr ""
+msgstr "Vigane varjutaja lähe."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid comparison function for that type."
-msgstr ""
+msgstr "Vigane võrdlusfinktsioon selle tüübi jaoks."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Funktsiooni määramine."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
@@ -12055,4 +12257,7 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "Konstante ei saa muuta."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Ei ole ressursiteel."
diff --git a/editor/translations/eu.po b/editor/translations/eu.po
index b9a682553e..07923f26fb 100644
--- a/editor/translations/eu.po
+++ b/editor/translations/eu.po
@@ -3,11 +3,11 @@
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
# Julen Irazoki <rktzbkr.julen@gmail.com>, 2019.
-# Osoitz <oelkoro@gmail.com>, 2019.
+# Osoitz <oelkoro@gmail.com>, 2019, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-12-03 14:05+0000\n"
+"PO-Revision-Date: 2020-06-15 01:48+0000\n"
"Last-Translator: Osoitz <oelkoro@gmail.com>\n"
"Language-Team: Basque <https://hosted.weblate.org/projects/godot-engine/"
"godot/eu/>\n"
@@ -15,7 +15,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 3.10-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -24,7 +24,7 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "1 luzerako kate bat espero zen (karaktere bat)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -54,79 +54,79 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ""
+msgstr "'%s' eraikitzeko argumentu baliogabeak"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "'%s' deitzean:"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr ""
+msgstr "Libre"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Orekatua"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "Ispilua"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
-msgstr ""
+msgstr "Denbora:"
#: editor/animation_bezier_editor.cpp
msgid "Value:"
-msgstr ""
+msgstr "Balioa:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr ""
+msgstr "Txertatu gakoa hemen"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr ""
+msgstr "Bikoiztu hautatutako gakoa(k)"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr ""
+msgstr "Ezabatu hautatutako gakoak"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr ""
+msgstr "Gehitu Bezier puntua"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr ""
+msgstr "Mugitu Bezier puntuak"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -178,12 +178,12 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
-msgstr ""
+msgstr "Aldatu animazioaren iraupena"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "Aldatu animazioaren begizta"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -211,11 +211,11 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr ""
+msgstr "Animazioaren iraupena (fotogramak)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
-msgstr ""
+msgstr "Animazioaren iraupena (segundoak)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
@@ -496,7 +496,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Snap:"
-msgstr ""
+msgstr "Atxikitzea:"
#: editor/animation_track_editor.cpp
msgid "Animation step value."
@@ -507,6 +507,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -666,7 +667,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -685,7 +686,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -735,6 +736,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -814,7 +819,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -871,6 +875,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -908,7 +916,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -950,32 +958,32 @@ msgstr ""
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dependencies"
-msgstr ""
+msgstr "Mendekotasunak"
#: editor/dependency_editor.cpp
msgid "Resource"
-msgstr ""
+msgstr "Baliabidea"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
#: editor/project_manager.cpp editor/project_settings_editor.cpp
msgid "Path"
-msgstr ""
+msgstr "Bidea"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
-msgstr ""
+msgstr "Mendekotasunak:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
-msgstr ""
+msgstr "Konpondu hautsitakoa"
#: editor/dependency_editor.cpp
msgid "Dependency Editor"
-msgstr ""
+msgstr "Mendekotasun-editorea"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
-msgstr ""
+msgstr "Bilatu ordezko baliabidea:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
#: editor/editor_help_search.cpp editor/editor_node.cpp
@@ -985,15 +993,16 @@ msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
-msgstr ""
+msgstr "Ireki"
#: editor/dependency_editor.cpp
msgid "Owners Of:"
-msgstr ""
+msgstr "Hauen jabeak:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
msgstr ""
+"Kendu hautatutako fitxategiak proiektutik? (Ezin izango da berreskuratu)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1001,46 +1010,49 @@ msgid ""
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
+"Kendu beharreko fitxategiak beste baliabide batzuek behar dituzte funtziona "
+"dezaten.\n"
+"Kendu, hala ere? (Ezin da desegin)"
#: editor/dependency_editor.cpp
msgid "Cannot remove:"
-msgstr ""
+msgstr "Ezin kendu:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
-msgstr ""
+msgstr "Errorea kargatzean:"
#: editor/dependency_editor.cpp
msgid "Load failed due to missing dependencies:"
-msgstr ""
+msgstr "Kargak huts egin du mendekotasunak falta direlako:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
-msgstr ""
+msgstr "Ireki dena den"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
-msgstr ""
+msgstr "Zein ekintza egin behar da?"
#: editor/dependency_editor.cpp
msgid "Fix Dependencies"
-msgstr ""
+msgstr "Konpondu mendekotasunak"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
-msgstr ""
+msgstr "Erroreak kargatzean!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr ""
+msgstr "%d elementu behin betiko ezabatu nahi duzu? (Ezin da desegin!)"
#: editor/dependency_editor.cpp
msgid "Show Dependencies"
-msgstr ""
+msgstr "Erakutsi mendekotasunak"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
-msgstr ""
+msgstr "Baliabide umezurtzen arakatzailea"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -1048,27 +1060,28 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr ""
+msgstr "Ezabatu"
#: editor/dependency_editor.cpp
msgid "Owns"
-msgstr ""
+msgstr "Jabea"
#: editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
-msgstr ""
+msgstr "Jabetza esplizitu gabeko baliabideak:"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Key"
-msgstr ""
+msgstr "Aldatu hiztegiaren gakoa"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Value"
-msgstr ""
+msgstr "Aldatu hiztegiaren balioa"
#: editor/editor_about.cpp
+#, fuzzy
msgid "Thanks from the Godot community!"
-msgstr ""
+msgstr "Eskerrik asko Godot komunitatearen partetik!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
@@ -1076,59 +1089,72 @@ msgstr ""
#: editor/editor_about.cpp
msgid "Project Founders"
-msgstr ""
+msgstr "Proiektuaren sortzaileak"
#: editor/editor_about.cpp
msgid "Lead Developer"
-msgstr ""
+msgstr "Garatzaile nagusia"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr ""
+msgstr "Proiektu-kudeatzailea "
#: editor/editor_about.cpp
msgid "Developers"
-msgstr ""
+msgstr "Garatzaileak"
#: editor/editor_about.cpp
msgid "Authors"
-msgstr ""
+msgstr "Egileak"
#: editor/editor_about.cpp
msgid "Platinum Sponsors"
-msgstr ""
+msgstr "Platinozko babesleak"
#: editor/editor_about.cpp
msgid "Gold Sponsors"
-msgstr ""
+msgstr "Urrezko babesleak"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Zilarrezko emaileak"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Brontzezko emaileak"
#: editor/editor_about.cpp
msgid "Mini Sponsors"
-msgstr ""
+msgstr "Mini babesleak"
#: editor/editor_about.cpp
msgid "Gold Donors"
-msgstr ""
+msgstr "Urrezko emaileak"
#: editor/editor_about.cpp
msgid "Silver Donors"
-msgstr ""
+msgstr "Zilarrezko emaileak"
#: editor/editor_about.cpp
msgid "Bronze Donors"
-msgstr ""
+msgstr "Brontzezko emaileak"
#: editor/editor_about.cpp
msgid "Donors"
-msgstr ""
+msgstr "Emaileak"
#: editor/editor_about.cpp
msgid "License"
-msgstr ""
+msgstr "Lizentzia"
#: editor/editor_about.cpp
msgid "Third-party Licenses"
-msgstr ""
+msgstr "Hirugarrengoen lizentziak"
#: editor/editor_about.cpp
msgid ""
@@ -1140,27 +1166,27 @@ msgstr ""
#: editor/editor_about.cpp
msgid "All Components"
-msgstr ""
+msgstr "Osagai guztiak"
#: editor/editor_about.cpp
msgid "Components"
-msgstr ""
+msgstr "Osagaiak"
#: editor/editor_about.cpp
msgid "Licenses"
-msgstr ""
+msgstr "Lizentziak"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Error opening package file, not in ZIP format."
-msgstr ""
+msgstr "Errorea pakete fitxategia irekitzean, ez dago ZIP formatuan."
#: editor/editor_asset_installer.cpp
msgid "%s (Already Exists)"
-msgstr ""
+msgstr "%s (jada existitzen da)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr ""
+msgstr "Aktiboak deskonprimatzen"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
@@ -1168,28 +1194,28 @@ msgstr ""
#: editor/editor_asset_installer.cpp
msgid "And %s more files."
-msgstr ""
+msgstr "Eta beste %s fitxategi."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
-msgstr ""
+msgstr "Paketea ondo instalatu da!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Success!"
-msgstr ""
+msgstr "Arrakasta!"
#: editor/editor_asset_installer.cpp
msgid "Package Contents:"
-msgstr ""
+msgstr "Paketearen edukia:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
-msgstr ""
+msgstr "Instalatu"
#: editor/editor_asset_installer.cpp
msgid "Package Installer"
-msgstr ""
+msgstr "Pakete instalatzailea"
#: editor/editor_audio_buses.cpp
msgid "Speakers"
@@ -1197,7 +1223,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
-msgstr ""
+msgstr "Gehitu efektua"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
@@ -1237,7 +1263,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
-msgstr ""
+msgstr "Arrastatu eta jaregin berrantolatzeko."
#: editor/editor_audio_buses.cpp
msgid "Solo"
@@ -1258,19 +1284,19 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr ""
+msgstr "Bikoiztu"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
-msgstr ""
+msgstr "Berrezarri bolumena"
#: editor/editor_audio_buses.cpp
msgid "Delete Effect"
-msgstr ""
+msgstr "Ezabatu efektua"
#: editor/editor_audio_buses.cpp
msgid "Audio"
-msgstr ""
+msgstr "Audioa"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
@@ -1336,7 +1362,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Load"
-msgstr ""
+msgstr "Kargatu"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
@@ -1344,7 +1370,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Save As"
-msgstr ""
+msgstr "Gorde honela"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
@@ -1406,7 +1432,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1414,16 +1440,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1451,6 +1469,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1563,22 +1585,22 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr ""
+msgstr "Aktiboen liburutegia"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1664,35 +1686,35 @@ msgstr ""
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
-msgstr ""
+msgstr "Esportatu"
#: editor/editor_feature_profile.cpp
msgid "Available Profiles:"
-msgstr ""
+msgstr "Eskuragarri dauden profilak:"
#: editor/editor_feature_profile.cpp
msgid "Class Options"
-msgstr ""
+msgstr "Klaseko aukerak"
#: editor/editor_feature_profile.cpp
msgid "New profile name:"
-msgstr ""
+msgstr "Profilaren izen berria:"
#: editor/editor_feature_profile.cpp
msgid "Erase Profile"
-msgstr ""
+msgstr "Ezabatu profila"
#: editor/editor_feature_profile.cpp
msgid "Godot Feature Profile"
-msgstr ""
+msgstr "Godot ezaugarri profila"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
-msgstr ""
+msgstr "Inportatu profila(k)"
#: editor/editor_feature_profile.cpp
msgid "Export Profile"
-msgstr ""
+msgstr "Esportatu profila"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
@@ -1700,34 +1722,34 @@ msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
-msgstr ""
+msgstr "Hautatu uneko karpeta"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr ""
+msgstr "Fitxategia badago aurretik, gainidatzi?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select This Folder"
-msgstr ""
+msgstr "Hautatu karpeta hau"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr ""
+msgstr "Kopiatu bidea"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Open in File Manager"
-msgstr ""
+msgstr "Ireki fitxategi-kudeatzailean"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
msgid "Show in File Manager"
-msgstr ""
+msgstr "Erakutsi fitxategi-kudeatzailean"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
-msgstr ""
+msgstr "Karpeta berria..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1738,58 +1760,58 @@ msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr ""
+msgstr "Fitxategi guztiak (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
-msgstr ""
+msgstr "Ireki fitxategi bat"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr ""
+msgstr "Ireki fitxategia(k)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
-msgstr ""
+msgstr "Ireki direktorioa"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File or Directory"
-msgstr ""
+msgstr "Ireki fitxategia edo direktorioa"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/editor_properties.cpp editor/inspector_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
-msgstr ""
+msgstr "Gorde"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Save a File"
-msgstr ""
+msgstr "Gorde fitxategia"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr ""
+msgstr "Joan atzera"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr ""
+msgstr "Joan aurrera"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "Joan gora"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr ""
+msgstr "Txandakatu ezkutatutako fitxategiak"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr ""
+msgstr "Txandakatu gogokoa"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr ""
+msgstr "Txandakatu modua"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
@@ -1797,27 +1819,27 @@ msgstr ""
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr ""
+msgstr "Eraman gogokoa gora"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr ""
+msgstr "Eraman gogoa behera"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
-msgstr ""
+msgstr "Joan aurreko karpetara."
#: editor/editor_file_dialog.cpp
msgid "Go to next folder."
-msgstr ""
+msgstr "Joan hurrengo karpetara."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
-msgstr ""
+msgstr "Joan guraso karpetara."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Refresh files."
-msgstr ""
+msgstr "Eguneratu fitxategiak."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
@@ -1825,7 +1847,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "Txandakatu ezkutuko fitxategien ikusgaitasuna."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -1833,25 +1855,25 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr ""
+msgstr "Ikusi elementuak zerrenda gisa."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
-msgstr ""
+msgstr "Direktorioak eta fitxategiak:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
-msgstr ""
+msgstr "Aurrebista:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
-msgstr ""
+msgstr "Fitxategia:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr ""
+msgstr "Baliozko luzapena erabili behar du."
#: editor/editor_file_system.cpp
msgid "ScanSources"
@@ -1865,7 +1887,7 @@ msgstr ""
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr ""
+msgstr "Aktiboak (bir)inportatzen"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
@@ -1873,20 +1895,20 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Class:"
-msgstr ""
+msgstr "Klasea:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Inherits:"
-msgstr ""
+msgstr "Herentziak:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr ""
+msgstr "Hauek heredatua:"
#: editor/editor_help.cpp
msgid "Description"
-msgstr ""
+msgstr "Deskripzioa"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -1894,31 +1916,31 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "Propietateak"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "gainidatzi:"
#: editor/editor_help.cpp
msgid "default:"
-msgstr ""
+msgstr "lehenetsia:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr ""
+msgstr "Metodoak"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr ""
+msgstr "Azalaren propietateak"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr ""
+msgstr "Enumerazioak"
#: editor/editor_help.cpp
msgid "Constants"
-msgstr ""
+msgstr "Konstanteak"
#: editor/editor_help.cpp
msgid "Property Descriptions"
@@ -1926,7 +1948,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "(value)"
-msgstr ""
+msgstr "(balioa)"
#: editor/editor_help.cpp
msgid ""
@@ -1936,7 +1958,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr ""
+msgstr "Metodo-deskripzioak"
#: editor/editor_help.cpp
msgid ""
@@ -1947,63 +1969,63 @@ msgstr ""
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr ""
+msgstr "Bilatu laguntza"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
-msgstr ""
+msgstr "Maiuskulak eta minuskulak"
#: editor/editor_help_search.cpp
msgid "Show Hierarchy"
-msgstr ""
+msgstr "Erakutsi hierarkia"
#: editor/editor_help_search.cpp
msgid "Display All"
-msgstr ""
+msgstr "Erakutsi guztiak"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr ""
+msgstr "Klaseak bakarrik"
#: editor/editor_help_search.cpp
msgid "Methods Only"
-msgstr ""
+msgstr "Metodoak bakarrik"
#: editor/editor_help_search.cpp
msgid "Signals Only"
-msgstr ""
+msgstr "Seinaleak bakarrik"
#: editor/editor_help_search.cpp
msgid "Constants Only"
-msgstr ""
+msgstr "Konstanteak bakarrik"
#: editor/editor_help_search.cpp
msgid "Properties Only"
-msgstr ""
+msgstr "Propietateak bakarrik"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr ""
+msgstr "Azalaren propietateak bakarrik"
#: editor/editor_help_search.cpp
msgid "Member Type"
-msgstr ""
+msgstr "Kide mota"
#: editor/editor_help_search.cpp
msgid "Class"
-msgstr ""
+msgstr "Klasea"
#: editor/editor_help_search.cpp
msgid "Method"
-msgstr ""
+msgstr "Metodoa"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
msgid "Signal"
-msgstr ""
+msgstr "Seinalea"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr ""
+msgstr "Konstantea"
#: editor/editor_help_search.cpp
msgid "Property"
@@ -2011,7 +2033,7 @@ msgstr ""
#: editor/editor_help_search.cpp
msgid "Theme Property"
-msgstr ""
+msgstr "Azalaren propietatea"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2251,10 +2273,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2339,11 +2357,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Birkargatu azala"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2601,16 +2622,12 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr ""
+msgstr "Desegin"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
+msgstr "Berregin"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
@@ -2619,27 +2636,27 @@ msgstr ""
#: editor/editor_node.cpp editor/project_manager.cpp
#: editor/script_create_dialog.cpp
msgid "Project"
-msgstr ""
+msgstr "Proiektua"
#: editor/editor_node.cpp
msgid "Project Settings..."
-msgstr ""
+msgstr "Proiektuaren ezarpenak..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control"
-msgstr ""
+msgstr "Bertsio kontrola"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "Ezarri bertsio kontrola"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "Desgaitu bertsio kontrola"
#: editor/editor_node.cpp
msgid "Export..."
-msgstr ""
+msgstr "Esportatu..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
@@ -2647,24 +2664,24 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
-msgstr ""
+msgstr "Ireki proiektuaren datu karpeta"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
-msgstr ""
+msgstr "Tresnak"
#: editor/editor_node.cpp
msgid "Orphan Resource Explorer..."
-msgstr ""
+msgstr "Baliabide umezurtzen arakatzailea..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr ""
+msgstr "Irten proiektuen zerrendara"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr ""
+msgstr "Araztu"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
@@ -2672,32 +2689,36 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr ""
+msgstr "Talka formak ikusgai"
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2706,32 +2727,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2756,11 +2777,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr ""
+msgstr "Txandakatu pantaila osoa"
#: editor/editor_node.cpp
msgid "Toggle System Console"
-msgstr ""
+msgstr "Txandakatu sistemaren kontsola"
#: editor/editor_node.cpp
msgid "Open Editor Data/Settings Folder"
@@ -2768,53 +2789,57 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Ireki editorearen datu karpeta"
#: editor/editor_node.cpp
msgid "Open Editor Settings Folder"
-msgstr ""
+msgstr "Ireki editorearen ezarpenen karpeta"
#: editor/editor_node.cpp
msgid "Manage Editor Features..."
-msgstr ""
+msgstr "Kudeatu editorearen ezaugarriak..."
#: editor/editor_node.cpp
msgid "Manage Export Templates..."
-msgstr ""
+msgstr "Kudeatu esportazio txantiloiak..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
-msgstr ""
+msgstr "Laguntza"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
-msgstr ""
+msgstr "Bilatu"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
-msgstr ""
+msgstr "Lineako dokumentuak"
#: editor/editor_node.cpp
msgid "Q&A"
-msgstr ""
+msgstr "Galdera-erantzunak"
+
+#: editor/editor_node.cpp
+msgid "Report a Bug"
+msgstr "Eman akats baten berri"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr ""
+msgstr "Komunitatea"
#: editor/editor_node.cpp
msgid "About"
-msgstr ""
+msgstr "Honi buruz"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -2970,7 +2995,7 @@ msgstr ""
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr ""
+msgstr "Ireki aktiboen liburutegia"
#: editor/editor_node.cpp
msgid "Open the next Editor"
@@ -3187,7 +3212,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3196,7 +3222,7 @@ msgstr ""
#: editor/editor_run_script.cpp
msgid "There is an edited scene already."
-msgstr ""
+msgstr "Badago editatutako eszena bat."
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
@@ -3208,44 +3234,48 @@ msgstr ""
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr ""
+msgstr "Ezin izan da scripta exekutatu:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
-msgstr ""
+msgstr "Hautatu inportatu nahi dituzun nodoak"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
-msgstr ""
+msgstr "Arakatu"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
-msgstr ""
+msgstr "Eszenaren bidea:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr ""
+msgstr "Inportatu nodotik:"
#: editor/export_template_manager.cpp
msgid "Redownload"
-msgstr ""
+msgstr "Berriro jaitsi"
#: editor/export_template_manager.cpp
msgid "Uninstall"
-msgstr ""
+msgstr "Desinstalatu"
#: editor/export_template_manager.cpp
msgid "(Installed)"
-msgstr ""
+msgstr "(Instalatuta)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download"
-msgstr ""
+msgstr "Jaitsi"
#: editor/export_template_manager.cpp
msgid "Official export templates aren't available for development builds."
@@ -3253,11 +3283,11 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr ""
+msgstr "(Falta da)"
#: editor/export_template_manager.cpp
msgid "(Current)"
-msgstr ""
+msgstr "(Unekoa)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
@@ -3304,6 +3334,8 @@ msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
msgstr ""
+"Ez da bertsio hau jaisteko estekarik aurkitu. Deskarga zuzena bertsio "
+"ofizialentzat besterik ez dago."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3335,7 +3367,7 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "Download Complete."
-msgstr ""
+msgstr "Jaitsiera osatuta."
#: editor/export_template_manager.cpp
msgid "Cannot remove temporary file:"
@@ -3387,11 +3419,11 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "Downloading"
-msgstr ""
+msgstr "Jaisten"
#: editor/export_template_manager.cpp
msgid "Connection Error"
-msgstr ""
+msgstr "Konexio-errorea"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
@@ -3403,35 +3435,35 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr ""
+msgstr "Uneko bertsioa:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr ""
+msgstr "Instalatutako bertsioak:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr ""
+msgstr "Instalatu fitxategitik"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr ""
+msgstr "Kendu txantiloia"
#: editor/export_template_manager.cpp
msgid "Select Template File"
-msgstr ""
+msgstr "Hautatu txantiloi fitxategia"
#: editor/export_template_manager.cpp
msgid "Godot Export Templates"
-msgstr ""
+msgstr "Godot esportazio-txantiloiak"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
-msgstr ""
+msgstr "Esportazio-txantiloi kudeatzailea"
#: editor/export_template_manager.cpp
msgid "Download Templates"
-msgstr ""
+msgstr "Jaitsi txantiloiak"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
@@ -3576,7 +3608,7 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Next Folder/File"
-msgstr ""
+msgstr "Hurrengo karpeta/fitxategia"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
@@ -3588,17 +3620,19 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Search files"
-msgstr ""
+msgstr "Bilatu fitxategiak"
#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
+"Fitxategiak arakatzen,\n"
+"Itxaron mesedez..."
#: editor/filesystem_dock.cpp
msgid "Move"
-msgstr ""
+msgstr "Mugitu"
#: editor/filesystem_dock.cpp
msgid "There is already file or folder with the same name in this location."
@@ -3798,19 +3832,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+msgid "%d Files"
+msgstr "%d fitxategi"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3826,8 +3864,8 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr ""
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Gorde eszenak, berriro inportatu eta berrabiarazi"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -3837,6 +3875,8 @@ msgstr ""
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
msgstr ""
+"ABISUA: Baliabide hau darabiltzaten aktiboak daude, kargatzeari utzi "
+"liezaiokete."
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
@@ -3860,10 +3900,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4036,7 +4072,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Add Animation Point"
-msgstr ""
+msgstr "Gehitu animazio puntua"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Remove BlendSpace1D Point"
@@ -4068,7 +4104,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
msgid "Enable snap and show grid."
-msgstr ""
+msgstr "Gaitu atxikitzea eta erakutsi sareta."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4243,7 +4279,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Enable Filtering"
-msgstr ""
+msgstr "Gaitu iragazkia"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4251,38 +4287,38 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr ""
+msgstr "Animazio berriaren izena:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
-msgstr ""
+msgstr "Animazio berria"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr ""
+msgstr "Aldatu animazioaren izena:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Animation?"
-msgstr ""
+msgstr "Ezabatu animazioa?"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Remove Animation"
-msgstr ""
+msgstr "Kendu animazioa"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Invalid animation name!"
-msgstr ""
+msgstr "Animazio izen baliogabea!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation name already exists!"
-msgstr ""
+msgstr "Animazio izena existitzen da jada!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Rename Animation"
-msgstr ""
+msgstr "Aldatu izena animazioari"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
@@ -4294,31 +4330,31 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
-msgstr ""
+msgstr "Kargatu animazioa"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
-msgstr ""
+msgstr "Bikoiztu animazioa"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to copy!"
-msgstr ""
+msgstr "Ez dago animaziorik kopiatzeko!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation resource on clipboard!"
-msgstr ""
+msgstr "Ez dago animazio baliabiderik arbelean!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
-msgstr ""
+msgstr "Itsatsitako animazioa"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Paste Animation"
-msgstr ""
+msgstr "Itsatsi animazioa"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to edit!"
-msgstr ""
+msgstr "Ez dago animaziorik editatzeko!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -4658,7 +4694,7 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend4 Node"
-msgstr ""
+msgstr "Blend4 nodoa"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeScale Node"
@@ -4670,51 +4706,51 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
-msgstr ""
+msgstr "Trantsizio nodoa"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Import Animations..."
-msgstr ""
+msgstr "Inportatu animazioak..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr ""
+msgstr "Editatu nodo-iragazkiak"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
-msgstr ""
+msgstr "Iragazkiak..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Contents:"
-msgstr ""
+msgstr "Edukiak:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "View Files"
-msgstr ""
+msgstr "Ikusi fitxategiak"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
-msgstr ""
+msgstr "Konexio errorea, saiatu berriro."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect to host:"
-msgstr ""
+msgstr "Ezin da ostalariarekin konektatu:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response from host:"
-msgstr ""
+msgstr "Ostalariaren erantzunik ez:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve hostname:"
-msgstr ""
+msgstr "Ezin duzu ostalariaren izena ebatzi:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
-msgstr ""
+msgstr "Eskaerak huts egin du, itzulera-kodea:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed."
-msgstr ""
+msgstr "Eskaerak huts egin du."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Cannot save response to:"
@@ -4742,7 +4778,7 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
-msgstr ""
+msgstr "Jaitsiera hash okerra, fitxategia aldatua izan delakoan."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
@@ -4758,15 +4794,15 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
-msgstr ""
+msgstr "Aktiboaren jaitsiera errorea:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
-msgstr ""
+msgstr "Jaisten (%s / %s)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading..."
-msgstr ""
+msgstr "Jaisten..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4790,11 +4826,11 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
-msgstr ""
+msgstr "Jaitsiera errorea"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
-msgstr ""
+msgstr "Aktibo honen jaitsiera abian da jada!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
@@ -4883,7 +4919,7 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
-msgstr ""
+msgstr "Aktiboen ZIP fitxategia"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid ""
@@ -4907,13 +4943,13 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
-msgstr ""
+msgstr "Konfiguratu atxikitzea"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Offset:"
@@ -5218,72 +5254,72 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
-msgstr ""
+msgstr "Txandakatu atxikitze adimentsua."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Smart Snap"
-msgstr ""
+msgstr "Erabili atxikitze adimentsua"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle grid snapping."
-msgstr ""
+msgstr "Txandakatu saretara atxikitzea."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
-msgstr ""
+msgstr "Erabili saretara atxikitzea"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
-msgstr ""
+msgstr "Atxikitze aukerak"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
-msgstr ""
+msgstr "Erabili biraketa atxikitzea"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Scale Snap"
-msgstr ""
+msgstr "Erabili eskala atxikitzea"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
-msgstr ""
+msgstr "Atxikitze erlatiboa"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Pixel Snap"
-msgstr ""
+msgstr "Erabili pixel atxikitzea"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Smart Snapping"
-msgstr ""
+msgstr "Atxikitze adimentsua"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Configure Snap..."
-msgstr ""
+msgstr "Konfiguratu atxikitzea..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
-msgstr ""
+msgstr "Atxikitu gurasora"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Anchor"
-msgstr ""
+msgstr "Atxikitu nodoaren aingurara"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Sides"
-msgstr ""
+msgstr "Atxikitu nodoaren ertzetara"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Center"
-msgstr ""
+msgstr "Atxikitu nodoaren zentrora"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Other Nodes"
-msgstr ""
+msgstr "Atxikitu beste nodoetara"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Guides"
-msgstr ""
+msgstr "Atxikitu gidalerroetara"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5639,11 +5675,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5655,11 +5691,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5711,11 +5763,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5723,6 +5804,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6241,11 +6330,11 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
-msgstr ""
+msgstr "Atxikitu"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
-msgstr ""
+msgstr "Gaitu atxikitzea"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
@@ -6359,7 +6448,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Error while saving theme."
-msgstr ""
+msgstr "Errorea azala gordetzean."
#: editor/plugins/script_editor_plugin.cpp
msgid "Error Saving"
@@ -6367,7 +6456,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Error importing theme."
-msgstr ""
+msgstr "Errorea azala inportatzean."
#: editor/plugins/script_editor_plugin.cpp
msgid "Error Importing"
@@ -6404,11 +6493,11 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
-msgstr ""
+msgstr "Inportatu azala"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error while saving theme"
-msgstr ""
+msgstr "Errorea azala gordetzean"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving"
@@ -6416,7 +6505,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
-msgstr ""
+msgstr "Gorde azala honela..."
#: editor/plugins/script_editor_plugin.cpp
msgid "%s Class Reference"
@@ -6503,19 +6592,19 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme"
-msgstr ""
+msgstr "Azala"
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme..."
-msgstr ""
+msgstr "Inportatu azala..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
-msgstr ""
+msgstr "Birkargatu azala"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme"
-msgstr ""
+msgstr "Gorde azala"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
@@ -6559,14 +6648,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6628,11 +6709,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6996,6 +7077,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7084,26 +7169,35 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr ""
+msgstr "Atxikitu nodoak lurrera"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr ""
+msgstr "Ez da hautapena atxikitzeko lur trinkorik aurkitu."
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7118,7 +7212,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr ""
+msgstr "Erabili atxikitzea"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7171,7 +7265,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
-msgstr ""
+msgstr "Atxikitu objektua lurrera"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -7220,19 +7314,19 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
-msgstr ""
+msgstr "Atxikitze ezarpenak"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate Snap:"
-msgstr ""
+msgstr "Translazio atzikitzea:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
-msgstr ""
+msgstr "Biratze atxikitzea (graduak):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
-msgstr ""
+msgstr "Eskala atxikitzea (%):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
@@ -7431,7 +7525,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7500,7 +7594,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
-msgstr ""
+msgstr "Atxikitze modua:"
#: editor/plugins/texture_region_editor_plugin.cpp
#: scene/resources/visual_shader.cpp
@@ -7509,11 +7603,11 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
-msgstr ""
+msgstr "Pixel atxikitzea"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Grid Snap"
-msgstr ""
+msgstr "Sareta atxikitzea"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
@@ -7545,19 +7639,19 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove All Items"
-msgstr ""
+msgstr "Kendu elementu guztiak"
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
msgid "Remove All"
-msgstr ""
+msgstr "Kendu guztiak"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Edit Theme"
-msgstr ""
+msgstr "Editatu azala"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
-msgstr ""
+msgstr "Azalaren edizio menua."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
@@ -7577,7 +7671,7 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create From Current Editor Theme"
-msgstr ""
+msgstr "Sortu editorearen uneko azaletik"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Toggle Button"
@@ -7686,7 +7780,7 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme File"
-msgstr ""
+msgstr "Azal fitxategia"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
@@ -7910,6 +8004,7 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
+"Gaitu atxikitzea eta erakutsi sareta (Inspektorearen bidez konfiguragarria)."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display Tile Names (Hold Alt Key)"
@@ -8087,7 +8182,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9096,7 +9191,7 @@ msgstr ""
#: editor/project_export.cpp
msgid "Features"
-msgstr ""
+msgstr "Ezaugarriak"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
@@ -9104,11 +9199,11 @@ msgstr ""
#: editor/project_export.cpp
msgid "Feature List:"
-msgstr ""
+msgstr "Ezaugarri zerrenda:"
#: editor/project_export.cpp
msgid "Script"
-msgstr ""
+msgstr "Scripta"
#: editor/project_export.cpp
msgid "Script Export Mode:"
@@ -9116,11 +9211,11 @@ msgstr ""
#: editor/project_export.cpp
msgid "Text"
-msgstr ""
+msgstr "Testua"
#: editor/project_export.cpp
msgid "Compiled"
-msgstr ""
+msgstr "Konpilatuta"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
@@ -9171,11 +9266,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Errorea pakete fitxategia irekitzean (ez dago ZIP formatuan)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9183,11 +9283,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr ""
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Aukeratu \"project.godot\" edo \".zip\" fitxategia."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9367,6 +9467,8 @@ msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
+"Ezin da proiektua exekutatu: Aktiboak inportatu behar dira.\n"
+"Editatu proiektua hasierako inportazioa abiatzeko."
#: editor/project_manager.cpp
msgid "Are you sure to run %d projects at once?"
@@ -9402,6 +9504,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9447,6 +9550,15 @@ msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+"Orain ez duzu proiekturik.\n"
+"Adibide ofizialak arakatu nahi dituzu aktiboen liburutegian?"
+
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -9825,14 +9937,22 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Erabili adierazpen erregularrak"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr ""
@@ -9867,11 +9987,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9897,10 +10017,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9909,11 +10025,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr ""
+msgid "PascalCase to snake_case"
+msgstr "PascalCase snake_case-ra"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9932,6 +10048,15 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Adierazpen erregularraren errorea"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -9995,8 +10120,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Scripta"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10031,6 +10157,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10153,6 +10283,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10199,11 +10336,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10323,6 +10460,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10363,6 +10504,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10371,8 +10516,8 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr ""
+msgid "Script path/name is valid."
+msgstr "Scriptaren bidea/izena baliozkoa da."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10395,6 +10540,14 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Oharra: Inkorporatutako gidoiek muga batzuk dituzte eta ezin dira editatu "
+"kanpoko editore batekin."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10463,6 +10616,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10511,8 +10668,8 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+msgid "Export list to a CSV file"
+msgstr "Esportatu zerrenda CSV fitxategi batera"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -10788,7 +10945,7 @@ msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Snap View"
-msgstr ""
+msgstr "Atxikitu ikuspegia"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Disabled"
@@ -11377,6 +11534,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11400,6 +11561,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11577,6 +11764,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11764,6 +11957,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11784,6 +11982,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12003,6 +12206,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/extract.py b/editor/translations/extract.py
index e7ebda32df..93124ec30c 100755
--- a/editor/translations/extract.py
+++ b/editor/translations/extract.py
@@ -10,31 +10,32 @@ import sys
line_nb = False
for arg in sys.argv[1:]:
- if (arg == "--with-line-nb"):
+ if arg == "--with-line-nb":
print("Enabling line numbers in the context locations.")
line_nb = True
else:
os.sys.exit("Non supported argument '" + arg + "'. Aborting.")
-if (not os.path.exists("editor")):
+if not os.path.exists("editor"):
os.sys.exit("ERROR: This script should be started from the root of the git repo.")
matches = []
-for root, dirnames, filenames in os.walk('.'):
+for root, dirnames, filenames in os.walk("."):
dirnames[:] = [d for d in dirnames if d not in ["thirdparty"]]
- for filename in fnmatch.filter(filenames, '*.cpp'):
+ for filename in fnmatch.filter(filenames, "*.cpp"):
matches.append(os.path.join(root, filename))
- for filename in fnmatch.filter(filenames, '*.h'):
+ for filename in fnmatch.filter(filenames, "*.h"):
matches.append(os.path.join(root, filename))
matches.sort()
unique_str = []
unique_loc = {}
+ctx_group = {} # Store msgctx, msg, and locations.
main_po = """
-# LANGUAGE translation of the Godot Engine editor
+# LANGUAGE translation of the Godot Engine editor.
# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
@@ -45,66 +46,257 @@ main_po = """
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\\n"
+"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\\n"
+"MIME-Version: 1.0\\n"
"Content-Type: text/plain; charset=UTF-8\\n"
-"Content-Transfer-Encoding: 8-bit\\n"
+"Content-Transfer-Encoding: 8-bit\\n"\n
"""
+
+def _write_message(msgctx, msg, msg_plural, location):
+ global main_po
+ main_po += "#: " + location + "\n"
+ if msgctx != "":
+ main_po += 'msgctxt "' + msgctx + '"\n'
+ main_po += 'msgid "' + msg + '"\n'
+ if msg_plural != "":
+ main_po += 'msgid_plural "' + msg_plural + '"\n'
+ main_po += 'msgstr[0] ""\n'
+ main_po += 'msgstr[1] ""\n\n'
+ else:
+ main_po += 'msgstr ""\n\n'
+
+
+def _add_additional_location(msgctx, msg, location):
+ global main_po
+ # Add additional location to previous occurrence.
+ if msgctx != "":
+ msg_pos = main_po.find('\nmsgctxt "' + msgctx + '"\nmsgid "' + msg + '"')
+ else:
+ msg_pos = main_po.find('\nmsgid "' + msg + '"')
+
+ if msg_pos == -1:
+ print("Someone apparently thought writing Python was as easy as GDScript. Ping Akien.")
+ main_po = main_po[:msg_pos] + " " + location + main_po[msg_pos:]
+
+
+def _write_translator_comment(msgctx, msg, translator_comment):
+ if translator_comment == "":
+ return
+
+ global main_po
+ if msgctx != "":
+ msg_pos = main_po.find('\nmsgctxt "' + msgctx + '"\nmsgid "' + msg + '"')
+ else:
+ msg_pos = main_po.find('\nmsgid "' + msg + '"')
+
+ # If it's a new message, just append comment to the end of PO file.
+ if msg_pos == -1:
+ main_po += _format_translator_comment(translator_comment, True)
+ return
+
+ # Find position just before location. Translator comment will be added there.
+ translator_comment_pos = main_po.rfind("\n\n#", 0, msg_pos) + 2
+ if translator_comment_pos - 2 == -1:
+ print("translator_comment_pos not found")
+ return
+
+ # Check if a previous translator comment already exists. If so, merge them together.
+ if main_po.find("TRANSLATORS:", translator_comment_pos, msg_pos) != -1:
+ translator_comment_pos = main_po.find("\n#:", translator_comment_pos, msg_pos) + 1
+ if translator_comment_pos == 0:
+ print('translator_comment_pos after "TRANSLATORS:" not found')
+ return
+ main_po = (
+ main_po[:translator_comment_pos]
+ + _format_translator_comment(translator_comment, False)
+ + main_po[translator_comment_pos:]
+ )
+ return
+
+ main_po = (
+ main_po[:translator_comment_pos]
+ + _format_translator_comment(translator_comment, True)
+ + main_po[translator_comment_pos:]
+ )
+
+
+def _format_translator_comment(comment, new):
+ if not comment:
+ return ""
+
+ comment_lines = comment.split("\n")
+
+ formatted_comment = ""
+ if not new:
+ for comment in comment_lines:
+ formatted_comment += "#. " + comment.strip() + "\n"
+ return formatted_comment
+
+ formatted_comment = "#. TRANSLATORS: "
+ for i in range(len(comment_lines)):
+ if i == 0:
+ formatted_comment += comment_lines[i].strip() + "\n"
+ else:
+ formatted_comment += "#. " + comment_lines[i].strip() + "\n"
+ return formatted_comment
+
+
+def _is_block_translator_comment(translator_line):
+ line = translator_line.strip()
+ if line.find("//") == 0:
+ return False
+ else:
+ return True
+
+
+def _extract_translator_comment(line, is_block_translator_comment):
+ line = line.strip()
+ reached_end = False
+ extracted_comment = ""
+
+ start = line.find("TRANSLATORS:")
+ if start == -1:
+ start = 0
+ else:
+ start += len("TRANSLATORS:")
+
+ if is_block_translator_comment:
+ # If '*/' is found, then it's the end.
+ if line.rfind("*/") != -1:
+ extracted_comment = line[start : line.rfind("*/")]
+ reached_end = True
+ else:
+ extracted_comment = line[start:]
+ else:
+ # If beginning is not '//', then it's the end.
+ if line.find("//") != 0:
+ reached_end = True
+ else:
+ start = 2 if start == 0 else start
+ extracted_comment = line[start:]
+
+ return (not reached_end, extracted_comment)
+
+
def process_file(f, fname):
global main_po, unique_str, unique_loc
+ patterns = ['RTR("', 'TTR("', 'TTRC("', 'TTRN("', 'RTRN("']
+
l = f.readline()
lc = 1
- while (l):
+ reading_translator_comment = False
+ is_block_translator_comment = False
+ translator_comment = ""
+
+ while l:
+
+ # Detect translator comments.
+ if not reading_translator_comment and l.find("TRANSLATORS:") != -1:
+ reading_translator_comment = True
+ is_block_translator_comment = _is_block_translator_comment(l)
+ translator_comment = ""
+
+ # Gather translator comments. It will be gathered for the next translation function.
+ if reading_translator_comment:
+ reading_translator_comment, extracted_comment = _extract_translator_comment(l, is_block_translator_comment)
+ if extracted_comment != "":
+ translator_comment += extracted_comment + "\n"
+ if not reading_translator_comment:
+ translator_comment = translator_comment[:-1] # Remove extra \n at the end.
- patterns = ['RTR(\"', 'TTR(\"', 'TTRC(\"']
idx = 0
pos = 0
- while (pos >= 0):
+
+ while not reading_translator_comment and pos >= 0:
+ # Loop until a pattern is found. If not, next line.
pos = l.find(patterns[idx], pos)
- if (pos == -1):
- if (idx < len(patterns) - 1):
+ if pos == -1:
+ if idx < len(patterns) - 1:
idx += 1
pos = 0
continue
pos += len(patterns[idx])
+ # Read msg until "
msg = ""
- while (pos < len(l) and (l[pos] != '"' or l[pos - 1] == '\\')):
+ while pos < len(l) and (l[pos] != '"' or l[pos - 1] == "\\"):
msg += l[pos]
pos += 1
- location = os.path.relpath(fname).replace('\\', '/')
- if (line_nb):
+ # Read plural.
+ msg_plural = ""
+ if patterns[idx] in ['TTRN("', 'RTRN("']:
+ pos = l.find('"', pos + 1)
+ pos += 1
+ while pos < len(l) and (l[pos] != '"' or l[pos - 1] == "\\"):
+ msg_plural += l[pos]
+ pos += 1
+
+ # Read context.
+ msgctx = ""
+ pos += 1
+ read_ctx = False
+ while pos < len(l):
+ if l[pos] == ")":
+ break
+ elif l[pos] == '"':
+ read_ctx = True
+ break
+ pos += 1
+
+ pos += 1
+ if read_ctx:
+ while pos < len(l) and (l[pos] != '"' or l[pos - 1] == "\\"):
+ msgctx += l[pos]
+ pos += 1
+
+ # File location.
+ location = os.path.relpath(fname).replace("\\", "/")
+ if line_nb:
location += ":" + str(lc)
- if (not msg in unique_str):
- main_po += "\n#: " + location + "\n"
- main_po += 'msgid "' + msg + '"\n'
- main_po += 'msgstr ""\n'
- unique_str.append(msg)
- unique_loc[msg] = [location]
- elif (not location in unique_loc[msg]):
- # Add additional location to previous occurrence too
- msg_pos = main_po.find('\nmsgid "' + msg + '"')
- if (msg_pos == -1):
- print("Someone apparently thought writing Python was as easy as GDScript. Ping Akien.")
- main_po = main_po[:msg_pos] + ' ' + location + main_po[msg_pos:]
- unique_loc[msg].append(location)
+ # Write translator comment.
+ _write_translator_comment(msgctx, msg, translator_comment)
+ translator_comment = ""
+
+ if msgctx != "":
+ # If it's a new context or a new message within an existing context, then write new msgid.
+ # Else add location to existing msgid.
+ if not msgctx in ctx_group:
+ _write_message(msgctx, msg, msg_plural, location)
+ ctx_group[msgctx] = {msg: [location]}
+ elif not msg in ctx_group[msgctx]:
+ _write_message(msgctx, msg, msg_plural, location)
+ ctx_group[msgctx][msg] = [location]
+ elif not location in ctx_group[msgctx][msg]:
+ _add_additional_location(msgctx, msg, location)
+ ctx_group[msgctx][msg].append(location)
+ else:
+ if not msg in unique_str:
+ _write_message(msgctx, msg, msg_plural, location)
+ unique_str.append(msg)
+ unique_loc[msg] = [location]
+ elif not location in unique_loc[msg]:
+ _add_additional_location(msgctx, msg, location)
+ unique_loc[msg].append(location)
l = f.readline()
lc += 1
+
print("Updating the editor.pot template...")
for fname in matches:
- with open(fname, "r") as f:
+ with open(fname, "r", encoding="utf8") as f:
process_file(f, fname)
with open("editor.pot", "w") as f:
f.write(main_po)
-if (os.name == "posix"):
+if os.name == "posix":
print("Wrapping template at 79 characters for compatibility with Weblate.")
os.system("msgmerge -w79 editor.pot editor.pot > editor.pot.wrap")
shutil.move("editor.pot.wrap", "editor.pot")
@@ -112,7 +304,7 @@ if (os.name == "posix"):
shutil.move("editor.pot", "editor/translations/editor.pot")
# TODO: Make that in a portable way, if we care; if not, kudos to Unix users
-if (os.name == "posix"):
+if os.name == "posix":
added = subprocess.check_output(r"git diff editor/translations/editor.pot | grep \+msgid | wc -l", shell=True)
removed = subprocess.check_output(r"git diff editor/translations/editor.pot | grep \\\-msgid | wc -l", shell=True)
print("\n# Template changes compared to the staged status:")
diff --git a/editor/translations/fa.po b/editor/translations/fa.po
index 5d071126c6..2d17cc0abb 100644
--- a/editor/translations/fa.po
+++ b/editor/translations/fa.po
@@ -10,14 +10,17 @@
# sayyed hamed nasib <cghamed752@chmail.ir>, 2017.
# Behrooz Kashani <bkashani@gmail.com>, 2018.
# Mahdi <sadisticwarlock@gmail.com>, 2018.
-# hpn33 <hamed.hpn332@gmail.com>, 2019.
-# Focus <saeeddashticlash@gmail.com>, 2019.
+# hpn33 <hamed.hpn332@gmail.com>, 2019, 2020.
+# Focus <saeeddashticlash@gmail.com>, 2019, 2020.
+# mohamad por <mohamad24xx@gmail.com>, 2020.
+# Tetra Homer <tetrahomer@gmail.com>, 2020.
+# Farshad Faemiyi <ffaemiyi@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-09-26 11:50+0000\n"
-"Last-Translator: Focus <saeeddashticlash@gmail.com>\n"
+"PO-Revision-Date: 2020-09-16 18:09+0000\n"
+"Last-Translator: Farshad Faemiyi <ffaemiyi@gmail.com>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/"
"godot/fa/>\n"
"Language: fa\n"
@@ -25,26 +28,23 @@ 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 3.9-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
-#, fuzzy
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
-"نوع آرگومان برای متد ()convert ‌ نامعتبر است ،‌ از ثابت های *_TYPE‌ استفاده "
-"کنید ."
+msgstr "نوع ورودی برای ()convert نامعتبر است, ثوابت *_TYPE‌ بکار گیرید ."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "یک رشته (string) در اندازه 1 (کاراکتر) انتظار می رود."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
-"تعداد بایت های مورد نظر برای رمزگشایی بایت ها کافی نیست ،‌ و یا فرمت نامعتبر "
+"تعداد بایت های مورد نظر برای رمزگشایی بایت ها کافی نیست،‌ و یا فرمت نامعتبر "
"است ."
#: core/math/expression.cpp
@@ -53,61 +53,59 @@ msgstr "ورودی نامعتبر i% (تایید نشده) در عبارت"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "نمی توان از self استفاده کرد چون instance = null هست (تایید نشده)"
+msgstr "نمی توان self را بکار گرفت چون instance = null هست (تایید نشده)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "نام دارایی ایندکس نامعتبر 's%' در گره s%."
+msgstr "عملگر های نامعتبر به عملگر %s, %s و %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "نام دارایی ایندکس نامعتبر 's%' در گره s%."
+msgstr "نوع ایندکس %s برای نوع اصلی %s نامعتبر است"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr "شاخص نامگذاری شده \"٪ s\" برای نوع پایه٪ s نامعتبر است"
+msgstr "ایندکس اسمی '%s' برای نوع اصلی %s نامعتبر است"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ": آرگومان نوع نامعتبر آرگومان های نامعتبر برای ساخت '٪ s'"
+msgstr "آرگومان های نامعتبر برای ساخت '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "در تماس با '٪ s':"
+msgstr "به هنگام فراخوان تابع'%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "بایت"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "کیلوبایت"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "مگابایت"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "گیگابایت"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "ترابایت"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "پتابایت"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "اگزابایت"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "ازاد کردن"
+msgstr "آزاد کردن"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -123,91 +121,84 @@ msgstr "زمان:"
#: editor/animation_bezier_editor.cpp
msgid "Value:"
-msgstr "ارزش:"
+msgstr "مقدار:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "کلید را وارد کن"
+msgstr "کلید را اینجا وارد کنید"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "کلید تکراری درست کن"
+msgstr "تکرار کلید(های) منتخب"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "کلید‌ها را پاک کن"
+msgstr "حذف کلید(های) منتخب"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr "Bezier Point را اضافه کنید"
+msgstr "افزودن نقطه بِزیِر"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "برداشتن نقطه"
+msgstr "انتقال نقاط بِزیِر"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "تکرار کلید‌های انیمیشن"
+msgstr "تکرار کلید ‌های متحرک"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "کلیدها را در انیمیشن حذف کن"
+msgstr "حذف کلید های متحرک"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "تغییر زمان فریم کلید در انیمیشن"
+msgstr "تغییر زمان لحظه‌کلیدِ متحرک"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "انتقال را در انیمیشن تغییر بده"
+msgstr "تغییر انتقالی متحرک"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "انتقال را در انیمیشن تغییر بده"
+msgstr "تغییر دگرشکل متحرک"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "تغییر مقدار فریم کلید در انیمیشن"
+msgstr "تغییر مقدار لحظه‌کلید متحرک"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr "فراخوانی را در انیمیشن تغییر بده"
+msgstr "تغییر فراخوان متحرک"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "تغییر زمان فریم کلید در انیمیشن"
+msgstr "تغییرات زمان لحظه‌کلید متحرک"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "انتقال را در انیمیشن تغییر بده"
+msgstr "تغییرات انتقالی متحرک"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "انتقال را در انیمیشن تغییر بده"
+msgstr "تغییرات دگرشکل متحرک"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "تغییر مقدار فریم کلید در انیمیشن"
+msgstr "تغییرات مقدار لحظه‌کلید متحرک"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "فراخوانی را در انیمیشن تغییر بده"
+msgstr "تغییرات فراخوان متحرک"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "طول انیمیشن را تغییر بده"
+msgstr "تغییر طول انیمیشن"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr "حلقه(loop) انیمیشن را تغییر دهید"
+msgstr "تغییر حلقه(loop) انیمیشن"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -215,15 +206,15 @@ msgstr "ویژگی مسیر"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr "مسیر 3D Transform"
+msgstr "مسیر دگرشکل 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr "صدا زدن Method Track"
+msgstr "فراخوان تابع مسیر"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "مسیر منحنی بِزیِر"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
@@ -268,7 +259,7 @@ msgstr "تغییرمیسر path"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "روشن / خاموش کردن این Track."
+msgstr "دِگرحالتِ روشن/خاموش این قطعه."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
@@ -292,7 +283,7 @@ msgstr "زمان(s): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr "Toggle Track Enabled"
+msgstr "ضامن ترک فعال است"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -338,7 +329,7 @@ msgstr "درج کلید"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
-msgstr "کپی کردن (Duplicate ) کلید(key)"
+msgstr "تکرار کلید(ها)"
#: editor/animation_track_editor.cpp
msgid "Delete Key(s)"
@@ -366,7 +357,7 @@ msgstr "یک ترک جدید برای s% بساز و کلید را درج کن؟
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "ساختن تعداد d% ترک جدید، ودرج کلیدها؟"
+msgstr "ساختن %d قطعه جدید و درج کلیدها؟"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -426,79 +417,72 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "آهنگ های انیمیشن فقط می توانند به گره های انیمش پلیر اشاره کنند."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "یک مجری انیمیشن نمی تواند خود را محرک کند، فقط سایر مجریان."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "بدون ریشه اضافه کردن مسیر امکان پذیر نیست"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "مسیر نامعتبر برای بِزیِر( زیر-خواص نامناسب)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "ترک را اضافه کن"
+msgstr "افزودن مسیر بِزیِر"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "مسیر قطعه نامعتبر، پس نمی‌توان یک کلید به آن افزود."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "درج ترک و کلید در انیمیشن"
+msgstr "افزودن کلید مسیر دگرشکل"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "ترک را اضافه کن"
+msgstr "افزودن کلید مسیر"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "مسیر نامعتبر است ، بنابراین نمی توانید یک کلید روش اضافه کنید."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "درج ترک و کلید در انیمیشن"
+msgstr "افزودن تابع کلید میسر"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet در اسکریپت پیدا نشد: "
+msgstr "تابع در شئ یافت نشد: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "کلیدها را در انیمیشن جابجا کن"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "حافظه پنهان خالی است!"
+msgstr "حافظه پنهان خالی است"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "مسیر به سمت گره:"
+msgstr "جاگذاری مسیر ها"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr "کلیدها را در انیمیشن تغییر مقیاس بده"
+msgstr "اندازه کلید های متحرک"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "این گزینه برای اصلاح بِزیِر کار نمی کند, چون تنها یک مسیر واحد است."
#: editor/animation_track_editor.cpp
msgid ""
@@ -512,42 +496,48 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"این انیمیشن متعلق به یک صحنه ورودی است, بنابراین تغییرات در مسیرهای ورودی "
+"ذخیره نشده‌اند.\n"
+"\n"
+"برای امکان اضافه کردن مسیر های سفارشی, به تنظیمات ورودی صحنه بروید و\n"
+"\"انیمیشن > ذخیره‌سازی\" به \"پرونده ها\", \"انیمیشن > نگه داشتن مسیر های "
+"سفارشی\" را تنظیم و فعال کنید، سپس ازنو-وارد کنید.\n"
+"با وارد کردن از «پیش تعیین شده»ای که انیمیشن ها را به صورت پرونده‌های جداگانه "
+"وارد می کند، می‌توانید این روش جایگزین را بکار گیرید."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "هشدار: در حال ویرایش انیمیشن وارد شده"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr ""
-"یک AnimationPlayer از درخت صحنه انتخاب کنید تا انیمیشن‌ها را ویرایش کنید."
+msgstr "یک گره AnimationPlayer را برای ایجاد و ویرایش انیمیشن ها برگزینید."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "فقط مسیرهای از گره های انتخاب شده در درخت نشان داده شود."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
msgstr ""
+"مسیرها را بر اساس گره گروه‌بندی کنید یا آن‌ها را به عنوان لیست ساده نمایش دهید."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "گام(ها):"
+msgstr "چفت:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "گره انیمیشن"
+msgstr "مقدار مرحله انیمیشن."
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "ثانیه ها"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr ""
+msgstr "لحظه بر ثانیه"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -560,13 +550,12 @@ msgid "Edit"
msgstr "ویرایش"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "گره انیمیشن"
+msgstr "خصوصیات انیمیشن."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr ""
+msgstr "کپی میسر ها"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -578,26 +567,23 @@ msgstr "از مکان‌نما تغییر مقیاس بده"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "انتخاب شده را به دو تا تکثیر کن"
+msgstr "تکثیر برگزیده"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "ترانهاده را به دو تا تکثیر کن"
+msgstr "تکثیر جابجایی"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "انتخاب شده را حذف کن"
+msgstr "حذف برگزیده"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "به گام بعدی برو"
+msgstr "برو به گام بعد"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "به گام قبلی برو"
+msgstr "برو به گام پیشین"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -609,11 +595,11 @@ msgstr "انیمیشن را پاکسازی کن"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "گره متحرک را انتخاب کنید:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "بکارگیری منحنی بِزیِر"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -660,9 +646,8 @@ msgid "Scale Ratio:"
msgstr "نسبت تغییر مقیاس:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "دارایی Setter را اضافه کن"
+msgstr "انتخاب میسرها جهت تکثیر"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -671,17 +656,15 @@ msgstr "دارایی Setter را اضافه کن"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr "کپی کردن"
+msgstr "کپی"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "گره انتخاب"
+msgstr "انتخاب همه/هیچ"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "ترک را اضافه کن"
+msgstr "افزودن کلیپ آهنگ صوتی"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -712,17 +695,16 @@ msgid "Line Number:"
msgstr "شماره خط:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "تعداد d% رخداد جایگزین شد."
+msgid "%d replaced."
+msgstr "%d جایگزین شده."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "%d منطبق."
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "تطبیقی ندارد"
+msgstr "%d هم‌خوانی."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -732,7 +714,7 @@ msgstr "بین حروف کوچک و بزرگ لاتین تمایز قائل شو
msgid "Whole Words"
msgstr "عین کلمات (بدون هیچ کم و کاستی)"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "جایگزینی"
@@ -747,7 +729,7 @@ msgstr "تنها در قسمت انتخاب شده"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "استاندارد"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
@@ -757,54 +739,52 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "بزرگنمایی بیشتر"
+msgstr "بزرگنمایی"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "بزرگنمایی کمتر"
+msgstr "کوچکنمایی"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "بازنشانی بزرگنمایی"
+msgstr "باز‌نشانی مقیاس"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "هشدارها"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "شماره های خط و ستون."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "متد در گره مقصد باید مشخص شده باشد!"
+msgstr "تابع در گره مقصد باید مشخص شده باشد."
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "اسم تابع باید یک شناسه‌ی معتبر باشد."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
-"متد هدف پیدا نشد! لطفا یک متد صحیح مشخص کنید یا یک اسکریپت به گره هدف الحاق "
-"کنید."
+"متد هدف پیدا نشد. یک تابع معتبر تعیین کنید یا یک اسکریپت به گره هدف وصل کنید."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
msgstr "اتصال به گره:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "اتصال به گره:"
+msgstr "اتصال به اسکریپت:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "سیگنال ها:"
+msgstr "از سیگنال:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
@@ -836,18 +816,16 @@ msgid "Extra Call Arguments:"
msgstr "آرگومان‌های اضافی فراخوانی:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "انتخاب حالت"
+msgstr "روش گیرنده:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "متعادل شده"
+msgstr "پیشرفته"
#: editor/connections_dialog.cpp
msgid "Deferred"
-msgstr "معوق"
+msgstr "به تعویق افتاده"
#: editor/connections_dialog.cpp
msgid ""
@@ -863,15 +841,13 @@ msgid "Disconnects the signal after its first emission."
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "اتصال سیگنال:"
+msgstr "نمی توان سیگنال را متصل کرد"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -887,9 +863,8 @@ msgid "Connect"
msgstr "اتصال"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "سیگنال ها:"
+msgstr "سیگنال:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
@@ -900,9 +875,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "'s%' را از 's%' جدا کن"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "'s%' را از 's%' جدا کن"
+msgstr "جدا کردن همه از سیگنال: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -914,41 +888,42 @@ msgid "Disconnect"
msgstr "عدم اتصال"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "اتصال سیگنال:"
+msgstr "وصل یک سیگنال به یک تابع"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "خطای اتصال"
+msgstr "ویرایش اتصال:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
+"آیا مطمئن هستید که می خواهید همه اتصالات را از سیگنال \"٪ s\" حذف کنید؟"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "سیگنال‌ها"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "صافی کردن گره‌ها"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "عدم اتصال"
+msgstr "جدا کردن همه"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "ویرایش"
+msgstr "ویرایش..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "روش ها"
+msgstr "برو به تابع"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -972,7 +947,7 @@ msgid "Recent:"
msgstr "اخیر:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "جستجو:"
@@ -1000,22 +975,20 @@ msgid "Dependencies For:"
msgstr "بستگی‌ها برای:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"صحنه‌ی 's%' در حال حاضر ویرایش شده است.\n"
-"تغییرات مؤثر نخواهد بود مگر با بارگذاری مجدد."
+"ویرایش صحنه 's%' شروع شده است.\n"
+"تغییرات تنها وقتی جلوه گرند که از نو بارگیری شوند."
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"منابع 's%' در حال استفاده است.\n"
-"تغییرات با بارگذاری مجدد مؤثر خواهد بود."
+"منابع 's%' بکار رفته‌اند.\n"
+"تغییرات تنها وقتی جلوه گرند که از نو بارگیری شوند."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -1029,7 +1002,7 @@ msgstr "منبع"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
#: editor/project_manager.cpp editor/project_settings_editor.cpp
msgid "Path"
-msgstr "مسیر"
+msgstr "آدرس"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
@@ -1062,9 +1035,8 @@ msgid "Owners Of:"
msgstr "مالکانِ:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "آیا پرونده‌های انتخاب شده از پروژه حذف شوند؟ (بدون undo)"
+msgstr "آیا پرونده‌های انتخاب شده از طرح حذف شوند؟ (نمی‌توان بازیابی کرد)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1085,9 +1057,8 @@ msgid "Error loading:"
msgstr "خطا در بارگذاری:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "خطا در بارگذاری صحنه به دلیل بستگی‌های مفقود:"
+msgstr "به دلیل مفقود شدن وابستگی‌ها بارگیری انجام نشد:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1110,9 +1081,8 @@ msgid "Permanently delete %d item(s)? (No undo!)"
msgstr "به طور دائمی تعداد 'd%' آیتم را حذف کند؟ (بدون undo !)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "بستگی‌ها"
+msgstr "نمایش وابستگی‌ها"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
@@ -1124,7 +1094,7 @@ msgstr "پوینده‌ی منبع جدا افتاده"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr "حذف کن"
+msgstr "پاک"
#: editor/dependency_editor.cpp
msgid "Owns"
@@ -1158,6 +1128,9 @@ msgstr "بنیان‌گذاران پروژه"
msgid "Lead Developer"
msgstr "توسعه‌دهنده‌ی اصلی"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "مدیر پروژه "
@@ -1172,15 +1145,25 @@ msgstr "مؤلفان"
#: editor/editor_about.cpp
msgid "Platinum Sponsors"
-msgstr "اسپانسر‌های پلاتینیوم (درجه ۱)"
+msgstr "حامیان پلاتین"
#: editor/editor_about.cpp
msgid "Gold Sponsors"
-msgstr "اسپانسر‌های طلایی (درجه ۲)"
+msgstr "حامیان طلایی (درجه ۲)"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "اهداکنندگان نقره‌ای"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "اهداکنندگان برنزی"
#: editor/editor_about.cpp
msgid "Mini Sponsors"
-msgstr "اسپانسر‌های کوچک"
+msgstr "حامیان مالی کوچک"
#: editor/editor_about.cpp
msgid "Gold Donors"
@@ -1203,9 +1186,8 @@ msgid "License"
msgstr "مجوز"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
-msgstr "مجوز‌های شخص ثالث"
+msgstr "مجوز های شخص-ثالث"
#: editor/editor_about.cpp
msgid ""
@@ -1214,6 +1196,9 @@ msgid ""
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
+"Godot Engine به تعدادی از کتابخانه های منبع باز و شخص-ثالث رایگان متکی است "
+"که همگی با شرایط مجوز MIT سازگار هستند. در زیر لیستی جامع از کلیه مؤلفه های "
+"شخص ثالث با بیانیه های حق کپی برداری مربوطه و شرایط مجوز آنها قرار دارد."
#: editor/editor_about.cpp
msgid "All Components"
@@ -1229,39 +1214,36 @@ msgstr "گواهینامه"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Error opening package file, not in ZIP format."
-msgstr ""
+msgstr "خطای گشودن بسته بندی پرونده، به شکل ZIP نیست."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "پیش از این وجود داشته است"
+msgstr "%s (موجود است)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr "عست های غیر فشرده"
+msgstr "فشرده نشدن اَسِت ها"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "استخراج پرونده های زیر از بسته بندی انجام نشد:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "نمی‌تواند یک پوشه ایجاد شود."
+msgstr "و %s بیش تر پرونده ها."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
-msgstr ""
+msgstr "بسته با موفقیت نصب شد!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Success!"
-msgstr ""
+msgstr "موفقیت!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "محتواها:"
+msgstr "درون مایه های بسته بندی:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1273,73 +1255,73 @@ msgstr "نصب کننده پکیج ها"
#: editor/editor_audio_buses.cpp
msgid "Speakers"
-msgstr ""
+msgstr "بلندگوها"
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
-msgstr ""
+msgstr "افزودن جلوه"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
-msgstr ""
+msgstr "تغییر نام صوت گذرا"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Change Audio Bus Volume"
-msgstr "مقدار آرایه را تغییر بده"
+msgstr "تغییر مقدار صدای خطی"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
-msgstr ""
+msgstr "دِگرحالتِ صدای تکی خطی"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr ""
+msgstr "دِگرحالتِ صدای سکوت خطی"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr ""
+msgstr "دِگرحالتِ صدای جلوه های میان بر خطی"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr ""
+msgstr "انتخاب صدای ارسال گذرا"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr ""
+msgstr "افزودن صدای جلوه خطی"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr ""
+msgstr "انتقال جلوه خطی"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr "حذف اثر گذرا"
+msgstr "حذف جلوه خطی"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
-msgstr ""
+msgstr "برای چینش مجدد، بکشید و رها کنید."
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr ""
+msgstr "انفرادی"
#: editor/editor_audio_buses.cpp
msgid "Mute"
-msgstr ""
+msgstr "بدون صدا"
#: editor/editor_audio_buses.cpp
msgid "Bypass"
-msgstr ""
+msgstr "‌گذرگاه فرعی"
#: editor/editor_audio_buses.cpp
+#, fuzzy
msgid "Bus options"
-msgstr ""
+msgstr "گزینه های اتوبوس"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr ""
+msgstr "تکثیر کردن"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
@@ -1347,39 +1329,36 @@ msgstr "بازنشانی حجم"
#: editor/editor_audio_buses.cpp
msgid "Delete Effect"
-msgstr "حذف اثر"
+msgstr "حذف جلوه"
#: editor/editor_audio_buses.cpp
msgid "Audio"
-msgstr ""
+msgstr "صدا"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
-msgstr ""
+msgstr "افزودن کانل صوتی"
#: editor/editor_audio_buses.cpp
+#, fuzzy
msgid "Master bus can't be deleted!"
-msgstr ""
+msgstr "استاد اتوبوس قابل حذف نیست!"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Delete Audio Bus"
-msgstr "انیمیشن را بهینه‌سازی کن"
+msgstr "حذف صدای خطی"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Duplicate Audio Bus"
-msgstr "انتخاب شده را به دو تا تکثیر کن"
+msgstr "تکثیر صدای خطی"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Reset Bus Volume"
-msgstr "بازنشانی بزرگنمایی"
+msgstr "باز‌نشانی مقدار خطی"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Move Audio Bus"
-msgstr "کلید Add را جابجا کن"
+msgstr "انتقال صدای خطی"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
@@ -1406,9 +1385,8 @@ msgid "Invalid file, not an audio bus layout."
msgstr ""
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "خطا در بارگذاری:"
+msgstr "خطای ذخیره کردن پرونده: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
@@ -1457,23 +1435,20 @@ msgid "Valid characters:"
msgstr "کاراکترهای معتبر:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing engine class name."
-msgstr "نام نامعتبر. نباید با یک نام کلاس موجود در موتور برخوردی داشته باشد."
+msgstr "نباید با یک نام کلاس موتور موجود برخورد کند."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
-msgstr "نام نامعتبر. نباید یا یک نام نوع توکار برخوردی داشته باشد."
+msgstr "نباید با یک نام نوع درون-ساز موجود برخورد کند."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
-msgstr "نام نامعتبر. نباید با نام یک ثابت سراسری موجود برخوردی داشته باشد."
+msgstr "نباید با نام یک ثابت سراسری موجود برخوردی کند."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "کلمه کلیدی نمی تواند به عنوان یک نام خودبارگیر بکار برده شود."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
@@ -1484,8 +1459,9 @@ msgid "Rename Autoload"
msgstr "بارگذاری خودکار را تغییر نام بده"
#: editor/editor_autoload_settings.cpp
+#, fuzzy
msgid "Toggle AutoLoad Globals"
-msgstr ""
+msgstr "تغییر حالت اتماتیک لود عمومی"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
@@ -1495,7 +1471,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1503,18 +1479,9 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "مسیر نامعتبر."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "پرونده موجود نیست."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "در مسیرِ منبع نیست."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1535,10 +1502,14 @@ msgstr "نام گره:"
#: editor/editor_profiler.cpp editor/project_manager.cpp
#: editor/settings_config_dialog.cpp
msgid "Name"
-msgstr ""
+msgstr "نام"
#: editor/editor_autoload_settings.cpp
msgid "Singleton"
+msgstr "سینگلتون"
+
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
msgstr ""
#: editor/editor_data.cpp
@@ -1554,9 +1525,8 @@ msgid "Updating scene..."
msgstr ""
#: editor/editor_data.cpp editor/editor_properties.cpp
-#, fuzzy
msgid "[empty]"
-msgstr "(خالی)"
+msgstr "[پوچ]"
#: editor/editor_data.cpp
msgid "[unsaved]"
@@ -1594,15 +1564,15 @@ msgstr ""
#: editor/editor_export.cpp
msgid "Storing File:"
-msgstr ""
+msgstr "ذخیره فایل:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "هیچ الگوی صادراتی در مسیر مورد انتظار یافت نشد:"
#: editor/editor_export.cpp
msgid "Packing"
-msgstr ""
+msgstr "بسته بندی"
#: editor/editor_export.cpp
msgid ""
@@ -1645,91 +1615,77 @@ msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "ویرایشگر"
+msgstr "ویرایشگر 3بعدی"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "گشودن ویرایشگر اسکریپت"
+msgstr "ویرایشگر اسکریپت"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Asset Library"
-msgstr "گشودن کتابخانه عست"
+msgstr "کتابخانه دارایی"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "وارد کردن"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
-msgstr "نام گره:"
+msgstr "لنگرگاه گره:"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "سامانه پرونده"
#: editor/editor_feature_profile.cpp
-#, fuzzy
+msgid "Import Dock"
+msgstr "وارد کردن لنگرگاه"
+
+#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr "جایگزینی همه"
+msgstr "پاک‌کردن نمایه '%s'? (عدم بازگردانی)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Profile with this name already exists."
-msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!"
+msgstr "نمایه با این نام در حال حاضر وجود دارد."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "ویژگی:"
+msgstr "(خصوصیات غیرفعال شده)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "غیرفعال شده"
+msgstr "(ویرایشگر غیرفعال شده)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "توضیح:"
+msgstr "گزینه‌های کلاس:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enable Contextual Editor"
-msgstr "گشودن ویرایشگر متن"
+msgstr "فعال کردن ویرایشگر متنی"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "صافی کردن گره‌ها"
+msgstr "خصوصیات فعال شده:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Features:"
-msgstr "فهرست متدها:"
+msgstr "ویژگی های فعال شده:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Classes:"
-msgstr "جستجوی کلاسها"
+msgstr "کلاس های فعال شده:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
@@ -1742,23 +1698,20 @@ msgid ""
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "خطای بارگذاری قلم."
+msgstr "خطای ذخیره نمایه در مسیر: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "نسخه اخیر:"
+msgstr "نمایه موجود:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "تابع را بساز"
+msgstr "ساختن جریان"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1776,79 +1729,67 @@ msgid "Export"
msgstr "صدور"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "گره های موجود:"
+msgstr "نمایه‌های موجود:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "توضیحات"
+msgstr "گزینه های کلاس"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "New profile name:"
-msgstr "نام گره:"
+msgstr "نام نمایه جدید:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "کُندی در آغاز"
+msgstr "پاک کردن نمایه"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "مدیریت صدور قالب ها"
+msgstr "ویژگی نمایه Godot"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Import Profile(s)"
-msgstr "پروژه واردشده"
+msgstr "وارد کردن نمایه(ها)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Export Profile"
-msgstr "صدور پروژه"
+msgstr "صادر کردن نمایه"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Manage Editor Feature Profiles"
-msgstr "مدیریت صدور قالب ها"
+msgstr "مدیریت ویژگی نمایه‌های ویرایشگر"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select Current Folder"
-msgstr "ساختن پوشه"
+msgstr "برگزیدن پوشه موجود"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "فایل وجود دارد، آیا بازنویسی شود؟"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "انتخاب حالت"
+msgstr "برگزیدن این پوشه"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "باز شدن مدیر پروژه؟"
+msgstr "گشودن در مدیر پرونده"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "باز شدن مدیر پروژه؟"
+msgstr "نمایش فایل داخلی مرجع"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
msgstr "ساختن پوشه..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1925,29 +1866,24 @@ msgid "Move Favorite Down"
msgstr ""
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "رفتن به پوشه والد"
+msgstr "برو به پوشه پیشین."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "رفتن به پوشه والد"
+msgstr "برو به پوشه بعد."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "رفتن به پوشه والد"
+msgstr "برو به پوشه والد."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "جستجوی کلاسها"
+msgstr "نوسازی پرونده‌ها."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "ناتوان در ساختن پوشه."
+msgstr "پوشه موجود (غیر)محبوب."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
@@ -1967,7 +1903,7 @@ msgstr "پوشه‌ها و پرونده‌ها:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -1977,7 +1913,7 @@ msgstr "پرونده:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr "باید از یک پسوند معتبر استفاده شود."
+msgstr "باید یک پسوند معتبر بکار گیرید."
#: editor/editor_file_system.cpp
msgid "ScanSources"
@@ -2011,9 +1947,8 @@ msgid "Inherited by:"
msgstr "به ارث رسیده به وسیله:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "توضیح:"
+msgstr "توضیح"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -2021,25 +1956,23 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "خصوصیات"
#: editor/editor_help.cpp
msgid "override:"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "پیشفرض"
+msgstr "پیش فرض:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "روش ها"
+msgstr "توابع"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "صافی کردن گره‌ها"
+msgstr "خصوصیات زمینه"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2047,17 +1980,15 @@ msgstr "شمارش ها"
#: editor/editor_help.cpp
msgid "Constants"
-msgstr "ثابت ها"
+msgstr "ثوابت"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "توضیحات مشخصه:"
+msgstr "توضیحات خصیصه"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "ارزش:"
+msgstr "(مقدار)"
#: editor/editor_help.cpp
msgid ""
@@ -2066,9 +1997,8 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "توضیحات"
+msgstr "توضیحات تابع"
#: editor/editor_help.cpp
msgid ""
@@ -2083,80 +2013,67 @@ msgstr "جستجوی راهنما"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
-msgstr "حساس به حالت (حروف لاتین)"
+msgstr "حساس به حروف کوچک و بزرگ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "جستجو"
+msgstr "نمایش سلسله‌مراتب"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "جایگزینی همه"
+msgstr "نشان دادن همه"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr ""
+msgstr "تنها کلاس‌ها"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "روش ها"
+msgstr "تنها روش‌ها"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "سیگنال‌ها"
+msgstr "تنها سیگنال‌ها"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "ثابت ها"
+msgstr "تنها ثوابت"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "ویژگی:"
+msgstr "تنها خصوصیات"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "دارایی Setter را اضافه کن"
+msgstr "تنها خصوصیات زمینه"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "عضوها"
+msgstr "نوع عضو"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "کلاس:"
+msgstr "کلاس"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "روش ها"
+msgstr "روش"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "سیگنال‌ها"
+msgstr "سیگنال‌"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
msgstr "ثابت"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "ویژگی:"
+msgstr "خصیصه"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "صافی کردن گره‌ها"
+msgstr "ویژگی زمینه"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2164,20 +2081,19 @@ msgstr "ویژگی:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "تعیین"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "تعیین چندگانه:"
#: editor/editor_log.cpp
msgid "Output:"
msgstr "خروجی:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "برداشتن انتخاب شده"
+msgstr "کپی برگزیده"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2190,31 +2106,30 @@ msgid "Clear"
msgstr "پاک کردن"
#: editor/editor_log.cpp
-#, fuzzy
msgid "Clear Output"
-msgstr "خروجی"
+msgstr "پاک کردن خروجی"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr ""
+msgstr "توقف"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
msgid "Start"
-msgstr ""
+msgstr "شروع"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/ثانیه"
#: editor/editor_network_profiler.cpp
msgid "Down"
-msgstr ""
+msgstr "پایین"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "بالا"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
@@ -2238,7 +2153,7 @@ msgstr ""
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "چارچوب جدید"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
@@ -2247,11 +2162,11 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr "موافقت"
+msgstr "قبول"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr ""
+msgstr "خطای ذخیره سازی منبع!"
#: editor/editor_node.cpp
msgid ""
@@ -2280,9 +2195,8 @@ msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Error while parsing '%s'."
-msgstr "خطای بارگذاری قلم."
+msgstr "خطا هنگام تجزیه '%s'."
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
@@ -2293,9 +2207,8 @@ msgid "Missing '%s' or its dependencies."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Error while loading '%s'."
-msgstr "خطای بارگذاری قلم."
+msgstr "خطا هنگام تجزیه '%s'."
#: editor/editor_node.cpp
msgid "Saving Scene"
@@ -2400,33 +2313,28 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
#: editor/editor_node.cpp editor/filesystem_dock.cpp
msgid "Open Scene"
-msgstr "باز کردن صحنه"
+msgstr "گشودن صحنه"
#: editor/editor_node.cpp
msgid "Open Base Scene"
-msgstr ""
+msgstr "گشودن صحنه اصلی"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "باز کن"
+msgstr "گشودن فوری..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr ""
+msgstr "گشودن فوری صحنه..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr ""
+msgstr "گشودن سریع اسکریپت..."
#: editor/editor_node.cpp
msgid "Save & Close"
@@ -2450,27 +2358,27 @@ msgstr "ذخیره صحنه در ..."
#: editor/editor_node.cpp
msgid "No"
-msgstr ""
+msgstr "نه"
#: editor/editor_node.cpp
msgid "Yes"
-msgstr "تایید"
+msgstr "بله"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr ""
+msgstr "این صحنه هرگز ذخیره نشده است. ذخیره قبل از اجرا؟"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr ""
+msgstr "این عملیات بدون یک صحنه انجام نمی شود."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr ""
+msgstr "صادر کردن کتابخانه شبکه مش"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr ""
+msgstr "این عملیات بدون یک گره ریشه ای انجام نمی شود."
#: editor/editor_node.cpp
msgid "Export Tile Set"
@@ -2489,16 +2397,18 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+msgid "Reload Saved Scene"
+msgstr "بازیابی صحنه ذخیره شده"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr ""
+msgstr "اجرا فوری صحنه…"
#: editor/editor_node.cpp
msgid "Quit"
@@ -2506,7 +2416,7 @@ msgstr "خروج"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr "از ویرایشگر خارج می شوید؟"
+msgstr "خروج از ویرایشگر؟"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
@@ -2536,12 +2446,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Close Scene"
-msgstr ""
+msgstr "بستن صحنه"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "باز کردن صحنه"
+msgstr "بازگشودن صحنه بسته شده"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2552,9 +2461,8 @@ msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Unable to load addon script from path: '%s'."
-msgstr "خطای بارگذاری قلم."
+msgstr "امکان بارگیری اسکریپت افزونه از مسیر وجود ندارد: '%s'."
#: editor/editor_node.cpp
msgid ""
@@ -2614,7 +2522,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Save Layout"
-msgstr ""
+msgstr "ذخیره لایه"
#: editor/editor_node.cpp
msgid "Delete Layout"
@@ -2627,50 +2535,44 @@ msgstr "پیشفرض"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "سامانه پرونده"
+msgstr "نمایش در فایل‌سیستم"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "پخش صحنه"
+msgstr "اجرای این صحنه"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "بستن"
+msgstr "بستن زبانه"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "بستن"
+msgstr "برگرداندن زبانه"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
-msgstr ""
+msgstr "بستن زبانه های دیگر"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "بستن زبانه ها به طرف راست"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "بستن"
+msgstr "بستن تمام زبانه ها"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
-msgstr ""
+msgstr "جاگرداندن زبانه صحنه"
#: editor/editor_node.cpp
msgid "%d more files or folders"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "%d more folders"
-msgstr "نمی‌تواند یک پوشه ایجاد شود."
+msgstr "%d پوشه‌های بیش تر"
#: editor/editor_node.cpp
msgid "%d more files"
@@ -2701,9 +2603,8 @@ msgid "Go to previously opened scene."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "کپی کردن"
+msgstr "کپی متن"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2742,9 +2643,8 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "ذخیره صحنه در ..."
+msgstr "ذخیره صحنه"
#: editor/editor_node.cpp
msgid "Convert To..."
@@ -2761,16 +2661,12 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr "خنثی کردن (Undo)"
+msgstr "عقب‌گرد"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
+msgstr "جلوگرد"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
@@ -2782,14 +2678,12 @@ msgid "Project"
msgstr "پروژه"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "ترجیحات پروژه"
+msgstr "تنظیمات طرح…"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "نسخه:"
+msgstr "مهار نسخه"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
@@ -2800,27 +2694,24 @@ msgid "Shut Down Version Control"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "صدور"
+msgstr "صدور…"
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "باز شدن مدیر پروژه؟"
+msgstr "گشودن پوشه اطلاعات طرح"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ابزارها"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "پوینده‌ی منبع جدا افتاده"
+msgstr "پوینده‌ی منبع جاافتاده"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2837,22 +2728,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2861,8 +2756,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2871,32 +2766,33 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "تغییر بده"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2904,9 +2800,8 @@ msgid "Editor"
msgstr "ویرایشگر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "ویرایشگر ترجیحات"
+msgstr "تنظیمات ویرایشگر…"
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2964,7 +2859,7 @@ msgstr "راهنما"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "جستجو"
@@ -2978,7 +2873,12 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "وارد کردن دوباره"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3376,7 +3276,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3403,6 +3304,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "انتخاب گره (ها) برای وارد شدن"
@@ -3592,7 +3497,7 @@ msgstr "خطای اتصال"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr "دست دادن خطای اس اس ال"
+msgstr "خطای اس اس ال اتفاق افتاد است"
#: editor/export_template_manager.cpp
#, fuzzy
@@ -4035,10 +3940,19 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
+#, fuzzy
+msgid "%d Files"
+msgstr " پوشه ها"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr ""
@@ -4047,10 +3961,6 @@ msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " پوشه ها"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr ""
@@ -4064,7 +3974,7 @@ msgid "Reimport"
msgstr "وارد کردن دوباره"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4100,10 +4010,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "منبع"
@@ -4634,7 +4540,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation"
-msgstr ""
+msgstr "انیمیشن"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -5219,7 +5125,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5992,11 +5898,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "ناتوان در ساختن پوشه."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6008,12 +5915,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "ساختن %s جدید"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "ناتوان در ساختن پوشه."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "ساختن %s جدید"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6065,19 +5990,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "انتخاب شده را تغییر مقیاس بده"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV1"
msgstr "پرونده:"
@@ -6957,14 +6920,6 @@ msgid "Open Godot online documentation."
msgstr "شمارش ها"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -7032,15 +6987,15 @@ msgid ""
msgstr "'s%' را از 's%' جدا کن"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "خط:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "افزودن وظیفه"
@@ -7423,6 +7378,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Lock View Rotation"
msgstr "بومی‌سازی"
@@ -7518,18 +7477,27 @@ msgid "Freelook Slow Modifier"
msgstr "غلطاندن به پایین."
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "بومی‌سازی"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "بومی‌سازی"
+msgid "XForm Dialog"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7885,7 +7853,7 @@ msgid "New Animation"
msgstr "تغییر نام انیمیشن"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8608,7 +8576,7 @@ msgstr "صدور مجموعه کاشی"
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9747,11 +9715,16 @@ msgstr "صدور با اشکال زدا"
#: editor/project_manager.cpp
#, fuzzy
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr "پرونده موجود نیست."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9759,11 +9732,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9989,14 +9962,14 @@ msgstr ""
"شما درخواست بررسی پوشه های s٪‌ برای پیدا کردن پروژه های گودات را داده اید. "
"آیا انجام این عمل را تایید می کنید؟‌"
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "مدیر پروژه"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
-msgstr "پروژه"
+msgstr "طرح ها"
#: editor/project_manager.cpp
msgid "Last Modified"
@@ -10036,6 +10009,18 @@ msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+"شما فعلا هیچ طرحی ندارید.\n"
+"آیا می خواهید طرح های نمونه رسمی را در کتابخانه دارایی کاوش کنید؟"
+
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"کادر جستجو طرح ها را با نام و مسیر اجزا گذشته تصفیه می کند.\n"
+"برای تصفیه کردن طرح ها با نام و مسیر کامل، پرس و جو باید حداقل دارای یک `/"
+"`کاراکتر باشد."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10272,7 +10257,7 @@ msgstr "تنظیمات پروژه (پروژه.گودات)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr "کلی"
+msgstr "عمومی"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -10280,7 +10265,7 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
-msgstr ""
+msgstr "باید ویرایشگر از نو شروع شود تا تغییرات جلوه کنند."
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -10363,7 +10348,7 @@ msgstr "بارگیری خودکار"
#: editor/project_settings_editor.cpp
msgid "Plugins"
-msgstr ""
+msgstr "پلاگین ها"
#: editor/property_editor.cpp
msgid "Preset..."
@@ -10430,14 +10415,24 @@ msgid "Batch Rename"
msgstr "تغییر نام"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "جایگزینی"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "انتقال را در انیمیشن تغییر بده"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr ""
@@ -10475,11 +10470,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10506,11 +10501,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "Regular Expressions"
-msgstr "انتقال را در انیمیشن تغییر بده"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10519,11 +10509,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10544,6 +10534,16 @@ msgstr ""
msgid "Reset"
msgstr "بازنشانی بزرگنمایی"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "انتقال را در انیمیشن تغییر بده"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "کاراکترهای معتبر:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "گره تغییر والد"
@@ -10609,8 +10609,8 @@ msgstr "ارث‌بری صحنهٔ فرزند"
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Clear Script"
-msgstr "صحنه جدید"
+msgid "Detach Script"
+msgstr "پیوست کردن اسکریپت"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10646,6 +10646,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "حذف گره(ها)"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "حذف گره(ها)"
@@ -10779,6 +10784,13 @@ msgid "Open Documentation"
msgstr "شمارش ها"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "افزودن گره فرزند"
@@ -10828,11 +10840,13 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
msgstr "پیوست کردن یک اسکریپت جدید یا از پیش موجود برای گره انتخابی."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+#, fuzzy
+msgid "Detach the script from the selected node."
msgstr "حذف یک اسکریپت برای گره انتخابی."
#: editor/scene_tree_dock.cpp
@@ -10961,6 +10975,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "پرونده موجود نیست."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "باید از یک پسوند معتبر استفاده شود."
@@ -11009,6 +11027,11 @@ msgstr "فایل وجود دارد، آیا بازنویسی شود؟"
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "مسیر نامعتبر."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "نام نامعتبر."
@@ -11018,7 +11041,7 @@ msgid "Invalid inherited parent name or path."
msgstr "نام دارایی ایندکس نامعتبر."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -11044,6 +11067,12 @@ msgid "Script file already exists."
msgstr "پیش از این وجود داشته است"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "کلاس:"
@@ -11125,6 +11154,10 @@ msgid "Copy Error"
msgstr "خطاهای بارگذاری"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "حذف کن"
@@ -11175,8 +11208,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "صدور پروژه"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12107,6 +12141,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12131,6 +12169,32 @@ msgstr "نام نامعتبر."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12317,7 +12381,7 @@ msgstr ""
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
-msgstr "یک CollisionPolygon2D خالی اثری بر برخورد ندارد."
+msgstr "یک CollisionPolygon2D خالی جلوه بر برخورد ندارد."
#: scene/2d/collision_shape_2d.cpp
msgid ""
@@ -12338,6 +12402,12 @@ msgstr ""
"یک شکل باید برای CollisionShape2D فراهم شده باشد تا عمل کند. لطفا یک شکل "
"منبع برای آن ایجاد کنید!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12354,9 +12424,7 @@ msgstr "یک بافت با شکل نور باید برای دارایی texture
#: scene/2d/light_occluder_2d.cpp
msgid ""
"An occluder polygon must be set (or drawn) for this occluder to take effect."
-msgstr ""
-"یک چندضلعی مسدود باید برای این مسدودکننده (occluder) تنظیم (یا ترسیم) شود تا "
-"تأثیرگذار باشد."
+msgstr "یک چندضلعی انسدادی باید تنظیم (یا ترسیم) شود تا جلوه کننده باشد."
#: scene/2d/light_occluder_2d.cpp
#, fuzzy
@@ -12528,7 +12596,7 @@ msgstr ""
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
-msgstr "یک CollisionPolygon خالی تأثیری بر برخورد ندارد."
+msgstr "یک CollisionPolygon خالی جلوه بر برخورد ندارد."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12556,6 +12624,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12576,6 +12649,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12668,6 +12746,8 @@ msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"محیط جهان نیاز به ویژگی \"محیط\" خود دارد تا دارای یک محیط باشد تا جلوه ای "
+"قابل دیدن داشته باشد."
#: scene/3d/world_environment.cpp
msgid ""
@@ -12819,6 +12899,10 @@ msgstr ""
"تا بتواند یک اندازه بگیرد. در غیر اینصورت، آن را یک RenderTarget قرار دهید و "
"بافت داخلی آن را برای نمایش به تعدادی گره تخصیص دهید."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12848,7 +12932,20 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "ثوابت قابل تغییر نیستند."
+
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "فایل‌سیستم و وارد‌کردن لنگرگاه"
+
+#~ msgid "Not in resource path."
+#~ msgstr "در مسیرِ منبع نیست."
+
+#, fuzzy
+#~ msgid "Clear Script"
+#~ msgstr "صحنه جدید"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "تعداد d% رخداد جایگزین شد."
#, fuzzy
#~ msgid "Brief Description"
diff --git a/editor/translations/fi.po b/editor/translations/fi.po
index bac46bbf8b..93bfde1e50 100644
--- a/editor/translations/fi.po
+++ b/editor/translations/fi.po
@@ -10,11 +10,12 @@
# Sami Lehtilä <sami.lehtila@gmail.com>, 2018.
# Tapani Niemi <tapani.niemi@kapsi.fi>, 2018, 2019, 2020.
# Tuomas Lähteenmäki <lahtis@gmail.com>, 2019.
+# Matti Niskanen <matti.t.niskanen@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
+"PO-Revision-Date: 2020-09-05 09:37+0000\n"
"Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/"
"godot/fi/>\n"
@@ -23,7 +24,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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -528,6 +529,7 @@ msgid "Seconds"
msgstr "Sekunnit"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -687,8 +689,8 @@ msgid "Line Number:"
msgstr "Rivinumero:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Korvattu %d osuvuutta."
+msgid "%d replaced."
+msgstr "%d korvattu."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -706,7 +708,7 @@ msgstr "Huomioi kirjainkoko"
msgid "Whole Words"
msgstr "Kokonaisia sanoja"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Korvaa"
@@ -756,6 +758,10 @@ msgid "Method in target node must be specified."
msgstr "Kohdesolmun metodi täytyy määrittää."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Metodin nimen täytyy olla kelvollinen tunniste."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -806,7 +812,7 @@ msgstr "Ylimääräiset argumentit:"
#: editor/connections_dialog.cpp
msgid "Receiver Method:"
-msgstr "Valitse metodi:"
+msgstr "Vastaanottava metodi:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -838,7 +844,6 @@ msgstr "Ei voida yhdistää signaalia"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -895,6 +900,11 @@ msgid "Signals"
msgstr "Signaalit"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Suodata laattoja"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Oletko varma, että haluat poistaa kaikki kytkennät tältä signaalilta?"
@@ -932,7 +942,7 @@ msgid "Recent:"
msgstr "Viimeaikaiset:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Hae:"
@@ -1113,6 +1123,9 @@ msgstr "Projektin perustajat"
msgid "Lead Developer"
msgstr "Pääkehittäjä"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Projektipäällikkö "
@@ -1134,6 +1147,14 @@ msgid "Gold Sponsors"
msgstr "Kultasponsorit"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Hopeasponsorit"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Pronssisponsorit"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Minisponsorit"
@@ -1444,7 +1465,7 @@ msgstr "Siirrä automaattisesti ladattavaa"
msgid "Remove Autoload"
msgstr "Poista automaattinen lataus"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Ota käyttöön"
@@ -1452,17 +1473,9 @@ msgstr "Ota käyttöön"
msgid "Rearrange Autoloads"
msgstr "Järjestele uudelleen automaattiset lataukset"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Virheellinen polku."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Tiedostoa ei ole olemassa."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Ei löytynyt resurssipolusta."
+msgid "Can't add autoload:"
+msgstr "Ei voida lisätä automaattisesti ladattavaa:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1489,6 +1502,10 @@ msgstr "Nimi"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Liitä parametrit"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Päivitetään skeneä"
@@ -1574,8 +1591,8 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
-"GLES2 vara-ajuri tarvitsee kohdealustalla 'ETC' tekstuuripakkausta. Kytke "
-"'Import Etc' päälle projektin asetuksista tai poista 'Driver Fallback "
+"GLES2 vara-ajuri tarvitsee kohdealustalla 'ETC' tekstuuripakkausta.\n"
+"Kytke 'Import Etc' päälle projektin asetuksista tai poista 'Driver Fallback "
"Enabled' asetus."
#: editor/editor_export.cpp platform/android/export/export.cpp
@@ -1616,16 +1633,17 @@ msgid "Scene Tree Editing"
msgstr "Skenepuun muokkaus"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Tuontitelakka"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Solmutelakka"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Tiedostojärjestelmä- ja tuontitelakat"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Tiedostojärjestelmä"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Tuontitelakka"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1710,7 +1728,7 @@ msgstr "Uusi"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "Tuo"
+msgstr "Tuonti"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
@@ -1734,7 +1752,7 @@ msgstr "Tyhjennä profiili"
#: editor/editor_feature_profile.cpp
msgid "Godot Feature Profile"
-msgstr "Hallinnoi editorin ominaisuusprofiilit"
+msgstr "Godotin ominaisuusprofiili"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
@@ -1777,7 +1795,7 @@ msgstr "Näytä tiedostonhallinnassa"
msgid "New Folder..."
msgstr "Uusi kansio..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Päivitä"
@@ -1891,7 +1909,7 @@ msgstr "Hakemistot ja tiedostot:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Esikatselu:"
@@ -1965,7 +1983,7 @@ msgstr "Teeman ominaisuudet"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "Enumeraatiot"
+msgstr "Luetteloinnit"
#: editor/editor_help.cpp
msgid "Constants"
@@ -2252,11 +2270,11 @@ msgstr "Virhe tallennettaessa MeshLibrary resurssia!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr "Ei voida ladata ruutuvalikoimaa yhdistämistä varten!"
+msgstr "Ei voida ladata laattavalikoimaa yhdistämistä varten!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr "Virhe tallennettaessa ruutuvalikoimaa!"
+msgstr "Virhe tallennettaessa laattavalikoimaa!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
@@ -2327,11 +2345,6 @@ msgid "There is no defined scene to run."
msgstr "Suoritettavaa skeneä ei ole määritetty."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Nykyistä skeneä ei ole vielä tallennettu. Tallenna se ennen suorittamista."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Aliprosessia ei voitu käynnistää!"
@@ -2401,7 +2414,7 @@ msgstr "Tätä toimintoa ei voida suorittaa ilman juurisolmua."
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr "Vie ruutuvalikoima"
+msgstr "Vie laattavalikoima"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
@@ -2416,12 +2429,17 @@ msgid "Can't reload a scene that was never saved."
msgstr "Ei voida ladata uudelleen skeneä, jota ei ole koskaan tallennettu."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Palauta"
+msgid "Reload Saved Scene"
+msgstr "Avaa uudelleen tallennettu skene"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Tätä toimintoa ei voida peruttaa. Palauta joka tapauksessa?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Nykyisessä skenessä on tallentamattomia muutoksia.\n"
+"Avataanko tallennettu skene uudelleen siitä huolimatta? Tätä toimintoa ei "
+"voi perua."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2690,7 +2708,7 @@ msgstr "Mesh-kirjastoksi..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr "Ruutuvalikoimaksi..."
+msgstr "Laattavalikoimaksi..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2703,10 +2721,6 @@ msgid "Redo"
msgstr "Tee uudelleen"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Palauta skene"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Sekalaiset projekti- tai skenetyökalut."
@@ -2753,7 +2767,7 @@ msgstr "Irrallisten resurssien hallinta..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "Lopeta ja palaa projektiluetteloon"
+msgstr "Poistu projektiluetteloon"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -2766,24 +2780,28 @@ msgstr "Julkaise etätestauksen kanssa"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Vietäessä tai julkaistaessa, käynnistettävä ohjelma yrittää ottaa yhteyden "
-"tämän tietokoneen IP-osoitteeseen testaamista varten."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Kevyt käyttöönotto verkkolevyn avulla"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Kun tämä on valittuna, vienti tai julkaisu tuottaa pienimmän mahdollisen "
"käynnistystiedoston.\n"
@@ -2797,9 +2815,10 @@ msgid "Visible Collision Shapes"
msgstr "Näytä törmäysmuodot"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Törmäysmuodot ja raycast-solmut (2D ja 3D) ovat näkyvillä peliä ajettaessa "
"tämän ollessa valittuna."
@@ -2809,38 +2828,43 @@ msgid "Visible Navigation"
msgstr "Näkyvä navigaatio"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigointiverkot ja niiden polygonit ovat näkyvillä peliä ajettaessa tämän "
"ollessa valittuna."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Synkronoi skenen muutokset"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Tämän ollessa valittuna, kaikki skeneen tehdyt muutokset toteutetaan myös "
"käynnissä olevassa pelissä.\n"
"Mikäli peliä ajetaan etälaitteella, on tehokkaampaa käyttää verkkolevyä."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Synkronoi skriptin muutokset"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Jos tämä on valittu, kaikki tallennetut skriptit ladataan uudelleen pelin "
"käynnistyessä.\n"
@@ -2903,7 +2927,7 @@ msgstr "Ohje"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Hae"
@@ -2917,8 +2941,12 @@ msgid "Q&A"
msgstr "Kysymykset ja vastaukset"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Ilmoita viasta"
+msgid "Report a Bug"
+msgstr "Raportoi bugi"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Lähetä palautetta ohjeesta"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3317,9 +3345,11 @@ msgid "Add Key/Value Pair"
msgstr "Lisää avain/arvopari"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Käynnistettävää vientipohjaa ei löytynyt tälle alustalle.\n"
"Lisää sellainen vientivalikosta."
@@ -3348,6 +3378,12 @@ msgstr "Skriptiä ei voitu suorittaa:"
msgid "Did you forget the '_run' method?"
msgstr "Unohditko '_run' metodin?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Pidä Ctrl pohjassa pyöristääksesi kokonaislukuun. Pidä Shift pohjassa "
+"tarkempia muutoksia varten."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Valitse tuotavat solmut"
@@ -3944,10 +3980,19 @@ msgid "Error running post-import script:"
msgstr "Virhe ajettaessa tuonnin jälkeistä skriptiä:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+"Palautitko Node-solmusta periytyvän objektin `post_import()` metodissa?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Tallennetaan..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d tiedostoa"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Aseta oletus valinnalle '%s'"
@@ -3956,10 +4001,6 @@ msgid "Clear Default for '%s'"
msgstr "Poista oletus valinnalta '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Tiedostot"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Tuo nimellä:"
@@ -3972,7 +4013,7 @@ msgid "Reimport"
msgstr "Tuo uudelleen"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Tallenna skenet, tuo uudelleen ja käynnistä uudelleen"
#: editor/import_dock.cpp
@@ -4010,10 +4051,6 @@ msgid "Copy Params"
msgstr "Kopioi parametrit"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Liitä parametrit"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Muokkaa resurssien leikepöytää"
@@ -5082,7 +5119,7 @@ msgid "Bake Lightmaps"
msgstr "Kehitä Lightmapit"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Esikatselu"
@@ -5192,11 +5229,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Left"
-msgstr "Vasemmassa yläkulmassa"
+msgstr "Ylävasen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Right"
-msgstr "Oikeassa yläkulmassa"
+msgstr "Yläoikea"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Right"
@@ -5228,27 +5265,27 @@ msgstr "Keskitä"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Left Wide"
-msgstr "Vasen näkymä"
+msgstr "Laaja vasemmalla"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Wide"
-msgstr "Ylänäkymä"
+msgstr "Laaja ylhäällä"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Right Wide"
-msgstr "Oikea näkymä"
+msgstr "Laaja oikealla"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Wide"
-msgstr "Alanäkymä"
+msgstr "Laaja alhaalla"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr "Pystykeskitetty laaja"
+msgstr "Vaakakeskitetty laaja"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr "Vaakakeskitetty laaja"
+msgstr "Pystykeskitetty laaja"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Full Rect"
@@ -5256,7 +5293,7 @@ msgstr "Täysi ruutu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Keep Ratio"
-msgstr "Skaalaussuhde"
+msgstr "Säilytä suhde"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5349,7 +5386,7 @@ msgstr "Palauta oletuslähennystaso"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr "Valitse tila"
+msgstr "Valintatila"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
@@ -5377,7 +5414,7 @@ msgstr "Siirtotila"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Kääntötila"
+msgstr "Kiertotila"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5537,7 +5574,7 @@ msgstr "Näytä origo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Viewport"
-msgstr "Näytä näyttöikkuna"
+msgstr "Näytä näyttöruutu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
@@ -5835,12 +5872,12 @@ msgid "Mesh is empty!"
msgstr "Mesh on tyhjä!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Luo konkaavi staattinen kappale"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Ei voitu luoda konkaavia törmäysmuotoa."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Luo konveksi staattinen kappale"
+msgid "Create Static Trimesh Body"
+msgstr "Luo konkaavi staattinen kappale"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5851,12 +5888,28 @@ msgid "Create Trimesh Static Shape"
msgstr "Luo staattinen konkaavi muoto"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Muotojen luonti epäonnistui!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Ei voida luoda yksittäistä konveksia törmäysmuotoa skenen juurelle."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Ei voitu luoda yksittäistä konveksia törmäysmuotoa."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Luo konvekseja muotoja"
+msgid "Create Single Convex Shape"
+msgstr "Luo yksittäinen konveksi muoto"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "Ei voi luoda useata konveksia törmäysmuotoa skenen juurelle."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Yhtään törmäysmuotoa ei voitu luoda."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Luo useita konvekseja muotoja"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5907,18 +5960,68 @@ msgid "Create Trimesh Static Body"
msgstr "Luo konkaavi staattinen kappale"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Luo StaticBody solmun ja asettaa sille automaattisesti polygonipohjaisen "
+"törmäysmuodon.\n"
+"Tämä on tarkin (mutta hitain) vaihtoehto törmäystunnistukselle."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Luo konkaavi törmäysmuoto sisareksi"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Luo konvekseja törmäysmuotoja sisariksi"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Luo polygonipohjaisen törmäysmuodon.\n"
+"Tämä on tarkin (mutta hitain) vaihtoehto törmäystunnistukselle."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Luo yksittäisen konveksin törmäyksen sisar"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Luo yksittäisen konveksin törmäysmuodon.\n"
+"Tämä on nopein (mutta epätarkin) vaihtoehto törmäystunnistukselle."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Luo useita konvekseja törmäysmuotojen sisaria"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Luo polygonipohjaisen törmäysmuodon.\n"
+"Tämä on suorituskyvyltään välimaastoa kahdelle yllä olevalle vaihtoehdolle."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Luo ääriviivoista Mesh..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Luo staattisen ääriviiva-meshin. Ääriviiva-meshin normaalit on käännetty "
+"automaattisesti.\n"
+"Tätä voidaan käyttää SpatialMaterial Grow ominaisuuden sijaan silloin, kun "
+"tuon ominaisuuden käyttäminen ei ole mahdollista."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Näytä UV1"
@@ -6599,7 +6702,8 @@ msgstr "Skriptiä ei voi saada suorittamista varten."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr "Skriptin lataus epäonnistui. Tarkista konsolissa virheiden varalta."
+msgstr ""
+"Skriptin uudelleenlataus epäonnistui, tarkista konsoli virheiden varalta."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
@@ -6609,8 +6713,8 @@ msgstr "Skripti ei ole työkalutilassa, sitä ei voi suorittaa."
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
-"Tämän skriptin suorittamiseksi sen on perittävä EditorScript ja asetettava "
-"se työkalutilaan."
+"Tämän skriptin suorittamiseksi sen on perittävä EditorScript ja olla "
+"asetettu työkalutilaan."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6769,14 +6873,6 @@ msgid "Open Godot online documentation."
msgstr "Avaa Godotin online-dokumentaatio."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Pyydä dokumentaatiota"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Auta parantamaan Godotin dokumentaatiota antamalla palautetta."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Etsi dokumentaatiosta."
@@ -6841,12 +6937,12 @@ msgstr ""
"Yhdistetty metodi '%s' signaalille '%s' puuttuu solmusta '%s' solmuun '%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Rivi"
+msgid "[Ignore]"
+msgstr "[Sivuuta]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(sivuuta)"
+msgid "Line"
+msgstr "Rivi"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7212,6 +7308,10 @@ msgid "This operation requires a single selected node."
msgstr "Tämä toiminto vaatii yhden valitun solmun."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Automaattinen ortogonaalinen päällä"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Lukitse näkymän kierto"
@@ -7300,6 +7400,10 @@ msgid "Freelook Slow Modifier"
msgstr "Liikkumisen hitauskerroin"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Näkymän kierto lukittu"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7308,14 +7412,25 @@ msgstr ""
"Sitä ei voi käyttää luotettavana pelin sisäisenä tehokkuuden ilmaisimena."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Näkymän kierto lukittu"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm-ikkuna"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Napsauta vaihtaaksesi näkyvyystilojen välillä.\n"
+"\n"
+"Avoin silmä: muokkain on näkyvissä.\n"
+"Suljettu silmä: muokkain on piilotettu.\n"
+"Puoliavoin silmä: muokkain on näkyvissä myös läpikuultamattomien pintojen "
+"läpi (\"röntgen\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Tarraa solmut lattiaan"
@@ -7652,7 +7767,8 @@ msgid "New Animation"
msgstr "Uusi animaatio"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Nopeus (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7915,7 +8031,7 @@ msgstr "Tyhjennä valittu alue"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Fix Invalid Tiles"
-msgstr "Korjaa virheelliset ruudut"
+msgstr "Korjaa virheelliset laatat"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
@@ -7924,7 +8040,7 @@ msgstr "Leikkaa valinta"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
-msgstr "Täytä ruudukko"
+msgstr "Täytä laattakartta"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Line Draw"
@@ -7940,11 +8056,11 @@ msgstr "Täyttö"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
-msgstr "Tyhjennä ruudukko"
+msgstr "Tyhjennä laattakartta"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Find Tile"
-msgstr "Etsi ruutu"
+msgstr "Etsi laatta"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -7952,7 +8068,7 @@ msgstr "Transponoi"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Disable Autotile"
-msgstr "Poista automaattiruudutus käytöstä"
+msgstr "Poista automaattilaatoitus käytöstä"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Enable Priority"
@@ -7960,17 +8076,17 @@ msgstr "Ota prioriteetti käyttöön"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Filter tiles"
-msgstr "Suodata ruutuja"
+msgstr "Suodata laattoja"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
msgstr ""
-"Anna tälle ruutukartalle (TileMap) ruutuvalikoimaresurssi (TileSet) "
-"käyttääksesi sen ruutuja."
+"Anna tälle laattakartalle (TileMap) laattavalikoimaresurssi (TileSet) "
+"käyttääksesi sen laattoja."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Maalaa ruutu"
+msgstr "Maalaa laatta"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
@@ -7982,7 +8098,7 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "Poimi ruutu"
+msgstr "Poimi laatta"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
@@ -8006,11 +8122,11 @@ msgstr "Tyhjennä muunnos"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet."
-msgstr "Lisää tekstuurit ruutuvalikoimaan."
+msgstr "Lisää tekstuurit laattavalikoimaan."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected Texture from TileSet."
-msgstr "Poista valittu tekstuuri ruutuvalikoimasta."
+msgstr "Poista valittu tekstuuri laattavalikoimasta."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -8038,7 +8154,7 @@ msgstr "Seuraava koordinaatti"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
-msgstr "Valitse seuraava muoto, aliruutu tai ruutu."
+msgstr "Valitse seuraava muoto, alilaatta tai laatta."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Previous Coordinate"
@@ -8046,7 +8162,7 @@ msgstr "Edellinen koordinaatti"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
-msgstr "Valitse edellinen muoto, aliruutu tai ruutu."
+msgstr "Valitse edellinen muoto, alilaatta tai laatta."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region"
@@ -8058,11 +8174,11 @@ msgstr "Törmäys"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Occlusion"
-msgstr "Peittotila"
+msgstr "Peitto"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Navigation"
-msgstr "Siirtymistila"
+msgstr "Navigointi"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Bitmask"
@@ -8138,19 +8254,19 @@ msgstr "Aseta tarttuminen ja näytä ruudukko (muokattavissa Tarkastelussa)."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display Tile Names (Hold Alt Key)"
-msgstr "Näytä ruutujen nimet (pidä Alt-näppäin pohjassa)"
+msgstr "Näytä laattojen nimet (pidä Alt-näppäin pohjassa)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Add or select a texture on the left panel to edit the tiles bound to it."
msgstr ""
"Lisää tai valitse tekstuuri vasemmasta paneelista muokataksesi siihen "
-"sidottuja ruutuja."
+"sidottuja laattoja."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
-"Poista valittu tekstuuri? Tämä poistaa kaikki ruudut, jotka käyttävät sitä."
+"Poista valittu tekstuuri? Tämä poistaa kaikki laatat, jotka käyttävät sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
@@ -8158,7 +8274,7 @@ msgstr "Et ole valinnut poistettavaa tekstuuria."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene? This will overwrite all current tiles."
-msgstr "Luo skenestä? Tämä ylikirjoittaa kaikki nykyiset ruudut."
+msgstr "Luo skenestä? Tämä ylikirjoittaa kaikki nykyiset laatat."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
@@ -8178,7 +8294,7 @@ msgid ""
"Click on another Tile to edit it."
msgstr ""
"Vedä kahvoja muokataksesi suorakulmiota.\n"
-"Napsauta toista ruutua muokataksesi sitä."
+"Napsauta toista laattaa muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete selected Rect."
@@ -8189,8 +8305,8 @@ msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"Valitse muokattavana oleva aliruutu.\n"
-"Napsauta toista ruutua muokataksesi sitä."
+"Valitse muokattavana oleva alilaatta.\n"
+"Napsauta toista laattaa muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete polygon."
@@ -8206,7 +8322,7 @@ msgstr ""
"Hiiren vasen: aseta bitti päälle.\n"
"Hiiren oikea: aseta bitti pois päältä.\n"
"Shift+Hiiren vasen: aseta jokeribitti.\n"
-"Napsauta toista ruutua muokataksesi sitä."
+"Napsauta toista laattaa muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8214,41 +8330,41 @@ msgid ""
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
-"Valitse aliruutu, jota käytetään ikonina ja myös virheellisten "
-"automaattiruudutusten ilmaisemiseen.\n"
-"Napsauta toista ruutua muokataksesi sitä."
+"Valitse alilaatta, jota käytetään ikonina ja myös virheellisten "
+"automaattilaatoitusten ilmaisemiseen.\n"
+"Napsauta toista laattaa muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
-"Valitse aliruutu muuttaaksesi sen tärkeyttä.\n"
-"Napsauta toista ruutua muokataksesi sitä."
+"Valitse alilaatta muuttaaksesi sen tärkeyttä.\n"
+"Napsauta toista laattaa muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
msgstr ""
-"Valitse aliruutu muuttaaksesi sen z-järjestystä.\n"
-"Napsauta toista ruutua muokataksesi sitä."
+"Valitse alilaatta muuttaaksesi sen z-järjestystä.\n"
+"Napsauta toista laattaa muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Region"
-msgstr "Aseta ruudun alue"
+msgstr "Aseta laatan alue"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Tile"
-msgstr "Luo ruutu"
+msgstr "Luo laatta"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Icon"
-msgstr "Aseta ruudun ikoni"
+msgstr "Aseta laatan ikoni"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Bitmask"
-msgstr "Muokkaa ruudun bittimaskia"
+msgstr "Muokkaa laatan bittimaskia"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Collision Polygon"
@@ -8264,11 +8380,11 @@ msgstr "Muokkaa navigointipolygonia"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Paste Tile Bitmask"
-msgstr "Liitä ruudun bittimaski"
+msgstr "Liitä laatan bittimaski"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Clear Tile Bitmask"
-msgstr "Tyhjennä ruudun bittimaski"
+msgstr "Tyhjennä laatan bittimaski"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Polygon Concave"
@@ -8280,7 +8396,7 @@ msgstr "Tee polygonista konveksi"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Tile"
-msgstr "Poista ruutu"
+msgstr "Poista laatta"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Collision Polygon"
@@ -8296,11 +8412,11 @@ msgstr "Poista navigointipolygoni"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Priority"
-msgstr "Muokkaa ruudun prioriteettia"
+msgstr "Muokkaa laatan prioriteettia"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
-msgstr "Muokkaa ruudun Z-indeksiä"
+msgstr "Muokkaa laatan Z-indeksiä"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Convex"
@@ -8324,13 +8440,13 @@ msgstr "Tätä ominaisuutta ei voi muuttaa."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "TileSet"
-msgstr "Ruutuvalikoima"
+msgstr "Laattavalikoima"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No VCS addons are available."
msgstr "VCS-lisäosia ei ole saatavilla."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Virhe"
@@ -8552,7 +8668,7 @@ msgstr "Muuntaa HSV-vektorin RGB-vastaavaksi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr "Muuntaa RGB-vektori HSV-vastaavaksi."
+msgstr "Muuntaa RGB-vektorin HSV-vastaavaksi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sepia function."
@@ -8727,7 +8843,7 @@ msgstr "E-vakio (2.718282). Kuvastaa luonnollisen logaritmin kantalukua."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr "Epsilon-vakio (0.00001). Pienin mahdollinen skaalariluku."
+msgstr "Epsilon-vakio (0.00001). Pienin mahdollinen skaalariluku."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
@@ -9209,7 +9325,7 @@ msgid ""
"direction of camera (pass associated inputs to it)."
msgstr ""
"Palauttaa valovähentymän perustuen pinnan normaalivektorin ja kameran "
-"suuntavektorin pistetuloon (välitä nämä syötteinä)."
+"suuntavektorin pistetuloon (välitä sille liittyvät syötteet)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9480,7 +9596,7 @@ msgstr "ZIP-tiedosto"
#: editor/project_export.cpp
msgid "Godot Game Pack"
-msgstr "Godot-peli paketti"
+msgstr "Godot-pelipaketti"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -9495,13 +9611,18 @@ msgid "Export With Debug"
msgstr "Vie debugaten"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Polkua ei ole olemassa."
+msgid "The path specified doesn't exist."
+msgstr "Määritelty polku ei ole olemassa."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Virhe avattaessa pakettitiedostoa (se ei ole ZIP-muodossa)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"Virheellinen '.zip' projektitiedosto; se ei sisällä 'project.godot' "
+"Virheellinen \".zip\" projektitiedosto; se ei sisällä \"project.godot\" "
"tiedostoa."
#: editor/project_manager.cpp
@@ -9509,12 +9630,12 @@ msgid "Please choose an empty folder."
msgstr "Ole hyvä ja valitse tyhjä kansio."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Ole hyvä ja valitse 'project.godot' tai '.zip' tiedosto."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Ole hyvä ja valitse \"project.godot\"- tai \".zip\"-tiedosto."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "Hakemisto sisältää jo Godot-projektin."
+msgid "This directory already contains a Godot project."
+msgstr "Tämä hakemisto sisältää jo Godot-projektin."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9772,6 +9893,7 @@ msgstr ""
"Haluatko varmasti etsiä %s kansiosta olemassa olevia Godot-projekteja?\n"
"Tämä saattaa kestää hetken."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Projektinhallinta"
@@ -9820,6 +9942,16 @@ msgstr ""
"Sinulla ei ole tällä hetkellä yhtään projekteja.\n"
"Haluaisitko selata virallisia esimerkkiprojekteja Asset-kirjastosta?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Hakulaatikko suodattaa projektit nimen ja polun loppuosan mukaan.\n"
+"Suodattaaksesi projektit nimen ja koko polun mukaan, haussa tulee olla "
+"mukana vähintään yksi `/` merkki."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Näppäin "
@@ -10201,14 +10333,25 @@ msgid "Batch Rename"
msgstr "Niputettu uudelleennimeäminen"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Korvaa: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Etuliite"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Pääte"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Käytä säännöllisiä lausekkeita"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Edistyneet asetukset"
@@ -10245,11 +10388,12 @@ msgstr ""
"Vertaa laskurin valintoja."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Per taso -laskuri"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Jos asetettu, laskuri alkaa alusta jokaiselle alisolmujen ryhmälle"
#: editor/rename_dialog.cpp
@@ -10277,10 +10421,6 @@ msgstr ""
"Puuttuvat numeromerkit täytetään edeltävillä nollilla."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Säännölliset lausekkeet"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Jälkikäsittely"
@@ -10289,12 +10429,12 @@ msgid "Keep"
msgstr "Pidä"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase ala_viivoiksi"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase ala_viivoiksi"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "ala_viivat CamelCaseksi"
+msgid "snake_case to PascalCase"
+msgstr "ala_viivat PascalCaseksi"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10312,6 +10452,15 @@ msgstr "Isoiksi kirjaimiksi"
msgid "Reset"
msgstr "Palauta"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Säännöllisen lausekkeen virhe"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Merkissä %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Vaihda solmun isäntää"
@@ -10377,8 +10526,8 @@ msgid "Instance Child Scene"
msgstr "Luo aliskenen ilmentymä"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Poista skripti"
+msgid "Detach Script"
+msgstr "Irrota skripti"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10417,6 +10566,10 @@ msgid "Make node as Root"
msgstr "Tee solmusta juurisolmu"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Poista %d solmua ja kaikki alisolmut?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Poista %d solmua?"
@@ -10546,6 +10699,16 @@ msgid "Open Documentation"
msgstr "Avaa dokumentaatio"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Ei voida liittää skriptiä: yhtään kieltä ei ole rekisteröity.\n"
+"Tämä johtuu luultavasti siitä, että editori on käännetty ilman yhtäkään "
+"kielimoduulia."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Lisää alisolmu"
@@ -10594,12 +10757,12 @@ msgstr ""
"juurisolmua ei ole olemassa."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr "Liitä uusi tai olemassa oleva skripti valitulle solmulle."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Poista skripti valitulta solmulta."
+msgid "Detach the script from the selected node."
+msgstr "Irrota skripti valitusta solmusta."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10730,6 +10893,10 @@ msgid "A directory with the same name exists."
msgstr "Samanniminen hakemisto on jo olemassa."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Tiedostoa ei ole olemassa."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Virheellinen tiedostopääte."
@@ -10770,6 +10937,10 @@ msgid "File exists, it will be reused."
msgstr "Tiedosto on jo olemassa, se käytetään uudelleen."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Virheellinen polku."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Virheellinen luokan nimi."
@@ -10778,8 +10949,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Virheellinen peritty isännän nimi tai polku."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Skripti kelpaa."
+msgid "Script path/name is valid."
+msgstr "Skriptin polku/nimi kelpaa."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10802,6 +10973,14 @@ msgid "Script file already exists."
msgstr "Skriptitiedosto on jo olemassa."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Huom: sisäänrakennetuilla skripteillä on joitakin rajoituksia, eikä niitä "
+"voi muokata ulkoisella editorilla."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Luokan nimi:"
@@ -10870,6 +11049,10 @@ msgid "Copy Error"
msgstr "Kopioi virhe"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Näyttömuisti"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Sivuuta keskeytyskohdat"
@@ -10918,8 +11101,8 @@ msgid "Total:"
msgstr "Yhteensä:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Näyttömuisti"
+msgid "Export list to a CSV file"
+msgstr "Vie lista CSV tiedostoon"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11690,7 +11873,7 @@ msgstr "Tee funktio"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "Päivitä graafi"
+msgstr "Päivitä kaaviokuva"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
@@ -11807,6 +11990,10 @@ msgstr ""
"Debug keystore ei ole määritettynä editorin asetuksissa eikä esiasetuksissa."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "Release keystore on konfiguroitu väärin viennin esiasetuksissa."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Mukautettu käännös edellyttää kelvollista Android SDK -polkua editorin "
@@ -11836,6 +12023,42 @@ msgstr "Virheellinen paketin nimi:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"\"android/modules\" projektiasetukseen on liitetty virheellinen "
+"\"GodotPaymentV3\" moduuli (muuttunut Godotin versiossa 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+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ää."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" on käyttökelpoinen ainoastaan kun \"Xr Mode\" asetus "
+"on \"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" on käyttökelpoinen ainoastaan kun \"Xr Mode\" asetus on "
+"\"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" on käyttökelpoinen ainoastaan kun \"Xr Mode\" asetus on "
+"\"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12040,6 +12263,15 @@ msgstr ""
"CollisionShape2D solmulla täytyy olla muoto, jotta se toimisi. Ole hyvä ja "
"luo sille muotoresurssi!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Polygonipohjaisia muotoja ei ole tarkoitus käyttää tai muokata suoraan "
+"CollisionShape2D solmun kautta. Ole hyvä ja käytä sen sijaan "
+"CollisionPolygon2D solmua."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12157,7 +12389,7 @@ msgid ""
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
-"TileMap, jolla on \"Use Parent on\", tarvitsee CollisionObject2D "
+"Laattakartta, jolla on \"Use Parent\" käytössä, tarvitsee CollisionObject2D "
"isäntäsolmun, jolle voi antaa muotoja. Käytä sitä ainoastaan Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, jne. alla antaaksesi niille "
"muodon."
@@ -12277,6 +12509,12 @@ msgstr ""
"Tasomuodot eivät toimi hyvin ja ne tullaan poistaamaan tulevissa versioissa. "
"Ole hyvä ja älä käytä niitä."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape ei tue RigidBody solmua muussa kuin staattisessa tilassa."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Mitään ei näy, koska meshiä ei ole asetettu."
@@ -12301,6 +12539,11 @@ msgstr ""
"GIProbe ei ole tuettu GLES2 näyttöajurissa.\n"
"Käytä sen sijaan BakedLightmap resurssia."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12560,8 +12803,8 @@ msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"Projektin asetuksissa määriteltyä oletusympäristöä (Rendering -> "
-"Environment -> Default Environment) ei voitu ladata."
+"Projektin asetuksissa määriteltyä oletusympäristöä (Rendering -> Environment "
+"-> Default Environment) ei voitu ladata."
#: scene/main/viewport.cpp
msgid ""
@@ -12575,6 +12818,11 @@ msgstr ""
"saada koon. Muutoin tee siitä RenderTarget ja aseta sen sisäinen tekstuuri "
"johonkin solmuun näkyväksi."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"Näyttöruudun koko on oltava suurempi kuin 0, jotta mitään renderöidään."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Virheellinen lähde esikatselulle."
@@ -12603,6 +12851,53 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa."
msgid "Constants cannot be modified."
msgstr "Vakioita ei voi muokata."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Tiedostojärjestelmä- ja tuontitelakat"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Vietäessä tai julkaistaessa, käynnistettävä ohjelma yrittää ottaa "
+#~ "yhteyden tämän tietokoneen IP-osoitteeseen testaamista varten."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Nykyistä skeneä ei ole vielä tallennettu. Tallenna se ennen suorittamista."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Ei löytynyt resurssipolusta."
+
+#~ msgid "Revert"
+#~ msgstr "Palauta"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Tätä toimintoa ei voida peruttaa. Palauta joka tapauksessa?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Palauta skene"
+
+#~ msgid "Clear Script"
+#~ msgstr "Poista skripti"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Ilmoita viasta"
+
+#~ msgid "Request Docs"
+#~ msgstr "Pyydä dokumentaatiota"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Auta parantamaan Godotin dokumentaatiota antamalla palautetta."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Korvattu %d osuvuutta."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Luo konveksi staattinen kappale"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Muotojen luonti epäonnistui!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/fil.po b/editor/translations/fil.po
index c8a2a20684..de981e7625 100644
--- a/editor/translations/fil.po
+++ b/editor/translations/fil.po
@@ -5,11 +5,12 @@
# Marco Santos <enum.scima@gmail.com>, 2019.
# Amado Wilkins <epicalert68@gmail.com>, 2019.
# Bakainkorp <Ryan.Bautista86@myhunter.cuny.edu>, 2019.
+# Jethro Parker <lionbearjet@hotmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-12-21 08:37+0000\n"
-"Last-Translator: Bakainkorp <Ryan.Bautista86@myhunter.cuny.edu>\n"
+"PO-Revision-Date: 2020-08-14 03:56+0000\n"
+"Last-Translator: Jethro Parker <lionbearjet@hotmail.com>\n"
"Language-Team: Filipino <https://hosted.weblate.org/projects/godot-engine/"
"godot/fil/>\n"
"Language: fil\n"
@@ -17,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 "
"|| n % 10 == 6 || n % 10 == 9);\n"
-"X-Generator: Weblate 3.10\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -28,7 +29,7 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Nanghihingi ng string na may habang 1 (character)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -185,12 +186,12 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
-msgstr ""
+msgstr "Ibahin ang haba ng Animation"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "Ibahin ang ulit ng Animation"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -218,44 +219,44 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr ""
+msgstr "Haba ng animation (frames)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
-msgstr ""
+msgstr "Haba ng animation (segundo)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
-msgstr ""
+msgstr "Magdagdag ng Track"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr ""
+msgstr "Pagulit ng Animation"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr ""
+msgstr "Functions:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "Mga clip ng tunog:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Mga clip ng Anim:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr ""
+msgstr "Ibahin ang landas ng Track"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "Ilipat sa on/off ang track na ito."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Baguhin ang Mode (Kung paano na-set ang property)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
@@ -514,6 +515,7 @@ msgid "Seconds"
msgstr "Segundo"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -673,8 +675,9 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+#, fuzzy
+msgid "%d replaced."
+msgstr "Palitan"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -692,7 +695,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Palitan"
@@ -742,6 +745,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -821,7 +828,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -878,6 +884,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -915,7 +925,7 @@ msgid "Recent:"
msgstr "Kamakailan:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Paghahanap:"
@@ -1089,6 +1099,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1110,6 +1123,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1413,7 +1434,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1421,16 +1442,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1458,6 +1471,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1577,15 +1594,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1734,7 +1751,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1848,7 +1865,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -1893,7 +1910,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Description"
-msgstr ""
+msgstr "Paglalarawan"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -2259,10 +2276,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2347,11 +2360,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2617,10 +2632,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2680,22 +2691,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2704,8 +2719,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2714,32 +2729,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2799,7 +2814,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2813,16 +2828,20 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr ""
+msgstr "Komunidad"
#: editor/editor_node.cpp
msgid "About"
-msgstr ""
+msgstr "Tungkol"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -3197,7 +3216,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3224,6 +3244,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3808,19 +3832,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3836,7 +3864,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3870,10 +3898,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4918,7 +4942,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5653,11 +5677,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5669,11 +5693,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5725,11 +5765,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5737,6 +5806,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6574,14 +6651,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6643,11 +6712,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7011,6 +7080,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7099,17 +7172,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7446,7 +7528,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8103,7 +8185,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9189,11 +9271,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9201,11 +9288,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9420,6 +9507,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9466,6 +9554,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9843,11 +9938,20 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Palitan"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9885,11 +9989,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9915,10 +10019,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9927,11 +10027,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9950,6 +10050,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10013,7 +10121,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10049,6 +10157,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10171,6 +10283,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10217,11 +10336,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10341,6 +10460,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10381,6 +10504,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10389,7 +10516,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10413,6 +10540,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10482,6 +10615,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10530,7 +10667,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11400,6 +11537,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11423,6 +11564,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11600,6 +11767,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11787,6 +11960,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11807,6 +11985,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12026,6 +12209,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
index c92a8d3bb0..c39d4c7e0c 100644
--- a/editor/translations/fr.po
+++ b/editor/translations/fr.po
@@ -35,14 +35,14 @@
# Rémi Verschelde <rverschelde@gmail.com>, 2016-2017.
# Robin Arys <robinarys@hotmail.com>, 2017.
# Roger BR <drai_kin@hotmail.com>, 2016.
-# salty64 <cedric.arrabie@univ-pau.fr>, 2018.
+# salty64 <cedric.arrabie@univ-pau.fr>, 2018, 2020.
# Thomas Baijot <thomasbaijot@gmail.com>, 2016, 2019.
# Tommy Melançon-Roy <tommel1234@hotmail.com>, 2017-2018.
# Willow <theotimefd@aol.com>, 2018.
# Xananax <xananax@yelostudio.com>, 2017-2018.
# Perrier Mathis <mathis.perrier73@gmail.com>, 2018.
# Ewan Lehnebach <ewan.lehnebach@gmail.com>, 2018.
-# Hugo Locurcio <hugo.locurcio@hugo.pro>, 2018, 2019.
+# Hugo Locurcio <hugo.locurcio@hugo.pro>, 2018, 2019, 2020.
# Grigore Antoniuc <grisa181@gmail.com>, 2018.
# x2f <x.defoy@gmail.com>, 2018.
# LittleWhite <lw.demoscene@googlemail.com>, 2018.
@@ -69,12 +69,18 @@
# Sofiane <Sofiane-77@caramail.fr>, 2019.
# Camille Mohr-Daurat <pouleyketchoup@gmail.com>, 2019.
# Pierre Stempin <pierre.stempin@gmail.com>, 2019.
+# Pierre Caye <pierrecaye@laposte.net>, 2020.
+# Kevin Bouancheau <kevin.bouancheau@gmail.com>, 2020.
+# LaurentOngaro <laurent@gameamea.com>, 2020.
+# Julien Humbert <julroy67@gmail.com>, 2020.
+# Nathan <bonnemainsnathan@gmail.com>, 2020.
+# Léo Vincent <l009.vincent@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-16 22:32+0000\n"
-"Last-Translator: Rémi Verschelde <akien@godotengine.org>\n"
+"PO-Revision-Date: 2020-09-08 13:44+0200\n"
+"Last-Translator: Nathan <bonnemainsnathan@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
"godot/fr/>\n"
"Language: fr\n"
@@ -82,7 +88,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 3.10.2-dev\n"
+"X-Generator: Poedit 2.4.1\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -92,21 +98,21 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "Attendu une chaîne de longueur 1 (un caractère)."
+msgstr "Une chaîne de caractères de longueur 1 est attendue (un caractère)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Pas assez d'octets pour le décodage, ou format non valide."
+msgstr "Pas assez d’octets pour le décodage, ou format non valide."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Entrée non valide %i (pas passée) dans l’expression"
+msgstr "Entrée non valide %i (non transmise) dans l’expression"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "self ne peut être utilisé car l'instance est null (pas passée)"
+msgstr "self ne peut être utilisé car l’instance est nulle (non transmise)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -126,11 +132,11 @@ msgstr "Arguments invalides pour construire '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "Lors de l'appel à '%s' :"
+msgstr "Lors de l’appel à '%s' :"
#: core/ustring.cpp
msgid "B"
-msgstr "Octet"
+msgstr "o"
#: core/ustring.cpp
msgid "KiB"
@@ -198,60 +204,60 @@ msgstr "Déplacer des points de Bézier"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Dupliquer les clés d'animation"
+msgstr "Dupliquer les clés d’animation"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Supprimer les clés d'animation"
+msgstr "Supprimer les clés d’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "Modifier le temps de l'image-clé"
+msgstr "Modifier le temps de l’image-clé"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "Changer la transition de l'animation"
+msgstr "Changer la transition de l’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "Changer la transformation de l'animation"
+msgstr "Changer la transformation de l’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Changer la valeur de l'image-clé de l'animation"
+msgstr "Changer la valeur de l’image-clé de l’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr "Changer l'appel de l'animation"
+msgstr "Changer l’appel de l’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Time"
-msgstr "Modification du temps de l'image-clé"
+msgstr "Modification du temps de l’image-clé"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Transition"
-msgstr "Changer la transition de l'animation"
+msgstr "Changer la transition de l’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Transform"
-msgstr "Changer le Transform de l'animation"
+msgstr "Changer le Transform de l’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Value"
-msgstr "Changer la valeur de l'image-clé de l'animation"
+msgstr "Changer la valeur de l’image-clé de l’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Call"
-msgstr "Changer l'appel de l'animation"
+msgstr "Changer l’appel de l’animation"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
-msgstr "Modifier la durée de l'animation"
+msgstr "Modifier la durée de l’animation"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr "Changer la boucle d'animation"
+msgstr "Changer la boucle d’animation"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -263,7 +269,7 @@ msgstr "Piste de transformation 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr "Piste d'appel de méthode"
+msgstr "Piste d’appel de méthode"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
@@ -275,15 +281,15 @@ msgstr "Piste de lecture audio"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
-msgstr "Piste de lecture d'animation"
+msgstr "Piste de lecture d’animation"
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr "Durée de l'animation (en images)"
+msgstr "Durée de l’animation (en images)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
-msgstr "Durée de l'animation (en secondes)"
+msgstr "Durée de l’animation (en secondes)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
@@ -291,7 +297,7 @@ msgstr "Ajouter une piste"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr "Bouclage de l'animation"
+msgstr "Bouclage de l’animation"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -304,7 +310,7 @@ msgstr "Clips audio :"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr "Clips d'animation :"
+msgstr "Clips d’animation :"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
@@ -320,7 +326,7 @@ msgstr "Mode de mise à jour (comment cette propriété est définie)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr "Mode d'interpolation"
+msgstr "Mode d’interpolation"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
@@ -332,7 +338,7 @@ msgstr "Supprime cette piste."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
-msgstr "Temps (s): "
+msgstr "Temps (s) : "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
@@ -369,16 +375,16 @@ msgstr "Cubique"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr "Limiter l'interpolation de la boucle"
+msgstr "Limiter l’interpolation de la boucle"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr "Envelopper l'interp. de la boucle"
+msgstr "Envelopper l’interp. de la boucle"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Insérer clés"
+msgstr "Insérer clé"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
@@ -390,19 +396,19 @@ msgstr "Supprimer clé(s)"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
-msgstr "Modifier le mode de mise à jour de l'animation"
+msgstr "Modifier le mode de mise à jour de l’animation"
#: editor/animation_track_editor.cpp
msgid "Change Animation Interpolation Mode"
-msgstr "Modifier le mode d'interpolation de l'animation"
+msgstr "Modifier le mode d’interpolation de l’animation"
#: editor/animation_track_editor.cpp
msgid "Change Animation Loop Mode"
-msgstr "Modifier le mode de boucle d'animation"
+msgstr "Modifier le mode de boucle d’animation"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr "Supprimer la piste d'animation"
+msgstr "Supprimer la piste d’animation"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
@@ -431,7 +437,7 @@ msgstr "Insérer une animation"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
-"Un AnimationPlayer ne peut s'animer lui-même, seulement les autres lecteurs."
+"Un AnimationPlayer ne peut s’animer lui-même, seulement les autres lecteurs."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -439,15 +445,15 @@ msgstr "Créer et insérer une animation"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "Insérer une piste et clé d'animation"
+msgstr "Insérer une piste et clé d’animation"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr "Insérer une clé d'animation"
+msgstr "Insérer une clé d’animation"
#: editor/animation_track_editor.cpp
msgid "Change Animation Step"
-msgstr "Modifier l'étape d'animation"
+msgstr "Modifier l’étape d’animation"
#: editor/animation_track_editor.cpp
msgid "Rearrange Tracks"
@@ -456,7 +462,7 @@ msgstr "Réorganiser les pistes"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
msgstr ""
-"Les pistes de transformation ne s'appliquent qu'aux nœuds basés sur Spatial."
+"Les pistes de transformation ne s’appliquent qu’aux nœuds basés sur Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -473,17 +479,17 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
msgstr ""
-"Les pistes d'animation ne peuvent pointer que sur des nœuds AnimationPlayer."
+"Les pistes d’animation ne peuvent pointer que sur des nœuds AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
-"Un lecteur d'animation ne peut s'animer lui-même, seulement les autres "
+"Un lecteur d’animation ne peut s’animer lui-même, seulement les autres "
"lecteurs."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr "Impossible d'ajouter une nouvelle piste sans racine"
+msgstr "Impossible d’ajouter une nouvelle piste sans racine"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
@@ -495,11 +501,11 @@ msgstr "Ajouter une piste de Bézier"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr "Le chemin de la piste est invalide, impossible d'ajouter une clé."
+msgstr "Le chemin de la piste est invalide, impossible d’ajouter une clé."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr "La piste n'est pas de type Spatial, impossible d'insérer une clé"
+msgstr "La piste n’est pas de type Spatial, impossible d’insérer une clé"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
@@ -512,7 +518,7 @@ msgstr "Ajoutez une clé de piste"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
-"Le chemin de la piste est invalide, impossible d'ajouter une clé d'appel de "
+"Le chemin de la piste est invalide, impossible d’ajouter une clé d’appel de "
"méthode."
#: editor/animation_track_editor.cpp
@@ -521,11 +527,11 @@ msgstr "Ajouter une clé de méthode"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr "Méthode introuvable dans l'objet : "
+msgstr "Méthode introuvable dans l’objet : "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "Déplacer les clés d'animation"
+msgstr "Déplacer les clés d’animation"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
@@ -537,14 +543,14 @@ msgstr "Coller pistes"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr "Mettre à l'échelle les clés d'animation"
+msgstr "Mettre à l’échelle les clés d’animation"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
-"Cette option ne fonctionne pas pour l'édition de courbes de Bézier car il ne "
-"s'agit que d'une seule piste."
+"Cette option ne fonctionne pas pour l’édition de courbes de Bézier car il ne "
+"s’agit que d’une seule piste."
#: editor/animation_track_editor.cpp
msgid ""
@@ -561,16 +567,16 @@ msgstr ""
"Cette animation appartient à une scène importée, donc les changements "
"apportés aux pistes importées ne seront pas sauvegardés.\n"
"\n"
-"Pour activer la possibilité d'ajouter des pistes personnalisées, naviguez "
-"dans les paramètres d'importation de la scène et définissez\n"
+"Pour activer la possibilité d’ajouter des pistes personnalisées, naviguez "
+"dans les paramètres d’importation de la scène et définissez\n"
"\"Animation > Stockage\" à \"Fichiers\", activez \"Animation > Garder Pistes "
"Courantes\" puis ré-importez.\n"
-"Alternativement, utilise un préréglage d'import qui importe les animations "
+"Alternativement, utilise un préréglage d’import qui importe les animations "
"dans des fichiers différents."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr "Avertissement : Édition d'une animation importée"
+msgstr "Avertissement : Édition d’une animation importée"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
@@ -581,7 +587,7 @@ msgstr ""
msgid "Only show tracks from nodes selected in tree."
msgstr ""
"Afficher seulement les pistes provenant des nœuds sélectionnés dans "
-"l'arborescence."
+"l’arborescence."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
@@ -600,6 +606,7 @@ msgid "Seconds"
msgstr "Secondes"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "IPS"
@@ -759,8 +766,8 @@ msgid "Line Number:"
msgstr "Numéro de ligne :"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d occurrence(s) remplacée(s)."
+msgid "%d replaced."
+msgstr "%d remplacé."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -778,7 +785,7 @@ msgstr "Sensible à la casse"
msgid "Whole Words"
msgstr "Mots entiers"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Remplacer"
@@ -828,6 +835,10 @@ msgid "Method in target node must be specified."
msgstr "La méthode du nœud cible doit être spécifiée."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Le nom de la méthode doit être un identifiant valide."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -911,7 +922,6 @@ msgstr "Impossible de connecter le signal"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -968,6 +978,11 @@ msgid "Signals"
msgstr "Signaux"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrer les tuiles"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Voulez-vous vraiment supprimer toutes les connexions de ce signal ?"
@@ -1005,7 +1020,7 @@ msgid "Recent:"
msgstr "Récents :"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Rechercher :"
@@ -1187,9 +1202,12 @@ msgstr "Fondateurs du projet"
msgid "Lead Developer"
msgstr "Développeur principal"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr "Gestionnaire de projets "
+msgstr "Chef de projet "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1208,6 +1226,14 @@ msgid "Gold Sponsors"
msgstr "Sponsors Or"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Sponsors Argent"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Sponsors Bronze"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsors"
@@ -1517,7 +1543,7 @@ msgstr "Déplacer l'AutoLoad"
msgid "Remove Autoload"
msgstr "Supprimer l'AutoLoad"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Activer"
@@ -1525,17 +1551,9 @@ msgstr "Activer"
msgid "Rearrange Autoloads"
msgstr "Ré-organiser les AutoLoads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Chemin invalide."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Le fichier n'existe pas."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Pas dans le chemin de la ressource."
+msgid "Can't add autoload:"
+msgstr "Impossible d'ajouter le chargement automatique :"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1562,6 +1580,10 @@ msgstr "Nom"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Coller les paramètres"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Mise à jour de la scène"
@@ -1689,16 +1711,17 @@ msgid "Scene Tree Editing"
msgstr "Édition de l'arbre de scène"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Dock d'importation"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Dock nœud"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Module d'importation et système de fichiers"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Système de fichiers"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Dock d'importation"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1759,7 +1782,7 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Error saving profile to path: '%s'."
-msgstr "Erreur lors de l'enregistrement du profil au chemin: '%s'."
+msgstr "Erreur lors de l'enregistrement du profil au chemin : « %s »."
#: editor/editor_feature_profile.cpp
msgid "Unset"
@@ -1782,7 +1805,7 @@ msgstr "Nouveau"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "Importer"
+msgstr "Importation"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
@@ -1849,7 +1872,7 @@ msgstr "Montrer dans le gestionnaire de fichiers"
msgid "New Folder..."
msgstr "Nouveau dossier..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Rafraîchir"
@@ -1891,7 +1914,7 @@ msgstr "Enregistrer un fichier"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr "Retour"
+msgstr "Retourner"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
@@ -1943,7 +1966,7 @@ msgstr "Rafraîchir les fichiers."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr "Ajouter ou supprimer des favoris le dossier courant."
+msgstr "Ajouter ou supprimer aux favoris le dossier courant."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
@@ -1963,7 +1986,7 @@ msgstr "Répertoires et fichiers :"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Aperçu :"
@@ -2119,7 +2142,7 @@ msgstr "Type de membre"
#: editor/editor_help_search.cpp
msgid "Class"
-msgstr "Classe :"
+msgstr "Classe"
#: editor/editor_help_search.cpp
msgid "Method"
@@ -2223,7 +2246,7 @@ msgstr "Nouvelle Fenêtre"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr "Les ressources importés ne peuvent pas être sauvegarder."
+msgstr "Les ressources importées ne peuvent pas être sauvegardées."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
@@ -2404,12 +2427,6 @@ msgid "There is no defined scene to run."
msgstr "Il n'y a pas de scène définie pour être lancée."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"La scène actuelle n'a jamais été sauvegardée, veuillez la sauvegarder avant "
-"de la lancer."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Impossible de démarrer le sous-processus !"
@@ -2495,12 +2512,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Impossible de recharger une scène qui n'a jamais été sauvegardée."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Réinitialiser"
+msgid "Reload Saved Scene"
+msgstr "Recharger la scène sauvegardée"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Cette action ne peut être annulée. Réinitialiser quand même ?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"La scène actuelle contient des changements non sauvegardés.\n"
+"Recharger la scène quand même ? Cette action ne peut pas être annulée."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2799,10 +2820,6 @@ msgid "Redo"
msgstr "Refaire"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Réinitialiser la scène"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Outils divers liés au projet ou à la scène."
@@ -2862,24 +2879,28 @@ msgstr "Déployer avec le débogage distant"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Lors de l'exportation ou du déploiement, l'exécutable produit tentera de se "
-"connecter à l'adresse IP de cet ordinateur afin de procéder au débogage."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Déploiement minime avec système de fichier réseau"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Lorsque cette option est activée, l'exportation ou le déploiement produira "
"un exécutable minimal.\n"
@@ -2894,9 +2915,10 @@ msgid "Visible Collision Shapes"
msgstr "Formes de collision visibles"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Les formes de collision et les nœuds de raycast (pour 2D et 3D) seront "
"visibles en jeu si cette option est activée."
@@ -2906,23 +2928,26 @@ msgid "Visible Navigation"
msgstr "Navigation visible"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Les maillages et polygones de navigation seront visibles en jeu si cette "
"option est activée."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Synchroniser les modifications des scènes"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Lorsque cette option est activée, toutes les modifications apportées à la "
"scène dans l'éditeur seront reproduites en jeu.\n"
@@ -2930,15 +2955,17 @@ msgstr ""
"plus efficace avec le système de fichiers réseau."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Synchroniser les modifications des scripts"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Lorsque cette option est activée, tout script enregistré sera de nouveau "
"chargé pendant le déroulement du jeu.\n"
@@ -3003,7 +3030,7 @@ msgstr "Aide"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Rechercher"
@@ -3017,8 +3044,12 @@ msgid "Q&A"
msgstr "Questions et réponses"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Traqueur de problèmes"
+msgid "Report a Bug"
+msgstr "Signaler un bug"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Envoyez vos retours sur la documentation"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3419,9 +3450,11 @@ msgid "Add Key/Value Pair"
msgstr "Ajouter une paire clé/valeur"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Aucun préréglage d'exportation exécutable trouvé pour cette plate-forme. \n"
"Ajoutez un préréglage exécutable dans le menu d'exportation."
@@ -3450,6 +3483,12 @@ msgstr "Impossible d'exécuter le script :"
msgid "Did you forget the '_run' method?"
msgstr "Avez-vous oublié la méthode « _run » ?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Maintenir Ctrl pour arrondir à l'entier. Maintenir Maj pour des changements "
+"plus précis."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Sélectionner les nœuds à importer"
@@ -4052,10 +4091,19 @@ msgid "Error running post-import script:"
msgstr "Erreur d'exécution du script de post-importation :"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+"Avez-vous renvoyé un objet dérivé de Node dans la méthode `post_import()` ?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Enregistrement…"
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d fichiers"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Définir comme défaut pour « %s »"
@@ -4064,10 +4112,6 @@ msgid "Clear Default for '%s'"
msgstr "Effacer le préréglage par défaut pour « %s »"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Fichiers"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importer comme :"
@@ -4080,8 +4124,8 @@ msgid "Reimport"
msgstr "Réimporter"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Sauvegarde des scènes, réimportation et redémarrage"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Enregistrer les scènes, réimporter, puis redémarrer"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4117,10 +4161,6 @@ msgid "Copy Params"
msgstr "Copier paramètres"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Coller les paramètres"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Modifier le Presse-papiers de la ressource"
@@ -5032,7 +5072,7 @@ msgstr "Attendu :"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Got:"
-msgstr "A:"
+msgstr "A :"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed sha256 hash check"
@@ -5197,7 +5237,7 @@ msgid "Bake Lightmaps"
msgstr "Précalculer les lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Aperçu"
@@ -5460,12 +5500,12 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Réinitialiser le facteur d'agrandissement"
+msgstr "Réinitialiser le zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr "Sélectionner le mode"
+msgstr "Mode sélection"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
@@ -5498,7 +5538,7 @@ msgstr "Mode rotation"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
-msgstr "Mode de mise à l'échelle"
+msgstr "Mode mise à l'échelle"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5527,7 +5567,7 @@ msgstr "Activer/Désactiver le magnétisme intelligent."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Smart Snap"
-msgstr "Utiliser le magnétisme intelligent"
+msgstr "Utiliser l'aimantation intelligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle grid snapping."
@@ -5535,7 +5575,7 @@ msgstr "Activer/Désactiver l'aimantation à la grille."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
-msgstr "Aimanter à la grille"
+msgstr "Utiliser l'aimantation à la grille"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
@@ -5665,7 +5705,7 @@ msgstr "Centrer sur la sélection"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "Cadrer la sélection"
+msgstr "Encadrer la sélection"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
@@ -5951,12 +5991,12 @@ msgid "Mesh is empty!"
msgstr "Le maillage est vide !"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Créer un corps statique de type Trimesh"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Impossible de créer une forme de collision Trimesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Créer corps convexe statique"
+msgid "Create Static Trimesh Body"
+msgstr "Créer un corps statique de type Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5967,12 +6007,32 @@ msgid "Create Trimesh Static Shape"
msgstr "Créer une forme Trimesh statique"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Échec de la création de formes !"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"Impossible de créer une forme de collision convexe unique pour la racine de "
+"la scène."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Impossible de créer une forme de collision convexe unique."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Créer une(des) forme(s) convexe(s)"
+msgid "Create Single Convex Shape"
+msgstr "Créer une forme convexe unique"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Impossible de créer des formes de collision convexes multiples pour la "
+"racine de la scène."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Impossible de créer des formes de collision."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Créer des formes convexes multiples"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -6026,18 +6086,71 @@ msgid "Create Trimesh Static Body"
msgstr "Créer un corps statique Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crée un StaticBody et lui attribue automatiquement une forme de collision "
+"basée sur les polygones.\n"
+"C'est l'option la plus précise (mais la plus lente) pour la détection des "
+"collisions."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Créer une collision Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Créer une(des) collision(s) convexe(s) sœur(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crée une forme de collision basée sur les polygones.\n"
+"C'est l'option la plus précise (mais la plus lente) pour la détection des "
+"collisions."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Créer une seule collision convexe sœur"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Crée une forme de collision convexe unique.\n"
+"C'est l'option la plus rapide (mais la moins précise) pour la détection des "
+"collisions."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Créer plusieurs collisions convexes sœurs"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Crée une forme de collision basée sur les polygones.\n"
+"Il s'agit d'une performance à mi-chemin entre les deux options ci-dessus."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Créer un maillage de contour…"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Crée un maillage de contour statique. Le maillage de contour verra ses "
+"normales inversées automatiquement.\n"
+"Cela peut être utilisé à la place de la propriété Grow de SpatialMaterial "
+"lorsque l'utilisation de cette propriété n'est pas possible."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Afficher l'UV1"
@@ -6261,7 +6374,7 @@ msgstr "Volume"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Emission Source: "
-msgstr "Source d'Émission: "
+msgstr "Source d'émission : "
#: editor/plugins/particles_editor_plugin.cpp
msgid "A processor material of type 'ParticlesMaterial' is required."
@@ -6775,7 +6888,7 @@ msgstr "Basculer le tri alphabétique de la liste de méthodes."
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter methods"
-msgstr "Méthodes de filtrage"
+msgstr "Filtrer les méthodes"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -6892,14 +7005,6 @@ msgid "Open Godot online documentation."
msgstr "Ouvrir la documentation de Godot en ligne."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Demande de documentation"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Aider à améliorer la documentation de Godot en donnant vos réactions."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Rechercher dans la documentation de référence."
@@ -6965,12 +7070,12 @@ msgstr ""
"nœud '%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Ligne"
+msgid "[Ignore]"
+msgstr "[Ignorer]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignorer)"
+msgid "Line"
+msgstr "Ligne"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6989,7 +7094,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
-msgstr "Symbole de recherche"
+msgstr "Rechercher un symbole"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -7230,7 +7335,7 @@ msgstr "Échelle : "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translating: "
-msgstr "Traduction : "
+msgstr "Translation : "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
@@ -7322,7 +7427,7 @@ msgstr "Arrière"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "Aligner le Transform avec la vue"
+msgstr "Aligner Transform avec la vue"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
@@ -7339,6 +7444,10 @@ msgstr ""
"sélectionné."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Vue orthogonale automatique"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Verrouiller la rotation de la vue"
@@ -7404,19 +7513,19 @@ msgstr "Vue libre droite"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "Vue libre de devant"
+msgstr "Vue libre avant"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Vue libre de derrière"
+msgstr "Vue libre arrière"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "Vue libre de dessus"
+msgstr "Vue libre haut"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "Vue libre de dessous"
+msgstr "Vue libre bas"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
@@ -7424,32 +7533,47 @@ msgstr "Modificateur de vitesse de la vue libre"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Slow Modifier"
-msgstr "Modificateur de vitesse de la vue libre"
+msgstr "Ralentissement de la vue libre"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotation de la vue verrouillée"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
-"Note : La valeur FPS affichée est la fréquence d'images de l'éditeur.\n"
-"Il ne doit pas être utilisé comme un indicateur fiable de la performance en "
-"jeu."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Verrouiller la rotation de la vue"
+"Note : Les FPS (images par secondes) affichées sont celles de éditeur.\n"
+"Elles ne doivent pas être utilisées comme un indicateur fiable de la "
+"performance en jeu."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Dialogue XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Cliquez pour modifier l'état de visibilité.\n"
+"\n"
+"Œil ouvert : Gizmo est visible.\n"
+"Œil fermé : Gizmo est masqué.\n"
+"Œil entrouvert : Gizmo est également visible à travers les surfaces opaques "
+"(« rayon x »)."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr "Aligner les nœuds au sol"
+msgstr "Aligner les nœuds avec le sol"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr "N'a pas pu trouvé de sol solide pour y attacher la sélection."
+msgstr "Pas de sol solide trouvé pour y attacher la sélection."
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7463,11 +7587,11 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Local Space"
-msgstr "Utiliser l'espace local"
+msgstr "Utiliser les coordonées locales"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "Aligner sur la grille"
+msgstr "Utiliser l’aimantation"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7479,11 +7603,11 @@ msgstr "Vue de dessus"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr "Vue arrière"
+msgstr "Vue de derrière"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr "Vue avant"
+msgstr "Vue de devant"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
@@ -7499,7 +7623,7 @@ msgstr "Basculer entre la vue perspective et orthogonale"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
-msgstr "Insérer une clef d'animation"
+msgstr "Insérer une clé d'animation"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
@@ -7683,7 +7807,7 @@ msgstr "Convertir en Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
-msgstr "Géométrie invalide, impossible de créer le polygone."
+msgstr "Géométrie invalide, impossible de créer le polygone."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Polygon2D"
@@ -7782,7 +7906,8 @@ msgid "New Animation"
msgstr "Nouvelle animation"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Vitesse (IPS) :"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8098,7 +8223,7 @@ msgstr "Donnez une ressource TileSet à cette TileMap pour utiliser ses tuiles."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Peindre la case"
+msgstr "Peindre la tuile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
@@ -8110,7 +8235,7 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "Sélectionner une case"
+msgstr "Sélectionner une tuile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
@@ -8460,7 +8585,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "Aucun addon VCS n'est disponible."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Erreur"
@@ -8486,7 +8611,7 @@ msgstr "Système de contrôle de version"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Initialize"
-msgstr "initialiser"
+msgstr "Initialiser"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
@@ -8498,7 +8623,7 @@ msgstr "Détecter de nouveaux changements"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Changes"
-msgstr "Changements"
+msgstr "Modifications"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Modified"
@@ -8926,8 +9051,7 @@ msgstr "Renvoie la tangente hyperbolique inverse du paramètre."
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
msgstr ""
-"Recherche l'entier le plus proche qui est plus supérieur ou égal au "
-"paramètre."
+"Recherche l'entier le plus proche qui est supérieur ou égal au paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
@@ -8943,7 +9067,7 @@ msgstr "Renvoie le cosinus hyperbolique du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr "Convertit une quantité de radians en degrés."
+msgstr "Convertit une quantité en radians en degrés."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
@@ -9009,11 +9133,11 @@ msgstr "1.0 / scalaire"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr "Renvoie l'entier le plus proche de celui du paramètre."
+msgstr "Renvoie l'entier le plus proche du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr "Renvoie l'entier pair le plus proche de celui du paramètre."
+msgstr "Renvoie l'entier pair le plus proche du paramètre."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
@@ -9512,15 +9636,15 @@ msgstr "Ressources"
#: editor/project_export.cpp
msgid "Export all resources in the project"
-msgstr "Exporter toutes les ressources dans le projet"
+msgstr "Exporter toutes les ressources du projet"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
-msgstr "Exporter les scènes sélectionnées (y compris les dépendences)"
+msgstr "Exporter les scènes sélectionnées (y compris les dépendances)"
#: editor/project_export.cpp
msgid "Export selected resources (and dependencies)"
-msgstr "Exporter les ressources sélectionnées (y compris les dépendences)"
+msgstr "Exporter les ressources sélectionnées (y compris les dépendances)"
#: editor/project_export.cpp
msgid "Export Mode:"
@@ -9564,7 +9688,7 @@ msgstr "Fonctionnalités"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
-msgstr "Personnalisé (séparé par des virgules) :"
+msgstr "Personnalisé (séparé par des virgules) :"
#: editor/project_export.cpp
msgid "Feature List:"
@@ -9620,7 +9744,7 @@ msgstr "Fichier ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
-msgstr "Données de jeu Godot"
+msgstr "Archive Godot"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -9635,26 +9759,32 @@ msgid "Export With Debug"
msgstr "Exporter avec debug"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Le chemin vers ce fichier n'existe pas."
+msgid "The path specified doesn't exist."
+msgstr "Le chemin spécifié n'existe pas."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+"Erreur lors de l'ouverture du fichier package (il n'est pas au format ZIP)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"Fichier de projet « .zip » invalide, il ne contient pas de fichier « project."
-"godot »."
+"Fichier de projet \".zip\" invalide ; il ne contient pas de fichier \"projet."
+"godot\"."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Veuillez choisir un dossier vide."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Veuillez choisir un fichier « project.godot » ou « .zip »."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Veuillez choisir un fichier \"project.godot\" ou \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "Le répertoire contient déjà un projet Godot."
+msgid "This directory already contains a Godot project."
+msgstr "Ce répertoire contient déjà un projet Godot."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9916,8 +10046,9 @@ msgid ""
msgstr ""
"Êtes vous certain de vouloir scanner %s dossiers à la recherche de projets "
"Godot existants ?\n"
-"Cela pourrait prendre prendre un moment."
+"Cela pourrait prendre un moment."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Gestionnaire de projets"
@@ -9966,6 +10097,17 @@ msgstr ""
"Vous n'avez pour l'instant aucun projets.\n"
"Voulez-vous explorer des exemples de projets officiels dans l'Asset Library ?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"La barre de recherche filtre les projets par leur nom et la dernière partie "
+"de leur chemin d'accès.\n"
+"Pour filtrer les projets par leur nom et le chemin d'accès complet, la "
+"recherche doit inclure au moins un caractère `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Touche "
@@ -10168,19 +10310,19 @@ msgstr "Ajouter un chemin remappé"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr "Réaffectation des ressources ; Ajouter une réaffectation"
+msgstr "Réaffectation (remap) des ressources ; Ajouter une réaffectation"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
-msgstr "Modifier le langage de réaffectation des ressources"
+msgstr "Modifier le langage de réaffectation (remap) des ressources"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap"
-msgstr "Supprimer la réaffectation des ressources"
+msgstr "Supprimer la réaffectation (remap) des ressources"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap Option"
-msgstr "Supprimer option de remap de ressource"
+msgstr "Supprimer l'option de réaffectation (remap) de ressource"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter"
@@ -10188,7 +10330,7 @@ msgstr "Filtre de langue modifié"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter Mode"
-msgstr "Changé le mode de filtrage des langues"
+msgstr "Mode de filtrage des langues modifié"
#: editor/project_settings_editor.cpp
msgid "Project Settings (project.godot)"
@@ -10200,7 +10342,7 @@ msgstr "Général"
#: editor/project_settings_editor.cpp
msgid "Override For..."
-msgstr "Écraser pour…"
+msgstr "Surcharge pour…"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
@@ -10244,7 +10386,7 @@ msgstr "Traductions :"
#: editor/project_settings_editor.cpp
msgid "Remaps"
-msgstr "Remaps"
+msgstr "Réaffectation"
#: editor/project_settings_editor.cpp
msgid "Resources:"
@@ -10252,7 +10394,7 @@ msgstr "Ressources :"
#: editor/project_settings_editor.cpp
msgid "Remaps by Locale:"
-msgstr "Remaps par langue :"
+msgstr "Réaffectations (remaps) par langue :"
#: editor/project_settings_editor.cpp
msgid "Locale"
@@ -10347,14 +10489,25 @@ msgid "Batch Rename"
msgstr "Renommer par lot"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Remplacer : "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Préfixe"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Suffixe"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Utiliser des expressions régulières"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Options avancées"
@@ -10391,11 +10544,12 @@ msgstr ""
"Comparez les options du compteur."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Compteur par niveau"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Si défini, le compteur redémarre pour chaque groupe de nœuds enfant"
#: editor/rename_dialog.cpp
@@ -10412,7 +10566,7 @@ msgstr "Valeur par laquelle le compteur est incrémenté pour chaque nœud"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr "Remplissage"
+msgstr "Remplissage(Padding)"
#: editor/rename_dialog.cpp
msgid ""
@@ -10423,10 +10577,6 @@ msgstr ""
"Les chiffres manquants sont complétés par des zéros en tête."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Expressions régulières"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Post-traitement"
@@ -10435,12 +10585,12 @@ msgid "Keep"
msgstr "Conserver"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase vers sous_ligné"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase vers snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "sous_ligné vers CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case vers PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10458,6 +10608,15 @@ msgstr "Convertir en majuscule"
msgid "Reset"
msgstr "Réinitialiser"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Erreur dans l'expression régulière"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Au caractère %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Re-parenter le nœud"
@@ -10523,8 +10682,8 @@ msgid "Instance Child Scene"
msgstr "Instancier une scène enfant"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Supprimer le script"
+msgid "Detach Script"
+msgstr "Détacher le script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10561,6 +10720,10 @@ msgid "Make node as Root"
msgstr "Choisir le nœud comme racine de scène"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Supprimer %d nœuds et leurs enfants potentiels ?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Supprimer %d nœuds ?"
@@ -10690,6 +10853,16 @@ msgid "Open Documentation"
msgstr "Ouvrir la documentation"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Impossible de joindre un script : aucune langue n'est enregistrée.\n"
+"C'est probablement parce que cet éditeur a été construit avec tous les "
+"modules de langue désactivés."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Ajouter un nœud enfant"
@@ -10738,12 +10911,12 @@ msgstr ""
"nœud racine n'existe."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Attacher un script (nouveau ou existant) pour le nœud sélectionné."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Attacher un nouveau script ou un script existant au nœud sélectionné."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Effacer un script pour le nœud sélectionné."
+msgid "Detach the script from the selected node."
+msgstr "Détacher le script du nœud sélectionné."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10874,6 +11047,10 @@ msgid "A directory with the same name exists."
msgstr "Un dossier du même nom existe déjà."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Le fichier n'existe pas."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Extension invalide."
@@ -10914,6 +11091,10 @@ msgid "File exists, it will be reused."
msgstr "Le fichier existe, il sera réutilisé."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Chemin invalide."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Nom de classe invalide."
@@ -10922,8 +11103,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Nom ou chemin parent hérité invalide."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Script valide."
+msgid "Script path/name is valid."
+msgstr "Le chemin/nom du script est valide."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10946,6 +11127,14 @@ msgid "Script file already exists."
msgstr "Le fichier de script existe déjà."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Remarque : les scripts intégrés ont certaines limitations et ne peuvent pas "
+"être modifiés à l'aide d'un éditeur externe."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Nom de la classe :"
@@ -10979,11 +11168,11 @@ msgstr "Erreur :"
#: editor/script_editor_debugger.cpp
msgid "C++ Error"
-msgstr "Erreur C ++"
+msgstr "Erreur C++"
#: editor/script_editor_debugger.cpp
msgid "C++ Error:"
-msgstr "Erreur C ++ :"
+msgstr "Erreur C++ :"
#: editor/script_editor_debugger.cpp
msgid "C++ Source"
@@ -11014,6 +11203,10 @@ msgid "Copy Error"
msgstr "Copier l'erreur"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Mémoire vidéo"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Passer les points d'arrêt"
@@ -11063,12 +11256,12 @@ msgid "Total:"
msgstr "Total :"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Mémoire vidéo"
+msgid "Export list to a CSV file"
+msgstr "Exporter la liste vers un fichier CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
-msgstr "Chemin de la ressource"
+msgstr "Chemin de ressource"
#: editor/script_editor_debugger.cpp
msgid "Type"
@@ -11252,7 +11445,7 @@ msgstr "Bibliothèque"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
-msgstr "Bibliothèques: "
+msgstr "Bibliothèques : "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
@@ -11412,7 +11605,7 @@ msgstr "Remplir la sélection"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
-msgstr "Paramètres GridMap"
+msgstr "Paramètres GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Pick Distance:"
@@ -11521,7 +11714,7 @@ msgstr ""
#: modules/visual_script/visual_script.cpp
msgid "Node returned an invalid sequence output: "
-msgstr "Le nœud a retourné une séquence de sortie invalide: "
+msgstr "Le nœud a retourné une séquence de sortie invalide : "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
@@ -11531,7 +11724,7 @@ msgstr ""
#: modules/visual_script/visual_script.cpp
msgid "Stack overflow with stack depth: "
-msgstr "Débordement de pile avec profondeur de pile: "
+msgstr "Débordement de pile avec profondeur de pile : "
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Signal Arguments"
@@ -11846,7 +12039,7 @@ msgstr "Modifier le membre"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
-msgstr "Type d'entrée non itérable: "
+msgstr "Type d'entrée non itérable : "
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid"
@@ -11854,7 +12047,7 @@ msgstr "L'itérateur est devenu invalide"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid: "
-msgstr "L'itérateur est devenu invalide: "
+msgstr "L'itérateur est devenu invalide : "
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name."
@@ -11874,19 +12067,19 @@ msgstr "Nom de propriété invalide « %s » dans le nœud %s."
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
-msgstr ": Argument invalide de type: "
+msgstr ": Argument invalide de type : "
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid arguments: "
-msgstr ": Arguments invalides: "
+msgstr ": Arguments invalides : "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableGet not found in script: "
-msgstr "VariableGet introuvable dans le script: "
+msgstr "VariableGet introuvable dans le script : "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableSet not found in script: "
-msgstr "VariableSet introuvable dans le script: "
+msgstr "VariableSet introuvable dans le script : "
#: modules/visual_script/visual_script_nodes.cpp
msgid "Custom node has no _step() method, can't process graph."
@@ -11963,6 +12156,12 @@ msgstr ""
"dans le préréglage."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"La clé de version n'est pas configurée correctement dans le préréglage "
+"d'exportation."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"La création d'une version personnalisée nécessite un chemin d'accès Android "
@@ -11992,6 +12191,40 @@ msgstr "Nom de paquet invalide :"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Module \"GodotPaymentV3\" invalide inclus dans le paramétrage du projet "
+"\"android/modules\" (modifié dans Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "« Use Custom Build » doit être activé pour utiliser les plugins."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"« Degrés de liberté » est valide uniquement lorsque le « Mode Xr » est « "
+"Oculus Mobile VR »."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"« Suivi de la main » est valide uniquement lorsque le « Mode Xr » est « "
+"Oculus Mobile VR »."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"« Sensibilité de la mise au point » est valide uniquement lorsque le « Mode "
+"Xr » est « Oculus Mobile VR »."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12209,6 +12442,15 @@ msgstr ""
"Une forme doit être créée afin qu'une CollisionShape2D fonctionne. Veuillez "
"créer une ressource de forme !"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Les formes à base de polygones ne sont pas prévues pour être utilisées ou "
+"éditées via le nœud CollisionShape2D. Veuillez utiliser le nœud "
+"CollisionPolygon2D à la place."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12301,9 +12543,9 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Les changements de taille pour RigidBody2D (en mode caractère ou rigide) "
-"seront remplacés par le moteur physique lors de l'exécution. Modifiez la "
-"taille des formes de collision enfants à la place."
+"Les modifications de taille pour RigidBody2D (en mode caractère ou rigide) "
+"seront remplacées par le moteur physique lors de l'exécution. \n"
+"Modifiez la taille des formes de collision enfant à la place."
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
@@ -12384,7 +12626,7 @@ msgstr "%d%%"
#: scene/3d/baked_lightmap.cpp
msgid "(Time Left: %d:%02d s)"
-msgstr "(Temps restant: %d:%02d s)"
+msgstr "(Temps restant : %d:%02d s)"
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Meshes: "
@@ -12451,6 +12693,13 @@ msgstr ""
"Les formes planes ne fonctionnent pas bien et seront supprimées dans les "
"versions futures. S'il vous plaît, ne les utilisez pas."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape ne supporte pas RigidBody dans un autre mode que le mode "
+"statique."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Rien n'est visible car aucun maillage n'a été assigné."
@@ -12475,6 +12724,11 @@ msgstr ""
"Les GIProps ne sont pas supporter par le pilote de vidéos GLES2.\n"
"A la place utilisez une BakedLightMap."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12541,9 +12795,9 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Les changements de taille pour RigidBody (dans les modes caractère ou "
-"rigide) seront remplacés par le moteur physique lors de l'exécution. "
-"Modifiez la taille dans les formes de collision enfants à la place."
+"Les modifications de taille pour RigidBody (dans les modes caractère ou "
+"rigide) seront remplacées par le moteur physique lors de l'exécution.\n"
+"Modifiez la taille dans les formes de collision enfant à la place."
#: scene/3d/remote_transform.cpp
msgid ""
@@ -12758,6 +13012,12 @@ msgstr ""
"nœud de type Control afin qu'il en obtienne une taille. Sinon, faites-en une "
"RenderTarget et assignez sa texture à un nœud pouvant l'afficher."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"La taille de la fenêtre d'affichage doit être supérieure à 0 pour pouvoir "
+"afficher quoi que ce soit."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Source invalide pour la prévisualisation."
@@ -12776,7 +13036,7 @@ msgstr "Affectation à la fonction."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr "Affectation à l'uniforme."
+msgstr "Affectation à la variable uniform."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
@@ -12786,6 +13046,56 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex."
msgid "Constants cannot be modified."
msgstr "Les constantes ne peuvent être modifiées."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Module d'importation et système de fichiers"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Lors de l'exportation ou du déploiement, l'exécutable produit tentera de "
+#~ "se connecter à l'adresse IP de cet ordinateur afin de procéder au "
+#~ "débogage."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "La scène actuelle n'a jamais été sauvegardée, veuillez la sauvegarder "
+#~ "avant de la lancer."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Pas dans le chemin de la ressource."
+
+#~ msgid "Revert"
+#~ msgstr "Réinitialiser"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Cette action ne peut être annulée. Réinitialiser quand même ?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Réinitialiser la scène"
+
+#~ msgid "Clear Script"
+#~ msgstr "Supprimer le script"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Traqueur de problèmes"
+
+#~ msgid "Request Docs"
+#~ msgstr "Demande de documentation"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr ""
+#~ "Aider à améliorer la documentation de Godot en donnant vos réactions."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d occurrence(s) remplacée(s)."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Créer corps convexe statique"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Échec de la création de formes !"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/ga.po b/editor/translations/ga.po
index f1db3d5a78..d727d2a1fa 100644
--- a/editor/translations/ga.po
+++ b/editor/translations/ga.po
@@ -2,11 +2,11 @@
# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
-# Rónán Quill <ronan085@gmail.com>, 2019.
+# Rónán Quill <ronan085@gmail.com>, 2019, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-08-04 14:22+0000\n"
+"PO-Revision-Date: 2020-06-15 01:48+0000\n"
"Last-Translator: Rónán Quill <ronan085@gmail.com>\n"
"Language-Team: Irish <https://hosted.weblate.org/projects/godot-engine/godot/"
"ga/>\n"
@@ -15,7 +15,7 @@ msgstr ""
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
"(n>6 && n<11) ? 3 : 4;\n"
-"X-Generator: Weblate 3.8-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -91,7 +91,7 @@ msgstr ""
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr ""
+msgstr "Saor"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -508,6 +508,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -667,7 +668,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -686,7 +687,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -736,6 +737,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -815,7 +820,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -872,6 +876,11 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Scagairí..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -909,7 +918,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cuardach:"
@@ -1083,6 +1092,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1104,6 +1116,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1408,7 +1428,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1416,16 +1436,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1453,6 +1465,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1572,15 +1588,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1729,7 +1745,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1843,7 +1859,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2254,10 +2270,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2342,11 +2354,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Cruthaigh"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2612,10 +2627,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2675,22 +2686,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2699,8 +2714,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2709,32 +2724,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2794,7 +2809,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2808,7 +2823,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3190,7 +3209,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3217,6 +3237,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3803,19 +3827,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+#, fuzzy
+msgid "%d Files"
+msgstr "Amharc ar Chomhaid"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3831,7 +3860,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3865,10 +3894,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4914,7 +4939,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5647,11 +5672,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5663,11 +5688,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5719,11 +5760,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5731,6 +5801,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6567,14 +6645,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6636,11 +6706,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7004,6 +7074,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7092,17 +7166,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7439,7 +7522,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8097,7 +8180,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9184,11 +9267,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9196,11 +9284,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9415,6 +9503,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9461,6 +9550,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9838,11 +9934,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9880,11 +9984,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9910,10 +10014,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9922,11 +10022,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9945,6 +10045,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10008,7 +10116,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10044,6 +10152,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10166,6 +10278,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10212,11 +10331,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10336,6 +10455,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10376,6 +10499,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10384,8 +10511,9 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr ""
+#, fuzzy
+msgid "Script path/name is valid."
+msgstr "Tá crann beochana bailí."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10408,6 +10536,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10477,6 +10611,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10525,7 +10663,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11396,6 +11534,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11419,6 +11561,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11596,6 +11764,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11783,6 +11957,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11803,6 +11982,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12022,6 +12206,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/he.po b/editor/translations/he.po
index 6a153b6f11..3a508c0d6d 100644
--- a/editor/translations/he.po
+++ b/editor/translations/he.po
@@ -5,17 +5,23 @@
# Daniel <lorddaniel09@gmail.com>, 2018.
# Ben Golan <golanben4@gmail.com>, 2017.
# Luc Stepniewski <lior@gradstein.info>, 2017.
-# Yaron Shahrabani <sh.yaron@gmail.com>, 2018, 2019.
+# Yaron Shahrabani <sh.yaron@gmail.com>, 2018, 2019, 2020.
# RaikaRakka <shaiyatta@gmail.com>, 2018.
# Ido Dana <idodana01@gmail.com>, 2019.
# Daniel Dovgun <daniel.dovgun@gmail.com>, 2019.
# MordechaiHadad <Mordechai.hadad01@gmail.com>, 2019.
+# Daniel <danielharush5252@gmail.com>, 2020.
+# test test <ugbdvwpeikvyzwaadt@awdrt.org>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
+# Daniel Kariv <danielkariv98@gmail.com>, 2020.
+# Ziv D <wizdavid@gmail.com>, 2020.
+# yariv benj <yariv4400@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-09-07 13:51+0000\n"
-"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
+"PO-Revision-Date: 2020-09-24 12:43+0000\n"
+"Last-Translator: Ziv D <wizdavid@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/"
"godot/he/>\n"
"Language: he\n"
@@ -24,16 +30,16 @@ 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 3.9-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "משתנה סוג לא חוקי לפונקציית convert()‎, יש להשתמש בקבועי TYPE_*‎."
+msgstr "סוג משתנה לא חוקי לפונקציית convert()‎, יש להשתמש בקבועי TYPE_*‎."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "היתה צפויה מחרוזת באורך 1 (תו)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -47,7 +53,7 @@ msgstr "קלט שגוי %I (לא הועבר) בתוך הביטוי"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "'self' לא ניתן לשימוש כי המופע הינו 'null' ( לא הועבר)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -58,51 +64,48 @@ msgid "Invalid index of type %s for base type %s"
msgstr "שם מאפיין האינדקס מסוג %s עבור בסיס %s שגוי"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid named index '%s' for base type %s"
-msgstr "שם אינדקס לא תקין '%s' לסוג בסיס '%s'"
+msgstr "שם אינדקס לא תקין '%s' לסוג בסיס %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": ארגומנט שגוי מסוג: "
+msgstr "פרמטרים שגויים לבניית 's%'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "בקריאה ל־‚%s’:"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Free"
-msgstr "חינם"
+msgstr "חופשי"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -122,15 +125,15 @@ msgstr "ערך:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "הכנס מפתח כאן"
+msgstr "הכנס כאן מפתח"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "לשכפל את הקבצים הנבחרים"
+msgstr "שכפול מפתח(ות) שנבחרו"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "למחוק את הקבצים הנבחרים"
+msgstr "מחיקת מפתח(ות) שנבחרו"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
@@ -141,62 +144,52 @@ msgid "Move Bezier Points"
msgstr "הזזת נקודות בזייה"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Duplicate Keys"
msgstr "שכפול מפתחות הנפשה"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Delete Keys"
msgstr "מחיקת מפתחות הנפשה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Time"
msgstr "שינוי זמן פריים-מפתח אנימציה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Transition"
-msgstr "שינוי מיקום אנימציה"
+msgstr "החלפת הנפשת אפקט החלפה"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "שינוי מיקום אנימציה"
+msgstr "החלפת הנפשת אפקט שינוי צורה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Value"
-msgstr "שינוי ערך קיפריים אנימציה"
+msgstr "שינוי ערך פריים-מפתח אנימציה"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr ""
+msgstr "שינוי קריאת אנימציה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "שינוי זמן פריים-מפתח אנימציה"
+msgstr "שינוי זמן פריים-מפתח אנימציה רבים"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "שינוי מיקום אנימציה"
+msgstr "שינוי מיקומי אנימציה רבים"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "שינוי מיקום אנימציה"
+msgstr "שינוי מיקומי אנימציה רבים"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "שינוי ערך קיפריים אנימציה"
+msgstr "שינוי ערכי פריים-מפתח אנימציה רבים"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "שינוי מיקום אנימציה"
+msgstr "שינוי מיקומים אנימציה רבים"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -204,16 +197,14 @@ msgstr "שנה אורך אנימציה"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Change Animation Loop"
-msgstr "שינוי לופ אנימציה"
+msgstr "שינוי לולאת אנימציה"
#: editor/animation_track_editor.cpp
msgid "Property Track"
msgstr "רצועת מאפיין"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
msgstr "רצועת שינוי 3D"
@@ -227,12 +218,10 @@ msgid "Bezier Curve Track"
msgstr "רצועת עקום בזייה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Playback Track"
msgstr "רצועת שמע"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
msgstr "רצועת הנפשה"
@@ -241,7 +230,6 @@ msgid "Animation length (frames)"
msgstr "משך ההנפשה (פריימים)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
msgstr "משך ההנפשה (שניות)"
@@ -250,7 +238,6 @@ msgid "Add Track"
msgstr "הוספת רצועה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
msgstr "לולאת הנפשה"
@@ -260,23 +247,20 @@ msgid "Functions:"
msgstr "פונקציות:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "מאזין לשמע"
+msgstr "קטעי שמע:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
msgstr "קטעי הנפשה:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Track Path"
-msgstr "החלפת ערך רצועה"
+msgstr "החלפת נתיב רצועה"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "הפעל/כבה רצועה"
+msgstr "הפעלת/כיבוי רצועה זו."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
@@ -284,11 +268,11 @@ msgstr "עדכן מצב (איך המאפיין הזה נקבע)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr ""
+msgstr "מצב אינטרפולציה"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "מצב לולאה Wrap (אינטרפולציה של הסוף עם ההתחלה בלולאה)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
@@ -300,7 +284,7 @@ msgstr "זמן (שניות): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "הפעלת/ביטול רצועה"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -308,11 +292,11 @@ msgstr "מתמשך"
#: editor/animation_track_editor.cpp
msgid "Discrete"
-msgstr ""
+msgstr "בדיד"
#: editor/animation_track_editor.cpp
msgid "Trigger"
-msgstr ""
+msgstr "הדק/מפעיל"
#: editor/animation_track_editor.cpp
msgid "Capture"
@@ -333,11 +317,11 @@ msgstr "מעוקב"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "אינטרפולצית לולאה מסוג Clamp"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "אינטרפולצית לולאה מסוג Wrap"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -353,14 +337,12 @@ msgid "Delete Key(s)"
msgstr "מחיקת מפתח(ות)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
msgstr "שינוי מצב עדכון הנפשה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "החלפת ערך מילון"
+msgstr "שינוי מצב אינטרפולציה בהנפשה"
#: editor/animation_track_editor.cpp
msgid "Change Animation Loop Mode"
@@ -391,7 +373,6 @@ msgid "Create"
msgstr "יצירה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Insert"
msgstr "הוסף הנפשה"
@@ -418,9 +399,8 @@ msgid "Change Animation Step"
msgstr "ניקוי ההנפשה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "סידור רצועות"
+msgstr "סדר רצועות מחדש"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
@@ -433,18 +413,22 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"רצועת אודיו יכולה להצביע על חוליות מסוג:\n"
+"- AudioStreamPlayer\n"
+"- AudioStreamPlayer2D\n"
+"- AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "רצועות הנפשה יכולות להצביע רק על איברי AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "נגן הנפשה אינו יכול להנפיש את עצמו, רק שחקנים אחרים."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "אי אפשר להוסיף רצועה חדשה בלי שורש"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
@@ -483,23 +467,20 @@ msgid "Add Method Track Key"
msgstr "הוספת רצועות חדשות."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "לא נמצא VariableGet בסקריפט: "
+msgstr "לא נמצאה מתודה בעצם: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "לוח גזירי המשאבים ריק!"
+msgstr "לוח העתקה ריק"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "הדבקת משתנים"
+msgstr "הדבקת רצועות"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -508,7 +489,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "אפשרות זו אינה פעילה לעריכת בזייה, כי זאת רק רצועה אחת."
#: editor/animation_track_editor.cpp
msgid ""
@@ -522,40 +503,46 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"ההנפשה שייכת לסצנה מיובאת, לכן שינויים לרצועות המיובאות לא ישמרו.\n"
+"\n"
+"להפעלת האפשרות להוספת רצועות מותאמות-אישית, יש לקבוע בהגדרות ייבוא של הסצנה "
+"את\n"
+"\"הנפשה > אחסון\" ל-\"קבצים\", להפעיל את \"הנפשה > השאר רצועות מותאמות-אישית"
+"\", ולבסוף לייבא מחדש.\n"
+"דרך אחרת, להשתמש בהגדרות ייבוא אשר מייבאים הנפשות לקבצים נפרדים."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "אזהרה: עריכת הנפשה מיובאת"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr ""
+msgstr "יש לבחור במפרק AnimationPlayer כדי ליצור ולערוך הנפשות."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "הצגת רצועות רק של מפרקים שנבחרו בעץ."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "קיבוץ רצועות לפי מפרק או הצגה כרשימה פשוטה."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "הצמדה"
+msgstr "הצמדה:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "שקופיות ההנפשה"
+msgstr "ערך צעד של הנפשה."
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "שניות"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr ""
+msgstr "FPS"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -568,14 +555,12 @@ msgid "Edit"
msgstr "עריכה"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "שקופיות ההנפשה"
+msgstr "מאפייני ההנפשה."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "העתקת משתנים"
+msgstr "העתקת רצועות"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -680,7 +665,7 @@ msgstr "הגדרת מעברונים אל:"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr "העתקה"
+msgstr "העתק"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -718,20 +703,19 @@ msgstr "מעבר לשורה"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr "מספר השורה:"
+msgstr "שורה מספר:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+msgid "%d replaced."
+msgstr "%d הוחלף."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "%d התאמה."
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "אין תוצאות"
+msgstr "%d התאמות."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -741,9 +725,9 @@ msgstr "התאמת רישיות"
msgid "Whole Words"
msgstr "מילים שלמות"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr "להחליף"
+msgstr "החלף"
#: editor/code_editor.cpp
msgid "Replace All"
@@ -756,7 +740,7 @@ msgstr "בחירה בלבד"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "רגיל"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
@@ -791,6 +775,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -841,9 +829,8 @@ msgid "Extra Call Arguments:"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "מאפייני פריט."
+msgstr "שיטת המקלט:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -875,7 +862,6 @@ msgstr "שגיאת חיבור"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -935,6 +921,11 @@ msgid "Signals"
msgstr "אותות"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "מאפייני פריט."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -944,14 +935,12 @@ msgid "Disconnect All"
msgstr "ניתוק"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "עריכה"
+msgstr "עריכה..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "שיטות"
+msgstr "מעבר למתודה"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -975,7 +964,7 @@ msgid "Recent:"
msgstr "אחרונים:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "חיפוש:"
@@ -1142,7 +1131,7 @@ msgstr "תודה רבה מקהילת Godot!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
-msgstr "מתנדבי מנוע Godot"
+msgstr "מתנדבי מנוע גודו"
#: editor/editor_about.cpp
msgid "Project Founders"
@@ -1152,6 +1141,9 @@ msgstr "מקימי המיזם"
msgid "Lead Developer"
msgstr "מפתחים ראשיים"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "מנהל המיזם "
@@ -1173,6 +1165,16 @@ msgid "Gold Sponsors"
msgstr "מממני זהב"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "תורמים בדרגת כסף"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "תורמים בדרגת ארד"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "מממנים זעירים"
@@ -1227,9 +1229,8 @@ msgid "Error opening package file, not in ZIP format."
msgstr "פתיחת קובץ החבילה נכשלה, המבנה אינו zip."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "הפעולה ‚%s’ כבר קיימת!"
+msgstr "%s (כבר קיים)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1406,9 +1407,8 @@ msgid "Add Bus"
msgstr "הוספת אפיק"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Add a new Audio Bus to this layout."
-msgstr "שמירת פריסת אפיקי השמע בתור…"
+msgstr "הוסף אפיק שמע חדש לפריסה זו."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1487,7 +1487,7 @@ msgstr "הזזת טעינה אוטומטית"
msgid "Remove Autoload"
msgstr "הסרת טעינה אוטומטית"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "הפעלה"
@@ -1495,18 +1495,9 @@ msgstr "הפעלה"
msgid "Rearrange Autoloads"
msgstr "סידור טעינות אוטומטית מחדש"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "נתיב שגוי."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "הקובץ לא קיים."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "לא בנתיב המשאב."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1533,6 +1524,10 @@ msgstr "שם"
msgid "Singleton"
msgstr "יחידני"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "הדבקת משתנים"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "הסצנה מתעדכנת"
@@ -1619,9 +1614,8 @@ msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "קובץ התבנית לא נמצא:"
+msgstr "תבנית ניפוי שגיאות מותאמת אישית לא נמצאה."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1658,21 +1652,21 @@ msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "ייבוא"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
msgstr "שם המפרק:"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "מערכת קבצים"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "ייבוא"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "להחליף הכול"
@@ -1734,9 +1728,8 @@ msgid ""
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "שגיאה בשמירה"
+msgstr "שגיאה בשמירת פרופיל לנתיב 's%'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
@@ -1824,13 +1817,11 @@ msgid "Copy Path"
msgstr "העתקת נתיב"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "הצגה במנהל הקבצים"
+msgstr "פתיחה במנהל הקבצים"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
msgstr "הצגה במנהל הקבצים"
@@ -1838,7 +1829,7 @@ msgstr "הצגה במנהל הקבצים"
msgid "New Folder..."
msgstr "תיקייה חדשה…"
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "רענון"
@@ -1880,79 +1871,71 @@ msgstr "שמירת קובץ"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr "חזרה אחורה"
+msgstr "מעבר אחורה"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr "התקדמות קדימה"
+msgstr "מעבר קדימה"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr "עלייה למעלה"
+msgstr "מעבר מעלה"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "החלפת מצב תצוגה לקבצים מוסתרים"
+msgstr "הצג/הסתר קבצים מוסתרים"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "החלפת מצב מועדפים"
+msgstr "הוספת/ביטול מועדף"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr "החלפת מצב"
+msgstr "שינוי מצב"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "התמקדות על נתיב"
+msgstr "מיקוד נתיב"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "העברת מועדף למעלה"
+msgstr "העברת מועדף מעלה"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "העברת מועדף למטה"
+msgstr "העברת מועדף מטה"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "מעבר לתיקייה שמעל"
+msgstr "מעבר לתיקיה הקודמת."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "מעבר לתיקייה שמעל"
+msgstr "מעבר לתיקיה הבאה."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "מעבר לתיקייה שמעל"
+msgstr "מעבר לתיקיית העל."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "חיפוש במחלקות"
+msgstr "רענן קבצים."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "לא ניתן ליצור תיקייה."
+msgstr "(בטל) העדפת תיקייה נוכחית."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "החלפת מצב תצוגה לקבצים מוסתרים"
+msgstr "הצג/הסתר קבצים מוסתרים."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "צפייה בפריטים כרשת של תמונות ממוזערות"
+msgstr "הצג פריטים כרשת של תמונות ממוזערות."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "הצגת פריטים כרשימה"
+msgstr "הצג פריטים כרשימה."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
@@ -1960,7 +1943,7 @@ msgstr "תיקיות וקבצים:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "תצוגה מקדימה:"
@@ -1980,11 +1963,11 @@ msgstr "סריקת מקורות"
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
-msgstr ""
+msgstr "יש מספר מייבאים לסוגים שונים המצביעים לקובץ %s, הייבוא בוטל"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr ""
+msgstr "ייבוא משאבים (מחדש)"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
@@ -2004,14 +1987,12 @@ msgid "Inherited by:"
msgstr "מוריש אל:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "תיאור:"
+msgstr "תיאור"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "מסמכים מקוונים"
+msgstr "הדרכות מקוונות"
#: editor/editor_help.cpp
msgid "Properties"
@@ -2019,21 +2000,19 @@ msgstr "מאפיינים"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "דריסה:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "טעינת בררת המחדל"
+msgstr "ברירת מחדל:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "שיטות"
+msgstr "מתודות"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "מאפיינים"
+msgstr "מאפייני ערכת עיצוב"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2044,31 +2023,32 @@ msgid "Constants"
msgstr "קבועים"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "תיאור המאפיין:"
+msgstr "תיאורי מאפיינים"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "ערך:"
+msgstr "(ערך)"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"כרגע אין תיאור למאפיין זה. בבקשה עזור לנו על-ידי [/color][/url]כתיבת "
+"תיאור[url=$url][color=$color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "תיאור השיטה:"
+msgstr "תיאורי מתודות"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"כרגע אין תיאור למתודה זו. בבקשה עזור לנו על-ידי [/url][/color]כתיבת תיאור "
+"[color=$color][url=$url]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -2080,99 +2060,84 @@ msgid "Case Sensitive"
msgstr "תלוי רישיות"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "חיפוש"
+msgstr "הצג היררכיה"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "הצגה נורמלית"
+msgstr "הצג הכל"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "מחלקות"
+msgstr "מחלקות בלבד"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "שיטות"
+msgstr "מתודות בלבד"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "אותות"
+msgstr "אותות בלבד"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "קבועים"
+msgstr "קבועים בלבד"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "מאפיינים"
+msgstr "מאפיינים בלבד"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "מאפיינים"
+msgstr "מאפייני ערכת עיצוב בלבד"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "חברים"
+msgstr "סוג שדה"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "מחלקה:"
+msgstr "מחלקה"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "שיטות"
+msgstr "מתודה"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "אותות"
+msgstr "אות"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
msgstr "קבוע"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "מאפיינים"
+msgstr "מאפיין"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "מאפיינים"
+msgstr "מאפיין ערכת עיצוב"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr ""
+msgstr "מאפיין:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "קבע"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "קביעה מרובה:"
#: editor/editor_log.cpp
msgid "Output:"
msgstr "פלט:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "הסרת הבחירה"
+msgstr "העתקת בחירה"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2182,11 +2147,11 @@ msgstr "הסרת הבחירה"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr "מחיקה"
+msgstr "ניקוי"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr "מחיקת הפלט"
+msgstr "ניקוי פלט"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2196,20 +2161,19 @@ msgstr "עצירה"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
msgid "Start"
-msgstr ""
+msgstr "התחלה"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s לשנייה"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
msgstr "הורדה"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "העלאה"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
@@ -2217,32 +2181,32 @@ msgstr "מפרק"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "RPC נכנס"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "RSET נכנס"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "RPC יוצא"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "RSET יוצא"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "חלון חדש"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "משאבים מיובאים לא נשמרו."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr ""
+msgstr "אישור"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
@@ -2253,6 +2217,7 @@ msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"המשאב לא יכול להישמר מפני שאינו שייך לסצנה שנערכה, הפוך אותו קודם לייחודי."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
@@ -2264,7 +2229,7 @@ msgstr "לא ניתן לפתוח קובץ לכתיבה:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr "תבנית הקובץ המבוקשת לא ידועה:"
+msgstr "סוג הקובץ המבוקש לא ידוע:"
#: editor/editor_node.cpp
msgid "Error while saving."
@@ -2272,27 +2237,27 @@ msgstr "שגיאה בעת השמירה."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "לא יכול לפתוח את 's%'. יכול להיות שהקובץ הועבר או נמחק."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
-msgstr "הפענוח של ‚%s’ נכשל."
+msgstr "שגיאה בפענוח 's%'."
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr "סוף הקובץ בלתי צפוי ‚%s’."
+msgstr "סוף קובץ בלתי צפוי '%s'."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
-msgstr ""
+msgstr "חסר 's%' או תלות שלו."
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
-msgstr "הטעינה של ‚%s’ נכשלה."
+msgstr "שגיאה בטעינת 's%'."
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr "הסצנה נשמרת"
+msgstr "שומר סצנה"
#: editor/editor_node.cpp
msgid "Analyzing"
@@ -2300,7 +2265,7 @@ msgstr "מתבצע ניתוח"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
-msgstr "נוצרת תמונה ממוזערת"
+msgstr "יצירת תמונה ממוזערת"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
@@ -2311,34 +2276,34 @@ msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"סצנה זו לא יכולה להישמר מפני שיש הכללת מופע מעגלית.\n"
+"בבקשה פתור זאת ואז נסה לשמור שוב."
#: editor/editor_node.cpp
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
-msgstr ""
-"לא ניתן לשמור את הסצנה. כפי הנראה עקב תלויות (מופעים או ירושות) שאינן "
-"מסופקות."
+msgstr "לא ניתן לשמור את הסצנה. כנראה עקב תלות (מופע או ירושה) שלא מסופקת."
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "לא ניתן להחליף סצנה שעדיין פתוחה!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr ""
+msgstr "לא ניתן לטעון את MeshLibrary למיזוג!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr ""
+msgstr "שגיאה בשמירת MeshLibrary!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr ""
+msgstr "לא ניתן לטעון TileSet למיזוג!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr ""
+msgstr "שגיאה בשמירת TileSet!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
@@ -2346,7 +2311,7 @@ msgstr "שמירת הפריסה נכשלה!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
-msgstr "בררת המחדל של פריסת העורך שוכתבה."
+msgstr "ברירת המחדל של עורך הפריסה נדרסה."
#: editor/editor_node.cpp
msgid "Layout name not found!"
@@ -2354,7 +2319,7 @@ msgstr "שם הפריסה לא נמצא!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
-msgstr "פריסת בררת המחדל שוחזרה להגדרות הבסיס."
+msgstr "פריסת ברירת המחדל שוחזרה להגדרות הבסיס."
#: editor/editor_node.cpp
msgid ""
@@ -2362,20 +2327,24 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"משאב זה שייך לסצנה שיובאה ולא ניתן לעריכה.\n"
+"בבקשה קרא/י את התיעוד הקשור לייבוא סצנות כדי להבין טוב יותר את שיטת עבודה."
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
+"משאב זה שייך לסצנה שנוצר לה מופע או שעברה ירושה.\n"
+"שינויים במשאב לא יישמרו בשמירת הסצינה הנוכחית."
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
-"משאב זה עבר יבוא, לכן אין אפשרות לערוך אותו. יש לשנות את ההגדרות שלו בחלונית "
-"הייבוא ואז לייבא שוב."
+"משאב זה מיובא ואין אפשרות לערוך אותו. יש לשנות את הגדרותיו בחלון הייבוא "
+"ולייבא מחדש."
#: editor/editor_node.cpp
msgid ""
@@ -2384,6 +2353,9 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"סצנה זו מיובאת, כל שינוי בה לא יישמר.\n"
+"יצירת מופע או ירושה תאפשר לעשות בה שינויים.\n"
+"בבקשה קרא/י את התיעוד הקשור לייבוא סצנות כדי להבין טוב יותר את שיטת העבודה."
#: editor/editor_node.cpp
msgid ""
@@ -2391,16 +2363,14 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
+"זהו אובייקט מרוחק לכן שינויים בו לא יישמרו.\n"
+"בבקשה קרא/י את התיועד הקשור לניפוי שגיאות כדי להבין טוב יותר את שיטת העבודה."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
msgstr "אין סצנה מוגדרת להרצה."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "הסצנה הנוכחית מעולם לא נשמרה, נא לשמור אותה בטרם ההרצה."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "לא ניתן להפעיל תהליך משנה!"
@@ -2413,9 +2383,8 @@ msgid "Open Base Scene"
msgstr "פתיחת סצנת בסיס"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "פתיחת סצנה מהירה…"
+msgstr "פתיחה מהירה…"
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2431,16 +2400,15 @@ msgstr "שמירה וסגירה"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
-msgstr "לשמור את השינויים ל־‚%s’ לפני הסגירה?"
+msgstr "לשמור את השינויים ל־'%s' לפני הסגירה?"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "טעינת המשאב נכשלה."
+msgstr "נשמרו %s משאבים שהשתנו."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr ""
+msgstr "מפרק עליון דרוש כדי לשמור את הסצינה."
#: editor/editor_node.cpp
msgid "Save Scene As..."
@@ -2464,7 +2432,7 @@ msgstr "לא ניתן לבצע פעולה זו ללא סצנה."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr ""
+msgstr "ייצוא Mesh Library"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
@@ -2472,7 +2440,7 @@ msgstr "לא ניתן לבצע פעולה זו ללא מפרק עליון."
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr ""
+msgstr "ייצוא Tile Set"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
@@ -2487,16 +2455,20 @@ msgid "Can't reload a scene that was never saved."
msgstr "לא ניתן לרענן סצנה שמעולם לא נשמרה."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "שחזור"
+msgid "Reload Saved Scene"
+msgstr "טעינה מחדש של סצינה שמורה"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "לא ניתן לבטל פעולה זו. לשחזר בכל זאת?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"הסצינה הנוכחית כוללת שינויים שלא נשמרו.\n"
+"האם לטעון מחדש את הסצינה? לא ניתן לבטל פעולה זו."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr ""
+msgstr "הפעלה מהירה של הסצנה..."
#: editor/editor_node.cpp
msgid "Quit"
@@ -2539,56 +2511,61 @@ msgid "Close Scene"
msgstr "סגירת סצנה"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "סגירת סצנה"
+msgstr "פתיחה מחדש של סצנה סגורה"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
-msgstr "לא ניתן לפתוח את תוסף ההרחבות תחת: ‚%s’ פענוח ההגדרות נכשל."
+msgstr "לא ניתן לפתוח את תוסף ההרחבות בנתיב: '%s' פענוח ההגדרות נכשל."
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
-msgstr "לא ניתן למצוא שדה סקריפט עבור תוסף הרחבה תחת ‚res://addons/%s’."
+msgstr "לא ניתן למצוא שדה סקריפט עבור תוסף הרחבה בנתיב 'res://addons/%s'."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "לא ניתן לטעון סקריפט הרחבה מהנתיב: ‚%s’."
+msgstr "לא ניתן לטעון סקריפט הרחבה מנתיב: '%s'."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
+"לא ניתן לטעון סקריפט הרחבה מנתיב: '%s' נראה שיש שגיאה בקוד, אנא בדוק את "
+"התחביר."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
-msgstr ""
+msgstr "לא ניתן לטעון סקריפט הרחבה מנתיב: '%s' סוג הבסיס אינו EditorPlugin."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
-msgstr ""
+msgstr "לא ניתן לטעון סקריפט הרחבה מנתיב: '%s' סקריפט אינו מוגדר ככלי (tool)."
#: editor/editor_node.cpp
msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
+"הסצינה '%s' יובאה באופן אוטומטי ואין אפשרות לשנות אותה.\n"
+"כדי לבצע בה שינויים, ניתן ליצור סצינה חדשה בירושה."
#: editor/editor_node.cpp
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
+"שגיאה בטעינת הסצנה, היא חייבת להיות בתוך נתיב המיזם. השתמש ב'ייבוא' כדי "
+"לפתוח את הסצינה, ואז שמור אותה בנתיב המיזם."
#: editor/editor_node.cpp
msgid "Scene '%s' has broken dependencies:"
-msgstr ""
+msgstr "לסצינה '%s' יש תלות חסרה:"
#: editor/editor_node.cpp
msgid "Clear Recent Scenes"
-msgstr ""
+msgstr "נקה סצינות אחרונות"
#: editor/editor_node.cpp
msgid ""
@@ -2596,6 +2573,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"לא הוגדרה סצנה ראשית, לבחור אחת?\n"
+"אפשר לשנות זאת מאוחר יותר ב-\"הגדרות מיזם\" תחת הקטגוריה 'יישום'."
#: editor/editor_node.cpp
msgid ""
@@ -2603,6 +2582,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"הסצינה שנבחרה '%s' לא קיימת, לבחור סצנה קיימת?\n"
+"אפשר לשנות זאת מאוחר יותר ב\"הגדרות מיזם\" תחת הקטגוריה 'יישום'."
#: editor/editor_node.cpp
msgid ""
@@ -2610,81 +2591,78 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"הסצינה שנבחרה '%s' אינה קובץ סצינה, לבחור קובץ סצינה אחר?\n"
+"אפשר לשנות זאת מאוחר יותר ב-\"הגדרות מיזם\" תחת הקטגוריה 'יישום'."
#: editor/editor_node.cpp
msgid "Save Layout"
-msgstr ""
+msgstr "שמירת פריסה"
#: editor/editor_node.cpp
msgid "Delete Layout"
-msgstr ""
+msgstr "מחיקת פריסה"
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
msgid "Default"
-msgstr ""
+msgstr "בחירת מחדל"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "הצגה במערכת הקבצים"
+msgstr "הצגה בחלון הקבצים"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "נגינת הסצנה"
+msgstr "הרצת הסצנה"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "לסגור לשוניות אחרות"
+msgstr "סגירת לשונית"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "לסגור לשוניות אחרות"
+msgstr "ביטול סגירת לשונית"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
-msgstr "לסגור לשוניות אחרות"
+msgstr "סגירת לשוניות אחרות"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "סגירת לשוניות מימין"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "לסגור הכול"
+msgstr "סגירת כל הלשוניות"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
-msgstr ""
+msgstr "החלפת לשונית סצנה"
#: editor/editor_node.cpp
msgid "%d more files or folders"
-msgstr ""
+msgstr "%d קבצים או תיקיות נוספים"
#: editor/editor_node.cpp
msgid "%d more folders"
-msgstr ""
+msgstr "%d תיקיות נוספות"
#: editor/editor_node.cpp
msgid "%d more files"
-msgstr ""
+msgstr "%d קבצים נוספים"
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr ""
+msgstr "מיקום הפנל"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr ""
+msgstr "מצב ללא הסחות דעת"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
-msgstr ""
+msgstr "הפעל/בטל מצב ללא הסחות דעת."
#: editor/editor_node.cpp
msgid "Add a new scene."
@@ -2696,12 +2674,11 @@ msgstr "סצנה"
#: editor/editor_node.cpp
msgid "Go to previously opened scene."
-msgstr "מעבר לסצנה שנפתחה קודם לכן."
+msgstr "מעבר לסצנה הקודמת."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "העתקת נתיב"
+msgstr "העתקת טקסט"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2713,7 +2690,7 @@ msgstr "הלשונית הקודמת"
#: editor/editor_node.cpp
msgid "Filter Files..."
-msgstr ""
+msgstr "סנן קבצים..."
#: editor/editor_node.cpp
msgid "Operations with scene files."
@@ -2740,7 +2717,6 @@ msgid "Save Scene"
msgstr "שמירת סצנה"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "שמירת כל הסצנות"
@@ -2750,11 +2726,11 @@ msgstr "המרה אל…"
#: editor/editor_node.cpp
msgid "MeshLibrary..."
-msgstr ""
+msgstr "MeshLibrary..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr ""
+msgstr "TileSet..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2767,10 +2743,6 @@ msgid "Redo"
msgstr "ביצוע חוזר"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "שחזור סצנה"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "כלים שונים למיזם או למגוון סצנות."
@@ -2780,49 +2752,44 @@ msgid "Project"
msgstr "מיזם"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "הגדרות מיזם"
+msgstr "הגדרות מיזם..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "גרסה:"
+msgstr "בקרת גירסאות"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "קביעת בקרת גירסאות"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "סגור בקרת גירסאות"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "ייצוא"
+msgstr "ייצוא..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "התקנת תבנית בנייה לאנדרואיד..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "לפתוח את מנהל המיזמים?"
+msgstr "פתיחת תיקיית נתוני המיזם"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "כלים"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "דפדפן משאבים יתומים"
+msgstr "סייר משאבים יתומים ..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "יציאה לרשימת המיזמים"
+msgstr "יציאה לרשימת מיזמים"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -2835,125 +2802,137 @@ msgstr "הטעמה עם ניפוי שגיאות מרחוק"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"בעת ייצוא או הטמעה, קובץ ההפעלה ינסה להתחבר לכתובת ה־IP של המחשב הזה לצורך "
-"ניפוי שגיאות."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "הטמעה קטנה עם מערכת קבצים ברשת"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
+"כאשר אפשרות זו מופעלת, ייצוא או פריסה יפיקו קובץ הפעלה מינימלי.\n"
+"מערכת הקבצים תסופק מהמיזם על ידי העורך ברשת.\n"
+"באנדרואיד, הפריסה תשתמש בכבל USB לביצועים מהירים יותר. אפשרות זו מזרזת בדיקה "
+"של משחקים עם קובץ הרצה גדול."
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr ""
+msgstr "צורות התנגשות גלויים"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
+"צורות התנגשויות ומפרקי קרניים (עבור דו ותלת מימד) יהיו גלויים בהרצת המשחק אם "
+"אפשרות זאת מופעלת."
#: editor/editor_node.cpp
msgid "Visible Navigation"
msgstr "ניווט גלוי"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
-msgstr ""
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
+msgstr "רשתות ניווט ומצולעים יהיו גלויים בהרצת המשחק אם אפשרות זאת מופעלת."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "סנכרון השינויים בסצנה"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
+"כאשר אפשרות זו מופעלת, כל השינויים שיבוצעו בסצנה בעורך יוצגו בהרצת המשחק.\n"
+"בשימוש עם מכשיר מרוחק, מערכת קבצים ברשת (NFS) תהיה יעילה יותר ."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "סנכרון השינויים בסקריפט"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
+"כאשר אפשרות זו מופעלת, כל סקריפט שנשמר יטען מחדש בהרצת המשחק.\n"
+"בשימוש עם מכשיר מרוחק, מערכת קבצים ברשת (NFS) תהיה יעילה יותר ."
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "עורך"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "הגדרות עורך"
+msgstr "הגדרות העורך..."
#: editor/editor_node.cpp
msgid "Editor Layout"
msgstr "פריסת עורך"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "שמירת סצנה"
+msgstr "שמירת צילום מסך"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "הגדרות עורך"
+msgstr "צילומי מסך נשמרים בתיקיית נתוני/הגדרות העורך."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "כניסה אל/יציאה ממסך מלא"
+msgstr "הפעלת/ביטול מסך מלא"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "החלפת מצב"
+msgstr "הפעלת/ביטול מסוף מערכת"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "הגדרות עורך"
+msgstr "פתיחת תיקיית נתוני/הגדרות העורך"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "פתיחת תיקיית נתוני העורך"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "הגדרות עורך"
+msgstr "פתיחת תיקיית הגדרות העורך"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "ניהול תבניות ייצוא"
+msgstr "ניהול תכונות העורך..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "ניהול תבניות ייצוא"
+msgstr "ניהול תבניות ייצוא..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2964,7 +2943,7 @@ msgstr "עזרה"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "חיפוש"
@@ -2978,8 +2957,12 @@ msgid "Q&A"
msgstr "שאלות ותשובות נפוצות"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "עוקב תקלות"
+msgid "Report a Bug"
+msgstr "דיווח על תקלה (באג)"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "שליחת משוב על התיעוד"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2987,19 +2970,19 @@ msgstr "קהילה"
#: editor/editor_node.cpp
msgid "About"
-msgstr "על"
+msgstr "על אודות"
#: editor/editor_node.cpp
msgid "Play the project."
-msgstr "נגינת המיזם…"
+msgstr "הרצת המיזם."
#: editor/editor_node.cpp
msgid "Play"
-msgstr "נגינה"
+msgstr "הרצה"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "הפסקת הרצת הסצנה לניפוי שגיאות."
#: editor/editor_node.cpp
msgid "Pause Scene"
@@ -3011,49 +2994,44 @@ msgstr "עצירת הסצנה."
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr "נגינת הסצנה שנערכה."
+msgstr "הרצת הסצנה שנערכה."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr "נגינת הסצנה"
+msgstr "הרצת הסצנה"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr "נגינת סצנה מותאמת אישית"
+msgstr "הרצת סצנה מותאמת אישית"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "נגינת סצנה בהתאמה אישית"
+msgstr "הרצת סצנה בהתאמה אישית"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "שינוי מנהל התקן הווידאו דורש הפעלת העורך מחדש."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "לשמור ולצאת"
+msgstr "שמירה והפעלה מחדש"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Spins when the editor window redraws."
-msgstr "מסתובב כאשר חלון העורך מצויר מחדש!"
+msgstr "מסתובב כאשר חלון העורך מצויר מחדש."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "מתמשך"
+msgstr "עדכון רציף"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "עדכון שינויים"
+msgstr "עדכון בעת שינוי"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "השבתת שבשבת עדכון"
+msgstr "הסתרת מחוון העדכון"
#: editor/editor_node.cpp
msgid "FileSystem"
@@ -3064,9 +3042,8 @@ msgid "Inspector"
msgstr "חוקר"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Expand Bottom Panel"
-msgstr "להרחיב הכול"
+msgstr "הרחבת פאנל תחתון"
#: editor/editor_node.cpp
msgid "Output"
@@ -3078,12 +3055,11 @@ msgstr "לא לשמור"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
-msgstr ""
+msgstr "חסרה תבנית בנייה לאנדרואיד, נא להתקין תבניות רלוונטיות."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "ניהול תבניות ייצוא"
+msgstr "ניהול תבניות"
#: editor/editor_node.cpp
msgid ""
@@ -3095,6 +3071,12 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
+"פעולה זו תגדיר את המיזם שלך לבניית אנדרואיד מותאמת אישית על ידי התקנת תבנית "
+"המקור ל- \"res://android/build\".\n"
+"לאחר מכן אפשר להחיל שינויים ולבנות APK מותאם אישית בייצוא (הוספת מודולים, "
+"שינוי AndroidManifest.xml, וכו').\n"
+"כדי לערוך בנייה מותאמת אישית במקום שימוש בתבנית קיימת, יש לאפשר את \"השתמש "
+"בבניה מותאמת אישית\" בהגדרות הייצוא לאנדרואיד."
#: editor/editor_node.cpp
msgid ""
@@ -3162,9 +3144,8 @@ msgid "Open the previous Editor"
msgstr "פתיחת העורך הקודם"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "אזהרות"
+msgstr "אזהרה!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
@@ -3375,7 +3356,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3402,6 +3384,10 @@ msgstr "לא ניתן להריץ את הסקריפט:"
msgid "Did you forget the '_run' method?"
msgstr "שכחת את השיטה ‚‎_run’?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "נא לבחור מפרקים לייצוא"
@@ -3539,9 +3525,8 @@ msgid ""
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "שגיאה בבקשת כתובת: "
+msgstr "שגיאה בבקשת כתובת:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3628,9 +3613,8 @@ msgid "Download Templates"
msgstr "הורדת תבניות"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "בחירת אתר מראה מהרשימה: "
+msgstr "בחר אתר חלופי מהרשימה: (Shift+Click: פתיחה בדפדפן)"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3695,9 +3679,8 @@ msgid "Duplicating folder:"
msgstr "תיקייה משוכפלת:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "סצנה חדשה בירושה…"
+msgstr "סצנה חדשה יורשת"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3832,9 +3815,8 @@ msgid "Create Script"
msgstr "יצירת סקריפט"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "איתור…"
+msgstr "איתור בקבצים"
#: editor/find_in_files.cpp
#, fuzzy
@@ -3870,14 +3852,12 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "איתור"
+msgstr "איתור "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "להחליף"
+msgstr "להחליף "
#: editor/find_in_files.cpp
#, fuzzy
@@ -3903,9 +3883,8 @@ msgid "Remove from Group"
msgstr "הסרה מקבוצה"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "הפעולה ‚%s’ כבר קיימת!"
+msgstr "שם הקבוצה כבר קיים."
#: editor/groups_editor.cpp
#, fuzzy
@@ -4029,10 +4008,18 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "שמירה…"
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d קבצים"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "הגדרה כבררת מחדל עבור ‚%s’"
@@ -4041,10 +4028,6 @@ msgid "Clear Default for '%s'"
msgstr "מחיקת בררת מחדל עבור ‚%s’"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " קבצים"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "ייבוא בתור:"
@@ -4058,7 +4041,7 @@ msgid "Reimport"
msgstr "ייבוא מחדש"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4094,13 +4077,8 @@ msgid "Copy Params"
msgstr "העתקת משתנים"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "הדבקת משתנים"
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "לוח גזירי המשאבים ריק!"
+msgstr "ערוך לוח העתקת משאבים"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4342,9 +4320,8 @@ msgid "Open Animation Node"
msgstr "שם הנפשה חדשה:"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "הפעולה ‚%s’ כבר קיימת!"
+msgstr "המשולש כבר קיים."
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
@@ -4399,14 +4376,13 @@ msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Parameter Changed"
-msgstr "שינויי חומרים"
+msgstr "משתנה השתנה"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Filters"
-msgstr ""
+msgstr "עריכת מסננים"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
@@ -4439,15 +4415,14 @@ msgid "Nodes Disconnected"
msgstr "מנותק"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "שם הנפשה חדשה:"
+msgstr "קביעת הנפשה"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Node"
-msgstr "מחיקת שורה"
+msgstr "מחק מפרק"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
@@ -4542,9 +4517,8 @@ msgid "Remove Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "שם שגוי."
+msgstr "שם הנפשה לא חוקי!"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -4573,14 +4547,12 @@ msgid "Duplicate Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "תקריב הנפשה."
+msgstr "אין הנפשה להעתקה!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "לא בנתיב המשאב."
+msgstr "אין משאב הנפשה בלוח ההעתקה!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -4591,9 +4563,8 @@ msgid "Paste Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "שם הנפשה חדשה:"
+msgstr "אין הנפשה לעריכה!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -4736,9 +4707,8 @@ msgid "Move Node"
msgstr "מצב הזזה (W)"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "מעברון"
+msgstr "המעברון קיים!"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -4824,9 +4794,8 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "מעברון"
+msgstr "מעברון: "
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -5211,7 +5180,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5994,11 +5963,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6010,12 +5979,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "יצירת %s חדש"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "לא ניתן ליצור תיקייה."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "יצירת %s חדש"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6067,19 +6054,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "יצירת מצולע"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "יצירת מצולע"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6452,7 +6477,7 @@ msgstr "הזזת נקודה"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "מאפיין 'skeleton' של Polygon2D אינו מצביע על מפרק Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6627,9 +6652,8 @@ msgid "Show Grid"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "הגדרת הצמדה…"
+msgstr "הגדר רשת:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Offset X:"
@@ -6724,66 +6748,58 @@ msgid "Error writing TextFile:"
msgstr "שגיאה בייבוא ערכת הנושא"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "לא ניתן ליצור תיקייה."
+msgstr "לא ניתן לטעון קובץ מהמיקום:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "שגיאה בשמירה"
+msgstr "שגיאה בשמירת קובץ!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "שגיאה בשמירת ערכת העיצוב"
+msgstr "שגיאה בשמירת ערכת העיצוב."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
msgstr "שגיאה בשמירה"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "שגיאה בייבוא ערכת הנושא"
+msgstr "שגיאה בייבוא ערכת העיצוב."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
msgstr "שגיאה בייבוא"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
-msgstr "תיקייה חדשה…"
+msgstr "קובץ טקסט חדש…"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "פתיחת קובץ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "שמירה בשם…"
+msgstr "שמירת קובץ בשם…"
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "לא ניתן לקבל את הסקריפט להרצה."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "רענון הסקריפט נכשל, נא לחפש את השגיאות במסוף."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "הסקריפט אינו במצב כלים, לא תהיה לו אפשרות לרוץ."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
+"כדי להריץ את הסקריפט הזה, עליו לרשת EditorScript ולהגדיר אותו למצב כלים."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6816,9 +6832,8 @@ msgid "Find Previous"
msgstr "איתור הקודם"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "מאפייני פריט."
+msgstr "סינון סקריפטים"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
@@ -6950,14 +6965,6 @@ msgid "Open Godot online documentation."
msgstr "פתיחת התיעוד המקוון של Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -7025,18 +7032,17 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "שורה:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "מעבר לפונקציה…"
+msgstr "עבור לפונקציה"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -7418,6 +7424,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Lock View Rotation"
msgstr "הצגת מידע"
@@ -7508,18 +7518,27 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "הצגת מידע"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "הצגת מידע"
+msgid "XForm Dialog"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7879,7 +7898,8 @@ msgid "New Animation"
msgstr "שם הנפשה חדשה:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "מהירות (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8593,7 +8613,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8824,9 +8844,8 @@ msgid "Create Shader Node"
msgstr "יצירת תיקייה"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "מעבר לפונקציה…"
+msgstr "פונקציית צבע."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
@@ -9316,9 +9335,8 @@ msgid "Transform uniform."
msgstr "התמרה"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "מעבר לפונקציה…"
+msgstr "פונקציה וקטורית."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector operator."
@@ -9639,9 +9657,8 @@ msgid "Make Patch"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " קבצים"
+msgstr "קובץ ארכיון"
#: editor/project_export.cpp
msgid "Features"
@@ -9694,9 +9711,8 @@ msgid "Export Project"
msgstr "ייצוא מיזם"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "ייצוא מיזם"
+msgstr "מצב הייצוא?"
#: editor/project_export.cpp
#, fuzzy
@@ -9704,9 +9720,8 @@ msgid "Export All"
msgstr "ייצוא"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " קבצים"
+msgstr "קובץ ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
@@ -9725,11 +9740,18 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "הקובץ לא קיים."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "פתיחת קובץ החבילה נכשלה, המבנה אינו zip."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9737,11 +9759,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9962,6 +9984,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "מנהל המיזמים"
@@ -10010,6 +10033,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "מקש "
@@ -10033,9 +10063,8 @@ msgid ""
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "הפעולה ‚%s’ כבר קיימת!"
+msgstr "פעולה עם השם '%s' כבר קיימת."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
@@ -10398,15 +10427,25 @@ msgid "Batch Rename"
msgstr "שינוי שם"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "להחליף "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "גרסה נוכחית:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Advanced Options"
msgstr "הגדרות הצמדה"
@@ -10429,9 +10468,8 @@ msgid "Node type"
msgstr "איתור סוג מפרק"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "הסצנה הנוכחית לא נשמרה. לפתוח בכל זאת?"
+msgstr "שם סצנה נוכחית"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -10445,11 +10483,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10476,10 +10514,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10488,11 +10522,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10514,6 +10548,16 @@ msgstr "אותיות גדולות"
msgid "Reset"
msgstr "איפוס התקריב"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "גרסה נוכחית:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "תווים תקפים:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10577,8 +10621,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "יצירת סקריפט"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10615,10 +10660,14 @@ msgstr "שמירת סצנה"
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Delete %d nodes?"
+msgid "Delete %d nodes and any children?"
msgstr "מחיקת שורה"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes?"
+msgstr "מחק %d מפרקים?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
msgstr ""
@@ -10627,9 +10676,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "מחיקת שורה"
+msgstr "מחק מפרק \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10745,6 +10793,13 @@ msgid "Open Documentation"
msgstr "פתיחת התיעוד המקוון של Godot"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10795,11 +10850,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10904,19 +10959,16 @@ msgid "Select a Node"
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "לוח גזירי המשאבים ריק!"
+msgstr "הנתיב ריק."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "לוח גזירי המשאבים ריק!"
+msgstr "שם הקובץ ריק."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "הנתיב לא מוביל מפרק!"
+msgstr "הנתיב אינו מקומי."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -10929,6 +10981,10 @@ msgid "A directory with the same name exists."
msgstr "כבר קיימים קובץ או תיקייה בשם הזה."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "הקובץ לא קיים."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "יש להשתמש בסיומת תקנית."
@@ -10973,6 +11029,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "נתיב שגוי."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "שם שגוי."
@@ -10982,7 +11043,7 @@ msgid "Invalid inherited parent name or path."
msgstr "שם מאפיין האינדקס שגוי."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -11005,9 +11066,14 @@ msgid "Will load an existing script file."
msgstr "טעינת פריסת אפיקי שמע."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "הפעולה ‚%s’ כבר קיימת!"
+msgstr "קובץ סקריפט כבר קיים."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11088,6 +11154,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "מחיקת נקודות"
@@ -11138,8 +11208,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "ייצוא מיזם"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11573,334 +11644,324 @@ msgid "Done!"
msgstr ""
#: modules/visual_script/visual_script.cpp
+#, fuzzy
msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
msgstr ""
+"מפרק ביצע yield ללא זיכרון עבודה, אנא קרא את התיעוד על איך לעשות yield כראוי!"
#: modules/visual_script/visual_script.cpp
msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
-msgstr ""
+msgstr "המפרק ביצע yield, אבל לא החזיר את מצב הפונקציה בזיכרון העבודה הראשון."
#: modules/visual_script/visual_script.cpp
msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
msgstr ""
+"יש להקצות את הערך המוחזר לאלמנט הראשון של זיכרון עבודה של המפרק! יש לתקן את "
+"המפרק בבקשה."
#: modules/visual_script/visual_script.cpp
msgid "Node returned an invalid sequence output: "
-msgstr ""
+msgstr "מפרק החזיר פלט סדר (sequence) לא חוקי: "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr ""
+msgstr "סיבית הסדר (sequence bit) נמצאה אבל המפרק לא במחסנית, דווח על שגיאה!"
#: modules/visual_script/visual_script.cpp
msgid "Stack overflow with stack depth: "
-msgstr ""
+msgstr "גלישת מחסנית עם עומק מחסנית: "
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Signal Arguments"
-msgstr ""
+msgstr "שינוי ארגומנטים של אות"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument Type"
-msgstr ""
+msgstr "שינוי סוג ארגומנט"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument name"
-msgstr ""
+msgstr "שינוי שם ארגומנט"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr ""
+msgstr "קביעת ערך ברירת מחדל של משתנה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
-msgstr ""
+msgstr "קביעת סוג משתנה"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "מועדפים:"
+msgstr "הוספת פורט כניסה"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "מועדפים:"
+msgstr "הוספת פורט יציאה"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Override an existing built-in function."
-msgstr "שם שגוי. לא יכול לחפוף לשם סוג מובנה קיים."
+msgstr "דריסה של פונקציה מובנת קיימת."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "יצירת %s חדש"
+msgstr "יצירת פונקציה חדשה."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
-msgstr ""
+msgstr "משתנים:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "יצירת %s חדש"
+msgstr "יצירת משתנה חדש."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr "אותות:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "יצירת מצולע"
+msgstr "יצירת אות חדש."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
-msgstr ""
+msgstr "השם אינו מזהה חוקי:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name already in use by another func/var/signal:"
-msgstr ""
+msgstr "השם כבר בשימוש של פונקציה/משתנה/אות אחר:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Function"
-msgstr ""
+msgstr "שינוי שם פונקציה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Variable"
-msgstr ""
+msgstr "שינוי שם משתנה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Signal"
-msgstr ""
+msgstr "שינוי שם אות"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Function"
-msgstr ""
+msgstr "הוספת פונקציה"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
-msgstr "הסרת נקודה בנתיב"
+msgstr "מחיקת פורט כניסה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
-msgstr ""
+msgstr "הוספת משתנה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Signal"
-msgstr ""
+msgstr "הוספת אות"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "הסרת נקודה בנתיב"
+msgstr "הסרת פורט כניסה"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "הסרת נקודה בנתיב"
+msgstr "הסרת פורט יציאה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
-msgstr ""
+msgstr "שינוי ביטוי"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr ""
+msgstr "הסרת מפרקי VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr ""
+msgstr "שכפול מפרקי VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
+"החזק את %s כדי להוסיף Getter. החזק את מקש Shift כדי להוסיף חתימה גנרית."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
+"החזק את מקש Ctrl כדי להוסיף Getter. החזק את מקש Shift כדי להוסיף חתימה גנרית."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
-msgstr ""
+msgstr "החזק את %s כדי להוסיף הפניה פשוטה למפרק."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr ""
+msgstr "החזק את מקש Ctrl כדי להוסיף הפניה פשוטה למפרק."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
-msgstr ""
+msgstr "החזק את %s כדי להוסיף Setter למשתנה."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr ""
+msgstr "החזק את מקש Ctrl כדי להוסיף  Setter למשתנה."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
-msgstr ""
+msgstr "הוספת מפרק קדם טעינה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node(s) From Tree"
-msgstr ""
+msgstr "הוספת מפרק/ים מהעץ"
#: modules/visual_script/visual_script_editor.cpp
msgid ""
"Can't drop properties because script '%s' is not used in this scene.\n"
"Drop holding 'Shift' to just copy the signature."
msgstr ""
+"לא ניתן להוסיף מאפיינים כי סקריפט '%s' לא בשימוש בסצנה זו.\n"
+"החזקת 'Shift' בזמן הוספה תעתיק רק את החתימה."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
-msgstr ""
+msgstr "הוספת מאפיין ל-Getter"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Setter Property"
-msgstr ""
+msgstr "הוספת מאפיין ל-Setter"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Base Type"
-msgstr ""
+msgstr "שינוי סוג בסיס"
#: modules/visual_script/visual_script_editor.cpp
msgid "Move Node(s)"
-msgstr ""
+msgstr "הזזת מפרק(ים)"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
-msgstr ""
+msgstr "הסרת מפרק VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Nodes"
-msgstr ""
+msgstr "חיבור מפרקים"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "מנותק"
+msgstr "ניתוק מפרקים"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "התחברות למפרק:"
+msgstr "קישור נתוני ‫מפרק"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "התחברות למפרק:"
+msgstr "קישור Sequence של מפרק"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
-msgstr ""
+msgstr "לסקריפט יש כבר פונקציה '%s'"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Input Value"
-msgstr ""
+msgstr "שינוי ערך נקלט"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "החלפת מצב הערה"
+msgstr "שינוי גודל הערה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr ""
+msgstr "לא ניתן להעתיק את פונקצית המפרק."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
-msgstr ""
+msgstr "לוח העתקה ריק!"
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste VisualScript Nodes"
-msgstr ""
+msgstr "הדבקת מפרקי VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function with a function node."
-msgstr ""
+msgstr "לא ניתן ליצור פונקציה עם פונקצית המפרק."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr ""
+msgstr "לא ניתן ליצור פונקציה של מפרקים ממפרקים של פונקציות מרובות."
#: modules/visual_script/visual_script_editor.cpp
msgid "Select at least one node with sequence port."
-msgstr ""
+msgstr "בחר מפרק אחד לפחות עם כניסה רציפה (Sequence)."
#: modules/visual_script/visual_script_editor.cpp
msgid "Try to only have one sequence input in selection."
-msgstr ""
+msgstr "יש לנסות בחירה של רק כניסה רציפה אחת."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "יצירת %s חדש"
+msgstr "יצירת פונקציה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
-msgstr ""
+msgstr "הסרת פונקציה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Variable"
-msgstr ""
+msgstr "הסרת משתנה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Variable:"
-msgstr ""
+msgstr "עריכת משתנה:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
-msgstr ""
+msgstr "הסרת אות"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Signal:"
-msgstr ""
+msgstr "עריכת אות:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Tool:"
-msgstr ""
+msgstr "יצירת כלי:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
-msgstr "חברים:"
+msgstr "שדות:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "שינוי ערך בררת המחדל"
+msgstr "שינוי סוג הבסיס:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "הזזת נקודה"
+msgstr "הוספת מפרקים..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "מעבר לפונקציה…"
+msgstr "הוספת פונקציה…"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "פונקציות:"
+msgstr "שם_פונקציה"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
-msgstr ""
+msgstr "יש לבחור או ליצור פונקציה לעריכת התרשים שלה."
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr ""
+msgstr "מחיקת הנבחר"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
-msgstr "איתור סוג מפרק"
+msgstr "איתור סוג המפרק"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
@@ -11911,19 +11972,16 @@ msgid "Cut Nodes"
msgstr "גזירת מפרקים"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "פונקציות:"
+msgstr "יצירת פונקציה"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "רענון"
+msgstr "רענון תרשים"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "חברים"
+msgstr "עריכת שדה"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -11931,11 +11989,11 @@ msgstr "סוג הקלט לא זמין למחזוריות: "
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid"
-msgstr ""
+msgstr "איטרטור הפך ללא חוקי"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid: "
-msgstr ""
+msgstr "איטרטור הפך ללא חוקי: "
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name."
@@ -11951,7 +12009,7 @@ msgstr "הנתיב לא מוביל מפרק!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
-msgstr ""
+msgstr "שם מאפיין אינדקס לא חוקי '%s' במפרק %s."
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
@@ -11978,43 +12036,43 @@ msgid ""
"Invalid return value from _step(), must be integer (seq out), or string "
"(error)."
msgstr ""
+"ערך מוחזר לא חוקי מ-_step(), חייב להיות מספר שלם (seq out) או מחרוזת (שגיאה)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "חיפוש בעזרה"
+msgstr "חיפוש VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "קבלת %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
-msgstr ""
+msgstr "קביעת %s"
#: platform/android/export/export.cpp
msgid "Package name is missing."
-msgstr ""
+msgstr "שם החבילה חסר."
#: platform/android/export/export.cpp
msgid "Package segments must be of non-zero length."
-msgstr ""
+msgstr "מקטעי החבילה חייבים להיות באורך שאינו אפס."
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
+msgstr "התו '%s' אינו מותר בשמות חבילת יישום אנדרואיד."
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
-msgstr ""
+msgstr "ספרה אינה יכולה להיות התו הראשון במקטע חבילה."
#: platform/android/export/export.cpp
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
+msgstr "התו '%s' אינו יכול להיות התו הראשון במקטע חבילה."
#: platform/android/export/export.cpp
msgid "The package must have at least one '.' separator."
-msgstr ""
+msgstr "החבילה חייבת לכלול לפחות מפריד '.' אחד."
#: platform/android/export/export.cpp
msgid "Select device from the list"
@@ -12022,91 +12080,135 @@ msgstr "נא לבחור התקן מהרשימה"
#: platform/android/export/export.cpp
msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
+msgstr "קובץ ההפעלה של ADB לא נקבע בהגדרות העורך."
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr ""
+msgstr "OpenJDK jarsigner לא נקבע בהגדרות העורך."
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
-msgstr ""
+msgstr "מפתח לניפוי שגיאות לא נקבע בהגדרות העורך ולא בהגדרות הייצוא."
+
+#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "מפתח גירסת שיחרור נקבע באופן שגוי בהגדרות הייצוא."
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
+"בנייה מותאמת אישית דורשת נתיב חוקי של ערכת פיתוח לאנדרואיד בהגדרות העורך."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
msgstr ""
+"נתיב לא חוקי לערכת פיתוח אנדרואיד עבור בנייה מותאמת אישית בהגדרות העורך."
#: platform/android/export/export.cpp
msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
-msgstr ""
+msgstr "תבנית בנייה לאנדרואיד לא מותקנת בפרוייקט. ההתקנה היא מתפריט המיזם."
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
+msgstr "מפתח ציבורי לא חוקי להרחבת APK."
+
+#: platform/android/export/export.cpp
+msgid "Invalid package name:"
+msgstr "שם חבילה לא חוקי:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
msgstr ""
+"מודול \"GodotPaymentV3\" לא חוקי נמצא בהגדרת המיזם ב-\"אנדרואיד/מודולים"
+"\" (שינוי בגודו 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "חובה לאפשר ״שימוש בבניה מותאמת אישית״ כדי להשתמש בתוספים."
#: platform/android/export/export.cpp
#, fuzzy
-msgid "Invalid package name:"
-msgstr "שם שגוי."
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr "\"דרגות של חופש\" תקף רק כאשר \"מצב Xr\" הוא \"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+#, fuzzy
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr "\"Hand Tracking\" תקף רק כאשר \"מצב Xr\" הוא \"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+#, fuzzy
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr "\"Focus Awareness\" תקף רק כאשר \"מצב Xr\" הוא \"Oculus Mobile VR\"."
#: platform/android/export/export.cpp
msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
+"מנסה לבנות מתבנית מותאמת אישית, אך לא קיים מידע על גירסת הבניה. נא להתקין "
+"מחדש מתפריט 'Project'."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"Android build version mismatch:\n"
" Template installed: %s\n"
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
+"חוסר התאמה בגירסת אנדרואיד:\n"
+" תבנית הותקנה: %s\n"
+" גרסת גודו: %s\n"
+"נא להתקין מחדש את תבנית בניית אנדרואיד מתפריט 'Project'."
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "בניית מיזם אנדרואיד (gradle)"
#: platform/android/export/export.cpp
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"בניית מיזם אנדרואיד נכשלה, ניתן לבדוק את הפלט לאיתור השגיאה.\n"
+"לחלופין, קיים ב- docs.godotengine.org תיעוד לבניית אנדרואיד."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr ""
+msgstr "לא נוצר apk ב: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
-msgstr ""
+msgstr "מזהה חסר."
#: platform/iphone/export/export.cpp
msgid "The character '%s' is not allowed in Identifier."
-msgstr ""
+msgstr "התו '%s' אינו מותר במזהה."
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
-msgstr ""
+msgstr "לא צוין App Store Team ID - לא ניתן להגדיר את המיזם."
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "גודל הגופן שגוי."
+msgstr "מזהה לא חוקי:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
-msgstr ""
+msgstr "סמליל נדרש אינו מוגדר בהגדרות יצוא."
#: platform/javascript/export/export.cpp
msgid "Stop HTTP Server"
-msgstr ""
+msgstr "עצירת שרת HTTP"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -12141,74 +12243,74 @@ msgid "Using default boot splash image."
msgstr "נעשה שימוש בתמונת הפתיח כבררת מחדל."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package short name."
-msgstr "שם שגוי."
+msgstr "שם קצר של חבילה לא חוקי."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package unique name."
-msgstr "שם שגוי."
+msgstr "שם יחודי של חבילה לא חוקי."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "שם שגוי."
+msgstr "שם תצוגה של מפרסם החבילה לא חוקי."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid product GUID."
-msgstr "שם שגוי."
+msgstr "GUID מוצר לא חוקי."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid publisher GUID."
-msgstr "נתיב שגוי."
+msgstr "GUID מפרסם לא חוקי."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid background color."
-msgstr "שם שגוי."
+msgstr "צבע רקע לא חוקי."
#: platform/uwp/export/export.cpp
msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr ""
+msgstr "מידות תמונת לוגו חנות לא חוקיות (צריכות להיות 50x50)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr ""
+msgstr "מידות תמונת לוגו מרובעות 44x44 לא חוקיות (צריכות להיות 44x44)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr ""
+msgstr "מידות תמונת לוגו מרובעות 71x71 לא חוקיות (צריכות להיות 71x71)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
msgstr ""
+"מידות תמונת לוגו מרובעות בגודל 150x150 לא חוקיות (צריכות להיות 150x150)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
msgstr ""
+"מידות תמונת לוגו מרובעות בגודל 310x310 אינן חוקיות (צריכות להיות 310x310)."
#: platform/uwp/export/export.cpp
msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr ""
+msgstr "מידות תמונת לוגו רחבה 310x150 לא חוקיות (צריכות להיות 310x150)."
#: platform/uwp/export/export.cpp
msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr ""
+msgstr "מידות תמונת פתיח לא חוקיות (צריכות להיות 620x300)."
#: scene/2d/animated_sprite.cpp
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
+"יש ליצור או להגדיר משאב SpriteFrames במאפיין \"Frames\" כדי ש- "
+"AnimatedSprite יציג תמוניות."
#: scene/2d/canvas_modulate.cpp
msgid ""
"Only one visible CanvasModulate is allowed per scene (or set of instanced "
"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
+"מותר רק CanvasModulate גלוי אחד לכל סצנה (או סט מופעי סצינות). הראשון שנוצר "
+"יעבוד, ואילו השאר לא."
#: scene/2d/collision_object_2d.cpp
msgid ""
@@ -12216,6 +12318,9 @@ msgid ""
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
+"למפרק זה אין צורה ולכן הוא לא יכול להתנגש או לקיים אינטראקציה עם אובייקטים "
+"אחרים.\n"
+"הוספת CollisionShape2D או CollisionPolygon2D כילד תגדיר את צורתו."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -12223,6 +12328,9 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
+"CollisionPolygon2D משמש רק להספקת צורת התנגשות למפרק היורש מ-"
+"CollisionObject2D. השימוש בו הוא רק כילד של Area2D, StaticBody2D, "
+"RigidBody2D, KinematicBody2D וכו'."
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
@@ -12234,24 +12342,37 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
+"CollisionShape2D משמש רק להספקת צורת התנגשות למפרק היורש מ-"
+"CollisionObject2D. השימוש בו הוא רק כילד של Area2D, StaticBody2D, "
+"RigidBody2D, KinematicBody2D וכו'."
#: scene/2d/collision_shape_2d.cpp
msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
+msgstr "יש לספק צורה כדי ש-CollisionShape2D יתפקד. יש ליצור משאב צורה עבורו!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
msgstr ""
+"צורות מבוססות מצולע אינן מיועדות לשימוש או לעריכה ישירות דרך מפרק "
+"CollisionShape2D. במקום זאת יש להשתמש במפרק מסוג CollisionPolygon2D."
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"הנפשת CPUParticles2D מחייבת שימוש ב-CanvasItemMaterial עם \"הנפשת חלקיקים\" "
+"מאופשרת."
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
-msgstr ""
+msgstr "יש לספק טקסטורה בצורת האור למאפיין \"טקסטורה\"."
#: scene/2d/light_occluder_2d.cpp
msgid ""
@@ -12267,12 +12388,16 @@ msgid ""
"A NavigationPolygon resource must be set or created for this node to work. "
"Please set a property or draw a polygon."
msgstr ""
+"יש להגדיר או ליצור משאב NavigationPolygon כדי שמפרק זה יעבוד. נא לקבוע "
+"מאפיין או לצייר מצולע."
#: scene/2d/navigation_polygon.cpp
msgid ""
"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
"node. It only provides navigation data."
msgstr ""
+"NavigationPolygonInstance חייב להיות ילד או נכד למפרק Navigation2D. הוא מספק "
+"רק נתוני ניווט."
#: scene/2d/parallax_layer.cpp
msgid ""
@@ -12286,6 +12411,9 @@ msgid ""
"Use the CPUParticles2D node instead. You can use the \"Convert to "
"CPUParticles\" option for this purpose."
msgstr ""
+"חלקיקים מבוססי GPU אינם נתמכים על-ידי מנהל ווידאו GLES2.\n"
+"השתמש בצומת CPUParticles2D במקום. למטרה זו האפשרות \"המר לחלקיקים של CPU\" "
+"קיימת."
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
@@ -12298,6 +12426,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"הנפשת Particles2D מחייבת שימוש ב-CanvasItemMaterial עם \"הנפשת חלקיקים\" "
+"מאופשרת."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -12309,23 +12439,26 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"שינויים בגודל ל-RigidBody2D (במצבי character או rigid) יבוטלו על ידי מנוע "
+"הפיזיקה בזמן ריצה.\n"
+"במקום זאת יש לשנות את גודל צורות ההתנגשות של הצאצאים."
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
-msgstr ""
+msgstr "מאפיין הנתיב חייב להצביע על מפרק Node2D חוקי כדי לעבוד."
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "שרשרת Bone2D זו אמורה להסתיים במפרק Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr ""
+msgstr "Bone2D עובד רק עם Skeleton2D או Bone2D אחר כמפרק ההורה."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
-msgstr ""
+msgstr "לעצם זו אין תנוחת REST ראויה. עבור למפרק ה-Skeleton2D והגדר אחד."
#: scene/2d/tile_map.cpp
msgid ""
@@ -12333,48 +12466,49 @@ msgid ""
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
+"TileMap עם שימוש בהורה מאופשר זקוק להורה CollisionObject2D כדי לתת לו צורות. "
+"אנא השתמש בו כצאצא של Area2D, StaticBody2D, RigidBody2D, KinematicBody2D "
+"וכו' כדי לתת להם צורה."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
msgstr ""
+"VisibilityEnabler2D פועל בצורה הטובה ביותר בשימוש עם המפרק העליון בסצינה "
+"שנערכה כהורה."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr "ל־ARVRCamera חייב להיות מפרק ARVROrigin כהורה שלו"
+msgstr "ההורה של ARVRCamera חייב להיות מפרק ARVROrigin."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr "ל־ARVRCamera חייב להיות מפרק ARVROrigin כהורה שלו"
+msgstr "ההורה של ARVRController חייב להיות מפרק ARVROrigin."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
-msgstr ""
+msgstr "מזהה הבקר אינו יכול להיות 0 או שבקר זה לא יהיה מחובר לבקר האמיתי."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ל־ARVRCamera חייב להיות מפרק ARVROrigin כהורה שלו"
+msgstr "ההורה של ARVRAnchor חייב להיות מפרק ARVROrigin."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
-msgstr ""
+msgstr "מזהה העוגן אינו יכול להיות 0 או שעוגן זה לא יהיה מחובר לעוגן האמיתי."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROrigin דורש מפרק צאצא מסוג ARVRCamera"
+msgstr "ARVROrigin דורש צאצא מסוג ARVRCamera."
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
-msgstr ""
+msgstr "%d%%"
#: scene/3d/baked_lightmap.cpp
msgid "(Time Left: %d:%02d s)"
@@ -12382,19 +12516,19 @@ msgstr "(זמן שנותר: %d:%02d שנ׳)"
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Meshes: "
-msgstr ""
+msgstr "מדפיס רשתות: "
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Lights:"
-msgstr ""
+msgstr "מדפיס תאורות:"
#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
msgid "Finishing Plot"
-msgstr ""
+msgstr "מסיים הדפסה"
#: scene/3d/baked_lightmap.cpp
msgid "Lighting Meshes: "
-msgstr ""
+msgstr "רשתות תאורה: "
#: scene/3d/collision_object.cpp
msgid ""
@@ -12402,6 +12536,9 @@ msgid ""
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
+"למפרק זה אין צורה ולכן הוא לא יכול להתנגש או לקיים אינטראקציה עם אובייקטים "
+"אחרים.\n"
+"כדאי להוסיף CollisionShape2D או CollisionPolygon2D כצאצא כדי להגדיר צורה."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -12409,6 +12546,9 @@ msgid ""
"CollisionObject derived node. Please only use it as a child of Area, "
"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
+"CollisionPolygon2D משמש רק להספקת צורת התנגשות למפרק היורש מ-"
+"CollisionObject2D. השימוש בו הוא רק כצאצא של Area2D, StaticBody2D, "
+"RigidBody2D, KinematicBody2D וכו'."
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
@@ -12420,52 +12560,71 @@ msgid ""
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
"KinematicBody, etc. to give them a shape."
msgstr ""
+"CollisionShape משמש רק להספקת צורת התנגשות למפרק היורש מ-CollisionObject2D. "
+"השימוש בו הוא רק כצאצא של Area, StaticBody, RigidBody, KinematicBody וכו'."
#: scene/3d/collision_shape.cpp
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
-msgstr ""
+msgstr "יש לספק צורה כדי ש-CollisionShape יתפקד. יש ליצור משאב צורה עבורו."
#: scene/3d/collision_shape.cpp
msgid ""
"Plane shapes don't work well and will be removed in future versions. Please "
"don't use them."
msgstr ""
+"צורות מישוריות אינן פועלות היטב ויוסרו בגירסאות עתידיות. נא לא להשתמש בהן."
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr "ConcavePolygonShape לא תומך ב- RigidBody במצב שאינו סטטי."
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
+msgstr "שום דבר לא נראה כי לא הוקצאה רשת."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial whose "
"Billboard Mode is set to \"Particle Billboard\"."
msgstr ""
+"אנימציה של CPUParticles מחייבת שימוש ב-SpatialMaterial אשר מצב Billboard שלו "
+"מוגדר ל-\"Particle Billboard\"."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
-msgstr ""
+msgstr "הדפסת רשתות"
#: scene/3d/gi_probe.cpp
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
+"מנהל הווידאו GLES2 אינו תומך ב- GIProbes.\n"
+"השתמש ב-BakedLightmap במקום."
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr ""
+msgstr "SpotLight עם זווית רחבה מ-90 מעלות אינו יכול להטיל צללים."
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
-msgstr ""
+msgstr "יש להגדיר או ליצור משאב NavigationMesh כדי שצומת זה יפעל."
#: scene/3d/navigation_mesh.cpp
msgid ""
"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
"It only provides navigation data."
msgstr ""
+"NavigationMeshInstance חייב להיות ילד או נכד למפרק Navigation. הוא מספק רק "
+"נתוני ניווט."
#: scene/3d/particles.cpp
msgid ""
@@ -12473,28 +12632,34 @@ msgid ""
"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
"\" option for this purpose."
msgstr ""
+"חלקיקים מבוססי GPU אינם נתמכים על-ידי מנהל ווידאו GLES2.\n"
+"השתמש בצומת CPUParticles במקום. למטרה זו האפשרות \"המר לחלקיקים של CPU\" "
+"קיימת."
#: scene/3d/particles.cpp
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr ""
+msgstr "שום דבר אינו גלוי כי רשתות לא הוקצו למעברי ההדפסה."
#: scene/3d/particles.cpp
msgid ""
"Particles animation requires the usage of a SpatialMaterial whose Billboard "
"Mode is set to \"Particle Billboard\"."
msgstr ""
+"אנימציה של חלקיקים מחייבת שימוש ב-SpatialMaterial אשר מצב Billboard שלו "
+"מוגדר ל-\"Particle Billboard\"."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D עובד רק כאשר הוא מוגדר כצאצא של מפרק Path2D."
+msgstr "PathFollow עובד רק כאשר הוא מוגדר כצאצא של מפרק Path."
#: scene/3d/path.cpp
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
+"ROTATION_ORIENTED של PathFollow דורש הפעלה של \"Up Vector\" במשאב העקומה של "
+"Path בהורה שלו."
#: scene/3d/physics_body.cpp
msgid ""
@@ -12502,16 +12667,21 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"שינויים בגודל ל-RigidBody (במצבי character או rigid) יבוטלו על ידי מנוע "
+"הפיזיקה בזמן ריצה.\n"
+"במקום זאת יש לשנות את גודל צורות ההתנגשות של הצאצאים."
#: scene/3d/remote_transform.cpp
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
+"המאפיין \"Remote Path\" חייב להפנות למפרק חוקי מסוג Spatial או יורש ממנו כדי "
+"לעבוד."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
-msgstr ""
+msgstr "תהיה התעלמות מגוף זה עד שתקבע רשת."
#: scene/3d/soft_body.cpp
msgid ""
@@ -12519,77 +12689,85 @@ msgid ""
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"שינויים בגודל ל-SoftBody יבוטלו על ידי מנוע הפיזיקה בזמן ריצה.\n"
+"במקום זאת יש לשנות את גודל צורות ההתנגשות של הצאצאים."
#: scene/3d/sprite_3d.cpp
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
msgstr ""
+"יש ליצור או להגדיר משאב SpriteFrames במאפיין \"Frames\" כדי ש-"
+"AnimatedSprite3D יציג תמוניות."
#: scene/3d/vehicle_body.cpp
msgid ""
"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
"it as a child of a VehicleBody."
msgstr ""
+"VehicleWheel משמש להספקת מערכת גלגלים ל-VehicleBody. יש להשתמש בו כצאצא של "
+"VehicleBody."
#: scene/3d/world_environment.cpp
msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"WorldEnvironment דורש שמאפיין \"Environment\" שלו יכיל סביבה כדי שתהיה השפעה "
+"גלויה."
#: scene/3d/world_environment.cpp
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
-msgstr ""
+msgstr "רק WorldEnvironment אחד מותר לכל סצנה (או קבוצה של מופעי סצנות)."
#: scene/3d/world_environment.cpp
msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"ה-WorldEnvironment הזה לא פעיל. הוסף מצלמה (לסצנות תלת ממדיות) או הגדר את "
+"מצב הרקע של סביבה זו ל-Canvas (לסצינות דו-ממדיות)."
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "במפרק 'BlendTree '%s, הנפשה לא נמצאה: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "משך ההנפשה (בשניות)."
+msgstr "הנפשה לא נמצאה: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "בצומת '%s', הנפשה לא חוקית: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "גודל הגופן שגוי."
+msgstr "הנפשה לא חוקית: '%s'."
#: scene/animation/animation_tree.cpp
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr ""
+msgstr "שום דבר לא מחובר לקלט '%s' של צומת '%s'."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
-msgstr ""
+msgstr "לא נקבע שורש AnimationNode עבור הגרף."
#: scene/animation/animation_tree.cpp
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr ""
+msgstr "לא נקבע נתיב למפרק AnimationPlayer המכיל הנפשות."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
-msgstr ""
+msgstr "הנתיב שהוגדר ל-AnimationPlayer אינו מוביל למפרק AnimationPlayer."
#: scene/animation/animation_tree.cpp
msgid "The AnimationPlayer root node is not a valid node."
-msgstr ""
+msgstr "המפרק AnimationPlayer העליון אינו צומת חוקי."
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
-msgstr ""
+msgstr "מפרק זה הוצא משימוש. יש להשתמש ב-AnimationTree במקום."
#: scene/gui/color_picker.cpp
msgid ""
@@ -12597,27 +12775,29 @@ msgid ""
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"צבע: #%s\n"
+"לחצן עכבר שמאלי: קביעת צבע\n"
+"לחצן עכבר ימני: הסרת צבע שמור"
#: scene/gui/color_picker.cpp
msgid "Pick a color from the editor window."
-msgstr ""
+msgstr "בחירת צבע מחלון העורך."
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
msgid "Raw"
-msgstr ""
+msgstr "Raw"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
-msgstr ""
+msgstr "מעבר בין ערכים הקסדצימלים לערכי קוד."
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "הוספת הצבע הנוכחי כערכה"
+msgstr "הוספת הצבע הנוכחי לערכת הצבעים."
#: scene/gui/container.cpp
msgid ""
@@ -12625,20 +12805,24 @@ msgid ""
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
+"המיכל בפני עצמו אינו משרת מטרה אלא אם כן סקריפט מגדיר את המיקום של צאצאיו.\n"
+"אם אין כוונה להוסיף סקריפט, יש להוסיף במקום זאת מפרק בקרה פשוט."
#: scene/gui/control.cpp
msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"ה-Hint Tooltip לא יוצג כאשר מסנן העכבר של הבקר נקבע כ-\"Ignore\". כדי לפתור "
+"זאת, יש להגדיר את מסנן העכבר ל-\"Stop\" או \"Pass\"."
#: scene/gui/dialogs.cpp
msgid "Alert!"
-msgstr ""
+msgstr "אזהרה!"
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
-msgstr "נא לאמת…"
+msgstr "נא לאשר…"
#: scene/gui/popup.cpp
msgid ""
@@ -12646,10 +12830,12 @@ msgid ""
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
+"חלונות קופצים מוסתרים כברירת מחדל אלא אם תהיה קריאה ל-popup() או לאחת "
+"מפונקציות popup*(). החלונות יוצגו בזמן עריכה, אך יוסתרו בזמן ריצה."
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr ""
+msgstr "אם \"Exp Edit\" מאופשר, \"Min Value\" חייב להיות גדול מ-0."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -12657,6 +12843,9 @@ msgid ""
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
+"ScrollContainer מיועד לעבודה עם בקר צאצא יחיד.\n"
+"יש להשתמש במיכל כצאצא (VBox, HBox וכו'), או בבקר ולקבוע את הגודל המינימלי "
+"המותאם אישית באופן ידני."
#: scene/gui/tree.cpp
msgid "(Other)"
@@ -12667,6 +12856,8 @@ msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
+"לא היתה אפשרות לטעון את הסביבה שנקבעה כברירת המחדל בהגדרות המיזם (Rendering -"
+"> Environment -> Default Environment)."
#: scene/main/viewport.cpp
msgid ""
@@ -12675,37 +12866,70 @@ msgid ""
"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
"texture to some node for display."
msgstr ""
+"חלון תצוגה זה אינו מוגדר כיעד עיבוד. להצגת התוכן ישירות למסך, יש להפוך אותו "
+"לצאצא של בקר כדי שיקבל גודל. או להפוך אותו ל-RenderTarget ולשייך את המרקם "
+"הפנימי שלו למפרק כלשהו לתצוגה."
+
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "גודל חלון התצוגה חייב להיות גדול מ-0 על מנת להציג משהו."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "גודל הגופן שגוי."
+msgstr "מקור לא תקין לתצוגה מקדימה."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "גודל הגופן שגוי."
+msgstr "מקור לא תקין ל-shader."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "גודל הגופן שגוי."
+msgstr "פונקציית השוואה לא חוקית לסוג זה."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "השמה לפונקציה."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "השמה ל-uniform."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "ניתן להקצות שינויים רק בפונקצית vertex."
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "אי אפשר לשנות קבועים."
+
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "מערכת קבצים"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "בעת ייצוא או הטמעה, קובץ ההפעלה ינסה להתחבר לכתובת ה־IP של המחשב הזה "
+#~ "לצורך ניפוי שגיאות."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "הסצנה הנוכחית מעולם לא נשמרה, נא לשמור אותה בטרם ההרצה."
+
+#~ msgid "Not in resource path."
+#~ msgstr "לא בנתיב המשאב."
+
+#~ msgid "Revert"
+#~ msgstr "שחזור"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "לא ניתן לבטל פעולה זו. לשחזר בכל זאת?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "שחזור סצנה"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "עוקב תקלות"
#~ msgid "enum "
#~ msgstr "מונה "
diff --git a/editor/translations/hi.po b/editor/translations/hi.po
index 424a9a6bc1..3c8f54033a 100644
--- a/editor/translations/hi.po
+++ b/editor/translations/hi.po
@@ -3,18 +3,20 @@
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
# Abhas Kumar Sinha <abhaskumarsinha@gmail.com>, 2017.
-# Suryansh5545 <suryanshpathak5545@gmail.com>, 2018.
+# Suryansh5545 <suryanshpathak5545@gmail.com>, 2018, 2020.
# Vikram1323 <vikram1323@gmail.com>, 2018.
# vkubre <v@kubre.in>, 2019.
# Abhay Patel <abhay111patel@gmail.com>, 2019.
# Lakshmi-Jayakumar <lakshmi.jayakumar.tkm@gmail.com>, 2019.
# Devashishsingh98 <devashishsingh98@gmail.com>, 2019.
+# Shirious <sad3119823@gmail.com>, 2020.
+# Abhay Patel <Traumaticbean@protonmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-11-01 19:50+0000\n"
-"Last-Translator: Devashishsingh98 <devashishsingh98@gmail.com>\n"
+"PO-Revision-Date: 2020-04-24 06:48+0000\n"
+"Last-Translator: Shirious <sad3119823@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot/"
"hi/>\n"
"Language: hi\n"
@@ -22,7 +24,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 3.10-dev\n"
+"X-Generator: Weblate 4.0.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -31,17 +33,17 @@ msgstr "कन्वर्ट करने के लिए अमान्य
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "स्ट्रिंग की लंबाई 1 (1 अक्षर) अपेक्षित है."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "डीकोडिंग बाइट्स, या अमान्य प्रारूप के लिए पर्याप्त बाइट्स नहीं है।"
+msgstr "अमान्य फ़ोर्मैट, या बाइट्स डिकोडिंग के लिए पर्याप्त बाइट्स नहीं।"
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "अभिव्यक्ति में अमान्य इनपुट %i (पारित नहीं)"
+msgstr "एक्सप्रेशन मे अमान्य इनपुट %i (पास नहीं हो पाया)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -105,7 +107,7 @@ msgstr "संतुलित"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr "प्रतिमा"
+msgstr "आइना"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -164,39 +166,33 @@ msgid "Anim Change Call"
msgstr "एनीमेशन परिवर्तन बुलावा"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "एनीमेशन परिवर्तन निधि"
+msgstr "अनीम मल्टी चेंज कीफ्रेम टाइम"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "एनीमेशन परिवर्तन बुलावा"
+msgstr "अनीम मल्टी चेंज ट्रांजिशन"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "एनीमेशन परिवर्तन परिणत"
+msgstr "अनीम मल्टी चेंज ट्रांसफॉर्म"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "एनीमेशन मुख्य-फ़्रेम मूल्य(Value) बदलें"
+msgstr "अनीम मल्टी चेंज कीफ्रेम वैल्यू"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "एनीमेशन परिवर्तन बुलावा"
+msgstr "अनीम मल्टी चेंज कॉल"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "शब्द बदलें मूल्य"
+msgstr "एनिमेशन लंबाई बदलें"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "एनिमेशन लूप बदलें"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -223,17 +219,14 @@ msgid "Animation Playback Track"
msgstr "एनिमेशन प्लेबैक ट्रैक"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (frames)"
-msgstr "ऐनिमेशन लंबाई समय (सेकंड्स)"
+msgstr "एनीमेशन लंबाई (फ्रेम)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
-msgstr "ऐनिमेशन लंबाई समय (सेकंड्स)"
+msgstr "एनिमेशन लंबाई (सेकंड)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
msgstr "ट्रैक जोड़ें"
@@ -248,122 +241,117 @@ msgstr "कार्यों:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "ऑडियो क्लिप्स:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "अनीम क्लिप्स:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr ""
+msgstr "ट्रैक पथ बदलें"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "इस ट्रैक को ऑन/ऑफ पर टॉगल करें ।"
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "अपडेट मोड (यह संपत्ति कैसे सेट की जाती है)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr ""
+msgstr "इंटरपोलेशन मोड"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "लूप रैप मोड (लूप पर शुरुआत के साथ इंटरपोलेट अंत)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
-msgstr ""
+msgstr "इस ट्रैक को हटा दें।"
#: editor/animation_track_editor.cpp
msgid "Time (s): "
-msgstr ""
+msgstr "समय (एस): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "टॉगल ट्रैक सक्षम"
#: editor/animation_track_editor.cpp
msgid "Continuous"
-msgstr ""
+msgstr "सतत"
#: editor/animation_track_editor.cpp
msgid "Discrete"
-msgstr ""
+msgstr "असतत"
#: editor/animation_track_editor.cpp
msgid "Trigger"
-msgstr ""
+msgstr "ट्रिगर"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "पकड़ना"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "निकटतम"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
msgid "Linear"
-msgstr ""
+msgstr "रैखिक"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "घन"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "क्लैंप लूप इंटरप"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "रैप लूप इंटरप"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "कुंजी डालें"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "प्रतिलिपि"
+msgstr "डुप्लीकेट कुंजी (ओं)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "एनीमेशन को हटाने के लिए कुंजी"
+msgstr "कुंजी को हटाएं"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
-msgstr "शब्द बदलें मूल्य"
+msgstr "एनिमेशन अपडेट मोड बदलें"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "शब्द बदलें मूल्य"
+msgstr "एनिमेशन इंटरपोलेशन मोड बदलें"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "एनिमेशन लूप"
+msgstr "एनिमेशन लूप मोड बदलें"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr ""
+msgstr "अनीम ट्रैक निकालें"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr ""
+msgstr "% एस के लिए नया ट्रैक बनाएं और कुंजी डालें?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr ""
+msgstr "% D नए ट्रैक बनाएं और कुंजियाँ डालें?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -375,40 +363,39 @@ msgstr ""
#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Create"
-msgstr ""
+msgstr "बनाना"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr ""
+msgstr "अनीम डालें"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "एनिमेशनप्लेयर खुद को चेतन नहीं कर सकता, केवल अन्य खिलाड़ी।"
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr ""
+msgstr "अनीम बनाएं और डालें"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr ""
+msgstr "अनीम डालें ट्रैक और कुंजी"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr ""
+msgstr "अनीम डालें कुंजी"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "शब्दकोश कुंजी बदलें"
+msgstr "एनिमेशन स्टेप बदलें"
#: editor/animation_track_editor.cpp
msgid "Rearrange Tracks"
-msgstr ""
+msgstr "पटरियों को पुनर्व्यवस्थित करें"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "पटरियों को बदलने केवल स्थानिक आधारित नोड्स पर लागू होते हैं।"
#: editor/animation_track_editor.cpp
msgid ""
@@ -417,79 +404,79 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"ऑडियो ट्रैक केवल प्रकार के नोड्स को इंगित कर सकते हैं:\n"
+"-ऑडियोस्ट्रीमप्लेयर\n"
+"-ऑडियोस्ट्रीमप्लेयर2डी\n"
+"-ऑडियोस्ट्रीमप्लेयर3डी"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "एनिमेशन ट्रैक केवल एनिमेशनप्लेयर नोड्स को इंगित कर सकते हैं।"
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "एक एनीमेशन खिलाड़ी खुद को चेतन नहीं कर सकता, केवल अन्य खिलाड़ी।"
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "रूट के बिना नया ट्रैक जोड़ना संभव नहीं"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "बेजियर के लिए अमान्य ट्रैक (कोई उपयुक्त उप-गुण नहीं)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "ट्रैक जोड़ें"
+msgstr "बेज़ियर ट्रैक जोड़ें"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "ट्रैक पथ अमान्य है, इसलिए एक कुंजी नहीं जोड़ सकते हैं।"
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "ट्रैक प्रकार का नहीं है, स्थानिक नहीं डाला जा सकता है"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "3 डी ट्रैक रूपांतरण"
+msgstr "ट्रांसफ़ॉर्म ट्रैक कुंजी जोड़ें"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "ट्रैक जोड़ें"
+msgstr "ट्रैक कुंजी जोड़ें"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "ट्रैक पथ अमान्य है, इसलिए एक विधि कुंजी नहीं जोड़ सकते हैं।"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "कॉल मेथड ट्रैक"
+msgstr "विधि ट्रैक कुंजी जोड़ें"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr ""
+msgstr "ऑब्जेक्ट में नहीं पाया गया विधि: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr ""
+msgstr "ऐनिमेटेड मूव कीज़"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr ""
+msgstr "क्लिपबोर्ड खाली है"
#: editor/animation_track_editor.cpp
msgid "Paste Tracks"
-msgstr ""
+msgstr "पेस्ट ट्रैक"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr ""
+msgstr "एनिमेटेड स्केल कुंजी"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "यह विकल्प बेज़ियर संपादन के लिए काम नहीं करता है, क्योंकि यह केवल एक ही ट्रैक है।"
#: editor/animation_track_editor.cpp
msgid ""
@@ -503,38 +490,47 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"यह एनीमेशन एक आयातित दृश्य से संबंधित है, इसलिए आयातित पटरियों में परिवर्तन नहीं सहेजे "
+"जाएंगे।\n"
+"\n"
+"कस्टम ट्रैक जोड़ने की क्षमता को सक्षम करने के लिए, दृश्य की आयात सेटिंग्स और सेट पर नेविगेट "
+"करें\n"
+"\"एनिमेशन > स्टोरेज\" से \"फाइल्स\", \"एनिमेशन > कस्टम ट्रैक रखें\", फिर री-इम्पोर्ट करें।\n"
+"वैकल्पिक रूप से, एक आयात पूर्व निर्धारित का उपयोग करें जो फ़ाइलों को अलग करने के लिए "
+"एनिमेशन आयात करता है।"
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "चेतावनी: आयातित एनीमेशन संपादन"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr ""
+msgstr "एनिमेशन बनाने और संपादित करने के लिए एनिमेशनप्लेयर नोड का चयन करें।"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "केवल पेड़ में चयनित नोड्स से पटरियों को दिखाएं।"
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "समूह द्वारा पटरियों नोड या प्रदर्शन के रूप में उन्हें सादे सूची."
#: editor/animation_track_editor.cpp
msgid "Snap:"
-msgstr ""
+msgstr "आकस्मिक:"
#: editor/animation_track_editor.cpp
msgid "Animation step value."
-msgstr ""
+msgstr "एनीमेशन स्टेप वैल्यू।"
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "सेकंड"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr ""
+msgstr "एफपीएस"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -544,109 +540,107 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/property_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit"
-msgstr ""
+msgstr "संपादित"
#: editor/animation_track_editor.cpp
msgid "Animation properties."
-msgstr ""
+msgstr "एनिमेशन गुण।"
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr ""
+msgstr "कॉपी ट्रैक"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
-msgstr ""
+msgstr "स्केल चयन"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
-msgstr ""
+msgstr "कर्सर से स्केल"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Selection"
-msgstr "डुप्लिकेट चयन"
+msgstr "डुप्लीकेट चयन"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr ""
+msgstr "डुप्लीकेट ट्रांसपेश"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "डुप्लिकेट चयन"
+msgstr "चयन हटाएं"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
-msgstr ""
+msgstr "अगले चरण में जाएं"
#: editor/animation_track_editor.cpp
msgid "Go to Previous Step"
-msgstr ""
+msgstr "पिछले चरण में जाएं"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr ""
+msgstr "एनिमेशन का अनुकूलन"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr ""
+msgstr "क्लीन-अप एनीमेशन"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "एनिमेटेड हो जाएगा कि नोड उठाओ:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "बेज़ियर कर्व्स का प्रयोग करें"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr ""
+msgstr "Anim. अनुकूलक"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr ""
+msgstr "अधिकतम. रैखिक त्रुटि:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr ""
+msgstr "अधिकतम. कोणीय त्रुटि:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
-msgstr ""
+msgstr "मैक्स ऑप्टिमाइज़ेबल एंगल:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
-msgstr ""
+msgstr "ऑप्टिमाइज़"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr ""
+msgstr "अमान्य चाबियां निकालें"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr ""
+msgstr "अनसुलझे और खाली पटरियों को हटादें"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
-msgstr ""
+msgstr "सभी एनिमेशन को साफ-सुथरा करें"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr ""
+msgstr "क्लीन-अप एनीमेशन (एस) (कोई पूर्ववत!)"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
-msgstr ""
+msgstr "साफ - सफाई"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr ""
+msgstr "स्केल अनुपात:"
#: editor/animation_track_editor.cpp
msgid "Select Tracks to Copy"
-msgstr ""
+msgstr "कॉपी करने के लिए ट्रैक का चयन करें"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -655,87 +649,84 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr ""
+msgstr "कॉपी"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "डुप्लिकेट चयन"
+msgstr "सभी का चयन करें/"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "ट्रैक जोड़ें"
+msgstr "ऑडियो ट्रैक क्लिप जोड़ें"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "ऑडियो ट्रैक क्लिप को बदलें ऑफसेट शुरू करें"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "ऑडियो ट्रैक क्लिप एंड ऑफसेट बदलें"
#: editor/array_property_edit.cpp
msgid "Resize Array"
-msgstr ""
+msgstr "Array को बड़ा या छोटा करना"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr ""
+msgstr "व्यूह मूल्य प्रकार बदलें"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
-msgstr ""
+msgstr "व्यूह मूल्य बदलें"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr ""
+msgstr "लाइन पर जाएं"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr ""
+msgstr "लाइन क्र.:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+msgid "%d replaced."
+msgstr "%d बदले."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "% d मिल गया।"
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "एक जैसा:"
+msgstr "%d मिल गया।"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
-msgstr ""
+msgstr "पूंजीकरण मेल करे"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr ""
+msgstr "पूरे शब्द"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr ""
+msgstr "बदले"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr ""
+msgstr "सबको बदली करें"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr ""
+msgstr "सिर्फ चयन किये हुए"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "मानक"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "टॉगल स्क्रिप्ट पैनल"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -755,50 +746,48 @@ msgstr "रीसेट आकार"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "चेतावनियाँ"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "पंक्ति और क़तार क्र.।"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "लक्ष्य नोड में विधि निर्दिष्ट किया जाना चाहिए!"
+msgstr "Method को target node में निर्दिष्ट कीजिए."
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Method को target node में निर्दिष्ट कीजिए."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
-msgstr ""
-"लक्ष्य विधि नहीं मिला! एक वैध विधि निर्दिष्ट करें या नोड को लक्षित करने के लिए एक "
-"स्क्रिप्ट संलग्न करें।"
+msgstr "target node नहीं मिला। method उल्लिखित करें या script जोड़िये।"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "जुडिये"
+msgstr "Node से कनेक्ट करें:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "कनेक्ट करने के लिए संकेत:"
+msgstr "Script से कनेक्ट:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "कनेक्ट करने के लिए संकेत:"
+msgstr "Signal से:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "Scene में कोई script नहीं पाई गयी।"
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr "जोड़ें"
+msgstr "जोड़िये"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
@@ -809,27 +798,25 @@ msgstr "जोड़ें"
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr "मिटाना"
+msgstr "मिटाइये"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr ""
+msgstr "अतिरिक्त Call Argument अपेक्षित है:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr ""
+msgstr "अतिरिक्त Call Arguments:"
#: editor/connections_dialog.cpp
msgid "Receiver Method:"
-msgstr ""
+msgstr "पानेवाली Method:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "संतुलित"
+msgstr "अग्रवर्ती"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Deferred"
msgstr "स्थगित"
@@ -837,25 +824,25 @@ msgstr "स्थगित"
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
msgstr ""
+"इशारा को स्थगित कर देता है, इसे एक कतार में संग्रहित करता है और केवल निष्क्रिय समय पर इसे "
+"फायरिंग करता है।"
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr ""
+msgstr "एक बार"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "इसके पहले उत्सर्जन के बाद सिग्नल को डिस्कनेक्ट करें"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "कनेक्ट करने के लिए संकेत:"
+msgstr "इशारा कनेक्ट नहीं कर सकते"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -867,87 +854,82 @@ msgid "Close"
msgstr "बंद करे"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect"
-msgstr "जुडिये"
+msgstr "जोड़िये"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "संकेत"
+msgstr "इशारा:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect '%s' to '%s'"
-msgstr "जुडिये '%s' to '%s'"
+msgstr "'%' को '%' से कनेक्ट करें"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect '%s' from '%s'"
-msgstr "जुडिये '%s' to '%s'"
+msgstr "'%' से '%' को डिस्कनेक्ट करें"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "जुडिये '%s' to '%s'"
+msgstr "सभी इशारो से डिस्कनेक्ट करें: '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect..."
-msgstr "जुडिये..."
+msgstr "जोड़ना..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr "डिस्कनेक्ट"
+msgstr "विलगन"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "कनेक्ट करने के लिए संकेत:"
+msgstr "method इशारे से जोड़िए"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "परिवर्तन वक्र चयन"
+msgstr "कनेक्शन संपादित करें:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr ""
+msgstr "क्या आपसुनिश्चित हैं कि आप \"% एस\" सिग्नल से सभी कनेक्शन हटाना चाहते हैं?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "संकेत"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "फ़िल्टर फ़ाइलें..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "क्या आप सुनिश्चित हैं कि आप इस सिग्नल से सभी कनेक्शन हटाना चाहते हैं?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "डिस्कनेक्ट"
+msgstr "सभी को डिस्कनेक्ट करें"
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr ""
+msgstr "संपादित करें..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
-msgstr ""
+msgstr "मेथड पे जाये"
#: editor/create_dialog.cpp
msgid "Change %s Type"
-msgstr ""
+msgstr "%s का टाइप बदले"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
msgid "Change"
-msgstr ""
+msgstr "बदली"
#: editor/create_dialog.cpp
-#, fuzzy
msgid "Create New %s"
-msgstr "एक नया बनाएं"
+msgstr "नया%s बनाएं"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
@@ -959,11 +941,10 @@ msgid "Recent:"
msgstr "हाल ही में किया:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search:"
-msgstr "खोज कर:"
+msgstr "खोज:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
@@ -984,33 +965,29 @@ msgid "Search Replacement For:"
msgstr "इसके लिए खोजी प्रतिस्थापन:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Dependencies For:"
-msgstr "के लिए निर्भरता:"
+msgstr "निर्भरता के लिए:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"दृश्य '%s' वर्तमान में संपादित किया जा रहा है।\n"
-"परिवर्तन तब तक प्रभावी नहीं होंगे जब तक कि पुनः लोड नहीं किए जाएंगे।"
+"दृश्य '%' वर्तमान में संपादित किया जा रहा है।\n"
+"परिवर्तन केवल तभी प्रभावी होंगे जब रीलोड किया जाएगा।"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"संसाधन '%s' उपयोग में है\n"
-"पुनः लोड होने पर परिवर्तन प्रभावी होंगे।"
+"संसाधन '%' उपयोग में है।\n"
+"परिवर्तन केवल तभी प्रभावी होंगे जब रीलोड किया जाएगा।"
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Dependencies"
-msgstr "निर्भरता"
+msgstr "निर्भरताएँ"
#: editor/dependency_editor.cpp
msgid "Resource"
@@ -1026,9 +1003,8 @@ msgid "Dependencies:"
msgstr "निर्भरता:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Fix Broken"
-msgstr "टूटी सही कर देंगे?"
+msgstr "टूटा ठीक करें"
#: editor/dependency_editor.cpp
msgid "Dependency Editor"
@@ -1053,9 +1029,8 @@ msgid "Owners Of:"
msgstr "के स्वामी:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "परियोजना से चयनित फ़ाइलें निकालें? (कोई पूर्ववत नहीं)"
+msgstr "परियोजना से चयनित फ़ाइलों को हटा दें? (बहाल नहीं किया जा सकता है)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1067,18 +1042,16 @@ msgstr ""
"वैसे भी उन्हें निकालें? (कोई पूर्ववत नहीं)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Cannot remove:"
-msgstr "निकाला नहीं जा सकता:\n"
+msgstr "नहीं हटा सकते:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
msgstr "लोड होने मे त्रुटि:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "लापता निर्भरताओं के कारण दृश्य लोड करने में विफल रहे:"
+msgstr "गायब निर्भरता के कारण लोड विफल रहा:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1101,14 +1074,12 @@ msgid "Permanently delete %d item(s)? (No undo!)"
msgstr "%d आइटम को स्थायी रूप से हटाएं? (नहीं पूर्ववत करें!)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "निर्भरता"
+msgstr "निर्भरता दिखाएं"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Orphan Resource Explorer"
-msgstr "Orphan Resource Explorer"
+msgstr "अनाथ संसाधन एक्सप्लोरर"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -1150,10 +1121,12 @@ msgstr "परियोजना के संस्थापक"
msgid "Lead Developer"
msgstr "प्रमुख डेवलपर"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Manager "
-msgstr "प्रोजेक्ट मैनेजर"
+msgstr "परियोजना प्रबंधक "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1172,6 +1145,16 @@ msgid "Gold Sponsors"
msgstr "गोल्ड प्रायोजक"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "रजत दाताओं"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "कांस्य दाताओं"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "मिनी प्रायोजक"
@@ -1196,21 +1179,19 @@ msgid "License"
msgstr "लाइसेंस"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
-msgstr "Thirdparty License"
+msgstr "थर्ड पार्टी लाइसेंस"
#: editor/editor_about.cpp
-#, fuzzy
msgid ""
"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
-"गोडोट इंजन तीसरे पक्ष के स्वतंत्र और खुले स्रोत पुस्तकालयों पर निर्भर करता है, जो कि इसके "
-"एमआईटी लाइसेंस की शर्तों के साथ संगत है। निम्नलिखित ऐसे सभी तृतीय पक्ष घटकों की एक विस्तृत "
-"सूची है जो उनके संबंधित कॉपीराइट कथन और लाइसेंस शर्तों के साथ हैं।"
+"गोडोट इंजन अपने MIT लाइसेंस की शर्तों के साथ सभी तृतीय-पक्ष मुक्त और मुक्त स्रोत पुस्तकालयों "
+"पर निर्भर करता है। निम्नलिखित ऐसे सभी तृतीय-पक्ष घटकों की एक विस्तृत सूची है, जिनके "
+"संबंधित कॉपीराइट स्टेटमेंट और लाइसेंस शर्तें हैं।"
#: editor/editor_about.cpp
msgid "All Components"
@@ -1221,18 +1202,16 @@ msgid "Components"
msgstr "अवयव"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Licenses"
-msgstr "Licenses"
+msgstr "लाइसेंस"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Error opening package file, not in ZIP format."
-msgstr "पैकेज फ़ाइल खोलने में त्रुटि, zip प्रारूप में नहीं |"
+msgstr "ज़िप फ़ाइल खोलने में त्रुटि, प्रारूप में नहीं।"
#: editor/editor_asset_installer.cpp
msgid "%s (Already Exists)"
-msgstr ""
+msgstr "%s (पहले से मौजूद है)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1240,16 +1219,15 @@ msgstr "असंपीड़ित संपत्तियां"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "निम्न फ़ाइलों का निस्सारण नहीं हो पाया:"
#: editor/editor_asset_installer.cpp
msgid "And %s more files."
-msgstr ""
+msgstr "और %s फ़ाइलें."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Package installed successfully!"
-msgstr "पैकेज सफलतापूर्वक स्थापित किया गया!"
+msgstr "पैकेज सफलतापूर्वक स्थापित!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1257,18 +1235,16 @@ msgid "Success!"
msgstr "सफलता!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "Package Installer"
+msgstr "पैकेज में है:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
msgstr "इंस्टॉल"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Installer"
-msgstr "Package Installer"
+msgstr "पैकेज इंस्टॉलर"
#: editor/editor_audio_buses.cpp
msgid "Speakers"
@@ -1283,9 +1259,8 @@ msgid "Rename Audio Bus"
msgstr "ऑडियो बस का नाम बदलें"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Change Audio Bus Volume"
-msgstr "ऑडियो बस सोलो टॉगल करें"
+msgstr "ऑडियो बस वॉल्यूम बदलें"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
@@ -1300,7 +1275,6 @@ msgid "Toggle Audio Bus Bypass Effects"
msgstr "ऑडियो बस बायपास प्रभाव टॉगल करें"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Select Audio Bus Send"
msgstr "ऑडियो बस भेजें का चयन करें"
@@ -1313,21 +1287,18 @@ msgid "Move Bus Effect"
msgstr "बस प्रभाव हटो"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Delete Bus Effect"
-msgstr "बस प्रभाव हटाना"
+msgstr "बस प्रभाव हटाएं"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Drag & drop to rearrange."
-msgstr "पुन: व्यवस्थित करने के लिए ऑडियो बस, खींचें और ड्रॉप |"
+msgstr "पुनर्व्यवस्थित करने के लिए खींचें और छोड़ दें।"
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr ""
+msgstr "सोलो"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Mute"
msgstr "मूक"
@@ -1350,266 +1321,264 @@ msgstr "वॉल्यूम रीसेट करें"
#: editor/editor_audio_buses.cpp
msgid "Delete Effect"
-msgstr ""
+msgstr "इफेक्ट मिटाइये"
#: editor/editor_audio_buses.cpp
msgid "Audio"
-msgstr ""
+msgstr "ऑडियो"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
-msgstr ""
+msgstr "ऑडियो बस ऐड कीजिए"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr ""
+msgstr "मास्टर बस नहीं मिटा सकते!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr ""
+msgstr "ऑडियो बस मिटाइये"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
-msgstr ""
+msgstr "ऑडियो बस दुगुना करे"
#: editor/editor_audio_buses.cpp
msgid "Reset Bus Volume"
-msgstr ""
+msgstr "बस की ध्वनि मात्रा पूर्वरूप करे"
#: editor/editor_audio_buses.cpp
msgid "Move Audio Bus"
-msgstr ""
+msgstr "ऑडियो बस हटाइये"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
-msgstr ""
+msgstr "ऑडियो बस लेआउट इस तरह बचा के रखिये..."
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
-msgstr ""
+msgstr "नए लेआउट के लिए स्थान..."
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
-msgstr ""
+msgstr "ऑडियो बस लेआउट खोलिये"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "कोई '%s' फ़ाइल नहीं."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
-msgstr ""
+msgstr "लेआउट"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr ""
+msgstr "अमान्य फ़ाइल, ऑडियो बस लेआउट."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "लोड हो रहा है त्रुटियाँ!"
+msgstr "फ़ाइल बचाने में चूक: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr ""
+msgstr "बस ऐड कीजिए"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
-msgstr ""
+msgstr "लेआउट में नई ऑडियो बस ऐड कीजिए."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Load"
-msgstr ""
+msgstr "लोड कीजिये"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr ""
+msgstr "मौजूदा बस लेआउट लोड कीजिये."
#: editor/editor_audio_buses.cpp
msgid "Save As"
-msgstr ""
+msgstr "इस तरह बचा के रखिये"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr ""
+msgstr "बस लेआउट को फ़ाइल में बचा के रखिये."
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
-msgstr ""
+msgstr "प्रायिक लोड कीजिये"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr ""
+msgstr "प्रायिक बस लेआउट लोड कीजिये."
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr ""
+msgstr "नई बस लेआउट बनाइये."
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
-msgstr ""
+msgstr "अमान्य नाम."
#: editor/editor_autoload_settings.cpp
msgid "Valid characters:"
-msgstr ""
+msgstr "मान्य अक्षर:"
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing engine class name."
-msgstr ""
+msgstr "मौजूदा क्लास इंजन नाम से मेल नहीं खाना चाहिए."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing built-in type name."
-msgstr ""
+msgstr "मौजूदा बिल्ट-इन टाइप के नाम से मेल नहीं खाना चाहिए."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing global constant name."
-msgstr ""
+msgstr "मौजूदा ग्लोबल कोन्स्टन्ट के नाम से मेल नहीं खाना चाहिए."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "कीवर्ड को औटोलोड नाम के तरह नहीं इस्तेमाल कर सकते."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
-msgstr ""
+msgstr "औटोलोड '%s' पहले से मौजूद!"
#: editor/editor_autoload_settings.cpp
msgid "Rename Autoload"
-msgstr ""
+msgstr "औटोलोड का नाम बदली कीजिये"
#: editor/editor_autoload_settings.cpp
msgid "Toggle AutoLoad Globals"
-msgstr ""
+msgstr "औटोलोड ग्लोबल टॉगल कीजिये"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
-msgstr ""
+msgstr "औटोलोड हिलाइये"
#: editor/editor_autoload_settings.cpp
msgid "Remove Autoload"
-msgstr ""
+msgstr "औटोलोड हटा दीजिये"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
-msgstr ""
+msgstr "सक्रिय करे"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "गलत फॉण्ट का आकार |"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
+msgstr "औटोलोड पुनर्व्यवस्थित करें"
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
-msgstr ""
+msgstr "औटोलोड ऐड कीजिए"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp
msgid "Path:"
-msgstr ""
+msgstr "पाथ:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr ""
+msgstr "नोड का नाम:"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
#: editor/settings_config_dialog.cpp
msgid "Name"
-msgstr ""
+msgstr "नाम"
#: editor/editor_autoload_settings.cpp
msgid "Singleton"
-msgstr ""
+msgstr "सिन्गलटन"
+
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "पैरैमिटर्स पेस्ट कीजिये"
#: editor/editor_data.cpp
msgid "Updating Scene"
-msgstr ""
+msgstr "सीन अपडेट कर रहा है"
#: editor/editor_data.cpp
msgid "Storing local changes..."
-msgstr ""
+msgstr "लोकल बदलीया स्टोर कर रहा है..."
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr ""
+msgstr "सीन अपडेट कर रहा है..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr ""
+msgstr "[खाली]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr ""
+msgstr "[अनसेव्ड]"
#: editor/editor_dir_dialog.cpp
msgid "Please select a base directory first."
-msgstr ""
+msgstr "कृपया पहले बेस डायरेक्टरी सिलेक्ट कीजिये."
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
-msgstr ""
+msgstr "डायरेक्टरी चुनें"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
#: scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr ""
+msgstr "फ़ोल्डर बनाइये"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp
msgid "Name:"
-msgstr ""
+msgstr "नाम:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr ""
+msgstr "फ़ोल्डर नही बना सकते."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr ""
+msgstr "चुनें"
#: editor/editor_export.cpp
msgid "Storing File:"
-msgstr ""
+msgstr "फ़ाइल स्टोर कर रहा है:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "निश्चित पाथ पर ‍एक्सपोर्ट टेम्प्लेट नहीं मिला:"
#: editor/editor_export.cpp
msgid "Packing"
-msgstr ""
+msgstr "पैक कर रहा है"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"GLES2 के लिये टार्गेट प्ल्टैफ़ोर्म को 'ETC' टे‍क्सचर कोम्प्रेशन की आवश्यकता है. 'Import Etc' "
+"को प्रोजेक्ट सेटिन्गस मे सक्रिय करे."
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"GLES3 के लिये टार्गेट प्ल्टैफ़ोर्म को 'ETC2' टे‍क्सचर कोम्प्रेशन की आवश्यकता है. 'Import Etc "
+"2' को प्रोजेक्ट सेटिन्गस मे सक्रिय करे."
#: editor/editor_export.cpp
msgid ""
@@ -1618,522 +1587,515 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"GLES2 के लिये टार्गेट प्ल्टैफ़ोर्म को 'ETC' टे‍क्सचर कोम्प्रेशन की आवश्यकता है. \n"
+"'Import Etc' को प्रोजेक्ट सेटिन्गस मे सक्रिय करे, या 'Driver Fallback Enabled' को "
+"निष्क्रिय करे."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom debug template not found."
-msgstr ""
+msgstr "कस्टम डिबग टेम्प्लेट नहीं मिला."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr ""
+msgstr "कस्टम रिलिज टेम्प्लेट नहीं मिला."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
-msgstr ""
+msgstr "टेम्प्लेट फ़ाइल नहीं मिला:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
+msgstr "32-बिट ‍एक्सपोर्ट पर एमबेड्डेड PCK 4 GiB से बड़ी नहीं इस्तेमाल कर सकते."
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "निर्भरता संपादक"
+msgstr "3D संपादक"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "निर्भरता संपादक"
+msgstr "स्क्रिप्ट एडीटर"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr ""
+msgstr "अस्सेट संग्रह"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr ""
+msgstr "सीन ट्री एडिटिंग"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr ""
+msgid "Node Dock"
+msgstr "नोड डॉक"
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
-msgstr ""
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "फ़ाइल"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr ""
+msgid "Import Dock"
+msgstr "इंपोर्ट डॉक"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr ""
+msgstr "प्रोफ़ाइल '%s' को मिटाएं? (इसे अंडू नहीं किया जा सकता है)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
+msgstr "प्रोफ़ाइल का एक वैध फ़ाइलनेम होना चाहिए और उसमे '.' नहीं होना चाहिए"
#: editor/editor_feature_profile.cpp
msgid "Profile with this name already exists."
-msgstr ""
+msgstr "इस नाम का प्रोफ़ाइल पहले से मौजूद है।"
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(एडीटर निष्क्रिय,प्रोपरटिज निष्क्रिय)"
#: editor/editor_feature_profile.cpp
msgid "(Properties Disabled)"
-msgstr ""
+msgstr "(प्रोपरटिज निष्क्रिय)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "बंद कर दिया गया है"
+msgstr "(एडीटर निष्क्रिय)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "विवरण:"
+msgstr "क्लास विकल्प:"
#: editor/editor_feature_profile.cpp
msgid "Enable Contextual Editor"
-msgstr ""
+msgstr "कोन्टेक्सचुअल एडीटर सक्रिय करे"
#: editor/editor_feature_profile.cpp
msgid "Enabled Properties:"
-msgstr ""
+msgstr "सक्रिय प्रोपरटिज:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
-msgstr ""
+msgstr "सक्रिय फ़िचर्स:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Classes:"
-msgstr ""
+msgstr "सक्रिय क्लास:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "'%s' फ़ोर्मैट की फ़ाइल अमान्य, इंपोर्ट रोका गया."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
-msgstr ""
+msgstr "'%s' प्रोफ़ाइल पहले से मौजूद. इंपोर्ट से पहले हटा दीजिये, इंपोर्ट रोका गया."
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "लोड हो रहा है त्रुटियाँ!"
+msgstr "पाथ मे प्रोफ़ाइल सेव करनेमे एरर: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "अन्सेट"
#: editor/editor_feature_profile.cpp
msgid "Current Profile:"
-msgstr ""
+msgstr "वर्तमान प्रोफ़ाइल:"
#: editor/editor_feature_profile.cpp
msgid "Make Current"
-msgstr ""
+msgstr "वर्तमान बनाय"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "New"
-msgstr ""
+msgstr "नई"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr ""
+msgstr "इंपोर्ट"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
-msgstr ""
+msgstr "‍एक्सपोर्ट"
#: editor/editor_feature_profile.cpp
msgid "Available Profiles:"
-msgstr ""
+msgstr "उपलब्ध प्रोफ़ाइल:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "विवरण:"
+msgstr "क्लास विकल्प"
#: editor/editor_feature_profile.cpp
msgid "New profile name:"
-msgstr ""
+msgstr "नया प्रोफ़ाइल नाम:"
#: editor/editor_feature_profile.cpp
msgid "Erase Profile"
-msgstr ""
+msgstr "प्रोफ़ाइल मिटाय"
#: editor/editor_feature_profile.cpp
msgid "Godot Feature Profile"
-msgstr ""
+msgstr "Godot फ़िचर प्रोफ़ाइल"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
-msgstr ""
+msgstr "इंपोर्ट प्रोफ़ाइल"
#: editor/editor_feature_profile.cpp
msgid "Export Profile"
-msgstr ""
+msgstr "‍एक्सपोर्ट प्रोफ़ाइल"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
-msgstr ""
+msgstr "एडीटर फ़िचर प्रोफ़ाइल व्यवस्था कीजिये"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
-msgstr ""
+msgstr "वर्तमान फ़ोल्डर सिलेक्ट कीजिये"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr ""
+msgstr "फ़ाइल पहले से मौजूद, मौजूदा के ऊपर लिखे?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select This Folder"
-msgstr ""
+msgstr "यह फ़ोल्डर सिलेक्ट कीजिये"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr ""
+msgstr "पाथ कौपी कीजिये"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "खोलो इसे"
+msgstr "फ़ाइल मैनेजर में खोलिये"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
msgid "Show in File Manager"
-msgstr ""
+msgstr "फ़ाइल मैनेजर मे दिखाइए"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
-msgstr ""
+msgstr "नया फ़ोल्डर..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
-msgstr ""
+msgstr "रिफ़्रेश"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
-msgstr ""
+msgstr "सभी स्वीकृत"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr ""
+msgstr "सभी फ़ाइल (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
-msgstr ""
+msgstr "फ़ाइल खोलिये"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr ""
+msgstr "फ़ाइल(s) खोलिये"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
-msgstr ""
+msgstr "डायरेक्टरी खोलिये"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File or Directory"
-msgstr ""
+msgstr "फ़ाइल या डायरेक्टरी खोलिये"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/editor_properties.cpp editor/inspector_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
-msgstr ""
+msgstr "सेव कीजिये"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Save a File"
-msgstr ""
+msgstr "फ़ाइल सेव कीजिये"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr ""
+msgstr "पीछे जाय"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr ""
+msgstr "आगे जाय"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "ऊपर जाय"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr ""
+msgstr "छिपी फ़ाइले टॉगल कीजिये"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr ""
+msgstr "फ़ेवरेट टॉगल कीजिये"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr ""
+msgstr "मोड टॉगल कीजिये"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr ""
+msgstr "फ़ोकस पाथ"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr ""
+msgstr "फ़ेवरेट उपर लीजिये"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr ""
+msgstr "फ़ेवरेट नीचे लीजिये"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
-msgstr ""
+msgstr "पिछले फ़ोल्डर पे जाय."
#: editor/editor_file_dialog.cpp
msgid "Go to next folder."
-msgstr ""
+msgstr "अगले फ़ोल्डर पे जाय."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
-msgstr ""
+msgstr "मूल फ़ोल्डर पे जाय."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "खोज कर:"
+msgstr "रिफ़्रेश फ़ाइल."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr ""
+msgstr "फ़ेवरेट मे से वर्तमान फ़ोल्डर निकाले."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "छिपी फ़ाइलों की दृश्य टॉगल कीजिये."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
-msgstr ""
+msgstr "आइटम थम्बनेल्स के ढाँचे के तरह देखे."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr ""
+msgstr "आइटम लिस्ट के तरह देखे."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
-msgstr ""
+msgstr "डायरेक्टरिज & फ़ाइले:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
-msgstr ""
+msgstr "पूर्व दर्शन:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
-msgstr ""
+msgstr "फ़ाइल:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr ""
+msgstr "मान्य एक्सटेनशन इस्तेमाल कीजिये."
#: editor/editor_file_system.cpp
msgid "ScanSources"
-msgstr ""
+msgstr "स्रोतस्कैन कीजिये"
#: editor/editor_file_system.cpp
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
msgstr ""
+"विभिन्न प्रकार के लिए कई आयातक हैं जो % फाइल करने की ओर इशारा करते हैं, आयात निरस्त"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr ""
+msgstr "अस्सेट (पुन:) इंपोर्ट"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr ""
+msgstr "सर्वोच्च"
#: editor/editor_help.cpp
msgid "Class:"
-msgstr ""
+msgstr "क्लास:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Inherits:"
-msgstr ""
+msgstr "निम्न का उत्तराधिकारी:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr ""
+msgstr "निम्न से उत्तराधिकार प्राप्त:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "विवरण:"
+msgstr "विवरण"
#: editor/editor_help.cpp
msgid "Online Tutorials"
-msgstr ""
+msgstr "ऑनलाइन ट्यूटोरियल"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "प्रोपरटिज"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "अधिभावी करता है:"
#: editor/editor_help.cpp
msgid "default:"
-msgstr ""
+msgstr "प्रायिक:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr ""
+msgstr "मेथड"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr ""
+msgstr "थिम प्रोपरटिज"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr ""
+msgstr "एन्युमरेशन"
#: editor/editor_help.cpp
msgid "Constants"
-msgstr ""
+msgstr "कोन्स्टन्ट"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "विवरण:"
+msgstr "प्रोपर्टी का विवरण"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "मूल्य :"
+msgstr "(मूल्य)"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"वर्तमान में प्रोपर्टी का विवरण नहीं. आप हमें [color=$color][url=$url]योगदान करके[/url]"
+"[/color] मदत कर सकते है!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "विवरण:"
+msgstr "मेथड विवरण"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"वर्तमान में मेथड का विवरण नहीं. आप हमें [color=$color][url=$url]योगदान करके[/url][/"
+"color] मदत कर सकते है!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr ""
+msgstr "मदत खोजे"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
-msgstr ""
+msgstr "अक्षर संवेदनशील"
#: editor/editor_help_search.cpp
msgid "Show Hierarchy"
-msgstr ""
+msgstr "उत्क्रम दिखाइए"
#: editor/editor_help_search.cpp
msgid "Display All"
-msgstr ""
+msgstr "सब दिखाइए"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr ""
+msgstr "सिर्फ क्लास"
#: editor/editor_help_search.cpp
msgid "Methods Only"
-msgstr ""
+msgstr "सिर्फ मेथड"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "संकेत"
+msgstr "सिर्फ सिग्नल"
#: editor/editor_help_search.cpp
msgid "Constants Only"
-msgstr ""
+msgstr "सिर्फ कोन्स्टन्ट"
#: editor/editor_help_search.cpp
msgid "Properties Only"
-msgstr ""
+msgstr "सिर्फ प्रोपरटिज"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr ""
+msgstr "सिर्फ थिम प्रोपरटिज"
#: editor/editor_help_search.cpp
msgid "Member Type"
-msgstr ""
+msgstr "मेंबर टाइप"
#: editor/editor_help_search.cpp
msgid "Class"
-msgstr ""
+msgstr "क्लास"
#: editor/editor_help_search.cpp
msgid "Method"
-msgstr ""
+msgstr "मेथड"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "संकेत"
+msgstr "सिग्नल"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr ""
+msgstr "कोन्स्टन्ट"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "गुण(Property) ट्रैक"
+msgstr "प्रोपर्टी"
#: editor/editor_help_search.cpp
msgid "Theme Property"
-msgstr ""
+msgstr "थिम प्रोपर्टी"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr ""
+msgstr "प्रोपर्टी:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "सेट करे"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "अनेक सेट करे:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr ""
+msgstr "परिणाम:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "सभी खंड"
+msgstr "खंड कौपी कीजिये"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2143,176 +2105,178 @@ msgstr "सभी खंड"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr ""
+msgstr "साफ़"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr ""
+msgstr "परिणाम साफ़ करे"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr ""
+msgstr "रोकिये"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
msgid "Start"
-msgstr ""
+msgstr "शुरू कीजिये"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
msgid "Down"
-msgstr ""
+msgstr "नीचे"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "ऊपर"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
-msgstr ""
+msgstr "नोड"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "आगामी RPC"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "आगामी RSET"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "बाहर जाने वाला RPC"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "बाहर जाने वाला RSET"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "नया विंडो"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "इंपोर्टेड रेसोर्सेस सेव नहीं कर सकते."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr ""
+msgstr "ठीक है"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr ""
+msgstr "रेसोर्स सेव करनेमे एरर!"
#: editor/editor_node.cpp
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
-msgstr ""
+msgstr "रेसोर्स सेव नहीं कर सकते क्योंकि यह संपादित सीन से संबंधित नहीं. इसे पहले युनिक बनाय."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr ""
+msgstr "रेसोर्स इसप्रकार सेव कीजिये..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr ""
+msgstr "फ़ाइल रायटिंग के लिए नहीं खोल सकते:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr ""
+msgstr "निवेदित फ़ाइल फ़ोर्मैट अज्ञात:"
#: editor/editor_node.cpp
msgid "Error while saving."
-msgstr ""
+msgstr "सेव करनेमे एरर."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "'%s' नहीं खोल सकते. फ़ाइल हिलाइ गयी या हटाई गयी."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
-msgstr ""
+msgstr "'%s' पार्स करनेमे एरर."
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr ""
+msgstr "अनपेक्षित फ़ाइल समाप्ति '%s'."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
-msgstr ""
+msgstr "'%s' या उसकी निर्भरित फ़ाइलें नहीं मिली."
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
-msgstr ""
+msgstr "लोड करनेमे एरर '%s'."
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr ""
+msgstr "सीन सेव कर रहा है"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr ""
+msgstr "विश्लेषण"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
-msgstr ""
+msgstr "थंबनेल बनाना"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
-msgstr ""
+msgstr "यह ऑपरेशन पेड़ की जड़ के बिना नहीं किया जा सकता है।"
#: editor/editor_node.cpp
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"इस दृश्य को बचाया नहीं जा सकता क्योंकि एक चक्रीय instancing समावेश है ।\n"
+"कृपया इसे हल करें और फिर फिर से बचाने का प्रयास करें।"
#: editor/editor_node.cpp
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
-msgstr ""
+msgstr "दृश्य नहीं बचा सका । संभावित निर्भरता (उदाहरण या विरासत) संतुष्ट नहीं हो सकीं।"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "दृश्य है कि अभी भी खुला है ओवरराइट नहीं कर सकते!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr ""
+msgstr "विलय के लिए MeshLibrary लोड नहीं कर सकते!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr ""
+msgstr "त्रुटि बचत मेष लाइब्रेरी!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr ""
+msgstr "विलय के लिए TileSet लोड नहीं कर सकते!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr ""
+msgstr "त्रुटि बचत टाइलसेट!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
-msgstr ""
+msgstr "लेआउट को बचाने की कोशिश कर रहा त्रुटि!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
-msgstr ""
+msgstr "डिफ़ॉल्ट संपादक लेआउट अभिभूत।"
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr ""
+msgstr "लेआउट नाम नहीं मिला!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
-msgstr ""
+msgstr "आधार सेटिंग्स के लिए डिफ़ॉल्ट लेआउट बहाल।"
#: editor/editor_node.cpp
msgid ""
@@ -2320,18 +2284,26 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"यह संसाधन एक दृश्य है कि आयात किया गया था के अंतर्गत आता है, तो यह संपादन योग्य नहीं है "
+"।\n"
+"कृपया इस कार्यप्रवाह को बेहतर ढंग से समझने के लिए दृश्यों का आयात करने के लिए प्रासंगिक "
+"दस्तावेज पढ़ें।"
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
+"यह संसाधन एक दृश्य है कि उदाहरण या विरासत में मिला था के अंतर्गत आता है ।\n"
+"वर्तमान दृश्य को सहेजते समय इसमें परिवर्तन नहीं रखे जाएंगे।"
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
+"इस संसाधन का आयात किया गया था, तो यह संपादन योग्य नहीं है । आयात पैनल में अपनी सेटिंग "
+"बदलें और फिर फिर से आयात करें।"
#: editor/editor_node.cpp
msgid ""
@@ -2340,6 +2312,10 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"यह दृश्य आयात किया गया था, इसलिए इसमें परिवर्तन नहीं रखे जाएंगे।\n"
+"यह instancing या विरासत में यह परिवर्तन करने की अनुमति होगी ।\n"
+"कृपया इस कार्यप्रवाह को बेहतर ढंग से समझने के लिए दृश्यों का आयात करने के लिए प्रासंगिक "
+"दस्तावेज पढ़ें।"
#: editor/editor_node.cpp
msgid ""
@@ -2347,201 +2323,208 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
+"यह एक दूरस्थ वस्तु है, इसलिए इसमें परिवर्तन नहीं रखे जाएंगे।\n"
+"कृपया इस कार्यप्रवाह को बेहतर ढंग से समझने के लिए डिबगिंग के लिए प्रासंगिक दस्तावेज पढ़ें।"
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
+msgstr "चलाने के लिए कोई परिभाषित दृश्य नहीं है ।"
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
-msgstr ""
+msgstr "उपप्रक्रिया शुरू नहीं कर सका!"
#: editor/editor_node.cpp editor/filesystem_dock.cpp
msgid "Open Scene"
-msgstr ""
+msgstr "खुला दृश्य"
#: editor/editor_node.cpp
msgid "Open Base Scene"
-msgstr ""
+msgstr "ओपन बेस सीन"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "खोलो इसे"
+msgstr "तुरंत खोलिये..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr ""
+msgstr "क्विक ओपन सीन..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr ""
+msgstr "क्विक ओपन स्क्रिप्ट..."
#: editor/editor_node.cpp
msgid "Save & Close"
-msgstr ""
+msgstr "सहेजें और बंद"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
-msgstr ""
+msgstr "बंद करने से पहले '%' में परिवर्तन सहेजें?"
#: editor/editor_node.cpp
msgid "Saved %s modified resource(s)."
-msgstr ""
+msgstr "सहेजा गया% संशोधित संसाधन (एस)"
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr ""
+msgstr "दृश्य को बचाने के लिए एक रूट नोड की आवश्यकता होती है।"
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr ""
+msgstr "दृश्य के रूप में सहेजें ..."
#: editor/editor_node.cpp
msgid "No"
-msgstr ""
+msgstr "नहीं"
#: editor/editor_node.cpp
msgid "Yes"
-msgstr ""
+msgstr "हाँ"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr ""
+msgstr "इस सीन को कभी नहीं बचाया गया। दौड़ने से पहले सहेजें?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr ""
+msgstr "यह ऑपरेशन बिना किसी दृश्य के नहीं किया जा सकता है।"
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr ""
+msgstr "निर्यात मेष पुस्तकालय"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr ""
+msgstr "यह ऑपरेशन रूट नोड के बिना नहीं किया जा सकता है।"
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr ""
+msgstr "निर्यात टाइल सेट"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
-msgstr ""
+msgstr "यह ऑपरेशन चयनित नोड के बिना नहीं किया जा सकता है।"
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr ""
+msgstr "वर्तमान दृश्य को बचाया नहीं गया । वैसे भी खुला?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr ""
+msgstr "एक दृश्य है कि कभी नहीं बचाया गया था फिर से लोड नहीं कर सकते ।"
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "दृश्य बचाओ"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr ""
+msgstr "क्विक रन सीन..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr ""
+msgstr "छोड़ना"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr ""
+msgstr "संपादक से बाहर निकलें?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr ""
+msgstr "ओपन प्रोजेक्ट मैनेजर?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr ""
+msgstr "सहेजें और छोड़ो"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr ""
+msgstr "छोड़ने से पहले निम्नलिखित दृश्य (ओं) में परिवर्तन सहेजें?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr ""
+msgstr "परियोजना प्रबंधक खोलने से पहले निम्नलिखित दृश्य (ओं) में परिवर्तन सहेजें?"
#: editor/editor_node.cpp
msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
+"यह विकल्प बहिष्कृत है। स्थितियों जहां ताज़ा मजबूर किया जाना चाहिए अब एक बग माना जाता "
+"है । कृपया रिपोर्ट करें।"
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
-msgstr ""
+msgstr "एक मुख्य दृश्य चुनें"
#: editor/editor_node.cpp
msgid "Close Scene"
-msgstr ""
+msgstr "क्लोज सीन"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "खोलो इसे"
+msgstr "बंद सीन फिर से खोलें"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
-msgstr ""
+msgstr "ऐडऑन प्लगइन को सक्षम करने में असमर्थ: '%' कॉन्फिग का पार्सिंग विफल रहा।"
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
-msgstr ""
+msgstr "ऐडऑन प्लगइन के लिए स्क्रिप्ट फ़ील्ड खोजने में असमर्थ: 'res://addons/% s'।"
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr ""
+msgstr "पथ से ऐडऑन स्क्रिप्ट लोड करने में असमर्थ: '%' ।"
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
+"रास्ते से ऐडऑन स्क्रिप्ट लोड करने में असमर्थ: '% एस' कोड में गड़बड़ी लगती है, कृपया सिंटेक्स की "
+"जांच करें।"
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
-msgstr ""
+msgstr "पथ से ऐडऑन स्क्रिप्ट लोड करने में असमर्थ: '%' आधार प्रकार संपादकप्लगइन नहीं है।"
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
-msgstr ""
+msgstr "पथ से ऐडऑन स्क्रिप्ट लोड करने में असमर्थ: '%' स्क्रिप्ट टूल मोड में नहीं है।"
#: editor/editor_node.cpp
msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
+"दृश्य '%' स्वचालित रूप से आयात किया गया था, इसलिए इसे संशोधित नहीं किया जा सकता है।\n"
+"इसमें बदलाव करने के लिए विरासत में मिला एक नया सीन बनाया जा सकता है।"
#: editor/editor_node.cpp
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
+"त्रुटि लोडिंग दृश्य, यह परियोजना पथ के अंदर होना चाहिए। दृश्य खोलने के लिए 'आयात' का "
+"उपयोग करें, फिर इसे परियोजना पथ के अंदर बचाएं।"
#: editor/editor_node.cpp
msgid "Scene '%s' has broken dependencies:"
-msgstr ""
+msgstr "दृश्य '%' निर्भरता टूट गया है:"
#: editor/editor_node.cpp
msgid "Clear Recent Scenes"
-msgstr ""
+msgstr "हाल के दृश्यों को साफ करें"
#: editor/editor_node.cpp
msgid ""
@@ -2549,6 +2532,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"कोई मुख्य दृश्य कभी परिभाषित किया गया है, एक का चयन करें?\n"
+"आप इसे बाद में 'एप्लिकेशन' श्रेणी के तहत \"प्रोजेक्ट सेटिंग्स\" में बदल सकते हैं।"
#: editor/editor_node.cpp
msgid ""
@@ -2556,6 +2541,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"चयनित दृश्य '%' मौजूद नहीं है, एक वैध का चयन करें?\n"
+"आप इसे बाद में 'एप्लिकेशन' श्रेणी के तहत \"प्रोजेक्ट सेटिंग्स\" में बदल सकते हैं।"
#: editor/editor_node.cpp
msgid ""
@@ -2563,361 +2550,382 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"चयनित दृश्य '%' एक दृश्य फ़ाइल नहीं है, एक वैध का चयन करें?\n"
+"आप इसे बाद में 'एप्लिकेशन' श्रेणी के तहत \"प्रोजेक्ट सेटिंग्स\" में बदल सकते हैं।"
#: editor/editor_node.cpp
msgid "Save Layout"
-msgstr ""
+msgstr "लेआउट सहेजें"
#: editor/editor_node.cpp
msgid "Delete Layout"
-msgstr ""
+msgstr "लेआउट हटाएं"
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
msgid "Default"
-msgstr ""
+msgstr "चूक"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
msgid "Show in FileSystem"
-msgstr ""
+msgstr "शो में फाइल सिस्टम"
#: editor/editor_node.cpp
msgid "Play This Scene"
-msgstr ""
+msgstr "इस दृश्य को खेलो"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "बंद करे"
+msgstr "टैब बंद करे"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "बंद करे"
+msgstr "बंद टैब अनकिया करें"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
-msgstr ""
+msgstr "बंद करें अन्य टैब"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "टैब को दाईं ओर बंद करें"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "बंद करे"
+msgstr "सभी टैब बंद करे"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
-msgstr ""
+msgstr "स्विच सीन टैब"
#: editor/editor_node.cpp
msgid "%d more files or folders"
-msgstr ""
+msgstr "% डी अधिक फाइलें या फ़ोल्डर"
#: editor/editor_node.cpp
msgid "%d more folders"
-msgstr ""
+msgstr "% डी अधिक फ़ोल्डर्स"
#: editor/editor_node.cpp
msgid "%d more files"
-msgstr ""
+msgstr "% डी अधिक फाइलें"
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr ""
+msgstr "डॉक पोजीशन"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr ""
+msgstr "व्याकुलता मुक्त मोड"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
-msgstr ""
+msgstr "व्याकुलता मुक्त मोड टॉगल।"
#: editor/editor_node.cpp
msgid "Add a new scene."
-msgstr ""
+msgstr "एक नया दृश्य जोड़ें।"
#: editor/editor_node.cpp
msgid "Scene"
-msgstr ""
+msgstr "दृश्य"
#: editor/editor_node.cpp
msgid "Go to previously opened scene."
-msgstr ""
+msgstr "पहले खोले गए दृश्य में जाएं।"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "सभी खंड"
+msgstr "टेक्स्ट कौपी कीजिये"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr ""
+msgstr "अगला टैब"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr ""
+msgstr "पिछला टैब"
#: editor/editor_node.cpp
msgid "Filter Files..."
-msgstr ""
+msgstr "फ़िल्टर फ़ाइलें..."
#: editor/editor_node.cpp
msgid "Operations with scene files."
-msgstr ""
+msgstr "दृश्य फ़ाइलों के साथ संचालन।"
#: editor/editor_node.cpp
msgid "New Scene"
-msgstr ""
+msgstr "नया दृश्य"
#: editor/editor_node.cpp
msgid "New Inherited Scene..."
-msgstr ""
+msgstr "नया विरासत में मिला दृश्य..."
#: editor/editor_node.cpp
msgid "Open Scene..."
-msgstr ""
+msgstr "खुला दृश्य..."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Open Recent"
-msgstr ""
+msgstr "खुला हाल"
#: editor/editor_node.cpp
msgid "Save Scene"
-msgstr ""
+msgstr "दृश्य बचाओ"
#: editor/editor_node.cpp
msgid "Save All Scenes"
-msgstr ""
+msgstr "सभी दृश्यों को सहेजें"
#: editor/editor_node.cpp
msgid "Convert To..."
-msgstr ""
+msgstr "बदलने के लिए..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
-msgstr ""
+msgstr "मेष लाइब्रेरी..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr ""
+msgstr "Tileset ..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr ""
+msgstr "पूर्ववत्"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
+msgstr "दोहराएँ"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
-msgstr ""
+msgstr "विविध परियोजना या दृश्य-व्यापी उपकरण।"
#: editor/editor_node.cpp editor/project_manager.cpp
#: editor/script_create_dialog.cpp
msgid "Project"
-msgstr ""
+msgstr "परियोजना"
#: editor/editor_node.cpp
msgid "Project Settings..."
-msgstr ""
+msgstr "प्रोजेक्ट सेटिंग ..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control"
-msgstr ""
+msgstr "वर्जन कंट्रोल"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "वर्जन नियंत्रण स्थापित करें"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "वर्जन नियंत्रण बंद करें"
#: editor/editor_node.cpp
msgid "Export..."
-msgstr ""
+msgstr "निर्यात..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "एंड्रॉयड बिल्ड टेम्पलेट स्थापित करें..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "परियोजना के संस्थापक"
+msgstr "प्रोजेक्ट डेटा फ़ोल्डर खोलिये"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
-msgstr ""
+msgstr "उपकरण"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "Orphan Resource Explorer"
+msgstr "असहाय रेसोर्स खोजकर्ता..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr ""
+msgstr "परियोजना सूची में छोड़ो"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr ""
+msgstr "डीबग करें"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr ""
+msgstr "रिमोट डिबग के साथ तैनात"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
-msgstr ""
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
+msgstr "नेटवर्क एफएस के साथ छोटे तैनात"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
+"जब यह विकल्प सक्षम हो जाता है, तो निर्यात या तैनाती न्यूनतम निष्पादित उत्पादन करेगी।\n"
+"नेटवर्क के ऊपर संपादक द्वारा परियोजना से फाइलसिस्टम उपलब्ध कराया जाएगा।\n"
+"एंड्रॉयड पर, तैनात तेजी से प्रदर्शन के लिए यूएसबी केबल का उपयोग करेंगे । यह विकल्प एक बड़े "
+"पदचिह्न के साथ खेल के लिए परीक्षण को गति देता है।"
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr ""
+msgstr "दृश्यमान टकराव आकार"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
+"यदि यह विकल्प चालू हो जाता है तो टकराव के आकार और रेकास्ट नोड्स (2डी और 3 डी के लिए) "
+"चल रहे खेल पर दिखाई देंगे।"
#: editor/editor_node.cpp
msgid "Visible Navigation"
-msgstr ""
+msgstr "दर्शनीय नेविगेशन"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
-msgstr ""
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
+msgstr "यदि यह विकल्प चालू हो जाता है तो नेविगेशन मेशेस और बहुभुज चल रहे खेल पर दिखाई देंगे।"
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Scene Changes"
+msgstr "सिंक सीन बदलता है"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
+"जब इस विकल्प को चालू किया जाता है, तो संपादक में दृश्य में किए गए किसी भी परिवर्तन को "
+"चल रहे खेल में दोहराया जाएगा।\n"
+"जब किसी डिवाइस पर दूर से उपयोग किया जाता है, तो यह नेटवर्क फाइलसिस्टम के साथ अधिक "
+"कुशल होता है।"
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "सिंक स्क्रिप्ट परिवर्तन"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
+"जब यह विकल्प चालू हो जाएगा, तो सहेजी गई किसी भी स्क्रिप्ट को चल रहे गेम पर फिर से लोड "
+"किया जाएगा।\n"
+"जब किसी डिवाइस पर दूर से उपयोग किया जाता है, तो यह नेटवर्क फाइलसिस्टम के साथ अधिक "
+"कुशल होता है।"
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
-msgstr ""
+msgstr "संपादक"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "अनुवाद में बदलाव करें:"
+msgstr "एडीटर सेटिन्गस..."
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr ""
+msgstr "संपादक लेआउट"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr ""
+msgstr "स्क्रीनशॉट लें"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr ""
+msgstr "स्क्रीनशॉट एडिटर डेटा/सेटिंग्स फोल्डर में स्टोर किए जाते हैं ।"
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr ""
+msgstr "पूर्णस्क्रीन चालू करें"
#: editor/editor_node.cpp
msgid "Toggle System Console"
-msgstr ""
+msgstr "टॉगल सिस्टम कंसोल"
#: editor/editor_node.cpp
msgid "Open Editor Data/Settings Folder"
-msgstr ""
+msgstr "संपादक डेटा / सेटिंग्स फ़ोल्डर खोलें"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "संपादक डेटा फ़ोल्डर खोलें"
#: editor/editor_node.cpp
msgid "Open Editor Settings Folder"
-msgstr ""
+msgstr "ओपन एडिटर सेटिंगफ़र"
#: editor/editor_node.cpp
msgid "Manage Editor Features..."
-msgstr ""
+msgstr "संपादक सुविधाएँ प्रबंधित करें ..."
#: editor/editor_node.cpp
msgid "Manage Export Templates..."
-msgstr ""
+msgstr "निर्यात टेम्पलेट्स का प्रबंधन करें ..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
-msgstr ""
+msgstr "मदद"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
-msgstr ""
+msgstr "ढूंढें"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
-msgstr ""
+msgstr "ऑनलाइन डॉक्स"
#: editor/editor_node.cpp
msgid "Q&A"
-msgstr ""
+msgstr "Q&A"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr ""
+msgid "Report a Bug"
+msgstr "प्रोग्राम में त्रुटि की शिकायत करें"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Docs की प्रतिक्रिया भेजें"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2929,92 +2937,92 @@ msgstr "के बारे में"
#: editor/editor_node.cpp
msgid "Play the project."
-msgstr ""
+msgstr "प्रोजेक्ट चलाएं।"
#: editor/editor_node.cpp
msgid "Play"
-msgstr ""
+msgstr "खेल"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "डिबगिंग के लिए दृश्य निष्पादन को रोकें।"
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr ""
+msgstr "दृश्य रोकें"
#: editor/editor_node.cpp
msgid "Stop the scene."
-msgstr ""
+msgstr "सीन बंद करो।"
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr ""
+msgstr "संपादित दृश्य खेलते हैं।"
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr ""
+msgstr "प्ले सीन"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr ""
+msgstr "कस्टम दृश्य बजाना"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr ""
+msgstr "कस्टम दृश्य बजाना"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "वीडियो ड्राइवर को बदलने के लिए संपादक को फिर से शुरू करने की आवश्यकता होती है।"
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
msgid "Save & Restart"
-msgstr ""
+msgstr "सहेजें और पुनः आरंभ करें"
#: editor/editor_node.cpp
msgid "Spins when the editor window redraws."
-msgstr ""
+msgstr "जब संपादक खिड़की फिर से खींचता है तो स्पिन करता है।"
#: editor/editor_node.cpp
msgid "Update Continuously"
-msgstr ""
+msgstr "लगातार अपडेट करें"
#: editor/editor_node.cpp
msgid "Update When Changed"
-msgstr ""
+msgstr "जब बदला अद्यतन"
#: editor/editor_node.cpp
msgid "Hide Update Spinner"
-msgstr ""
+msgstr "अपडेट स्पिनर को छिपाएं"
#: editor/editor_node.cpp
msgid "FileSystem"
-msgstr ""
+msgstr "फ़ाइल"
#: editor/editor_node.cpp
msgid "Inspector"
-msgstr ""
+msgstr "निरीक्षक"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr ""
+msgstr "बॉटम पैनल का विस्तार करें"
#: editor/editor_node.cpp
msgid "Output"
-msgstr ""
+msgstr "आउटपुट"
#: editor/editor_node.cpp
msgid "Don't Save"
-msgstr ""
+msgstr "सहेजें मत करो"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
-msgstr ""
+msgstr "एंड्रॉइड बिल्ड टेम्पलेट गायब है, कृपया प्रासंगिक टेम्पलेट्स स्थापित करें।"
#: editor/editor_node.cpp
msgid "Manage Templates"
-msgstr ""
+msgstr "टेम्पलेट्स का प्रबंधन करें"
#: editor/editor_node.cpp
msgid ""
@@ -3026,6 +3034,12 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
+"यह \"res://android/build\" के लिए स्रोत टेम्पलेट स्थापित करके कस्टम एंड्रॉइड बिल्ड के "
+"लिए आपकी परियोजना स्थापित करेगा।\n"
+"फिर आप संशोधनों को लागू कर सकते हैं और निर्यात पर अपना खुद का कस्टम एपीके बना सकते हैं "
+"(मॉड्यूल जोड़ना, AndroidManifest.xml, आदि बदलना)।\n"
+"ध्यान दें कि पूर्व-निर्मित एपीके का उपयोग करने के बजाय कस्टम बिल्ड बनाने के लिए, एंड्रॉइड "
+"निर्यात पूर्व निर्धारित में \"उपयोग कस्टम बिल्ड\" विकल्प सक्षम किया जाना चाहिए।"
#: editor/editor_node.cpp
msgid ""
@@ -3034,195 +3048,198 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
+"एंड्रॉयड बिल्ड टेम्पलेट पहले से ही इस परियोजना में स्थापित है और यह अधिक नहीं लिखा जाएगा "
+"।\n"
+"इस ऑपरेशन को फिर से प्रयास करने से पहले मैन्युअल रूप से \"res://android/build\" "
+"निर्देशिका निकालें।"
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
-msgstr ""
+msgstr "जिप फाइल से आयात टेम्पलेट्स"
#: editor/editor_node.cpp
msgid "Template Package"
-msgstr ""
+msgstr "टेम्पलेट पैकेज"
#: editor/editor_node.cpp
msgid "Export Library"
-msgstr ""
+msgstr "एक्सपोर्ट लाइब्रेरी"
#: editor/editor_node.cpp
msgid "Merge With Existing"
-msgstr ""
+msgstr "मौजूदा के साथ विलय"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
-msgstr ""
+msgstr "ओपन एंड रन एक स्क्रिप्ट"
#: editor/editor_node.cpp
msgid "New Inherited"
-msgstr ""
+msgstr "नई विरासत में मिली"
#: editor/editor_node.cpp
msgid "Load Errors"
-msgstr ""
+msgstr "लोड त्रुटियां"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
-msgstr ""
+msgstr "चुनें"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr ""
+msgstr "ओपन 2D संपादक"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr ""
+msgstr "ओपन 3डी एडिटर"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr ""
+msgstr "ओपन स्क्रिप्ट एडिटर"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr ""
+msgstr "ओपन एसेट लाइब्रेरी"
#: editor/editor_node.cpp
msgid "Open the next Editor"
-msgstr ""
+msgstr "अगले संपादक खोलें"
#: editor/editor_node.cpp
msgid "Open the previous Editor"
-msgstr ""
+msgstr "पिछले संपादक खोलें"
#: editor/editor_node.h
msgid "Warning!"
-msgstr ""
+msgstr "चेतावनी!"
#: editor/editor_path.cpp
-#, fuzzy
msgid "No sub-resources found."
-msgstr "संसाधन"
+msgstr "सब-रिसोर्स नहीं मिला."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr ""
+msgstr "मेष पूर्वावलोकन बनाना"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
-msgstr ""
+msgstr "थंबनेल..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "निर्भरता संपादक"
+msgstr "मेन स्क्रिप्ट:"
#: editor/editor_plugin_settings.cpp
msgid "Edit Plugin"
-msgstr ""
+msgstr "प्लगइन को संपादित करें"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
-msgstr ""
+msgstr "स्थापित प्लगइन्स:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Update"
-msgstr ""
+msgstr "अद्यतन"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Version:"
-msgstr ""
+msgstr "संस्करण:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Author:"
-msgstr ""
+msgstr "लेखक:"
#: editor/editor_plugin_settings.cpp
msgid "Status:"
-msgstr ""
+msgstr "स्थिति:"
#: editor/editor_plugin_settings.cpp
msgid "Edit:"
-msgstr ""
+msgstr "संपादित:"
#: editor/editor_profiler.cpp
msgid "Measure:"
-msgstr ""
+msgstr "рдорд╛рдк:"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
-msgstr ""
+msgstr "फ्रेम समय (सेकंड)"
#: editor/editor_profiler.cpp
msgid "Average Time (sec)"
-msgstr ""
+msgstr "औसत समय (सेकंड)"
#: editor/editor_profiler.cpp
msgid "Frame %"
-msgstr ""
+msgstr "फ़्रेम%"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr ""
+msgstr "फिजिक्स फ्रेम %"
#: editor/editor_profiler.cpp
msgid "Inclusive"
-msgstr ""
+msgstr "समावेशी"
#: editor/editor_profiler.cpp
msgid "Self"
-msgstr ""
+msgstr "स्वयं"
#: editor/editor_profiler.cpp
msgid "Frame #:"
-msgstr ""
+msgstr "फ्रेम #:"
#: editor/editor_profiler.cpp
msgid "Time"
-msgstr ""
+msgstr "समय"
#: editor/editor_profiler.cpp
msgid "Calls"
-msgstr ""
+msgstr "कॉल"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "परिवर्तन वक्र चयन"
+msgstr "टेक्स्ट संपादित करें:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
-msgstr ""
+msgstr "पर"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "परत"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "बिट%d, मूल्य % डी"
#: editor/editor_properties.cpp
msgid "[Empty]"
-msgstr ""
+msgstr "[खाली]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr ""
+msgstr "सौंपना..."
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "गलत फॉण्ट का आकार |"
+msgstr "अमान्य RID"
#: editor/editor_properties.cpp
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
msgstr ""
+"चयनित संसाधन (%s) इस संपत्ति (% एस) के लिए अपेक्षित किसी भी प्रकार से मेल नहीं खाता है।"
#: editor/editor_properties.cpp
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"फ़ाइल के रूप में सहेजे गए संसाधनों पर व्यूपोर्टटेक्सचर नहीं बना सकते.\n"
+"संसाधन के लिए एक दृश्य से संबंधित की जरूरत है ।"
#: editor/editor_properties.cpp
msgid ""
@@ -3231,26 +3248,28 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"इस संसाधन पर व्यूपोर्टटेक्सचर नहीं बना सकते क्योंकि यह स्थानीय से दृश्य के रूप में सेट नहीं है।\n"
+"कृपया उस पर 'स्थानीय से दृश्य' संपत्ति पर स्विच करें (और इसे युक्त सभी संसाधन एक नोड तक)।"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
-msgstr ""
+msgstr "व्यूपोर्ट चुनें"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
-msgstr ""
+msgstr "नई स्क्रिप्ट"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
msgid "Extend Script"
-msgstr ""
+msgstr "स्क्रिप्ट बढ़ाएँ"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
-msgstr ""
+msgstr "नया%s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Make Unique"
-msgstr ""
+msgstr "अद्वितीय बनाओ"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3264,395 +3283,394 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
-msgstr ""
+msgstr "चिपकाएँ"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Convert To %s"
-msgstr ""
+msgstr "% एस में परिवर्तित करें"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
-msgstr ""
+msgstr "चयनित नोड व्यूपोर्ट नहीं है!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "आकार: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "पृष्ठ: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr ""
+msgstr "आइटम निकालें"
#: editor/editor_properties_array_dict.cpp
msgid "New Key:"
-msgstr ""
+msgstr "नई कुंजी:"
#: editor/editor_properties_array_dict.cpp
msgid "New Value:"
-msgstr ""
+msgstr "नया मूल्य:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "कुंजी/मूल्य जोड़ी जोड़ें"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
+"इस मंच के लिए कोई रननयोग्य निर्यात पूर्व निर्धारित नहीं मिला।\n"
+"कृपया निर्यात मेनू में एक रननेबल प्रीसेट जोड़ें।"
#: editor/editor_run_script.cpp
msgid "Write your logic in the _run() method."
-msgstr ""
+msgstr "अपने तर्क को _run () विधि में लिखें।"
#: editor/editor_run_script.cpp
msgid "There is an edited scene already."
-msgstr ""
+msgstr "वहां एक संपादित दृश्य पहले से ही है ।"
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
-msgstr ""
+msgstr "उदाहरण स्क्रिप्ट नहीं कर सका:"
#: editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
-msgstr ""
+msgstr "क्या आप 'टूल' कीवर्ड भूल गए?"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr ""
+msgstr "स्क्रिप्ट नहीं चला सका:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
+msgstr "क्या आप '_run' विधि को भूल गए?"
+
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
msgstr ""
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
-msgstr ""
+msgstr "आयात करने के लिए नोड (एस) का चयन करें"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
-msgstr ""
+msgstr "ब्राउज़"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
-msgstr ""
+msgstr "दृश्य पथ:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr ""
+msgstr "नोड से आयात:"
#: editor/export_template_manager.cpp
msgid "Redownload"
-msgstr ""
+msgstr "रीडाउनलोड करें"
#: editor/export_template_manager.cpp
msgid "Uninstall"
-msgstr ""
+msgstr "अनइंस्टाल करें"
#: editor/export_template_manager.cpp
msgid "(Installed)"
-msgstr ""
+msgstr "(स्थापित)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download"
-msgstr ""
+msgstr "डाउनलोड"
#: editor/export_template_manager.cpp
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "विकास के निर्माण के लिए आधिकारिक निर्यात टेम्पलेटउपलब्ध नहीं हैं।"
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr ""
+msgstr "(लापता)"
#: editor/export_template_manager.cpp
msgid "(Current)"
-msgstr ""
+msgstr "(वर्तमान)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
-msgstr ""
+msgstr "दर्पण को पुनः प्राप्त करना, कृपया प्रतीक्षा करें ..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr ""
+msgstr "टेम्पलेट संस्करण '%s'?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
-msgstr ""
+msgstr "निर्यात टेम्पलेट्स ज़िप नहीं खोल सकते।"
#: editor/export_template_manager.cpp
msgid "Invalid version.txt format inside templates: %s."
-msgstr ""
+msgstr "टेम्पलेट्स के अंदर अमान्य संस्करण.txt प्रारूप: % एस।"
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr ""
+msgstr "टेम्पलेट्स के अंदर कोई संस्करण.txt नहीं मिला।"
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
-msgstr ""
+msgstr "टेम्पलेट्स के लिए पथ बनाने में त्रुटि:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
-msgstr ""
+msgstr "एक्सपोर्ट टेम्पलेट्स निकालना"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr ""
+msgstr "आयात:"
#: editor/export_template_manager.cpp
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "त्रुटि दर्पण की सूची हो रही है।"
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
+msgstr "मिरर लिस्ट की त्रुटि पार्सिंग जेसन । कृपया इस मुद्दे की रिपोर्ट करें!"
#: editor/export_template_manager.cpp
msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
msgstr ""
+"इस संस्करण के लिए कोई डाउनलोड लिंक नहीं मिला। प्रत्यक्ष डाउनलोड केवल आधिकारिक रिलीज के "
+"लिए उपलब्ध है।"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve."
-msgstr ""
+msgstr "हल नहीं कर सकते।"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect."
-msgstr ""
+msgstr "कनेक्ट नहीं कर सकते।"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response."
-msgstr ""
+msgstr "कोई जवाब नहीं।"
#: editor/export_template_manager.cpp
msgid "Request Failed."
-msgstr ""
+msgstr "अनुरोध विफल रहा।"
#: editor/export_template_manager.cpp
msgid "Redirect Loop."
-msgstr ""
+msgstr "लूप को रीडायरेक्ट करते हैं।"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed:"
-msgstr ""
+msgstr "विफल:"
#: editor/export_template_manager.cpp
msgid "Download Complete."
-msgstr ""
+msgstr "पूरा डाउनलोड करें।"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "निकाला नहीं जा सकता:\n"
+msgstr "अल्पकालिक फ़ाइल निकाली नहीं जा सक्ती:"
#: editor/export_template_manager.cpp
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"टेम्पलेट्स स्थापना विफल रही।\n"
+"समस्याग्रस्त टेम्पलेट्स अभिलेखागार '%' पर पाया जा सकता है।"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
msgstr "लोड होने मे त्रुटि:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
-msgstr ""
+msgstr "मिरर से कनेक्ट..."
#: editor/export_template_manager.cpp
msgid "Disconnected"
-msgstr ""
+msgstr "डिस्कनेक्ट"
#: editor/export_template_manager.cpp
msgid "Resolving"
-msgstr ""
+msgstr "समाधान"
#: editor/export_template_manager.cpp
msgid "Can't Resolve"
-msgstr ""
+msgstr "हल नहीं कर सकते"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connecting..."
-msgstr ""
+msgstr "जोड़ने..."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Can't Connect"
-msgstr "जुडिये"
+msgstr "कनेक्ट नहीं कर सकते"
#: editor/export_template_manager.cpp
msgid "Connected"
-msgstr ""
+msgstr "जुड़ा"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Requesting..."
-msgstr ""
+msgstr "अनुरोध..."
#: editor/export_template_manager.cpp
msgid "Downloading"
-msgstr ""
+msgstr "डाउनलोड"
#: editor/export_template_manager.cpp
msgid "Connection Error"
-msgstr ""
+msgstr "कनेक्शन त्रुटि"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr ""
+msgstr "एसएसएल हैंडशेक एरर"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "असंपीड़ित संपत्तियां"
+msgstr "अनकॉमिंग एंड्रॉइड बिल्ड स्रोत"
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr ""
+msgstr "वर्तमान संस्करण:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr ""
+msgstr "स्थापित संस्करण:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr ""
+msgstr "फ़ाइल से इंस्टॉल करें"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr ""
+msgstr "टेम्पलेट निकालें"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
-msgstr "चयनित फ़ाइलें हटाएं?"
+msgstr "टेम्पलेट फ़ाइल का चयन करें"
#: editor/export_template_manager.cpp
msgid "Godot Export Templates"
-msgstr ""
+msgstr "गोडॉट एक्सपोर्ट टेम्पलेट्स"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
-msgstr ""
+msgstr "एक्सपोर्ट टेम्पलेट मैनेजर"
#: editor/export_template_manager.cpp
msgid "Download Templates"
-msgstr ""
+msgstr "टेम्पलेट्स डाउनलोड करें"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr ""
+msgstr "सूची से दर्पण चुनें: (शिफ्ट +क्लिक: ब्राउज़र में खुला)"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "पसंदीदा:"
+msgstr "पसंद"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
+"स्थिति: फाइल का आयात विफल रहा। कृपया फाइल को ठीक करें और मैन्युअल रूप से पुनर्आयात करें।"
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr ""
+msgstr "संसाधनों की जड़ को स्थानांतरित/नाम नहीं दे सकते ।"
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
-msgstr ""
+msgstr "फ़ोल्डर को अपने आप में नहीं ले जा सकते।"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error moving:"
-msgstr "लोड होने मे त्रुटि:"
+msgstr "त्रुटि चलती:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error duplicating:"
-msgstr "लोड होने मे त्रुटि:"
+msgstr "त्रुटि दोहराना:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Unable to update dependencies:"
-msgstr "लापता निर्भरताओं के कारण दृश्य लोड करने में विफल रहे:"
+msgstr "निर्भरता को अपडेट करने में असमर्थ:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
-msgstr ""
+msgstr "कोई नाम प्रदान नहीं किया गया।"
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters."
-msgstr ""
+msgstr "बशर्ते नाम में अमान्य पात्र होते हैं।"
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr ""
+msgstr "इस नाम से फ़ाइल या फ़ोल्डर पहले से मौजूद."
#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
-msgstr ""
+msgstr "नाम मे अमान्य अक्षर मौजूद."
#: editor/filesystem_dock.cpp
msgid "Renaming file:"
-msgstr ""
+msgstr "फ़ाइल का नाम बदल रहे है:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr ""
+msgstr "फ़ोल्डर का नाम बदल रहे है:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating file:"
-msgstr "प्रतिलिपि"
+msgstr "डुप्लिकेट फाइल:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating folder:"
-msgstr "प्रतिलिपि"
+msgstr "डुप्लिकेटिंग फ़ोल्डर:"
#: editor/filesystem_dock.cpp
msgid "New Inherited Scene"
-msgstr ""
+msgstr "नई उत्तराधिकार प्राप्त सीन"
#: editor/filesystem_dock.cpp
msgid "Set As Main Scene"
-msgstr ""
+msgstr "मेन सीन सेट करे"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "खोलो इसे"
+msgstr "खुले दृश्य"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "पसंदीदा:"
+msgstr "पसंदीदा में जोड़ें"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "पसंदीदा:"
+msgstr "पसंदीदा से निकालें"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr ""
+msgstr "निर्भरित फ़ाइलें संपादित करें..."
#: editor/filesystem_dock.cpp
msgid "View Owners..."
@@ -3663,27 +3681,24 @@ msgid "Rename..."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicate..."
-msgstr "प्रतिलिपि"
+msgstr "डुप्लिकेट..."
#: editor/filesystem_dock.cpp
msgid "Move To..."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "संसाधन"
+msgstr "नया दृश्य..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "संसाधन"
+msgstr "नया संसाधन..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
@@ -3719,9 +3734,8 @@ msgid "Toggle Split Mode"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "खोज कर:"
+msgstr "फाइलें खोजें"
#: editor/filesystem_dock.cpp
msgid ""
@@ -3742,9 +3756,8 @@ msgid "Overwrite"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "एक नया बनाएं"
+msgstr "दृश्य बनाएं"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
@@ -3798,9 +3811,8 @@ msgid "Replace all (no undo)"
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "खोज कर:"
+msgstr "खोज..."
#: editor/find_in_files.cpp
msgid "Search complete"
@@ -3819,19 +3831,16 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "गलत फॉण्ट का आकार |"
+msgstr "अमान्य समूह नाम।"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "ऑडियो बस का नाम बदलें"
+msgstr "नाम बदलना समूह"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "को हटा दें"
+msgstr "ग्रुप डिलीट करें"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3855,9 +3864,8 @@ msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "निर्भरता संपादक"
+msgstr "समूह संपादक"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3937,19 +3945,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3957,16 +3969,15 @@ msgid "Import As:"
msgstr ""
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "रीसेट आकार"
+msgstr "प्रीसेट"
#: editor/import_dock.cpp
msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4000,13 +4011,8 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "संसाधन"
+msgstr "एडिट रिसोर्स क्लिपबोर्ड"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4073,9 +4079,8 @@ msgid "Edit a Plugin"
msgstr ""
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "सदस्यता बनाएं"
+msgstr "प्लगइन बनाएं"
#: editor/plugin_config_dialog.cpp
msgid "Plugin Name:"
@@ -4099,16 +4104,14 @@ msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "सदस्यता बनाएं"
+msgstr "बहुभुज बनाएँ"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "एक नया बनाएं"
+msgstr "अंक बनाएं।"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
@@ -4123,9 +4126,8 @@ msgid "Erase points."
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
-msgstr "सदस्यता बनाएं"
+msgstr "बहुभुज संपादित करें"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
@@ -4175,15 +4177,13 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "पसंदीदा:"
+msgstr "नोड प्वाइंट जोड़ें"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "एनिमेशन लूप"
+msgstr "एनिमेशन प्वाइंट जोड़ें"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Remove BlendSpace1D Point"
@@ -4225,9 +4225,8 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "निर्भरता संपादक"
+msgstr "ओपन एडिटर"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4241,9 +4240,8 @@ msgid "Triangle already exists."
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "ट्रैक जोड़ें"
+msgstr "त्रिकोण जोड़ें"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Limits"
@@ -4318,26 +4316,22 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Connected"
-msgstr "जुडिये"
+msgstr "नोड्स कनेक्टेड"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Disconnected"
-msgstr "डिस्कनेक्ट"
+msgstr "नोड्स डिस्कनेक्ट किए गए"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "एनिमेशन लूप"
+msgstr "सेट एनिमेशन"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Node"
-msgstr "को हटा दें"
+msgstr "नोड हटाएं"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
@@ -4372,14 +4366,12 @@ msgid "Anim Clips"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "ट्रैक जोड़ें"
+msgstr "ऑडियो क्लिप्स"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "कार्यों:"
+msgstr "कार्यों"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4512,9 +4504,8 @@ msgid "Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "अनुवाद में बदलाव करें:"
+msgstr "एडिट ट्रांजिशन..."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Open in Inspector"
@@ -4537,9 +4528,8 @@ msgid "Onion Skinning Options"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Directions"
-msgstr "विवरण:"
+msgstr "निर्देशों"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Past"
@@ -4613,14 +4603,12 @@ msgid "Move Node"
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "अनुवाद में बदलाव करें:"
+msgstr "संक्रमण मौजूद है!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "अनुवाद में बदलाव करें:"
+msgstr "ट्रांजिशन जोड़ें"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -4656,14 +4644,12 @@ msgid "No playback resource set at path: %s."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
-msgstr "मिटाना"
+msgstr "नोड हटाया गया"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "अनुवाद में बदलाव करें:"
+msgstr "संक्रमण हटाया गया"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
@@ -4677,19 +4663,16 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "एक नया बनाएं"
+msgstr "नए नोड्स बनाएं।"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "जुडिये"
+msgstr "नोड्स कनेक्ट करें।"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Remove selected node or transition."
-msgstr "परियोजना से चयनित फ़ाइलें निकालें? (कोई पूर्ववत नहीं)"
+msgstr "चयनित नोड या संक्रमण निकालें।"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -4700,9 +4683,8 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "अनुवाद में बदलाव करें:"
+msgstr "संक्रमण: "
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Play Mode:"
@@ -4711,7 +4693,7 @@ msgstr ""
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr ""
+msgstr "एनिमेशनट्री"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -4882,9 +4864,8 @@ msgid "Request failed."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Cannot save response to:"
-msgstr "निकाला नहीं जा सकता:\n"
+msgstr "जवाब नहीं बचा सकते:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Write error."
@@ -4947,9 +4928,8 @@ msgid "Idle"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "इंस्टॉल"
+msgstr "स्थापित..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4980,14 +4960,12 @@ msgid "Name (Z-A)"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "लाइसेंस"
+msgstr "लाइसेंस (ए-जेड)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "लाइसेंस"
+msgstr "लाइसेंस (जेड-ए)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
@@ -5047,9 +5025,8 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Loading..."
-msgstr "खोज कर:"
+msgstr "लोड..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
@@ -5077,7 +5054,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5118,28 +5095,24 @@ msgid "Move Vertical Guide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "एक नया बनाएं"
+msgstr "वर्टिकल गाइड बनाएं"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "मिटाना"
+msgstr "वर्टिकल गाइड निकालें"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Horizontal Guide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "एक नया बनाएं"
+msgstr "क्षैतिज गाइड बनाएं"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "मिटाना"
+msgstr "क्षैतिज गाइड निकालें"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Horizontal and Vertical Guides"
@@ -5291,33 +5264,29 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Group Selected"
-msgstr "सभी खंड"
+msgstr "समूह चयनित"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Ungroup Selected"
-msgstr "सभी खंड"
+msgstr "असमूह चयनित"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Guides"
-msgstr "एनीमेशन परिवर्तन परिणत"
+msgstr "स्पष्ट गाइड"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Bones"
-msgstr "एनीमेशन परिवर्तन परिणत"
+msgstr "साफ हड्डियां"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
@@ -5336,9 +5305,8 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-#, fuzzy
msgid "Zoom Reset"
-msgstr "छोटा करो"
+msgstr "ज़ूम रीसेट"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5570,14 +5538,12 @@ msgid ""
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Auto Insert Key"
-msgstr "चाबी यहां डालें"
+msgstr "ऑटो डालें कुंजी"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "ऐनिमेशन लंबाई समय (सेकंड्स)"
+msgstr "एनिमेशन कुंजी और मुद्रा विकल्प"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5636,9 +5602,8 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon3D"
-msgstr "सदस्यता बनाएं"
+msgstr "बहुभुज 3डी बनाएं"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
@@ -5757,9 +5722,8 @@ msgid "Load Curve Preset"
msgstr ""
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
-msgstr "पसंदीदा:"
+msgstr "प्वाइंट जोड़ें"
#: editor/plugins/curve_editor_plugin.cpp
#, fuzzy
@@ -5823,11 +5787,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5839,12 +5803,29 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "एक नया बनाएं"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "एक नया बनाएं"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5896,19 +5877,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "सदस्यता बनाएं"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "सदस्यता बनाएं"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6759,14 +6778,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6831,15 +6842,15 @@ msgid ""
msgstr "जुडिये '%s' to '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "रेखा:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "कार्यों:"
@@ -7204,6 +7215,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7292,17 +7307,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7650,7 +7674,7 @@ msgid "New Animation"
msgstr "एनिमेशन लूप"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8336,7 +8360,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9443,11 +9467,17 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "ज़िप फ़ाइल खोलने में त्रुटि, प्रारूप में नहीं।"
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9455,11 +9485,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9677,6 +9707,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "प्रोजेक्ट मैनेजर"
@@ -9725,6 +9756,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9971,9 +10009,8 @@ msgid "Action:"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "सभी खंड"
+msgstr "कार्य"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
@@ -10041,7 +10078,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Plugins"
-msgstr ""
+msgstr "प्लगइन्स"
#: editor/property_editor.cpp
msgid "Preset..."
@@ -10104,11 +10141,20 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "बदले"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10146,11 +10192,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10176,10 +10222,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10188,11 +10230,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10212,6 +10254,14 @@ msgstr ""
msgid "Reset"
msgstr "रीसेट आकार"
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10275,8 +10325,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "नई स्क्रिप्ट"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10312,6 +10363,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "को हटा दें"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "को हटा दें"
@@ -10438,6 +10494,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10486,11 +10549,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10613,6 +10676,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "फ़ाइल नहीं मौजूद."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "गलत फॉण्ट का आकार |"
@@ -10654,6 +10721,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "अमान्य रास्ता।"
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid class name."
msgstr "गलत फॉण्ट का आकार |"
@@ -10663,7 +10734,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10688,6 +10759,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10762,6 +10839,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "एक नया बनाएं"
@@ -10811,8 +10892,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "‍एक्सपोर्ट प्रोफ़ाइल"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11695,6 +11777,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11719,6 +11805,32 @@ msgstr "गलत फॉण्ट का आकार |"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11902,6 +12014,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12089,6 +12207,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12109,6 +12232,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12330,6 +12458,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12361,6 +12493,37 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "फाइलसिस्टेम और इंपोर्ट डोक्स"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "निर्यात या तैनाती करते समय, परिणामी निष्पादक इस कंप्यूटर के आईपी से जुड़ने का प्रयास "
+#~ "करेगा ताकि डिबग किया जा सके।"
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "वर्तमान दृश्य कभी नहीं बचाया गया था, कृपया इसे चलाने से पहले बचाने के लिए ।"
+
+#~ msgid "Not in resource path."
+#~ msgstr "रेसोर्स पाथ में नहीं."
+
+#~ msgid "Revert"
+#~ msgstr "वापस लौटना"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "इस कार्रवाई को पूर्ववत नहीं किया जा सकता । वैसे भी वापस?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "वापस दृश्य"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "मुद्दा पर नज़र रखने वाला"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "बदल दिया % डी घटना (एस) ।"
+
#, fuzzy
#~ msgid "Brief Description"
#~ msgstr "विवरण:"
diff --git a/editor/translations/hr.po b/editor/translations/hr.po
index bc5abb76fc..ff82f3aafc 100644
--- a/editor/translations/hr.po
+++ b/editor/translations/hr.po
@@ -512,6 +512,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -671,8 +672,9 @@ msgid "Line Number:"
msgstr "Broj linije:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Zamijenjeno %d pojavljivanja."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Zamijeni"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -690,7 +692,7 @@ msgstr ""
msgid "Whole Words"
msgstr "Cijele riječi"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Zamijeni"
@@ -740,6 +742,11 @@ msgid "Method in target node must be specified."
msgstr "Metoda u ciljnom čvoru mora biti određena."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metoda u ciljnom čvoru mora biti određena."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -822,7 +829,6 @@ msgstr "Ne mogu spojiti signal"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -879,6 +885,11 @@ msgid "Signals"
msgstr "Signali"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Iz signala:"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Jesi li siguran da želiš ukloniti sve veze s ovog signala?"
@@ -916,7 +927,7 @@ msgid "Recent:"
msgstr "Nedavno:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Pretraga:"
@@ -1097,6 +1108,9 @@ msgstr "Osnivači projekta"
msgid "Lead Developer"
msgstr "Glavni razvijatelj"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Projektni menadžer "
@@ -1118,6 +1132,16 @@ msgid "Gold Sponsors"
msgstr "Zlatni sponzori"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Srebrni donatori"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Brončani donatori"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini sponzori"
@@ -1422,7 +1446,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1430,16 +1454,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1467,6 +1483,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1586,15 +1606,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1743,7 +1763,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1857,7 +1877,7 @@ msgstr "Direktoriji i datoteke:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Pregled:"
@@ -2270,10 +2290,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2358,11 +2374,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Stvori"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2628,10 +2647,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2691,22 +2706,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2715,8 +2734,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2725,32 +2744,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2810,7 +2829,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2824,7 +2843,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3209,7 +3232,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3236,6 +3260,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3821,19 +3849,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+#, fuzzy
+msgid "%d Files"
+msgstr "Datoteka:"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3849,7 +3882,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3883,10 +3916,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4936,7 +4965,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5678,11 +5707,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5694,11 +5723,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5750,11 +5795,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5762,6 +5836,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6599,14 +6681,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6668,11 +6742,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7036,6 +7110,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7124,17 +7202,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7473,7 +7560,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8135,7 +8222,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9229,11 +9316,17 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Pogreška prilikom otvaranja datoteke paketa, nije u ZIP formatu."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9241,11 +9334,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9460,6 +9553,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9506,6 +9600,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9883,11 +9984,20 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Zamijeni"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9925,11 +10035,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9955,10 +10065,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9967,11 +10073,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9990,6 +10096,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10053,8 +10167,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Spoji sa skriptom:"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10090,6 +10205,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Obriši ključ(eve)"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Obriši ključ(eve)"
@@ -10213,6 +10333,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10259,11 +10386,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10385,6 +10512,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10425,6 +10556,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10433,7 +10568,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10457,6 +10592,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10529,6 +10670,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10577,7 +10722,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11454,6 +11599,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11477,6 +11626,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11654,6 +11829,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11841,6 +12022,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11861,6 +12047,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12080,6 +12271,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
@@ -12108,6 +12303,9 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Zamijenjeno %d pojavljivanja."
+
#, fuzzy
#~ msgid "Brief Description"
#~ msgstr "Opis:"
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
index af13990fdc..cac984d6d6 100644
--- a/editor/translations/hu.po
+++ b/editor/translations/hu.po
@@ -5,17 +5,19 @@
# Árpád Horváth <horvatha4@googlemail.com>, 2018.
# Nagy Lajos <neutron9707@gmail.com>, 2017.
# Sandor Domokos <sandor.domokos@gmail.com>, 2017-2018.
-# Varga Dániel <danikah.danikah@gmail.com>, 2016-2018.
-# Gabor Csordas <gaborcsordas@yahoo.com>, 2018, 2019.
+# Varga Dániel <danikah.danikah@gmail.com>, 2016-2018, 2020.
+# Gabor Csordas <gaborcsordas@yahoo.com>, 2018, 2019, 2020.
# Tusa Gamer <tusagamer@mailinator.com>, 2018.
# Máté Lugosi <mate.lugosi@gmail.com>, 2019.
# sztrovacsek <magadeve@gmail.com>, 2019.
+# Ács Zoltán <acszoltan111@gmail.com>, 2020.
+# cefrebevalo <szmarci711@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-12-26 00:02+0000\n"
-"Last-Translator: sztrovacsek <magadeve@gmail.com>\n"
+"PO-Revision-Date: 2020-09-22 03:23+0000\n"
+"Last-Translator: Ács Zoltán <acszoltan111@gmail.com>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/"
"godot/hu/>\n"
"Language: hu\n"
@@ -23,17 +25,18 @@ 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 3.10\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
-"Érvénytelen típus argumentum a convert()-hez használjon TYPE_* konstansokat."
+"Érvénytelen típusargumentum a convert()-hez használjon TYPE_* konstansokat."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Egy hosszúságú karaktersorozat szükséges."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -43,7 +46,7 @@ msgstr "Nincs elég bájt a bájtok dekódolására, vagy hibás formátum."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Érvénytelen bemenet %i (nem átadott) a kifejezésben."
+msgstr "Érvénytelen bemenet %i (nem átadott) a kifejezésben"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -51,21 +54,19 @@ msgstr "self nem használható, mert a példány null (nincs átadva)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Érvénytelen operandus a %s, %s és %s operátorokhoz."
+msgstr "Érvénytelen operandusok az %s, %s és %s operátorhoz."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "Érvénytelen %s típusú index a %s alap típushoz."
+msgstr ""
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
msgstr "Érvénytelen nevezett index '%s' %s alaptípushoz"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
msgstr ""
-"Érvénytelen típus argumentum a convert()-hez használjon TYPE_* konstansokat."
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -101,7 +102,7 @@ msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "Ingyenes"
+msgstr "Szabad"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -120,25 +121,24 @@ msgid "Value:"
msgstr "Érték:"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Kulcs Beszúrása"
+msgstr "Kulcs beszúrása"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "Kiválasztott elem(ek) megkettőzése"
+msgstr "Kiválasztott kulcs(ok) megkettőzése"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "Kiválasztott kulcsok törlése"
+msgstr "Kiválasztott kulcs(ok) törlése"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr "Bezier pont hozzáadása"
+msgstr "Bézier pont hozzáadása"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr "Bezier pont Mozgatása"
+msgstr "Bézier pontok áthelyezése"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -146,9 +146,10 @@ msgstr "Animáció kulcsok megkettőzése"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Animáció kulcs törlése"
+msgstr "Animáció kulcsok törlése"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Anim Change Keyframe Time"
msgstr "Animáció kulcsképkocka idő változtatás"
@@ -195,7 +196,7 @@ msgstr "Animáció hívás változtatás"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
-msgstr "Animáció hosszának megváltoztatása"
+msgstr "Animáció hosszának változtatása"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -203,31 +204,29 @@ msgid "Change Animation Loop"
msgstr "Animációs ciklus változtatása"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Tulajdonság Követés"
+msgstr "Tulajdonságkövetés"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "UV Térkép Transzformálása"
+msgstr ""
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Hívás módszer követése"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr "Bezier Görbe Nyomvonal"
+msgstr "Bézier görbe nyomvonal"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Hang lejátszás követése"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Animáció lejátszásának leállítása. (S)"
+msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
@@ -238,36 +237,35 @@ msgid "Animation length (seconds)"
msgstr "Animáció hossza (másodpercben)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Animáció nyomvonal hozzáadás"
+msgstr "Nyomvonal hozzáadása"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr "Animáció ismételtetése"
+msgstr "Animáció ismétlése"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr "Funkciók:"
+msgstr "Függvények:"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Audio Clips:"
-msgstr ""
+msgstr "Audió klipek:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Animáció klipek:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Track Path"
-msgstr "Tömb Értékének Megváltoztatása"
+msgstr ""
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Zavarmentes mód váltása."
+msgstr "A sáv ki/be kapcsolása."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
@@ -275,7 +273,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr "Interpoláció mód"
+msgstr "Interpolációs mód"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
@@ -287,14 +285,12 @@ msgid "Remove this track."
msgstr "Kiválasztott nyomvonal eltávolítása."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Áttűnési Idő (mp):"
+msgstr "Idő (mp): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle Track Enabled"
-msgstr "Doppler engedélyezése"
+msgstr ""
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -336,32 +332,27 @@ msgstr ""
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Kulcs Beszúrása"
+msgstr "Kulcs beszúrása"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Animáció kulcsok megkettőzése"
+msgstr "Kulcs(ok) megkettőzése"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Animáció kulcs törlés"
+msgstr "Kulcs(ok) törlése"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
-msgstr "Animáció Nevének Megváltoztatása:"
+msgstr "Animáció frissítés módjának megváltoztatása"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "Animáció Node"
+msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "Animáció hurok változtatás"
+msgstr "Animáció hurok mód változtatása"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -369,11 +360,11 @@ msgstr "Animáció nyomvonal eltávolítás"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr "Létrehoz ÚJ nyomvonalat %s -hez és beilleszti a kulcsot?"
+msgstr "ÚJ nyomvonalat hoz létre a következőhöz: %s, és beszúrja a kulcsot?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "Létrehoz %d ÚJ nyomvonalat és beilleszti a kulcsokat?"
+msgstr "Létrehoz %d ÚJ nyomvonalat és beszúrja a kulcsokat?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -389,19 +380,20 @@ msgstr "Létrehozás"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr "Animáció beillesztés"
+msgstr "Animáció beszúrása"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "Az AnimationPlayer nem tudja animálni önmagát, csak más játékosokat."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "Animáció létrehozás és beillesztés"
+msgstr "Animáció létrehozása és beillesztése"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "Animáció nyomvonal és kulcs beillesztés"
+msgstr "Animáció nyomvonal és kulcs beszúrása"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
@@ -412,9 +404,8 @@ msgid "Change Animation Step"
msgstr "Animáció léptékének megváltoztatása"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "AutoLoad-ok Átrendezése"
+msgstr ""
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
@@ -445,9 +436,8 @@ msgid "Invalid track for Bezier (no suitable sub-properties)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "Animáció nyomvonal hozzáadás"
+msgstr ""
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -458,43 +448,40 @@ msgid "Track is not of type Spatial, can't insert key"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "UV Térkép Transzformálása"
+msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "Animáció nyomvonal hozzáadás"
+msgstr "Nyomvonal kulcs hozzáadása"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "Animáció nyomvonal és kulcs beillesztés"
+msgstr "Metódus nyomvonal kulcs beillesztése"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr ""
+msgstr "A metódus nem található az objektumban: "
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Anim Move Keys"
-msgstr "Animáció kulcs mozgatás"
+msgstr "Animáció kulcsok mozgatása"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Az erőforrás vágólap üres!"
+msgstr "A vágólap üres"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Paraméterek Beillesztése"
+msgstr "Nyomvonalak beillesztése"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Anim Scale Keys"
msgstr "Animáció kulcsok nyújtás"
@@ -518,14 +505,13 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "Figyelmeztetés: Importált animáció szerkesztése"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select an AnimationPlayer node to create and edit animations."
msgstr ""
-"Válasszon egy AnimationPlayer-t a Jelenetfából, hogy animációkat "
-"szerkeszthessen."
+"Válasszon egy AnimationPlayer node-ot az animációk létrehozásához és "
+"szerkesztéséhez."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -536,22 +522,21 @@ msgid "Group tracks by node or display them as plain list."
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "Illesztés"
+msgstr "Illesztés:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Az animációs fa érvényes."
+msgstr "Animáció lépés értéke."
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "Másodperc"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr ""
+msgstr "FPS"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -564,18 +549,16 @@ msgid "Edit"
msgstr "Szerkesztés"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimációFa"
+msgstr "Animáció tulajdonságok."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Paraméterek Másolása"
+msgstr "Nyomvonalak másolása"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
-msgstr "Kiválasztás átméretezés"
+msgstr "Kijelölés átméretezése"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
@@ -583,16 +566,15 @@ msgstr "Átméretezés a kurzortól"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "Kiválasztás megkettőzés"
+msgstr "Kijelölés megkettőzése"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "Áthelyezettek megkettőzés"
+msgstr "Áthelyezettek megkettőzése"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Kijelölés Középre"
+msgstr "Kijelölés törlése"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -600,41 +582,40 @@ msgid "Go to Next Step"
msgstr "Ugrás a következő lépésre"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "Ugrás az előző lépésre"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr "Animáció optimalizálás"
+msgstr "Animáció optimalizálása"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr "Animáció megtisztítás"
+msgstr "Animáció tisztítása"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Válassza ki az animálandó node-ot:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Bézier görbék használata"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr "Animáció Optimalizáló"
+msgstr "Animáció optimalizáló"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr "Max. Lineáris Hiba:"
+msgstr "Maximum lineáris hiba:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr "Max. Szög Hiba:"
+msgstr "Maximum szög hiba:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
-msgstr "Max. Optimalizálható Szög:"
+msgstr "Maximum optimalizálható szög:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
@@ -665,9 +646,8 @@ msgid "Scale Ratio:"
msgstr "Méretezési arány:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "Átmenet beállítása erre:"
+msgstr "Másolandó nyomvonalak kiválasztása"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -679,14 +659,12 @@ msgid "Copy"
msgstr "Másolás"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "Kiválasztó Mód"
+msgstr "Összes/semmi kijelölése"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "Animáció nyomvonal hozzáadás"
+msgstr ""
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -698,56 +676,56 @@ msgstr ""
#: editor/array_property_edit.cpp
msgid "Resize Array"
-msgstr "Tömb Átméretezése"
+msgstr "Tömb átméretezése"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr "Tömb Értéktípusának Megváltoztatása"
+msgstr "Tömb értéktípusának megváltoztatása"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
-msgstr "Tömb Értékének Megváltoztatása"
+msgstr "Tömb értékének megváltoztatása"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "Sorra Ugrás"
+msgstr "Ugrás sorra"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr "Sor Száma:"
+msgstr "Sorszám:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Lecserélve %d előfordulás."
+msgid "%d replaced."
+msgstr "%d lecserélve."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "%d egyezés."
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "Nincs Találat"
+msgstr "%d egyezés."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
-msgstr "Pontos Egyezés"
+msgstr "Nagybetűérzékeny"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr "Teljes Szavak"
+msgstr "Egész szavak"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr "Lecserélés"
+msgstr "Csere"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr "Mind Lecserélése"
+msgstr "Összes cseréje"
#: editor/code_editor.cpp
+#, fuzzy
msgid "Selection Only"
-msgstr "Csak Kiválsztás"
+msgstr "Csak a kijelölés"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
@@ -755,8 +733,9 @@ msgid "Standard"
msgstr ""
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Toggle Scripts Panel"
-msgstr "Szkript Panel Megjelenítése"
+msgstr "Szkript panel váltása"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -772,55 +751,53 @@ msgstr "Kicsinyítés"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Nagyítás Visszaállítása"
+msgstr "Nagyítás visszaállítása"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "Figyelmeztetések"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "Sor és oszlopszámok."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "Nevezze meg a metódust a cél Node-ban!"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "A metódusnévnek érvényes azonosítónak kell lennie."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
-"Nem található a cél metódus! Nevezzen meg egy érvényes metódust, vagy "
-"csatoljon egy szkriptet a cél Node-hoz."
+"Nem található a célmetódus! Nevezzen meg egy érvényes metódust, vagy "
+"csatoljon egy szkriptet a cél node-hoz."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "Csatlakoztatás Node-hoz:"
+msgstr "Csatlakoztatás node-hoz:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "Nem lehet csatlakozni a kiszolgálóhoz:"
+msgstr "Csatlakoztatás szkripthez:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "Jelzések:"
+msgstr "Jelzésből:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Scene does not contain any script."
-msgstr "A Node nem tartalmaz geometriát."
+msgstr "A jelenet nem tartalmaz szkriptet."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr "Hozzáad"
+msgstr "Hozzáadás"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
@@ -831,25 +808,23 @@ msgstr "Hozzáad"
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr "Eltávolít"
+msgstr "Eltávolítás"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "További Meghívási Argumentum Hozzáadása:"
+msgstr "További meghívási argumentum hozzáadása:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr "További Meghívási Argumentumok:"
+msgstr "További hívási argumentumok:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "Objektumtulajdonságok."
+msgstr "Fogadó metódus:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "Illesztési beállítások"
+msgstr "Speciális"
#: editor/connections_dialog.cpp
msgid "Deferred"
@@ -866,18 +841,16 @@ msgstr "Egyszeri"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "Az első kibocsátás után lekapcsolja a jelzést."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "Csatlakoztató Jelzés:"
+msgstr "Nem lehet csatlakoztatni a jelet"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -893,72 +866,70 @@ msgid "Connect"
msgstr "Csatlakoztatás"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "Jelzések:"
+msgstr "Jelzés:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr "'%s' Csatlakoztatása '%s'-hez"
+msgstr "'%s' csatlakoztatása ehhez: '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr "'%s' Lecsatlakoztatása '%s'-ról"
+msgstr "'%s' leválasztása erről: '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "'%s' Lecsatlakoztatása '%s'-ról"
+msgstr "Az összes leválasztása a jelzésről: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
-msgstr "Kapcsolás..."
+msgstr "Csatlakoztatás..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr "Szétkapcsol"
+msgstr "Leválasztás"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "Csatlakoztató Jelzés:"
+msgstr "Jelzés csatlakoztatása metódushoz"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "Kapcsolathiba"
+msgstr "Kapcsolat szerkesztése:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr ""
+msgstr "Biztosan eltávolítja az összes kapcsolatot a(z) \"%s\" jelzésről?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "Jelzések"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Csempék szűrése"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Biztosan eltávolítja az összes kapcsolatot erről a jelzésről?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Szétkapcsol"
+msgstr "Összes lecsatlakoztatása"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Szerkesztés"
+msgstr "Szerkesztés..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Metódusok"
+msgstr "Ugrás metódusra"
#: editor/create_dialog.cpp
msgid "Change %s Type"
-msgstr "%s Típusának Megváltoztatása"
+msgstr "%s típusának megváltoztatása"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
msgid "Change"
@@ -966,7 +937,7 @@ msgstr "Változtatás"
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr "Új %s Létrehozása"
+msgstr "Új %s létrehozása"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
@@ -978,7 +949,7 @@ msgid "Recent:"
msgstr "Legutóbbi:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Keresés:"
@@ -987,7 +958,7 @@ msgstr "Keresés:"
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr "Találatok:"
+msgstr "Egyezések:"
#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
@@ -999,29 +970,27 @@ msgstr "Leírás:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
-msgstr "Csere Keresése:"
+msgstr "Csere keresése:"
#: editor/dependency_editor.cpp
msgid "Dependencies For:"
msgstr "Függőségek:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"'%s' Scene éppen szerkesztés alatt áll.\n"
+"'%s' jelenet éppen szerkesztés alatt áll.\n"
"A változások újratöltés után lépnek érvénybe."
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"'%s' forrás éppen használatban van.\n"
-"A változtatások akkor lépnek életbe, ha a forrást újratölti."
+"A(z) '%s' forrás éppen használatban van.\n"
+"A változtatások újratöltéskor lépnek életbe."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -1061,14 +1030,13 @@ msgstr "Csere Forrás Keresése:"
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
-msgstr "Megnyit"
+msgstr "Megnyitás"
#: editor/dependency_editor.cpp
msgid "Owners Of:"
msgstr "Tulajdonosai:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
msgstr "Eltávolítja a kiválasztott fájlokat a projektből? (nem visszavonható)"
@@ -1090,9 +1058,8 @@ msgid "Error loading:"
msgstr "Hiba betöltéskor:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "A Jelenetet nem sikerült betölteni a hiányzó függőségek miatt:"
+msgstr "A betöltés nem sikerült a hiányzó függőségek miatt:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1115,9 +1082,8 @@ msgid "Permanently delete %d item(s)? (No undo!)"
msgstr "Véglegesen törlöl %d elemet? (Nem visszavonható!)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "Függőségek"
+msgstr "Függőségek megjelenítése"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
@@ -1163,6 +1129,9 @@ msgstr "Projekt Alapítói"
msgid "Lead Developer"
msgstr "Vezető Fejlesztő"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Projekt Kezelő "
@@ -1184,6 +1153,14 @@ msgid "Gold Sponsors"
msgstr "Arany Szponzorok"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Ezüst adományozók"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Bronz adományozók"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Szponzorok"
@@ -1208,9 +1185,8 @@ msgid "License"
msgstr "Licenc"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
-msgstr "Harmadik Fél Engedély"
+msgstr "Harmadik féltől származó licencek"
#: editor/editor_about.cpp
#, fuzzy
@@ -1238,14 +1214,12 @@ msgid "Licenses"
msgstr "Licencek"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Error opening package file, not in ZIP format."
-msgstr "Hiba a csomagfájl megnyitása során, nem zip formátumú."
+msgstr "Hiba a csomagfájl megnyitása során, nem ZIP formátumú."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "Már létezik '%s' AutoLoad!"
+msgstr "'%s' (már létezik)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1253,17 +1227,15 @@ msgstr "Eszközök Kicsomagolása"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "A következő fájlokat nem sikerült kibontani a csomagból:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "%d további fájl"
+msgstr "És további %s fájl."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Package installed successfully!"
-msgstr "A Csomag Telepítése Sikeresen Megtörtént!"
+msgstr "A csomag telepítése sikeres volt!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1271,9 +1243,8 @@ msgid "Success!"
msgstr "Siker!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "Tartalom:"
+msgstr "Csomag tartalma:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1328,9 +1299,8 @@ msgid "Delete Bus Effect"
msgstr "Busz Effektus Törlése"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Drag & drop to rearrange."
-msgstr "Hangbusz, Húzd és Vidd az átrendezéshez."
+msgstr "Az átrendezéshez húzza át."
#: editor/editor_audio_buses.cpp
msgid "Solo"
@@ -1403,7 +1373,7 @@ msgstr "Hangbusz Elrendezés Megnyitása"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "Nincs '%s' fájl."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -1414,18 +1384,16 @@ msgid "Invalid file, not an audio bus layout."
msgstr "Érvénytelen fájl, nem egy hangbusz elrendezés."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Hiba TileSet mentésekor!"
+msgstr "Hiba a fájl mentésekor: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
msgstr "Busz Hozzáadása"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Add a new Audio Bus to this layout."
-msgstr "Hangbusz Elrendezés Mentése Másként..."
+msgstr "Új hangbusz hozzáadása ehhez az elrendezéshez."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1466,24 +1434,21 @@ msgid "Valid characters:"
msgstr "Érvényes karakterek:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing engine class name."
-msgstr "Érvénytelen név. Nem ütközhet egy már meglévő motor osztálynévvel."
+msgstr "Nem ütközhet egy már meglévő játékmotor-osztálynévvel."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
msgstr "Érvénytelen név. Nem ütközhet egy már meglévő beépített típusnévvel."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
msgstr ""
"Érvénytelen név. Nem ütközhet egy már meglévő globális konstans névvel."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "A kulcsszó nem használható automatikus betöltési névként."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
@@ -1505,7 +1470,7 @@ msgstr "AutoLoad Áthelyezése"
msgid "Remove Autoload"
msgstr "AutoLoad Eltávolítása"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Engedélyezés"
@@ -1513,18 +1478,9 @@ msgstr "Engedélyezés"
msgid "Rearrange Autoloads"
msgstr "AutoLoad-ok Átrendezése"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Érvénytelen Elérési Út."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "A fájl nem létezik."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Nincs az erőforrás elérési útban."
+msgid "Can't add autoload:"
+msgstr "Nem lehet hozzáadni az automatikus betöltést:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1551,6 +1507,10 @@ msgstr "Név"
msgid "Singleton"
msgstr "Egyke"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Paraméterek Beillesztése"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Scene Frissítése"
@@ -1572,9 +1532,8 @@ msgid "[unsaved]"
msgstr "[nincs mentve]"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first."
-msgstr "Válasszon egy alap könyvtárat először"
+msgstr "Először válassza ki az alapkönyvtárat."
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
@@ -1608,7 +1567,7 @@ msgstr "Tároló Fájl:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "Nem található export sablon a várt útvonalon:"
#: editor/editor_export.cpp
msgid "Packing"
@@ -1637,15 +1596,14 @@ msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "Sablon fájl nem található:"
+msgstr "Az egyéni hibakeresési sablon nem található."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr ""
+msgstr "Az egyéni kiadási sablon nem található."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
@@ -1656,119 +1614,107 @@ msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "Szerkesztő"
+msgstr "3D szerkesztő"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "Szkript Szerkesztő Megnyitása"
+msgstr "Szkript szerkesztő"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Asset Library"
-msgstr "Eszköz Könyvtár Megnyitása"
+msgstr "Eszköz könyvtár"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "Importálás"
+msgstr "Jelenetfa szerkesztése"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
-msgstr "Mozgás Mód"
+msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "Fájlrendszer"
#: editor/editor_feature_profile.cpp
-#, fuzzy
+msgid "Import Dock"
+msgstr "Dock importálása"
+
+#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr "Mind Lecserélése"
+msgstr "Törli a(z) '%s' profilt? (nem visszavonható)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
msgstr ""
+"A profilnak érvényes fájlnévnek kell lennie, és nem tartalmazhatja a \".\" "
+"karaktert"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Profile with this name already exists."
-msgstr "Egy fájl vagy mappa már létezik a megadott névvel."
+msgstr "Ilyen nevű profil már létezik."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(A szerkesztő letiltva, a tulajdonságok letiltva)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "Tulajdonságok"
+msgstr "(A tulajdonságok le vannak tiltva)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "Tiltva"
+msgstr "(A szerkesztő le van tiltva)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "Leírás:"
+msgstr "Osztály beállítások:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enable Contextual Editor"
-msgstr "Következő Szerkesztő Megnyitása"
+msgstr "Környezetfüggő szerkesztő engedélyezése"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "Tulajdonságok"
+msgstr "Engedélyezett tulajdonságok:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
-msgstr ""
+msgstr "Engedélyezett funkciók:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Classes:"
-msgstr "Osztályok Keresése"
+msgstr "Engedélyezett osztályok:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "A(z) '%s' fájl formátuma érvénytelen, az importálás megszakítva."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
msgstr ""
+"A (z) '%s' profil már létezik. Importálás előtt először távolítsa el azt, "
+"importálás megszakítva."
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "Hiba TileSet mentésekor!"
+msgstr "Hiba történt a profil útvonalba mentése során: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "Nincs beállítva"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "Jelenlegi Verzió:"
+msgstr "Jelenlegi profil:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "Jelenlegi:"
+msgstr "Tegye jelenlegivé"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1786,44 +1732,36 @@ msgid "Export"
msgstr "Exportálás"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "Tulajdonságok"
+msgstr "Elérhető profilok:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "Leírás"
+msgstr "Osztály beállításai"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "New profile name:"
-msgstr "Új név:"
+msgstr "Új profilnév:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "Jobb Egérgomb: Pont Törlése."
+msgstr "Profil törlése"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "Export Sablonok Kezelése"
+msgstr "Godot funkcióprofil"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Import Profile(s)"
-msgstr "%d további fájl"
+msgstr "Profil(ok) importálása"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Export Profile"
-msgstr "Projekt Exportálása"
+msgstr "Profil exportálása"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Manage Editor Feature Profiles"
-msgstr "Export Sablonok Kezelése"
+msgstr "A szerkesztő funkcióprofiljainak kezelése"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
@@ -1834,30 +1772,27 @@ msgid "File Exists, Overwrite?"
msgstr "Fájl Létezik, Felülírja?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Aktuális Mappa Kiválasztása"
+msgstr "Válassza ezt a mappát"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Útvonal másolása"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "Mutat Fájlkezelőben"
+msgstr "Megnyitás a Fájlkezelőben"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Mutat Fájlkezelőben"
+msgstr "Megjelenítés a Fájlkezelőben"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
msgstr "Új Mappa..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Frissítés"
@@ -1911,67 +1846,60 @@ msgstr "Ugrás Fel"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "Rejtett Fájlok Megjelenítése"
+msgstr ""
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "Kedvenc Kapcsolása"
+msgstr ""
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr "Mód Váltása"
+msgstr "Mód váltása"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "Elérési Út Fókuszálása"
+msgstr ""
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "Kedvenc Felfelé Mozgatása"
+msgstr "Kedvenc fentebb helyezése"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "Kedvenc Lefelé Mozgatása"
+msgstr "Kedvenc lentebb helyezése"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Ugrás a szülőmappába"
+msgstr "Ugrás az előző mappára."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Ugrás a szülőmappába"
+msgstr "Ugrás a következő mappára."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "Ugrás a szülőmappába"
+msgstr "Lépjen a szülőmappába."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Osztályok Keresése"
+msgstr "Fájlok frissítése."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "Nem sikerült létrehozni a mappát."
+msgstr "Jelenlegi mappa kedvenccé tétele/eltávolítása a kedvencek közül."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "Rejtett Fájlok Megjelenítése"
+msgstr "A rejtett fájlok láthatóságának ki- és bekapcsolása."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Elemek kirajzolása indexképek rácsába"
+msgstr "Az elemek megtekintése bélyegkép-rácsként."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Elemek listázása"
+msgstr "Elemek megtekintése listaként."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
@@ -1979,7 +1907,7 @@ msgstr "Könyvtárak és Fájlok:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Előnézet:"
@@ -2023,14 +1951,12 @@ msgid "Inherited by:"
msgstr "Őt örökli:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Leírás:"
+msgstr "Leírás"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "Online Oktatóanyagok:"
+msgstr "Online oktatóanyagok"
#: editor/editor_help.cpp
msgid "Properties"
@@ -2038,21 +1964,19 @@ msgstr "Tulajdonságok"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "felülírja:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "Alapértelmezett"
+msgstr "alapértelmezett:"
#: editor/editor_help.cpp
msgid "Methods"
msgstr "Metódusok"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Tulajdonságok"
+msgstr "Téma tulajdonságai"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2063,14 +1987,12 @@ msgid "Constants"
msgstr "Konstansok"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Tulajdonság Leírása:"
+msgstr "Tulajdonságleírások"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Érték:"
+msgstr "(érték)"
#: editor/editor_help.cpp
msgid ""
@@ -2081,9 +2003,8 @@ msgstr ""
"[color=$color][url=$url]hozzájárul eggyel[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Metódus Leírás:"
+msgstr "Metódusleírások"
#: editor/editor_help.cpp
msgid ""
@@ -2096,106 +2017,92 @@ msgstr ""
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr "Keresés Súgóban"
+msgstr "Keresés a súgóban"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
msgstr "Pontos Egyezés"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "Segítők Megjelenítése"
+msgstr "Hierarchia megjelenítése"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Mind Lecserélése"
+msgstr "Az összes megjelenítése"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "Osztályok"
+msgstr "Csak osztályok"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Metódusok"
+msgstr "Csak metódusok"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Jelzések"
+msgstr "Csak jelzések"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Konstansok"
+msgstr "Csak konstansok"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Tulajdonságok"
+msgstr "Csak tulajdonságok"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Tulajdonságok"
+msgstr "Csak tématulajdonságok"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "Tagok"
+msgstr "Tag típusa"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Osztály:"
+msgstr "Osztály"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "Metódusok"
+msgstr "Metódus"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "Jelzések"
+msgstr "Jelzés"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
msgstr "Állandó"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "Tulajdonságok"
+msgstr "Tulajdonság"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "Tulajdonságok"
+msgstr "Téma tulajdonság"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr ""
+msgstr "Tulajdonság:"
#: editor/editor_inspector.cpp
+#, fuzzy
msgid "Set"
-msgstr ""
+msgstr "Beállítás"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Többszörös beállítása:"
#: editor/editor_log.cpp
msgid "Output:"
msgstr "Kimenet:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Kiválasztás eltávolítás"
+msgstr "Kijelölés másolása"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2209,7 +2116,7 @@ msgstr "Töröl"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr "Kimenet Törlése"
+msgstr "Kimenet törlése"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2218,22 +2125,20 @@ msgstr "Leállítás"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Start!"
+msgstr "Start"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "Letöltés"
+msgstr "Le"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "Fel"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
@@ -2241,32 +2146,32 @@ msgstr "Node"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "Bejövő RPC"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "Bejövő RSET"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "Kimenő RPC"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "Kimenő RSET"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "Új ablak"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "Az importált erőforrások nem menthetők."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr ""
+msgstr "OK"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
@@ -2277,6 +2182,8 @@ msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"Ezt az erőforrást nem menthető, mert nem tartozik a szerkesztett jelenethez. "
+"Először tegye egyedivé."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
@@ -2297,6 +2204,7 @@ msgstr "Hiba történt mentés közben."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"A(z) '%s' nem nyitható meg. Lehet, hogy a fájlt áthelyezték vagy törölték."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2346,7 +2254,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Nem lehet felülírni a még nyitott jelenetet!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2393,14 +2301,13 @@ msgstr ""
"jobban megértse ezt a munkafolyamatot."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
-"Ez az erőforrás egy olyan Scene-hez tartozik amit példányosítottak vagy "
+"Ez az erőforrás egy olyan jelenethez tartozik ami példányosított vagy "
"örökölt.\n"
-"A módosítások nem lesznek megtartva a jelenlegi Scene mentésekor."
+"A módosítások nem lesznek megtartva a jelenlegi jelenet mentésekor."
#: editor/editor_node.cpp
msgid ""
@@ -2411,21 +2318,19 @@ msgstr ""
"beállításait az import panelen, és importálja újból."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This scene was imported, so changes to it won't be kept.\n"
"Instancing it or inheriting will allow making changes to it.\n"
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"Ezt a jelenetet importálta, így a rajta végzett módosítások nem lesznek "
+"Ez a jelenetet importált, így a rajta végzett módosítások nem lesznek "
"megtartva.\n"
"Változtatásokat végezhet rajta, ha példányosítja, vagy leszármaztatja.\n"
"Olvassa el a jelenetek importálásáról szóló megfelelő dokumentációt, hogy "
"jobban megértse ezt a munkafolyamatot."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This is a remote object, so changes to it won't be kept.\n"
"Please read the documentation relevant to debugging to better understand "
@@ -2441,11 +2346,6 @@ msgid "There is no defined scene to run."
msgstr "Nincs meghatározva Scene a futtatáshoz."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"A jelenlegi Scene soha nem volt még mentve, mentse el a futtatás előtt."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Az alprocesszt nem lehetett elindítani!"
@@ -2458,9 +2358,8 @@ msgid "Open Base Scene"
msgstr "Alap Scene megnyitás"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "Jelenet gyors megnyitása..."
+msgstr "Gyors megnyitás..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2479,9 +2378,8 @@ msgid "Save changes to '%s' before closing?"
msgstr "Bezárás előtt menti a '%s'-n végzett módosításokat?"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "Nem sikerült betölteni az erőforrást."
+msgstr "%s módosított erőforrás mentve."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
@@ -2513,7 +2411,7 @@ msgstr "Mesh könyvtár exportálás"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr "Ezt a műveletet nem lehet végrehajtani gyökér Node nélkül."
+msgstr "Ezt a műveletet nem lehet végrehajtani gyökér node nélkül."
#: editor/editor_node.cpp
msgid "Export Tile Set"
@@ -2532,12 +2430,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Nem lehet újratölteni egy olyan jelenetet, amit soha nem mentett el."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Visszaállítás"
+msgid "Reload Saved Scene"
+msgstr "Mentett jelenet újratöltése"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Ez a művelet nem vonható vissza. Visszaállítja mindenképp?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Az aktuális jelenet nem mentett módosításokat tartalmaz.\n"
+"A mentett jelenetet mindenképp újratölti? Ez a művelet nem visszavonható."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2549,7 +2451,7 @@ msgstr "Kilépés"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr "Kilépés a szerkesztőből?"
+msgstr "Kilép a szerkesztőből?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
@@ -2557,11 +2459,12 @@ msgstr "Megnyitja a Projektkezelőt?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr "Mentés és Kilépés"
+msgstr "Mentés és kilépés"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr "Elmenti a következő Scene(ek)en végzett változtatásokat kilépés előtt?"
+msgstr ""
+"Elmenti a következő jelenet(ek)en végzett változtatásokat kilépés előtt?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
@@ -2574,8 +2477,8 @@ msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
-"Ez a lehetőség elavult. Az olyan helyzeteket, ahol ki kell kényszeríteni egy "
-"frissítést, már hibának vesszük. Kérjük, jelentse a helyzetet."
+"Ez a lehetőség elavult. Az olyan helyzeteket, ahol kényszeríteni kell egy "
+"frissítést, már hibának vesszük. Kérjük, jelentse ezt."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
@@ -2583,12 +2486,11 @@ msgstr "Válasszon egy Fő Jelenetet"
#: editor/editor_node.cpp
msgid "Close Scene"
-msgstr "Scene bezárás"
+msgstr "Jelenet bezárása"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "Scene bezárás"
+msgstr "Bezárt jelenet újbóli megnyitása"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2607,13 +2509,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Nem sikerült az addon szkript betöltése a következő útvonalról: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Nem sikerült az addon szkript betöltése a következő útvonalról: '%s' A "
-"szkript nem eszközmódban van."
+"Nem lehet betölteni az addon szkriptet a(z) '%s' útvonalról. Úgy tűnik, hiba "
+"történt a kódban, ellenőrizze a szintaxist."
#: editor/editor_node.cpp
msgid ""
@@ -2699,24 +2600,20 @@ msgstr "Alapértelmezett"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "Mutassa a Fájlrendszerben"
+msgstr "Megjelenítés a fájlrendszerben"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Scene futtatás"
+msgstr "Jelenet lejátszása"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "A Többi Lap Bezárása"
+msgstr "Lap bezárása"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "A Többi Lap Bezárása"
+msgstr "Lap bezárásának visszavonása"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2724,12 +2621,11 @@ msgstr "A Többi Lap Bezárása"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "Lapok bezárása ettől jobbra"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "Mind Bezárása"
+msgstr "Minden lap bezárása"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2772,9 +2668,8 @@ msgid "Go to previously opened scene."
msgstr "Ugrás az előzőleg megnyitott jelenetre."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Útvonal másolása"
+msgstr "Szöveg másolása"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2782,7 +2677,7 @@ msgstr "Következő fül"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "Előző fül"
+msgstr "Előző lap"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -2813,9 +2708,8 @@ msgid "Save Scene"
msgstr "Scene mentés"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "Minden Scene mentés"
+msgstr "Az összes jelenet mentése"
#: editor/editor_node.cpp
msgid "Convert To..."
@@ -2840,10 +2734,6 @@ msgid "Redo"
msgstr "Mégis"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Scene visszaállítás"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Egyéb projekt- vagy Scene-szintű eszközök."
@@ -2853,49 +2743,44 @@ msgid "Project"
msgstr "Projekt"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "Projekt Beállítások"
+msgstr "Projekt beállítások..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "Verzió:"
+msgstr "Verziókezelés"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "Verziókezelés beállítása"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "Verzióvezérlő leállítása"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "Exportálás"
+msgstr "Exportálás..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Megnyitja a Projektkezelőt?"
+msgstr "Projektadat-mappa megnyitása"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Eszközök"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "Árva Forrás Kezelő"
+msgstr "Árva erőforrás-kezelő..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "Kilépés a Projektlistába"
+msgstr "Kilépés a projektlistába"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -2908,24 +2793,28 @@ msgstr "Indítás Távoli Teszteléssel"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Exportáláskor vagy telepítéskor az így kapott futtatható program megpróbál "
-"ennek a számítógépnek az IP-jéhez csatlakozni távoli hibakeresés érdekében."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Kis Telepítés Hálózati FS-sel"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Ha ez az opció engedélyezve van, akkor az exportálás vagy a telepítés egy "
"minimális méretű futtatható programot hoz létre.\n"
@@ -2939,9 +2828,10 @@ msgid "Visible Collision Shapes"
msgstr "Látható Ütközési Alakzatok"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Az ütközési alakzatok és a fénysugárkövető Node-ok (mind 2D-hez és 3D-hez) "
"láthatóak lesznek a játék futásakor, ha ez az opció be van kapcsolva."
@@ -2951,23 +2841,26 @@ msgid "Visible Navigation"
msgstr "Látható Navigáció"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"A navigációs hálók és sokszögek láthatóak lesznek a játék futásakor, ha ez "
"az opció be van kapcsolva."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Jelenet változtatások szinkronizálása"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Ha ez a beállítás be van kapcsolva, bármilyen változtatás a jeleneten a "
"szerkesztőben le lesz másolva a futó játékba.\n"
@@ -2975,15 +2868,17 @@ msgstr ""
"fájlrendszerrel együtt."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Szkript Változtatások Szinkronizálása"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Ha ez a beállítás be van kapcsolva, bármilyen szkript, amit elment, újra "
"betöltődik a futó játékba.\n"
@@ -2995,56 +2890,49 @@ msgid "Editor"
msgstr "Szerkesztő"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "Szerkesztő Beállítások"
+msgstr "Szerkesztő beállításai..."
#: editor/editor_node.cpp
msgid "Editor Layout"
msgstr "Szerkesztő Elrendezés"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "Scene mentés"
+msgstr "Képernyőkép készítése"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "Szerkesztő Beállítások"
+msgstr "A képernyőképek a szerkesztő adatai/beállításai mappában tárolódnak."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
msgstr "Teljes Képernyő"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "Mód Váltása"
+msgstr "Rendszerkonzol be- és kikapcsolása"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Szerkesztő Beállítások"
+msgstr "Szerkesztő adatok/beállítások mappa megnyitása"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "A szerkesztő adatmappájának megnyitása"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Szerkesztő Beállítások"
+msgstr "Szerkesztő beállításai mappa megnyitása"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "Export Sablonok Kezelése"
+msgstr "A Szerkesztő funkcióinak kezelése ..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "Export Sablonok Kezelése"
+msgstr "Exportálási sablonok kezelése..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -3055,7 +2943,7 @@ msgstr "Súgó"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Keresés"
@@ -3066,11 +2954,16 @@ msgstr "Online Dokumentáció"
#: editor/editor_node.cpp
msgid "Q&A"
-msgstr "Kérdések és Válaszok"
+msgstr "Kérdések és válaszok"
+
+#: editor/editor_node.cpp
+msgid "Report a Bug"
+msgstr "Hiba bejelentése"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Problémakövető"
+#, fuzzy
+msgid "Send Docs Feedback"
+msgstr "Visszajelzés a Dokumentumokról"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3090,11 +2983,11 @@ msgstr "Játék"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "Szüneteltesse a jelenet végrehajtását a hibakereséshez."
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr "Scene szüneteltetés"
+msgstr "Jelenet szüneteltetése"
#: editor/editor_node.cpp
msgid "Stop the scene."
@@ -3114,37 +3007,33 @@ msgstr "Tetszőleges Scene futtatás"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Tetszőleges Scene futtatás"
+msgstr "Tetszőleges jelenet lejátszása"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
msgstr ""
+"A videó-illesztőprogram módosításához újra kell indítani a szerkesztőt."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Mentés és Kilépés"
+msgstr "Mentés és újraindítás"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Spins when the editor window redraws."
-msgstr "Fordul egyet, amikor a szerkesztőablak újrarajzolódik!"
+msgstr "Pörög, amikor a szerkesztőablak újrarajzolódik."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "Folyamatos"
+msgstr "Folyamatos frissítés"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "Változások Frissítése"
+msgstr "Frissítés, ha megváltozik"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "Frissítési Forgó Kikapcsolása"
+msgstr "Frissítési forgó elrejtése"
#: editor/editor_node.cpp
msgid "FileSystem"
@@ -3155,9 +3044,8 @@ msgid "Inspector"
msgstr "Megfigyelő"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Expand Bottom Panel"
-msgstr "Összes kibontása"
+msgstr "Alsó panel kinyitása"
#: editor/editor_node.cpp
msgid "Output"
@@ -3172,9 +3060,8 @@ msgid "Android build template is missing, please install relevant templates."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "Export Sablonok Kezelése"
+msgstr "Sablonok kezelése"
#: editor/editor_node.cpp
msgid ""
@@ -3200,9 +3087,8 @@ msgid "Import Templates From ZIP File"
msgstr "Sablonok Importálása ZIP Fájlból"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Export Sablon Kezelő"
+msgstr "Sabloncsomag"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3230,7 +3116,7 @@ msgstr "Kiválaszt"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "2D Szerkesztő Megnyitása"
+msgstr "2D szerkesztő megnyitása"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
@@ -3238,7 +3124,7 @@ msgstr "3D Szerkesztő Megnyitása"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "Szkript Szerkesztő Megnyitása"
+msgstr "Szkript szerkesztő megnyitása"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -3254,12 +3140,11 @@ msgstr "Előző Szerkesztő Megnyitása"
#: editor/editor_node.h
msgid "Warning!"
-msgstr ""
+msgstr "Figyelmeztetés!"
#: editor/editor_path.cpp
-#, fuzzy
msgid "No sub-resources found."
-msgstr "Nincs felületi forrás meghatározva."
+msgstr "Nem található alerőforrás."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
@@ -3270,14 +3155,12 @@ msgid "Thumbnail..."
msgstr "Indexkép..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "Szkript Futtatása"
+msgstr "Fő szkript:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Sokszög Szerkesztése"
+msgstr "Bővítmény szerkesztése"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -3301,9 +3184,8 @@ msgid "Status:"
msgstr "Állapot:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Szerkesztés"
+msgstr "Szerkesztés:"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -3346,34 +3228,32 @@ msgid "Calls"
msgstr "Hívások"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Tagok"
+msgstr "Szöveg szerkesztése:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
-msgstr ""
+msgstr "Be"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Réteg"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "%d bit, érték: %d"
#: editor/editor_properties.cpp
msgid "[Empty]"
-msgstr ""
+msgstr "[Üres]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr ""
+msgstr "Hozzárendelés..."
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "Érvénytelen név."
+msgstr ""
#: editor/editor_properties.cpp
msgid ""
@@ -3401,20 +3281,19 @@ msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
-msgstr ""
+msgstr "Új szkript"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Szkript Futtatása"
+msgstr "Szkript kinyitása"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
-msgstr ""
+msgstr "Új %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Make Unique"
-msgstr ""
+msgstr "Egyedivé tétel"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3432,7 +3311,7 @@ msgstr "Beillesztés"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Convert To %s"
-msgstr ""
+msgstr "Átalakítás erre: %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
@@ -3440,35 +3319,35 @@ msgstr ""
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "Méret: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Oldal: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr ""
+msgstr "Elem eltávolítása"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Új név:"
+msgstr "Új kulcs:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Új név:"
+msgstr "Új érték:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Kulcs/érték pár hozzáadása"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Nem található futtatható exportállomány ehhez a platformhoz.\n"
"Adjon hozzá egy futtatható exportállományt az export menüben."
@@ -3497,13 +3376,17 @@ msgstr "Nem sikerült a szkript futtatása:"
msgid "Did you forget the '_run' method?"
msgstr "Nem felejtette el a '_run' metódust?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Válassza ki az importálandó Node-okat"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
-msgstr ""
+msgstr "Tallózás"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
@@ -3514,9 +3397,8 @@ msgid "Import From Node:"
msgstr "Importálás Node-ból:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Redownload"
-msgstr "Letöltés Megint"
+msgstr "Letöltés újra"
#: editor/export_template_manager.cpp
msgid "Uninstall"
@@ -3556,9 +3438,8 @@ msgid "Can't open export templates zip."
msgstr "Nem nyitható meg az export sablon zip."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Érvénytelen version.txt formátum a sablonokban."
+msgstr "Érvénytelen version.txt formátum a sablonokban: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -3578,11 +3459,12 @@ msgstr "Importálás:"
#: editor/export_template_manager.cpp
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "Hiba történt a tükörlista lekérésekor."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
msgstr ""
+"Hiba történt a tükörlista JSON elemzésénél. Kérjük, jelentse ezt a problémát!"
#: editor/export_template_manager.cpp
msgid ""
@@ -3609,7 +3491,7 @@ msgstr "Nincs válasz."
#: editor/export_template_manager.cpp
msgid "Request Failed."
-msgstr "Kérés Sikertelen."
+msgstr "A kérés sikertelen."
#: editor/export_template_manager.cpp
msgid "Redirect Loop."
@@ -3625,20 +3507,21 @@ msgid "Download Complete."
msgstr "A Letöltés Befejeződött."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "Nem eltávolítható:"
+msgstr "Az ideiglenes fájl nem távolítható el:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"A sablonok telepítése nem sikerült.\n"
+"A problémás sablonok archívuma megtalálható a következő helyen: '%s'."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "Hiba történt az url lekérdezésekor: "
+msgstr "Hiba az URL kérésekor:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3687,9 +3570,8 @@ msgid "SSL Handshake Error"
msgstr "SSL-Kézfogás Hiba"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "Eszközök Kicsomagolása"
+msgstr ""
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3708,14 +3590,12 @@ msgid "Remove Template"
msgstr "Sablon Eltávolítása"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
msgstr "Válasszon sablonfájlt"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Export Sablonok Kezelése"
+msgstr "Godot export sablonok"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3726,14 +3606,13 @@ msgid "Download Templates"
msgstr "Sablonok Letöltése"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Válasszon tükröt a listából: "
+msgstr ""
+"Tükör kiválasztása a listából: (Shift + kattintás: megnyitás a böngészőben)"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Kedvencek:"
+msgstr "Kedvencek"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -3766,9 +3645,8 @@ msgid "No name provided."
msgstr "Nincs név megadva."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "A megadott név érvénytelen karaktereket tartalmaz"
+msgstr "A megadott név érvénytelen karaktereket tartalmaz."
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
@@ -3795,33 +3673,28 @@ msgid "Duplicating folder:"
msgstr "Mappa másolása:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "Új örökölt Jelenet..."
+msgstr "Új örökölt Jelenet"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Válasszon egy Fő Jelenetet"
+msgstr "Beállítás fő jelenetként"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Scene megnyitás"
+msgstr "Jelenetek megnyitása"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr "Példány"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "Kedvencek:"
+msgstr "Hozzáadás kedvencekhez"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "Eltávolítás Csoportból"
+msgstr "Eltávolítás a kedvencek közül"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3844,31 +3717,26 @@ msgid "Move To..."
msgstr "Áthelyezés..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "Új Scene"
+msgstr "Új jelenet..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "Szkript gyors megnyitás..."
+msgstr "Új szkript..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Erőforrás Mentése Másként..."
+msgstr "Új erőforrás..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
-msgstr "Összes kibontása"
+msgstr "Összes kinyitása"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "Összes összecsukása"
+msgstr "Összes becsukása"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3878,78 +3746,68 @@ msgid "Rename"
msgstr "Átnevezés"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "Előző Sík"
+msgstr "Előző mappa/fájl"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "Mappa Létrehozása"
+msgstr "Következő mappa/fájl"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
msgstr "Fájlrendszer Újra-vizsgálata"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle Split Mode"
-msgstr "Mód Váltása"
+msgstr "Váltás az osztott módra"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "Osztályok Keresése"
+msgstr "Fájlok keresése"
#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-"Fájlok Vizsgálata,\n"
-"Kérem Várjon..."
+"Fájlok vizsgálata,\n"
+"kérjük várjon..."
#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Áthelyezés"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Egy fájl vagy mappa már létezik a megadott névvel."
+msgstr "Ezen a helyen már van azonos nevű fájl vagy mappa."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Felülírás"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "Scene mentés"
+msgstr "Jelenet létrehozása"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Szkript Létrehozása"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "%d további fájl"
+msgstr "Keresés a fájlokban"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Keres"
+msgstr "Keres:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Mappa Létrehozása"
+msgstr "Mappa:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Szűrők..."
+msgstr "Szűrők:"
#: editor/find_in_files.cpp
msgid ""
@@ -3971,29 +3829,24 @@ msgid "Cancel"
msgstr "Mégse"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "Keres"
+msgstr "Keres: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "Lecserélés"
+msgstr "Csere: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Mind Lecserélése"
+msgstr "Összes lecserélése (nem visszavonható)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Mentés..."
+msgstr "Keresés…"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Keresés a Szövegben"
+msgstr "A keresés kész"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -4004,57 +3857,49 @@ msgid "Remove from Group"
msgstr "Eltávolítás Csoportból"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "HIBA: Animáció név már létezik!"
+msgstr "A csoportnév már létezik."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen csoportnév."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "Csoportok"
+msgstr "Csoport átnevezése"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "Elrendezés Törlése"
+msgstr "Csoport törlése"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Csoportok"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes Not in Group"
-msgstr "Hozzáadás Csoporthoz"
+msgstr "Csoportban nem lévő node-ok"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
msgid "Filter nodes"
-msgstr ""
+msgstr "Node-ok szűrése"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Hozzáadás Csoporthoz"
+msgstr "Node-ok a csoportban"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
-msgstr ""
+msgstr "Az üres csoportok automatikusan törlődnek."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "Szkript Szerkesztő Megnyitása"
+msgstr "Csoportszerkesztő"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Csoportok"
+msgstr "Csoportok kezelése"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -4131,10 +3976,18 @@ msgid "Error running post-import script:"
msgstr "Hiba történt az importálás utána szkript futtatásakor:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Mentés..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d fájl"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Beállítás Alapértelmezettként '%s'-hez"
@@ -4143,48 +3996,45 @@ msgid "Clear Default for '%s'"
msgstr "Alapértelmezett Törlése '%s'-nél"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Fájlok"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importálás Mint:"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "Beépített Beállítások..."
+msgstr "Előre beállított"
#: editor/import_dock.cpp
msgid "Reimport"
msgstr "Újraimportálás"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr ""
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Jelenetek mentése, újraimportálás és újraindítás"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
msgstr ""
+"Az importált fájl típusának módosításához a szerkesztőt újra kell indítani."
#: editor/import_dock.cpp
+#, fuzzy
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
msgstr ""
+"FIGYELMEZTETÉS: Vannak olyan eszközök, amelyek ezt az erőforrást használják, "
+"ezért leállíthatják a megfelelő betöltést."
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
msgstr "Nem sikerült betölteni az erőforrást."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
-msgstr "Összes tulajdonság kibontása"
+msgstr "Összes tulajdonság kinyitása"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "Összes tulajdonság összecsukása"
+msgstr "Összes tulajdonság becsukása"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -4196,13 +4046,8 @@ msgid "Copy Params"
msgstr "Paraméterek Másolása"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Paraméterek Beillesztése"
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Az erőforrás vágólap üres!"
+msgstr "Erőforrás vágólap szerkesztése"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4249,9 +4094,8 @@ msgid "Object properties."
msgstr "Objektumtulajdonságok."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Objektumtulajdonságok."
+msgstr "Tulajdonságok szűrése"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -4262,90 +4106,78 @@ msgid "MultiNode Set"
msgstr "MultiNode Beállítás"
#: editor/node_dock.cpp
-#, fuzzy
msgid "Select a single node to edit its signals and groups."
-msgstr "Válasszon ki egy Node-ot a Jelzések és Csoportok módosításához."
+msgstr "Válasszon ki egy node-ot a jelzések és csoportok módosításához."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Sokszög Szerkesztése"
+msgstr "Bővítmény szerkesztése"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Sokszög Létrehozása"
+msgstr "Bővítmény létrehozása"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Bővítmények"
+msgstr "Bővítmény neve:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Almappa:"
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
msgid "Language:"
-msgstr ""
+msgstr "Nyelv:"
#: editor/plugin_config_dialog.cpp
msgid "Script Name:"
-msgstr ""
+msgstr "Szkript neve:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Aktiválja most?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "Sokszög Létrehozása"
+msgstr "Sokszög létrehozása"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "Pontok Törlése"
+msgstr "Pontok létrehozása."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid ""
"Edit points.\n"
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
-"Meglévő sokszög módosítása:\n"
-"Bal Egérgomb: Pont Mozgatása.\n"
-"Ctrl + Bal Egérgomb: Szakasz Felosztása.\n"
-"Jobb Egérgomb: Pont Eltörlése."
+"Pontok szerkesztése\n"
+"Bal Egérgomb: Pont mozgatása\n"
+"Jobb Egérgomb: Pont törlése"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Erase points."
-msgstr "Jobb Egérgomb: Pont Törlése."
+msgstr "Pontok törlése."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
-msgstr "Sokszög Szerkesztése"
+msgstr "Sokszög szerkesztése"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr "Pont Beszúrása"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon (Remove Point)"
-msgstr "Sokszög Szerkesztése (Pont Eltávolítása)"
+msgstr "Sokszög szerkesztése (pont eltávolítása)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Remove Polygon And Point"
-msgstr "Sokszög és Pont Eltávolítása"
+msgstr "Sokszög és pont eltávolítása"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4359,25 +4191,21 @@ msgstr "Animáció Hozzáadása"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load..."
-msgstr "Betöltés"
+msgstr "Betöltés..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "Pont Mozgatása"
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Limits"
-msgstr "Keverési Idő Módosítása"
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Labels"
-msgstr "Keverési Idő Módosítása"
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4387,20 +4215,17 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "Pont hozzáadása"
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "Animáció Hozzáadása"
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace1D Point"
-msgstr "Útvonal Pont Eltávolítása"
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
@@ -4428,53 +4253,45 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
msgid "Enable snap and show grid."
-msgstr ""
+msgstr "Illesztés engedélyezése és rács megjelenítése."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Pont Mozgatása"
+msgstr "Pont"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Megnyitás Szerkesztőben"
+msgstr "Szerkesztő megnyitása"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Animáció Node"
+msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "HIBA: Animáció név már létezik!"
+msgstr "A háromszög már létezik."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "Animáció nyomvonal hozzáadás"
+msgstr "Háromszög hozzáadása"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace2D Limits"
-msgstr "Keverési Idő Módosítása"
+msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace2D Labels"
-msgstr "Keverési Idő Módosítása"
+msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace2D Point"
-msgstr "Útvonal Pont Eltávolítása"
+msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
@@ -4485,13 +4302,13 @@ msgid "BlendSpace2D does not belong to an AnimationTree node."
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Nincsenek háromszögek, így nem történhet keverés."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Toggle Auto Triangles"
-msgstr "AutoLoad Globálisok Kapcsolása"
+msgstr "Automatikus háromszögek be- és kikapcsolása"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
@@ -4499,7 +4316,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Pontok és háromszögek törlése."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
@@ -4511,9 +4328,8 @@ msgid "Blend:"
msgstr "Keverés:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Parameter Changed"
-msgstr "Változások Frissítése"
+msgstr "A paraméter megváltozott"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4530,9 +4346,8 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Node Moved"
-msgstr "Mozgás Mód"
+msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
@@ -4540,41 +4355,35 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Connected"
-msgstr "Csatlakozva"
+msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Disconnected"
-msgstr "Kapcsolat bontva"
+msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "Animáció"
+msgstr "Animáció beállítása"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Node"
-msgstr "Node létrehozás"
+msgstr "Node törlése"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
-msgstr ""
+msgstr "Node(-ok) törlése"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "Zavarmentes mód váltása."
+msgstr "Szűrő be- és kikapcsolása"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Change Filter"
-msgstr "Animáció hossz változtatás"
+msgstr "Szűrő módosítása"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
@@ -4593,39 +4402,34 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Anim Clips"
-msgstr ""
+msgstr "Animáció klipek"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "Animáció nyomvonal hozzáadás"
+msgstr "Audió klipek"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Funkciók:"
+msgstr "Függvények"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Renamed"
-msgstr "Node neve:"
+msgstr "Node átnevezve"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node..."
-msgstr ""
+msgstr "Node hozzáadása..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Szűrők Szerkesztése"
+msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable Filtering"
-msgstr "Animáció hossz változtatás"
+msgstr "Szűrés engedélyezése"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4654,14 +4458,12 @@ msgid "Remove Animation"
msgstr "Animáció Eltávolítása"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "HIBA: Érvénytelen animáció név!"
+msgstr "Érvénytelen animáció név!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "HIBA: Animáció név már létezik!"
+msgstr "Az animáció név már létezik!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -4685,14 +4487,12 @@ msgid "Duplicate Animation"
msgstr "Animáció Megkettőzése"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "HIBA: Nincs másolható animáció!"
+msgstr "Nincs másolható animáció!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "HIBA: Nincs animációs erőforrás a vágólapon!"
+msgstr "Nincs animációs erőforrás a vágólapon!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -4703,9 +4503,8 @@ msgid "Paste Animation"
msgstr "Animáció Beillesztése"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "HIBA: Nincs animáció szerkesztésre!"
+msgstr "Nincs animáció szerkesztésre!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -4745,14 +4544,12 @@ msgid "Animation"
msgstr "Animáció"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Átmenetek"
+msgstr "Átmenetek szerkesztése..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Megnyitás Szerkesztőben"
+msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -4767,9 +4564,8 @@ msgid "Enable Onion Skinning"
msgstr "Másolópapír Mód Bekapcsolása"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Onion Skinning Options"
-msgstr "Másolópapír Animáció (Onion Skinning)"
+msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Directions"
@@ -4812,9 +4608,8 @@ msgid "Include Gizmos (3D)"
msgstr "Kihatás Gizmókra Is (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Animáció Beillesztése"
+msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -4844,24 +4639,21 @@ msgid "Cross-Animation Blend Times"
msgstr "Animációk Közötti Keverési Idők"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Move Node"
-msgstr "Mozgás Mód"
+msgstr "Node áthelyezése"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Átmenet"
+msgstr "Az átmenet létezik!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "Átmenet"
+msgstr "Átmenet hozzáadása"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node"
-msgstr ""
+msgstr "Node hozzáadása"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
@@ -4869,42 +4661,39 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Azonnal"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Szinkronizálás"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "A végén"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Utazás"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Nincs az erőforrás elérési útban."
+msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
-msgstr "Eltávolít"
+msgstr "Node eltávolítva"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "Átmenet Node"
+msgstr "Átmenet eltávolítva"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
-msgstr ""
+msgstr "Start node beállítása (automatikus lejátszás)"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4914,19 +4703,16 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Új %s Létrehozása"
+msgstr "Új node-ok létrehozása."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Csatlakoztatás Node-hoz:"
+msgstr "Node-ok csatlakoztatása."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Remove selected node or transition."
-msgstr "Kiválasztott nyomvonal eltávolítása."
+msgstr "Kiválasztott node vagy átmenet eltávolítása."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -4937,19 +4723,17 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Átmenet"
+msgstr "Átmenet: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Pásztázás Mód"
+msgstr "Lejátszási mód:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr "AnimációFa"
+msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -5116,37 +4900,32 @@ msgid "Request failed, return code:"
msgstr "Kérés sikertelen, visszatérési kód:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed."
-msgstr "Kérés Sikertelen."
+msgstr "A kérés sikertelen."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Cannot save response to:"
-msgstr "Nem eltávolítható:"
+msgstr "A válasz nem menthető:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Write error."
-msgstr ""
+msgstr "Írási hiba."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
msgstr "Kérés sikertelen, túl sok átirányítás"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Redirect loop."
-msgstr "Átirányítási Hurok."
+msgstr "Hurok átirányítása."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed, timeout"
-msgstr "Kérés sikertelen, visszatérési kód:"
+msgstr "A kérés nem sikerült, időtúllépés"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Timeout."
-msgstr "Idő"
+msgstr "Időtúllépés."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -5171,14 +4950,12 @@ msgid "Asset Download Error:"
msgstr "Eszköz Letöltési Hiba:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Letöltés"
+msgstr "Letöltés (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Letöltés"
+msgstr "Letöltés..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -5193,9 +4970,8 @@ msgid "Idle"
msgstr "Tétlen"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Telepítés"
+msgstr "Telepítés..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -5211,39 +4987,35 @@ msgstr "Ennek az eszköznek a letöltése már folyamatban van!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "Nemrég frissítve"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Legutóbb frissítve"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "Név (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "Név (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "Licenc"
+msgstr "Licenc (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "Licenc"
+msgstr "Licenc (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "első"
+msgstr "Első"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Előző fül"
+msgstr "Előző"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -5251,7 +5023,7 @@ msgstr "Következő"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Utolsó"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "All"
@@ -5259,17 +5031,15 @@ msgstr "Mind"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr ""
+msgstr "Nincs találat a következőre: \"%s\"."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Import..."
-msgstr "Importálás"
+msgstr "Importálás..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Plugins..."
-msgstr "Bővítmények"
+msgstr "Bővítmények..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
@@ -5285,9 +5055,8 @@ msgid "Site:"
msgstr "Oldal:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Support"
-msgstr "Támogatás..."
+msgstr "Támogatás"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -5298,9 +5067,8 @@ msgid "Testing"
msgstr "Tesztelés"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Loading..."
-msgstr "Betöltés"
+msgstr "Betöltés..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
@@ -5337,7 +5105,7 @@ msgid "Bake Lightmaps"
msgstr "Fény Besütése"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Előnézet"
@@ -5355,12 +5123,11 @@ msgstr "Rács Léptetés:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
-msgstr ""
+msgstr "Elsődleges vonal minden:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "steps"
-msgstr "2 lépés"
+msgstr "lépés"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -5371,74 +5138,60 @@ msgid "Rotation Step:"
msgstr "Forgatási Léptetés:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Step:"
-msgstr "Skála:"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
-msgstr "Függőleges vezetővonal mozgatása"
+msgstr "Függőleges segédvonal mozgatása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "Új függőleges vezetővonal létrehozása"
+msgstr "Függőleges segédvonal létrehozása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "Függőleges vezetővonal eltávolítása"
+msgstr "Függőleges segédvonal eltávolítása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
-msgstr "Vízszintes vezetővonal mozgatása"
+msgstr "Vízszintes segédvonal mozgatása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Új vízszintes vezetővonal létrehozása"
+msgstr "Vízszintes segédvonal létrehozása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "Vízszintes vezetővonal eltávolítása"
+msgstr "Vízszintes segédvonal eltávolítása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
-msgstr "Új vízszintes és függőleges vezetővonalak létrehozása"
+msgstr "Vízszintes és függőleges segédvonalak létrehozása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "Forgatási Pont Mozgatása"
+msgstr "Forgatási pont áthelyezése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "CanvasItem Szerkesztése"
+msgstr "CanvasItem forgatása"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Mozgási Művelet"
+msgstr "Horgony áthelyezése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "CanvasItem Szerkesztése"
+msgstr "CanvasItem átméretezése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "CanvasItem Szerkesztése"
+msgstr "CanvasItem méretezése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "CanvasItem Szerkesztése"
+msgstr "CanvasItem áthelyezése"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5457,62 +5210,52 @@ msgid ""
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Left"
-msgstr "Forgató mód"
+msgstr "Bal felső"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Right"
-msgstr "Sokszög Forgatása"
+msgstr "Jobb felső"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Right"
-msgstr "Sokszög Forgatása"
+msgstr "Jobb alsó"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Left"
-msgstr "Forgató mód"
+msgstr "Bal alsó"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Left"
-msgstr "Behúzás Balra"
+msgstr "Bal közép"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Top"
-msgstr "Kijelölés Középre"
+msgstr "Felső közép"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Right"
-msgstr "Behúzás Jobbra"
+msgstr "Jobbra közép"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Bottom"
-msgstr "Kijelölés Középre"
+msgstr "Középre lent"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "Középre"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
-msgstr "Bal lineáris"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Wide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
-msgstr "Jobb lineáris"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Wide"
@@ -5527,13 +5270,13 @@ msgid "HCenter Wide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Full Rect"
-msgstr ""
+msgstr "Teljes téglalap"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "Méretezési arány:"
+msgstr "Arány megtartása"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5563,45 +5306,39 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "Kiválaszt"
+msgstr "Kijelölés zárolása"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock Selected"
-msgstr ""
+msgstr "Kijelölés feloldása"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Group Selected"
-msgstr "Kiválasztás eltávolítás"
+msgstr "Kijelöltek csoportosítása"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Ungroup Selected"
-msgstr "Kiválasztás eltávolítás"
+msgstr "kijelölt csoportok szétbontása"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
msgstr "Póz Beillesztése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Guides"
-msgstr "Póz Törlése"
+msgstr "Segédvonalak törlése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
-msgstr "Kibocsátási Pontok Létrehozása A Mesh Alapján"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Bones"
-msgstr "Póz Törlése"
+msgstr "Csontok törlése"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
@@ -5620,9 +5357,8 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-#, fuzzy
msgid "Zoom Reset"
-msgstr "Kicsinyítés"
+msgstr "Nagyítás visszaállítása"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5650,7 +5386,7 @@ msgstr "Alt + Jobb Egérgomb: Mélységi lista választás"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
-msgstr "Mozgás Mód"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5659,9 +5395,8 @@ msgstr "Forgató mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Kiválasztó Mód"
+msgstr "Méretezési mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5681,32 +5416,26 @@ msgid "Pan Mode"
msgstr "Pásztázás Mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "Kiválasztó Mód"
+msgstr "Vonalzó mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle smart snapping."
-msgstr "Illesztés be- és kikapcsolása"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Smart Snap"
-msgstr "Illesztés Használata"
+msgstr "Intelligens illesztés használata"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle grid snapping."
-msgstr "Illesztés be- és kikapcsolása"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Grid Snap"
-msgstr "Illesztés Használata"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Illesztési beállítások"
@@ -5715,9 +5444,8 @@ msgid "Use Rotation Snap"
msgstr "Forgatási Illesztés Használata"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Scale Snap"
-msgstr "Illesztés Használata"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
@@ -5728,7 +5456,6 @@ msgid "Use Pixel Snap"
msgstr "Pixelhez Illesztés"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Smart Snapping"
msgstr "Intelligens illesztés"
@@ -5738,34 +5465,28 @@ msgid "Configure Snap..."
msgstr "Illesztés Beállítása..."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Parent"
msgstr "Illesztés szülőhöz"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Anchor"
-msgstr "Illesztés Node horgonyhoz"
+msgstr "Illesztés node horgonyhoz"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Sides"
-msgstr "Illesztés Node oldalakhoz"
+msgstr "Illesztés node oldalakhoz"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Center"
-msgstr "Illesztés Node horgonyhoz"
+msgstr "Illesztés node középponthoz"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Other Nodes"
-msgstr "Illesztés más Node-okhoz"
+msgstr "Illesztés más node-okhoz"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Guides"
-msgstr "Illesztés vezetővonalakhoz"
+msgstr "Illesztés segédvonalakhoz"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5788,9 +5509,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Újra kiválaszthatóvá teszi az objektum gyermekeit."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Egyke"
+msgstr "Csontváz beállítások"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -5801,9 +5521,8 @@ msgid "Make Custom Bone(s) from Node(s)"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Csontok Törlése"
+msgstr "Egyéni csontok törlése"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5811,13 +5530,12 @@ msgid "View"
msgstr "Nézet"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Always Show Grid"
-msgstr "Rács Megjelenítése"
+msgstr "Rács megjelenítése mindig"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
-msgstr "Segítők Megjelenítése"
+msgstr "Segítők megjelenítése"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Rulers"
@@ -5837,11 +5555,11 @@ msgstr "Nézet Megjelenítése"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Csoport Megjelenítése és ikonok zárolása"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "Kijelölés Középre"
+msgstr "Kijelölés középre"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
@@ -5864,9 +5582,8 @@ msgid "Scale mask for inserting keys."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys (based on mask)."
-msgstr "Kulcs Beszúrása (Meglévő Nyomvonalakra)"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5877,14 +5594,12 @@ msgid ""
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Auto Insert Key"
-msgstr "Animáció kulcs beillesztés"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Animáció hossza (másodpercben)"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5896,7 +5611,7 @@ msgstr "Póz Másolása"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Pose"
-msgstr "Póz Törlése"
+msgstr "Póz törlése"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
@@ -5907,9 +5622,8 @@ msgid "Divide grid step by 2"
msgstr "Rács Léptetés Mértékének Felezése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Pan View"
-msgstr "Nézet"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -5934,9 +5648,8 @@ msgid "Error instancing scene from %s"
msgstr "Hiba történt a Scene példányosításkor %s-ből"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Change Default Type"
-msgstr "Alapértelmezett típus megváltoztatása"
+msgstr "Alapértelmezett típus módosítása"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5947,9 +5660,8 @@ msgstr ""
"Fogd és vidd + Alt: Node típusának megváltoztatása"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon3D"
-msgstr "Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
@@ -5972,9 +5684,8 @@ msgstr "Kibocsátási Maszk Betöltése"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "Újraindítás (mp):"
+msgstr "Újraindítás"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -6009,9 +5720,8 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "Könyvtárak és Fájlok:"
+msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -6021,12 +5731,12 @@ msgstr "Kinyerés Pixelből"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Colors"
-msgstr "Kibocsátási Színek"
+msgstr "Kibocsátási színek"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#, fuzzy
msgid "CPUParticles"
-msgstr "Részecskék"
+msgstr "CPU-részecskék"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -6044,7 +5754,6 @@ msgid "Flat 0"
msgstr "Lapos 0"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Flat 1"
msgstr "Lapos 1"
@@ -6073,22 +5782,18 @@ msgid "Load Curve Preset"
msgstr "Előre Beállított Görbe Betöltése"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
msgstr "Pont hozzáadása"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
msgstr "Pont eltávolítása"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Left Linear"
msgstr "Bal lineáris"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right Linear"
msgstr "Jobb lineáris"
@@ -6110,9 +5815,8 @@ msgid "Hold Shift to edit tangents individually"
msgstr "Tartsa lenyomva a Shift gombot az érintők egyenkénti szerkesztéséhez"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right click to add point"
-msgstr "Jobb Kattintás: Pont Törlése"
+msgstr "Kattintson a jobb gombbal a pont hozzáadásához"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
@@ -6120,7 +5824,7 @@ msgstr "GI Szonda Besütése"
#: editor/plugins/gradient_editor_plugin.cpp
msgid "Gradient Edited"
-msgstr ""
+msgstr "Színátmenet szerkesztve"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
@@ -6143,30 +5847,44 @@ msgid "Mesh is empty!"
msgstr "A háló üres!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Statikus Trimesh Test Létrehozása"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Statikus Konvex Test Létrehozása"
+msgid "Create Static Trimesh Body"
+msgstr "Statikus Trimesh Test Létrehozása"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
msgstr "Ez nem hajtható végre a gyökér Scene-en!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Trimesh Static Shape"
-msgstr "Trimesh Alakzat Létrehozása"
+msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Shape(s)"
-msgstr "Konvex Alakzat Létrehozása"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Konvex alakzat létrehozása"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Nem sikerült ütközési alakzatokat létrehozni."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Több konvex alakzat létrehozása"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -6218,19 +5936,55 @@ msgid "Create Trimesh Static Body"
msgstr "Trimesh Statikus Test Létrehozása"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Trimesh Ütközési Testvér Létrehozása"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Konvex Ütközési Testvér Létrehozása"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Konvex ütközési testvér létrehozása"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Több konvex ütközési testvér létrehozása"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Körvonalháló Létrehozása..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "UV1 Megtekintése"
@@ -6259,16 +6013,16 @@ msgid "Remove item %d?"
msgstr "%d elem eltávolítása?"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Frissítés Jelenetből"
+msgstr ""
+"Frissíti a meglévő jelenetből?:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid "Mesh Library"
-msgstr "MeshLibrary-ra..."
+msgstr "MeshLibrary"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6389,12 +6143,11 @@ msgstr "Navigációs Sokszög Létrehozása"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
msgid "Convert to CPUParticles"
-msgstr "Konvertálás Nagybetűsre"
+msgstr "Konvertálás CPU-részecskékké"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
-msgstr "Láthatósági Téglalap Generálása"
+msgstr "Láthatósági téglalap generálása"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generate Visibility Rect"
@@ -6414,23 +6167,20 @@ msgid "The geometry's faces don't contain any area."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "The geometry doesn't contain any faces."
-msgstr "A Node nem tartalmaz geometriát (oldalakat)."
+msgstr "A geometria nem tartalmaz oldalakat."
#: editor/plugins/particles_editor_plugin.cpp
msgid "\"%s\" doesn't inherit from Spatial."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "\"%s\" doesn't contain geometry."
-msgstr "A Node nem tartalmaz geometriát."
+msgstr "A(z) \"%s\" nem tartalmaz geometriát."
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "\"%s\" doesn't contain face geometry."
-msgstr "A Node nem tartalmaz geometriát."
+msgstr "A(z) \"%s\" nem tartalmaz lapgeometriát."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6490,9 +6240,8 @@ msgid "Add Point to Curve"
msgstr "Pont Hozzáadása a Görbéhez"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Split Curve"
-msgstr "Görbe Lezárása"
+msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
@@ -6522,9 +6271,8 @@ msgid "Click: Add Point"
msgstr "Kattintás: Pont Hozzáadása"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Left Click: Split Segment (in curve)"
-msgstr "Szakasz Felosztása (görbén)"
+msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -6603,9 +6351,8 @@ msgid "Split Segment (in curve)"
msgstr "Szakasz Felosztása (görbén)"
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move Joint"
-msgstr "Pont Mozgatása"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
@@ -6613,9 +6360,8 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones"
-msgstr "Csontok Mutatása"
+msgstr "Csontok szinkronizálása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
@@ -6634,51 +6380,44 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Sokszög Létrehozása"
+msgstr "Sokszög és UV létrehozása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Internal Vertex"
-msgstr "Új vízszintes vezetővonal létrehozása"
+msgstr "Belső csúcspont létrehozása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Internal Vertex"
-msgstr "Be-Vezérlő Pont Eltávolítása"
+msgstr "Belső csúcspont eltávolítása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Add Custom Polygon"
-msgstr "Sokszög Szerkesztése"
+msgstr "Egyéni sokszög hozzáadása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Custom Polygon"
-msgstr "Sokszög és Pont Eltávolítása"
+msgstr "Egyéni sokszög eltávolítása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "UV Térkép Transzformálása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Transform Polygon"
-msgstr "Sokszög Létrehozása"
+msgstr "Sokszög átalakítása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Open Polygon 2D UV editor."
-msgstr "2D UV Sokszög Szerkesztő"
+msgstr "2D UV sokszög szerkesztő megnyitása."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -6689,24 +6428,20 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Points"
-msgstr "Pont Mozgatása"
+msgstr "Pontok"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Polygons"
-msgstr "Sokszög -> UV"
+msgstr "Sokszögek"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Csontok Létrehozása"
+msgstr "Csontok"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Points"
-msgstr "Pont Mozgatása"
+msgstr "Pontok mozgatása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -6767,9 +6502,8 @@ msgid "Clear UV"
msgstr "UV Törlése"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Szerkesztő Beállítások"
+msgstr "Rács beállításai"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
@@ -6788,34 +6522,29 @@ msgid "Show Grid"
msgstr "Rács Megjelenítése"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Illesztés Beállítása"
+msgstr "Rács beállítása:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Rács Eltolás:"
+msgstr "Rács X eltolása:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Rács Eltolás:"
+msgstr "Rács Y eltolása:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Rács Léptetés:"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Rács Léptetés:"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Sokszög Skálázása"
+msgstr "Csontok szinkronizálása a sokszöggel"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -6872,9 +6601,8 @@ msgid "AnimationTree has no path set to an AnimationPlayer"
msgstr ""
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Az animációs fa érvénytelen."
+msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -6885,54 +6613,44 @@ msgid "Close and save changes?"
msgstr "Bezárja és menti a változásokat?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Hiba TileSet mentésekor!"
+msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "Nem sikerült létrehozni a mappát."
+msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Hiba TileSet mentésekor!"
+msgstr "Hiba a fájl mentésekor!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "HIba történt a téma mentésekor"
+msgstr "Hiba történt a téma mentésekor."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
-msgstr "Hiba mentés közben"
+msgstr "Hiba a mentéskor"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "Hiba történt a téma importálásakor"
+msgstr "Hiba történt a téma importálásakor."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
msgstr "Hiba importáláskor"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
-msgstr "Új Mappa..."
+msgstr "Új szövegfájl..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "Fálj Megnyitása"
+msgstr "Fájl megnyitása"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Mentés Másként..."
+msgstr "Fájl mentése másként..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
@@ -6968,9 +6686,8 @@ msgid "Save Theme As..."
msgstr "Téma Mentése Másként..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "%s Class Reference"
-msgstr " Osztály Referencia"
+msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -6983,18 +6700,16 @@ msgid "Find Previous"
msgstr "Előző Keresése"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "Objektumtulajdonságok."
+msgstr "Szkriptek szűrése"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter methods"
-msgstr "Objektumtulajdonságok."
+msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -7025,14 +6740,12 @@ msgid "File"
msgstr "Fájl"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open..."
-msgstr "Megnyit"
+msgstr "Megnyitás..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Reopen Closed Script"
-msgstr "Szkript Futtatása"
+msgstr "Bezárt szkript újbóli megnyitása"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -7047,9 +6760,8 @@ msgid "Copy Script Path"
msgstr "Szkript Útvonal Másolása"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
-msgstr "Előző Előzmény"
+msgstr "Előző előzmény"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -7061,9 +6773,8 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Import Theme..."
-msgstr "Téma Importálása"
+msgstr "Téma importálása..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
@@ -7107,22 +6818,12 @@ msgid "Keep Debugger Open"
msgstr "Hibakereső Nyitva Tartása"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
msgstr "Hibakeresés külső szerkesztővel"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "Godot online dokumentáció megnyitása"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
+msgstr "Godot online dokumentáció megnyitása."
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
@@ -7163,22 +6864,18 @@ msgid "Debugger"
msgstr "Hibakereső"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "Keresés Súgóban"
+msgstr "Keresési eredmények"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Clear Recent Scripts"
-msgstr "Legutóbbi Jelenetek Törlése"
+msgstr "Legutóbbi szkriptek törlése"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Connections to method:"
-msgstr "Csatlakoztatás Node-hoz:"
+msgstr ""
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source"
msgstr "Forrás"
@@ -7187,24 +6884,21 @@ msgid "Target"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "'%s' Lecsatlakoztatása '%s'-ról"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Line"
-msgstr "Sor:"
+msgid "[Ignore]"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Ugrás Funkcióra..."
+msgstr "Ugrás függvényre"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -7216,9 +6910,8 @@ msgid "Can't drop nodes because script '%s' is not used in this scene."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Szimbólum Befejezése"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -7255,9 +6948,8 @@ msgid "Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Breakpoints"
-msgstr "Pontok Törlése"
+msgstr "Töréspontok"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -7306,66 +6998,56 @@ msgid "Complete Symbol"
msgstr "Szimbólum Befejezése"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Evaluate Selection"
-msgstr "Kiválasztás átméretezés"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Sorvégi Szóközök Lenyírása"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
-msgstr "Behúzások Átkonvertálása Szóközökre"
+msgstr "Behúzás átalakítása szóközökké"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
-msgstr "Behúzások Átkonvertálása Tabokra"
+msgstr "Behúzás átalakítása tabokra"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
msgstr "Automatikus Behúzás"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
-msgstr "Fájlok Szűrése..."
+msgstr "Keresés a fájlokban..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
msgstr "Kontextusérzékeny Súgó"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Toggle Bookmark"
-msgstr "Töréspont Elhelyezése"
+msgstr "Könyvjelző be- és kikapcsolása"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Bookmark"
-msgstr "Ugrás Következő Töréspontra"
+msgstr "Ugrás a következő könyvjelzőre"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Bookmark"
-msgstr "Ugrás Előző Töréspontra"
+msgstr "Ugrás az előző könyvjelzőre"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Remove All Bookmarks"
-msgstr "Összes Töréspont Eltávolítása"
+msgstr "Összes könyvjelző eltávolítása"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
-msgstr "Ugrás Funkcióra..."
+msgstr "Ugrás függvényre..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "Ugrás Sorra..."
+msgstr "Ugrás sorra..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -7377,23 +7059,18 @@ msgid "Remove All Breakpoints"
msgstr "Összes Töréspont Eltávolítása"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
-msgstr "Ugrás Következő Töréspontra"
+msgstr "Ugrás a következő töréspontra"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
-msgstr "Ugrás Előző Töréspontra"
+msgstr "Ugrás az előző töréspontra"
#: editor/plugins/shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"A alábbi fájlok újabbak a lemezen.\n"
-"Mit szeretne lépni?:"
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
@@ -7404,9 +7081,8 @@ msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr ""
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Rest Pose from Bones"
-msgstr "Kibocsátási Pontok Létrehozása A Mesh Alapján"
+msgstr ""
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Rest Pose to Bones"
@@ -7415,7 +7091,7 @@ msgstr ""
#: editor/plugins/skeleton_2d_editor_plugin.cpp
#, fuzzy
msgid "Skeleton2D"
-msgstr "Egyke"
+msgstr "Csontváz2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
@@ -7426,23 +7102,20 @@ msgid "Set Bones to Rest Pose"
msgstr ""
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Navigációs Háló Létrehozása"
+msgstr "Fizikai csontok létrehozása"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Egyke"
+msgstr "Csontváz"
#: editor/plugins/skeleton_editor_plugin.cpp
msgid "Create physical skeleton"
msgstr ""
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Játék"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -7585,6 +7258,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7629,14 +7306,12 @@ msgid "Audio Listener"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Enable Doppler"
-msgstr "Animáció hossz változtatás"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Háló Előnézetek Létrehozása"
+msgstr "Filmszerű előnézet"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
@@ -7675,23 +7350,31 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Snap Nodes To Floor"
-msgstr "Rácshoz illesztés"
+msgstr "Node-ok illesztése a padlóhoz"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
@@ -7762,9 +7445,8 @@ msgid "Transform"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Snap Object to Floor"
-msgstr "Rácshoz illesztés"
+msgstr "Objektum illesztése a padlóhoz"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -7808,9 +7490,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Settings..."
-msgstr "Szerkesztő Beállítások"
+msgstr "Beállítások..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7877,48 +7558,40 @@ msgid "Nameless gizmo"
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Mesh2D"
-msgstr "Körvonalháló Készítése"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Mesh2D Preview"
-msgstr "Háló Előnézetek Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon2D"
-msgstr "Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Polygon2D Preview"
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D"
-msgstr "Navigációs Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "CollisionPolygon2D Preview"
-msgstr "Navigációs Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D"
-msgstr "Árnyékoló Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "LightOccluder2D Preview"
-msgstr "Árnyékoló Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "A háló üres!"
+msgstr "A Sprite üres!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
@@ -7929,36 +7602,32 @@ msgid "Invalid geometry, can't replace by mesh."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Mesh2D"
-msgstr "Konvertálás Nagybetűsre"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Polygon2D"
-msgstr "Sokszög Mozgatása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D Sibling"
-msgstr "Navigációs Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D Sibling"
-msgstr "Árnyékoló Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite"
@@ -7977,19 +7646,16 @@ msgid "Grow (Pixels): "
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Előnézet"
+msgstr "Előnézet frissítése"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Szerkesztő Beállítások"
+msgstr "Beállítások:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "Kijelölés Keretezése"
+msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add %d Frame(s)"
@@ -8000,9 +7666,8 @@ msgid "Add Frame"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "Nem sikerült betölteni az erőforrást."
+msgstr "Nem lehet betölteni a képeket"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -8029,22 +7694,19 @@ msgid "(empty)"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move Frame"
-msgstr "Mozgás Mód"
+msgstr "Keret mozgatása"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animations:"
-msgstr "Animáció"
+msgstr "Animációk:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "New Animation"
-msgstr "Animáció"
+msgstr "Új animáció"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8054,12 +7716,11 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
msgid "Animation Frames:"
-msgstr "Animáció Neve:"
+msgstr "Animációs képkockák:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "Kinyerés Pixelből"
+msgstr "Textúra hozzáadása fájlból"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
@@ -8082,9 +7743,8 @@ msgid "Move (After)"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "Kiválasztó Mód"
+msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
@@ -8095,9 +7755,8 @@ msgid "Vertical:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select/Clear All Frames"
-msgstr "Összes Kijelölése"
+msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Create Frames from Sprite Sheet"
@@ -8114,7 +7773,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#, fuzzy
msgid "Set Margin"
-msgstr "Fogantyú Beállítása"
+msgstr "Margó beállítása"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
@@ -8170,9 +7829,8 @@ msgid "Remove All"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "Tagok"
+msgstr "Téma szerkesztése"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
@@ -8199,23 +7857,20 @@ msgid "Create From Current Editor Theme"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Button"
-msgstr "Automatikus Lejátszás Váltása"
+msgstr "Váltógomb"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Button"
-msgstr "Tiltva"
+msgstr "Letiltott gomb"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Item"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Item"
-msgstr "Tiltva"
+msgstr "Letiltott elem"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Check Item"
@@ -8244,12 +7899,12 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
msgid "Subitem 1"
-msgstr "%d elem"
+msgstr "Alelem 1"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
msgid "Subitem 2"
-msgstr "%d elem"
+msgstr "Alelem 2"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
@@ -8260,9 +7915,8 @@ msgid "Many"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled LineEdit"
-msgstr "Tiltva"
+msgstr "Letiltott szerkesztősor"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -8277,9 +7931,8 @@ msgid "Tab 3"
msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Editable Item"
-msgstr "Rádió Elem"
+msgstr "Szerkeszthető elem"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
@@ -8296,7 +7949,7 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon"
-msgstr ""
+msgstr "Ikon"
#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Style"
@@ -8304,31 +7957,28 @@ msgstr "Stílus"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Font"
-msgstr ""
+msgstr "Betűtípus"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Color"
msgstr "Szín"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme File"
-msgstr "Fálj Megnyitása"
+msgstr "Témafájl"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen csempék javítása"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Kijelölés Középre"
+msgstr "Kijelölés kivágása"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -8336,7 +7986,7 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Line Draw"
-msgstr ""
+msgstr "Vonal rajzolás"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
@@ -8351,9 +8001,8 @@ msgid "Erase TileMap"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Következő Keresése"
+msgstr "Csempe keresése"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -8366,12 +8015,11 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
msgid "Enable Priority"
-msgstr "Szűrők Szerkesztése"
+msgstr "Prioritás engedélyezése"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter tiles"
-msgstr "Fájlok Szűrése..."
+msgstr "Csempék szűrése"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
@@ -8392,14 +8040,12 @@ msgid "Pick Tile"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Left"
-msgstr "Forgató mód"
+msgstr "Forgatás balra"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Right"
-msgstr "Sokszög Forgatása"
+msgstr "Forgatás jobbra"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
@@ -8410,9 +8056,8 @@ msgid "Flip Vertically"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Transform"
-msgstr "Animáció transzformáció változtatás"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet."
@@ -8421,11 +8066,11 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "Jelenlegi tétel eltávolítása"
+msgstr "Távolítsa el a kijelölt textúrát a csempekészletből."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
-msgstr ""
+msgstr "Létrehozás jelenetből"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
@@ -8436,27 +8081,24 @@ msgid "New Single Tile"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Autotile"
-msgstr "Fájlok Megtekintése"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Atlas"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Next Coordinate"
-msgstr "Következő Szkript"
+msgstr "Következő koordináta"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Previous Coordinate"
-msgstr "Előző Szkript"
+msgstr "Előző koordináta"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
@@ -8465,101 +8107,84 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "Region"
-msgstr "Forgató mód"
+msgstr "Régió"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision"
-msgstr "Animáció Node"
+msgstr "Ütközés"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion"
-msgstr "Sokszög Szerkesztése"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation"
-msgstr "Navigációs Háló Létrehozása"
+msgstr "Navigáció"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "Bitmask"
-msgstr "Forgató mód"
+msgstr "Bitmaszk"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority"
-msgstr "Projekt Exportálása"
+msgstr "Prioritás"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index"
-msgstr "Pásztázás Mód"
+msgstr "Z index"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region Mode"
-msgstr "Forgató mód"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision Mode"
-msgstr "Animáció Node"
+msgstr "Ütközési mód"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion Mode"
-msgstr "Sokszög Szerkesztése"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation Mode"
-msgstr "Navigációs Háló Létrehozása"
+msgstr "Navigációs mód"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask Mode"
-msgstr "Forgató mód"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "Projekt Exportálása"
+msgstr "Prioritás mód"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Icon Mode"
-msgstr "Pásztázás Mód"
+msgstr "Ikon mód"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index Mode"
-msgstr "Pásztázás Mód"
+msgstr "Z index mód"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste bitmask."
-msgstr "Animáció Beillesztése"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Erase bitmask."
-msgstr "Jobb Egérgomb: Pont Törlése."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "Új %s Létrehozása"
+msgstr "Új téglalap létrehozása."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new polygon."
-msgstr "Új sokszög létrehozása a semmiből."
+msgstr "Új sokszög létrehozása."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
@@ -8579,9 +8204,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "Jelenlegi tétel eltávolítása"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
@@ -8596,9 +8220,8 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Texture"
-msgstr "Sablon Eltávolítása"
+msgstr "Textúra eltávolítása"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
@@ -8611,9 +8234,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "Törli a kiválasztott fájlokat?"
+msgstr "A kijelölt téglalap törlése."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8622,9 +8244,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
-msgstr "Pontok Törlése"
+msgstr "Sokszög törlése."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8658,133 +8279,112 @@ msgid "Set Tile Region"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Tile"
-msgstr "Mappa Létrehozása"
+msgstr "Csempe létrehozása"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Icon"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Tile Bitmask"
-msgstr "Szűrők Szerkesztése"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Collision Polygon"
-msgstr "Létező sokszög szerkesztése:"
+msgstr "Ütközési sokszög szerkesztése"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Occlusion Polygon"
-msgstr "Sokszög Szerkesztése"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Navigation Polygon"
-msgstr "Navigációs Sokszög Létrehozása"
+msgstr "Navigációs sokszög szerkesztése"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste Tile Bitmask"
-msgstr "Animáció Beillesztése"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Clear Tile Bitmask"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Polygon Concave"
-msgstr "Sokszög Mozgatása"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Polygon Convex"
-msgstr "Sokszög Mozgatása"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Tile"
-msgstr "Sablon Eltávolítása"
+msgstr "Csempe eltávolítása"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Collision Polygon"
-msgstr "Sokszög és Pont Eltávolítása"
+msgstr "Ütközési sokszög eltávolítása"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Occlusion Polygon"
-msgstr "Árnyékoló Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Navigation Polygon"
-msgstr "Navigációs Sokszög Létrehozása"
+msgstr "Navigációs sokszög eltávolítása"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Tile Priority"
-msgstr "Szűrők Szerkesztése"
+msgstr "Csempeprioritás szerkesztése"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Convex"
-msgstr "Sokszög Mozgatása"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
-msgstr "Sokszög Mozgatása"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Collision Polygon"
-msgstr "Navigációs Sokszög Létrehozása"
+msgstr "Ütközési sokszög létrehozása"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Occlusion Polygon"
-msgstr "Árnyékoló Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "Ezt a műveletet nem lehet végrehajtani egy Scene nélkül."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "TileSet"
-msgstr "TileSet-re..."
+msgstr "Csempekészlet"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "No commit message was provided"
-msgstr "Nincs név megadva"
+msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Commit"
-msgstr "Közösség"
+msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
msgid "VCS Addon is not initialized"
@@ -8797,59 +8397,51 @@ msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
msgid "Initialize"
-msgstr "Szó Eleji Nagybetű"
+msgstr "Inicializálás"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Detect new changes"
-msgstr "Új %s Létrehozása"
+msgstr "Új változások észlelése"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Changes"
-msgstr "Változtatás"
+msgstr "Változások"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Modified"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Renamed"
-msgstr "Átnevezés"
+msgstr "Átnevezve"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Deleted"
-msgstr "Törlés"
+msgstr "Törölve"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Typechange"
-msgstr "Változtatás"
+msgstr "Típusmódosítás"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Stage Selected"
-msgstr "Kiválasztás átméretezés"
+msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Stage All"
-msgstr "Összes Mentése"
+msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Commit Changes"
-msgstr "Szkript Változtatások Szinkronizálása"
+msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
@@ -8873,19 +8465,16 @@ msgid "(GLES3 only)"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Output"
-msgstr "Bemenet Hozzáadása"
+msgstr "Kimenet hozzáadása"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "Skála:"
+msgstr "Skalár"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector"
-msgstr "Megfigyelő"
+msgstr "Vektor"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
@@ -8896,81 +8485,70 @@ msgid "Sampler"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "Bemenet Hozzáadása"
+msgstr "Bemeneti port hozzáadása"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "Alapértelmezett típus megváltoztatása"
+msgstr "A bemeneti port típusának módosítása"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "Alapértelmezett típus megváltoztatása"
+msgstr "Kimeneti port típusának módosítása"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "Animáció Nevének Megváltoztatása:"
+msgstr "A bemeneti port nevének módosítása"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Change output port name"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "Pont eltávolítása"
+msgstr "Bemeneti port eltávolítása"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "Pont eltávolítása"
+msgstr "Kimeneti port eltávolítása"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Set expression"
-msgstr "Jelenlegi Verzió:"
+msgstr "Kifejezés beállítása"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Resize VisualShader node"
-msgstr "Árnyaló"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set Input Default Port"
-msgstr "Beállítás Alapértelmezettként '%s'-hez"
+msgstr "Alapértelmezett bemeneti port beállítása"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Node to Visual Shader"
-msgstr "Árnyaló"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Nodes"
-msgstr "Animáció kulcsok megkettőzése"
+msgstr "Node-ok duplikálása"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste Nodes"
-msgstr ""
+msgstr "Node-ok beillesztése"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Nodes"
-msgstr "Node létrehozás"
+msgstr "Node-ok törlése"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Input Type Changed"
@@ -8989,28 +8567,25 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Show resulted shader code."
-msgstr "Node létrehozás"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Create Shader Node"
-msgstr "Node létrehozás"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Color function."
-msgstr "Ugrás Funkcióra..."
+msgstr "Szín függvény."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "Funkció Készítése"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
@@ -9021,9 +8596,8 @@ msgid "Converts RGB vector to HSV equivalent."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "Funkció Készítése"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
@@ -9034,18 +8608,16 @@ msgid "Darken operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Difference operator."
-msgstr "Csak A Különbségek"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "HardLight operator."
-msgstr "Skaláris kezelő változtatás"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
@@ -9066,12 +8638,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Color constant."
-msgstr "Állandó"
+msgstr "Színállandó."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "Animáció transzformáció változtatás"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
@@ -9142,7 +8713,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Boolean constant."
-msgstr "Vec állandó változtatás"
+msgstr "Logikai állandó."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
@@ -9155,7 +8726,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Input parameter."
-msgstr "Illesztés szülőhöz"
+msgstr "Bemeneti paraméter."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
@@ -9184,12 +8755,12 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Scalar function."
-msgstr "Skalár-függvény változtatás"
+msgstr "Skalárfüggvény."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Scalar operator."
-msgstr "Skaláris kezelő változtatás"
+msgstr "Skalár operátor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
@@ -9416,12 +8987,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Scalar constant."
-msgstr "Skaláris állandó változtatás"
+msgstr "Skaláris állandó."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "Egységes-skalár változtatás"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
@@ -9444,9 +9014,8 @@ msgid "2D texture uniform lookup with triplanar."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9488,24 +9057,22 @@ msgid "Multiplies vector by transform."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "Sokszög Létrehozása"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vector function."
-msgstr "Ugrás Funkcióra..."
+msgstr "Vektor függvény."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vector operator."
-msgstr "Vec kezelő változtatás"
+msgstr "Vektor operátor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
@@ -9624,12 +9191,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Vector constant."
-msgstr "Vec állandó változtatás"
+msgstr "Vektor állandó."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector uniform."
-msgstr "Egységes-vektor változtatás"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9697,19 +9263,16 @@ msgid ""
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Árnyaló"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "Szűrők Szerkesztése"
+msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Visual Shader Mode Changed"
-msgstr "Árnyaló"
+msgstr ""
#: editor/project_export.cpp
msgid "Runnable"
@@ -9718,7 +9281,7 @@ msgstr ""
#: editor/project_export.cpp
#, fuzzy
msgid "Add initial export..."
-msgstr "Bemenet Hozzáadása"
+msgstr "Kezdeti exportálás hozzáadása..."
#: editor/project_export.cpp
msgid "Add previous patches..."
@@ -9750,9 +9313,8 @@ msgid "Release"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Exportálás"
+msgstr "Összes exportálása"
#: editor/project_export.cpp
msgid "The given export path doesn't exist:"
@@ -9779,7 +9341,7 @@ msgstr ""
#: editor/project_export.cpp
#, fuzzy
msgid "Export Path"
-msgstr "Projekt Exportálása"
+msgstr "Exportálási útvonal"
#: editor/project_export.cpp
msgid "Resources"
@@ -9826,9 +9388,8 @@ msgid "Make Patch"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " Fájlok"
+msgstr "Csomagfájl"
#: editor/project_export.cpp
msgid "Features"
@@ -9843,14 +9404,13 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Script"
-msgstr "Szkript Futtatása"
+msgstr "Szkript"
#: editor/project_export.cpp
#, fuzzy
msgid "Script Export Mode:"
-msgstr "Projekt Exportálása"
+msgstr "Szkript exportálás módja:"
#: editor/project_export.cpp
msgid "Text"
@@ -9881,19 +9441,16 @@ msgid "Export Project"
msgstr "Projekt Exportálása"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Projekt Exportálása"
+msgstr "Exportálási mód?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Exportálás"
+msgstr "Összes exportálása"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " Fájlok"
+msgstr "ZIP fájl"
#: editor/project_export.cpp
msgid "Godot Game Pack"
@@ -9912,11 +9469,17 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+msgid "The path specified doesn't exist."
+msgstr "A megadott útvonal nem létezik."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Hiba a csomagfájl megnyitása során (az nem ZIP formátumú)."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9924,16 +9487,16 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
msgid "New Game Project"
-msgstr ""
+msgstr "Új játék projekt"
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -9975,7 +9538,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Rename Project"
-msgstr ""
+msgstr "Projekt átnevezése"
#: editor/project_manager.cpp
msgid "Import Existing Project"
@@ -10003,7 +9566,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Project Name:"
-msgstr ""
+msgstr "Projekt neve:"
#: editor/project_manager.cpp
msgid "Project Path:"
@@ -10047,12 +9610,11 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Unnamed Project"
-msgstr ""
+msgstr "Névtelen projekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "Meglévő Projekt Importálása"
+msgstr "Hiányzó projekt"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
@@ -10061,11 +9623,12 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
msgid "Can't open project at '%s'."
-msgstr "'%s' nem nyitható meg."
+msgstr "A projekt nem nyitható meg a(z) %s helyen."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Are you sure to open more than one project?"
-msgstr ""
+msgstr "Biztos, hogy egynél több projektet nyit meg?"
#: editor/project_manager.cpp
msgid ""
@@ -10099,15 +9662,11 @@ msgid ""
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
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 ""
-"Nincs meghatározva főjelenet, kiválaszt most egyet?\n"
-"Ezt megváltoztathatja később a \"Projekt Beállításokban\" az \"Alkalmazás\" "
-"kategóriában."
#: editor/project_manager.cpp
msgid ""
@@ -10149,14 +9708,14 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr ""
+msgstr "Projektkezelő"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
-msgstr "Projekt"
+msgstr "Projektek"
#: editor/project_manager.cpp
msgid "Last Modified"
@@ -10164,32 +9723,32 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Scan"
-msgstr ""
+msgstr "Keresés"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Select a Folder to Scan"
-msgstr ""
+msgstr "Válasszon egy beolvasandó mappát"
#: editor/project_manager.cpp
msgid "New Project"
-msgstr ""
+msgstr "Új projekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "Pont eltávolítása"
+msgstr "Hiányzó eltávolítása"
#: editor/project_manager.cpp
msgid "Templates"
-msgstr ""
+msgstr "Sablonok"
#: editor/project_manager.cpp
msgid "Restart Now"
-msgstr ""
+msgstr "Újraindítás most"
#: editor/project_manager.cpp
msgid "Can't run project"
-msgstr ""
+msgstr "Nem lehet futtatni a projektet"
#: editor/project_manager.cpp
msgid ""
@@ -10197,9 +9756,16 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
-msgstr ""
+msgstr "Kulcs "
#: editor/project_settings_editor.cpp
msgid "Joy Button"
@@ -10211,7 +9777,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Mouse Button"
-msgstr ""
+msgstr "Egérgomb"
#: editor/project_settings_editor.cpp
msgid ""
@@ -10220,18 +9786,16 @@ msgid ""
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "HIBA: Animáció név már létezik!"
+msgstr ""
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Animáció Nevének Megváltoztatása:"
+msgstr ""
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
@@ -10239,7 +9803,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "All Devices"
-msgstr ""
+msgstr "Minden eszköz"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -10247,31 +9811,32 @@ msgstr "Eszköz"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Press a Key..."
-msgstr ""
+msgstr "Nyomj meg egy gombot..."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Mouse Button Index:"
-msgstr ""
+msgstr "Egérgomb index:"
#: editor/project_settings_editor.cpp
msgid "Left Button"
-msgstr ""
+msgstr "Bal gomb"
#: editor/project_settings_editor.cpp
msgid "Right Button"
-msgstr ""
+msgstr "Jobb gomb"
#: editor/project_settings_editor.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "Középső gomb"
#: editor/project_settings_editor.cpp
msgid "Wheel Up Button"
-msgstr ""
+msgstr "Felfelé görgetés gomb"
#: editor/project_settings_editor.cpp
msgid "Wheel Down Button"
-msgstr ""
+msgstr "Lefelé görgetés gomb"
#: editor/project_settings_editor.cpp
msgid "Wheel Left Button"
@@ -10330,12 +9895,13 @@ msgid "Middle Button."
msgstr "Középső Egérgomb."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Wheel Up."
-msgstr ""
+msgstr "Felfelé görgetés."
#: editor/project_settings_editor.cpp
msgid "Wheel Down."
-msgstr ""
+msgstr "Lefelé görgetés."
#: editor/project_settings_editor.cpp
msgid "Add Global Property"
@@ -10369,16 +9935,15 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
-msgstr ""
+msgstr "Hiba a beállítások mentésekor."
#: editor/project_settings_editor.cpp
msgid "Settings saved OK."
-msgstr ""
+msgstr "A beállítások sikeresen elmentve."
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Moved Input Action Event"
-msgstr "Pont Mozgatása a Görbén"
+msgstr ""
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
@@ -10386,11 +9951,11 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Add Translation"
-msgstr ""
+msgstr "Fordítás hozzáadása"
#: editor/project_settings_editor.cpp
msgid "Remove Translation"
-msgstr ""
+msgstr "Fordítás eltávolítása"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
@@ -10445,9 +10010,8 @@ msgid "Action:"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "Mozgási Művelet"
+msgstr "Művelet"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
@@ -10455,23 +10019,24 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Device:"
-msgstr ""
+msgstr "Eszköz:"
#: editor/project_settings_editor.cpp
msgid "Index:"
-msgstr ""
+msgstr "Index:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Localization"
-msgstr ""
+msgstr "Lokalizáció"
#: editor/project_settings_editor.cpp
msgid "Translations"
-msgstr ""
+msgstr "Fordítások"
#: editor/project_settings_editor.cpp
msgid "Translations:"
-msgstr ""
+msgstr "Fordítások:"
#: editor/project_settings_editor.cpp
msgid "Remaps"
@@ -10494,14 +10059,12 @@ msgid "Locales Filter"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
-msgstr "Csontok Mutatása"
+msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
-msgstr "Csak Kiválsztás"
+msgstr ""
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
@@ -10537,11 +10100,11 @@ msgstr ""
#: editor/property_editor.cpp
msgid "File..."
-msgstr ""
+msgstr "Fájl..."
#: editor/property_editor.cpp
msgid "Dir..."
-msgstr ""
+msgstr "Könyvtár..."
#: editor/property_editor.cpp
msgid "Assign"
@@ -10576,50 +10139,53 @@ msgid "Select Method"
msgstr ""
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Átnevezés"
+msgstr "Csoportos átnevezés"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Csere: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Reguláris kifejezés használata"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
-msgstr "Illesztési beállítások"
+msgstr "Haladó beállítások"
#: editor/rename_dialog.cpp
msgid "Substitute"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Node neve:"
+msgstr "Node neve"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Node neve:"
+msgstr "Node típusa"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Még nem mentette az aktuális jelenetet. Megnyitja mindenképp?"
+msgstr "Jelenlegi jelenet neve"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Átnevezés"
+msgstr ""
#: editor/rename_dialog.cpp
msgid ""
@@ -10628,11 +10194,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10640,9 +10206,8 @@ msgid "Initial value for the counter"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Lépés (mp):"
+msgstr "Lépés"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
@@ -10659,10 +10224,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10671,11 +10232,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10683,19 +10244,26 @@ msgid "Case"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Mind Kisbetű"
+msgstr "Kisbetűssé"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Mind Nagybetű"
+msgstr "Nagybetűssé"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Nagyítás Visszaállítása"
+msgstr "Visszaállítás"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Reguláris kifejezés használata"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "A(z) %s karakternél"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
@@ -10760,8 +10328,8 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+msgid "Detach Script"
+msgstr "Szkript leválasztása"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10792,14 +10360,16 @@ msgid "Instantiated scenes can't become root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "Scene mentés"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete %d nodes?"
-msgstr "Node létrehozás"
+msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10810,9 +10380,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Node létrehozás"
+msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10839,38 +10408,32 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "Csontok Létrehozása"
+msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "Scene mentés"
+msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Node létrehozás"
+msgstr "Gyökér node létrehozása:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Jelenet"
+msgstr "2D jelenet"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Jelenet"
+msgstr "3D jelenet"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Node létrehozás"
+msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -10923,32 +10486,35 @@ msgid "Load As Placeholder"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
-msgstr "Godot online dokumentáció megnyitása"
+msgstr "Dokumentáció megnyitása"
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "Összes összecsukása"
+msgstr "Az összes kinyitása/becsukása"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Új %s Létrehozása"
+msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "Scene mentés"
+msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10967,9 +10533,8 @@ msgid "Delete (No Confirm)"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Új %s Létrehozása"
+msgstr ""
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10978,11 +10543,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10998,24 +10563,22 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr ""
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "Rejtett Fájlok Megjelenítése"
+msgstr ""
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "Egyszeri Node"
+msgstr "Node feloldása"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Button Group"
-msgstr "Hozzáadás Csoporthoz"
+msgstr "Gombcsoport"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "(Connecting From)"
-msgstr "Kapcsolathiba"
+msgstr "(Csatlakozás innen)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
@@ -11040,9 +10603,8 @@ msgid ""
msgstr ""
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "Szkript Futtatása"
+msgstr "Szkript megnyitása:"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -11087,34 +10649,33 @@ msgid "Select a Node"
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "A háló üres!"
+msgstr "Az útvonal üres."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "A háló üres!"
+msgstr "A fájlnév üres."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "Az út nem vezeti a csomópontot!"
+msgstr "Az útvonal nem helyi."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid base path."
-msgstr "Érvénytelen Elérési Út."
+msgstr "Érvénytelen alapútvonal."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "Egy fájl vagy mappa már létezik a megadott névvel."
+msgstr "Létezik ilyen nevű könyvtár."
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "A fájl nem létezik."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "Használjon érvényes kiterjesztést."
+msgstr "Érvénytelen kiterjesztés."
#: editor/script_create_dialog.cpp
msgid "Wrong extension chosen."
@@ -11141,71 +10702,70 @@ msgid "N/A"
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "Szkript Szerkesztő Megnyitása"
+msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
-msgstr "Szkript Futtatása"
+msgstr "Szkript megnyitása"
#: editor/script_create_dialog.cpp
msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
+msgid "Invalid path."
+msgstr "Érvénytelen útvonal."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen osztálynév."
#: editor/script_create_dialog.cpp
msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Script is valid."
-msgstr "Az animációs fa érvényes."
+msgid "Script path/name is valid."
+msgstr "A szkript útvonala/neve érvényes."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in script (into scene file)."
-msgstr "Műveletek Scene fájlokkal."
+msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "Új %s Létrehozása"
+msgstr "Létrehoz egy új szkriptfájlt."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "Meglévő Busz Elrendezés betöltése."
+msgstr "Egy meglévő szkriptfájlt tölt be."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "Már létezik '%s' AutoLoad!"
+msgstr "A szkriptfájl már létezik."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name:"
-msgstr "Osztály:"
+msgstr "Osztálynév:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "Sablon Eltávolítása"
+msgstr "Sablon:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "Szkript Futtatása"
+msgstr "Beépített szkript:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -11224,34 +10784,28 @@ msgid "Warning:"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Error:"
-msgstr "Hiba!"
+msgstr "Hiba:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error"
-msgstr "Hiba Másolása"
+msgstr "C++ hiba"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error:"
-msgstr "Hiba Másolása"
+msgstr "C++ hiba:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source"
-msgstr "Forrás"
+msgstr "C++ forrás"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
-msgstr "Forrás"
+msgstr "Forrás:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "Forrás"
+msgstr "C++ forrás:"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
@@ -11262,18 +10816,20 @@ msgid "Errors"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Child process connected."
-msgstr "Kapcsolat bontva"
+msgstr "Gyermekfolyamat csatlakoztatva."
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
msgstr "Hiba Másolása"
#: editor/script_editor_debugger.cpp
-#, fuzzy
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
-msgstr "Pontok Törlése"
+msgstr "Töréspontok kihagyása"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -11292,9 +10848,8 @@ msgid "Profiler"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Network Profiler"
-msgstr "Projekt Exportálása"
+msgstr "Hálózati profilkészítő"
#: editor/script_editor_debugger.cpp
msgid "Monitor"
@@ -11321,7 +10876,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11365,18 +10920,16 @@ msgid "Export measures as CSV"
msgstr ""
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Erase Shortcut"
-msgstr "Lassan Ki"
+msgstr ""
#: editor/settings_config_dialog.cpp
msgid "Restore Shortcut"
msgstr ""
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Change Shortcut"
-msgstr "Horgonyok Módosítása"
+msgstr ""
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
@@ -11447,19 +11000,16 @@ msgid "Change Ray Shape Length"
msgstr ""
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Keverési Idő Módosítása"
+msgstr ""
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Keverési Idő Módosítása"
+msgstr ""
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Horgonyok és Margók Módosítása"
+msgstr ""
#: modules/csg/csg_gizmos.cpp
msgid "Change Torus Outer Radius"
@@ -11506,9 +11056,8 @@ msgid "Enabled GDNative Singleton"
msgstr ""
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "Frissítési Forgó Kikapcsolása"
+msgstr ""
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
@@ -11587,14 +11136,12 @@ msgid "GridMap Delete Selection"
msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Minden kiválasztás"
+msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "Minden kiválasztás"
+msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Paint"
@@ -11661,18 +11208,16 @@ msgid "Cursor Clear Rotation"
msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "Minden kiválasztás"
+msgstr "Kijelölés beillesztése"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Minden kiválasztás"
+msgstr "Kijelölés kitöltése"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -11683,9 +11228,8 @@ msgid "Pick Distance:"
msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "Objektumtulajdonságok."
+msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
@@ -11816,46 +11360,40 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "Bemenet Hozzáadása"
+msgstr "Bemeneti port hozzáadása"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "Bemenet Hozzáadása"
+msgstr "Kimeneti port hozzáadása"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Override an existing built-in function."
-msgstr "Érvénytelen név. Nem ütközhet egy már meglévő beépített típusnévvel."
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "Új %s Létrehozása"
+msgstr "Új függvény létrehozása."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
-msgstr ""
+msgstr "Változók:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "Új %s Létrehozása"
+msgstr "Új változó létrehozása."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr "Jelzések:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "Új sokszög létrehozása a semmiből."
+msgstr "Új jelzés létrehozása."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
-msgstr ""
+msgstr "A név nem érvényes azonosító:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name already in use by another func/var/signal:"
@@ -11863,46 +11401,43 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Function"
-msgstr ""
+msgstr "Függvény átnevezése"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Variable"
-msgstr ""
+msgstr "Változó átnevezése"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Signal"
-msgstr ""
+msgstr "Jelzés átnevezése"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Function"
-msgstr ""
+msgstr "Függvény hozzáadása"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
-msgstr "Pont eltávolítása"
+msgstr "Bemeneti port törlése"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
-msgstr ""
+msgstr "Változó hozzáadása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Signal"
-msgstr ""
+msgstr "Jelzés hozzáadása"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "Pont eltávolítása"
+msgstr "Bemeneti port eltávolítása"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "Pont eltávolítása"
+msgstr "Kimeneti port eltávolítása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
-msgstr ""
+msgstr "Kifejezés módosítása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
@@ -11975,19 +11510,16 @@ msgid "Connect Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "Kapcsolat bontva"
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Csatlakoztatás Node-hoz:"
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Csatlakoztatás Node-hoz:"
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -11998,9 +11530,8 @@ msgid "Change Input Value"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "CanvasItem Szerkesztése"
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
@@ -12031,58 +11562,52 @@ msgid "Try to only have one sequence input in selection."
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "Körvonal Készítése"
+msgstr "Függvény létrehozása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
-msgstr ""
+msgstr "Függvény eltávolítása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Variable"
-msgstr ""
+msgstr "Változó eltávolítása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Variable:"
-msgstr ""
+msgstr "Változó szerkesztése:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
-msgstr ""
+msgstr "Jelzés eltávolítása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Signal:"
-msgstr ""
+msgstr "Jelzés szerkesztése:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Tool:"
-msgstr "Csontok Létrehozása"
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
msgstr "Tagok:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "%s Típusának Megváltoztatása"
+msgstr "Alaptípus módosítása:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "%s Hozzáadása..."
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Ugrás Funkcióra..."
+msgstr "Függvény hozzáadása..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "Funkciók:"
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
@@ -12090,7 +11615,7 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr ""
+msgstr "Kijelöltek törlése"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
@@ -12102,34 +11627,31 @@ msgstr "Node-ok Másolása"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr ""
+msgstr "Node-ok kivágása"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "Funkciók:"
+msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "Frissítés"
+msgstr "Grafikon frissítése"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Tagok"
+msgstr "Tag szerkesztése"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
-msgstr ""
+msgstr "Beviteli típus nem iterálható: "
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid"
-msgstr ""
+msgstr "Az iterátor érvénytelenné vált"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid: "
-msgstr ""
+msgstr "Az iterátor érvénytelenné vált: "
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name."
@@ -12137,7 +11659,7 @@ msgstr ""
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
-msgstr ""
+msgstr "Az alap objektum nem egy node!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Path does not lead Node!"
@@ -12145,23 +11667,23 @@ msgstr "Az út nem vezeti a csomópontot!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
-msgstr ""
+msgstr "Érvénytelen index tulajdonság név: '%s' a(z) %s node-ban."
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
-msgstr ""
+msgstr ": Érvénytelen típusargumentum: "
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid arguments: "
-msgstr ""
+msgstr ": Érvénytelen argumentumok: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableGet not found in script: "
-msgstr ""
+msgstr "VariableGet nem található a szkriptben: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableSet not found in script: "
-msgstr ""
+msgstr "VariableSet nem található a szkriptben: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "Custom node has no _step() method, can't process graph."
@@ -12174,9 +11696,8 @@ msgid ""
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Keresés Súgóban"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
@@ -12227,6 +11748,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12245,9 +11770,34 @@ msgid "Invalid public key for APK expansion."
msgstr ""
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen csomagnév:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
#: platform/android/export/export.cpp
msgid ""
@@ -12290,9 +11840,8 @@ msgid "App Store Team ID not specified - cannot configure the project."
msgstr ""
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "Érvénytelen betűtípus méret."
+msgstr "Érvénytelen azonosító:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
@@ -12337,32 +11886,30 @@ msgstr ""
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid package short name."
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen rövid csomagnév."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package unique name."
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen egyedi csomagnév."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen csomagközzétevő megjelenítendő neve."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid product GUID."
-msgstr "Érvénytelen projektnév."
+msgstr "Érvénytelen termékazonosító."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid publisher GUID."
-msgstr "Érvénytelen Elérési Út."
+msgstr "Érvénytelen közzétevői GUID."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid background color."
-msgstr "Érvénytelen név."
+msgstr "Érvénytelen háttérszín."
#: platform/uwp/export/export.cpp
msgid "Invalid Store Logo image dimensions (should be 50x50)."
@@ -12435,6 +11982,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12622,6 +12175,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12642,6 +12200,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12742,43 +12305,36 @@ msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Animációs Eszközök"
+msgstr "Az animáció nem található: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "HIBA: Érvénytelen animáció név!"
+msgstr "Érvénytelen animáció: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "'%s' Lecsatlakoztatása '%s'-ról"
+msgstr ""
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
msgstr ""
-"Válasszon egy AnimationPlayer-t a Jelenetfából, hogy animációkat "
-"szerkeszthessen."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
-msgstr "Az animációs fa érvénytelen."
+msgstr ""
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
@@ -12830,7 +12386,7 @@ msgstr "Figyelem!"
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
-msgstr "Kérem Erősítse Meg..."
+msgstr "Kérjük erősítse meg..."
#: scene/gui/popup.cpp
msgid ""
@@ -12872,20 +12428,22 @@ msgstr ""
"gyermekévé, hogy így kapjon méretet. Ellenkező esetben tegye RenderTarget-"
"té, és állítsa hozzá a belső textúráját valamilyen node-hoz kirajzolásra."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
-msgstr "Érvénytelen betűtípus méret."
+msgstr "Érvénytelen forrás az előnézethez."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Érvénytelen betűtípus méret."
+msgstr ""
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "Érvénytelen betűtípus méret."
+msgstr ""
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -12904,6 +12462,39 @@ msgid "Constants cannot be modified."
msgstr ""
#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Exportáláskor vagy telepítéskor az így kapott futtatható program "
+#~ "megpróbál ennek a számítógépnek az IP-jéhez csatlakozni távoli "
+#~ "hibakeresés érdekében."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "A jelenlegi Scene soha nem volt még mentve, mentse el a futtatás előtt."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Nincs az erőforrás elérési útban."
+
+#~ msgid "Revert"
+#~ msgstr "Visszaállítás"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Ez a művelet nem vonható vissza. Visszaállítja mindenképp?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Scene visszaállítás"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Problémakövető"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Lecserélve %d előfordulás."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Statikus Konvex Test Létrehozása"
+
+#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
#~ "$url2]request one[/url][/color]."
@@ -13097,10 +12688,6 @@ msgstr ""
#~ msgid "Insert keys."
#~ msgstr "Kulcsok Beszúrása"
-#~ msgid "Instance the selected scene(s) as child of the selected node."
-#~ msgstr ""
-#~ "Kiválasztott Scene(k) példányosítása a kiválasztott Node gyermekeként."
-
#, fuzzy
#~ msgid "Font Size:"
#~ msgstr "Körvonal Mérete:"
diff --git a/editor/translations/id.po b/editor/translations/id.po
index 4208edb582..7e94f233c1 100644
--- a/editor/translations/id.po
+++ b/editor/translations/id.po
@@ -11,7 +11,7 @@
# Khairul Hidayat <khairulcyber4rt@gmail.com>, 2016.
# Reza Hidayat Bayu Prabowo <rh.bayu.prabowo@gmail.com>, 2018, 2019.
# Romi Kusuma Bakti <romikusumab@gmail.com>, 2017, 2018.
-# Sofyan Sugianto <sofyanartem@gmail.com>, 2017-2018, 2019.
+# Sofyan Sugianto <sofyanartem@gmail.com>, 2017-2018, 2019, 2020.
# Tito <ijavadroid@gmail.com>, 2018.
# Tom My <tom.asadinawan@gmail.com>, 2017.
# yursan9 <rizal.sagi@gmail.com>, 2016.
@@ -20,14 +20,19 @@
# Alphin Albukhari <alphinalbukhari5@gmail.com>, 2019.
# I Dewa Agung Adhinata <agungnata2003@gmail.com>, 2019.
# herri siagian <herry.it.2007@gmail.com>, 2019.
-# MonsterGila <fikrirazor@outlook.co.id>, 2019.
+# MonsterGila <fikrirazor@outlook.co.id>, 2019, 2020.
# Modeus Darksono <garuga17@gmail.com>, 2019.
+# Akhmad Zulfikar <azuldegratz@gmail.com>, 2020.
+# Ade Fikri Malihuddin <ade.fm97@gmail.com>, 2020.
+# zephyroths <ridho.hikaru@gmail.com>, 2020.
+# Richard Urban <redasuio1@gmail.com>, 2020.
+# yusuf afandi <afandi.yusuf.04@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-12-13 09:38+0000\n"
-"Last-Translator: Modeus Darksono <garuga17@gmail.com>\n"
+"PO-Revision-Date: 2020-08-12 08:00+0000\n"
+"Last-Translator: MonsterGila <fikrirazor@outlook.co.id>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/"
"godot/id/>\n"
"Language: id\n"
@@ -35,7 +40,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 3.10-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -45,13 +50,13 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "String dengan panjang 1 (karakter) yang diharapkan."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Tidak cukup bytes untuk menerjemahkan, atau format tidak sah."
+msgstr "Tidak cukup bytes untuk mendekode bytes, atau format tidak valid."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -438,7 +443,7 @@ msgstr "Tidak memungkinkan untuk menambah track baru tanpa akar"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Track tidak valid untuk Bezier (tidak ada sub-properti yang cocok)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
@@ -535,7 +540,7 @@ msgstr "Susun Track-track dengan node atau tampilkan sebagai daftar biasa."
#: editor/animation_track_editor.cpp
msgid "Snap:"
-msgstr "Snap:"
+msgstr "Pengancingan:"
#: editor/animation_track_editor.cpp
msgid "Animation step value."
@@ -546,6 +551,7 @@ msgid "Seconds"
msgstr "Detik"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -657,7 +663,7 @@ msgstr "Rasio Skala:"
#: editor/animation_track_editor.cpp
msgid "Select Tracks to Copy"
-msgstr "Pilih track untuk disalin:"
+msgstr "Pilih Trek untuk Disalin"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -705,8 +711,8 @@ msgid "Line Number:"
msgstr "Nomor Baris:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "kejadian %d diganti."
+msgid "%d replaced."
+msgstr "%d telah diganti."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -724,7 +730,7 @@ msgstr "Kasus Kecocokan"
msgid "Whole Words"
msgstr "Semua Kata"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Ganti"
@@ -774,6 +780,10 @@ msgid "Method in target node must be specified."
msgstr "Method dalam node target harus ditentukan."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Nama bukan sebuah pengidentifikasi yang sah."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -823,9 +833,8 @@ msgid "Extra Call Arguments:"
msgstr "Argumen-argumen Panggilan Ekstra:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "Pilih Method/Fungsi"
+msgstr "Fungsi Penerima:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -857,7 +866,6 @@ msgstr "Tidak dapat menghubungkan sinyal"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -890,7 +898,7 @@ msgstr "Memutuskan semua dari sinyal '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
-msgstr "Sambungkan..."
+msgstr "Hubungkan..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -911,7 +919,12 @@ msgstr "Anda yakin ingin menghapus semua hubungan dari sinyal '%s'?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr "Sinyal-sinyal"
+msgstr "Sinyal"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filter tile"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
@@ -951,7 +964,7 @@ msgid "Recent:"
msgstr "Saat ini:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cari:"
@@ -1048,7 +1061,7 @@ msgid ""
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
-"File-file yang telah dihapus diperlukan oleh sumber lain agar mereka dapat "
+"File-file yang telah dihapus diperlukan oleh resource lain agar mereka dapat "
"bekerja.\n"
"Hapus saja? (tidak bisa dibatalkan/undo)"
@@ -1106,7 +1119,7 @@ msgstr "Memiliki"
#: editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
-msgstr "Resource-resource tanpa kepemilikan yang jelas:"
+msgstr "Resource Tanpa Kepemilikan yang Jelas:"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Key"
@@ -1132,6 +1145,9 @@ msgstr "Penemu Proyek"
msgid "Lead Developer"
msgstr "Pengembang Utama"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Manajer Proyek "
@@ -1153,6 +1169,16 @@ msgid "Gold Sponsors"
msgstr "Sponsor Emas"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Donatur Perak"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Donatur Perunggu"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Sponsor Mini"
@@ -1209,9 +1235,8 @@ msgid "Error opening package file, not in ZIP format."
msgstr "Gagal saat membuka paket, tidak dalam bentuk zip."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "Autoload '%s' telah ada!"
+msgstr "%s (Sudah Ada)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1222,9 +1247,8 @@ msgid "The following files failed extraction from package:"
msgstr "Berkas berikut gagal diekstrak dari paket:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "%d file lagi"
+msgstr "Dan %s berkas lebih banyak."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
@@ -1236,9 +1260,8 @@ msgid "Success!"
msgstr "Sukses!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "Konten:"
+msgstr "Isi Paket:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1378,9 +1401,8 @@ msgid "Invalid file, not an audio bus layout."
msgstr "Berkas salah, tidak layout suara bus."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Galat saat menyimpan berkas!"
+msgstr "Galat menyimpan berkas: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
@@ -1464,7 +1486,7 @@ msgstr "Pindahkan Autoload"
msgid "Remove Autoload"
msgstr "Hapus Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Aktifkan"
@@ -1472,17 +1494,9 @@ msgstr "Aktifkan"
msgid "Rearrange Autoloads"
msgstr "Mengatur kembali Autoload-autoload"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Path tidak valid."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "File tidak ada."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Tidak didalam path resource."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1509,6 +1523,10 @@ msgstr "Nama"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Tempel Parameter"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Memperbarui Skena"
@@ -1603,7 +1621,7 @@ msgstr ""
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom debug template not found."
-msgstr "Debug template kustom tidak ditemukan."
+msgstr "Templat awakutu kustom tidak ditemukan."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1636,16 +1654,17 @@ msgid "Scene Tree Editing"
msgstr "Menyunting Pohon Skena"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Dok Impor"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Dok Node"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Dok Impor dan Berkas Sistem"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Berkas Sistem"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Dok Impor"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1751,9 +1770,8 @@ msgid "Erase Profile"
msgstr "Hapus Profil"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "Kelola Editor Fitur Profil"
+msgstr "Profil Fitur Godot"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
@@ -1765,7 +1783,7 @@ msgstr "Ekspor Profil"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
-msgstr "Kelola Editor Fitur Profil"
+msgstr "Kelola Editor Profil Fitur"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
@@ -1796,7 +1814,7 @@ msgstr "Tampilkan di Manajer Berkas"
msgid "New Folder..."
msgstr "Buat Direktori..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Segarkan"
@@ -1910,7 +1928,7 @@ msgstr "Direktori-direktori & File-file:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Pratinjau:"
@@ -1956,9 +1974,8 @@ msgid "Inherited by:"
msgstr "Diturunkan oleh:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Deskripsi:"
+msgstr "Deskripsi"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -1966,25 +1983,23 @@ msgstr "Tutorial Daring"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr "Properti Objek"
+msgstr "Properti"
#: editor/editor_help.cpp
-#, fuzzy
msgid "override:"
-msgstr "Menimpa"
+msgstr "menimpa:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "Bawaan"
+msgstr "baku:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "Fungsi"
+msgstr "Method"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "Properti-properti Tema"
+msgstr "Properti Tema"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -1999,9 +2014,8 @@ msgid "Property Descriptions"
msgstr "Deskripsi Properti"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Nilai:"
+msgstr "(nilai)"
#: editor/editor_help.cpp
msgid ""
@@ -2013,7 +2027,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Deskripsi Metode"
+msgstr "Deskripsi Method"
#: editor/editor_help.cpp
msgid ""
@@ -2030,12 +2044,11 @@ msgstr "Mencari Bantuan"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
-msgstr "Case Sensitive"
+msgstr "Peka terhadap Huruf Besar/Kecil"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "Tampilkan Bantuan-bantuan"
+msgstr "Tampilkan Hirarki"
#: editor/editor_help_search.cpp
msgid "Display All"
@@ -2074,7 +2087,6 @@ msgid "Class"
msgstr "Kelas"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
msgstr "Fungsi"
@@ -2087,14 +2099,12 @@ msgid "Constant"
msgstr "Konstan"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "Properti:"
+msgstr "Properti"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "Properti-properti Tema"
+msgstr "Properti Tema"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2178,7 +2188,7 @@ msgstr "Jendela Baru"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr "Sumber daya yang diimpor tidak dapat disimpan."
+msgstr "Resource yang diimpor tidak dapat disimpan."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
@@ -2187,15 +2197,15 @@ msgstr "Oke"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr "Error menyimpan resource!"
+msgstr "Galat saat menyimpan resource!"
#: editor/editor_node.cpp
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
-"Sumber daya ini tidak dapat disimpan karena bukan milik skena yang "
-"disunting. Buatlah unik terlebih dahulu."
+"Resource ini tidak dapat disimpan karena bukan milik skena yang disunting. "
+"Buatlah unik terlebih dahulu."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
@@ -2292,7 +2302,7 @@ msgstr "Error mencoba untuk menyimpan layout!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
-msgstr "Layout editor default ditimpa."
+msgstr "Tata letak baku editor ditimpa."
#: editor/editor_node.cpp
msgid "Layout name not found!"
@@ -2308,7 +2318,7 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"Sumber daya ini milik skena yang telah diimpor, jadi tidak dapat disunting.\n"
+"Resource ini milik skena yang telah diimpor, jadi tidak dapat disunting.\n"
"Harap baca dokumentasi yang relevan dalam mengimpor skena untuk lebih "
"memahami alur kerjanya."
@@ -2317,7 +2327,7 @@ msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
-"Sumber daya ini milik skena yang di-instance atau diwariskan.\n"
+"Resource ini milik skena yang di-instance atau diwariskan.\n"
"Perubahan tidak akan disimpan ketika menyimpan skena saat ini."
#: editor/editor_node.cpp
@@ -2325,8 +2335,8 @@ msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
-"Sumber daya ini telah diimpor, jadi tidak dapat disunting. Ubah "
-"pengaturannya pada panel impor kemudian impor kembali."
+"Resource ini telah diimpor, jadi tidak dapat disunting. Ubah pengaturannya "
+"pada panel impor kemudian impor kembali."
#: editor/editor_node.cpp
msgid ""
@@ -2347,7 +2357,7 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"Ini merupakan objek jarak jauh, jadi perubahan tidak akan tersimpan.\n"
+"Ini merupakan objek remote, jadi perubahan tidak akan tersimpan.\n"
"Harap baca dokumentasi yang relevan dalam mengawakutu untuk lebih memahami "
"alur kerjanya."
@@ -2356,12 +2366,6 @@ msgid "There is no defined scene to run."
msgstr "Tidak ada skena yang didefinisikan untuk dijalankan."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Skena saat ini belum pernah disimpan, harap simpan terlebih dahulu sebelum "
-"menjalankannya."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Tidak dapat memulai subproses!"
@@ -2395,7 +2399,7 @@ msgstr "Simpan perubahan '%s' sebelum menutupnya?"
#: editor/editor_node.cpp
msgid "Saved %s modified resource(s)."
-msgstr "Menyimpan sumber daya %s yang diubah."
+msgstr "Menyimpan resource %s yang diubah."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
@@ -2446,12 +2450,18 @@ msgid "Can't reload a scene that was never saved."
msgstr "Tidak bisa memuat ulang skena yang belum pernah disimpan."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Pulihkan"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Simpan Skena"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Tindakan ini tidak dapat dibatalkan. Pulihkan saja?"
+#, fuzzy
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Skena saat ini mempunyai perubahan yang belum tersimpan.\n"
+"Tetap muat ulang skena yang tersimpan? Aksi ini tidak dapat dibatalkan."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2528,7 +2538,7 @@ msgstr ""
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
-"Tidak dapat memuat addon script dari jalur: '%s' tipe basis tidak "
+"Tidak dapat memuat skrip addon dari jalur: '%s' karena jenis Basisnya bukan "
"EditorPlugin."
#: editor/editor_node.cpp
@@ -2666,7 +2676,7 @@ msgstr "Tambah skena baru."
#: editor/editor_node.cpp
msgid "Scene"
-msgstr "Suasana"
+msgstr "Skena"
#: editor/editor_node.cpp
msgid "Go to previously opened scene."
@@ -2686,7 +2696,7 @@ msgstr "Tab sebelumnya"
#: editor/editor_node.cpp
msgid "Filter Files..."
-msgstr "Saring berkas..."
+msgstr "Filter Berkas..."
#: editor/editor_node.cpp
msgid "Operations with scene files."
@@ -2739,10 +2749,6 @@ msgid "Redo"
msgstr "Ulangi"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Kembalikan Skena"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Perkakas macam-macam proyek atau lingkup skena."
@@ -2785,7 +2791,7 @@ msgstr "Alat-alat"
#: editor/editor_node.cpp
msgid "Orphan Resource Explorer..."
-msgstr "Penjelajah Resource Orphan…"
+msgstr "Penjelajah Resource Orphan..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2794,36 +2800,40 @@ msgstr "Keluar ke daftar proyek"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr "\"Debug\""
+msgstr "Awakutu"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr "Deploy dengan Remote Debug"
+msgstr "Deploy dengan Awakutu Jarak Jauh"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Ketika ekspor atau deploying, hasil executable akan mencoba terhubung ke IP "
-"komputer dengan untuk debug."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Deploy Kecil dengan Jaringan FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Ketika opsi ini aktif, ekspor atau deploy akan menghasilkan minimal "
"executable.\n"
-"Filesystem akan tersedia dari proyek dari editor melalui jaringan.\n"
+"Berkas sistem akan tersedia dari proyek dari editor melalui jaringan.\n"
"Pada Android, deploy akan menggunakan kabel USB untuk performa yang lebih "
"cepat. Opsi ini mempercepat pengujian dengan jejak kaki yang besar."
@@ -2832,9 +2842,10 @@ msgid "Visible Collision Shapes"
msgstr "Collision Shapes Terlihat"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Collision shapes dan raycast nodes (untuk 2D dan 3D) akan terlihat pada saat "
"permainan berjalan jika opsi ini aktif."
@@ -2844,39 +2855,44 @@ msgid "Visible Navigation"
msgstr "Navigasi Terlihat"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigasi meshes dan poligon akan terlihat saat game berjalan jika opsi ini "
"aktif."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sinkronkan Perubahan Skena"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"Ketika opsi ini aktif, perubahan yang dibuat pada scene lewat editor akan di "
-"replika pada permainan yang sedang berjalan.\n"
+"Ketika opsi ini aktif, perubahan yang dibuat pada skena melalui editor akan "
+"direplika pada gim yang sedang berjalan.\n"
"Ketika penggunaan remote pada sebuah perangkat, akan lebih efisien dengan "
-"jaringan filesystem."
+"berkas sistem jaringan."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sinkronkan Perubahan Script"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Ketika opsi ini aktif, perubahan script yang tersimpan akan di muat kembali "
"pada permainan yang sedang berjalan.\n"
@@ -2889,7 +2905,7 @@ msgstr "Editor"
#: editor/editor_node.cpp
msgid "Editor Settings..."
-msgstr "Pengaturan Editor…"
+msgstr "Pengaturan Editor..."
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2901,7 +2917,7 @@ msgstr "Ambil Tangkapan Layar"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "Tangkapan Layar disimpan di folder Data/Pengaturan Editor."
+msgstr "Tangkapan layar disimpan dalam folder Data/Pengaturan Editor."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
@@ -2913,7 +2929,7 @@ msgstr "Jungkitkan Konsol Sistem"
#: editor/editor_node.cpp
msgid "Open Editor Data/Settings Folder"
-msgstr "Buka Direktori Editor Data/Pengaturan"
+msgstr "Buka Direktori Data/Pengaturan Editor"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
@@ -2921,11 +2937,11 @@ msgstr "Buka Folder Data Editor"
#: editor/editor_node.cpp
msgid "Open Editor Settings Folder"
-msgstr "Buka Direktori Editor Pengaturan"
+msgstr "Buka Direktori Pengaturan Editor"
#: editor/editor_node.cpp
msgid "Manage Editor Features..."
-msgstr "Kelola Editor Fitur…"
+msgstr "Kelola Fitur Editor..."
#: editor/editor_node.cpp
msgid "Manage Export Templates..."
@@ -2940,7 +2956,7 @@ msgstr "Bantuan"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Cari"
@@ -2954,8 +2970,12 @@ msgid "Q&A"
msgstr "Tanya Jawab"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Pelacak Isu"
+msgid "Report a Bug"
+msgstr "Laporkan Kutu"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Kirim Tanggapan Dokumentasi"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2975,7 +2995,7 @@ msgstr "Mainkan"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "Hentikan sementara skena untuk mengawakutu."
#: editor/editor_node.cpp
msgid "Pause Scene"
@@ -3089,9 +3109,8 @@ msgid "Import Templates From ZIP File"
msgstr "Impor Templat dari Berkas ZIP"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Manajer Templat Ekspor"
+msgstr "Paket Templat"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3142,13 +3161,12 @@ msgid "Open the previous Editor"
msgstr "Buka Editor Sebelumnya"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "Peringatan"
+msgstr "Peringatan!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
-msgstr "Tidak ada sub-sumber yang ditemukan."
+msgstr "Tidak ada sub-resourc yang ditemukan."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
@@ -3272,9 +3290,9 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
-"Tidak dapat membuat ViewportTexture pada sumber daya yang disimpan sebagai "
+"Tidak dapat membuat ViewportTexture pada resource yang disimpan sebagai "
"berkas.\n"
-"Sumber daya harus dimiliki oleh sebuah skena."
+"Resource harus dimiliki oleh sebuah skena."
#: editor/editor_properties.cpp
msgid ""
@@ -3285,7 +3303,7 @@ msgid ""
msgstr ""
"Tidak dapat membuat ViewportTexture pada resource ini karena tidak dibuat "
"lokal ke skena.\n"
-"Silakan aktifkan properti 'lokal ke skena' di atasnya (dan semua sumber daya "
+"Silakan aktifkan properti 'lokal ke skena' di atasnya (dan semua resource "
"yang memuatnya sampai node)."
#: editor/editor_properties.cpp editor/property_editor.cpp
@@ -3356,9 +3374,11 @@ msgid "Add Key/Value Pair"
msgstr "Tambahkan pasangan Key/Value"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Tidak ada preset ekspor yang bisa digunakan untuk platform ini.\n"
"Mohon tambahkan preset yang bisa digunakan di menu ekspor."
@@ -3387,6 +3407,13 @@ msgstr "Tidak bisa menjalankan script:"
msgid "Did you forget the '_run' method?"
msgstr "Apakah anda lupa dengan fungsi '_run' ?"
+#: editor/editor_spin_slider.cpp
+#, fuzzy
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Tahan Ctrl untuk meletakkan Getter. Tahan Shift untuk meletakkan generic "
+"signature."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Pilih node untuk diimpor"
@@ -3466,11 +3493,11 @@ msgstr "Mengimpor:"
#: editor/export_template_manager.cpp
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "Galat dalam mendapatkan daftar mirror."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
+msgstr "Galat mengurai JSON dari daftar mirror. Silakan laporkan masalah ini!"
#: editor/export_template_manager.cpp
msgid ""
@@ -3599,9 +3626,8 @@ msgid "Select Template File"
msgstr "Pilih berkas templat"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Memuat Ekspor Template-template."
+msgstr "Templat Ekspor Godot"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3627,7 +3653,7 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr "Tidak bisa memindah/mengubah nama aset root."
+msgstr "Tidak bisa memindah/mengubah nama resource root."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
@@ -3682,9 +3708,8 @@ msgid "New Inherited Scene"
msgstr "Skena Warisan Baru"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Skena Utama"
+msgstr "Jadikan sebagai Skena Utama"
#: editor/filesystem_dock.cpp
msgid "Open Scenes"
@@ -3732,7 +3757,7 @@ msgstr "Skrip Baru..."
#: editor/filesystem_dock.cpp
msgid "New Resource..."
-msgstr "Sumber Daya Baru..."
+msgstr "Resource Baru..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
@@ -3891,7 +3916,7 @@ msgstr "Node tidak dalam Grup"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
msgid "Filter nodes"
-msgstr "Saring node"
+msgstr "Filter node"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
@@ -3983,10 +4008,18 @@ msgid "Error running post-import script:"
msgstr "Kesalahan saat menjalankan skrip post-import:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Menyimpan..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Berkas"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Jadikan Baku untuk '%s'"
@@ -3995,10 +4028,6 @@ msgid "Clear Default for '%s'"
msgstr "Bersihkan Baku untuk '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Berkas"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Impor sebagai:"
@@ -4011,8 +4040,8 @@ msgid "Reimport"
msgstr "Impor ulang"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Simpan skena, impor ulang, dan mulai ulang"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Simpan Skena, Impor Ulang, dan Mulai Ulang"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4047,12 +4076,8 @@ msgid "Copy Params"
msgstr "Salin Parameter"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Tempel Parameter"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
-msgstr "Sunting PapanKlip SumberDaya"
+msgstr "Sunting Papan Klip Resource"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4064,7 +4089,7 @@ msgstr "Buat Menjadi Bawaan"
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr "Membuat sub-Resource Unik"
+msgstr "Membuat Unik Sub-Resource"
#: editor/inspector_dock.cpp
msgid "Open in Help"
@@ -4072,15 +4097,15 @@ msgstr "Buka di Bantuan"
#: editor/inspector_dock.cpp
msgid "Create a new resource in memory and edit it."
-msgstr "Buat sumber baru pada memori dan ubah."
+msgstr "Buat resource baru pada memori dan mengubahnya."
#: editor/inspector_dock.cpp
msgid "Load an existing resource from disk and edit it."
-msgstr "Muat sumber tersedia dari disk dan ubah."
+msgstr "Muat resource yang ada dari diska dan mengubahnya."
#: editor/inspector_dock.cpp
msgid "Save the currently edited resource."
-msgstr "Simpan sumber yang sedang diatur."
+msgstr "Simpan resource yang sedang disunting saat ini."
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
@@ -4100,7 +4125,7 @@ msgstr "Properti Objek."
#: editor/inspector_dock.cpp
msgid "Filter properties"
-msgstr "Saring properti"
+msgstr "Filter properti"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -4341,7 +4366,7 @@ msgstr "Parameter Berubah"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Filters"
-msgstr "Sunting Penyaring"
+msgstr "Sunting Filter"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
@@ -4387,11 +4412,11 @@ msgstr "Hapus Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Toggle Filter On/Off"
-msgstr "Jungkitkan Penyaring Nyala/Mati"
+msgstr "Jungkitkan Filter Nyala/Mati"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Change Filter"
-msgstr "Ganti Penyaring"
+msgstr "Ganti Filter"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
@@ -4413,19 +4438,16 @@ msgstr ""
"nama track."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "Klip-klip Animasi:"
+msgstr "Klip Anim"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "Klip-klip Suara:"
+msgstr "Klip Audio"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Fungsi-fungsi:"
+msgstr "Fungsi"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4440,11 +4462,11 @@ msgstr "Tambah Node..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "Edit Filtered Tracks:"
-msgstr "Sunting Trek yang Disaring:"
+msgstr "Sunting Trek yang Difilter:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Enable Filtering"
-msgstr "Aktifkan penyaringan"
+msgstr "Aktifkan Penyaringan"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4507,7 +4529,7 @@ msgstr "Tidak ada animasi untuk disalin!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation resource on clipboard!"
-msgstr "Tidak ada aset animasi di papan klip!"
+msgstr "Tidak ada resource animasi di papan klip!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -4657,9 +4679,8 @@ msgid "Move Node"
msgstr "Pindahkan Node"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Transisi: "
+msgstr "Transisi sudah ada!"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Add Transition"
@@ -4696,7 +4717,7 @@ msgstr "Node awal dan akhir dibutuhkan untuk sub-transisi."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "No playback resource set at path: %s."
-msgstr "Tidak ada aset playback yang diatur di lokasi: %s."
+msgstr "Tidak ada resource playback yang diatur di lokasi: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Node Removed"
@@ -4745,14 +4766,13 @@ msgid "Transition: "
msgstr "Transisi: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Mode Geser Pandangan"
+msgstr "Mode Putar:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr "AnimationTree"
+msgstr "AnimationTree(Daftar animasi)"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -4884,11 +4904,11 @@ msgstr "Impor Animasi..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr "Sunting Penyaring Node"
+msgstr "Sunting Filter Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
-msgstr "Penyaring..."
+msgstr "Filter..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Contents:"
@@ -4935,7 +4955,6 @@ msgid "Request failed, too many redirects"
msgstr "Permintaan gagal, terlalu banyak pengalihan"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Redirect loop."
msgstr "Mengalihkan berulang-ulang."
@@ -5005,29 +5024,27 @@ msgstr "Unduhan untuk aset ini sedang diproses!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "Baru-baru Ini Diperbarui"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Paling Baru Diperbarui"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "Nama (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "Nama (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "Lisensi"
+msgstr "Lisensi (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "Lisensi"
+msgstr "Lisensi (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
@@ -5051,7 +5068,7 @@ msgstr "Semua"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr ""
+msgstr "Tidak ada hasil untuk \"%s\"."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Import..."
@@ -5121,7 +5138,7 @@ msgid "Bake Lightmaps"
msgstr "Panggang Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Pratinjau"
@@ -5139,12 +5156,11 @@ msgstr "Jangkah Kotak-kotak:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
-msgstr ""
+msgstr "Garis Primer Setiap:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "steps"
-msgstr "2 langkah"
+msgstr "langkah"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -5155,9 +5171,8 @@ msgid "Rotation Step:"
msgstr "Jangkah Perputaran:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Step:"
-msgstr "Skala:"
+msgstr "Langkah Skala:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Vertical Guide"
@@ -5232,85 +5247,72 @@ msgstr ""
"batasnya."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Left"
-msgstr "Kiri"
+msgstr "Kiri Atas"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Right"
-msgstr "Kanan"
+msgstr "Kanan Atas"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Right"
-msgstr "Putar ke kanan"
+msgstr "Kanan Bawah"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Left"
-msgstr "Tampilan Bawah"
+msgstr "Kiri Bawah"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Left"
-msgstr "Indentasi Kiri"
+msgstr "Kiri Tengah"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Top"
-msgstr "Seleksi Tengah"
+msgstr "Atas Tengah"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Right"
-msgstr "Indentasi Kanan"
+msgstr "Kanan Tengah"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Bottom"
-msgstr "Bawah"
+msgstr "Bawah Tengah"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "Tengah"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
-msgstr "Tampilan Kiri"
+msgstr "Kiri Lebar"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Wide"
-msgstr "Tampilan Atas"
+msgstr "Atas Lebar"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
-msgstr "Tampilan Kanan"
+msgstr "Kanan Lebar"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Wide"
-msgstr "Tampilan Bawah"
+msgstr "Bawah Lebar"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr ""
+msgstr "VTengah Lebar"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr ""
+msgstr "HTengah Lebar"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Full Rect"
-msgstr ""
+msgstr "Kotak Penuh"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "Rasio Skala:"
+msgstr "Jaga Rasio"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5330,6 +5332,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"Timpa Kamera Gim\n"
+"Menimpa kamera gim dengan kamera viewport editor."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5337,6 +5341,8 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"Timpa Kamera Gim\n"
+"Tidak ada instance gim yang berjalan."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5455,24 +5461,20 @@ msgid "Ruler Mode"
msgstr "Mode Penggaris"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle smart snapping."
-msgstr "Jungkitkan Pengancingan."
+msgstr "Jungkitkan pengancingan cerdas."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Smart Snap"
-msgstr "Gunakan Snap"
+msgstr "Gunakan Pengancingan Cerdas"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle grid snapping."
-msgstr "Jungkitkan Pengancingan."
+msgstr "Jungkitkan pengancingan kisi."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Grid Snap"
-msgstr "Pengancingan Kisi"
+msgstr "Gunakan Pengancingan Kisi"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
@@ -5483,9 +5485,8 @@ msgid "Use Rotation Snap"
msgstr "Gunakan Snap Rotasi"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Scale Snap"
-msgstr "Gunakan Snap"
+msgstr "Gunakan Pengancingan Skala"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
@@ -5570,9 +5571,8 @@ msgid "View"
msgstr "Pandangan"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Always Show Grid"
-msgstr "Tampilkan Kotak-kotak"
+msgstr "Selalu Tampilkan Kisi"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
@@ -5627,7 +5627,6 @@ msgid "Insert keys (based on mask)."
msgstr "Sisipkan Kunci (berdasarkan mask)."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid ""
"Auto insert keys when objects are translated, rotated or scaled (based on "
"mask).\n"
@@ -5645,9 +5644,8 @@ msgid "Auto Insert Key"
msgstr "Otomatis Sisipkan Kunci"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Kunci Animasi Dimasukkan."
+msgstr "Opsi Kunci Animasi dan Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5758,20 +5756,18 @@ msgstr "Masker Emisi"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Solid Pixels"
-msgstr "Pertumbuhan (Piksel): "
+msgstr "Piksel Solid"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Border Pixels"
-msgstr ""
+msgstr "Piksel Pembatas"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "Direktori-direktori & File-file:"
+msgstr "Piksel Pembatas yang Diarahkan"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5862,9 +5858,8 @@ msgid "Hold Shift to edit tangents individually"
msgstr "Tahan Shift untuk menyunting tangen kurva satu-persatu"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right click to add point"
-msgstr "Klik Kanan: Hapus Titik"
+msgstr "Klik kanan untuk menambah titik"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
@@ -5895,12 +5890,12 @@ msgid "Mesh is empty!"
msgstr "Mesh kosong!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Buat Badan Trimesh Statis"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Tidak dapat membuat bentuk collision Trimesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Buat Bodi Cembung Statis"
+msgid "Create Static Trimesh Body"
+msgstr "Buat Badan Trimesh Statis"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5911,14 +5906,30 @@ msgid "Create Trimesh Static Shape"
msgstr "Buat Bentuk Trimesh Statis"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Gagal membuat bentuk!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Tidak dapat membuat convex collision shape tunggal untuk skena root."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Tidak dapat membuat convex collision shape tunggal."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
msgstr "Buat Bentuk Cembung"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "Tidak dapat membuat beberapa convex collision shape untuk skena root."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Tidak dapat membuat bentuk collision."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Buat Beberapa Bentuk Cembung"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
msgstr "Buat Mesh Navigasi"
@@ -5967,18 +5978,71 @@ msgid "Create Trimesh Static Body"
msgstr "Buat Tubuh Statis Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Buat StaticBody dan tetapkan collision shape berbasis poligon untuknya "
+"secara otomatis.\n"
+"Opsi ini merupakan yang paling akurat (tapi paling lambat) untuk deteksi "
+"collision."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Buat Trimesh Collision Sibling"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Buat Convex Collision Sibling"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Buat collision shape berbasis poligon.\n"
+"Opsi ini merupakan yang paling akurat (tapi paling lambat) untuk deteksi "
+"collision."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Buat Saudara Tunggal Convex Collision"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Buat convex collision shape tunggal.\n"
+"Opsi ini merupakan yang paling cepat (tapi paling tidak akurat) untuk "
+"deteksi collision."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Buat Beberapa Saudara Convex Collision"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Buat collision shape berbasis poligon.\n"
+"Opsi ini kinerjanya berada di antara dua opsi di atas."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Buat Garis Mesh..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Buat outline mesh statis. Outline mesh akan memiliki garis normal yang akan "
+"dibalik otomatis.\n"
+"Ini dapat digunakan sebagai pengganti properti Grow dari SpatialMaterial "
+"ketika tidak dapat menggunakan properti itu."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Tampilkan UV1"
@@ -6000,23 +6064,23 @@ msgstr "Ukuran Garis Tepi:"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Channel Debug"
-msgstr ""
+msgstr "Awakutu Kanal UV"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
msgstr "Hapus item %d?"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Perbarui dari Skena"
+msgstr ""
+"Perbarui dari skena yang ada?:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid "Mesh Library"
-msgstr "PerpustakaanMesh..."
+msgstr "Pustaka Mesh"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6311,7 +6375,7 @@ msgstr "Cermin Pengatur Panjang"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
-msgstr "Titik #"
+msgstr "Titik # Curve"
#: editor/plugins/path_editor_plugin.cpp
msgid "Set Curve Point Position"
@@ -6548,24 +6612,24 @@ msgstr "Sinkronkan Tulang ke Poligon"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
-msgstr "KESALAHAN: Tidak dapat memuat sumber daya!"
+msgstr "KESALAHAN: Tidak dapat memuat resource!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
-msgstr "Tambah Sumber Daya"
+msgstr "Tambah Resource"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Rename Resource"
-msgstr "Ubah Nama Sumber Daya"
+msgstr "Ubah Nama Resource"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Resource"
-msgstr "Hapus Sumber Daya"
+msgstr "Hapus Resource"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Resource clipboard is empty!"
-msgstr "Papan klip sumber daya kosong!"
+msgstr "Papan klip resource kosong!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Paste Resource"
@@ -6590,11 +6654,11 @@ msgstr "Buka dalam Editor"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Load Resource"
-msgstr "Muat Sumber Daya"
+msgstr "Muat Resource"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ResourcePreloader"
-msgstr "PreloaderSumberDaya"
+msgstr "ResourcePreloader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
@@ -6654,20 +6718,22 @@ msgstr "Simpan Berkas Sebagai..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "Tidak dapat mendapatkan skrip untuk menjalankannya."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "Gagal memuat ulang skrip, cek konsol untuk informasi galatnya."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "Skrip tidak dalam mode tool, tidak akan bisa dijalankan."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
+"Untuk menjalankan skrip ini, skrip haris mewarisi EditorScript dan diatur ke "
+"mode tool."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6701,7 +6767,7 @@ msgstr "Cari Sebelumnya"
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter scripts"
-msgstr "Penyaring Skrip"
+msgstr "Filter skrip"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
@@ -6709,7 +6775,7 @@ msgstr "Beralih penyortiran alfabetis dari daftar fungsi."
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter methods"
-msgstr "Penyaring fungsi"
+msgstr "Filter method"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -6826,14 +6892,6 @@ msgid "Open Godot online documentation."
msgstr "Buka dokumentasi daring Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Minta Dokumentasi"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Bantu tingkatkan dokumentasi Godot dengan memberikan tanggapan."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Cari dokumentasi referensi."
@@ -6899,12 +6957,13 @@ msgstr ""
"'%s' ke node '%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Baris"
+#, fuzzy
+msgid "[Ignore]"
+msgstr "(abaikan)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(abaikan)"
+msgid "Line"
+msgstr "Baris"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6912,12 +6971,14 @@ msgstr "Pergi ke Fungsi"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
-msgstr "Hanya sumber daya dari berkas sistem yang dapat dihapus."
+msgstr "Hanya resource dari berkas sistem yang dapat dihapus."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
msgstr ""
+"Tidak bisa menghapus node karena skrip '%s' tidak sedang digunakan dalam "
+"skena ini."
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
@@ -7270,6 +7331,10 @@ msgid "This operation requires a single selected node."
msgstr "Operasi ini membutuhkan satu node yang dipilih."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Ortogonal Otomatis Difungsikan"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Kunci Rotasi Tampilan"
@@ -7323,7 +7388,7 @@ msgstr "Pratinjau Sinematik"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
-msgstr ""
+msgstr "Tidak tersedia ketika menggunakan perender GLES2."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7354,9 +7419,12 @@ msgid "Freelook Speed Modifier"
msgstr "Pengubah Kecepatan TampilanBebas"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Freelook Slow Modifier"
-msgstr "Pengubah Kecepatan TampilanBebas"
+msgstr "Pengubah Lambat Tampilan Bebas"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotasi Tampilan Terkunci"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7364,17 +7432,22 @@ msgid ""
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
"Catatan: Nilai FPS yang ditampilkan adalah framerate-nya editor.\n"
-"Tidak bisa digunakan sebagai indikasi kinerja game yang dapat dihandalkan."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Rotasi Tampilan Terkunci"
+"Tidak bisa digunakan sebagai indikasi kinerja gim yang dapat dihandalkan."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Dialog XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Kancingkan Node ke Lantai"
@@ -7568,9 +7641,8 @@ msgid "Create Mesh2D"
msgstr "Buat Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Mesh2D Preview"
-msgstr "Buat Pratinjau Mesh"
+msgstr "Pratinjau Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create Polygon2D"
@@ -7578,25 +7650,23 @@ msgstr "Buat Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Polygon2D Preview"
-msgstr ""
+msgstr "Pratinjau Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create CollisionPolygon2D"
msgstr "Buat CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "CollisionPolygon2D Preview"
-msgstr "Buat CollisionPolygon2D"
+msgstr "Pratinjau CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D"
msgstr "Buat LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "LightOccluder2D Preview"
-msgstr "Buat LightOccluder2D"
+msgstr "Pratinjau LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
@@ -7647,9 +7717,8 @@ msgid "Simplification: "
msgstr "Penyederhanaan: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Shrink (Pixels): "
-msgstr "Pertumbuhan (Piksel): "
+msgstr "Penciutan (Piksel): "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
@@ -7676,17 +7745,16 @@ msgid "Add Frame"
msgstr "Tambah Frame"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "Gagal memuat resource."
+msgstr "Tidak dapat memuat gambar"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
-msgstr "GALAT: Tidak dapat memuat aset frame!"
+msgstr "GALAT: Tidak dapat memuat resource frame!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Resource clipboard is empty or not a texture!"
-msgstr "Papan klip sumber daya kosong atau bukan tekstur!"
+msgstr "Papan klip resource kosong atau memang bukan tekstur!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste Frame"
@@ -7717,7 +7785,8 @@ msgid "New Animation"
msgstr "Animasi Baru"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Kecepatan (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7863,7 +7932,7 @@ msgstr "Buat Templat Editor Kosong"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create From Current Editor Theme"
-msgstr "Buat dari Tema Editor Saat Ini"
+msgstr "Buat dari Editor Tema Saat Ini"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Toggle Button"
@@ -7971,9 +8040,8 @@ msgid "Color"
msgstr "Warna"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme File"
-msgstr "Tema"
+msgstr "Berkas Tema"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
@@ -8026,11 +8094,11 @@ msgstr "Aktifkan Prioritas"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Filter tiles"
-msgstr "Saring tile"
+msgstr "Filter tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
-msgstr "Berikan sumber TileSet untuk TileMap ini untuk menggunakan Tile-nya."
+msgstr "Berikan resource TileSet ke TileMap ini untuk menggunakan tile-nya."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
@@ -8086,17 +8154,15 @@ msgstr "Gabung dari Skena"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
-msgstr ""
+msgstr "Tile Tunggal Baru"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Autotile"
-msgstr "Nonaktifkan Autotile"
+msgstr "Autotile Baru"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Atlas"
-msgstr "%s baru"
+msgstr "Atlas Baru"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Next Coordinate"
@@ -8115,39 +8181,32 @@ msgid "Select the previous shape, subtile, or Tile."
msgstr "Pilih bentuk sebelumnya, subtile, atau Tile."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region"
-msgstr "Mode Wilayah"
+msgstr "Wilayah"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision"
-msgstr "Mode Tabrakan"
+msgstr "Area Tabrakan"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion"
-msgstr "Mode Oklusi"
+msgstr "Oklusi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation"
-msgstr "Mode Navigasi"
+msgstr "Navigasi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask"
-msgstr "Mode Bitmask"
+msgstr "Masker Bit"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority"
-msgstr "Mode Prioritas"
+msgstr "Prioritas"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index"
-msgstr "Indeks:"
+msgstr "Indeks Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region Mode"
@@ -8219,6 +8278,8 @@ msgstr "Tampilkan Nama Tile (Tahan Tombol Alt)"
msgid ""
"Add or select a texture on the left panel to edit the tiles bound to it."
msgstr ""
+"Tambah atau pilih tekstur di panel kiri untuk menyunting tile yang terikat "
+"padanya."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected texture? This will remove all tiles which use it."
@@ -8377,12 +8438,10 @@ msgid "Edit Tile Z Index"
msgstr "Sunting Index Z Tile"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Convex"
msgstr "Buat Poligon Cembung"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
msgstr "Buat Poligon Cekung"
@@ -8406,7 +8465,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "Tidak ada ekstensi VCS yang tersedia."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Galat"
@@ -8416,7 +8475,7 @@ msgstr "Tidak ada pesan komit yang diberikan"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr ""
+msgstr "Tidak ada berkas yang ditambahkan ke staging"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit"
@@ -8424,11 +8483,11 @@ msgstr "Komit"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "VCS Addon is not initialized"
-msgstr ""
+msgstr "Pengaya VCS tidak diinisialisasi"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control System"
-msgstr ""
+msgstr "Sistem Kontrol Versi"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Initialize"
@@ -8436,7 +8495,7 @@ msgstr "Inisialisasi"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
-msgstr ""
+msgstr "Area staging"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect new changes"
@@ -8448,7 +8507,7 @@ msgstr "Perubahan"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Modified"
-msgstr ""
+msgstr "Dimodifikasi"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Renamed"
@@ -8472,7 +8531,7 @@ msgstr "Stage Semua"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
-msgstr ""
+msgstr "Tambahkan pesan komit"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit Changes"
@@ -8481,28 +8540,27 @@ msgstr "Komit Perubahan"
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Status"
-msgstr ""
+msgstr "Status"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "View file diffs before committing them to the latest version"
-msgstr ""
+msgstr "Tampilkan perbedaan berkas sebelum mengkomitnya ke versi terbaru"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No file diff is active"
-msgstr ""
+msgstr "Tidak ada berkas diff yang sedang aktif"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect changes in file diff"
-msgstr ""
+msgstr "Deteksi perubahan dalam berkas diff"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(GLES3 only)"
msgstr "(Hanya GLES3)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Output"
-msgstr "Tambah keluaran +"
+msgstr "Tambah Keluaran"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar"
@@ -8518,7 +8576,7 @@ msgstr "Boolean"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sampler"
-msgstr ""
+msgstr "Sampler"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input port"
@@ -8650,9 +8708,8 @@ msgid "Dodge operator."
msgstr "Operator dodge."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "HardLight operator."
-msgstr "Operator HardLight"
+msgstr "Operator HardLight."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
@@ -9297,16 +9354,15 @@ msgstr ""
"permukaan dan arah pandangan kamera (berikan masukan yang terkait dengannya)."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Custom Godot Shader Language expression, which is placed on top of the "
"resulted shader. You can place various function definitions inside and call "
"it later in the Expressions. You can also declare varyings, uniforms and "
"constants."
msgstr ""
-"Ekspresi Bahasa Kustom Godot Shader, yang ditempatkan di atas shader yang "
+"Ekspresi Kustom Godot Shader Language, yang ditempatkan di atas shader yang "
"dihasilkan. Anda dapat menempatkan berbagai definisi fungsi di dalamnya dan "
-"memanggilnya nanti melalui Ekspresi. Anda juga dapat mendeklarasikan "
+"memanggilnya nanti melalui Daftar Ekspresi. Anda juga dapat mendeklarasikan "
"variasi, seragam, dan konstanta."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9382,13 +9438,12 @@ msgid "Runnable"
msgstr "Dapat dijalankan"
#: editor/project_export.cpp
-#, fuzzy
msgid "Add initial export..."
-msgstr "Tambah port masukan"
+msgstr "Tambah ekspor awal..."
#: editor/project_export.cpp
msgid "Add previous patches..."
-msgstr ""
+msgstr "Tambahkan patch sebelumnya..."
#: editor/project_export.cpp
msgid "Delete patch '%s' from list?"
@@ -9445,6 +9500,9 @@ msgid ""
"If checked, the preset will be available for use in one-click deploy.\n"
"Only one preset per platform may be marked as runnable."
msgstr ""
+"Jika dicentang, preset akan tersedia untuk digunakan dalam deploy sekali "
+"klik.\n"
+"Hanya satu preset per platform yang dapat ditandai sebagai runnable."
#: editor/project_export.cpp
msgid "Export Path"
@@ -9452,11 +9510,11 @@ msgstr "Lokasi Ekspor"
#: editor/project_export.cpp
msgid "Resources"
-msgstr "Sumber Daya"
+msgstr "Resource"
#: editor/project_export.cpp
msgid "Export all resources in the project"
-msgstr "Ekspor semua sumber daya dalam proyek"
+msgstr "Ekspor semua resource dalam proyek"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
@@ -9464,7 +9522,7 @@ msgstr "Ekspor skena terpilih (dan dependensinya)"
#: editor/project_export.cpp
msgid "Export selected resources (and dependencies)"
-msgstr "Expor sumber daya terpilih (dan dependensinya)"
+msgstr "Ekspor resource terpilih (dan dependensinya)"
#: editor/project_export.cpp
msgid "Export Mode:"
@@ -9472,25 +9530,23 @@ msgstr "Mode Ekspor:"
#: editor/project_export.cpp
msgid "Resources to export:"
-msgstr "Sumber daya yang akan diexpor:"
+msgstr "Resource yang akan diekspor:"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Penyaringan untuk mengekspor berkas non-sumber (dipisahkan koma, contoh: *."
-"json, *.txt)"
+"Filter untuk mengekspor berkas/folder non-resource\n"
+"(pisahkan dengan koma, contoh: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Penyaringan untuk mengecualikan berkas dalam proyek (dipisahkan koma, "
-"contoh: *.json, *.txt)"
+"Filter untuk mengecualikan berkas/folder dari proyek\n"
+"(pisahkan dengan koma, contoh: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
@@ -9501,9 +9557,8 @@ msgid "Make Patch"
msgstr "Buat Tambalan"
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " Berkas"
+msgstr "Berkas Pack"
#: editor/project_export.cpp
msgid "Features"
@@ -9562,13 +9617,12 @@ msgid "Export All"
msgstr "Ekspor Semua"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " Berkas"
+msgstr "Berkas ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
-msgstr ""
+msgstr "Paket Gim Godot"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -9583,23 +9637,30 @@ msgid "Export With Debug"
msgstr "Ekspor dengan Awakutu"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Lokasi ini tidak ada."
+msgid "The path specified doesn't exist."
+msgstr "Lokasi yang ditentukan tidak ada."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Berkas proyek '.zip' tidak valid, tidak berisi berkas 'project.godot'."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Galat saat membuka berkas paket (tidak dalam format ZIP)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr ""
+"Berkas proyek \".zip\" tidak valid; tidak terdapat berkas \"project.godot\" "
+"di dalamnya."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Silakan pilih direktori kosong."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Silakan pilih berkas 'project.godot' atau '.zip'."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Silakan pilih berkas \"project.godot\" atau \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr "Direktori ini sudah berisi proyek Godot."
#: editor/project_manager.cpp
@@ -9859,6 +9920,7 @@ msgstr ""
"Apakah Anda yakin untuk memindai %s folder untuk proyek Godot yang ada?\n"
"Ini bisa memakan waktu yang lama."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Manajer Proyek"
@@ -9869,7 +9931,7 @@ msgstr "Proyek"
#: editor/project_manager.cpp
msgid "Last Modified"
-msgstr ""
+msgstr "Terakhir Diubah"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9907,6 +9969,17 @@ msgstr ""
"Saat ini Anda tidak memiliki proyek.\n"
"Apakah Anda ingin menjelajahi contoh proyek resmi di Pustaka Aset?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Kotak filter pencarian proyek berdasarkan nama dan lokasi komponen "
+"terakhir.\n"
+"Untuk memfilter proyek berdasarkan nama dan lokasi penuhnya, kueri harus "
+"mengandung paling tidak satu karakter `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Kunci "
@@ -10109,27 +10182,27 @@ msgstr "Tambah Lokasi yang Dipetakan Ulang"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr "Sumber Daya Remap Tambah Remap"
+msgstr "Resource Remap Tambah Remap"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
-msgstr "Ubah Sumber Daya Pemetaan Ulang Bahasa"
+msgstr "Ubah Bahasa Resource Remap"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap"
-msgstr "Hapus Remap Sumber Daya"
+msgstr "Hapus Resource Remap"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap Option"
-msgstr "Hapus Opsi Remap Sumber Daya"
+msgstr "Hapus Opsi Resource Remap"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter"
-msgstr "Penyaringan Lokalisasi Diubah"
+msgstr "Filter Locale Diubah"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter Mode"
-msgstr "Mode Penyaringan Lokalisasi Diubah"
+msgstr "Mode Filter Locale Diubah"
#: editor/project_settings_editor.cpp
msgid "Project Settings (project.godot)"
@@ -10161,7 +10234,7 @@ msgstr "Aksi"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Deadzone"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -10189,7 +10262,7 @@ msgstr "Pemetaan Ulang"
#: editor/project_settings_editor.cpp
msgid "Resources:"
-msgstr "Sumber daya:"
+msgstr "Resource:"
#: editor/project_settings_editor.cpp
msgid "Remaps by Locale:"
@@ -10201,7 +10274,7 @@ msgstr "Pelokalan"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
-msgstr "Penyaring Pelokalan"
+msgstr "Filter Locale"
#: editor/project_settings_editor.cpp
msgid "Show All Locales"
@@ -10213,7 +10286,7 @@ msgstr "Tampilkan Hanya Pelokalan yang Dipilih"
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
-msgstr "Mode penyaringan:"
+msgstr "Mode filter:"
#: editor/project_settings_editor.cpp
msgid "Locales:"
@@ -10261,7 +10334,7 @@ msgstr "Pilih Node"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
-msgstr "Galat saat memuat berkas: Bukan sumber daya!"
+msgstr "Galat saat memuat berkas: Bukan resource!"
#: editor/property_editor.cpp
msgid "Pick a Node"
@@ -10288,14 +10361,25 @@ msgid "Batch Rename"
msgstr "Ubah Nama Massal"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Ganti: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Awalan"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Akhiran"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Gunakan Ekspresi Reguler"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Opsi Lanjutan"
@@ -10332,11 +10416,12 @@ msgstr ""
"Bandingkan opsi penghitung."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Penghitung per Level"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Jika diatur, penghitung akan dimulai ulang untuk setiap grup node anak"
#: editor/rename_dialog.cpp
@@ -10364,10 +10449,6 @@ msgstr ""
"Digit yang hilang diisi dengan angka nol di depan."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Ekspresi Reguler"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Pasca Proses"
@@ -10376,12 +10457,12 @@ msgid "Keep"
msgstr "Pertahankan"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase ke under_score"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase ke snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_score ke CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case ke PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10399,6 +10480,15 @@ msgstr "Jadikan Huruf Kapital"
msgid "Reset"
msgstr "Reset"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Kesalahan Ekspresi Reguler"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Pada karakter %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Pengindukan Ulang Node"
@@ -10457,15 +10547,16 @@ msgstr "Instansi Skena"
#: editor/scene_tree_dock.cpp
msgid "Replace with Branch Scene"
-msgstr ""
+msgstr "Ganti dengan Skena Cabang"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
msgstr "Instansi Skena Anak"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Bersihkan Skrip"
+#, fuzzy
+msgid "Detach Script"
+msgstr "Lampirkan Skrip"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10502,16 +10593,21 @@ msgid "Make node as Root"
msgstr "Jadikan node sebagai Dasar"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Hapus node \"%s\" dan anak-anaknya?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Hapus %d node?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
-msgstr ""
+msgstr "Hapus node root \"%s\" ?"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "Hapus node \"%s\" dan anak-anaknya?"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\"?"
@@ -10534,16 +10630,21 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Menonaktifkan \"editable_instance\" mengakibatkan semua properti node akan "
+"dikembalikan ke properti bakunya."
#: editor/scene_tree_dock.cpp
msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
+"Mengaktifkan \"Muas sebagai Placeholder\" akan menonaktifkan \"Anakan yang "
+"Dapat Disunting\" dan mengakibatkan semua properti node dikembalikan ke "
+"properti bakunya."
#: editor/scene_tree_dock.cpp
msgid "Make Local"
-msgstr ""
+msgstr "Jadikan Local"
#: editor/scene_tree_dock.cpp
msgid "New Scene Root"
@@ -10563,7 +10664,7 @@ msgstr "Skena 3D"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
-msgstr ""
+msgstr "Antarmuka Pengguna"
#: editor/scene_tree_dock.cpp
msgid "Other Node"
@@ -10571,11 +10672,13 @@ msgstr "Node Lainnya"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
-msgstr ""
+msgstr "Tidak dapat bekerja pada node dari skena luar!"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
msgstr ""
+"Tidak dapat mengoperasikan perintah ini pada node skena saat ini yang "
+"mewarisi skena lain!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
@@ -10583,7 +10686,7 @@ msgstr "Lampirkan Skrip"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
-msgstr ""
+msgstr "Hapus Node"
#: editor/scene_tree_dock.cpp
msgid "Change type of node(s)"
@@ -10594,39 +10697,50 @@ msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
msgstr ""
+"Tidak dapat menyimpan skena. Kemungkinan dependensinya (instance-nya) tidak "
+"terpenuhi."
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
-msgstr ""
+msgstr "Galat menyimpan skena."
#: editor/scene_tree_dock.cpp
msgid "Error duplicating scene to save it."
-msgstr ""
+msgstr "Galat menduplikasi skena untuk menyimpannya."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Sub-Resources"
-msgstr "Sub-Sumber Daya"
+msgstr "Sub-Resource"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance"
-msgstr ""
+msgstr "Bersihkan Pewarisan"
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
-msgstr ""
+msgstr "Anakan yang Dapat Disunting"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
-msgstr ""
+msgstr "Muat sebagai Placeholder"
#: editor/scene_tree_dock.cpp
msgid "Open Documentation"
msgstr "Buka Dokumentasi"
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
+#, fuzzy
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
msgstr ""
+"Tidak dapat melampirkan skrip: tidak ada bahasa yang terdaftar.\n"
+"Ini mungkin karena editor ini dibuat dengan semua modul bahasa dinonaktifkan."
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Tambah Node Anak"
#: editor/scene_tree_dock.cpp
msgid "Expand/Collapse All"
@@ -10634,7 +10748,7 @@ msgstr "Bentangkan/Ciutkan Semua"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
-msgstr ""
+msgstr "Ubah Tipe"
#: editor/scene_tree_dock.cpp
msgid "Reparent to New Node"
@@ -10646,11 +10760,11 @@ msgstr "Jadikan Skena Dasar"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
-msgstr ""
+msgstr "Gabung dari Skena"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Save Branch as Scene"
-msgstr ""
+msgstr "Simpan Cabang sebagai Skena"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
@@ -10658,7 +10772,7 @@ msgstr "Salin Lokasi Node"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
-msgstr ""
+msgstr "Hapus (Tanpa Konfirmasi)"
#: editor/scene_tree_dock.cpp
msgid "Add/Create a New Node."
@@ -10669,14 +10783,18 @@ msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
+"Instance berkas skena sebagai Node. Buat skena warisan jika tidak ada node "
+"akar."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
+msgstr "Lampirkan skrip baru atau yang sudah ada untuk node yang dipilih."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Detach the script from the selected node."
+msgstr "Bersihkan skrip untuk node yang dipilih."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10684,16 +10802,15 @@ msgstr "Remot"
#: editor/scene_tree_dock.cpp
msgid "Local"
-msgstr ""
+msgstr "Lokal"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance? (No Undo!)"
-msgstr ""
+msgstr "Bersihkan Pewarisan? (Tidak Bisa Dibatalkan!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "Beralih File Tersembunyi"
+msgstr "Jungkitkan Keterlihatan"
#: editor/scene_tree_editor.cpp
msgid "Unlock Node"
@@ -10709,25 +10826,31 @@ msgstr "(Menghubungkan dari)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
-msgstr ""
+msgstr "Peringatan pengaturan node:"
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
+"Node memiliki %s koneksi dan %s grup.\n"
+"Klik untuk menampilkan dock sinyal."
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
+"Node memiliki %s koneksi.\n"
+"Klik untuk menampilkan dock sinyal."
#: editor/scene_tree_editor.cpp
msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
+"Node berada dalam %s grup.\n"
+"Klik untuk menampilkan dock grup."
#: editor/scene_tree_editor.cpp
msgid "Open Script:"
@@ -10738,42 +10861,48 @@ msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
+"Node terkunci.\n"
+"Klik untuk membukanya."
#: editor/scene_tree_editor.cpp
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
+"Anakan tidak dapat dipilih.\n"
+"Klik untuk membuatnya dapat dipilih."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
-msgstr ""
+msgstr "Jungkitkan Visibilitas"
#: editor/scene_tree_editor.cpp
msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer disematkan.\n"
+"Klik untuk menghapus sematan."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
-msgstr ""
+msgstr "Nama node tidak valid, karakter berikut tidak diperbolehkan:"
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
-msgstr ""
+msgstr "Ubah Nama Node"
#: editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
-msgstr ""
+msgstr "Pohon Skena (Node):"
#: editor/scene_tree_editor.cpp
msgid "Node Configuration Warning!"
-msgstr ""
+msgstr "Peringatan Konfigurasi Node!"
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
-msgstr ""
+msgstr "Pilih Node"
#: editor/script_create_dialog.cpp
msgid "Path is empty."
@@ -10796,12 +10925,16 @@ msgid "A directory with the same name exists."
msgstr "Sudah ada nama direktori seperti itu."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "File tidak ada."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Ekstensi tidak valid."
#: editor/script_create_dialog.cpp
msgid "Wrong extension chosen."
-msgstr ""
+msgstr "Ekstensi salah dipilih."
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
@@ -10821,7 +10954,7 @@ msgstr "Menimpa"
#: editor/script_create_dialog.cpp
msgid "N/A"
-msgstr ""
+msgstr "N/A"
#: editor/script_create_dialog.cpp
msgid "Open Script / Choose Location"
@@ -10836,6 +10969,10 @@ msgid "File exists, it will be reused."
msgstr "Berkas sudah ada, itu akan digunakan kembali."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Path tidak valid."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Nama kelas tidak valid."
@@ -10844,12 +10981,12 @@ msgid "Invalid inherited parent name or path."
msgstr "Nama atau lokasi parent yang diwariskan tidak valid."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Skrip valid."
+msgid "Script path/name is valid."
+msgstr "Lokasi/nama skrip valid."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr ""
+msgstr "Diizinkan: a-z, A-Z, 0-9, _ dan ."
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)."
@@ -10864,24 +11001,28 @@ msgid "Will load an existing script file."
msgstr "Akan memuat berkas skrip yang ada."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "Autoload '%s' telah ada!"
+msgstr "Berkas skrip sudah ada."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Catatan: Skrip bawaan memiliki banyak keterbatasan dan tidak dapat disunting "
+"menggunakan editor eksternal."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name:"
-msgstr "Nama Kelas"
+msgstr "Nama Kelas:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "Templat"
+msgstr "Templat:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "Skrip Utama:"
+msgstr "Skrip Internal:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -10893,7 +11034,7 @@ msgstr "Remot "
#: editor/script_editor_debugger.cpp
msgid "Bytes:"
-msgstr ""
+msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
msgid "Warning:"
@@ -10925,11 +11066,11 @@ msgstr "Sumber C++ :"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
-msgstr ""
+msgstr "Stack Trace"
#: editor/script_editor_debugger.cpp
msgid "Errors"
-msgstr ""
+msgstr "Galat"
#: editor/script_editor_debugger.cpp
msgid "Child process connected."
@@ -10940,97 +11081,100 @@ msgid "Copy Error"
msgstr "Salin Galat"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "RAM Video"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Lewati Breakpoint"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
-msgstr ""
+msgstr "Inspeksi Instance Sebelumnya"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
-msgstr ""
+msgstr "Inspeksi Instance Berikutnya"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
-msgstr ""
+msgstr "Stack Frame"
#: editor/script_editor_debugger.cpp
msgid "Profiler"
-msgstr ""
+msgstr "Profiler(debugger/pemantauan)"
#: editor/script_editor_debugger.cpp
msgid "Network Profiler"
-msgstr "Profiler Jaringan"
+msgstr "Network Profiler(Debug jaringan)"
#: editor/script_editor_debugger.cpp
msgid "Monitor"
-msgstr ""
+msgstr "Pemantau"
#: editor/script_editor_debugger.cpp
msgid "Value"
-msgstr ""
+msgstr "Nilai"
#: editor/script_editor_debugger.cpp
msgid "Monitors"
-msgstr ""
+msgstr "Pemantau"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
-msgstr ""
+msgstr "Pilih satu atau lebih item dari daftar untuk menampilkan grafiknya."
#: editor/script_editor_debugger.cpp
msgid "List of Video Memory Usage by Resource:"
-msgstr ""
+msgstr "Daftar Penggunaan Memori Video oleh Resource:"
#: editor/script_editor_debugger.cpp
msgid "Total:"
-msgstr ""
+msgstr "Total:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+msgid "Export list to a CSV file"
+msgstr "Ekspor daftar ke berkas CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
-msgstr ""
+msgstr "Lokasi Resource"
#: editor/script_editor_debugger.cpp
msgid "Type"
-msgstr ""
+msgstr "Tipe"
#: editor/script_editor_debugger.cpp
msgid "Format"
-msgstr ""
+msgstr "Format"
#: editor/script_editor_debugger.cpp
msgid "Usage"
-msgstr ""
+msgstr "Pemakaian"
#: editor/script_editor_debugger.cpp
msgid "Misc"
-msgstr ""
+msgstr "Lain-lain"
#: editor/script_editor_debugger.cpp
msgid "Clicked Control:"
-msgstr ""
+msgstr "Kontrol yang Diklik:"
#: editor/script_editor_debugger.cpp
msgid "Clicked Control Type:"
-msgstr ""
+msgstr "Tipe Kontrol yang Diklik:"
#: editor/script_editor_debugger.cpp
msgid "Live Edit Root:"
-msgstr ""
+msgstr "Sunting Root Langsung:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Set From Tree"
-msgstr "Menyetel Dari Keturunan"
+msgstr "Setel dari Pohon"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "Ekspor pengukuran sebagai CSV"
#: editor/settings_config_dialog.cpp
msgid "Erase Shortcut"
@@ -11038,11 +11182,11 @@ msgstr "Hapus Pintasan"
#: editor/settings_config_dialog.cpp
msgid "Restore Shortcut"
-msgstr ""
+msgstr "Kembalikan Tombol Pintasan"
#: editor/settings_config_dialog.cpp
msgid "Change Shortcut"
-msgstr ""
+msgstr "Ubah Tombol Pintasan"
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
@@ -11050,11 +11194,11 @@ msgstr "Pengaturan Editor"
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
-msgstr ""
+msgstr "Tombol Pintasan"
#: editor/settings_config_dialog.cpp
msgid "Binding"
-msgstr ""
+msgstr "Mengikat"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Light Radius"
@@ -11062,7 +11206,7 @@ msgstr "Ganti Radius Lampu"
#: editor/spatial_editor_gizmos.cpp
msgid "Change AudioStreamPlayer3D Emission Angle"
-msgstr ""
+msgstr "Ubah Sudut Emisi AudioStreamPlayer3D"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
@@ -11074,15 +11218,15 @@ msgstr "Ubah Ukuran Kamera"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Notifier AABB"
-msgstr ""
+msgstr "Ubah AABB Notifier"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
-msgstr ""
+msgstr "Ubah Partikel AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Probe Extents"
-msgstr ""
+msgstr "Ubah Batas Probe"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Sphere Shape Radius"
@@ -11090,15 +11234,15 @@ msgstr "Ganti Radius Bentuk Bola"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
-msgstr ""
+msgstr "Ubah Batas Box Shape"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr ""
+msgstr "Ubah Radius Shape Kapsul"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr ""
+msgstr "Ubah Tinggi Shape Kapsul"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Radius"
@@ -11110,7 +11254,7 @@ msgstr "Ubah Tinggi Bentuk Silinder"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
-msgstr ""
+msgstr "Ubah Panjang Shape Ray"
#: modules/csg/csg_gizmos.cpp
msgid "Change Cylinder Radius"
@@ -11130,11 +11274,11 @@ msgstr "Ubah Torus Radius Luar"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
-msgstr ""
+msgstr "Pilih pustaka dinamis untuk entri ini"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select dependencies of the library for this entry"
-msgstr ""
+msgstr "Pilih dependensi pustaka untuk entri ini"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Remove current entry"
@@ -11142,15 +11286,15 @@ msgstr "Hapus entri saat ini"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "Klik ganda untuk membuat entri baru"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
-msgstr ""
+msgstr "Platform:"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform"
-msgstr ""
+msgstr "Platform"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dynamic Library"
@@ -11158,7 +11302,7 @@ msgstr "Pustaka Dinamis"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Add an architecture entry"
-msgstr ""
+msgstr "Tambah entri arsitektur"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "GDNativeLibrary"
@@ -11166,7 +11310,7 @@ msgstr "Pustaka GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Enabled GDNative Singleton"
-msgstr ""
+msgstr "Aktifkan Singleton GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Disabled GDNative Singleton"
@@ -11178,11 +11322,11 @@ msgstr "Pustaka"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
-msgstr ""
+msgstr "Pustaka: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr ""
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
msgid "Step argument is zero!"
@@ -11218,191 +11362,180 @@ msgstr "Kamus acuan tidak sah (sub kelas tidak sah)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
-msgstr ""
+msgstr "Objek tidak dapat memberikan panjang."
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Next Plane"
-msgstr "Tab selanjutnya"
+msgstr "Plane Selanjutnya"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Previous Plane"
-msgstr "Tab sebelumnya"
+msgstr "Plane Sebelumnya"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Plane:"
-msgstr ""
+msgstr "Plane:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Next Floor"
-msgstr ""
+msgstr "Floor Selanjutnya"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Previous Floor"
-msgstr "Tab sebelumnya"
+msgstr "Floor Sebelumnya"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Floor:"
-msgstr ""
+msgstr "Floor:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Delete Selection"
-msgstr "Hapus yang Dipilih"
+msgstr "Hapus Seleksi GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Hapus yang Dipilih"
+msgstr "Isi Seleksi GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "Hapus yang Dipilih"
+msgstr "Rekat(Paste) Seleksi GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Paint"
-msgstr ""
+msgstr "Cat GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Grid Map"
-msgstr ""
+msgstr "Grid Map"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Snap View"
-msgstr ""
+msgstr "Tampilan Pengancingan"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clip Disabled"
-msgstr "Dinonaktifkan"
+msgstr "Klip Dinonaktifkan"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Above"
-msgstr ""
+msgstr "Klip Di Atas"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Below"
-msgstr ""
+msgstr "Klip Di Bawah"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit X Axis"
-msgstr ""
+msgstr "Sunting Sumbu X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Y Axis"
-msgstr ""
+msgstr "Sunting Sumbu Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Z Axis"
-msgstr ""
+msgstr "Sunting Sumbu Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate X"
-msgstr ""
+msgstr "Kursor Rotasi X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Y"
-msgstr ""
+msgstr "Kursor Rotasi Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Z"
-msgstr ""
+msgstr "Kursor Rotasi Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
-msgstr ""
+msgstr "Kursor Rotasi Balik X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Y"
-msgstr ""
+msgstr "Kursor Rotasi Balik Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Z"
-msgstr ""
+msgstr "Kursor Rotasi Balik Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Clear Rotation"
-msgstr ""
+msgstr "Kursor Bersihkan Rotasi"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "Hapus Pilihan"
+msgstr "Rekatkan Pilihan"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Selection"
-msgstr "Beri Skala Seleksi"
+msgstr "Bersihkan Seleksi"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Semua pilihan"
+msgstr "Isi Pilihan"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
-msgstr ""
+msgstr "Pengaturan GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Pick Distance:"
-msgstr ""
+msgstr "Pilih Jarak:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "Penyaring fungsi"
+msgstr "Filter mesh"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
msgstr ""
+"Berikan resource MeshLibrary ke GridMap ini untuk menggunakan mesh-nya."
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
-msgstr ""
+msgstr "Nama kelas tidak boleh reserved keyword"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
-msgstr ""
+msgstr "Akhir dari inner exception stack trace"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "Bake NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
-msgstr ""
+msgstr "Bersihkan mesh navigasi."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Setting up Configuration..."
-msgstr ""
+msgstr "Menyiapkan Konfigurasi..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Calculating grid size..."
-msgstr ""
+msgstr "Menghitung ukuran kisi..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Creating heightfield..."
-msgstr ""
+msgstr "Membuat bidang ketinggian..."
#: modules/recast/navigation_mesh_generator.cpp
-#, fuzzy
msgid "Marking walkable triangles..."
-msgstr "Menyimpan perubahan-perubahan lokal..."
+msgstr "Segitiga penanda walkable..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Constructing compact heightfield..."
-msgstr ""
+msgstr "Membangun dataran tinggi..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Eroding walkable area..."
-msgstr ""
+msgstr "Mengikis area jalan..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Partitioning..."
-msgstr ""
+msgstr "Mempartisi..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Creating contours..."
@@ -11487,42 +11620,36 @@ msgid "Set Variable Type"
msgstr "Atur Jenis variabel"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "Tambah port masukan"
+msgstr "Tambah Port Masukan"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "Tambah port keluaran"
+msgstr "Tambah Port Keluaran"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Override an existing built-in function."
-msgstr "Tidak boleh sama dengan nama tipe bawaan yang ada."
+msgstr "Menimpa fungsi built-in yang ada."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "Buat persegi panjang baru."
+msgstr "Buat fungsi baru."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Variabel-variabel:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "Buat persegi panjang baru."
+msgstr "Buat variabel baru."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr "Sinyal-sinyal:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "Buat poligon baru."
+msgstr "Buat sinyal baru."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
@@ -11549,7 +11676,6 @@ msgid "Add Function"
msgstr "Tambahkan Fungsi"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
msgstr "Hapus port masukan"
@@ -11562,59 +11688,56 @@ msgid "Add Signal"
msgstr "Tambahkan Sinyal"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "Hapus port masukan"
+msgstr "Hapus Port Masukan"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "Hapus port keluaran"
+msgstr "Hapus Port Keluaran"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
msgstr "Ubah Pernyataan"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove VisualScript Nodes"
-msgstr "Hapus Tombol-tombol yang tidak sah"
+msgstr "Hapus Node VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr ""
+msgstr "Duplikasi Node VisualSkrip"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"Tahan Meta untuk meletakkan sebuah Getter. Tahan Shift untuk meletakkan "
+"Tahan %s untuk meletakkan sebuah Getter. Tahan Shift untuk meletakkan "
"generic signature."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
+"Tahan Ctrl untuk meletakkan Getter. Tahan Shift untuk meletakkan generic "
+"signature."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
-msgstr ""
+msgstr "Tahan %s untuk meletakkan referensi sederhana ke node."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr ""
+msgstr "Tahan Ctrl untuk menjatuhkan referensi sederhana ke node."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
-msgstr ""
+msgstr "Tahan %s untuk menjatuhkan Variabel Setter."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr ""
+msgstr "Tahan Ctrl untuk menjatuhkan Variabel Setter."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Preload Node"
-msgstr "Tambahkan Node"
+msgstr "Tambah Node Preload"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node(s) From Tree"
@@ -11625,6 +11748,9 @@ msgid ""
"Can't drop properties because script '%s' is not used in this scene.\n"
"Drop holding 'Shift' to just copy the signature."
msgstr ""
+"Tidak dapat drop properti karena skrip '%s' sedang tidak digunakan dalam "
+"skena ini.\n"
+"Drop dengan menekan 'Shift' untuk hanya menyalin tanda tangan (signature)."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
@@ -11635,87 +11761,76 @@ msgid "Add Setter Property"
msgstr "Tambahkan Properti Setter"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type"
-msgstr "Ubah Tipe Nilai Array"
+msgstr "Ubah Tipe Basis"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Move Node(s)"
-msgstr "Salin Resource"
+msgstr "Pindahkan Node"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove VisualScript Node"
-msgstr "Hapus Variabel"
+msgstr "Hapus Node VisualScript"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Nodes"
-msgstr "Sambungkan Ke Node:"
+msgstr "Sambungkan Node"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "Sambungkan Ke Node:"
+msgstr "Putuskan Node"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Sambungkan Ke Node:"
+msgstr "Sambungkan Data Node"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Sambungkan Ke Node:"
+msgstr "Sambungkan Sequence Node"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
-msgstr ""
+msgstr "Skrip sudah memiliki fungsi '%s'"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Input Value"
-msgstr "Ubah Nilai Array"
+msgstr "Ubah Nilai Input"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "Sunting CanvasItem"
+msgstr "Ubah Ukuran Komentar"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr ""
+msgstr "Tidak dapat menyalin node fungsi."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
-msgstr ""
+msgstr "Papan klip kosong!"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Paste VisualScript Nodes"
-msgstr "Path ke Node:"
+msgstr "Rekatkan Node VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function with a function node."
-msgstr ""
+msgstr "Tidak dapat membuat fungsi dengan node fungsi."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr ""
+msgstr "Tidak dapat membuat fungsi node dari node beberapa fungsi."
#: modules/visual_script/visual_script_editor.cpp
msgid "Select at least one node with sequence port."
-msgstr ""
+msgstr "Pilih setidaknya satu node dengan port urutan."
#: modules/visual_script/visual_script_editor.cpp
msgid "Try to only have one sequence input in selection."
-msgstr ""
+msgstr "Usahakan hanya memiliki satu input urutan dalam pemilihan."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "Namai kembali Fungsi"
+msgstr "Buat Fungsi"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
@@ -11739,69 +11854,59 @@ msgstr "Mengedit Sinyal:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Tool:"
-msgstr ""
+msgstr "Buat Alat:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
msgstr "Member-member:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "Ubah Tipe Nilai Array"
+msgstr "Ubah Tipe Basis:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
msgstr "Tambah Node..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Tambahkan Fungsi"
+msgstr "Tambah Fungsi..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "Fungsi-fungsi:"
+msgstr "function_name"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Select or create a function to edit its graph."
-msgstr "Pilih atau ciptakan sebuah fungsi untuk mengedit grafik"
+msgstr "Pilih atau buat fungsi untuk menyunting grafiknya."
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
msgstr "Hapus yang Dipilih"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Find Node Type"
msgstr "Cari Tipe Node"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Copy Nodes"
-msgstr "Salin Resource"
+msgstr "Salin Node"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr ""
+msgstr "Potong Node"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "Namai kembali Fungsi"
+msgstr "Buat Fungsi"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "Segarkan"
+msgstr "Segarkan Grafik"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Anggota"
+msgstr "Sunting Anggota"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -11861,41 +11966,40 @@ msgstr ""
"string (error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Hapus Variabel"
+msgstr "Cari VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Dapatkan %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
-msgstr ""
+msgstr "Setel %s"
#: platform/android/export/export.cpp
msgid "Package name is missing."
-msgstr ""
+msgstr "Nama paket tidak ada."
#: platform/android/export/export.cpp
msgid "Package segments must be of non-zero length."
-msgstr ""
+msgstr "Segmen paket panjangnya harus tidak boleh nol."
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
+msgstr "Karakter '%s' tidak diizinkan dalam penamaan paket aplikasi Android."
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
-msgstr ""
+msgstr "Digit tidak boleh diletakkan sebagai karakter awal di segmen paket."
#: platform/android/export/export.cpp
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
+msgstr "Karakter '%s' tidak bisa dijadikan karakter awal dalam segmen paket."
#: platform/android/export/export.cpp
msgid "The package must have at least one '.' separator."
-msgstr ""
+msgstr "Package setidaknya harus memiliki sebuah pemisah '.'."
#: platform/android/export/export.cpp
msgid "Select device from the list"
@@ -11903,45 +12007,86 @@ msgstr "Pilih perangkat pada daftar"
#: platform/android/export/export.cpp
msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
+msgstr "Lokasi executable ADB belum dikonfigurasi dalam Pengaturan Editor."
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr ""
+msgstr "Lokasi jarsigner OpenJDK belum dikonfigurasi dalam Pengaturan Editor."
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
+"Berkas debug keystore belum dikonfigurasi dalam Pengaturan Editor maupun di "
+"prasetel proyek."
+
+#: platform/android/export/export.cpp
+#, fuzzy
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Berkas debug keystore belum dikonfigurasi dalam Pengaturan Editor maupun di "
+"prasetel proyek."
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
+"Membangun kustom APK memerlukan lokasi Android SDK yang valid dalam "
+"Pengaturan Editor."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
msgstr ""
+"Lokasi Android SDK tidak valid untuk membuat kustom APK dalam Pengaturan "
+"Editor."
#: platform/android/export/export.cpp
-#, fuzzy
msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
-msgstr "Templat build Android tidak ada, harap pasang templat yang relevan."
+msgstr ""
+"Templat build Android belum terpasang dalam proyek. Pasanglah dari menu "
+"Proyek."
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr ""
+msgstr "Kunci Publik untuk ekspansi APK tidak valid."
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "Nama tidak sah."
+msgstr "Nama paket tidak valid:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
#: platform/android/export/export.cpp
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'."
#: platform/android/export/export.cpp
msgid ""
@@ -11950,151 +12095,143 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
+"Versi build Android tidak cocok:\n"
+" Templat terpasang: %s\n"
+" Versi Godot: %s\n"
+"Silakan pasang ulang templat build Android dari menu 'Project'."
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "Membangun Proyek Android (gradle)"
#: platform/android/export/export.cpp
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"Pembangunan proyek Android gagal, periksa output untuk galatnya.\n"
+"Atau kunjungi docs.godotengine.org untuk dokumentasi build Android."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr ""
+msgstr "Tak ada build apk yang dihasilkan di: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
-msgstr ""
+msgstr "Kurang identifier."
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "The character '%s' is not allowed in Identifier."
-msgstr "Nama bukan sebuah pengidentifikasi yang sah:"
+msgstr "Karakter '%s' tidak diizinkan dalam Identifier."
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
msgstr ""
+"App Store Team ID tidak ditetapkan - tidak dapat mengonfigurasi proyek."
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "Nama bukan sebuah pengidentifikasi yang sah:"
+msgstr "Identifier tidak valid:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
-msgstr ""
+msgstr "Ikon yang dibutuhkan tidak ditentukan dalam preset."
#: platform/javascript/export/export.cpp
msgid "Stop HTTP Server"
-msgstr ""
+msgstr "Hentikan Server HTTP"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
-msgstr ""
+msgstr "Jalankan di Peramban"
#: platform/javascript/export/export.cpp
msgid "Run exported HTML in the system's default browser."
-msgstr ""
+msgstr "Jalankan HTML yang diekspor dalam peramban baku sistem."
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not write file:"
-msgstr "Tidak dapat membuat folder."
+msgstr "Tidak dapat menulis berkas:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not open template for export:"
-msgstr "Tidak dapat membuat folder."
+msgstr "Tidak dapat membuka templat untuk ekspor:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Invalid export template:"
-msgstr "Memuat Ekspor Template-template."
+msgstr "Templat ekspor tidak valid:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not read custom HTML shell:"
-msgstr "Tidak dapat membuat folder."
+msgstr "Tidak dapat membaca shell HTML kustom:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not read boot splash image file:"
-msgstr "Tidak dapat membuat folder."
+msgstr "Tidak dapat membaca berkas citra boot splash:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Using default boot splash image."
-msgstr "Tidak dapat membuat folder."
+msgstr "Menggunakan citra boot splash baku."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package short name."
-msgstr "Nama tidak sah."
+msgstr "Nama pendek paket tidak valid."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package unique name."
-msgstr "Nama tidak sah."
+msgstr "Nama unik paket tidak valid."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "Nama tidak sah."
+msgstr "Nama penerbit paket tidak valid."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid product GUID."
-msgstr "Ukuran font tidak sah."
+msgstr "GUID produk tidak valid."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid publisher GUID."
-msgstr "Ukuran font tidak sah."
+msgstr "GUID penerbit tidak valid."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid background color."
-msgstr "Nama tidak sah."
+msgstr "Warna latar belakang tidak valid."
#: platform/uwp/export/export.cpp
msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr ""
+msgstr "Dimensi gambar Logo Store tidak valid (harus 50x50)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr ""
+msgstr "Dimensi gambar logo persegi 44x44 tidak valid (harus 44x44)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr ""
+msgstr "Dimensi gambar logo persegi 71x71 tidak valid (harus 71x71)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr ""
+msgstr "Dimensi gambar logo persegi 150x150 tidak valid (harus 150x150)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr ""
+msgstr "Dimensi gambar logo persegi 310x310 tidak valid (harus 310x310)."
#: platform/uwp/export/export.cpp
msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr ""
+msgstr "Dimensi gambar logo 310x150 lebarnya tidak valid (harus 310x150)."
#: platform/uwp/export/export.cpp
msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr ""
+msgstr "Dimensi gambar splash screen tidak valid (harus 620x300)."
#: scene/2d/animated_sprite.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
-"Sebuah resource SpriteFrames seharusnya diciptakan atau diatur dalam "
-"properti 'Frames' agar AnimatedSprite menampilkan frame-frame."
+"Resource SpriteFrames seharusnya diciptakan atau diatur dalam properti "
+"'Frames' agar AnimatedSprite menampilkan frame-frame."
#: scene/2d/canvas_modulate.cpp
msgid ""
@@ -12111,6 +12248,10 @@ msgid ""
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
+"Node ini tidak punya shape, jadi dia tidak bisa bertabrakan atau "
+"berinteraksi dengan objek lain.\n"
+"Pertimbangkan untuk menambahkan CollisionShape2D atau CollisionPolygon2D "
+"sebagai anak untuk mendefinisikan bentuknya."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -12144,22 +12285,33 @@ msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
-"Sebuah bentuk harus disediakan untuk CollisionShape2D untuk fungsi. Mohon "
-"ciptakan resource bentuk untuk itu!"
+"Sebuah shape harus disediakan untuk CollisionShape2D supaya berfungsi. Mohon "
+"ciptakan resource shape untuknya!"
+
+#: scene/2d/collision_shape_2d.cpp
+#, fuzzy
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Bentuk Polygon-based tidak dimaksudkan untuk digunakan atau diedit secara "
+"langsung melalui node CollisionShape2D. Silakan gunakan node "
+"CollisionPolygon2D sebagai gantinya."
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animasi CPUParticles2D membutuhkan penggunaan CanvasItemMaterial dengan "
+"\"Animasi Partikel\" diaktifkan."
#: scene/2d/light_2d.cpp
-#, fuzzy
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
msgstr ""
-"Sebuah tekstur dengan bentuk cahaya harus disuplai ke properti 'texture'."
+"Sebuah tekstur dengan bentuk cahaya harus disuplai ke properti 'Texture'."
#: scene/2d/light_occluder_2d.cpp
msgid ""
@@ -12169,18 +12321,17 @@ msgstr ""
"berpengaruh."
#: scene/2d/light_occluder_2d.cpp
-#, fuzzy
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
-"Polygon occluder untuk occluder ini kosong. Mohon gambar dulu sebuah polygon!"
+"Polygon occluder untuk occluder ini kosong. Mohon gambar dulu sebuah poligon."
#: scene/2d/navigation_polygon.cpp
msgid ""
"A NavigationPolygon resource must be set or created for this node to work. "
"Please set a property or draw a polygon."
msgstr ""
-"Sebuah resource NavigationPolygon harus diatur atau diciptakan untuk node "
-"ini bekerja. Mohon atur sebuah properti atau gambar sebuah polygon."
+"Sebuah resource NavigationPolygon harus diatur atau diciptakan supaya node "
+"ini bekerja. Silakan atur sebuah properti atau gambar sebuah polygon."
#: scene/2d/navigation_polygon.cpp
msgid ""
@@ -12203,18 +12354,25 @@ msgid ""
"Use the CPUParticles2D node instead. You can use the \"Convert to "
"CPUParticles\" option for this purpose."
msgstr ""
+"Partikel berbasis GPU tidak didukung oleh video driver GLES2.\n"
+"Gunakan node CPUParticles2D sebagai gantinya. Anda dapat menggunakan opsi "
+"\"Konversikan jadi CPUParticles\" untuk tujuan ini."
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
"A material to process the particles is not assigned, so no behavior is "
"imprinted."
msgstr ""
+"Material untuk memproses partikel belum ditetapkan, jadi tidak ada perilaku "
+"yang dimunculkan."
#: scene/2d/particles_2d.cpp
msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animasi Particles2D membutuhkan penggunaan CanvasItemMaterial dengan "
+"\"Animasi Partikel\" diaktifkan."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -12228,6 +12386,9 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"Perubahan ukuran RigidBody2D (dalam mode karakter atau rigid/pejal) akan "
+"ditimpa oleh mesin fisika saat menjalankan.\n"
+"Sebagai gantinya, ubahlah ukuran di anakan collision shape-nya saja."
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
@@ -12236,31 +12397,31 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Ikatan Bone2D ini harus diakhiri dengan node Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Bone2D hanya bekerja dengan Skeleton2D atau Bone2D lain sebagai node induk."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Tulang ini tidak memiliki pose REST yang sesuai. Pergi ke node Skeleton2D "
+"dan tetapkan."
#: scene/2d/tile_map.cpp
-#, fuzzy
msgid ""
"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D hanya berfungsi untuk menyediakan sebuah bentuk collision "
-"pada sebuah CollisionObject2D node asal. Mohon hanya gunakan itu sebagai "
-"sebuah child dari Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, dll. "
-"untuk memberikan mereka sebuah bentuk."
+"TileMap dengan Gunakan Induk memerlukan induk CollisionObject2D diberikan "
+"shape. Silakan gunakan itu sebagai anak dari Area2D, StaticBody2D, "
+"RigidBody2D, KinematicBody2D, dll. untuk memberikan mereka shape."
#: scene/2d/visibility_notifier_2d.cpp
-#, fuzzy
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
@@ -12270,55 +12431,60 @@ msgstr ""
#: scene/3d/arvr_nodes.cpp
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRCamera wajib memiliki node ARVROrigin sebagai induknya."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRController wajib memiliki node ARVROrigin sebagai induknya."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
msgstr ""
+"ID pengontrol tidak boleh 0 atau pengontrol ini tidak terikat ke pengontrol "
+"yang sebenarnya."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRAnchor wajib memiliki node ARVROrigin sebagai induknya."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
msgstr ""
+"ID jangkar tidak boleh 0 atau jangkar ini tidak akan terikat ke jangkar "
+"aslinya."
#: scene/3d/arvr_nodes.cpp
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr ""
+msgstr "ARVROrigin membutuhkan node anak ARVRCamera."
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
-msgstr ""
+msgstr "%d%%"
#: scene/3d/baked_lightmap.cpp
msgid "(Time Left: %d:%02d s)"
-msgstr ""
+msgstr "(Waktu tersisa: %d:%02d s)"
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Meshes: "
-msgstr ""
+msgstr "Plotting Meshes: "
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Lights:"
-msgstr ""
+msgstr "Plotting Lights:"
#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
msgid "Finishing Plot"
-msgstr ""
+msgstr "Menyelesaikan Pemetaan"
#: scene/3d/baked_lightmap.cpp
+#, fuzzy
msgid "Lighting Meshes: "
-msgstr ""
+msgstr "Lighting Meshes: "
#: scene/3d/collision_object.cpp
msgid ""
@@ -12354,13 +12520,12 @@ msgstr ""
"bentuk."
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"Sebuah bentuk harus disediakan untuk CollisionShape untuk fungsi. Mohon "
-"ciptakan sebuah resource bentuk untuk itu!"
+"Sebuah shape harus disediakan untuk CollisionShape supaya berfungsi. Silakan "
+"buat shape untuknya."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12368,9 +12533,15 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
+#, fuzzy
msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
+msgstr "Tidak ada yang tampak karena tidak ada mesh yang ditetapkan."
#: scene/3d/cpu_particles.cpp
msgid ""
@@ -12380,13 +12551,20 @@ msgstr ""
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
-msgstr ""
+msgstr "Memetakan Mesh"
#: scene/3d/gi_probe.cpp
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
+"GIProbes tidak didukung oleh driver video GLES2.\n"
+"Gunakan BakedLightmap sebagai gantinya."
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
@@ -12395,7 +12573,7 @@ msgstr ""
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
-"Sebuah resource NavigationMesh harus diatur atau diciptakan untuk node ini "
+"Sebuah resource NavigationMesh harus diatur atau diciptakan supaya node ini "
"bekerja."
#: scene/3d/navigation_mesh.cpp
@@ -12425,17 +12603,18 @@ msgid ""
msgstr ""
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
msgstr ""
-"PathFollow2D hanya bekerja ketika diatur sebagai sebuah child dari sebuah "
-"node Path2D."
+"PathFollow2D hanya bekerja ketika diatur sebagai sebuah anak dari sebuah "
+"node Path."
#: scene/3d/path.cpp
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
+"ROTATION_ORIENTED PathFollow membutuhkan \"Up Vector\" yang diaktifkan dalam "
+"resource Curve Path induknya."
#: scene/3d/physics_body.cpp
msgid ""
@@ -12465,12 +12644,11 @@ msgid ""
msgstr ""
#: scene/3d/sprite_3d.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
msgstr ""
-"Sebuah resource SpriteFrames harus diciptakan atau diatur didalam properti "
+"Sebuah resource SpriteFrames harus diciptakan atau diatur di dalam properti "
"'Frames' agar AnimatedSprite3D menampilkan frame-frame."
#: scene/3d/vehicle_body.cpp
@@ -12484,6 +12662,8 @@ msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"WorldEnvironment memerlukan properti \"Environment\" berisikan sebuah "
+"Environment agar hasilnya dapat dilihat."
#: scene/3d/world_environment.cpp
msgid ""
@@ -12497,32 +12677,30 @@ msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"WorldEnvironment ini diabaikan. Tambahkan Camera (untuk skena 3D) atau setel "
+"Mode Latar Belakang lingkungannya menjadi Canvas (untuk skena 2D)."
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr "Di Node BlendTree '%s', animasi tidak ditemukan: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Perkakas Animasi"
+msgstr "Animasi tidak ditemukan: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
msgstr "Di node '%s', animasi tidak valid: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "KESALAHAN: Nama animasi tidak valid!"
+msgstr "Animasi tidak valid: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Memutuskan '%s' dari '%s'"
+msgstr "Tidak ada yang terhubung ke input '%s' dari node '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "No root AnimationNode for the graph is set."
msgstr "Akar AnimationNode untuk grafik belum diatur."
@@ -12538,7 +12716,6 @@ msgstr ""
"AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
msgstr "Akar AnimationPlayer bukanlah node yang valid."
@@ -12552,32 +12729,31 @@ msgid ""
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"Warna:#%s\n"
+"LMB: Atur warna\n"
+"RMB: Cabut preset"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Pick a color from the editor window."
-msgstr "Ambil warna dari layar."
+msgstr "Ambil warna dari layar editor."
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Raw"
-msgstr "Mentah"
+msgstr "Raw (%)"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
msgstr "Beralih antara nilai heksadesimal dan kode."
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "Tambahkan warna yang sekarang sebagai preset"
+msgstr "Tambahkan warna yang sekarang sebagai preset."
#: scene/gui/container.cpp
-#, fuzzy
msgid ""
"Container by itself serves no purpose unless a script configures its "
"children placement behavior.\n"
@@ -12593,6 +12769,9 @@ msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"Tips Petunjuk tidak akan ditampilkan karena Filter Tetikus kontrolnya diatur "
+"ke \"Abaikan/Ignore\". Untuk mengatasinya, setel Filter Tetikus ke \"Stop\" "
+"atau \"Pass\"."
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -12603,24 +12782,23 @@ msgid "Please Confirm..."
msgstr "Mohon konfirmasi..."
#: scene/gui/popup.cpp
-#, fuzzy
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
-"Popup-popup akan disembunyikan secara default kecuali anda memanggil fungsi "
+"Popup akan disembunyikan secara default kecuali anda memanggil fungsi "
"popup() atau salah satu dari semua fungsi popup*() yang ada. Membuat mereka "
-"terlihat saat mengedit bisa dilakukan, namun mereka akan disembunyikan saat "
-"game dijalankan."
+"terlihat saat mengedit bisa dilakukan, namun mereka akan disembunyikan saat "
+"gim dijalankan."
#: scene/gui/range.cpp
-#, fuzzy
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr "jika exp_edit adalah true min_value seharusnya > 0."
+msgstr ""
+"Jika \"Exp Edit\" diaktifkan, \"Nilai Minimal\" seharusnya lebih besar dari "
+"0."
#: scene/gui/scroll_container.cpp
-#, fuzzy
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
@@ -12655,6 +12833,10 @@ msgstr ""
"tidak, jadikan sebagai RenderTarget dan tetapkan tekstur internal nya ke "
"beberapa node untuk ditampilkan."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "Ukuran viewport harus lebih besar dari 0 untuk me-render apa pun."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Sumber tidak sah untuk pratinjau."
@@ -12683,6 +12865,54 @@ msgstr "Variasi hanya bisa ditetapkan dalam fungsi vertex."
msgid "Constants cannot be modified."
msgstr "Konstanta tidak dapat dimodifikasi."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Dok Impor dan Berkas Sistem"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Saat mengekspor atau mendeploy, hasil executable akan mencoba terhubung "
+#~ "ke IP komputer untuk diawakutu."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Skena saat ini belum pernah disimpan, harap simpan terlebih dahulu "
+#~ "sebelum menjalankannya."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Tidak dalam lokasi resource."
+
+#~ msgid "Revert"
+#~ msgstr "Pulihkan"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Tindakan ini tidak dapat dibatalkan. Pulihkan saja?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Kembalikan Skena"
+
+#~ msgid "Clear Script"
+#~ msgstr "Bersihkan Skrip"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Pelacak Isu"
+
+#~ msgid "Request Docs"
+#~ msgstr "Minta Dokumentasi"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Bantu tingkatkan dokumentasi Godot dengan memberikan tanggapan."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "kejadian %d diganti."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Buat Bodi Cembung Statis"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Gagal membuat bentuk!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/is.po b/editor/translations/is.po
index 7a2250c0b2..b39913e3c6 100644
--- a/editor/translations/is.po
+++ b/editor/translations/is.po
@@ -4,12 +4,13 @@
# This file is distributed under the same license as the Godot source code.
# Jóhannes G. Þorsteinsson <johannesg@johannesg.com>, 2017, 2018.
# Kaan Gül <qaantum@hotmail.com>, 2018.
+# Einar Magnús Einarsson <einar.m.einarsson@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-12-13 14:40+0100\n"
-"Last-Translator: Jóhannes G. Þorsteinsson <johannesg@johannesg.com>\n"
+"PO-Revision-Date: 2020-04-16 11:03+0000\n"
+"Last-Translator: Einar Magnús Einarsson <einar.m.einarsson@gmail.com>\n"
"Language-Team: Icelandic <https://hosted.weblate.org/projects/godot-engine/"
"godot/is/>\n"
"Language: is\n"
@@ -17,34 +18,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: Poedit 2.2\n"
+"X-Generator: Weblate 4.0.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "Ógild breyta send til convert(), notaðu TYPE_ * fasti."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Búist var við streng með lengd 1 (a character)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "Ekki nægt minni til að umskrá bæti eða ógilt snið."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ógild inntak % i (ekki sent áfram)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"Ekki hægt að nota \"self\" vegna þess að tilvik er \"null\" (ekki samþykkt)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "Ógilt reiknitákn notað í útreikningi % s,% s og% s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
@@ -534,6 +536,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -699,7 +702,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -718,7 +721,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -768,6 +771,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -847,7 +854,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -905,6 +911,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -942,7 +952,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1117,6 +1127,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Verkefna Stjóri "
@@ -1138,6 +1151,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1441,7 +1462,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1449,16 +1470,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1486,6 +1499,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1606,15 +1623,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1765,7 +1782,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1879,7 +1896,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2290,10 +2307,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2378,11 +2391,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2650,10 +2665,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2714,22 +2725,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2738,8 +2753,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2748,32 +2763,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2834,7 +2849,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2848,7 +2863,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3232,7 +3251,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3259,6 +3279,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3846,19 +3870,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3874,7 +3902,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3908,10 +3936,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4969,7 +4993,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5710,11 +5734,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5726,11 +5750,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5782,19 +5822,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Breyta Viðbót"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Breyta Viðbót"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6635,14 +6713,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6704,11 +6774,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7073,6 +7143,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7161,17 +7235,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7514,7 +7597,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8191,7 +8274,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9286,11 +9369,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9298,11 +9386,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9520,6 +9608,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Verkefna Stjóri"
@@ -9568,6 +9657,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9947,11 +10043,19 @@ msgid "Batch Rename"
msgstr "Endurnefning Anim track"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9989,11 +10093,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10019,10 +10123,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10031,11 +10131,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10054,6 +10154,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10117,7 +10225,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10154,6 +10262,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Anim DELETE-lyklar"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Anim DELETE-lyklar"
@@ -10278,6 +10391,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10324,11 +10444,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10449,6 +10569,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10489,6 +10613,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10497,7 +10625,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10521,6 +10649,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10589,6 +10723,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10637,7 +10775,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11517,6 +11655,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11540,6 +11682,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11717,6 +11885,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11904,6 +12078,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11924,6 +12103,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12143,6 +12327,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/it.po b/editor/translations/it.po
index a549df218c..b16db7243d 100644
--- a/editor/translations/it.po
+++ b/editor/translations/it.po
@@ -13,7 +13,7 @@
# Myself <whatamidoing.wt@gmail.com>, 2017-2018.
# RealAquilus <JamesHeller@live.it>, 2017.
# Samuele Zolfanelli <samdazel@gmail.com>, 2018, 2019.
-# Sean Bone <seanbone@zumguy.com>, 2017.
+# Sean Bone <seanbone@zumguy.com>, 2017, 2020.
# Red Pill <redpill902@gmail.com>, 2018.
# iRadEntertainment <devitadario@gmail.com>, 2018, 2019.
# ondsinet _ (nik man) <nikman00@gmail.com>, 2018.
@@ -27,28 +27,40 @@
# Hairic95 <hairic95@gmail.com>, 2019.
# Christian Biffi <creixx@virgilio.it>, 2019.
# Giuseppe Guerra <me@nyodev.xyz>, 2019.
-# RHC <rhc.throwaway@gmail.com>, 2019.
-# Antonio Giungato <antonio.giungato@gmail.com>, 2019.
-# Marco Galli <mrcgll98@gmail.com>, 2019.
-# MassiminoilTrace <omino.gis@gmail.com>, 2019.
+# RHC <rhc.throwaway@gmail.com>, 2019, 2020.
+# Antonio Giungato <antonio.giungato@gmail.com>, 2019, 2020.
+# Marco Galli <mrcgll98@gmail.com>, 2019, 2020.
+# MassiminoilTrace <omino.gis@gmail.com>, 2019, 2020.
# MARCO BANFI <mbanfi@gmail.com>, 2019.
# Marco <rodomar705@gmail.com>, 2019.
# Davide Giuliano <davidegiuliano00@gmail.com>, 2019.
# Stefano Merazzi <asso99@hotmail.com>, 2019.
# Sinapse X <sinapsex13@gmail.com>, 2019.
# Micila Micillotto <micillotto@gmail.com>, 2019, 2020.
-# Mirko Soppelsa <miknsop@gmail.com>, 2019.
+# Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020.
# No <kingofwizards.kw7@gmail.com>, 2019.
# StarFang208 <polaritymanx@yahoo.it>, 2019.
# Katia Piazza <gydey@ridiculousglitch.com>, 2019.
# nickfla1 <lanterniniflavio@gmail.com>, 2019.
# Fabio Iotti <fabiogiopla@gmail.com>, 2020.
+# Douglas Fiedler <dognew@gmail.com>, 2020.
+# E440QF <ettore.beltra@gmail.com>, 2020.
+# Giuseppe Lucido <giuseppe.lucido@gmail.com>, 2020.
+# Mirko Proto <mirko7@protonmail.com>, 2020.
+# J. Lavoie <j.lavoie@net-c.ca>, 2020.
+# Andrea Terenziani <andrea.terenziani.at@gmail.com>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
+# riccardo boffelli <riccardo.boffelli.96@gmail.com>, 2020.
+# Lorenzo Asolan <brixiumx@gmail.com>, 2020.
+# Lorenzo Cerqua <lorenzocerqua@tutanota.com>, 2020.
+# Federico Manzella <ferdiu.manzella@gmail.com>, 2020.
+# Ziv D <wizdavid@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
-"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n"
+"PO-Revision-Date: 2020-09-22 03:23+0000\n"
+"Last-Translator: Mirko <miknsop@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
"godot/it/>\n"
"Language: it\n"
@@ -56,28 +68,28 @@ 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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Argomento non valido per convert(), usare le costanti TYPE_*."
+msgstr "Argomento tipo non valido per convert(), usare le costanti TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "Prevista una stringa di lunghezza 1 (singolo carattere)."
+msgstr "Prevista una stringa di lunghezza 1 (un singolo carattere)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
-"Non vi sono abbastanza byte per i byte di decodifica, oppure il formato non "
-"è valido."
+"Non ci sono abbastanza byte per riuscire a decodificarli, oppure il formato "
+"non è valido."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Input non valido %i (non passato) nell'espressione"
+msgstr "Input non valido %i (assente) nell'espressione"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -89,7 +101,7 @@ msgstr "Operandi non validi per l'operatore %s, %s e %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "Indice del tipo %s non valido per il tipo base %s"
+msgstr "Indice di tipo %s non valido per il tipo base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
@@ -97,7 +109,7 @@ msgstr "Nome indice '%s' non valido per il tipo base %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "Argomenti non validi per il costrutto '%s'"
+msgstr "Argomenti non validi per costruire '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -230,7 +242,7 @@ msgstr "Modifica ciclicità animazione"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr "Proprietà Traccia"
+msgstr "Traccia proprietà"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
@@ -238,7 +250,7 @@ msgstr "Traccia trasformazione 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr "Traccia di Chiamata di Metodi"
+msgstr "Traccia chiamata metodo"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
@@ -254,7 +266,7 @@ msgstr "Traccia di riproduzione animazione"
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr "Durata Animazione (frames)"
+msgstr "Durata animazione (fotogrammi)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
@@ -266,7 +278,7 @@ msgstr "Aggiungi Traccia"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr "Ciclicità Animazione"
+msgstr "Ripeti Ciclicamente Animazione"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -279,7 +291,7 @@ msgstr "Clip Audio:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr "Clip Anim:"
+msgstr "Clip Animazione:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
@@ -295,11 +307,11 @@ msgstr "Modalità di aggiornamento (Come viene impostata questa proprietà)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr "Modalità di Interpolazione"
+msgstr "Modalità Interpolazione"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr "Modalità Loop Wrap (Interpola la fine con l'inizio del loop)"
+msgstr "Modalità Ciclo ad Anello (Interpola la fine con l'inizio del ciclo)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
@@ -567,6 +579,7 @@ msgid "Seconds"
msgstr "Secondi"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -674,7 +687,7 @@ msgstr "Pulisci"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr "Fattore di scalatura:"
+msgstr "Fattore di scala:"
#: editor/animation_track_editor.cpp
msgid "Select Tracks to Copy"
@@ -719,15 +732,15 @@ msgstr "Cambia valore array"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "Va' alla linea"
+msgstr "Vai alla linea"
#: editor/code_editor.cpp
msgid "Line Number:"
msgstr "Numero linea:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Rimpiazzate %d occorrenze."
+msgid "%d replaced."
+msgstr "%d rimpiazzato."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -745,9 +758,9 @@ msgstr "Distingui maiuscole"
msgid "Whole Words"
msgstr "Parole intere"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr "Rimpiazza"
+msgstr "Sostituisci"
#: editor/code_editor.cpp
msgid "Replace All"
@@ -764,7 +777,7 @@ msgstr "Standard"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr "Attiva Pannello Scripts"
+msgstr "Commuta pannello degli script"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -780,7 +793,7 @@ msgstr "Rimpicciolisci"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Azzera ingrandimento"
+msgstr "Resetta ingrandimento"
#: editor/code_editor.cpp
msgid "Warnings"
@@ -795,6 +808,10 @@ msgid "Method in target node must be specified."
msgstr "Il metodo del nodo designato deve essere specificato."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Il nome del metodo dev'essere un identificatore valido."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -878,7 +895,6 @@ msgstr "Impossibile connettere il segnale"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -935,6 +951,11 @@ msgid "Signals"
msgstr "Segnali"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtra tiles"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Sei sicuro di voler rimuovere tutte le connessioni da questo segnale?"
@@ -972,7 +993,7 @@ msgid "Recent:"
msgstr "Recenti:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cerca:"
@@ -1035,11 +1056,11 @@ msgstr "Dipendenze:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
-msgstr "Riparare rotti"
+msgstr "Ripara rotti"
#: editor/dependency_editor.cpp
msgid "Dependency Editor"
-msgstr "Editor dipendenze"
+msgstr "Editor Dipendenze"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
@@ -1143,7 +1164,7 @@ msgstr "Grazie dalla comunità di Godot!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
-msgstr "Contributori a Godot Engine"
+msgstr "Contributori di Godot engine"
#: editor/editor_about.cpp
msgid "Project Founders"
@@ -1153,6 +1174,9 @@ msgstr "Fondatori del progetto"
msgid "Lead Developer"
msgstr "Sviluppatore principale"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Gestore progetto "
@@ -1174,6 +1198,14 @@ msgid "Gold Sponsors"
msgstr "Sponsor oro"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Sponsor Argento"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Sponsor Bronzo"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Sponsor mini"
@@ -1377,7 +1409,7 @@ msgstr "Salva disposizione del bus audio come..."
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
-msgstr "Posizione della nuova disposizione…"
+msgstr "Posizione per la nuova disposizione..."
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
@@ -1427,7 +1459,7 @@ msgstr "Salva questa disposizione bus in un file."
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
-msgstr "Carica predefiniti"
+msgstr "Carica Predefiniti"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
@@ -1483,7 +1515,7 @@ msgstr "Sposta Autoload"
msgid "Remove Autoload"
msgstr "Rimuovi Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Abilita"
@@ -1491,17 +1523,9 @@ msgstr "Abilita"
msgid "Rearrange Autoloads"
msgstr "Riordina gli Autoload"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Percorso non valido."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "File inesistente."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Non è nel percorso risorse."
+msgid "Can't add autoload:"
+msgstr "Non è possibile aggiungere l'autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1528,6 +1552,10 @@ msgstr "Nome"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Incolla Parametri"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Aggiornamento scena"
@@ -1645,7 +1673,7 @@ msgstr "Editor 3D"
#: editor/editor_feature_profile.cpp
msgid "Script Editor"
-msgstr "Editor degli script"
+msgstr "Editor script"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
@@ -1656,16 +1684,17 @@ msgid "Scene Tree Editing"
msgstr "Editor delle scene"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importa"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Nodo"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Filesystem e dock di importazione"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Filesystem"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importa"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1748,7 +1777,7 @@ msgstr "Nuovo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "Importa"
+msgstr "Importare"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
@@ -1815,7 +1844,7 @@ msgstr "Mostra nel gestore file"
msgid "New Folder..."
msgstr "Nuova cartella..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Aggiorna"
@@ -1861,15 +1890,15 @@ msgstr "Torna indietro"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr "Va' avanti"
+msgstr "Vai avanti"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr "Va' su"
+msgstr "Vai su"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "Attiva/disattiva file nascosti"
+msgstr "Mostra/nascondi file nascosti"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
@@ -1877,11 +1906,11 @@ msgstr "Attiva/disattiva preferito"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr "Modalità Attivazione/Disattivazione"
+msgstr "Commuta Modalità"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "Percorso di Focus"
+msgstr "Metti a fuoco il percorso"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
@@ -1929,7 +1958,7 @@ msgstr "File e cartelle:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Anteprima:"
@@ -2000,7 +2029,7 @@ msgstr "Metodi"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "Proprietà del tema"
+msgstr "Proprietà Tema"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2012,7 +2041,7 @@ msgstr "Costanti"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr "Descrizioni delle proprietà"
+msgstr "Descrizioni Proprietà"
#: editor/editor_help.cpp
msgid "(value)"
@@ -2028,7 +2057,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Descrizioni dei metodi"
+msgstr "Descrizioni Metodo"
#: editor/editor_help.cpp
msgid ""
@@ -2371,12 +2400,6 @@ msgid "There is no defined scene to run."
msgstr "Non c'è nessuna scena definita da eseguire."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"La scena attuale non è mai stata salvata, si prega di salvarla prima di "
-"eseguirla."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Impossibile avviare il sottoprocesso!"
@@ -2461,12 +2484,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Impossibile ricaricare una scena che non è mai stata salvata."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Ripristina"
+msgid "Reload Saved Scene"
+msgstr "Ricarica scena salvata"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Questa azione non può essere annullata. Ripristinare comunque?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"La scena attuale ha dei cambiamenti non salvati.\n"
+"Ricaricare comunque la scena salvata? Questa azione non può essere annullata."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2516,7 +2543,7 @@ msgstr "Chiudi scena"
#: editor/editor_node.cpp
msgid "Reopen Closed Scene"
-msgstr "Riapri Scena Chiusa"
+msgstr "Riapri la scena chiusa"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2527,12 +2554,14 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
msgstr ""
-"Impossibile trovare il campo per lo script del componente aggiuntivo in: "
+"Impossibile trovare il campo dello script per il componente aggiuntivo in: "
"'res://addons/%s'."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "Impossibile caricare uno script aggiuntivo dal percorso: '%s'."
+msgstr ""
+"Impossibile caricare lo script di un componente aggiuntivo dal percorso: "
+"'%s'."
#: editor/editor_node.cpp
msgid ""
@@ -2552,8 +2581,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
-"Impossibile caricare uno script aggiuntivo dal percorso: Lo script '%s' non "
-"è in tool mode."
+"Impossibile caricare lo script di un componente aggiuntivo dal percorso: "
+"'%s' Lo script non è in modalità strumento."
#: editor/editor_node.cpp
msgid ""
@@ -2613,16 +2642,16 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Save Layout"
-msgstr "Salva layout"
+msgstr "Salva disposizione"
#: editor/editor_node.cpp
msgid "Delete Layout"
-msgstr "Elimina Layout"
+msgstr "Elimina disposizione"
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
msgid "Default"
-msgstr "Default"
+msgstr "Predefinito"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
@@ -2671,7 +2700,7 @@ msgstr "%d altri file"
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr "Posizione dock"
+msgstr "Posizione Dock"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
@@ -2760,10 +2789,6 @@ msgid "Redo"
msgstr "Rifai"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Ripristina scena"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Strumenti di progetto o scena vari."
@@ -2774,7 +2799,7 @@ msgstr "Progetto"
#: editor/editor_node.cpp
msgid "Project Settings..."
-msgstr "Impostazioni Progetto…"
+msgstr "Impostazioni progetto…"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control"
@@ -2794,7 +2819,7 @@ msgstr "Esporta..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr "Installa il Build Template di Android…"
+msgstr "Installa il Modello di Costruzione di Android…"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
@@ -2823,25 +2848,28 @@ msgstr "Distribuisci con Debug remoto"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"L'eseguibile, dopo l'esportazione o la distribuzione, attenterà di "
-"connettersi con l'indirizzo IP di questo computer per farsi eseguire il "
-"debug."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Piccola distribuzione con la rete FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Quando questa opzione è abilitata, l'esportazione o distribuzione produrrà "
"un eseguibile minimale.\n"
@@ -2855,9 +2883,10 @@ msgid "Visible Collision Shapes"
msgstr "Forme di collisione visibili"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Le forme di collisione e i nodi di raycast (per il 2D e 3D) saranno visibili "
"nel gioco in esecuzione se l'opzione è attiva."
@@ -2867,23 +2896,26 @@ msgid "Visible Navigation"
msgstr "Navigazione Visibile"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Le mesh e i poligoni di navigazione saranno visibili nel gioco in esecuzione "
"se l'opzione è attiva."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sincronizza cambiamenti scena"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Quando questa opzione è attiva, qualsiasi cambiamento fatto alla scena "
"nell'editor sarà replicato nel gioco in esecuzione.\n"
@@ -2891,15 +2923,17 @@ msgstr ""
"filesystem in rete."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sincronizza cambiamenti script"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Quando questa opzione è attiva, qualsiasi script salvato verrà ricaricato "
"nel gioco in esecuzione.\n"
@@ -2916,11 +2950,11 @@ msgstr "Impostazioni editor…"
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr "Layout dell'editor"
+msgstr "Disposizione dell'editor"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr "Acquisisci screenshot"
+msgstr "Acquisisci una schermata"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
@@ -2941,7 +2975,7 @@ msgstr "Apri cartella dati/impostazioni editor"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr "Apri la cartella dati dell'editor"
+msgstr "Apri la Cartella dei Dati dell'Editor"
#: editor/editor_node.cpp
msgid "Open Editor Settings Folder"
@@ -2953,7 +2987,7 @@ msgstr "Gestisci le funzionalità dell'editor…"
#: editor/editor_node.cpp
msgid "Manage Export Templates..."
-msgstr "Gestisci template d'esportazione…"
+msgstr "Gestisci Modello d'Esportazione…"
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2964,7 +2998,7 @@ msgstr "Aiuto"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Cerca"
@@ -2978,8 +3012,12 @@ msgid "Q&A"
msgstr "Domande e risposte"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Tracciatore segnalazioni"
+msgid "Report a Bug"
+msgstr "Segnala un problema"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Valuta documentazione"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2987,7 +3025,7 @@ msgstr "Comunità"
#: editor/editor_node.cpp
msgid "About"
-msgstr "Riguardo a"
+msgstr "Informazioni su Godot"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -3003,7 +3041,7 @@ msgstr "Metti in pausa l'esecuzione della scena per eseguire il debug."
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr "Pausa Scena"
+msgstr "Pausa scena"
#: editor/editor_node.cpp
msgid "Stop the scene."
@@ -3023,7 +3061,7 @@ msgstr "Esegui scena personalizzata"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Esegui scena personalizzata"
+msgstr "Avvia scena personalizzata"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
@@ -3060,7 +3098,7 @@ msgstr "Ispettore"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Espandi pannello inferiore"
+msgstr "Espandi Pannello Inferiore"
#: editor/editor_node.cpp
msgid "Output"
@@ -3078,7 +3116,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Manage Templates"
-msgstr "Gestisci i template d'esportazione"
+msgstr "Gestisci i modelli d'esportazione"
#: editor/editor_node.cpp
msgid ""
@@ -3106,7 +3144,7 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
-"Il template della build Android è già installato in questo progetto e non "
+"Il modello della build Android è già installato in questo progetto e non "
"sarà sovrascritto.\n"
"Rimuovi la cartella \"res://android/build\" manualmente prima di ritentare "
"questa operazione."
@@ -3145,7 +3183,7 @@ msgstr "Seleziona"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "Apri editor 2D"
+msgstr "Apri Editor 2D"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
@@ -3153,7 +3191,7 @@ msgstr "Apri Editor 3D"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "Apri Editor Script"
+msgstr "Apri Editor degli script"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -3234,7 +3272,7 @@ msgstr "Frame %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr "Frame della Fisica %"
+msgstr "Fotogramma della Fisica %"
#: editor/editor_profiler.cpp
msgid "Inclusive"
@@ -3380,9 +3418,11 @@ msgid "Add Key/Value Pair"
msgstr "Aggiungi Coppia Chiave/Valore"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Non sono stati trovati dei modelli di export eseguibili per questa "
"piattaforma.\n"
@@ -3412,6 +3452,12 @@ msgstr "Impossibile eseguire lo script:"
msgid "Did you forget the '_run' method?"
msgstr "Hai dimenticato il metodo '_run'?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Tenere premuto il tasto Ctrl per arrotondare ai numeri interi. Tenere "
+"premuto Shift per modifiche più precise."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Scegli Nodo(i) da Importare"
@@ -3506,8 +3552,8 @@ msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
msgstr ""
-"Non sono stati trovati link di download per questa versione. Il download "
-"diretto è disponibile solamente per rilasci ufficiali."
+"Nessun collegamento di download trovato per questa versione. I download "
+"diretti sono disponibili solo per i rilasci ufficiali."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3601,7 +3647,7 @@ msgstr "Errore di Connessione"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr "Errore nell'Handshake SSL"
+msgstr "Errore Handshake SSL"
#: editor/export_template_manager.cpp
msgid "Uncompressing Android Build Sources"
@@ -3629,7 +3675,7 @@ msgstr "Seleziona file template"
#: editor/export_template_manager.cpp
msgid "Godot Export Templates"
-msgstr "Template di Export"
+msgstr "Modello di Esportazione Godot"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3637,7 +3683,7 @@ msgstr "Gestore Template Esportazione"
#: editor/export_template_manager.cpp
msgid "Download Templates"
-msgstr "Scarica Template"
+msgstr "Scarica Modelli"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
@@ -3828,7 +3874,7 @@ msgstr "Crea Script"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
msgid "Find in Files"
-msgstr "Trova nei File"
+msgstr "Trova nei file"
#: editor/find_in_files.cpp
msgid "Find:"
@@ -4010,20 +4056,25 @@ msgid "Error running post-import script:"
msgstr "Errore di esecuzione dello script di post-import:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+"Hai restituito un oggetto derivato da un Nodo nel metodo `post_import()`?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Salvataggio..."
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr "Imposta come Default per '%s'"
+msgid "%d Files"
+msgstr "%d File"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
-msgstr "Elimina Default per '%s'"
+msgid "Set as Default for '%s'"
+msgstr "Imposta come Predefinito per '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Files"
+msgid "Clear Default for '%s'"
+msgstr "Elimina Predefinito per '%s'"
#: editor/import_dock.cpp
msgid "Import As:"
@@ -4038,8 +4089,8 @@ msgid "Reimport"
msgstr "Reimporta"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Salva scene, importa nuovamente e riavvia"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Salva scene, re-importa e riavvia"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4074,10 +4125,6 @@ msgid "Copy Params"
msgstr "Copia parametri"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Incolla Parametri"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Modifica Appunti Risorse"
@@ -4634,11 +4681,11 @@ msgstr "1 passo"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "2 steps"
-msgstr "2 passaggi"
+msgstr "2 passi"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "3 steps"
-msgstr "3 passaggi"
+msgstr "3 passi"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Differences Only"
@@ -4783,7 +4830,7 @@ msgstr "Modalità Gioco:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr "AnimazioneAlbero"
+msgstr "AnimationTree"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -5152,7 +5199,7 @@ msgid "Bake Lightmaps"
msgstr "Preprocessa Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Anteprima"
@@ -5166,7 +5213,7 @@ msgstr "Offset Griglia:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Step:"
-msgstr "Step Griglia:"
+msgstr "Passo della griglia:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
@@ -5174,7 +5221,7 @@ msgstr "Line Primaria Ogni:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "steps"
-msgstr "passaggi"
+msgstr "passi"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -5182,11 +5229,11 @@ msgstr "Offset Rotazione:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
-msgstr "Step Rotazione:"
+msgstr "Passo di rotazione:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale Step:"
-msgstr "Intervallo:"
+msgstr "Passo di scala:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Vertical Guide"
@@ -5384,7 +5431,7 @@ msgstr "Incolla Posa"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Guides"
-msgstr "Rimuvi Guide"
+msgstr "Rimuovi guide"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
@@ -5414,12 +5461,12 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Ripristino Zoom"
+msgstr "Ripristina ingrandimento"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr "Modalità di Selezione"
+msgstr "Modalità di selezione"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
@@ -5442,17 +5489,17 @@ msgstr "Alt+RMB: Selezione Lista Profondità"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
-msgstr "Modalità Movimento"
+msgstr "Modalità spostamento"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Modalità Rotazione"
+msgstr "Modalità rotazione"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
-msgstr "Modalità Scala"
+msgstr "Modalità scala"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5473,7 +5520,7 @@ msgstr "Modalità di Pan"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Ruler Mode"
-msgstr "Modalità Righello"
+msgstr "Modalità righello"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
@@ -5481,7 +5528,7 @@ msgstr "Abilita snapping intelligente."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Smart Snap"
-msgstr "Usa lo Snap Intelligente"
+msgstr "Usa lo Snap intelligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle grid snapping."
@@ -5489,7 +5536,7 @@ msgstr "Abilita/Disabilita snapping magnetico."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
-msgstr "Usa snap magnetico"
+msgstr "Usa Griglia Magnetica"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
@@ -5587,11 +5634,11 @@ msgstr "Vista"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
-msgstr "Mostra Sempre Griglia"
+msgstr "Mostra sempre Griglia"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
-msgstr "Mostra Guide"
+msgstr "Mostra guide"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Rulers"
@@ -5599,7 +5646,7 @@ msgstr "Mostra Righelli"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Guides"
-msgstr "Mostra guide"
+msgstr "Mostra Guide"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Origin"
@@ -5615,15 +5662,15 @@ msgstr "Mostra Gruppo e Blocca Icone"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "Centra Selezione"
+msgstr "Centra selezione"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "Selezione Frame"
+msgstr "Selezione frame"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
-msgstr "Anteprima dimensione canvas"
+msgstr "Anteprima Dimensione Canvas"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
@@ -5664,7 +5711,7 @@ msgstr "Chiavi d'Animazione e Opzioni Posa"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr "Inserisci Key (Tracce Esistenti)"
+msgstr "Inserisci chiave (tracce esistenti)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -5672,7 +5719,7 @@ msgstr "Copia Posa"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Pose"
-msgstr "Pulisci Posa"
+msgstr "Azzera posa"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
@@ -5684,7 +5731,7 @@ msgstr "Dividi per 2 il passo della griglia"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan View"
-msgstr "Vista panoramica"
+msgstr "Trasla Visuale"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -5710,7 +5757,7 @@ msgstr "Errore istanziamento scena da %s"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Change Default Type"
-msgstr "Cambia tipo di default"
+msgstr "Cambia Tipo Predefinito"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5905,12 +5952,12 @@ msgid "Mesh is empty!"
msgstr "La mesh è vuota!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Crea Corpo Trimesh Statico"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Non poteva creare una forma di collisione Trimesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Crea Corpo Convesso Statico"
+msgid "Create Static Trimesh Body"
+msgstr "Crea Corpo Trimesh Statico"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5921,12 +5968,32 @@ msgid "Create Trimesh Static Shape"
msgstr "Crea Forma Statica Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Errore nella creazione delle forme!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"Impossibile creare una singola forma di collisione convessa per la radice "
+"della scena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Impossibile creare una singola forma di collisione convessa."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Crea Singola Forma di Collisione Convessa"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Impossibile creare più forme di collisione convesse per la radice della "
+"scena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Impossibile creare alcuna forma di collisione."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Crea una o più forme Convesse"
+msgid "Create Multiple Convex Shapes"
+msgstr "Crea Multiple Forme Covesse"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5978,18 +6045,72 @@ msgid "Create Trimesh Static Body"
msgstr "Crea Corpo Statico Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crea una StaticBody e le assegna automaticamente una forma di collisione "
+"basata sui poligoni.\n"
+"Questa é l'opzione piú accurata (anche se piú lenta) per il calcolo delle "
+"collisioni."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Crea Fratello di Collisione Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Crea Fratello(i) di Collisione Convessa"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Crea una forma di collisione basata sui poligoni.\n"
+"Questa é l'opzione piú accurata (anche se piú lenta) per il calcolo delle "
+"collisioni."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Crea Singolo Fratello di Collisione Convessa"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Crea una singola forma di collisione convessa.\n"
+"Questa é l'opzione piú veloce (anche se meno accurata) per il calcolo delle "
+"collisioni."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Crea Multipli Fratelli di Collsione Convessa"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Crea una forma di collisione basata sui poligoni.\n"
+"Questa opzione é, in termini di perfomance, un compromesso tra le due "
+"opzioni prima di questa."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Crea Mesh di Outline..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Crea intorno una mesh statica. Questa mesh avrà le suoe normali invertite "
+"automaticamente.\n"
+"Questo puó essere usato come sostitutivo per la proprietà Grow (ingrandisci) "
+"delle SpatialMaterial quando questa non é disponibile."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Vista UV1"
@@ -6550,11 +6671,11 @@ msgstr "Offset Y Griglia:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Step X:"
-msgstr "Step X Griglia:"
+msgstr "Passo X della griglia:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Step Y:"
-msgstr "Step Y Griglia:"
+msgstr "Passo Y della griglia:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Sync Bones to Polygon"
@@ -6708,12 +6829,12 @@ msgstr "%s Riferimento di Classe"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr "Trova Successivo"
+msgstr "Trova successivo"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
-msgstr "Trova Precedente"
+msgstr "Trova precedente"
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter scripts"
@@ -6735,13 +6856,13 @@ msgstr "Ordina"
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Up"
-msgstr "Sposta Su"
+msgstr "Sposta in su"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr "Sposta giù"
+msgstr "Sposta in giù"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
@@ -6761,15 +6882,15 @@ msgstr "Apri..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reopen Closed Script"
-msgstr "Riapri Script Chiuso"
+msgstr "Riapri lo script chiuso"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
-msgstr "Salva Tutto"
+msgstr "Salva tutto"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "Ricarica Script Soft"
+msgstr "Ricarica Soft Script"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
@@ -6814,11 +6935,11 @@ msgstr "Esegui"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
-msgstr "Passo Precedente"
+msgstr "Passo dentro all'istruzione"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
-msgstr "Passo Successivo"
+msgstr "Passo successivo"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
@@ -6842,14 +6963,6 @@ msgid "Open Godot online documentation."
msgstr "Apri la documentazione online di Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Documentazione richiesta"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Aiutate a migliorare la documentazione di Godot fornendo feedback."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Cerca Riferimenti nella documentazione."
@@ -6914,16 +7027,16 @@ msgstr ""
"Manca il metodo '%s' connesso per il segnale '%s' dal nodo '%s' al nodo '%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Linea"
+msgid "[Ignore]"
+msgstr "[ignora]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignora)"
+msgid "Line"
+msgstr "Linea"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
-msgstr "Vai a Funzione"
+msgstr "Vai alla funzione"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -6957,7 +7070,7 @@ msgstr "Minuscolo"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "Aggiungi maiuscola iniziale"
+msgstr "Rendi prima lettera maiuscola"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
@@ -6975,7 +7088,7 @@ msgstr "Segnalibri"
#: editor/plugins/script_text_editor.cpp
msgid "Breakpoints"
-msgstr "Punti di rottura"
+msgstr "Breakpoint"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -6985,11 +7098,11 @@ msgstr "Taglia"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Select All"
-msgstr "Seleziona tutti"
+msgstr "Seleziona tutto"
#: editor/plugins/script_text_editor.cpp
msgid "Delete Line"
-msgstr "Elimina Linea"
+msgstr "Elimina linea"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
@@ -7001,11 +7114,11 @@ msgstr "Indenta Destra"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
-msgstr "Cambia a Commento"
+msgstr "Commuta commento"
#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
-msgstr "Piega/Dispiega Linea"
+msgstr "Espandi/comprimi linea"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
@@ -7017,31 +7130,31 @@ msgstr "Dispiegare Tutte le Linee"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr "Clona Sotto"
+msgstr "Clona sotto"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr "Completa Simbolo"
+msgstr "Completa simbolo"
#: editor/plugins/script_text_editor.cpp
msgid "Evaluate Selection"
-msgstr "Valuta Selezione"
+msgstr "Valuta selezione"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "Taglia Spazi in Coda"
+msgstr "Taglia spazi in coda"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
-msgstr "Converti Indentazione in Spazi"
+msgstr "Converti l'indentazione in spazi"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Tabs"
-msgstr "Converti Indentazione in Tabulazioni"
+msgstr "Converti l'indentazione in tabulazioni"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "Auto Indenta"
+msgstr "Indenta automaticamente"
#: editor/plugins/script_text_editor.cpp
msgid "Find in Files..."
@@ -7049,19 +7162,19 @@ msgstr "Cerca nei File..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
-msgstr "Aiuto Contestuale"
+msgstr "Aiuto contestuale"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Bookmark"
-msgstr "Abilita/Disabilita Segnalibri"
+msgstr "Abilita/Disabilita segnalibri"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Bookmark"
-msgstr "Vai al Segnalibri Successivo"
+msgstr "Va' al segnalibro successivo"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Bookmark"
-msgstr "Vai al Segnalibri Precedente"
+msgstr "Va' al segnalibro precedente"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Bookmarks"
@@ -7078,19 +7191,19 @@ msgstr "Vai a Linea..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Abilita Breakpoint"
+msgstr "Commuta breakpoint"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Rimuovi Tutti i Breakpoints"
+msgstr "Rimuovi tutti i breakpoint"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Breakpoint"
-msgstr "Vai a Breakpoint Successivo"
+msgstr "Vai al breakpoint successivo"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Breakpoint"
-msgstr "Vai a Breakpoint Precedente"
+msgstr "Vai al breakpoint precedente"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -7178,7 +7291,7 @@ msgstr "Scalatura: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translating: "
-msgstr "Traducendo: "
+msgstr "Spostamento: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
@@ -7270,11 +7383,11 @@ msgstr "Retro"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "Allinea Trasformazione con la Vista"
+msgstr "Allinea trasformazione con la vista"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
-msgstr "Allinea Rotazione con la Vista"
+msgstr "Allinea rotazione con la vista"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -7285,6 +7398,10 @@ msgid "This operation requires a single selected node."
msgstr "Questa operazione richiede un solo nodo selezionato."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Ortogonale Automatico Abilitato"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Blocca Rotazione Vista"
@@ -7373,6 +7490,10 @@ msgid "Freelook Slow Modifier"
msgstr "Modificatore Vista Libera Velocità Lenta"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotazione Vista Bloccata"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7382,14 +7503,25 @@ msgstr ""
"gioco."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Rotazione Vista Bloccata"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Finestra di XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Fare clic per passare da uno stato di visibilità all'altro.\n"
+"\n"
+"Apri gli occhi: Gizmo è visibile.\n"
+"Occhio chiuso: Gizmo è nascosto.\n"
+"Occhio semiaperto: Gizmo è visibile anche attraverso superfici opache "
+"(\"raggi X\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Sposta i Nodi sul Pavimento"
@@ -7409,51 +7541,51 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Local Space"
-msgstr "Usa lo Spazio Locale"
+msgstr "Usa Spazio Locale"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "Usa lo Snap"
+msgstr "Usa Snap"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr "Vista dal Basso"
+msgstr "Vista dal basso"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
-msgstr "Vista dall'Alto"
+msgstr "Vista dall'alto"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr "Vista dal Retro"
+msgstr "Vista dal retro"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr "Vista Frontale"
+msgstr "Vista frontale"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
-msgstr "Vista Sinistra"
+msgstr "Vista laterale sinistra"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View"
-msgstr "Vista Destra"
+msgstr "Vista laterale destra"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr "Cambia tra Vista Prospettiva/Ortogonale"
+msgstr "Cambia tra vista prospettica/ortogonale"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
-msgstr "Inserisci Key Animazione"
+msgstr "Inserisci chiave animazione"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr "Focalizza su Origine"
+msgstr "Centra Origine"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
-msgstr "Centra a Selezione"
+msgstr "Centra la Selezione"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
@@ -7728,7 +7860,8 @@ msgid "New Animation"
msgstr "Nuova Animazione"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Velocità (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7822,7 +7955,7 @@ msgstr "Offset:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Step:"
-msgstr "Step:"
+msgstr "Passo:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
@@ -7987,7 +8120,7 @@ msgstr "File Tema"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
-msgstr "Cancella Selezione"
+msgstr "Cancella selezione"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Fix Invalid Tiles"
@@ -7996,7 +8129,7 @@ msgstr "Correggi le Tile non Valide"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cut Selection"
-msgstr "Taglia Selezione"
+msgstr "Taglia selezione"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -8020,7 +8153,7 @@ msgstr "Cancella TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Find Tile"
-msgstr "Trova Tile"
+msgstr "Trova tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -8045,7 +8178,7 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Disegna Tile"
+msgstr "Disegna tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
@@ -8057,7 +8190,7 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "Preleva Tile"
+msgstr "Preleva tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
@@ -8077,7 +8210,7 @@ msgstr "Ribalta verticalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Clear Transform"
-msgstr "Cancella la trasformazione"
+msgstr "Azzera la trasformazione"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet."
@@ -8109,7 +8242,7 @@ msgstr "Nuova Atlas"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Next Coordinate"
-msgstr "Prossima Coordinata"
+msgstr "Coordinata successiva"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
@@ -8117,7 +8250,7 @@ msgstr "Seleziona la prossima forma, sottotile, o Tile."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Previous Coordinate"
-msgstr "Coordinata Precedente"
+msgstr "Coordinata precedente"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
@@ -8153,27 +8286,27 @@ msgstr "Indice Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region Mode"
-msgstr "Modalità regione"
+msgstr "Modalità Regione"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Collision Mode"
-msgstr "Modalità di Collisione"
+msgstr "Modalità Collisioni"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Occlusion Mode"
-msgstr "Modalità di occlusione"
+msgstr "Modalità Occlusione"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Navigation Mode"
-msgstr "Modalità di navigazione"
+msgstr "Modalità Navigazione"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Bitmask Mode"
-msgstr "Modalità Maschera di Bit"
+msgstr "Modalità Bitmask"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Priority Mode"
-msgstr "Modalità prioritaria"
+msgstr "Modalità Priorità"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon Mode"
@@ -8181,7 +8314,7 @@ msgstr "Modalità Icona"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Z Index Mode"
-msgstr "Modalità indice Z"
+msgstr "Modalità Indice Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
@@ -8408,7 +8541,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "Non sono disponibili addons VCS."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Errore"
@@ -8569,7 +8702,7 @@ msgstr "Imposta Nome Uniforme"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Input Default Port"
-msgstr "Imposta Porta Input di Default"
+msgstr "Imposta Porta Input Predefinita"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node to Visual Shader"
@@ -8582,7 +8715,7 @@ msgstr "Duplica Nodi"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste Nodes"
-msgstr "Incolla Nodi"
+msgstr "Incolla nodi"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
@@ -8614,7 +8747,7 @@ msgstr "Crea Nodo Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color function."
-msgstr "Colora funzione."
+msgstr "Funzione colore."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
@@ -8622,15 +8755,15 @@ msgstr "Operatore colore."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Grayscale function."
-msgstr "Funzione Grayscale."
+msgstr "Funzione scala di grigi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr "Converti vettore HSV nell'equivalente RGB."
+msgstr "Converte un vettore HSV nel suo equivalente RGB."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr "Converti vettore RGB nell'equivalente HSV."
+msgstr "Converte un vettore RGB nel suo equivalente HSV."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sepia function."
@@ -8638,31 +8771,31 @@ msgstr "Funzione seppia."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
-msgstr "Operatore Burn."
+msgstr "Operatore brucia."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Darken operator."
-msgstr "Operatore Darken."
+msgstr "Operatore scurisci."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Difference operator."
-msgstr "Operatore \"differenza\"."
+msgstr "Operatore differenza."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr "Operatore schivata."
+msgstr "Operatore scherma."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator."
-msgstr "Operatore HardLight."
+msgstr "Operatore luce dura."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr "Operatore \"schiarischi\"."
+msgstr "Operatore schiarisci."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr "Operatore overlay."
+msgstr "Operatore sovrapponi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
@@ -8670,7 +8803,7 @@ msgstr "Operatore schermo."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr "Operatore SoftLight."
+msgstr "Operatore luce morbida."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color constant."
@@ -8682,7 +8815,8 @@ msgstr "Uniforme di colore."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr "Ritorna il risultato booleano del confronto di %s tra due parametri."
+msgstr ""
+"Restituisce il risultato booleano del confronto di %s tra due parametri."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
@@ -8694,29 +8828,31 @@ msgstr "Maggiore Di (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr "Maggiore o Uguale (>=)"
+msgstr "Maggiore o uguale (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
msgstr ""
-"Ritorna un vettore associato se gli scalari di quello fornito sono uguali, "
-"maggiori o minori."
+"Restituisce un vettore associato se gli scalari di quello fornito sono "
+"uguali, maggiori o minori."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
msgstr ""
-"Ritorna il risultato booleano del confronto tra INF e un parametro scalare."
+"Restituisce il risultato booleano del confronto tra INF e un parametro "
+"scalare."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
msgstr ""
-"Ritorna il risultato booleano del confronto tra NaN e un parametro scalare."
+"Restituisce il risultato booleano del confronto tra NaN e un parametro "
+"scalare."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
@@ -8734,24 +8870,26 @@ msgstr "Non Uguale (!=)"
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
msgstr ""
-"Ritorna un vettore associato se il valore booleano fornito è vero o falso."
+"Restituisce un vettore associato se il valore booleano fornito è vero o "
+"falso."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated scalar if the provided boolean value is true or false."
-msgstr "Ritorna uno scalare associato se il booleano provvisto è vero o falso."
+msgstr ""
+"Restituisce uno scalare associato se il booleano fornito è vero o falso."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr "Ritorna il risultato booleano del confronto tra due parametri."
+msgstr "Restituisce il risultato booleano del confronto tra due parametri."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
msgstr ""
-"Ritorna il risultato booleano del confronto tra INF (o NaN) e un parametro "
-"scalare."
+"Restituisce il risultato booleano del confronto tra INF (o NaN) e un "
+"parametro scalare."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
@@ -8771,27 +8909,27 @@ msgstr "Parametro di input."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr "Parametro di input '%s' per le modalità shader vertex e fragment."
+msgstr "Parametro di input '%s' per le modalità shader vertice e frammento."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr "Parametro di input '%s' per le modalità shader fragment e light."
+msgstr "Parametro di input '%s' per le modalità shader frammento e luce."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
-msgstr "Parametro di input '%s' per la modalità shader fragment."
+msgstr "Parametro di input '%s' per la modalità shader frammento."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for light shader mode."
-msgstr "Parametro di input '%s' per la modalità shader light."
+msgstr "Parametro di input '%s' per la modalità shader luce."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex shader mode."
-msgstr "Parametro di input '%s' per la modalità shader vertex."
+msgstr "Parametro di input '%s' per la modalità shader vertice."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr "Parametro di input '%s' per la modalità shader vertex e fragment."
+msgstr "Parametro di input '%s' per la modalità shader vertice e frammento."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar function."
@@ -8835,35 +8973,35 @@ msgstr "La costante Sqrt2 (1.414214). La radice quadrata di 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr "Ritorna il valore assoluto del parametro."
+msgstr "Restituisce il valore assoluto del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr "Ritorna l'arco-coseno del parametro."
+msgstr "Restituisce l'arco-coseno del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr "Ritorna l'inversa del coseno iperbolico del parametro."
+msgstr "Restituisce l'inversa del coseno iperbolico del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr "Ritorna l'arco-seno del parametro."
+msgstr "Restituisce l'arco-seno del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr "Ritorna l'inversa del seno iperbolico del parametro."
+msgstr "Restituisce l'inversa del seno iperbolico del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr "Ritorna l'arco-tangente del parametro."
+msgstr "Restituisce l'arco-tangente del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr "Ritorna l'arco-tangente dei parametri."
+msgstr "Restituisce l'arco-tangente dei parametri."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr "Ritorna l'inversa della tangente iperbolica del parametro."
+msgstr "Restituisce l'inversa della tangente iperbolica del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8877,11 +9015,11 @@ msgstr "Vincola un valore tra due altri valori."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr "Ritorna il coseno del parametro."
+msgstr "Restituisce il coseno del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr "Ritorna il coseno iperbolico del parametro."
+msgstr "Restituisce il coseno iperbolico del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
@@ -8906,7 +9044,7 @@ msgstr "Calcola la parte frazionaria dell'argomento."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr "Ritorna l'inversa della radice quadrata del parametro."
+msgstr "Restituisce l'inversa della radice quadrata del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
@@ -8918,11 +9056,11 @@ msgstr "Logaritmo in base 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr "Ritorna il maggiore di due valori."
+msgstr "Restituisce il maggiore di due valori."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr "Ritorna il minore di due valori."
+msgstr "Restituisce il minore di due valori."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
@@ -8930,7 +9068,7 @@ msgstr "Interpolazione lineare tra due scalari."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr "Ritorna il valore opposto del parametro."
+msgstr "Restituisce il valore opposto del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
@@ -8940,7 +9078,7 @@ msgstr "1.0 - scalare"
msgid ""
"Returns the value of the first parameter raised to the power of the second."
msgstr ""
-"Ritorna il valore del primo parametro elevato alla potenza del secondo."
+"Restituisce il valore del primo parametro elevato alla potenza del secondo."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
@@ -8968,15 +9106,15 @@ msgstr "Estrae il segno del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr "Ritorna il seno del parametro."
+msgstr "Restituisce il seno del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr "Ritorna il seno iperbolico del parametro."
+msgstr "Restituisce il seno iperbolico del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr "Ritorna la radice quadrata del parametro."
+msgstr "Restituisce la radice quadrata del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8988,8 +9126,8 @@ msgid ""
msgstr ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
-"Ritorna 0.0 se 'x' è più piccolo di 'edge0', o 1.0 se 'x' è più grande di "
-"'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 "
+"Restituisce 0.0 se 'x' è più piccolo di 'edge0', o 1.0 se 'x' è più grande "
+"di 'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 "
"usando i polinomi di Hermite."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9000,15 +9138,15 @@ msgid ""
msgstr ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
-"Ritorna 0.0 se 'x' è più piccolo di 'edge', altrimenti 1.0."
+"Restituisce 0.0 se 'x' è più piccolo di 'edge', altrimenti 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr "Ritorna la tangente del parametro."
+msgstr "Restituisce la tangente del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr "Ritorna la tangente iperbolica del parametro."
+msgstr "Restituisce la tangente iperbolica del parametro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
@@ -9028,7 +9166,7 @@ msgstr "Moltiplica lo scalare per scalare."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr "Ritorna il resto dei due scalari."
+msgstr "Restituisce il resto dei due scalari."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
@@ -9138,11 +9276,11 @@ msgstr "Scompone il vettore a tre scalari."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr "Calcola il prodotto incrociato di due vettori."
+msgstr "Calcola il prodotto vettoriale di due vettori."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr "Ritorna la distanza tra due punti."
+msgstr "Restituisce la distanza tra due punti."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
@@ -9155,7 +9293,7 @@ msgid ""
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
-"Ritorna un vettore che punta nella stessa direzione di quello di "
+"Restituisce un vettore che punta nella stessa direzione di quello di "
"riferimento. La funzione ha tre vettori parametro: N, il vettore da "
"orientare; I, quello incidente; ed Nref, il vettore di riferimento. Se il "
"prodotto scalare di I ed Nref è minore di zero, il valore di ritorno è N. "
@@ -9190,12 +9328,12 @@ msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
-"Ritorna un vettore che punta nella direzione della riflessione ( a : vettore "
-"incidente, b : vettore normale )."
+"Restituisce un vettore che punta nella direzione della riflessione ( a : "
+"vettore incidente, b : vettore normale )."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr "Ritorna un vettore che punta nella direzione della refrazione."
+msgstr "Restituisce un vettore che punta nella direzione della refrazione."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9207,7 +9345,7 @@ msgid ""
msgstr ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
-"Ritorna 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di "
+"Restituisce 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di "
"'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 "
"usando i polinomiali di Hermite."
@@ -9221,7 +9359,7 @@ msgid ""
msgstr ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
-"Ritorna 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di "
+"Restituisce 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è più grande di "
"'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 "
"usando i polinomiali di Hermite."
@@ -9233,7 +9371,7 @@ msgid ""
msgstr ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
-"Ritorna 0.0 se 'x' è minore di 'edge', altrimenti 1.0."
+"Restituisce 0.0 se 'x' è minore di 'edge', altrimenti 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9243,7 +9381,7 @@ msgid ""
msgstr ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
-"Ritorna 0.0 se 'x' è minore di 'edge', altrimenti 1.0."
+"Restituisce 0.0 se 'x' è minore di 'edge', altrimenti 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
@@ -9251,7 +9389,7 @@ msgstr "Aggiunge un vettore al vettore."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr "Divide vettore per vettore."
+msgstr "Divide due vettori."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
@@ -9259,7 +9397,7 @@ msgstr "Moltiplica vettore per vettore."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr "Ritorna il resto dei due vettori."
+msgstr "Restituisce il resto dei due vettori."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
@@ -9289,7 +9427,7 @@ msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
-"Ritorna il decadimento in base al prodotto scalare della normale della "
+"Restituisce il decadimento in base al prodotto scalare della normale della "
"superfice e direzione della telecamera (passa gli input associati ad essa)."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9577,25 +9715,31 @@ msgid "Export With Debug"
msgstr "Esporta Con Debug"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Percorso non esistente."
+msgid "The path specified doesn't exist."
+msgstr "Il percorso specificato non é esistente."
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Errore nell'apertura del file package (non è in formato ZIP)."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"File di progetto '.zip' non valido, non contiene un file 'project.godot'."
+"File progetto '.zip' non valido; non contiene un file denominato 'project."
+"godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Si prega di scegliere una cartella vuota."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Si prega di scegliere un file 'project.godot' o '.zip'."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Perfavore, scegli un file 'project.godot' o '.zip'."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "La Cartella contiene già un progetto di Godot."
+msgid "This directory already contains a Godot project."
+msgstr "Questa cartella contiene già un progetto Godot."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9857,6 +10001,7 @@ msgstr ""
"esistenti?\n"
"Per questo potrebbe volerci un pò."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Gestore dei progetti"
@@ -9905,6 +10050,17 @@ msgstr ""
"Al momento non hai nessun progetto.\n"
"Ti piacerebbe esplorare gli esempi ufficiali nella libreria degli Asset?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"La casella di ricerca filtra i progetti per nome e l'ultimo componente del "
+"percorso.\n"
+"Per filtrare i progetti per nome e percorso completo, la query deve "
+"contenere almeno un carattere `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Tasto "
@@ -10283,17 +10439,28 @@ msgstr "Seleziona Metodo"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
-msgstr "Rinomina in Blocco"
+msgstr "Rinomina in blocco"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Replace:"
+msgstr "Sostituisci: "
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Prefix:"
msgstr "Prefisso"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Suffisso"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Usa Espressioni Regolari"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Opzioni avanzate"
@@ -10330,11 +10497,12 @@ msgstr ""
"Confronta le opzioni del contatore."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Contatore per Livello"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Se impostato, il contatore si riavvia per ogni gruppo di nodi figlio"
#: editor/rename_dialog.cpp
@@ -10362,10 +10530,6 @@ msgstr ""
"La cifre mancanti vengono riempite con zeri iniziali."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Espressioni Regolari"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Post-Processo"
@@ -10374,12 +10538,12 @@ msgid "Keep"
msgstr "Mantieni"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase a under_score"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase a snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_score a CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case a PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10397,6 +10561,15 @@ msgstr "In Maiuscolo"
msgid "Reset"
msgstr "Reset"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Errore Espressione Regolare"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Al carattere %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Reparent Nodo"
@@ -10462,8 +10635,8 @@ msgid "Instance Child Scene"
msgstr "Istanzia Scena Figlia"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Svuota Script"
+msgid "Detach Script"
+msgstr "Rimuovi Script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10500,6 +10673,10 @@ msgid "Make node as Root"
msgstr "Rendi il nodo come Radice"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Eliminare %d nodi ed eventuali figli?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Elimina %d nodi?"
@@ -10540,9 +10717,8 @@ msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
-"Abilitando \"Carica Come Placeholder\" disabiliterà \"Figlio Modificabile\" "
-"e causerà tutte le proprietà del nodo di essere riportare ai loro valori "
-"default."
+"Abilitare \"Carica Come Placeholder\" disabiliterà \"Figlio Modificabile\" e "
+"riporterà tutte le proprietà del nodo ai loro valori predefiniti."
#: editor/scene_tree_dock.cpp
msgid "Make Local"
@@ -10629,8 +10805,18 @@ msgid "Open Documentation"
msgstr "Apri la documentazione"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Non è possibile allegare uno script: non ci sono linguaggi registrati.\n"
+"Probabilmente perché questo editor è stato costruito con tutti i moduli di "
+"linguaggio disabilitati."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
-msgstr "Aggiungi Nodo Figlio"
+msgstr "Aggiungi un nodo figlio"
#: editor/scene_tree_dock.cpp
msgid "Expand/Collapse All"
@@ -10658,7 +10844,7 @@ msgstr "Salva Ramo come Scena"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr "Copia Percorso Nodo"
+msgstr "Copia percorso del nodo"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
@@ -10677,12 +10863,12 @@ msgstr ""
"root esiste."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Allega un nuovo script o uno esistente al nodo selezionato."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Allega un nuovo script o uno già esistente al nodo selezionato."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Svuota uno script per il nodo selezionato."
+msgid "Detach the script from the selected node."
+msgstr "Rimuovi lo script per il nodo selezionato."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10813,6 +10999,10 @@ msgid "A directory with the same name exists."
msgstr "Esiste già una directory con lo stesso nome."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "File inesistente."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Estensione non valida."
@@ -10853,6 +11043,10 @@ msgid "File exists, it will be reused."
msgstr "Il file è già esistente, quindi, verrà riutilizzato."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Percorso non valido."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Nome classe non valido."
@@ -10861,8 +11055,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Nome o percorso genitore ereditato non valido."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Lo script è valido."
+msgid "Script path/name is valid."
+msgstr "Il nome e la path dello script sono validi."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10885,6 +11079,14 @@ msgid "Script file already exists."
msgstr "Il file di script esiste già."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Note: Gli script pre-installati hanno alcune limitazioni e non possono "
+"essere modificati utilizzando un editor esterno."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Nome Classe:"
@@ -10950,11 +11152,15 @@ msgstr "Processo Figlio Connesso."
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
-msgstr "Errore di Copia"
+msgstr "Copia Errore"
+
+#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "RAM Video"
#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
-msgstr "Salta Punti di rottura"
+msgstr "Salta i breakpoint"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -11001,8 +11207,8 @@ msgid "Total:"
msgstr "Totale:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Mem Video"
+msgid "Export list to a CSV file"
+msgstr "Esporta l'elenco in un file CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11479,7 +11685,7 @@ msgstr "Cambia nome Argomento"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr "Imposta Valore di Default della Variabile"
+msgstr "Imposta Valore Predefinito della Variabile"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
@@ -11752,27 +11958,27 @@ msgstr "Elimina selezionati"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
-msgstr "Trova Tipo Nodo"
+msgstr "Trova tipo del nodo"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr "Copia Nodi"
+msgstr "Copia nodi"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr "Taglia Nodi"
+msgstr "Taglia nodi"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Function"
-msgstr "Crea Funzione"
+msgstr "Crea funzione"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "Aggiorna Grafico"
+msgstr "Aggiorna grafico"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
-msgstr "Modifica Membro"
+msgstr "Modifica membro"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -11821,16 +12027,16 @@ msgstr "VariableSet non trovato nello script: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "Custom node has no _step() method, can't process graph."
msgstr ""
-"Il nodo personalizato non ha un metodo _step(), impossibile processare il "
-"grafico."
+"Il nodo personalizzato non ha alcun metodo _step(), impossibile processare "
+"il grafico."
#: modules/visual_script/visual_script_nodes.cpp
msgid ""
"Invalid return value from _step(), must be integer (seq out), or string "
"(error)."
msgstr ""
-"Valore di return invalido da _step(), deve esere intero (seq out), oppure "
-"stringa (errore)."
+"Valore di ritorno di _step() non valido, deve essere un intero (seq out), "
+"oppure una stringa (errore)."
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search VisualScript"
@@ -11891,6 +12097,11 @@ msgstr ""
"Debug keystore non configurato nelle Impostazioni dell'Editor né nel preset."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Release keystore non configurato correttamente nel preset di esportazione."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Le build personalizzate richiedono un percorso per un Android SDK valido "
@@ -11920,6 +12131,40 @@ msgstr "Nome del pacchetto non valido:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Modulo \"GodotPaymentV3\" non valido incluso nelle impostazione del progetto "
+"\"android/moduli\" (modificato in Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "Per utilizzare i plugin \"Use Custom Build\" deve essere abilitato."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" è valido solamente quando \"Xr Mode\" è \"Oculus "
+"Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" è valido solo quando \"Xr Mode\" è impostato su \"Oculus "
+"Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" è valido solo quando \"Xr Mode\" è impostato su \"Oculus "
+"Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11988,7 +12233,7 @@ msgstr "Esegui nel Browser"
#: platform/javascript/export/export.cpp
msgid "Run exported HTML in the system's default browser."
-msgstr "Esegui HTML esportato all'interno del browser di sistema di default."
+msgstr "Esegui il codice HTML esportato nel browser di sistema predefinito."
#: platform/javascript/export/export.cpp
msgid "Could not write file:"
@@ -12012,7 +12257,7 @@ msgstr "Impossibile leggere il file immagine di avvio splash:"
#: platform/javascript/export/export.cpp
msgid "Using default boot splash image."
-msgstr "Utilizzando l'immagine di splash di avvio predefinita."
+msgstr "Utilizzando l'immagine splash predefinita."
#: platform/uwp/export/export.cpp
msgid "Invalid package short name."
@@ -12141,6 +12386,15 @@ msgstr ""
"Perché CollisionShape2D funzioni deve essere fornita una forma. Si prega di "
"creare una risorsa forma (shape)!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Le forme basate sui poligoni non sono state fatte per essere usate nè "
+"modificate direttamente tramite il nodo CollisionShape2D. Per piacere usa "
+"invece il nodo CollisionPolygon2D."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12383,6 +12637,12 @@ msgstr ""
"Le forme planari non funzionano bene e verranno rimosse nelle versioni "
"future. Per favore, non usarle."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape non supporta RigidBody in modalità diverse da static."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Niente è visibile perché non è stata assegnata alcuna mesh."
@@ -12407,6 +12667,11 @@ msgstr ""
"Le GIProbes non sono supportate dal driver video GLES2.\n"
"In alternativa, usa una BakedLightmap."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12637,9 +12902,9 @@ msgid ""
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
-"I popup saranno nascosti per default affinché non chiami la funzione "
-"popup(), oppure una delle funzioni popup*(). Farli diventare visibili per "
-"modificarli va bene, ma scompariranno all'esecuzione."
+"I popup saranno nascosti di predefinita finchè non chiami popup() o una "
+"delle qualsiasi funzioni popup*(). Farli diventare visibili per modificarli "
+"va bene, ma scompariranno all'esecuzione."
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
@@ -12679,6 +12944,12 @@ msgstr ""
"Control, in modo che possa ottenere una dimensione. Altrimenti, renderlo un "
"RenderTarget e assegnare alla sua texture interna qualche nodo da mostrare."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"La dimensione del Viewport deve essere maggiore di 0 affinché qualcosa sia "
+"visibile."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Fonte non valida per l'anteprima."
@@ -12707,6 +12978,55 @@ msgstr "Varyings può essere assegnato soltanto nella funzione del vertice."
msgid "Constants cannot be modified."
msgstr "Le constanti non possono essere modificate."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Filesystem e dock di importazione"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "L'eseguibile, dopo l'esportazione o la distribuzione, attenterà di "
+#~ "connettersi con l'indirizzo IP di questo computer per farsi eseguire il "
+#~ "debug."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "La scena attuale non è mai stata salvata, si prega di salvarla prima di "
+#~ "eseguirla."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Non è nel percorso risorse."
+
+#~ msgid "Revert"
+#~ msgstr "Ripristina"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Questa azione non può essere annullata. Ripristinare comunque?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Ripristina scena"
+
+#~ msgid "Clear Script"
+#~ msgstr "Svuota Script"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Tracciatore segnalazioni"
+
+#~ msgid "Request Docs"
+#~ msgstr "Documentazione richiesta"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Aiutate a migliorare la documentazione di Godot fornendo feedback."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Rimpiazzate %d occorrenze."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Crea Corpo Convesso Statico"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Errore nella creazione delle forme!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
index af2cca2ca6..d1a368346d 100644
--- a/editor/translations/ja.po
+++ b/editor/translations/ja.po
@@ -7,7 +7,7 @@
# Daisuke Saito <d.saito@coriginate.com>, 2017, 2018.
# h416 <shinichiro.hirama@gmail.com>, 2017.
# hopping tappy (たっぴさん) <hopping.tappy@gmail.com>, 2016-2017, 2018.
-# Jun Shiozawa <haresecret@gmail.com>, 2017, 2018.
+# Jun Shiozawa <haresecret@gmail.com>, 2017, 2018, 2020.
# Lexi Grafen <shfeedly@gmail.com>, 2017.
# NoahDigital <taku_58@hotmail.com>, 2017.
# Shinsuke Masuda <shinsuke.masuda@gmail.com>, 2018.
@@ -31,11 +31,12 @@
# Akihiro Ogoshi <technical@palsystem-game.com>, 2019, 2020.
# Wataru Onuki <bettawat@yahoo.co.jp>, 2020.
# sporeball <sporeballdev@gmail.com>, 2020.
+# BinotaLIU <me@binota.org>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
+"PO-Revision-Date: 2020-09-22 03:23+0000\n"
"Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
"godot/ja/>\n"
@@ -44,7 +45,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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -53,29 +54,29 @@ msgstr "convert() の引数の型が無効です。TYPE_* 定数を使ってく
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "長さが1の文字列(文字)を予期しました。"
+msgstr "長さ1の文字列(文字)が必要です。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "デコードバイトのバイトは足りません、または無効な形式です。"
+msgstr "デコードするにはバイトが足りないか、または無効な形式です。"
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "入力された式 %i は無効です"
+msgstr "式中の無効な入力 %i (渡されていません)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "インスタンスが null のため、self は使用できません"
+msgstr "インスタンスがnull(渡されない)であるため、selfは使用できません"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "演算子 %s, %s, %s に対する値が無効です。"
+msgstr "演算子 %s に対する無効なオペランドです、%s 及び %s。"
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "基本型 %s の型 %s のインデックスが無効です"
+msgstr "タイプ %s のインデックスが無効、これは基底型 %s 用です"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
@@ -83,39 +84,39 @@ msgstr "インデックス '%s' (基底型 %s) は無効な名前です"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "'%s' の引数は無効です"
+msgstr "'%s' を構築するための引数が無効です"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "'%s' への呼び出し:"
+msgstr "'%s' の呼び出し時:"
#: core/ustring.cpp
msgid "B"
-msgstr "\\ B"
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr "\\ KiB"
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr "\\ MiB"
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr "\\ GiB"
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr "\\ TiB"
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr "\\ PiB"
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr "\\ EiB"
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -297,7 +298,7 @@ msgstr "時間 (秒): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr "トラックを有効にする"
+msgstr "トラックを有効 / 無効"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -330,11 +331,11 @@ msgstr "キュービック"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr "ループインタプリタを抑え込み(clamp)"
+msgstr "ループ補間をクランプ"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr "ループインタプリタをラップ(wrap)"
+msgstr "ループ補間をラップ"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -464,7 +465,7 @@ msgstr "トラックが spatial 型ではないため、キーを挿入できま
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
-msgstr "変換トラックキーを追加"
+msgstr "トランスフォーム トラック キーを追加"
#: editor/animation_track_editor.cpp
msgid "Add Track Key"
@@ -532,8 +533,7 @@ msgstr "警告:インポートしたアニメーションを編集していま
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
msgstr ""
-"アニメーションを作って編集するために AnimationPlayer ノードへのパスを選択して"
-"下さい。"
+"アニメーションを作って編集するには、 AnimationPlayer ノードを選択して下さい。"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -557,6 +557,7 @@ msgid "Seconds"
msgstr "秒"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "フレームレート(FPS)"
@@ -592,7 +593,7 @@ msgstr "選択範囲を複製"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "複製を転置"
+msgstr "転置して複製"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
@@ -608,7 +609,7 @@ msgstr "前のステップへ"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr "アニメーションの最適化"
+msgstr "アニメーションを最適化"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
@@ -716,16 +717,16 @@ msgid "Line Number:"
msgstr "行番号:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d 箇所を置換しました。"
+msgid "%d replaced."
+msgstr "%d を置換しました。"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr "%d件の一致が見つかりました。"
+msgstr "%d件の一致が見つかりました。"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d matches."
-msgstr "%d件の一致が見つかりました。"
+msgstr "%d件の一致が見つかりました。"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -735,7 +736,7 @@ msgstr "大文字小文字を区別する"
msgid "Whole Words"
msgstr "単語全体"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "置換"
@@ -785,6 +786,10 @@ msgid "Method in target node must be specified."
msgstr "対象ノードのメソッドを指定してください。"
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "メソッド名は有効な識別子である必要があります。"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -835,7 +840,7 @@ msgstr "追加の呼出し引数:"
#: editor/connections_dialog.cpp
msgid "Receiver Method:"
-msgstr "メソッドの選択:"
+msgstr "受信側メソッド:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -866,7 +871,6 @@ msgstr "シグナルに接続できません"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -895,7 +899,7 @@ msgstr "'%s' を '%s' から切断"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr "シグナル '%s' から全てを切断"
+msgstr "シグナル '%s' からすべてを切断"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -908,7 +912,7 @@ msgstr "切断"
#: editor/connections_dialog.cpp
msgid "Connect a Signal to a Method"
-msgstr "メソッドにシグナルを接続する"
+msgstr "メソッドにシグナルを接続"
#: editor/connections_dialog.cpp
msgid "Edit Connection:"
@@ -916,15 +920,20 @@ msgstr "接続を編集:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "シグナル %s から全ての接続を除去してもよろしいですか?"
+msgstr "シグナル %s からすべての接続を除去してもよろしいですか?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "シグナル"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "タイルを絞り込む"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr "このシグナルから全ての接続を除去してもよろしいですか?"
+msgstr "このシグナルからすべての接続を除去してもよろしいですか?"
#: editor/connections_dialog.cpp
msgid "Disconnect All"
@@ -960,7 +969,7 @@ msgid "Recent:"
msgstr "最近:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "検索:"
@@ -1049,7 +1058,7 @@ msgstr "次のオーナー:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "選択したファイルをプロジェクトから削除しますか? (元に戻せません)"
+msgstr "選択したファイルをプロジェクトから削除しますか?(元に戻せません)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1058,7 +1067,7 @@ msgid ""
"Remove them anyway? (no undo)"
msgstr ""
"除去しようとしているファイルは他のリソースの動作に必要です。\n"
-"無視して除去しますか? (元に戻せません)"
+"無視して除去しますか?(元に戻せません)"
#: editor/dependency_editor.cpp
msgid "Cannot remove:"
@@ -1090,7 +1099,7 @@ msgstr "読み込みエラー!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "%d 個のアイテムを完全に削除しますか?(元に戻せません!)"
+msgstr "%d 個のアイテムを完全に削除しますか?(元に戻せません!)"
#: editor/dependency_editor.cpp
msgid "Show Dependencies"
@@ -1140,6 +1149,9 @@ msgstr "プロジェクト創始者"
msgid "Lead Developer"
msgstr "開発リーダー"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "プロジェクトマネージャー "
@@ -1161,6 +1173,14 @@ msgid "Gold Sponsors"
msgstr "ゴールドスポンサー"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "シルバースポンサー"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "ブロンズスポンサー"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "ミニスポンサー"
@@ -1210,7 +1230,7 @@ msgstr "コンポーネント"
#: editor/editor_about.cpp
msgid "Licenses"
-msgstr "ライセンス"
+msgstr "ライセンス文書"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Error opening package file, not in ZIP format."
@@ -1251,7 +1271,7 @@ msgstr "インストール"
#: editor/editor_asset_installer.cpp
msgid "Package Installer"
-msgstr "パッケージインストーラー"
+msgstr "パッケージインストーラ"
#: editor/editor_audio_buses.cpp
msgid "Speakers"
@@ -1271,15 +1291,15 @@ msgstr "オーディオバスのボリュームを変更"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
-msgstr "オーディオバスのソロを切り替え"
+msgstr "オーディオバスのソロをオン / オフ"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr "オーディオバスのミュートを切り替え"
+msgstr "オーディオバスのミュートをオン / オフ"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr "オーディオバスのバイパスエフェクトを切り替え"
+msgstr "オーディオバスのバイパスエフェクトをオン / オフ"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
@@ -1287,7 +1307,7 @@ msgstr "オーディオバスの出力先を選択"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr "オーディオバスエフェクトを追加"
+msgstr "オーディオバス エフェクトを追加"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
@@ -1299,7 +1319,7 @@ msgstr "バスエフェクトを削除"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
-msgstr "ドラッグ・アンド・ドロップで並び替えることができます。"
+msgstr "ドラッグ&ドロップで並び替えることができます。"
#: editor/editor_audio_buses.cpp
msgid "Solo"
@@ -1340,7 +1360,7 @@ msgstr "オーディオバスを追加"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr "マスター バスは削除できません!"
+msgstr "マスターバスは削除できません!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
@@ -1372,7 +1392,7 @@ msgstr "オーディオバスのレイアウトを開く"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr "'%s' ファイルがありません。"
+msgstr "'%s' ファイルがありません。"
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -1458,7 +1478,7 @@ msgstr "自動読込みの名前変更"
#: editor/editor_autoload_settings.cpp
msgid "Toggle AutoLoad Globals"
-msgstr "グローバルの自動読込みを切り替え"
+msgstr "グローバルの自動読込みをオン / オフ"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
@@ -1468,7 +1488,7 @@ msgstr "自動読込みを移動"
msgid "Remove Autoload"
msgstr "自動読込みを除去"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "有効"
@@ -1476,17 +1496,9 @@ msgstr "有効"
msgid "Rearrange Autoloads"
msgstr "自動読込みの並べ替え"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "パスが無効です。"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "ファイルが存在しません。"
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "リソースパスにありません。"
+msgid "Can't add autoload:"
+msgstr "自動読み込みを追加出来ません:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1513,6 +1525,10 @@ msgstr "名前"
msgid "Singleton"
msgstr "シングルトン"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "パラメーターを貼り付け"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "シーンを更新"
@@ -1545,7 +1561,7 @@ msgstr "ディレクトリを選択"
#: editor/filesystem_dock.cpp editor/project_manager.cpp
#: scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr "フォルダーを作成"
+msgstr "フォルダを作成"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
@@ -1599,8 +1615,9 @@ msgid ""
"Enabled'."
msgstr ""
"対象プラットフォームではGLES2へフォールバックするために'ETC'テクスチャ圧縮が"
-"必要です。プロジェクト設定より 'Import Etc' をオンにするか、'Fallback To "
-"Gles 2' をオフにしてください。"
+"必要です。\n"
+"プロジェクト設定より 'Import Etc' をオンにするか、'Fallback To Gles 2' をオフ"
+"にしてください。"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1640,16 +1657,17 @@ msgid "Scene Tree Editing"
msgstr "シーンツリーの編集"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "インポートドック"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "ノードドック"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "ファイルシステムとインポートドック"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "ファイルシステム"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "インポートドック"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1670,11 +1688,11 @@ msgstr "(エディタ無効、プロパティ無効)"
#: editor/editor_feature_profile.cpp
msgid "(Properties Disabled)"
-msgstr "(プロパティ無効)"
+msgstr "(プロパティ無効)"
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled)"
-msgstr "(エディタ無効)"
+msgstr "(エディタ無効)"
#: editor/editor_feature_profile.cpp
msgid "Class Options:"
@@ -1761,7 +1779,7 @@ msgstr "Godot機能プロファイル"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
-msgstr "プロファイルのインポート"
+msgstr "プロファイルをインポート"
#: editor/editor_feature_profile.cpp
msgid "Export Profile"
@@ -1773,7 +1791,7 @@ msgstr "エディタ機能のプロファイルの管理"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
-msgstr "現在のフォルダーを選択"
+msgstr "現在のフォルダを選択"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
@@ -1781,7 +1799,7 @@ msgstr "ファイルが既に存在します。上書きしますか?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select This Folder"
-msgstr "このフォルダーを選択"
+msgstr "このフォルダを選択"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1800,7 +1818,7 @@ msgstr "ファイルマネージャーで表示"
msgid "New Folder..."
msgstr "新規フォルダ..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "再読込"
@@ -1854,11 +1872,11 @@ msgstr "上へ"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "隠しファイルの切り替え"
+msgstr "隠しファイルをオン / オフ"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "お気に入りの切り替え"
+msgstr "お気に入りにする / しない"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
@@ -1866,7 +1884,7 @@ msgstr "モード切替え"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "フォーカスパス"
+msgstr "パスにフォーカス"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
@@ -1894,11 +1912,11 @@ msgstr "ファイル更新。"
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr "現在のフォルダをお気に入りにする/お気に入りから外す。"
+msgstr "現在のフォルダをお気に入りにする / しない。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
-msgstr "隠しファイルの表示/非表示を切り替えます。"
+msgstr "隠しファイルの表示 / 非表示を切り替えます。"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
@@ -1914,7 +1932,7 @@ msgstr "ディレクトリとファイル:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "プレビュー:"
@@ -1985,7 +2003,7 @@ msgstr "メソッド"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "テーマプロパティ"
+msgstr "テーマ プロパティ"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -2098,7 +2116,7 @@ msgstr "プロパティ:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr "設定"
+msgstr "Set"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
@@ -2203,7 +2221,7 @@ msgstr "書込むファイルを開けません:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr "ファイル形式が不明:"
+msgstr "要求されたファイル形式は不明です:"
#: editor/editor_node.cpp
msgid "Error while saving."
@@ -2352,10 +2370,6 @@ msgid "There is no defined scene to run."
msgstr "実行するシーンが定義されていません。"
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "現在のシーンは保存されませんでした。実行する前に保存してください。"
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "サブプロセスを開始できませんでした!"
@@ -2389,7 +2403,7 @@ msgstr "閉じる前に、'%s' への変更を保存しますか?"
#: editor/editor_node.cpp
msgid "Saved %s modified resource(s)."
-msgstr "%s個の変更されたリソースを保存しました。"
+msgstr "%s個の変更されたリソースを保存しました。"
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
@@ -2440,12 +2454,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "保存されていないシーンを読み込むことはできません。"
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "元に戻す"
+msgid "Reload Saved Scene"
+msgstr "保存済みシーンをリロード"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "この操作は元に戻せません。それでも元に戻しますか?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"現在のシーンには未保存の変更があります。\n"
+"それでも保存済みシーンをリロードしますか? この動作は取り消せません。"
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2457,7 +2475,7 @@ msgstr "終了"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr "エディターを終了しますか?"
+msgstr "エディタを終了しますか?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
@@ -2692,7 +2710,7 @@ msgstr "新規シーン"
#: editor/editor_node.cpp
msgid "New Inherited Scene..."
-msgstr "新しい継承したシーン..."
+msgstr "新しい継承シーン..."
#: editor/editor_node.cpp
msgid "Open Scene..."
@@ -2733,10 +2751,6 @@ msgid "Redo"
msgstr "やり直す"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "シーンを元に戻す"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "その他のプロジェクトまたはシーン全体のツール。"
@@ -2755,11 +2769,11 @@ msgstr "バージョンコントロール"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr "バージョン管理のセットアップ"
+msgstr "バージョン管理をセットアップ"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr "バージョン管理の終了"
+msgstr "バージョン管理を終了"
#: editor/editor_node.cpp
msgid "Export..."
@@ -2796,24 +2810,28 @@ msgstr "リモートデバッグでデプロイ"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"エクスポートまたはデプロイを行う場合、生成された実行ファイルはデバッグのため"
-"に、このコンピューターのIPに接続を試みます。"
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "ネットワークファイルシステムでスモールデプロイ"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"このオプションを有効にすると、エクスポートまたはデプロイ時に最小限の実行可能"
"ファイルが生成されます。\n"
@@ -2827,9 +2845,10 @@ msgid "Visible Collision Shapes"
msgstr "コリジョン形状の表示"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"このオプションを有効にすると、コリジョン形状とレイキャストノードが、ゲーム実"
"行中にも表示されるようになります。"
@@ -2839,38 +2858,43 @@ msgid "Visible Navigation"
msgstr "ナビゲーションの表示"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"このオプションを有効にすると、ナビゲーションメッシュが、ゲーム実行中にも表示"
"されるようになります。"
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "シーンの変更を同期"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"このオプションを有効にすると、エディタからシーンに加えられた変更が、実行中の"
"ゲームに反映されるようになります。\n"
"リモート実行の場合、ネットワークファイルシステムを使うとより効果的です。"
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "スクリプトの変更を同期"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"このオプションを有効にすると、保存したスクリプトが、実行中のゲームに反映され"
"るようになります。\n"
@@ -2898,15 +2922,15 @@ msgstr "スクリーンショットはEditor Data / Settingsフォルダに保
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "フルスクリーン切り替え"
+msgstr "フルスクリーンを有効化 / 無効化"
#: editor/editor_node.cpp
msgid "Toggle System Console"
-msgstr "システムコンソールの切り替え"
+msgstr "システムコンソールを有効化 / 無効化"
#: editor/editor_node.cpp
msgid "Open Editor Data/Settings Folder"
-msgstr "エディタのデータ・設定フォルダを開く"
+msgstr "エディタのデータ / 設定フォルダを開く"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
@@ -2933,7 +2957,7 @@ msgstr "ヘルプ"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "検索"
@@ -2947,8 +2971,12 @@ msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "課題管理システム"
+msgid "Report a Bug"
+msgstr "バグを報告"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "ドキュメントのフィードバックを送る"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3059,13 +3087,13 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
-"この操作は \"res://android/build\" にソーステンプレートをインストールしアンド"
-"ロイドのカスタムビルドを設定します。\n"
-"後から設定に変更を加えたり、エクスポート時にカスタムAPKをビルドできます。(モ"
-"ジュールを追加する、AndroidManifest.xmlを変更する等)\n"
+"この操作は \"res://android/build\" にソーステンプレートをインストールし、アン"
+"ドロイドのカスタムビルドを設定します。\n"
+"後から設定に変更を加えたり、エクスポート時にカスタムAPKをビルドできます (モ"
+"ジュールを追加する、AndroidManifest.xmlを変更する等)。\n"
"APKビルドの初期設定の代わりにカスタムビルド設定を使うためには、アンドロイドの"
-"エクスポート設定の「カスタムビルドを使用する」のオプションが有効化されている"
-"必要があることに注意してください。"
+"エクスポート設定の「Use Custom Build (カスタムビルドを使用する)」のオプション"
+"が有効化されている必要があることに注意してください。"
#: editor/editor_node.cpp
msgid ""
@@ -3075,7 +3103,7 @@ msgid ""
"operation again."
msgstr ""
"Androidビルドテンプレートはすでにインストールされており、上書きされません。\n"
-"この操作を再試行する前に、 \"res://android/build\" ディレクトリを手動で削除し"
+"この操作を再試行する前に、\"res://android/build\" ディレクトリを手動で削除し"
"てください。"
#: editor/editor_node.cpp
@@ -3092,7 +3120,7 @@ msgstr "ライブラリのエクスポート"
#: editor/editor_node.cpp
msgid "Merge With Existing"
-msgstr "既存の(ライブラリを)マージ"
+msgstr "既存の(ライブラリを)マージ"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
@@ -3189,11 +3217,11 @@ msgstr "測定:"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
-msgstr "フレーム時間(秒)"
+msgstr "フレーム時間(秒)"
#: editor/editor_profiler.cpp
msgid "Average Time (sec)"
-msgstr "平均時間(秒)"
+msgstr "平均時間(秒)"
#: editor/editor_profiler.cpp
msgid "Frame %"
@@ -3344,12 +3372,14 @@ msgstr "新規の値:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr "キー・値のペアを追加"
+msgstr "キー/値のペアを追加"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"このプラットフォームで実行可能なエクスポートプリセットがありません。\n"
"エクスポートメニューに実行可能なプリセットを追加してください。"
@@ -3378,6 +3408,10 @@ msgstr "スクリプトを実行できませんでした:"
msgid "Did you forget the '_run' method?"
msgstr "'_run' メソッドを忘れていませんか?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr "Ctrlを押したままで整数値に丸める。Shiftを押したままで精密調整。"
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "インポートするノードを選択"
@@ -3417,7 +3451,7 @@ msgstr "公式の書き出しテンプレートは開発用ビルドの場合は
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr "(見つかりません)"
+msgstr "(見つかりません)"
#: editor/export_template_manager.cpp
msgid "(Current)"
@@ -3512,8 +3546,8 @@ msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
-"テンプレートのインストールに失敗しました。 問題のテンプレートのアーカイブは "
-"'%s' にあります。"
+"テンプレートのインストールに失敗しました。\n"
+"問題のテンプレートのアーカイブは '%s' にあります。"
#: editor/export_template_manager.cpp
msgid "Error requesting URL:"
@@ -3603,7 +3637,7 @@ msgstr "テンプレートをダウンロード"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "リストからミラーを選択: (Shift+クリック: ブラウザで開く)"
+msgstr "リストからミラーを選択: (Shift+クリック: ブラウザで開く)"
#: editor/filesystem_dock.cpp
msgid "Favorites"
@@ -3617,7 +3651,7 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr "ルートのリソースは移動・リネームできません。"
+msgstr "ルートのリソースは移動/リネームできません。"
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
@@ -3669,7 +3703,7 @@ msgstr "フォルダを複製:"
#: editor/filesystem_dock.cpp
msgid "New Inherited Scene"
-msgstr "新しい継承したシーン"
+msgstr "新しい継承シーン"
#: editor/filesystem_dock.cpp
msgid "Set As Main Scene"
@@ -3802,7 +3836,7 @@ msgstr "フォルダ:"
#: editor/find_in_files.cpp
msgid "Filters:"
-msgstr "フィルター:"
+msgstr "フィルタ:"
#: editor/find_in_files.cpp
msgid ""
@@ -3964,17 +3998,26 @@ msgstr "インポート済のスクリプトを読込めませんでした:"
#: editor/import/resource_importer_scene.cpp
msgid "Invalid/broken script for post-import (check console):"
-msgstr "無効・壊れたインポート済スクリプト(コンソールを確認してください):"
+msgstr "無効または壊れたインポート済スクリプト(コンソールを確認してください):"
#: editor/import/resource_importer_scene.cpp
msgid "Error running post-import script:"
msgstr "インポート済スクリプトの実行中にエラー:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+"`post_import()` メソッド内で、Nodeを継承したオブジェクトを返しましたか?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "保存中..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d ファイル"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "'%s' のデフォルトとして設定"
@@ -3983,10 +4026,6 @@ msgid "Clear Default for '%s'"
msgstr "'%s' のデフォルトをクリア"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " ファイル"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "名前を付けてインポート:"
@@ -3999,8 +4038,8 @@ msgid "Reimport"
msgstr "再インポート"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "シーンを保存して、再インポートして再起動してください"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "シーンを保存し、再インポートしてから、再起動します"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4035,10 +4074,6 @@ msgid "Copy Params"
msgstr "パラメーターをコピー"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "パラメーターを貼り付け"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "リソースのクリップボードを編集"
@@ -4048,11 +4083,11 @@ msgstr "リソースをコピー"
#: editor/inspector_dock.cpp
msgid "Make Built-In"
-msgstr "ビルトインを作成"
+msgstr "組み込みにする"
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr "ユニークなサブリソースを生成"
+msgstr "サブリソースをユニーク化する"
#: editor/inspector_dock.cpp
msgid "Open in Help"
@@ -4166,7 +4201,7 @@ msgstr "ポイント挿入"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Edit Polygon (Remove Point)"
-msgstr "ポリゴンを編集(点を除去)"
+msgstr "ポリゴンを編集(点を除去)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Remove Polygon And Point"
@@ -4291,7 +4326,7 @@ msgstr "BlendSpace2Dのポイントを削除する"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
-msgstr "BlendSpace2D三角形を削除する"
+msgstr "BlendSpace2Dの三角形を削除する"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
@@ -4303,7 +4338,7 @@ msgstr "三角形が存在しないため、ブレンドできません。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Toggle Auto Triangles"
-msgstr "三角形の自動作成に切り替え"
+msgstr "三角形の自動作成をオン / オフ"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
@@ -4374,11 +4409,11 @@ msgstr "ノードを削除"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Toggle Filter On/Off"
-msgstr "フィルターの オン/オフ を切り替え"
+msgstr "フィルタの オン/オフ を切り替え"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Change Filter"
-msgstr "フィルターを変更"
+msgstr "フィルタを変更"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
@@ -4431,7 +4466,7 @@ msgstr "フィルタリングを有効化"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
-msgstr "自動再生の切り替え"
+msgstr "自動再生の有効化 / 無効化"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
@@ -4506,27 +4541,27 @@ msgstr "編集するアニメーションがありません!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
-msgstr "選択したアニメーションを現在の位置から逆再生する。(A)"
+msgstr "選択したアニメーションを現在の位置から逆再生する。(A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "選択したアニメーションを最後から逆再生する。(Shift+A)"
+msgstr "選択したアニメーションを最後から逆再生する。(Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
-msgstr "アニメーションの再生を停止する。(S)"
+msgstr "アニメーションの再生を停止する。(S)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
-msgstr "選択したアニメーションを最初から再生する。(Shift+D)"
+msgstr "選択したアニメーションを最初から再生する。(Shift+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
-msgstr "選択したアニメーションを現在の位置から再生する。(D)"
+msgstr "選択したアニメーションを現在の位置から再生する。(D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation position (in seconds)."
-msgstr "アニメーションの位置(秒)。"
+msgstr "アニメーションの位置 (秒)。"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Scale animation playback globally for the node."
@@ -4578,7 +4613,7 @@ msgstr "未来"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Depth"
-msgstr "深度"
+msgstr "Depth(深度/奥行)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
@@ -4629,7 +4664,7 @@ msgstr "ブレンド時間:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
-msgstr "次(自動キュー):"
+msgstr "次 (自動キュー):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
@@ -4678,7 +4713,7 @@ msgstr "サブトランジションには、開始ノードと終了ノードが
#: editor/plugins/animation_state_machine_editor.cpp
msgid "No playback resource set at path: %s."
-msgstr "パス( %s )に再生リソースが設定されていません。"
+msgstr "パス: %s に再生リソースが設定されていません。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Node Removed"
@@ -4717,8 +4752,8 @@ msgstr "選択したノードまたはトランジションを除去。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
-"このアニメーションの自動再生の開始、再起動、またはゼロへのシークを切り替えま"
-"す。"
+"開始、再スタート、またはゼロへのシーク時における、このアニメーションの自動再"
+"生をオン / オフにします。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
@@ -4735,7 +4770,7 @@ msgstr "プレイモード:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr "AnimationTree(アニメーションツリー)"
+msgstr "アニメーションツリー"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -4793,7 +4828,7 @@ msgstr "ブレンド 1:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "X-Fade Time (s):"
-msgstr "クロスフェード時間(秒):"
+msgstr "クロスフェード時間 (秒):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Current:"
@@ -5065,7 +5100,7 @@ msgstr "公式"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Testing"
-msgstr "テスト中"
+msgstr "テストする"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Loading..."
@@ -5104,7 +5139,7 @@ msgid "Bake Lightmaps"
msgstr "ライトマップを焼き込む"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "プレビュー"
@@ -5312,22 +5347,22 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock Selected"
-msgstr "選択をロック"
+msgstr "選択対象をロック"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock Selected"
-msgstr "選択を解除"
+msgstr "選択対象をロック解除"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Group Selected"
-msgstr "選択したグループ"
+msgstr "選択対象をグループ化"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Ungroup Selected"
-msgstr "グループ解除"
+msgstr "選択対象をグループ解除"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
@@ -5357,7 +5392,7 @@ msgstr "IKチェーンをクリア"
msgid ""
"Warning: Children of a container get their position and size determined only "
"by their parent."
-msgstr "警告:コンテナの子の位置とサイズは、親によってのみ決定されます。"
+msgstr "注意:コンテナの子の位置とサイズは、親によってのみ決定されます。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -5372,7 +5407,7 @@ msgstr "選択モード"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
-msgstr "ドラッグ:回転"
+msgstr "ドラッグ: 回転"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
@@ -5386,7 +5421,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+右クリック: 奥行き(被写界深度)リストの選択"
+msgstr "Alt+右クリック: 奥行き選択リスト"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5426,7 +5461,7 @@ msgstr "定規モード"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
-msgstr "スマートスナッピングを切り替える。"
+msgstr "スマート スナッピングをオン / オフ。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Smart Snap"
@@ -5434,7 +5469,7 @@ msgstr "スマートスナップを使う"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle grid snapping."
-msgstr "グリッドスナッピングを切り替える。"
+msgstr "グリッド スナッピングをオン / オフ。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
@@ -5496,12 +5531,12 @@ msgstr "ガイドにスナップ"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr "選択したオブジェクトをその場でロック (移動不可能にする)。"
+msgstr "選択したオブジェクトを現在位置でロック (移動不可能にする)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
-msgstr "選択したオブジェクトをアンロック (移動可能にする)。"
+msgstr "選択したオブジェクトをロック解除 (移動可能にする)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5564,11 +5599,11 @@ msgstr "グループアイコンとロックアイコンを表示"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "センター選択"
+msgstr "選択対象を中央に"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "フレーム選択"
+msgstr "選択対象を全面に"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
@@ -5597,8 +5632,8 @@ msgid ""
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
-"キーの自動挿入は(マスクに基づいて)オブジェクトが移動、回転、または拡大縮小"
-"された際に行われます。\n"
+"キーの自動挿入は(マスクに基づいて)オブジェクトが移動、回転、または拡大縮小さ"
+"れた際に行われます。\n"
"キーは既存のトラックにのみ追加され、新しいトラックは作成されません。\n"
"初回のキー挿入は手動で行う必要があります。"
@@ -5607,9 +5642,8 @@ msgid "Auto Insert Key"
msgstr "自動キー挿入"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "アニメーションキーが挿入されました。"
+msgstr "アニメーションキーとポーズのオプション"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5679,7 +5713,7 @@ msgstr "ポリゴンを編集"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly (Remove Point)"
-msgstr "ポリゴンを編集(点を除去)"
+msgstr "ポリゴンを編集(点を除去)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -5688,7 +5722,7 @@ msgstr "ハンドルを設定する"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
-msgstr "発光(Emission)マスクを読み込む"
+msgstr "放出マスクを読み込む"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/cpu_particles_editor_plugin.cpp
@@ -5700,7 +5734,7 @@ msgstr "再起動"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Clear Emission Mask"
-msgstr "発光(Emission)マスクをクリア"
+msgstr "放出マスクをクリア"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5716,7 +5750,7 @@ msgstr "生成したポイントの数:"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Mask"
-msgstr "\\ Emission Mask"
+msgstr "放出マスク"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5741,7 +5775,7 @@ msgstr "ピクセルからキャプチャ"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Colors"
-msgstr "発光(Emission)色"
+msgstr "放出色"
#: editor/plugins/cpu_particles_editor_plugin.cpp
msgid "CPUParticles"
@@ -5827,7 +5861,7 @@ msgstr "右クリックで点を追加"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
-msgstr "グローバルイルミネーションの事前計算"
+msgstr "GIプローブの焼き込み"
#: editor/plugins/gradient_editor_plugin.cpp
msgid "Gradient Edited"
@@ -5835,7 +5869,7 @@ msgstr "グラデーション編集"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
-msgstr "アイテム%d"
+msgstr "アイテム %d"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Items"
@@ -5854,28 +5888,46 @@ msgid "Mesh is empty!"
msgstr "メッシュがありません!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "三角形メッシュ静的ボディを作成"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "三角形メッシュ コリジョンシェイプを作成できませんでした。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "静的凸状ボディを生成"
+msgid "Create Static Trimesh Body"
+msgstr "三角形メッシュ静的ボディを作成"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
-msgstr "シーンのルートでは無効です!"
+msgstr "これはシーンのルートでは機能しません!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Shape"
msgstr "三角形メッシュ静的シェイプを生成"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "図形の作成に失敗しました!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"シーンのルートに単一の凸型のコリジョンシェイプを作成することはできません。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "単一の凸型コリジョンシェイプを作成できませんでした。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "凸状シェイプを作成"
+msgid "Create Single Convex Shape"
+msgstr "単一の凸型シェイプを作成する"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"シーンのルートに複数の凸型コリジョンシェイプを作成することはできません。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "コリジョンシェイプを作成できませんでした。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "複数の凸型シェイプを作成する"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5899,7 +5951,7 @@ msgstr "モデルにはこのレイヤーにUVがありません"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
-msgstr "メッシュインスタンスにメッシュが不足しています!"
+msgstr "MeshInstanceにメッシュがありません!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh has not surface to create outlines from!"
@@ -5926,18 +5978,68 @@ msgid "Create Trimesh Static Body"
msgstr "三角形メッシュ静的ボディを作成"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"StaticBodyを作成し、ポリゴンベースのコリジョンシェイプを自動的に割り当てま"
+"す。\n"
+"これは、衝突検出の最も正確な(ただし最も遅い)オプションです。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
-msgstr "三角形メッシュ兄弟コリジョンを生成"
+msgstr "三角形メッシュ コリジョンの兄弟を作成"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"ポリゴンベースのコリジョンシェイプを作成します。\n"
+"これは、衝突検出の最も正確な(ただし最も遅い)オプションです。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "凸型兄弟関係コリジョンを生成"
+msgid "Create Single Convex Collision Sibling"
+msgstr "単一の凸型コリジョンの兄弟を作成"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"単一の凸型コリジョンシェイプを作成します。\n"
+"これは、衝突検出の最速の(ただし精度が最も低い)オプションです。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "複数の凸型コリジョンの兄弟を作成"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"ポリゴンベースのコリジョンシェイプを作成します。\n"
+"これは、上記の2つのオプションの中間的なパフォーマンスです。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "アウトラインメッシュを生成..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"静的なアウトラインメッシュを作成します。アウトラインメッシュの法線は自動的に"
+"反転します。\n"
+"このプロパティを使用できない場合は、SpatialMaterialのGrowプロパティを代わりに"
+"使用できます。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "UV1を表示"
@@ -5997,14 +6099,13 @@ msgstr "シーンからアップデート"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
msgstr ""
-"メッシュのソースが指定されていません(ノードにMultiMeshが設定されていませ"
-"ん)。"
+"メッシュのソースが指定されていません(ノードにMultiMeshが設定されていません)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
msgstr ""
-"メッシュのソースが指定されていません(そしてMultiMeshにはメッシュが含まれてい"
-"ません)。"
+"メッシュのソースが指定されていません(そしてMultiMeshにはメッシュが含まれてい"
+"ません)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
@@ -6139,7 +6240,7 @@ msgstr "\"%s\" はフェイスジオメトリーを含んでいません。"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
-msgstr "放出器を作成"
+msgstr "放出源を作成"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Emission Points:"
@@ -6171,11 +6272,11 @@ msgstr "AABBを生成中"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
-msgstr "軸平行境界ボックスの可視性を生成する"
+msgstr "可視性のAABBを生成"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate AABB"
-msgstr "軸平行境界ボックス(AABB)を生成"
+msgstr "AABBを生成"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Point from Curve"
@@ -6200,7 +6301,7 @@ msgstr "曲線を分割する"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
-msgstr "曲線内のポイントを移動"
+msgstr "曲線内の点を移動"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move In-Control in Curve"
@@ -6278,14 +6379,12 @@ msgid "Set Curve Point Position"
msgstr "カーブポイントの位置を設定"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve In Position"
-msgstr "曲線の位置を設定"
+msgstr "曲線のIn-Controlの位置を指定"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve Out Position"
-msgstr "曲線のOut-ハンドルの位置を指定"
+msgstr "曲線のOut-Controlの位置を指定"
#: editor/plugins/path_editor_plugin.cpp
msgid "Split Path"
@@ -6554,7 +6653,7 @@ msgstr "リソースを読み込む"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ResourcePreloader"
-msgstr "リソースプリローダー"
+msgstr "ResourcePreloader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
@@ -6774,7 +6873,7 @@ msgstr "ブレーク"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
msgid "Continue"
-msgstr "実行を継続"
+msgstr "続行"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
@@ -6789,15 +6888,6 @@ msgid "Open Godot online documentation."
msgstr "Godotのオンラインドキュメントを開く。"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "ドキュメントを要求"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-"フィードバックを提供して、Godotのドキュメントの改善に役立ててください。"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "リファレンス文書を探す."
@@ -6859,16 +6949,16 @@ msgstr "ターゲット"
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
msgstr ""
-"ノード'%s'からノード'%s'へ送るシグナル'%s'のメソッド'%s'への接続が見つか"
-"りません。"
+"メソッド'%s' (シグナル'%s'用) が見つかりません、これはノード'%s'からノー"
+"ド'%s'へのシグナル用です。"
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "ライン"
+msgid "[Ignore]"
+msgstr "[無視]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(無視)"
+msgid "Line"
+msgstr "ライン"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6882,8 +6972,8 @@ msgstr "ファイルシステムのリソースのみドロップできます."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
msgstr ""
-"スクリプト '%s' はこのシーンで使われていないため、ノードを(ドラッグ&)ドロッ"
-"プすることができません。"
+"スクリプト '%s' はこのシーンで使われていないため、ノードを(ドラッグ&)ドロップ"
+"することができません。"
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
@@ -6951,11 +7041,11 @@ msgstr "右インデント"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
-msgstr "コメントの切り替え"
+msgstr "コメントアウト / 解除"
#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
-msgstr "行を折りたたむ/展開する"
+msgstr "行を折りたたむ / 展開"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
@@ -6963,7 +7053,7 @@ msgstr "すべての行を折りたたむ"
#: editor/plugins/script_text_editor.cpp
msgid "Unfold All Lines"
-msgstr "すべての行を展開する"
+msgstr "すべての行を展開"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
@@ -6975,7 +7065,7 @@ msgstr "シンボルを補完"
#: editor/plugins/script_text_editor.cpp
msgid "Evaluate Selection"
-msgstr "選択したものを評価する"
+msgstr "選択範囲を評価"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
@@ -6999,11 +7089,11 @@ msgstr "複数ファイル内を検索..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
-msgstr "コンテキストヘルプ"
+msgstr "コンテキスト ヘルプ"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Bookmark"
-msgstr "ブックマークの切り替え"
+msgstr "ブックマークをつける / 外す"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Bookmark"
@@ -7028,7 +7118,7 @@ msgstr "行に移動..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "ブレークポイントを切り替え"
+msgstr "ブレークポイントをつける / 外す"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
@@ -7047,7 +7137,7 @@ msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"このシェーダはディスク上で修正されています。\n"
+"このシェーダーはディスク上で修正されています。\n"
"どうしますか?"
#: editor/plugins/shader_editor_plugin.cpp
@@ -7068,7 +7158,7 @@ msgstr "ボーンへレスト・ポーズを設定する"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Skeleton2D"
-msgstr "スケルトン2D"
+msgstr "Skeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
@@ -7104,7 +7194,7 @@ msgstr "透視投影"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
-msgstr "変換は中止されました."
+msgstr "トランスフォームは中止されました。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "X-Axis Transform."
@@ -7136,7 +7226,7 @@ msgstr "%s 度回転."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Keying is disabled (no key inserted)."
-msgstr "キーは無効化されています(キーは挿入されていません)."
+msgstr "キーは無効化されています(キーは挿入されていません)。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Animation Key Inserted."
@@ -7176,11 +7266,11 @@ msgstr "頂点"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View."
-msgstr "上面図."
+msgstr "上面図。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View."
-msgstr "下面図."
+msgstr "下面図。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom"
@@ -7204,7 +7294,7 @@ msgstr "右側面"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View."
-msgstr "前面図."
+msgstr "前面図。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front"
@@ -7220,7 +7310,7 @@ msgstr "後面"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "変換をビューに合わせる"
+msgstr "トランスフォームをビューに合わせる"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
@@ -7228,13 +7318,17 @@ msgstr "回転をビューに合わせる"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
-msgstr "子インスタンスを生成するための親が見つかりません。"
+msgstr "子をインスタンス化するための親が見つかりません。"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "This operation requires a single selected node."
msgstr "単一の選択されたノードがないと、この操作は行えません。"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "自動平行投影 有効"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "ビューの回転を固定"
@@ -7248,7 +7342,7 @@ msgstr "ワイヤーフレーム表示"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Overdraw"
-msgstr "オーバードローを表示"
+msgstr "オーバードロー表示"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Unshaded"
@@ -7256,11 +7350,11 @@ msgstr "シェーディングなしで表示"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Environment"
-msgstr "環境表示"
+msgstr "環境を表示"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Gizmos"
-msgstr "ギズモ(Gizmo)を表示"
+msgstr "ギズモを表示"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
@@ -7300,11 +7394,11 @@ msgstr "フリールック右"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "前方をフリールックで見る"
+msgstr "フリールック前進"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "フリールック後方"
+msgstr "フリールック後進"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
@@ -7316,36 +7410,49 @@ msgstr "フリールック下"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
-msgstr "フリールックの速度を調整"
+msgstr "フリールックの速度調整"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Freelook Slow Modifier"
-msgstr "フリールックの速度を調整"
+msgstr "フリールックの減速調整"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "ビューの回転を固定中"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
-"注意:表示されるFPS値は、エディタのフレームレートです。\n"
+"注意: 表示されるFPS値は、エディタのフレームレートです。\n"
"ゲーム内のパフォーマンスを確実に示すものとして使用することはできません。"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "ビューの回転を固定中"
+msgid "XForm Dialog"
+msgstr "XFormダイアログ"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
-msgstr "Xformダイアログ"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"クリックで可視状態のオン / オフ。\n"
+"\n"
+"開いた目: ギズモは可視。\n"
+"閉じた目: ギズモは非可視。\n"
+"半開きの目: ギズモは非透明な面を通しても可視 (「X線」)。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr "ノードを底面にスナップさせる"
+msgstr "ノードをフロアにスナップ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr "選択をスナップする剛体の床を見つけれません。"
+msgstr "選択対象をスナップさせる剛体の床を見つけられませんでした。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7353,14 +7460,13 @@ msgid ""
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
msgstr ""
-"ドラッグ:回転\n"
-"Alt+ドラッグ:移動\n"
-"Alt+右クリック: 奥行きリストの選択"
+"ドラッグ: 回転\n"
+"Alt+ドラッグ: 移動\n"
+"Alt+右クリック: 奥行き選択リスト"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Use Local Space"
-msgstr "ローカル空間モード (%s)"
+msgstr "ローカル空間を使用"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
@@ -7392,7 +7498,7 @@ msgstr "右側面図"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr "透視図/正投影図の切り替え"
+msgstr "透視投影 / 平行投影の切り替え"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
@@ -7404,24 +7510,24 @@ msgstr "原点にフォーカス"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
-msgstr "選択にフォーカス"
+msgstr "選択対象にフォーカス"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
-msgstr "フリールックの切り替え"
+msgstr "フリールックのオン / オフ"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform"
-msgstr "幾何学変換(変形)"
+msgstr "トランスフォーム"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
-msgstr "オブジェクトを底面にスナップ"
+msgstr "オブジェクトをフロアにスナップ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
-msgstr "変換のダイアログ..."
+msgstr "トランスフォームのダイアログ..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
@@ -7433,7 +7539,7 @@ msgstr "2 ビューポート"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr "2 ビューポート(Alt)"
+msgstr "2 ビューポート (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
@@ -7441,7 +7547,7 @@ msgstr "3 ビューポート"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr "3 ビューポート(Alt)"
+msgstr "3 ビューポート (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
@@ -7453,7 +7559,7 @@ msgstr "ギズモ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
-msgstr "原点の表示"
+msgstr "ビューの原点"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Grid"
@@ -7474,7 +7580,7 @@ msgstr "スナップを移動:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
-msgstr "スナップの回転(度):"
+msgstr "スナップの回転(度):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
@@ -7498,7 +7604,7 @@ msgstr "Z-Farを表示:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Change"
-msgstr "変換の変更"
+msgstr "トランスフォームの変更"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
@@ -7506,7 +7612,7 @@ msgstr "移動:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate (deg.):"
-msgstr "回転(度):"
+msgstr "回転(度):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale (ratio):"
@@ -7514,7 +7620,7 @@ msgstr "縮尺(比):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Type"
-msgstr "変換タイプ"
+msgstr "トランスフォーム タイプ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pre"
@@ -7530,7 +7636,7 @@ msgstr "無名のギズモ"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create Mesh2D"
-msgstr "Mesh2Dを作成する"
+msgstr "Mesh2Dを生成"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Mesh2D Preview"
@@ -7582,15 +7688,15 @@ msgstr "ジオメトリが無効です。ポリゴンを作成できません。
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Polygon2D"
-msgstr "Polygon2Dに変換"
+msgstr "Polygon2Dに変換する"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
-msgstr "ジオメトリが無効です。衝突ポリゴンを作成できません。"
+msgstr "ジオメトリが無効です。コリジョンポリゴンを作成できません。"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create CollisionPolygon2D Sibling"
-msgstr "CollisionPolygon2Dの兄弟を作成する"
+msgstr "CollisionPolygon2Dの兄弟を作成"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
@@ -7598,7 +7704,7 @@ msgstr "ジオメトリが無効です。ライトオクールダーを作成で
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D Sibling"
-msgstr "LightOccluder2Dの兄弟を作成する"
+msgstr "LightOccluder2Dの兄弟を作成"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite"
@@ -7662,7 +7768,7 @@ msgstr "アニメーションのFPSを変更"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "(empty)"
-msgstr "(空)"
+msgstr "(空)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move Frame"
@@ -7677,7 +7783,8 @@ msgid "New Animation"
msgstr "新規アニメーション"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "速度(FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7738,7 +7845,7 @@ msgstr "スプライトフレーム"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Region Rect"
-msgstr "矩形の領域を設定"
+msgstr "領域 Rect を設定"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Margin"
@@ -7803,7 +7910,7 @@ msgstr "テーマを編集"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
-msgstr "テーマ編集メニュー."
+msgstr "テーマ編集メニュー。"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
@@ -7827,7 +7934,7 @@ msgstr "現在のエディタテーマから作成"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Toggle Button"
-msgstr "ボタンの切り替え"
+msgstr "切り替えボタン"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Disabled Button"
@@ -7850,14 +7957,12 @@ msgid "Checked Item"
msgstr "チェック済みアイテム"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Radio Item"
-msgstr "アイテムを追加"
+msgstr "ラジオ アイテム"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Checked Radio Item"
-msgstr "チェック済みアイテム"
+msgstr "チェック済みラジオ アイテム"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Named Sep."
@@ -7908,9 +8013,8 @@ msgid "Subtree"
msgstr "サブツリー"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Has,Many,Options"
-msgstr "オプション"
+msgstr "Has,Many,Options"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
@@ -7931,7 +8035,7 @@ msgstr "フォント"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Color"
-msgstr "\\ Color"
+msgstr "Color"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme File"
@@ -7939,7 +8043,7 @@ msgstr "テーマ ファイル"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
-msgstr "選択対象を消去"
+msgstr "選択範囲を消去"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Fix Invalid Tiles"
@@ -7948,7 +8052,7 @@ msgstr "無効なタイルを修正"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cut Selection"
-msgstr "選択対象を切り取り"
+msgstr "選択範囲を切り取り"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -7960,7 +8064,7 @@ msgstr "直線を描画"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
-msgstr "矩形ペイント"
+msgstr "長方形ペイント"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
@@ -7972,11 +8076,11 @@ msgstr "タイルマップを消去"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Find Tile"
-msgstr "タイルを検索する"
+msgstr "タイルを検索"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
-msgstr "行列(縦横)入れ替え"
+msgstr "行列(縦横)入れ替え"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Disable Autotile"
@@ -7998,19 +8102,19 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "タイルを塗る"
+msgstr "タイルをペイント"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
"Shift+LMB: Line Draw\n"
"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
-"Shift+左マウスボタン:線の描画\n"
-"Shift+Ctrl+左マウスボタン:矩形ペイント"
+"Shift+左マウスボタン: 直線に描く\n"
+"Shift+Ctrl+左マウスボタン: 長方形ペイント"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "タイルを選択"
+msgstr "タイルをピック"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
@@ -8030,7 +8134,7 @@ msgstr "上下反転"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Clear Transform"
-msgstr "変換をクリア"
+msgstr "トランスフォームをクリア"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet."
@@ -8150,7 +8254,7 @@ msgstr "ビットマスクを消去。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create a new rectangle."
-msgstr "新規矩形を作成。"
+msgstr "新しく長方形を作成。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create a new polygon."
@@ -8158,7 +8262,7 @@ msgstr "新規ポリゴンを生成。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
-msgstr "領域Rect内にポリゴンを保持します。"
+msgstr "領域Rect内のポリゴンを保持します。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
@@ -8207,12 +8311,12 @@ msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
-"四角形を編集するためハンドルをドラッグします。編集のため別のタイルをクリック"
-"します。"
+"ハンドルをドラッグして長方形を編集します。\n"
+"別のタイルをクリックするとそれを編集します。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete selected Rect."
-msgstr "選択した矩形を削除する。"
+msgstr "選択した長方形を削除する。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8220,7 +8324,7 @@ msgid ""
"Click on another Tile to edit it."
msgstr ""
"現在編集中のサブタイルを選択します。\n"
-"別のタイルをクリックして編集します。"
+"別のタイルをクリックしてそれを編集します。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete polygon."
@@ -8233,10 +8337,10 @@ msgid ""
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
msgstr ""
-"左クリック:ビットをオンに設定します。\n"
+"左クリック:ビットをオンにします。\n"
"右クリック:ビットをオフにします。\n"
"Shift+左クリック:ワイルドカード・ビットを設定します。\n"
-"別のタイルをクリックして編集します。"
+"別のタイルをクリックしてそれを編集します。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8261,12 +8365,12 @@ msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
msgstr ""
-"Zインデックスを変更するには、サブタイルを選択します。\n"
-"別のタイルをクリックして編集します。"
+"サブタイルを選択して、zインデックスを変更します。\n"
+"別のタイルをクリックしてそれを編集します。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Region"
-msgstr "タイル領域の設定"
+msgstr "タイル領域を設定"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Tile"
@@ -8333,14 +8437,12 @@ msgid "Edit Tile Z Index"
msgstr "タイルのZインデックスを編集"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Convex"
-msgstr "ポリゴンを凸面にする"
+msgstr "凸面を作る"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
-msgstr "ポリゴンを凹面にする"
+msgstr "凹面を作る"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Collision Polygon"
@@ -8362,7 +8464,7 @@ msgstr "タイルセット"
msgid "No VCS addons are available."
msgstr "VCSアドオンは利用できません。"
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "エラー"
@@ -8420,20 +8522,19 @@ msgstr "タイプの変更"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage Selected"
-msgstr "選択されたものを公開する"
+msgstr "選択対象をステージする"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage All"
-msgstr "すべてを公開する"
+msgstr "すべてをステージする"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
msgstr "コミットメッセージを追加する"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Commit Changes"
-msgstr "スクリプトの変更を同期"
+msgstr "変更をコミットする"
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
@@ -8462,23 +8563,23 @@ msgstr "出力を追加"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar"
-msgstr "スカラー"
+msgstr "Scalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector"
-msgstr "ベクター(Vector)"
+msgstr "Vector"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
-msgstr "ブール"
+msgstr "Boolean"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sampler"
-msgstr "サンプラー"
+msgstr "Sampler"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add input port"
-msgstr "入力ポートの追加"
+msgstr "入力ポートを追加"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
@@ -8510,11 +8611,11 @@ msgstr "出力ポートの削除"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set expression"
-msgstr "式の設定"
+msgstr "式を設定"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Resize VisualShader node"
-msgstr "ビジュアルシェーダーノードのサイズを変更する"
+msgstr "VisualShaderノードのサイズを変更"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
@@ -8554,9 +8655,8 @@ msgid "Fragment"
msgstr "フラグメント"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "右側面"
+msgstr "ライト"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Show resulted shader code."
@@ -8568,7 +8668,7 @@ msgstr "シェーダーノードの作成"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color function."
-msgstr "カラー関数。"
+msgstr "Color関数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
@@ -8580,11 +8680,11 @@ msgstr "グレースケール関数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr "HSVベクトルをRGBベクトルに変換します。"
+msgstr "HSVベクトルをRGBベクトルに変換。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr "RGBベクトルをHSVベクトルに変換します。"
+msgstr "RGBベクトルをHSVベクトルに変換。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sepia function."
@@ -8628,12 +8728,11 @@ msgstr "SoftLight演算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color constant."
-msgstr "カラー定数。"
+msgstr "Color定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "トランスフォーム"
+msgstr "Colorのuniform。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
@@ -8761,27 +8860,27 @@ msgstr "ネイピア数(2.718282)。自然対数のベースを表します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr "Υ(イプシロン)定数(0.00001)。可能な最小のスカラー数。"
+msgstr "ε(イプシロン)定数(0.00001)。使用可能な最小のスカラー数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
-msgstr "Φ(ファイ)定数 (1.618034)。黄金比。"
+msgstr "φ(ファイ)定数 (1.618034)。黄金比。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr "Π(パイ)/4定数 (0.785398) または45度。"
+msgstr "π(パイ)/4定数 (0.785398) または45度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr "Π(パイ)/2 定数(1.570796)または90度。"
+msgstr "π(パイ)/2 定数(1.570796)または90度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr "Π(パイ)定数(3.141593)または180度。"
+msgstr "π(パイ)定数(3.141593)または180度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr "Τ(タウ)定数(6.283185)または360度。"
+msgstr "τ(タウ)定数(6.283185)または360度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
@@ -8919,7 +9018,7 @@ msgstr "パラメータの符号を抽出します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr "パラメータの符号を返します。"
+msgstr "パラメータのサインを返します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
@@ -8930,7 +9029,6 @@ msgid "Returns the square root of the parameter."
msgstr "パラメータの平方根を返します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
@@ -8938,22 +9036,21 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
-"SmoothStep関数(scalar(エッジ0)、scalar(エッジ1)、scalar (x))。\n"
+"SmoothStep関数( scalar(edge0), scalar(edge1), scalar(x) )。\n"
"\n"
-"'x' が 'edge0' より小さい場合は0.0を返し、xが 'edge1' より大きい場合は1.0を返"
-"します。それ以外の場合、戻り値はエルミート多項式を使用して0.0と1.0の間で補間"
-"されます。"
+"'x' が 'edge0' より小さい場合は 0.0 を返し、xが 'edge1' より大きい場合は 1.0 "
+"を返します。それ以外の場合、戻り値はエルミート多項式を使用して 0.0 と 1.0 の"
+"間で補間されます。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
-"Step関数( scalar(edge)、scalar(x))。\n"
+"Step関数( scalar(edge), scalar(x) )。\n"
"\n"
-"'x' が 'edge' より小さい場合は0.0を返し、それ以外の場合は1.0を返します。"
+"'x' が 'edge' より小さい場合は 0.0 を返し、それ以外の場合は 1.0 を返します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
@@ -8981,7 +9078,7 @@ msgstr "スカラーをスカラーで乗算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr "2つのスカラーの残りを返します。"
+msgstr "2つのスカラーの剰余を返します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
@@ -8992,9 +9089,8 @@ msgid "Scalar constant."
msgstr "スカラー定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "スカラUniformを変更"
+msgstr "Scalarのuniform。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
@@ -9005,27 +9101,22 @@ msgid "Perform the texture lookup."
msgstr "テクスチャ・ルックアップを実行します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Cubic texture uniform lookup."
-msgstr "テクスチャUniformを変更"
+msgstr "キュービックテクスチャuniformルックアップ。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup."
-msgstr "テクスチャUniformを変更"
+msgstr "2Dテクスチャuniformルックアップ。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup with triplanar."
-msgstr "テクスチャUniformを変更"
+msgstr "triplanarの2Dテクスチャuniformルックアップ。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "トランスフォームのダイアログ..."
+msgstr "トランスフォーム関数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Calculate the outer product of a pair of vectors.\n"
"\n"
@@ -9035,7 +9126,7 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
-"(GLES3のみ)ベクトルのペアの外積を計算します。\n"
+"ベクトルのペアの外積を計算します。\n"
"\n"
"OuterProductは、最初のパラメータ 'c' を列ベクトル(1列の行列)として、2番目のパ"
"ラメータ 'r' を行ベクトル(1行の行列)として処理し、線形代数行列乗算 'c * r' を"
@@ -9044,41 +9135,39 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr "4つのベクトルから変換を作成します。"
+msgstr "4つのベクトルからトランスフォームを作成します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
-msgstr "変換を4つのベクトルに分解します。"
+msgstr "トランスフォームを4つのベクトルに分解します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr "変換の行列式を計算します。"
+msgstr "トランスフォームの行列式を計算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr "変換の逆行列を計算します。"
+msgstr "トランスフォームの逆行列を計算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr "変換の転置を計算します。"
+msgstr "トランスフォームの転置を計算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr "変換で変換を乗算します。"
+msgstr "トランスフォームでトランスフォームを乗算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr "変換でベクトルを乗算します。"
+msgstr "トランスフォームでベクトルを乗算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "トランスフォームは中止されました."
+msgstr "トランスフォーム定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "トランスフォームは中止されました."
+msgstr "トランスフォーム用uniform。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector function."
@@ -9109,7 +9198,6 @@ msgid "Calculates the dot product of two vectors."
msgstr "2つのベクトルの内積を計算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Returns the vector that points in the same direction as a reference vector. "
"The function has three vector parameters : N, the vector to orient, I, the "
@@ -9117,9 +9205,9 @@ msgid ""
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
"参照ベクトルと同じ方向を指すベクトルを返します。 この関数には3つのベクトルパ"
-"ラメータがあります。Nは配向するベクトル、Iは入射ベクトル、Nrefは参照ベクトル"
-"です。 IとNrefの内積が0より小さい場合、戻り値はNです。それ以外の場合、-Nが返"
-"されます。"
+"ラメータがあります。Nは方向ベクトル、Iは入射ベクトル、Nrefは参照ベクトルで"
+"す。 IとNrefの内積が0より小さい場合、戻り値はNです。それ以外の場合、-Nが返さ"
+"れます。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
@@ -9218,7 +9306,7 @@ msgstr "ベクトルでベクトルを乗算します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr "2つのベクトルの残りを返します。"
+msgstr "2つのベクトルの剰余を返します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
@@ -9229,9 +9317,8 @@ msgid "Vector constant."
msgstr "ベクトル定数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector uniform."
-msgstr "uniform への割り当て。"
+msgstr "ベクトルuniform。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9239,9 +9326,9 @@ msgid ""
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
-"カスタムのGodotシェーダ言語式。カスタムの量の入出力ポートを持ちます。 これは"
-"vertex / fragment / light関数へのコードの直接注入です。内部で関数宣言を書くた"
-"めにそれを使用しないでください。"
+"カスタムのGodotシェーダー言語式。カスタムの量の入出力ポートを持ちます。 これ"
+"はvertex / fragment / light関数へのコードの直接注入です。内部で関数宣言を書く"
+"ためにそれを使用しないでください。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9252,7 +9339,6 @@ msgstr ""
"返します。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Custom Godot Shader Language expression, which is placed on top of the "
"resulted shader. You can place various function definitions inside and call "
@@ -9319,7 +9405,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
-msgstr "ビジュアルシェーダー"
+msgstr "VisualShader"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Edit Visual Property"
@@ -9399,8 +9485,9 @@ msgid ""
"Only one preset per platform may be marked as runnable."
msgstr ""
"チェックを入れると、1クリック・デプロイでもこのプリセットが使われるようにな"
-"ります。ひとつのプラットフォームに対し、ひとつのプリセットのみが実行可能とし"
-"てマークできます。"
+"ります。\n"
+"ひとつのプラットフォームに対し、ひとつのプリセットのみが実行可能としてマーク"
+"できます。"
#: editor/project_export.cpp
msgid "Export Path"
@@ -9416,11 +9503,11 @@ msgstr "プロジェクト内のリソースをすべてエクスポート"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
-msgstr "選択したシーン(と依存関係にあるもの)をエクスポート"
+msgstr "選択したシーン(と依存関係にあるもの)をエクスポート"
#: editor/project_export.cpp
msgid "Export selected resources (and dependencies)"
-msgstr "選択したリソース(と依存関係にあるもの)をエクスポート"
+msgstr "選択したリソース(と依存関係にあるもの)をエクスポート"
#: editor/project_export.cpp
msgid "Export Mode:"
@@ -9484,7 +9571,7 @@ msgstr "テキスト"
#: editor/project_export.cpp
msgid "Compiled"
-msgstr "コンパイル"
+msgstr "コンパイル済み"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
@@ -9535,26 +9622,32 @@ msgid "Export With Debug"
msgstr "デバッグ付きエクスポート"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "存在しないパスです。"
+msgid "The path specified doesn't exist."
+msgstr "指定されたパスは存在しません。"
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
-"無効な '.zip' プロジェクトファイルです。'project.godot' ファイルが含まれてい"
+"パッケージ ファイルを開くときにエラーが発生しました (ZIP形式ではありません)。"
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr ""
+"無効な\".zip\"プロジェクトファイルです。\"project.godot\"ファイルが含まれてい"
"ません。"
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
-msgstr "空のフォルダーを選択してください。"
+msgstr "空のフォルダを選択してください。"
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "'project.godot' もしくは '.zip' ファイルを選択してください."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "\"project.godot\"または\".zip\"ファイルを選択してください。"
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "ディレクトリにはGodotプロジェクトがすでに含まれています。"
+msgid "This directory already contains a Godot project."
+msgstr "このディレクトリにはすでにGodotプロジェクトが含まれています。"
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9574,7 +9667,7 @@ msgstr "フォルダを作成できませんでした。"
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
-msgstr "このパスには、指定された名前のフォルダーが既に存在します。"
+msgstr "このパスには、指定された名前のフォルダが既に存在します。"
#: editor/project_manager.cpp
msgid "It would be a good idea to name your project."
@@ -9582,7 +9675,7 @@ msgstr "プロジェクトに名前を付けてください."
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr "プロジェクトパスが無効です(何かを変更しましたか?)。"
+msgstr "無効なプロジェクトパスです (なにか変更がありましたか?)。"
#: editor/project_manager.cpp
msgid ""
@@ -9713,13 +9806,13 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
-"次のプロジェクト設定ファイルには、作成に使用したGodotのバージョンは指定されて"
-"いません。\n"
+"次のプロジェクト設定ファイルには、作成に使用されたGodotのバージョンが指定され"
+"ていません。\n"
"\n"
"%s\n"
"\n"
"ファイルを開くと、Godotの現在の設定ファイル形式に変換されます。\n"
-"警告:以前のバージョンのエンジンではプロジェクトを開けません。"
+"警告: 以前のバージョンのエンジンではプロジェクトを開けなくなります。"
#: editor/project_manager.cpp
msgid ""
@@ -9775,7 +9868,7 @@ msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
-"%d プロジェクトを一覧から削除しますか?\n"
+"%d プロジェクトを一覧から削除しますか?\n"
"プロジェクトフォルダの内容は変更されません。"
#: editor/project_manager.cpp
@@ -9783,7 +9876,7 @@ msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
msgstr ""
-"このプロジェクトを一覧から削除しますか?\n"
+"このプロジェクトを一覧から削除しますか?\n"
"プロジェクトフォルダの内容は変更されません。"
#: editor/project_manager.cpp
@@ -9811,6 +9904,7 @@ msgstr ""
"既存のGodotプロジェクトの%sフォルダをスキャンしますか?\n"
"これにはしばらく時間がかかります。"
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "プロジェクトマネージャー"
@@ -9829,7 +9923,7 @@ msgstr "スキャン"
#: editor/project_manager.cpp
msgid "Select a Folder to Scan"
-msgstr "スキャンするフォルダーを選択"
+msgstr "スキャンするフォルダを選択"
#: editor/project_manager.cpp
msgid "New Project"
@@ -9837,7 +9931,7 @@ msgstr "新規プロジェクト"
#: editor/project_manager.cpp
msgid "Remove Missing"
-msgstr "存在しないものを削除"
+msgstr "存在しないものを除去"
#: editor/project_manager.cpp
msgid "Templates"
@@ -9859,6 +9953,17 @@ msgstr ""
"プロジェクトが何も登録されていません。\n"
"アセットライブラリで公式のサンプルプロジェクトをチェックしますか?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"検索ボックスでは、プロジェクトは名前およびパスの最後の部分でフィルターされま"
+"す。\n"
+"プロジェクト名および完全パスでフィルターするには、クエリには `/` 文字が少なく"
+"とも1つ必要です。"
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "キー "
@@ -9880,8 +9985,8 @@ msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"アクション名が無効です。空にしたり、「/ 」、「: 」、「= 」、「\\ 」を含めるこ"
-"とはできません"
+"アクション名が無効です。空にしたり、'/'、':'、'='、'\\'、'\"'を含めることはで"
+"きません"
#: editor/project_settings_editor.cpp
msgid "An action with the name '%s' already exists."
@@ -9893,11 +9998,11 @@ msgstr "入力アクションイベントの名前を変更する"
#: editor/project_settings_editor.cpp
msgid "Change Action deadzone"
-msgstr "アクションデッドゾーンの変更"
+msgstr "アクション デッドゾーンを変更"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
-msgstr "入力アクションイベントを追加"
+msgstr "入力アクション イベントを追加"
#: editor/project_settings_editor.cpp
msgid "All Devices"
@@ -9969,7 +10074,7 @@ msgstr "入力アクションを消去"
#: editor/project_settings_editor.cpp
msgid "Erase Input Action Event"
-msgstr "入力アクションイベントを消去"
+msgstr "入力アクション イベントを消去"
#: editor/project_settings_editor.cpp
msgid "Add Event"
@@ -9977,7 +10082,7 @@ msgstr "イベントを追加"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "\\ Button"
+msgstr "Button"
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -9993,15 +10098,15 @@ msgstr "中クリック"
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
-msgstr "マウスホイールを上."
+msgstr "マウスホイールを上に。"
#: editor/project_settings_editor.cpp
msgid "Wheel Down."
-msgstr "マウスホイールを下."
+msgstr "マウスホイールを下に。"
#: editor/project_settings_editor.cpp
msgid "Add Global Property"
-msgstr "グローバルプロパティの追加"
+msgstr "グローバルプロパティを追加"
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
@@ -10024,7 +10129,7 @@ msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
-"無効なアクション名です。空もしくは'/', ':', '=', '\\' や '\"'を含めることはで"
+"無効なアクション名です。空もしくは'/'、':'、'='、'\\' 、'\"'を含めることはで"
"きません。"
#: editor/project_settings_editor.cpp
@@ -10033,16 +10138,15 @@ msgstr "入力アクションの追加"
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
-msgstr "設定を保存できませんでした."
+msgstr "設定を保存できませんでした。"
#: editor/project_settings_editor.cpp
msgid "Settings saved OK."
-msgstr "設定の保存に成功しました."
+msgstr "設定の保存に成功しました。"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Moved Input Action Event"
-msgstr "入力アクションイベントを追加"
+msgstr "入力アクションイベントを移動"
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
@@ -10154,7 +10258,7 @@ msgstr "ロケール"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
-msgstr "ロケールフィルター"
+msgstr "ロケールフィルタ"
#: editor/project_settings_editor.cpp
msgid "Show All Locales"
@@ -10166,7 +10270,7 @@ msgstr "選択したロケールのみ表示"
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
-msgstr "フィルターモード:"
+msgstr "フィルタモード:"
#: editor/project_settings_editor.cpp
msgid "Locales:"
@@ -10218,7 +10322,7 @@ msgstr "ファイル読み込みエラー: リソースではありません!"
#: editor/property_editor.cpp
msgid "Pick a Node"
-msgstr "ノードを選択する"
+msgstr "ノードを選ぶ"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
@@ -10241,14 +10345,25 @@ msgid "Batch Rename"
msgstr "名前の一括変更"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "置換: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "プレフィックス"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "サフィックス"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "正規表現を使用する"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "高度なオプション"
@@ -10285,11 +10400,12 @@ msgstr ""
"カウンタオプションを比較します。"
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "レベルごとのカウンタ"
+msgid "Per-level Counter"
+msgstr "レベルごとのカウンター"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "設定すると、子ノードのグループごとにカウンタが再起動します"
#: editor/rename_dialog.cpp
@@ -10317,10 +10433,6 @@ msgstr ""
"欠落した数字は、先頭にゼロが埋め込まれます。"
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "正規表現"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "ポストプロセス"
@@ -10329,12 +10441,12 @@ msgid "Keep"
msgstr "保持"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "キャメルケースをアンダースコアに"
+msgid "PascalCase to snake_case"
+msgstr "PascalCaseからsnake_caseへ"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "アンダースコアをキャメルケースに"
+msgid "snake_case to PascalCase"
+msgstr "snake_caseをPascalCaseへ"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10352,6 +10464,15 @@ msgstr "大文字に"
msgid "Reset"
msgstr "リセット"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "正規表現エラー"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "文字 %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "親ノードを変更"
@@ -10362,7 +10483,7 @@ msgstr "親を変更(新しい親を選択):"
#: editor/reparent_dialog.cpp
msgid "Keep Global Transform"
-msgstr "グローバル変換を保持"
+msgstr "グローバル トランスフォームを保持"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent"
@@ -10417,8 +10538,8 @@ msgid "Instance Child Scene"
msgstr "子シーンをインスタンス化"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "スクリプトをクリア"
+msgid "Detach Script"
+msgstr "スクリプトをデタッチ"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10454,6 +10575,10 @@ msgid "Make node as Root"
msgstr "ノードをルートにする"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "%d ノードとその子ノードすべてを削除しますか?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "%d ノードを削除しますか?"
@@ -10490,13 +10615,12 @@ msgstr ""
"に戻ります。"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
-"\"editable_instance\" を無効にすると、ノードのすべてのプロパティがデフォルト"
-"に戻ります。"
+"『プレースホルダとしてロード』を有効にすると『編集可能な子』は無効にされ、こ"
+"のノードにあるすべてのプロパティはデフォルト値に戻されます。"
#: editor/scene_tree_dock.cpp
msgid "Make Local"
@@ -10551,8 +10675,8 @@ msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
msgstr ""
-"新しいシーンを保存できませんでした。 おそらく依存関係(インスタンス)を満たすこ"
-"とができませんでした。"
+"新しいシーンを保存できませんでした。 おそらく依存関係(インスタンス)を満たせて"
+"いません。"
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
@@ -10576,13 +10700,23 @@ msgstr "編集可能な子"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
-msgstr "プレースホルダーとしてロード"
+msgstr "プレースホルダとしてロード"
#: editor/scene_tree_dock.cpp
msgid "Open Documentation"
msgstr "ドキュメントを開く"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"スクリプトをアタッチできません: 言語がひとつも登録されていません。\n"
+"おそらくこのエディタは、すべての言語モジュールを無効化してビルドされていま"
+"す。"
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "子ノードを追加"
@@ -10631,12 +10765,12 @@ msgstr ""
"合は、継承されたシーンを作成します。"
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr "選択したノードに新規または既存のスクリプトをアタッチする。"
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "選択したノードのスクリプトをクリアする。"
+msgid "Detach the script from the selected node."
+msgstr "選択したノードのスクリプトをデタッチする。"
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10652,11 +10786,11 @@ msgstr "継承をクリアしますか? (元に戻せません!)"
#: editor/scene_tree_editor.cpp
msgid "Toggle Visible"
-msgstr "表示の切り替え"
+msgstr "表示 / 非表示の切り替え"
#: editor/scene_tree_editor.cpp
msgid "Unlock Node"
-msgstr "ノードのロック解除"
+msgstr "ノードをロック解除"
#: editor/scene_tree_editor.cpp
msgid "Button Group"
@@ -10683,7 +10817,7 @@ msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
-"ノードに %s 個接続があります。\n"
+"ノードに %s 個接続があります。\n"
"クリックでシグナル ドックを表示。"
#: editor/scene_tree_editor.cpp
@@ -10711,7 +10845,7 @@ msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
-"子を選択できません.\n"
+"子を選択できません。\n"
"クリックして選択可能にしてください。"
#: editor/scene_tree_editor.cpp
@@ -10736,7 +10870,7 @@ msgstr "ノードの名前を変更"
#: editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
-msgstr "シーンツリー(ノード):"
+msgstr "シーンツリー(ノード):"
#: editor/scene_tree_editor.cpp
msgid "Node Configuration Warning!"
@@ -10767,6 +10901,10 @@ msgid "A directory with the same name exists."
msgstr "同名のフォルダが存在します。"
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "ファイルが存在しません。"
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "無効な拡張子です。"
@@ -10784,7 +10922,7 @@ msgstr "エラー - ファイルシステムにスクリプトを作成できま
#: editor/script_create_dialog.cpp
msgid "Error loading script from %s"
-msgstr "%s からのスクリプトの読み込み中にエラーが発生しました"
+msgstr "%s からのスクリプトを読み込み中にエラー"
#: editor/script_create_dialog.cpp
msgid "Overrides"
@@ -10796,7 +10934,7 @@ msgstr "N/A"
#: editor/script_create_dialog.cpp
msgid "Open Script / Choose Location"
-msgstr "スクリプトを開く/場所を選択する"
+msgstr "スクリプトを開く / 場所を選択する"
#: editor/script_create_dialog.cpp
msgid "Open Script"
@@ -10804,23 +10942,27 @@ msgstr "スクリプトを開く"
#: editor/script_create_dialog.cpp
msgid "File exists, it will be reused."
-msgstr "ファイルは存在します。再利用されます。"
+msgstr "ファイルが既に存在します。そちらを再利用します。"
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "パスが無効です。"
#: editor/script_create_dialog.cpp
msgid "Invalid class name."
-msgstr "クラス名が無効です。"
+msgstr "無効なクラス名。"
#: editor/script_create_dialog.cpp
msgid "Invalid inherited parent name or path."
-msgstr "継承された親の名前またはパスが無効です。"
+msgstr "継承する親の名前、またはパスが無効です。"
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "スクリプトは有効です。"
+msgid "Script path/name is valid."
+msgstr "スクリプトのパス/名前は有効です。"
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "使用可能: a-z, A-Z, 0-9 と ."
+msgstr "使用可能: a-z、A-Z、0-9及び_。"
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)."
@@ -10839,6 +10981,14 @@ msgid "Script file already exists."
msgstr "スクリプトファイルが既にあります。"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"注: 組み込みスクリプトにはいくつか制約があり、また外部のエディタでは編集でき"
+"ません。"
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "クラス名:"
@@ -10852,7 +11002,7 @@ msgstr "組み込みスクリプト:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
-msgstr "ノードスクリプトを添付する"
+msgstr "ノードにスクリプトをアタッチする"
#: editor/script_editor_debugger.cpp
msgid "Remote "
@@ -10900,13 +11050,17 @@ msgstr "エラー"
#: editor/script_editor_debugger.cpp
msgid "Child process connected."
-msgstr "子プロセスが接続された。"
+msgstr "子プロセスが接続されました。"
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
msgstr "エラーをコピー"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "ビデオRAM"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "ブレークポイントをスキップする"
@@ -10955,8 +11109,8 @@ msgid "Total:"
msgstr "合計:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "ビデオメモリー"
+msgid "Export list to a CSV file"
+msgstr "CSVファイルにリストをエクスポート"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11000,11 +11154,11 @@ msgstr "数値データをCSVとしてエクスポート"
#: editor/settings_config_dialog.cpp
msgid "Erase Shortcut"
-msgstr "ショートカットの消去"
+msgstr "ショートカットを消去"
#: editor/settings_config_dialog.cpp
msgid "Restore Shortcut"
-msgstr "ショートカットの復元"
+msgstr "ショートカットを復元"
#: editor/settings_config_dialog.cpp
msgid "Change Shortcut"
@@ -11036,12 +11190,11 @@ msgstr "カメラのFOVを変更"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera Size"
-msgstr "カメラのサイズを変更"
+msgstr "カメラサイズを変更"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "パーティクルの軸平行境界ボックスを変更"
+msgstr "NotifierのAABBを変更"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -11057,7 +11210,7 @@ msgstr "球形の半径を変更"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
-msgstr "ボックスシェイプ範囲の変更"
+msgstr "ボックスシェイプの範囲を変更"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
@@ -11065,7 +11218,7 @@ msgstr "カプセルシェイプの半径を変更"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr "カプセル形状の高さを変更する"
+msgstr "カプセルシェイプの高さを変更"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Radius"
@@ -11149,7 +11302,7 @@ msgstr "ライブラリ: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr "\\ GDNative"
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
msgid "Step argument is zero!"
@@ -11232,14 +11385,12 @@ msgid "Grid Map"
msgstr "グリッドマップ"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Snap View"
-msgstr "上面図"
+msgstr "スナップビュー"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clip Disabled"
-msgstr "無効"
+msgstr "クリップ無効"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Above"
@@ -11290,18 +11441,16 @@ msgid "Cursor Clear Rotation"
msgstr "カーソル回転をクリア"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "選択対象を消去"
+msgstr "選択項目の貼り付け"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
msgstr "選択をクリア"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "すべて選択"
+msgstr "選択部の塗り潰し"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -11312,9 +11461,8 @@ msgid "Pick Distance:"
msgstr "距離を取得:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "フィルタメッシュ"
+msgstr "メッシュを絞り込む"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
@@ -11336,7 +11484,7 @@ msgstr "NavMeshを焼き込む"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
-msgstr "ナビメッシュ(ナビゲーションメッシュ)の消去."
+msgstr "ナビメッシュ(ナビゲーションメッシュ)の消去。"
#: modules/recast/navigation_mesh_generator.cpp
msgid "Setting up Configuration..."
@@ -11364,7 +11512,7 @@ msgstr "移動可能な領域を作成中..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Partitioning..."
-msgstr "パーティションを作成しています..."
+msgstr "分割中..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Creating contours..."
@@ -11380,7 +11528,7 @@ msgstr "ネイティブナビゲーションメッシュに変換しています
#: modules/recast/navigation_mesh_generator.cpp
msgid "Navigation Mesh Generator Setup:"
-msgstr "ナビメッシュ(ナビゲーションメッシュ)生成設定:"
+msgstr "ナビメッシュ(ナビゲーションメッシュ)生成設定:"
#: modules/recast/navigation_mesh_generator.cpp
msgid "Parsing Geometry..."
@@ -11441,7 +11589,7 @@ msgstr "引数名の変更"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr "変数のデフォルト値を設定する"
+msgstr "変数のデフォルト値を設定"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
@@ -11449,7 +11597,7 @@ msgstr "変数の型を設定"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Input Port"
-msgstr "入力ポートの追加"
+msgstr "入力ポートを追加"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Output Port"
@@ -11538,34 +11686,33 @@ msgstr "VisualScriptノードを複製"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"%sを押したままGetterを(ドラッグ&)ドロップする。Shiftを押したまま汎用署名を"
-"(ドラッグ&)ドロップする。"
+"%sを押したままGetterを(ドラッグ&)ドロップする。Shiftを押したまま汎用署名を"
+"(ドラッグ&)ドロップする。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"Ctrlを押したままGetterを(ドラッグ&)ドロップする。Shiftを押したまま汎用シグ"
-"ネチャを(ドラッグ&)ドロップする."
+"Ctrlを押したままGetterを(ドラッグ&)ドロップする。Shiftを押したまま汎用シグネ"
+"チャを(ドラッグ&)ドロップする."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
msgstr ""
-"%sを押したままノードへ単純参照(simple reference)を(ドラッグ&)ドロップす"
-"る。"
+"%sを押したままノードへ単純参照(simple reference)を(ドラッグ&)ドロップする。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
msgstr ""
-"Ctrlを押したままノードへ単純参照(simple reference)を(ドラッグ&)ドロップす"
+"Ctrlを押したままノードへ単純参照(simple reference)を(ドラッグ&)ドロップす"
"る。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
-msgstr "%sを押したまま変数のSetterを(ドラッグ&)ドロップする。"
+msgstr "%sを押したまま変数のSetterを(ドラッグ&)ドロップする。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr "Ctrlを押したまま変数のSetterを(ドラッグ&)ドロップする。"
+msgstr "Ctrlを押したまま変数のSetterを(ドラッグ&)ドロップする。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
@@ -11576,15 +11723,13 @@ msgid "Add Node(s) From Tree"
msgstr "ツリーからノードを追加"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid ""
"Can't drop properties because script '%s' is not used in this scene.\n"
"Drop holding 'Shift' to just copy the signature."
msgstr ""
-"スクリプト '%s' はこのシーンで使われていないため、ノードを落とすことができま"
+"このシーンではスクリプト '%s'が使用されていないため、プロパティを削除できま"
"せん。\n"
-"'shift' キーを押しながらドロップすることでシグネチャをコピーすることができま"
-"す。"
+"「Shift」を押しながらドロップすると、署名がコピーされます。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
@@ -11647,18 +11792,16 @@ msgid "Paste VisualScript Nodes"
msgstr "VisualScriptノードを貼り付け"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Can't create function with a function node."
-msgstr "ファンクションノードをコピーできません。"
+msgstr "関数ノードで関数を作成できません。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
msgstr "複数の関数を持つノードから、ノードの関数を作ることができません。"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Select at least one node with sequence port."
-msgstr "シーケンスポートでは最低でも一つのノードを選択してください。"
+msgstr "シーケンス ポートを持つノードを少なくとも 1 つ選択します。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Try to only have one sequence input in selection."
@@ -11709,9 +11852,8 @@ msgid "Add Function..."
msgstr "関数を追加…"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "関数:"
+msgstr "関数名"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
@@ -11719,7 +11861,7 @@ msgstr "グラフを編集する関数を選択または作成します。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr "選択済みを削除"
+msgstr "選択対象を削除"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
@@ -11735,11 +11877,11 @@ msgstr "ノードを切り取る"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Function"
-msgstr "関数の作成"
+msgstr "関数を作成"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "グラフの更新"
+msgstr "グラフを更新"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
@@ -11771,7 +11913,7 @@ msgstr "パスがノードに達しません!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
-msgstr "ノード%sの不正なインデックスのプロパティ名'%s' ."
+msgstr "ノード%sのインデックスのプロパティ名'%s'は無効です。"
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
@@ -11847,13 +11989,17 @@ msgstr "ADB実行可能ファイルがエディタ設定で設定されていま
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr "OpenJDK jarsignerがエディター設定で設定されていません。"
+msgstr "OpenJDK jarsignerがエディタ設定で設定されていません。"
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr "デバッグキーストアがエディタ設定にもプリセットにも設定されていません。"
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "エクスポート設定にてリリース キーストアが誤って設定されています。"
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr "カスタムビルドにはエディタ設定で有効なAndroid SDKパスが必要です。"
@@ -11879,6 +12025,42 @@ msgstr "無効なパッケージ名:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"「android/modules」に含まれる「GodotPaymentV3」モジュールのプロジェクト設定が"
+"無効です (Godot 3.2.2 にて変更)。\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+"プラグインを利用するには「Use Custom Build (カスタムビルドを使用する)」が有効"
+"になっている必要があります。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" は \"Xr Mode\" が \"Oculus Mobile VR\" の場合にのみ有"
+"効になります。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" は \"Xr Mode\" が \"Oculus Mobile VR\" の場合にのみ有効にな"
+"ります。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" は \"Xr Mode\" が \"Oculus Mobile VR\" の場合にのみ有効に"
+"なります。"
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11892,9 +12074,9 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
-"Androidビルドバージョンの不一致:\n"
-"インストールされたテンプレート:%s\n"
-"ゴドーバージョン:%s\n"
+"Androidビルド バージョンの不一致:\n"
+" インストールされたテンプレート: %s\n"
+" Godot バージョン: %s\n"
"「プロジェクト 」メニューからAndroidビルドテンプレートを再インストールしてく"
"ださい。"
@@ -11908,7 +12090,7 @@ msgid ""
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
"Androidプロジェクトのビルドに失敗しました。エラーの出力を確認してください。\n"
-"あるいは、Androidビルドドキュメントについてはdocs.godotengine.orgをご覧くださ"
+"また、Androidビルドについてのドキュメントは docs.godotengine.org をご覧くださ"
"い。"
#: platform/android/export/export.cpp
@@ -11961,7 +12143,7 @@ msgstr "無効なエクスポート テンプレート:"
#: platform/javascript/export/export.cpp
msgid "Could not read custom HTML shell:"
-msgstr "カスタムHTMLシェルを読み取ることができませんでした:"
+msgstr "カスタムHTMLシェルを読み込めませんでした:"
#: platform/javascript/export/export.cpp
msgid "Could not read boot splash image file:"
@@ -12001,37 +12183,39 @@ msgstr "Storeロゴの画像サイズが無効です(縦横50x50でないとい
#: platform/uwp/export/export.cpp
msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr "無効な44X44四角ロゴイメージ(縦横44x44でないといけません)。"
+msgstr "44X44の正方形ロゴの画像サイズが無効です(縦横44x44でないといけません)。"
#: platform/uwp/export/export.cpp
msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr "無効な71x71四角ロゴイメージ(縦横71x71でないといけません)。"
+msgstr "71x71の正方形ロゴの画像サイズが無効です(縦横71x71でないといけません)。"
#: platform/uwp/export/export.cpp
msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr "無効な150X150四角ロゴイメージ(縦横150x150でないといけません)。"
+msgstr ""
+"150X150の正方形ロゴの画像サイズが無効です(縦横150x150でないといけません)。"
#: platform/uwp/export/export.cpp
msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr "無効な310X310四角ロゴイメージ(縦横310x310でないといけません)。"
+msgstr ""
+"310X310の正方形ロゴの画像サイズが無効です(縦横310x310でないといけません)。"
#: platform/uwp/export/export.cpp
msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr "無効な310X150ワイドロゴイメージ(縦横310x150でないといけません)。"
+msgstr ""
+"310X150のワイドロゴの画像サイズが無効です(縦横310x150でないといけません)。"
#: platform/uwp/export/export.cpp
msgid "Invalid splash screen image dimensions (should be 620x300)."
msgstr ""
-"無効なスプラッシュスクリーンイメージ(縦横620x300でないといけません)。"
+"スプラッシュスクリーンの画像サイズが無効です(縦横620x300でないといけません)。"
#: scene/2d/animated_sprite.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
-"SpriteFrames リソースを作成または AnimatedSprite フレームを表示するためには "
-"'Frames' プロパティに設定する必要があります。"
+"AnimatedSpriteでフレームを表示するには、\"Frames\"プロパティでSpriteFramesリ"
+"ソースを作成または設定する必要があります。"
#: scene/2d/canvas_modulate.cpp
msgid ""
@@ -12059,10 +12243,9 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionPolygon2D は、CollisionObject2D 派生ノードに衝突シェイプを提供するた"
-"めにのみ機能します。2Dの形状(シェイプ)を付与するためには Area2D、"
-"StaticBody2D、RigidBody2D、KinematicBody2D などの子オブジェクトとして利用して"
-"ください。"
+"CollisionPolygon2Dは、CollisionObject2D派生ノードにコリジョンシェイプを提供す"
+"るためにのみ機能します。シェイプを追加する場合は、Area2D、StaticBody2D、"
+"RigidBody2D、KinematicBody2Dなどの子として使用してください。"
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
@@ -12074,17 +12257,25 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D は、CollisionObject2D派生ノードに衝突シェイプを提供する場合"
-"にのみ機能します。Area2D、staticBody2D、RigidBody2D、KinematicBody2Dなどの子"
-"として使用してください。"
+"CollisionShape2Dは、CollisionObject2D派生ノードにコリジョンシェイプを提供する"
+"場合にのみ機能します。シェイプを追加する場合は、Area2D、staticBody2D、"
+"RigidBody2D、KinematicBody2Dなどの子として使用してください。"
#: scene/2d/collision_shape_2d.cpp
msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
-"関数に対して CollisionShape2D の形状(シェイプ)を指定する必要があります。そ"
-"のためのシェイプリソースを作成してください!"
+"関数に対して CollisionShape2D の形状(シェイプ)を指定する必要があります。その"
+"ためのシェイプリソースを作成してください!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"ポリゴンベースのシェイプは、CollisionShape2Dノードで使用したり直接編集したり"
+"するには適しません。代わりにCollisionPolygon2Dノードを使用してください。"
#: scene/2d/cpu_particles_2d.cpp
msgid ""
@@ -12095,11 +12286,11 @@ msgstr ""
"CanvasItemMaterialを使用する必要があります。"
#: scene/2d/light_2d.cpp
-#, fuzzy
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
-msgstr "光の形状とテクスチャは、'texture'プロパティに指定します。"
+msgstr ""
+"光の形状を持つテクスチャは\"Texture\"プロパティに指定する必要があります。"
#: scene/2d/light_occluder_2d.cpp
msgid ""
@@ -12142,8 +12333,8 @@ msgid ""
"CPUParticles\" option for this purpose."
msgstr ""
"GPUベースのパーティクルは、GLES2ビデオドライバではサポートされていません。\n"
-"代わりにCPUParticles2Dノードを使用してください。 この目的のために \"Convert "
-"to CPUParticles\" オプションを使用することができます。"
+"代わりにCPUParticles2Dノードを使用してください。この目的のために \"CPUパー"
+"ティクルに変換\" オプションを使用できます。"
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
@@ -12172,9 +12363,9 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"RigidBody2D(キャラクタモードまたはリジッドモード)に対するサイズ変更は、実行時"
-"に物理エンジンによってオーバーライドされます。\n"
-"代わりに、子の衝突シェイプのサイズを変更してください。"
+"RigidBody2D (CharacterモードまたはRigidモード) に対するサイズ変更は、実行時に"
+"物理エンジンによって上書きされます。\n"
+"代わりに、子のコリジョン シェイプのサイズを変更してください。"
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
@@ -12234,7 +12425,7 @@ msgstr ""
#: scene/3d/arvr_nodes.cpp
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ARVRAnchorはARVROriginを親に持つ必要があります。"
+msgstr "ARVRAnchorはARVROriginノードを親に持つ必要があります。"
#: scene/3d/arvr_nodes.cpp
msgid ""
@@ -12246,7 +12437,7 @@ msgstr ""
#: scene/3d/arvr_nodes.cpp
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROriginはARVRCamera子ノードが必要です。"
+msgstr "ARVROriginは子ノードにARVRCameraが必要です。"
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
@@ -12289,9 +12480,9 @@ msgid ""
"CollisionObject derived node. Please only use it as a child of Area, "
"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
-"CollisionPolygonは、CollisionObject派生ノードに衝突シェイプを提供する場合にの"
-"み機能します。Area、StaticBody、RigidBody、KinematicBodyなどの子として使用し"
-"てください。"
+"CollisionPolygonは、CollisionObject派生ノードにコリジョンシェイプを提供する場"
+"合にのみ機能します。シェイプを追加する場合は、Area、StaticBody、RigidBody、"
+"KinematicBodyなどの子として使用してください。"
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
@@ -12303,9 +12494,9 @@ msgid ""
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
"KinematicBody, etc. to give them a shape."
msgstr ""
-"CollisionShapeは、CollisionObject派生ノードに衝突シェイプを提供する場合にのみ"
-"機能します。Area、StaticBody、RigidBody、KinematicBodyなどの子として使用して"
-"ください。"
+"CollisionShapeは、CollisionObject派生ノードにコリジョンシェイプを提供する場合"
+"にのみ機能します。シェイプを追加する場合は、Area、StaticBody、RigidBody、"
+"KinematicBodyなどの子として使用してください。"
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12323,6 +12514,13 @@ msgstr ""
"平面シェイプはうまく機能せず、将来のバージョンでは削除される予定です。使わな"
"いでください。"
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape は、Static 以外のモードの RigidBody をサポートしていませ"
+"ん。"
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "メッシュが割り当てられていないため、何も表示されません。"
@@ -12347,6 +12545,11 @@ msgstr ""
"GIProbesはGLES2ビデオドライバではサポートされていません。\n"
"代わりにBakedLightmapを使用してください。"
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr "90度を超える角度のスポットライトは、シャドウを投影できません。"
@@ -12372,8 +12575,8 @@ msgid ""
"\" option for this purpose."
msgstr ""
"GPUベースのパーティクルは、GLES2ビデオドライバではサポートされていません。\n"
-"代わりにCPUParticlesノードを使用してください。 この目的のために \"Convert to "
-"CPUParticles\"オプションを使用することができます。"
+"代わりにCPUParticlesノードを使用してください。この目的のために \"CPUパーティ"
+"クルに変換\" オプションを使用できます。"
#: scene/3d/particles.cpp
msgid ""
@@ -12393,13 +12596,12 @@ msgid "PathFollow only works when set as a child of a Path node."
msgstr "PathFollow は、Path ノードの子として設定されている場合のみ動作します。"
#: scene/3d/path.cpp
-#, fuzzy
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
-"PathFollow ROTATION_ORIENTEDでは、親パスのCurveリソースで \"Up Vector\"を有効"
-"にする必要があります。"
+"PathFollowのROTATION_ORIENTEDでは、親のPathのCurveリソースで\"Up Vector\"を有"
+"効にする必要があります。"
#: scene/3d/physics_body.cpp
msgid ""
@@ -12412,13 +12614,12 @@ msgstr ""
"代わりに、子の衝突シェイプのサイズを変更してください。"
#: scene/3d/remote_transform.cpp
-#, fuzzy
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
-"Path プロパティは、動作するように有効な Particles2D ノードを示す必要がありま"
-"す。"
+"\"Remote Path\"プロパティは、有効なSpatialまたはSpatialから派生したノードを指"
+"す必要があります。"
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
@@ -12491,7 +12692,7 @@ msgstr "無効なアニメーション: '%s'。"
#: scene/animation/animation_tree.cpp
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "ノード '%s'の入力 '%s'に接続されているものがありません。"
+msgstr "入力 '%s'(ノード '%s')に接続されているものはありません。"
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
@@ -12526,9 +12727,8 @@ msgstr ""
"右マウスボタン: プリセットの除去"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Pick a color from the editor window."
-msgstr "スクリーンから色を選択してください。"
+msgstr "エディタウィンドウから色を選択。"
#: scene/gui/color_picker.cpp
msgid "HSV"
@@ -12536,7 +12736,7 @@ msgstr "HSV"
#: scene/gui/color_picker.cpp
msgid "Raw"
-msgstr "ロー"
+msgstr "Raw"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
@@ -12589,15 +12789,14 @@ msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
msgstr "「Exp Edit」がtrueの場合、「Min Value」は0より大きい必要があります。"
#: scene/gui/scroll_container.cpp
-#, fuzzy
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
-"ScrollContainerは単一の子コントロールで動作するように意図されています。コンテ"
-"ナ(VBox, HBoxなど)を子として使用するか、コントロールを使用してカスタム最小サ"
-"イズを手動で設定してください。"
+"ScrollContainer は子コントロールひとつのみで動作するようになっています。\n"
+"コンテナ (VBox, HBoxなど) を子とするか、コントロールをカスタム最小サイズを手"
+"動設定して使用してください。"
#: scene/gui/tree.cpp
msgid "(Other)"
@@ -12608,21 +12807,24 @@ msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"プロジェクト設定で指定されている既定の環境 (レンダリング -> 環境 -> 既定の環"
-"境) を読み込めませんでした。"
+"プロジェクト設定で指定されている既定の環境 (Rendering -> Environment -> "
+"Default Environment) を読み込めませんでした。"
#: scene/main/viewport.cpp
-#, fuzzy
msgid ""
"This viewport is not set as render target. If you intend for it to display "
"its contents directly to the screen, make it a child of a Control so it can "
"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
"texture to some node for display."
msgstr ""
-"このビューポートは、レンダー ターゲットとして設定されていません。その内容を画"
-"面に直接表示する場合は、サイズを得ることができるように、コントロールの子をつ"
-"くります。それ以外の場合、レンダー ターゲットし、その内部のテクスチャ表示のい"
-"くつかのノードに割り当てます。"
+"このビューポートはレンダー ターゲットとして設定されていません。コンテンツを画"
+"面に直接表示する場合は、サイズを取得できるようにコントロールの子にします。そ"
+"れ以外の場合は、RenderTarget にして、その内部テクスチャを表示するノードに割り"
+"当てます。"
+
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "レンダーするにはビューポートのサイズが 0 より大きい必要があります。"
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
@@ -12645,14 +12847,60 @@ msgid "Assignment to uniform."
msgstr "uniform への割り当て。"
#: servers/visual/shader_language.cpp
-#, fuzzy
msgid "Varyings can only be assigned in vertex function."
-msgstr "Varyingは頂点関数にのみ割り当てることができます。"
+msgstr "Varying変数は頂点関数にのみ割り当てることができます。"
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
msgstr "定数は変更できません。"
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "ファイルシステムとインポートドック"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "エクスポートまたはデプロイを行う場合、生成された実行ファイルはデバッグのた"
+#~ "めに、このコンピューターのIPに接続を試みます。"
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "現在のシーンは保存されませんでした。実行する前に保存してください。"
+
+#~ msgid "Not in resource path."
+#~ msgstr "リソースパスにありません。"
+
+#~ msgid "Revert"
+#~ msgstr "元に戻す"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "この操作は取り消せません。それでも元に戻しますか?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "シーンを元に戻す"
+
+#~ msgid "Clear Script"
+#~ msgstr "スクリプトをクリア"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "課題管理システム"
+
+#~ msgid "Request Docs"
+#~ msgstr "ドキュメントを要求"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr ""
+#~ "フィードバックを提供して、Godotのドキュメントの改善に役立ててください。"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d 箇所を置換しました。"
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "静的凸状ボディを生成"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "図形の作成に失敗しました!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/ka.po b/editor/translations/ka.po
index 4808e9177b..a59a42333f 100644
--- a/editor/translations/ka.po
+++ b/editor/translations/ka.po
@@ -552,6 +552,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -717,8 +718,9 @@ msgid "Line Number:"
msgstr "ხაზის ნომერი:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "შეცვლილია %d დამთხვევები."
+#, fuzzy
+msgid "%d replaced."
+msgstr "ჩანაცვლება"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -737,7 +739,7 @@ msgstr "საქმის დამთხვევა"
msgid "Whole Words"
msgstr "მთლიანი სიტყვები"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "ჩანაცვლება"
@@ -789,6 +791,11 @@ msgstr "სამიზნე კვანძში მეთოდი უნდ
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "სამიზნე კვანძში მეთოდი უნდა იყოს განსაზღვრული!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -875,7 +882,6 @@ msgstr "დამაკავშირებელი სიგნალი:"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -936,6 +942,11 @@ msgid "Signals"
msgstr "სიგნალები"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "დამაკავშირებელი სიგნალი:"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -974,7 +985,7 @@ msgid "Recent:"
msgstr "ბოლო:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "ძებნა:"
@@ -1159,6 +1170,9 @@ msgstr "პროექტის დამფუძნებლები"
msgid "Lead Developer"
msgstr "მთავარი დეველოპერი"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "პროექტის მენეჯერი. "
@@ -1180,6 +1194,16 @@ msgid "Gold Sponsors"
msgstr "ოქროს სპონსორები"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "ვერცხლის დონატორები"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "ბრინჯაოს დონატორები"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "მინი სპონსორები"
@@ -1494,7 +1518,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1502,17 +1526,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "არასწორი ფონტის ზომა."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1540,6 +1555,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1661,15 +1680,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1827,7 +1846,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1944,7 +1963,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2365,10 +2384,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2454,11 +2469,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "გახსნილი"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2729,10 +2747,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2794,22 +2808,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2818,8 +2836,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2828,32 +2846,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2914,7 +2932,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2928,7 +2946,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3314,7 +3336,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3341,6 +3364,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3945,19 +3972,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3974,7 +4005,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4008,10 +4039,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -5089,7 +5116,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5846,11 +5873,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5862,12 +5889,29 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "ახალი %s შექმნა"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Multiple Convex Shapes"
msgstr "ახალი %s შექმნა"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5919,19 +5963,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "შექმნა"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "შექმნა"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6781,14 +6863,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6854,15 +6928,15 @@ msgid ""
msgstr "'%s' და '%s' შორის კავშირის გაწყვეტა"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "ხაზი:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "ფუნქციის შექმნა"
@@ -7232,6 +7306,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7321,17 +7399,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7679,7 +7766,7 @@ msgid "New Animation"
msgstr "ანიმაციის ოპტიმიზაცია"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8369,7 +8456,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9483,11 +9570,17 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "შეცდომა პაკეტის გახსნისას, უნდა იყოს zip ფორმატში."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9495,11 +9588,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9714,6 +9807,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9762,6 +9856,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10143,11 +10244,20 @@ msgid "Batch Rename"
msgstr "საქმის დამთხვევა"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "ჩანაცვლება"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10185,11 +10295,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10216,10 +10326,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10228,11 +10334,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10252,6 +10358,14 @@ msgstr ""
msgid "Reset"
msgstr "ზუმის საწყისზე დაყენება"
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10315,8 +10429,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "დამოკიდებულებების შემსწორებელი"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10352,6 +10467,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "წაშლა"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "წაშლა"
@@ -10477,6 +10597,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10526,11 +10653,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10655,6 +10782,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "არასწორი ფონტის ზომა."
@@ -10697,6 +10828,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "არასწორი ფონტის ზომა."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "არასწორი ფონტის ზომა."
@@ -10705,7 +10841,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10730,6 +10866,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10804,6 +10946,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "შექმნა"
@@ -10853,7 +10999,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11740,6 +11886,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11764,6 +11914,32 @@ msgstr "არასწორი ფონტის ზომა."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11947,6 +12123,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12134,6 +12316,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12154,6 +12341,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12377,6 +12569,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12408,6 +12604,9 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "შეცვლილია %d დამთხვევები."
+
#, fuzzy
#~ msgid "Brief Description"
#~ msgstr "აღწერა:"
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
index ae7e1edf52..d39f172539 100644
--- a/editor/translations/ko.po
+++ b/editor/translations/ko.po
@@ -11,16 +11,20 @@
# 박한얼 (volzhs) <volzhs@gmail.com>, 2016-2018.
# 송태섭 <xotjq237@gmail.com>, 2018, 2019, 2020.
# JY <yimjisoo@mailfence.com>, 2018.
-# Ch. <ccwpc@hanmail.net>, 2018.
+# Ch. <ccwpc@hanmail.net>, 2018, 2020.
# moolow <copyhyeon@gmail.com>, 2019.
# Jiyoon Kim <kimjiy@dickinson.edu>, 2019.
# Ervin <zetsmart@gmail.com>, 2019.
+# Tilto_ <tilto0822@develable.xyz>, 2020.
+# Myeongjin Lee <aranet100@gmail.com>, 2020.
+# Doyun Kwon <caen4516@gmail.com>, 2020.
+# Jun Hyung Shin <shmishmi79@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
-"Last-Translator: 송태섭 <xotjq237@gmail.com>\n"
+"PO-Revision-Date: 2020-09-16 18:09+0000\n"
+"Last-Translator: Ch. <ccwpc@hanmail.net>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
"godot/ko/>\n"
"Language: ko\n"
@@ -28,46 +32,47 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "convert() 메서드의 인수 유형이 잘못됐어요. TYPE_* 상수를 사용하세요."
+msgstr ""
+"convert() 메서드의 인수 유형이 올바르지 않습니다. TYPE_* 상수를 사용하세요."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "길이가 1인 문자열 (문자)이 필요해요."
+msgstr "길이가 1인 문자열(단일 문자)이 필요합니다."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "디코딩할 바이트가 모자라거나 잘못된 형식이에요."
+msgstr "디코딩할 바이트가 모자라거나 잘못된 형식입니다."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "표현식에서 입력 %i이(가) 잘못됐어요 (전달되지 않음)"
+msgstr "표현식의 입력 %i (전달되지 않음) 이(가) 올바르지 않습니다"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "인스턴스가 비어있어서 Self를 사용할 수 없어요 (전달되지 않음)"
+msgstr "인스턴스가 null (전달되지 않음) 이므로 self 를 사용할 수 없습니다"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "연산자 %s와(과) %s, %s의 연산 대상이 잘못됐어요."
+msgstr "연산자 %s, %s, %s의 피연산자가 올바르지 않습니다."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "기본 유형이 %s인 %s 유형의 인덱스가 잘못됐어요"
+msgstr "자료형 %s 의 인덱스가 기본형 %s 기준으로 올바르지 않습니다"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr "기본 유형이 %s인 '%s' 인덱스의 이름이 잘못됐어요"
+msgstr "인덱스 이름 '%s' 이 기본형 %s 기준으로 올바르지 않습니다"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "이 인수로는 '%s'을(를) 구성할 수 없어요"
+msgstr "'%s' 를 생성하기 위한 인수가 올바르지 않습니다"
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -123,31 +128,31 @@ msgstr "값:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "여기에 키를 삽입하기"
+msgstr "여기에 키 삽입"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "선택한 키를 복제하기"
+msgstr "선택한 키 복제"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "선택한 키를 삭제하기"
+msgstr "선택한 키 삭제"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr "베지어 점 추가하기"
+msgstr "베지어 점 추가"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr "베지어 점 이동하기"
+msgstr "베지어 점 이동"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "애니메이션 키 복제하기"
+msgstr "애니메이션 키 복제"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "애니메이션 키 삭제하기"
+msgstr "애니메이션 키 삭제"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
@@ -196,7 +201,7 @@ msgstr "애니메이션 길이 바꾸기"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr "애니메이션 루프 변경하기"
+msgstr "애니메이션 루프 변경"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -232,11 +237,11 @@ msgstr "애니메이션 길이 (초)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
-msgstr "트랙 추가하기"
+msgstr "트랙 추가"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr "애니메이션 반복하기"
+msgstr "애니메이션 반복"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -257,11 +262,11 @@ msgstr "트랙 경로 바꾸기"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "이 트랙을 켜거나 꺼요."
+msgstr "이 트랙을 켬/꺼짐 여부를 전환합니다."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr "업데이트 모드 (이 속성을 설정하는 방법)"
+msgstr "업데이트 모드 (이 속성이 설정되는 방법)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
@@ -269,11 +274,11 @@ msgstr "보간 모드"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr "루프 마무리 모드 (시작 루프와 끝을 보간)"
+msgstr "루프 래핑 모드 (시작 루프와 끝을 보간)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
-msgstr "이 트랙을 삭제할게요."
+msgstr "이 트랙을 삭제합니다."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
@@ -314,24 +319,24 @@ msgstr "입방형"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr "루프 보간 고정하기"
+msgstr "루프 보간 고정"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr "루프 보간 마무리하기"
+msgstr "루프 보간 래핑"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "키 삽입하기"
+msgstr "키 삽입"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
-msgstr "키 복제하기"
+msgstr "키 복제"
#: editor/animation_track_editor.cpp
msgid "Delete Key(s)"
-msgstr "키 삭제하기"
+msgstr "키 삭제"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
@@ -347,7 +352,7 @@ msgstr "애니메이션 루프 모드 바꾸기"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr "애니메이션 트랙 삭제하기"
+msgstr "애니메이션 트랙 삭제"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
@@ -371,25 +376,25 @@ msgstr "만들기"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr "애니메이션 삽입하기"
+msgstr "애니메이션 삽입"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
-"AnimationPlayer는 자신에게 애니메이션을 줄 수 없어요. 다른 AnimationPlayer만 "
-"애니메이션을 줄 수 있죠."
+"AnimationPlayer는 자신이 아닌 다른 플레이어에만 애니메이션을 부여할 수 있습니"
+"다."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "애니메이션 만들기 & 삽입하기"
+msgstr "애니메이션 만들기 & 삽입"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "애니메이션 트랙 & 키 삽입하기"
+msgstr "애니메이션 트랙 & 키 삽입"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr "애니메이션 키 삽입하기"
+msgstr "애니메이션 키 삽입"
#: editor/animation_track_editor.cpp
msgid "Change Animation Step"
@@ -397,11 +402,11 @@ msgstr "애니메이션 단계 바꾸기"
#: editor/animation_track_editor.cpp
msgid "Rearrange Tracks"
-msgstr "트랙 다시 정렬하기"
+msgstr "트랙 다시 정렬"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr "변형 트랙은 오직 Spatial 기반 노드에만 적용돼요."
+msgstr "변형 트랙은 오직 Spatial 기반 노드에만 해당됩니다."
#: editor/animation_track_editor.cpp
msgid ""
@@ -410,20 +415,20 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
-"오디오 트랙은 오직 다음 유형의 노드만 가리켜요:\n"
+"오디오 트랙은 다음 형식의 노드만 가리킬 수 있습니다.\n"
"-AudioStreamPlayer\n"
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr "애니메이션 트랙은 오직 AnimationPlayer 노드만 가리킬 수 있어요."
+msgstr "애니메이션 트랙은 오직 AnimationPlayer 노드만 가리킬 수 있습니다."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
-"AnimationPlayer는 자신에게 애니메이션을 줄 수 없어요. 다른 AnimationPlayer만 "
-"애니메이션을 줄 수 있죠."
+"애니메이션 플레이어는 자신이 아닌 다른 플레이어에만 애니메이션을 부여할 수 있"
+"습니다."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
@@ -431,35 +436,35 @@ msgstr "루트 없이 새 트랙을 추가할 수 없음"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr "베지어에 잘못된 트랙 (적당한 하위 속성이 없음)"
+msgstr "베지어에 알맞지 않은 트랙 (적당한 하위 속성이 없음)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
-msgstr "베지어 트랙 추가하기"
+msgstr "베지어 트랙 추가"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr "트랙 경로가 잘못됐어요. 키를 추가할 수 없어요."
+msgstr "트랙 경로가 올바르지 않아 키를 추가할 수 없습니다."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr "트랙이 Spatial 유형이 아니에요. 키를 삽입할 수 없어요"
+msgstr "트랙이 Spatial 형식이 아니어서 키를 추가할 수 없습니다"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
-msgstr "변형 트랙 키 추가하기"
+msgstr "변형 트랙 키 추가"
#: editor/animation_track_editor.cpp
msgid "Add Track Key"
-msgstr "트랙 키 추가하기"
+msgstr "트랙 키 추가"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr "트랙 경로가 잘못됐어요. 메서드 키를 추가할 수 없어요."
+msgstr "트랙 경로가 올바르지 않아 메서드 키를 추가할 수 없습니다."
#: editor/animation_track_editor.cpp
msgid "Add Method Track Key"
-msgstr "메서드 트랙 키 추가하기"
+msgstr "메서드 트랙 키 추가"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
@@ -467,7 +472,7 @@ msgstr "객체에 메서드가 없음: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "애니메이션 키 이동하기"
+msgstr "애니메이션 키 이동"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
@@ -479,12 +484,13 @@ msgstr "트랙 붙여 넣기"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr "애니메이션 키 크기 조절하기"
+msgstr "애니메이션 키 크기 조절"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr "이 설정은 단일 트랙에만 해당되어서, 베지어 편집에 작동하지 않아요."
+msgstr ""
+"이 설정은 단일 트랙에만 적용 가능하므로 베지어 편집에 사용할 수 없습니다."
#: editor/animation_track_editor.cpp
msgid ""
@@ -498,13 +504,13 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
-"이 애니메이션은 가져온 씬에 속해 있어요. 가져온 트랙의 변경 사항은 저장되지 "
-"않아요.\n"
+"이 애니메이션은 가져온 씬에 속해 있습니다. 가져온 트랙의 변경 사항은 저장되"
+"지 않습니다.\n"
"\n"
"저장 기능을 켜려면 맞춤 트랙을 추가하고, 씬의 가져오기 설정으로 가서\n"
"\"Animation > Storage\" 설정을 \"Files\"로, \"Animation > Keep Custom Tracks"
-"\" 설정을 켠 뒤, 다시 가져오세요.\n"
-"아니면 가져오기 프리셋으로 애니메이션을 별도의 파일로 가져올 수도 있어요."
+"\" 설정을 켠 뒤, 다시 가져오십시오.\n"
+"아니면 가져오기 프리셋으로 애니메이션을 별도의 파일로 가져올 수도 있습니다."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
@@ -516,11 +522,11 @@ msgstr "애니메이션을 만들고 편집하려면 AnimationPlayer노드를
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr "오직 트리에서 선택한 노드만 트랙에 표시돼요."
+msgstr "트리에서 선택한 노드만 트랙에 표시됩니다."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr "노드 별로 트랙을 묶어서 보거나, 묶지 않고 나열해서 볼 수 있어요."
+msgstr "노드 별로 트랙을 묶어서 보거나, 묶지 않고 나열해서 볼 수 있습니다."
#: editor/animation_track_editor.cpp
msgid "Snap:"
@@ -535,6 +541,7 @@ msgid "Seconds"
msgstr "초"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "초당 프레임"
@@ -546,7 +553,7 @@ msgstr "초당 프레임"
#: editor/project_settings_editor.cpp editor/property_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit"
-msgstr "편집하기"
+msgstr "편집"
#: editor/animation_track_editor.cpp
msgid "Animation properties."
@@ -554,43 +561,43 @@ msgstr "애니메이션 속성."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr "트랙 복사하기"
+msgstr "트랙 복사"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
-msgstr "선택 항목 규모 조절하기"
+msgstr "선택 항목 배율 조절"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
-msgstr "커서 위치에서 규모 조절하기"
+msgstr "커서 위치에서 배율 조절"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "선택 항목 복제하기"
+msgstr "선택 항목 복제"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "선택된 트랙에 복제하기"
+msgstr "선택된 트랙에 복제"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
-msgstr "선택 항목 삭제하기"
+msgstr "선택 항목 삭제"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
-msgstr "다음 단계로 이동하기"
+msgstr "다음 단계로 이동"
#: editor/animation_track_editor.cpp
msgid "Go to Previous Step"
-msgstr "이전 단계로 이동하기"
+msgstr "이전 단계로 이동"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr "애니메이션 최적화하기"
+msgstr "애니메이션 최적화"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr "애니메이션 정리하기"
+msgstr "애니메이션 정리"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
@@ -598,19 +605,19 @@ msgstr "애니메이션을 줄 노드를 선택하세요:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr "베지어 곡선 사용하기"
+msgstr "베지어 곡선 사용"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr "애니메이션. 최적화"
+msgstr "애니메이션 최적화"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr "최대. 선형 오류:"
+msgstr "최대 선형 오류:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr "최대. 각도 오류:"
+msgstr "최대 각도 오류:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
@@ -618,35 +625,35 @@ msgstr "최적화 가능한 최대 각도:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
-msgstr "최적화하기"
+msgstr "최적화"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr "잘못된 키 삭제하기"
+msgstr "잘못된 키 삭제"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr "해결되지 않고 빈 트랙 삭제하기"
+msgstr "해결되지 않고 빈 트랙 삭제"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
-msgstr "모든 애니메이션 정리하기"
+msgstr "모든 애니메이션 정리"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr "애니메이션 정리하기 (되돌릴 수 없어요!)"
+msgstr "애니메이션 정리 (되돌릴 수 없습니다!)"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
-msgstr "정리하기"
+msgstr "정리"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr "규모 비율:"
+msgstr "배율값:"
#: editor/animation_track_editor.cpp
msgid "Select Tracks to Copy"
-msgstr "복사할 트랙을 선택하기"
+msgstr "복사할 트랙 선택"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -655,15 +662,15 @@ msgstr "복사할 트랙을 선택하기"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr "복사하기"
+msgstr "복사"
#: editor/animation_track_editor.cpp
msgid "Select All/None"
-msgstr "모두 선택하기/선택하지 않기"
+msgstr "모두 선택/해제"
#: editor/animation_track_editor_plugins.cpp
msgid "Add Audio Track Clip"
-msgstr "오디오 트랙 클립 추가하기"
+msgstr "오디오 트랙 클립 추가"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -687,23 +694,23 @@ msgstr "배열 값 바꾸기"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "행으로 이동하기"
+msgstr "행으로 이동"
#: editor/code_editor.cpp
msgid "Line Number:"
msgstr "행 번호:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d개의 단어를 교체했어요."
+msgid "%d replaced."
+msgstr "%d개가 바뀌었습니다."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr "%d개가 일치해요."
+msgstr "%d개 일치."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d matches."
-msgstr "%d개가 일치해요."
+msgstr "%d개 일치."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -711,19 +718,19 @@ msgstr "대소문자 구분"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr "전체 단어"
+msgstr "단어 단위로"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr "교체하기"
+msgstr "바꾸기"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr "모두 교체하기"
+msgstr "모두 바꾸기"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr "선택 항목만"
+msgstr "선택 영역만"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
@@ -738,17 +745,17 @@ msgstr "스크립트 패널 토글"
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "확대하기"
+msgstr "확대"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "축소하기"
+msgstr "축소"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "확대 비율 원래대로"
+msgstr "확대/축소 다시 설정"
#: editor/code_editor.cpp
msgid "Warnings"
@@ -760,23 +767,27 @@ msgstr "행 및 열 번호."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr "대상 노드에서 메서드를 지정해야 해요."
+msgstr "대상 노드에 있는 메서드는 반드시 지정해야 합니다."
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "메서드 이름은 올바른 식별자여야 합니다."
#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
-"대상 메서드를 찾을 수 없어요. 올바른 메서드를 지정하거나 대상 노드에 스크립트"
-"를 붙여보세요."
+"대상 메서드를 찾을 수 없습니다. 올바른 메서드를 지정하거나 대상 노드에 스크립"
+"트를 붙여보세요."
#: editor/connections_dialog.cpp
msgid "Connect to Node:"
-msgstr "이 노드에 연결됨:"
+msgstr "이 노드에 연결:"
#: editor/connections_dialog.cpp
msgid "Connect to Script:"
-msgstr "이 스크립트에 연결됨:"
+msgstr "이 스크립트에 연결:"
#: editor/connections_dialog.cpp
msgid "From Signal:"
@@ -784,13 +795,13 @@ msgstr "이 시그널에서:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr "씬이 어떤 스크립트도 갖고 있지 않아요."
+msgstr "씬에 스크립트가 없습니다."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr "추가하기"
+msgstr "추가"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
@@ -801,11 +812,11 @@ msgstr "추가하기"
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr "삭제하기"
+msgstr "삭제"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "별도의 호출 인수 추가하기:"
+msgstr "별도의 호출 인수 추가:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
@@ -827,7 +838,8 @@ msgstr "지연"
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
msgstr ""
-"시그널을 지연하면, 시그널은 큐에 저장되기 때문에 대기 시간에만 방출해요."
+"시그널을 지연합니다. 지연된 시그널은 큐에 보관되었다가 대기 상태가 되면 발생"
+"됩니다."
#: editor/connections_dialog.cpp
msgid "Oneshot"
@@ -835,7 +847,7 @@ msgstr "1회"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr "처음 방출하면 시그널 연결을 풀어버려요."
+msgstr "시그널이 처음 발생된 이후 시그널의 연결을 끊습니다."
#: editor/connections_dialog.cpp
msgid "Cannot connect signal"
@@ -845,7 +857,6 @@ msgstr "시그널을 연결할 수 없음"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -866,32 +877,32 @@ msgstr "시그널:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr "'%s'을(를) '%s'에 연결하기"
+msgstr "'%s'을(를) '%s'에 연결"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr "'%s'을(를) '%s'에서 연결 풀기"
+msgstr "'%s'을(를) '%s'에서 연결 끊기"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr "모두 시그널에서 연결 풀기: '%s'"
+msgstr "모두 시그널에서 연결 끊기: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
-msgstr "연결하기..."
+msgstr "연결..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr "연결 풀기"
+msgstr "연결 끊기"
#: editor/connections_dialog.cpp
msgid "Connect a Signal to a Method"
-msgstr "시그널을 메서드에 연결하기"
+msgstr "시그널을 메서드에 연결"
#: editor/connections_dialog.cpp
msgid "Edit Connection:"
-msgstr "연결 편집하기:"
+msgstr "연결 변경:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
@@ -899,7 +910,12 @@ msgstr "\"%s\" 시그널의 모든 연결을 삭제할까요?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr "시그널(Signal)"
+msgstr "시그널"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "타일 필터"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
@@ -907,19 +923,19 @@ msgstr "이 시그널의 모든 연결을 삭제할까요?"
#: editor/connections_dialog.cpp
msgid "Disconnect All"
-msgstr "모두 연결 풀기"
+msgstr "연결 모두 끊기"
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr "편집하기..."
+msgstr "편집..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
-msgstr "메서드로 이동하기"
+msgstr "메서드로 이동"
#: editor/create_dialog.cpp
msgid "Change %s Type"
-msgstr "%s(으)로 유형 바꾸기"
+msgstr "%s 유형 바꾸기"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
msgid "Change"
@@ -939,10 +955,10 @@ msgid "Recent:"
msgstr "최근 기록:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
-msgstr "검색하기:"
+msgstr "검색:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
@@ -960,7 +976,7 @@ msgstr "설명:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
-msgstr "교체할 대상 찾기:"
+msgstr "바꿀 대상 찾기:"
#: editor/dependency_editor.cpp
msgid "Dependencies For:"
@@ -971,16 +987,16 @@ msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"씬 '%s'을(를) 편집하고 있어요.\n"
-"다시 불러와야 변경 사항이 적용돼요."
+"씬 '%s'이(가) 현재 편집중입니다.\n"
+"변경 사항은 다시 불러온 뒤에 반영됩니다."
#: editor/dependency_editor.cpp
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"리소스 '%s'을(를) 사용하고 있어요.\n"
-"다시 불러와야 변경 사항이 적용돼요."
+"리소스 '%s'이(가) 현재 사용중입니다.\n"
+"변경 사항은 다시 불러온 뒤에 반영됩니다."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -994,7 +1010,7 @@ msgstr "리소스"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
#: editor/project_manager.cpp editor/project_settings_editor.cpp
msgid "Path"
-msgstr "Path(경로)"
+msgstr "경로"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
@@ -1010,7 +1026,7 @@ msgstr "종속 관계 편집기"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
-msgstr "대체 리소스 검색하기:"
+msgstr "대체 리소스 검색:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
#: editor/editor_help_search.cpp editor/editor_node.cpp
@@ -1028,7 +1044,7 @@ msgstr "소유자:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "프로젝트에서 선택한 파일을 삭제할까요? (되돌릴 수 없어요)"
+msgstr "프로젝트에서 선택한 파일을 삭제할까요? (되돌릴 수 없습니다)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1036,8 +1052,8 @@ msgid ""
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
-"삭제하려는 파일은 작업을 위해 다른 리소스에서 필요한 파일이에요.\n"
-"무시하고 삭제할 건가요? (되돌릴 수 없어요)"
+"삭제하려는 파일은 다른 리소스가 동작하기 위해 필요한 파일입니다.\n"
+"무시하고 삭제할까요? (되돌릴 수 없습니다)"
#: editor/dependency_editor.cpp
msgid "Cannot remove:"
@@ -1045,7 +1061,7 @@ msgstr "삭제할 수 없음:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
-msgstr "불러오는 중 오류:"
+msgstr "불러오기 오류:"
#: editor/dependency_editor.cpp
msgid "Load failed due to missing dependencies:"
@@ -1057,7 +1073,7 @@ msgstr "무시하고 열기"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
-msgstr "어떤 작업을 할 건가요?"
+msgstr "어떤 작업을 하시겠습니까?"
#: editor/dependency_editor.cpp
msgid "Fix Dependencies"
@@ -1065,11 +1081,11 @@ msgstr "종속 관계 고치기"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
-msgstr "불러오는 중 오류!"
+msgstr "불러오기 오류!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "%d개의 항목을 영구적으로 삭제할까요? (되돌릴 수 없어요!)"
+msgstr "%d개의 항목을 영구적으로 삭제할까요? (되돌릴 수 없습니다!)"
#: editor/dependency_editor.cpp
msgid "Show Dependencies"
@@ -1085,7 +1101,7 @@ msgstr "미사용 리소스 탐색기"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr "삭제하기"
+msgstr "삭제"
#: editor/dependency_editor.cpp
msgid "Owns"
@@ -1097,15 +1113,15 @@ msgstr "명확한 소유 관계가 없는 리소스:"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Key"
-msgstr "디렉토리 키 변경하기"
+msgstr "딕셔너리 키 변경"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Value"
-msgstr "디렉토리 값 변경하기"
+msgstr "딕셔너리 값 변경"
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
-msgstr "Godot 커뮤니티의 감사의 말씀!"
+msgstr "Godot 커뮤니티에서 감사드립니다!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
@@ -1119,6 +1135,9 @@ msgstr "프로젝트 창립자"
msgid "Lead Developer"
msgstr "리드 개발자"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "프로젝트 매니저 "
@@ -1140,6 +1159,14 @@ msgid "Gold Sponsors"
msgstr "골드 스폰서"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "실버 스폰서"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "브론즈 스폰서"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "미니 스폰서"
@@ -1192,7 +1219,7 @@ msgstr "라이선스"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Error opening package file, not in ZIP format."
-msgstr "패키지 파일을 여는 중 오류. ZIP 형식이 아니에요."
+msgstr "패키지 파일을 여는 중 오류. ZIP 형식이 아닙니다."
#: editor/editor_asset_installer.cpp
msgid "%s (Already Exists)"
@@ -1212,7 +1239,7 @@ msgstr "외 %d 개의 파일."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
-msgstr "패키지를 성공적으로 설치했어요!"
+msgstr "패키지를 성공적으로 설치했습니다!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1225,7 +1252,7 @@ msgstr "패키지 내용:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
-msgstr "설치하기"
+msgstr "설치"
#: editor/editor_asset_installer.cpp
msgid "Package Installer"
@@ -1237,7 +1264,7 @@ msgstr "스피커"
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
-msgstr "효과 추가하기"
+msgstr "효과 추가"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
@@ -1261,23 +1288,23 @@ msgstr "오디오 버스 바이패스 효과 토글"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr "오디오 버스 전송 선택하기"
+msgstr "오디오 버스 전송 선택"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr "오디오 버스 효과 추가하기"
+msgstr "오디오 버스 효과 추가"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr "버스 효과 이동하기"
+msgstr "버스 효과 이동"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr "버스 효과 삭제하기"
+msgstr "버스 효과 삭제"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
-msgstr "드래그 & 드롭으로 다시 정렬해요."
+msgstr "드래그 & 드롭으로 다시 정렬합니다."
#: editor/editor_audio_buses.cpp
msgid "Solo"
@@ -1298,47 +1325,47 @@ msgstr "버스 설정"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr "복제하기"
+msgstr "복제"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
-msgstr "볼륨 리셋"
+msgstr "볼륨 초기화"
#: editor/editor_audio_buses.cpp
msgid "Delete Effect"
-msgstr "효과 삭제하기"
+msgstr "효과 삭제"
#: editor/editor_audio_buses.cpp
msgid "Audio"
-msgstr "오디오(Audio)"
+msgstr "오디오"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
-msgstr "오디오 버스 추가하기"
+msgstr "오디오 버스 추가"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr "마스터 버스는 삭제할 수 없어요!"
+msgstr "마스터 버스는 삭제할 수 없습니다!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr "오디오 버스 삭제하기"
+msgstr "오디오 버스 삭제"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
-msgstr "오디오 버스 복제하기"
+msgstr "오디오 버스 복제"
#: editor/editor_audio_buses.cpp
msgid "Reset Bus Volume"
-msgstr "버스 볼륨 리셋하기"
+msgstr "버스 볼륨 초기화"
#: editor/editor_audio_buses.cpp
msgid "Move Audio Bus"
-msgstr "오디오 버스 이동하기"
+msgstr "오디오 버스 이동"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
-msgstr "오디오 버스 레이아웃을 다른 이름으로 저장하기..."
+msgstr "오디오 버스 레이아웃을 다른 이름으로 저장..."
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
@@ -1350,7 +1377,7 @@ msgstr "오디오 버스 레이아웃 열기"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr "'%s' 파일이 없어요."
+msgstr "'%s' 파일이 없습니다."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -1358,7 +1385,7 @@ msgstr "레이아웃"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr "잘못된 파일. 오디오 버스 레이아웃이 아니에요."
+msgstr "잘못된 파일. 오디오 버스 레이아웃이 아닙니다."
#: editor/editor_audio_buses.cpp
msgid "Error saving file: %s"
@@ -1366,11 +1393,11 @@ msgstr "파일 저장 중 오류: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr "버스 추가하기"
+msgstr "버스 추가"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
-msgstr "이 레이아웃에 새 오디오 버스를 추가해요."
+msgstr "이 레이아웃에 새 오디오 버스를 추가합니다."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1380,15 +1407,15 @@ msgstr "불러오기"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr "존재하는 버스 레이아웃을 불러와요."
+msgstr "기존에 있던 버스 레이아웃을 불러옵니다."
#: editor/editor_audio_buses.cpp
msgid "Save As"
-msgstr "다른 이름으로 저장하기"
+msgstr "다른 이름으로 저장"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr "이 버스 레이아웃을 파일로 저장해요..."
+msgstr "이 버스 레이아웃을 파일로 저장합니다."
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
@@ -1396,15 +1423,15 @@ msgstr "기본값 불러오기"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr "기본 버스 레이아웃을 불러와요."
+msgstr "기본 버스 레이아웃을 불러옵니다."
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr "새로운 버스 레이아웃을 만들어요."
+msgstr "새로운 버스 레이아웃을 만듭니다."
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
-msgstr "잘못된 이름이에요."
+msgstr "올바르지 않은 이름입니다."
#: editor/editor_autoload_settings.cpp
msgid "Valid characters:"
@@ -1412,23 +1439,23 @@ msgstr "올바른 문자:"
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing engine class name."
-msgstr "엔진에 있는 클래스 이름과 같으면 안돼요."
+msgstr "엔진에 이미 있는 클래스 이름과 겹치지 않아야 합니다."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing built-in type name."
-msgstr "내장으로 있는 유형의 이름과 같으면 안돼요."
+msgstr "기본 자료형과 이름과 겹치지 않아야 합니다."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing global constant name."
-msgstr "전역으로 있는 상수 이름과 같으면 안돼요."
+msgstr "전역 상수와 이름이 겹치지 않아야 합니다."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr "키워드를 오토로드 이름으로 쓸 수 없어요."
+msgstr "키워드를 오토로드 이름으로 사용할 수 없습니다."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
-msgstr "오토로드 '%s'이(가) 이미 있어요!"
+msgstr "오토로드 '%s'이(가) 이미 있습니다!"
#: editor/editor_autoload_settings.cpp
msgid "Rename Autoload"
@@ -1436,39 +1463,31 @@ msgstr "오토로드 이름 바꾸기"
#: editor/editor_autoload_settings.cpp
msgid "Toggle AutoLoad Globals"
-msgstr "오토로드 전역 토글"
+msgstr "전역 오토로드 토글"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
-msgstr "오토로드 이동하기"
+msgstr "오토로드 이동"
#: editor/editor_autoload_settings.cpp
msgid "Remove Autoload"
-msgstr "오토로드 삭제하기"
+msgstr "오토로드 삭제"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "켜기"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
-msgstr "오토로드 다시 정렬하기"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "잘못된 경로이에요."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "파일이 없어요."
+msgstr "오토로드 다시 정렬"
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "리소스 경로가 아니에요."
+msgid "Can't add autoload:"
+msgstr "오토로드를 추가할 수 없음:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
-msgstr "오토로드 추가하기"
+msgstr "오토로드 추가"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp
@@ -1491,6 +1510,10 @@ msgstr "이름"
msgid "Singleton"
msgstr "싱글톤"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "매개변수 붙여넣기"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "씬 업데이트 중"
@@ -1535,30 +1558,30 @@ msgstr "이름:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr "폴더를 만들 수 없어요."
+msgstr "폴더를 만들 수 없습니다."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr "선택하기"
+msgstr "선택"
#: editor/editor_export.cpp
msgid "Storing File:"
-msgstr "파일 저장하기:"
+msgstr "저장하려는 파일:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr "예상 경로에서 내보낸 템플릿을 찾을 수 없어요:"
+msgstr "예상 경로에서 내보내기 템플릿을 찾을 수 없습니다:"
#: editor/editor_export.cpp
msgid "Packing"
-msgstr "포장하기"
+msgstr "묶는 중"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
-"대상 플랫폼에서는 GLES2 용 'ETC' 텍스처 압축이 필요해요. 프로젝트 설정에서 "
+"대상 플랫폼에서 GLES2 용 'ETC' 텍스처 압축이 필요합니다. 프로젝트 설정에서 "
"'Import Etc' 설정을 켜세요."
#: editor/editor_export.cpp
@@ -1566,7 +1589,7 @@ msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
-"대상 플랫폼에서는 GLES3 용 'ETC2' 텍스처 압축이 필요해요. 프로젝트 설정에서 "
+"대상 플랫폼에서 GLES3 용 'ETC2' 텍스처 압축이 필요합니다. 프로젝트 설정에서 "
"'Import Etc 2' 설정을 켜세요."
#: editor/editor_export.cpp
@@ -1576,29 +1599,30 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
-"대상 플랫폼은 드라이버가 GLES2로 폴백하기 위해 'ETC' 텍스처 압축이 필요해요. "
-"프로젝트 설정에서 'Import Etc' 설정을 켜거나, 'Driver Fallback Enabled' 설정"
-"을 끄세요."
+"대상 플랫폼에서 드라이버가 GLES2로 폴백하기 위해 'ETC' 텍스처 압축이 필요합니"
+"다.\n"
+"프로젝트 설정에서 'Import Etc' 설정을 활성화 하거나, 'Driver Fallback "
+"Enabled' 설정을 비활성화 하세요."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom debug template not found."
-msgstr "맞춤 디버그 템플릿을 찾을 수 없어요."
+msgstr "사용자 지정 디버그 템플릿을 찾을 수 없습니다."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr "맞춤 출시 템플릿을 찾을 수 없어요."
+msgstr "사용자 지정 출시 템플릿을 찾을 수 없습니다."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
-msgstr "템플릿 파일을 찾을 수 없어요:"
+msgstr "템플릿 파일을 찾을 수 없습니다:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr "32비트 환경에서는 4 GiB보다 큰 내장된 PCK를 내보낼 수 없어요."
+msgstr "32비트 환경에서는 4 GiB보다 큰 내장 PCK를 내보낼 수 없습니다."
#: editor/editor_feature_profile.cpp
msgid "3D Editor"
@@ -1614,31 +1638,32 @@ msgstr "애셋 라이브러리"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr "씬 트리 편집하기"
+msgstr "씬 트리 편집"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "독 가져오기"
+msgid "Node Dock"
+msgstr "노드 도킹"
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
-msgstr "노드 독"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "파일 시스템"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "파일 시스템과 가져오기 독"
+msgid "Import Dock"
+msgstr "독 가져오기"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr "프로필 '%s'을(를) 지울까요? (되돌릴 수 없어요)"
+msgstr "프로필 '%s'을(를) 지울까요? (되돌릴 수 없습니다)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr "프로필에는 올바른 파일 이름이면서, '.'이 없어야 해요"
+msgstr "프로필 이름은 '.' 이 없는 올바른 파일 이름이어야 합니다"
#: editor/editor_feature_profile.cpp
msgid "Profile with this name already exists."
-msgstr "이 이름으로 된 프로필이 이미 있어요."
+msgstr "이 이름으로 된 프로필이 이미 있습니다."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
@@ -1658,7 +1683,7 @@ msgstr "클래스 설정:"
#: editor/editor_feature_profile.cpp
msgid "Enable Contextual Editor"
-msgstr "맥락 편집기 켜기"
+msgstr "상황별 편집기 켜기"
#: editor/editor_feature_profile.cpp
msgid "Enabled Properties:"
@@ -1674,15 +1699,15 @@ msgstr "켜진 클래스:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr "파일 '%s' 형식이 잘못됐어요. 가져올 수 없어요."
+msgstr "파일 '%s' 형식이 올바르지 않습니다. 가져오기를 중단합니다."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
msgstr ""
-"프로필 '%s'이(가) 이미 있어요. 가져오기 전에 이미 있는 프로필을 먼저 삭제하세"
-"요. 가져올 수 없어요."
+"프로필 '%s'이(가) 이미 있습니다. 가져오기 전에 이미 있는 프로필을 먼저 삭제하"
+"세요. 가져오기를 중단합니다."
#: editor/editor_feature_profile.cpp
msgid "Error saving profile to path: '%s'."
@@ -1698,7 +1723,7 @@ msgstr "현재 프로필:"
#: editor/editor_feature_profile.cpp
msgid "Make Current"
-msgstr "현재의 것으로 만들기"
+msgstr "현재 프로필로 설정"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1745,23 +1770,23 @@ msgstr "프로필 내보내기"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
-msgstr "편집기 기능 프로필 관리하기"
+msgstr "편집기 기능 프로필 관리"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
-msgstr "현재 폴더 선택하기"
+msgstr "현재 폴더 선택"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr "파일이 이미 있어요. 덮어쓸까요?"
+msgstr "파일이 이미 있습니다. 덮어쓸까요?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select This Folder"
-msgstr "이 폴더 선택하기"
+msgstr "이 폴더 선택"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr "경로 복사하기"
+msgstr "경로 복사"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Open in File Manager"
@@ -1776,7 +1801,7 @@ msgstr "파일 탐색기에서 보기"
msgid "New Folder..."
msgstr "새 폴더..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "새로고침"
@@ -1810,23 +1835,23 @@ msgstr "디렉토리 또는 파일 열기"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
-msgstr "저장하기"
+msgstr "저장"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Save a File"
-msgstr "파일로 저장하기"
+msgstr "파일로 저장"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr "뒤로 가기"
+msgstr "뒤로"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr "앞으로 가기"
+msgstr "앞으로"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr "위로 가기"
+msgstr "상위로"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
@@ -1846,43 +1871,43 @@ msgstr "경로 포커스"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "즐겨찾기 위로 이동하기"
+msgstr "즐겨찾기 위로 이동"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "즐겨찾기 아래로 이동하기"
+msgstr "즐겨찾기 아래로 이동"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
-msgstr "이전 폴더로 이동해요."
+msgstr "이전 폴더로 이동합니다."
#: editor/editor_file_dialog.cpp
msgid "Go to next folder."
-msgstr "다음 폴더로 이동해요."
+msgstr "다음 폴더로 이동합니다."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
-msgstr "부모 폴더로 이동해요."
+msgstr "부모 폴더로 이동합니다."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Refresh files."
-msgstr "파일을 새로고침해요."
+msgstr "파일을 새로고침합니다."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr "현재 폴더를 즐겨찾기하거나 하지 않아요."
+msgstr "현재 폴더를 즐겨찾기 설정/즐겨찾기 해제합니다."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
-msgstr "숨긴 파일의 표시 여부 토글."
+msgstr "숨긴 파일의 표시 여부를 토글합니다."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
-msgstr "썸네일 바둑판으로 보기."
+msgstr "항목을 바둑판 형식의 썸네일로 봅니다."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr "목록으로 보기."
+msgstr "항목을 목록 형식으로 봅니다."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
@@ -1890,7 +1915,7 @@ msgstr "디렉토리 & 파일:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "미리 보기:"
@@ -1900,17 +1925,17 @@ msgstr "파일:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr "올바른 확장자를 사용해야 해요."
+msgstr "올바른 확장자를 사용해야 합니다."
#: editor/editor_file_system.cpp
msgid "ScanSources"
-msgstr "소스 조사"
+msgstr "소스 스캔중"
#: editor/editor_file_system.cpp
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
-msgstr "파일 %s을(를) 가리키는 다른 유형의 가져오기가 많아요. 가져올 수 없어요"
+msgstr "파일 % 에 해당하는 가져오기 포맷이 여러 종류입니다. 가져오기 중단됨"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
@@ -1947,7 +1972,7 @@ msgstr "속성"
#: editor/editor_help.cpp
msgid "override:"
-msgstr "다시 정의하기:"
+msgstr "오버라이드:"
#: editor/editor_help.cpp
msgid "default:"
@@ -1959,15 +1984,15 @@ msgstr "메서드"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "테마 속성"
+msgstr "테마 속성들"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "열거"
+msgstr "열거형"
#: editor/editor_help.cpp
msgid "Constants"
-msgstr "상수(Constant)"
+msgstr "상수"
#: editor/editor_help.cpp
msgid "Property Descriptions"
@@ -1982,8 +2007,8 @@ 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] 개선할 수 있도록 도와주세요!"
#: editor/editor_help.cpp
msgid "Method Descriptions"
@@ -1994,8 +2019,8 @@ msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"현재 이 메서드의 설명이 없어요. [color=$color][url=$url]관련 정보를 기여하여"
-"[/url][/color] 개선할 수 있도록 도와주세요!"
+"현재 이 메서드의 설명이 없습니다. [color=$color][url=$url]관련 정보를 기여하"
+"여[/url][/color] 개선할 수 있도록 도와주세요!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -2012,31 +2037,31 @@ msgstr "계층 구조 보이기"
#: editor/editor_help_search.cpp
msgid "Display All"
-msgstr "모두 표시하기"
+msgstr "모두 표시"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr "클래스만 표시하기"
+msgstr "클래스만 표시"
#: editor/editor_help_search.cpp
msgid "Methods Only"
-msgstr "메서드만 표시하기"
+msgstr "메서드만 표시"
#: editor/editor_help_search.cpp
msgid "Signals Only"
-msgstr "시그널만 표시하기"
+msgstr "시그널만 표시"
#: editor/editor_help_search.cpp
msgid "Constants Only"
-msgstr "상수만 표시하기"
+msgstr "상수만 표시"
#: editor/editor_help_search.cpp
msgid "Properties Only"
-msgstr "속성만 표시하기"
+msgstr "속성만 표시"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr "테마 속성만 표시하기"
+msgstr "테마 속성만 표시"
#: editor/editor_help_search.cpp
msgid "Member Type"
@@ -2056,7 +2081,7 @@ msgstr "시그널"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr "비선형"
+msgstr "상수"
#: editor/editor_help_search.cpp
msgid "Property"
@@ -2076,7 +2101,7 @@ msgstr "설정"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr "여러 설정:"
+msgstr "다수 설정:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -2084,7 +2109,7 @@ msgstr "출력:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Copy Selection"
-msgstr "선택 항목 복사하기"
+msgstr "선택 항목 복사"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2103,12 +2128,12 @@ msgstr "출력 지우기"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr "중단하기"
+msgstr "중단"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
msgid "Start"
-msgstr "시작하기"
+msgstr "시작"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
@@ -2148,12 +2173,12 @@ msgstr "새 창"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr "가져온 리소스를 저장할 수 없어요."
+msgstr "가져온 리소스를 저장할 수 없습니다."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr "네"
+msgstr "확인"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
@@ -2164,16 +2189,16 @@ msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
-"이 리소스는 편집 중인 씬에 속한 것이 아니라서 저장할 수 없어요. 저장하기 전"
+"이 리소스는 편집 중인 씬에 속한 것이 아니라서 저장할 수 없습니다. 저장하기 전"
"에 먼저 리소스를 유일하게 만드세요."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr "리소스를 다른 이름으로 저장하기..."
+msgstr "리소스를 다른 이름으로 저장..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr "파일을 작성하려고 열 수 없음:"
+msgstr "파일을 쓰기 모드로 열 수 없음:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
@@ -2185,7 +2210,7 @@ msgstr "저장 중 오류."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr "'%s'을(를) 열 수 없어요. 파일이 이동했거나 삭제된 모양이에요."
+msgstr "'%s'을(를) 열 수 없습니다. 파일이 이동했거나 삭제되었을 수 있습니다."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2197,7 +2222,7 @@ msgstr "예기치 못한 '%s' 파일의 끝."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
-msgstr "'%s' 또는 이것의 종속 항목이 없어요."
+msgstr "'%s' 또는 이것의 종속 항목이 없습니다."
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
@@ -2205,26 +2230,26 @@ msgstr "'%s' 불러오는 중 오류."
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr "씬 저장하기"
+msgstr "씬 저장 중"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr "분석하기"
+msgstr "분석 중"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
-msgstr "썸네일 만들기"
+msgstr "썸네일 만드는 중"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
-msgstr "이 작업은 트리 루트가 필요해요."
+msgstr "이 작업은 트리 루트가 필요합니다."
#: editor/editor_node.cpp
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
-"이 씬에는 순환하는 인스턴스를 포함하고 있어서 저장할 수 없어요.\n"
+"이 씬에 순환 인스턴스화가 있어서 저장할 수 없습니다.\n"
"이를 해결한 후 다시 저장해보세요."
#: editor/editor_node.cpp
@@ -2232,16 +2257,16 @@ msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
-"씬을 저장할 수 없어요. (인스턴스 또는 상속과 같은) 종속 관계가 만족스럽지 않"
-"은 모양이에요."
+"씬을 저장할 수 없습니다. (인스턴스 또는 상속과 같은) 종속 관계를 성립할 수 없"
+"는 것 같습니다."
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr "열려있는 씬은 덮어쓸 수 없어요!"
+msgstr "열려있는 씬은 덮어쓸 수 없습니다!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr "병합할 메시 라이브러리를 불러올 수 없어요!"
+msgstr "병합할 메시 라이브러리를 불러올 수 없습니다!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
@@ -2249,7 +2274,7 @@ msgstr "메시 라이브러리 저장 중 오류!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr "병합할 타일셋을 불러올 수 없어요!"
+msgstr "병합할 타일셋을 불러올 수 없습니다!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
@@ -2261,15 +2286,15 @@ msgstr "레이아웃 저장 중 오류!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
-msgstr "편집기 기본 레이아웃이 새로 정의됐어요."
+msgstr "기본 편집기 레이아웃을 덮어씁니다."
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr "레이아웃 이름을 찾을 수 없어요!"
+msgstr "레이아웃 이름을 찾을 수 없습니다!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
-msgstr "기본 레이아웃이 초기 설정으로 돌아왔어요."
+msgstr "기본 레이아웃을 초기화하였습니다."
#: editor/editor_node.cpp
msgid ""
@@ -2277,7 +2302,7 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"이 리소스는 가져온 씬에 속한 거라 편집할 수 없어요.\n"
+"이 리소스는 가져온 씬에 속한 리소스이므로 편집할 수 없습니다.\n"
"이 워크플로를 이해하려면 씬 가져오기(Importing Scenes)와 관련된 문서를 읽어주"
"세요."
@@ -2286,16 +2311,16 @@ msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
-"이 리소스는 인스턴스되거나 상속된 씬에 속해 있어요.\n"
-"현재 씬을 저장하는 경우 리소스의 변경 사항은 적용되지 않을 거예요."
+"이 리소스는 인스턴스되거나 상속된 씬에 속해 있습니다.\n"
+"현재 씬을 저장해도 리소스의 변경 사항이 유지되지 않을 것입니다."
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
-"이 리소스는 가져온 것이라 편집할 수 없어요. 가져오기 패널에서 설정을 변경한 "
-"뒤 다시 가져오세요."
+"이 리소스는 가져온 것이므로 편집할 수 없습니다. 가져오기 패널에서 설정을 변경"
+"한 뒤 다시 가져오세요."
#: editor/editor_node.cpp
msgid ""
@@ -2304,8 +2329,8 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"이 씬은 가져온 것이라 변경 사항은 적용되지 않아요.\n"
-"이 씬을 인스턴스하거나 상속하면 편집할 수 있어요.\n"
+"이 씬은 가져온 것이므로 변경 사항이 유지되지 않습니다.\n"
+"이 씬을 인스턴스화하거나 상속하면 편집할 수 있습니다.\n"
"이 워크플로를 이해하려면 씬 가져오기(Importing Scenes)와 관련된 문서를 읽어주"
"세요."
@@ -2315,20 +2340,16 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"원격 객체는 변경사항이 적용되지 않아요.\n"
+"원격 객체는 변경사항이 적용되지 않습니다.\n"
"이 워크플로를 이해하려면 디버깅(Debugging)과 관련된 문서를 읽어주세요."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
-msgstr "실행하기로 정의한 씬이 없어요."
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "현재 씬이 저장되지 않았어요. 실행하기 전에 저장해주세요."
+msgstr "실행할 씬이 설정되지 않았습니다."
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
-msgstr "하위 프로세스를 시작할 수 없어요!"
+msgstr "하위 프로세스를 시작할 수 없습니다!"
#: editor/editor_node.cpp editor/filesystem_dock.cpp
msgid "Open Scene"
@@ -2352,7 +2373,7 @@ msgstr "빠른 스크립트 열기..."
#: editor/editor_node.cpp
msgid "Save & Close"
-msgstr "저장하기 & 닫기"
+msgstr "저장 & 닫기"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
@@ -2360,15 +2381,15 @@ msgstr "닫기 전에 '%s'에 변경 사항을 저장할까요?"
#: editor/editor_node.cpp
msgid "Saved %s modified resource(s)."
-msgstr "수정된 리소스 %s이(가) 저장됐어요."
+msgstr "수정된 리소스 %s을(를) 저장하였습니다."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr "씬을 저장하려면 루트 노드가 필요해요."
+msgstr "씬을 저장하려면 루트 노드가 필요합니다."
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr "씬을 다른 이름으로 저장하기..."
+msgstr "씬을 다른 이름으로 저장..."
#: editor/editor_node.cpp
msgid "No"
@@ -2376,15 +2397,15 @@ msgstr "아니오"
#: editor/editor_node.cpp
msgid "Yes"
-msgstr "네"
+msgstr "예"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr "이 씬은 아직 저장하지 않았어요. 실행하기 전에 저장할까요?"
+msgstr "이 씬은 아직 저장하지 않았습니다. 실행하기 전에 저장할까요?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr "이 작업에는 씬이 필요해요."
+msgstr "이 작업에는 씬이 필요합니다."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
@@ -2392,7 +2413,7 @@ msgstr "메시 라이브러리 내보내기"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr "이 작업에는 루트 노드가 필요해요."
+msgstr "이 작업에는 루트 노드가 필요합니다."
#: editor/editor_node.cpp
msgid "Export Tile Set"
@@ -2400,31 +2421,35 @@ msgstr "타일셋 내보내기"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
-msgstr "이 작업에는 선택한 노드가 필요해요."
+msgstr "이 작업에는 선택한 노드가 필요합니다."
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr "현재 씬을 저장하지 않았어요. 무시하고 열까요?"
+msgstr "현재 씬을 저장하지 않았습니다. 무시하고 열까요?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr "저장하지 않은 씬은 다시 불러올 수 없어요."
+msgstr "저장하지 않은 씬은 새로고침할 수 없습니다."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "되돌리기"
+msgid "Reload Saved Scene"
+msgstr "저장된 씬 새로고침"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "이 행동은 취소할 수 없어요. 무시하고 되돌릴까요?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"현재 씬에는 저장하지 않은 변경사항이 있습니다.\n"
+"그래도 저장된 씬을 새로고침하시겠습니까? 이 동작은 되돌릴 수 없습니다."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr "빠른 씬 실행하기..."
+msgstr "씬 빠른 실행..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr "종료하기"
+msgstr "종료"
#: editor/editor_node.cpp
msgid "Exit the editor?"
@@ -2436,7 +2461,7 @@ msgstr "프로젝트 매니저를 열까요?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr "저장하기 & 종료하기"
+msgstr "저장 & 종료"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
@@ -2451,12 +2476,12 @@ msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
-"이 설정은 더 이상 사용할 수 없어요. 새로고침을 강제로 해야 하는 상황은 버그"
-"로 간주돼요. 신고해주세요."
+"이 설정은 제거되었습니다. 강제로 새로고침해야 하는 상황은 이제 버그입니다. 신"
+"고해주세요."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
-msgstr "메인 씬을 고르세요"
+msgstr "메인 씬 선택"
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2469,7 +2494,8 @@ msgstr "닫은 씬 다시 열기"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
-"애드온 플러그인을 여기서 켤 수 없음: '%s' 설정을 구문 분석할 수 없어요."
+"다음 경로에 있는 애드온 플러그인을 활성화할 수 없음: '%s' 설정의 구문 분석을 "
+"실패했습니다."
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
@@ -2484,37 +2510,37 @@ msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"다음 경로에서 애드온 스크립트를 불러올 수 없음: '%s' 코드에 오류가 있는 모양"
-"이에요. 문법을 확인해보세요."
+"다음 경로에서 애드온 스크립트를 불러올 수 없음: '%s' 코드에 오류가 있는 것 같"
+"습니다. 문법을 확인해보세요."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"다음 경로에서 애드온 스크립트를 불러올 수 없음: '%s' 기본 유형이 EditorPlugin"
-"이 아니에요."
+"이 아닙니다."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
-"다음 경로에서 애드온 스크립트를 불러올 수 없음: '%s' 스크립트가 Tool 모드가 "
-"아니에요."
+"다음 경로에서 애드온 스크립트를 불러올 수 없음: '%s' 스크립트가 tool 모드가 "
+"아닙니다."
#: editor/editor_node.cpp
msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
-"씬 '%s'을(를) 자동으로 가져왔기 때문에, 수정할 수 없어요.\n"
-"이 씬을 편집하려면 새로운 상속 씬을 만들어야 해요."
+"씬 '%s'을(를) 자동으로 가져왔으므로 수정할 수 없습니다.\n"
+"이 씬을 편집하려면 새로운 상속 씬을 만들어야 합니다."
#: editor/editor_node.cpp
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
-"씬을 불러오는 중 오류가 발생했어요. 씬은 프로젝트 경로에 있을 거예요. '가져오"
-"기'를 사용해서 씬을 열고, 그 씬을 프로젝트 경로 안에 저장하세요."
+"씬을 불러오는 중 오류가 발생했습니다. 씬은 프로젝트 경로 내에 있어야 합니다. "
+"'가져오기'를 사용해서 씬을 열고, 그 씬을 프로젝트 경로 안에 저장하세요."
#: editor/editor_node.cpp
msgid "Scene '%s' has broken dependencies:"
@@ -2530,8 +2556,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"메인 씬을 지정하지 않았네요. 하나 정할까요?\n"
-"이건 나중에 \"프로젝트 설정\"의 'application' 카테고리에서 바꿀 수 있어요."
+"메인 씬을 지정하지 않았습니다. 선택하시겠습니까?\n"
+"나중에 \"프로젝트 설정\"의 'application' 카테고리에서 변경할 수 있습니다."
#: editor/editor_node.cpp
msgid ""
@@ -2539,8 +2565,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"선택한 씬 '%s'이(가) 없어요, 다른 씬으로 정할까요?\n"
-"이건 나중에 \"프로젝트 설정\"의 'application' 카테고리에서 바꿀 수 있어요."
+"선택한 씬 '%s'이(가) 없습니다. 다른 씬으로 지정할까요?\n"
+"나중에 \"프로젝트 설정\"의 'application' 카테고리에서 바꿀 수 있습니다."
#: editor/editor_node.cpp
msgid ""
@@ -2548,16 +2574,16 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"선택한 씬 '%s'은(는) 씬 파일이 아니에요, 다른 씬으로 정할까요?\n"
-"이건 나중에 \"프로젝트 설정\"의 'application' 카테고리에서 바꿀 수 있어요."
+"선택한 씬 '%s'은(는) 씬 파일이 아닙니다, 다른 씬으로 정할까요?\n"
+"이건 나중에 \"프로젝트 설정\"의 'application' 카테고리에서 바꿀 수 있습니다."
#: editor/editor_node.cpp
msgid "Save Layout"
-msgstr "레이아웃 저장하기"
+msgstr "레이아웃 저장"
#: editor/editor_node.cpp
msgid "Delete Layout"
-msgstr "레이아웃 삭제하기"
+msgstr "레이아웃 삭제"
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
@@ -2571,7 +2597,7 @@ msgstr "파일 시스템에서 보기"
#: editor/editor_node.cpp
msgid "Play This Scene"
-msgstr "이 씬 실행하기"
+msgstr "이 씬 실행"
#: editor/editor_node.cpp
msgid "Close Tab"
@@ -2595,7 +2621,7 @@ msgstr "모든 탭 닫기"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
-msgstr "씬 탭 전환하기"
+msgstr "씬 탭 전환"
#: editor/editor_node.cpp
msgid "%d more files or folders"
@@ -2623,7 +2649,7 @@ msgstr "집중 모드 토글."
#: editor/editor_node.cpp
msgid "Add a new scene."
-msgstr "새 씬을 추가해요."
+msgstr "새 씬을 추가합니다."
#: editor/editor_node.cpp
msgid "Scene"
@@ -2631,11 +2657,11 @@ msgstr "씬"
#: editor/editor_node.cpp
msgid "Go to previously opened scene."
-msgstr "이전에 열었던 씬으로 가요."
+msgstr "이전에 열었던 씬으로 이동합니다."
#: editor/editor_node.cpp
msgid "Copy Text"
-msgstr "문자 복사하기"
+msgstr "문자 복사"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2651,7 +2677,7 @@ msgstr "파일 필터..."
#: editor/editor_node.cpp
msgid "Operations with scene files."
-msgstr "씬 파일로 작업해요."
+msgstr "씬 파일에 대한 작업입니다."
#: editor/editor_node.cpp
msgid "New Scene"
@@ -2671,15 +2697,15 @@ msgstr "최근 기록 열기"
#: editor/editor_node.cpp
msgid "Save Scene"
-msgstr "씬 저장하기"
+msgstr "씬 저장"
#: editor/editor_node.cpp
msgid "Save All Scenes"
-msgstr "모든 씬 저장하기"
+msgstr "모든 씬 저장"
#: editor/editor_node.cpp
msgid "Convert To..."
-msgstr "다음으로 변환하기..."
+msgstr "다음으로 변환..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
@@ -2697,11 +2723,7 @@ msgstr "되돌리기"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "다시 실행하기"
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "씬 되돌리기"
+msgstr "다시 실행"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
@@ -2722,11 +2744,11 @@ msgstr "버전 컨트롤"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr "버전 컨트롤 설치하기"
+msgstr "버전 컨트롤 설정"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr "버전 컨트롤 종료하기"
+msgstr "버전 컨트롤 종료"
#: editor/editor_node.cpp
msgid "Export..."
@@ -2734,7 +2756,7 @@ msgstr "내보내기..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr "안드로이드 빌드 템플릿 설치하기..."
+msgstr "안드로이드 빌드 템플릿 설치..."
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
@@ -2759,89 +2781,104 @@ msgstr "디버그"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr "원격 디버그와 함께 배포하기"
+msgstr "원격 디버그와 함께 배포"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"내보내거나 배포할 때, 결과 실행 파일은 디버깅을 위해 이 컴퓨터의 IP와 연결을 "
-"시도할 거예요."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
-msgstr "네트워크 파일 시스템과 함께 작게 배포하기"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
+msgstr "네트워크 파일 시스템을 사용하여 작게 배포"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
-"이 설정을 켜면, 내보내거나 배포할 때 최소한의 실행 파일을 만들어요.\n"
-"네트워크 너머 편집기가 프로젝트에서 파일 시스템을 제공할 거예요.\n"
-"Android의 경우, 더 빠른 성능을 원한다면 배포할 때 USB 케이블을 사용하세요. "
-"이 설정은 설치 공간이 큰 게임을 빨리 테스트할 때 쓸 수 있어요."
+"이 설정을 켜면, 내보내거나 배포할 때 최소한의 실행 파일을 만듭니다.\n"
+"이 경우, 실행 파일이 네트워크 너머에 있는 편집기의 파일 시스템을 사용합니"
+"다.\n"
+"Android의 경우, 배포 시 더 빠른 속도를 위해 USB 케이블을 사용합니다. 이 설정"
+"은 용량이 큰 게임의 테스트 배포 속도를 향상시킬 수 있습니다."
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
msgstr "충돌 모양 보이기"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"이 설정을 켜면 게임을 실행하는 동안 (2D와 3D용) Collision 모양과 Raycast 노드"
-"가 보이게 돼요."
+"가 보이게 됩니다."
#: editor/editor_node.cpp
msgid "Visible Navigation"
msgstr "내비게이션 보이기"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
-"이 설정을 켜면, 게임을 실행하는 동안 Navigation 메시와 폴리곤이 보이게 돼요."
+"이 설정을 켜면, 게임을 실행하는 동안 Navigation 메시와 폴리곤이 보이게 됩니"
+"다."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr "씬 변경 사항 동기화하기"
+#, fuzzy
+msgid "Synchronize Scene Changes"
+msgstr "씬 변경 사항 동기화"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"이 설정을 켜면, 게임을 실행하는 동안 편집기에서 씬의 변경 사항이 게임에 적용"
-"돼요.\n"
-"기기를 원격에서 사용할 때, 이것은 네트워크 파일 시스템으로 더욱 효과적이에요."
+"이 설정이 활성화된 경우, 편집기에서 씬을 수정하면 실행 중인 게임에도 반영됩니"
+"다.\n"
+"원격 장치에서 사용중인 경우 네트워크 파일 시스템 기능을 활성화하면 더욱 효율"
+"적입니다."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr "스크립트 변경 사항 동기화하기"
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "스크립트 변경 사항 동기화"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"이 설정을 켜면, 게임을 실행하는 동안 저장한 모든 스크립트를 새로 불러와요.\n"
-"기기를 원격에서 사용할 때, 이것은 네트워크 파일 시스템으로 더욱 효과적이에요."
+"이 설정이 활성화된 경우, 어떤 스크립트든 저장하면 실행중인 게임에도 새로고침"
+"되어 반영됩니다.\n"
+"원격 장치에서 사용중인 경우 네트워크 파일 시스템 기능을 활성화하면 더욱 효율"
+"적입니다."
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
-msgstr "편집기(Editor)"
+msgstr "편집기"
#: editor/editor_node.cpp
msgid "Editor Settings..."
@@ -2857,7 +2894,7 @@ msgstr "스크린샷 찍기"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "스크린샷은 Editor Data/Settings 폴더에 저장됐어요."
+msgstr "스크린샷이 Editor Data/Settings 폴더에 저장되었습니다."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
@@ -2881,7 +2918,7 @@ msgstr "편집기 설정 폴더 열기"
#: editor/editor_node.cpp
msgid "Manage Editor Features..."
-msgstr "편집기 기능 관리하기..."
+msgstr "편집기 기능 관리..."
#: editor/editor_node.cpp
msgid "Manage Export Templates..."
@@ -2896,7 +2933,7 @@ msgstr "도움말"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "검색"
@@ -2910,8 +2947,12 @@ msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "이슈 트래커"
+msgid "Report a Bug"
+msgstr "버그 보고"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "문서 피드백 보내기"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2923,15 +2964,15 @@ msgstr "정보"
#: editor/editor_node.cpp
msgid "Play the project."
-msgstr "프로젝트를 실행해요."
+msgstr "프로젝트를 실행합니다."
#: editor/editor_node.cpp
msgid "Play"
-msgstr "실행하기"
+msgstr "실행"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr "디버깅을 하기 위해 씬 실행을 멈춰요."
+msgstr "디버깅을 하기 위해 씬 실행을 중단합니다."
#: editor/editor_node.cpp
msgid "Pause Scene"
@@ -2939,19 +2980,19 @@ msgstr "씬 멈추기"
#: editor/editor_node.cpp
msgid "Stop the scene."
-msgstr "씬을 멈춰요."
+msgstr "씬을 중단합니다."
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr "편집하고 있던 씬을 실행해요."
+msgstr "편집하고 있던 씬을 실행합니다."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr "씬 실행하기"
+msgstr "씬 실행"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr "씬을 지정해서 실행해요"
+msgstr "씬을 지정해서 실행합니다"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
@@ -2959,16 +3000,16 @@ msgstr "맞춤 씬 실행하기"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr "비디오 드라이버를 변경하려면 편집기를 다시 껐다 켜야 해요."
+msgstr "비디오 드라이버를 변경하려면 편집기를 다시 껐다 켜야 합니다."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
msgid "Save & Restart"
-msgstr "저장 & 다시 시작하기"
+msgstr "저장 & 다시 시작"
#: editor/editor_node.cpp
msgid "Spins when the editor window redraws."
-msgstr "편집기 창에 변화가 있을 때마다 돌아요."
+msgstr "편집기 창에 변화가 있을 때마다 회전합니다."
#: editor/editor_node.cpp
msgid "Update Continuously"
@@ -3004,7 +3045,7 @@ msgstr "저장하지 않음"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
-msgstr "안드로이드 빌드 템플릿이 없어요, 관련 템플릿을 설치해주세요."
+msgstr "안드로이드 빌드 템플릿이 없습니다, 관련 템플릿을 설치해주세요."
#: editor/editor_node.cpp
msgid "Manage Templates"
@@ -3021,11 +3062,11 @@ msgid ""
"preset."
msgstr ""
"\"res://android/build\"에 소스 템플릿을 설치해서, 프로젝트를 맞춤 안드로이드 "
-"빌드에 맞게 설정할 거예요.\n"
-"그런 다음 수정 사항을 적용하고 맞춤 APK를 만들어 내보낼 수 있어요 (모듈 추가"
-"하기, AndroidManifest.xml 바꾸기 등).\n"
+"빌드에 맞게 설정할 것입니다.\n"
+"그런 다음 수정 사항을 적용하고 맞춤 APK를 만들어 내보낼 수 있습니다 (모듈 추"
+"가, AndroidManifest.xml 바꾸기 등).\n"
"미리 빌드된 APK를 사용하는 대신 맞춤 빌드를 만들려면, 안드로이드 내보내기 프"
-"리셋에서 \"맞춤 빌드 사용하기\" 설정을 켜 놓아야 해요."
+"리셋에서 \"맞춤 빌드 사용\" 설정을 켜 놓아야 합니다."
#: editor/editor_node.cpp
msgid ""
@@ -3034,8 +3075,8 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
-"안드로이드 빌드 템플릿이 이미 이 프로젝트에 설치했고, 덮어 쓸 수 없어요.\n"
-"이 명령을 다시 실행하기 전에 \"res://android/build\" 디렉토리를 삭제하세요."
+"안드로이드 빌드 템플릿이 이미 이 프로젝트에 설치했고, 덮어 쓸 수 없습니다.\n"
+"이 명령을 다시 실행 전에 \"res://android/build\" 디렉토리를 삭제하세요."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
@@ -3051,11 +3092,11 @@ msgstr "라이브러리 내보내기"
#: editor/editor_node.cpp
msgid "Merge With Existing"
-msgstr "기존의 것과 병합하기"
+msgstr "기존의 것과 병합"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
-msgstr "스크립트 열기 & 실행하기"
+msgstr "스크립트 열기 & 실행"
#: editor/editor_node.cpp
msgid "New Inherited"
@@ -3067,7 +3108,7 @@ msgstr "불러오기 오류"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
-msgstr "선택하기"
+msgstr "선택"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
@@ -3099,11 +3140,11 @@ msgstr "경고!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
-msgstr "하위 리소스를 찾을 수 없어요."
+msgstr "하위 리소스를 찾을 수 없습니다."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr "메시 미리 보기 만들기"
+msgstr "메시 미리 보기 만드는 중"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
@@ -3115,7 +3156,7 @@ msgstr "기본 스크립트:"
#: editor/editor_plugin_settings.cpp
msgid "Edit Plugin"
-msgstr "플러그인 편집하기"
+msgstr "플러그인 편집"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -3204,7 +3245,7 @@ msgstr "[비어있음]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr "지정하기..."
+msgstr "지정..."
#: editor/editor_properties.cpp
msgid "Invalid RID"
@@ -3214,15 +3255,15 @@ msgstr "잘못된 RID"
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
-msgstr "선택한 리소스 (%s)가 이 속성 (%s)에 적합한 모든 유형에 맞지 않아요."
+msgstr "선택한 리소스 (%s)가 이 속성 (%s)에 적합한 모든 유형에 맞지 않습니다."
#: editor/editor_properties.cpp
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
-"파일로 저장한 리소스에 ViewportTexture를 만들 수 없어요.\n"
-"리소스가 씬에 속해 있어야 해요."
+"파일로 저장한 리소스에 ViewportTexture를 만들 수 없습니다.\n"
+"리소스가 씬에 속해 있어야 합니다."
#: editor/editor_properties.cpp
msgid ""
@@ -3232,7 +3273,7 @@ msgid ""
"containing it up to a node)."
msgstr ""
"씬에 지역으로 설정되지 않았기 때문에 이 리소스에 ViewportTexture를 만들 수 없"
-"어요.\n"
+"습니다.\n"
"리소스 (그리고 한 노드에 있는 모든 리소스)의 'local to scene' 속성을 켜주세"
"요 ."
@@ -3246,7 +3287,7 @@ msgstr "새 스크립트"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
msgid "Extend Script"
-msgstr "스크립트 펼치기"
+msgstr "스크립트 상속"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
@@ -3272,7 +3313,7 @@ msgstr "붙여넣기"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Convert To %s"
-msgstr "%s(으)로 변환하기"
+msgstr "%s(으)로 변환"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
@@ -3289,7 +3330,7 @@ msgstr "페이지: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr "항목 삭제하기"
+msgstr "항목 삭제"
#: editor/editor_properties_array_dict.cpp
msgid "New Key:"
@@ -3301,14 +3342,16 @@ msgstr "새 값:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr "키/값 쌍 추가하기"
+msgstr "키/값 쌍 추가"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
-"이 플랫폼으로 실행할 수 있는 내보내기 프리셋이 없어요.\n"
+"이 플랫폼으로 실행할 수 있는 내보내기 프리셋이 없습니다.\n"
"내보내기 메뉴에서 실행할 수 있는 프리셋을 추가해주세요."
#: editor/editor_run_script.cpp
@@ -3317,7 +3360,7 @@ msgstr "_run() 메서드에 당신의 논리를 작성하세요."
#: editor/editor_run_script.cpp
msgid "There is an edited scene already."
-msgstr "이미 편집된 씬이 있어요."
+msgstr "이미 편집된 씬이 있습니다."
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
@@ -3335,13 +3378,18 @@ msgstr "스크립트를 실행할 수 없음:"
msgid "Did you forget the '_run' method?"
msgstr "'_run' 메서드를 잊었나요?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Ctrl을 눌러 정수로 반올림합니다. Shift를 눌러 좀 더 정밀하게 조작합니다."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
-msgstr "가져올 노드 선택하기"
+msgstr "가져올 노드 선택"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
-msgstr "검색하기"
+msgstr "탐색"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
@@ -3353,11 +3401,11 @@ msgstr "노드에서 가져오기:"
#: editor/export_template_manager.cpp
msgid "Redownload"
-msgstr "다시 다운로드하기"
+msgstr "다시 다운로드"
#: editor/export_template_manager.cpp
msgid "Uninstall"
-msgstr "삭제하기"
+msgstr "삭제"
#: editor/export_template_manager.cpp
msgid "(Installed)"
@@ -3366,11 +3414,11 @@ msgstr "(설치됨)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download"
-msgstr "다운로드하기"
+msgstr "다운로드"
#: editor/export_template_manager.cpp
msgid "Official export templates aren't available for development builds."
-msgstr "공식 내보내기 템플릿은 개발 빌드에서는 이용할 수 없어요."
+msgstr "공식 내보내기 템플릿은 개발 빌드에서는 이용할 수 없습니다."
#: editor/export_template_manager.cpp
msgid "(Missing)"
@@ -3382,7 +3430,7 @@ msgstr "(현재)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
-msgstr "미러를 검색 중이에요. 기다려주세요..."
+msgstr "미러를 검색 중입니다. 기다려주세요..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
@@ -3390,7 +3438,7 @@ msgstr "템플릿 버전 '%s'을(를) 삭제할까요?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
-msgstr "내보내기 템플릿 zip 파일을 열 수 없어요."
+msgstr "내보내기 템플릿 zip 파일을 열 수 없습니다."
#: editor/export_template_manager.cpp
msgid "Invalid version.txt format inside templates: %s."
@@ -3398,7 +3446,7 @@ msgstr "템플릿 속의 version.txt가 잘못된 형식임: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr "템플릿에 version.txt를 찾을 수 없어요."
+msgstr "템플릿에 version.txt를 찾을 수 없습니다."
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
@@ -3425,18 +3473,18 @@ msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
msgstr ""
-"이 버전의 다운로드 링크를 찾을 수 없어요. 공식 출시 버전만 바로 다운로드할 "
-"수 있어요."
+"이 버전의 다운로드 링크를 찾을 수 없습니다. 공식 출시 버전만 바로 다운로드할 "
+"수 있습니다."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve."
-msgstr "해결할 수 없어요."
+msgstr "해결할 수 없습니다."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect."
-msgstr "연결할 수 없어요."
+msgstr "연결할 수 없습니다."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3469,8 +3517,8 @@ msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
-"템플릿 설치에 실패했어요.\n"
-"문제가 있는 템플릿 기록은 '%s'에서 찾아 볼 수 있어요."
+"템플릿 설치에 실패했습니다.\n"
+"문제가 있는 템플릿 기록은 '%s'에서 찾아 볼 수 있습니다."
#: editor/export_template_manager.cpp
msgid "Error requesting URL:"
@@ -3536,15 +3584,15 @@ msgstr "설치된 버전:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr "파일에서 설치하기"
+msgstr "파일에서 설치"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr "템플릿 삭제하기"
+msgstr "템플릿 삭제"
#: editor/export_template_manager.cpp
msgid "Select Template File"
-msgstr "템플릿 파일 선택하기"
+msgstr "템플릿 파일 선택"
#: editor/export_template_manager.cpp
msgid "Godot Export Templates"
@@ -3556,7 +3604,7 @@ msgstr "내보내기 템플릿 매니저"
#: editor/export_template_manager.cpp
msgid "Download Templates"
-msgstr "템플릿 다운로드하기"
+msgstr "템플릿 다운로드"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
@@ -3569,16 +3617,16 @@ msgstr "즐겨찾기"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
-"상태: 파일 가져오기에 실패했어요. 수동으로 파일을 수정하고 다시 가져 와주세"
+"상태: 파일 가져오기에 실패했습니다. 수동으로 파일을 수정하고 다시 가져 와주세"
"요."
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr "리소스 루트를 옮기거나 이름을 바꿀 수 없어요."
+msgstr "리소스 루트를 옮기거나 이름을 바꿀 수 없습니다."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
-msgstr "폴더를 자신의 하위로 옮길 수 없어요."
+msgstr "폴더를 자신의 하위로 옮길 수 없습니다."
#: editor/filesystem_dock.cpp
msgid "Error moving:"
@@ -3594,19 +3642,19 @@ msgstr "종속 항목을 업데이트할 수 없음:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
-msgstr "이름을 제공하지 않았어요."
+msgstr "이름을 제공하지 않았습니다."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters."
-msgstr "제공한 이름에 잘못된 문자가 있어요."
+msgstr "제공한 이름에 잘못된 문자가 있습니다."
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr "이 이름은 이미 어떤 파일이나 폴더가 쓰고 있어요."
+msgstr "이 이름은 이미 어떤 파일이나 폴더가 쓰고 있습니다."
#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
-msgstr "이름에 잘못된 문자가 있어요."
+msgstr "이름에 잘못된 문자가 있습니다."
#: editor/filesystem_dock.cpp
msgid "Renaming file:"
@@ -3618,11 +3666,11 @@ msgstr "폴더 이름 바꾸기:"
#: editor/filesystem_dock.cpp
msgid "Duplicating file:"
-msgstr "파일 복제하기:"
+msgstr "파일 복제:"
#: editor/filesystem_dock.cpp
msgid "Duplicating folder:"
-msgstr "폴더 복제하기:"
+msgstr "폴더 복제:"
#: editor/filesystem_dock.cpp
msgid "New Inherited Scene"
@@ -3630,7 +3678,7 @@ msgstr "새 상속 씬"
#: editor/filesystem_dock.cpp
msgid "Set As Main Scene"
-msgstr "메인 씬으로 설정하기"
+msgstr "메인 씬으로 설정"
#: editor/filesystem_dock.cpp
msgid "Open Scenes"
@@ -3642,15 +3690,15 @@ msgstr "인스턴스하기"
#: editor/filesystem_dock.cpp
msgid "Add to Favorites"
-msgstr "즐겨찾기로 추가하기"
+msgstr "즐겨찾기로 추가"
#: editor/filesystem_dock.cpp
msgid "Remove from Favorites"
-msgstr "즐겨찾기에서 삭제하기"
+msgstr "즐겨찾기에서 삭제"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr "종속 관계 편집하기..."
+msgstr "종속 관계 편집..."
#: editor/filesystem_dock.cpp
msgid "View Owners..."
@@ -3662,11 +3710,11 @@ msgstr "이름 바꾸기..."
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
-msgstr "복제하기..."
+msgstr "복제..."
#: editor/filesystem_dock.cpp
msgid "Move To..."
-msgstr "여기로 이동하기..."
+msgstr "여기로 이동..."
#: editor/filesystem_dock.cpp
msgid "New Scene..."
@@ -3707,7 +3755,7 @@ msgstr "다음 폴더/파일"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
-msgstr "파일 시스템 다시 스캔하기"
+msgstr "파일 시스템 다시 스캔"
#: editor/filesystem_dock.cpp
msgid "Toggle Split Mode"
@@ -3715,23 +3763,23 @@ msgstr "분할 모드 토글"
#: editor/filesystem_dock.cpp
msgid "Search files"
-msgstr "파일 검색하기"
+msgstr "파일 검색"
#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-"파일 스캔 중이에요.\n"
-"기다려주세요..."
+"파일 스캔중.\n"
+"기다려주십시오..."
#: editor/filesystem_dock.cpp
msgid "Move"
-msgstr "이동하기"
+msgstr "이동"
#: editor/filesystem_dock.cpp
msgid "There is already file or folder with the same name in this location."
-msgstr "이 위치에는 같은 이름의 파일이나 폴더가 있어요."
+msgstr "이 위치에는 같은 이름의 파일이나 폴더가 있습니다."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
@@ -3766,8 +3814,8 @@ msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
msgstr ""
-"해당 확장자 이름을 갖는 파일이 있어요. 프로젝트 설정에 파일을 추가하거나 삭제"
-"하세요."
+"해당 확장자 이름을 갖는 파일이 있습니다. 프로젝트 설정에 파일을 추가하거나 삭"
+"제하세요."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3780,7 +3828,7 @@ msgstr "바꾸기..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
-msgstr "취소하기"
+msgstr "취소"
#: editor/find_in_files.cpp
msgid "Find: "
@@ -3792,7 +3840,7 @@ msgstr "바꾸기: "
#: editor/find_in_files.cpp
msgid "Replace all (no undo)"
-msgstr "모두 바꾸기 (되돌릴 수 없어요)"
+msgstr "모두 바꾸기 (되돌릴 수 없습니다)"
#: editor/find_in_files.cpp
msgid "Searching..."
@@ -3804,19 +3852,19 @@ msgstr "검색 완료"
#: editor/groups_editor.cpp
msgid "Add to Group"
-msgstr "그룹에 추가하기"
+msgstr "그룹에 추가"
#: editor/groups_editor.cpp
msgid "Remove from Group"
-msgstr "그룹에서 삭제하기"
+msgstr "그룹에서 삭제"
#: editor/groups_editor.cpp
msgid "Group name already exists."
-msgstr "이 그룹 이름은 이미 누가 쓰고 있어요."
+msgstr "이 그룹 이름은 이미 누가 쓰고 있습니다."
#: editor/groups_editor.cpp
msgid "Invalid group name."
-msgstr "이 그룹 이름은 잘못됐어요."
+msgstr "이 그룹 이름은 잘못되었습니다."
#: editor/groups_editor.cpp
msgid "Rename Group"
@@ -3824,7 +3872,7 @@ msgstr "그룹 이름 바꾸기"
#: editor/groups_editor.cpp
msgid "Delete Group"
-msgstr "그룹 삭제하기"
+msgstr "그룹 삭제"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3845,7 +3893,7 @@ msgstr "그룹에 속한 노드"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
-msgstr "빈 그룹은 자동으로 삭제돼요."
+msgstr "빈 그룹은 자동으로 삭제됩니다."
#: editor/groups_editor.cpp
msgid "Group Editor"
@@ -3853,7 +3901,7 @@ msgstr "그룹 편집기"
#: editor/groups_editor.cpp
msgid "Manage Groups"
-msgstr "그룹 관리하기"
+msgstr "그룹 관리"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3929,22 +3977,26 @@ msgid "Error running post-import script:"
msgstr "후 가져오기 스크립트 실행 중 오류:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "`post_import()` 메소드에서 Node에서 상속받은 객체를 반환했습니까?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "저장 중..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "파일 %d개"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
-msgstr "'%s'을(를) 기본으로 설정하기"
+msgstr "'%s'을(를) 기본으로 설정"
#: editor/import_dock.cpp
msgid "Clear Default for '%s'"
msgstr "'%s'을(를) 기본에서 지우기"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " 파일"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "다음 형식으로 가져오기:"
@@ -3957,23 +4009,23 @@ msgid "Reimport"
msgstr "다시 가져오기"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "씬 저장, 다시 가져오기 및 다시 시작"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
-msgstr "가져온 파일의 유형을 바꾸려면 편집기를 다시 켜아 해요."
+msgstr "가져온 파일의 유형을 바꾸려면 편집기를 다시 켜아 합니다."
#: editor/import_dock.cpp
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
msgstr ""
-"경고: 이 리소스를 사용하는 애셋이 있어요. 정상적으로 불러오지 못할 수도 있어"
-"요."
+"경고: 이 리소스를 사용하는 애셋이 있습니다. 정상적으로 불러오지 못할 수도 있"
+"습니다."
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
-msgstr "리소스 불러오기에 실패했어요."
+msgstr "리소스 불러오기에 실패했습니다."
#: editor/inspector_dock.cpp
msgid "Expand All Properties"
@@ -3990,19 +4042,15 @@ msgstr "다른 이름으로 저장..."
#: editor/inspector_dock.cpp
msgid "Copy Params"
-msgstr "매개변수 복사하기"
-
-#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "매개변수 붙여넣기"
+msgstr "매개변수 복사"
#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
-msgstr "리소스 클립보드 편집하기"
+msgstr "리소스 클립보드 편집"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
-msgstr "리소스 복사하기"
+msgstr "리소스 복사"
#: editor/inspector_dock.cpp
msgid "Make Built-In"
@@ -4018,27 +4066,27 @@ msgstr "도움말에서 열기"
#: editor/inspector_dock.cpp
msgid "Create a new resource in memory and edit it."
-msgstr "새 리소스를 메모리에서 만들고 편집해요."
+msgstr "새 리소스를 메모리에서 만들고 편집합니다."
#: editor/inspector_dock.cpp
msgid "Load an existing resource from disk and edit it."
-msgstr "디스크에서 기존 리소스를 불러오고 편집해요."
+msgstr "디스크에서 기존 리소스를 불러오고 편집합니다."
#: editor/inspector_dock.cpp
msgid "Save the currently edited resource."
-msgstr "현재 편집하는 리소스를 저장해요."
+msgstr "현재 편집하는 리소스를 저장합니다."
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
-msgstr "기록에서 이전에 편집한 객체로 가요."
+msgstr "기록상 이전에 편집했던 객체로 이동합니다."
#: editor/inspector_dock.cpp
msgid "Go to the next edited object in history."
-msgstr "기록에서 다음에 편집한 객체로 가요."
+msgstr "기록상 다음에 편집했던 객체로 이동합니다."
#: editor/inspector_dock.cpp
msgid "History of recently edited objects."
-msgstr "최근에 편집한 객체 기록이에요."
+msgstr "최근에 편집한 객체 기록입니다."
#: editor/inspector_dock.cpp
msgid "Object properties."
@@ -4050,11 +4098,11 @@ msgstr "필터 속성"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
-msgstr "변경 사항을 잃을 수도 있어요!"
+msgstr "변경 사항을 잃을 수도 있습니다!"
#: editor/multi_node_edit.cpp
msgid "MultiNode Set"
-msgstr "다중 노드 설정하기"
+msgstr "다중 노드 설정"
#: editor/node_dock.cpp
msgid "Select a single node to edit its signals and groups."
@@ -4062,7 +4110,7 @@ msgstr "시그널과 그룹을 편집할 노드 하나를 선택하세요."
#: editor/plugin_config_dialog.cpp
msgid "Edit a Plugin"
-msgstr "플러그인 편집하기"
+msgstr "플러그인 편집"
#: editor/plugin_config_dialog.cpp
msgid "Create a Plugin"
@@ -4097,7 +4145,7 @@ msgstr "폴리곤 만들기"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create points."
-msgstr "점 만들기."
+msgstr "점을 만듭니다."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
@@ -4105,8 +4153,8 @@ msgid ""
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
-"점 편집하기.\n"
-"좌클릭: 점 이동하기\n"
+"점을 편집합니다.\n"
+"좌클릭: 점 이동\n"
"우클릭: 점 지우기"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -4116,19 +4164,19 @@ msgstr "점 지우기."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Edit Polygon"
-msgstr "폴리곤 편집하기"
+msgstr "폴리곤 편집"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
-msgstr "점 삽입하기"
+msgstr "점 삽입"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Edit Polygon (Remove Point)"
-msgstr "폴리곤 편집하기 (점 삭제하기)"
+msgstr "폴리곤 편집 (점 삭제)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Remove Polygon And Point"
-msgstr "폴리곤과 점 삭제하기"
+msgstr "폴리곤과 점 삭제"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4136,7 +4184,7 @@ msgstr "폴리곤과 점 삭제하기"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Animation"
-msgstr "애니메이션 추가하기"
+msgstr "애니메이션 추가"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4148,7 +4196,7 @@ msgstr "불러오기..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Move Node Point"
-msgstr "노드 점 이동하기"
+msgstr "노드 점 이동"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Limits"
@@ -4162,25 +4210,25 @@ msgstr "BlendSpace1D 라벨 바꾸기"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr "이 유형의 노드를 사용할 수 없어요. 루트 노드만 쓸 수 있어요."
+msgstr "이 유형의 노드를 사용할 수 없습니다. 루트 노드만 쓸 수 있습니다."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Add Node Point"
-msgstr "노드 점 추가하기"
+msgstr "노드 점 추가"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Add Animation Point"
-msgstr "애니메이션 점 추가하기"
+msgstr "애니메이션 점 추가"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Remove BlendSpace1D Point"
-msgstr "BlendSpace1D 점 삭제하기"
+msgstr "BlendSpace1D 점 삭제"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
-msgstr "BlendSpace1D 노드 점 이동하기"
+msgstr "BlendSpace1D 노드 점 이동"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4190,23 +4238,23 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
-"AnimationTree가 꺼져 있어요.\n"
+"AnimationTree가 꺼져 있습니다.\n"
"재생하려면 AnimationTree를 켜고, 실행에 실패하면 노드 경고를 확인하세요."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr "공간 내의 혼합 지점 설정하기"
+msgstr "공간 내의 혼합 지점 설정"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr "점을 선택하고 이동해요. 우클릭으로 점을 만드세요."
+msgstr "점을 선택하고 이동합니다. 우클릭으로 점을 만드세요."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
msgid "Enable snap and show grid."
-msgstr "스냅을 켜고 격자를 보이게 해요."
+msgstr "스냅을 켜고 격자를 보이게 합니다."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4228,11 +4276,11 @@ msgstr "애니메이션 노드 열기"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Triangle already exists."
-msgstr "삼각형이 이미 있어요."
+msgstr "삼각형이 이미 있습니다."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Add Triangle"
-msgstr "삼각형 추가하기"
+msgstr "삼각형 추가"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Limits"
@@ -4244,19 +4292,19 @@ msgstr "BlendSpace2D 라벨 바꾸기"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Point"
-msgstr "BlendSpace2D 점 삭제하기"
+msgstr "BlendSpace2D 점 삭제"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
-msgstr "BlendSpace2D 삼각형 삭제하기"
+msgstr "BlendSpace2D 삼각형 삭제"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr "BlendSpace2D가 AnimationTree 노드에 속해있지 않아요."
+msgstr "BlendSpace2D가 AnimationTree 노드에 속해있지 않습니다."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr "삼각형이 없어요. 혼합이 일어나지 않을 거예요."
+msgstr "삼각형이 없습니다. 혼합이 일어나지 않을 것입니다."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Toggle Auto Triangles"
@@ -4264,7 +4312,7 @@ msgstr "자동 삼각형 토글"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr "점을 연결해서 삼각형을 만들어요."
+msgstr "점을 연결해서 삼각형을 만듭니다."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
@@ -4286,15 +4334,15 @@ msgstr "매개변수 변경됨"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Filters"
-msgstr "필터 편집하기"
+msgstr "필터 편집"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr "출력 노드를 혼합 트리에 추가할 수 없어요."
+msgstr "출력 노드를 혼합 트리에 추가할 수 없습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Add Node to BlendTree"
-msgstr "BlendTree에 노드 추가하기"
+msgstr "BlendTree에 노드 추가"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4303,7 +4351,7 @@ msgstr "노드 이동됨"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr "연결할 수 없어요. 포트가 사용 중이거나 연결이 잘못된 모양이에요."
+msgstr "연결할 수 없습니다. 포트가 사용 중이거나 연결이 잘못된 것 같습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4317,17 +4365,17 @@ msgstr "노드 연결 해제됨"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Set Animation"
-msgstr "애니메이션 설정하기"
+msgstr "애니메이션 설정"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Node"
-msgstr "노드 삭제하기"
+msgstr "노드 삭제"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
-msgstr "노드 삭제하기"
+msgstr "노드 삭제"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Toggle Filter On/Off"
@@ -4340,11 +4388,13 @@ msgstr "필터 바꾸기"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
-"애니메이션 플레이어가 설정되지 않았어요. 그래서 트랙 이름을 검색할 수 없어요."
+"애니메이션 플레이어가 설정되지 않았습니다. 그래서 트랙 이름을 검색할 수 없습"
+"니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr "플레이어 경로 설정이 잘못됐어요. 그래서 트랙 이름을 검색할 수 없어요."
+msgstr ""
+"플레이어 경로 설정이 잘못되었습니다. 그래서 트랙 이름을 검색할 수 없습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -4352,8 +4402,8 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
-"애니메이션 플레이어가 잘못된 루트 경로를 갖고 있어요. 그래서 트랙 이름을 검색"
-"할 수 없어요."
+"애니메이션 플레이어가 잘못된 루트 경로를 갖고 있습니다. 그래서 트랙 이름을 검"
+"색할 수 없습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Anim Clips"
@@ -4375,7 +4425,7 @@ msgstr "노드 이름 바뀜"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node..."
-msgstr "노드 추가하기..."
+msgstr "노드 추가..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -4410,15 +4460,15 @@ msgstr "애니메이션을 삭제할까요?"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Remove Animation"
-msgstr "애니메이션 삭제하기"
+msgstr "애니메이션 삭제"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Invalid animation name!"
-msgstr "애니메이션 이름이 잘못됐어요!"
+msgstr "애니메이션 이름이 잘못되었습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation name already exists!"
-msgstr "애니메이션 이름이 이미 있어요!"
+msgstr "애니메이션 이름이 이미 있습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -4439,15 +4489,15 @@ msgstr "애니메이션 불러오기"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
-msgstr "애니메이션 복제하기"
+msgstr "애니메이션 복제"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to copy!"
-msgstr "복사할 애니메이션이 없어요!"
+msgstr "복사할 애니메이션이 없습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation resource on clipboard!"
-msgstr "클립보드에 애니메이션 리소스가 없어요!"
+msgstr "클립보드에 애니메이션 리소스가 없습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -4459,27 +4509,27 @@ msgstr "애니메이션 붙여넣기"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to edit!"
-msgstr "편집할 애니메이션이 없어요!"
+msgstr "편집할 애니메이션이 없습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
-msgstr "선택한 애니메이션을 현재 위치에서 거꾸로 재생해요. (A)"
+msgstr "선택한 애니메이션을 현재 위치에서 거꾸로 재생합니다. (A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "선택한 애니메이션을 끝에서 거꾸로 재생해요. (Shift+A)"
+msgstr "선택한 애니메이션을 끝에서 거꾸로 재생합니다. (Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
-msgstr "애니메이션 재생을 멈춰요. (S)"
+msgstr "애니메이션 재생을 중단합니다. (S)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
-msgstr "선택한 애니메이션을 처음부터 재생해요. (Shift+D)"
+msgstr "선택한 애니메이션을 처음부터 재생합니다. (Shift+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
-msgstr "선택한 애니메이션을 현재 위치부터 재생해요. (D)"
+msgstr "선택한 애니메이션을 현재 위치부터 재생합니다. (D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation position (in seconds)."
@@ -4487,7 +4537,7 @@ msgstr "애니메이션 위치 (초)."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Scale animation playback globally for the node."
-msgstr "노드의 애니메이션 재생 길이를 전체적으로 조절해요."
+msgstr "노드의 애니메이션 재생 길이를 전체적으로 조절합니다."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
@@ -4495,11 +4545,11 @@ msgstr "애니메이션 도구"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation"
-msgstr "애니메이션(Animation)"
+msgstr "애니메이션"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Edit Transitions..."
-msgstr "전환 편집하기..."
+msgstr "전환 편집..."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Open in Inspector"
@@ -4507,11 +4557,11 @@ msgstr "인스펙터에서 열기"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
-msgstr "애니메이션 목록을 표시해요."
+msgstr "애니메이션 목록을 표시합니다."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Autoplay on Load"
-msgstr "불러올 시 자동으로 재생하기"
+msgstr "불러올 시 자동으로 재생"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Enable Onion Skinning"
@@ -4555,7 +4605,7 @@ msgstr "변경 사항만"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Force White Modulate"
-msgstr "강제 흰색 조절하기"
+msgstr "강제 흰색 조절"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
@@ -4563,7 +4613,7 @@ msgstr "기즈모 포함 (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pin AnimationPlayer"
-msgstr "AnimationPlayer 고정하기"
+msgstr "AnimationPlayer 고정"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -4594,20 +4644,20 @@ msgstr "교차-애니메이션 혼합 시간"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Move Node"
-msgstr "노드 이동하기"
+msgstr "노드 이동"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition exists!"
-msgstr "전환이 있어요!"
+msgstr "전환이 있습니다!"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Add Transition"
-msgstr "전환 추가하기"
+msgstr "전환 추가"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node"
-msgstr "노드 추가하기"
+msgstr "노드 추가"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
@@ -4631,7 +4681,7 @@ msgstr "진행"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr "하위 전환에는 시작과 끝 노드가 필요해요."
+msgstr "하위 전환에는 시작과 끝 노드가 필요합니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "No playback resource set at path: %s."
@@ -4647,7 +4697,7 @@ msgstr "전환 삭제됨"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
-msgstr "시작 노드 설정하기 (자동 재생)"
+msgstr "시작 노드 설정 (자동 재생)"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4655,29 +4705,30 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
-"노드를 선택하고 이동해요.\n"
-"우클릭으로 새 노드를 추가해요.\n"
-"Shift+좌클릭으로 연결을 만들어요."
+"노드를 선택하고 이동합니다.\n"
+"우클릭으로 새 노드를 추가합니다.\n"
+"Shift+좌클릭으로 연결을 만듭니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Create new nodes."
-msgstr "새 노드를 만들어요."
+msgstr "새 노드를 만듭니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Connect nodes."
-msgstr "노드를 연결해요."
+msgstr "노드를 연결합니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Remove selected node or transition."
-msgstr "선택한 노드나 전환을 삭제해요."
+msgstr "선택한 노드나 전환을 삭제합니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
-msgstr "이 애니메이션을 시작, 재시작, 혹은 0으로 가도록 자동 재생을 토글해요."
+msgstr ""
+"이 애니메이션을 시작, 재시작, 혹은 0으로 가도록 자동 재생을 토글합니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr "끝 애니메이션을 설정해요. 이것은 하위 전환에 유용해요."
+msgstr "끝 애니메이션을 설정합니다. 이것은 하위 전환에 유용합니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition: "
@@ -4758,7 +4809,7 @@ msgstr "현재:"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Input"
-msgstr "입력 추가하기"
+msgstr "입력 추가"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
@@ -4766,19 +4817,19 @@ msgstr "자동 진행 지우기"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
-msgstr "자동 진행 설정하기"
+msgstr "자동 진행 설정"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Delete Input"
-msgstr "입력 삭제하기"
+msgstr "입력 삭제"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is valid."
-msgstr "애니메이션 트리는 정상이에요."
+msgstr "애니메이션 트리는 정상입니다."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is invalid."
-msgstr "애니메이션 트리가 잘못됐어요."
+msgstr "애니메이션 트리가 잘못되었습니다."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation Node"
@@ -4822,7 +4873,7 @@ msgstr "애니메이션 가져오기..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr "노드 필터 편집하기"
+msgstr "노드 필터 편집"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
@@ -4926,11 +4977,11 @@ msgstr "대기"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Install..."
-msgstr "설치하기..."
+msgstr "설치..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
-msgstr "다시 시도하기"
+msgstr "다시 시도"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
@@ -4938,7 +4989,7 @@ msgstr "다운로드 오류"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
-msgstr "이 애셋은 이미 다운로드 중이에요!"
+msgstr "이 애셋은 이미 다운로드 중입니다!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
@@ -4986,7 +5037,7 @@ msgstr "모두"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr "\"%s\"에 대한 결과가 없어요."
+msgstr "\"%s\"에 대한 결과가 없습니다."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Import..."
@@ -5035,7 +5086,7 @@ msgid ""
"Save your scene (for images to be saved in the same dir), or pick a save "
"path from the BakedLightmap properties."
msgstr ""
-"라이트맵 이미지의 저장 경로를 파악할 수 없어요.\n"
+"라이트맵 이미지의 저장 경로를 파악할 수 없습니다.\n"
"(같은 경로에 이미지를 저장할 수 있도록) 씬을 저장하거나, BakedLightmap 속성에"
"서 저장 경로를 지정하세요."
@@ -5044,8 +5095,8 @@ msgid ""
"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
"Light' flag is on."
msgstr ""
-"라이트맵을 구울 메시가 없어요. 메시가 UV2 채널을 갖고 있고 'Bake Light' 플래"
-"그가 켜져 있는지 확인해주세요."
+"라이트맵을 구울 메시가 없습니다. 메시가 UV2 채널을 갖고 있고 'Bake Light' 플"
+"래그가 켜져 있는지 확인해주세요."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Failed creating lightmap images, make sure path is writable."
@@ -5056,7 +5107,7 @@ msgid "Bake Lightmaps"
msgstr "라이트맵 굽기"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "미리 보기"
@@ -5094,7 +5145,7 @@ msgstr "크기 조절 단계:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Vertical Guide"
-msgstr "수직 가이드 이동하기"
+msgstr "수직 가이드 이동"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Vertical Guide"
@@ -5102,11 +5153,11 @@ msgstr "수직 가이드 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Remove Vertical Guide"
-msgstr "수직 가이드 삭제하기"
+msgstr "수직 가이드 삭제"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Horizontal Guide"
-msgstr "수평 가이드 이동하기"
+msgstr "수평 가이드 이동"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Horizontal Guide"
@@ -5114,7 +5165,7 @@ msgstr "수평 가이드 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Remove Horizontal Guide"
-msgstr "수평 가이드 삭제하기"
+msgstr "수평 가이드 삭제"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Horizontal and Vertical Guides"
@@ -5122,19 +5173,19 @@ msgstr "수평 및 수직 가이드 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move pivot"
-msgstr "피벗 이동하기"
+msgstr "피벗 이동"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotate CanvasItem"
-msgstr "CanvasItem 회전하기"
+msgstr "CanvasItem 회전"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move anchor"
-msgstr "앵커 이동하기"
+msgstr "앵커 이동"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Resize CanvasItem"
-msgstr "CanvasItem 크기 조절하기"
+msgstr "CanvasItem 크기 조절"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale CanvasItem"
@@ -5142,13 +5193,13 @@ msgstr "CanvasItem 규모"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
-msgstr "CanvasItem 이동하기"
+msgstr "CanvasItem 이동"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"Children of containers have their anchors and margins values overridden by "
"their parent."
-msgstr "컨테이너의 자식은 부모로 인해 다시 정의된 앵커와 여백 값을 가져요."
+msgstr "컨테이너의 자식은 부모로 인해 재정의된 앵커와 여백 값을 가집니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Presets for the anchors and margins values of a Control node."
@@ -5158,7 +5209,7 @@ msgstr "Control 노드의 앵커와 여백 값의 프리셋."
msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
-msgstr "이 설정을 켜면, Control 노드는 움직이면서 여백이 아닌 앵커를 바꿔요."
+msgstr "이 설정을 켜면, Control 노드는 움직이면서 여백이 아닌 앵커를 바꿉니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Left"
@@ -5226,7 +5277,7 @@ msgstr "사각형 전체"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Keep Ratio"
-msgstr "비율 유지하기"
+msgstr "비율 유지"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5246,8 +5297,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
-"게임 카메라 다시 정의하기\n"
-"편집기 뷰포트 카메라로 게임 카메라를 다시 정의해요."
+"게임 카메라 다시 정의\n"
+"편집기 뷰포트 카메라로 게임 카메라를 다시 정의합니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5255,8 +5306,8 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
-"게임 카메라 다시 정의하기\n"
-"실행하고 있는 게임 인스턴스가 없어요."
+"게임 카메라 다시 정의\n"
+"실행하고 있는 게임 인스턴스가 없습니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5306,7 +5357,7 @@ msgstr "IK 체인 지우기"
msgid ""
"Warning: Children of a container get their position and size determined only "
"by their parent."
-msgstr "경고: 컨테이너의 자식 규모와 위치는 부모에 의해 결정돼요."
+msgstr "경고: 컨테이너의 자식 규모와 위치는 부모에 의해 결정됩니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -5325,7 +5376,7 @@ msgstr "드래그: 회전"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
-msgstr "Alt+드래그: 이동하기"
+msgstr "Alt+드래그: 이동"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
@@ -5333,7 +5384,7 @@ msgstr "'v'키로 피벗 바꾸기. 'Shift+v'키로 피벗 드래그 (이동하
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+우클릭: 겹친 목록 선택하기"
+msgstr "Alt+우클릭: 겹친 목록 선택"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5361,7 +5412,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
-msgstr "클릭으로 객체의 회전 피벗을 바꿔요."
+msgstr "클릭으로 객체의 회전 피벗을 바꿉니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan Mode"
@@ -5377,7 +5428,7 @@ msgstr "스마트 스냅 토글."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Smart Snap"
-msgstr "스마트 스냅 사용하기"
+msgstr "스마트 스냅 사용"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle grid snapping."
@@ -5385,7 +5436,7 @@ msgstr "격자 스냅 토글."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
-msgstr "격자 스냅 사용하기"
+msgstr "격자 스냅 사용"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
@@ -5393,11 +5444,11 @@ msgstr "스냅 설정"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
-msgstr "회전 스냅 사용하기"
+msgstr "회전 스냅 사용"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Scale Snap"
-msgstr "스마트 스냅 사용하기"
+msgstr "스마트 스냅 사용"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
@@ -5405,7 +5456,7 @@ msgstr "상대적인 스냅"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Pixel Snap"
-msgstr "픽셀 스냅 사용하기"
+msgstr "픽셀 스냅 사용"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Smart Snapping"
@@ -5414,7 +5465,7 @@ msgstr "스마트 스냅"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Configure Snap..."
-msgstr "스냅 설정하기..."
+msgstr "스냅 설정..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
@@ -5443,22 +5494,22 @@ msgstr "가이드에 스냅"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr "선택한 객체를 그 자리에 잠가요 (움직일 수 없어요)."
+msgstr "선택한 객체를 그 자리에 잠가요 (움직일 수 없습니다)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
-msgstr "선택한 객체를 잠금에서 풀어요 (움직일 수 있어요)."
+msgstr "선택한 객체를 잠금에서 풀 (움직일 수 있습니다)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Makes sure the object's children are not selectable."
-msgstr "객체의 자식을 선택하지 않도록 해요."
+msgstr "객체의 자식을 선택하지 않도록 합니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
-msgstr "객체의 자식을 선택할 수 있도록 해요."
+msgstr "객체의 자식을 선택할 수 있도록 합니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Skeleton Options"
@@ -5544,14 +5595,14 @@ msgid ""
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
-"객체를 전환, 회전 또는 크기 조절할 때마다 자동으로 키를 삽입해요 (마스크 기"
+"객체를 전환, 회전 또는 크기 조절할 때마다 자동으로 키를 삽입합니다 (마스크 기"
"준).\n"
-"키는 기존 트랙에만 추가되고, 새 트랙을 추가하진 않아요.\n"
-"처음에는 수동으로 키를 삽입해야 해요."
+"키는 기존 트랙에만 추가되고, 새 트랙을 추가하진 않습니다.\n"
+"처음에는 수동으로 키를 삽입해야 합니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Auto Insert Key"
-msgstr "자동으로 키 삽입하기"
+msgstr "자동으로 키 삽입"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Animation Key and Pose Options"
@@ -5559,11 +5610,11 @@ msgstr "애니메이션 키와 포즈 설정"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr "키 삽입하기 (기존 트랙)"
+msgstr "키 삽입 (기존 트랙)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
-msgstr "포즈 복사하기"
+msgstr "포즈 복사"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Pose"
@@ -5583,7 +5634,7 @@ msgstr "팬 보기"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
-msgstr "%s 추가하기"
+msgstr "%s 추가"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Adding %s..."
@@ -5591,7 +5642,7 @@ msgstr "%s 추가하는 중..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
-msgstr "루트 노드 없이는 여러 노드를 인스턴스할 수 없어요."
+msgstr "루트 노드 없이는 여러 노드를 인스턴스할 수 없습니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -5612,7 +5663,7 @@ msgid ""
"Drag & drop + Shift : Add node as sibling\n"
"Drag & drop + Alt : Change node type"
msgstr ""
-"드래그 & 드롭 + Shift : 형제 노드로 추가하기\n"
+"드래그 & 드롭 + Shift : 형제 노드로 추가\n"
"드래그 & 드롭 + Alt : 노드 유형 바꾸기"
#: editor/plugins/collision_polygon_editor_plugin.cpp
@@ -5621,15 +5672,15 @@ msgstr "Polygon3D 만들기"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
-msgstr "폴리곤 편집하기"
+msgstr "폴리곤 편집"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly (Remove Point)"
-msgstr "폴리곤 편집하기 (점 삭제하기)"
+msgstr "폴리곤 편집 (점 삭제)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
-msgstr "핸들 설정하기"
+msgstr "핸들 설정"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5641,7 +5692,7 @@ msgstr "방출 마스크 불러오기"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Restart"
-msgstr "다시 시작하기"
+msgstr "다시 시작"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5725,11 +5776,11 @@ msgstr "부드러운 단계"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Point"
-msgstr "곡선 점 수정하기"
+msgstr "곡선 점 수정"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Tangent"
-msgstr "곡선 탄젠트 수정하기"
+msgstr "곡선 탄젠트 수정"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Load Curve Preset"
@@ -5737,11 +5788,11 @@ msgstr "곡선 프리셋 불러오기"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Add Point"
-msgstr "점 추가하기"
+msgstr "점 추가"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove Point"
-msgstr "점 삭제하기"
+msgstr "점 삭제"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Left Linear"
@@ -5757,7 +5808,7 @@ msgstr "프리셋 불러오기"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove Curve Point"
-msgstr "곡선 점 삭제하기"
+msgstr "곡선 점 삭제"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Toggle Curve Linear Tangent"
@@ -5765,7 +5816,7 @@ msgstr "곡선 선형 탄젠트 토글"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Hold Shift to edit tangents individually"
-msgstr "Shift키를 눌러서 탄젠트를 개별적으로 편집하기"
+msgstr "Shift키를 눌러서 탄젠트를 개별적으로 편집"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Right click to add point"
@@ -5797,31 +5848,47 @@ msgstr "Occluder 폴리곤 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
-msgstr "메시가 없어요!"
+msgstr "메시가 없습니다!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Static Trimesh Body 만들기"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Trimesh 충돌 모양을 만들 수 없습니다."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Static Convex Body 만들기"
+msgid "Create Static Trimesh Body"
+msgstr "Static Trimesh Body 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
-msgstr "씬 루트에서 작업할 수 없어요!"
+msgstr "씬 루트에서 작업할 수 없습니다!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Shape"
msgstr "Trimesh Static Shape 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Shape 만들기 실패!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "씬 루트에서 단일 convex 충돌 Shape를 만들 수 없습니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "단일 convex 충돌 모양을 만들 수 없습니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "개별 Convex 모양 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Convex Shape 만들기"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "씬 루트에 다중 convex 충돌 모양을 만들 수 없습니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "충돌 모양을 만들 수 없습니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "다중 Convex Shape 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5829,35 +5896,35 @@ msgstr "내비게이션 메시 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr "갖고 있는 메시가 ArrayMesh 유형이 아니에요."
+msgstr "갖고 있는 메시가 ArrayMesh 유형이 아닙니다."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr "UV 펼치기를 실패했어요. 메시가 다양한 것 같은데요?"
+msgstr "UV 펼치기를 실패했습니다. 메시가 다양한 것 같은데요?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
-msgstr "디버그할 메시가 없어요."
+msgstr "디버그할 메시가 없습니다."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Model has no UV in this layer"
-msgstr "이 레이어에서 모델은 UV가 없어요"
+msgstr "이 레이어에서 모델은 UV가 없습니다"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
-msgstr "MeshInstance에 메시가 없어요!"
+msgstr "MeshInstance에 메시가 없습니다!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh has not surface to create outlines from!"
-msgstr "메시에 윤곽을 만들 표면이 없어요!"
+msgstr "메시에 윤곽을 만들 표면이 없습니다!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr "메시 기본 유형이 PRIMITIVE_TRIANGLES이 아니에요!"
+msgstr "메시 기본 유형이 PRIMITIVE_TRIANGLES이 아닙니다!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
-msgstr "윤곽을 만들 수 없어요!"
+msgstr "윤곽을 만들 수 없습니다!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline"
@@ -5872,18 +5939,66 @@ msgid "Create Trimesh Static Body"
msgstr "Trimesh Static Body 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"StaticBody를 하나 만들고 거기에 폴리곤 기반 충돌 모양을 하나 자동으로 만들어 "
+"붙입니다.\n"
+"이 방법은 가장 정확한 (하지만 가장 느린) 충돌 탐지 방법입니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Trimesh 충돌 형제 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Convex 충돌 형제 만들기"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"폴리곤 기반 충돌 모양을 하나 만듭니다.\n"
+"이 방법은 가장 정확한 (하지만 가장 느린) 충돌 탐지 방법입니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "단일 Convex 충돌 형제 만들기"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"convex 충돌 모양을 하나 만듭니다.\n"
+"이 방법은 가장 빠른 (하지만 덜 정확한) 충돌 탐지 방법입니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "다중 Convex 충돌 형제 만들기"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"폴리곤 기반 충돌 모양을 하나 만듭니다.\n"
+"이 방법은 위 두 가지 옵션의 중간 정도 성능입니다."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "윤곽 메시 만들기..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"정적 외곽선 메시를 만듭니다. 외곽선 메시의 법선 벡터는 자동으로 반전됩니다.\n"
+"SpatialMaterial의 Grow 속성을 사용할 수 없을 때 대신 사용할 수 있습니다."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "UV1 보기"
@@ -5926,11 +6041,11 @@ msgstr "메시 라이브러리"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Item"
-msgstr "항목 추가하기"
+msgstr "항목 추가"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove Selected Item"
-msgstr "선택한 항목 삭제하기"
+msgstr "선택한 항목 삭제"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import from Scene"
@@ -5938,52 +6053,53 @@ msgstr "씬에서 가져오기"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Update from Scene"
-msgstr "씬에서 업데이트하기"
+msgstr "씬에서 업데이트"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
msgstr ""
-"메시 소스를 지정하지 않았어요 (그리고 노드에 MultiMesh를 설정하지 않았어요)."
+"메시 소스를 지정하지 않았습니다 (그리고 노드에 MultiMesh를 설정하지 않았습니"
+"다)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr "메시 소스를 지정하지 않았어요 (그리고 MultiMesh에 메시가 없어요)."
+msgstr "메시 소스를 지정하지 않았습니다 (그리고 MultiMesh에 메시가 없습니다)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
-msgstr "메시 소스가 잘못됐어요 (잘못된 경로)."
+msgstr "메시 소스가 잘못되었습니다 (잘못된 경로)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr "메시 소스가 잘못됐어요 (MeshInstance가 아님)."
+msgstr "메시 소스가 잘못되었습니다 (MeshInstance가 아님)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr "메시 소스가 잘못됐어요 (Mesh 리소스가 없음)."
+msgstr "메시 소스가 잘못되었습니다 (Mesh 리소스가 없음)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No surface source specified."
-msgstr "표면 소스를 지정하지 않았어요."
+msgstr "표면 소스를 지정하지 않았습니다."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (invalid path)."
-msgstr "표면 소스가 잘못됐어요 (잘못된 경로)."
+msgstr "표면 소스가 잘못되었습니다 (잘못된 경로)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no geometry)."
-msgstr "표면 소스가 잘못됐어요 (형태 없음)."
+msgstr "표면 소스가 잘못되었습니다 (형태 없음)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no faces)."
-msgstr "표면 소스가 잘못됐어요 (면 없음)."
+msgstr "표면 소스가 잘못되었습니다 (면 없음)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
-msgstr "소스 메시 선택하기:"
+msgstr "소스 메시를 선택하세요:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Target Surface:"
-msgstr "대상 표면 선택하기:"
+msgstr "대상 표면을 선택하세요:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate Surface"
@@ -6041,7 +6157,7 @@ msgstr "내비게이션 폴리곤 만들기"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Convert to CPUParticles"
-msgstr "CPU파티클로 변환하기"
+msgstr "CPU파티클로 변환"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generating Visibility Rect"
@@ -6049,11 +6165,11 @@ msgstr "가시성 직사각형 만들기"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generate Visibility Rect"
-msgstr "가시성 직사각형을 만들어요"
+msgstr "가시성 직사각형을 만듭니다"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
-msgstr "ParticlesMaterial 프로세스 머티리얼 안에만 점을 설정할 수 있어요"
+msgstr "ParticlesMaterial 프로세스 머티리얼 안에만 점을 설정할 수 있습니다"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -6062,23 +6178,23 @@ msgstr "생성 시간 (초):"
#: editor/plugins/particles_editor_plugin.cpp
msgid "The geometry's faces don't contain any area."
-msgstr "형태의 표면에 영역이 없어요."
+msgstr "형태의 표면에 영역이 없습니다."
#: editor/plugins/particles_editor_plugin.cpp
msgid "The geometry doesn't contain any faces."
-msgstr "형태에 면이 없어요."
+msgstr "형태에 면이 없습니다."
#: editor/plugins/particles_editor_plugin.cpp
msgid "\"%s\" doesn't inherit from Spatial."
-msgstr "\"%s\"은(는) Spatial을 상속받지 않아요."
+msgstr "\"%s\"은(는) Spatial을 상속받지 않습니다."
#: editor/plugins/particles_editor_plugin.cpp
msgid "\"%s\" doesn't contain geometry."
-msgstr "\"%s\"에 형태가 없어요."
+msgstr "\"%s\"에 형태가 없습니다."
#: editor/plugins/particles_editor_plugin.cpp
msgid "\"%s\" doesn't contain face geometry."
-msgstr "\"%s\"에 면 형태가 없어요."
+msgstr "\"%s\"에 면 형태가 없습니다."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -6106,7 +6222,7 @@ msgstr "방출 소스: "
#: editor/plugins/particles_editor_plugin.cpp
msgid "A processor material of type 'ParticlesMaterial' is required."
-msgstr "'ParticlesMaterial' 유형의 프로세서 머티리얼이 필요해요."
+msgstr "'ParticlesMaterial' 유형의 프로세서 머티리얼이 필요합니다."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generating AABB"
@@ -6122,20 +6238,20 @@ msgstr "AABB 만들기"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Point from Curve"
-msgstr "곡선에서 점 삭제하기"
+msgstr "곡선에서 점 삭제"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Out-Control from Curve"
-msgstr "곡선의 아웃-컨트롤 삭제하기"
+msgstr "곡선의 아웃-컨트롤 삭제"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove In-Control from Curve"
-msgstr "곡선의 인-컨트롤 삭제하기"
+msgstr "곡선의 인-컨트롤 삭제"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Add Point to Curve"
-msgstr "곡선에 점 추가하기"
+msgstr "곡선에 점 추가"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Split Curve"
@@ -6143,30 +6259,30 @@ msgstr "곡선 가르기"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
-msgstr "곡선의 점 이동하기"
+msgstr "곡선의 점 이동"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move In-Control in Curve"
-msgstr "곡선의 인-컨트롤 이동하기"
+msgstr "곡선의 인-컨트롤 이동"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Out-Control in Curve"
-msgstr "곡선의 아웃-컨트롤 이동하기"
+msgstr "곡선의 아웃-컨트롤 이동"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Select Points"
-msgstr "점 선택하기"
+msgstr "점 선택"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Shift+Drag: Select Control Points"
-msgstr "Shift+드래그: 컨트롤 점 선택하기"
+msgstr "Shift+드래그: 컨트롤 점 선택"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Click: Add Point"
-msgstr "클릭: 점 추가하기"
+msgstr "클릭: 점 추가"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Left Click: Split Segment (in curve)"
@@ -6175,21 +6291,21 @@ msgstr "좌클릭: (곡선에서) 선분 가르기"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr "우클릭: 점 삭제하기"
+msgstr "우클릭: 점 삭제"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
-msgstr "컨트롤 점 선택하기 (Shift+드래그)"
+msgstr "컨트롤 점 선택 (Shift+드래그)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Add Point (in empty space)"
-msgstr "(빈 공간에) 점 추가하기"
+msgstr "(빈 공간에) 점 추가"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
-msgstr "점 삭제하기"
+msgstr "점 삭제"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -6218,15 +6334,15 @@ msgstr "곡선 점 #"
#: editor/plugins/path_editor_plugin.cpp
msgid "Set Curve Point Position"
-msgstr "곡선 점 위치 설정하기"
+msgstr "곡선 점 위치 설정"
#: editor/plugins/path_editor_plugin.cpp
msgid "Set Curve In Position"
-msgstr "곡선의 인 위치 설정하기"
+msgstr "곡선의 인 위치 설정"
#: editor/plugins/path_editor_plugin.cpp
msgid "Set Curve Out Position"
-msgstr "곡선의 아웃 위치 설정하기"
+msgstr "곡선의 아웃 위치 설정"
#: editor/plugins/path_editor_plugin.cpp
msgid "Split Path"
@@ -6234,15 +6350,15 @@ msgstr "경로 가르기"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove Path Point"
-msgstr "경로 점 삭제하기"
+msgstr "경로 점 삭제"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove Out-Control Point"
-msgstr "아웃-컨트롤 점 삭제하기"
+msgstr "아웃-컨트롤 점 삭제"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove In-Control Point"
-msgstr "인-컨트롤 점 삭제하기"
+msgstr "인-컨트롤 점 삭제"
#: editor/plugins/path_editor_plugin.cpp
msgid "Split Segment (in curve)"
@@ -6250,12 +6366,12 @@ msgstr "(곡선에서) 선분 가르기"
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move Joint"
-msgstr "관절 이동하기"
+msgstr "관절 이동"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr "Polygon2D의 Skeleton 속성이 Skeleton2D 노드를 향하지 않아요"
+msgstr "Polygon2D의 Skeleton 속성이 Skeleton2D 노드를 향하지 않습니다"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Sync Bones"
@@ -6266,7 +6382,7 @@ msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
msgstr ""
-"이 폴리곤에 텍스처가 없어요.\n"
+"이 폴리곤에 텍스처가 없습니다.\n"
"UV를 편집하려면 텍스처를 설정하세요."
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -6277,7 +6393,8 @@ msgstr "UV 맵 만들기"
msgid ""
"Polygon 2D has internal vertices, so it can no longer be edited in the "
"viewport."
-msgstr "Polygon2D에 내부 꼭짓점이 있어요. 더 이상 뷰포트에서 편집할 수 없어요."
+msgstr ""
+"Polygon2D에 내부 꼭짓점이 있습니다. 더 이상 뷰포트에서 편집할 수 없습니다."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create Polygon & UV"
@@ -6289,31 +6406,31 @@ msgstr "내부 꼭짓점 만들기"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Remove Internal Vertex"
-msgstr "내부 꼭짓점 삭제하기"
+msgstr "내부 꼭짓점 삭제"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Invalid Polygon (need 3 different vertices)"
-msgstr "잘못된 폴리곤 (3개의 다른 꼭짓점이 필요해요)"
+msgstr "잘못된 폴리곤 (3개의 다른 꼭짓점이 필요합니다)"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Add Custom Polygon"
-msgstr "맞춤 폴리곤 추가하기"
+msgstr "맞춤 폴리곤 추가"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Remove Custom Polygon"
-msgstr "맞춤 폴리곤 삭제하기"
+msgstr "맞춤 폴리곤 삭제"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
-msgstr "UV 맵 변형하기"
+msgstr "UV 맵 변형"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform Polygon"
-msgstr "폴리곤 변형하기"
+msgstr "폴리곤 변형"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint Bone Weights"
-msgstr "본 가중치 칠하기"
+msgstr "본 가중치 칠"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Open Polygon 2D UV editor."
@@ -6341,51 +6458,51 @@ msgstr "본"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Points"
-msgstr "점 이동하기"
+msgstr "점 이동"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
-msgstr "Ctrl: 회전하기"
+msgstr "Ctrl: 회전"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
-msgstr "Shift: 모두 이동하기"
+msgstr "Shift: 모두 이동"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
-msgstr "Shift+Ctrl: 크기 조절하기"
+msgstr "Shift+Ctrl: 크기 조절"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
-msgstr "폴리곤 이동하기"
+msgstr "폴리곤 이동"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Rotate Polygon"
-msgstr "폴리곤 회전하기"
+msgstr "폴리곤 회전"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Scale Polygon"
-msgstr "폴리곤 크기 조절하기"
+msgstr "폴리곤 크기 조절"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create a custom polygon. Enables custom polygon rendering."
-msgstr "맞춤 폴리곤을 만들어요. 맞춤 폴리곤 렌더링을 켜세요."
+msgstr "맞춤 폴리곤을 만듭니다. 맞춤 폴리곤 렌더링을 켜세요."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"Remove a custom polygon. If none remain, custom polygon rendering is "
"disabled."
msgstr ""
-"맞춤 폴리곤을 삭제해요. 남아있는 맞춤 폴리곤이 없으면, 맞춤 폴리곤 렌더링은 "
-"꺼져요."
+"맞춤 폴리곤을 삭제합니다. 남아있는 맞춤 폴리곤이 없으면, 맞춤 폴리곤 렌더링"
+"은 꺼집니다."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint weights with specified intensity."
-msgstr "지정한 강도로 가중치를 칠해요."
+msgstr "지정한 강도로 가중치를 칠합니다."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Unpaint weights with specified intensity."
-msgstr "지정한 강도로 가중치를 지워요."
+msgstr "지정한 강도로 가중치를 지웁니다."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
@@ -6449,11 +6566,11 @@ msgstr "본을 폴리곤에 동기화"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
-msgstr "오류: 리소스를 불러올 수 없어요!"
+msgstr "오류: 리소스를 불러올 수 없습니다!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
-msgstr "리소스 추가하기"
+msgstr "리소스 추가"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Rename Resource"
@@ -6462,11 +6579,11 @@ msgstr "리소스 이름 바꾸기"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Resource"
-msgstr "리소스 삭제하기"
+msgstr "리소스 삭제"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Resource clipboard is empty!"
-msgstr "리소스 클립보드가 비었어요!"
+msgstr "리소스 클립보드가 비었습니다!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Paste Resource"
@@ -6499,11 +6616,11 @@ msgstr "리소스 프리로더"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr "AnimationTree에 AnimationPlayer를 향하는 경로가 없어요"
+msgstr "AnimationTree에 AnimationPlayer를 향하는 경로가 없습니다"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "Path to AnimationPlayer is invalid"
-msgstr "AnimationPlayer를 향하는 경로가 잘못됐어요"
+msgstr "AnimationPlayer를 향하는 경로가 잘못되었습니다"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -6551,26 +6668,26 @@ msgstr "파일 열기"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save File As..."
-msgstr "다른 이름으로 저장하기..."
+msgstr "다른 이름으로 저장..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr "실행하기 위한 스크립트를 가질 수 없어요."
+msgstr "실행하기 위한 스크립트를 가질 수 없습니다."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr "스크립트 다시 불러오기에 실패했어요. 콘솔에서 오류를 확인하세요."
+msgstr "스크립트 새로고침에 실패했습니다. 콘솔에서 오류를 확인하세요."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr "스크립트가 Tool 모드가 아니에요. 실행할 수 없을 거예요."
+msgstr "스크립트가 Tool 모드가 아닙니다. 실행할 수 없을 것입니다."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
"이 스크립트를 실행하려면, 반드시 EditorScript에 속해야 하며, Tool 모드로 설정"
-"되어 있어야 해요."
+"되어 있어야 합니다."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6586,7 +6703,7 @@ msgstr "저장 중 오류"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
-msgstr "테마를 다른 이름으로 저장하기..."
+msgstr "테마를 다른 이름으로 저장..."
#: editor/plugins/script_editor_plugin.cpp
msgid "%s Class Reference"
@@ -6608,7 +6725,7 @@ msgstr "스크립트 필터"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr "메서드 목록의 사전 식 정렬을 토글해요."
+msgstr "메서드 목록의 사전 식 정렬을 토글합니다."
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter methods"
@@ -6616,19 +6733,19 @@ msgstr "메서드 필터"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
-msgstr "정렬하기"
+msgstr "정렬"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Up"
-msgstr "위로 이동하기"
+msgstr "위로 이동"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr "아래로 이동하기"
+msgstr "아래로 이동"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
@@ -6652,15 +6769,15 @@ msgstr "닫은 스크립트 다시 열기"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
-msgstr "모두 저장하기"
+msgstr "모두 저장"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "스크립트 다시 불러오기"
+msgstr "스크립트 새로고침"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
-msgstr "스크립트 경로 복사하기"
+msgstr "스크립트 경로 복사"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Previous"
@@ -6681,11 +6798,11 @@ msgstr "테마 가져오기..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
-msgstr "테마 다시 불러오기"
+msgstr "테마 새로고침"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme"
-msgstr "테마 저장하기"
+msgstr "테마 저장"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
@@ -6697,24 +6814,24 @@ msgstr "문서 닫기"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
-msgstr "실행하기"
+msgstr "실행"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
-msgstr "프로시저 단위 실행하기"
+msgstr "프로시저 단위 실행"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
-msgstr "한 단계식 코드 실행하기"
+msgstr "한 단계식 코드 실행"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
-msgstr "정지하기"
+msgstr "정지"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
msgid "Continue"
-msgstr "계속하기"
+msgstr "계속"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
@@ -6726,27 +6843,19 @@ msgstr "외부 편집기로 디버깅"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation."
-msgstr "Godot 온라인 문서를 열어요."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "문서 요청"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "피드백으로 Godot 문서를 개선하는데 도와주세요."
+msgstr "Godot 온라인 문서를 열."
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
-msgstr "참조 문서 검색하기."
+msgstr "참조 문서 검색."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to previous edited document."
-msgstr "이전에 편집한 문서로 이동해요."
+msgstr "이전에 편집한 문서로 이동합니다."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
-msgstr "다음에 편집한 문서로 이동해요."
+msgstr "다음에 편집한 문서로 이동합니다."
#: editor/plugins/script_editor_plugin.cpp
msgid "Discard"
@@ -6757,18 +6866,18 @@ msgid ""
"The following files are newer on disk.\n"
"What action should be taken?:"
msgstr ""
-"해당 파일은 디스크에 있는 게 더 최신이에요.\n"
+"해당 파일은 디스크에 있는 게 더 최신입니다.\n"
"어떻게 할 건가요?:"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Reload"
-msgstr "다시 불러오기"
+msgstr "새로고침"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Resave"
-msgstr "다시 저장하기"
+msgstr "다시 저장"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
@@ -6784,7 +6893,7 @@ msgstr "최근 스크립트 지우기"
#: editor/plugins/script_text_editor.cpp
msgid "Connections to method:"
-msgstr "메서드에 연결하기:"
+msgstr "메서드에 연결:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
msgid "Source"
@@ -6798,30 +6907,30 @@ msgstr "Target(대상)"
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
msgstr ""
-"메서드 '%s'이(가) 시그널 '%s'을 노드 '%s'에서 노드 '%s'으로 연결하지 않았어"
-"요."
+"메서드 '%s'이(가) 시그널 '%s'을 노드 '%s'에서 노드 '%s'으로 연결하지 않았습니"
+"다."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "행"
+msgid "[Ignore]"
+msgstr "[무시]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(무시함)"
+msgid "Line"
+msgstr "행"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
-msgstr "함수로 이동하기"
+msgstr "함수로 이동"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
-msgstr "파일 시스템의 리소스만 드롭할 수 있어요."
+msgstr "파일 시스템의 리소스만 드롭할 수 있습니다."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
msgstr ""
-"스크립트 '%s'이(가) 이 씬에서 사용되지 않고 있어서 노드를 드롭할 수 없어요."
+"스크립트 '%s'이(가) 이 씬에서 사용되지 않고 있어서 노드를 드롭할 수 없습니다."
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
@@ -6829,11 +6938,11 @@ msgstr "룩업 기호"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
-msgstr "색상 선택하기"
+msgstr "색상 선택"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Convert Case"
-msgstr "대소문자 변환하기"
+msgstr "대소문자 변환"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Uppercase"
@@ -6845,16 +6954,16 @@ msgstr "소문자로 바꾸기"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "대문자로 시작하기"
+msgstr "대문자로 시작"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr "구문 강조하기"
+msgstr "구문 강조"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
-msgstr "이동하기"
+msgstr "이동"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
@@ -6873,11 +6982,11 @@ msgstr "잘라내기"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Select All"
-msgstr "모두 선택하기"
+msgstr "모두 선택"
#: editor/plugins/script_text_editor.cpp
msgid "Delete Line"
-msgstr "행 삭제하기"
+msgstr "행 삭제"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
@@ -6905,7 +7014,7 @@ msgstr "모든 행 펼치기"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr "아래로 복제하기"
+msgstr "아래로 복제"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
@@ -6913,19 +7022,19 @@ msgstr "자동 완성"
#: editor/plugins/script_text_editor.cpp
msgid "Evaluate Selection"
-msgstr "선택 항목 평가하기"
+msgstr "선택 항목 평가"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "후행 공백 문자 삭제하기"
+msgstr "후행 공백 문자 삭제"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
-msgstr "공백으로 들여쓰도록 변환하기"
+msgstr "공백으로 들여쓰도록 변환"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Tabs"
-msgstr "탭으로 들여쓰도록 변환하기"
+msgstr "탭으로 들여쓰도록 변환"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -6945,23 +7054,23 @@ msgstr "북마크 토글"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Bookmark"
-msgstr "다음 북마크로 이동하기"
+msgstr "다음 북마크로 이동"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Bookmark"
-msgstr "이전 북마크로 이동하기"
+msgstr "이전 북마크로 이동"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Bookmarks"
-msgstr "모든 북마크 삭제하기"
+msgstr "모든 북마크 삭제"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
-msgstr "함수로 이동하기..."
+msgstr "함수로 이동..."
#: editor/plugins/script_text_editor.cpp
msgid "Go to Line..."
-msgstr "행으로 이동하기..."
+msgstr "행으로 이동..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -6970,22 +7079,22 @@ msgstr "중단점 토글"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "중단점 모두 삭제하기"
+msgstr "중단점 모두 삭제"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Breakpoint"
-msgstr "다음 중단점으로 이동하기"
+msgstr "다음 중단점으로 이동"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Breakpoint"
-msgstr "이전 중단점으로 이동하기"
+msgstr "이전 중단점으로 이동"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"이 셰이더는 디스크에서 수정했어요.\n"
+"이 셰이더는 디스크에서 수정했습니다.\n"
"어떤 행동을 할 건가요?"
#: editor/plugins/shader_editor_plugin.cpp
@@ -6994,7 +7103,7 @@ msgstr "셰이더"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr "이 스켈레톤에는 본이 없어요. Bone2D노드를 자식으로 만드세요."
+msgstr "이 스켈레톤에는 본이 없습니다. Bone2D노드를 자식으로 만드세요."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Create Rest Pose from Bones"
@@ -7002,7 +7111,7 @@ msgstr "본의 대기 자세 만들기"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Rest Pose to Bones"
-msgstr "본에게 대기 자세 설정하기"
+msgstr "본에게 대기 자세 설정"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Skeleton2D"
@@ -7014,7 +7123,7 @@ msgstr "(본의) 대기 자세 만들기"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr "본을 대기 자세로 설정하기"
+msgstr "본을 대기 자세로 설정"
#: editor/plugins/skeleton_editor_plugin.cpp
msgid "Create physical bones"
@@ -7030,7 +7139,7 @@ msgstr "물리적 스켈레톤 만들기"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
msgid "Play IK"
-msgstr "IK 실행하기"
+msgstr "IK 실행"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -7070,15 +7179,15 @@ msgstr "이동 중: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
-msgstr "%s도로 회전하기."
+msgstr "%s도로 회전."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Keying is disabled (no key inserted)."
-msgstr "키가 꺼져 있어요 (키가 삽입되지 않아요)."
+msgstr "키가 꺼져 있습니다 (키가 삽입되지 않습니다)."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Animation Key Inserted."
-msgstr "애니메이션 키를 삽입했어요."
+msgstr "애니메이션 키를 삽입했습니다."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pitch"
@@ -7158,19 +7267,23 @@ msgstr "뒷면"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "변형을 뷰에 정렬하기"
+msgstr "변형을 뷰에 정렬"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
-msgstr "회전을 뷰에 정렬하기"
+msgstr "회전을 뷰에 정렬"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
-msgstr "자식을 인스턴스할 부모가 없어요."
+msgstr "자식을 인스턴스할 부모가 없습니다."
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "This operation requires a single selected node."
-msgstr "이 작업은 하나의 노드를 선택해야 해요."
+msgstr "이 작업은 하나의 노드를 선택해야 합니다."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "자동 직교 활성화"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
@@ -7178,19 +7291,19 @@ msgstr "뷰 회전 잠금"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
-msgstr "노멀 표시하기"
+msgstr "노멀 표시"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Wireframe"
-msgstr "와이어프레임 표시하기"
+msgstr "와이어프레임 표시"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Overdraw"
-msgstr "오버드로 표시하기"
+msgstr "오버드로 표시"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Unshaded"
-msgstr "셰이더 없음 표시하기"
+msgstr "셰이더 없음 표시"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Environment"
@@ -7226,7 +7339,7 @@ msgstr "시네마틱 미리 보기"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
-msgstr "GLES2 렌더러에서 사용할 수 없어요."
+msgstr "GLES2 렌더러에서 사용할 수 없습니다."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7261,28 +7374,42 @@ msgid "Freelook Slow Modifier"
msgstr "자유 시점 느린 수정자"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "뷰 회전 잠김"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
-"참고: FPS 값은 편집기의 프레임으로 표시돼요.\n"
-"이것이 게임 내 성능을 보장할 수 없어요."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "뷰 회전 잠김"
+"참고: FPS 값은 편집기의 프레임으로 표시됩니다.\n"
+"이것이 게임 내 성능을 보장할 수 없습니다."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm 대화 상자"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"표시 상태를 토글하려면 클릭하세요.\n"
+"\n"
+"열린 눈: 기즈모가 보입니다.\n"
+"닫힌 눈: 기즈모가 숨겨집니다.\n"
+"반 열린 눈: 불투명한 표면에도 기즈모가 보입니다 (\"엑스레이\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "노드를 바닥에 스냅"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr "선택 항목을 스냅할 바닥을 찾을 수 없어요."
+msgstr "선택 항목을 스냅할 바닥을 찾을 수 없습니다."
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7290,17 +7417,17 @@ msgid ""
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
msgstr ""
-"드래그: 회전하기\n"
-"Alt+드래그: 이동하기\n"
-"Alt+우클릭: 겹친 목록 선택하기"
+"드래그: 회전\n"
+"Alt+드래그: 이동\n"
+"Alt+우클릭: 겹친 목록 선택"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Local Space"
-msgstr "로컬 스페이스 사용하기"
+msgstr "로컬 스페이스 사용"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "스냅 사용하기"
+msgstr "스냅 사용"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7332,7 +7459,7 @@ msgstr "원근/직교 뷰 전환"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
-msgstr "애니메이션 키 삽입하기"
+msgstr "애니메이션 키 삽입"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
@@ -7349,7 +7476,7 @@ msgstr "자유 시점 토글"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform"
-msgstr "변형하기"
+msgstr "변형"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
@@ -7438,7 +7565,7 @@ msgstr "변형 바꾸기"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
-msgstr "이동하기:"
+msgstr "이동:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate (deg.):"
@@ -7498,31 +7625,31 @@ msgstr "LightOccluder2D 미리 보기"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
-msgstr "스프라이트가 없어요!"
+msgstr "스프라이트가 없습니다!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr "애니메이션 프레임을 사용하는 스프라이트를 메시로 변환할 수 없어요."
+msgstr "애니메이션 프레임을 사용하는 스프라이트를 메시로 변환할 수 없습니다."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr "잘못된 형태. 메시로 대체할 수 없어요."
+msgstr "잘못된 형태. 메시로 대체할 수 없습니다."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Mesh2D"
-msgstr "Mesh2D로 변환하기"
+msgstr "Mesh2D로 변환"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
-msgstr "잘못된 형태. 폴리곤을 만들 수 없어요."
+msgstr "잘못된 형태. 폴리곤을 만들 수 없습니다."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Polygon2D"
-msgstr "Polygon2D로 변환하기"
+msgstr "Polygon2D로 변환"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
-msgstr "잘못된 형태. 충돌 폴리곤을 만들 수 없어요."
+msgstr "잘못된 형태. 충돌 폴리곤을 만들 수 없습니다."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create CollisionPolygon2D Sibling"
@@ -7530,7 +7657,7 @@ msgstr "CollisionPolygon2D 노드 만들기"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
-msgstr "잘못된 형태, 조명 어클루더를 만들 수 없어요."
+msgstr "잘못된 형태, 조명 어클루더를 만들 수 없습니다."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D Sibling"
@@ -7566,11 +7693,11 @@ msgstr "선택한 프레임 없음"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add %d Frame(s)"
-msgstr "%d개의 프레임 추가하기"
+msgstr "%d개의 프레임 추가"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
-msgstr "프레임 추가하기"
+msgstr "프레임 추가"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Unable to load images"
@@ -7578,11 +7705,11 @@ msgstr "이미지를 불러올 수 없음"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
-msgstr "오류: 프레임 리소스를 불러올 수 없어요!"
+msgstr "오류: 프레임 리소스를 불러올 수 없습니다!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Resource clipboard is empty or not a texture!"
-msgstr "리소스 클립보드가 비었거나 텍스처가 아니에요!"
+msgstr "리소스 클립보드가 비었거나 텍스처가 아닙니다!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste Frame"
@@ -7590,7 +7717,7 @@ msgstr "프레임 붙여넣기"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Empty"
-msgstr "빈 프레임 추가하기"
+msgstr "빈 프레임 추가"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation FPS"
@@ -7602,7 +7729,7 @@ msgstr "(비었음)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move Frame"
-msgstr "프레임 이동하기"
+msgstr "프레임 이동"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Animations:"
@@ -7613,7 +7740,8 @@ msgid "New Animation"
msgstr "새 애니메이션"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "속도 (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7626,31 +7754,31 @@ msgstr "애니메이션 프레임:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add a Texture from File"
-msgstr "파일에서 텍스처 추가하기"
+msgstr "파일에서 텍스처 추가"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr "스프라이트 시트에서 프레임 추가하기"
+msgstr "스프라이트 시트에서 프레임 추가"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
-msgstr "빈 프레임 삽입하기 (이전)"
+msgstr "빈 프레임 삽입 (이전)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (After)"
-msgstr "빈 프레임 삽입하기 (이후)"
+msgstr "빈 프레임 삽입 (이후)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (Before)"
-msgstr "이동하기 (이전)"
+msgstr "이동 (이전)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (After)"
-msgstr "이동하기 (이후)"
+msgstr "이동 (이후)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Select Frames"
-msgstr "프레임 선택하기"
+msgstr "프레임 선택"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
@@ -7662,7 +7790,7 @@ msgstr "수직:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Select/Clear All Frames"
-msgstr "모든 프레임 선택하기/지우기"
+msgstr "모든 프레임 선택/지우기"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Create Frames from Sprite Sheet"
@@ -7674,11 +7802,11 @@ msgstr "스프라이트 프레임"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Region Rect"
-msgstr "사각 영역 설정하기"
+msgstr "사각 영역 설정"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Margin"
-msgstr "여백 설정하기"
+msgstr "여백 설정"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
@@ -7719,23 +7847,23 @@ msgstr "텍스처 영역"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
-msgstr "모든 항목 추가하기"
+msgstr "모든 항목 추가"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All"
-msgstr "모두 추가하기"
+msgstr "모두 추가"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove All Items"
-msgstr "모든 항목 삭제하기"
+msgstr "모든 항목 삭제"
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
msgid "Remove All"
-msgstr "모두 삭제하기"
+msgstr "모두 삭제"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Edit Theme"
-msgstr "테마 편집하기"
+msgstr "테마 편집"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
@@ -7743,11 +7871,11 @@ msgstr "테마 편집 메뉴."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
-msgstr "클래스 항목 추가하기"
+msgstr "클래스 항목 추가"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Class Items"
-msgstr "클래스 항목 삭제하기"
+msgstr "클래스 항목 삭제"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Template"
@@ -7795,7 +7923,7 @@ msgstr "체크된 라디오 항목"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Named Sep."
-msgstr "이름있는 분기."
+msgstr "이름있는 구분자."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
@@ -7885,7 +8013,7 @@ msgstr "선택 항목 잘라내기"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
-msgstr "타일맵 칠하기"
+msgstr "타일맵 칠"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Line Draw"
@@ -7941,15 +8069,15 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "타일 선택하기"
+msgstr "타일 선택"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
-msgstr "왼쪽으로 회전하기"
+msgstr "왼쪽으로 회전"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Right"
-msgstr "오른쪽으로 회전하기"
+msgstr "오른쪽으로 회전"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
@@ -7965,11 +8093,11 @@ msgstr "변형 지우기"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet."
-msgstr "TileSet에 텍스처 추가하기."
+msgstr "TileSet에 텍스처를 추가합니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected Texture from TileSet."
-msgstr "선택한 텍스처를 TileSet에서 삭제하기."
+msgstr "선택한 텍스처를 TileSet에서 삭제."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -8069,7 +8197,7 @@ msgstr "Z 인덱스 모드"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
-msgstr "비트 마스크 복사하기."
+msgstr "비트 마스크 복사."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Paste bitmask."
@@ -8081,15 +8209,15 @@ msgstr "비트 마스크 지우기."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create a new rectangle."
-msgstr "새로운 사각형 만들기."
+msgstr "새로운 사각형을 만듭니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create a new polygon."
-msgstr "새로운 폴리곤 만들기."
+msgstr "새로운 폴리곤을 만듭니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
-msgstr "사각형 내부에 폴리곤을 유지하기."
+msgstr "사각형 내부에 폴리곤을 유지."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
@@ -8108,15 +8236,15 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
-"선택한 텍스처를 삭제할까요? 이 텍스처를 사용하는 모든 타일도 삭제될 거예요."
+"선택한 텍스처를 삭제할까요? 이 텍스처를 사용하는 모든 타일도 삭제될 것입니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr "삭제할 텍스처를 선택하지 않았어요."
+msgstr "삭제할 텍스처를 선택하지 않았습니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene? This will overwrite all current tiles."
-msgstr "씬에서 만들까요? 모든 현재 파일을 덮어 씌울 거예요."
+msgstr "씬에서 만들까요? 모든 현재 파일을 덮어 씌울 것입니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
@@ -8124,35 +8252,35 @@ msgstr "씬에서 병합할까요?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Texture"
-msgstr "텍스처 삭제하기"
+msgstr "텍스처 삭제"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
-msgstr "%s 파일이 이미 목록에 있어서 추가하지 않았어요."
+msgstr "%s 파일이 이미 목록에 있어서 추가하지 않았습니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
-"핸들을 드래그하여 사각형을 편집해요.\n"
+"핸들을 드래그하여 사각형을 편집합니다.\n"
"다른 타일을 편집하려면 클릭하세요."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete selected Rect."
-msgstr "선택한 사각형을 삭제하기."
+msgstr "선택한 사각형을 삭제합니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"현재 편집한 하위 타일을 선택해요.\n"
+"현재 편집한 하위 타일을 선택합니다.\n"
"다른 타일을 편집하려면 클릭하세요."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete polygon."
-msgstr "폴리곤 삭제하기."
+msgstr "폴리곤을 삭제합니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8161,9 +8289,9 @@ msgid ""
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
msgstr ""
-"좌클릭: 비트를 켜요.\n"
-"우클릭: 비트를 꺼요.\n"
-"Shift+좌클릭: 와일드카드 비트를 설정해요.\n"
+"좌클릭: 비트를 켭니다.\n"
+"우클릭: 비트를 끕니다.\n"
+"Shift+좌클릭: 와일드카드 비트를 설정합니다.\n"
"다른 타일을 편집하려면 클릭하세요."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -8173,7 +8301,7 @@ msgid ""
"Click on another Tile to edit it."
msgstr ""
"아이콘으로 쓸 하위 타일을 선택하세요. 이것은 잘못된 오토타일 바인딩에도 사용"
-"돼요.\n"
+"됩니다.\n"
"다른 타일을 편집하려면 클릭하세요."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -8181,7 +8309,7 @@ msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
-"하위 타일을 선택해서 우선 순위를 바꿔요.\n"
+"하위 타일을 선택해서 우선 순위를 바꿉니다.\n"
"다른 타일을 편집하려면 클릭하세요."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -8189,12 +8317,12 @@ msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
msgstr ""
-"하위 타일을 선택해서 Z 인덱스를 바꿔요.\n"
+"하위 타일을 선택해서 Z 인덱스를 바꿉니다.\n"
"다른 타일을 편집하려면 클릭하세요."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Region"
-msgstr "타일 영역 설정하기"
+msgstr "타일 영역 설정"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Tile"
@@ -8202,23 +8330,23 @@ msgstr "타일 만들기"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Icon"
-msgstr "타일 아이콘 설정하기"
+msgstr "타일 아이콘 설정"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Bitmask"
-msgstr "타일 비트 마스크 편집하기"
+msgstr "타일 비트 마스크 편집"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Collision Polygon"
-msgstr "충돌 폴리곤 편집하기"
+msgstr "충돌 폴리곤 편집"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Occlusion Polygon"
-msgstr "어클루전 폴리곤 편집하기"
+msgstr "어클루전 폴리곤 편집"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Navigation Polygon"
-msgstr "내비게이션 폴리곤 편집하기"
+msgstr "내비게이션 폴리곤 편집"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Paste Tile Bitmask"
@@ -8238,27 +8366,27 @@ msgstr "볼록한 폴리곤 만들기"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Tile"
-msgstr "타일 삭제하기"
+msgstr "타일 삭제"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Collision Polygon"
-msgstr "충돌 폴리곤 삭제하기"
+msgstr "충돌 폴리곤 삭제"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Occlusion Polygon"
-msgstr "어클루전 폴리곤 삭제하기"
+msgstr "어클루전 폴리곤 삭제"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Navigation Polygon"
-msgstr "내비게이션 폴리곤 삭제하기"
+msgstr "내비게이션 폴리곤 삭제"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Priority"
-msgstr "필터 우선 순위 편집하기"
+msgstr "필터 우선 순위 편집"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
-msgstr "타일 Z 인덱스 편집하기"
+msgstr "타일 Z 인덱스 편집"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Convex"
@@ -8278,7 +8406,7 @@ msgstr "어클루전 폴리곤 만들기"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
-msgstr "이 속성은 바꿀 수 없어요."
+msgstr "이 속성은 바꿀 수 없습니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "TileSet"
@@ -8286,19 +8414,19 @@ msgstr "타일셋"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No VCS addons are available."
-msgstr "이용할 수 있는 버전 관리 시스템(VCS)이 없어요."
+msgstr "이용할 수 있는 버전 관리 시스템(VCS)이 없습니다."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "오류"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No commit message was provided"
-msgstr "커밋 메시지를 제공하지 않았어요"
+msgstr "커밋 메시지를 제공하지 않았습니다"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr "스테이지에 추가된 파일이 없어요"
+msgstr "스테이지에 추가된 파일이 없습니다"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit"
@@ -8306,7 +8434,7 @@ msgstr "커밋"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "VCS Addon is not initialized"
-msgstr "버전 관리 시스템(VCS)이 초기화되지 않았어요"
+msgstr "버전 관리 시스템(VCS)이 초기화되지 않았습니다"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control System"
@@ -8354,7 +8482,7 @@ msgstr "모두 스테이지로 보내기"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
-msgstr "커밋 메시지 추가하기"
+msgstr "커밋 메시지 추가"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit Changes"
@@ -8371,7 +8499,7 @@ msgstr "최신 버전으로 커밋하기 전에 파일 diff 보기"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No file diff is active"
-msgstr "파일 diff가 켜져 있지 않아요"
+msgstr "파일 diff가 켜져 있지 않습니다"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect changes in file diff"
@@ -8383,7 +8511,7 @@ msgstr "(GLES3만 가능)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Output"
-msgstr "출력 추가하기"
+msgstr "출력 추가"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar"
@@ -8435,27 +8563,27 @@ msgstr "출력 포트 삭제하기"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set expression"
-msgstr "표현식 설정하기"
+msgstr "표현식 설정"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Resize VisualShader node"
-msgstr "비주얼 셰이더 노드 크기 조정하기"
+msgstr "비주얼 셰이더 노드 크기 조정"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
-msgstr "Uniform 이름 설정하기"
+msgstr "Uniform 이름 설정"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Input Default Port"
-msgstr "입력 기본 포트 설정하기"
+msgstr "입력 기본 포트 설정"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node to Visual Shader"
-msgstr "노드를 비주얼 셰이더에 추가하기"
+msgstr "노드를 비주얼 셰이더에 추가"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Duplicate Nodes"
-msgstr "노드 복제하기"
+msgstr "노드 복제"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -8464,7 +8592,7 @@ msgstr "노드 붙여넣기"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Delete Nodes"
-msgstr "노드 삭제하기"
+msgstr "노드 삭제"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Input Type Changed"
@@ -8504,11 +8632,11 @@ msgstr "회색조 함수."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr "HSV 벡터를 RGB로 변환해요."
+msgstr "HSV 벡터를 RGB로 변환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr "RGB 벡터를 HSV로 변환해요."
+msgstr "RGB 벡터를 HSV로 변환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sepia function."
@@ -8560,7 +8688,7 @@ msgstr "색상 Uniform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr "두 매개변수 사이 %s 비교의 불리언 결과 값을 반환해요."
+msgstr "두 매개변수 사이 %s 비교의 불리언 결과 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
@@ -8578,20 +8706,20 @@ msgstr "보다 크거나 같다 (>=)"
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
-msgstr "제공된 스칼라가 같거나, 더 크거나, 더 작으면 관련 벡터를 반환해요."
+msgstr "제공된 스칼라가 같거나, 더 크거나, 더 작으면 관련 벡터를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
-msgstr "INF(무한)과 스칼라 매개변수 사이 비교의 불리언 결과 값을 반환해요."
+msgstr "INF(무한)과 스칼라 매개변수 사이 비교의 불리언 결과 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
msgstr ""
-"NaN(숫자 아님)과 스칼라 매개변수 사이 비교의 불리언 결과 값을 반환해요."
+"NaN(숫자 아님)과 스칼라 매개변수 사이 비교의 불리언 결과 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
@@ -8608,16 +8736,16 @@ msgstr "같지 않다 (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
-msgstr "불리언 값이 참이거나 거짓이면 관련 벡터를 반환해요."
+msgstr "불리언 값이 참이거나 거짓이면 관련 벡터를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated scalar if the provided boolean value is true or false."
-msgstr "불리언 값이 참이거나 거짓이면 관련 스칼라를 반환해요."
+msgstr "불리언 값이 참이거나 거짓이면 관련 스칼라를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr "두 매개변수 사이 비교의 불리언 결과 값을 반환해요."
+msgstr "두 매개변수 사이 비교의 불리언 결과 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8625,7 +8753,7 @@ msgid ""
"scalar parameter."
msgstr ""
"INF(무한) (또는 NaN(숫자 아님))과 스칼라 매개변수 사이 비교의 불리언 결과 값"
-"을 반환해요."
+"을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
@@ -8709,35 +8837,35 @@ msgstr "Sqrt2 상수 (1.414214). 2의 제곱근."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr "매개변수의 절대값을 반환해요."
+msgstr "매개변수의 절대값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr "매개변수의 아크코사인 값을 반환해요."
+msgstr "매개변수의 아크코사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr "매개변수의 역쌍곡코사인 값을 반환해요."
+msgstr "매개변수의 역쌍곡코사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr "매개변수의 아크사인 값을 반환해요."
+msgstr "매개변수의 아크사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr "매개변수의 역쌍곡사인 값을 반환해요."
+msgstr "매개변수의 역쌍곡사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr "매개변수의 아크탄젠트 값을 반환해요."
+msgstr "매개변수의 아크탄젠트 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr "매개변수들의 아크탄젠트 값을 반환해요."
+msgstr "매개변수들의 아크탄젠트 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr "매개변수의 역쌍곡탄젠트 값을 반환해요."
+msgstr "매개변수의 역쌍곡탄젠트 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8746,19 +8874,19 @@ msgstr "매개변수보다 크거나 같은 가장 가까운 정수를 찾아요
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
-msgstr "떨어져 있는 두 값 사이에 놓이는 값을 제한해요."
+msgstr "떨어져 있는 두 값 사이에 놓이는 값을 제한합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr "매개변수의 코사인 값을 반환해요."
+msgstr "매개변수의 코사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr "매개변수의 쌍곡코사인 값을 반환해요."
+msgstr "매개변수의 쌍곡코사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr "각도 단위를 라디안에서 도로 변환해요."
+msgstr "각도 단위를 라디안에서 도로 변환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
@@ -8774,11 +8902,11 @@ msgstr "매개변수보다 적거나 같은 가장 가까운 정수를 찾아요
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr "인수의 소수 부분을 계산해요."
+msgstr "인수의 소수 부분을 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr "매개변수의 제곱근 역함수 값을 반환해요."
+msgstr "매개변수의 제곱근 역함수 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
@@ -8790,11 +8918,11 @@ msgstr "2가 밑인 로그 함수."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr "두 값 중 더 큰 값을 반환해요."
+msgstr "두 값 중 더 큰 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr "두 값 중 더 작은 값을 반환해요."
+msgstr "두 값 중 더 작은 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
@@ -8802,7 +8930,7 @@ msgstr "두 스칼라 값 사이 선형 보간."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr "매개변수의 반대 값을 반환해요."
+msgstr "매개변수의 반대 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
@@ -8811,11 +8939,11 @@ msgstr "1.0 - 스칼라"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the value of the first parameter raised to the power of the second."
-msgstr "첫 번째 매개변수를 두 번째 매개변수로 제곱한 값을 반환해요."
+msgstr "첫 번째 매개변수를 두 번째 매개변수로 제곱한 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr "각도 단위를 도에서 라디안으로 변환해요."
+msgstr "각도 단위를 도에서 라디안으로 변환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
@@ -8831,23 +8959,23 @@ msgstr "매개변수에서 가장 가까운 짝수 정수를 찾아요."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr "값을 0.0에서 1.0 사이로 고정해요."
+msgstr "값을 0.0에서 1.0 사이로 고정합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
-msgstr "매개변수의 부호를 추출해요."
+msgstr "매개변수의 부호를 추출합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr "매개변수의 사인 값을 반환해요."
+msgstr "매개변수의 사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr "매개변수의 쌍곡사인 값을 반환해요."
+msgstr "매개변수의 쌍곡사인 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr "매개변수의 제곱근을 반환해요."
+msgstr "매개변수의 제곱근을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8859,8 +8987,8 @@ msgid ""
msgstr ""
"SmoothStep 함수( 스칼라(edge0), 스칼라(edge1), 스칼라(x) ).\n"
"\n"
-"'x'가 'edge0'보다 작으면 0.0을 반환하고, 'edge1'보다 크면 1.0을 반환해요. 그"
-"렇지 않은 경우, 에르미트 다항식을 통해반환값을 0.0과 1.0사이로 보간해요."
+"'x'가 'edge0'보다 작으면 0.0을 반환하고, 'edge1'보다 크면 1.0을 반환합니다. "
+"그렇지 않은 경우, 에르미트 다항식을 통해반환값을 0.0과 1.0사이로 보간합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8870,15 +8998,15 @@ msgid ""
msgstr ""
"Step 함수( 스칼라(edge), 스칼라(x) ).\n"
"\n"
-"'x'가 'edge'보다 작으면 0.0을 반환하고 그렇지 않으면 1.0을 반환해요."
+"'x'가 'edge'보다 작으면 0.0을 반환하고 그렇지 않으면 1.0을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr "매개변수의 탄젠트 값을 반환해요."
+msgstr "매개변수의 탄젠트 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr "매개변수의 쌍곡탄젠트 값을 반환해요."
+msgstr "매개변수의 쌍곡탄젠트 값을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
@@ -8886,23 +9014,23 @@ msgstr "매개변수의 절사된 값을 찾아요."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
-msgstr "스칼라에 스칼라를 더해요."
+msgstr "스칼라에 스칼라를 더합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr "스칼라를 스칼라로 나누어요."
+msgstr "스칼라를 스칼라로 나눕니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr "스칼라를 스칼라로 곱해요."
+msgstr "스칼라를 스칼라로 곱합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr "두 스칼라의 나머지를 반환해요."
+msgstr "두 스칼라의 나머지를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
-msgstr "스칼라에서 스칼라를 빼요."
+msgstr "스칼라에서 스칼라를 뺍니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar constant."
@@ -8914,11 +9042,11 @@ msgstr "스칼라 Uniform."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
-msgstr "세제곱 텍스처 룩업을 수행해요."
+msgstr "세제곱 텍스처 룩업을 수행합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr "텍스처 룩업을 수행해요."
+msgstr "텍스처 룩업을 수행합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Cubic texture uniform lookup."
@@ -8946,40 +9074,40 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
-"벡터 한 쌍의 외적을 계산해요.\n"
+"벡터 한 쌍의 외적을 계산합니다.\n"
"\n"
"OuterProduct는 첫 매개변수 'c'를 열 벡터로 취급하고 (1열로 이루어진 행렬) 두 "
-"번째 매개변수 'r'을 행 벡터로 취급해요 (1행으로 이루어진 행렬), 그리고 선형 "
-"대수 행렬에 'c * r'을 곱해서 행렬을 산출하는데, 행 수는 'c'의 구성 요소 수이"
-"고 열 수는 'r'의 구성 요소 수가 돼요."
+"번째 매개변수 'r'을 행 벡터로 취급합니다 (1행으로 이루어진 행렬), 그리고 선"
+"형 대수 행렬에 'c * r'을 곱해서 행렬을 산출하는데, 행 수는 'c'의 구성 요소 수"
+"이고 열 수는 'r'의 구성 요소 수가 됩니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr "4개의 벡터로 변형을 합성해요."
+msgstr "4개의 벡터로 변형을 합성합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
-msgstr "변형을 4개의 벡터로 분해해요."
+msgstr "변형을 4개의 벡터로 분해합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr "변형의 행렬식을 계산해요."
+msgstr "변형의 행렬식을 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr "변형의 역함수를 계산해요."
+msgstr "변형의 역함수를 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr "변형의 전치를 계산해요."
+msgstr "변형의 전치를 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr "변형에 변형을 곱해요."
+msgstr "변형에 변형을 곱합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr "변형에 벡터를 곱해요."
+msgstr "변형에 벡터를 곱합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform constant."
@@ -8999,23 +9127,23 @@ msgstr "벡터 연산자."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr "세 개의 스칼라로 벡터를 합성해요."
+msgstr "세 개의 스칼라로 벡터를 합성합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr "벡터를 세 개의 스칼라로 분해해요."
+msgstr "벡터를 세 개의 스칼라로 분해합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr "두 벡터의 벡터곱 값을 계산해요."
+msgstr "두 벡터의 벡터곱 값을 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr "두 점 사이의 거리를 반환해요."
+msgstr "두 점 사이의 거리를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr "두 벡터의 스칼라곱 값을 계산해요."
+msgstr "두 벡터의 스칼라곱 값을 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9024,14 +9152,14 @@ msgid ""
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
-"같은 방향을 가리키는 벡터를 참조 벡터로 반환해요. 함수에는 세 개의 벡터 매개"
-"변수가 있어요 : 방향을 지정하는 벡터 N, 인시던트 벡터 I, 그리고 참조 벡터 "
-"Nref. 만약 I와 Nref가 0의 벡터곱이 0보다 작다면 반환값은 N이 돼요. 그렇지 않"
-"으면 -N이 반환돼요."
+"같은 방향을 가리키는 벡터를 참조 벡터로 반환합니다. 함수에는 세 개의 벡터 매"
+"개변수가 있습니다 : 방향을 지정하는 벡터 N, 인시던트 벡터 I, 그리고 참조 벡"
+"터 Nref. 만약 I와 Nref가 0의 벡터곱이 0보다 작다면 반환값은 N이 됩니다. 그렇"
+"지 않으면 -N이 반환됩니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr "벡터의 길이를 계산해요."
+msgstr "벡터의 길이를 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
@@ -9043,7 +9171,7 @@ msgstr "스칼라를 사용하 두 벡터 간의 선형 보간."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
-msgstr "벡터의 노멀 값을 계산해요."
+msgstr "벡터의 노멀 값을 계산합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - vector"
@@ -9058,11 +9186,11 @@ msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
-"반사 방향을 가리키는 벡터를 반환해요 (a : 인시던트 벡터, b : 노멀 벡터)."
+"반사 방향을 가리키는 벡터를 반환합니다 (a : 인시던트 벡터, b : 노멀 벡터)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr "반사 방향을 가리키는 벡터를 반환해요."
+msgstr "반사 방향을 가리키는 벡터를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9074,8 +9202,8 @@ msgid ""
msgstr ""
"SmoothStep 함수( 벡터(edge0), 벡터(edge1), 벡터(x) ).\n"
"\n"
-"'x'가 'edge0'보다 작으면 0.0을, 'x'가 'edge1'보다 크면 1.0을 반환해요. 그렇"
-"지 않은 경우 에르미트 다항식으로 반환값을 0.0과 1.0 사이로 보간해요."
+"'x'가 'edge0'보다 작으면 0.0을, 'x'가 'edge1'보다 크면 1.0을 반환합니다. 그렇"
+"지 않은 경우 에르미트 다항식으로 반환값을 0.0과 1.0 사이로 보간합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9087,8 +9215,8 @@ msgid ""
msgstr ""
"SmoothStep 함수( 스칼라(edge0), 스칼라(edge1), 벡터(x) ).\n"
"\n"
-"'x'가 'edge0'보다 작으면 0.0을, 'x'가 'edge1'보다 크면 1.0을 반환해요. 그렇"
-"지 않은 경우 에르미트 다항식으로 반환값을 0.0과 1.0 사이로 보간해요."
+"'x'가 'edge0'보다 작으면 0.0을, 'x'가 'edge1'보다 크면 1.0을 반환합니다. 그렇"
+"지 않은 경우 에르미트 다항식으로 반환값을 0.0과 1.0 사이로 보간합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9098,7 +9226,7 @@ msgid ""
msgstr ""
"Step 함수( 벡터(edge), 벡터(x) ).\n"
"\n"
-"'x'가 'edge'보다 작으면 0.0을 반환하고, 그렇지 않은 경우 1.0을 반환해요."
+"'x'가 'edge'보다 작으면 0.0을 반환하고, 그렇지 않은 경우 1.0을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9108,27 +9236,27 @@ msgid ""
msgstr ""
"Step 함수( 스칼라(edge), 벡터(x) ).\n"
"\n"
-"'x'가 'edge'보다 작으면 0.0을 반환하고, 그렇지 않은 경우 1.0을 반환해요."
+"'x'가 'edge'보다 작으면 0.0을 반환하고, 그렇지 않은 경우 1.0을 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr "벡터에 벡터를 더해요."
+msgstr "벡터에 벡터를 더합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr "벡터를 벡터로 나누어요."
+msgstr "벡터를 벡터로 나눕니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr "벡터를 벡터로 곱해요."
+msgstr "벡터를 벡터로 곱합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr "두 벡터의 나머지를 반환해요."
+msgstr "두 벡터의 나머지를 반환합니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
-msgstr "벡터에서 벡터를 빼요."
+msgstr "벡터에서 벡터를 뺍니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
@@ -9153,8 +9281,8 @@ msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
-"카메라의 화면 방향과 표면 노멀의 스칼라곱을 기반으로 하는 폴오프를 반환해요 "
-"(폴오프와 관련된 입력을 전달함)."
+"표면의 법선 벡터와 카메라가 바라보는 방향 벡터의 내적을 기반으로 한 폴오프를 "
+"반환합니다. (폴오프와 관련된 입력을 전달함)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9164,8 +9292,8 @@ msgid ""
"constants."
msgstr ""
"결과 셰이더 위에 배치된, 맞춤 Godot 셰이더 언어 표현식. 다양한 함수 선언을 놓"
-"은 뒤 나중에 표현식에서 호출할 수 있어요. Varying, Uniform, 상수도 정의할 수 "
-"있어요."
+"은 뒤 나중에 표현식에서 호출할 수 있습니다. Varying, Uniform, 상수도 정의할 "
+"수 있습니다."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
@@ -9219,7 +9347,7 @@ msgstr "비주얼 셰이더"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Edit Visual Property"
-msgstr "비주얼 속성 편집하기"
+msgstr "비주얼 속성 편집"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Mode Changed"
@@ -9231,11 +9359,11 @@ msgstr "실행가능"
#: editor/project_export.cpp
msgid "Add initial export..."
-msgstr "초기 내보내기 추가하기..."
+msgstr "초기 내보내기 추가..."
#: editor/project_export.cpp
msgid "Add previous patches..."
-msgstr "이전 패치 추가하기..."
+msgstr "이전 패치 추가..."
#: editor/project_export.cpp
msgid "Delete patch '%s' from list?"
@@ -9250,8 +9378,8 @@ msgid ""
"Failed to export the project for platform '%s'.\n"
"Export templates seem to be missing or invalid."
msgstr ""
-"'%s' 플랫폼에 프로젝트를 내보낼 수 없어요.\n"
-"내보내기 템플릿이 누락되거나 잘못된 모양이에요."
+"'%s' 플랫폼에 프로젝트를 내보낼 수 없습니다.\n"
+"내보내기 템플릿이 누락되거나 잘못된 것 같습니다."
#: editor/project_export.cpp
msgid ""
@@ -9259,8 +9387,8 @@ msgid ""
"This might be due to a configuration issue in the export preset or your "
"export settings."
msgstr ""
-"'%s' 플랫폼에 프로젝트를 내보낼 수 없어요.\n"
-"내보내기 프리셋이나 내보내기 설정의 문제로 보여요."
+"'%s' 플랫폼에 프로젝트를 내보낼 수 없습니다.\n"
+"내보내기 프리셋이나 내보내기 설정의 문제인 것 같습니다."
#: editor/project_export.cpp
msgid "Release"
@@ -9284,15 +9412,15 @@ msgstr "프리셋"
#: editor/project_export.cpp editor/project_settings_editor.cpp
msgid "Add..."
-msgstr "추가하기..."
+msgstr "추가..."
#: editor/project_export.cpp
msgid ""
"If checked, the preset will be available for use in one-click deploy.\n"
"Only one preset per platform may be marked as runnable."
msgstr ""
-"체크하면 프리셋은 원 클릭 배포로 사용할 수 있게 돼요.\n"
-"플랫폼 당 하나의 프리셋만 실행 가능하다고 표시될 거에요."
+"체크하면 프리셋은 원 클릭 배포로 사용할 수 있게 됩니다.\n"
+"플랫폼 당 하나의 프리셋만 실행 가능하다고 표시될 것입니다."
#: editor/project_export.cpp
msgid "Export Path"
@@ -9327,15 +9455,16 @@ msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"리소스가 아닌 파일/폴더 내보내기 필터 (쉼표로 구분, 예: *.json, *.txt, docs/"
-"*)"
+"리소스가 아닌 파일/폴더 내보내기 필터\n"
+"(쉼표로 구분, 예: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"프로젝트에서 제외할 파일/폴더 필터 (쉼표로 구분, 예: *.json, *.txt, docs/*)"
+"프로젝트에서 제외할 파일/폴더 필터\n"
+"(쉼표로 구분, 예: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
@@ -9379,11 +9508,11 @@ msgstr "컴파일됨"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
-msgstr "암호화 (아래에 키가 필요해요)"
+msgstr "암호화 (아래에 키가 필요합니다)"
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr "잘못된 암호화 키 (길이가 64자이어야 해요)"
+msgstr "잘못된 암호화 키 (길이가 64자이어야 합니다)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
@@ -9426,25 +9555,31 @@ msgid "Export With Debug"
msgstr "디버그와 함께 내보내기"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "경로가 없어요."
+msgid "The path specified doesn't exist."
+msgstr "지정한 경로가 없습니다."
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "패키지 파일을 여는 중 오류 (ZIP 형식이 아닙니다)."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"잘못된 '.zip' 프로젝트 파일이에요. 'project.godot' 파일을 갖고 있지 않아요."
+"잘못된 \".zip\" 프로젝트 파일입니다. \"project.godot\" 파일이 들어있지 않습니"
+"다."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "비어있는 폴더를 선택해주세요."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "'project.godot' 파일 또는 '.zip' 파일을 선택해주세요."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "\"project.godot\" 파일 또는 \".zip\" 파일을 선택해주세요."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "디렉토리에 Godot 프로젝트가 이미 있어요."
+msgid "This directory already contains a Godot project."
+msgstr "디렉토리에 Godot 프로젝트가 이미 존재합니다."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9460,35 +9595,35 @@ msgstr "잘못된 프로젝트 이름."
#: editor/project_manager.cpp
msgid "Couldn't create folder."
-msgstr "폴더를 만들 수 없어요."
+msgstr "폴더를 만들 수 없습니다."
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
-msgstr "이미 이 경로에 이 이름과 같은 폴더가 있어요."
+msgstr "이미 이 경로에 이 이름과 같은 폴더가 있습니다."
#: editor/project_manager.cpp
msgid "It would be a good idea to name your project."
-msgstr "프로젝트 이름을 정하는 게 좋을 거예요."
+msgstr "프로젝트 이름을 정하는 게 좋을 것입니다."
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr "잘못된 프로젝트 경로 (프로젝트에 손대셨나요?)."
+msgstr "잘못된 프로젝트 경로 (무언가를 변경하셨습니까?)."
#: editor/project_manager.cpp
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
-"프로젝트 경로에서 project.godot을 불러올 수 없어요 (error %d). 누락되거나 손"
-"상된 모양이에요."
+"프로젝트 경로에서 project.godot을 불러올 수 없습니다 (error %d). 누락되거나 "
+"손상된 모양입니다."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
-msgstr "프로젝트 경로에서 project.godot 파일을 편집할 수 없어요."
+msgstr "프로젝트 경로에서 project.godot 파일을 편집할 수 없습니다."
#: editor/project_manager.cpp
msgid "Couldn't create project.godot in project path."
-msgstr "프로젝트 경로에서 project.godot 파일을 만들 수 없어요."
+msgstr "프로젝트 경로에서 project.godot 파일을 만들 수 없습니다."
#: editor/project_manager.cpp
msgid "Rename Project"
@@ -9500,7 +9635,7 @@ msgstr "기존 프로젝트 가져오기"
#: editor/project_manager.cpp
msgid "Import & Edit"
-msgstr "가져오기 & 편집하기"
+msgstr "가져오기 & 편집"
#: editor/project_manager.cpp
msgid "Create New Project"
@@ -9508,7 +9643,7 @@ msgstr "새 프로젝트 만들기"
#: editor/project_manager.cpp
msgid "Create & Edit"
-msgstr "만들기 & 편집하기"
+msgstr "만들기 & 편집"
#: editor/project_manager.cpp
msgid "Install Project:"
@@ -9516,7 +9651,7 @@ msgstr "프로젝트 설치:"
#: editor/project_manager.cpp
msgid "Install & Edit"
-msgstr "설치하기 & 편집하기"
+msgstr "설치 & 편집"
#: editor/project_manager.cpp
msgid "Project Name:"
@@ -9568,7 +9703,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr "렌더러는 나중에 바꿀 수 있지만, 씬을 조정해야 할지도 몰라요."
+msgstr "렌더러는 나중에 바꿀 수 있지만, 씬을 조정해야 할 수도 있습니다."
#: editor/project_manager.cpp
msgid "Unnamed Project"
@@ -9580,15 +9715,15 @@ msgstr "누락된 프로젝트"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr "오류: 프로젝트가 파일 시스템에서 누락됐어요."
+msgstr "오류: 프로젝트가 파일 시스템에서 누락되었습니다."
#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
-msgstr "'%s'에서 프로젝트를 열 수 없어요."
+msgstr "'%s'에서 프로젝트를 열 수 없습니다."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
-msgstr "두 개 이상의 프로젝트를 열 건가요?"
+msgstr "두 개 이상의 프로젝트를 여시겠습니까?"
#: editor/project_manager.cpp
msgid ""
@@ -9602,12 +9737,12 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
-"다음 프로젝트 설정 파일은 현재 버전의 Godot에서 만든 것이 아니에요.\n"
+"다음 프로젝트 설정 파일은 현재 버전의 Godot에서 만든 것이 아닙니다.\n"
"↵\n"
"%s↵\n"
"↵\n"
-"파일 열기를 계속한다면, 현재 Godot의 구성 파일 형식으로 변환될 거예요.\n"
-"경고: 더 이상 이 프로젝트를 이전 버전의 엔진에서 열 수 없을 거예요."
+"파일 열기를 계속한다면, 현재 Godot의 구성 파일 형식으로 변환될 것입니다.\n"
+"경고: 더 이상 이 프로젝트를 이전 버전의 엔진에서 열 수 없을 것입니다."
#: editor/project_manager.cpp
msgid ""
@@ -9621,19 +9756,20 @@ msgid ""
"engine anymore."
msgstr ""
"다음 프로젝트 설정 파일은 이전 버전에 만든 것으로, 현재 버전에 맞게 변환해야 "
-"해요:\n"
+"합니다:\n"
"\n"
"%s\n"
"\n"
"변환할까요?\n"
-"경고: 더 이상 이 프로젝트를 이전 버전의 엔진에서 열 수 없을 거예요."
+"경고: 더 이상 이 프로젝트를 이전 버전의 엔진에서 열 수 없을 것입니다."
#: editor/project_manager.cpp
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
-"프로젝트 설정이 새 버전에 맞게 만들어졌어요. 이 버전에서는 호환하지 않아요."
+"프로젝트 설정이 새 버전에 맞게 만들어졌습니다. 이 버전에서는 호환하지 않습니"
+"다."
#: editor/project_manager.cpp
msgid ""
@@ -9641,7 +9777,7 @@ msgid ""
"Please edit the project and set the main scene in the Project Settings under "
"the \"Application\" category."
msgstr ""
-"프로젝트를 실행할 수 없음: 메인 씬을 정의하지 않았어요.\n"
+"프로젝트를 실행할 수 없음: 메인 씬을 정의하지 않았습니다.\n"
"프로젝트를 편집하고 프로젝트 설정의 \"Application\" 카테고리에서 메인 씬을 설"
"정해주세요."
@@ -9650,7 +9786,7 @@ msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
-"프로젝트를 실행할 수 없음: 애셋을 가져와야 해요.\n"
+"프로젝트를 실행할 수 없음: 애셋을 가져와야 합니다.\n"
"프로젝트를 편집해서 최초 가져오기가 실행되도록 하세요."
#: editor/project_manager.cpp
@@ -9663,7 +9799,7 @@ msgid ""
"The project folders' contents won't be modified."
msgstr ""
"%d개의 프로젝트를 삭제할까요?\n"
-"프로젝트 폴더의 내용은 수정되지 않아요."
+"프로젝트 폴더의 내용은 수정되지 않습니다."
#: editor/project_manager.cpp
msgid ""
@@ -9671,7 +9807,7 @@ msgid ""
"The project folder's contents won't be modified."
msgstr ""
"이 프로젝트를 목록에서 삭제할까요?\n"
-"프로젝트 폴더의 내용은 수정되지 않아요."
+"프로젝트 폴더의 내용은 수정되지 않습니다."
#: editor/project_manager.cpp
msgid ""
@@ -9679,15 +9815,15 @@ msgid ""
"The project folders' contents won't be modified."
msgstr ""
"모든 누락된 프로젝트를 삭제할까요?\n"
-"프로젝트 폴더의 내용은 수정되지 않아요."
+"프로젝트 폴더의 내용은 수정되지 않습니다."
#: editor/project_manager.cpp
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
-"언어가 바뀌었어요.\n"
-"인터페이스는 편집기나 프로젝트 매니저를 다시 켜면 적용돼요."
+"언어가 바뀌었.\n"
+"인터페이스는 편집기나 프로젝트 매니저를 다시 켜면 적용됩니다."
#: editor/project_manager.cpp
msgid ""
@@ -9695,8 +9831,9 @@ msgid ""
"This could take a while."
msgstr ""
"Godot 프로젝트를 확인하기 위해 %s 폴더를 스캔할까요?\n"
-"시간이 걸릴 수 있어요."
+"시간이 걸릴 수 있습니다."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "프로젝트 매니저"
@@ -9723,7 +9860,7 @@ msgstr "새 프로젝트"
#: editor/project_manager.cpp
msgid "Remove Missing"
-msgstr "누락된 부분 삭제하기"
+msgstr "누락된 부분 삭제"
#: editor/project_manager.cpp
msgid "Templates"
@@ -9735,16 +9872,26 @@ msgstr "지금 다시 시작"
#: editor/project_manager.cpp
msgid "Can't run project"
-msgstr "프로젝트를 실행할 수 없어요"
+msgstr "프로젝트를 실행할 수 없습니다"
#: editor/project_manager.cpp
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
-"현재 프로젝트가 하나도 없어요.\n"
+"현재 프로젝트가 하나도 없습니다.\n"
"애셋 라이브러리에서 공식 예제 프로젝트를 찾아볼까요?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"이 검색창은 프로젝트를 이름과 경로의 마지막 부분으로 거릅니다.\n"
+"프로젝트를 전체 경로를 기준으로 걸러내려면 검색어에 `/` 가 한 글자 이상 포함"
+"시키세요."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "키 "
@@ -9766,11 +9913,12 @@ msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"잘못된 액션 이름. 공백이거나, '/' , ':', '=', '\\', '\"' 를 포함하면 안 돼요"
+"잘못된 액션 이름. 공백이거나, '/' , ':', '=', '\\', '\"' 를 포함하면 안 됩니"
+"다"
#: editor/project_settings_editor.cpp
msgid "An action with the name '%s' already exists."
-msgstr "이름 '%s'을(를) 가진 액션이 이미 있어요."
+msgstr "이름 '%s'을(를) 가진 액션이 이미 있습니다."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
@@ -9782,7 +9930,7 @@ msgstr "액션 데드존 바꾸기"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
-msgstr "입력 액션 이벤트 추가하기"
+msgstr "입력 액션 이벤트 추가"
#: editor/project_settings_editor.cpp
msgid "All Devices"
@@ -9854,11 +10002,11 @@ msgstr "입력 액션 지우기"
#: editor/project_settings_editor.cpp
msgid "Erase Input Action Event"
-msgstr "입력 액션 이벤트 삭제하기"
+msgstr "입력 액션 이벤트 삭제"
#: editor/project_settings_editor.cpp
msgid "Add Event"
-msgstr "이벤트 추가하기"
+msgstr "이벤트 추가"
#: editor/project_settings_editor.cpp
msgid "Button"
@@ -9886,7 +10034,7 @@ msgstr "휠 아래로."
#: editor/project_settings_editor.cpp
msgid "Add Global Property"
-msgstr "전역 속성 추가하기"
+msgstr "전역 속성 추가"
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
@@ -9894,26 +10042,27 @@ msgstr "먼저 설정 항목을 선택하세요!"
#: editor/project_settings_editor.cpp
msgid "No property '%s' exists."
-msgstr "'%s' 속성이 없어요."
+msgstr "'%s' 속성이 없습니다."
#: editor/project_settings_editor.cpp
msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr "'%s' 설정은 내부적인 것이에요. 삭제할 수 없어요."
+msgstr "'%s' 설정은 내부적인 것입니다. 삭제할 수 없습니다."
#: editor/project_settings_editor.cpp
msgid "Delete Item"
-msgstr "항목 삭제하기"
+msgstr "항목 삭제"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
-"잘못된 액션 이름. 공백이거나, '/' , ':', '=', '\\', '\"'를 포함하면 안 돼요."
+"잘못된 액션 이름. 공백이거나, '/' , ':', '=', '\\', '\"'를 포함하면 안 됩니"
+"다."
#: editor/project_settings_editor.cpp
msgid "Add Input Action"
-msgstr "입력 액션 추가하기"
+msgstr "입력 액션 추가"
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
@@ -9933,19 +10082,19 @@ msgstr "기능 재정의"
#: editor/project_settings_editor.cpp
msgid "Add Translation"
-msgstr "번역 추가하기"
+msgstr "번역 추가"
#: editor/project_settings_editor.cpp
msgid "Remove Translation"
-msgstr "번역 삭제하기"
+msgstr "번역 삭제"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
-msgstr "리맵핑 경로 추가하기"
+msgstr "리맵핑 경로 추가"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr "리소스 리맵핑 추가하기"
+msgstr "리소스 리맵핑 추가"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
@@ -9953,11 +10102,11 @@ msgstr "리소스 리맵핑 언어 바꾸기"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap"
-msgstr "리소스 리맵핑 삭제하기"
+msgstr "리소스 리맵핑 삭제"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap Option"
-msgstr "리소스 리맵핑 설정 삭제하기"
+msgstr "리소스 리맵핑 설정 삭제"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter"
@@ -9981,7 +10130,7 @@ msgstr "재정의..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
-msgstr "변경 사항을 적용하려면 편집기를 다시 켜야 해요."
+msgstr "변경 사항을 적용하려면 편집기를 다시 켜야 합니다."
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -10089,15 +10238,15 @@ msgstr "디렉토리..."
#: editor/property_editor.cpp
msgid "Assign"
-msgstr "지정하기"
+msgstr "지정"
#: editor/property_editor.cpp
msgid "Select Node"
-msgstr "노드 선택하기"
+msgstr "노드 선택"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
-msgstr "파일 불러오기 오류: 리소스가 아니에요!"
+msgstr "파일 불러오기 오류: 리소스가 아닙니다!"
#: editor/property_editor.cpp
msgid "Pick a Node"
@@ -10109,29 +10258,40 @@ msgstr "비트 %d, 값 %d."
#: editor/property_selector.cpp
msgid "Select Property"
-msgstr "속성 선택하기"
+msgstr "속성 선택"
#: editor/property_selector.cpp
msgid "Select Virtual Method"
-msgstr "가상 메서드 선택하기"
+msgstr "가상 메서드 선택"
#: editor/property_selector.cpp
msgid "Select Method"
-msgstr "메서드 선택하기"
+msgstr "메서드 선택"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
msgstr "일괄 이름 바꾸기"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "바꾸기: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "접두사"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "접미사"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "정규 표현식 사용"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "고급 설정"
@@ -10165,15 +10325,16 @@ msgid ""
"Compare counter options."
msgstr ""
"순차 정수 카운터.\n"
-"카운터 설정과 비교해요."
+"카운터 설정과 비교합니다."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "단계 별 카운터"
+msgid "Per-level Counter"
+msgstr "단계별 카운터"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr "설정하면 각 그룹의 자식 노드의 카운터를 다시 시작해요"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
+msgstr "설정하면 각 그룹의 자식 노드의 카운터를 다시 시작합니다"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
@@ -10197,11 +10358,7 @@ msgid ""
"Missing digits are padded with leading zeros."
msgstr ""
"카운터의 최소 자릿수.\n"
-"빈 자리는 0으로 채워요."
-
-#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "정규 표현식"
+"빈 자리는 0으로 채웁니다."
#: editor/rename_dialog.cpp
msgid "Post-Process"
@@ -10209,15 +10366,15 @@ msgstr "후처리"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr "유지하기"
+msgstr "유지"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase를 under_scored로 하기"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase를 snake_case로"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored를 CamelCase로 하기"
+msgid "snake_case to PascalCase"
+msgstr "snake_case를 PascalCase로"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10225,31 +10382,40 @@ msgstr "문자"
#: editor/rename_dialog.cpp
msgid "To Lowercase"
-msgstr "소문자로 하기"
+msgstr "소문자화"
#: editor/rename_dialog.cpp
msgid "To Uppercase"
-msgstr "대문자로 하기"
+msgstr "대문자화"
#: editor/rename_dialog.cpp
msgid "Reset"
msgstr "되돌리기"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "정규 표현식 오류"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "(문자 %s 위치)"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
-msgstr "부모 노드 다시 지정하기"
+msgstr "부모 노드 다시 지정"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
-msgstr "부모 노드 다시 지정 위치 (새 부모 노드를 선택해요):"
+msgstr "부모 노드 다시 지정 위치 (새 부모 노드를 선택합니다):"
#: editor/reparent_dialog.cpp
msgid "Keep Global Transform"
-msgstr "전역 변형 유지하기"
+msgstr "전역 변형 유지"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent"
-msgstr "부모 다시 지정하기"
+msgstr "부모 다시 지정"
#: editor/run_settings_dialog.cpp
msgid "Run Mode:"
@@ -10273,7 +10439,7 @@ msgstr "씬 실행 설정"
#: editor/scene_tree_dock.cpp
msgid "No parent to instance the scenes at."
-msgstr "씬을 인스턴스할 수 있는 부모가 없어요."
+msgstr "씬을 인스턴스할 수 있는 부모가 없습니다."
#: editor/scene_tree_dock.cpp
msgid "Error loading scene from %s"
@@ -10283,58 +10449,63 @@ msgstr "%s에서 씬 불러오는 중 오류"
msgid ""
"Cannot instance the scene '%s' because the current scene exists within one "
"of its nodes."
-msgstr "한 노드에 현재 씬이 있기 때문에, '%s' 씬을 인스턴스할 수 없어요."
+msgstr "한 노드에 현재 씬이 있기 때문에, '%s' 씬을 인스턴스할 수 없습니다."
#: editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
-msgstr "씬 인스턴스하기"
+msgstr "씬 인스턴스화"
#: editor/scene_tree_dock.cpp
msgid "Replace with Branch Scene"
-msgstr "분기 씬으로 교체하기"
+msgstr "가지 씬으로 교체"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
-msgstr "자식 씬 인스턴스하기"
+msgstr "자식 씬 인스턴스화"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "스크립트 삭제하기"
+msgid "Detach Script"
+msgstr "스크립트 떼기"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
-msgstr "이 작업은 트리 루트에서 할 수 없어요."
+msgstr "이 작업은 트리 루트에서 할 수 없습니다."
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
-msgstr "노드를 부모 노드로 이동하기"
+msgstr "노드를 부모 노드로 이동"
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr "노드들을 부모 노드로 이동하기"
+msgstr "노드들을 부모 노드로 이동"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr "노드 복제하기"
+msgstr "노드 복제"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
msgstr ""
-"상속한 씬에서 노드의 부모를 다시 지정할 수 없어요. 노드 순서는 바뀌지 않아요."
+"상속한 씬에서 노드의 부모를 다시 지정할 수 없습니다. 노드 순서는 바뀌지 않습"
+"니다."
#: editor/scene_tree_dock.cpp
msgid "Node must belong to the edited scene to become root."
-msgstr "노드는 루트가 되기 위해선 편집한 씬에 속해야 해요."
+msgstr "노드는 루트가 되기 위해선 편집한 씬에 속해야 합니다."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr "인스턴트화된 씬은 루트가 될 수 없어요"
+msgstr "인스턴트화된 씬은 루트가 될 수 없습니다"
#: editor/scene_tree_dock.cpp
msgid "Make node as Root"
msgstr "노드를 루트로 만들기"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "%d 개의 노드와 모든 자식 노드를 삭제할까요?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "%d개의 노드를 삭제할까요?"
@@ -10352,22 +10523,22 @@ msgstr "노드 \"%s\"을(를) 삭제할까요?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
-msgstr "루트 노드로는 수행할 수 없어요."
+msgstr "루트 노드로는 수행할 수 없습니다."
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
-msgstr "이 작업은 인스턴스된 씬에서 할 수 없어요."
+msgstr "이 작업은 인스턴스된 씬에서 할 수 없습니다."
#: editor/scene_tree_dock.cpp
msgid "Save New Scene As..."
-msgstr "새 씬을 다른 이름으로 저장하기..."
+msgstr "새 씬을 다른 이름으로 저장..."
#: editor/scene_tree_dock.cpp
msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
-"\"editable_instance\"를 끄게 되면 노드의 모든 속성이 기본 값으로 되돌아와요."
+"\"editable_instance\"를 끄게 되면 노드의 모든 속성이 기본 값으로 복원됩니다."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10375,7 +10546,7 @@ msgid ""
"cause all properties of the node to be reverted to their default."
msgstr ""
"\"자리 표시자로 불러오기\"를 켜면 \"편집할 수 있는 자식\" 설정이 꺼지고, 그러"
-"면 그 노드의 모든 속성이 기본값으로 돌아와요."
+"면 그 노드의 모든 속성이 기본값으로 복원됩니다."
#: editor/scene_tree_dock.cpp
msgid "Make Local"
@@ -10407,11 +10578,11 @@ msgstr "다른 노드"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
-msgstr "다른 씬에서 수행할 수 없는 작업이에요!"
+msgstr "다른 씬에서 수행할 수 없는 작업입니다!"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
-msgstr "상속 씬 내에서 수행할 수 없는 작업이에요!"
+msgstr "상속 씬 내에서 수행할 수 없는 작업입니다!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
@@ -10419,7 +10590,7 @@ msgstr "스크립트 붙이기"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
-msgstr "노드 삭제하기"
+msgstr "노드 삭제"
#: editor/scene_tree_dock.cpp
msgid "Change type of node(s)"
@@ -10430,7 +10601,7 @@ msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
msgstr ""
-"씬을 저장할 수 없어요. 종속 관계 (인스턴스)가 만족스럽지 않은 모양이에요."
+"씬을 저장할 수 없습니다. 종속 관계 (인스턴스)가 만족되지 않은 것 같습니다."
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
@@ -10461,8 +10632,17 @@ msgid "Open Documentation"
msgstr "문서 열기"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"스크립트를 붙일 수 없습니다: 언어가 하나도 등록되지 않았습니다.\n"
+"에디터가 모든 언어를 비활성화한 채로 빌드되어서 그럴 가능성이 높습니다."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
-msgstr "자식 노드 추가하기"
+msgstr "자식 노드 추가"
#: editor/scene_tree_dock.cpp
msgid "Expand/Collapse All"
@@ -10474,7 +10654,7 @@ msgstr "유형 바꾸기"
#: editor/scene_tree_dock.cpp
msgid "Reparent to New Node"
-msgstr "새 노드에 부모 노드 다시 지정하기"
+msgstr "새 노드에 부모 노드 다시 지정"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10486,34 +10666,34 @@ msgstr "다른 씬에서 병합하기"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Save Branch as Scene"
-msgstr "분기를 씬으로 저장하기"
+msgstr "가지를 씬으로 저장"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr "노드 경로 복사하기"
+msgstr "노드 경로 복사"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
-msgstr "삭제하기 (확인 없음)"
+msgstr "삭제 (확인 없음)"
#: editor/scene_tree_dock.cpp
msgid "Add/Create a New Node."
-msgstr "새 노드 추가하기/만들기."
+msgstr "새 노드를 추가하거나 만듭니다."
#: editor/scene_tree_dock.cpp
msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
-"씬 파일을 노드로 인스턴스해요. 루트 노드가 없으면 상속된 씬을 만들어요."
+"씬 파일을 노드로 인스턴스합니다. 루트 노드가 없으면 상속된 씬을 만듭니다."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "선택한 노드에 새로운 혹은 존재하는 스크립트를 붙여요."
+msgid "Attach a new or existing script to the selected node."
+msgstr "선택한 노드에 새 스크립트나 기존 스크립트를 붙입니다."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "선택한 노드의 스크립트를 삭제해요."
+msgid "Detach the script from the selected node."
+msgstr "선택한 노드에서 스크립트를 뗍니다."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10525,7 +10705,7 @@ msgstr "로컬"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance? (No Undo!)"
-msgstr "상속을 지울까요? (되돌릴 수 없어요!)"
+msgstr "상속을 지울까요? (되돌릴 수 없습니다!)"
#: editor/scene_tree_editor.cpp
msgid "Toggle Visible"
@@ -10552,7 +10732,7 @@ msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
-"노드가 %s 연결과 %s 그룹을 갖고 있어요.\n"
+"노드가 %s 연결과 %s 그룹을 갖고 있습니다.\n"
"클릭하면 시그널 독을 보여줘요."
#: editor/scene_tree_editor.cpp
@@ -10560,7 +10740,7 @@ msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
-"노드가 %s 연결을 갖고 있어요.\n"
+"노드가 %s 연결을 갖고 있습니다.\n"
"클릭하면 시그널 독을 보여줘요."
#: editor/scene_tree_editor.cpp
@@ -10568,7 +10748,7 @@ msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
-"노드가 그룹 안에 있어요.\n"
+"노드가 그룹 안에 있습니다.\n"
"클릭하면 그룹 독을 보여줘요."
#: editor/scene_tree_editor.cpp
@@ -10580,16 +10760,16 @@ msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
-"노드가 잠겨있어요.\n"
-"클릭하면 잠금을 풀어요."
+"노드가 잠겨있습니다.\n"
+"클릭하면 잠금을 해제합니다."
#: editor/scene_tree_editor.cpp
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
-"자식을 선택할 수 없어요.\n"
-"클릭하면 선택할 수 있어요."
+"자식을 선택할 수 없습니다.\n"
+"클릭하면 선택할 수 있습니다."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -10600,12 +10780,12 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
-"AnimationPlayer가 고정되어 있어요.\n"
-"클릭하면 고정을 풀어요."
+"AnimationPlayer가 고정되어 있습니다.\n"
+"클릭하면 고정을 해제합니다."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
-msgstr "잘못된 노드 이름이에요. 다음 문자는 허용하지 않아요:"
+msgstr "잘못된 노드 이름입니다. 다음 문자는 허용하지 않습니다:"
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
@@ -10625,15 +10805,15 @@ msgstr "노드를 선택하세요"
#: editor/script_create_dialog.cpp
msgid "Path is empty."
-msgstr "경로가 비었어요."
+msgstr "경로가 비었습니다."
#: editor/script_create_dialog.cpp
msgid "Filename is empty."
-msgstr "파일 이름이 비었어요."
+msgstr "파일 이름이 비었습니다."
#: editor/script_create_dialog.cpp
msgid "Path is not local."
-msgstr "경로가 로컬이 아니에요."
+msgstr "경로가 로컬이 아닙니다."
#: editor/script_create_dialog.cpp
msgid "Invalid base path."
@@ -10641,7 +10821,11 @@ msgstr "잘못된 기본 경로."
#: editor/script_create_dialog.cpp
msgid "A directory with the same name exists."
-msgstr "같은 이름의 디렉토리가 있어요."
+msgstr "같은 이름의 디렉토리가 있습니다."
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "파일이 존재하지 않습니다."
#: editor/script_create_dialog.cpp
msgid "Invalid extension."
@@ -10657,7 +10841,7 @@ msgstr "'%s' 템플릿 불러오는 중 오류"
#: editor/script_create_dialog.cpp
msgid "Error - Could not create script in filesystem."
-msgstr "오류 - 파일 시스템에 스크립트를 만들 수 없어요."
+msgstr "오류 - 파일 시스템에 스크립트를 만들 수 없습니다."
#: editor/script_create_dialog.cpp
msgid "Error loading script from %s"
@@ -10665,7 +10849,7 @@ msgstr "'%s' 스크립트 불러오는 중 오류"
#: editor/script_create_dialog.cpp
msgid "Overrides"
-msgstr "다시 정의하기"
+msgstr "재정의"
#: editor/script_create_dialog.cpp
msgid "N/A"
@@ -10673,7 +10857,7 @@ msgstr "해당 없음"
#: editor/script_create_dialog.cpp
msgid "Open Script / Choose Location"
-msgstr "스크립트 열기 / 위치 선택하기"
+msgstr "스크립트 열기 / 위치 선택"
#: editor/script_create_dialog.cpp
msgid "Open Script"
@@ -10681,7 +10865,11 @@ msgstr "스크립트 열기"
#: editor/script_create_dialog.cpp
msgid "File exists, it will be reused."
-msgstr "파일이 있어요. 다시 사용할 거예요."
+msgstr "파일이 있습니다. 다시 사용할 것입니다."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "올바르지 않은 경로입니다."
#: editor/script_create_dialog.cpp
msgid "Invalid class name."
@@ -10692,8 +10880,8 @@ msgid "Invalid inherited parent name or path."
msgstr "잘못된 상속된 부모 이름 또는 경로."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "스크립트가 올바릅니다."
+msgid "Script path/name is valid."
+msgstr "스크립트의 경로/이름이 올바릅니다."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10705,15 +10893,23 @@ msgstr "내장 스크립트 (씬 파일 안)."
#: editor/script_create_dialog.cpp
msgid "Will create a new script file."
-msgstr "새 스크립트 파일을 만들어요."
+msgstr "새 스크립트 파일을 만듭니다."
#: editor/script_create_dialog.cpp
msgid "Will load an existing script file."
-msgstr "기존 스크립트 파일을 불러와요."
+msgstr "기존 스크립트 파일을 불러옵니다."
#: editor/script_create_dialog.cpp
msgid "Script file already exists."
-msgstr "스크립트 파일이 이미 있어요."
+msgstr "스크립트 파일이 이미 있습니다."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"참고: 내장 스크립트에는 일부 제한 사항이 있으며 외부 편집기를 사용하여 편집"
+"할 수 없습니다."
#: editor/script_create_dialog.cpp
msgid "Class Name:"
@@ -10781,7 +10977,11 @@ msgstr "자식 프로세스 연결됨."
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
-msgstr "복사하기 오류"
+msgstr "복사 오류"
+
+#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "비디오 RAM"
#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
@@ -10789,11 +10989,11 @@ msgstr "중단점 넘기기"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
-msgstr "이전 인스턴스 검사하기"
+msgstr "이전 인스턴스 검사"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
-msgstr "다음 인스턴스 검사하기"
+msgstr "다음 인스턴스 검사"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
@@ -10832,8 +11032,8 @@ msgid "Total:"
msgstr "전체:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "비디오 메모리"
+msgid "Export list to a CSV file"
+msgstr "목록을 CSV 파일로 내보내기"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -10869,7 +11069,7 @@ msgstr "실시간 편집 루트:"
#: editor/script_editor_debugger.cpp
msgid "Set From Tree"
-msgstr "트리에서 설정하기"
+msgstr "트리에서 설정"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
@@ -10881,7 +11081,7 @@ msgstr "단축키 지우기"
#: editor/settings_config_dialog.cpp
msgid "Restore Shortcut"
-msgstr "단축키 복원하기"
+msgstr "단축키 복원"
#: editor/settings_config_dialog.cpp
msgid "Change Shortcut"
@@ -10973,15 +11173,15 @@ msgstr "도넛 외부 반지름 바꾸기"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
-msgstr "이 항목의 동적 라이브러리 선택하기"
+msgstr "이 항목의 동적 라이브러리 선택"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select dependencies of the library for this entry"
-msgstr "이 항목의 동적 라이브러리의 종속 관계를 선택하기"
+msgstr "이 항목의 동적 라이브러리의 종속 관계를 선택"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Remove current entry"
-msgstr "현재 엔트리 삭제하기"
+msgstr "현재 엔트리 삭제"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
@@ -11001,7 +11201,7 @@ msgstr "동적 라이브러리"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Add an architecture entry"
-msgstr "구조 항목을 추가하기"
+msgstr "구조 항목을 추가"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "GDNativeLibrary"
@@ -11029,7 +11229,7 @@ msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
msgid "Step argument is zero!"
-msgstr "스텝 인수가 0이에요!"
+msgstr "스텝 인수가 0입니다!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -11061,7 +11261,7 @@ msgstr "잘못된 인스턴스 Dictionary (하위 클래스가 올바르지 않
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
-msgstr "객체는 길이를 제공할 수 없어요."
+msgstr "객체는 길이를 제공할 수 없습니다."
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Next Plane"
@@ -11089,7 +11289,7 @@ msgstr "층:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Delete Selection"
-msgstr "그리드맵 선택 항목 삭제하기"
+msgstr "그리드맵 선택 항목 삭제"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Fill Selection"
@@ -11181,7 +11381,7 @@ msgstr "그리드맵 설정"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Pick Distance:"
-msgstr "거리 선택하기:"
+msgstr "거리 선택:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Filter meshes"
@@ -11193,7 +11393,7 @@ msgstr "메시를 사용하려면 이 GridMap에 MeshLibrary 리소스를 주세
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
-msgstr "클래스 이름은 키워드가 될 수 없어요"
+msgstr "클래스 이름은 키워드가 될 수 없습니다"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
@@ -11264,7 +11464,7 @@ msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
msgstr ""
-"작업 메모리 없이 Yield된 노드이에요 문서에서 노드에게 적절히 Yield하는 방법"
+"작업 메모리 없이 Yield된 노드입니다. 문서에서 노드에게 적절히 Yield하는 방법"
"을 읽어주세요!"
#: modules/visual_script/visual_script.cpp
@@ -11272,15 +11472,15 @@ msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
msgstr ""
-"노드가 Yield됐지만, 첫번째 작업 메모리의 함수 상태를 반환하지 않았어요."
+"노드가 Yield됐지만, 첫번째 작업 메모리의 함수 상태를 반환하지 않았습니다."
#: modules/visual_script/visual_script.cpp
msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
msgstr ""
-"반환 값은 반드시 노드 작업 메모리의 첫 번째 요소로 지정해야 해요! 노드를 고쳐"
-"주세요."
+"반환 값은 반드시 노드 작업 메모리의 첫 번째 요소로 지정해야 합니다! 노드를 고"
+"쳐주세요."
#: modules/visual_script/visual_script.cpp
msgid "Node returned an invalid sequence output: "
@@ -11288,7 +11488,8 @@ msgstr "잘못된 시퀀스 출력을 반환한 노드: "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr "시퀀스 비트를 발견했지만 스택 안의 노드에는 없어요. 버그를 신고하세요!"
+msgstr ""
+"시퀀스 비트를 발견했지만 스택 안의 노드에는 없습니다. 버그를 신고하세요!"
#: modules/visual_script/visual_script.cpp
msgid "Stack overflow with stack depth: "
@@ -11324,11 +11525,11 @@ msgstr "출력 포트 추가하기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Override an existing built-in function."
-msgstr "존재하는 내장 함수를 다시 정의해요."
+msgstr "존재하는 내장 함수를 재정의합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Create a new function."
-msgstr "새 함수를 만들어요."
+msgstr "새 함수를 만듭니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
@@ -11336,7 +11537,7 @@ msgstr "변수:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Create a new variable."
-msgstr "새 변수를 만들어요."
+msgstr "새 변수를 만듭니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -11344,7 +11545,7 @@ msgstr "시그널:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Create a new signal."
-msgstr "새 시그널을 만들어요."
+msgstr "새 시그널을 만듭니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
@@ -11368,19 +11569,19 @@ msgstr "시그널 이름 바꾸기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Function"
-msgstr "함수 추가하기"
+msgstr "함수 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete input port"
-msgstr "입력 포트 삭제하기"
+msgstr "입력 포트 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
-msgstr "변수 추가하기"
+msgstr "변수 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Signal"
-msgstr "시그널 추가하기"
+msgstr "시그널 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Input Port"
@@ -11396,63 +11597,64 @@ msgstr "표현식 바꾸기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr "비주얼 스크립트 노드 삭제하기"
+msgstr "비주얼 스크립트 노드 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr "비주얼 스크립트 노드 복제하기"
+msgstr "비주얼 스크립트 노드 복제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"%s을(를) 누르고 있으면 Getter를 드롭해요. Shift를 누르고 있으면 일반적인 시그"
-"니처를 드롭해요."
+"%s을(를) 누르고 있으면 Getter를 드롭합니다. Shift를 누르고 있으면 일반적인 시"
+"그니처를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"Ctrl을 누르고 있으면 Getter를 드롭해요. Shift를 누르고 있으면 일반적인 시그니"
-"처를 드롭해요."
+"Ctrl을 누르고 있으면 Getter를 드롭합니다. Shift를 누르고 있으면 일반적인 시그"
+"니처를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
-msgstr "%s을(를) 누르고 있으면 노드에 대한 간단한 참조를 드롭해요."
+msgstr "%s을(를) 누르고 있으면 노드에 대한 간단한 참조를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr "Ctrl을 누르고 있으면 노드에 대한 간단한 참조를 드롭해요."
+msgstr "Ctrl을 누르고 있으면 노드에 대한 간단한 참조를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
-msgstr "%s을(를) 누르고 있르면 변수 Setter를 드롭해요."
+msgstr "%s을(를) 누르고 있르면 변수 Setter를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr "Ctrl을 누르고 있으면 변수 Setter를 드롭해요."
+msgstr "Ctrl을 누르고 있으면 변수 Setter를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
-msgstr "Preload 노드 추가하기"
+msgstr "Preload 노드 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node(s) From Tree"
-msgstr "트리에서 노드 추가하기"
+msgstr "트리에서 노드 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid ""
"Can't drop properties because script '%s' is not used in this scene.\n"
"Drop holding 'Shift' to just copy the signature."
msgstr ""
-"스크립트 '%s'이(가) 이 씬에서 사용되지 않고 있어서 속성을 드롭할 수 없어요.\n"
-"'Shift' 키를 누른 채로 드롭하면 시그니처를 복사해요."
+"스크립트 '%s'이(가) 이 씬에서 사용되지 않고 있어서 속성을 드롭할 수 없습니"
+"다.\n"
+"'Shift' 키를 누른 채로 드롭하면 시그니처를 복사합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
-msgstr "Getter 속성 추가하기"
+msgstr "Getter 속성 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Setter Property"
-msgstr "Setter 속성 추가하기"
+msgstr "Setter 속성 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Base Type"
@@ -11460,15 +11662,15 @@ msgstr "기본 유형 바꾸기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Move Node(s)"
-msgstr "노드 이동하기"
+msgstr "노드 이동"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
-msgstr "비주얼 스크립트 노드 삭제하기"
+msgstr "비주얼 스크립트 노드 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Nodes"
-msgstr "노드 연결하기"
+msgstr "노드 연결"
#: modules/visual_script/visual_script_editor.cpp
msgid "Disconnect Nodes"
@@ -11476,15 +11678,15 @@ msgstr "그래프 노드 연결 풀기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Node Data"
-msgstr "노드 데이터 연결하기"
+msgstr "노드 데이터 연결"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Node Sequence"
-msgstr "노드 시퀀스 연결하기"
+msgstr "노드 시퀀스 연결"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
-msgstr "스크립트가 이미 '%s' 함수를 갖고 있어요"
+msgstr "스크립트가 이미 '%s' 함수를 갖고 있습니다"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Input Value"
@@ -11492,15 +11694,15 @@ msgstr "입력 값 바꾸기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Resize Comment"
-msgstr "주석 크기 조절하기"
+msgstr "주석 크기 조절"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr "함수 노드를 복사할 수 없어요."
+msgstr "함수 노드를 복사할 수 없습니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
-msgstr "클립보드가 비었어요!"
+msgstr "클립보드가 비었습니다!"
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste VisualScript Nodes"
@@ -11508,11 +11710,11 @@ msgstr "비주얼 스크립트 노드 붙여넣기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function with a function node."
-msgstr "함수 노드가 있으면 함수를 만들 수 없어요."
+msgstr "함수 노드가 있으면 함수를 만들 수 없습니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr "많은 함수의 노드에서 노드의 함수를 만들 수 없어요."
+msgstr "많은 함수의 노드에서 노드의 함수를 만들 수 없습니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Select at least one node with sequence port."
@@ -11528,23 +11730,23 @@ msgstr "함수 만들기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
-msgstr "함수 삭제하기"
+msgstr "함수 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Variable"
-msgstr "변수 삭제하기"
+msgstr "변수 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Variable:"
-msgstr "변수 편집하기:"
+msgstr "변수 편집:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
-msgstr "시그널 삭제하기"
+msgstr "시그널 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Signal:"
-msgstr "시그널 편집하기:"
+msgstr "시그널 편집:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Tool:"
@@ -11560,11 +11762,11 @@ msgstr "기본 유형 바꾸기:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Nodes..."
-msgstr "노드 추가하기..."
+msgstr "노드 추가..."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Function..."
-msgstr "함수 추가하기..."
+msgstr "함수 추가..."
#: modules/visual_script/visual_script_editor.cpp
msgid "function_name"
@@ -11576,7 +11778,7 @@ msgstr "그래프를 편집하기 위한 함수를 선택하거나 만드세요.
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr "선택 항목 삭제하기"
+msgstr "선택 항목 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
@@ -11584,7 +11786,7 @@ msgstr "노드 유형 찾기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr "노드 복사하기"
+msgstr "노드 복사"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
@@ -11600,7 +11802,7 @@ msgstr "그래프 새로고침"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
-msgstr "멤버 편집하기"
+msgstr "멤버 편집"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -11608,7 +11810,7 @@ msgstr "반복할 수 없는 입력 유형: "
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid"
-msgstr "Iterator가 잘못됐어요"
+msgstr "Iterator가 잘못되었습니다"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid: "
@@ -11620,15 +11822,15 @@ msgstr "잘못된 인덱스 속성 이름."
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
-msgstr "기본 객체는 노드가 아니에요!"
+msgstr "기본 객체는 노드가 아닙니다!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Path does not lead Node!"
-msgstr "노드를 지정하는 경로가 아니에요!"
+msgstr "노드를 지정하는 경로가 아닙니다!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
-msgstr "노드 %s 안에 인덱스 속성 이름 '%s'이(가) 잘못됐어요."
+msgstr "노드 %s 안에 인덱스 속성 이름 '%s'이(가) 잘못되었습니다."
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
@@ -11648,19 +11850,19 @@ msgstr "VariableSet을 스크립트에서 찾을 수 없음: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "Custom node has no _step() method, can't process graph."
-msgstr "맞춤 노드에 _step() 메서드가 없어요. 그래프를 처리할 수 없어요."
+msgstr "맞춤 노드에 _step() 메서드가 없습니다. 그래프를 처리할 수 없습니다."
#: modules/visual_script/visual_script_nodes.cpp
msgid ""
"Invalid return value from _step(), must be integer (seq out), or string "
"(error)."
msgstr ""
-"_step()에서 잘못된 반환 값이에요. 정수 (seq out), 또는 문자열 (error)이어야 "
-"해요."
+"_step()에서 잘못된 반환 값입니다. 정수 (seq out), 또는 문자열 (error)이어야 "
+"합니다."
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search VisualScript"
-msgstr "비주얼 스크립트 검색하기"
+msgstr "비주얼 스크립트 검색"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
@@ -11672,63 +11874,68 @@ msgstr "Set %s"
#: platform/android/export/export.cpp
msgid "Package name is missing."
-msgstr "패키지 이름이 없어요."
+msgstr "패키지 이름이 없습니다."
#: platform/android/export/export.cpp
msgid "Package segments must be of non-zero length."
-msgstr "패키지 세그먼트는 길이가 0이 아니어야 해요."
+msgstr "패키지 세그먼트는 길이가 0이 아니어야 합니다."
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr "문자 '%s'은(는) 안드로이드 애플리케이션 패키지 이름으로 쓸 수 없어요."
+msgstr ""
+"문자 '%s'은(는) 안드로이드 애플리케이션 패키지 이름으로 쓸 수 없습니다."
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
-msgstr "숫자는 패키지 세그먼트의 첫 문자로 쓸 수 없어요."
+msgstr "숫자는 패키지 세그먼트의 첫 문자로 쓸 수 없습니다."
#: platform/android/export/export.cpp
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr "문자 '%s'은(는) 패키지 세그먼트의 첫 문자로 쓸 수 없어요."
+msgstr "문자 '%s'은(는) 패키지 세그먼트의 첫 문자로 쓸 수 없습니다."
#: platform/android/export/export.cpp
msgid "The package must have at least one '.' separator."
-msgstr "패키지는 적어도 하나의 '.' 분리 기호가 있어야 해요."
+msgstr "패키지는 적어도 하나의 '.' 분리 기호가 있어야 합니다."
#: platform/android/export/export.cpp
msgid "Select device from the list"
-msgstr "목록에서 기기 선택하기"
+msgstr "목록에서 기기 선택"
#: platform/android/export/export.cpp
msgid "ADB executable not configured in the Editor Settings."
-msgstr "ADB 실행 파일을 편집기 설정에서 설정하지 않았어요."
+msgstr "ADB 실행 파일을 편집기 설정에서 설정하지 않았습니다."
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr "OpenJDK jarsigner를 편집기 설정에서 설정하지 않았어요."
+msgstr "OpenJDK jarsigner를 편집기 설정에서 설정하지 않았습니다."
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
-msgstr "Debug keystore를 편집기 설정과 프리셋에 설정하지 않았어요."
+msgstr "Debug keystore를 편집기 설정과 프리셋에 설정하지 않았습니다."
+
+#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "내보내기 프리셋에 배포 keystorke가 잘못 설정되어 있습니다."
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
-msgstr "맞춤 빌드에는 편집기 설정에서 올바른 안드로이드 SDK 경로가 필요해요."
+msgstr "맞춤 빌드에는 편집기 설정에서 올바른 안드로이드 SDK 경로가 필요합니다."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
-msgstr "편집기 설정에서 맞춤 빌드에 잘못된 안드로이드 SDK 경로이에요."
+msgstr "편집기 설정에서 맞춤 빌드에 잘못된 안드로이드 SDK 경로입니다."
#: platform/android/export/export.cpp
msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
msgstr ""
-"프로젝트에 안드로이드 빌드 템플릿을 설치하지 않았네요. 프로젝트 메뉴에서 설치"
-"하세요."
+"프로젝트에 안드로이드 빌드 템플릿을 설치하지 않았습니다. 프로젝트 메뉴에서 설"
+"치하세요."
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr "APK 확장에 잘못된 공개 키에요."
+msgstr "APK 확장에 잘못된 공개 키입니다."
#: platform/android/export/export.cpp
msgid "Invalid package name:"
@@ -11736,11 +11943,44 @@ msgstr "잘못된 패키지 이름:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"\"android/modules\" 프로젝트 세팅에 잘못된 \"GodotPaymentV3\" 모듈이 포함되"
+"어 있습니다. (Godot 3.2.2 에서 변경됨).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "플러그인을 사용하려면 \"커스텀 빌드 사용\"이 활성화되어야 합니다."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"자유도(DoF)\"는 \"Xr 모드\" 가 \"Oculus Mobile VR\" 일 때만 사용 가능합니"
+"다."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"손 추적\" 은 \"Xr 모드\" 가 \"Oculus Mobile VR\"일 때만 사용 가능합니다."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"포커스 인식\"은 \"Xr 모드\"가 \"Oculus Mobile VR\" 인 경우에만 사용 가능합"
+"니다."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
-"맞춤 빌드 템플릿으로 빌드하려 했으나, 버전 정보가가 없어요. '프로젝트' 메뉴에"
-"서 다시 설치해주세요."
+"맞춤 빌드 템플릿으로 빌드하려 했으나, 버전 정보가가 없습니다. '프로젝트' 메뉴"
+"에서 다시 설치해주세요."
#: platform/android/export/export.cpp
msgid ""
@@ -11763,7 +12003,7 @@ msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
-"안드로이드 프로젝트의 빌드에 실패했어요, 출력한 오류를 확인하세요.\n"
+"안드로이드 프로젝트의 빌드에 실패했, 출력한 오류를 확인하세요.\n"
"또는 docs.godotengine.org에서 안드로이드 빌드 문서를 찾아 보세요."
#: platform/android/export/export.cpp
@@ -11772,15 +12012,15 @@ msgstr "여기에 빌드 apk를 만들지 않음: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
-msgstr "식별자가 없어요."
+msgstr "식별자가 없습니다."
#: platform/iphone/export/export.cpp
msgid "The character '%s' is not allowed in Identifier."
-msgstr "문자 '%s'은(는) 식별자에 쓸 수 없어요."
+msgstr "문자 '%s'은(는) 식별자에 쓸 수 없습니다."
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
-msgstr "App Store 팀 ID를 지정하지 않았어요 - 프로젝트를 구성할 수 없어요."
+msgstr "App Store 팀 ID를 지정하지 않았습니다 - 프로젝트를 구성할 수 없습니다."
#: platform/iphone/export/export.cpp
msgid "Invalid Identifier:"
@@ -11788,7 +12028,7 @@ msgstr "잘못된 식별자:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
-msgstr "요구하는 아이콘을 프리셋에서 지정하지 않았어요."
+msgstr "요구하는 아이콘을 프리셋에서 지정하지 않았습니다."
#: platform/javascript/export/export.cpp
msgid "Stop HTTP Server"
@@ -11796,11 +12036,11 @@ msgstr "HTTP 서버 멈추기"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
-msgstr "브라우저에서 실행하기"
+msgstr "브라우저에서 실행"
#: platform/javascript/export/export.cpp
msgid "Run exported HTML in the system's default browser."
-msgstr "내보낸 HTML을 시스템의 기본 브라우저를 사용하여 실행해요."
+msgstr "내보낸 HTML을 시스템의 기본 브라우저를 사용하여 실행합니다."
#: platform/javascript/export/export.cpp
msgid "Could not write file:"
@@ -11824,7 +12064,7 @@ msgstr "부트 스플래시 이미지 파일을 읽을 수 없음:"
#: platform/javascript/export/export.cpp
msgid "Using default boot splash image."
-msgstr "기본 부트 스플래시 이미지 사용하기."
+msgstr "기본 부트 스플래시 이미지 사용."
#: platform/uwp/export/export.cpp
msgid "Invalid package short name."
@@ -11852,31 +12092,31 @@ msgstr "잘못된 배경 색상."
#: platform/uwp/export/export.cpp
msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr "잘못된 Store 로고 이미지 크기(50x50이어야 해요)."
+msgstr "잘못된 Store 로고 이미지 크기(50x50이어야 합니다)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr "잘못된 사각형 44x44 로고 이미지 크기 (44x44이어야 해요)."
+msgstr "잘못된 사각형 44x44 로고 이미지 크기 (44x44이어야 합니다)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr "잘못된 사각형 71x71 로고 이미지 크기 (71x71이어야 해요)."
+msgstr "잘못된 사각형 71x71 로고 이미지 크기 (71x71이어야 합니다)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr "잘못된 사각형 150x150 로고 이미지 크기 (150x150이어야 해요)."
+msgstr "잘못된 사각형 150x150 로고 이미지 크기 (150x150이어야 합니다)."
#: platform/uwp/export/export.cpp
msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr "잘못된 사각형 310x310 로고 이미지 크기 (310x310이어야 해요)."
+msgstr "잘못된 사각형 310x310 로고 이미지 크기 (310x310이어야 합니다)."
#: platform/uwp/export/export.cpp
msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr "잘못된 넓은 310x150 로고 이미지 크기 (310x150이어야 해요)."
+msgstr "잘못된 넓은 310x150 로고 이미지 크기 (310x150이어야 합니다)."
#: platform/uwp/export/export.cpp
msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr "잘못된 스플래시 스크린 이미지 크기 (620x300이어야 해요)."
+msgstr "잘못된 스플래시 스크린 이미지 크기 (620x300이어야 합니다)."
#: scene/2d/animated_sprite.cpp
msgid ""
@@ -11884,15 +12124,15 @@ msgid ""
"order for AnimatedSprite to display frames."
msgstr ""
"AnimatedSprite이 프레임을 보여주려면 \"Frames\" 속성에 SpriteFrames 리소스를 "
-"만들거나 지정해야 해요."
+"만들거나 지정해야 합니다."
#: scene/2d/canvas_modulate.cpp
msgid ""
"Only one visible CanvasModulate is allowed per scene (or set of instanced "
"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
-"CanvasModulate는 씬 당 단 하나만 보일 수 있어요. 처음에 만든 것만 작동하고, "
-"나머지는 무시돼요."
+"CanvasModulate는 씬 당 단 하나만 보일 수 있습니다. 처음에 만든 것만 작동하"
+"고, 나머지는 무시됩니다."
#: scene/2d/collision_object_2d.cpp
msgid ""
@@ -11900,7 +12140,7 @@ msgid ""
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"이 노드는 Shape가 없어요, 다른 물체와 충돌하거나 상호 작용할 수 없어요.\n"
+"이 노드는 Shape가 없습니다, 다른 물체와 충돌하거나 상호 작용할 수 없습니다.\n"
"CollisionShape2D 또는 CollisionPolygon2D를 자식 노드로 추가하여 Shape를 정의"
"하세요."
@@ -11910,13 +12150,13 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionPolygon2D는 CollisionObject2D에 충돌 모양을 지정하는 용도로만 사용돼"
-"요. Shape를 정의해야 하는 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D "
-"등의 자식으로만 사용해주세요."
+"CollisionPolygon2D는 CollisionObject2D에 충돌 모양을 지정하는 용도로만 사용됩"
+"니다. Shape를 정의해야 하는 Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D 등의 자식으로만 사용해주세요."
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
-msgstr "빈 CollisionPolygon2D는 충돌에 영향을 주지 않아요."
+msgstr "빈 CollisionPolygon2D는 충돌에 영향을 주지 않습니다."
#: scene/2d/collision_shape_2d.cpp
msgid ""
@@ -11924,8 +12164,8 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D는 CollisionObject2D에 충돌 모양을 지정하는 용도로만 사용돼"
-"요. Shape를 정의해야 하는 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D "
+"CollisionShape2D는 CollisionObject2D에 충돌 모양을 지정하는 용도로만 사용됩니"
+"다. Shape를 정의해야 하는 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D "
"등의 자식으로만 사용해주세요."
#: scene/2d/collision_shape_2d.cpp
@@ -11933,8 +12173,16 @@ msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
-"CollisionShape2D가 작동하려면 반드시 Shape가 있어야 해요. Shape 리소스를 만들"
-"어주세요!"
+"CollisionShape2D가 작동하려면 반드시 Shape가 있어야 합니다. Shape 리소스를 만"
+"들어주세요!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"폴리곤 기반 Shape는 CollisionShape2D에 추가하거나 거기서 편집하게끔 설계하지 "
+"않았습니다. 대신 CollisionPolygon2D 노드를 사용하십시오."
#: scene/2d/cpu_particles_2d.cpp
msgid ""
@@ -11942,46 +12190,46 @@ msgid ""
"\"Particles Animation\" enabled."
msgstr ""
"CPUParticles2D 애니메이션에는 \"Particles Animation\"이 켜진 "
-"CanvasItemMaterial을 사용해야 해요."
+"CanvasItemMaterial을 사용해야 합니다."
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
-msgstr "조명의 모양을 나타낼 텍스처를 \"Texture\" 속성에 지정해야 해요."
+msgstr "조명의 모양을 나타낼 텍스처를 \"Texture\" 속성에 지정해야 합니다."
#: scene/2d/light_occluder_2d.cpp
msgid ""
"An occluder polygon must be set (or drawn) for this occluder to take effect."
msgstr ""
-"이 Occluder가 영향을 주게 하려면 Occluder 폴리곤을 설정해야 (혹은 그려야) 해"
-"요."
+"이 Occluder가 영향을 주게 하려면 Occluder 폴리곤을 설정해야 (혹은 그려야) 합"
+"니다."
#: scene/2d/light_occluder_2d.cpp
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
-msgstr "Occluder 폴리곤이 비어있어요. 폴리곤을 그려주세요."
+msgstr "Occluder 폴리곤이 비어있습니다. 폴리곤을 그려주세요."
#: scene/2d/navigation_polygon.cpp
msgid ""
"A NavigationPolygon resource must be set or created for this node to work. "
"Please set a property or draw a polygon."
msgstr ""
-"이 노드가 작동하려면 NavigationPolygon 리소스를 설정하거나 만들어야 해요. 속"
-"성을 설정하거나 폴리곤을 그려주세요."
+"이 노드가 작동하려면 NavigationPolygon 리소스를 설정하거나 만들어야 합니다. "
+"속성을 설정하거나 폴리곤을 그려주세요."
#: scene/2d/navigation_polygon.cpp
msgid ""
"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
"node. It only provides navigation data."
msgstr ""
-"NavigationPolygonInstance는 Navigation2D 노드의 자식 또는 그 아래에 있어야 해"
-"요. 이것은 내비게이션 데이터만을 제공해요."
+"NavigationPolygonInstance는 Navigation2D 노드의 자식 또는 그 아래에 있어야 합"
+"니다. 이것은 내비게이션 데이터만을 제공합니다."
#: scene/2d/parallax_layer.cpp
msgid ""
"ParallaxLayer node only works when set as child of a ParallaxBackground node."
msgstr ""
-"ParallaxLayer는 ParallaxBackground 노드의 자식 노드로 있을 때만 작동해요."
+"ParallaxLayer는 ParallaxBackground 노드의 자식 노드로 있을 때만 작동합니다."
#: scene/2d/particles_2d.cpp
msgid ""
@@ -11989,16 +12237,17 @@ msgid ""
"Use the CPUParticles2D node instead. You can use the \"Convert to "
"CPUParticles\" option for this purpose."
msgstr ""
-"GPU 기반 파티클은 GLES2 비디오 드라이버에서 지원하지 않아요.\n"
-"대신 CPUParticles2D 노드를 사용하세요. 이 경우 \"CPU파티클로 변환하기\" 옵션"
-"을 사용할 수 있어요."
+"GPU 기반 파티클은 GLES2 비디오 드라이버에서 지원하지 않습니다.\n"
+"대신 CPUParticles2D 노드를 사용하세요. 이 경우 \"CPU파티클로 변환\" 옵션을 사"
+"용할 수 있습니다."
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
"A material to process the particles is not assigned, so no behavior is "
"imprinted."
msgstr ""
-"파티클을 처리할 머티리얼을 지정하지 않았어요. 아무런 동작도 찍히지 않아요."
+"파티클을 처리할 머티리얼을 지정하지 않았습니다. 아무런 동작도 찍히지 않습니"
+"다."
#: scene/2d/particles_2d.cpp
msgid ""
@@ -12006,11 +12255,11 @@ msgid ""
"\"Particles Animation\" enabled."
msgstr ""
"Particles2D 애니메이션은 \"Particles Animation\"이 켜져 있는 "
-"CanvasItemMaterial을 사용해야 해요."
+"CanvasItemMaterial을 사용해야 합니다."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
-msgstr "PathFollow2D는 Path2D 노드의 자식 노드로 있을 때만 작동해요."
+msgstr "PathFollow2D는 Path2D 노드의 자식 노드로 있을 때만 작동합니다."
#: scene/2d/physics_body_2d.cpp
msgid ""
@@ -12019,27 +12268,27 @@ msgid ""
"Change the size in children collision shapes instead."
msgstr ""
"(캐릭터나 리지드 모드에서) RigidBody2D의 크기 변경은 물리 엔진이 작동하는 동"
-"안 큰 부담이 돼요.\n"
+"안 큰 부담이 됩니다.\n"
"대신 자식 충돌 형태의 크기를 변경해보세요."
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
-msgstr "Path 속성은 올바른 Node2D 노드를 가리켜야 해요."
+msgstr "Path 속성은 올바른 Node2D 노드를 가리켜야 합니다."
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr "이 Bone2D 체인은 Skeleton2D 노드에서 끝나야 해요."
+msgstr "이 Bone2D 체인은 Skeleton2D 노드에서 끝나야 합니다."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr "Bone2D는 Skeleton2D나 다른 Bone2D가 부모 노드로 있어야만 작동해요."
+msgstr "Bone2D는 Skeleton2D나 다른 Bone2D가 부모 노드로 있어야만 작동합니다."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
-"이 본에 적절한 대기 자세가 없어요. Skeleton2D 노드로 가서 대기 자세를 설정하"
-"세요."
+"이 본에 적절한 대기 자세가 없습니다. Skeleton2D 노드로 가서 대기 자세를 설정"
+"하세요."
#: scene/2d/tile_map.cpp
msgid ""
@@ -12047,46 +12296,46 @@ msgid ""
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
-"Use Parent가 켜진 TileMap은 형태를 주는 부모 CollisionObject2D가 필요해요. 형"
-"태를 주기 위해 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D 등을 자식 "
-"노드로 사용해주세요."
+"Use Parent가 켜진 TileMap은 형태를 주는 부모 CollisionObject2D가 필요합니다. "
+"형태를 주기 위해 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D 등을 자"
+"식 노드로 사용해주세요."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
msgstr ""
-"VisibilityEnabler2D는 편집한 씬의 루트에 직접 부모로 사용할 때 가장 잘 작동해"
-"요."
+"VisibilityEnabler2D는 편집한 씬의 루트에 직접 부모로 사용할 때 가장 잘 작동합"
+"니다."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr "ARVRCamera는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 해요."
+msgstr "ARVRCamera는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 합니다."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr "ARVRController는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 해요."
+msgstr "ARVRController는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 합니다."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
msgstr ""
-"컨트롤러 ID가 0이 되면 컨트롤러가 실제 컨트롤러에 바인딩하지 않게 돼요."
+"컨트롤러 ID가 0이 되면 컨트롤러가 실제 컨트롤러에 바인딩하지 않게 됩니다."
#: scene/3d/arvr_nodes.cpp
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ARVRAnchor는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 해요."
+msgstr "ARVRAnchor는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 합니다."
#: scene/3d/arvr_nodes.cpp
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
-msgstr "앵커 ID가 0이 되면 앵커가 실제 앵커에 바인딩하지 않게 돼요."
+msgstr "앵커 ID가 0이 되면 앵커가 실제 앵커에 바인딩하지 않게 됩니다."
#: scene/3d/arvr_nodes.cpp
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROrigin은 자식으로 ARVRCamera 노드가 필요해요."
+msgstr "ARVROrigin은 자식으로 ARVRCamera 노드가 필요합니다."
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
@@ -12118,7 +12367,7 @@ msgid ""
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"이 노드는 Shape가 없어요. 다른 물체와 충돌하거나 상호 작용할 수 없어요.\n"
+"이 노드는 Shape가 없습니다. 다른 물체와 충돌하거나 상호 작용할 수 없습니다.\n"
"CollisionShape 또는 CollisionPolygon을 자식 노드로 추가해서 Shape을 정의해보"
"세요."
@@ -12128,13 +12377,13 @@ msgid ""
"CollisionObject derived node. Please only use it as a child of Area, "
"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
-"CollisionPolygon은 CollisionObject에 충돌 Shape를 지정하는 용도로만 사용돼"
-"요. Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가해서 사용"
+"CollisionPolygon은 CollisionObject에 충돌 Shape를 지정하는 용도로만 사용됩니"
+"다. Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가해서 사용"
"해주세요."
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
-msgstr "빈 CollisionPolygon는 충돌에 영향을 주지 않아요."
+msgstr "빈 CollisionPolygon는 충돌에 영향을 주지 않습니다."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12142,29 +12391,36 @@ msgid ""
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
"KinematicBody, etc. to give them a shape."
msgstr ""
-"CollisionShape은 CollisionObject에 충돌 Shape를 지정하는 용도로만 사용돼요. "
-"Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가해서 사용해주"
-"세요."
+"CollisionShape은 CollisionObject에 충돌 Shape를 지정하는 용도로만 사용됩니"
+"다. Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가해서 사용"
+"해주세요."
#: scene/3d/collision_shape.cpp
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"CollisionShape가 제 기능을 하려면 Shape가 있어야 해요. Shape 리소스를 만들어"
-"주세요."
+"CollisionShape가 제 기능을 하려면 Shape가 있어야 합니다. Shape 리소스를 만들"
+"어주세요."
#: scene/3d/collision_shape.cpp
msgid ""
"Plane shapes don't work well and will be removed in future versions. Please "
"don't use them."
msgstr ""
-"평면 Shape는 잘 작동하지 않으며 이후 버전에서 제거될 예정이에요. 사용하지 말"
+"평면 Shape는 잘 작동하지 않으며 이후 버전에서 제거될 예정입니다. 사용하지 말"
"아주세요."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape는 static 외의 모드가 설정된 RigidBody를 지원하지 않습니"
+"다."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
-msgstr "지정한 메시가 없어서 아무 것도 보이지 않아요."
+msgstr "지정한 메시가 없어서 아무 것도 보이지 않습니다."
#: scene/3d/cpu_particles.cpp
msgid ""
@@ -12172,35 +12428,41 @@ msgid ""
"Billboard Mode is set to \"Particle Billboard\"."
msgstr ""
"CPUParticles 애니메이션을 사용하려면 Billboard Mode가 \"Particle Billboard"
-"\"로 설정된 SpatialMaterial이 필요해요."
+"\"로 설정된 SpatialMaterial이 필요합니다."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
-msgstr "메시 구분하기"
+msgstr "메시 구분"
#: scene/3d/gi_probe.cpp
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
-"GIProbe는 GLES2 비디오 드라이버에서 지원하지 않아요.\n"
+"GIProbe는 GLES2 비디오 드라이버에서 지원하지 않습니다.\n"
"대신 BakedLightmap을 사용하세요."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr "SpotLight의 각도를 90도 이상으로 잡게되면 그림자를 투영할 수 없어요."
+msgstr "SpotLight의 각도를 90도 이상으로 잡게되면 그림자를 투영할 수 없습니다."
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
-msgstr "이 노드가 작동하려면 NavigationMesh 리소스를 설정하거나 만들어야 해요."
+msgstr ""
+"이 노드가 작동하려면 NavigationMesh 리소스를 설정하거나 만들어야 합니다."
#: scene/3d/navigation_mesh.cpp
msgid ""
"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
"It only provides navigation data."
msgstr ""
-"NavigationMeshInstance는 Navigation 노드의 자식이나 더 하위에 있어야 해요. 이"
-"것은 내비게이션 데이터만 제공해요."
+"NavigationMeshInstance는 Navigation 노드의 자식이나 더 하위에 있어야 합니다. "
+"이것은 내비게이션 데이터만 제공합니다."
#: scene/3d/particles.cpp
msgid ""
@@ -12208,14 +12470,14 @@ msgid ""
"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
"\" option for this purpose."
msgstr ""
-"GPU 기반 파티클은 GLES2 비디오 드라이버에서 지원하지 않아요.\n"
-"대신 CPUParticles 노드를 사용하세요. 이 경우 \"CPU파티클로 변환하기\" 설정을 "
-"사용할 수 있어요."
+"GPU 기반 파티클은 GLES2 비디오 드라이버에서 지원하지 않습니다.\n"
+"대신 CPUParticles 노드를 사용하세요. 이 경우 \"CPU파티클로 변환\" 설정을 사용"
+"할 수 있습니다."
#: scene/3d/particles.cpp
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr "메시가 패스를 그리도록 지정하지 않아서, 아무 것도 보이지 않아요."
+msgstr "메시가 패스를 그리도록 지정하지 않아서, 아무 것도 보이지 않습니다."
#: scene/3d/particles.cpp
msgid ""
@@ -12223,11 +12485,11 @@ msgid ""
"Mode is set to \"Particle Billboard\"."
msgstr ""
"Particles 애니메이션을 사용하려면 Billboard Mode가 \"Particle Billboard\"로 "
-"설정된 SpatialMaterial이 필요해요."
+"설정된 SpatialMaterial이 필요합니다."
#: scene/3d/path.cpp
msgid "PathFollow only works when set as a child of a Path node."
-msgstr "PathFollow는 Path 노드의 자식으로 있을 때만 작동해요."
+msgstr "PathFollow는 Path 노드의 자식으로 있을 때만 작동합니다."
#: scene/3d/path.cpp
msgid ""
@@ -12235,7 +12497,7 @@ msgid ""
"parent Path's Curve resource."
msgstr ""
"PathFollow의 ROTATION_ORIENTED는 부모 Path의 Curve 리소스에서 \"Up Vector"
-"\"가 켜져 있어야 해요."
+"\"가 켜져 있어야 합니다."
#: scene/3d/physics_body.cpp
msgid ""
@@ -12244,7 +12506,7 @@ msgid ""
"Change the size in children collision shapes instead."
msgstr ""
"(캐릭터나 리지드 모드에서) RigidBody의 크기 변경은 물리 엔진이 작동하는 동안 "
-"큰 부담이 돼요.\n"
+"큰 부담이 됩니다.\n"
"대신 자식 충돌 모양의 크기를 변경하세요."
#: scene/3d/remote_transform.cpp
@@ -12253,11 +12515,11 @@ msgid ""
"derived node to work."
msgstr ""
"\"Remote Path\" 속성은 올바른 Spatial 노드, 또는 Spatial에서 파생된 노드를 가"
-"리켜야 해요."
+"리켜야 합니다."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
-msgstr "이 바디는 메시를 설정할 때까지 무시돼요."
+msgstr "이 바디는 메시를 설정할 때까지 무시됩니다."
#: scene/3d/soft_body.cpp
msgid ""
@@ -12265,7 +12527,7 @@ msgid ""
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"실행 중에 SoftBody의 크기 변경은 물리 엔진에 의해 다시 정의돼요.\n"
+"실행 중에 SoftBody의 크기 변경은 물리 엔진에 의해 재정의됩니다.\n"
"대신 자식의 충돌 모양 크기를 변경하세요."
#: scene/3d/sprite_3d.cpp
@@ -12274,14 +12536,14 @@ msgid ""
"order for AnimatedSprite3D to display frames."
msgstr ""
"AnimatedSprite3D가 프레임을 보여주기 위해서는 \"Frames\" 속성에 SpriteFrames "
-"리소스를 만들거나 설정해야 해요."
+"리소스를 만들거나 설정해야 합니다."
#: scene/3d/vehicle_body.cpp
msgid ""
"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
"it as a child of a VehicleBody."
msgstr ""
-"VehicleWheel은 VehicleBody로 바퀴 시스템을 제공하는 역할이에요. VehicleBody"
+"VehicleWheel은 VehicleBody로 바퀴 시스템을 제공하는 역할입니다. VehicleBody"
"의 자식으로 사용해주세요."
#: scene/3d/world_environment.cpp
@@ -12290,20 +12552,20 @@ msgid ""
"Environment to have a visible effect."
msgstr ""
"WorldEnvironment가 시각 효과를 갖도록 Environment를 갖고 있는 \"Environment"
-"\" 속성이 필요해요."
+"\" 속성이 필요합니다."
#: scene/3d/world_environment.cpp
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
msgstr ""
-"씬마다 (혹은 인스턴스된 씬 세트마다) WorldEnvironment는 하나만 허용돼요."
+"씬마다 (혹은 인스턴스된 씬 세트마다) WorldEnvironment는 하나만 허용됩니다."
#: scene/3d/world_environment.cpp
msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
-"이 WorldEnvironment는 무시돼요. (3D 씬을 위해) Camera를 추가하거나 아니면 "
+"이 WorldEnvironment는 무시됩니다. (3D 씬을 위해) Camera를 추가하거나 아니면 "
"(2D 씬을 위해) 이 환경의 Background Mode를 Canvas로 설정하세요."
#: scene/animation/animation_blend_tree.cpp
@@ -12324,29 +12586,30 @@ msgstr "잘못된 애니메이션: '%s'."
#: scene/animation/animation_tree.cpp
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "노드 '%s'의 '%s' 입력에 아무것도 연결되지 않았어요."
+msgstr "노드 '%s'의 '%s' 입력에 아무것도 연결되지 않았습니다."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
-msgstr "그래프를 위한 루트 AnimationNode를 설정하지 않았어요."
+msgstr "그래프를 위한 루트 AnimationNode를 설정하지 않았습니다."
#: scene/animation/animation_tree.cpp
msgid "Path to an AnimationPlayer node containing animations is not set."
msgstr ""
-"애니메이션을 갖고 있는 AnimationPlayer 노드의 경로를 설정하지 않았어요."
+"애니메이션을 갖고 있는 AnimationPlayer 노드의 경로를 설정하지 않았습니다."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
-"AnimationPlayer에 대한 경로 설정이 AnimationPlayer 노드를 향하고 있지 않아요."
+"AnimationPlayer에 대한 경로 설정이 AnimationPlayer 노드를 향하고 있지 않습니"
+"다."
#: scene/animation/animation_tree.cpp
msgid "The AnimationPlayer root node is not a valid node."
-msgstr "AnimationPlayer 루트 노드가 올바른 노드가 아니에요."
+msgstr "AnimationPlayer 루트 노드가 올바른 노드가 아닙니다."
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
-msgstr "이 노드는 더 이상 사용할 수 없어요. 대신 AnimationTree를 사용하세요."
+msgstr "이 노드는 더 이상 사용할 수 없습니다. 대신 AnimationTree를 사용하세요."
#: scene/gui/color_picker.cpp
msgid ""
@@ -12355,8 +12618,8 @@ msgid ""
"RMB: Remove preset"
msgstr ""
"색상: #%s\n"
-"좌클릭: 색상 설정하기\n"
-"우클릭: 프리셋 제거하기"
+"좌클릭: 색상 설정\n"
+"우클릭: 프리셋 제거"
#: scene/gui/color_picker.cpp
msgid "Pick a color from the editor window."
@@ -12372,11 +12635,11 @@ msgstr "Raw"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
-msgstr "16진수나 코드 값으로 전환해요."
+msgstr "16진수나 코드 값으로 전환합니다."
#: scene/gui/color_picker.cpp
msgid "Add current color as a preset."
-msgstr "현재 색상을 프리셋으로 추가해요."
+msgstr "현재 색상을 프리셋으로 추가합니다."
#: scene/gui/container.cpp
msgid ""
@@ -12384,7 +12647,7 @@ msgid ""
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
-"Container 자체는 자식 배치 작업을 구성하는 스크립트 외에는 목적이 없어요.\n"
+"Container 자체는 자식 배치 작업을 구성하는 스크립트 외에는 목적이 없습니다.\n"
"스크립트를 추가하는 의도가 없으면, 순수한 Control 노드를 사용해주세요."
#: scene/gui/control.cpp
@@ -12393,7 +12656,8 @@ msgid ""
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
"Hint Tooltip은 Control의 Mouse Filter가 \"Ignore\"으로 설정되어 있기 때문에 "
-"보이지 않아요. 해결하려면 Mouse Filter를 \"Stop\"이나 \"Pass\"로 설정하세요."
+"보이지 않습니다. 해결하려면 Mouse Filter를 \"Stop\"이나 \"Pass\"로 설정하세"
+"요."
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -12409,12 +12673,12 @@ msgid ""
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
-"Popup은 popup() 또는 기타 popup*() 함수로 호출하기 전까지 기본적으로 숨어있어"
-"요. 편집하는 동안 보이도록 할 수는 있으나, 실행 시에는 보이지 않아요."
+"Popup은 popup() 또는 기타 popup*() 함수로 호출하기 전까지 기본적으로 숨어있습"
+"니다. 편집하는 동안 보이도록 할 수는 있으나, 실행 시에는 보이지 않습니다."
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr "\"Exp Edit\"을 켜면, \"Min Value\"는 반드시 0보다 커야 해요."
+msgstr "\"Exp Edit\"을 켜면, \"Min Value\"는 반드시 0보다 커야 합니다."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -12422,7 +12686,7 @@ msgid ""
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
-"ScrollContainer는 단일 자식 Control을 작업하기 위한 것이에요.\n"
+"ScrollContainer는 단일 자식 Control을 작업하기 위한 것입니다.\n"
"(VBox, HBox 등) 컨테이너를 자식으로 사용하거나, Control을 사용하고 맞춤 최소 "
"수치를 수동으로 설정하세요."
@@ -12436,7 +12700,7 @@ msgid ""
"Environment -> Default Environment) could not be loaded."
msgstr ""
"프로젝트 설정 (Rendering -> Environment -> Default Environment)에 지정한 기"
-"본 환경을 불러올 수 없어요."
+"본 환경을 불러올 수 없습니다."
#: scene/main/viewport.cpp
msgid ""
@@ -12445,10 +12709,14 @@ msgid ""
"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
"texture to some node for display."
msgstr ""
-"뷰포트를 렌더 대상으로 설정하지 않았어요. 뷰포트의 내용을 화면에 직접 표시하"
-"려면, Control의 자식 노드로 만들어서 크기를 얻어야 해요. 그렇지 않을 경우, 화"
-"면에 표시하기 위해서는 뷰포트를 RenderTarget으로 만들고 내부적인 텍스처를 다"
-"른 노드에 지정해야 해요."
+"뷰포트를 렌더 대상으로 설정하지 않았습니다. 뷰포트의 내용을 화면에 직접 표시"
+"하려면, Control의 자식 노드로 만들어서 크기를 얻어야 합니다. 그렇지 않을 경"
+"우, 화면에 표시하기 위해서는 뷰포트를 RenderTarget으로 만들고 내부적인 텍스처"
+"를 다른 노드에 지정해야 합니다."
+
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "무엇이든 렌더링하려면 뷰포트 크기가 0보다 커야 합니다."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
@@ -12472,11 +12740,57 @@ msgstr "Uniform에 대입."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr "Varying은 꼭짓점 함수에만 지정할 수 있어요."
+msgstr "Varying은 꼭짓점 함수에만 지정할 수 있습니다."
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr "상수는 수정할 수 없어요."
+msgstr "상수는 수정할 수 없습니다."
+
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "파일 시스템과 가져오기 독"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "내보내거나 배포할 때, 결과 실행 파일은 디버깅을 위해 이 컴퓨터의 IP와 연결"
+#~ "을 시도할 것입니다."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "현재 씬이 아직 저장되지 않았습니다. 실행하기 전에 저장해주세요."
+
+#~ msgid "Not in resource path."
+#~ msgstr "리소스 경로에 없습니다."
+
+#~ msgid "Revert"
+#~ msgstr "되돌리기"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "이 행동은 취소할 수 없습니다. 무시하고 되돌릴까요?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "씬 되돌리기"
+
+#~ msgid "Clear Script"
+#~ msgstr "스크립트 삭제"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "이슈 트래커"
+
+#~ msgid "Request Docs"
+#~ msgstr "문서 요청"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "피드백으로 Godot 문서를 개선하는데 도와주세요."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d개를 바꿨습니다."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Static Convex Body 만들기"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Shape 만들기 실패!"
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
diff --git a/editor/translations/lt.po b/editor/translations/lt.po
index f3118b9942..c723a4ebb5 100644
--- a/editor/translations/lt.po
+++ b/editor/translations/lt.po
@@ -4,12 +4,14 @@
# This file is distributed under the same license as the Godot source code.
# Ignas Kiela <ignaskiela@super.lt>, 2017.
# Kornelijus <kornelijus.github@gmail.com>, 2017, 2018.
+# Ignotas Gražys <ignotas.gr@gmail.com>, 2020.
+# Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-12-13 14:41+0100\n"
-"Last-Translator: Kornelijus <kornelijus.github@gmail.com>\n"
+"PO-Revision-Date: 2020-09-22 03:23+0000\n"
+"Last-Translator: Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/godot-engine/"
"godot/lt/>\n"
"Language: lt\n"
@@ -18,34 +20,35 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || n"
"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n"
-"X-Generator: Poedit 2.2\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
+"Netinkamo tipo argumentas į funkciją convert(), naudokite TYPE_* konstantas."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Tikėtasi 1 (simbolio) ilgio eilutės."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "Nepakanka baitų iššifruoti baitams, arba netinkamas formatas."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Netinkama įvestis išraiškoje %i (nepraleista)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self nenaudojamas, nes atvejis yra null (nepraleistas)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "Netinkami operatoriaus operandai %s, %s ir %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
@@ -57,7 +60,7 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ""
+msgstr "Netinkami argumentai sukurti '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -65,31 +68,31 @@ msgstr ""
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -97,40 +100,40 @@ msgstr "Nemokama"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Subalansuotas"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "Atspindėti"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
+#, fuzzy
msgid "Time:"
msgstr "Trukmė:"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Value:"
-msgstr "Naujas pavadinimas:"
+msgstr "Reikšmė:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr ""
+msgstr "Įrašyti raktažodį čia"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr ""
+msgstr "Kopijuoti pasirinktą (-us) raktažodį (-žius)"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr ""
+msgstr "Ištrinti pasirinktus raktažodžius"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr ""
+msgstr "Pridėti Bezjė tašką"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr ""
+msgstr "Judinti Bezjė taškus"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -188,22 +191,21 @@ msgid "Anim Multi Change Call"
msgstr "Animacija: Pakeisti Iškvietimą"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "Animacijos Nodas"
+msgstr "Pakeisti animacijos ilgį"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "Pakeisti animacijos ciklą"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Ypatybės seklys"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "3D transformacijų seklys"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
@@ -211,7 +213,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezjė kreivės seklys"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
@@ -227,32 +229,29 @@ msgid "Animation length (frames)"
msgstr "Animacija"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
-msgstr "Animacijos Nodas"
+msgstr "Animacijos ilgis (sekundėmis)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Animacija: Pridėti Takelį"
+msgstr "Pridėti įrašą"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Animacijos Nodas"
+msgstr "Animacijos ciklas"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr ""
+msgstr "Funkcijos:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "Garso įrašai:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Animacijų įrašai:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
@@ -260,38 +259,35 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "Įrašo koregavimas: įjungtas/ išjungtas."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Animacijos Nodas"
+msgstr "Interpoliacijos režimas"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Animacija: Panaikinti Takelį"
+msgstr "Panaikinti šį įrašą."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Trukmė:"
+msgstr "Laikas (-ai): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "Koreguoti įrašą į įjungtas"
#: editor/animation_track_editor.cpp
msgid "Continuous"
-msgstr ""
+msgstr "Tęstinis"
#: editor/animation_track_editor.cpp
msgid "Discrete"
@@ -299,24 +295,24 @@ msgstr "Diskretus"
#: editor/animation_track_editor.cpp
msgid "Trigger"
-msgstr ""
+msgstr "Gaidukas"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "Fiksuoti"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Artimiausias"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
msgid "Linear"
-msgstr ""
+msgstr "Linijinis"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubinis"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
@@ -329,36 +325,31 @@ msgstr ""
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "Įterpti raktažodį"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplikuoti"
+msgstr "Kopijuoti raktažodį (-ius)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Ištrinti Efektą"
+msgstr "Ištrinti raktažodį (-ius)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
-msgstr "Animacijos Nodas"
+msgstr "Keisti animacijos atnaujinimo režimą"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "Animacijos Nodas"
+msgstr "Keisti animacijos interpoliacijos režimą"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "Animacijos Nodas"
+msgstr "Keiskite animacijos ciklo režimą"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr "Animacija: Panaikinti Takelį"
+msgstr "Animacija: panaikinti įrašą"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
@@ -382,7 +373,7 @@ msgstr "Sukurti"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr ""
+msgstr "Animacija: įterpti"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
@@ -401,13 +392,12 @@ msgid "Anim Insert Key"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "Animacijos Nodas"
+msgstr "Keisti animacijos žingsnį"
#: editor/animation_track_editor.cpp
msgid "Rearrange Tracks"
-msgstr ""
+msgstr "Naujai sudėlioti įrašus"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
@@ -420,31 +410,34 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Garso įrašai gali nurodyti tik į šiuos tipinius mazgus:\n"
+"-GarsoSrautogrotuvas\n"
+"-GarsoSrautogrotuvas2D\n"
+"-GarsoSrautogrotuvas3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Animacijos įrašai gali nurodyti į AnimacijosGrotuvo mazgus."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "Animacijos grotuvas negali animuoti savęs, tik kitus grotuvus."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Nėra galimybės pridėti naują įrašą be root"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Netinkamas Bezjė traktas (nėra tinkamų antrinių savybių)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "Animacija: Pridėti Takelį"
+msgstr "Pridėti Bezjė traktą"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Trakto kelias yra negalimas, negalima pridėti raktažodžio."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
@@ -539,6 +532,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -702,7 +696,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -721,7 +715,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -752,11 +746,11 @@ msgstr "Priartinti"
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "Nutolinti"
+msgstr "Ištolinti"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Atstatyti Priartinimą"
+msgstr "Atstatyti priartinimą"
#: editor/code_editor.cpp
msgid "Warnings"
@@ -773,6 +767,11 @@ msgstr "Metodas pasirinktame Node turi būti nurodytas!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metodas pasirinktame Node turi būti nurodytas!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -858,7 +857,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -867,7 +865,7 @@ msgstr ""
#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Close"
-msgstr "Uždaryti"
+msgstr "Užverti"
#: editor/connections_dialog.cpp
msgid "Connect"
@@ -918,6 +916,11 @@ msgid "Signals"
msgstr "Signalai"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrai..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -958,7 +961,7 @@ msgid "Recent:"
msgstr "Naujausi:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1132,6 +1135,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1153,6 +1159,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1457,7 +1471,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1465,17 +1479,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Netinkamas šrifto dydis."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1503,6 +1508,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1625,16 +1634,16 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
#, fuzzy
msgid "Node Dock"
msgstr "Naujas pavadinimas:"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1795,7 +1804,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1911,7 +1920,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2331,10 +2340,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2420,11 +2425,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Atidaryti Skriptų Editorių"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2695,10 +2703,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2760,22 +2764,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2784,8 +2792,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2794,32 +2802,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2880,7 +2888,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2894,7 +2902,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3047,15 +3059,15 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "Atidaryti 2D Editorių"
+msgstr "Atverti 2D editorių"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr "Atidaryti 3D Editorių"
+msgstr "Atverti 3D editorių"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "Atidaryti Skriptų Editorių"
+msgstr "Atverti skriptų editorių"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -3285,7 +3297,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3312,6 +3325,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr "Galbūt jūs pamiršote '_run' metodą?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Pasirinkite Nodus, kuriuos norite importuoti"
@@ -3919,19 +3936,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+#, fuzzy
+msgid "%d Files"
+msgstr "Redaguoti Filtrus"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3948,7 +3970,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3982,10 +4004,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -5072,7 +5090,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5821,11 +5839,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5837,12 +5855,29 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "Sukurti Naują"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Multiple Convex Shapes"
msgstr "Sukurti Naują"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5894,19 +5929,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Keisti Poligono Skalę"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Keisti Poligono Skalę"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6765,14 +6838,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6836,15 +6901,15 @@ msgid ""
msgstr "Prijungti '%s' prie '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "Linija:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
msgstr ""
@@ -7208,6 +7273,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7297,17 +7366,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7657,7 +7735,7 @@ msgid "New Animation"
msgstr "Animacija"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8356,7 +8434,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9468,11 +9546,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9480,11 +9563,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9703,6 +9786,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9750,6 +9834,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10129,11 +10220,19 @@ msgid "Batch Rename"
msgstr "Animacija: Pervadinti Takelį"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10172,11 +10271,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10203,10 +10302,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10215,11 +10310,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10239,6 +10334,14 @@ msgstr ""
msgid "Reset"
msgstr "Atstatyti Priartinimą"
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10302,8 +10405,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Atidaryti Skriptų Editorių"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10339,10 +10443,14 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Delete %d nodes?"
+msgid "Delete %d nodes and any children?"
msgstr "Ištrinti Efektą"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes?"
+msgstr "Ištrinti %d nodus?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
msgstr ""
@@ -10351,9 +10459,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Ištrinti Efektą"
+msgstr "Ištrinti nodą \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10464,6 +10571,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10512,11 +10626,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10639,6 +10753,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Netinkamas šrifto dydis."
@@ -10683,6 +10801,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Netinkamas šrifto dydis."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Netinkamas šrifto dydis."
@@ -10691,7 +10814,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10716,6 +10839,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Priedai"
@@ -10788,6 +10917,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Sukurti"
@@ -10838,8 +10971,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Importuoti iš Nodo:"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11725,6 +11859,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11749,6 +11887,32 @@ msgstr "Netinkamas šrifto dydis."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11932,6 +12096,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12119,6 +12289,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12139,6 +12314,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12365,6 +12545,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
diff --git a/editor/translations/lv.po b/editor/translations/lv.po
index b6066df271..faf22e8f4e 100644
--- a/editor/translations/lv.po
+++ b/editor/translations/lv.po
@@ -3,13 +3,16 @@
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
# Gustavs Porietis (pg829-) <porietisgustavs@gmail.com>, 2018.
-# Martch Zagorski <martchzagorski@gmail.com>, 2018.
+# Martch Zagorski <martchzagorski@gmail.com>, 2018, 2020.
+# Jānis Ondzuls <janisond@inbox.lv>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
+# StiLins <aigars.skilins@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-12-13 14:41+0100\n"
-"Last-Translator: Martch Zagorski <martchzagorski@gmail.com>\n"
+"PO-Revision-Date: 2020-06-04 18:34+0000\n"
+"Last-Translator: StiLins <aigars.skilins@gmail.com>\n"
"Language-Team: Latvian <https://hosted.weblate.org/projects/godot-engine/"
"godot/lv/>\n"
"Language: lv\n"
@@ -18,16 +21,17 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= "
"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n"
-"X-Generator: Poedit 2.2\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
+"Nepareizs argumenta tips convert() izsaukšanai, lietojiet TYPE_* konstantes."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Jālieto teksta rinda ar garumu 1 (simbols)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -41,7 +45,7 @@ msgstr "Nederīga ievade %i (nav padota) izteikumā"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "'self' nevar izmantot, jo instance ir 'null' (nav padota)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -57,39 +61,39 @@ msgstr "Nederīgs nosaukts indekss '%s' bāzes tipam %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "Nderīgs arguments, lai izveidotu '%s'"
+msgstr "Nederīgs arguments, lai izveidotu '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "'%s' izsaukumā:"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -97,115 +101,112 @@ msgstr "Bezmaksas"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr "Balancēts"
+msgstr "Balansēts"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "Spogulis"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
-msgstr ""
+msgstr "Laiks:"
#: editor/animation_bezier_editor.cpp
msgid "Value:"
-msgstr ""
+msgstr "Vērtība:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr ""
+msgstr "Ievadiet Atslēgu Šeit"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Dublikāta Izvēle"
+msgstr "Izveidot Dublikātu Izvēlētajai(ām) Atslēgai(ām)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Izdzēst izvēlētos failus?"
+msgstr "Izdzēst Izvēlēto(ās) Atslēgu(as)"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr ""
+msgstr "Pievienot Bezjē Punktu"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr ""
+msgstr "Pārvietot Bezjē Punktus"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr ""
+msgstr "Anim Izveidot Atslēgu Dublikātu"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr ""
+msgstr "Anim Izdzēst Atslēgas"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr ""
+msgstr "Anim Izmainīt Atslēgkadra Laiku"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr ""
+msgstr "Anim Izmainīt Pāreju"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr ""
+msgstr "Anim Izmainīt Transformāciju"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr ""
+msgstr "Anim Izmainīt Atslēgkadra Vērtību"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr ""
+msgstr "Anim Izmainīt Izsaukumu"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Time"
-msgstr ""
+msgstr "Anim Vairākkārt Izmainīt Atslēgkadra Laiku"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Transition"
-msgstr ""
+msgstr "Anim Vairākkārt Izmainīt Pāreju"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Transform"
-msgstr ""
+msgstr "Anim Vairākkārt Izmainīt Transformāciju"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Value"
-msgstr ""
+msgstr "Anim Vairākkārt Izmainīt Atslēgkadra Vērtību"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Call"
-msgstr ""
+msgstr "Anim Vairākkārt Izmainīt Izsaukumu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "Animāciju Cilpa"
+msgstr "Izmainīt Animācijas Garumu"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "Izmainīt Animācijas Atkārtošanos"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Mainīgo Celiņš"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "3D Transformācijas Celiņš"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Izsaukt Metožu Celiņu"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezjē Līkņu Celiņš"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
@@ -216,14 +217,12 @@ msgid "Animation Playback Track"
msgstr "Animācijas atskaņošanas celiņs"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (frames)"
-msgstr "Animācijas Garums (sekundes)"
+msgstr "Animācijas garums (kadri)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
-msgstr "Animācijas Garums (sekundes)"
+msgstr "Animācijas garums (sekundes)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
@@ -248,15 +247,15 @@ msgstr "Animācijas klipi:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr ""
+msgstr "Izmainīt Ceļu uz Celiņa"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "Pārslēgt šo celiņu ieslēgts/izslēgts."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Atjaunošanas Režīms (Kā šis mainīgais tiek iestatīts)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
@@ -264,7 +263,7 @@ msgstr "Interpolācijas režīms"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Atkārtošanās Aptīšanas Režīms (Interpolē beigas ar cilpas sākumu)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
@@ -276,7 +275,7 @@ msgstr "Laiks (s): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "Pārslēgt Celiņu uz Iespējotu"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -309,16 +308,16 @@ msgstr "Kubisks"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Apgriezt Cilpas Interpolāciju"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Aptīt Cilpas Interpolāciju"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Ievietot atslēgievietni"
+msgstr "Ievietot Atslēgu"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
@@ -329,23 +328,20 @@ msgid "Delete Key(s)"
msgstr "Izdzēst atslēgvietnes"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
-msgstr "Animācijas tālummaiņa."
+msgstr "Izmainīt Animācijas Atjaunošanas Režīmu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "Interpolācijas režīms"
+msgstr "Izmainīt Animācijas Interpolācijas Režīmu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "Animācijas tālummaiņa."
+msgstr "Izmainīt Animācijas Atkārtošanās Režīmu"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr "Noņemt animācijas celiņu"
+msgstr "Noņemt Anim. Celiņu"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
@@ -373,33 +369,31 @@ msgstr "Anim ievietot"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr "AnimationPlayer nevar animēt pats sevi, tikai citi spēlētāji."
+msgstr "AnimationPlayer nevar animēt pats sevi, tikai citus spēlētājus."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "Anim izveidot un ievietot"
+msgstr "Anim Izveidot un Ievietot"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "Anim ievietot celiņu un atslēgvietni"
+msgstr "Anim Ievietot Celiņu un Atslēgu"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr "Anim ievietot atslēgievietni"
+msgstr "Anim Ievietot Atslēgu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "Animācijas tālummaiņa."
+msgstr "Izmainīt Animācijas Soli"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "Ielīmēt celiņus"
+msgstr "Pārkārtot Celiņus"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Transformācijas celiņi tiek tikai pievienoti Telpiskajām mezgliem."
#: editor/animation_track_editor.cpp
msgid ""
@@ -408,7 +402,7 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
-"Audio celiņu var tikai rādīt uz šāda tipa mezgliem:\n"
+"Audio celiņu var tikai norādīt uz šāda tipa mezgliem:\n"
"-AudioStreamPlayer\n"
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
@@ -427,47 +421,43 @@ msgstr "Nevar izveidot jaunu celiņu bez saknes"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Neatbilstošs celiņš priekš Bezjē (nav piemērotu apakš-mainīgo)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "Pievienot celiņu"
+msgstr "Pievienot Bezjē Celiņu"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Ceļš uz Celiņu nav derīgs, tāpēc nevar pievienot atslēgu."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Celiņš nepieder Telpiskajam tipam, nevar ievietot atslēgu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "Anim ievietot celiņu un atslēgvietni"
+msgstr "Pievienot Atslēgu Transformācijas Celiņam"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "Pievienot celiņu"
+msgstr "Pievienot Celiņa Atslēgu"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Ceļš uz Celiņu nav derīgs, tāpēc nevar pievienot metodes atslēgu."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "Anim ievietot celiņu un atslēgvietni"
+msgstr "Pievienot Celiņa Metodes Atslēgu"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr "Metode netika atrasta objektā: "
+msgstr "Metode objektā netika atrasta: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "Anim pārvietot atslēgievietnes"
+msgstr "Anim Pārvietot Atslēgas"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
@@ -479,12 +469,12 @@ msgstr "Ielīmēt celiņus"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr "Anim pārvietot atslēgievietnes"
+msgstr "Anim Mainīt Atslēgas Izmēru"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "Šī iespēja nestrādā ar Bazjē rediģēšanu, jo tai ir tikai viens celiņš."
#: editor/animation_track_editor.cpp
msgid ""
@@ -498,14 +488,24 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"Šī animācija pieder importētajai ainai, tāpēc importētā celiņa izmaiņas "
+"netiks saglabātas.\n"
+"\n"
+"Lai iespējotu pielāgotu celiņu pievienošanu, atrodiet ainu importēšanas "
+"iespējas un iestādiet\n"
+"\"Animation > Storage\" uz \"Files\", iespējojiet \"Animation > Keep Custom "
+"Tracks\", tad nospiediet 're-import'.\n"
+"Alternatīvi, izmantojiet 'import preset', kas importē animācijas uz "
+"atsevišķiem failiem."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "Brīdinājums: Rediģējat importēto animāciju"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
msgstr ""
+"Izvēlieties 'AnimationPlayer' mezglu, lai izveidotu un rediģētu animācijas."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -517,9 +517,8 @@ msgstr ""
"Sagrupēt celiņus atkarībā no mezgliem vai rādīt tos vienkāršā sarakstā."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "Solis (s): "
+msgstr "Pievilkt:"
#: editor/animation_track_editor.cpp
msgid "Animation step value."
@@ -527,11 +526,12 @@ msgstr "Animācijas soļa vērtība."
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "Sekundes"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr ""
+msgstr "FPS"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -561,7 +561,7 @@ msgstr "Skala No Kursora"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "Dublikāta Izvēle"
+msgstr "Izveidot Dublikātu Izvēlētajam"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
@@ -572,14 +572,12 @@ msgid "Delete Selection"
msgstr "Dzēst izvēlētos"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "Doties uz nākamo soli"
+msgstr "Doties uz Nākamo Soli"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "Doties uz iepriekšējo soli"
+msgstr "Doties uz Iepriekšējo Soli"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -587,7 +585,7 @@ msgstr "Optimizēt animāciju"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr ""
+msgstr "Iztīrīšanas Animācija"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
@@ -595,7 +593,7 @@ msgstr "Izvēlies mezglu, kurā tiks animēta:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Izmanto Bezjē Līknes"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -603,15 +601,15 @@ msgstr "Anim. Optimizētājs"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr ""
+msgstr "Maks. Lineārā Kļūda:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr ""
+msgstr "Maks. Rotācijas Kļūda:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
-msgstr ""
+msgstr "Max. Optimizējamais Leņķis:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
@@ -619,23 +617,23 @@ msgstr "Optimizēt"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr ""
+msgstr "Noņemt nederīgās atslēgas"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr ""
+msgstr "Noņemt neatrisinātos un nedefinētos celiņus"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
-msgstr ""
+msgstr "Iztīrīt visas animācijas"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr ""
+msgstr "Iztīrīt Animāciju(as) (NEATGRIEZENISKI!)"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
-msgstr ""
+msgstr "Iztīrit"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
@@ -643,7 +641,7 @@ msgstr "Mēroga Attiecība:"
#: editor/animation_track_editor.cpp
msgid "Select Tracks to Copy"
-msgstr ""
+msgstr "Izvēlēties Celiņus ko Kopēt"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -652,37 +650,35 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr ""
+msgstr "Kopēt"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "Dzēst izvēlētos"
+msgstr "Izvēlēties Visus/Nevienu"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "Audio klipi:"
+msgstr "Pievienot Audio Celiņa Klipu"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "Mainīt Audio Celiņa Apgriešanas Sākuma Kompensāciju"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "Mainīt Audio Celiņa Apgriešanas Beigu Kompensāciju"
#: editor/array_property_edit.cpp
msgid "Resize Array"
-msgstr ""
+msgstr "Mainīt Masīva Lielumu"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr ""
+msgstr "Mainīt Masīva Vērtības Tipu"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
-msgstr ""
+msgstr "Izmainīt masīva vērtību"
#: editor/code_editor.cpp
msgid "Go to Line"
@@ -690,54 +686,54 @@ msgstr "Doties uz Rindu"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr ""
+msgstr "Rindas Numurs:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+msgid "%d replaced."
+msgstr "%d aizvietots."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "%d sakritība."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d matches."
-msgstr ""
+msgstr "%d sakritības."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
-msgstr ""
+msgstr "Atrast Gadījumu"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr ""
+msgstr "Visu Vārdu"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Aizvietot"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr ""
+msgstr "Aizvietot visu"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr ""
+msgstr "Tikai izvēlētais"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "Standarts"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "Pārslēgt Skriptu Paneli"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "Pietuvināt"
+msgstr "Palielināt"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -747,44 +743,48 @@ msgstr "Attālināt"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Atiestatīt tālummaiņu"
+msgstr "Atiestatīt Tālummaiņu"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "Brīdinājumi"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "Rindu un kolonnu numuri."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr ""
+msgstr "Metodi mērķa mezglā nepieciešams specificēt."
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metodi mērķa mezglā nepieciešams specificēt."
#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
+"Mērķa metode netika atrasta. Specificējiet derīgu metodi vai pievienojiet "
+"skriptu mērķa mezglam."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "Savienot"
+msgstr "Savienot ar Mezglu:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "Savieno Signālu:"
+msgstr "Savieno ar Skriptu:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "Savieno Signālu:"
+msgstr "No Signāla:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "Aina nesatur skriptu."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -805,48 +805,45 @@ msgstr "Noņemt"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr ""
+msgstr "Pievienot Ekstra Izsaukuma Argumentu:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr ""
+msgstr "Ekstra Izsaukuma Argumenti:"
#: editor/connections_dialog.cpp
msgid "Receiver Method:"
-msgstr ""
+msgstr "Saņemšanas Metode:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "Balancēts"
+msgstr "Papildus"
#: editor/connections_dialog.cpp
msgid "Deferred"
-msgstr ""
+msgstr "Atlikts"
#: editor/connections_dialog.cpp
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr ""
+msgstr "Atliek signālu, glabājot to rindā, un to izstaro tikai dīkstāvē."
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr ""
+msgstr "Vienreiz"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "Atvieno signālu pēc tā pirmās izstarošanas."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "Savieno Signālu:"
+msgstr "Nevar savienot signālu"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -862,9 +859,8 @@ msgid "Connect"
msgstr "Savienot"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "Signāli"
+msgstr "Signāls:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
@@ -875,52 +871,56 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Atvienot '%s' no '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Atvienot '%s' no '%s'"
+msgstr "Atvienot visus no signāla: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
-msgstr ""
+msgstr "Savieno..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr ""
+msgstr "Atvieno"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "Savieno Signālu:"
+msgstr "Savienot Signālu ar Metodi"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "Savieno Signālu:"
+msgstr "Izmainīt Savienojumu:"
#: editor/connections_dialog.cpp
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?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "Signāli"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "No Signāla:"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
+"Vai esat drošs(ša), ka vēlaties noņemt visus savienojumus no šī signāla?"
#: editor/connections_dialog.cpp
msgid "Disconnect All"
-msgstr ""
+msgstr "Atvienot Visu"
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr ""
+msgstr "Rediģēt..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
-msgstr ""
+msgstr "Doties Uz Metodi"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -944,7 +944,7 @@ msgid "Recent:"
msgstr "Nesenie:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Meklēt:"
@@ -953,7 +953,7 @@ msgstr "Meklēt:"
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr ""
+msgstr "Sakritības:"
#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
@@ -965,28 +965,32 @@ msgstr "Apraksts:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
-msgstr ""
+msgstr "Meklēt Aizstājēju Priekš:"
#: editor/dependency_editor.cpp
msgid "Dependencies For:"
-msgstr ""
+msgstr "Atkarības Priekš:"
#: editor/dependency_editor.cpp
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
+"Aina '%s' pašlaik tiek rediģēta.\n"
+"Izmaiņas stāsies spēkā, kad tā tiks pārlādēta."
#: editor/dependency_editor.cpp
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
+"Resurss '%s' tiek izmantots.\n"
+"Izmaiņas stāsies spēkā, kad tas tiks pārlādēts."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dependencies"
-msgstr ""
+msgstr "Atkarības"
#: editor/dependency_editor.cpp
msgid "Resource"
@@ -995,23 +999,23 @@ msgstr "Resurs"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
#: editor/project_manager.cpp editor/project_settings_editor.cpp
msgid "Path"
-msgstr ""
+msgstr "Ceļš"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
-msgstr ""
+msgstr "Atkarības:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
-msgstr ""
+msgstr "Labot Salauzto"
#: editor/dependency_editor.cpp
msgid "Dependency Editor"
-msgstr ""
+msgstr "Atkarību Redaktors"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
-msgstr ""
+msgstr "Meklēt Aizstājēja Resursu:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
#: editor/editor_help_search.cpp editor/editor_node.cpp
@@ -1029,7 +1033,7 @@ msgstr "Īpašnieki:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr ""
+msgstr "Vai noņemt izvēlētos failus no projekta? (Netiks atjaunoti)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1050,9 +1054,8 @@ msgid "Error loading:"
msgstr "Kļūme lādējot:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "Ainu nevarēja ielādēt dēļ neatrastiem dependencīem:"
+msgstr "Ielādēšana apturēta, jo trūkst ceļu uz pamata failiem:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1063,9 +1066,8 @@ msgid "Which action should be taken?"
msgstr "Kuru darbību izdarīt?"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Fix Dependencies"
-msgstr "Salabot dependecīju"
+msgstr "Salabot Atkarības"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
@@ -1073,16 +1075,15 @@ msgstr "Kļūmes lādējot!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr ""
+msgstr "Vai neatgriezeniski izdzēst %d priekšmetu(us)? (NEATGRIEZENISKI!)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "Salabot dependecīju"
+msgstr "Rādīt Ceļus uz Pamata Failiem"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
-msgstr ""
+msgstr "Bāreņu Resursu Pārlūks"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -1098,15 +1099,15 @@ msgstr "Pieder"
#: editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
-msgstr ""
+msgstr "Resursi Bez Skaidra Īpašnieka:"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Key"
-msgstr ""
+msgstr "Mainīt Vārdnīcas Atslēgu"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Value"
-msgstr ""
+msgstr "Mainīt Vārdnīcas Vērtību"
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
@@ -1124,6 +1125,9 @@ msgstr "Projekta Dibinātāji"
msgid "Lead Developer"
msgstr "Galvenais Izstrādātājs"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Projekta Menedžeris "
@@ -1145,6 +1149,16 @@ msgid "Gold Sponsors"
msgstr "Zelta Sponsori"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Sudraba Donors"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronzas Donors"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsori"
@@ -1169,22 +1183,20 @@ msgid "License"
msgstr "Licence"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
-msgstr "Trešās partijas Licence"
+msgstr "Trešās partijas Licences"
#: editor/editor_about.cpp
-#, fuzzy
msgid ""
"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
-"Godot Dzinējs paļaujas uz citiem trešās partijas brīvajām un atvērtā avota "
-"bibliotēkām, kuri visi sader ar to MIT licences nosacījumiem. Sekojošais ir "
-"saraksts ar šīm trešās partijas komponentēm ar to autortiesību apgalvojumiem "
-"un licences nosacījumiem."
+"Godot Konstruktors paļaujas uz citiem trešās partijas brīvajām un atvērtā "
+"avota bibliotēkām, kuras ir saderīgas ar to MIT licences nosacījumiem. "
+"Sekojošais ir saraksts ar šīm trešās partijas komponentēm ar to autortiesību "
+"apgalvojumiem un licences nosacījumiem."
#: editor/editor_about.cpp
msgid "All Components"
@@ -1199,38 +1211,37 @@ msgid "Licenses"
msgstr "Licences"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Error opening package file, not in ZIP format."
-msgstr "Kļūme atverot arhīvu failu, nav ZIP formātā."
+msgstr "Kļūda atverot failu arhīvu, nav ZIP formātā."
#: editor/editor_asset_installer.cpp
msgid "%s (Already Exists)"
-msgstr ""
+msgstr "%s (Jau Eksistē)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr ""
+msgstr "Nekompresēti Līdzekļi"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "Sekojošie faili netika izvilkti no paketes:"
#: editor/editor_asset_installer.cpp
msgid "And %s more files."
-msgstr ""
+msgstr "Un %s vēl faili."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
-msgstr ""
+msgstr "Pakete instalēta sekmīgi!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Success!"
-msgstr "Izdevās!"
+msgstr "Mērķis sasniegts!"
#: editor/editor_asset_installer.cpp
msgid "Package Contents:"
-msgstr ""
+msgstr "Paketes Saturs:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1238,7 +1249,7 @@ msgstr "Ieinstalēt"
#: editor/editor_asset_installer.cpp
msgid "Package Installer"
-msgstr ""
+msgstr "Paketes Instalētājs"
#: editor/editor_audio_buses.cpp
msgid "Speakers"
@@ -1258,47 +1269,47 @@ msgstr "Nomainīt Audio Kopnes Skaļumu"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
-msgstr ""
+msgstr "Pārslēgt Audio Busa Solo"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr ""
+msgstr "Pārslēgt Audio Busa Apklusināšanu"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr ""
+msgstr "Pārslēgt Audio Busa Šuntēšanas Efektu"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr ""
+msgstr "Izvēlēties Audio Busa Sūtīšanu"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr ""
+msgstr "Pievienot Audio Busa Efektu"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr ""
+msgstr "Pārvietot Busa Efektu"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr ""
+msgstr "Izdzēst Busa Efektu"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
-msgstr ""
+msgstr "Velc un atlaid, lai pārkārtotu."
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr ""
+msgstr "Solo"
#: editor/editor_audio_buses.cpp
msgid "Mute"
-msgstr ""
+msgstr "Apklusināt"
#: editor/editor_audio_buses.cpp
msgid "Bypass"
-msgstr ""
+msgstr "Šunts"
#: editor/editor_audio_buses.cpp
msgid "Bus options"
@@ -1307,7 +1318,7 @@ msgstr "Kopnes iestatījumi"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr ""
+msgstr "Izveidot Dublikātu"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
@@ -1370,9 +1381,8 @@ msgid "Invalid file, not an audio bus layout."
msgstr ""
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Kļūmes lādējot!"
+msgstr "Kļūda saglabājot failu: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
@@ -1421,25 +1431,18 @@ msgid "Valid characters:"
msgstr "Derīgie simboli:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing engine class name."
msgstr ""
-"Nederīgs nosaukums. Nedrīkst sadurties ar eksistējošu dzinēja klases "
-"nosaukumu."
+"Nosaukums nedrīkst būt vienāds ar eksistējošu konstruktora klases nosaukumu."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
-msgstr ""
-"Nederīgs nosaukums. Nedrīkst sadurties ar eksistējošu iebūvēto tipa "
-"nosaukumu."
+msgstr "Nosaukums nedrīkst būt vienāds ar eksistējošu iebūvēta tipa nosaukumu."
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
msgstr ""
-"Nederīgs nosaukums. Nedrīkst sadurties ar eksistējošu dzinēja klases "
-"nosaukumu."
+"Nosaukums nedrīkst būt vienāds ar eksistējošu globālo konstantes nosaukumu."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
@@ -1465,7 +1468,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Iespējot"
@@ -1473,17 +1476,8 @@ msgstr "Iespējot"
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Nederīgs nosaukums."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1511,6 +1505,10 @@ msgstr "Nosaukums"
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Atjaunina Ainu"
@@ -1614,9 +1612,8 @@ msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "Rediģēt"
+msgstr "3D Redaktors"
#: editor/editor_feature_profile.cpp
msgid "Script Editor"
@@ -1631,15 +1628,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1663,23 +1660,20 @@ msgid "(Properties Disabled)"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "Atspējots"
+msgstr "(Redaktors Izslēgts)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "Apraksts:"
+msgstr "Klases Iespējas:"
#: editor/editor_feature_profile.cpp
msgid "Enable Contextual Editor"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "Animācijas īpašības."
+msgstr "Ieslēgtie Mainīgie:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
@@ -1700,9 +1694,8 @@ msgid ""
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "Kļūmes lādējot!"
+msgstr "Kļūda saglabājot profilu uz ceļu: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
@@ -1713,9 +1706,8 @@ msgid "Current Profile:"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "Izveidot Funkciju"
+msgstr "Aktualizēt"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1733,14 +1725,12 @@ msgid "Export"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "Animācijas īpašības."
+msgstr "Pieejamie Profili:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "Apraksts:"
+msgstr "Klases Iespējas"
#: editor/editor_feature_profile.cpp
msgid "New profile name:"
@@ -1775,18 +1765,16 @@ msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Izvēlēties šo Mapi"
+msgstr "Izvēlēties Šo Mapi"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "Atvērt"
+msgstr "Atvērt Failu Pārlūkā"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
@@ -1797,7 +1785,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1874,23 +1862,20 @@ msgid "Move Favorite Down"
msgstr ""
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Doties uz iepriekšējo soli"
+msgstr "Doties uz iepriekšējo mapi."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Doties uz nākamo soli"
+msgstr "Doties uz nākamo mapi."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "Meklēt:"
+msgstr "Atjaunot failus."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
@@ -1914,7 +1899,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -1958,9 +1943,8 @@ msgid "Inherited by:"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Apraksts:"
+msgstr "Apraksts"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -1975,9 +1959,8 @@ msgid "override:"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "Ielādēt Noklusējumu"
+msgstr "pēc noklusējuma:"
#: editor/editor_help.cpp
msgid "Methods"
@@ -1996,9 +1979,8 @@ msgid "Constants"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Apraksts:"
+msgstr "Mainīgo Apraksts"
#: editor/editor_help.cpp
msgid "(value)"
@@ -2011,9 +1993,8 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Apraksts:"
+msgstr "Metožu Apraksts"
#: editor/editor_help.cpp
msgid ""
@@ -2047,9 +2028,8 @@ msgid "Methods Only"
msgstr ""
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Signāli"
+msgstr "Tikai Signāli"
#: editor/editor_help_search.cpp
msgid "Constants Only"
@@ -2076,9 +2056,8 @@ msgid "Method"
msgstr ""
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "Signāli"
+msgstr "Signāls"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
@@ -2109,9 +2088,8 @@ msgid "Output:"
msgstr ""
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Noņemt Izvēlēto"
+msgstr "Kopēt Izvēlēto"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2331,10 +2309,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2347,9 +2321,8 @@ msgid "Open Base Scene"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "Atvērt"
+msgstr "Ātri Atvērt..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2420,11 +2393,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Atvērt Aizvērto Ainu"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2470,9 +2446,8 @@ msgid "Close Scene"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "Atjaunina Ainu"
+msgstr "Atvērt Aizvērto Ainu"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2565,14 +2540,12 @@ msgid "Play This Scene"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Aizvērt"
+msgstr "Aizvērt Cilni"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "Aizvērt"
+msgstr "Atcelt Cilnes Aizvēršanu"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2583,9 +2556,8 @@ msgid "Close Tabs to the Right"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "Aizvērt"
+msgstr "Aizvērt Visas Cilnes"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2628,9 +2600,8 @@ msgid "Go to previously opened scene."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Noņemt Izvēlēto"
+msgstr "Kopēt Tekstu"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2669,9 +2640,8 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "Saglabāt Kā"
+msgstr "Saglabāt Visas Ainas"
#: editor/editor_node.cpp
msgid "Convert To..."
@@ -2696,10 +2666,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2733,9 +2699,8 @@ msgid "Install Android Build Template..."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Projekta Dibinātāji"
+msgstr "Atvērt Projekta Datu Mapi"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
@@ -2760,22 +2725,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2784,8 +2753,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2794,32 +2763,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2879,7 +2848,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2893,16 +2862,20 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr ""
+msgstr "Sabiedrība"
#: editor/editor_node.cpp
msgid "About"
-msgstr ""
+msgstr "Par"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -2954,9 +2927,8 @@ msgid "Spins when the editor window redraws."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "Nepārtraukti"
+msgstr "Nepārtraukti Atjaunot"
#: editor/editor_node.cpp
msgid "Update When Changed"
@@ -3086,9 +3058,8 @@ msgid "Thumbnail..."
msgstr ""
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "Savieno Signālu:"
+msgstr "Galvenais Skripts:"
#: editor/editor_plugin_settings.cpp
msgid "Edit Plugin"
@@ -3160,9 +3131,8 @@ msgid "Calls"
msgstr ""
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Savieno Signālu:"
+msgstr "Rediģēt Tekstu:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3185,9 +3155,8 @@ msgid "Assign..."
msgstr ""
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "Nederīgs nosaukums."
+msgstr "Nederīgs RID"
#: editor/editor_properties.cpp
msgid ""
@@ -3279,7 +3248,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3306,6 +3276,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3430,9 +3404,8 @@ msgid "Download Complete."
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "Nevar noņemt:"
+msgstr "Nevar noņemt pagaidu failu:"
#: editor/export_template_manager.cpp
msgid ""
@@ -3441,9 +3414,8 @@ msgid ""
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "Kļūme lādējot:"
+msgstr "Kļūda pieprasot URL:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3512,9 +3484,8 @@ msgid "Remove Template"
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
-msgstr "Izvēlēties šo Mapi"
+msgstr "Izvēlēties Šablona Failu"
#: editor/export_template_manager.cpp
msgid "Godot Export Templates"
@@ -3533,9 +3504,8 @@ msgid "Select mirror from list: (Shift+Click: Open in Browser)"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Favorīti:"
+msgstr "Favorīti"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -3598,28 +3568,24 @@ msgid "New Inherited Scene"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Saglabāt Kā"
+msgstr "Iestatīt Kā Galveno Ainu"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Atjaunina Ainu"
+msgstr "Atvērt Ainas"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "Favorīti:"
+msgstr "Pievienot Favorītiem"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "Favorīti:"
+msgstr "Noņemt no Favorītiem"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3642,18 +3608,16 @@ msgid "Move To..."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "Resurs"
+msgstr "Jauna Aina..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Resurs"
+msgstr "Jauns Resurss..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
@@ -3673,14 +3637,12 @@ msgid "Rename"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "Izvēlēties šo Mapi"
+msgstr "Iepriekšējā Mape/Fails"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "Izvēlēties šo Mapi"
+msgstr "Nākamā Mape/Fails"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
@@ -3691,9 +3653,8 @@ msgid "Toggle Split Mode"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "Meklēt:"
+msgstr "Meklēt failus"
#: editor/filesystem_dock.cpp
msgid ""
@@ -3714,18 +3675,16 @@ msgid "Overwrite"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "Izveidot"
+msgstr "Izveidot Ainu"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "Nederīgs nosaukums."
+msgstr "Atrast Failos"
#: editor/find_in_files.cpp
msgid "Find:"
@@ -3763,18 +3722,16 @@ msgid "Find: "
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "Aizvietot"
+msgstr "Aizvietot: "
#: editor/find_in_files.cpp
msgid "Replace all (no undo)"
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Meklēt:"
+msgstr "Meklē..."
#: editor/find_in_files.cpp
msgid "Search complete"
@@ -3793,19 +3750,16 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "Nederīgs nosaukums."
+msgstr "Nederīgs grupas nosaukums."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "Pārsaukt Audio Kopni"
+msgstr "Pārsaukt Grupu"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "Izdzēst"
+msgstr "Izdzēst Grupu"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3829,9 +3783,8 @@ msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "Rediģēt"
+msgstr "Grupas Redaktors"
#: editor/groups_editor.cpp
msgid "Manage Groups"
@@ -3911,19 +3864,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+msgid "%d Files"
+msgstr "%d Failā"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3931,16 +3888,15 @@ msgid "Import As:"
msgstr ""
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "Atiestatīt tālummaiņu"
+msgstr "Sagatave"
#: editor/import_dock.cpp
msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3974,10 +3930,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4071,16 +4023,14 @@ msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "Izveidot"
+msgstr "Izveidot Daudzstūri"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "Izveidot"
+msgstr "Izveidot punktus."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
@@ -4095,9 +4045,8 @@ msgid "Erase points."
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
-msgstr "Izveidot"
+msgstr "Rediģēt Daudzstūri"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
@@ -4123,9 +4072,8 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load..."
-msgstr "Ielādēt"
+msgstr "Ielādē..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4148,15 +4096,13 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "Favorīti:"
+msgstr "Pievienot Mezgla Punktu"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "Animāciju Cilpa"
+msgstr "Pievienot Animācijas Punktu"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Remove BlendSpace1D Point"
@@ -4205,18 +4151,16 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Animācijas tālummaiņa."
+msgstr "Atvērt Animācijas Mezglu"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Triangle already exists."
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "Pievienot celiņu"
+msgstr "Pievienot Trijstūri"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Limits"
@@ -4291,9 +4235,8 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Connected"
-msgstr "Savienot"
+msgstr "Mezgli Savienoti"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4301,15 +4244,13 @@ msgid "Nodes Disconnected"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "Optimizēt animāciju"
+msgstr "Iestatīt Animāciju"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Node"
-msgstr "Izdzēst"
+msgstr "Izdzēst Mezglu"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
@@ -4321,9 +4262,8 @@ msgid "Toggle Filter On/Off"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Change Filter"
-msgstr "Nomainīt"
+msgstr "Nomainīt Filtru"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
@@ -4341,19 +4281,16 @@ msgid ""
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "Animācijas klipi:"
+msgstr "Anim. Klipi"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "Audio klipi:"
+msgstr "Audio Klipi"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Funkcijas:"
+msgstr "Funkcijas"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4371,9 +4308,8 @@ msgid "Edit Filtered Tracks:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable Filtering"
-msgstr "Nomainīt"
+msgstr "Ieslēgt Filtrēšanu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4402,9 +4338,8 @@ msgid "Remove Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "Nederīgs nosaukums."
+msgstr "Nederīgs animācijas nosaukums!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation name already exists!"
@@ -4432,9 +4367,8 @@ msgid "Duplicate Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "Animācijas tālummaiņa."
+msgstr "Nav animācijas ko kopēt!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation resource on clipboard!"
@@ -4588,14 +4522,12 @@ msgid "Move Node"
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Pievienot celiņu"
+msgstr "Pāreja eksistē!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "Pievienot celiņu"
+msgstr "Pievienot Pāreju"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -4631,9 +4563,8 @@ msgid "No playback resource set at path: %s."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
-msgstr "Noņemt"
+msgstr "Mezgls Noņemts"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition Removed"
@@ -4651,19 +4582,16 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Izveidot Jaunu %s"
+msgstr "Izveidot jaunus mezglus."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Savienot"
+msgstr "Savienot mezglus."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Remove selected node or transition."
-msgstr "Noņemt Izvēlēto"
+msgstr "Noņemt izvēlēto mezglu vai pāreju."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -4678,9 +4606,8 @@ msgid "Transition: "
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Mēroga Attiecība:"
+msgstr "Atskaņošanas Režīms:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4856,9 +4783,8 @@ msgid "Request failed."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Cannot save response to:"
-msgstr "Nevar noņemt:"
+msgstr "Nevar saglabāt atbildi uz:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Write error."
@@ -4921,9 +4847,8 @@ msgid "Idle"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Ieinstalēt"
+msgstr "Instalēt..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4954,14 +4879,12 @@ msgid "Name (Z-A)"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "Licence"
+msgstr "Licence (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "Licence"
+msgstr "Licence (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
@@ -5021,9 +4944,8 @@ msgid "Testing"
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Loading..."
-msgstr "Ielādēt"
+msgstr "Ielādēt..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
@@ -5051,7 +4973,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5084,37 +5006,32 @@ msgid "Rotation Step:"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Step:"
-msgstr "Mēroga Attiecība:"
+msgstr "Mainīt Soļa Mērogu:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Vertical Guide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "Izveidot"
+msgstr "Izveidot Vertikālu Vadotni"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "Noņemt Izvēlēto"
+msgstr "Noņemt Vertikālo Vadotni"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Horizontal Guide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Izveidot Jaunu %s"
+msgstr "Izveidot Horizontālu Vadotni"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "Noņemt Izvēlēto"
+msgstr "Noņemt Horizontālo Vadotni"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Horizontal and Vertical Guides"
@@ -5197,18 +5114,16 @@ msgid "Center"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
-msgstr "Lineārs"
+msgstr "Pa Kreisi, Plašs"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Wide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
-msgstr "Lineārs"
+msgstr "Pa labi, Plašs"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Wide"
@@ -5227,9 +5142,8 @@ msgid "Full Rect"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "Mēroga Attiecība:"
+msgstr "Ievērot Attiecību"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5269,24 +5183,21 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Group Selected"
-msgstr "Noņemt Izvēlēto"
+msgstr "Grupa Izvēlēta"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Ungroup Selected"
-msgstr "Noņemt Izvēlēto"
+msgstr "Pārtraukt Izvēlētā Grupēšanu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Guides"
-msgstr "Izveidot"
+msgstr "Notīrīt Vadotnes"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
@@ -5313,9 +5224,8 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-#, fuzzy
msgid "Zoom Reset"
-msgstr "Attālināt"
+msgstr "Atiestatīt Tuvinājumu"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5350,9 +5260,8 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Mēroga Attiecība:"
+msgstr "Mēroga Režīms"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5370,9 +5279,8 @@ msgid "Pan Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "Mēroga Attiecība:"
+msgstr "Lineāla Režīms"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
@@ -5549,14 +5457,12 @@ msgid ""
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Auto Insert Key"
-msgstr "Anim ievietot atslēgievietni"
+msgstr "Automātiski Ievietot Atslēgu"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Animācijas Garums (sekundes)"
+msgstr "Animācijas Atslēga un Pozas Iestatījumi"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5605,9 +5511,8 @@ msgid "Error instancing scene from %s"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Change Default Type"
-msgstr "Nomainīt %s Tipu"
+msgstr "Nomainīt Noklusējuma Tipu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5616,9 +5521,8 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon3D"
-msgstr "Izveidot"
+msgstr "Izveidot Daudzstūris3D"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
@@ -5737,29 +5641,24 @@ msgid "Load Curve Preset"
msgstr ""
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
-msgstr "Favorīti:"
+msgstr "Pievienot Punktu"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
-msgstr "Noņemt Izvēlēto"
+msgstr "Noņemt Punktu"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Left Linear"
-msgstr "Lineārs"
+msgstr "Pa Kreisi, Lineārs"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right Linear"
-msgstr "Lineārs"
+msgstr "Pa Labi, Lineārs"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Load Preset"
-msgstr "Ielādēt Noklusējumu"
+msgstr "Ielādēt Sagatavi"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove Curve Point"
@@ -5806,11 +5705,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5822,13 +5721,28 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Shape(s)"
-msgstr "Izveidot Jaunu %s"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Izveidot Vienu Izliektu Formu"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Izveidot Vairākas Izliektas Formas"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5879,19 +5793,55 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Izveidot"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Izveidot Vienu Izliektu Sadursmes Uzmavu"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Izveidot Vairākas Izliektas Sadursmes Uzmavas"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6532,14 +6482,12 @@ msgid "Error saving file!"
msgstr "Kļūmes lādējot!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "Kļūmes lādējot!"
+msgstr "Kļūda saglabājot motīvu."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
-msgstr "Kļūme lādējot:"
+msgstr "Kļūda Saglabājot"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6547,9 +6495,8 @@ msgid "Error importing theme."
msgstr "Kļūda lādējot fontu."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
-msgstr "Kļūme lādējot:"
+msgstr "Kļūda Importējot"
#: editor/plugins/script_editor_plugin.cpp
msgid "New Text File..."
@@ -6561,9 +6508,8 @@ msgid "Open File"
msgstr "Atvērt"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Saglabāt Kā"
+msgstr "Saglabāt Failu Kā..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
@@ -6653,9 +6599,8 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open..."
-msgstr "Atvērt"
+msgstr "Atvērt..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reopen Closed Script"
@@ -6740,14 +6685,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6784,9 +6721,8 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "Meklēt:"
+msgstr "Meklēšanas Rezultāti"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Scripts"
@@ -6806,19 +6742,18 @@ msgid "Target"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "Atvienot '%s' no '%s'"
+msgstr ""
+"Trūkst savienošanas metode '%s' signālam '%s' no mezgla '%s' uz mezglu '%s'."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Line"
-msgstr "Rinda:"
+msgid "[Ignore]"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
+msgid "Line"
+msgstr "Rinda"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6971,14 +6906,12 @@ msgid "Remove All Bookmarks"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
-msgstr "Izveidot Funkciju"
+msgstr "Doties uz Funkciju..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "Doties uz Rindu"
+msgstr "Doties uz Rindu..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -7190,6 +7123,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7279,17 +7216,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7637,7 +7583,7 @@ msgid "New Animation"
msgstr "Optimizēt animāciju"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7645,9 +7591,8 @@ msgid "Loop"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animation Frames:"
-msgstr "Animācijas īpašības."
+msgstr "Animācijas Kadri:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -7905,9 +7850,8 @@ msgid "Erase Selection"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Nederīgs nosaukums."
+msgstr "Salabot Nederīgās Flīzes"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
@@ -7998,9 +7942,8 @@ msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "Noņemt Izvēlēto"
+msgstr "Noņemt izvēlētās Tekstūras no Flīžu Komplekta."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -8099,9 +8042,8 @@ msgid "Priority Mode"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Icon Mode"
-msgstr "Mēroga Attiecība:"
+msgstr "Ikonu Režīms"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Z Index Mode"
@@ -8112,23 +8054,20 @@ msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste bitmask."
-msgstr "Ielīmēt celiņus"
+msgstr "Ielīmēt bitu masku."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Erase bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "Izveidot Jaunu %s"
+msgstr "Izveidot jaunu taisnstūri."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new polygon."
-msgstr "Izveidot"
+msgstr "Izveidot jaunu daudzstūri."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
@@ -8148,9 +8087,9 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "Noņemt Izvēlēto"
+msgstr ""
+"Noņemt Izvēlēto tekstūru? Šī darbība noņems visas flīzes, kas to izmanto."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
@@ -8180,9 +8119,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "Izdzēst izvēlētos failus?"
+msgstr "Izdzēst izvēlēto Taisnstūri."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8191,9 +8129,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
-msgstr "Izveidot"
+msgstr "Izdzēst daudzstūri."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8329,7 +8266,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8430,9 +8367,8 @@ msgid "(GLES3 only)"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Output"
-msgstr "Favorīti:"
+msgstr "Pievienot Izeju"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar"
@@ -8451,9 +8387,8 @@ msgid "Sampler"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "Favorīti:"
+msgstr "Pievienot ieejas pieslēgvietu"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
@@ -8538,9 +8473,8 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Show resulted shader code."
-msgstr "Izveidot Jaunu %s"
+msgstr "Attēlot rezultējošo ēnotāja kodu."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8548,18 +8482,16 @@ msgid "Create Shader Node"
msgstr "Izveidot Jaunu %s"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "Izveidot Funkciju"
+msgstr "Krāsas funkcija."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "Izveidot Funkciju"
+msgstr "Pelēktoņu funkcija."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
@@ -8570,9 +8502,8 @@ msgid "Converts RGB vector to HSV equivalent."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "Izveidot Funkciju"
+msgstr "Sēpija funkcija."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
@@ -8725,9 +8656,8 @@ msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "Mēroga Izvēle"
+msgstr "Skalāra funkcija."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar operator."
@@ -8984,9 +8914,8 @@ msgid "2D texture uniform lookup with triplanar."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "Izveidot"
+msgstr "Transformēšanas funkcija."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9028,19 +8957,16 @@ msgid "Multiplies vector by transform."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "Izveidot"
+msgstr "Transformēt konstanti."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "Izveidot"
+msgstr "Transformēt vienmērīgo."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "Izveidot Funkciju"
+msgstr "Vektora funkcija."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector operator."
@@ -9250,9 +9176,8 @@ msgid "Runnable"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Add initial export..."
-msgstr "Favorīti:"
+msgstr "Pievienot sākuma eksportu..."
#: editor/project_export.cpp
msgid "Add previous patches..."
@@ -9438,11 +9363,17 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Kļūme atverot arhīvu failu, nav ZIP formātā."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9450,11 +9381,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9669,6 +9600,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9717,6 +9649,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9943,7 +9882,7 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
+msgstr "Vispārēji"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -10095,11 +10034,20 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Aizvietot: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10137,11 +10085,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10149,9 +10097,8 @@ msgid "Initial value for the counter"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Solis (ļi):"
+msgstr "Solis"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
@@ -10168,10 +10115,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10180,11 +10123,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10204,6 +10147,14 @@ msgstr ""
msgid "Reset"
msgstr "Atiestatīt tālummaiņu"
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Pie rakstzīmes %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10267,8 +10218,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Galvenais Skripts:"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10304,8 +10256,12 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Izdzēst %d mezglus?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Izdzēst"
+msgstr "Izdzēst %d mezglus?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10316,9 +10272,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Izdzēst"
+msgstr "Izdzēst mezglu \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10353,9 +10308,8 @@ msgid "New Scene Root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Izveidot Jaunu %s"
+msgstr "Izveidot Cilmes Mezglu:"
#: editor/scene_tree_dock.cpp
msgid "2D Scene"
@@ -10429,6 +10383,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10466,9 +10427,8 @@ msgid "Delete (No Confirm)"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Izveidot Jaunu %s"
+msgstr "Pievienot/Izveidot Jaunu Mezglu."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10477,11 +10437,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10509,9 +10469,8 @@ msgid "Button Group"
msgstr ""
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "Savieno Signālu:"
+msgstr "(Savienojas No)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
@@ -10582,14 +10541,12 @@ msgid "Select a Node"
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "Starpliktuve ir tukša"
+msgstr "Ceļš nav definēts."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "Starpliktuve ir tukša"
+msgstr "Faila Nosaukums nav definēts."
#: editor/script_create_dialog.cpp
msgid "Path is not local."
@@ -10605,6 +10562,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Nederīgs fonta izmērs."
@@ -10646,6 +10607,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Nederīgs ceļš."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid class name."
msgstr "Nederīgs nosaukums."
@@ -10655,7 +10620,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10667,9 +10632,8 @@ msgid "Built-in script (into scene file)."
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "Izveidot Jaunu %s"
+msgstr "Izveidos jaunu skripta failu."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -10681,6 +10645,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10728,14 +10698,12 @@ msgid "C++ Source"
msgstr "Resurs"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
-msgstr "Resurs"
+msgstr "Avots:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "Resurs"
+msgstr "C++ Avots:"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
@@ -10746,15 +10714,18 @@ msgid "Errors"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Child process connected."
-msgstr "Savienot"
+msgstr "Bērna process savienots."
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Izveidot"
@@ -10804,7 +10775,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11286,14 +11257,12 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "Favorīti:"
+msgstr "Pievienot Ieejas Pieslēgvietu"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "Favorīti:"
+msgstr "Pievienot Izejas Pieslēgvietu"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -11303,27 +11272,24 @@ msgstr ""
"nosaukumu."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "Izveidot Jaunu %s"
+msgstr "Izveidot jaunu funkciju."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "Izveidot Jaunu %s"
+msgstr "Izveidot jaunu mainīgo."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "Izveidot"
+msgstr "Izveidot jaunu signālu."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
@@ -11533,24 +11499,20 @@ msgid "Members:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "Nomainīt %s Tipu"
+msgstr "Nomainīt Bāzes Tipu:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "Favorīti:"
+msgstr "Pievienot Mezglus..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Izveidot Funkciju"
+msgstr "Pievienot Funkciju..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "Funkcijas:"
+msgstr "funkcijas_nosaukums"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
@@ -11573,9 +11535,8 @@ msgid "Cut Nodes"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "Funkcijas:"
+msgstr "Izveidot Funkciju"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
@@ -11692,6 +11653,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11710,9 +11675,34 @@ msgid "Invalid public key for APK expansion."
msgstr ""
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "Nederīgs nosaukums."
+msgstr "Nederīgs paketes nosaukums:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
#: platform/android/export/export.cpp
msgid ""
@@ -11755,9 +11745,8 @@ msgid "App Store Team ID not specified - cannot configure the project."
msgstr ""
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "Nederīgs fonta izmērs."
+msgstr "Nederīgs Identifikators:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
@@ -11900,6 +11889,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12087,6 +12082,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12107,6 +12107,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12207,9 +12212,8 @@ msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Animācijas garums (sekundēs)."
+msgstr "Animācija netika atrasta: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
@@ -12221,9 +12225,8 @@ msgid "Invalid animation: '%s'."
msgstr "Nederīgs fonta izmērs."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Atvienot '%s' no '%s'"
+msgstr "Nekas nav savienots ar ieeju '%s' mezglam '%s'."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
@@ -12269,9 +12272,8 @@ msgid "Switch between hexadecimal and code values."
msgstr ""
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "Pievienot pašreizējo krāsu kā iepriekšnoteiktu krāsu"
+msgstr "Pievienot pašreizējo krāsu kā iepriekšnoteiktu krāsu."
#: scene/gui/container.cpp
msgid ""
@@ -12330,6 +12332,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
diff --git a/editor/translations/mi.po b/editor/translations/mi.po
index 24d1f213e2..d0e967f5bd 100644
--- a/editor/translations/mi.po
+++ b/editor/translations/mi.po
@@ -500,6 +500,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -659,7 +660,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -678,7 +679,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -728,6 +729,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -807,7 +812,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -864,6 +868,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -901,7 +909,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1075,6 +1083,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1096,6 +1107,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1399,7 +1418,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1407,16 +1426,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1444,6 +1455,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1563,15 +1578,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1720,7 +1735,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1834,7 +1849,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2244,10 +2259,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2332,11 +2343,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2602,10 +2615,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2665,22 +2674,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2689,8 +2702,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2699,32 +2712,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2784,7 +2797,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2798,7 +2811,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3180,7 +3197,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3207,6 +3225,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3791,19 +3813,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3819,7 +3845,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3853,10 +3879,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4900,7 +4922,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5632,11 +5654,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5648,11 +5670,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5704,11 +5742,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5716,6 +5783,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6552,14 +6627,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6621,11 +6688,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6989,6 +7056,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7077,17 +7148,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7424,7 +7504,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8080,7 +8160,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9164,11 +9244,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9176,11 +9261,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9395,6 +9480,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9441,6 +9527,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9818,11 +9911,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9860,11 +9961,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9890,10 +9991,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9902,11 +9999,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9925,6 +10022,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -9988,7 +10093,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10024,6 +10129,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10146,6 +10255,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10192,11 +10308,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10316,6 +10432,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10356,6 +10476,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10364,7 +10488,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10388,6 +10512,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10456,6 +10586,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10504,7 +10638,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11370,6 +11504,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11393,6 +11531,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11570,6 +11734,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11757,6 +11927,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11777,6 +11952,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -11996,6 +12176,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/ml.po b/editor/translations/ml.po
index dbf8e76d3f..25ae499eac 100644
--- a/editor/translations/ml.po
+++ b/editor/translations/ml.po
@@ -510,6 +510,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -669,7 +670,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -688,7 +689,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -738,6 +739,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -817,7 +822,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -874,6 +878,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -911,7 +919,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1085,6 +1093,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1106,6 +1117,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1409,7 +1428,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1417,16 +1436,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1454,6 +1465,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1573,15 +1588,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1730,7 +1745,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1844,7 +1859,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2256,10 +2271,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2344,11 +2355,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2614,10 +2627,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2677,22 +2686,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2701,8 +2714,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2711,32 +2724,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2796,7 +2809,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2810,7 +2823,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3192,7 +3209,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3219,6 +3237,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3803,19 +3825,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3831,7 +3857,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3865,10 +3891,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4915,7 +4937,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5648,11 +5670,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5664,11 +5686,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5720,11 +5758,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5732,6 +5799,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6568,14 +6643,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6637,11 +6704,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7005,6 +7072,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7093,17 +7164,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7440,7 +7520,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8096,7 +8176,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9180,11 +9260,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9192,11 +9277,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9411,6 +9496,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9457,6 +9543,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9834,11 +9927,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9876,11 +9977,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9906,10 +10007,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9918,11 +10015,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9941,6 +10038,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10004,7 +10109,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10040,6 +10145,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10162,6 +10271,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10208,11 +10324,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10332,6 +10448,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10372,6 +10492,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10380,7 +10504,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10404,6 +10528,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10472,6 +10602,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10520,7 +10654,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11387,6 +11521,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11410,6 +11548,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11587,6 +11751,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11774,6 +11944,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11794,6 +11969,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12013,6 +12193,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/mr.po b/editor/translations/mr.po
index 43f7620d28..c17092697d 100644
--- a/editor/translations/mr.po
+++ b/editor/translations/mr.po
@@ -3,41 +3,42 @@
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
# Prachi Joshi <josprachi@yahoo.com>, 2019, 2020.
+# Shirious <sad3119823@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2020-01-11 03:05+0000\n"
-"Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n"
+"PO-Revision-Date: 2020-05-05 14:01+0000\n"
+"Last-Translator: Shirious <sad3119823@gmail.com>\n"
"Language-Team: Marathi <https://hosted.weblate.org/projects/godot-engine/"
"godot/mr/>\n"
"Language: mr\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 3.10.1\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "convert() साठी अवैध आरग्युमेन्ट, TYPE_* कोन्सटन्ट वापरा."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "1 लांबीची स्ट्रिंग अपेक्षित (एक कैरेक्टर)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "डिकोड करण्यासाठी पुरसे बाईटस् नाहित, किंवा अवैध फ़ोरमैट."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "एक्सप्रेशन मधे अवैध इनपुट %i (पास नाही झाले)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self वापरले जाऊ शकत नाही कारण इन्सटन्स null आहे (पास नाही झाले)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -506,6 +507,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -665,7 +667,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -684,7 +686,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -734,6 +736,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -813,7 +819,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -870,6 +875,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -907,7 +916,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1081,6 +1090,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1102,6 +1114,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1405,7 +1425,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1413,16 +1433,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1450,6 +1462,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1569,15 +1585,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1726,7 +1742,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1840,7 +1856,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -1924,9 +1940,8 @@ msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "मूल्य:"
+msgstr "(किंमत)"
#: editor/editor_help.cpp
msgid ""
@@ -2251,10 +2266,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2339,11 +2350,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2609,10 +2622,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2672,22 +2681,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2696,8 +2709,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2706,32 +2719,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2791,7 +2804,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2805,7 +2818,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3187,7 +3204,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3214,6 +3232,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3798,19 +3820,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3826,7 +3852,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3860,10 +3886,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4398,95 +4420,95 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
-msgstr ""
+msgstr "1 पायरी"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "2 steps"
-msgstr ""
+msgstr "2 पायऱ्या"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "3 steps"
-msgstr ""
+msgstr "3 पायर्‍या"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Differences Only"
-msgstr ""
+msgstr "फक्त फरक"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Force White Modulate"
-msgstr ""
+msgstr "व्हाइट मॉड्युलेटेड सक्ती करा"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
-msgstr ""
+msgstr "गिझ्मोस (3 डी) समाविष्ट करा"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pin AnimationPlayer"
-msgstr ""
+msgstr "अ‍ॅनिमेशनप्लेअर पिन करा"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
-msgstr ""
+msgstr "नवीन अ‍ॅनिमेशन तयार करा"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Name:"
-msgstr ""
+msgstr "अ‍ॅनिमेशन नाव:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
msgid "Error!"
-msgstr ""
+msgstr "त्रुटी!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
-msgstr ""
+msgstr "ब्लेंड टाइम्स:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
-msgstr ""
+msgstr "पुढील (स्वयं रांग):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
-msgstr ""
+msgstr "क्रॉस-अ‍ॅनिमेशन ब्लेंड टाइम्स"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Move Node"
-msgstr ""
+msgstr "नोड हलवा"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition exists!"
-msgstr ""
+msgstr "संक्रमण विद्यमान आहे!"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Add Transition"
-msgstr ""
+msgstr "संक्रमण जोडा"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node"
-msgstr ""
+msgstr "नोड जोडा"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "समाप्त"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "त्वरित"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "समक्रमित करा"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "शेवटी"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "प्रवास"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
@@ -4498,15 +4520,15 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Node Removed"
-msgstr ""
+msgstr "नोड काढला"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition Removed"
-msgstr ""
+msgstr "संक्रमण काढले"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
-msgstr ""
+msgstr "स्टार्ट नोड सेट करा (ऑटोप्ले)"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4517,15 +4539,15 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Create new nodes."
-msgstr ""
+msgstr "नवीन नोड तयार करा."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Connect nodes."
-msgstr ""
+msgstr "नोड कनेक्ट करा."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Remove selected node or transition."
-msgstr ""
+msgstr "निवडलेले नोड किंवा संक्रमण काढा."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -4533,29 +4555,29 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "शेवटचे अ‍ॅनिमेशन सेट करा. हे उप-संक्रमणांसाठी उपयुक्त आहे."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition: "
-msgstr ""
+msgstr "संक्रमण: "
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Play Mode:"
-msgstr ""
+msgstr "प्ले मोड:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr ""
+msgstr "अ‍ॅनिमेशन ट्री"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
-msgstr ""
+msgstr "नवीन नाव:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Scale:"
-msgstr ""
+msgstr "स्केल:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade In (s):"
@@ -4907,7 +4929,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5639,11 +5661,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5655,11 +5677,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5711,11 +5749,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5723,6 +5790,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6559,14 +6634,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6628,11 +6695,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6996,6 +7063,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7084,17 +7155,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7431,7 +7511,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8087,7 +8167,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9171,11 +9251,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9183,11 +9268,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9402,6 +9487,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9448,6 +9534,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9825,11 +9918,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9867,11 +9968,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9897,10 +9998,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9909,11 +10006,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9932,6 +10029,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -9995,7 +10100,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10031,6 +10136,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10153,6 +10262,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10199,11 +10315,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10323,6 +10439,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10363,6 +10483,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10371,7 +10495,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10395,6 +10519,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10463,6 +10593,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10511,7 +10645,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11377,6 +11511,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11400,6 +11538,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11577,6 +11741,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11764,6 +11934,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11784,6 +11959,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12003,6 +12183,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/ms.po b/editor/translations/ms.po
index 0207d83de5..19d36c70cd 100644
--- a/editor/translations/ms.po
+++ b/editor/translations/ms.po
@@ -7,13 +7,14 @@
# Syaz Amirin <amirin123z@gmail.com>, 2018.
# Nafis Ibrahim <thepreciousnafis@gmail.com>, 2018.
# Muhammad Hazim bin Hafizalshah <muhammadhazimhafizalshah@gmail.com>, 2020.
+# keviinx <keviinx@yahoo.com>, 2020.
+# Keviindran Ramachandran <keviinx@yahoo.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
-"Last-Translator: Muhammad Hazim bin Hafizalshah "
-"<muhammadhazimhafizalshah@gmail.com>\n"
+"PO-Revision-Date: 2020-09-15 07:17+0000\n"
+"Last-Translator: Keviindran Ramachandran <keviinx@yahoo.com>\n"
"Language-Team: Malay <https://hosted.weblate.org/projects/godot-engine/godot/"
"ms/>\n"
"Language: ms\n"
@@ -21,119 +22,118 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "Argumen jenis tidak sah untuk convert(), guna pemalar TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Menjangkakan rentetan dengan panjang 1 (satu watak)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "Bait tidak mencukupi untuk menyahkod bait, atau format tidak sah."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Input %i tidak sah (tidak lulus) dalam ungkapan"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self tidak boleh digunakan kerana instance adalah null (tidak lulus)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "Operan tidak sah untuk pengendali %s, %s dan %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr ""
+msgstr "Indeks tidak sah untuk jenis %s untuk jenis asa %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Indeks bernama tidak sah '%s' untuk jenis asa %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ""
+msgstr "Argumen tidak sah untuk binaan '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Atas panggilan ke '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr ""
+msgstr "Bebas"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Seimbang"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "Cermin"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
-msgstr ""
+msgstr "Masa:"
#: editor/animation_bezier_editor.cpp
msgid "Value:"
-msgstr ""
+msgstr "Nilai:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr ""
+msgstr "Masukkan Kunci di Sini"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Anim Menduakan Kunci"
+msgstr "Gandakan Kunci Terpilih"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr ""
+msgstr "Padam Kunci Terpilih"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr ""
+msgstr "Tambah Titik Bezier"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr ""
+msgstr "Pindah Titik-titik Bezier"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -141,10 +141,9 @@ msgstr "Anim Menduakan Kunci"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr ""
+msgstr "Anim Padam Kunci"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Time"
msgstr "Anim Ubah Masa Keyframe"
@@ -154,7 +153,7 @@ msgstr "Anim Ubah Peralihan"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "Anim Ubah Penukaran"
+msgstr "Anim Ubah Perubahan"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
@@ -165,200 +164,192 @@ msgid "Anim Change Call"
msgstr "Anim Ubah Panggilan"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Anim Ubah Masa Keyframe"
+msgstr "Anim Ubah Pelbagai Masa Keyframe"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Anim Ubah Peralihan"
+msgstr "Anim Ubah Pelbagai Peralihan"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Anim Ubah Penukaran"
+msgstr "Anim Ubah Pelbagai Penukaran"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Anim Ubah Nilai Keyframe"
+msgstr "Anim Ubah Pelbagai Nilai Keyframe"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Anim Ubah Panggilan"
+msgstr "Anim Ubah Pelbagai Panggilan"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
-msgstr ""
+msgstr "Ubah Panjang Animasi"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "Ubah Gelung Animasi"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Trek Sifat"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "Trek Transformasi 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Trek Panggilan Kaedah"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Trek Lengkung Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Trek Main balik Audio"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
-msgstr ""
+msgstr "Trek Main Balik Animasi"
#: editor/animation_track_editor.cpp
msgid "Animation length (frames)"
-msgstr ""
+msgstr "Panjang animasi (bingkai)"
#: editor/animation_track_editor.cpp
msgid "Animation length (seconds)"
-msgstr ""
+msgstr "Panjang animasi (saat)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Anim Tambah Trek"
+msgstr "Tambah Trek"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr ""
+msgstr "Gelung Animasi"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr ""
+msgstr "Fungsi:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "Klip Audio:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Klip Anim:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr ""
+msgstr "Tukar Laluan Trek"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "Hidupkan / matikan trek ini."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Kemas kini Mod (Bagaimana sifat ini ditetapkan)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr ""
+msgstr "Mod Interpolasi"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Mod Gelung Balut (Interpolat hujung dengan permulaan pada gelung)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Buang Trek Anim"
+msgstr "Keluarkan trek ini."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
-msgstr ""
+msgstr "Masa (s): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "Togol Trek Diaktifkan"
#: editor/animation_track_editor.cpp
msgid "Continuous"
-msgstr ""
+msgstr "Berterusan"
#: editor/animation_track_editor.cpp
msgid "Discrete"
-msgstr ""
+msgstr "Diskret"
#: editor/animation_track_editor.cpp
msgid "Trigger"
-msgstr ""
+msgstr "Pencetus"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "Tangkap"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Terdekat"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
msgid "Linear"
-msgstr ""
+msgstr "Linear"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubik"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Kepit Gelung Interp"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Balut Gelung Interp"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "Masukkan Kunci"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Anim Menduakan Kunci"
+msgstr "Menduakan Kunci"
#: editor/animation_track_editor.cpp
msgid "Delete Key(s)"
-msgstr ""
+msgstr "Padam Kunci"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
-msgstr ""
+msgstr "Mod Tukar Kemas Kini Animasi"
#: editor/animation_track_editor.cpp
msgid "Change Animation Interpolation Mode"
-msgstr ""
+msgstr "Tukar Mod Interpolasi Animasi"
#: editor/animation_track_editor.cpp
msgid "Change Animation Loop Mode"
-msgstr ""
+msgstr "Tukar Mod Gelung Animasi"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr "Buang Trek Anim"
+msgstr "Keluarkan Trek Anim"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr ""
+msgstr "Cipta trek BARU untuk %s dan masukkan kunci?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr ""
+msgstr "Cipta %d BARU trek dan masukkan kunci?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -370,40 +361,39 @@ msgstr ""
#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Create"
-msgstr ""
+msgstr "Cipta"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr ""
+msgstr "Masukkan Anim"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer tidak animasikan dirinya sendiri, hanya pemain lain."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr ""
+msgstr "Anim Cipta & Masukkan"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr ""
+msgstr "Anim Masukkan Trek & Kunci"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr ""
+msgstr "Anim Masukkan Kunci"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "Anim Ubah Peralihan"
+msgstr "Tukar Langkah Animasi"
#: editor/animation_track_editor.cpp
msgid "Rearrange Tracks"
-msgstr ""
+msgstr "Susun semula Trek"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Transformasi trek hanya berlaku kepada nod berasaskan Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -412,78 +402,82 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Trek audio hanya boleh ditujukan kepada nod jenis:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Trek animasi hanya dapat ditujukan kepada nod AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Pemain animasi tidak boleh animasikan dirinya sendiri, hanya pemain lain."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Tidak boleh menambah trek baru tanpa satu akar"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Trek tidak sah untuk Bezier (tiada sub-sifat yang sesuai)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "Anim Tambah Trek"
+msgstr "Tambah Trek Bezier"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Laluan trek tidak sah, maka tidak boleh menambahkan kunci."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Trek bukan jenis Spatial, tidak boleh memasukkan kunci"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
-msgstr ""
+msgstr "Tambah Kunci Trek Transformasi"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "Anim Tambah Trek"
+msgstr "Tambah Kunci Trek"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Laluan trek tidak sah, maka tidak boleh menambahkan kunci kaedah."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "Anim Tambah Trek"
+msgstr "Tambah Kunci Trek Kaedah"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr ""
+msgstr "Kaedah tidak ditemui dalam objek: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr ""
+msgstr "Kunci Gerak Anim"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr ""
+msgstr "Papan klip kosong"
#: editor/animation_track_editor.cpp
msgid "Paste Tracks"
-msgstr ""
+msgstr "Tampal Trek"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr ""
+msgstr "Kunci Skala Anim"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Pilihan ini tidak berfungsi untuk pengeditan Bezier, kerana ia hanya satu "
+"trek."
#: editor/animation_track_editor.cpp
msgid ""
@@ -497,38 +491,48 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"Animasi ini tergolong dalam adegan yang diimport, maka perubahan untuk trek "
+"yang diimport tidak akan disimpan.\n"
+"\n"
+"Untuk memberikan keupayaan untuk menambah trek tersuai, navigasi ke tetapan "
+"import adegan dan tetapkan\n"
+"\"Animasi > Simpanan\" ke \"Fail\", aktifkan \"Animasi > Simpan Trek Tersuai"
+"\", kemudian import semula.\n"
+"Sebagai alternatif, gunakan pratetap import yang mengimportkan animasi untuk "
+"memisahkan fail."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "Amaran: Mengedit animasi yang diimport"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr ""
+msgstr "Pilih nod AnimationPlayer untuk mencipta dan mengedit animasi."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Hanya tunjukkan trek dari nod yang dipilih di pokok."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Kumpulkan trek mengikut nod atau memaparkannya sebagai senarai biasa."
#: editor/animation_track_editor.cpp
msgid "Snap:"
-msgstr ""
+msgstr "Tangkap:"
#: editor/animation_track_editor.cpp
msgid "Animation step value."
-msgstr ""
+msgstr "Nilai langkah animasi."
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "Saat"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr ""
+msgstr "FPS"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -538,108 +542,107 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/property_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit"
-msgstr ""
+msgstr "Edit"
#: editor/animation_track_editor.cpp
msgid "Animation properties."
-msgstr ""
+msgstr "Sifat animasi."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr ""
+msgstr "Salin Trek"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
-msgstr ""
+msgstr "Pemilihan Skala"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
-msgstr ""
+msgstr "Skala Dari Kursor"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr ""
+msgstr "Menduakan Pilihan"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr ""
+msgstr "Menduakan Pindahan"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Semua Pilihan"
+msgstr "Padam Pilihan"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
-msgstr ""
+msgstr "Pergi ke Langkah Seterusnya"
#: editor/animation_track_editor.cpp
msgid "Go to Previous Step"
-msgstr ""
+msgstr "Pergi ke Langkah Sebelumnya"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr ""
+msgstr "Optimumkan Animasi"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr ""
+msgstr "Bersihkan Animasi"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Pilih nod yang akan dianimasikan:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Guna Lengkung Bezier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr ""
+msgstr "Pengoptimum Anim."
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr ""
+msgstr "Max. Ralat Linear:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr ""
+msgstr "Max. Ralat Sudut:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
-msgstr ""
+msgstr "Sudut Maksimum yang Boleh Dioptimumkan:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
-msgstr ""
+msgstr "Mengoptimumkan"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr ""
+msgstr "Keluarkan kunci yang tidak sah"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr ""
+msgstr "Keluarkan trek yang tidak boleh diselesaikan dan kosong"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
-msgstr ""
+msgstr "Bersihkan semua animasi"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr ""
+msgstr "Bersihkan Animasi (TIDAK BOLEH BUAT ASAL!)"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
-msgstr ""
+msgstr "Bersihkan"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr ""
+msgstr "Nisbah Skala:"
#: editor/animation_track_editor.cpp
msgid "Select Tracks to Copy"
-msgstr ""
+msgstr "Pilih Trek untuk Disalin"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -648,142 +651,146 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr ""
+msgstr "Salin"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "Semua Pilihan"
+msgstr "Pilih Semua/Tiada"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "Anim Tambah Trek"
+msgstr "Tambah Klip Trek Audio"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "Tukar Klip Trek Audio Mula Offset"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "Tukar Klip Audio Trek Hujung Offset"
#: editor/array_property_edit.cpp
msgid "Resize Array"
-msgstr ""
+msgstr "Ubah saiz Array"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr ""
+msgstr "Tukar Jenis Nilai Array"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
-msgstr ""
+msgstr "Tukar Nilai Array"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr ""
+msgstr "Pergi ke Baris"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr ""
+msgstr "Nombor Baris:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+msgid "%d replaced."
+msgstr "%d telah diganti."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "%d padan."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d matches."
-msgstr ""
+msgstr "%d padan."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
-msgstr ""
+msgstr "Kes Padan"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr ""
+msgstr "Seluruh Perkataan"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr ""
+msgstr "Ganti"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr ""
+msgstr "Ganti Semua"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr ""
+msgstr "Pilihan Sahaja"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "Piawai"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "Togol Panel Skrip"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr ""
+msgstr "Zum Masuk"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr ""
+msgstr "Zum Keluar"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr ""
+msgstr "Set Semula Zum"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "Amaran"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "Nombor baris dan lajur."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr ""
+msgstr "Kaedah dalam nod sasaran mesti ditentukan."
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Nama kaedah mestilah pengecam yang sah."
#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
+"Kaedah sasaran tidak dijumpai. Tentukan kaedah yang sah atau lampirkan skrip "
+"ke nod sasaran."
#: editor/connections_dialog.cpp
msgid "Connect to Node:"
-msgstr ""
+msgstr "Sambung ke Nod:"
#: editor/connections_dialog.cpp
msgid "Connect to Script:"
-msgstr ""
+msgstr "Sambung ke Skrip:"
#: editor/connections_dialog.cpp
msgid "From Signal:"
-msgstr ""
+msgstr "Dari Isyarat:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "Adegan tidak mengandungi sebarang skrip."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr ""
+msgstr "Tambah"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
@@ -794,50 +801,51 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr ""
+msgstr "Keluarkan"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr ""
+msgstr "Tambah Hujah Panggilan Tambahan:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr ""
+msgstr "Hujah Panggilan Tambahan:"
#: editor/connections_dialog.cpp
msgid "Receiver Method:"
-msgstr ""
+msgstr "Kaedah Penerima:"
#: editor/connections_dialog.cpp
msgid "Advanced"
-msgstr ""
+msgstr "Lanjutan"
#: editor/connections_dialog.cpp
msgid "Deferred"
-msgstr ""
+msgstr "Ditangguhkan"
#: editor/connections_dialog.cpp
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
msgstr ""
+"Mencegah isyarat, menyimpannya dalam barisan dan hanya menyalakannya pada "
+"waktu terbiar."
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr ""
+msgstr "Oneshot"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "Putuskan isyarat selepas pelepasan pertama."
#: editor/connections_dialog.cpp
msgid "Cannot connect signal"
-msgstr ""
+msgstr "Tidak dapat menyambungkan isyarat"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -846,101 +854,109 @@ msgstr ""
#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Close"
-msgstr ""
+msgstr "Tutup"
#: editor/connections_dialog.cpp
msgid "Connect"
-msgstr ""
+msgstr "Sambung"
#: editor/connections_dialog.cpp
msgid "Signal:"
-msgstr ""
+msgstr "Isyarat:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr ""
+msgstr "Sambungkan '% s' ke '% s'"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr ""
+msgstr "Putuskan sambungan '% s' dari '% s'"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr ""
+msgstr "Putuskan semua sambungan dari isyarat: '% s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
-msgstr ""
+msgstr "Sambung ..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr ""
+msgstr "Putuskan sambungan"
#: editor/connections_dialog.cpp
msgid "Connect a Signal to a Method"
-msgstr ""
+msgstr "Sambungkan Isyarat ke Kaedah"
#: editor/connections_dialog.cpp
msgid "Edit Connection:"
-msgstr ""
+msgstr "Edit Sambungan:"
#: editor/connections_dialog.cpp
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 \"% s"
+"\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr ""
+msgstr "Isyarat"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Dari Isyarat:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
+"Adakah anda pasti anda mahu mengeluarkan semua sambungan dari isyarat ini?"
#: editor/connections_dialog.cpp
msgid "Disconnect All"
-msgstr ""
+msgstr "Putuskan Semua"
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr ""
+msgstr "Edit..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
-msgstr ""
+msgstr "Pergi ke Kaedah"
#: editor/create_dialog.cpp
msgid "Change %s Type"
-msgstr ""
+msgstr "Ubah Jenis %s"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
msgid "Change"
-msgstr ""
+msgstr "Ubah"
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr ""
+msgstr "Cipta %s Baru"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
msgid "Favorites:"
-msgstr ""
+msgstr "Kegemaran:"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
msgid "Recent:"
-msgstr ""
+msgstr "Terkini:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
-msgstr ""
+msgstr "Cari:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr ""
+msgstr "Padanan:"
#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
@@ -948,57 +964,61 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
-msgstr ""
+msgstr "Keterangan:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
-msgstr ""
+msgstr "Cari Penggantian Untuk:"
#: editor/dependency_editor.cpp
msgid "Dependencies For:"
-msgstr ""
+msgstr "Kebergantungan Untuk:"
#: editor/dependency_editor.cpp
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
+"Adegan '% s' kini sedang diedit.\n"
+"Perubahan hanya akan berlaku apabila dimuat semula."
#: editor/dependency_editor.cpp
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
+"Sumber '% s' sedang digunakan.\n"
+"Perubahan hanya akan berlaku apabila dimuat semula."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dependencies"
-msgstr ""
+msgstr "Kebergantungan"
#: editor/dependency_editor.cpp
msgid "Resource"
-msgstr ""
+msgstr "Sumber"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
#: editor/project_manager.cpp editor/project_settings_editor.cpp
msgid "Path"
-msgstr ""
+msgstr "Laluan"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
-msgstr ""
+msgstr "Kebergantungan:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
-msgstr ""
+msgstr "Perbaiki Pecah"
#: editor/dependency_editor.cpp
msgid "Dependency Editor"
-msgstr ""
+msgstr "Editor Ketergantungan"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
-msgstr ""
+msgstr "Cari Penggantian Sumber:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
#: editor/editor_help_search.cpp editor/editor_node.cpp
@@ -1008,15 +1028,15 @@ msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
-msgstr ""
+msgstr "Buka"
#: editor/dependency_editor.cpp
msgid "Owners Of:"
-msgstr ""
+msgstr "Pemilik:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr ""
+msgstr "Alih keluar fail terpilih dari projek? (Tidak dapat dipulihkan)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1024,46 +1044,49 @@ msgid ""
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
+"Fail yang akan dikeluarkan diperlukan oleh sumber lain agar dapat "
+"berfungsi.\n"
+"Masih mahu keluarkan fail tersebut? (tidak boleh buat asal)"
#: editor/dependency_editor.cpp
msgid "Cannot remove:"
-msgstr ""
+msgstr "Tidak boleh dialih keluar:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
-msgstr ""
+msgstr "Ralat memuatkan:"
#: editor/dependency_editor.cpp
msgid "Load failed due to missing dependencies:"
-msgstr ""
+msgstr "Gagal memuat kerana kebergantungan hilang:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
-msgstr ""
+msgstr "Buka Bagaimanapun"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
-msgstr ""
+msgstr "Tindakan apa yang harus diambil?"
#: editor/dependency_editor.cpp
msgid "Fix Dependencies"
-msgstr ""
+msgstr "Perbaiki Kebergantungan"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
-msgstr ""
+msgstr "Ralat memuatkan!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr ""
+msgstr "Padamkan objek %d secara kekal? (Tidak boleh dibuat asal!)"
#: editor/dependency_editor.cpp
msgid "Show Dependencies"
-msgstr ""
+msgstr "Tunjuk Kebergantungan"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
-msgstr ""
+msgstr "Penjelajah Sumber Yatim"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -1071,79 +1094,92 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr ""
+msgstr "Padam"
#: editor/dependency_editor.cpp
msgid "Owns"
-msgstr ""
+msgstr "Memiliki"
#: editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
-msgstr ""
+msgstr "Sumber Tanpa Hak Milik Eksplisit:"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Key"
-msgstr ""
+msgstr "Tukar Kunci Kamus"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Value"
-msgstr ""
+msgstr "Tukar Nilai Kamus"
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
-msgstr ""
+msgstr "Terima kasih dari komuniti Godot!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
-msgstr ""
+msgstr "Penyumbang Enjin Godot"
#: editor/editor_about.cpp
msgid "Project Founders"
-msgstr ""
+msgstr "Pengasas Projek"
#: editor/editor_about.cpp
msgid "Lead Developer"
-msgstr ""
+msgstr "Pemaju Utama"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr ""
+msgstr "Pengurus Projek "
#: editor/editor_about.cpp
msgid "Developers"
-msgstr ""
+msgstr "Pemaju"
#: editor/editor_about.cpp
msgid "Authors"
-msgstr ""
+msgstr "Pengarang"
#: editor/editor_about.cpp
msgid "Platinum Sponsors"
-msgstr ""
+msgstr "Penaja Platinum"
#: editor/editor_about.cpp
msgid "Gold Sponsors"
-msgstr ""
+msgstr "Penaja Emas"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Penderma Perak"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Penderma Gangsa"
#: editor/editor_about.cpp
msgid "Mini Sponsors"
-msgstr ""
+msgstr "Penaja Mini"
#: editor/editor_about.cpp
msgid "Gold Donors"
-msgstr ""
+msgstr "Penderma Emas"
#: editor/editor_about.cpp
msgid "Silver Donors"
-msgstr ""
+msgstr "Penderma Perak"
#: editor/editor_about.cpp
msgid "Bronze Donors"
-msgstr ""
+msgstr "Penderma Gangsa"
#: editor/editor_about.cpp
msgid "Donors"
-msgstr ""
+msgstr "Penderma"
#: editor/editor_about.cpp
msgid "License"
@@ -1151,7 +1187,7 @@ msgstr "Lesen"
#: editor/editor_about.cpp
msgid "Third-party Licenses"
-msgstr ""
+msgstr "Lesen Pihak Ketiga"
#: editor/editor_about.cpp
msgid ""
@@ -1160,393 +1196,398 @@ msgid ""
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
+"Enjin Godot bergantung kepada beberapa perpustakaan sumber terbuka dan bebas "
+"pihak ketiga, semuanya serasi dengan syarat-syarat lesen MITnya. Berikut "
+"adalah senarai lengkap semua komponen pihak ketiga tersebut dengan "
+"pernyataan hak cipta dan syarat lesen masing-masing."
#: editor/editor_about.cpp
msgid "All Components"
-msgstr ""
+msgstr "Semua Komponen"
#: editor/editor_about.cpp
msgid "Components"
-msgstr ""
+msgstr "Komponen"
#: editor/editor_about.cpp
msgid "Licenses"
-msgstr ""
+msgstr "Lesen"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Error opening package file, not in ZIP format."
-msgstr ""
+msgstr "Ralat semasa membuka fail pakej, bukan dalam format ZIP."
#: editor/editor_asset_installer.cpp
msgid "%s (Already Exists)"
-msgstr ""
+msgstr "%s (Sudah Wujud)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr ""
+msgstr "Nyahmampatkan Aset"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "Fail berikut gagal diekstrak dari pakej:"
#: editor/editor_asset_installer.cpp
msgid "And %s more files."
-msgstr ""
+msgstr "Dan sebanyak %s fail."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
-msgstr ""
+msgstr "Pakej berjaya dipasang!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Success!"
-msgstr ""
+msgstr "Berjaya!"
#: editor/editor_asset_installer.cpp
msgid "Package Contents:"
-msgstr ""
+msgstr "Kandungan Pakej:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
-msgstr ""
+msgstr "Pasang"
#: editor/editor_asset_installer.cpp
msgid "Package Installer"
-msgstr ""
+msgstr "Pemasang Pakej"
#: editor/editor_audio_buses.cpp
msgid "Speakers"
-msgstr ""
+msgstr "Pembesar suara"
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
-msgstr ""
+msgstr "Tambah Kesan"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
-msgstr ""
+msgstr "Namakan Semula Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Change Audio Bus Volume"
-msgstr ""
+msgstr "Tukar Kelantangan Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
-msgstr ""
+msgstr "Togol Bas Audio Solo"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr ""
+msgstr "Togol Senyap Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr ""
+msgstr "Togol Kesan Pintasan Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr ""
+msgstr "Pilih Hantar Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr ""
+msgstr "Tambah Kesan Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr ""
+msgstr "Alih Kesan Bas"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr ""
+msgstr "Padam Kesan Bas"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
-msgstr ""
+msgstr "Seret & lepas untuk menyusun semula."
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr ""
+msgstr "Solo"
#: editor/editor_audio_buses.cpp
msgid "Mute"
-msgstr ""
+msgstr "Bisu"
#: editor/editor_audio_buses.cpp
msgid "Bypass"
-msgstr ""
+msgstr "Pintas"
#: editor/editor_audio_buses.cpp
msgid "Bus options"
-msgstr ""
+msgstr "Pilihan bas"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr ""
+msgstr "Pendua"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
-msgstr ""
+msgstr "Tetapkan Semula Kelantangan"
#: editor/editor_audio_buses.cpp
msgid "Delete Effect"
-msgstr ""
+msgstr "Padam Kesan"
#: editor/editor_audio_buses.cpp
msgid "Audio"
-msgstr ""
+msgstr "Audio"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
-msgstr ""
+msgstr "Tambah Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr ""
+msgstr "Bas induk tidak boleh dipadamkan!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr ""
+msgstr "Padam Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
-msgstr ""
+msgstr "Pendua Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Reset Bus Volume"
-msgstr ""
+msgstr "Tetapkan Semula Kelantangan Bas"
#: editor/editor_audio_buses.cpp
msgid "Move Audio Bus"
-msgstr ""
+msgstr "Pindah Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
-msgstr ""
+msgstr "Simpan Susun Atur Bas Audio Sebagai..."
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
-msgstr ""
+msgstr "Lokasi untuk Susun Atur Baru..."
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
-msgstr ""
+msgstr "Buka Susun Atur Bas Audio"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "Tiada fail '%s'."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
-msgstr ""
+msgstr "Susun atur"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr ""
+msgstr "Fail tidak sah, bukan susun atur bas audio."
#: editor/editor_audio_buses.cpp
msgid "Error saving file: %s"
-msgstr ""
+msgstr "Ralat semasa menyimpan fail: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr ""
+msgstr "Tambah Bas"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
-msgstr ""
+msgstr "Tambah Bas Audio baru ke susun atur ini."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Load"
-msgstr ""
+msgstr "Memuatkan"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr ""
+msgstr "Muatkan Susun Atur Bas yang sedia ada."
#: editor/editor_audio_buses.cpp
msgid "Save As"
-msgstr ""
+msgstr "Simpan sebagai"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr ""
+msgstr "Simpan Susun Atur Bas ini ke fail."
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
-msgstr ""
+msgstr "Muatkan Lalai"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr ""
+msgstr "Muatkan Susun Atur Bas lalai."
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr ""
+msgstr "Cipta Susun Atur Bas baru."
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
-msgstr ""
+msgstr "Nama tidak sah."
#: editor/editor_autoload_settings.cpp
msgid "Valid characters:"
-msgstr ""
+msgstr "Watak yang sah:"
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing engine class name."
-msgstr ""
+msgstr "Tidak boleh bertembung dengan nama kelas engin yang telah wujud."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing built-in type name."
msgstr ""
+"Tidak boleh bertembung dengan nama jenis terbina dalam yang telah wujud."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing global constant name."
-msgstr ""
+msgstr "Tidak boleh bertembung dengan nama pemalar global yang telah wujud."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "Kata kunci tidak boleh digunakan sebagai nama autoload."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
-msgstr ""
+msgstr "Autoload '%s' sudah wujud!"
#: editor/editor_autoload_settings.cpp
msgid "Rename Autoload"
-msgstr ""
+msgstr "Namakan Semula Autoload"
#: editor/editor_autoload_settings.cpp
msgid "Toggle AutoLoad Globals"
-msgstr ""
+msgstr "Togol Global Autoload"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
-msgstr ""
+msgstr "Pindah Autoload"
#: editor/editor_autoload_settings.cpp
msgid "Remove Autoload"
-msgstr ""
+msgstr "Keluarkan Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
-msgstr ""
+msgstr "Aktifkan"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
+msgstr "Susun Semula Autoload"
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr ""
+msgid "Can't add autoload:"
+msgstr "Tidak boleh menambahkan autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
-msgstr ""
+msgstr "Tambah AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp
msgid "Path:"
-msgstr ""
+msgstr "Laluan:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr ""
+msgstr "Nama Nod:"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
#: editor/settings_config_dialog.cpp
msgid "Name"
-msgstr ""
+msgstr "Nama"
#: editor/editor_autoload_settings.cpp
msgid "Singleton"
-msgstr ""
+msgstr "Singleton"
+
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Tampal Param"
#: editor/editor_data.cpp
msgid "Updating Scene"
-msgstr ""
+msgstr "Mengemaskini Adegan"
#: editor/editor_data.cpp
msgid "Storing local changes..."
-msgstr ""
+msgstr "Menyimpan perubahan tempatan..."
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr ""
+msgstr "Mengemaskini adegan..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr ""
+msgstr "[kosong]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr ""
+msgstr "[tidak disimpan]"
#: editor/editor_dir_dialog.cpp
msgid "Please select a base directory first."
-msgstr ""
+msgstr "Sila pilih direktori asas terlebih dahulu."
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
-msgstr ""
+msgstr "Pilih Direktori"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
#: scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr ""
+msgstr "Cipta Folder"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp
msgid "Name:"
-msgstr ""
+msgstr "Nama:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr ""
+msgstr "Tidak dapat mencipta folder."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr ""
+msgstr "Pilih"
#: editor/editor_export.cpp
msgid "Storing File:"
-msgstr ""
+msgstr "Menyimpan Fail:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "Tiada templat eksport ditemui di laluan yang dijangkakan:"
#: editor/editor_export.cpp
msgid "Packing"
-msgstr ""
+msgstr "Pembungkusan"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"Platform sasaran memerlukan pemampatan tekstur 'ETC' untuk GLES2. Aktifkan "
+"'Import Etc' dalam Tetapan Projek."
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"Platform sasaran memerlukan pemampatan tekstur 'ETC2' untuk GLES3. Aktifkan "
+"'Import Etc 2' dalam Tetapan Projek."
#: editor/editor_export.cpp
msgid ""
@@ -1555,508 +1596,520 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"Platform sasaran memerlukan pemampatan tekstur 'ETC' untuk sandaran pemandu "
+"ke GLES2.\n"
+"Aktifkan 'Import Etc' dalam Tetapan Projek, atau nyahaktifkan 'Driver "
+"Fallback Enabled'."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom debug template not found."
-msgstr ""
+msgstr "Templat nyahpepijat tersuai tidak dijumpai."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr ""
+msgstr "Templat pelepasan tersuai tidak dijumpai."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
-msgstr ""
+msgstr "Fail templat tidak dijumpai:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
+"Pada eksport 32-bit PCK terbenam tidak boleh lebih besar daripada 4 GiB."
#: editor/editor_feature_profile.cpp
msgid "3D Editor"
-msgstr ""
+msgstr "Editor 3D"
#: editor/editor_feature_profile.cpp
msgid "Script Editor"
-msgstr ""
+msgstr "Editor Skrip"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr ""
+msgstr "Perpustakaan Aset"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr ""
+msgstr "Penyuntingan Pokok Adegan"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr ""
+msgid "Node Dock"
+msgstr "Dok nod"
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
-msgstr ""
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Sistem Fail dan Dok Import"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr ""
+msgid "Import Dock"
+msgstr "Import Dok"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr ""
+msgstr "Padamkan profil '%s'? (tidak boleh buat asal)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
+msgstr "Profil mestilah nama fail yang sah dan tidak boleh mengandungi '.'"
#: editor/editor_feature_profile.cpp
msgid "Profile with this name already exists."
-msgstr ""
+msgstr "Profil dengan nama ini sudah wujud."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(Editor Dinyahaktifkan, Ciri-ciri Dinyahaktifkan)"
#: editor/editor_feature_profile.cpp
msgid "(Properties Disabled)"
-msgstr ""
+msgstr "(Ciri-ciri dinyahaktif)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "Tidak Aktif"
+msgstr "(Editor Dinyahaktif)"
#: editor/editor_feature_profile.cpp
msgid "Class Options:"
-msgstr ""
+msgstr "Pilihan Kelas:"
#: editor/editor_feature_profile.cpp
msgid "Enable Contextual Editor"
-msgstr ""
+msgstr "Aktifkan Editor Kontekstual"
#: editor/editor_feature_profile.cpp
msgid "Enabled Properties:"
-msgstr ""
+msgstr "Ciri-ciri Diaktifkan:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
-msgstr ""
+msgstr "Ciri Diaktifkan:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Classes:"
-msgstr ""
+msgstr "Kelas Diaktifkan:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "Format fail '%s' tidak sah, import dibatalkan."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
msgstr ""
+"Profil '%s' sudah wujud. Keluarkannya terlebih dahulu sebelum mengimport, "
+"import dibatalkan."
#: editor/editor_feature_profile.cpp
msgid "Error saving profile to path: '%s'."
-msgstr ""
+msgstr "Ralat menyimpan profil ke laluan: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "Nyahtetap"
#: editor/editor_feature_profile.cpp
msgid "Current Profile:"
-msgstr ""
+msgstr "Profil Semasa:"
#: editor/editor_feature_profile.cpp
msgid "Make Current"
-msgstr ""
+msgstr "Buat Semasa"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "New"
-msgstr ""
+msgstr "Baru"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr ""
+msgstr "Import"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
-msgstr ""
+msgstr "Eksport"
#: editor/editor_feature_profile.cpp
msgid "Available Profiles:"
-msgstr ""
+msgstr "Profil yang ada:"
#: editor/editor_feature_profile.cpp
msgid "Class Options"
-msgstr ""
+msgstr "Pilihan Kelas"
#: editor/editor_feature_profile.cpp
msgid "New profile name:"
-msgstr ""
+msgstr "Nama profil baru:"
#: editor/editor_feature_profile.cpp
msgid "Erase Profile"
-msgstr ""
+msgstr "Padam Profil"
#: editor/editor_feature_profile.cpp
msgid "Godot Feature Profile"
-msgstr ""
+msgstr "Profil Ciri Godot"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
-msgstr ""
+msgstr "Import Profil"
#: editor/editor_feature_profile.cpp
msgid "Export Profile"
-msgstr ""
+msgstr "Eksport Profil"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
-msgstr ""
+msgstr "Urus Profil Ciri Editor"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
-msgstr ""
+msgstr "Pilih Folder Semasa"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr ""
+msgstr "Fail Wujud, Tulis Ganti?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select This Folder"
-msgstr ""
+msgstr "Pilih Folder Ini"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr ""
+msgstr "Salin Laluan"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Open in File Manager"
-msgstr ""
+msgstr "Buka dalam Pengurus Fail"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
msgid "Show in File Manager"
-msgstr ""
+msgstr "Tunjukkan dalam Pengurus Fail"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
-msgstr ""
+msgstr "Folder Baru..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
-msgstr ""
+msgstr "Muat Semula"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
-msgstr ""
+msgstr "Semua Dikenali"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr ""
+msgstr "Semua Fail (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
-msgstr ""
+msgstr "Buka Fail"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr ""
+msgstr "Buka Fail"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
-msgstr ""
+msgstr "Buka Direktori"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File or Directory"
-msgstr ""
+msgstr "Buka Fail atau Direktori"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/editor_properties.cpp editor/inspector_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
-msgstr ""
+msgstr "Simpan"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Save a File"
-msgstr ""
+msgstr "Simpan Fail"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr ""
+msgstr "Pergi Balik"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr ""
+msgstr "Pergi ke Hadapan"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "Pergi Atas"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr ""
+msgstr "Togol Fail Tersembunyi"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr ""
+msgstr "Togol Kegemaran"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr ""
+msgstr "Togol Mod"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr ""
+msgstr "Laluan Fokus"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr ""
+msgstr "Pindah Kegemaran ke Atas"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr ""
+msgstr "Pindah Kegemaran ke Bawah"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
-msgstr ""
+msgstr "Pergi ke folder sebelumnya."
#: editor/editor_file_dialog.cpp
msgid "Go to next folder."
-msgstr ""
+msgstr "Pergi ke folder seterusnya."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Go to parent folder."
-msgstr ""
+msgstr "Pergi ke folder induk."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Refresh files."
-msgstr ""
+msgstr "Muat semula fail."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr ""
+msgstr "(Nyah)kegemaran folder semasa."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "Togol keterlihatan fail tersembunyi."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
-msgstr ""
+msgstr "Lihat barang sebagai grid gambar kecil."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr ""
+msgstr "Lihat barang sebagai senarai."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
-msgstr ""
+msgstr "Direktori & Fail:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
-msgstr ""
+msgstr "Pratonton:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
-msgstr ""
+msgstr "Fail:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr ""
+msgstr "Mesti menggunakan sambungan yang sah."
#: editor/editor_file_system.cpp
msgid "ScanSources"
-msgstr ""
+msgstr "Sumber Imbas"
#: editor/editor_file_system.cpp
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
msgstr ""
+"Terdapat beberapa pengimport untuk pelbagai jenis yang menunjukkan ke fail "
+"%s, import dibatalkan"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr ""
+msgstr "Mengimport (Semula) Aset"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr ""
+msgstr "Atas"
#: editor/editor_help.cpp
msgid "Class:"
-msgstr ""
+msgstr "Kelas:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Inherits:"
-msgstr ""
+msgstr "Mewarisi:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr ""
+msgstr "Diwarisi oleh:"
#: editor/editor_help.cpp
msgid "Description"
-msgstr ""
+msgstr "Keterangan"
#: editor/editor_help.cpp
msgid "Online Tutorials"
-msgstr ""
+msgstr "Tutorial Dalam Talian"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "Sifat"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "ganti:"
#: editor/editor_help.cpp
msgid "default:"
-msgstr ""
+msgstr "lalai:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr ""
+msgstr "Kaedah"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr ""
+msgstr "Sifat Tema"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr ""
+msgstr "Penghitungan"
#: editor/editor_help.cpp
msgid "Constants"
-msgstr ""
+msgstr "Pemalar"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr ""
+msgstr "Penerangan Sifat"
#: editor/editor_help.cpp
msgid "(value)"
-msgstr ""
+msgstr "(nilai)"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"Tiada keterangan untuk sifat ini. Tolong bantu kami dengan [color=$color]"
+"[url=$url]menyumbang satu[/url][/color]!"
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr ""
+msgstr "Penerangan Kaedah"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"Tiada keterangan untuk kaedah ini. Tolong bantu kami dengan [color=$color]"
+"[url=$url]menyumbang satu[/url][/color]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr ""
+msgstr "Cari Bantuan"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
-msgstr ""
+msgstr "Kesensitifan Huruf"
#: editor/editor_help_search.cpp
msgid "Show Hierarchy"
-msgstr ""
+msgstr "Tunjuk Hierarki"
#: editor/editor_help_search.cpp
msgid "Display All"
-msgstr ""
+msgstr "Paparkan Semua"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr ""
+msgstr "Kelas Sahaja"
#: editor/editor_help_search.cpp
msgid "Methods Only"
-msgstr ""
+msgstr "Kaedah Sahaja"
#: editor/editor_help_search.cpp
msgid "Signals Only"
-msgstr ""
+msgstr "Isyarat Sahaja"
#: editor/editor_help_search.cpp
msgid "Constants Only"
-msgstr ""
+msgstr "Pemalar Sahaja"
#: editor/editor_help_search.cpp
msgid "Properties Only"
-msgstr ""
+msgstr "Sifat Sahaja"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr ""
+msgstr "Sifat Tema Sahaja"
#: editor/editor_help_search.cpp
msgid "Member Type"
-msgstr ""
+msgstr "Jenis Ahli"
#: editor/editor_help_search.cpp
msgid "Class"
-msgstr ""
+msgstr "Kelas"
#: editor/editor_help_search.cpp
msgid "Method"
-msgstr ""
+msgstr "Kaedah"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
msgid "Signal"
-msgstr ""
+msgstr "Isyarat"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr ""
+msgstr "Pemalar"
#: editor/editor_help_search.cpp
msgid "Property"
-msgstr ""
+msgstr "Sifat"
#: editor/editor_help_search.cpp
msgid "Theme Property"
-msgstr ""
+msgstr "Sifat Tema"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr ""
+msgstr "Sifat:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "Tetapkan"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Tetapkan Pelbagai:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr ""
+msgstr "Keluaran:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Semua Pilihan"
+msgstr "Salin Pilihan"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2066,176 +2119,184 @@ msgstr "Semua Pilihan"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr ""
+msgstr "Kosongkan"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr ""
+msgstr "Kosongkan Keluaran"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr ""
+msgstr "Hentikan"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
msgid "Start"
-msgstr ""
+msgstr "Mulakan"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
msgid "Down"
-msgstr ""
+msgstr "Bawah"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "Atas"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
-msgstr ""
+msgstr "Nod"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "RPC masuk"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "RSET masuk"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "RPC Keluar"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "RSET Keluar"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "Tetingkap Baru"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "Sumber yang diimport tidak dapat disimpan."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr ""
+msgstr "OK"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr ""
+msgstr "Ralat semasa menyimpan sumber!"
#: editor/editor_node.cpp
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"Sumber ini tidak dapat disimpan kerana tidak tergolong dalam adegan yang "
+"diedit. Jadikannya unik terlebih dahulu."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr ""
+msgstr "Simpan Sumber Sebagai..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr ""
+msgstr "Tidak dapat membuka fail untuk ditulis:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr ""
+msgstr "Format fail yang diminta tidak diketahui:"
#: editor/editor_node.cpp
msgid "Error while saving."
-msgstr ""
+msgstr "Ralat semasa menyimpan."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"Tidak dapat membuka '% s'. Fail mungkin telah dipindahkan atau dipadam."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
-msgstr ""
+msgstr "Ralat semasa menghuraikan '%s'."
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr ""
+msgstr "Penghujung fail '%s' tidak dijangka."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
-msgstr ""
+msgstr "Hilang '%s' atau kebergantungannya."
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
-msgstr ""
+msgstr "Ralat semasa memuatkan '%s'."
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr ""
+msgstr "Menyimpan Adegan"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr ""
+msgstr "Menganalisis"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
-msgstr ""
+msgstr "Mencipta Gambar Kecil"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
-msgstr ""
+msgstr "Operasi ini tidak boleh dilakukan tanpa akar pokok."
#: editor/editor_node.cpp
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"Adegan ini tidak dapat disimpan kerana terdapat penyertaan yang berbentuk "
+"siklik.\n"
+"Sila selesaikan dan kemudian cuba simpan semula."
#: editor/editor_node.cpp
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+"Tidak dapat menyimpan adegan. Kemungkinan kebergantungan (instance atau "
+"warisan) tidak dapat dipenuhi."
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Tidak boleh tulis ganti adegan yang masih terbuka!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr ""
+msgstr "Tidak dapat memuatkan MeshLibrary untuk penggabungan!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr ""
+msgstr "Ralat menyimpan MeshLibrary!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr ""
+msgstr "Tidak boleh memuatkan TileSet untuk penggabungan!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr ""
+msgstr "Ralat semasa menyimpan TileSet!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
-msgstr ""
+msgstr "Ralat semasa menyimpan susun atur!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
-msgstr ""
+msgstr "Susun atur lalai telah diganti."
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr ""
+msgstr "Nama susun atur tidak dijumpai!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
-msgstr ""
+msgstr "Tata letak lalai telah dipulihkan ke tetapan asas."
#: editor/editor_node.cpp
msgid ""
@@ -2243,18 +2304,26 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"Sumber ini tergolong dalam adegan yang diimport, maka ia tidak dapat "
+"diedit.\n"
+"Sila baca dokumentasi yang berkaitan dengan pengimportan adegan untuk lebih "
+"memahami aliran kerja ini."
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
+"Sumber ini tergolong dalam adegan yang di-instance atau diwarisi.\n"
+"Perubahan tidak akan disimpan semasa menyimpan adegan semasa."
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
+"Sumber ini telah diimport, maka ia tidak dapat diedit. Ubah tetapannya di "
+"panel import dan kemudian import semula."
#: editor/editor_node.cpp
msgid ""
@@ -2263,6 +2332,10 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"Adegan ini telah diimport, maka perubahan kepada ia tidak akan disimpan.\n"
+"Instance-kan ia atau mewarisi akan membenarkan perubahan dibuat padanya.\n"
+"Sila baca dokumentasi yang berkaitan dengan pengimportan adegan untuk lebih "
+"memahami aliran kerja ini."
#: editor/editor_node.cpp
msgid ""
@@ -2270,152 +2343,158 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
+"Ini adalah objek terpencil, maka perubahan padanya tidak akan disimpan.\n"
+"Sila baca dokumentasi yang berkaitan dengan penyahpepijatan untuk lebih "
+"memahami aliran kerja ini."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
+msgstr "Tiada adegan yang didefinisikan untuk dijalankan."
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
-msgstr ""
+msgstr "Tidak dapat memulakan subproses!"
#: editor/editor_node.cpp editor/filesystem_dock.cpp
msgid "Open Scene"
-msgstr ""
+msgstr "Buka Adegan"
#: editor/editor_node.cpp
msgid "Open Base Scene"
-msgstr ""
+msgstr "Buka Adegan Asas"
#: editor/editor_node.cpp
msgid "Quick Open..."
-msgstr ""
+msgstr "Buka Cepat..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr ""
+msgstr "Buka Cepat Adegan..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr ""
+msgstr "Buka Cepat Skrip..."
#: editor/editor_node.cpp
msgid "Save & Close"
-msgstr ""
+msgstr "Simpan & Tutup"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
-msgstr ""
+msgstr "Simpan perubahan pada '%s' sebelum menutup?"
#: editor/editor_node.cpp
msgid "Saved %s modified resource(s)."
-msgstr ""
+msgstr "Sumber %s yang diubahsuai telah disimpan."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr ""
+msgstr "Nod akar diperlukan untuk menyimpan adegan."
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr ""
+msgstr "Simpan Adegan Sebagai..."
#: editor/editor_node.cpp
msgid "No"
-msgstr ""
+msgstr "Tidak"
#: editor/editor_node.cpp
msgid "Yes"
-msgstr ""
+msgstr "Ya"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr ""
+msgstr "Adegan ini tidak pernah disimpan. Simpan sebelum menjalankan?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr ""
+msgstr "Operasi ini tidak boleh dilakukan tanpa adegan."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr ""
+msgstr "Eksport Perpustakaan Mesh"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr ""
+msgstr "Operasi ini tidak boleh dilakukan tanpa nod akar."
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr ""
+msgstr "Eksport Tile Set"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
-msgstr ""
+msgstr "Operasi ini tidak dapat dilakukan tanpa nod terpilih."
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr ""
+msgstr "Adegan semasa tidak disimpan. Masih buka?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr ""
+msgstr "Tidak dapat memuatkan semula adegan yang tidak pernah disimpan."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+msgid "Reload Saved Scene"
+msgstr "Muatkan semula Adegan yang Disimpan"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
+"Adegan semasa mempunyai perubahan yang belum disimpan.\n"
+"Masih muat semula adegan yang telah disimpan? Tindakan ini tidak boleh "
+"dibuat asal."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr ""
+msgstr "Jalan Cepat Adegan..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr ""
+msgstr "Keluar"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr ""
+msgstr "Keluar dari editor?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr ""
+msgstr "Buka Pengurus Projek?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr ""
+msgstr "Simpan & Keluar"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr ""
+msgstr "Simpan perubahan pada adegan berikut sebelum keluar?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr ""
+msgstr "Simpan perubahan adegan berikut sebelum membuka Pengurus Projek?"
#: editor/editor_node.cpp
msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
+"Pilihan ini tidak digunakan lagi. Situasi di mana penyegaran mesti dipaksa "
+"sekarang dianggap sebagai pepijat. Sila laporkan."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
-msgstr ""
+msgstr "Pilih Adegan Utama"
#: editor/editor_node.cpp
msgid "Close Scene"
-msgstr ""
+msgstr "Tutup Adegan"
#: editor/editor_node.cpp
msgid "Reopen Closed Scene"
-msgstr ""
+msgstr "Buka Semula Adegan Tertutup"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2635,10 +2714,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2698,22 +2773,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2722,8 +2801,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2732,32 +2811,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2765,9 +2844,8 @@ msgid "Editor"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "Set Peralihan ke:"
+msgstr "Tetapan Editor..."
#: editor/editor_node.cpp
msgid "Editor Layout"
@@ -2818,7 +2896,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2832,7 +2910,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3214,7 +3296,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3241,6 +3324,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3826,19 +3913,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3854,7 +3945,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3888,10 +3979,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4063,9 +4150,8 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "Set Peralihan ke:"
+msgstr "Tambah Titik Animasi"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Remove BlendSpace1D Point"
@@ -4208,9 +4294,8 @@ msgid "Nodes Disconnected"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "Set Peralihan ke:"
+msgstr "Tetapkan Animasi"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4390,9 +4475,8 @@ msgid "Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Set Peralihan ke:"
+msgstr "Sunting Peralihan..."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Open in Inspector"
@@ -4490,14 +4574,12 @@ msgid "Move Node"
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Set Peralihan ke:"
+msgstr "Peralihan wujud!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "Set Peralihan ke:"
+msgstr "Tambah Peralihan"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -4537,9 +4619,8 @@ msgid "Node Removed"
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "Set Peralihan ke:"
+msgstr "Peralihan Dikeluarkan"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
@@ -4573,9 +4654,8 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Set Peralihan ke:"
+msgstr "Peralihan: "
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Play Mode:"
@@ -4947,7 +5027,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5620,9 +5700,8 @@ msgid "Load Curve Preset"
msgstr ""
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
-msgstr "Set Peralihan ke:"
+msgstr "Tambah Titik"
#: editor/plugins/curve_editor_plugin.cpp
#, fuzzy
@@ -5686,11 +5765,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5702,11 +5781,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5758,11 +5853,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5770,6 +5894,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6606,14 +6738,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6675,11 +6799,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7044,6 +7168,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7132,17 +7260,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7481,7 +7618,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8006,9 +8143,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "Semua Pilihan"
+msgstr "Padam Rect yang dipilih."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8017,9 +8153,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
-msgstr "Semua Pilihan"
+msgstr "Padam poligon."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8144,7 +8279,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8418,9 +8553,8 @@ msgid "Color constant."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "Anim Ubah Penukaran"
+msgstr "Warna seragam."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
@@ -8763,9 +8897,8 @@ msgid "Scalar constant."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "Anim Ubah Penukaran"
+msgstr "Seragam skalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
@@ -9237,11 +9370,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9249,11 +9387,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9468,6 +9606,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9514,6 +9653,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9892,11 +10038,20 @@ msgid "Batch Rename"
msgstr "Ubah Nama Trek Anim"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Ganti"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9934,11 +10089,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9964,10 +10119,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9976,11 +10127,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9999,6 +10150,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10062,7 +10221,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10098,9 +10257,12 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Padamkan nod %d dan mana-mana kanak-kanak?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Semua Pilihan"
+msgstr "Padam nod %d?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10111,9 +10273,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Semua Pilihan"
+msgstr "Padam nod \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10223,6 +10384,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10269,11 +10437,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10393,6 +10561,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10433,6 +10605,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10441,7 +10617,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10465,6 +10641,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10533,6 +10715,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10581,7 +10767,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11063,9 +11249,8 @@ msgid "Set Variable Type"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "Set Peralihan ke:"
+msgstr "Tambah Port Input"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Output Port"
@@ -11310,9 +11495,8 @@ msgid "Add Nodes..."
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Semua Pilihan"
+msgstr "Tambah fungsi..."
#: modules/visual_script/visual_script_editor.cpp
msgid "function_name"
@@ -11457,6 +11641,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11480,6 +11668,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11657,6 +11871,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11844,6 +12064,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11864,6 +12089,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12083,6 +12313,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/nb.po b/editor/translations/nb.po
index dcbe8e6950..33758ee5cd 100644
--- a/editor/translations/nb.po
+++ b/editor/translations/nb.po
@@ -2,7 +2,7 @@
# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
-# Allan Nordhøy <epost@anotheragency.no>, 2017-2018, 2019.
+# Allan Nordhøy <epost@anotheragency.no>, 2017-2018, 2019, 2020.
# Anonymous <GentleSaucepan@protonmail.com>, 2017.
# Elias <eliasnykrem@gmail.com>, 2018.
# flesk <eivindkn@gmail.com>, 2017, 2019.
@@ -14,12 +14,12 @@
# Byzantin <kasper-hoel@hotmail.com>, 2018.
# Hans-Marius Øverås <hansmariusoveras@gmail.com>, 2019.
# Revolution <revosw@gmail.com>, 2019.
-# Petter Reinholdtsen <pere-weblate@hungry.com>, 2019.
+# Petter Reinholdtsen <pere-weblate@hungry.com>, 2019, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-10-29 12:49+0000\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-"
"engine/godot/nb_NO/>\n"
@@ -28,7 +28,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 3.9.1\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -37,7 +37,7 @@ msgstr "Ugyldig argumenttype til convert(), bruk TYPE_*-konstantene."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Forventet en streng med lenge 1 (et tegn)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -243,7 +243,7 @@ msgstr "Legg til Spor"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Animation Looping"
-msgstr "Animasjons-zoom."
+msgstr "Animasjonsløkke"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -283,14 +283,12 @@ msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Fjern valgt spor."
+msgstr "Fjern dette sporet."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "X-Fade Tid (s):"
+msgstr "Tid (s): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
@@ -309,9 +307,8 @@ msgid "Trigger"
msgstr "Avtrekker"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Framtid"
+msgstr "Fang"
#: editor/animation_track_editor.cpp
msgid "Nearest"
@@ -340,14 +337,12 @@ msgid "Insert Key"
msgstr "Sett inn Nøkkel"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Anim Dupliser Nøkler"
+msgstr "Dupliser Nøkler"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Anim Fjern Nøkler"
+msgstr "Fjern Nøkler"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -560,6 +555,7 @@ msgid "Seconds"
msgstr "Sekunder"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -727,8 +723,9 @@ msgid "Line Number:"
msgstr "Linjenummer:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Erstattet %d forekomst(er)."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Erstatt..."
#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
@@ -748,7 +745,7 @@ msgstr "Match Tilfelle"
msgid "Whole Words"
msgstr "Hele Ord"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Erstatt"
@@ -800,6 +797,11 @@ msgstr "Metode i mål-Node må spesifiseres!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Navn er ikke en gyldig identifikator:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -887,7 +889,6 @@ msgstr "Kobler Til Signal:"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -949,6 +950,11 @@ msgid "Signals"
msgstr "Signaler"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrer Filer..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
"Er du sikker på at du ønsker å fjerne alle koblinger fra dette signalet?"
@@ -990,7 +996,7 @@ msgid "Recent:"
msgstr "Nylige:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Søk:"
@@ -1178,9 +1184,12 @@ msgstr "Prosjektgrunnleggere"
msgid "Lead Developer"
msgstr "Utviklingsleder"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr "Prosjektleder "
+msgstr "Prosjektstyring "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1199,6 +1208,16 @@ msgid "Gold Sponsors"
msgstr "Gullsponsorer"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Sølvdonorer"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronsedonorer"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Minisponsorer"
@@ -1283,7 +1302,7 @@ msgstr "Vellykket Installering av Pakke!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Success!"
-msgstr "Suksess!"
+msgstr "Vellykket!"
#: editor/editor_asset_installer.cpp
#, fuzzy
@@ -1523,7 +1542,7 @@ msgstr "Flytt Autoload"
msgid "Remove Autoload"
msgstr "Fjern Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Aktiver"
@@ -1531,18 +1550,9 @@ msgstr "Aktiver"
msgid "Rearrange Autoloads"
msgstr "Omorganiser Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Ugyldig Filsti."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Fil eksisterer ikke."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Ikke i resource path."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1569,6 +1579,10 @@ msgstr "Navn"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Lim inn Parametre"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Oppdaterer Scene"
@@ -1583,7 +1597,7 @@ msgstr "Oppdaterer scene..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr "[tom]"
+msgstr "[blank]"
#: editor/editor_data.cpp
msgid "[unsaved]"
@@ -1664,16 +1678,14 @@ msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "Malfil ble ikke funnet:"
+msgstr "Tilpasset feilsøkingsmal ble ikke funnet."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom release template not found."
-msgstr "Tilpasset utgivelsesmal ikke funnet."
+msgstr "Fant ikke tilpasset utgivelsesmal."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
@@ -1694,9 +1706,8 @@ msgid "Script Editor"
msgstr "Åpne SkriptEditor"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Asset Library"
-msgstr "Åpne Assets-Bibliotek"
+msgstr "Ressursbibliotek"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
@@ -1704,21 +1715,21 @@ msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "Importer"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
msgstr "Flytt Modus"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "FilSystem"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "Importer"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "Erstatt Alle"
@@ -1885,7 +1896,7 @@ msgstr "Vis I Filutforsker"
msgid "New Folder..."
msgstr "Ny Mappe..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Oppdater"
@@ -2005,7 +2016,7 @@ msgstr "Mapper og Filer:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Forhåndsvisning:"
@@ -2019,7 +2030,7 @@ msgstr "Må ha en gyldig filutvidelse."
#: editor/editor_file_system.cpp
msgid "ScanSources"
-msgstr "SkannKilder"
+msgstr "Gjennomsøk kilder"
#: editor/editor_file_system.cpp
msgid ""
@@ -2049,9 +2060,8 @@ msgid "Inherited by:"
msgstr "Arvet av:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Beskrivelse:"
+msgstr "Beskrivelse"
#: editor/editor_help.cpp
#, fuzzy
@@ -2175,9 +2185,8 @@ msgid "Member Type"
msgstr "Medlemmer"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Klasse:"
+msgstr "Klasse"
#: editor/editor_help_search.cpp
#, fuzzy
@@ -2471,10 +2480,6 @@ msgid "There is no defined scene to run."
msgstr "Det er ingen definert scene å kjøre."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Gjeldende scene ble aldri lagret, vennligst lagre før kjøring."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Kunne ikke starta subprosess!"
@@ -2561,12 +2566,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "Kan ikke laste en scene som aldri ble lagret."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Gå tilbake"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Lagre Scene"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Denne handlingen kan ikke angres. Gå tilbake likevel?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2861,10 +2869,6 @@ msgid "Redo"
msgstr "Gjenta"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Tilbakestille Scene"
-
-#: editor/editor_node.cpp
#, fuzzy
msgid "Miscellaneous project or scene-wide tools."
msgstr "Diverse prosjekt- eller scene-relaterte verktøy"
@@ -2922,34 +2926,36 @@ msgstr "Avslutt til Prosjektliste"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr "Debug"
+msgstr "Feilsøk"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
msgstr "Distribuer med ekstern feilsøking"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Ved eksportering eller deploying, den følgende kjørbare filen vil prøve å "
-"koble til IP'en til denne datamaskinen for å bli debugget."
#: editor/editor_node.cpp
#, fuzzy
-msgid "Small Deploy with Network FS"
-msgstr "Liten Deploy med Network FS"
+msgid "Small Deploy with Network Filesystem"
+msgstr "Liten utrulling med Network FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Når dette alternativet er aktivert, eksportering eller distribuering vil "
"produsere en kjørbar fil.\n"
@@ -2958,40 +2964,43 @@ msgstr ""
"alternativet gjør testing for spill med et stort fotavtrykk raskere."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Visible Collision Shapes"
-msgstr "Synlige Kollisjons-Former"
+msgstr "Synlige kollisjons-former"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Kollisjons-former eller raycast-noder (for 2D og 3D) vil være synlige under "
"kjøring av spill om denne innstillingen er aktivert."
#: editor/editor_node.cpp
msgid "Visible Navigation"
-msgstr "Synlig Navigasjon"
+msgstr "Synlig navigasjon"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigasjons-maske og polygoner vil være synlig under kjøring av spill om "
"denne innstillingen er aktivert."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr "Synkroniser Sceneforandringer"
+#, fuzzy
+msgid "Synchronize Scene Changes"
+msgstr "Synkroniser Sceneendringer"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Når denne innstillingen er aktivert, alle endringer gjort til scenen i "
"editoren vil bli replikert i det kjørende spillet.\n"
@@ -2999,16 +3008,17 @@ msgstr ""
"nettverksfilsystem."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr "Synkroniser Skriptforandringer"
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "Synkroniser Skriptendringer"
#: editor/editor_node.cpp
#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Når denne innstillingen er aktivert, alle skript som er lagret vil lastes "
"inn på nytt i det kjørende spillet.\n"
@@ -3016,7 +3026,6 @@ msgstr ""
"nettverksfilsystem."
#: editor/editor_node.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Editor"
msgstr "Redigeringsverktøy"
@@ -3081,7 +3090,7 @@ msgstr "Hjelp"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Søk"
@@ -3095,8 +3104,13 @@ msgid "Q&A"
msgstr "Spørsmål og Svar"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Problemtracker"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Reimporter"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3360,7 +3374,6 @@ msgid "Inclusive"
msgstr "Inklusiv"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Self"
msgstr "Selv"
@@ -3405,9 +3418,8 @@ msgid "Assign..."
msgstr "Tilordne..."
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr ": Ugyldige argumenter: "
+msgstr "Ugyldig RID"
#: editor/editor_properties.cpp
#, fuzzy
@@ -3506,9 +3518,11 @@ msgid "Add Key/Value Pair"
msgstr "Legg Til Nøkkel/Verdi Par"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Ingen kjørbar eksport-preset funnet for denne plattformen.\n"
"Vennligst legg til en kjørbar preset i eksportmenyen."
@@ -3537,13 +3551,18 @@ msgstr "Kunne ikke kjøre skript:"
msgid "Did you forget the '_run' method?"
msgstr "Glemte du '_run'-metoden?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Velg Node(r) for Importering"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
+#, fuzzy
msgid "Browse"
-msgstr "Utforsk"
+msgstr "Bla gjennom"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
@@ -3681,9 +3700,8 @@ msgid ""
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "Error ved forespørsel av url: "
+msgstr "Feil ved nettadresse-forespørsel:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3775,9 +3793,8 @@ msgid "Download Templates"
msgstr "Last ned Mal"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Velg fillager fra liste: "
+msgstr "Velg speil fra liste: (Shift+Klikk: Åpne i nettleser)"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3785,12 +3802,9 @@ msgid "Favorites"
msgstr "Favoritter:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
-"\n"
-"Status: Import av fil feilet. Vennligst reparer filen eller reimporter "
-"manuelt."
+"Status: Import av fil feilet. Reparer filen eller importer igjen manuelt."
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3948,7 +3962,7 @@ msgstr "Lag mappe"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
-msgstr "Re-Skann Filsystem"
+msgstr "Gjennomsøk filsystem på ny"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3965,8 +3979,8 @@ msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-"Skanner Filer,\n"
-"Vennligst Vent..."
+"Gjennomgår filer,\n"
+"Vent…"
#: editor/filesystem_dock.cpp
msgid "Move"
@@ -4030,14 +4044,12 @@ msgid "Cancel"
msgstr "Avbryt"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "Finn"
+msgstr "Finn: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "Erstatt"
+msgstr "Erstatt: "
#: editor/find_in_files.cpp
#, fuzzy
@@ -4191,10 +4203,18 @@ msgid "Error running post-import script:"
msgstr "Error ved kjøring av post-import script:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Lagrer..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Filer"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Sett som Standard for '%s'"
@@ -4203,10 +4223,6 @@ msgid "Clear Default for '%s'"
msgstr "Fjern Standard for '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Filer"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importer Som:"
@@ -4220,7 +4236,8 @@ msgid "Reimport"
msgstr "Reimporter"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+#, fuzzy
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Lagre scener, om-importer og start om"
#: editor/import_dock.cpp
@@ -4259,10 +4276,6 @@ msgid "Copy Params"
msgstr "Kopier Parametre"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Lim inn Parametre"
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "Ressurs-utklippstavle er tom!"
@@ -4669,9 +4682,8 @@ msgid "Audio Clips"
msgstr "Lydklipp:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Funksjoner:"
+msgstr "Funksjoner"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
@@ -5009,9 +5021,8 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Overgang"
+msgstr "Overgang: "
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -5020,9 +5031,8 @@ msgstr "Panorerings-Modus"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "AnimationTree"
-msgstr "Animasjon"
+msgstr "Animasjontre"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -5408,7 +5418,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Forhåndsvis"
@@ -6221,11 +6231,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Kunne ikke opprette mappe."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6237,12 +6248,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "Lag ny %s"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "Kunne ikke opprette mappe."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Lag ny %s"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6294,19 +6323,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Lag Poly"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Lag Poly"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV1"
msgstr "Vis"
@@ -7198,14 +7265,6 @@ msgid "Open Godot online documentation."
msgstr "Åpne Godots nettbaserte dokumentasjon"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Søk i referanse-dokumentasjonen."
@@ -7239,7 +7298,7 @@ msgstr "Lagre på nytt"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
-msgstr "Feilretter"
+msgstr "Feilsøking"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -7272,15 +7331,15 @@ msgid ""
msgstr "Koble '%s' fra '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "Linje:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "Fjern Funksjon"
@@ -7507,9 +7566,8 @@ msgid "Create physical bones"
msgstr ""
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Singleton"
+msgstr "Skelett"
#: editor/plugins/skeleton_editor_plugin.cpp
#, fuzzy
@@ -7527,7 +7585,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective"
-msgstr ""
+msgstr "Perspektiv"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
@@ -7666,6 +7724,10 @@ msgid "This operation requires a single selected node."
msgstr "Denne operasjonen krever én valgt node."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Lock View Rotation"
msgstr "Vis Informasjon"
@@ -7722,7 +7784,7 @@ msgstr "Lager Forhåndsvisning av Mesh"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
-msgstr ""
+msgstr "Ikke tilgjengelig ved bruk av GLES2-opptegner."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7757,18 +7819,27 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Vis Informasjon"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "Vis Informasjon"
+msgid "XForm Dialog"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7821,7 +7892,7 @@ msgstr "Høyrevisning"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr ""
+msgstr "Bytt perspektiv/ortogonal fremvisning"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
@@ -7917,7 +7988,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective FOV (deg.):"
-msgstr ""
+msgstr "Perspektiv-synsv. (deg.):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Near:"
@@ -8125,7 +8196,8 @@ msgid "New Animation"
msgstr "Animasjon"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Hastighet (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8859,7 +8931,7 @@ msgstr "TileSet..."
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8974,9 +9046,8 @@ msgid "Scalar"
msgstr "Skala:"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector"
-msgstr "Inspektør"
+msgstr "Vektor"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
@@ -9997,23 +10068,30 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "Fil eksisterer ikke."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Feil ved åpning av pakkefil, ikke i zip format."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
-msgstr ""
+msgstr "Velg en tom mappe."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -10079,9 +10157,8 @@ msgid "Create New Project"
msgstr "Opprett Nytt Prosjekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Create & Edit"
-msgstr "Opprett skript"
+msgstr "Opprett og rediger"
#: editor/project_manager.cpp
msgid "Install Project:"
@@ -10106,7 +10183,7 @@ msgstr "Prosjektsti:"
#: editor/project_manager.cpp
msgid "Renderer:"
-msgstr ""
+msgstr "Opptegner:"
#: editor/project_manager.cpp
msgid "OpenGL ES 3.0"
@@ -10119,6 +10196,10 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"Høyere visuell kvalitet\n"
+"All funksjonalitet tilgjengelig\n"
+"Fungerer ikke med eldre maskinvare\n"
+"Ikke anbefalt for nettsidebaserte spill"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
@@ -10131,10 +10212,14 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"Lavere visuell kvalitet\n"
+"Noe funksjonalitet er ikke tilgjengelig\n"
+"Virker på det meste av maskinvare\n"
+"Anbefalt for nettsidebaserte spill"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
+msgstr "Rendrer kan endres senere, men scener må kanskje justeres."
#: editor/project_manager.cpp
msgid "Unnamed Project"
@@ -10239,22 +10324,22 @@ msgid ""
msgstr ""
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
-"Du er i ferd med å skanne %s mapper for eksisterende Godotprosjekter. "
-"Bekrefter du?"
+"Er du sikker på at du vil søke gjennom %s mapper etter eksisterende "
+"Godotprosjekter.\n"
+"Det kan ta en stund."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr "Prosjektleder"
+msgstr "Prosjektstyring"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
-msgstr "Prosjekt"
+msgstr "Prosjekter"
#: editor/project_manager.cpp
msgid "Last Modified"
@@ -10262,11 +10347,11 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Scan"
-msgstr "Skann"
+msgstr "Gjennomsøk"
#: editor/project_manager.cpp
msgid "Select a Folder to Scan"
-msgstr "Velg en Mappe å Skanne"
+msgstr "Velg en mappe å søke gjennom"
#: editor/project_manager.cpp
msgid "New Project"
@@ -10279,7 +10364,7 @@ msgstr "Fjern punkt"
#: editor/project_manager.cpp
msgid "Templates"
-msgstr ""
+msgstr "Maler"
#: editor/project_manager.cpp
msgid "Restart Now"
@@ -10295,6 +10380,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10337,15 +10429,15 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "All Devices"
-msgstr ""
+msgstr "Alle enheter"
#: editor/project_settings_editor.cpp
msgid "Device"
-msgstr ""
+msgstr "Enhet"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Press a Key..."
-msgstr ""
+msgstr "Trykk en tast..."
#: editor/project_settings_editor.cpp
msgid "Mouse Button Index:"
@@ -10353,15 +10445,15 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Left Button"
-msgstr ""
+msgstr "Venstre knapp"
#: editor/project_settings_editor.cpp
msgid "Right Button"
-msgstr ""
+msgstr "Høyre knapp"
#: editor/project_settings_editor.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "Midtknapp"
#: editor/project_settings_editor.cpp
msgid "Wheel Up Button"
@@ -10395,7 +10487,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Axis"
-msgstr ""
+msgstr "Akse"
#: editor/project_settings_editor.cpp
msgid "Joypad Button Index:"
@@ -10412,23 +10504,23 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Add Event"
-msgstr ""
+msgstr "Legg til hendelse"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr ""
+msgstr "Knapp"
#: editor/project_settings_editor.cpp
msgid "Left Button."
-msgstr ""
+msgstr "Venstre knapp."
#: editor/project_settings_editor.cpp
msgid "Right Button."
-msgstr ""
+msgstr "Høyre knapp."
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr ""
+msgstr "Midtknapp."
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
@@ -10448,7 +10540,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "No property '%s' exists."
-msgstr ""
+msgstr "Egenskapen «%s» eksisterer ikke."
#: editor/project_settings_editor.cpp
msgid "Setting '%s' is internal, and it can't be deleted."
@@ -10488,11 +10580,11 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Add Translation"
-msgstr ""
+msgstr "Legg til oversettelse"
#: editor/project_settings_editor.cpp
msgid "Remove Translation"
-msgstr ""
+msgstr "Fjern oversettelse"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
@@ -10532,7 +10624,7 @@ msgstr "Generelt"
#: editor/project_settings_editor.cpp
msgid "Override For..."
-msgstr ""
+msgstr "Overstyr for..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
@@ -10547,17 +10639,16 @@ msgid "Action:"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "Flytt Handling"
+msgstr "Handling"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Dødsone"
#: editor/project_settings_editor.cpp
msgid "Device:"
-msgstr ""
+msgstr "Enhet:"
#: editor/project_settings_editor.cpp
msgid "Index:"
@@ -10569,11 +10660,11 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Translations"
-msgstr ""
+msgstr "Oversettelser"
#: editor/project_settings_editor.cpp
msgid "Translations:"
-msgstr ""
+msgstr "Oversettelser:"
#: editor/project_settings_editor.cpp
msgid "Remaps"
@@ -10619,9 +10710,8 @@ msgid "AutoLoad"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Plugins"
-msgstr "Plugins"
+msgstr "Innstikkmoduler"
#: editor/property_editor.cpp
#, fuzzy
@@ -10642,7 +10732,7 @@ msgstr ""
#: editor/property_editor.cpp
msgid "File..."
-msgstr ""
+msgstr "Fil..."
#: editor/property_editor.cpp
msgid "Dir..."
@@ -10650,12 +10740,11 @@ msgstr ""
#: editor/property_editor.cpp
msgid "Assign"
-msgstr ""
+msgstr "Tildel"
#: editor/property_editor.cpp
-#, fuzzy
msgid "Select Node"
-msgstr "Kutt Noder"
+msgstr "Velg node"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
@@ -10688,15 +10777,25 @@ msgid "Batch Rename"
msgstr "Endre navn"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Erstatt: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Gjeldende Versjon:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Advanced Options"
msgstr "Snapping innstillinger"
@@ -10735,11 +10834,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10766,10 +10865,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10778,11 +10873,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10804,6 +10899,16 @@ msgstr "Store versaler"
msgid "Reset"
msgstr "Nullstill Zoom"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Gjeldende Versjon:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Gyldige karakterer:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10867,8 +10972,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Nytt Skript"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10905,6 +11011,11 @@ msgstr "Lagre Scene"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Kutt Noder"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Kutt Noder"
@@ -10956,9 +11067,8 @@ msgid "New Scene Root"
msgstr "Lagre Scene"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Lag Node"
+msgstr "Opprett rot-node:"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10972,12 +11082,11 @@ msgstr "Scene"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
-msgstr ""
+msgstr "Brukergrensesnitt"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Kutt Noder"
+msgstr "Andre noder"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -11037,6 +11146,13 @@ msgid "Open Documentation"
msgstr "Åpne Godots nettbaserte dokumentasjon"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -11086,14 +11202,17 @@ msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
+"Opprett en scenefil som en node. Oppretter en arvet scene hvis det ikke "
+"finnes en rot-node."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Detach the script from the selected node."
+msgstr "Instanser den valgte scene(r) som barn av den valgte noden."
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -11223,6 +11342,10 @@ msgid "A directory with the same name exists."
msgstr "En fil eller mappe med dette navnet eksisterer allerede."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Fil eksisterer ikke."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Må ha en gyldig filutvidelse."
@@ -11268,6 +11391,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Ugyldig Filsti."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Ugyldig navn."
@@ -11278,7 +11406,7 @@ msgstr "Ugyldig indeks egenskap navn '%s' i node %s."
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr "Animasjonstre er gyldig."
#: editor/script_create_dialog.cpp
@@ -11306,6 +11434,12 @@ msgid "Script file already exists."
msgstr "Eksisterer allerede"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Klasse:"
@@ -11327,7 +11461,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Remote "
-msgstr "Fjern Funksjon"
+msgstr "Fjern-funksjon "
#: editor/script_editor_debugger.cpp
msgid "Bytes:"
@@ -11387,6 +11521,10 @@ msgid "Copy Error"
msgstr "Last Errors"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Slett punkter"
@@ -11408,9 +11546,8 @@ msgid "Profiler"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Network Profiler"
-msgstr "Eksporter Prosjekt"
+msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Monitor"
@@ -11437,8 +11574,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Eksporter Prosjekt"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12134,11 +12272,11 @@ msgstr "Endre CanvasItem"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr ""
+msgstr "Kan ikke kopiere funksjonsnoden."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
-msgstr ""
+msgstr "Utklippsbordet er tomt!"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -12360,6 +12498,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12384,6 +12526,32 @@ msgstr "Ugyldig navn."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12495,7 +12663,7 @@ msgstr "Prosjektnavn:"
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid publisher GUID."
-msgstr ": Ugyldige argumenter: "
+msgstr "Ugyldig forlags-GUID."
#: platform/uwp/export/export.cpp
#, fuzzy
@@ -12573,6 +12741,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12760,6 +12934,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12780,6 +12959,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -13004,6 +13188,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -13034,6 +13222,39 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Konstanter kan ikke endres."
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "FilSystem"
+
+#, fuzzy
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Ved eksportering eller deploying, den følgende kjørbare filen vil prøve å "
+#~ "koble til IP'en til denne datamaskinen for å bli debugget."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "Gjeldende scene ble aldri lagret, vennligst lagre før kjøring."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Ikke i resource path."
+
+#~ msgid "Revert"
+#~ msgstr "Gå tilbake"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Denne handlingen kan ikke angres. Gå tilbake likevel?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Tilbakestille Scene"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Problemtracker"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Erstattet %d forekomst(er)."
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
@@ -13274,10 +13495,6 @@ msgstr "Konstanter kan ikke endres."
#~ msgstr "Sett inn Nøkler"
#, fuzzy
-#~ msgid "Instance the selected scene(s) as child of the selected node."
-#~ msgstr "Instanser den valgte scene(r) som barn av den valgte noden."
-
-#, fuzzy
#~ msgid "Font Size:"
#~ msgstr "Frontvisning"
diff --git a/editor/translations/nl.po b/editor/translations/nl.po
index 39bca63def..122782e1b0 100644
--- a/editor/translations/nl.po
+++ b/editor/translations/nl.po
@@ -4,7 +4,7 @@
# This file is distributed under the same license as the Godot source code.
# aelspire <aelspire@gmail.com>, 2017.
# Aram Nap <xyphex.aram@gmail.com>, 2017.
-# Arjan219 <arjannugteren1@gmail.com>, 2017-2018.
+# Arjan219 <arjannugteren1@gmail.com>, 2017-2018, 2020.
# Christophe Swolfs <swolfschristophe@gmail.com>, 2017.
# Cornee Traas <corneetraas@hotmail.com>, 2017.
# Daeran Wereld <daeran@gmail.com>, 2017.
@@ -40,11 +40,14 @@
# Tirrin <lensenjoe@gmail.com>, 2019.
# Filip Van Raemdonck <arrawn@gmail.com>, 2019.
# Julian <jdhoogvorst@gmail.com>, 2019, 2020.
+# kitfka <philipthuijs@gmail.com>, 2020.
+# Mike van Leeuwen <mkvanleeuwen@gmail.com>, 2020.
+# marnicq van loon <marnicqvanloon@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:09+0000\n"
+"PO-Revision-Date: 2020-08-28 13:09+0000\n"
"Last-Translator: Stijn Hinlopen <f.a.hinlopen@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/"
"nl/>\n"
@@ -53,22 +56,22 @@ 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 3.11-dev\n"
+"X-Generator: Weblate 4.2.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Ongeldig argumenttype voor convert(), gebruik TYPE_* constanten."
+msgstr "Ongeldig type argument voor convert(), gebruik TYPE_* constanten."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "Tekenreeks met lengte 1 verwacht (één karakter)."
+msgstr "Verwachtte een tekenreeks van lengte 1 (één karakter)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Niet genoeg bytes om bytes te decoderen, of ongeldig formaat."
+msgstr "Niet genoeg bytes voor het decoderen van bytes, of ongeldig formaat."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -525,10 +528,12 @@ msgid ""
msgstr ""
"Deze animatie behoort tot een geïmporteerde scène, dus veranderingen aan "
"geïmporteerde tracks zullen niet worden opgeslagen.\n"
+"\n"
"Om aangepaste tracks toe te kunnen voegen, moet in de importinstellingen van "
"de scène en de \"Animation→Storage\" naar \"Files\" zetten en "
"\"Animation→Keep Custom Tracks\" inschakelen. Importeer de scène dan "
"opnieuw.\n"
+"\n"
"Anders kan je een importvoorinstelling gebruiken die animaties importeert en "
"in verschillende bestanden opslaat."
@@ -562,6 +567,7 @@ msgid "Seconds"
msgstr "Seconden"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -661,7 +667,7 @@ msgstr "Alle animaties opruimen"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr "Animatie(s) Opruimen (KAN NIET ONGEDAAN WORDEN!)"
+msgstr "Animatie(s) opruimen (ONOMKEERBAAR!)"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
@@ -694,11 +700,11 @@ msgstr "Voeg audiospoor clip toe"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr "Wijzig start afwijking van audiospoorclip"
+msgstr "Wijzig startverschuiving van audiospoorclip"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr "Wijzig eind afwijking van audiospoorclip"
+msgstr "Wijzig eindverschuiving van audiospoorclip"
#: editor/array_property_edit.cpp
msgid "Resize Array"
@@ -721,8 +727,8 @@ msgid "Line Number:"
msgstr "Regelnummer:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d voorgekomen waarde(s) vervangen."
+msgid "%d replaced."
+msgstr "%d vervangingen."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -740,13 +746,13 @@ msgstr "Hoofdlettergevoelig"
msgid "Whole Words"
msgstr "Hele woorden"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Vervangen"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr "Alle Vervangen"
+msgstr "Alles vervangen"
#: editor/code_editor.cpp
msgid "Selection Only"
@@ -775,7 +781,7 @@ msgstr "Uitzoomen"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Initialiseer Zoom"
+msgstr "Herstel Zoom"
#: editor/code_editor.cpp
msgid "Warnings"
@@ -790,6 +796,10 @@ msgid "Method in target node must be specified."
msgstr "Methode in doelknoop moet gespecificeerd worden."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Methodenaam is geen geldige naam."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -873,7 +883,6 @@ msgstr "Kan signaal niet verbinden"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -931,6 +940,11 @@ msgid "Signals"
msgstr "Signalen"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filter tegels"
+
+#: editor/connections_dialog.cpp
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?"
@@ -969,7 +983,7 @@ msgid "Recent:"
msgstr "Onlangs:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Zoeken:"
@@ -1070,7 +1084,7 @@ msgid ""
msgstr ""
"De bestanden die verwijderd worden zijn nodig om andere bronnen te laten "
"werken.\n"
-"Toch verwijderen? (Kan niet ongedaan worden)"
+"Toch verwijderen? (Onomkeerbaar)"
#: editor/dependency_editor.cpp
msgid "Cannot remove:"
@@ -1102,7 +1116,7 @@ msgstr "Fouten bij het laden!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "%d bestand(en) voorgoed verwijderen? (Kan niet ongedaan worden!)"
+msgstr "%d bestand(en) voorgoed verwijderen? (Onomkeerbaar!)"
#: editor/dependency_editor.cpp
msgid "Show Dependencies"
@@ -1152,6 +1166,9 @@ msgstr "Projectoprichters"
msgid "Lead Developer"
msgstr "Hoofdontwikkelaar"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Projectbeheer "
@@ -1173,6 +1190,16 @@ msgid "Gold Sponsors"
msgstr "Gouden Sponsors"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Zilveren Donors"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronzen Donors"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsoren"
@@ -1466,7 +1493,7 @@ msgstr "Autoload '%s' bestaat al!"
#: editor/editor_autoload_settings.cpp
msgid "Rename Autoload"
-msgstr "Autoload Hernoemen"
+msgstr "Naam Autoload-script wijzigen"
#: editor/editor_autoload_settings.cpp
msgid "Toggle AutoLoad Globals"
@@ -1480,7 +1507,7 @@ msgstr "Autoload verplaatsen"
msgid "Remove Autoload"
msgstr "Autoload verwijderen"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Inschakelen"
@@ -1488,17 +1515,9 @@ msgstr "Inschakelen"
msgid "Rearrange Autoloads"
msgstr "Autoloads opnieuw ordenen"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Ongeldig pad."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Bestand bestaat niet."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Niet in bronpad."
+msgid "Can't add autoload:"
+msgstr "Autoload kan niet toevoegd worden:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1525,6 +1544,10 @@ msgstr "Naam"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Plak Parameters"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Scène aan het bijwerken"
@@ -1601,7 +1624,7 @@ msgid ""
"'Import Etc 2' in Project Settings."
msgstr ""
"Doelplatform vereist 'ETC2' textuurcompressie voor GLES3. Schakel 'Import "
-"Etc 2' in bij de Projectinstellingen."
+"Etc 2' in de Projectinstellingen in."
#: editor/editor_export.cpp
msgid ""
@@ -1652,20 +1675,21 @@ msgid "Scene Tree Editing"
msgstr "Scèneboombewerking"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importtabblad"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Knooptabblad"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Bestandssysteem- en Importtablad"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Bestandssysteem"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importtabblad"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr "Profiel '%s' verwijderen? (kan niet ongedaan gemaakt worden)"
+msgstr "Profiel '%s' verwijderen? (Onomkeerbaar)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
@@ -1744,7 +1768,7 @@ msgstr "Nieuw"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "Import"
+msgstr "Importeren"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
@@ -1811,7 +1835,7 @@ msgstr "Weergeven in Bestandsbeheer"
msgid "New Folder..."
msgstr "Nieuwe map..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Verversen"
@@ -1865,11 +1889,11 @@ msgstr "Ga Omhoog"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "Toggle Verborgen Bestanden"
+msgstr "Verborgen Bestanden Omschakelen"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "Toggle Favoriet"
+msgstr "Favoriet Omschakelen"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
@@ -1925,7 +1949,7 @@ msgstr "Mappen & Bestanden:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Voorbeeld:"
@@ -1992,15 +2016,15 @@ msgstr "standaard:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "Methodes"
+msgstr "Methoden"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "Thema Eigenschappen"
+msgstr "Thema-eigenschappen"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "Enumeraties"
+msgstr "Enumeratie"
#: editor/editor_help.cpp
msgid "Constants"
@@ -2008,7 +2032,7 @@ msgstr "Constanten"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr "Eigenschap Beschrijvingen"
+msgstr "Eigenschapbeschrijvingen"
#: editor/editor_help.cpp
msgid "(value)"
@@ -2019,20 +2043,20 @@ msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"Er is momenteel geen beschrijving voor deze eigenschap. Help ons alsjeblieft "
-"door [color=$color][url=$url]een toe te voegen[/url][/color]!"
+"Er is momenteel geen beschrijving voor deze eigenschap. Help ons alstublieft "
+"door [color=$color][url=$url]een bijdrage te leveren[/url][/color]!"
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Methode Beschrijvingen"
+msgstr "Methodebeschrijvingen"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"Er is momenteel geen beschrijving voor deze methode. Help ons alsjeblieft "
-"door [color=$color][url=$url]een toe te voegen[/url][/color]!"
+"Er is momenteel geen beschrijving voor deze methode. Help ons alstublieft "
+"door [color=$color][url=$url]een bijdrage te leveren[/url][/color]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -2365,10 +2389,6 @@ msgid "There is no defined scene to run."
msgstr "Er is geen startscène ingesteld."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "De huidige scène is nooit opgeslagen, sla het op voor het uitvoeren."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Kon het subproces niet opstarten!"
@@ -2382,7 +2402,7 @@ msgstr "Basisscène openen"
#: editor/editor_node.cpp
msgid "Quick Open..."
-msgstr "Snel Openen..."
+msgstr "Snel openen..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2390,7 +2410,7 @@ msgstr "Scène snel openen..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr "Open Script Snel..."
+msgstr "Script snel openen..."
#: editor/editor_node.cpp
msgid "Save & Close"
@@ -2454,12 +2474,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Een scène die nooit opgeslagen is kan niet opnieuw laden worden."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Herstellen"
+msgid "Reload Saved Scene"
+msgstr "Opgeslagen scène herladen"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Deze actie kan niet ongedaan gemaakt worden. Toch herstellen?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"De huidige scène bevat niet opgeslagen veranderingen.\n"
+"Scène desondanks herladen? Dit kan niet ongedaan gemaakt worden."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2495,8 +2519,8 @@ msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
-"Deze optie is verouderd. Situaties waar een hernieuwing geforceerd moet "
-"worden zijn softwarefouten. Rapporteer dit alsjeblieft."
+"Deze optie is verouderd. Situaties waarbij gedwongen herladen moet worden, "
+"worden gezien als softwarefouten. Rapporteer dit alstublieft."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
@@ -2713,7 +2737,7 @@ msgstr "Scène openen..."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Open Recent"
-msgstr "Recente Scenes Openen"
+msgstr "Onlangs geopend"
#: editor/editor_node.cpp
msgid "Save Scene"
@@ -2725,7 +2749,7 @@ msgstr "Alle scènes opslaan"
#: editor/editor_node.cpp
msgid "Convert To..."
-msgstr "Converteer Naar..."
+msgstr "Omzetten naar..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
@@ -2738,7 +2762,7 @@ msgstr "TileSet..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr "Ongedaan Maken"
+msgstr "Ongedaan maken"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2746,10 +2770,6 @@ msgid "Redo"
msgstr "Opnieuw"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Scène terugzetten"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Overig project of scène-brede hulpmiddelen."
@@ -2792,7 +2812,7 @@ msgstr "Hulpmiddelen"
#: editor/editor_node.cpp
msgid "Orphan Resource Explorer..."
-msgstr "Verweesde hulpbronnen verkenner..."
+msgstr "Beheer ongebruikte bronnen..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2809,24 +2829,28 @@ msgstr "Opstarten met debugging op afstand"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Na het exporteren of opstarten van het programma zal het proberen verbinding "
-"maken met het IP-adres van deze computer zodat het gedebugd kan worden."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Klein uitvoerbaar bestand opstarten met netwerk bestandsserver"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Wanneer deze optie is ingeschakeld, zal export of deploy een minimaal "
"uitvoerbaar bestand creëren.\n"
@@ -2840,9 +2864,10 @@ msgid "Visible Collision Shapes"
msgstr "Toon collision shapes"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Botsingsdetectievormen en raycast knopen (voor 2D en 3D) zullen zichtbaar "
"zijn in het draaiend spel wanneer deze optie aan staat."
@@ -2852,23 +2877,26 @@ msgid "Visible Navigation"
msgstr "Navigatie zichtbaar"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Navigatie meshes en polygonen zijn zichtbaar in het draaiend spel wanneer "
"deze optie aanstaat."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Scèneveranderingen synchroniseren"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Wanneer deze optie aanstaat, wordt elke verandering gemaakt in de editor "
"toegepast op het draaiend spel.\n"
@@ -2876,15 +2904,17 @@ msgstr ""
"efficiënter met het netwerk bestandssysteem."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Scriptveranderingen synchroniseren"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Wanneer deze optie aanstaat wordt ieder script dat wordt opgeslagen "
"toegepast op het draaiend spel.\n"
@@ -2913,7 +2943,7 @@ msgstr "Schermafbeeldingen worden bewaard in de map \"Editor Data/Settings\"."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Schakel Volledig Scherm"
+msgstr "Volledig scherm"
#: editor/editor_node.cpp
msgid "Toggle System Console"
@@ -2937,7 +2967,7 @@ msgstr "Editor-functionaliteiten Beheren..."
#: editor/editor_node.cpp
msgid "Manage Export Templates..."
-msgstr "Export Sjablonen Beheren..."
+msgstr "Exportsjablonen beheren..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2948,7 +2978,7 @@ msgstr "Help"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Zoeken"
@@ -2962,8 +2992,12 @@ msgid "Q&A"
msgstr "Vragen en antwoorden"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Issue Tracker"
+msgid "Report a Bug"
+msgstr "Meld een probleem"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Suggesties voor documentatie verzenden"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3364,9 +3398,11 @@ msgid "Add Key/Value Pair"
msgstr "Sleutel/waarde-paar toevoegen"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Geen uitvoerbare export preset gevonden voor dit platform.\n"
"Voeg een uitvoerbare preset toe in het exportmenu."
@@ -3395,6 +3431,12 @@ msgstr "Script kon niet uitgevoerd worden:"
msgid "Did you forget the '_run' method?"
msgstr "Ben je de '_run' methode vergeten?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Houdt Ctrl ingedrukt om op gehele getallen af te ronden. Houdt Shift "
+"ingedrukt voor preciezere veranderingen."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Selecteer een of meer knopen om te importeren"
@@ -3637,7 +3679,7 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr "Kan de hoofdmap voor bronnen niet verplaatsen of hernoemen."
+msgstr "Kan de hoofdmap voor bronnen niet verplaatsen of van naam veranderen."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
@@ -3673,11 +3715,11 @@ msgstr "Naam bevat ongeldige tekens."
#: editor/filesystem_dock.cpp
msgid "Renaming file:"
-msgstr "Bestandsnaam wijzigen:"
+msgstr "Bestand hernoemen:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr "Hernoemen folder:"
+msgstr "Mapnaam wijzigen:"
#: editor/filesystem_dock.cpp
msgid "Duplicating file:"
@@ -3758,7 +3800,7 @@ msgstr "Alles inklappen"
#: editor/project_manager.cpp editor/rename_dialog.cpp
#: editor/scene_tree_dock.cpp
msgid "Rename"
-msgstr "Hernoemen"
+msgstr "Naam wijzigen"
#: editor/filesystem_dock.cpp
msgid "Previous Folder/File"
@@ -3770,7 +3812,7 @@ msgstr "Volgend(e) map/bestand"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
-msgstr "Bestandssysteem Opnieuw Scannen"
+msgstr "Bestandssysteem opnieuw inlezen"
#: editor/filesystem_dock.cpp
msgid "Toggle Split Mode"
@@ -3785,8 +3827,8 @@ msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-"Bestanden Scannen,\n"
-"Wacht Alstublieft..."
+"Bestanden aan het doornemen,\n"
+"Wacht alstublieft..."
#: editor/filesystem_dock.cpp
msgid "Move"
@@ -3855,7 +3897,7 @@ msgstr "Vervangen: "
#: editor/find_in_files.cpp
msgid "Replace all (no undo)"
-msgstr "Alle vervangen (geen ongedaan maken)"
+msgstr "Alles vervangen (onomkeerbaar)"
#: editor/find_in_files.cpp
msgid "Searching..."
@@ -3992,10 +4034,19 @@ msgid "Error running post-import script:"
msgstr "Fout bij uitvoeren post-import script:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+"Gaf je een van Node afstammend object terug in de `post_import()`-methode?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Opslaan..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Bestanden"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Stel in als Standaard voor '%s'"
@@ -4004,10 +4055,6 @@ msgid "Clear Default for '%s'"
msgstr "Wis Standaard voor '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Bestanden"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importeer als:"
@@ -4020,8 +4067,8 @@ msgid "Reimport"
msgstr "Opnieuw importeren"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Opnieuw importeren en herstarten (alle scènes worden opgeslagen)"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Sla scènes op, importeer opnieuw en start dan opnieuw op"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4058,10 +4105,6 @@ msgid "Copy Params"
msgstr "Kopieer Parameters"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Plak Parameters"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Bron in klembord bewerken"
@@ -4075,7 +4118,7 @@ msgstr "Integreer"
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr "Maak Onderliggende Bronnen Uniek"
+msgstr "Onderliggende bronnen zelfstandig maken"
#: editor/inspector_dock.cpp
msgid "Open in Help"
@@ -5068,7 +5111,7 @@ msgstr "Plugins..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
-msgstr "Sorteren:"
+msgstr "Sorteren op:"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -5128,7 +5171,7 @@ msgid "Bake Lightmaps"
msgstr "Bak Lichtmappen"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Voorbeeld"
@@ -5884,28 +5927,47 @@ msgid "Mesh is empty!"
msgstr "Mesh is leeg!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Creëer een statisch tri-mesh lichaam"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Kan geen Trimesh-botsingsvorm maken."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Creëer een statisch convex lichaam"
+msgid "Create Static Trimesh Body"
+msgstr "Creëer een statisch tri-mesh lichaam"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
-msgstr "Dit werkt niet op scènewortel!"
+msgstr "Dit werkt niet op de scènewortel!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Shape"
msgstr "Creëer Trimesh Static Shape"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Shapes maken mislukt!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"Uit de scènewortel kan geen enkele convexe botsingsvorm gemaakt worden."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Kon geen enkelvoudige convexe botsingsvorm maken."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Enkele convexe vorm maken"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Uit de scènewortel kunnen niet meerdere convexe botsingsvormen gemaakt "
+"worden."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Creëer Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "Kon geen enkele botsingsvormen maken."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Meerdere convexe vormen maken"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5956,18 +6018,68 @@ msgid "Create Trimesh Static Body"
msgstr "Creëer Trimesh Statisch Lichaam"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Maakt een StaticBody en wijst automatisch een botsingsvorm toe op basis van "
+"polygonen.\n"
+"Dit is de meest preciese (maar langzaamste) optie voor botsingsberekeningen."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Creëer Trimesh Botsing Broer"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Creëer Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Maakt een polygoon-gebaseerde botsingsvorm.\n"
+"Dit is de meest preciese (maar langzaamste) optie voor botsingsberekeningen."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Maak een enkel convex botsingselement als subelement"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Maakt een enkele convexe botsingsvorm.\n"
+"Dit is de snelste (maar minst precieze) optie voor botsingsberekeningen."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Meerdere convexe botsingsonderelementen aanmaken"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Maakt een polygoon-gebaseerde botsingsvorm.\n"
+"Deze optie ligt qua prestaties tussen de twee opties hierboven."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Creëer Outline Mesh..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Maakt een statische omlijningsmesh. De normaalvectoren van de omlijningsmesh "
+"worden automatisch omgekeerd.\n"
+"Dit kan gebruikt worden wanneer de Grow eigenschap van SpatialMaterial niet "
+"beschikbaar is."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Geef UV1 Weer"
@@ -6632,7 +6744,7 @@ msgstr "Fout bij importeren"
#: editor/plugins/script_editor_plugin.cpp
msgid "New Text File..."
-msgstr "Nieuw Tekst Bestand..."
+msgstr "Nieuw tekstbestand..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Open File"
@@ -6697,7 +6809,7 @@ msgstr "Filter scripts"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr "Schakel het alfabetisch sorteren van de methode lijst in of uit."
+msgstr "Alfabetisch sorteren van de methodelijst omschakelen."
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter methods"
@@ -6786,7 +6898,7 @@ msgstr "Sluit Docs"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
-msgstr "Opstarten"
+msgstr "Uitvoeren"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
@@ -6798,7 +6910,7 @@ msgstr "Stap Over"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
-msgstr "Breek"
+msgstr "Onderbreken"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
@@ -6818,14 +6930,6 @@ msgid "Open Godot online documentation."
msgstr "Open Godot online documentatie."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Verzoek documentatie"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Help de Godot-documentatie te verbeteren door feedback te geven."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Zoek in de referentie documentatie."
@@ -6889,12 +6993,12 @@ msgid ""
msgstr "Ontbrekende verbonden methode '%s' voor signaal '%s' naar knoop '%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Regel"
+msgid "[Ignore]"
+msgstr "[Negeren]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(negeren)"
+msgid "Line"
+msgstr "Regel"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6920,7 +7024,7 @@ msgstr "Kies Kleur"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Convert Case"
-msgstr "Converteer Hoofdlettergebruik"
+msgstr "Letters omzetten"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Uppercase"
@@ -6932,7 +7036,7 @@ msgstr "Kleine letters"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "Maak Hoofdletters"
+msgstr "Elk Woord Met Hoofdletter"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
@@ -7008,15 +7112,15 @@ msgstr "Trim Navolgende Spaties"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
-msgstr "Converteer Indentatie Naar Spaties"
+msgstr "Insprong in spaties omzetten"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Tabs"
-msgstr "Converteer Indentatie Naar Tabs"
+msgstr "Insprong in Tabs omzetten"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "Auto Indentatie"
+msgstr "Automatisch inspringen"
#: editor/plugins/script_text_editor.cpp
msgid "Find in Files..."
@@ -7053,11 +7157,11 @@ msgstr "Ga Naar Regel..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Breekpunt Aan- of Uitschakelen"
+msgstr "Breekpunt instellen"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Verwijder Alle Breekpunten"
+msgstr "Alle breekpunten verwijderen"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Breakpoint"
@@ -7260,6 +7364,10 @@ msgid "This operation requires a single selected node."
msgstr "Deze bewerking vereist één geselecteerde knoop."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Auto-orthogonaal ingeschakeld"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Beeldrotatie vergrendelen"
@@ -7285,7 +7393,7 @@ msgstr "Bekijk Omgeving"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Gizmos"
-msgstr "Bekijk Gizmos"
+msgstr "Toon Gizmos"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
@@ -7348,6 +7456,10 @@ msgid "Freelook Slow Modifier"
msgstr "Vrijekijk Snelheid Modificator"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Beeldrotatie vergrendeld"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7357,14 +7469,24 @@ msgstr ""
"Het is geen betrouwbare indicatie voor werkelijke spelprestaties."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Beeldrotatie vergrendeld"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm Dialoog"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Klik om te wisselen tussen zichtbaarheidsweergaven.\n"
+"\n"
+"Open oog: Gizmo is zichtbaar.\n"
+"Gesloten oog: Gizmo is verborgen.\n"
+"Half open oog: Gizmo is ook zichtbaar door ondoorzichtige oppervlaktes."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Knopen aan vloer kleven"
@@ -7510,7 +7632,7 @@ msgstr "Beeldvensterinstellingen"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective FOV (deg.):"
-msgstr "Perspectief FOV (grad.):"
+msgstr "Gezichtsveld (graden):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Near:"
@@ -7550,7 +7672,7 @@ msgstr "Post"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Nameless gizmo"
-msgstr "Naamloos apparaat"
+msgstr "Naamloze gizmo"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create Mesh2D"
@@ -7608,7 +7730,7 @@ msgstr "Ongeldige geometrie, kan geen polygon creëren."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Polygon2D"
-msgstr "Converteer naar Polygon2D"
+msgstr "Naar Polygon2D omzetten"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
@@ -7703,7 +7825,8 @@ msgid "New Animation"
msgstr "Niewe animatie"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Snelheid (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7801,7 +7924,7 @@ msgstr "Stap:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr "Separatie:"
+msgstr "Scheiding:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "TextureRegion"
@@ -8099,7 +8222,7 @@ msgstr "Selecteer de vorige shape, subtegel of Tegel."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region"
-msgstr "Bereik"
+msgstr "Gebied"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Collision"
@@ -8127,7 +8250,7 @@ msgstr "Z Index"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region Mode"
-msgstr "Bereikmodus"
+msgstr "Gebiedmodus"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Collision Mode"
@@ -8179,7 +8302,7 @@ msgstr "Nieuwe veelhoek aanmaken."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
-msgstr "Hou de veelhoek binnen een rechthoekig bereik."
+msgstr "Houd de veelhoek binnen het rechthoekige gebied."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
@@ -8380,7 +8503,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "Geen VCS addons beschikbaar."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Fout"
@@ -9559,11 +9682,16 @@ msgid "Export With Debug"
msgstr "Exporteer Met Debug"
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr "Dit pad bestaat niet."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Fout bij het openen van het pakketbestand, geen zip-formaat."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr "Ongeldig '.zip' projectbestand, bevat geen 'project.godot' bestand."
#: editor/project_manager.cpp
@@ -9571,12 +9699,12 @@ msgid "Please choose an empty folder."
msgstr "Kies alstublieft een lege map."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Kies alstublieft een 'project.godot' of '.zip' bestand."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Kies alstublieft een \"project.godot\" of \".zip\" bestand."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "Map bevat al een Godot project."
+msgid "This directory already contains a Godot project."
+msgstr "In deze map staat al een Godot project."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9741,8 +9869,8 @@ msgstr ""
"\n"
"%s\n"
"\n"
-"Als je doorgaat met het openen van dit bestand, zal het worden geconverteerd "
-"naar Godot's huidige format voor project-configuratiebestanden.\n"
+"Als je doorgaat met het openen van dit bestand, zal het worden omgezet naar "
+"Godot's huidige formaat voor project-configuratiebestanden.\n"
"Waarschuwing: Hierna kan het project niet meer worden geopend door oudere "
"versies van Godot Engine."
@@ -9802,7 +9930,7 @@ msgid ""
"The project folders' contents won't be modified."
msgstr ""
"%d projecten uit de lijst verwijderen?\n"
-"De inhoud van de projectmappen wordt niet geraakt."
+"De inhoud van de projectmappen wordt niet gewijzigd."
#: editor/project_manager.cpp
msgid ""
@@ -9810,7 +9938,7 @@ msgid ""
"The project folder's contents won't be modified."
msgstr ""
"Project uit de lijst verwijderen?\n"
-"De inhoud van de projectmap wordt niet geraakt."
+"De inhoud van de projectmap wordt niet gewijzigd."
#: editor/project_manager.cpp
msgid ""
@@ -9825,8 +9953,8 @@ msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
-"Taal veranderd. \n"
-"De gebruikersinterface wordt bij het herstarten van de editor of "
+"De taal is veranderd. \n"
+"De gebruikersomgeving wordt bij het herstarten van de editor of "
"projectbeheer bijgewerkt."
#: editor/project_manager.cpp
@@ -9837,6 +9965,7 @@ msgstr ""
"Wil je %s mappen doorzoeken naar bestaande Godot projecten?\n"
"Dit kan een tijdje duren."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Projectbeheer"
@@ -9851,7 +9980,7 @@ msgstr "Laatst bewerkt"
#: editor/project_manager.cpp
msgid "Scan"
-msgstr "Scannen"
+msgstr "Inlezen"
#: editor/project_manager.cpp
msgid "Select a Folder to Scan"
@@ -9867,11 +9996,11 @@ msgstr "Lijst opruimen"
#: editor/project_manager.cpp
msgid "Templates"
-msgstr "Templates"
+msgstr "Sjablonen"
#: editor/project_manager.cpp
msgid "Restart Now"
-msgstr "Herstart Nu"
+msgstr "Nu herstarten"
#: editor/project_manager.cpp
msgid "Can't run project"
@@ -9885,6 +10014,17 @@ msgstr ""
"U heeft momenteel geen projecten.\n"
"Wilt u de officiële voorbeeldprojecten verkennen in de Asset Library?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"De zoekbalk filtert projecten op naam en naam van de map waarin het project "
+"staat.\n"
+"Om ook op het volledige pad te filteren, moet de zoekopdracht tenminste één "
+"`/` karakter bevatten."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Toets "
@@ -10263,17 +10403,28 @@ msgstr "Selecteer Method"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
-msgstr "Hernoemen meerdere"
+msgstr "Bulk hernoemen"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Vervangen: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Voorvoegsel"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Achtervoegsel"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Reguliere expressies gebruiken"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Geavanceerde opties"
@@ -10310,11 +10461,12 @@ msgstr ""
"Vergelijk tellersopties."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "Per Niveau teller"
+msgid "Per-level Counter"
+msgstr "Per niveau teller"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
"Indien ingesteld: herstart de teller voor iedere groep van onderliggende "
"knopen"
@@ -10344,10 +10496,6 @@ msgstr ""
"Missende cijfers worden met voorloopnullen opgevuld."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Reguliere Expressie"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Post-Process"
@@ -10356,12 +10504,12 @@ msgid "Keep"
msgstr "Houd"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase naar under_scored"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase naar onder_streep"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored naar CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "onder_streep naar PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10379,6 +10527,15 @@ msgstr "Naar hoofdletters"
msgid "Reset"
msgstr "Resetten"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Fout in reguliere expressie"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Bij teken %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Knoopouder wijzigen"
@@ -10444,8 +10601,8 @@ msgid "Instance Child Scene"
msgstr "Scène instantiëren"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Script wissen"
+msgid "Detach Script"
+msgstr "Script losmaken"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10482,6 +10639,10 @@ msgid "Make node as Root"
msgstr "Knoop tot wortelknoop maken"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "%d knopen en hun (eventuele) kinderen verwijderen?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Verwijder %d knopen?"
@@ -10564,7 +10725,7 @@ msgstr "Kan niet werken aan knopen waar de huidige scène van erft!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr "Verbind Script"
+msgstr "Script toevoegen"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
@@ -10611,12 +10772,21 @@ msgid "Open Documentation"
msgstr "Open Godot online documentatie"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Script kon niet aangebracht worden: er zijn geen talen ingesteld.\n"
+"Dit is waarschijnlijk omdat deze editor zonder taalmodules was gecompileerd."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Knoop hieronder toevoegen"
#: editor/scene_tree_dock.cpp
msgid "Expand/Collapse All"
-msgstr "Alles uit-/inklappen"
+msgstr "Alles in-/uitklappen"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
@@ -10628,7 +10798,7 @@ msgstr "Onder nieuwe knoop hangen"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Scènewortel instellen"
+msgstr "Als scènewortel instellen"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10659,12 +10829,12 @@ msgstr ""
"wortelknoop bestaat."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Verbind een nieuw of bestaand script aan de geselecteerde knoop."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Een nieuw of bestaand script verbinden aan de geselecteerde knoop."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Script van geselecteerde knopen wissen."
+msgid "Detach the script from the selected node."
+msgstr "Script van geselecteerde knoop losmaken."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10795,6 +10965,10 @@ msgid "A directory with the same name exists."
msgstr "Een map met dezelfde naam bestaat al."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Bestand bestaat niet."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Ongeldige extentie."
@@ -10835,6 +11009,10 @@ msgid "File exists, it will be reused."
msgstr "Bestand Bestaat, zal hergebruikt worden."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Ongeldig pad."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Ongeldige klassenaam."
@@ -10843,8 +11021,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Ongeldige overgenomen oudernaam of pad."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Script is geldig."
+msgid "Script path/name is valid."
+msgstr "Scriptpad/-naam is geldig."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10867,6 +11045,14 @@ msgid "Script file already exists."
msgstr "Scriptbestand bestaat al."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Merk op: Ingebouwde scripten zijn onderhevig aan bepaalde beperkingen en "
+"kunnen niet in een externe editor bewerkt worden."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Klasse Naam:"
@@ -10935,6 +11121,10 @@ msgid "Copy Error"
msgstr "Kopieer Fout"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Videogeheugen"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Breakpoint overslaan"
@@ -10983,8 +11173,8 @@ msgid "Total:"
msgstr "Totaal:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Videogeheugen"
+msgid "Export list to a CSV file"
+msgstr "Exporteer lijst naar een csv-bestand"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11872,6 +12062,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr "Debug Keystore is niet ingesteld of aanwezig in de Editor Settings."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "Release-Keystore is verkeerd ingesteld in de exportinstelingen."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Eigen build vereist een geldige Android SDK pad in de Editorinstellingen."
@@ -11898,6 +12092,40 @@ msgstr "Ongeldige pakketnaam:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Ongeldige \"GodotPaymentV3\" module ingesloten in de projectinstelling "
+"\"android/modules\" (veranderd in Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "\"Use Custom Build\" moet geactiveerd zijn om plugins te gebruiken."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" is alleen geldig als \"Xr Mode\" op \"Oculus Mobile VR"
+"\" staat."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" is alleen geldig als \"Xr Mode\" op \"Oculus Mobile VR\" "
+"staat."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" is alleen geldig als \"Xr Mode\" op \"Oculus Mobile VR\" "
+"staat."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12105,9 +12333,13 @@ msgstr ""
msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
+msgstr "Een CollisionShape2D heeft een vorm nodig in de Shape-eigenschap!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
msgstr ""
-"Een vorm moet voorzien worden om CollisionShape2D te laten functioneren. "
-"Creëer hiervoor alsjeblieft een vorm resource!"
#: scene/2d/cpu_particles_2d.cpp
msgid ""
@@ -12135,7 +12367,7 @@ msgstr ""
#: scene/2d/light_occluder_2d.cpp
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
-"De occluder polygoon van deze occluder is leeg. Teken alsjeblieft een "
+"De occluder-polygoon van deze occluder is leeg. Teken alstublieft een "
"polygoon."
#: scene/2d/navigation_polygon.cpp
@@ -12348,6 +12580,11 @@ msgstr ""
"Een vlak als vorm werkt niet goed en zal verwijderd worden in toekomstige "
"versies. Gebruik wordt afgeraden."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr "ConcavePolygonShape ondersteunt RigidBody alleen in statische modus."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Niets is zichtbaar want geen mesh is toegewezen."
@@ -12372,6 +12609,11 @@ msgstr ""
"GIProbes worden niet ondersteund door het GLES2 grafische stuurprogramma.\n"
"Gebruik in plaats daarvan een BakedLightmap."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12595,7 +12837,7 @@ msgstr "Alarm!"
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
-msgstr "Bevestig alsjeblieft..."
+msgstr "Bevestig alstublieft..."
#: scene/gui/popup.cpp
msgid ""
@@ -12645,6 +12887,11 @@ msgstr ""
"maken, zodat het een grootte kan ontvangen. Anders, maak er een RenderTarget "
"van en wijs zijn interne textuur toe aan een knoop om te tonen."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"De grootte van een Viewport moet groter zijn dan 0 om iets weer te geven."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Ongeldige bron voor voorvertoning."
@@ -12673,6 +12920,56 @@ msgstr "Varyings kunnen alleen worden toegewezenin vertex functies."
msgid "Constants cannot be modified."
msgstr "Constanten kunnen niet worden aangepast."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Bestandssysteem- en Importtablad"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Na het exporteren of opstarten van het programma zal het proberen "
+#~ "verbinding maken met het IP-adres van deze computer zodat het gedebugd "
+#~ "kan worden."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "De huidige scène is nooit opgeslagen, sla het op voor het uitvoeren."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Niet in bronpad."
+
+#~ msgid "Revert"
+#~ msgstr "Herstellen"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr ""
+#~ "Deze actie kan niet ongedaan gemaakt worden. WIlt u desondanks "
+#~ "terugzetten?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Scène terugzetten"
+
+#~ msgid "Clear Script"
+#~ msgstr "Script wissen"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Issue Tracker"
+
+#~ msgid "Request Docs"
+#~ msgstr "Verzoek documentatie"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Help de Godot-documentatie te verbeteren door feedback te geven."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d voorgekomen waarde(s) vervangen."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Creëer een statisch convex lichaam"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Shapes maken mislukt!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/or.po b/editor/translations/or.po
index 5cddf8dee7..11fc082ecd 100644
--- a/editor/translations/or.po
+++ b/editor/translations/or.po
@@ -506,6 +506,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -665,7 +666,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -684,7 +685,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -734,6 +735,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -813,7 +818,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -870,6 +874,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -907,7 +915,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1081,6 +1089,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1102,6 +1113,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1405,7 +1424,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1413,16 +1432,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1450,6 +1461,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1569,15 +1584,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1726,7 +1741,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1840,7 +1855,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2250,10 +2265,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2338,11 +2349,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2608,10 +2621,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2671,22 +2680,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2695,8 +2708,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2705,32 +2718,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2790,7 +2803,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2804,7 +2817,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3186,7 +3203,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3213,6 +3231,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3797,19 +3819,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3825,7 +3851,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3859,10 +3885,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4906,7 +4928,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5638,11 +5660,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5654,11 +5676,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5710,11 +5748,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5722,6 +5789,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6558,14 +6633,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6627,11 +6694,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6995,6 +7062,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7083,17 +7154,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7430,7 +7510,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8086,7 +8166,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9170,11 +9250,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9182,11 +9267,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9401,6 +9486,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9447,6 +9533,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9824,11 +9917,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9866,11 +9967,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9896,10 +9997,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9908,11 +10005,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9931,6 +10028,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -9994,7 +10099,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10030,6 +10135,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10152,6 +10261,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10198,11 +10314,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10322,6 +10438,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10362,6 +10482,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10370,7 +10494,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10394,6 +10518,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10462,6 +10592,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10510,7 +10644,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11376,6 +11510,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11399,6 +11537,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11576,6 +11740,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11763,6 +11933,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11783,6 +11958,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12002,6 +12182,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
index e5e5e91d65..7be793ffd2 100644
--- a/editor/translations/pl.po
+++ b/editor/translations/pl.po
@@ -5,8 +5,8 @@
# 8-bit Pixel <dawdejw@gmail.com>, 2016.
# Adam Wolanski <adam.wolanski94@gmail.com>, 2017.
# Adrian Węcławski <weclawskiadrian@gmail.com>, 2016.
-# aelspire <aelspire@gmail.com>, 2017, 2019.
-# Daniel Lewan <vision360.daniel@gmail.com>, 2016-2018.
+# aelspire <aelspire@gmail.com>, 2017, 2019, 2020.
+# Daniel Lewan <vision360.daniel@gmail.com>, 2016-2018, 2020.
# Dariusz Król <rexioweb@gmail.com>, 2018.
# heya10 <igor.gielzak@gmail.com>, 2017.
# holistyczny interlokutor <jakubowesmieci@gmail.com>, 2017.
@@ -16,17 +16,17 @@
# Karol Walasek <coreconviction@gmail.com>, 2016.
# Maksymilian Świąć <maksymilian.swiac@gmail.com>, 2017-2018.
# Mietek Szcześniak <ravaging@go2.pl>, 2016.
-# NeverK <neverkoxu@gmail.com>, 2018, 2019.
-# Rafal Brozio <rafal.brozio@gmail.com>, 2016, 2019.
+# NeverK <neverkoxu@gmail.com>, 2018, 2019, 2020.
+# Rafal Brozio <rafal.brozio@gmail.com>, 2016, 2019, 2020.
# Rafał Ziemniak <synaptykq@gmail.com>, 2017.
-# RM <synaptykq@gmail.com>, 2018.
+# RM <synaptykq@gmail.com>, 2018, 2020.
# Sebastian Krzyszkowiak <dos@dosowisko.net>, 2017.
-# Sebastian Pasich <sebastian.pasich@gmail.com>, 2017, 2019.
+# Sebastian Pasich <sebastian.pasich@gmail.com>, 2017, 2019, 2020.
# siatek papieros <sbigneu@gmail.com>, 2016.
-# Zatherz <zatherz@linux.pl>, 2017.
+# Zatherz <zatherz@linux.pl>, 2017, 2020.
# Tomek <kobewi4e@gmail.com>, 2018, 2019, 2020.
# Wojcieh Er Zet <wojcieh.rzepecki@gmail.com>, 2018.
-# Dariusz Siek <dariuszynski@gmail.com>, 2018, 2019.
+# Dariusz Siek <dariuszynski@gmail.com>, 2018, 2019, 2020.
# Szymon Nowakowski <smnbdg13@gmail.com>, 2019.
# Nie Powiem <blazek10@tlen.pl>, 2019.
# Sebastian Hojka <sibibibi1@gmail.com>, 2019.
@@ -38,12 +38,18 @@
# Myver <igormakarowicz@gmail.com>, 2019.
# Maciej Chamera <chameramaciej@gmail.com>, 2019.
# Cezary Stasiak <cezary.p.stasiak@gmail.com>, 2019.
+# Jan Ligudziński <jan.ligudzinski@gmail.com>, 2020.
+# Adam Jagoda <kontakt@lukasz.xyz>, 2020.
+# Filip Glura <mcmr.slendy@gmail.com>, 2020.
+# Roman Skiba <romanskiba0@gmail.com>, 2020.
+# Piotr Grodzki <ziemniakglados@gmail.com>, 2020.
+# Dzejkop <jakubtrad@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
-"Last-Translator: Tomek <kobewi4e@gmail.com>\n"
+"PO-Revision-Date: 2020-09-22 03:23+0000\n"
+"Last-Translator: Zatherz <zatherz@linux.pl>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
"godot/pl/>\n"
"Language: pl\n"
@@ -52,7 +58,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -67,8 +73,7 @@ msgstr "Oczekiwano ciągu znaków o długości 1 (znaku)."
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
-"Niewystarczająca ilość bajtów dla bajtów dekodujących, albo zły format."
+msgstr "Niewystarczająca ilość bajtów dla bajtów dekodujących lub zły format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -77,7 +82,7 @@ msgstr "Niewłaściwe dane %i (nie przekazane) w wyrażeniu"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
-"self nie może być użyte ponieważ instancja jest równa zeru (nie przekazano)"
+"self nie może być użyte, ponieważ instancja jest nullem (nie przekazano)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -177,11 +182,11 @@ msgstr "Usuń klucze animacji"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "Zmiana czasu klatki kluczowej"
+msgstr "Zmień wartość czasu klatki kluczowej"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "Zmiana przejścia"
+msgstr "Przejście zmiany animacji"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
@@ -242,7 +247,7 @@ msgstr "Ścieżka krzywej Béziera"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr "Ścieżka audio"
+msgstr "Ścieżka dźwiękowa"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
@@ -344,12 +349,12 @@ msgstr "Przytnij"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr "Zawiń"
+msgstr "Zawiń pętlę interpolacji"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Wstaw klucz"
+msgstr "Wprowadź klucz"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
@@ -361,7 +366,7 @@ msgstr "Usuń klucz(e)"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
-msgstr "Zmień tryb zmiany animacji"
+msgstr "Zmień sposób aktualizacji animacji"
#: editor/animation_track_editor.cpp
msgid "Change Animation Interpolation Mode"
@@ -381,7 +386,7 @@ msgstr "Utworzyć NOWĄ ścieżkę dla %s i wstawić klucz?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "Utworzyć %d NOWYCH ścieżek i wstawić klucze?"
+msgstr "Utworzyć %d NOWYCH ścieżek i dodać klatki kluczowe?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -562,6 +567,7 @@ msgid "Seconds"
msgstr "sekund"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "klatek na sekundę"
@@ -706,7 +712,7 @@ msgstr "Zmień rozmiar Tablicy"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr "Zmień Typ Tablicy"
+msgstr "Zmień typ wartości tablicy"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
@@ -721,8 +727,8 @@ msgid "Line Number:"
msgstr "Numer linii:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Zastąpiono %d wystąpień."
+msgid "%d replaced."
+msgstr "%d zamieniono."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -740,7 +746,7 @@ msgstr "Uwzględnij wielkość liter"
msgid "Whole Words"
msgstr "Całe słowa"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Zastąp"
@@ -790,6 +796,10 @@ msgid "Method in target node must be specified."
msgstr "Metoda w węźle docelowym musi zostać podana."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Nazwa metody musi być poprawnym identyfikatorem."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -872,7 +882,6 @@ msgstr "Nie można połączyć sygnału"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -929,6 +938,11 @@ msgid "Signals"
msgstr "Sygnały"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtruj kafelki"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Na pewno chcesz usunąć wszystkie połączenia z tego sygnału?"
@@ -966,7 +980,7 @@ msgid "Recent:"
msgstr "Ostatnie:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Szukaj:"
@@ -1124,7 +1138,7 @@ msgstr "Zasoby bez jawnych właścicieli:"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Key"
-msgstr "Zmień klucz tablicy"
+msgstr "Zmień klucz słownika"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Value"
@@ -1146,6 +1160,9 @@ msgstr "Założyciele projektu"
msgid "Lead Developer"
msgstr "Deweloper naczelny"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Menedżer projektu "
@@ -1167,6 +1184,14 @@ msgid "Gold Sponsors"
msgstr "Złoci sponsorzy"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Srebrni sponsorzy"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Brązowi sponsorzy"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini-sponsorzy"
@@ -1289,7 +1314,7 @@ msgstr "Przełącz ominięcie efektów w magistrali audio"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr "Wybierz szynę wysyłki audio"
+msgstr "Wybierz przesył magistrali audio"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
@@ -1474,7 +1499,7 @@ msgstr "Przemieść Autoload"
msgid "Remove Autoload"
msgstr "Usuń Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Włącz"
@@ -1482,17 +1507,9 @@ msgstr "Włącz"
msgid "Rearrange Autoloads"
msgstr "Przestaw Autoloady"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Niepoprawna ścieżka."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Plik nie istnieje."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Nie znaleziono w ścieżce zasobów."
+msgid "Can't add autoload:"
+msgstr "Nie można dodać Autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1519,6 +1536,10 @@ msgstr "Nazwa"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Wklej parametry"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Aktualizowanie Sceny"
@@ -1646,16 +1667,17 @@ msgid "Scene Tree Editing"
msgstr "Edycja drzewa sceny"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Dok importowania"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Dok węzła"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Doki systemu plików i importowania"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "System plików"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Dok importowania"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1804,7 +1826,7 @@ msgstr "Pokaż w menedżerze plików"
msgid "New Folder..."
msgstr "Utwórz katalog..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Odśwież"
@@ -1862,11 +1884,11 @@ msgstr "Przełącz ukryte pliki"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "Ustaw jako ulubione"
+msgstr "Przełącz ulubione"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr "Przełącz tryby"
+msgstr "Przełącz tryb"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
@@ -1874,11 +1896,11 @@ msgstr "Przejdź do wprowadzania ścieżki"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "Przesuń Ulubiony w górę"
+msgstr "Przesuń ulubiony w górę"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "Przesuń Ulubiony w dół"
+msgstr "Przesuń ulubiony w dół"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
@@ -1918,7 +1940,7 @@ msgstr "Katalogi i pliki:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Podgląd:"
@@ -2126,7 +2148,7 @@ msgstr "Wyczyść"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr "Wyczyść dane wyjściowe"
+msgstr "Wyczyść wyjście"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2354,12 +2376,6 @@ msgid "There is no defined scene to run."
msgstr "Nie ma zdefiniowanej sceny do uruchomienia."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Aktualna scena nie została zapisana, proszę zapisać scenę przed "
-"uruchomieniem."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Nie można było uruchomić podprocesu!"
@@ -2444,12 +2460,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Nie można przeładować sceny która nie została zapisana."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Przywróć"
+msgid "Reload Saved Scene"
+msgstr "Przywróć zapisaną scenę"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Tego nie można cofnąć. Przywrócić mimo to?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Aktualna scena ma niezapisane zmiany.\n"
+"Przywrócić zapisaną scenę tak czy inaczej? Ta akcja nie może zostać cofnięta."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2736,10 +2756,6 @@ msgid "Redo"
msgstr "Ponów"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Przywróć scenę"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Różne narzędzia dla scen lub projektu."
@@ -2799,24 +2815,28 @@ msgstr "Uruchom z użyciem zdalnego debugowania"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Podczas eksportu lub uruchomienia, aplikacja wynikowa spróbuje połączyć się "
-"z adresem IP tego komputera w celu debugowania."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Testuj z sieciowym systemem plików"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Gdy ta opcja jest zaznaczona, eksportowanie utworzy jak najmniejszy plik "
"wykonywalny.\n"
@@ -2829,9 +2849,10 @@ msgid "Visible Collision Shapes"
msgstr "Widoczne kształty kolizji"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Kształty kolizji i promienie raycast (2D i 3D) będą widoczne, jeśli ta opcja "
"będzie zaznaczona."
@@ -2841,41 +2862,49 @@ msgid "Visible Navigation"
msgstr "Widoczna nawigacja"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Kształty i poligony nawigacyjne będą widoczne, jeśli ta opcja będzie "
"zaznaczona."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Synchronizuj zmiany w scenie"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"Wszelkie zmiany sceny w edytorze będą odtworzone w uruchomionej grze na "
-"urządzeniu zdalnym. Opcja ta działa szybciej na sieciowych systemach plików."
+"Kiedy ta opcja jest włączona, wszystkie zmiany na scenie w edytorze będą "
+"powtórzone w uruchomionej grze.\n"
+"Kiedy używane zdalnie na urządzeniu, ta opcja jest wydajniejsza w sieciowym "
+"systemie plików."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Synchronizuj zmiany skryptów"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"Wszelkie zmiany skryptów będą synchronizowane z urządzeniem zdalnym "
-"(działające instancje będą zrestartowane). Opcja ta działa szybciej z "
-"użyciem sieciowych systemów plików."
+"Kiedy ta opcja jest włączona, każdy zapisany skrypt będzie przeładowany w "
+"uruchomionej grze.\n"
+"Kiedy używane zdalnie na urządzeniu, ta opcja jest wydajniejsza w sieciowym "
+"systemie plików."
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
@@ -2899,7 +2928,7 @@ msgstr "Zrzuty ekranu są przechowywane w folderze danych/ustawień edytora."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Pełny ekran"
+msgstr "Przełącz pełny ekran"
#: editor/editor_node.cpp
msgid "Toggle System Console"
@@ -2934,7 +2963,7 @@ msgstr "Pomoc"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Szukaj"
@@ -2948,8 +2977,12 @@ msgid "Q&A"
msgstr "Pytania i odpowiedzi"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Lista problemów"
+msgid "Report a Bug"
+msgstr "Zgłoś błąd"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Wyślij opinię o dokumentacji"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3087,7 +3120,7 @@ msgstr "Szablonowy pakiet"
#: editor/editor_node.cpp
msgid "Export Library"
-msgstr "Wyeksportuj biblioteke"
+msgstr "Wyeksportuj bibliotekę"
#: editor/editor_node.cpp
msgid "Merge With Existing"
@@ -3103,7 +3136,7 @@ msgstr "Nowa dziedzicząca scena"
#: editor/editor_node.cpp
msgid "Load Errors"
-msgstr "Wczytaj błędy"
+msgstr "Błędy wczytywania"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
@@ -3200,7 +3233,7 @@ msgstr "Klatka %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr "Klatki Fizyki %"
+msgstr "Klatka fizyki %"
#: editor/editor_profiler.cpp
msgid "Inclusive"
@@ -3346,9 +3379,11 @@ msgid "Add Key/Value Pair"
msgstr "Dodaj parę klucz/wartość"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Nie znaleziono możliwego do uruchomienia profilu eksportu dla tej "
"platformy.\n"
@@ -3378,6 +3413,12 @@ msgstr "Nie można uruchomić skryptu:"
msgid "Did you forget the '_run' method?"
msgstr "Zapomniano metody \"_run\"?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Przytrzyma Ctrl, by zaokrąglić do liczb całkowitych. Przytrzymaj Shift dla "
+"bardziej precyzyjnych zmian."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Wybierz węzły do importu"
@@ -3619,7 +3660,7 @@ msgstr ""
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr "Nie można przenieść/zmienić nazwy źródłowego zasobu."
+msgstr "Nie można przenieść/zmienić nazwy korzenia zasobów."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
@@ -3926,11 +3967,11 @@ msgstr "Importuj oddzielnie obiekty i animacje"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr "Importuj wraz z Oddzielnymi Materiałami i Animacjami"
+msgstr "Zaimportuj osobno Materiały+Animacje"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "Importuj wraz z Oddzielnymi Obiektami, Materiałami i Animacjami"
+msgstr "Zaimportuj osobno Obiekty+Materiały+Animacje"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
@@ -3976,10 +4017,18 @@ msgid "Error running post-import script:"
msgstr "Błąd podczas uruchamiania skryptu po imporcie:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "Czy zwracasz obiekt dziedziczący po Node w metodzie `post_import()`?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Zapisywanie..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d plików"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Ustaw jako domyślne dla \"%s\""
@@ -3988,10 +4037,6 @@ msgid "Clear Default for '%s'"
msgstr "Usuń domyślne dla \"%s\""
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Pliki"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importuj jako:"
@@ -4004,8 +4049,8 @@ msgid "Reimport"
msgstr "Importuj ponownie"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Zapisz sceny, re-importuj i zrestartuj"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Zapisz sceny, reimportuj i uruchom ponownie"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4040,10 +4085,6 @@ msgid "Copy Params"
msgstr "Kopiuj parametry"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Wklej parametry"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Edytuj schowek zasobów"
@@ -4053,11 +4094,11 @@ msgstr "Kopiuj zasób"
#: editor/inspector_dock.cpp
msgid "Make Built-In"
-msgstr "Skrypt wbudowany"
+msgstr "Stwórz wbudowany"
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr "Utwórz unikalne pod-zasoby"
+msgstr "Utwórz unikalne podzasoby"
#: editor/inspector_dock.cpp
msgid "Open in Help"
@@ -4479,7 +4520,7 @@ msgstr "Zmień nazwę animacji"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
-msgstr "Mieszaj następną zmienioną"
+msgstr "Zmieszaj kolejną po zmianach"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
@@ -4519,7 +4560,7 @@ msgstr "Odtwórz zaznaczoną animację od tyłu z aktualnej pozycji. (A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "Odtwarzaj zaznaczoną animację od końca. (Shift+A)"
+msgstr "Odtwórz zaznaczoną animację od tyłu z końca. (Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
@@ -4583,7 +4624,7 @@ msgstr "Poprzedni"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Future"
-msgstr "Przyszłość"
+msgstr "Następny"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Depth"
@@ -4864,7 +4905,7 @@ msgstr "Węzeł Skalowania Czasu"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeSeek Node"
-msgstr "Węzeł TimeSeek"
+msgstr "Węzeł Przewijania w Czasie"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
@@ -4941,8 +4982,7 @@ msgstr "Przekroczenie czasu."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
msgstr ""
-"Zły hash pobranego pliku. Zakładamy, że ktoś przy nim majstrował, lub został "
-"niepoprawnie pobrany."
+"Zła suma kontrolna pobranego pliku. Zakładamy, że ktoś przy nim majstrował."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
@@ -5042,7 +5082,7 @@ msgstr "Wszystko"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr "Brak rezultatów dla \"%s\"."
+msgstr "Brak wyników dla \"%s\"."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Import..."
@@ -5114,7 +5154,7 @@ msgid "Bake Lightmaps"
msgstr "Stwórz Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Podgląd"
@@ -5395,12 +5435,12 @@ msgstr "Alt+Przeciągnij: Przesuń"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
msgstr ""
-"Wciśnij \"v\" by zmienić punkt zaczepienia (pivot), \"Shift+v\" by przesunąć "
+"Wciśnij \"V\" by zmienić punkt zaczepienia (pivot), \"Shift+V\" by przesunąć "
"punkt zaczepienia (podczas poruszania)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+PPM: Lista obiektów pod spodem"
+msgstr "Alt+PPM: Wybór listy głębi"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5410,7 +5450,7 @@ msgstr "Tryb przesuwania"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Tryb Rotacji"
+msgstr "Tryb obrotu"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5550,7 +5590,7 @@ msgstr "Widok"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
-msgstr "Zawsze pokaż siatkę"
+msgstr "Zawsze pokazuj siatkę"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
@@ -5697,7 +5737,7 @@ msgstr "Edytuj wielokąt (usuń punkty)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
-msgstr "Ustaw Uchwyt"
+msgstr "Ustaw uchwyt"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5868,12 +5908,12 @@ msgid "Mesh is empty!"
msgstr "Siatka jest pusta!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Stwórz Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Nie udało się utworzyć kształtu trójsiatki."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Stwórz statycznych ciało wypukłe"
+msgid "Create Static Trimesh Body"
+msgstr "Stwórz Static Trimesh Body"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5884,12 +5924,31 @@ msgid "Create Trimesh Static Shape"
msgstr "Utwórz statyczny kształt trójsiatki"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Tworzenie kształtów nieudane!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+"Nie można utworzyć pojedynczego wypukłego kształtu kolizji dla korzenia "
+"sceny."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Nie udało się utworzyć pojedynczego wypukłego kształtu kolizji."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Utwórz pojedynczy wypukły kształt"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Nie można utworzyć wielu wypukłych kształtów kolizji dla korzenia sceny."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Nie udało się utworzyć żadnego kształtu kolizji."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Utwórz kształt wypukły"
+msgid "Create Multiple Convex Shapes"
+msgstr "Utwórz wiele wypukłych kształtów"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5940,18 +5999,68 @@ msgid "Create Trimesh Static Body"
msgstr "Utwórz statyczne ciało trójsiatki"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Tworzy węzeł StaticBody i automatycznie przypisuje mu kształt kolizji oparty "
+"na wielokątach.\n"
+"To jest najdokładniejsza (ale najwolniejsza) opcja do detekcji kolizji."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Utwórz sąsiadującą trójsiatkę kolizji"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Utwórz wypukłego sąsiada kolizji"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Tworzy kształt kolizji oparty na wielokątach.\n"
+"To jest najdokładniejsza (ale najwolniejsza) opcja do detekcji kolizji."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Utwórz pojedynczego wypukłego sąsiada kolizji"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Tworzy pojedynczy wypukły kształt kolizji.\n"
+"To jest najszybsza (ale najmniej dokładna) opcja dla detekcji kolizji."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Utwórz wiele wypukłych sąsiadów kolizji"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Tworzy kształt kolizji oparty o wielokąty.\n"
+"To jest złoty środek względem wydajności powyższych dwóch opcji."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Utwórz siatkę zarysu..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Tworzy statyczną siatkę obwódki. Siatka obwódki ma automatycznie odwrócone "
+"normalne.\n"
+"To może zostać użyte zamiast właściwości Grow w SpatialMaterial kiedy "
+"używanie tej właściwości jest niemożliwe."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Widok UV1"
@@ -6798,14 +6907,6 @@ msgid "Open Godot online documentation."
msgstr "Otwórz dokumentację Godota online."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Poproś o dokumentację"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Pomóż polepszyć dokumentację Godota przesyłając opinię."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Poszukaj w dokumentacji referencyjnej."
@@ -6871,12 +6972,12 @@ msgstr ""
"\"%s\"."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Linia"
+msgid "[Ignore]"
+msgstr "[Ignoruj]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignoruj)"
+msgid "Line"
+msgstr "Linia"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6910,7 +7011,7 @@ msgstr "Wielkie litery"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Lowercase"
-msgstr "Małe Litery"
+msgstr "Małe litery"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
@@ -6986,7 +7087,7 @@ msgstr "Wylicz wyrażenie"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "Przytnij końcowe spacje"
+msgstr "Przytnij końcowe białe znaki"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
@@ -7242,6 +7343,10 @@ msgid "This operation requires a single selected node."
msgstr "Ta operacja wymaga pojedynczego wybranego węzła."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Automatyczna ortogonalizacja włączona"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Zablokuj obrót widoku"
@@ -7315,7 +7420,7 @@ msgstr "\"Wolny widok\" w tył"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "\"Wolny widok\" w góre"
+msgstr "\"Wolny widok\" w górę"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
@@ -7330,6 +7435,10 @@ msgid "Freelook Slow Modifier"
msgstr "Wolny modyfikator swobodnego widoku"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Obroty widoku zablokowane"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7338,14 +7447,25 @@ msgstr ""
"Nie może być używana jako miarodajny wskaźnik wydajności w grze."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Obroty widoku zablokowane"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Okno dialogowe XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Kliknij, by przełączyć pomiędzy stanami widoczności.\n"
+"\n"
+"Otwarte oko: uchwyt jest widzialny.\n"
+"Zamknięte oko: uchwyt jest ukryty.\n"
+"Półotwarte oko: uchwyt jest również widoczny przez nieprzezroczyste "
+"powierzchnie (\"x-ray\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Przyciągnij węzły do podłogi"
@@ -7438,7 +7558,7 @@ msgstr "2 widoki"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr "2 widoki (Alt)"
+msgstr "2 widoki (alternatywnie)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
@@ -7446,7 +7566,7 @@ msgstr "3 widoki"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr "3 widoki (Alt)"
+msgstr "3 widoki (alternatywnie)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
@@ -7683,7 +7803,8 @@ msgid "New Animation"
msgstr "Nowa animacja"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Prędkość (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7971,7 +8092,7 @@ msgstr "Wypełnienie"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
-msgstr "Wyczyść TileMap"
+msgstr "Usuń TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Find Tile"
@@ -8360,7 +8481,7 @@ msgstr "TileSet"
msgid "No VCS addons are available."
msgstr "Brak dostępnych dodatków VCS."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Błąd"
@@ -8726,7 +8847,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr "Parametr wejściowy \"%s\" dla dla fragmentowego i światłowego shadera."
+msgstr "Parametr wejściowy \"%s\" dla fragmentowego i światłowego shadera."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
@@ -9426,16 +9547,16 @@ msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Filtry do eksportowania plików/folderów nie będących zasobami (oddzielone "
-"przecinkami, np. *.json, *.txt)"
+"Filtry do eksportowania plików/folderów nie będących zasobami\n"
+"(oddzielone przecinkami, np. *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Filtry do wykluczenia plików/folderów z projektu (rozdzielone przecinkami, "
-"np. *.json, *.txt)"
+"Filtry do wykluczenia plików/folderów z projektu\n"
+"(oddzielone przecinkami, np. *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
@@ -9451,7 +9572,7 @@ msgstr "Plik paczki"
#: editor/project_export.cpp
msgid "Features"
-msgstr "Funkcjonalności"
+msgstr "Funkcje"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
@@ -9526,25 +9647,30 @@ msgid "Export With Debug"
msgstr "Eksport z debugowaniem"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Ścieżka nie istnieje."
+msgid "The path specified doesn't exist."
+msgstr "Podana ścieżka nie istnieje."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Błąd otwierania pliku pakietu (nie jest w formacie ZIP)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"Niewłaściwy projekt pliku \".zip\", nie zawiera pliku \"project.godot\"."
+"Niewłaściwy plik \".zip\" projektu; nie zawiera pliku \"project.godot\"."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Proszę wybrać pusty folder."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr "Proszę wybrać plik \"project.godot\" lub \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "Folder już zawiera projekt Godota."
+msgid "This directory already contains a Godot project."
+msgstr "Ten folder już zawiera projekt Godota."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9805,6 +9931,7 @@ msgstr ""
"projektów Godota?\n"
"To może chwilę zająć."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Menedżer projektów"
@@ -9853,6 +9980,17 @@ msgstr ""
"Nie posiadasz obecnie żadnych projektów.\n"
"Czy chcesz zobaczyć oficjalne przykładowe projekty w Bibliotece Zasobów?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Pasek wyszukiwania filtruje projekty po nazwie i ostatnim komponencie "
+"ścieżki.\n"
+"By filtrować po nazwie i pełnej ścieżce, zapytanie musi zawierać "
+"przynajmniej jeden znak \"/\"."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Klawisz "
@@ -10234,14 +10372,25 @@ msgid "Batch Rename"
msgstr "Grupowa zmiana nazwy"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Zastąp: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Przedrostek"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Przyrostek"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Użyj wyrażeń regularnych"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Opcje zaawansowane"
@@ -10278,11 +10427,12 @@ msgstr ""
"Porównaj opcje licznika."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "Poziomowy licznik"
+msgid "Per-level Counter"
+msgstr "Oddzielny licznik na poziom"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Gdy ustawione, licznik restartuje dla każdej grupy węzłów potomnych"
#: editor/rename_dialog.cpp
@@ -10310,10 +10460,6 @@ msgstr ""
"Brakujące cyfry są wyrównywane zerami poprzedzającymi."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Wyrażenia regularne"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Przetwarzanie końcowe"
@@ -10322,12 +10468,12 @@ msgid "Keep"
msgstr "Bez zmian"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase na under_scored"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase na snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored na CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case na PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10345,6 +10491,15 @@ msgstr "Na wielkie litery"
msgid "Reset"
msgstr "Resetuj"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Błąd wyrażenia regularnego"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Przy znaku %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Zmień nadrzędny węzeł"
@@ -10410,8 +10565,8 @@ msgid "Instance Child Scene"
msgstr "Dodaj instancję sceny"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Usuń skrypt"
+msgid "Detach Script"
+msgstr "Odłącz skrypt"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10448,6 +10603,10 @@ msgid "Make node as Root"
msgstr "Zmień węzeł na Korzeń"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Usunąć %d węzłów i ich węzły potomne?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Usunąć %d węzłów?"
@@ -10529,7 +10688,7 @@ msgstr "Nie można działać na węzłach z których dziedziczy obecna scena!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr "Dodaj skrypt"
+msgstr "Dołącz skrypt"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
@@ -10576,6 +10735,16 @@ msgid "Open Documentation"
msgstr "Otwórz dokumentację"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Nie można dołączyć skryptu: brak zarejestrowanych języków.\n"
+"To prawdopodobnie przez to, że ten edytor został zbudowany z wyłączonymi "
+"wszystkimi modułami języków."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Dodaj węzeł"
@@ -10624,12 +10793,12 @@ msgstr ""
"główny nie istnieje."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr "Dołącz nowy lub istniejący skrypt do zaznaczonego węzła."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Wyczyść skrypt dla zaznaczonego węzła."
+msgid "Detach the script from the selected node."
+msgstr "Odłącz skrypt z zaznaczonego węzła."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10668,7 +10837,7 @@ msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
-"Węzeł posiada %s połączeń i %s grup.\n"
+"Węzeł posiada %s połączeń i %s grup.\n"
"Kliknij, aby wyświetlić panel sygnałów."
#: editor/scene_tree_editor.cpp
@@ -10760,6 +10929,10 @@ msgid "A directory with the same name exists."
msgstr "Katalog o tej nazwie już istnieje."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Plik nie istnieje."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Niepoprawne rozszerzenie."
@@ -10800,6 +10973,10 @@ msgid "File exists, it will be reused."
msgstr "Plik istnieje, zostanie użyty ponownie."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Niepoprawna ścieżka."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Niepoprawna nazwa klasy."
@@ -10808,8 +10985,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Nieprawidłowa nazwa lub ścieżka klasy bazowej."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Skrypt jest prawidłowy."
+msgid "Script path/name is valid."
+msgstr "Ścieżka/nazwa skryptu jest prawidłowa."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10832,6 +11009,14 @@ msgid "Script file already exists."
msgstr "Plik skryptu już istnieje."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Uwaga: wbudowane skrypty posiadają pewne ograniczenia i nie mogą być "
+"edytowane przy użyciu zewnętrznego edytora."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Nazwa klasy:"
@@ -10900,6 +11085,10 @@ msgid "Copy Error"
msgstr "Kopiuj błąd"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Wideo RAM"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Pomiń punkty wstrzymania"
@@ -10948,8 +11137,8 @@ msgid "Total:"
msgstr "Całkowity:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Pamięć wideo"
+msgid "Export list to a CSV file"
+msgstr "Eksportuj listę do pliku CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11704,15 +11893,15 @@ msgstr "Znajdź typ węzła"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr "Skopiuj Węzeł"
+msgstr "Skopiuj węzły"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr "Wytnij Węzły"
+msgstr "Wytnij węzły"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Function"
-msgstr "Zmień na funkcję"
+msgstr "Zamień na funkcję"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
@@ -11834,6 +12023,11 @@ msgstr ""
"eksportu."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Wydaniowy keystore jest niepoprawnie skonfigurowany w profilu eksportu."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Własny build wymaga poprawnej ścieżki do SDK Androida w Ustawieniach Edytora."
@@ -11862,6 +12056,40 @@ msgstr "Niepoprawna nazwa paczki:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Niepoprawny moduł \"GodotPaymentV3\" załączony w ustawieniu projektu "
+"\"android/modules\" (zmieniony w Godocie 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "\"Use Custom Build\" musi być włączone, by używać wtyczek."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" jest poprawne tylko gdy \"Xr Mode\" jest \"Oculus "
+"Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" jest poprawne tylko gdy \"Xr Mode\" jest \"Oculus Mobile VR"
+"\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" jest poprawne tylko gdy \"Xr Mode\" jest \"Oculus Mobile "
+"VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12075,6 +12303,15 @@ msgstr ""
"Kształt jest niezbędny do działania CollisionShape2D. Proszę utworzyć zasób "
"Shape!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Kształty oparte na wielokątach nie są przystosowane, by ich używać lub "
+"edytować bezpośrednio przez węzeł CollisionShape2D. Zamiast tego użyj węzła "
+"CollisionPolygon2D."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12313,6 +12550,13 @@ msgstr ""
"Kształty płaszczyzny nie działają dobrze i zostaną usunięte w przyszłych "
"wersjach. Nie używaj ich."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape nie obsługuje węzła RigidBody w innym trybie niż "
+"statyczny."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Nie została przypisana żadna siatka, więc nic się nie pojawi."
@@ -12337,6 +12581,11 @@ msgstr ""
"GIProbes nie są obsługiwane przez sterownik wideo GLES2.\n"
"Zamiast tego użyj BakedLightmap."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr "SpotLight z kątem szerszym niż 90 stopni nie może rzucać cieni."
@@ -12608,6 +12857,10 @@ msgstr ""
"otrzymał jakiś rozmiar. W przeciwnym wypadku ustawi opcję RenderTarget i "
"przyporządkuj jego teksturę dla któregoś węzła."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "Rozmiar węzła Viewport musi być większy niż 0, by coś wyrenderować."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Nieprawidłowe źródło do podglądu."
@@ -12636,6 +12889,54 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchołków."
msgid "Constants cannot be modified."
msgstr "Stałe nie mogą być modyfikowane."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Doki systemu plików i importowania"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Podczas eksportu lub uruchomienia, aplikacja wynikowa spróbuje połączyć "
+#~ "się z adresem IP tego komputera w celu debugowania."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Aktualna scena nie została zapisana, proszę zapisać scenę przed "
+#~ "uruchomieniem."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Nie znaleziono w ścieżce zasobów."
+
+#~ msgid "Revert"
+#~ msgstr "Przywróć"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Tego nie można cofnąć. Przywrócić mimo to?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Przywróć scenę"
+
+#~ msgid "Clear Script"
+#~ msgstr "Usuń skrypt"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Lista problemów"
+
+#~ msgid "Request Docs"
+#~ msgstr "Poproś o dokumentację"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Pomóż polepszyć dokumentację Godota przesyłając opinię."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Zastąpiono %d wystąpień."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Stwórz statycznych ciało wypukłe"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Tworzenie kształtów nieudane!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/pr.po b/editor/translations/pr.po
index e77bf47b81..d1b82cffe6 100644
--- a/editor/translations/pr.po
+++ b/editor/translations/pr.po
@@ -5,12 +5,13 @@
# Calum Knott <calum@calumk.com>, 2017.
# Zion Nimchuk <zionnimchuk@gmail.com>, 2016-2017.
# Allan Nordhøy <epost@anotheragency.no>, 2018.
+# David Fatheree <david.fathereewcchs@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-12-13 14:42+0100\n"
-"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: David Fatheree <david.fathereewcchs@gmail.com>\n"
"Language-Team: Pirate <https://hosted.weblate.org/projects/godot-engine/"
"godot/pr/>\n"
"Language: pr\n"
@@ -18,7 +19,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: Poedit 2.2\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -29,7 +30,7 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Expected a strin' o' length 1 (a character)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -39,19 +40,17 @@ msgstr "Nah enough bytes fer decodin' bytes, or ye got th' wrong ship."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Shiver me timbers! Ye input %i (not passed) in ye expression!"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
msgstr "Yer index property name '%s' in node %s be walkin' th' plank!"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
msgstr "Yer index property name '%s' in node %s be walkin' th' plank!"
@@ -102,11 +101,11 @@ msgstr ""
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Smooth Sailin'"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "See'in Double"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -537,6 +536,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -698,7 +698,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -717,7 +717,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -767,6 +767,11 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Yer name's got no valid identifier:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -851,7 +856,6 @@ msgstr "Slit th' Node"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -911,6 +915,11 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Paste yer Node"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -950,7 +959,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1124,6 +1133,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1145,6 +1157,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1453,7 +1473,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1461,17 +1481,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr ": Evil arguments: "
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1499,6 +1510,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1625,16 +1640,17 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
#, fuzzy
msgid "Node Dock"
msgstr "Find ye Node Type"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Rename Variable"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1793,7 +1809,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1909,7 +1925,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2329,10 +2345,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2417,11 +2429,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Yar, Blow th' Selected Down!"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2692,10 +2707,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2757,22 +2768,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2781,8 +2796,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2791,32 +2806,33 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "Change"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2879,7 +2895,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2893,7 +2909,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3284,7 +3304,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3311,6 +3332,13 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+#, fuzzy
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Smash yer Ctrl key t' sink yer Getter. Smash yer Shift t' sink a generic "
+"signature."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3923,19 +3951,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+#, fuzzy
+msgid "%d Files"
+msgstr "Edit yer Variable:"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3951,7 +3984,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3987,10 +4020,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -5067,7 +5096,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5826,11 +5855,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5842,11 +5871,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5898,19 +5943,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Yar, Blow th' Selected Down!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6768,14 +6851,6 @@ msgid "Open Godot online documentation."
msgstr "Yer functions:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6839,11 +6914,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7222,6 +7297,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7311,17 +7390,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7670,7 +7758,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8377,7 +8465,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9486,11 +9574,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9498,11 +9591,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9720,6 +9813,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9769,6 +9863,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10152,14 +10253,23 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Swap yer Expression"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr ""
@@ -10195,11 +10305,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10225,11 +10335,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "Regular Expressions"
-msgstr "Swap yer Expression"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10238,11 +10343,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10261,6 +10366,15 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Swap yer Expression"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10324,8 +10438,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Discharge ye' Variable"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10361,6 +10476,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Slit th' Node"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Slit th' Node"
@@ -10486,6 +10606,13 @@ msgid "Open Documentation"
msgstr "Yer functions:"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10535,11 +10662,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10666,6 +10793,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Yer Calligraphy be wrongly sized."
@@ -10709,6 +10840,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr ": Evil arguments: "
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Yer unique name be evil."
@@ -10718,7 +10854,7 @@ msgid "Invalid inherited parent name or path."
msgstr "Yer index property name be thrown overboard!"
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10743,6 +10879,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10819,6 +10961,10 @@ msgid "Copy Error"
msgstr "Slit th' Node"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Yar, Blow th' Selected Down!"
@@ -10869,7 +11015,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11793,6 +11939,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11817,6 +11967,32 @@ msgstr "Yer unique name be evil."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12000,6 +12176,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12187,6 +12369,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12207,6 +12394,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12427,6 +12619,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
diff --git a/editor/translations/pt.po b/editor/translations/pt.po
new file mode 100644
index 0000000000..6b6a15dda7
--- /dev/null
+++ b/editor/translations/pt.po
@@ -0,0 +1,13968 @@
+# Portuguese translation of the Godot Engine editor
+# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
+# This file is distributed under the same license as the Godot source code.
+# António Sarmento <antonio.luis.sarmento@gmail.com>, 2016.
+# Carlos Vieira <carlos.vieira@gmail.com>, 2017.
+# João <joao@nogordio.com>, 2018.
+# João Graça <jgraca95@gmail.com>, 2017.
+# João Lopes <linux-man@hotmail.com>, 2017-2018, 2019, 2020.
+# Miguel Gomes <miggas09@gmail.com>, 2017.
+# Paulo Caldeira <paucal@gmail.com>, 2018.
+# Pedro Gomes <pedrogomes1698@gmail.com>, 2017.
+# Rueben Stevens <supercell03@gmail.com>, 2017.
+# SARDON <fabio3_Santos@hotmail.com>, 2017.
+# Vinicius Gonçalves <viniciusgoncalves21@gmail.com>, 2017.
+# ssantos <ssantos@web.de>, 2018, 2019, 2020.
+# Gonçalo Dinis Guerreiro João <goncalojoao205@gmail.com>, 2019.
+# Manuela Silva <mmsrs@sky.com>, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2020-09-24 12:43+0000\n"
+"Last-Translator: ssantos <ssantos@web.de>\n"
+"Language-Team: Portuguese <https://hosted.weblate.org/projects/"
+"godot-engine/godot/pt/>\n"
+"Language: pt\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.3-dev\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Tipo de argumento inválido para convert(), utilize constantes TYPE_*."
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+msgid "Expected a string of length 1 (a character)."
+msgstr "Esperado uma \"string\" de comprimento 1 (um caráter)."
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+"Número de \"bytes\" insuficientes para descodificar, ou o formato é inválido."
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr "Entrada inválida %i (não passada) na expressão"
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr "self não pode ser usado porque a instância é nula (não passada)"
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr "Operandos inválidos para operador %s, %s e %s."
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr "Índice inválido do tipo %s para tipo base %s"
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr "Índice nomeado '%s' inválido para base tipo %s"
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr "Argumentos inválidos para construir '%s'"
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr "Em chamada para '%s':"
+
+#: core/ustring.cpp
+msgid "B"
+msgstr "B"
+
+#: core/ustring.cpp
+msgid "KiB"
+msgstr "KiB"
+
+#: core/ustring.cpp
+msgid "MiB"
+msgstr "MiB"
+
+#: core/ustring.cpp
+msgid "GiB"
+msgstr "GiB"
+
+#: core/ustring.cpp
+msgid "TiB"
+msgstr "TiB"
+
+#: core/ustring.cpp
+msgid "PiB"
+msgstr "PiB"
+
+#: core/ustring.cpp
+msgid "EiB"
+msgstr "EiB"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Free"
+msgstr "Livre"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr "Equilibrado"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr "Espelho"
+
+#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
+msgid "Time:"
+msgstr "Tempo:"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Value:"
+msgstr "Valor:"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr "Inserir Chave Aqui"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr "Duplicar Chave(s) Selecionada(s)"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr "Apagar Chave(s) Selecionada(s)"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Add Bezier Point"
+msgstr "Adicionar Ponto Bezier"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Move Bezier Points"
+msgstr "Mover Ponto Bezier"
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Anim Duplicar Chaves"
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Anim Eliminar Chaves"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr "Anim Mudar Tempo do Keyframe"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Anim Mudar Transição"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Anim Mudar Transformação"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr "Anim Mudar Valor do Keyframe"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr "Anim Mudar Chamada"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Time"
+msgstr "Anim Multi Mudar Tempo do Keyframe"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transition"
+msgstr "Anim Multi Mudar Transição"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Transform"
+msgstr "Anim Multi Mudar Transformação"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Keyframe Value"
+msgstr "Anim Multi Mudar Valor do Keyframe"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Multi Change Call"
+msgstr "Anim Multi Mudar Chamada"
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Length"
+msgstr "Mudar Duração da Animação"
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr "Mudar Ciclo da Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr "Pista de Propriedades"
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr "Pista de Transformação 3D"
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr "Chamar Pista Método"
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr "Pista Curva Bezier"
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr "Pista de Reprodução de Áudio"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr "Pista de Reprodução de Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (frames)"
+msgstr "Duração da Animação (frames)"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation length (seconds)"
+msgstr "Duração da Animação (segundos)"
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr "Adicionar Pista"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr "Loop da Animação"
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funções:"
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr "Clips Áudio:"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr "Clips Anim:"
+
+#: editor/animation_track_editor.cpp
+msgid "Change Track Path"
+msgstr "Mudar Caminho da Pista"
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr "Alternar esta pista on/off."
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr "Modo Atualização (Como esta propriedade é definida)"
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr "Modo de Interpolação"
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr "Modo Loop Wrap (interpola o fim com o início do loop)"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr "Remover esta Pista."
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr "Tempo (s): "
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle Track Enabled"
+msgstr "Alternar Pista Ativada"
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr "Contínuo"
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr "Discreto"
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr "Gatilho"
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr "Capturar"
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr "Mais próximo"
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr "Linear"
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr "Cúbico"
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr "Prender Interp Loop"
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr "Enrolar Interp Loop"
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Inserir Chave"
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr "Duplicar Chave(s)"
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr "Apagar Chave(s)"
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Update Mode"
+msgstr "Mudar o Modo de Atualização da Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Interpolation Mode"
+msgstr "Mudar o Modo de Interpolação da Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Loop Mode"
+msgstr "Mudar Modo do Loop da Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Remover Pista de Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "Criar NOVA pista para %s e inserir chave?"
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "Criar %d NOVAS pistas e inserir chaves?"
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create"
+msgstr "Criar"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr "Anim Inserir"
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+"AnimationPlayer não se pode animar a ele próprio, apenas a outros "
+"executantes."
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Anim Criar & Inserir"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Anim Inserir Pista & Chave"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Anim Inserir Chave"
+
+#: editor/animation_track_editor.cpp
+msgid "Change Animation Step"
+msgstr "Mudar Passo da Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Rearrange Tracks"
+msgstr "Reorganizar Pistas"
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr "Pistas de Transformação só se aplicam a nós de base Espacial."
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+"Pistas Áudio só podem apontar a nós de tipo:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr "Pistas de Animação só podem apontar a nós AnimationPlayer."
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+"Um reprodutor de animação não se pode animar a ele próprio, apenas a outros "
+"reprodutores."
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr "Não é possível adicionar nova pista sem uma raiz"
+
+#: editor/animation_track_editor.cpp
+msgid "Invalid track for Bezier (no suitable sub-properties)"
+msgstr "Faixa inválida para Bezier (sub-propriedades não apropriadas)"
+
+#: editor/animation_track_editor.cpp
+msgid "Add Bezier Track"
+msgstr "Adicionar Pista Bezier"
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr "Caminho da pista é inválido, não se consegue adicionar uma chave."
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr "Pista não é do tipo Spatial, não consigo inserir chave"
+
+#: editor/animation_track_editor.cpp
+msgid "Add Transform Track Key"
+msgstr "Adicionar Chave da Pista de Transformação"
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track Key"
+msgstr "Adicionar Chave da Pista"
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr "Caminho da pista é inválido, não consigo adicionar uma chave método."
+
+#: editor/animation_track_editor.cpp
+msgid "Add Method Track Key"
+msgstr "Adicionar Chave da Pista Método"
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr "Método não encontrado no objeto: "
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr "Anim Mover Chaves"
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr "Área de Transferência está vazia"
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr "Colar Pistas"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr "Anim Escalar Chaves"
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+"Esta opção não funciona para edição de Bezier, dado que é uma única faixa."
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This animation belongs to an imported scene, so changes to imported tracks "
+"will not be saved.\n"
+"\n"
+"To enable the ability to add custom tracks, navigate to the scene's import "
+"settings and set\n"
+"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks"
+"\", then re-import.\n"
+"Alternatively, use an import preset that imports animations to separate "
+"files."
+msgstr ""
+"Esta animação pertence a uma cena importada; alterações não serão "
+"guardadas.\n"
+"\n"
+"Para ativar a capacidade de adicionar faixas personalizadas, vá à "
+"configuração de importação da cena e defina\n"
+"\"Animação > Armazenamento\" para \"Ficheiros\", ative \"Animação > Manter "
+"Faixas Personalizadas\"; depois reimporte.\n"
+"Em alternativa, use uma predefinição de importação que importe animações "
+"para ficheiros separados."
+
+#: editor/animation_track_editor.cpp
+msgid "Warning: Editing imported animation"
+msgstr "Aviso: A editar animação importada"
+
+#: editor/animation_track_editor.cpp
+msgid "Select an AnimationPlayer node to create and edit animations."
+msgstr "Selecione um nó AnimationPlayer para criar e editar animações."
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr "Apenas mostrar faixas de nós selecionados na árvore."
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr "Agrupar faixas por nó ou exibi-las como lista simples."
+
+#: editor/animation_track_editor.cpp
+msgid "Snap:"
+msgstr "Ajustar:"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr "Valor passo da Animação."
+
+#: editor/animation_track_editor.cpp
+msgid "Seconds"
+msgstr "Segundos"
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "FPS"
+msgstr "FPS"
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr "Editar"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr "Propriedades da Animação."
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr "Copiar Pistas"
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr "Escalar Selecção"
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr "Escalar Partir do Cursor"
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr "Duplicar Seleção"
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr "Duplicar Transposto"
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr "Apagar Seleção"
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr "Ir para Próximo Passo"
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr "Ir para Passo Anterior"
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr "Otimizar Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Limpar Animação"
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr "Escolha o nó que será animado:"
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr "Usar Curvas Bezier"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr "Otimizador de Anim"
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr "Máximo de Erros Lineares:"
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr "Máximo de Erros Angulares:"
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr "Angulo Máximo Otimizável:"
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr "Otimizar"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Remover Chaves inválidas"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr "Remover Pistas vazias ou não resolvidas"
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Limpar todas as Animações"
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr "Limpar Animação(ões) (DEFINITIVO!)"
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr "Limpar"
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr "Proporção de Escala:"
+
+#: editor/animation_track_editor.cpp
+msgid "Select Tracks to Copy"
+msgstr "Selecionar Pistas a Copiar"
+
+#: editor/animation_track_editor.cpp editor/editor_log.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr "Copiar"
+
+#: editor/animation_track_editor.cpp
+msgid "Select All/None"
+msgstr "Selecionar Tudo/Nada"
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Add Audio Track Clip"
+msgstr "Adicionar Clip da Pista Áudio"
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip Start Offset"
+msgstr "Alterar Compensação do Início do Clip da Pista Áudio"
+
+#: editor/animation_track_editor_plugins.cpp
+msgid "Change Audio Track Clip End Offset"
+msgstr "Alterar Compensação do Fim do Clip da Pista Áudio"
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr "Redimensionar Array"
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr "Mudar tipo de valor do Array"
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr "Mudar valor do Array"
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr "Vai para linha"
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr "Numero da linha:"
+
+#: editor/code_editor.cpp
+msgid "%d replaced."
+msgstr "%d substituído."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d match."
+msgstr "%d correspondência."
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "%d matches."
+msgstr "%d correspondências."
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr "Caso de Compatibilidade"
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr "Palavras inteiras"
+
+#: editor/code_editor.cpp
+msgid "Replace"
+msgstr "Substituir"
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr "Substituir todos"
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr "Apenas seleção"
+
+#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
+#: editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Padrão"
+
+#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr "Alternar painel de Scripts"
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr "Aumentar Zoom"
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr "Diminuir Zoom"
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr "Repor Zoom"
+
+#: editor/code_editor.cpp
+msgid "Warnings"
+msgstr "Avisos"
+
+#: editor/code_editor.cpp
+msgid "Line and column numbers."
+msgstr "Números de Linha e Coluna."
+
+#: editor/connections_dialog.cpp
+msgid "Method in target node must be specified."
+msgstr "Método no nó alvo deve ser especificado."
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "O nome do método tem de ser um identificador válido."
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found. Specify a valid method or attach a script to the "
+"target node."
+msgstr ""
+"Método alvo não encontrado. Especifique um método válido ou anexe um script "
+"ao nó de destino."
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Node:"
+msgstr "Conectar ao Nó:"
+
+#: editor/connections_dialog.cpp
+msgid "Connect to Script:"
+msgstr "Conectar ao Script:"
+
+#: editor/connections_dialog.cpp
+msgid "From Signal:"
+msgstr "Do Sinal:"
+
+#: editor/connections_dialog.cpp
+msgid "Scene does not contain any script."
+msgstr "A cena não contém qualquer script."
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr "Adicionar"
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr "Remover"
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr "Adicionar Argumento de chamada extra:"
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr "Argumentos de chamada extra:"
+
+#: editor/connections_dialog.cpp
+msgid "Receiver Method:"
+msgstr "Método Recetor:"
+
+#: editor/connections_dialog.cpp
+msgid "Advanced"
+msgstr "Avançado"
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr "Deferido"
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Defers the signal, storing it in a queue and only firing it at idle time."
+msgstr ""
+"Retarda o sinal, armazena-o numa fila e só a ativar-o em tempo de "
+"inatividade."
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr "Oneshot"
+
+#: editor/connections_dialog.cpp
+msgid "Disconnects the signal after its first emission."
+msgstr "Desconecta o sinal após a primeira emissão."
+
+#: editor/connections_dialog.cpp
+msgid "Cannot connect signal"
+msgstr "Não consigo conectar sinal"
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/version_control_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr "Fechar"
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr "Ligar"
+
+#: editor/connections_dialog.cpp
+msgid "Signal:"
+msgstr "Sinal:"
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr "Ligar '%s' a '%s'"
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr "Desligar '%s' de '%s'"
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr "Desconectar tudo do sinal: '%s'"
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr "Ligar..."
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr "Desligar"
+
+#: editor/connections_dialog.cpp
+msgid "Connect a Signal to a Method"
+msgstr "Conectar Sinal a Método"
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection:"
+msgstr "Editar Conexão:"
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Deseja remover todas as conexões do sinal \"%s\"?"
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr "Sinais"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrar Tiles"
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr "Deseja remover todas as conexões deste sinal?"
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr "Desconectar Tudo"
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr "Editar..."
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr "Ir para Método"
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr "Mudar tipo %s"
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+msgid "Change"
+msgstr "Mudar"
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr "Criar Novo %s"
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr "Favoritos:"
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr "Recente:"
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr "Procurar:"
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr "Correspondências:"
+
+#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
+#: editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr "Descrição:"
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr "Procurar Substituição para:"
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr "Dependências para:"
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+"A cena '%s' está a ser editada.\n"
+"As alterações só terão efeito quando recarregar."
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will only take effect when reloaded."
+msgstr ""
+"Recurso '%s' em uso.\n"
+"As alterações só terão efeito quando recarregar."
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr "Dependências"
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr "Recurso"
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+msgid "Path"
+msgstr "Caminho"
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr "Dependências:"
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr "Reparar"
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr "Editor de dependência"
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr "Procurar Recurso de substituição:"
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr "Abrir"
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr "Proprietários de:"
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (Can't be restored)"
+msgstr "Remover ficheiros selecionados do Projeto? (Sem desfazer)"
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+"Os ficheiros a serem removidos são necessários para que outros recursos "
+"funcionem.\n"
+"Remover mesmo assim? (sem anular)"
+
+#: editor/dependency_editor.cpp
+msgid "Cannot remove:"
+msgstr "Não consigo remover:"
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr "Erro ao carregar:"
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr "Falha no carregamento devido a dependências em falta:"
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr "Abrir De Qualquer Maneira"
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr "Qual ação deve ser tomada?"
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr "Corrigir as dependências"
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr "Erros ao carregar!"
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr "Apagar permanentemente %d itens? (Sem desfazer!)"
+
+#: editor/dependency_editor.cpp
+msgid "Show Dependencies"
+msgstr "Mostra Dependências"
+
+#: editor/dependency_editor.cpp
+msgid "Orphan Resource Explorer"
+msgstr "Explorador de Recursos Órfãos"
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr "Apagar"
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr "Possui"
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr "Recursos sem posse explícita:"
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr "Mudar Chave de Dicionário"
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr "Mudar o valor do dicionário"
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr "Agradecimentos da Comunidade Godot!"
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr "Contribuidores da engine Godot"
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr "Fundadores do Projeto"
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr "Desenvolvedor-chefe"
+
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr "Gestor de Projeto "
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr "Desenvolvedores"
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr "Autores"
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr "Patrocinadores Platina"
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr "Patrocinadores Ouro"
+
+#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Patrocinadores Prata"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Patrocinadores Bronze"
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr "Patrocinadores Mini"
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr "Doadores Gold"
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr "Doadores Silver"
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr "Doadores Bronze"
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr "Doadores"
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr "Licença"
+
+#: editor/editor_about.cpp
+msgid "Third-party Licenses"
+msgstr "Licenças de Terceiros"
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of third-party free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such third-party components with their "
+"respective copyright statements and license terms."
+msgstr ""
+"O Godot Engine conta com várias Bibliotecas abertas e gratuitas de "
+"terceiros, todas compatíveis com os termos da sua licença MIT. A lista "
+"seguinte é uma lista exaustiva de todos esses Componentes de terceiros com "
+"suas respetivas declarações de direitos autorais e termos de licença."
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr "Todos os Componentes"
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr "Componentes"
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr "Licenças"
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in ZIP format."
+msgstr "Erro ao abrir ficheiro comprimido, não está no formato ZIP."
+
+#: editor/editor_asset_installer.cpp
+msgid "%s (Already Exists)"
+msgstr "%s (Já Existe)"
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr "A Descomprimir Ativos"
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr "Falhou a extração dos seguintes Ficheiros do pacote:"
+
+#: editor/editor_asset_installer.cpp
+msgid "And %s more files."
+msgstr "E mais %s ficheiros."
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr "Pacote Instalado com sucesso!"
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr "Sucesso!"
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Contents:"
+msgstr "Conteúdo do Pacote:"
+
+#: editor/editor_asset_installer.cpp editor/editor_node.cpp
+msgid "Install"
+msgstr "Instalar"
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr "Instalador de Pacotes"
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr "Altifalantes"
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr "Adicionar Efeito"
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr "Renomear o barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr "Alterar Volume do Barramento de Áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr "Alternar solo do barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr "Alternar silêncio do barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr "Alternar efeitos bypass do barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr "Selecionar envio do barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr "Adicionar Efeito de barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr "Mover Efeito de Barramento"
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr "Apagar Efeito de Barramento"
+
+#: editor/editor_audio_buses.cpp
+msgid "Drag & drop to rearrange."
+msgstr "Arrastar e largar para reorganizar."
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr "Solo"
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr "Mudo"
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr "Ignorar"
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr "Opções de barramento"
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr "Duplicado"
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr "Repor Volume"
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr "Apagar Efeito"
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr "Áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr "Adicionar barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr "O barramento principal não pode ser removido!"
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr "Apagar barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr "Duplicar barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr "Repor Volume do Barramento"
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr "Mover barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr "Guardar Modelo do barramento de áudio como..."
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr "Localização para o Novo Modelo..."
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr "Abrir Modelo de barramento de áudio"
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no '%s' file."
+msgstr "Não existe ficheiro '%s'."
+
+#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr "Esquema"
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr "Ficheiro inválido, não é um Modelo válido de barramento de áudio."
+
+#: editor/editor_audio_buses.cpp
+msgid "Error saving file: %s"
+msgstr "Erro ao guardar ficheiro: %s"
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr "Adicionar Barramento"
+
+#: editor/editor_audio_buses.cpp
+msgid "Add a new Audio Bus to this layout."
+msgstr "Adicionar novo Barramento de Áudio a este modelo."
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr "Carregar"
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr "Carregar um Modelo de Barramento existente."
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr "Guardar Como"
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr "Guardar este Modelo de Barramento para um ficheiro."
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr "Carregar Predefinição"
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr "Carregar o Modelo predefinido de barramento."
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr "Criar um novo Modelo de Barramento."
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr "Nome inválido."
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr "Caracteres válidos:"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing engine class name."
+msgstr "Não pode coincidir com um nome de classe do motor já existente."
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing built-in type name."
+msgstr "Não pode coincidir com um nome de um tipo incorporado já existente."
+
+#: editor/editor_autoload_settings.cpp
+msgid "Must not collide with an existing global constant name."
+msgstr "Não pode coincidir com um nome de uma constante global já existente."
+
+#: editor/editor_autoload_settings.cpp
+msgid "Keyword cannot be used as an autoload name."
+msgstr ""
+"Palavras-chave não podem ser usadas como nome de carregamento automático."
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr "Carregamento Automático '%s' já existe!"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr "Renomear Carregamento Automático"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr "Alternar Globals de carregamento automático"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr "Mover Carregamento Automático"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr "Remover Carregamento Automático"
+
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
+msgid "Enable"
+msgstr "Ativar"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr "Reorganizar Carregamentos Automáticos"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Can't add autoload:"
+msgstr "Não consigo adicionar carregamento automático:"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr "Adicionar Carregamento Automático"
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr "Caminho:"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr "Nome do Nó:"
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/project_manager.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr "Nome"
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr "Instância única"
+
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Colar Parâmetros"
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr "A atualizar Cena"
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr "A armazenar alterações locais..."
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr "A atualizar cena..."
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr "[vazio]"
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr "[não guardado]"
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first."
+msgstr "Por favor selecione primeiro a diretoria base."
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr "Escolha uma Diretoria"
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr "Criar Pasta"
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr "Nome:"
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr "Não consegui criar pasta."
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr "Escolha"
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr "Armazenar o Ficheiro:"
+
+#: editor/editor_export.cpp
+msgid "No export template found at the expected path:"
+msgstr "Nenhum modelo de exportação encontrado no caminho previsto:"
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr "Empacotamento"
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
+"Etc' in Project Settings."
+msgstr ""
+"Plataforma Alvo exige compressão de textura 'ETC' para GLES2. Ative "
+"'Importar Etc' nas Configurações do Projeto."
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC2' texture compression for GLES3. Enable "
+"'Import Etc 2' in Project Settings."
+msgstr ""
+"Plataforma Alvo exige compressão de textura 'ETC2' para GLES3. Ative "
+"'Importar Etc 2' nas Configurações do Projeto."
+
+#: editor/editor_export.cpp
+msgid ""
+"Target platform requires 'ETC' texture compression for the driver fallback "
+"to GLES2.\n"
+"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
+"Enabled'."
+msgstr ""
+"Plataforma Alvo exige compressão de textura 'ETC' para o driver de recurso "
+"em GLES2.\n"
+"Ative 'Importar Etc' nas Configurações do Projeto, ou desative 'Driver de "
+"Recurso ativo'."
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom debug template not found."
+msgstr "Modelo de depuração personalizado não encontrado."
+
+#: editor/editor_export.cpp platform/android/export/export.cpp
+#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
+#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+msgid "Custom release template not found."
+msgstr "Modelo de lançamento personalizado não encontrado."
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr "Ficheiro Modelo não encontrado:"
+
+#: editor/editor_export.cpp
+msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
+msgstr ""
+"Em exportações de 32 bits o PCK incorporado não pode ser maior do que 4 GiB."
+
+#: editor/editor_feature_profile.cpp
+msgid "3D Editor"
+msgstr "Editor 3D"
+
+#: editor/editor_feature_profile.cpp
+msgid "Script Editor"
+msgstr "Editor de Script"
+
+#: editor/editor_feature_profile.cpp
+msgid "Asset Library"
+msgstr "Biblioteca de Ativos"
+
+#: editor/editor_feature_profile.cpp
+msgid "Scene Tree Editing"
+msgstr "Edição da Árvore de Cena"
+
+#: editor/editor_feature_profile.cpp
+msgid "Node Dock"
+msgstr "Doca de Nó"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Sistema de Ficheiros"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importar Doca"
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase profile '%s'? (no undo)"
+msgstr "Substituir perfil '%s'? (não há desfazer)"
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile must be a valid filename and must not contain '.'"
+msgstr "Perfil tem de ser um ficheiro válido e não pode conter '.'"
+
+#: editor/editor_feature_profile.cpp
+msgid "Profile with this name already exists."
+msgstr "Já existe um Perfil com este nome."
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled, Properties Disabled)"
+msgstr "(Editor Desativado, Propriedades Desativadas)"
+
+#: editor/editor_feature_profile.cpp
+msgid "(Properties Disabled)"
+msgstr "(Propriedades Desativadas)"
+
+#: editor/editor_feature_profile.cpp
+msgid "(Editor Disabled)"
+msgstr "(Editor Desativado)"
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options:"
+msgstr "Opções da Classe:"
+
+#: editor/editor_feature_profile.cpp
+msgid "Enable Contextual Editor"
+msgstr "Ativar Editor de Contexto"
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Properties:"
+msgstr "Ativar Propriedades:"
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Features:"
+msgstr "Ativar Características:"
+
+#: editor/editor_feature_profile.cpp
+msgid "Enabled Classes:"
+msgstr "Ativar Classes:"
+
+#: editor/editor_feature_profile.cpp
+msgid "File '%s' format is invalid, import aborted."
+msgstr "Formato do ficheiro '%s' é inválido, importação interrompida."
+
+#: editor/editor_feature_profile.cpp
+msgid ""
+"Profile '%s' already exists. Remove it first before importing, import "
+"aborted."
+msgstr ""
+"Perfil '%s' já existe. Remova-o antes de importar, importação interrompida."
+
+#: editor/editor_feature_profile.cpp
+msgid "Error saving profile to path: '%s'."
+msgstr "Erro ao guardar perfil no caminho: '%s'."
+
+#: editor/editor_feature_profile.cpp
+msgid "Unset"
+msgstr "Desativar"
+
+#: editor/editor_feature_profile.cpp
+msgid "Current Profile:"
+msgstr "Perfil atual:"
+
+#: editor/editor_feature_profile.cpp
+msgid "Make Current"
+msgstr "Tornar Atual"
+
+#: editor/editor_feature_profile.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "New"
+msgstr "Novo"
+
+#: editor/editor_feature_profile.cpp editor/editor_node.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr "Importar"
+
+#: editor/editor_feature_profile.cpp editor/project_export.cpp
+msgid "Export"
+msgstr "Exportar"
+
+#: editor/editor_feature_profile.cpp
+msgid "Available Profiles:"
+msgstr "Perfis disponíveis:"
+
+#: editor/editor_feature_profile.cpp
+msgid "Class Options"
+msgstr "Opções da Classe"
+
+#: editor/editor_feature_profile.cpp
+msgid "New profile name:"
+msgstr "Novo nome do perfil:"
+
+#: editor/editor_feature_profile.cpp
+msgid "Erase Profile"
+msgstr "Apagar Perfil"
+
+#: editor/editor_feature_profile.cpp
+msgid "Godot Feature Profile"
+msgstr "Perfil de Características Godot"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Profile(s)"
+msgstr "Importar Perfil/Perfis"
+
+#: editor/editor_feature_profile.cpp
+msgid "Export Profile"
+msgstr "Exportar Perfil"
+
+#: editor/editor_feature_profile.cpp
+msgid "Manage Editor Feature Profiles"
+msgstr "Gerir Editor de Perfis"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Selecionar pasta atual"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr "O Ficheiro existe, sobrescrever?"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr "Selecionar esta Pasta"
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr "Copiar Caminho"
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr "Abrir no Gestor de Ficheiros"
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr "Mostrar no Gestor de Ficheiros"
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr "Nova Diretoria..."
+
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr "Todos Reconhecidos"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr "Todos os Ficheiros (*)"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr "Abrir um Ficheiro"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr "Abrir Ficheiro(s)"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr "Abrir uma Diretoria"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr "Abrir um Ficheiro ou Diretoria"
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr "Guardar"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr "Guardar um Ficheiro"
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr "Voltar"
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr "Avançar"
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr "Subir"
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr "Alternar Ficheiros escondidos"
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr "Alternar favorito"
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr "Alternar modo"
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr "Focar Caminho"
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr "Mover Favorito para Cima"
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr "Mover Favorito para Baixo"
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to previous folder."
+msgstr "Ir para a pasta anterior."
+
+#: editor/editor_file_dialog.cpp
+msgid "Go to next folder."
+msgstr "Ir para a pasta seguinte."
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder."
+msgstr "Ir para a pasta acima."
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Refresh files."
+msgstr "Atualizar ficheiros."
+
+#: editor/editor_file_dialog.cpp
+msgid "(Un)favorite current folder."
+msgstr "(Não) tornar favorita atual pasta."
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Toggle the visibility of hidden files."
+msgstr "Alternar a visibilidade de ficheiros escondidos."
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr "Visualizar itens como grelha de miniaturas."
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr "Visualizar itens como lista."
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr "Diretorias e Ficheiros:"
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview:"
+msgstr "Pré-visualização:"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr "Ficheiro:"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr "Deve usar uma extensão válida."
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr "Analisar fontes"
+
+#: editor/editor_file_system.cpp
+msgid ""
+"There are multiple importers for different types pointing to file %s, import "
+"aborted"
+msgstr ""
+"Existem vários importadores para diferentes tipos que apontam para o "
+"ficheiro %s. Importação abortada"
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr "A (Re)Importar Ativos"
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr "Topo"
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr "Classe:"
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Inherits:"
+msgstr "Herdar:"
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr "Herdado por:"
+
+#: editor/editor_help.cpp
+msgid "Description"
+msgstr "Descrição"
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials"
+msgstr "Tutoriais Online"
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr "Propriedades"
+
+#: editor/editor_help.cpp
+msgid "override:"
+msgstr "Sobrepõe:"
+
+#: editor/editor_help.cpp
+msgid "default:"
+msgstr "predefinição:"
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr "Métodos"
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr "Propriedades do Tema"
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr "Enumerações"
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr "Constantes"
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr "Descrições da Propriedade"
+
+#: editor/editor_help.cpp
+msgid "(value)"
+msgstr "(valor)"
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+"Atualmente não existe descrição para esta Propriedade. Por favor ajude-nos "
+"[color=$color][url=$url]a contribuir com uma[/url][/color]!"
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr "Descrições do Método"
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+"Atualmente não existe descrição para este Método. Por favor ajude-nos [color="
+"$color][url=$url]a contribuir com uma[/url][/color]!"
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Procurar em Ajuda"
+
+#: editor/editor_help_search.cpp
+msgid "Case Sensitive"
+msgstr "Sensível a maiúsculas"
+
+#: editor/editor_help_search.cpp
+msgid "Show Hierarchy"
+msgstr "Mostrar Hierarquia"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Mostrar Tudo"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Apenas Classes"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Apenas Métodos"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Apenas Sinais"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Apenas Constantes"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Apenas Propriedades"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Apenas Propriedades do Tema"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Tipo do Membro"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Classe"
+
+#: editor/editor_help_search.cpp
+msgid "Method"
+msgstr "Método"
+
+#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
+msgid "Signal"
+msgstr "Sinal"
+
+#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr "Constante"
+
+#: editor/editor_help_search.cpp
+msgid "Property"
+msgstr "Propriedade"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Property"
+msgstr "Propriedade do Tema"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr "Propriedade:"
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr "Definir"
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr "Definir Múltiplo:"
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr "Saída:"
+
+#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr "Copiar Seleção"
+
+#: editor/editor_log.cpp editor/editor_network_profiler.cpp
+#: editor/editor_profiler.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr "Limpar"
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr "Limpar Saída"
+
+#: editor/editor_network_profiler.cpp editor/editor_node.cpp
+#: editor/editor_profiler.cpp
+msgid "Stop"
+msgstr "Parar"
+
+#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
+#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
+msgid "Start"
+msgstr "Início"
+
+#: editor/editor_network_profiler.cpp
+msgid "%s/s"
+msgstr "%s/s"
+
+#: editor/editor_network_profiler.cpp
+msgid "Down"
+msgstr "Para baixo"
+
+#: editor/editor_network_profiler.cpp
+msgid "Up"
+msgstr "Para cima"
+
+#: editor/editor_network_profiler.cpp editor/editor_node.cpp
+msgid "Node"
+msgstr "Nó"
+
+#: editor/editor_network_profiler.cpp
+msgid "Incoming RPC"
+msgstr "RPC recebido"
+
+#: editor/editor_network_profiler.cpp
+msgid "Incoming RSET"
+msgstr "RSET recebido"
+
+#: editor/editor_network_profiler.cpp
+msgid "Outgoing RPC"
+msgstr "RPC enviado"
+
+#: editor/editor_network_profiler.cpp
+msgid "Outgoing RSET"
+msgstr "RSET enviado"
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "New Window"
+msgstr "Nova Janela"
+
+#: editor/editor_node.cpp
+msgid "Imported resources can't be saved."
+msgstr "Recursos importados não podem ser guardados."
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr "Erro ao guardar recurso!"
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource can't be saved because it does not belong to the edited scene. "
+"Make it unique first."
+msgstr ""
+"Este recurso não pode ser guardado porque não pertence à cena editada. Faça-"
+"o único."
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr "Guardar Recurso Como..."
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr "Não consigo abrir o ficheiro para escrita:"
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr "Formato do Ficheiro solicitado desconhecido:"
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr "Erro ao guardar."
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr "Não consigo abrir '%s'. O ficheiro pode ter sido movido ou apagado."
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr "Erro ao analisar '%s'."
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr "Fim de Ficheiro '%s' inesperado."
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr "Falta '%s' ou as suas dependências."
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr "Erro ao carregar '%s'."
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr "A guardar Cena"
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr "A analizar"
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr "A criar miniatura"
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr "Esta operação não pode ser feita sem uma raiz da árvore."
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Esta cena não pode ser guardada porque existe inclusão de instâncias "
+"cíclica.\n"
+"Resolva-a e tente guardá-la novamente."
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+"Não consigo guardar cena. Provavelmente, as dependências (instâncias ou "
+"heranças) não puderam ser satisfeitas."
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Não se consegue sobrescrever cena ainda aberta!"
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr "Não consigo carregar MeshLibrary para combinar!"
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr "Erro ao guardar MeshLibrary!"
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr "Não consigo carregar TileSet para combinar!"
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr "Erro ao guardar TileSet!"
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr "Erro ao tentar guardar o Modelo!"
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr "O modelo do editor predefinido foi substituído."
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr "Nome do Modelo não encontrado!"
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr "Modelo predefinido restaurado para as configurações base."
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+"Este recurso pertence a uma cena que foi importado, sem ser editável.\n"
+"Por favor, leia a documentação relevante sobre importação de cenas, para um "
+"melhor entendimento deste fluxo de trabalho."
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it won't be kept when saving the current scene."
+msgstr ""
+"Este recurso pertence a uma cena que foi instanciada ou herdada.\n"
+"As alterações ao mesmo não serão mantidas ao guardar a cena atual."
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+"Este recurso foi importado, portanto, não é editável. Altere as suas "
+"configurações no painel de importação e então importe de novo."
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it won't be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+"Esta cena foi importada, portanto, as alterações à mesma não serão "
+"mantidas.\n"
+"Instanciar-a ou herdar-a vai permitir efetuar alterações à mesma.\n"
+"Por favor, leia a documentação relevante sobre importação de cenas, para um "
+"melhor entendimento do fluxo de trabalho."
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object, so changes to it won't be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+"Este é um objeto remoto, portanto, as alterações ao mesmo não serão "
+"mantidas.\n"
+"Por favor, leia a documentação relevante sobre depuração para um melhor "
+"entendimento deste fluxo de trabalho."
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr "Não existe cena definida para execução."
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr "Não consegui iniciar o subprocesso!"
+
+#: editor/editor_node.cpp editor/filesystem_dock.cpp
+msgid "Open Scene"
+msgstr "Abrir Cena"
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr "Abrir Cena Base"
+
+#: editor/editor_node.cpp
+msgid "Quick Open..."
+msgstr "Abertura rápida..."
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr "Abrir Cena Rapidamente..."
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr "Abrir Script de forma rápida..."
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr "Guardar & Fechar"
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr "Guardar alterações a '%s' antes de fechar?"
+
+#: editor/editor_node.cpp
+msgid "Saved %s modified resource(s)."
+msgstr "Guardado(s) %s recurso(s) modificado(s)."
+
+#: editor/editor_node.cpp
+msgid "A root node is required to save the scene."
+msgstr "É necessário um nó raiz para guardar a cena."
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr "Guardar Cena Como..."
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr "Não"
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr "Sim"
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr "Esta cena nunca foi guardada. Guardar antes de executar?"
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr "Esta operação não pode ser efetuada sem uma cena."
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr "Exportar Biblioteca de Malhas"
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr "Esta operação não pode ser efetuada sem um nó raiz."
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr "Exportar conjunto de Tiles"
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr "Esta operação não pode ser efetuada sem um nó selecionado."
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr "A cena atual não foi guardada. Abrir na mesma?"
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr "Não consigo recarregar uma cena que nunca foi guardada."
+
+#: editor/editor_node.cpp
+msgid "Reload Saved Scene"
+msgstr "Recarregar Cena Guardada"
+
+#: editor/editor_node.cpp
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"A cena atual tem alterações não guardadas.\n"
+"Recarregar a cena guardada? Esta ação não pode ser revertida."
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr "Executar Cena Rapidamente..."
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr "Sair"
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr "Sair do Editor?"
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr "Abrir Gestor de Projeto?"
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr "Guardar & Sair"
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr "Guardar alterações da(s) seguinte(s) cena(s) antes de sair?"
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+"Guardar alterações da(s) seguinte(s) cena(s) antes de abrir o Gestor de "
+"Projeto?"
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+"Esta opção foi descontinuada. Situações onde a atualização tem que ser "
+"forçada, são agora consideras um defeito. Por favor, denuncie."
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr "Escolha a Cena Principal"
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr "Fechar Cena"
+
+#: editor/editor_node.cpp
+msgid "Reopen Closed Scene"
+msgstr "Reabrir Cena Fechada"
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr "Incapaz de ativar plugin em: '%s' falha de análise ou configuração."
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr "Incapaz de localizar campo Script para plugin em: 'res://addons/%s'."
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr "Incapaz de carregar script addon do caminho: '%s'."
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Incapaz de carregar script addon do caminho: '%s' Parece haver um erro no "
+"código, reveja a sintaxe."
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+"Incapaz de carregar script addon do Caminho: '%s' Tipo base não é "
+"EditorPlugin."
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+"Incapaz de carregar script addon do Caminho: '%s' Script não está no modo "
+"ferramenta."
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+"Cena '%s' foi importada automaticamente, sem poder ser alterada.\n"
+"Para fazer alterações, pode ser criada uma nova cena herdada."
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+"Erro ao carregar cena, tem de estar no caminho do projeto. Use 'Importar' "
+"para abrir a cena, e guarde-a dentro do caminho do projeto."
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr "Cena '%s' tem dependências não satisfeitas:"
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr "Limpar Cenas Recentes"
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"Não foi definida nenhuma cena principal. Selecionar uma?\n"
+"Poderá alterá-la depois nas \"Configurações do Projeto\", na categoria "
+"'Application'."
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"A cena selecionada '%s' não existe, selecionar uma válida?\n"
+"Poderá alterá-la depois em \"application\", na categoria 'Application'."
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+"A cena selecionada '%s' não é um ficheiro de cena, selecione um ficheiro "
+"válido?\n"
+"Poderá alterá-la depois em \"Configurações do Projeto\", na categoria "
+"'Application."
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr "Guardar Modelo"
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr "Apagar Modelo"
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr "Predefinição"
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Mostrar no Sistema de Ficheiros"
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr "Executar Esta Cena"
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr "Fechar Separador"
+
+#: editor/editor_node.cpp
+msgid "Undo Close Tab"
+msgstr "Desfazer Fechar Separador"
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr "Fechar outros separadores"
+
+#: editor/editor_node.cpp
+msgid "Close Tabs to the Right"
+msgstr "Fechar Separadores à Direita"
+
+#: editor/editor_node.cpp
+msgid "Close All Tabs"
+msgstr "Fechar Todos os Separadores"
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr "Trocar Aba de Cena"
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr "%d mais Ficheiros ou diretorias"
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr "%d mais diretorias"
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr "%d mais Ficheiros"
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr "Posição do Painel"
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr "Modo livre de distrações"
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr "Alternar modo livre de distrações."
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr "Adicionar nova cena."
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr "Cena"
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr "Ir para cena aberta anteriormente."
+
+#: editor/editor_node.cpp
+msgid "Copy Text"
+msgstr "Copiar Texto"
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr "Próxima guia"
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr "Guia anterior"
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr "Filtrar Ficheiro..."
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr "Operações com ficheiros de cena."
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr "Nova Cena"
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr "Nova Cena Herdada..."
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr "Abrir Cena..."
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr "Abrir Recente"
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr "Guardar Cena"
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr "Guardar todas as Cenas"
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr "Converter Para..."
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr "Bib. de Meshes..."
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr "TileSet..."
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr "Desfazer"
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr "Refazer"
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr "Ferramentas diversas de projeto ou cena."
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+#: editor/script_create_dialog.cpp
+msgid "Project"
+msgstr "Projeto"
+
+#: editor/editor_node.cpp
+msgid "Project Settings..."
+msgstr "Configurações do Projeto..."
+
+#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
+msgid "Version Control"
+msgstr "Controle de Versões"
+
+#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
+msgid "Set Up Version Control"
+msgstr "Organizar Controle de Versões"
+
+#: editor/editor_node.cpp
+msgid "Shut Down Version Control"
+msgstr "Desativar Controle de Versões"
+
+#: editor/editor_node.cpp
+msgid "Export..."
+msgstr "Exportar..."
+
+#: editor/editor_node.cpp
+msgid "Install Android Build Template..."
+msgstr "Instalar Modelo Android de Compilação..."
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr "Abrir Pasta de Dados do Projeto"
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: editor/editor_node.cpp
+msgid "Orphan Resource Explorer..."
+msgstr "Explorador de Recursos Órfãos..."
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr "Sair para a lista de Projetos"
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr "Depurar"
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr "Implementar com Depuração Remota"
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
+msgstr ""
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
+msgstr "Pequena distribuição com Network FS"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
+msgstr ""
+"Quando esta opção é ativada, exportação ou distribuição criará um executável "
+"mínimo.\n"
+"O Sistema de Ficheiros será fornecido ao Projeto pelo Editor sobre a rede.\n"
+"Em Android, a distribuição irá usar a ligação USB para melhor performance. "
+"Esta opção acelera o teste de jogos pesados."
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr "Formas de Colisão Visíveis"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
+msgstr ""
+"Com esta opção ativa, formas de colisão e nós raycast (para 2D e 3D) serão "
+"visíveis no jogo em execução."
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr "Navegação Visível"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
+msgstr ""
+"Com esta opção ativa, Meshes e Polígonos serão visíveis no jogo em execução."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Synchronize Scene Changes"
+msgstr "Sincronizar Alterações de Cena"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
+msgstr ""
+"Com esta opção ativa, alterações da cena no editor serão replicadas no jogo "
+"em execução.\n"
+"Quando usada num aparelho remoto, é mais eficiente com um sistema de "
+"ficheiros em rede."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "Sincronizar Alterações de Script"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
+msgstr ""
+"Com esta opção ativa, qualquer Script guardado será recarregado no jogo em "
+"execução.\n"
+"Quando usada num aparelho remoto, é mais eficiente com um Sistema de "
+"Ficheiros em rede."
+
+#: editor/editor_node.cpp editor/script_create_dialog.cpp
+msgid "Editor"
+msgstr "Editor"
+
+#: editor/editor_node.cpp
+msgid "Editor Settings..."
+msgstr "Configurações do Editor..."
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr "Apresentação do Editor"
+
+#: editor/editor_node.cpp
+msgid "Take Screenshot"
+msgstr "Captura do ecrã"
+
+#: editor/editor_node.cpp
+msgid "Screenshots are stored in the Editor Data/Settings Folder."
+msgstr ""
+"Capturas do ecrã são armazenadas na pasta Dados/Configurações do Editor."
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr "Alternar Ecrã completo"
+
+#: editor/editor_node.cpp
+msgid "Toggle System Console"
+msgstr "Alternar Consola do Sistema"
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr "Abrir Pasta do Editor de Dados/Configurações"
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr "Abrir Pasta de Dados do Editor"
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr "Abrir Pasta de Configurações do Editor"
+
+#: editor/editor_node.cpp
+msgid "Manage Editor Features..."
+msgstr "Gerir Características do Editor..."
+
+#: editor/editor_node.cpp
+msgid "Manage Export Templates..."
+msgstr "Gerir Modelos de Exportação..."
+
+#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
+msgid "Help"
+msgstr "Ajuda"
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Search"
+msgstr "Procurar"
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Online Docs"
+msgstr "Documentação Online"
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr "Perguntas & Respostas"
+
+#: editor/editor_node.cpp
+msgid "Report a Bug"
+msgstr "Denunciar um Bug"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Enviar Sugestão dos Docs"
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr "Comunidade"
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr "Sobre Nós"
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr "Executa o projeto."
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr "Executar"
+
+#: editor/editor_node.cpp
+msgid "Pause the scene execution for debugging."
+msgstr "Pausar a execução da cena para depuração."
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr "Pausar Cena"
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr "Para a cena."
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr "Executa a cena editada."
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr "Executar Cena"
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr "Executa cena personalizada"
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr "Executar Cena Personalizada"
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr "Alterar o driver de vídeo requer reiniciar o editor."
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr "Guardar & Reiniciar"
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window redraws."
+msgstr "Roda quando a janela do editor atualiza."
+
+#: editor/editor_node.cpp
+msgid "Update Continuously"
+msgstr "Atualização Contínua"
+
+#: editor/editor_node.cpp
+msgid "Update When Changed"
+msgstr "Atualizar quando há Alterações"
+
+#: editor/editor_node.cpp
+msgid "Hide Update Spinner"
+msgstr "Esconder Roleta de Atualização"
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr "Sistema de Ficheiros"
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspetor"
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr "Expandir Painel do Fundo"
+
+#: editor/editor_node.cpp
+msgid "Output"
+msgstr "Saída"
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr "Não Guardar"
+
+#: editor/editor_node.cpp
+msgid "Android build template is missing, please install relevant templates."
+msgstr "Modelo de compilação Android em falta. Instale os modelos necessários."
+
+#: editor/editor_node.cpp
+msgid "Manage Templates"
+msgstr "Gerir Modelos"
+
+#: editor/editor_node.cpp
+msgid ""
+"This will set up your project for custom Android builds by installing the "
+"source template to \"res://android/build\".\n"
+"You can then apply modifications and build your own custom APK on export "
+"(adding modules, changing the AndroidManifest.xml, etc.).\n"
+"Note that in order to make custom builds instead of using pre-built APKs, "
+"the \"Use Custom Build\" option should be enabled in the Android export "
+"preset."
+msgstr ""
+"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 \"Usar Compilação Personalizada\" deve ser ativada "
+"na predefinição da exportação Android."
+
+#: editor/editor_node.cpp
+msgid ""
+"The Android build template is already installed in this project and it won't "
+"be overwritten.\n"
+"Remove the \"res://android/build\" directory manually before attempting this "
+"operation again."
+msgstr ""
+"O modelo de compilação Android já está instalado neste projeto e não será "
+"substituído.\n"
+"Remova manualmente a diretoria \"res://android/build\" antes de repetir esta "
+"operação."
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr "Importar Modelos a partir de um Ficheiro ZIP"
+
+#: editor/editor_node.cpp
+msgid "Template Package"
+msgstr "Pacote de Modelo"
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr "Exportar Biblioteca"
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr "Combinar com o Existente"
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr "Abrir & Executar um Script"
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr "Novo Herdado"
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr "Carregar Erros"
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr "Selecionar"
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr "Abrir Editor 2D"
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr "Abrir Editor 3D"
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr "Abrir Editor de Scripts"
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr "Abrir Biblioteca de Ativos"
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr "Abrir o Editor seguinte"
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr "Abrir o Editor anterior"
+
+#: editor/editor_node.h
+msgid "Warning!"
+msgstr "Aviso!"
+
+#: editor/editor_path.cpp
+msgid "No sub-resources found."
+msgstr "Sub-recurso não encontrado."
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr "A criar pré-visualizações de Malha"
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr "Miniatura..."
+
+#: editor/editor_plugin_settings.cpp
+msgid "Main Script:"
+msgstr "Script principal:"
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr "Editar Plugin"
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr "Plugins Instalados:"
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr "Atualizar"
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr "Versão:"
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr "Autor:"
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr "Estado:"
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr "Editar:"
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr "Medida:"
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr "Tempo do Frame (seg)"
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr "Tempo Médio (seg)"
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr "Frame %"
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr "Frame de Física %"
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr "Inclusivo"
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr "Auto"
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr "Frame #:"
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr "Tempo"
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr "Chamadas"
+
+#: editor/editor_properties.cpp
+msgid "Edit Text:"
+msgstr "Editar Texto:"
+
+#: editor/editor_properties.cpp editor/script_create_dialog.cpp
+msgid "On"
+msgstr "On"
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr "Camada"
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr "Bit %d, valor %d"
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr "[Vazio]"
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "Atribuir..."
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr "RID inválido"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"O recurso selecionado (%s) não corresponde a qualquer tipo esperado para "
+"esta propriedade (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Não se consegue criar Textura Viewport em recursos guardados como ficheiro.\n"
+"O recurso tem de pertencer a uma cena."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Não se consegue criar Textura Viewport neste recurso porque não está "
+"definido na cena como local.\n"
+"Ative a sua propriedade 'local to scene' (e em todos os recursos que o "
+"contêm até a um nó)."
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr "Escolha um Viewport"
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr "Novo Script"
+
+#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr "Estender Script"
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr "Novo %s"
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr "Fazer único"
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr "Colar"
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr "Converter em %s"
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr "Nó selecionado não é um Viewport!"
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr "Tamanho: "
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr "Página: "
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr "Remover item"
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr "Nova Chave:"
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr "Novo Valor:"
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr "Adicionar Par Chave/Valor"
+
+#: editor/editor_run_native.cpp
+#, fuzzy
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
+msgstr ""
+"Não foi encontrado um executável de exportação para esta plataforma.\n"
+"Adicione um executável pré-definido no menu de exportação."
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr "Escreva a sua lógica no Método _run()."
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr "Já existe uma cena editada."
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr "Não consegui instanciar o script:"
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr "Esqueceu-se da palavra chave 'tool'?"
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr "Não consegui executar o script:"
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr "Esqueceu-se do médodo '_run'?"
+
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Pressione Ctrl para arredondar para inteiro. Pressione Shift para mudanças "
+"mais precisas."
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr "Selecionar Nó(s) para Importar"
+
+#: editor/editor_sub_scene.cpp editor/project_manager.cpp
+msgid "Browse"
+msgstr "Navegar"
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr "Caminho da Cena:"
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr "Importar do Nó:"
+
+#: editor/export_template_manager.cpp
+msgid "Redownload"
+msgstr "Retransferir"
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr "Desinstalar"
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr "(Instalado)"
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr "Download"
+
+#: editor/export_template_manager.cpp
+msgid "Official export templates aren't available for development builds."
+msgstr ""
+"Modelos de exportação oficiais não estão disponíveis para compilações de "
+"desenvolvimento."
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr "(Em Falta)"
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr "(Atual)"
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr "A readquirir servidores, espere por favor..."
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr "Remover versão '%s' do Modelo?"
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr "Não consigo abrir zip de modelos de exportação."
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr "Formato de version.txt inválido dentro dos modelos: %s."
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr "Não foi encontrado version.txt dentro dos Modelos."
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr "Erro ao criar o caminho para os modelos:"
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr "A Extrair os Modelos de Exportação"
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr "A Importar:"
+
+#: editor/export_template_manager.cpp
+msgid "Error getting the list of mirrors."
+msgstr "Erro na receção da lista de mirrors."
+
+#: editor/export_template_manager.cpp
+msgid "Error parsing JSON of mirror list. Please report this issue!"
+msgstr ""
+"Erro ao analisar a lista de mirrors JSON. Por favor denuncie o problema!"
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+"Não foram encontrados ligações para descarregar para esta versão. "
+"Descarregamentos diretos estão disponíveis apenas para os lançamentos "
+"oficiais."
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr "Não consigo resolver."
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr "Não consigo conectar."
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr "Sem resposta."
+
+#: editor/export_template_manager.cpp
+msgid "Request Failed."
+msgstr "Pedido falhado."
+
+#: editor/export_template_manager.cpp
+msgid "Redirect Loop."
+msgstr "Redirecionar ciclo."
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr "Falhou:"
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr "Download Completo."
+
+#: editor/export_template_manager.cpp
+msgid "Cannot remove temporary file:"
+msgstr "Não consigo remover ficheiro temporário:"
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed.\n"
+"The problematic templates archives can be found at '%s'."
+msgstr ""
+"Falhou a instalação de Modelos.\n"
+"Os ficheiros problemáticos encontram-se em '%s'."
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting URL:"
+msgstr "Erro ao solicitar URL:"
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr "A ligar ao servidor..."
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr "Desconectado"
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr "A resolver"
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr "Não consigo Resolver"
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr "A ligar..."
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr "Não consigo Conectar"
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr "Ligado"
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr "A solicitar..."
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr "A transferir"
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr "Erro de Ligação"
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr "Erro SSL Handshake"
+
+#: editor/export_template_manager.cpp
+msgid "Uncompressing Android Build Sources"
+msgstr "A descompactar Fontes da Compilação Android"
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr "Versão Atual:"
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr "Versões Instaladas:"
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr "Instalar do Ficheiro"
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr "Remover Modelo"
+
+#: editor/export_template_manager.cpp
+msgid "Select Template File"
+msgstr "Selecionar Ficheiro de Modelo"
+
+#: editor/export_template_manager.cpp
+msgid "Godot Export Templates"
+msgstr "Modelos de Exportação Godot"
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr "Exportar Gestor de Modelos"
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr "Transferir Modelos"
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr "Selecionar servidor da lista: (Shift+Click: Abrir no Navegador)"
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoritos"
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+"Estado: A importação do Ficheiro falhou. Corrija o Ficheiro e importe "
+"manualmente."
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr "Não consegui mover/renomear raiz dos recursos."
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr "Não pode mover uma pasta para si mesma."
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr "Erro ao mover:"
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr "Erro ao duplicar:"
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr "Incapaz de atualizar dependências:"
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nome não fornecido."
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters."
+msgstr "O nome fornecido contém caracteres inválidos."
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr "Um Ficheiro ou diretoria já existe com este nome."
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr "O nome contém caracteres inválidos."
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr "Mudar nome do Ficheiro:"
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr "Renomear diretoria:"
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr "A duplicar Ficheiro:"
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr "A duplicar Diretoria:"
+
+#: editor/filesystem_dock.cpp
+msgid "New Inherited Scene"
+msgstr "Nova Cena Herdada"
+
+#: editor/filesystem_dock.cpp
+msgid "Set As Main Scene"
+msgstr "Definir Como Cena Principal"
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scenes"
+msgstr "Abrir Cenas"
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr "Instância"
+
+#: editor/filesystem_dock.cpp
+msgid "Add to Favorites"
+msgstr "Adicionar aos Favoritos"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from Favorites"
+msgstr "Remover dos Favoritos"
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr "Editar Dependências..."
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr "Ver proprietários..."
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Renomear..."
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr "Duplicar..."
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Mover para..."
+
+#: editor/filesystem_dock.cpp
+msgid "New Scene..."
+msgstr "Nova Cena..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr "Novo Script..."
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr "Novo Recurso..."
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Expandir Tudo"
+
+#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Colapsar Tudo"
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr "Renomear"
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Folder/File"
+msgstr "Pasta/Ficheiro Anterior"
+
+#: editor/filesystem_dock.cpp
+msgid "Next Folder/File"
+msgstr "Próxima Pasta/Ficheiro"
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr "Carregar novamente o Sistema de Ficheiros"
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle Split Mode"
+msgstr "Alternar Modo de Divisão"
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr "Procurar ficheiros"
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+"A analisar Ficheiros,\n"
+"Espere, por favor..."
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr "Mover"
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr "Já existe um ficheiro ou pasta com o mesmo nome nesta localização."
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr "Sobrescrever"
+
+#: editor/filesystem_dock.cpp
+msgid "Create Scene"
+msgstr "Criar Cena"
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr "Criar Script"
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Find in Files"
+msgstr "Localizar em Ficheiros"
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr "Localizar:"
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr "Pasta:"
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr "Filtros:"
+
+#: editor/find_in_files.cpp
+msgid ""
+"Include the files with the following extensions. Add or remove them in "
+"ProjectSettings."
+msgstr ""
+"Inclui os ficheiros com as seguintes extensões. Adicione ou remova-os em "
+"ProjectSettings."
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr "Localizar..."
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr "Substituir..."
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr "Localizar: "
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr "Substituir: "
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr "Substituir tudo (não há desfazer)"
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr "A procurar..."
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr "Pesquisa completa"
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr "Adicionar ao Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr "Remover do Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr "Já existe o nome de grupo ."
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr "Nome de grupo inválido."
+
+#: editor/groups_editor.cpp
+msgid "Rename Group"
+msgstr "Renomear Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Delete Group"
+msgstr "Apagar Grupo"
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr "Grupos"
+
+#: editor/groups_editor.cpp
+msgid "Nodes Not in Group"
+msgstr "Nós fora do Grupo"
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Filter nodes"
+msgstr "Filtrar nós"
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr "Nós no Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Empty groups will be automatically removed."
+msgstr "Grupos vazios serão removidos automaticamente."
+
+#: editor/groups_editor.cpp
+msgid "Group Editor"
+msgstr "Editor de Grupo"
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr "Gerir Grupos"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr "Importar como Cena Única"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr "Importar com Animações separadas"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr "Importar com Materiais separados"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr "Importar com Objetos separados"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr "Importar com Objetos e Materiais separados"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr "Importar com Objetos e Animações separados"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr "Importar com Materiais e Animações separados"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr "Importar com Objetos, Materiais e Animações separados"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr "Importar como Cenas Múltiplas"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr "Importar como Cenas Múltiplas + Materiais"
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr "Importar Cena"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr "A importar Cena..."
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr "A gerar Lightmaps"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr "A gerar para Malha: "
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr "A executar Script Customizado..."
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr "Não se conseguiu carregar o Script de pós-importação:"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr "Script inválido/danificado para pós-importação (verificar consola):"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr "Erro na execução do Script de pós-importação:"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "Devolveu um objeto derivado de Nó no método `post_import()`?"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr "A guardar..."
+
+#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Ficheiros"
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr "Definir como Predefinição para '%s'"
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr "Limpar Predefinição para '%s'"
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr "Importar Como:"
+
+#: editor/import_dock.cpp
+msgid "Preset"
+msgstr "Predefinições"
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr "Reimportar"
+
+#: editor/import_dock.cpp
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Guardar Cenas, Reimportar e Reiniciar"
+
+#: editor/import_dock.cpp
+msgid "Changing the type of an imported file requires editor restart."
+msgstr "Alterar o tipo de um ficheiro importado requer reiniciar o editor."
+
+#: editor/import_dock.cpp
+msgid ""
+"WARNING: Assets exist that use this resource, they may stop loading properly."
+msgstr ""
+"AVISO: Existem Ativos que usam este recurso, poderem não ser carregados "
+"corretamente."
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr "Falha ao carregar recurso."
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr "Expandir Todas as Propriedades"
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr "Colapsar Todas as Propriedades"
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr "Guardar Como..."
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr "Copiar Parâmetros"
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr "Editar Área de Transferência de Recursos"
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr "Copiar Recurso"
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr "Tornar Incorporado"
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr "Tornar sub-recursos únicos"
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr "Abrir em Ajuda"
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr "Crie um novo recurso em memória edite-o."
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr "Carregue um recurso existente a partir do disco e edite-o."
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Guarde o recurso editado."
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr "Ir para o Objeto editado anteriormente no histórico."
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr "Ir para o próximo Objeto editado no histórico."
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr "Histórico de Objetos recentemente editados."
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr "Propriedades do Objeto."
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr "Propriedades do Filtro"
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr "As alterações podem ser perdidas!"
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr "Conjunto MultiNó"
+
+#: editor/node_dock.cpp
+msgid "Select a single node to edit its signals and groups."
+msgstr "Selecione um único nó para editar sinais e grupos."
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr "Editar Plugin"
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr "Criar Plugin"
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr "Nome do Plugin:"
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr "Sub-pasta:"
+
+#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
+msgid "Language:"
+msgstr "Linguagem:"
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr "Nome do Script:"
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr "Ativar agora?"
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr "Criar Polígono"
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Criar pontos."
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+"Editar Polígono:\n"
+"LMB: Mover Ponto\n"
+"RMB: Apagar Ponto"
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Apagar pontos."
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr "Editar Polígono"
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr "Inserir Ponto"
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr "Editar Polígono (Remover Ponto)"
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr "Remover Polígono e Ponto"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr "Adicionar Animação"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr "Carregar..."
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Move Node Point"
+msgstr "Mover Ponto Nó"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Limits"
+msgstr "Mudar Limites do BlendSpace1D"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Change BlendSpace1D Labels"
+msgstr "Mudar Legendas do BlendSpace1D"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr "Este tipo de nó não pode ser usado. Apenas nós raiz são permitidos."
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Node Point"
+msgstr "Adicionar Ponto Nó"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Animation Point"
+msgstr "Adicionar Ponto Animação"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Remove BlendSpace1D Point"
+msgstr "Remover Ponto de BlendSpace1D"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Move BlendSpace1D Node Point"
+msgstr "Mover Ponto Nó em BlendSpace1D"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+"AnimationTree está inativa.\n"
+"Active-a para permitir a reprodução, verifique avisos do nó se a ativação "
+"falhar."
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr "Definir a posição de mistura dentro do espaço"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr "Selecionar e mover pontos, criar pontos com RMB."
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Ativar ajuste e mostrar a grelha."
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr "Ponto"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr "Abrir Editor"
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr "Abrir Nó Animação"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists."
+msgstr "Já existe triângulo."
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Add Triangle"
+msgstr "Adicionar Triângulo"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Limits"
+msgstr "Mudar Limites do BlendSpace2D"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Change BlendSpace2D Labels"
+msgstr "Mudar Legendas do BlendSpace2D"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Point"
+msgstr "Remover Ponto do BlendSpace2D"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Remove BlendSpace2D Triangle"
+msgstr "Remover Triângulo do BlendSpace2D"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr "BlendSpace2D não pertence a um nó AnimationTree."
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr "Não existem triângulos, nenhuma mistura pode ocorrer."
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Toggle Auto Triangles"
+msgstr "Alternar Triângulos Auto"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr "Criar triângulos a ligar pontos."
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr "Apagar pontos e triângulos."
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr "Gera triângulos automaticamente (em vez de manual)"
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mistura:"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Parameter Changed"
+msgstr "Mudança de Parâmetro"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr "Editar filtros"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr "Saída do nó não pode ser adicionada à árvore de mistura."
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Add Node to BlendTree"
+msgstr "Adicionar Nó a BlendTree"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Node Moved"
+msgstr "Nó Movido"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+"Incapaz de conectar, porta pode estar em uso ou conexão pode ser inválida."
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Connected"
+msgstr "Nós Conectados"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Nodes Disconnected"
+msgstr "Nós Desconectados"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Set Animation"
+msgstr "Definir Animação"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Node"
+msgstr "Apagar Nó"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr "Apagar Nó(s)"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Toggle Filter On/Off"
+msgstr "Alternar Filtro On/Off"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Change Filter"
+msgstr "Alterar Filtro"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+"Reprodutor de animação não definido, a ser incapaz de recolher nome das "
+"faixas."
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+"Caminho do reprodutor é inválido, a ser incapaz de recolher nome das faixas."
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+"Reprodutor de animação não tem um caminha de nó raiz válido, a ser incapaz "
+"de recolher nome das faixas."
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Anim Clips"
+msgstr "Clips Anim"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Audio Clips"
+msgstr "Clips Áudio"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Functions"
+msgstr "Funções"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Renamed"
+msgstr "Nó Renomeado"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr "Adicionar Nó.."
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr "Editar Pistas Filtradas:"
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable Filtering"
+msgstr "Ativar Filtragem"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr "Alternar reprodução automática"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr "Novo Nome da Animação:"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr "Nova Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr "Mudar o Nome da Animação:"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr "Apagar Animação?"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr "Remover Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr "Nome de Animação inválido!"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr "Já existe o nome da Animação!"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr "Renomear Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr "Misturar Seguinte Alterado"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr "Mudar tempo de Mistura"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr "Carregar Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr "Duplicar Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr "Nenhuma animação para copiar!"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr "Nenhum recurso de animação na Área de Transferência!"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr "Animação Colada"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr "Colar Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr "Nenhuma animação para editar!"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+"Reproduzir a Animação selecionada para trás a partir da presente posição. (A)"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr "Reproduzir a Animação selecionada para trás a partir do fim. (Shift+A)"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr "Parar reprodução da Animação. (S)"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr "Reproduzir a Animação selecionada a partir do início. (Shift+D)"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr "Reproduzir a Animação selecionada a partir da presente posição. (D)"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr "Posição da Animação (em segundos)."
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr "Escalar globalmente a reprodução da animação para o nó."
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr "Ferramentas de Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation"
+msgstr "Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr "Editar Transições..."
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr "Abrir no Inspetor"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr "Mostrar lista de Animações no reprodutor."
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr "Reprodução automática no carregamento"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr "Ativar Onion Skinning"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning Options"
+msgstr "Opções de Onion Skinning"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr "Direções"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr "Passado"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr "Futuro"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr "Profundidade"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr "1 passo"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr "2 passos"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr "3 passos"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr "Apenas diferenças"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr "Forçar modulação branca"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr "Incluir Bugigangas (3D)"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr "Pregar AnimationPlayer"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr "Criar Nova Animação"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr "Nome da Animação:"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+msgid "Error!"
+msgstr "Erro!"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr "Tempos de Mistura:"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr "Próximo (Auto-Fila):"
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr "Tempos de Mistura de Animação cruzada"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Move Node"
+msgstr "Mover Nó"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition exists!"
+msgstr "Transição existe!"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Add Transition"
+msgstr "Adicionar Transição"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr "Adicionar Nó"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr "Fim"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr "Imediato"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr "Sinc"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr "No Fim"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr "Viagem"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr "Nós de início e fim são necessários para uma sub-transição."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr "Nenhum recurso de playback definido no caminho: %s."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Node Removed"
+msgstr "Nó Removido"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition Removed"
+msgstr "Transição Removida"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set Start Node (Autoplay)"
+msgstr "Definir Nó de Início (Reprodução Automática)"
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+"Selecionar e mover nós.\n"
+"RMB para adicionar novos nós.\n"
+"Shift+LMB para criar conexões."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr "Criar novos nós."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr "Conectar nós."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr "Remover nó ou transição selecionado."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+"Alternar autoplay deste animação em início, reinício ou procura de zero."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr "Definir a animação final. Útil para sub-transições."
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr "Transição: "
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Play Mode:"
+msgstr "Modo Jogo:"
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr "AnimationTree"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr "Novo nome:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr "Escala:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr "Aparecer (s):"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr "Desvanecer (s):"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr "Misturar"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr "Combinar"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr "Reinício automático:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr "Reinício (s):"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr "Reinício aleatório (s):"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr "Partida!"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr "Valor:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr "Mistura 0:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr "Mistura 1:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr "Tempo X-Fade (s):"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr "Atual:"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Input"
+msgstr "Adicionar entrada"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr "Limpar avanço automático"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr "Definir avanço automático"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr "Apagar entrada"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr "Árvore de Animação válida."
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr "Árvore de Animação inválida."
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr "Nó Animation"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr "Nó OneShot"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr "Nó Mix"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr "Nó Blend2"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr "Nó Blend3"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr "Nó Blend4"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr "Nó TimeScale"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr "Nó TimeSeek"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr "Nó Transition"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr "Importar Animações..."
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr "Editar Filtros de Nó"
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr "Filtros..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr "Conteúdos:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr "Ver Ficheiros"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr "Erro de ligação, tente novamente."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr "Não consigo ligar ao host:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr "Sem resposta do host:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr "Não consigo resolver hostname:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr "Falha na solicitação, código de retorno:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed."
+msgstr "Pedido falhado."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Cannot save response to:"
+msgstr "Não consigo guardar resposta para:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Write error."
+msgstr "Erro de escrita."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr "Falha na solicitação, demasiados redirecionamentos"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect loop."
+msgstr "Redirecionar ciclo."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, timeout"
+msgstr "Falha na solicitação, tempo expirado"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Timeout."
+msgstr "Tempo expirado."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr "Mau hash na transferência, assume-se que o Ficheiro foi manipulado."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr "Esperado:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr "Obtido:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr "Verificação hash sha256 falhada"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr "Erro na transferência de Ativo:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr "A transferir (%s / %s)..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr "A transferir..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr "A resolver..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr "Erro na criação da solicitação"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr "Inativo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install..."
+msgstr "Instalar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr "Repetir"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr "Erro na transferência"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr "A transferência deste Ativo já está em andamento!"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Recently Updated"
+msgstr "Atualizações Recentes"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Least Recently Updated"
+msgstr "Atualizações Menos Recentes"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Name (A-Z)"
+msgstr "Nome (A-Z)"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Name (Z-A)"
+msgstr "Nome (Z-A)"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "License (A-Z)"
+msgstr "Licença (A-Z)"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "License (Z-A)"
+msgstr "Licença (Z-A)"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr "Primeiro"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr "Anterior"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr "Próximo"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr "Último"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "All"
+msgstr "Todos"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No results for \"%s\"."
+msgstr "Nenhum resultado para \"%s\"."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Import..."
+msgstr "Importar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Plugins..."
+msgstr "Plugins..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr "Ordenar:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr "Categoria:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr "Site:"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support"
+msgstr "Suporte"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr "Oficial"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr "Em teste"
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Loading..."
+msgstr "A Carregar..."
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr "Ficheiro ZIP de Ativos"
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+"Não consigo determinar um caminho para guardar imagens lightmap.\n"
+"Guarde a sua cena (para as imagens serem guardadas na mesma diretoria), ou "
+"escolha um caminho nas propriedades BakedLightmap."
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+"Não há Meshes para consolidar. Assegure-se que contêm um canal UV2 e que a "
+"referência 'Bake Light' flag está on."
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr "Falha ao criar imagens lightmap, assegure-se que o caminho é gravável."
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr "Consolidar Lightmaps"
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Preview"
+msgstr "Pré-visualização"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr "Configurar Ajuste"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr "Compensação da grelha:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr "Passo da grelha:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Primary Line Every:"
+msgstr "Linha Primária Cada:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "steps"
+msgstr "passos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr "Compensação da rotação:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr "Passo da rotação:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Step:"
+msgstr "Passo de Escala:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Vertical Guide"
+msgstr "Mover Guia Vertical"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Vertical Guide"
+msgstr "Criar Guia Vertical"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Vertical Guide"
+msgstr "Remover Guia Vertical"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Horizontal Guide"
+msgstr "Mover Guia Horizontal"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal Guide"
+msgstr "Criar Guia Horizontal"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove Horizontal Guide"
+msgstr "Remover Guia Horizontal"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Horizontal and Vertical Guides"
+msgstr "Criar Guias Horizontais e Verticais"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr "Mover pivô"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr "Rodar CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr "Mover âncora"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr "Redimensionar CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Escalar CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr "Mover CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Children of containers have their anchors and margins values overridden by "
+"their parent."
+msgstr ""
+"As âncoras e margens de filhos de um contentores são sobrescritas pelo seu "
+"pai."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Presets for the anchors and margins values of a Control node."
+msgstr "Pré-definições para âncoras e margens de um nó Control."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"When active, moving Control nodes changes their anchors instead of their "
+"margins."
+msgstr ""
+"Quando ativo, mover nós Control altera as suas ancoras em vez das sua "
+"margens."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Top Left"
+msgstr "Topo Esquerda"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Top Right"
+msgstr "Topo Direita"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Bottom Right"
+msgstr "Fundo Direita"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Bottom Left"
+msgstr "Fundo Esquerda"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Left"
+msgstr "Centro Esquerda"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Top"
+msgstr "Centro Topo"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Right"
+msgstr "Centro Direita"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Bottom"
+msgstr "Centro Fundo"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center"
+msgstr "Centro"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Left Wide"
+msgstr "Esquerda Wide"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Top Wide"
+msgstr "Topo Wide"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Right Wide"
+msgstr "Direita Wide"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Bottom Wide"
+msgstr "Fundo Wide"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "VCenter Wide"
+msgstr "VCentro Wide"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "HCenter Wide"
+msgstr "HCentro Wide"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Full Rect"
+msgstr "Rect Completo"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Keep Ratio"
+msgstr "Manter Proporção"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr "Só âncoras"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr "Mudar âncoras e margens"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr "Mudar âncoras"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Game Camera Override\n"
+"Overrides game camera with editor viewport camera."
+msgstr ""
+"Sobreposição de Câmara de Jogo\n"
+"Sobrepõe câmara de jogo com câmara viewport do editor."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Game Camera Override\n"
+"No game instance running."
+msgstr ""
+"Sobreposição de Câmara de Jogo\n"
+"Nenhuma instância de jogo em execução."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock Selected"
+msgstr "Bloquear Seleção"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock Selected"
+msgstr "Desbloquear Seleção"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Group Selected"
+msgstr "Agrupar Seleção"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Ungroup Selected"
+msgstr "Desagrupar Seleção"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr "Colar Pose"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Guides"
+msgstr "Limpar Guias"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create Custom Bone(s) from Node(s)"
+msgstr "Criar Osso(s) Personalizado(s) a partis de Nó(s)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Bones"
+msgstr "Apagar Ossos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr "Criar corrente IK"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr "Apagar corrente IK"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Atenção: as crianças de um contentor obtêm a sua posição e tamanho "
+"determinados apenas pelos seus pais."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Reposição do Zoom"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode"
+msgstr "Modo seleção"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr "Arrastar: Rotação"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr "Alt+Arrastar: Mover"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+"Tecla 'v' para mudar Eixo, 'Shift+v' para arrastar Eixo (durante movimento)."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr "Alt+RMB: seleção da lista de profundidade"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode"
+msgstr "Modo mover"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr "Modo rodar"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Modo Escalar"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+"Mostra lista de todos os Objetos na posição clicada\n"
+"(o mesmo que Alt+RMB no modo seleção)."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr "Clique para mudar o Eixo de rotação do Objeto."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr "Modo deslocamento"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Ruler Mode"
+msgstr "Modo Régua"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle smart snapping."
+msgstr "Alternar ajuste inteligente."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Smart Snap"
+msgstr "Usar Ajuste Inteligente"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle grid snapping."
+msgstr "Alternar ajuste de grelha."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Grid Snap"
+msgstr "Usar Ajuste de Grelha"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr "Opções de Ajuste"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr "Usar Ajuste de Rotação"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Scale Snap"
+msgstr "Usar Ajuste de Escala"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr "Ajuste Relativo"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr "Usar Ajuste de Pixel"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart Snapping"
+msgstr "Ajuste Inteligente"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr "Configurar Ajuste..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Parent"
+msgstr "Ajustar ao Parente"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Anchor"
+msgstr "Ajustar ao Nó Âncora"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Sides"
+msgstr "Ajustar aos Lados do Nó"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Node Center"
+msgstr "Ajustar ao Centro do Nó"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Other Nodes"
+msgstr "Ajustar a Outros Nós"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to Guides"
+msgstr "Ajustar às Guias"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr "Bloquear a posição do objeto selecionado (não pode ser movido)."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr "Desbloquear o Objeto selecionado (pode ser movido)."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr "Assegura que os Objetos-filho não são selecionáveis."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr "Restaura a capacidade de selecionar os Objetos-filho."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Opções do Esqueleto"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr "Mostrar ossos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr "Fazer Osso(s) Personalizados a partis de Nó(s)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr "Apagar Ossos Personalizados"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr "Vista"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Always Show Grid"
+msgstr "Mostrar Grelha Sempre"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr "Mostrar ajudantes"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr "Mostrar réguas"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr "Mostrar guias"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr "Mostrar Origem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr "Mostrar Viewport"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Mostrar Grupo e Bloquear Ícones"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Centrar seleção"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr "Seleção de Frame"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Preview Canvas Scale"
+msgstr "Pré-visualizar Escala do Canvas"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Translation mask for inserting keys."
+msgstr "Máscara de translação para inserir chaves."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation mask for inserting keys."
+msgstr "Máscara de rotação para inserir chaves."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale mask for inserting keys."
+msgstr "Máscara de escala para inserir chaves."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys (based on mask)."
+msgstr "Inserir chaves (baseado na máscara)."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Auto insert keys when objects are translated, rotated or scaled (based on "
+"mask).\n"
+"Keys are only added to existing tracks, no new tracks will be created.\n"
+"Keys must be inserted manually for the first time."
+msgstr ""
+"Insere chaves automaticamente quando objetos são movidos, rodados ou "
+"redimensionados (baseado na máscara).\n"
+"Chaves apenas são adicionadas a pistas existentes, nenhumas pistas serão "
+"criadas.\n"
+"Chaves têm de ser inseridas manualmente na primeira vez."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Auto Insert Key"
+msgstr "Inserir Chave automaticamente"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation Key and Pose Options"
+msgstr "Chave de Animação e Opções de Pose"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr "Inserir Chave (Pistas existentes)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr "Copiar pose"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr "Limpar pose"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr "Multiplicar passo da grelha por 2"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr "Dividir passo da grelha por 2"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan View"
+msgstr "Vista Pan"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr "A adicionar %s..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr "Não consigo instanciar nós múltiplos sem raiz."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr "Criar Nó"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr "Erro a instanciar cena de %s"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Default Type"
+msgstr "Mudar Predefinição de Tipo"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+"Arrastar & largar + Shift : Adiciona nó como irmão\n"
+"Arrastar & largar + Alt : Altera o tipo de nó"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr "Criar Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar Polígono"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar Poly (Remover Ponto)"
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr "Definir Manipulador"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr "Carregar máscara de emissão"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Restart"
+msgstr "Reiniciar"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr "Limpar máscara de emissão"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr "Partículas"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr "Contagem de Pontos gerados:"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr "Máscara de Emissão"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Solid Pixels"
+msgstr "Pixeis Sólidos"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Border Pixels"
+msgstr "Pixeis da Margem"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Directed Border Pixels"
+msgstr "Pixeis da Margem Dirigidos"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr "Capturar a partir do pixel"
+
+#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr "Cores de Emissão"
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr "CPUParticles"
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr "Criar Pontos de emissão a partir da Malha"
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr "Criar Pontos de emissão a partir do Nó"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 0"
+msgstr "Plano 0"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat 1"
+msgstr "Plano 1"
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease In"
+msgstr "Ease In"
+
+#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+msgid "Ease Out"
+msgstr "Ease Out"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr "Smoothstep"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr "Modificar Ponto da curva"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr "Modificar tangente da curva"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr "Carregar Curva Predefinida"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add Point"
+msgstr "Adicionar Ponto"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Point"
+msgstr "Remover Ponto"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left Linear"
+msgstr "Linear Esquerda"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right Linear"
+msgstr "Linear Direita"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Preset"
+msgstr "Carregar Predefinição"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr "Remover Ponto da curva"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr "Alternar tangente linear da curva"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr "Pressione Shift para editar tangentes individualmente"
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right click to add point"
+msgstr "Clique direito para adicionar ponto"
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr "Consolidar Sonda GI"
+
+#: editor/plugins/gradient_editor_plugin.cpp
+msgid "Gradient Edited"
+msgstr "Gradiente Editado"
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr "Item %d"
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr "Itens"
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr "Editor da lista de itens"
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr "Criar Polígono oclusor"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr "A Malha está vazia!"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Não consegui criar uma forma de colisão Trimesh."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr "Criar corpo estático Trimesh"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr "Isto não funciona na raiz da cena!"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Shape"
+msgstr "Criar Forma Estática Trimesh"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Não consigo criar uma única forma convexa para a raiz da cena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Não consegui criar uma forma única de colisão convexa."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Criar Forma Convexa Simples"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Não consigo criar múltiplas formas de colisão convexas para a raiz da cena."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Não consegui criar qualquer forma de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Criar Múltiplas Formas Convexas"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr "Criar Malha de Navegação"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr "Malha contida não é do tipo ArrayMesh."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr "Falhou o desempacotamento UV, a Malha pode não ser múltipla?"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr "Nenhuma malha para depurar."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr "O Modelo não tem UV nesta camada"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr "Falta uma Malha a MeshInstance!"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr "A Malha não tem superfície para criar contornos!"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr "Tipo primitivo de Malha não é PRIMITIVE_TRIANGLES!"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr "Contorno não pode ser criado!"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr "Criar contorno"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr "Malha"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr "Criar corpo estático Trimesh"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Cria um StaticBody e atribui-lhe automaticamente uma forma de colisão "
+"baseada em polígonos.\n"
+"Esta é a mais precisa (mas mais lenta) opção para deteção de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr "Criar Irmão de Colisão Trimesh"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Cria uma forma de colisão baseada em polígonos.\n"
+"Esta é a mais precisa (mas mais lenta) opção para deteção de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Criar Irmãos Únicos de Colisão Convexa"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Cria uma única forma de colisão convexa.\n"
+"Esta é a mais rápida (mas menos precisa) opção para deteção de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Criar Vários Irmãos de Colisão Convexa"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Cria uma forma de colisão baseada em polígonos.\n"
+"Esta uma opção de desempenho intermédio entre as duas opções acima."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr "Criar Malha de Contorno..."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Cria uma malha de contorno estática. A malha de contorno terá as suas "
+"normais automaticamente invertidas.\n"
+"Pode ser usada no lugar da propriedade Aumentar de SpatialMaterial quando "
+"não é possível usar essa propriedade."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr "Ver UV1"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr "Ver UV2"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr "Desempacotar UV2 para Lightmap/AO"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr "Criar Malha de Contorno"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr "Tamanho do contorno:"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Channel Debug"
+msgstr "Debug Canal UV"
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr "Remover item %d?"
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid ""
+"Update from existing scene?:\n"
+"%s"
+msgstr ""
+"Atualizar a partir da cena existente?:\n"
+"%s"
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Mesh Library"
+msgstr "Bib. de Meshes"
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr "Adicionar item"
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr "Remover item selecionado"
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr "Importar da Cena"
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr "Atualizar a partir da Cena"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr "Fonte da Malha não especificada (nem MultiMesh no nó)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr "Fonte da Malha não especificada (e MultiMesh não contêm Malha)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr "A fonte da malha é inválida (caminho inválido)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr "A fonte da Malha é inválida (não é MeshInstance)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr "A fonte da Malha é inválida (não contêm um recurso Mesh)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr "Fonte de superfície não especificada."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr "A fonte de superfície é inválida (caminho inválido)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr "A fonte de superfície é inválida (sem geometria)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr "A fonte de superfície é inválida (sem faces)."
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr "Selecione uma fonte Malha:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr "Selecione uma superfície alvo:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr "Povoar superfície"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr "Povoar MultiMesh"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr "Superfície alvo:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr "Fonte Malha:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr "Eixo X"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr "Eixo Y"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr "Eixo Z"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr "Malha Eixo Cima:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr "Rotação aleatória:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr "Inclinação aleatória:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr "Escala aleatória:"
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr "Povoar"
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr "Criar Polígono de navegação"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Converter em CPUParticles"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr "A Gerar Visibilidade Rect"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr "Gerar Visibilidade do Rect"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr "Só pode definir um Ponto num Material ParticlesMaterial"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr "Tempo de geração (s):"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry's faces don't contain any area."
+msgstr "As faces da geometria não contêm qualquer área."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "The geometry doesn't contain any faces."
+msgstr "A geometria não contêm quaisquer faces."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't inherit from Spatial."
+msgstr "\"%s\" não descende de Spatial."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain geometry."
+msgstr "\"%s\" não contem geometria."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "\"%s\" doesn't contain face geometry."
+msgstr "\"%s\" não contem geometria de faces."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr "Criar emissor"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr "Pontos de emissão:"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr "Pontos de superfície"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr "Pontos de superfície+Normal (dirigida)"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr "Volume"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr "Fonte de emissão: "
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr "É necessário um Material processador do tipo 'ParticlesMaterial'."
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr "A gerar AABB"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr "Gerar visibilidade AABB"
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr "Gerar AABB"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr "Remover Ponto da curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr "Remover Out-Control da curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr "Remover In-Control da curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr "Adicionar Ponto à curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Dividir Curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr "Mover Ponto na curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr "Mover In-Control na curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr "Mover Out-Control na curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr "Selecionar Pontos"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr "Shift+Arrastar: Selecionar Pontos de controlo"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr "Clique: Adicionar Ponto"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Clique esquerdo: Dividir o Segmento (em curva)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr "Clique direito: Apagar Ponto"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr "Selecionar Pontos de controlo (Shift+Arrastar)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr "Adicionar Ponto (num espaço vazio)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr "Apagar Ponto"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr "Fechar curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp
+msgid "Options"
+msgstr "Opções"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr "Espelhar ângulos do manipulador"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr "Espelhar comprimentos do manipulador"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr "Ponto da curva #"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr "Definir posição do Ponto da curva"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr "Definir curva na posição"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr "Definir posição Curve Out"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr "Separar Caminho"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr "Remover Ponto de Caminho"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr "Remover Ponto Out-Control"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr "Remover Ponto In-Control"
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Separar segmento (na curva)"
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move Joint"
+msgstr "Mover Junta"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr "A propriedade esqueleto do Polygon2D não aponta para um nó Skeleton2D"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr "Sincronizar ossos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Sem textura neste polígono.\n"
+"Defina uma textura para poder editar UV."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr "Criar mapa UV"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Polygon 2D has internal vertices, so it can no longer be edited in the "
+"viewport."
+msgstr "Polygon 2D tem vértices internos, não poder ser editado no viewport."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr "Criar Polígono & UV"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr "Criar vértice interno"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr "Remover Vértice Interno"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr "Polígono inválido (precisa de 3 vértices diferentes)"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr "Adicionar Polígono Personalizado"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr "Remover Polígono Personalizado"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr "Transformar mapa UV"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr "Transformar Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "Pintar pesos dos ossos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Abrir editor UV de Polygon2D."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr "Editor UV de Polígono 2D"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr "UV"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr "Pontos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr "Polígonos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr "Ossos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr "Mover Ponto"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr "Ctrl: Rodar"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr "Shift: Mover tudo"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr "Shift+Ctrl: Escalar"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr "Mover Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr "Rodar Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr "Escalar Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+"Crie um polígono personalizado. Ativa a renderização de polígonos "
+"personalizados."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+"Remover um polígono personalizado. Se não restar nenhum, a renderização de "
+"polígonos personalizados é desativada."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr "Pintar pesos com determinada intensidade."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr "Despintar pesos com intensidade específica."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr "Raio:"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr "Polígono->UV"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr "UV->Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr "Limpar UV"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr "Configurações da Grelha"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Snap"
+msgstr "Ajustar"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr "Ativar Ajuste"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr "Grelha"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr "Mostrar grelha"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr "Configurar Grelha:"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr "Deslocação X da grelha:"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr "Deslocação Y da grelha:"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr "Passo X da grelha:"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr "Passo Y da grelha:"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr "Sincronizar Ossos com Polígono"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr "ERRO: Não consegui carregar recurso!"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr "Adicionar recurso"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr "Renomear recurso"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr "Apagar recurso"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr "Área de transferência de recursos vazia!"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr "Colar Recurso"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr "Instância:"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Type:"
+msgstr "Tipo:"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir no Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Load Resource"
+msgstr "Carregar recurso"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr "ResourcePreloader"
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr "AnimationTree não tem caminho definido para um AnimationPlayer"
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr "Caminho para AnimationPlayer é inválido"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr "Limpar Ficheiros recentes"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr "Fechar e guardar alterações?"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr "Erro ao escrever TextFile:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Could not load file at:"
+msgstr "Não consigo carregar ficheiro em:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr "Erro ao guardar ficheiro!"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr "Erro ao gravar tema."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr "Erro Ao Gravar"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr "Erro ao importar tema."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr "Erro ao importar"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New Text File..."
+msgstr "Novo Ficheiro de Texto..."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr "Abrir Ficheiro"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr "Guardar Ficheiro Como..."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Can't obtain the script for running."
+msgstr "Não consigo obter o script para executar."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Script failed reloading, check console for errors."
+msgstr "Falhou a re-leitura do script, analise os erros na consola."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Script is not in tool mode, will not be able to run."
+msgstr "Script não está no modo ferramenta, não será possível executá-lo."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"To run this script, it must inherit EditorScript and be set to tool mode."
+msgstr ""
+"Para executar este script, terá de descender de EditorScript e ser definido "
+"como modo ferramenta."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr "Importar tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Erro ao guardar tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Erro ao guardar"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr "Guardar tema como..."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "%s Class Reference"
+msgstr "Referência de classe %s"
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr "Localizar Seguinte"
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr "Localizar Anterior"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter scripts"
+msgstr "Scripts de filtro"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr "Alternar ordenação alfabética da lista de métodos."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Filter methods"
+msgstr "Métodos de filtro"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr "Ordenar"
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr "Mover para cima"
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr "Mover para baixo"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr "Próximo Script"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr "Script anterior"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr "Ficheiro"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr "Abrir..."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reopen Closed Script"
+msgstr "Reabrir Script Fechado"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr "Guardar tudo"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr "Script de Recarregamento"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr "Copiar Caminho do Script"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr "Histórico Anterior"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr "Histórico Seguinte"
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr "Tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Importar tema..."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr "Recarregar tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr "Guardar tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr "Fechar tudo"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr "Fechar documentos"
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr "Executar"
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr "Passar dentro"
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr "Passar sobre"
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr "Interrupção"
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr "Continuar"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr "Manter Depurador Aberto"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr "Depurar com Editor Externo"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation."
+msgstr "Abrir documentação online do Godot."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr "Procurar na documentação de referência."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr "Ir para o documento previamente editado."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr "Ir para o próximo documento editado."
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr "Descartar"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+"Os seguintes Ficheiros são mais recentes no disco.\n"
+"Que ação deve ser tomada?:"
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Reload"
+msgstr "Recarregar"
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Resave"
+msgstr "Reguardar"
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr "Depurador"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr "Resultados da Pesquisa"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Scripts"
+msgstr "Limpar Scripts Recentes"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Connections to method:"
+msgstr "Conecções ao método:"
+
+#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
+msgid "Source"
+msgstr "Fonte"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Target"
+msgstr "Alvo"
+
+#: editor/plugins/script_text_editor.cpp
+msgid ""
+"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
+msgstr "Falta método conectado '%s' para sinal '%s' do nó '%s' para nó '%s'."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr "[Ignorar]"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr "Linha"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Ir para Função"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr "Só podem ser largados recursos do Sistema de Ficheiros ."
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't drop nodes because script '%s' is not used in this scene."
+msgstr "Não consigo largar nós porque o script '%s' não é usado neste cena."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr "Símbolo Consulta"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr "Escolher cor"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr "Converter maiúsculas/minúsculas"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr "Maiúsculas"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr "Minúsculas"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr "Capitalizar"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr "Destaque de Sintaxe"
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Go To"
+msgstr "Ir Para"
+
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+msgid "Bookmarks"
+msgstr "Marcadores"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Breakpoints"
+msgstr "Pontos de paragem"
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr "Cortar"
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr "Selecionar tudo"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr "Apagar linha"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr "Indentar à esquerda"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr "Indentar à direita"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr "Alternar comentário"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr "Fechar/Abrir Linha"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr "Esconder todas as linhas"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr "Mostrar todas as linhas"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr "Clonar abaixo"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr "Completar símbolo"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Evaluate Selection"
+msgstr "Avaliar Seleção"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr "Apagar espaços nos limites"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr "Converter Indentação em Espaços"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr "Converter Indentação em Tabulação"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr "Indentação automática"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr "Localizar em Ficheiros..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr "Ajuda contextual"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Bookmark"
+msgstr "Alternar Marcador"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Bookmark"
+msgstr "Ir para Próximo Marcador"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Bookmark"
+msgstr "Ir para Marcador Anterior"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Bookmarks"
+msgstr "Remover todos os Marcadores"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr "Ir para Função..."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr "Ir para Linha..."
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr "Alternar Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr "Remover todos os Breakpoints"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr "Ir para Próximo Breakpoint"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr "Ir para Breakpoint Anterior"
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid ""
+"This shader has been modified on on disk.\n"
+"What action should be taken?"
+msgstr ""
+"Este Shader foi modificado no disco.\n"
+"Que ação deve ser tomada?"
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr "Shader"
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr "Este esqueleto não tem ossos, crie alguns nós filhos Bone2D."
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Create Rest Pose from Bones"
+msgstr "Criar Pose de Descanso a partir de Ossos"
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Rest Pose to Bones"
+msgstr "Definir Pose de Descanso para Ossos"
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr "Esqueleto2D"
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr "Criar Pose de Descanso (a partir de Ossos)"
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr "Pôr Ossos em Pose de Descanso"
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr "Criar ossos físicos"
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr "Esqueleto"
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr "Criar esqueleto físico"
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr "Executar IK"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr "Ortogonal"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr "Perspetiva"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr "Transformação abortada."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr "Transformação no Eixo X."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr "Transformação no Eixo Y."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr "Transformação no Eixo Z."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr "Ver Transformação do Plano."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr "A escalar: "
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr "A transladar: "
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr "A rodar %s graus."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr "Edição desativada (nenhuma chave inserida)."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr "Chave de Animação inserida."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Inclinação"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Direção"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr "Objetos desenhados"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr "Mudanças de Material"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr "Alterações do Shader"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr "Mudanças de superfície"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr "Chamadas de desenho"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr "Vértices"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr "Vista de topo."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr "Vista de fundo."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr "Fundo"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr "Vista de esquerda."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr "Esquerda"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr "Vista de direita."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr "Direita"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr "Vista de frente."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr "Frente"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr "Vista de trás."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr "Trás"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Transform with View"
+msgstr "Alinhar Transformação com Vista"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Rotation with View"
+msgstr "Alinhar Rotação com Vista"
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr "Sem parente para criar instância de filho."
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr "Esta operação requer um único nó selecionado."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Ortogonal Automático Ativado"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr "Bloquear Rotação da Vista"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr "Vista normal"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr "Vista wireframe"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr "Vista Overdraw"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr "Vista sem sombras"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr "Ver ambiente"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr "Ver Bugigangas"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr "Ver informação"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr "Ver FPS"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr "Meia resolução"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr "Audição de áudio"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Enable Doppler"
+msgstr "Ativar Doppler"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr "Pré-visualização Cinemática"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Not available when using the GLES2 renderer."
+msgstr "Não disponível para o renderizador GLES2."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr "Vista livre esquerda"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr "Vista livre direita"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr "Vista livre frente"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr "Vista livre trás"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr "Vista livre cima"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr "Vista livre baixo"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr "Modificador de velocidade Freelook"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Slow Modifier"
+msgstr "Modificador de Velocidade Freelook"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotação da Vista Bloqueada"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Note: The FPS value displayed is the editor's framerate.\n"
+"It cannot be used as a reliable indication of in-game performance."
+msgstr ""
+"Nota: O FPS mostrado é a taxa de frames do editor.\n"
+"Não é uma indicação fiável do desempenho do jogo."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr "Diálogo XForm"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Clique para alternar entre estados de visibilidade.\n"
+"\n"
+"Olho aberto: Bugiganga é visível.\n"
+"Olho fechado: Bugiganga está escondida.\n"
+"Olho meio-aberto: Bugiganga também é visível através de superfícies opacas "
+"(\"raios X\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Nodes To Floor"
+msgstr "Ajustar Nós ao Fundo"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Couldn't find a solid floor to snap the selection to."
+msgstr "Não foi encontrado um chão sólido para ajustar a seleção."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+"Arrastar: Rodar\n"
+"Alt+Arrastar: Mover\n"
+"Alt+RMB: Seleção lista de profundidade"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Local Space"
+msgstr "Usar Espaço Local"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Use Snap"
+msgstr "Usar Ajuste"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr "Vista de fundo"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr "Vista de topo"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr "Vista de trás"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr "Vista de frente"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr "Vista esquerda"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr "Vista direita"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal View"
+msgstr "Alternar Vista Perspetiva/Ortogonal"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr "Inserir Chave de Animação"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr "Focar na origem"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr "Focar na seleção"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr "Alternar Freelook"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform"
+msgstr "Transformar"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Object to Floor"
+msgstr "Ajustar Objetos ao Chão"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr "Diálogo de transformação..."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr "1 Viewport"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr "2 Viewports"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr "2 Viewports (Alt)"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr "3 Viewports"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr "3 Viewports (Alt)"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr "4 Viewports"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr "Bugigangas"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr "Ver origem"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr "Ver grelha"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings..."
+msgstr "Configuração..."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr "Configuração do Ajuste"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr "Ajuste de Translação:"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr "Ajuste de Rotação (graus):"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr "Ajuste de Escala (%):"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr "Configuração do Viewport"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr "Perspetiva FOV (graus):"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr "Ver Z-Near:"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr "Ver Z-Far:"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr "Mudar Transformação"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr "Translação:"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr "Rotação (graus):"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr "Escala (prop.):"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr "Tipo de transformação"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr "Pré"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr "Pós"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Nameless gizmo"
+msgstr "Bugiganga sem Nome"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Mesh2D"
+msgstr "Criar Mesh2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Mesh2D Preview"
+msgstr "Pré-visualização Mesh2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create Polygon2D"
+msgstr "Criar Polygon2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Polygon2D Preview"
+msgstr "Pré-visualização Polygon2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D"
+msgstr "Criar CollisionPolygon2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "CollisionPolygon2D Preview"
+msgstr "Pré-visualização CollisionPolygon2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D"
+msgstr "Criar LightOccluder2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "LightOccluder2D Preview"
+msgstr "Pré-visualização LightOccluder2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr "Sprite está vazia!"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr "Não consigo converter sprite com frames de animação para malha."
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr "Geometria inválida, não substituível por malha."
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Mesh2D"
+msgstr "Converter para Mesh2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create polygon."
+msgstr "Geometria inválida, não consigo criar polígono."
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to Polygon2D"
+msgstr "Converter para Polygon2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create collision polygon."
+msgstr "Geometria inválida, não consigo criar polígono de colisão."
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create CollisionPolygon2D Sibling"
+msgstr "Criar Irmão de CollisionPolygon2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't create light occluder."
+msgstr "Geometria inválida, não consigo criar oclusor de luz."
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create LightOccluder2D Sibling"
+msgstr "Criar Irmão de LightOccluder2D"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr "Sprite"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr "Simplificação: "
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Shrink (Pixels): "
+msgstr "Encolher (Pixeis): "
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr "Aumentar (Pixeis): "
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr "Atualizar Pré-visualização"
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr "Configuração:"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "No Frames Selected"
+msgstr "Não há Frames Selecionados"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add %d Frame(s)"
+msgstr "Adicionar %d Frame(s)"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr "Adicionar Frame"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Unable to load images"
+msgstr "Incapaz de carregar imagens"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr "ERRO: Recurso de frame não carregado!"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr "Recurso da Área de Transferência vazio ou não é textura!"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr "Colar Frame"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr "Adicionar vazio"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr "Mudar FPS da Animação"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr "(vazio)"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move Frame"
+msgstr "Mover Frame"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations:"
+msgstr "Animações:"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "New Animation"
+msgstr "Nova Animação"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#, fuzzy
+msgid "Speed:"
+msgstr "Velocidade (FPS):"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr "Ciclo"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames:"
+msgstr "Frames da Animação:"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add a Texture from File"
+msgstr "Adicionar Textura do Ficheiro"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frames from a Sprite Sheet"
+msgstr "Adicionar Frames de uma Folha de Sprites"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr "Inserir vazio (antes)"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr "Inserir vazio (depois)"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr "Mover (antes)"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr "Mover (depois)"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select Frames"
+msgstr "Selecionar Frames"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Horizontal:"
+msgstr "Horizontal:"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Vertical:"
+msgstr "Vertical:"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Select/Clear All Frames"
+msgstr "Selecionar/Apagar Todos os Frames"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Create Frames from Sprite Sheet"
+msgstr "Criar Frames a partir de Folha de Sprites"
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr "SpriteFrames"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr "Definir região Rect"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Definir Margem"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr "Modo Ajuste:"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Nenhum"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr "Ajuste de Pixel"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr "Ajuste de Grelha"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr "Corte automático"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr "Compensação:"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr "Passo:"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr "Sep.:"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr "TextureRegion"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr "Adicionar todos os itens"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr "Adicionar tudo"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr "Remover todos os itens"
+
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+msgid "Remove All"
+msgstr "Remover tudo"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit Theme"
+msgstr "Editar Tema"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr "Menu edição de tema."
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr "Adicionar itens de classe"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr "Remover itens de classe"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr "Criar Modelo vazio"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr "Criar Modelo Editor vazio"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr "Criar a partir de tema Editor atual"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Toggle Button"
+msgstr "Alternar Botão"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Button"
+msgstr "Desativar Botão"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr "Item"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled Item"
+msgstr "Item Desativado"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr "Verificar item"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr "Item Marcado"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr "Item Rádio"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr "Item Rádio Marcado"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Named Sep."
+msgstr "Sep. Nomeado"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Submenu"
+msgstr "Sub-menu"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 1"
+msgstr "Subitem 1"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subitem 2"
+msgstr "Subitem 2"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr "Tem"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr "Muitos"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Disabled LineEdit"
+msgstr "LineEdit Desativado"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr "Aba 1"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr "Aba 2"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr "Aba 3"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Editable Item"
+msgstr "Item Editável"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Subtree"
+msgstr "Sub-árvore"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr "Tem,Muitas,Opções"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr "Tipo de dados:"
+
+#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Icon"
+msgstr "Ícone"
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr "Estilo"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr "Letra"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr "Cor"
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme File"
+msgstr "Ficheiro Tema"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr "Apagar seleção"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr "Reparar Tiles inválidos"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Cortar Seleção"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr "Pintar TileMap"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr "Desenhar linha"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr "Pintar retângulo"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr "Preencher"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr "Apagar TileMap"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr "Localizar Tile"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr "Transpor"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Disable Autotile"
+msgstr "Desativar Autotile"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Enable Priority"
+msgstr "Ativar Prioridade"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Filter tiles"
+msgstr "Filtrar Tiles"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Give a TileSet resource to this TileMap to use its tiles."
+msgstr "Dê um recurso TileSet a este TileMap para usar os seus Tiles."
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr "Pintar Tile"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid ""
+"Shift+LMB: Line Draw\n"
+"Shift+Ctrl+LMB: Rectangle Paint"
+msgstr ""
+"Shift+LMB: Desenho de Linha\n"
+"Shift+Ctrl+LMB: Pintura de Retângulo"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr "Escolher Tile"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Left"
+msgstr "Rodar Esquerda"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate Right"
+msgstr "Rodar Direita"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Horizontally"
+msgstr "Inverter na Horizontal"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip Vertically"
+msgstr "Inverter na Vertical"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear Transform"
+msgstr "Limpar Transformação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr "Adicionar Textura(s) ao TileSet."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr "Remover Textura selecionado do TileSet."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr "Criar a partir da Cena"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr "Combinar a partir da Cena"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "New Single Tile"
+msgstr "Novo Tile Único"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "New Autotile"
+msgstr "Novo Autotile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "New Atlas"
+msgstr "Novo Atlas"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Next Coordinate"
+msgstr "Próxima Coordenada"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the next shape, subtile, or Tile."
+msgstr "Selecione a próxima forma, subtile ou Tile."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Previous Coordinate"
+msgstr "Coordenada Anterior"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Select the previous shape, subtile, or Tile."
+msgstr "Selecione a forma, subtile ou Tile anterior."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Region"
+msgstr "Região"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Collision"
+msgstr "Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Occlusion"
+msgstr "Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Navigation"
+msgstr "Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Bitmask"
+msgstr "Bitmask"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Priority"
+msgstr "Prioridade"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Z Index"
+msgstr "Índice Z"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Region Mode"
+msgstr "Modo Região"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Collision Mode"
+msgstr "Modo Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Occlusion Mode"
+msgstr "Modo Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Navigation Mode"
+msgstr "Modo Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Bitmask Mode"
+msgstr "Modo Bitmask"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Priority Mode"
+msgstr "Modo Prioridade"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Icon Mode"
+msgstr "Modo Ícone"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Z Index Mode"
+msgstr "Modo Índice Z"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr "Copiar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr "Colar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "Apagar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new rectangle."
+msgstr "Criar novo retângulo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Criar um novo polígono."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "Manter polígono dentro da região Rect."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "Ativar ajuste e mostrar a grelha (configurável através do Inspetor)."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Exibir nome dos Tiles (segure tecla Alt)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Add or select a texture on the left panel to edit the tiles bound to it."
+msgstr ""
+"Adicione ou selecione uma textura no painel esquerdo para editar os Tiles "
+"vinculados."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+"Remover textura selecionada? Todos os Tiles que a usam serão removidos."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr "Não selecionou uma textura para remover."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "Criar a partir de cena? Irá substituir todos os tiles atuais."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr "Combinar a partir da cena?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr "Remover Textura"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s ficheiro(s) não foi/foram adicionado(s) por já estar(em) na lista."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Arrastar manipuladores para editar Rect.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Eliminar Rect seleccionado."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Selecionar o sub-tile editado.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Apagar polígono."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Shift+LMB: Set wildcard bit.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"LMB: Ligar bit.\n"
+"RMB: Desligar bit.\n"
+"Shift+LMB: Definir bit genérico.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Selecionar sub-tile para usar como ícone, também será usado em ligações "
+"inválidas autotile.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Selecionar sub-tile para alterar a sua prioridade.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Selecionar sub-tile para alterar o seu índice.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr "Definir Região Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr "Criar Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "Definir Ícone de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr "Editar Bitmask to Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "Editar Polígono de Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr "Editar Polígono de Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr "Editar Polígono de Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr "Colar Bitmask de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "Limpar Bitmask de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Concave"
+msgstr "Fazer Polígono Côncavo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Polygon Convex"
+msgstr "Fazer Polígono Convexo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr "Remover Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr "Remover Polígono de Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr "Remover Polígono de Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr "Remover Polígono de Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr "Editar Prioridade de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "Editar Índice Z de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Convex"
+msgstr "Fazer Convexo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Make Concave"
+msgstr "Fazer Côncavo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr "Criar Polígono de Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr "Criar Polígono de Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr "Esta propriedade não pode ser alterada."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr "TileSet"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "No VCS addons are available."
+msgstr "Não existem addons VCS disponíveis."
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Error"
+msgstr "Erro"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "No commit message was provided"
+msgstr "Nenhuma mensagem de gravação foi fornecida"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "No files added to stage"
+msgstr "Nenhum ficheiro adicionado ao palco"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Commit"
+msgstr "Gravar"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "VCS Addon is not initialized"
+msgstr "Addon VCS não foi inicializado"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Version Control System"
+msgstr "Sistema de Controlo de Versões"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Initialize"
+msgstr "Inicializar"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Staging area"
+msgstr "Área de Palco"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Detect new changes"
+msgstr "Detetar novas alterações"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Changes"
+msgstr "Alterações"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Modified"
+msgstr "Modificado"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Renamed"
+msgstr "Renomeado"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Deleted"
+msgstr "Apagado"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Typechange"
+msgstr "Mudança de tipo"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Stage Selected"
+msgstr "Palco Selecionado"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Stage All"
+msgstr "Tudo no Palco"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Add a commit message"
+msgstr "Adicionar mensagem de gravação"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Commit Changes"
+msgstr "Gravar Alterações"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr "Status"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "View file diffs before committing them to the latest version"
+msgstr "Ver diffs dos ficheiros antes de atualizá-los para a última versão"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "No file diff is active"
+msgstr "Nenhum ficheiro diff está ativo"
+
+#: editor/plugins/version_control_editor_plugin.cpp
+msgid "Detect changes in file diff"
+msgstr "Detetar alterações em ficheiro diff"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(GLES3 only)"
+msgstr "(Apenas GLES3)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Output"
+msgstr "Adicionar Saída"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar"
+msgstr "Escalar"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector"
+msgstr "Vetor"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean"
+msgstr "Lógico"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sampler"
+msgstr "Mostrador"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add input port"
+msgstr "Adicionar porta de entrada"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add output port"
+msgstr "Adicionar porta de saída"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port type"
+msgstr "Mudar tipo de porta de entrada"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port type"
+msgstr "Mudar tipo de porta de saída"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change input port name"
+msgstr "Mudar nome de porta de entrada"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Change output port name"
+msgstr "Mudar nome de porta de saída"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove input port"
+msgstr "Remover porta de entrada"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Remove output port"
+msgstr "Remover porta de saída"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set expression"
+msgstr "Definir expressão"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Resize VisualShader node"
+msgstr "Redimensionar nó VisualShader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Uniform Name"
+msgstr "Definir Nome do Uniform"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Set Input Default Port"
+msgstr "Definir Porta de Entrada Predefinida"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node to Visual Shader"
+msgstr "Adicionar Nó ao Visual Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Duplicate Nodes"
+msgstr "Duplicar Nós"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr "Colar Nós"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Delete Nodes"
+msgstr "Apagar Nós"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Input Type Changed"
+msgstr "Alterado Tipo de Entrada do Visual Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr "Vértice"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr "Fragmento"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr "Luz"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Show resulted shader code."
+msgstr "Mostrar código-resultado do shader."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Create Shader Node"
+msgstr "Criar Nó Shader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color function."
+msgstr "Função Cor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color operator."
+msgstr "Operador de Cor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Grayscale function."
+msgstr "Função Cinza."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts HSV vector to RGB equivalent."
+msgstr "Converte vetor HSV para equivalente RGB."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts RGB vector to HSV equivalent."
+msgstr "Converte vetor RGB para equivalente HSV."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sepia function."
+msgstr "Função Sépia."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Burn operator."
+msgstr "Operador de Queima."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Darken operator."
+msgstr "Operador Escurecer."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Difference operator."
+msgstr "Operador Diferença."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Dodge operator."
+msgstr "Operador Desvio."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "HardLight operator."
+msgstr "Operador HardLight."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Lighten operator."
+msgstr "Operador Clarear."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Overlay operator."
+msgstr "Operador Sobrepor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Screen operator."
+msgstr "Operador Ecrã."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "SoftLight operator."
+msgstr "Operador SoftLight."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color constant."
+msgstr "Constante Cor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Color uniform."
+msgstr "Uniforme Cor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the %s comparison between two parameters."
+msgstr "Devolve o resultado lógico da comparação %s entre dois parâmetros."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Equal (==)"
+msgstr "Igual (==)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than (>)"
+msgstr "Maior Que (>)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Greater Than or Equal (>=)"
+msgstr "Maior ou Igual a (>=)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided scalars are equal, greater or "
+"less."
+msgstr ""
+"Devolve um vetor associado se o escalar fornecido for igual, maior ou menor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF and a scalar "
+"parameter."
+msgstr ""
+"Devolve o resultado lógico da comparação entre INF e um parâmetro escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between NaN and a scalar "
+"parameter."
+msgstr ""
+"Devolve o resultado lógico da comparação entre NaN e um parâmetro escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than (<)"
+msgstr "Menor Que (<)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Less Than or Equal (<=)"
+msgstr "Menor ou Igual a (<=)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Not Equal (!=)"
+msgstr "Diferente (!=)"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated vector if the provided boolean value is true or false."
+msgstr ""
+"Devolve um vetor associado se o valor lógico fornecido for verdadeiro ou "
+"falso."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns an associated scalar if the provided boolean value is true or false."
+msgstr ""
+"Devolve um escalar associado se o valor lógico fornecido for verdadeiro ou "
+"falso."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the boolean result of the comparison between two parameters."
+msgstr "Devolve o resultado lógico da comparação entre dois parâmetros."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the boolean result of the comparison between INF (or NaN) and a "
+"scalar parameter."
+msgstr ""
+"Devolve o resultado lógico da comparação entre INF (ou NaN) e um parâmetro "
+"escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean constant."
+msgstr "Constante Lógica."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Boolean uniform."
+msgstr "Uniforme Lógico."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for all shader modes."
+msgstr "parâmetro de entrada '%s' para todos os modos shader."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Input parameter."
+msgstr "Parâmetro de Entrada."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader modes."
+msgstr "parâmetro de entrada '%s' para os modos shader vertex e fragment."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment and light shader modes."
+msgstr "parâmetro de entrada '%s' para os modos shader fragment e light."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for fragment shader mode."
+msgstr "parâmetro de entrada '%s' para o modo shader fragment."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for light shader mode."
+msgstr "parâmetro de entrada '%s' para o modo shader light."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex shader mode."
+msgstr "parâmetro de entrada '%s' para modo shader vertex."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "'%s' input parameter for vertex and fragment shader mode."
+msgstr "parâmetro de entrada '%s' para os modos shader vertex e fragment."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar function."
+msgstr "Função Escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar operator."
+msgstr "Operador Escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "E constant (2.718282). Represents the base of the natural logarithm."
+msgstr "Constante E (2.718282). Base dos logaritmos naturais."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Epsilon constant (0.00001). Smallest possible scalar number."
+msgstr "Constante Epsilon (0.00001). O menor número escalar possível."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Phi constant (1.618034). Golden ratio."
+msgstr "Constante Phi (1.618034). Proporção áurea."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/4 constant (0.785398) or 45 degrees."
+msgstr "Constante Pi/4 (0.785398) ou 45 graus."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi/2 constant (1.570796) or 90 degrees."
+msgstr "Constante Pi/2 (1.570796) ou 90 graus."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Pi constant (3.141593) or 180 degrees."
+msgstr "Constante Pi (3.141593) ou 180 graus."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Tau constant (6.283185) or 360 degrees."
+msgstr "Constante Tau (6.283185) ou 360 graus."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Sqrt2 constant (1.414214). Square root of 2."
+msgstr "Constante Sqrt2 (1.414214). Raiz quadrada de 2."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the absolute value of the parameter."
+msgstr "Devolve o valor absoluto do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-cosine of the parameter."
+msgstr "Devolve o arco seno do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic cosine of the parameter."
+msgstr "Devolve o arco cosseno hiperbólico do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-sine of the parameter."
+msgstr "Devolve o arco seno do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic sine of the parameter."
+msgstr "Devolve o arco seno hiperbólico do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameter."
+msgstr "Devolve o arco tangente do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the arc-tangent of the parameters."
+msgstr "Devolve o arco tangente do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse hyperbolic tangent of the parameter."
+msgstr "Devolve o arco tangente hiperbólico do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Finds the nearest integer that is greater than or equal to the parameter."
+msgstr "Encontra o inteiro mais próximo que seja maior ou igual ao parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Constrains a value to lie between two further values."
+msgstr "Restringe um valor entre dois valores suplementares."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the cosine of the parameter."
+msgstr "Devolve o cosseno do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic cosine of the parameter."
+msgstr "Devolve o cosseno hiperbólico do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in radians to degrees."
+msgstr "Converte um valor em radianos para graus."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-e Exponential."
+msgstr "Exponencial base e."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 Exponential."
+msgstr "Exponencial base 2."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer less than or equal to the parameter."
+msgstr "Encontra o inteiro mais próximo que seja menor ou igual ao parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Computes the fractional part of the argument."
+msgstr "Calcula a parte fracionária do argumento."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the inverse of the square root of the parameter."
+msgstr "Devolve o inverso da raiz quadrada do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Natural logarithm."
+msgstr "Logaritmo natural."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Base-2 logarithm."
+msgstr "Logaritmo base 2."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the greater of two values."
+msgstr "Devolve o maior de dois valores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the lesser of two values."
+msgstr "Devolve o menor de dois valores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two scalars."
+msgstr "Interpolação linear entre dois escalares."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the opposite value of the parameter."
+msgstr "Devolve o valor oposto do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - scalar"
+msgstr "1.0 - escalar"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the value of the first parameter raised to the power of the second."
+msgstr "Devolve o valor do primeiro parâmetro elevado à potência do segundo."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Converts a quantity in degrees to radians."
+msgstr "Converte um valor em graus para radianos."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / scalar"
+msgstr "1.0 / escalar"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest integer to the parameter."
+msgstr "Encontra o inteiro mais próximo do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the nearest even integer to the parameter."
+msgstr "Encontra o inteiro ímpar mais próximo do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Clamps the value between 0.0 and 1.0."
+msgstr "Limita o valor entre 0.0 e 1.0."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Extracts the sign of the parameter."
+msgstr "Extrai o sinal do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the sine of the parameter."
+msgstr "Devolve o seno do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic sine of the parameter."
+msgstr "Devolve o seno hiperbólico do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the square root of the parameter."
+msgstr "Devolve a raiz quadrada do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+"Função SmoothStep( escalar(limite0), escalar(limite1), escalar(x) ).\n"
+"\n"
+"Devolve 0.0 se 'x' for menor que 'limite0' e 1.0 se 'x' for maior que "
+"'limite1'. Caso contrário o valor devolvido é interpolado entre 0.0 and 1.0 "
+"a usar polinomiais Hermite."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), scalar(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+"Função Step( escalar(limite), escalar(x) ).\n"
+"\n"
+"Devolve 0.0 se 'x' for menor que 'limite' e 1.0 se não for."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the tangent of the parameter."
+msgstr "Devolve a tangente do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the hyperbolic tangent of the parameter."
+msgstr "Devolve a tangente hiperbólica do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Finds the truncated value of the parameter."
+msgstr "Encontra o valor truncado do parâmetro."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds scalar to scalar."
+msgstr "Adiciona escalar a escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides scalar by scalar."
+msgstr "Divide escalar por escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies scalar by scalar."
+msgstr "Multiplica escalar por escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two scalars."
+msgstr "Devolve o resto dos dois escalares."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts scalar from scalar."
+msgstr "Subtrai escalar a escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar constant."
+msgstr "Constante Escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Scalar uniform."
+msgstr "Uniforme Escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the cubic texture lookup."
+msgstr "Executa cubic texture lookup."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Perform the texture lookup."
+msgstr "Executa texture lookup."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Cubic texture uniform lookup."
+msgstr "Consulta uniforme de textura cúbica."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup."
+msgstr "Consulta uniforme de textura 2D."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "2D texture uniform lookup with triplanar."
+msgstr "Consulta uniforme de textura 2D com triplanar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform function."
+msgstr "Função Transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Calculate the outer product of a pair of vectors.\n"
+"\n"
+"OuterProduct treats the first parameter 'c' as a column vector (matrix with "
+"one column) and the second parameter 'r' as a row vector (matrix with one "
+"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix "
+"whose number of rows is the number of components in 'c' and whose number of "
+"columns is the number of components in 'r'."
+msgstr ""
+"Calcula o produto tensorial de um par de vetores.\n"
+"\n"
+"OuterProduct trata o primeiro parâmetro 'c' como um vetor coluna (matriz com "
+"uma coluna) e o segundo parâmetro 'r' como um vetor linha (matriz com uma "
+"linha) e faz uma multiplicação matricial algébrica linear 'c * r', a "
+"resultar uma matriz cujo número de linhas é o número de componentes em 'c' e "
+"cujo número de colunas é o número de componentes de 'r'."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes transform from four vectors."
+msgstr "Compõe transformação a partir de quatro vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes transform to four vectors."
+msgstr "Decompõe transformação em quatro vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the determinant of a transform."
+msgstr "Calcula o determinante de uma transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the inverse of a transform."
+msgstr "Calcula o inverso de uma transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the transpose of a transform."
+msgstr "Calcula a transposta de uma transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies transform by transform."
+msgstr "Multiplica transformação por transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by transform."
+msgstr "Multiplica vetor por transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform constant."
+msgstr "Constante Transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Transform uniform."
+msgstr "Uniforme Transformação."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector function."
+msgstr "Função Vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector operator."
+msgstr "Operador Vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Composes vector from three scalars."
+msgstr "Compõe vetor a partir de três escalares."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Decomposes vector to three scalars."
+msgstr "Decompõe vetor em três escalares."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the cross product of two vectors."
+msgstr "Calcula o produto vetorial de dois vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the distance between two points."
+msgstr "Devolve a distância entre dois pontos."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the dot product of two vectors."
+msgstr "Calcula o produto escalar de dois vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the same direction as a reference vector. "
+"The function has three vector parameters : N, the vector to orient, I, the "
+"incident vector, and Nref, the reference vector. If the dot product of I and "
+"Nref is smaller than zero the return value is N. Otherwise -N is returned."
+msgstr ""
+"Devolve um vetor com a mesma direção de um vetor referência. A função tem "
+"três parâmetro: N, o vetor a orientar, I, o vetor incidente, e Nref, o vetor "
+"referência. Se o produto escalar de I e Nref for menor que zero o valor de "
+"retorno é N, Caso contrário -N será devolvido."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the length of a vector."
+msgstr "Calcula o comprimento de um vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors."
+msgstr "Interpolação linear entre dois vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Linear interpolation between two vectors using scalar."
+msgstr "Interpolação linear entre dois vetores a usar um escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Calculates the normalize product of vector."
+msgstr "Calcula o produto normalizado do vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 - vector"
+msgstr "1.0 - vetor"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "1.0 / vector"
+msgstr "1.0 / vetor"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns the vector that points in the direction of reflection ( a : incident "
+"vector, b : normal vector )."
+msgstr ""
+"Devolve um vetor que aponta na direção da reflexão ( a : vetor incidente, "
+"b : vetor normal )."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the vector that points in the direction of refraction."
+msgstr "Devolve um vetor que aponta na direção da refração."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+"Função SmoothStep( vetor(limite0), vetor(limite1), vetor(x) ).\n"
+"\n"
+"Devolve 0.0 se 'x' for menor que 'limite0' e 1.0 se 'x' for maior que "
+"'limite1'. Caso contrário o valor devolvido é interpolado entre 0.0 and 1.0 "
+"a usar polinomiais Hermite."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
+"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
+"using Hermite polynomials."
+msgstr ""
+"Função SmoothStep( escalar(limite0), escalar(limite1), vetor(x) ).\n"
+"\n"
+"Devolve 0.0 se 'x' for menor que 'limite0' e 1.0 se 'x' for maior que "
+"'limite1'. Caso contrário o valor devolvido é interpolado entre 0.0 and 1.0 "
+"a usar polinomiais Hermite."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( vector(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+"Função Step( vetor(limite), vetor(x) ).\n"
+"\n"
+"Devolve 0.0 se 'x' for menor que 'limite', senão devolve 1.0."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Step function( scalar(edge), vector(x) ).\n"
+"\n"
+"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
+msgstr ""
+"Função Step( escalar(limite), vetor(x) ).\n"
+"\n"
+"Devolve 0.0 se 'x' for menor que 'limite', senão devolve 1.0."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Adds vector to vector."
+msgstr "Adiciona vetor a vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Divides vector by vector."
+msgstr "Divide vetor com vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Multiplies vector by vector."
+msgstr "Multiplica vetor com vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Returns the remainder of the two vectors."
+msgstr "Devolve o resto dos dois vetores."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Subtracts vector from vector."
+msgstr "Subtrai vetor a vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector constant."
+msgstr "Constante Vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vector uniform."
+msgstr "Uniforme Vetor."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, with custom amount of input and "
+"output ports. This is a direct injection of code into the vertex/fragment/"
+"light function, do not use it to write the function declarations inside."
+msgstr ""
+"Expressão personalizada da Linguagem Godot Shader, com quantidade variável "
+"de portas de entrada e saída. Isto é uma injeção direta de código na função "
+"vertex/fragment/light, não a use para escrever as declarações internas da "
+"função."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Returns falloff based on the dot product of surface normal and view "
+"direction of camera (pass associated inputs to it)."
+msgstr ""
+"Devolve queda baseada no produto escalar da normal à superfície e da direção "
+"da câmara (passa entradas associadas)."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"Custom Godot Shader Language expression, which is placed on top of the "
+"resulted shader. You can place various function definitions inside and call "
+"it later in the Expressions. You can also declare varyings, uniforms and "
+"constants."
+msgstr ""
+"Expressão personalizada em Linguagem Godot Shader, posta sobre o shader "
+"resultante. Pode pôr várias definições de função e chamá-las depois nas "
+"Expressões. Também pode declarar variantes, uniformes e constantes."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Scalar derivative function."
+msgstr "(Apenas modo Fragment/Light) Função derivada escalar."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "(Fragment/Light mode only) Vector derivative function."
+msgstr "(Apenas modo Fragment/Light) Função derivada vetorial."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
+"differencing."
+msgstr "(Apenas modo Fragment/Light) Derivada em 'x' a usar derivação local."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
+"differencing."
+msgstr ""
+"(Apenas modo Fragment/Light) (Escalar) Derivada em 'x' a usar derivação "
+"local."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+"(Apenas modo Fragment/Light) (Vetor) Derivada em 'y' a usar derivação local."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
+"differencing."
+msgstr ""
+"(Apenas modo Fragment/Light) (Escalar) Derivada em 'y' a usar derivação "
+"local."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+"(Apenas modo Fragment/Light) (Vetor) Soma das derivadas absolutas em 'x' e "
+"'y'."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid ""
+"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
+"'y'."
+msgstr ""
+"(Apenas modo Fragment/Light) (Escalar) Soma das derivadas absolutas em 'x' e "
+"'y'."
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr "VIsualShader"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Edit Visual Property"
+msgstr "Editar Propriedade Visual"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Visual Shader Mode Changed"
+msgstr "Modo do Visual Shader Alterado"
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr "Executável"
+
+#: editor/project_export.cpp
+msgid "Add initial export..."
+msgstr "Adicionar exportação inicial..."
+
+#: editor/project_export.cpp
+msgid "Add previous patches..."
+msgstr "Aplicar correções anteriores..."
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr "Apagar correção '%s' da lista?"
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr "Apagar predefinição '%s'?"
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"Export templates seem to be missing or invalid."
+msgstr ""
+"Falhou a exportação do projeto para a plataforma '%s'.\n"
+"O Modelo de exportação está ausente ou é inválido."
+
+#: editor/project_export.cpp
+msgid ""
+"Failed to export the project for platform '%s'.\n"
+"This might be due to a configuration issue in the export preset or your "
+"export settings."
+msgstr ""
+"Falhou a exportação do projeto para a plataforma '%s'.\n"
+"Pode ser provocado por um problema na predefinição ou configuração da "
+"exportação."
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr "Libertar"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "A Exportar Tudo"
+
+#: editor/project_export.cpp
+msgid "The given export path doesn't exist:"
+msgstr "O caminho de exportação não existe:"
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+"Modelos de exportação para esta plataforma estão ausentes/corrompidos :"
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr "Predefinições"
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr "Adicionar..."
+
+#: editor/project_export.cpp
+msgid ""
+"If checked, the preset will be available for use in one-click deploy.\n"
+"Only one preset per platform may be marked as runnable."
+msgstr ""
+"Se marcada, a predefinição estará disponível para uso em distribuição um-"
+"clique.\n"
+"Apenas uma predefinição por plataforma pode ser marcada como executável."
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Exportar Caminho"
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr "Recursos"
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr "Exportar todos os recursos do Projeto"
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr "Exportar cenas (e dependências) selecionadas"
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr "Exportar recursos (e dependências) selecionados"
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr "Modo exportação:"
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr "Recursos a exportar:"
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files/folders\n"
+"(comma-separated, e.g: *.json, *.txt, docs/*)"
+msgstr ""
+"Filtros para exportar ficheiros/pastas não-recursos\n"
+"(separados por vírgula, ex: *.json, *.txt, docs/*)"
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files/folders from project\n"
+"(comma-separated, e.g: *.json, *.txt, docs/*)"
+msgstr ""
+"Filtros para excluir ficheiros/pastas do projeto\n"
+"(separados por vírgula, ex: *.json, *.txt, docs/*)"
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr "Correções"
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr "Fazer Correção"
+
+#: editor/project_export.cpp
+msgid "Pack File"
+msgstr "Ficheiro Pacote"
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr "Características"
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr "Personalizado (separados por vírgula):"
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr "Lista de Características:"
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo Exportação de Script:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Encriptado (Fornecer Chave em Baixo)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Chave de Encriptação Inválida (tem de ter 64 caracteres)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Chave de Encriptação de Script (Hexadecimal 256-bits):"
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr "Exportar PCK/Zip"
+
+#: editor/project_export.cpp
+msgid "Export Project"
+msgstr "Exportar Projeto"
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Modo Exportação?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Exportar Tudo"
+
+#: editor/project_export.cpp editor/project_manager.cpp
+msgid "ZIP File"
+msgstr "Ficheiro ZIP"
+
+#: editor/project_export.cpp
+msgid "Godot Game Pack"
+msgstr "Pacote de Jogo Godot"
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr "Não existem Modelos de exportação para esta plataforma:"
+
+#: editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr "Gerir Modelos de Exportação"
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr "Exportar com Depuração"
+
+#: editor/project_manager.cpp
+msgid "The path specified doesn't exist."
+msgstr "O caminho especificado não existe."
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Erro ao abrir ficheiro comprimido (não está no formato ZIP)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr ""
+"Ficheiro de projeto \".zip\" inválido, não contém um ficheiro \"project.godot"
+"\"."
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr "Por favor escolha uma pasta vazia."
+
+#: editor/project_manager.cpp
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Escolha um ficheiro \"project.godot\" ou \".zip\"."
+
+#: editor/project_manager.cpp
+msgid "This directory already contains a Godot project."
+msgstr "Esta diretoria já contém um projeto Godot."
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr "Novo Projeto de jogo"
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr "Projeto importado"
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr "Nome do Projeto Inválido."
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr "Não consigo criar pasta."
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr "Já existe uma pasta neste caminho com o nome indicado."
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr "Seria uma boa ideia dar um nome ao Projeto."
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr "Caminho de projeto inválido (alguma alteração?)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+"Não consegui carregar o project.godot no caminho do projeto (erro %d). "
+"Poderá estar em falta ou corrompido."
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr "Não consigo editar project.godot no caminho do projeto."
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr "Não consigo criar project.godot no caminho do projeto."
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr "Renomear Projeto"
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr "Importar Projeto existente"
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr "Importar & Editar"
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr "Criar novo Projeto"
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr "Criar & Editar"
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr "Instalar Projeto:"
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr "Instalar & Editar"
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr "Nome do Projeto:"
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr "Caminho do Projeto:"
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr "Caminho de Instalação do Projeto:"
+
+#: editor/project_manager.cpp
+msgid "Renderer:"
+msgstr "Renderizador:"
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 3.0"
+msgstr "OpenGL ES 3.0"
+
+#: editor/project_manager.cpp
+msgid ""
+"Higher visual quality\n"
+"All features available\n"
+"Incompatible with older hardware\n"
+"Not recommended for web games"
+msgstr ""
+"Qualidade visual superior\n"
+"Todas as características disponíveis\n"
+"Incompatível com hardware antigo\n"
+"Não recomendado para jogos Web"
+
+#: editor/project_manager.cpp
+msgid "OpenGL ES 2.0"
+msgstr "OpenGL ES 2.0"
+
+#: editor/project_manager.cpp
+msgid ""
+"Lower visual quality\n"
+"Some features not available\n"
+"Works on most hardware\n"
+"Recommended for web games"
+msgstr ""
+"Qualidade visual inferior\n"
+"Algumas características indisponíveis\n"
+"Funciona na maioria do hardware\n"
+"Recomendado para jogos Web"
+
+#: editor/project_manager.cpp
+msgid "Renderer can be changed later, but scenes may need to be adjusted."
+msgstr ""
+"O renderizador pode ser alterado mais tarde, mas as cenas poderão ter de ser "
+"ajustadas."
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr "Projeto sem nome"
+
+#: editor/project_manager.cpp
+msgid "Missing Project"
+msgstr "Projeto Inexistente"
+
+#: editor/project_manager.cpp
+msgid "Error: Project is missing on the filesystem."
+msgstr "Erro: Projeto inexistente no sistema de ficheiros."
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr "Não consigo abrir projeto em '%s'."
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr "Está seguro que quer abrir mais do que um Projeto?"
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file does not specify the version of Godot "
+"through which it was created.\n"
+"\n"
+"%s\n"
+"\n"
+"If you proceed with opening it, it will be converted to Godot's current "
+"configuration file format.\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+"A seguinte configuração do projeto não especifica a versão do Godot em que "
+"foi criada.\n"
+"\n"
+"%s\n"
+"\n"
+"Se continuar com a abertura, será convertida para o formato da versão "
+"atual.\n"
+"Aviso: Não conseguirá mais abrir o projeto em versões anteriores à deste "
+"motor."
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You won't be able to open the project with previous versions of the "
+"engine anymore."
+msgstr ""
+"A seguinte configuração do projeto foi gerada por um motor mais antigo, e "
+"precisa de ser convertida para esta versão.\n"
+"\n"
+"%s\n"
+"\n"
+"Deseja convertê-la?\n"
+"Aviso: Não conseguirá mais abrir o projeto em versões anteriores à deste "
+"motor."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"A configuração do projeto foi criada por um motor de versão mais recente, "
+"cuja configuração não é compatível com esta versão."
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in the Project Settings under "
+"the \"Application\" category."
+msgstr ""
+"Não consigo executar o projeto: cena principal não definida.\n"
+"Edite o projeto e defina a cena principal em Configurações do Projeto dentro "
+"da categoria \"Application\"."
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+"Não consigo executar o projeto: Ativos têm de ser importados.\n"
+"Edite o projeto para desencadear a importação inicial."
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run %d projects at once?"
+msgstr "Está seguro que quer executar %d projetos em simultâneo?"
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove %d projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+"Remover %d projetos da lista?\n"
+"O conteúdo das pastas não será modificado."
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove this project from the list?\n"
+"The project folder's contents won't be modified."
+msgstr ""
+"Remover este projeto da lista?\n"
+"O conteúdo da pasta não será modificado."
+
+#: editor/project_manager.cpp
+msgid ""
+"Remove all missing projects from the list?\n"
+"The project folders' contents won't be modified."
+msgstr ""
+"Remover todos os projetos inexistentes da lista?\n"
+"O conteúdo das pastas não será modificado."
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The interface will update after restarting the editor or project manager."
+msgstr ""
+"Linguagem alterada.\n"
+"A interface será atualizada após o arranque do editor ou do gestor de "
+"projetos."
+
+#: editor/project_manager.cpp
+msgid ""
+"Are you sure to scan %s folders for existing Godot projects?\n"
+"This could take a while."
+msgstr ""
+"Pretende pesquisar %s pastas por projetos Godot existentes?\n"
+"Pode demorar um pouco."
+
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr "Gestor de Projetos"
+
+#: editor/project_manager.cpp
+msgid "Projects"
+msgstr "Projetos"
+
+#: editor/project_manager.cpp
+msgid "Last Modified"
+msgstr "Última modificação"
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr "Analisar"
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr "Selecione uma pasta para analisar"
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr "Novo Projeto"
+
+#: editor/project_manager.cpp
+msgid "Remove Missing"
+msgstr "Remover Ausente"
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr "Modelos"
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr "Reiniciar agora"
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr "Não consigo executar o Projeto"
+
+#: editor/project_manager.cpp
+msgid ""
+"You currently don't have any projects.\n"
+"Would you like to explore official example projects in the Asset Library?"
+msgstr ""
+"Atualmente não tem quaisquer projetos.\n"
+"Gostaria de explorar os projetos de exemplo oficiais na Biblioteca de Ativos?"
+
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"A caixa de pesquisa filtra projetos por nome e último componente do "
+"caminho.\n"
+"Para filtrar projetos por nome e caminho completo, a pesquisa tem de conter "
+"pelo menos um caráter `/`."
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr "Tecla "
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr "Botão do joystick"
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr "Eixo do joystick"
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr "Botão do rato"
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+"Nome de ação inválido. Não pode ser vazio nem conter '/', ':', '=', '\\' ou "
+"'\"'"
+
+#: editor/project_settings_editor.cpp
+msgid "An action with the name '%s' already exists."
+msgstr "Já existe uma ação com o nome '%s'."
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr "Renomear evento ação de entrada"
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr "Mudar a zona morta da Ação"
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr "Adicionar evento ação de entrada"
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr "Todos os Aparelhos"
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr "Aparelho"
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr "Pressione uma tecla..."
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr "Índice do botão do rato:"
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr "Botão esquerdo"
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr "Botão direito"
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr "Botão do meio"
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr "Botão roda para cima"
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr "Botão roda para baixo"
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr "Roda Botão Esquerdo"
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr "Roda Botão Direito"
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr "X Botão 1"
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr "X Botão 2"
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr "Índice do Eixo do joystick:"
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr "Eixo"
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr "Índice do botão do joypad:"
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr "Apagar Ação de Entrada"
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr "Apagar evento ação de entrada"
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr "Adicionar evento"
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr "Botão"
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr "Botão esquerdo."
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr "Botão direito."
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr "Botão do meio."
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr "Roda para cima."
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr "Roda para baixo."
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr "Adicionar Propriedade global"
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr "Selecione primeiro um item de configuração!"
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr "Não existe a Propriedade '%s'."
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr "Configuração '%s' é interna e não pode ser removida."
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr "Apagar item"
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+"Nome de ação inválido. Não pode ser vazio nem conter '/', ':', '=', '\\' ou "
+"'\"'."
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr "Adicionar ação de entrada"
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr "Erro ao guardar configuração."
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr "Configuração guardada."
+
+#: editor/project_settings_editor.cpp
+msgid "Moved Input Action Event"
+msgstr "Evento Ação de Entrada movido"
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr "Sobrepor por Característica"
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr "Adicionar tradução"
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr "Remover tradução"
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr "Adicionar Caminho Remapeado"
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr "Recurso Remap Adicionar Remap"
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr "Mudar Recurso Linguagem Remap"
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr "Remover remapeamento de recurso"
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr "Remover Recurso Opção Remap"
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr "Filtro de localização alterado"
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr "Modo filtro de localização alterado"
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr "Configurações do Projeto (project.godot)"
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr "Geral"
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr "Sobrepor Por..."
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "The editor must be restarted for changes to take effect."
+msgstr "O editor deve ser reiniciado para que as alterações entrem em vigor."
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr "Mapa de entrada"
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr "Ação:"
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr "Ação"
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr "Zona morta"
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr "Aparelho:"
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr "Índice:"
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr "Localização"
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr "Traduções"
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr "Traduções:"
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr "Remapeamentos"
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr "Recursos:"
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr "Remapear por localização:"
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr "Localização"
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr "Filtro de localização"
+
+#: editor/project_settings_editor.cpp
+msgid "Show All Locales"
+msgstr "Mostrar Todos os Idiomas"
+
+#: editor/project_settings_editor.cpp
+msgid "Show Selected Locales Only"
+msgstr "Mostrar Apenas Idiomas Selecionados"
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr "Modo de filtro:"
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr "Localizações:"
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr "Carregamento automático"
+
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr "Plugins"
+
+#: editor/property_editor.cpp
+msgid "Preset..."
+msgstr "Predefinição..."
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr "Zero"
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr "Easing In-Out"
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr "Easing Out-In"
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr "Ficheiro..."
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr "Diretoria..."
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr "Atribuir"
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr "Selecionar Nó"
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr "Erro ao carregar Ficheiro: Não é um recurso!"
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr "Escolha um Nó"
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr "Bit %d, val %d."
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr "Selecionar Propriedade"
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr "Selecione Método virtual"
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr "Selecione Método"
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr "Renomear em massa"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Replace:"
+msgstr "Substituir: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
+msgstr "Prefixo"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Suffix:"
+msgstr "Sufixo"
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Usar Expressões Regulares"
+
+#: editor/rename_dialog.cpp
+msgid "Advanced Options"
+msgstr "Opções Avançadas"
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr "Substituto"
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr "Nome do nó"
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr "Nome do parente do nó, se disponível"
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr "Tipo de nó"
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr "Nome da cena atual"
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr "Nome do nó raiz"
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+"Contador sequencial de inteiros.\n"
+"Comparar opções do contador."
+
+#: editor/rename_dialog.cpp
+msgid "Per-level Counter"
+msgstr "Contador por nível"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
+msgstr "Se definido o contador reinicia para cada grupo de nós filhos"
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr "Valor inicial do contador"
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr "Passo"
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr "Valor pelo qual cada contador é incrementado para cada nó"
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr "Preenchimento"
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+"Número mínimo de dígitos para o contador.\n"
+"Dígitos ausentes são preenchidos com zeros."
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr "Pós-processamento"
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr "Manter"
+
+#: editor/rename_dialog.cpp
+msgid "PascalCase to snake_case"
+msgstr "PascalCase para snake_case"
+
+#: editor/rename_dialog.cpp
+msgid "snake_case to PascalCase"
+msgstr "snake_case para PascalCase"
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr "Caixa"
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr "Para Minúsculas"
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr "Para Maiúsculas"
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr "Repor"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Erro em Expressão Regular"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "No carácter %s"
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr "Repôr Nó"
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr "Repôr localização (selecionar novo Parente):"
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr "Manter transformação global"
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr "Repôr"
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr "Modo Execução:"
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr "Cena Atual"
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr "Cena Principal"
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr "Argumentos da Cena Principal:"
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr "Configurações de Execução da Cena"
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr "Nenhum parente para instância das cenas."
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr "Erro ao carregar a cena de %s"
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+"Não consigo instanciar a cena '%s' porque a cena atual existe dentro de um "
+"dos seus nós."
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr "Cena(s) da Instância"
+
+#: editor/scene_tree_dock.cpp
+msgid "Replace with Branch Scene"
+msgstr "Substituir com Cena-Ramo"
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instanciar Cena Filha"
+
+#: editor/scene_tree_dock.cpp
+msgid "Detach Script"
+msgstr "Separar Script"
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr "Esta operação não pode ser feita na raiz da árvore."
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr "Mover Nó no Parente"
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr "Mover Nós no Parente"
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr "Duplicar Nó(s)"
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
+msgstr ""
+"Não consigo mudar nó em cenas herdadas, a ordem dos nós não pode mudar."
+
+#: editor/scene_tree_dock.cpp
+msgid "Node must belong to the edited scene to become root."
+msgstr "O nó deve pertencer à cena editada para se tornar raiz."
+
+#: editor/scene_tree_dock.cpp
+msgid "Instantiated scenes can't become root"
+msgstr "Cenas instanciadas não se podem tornar raízes"
+
+#: editor/scene_tree_dock.cpp
+msgid "Make node as Root"
+msgstr "Tornar Nó Raiz"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Apagar %d nós e filhos?"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes?"
+msgstr "Apagar %d nós?"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete the root node \"%s\"?"
+msgstr "Apagar nó raiz \"%s\"?"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete node \"%s\" and its children?"
+msgstr "Apagar nó \"%s\" e filhos?"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete node \"%s\"?"
+msgstr "Apagar nó \"%s\"?"
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr "Não consigo executar com o nó raiz."
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr "Esta operação não pode ser feita numa cena instanciada."
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr "Guardar Nova Cena Como..."
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Desativar \"editable_instance\" irá reverter todas as propriedades do nó "
+"para os seus valores predefinição."
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
+"cause all properties of the node to be reverted to their default."
+msgstr ""
+"Ativar \"Carregar como Espaço Reservado\" vai desativar \"Filhos Editáveis\" "
+"e fazer com que todas as propriedades do nó revertam para valores "
+"predefinidos."
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr "Tornar Local"
+
+#: editor/scene_tree_dock.cpp
+msgid "New Scene Root"
+msgstr "Nova Raiz da Cena"
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr "Criar Nó Raiz:"
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr "Cena 2D"
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr "Cena 3D"
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr "Interface do Utilizador"
+
+#: editor/scene_tree_dock.cpp
+msgid "Other Node"
+msgstr "Outro Nó"
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr "Não consigo operar em nós de uma cena externa!"
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr "Não consigo operar em nós herdados pela cena atual!"
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr "Anexar Script"
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr "Remover Nó(s)"
+
+#: editor/scene_tree_dock.cpp
+msgid "Change type of node(s)"
+msgstr "Mudar tipo de nó(s)"
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+"Não consigo guardar nova cena. Provavelmente dependências (instâncias) não "
+"foram satisfeitas."
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr "Erro ao guardar cena."
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr "Erro ao duplicar cena para guardar."
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr "Sub-recursos"
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr "Limpar herança"
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr "Filhos editáveis"
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr "Carregar como marcador de posição"
+
+#: editor/scene_tree_dock.cpp
+msgid "Open Documentation"
+msgstr "Abrir documentação"
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Não consigo anexar um script: não há linguagens registadas.\n"
+"Isto provavelmente acontece porque o editor foi compilado com todos os "
+"módulos de linguagem desativados."
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Adicionar Nó Filho"
+
+#: editor/scene_tree_dock.cpp
+msgid "Expand/Collapse All"
+msgstr "Expandir/Colapsar Tudo"
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr "Mudar tipo"
+
+#: editor/scene_tree_dock.cpp
+msgid "Reparent to New Node"
+msgstr "Repôr o Novo Nó"
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr "Tornar Raiz da Cena"
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr "Combinar a partir da Cena"
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr "Guardar Ramo como Cena"
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Copy Node Path"
+msgstr "Copiar Caminho do Nó"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr "Apagar (sem confirmação)"
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node."
+msgstr "Adicionar/Criar Novo Nó."
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+"Instanciar um ficheiro de cena como um Nó. Cria uma cena herdada se não "
+"existir nó raiz."
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script to the selected node."
+msgstr "Anexar script novo ou existente ao nó selecionado."
+
+#: editor/scene_tree_dock.cpp
+msgid "Detach the script from the selected node."
+msgstr "Separar o script do nó selecionado."
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr "Remoto"
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr "Local"
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr "Limpar herança? (Sem retrocesso!)"
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr "Alternar Visibilidade"
+
+#: editor/scene_tree_editor.cpp
+msgid "Unlock Node"
+msgstr "Desbloquear Nó"
+
+#: editor/scene_tree_editor.cpp
+msgid "Button Group"
+msgstr "Grupo Botão"
+
+#: editor/scene_tree_editor.cpp
+msgid "(Connecting From)"
+msgstr "(A Ligar de)"
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr "Aviso de configuração do nó:"
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s) and %s group(s).\n"
+"Click to show signals dock."
+msgstr ""
+"Nó tem %s conexão(ões) e %s grupo(s).\n"
+"Clique para mostrar doca de sinais."
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has %s connection(s).\n"
+"Click to show signals dock."
+msgstr ""
+"Nó tem %s conexão(ões).\n"
+"Clique para mostrar doca de sinais."
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in %s group(s).\n"
+"Click to show groups dock."
+msgstr ""
+"Nó está em %s grupo(s).\n"
+"Clique para mostrar doca de grupos."
+
+#: editor/scene_tree_editor.cpp
+msgid "Open Script:"
+msgstr "Abrir Script:"
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+"Nó está bloqueado.\n"
+"Clique para desbloquear."
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+"Filhos não são selecionáveis.\n"
+"Clique para os tornar selecionáveis."
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr "Alternar visibilidade"
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+"AnimationPlayer está fixado.\n"
+"Clique para desafixar."
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr "Nome de nó inválido, os caracteres seguintes não são permitidos:"
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr "Renomear Nó"
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr "Árvore de Cena (Nós):"
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr "Aviso de Configuração de Nó!"
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr "Selecione um Nó"
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty."
+msgstr "Caminho está vazio."
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty."
+msgstr "Nome do Ficheiro vazio."
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local."
+msgstr "Caminho não é local."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path."
+msgstr "Caminho base inválido."
+
+#: editor/script_create_dialog.cpp
+msgid "A directory with the same name exists."
+msgstr "Já existe diretoria com o mesmo nome."
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "O Ficheiro não existe."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension."
+msgstr "Extensão inválida."
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen."
+msgstr "Escolhida extensão errada."
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr "Erro ao carregar Modelo '%s'"
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr "Erro - Não consigo criar script no sistema de ficheiros."
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr "Erro ao carregar Script de '%s'"
+
+#: editor/script_create_dialog.cpp
+msgid "Overrides"
+msgstr "Sobrepõe"
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr "N/A"
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script / Choose Location"
+msgstr "Abrir Script/ Escolher Localização"
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr "Abrir Script"
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, it will be reused."
+msgstr "O Ficheiro já existe, será reutilizado."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Caminho inválido."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name."
+msgstr "Nome de classe inválido."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path."
+msgstr "Nome ou caminho de parente herdado inválido."
+
+#: editor/script_create_dialog.cpp
+msgid "Script path/name is valid."
+msgstr "Caminho/nome de script é válido."
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9, _ and ."
+msgstr "Permitido: a-z, A-Z, 0-9, _ e ."
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)."
+msgstr "Script incorporado (no ficheiro da cena)."
+
+#: editor/script_create_dialog.cpp
+msgid "Will create a new script file."
+msgstr "Vai criar novo ficheiro de script."
+
+#: editor/script_create_dialog.cpp
+msgid "Will load an existing script file."
+msgstr "Vai carregar ficheiro de script existente."
+
+#: editor/script_create_dialog.cpp
+msgid "Script file already exists."
+msgstr "Ficheiro Script já existe."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Nota: Scripts incorporados têm algumas limitações e não podem ser editados "
+"com um editor externo."
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name:"
+msgstr "Nome de Classe:"
+
+#: editor/script_create_dialog.cpp
+msgid "Template:"
+msgstr "Modelo:"
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script:"
+msgstr "Script Incorporado:"
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr "Anexar Script de Nó"
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr "Remoto "
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr "Bytes:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Warning:"
+msgstr "Aviso:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Error:"
+msgstr "Erro:"
+
+#: editor/script_editor_debugger.cpp
+msgid "C++ Error"
+msgstr "Erro C++"
+
+#: editor/script_editor_debugger.cpp
+msgid "C++ Error:"
+msgstr "Erro C++:"
+
+#: editor/script_editor_debugger.cpp
+msgid "C++ Source"
+msgstr "Código-fonte C++"
+
+#: editor/script_editor_debugger.cpp
+msgid "Source:"
+msgstr "Código-fonte:"
+
+#: editor/script_editor_debugger.cpp
+msgid "C++ Source:"
+msgstr "Código-fonte C++:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr "Rastreamento de Pilha"
+
+#: editor/script_editor_debugger.cpp
+msgid "Errors"
+msgstr "Erros"
+
+#: editor/script_editor_debugger.cpp
+msgid "Child process connected."
+msgstr "Processo filho conectado."
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr "Copiar Erro"
+
+#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Memória Vídeo"
+
+#: editor/script_editor_debugger.cpp
+msgid "Skip Breakpoints"
+msgstr "Saltar Pontos de Paragem"
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr "Inspecionar instância anterior"
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr "Inspecionar Próxima Instância"
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr "Empilhar Frames"
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: editor/script_editor_debugger.cpp
+msgid "Network Profiler"
+msgstr "Traçador de Rede"
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr "Monitor"
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr "Valor"
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr "Monitores"
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr "Escolha um ou mais itens da lista para exibir o gráfico."
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr "Lista de utilização de Memória Vídeo por recurso:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr "Total:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Export list to a CSV file"
+msgstr "Exportar lista para ficheiro CSV"
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr "Caminho do Recurso"
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr "Tipo"
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr "Formato"
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr "Uso"
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr "Diversos"
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr "Controlo clicado:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr "Tipo de controlo clicado:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr "Raiz de Edição ao Vivo:"
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr "Definir a partir da árvore"
+
+#: editor/script_editor_debugger.cpp
+msgid "Export measures as CSV"
+msgstr "Exporta medidas como CSV"
+
+#: editor/settings_config_dialog.cpp
+msgid "Erase Shortcut"
+msgstr "Apagar Atalho"
+
+#: editor/settings_config_dialog.cpp
+msgid "Restore Shortcut"
+msgstr "Restaurar Atalho"
+
+#: editor/settings_config_dialog.cpp
+msgid "Change Shortcut"
+msgstr "Alterar Atalho"
+
+#: editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr "Configurações do Editor"
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr "Atalhos"
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr "Ligação"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr "Mudar raio da luz"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr "Mudar ângulo de emissão de AudioStreamPlayer3D"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr "Mudar FOV da câmara"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr "Mudar tamanho da câmara"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr "Mudar Notificador AABB"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr "Mudar partículas AABB"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr "Mudar Extensões de Sonda"
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr "Mudar raio da forma esfera"
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr "Mudar medidas da forma caixa"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr "Mudar raio da forma cápsula"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr "Mudar altura da forma cápsula"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr "Mudar Raio da Forma Cilindro"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr "Mudar Altura da Forma Cilindro"
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr "Mudar comprimento da forma raio"
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr "Mudar Raio do Cilindro"
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr "Mudar Altura do CIlindro"
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr "Mudar Raio Interno do Toro"
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr "Mudar Raio Externo do Toro"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr "Selecionar a biblioteca dinâmica para esta entrada"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr "Selecionar dependências da biblioteca para este entrada"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr "Remover Entrada atual"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr "Duplo clique para criar nova entrada"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr "Plataforma:"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr "Plataforma"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr "Biblioteca Dinâmica"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr "Adicionar uma entrada arquitetura"
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr "GDNativeLibrary"
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Enabled GDNative Singleton"
+msgstr "Ativa Singleton GDNative"
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Disabled GDNative Singleton"
+msgstr "Instância única GDNative desativada"
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr "Biblioteca"
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr "Bibliotecas: "
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr "GDNative"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr "O argumento \"step\" é zero!"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr "Não é um Script com uma instância"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr "Não é baseado num Script"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr "Não é baseado num Ficheiro de recurso"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr "Formato de dicionário de instância inválido (falta @path)"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+"Formato de dicionário de instância inválido (não consigo carregar o script "
+"em @path)"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr "Formato de dicionário de instância inválido (script inválido em @path)"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr "Dicionário de instância inválido (subclasses inválidas)"
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr "Objeto não fornece um comprimento."
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr "Plano Seguinte"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr "Plano Anterior"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr "Plano:"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr "Próximo Piso"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr "Piso anterior"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr "Piso:"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr "Apagar seleção GridMap"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr "Seleção de Preenchimento de GridMap"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paste Selection"
+msgstr "Colar Seleção GridMap"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Paint"
+msgstr "Pintura do GridMap"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr "Mapa de grelha"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr "Vista de Ajuste"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr "Recorte desativado"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr "Recorte ativado"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr "Recorte abaixo"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr "Editar Eixo X"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr "Editar Eixo Y"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr "Editar Eixo Z"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr "Rodar Cursor X"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr "Rodar Cursor Y"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr "Rodar Cursor Z"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr "Rodar para trás Cursor X"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr "Rodar para trás Cursor Y"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr "Rodar para trás Cursor Z"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr "Limpar rotação do Cursor"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Paste Selects"
+msgstr "Colar Seleção"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr "Limpar Seleção"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr "Preencher Seleção"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr "Configurações do GridMap"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr "Distância de escolha:"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Filter meshes"
+msgstr "Meshes de filtro"
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
+msgstr "Dá um recurso MeshLibrary a este GridMap para usar os seus meshes."
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr "Nome de classe não pode ser uma palavra-chave reservada"
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr "Fim do stack trace de exceção interna"
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr "Consolidar NavMesh"
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr "Limpar a Malha de navegação."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr "A ajustar configuração..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr "A calcular tamanho da grelha..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr "A criar heightfield..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr "A marcar triângulos caminháveis..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr "A construir heightfield compacto..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr "A corroer a Área caminhável..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr "A segmentar..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr "A criar contornos..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr "A criar polymesh..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr "A converter para Malha de navegação nativa..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr "Configuração do gerador da Malha de navegação:"
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr "A analisar geometria..."
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr "Feito!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+"Um nó fez yield sem memória para usar, por favor leia os documentos para "
+"saber como fazer yield corretamente!"
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+"O nó fez yield, mas não retornou um estado de função na primeira memória de "
+"trabalho."
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+"O valor de retorno deve ser atribuído ao primeiro elemento da memória de "
+"trabalho de nós! Corrija o seu nó por favor."
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr "O nó retornou uma sequência de saída (output) incorreta: "
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+"Foi encontrada o bit da sequência mas não o nó na pilha, denuncie o bug!"
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr "Pilha cheia com a profundidade da pilha: "
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr "Mudar argumentos do sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr "Mudar tipo de argumento"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr "Mudar nome do argumento"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr "Definir Valor Predefinido da Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr "Definir tipo de variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Input Port"
+msgstr "Adicionar Porta de Entrada"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Output Port"
+msgstr "Adicionar Porta de Saída"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Override an existing built-in function."
+msgstr "Sobrepõe-se a função incorporada existente."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new function."
+msgstr "Criar uma nova função."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr "Variáveis:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new variable."
+msgstr "Criar uma nova variável."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr "Sinais:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create a new signal."
+msgstr "Criar um novo sinal."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr "O nome não é um identificador válido:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr "Este nome já está a ser usado por outro func/var/signal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr "Mudar nome da Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr "Mudar nome da Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr "Mudar nome do Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr "Adicionar Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete input port"
+msgstr "Remover porta de entrada"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr "Adicionar Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr "Adicionar Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Input Port"
+msgstr "Remover Porta de Entrada"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Output Port"
+msgstr "Remover Porta de Saída"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr "Mudar Expressão"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr "Remover Nós VisualScript"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr "Duplicar Nós VisualScript"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Pressione %s para largar um Getter. Pressione Shift para largar uma "
+"Assinatura genérica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+"Pressione Ctrl para largar um Getter. Pressione Shift para largar uma "
+"Assinatura genérica."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr "Pressione %s para largar uma referência simples no nó."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr "Pressione Ctrl para largar uma referência simples no nó."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr "Pressione %s para largar um Setter variável."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr "Pressione Ctrl para largar um Setter Variável."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr "Adicionar Nó de Pré-carregamento"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr "Adicionar Nó(s) da Árvore"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid ""
+"Can't drop properties because script '%s' is not used in this scene.\n"
+"Drop holding 'Shift' to just copy the signature."
+msgstr ""
+"Não consigo largar propriedades porque o script '%s' não é usado neste "
+"cena.\n"
+"Largue com 'Shift' para copiar apenas a assinatura."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr "Adicionar Propriedade Getter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr "Adicionar Propriedade Setter"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr "Mudar tipo base"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr "Mover Nó(s)"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr "Remover Nó VisualScript"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr "Conectar Nós"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Disconnect Nodes"
+msgstr "Desconectar Nós"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr "Conectar Dados do Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr "Conectar Sequência do Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr "Script já tem uma Função '%s'"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr "Mudar valor de entrada"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Resize Comment"
+msgstr "Redimensionar Comentário"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr "Não consigo copiar o nó função."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr "Área de Transferência está vazia!"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr "Colar Nós VisualScript"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't create function with a function node."
+msgstr "Não consigo criar função com um nó função."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't create function of nodes from nodes of multiple functions."
+msgstr "Não consigo criar função de nós a partir de nós de várias funções."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select at least one node with sequence port."
+msgstr "Selecione pelo menos um nó com porta de sequência."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Try to only have one sequence input in selection."
+msgstr "Tente ter apenas uma entrada de sequência na seleção."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Create Function"
+msgstr "Criar Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr "Remover Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr "Remover Variável"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr "A editar Variável:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr "Remover Sinal"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr "A editar Sinal:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Make Tool:"
+msgstr "Ferramenta Fazer:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Membros:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type:"
+msgstr "Mudar Tipo Base:"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Nodes..."
+msgstr "Adicionar Nós.."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function..."
+msgstr "Adicionar Função..."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "function_name"
+msgstr "function_name"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit its graph."
+msgstr "Selecionar ou criar uma função para editar o gráfico."
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr "Apagar Selecionados"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr "Localizar Tipo de Nó"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr "Copiar Nós"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr "Cortar Nós"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Make Function"
+msgstr "Criar Função"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Refresh Graph"
+msgstr "Atualizar Gráfico"
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr "Editar Membros"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr "Tipo de Input não iterável: "
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr "O iterador tornou-se inválido"
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr "O iterador tornou-se inválido: "
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr "Nome de índice Propriedade inválido."
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr "Objeto de base não é um Nó!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr "Caminho não conduz Nó!"
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr "Nome de propriedade índice '%s' inválido no nó %s."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ": Argumento inválido de tipo: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ": Argumentos inválidos: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr "VariableGet não encontrado no script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr "VariableSet não encontrado no script: "
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+"Nó personalizado não tem método _step(), sem poder processar um gráfico."
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+"Retorno de valor inválido a partir do _step(), tem de ser inteiro (seq out), "
+"ou string (error)."
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr "Procurar VisualScript"
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr "Obter %s"
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr "Definir %s"
+
+#: platform/android/export/export.cpp
+msgid "Package name is missing."
+msgstr "Falta o nome do pacote."
+
+#: platform/android/export/export.cpp
+msgid "Package segments must be of non-zero length."
+msgstr "Os segmentos de pacote devem ser de comprimento diferente de zero."
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' is not allowed in Android application package names."
+msgstr ""
+"O carácter '%s' não é permitido em nomes de pacotes de aplicações Android."
+
+#: platform/android/export/export.cpp
+msgid "A digit cannot be the first character in a package segment."
+msgstr "Um dígito não pode ser o primeiro carácter num segmento de pacote."
+
+#: platform/android/export/export.cpp
+msgid "The character '%s' cannot be the first character in a package segment."
+msgstr ""
+"O carácter '%s' não pode ser o primeiro carácter num segmento de pacote."
+
+#: platform/android/export/export.cpp
+msgid "The package must have at least one '.' separator."
+msgstr "O pacote deve ter pelo menos um separador '.'."
+
+#: platform/android/export/export.cpp
+msgid "Select device from the list"
+msgstr "Selecionar aparelho da lista"
+
+#: platform/android/export/export.cpp
+msgid "ADB executable not configured in the Editor Settings."
+msgstr "O executável ADB não está configurado nas Configurações do Editor."
+
+#: platform/android/export/export.cpp
+msgid "OpenJDK jarsigner not configured in the Editor Settings."
+msgstr "O jarsigner do OpenJDK não está configurado nas Definições do Editor."
+
+#: platform/android/export/export.cpp
+msgid "Debug keystore not configured in the Editor Settings nor in the preset."
+msgstr ""
+"Depuração de keystore não configurada nas Configurações do Editor e nem na "
+"predefinição."
+
+#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Lançamento de keystore configurado incorretamente na predefinição exportada."
+
+#: platform/android/export/export.cpp
+msgid "Custom build requires a valid Android SDK path in Editor Settings."
+msgstr ""
+"Compilação personalizada necessita de um caminho válido para Android SDK no "
+"Editor de Configurações."
+
+#: platform/android/export/export.cpp
+msgid "Invalid Android SDK path for custom build in Editor Settings."
+msgstr ""
+"Caminho inválido de Android SDK para compilação personalizada no Editor de "
+"Configurações."
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android build template not installed in the project. Install it from the "
+"Project menu."
+msgstr ""
+"Modelo de compilação Android não está instalado neste projeto. Instale-o no "
+"menu Projeto."
+
+#: platform/android/export/export.cpp
+msgid "Invalid public key for APK expansion."
+msgstr "Chave pública inválida para expansão APK."
+
+#: platform/android/export/export.cpp
+msgid "Invalid package name:"
+msgstr "Nome de pacote inválido:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Módulo inválido \"GodotPaymentV3\" incluído na configuração do projeto "
+"\"android/modules\" (alterado em Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+"\"Usar Compilação Personalizada\" têm de estar ativa para usar os plugins."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Graus de Liberdade\" só é válido quando \"Modo Xr\" é \"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Rastreamento de Mão\" só é válido quando \"Modo Xr\" é \"Oculus Mobile VR"
+"\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Consciência do Foco\" só é válido quando \"Modo Xr\" é \"Oculus Mobile VR"
+"\"."
+
+#: platform/android/export/export.cpp
+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'."
+
+#: platform/android/export/export.cpp
+msgid ""
+"Android build version mismatch:\n"
+" Template installed: %s\n"
+" Godot Version: %s\n"
+"Please reinstall Android build template from 'Project' menu."
+msgstr ""
+"Incompatibilidade da versão Android:\n"
+" Modelo instalado: %s\n"
+" Versão Godot: %s\n"
+"Reinstale o modelo de compilação Android no menu 'Projeto'."
+
+#: platform/android/export/export.cpp
+msgid "Building Android Project (gradle)"
+msgstr "A compilar Projeto Android (gradle)"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Building of Android project failed, check output for the error.\n"
+"Alternatively visit docs.godotengine.org for Android build documentation."
+msgstr ""
+"Falhou a compilação do projeto Android, verifique o erro na saída.\n"
+"Em alternativa visite docs.godotengine.org para a documentação sobre "
+"compilação Android."
+
+#: platform/android/export/export.cpp
+msgid "No build apk generated at: "
+msgstr "Nenhum apk gerado em: "
+
+#: platform/iphone/export/export.cpp
+msgid "Identifier is missing."
+msgstr "Falta o identificador."
+
+#: platform/iphone/export/export.cpp
+msgid "The character '%s' is not allowed in Identifier."
+msgstr "O carácter \"%s\" não é permitido no Identificador."
+
+#: platform/iphone/export/export.cpp
+msgid "App Store Team ID not specified - cannot configure the project."
+msgstr ""
+"ID da equipa da App Store não especificado - não consigo configurar o "
+"projeto."
+
+#: platform/iphone/export/export.cpp
+msgid "Invalid Identifier:"
+msgstr "Identificador Inválido:"
+
+#: platform/iphone/export/export.cpp
+msgid "Required icon is not specified in the preset."
+msgstr "O ícone obrigatório não está especificado na predefinição."
+
+#: platform/javascript/export/export.cpp
+msgid "Stop HTTP Server"
+msgstr "Parar Servidor HTTP"
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr "Executar no Navegador"
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr "Executar HTML exportado no navegador predefinido do sistema."
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr "Não consigo escrever ficheiro:"
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr "Não consigo abrir modelo para exportação:"
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr "Modelo de exportação inválido:"
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr "Não consigo ler shell HTML personalizado:"
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr "Não consigo ler ficheiro de imagem do ecrã de inicialização:"
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr "A usar imagem de inicialização predefinida."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid package short name."
+msgstr "Nome curto de pacote inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid package unique name."
+msgstr "Nome único de pacote inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid package publisher display name."
+msgstr "Nome de autor de pacote inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid product GUID."
+msgstr "GUID do produto inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid publisher GUID."
+msgstr "GUID do editor inválido."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid background color."
+msgstr "Cor de fundo inválida."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid Store Logo image dimensions (should be 50x50)."
+msgstr "Inválidas dimensões da imagem do logotipo do Store (deve ser 50x50)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
+msgstr ""
+"Dimensões inválidas do quadrado 44x44 da imagem do logotipo (deve ser 44x44)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
+msgstr ""
+"Quadrado inválido 71x71 das dimensões da imagem do logotipo (deve ser 71x71)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
+msgstr ""
+"Quadrado inválido 150x150 das dimensões da imagem do logotipo (deve ser "
+"150x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
+msgstr ""
+"Quadrado inválido 310x310 das dimensões da imagem do logotipo (deve ser "
+"310x310)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
+msgstr "Dimensão inválida da imagem do logótipo 310x150 (deve ser 310x150)."
+
+#: platform/uwp/export/export.cpp
+msgid "Invalid splash screen image dimensions (should be 620x300)."
+msgstr "Dimensões inválidas da imagem do ecrã inicial (deve ser 620x300)."
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames"
+"\" para que AnimatedSprite mostre frames."
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+"Só é permitido um CanvasModulate visível por cena (ou grupo de cenas "
+"instanciadas). O primeiro a ser criado funcionará, enquanto o resto será "
+"ignorado."
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+"Este nó não tem forma, em poder colidir ou interagir com outros objetos.\n"
+"Considere adicionar nós CollisionShape2D ou CollisionPolygon2D como filhos "
+"para definir a sua forma."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon2D serve apenas para fornecer uma forma de colisão a um nó "
+"derivado de CollisionObject2D. Use-o apenas como um filho de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para lhes dar uma forma."
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr "Um CollisionPolygon2D vazio não tem efeito na colisão."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"CollisionShape2D serve apenas para fornecer uma forma de colisão a um nó "
+"derivado de CollisionObject2D. Use-o apenas como um filho de Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para lhes dar uma forma."
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+"Uma forma tem de ser fornecida para CollisionShape2D funcionar. Crie um "
+"recurso forma!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Formas baseadas em polígono não pretendem ser usadas ou editadas diretamente "
+"através do nó CollisionShape2D. Em vez disso use o nó CollisionPolygon2D."
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animação CPUParticles2D requer o uso de um CanvasItemMaterial com "
+"\"Particles Animation\" ativada."
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the \"Texture\" "
+"property."
+msgstr ""
+"Uma textura com a forma da luz tem de ser disponibilizada na Propriedade "
+"\"Textura\"."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+"Um Polígono oclusor tem de definido (ou desenhado) para este Oclusor ter "
+"efeito."
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
+msgstr "O polígono oclusor deste oclusor está vazio. Desenhe um polígono."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+"Um recurso NavigationPolygon tem de ser definido ou criado para este nó "
+"funcionar. Defina a propriedade ou desenhe o polígono."
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+"NavigationPolygonInstance tem de ser filho ou neto de um nó Navigation2D. "
+"Apenas fornece dados de navegação."
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+"O nó ParallaxLayer só funciona quando definido como filho de um nó "
+"ParallaxBackground."
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles2D node instead. You can use the \"Convert to "
+"CPUParticles\" option for this purpose."
+msgstr ""
+"Partículas baseadas em GPU não são suportadas pelo driver de vídeo GLES2.\n"
+"Use o nó CPUParticles2D. Pode usar a opção \"Converter em CPUParticles\" "
+"para este efeito."
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+"Não foi atribuído um Material para processar as partículas, sem possuir um "
+"comportamento."
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animação Particles2D requer o uso de um CanvasItemMaterial com \"Particles "
+"Animation\" ativada."
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+"PathFollow2D apenas funciona quando definido como filho de um nó Path2D."
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+"Mudanças no tamanho do RigidBody2D (em modos carácter ou rígido) serão "
+"reescritas pelo motor de física na execução.\n"
+"Mude antes o tamanho das formas de colisão filhas."
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+"Para funcionar, a propriedade caminho tem de apontar para um nó Node2D "
+"válido."
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr "Esta corrente de Bone2D deve terminar num nó Skeleton2D."
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr "Um Bone2D só funciona com um nó parente Skeleton2D ou Bone2D."
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr "Falta uma pose DESCANSO a este osso. Vá ao nó Skeleton2D e defina uma."
+
+#: scene/2d/tile_map.cpp
+msgid ""
+"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
+"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D, etc. to give them a shape."
+msgstr ""
+"TileMap com Usar Parente ativo precisa de um parente CollisionObject2D para "
+"lhe dar formas. Use-o como um filho de Area2D, StaticBody2D, RigidBody2D, "
+"KinematicBody2D, etc. para lhes dar uma forma."
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnabler2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+"VisibilityEnabler2D funciona melhor quando usado diretamente como parente na "
+"cena raiz editada."
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent."
+msgstr "ARVRCamera precisa de um nó ARVROrigin como parente."
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent."
+msgstr "ARVRController precisa de um nó ARVROrigin como parente."
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller ID must not be 0 or this controller won't be bound to an "
+"actual controller."
+msgstr ""
+"O ID do controlador não pode ser 0 senão este controlador não será vinculado "
+"a um controlador real."
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent."
+msgstr "ARVRAnchor precisa de um nó ARVROrigin como parente."
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor ID must not be 0 or this anchor won't be bound to an actual "
+"anchor."
+msgstr ""
+"O ID da âncora não pode ser 0 senão esta âncora não será vinculada a uma "
+"âncora real."
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node."
+msgstr "ARVROrigin exige um nó filho ARVRCamera."
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr "%d%%"
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr "(Tempo restante: %d:%02d s)"
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr "A traçar Meshes: "
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr "A traçar Luzes:"
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr "A concluir desenho"
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr "A iluminar Meshes: "
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+"Este nó não tem forma, sem poder colidir ou interagir com outros objetos.\n"
+"Considere adicionar nós CollisionShape ou CollisionPolygon como filhos para "
+"definir a sua forma."
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionPolygon serve apenas para fornecer uma forma de colisão a um nó "
+"derivado de CollisionObject. Use-o apenas como um filho de Area, StaticBody, "
+"RigidBody, KinematicBody, etc. para lhes dar uma forma."
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr "Um CollisionPolygon vazio não tem efeito na colisão."
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+"CollisionShape serve apenas para fornecer uma forma de colisão a um nó "
+"derivado de CollisionObject. Use-o apenas como um filho de Area, StaticBody, "
+"RigidBody, KinematicBody, etc. para lhes dar uma forma."
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it."
+msgstr ""
+"Uma forma tem de ser fornecida para CollisionShape funcionar. Crie um "
+"recurso forma."
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"Plane shapes don't work well and will be removed in future versions. Please "
+"don't use them."
+msgstr ""
+"Formas planas não funcionam bem e serão removidas em futuras versões. Não as "
+"use por favor."
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr "ConcavePolygonShape apenas suporta RigidBody no modo estático."
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nada é visível porque nenhuma Malha foi atribuída."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial whose "
+"Billboard Mode is set to \"Particle Billboard\"."
+msgstr ""
+"Animação CPUParticles requer o uso de um SpatialMaterial com Modo Billboard "
+"definido como \"Billboard Particles\"."
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr "A desenhar Meshes"
+
+#: scene/3d/gi_probe.cpp
+msgid ""
+"GIProbes are not supported by the GLES2 video driver.\n"
+"Use a BakedLightmap instead."
+msgstr ""
+"Sondas GI não são suportadas pelo driver vídeo GLES2.\n"
+"Em vez disso, use um BakedLightmap."
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
+#: scene/3d/light.cpp
+msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
+msgstr "Uma SpotLight com ângulo superior a 90 graus não cria sombras."
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+"Um recurso NavigationMesh tem de ser definido ou criado para este nó "
+"funcionar."
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+"NavigationMeshInstance tem de ser filho ou neto de um nó Navigation. Apenas "
+"fornece dados de navegação."
+
+#: scene/3d/particles.cpp
+msgid ""
+"GPU-based particles are not supported by the GLES2 video driver.\n"
+"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
+"\" option for this purpose."
+msgstr ""
+"Partículas baseadas em GPU não são suportadas pelo driver de vídeo GLES2.\n"
+"Use o nó CPUParticles. Pode usar a opção \"Converter em CPUParticles\" para "
+"este efeito."
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+"Nada é visível porque não foram atribuídas Meshes aos passos de desenho."
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial whose Billboard "
+"Mode is set to \"Particle Billboard\"."
+msgstr ""
+"Animação Particles requer o uso de um SpatialMaterial com Modo Billboard "
+"definido como \"Billboard Particles\"."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow apenas funciona quando definido como filho de um nó Path."
+
+#: scene/3d/path.cpp
+msgid ""
+"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
+"parent Path's Curve resource."
+msgstr ""
+"ROTATION_ORIENTED de PathFollow requer \"Up Vector\" ativado no recurso de "
+"Curva do Caminho do seu pai."
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+"Mudanças no tamanho do RigidBody (em modos carácter ou rígido) serão "
+"reescritas pelo motor de física na execução.\n"
+"Mude antes o tamanho das formas de colisão filhas."
+
+#: scene/3d/remote_transform.cpp
+msgid ""
+"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
+"derived node to work."
+msgstr ""
+"Para funcionar, a Propriedade \"Caminho Remoto\" tem de apontar para um nó "
+"Spatial válido ou seu derivado."
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh."
+msgstr "Este corpo será ignorado até se definir uma malha."
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+"Mudanças no tamanho do SoftBody serão reescritas pelo motor de física na "
+"execução.\n"
+"Em vez disso, mude o tamanho das formas de colisão filhas."
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the \"Frames\" property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames"
+"\" de forma a que AnimatedSprite3D mostre frames."
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+"VehicleWheel fornece um sistema de rodas a um VehicleBody. Use-o como um "
+"filho de VehicleBody."
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"WorldEnvironment requires its \"Environment\" property to contain an "
+"Environment to have a visible effect."
+msgstr ""
+"WorldEnvironment exige que a sua propriedade \"Ambiente\" contenha um "
+"Ambiente para obter efeitos visíveis."
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+"Apenas um WorldEnvironment é permitido por cena (ou grupo de cenas "
+"instanciadas)."
+
+#: scene/3d/world_environment.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+"Este WorldEnvironment ė ignorado. Pode adicionar uma Camera (para cenas 3D) "
+"ou definir o Modo Background deste ambiente como Canvas (para cenas 2D)."
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr "No nó BlendTree '%s', animação não encontrada: '%s'"
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr "Animação não encontrada: '%s'"
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr "No nó '%s', animação inválida: '%s'."
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr "Animação inválida: '%s'."
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr "Nada conectado à entrada '%s' do nó '%s'."
+
+#: scene/animation/animation_tree.cpp
+msgid "No root AnimationNode for the graph is set."
+msgstr "Não foi definida uma raiz AnimationNode para o gráfico."
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+"Caminho para um nó AnimationPlayer a conter animações não está definido."
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+"O caminho definido para AnimationPlayer não conduz a um nó AnimationPlayer."
+
+#: scene/animation/animation_tree.cpp
+msgid "The AnimationPlayer root node is not a valid node."
+msgstr "O nó raiz de AnimationPlayer não é um nó válido."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr "Este nó foi descontinuado. Use antes AnimationTree."
+
+#: scene/gui/color_picker.cpp
+msgid ""
+"Color: #%s\n"
+"LMB: Set color\n"
+"RMB: Remove preset"
+msgstr ""
+"Cor: #%s\n"
+"LMB: Definir color\n"
+"RMB: Remover predefinição"
+
+#: scene/gui/color_picker.cpp
+msgid "Pick a color from the editor window."
+msgstr "Escolha uma cor através do editor."
+
+#: scene/gui/color_picker.cpp
+msgid "HSV"
+msgstr "HSV"
+
+#: scene/gui/color_picker.cpp
+msgid "Raw"
+msgstr "Raw"
+
+#: scene/gui/color_picker.cpp
+msgid "Switch between hexadecimal and code values."
+msgstr "Alternar valores entre hexadecimal e código."
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset."
+msgstr "Adicionar cor atual como predefinição."
+
+#: scene/gui/container.cpp
+msgid ""
+"Container by itself serves no purpose unless a script configures its "
+"children placement behavior.\n"
+"If you don't intend to add a script, use a plain Control node instead."
+msgstr ""
+"Por si só um Contentor não tem utilidade, a não ser que um script configure "
+"a disposição dos seu filhos.\n"
+"Se não pretende adicionar um script, use antes um simples nó Control."
+
+#: scene/gui/control.cpp
+msgid ""
+"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
+"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
+msgstr ""
+"A Etiqueta de Sugestão não será exibida porque o Filtro de Rato do controle "
+"está definido como \"Ignorar\". Em alternativa, defina o Filtro de Rato para "
+"\"Parar\" ou \"Passar\"."
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr "Alerta!"
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr "Confirme por favor..."
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine, but they will hide upon "
+"running."
+msgstr ""
+"Popups estão escondidas por defeito a não ser que chame popup() ou qualquer "
+"das funções popup*(). Torná-las visíveis para edição é aceitável, mas "
+"estarão escondidas na execução."
+
+#: scene/gui/range.cpp
+msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
+msgstr "Se \"Exp Edit\" está ativado, \"Min Value\" tem de ser maior que 0."
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+"ScrollContainer deve ser usado com um único controlo filho.\n"
+"Use um contentor como filho (VBox, HBox, etc.), ou um Control e defina o "
+"tamanho mínimo manualmente."
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr "(Outro)"
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+"Ambiente predefinido especificado em Configurações do Projeto (Rendering -> "
+"Environment -> Default Environment) não pode ser carregado."
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+"Este viewport não está definida como alvo de Renderização. Se pretende "
+"apresentar o seu conteúdo diretamente no ecrã, torne-a um filho de um "
+"Control de modo a que obtenha um tamanho. Caso contrário, torne-a um "
+"RenderTarget e atribua a sua textura interna a outro nó para visualizar."
+
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "O tamanho do viewport tem de ser maior do que 0 para renderizar."
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for preview."
+msgstr "Fonte inválida para pré-visualização."
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr "Fonte inválida para Shader."
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid comparison function for that type."
+msgstr "Função de comparação inválida para este tipo."
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr "Atribuição a função."
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr "Atribuição a uniforme."
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr "Variações só podem ser atribuídas na função vértice."
+
+#: servers/visual/shader_language.cpp
+msgid "Constants cannot be modified."
+msgstr "Constantes não podem ser modificadas."
+
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Sistema de Ficheiros e Docas de Importação"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Ao exportar ou distribuir, o executável vai tentar ligar-se ao IP deste "
+#~ "computador para depuração."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "A cena atual nunca foi guardada, por favor guarde-a antes de executar."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Não está no caminho do recurso."
+
+#~ msgid "Revert"
+#~ msgstr "Reverter"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Esta acção não pode ser desfeita. Reverter na mesma?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Reverter Cena"
+
+#~ msgid "Clear Script"
+#~ msgstr "Limpar Script"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Rastreador de Problemas"
+
+#~ msgid "Request Docs"
+#~ msgstr "Requisitar Docs"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Dê a sua opinião para ajudar a melhorar a documentação Godot."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Substituído %d ocorrência(s)."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Criar corpo estático convexo"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Falha na criação de formas!"
+
+#~ msgid ""
+#~ "There are currently no tutorials for this class, you can [color=$color]"
+#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
+#~ "$url2]request one[/url][/color]."
+#~ msgstr ""
+#~ "Atualmente não existem tutoriais para esta classe, pode [color=$color]"
+#~ "[url=$url]contribuir com um[/url][/color] ou [color=$color][url="
+#~ "$url2]solicitar um[/url][/color]."
+
+#~ msgid "enum "
+#~ msgstr "enum "
+
+#~ msgid "Brief Description"
+#~ msgstr "Breve Descrição"
+
+#~ msgid "Class Description"
+#~ msgstr "Descrição da Classe"
+
+#~ msgid "Project export failed with error code %d."
+#~ msgstr "Exportação do projeto falhou com código de erro %d."
+
+#~ msgid "Password:"
+#~ msgstr "Senha:"
+
+#~ msgid "Identifier segments must be of non-zero length."
+#~ msgstr ""
+#~ "Identificador de segmentos devem ser de comprimento diferente de zero."
+
+#~ msgid "A digit cannot be the first character in a Identifier segment."
+#~ msgstr ""
+#~ "Um dígito não pode ser o primeiro caráter num segmento de Identificador."
+
+#~ msgid ""
+#~ "The character '%s' cannot be the first character in a Identifier segment."
+#~ msgstr ""
+#~ "O caráter \"%s\" não pode ser o primeiro caráter num segmento de "
+#~ "Identificador."
+
+#~ msgid "The Identifier must have at least one '.' separator."
+#~ msgstr "O identificador deve ter pelo menos um separador \".\"."
+
+#~ msgid "Pause the scene"
+#~ msgstr "Pausa a cena"
+
+#~ msgid "Shift+"
+#~ msgstr "Shift+"
+
+#~ msgid "Alt+"
+#~ msgstr "Alt+"
+
+#~ msgid "Control+"
+#~ msgstr "Control+"
+
+#~ msgid "Snap to Grid"
+#~ msgstr "Ajustar à Grelha"
+
+#~ msgid "Add input +"
+#~ msgstr "Adicionar entrada +"
+
+#~ msgid "Language"
+#~ msgstr "Linguagem"
+
+#~ msgid "Inherits"
+#~ msgstr "Herdar"
+
+#~ msgid "Base Type:"
+#~ msgstr "Tipo de Base:"
+
+#~ msgid "Available Nodes:"
+#~ msgstr "Nós Disponíveis:"
+
+#~ msgid "Input"
+#~ msgstr "Entrada"
+
+#~ msgid "Properties:"
+#~ msgstr "Propriedades:"
+
+#~ msgid "Methods:"
+#~ msgstr "Métodos:"
+
+#~ msgid "Theme Properties:"
+#~ msgstr "Propriedades do Tema:"
+
+#~ msgid "Enumerations:"
+#~ msgstr "Enumerações:"
+
+#~ msgid "Constants:"
+#~ msgstr "Constantes:"
+
+#~ msgid "Class Description:"
+#~ msgstr "Descrição da Classe:"
+
+#~ msgid "Property Descriptions:"
+#~ msgstr "Descrições da Propriedade:"
+
+#~ msgid "Method Descriptions:"
+#~ msgstr "Descrições do Método:"
+
+#~ msgid ""
+#~ "This will install the Android project for custom builds.\n"
+#~ "Note that, in order to use it, it needs to be enabled per export preset."
+#~ msgstr ""
+#~ "O projeto Android para compilações personalizadas será instalado.\n"
+#~ "Para o utilizar, terá de ser ativado nas predefinições de exportação."
+
+#~ msgid "Reverse sorting."
+#~ msgstr "Inverter ordenação."
+
+#~ msgid "Delete Node(s)?"
+#~ msgstr "Apagar Nó(s)?"
+
+#~ msgid "No Matches"
+#~ msgstr "Sem combinações"
+
+#~ msgid ""
+#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
+#~ msgstr ""
+#~ "file_type_cache.cch não for guardada, por não se conseguir abrir para "
+#~ "leitura!"
+
+#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+#~ msgstr "'%s' não foi encontrado no Sistema de Ficheiros!"
+
+#~ msgid "Error loading image:"
+#~ msgstr "Erro ao carregar imagem:"
+
+#~ msgid "No pixels with transparency > 128 in image..."
+#~ msgstr "Sem pixeis com transparência > 128 na imagem..."
+
+#~ msgid "Parent has no solid faces to populate."
+#~ msgstr "O parente não tem faces sólidas para povoar."
+
+#~ msgid "Couldn't map area."
+#~ msgstr "Área não pode ser mapeada."
+
+#~ msgid "Faces contain no area!"
+#~ msgstr "As faces não contêm Área!"
+
+#~ msgid "No faces!"
+#~ msgstr "Sem faces!"
+
+#~ msgid "Error: could not load file."
+#~ msgstr "Erro ao carregar ficheiro."
+
+#~ msgid "Error could not load file."
+#~ msgstr "Erro ao carregar ficheiro."
+
+#~ msgid "Doppler Enable"
+#~ msgstr "Doppler Ativo"
+
+#~ msgid "Select Mode (Q)"
+#~ msgstr "Modo seleção (Q)"
+
+#~ msgid "Move Mode (W)"
+#~ msgstr "Modo mover (W)"
+
+#~ msgid "Rotate Mode (E)"
+#~ msgstr "Modo rodar (E)"
+
+#~ msgid "Scale Mode (R)"
+#~ msgstr "Modo escalar (R)"
+
+#~ msgid "Local Coords"
+#~ msgstr "Coordenadas Locais"
+
+#~ msgid "Snap Mode (%s)"
+#~ msgstr "Modo Ajuste (%s)"
+
+#~ msgid "Tool Select"
+#~ msgstr "Seleção de ferramenta"
+
+#~ msgid "Tool Move"
+#~ msgstr "Ferramenta Mover"
+
+#~ msgid "Tool Rotate"
+#~ msgstr "Ferramenta Rodar"
+
+#~ msgid "Tool Scale"
+#~ msgstr "Ferramenta escalar"
+
+#~ msgid ""
+#~ "Remove all missing projects from the list? (Folders contents will not be "
+#~ "modified)"
+#~ msgstr ""
+#~ "Remover da lista todos os projeto em falta? (O conteúdo da pasta não será "
+#~ "modificado)"
+
+#~ msgid "Project List"
+#~ msgstr "Lista de Projetos"
+
+#~ msgid "Exit"
+#~ msgstr "Sair"
+
+#~ msgid "Could not execute PVRTC tool:"
+#~ msgstr "Impossível executar ferramenta PVRTC:"
+
+#~ msgid "Can't load back converted image using PVRTC tool:"
+#~ msgstr "Impossível carregar imagem convertida com a ferramenta PVRTC:"
+
+#~ msgid "Error initializing FreeType."
+#~ msgstr "Erro ao inicializar FreeType."
+
+#~ msgid "Unknown font format."
+#~ msgstr "Formato de letra inválido."
+
+#~ msgid "Error loading font."
+#~ msgstr "Erro ao carregar letra."
+
+#~ msgid "Invalid font size."
+#~ msgstr "Tamanho de letra inválido."
+
+#~ msgid "Previous Folder"
+#~ msgstr "Pasta Anterior"
+
+#~ msgid "Next Folder"
+#~ msgstr "Próxima Pasta"
+
+#~ msgid "Automatically Open Screenshots"
+#~ msgstr "Abrir Capturas do ecrã automaticamente"
+
+#~ msgid "Open in an external image editor."
+#~ msgstr "Abrir num editor de imagem externo."
+
+#~ msgid "Reverse"
+#~ msgstr "Inverter"
+
+#~ msgid "Mirror X"
+#~ msgstr "Espelho X"
+
+#~ msgid "Mirror Y"
+#~ msgstr "Espelho Y"
+
+#~ msgid "Generating solution..."
+#~ msgstr "A gerar soluções..."
+
+#~ msgid "Generating C# project..."
+#~ msgstr "A gerar projeto C#..."
+
+#~ msgid "Failed to create solution."
+#~ msgstr "Falha ao criar solução."
+
+#~ msgid "Failed to save solution."
+#~ msgstr "Falha ao guardar solução."
+
+#~ msgid "Done"
+#~ msgstr "Feito"
+
+#~ msgid "Failed to create C# project."
+#~ msgstr "Falha ao criar projeto C#."
+
+#~ msgid "Mono"
+#~ msgstr "Mono"
+
+#~ msgid "About C# support"
+#~ msgstr "Sobre o suporte C#"
+
+#~ msgid "Create C# solution"
+#~ msgstr "Criar solução C#"
+
+#~ msgid "Builds"
+#~ msgstr "Builds"
+
+#~ msgid "Build Project"
+#~ msgstr "Construir Projeto"
+
+#~ msgid "View log"
+#~ msgstr "Ver log"
+
+#~ msgid "WorldEnvironment needs an Environment resource."
+#~ msgstr "WorldEnvironment precisa de um recurso Environment."
+
+#~ msgid "Enabled Classes"
+#~ msgstr "Ativar Classes"
+
+#~ msgid "Update Always"
+#~ msgstr "Atualizar Sempre"
+
+#~ msgid "'camera' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'camera' para todos os modos shader."
+
+#~ msgid "'inv_camera' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'inv_camera' para todos os modos shader."
+
+#~ msgid "'inv_projection' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'inv_projection' para todos os modos shader."
+
+#~ msgid "'normal' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'normal' para todos os modos shader."
+
+#~ msgid "'projection' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'projection' para todos os modos shader."
+
+#~ msgid "'time' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'time' para todos os modos shader."
+
+#~ msgid "'viewport_size' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'viewport_size' para todos os modos shader."
+
+#~ msgid "'world' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'world' para todos os modos shader."
+
+#~ msgid "'alpha' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'alpha' para todos os modos shader."
+
+#~ msgid "'color' input parameter for all shader modes."
+#~ msgstr "parâmetro de entrada 'color' para todos os modos shader."
+
+#~ msgid "'texture_pixel_size' input parameter for all shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'texture_pixel_size' para todos os modos shader."
+
+#~ msgid "'alpha' input parameter for vertex and fragment shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'alpha' para os modos shader vertex e fragment."
+
+#~ msgid "'binormal' input parameter for vertex and fragment shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'binormal' para os modos shader vertex e fragment."
+
+#~ msgid "'color' input parameter for vertex and fragment shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'color' para os modos shader vertex e fragment."
+
+#~ msgid "'fragcoord' input parameter for fragment and light shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'fragcoord' para os modos shader fragment e light."
+
+#~ msgid "'point_coord' input parameter for fragment shader mode."
+#~ msgstr "parâmetro de entrada 'point_coord' para o modo shader fragment."
+
+#~ msgid "'screen_uv' input parameter for fragment shader mode."
+#~ msgstr "parâmetro de entrada 'screen_uv' para o modo shader fragment."
+
+#~ msgid "'tangent' input parameter for vertex and fragment shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'tangent' para os modos shader vertex e fragment."
+
+#~ msgid "'uv2' input parameter for vertex and fragment shader modes."
+#~ msgstr "parâmetro de entrada 'uv2' para os modos shader vertex e fragment."
+
+#~ msgid "'vertex' input parameter for vertex and fragment shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'vertex' para os modos shader vertex e fragment."
+
+#~ msgid "'albedo' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'albedo' para o modo shader light."
+
+#~ msgid "'attenuation' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'attenuation' para o modo shader light."
+
+#~ msgid "'light' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'light' para o modo shader light."
+
+#~ msgid "'light_color' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'light_color' para o modo shader light."
+
+#~ msgid "'roughness' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'roughness' para o modo shader light."
+
+#~ msgid "'specular' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'specular' para o modo shader light."
+
+#~ msgid "'transmission' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'transmission' para o modo shader light."
+
+#~ msgid "'modelview' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'modelview' para o modo shader vertex."
+
+#~ msgid "'point_size' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'point_size' para o modo shader vertex."
+
+#~ msgid "'tangent' input parameter for vertex and fragment shader mode."
+#~ msgstr ""
+#~ "parâmetro de entrada 'tangent' para os modos shader vertex e fragment."
+
+#~ msgid "'light_pass' input parameter for vertex and fragment shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'light_pass' para os modos shader vertex e fragment."
+
+#~ msgid "'point_coord' input parameter for fragment and light shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'point_coord' para os modos shader fragment e light."
+
+#~ msgid "'screen_pixel_size' input parameter for fragment shader mode."
+#~ msgstr ""
+#~ "parâmetro de entrada 'screen_pixel_size' para o modo shader fragment."
+
+#~ msgid "'screen_uv' input parameter for fragment and light shader modes."
+#~ msgstr ""
+#~ "parâmetro de entrada 'screen_uv' para modos shader fragment e light."
+
+#~ msgid "'light_alpha' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'light_alpha' para modo shader light."
+
+#~ msgid "'light_height' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'light_height' para modo shader light."
+
+#~ msgid "'light_uv' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'light_uv' para modo shader light."
+
+#~ msgid "'light_vec' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'light_vec' para modo shader light."
+
+#~ msgid "'normal' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'normal' para modo shader light."
+
+#~ msgid "'shadow_color' input parameter for light shader mode."
+#~ msgstr "parâmetro de entrada 'shadow_color' para modo shader light."
+
+#~ msgid "'extra' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'extra' para modo shader vertex."
+
+#~ msgid "'projection' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'projection' para modo shader vertex."
+
+#~ msgid "'vertex' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'vertex' para modo shader vertex."
+
+#~ msgid "'world' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'world' para modo shader vertex."
+
+#~ msgid "'active' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'active' para modo shader vertex."
+
+#~ msgid "'alpha' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'alpha' para modo shader vertex."
+
+#~ msgid "'color' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'color' para modo shader vertex."
+
+#~ msgid "'custom_alpha' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'custom_alpha' para modo shader vertex."
+
+#~ msgid "'delta' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'delta' para modo shader vertex."
+
+#~ msgid "'emission_transform' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'emission_transform' para modo shader vertex."
+
+#~ msgid "'index' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'index' para modo shader vertex."
+
+#~ msgid "'lifetime' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'lifetime' para modo shader vertex."
+
+#~ msgid "'restart' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'restart' para modo shader vertex."
+
+#~ msgid "'time' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'time' para modo shader vertex."
+
+#~ msgid "'transform' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'transform' para modo shader vertex."
+
+#~ msgid "'velocity' input parameter for vertex shader mode."
+#~ msgstr "parâmetro de entrada 'velocity' para modo shader vertex."
+
+#~ msgid "Raw Mode"
+#~ msgstr "Modo Raw"
+
+#~ msgid "Path to Node:"
+#~ msgstr "Caminho para Nó:"
+
+#~ msgid "Delete selected files?"
+#~ msgstr "Apagar arquivos selecionados?"
+
+#~ msgid "There is no 'res://default_bus_layout.tres' file."
+#~ msgstr "O Ficheiro 'res://default_bus_layout.tres' não existe."
+
+#~ msgid "Go to parent folder"
+#~ msgstr "Ir para a pasta acima"
+
+#~ msgid "Open Scene(s)"
+#~ msgstr "Abrir Cena(s)"
+
+#~ msgid "Previous Directory"
+#~ msgstr "Diretoria anterior"
+
+#~ msgid "Next Directory"
+#~ msgstr "Diretoria seguinte"
+
+#~ msgid "Ease in"
+#~ msgstr "Ease in"
+
+#~ msgid "Ease out"
+#~ msgstr "Ease out"
+
+#~ msgid "Create Convex Static Body"
+#~ msgstr "Criar corpo estático convexo"
+
+#~ msgid "CheckBox Radio1"
+#~ msgstr "Caixa de seleção Radio1"
+
+#~ msgid "CheckBox Radio2"
+#~ msgstr "Caixa de seleção Radio2"
+
+#~ msgid "Create folder"
+#~ msgstr "Criar pasta"
+
+#~ msgid "Custom Node"
+#~ msgstr "Nó Personalizado"
+
+#~ msgid "Invalid Path"
+#~ msgstr "Caminho inválido"
+
+#~ msgid "GridMap Duplicate Selection"
+#~ msgstr "Seleção duplicada de GridMap"
+
+#~ msgid "Create Area"
+#~ msgstr "Criar Área"
+
+#~ msgid "Create Exterior Connector"
+#~ msgstr "Criar Conector exterior"
+
+#~ msgid "Edit Signal Arguments:"
+#~ msgstr "Editar Argumentos do Sinal:"
+
+#~ msgid "Edit Variable:"
+#~ msgstr "Editar Variável:"
+
+#~ msgid "Snap (s): "
+#~ msgstr "Ajuste (s): "
+
+#~ msgid "Insert keys."
+#~ msgstr "Inserir chaves."
+
+#~ msgid "Instance the selected scene(s) as child of the selected node."
+#~ msgstr ""
+#~ "Instancie a(s) Cena(s) selecionada(s) como filha(s) do Nó selecionado."
+
+#~ msgid "Font Size:"
+#~ msgstr "Tamanho do tipo de letra:"
+
+#~ msgid "Line:"
+#~ msgstr "Linha:"
+
+#~ msgid "Col:"
+#~ msgstr "Coluna:"
+
+#~ msgid "OrientedPathFollow only works when set as a child of a Path node."
+#~ msgstr ""
+#~ "OrientedPathFollow apenas funciona quando definido como filho de um Nó "
+#~ "Path."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Separar ponto consigo próprio."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "Separação não forma uma aresta existente."
+
+#~ msgid "Add Split"
+#~ msgstr "Adicionar Separação"
+
+#~ msgid "Remove Split"
+#~ msgstr "Remover Separação"
+
+#~ msgid "Poly"
+#~ msgstr "Poli"
+
+#~ msgid "Splits"
+#~ msgstr "Separações"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Conectar dois pontos para fazer uma divisão."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Selecionar uma separação para a apagar."
+
+#~ msgid "Add Node.."
+#~ msgstr "Adicionar Nó.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Criar a partir da Cena?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Criar Polígono"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Criar um novo Polígono de raíz"
+
+#~ msgid "Zoom out"
+#~ msgstr "Diminuir zoom"
+
+#~ msgid "Zoom in"
+#~ msgstr "Aumentar zoom"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Criar Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Não há recurso OccluderPolygon2D neste Nó.\n"
+#~ "Criar um e associar?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Mover Ponto."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: Separar segmento."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Apagar Ponto."
+
+#~ msgid "New TextFile"
+#~ msgstr "Novo TextFile"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Guardar tema como"
+
+#~ msgid "<None>"
+#~ msgstr "<Nenhum>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Selecionar sub-tile para usar como ícone, também será usado em ligações "
+#~ "autotile inválidas."
+
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Está seguro que quer remover todas as conexões de \""
+
+#~ msgid "Class List:"
+#~ msgstr "Lista de Classes:"
+
+#~ msgid "Public Methods"
+#~ msgstr "Métodos Públicos"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Métodos Públicos:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Itens do tema GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Itens do tema GUI:"
+
+#~ msgid "Property: "
+#~ msgstr "Propriedade: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Alternar a pasta de situação como Favorita."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Mostrar o ficheiro da cena atual."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Ir para Vista de árvore."
+
+#~ msgid "Whole words"
+#~ msgstr "Palavras completas"
+
+#~ msgid "Match case"
+#~ msgstr "Sensível a maiúsculas/minúsculas"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Mostrar no Sistema de Ficheiros"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Procurar na hierarquia de classe."
+
+#~ msgid "Search in files"
+#~ msgstr "Procurar em ficheiros"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Scripts incorporados só podem ser editados quando a Cena a que pertencem "
+#~ "é carregada"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Converter em maiúsculas"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Converter em minúsculas"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Rodar 0 graus"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Rodar 90 graus"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Rodar 180 graus"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Rodar 270 graus"
+
+#~ msgid "Variable"
+#~ msgstr "Variável"
+
+#~ msgid "Errors:"
+#~ msgstr "Erros:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Stack Trace (se aplicável):"
+
+#~ msgid "Bake!"
+#~ msgstr "Cozinhar!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Cozinhar a Malha de navegação."
+
+#~ msgid "Get"
+#~ msgstr "Obter"
+
+#~ msgid "Change RGB Constant"
+#~ msgstr "Mudar constante RGB"
+
+#~ msgid "Change Vec Scalar Operator"
+#~ msgstr "Mudar operador escalar/vetorial"
+
+#~ msgid "Change RGB Operator"
+#~ msgstr "Mudar operador RGB"
+
+#~ msgid "Toggle Rot Only"
+#~ msgstr "Alternar só rotação"
+
+#~ msgid "Change Vec Function"
+#~ msgstr "Mudar Função vetorial"
+
+#~ msgid "Change Vec Uniform"
+#~ msgstr "Mudar uniforme vetorial"
+
+#~ msgid "Change RGB Uniform"
+#~ msgstr "Mudar uniforme RGB"
+
+#~ msgid "Change Default Value"
+#~ msgstr "Mudar valor padrão"
+
+#~ msgid "Change XForm Uniform"
+#~ msgstr "Mudar uniforme XForm"
+
+#~ msgid "Change Cubemap Uniform"
+#~ msgstr "Mudar uniforme Cubemap"
+
+#~ msgid "Change Comment"
+#~ msgstr "Mudar comentário"
+
+#~ msgid "Add/Remove to Color Ramp"
+#~ msgstr "Adicionar/remover da rampa de cores"
+
+#~ msgid "Modify Color Ramp"
+#~ msgstr "Modificar rampa de cores"
+
+#~ msgid "Add/Remove to Curve Map"
+#~ msgstr "Adicionar/remover do mapa de curva"
+
+#~ msgid "Modify Curve Map"
+#~ msgstr "Modificar mapa de curva"
+
+#~ msgid "Connect Graph Nodes"
+#~ msgstr "Conectar Nós do gráfico"
+
+#~ msgid "Remove Shader Graph Node"
+#~ msgstr "Remover Nó Gráfico Shader"
+
+#~ msgid "Move Shader Graph Node"
+#~ msgstr "Mover Nó Gráfico Shader"
+
+#~ msgid "Duplicate Graph Node(s)"
+#~ msgstr "Duplicar Nó(s)"
+
+#~ msgid "Error: Cyclic Connection Link"
+#~ msgstr "Erro: conexão cíclica"
+
+#~ msgid "Error: Missing Input Connections"
+#~ msgstr "Erro: Faltam conexões de entrada"
+
+#~ msgid "Add Shader Graph Node"
+#~ msgstr "Adicionar Nó Gráfico Shader"
+
+#~ msgid "Move Anim Track Up"
+#~ msgstr "Subir Pista de Animação"
+
+#~ msgid "Move Anim Track Down"
+#~ msgstr "Descer Pista de Animação"
+
+#~ msgid "Set Transitions to:"
+#~ msgstr "Definir transições para:"
+
+#~ msgid "Anim Track Rename"
+#~ msgstr "Anim Renomear Pista"
+
+#~ msgid "Anim Track Change Interpolation"
+#~ msgstr "Pista Anim Mudar Interpolação"
+
+#~ msgid "Anim Track Change Value Mode"
+#~ msgstr "Pista Anim Mudar Modo do Valor"
+
+#~ msgid "Anim Track Change Wrap Mode"
+#~ msgstr "Pista Anim Mudar Modo de Embrulho"
+
+#~ msgid "Edit Node Curve"
+#~ msgstr "Editar curva do Nó"
+
+#~ msgid "Edit Selection Curve"
+#~ msgstr "Editar Curva da Seleção"
+
+#~ msgid "Anim Add Key"
+#~ msgstr "Anim Adicionar Chave"
+
+#~ msgid "In"
+#~ msgstr "Dentro"
+
+#~ msgid "Out"
+#~ msgstr "Fora"
+
+#~ msgid "In-Out"
+#~ msgstr "Dentro-Fora"
+
+#~ msgid "Out-In"
+#~ msgstr "Fora-Dentro"
+
+#~ msgid "Change Anim Len"
+#~ msgstr "Mudar Duração da Animação"
+
+#~ msgid "Change Anim Loop"
+#~ msgstr "Mudar Ciclo da Animação"
+
+#~ msgid "Anim Create Typed Value Key"
+#~ msgstr "Anim Criar Chave de Valor Digitado"
+
+#~ msgid "Anim Add Call Track"
+#~ msgstr "Anim Adicionar Pista de chamada"
+
+#~ msgid "Length (s):"
+#~ msgstr "Duração (s):"
+
+#~ msgid "Cursor step snap (in seconds)."
+#~ msgstr "Ajuste do Cursor (em segundos)."
+
+#~ msgid "Enable/Disable looping in animation."
+#~ msgstr "Ativar/Desativar repetição na Animação."
+
+#~ msgid "Add new tracks."
+#~ msgstr "Adicionar novas Pistas."
+
+#~ msgid "Move current track up."
+#~ msgstr "Mover Pista atual para cima."
+
+#~ msgid "Move current track down."
+#~ msgstr "Mover Pista atual para baixo."
+
+#~ msgid "Track tools"
+#~ msgstr "Ferramentas da Pista"
+
+#~ msgid "Enable editing of individual keys by clicking them."
+#~ msgstr "Ativar edição de Chaves individuais ao clicar nelas."
+
+#~ msgid "Key"
+#~ msgstr "Chave"
+
+#~ msgid "Call Functions in Which Node?"
+#~ msgstr "Chamar funções em que Nó?"
+
+#~ msgid "Thanks!"
+#~ msgstr "Obrigado!"
+
+#~ msgid "I see..."
+#~ msgstr "Eu vejo..."
+
+#~ msgid "Can't open '%s'."
+#~ msgstr "Impossível abrir '%s'."
+
+#~ msgid "Ugh"
+#~ msgstr "Ugh"
+
+#~ msgid "Run Script"
+#~ msgstr "Executar Script"
+
+#~ msgid "Stop Profiling"
+#~ msgstr "Parar análise"
+
+#~ msgid "Start Profiling"
+#~ msgstr "Começar análise"
+
+#~ msgid "Default (Same as Editor)"
+#~ msgstr "Padrão (mesmo que o Editor)"
+
+#~ msgid "Create new animation in player."
+#~ msgstr "Criar uma nova Animação no reprodutor."
+
+#~ msgid "Load animation from disk."
+#~ msgstr "Abrir Animação do disco."
+
+#~ msgid "Load an animation from disk."
+#~ msgstr "Carregar uma Animação do disco."
+
+#~ msgid "Save the current animation"
+#~ msgstr "Guardar a Animação atual"
+
+#~ msgid "Edit Target Blend Times"
+#~ msgstr "Editar tempos de mistura do alvo"
+
+#~ msgid "Copy Animation"
+#~ msgstr "Copiar Animação"
+
+#~ msgid "Fetching:"
+#~ msgstr "Em busca:"
+
+#~ msgid "prev"
+#~ msgstr "anterior"
+
+#~ msgid "next"
+#~ msgstr "seguinte"
+
+#~ msgid "last"
+#~ msgstr "último"
+
+#~ msgid "Edit IK Chain"
+#~ msgstr "Editar corrente IK"
+
+#~ msgid "Drag pivot from mouse position"
+#~ msgstr "Arrastar Eixo da posição do rato"
+
+#~ msgid "Set pivot at mouse position"
+#~ msgstr "Definir Eixo na posição do rato"
+
+#~ msgid "Add/Remove Color Ramp Point"
+#~ msgstr "Adicionar/remover Ponto da rampa de cores"
+
+#~ msgid "OK :("
+#~ msgstr "OK :("
+
+#~ msgid "Skeleton Gizmo visibility"
+#~ msgstr "Visibilidade do Skeleton Gizmo"
+
+#~ msgid "StyleBox Preview:"
+#~ msgstr "Pré-visualização StyleBox:"
+
+#~ msgid "StyleBox"
+#~ msgstr "StyleBox"
+
+#~ msgid "Separation:"
+#~ msgstr "Separação:"
+
+#~ msgid "Texture Region Editor"
+#~ msgstr "Editor da região de textura"
+
+#~ msgid "Erase selection"
+#~ msgstr "Apagar seleção"
+
+#~ msgid "Item name or ID:"
+#~ msgstr "Nome ou ID do item:"
+
+#~ msgid "Export templates for this platform are missing/corrupted: "
+#~ msgstr ""
+#~ "Modelos de exportação para esta plataforma estão ausentes/corrompidos: "
+
+#~ msgid "Button 8"
+#~ msgstr "Botão 8"
+
+#~ msgid "Button 9"
+#~ msgstr "Botão 9"
+
+#~ msgid "Discard Instancing"
+#~ msgstr "Descartar instância"
+
+#~ msgid "Clear!"
+#~ msgstr "Limpo!"
+
+#~ msgid "Toggle Spatial Visible"
+#~ msgstr "Alternar visibilidade espacial"
+
+#~ msgid "Condition"
+#~ msgstr "Condição"
+
+#~ msgid "Sequence"
+#~ msgstr "Sequência"
+
+#~ msgid "Iterator"
+#~ msgstr "Iterador"
+
+#~ msgid "While"
+#~ msgstr "Enquanto"
+
+#~ msgid "Return"
+#~ msgstr "Voltar"
+
+#~ msgid "Call"
+#~ msgstr "Chamar"
+
+#~ msgid "Edit Variable"
+#~ msgstr "Editar variável"
+
+#~ msgid "Edit Signal"
+#~ msgstr "Editar sinal"
+
+#~ msgid "Invalid action (anything goes but '/' or ':')."
+#~ msgstr "Ação inválida (tudo menos '/' ou ':')."
+
+#~ msgid "Can't contain '/' or ':'"
+#~ msgstr "Não pode conter '/' ou ':'"
+
+#~ msgid ""
+#~ "Invalid version.txt format inside templates. Revision is not a valid "
+#~ "identifier."
+#~ msgstr ""
+#~ "Formato de version.txt inválido, dentro dos Modelos. Revisão não é um "
+#~ "identificador válido."
+
+#~ msgid "Can't write file."
+#~ msgstr "Impossível escrever o Ficheiro."
+
+#~ msgid "Couldn't get project.godot in project path."
+#~ msgstr "Impossível encontrar project.godot no Caminho do Projeto."
+
+#~ msgid "Couldn't get project.godot in the project path."
+#~ msgstr "Impossível encontrar project.godot no Caminho do Projeto."
+
+#~ msgid "Not found!"
+#~ msgstr "Não encontrado!"
+
+#~ msgid "Replace By"
+#~ msgstr "Substituir por"
+
+#~ msgid "Backwards"
+#~ msgstr "Para trás"
+
+#~ msgid "Prompt On Replace"
+#~ msgstr "Perguntar ao substituir"
+
+#~ msgid "Skip"
+#~ msgstr "Ignorar"
+
+#~ msgid ""
+#~ "Your project will be created in a non empty folder (you might want to "
+#~ "create a new folder)."
+#~ msgstr ""
+#~ "O Projeto será criado numa pasta não vazia (poderá preferir criar uma "
+#~ "nova pasta)."
+
+#~ msgid "That's a BINGO!"
+#~ msgstr "É um BINGO!"
+
+#~ msgid "preview"
+#~ msgstr "Pré-visualização"
+
+#~ msgid "Move Add Key"
+#~ msgstr "Mover Adicionar Chave"
+
+#~ msgid "Create Subscription"
+#~ msgstr "Criar subscrição"
+
+#~ msgid "List:"
+#~ msgstr "Lista:"
+
+#~ msgid "Set Emission Mask"
+#~ msgstr "Definir máscara de emissão"
+
+#~ msgid "Clear Emitter"
+#~ msgstr "Limpar emissor"
+
+#~ msgid "Fold Line"
+#~ msgstr "Dobrar linha"
+
+#~ msgid " "
+#~ msgstr " "
+
+#~ msgid "Sections:"
+#~ msgstr "Secções:"
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
index a7d921b78e..29b0350e10 100644
--- a/editor/translations/pt_BR.po
+++ b/editor/translations/pt_BR.po
@@ -12,11 +12,11 @@
# Guilherme Felipe C G Silva <guilhermefelipecgs@gmail.com>, 2017, 2018, 2019.
# João Victor Lima <victordevtb@outlook.com>, 2018.
# João Vitor de Oliveira Carlos <lopogax@gmail.com>, 2018.
-# Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016, 2019.
+# Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016, 2019, 2020.
# jonathan railarem <railarem@gmail.com>, 2017.
# Lucas Silva <lucasb.hpp@gmail.com>, 2018.
# Luiz G. Correia <luizgabriell2.0@gmail.com>, 2017.
-# Mailson Silva Marins <mailsons335@gmail.com>, 2016.
+# Mailson Silva Marins <mailsons335@gmail.com>, 2016, 2020.
# MalcomRF <malcomkbk@gmail.com>, 2017.
# Marcus Correia <marknokalt@live.com>, 2017-2018.
# Michael Alexsander Silva Dias <michaelalexsander@protonmail.com>, 2017-2018.
@@ -28,7 +28,7 @@
# Michel G. Souza <Michelgomesdes@hotmail.com>, 2018.
# Caio Northfleet <caio.northfleet@gmail.com>, 2018.
# Henrique Combochi <henrique.combochi@gmail.com>, 2018, 2019.
-# Gabriel Carvalho <billlmaster@gmail.com>, 2018, 2019.
+# Gabriel Carvalho <billlmaster@gmail.com>, 2018, 2019, 2020.
# miketangogamer <miketangogamer@gmail.com>, 2018.
# Eduardo Abreu <eduo.abreu@gmail.com>, 2018, 2019.
# Bruno Miranda Da Silva <brunofreezee@gmail.com>, 2018.
@@ -48,12 +48,12 @@
# joel silva <joelgbsilva@gmail.com>, 2019.
# Heitor Novais Pereira <heitornovais394@outlook.com>, 2019.
# Joel Landgraf Filho <joel.landgraf@gmail.com>, 2019.
-# Alan Valmorbida <alanvalmorbida@gmail.com>, 2019.
+# Alan Valmorbida <alanvalmorbida@gmail.com>, 2019, 2020.
# João Vitor Ferreira Cavalcante <jvfecav@gmail.com>, 2019.
# Thiago Amendola <amendolathiago@gmail.com>, 2019.
# Raphael Nogueira Campos <raphaelncampos@gmail.com>, 2019.
# Dimenicius <vinicius.costa.92@gmail.com>, 2019.
-# Davi <wokep.ma.wavid@gmail.com>, 2019.
+# Davi <wokep.ma.wavid@gmail.com>, 2019, 2020.
# Endrick Gustavo <endrickgb@hotmail.com>, 2019.
# Hans M. Boron <hansmateusboron@gmail.com>, 2019.
# Gustavo Bolanho <jdmapas@gmail.com>, 2019.
@@ -61,31 +61,51 @@
# Ivo Nascimento <iannsp@gmail.com>, 2019.
# Klaus Dellano <klausdell@hotmail.com>, 2019.
# Esdras Tarsis <esdrastarsis@gmail.com>, 2019.
-# Douglas Fiedler <dognew@gmail.com>, 2019.
+# Douglas Fiedler <dognew@gmail.com>, 2019, 2020.
# Rarysson Guilherme <r_guilherme12@hotmail.com>, 2019.
# Gustavo da Silva Santos <gustavo94.rb@gmail.com>, 2019.
# Rafael Roque <rafael.roquec@gmail.com>, 2019.
# José Victor Dias Rodrigues <zoldyakopersonal@gmail.com>, 2019.
-# Fupi Brazil <fupicat@gmail.com>, 2019.
+# Fupi Brazil <fupicat@gmail.com>, 2019, 2020.
# Julio Pinto Coelho <juliopcrj@gmail.com>, 2019.
# Perrottacooking <perrottacooking@gmail.com>, 2019.
# Wow Bitch <hahaj@itmailr.com>, 2019.
# Alan Tavares <alan1tavares@gmail.com>, 2019.
# Rafael Silveira <res883@gmail.com>, 2019.
# Luigi <luigimendeszanchett@gmail.com>, 2019.
-# Nicolas Abril <nicolas.abril@protonmail.ch>, 2019.
-# johnnybigoode <jamarson@gmail.com>, 2019.
+# Nicolas Abril <nicolas.abril@protonmail.ch>, 2019, 2020.
+# johnnybigoode <jamarson@gmail.com>, 2019, 2020.
# Zeero <igcdzeero@gmail.com>, 2019.
# Gian Penna <gianfrancopen@gmail.com>, 2020.
# sribgui <sribgui@gmail.com>, 2020.
# patrickvob <patrickvob@gmail.com>, 2020.
# Michael Leocádio <aeronmike@gmail.com>, 2020.
+# Z <rainromes@gmail.com>, 2020.
+# Leonardo Dimano <leodimano@live.com>, 2020.
+# Guilherme Souza Reis de Melo Lopes <gsrmlopes@gmail.com>, 2020.
+# Richard Urban <redasuio1@gmail.com>, 2020.
+# Wellyngton R Weller <well.weller@hotmail.com>, 2020.
+# Lucas Araujo <lucassants2808@gmail.com>, 2020.
+# Sr Half <flavio05@outlook.com>, 2020.
+# Matheus Pesegoginski <pese.ek.tk@outlook.com>, 2020.
+# DeeJayLSP <djlsplays@gmail.com>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
+# André Sousa <andrelvsousa@gmail.com>, 2020.
+# Kleyton Luiz de Sousa Vieira <kleytonluizdesouzavieira@gmail.com>, 2020.
+# Felipe Jesus Macedo <fmacedo746@gmail.com>, 2020.
+# José Paulo <jose.paulo1919@gmail.com>, 2020.
+# Necco <necco@outlook.com>, 2020.
+# Marcelo Silveira Hayden <mshayden.1998@gmail.com>, 2020.
+# GUILHERME SOUZA REIS DE MELO LOPES <guilhermesrml@unipam.edu.br>, 2020.
+# Gabriela Araújo <Gabirin@outlook.com.br>, 2020.
+# Jairo Tuboi <tuboi.jairo@gmail.com>, 2020.
+# Felipe Fetter <felipetfetter@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
-"Last-Translator: Michael Leocádio <aeronmike@gmail.com>\n"
+"PO-Revision-Date: 2020-09-12 00:46+0000\n"
+"Last-Translator: Felipe Fetter <felipetfetter@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_BR/>\n"
"Language: pt_BR\n"
@@ -93,16 +113,16 @@ 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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Argumento de tipo inválido para convert(), use constantes TYPE_*."
+msgstr "Tipo de argumento inválido para convert(), use constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "Esperado string de comprimento 1 (a caractere)."
+msgstr "Esperado uma string de comprimento 1 (um caractere)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -112,11 +132,11 @@ msgstr "Não há bytes suficientes para decodificar, ou o formato é inválido."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Entrada inválida %i (não passou) na expressão"
+msgstr "Entrada inválida %i (não passada) na expressão"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "self não pode ser usado porque a instancia é nula (não passou)"
+msgstr "self não pode ser usado porque a instância é nula (não passada)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -132,7 +152,7 @@ msgstr "Nome inválido de índice '%s' para base tipo %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "Argumento inválido do tipo '%s'"
+msgstr "Argumentos inválidos para o construto '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -168,7 +188,7 @@ msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "Livre"
+msgstr "Gratuito"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -224,7 +244,7 @@ msgstr "Alterar Transição da Animação"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "Alterar Transformação da Anim"
+msgstr "Alterar Transformação da Animação"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
@@ -232,7 +252,7 @@ msgstr "Alterar Valor de Quadro-Chave da Anim"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr "Alterar Chamada da Anim"
+msgstr "Alterar Chamada da Animação"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Time"
@@ -240,11 +260,11 @@ msgstr "Alterar Tempo de Quadro-Chave da Anim Multi"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Transition"
-msgstr "Transição de Animação com Múltiplas Mudanças"
+msgstr "Alterar Transição da Animação"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Transform"
-msgstr "Transformação de Animação com Múltiplas Mudanças"
+msgstr "Alterar Transformação da Anim"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Value"
@@ -297,7 +317,7 @@ msgstr "Duração da Animação (em segundos)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
-msgstr "Adicionar Trilha"
+msgstr "Adicionar Faixa"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
@@ -322,7 +342,7 @@ msgstr "Alterar Valor do Trajeto"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "Ligar/desligar esta trilha."
+msgstr "Ligar/desligar esta faixa."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
@@ -338,7 +358,7 @@ msgstr "Modo Loop Enrolado (Interpolar fim com início no loop)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
-msgstr "Remover esta trilha."
+msgstr "Remover esta faixa."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
@@ -346,7 +366,7 @@ msgstr "Tempo (s): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr "Habilitar/Desabilitar Trilha"
+msgstr "Habilitar Faixa"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -416,11 +436,11 @@ msgstr "Remover Trilha da Anim"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr "Criar NOVA trilha para %s e inserir chave?"
+msgstr "Criar NOVA faixa para %s e inserir chave?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "Criar %d NOVAS trilhas e inserir chaves?"
+msgstr "Criar %d NOVAS faixas e inserir chaves?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -460,7 +480,7 @@ msgstr "Alterar FPS da Animação"
#: editor/animation_track_editor.cpp
msgid "Rearrange Tracks"
-msgstr "Reordenar Trilhas"
+msgstr "Reordenar Faixas"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
@@ -502,11 +522,11 @@ msgstr "Adicionar Trilha Bezier"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr "Caminho da trilha é inválido,então não pode adicionar uma chave."
+msgstr "Caminho da faixa é inválido, então não pode adicionar uma chave."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr "Trilha não é do tipo Espacial,não pode inserir chave"
+msgstr "Faixa não é do tipo Espacial, não pode inserir chave"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
@@ -566,7 +586,7 @@ msgstr ""
"Esta animação pertence a uma cena importada, dessa forma, mudanças das "
"trilhas importadas não serão salvas.\n"
"\n"
-"Para ativar a possibilidade de adicionar trilhas customizadas, navegue até "
+"Para ativar a possibilidade de adicionar trilhas customizadas, navegue até "
"as configurações de importação da cena e defina\n"
"\"Animação > Armazenamento\" para \"Arquivos\", ative \"Animação > Mantenha "
"Trilhas Customizadas\", então reimporte.\n"
@@ -602,6 +622,7 @@ msgid "Seconds"
msgstr "Segundos"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -734,7 +755,7 @@ msgstr "Adicionar Clipe de Trilha de Áudio"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr "Alterar Offset de Início do Clipe da Trilha de Áudio"
+msgstr "Mudar Deslocamento do Início do Clip de Trilha de Audio"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
@@ -761,8 +782,8 @@ msgid "Line Number:"
msgstr "Número da Linha:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "%d ocorrência(s) substituída(s)."
+msgid "%d replaced."
+msgstr "%d substituído."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -780,7 +801,7 @@ msgstr "Caso de correspondência"
msgid "Whole Words"
msgstr "Palavras Inteiras"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Substituir"
@@ -830,6 +851,10 @@ msgid "Method in target node must be specified."
msgstr "O método no nó alvo precisa ser especificado."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "O nome do método deve ser um identificador válido."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -912,7 +937,6 @@ msgstr "Não foi possível conectar o sinal"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -969,6 +993,11 @@ msgid "Signals"
msgstr "Sinais"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtros do tile"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Tem certeza que quer remover todas conexões desse sinal?"
@@ -1006,7 +1035,7 @@ msgid "Recent:"
msgstr "Recente:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Pesquisar:"
@@ -1187,9 +1216,12 @@ msgstr "Fundadores do Projeto"
msgid "Lead Developer"
msgstr "Desenvolvedor-chefe"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr "Gerenciador de Projetos "
+msgstr "Gerente do Projeto "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1208,6 +1240,14 @@ msgid "Gold Sponsors"
msgstr "Patrocinadores Ouro"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Patrocinadores Prata"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Patrocinadores Bronze"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Patrocinadores Mini"
@@ -1439,7 +1479,7 @@ msgstr "Adicionar Canal"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
-msgstr "Adicionar novo Canal de Áudio a este layout."
+msgstr "Adicionar um novo Canal de Áudio a este layout."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1515,7 +1555,7 @@ msgstr "Mover Autoload"
msgid "Remove Autoload"
msgstr "Remover Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Habilitar"
@@ -1523,17 +1563,9 @@ msgstr "Habilitar"
msgid "Rearrange Autoloads"
msgstr "Reordenar Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Caminho inválido."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "O arquivo não existe."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Não está no caminho de recursos."
+msgid "Can't add autoload:"
+msgstr "Não pode adicionar autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1548,7 +1580,7 @@ msgstr "Caminho:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr "Nome do nó:"
+msgstr "Nome do Nó:"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
@@ -1560,6 +1592,10 @@ msgstr "Nome"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Colar Parâmetros"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Atualizando Cena"
@@ -1687,16 +1723,17 @@ msgid "Scene Tree Editing"
msgstr "Edição da Árvore de Cena"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importar Dock"
+msgid "Node Dock"
+msgstr "Painel de Nós"
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
-msgstr "Dock de Nós"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Arquivos"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Sistema de Arquivos e Importar Docks"
+msgid "Import Dock"
+msgstr "Importar Dock"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1778,7 +1815,7 @@ msgstr "Novo"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "Importar"
+msgstr "Import"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
@@ -1845,7 +1882,7 @@ msgstr "Mostrar no Gerenciador de Arquivos"
msgid "New Folder..."
msgstr "Nova Pasta..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Atualizar"
@@ -1911,7 +1948,7 @@ msgstr "Alternar Modo"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "Focar no Caminho"
+msgstr "Habilitar"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
@@ -1959,7 +1996,7 @@ msgstr "Diretórios & Arquivos:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Previsualização:"
@@ -2397,10 +2434,6 @@ msgid "There is no defined scene to run."
msgstr "Não há cena definida para rodar."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "A cena atual nunca foi salva. Por favor salve antes de rodá-la."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Não se pôde iniciar sub-processo!"
@@ -2485,12 +2518,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Não foi possível recarregar a cena pois nunca foi salva."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Reverter"
+msgid "Reload Saved Scene"
+msgstr "Recarregar Cena Salva"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Esta ação não pode ser desfeita. Reverter mesmo assim?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"A cena atual possui alterações não salvas.\n"
+"Recarregar a cena salva mesmo assim? Essa ação não poderá ser desfeita."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2610,8 +2647,8 @@ msgid ""
"category."
msgstr ""
"A cena principal não foi definida, selecionar uma?\n"
-"Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na "
-"categoria 'Application'."
+"Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na categoria "
+"'Application'."
#: editor/editor_node.cpp
msgid ""
@@ -2721,11 +2758,11 @@ msgstr "Copiar Texto"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr "Próxima guia"
+msgstr "Próxima aba"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "Guia anterior"
+msgstr "Aba anterior"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -2782,10 +2819,6 @@ msgid "Redo"
msgstr "Refazer"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Reverter Cena"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Ferramentas diversas atuantes no projeto ou cena."
@@ -2837,7 +2870,7 @@ msgstr "Sair para a Lista de Projetos"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr "Depurar"
+msgstr "Depuração"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
@@ -2845,24 +2878,28 @@ msgstr "Distribuir com Depuragem Remota"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Quando exportando ou instalando, o programa resultante tentará conectar ao "
-"IP deste computador para poder ser depurado."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Pequena DIstribuição com Sistema de Arquivos de Rede"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Quando esta opção está habilitada, a exportação ou instalação produzirá um "
"executável mínimo.\n"
@@ -2875,9 +2912,10 @@ msgid "Visible Collision Shapes"
msgstr "Formas de Colisão Visíveis"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Formas de colisão e nós do tipo RayCast (2D e 3D) serão visíveis durante a "
"execução do jogo caso esta opção esteja habilitada."
@@ -2887,23 +2925,26 @@ msgid "Visible Navigation"
msgstr "Navegação Visível"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
-"Malhas e polígonos de navegação serão visíveis no jogo se esta opção estiver "
-"ligada."
+"Malhas e polígonos de navegação serão visíveis no jogo em execução se esta "
+"opção estiver ligada."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sincronizar Mudanças de Cena"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Quando essa opção está ativa, quaisquer alterações feitas à cena no editor "
"serão replicadas no jogo em execução.\n"
@@ -2911,15 +2952,17 @@ msgstr ""
"sistema de arquivos via rede."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sincronizar Mudanças de Script"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Quando essa opção está ativa, qualquer script que é salvo será recarregado "
"no jogo em execução.\n"
@@ -2948,7 +2991,7 @@ msgstr "Capturas de Telas ficam salvas na Pasta Editor Data/Settings."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Alternar Tela-Cheia"
+msgstr "Alternar Tela Cheia"
#: editor/editor_node.cpp
msgid "Toggle System Console"
@@ -2983,7 +3026,7 @@ msgstr "Ajuda"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Pesquisar"
@@ -2997,8 +3040,12 @@ msgid "Q&A"
msgstr "Perguntas & Respostas"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Rastreador de Problemas"
+msgid "Report a Bug"
+msgstr "Reportar bug"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Enviar Feedback de Docs"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3014,7 +3061,7 @@ msgstr "Roda o projeto."
#: editor/editor_node.cpp
msgid "Play"
-msgstr "Tocar"
+msgstr "Rodar"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
@@ -3022,7 +3069,7 @@ msgstr "Pausar a execução da cena para depuração."
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr "Pausa a cena"
+msgstr "Pausar Cena"
#: editor/editor_node.cpp
msgid "Stop the scene."
@@ -3109,14 +3156,13 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
-"Isso irá configurar seu projeto para compilações customizadas do Android "
-"instalando o template raíz em \"res://android/build\".\n"
-"Em seguida, você pode aplicar modificações e compilar seu próprio APK "
-"customizado na exportação (adicionando módulos, alterando o AndroidManifest."
-"xml, etc.).\n"
-"Note que para fazer uma compilação customizada em vez de usar APKs pre-"
-"compilados, a opção \"Usar compilação customizada\" deve estar ativa nas "
-"predefinições de exportação do Android."
+"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."
#: editor/editor_node.cpp
msgid ""
@@ -3171,7 +3217,7 @@ msgstr "Abrir Editor 3D"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "Abrir Editor de Scripts"
+msgstr "Abrir Editor de Script"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -3399,9 +3445,11 @@ msgid "Add Key/Value Pair"
msgstr "Adicionar Par de Chave/Valor"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Não foi encontrado uma definição de exportação executável para esta "
"plataforma.\n"
@@ -3431,6 +3479,12 @@ msgstr "Não foi possível rodar o script:"
msgid "Did you forget the '_run' method?"
msgstr "Você esqueceu o método '_run'?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Segure Ctrl para arredondar para números inteiros. Segure Shift para aplicar "
+"mudanças mais precisas."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Selecione Nó(s) para Importar"
@@ -3648,7 +3702,7 @@ msgstr "Selecionar o Arquivo de Modelo"
#: editor/export_template_manager.cpp
msgid "Godot Export Templates"
-msgstr "Modelos de Exportação do Godot"
+msgstr "Modelos de Exportação"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3847,7 +3901,7 @@ msgstr "Criar Script"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
msgid "Find in Files"
-msgstr "Localizar nos Arquivos"
+msgstr "Localizar nos arquivos"
#: editor/find_in_files.cpp
msgid "Find:"
@@ -3932,7 +3986,7 @@ msgstr "Grupos"
#: editor/groups_editor.cpp
msgid "Nodes Not in Group"
-msgstr "Nodes fora do Grupo"
+msgstr "Nós fora do Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
@@ -4029,10 +4083,18 @@ msgid "Error running post-import script:"
msgstr "Erro ao rodar script pós-importação:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "Você retornou um objeto derivado de Nó no método `post_import()`?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Salvando..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Arquivos"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Definir como Padrão para '%s'"
@@ -4041,10 +4103,6 @@ msgid "Clear Default for '%s'"
msgstr "Limpar Padrão para '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Arquivos"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importar como:"
@@ -4057,7 +4115,7 @@ msgid "Reimport"
msgstr "Reimportar"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Salvar cenas, reimportar e reiniciar"
#: editor/import_dock.cpp
@@ -4094,10 +4152,6 @@ msgid "Copy Params"
msgstr "Copiar Parâmetros"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Colar Parâmetros"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Editar Área de Transferência de Recursos"
@@ -4155,7 +4209,7 @@ msgstr "Alterações podem ser perdidas!"
#: editor/multi_node_edit.cpp
msgid "MultiNode Set"
-msgstr "Múltiplos Nodes definidos"
+msgstr "Conjunto de Multi-Nós"
#: editor/node_dock.cpp
msgid "Select a single node to edit its signals and groups."
@@ -4327,7 +4381,7 @@ msgstr "Abrir Editor"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Open Animation Node"
-msgstr "Abrir Nó de Animação"
+msgstr "Abrir Animação de Nós"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Triangle already exists."
@@ -4459,7 +4513,7 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
-"O reprodutor de animações não tem caminho de nó raiz válido, então não é "
+"O reprodutor de animações não tem um caminho de nó raiz válido, então não é "
"possível obter os nomes das trilhas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -4482,7 +4536,7 @@ msgstr "Nó Renomeado"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node..."
-msgstr "Adicionar nó..."
+msgstr "Adicionar Nó..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -4741,7 +4795,7 @@ msgstr "Viagem"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr "Nós inicial e final são necessários para uma sub-transição."
+msgstr "Nó inicial e final são necessários para uma sub-transição."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "No playback resource set at path: %s."
@@ -5054,7 +5108,7 @@ msgstr "Download deste asset já está em progresso!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr "Atualizado recentemente"
+msgstr "Atualizado Recentemente"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
@@ -5170,7 +5224,7 @@ msgid "Bake Lightmaps"
msgstr "Preparar Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Visualização"
@@ -5263,20 +5317,19 @@ msgid ""
"Children of containers have their anchors and margins values overridden by "
"their parent."
msgstr ""
-"Filhos de contêineres tem suas posições e margens sobrescritos pelos seus "
+"Filhos de contêineres tem suas posições e tamanhos sobrescritos pelos seus "
"pais."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Presets for the anchors and margins values of a Control node."
-msgstr ""
-"Predefinições para os valores de âncoras e margens de um nó de controle."
+msgstr "Predefinições para os valores de âncoras e margens de um nó Control."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
msgstr ""
-"Quando ativo, os nós de Controle móveis mudam suas âncoras em vez de suas "
+"Quando ativo, os nós Control móveis mudam suas âncoras em vez de suas "
"margens."
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -5317,27 +5370,27 @@ msgstr "Centro"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Left Wide"
-msgstr "Esquerda Largo"
+msgstr "Largura Esquerda"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Wide"
-msgstr "Superior Largo"
+msgstr "Largura Superior"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Right Wide"
-msgstr "Direita Largo"
+msgstr "Largura Direita"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Wide"
-msgstr "Inferior Largo"
+msgstr "Largura inferior"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr "Centro Vertical Largo"
+msgstr "Largura Centro Vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr "Centro Horizontal Largo"
+msgstr "Largura Centro Horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Full Rect"
@@ -5365,8 +5418,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
-"Substituir Câmera do Jogo\n"
-"Substitui a câmera do jogo com a câmera de visualização do editor."
+"Sobrepor Câmera de Jogo\n"
+"Sobrepõe a câmera de jogo com a janela de exibição da câmera."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5374,8 +5427,8 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
-"Substituir Câmera do Jogo\n"
-"Nenhuma instância de jogo em execução."
+"Sobrepor Câmera de Jogo\n"
+"Sem instância de jogo em execução."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5461,17 +5514,17 @@ msgstr "Alt + botão direito do mouse: Lista de seleção de profundidade"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
-msgstr "Modo Mover"
+msgstr "Modo de Movimentação"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Modo Rotacionar"
+msgstr "Modo de Rotação"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
-msgstr "Modo Escala"
+msgstr "Modo de Escalonamento"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5492,7 +5545,7 @@ msgstr "Modo Panorâmico"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Ruler Mode"
-msgstr "Modo Régua"
+msgstr "Modo de Régua"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
@@ -5606,7 +5659,7 @@ msgstr "Visualizar"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
-msgstr "Sempre Mostrar a Grade"
+msgstr "Sempre Mostrar Grade"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
@@ -5634,23 +5687,23 @@ msgstr "Exibir grupo e travar ícones"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "Centralizar Seleção"
+msgstr "Seleção Central"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "Seleção de Quadros"
+msgstr "Seleção de Frame"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
-msgstr "Visualizar Canvas Scale"
+msgstr "Pré-visualização da escala do Canvas"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
-msgstr "Máscara de Translação para inserir chaves."
+msgstr "Máscara de tradução para inserção de chaves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
-msgstr "Máscara de Rotação para inserir chaves."
+msgstr "Máscara de rotação para inserção de chaves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale mask for inserting keys."
@@ -5703,7 +5756,7 @@ msgstr "Dividir o passo da grade por 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan View"
-msgstr "Vista Panorâmica"
+msgstr "Deslocar Visão"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -5924,12 +5977,12 @@ msgid "Mesh is empty!"
msgstr "Mesh está vazia!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Criar Corpo Trimesh Estático"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Não foi possível criar uma forma de colisão Trimesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Criar Corpo Convexo Estático"
+msgid "Create Static Trimesh Body"
+msgstr "Criar Corpo Trimesh Estático"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5940,12 +5993,28 @@ msgid "Create Trimesh Static Shape"
msgstr "Criar Forma Estática Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Falha ao criar formas!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Não foi possível criar forma de colisão convexa para a cena raiz."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Não foi possível criar uma forma de colisão convexa simples."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Criar Forma(s) Convexa(s)"
+msgid "Create Single Convex Shape"
+msgstr "Criar Forma(s) Convexa(s) Simples"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "Não foi possível criar uma forma de colisão convexa para a cena raiz."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Não foi possível criar nenhuma forma de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Criar Múltiplas Forma(s) Convexa(s)"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5996,18 +6065,68 @@ msgid "Create Trimesh Static Body"
msgstr "Criar Corpo Trimesh Estático"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Criar um Staticbody e atribuir uma forma de colisão baseado em polígono para "
+"isto automaticamente.\n"
+"Esta é a opção mais precisa (mas lenta) para detecção de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Criar Colisão Trimesh Irmã"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Criar Colisão Convexa Irmã(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Criar uma forma de colisão baseada em polígono.\n"
+"Este é a opção mais precisa (mas lenta) para detecção de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Criar um irmão de Colisão Convexa"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Criar uma simples forma convexa de colisão.\n"
+"Esta é a opção mais rápida (mas menos precisa) para detecção de colisão."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Criar Múltipla Colisão Convexa Irmã(s)"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Cria um polígono base de colisão forma.\n"
+"Este é um meio-termo entre as duas opções acima."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Criar Malha de Contorno..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Cria uma malha de contorno estática. A malha de contorno pode ter suas "
+"normals viradas automaticamente.\n"
+"Isso pode ser usado em vez da propriedade SpatialMaterial Grow quando o uso "
+"dessa propriedade não for possível."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Visualizar UV1"
@@ -6730,7 +6849,7 @@ msgstr "Localizar próximo"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
-msgstr "Encontrar Anterior"
+msgstr "Localizar anterior"
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter scripts"
@@ -6859,14 +6978,6 @@ msgid "Open Godot online documentation."
msgstr "Abrir a documentação online da Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Solicitar documentos"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Ajude a melhorar a documentação do Godot dando seu feedback."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Pesquise a documentação de referência."
@@ -6930,12 +7041,12 @@ msgid ""
msgstr "Falta método conectado '%s' para sinal '%s' do nó '%s' para nó '%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Linha"
+msgid "[Ignore]"
+msgstr "(Ignore)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignore)"
+msgid "Line"
+msgstr "Linha"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7001,7 +7112,7 @@ msgstr "Recortar"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Select All"
-msgstr "Selecionar Tudo"
+msgstr "Selecionar tudo"
#: editor/plugins/script_text_editor.cpp
msgid "Delete Line"
@@ -7301,6 +7412,10 @@ msgid "This operation requires a single selected node."
msgstr "Essa operação requer um único nó selecionado."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Auto-Ortogonal Habilitado"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Bloquear Rotação da Visão"
@@ -7358,27 +7473,27 @@ msgstr "Não disponível ao usar o renderizador GLES2."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr "Visão Livre Esquerda"
+msgstr "Visão Livre na Esquerda"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr "Visão Livre Direita"
+msgstr "Visão Livre na Direita"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "Visão Livre Frente"
+msgstr "Visão Livre na Frente"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Visão Livre Trás"
+msgstr "Visão Livre Atrás"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "Visão Livre Cima"
+msgstr "Visão Livre em Cima"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "Visão Livre Baixo"
+msgstr "Visão Livre Embaixo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
@@ -7389,6 +7504,10 @@ msgid "Freelook Slow Modifier"
msgstr "Modificador de velocidade lenta da Visão Livre"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Ver Rotação Bloqueada"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7397,14 +7516,25 @@ msgstr ""
"Ele não deve ser usado como indicação confiável de desempenho do jogo."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Ver Rotação Bloqueada"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Diálogo XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Clique para alternar entre estados de visibilidade.\n"
+"\n"
+"Olhos abertos: Gizmo está visível.\n"
+"Olhos fechados: Gizmo não está visível.\n"
+"Olhos semi-abertos: Gizmo está visível através de superficies opacas (\"raio-"
+"x\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Encaixar Nó(s) no Chão"
@@ -7428,7 +7558,7 @@ msgstr "Usar Espaço Local"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "Usar Snap"
+msgstr "Use Encaixar"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7460,7 +7590,7 @@ msgstr "Alternar Visão Perspectiva/Ortogonal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
-msgstr "Inserir Chanve de Animação"
+msgstr "Inserir Chave de Animação"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
@@ -7618,7 +7748,7 @@ msgstr "Visualizar Polígono De Colisão 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D"
-msgstr "Criar LightOccluder2D"
+msgstr "Criar Polígono de Oclusão (LightOccluder2D)"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "LightOccluder2D Preview"
@@ -7659,7 +7789,7 @@ msgstr "Criar PolígonoDeColisão2D Irmão"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
-msgstr "Geometria inválida, não é possível criar oclusor de luz."
+msgstr "Geometria inválida, não é possível criar o oclusor de luz."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D Sibling"
@@ -7742,7 +7872,8 @@ msgid "New Animation"
msgstr "Nova animação"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Velocidade (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8074,11 +8205,11 @@ msgstr "Pegar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
-msgstr "Girar à esquerda"
+msgstr "Girar à Esquerda"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Right"
-msgstr "Girar à direita"
+msgstr "Girar à Direita"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
@@ -8290,9 +8421,9 @@ msgid ""
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
msgstr ""
-"LMB: ligar bit.\n"
-"RMB: desligar bit.\n"
-"Shift+LMB: Escolher bit wildcard.\n"
+"LMB: Ligar bit.\n"
+"RMB: Desligar bit.\n"
+"Shift+LMB: Escolher bit curinga.\n"
"Clique em outro Mosaico para editá-lo."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -8417,7 +8548,7 @@ msgstr "Conjunto de Telha"
msgid "No VCS addons are available."
msgstr "Nenhum complemento VCS está disponível."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Erro"
@@ -8427,7 +8558,7 @@ msgstr "Nenhuma mensagem de confirmação foi fornecida"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr "Nenhum arquivo adicionado ao palco"
+msgstr "Nenhum arquivo em espera"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit"
@@ -8435,11 +8566,11 @@ msgstr "Confirmação"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "VCS Addon is not initialized"
-msgstr "Extensão VCS não inicializado"
+msgstr "VCS Addon não inicializado"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control System"
-msgstr "Sistema de Controle de Versionamento"
+msgstr "Sistema de Controle de Versão"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Initialize"
@@ -8447,7 +8578,7 @@ msgstr "Inicializar"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
-msgstr "Área Temporária"
+msgstr "Área de espera"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect new changes"
@@ -8471,7 +8602,7 @@ msgstr "Excluído"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Typechange"
-msgstr "Alterar tipo"
+msgstr "Alteração de tipo"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage Selected"
@@ -8483,11 +8614,11 @@ msgstr "Salvar Tudo"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
-msgstr "Adicione uma mensagem de confirmação"
+msgstr "Adicione uma mensagem ao commit"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit Changes"
-msgstr "Confirmar Mudanças de Script"
+msgstr "Confirmar Mudanças"
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
@@ -8685,7 +8816,7 @@ msgstr "Cor constante."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color uniform."
-msgstr "Cor uniforme."
+msgstr "Uniformidade de cor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
@@ -8801,7 +8932,7 @@ msgstr "Parâmetro de entrada '%s' para o modo de sombra do vértice."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr ""
-"Parâmetro de entrada '%s' para os modos de sombra de vértice e fragmentada."
+"Parâmetro de entrada '%s' para os modo de sombra fragmentada e vértice."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar function."
@@ -8898,11 +9029,11 @@ msgstr "Converte um valor em radianos para graus."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
-msgstr "Exponencial de Base e."
+msgstr "Exponencial de base e."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 Exponential."
-msgstr "Exponencial na base 2."
+msgstr "Exponencial de base 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
@@ -8910,7 +9041,7 @@ msgstr "Encontra o inteiro mais próximo que é menor ou igual ao parâmetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr "Calcula a parte decimal do argumento."
+msgstr "Calcula a parte fracional do argumento."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
@@ -8922,7 +9053,7 @@ msgstr "Logaritmo natural."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr "Logaritmo de base-2."
+msgstr "Logaritmo de base 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
@@ -8963,7 +9094,7 @@ msgstr "Encontra o inteiro mais próximo do parâmetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr "Encontra o inteiro par mais próximo do parâmetro."
+msgstr "Encontra o número inteiro par mais próximo do parâmetro."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
@@ -9055,7 +9186,7 @@ msgstr "Execute a pesquisa de textura cúbica."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr "Faz uma busca de texturas."
+msgstr "Faz uma busca por texturas."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Cubic texture uniform lookup."
@@ -9071,7 +9202,7 @@ msgstr "Consulta de textura 2D uniforme com triplanar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform function."
-msgstr "Função Transform."
+msgstr "Função Transformação..."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9093,7 +9224,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr "Compõe transformação a partir de quatro vetores."
+msgstr "Compõe a transformação de quatro vetores."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
@@ -9101,19 +9232,19 @@ msgstr "Decompõe transformação em quatro vetores."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr "Calcula o determinante de uma transformada."
+msgstr "Calcula o determinante de uma transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr "Calcula a inversa de uma transformada."
+msgstr "Calcula a inversa de uma transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr "Calcula a transposta de uma transformada."
+msgstr "Calcula a transposta de uma transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr "Multiplica a transformação por transformação."
+msgstr "Multiplica transformação por transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
@@ -9121,11 +9252,11 @@ msgstr "Multiplica vetor por transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform constant."
-msgstr "Constante da transformada."
+msgstr "Transformar constante."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform uniform."
-msgstr "Transformada uniforme."
+msgstr "Transformação uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector function."
@@ -9274,11 +9405,11 @@ msgstr "Subtrai vetor de vetor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
-msgstr "Vetor constante."
+msgstr "Constante vetorial."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector uniform."
-msgstr "Vector uniforme."
+msgstr "Uniformidade vetorial."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9296,8 +9427,8 @@ msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
-"Retorna falloff baseado no produto escalar do normal da superfície e da "
-"direção de visualização da câmera (passe entradas associadas a ela)."
+"Retorna decaimento com base no produto escalar da normal da superfície com a "
+"direção de visão da câmera (passe as entradas associadas a ele)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9324,7 +9455,7 @@ msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(Apenas modo Fragmento/Luz) (Vetor) Derivada em 'x' usando diferenciação "
+"(Apenas modo Fragmento/Luz) (Vetor) Derivativo em 'x' usando diferenciação "
"local."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9583,24 +9714,28 @@ msgid "Export With Debug"
msgstr "Exportar Com Depuração"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "O caminho não existe."
+msgid "The path specified doesn't exist."
+msgstr "O caminho especificado não existe."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr ""
-"Projeto '.zip' inválido, o projeto não contém um arquivo 'project.godot'."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Erro ao abrir arquivo compactado (não está em formato ZIP)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "Projeto '.zip' inválido; não contém um arquivo 'project.godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Por favor, escolha uma pasta vazia."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Por favor, escolha um arquivo 'project.godot' ou '.zip'."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Por favor, escolha um arquivo 'project.godot' ou arquivo '.zip'."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr "O diretório já contém um projeto Godot."
#: editor/project_manager.cpp
@@ -9739,7 +9874,7 @@ msgstr "Projeto ausente"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr "Erro: O Projeto está ausente no sistema de arquivos."
+msgstr "Erro: Projeto não encontrado no sistema de arquivos."
#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
@@ -9761,14 +9896,15 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
-"O seguinte arquivo de configurações do projeto não especifica com qual "
-"versão do Godot ele foi criado.\n"
+"O seguinte arquivo de configurações do projeto não especifica a versão do "
+"Godot pelo qual ele foi criado.\n"
"\n"
"%s\n"
"\n"
-"Se escolher abrí-lo, será convertido para o formato atual de arquivo de "
-"configuração do Godot\n"
-"Aviso: Você não poderá mais abrir o projeto com versões anteriores do Godot."
+"Se você o abrir, ele será convertido para o formato de arquivo da "
+"configuração atual do Godot.\n"
+"Atenção: Você não será mais capaz de abrir o projeto com versões anteriores "
+"da engine."
#: editor/project_manager.cpp
msgid ""
@@ -9862,6 +9998,7 @@ msgstr ""
"existentes?\n"
"Isso pode levar algum tempo."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Gerenciador de Projetos"
@@ -9888,7 +10025,7 @@ msgstr "Novo Projeto"
#: editor/project_manager.cpp
msgid "Remove Missing"
-msgstr "Remover Ausentes"
+msgstr "Remover Ausente"
#: editor/project_manager.cpp
msgid "Templates"
@@ -9910,6 +10047,17 @@ msgstr ""
"Você não tem nenhum projeto no momento.\n"
"Gostaria de explorar projetos de exemplo oficiais na Asset Library?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"A caixa de busca filtra projetos por nome e pelo último componente do "
+"caminho.\n"
+"Para filtrar projetos por nome e pelo caminho completo, a consulta deve "
+"conter pelo menos um caractere `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Chave "
@@ -10040,7 +10188,7 @@ msgstr "Botão Direito."
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr "Botão do Meio."
+msgstr "Botão do Meio."
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
@@ -10208,11 +10356,11 @@ msgstr "Filtro de Idiomas"
#: editor/project_settings_editor.cpp
msgid "Show All Locales"
-msgstr "Mostrar todos os idiomas"
+msgstr "Mostrar todos os Locales"
#: editor/project_settings_editor.cpp
msgid "Show Selected Locales Only"
-msgstr "Mostrar apenas os idiomas selecionados"
+msgstr "Mostrar apenas os Locales selecionados"
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
@@ -10224,7 +10372,7 @@ msgstr "Idiomas:"
#: editor/project_settings_editor.cpp
msgid "AutoLoad"
-msgstr "Carregamento Automático"
+msgstr "O AutoLoad"
#: editor/project_settings_editor.cpp
msgid "Plugins"
@@ -10291,14 +10439,25 @@ msgid "Batch Rename"
msgstr "Renomear em lote"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Substituir: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Prefixo"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Sufixo"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Utilize Expressões Regulares"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Opções Avançadas"
@@ -10335,11 +10494,12 @@ msgstr ""
"Compare as opções do contador."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Contador de nível"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "Se definido, o contador será reiniciado para cada grupo de nós filhos"
#: editor/rename_dialog.cpp
@@ -10367,10 +10527,6 @@ msgstr ""
"Os dígitos ausentes são preenchidos com zeros à esquerda."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Expressões regulares"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Pós-Processamento"
@@ -10379,12 +10535,12 @@ msgid "Keep"
msgstr "Manter"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase para under_scored"
+msgid "PascalCase to snake_case"
+msgstr "PascalCase para snake_case"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored para CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "snake_case para PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10402,6 +10558,15 @@ msgstr "Para Maiúscula"
msgid "Reset"
msgstr "Recompor"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Erro de Expressão Regular"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "Para caractere %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Reparentar Nó"
@@ -10460,14 +10625,14 @@ msgstr "Instanciar Cena(s)"
#: editor/scene_tree_dock.cpp
msgid "Replace with Branch Scene"
-msgstr "Substituir com Ramo como Cena"
+msgstr "Substituir por cena ramo"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
msgstr "Instânciar Cena Filha"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr "Remover Script"
#: editor/scene_tree_dock.cpp
@@ -10505,6 +10670,10 @@ msgid "Make node as Root"
msgstr "Tornar Raiz o Nó"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Deletar nó \"%d\" e seus filhos?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Excluir %d nós?"
@@ -10633,12 +10802,22 @@ msgid "Open Documentation"
msgstr "Abrir Documentação"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Não pode associar um script: Não existem linguagens registradas.\n"
+"É provável que o editor tenha sido construido com todos os módulos de "
+"linguagem desabilitados."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Adicionar Nó Filho"
#: editor/scene_tree_dock.cpp
msgid "Expand/Collapse All"
-msgstr "Expandir/Colapsar Tudo"
+msgstr "Expandir/Recolher Tudo"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
@@ -10681,12 +10860,12 @@ msgstr ""
"existir um nó raiz."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Adicionar um script novo ou existente para o nó selecionado."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Adicionar um novo script, ou um já existente, para o nó selecionado."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Remove um script do nó selecionado."
+msgid "Detach the script from the selected node."
+msgstr "Remove o script do nó selecionado."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10798,7 +10977,7 @@ msgstr "Selecione um Nó"
#: editor/script_create_dialog.cpp
msgid "Path is empty."
-msgstr "O caminho está vazio."
+msgstr "Caminho vazio."
#: editor/script_create_dialog.cpp
msgid "Filename is empty."
@@ -10817,6 +10996,10 @@ msgid "A directory with the same name exists."
msgstr "Existe um diretório com o mesmo nome."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "O arquivo não existe."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Extensão inválida."
@@ -10857,6 +11040,10 @@ msgid "File exists, it will be reused."
msgstr "O arquivo existe, será reaproveitado."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Caminho inválido."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Nome da classe inválido."
@@ -10865,8 +11052,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Nome ou caminho do pai herdado inválido."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Script válido."
+msgid "Script path/name is valid."
+msgstr "O caminho/nome do script é válido."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10889,6 +11076,14 @@ msgid "Script file already exists."
msgstr "O arquivo de script já existe."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Nota: Scripts embutidos possuem algumas limitações e não podem ser editados "
+"usando um editor externo."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Nome da Classe:"
@@ -10957,6 +11152,10 @@ msgid "Copy Error"
msgstr "Copiar Erro"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Memória de Vídeo"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Pular Breakpoints"
@@ -11005,8 +11204,8 @@ msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Mem. de Vídeo"
+msgid "Export list to a CSV file"
+msgstr "Exportar lista para arquivo CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11186,7 +11385,7 @@ msgstr "Singleton GDNative ativado"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Disabled GDNative Singleton"
-msgstr "Singleton GDNative Desabilitado"
+msgstr "GDNative Singleton desativado"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
@@ -11447,8 +11646,8 @@ msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
msgstr ""
-"Nó entrou em yield, mas não retornou um estado de função na primeira memória "
-"de trabalho."
+"O nó cedeu, mas não retornou um estado de função na primeira memória de "
+"trabalho."
#: modules/visual_script/visual_script.cpp
msgid ""
@@ -11750,7 +11949,7 @@ msgstr "function_name"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
-msgstr "Selecione ou crie uma função para editar o grafo."
+msgstr "Selecione ou crie uma função para editar seu gráfico."
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
@@ -11762,11 +11961,11 @@ msgstr "Localizar Tipo de Nó"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr "Copiar Nodes"
+msgstr "Copiar Nós"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr "Recortar Nodes"
+msgstr "Recortar Nós"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Function"
@@ -11798,7 +11997,7 @@ msgstr "Nome da propriedade de índice inválido."
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
-msgstr "Objeto base não é um nó!"
+msgstr "Objeto base não é um Nó!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Path does not lead Node!"
@@ -11896,16 +12095,22 @@ msgstr ""
"na predefinição."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Keystore de liberação incorretamente configurada na predefinição de "
+"exportação."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
-"Compilação personalizada requer um caminho do Android SDK válido para as "
+"Build personalizada precisa de um caminho Android SDK válido em "
"Configurações do Editor."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
msgstr ""
-"Caminho SDK do Android inválido para a compilação personalizada nas "
-"Configurações do Editor."
+"Caminho do Android SDK inválido para o build personalizado em Configurações "
+"do Editor."
#: platform/android/export/export.cpp
msgid ""
@@ -11917,7 +12122,7 @@ msgstr ""
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr "Chave pública inválida para expansão de APK."
+msgstr "Chave pública inválida para expansão do APK."
#: platform/android/export/export.cpp
msgid "Invalid package name:"
@@ -11925,11 +12130,45 @@ msgstr "Nome de pacote inválido:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Módulo inválido \"GodotPaymentV3\" incluido na configuração de projeto "
+"\"android/modules\" (changed in Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+"\"Use Custom Build\" precisa estar ativo para ser possível utilizar plugins."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"\"Degrees Of Freedom\" só é válido quando o \"Xr Mode\" é \"Oculus Mobile VR"
+"\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Hand Tracking\" só é válido quando o \"Xr Mode\" é \"Oculus Mobile VR\"."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"\"Focus Awareness\" só é válido quando o \"Oculus Mobile VR\" está no \"Xr "
+"Mode\"."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
-"Tentando compilar a partir de um modelo compilado personalizado, mas nenhuma "
-"informação de versão para ele existe. Por favor, reinstale pelo menu "
+"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'."
#: platform/android/export/export.cpp
@@ -11939,7 +12178,7 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
-"Diferença de versão da compilação do Android:\n"
+"Diferença na versão da build do Android:\n"
" Modelo instalado: %s\n"
" Versão do Godot: %s\n"
"Por favor reinstale o modelo de compilação do Android pelo menu 'Projeto'."
@@ -11953,13 +12192,13 @@ msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
-"A compilação do projeto Android falhou, verifique a saída pelo erro.\n"
+"A construção do projeto Android falhou, verifique a saída para detalhes.\n"
"Alternativamente, visite docs.godotengine.org para ver a documentação de "
"compilação do Android."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr "Nenhuma compilação apk gerada em: "
+msgstr "Nenhuma construção apk gerada em: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
@@ -12130,6 +12369,14 @@ msgstr ""
"Uma forma deve ser fornecida para que o nó CollisionShape2D funcione. Por "
"favor, crie um recurso de forma para ele!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Formas baseadas em polígonos não foram feitas para serem diretamente "
+"editadas no nó CollisionShape2D. Em vez disso use o nó CollisionPolygon2D."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12367,6 +12614,12 @@ msgstr ""
"Formas planas não funcionam bem e serão removidas em versões futuras. Por "
"favor não as use."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape não suporta um RigidBody em outro modo além do estático."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Nada é visível porque nenhuma malha foi atribuída."
@@ -12391,6 +12644,11 @@ msgstr ""
"GIProbes não são suportados pelo driver de vídeo GLES2.\n"
"Use um BakedLightmap em vez disso."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr "Um SpotLight com um ângulo maior que 90 graus não pode criar sombras."
@@ -12538,7 +12796,7 @@ msgstr "Nada está ligado à entrada '%s' do nó '%s'."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
-msgstr "Um AnimationNode raiz para o gráfico não está definido."
+msgstr "Nenhuma raiz AnimationNode para o gráfico está definida."
#: scene/animation/animation_tree.cpp
msgid "Path to an AnimationPlayer node containing animations is not set."
@@ -12604,9 +12862,9 @@ msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
-"A Dica não será exibida quando o controle de Filtro do Mouse estiver "
-"definido como \"Ignorar\". Para resolver, defina o Filtro do Mouse como "
-"\"Parar\" ou \"Continuar\"."
+"A Sugestão de Dica não será exibida quando o Filtro do Mouse do controle "
+"estiver definido como \"Ignorar\". Para resolver isto, defina o Filtro do "
+"Mouse como \"Parar\" ou \"Passar\"."
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -12637,8 +12895,8 @@ msgid ""
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
-"Um ScrollContainer foi feito para trabalhar com um componente filho único.\n"
-"Use um container como filho (VBox, HBox, etc.) ou um Control e defina o "
+"Um ScrollContainer foi feito para trabalhar com um único componente filho.\n"
+"Use um contêiner como filho (VBox, HBox, etc.) ou um Control e defina o "
"tamanho mínimo manualmente."
#: scene/gui/tree.cpp
@@ -12651,7 +12909,7 @@ msgid ""
"Environment -> Default Environment) could not be loaded."
msgstr ""
"O Ambiente Padrão especificado nas Configurações de Projeto (Rendering -> "
-"Environment -> Default Environment) não pôde ser carregado."
+"Environment -> Default Environment) não pôde ser carregado."
#: scene/main/viewport.cpp
msgid ""
@@ -12665,6 +12923,11 @@ msgstr ""
"para que ele possa ter um tamanho. Caso contrário, defina-o como destino de "
"render e atribua sua textura interna a algum nó para exibir."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"O tamanho da Viewport deve ser maior do que 0 para renderizar qualquer coisa."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Fonte inválida para a prévia."
@@ -12693,6 +12956,52 @@ msgstr "Variáveis só podem ser atribuídas na função de vértice."
msgid "Constants cannot be modified."
msgstr "Constantes não podem serem modificadas."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Sistema de Arquivos e Importar Docks"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Quando exportando ou instalando, o programa resultante tentará conectar "
+#~ "ao IP deste computador para poder ser depurado."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "A cena atual nunca foi salva. Por favor salve antes de rodá-la."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Não está no caminho de recursos."
+
+#~ msgid "Revert"
+#~ msgstr "Reverter"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Esta ação não pode ser desfeita. Reverter mesmo assim?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Reverter Cena"
+
+#~ msgid "Clear Script"
+#~ msgstr "Remover Script"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Rastreador de Problemas"
+
+#~ msgid "Request Docs"
+#~ msgstr "Solicitar documentos"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Ajude a melhorar a documentação do Godot dando seu feedback."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d ocorrência(s) substituída(s)."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Criar Corpo Convexo Estático"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Falha ao criar formas!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
deleted file mode 100644
index d293860dec..0000000000
--- a/editor/translations/pt_PT.po
+++ /dev/null
@@ -1,13673 +0,0 @@
-# Portuguese (Portugal) translation of the Godot Engine editor
-# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
-# This file is distributed under the same license as the Godot source code.
-# António Sarmento <antonio.luis.sarmento@gmail.com>, 2016.
-# Carlos Vieira <carlos.vieira@gmail.com>, 2017.
-# João <joao@nogordio.com>, 2018.
-# João Graça <jgraca95@gmail.com>, 2017.
-# João Lopes <linux-man@hotmail.com>, 2017-2018, 2019, 2020.
-# Miguel Gomes <miggas09@gmail.com>, 2017.
-# Paulo Caldeira <paucal@gmail.com>, 2018.
-# Pedro Gomes <pedrogomes1698@gmail.com>, 2017.
-# Rueben Stevens <supercell03@gmail.com>, 2017.
-# SARDON <fabio3_Santos@hotmail.com>, 2017.
-# Vinicius Gonçalves <viniciusgoncalves21@gmail.com>, 2017.
-# ssantos <ssantos@web.de>, 2018, 2019.
-# Gonçalo Dinis Guerreiro João <goncalojoao205@gmail.com>, 2019.
-msgid ""
-msgstr ""
-"Project-Id-Version: Godot Engine editor\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
-"Last-Translator: João Lopes <linux-man@hotmail.com>\n"
-"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/"
-"godot-engine/godot/pt_PT/>\n"
-"Language: pt_PT\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 3.11-dev\n"
-
-#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/visual_script/visual_script_builtin_funcs.cpp
-msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Tipo de argumento inválido para convert(), use constantes TYPE_*."
-
-#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-msgid "Expected a string of length 1 (a character)."
-msgstr "Esperado um string de comprimento 1 (um caráter)."
-
-#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/gd_glue.cpp
-#: modules/visual_script/visual_script_builtin_funcs.cpp
-msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
-"Número de bytes insuficientes para descodificar, ou o formato é inválido."
-
-#: core/math/expression.cpp
-msgid "Invalid input %i (not passed) in expression"
-msgstr "Entrada inválida %i (não passada) na expressão"
-
-#: core/math/expression.cpp
-msgid "self can't be used because instance is null (not passed)"
-msgstr "self não pode ser usado porque a instância é nula (não passada)"
-
-#: core/math/expression.cpp
-msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Operandos inválidos para operador %s, %s e %s."
-
-#: core/math/expression.cpp
-msgid "Invalid index of type %s for base type %s"
-msgstr "Índice inválido do tipo %s para tipo base %s"
-
-#: core/math/expression.cpp
-msgid "Invalid named index '%s' for base type %s"
-msgstr "Índice nomeado '%s' inválido para base tipo %s"
-
-#: core/math/expression.cpp
-msgid "Invalid arguments to construct '%s'"
-msgstr "Argumentos inválidos para construir '%s'"
-
-#: core/math/expression.cpp
-msgid "On call to '%s':"
-msgstr "Em chamada para '%s':"
-
-#: core/ustring.cpp
-msgid "B"
-msgstr "B"
-
-#: core/ustring.cpp
-msgid "KiB"
-msgstr "KiB"
-
-#: core/ustring.cpp
-msgid "MiB"
-msgstr "MiB"
-
-#: core/ustring.cpp
-msgid "GiB"
-msgstr "GiB"
-
-#: core/ustring.cpp
-msgid "TiB"
-msgstr "TiB"
-
-#: core/ustring.cpp
-msgid "PiB"
-msgstr "PiB"
-
-#: core/ustring.cpp
-msgid "EiB"
-msgstr "EiB"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Free"
-msgstr "Livre"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Balanced"
-msgstr "Equilibrado"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Mirror"
-msgstr "Espelho"
-
-#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
-msgid "Time:"
-msgstr "Tempo:"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Value:"
-msgstr "Valor:"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Insert Key Here"
-msgstr "Inserir Chave Aqui"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Duplicate Selected Key(s)"
-msgstr "Duplicar Chave(s) Selecionada(s)"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Delete Selected Key(s)"
-msgstr "Apagar Chave(s) Selecionada(s)"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Add Bezier Point"
-msgstr "Adicionar Ponto Bezier"
-
-#: editor/animation_bezier_editor.cpp
-msgid "Move Bezier Points"
-msgstr "Mover Ponto Bezier"
-
-#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-msgid "Anim Duplicate Keys"
-msgstr "Anim Duplicar Chaves"
-
-#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-msgid "Anim Delete Keys"
-msgstr "Anim Eliminar Chaves"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Keyframe Time"
-msgstr "Anim Mudar Tempo do Keyframe"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Transition"
-msgstr "Anim Mudar Transição"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Transform"
-msgstr "Anim Mudar Transformação"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Keyframe Value"
-msgstr "Anim Mudar Valor do Keyframe"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Change Call"
-msgstr "Anim Mudar Chamada"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Keyframe Time"
-msgstr "Anim Multi Mudar Tempo do Keyframe"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Transition"
-msgstr "Anim Multi Mudar Transição"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Transform"
-msgstr "Anim Multi Mudar Transformação"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Keyframe Value"
-msgstr "Anim Multi Mudar Valor do Keyframe"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Multi Change Call"
-msgstr "Anim Multi Mudar Chamada"
-
-#: editor/animation_track_editor.cpp
-msgid "Change Animation Length"
-msgstr "Mudar Duração da Animação"
-
-#: editor/animation_track_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Change Animation Loop"
-msgstr "Mudar Ciclo da Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Property Track"
-msgstr "Pista de Propriedades"
-
-#: editor/animation_track_editor.cpp
-msgid "3D Transform Track"
-msgstr "Pista de Transformação 3D"
-
-#: editor/animation_track_editor.cpp
-msgid "Call Method Track"
-msgstr "Chamar Pista Método"
-
-#: editor/animation_track_editor.cpp
-msgid "Bezier Curve Track"
-msgstr "Pista Curva Bezier"
-
-#: editor/animation_track_editor.cpp
-msgid "Audio Playback Track"
-msgstr "Pista de Reprodução de Áudio"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation Playback Track"
-msgstr "Pista de Reprodução de Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation length (frames)"
-msgstr "Duração da Animação (frames)"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation length (seconds)"
-msgstr "Duração da Animação (segundos)"
-
-#: editor/animation_track_editor.cpp
-msgid "Add Track"
-msgstr "Adicionar Pista"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation Looping"
-msgstr "Loop da Animação"
-
-#: editor/animation_track_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Functions:"
-msgstr "Funções:"
-
-#: editor/animation_track_editor.cpp
-msgid "Audio Clips:"
-msgstr "Clips Áudio:"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Clips:"
-msgstr "Clips Anim:"
-
-#: editor/animation_track_editor.cpp
-msgid "Change Track Path"
-msgstr "Mudar Caminho da Pista"
-
-#: editor/animation_track_editor.cpp
-msgid "Toggle this track on/off."
-msgstr "Alternar esta pista on/off."
-
-#: editor/animation_track_editor.cpp
-msgid "Update Mode (How this property is set)"
-msgstr "Modo Atualização (Como esta propriedade é definida)"
-
-#: editor/animation_track_editor.cpp
-msgid "Interpolation Mode"
-msgstr "Modo de Interpolação"
-
-#: editor/animation_track_editor.cpp
-msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr "Modo Loop Wrap (interpola o fim com o início do loop)"
-
-#: editor/animation_track_editor.cpp
-msgid "Remove this track."
-msgstr "Remover esta Pista."
-
-#: editor/animation_track_editor.cpp
-msgid "Time (s): "
-msgstr "Tempo (s): "
-
-#: editor/animation_track_editor.cpp
-msgid "Toggle Track Enabled"
-msgstr "Alternar Pista Ativada"
-
-#: editor/animation_track_editor.cpp
-msgid "Continuous"
-msgstr "Contínuo"
-
-#: editor/animation_track_editor.cpp
-msgid "Discrete"
-msgstr "Discreto"
-
-#: editor/animation_track_editor.cpp
-msgid "Trigger"
-msgstr "Gatilho"
-
-#: editor/animation_track_editor.cpp
-msgid "Capture"
-msgstr "Capturar"
-
-#: editor/animation_track_editor.cpp
-msgid "Nearest"
-msgstr "Mais próximo"
-
-#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
-#: editor/property_editor.cpp
-msgid "Linear"
-msgstr "Linear"
-
-#: editor/animation_track_editor.cpp
-msgid "Cubic"
-msgstr "Cúbico"
-
-#: editor/animation_track_editor.cpp
-msgid "Clamp Loop Interp"
-msgstr "Prender Interp Loop"
-
-#: editor/animation_track_editor.cpp
-msgid "Wrap Loop Interp"
-msgstr "Enrolar Interp Loop"
-
-#: editor/animation_track_editor.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Insert Key"
-msgstr "Inserir Chave"
-
-#: editor/animation_track_editor.cpp
-msgid "Duplicate Key(s)"
-msgstr "Duplicar Chave(s)"
-
-#: editor/animation_track_editor.cpp
-msgid "Delete Key(s)"
-msgstr "Apagar Chave(s)"
-
-#: editor/animation_track_editor.cpp
-msgid "Change Animation Update Mode"
-msgstr "Mudar o Modo de Atualização da Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Change Animation Interpolation Mode"
-msgstr "Mudar o Modo de Interpolação da Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Change Animation Loop Mode"
-msgstr "Mudar Modo do Loop da Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Remove Anim Track"
-msgstr "Remover Pista de Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Create NEW track for %s and insert key?"
-msgstr "Criar NOVA pista para %s e inserir chave?"
-
-#: editor/animation_track_editor.cpp
-msgid "Create %d NEW tracks and insert keys?"
-msgstr "Criar %d NOVAS pistas e inserir chaves?"
-
-#: editor/animation_track_editor.cpp editor/create_dialog.cpp
-#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#: editor/script_create_dialog.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Create"
-msgstr "Criar"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Insert"
-msgstr "Anim Inserir"
-
-#: editor/animation_track_editor.cpp
-msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
-"AnimationPlayer não se pode animar a ele próprio, apenas a outros "
-"executantes."
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Create & Insert"
-msgstr "Anim Criar & Inserir"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Insert Track & Key"
-msgstr "Anim Inserir Pista & Chave"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Insert Key"
-msgstr "Anim Inserir Chave"
-
-#: editor/animation_track_editor.cpp
-msgid "Change Animation Step"
-msgstr "Mudar Passo da Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Rearrange Tracks"
-msgstr "Reorganizar Pistas"
-
-#: editor/animation_track_editor.cpp
-msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr "Pistas de Transformação só se aplicam a nós de base Espacial."
-
-#: editor/animation_track_editor.cpp
-msgid ""
-"Audio tracks can only point to nodes of type:\n"
-"-AudioStreamPlayer\n"
-"-AudioStreamPlayer2D\n"
-"-AudioStreamPlayer3D"
-msgstr ""
-"Pistas Áudio só podem apontar a nós de tipo:\n"
-"-AudioStreamPlayer\n"
-"-AudioStreamPlayer2D\n"
-"-AudioStreamPlayer3D"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr "Pistas de Animação só podem apontar a nós AnimationPlayer."
-
-#: editor/animation_track_editor.cpp
-msgid "An animation player can't animate itself, only other players."
-msgstr ""
-"Um reprodutor de animação não se pode animar a ele próprio, apenas a outros "
-"reprodutores."
-
-#: editor/animation_track_editor.cpp
-msgid "Not possible to add a new track without a root"
-msgstr "Não é possível adicionar nova pista sem uma raíz"
-
-#: editor/animation_track_editor.cpp
-msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr "Faixa inválida para Bezier (sub-propriedades não apropriadas)"
-
-#: editor/animation_track_editor.cpp
-msgid "Add Bezier Track"
-msgstr "Adicionar Pista Bezier"
-
-#: editor/animation_track_editor.cpp
-msgid "Track path is invalid, so can't add a key."
-msgstr "Caminho da pista é inválido, não se consegue adicionar uma chave."
-
-#: editor/animation_track_editor.cpp
-msgid "Track is not of type Spatial, can't insert key"
-msgstr "Pista não do tipo Spatial, impossível inserir chave"
-
-#: editor/animation_track_editor.cpp
-msgid "Add Transform Track Key"
-msgstr "Adicionar Chave da Pista de Transformação"
-
-#: editor/animation_track_editor.cpp
-msgid "Add Track Key"
-msgstr "Adicionar Chave da Pista"
-
-#: editor/animation_track_editor.cpp
-msgid "Track path is invalid, so can't add a method key."
-msgstr "Caminho da pista é inválido, impossível adicionar uma chave método."
-
-#: editor/animation_track_editor.cpp
-msgid "Add Method Track Key"
-msgstr "Adicionar Chave da Pista Método"
-
-#: editor/animation_track_editor.cpp
-msgid "Method not found in object: "
-msgstr "Método não encontrado no objeto: "
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Move Keys"
-msgstr "Anim Mover Chaves"
-
-#: editor/animation_track_editor.cpp
-msgid "Clipboard is empty"
-msgstr "Área de Transferência está vazia"
-
-#: editor/animation_track_editor.cpp
-msgid "Paste Tracks"
-msgstr "Colar Pistas"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim Scale Keys"
-msgstr "Anim Escalar Chaves"
-
-#: editor/animation_track_editor.cpp
-msgid ""
-"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
-"Esta opção não funciona para edição de Bezier, dado que é uma única faixa."
-
-#: editor/animation_track_editor.cpp
-msgid ""
-"This animation belongs to an imported scene, so changes to imported tracks "
-"will not be saved.\n"
-"\n"
-"To enable the ability to add custom tracks, navigate to the scene's import "
-"settings and set\n"
-"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks"
-"\", then re-import.\n"
-"Alternatively, use an import preset that imports animations to separate "
-"files."
-msgstr ""
-"Esta animação pertence a uma cena importada; alterações não serão "
-"guardadas.\n"
-"\n"
-"Para ativar a capacidade de adicionar faixas personalizadas, vá à "
-"configuração de importação da cena e defina\n"
-"\"Animação > Armazenamento\" para \"Ficheiros\", ative \"Animação > Manter "
-"Faixas Personalizadas\"; depois reimporte.\n"
-"Em alternativa, use uma predefinição de importação que importe animações "
-"para ficheiros separados."
-
-#: editor/animation_track_editor.cpp
-msgid "Warning: Editing imported animation"
-msgstr "Aviso: A editar animação importada"
-
-#: editor/animation_track_editor.cpp
-msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr "Selecione um nó AnimationPlayer para criar e editar animações."
-
-#: editor/animation_track_editor.cpp
-msgid "Only show tracks from nodes selected in tree."
-msgstr "Apenas mostrar faixas de nós selecionados na árvore."
-
-#: editor/animation_track_editor.cpp
-msgid "Group tracks by node or display them as plain list."
-msgstr "Agrupar faixas por nó ou exibi-las como lista simples."
-
-#: editor/animation_track_editor.cpp
-msgid "Snap:"
-msgstr "Ajustar:"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation step value."
-msgstr "Valor passo da Animação."
-
-#: editor/animation_track_editor.cpp
-msgid "Seconds"
-msgstr "Segundos"
-
-#: editor/animation_track_editor.cpp
-msgid "FPS"
-msgstr "FPS"
-
-#: editor/animation_track_editor.cpp editor/editor_properties.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Edit"
-msgstr "Editar"
-
-#: editor/animation_track_editor.cpp
-msgid "Animation properties."
-msgstr "Propriedades da Animação."
-
-#: editor/animation_track_editor.cpp
-msgid "Copy Tracks"
-msgstr "Copiar Pistas"
-
-#: editor/animation_track_editor.cpp
-msgid "Scale Selection"
-msgstr "Escalar Selecção"
-
-#: editor/animation_track_editor.cpp
-msgid "Scale From Cursor"
-msgstr "Escalar Partir do Cursor"
-
-#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Duplicate Selection"
-msgstr "Duplicar Seleção"
-
-#: editor/animation_track_editor.cpp
-msgid "Duplicate Transposed"
-msgstr "Duplicar Transposto"
-
-#: editor/animation_track_editor.cpp
-msgid "Delete Selection"
-msgstr "Apagar Seleção"
-
-#: editor/animation_track_editor.cpp
-msgid "Go to Next Step"
-msgstr "Ir para Próximo Passo"
-
-#: editor/animation_track_editor.cpp
-msgid "Go to Previous Step"
-msgstr "Ir para Passo Anterior"
-
-#: editor/animation_track_editor.cpp
-msgid "Optimize Animation"
-msgstr "Otimizar Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-Up Animation"
-msgstr "Limpar Animação"
-
-#: editor/animation_track_editor.cpp
-msgid "Pick the node that will be animated:"
-msgstr "Escolha o nó que será animado:"
-
-#: editor/animation_track_editor.cpp
-msgid "Use Bezier Curves"
-msgstr "Usar Curvas Bezier"
-
-#: editor/animation_track_editor.cpp
-msgid "Anim. Optimizer"
-msgstr "Otimizador de Anim"
-
-#: editor/animation_track_editor.cpp
-msgid "Max. Linear Error:"
-msgstr "Máximo de Erros Lineares:"
-
-#: editor/animation_track_editor.cpp
-msgid "Max. Angular Error:"
-msgstr "Máximo de Erros Angulares:"
-
-#: editor/animation_track_editor.cpp
-msgid "Max Optimizable Angle:"
-msgstr "Angulo Máximo Otimizável:"
-
-#: editor/animation_track_editor.cpp
-msgid "Optimize"
-msgstr "Otimizar"
-
-#: editor/animation_track_editor.cpp
-msgid "Remove invalid keys"
-msgstr "Remover Chaves inválidas"
-
-#: editor/animation_track_editor.cpp
-msgid "Remove unresolved and empty tracks"
-msgstr "Remover Pistas vazias ou não resolvidas"
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-up all animations"
-msgstr "Limpar todas as Animações"
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr "Limpar Animação(ões) (DEFINITIVO!)"
-
-#: editor/animation_track_editor.cpp
-msgid "Clean-Up"
-msgstr "Limpar"
-
-#: editor/animation_track_editor.cpp
-msgid "Scale Ratio:"
-msgstr "Proporção de Escala:"
-
-#: editor/animation_track_editor.cpp
-msgid "Select Tracks to Copy"
-msgstr "Selecionar Pistas a Copiar"
-
-#: editor/animation_track_editor.cpp editor/editor_log.cpp
-#: editor/editor_properties.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Copy"
-msgstr "Copiar"
-
-#: editor/animation_track_editor.cpp
-msgid "Select All/None"
-msgstr "Selecionar Tudo/Nada"
-
-#: editor/animation_track_editor_plugins.cpp
-msgid "Add Audio Track Clip"
-msgstr "Adicionar Clip da Pista Áudio"
-
-#: editor/animation_track_editor_plugins.cpp
-msgid "Change Audio Track Clip Start Offset"
-msgstr "Alterar Compensação do Início do Clip da Pista Áudio"
-
-#: editor/animation_track_editor_plugins.cpp
-msgid "Change Audio Track Clip End Offset"
-msgstr "Alterar Compensação do Fim do Clip da Pista Áudio"
-
-#: editor/array_property_edit.cpp
-msgid "Resize Array"
-msgstr "Redimensionar Array"
-
-#: editor/array_property_edit.cpp
-msgid "Change Array Value Type"
-msgstr "Mudar tipo de valor do Array"
-
-#: editor/array_property_edit.cpp
-msgid "Change Array Value"
-msgstr "Mudar valor do Array"
-
-#: editor/code_editor.cpp
-msgid "Go to Line"
-msgstr "Vai para linha"
-
-#: editor/code_editor.cpp
-msgid "Line Number:"
-msgstr "Numero da linha:"
-
-#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Substituído %d ocorrência(s)."
-
-#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "%d match."
-msgstr "%d correspondência."
-
-#: editor/code_editor.cpp editor/editor_help.cpp
-msgid "%d matches."
-msgstr "%d correspondências."
-
-#: editor/code_editor.cpp editor/find_in_files.cpp
-msgid "Match Case"
-msgstr "Caso de Compatibilidade"
-
-#: editor/code_editor.cpp editor/find_in_files.cpp
-msgid "Whole Words"
-msgstr "Palavras inteiras"
-
-#: editor/code_editor.cpp editor/rename_dialog.cpp
-msgid "Replace"
-msgstr "Substituir"
-
-#: editor/code_editor.cpp
-msgid "Replace All"
-msgstr "Substituir todos"
-
-#: editor/code_editor.cpp
-msgid "Selection Only"
-msgstr "Apenas seleção"
-
-#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
-#: editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr "Padrão"
-
-#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Toggle Scripts Panel"
-msgstr "Alternar painel de Scripts"
-
-#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-msgid "Zoom In"
-msgstr "Aumentar Zoom"
-
-#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-msgid "Zoom Out"
-msgstr "Diminuir Zoom"
-
-#: editor/code_editor.cpp
-msgid "Reset Zoom"
-msgstr "Repor Zoom"
-
-#: editor/code_editor.cpp
-msgid "Warnings"
-msgstr "Avisos"
-
-#: editor/code_editor.cpp
-msgid "Line and column numbers."
-msgstr "Números de Linha e Coluna."
-
-#: editor/connections_dialog.cpp
-msgid "Method in target node must be specified."
-msgstr "Método no Nó alvo deve ser especificado."
-
-#: editor/connections_dialog.cpp
-msgid ""
-"Target method not found. Specify a valid method or attach a script to the "
-"target node."
-msgstr ""
-"Método alvo não encontrado. Especifique um método válido ou anexe um script "
-"ao Nó de destino."
-
-#: editor/connections_dialog.cpp
-msgid "Connect to Node:"
-msgstr "Conectar ao Nó:"
-
-#: editor/connections_dialog.cpp
-msgid "Connect to Script:"
-msgstr "Conectar ao Script:"
-
-#: editor/connections_dialog.cpp
-msgid "From Signal:"
-msgstr "Do Sinal:"
-
-#: editor/connections_dialog.cpp
-msgid "Scene does not contain any script."
-msgstr "A Cena não contém qualquer script."
-
-#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
-#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-msgid "Add"
-msgstr "Adicionar"
-
-#: editor/connections_dialog.cpp editor/dependency_editor.cpp
-#: editor/editor_feature_profile.cpp editor/groups_editor.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp
-msgid "Remove"
-msgstr "Remover"
-
-#: editor/connections_dialog.cpp
-msgid "Add Extra Call Argument:"
-msgstr "Adicionar Argumento de chamada extra:"
-
-#: editor/connections_dialog.cpp
-msgid "Extra Call Arguments:"
-msgstr "Argumentos de chamada extra:"
-
-#: editor/connections_dialog.cpp
-msgid "Receiver Method:"
-msgstr "Método Recetor:"
-
-#: editor/connections_dialog.cpp
-msgid "Advanced"
-msgstr "Avançado"
-
-#: editor/connections_dialog.cpp
-msgid "Deferred"
-msgstr "Deferido"
-
-#: editor/connections_dialog.cpp
-msgid ""
-"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr ""
-"Retarda o sinal, armazena-o numa fila e só ativando-o em tempo de "
-"inatividade."
-
-#: editor/connections_dialog.cpp
-msgid "Oneshot"
-msgstr "Oneshot"
-
-#: editor/connections_dialog.cpp
-msgid "Disconnects the signal after its first emission."
-msgstr "Desconecta o sinal após a primeira emissão."
-
-#: editor/connections_dialog.cpp
-msgid "Cannot connect signal"
-msgstr "Impossível conectar sinal"
-
-#: editor/connections_dialog.cpp editor/dependency_editor.cpp
-#: editor/export_template_manager.cpp editor/groups_editor.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#: editor/plugins/version_control_editor_plugin.cpp editor/project_export.cpp
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Close"
-msgstr "Fechar"
-
-#: editor/connections_dialog.cpp
-msgid "Connect"
-msgstr "Ligar"
-
-#: editor/connections_dialog.cpp
-msgid "Signal:"
-msgstr "Sinal:"
-
-#: editor/connections_dialog.cpp
-msgid "Connect '%s' to '%s'"
-msgstr "Ligar '%s' a '%s'"
-
-#: editor/connections_dialog.cpp
-msgid "Disconnect '%s' from '%s'"
-msgstr "Desligar '%s' de '%s'"
-
-#: editor/connections_dialog.cpp
-msgid "Disconnect all from signal: '%s'"
-msgstr "Desconectar tudo do sinal: '%s'"
-
-#: editor/connections_dialog.cpp
-msgid "Connect..."
-msgstr "Ligar..."
-
-#: editor/connections_dialog.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Disconnect"
-msgstr "Desligar"
-
-#: editor/connections_dialog.cpp
-msgid "Connect a Signal to a Method"
-msgstr "Conectar Sinal a Método"
-
-#: editor/connections_dialog.cpp
-msgid "Edit Connection:"
-msgstr "Editar Conexão:"
-
-#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Deseja remover todas as conexões do sinal \"%s\"?"
-
-#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
-msgid "Signals"
-msgstr "Sinais"
-
-#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from this signal?"
-msgstr "Deseja remover todas as conexões deste sinal?"
-
-#: editor/connections_dialog.cpp
-msgid "Disconnect All"
-msgstr "Desconectar Tudo"
-
-#: editor/connections_dialog.cpp
-msgid "Edit..."
-msgstr "Editar..."
-
-#: editor/connections_dialog.cpp
-msgid "Go To Method"
-msgstr "Ir para Método"
-
-#: editor/create_dialog.cpp
-msgid "Change %s Type"
-msgstr "Mudar tipo %s"
-
-#: editor/create_dialog.cpp editor/project_settings_editor.cpp
-msgid "Change"
-msgstr "Mudar"
-
-#: editor/create_dialog.cpp
-msgid "Create New %s"
-msgstr "Criar Novo %s"
-
-#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/filesystem_dock.cpp
-msgid "Favorites:"
-msgstr "Favoritos:"
-
-#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
-msgid "Recent:"
-msgstr "Recente:"
-
-#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Search:"
-msgstr "Procurar:"
-
-#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Matches:"
-msgstr "Correspondências:"
-
-#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
-#: editor/plugin_config_dialog.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Description:"
-msgstr "Descrição:"
-
-#: editor/dependency_editor.cpp
-msgid "Search Replacement For:"
-msgstr "Procurar Substituição para:"
-
-#: editor/dependency_editor.cpp
-msgid "Dependencies For:"
-msgstr "Dependências para:"
-
-#: editor/dependency_editor.cpp
-msgid ""
-"Scene '%s' is currently being edited.\n"
-"Changes will only take effect when reloaded."
-msgstr ""
-"A Cena '%s' está a ser editada.\n"
-"As alterações só terão efeito quando recarregar."
-
-#: editor/dependency_editor.cpp
-msgid ""
-"Resource '%s' is in use.\n"
-"Changes will only take effect when reloaded."
-msgstr ""
-"Recurso '%s' em uso.\n"
-"As alterações só terão efeito quando recarregar."
-
-#: editor/dependency_editor.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Dependencies"
-msgstr "Dependências"
-
-#: editor/dependency_editor.cpp
-msgid "Resource"
-msgstr "Recurso"
-
-#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-msgid "Path"
-msgstr "Caminho"
-
-#: editor/dependency_editor.cpp
-msgid "Dependencies:"
-msgstr "Dependências:"
-
-#: editor/dependency_editor.cpp
-msgid "Fix Broken"
-msgstr "Reparar"
-
-#: editor/dependency_editor.cpp
-msgid "Dependency Editor"
-msgstr "Editor de dependência"
-
-#: editor/dependency_editor.cpp
-msgid "Search Replacement Resource:"
-msgstr "Procurar Recurso de substituição:"
-
-#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help_search.cpp editor/editor_node.cpp
-#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
-#: editor/script_create_dialog.cpp
-#: modules/visual_script/visual_script_property_selector.cpp
-#: scene/gui/file_dialog.cpp
-msgid "Open"
-msgstr "Abrir"
-
-#: editor/dependency_editor.cpp
-msgid "Owners Of:"
-msgstr "Proprietários de:"
-
-#: editor/dependency_editor.cpp
-msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "Remover arquivos selecionados do Projeto? (Sem desfazer)"
-
-#: editor/dependency_editor.cpp
-msgid ""
-"The files being removed are required by other resources in order for them to "
-"work.\n"
-"Remove them anyway? (no undo)"
-msgstr ""
-"Os arquivos a serem removidos são necessários para que outros recursos "
-"funcionem.\n"
-"Remover mesmo assim? (sem anular)"
-
-#: editor/dependency_editor.cpp
-msgid "Cannot remove:"
-msgstr "Impossível remover:"
-
-#: editor/dependency_editor.cpp
-msgid "Error loading:"
-msgstr "Erro ao carregar:"
-
-#: editor/dependency_editor.cpp
-msgid "Load failed due to missing dependencies:"
-msgstr "Falha no carregamento devido a dependências em falta:"
-
-#: editor/dependency_editor.cpp editor/editor_node.cpp
-msgid "Open Anyway"
-msgstr "Abrir De Qualquer Maneira"
-
-#: editor/dependency_editor.cpp
-msgid "Which action should be taken?"
-msgstr "Qual ação deve ser tomada?"
-
-#: editor/dependency_editor.cpp
-msgid "Fix Dependencies"
-msgstr "Corrigir as dependências"
-
-#: editor/dependency_editor.cpp
-msgid "Errors loading!"
-msgstr "Erros ao carregar!"
-
-#: editor/dependency_editor.cpp
-msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "Apagar permanentemente %d itens? (Sem desfazer!)"
-
-#: editor/dependency_editor.cpp
-msgid "Show Dependencies"
-msgstr "Mostra Dependências"
-
-#: editor/dependency_editor.cpp
-msgid "Orphan Resource Explorer"
-msgstr "Explorador de Recursos Órfãos"
-
-#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
-#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
-#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
-msgid "Delete"
-msgstr "Apagar"
-
-#: editor/dependency_editor.cpp
-msgid "Owns"
-msgstr "Possui"
-
-#: editor/dependency_editor.cpp
-msgid "Resources Without Explicit Ownership:"
-msgstr "Recursos sem posse explícita:"
-
-#: editor/dictionary_property_edit.cpp
-msgid "Change Dictionary Key"
-msgstr "Mudar Chave de Dicionário"
-
-#: editor/dictionary_property_edit.cpp
-msgid "Change Dictionary Value"
-msgstr "Mudar o valor do dicionário"
-
-#: editor/editor_about.cpp
-msgid "Thanks from the Godot community!"
-msgstr "Agradecimentos da Comunidade Godot!"
-
-#: editor/editor_about.cpp
-msgid "Godot Engine contributors"
-msgstr "Contribuidores da engine Godot"
-
-#: editor/editor_about.cpp
-msgid "Project Founders"
-msgstr "Fundadores do Projeto"
-
-#: editor/editor_about.cpp
-msgid "Lead Developer"
-msgstr "Desenvolvedor-chefe"
-
-#: editor/editor_about.cpp
-msgid "Project Manager "
-msgstr "Gestor de Projeto "
-
-#: editor/editor_about.cpp
-msgid "Developers"
-msgstr "Desenvolvedores"
-
-#: editor/editor_about.cpp
-msgid "Authors"
-msgstr "Autores"
-
-#: editor/editor_about.cpp
-msgid "Platinum Sponsors"
-msgstr "Patrocinadores Platinum"
-
-#: editor/editor_about.cpp
-msgid "Gold Sponsors"
-msgstr "Patrocinadores Gold"
-
-#: editor/editor_about.cpp
-msgid "Mini Sponsors"
-msgstr "Patrocinadores Mini"
-
-#: editor/editor_about.cpp
-msgid "Gold Donors"
-msgstr "Doadores Gold"
-
-#: editor/editor_about.cpp
-msgid "Silver Donors"
-msgstr "Doadores Silver"
-
-#: editor/editor_about.cpp
-msgid "Bronze Donors"
-msgstr "Doadores Bronze"
-
-#: editor/editor_about.cpp
-msgid "Donors"
-msgstr "Doadores"
-
-#: editor/editor_about.cpp
-msgid "License"
-msgstr "Licença"
-
-#: editor/editor_about.cpp
-msgid "Third-party Licenses"
-msgstr "Licenças de Terceiros"
-
-#: editor/editor_about.cpp
-msgid ""
-"Godot Engine relies on a number of third-party free and open source "
-"libraries, all compatible with the terms of its MIT license. The following "
-"is an exhaustive list of all such third-party components with their "
-"respective copyright statements and license terms."
-msgstr ""
-"O Godot Engine conta com várias Bibliotecas abertas e gratuitas de "
-"terceiros, todas compatíveis com os termos da sua licença MIT. A lista "
-"seguinte é uma lista exaustiva de todos esses Componentes de terceiros com "
-"suas respetivas declarações de direitos autorais e termos de licença."
-
-#: editor/editor_about.cpp
-msgid "All Components"
-msgstr "Todos os Componentes"
-
-#: editor/editor_about.cpp
-msgid "Components"
-msgstr "Componentes"
-
-#: editor/editor_about.cpp
-msgid "Licenses"
-msgstr "Licenças"
-
-#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Error opening package file, not in ZIP format."
-msgstr "Erro ao abrir ficheiro comprimido, não está no formato ZIP."
-
-#: editor/editor_asset_installer.cpp
-msgid "%s (Already Exists)"
-msgstr "%s (Já Existe)"
-
-#: editor/editor_asset_installer.cpp
-msgid "Uncompressing Assets"
-msgstr "A descompactar Ativos"
-
-#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "The following files failed extraction from package:"
-msgstr "Falhou a extração dos seguintes Ficheiros do pacote:"
-
-#: editor/editor_asset_installer.cpp
-msgid "And %s more files."
-msgstr "E mais %s ficheiros."
-
-#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package installed successfully!"
-msgstr "Pacote Instalado com sucesso!"
-
-#: editor/editor_asset_installer.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Success!"
-msgstr "Sucesso!"
-
-#: editor/editor_asset_installer.cpp
-msgid "Package Contents:"
-msgstr "Conteúdo do Pacote:"
-
-#: editor/editor_asset_installer.cpp editor/editor_node.cpp
-msgid "Install"
-msgstr "Instalar"
-
-#: editor/editor_asset_installer.cpp
-msgid "Package Installer"
-msgstr "Instalador de Pacotes"
-
-#: editor/editor_audio_buses.cpp
-msgid "Speakers"
-msgstr "Altifalantes"
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Effect"
-msgstr "Adicionar Efeito"
-
-#: editor/editor_audio_buses.cpp
-msgid "Rename Audio Bus"
-msgstr "Renomear o barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Change Audio Bus Volume"
-msgstr "Alterar Volume do barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Toggle Audio Bus Solo"
-msgstr "Alternar solo do barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Toggle Audio Bus Mute"
-msgstr "Alternar silêncio do barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Toggle Audio Bus Bypass Effects"
-msgstr "Alternar efeitos bypass do barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Select Audio Bus Send"
-msgstr "Selecionar envio do barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Audio Bus Effect"
-msgstr "Adicionar Efeito de barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Move Bus Effect"
-msgstr "Mover Efeito de Barramento"
-
-#: editor/editor_audio_buses.cpp
-msgid "Delete Bus Effect"
-msgstr "Apagar Efeito de Barramento"
-
-#: editor/editor_audio_buses.cpp
-msgid "Drag & drop to rearrange."
-msgstr "Arrastar e largar para reorganizar."
-
-#: editor/editor_audio_buses.cpp
-msgid "Solo"
-msgstr "Solo"
-
-#: editor/editor_audio_buses.cpp
-msgid "Mute"
-msgstr "Mudo"
-
-#: editor/editor_audio_buses.cpp
-msgid "Bypass"
-msgstr "Ignorar"
-
-#: editor/editor_audio_buses.cpp
-msgid "Bus options"
-msgstr "Opções de barramento"
-
-#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "Duplicate"
-msgstr "Duplicado"
-
-#: editor/editor_audio_buses.cpp
-msgid "Reset Volume"
-msgstr "Repor Volume"
-
-#: editor/editor_audio_buses.cpp
-msgid "Delete Effect"
-msgstr "Apagar Efeito"
-
-#: editor/editor_audio_buses.cpp
-msgid "Audio"
-msgstr "Áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Audio Bus"
-msgstr "Adicionar barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Master bus can't be deleted!"
-msgstr "O barramento principal não pode ser removido!"
-
-#: editor/editor_audio_buses.cpp
-msgid "Delete Audio Bus"
-msgstr "Apagar barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Duplicate Audio Bus"
-msgstr "Duplicar barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Reset Bus Volume"
-msgstr "Repor Volume do Barramento"
-
-#: editor/editor_audio_buses.cpp
-msgid "Move Audio Bus"
-msgstr "Mover barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "Save Audio Bus Layout As..."
-msgstr "Guardar Modelo do barramento de áudio como..."
-
-#: editor/editor_audio_buses.cpp
-msgid "Location for New Layout..."
-msgstr "Localização para o Novo Modelo..."
-
-#: editor/editor_audio_buses.cpp
-msgid "Open Audio Bus Layout"
-msgstr "Abrir Modelo de barramento de áudio"
-
-#: editor/editor_audio_buses.cpp
-msgid "There is no '%s' file."
-msgstr "Não existe ficheiro '%s'."
-
-#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Layout"
-msgstr "Esquema"
-
-#: editor/editor_audio_buses.cpp
-msgid "Invalid file, not an audio bus layout."
-msgstr "Ficheiro inválido, não é um Modelo válido de barramento de áudio."
-
-#: editor/editor_audio_buses.cpp
-msgid "Error saving file: %s"
-msgstr "Erro ao guardar ficheiro: %s"
-
-#: editor/editor_audio_buses.cpp
-msgid "Add Bus"
-msgstr "Adicionar Barramento"
-
-#: editor/editor_audio_buses.cpp
-msgid "Add a new Audio Bus to this layout."
-msgstr "Adicionar novo Barramento de Áudio a este modelo."
-
-#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
-#: editor/script_create_dialog.cpp
-msgid "Load"
-msgstr "Carregar"
-
-#: editor/editor_audio_buses.cpp
-msgid "Load an existing Bus Layout."
-msgstr "Carregar um Modelo de Barramento existente."
-
-#: editor/editor_audio_buses.cpp
-msgid "Save As"
-msgstr "Guardar Como"
-
-#: editor/editor_audio_buses.cpp
-msgid "Save this Bus Layout to a file."
-msgstr "Guardar este Modelo de Barramento para um ficheiro."
-
-#: editor/editor_audio_buses.cpp editor/import_dock.cpp
-msgid "Load Default"
-msgstr "Carregar Padrão"
-
-#: editor/editor_audio_buses.cpp
-msgid "Load the default Bus Layout."
-msgstr "Carregar o Modelo padrão de barramento."
-
-#: editor/editor_audio_buses.cpp
-msgid "Create a new Bus Layout."
-msgstr "Criar um novo Modelo de Barramento."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Invalid name."
-msgstr "Nome inválido."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Valid characters:"
-msgstr "Carateres válidos:"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Must not collide with an existing engine class name."
-msgstr "Não pode coincidir com um nome de classe do motor já existente."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Must not collide with an existing built-in type name."
-msgstr "Não pode coincidir com um nome de um tipo incorporado já existente."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Must not collide with an existing global constant name."
-msgstr "Não pode coincidir com um nome de uma constante global já existente."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Keyword cannot be used as an autoload name."
-msgstr ""
-"Palavras-chave não podem ser usadas como nome de carregamento automático."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Autoload '%s' already exists!"
-msgstr "Carregamento Automático '%s' já existe!"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Rename Autoload"
-msgstr "Renomear Carregamento Automático"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Toggle AutoLoad Globals"
-msgstr "Alternar Globals de carregamento automático"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Move Autoload"
-msgstr "Mover Carregamento Automático"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Remove Autoload"
-msgstr "Remover Carregamento Automático"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Enable"
-msgstr "Ativar"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Rearrange Autoloads"
-msgstr "Reorganizar Carregamentos Automáticos"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Caminho inválido."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "O Ficheiro não existe."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Não está no Caminho do recurso."
-
-#: editor/editor_autoload_settings.cpp
-msgid "Add AutoLoad"
-msgstr "Adicionar Carregamento Automático"
-
-#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: editor/editor_plugin_settings.cpp
-#: editor/plugins/animation_tree_editor_plugin.cpp
-#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Path:"
-msgstr "Caminho:"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Node Name:"
-msgstr "Nome do Nó:"
-
-#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
-#: editor/editor_profiler.cpp editor/project_manager.cpp
-#: editor/settings_config_dialog.cpp
-msgid "Name"
-msgstr "Nome"
-
-#: editor/editor_autoload_settings.cpp
-msgid "Singleton"
-msgstr "Instância única"
-
-#: editor/editor_data.cpp
-msgid "Updating Scene"
-msgstr "Atualizando a Cena"
-
-#: editor/editor_data.cpp
-msgid "Storing local changes..."
-msgstr "Armazenando alterações locais..."
-
-#: editor/editor_data.cpp
-msgid "Updating scene..."
-msgstr "Atualizando a Cena..."
-
-#: editor/editor_data.cpp editor/editor_properties.cpp
-msgid "[empty]"
-msgstr "[vazio]"
-
-#: editor/editor_data.cpp
-msgid "[unsaved]"
-msgstr "[não guardado]"
-
-#: editor/editor_dir_dialog.cpp
-msgid "Please select a base directory first."
-msgstr "Por favor selecione primeiro a diretoria base."
-
-#: editor/editor_dir_dialog.cpp
-msgid "Choose a Directory"
-msgstr "Escolha uma Diretoria"
-
-#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#: scene/gui/file_dialog.cpp
-msgid "Create Folder"
-msgstr "Criar Pasta"
-
-#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
-#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
-#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp
-msgid "Name:"
-msgstr "Nome:"
-
-#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
-#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
-msgid "Could not create folder."
-msgstr "Não foi possível criar pasta."
-
-#: editor/editor_dir_dialog.cpp
-msgid "Choose"
-msgstr "Escolha"
-
-#: editor/editor_export.cpp
-msgid "Storing File:"
-msgstr "Arquivo de Armazenamento:"
-
-#: editor/editor_export.cpp
-msgid "No export template found at the expected path:"
-msgstr "Nenhum modelo de exportação encontrado no caminho previsto:"
-
-#: editor/editor_export.cpp
-msgid "Packing"
-msgstr "Empacotamento"
-
-#: editor/editor_export.cpp
-msgid ""
-"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
-"Etc' in Project Settings."
-msgstr ""
-"Plataforma Alvo exige compressão de textura 'ETC' para GLES2. Ative "
-"'Importar Etc' nas Configurações do Projeto."
-
-#: editor/editor_export.cpp
-msgid ""
-"Target platform requires 'ETC2' texture compression for GLES3. Enable "
-"'Import Etc 2' in Project Settings."
-msgstr ""
-"Plataforma Alvo exige compressão de textura 'ETC2' para GLES3. Ative "
-"'Importar Etc 2' nas Configurações do Projeto."
-
-#: editor/editor_export.cpp
-msgid ""
-"Target platform requires 'ETC' texture compression for the driver fallback "
-"to GLES2.\n"
-"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
-"Enabled'."
-msgstr ""
-"Plataforma Alvo exige compressão de textura 'ETC' para o driver de recurso "
-"em GLES2.\n"
-"Ative 'Importar Etc' nas Configurações do Projeto, ou desative 'Driver de "
-"Recurso ativo'."
-
-#: editor/editor_export.cpp platform/android/export/export.cpp
-#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
-#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-msgid "Custom debug template not found."
-msgstr "Modelo de depuração personalizado não encontrado."
-
-#: editor/editor_export.cpp platform/android/export/export.cpp
-#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
-#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-msgid "Custom release template not found."
-msgstr "Modelo de lançamento personalizado não encontrado."
-
-#: editor/editor_export.cpp platform/javascript/export/export.cpp
-msgid "Template file not found:"
-msgstr "Ficheiro Modelo não encontrado:"
-
-#: editor/editor_export.cpp
-msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
-"Em exportações de 32 bits o PCK incorporado não pode ser maior do que 4 GiB."
-
-#: editor/editor_feature_profile.cpp
-msgid "3D Editor"
-msgstr "Editor 3D"
-
-#: editor/editor_feature_profile.cpp
-msgid "Script Editor"
-msgstr "Editor de Script"
-
-#: editor/editor_feature_profile.cpp
-msgid "Asset Library"
-msgstr "Biblioteca de Ativos"
-
-#: editor/editor_feature_profile.cpp
-msgid "Scene Tree Editing"
-msgstr "Edição da Árvore de Cena"
-
-#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importar Doca"
-
-#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
-msgstr "Nó Doca"
-
-#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Sistema de Ficheiros e Docas de Importação"
-
-#: editor/editor_feature_profile.cpp
-msgid "Erase profile '%s'? (no undo)"
-msgstr "Substituir perfil '%s'? (não há desfazer)"
-
-#: editor/editor_feature_profile.cpp
-msgid "Profile must be a valid filename and must not contain '.'"
-msgstr "Perfil tem de ser um ficheiro válido e não pode conter '.'"
-
-#: editor/editor_feature_profile.cpp
-msgid "Profile with this name already exists."
-msgstr "Já existe um Perfil com este nome."
-
-#: editor/editor_feature_profile.cpp
-msgid "(Editor Disabled, Properties Disabled)"
-msgstr "(Editor Desativado, Propriedades Desativadas)"
-
-#: editor/editor_feature_profile.cpp
-msgid "(Properties Disabled)"
-msgstr "(Propriedades Desativadas)"
-
-#: editor/editor_feature_profile.cpp
-msgid "(Editor Disabled)"
-msgstr "(Editor Desativado)"
-
-#: editor/editor_feature_profile.cpp
-msgid "Class Options:"
-msgstr "Opções da Classe:"
-
-#: editor/editor_feature_profile.cpp
-msgid "Enable Contextual Editor"
-msgstr "Ativar Editor de Contexto"
-
-#: editor/editor_feature_profile.cpp
-msgid "Enabled Properties:"
-msgstr "Ativar Propriedades:"
-
-#: editor/editor_feature_profile.cpp
-msgid "Enabled Features:"
-msgstr "Ativar Características:"
-
-#: editor/editor_feature_profile.cpp
-msgid "Enabled Classes:"
-msgstr "Ativar Classes:"
-
-#: editor/editor_feature_profile.cpp
-msgid "File '%s' format is invalid, import aborted."
-msgstr "Formato do ficheiro '%s' é inválido, importação interrompida."
-
-#: editor/editor_feature_profile.cpp
-msgid ""
-"Profile '%s' already exists. Remove it first before importing, import "
-"aborted."
-msgstr ""
-"Perfil '%s' já existe. Remova-o antes de importar, importação interrompida."
-
-#: editor/editor_feature_profile.cpp
-msgid "Error saving profile to path: '%s'."
-msgstr "Erro ao guardar perfil no caminho: '%s'."
-
-#: editor/editor_feature_profile.cpp
-msgid "Unset"
-msgstr "Desativar"
-
-#: editor/editor_feature_profile.cpp
-msgid "Current Profile:"
-msgstr "Perfil atual:"
-
-#: editor/editor_feature_profile.cpp
-msgid "Make Current"
-msgstr "Tornar Atual"
-
-#: editor/editor_feature_profile.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "New"
-msgstr "Novo"
-
-#: editor/editor_feature_profile.cpp editor/editor_node.cpp
-#: editor/project_manager.cpp
-msgid "Import"
-msgstr "Importar"
-
-#: editor/editor_feature_profile.cpp editor/project_export.cpp
-msgid "Export"
-msgstr "Exportar"
-
-#: editor/editor_feature_profile.cpp
-msgid "Available Profiles:"
-msgstr "Perfis disponíveis:"
-
-#: editor/editor_feature_profile.cpp
-msgid "Class Options"
-msgstr "Opções da Classe"
-
-#: editor/editor_feature_profile.cpp
-msgid "New profile name:"
-msgstr "Novo nome do perfil:"
-
-#: editor/editor_feature_profile.cpp
-msgid "Erase Profile"
-msgstr "Apagar Perfil"
-
-#: editor/editor_feature_profile.cpp
-msgid "Godot Feature Profile"
-msgstr "Perfil de Características Godot"
-
-#: editor/editor_feature_profile.cpp
-msgid "Import Profile(s)"
-msgstr "Importar Perfil/Perfis"
-
-#: editor/editor_feature_profile.cpp
-msgid "Export Profile"
-msgstr "Exportar Perfil"
-
-#: editor/editor_feature_profile.cpp
-msgid "Manage Editor Feature Profiles"
-msgstr "Gerir Editor de Perfis"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Selecionar pasta atual"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "File Exists, Overwrite?"
-msgstr "O Ficheiro existe, sobrescrever?"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select This Folder"
-msgstr "Selecionar esta Pasta"
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Copy Path"
-msgstr "Copiar Caminho"
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open in File Manager"
-msgstr "Abrir no Gestor de Ficheiros"
-
-#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/filesystem_dock.cpp editor/project_manager.cpp
-msgid "Show in File Manager"
-msgstr "Mostrar no Gestor de Ficheiros"
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "New Folder..."
-msgstr "Nova Diretoria..."
-
-#: editor/editor_file_dialog.cpp
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Refresh"
-msgstr "Atualizar"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "All Recognized"
-msgstr "Todos Reconhecidos"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "All Files (*)"
-msgstr "Todos os Ficheiros (*)"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open a File"
-msgstr "Abrir um Ficheiro"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open File(s)"
-msgstr "Abrir Ficheiro(s)"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open a Directory"
-msgstr "Abrir uma Diretoria"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Open a File or Directory"
-msgstr "Abrir um Ficheiro ou Diretoria"
-
-#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/editor_properties.cpp editor/inspector_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
-msgid "Save"
-msgstr "Guardar"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Save a File"
-msgstr "Guardar um Ficheiro"
-
-#: editor/editor_file_dialog.cpp
-msgid "Go Back"
-msgstr "Voltar"
-
-#: editor/editor_file_dialog.cpp
-msgid "Go Forward"
-msgstr "Avançar"
-
-#: editor/editor_file_dialog.cpp
-msgid "Go Up"
-msgstr "Subir"
-
-#: editor/editor_file_dialog.cpp
-msgid "Toggle Hidden Files"
-msgstr "Alternar Ficheiros escondidos"
-
-#: editor/editor_file_dialog.cpp
-msgid "Toggle Favorite"
-msgstr "Alternar favorito"
-
-#: editor/editor_file_dialog.cpp
-msgid "Toggle Mode"
-msgstr "Alternar modo"
-
-#: editor/editor_file_dialog.cpp
-msgid "Focus Path"
-msgstr "Focar Caminho"
-
-#: editor/editor_file_dialog.cpp
-msgid "Move Favorite Up"
-msgstr "Mover Favorito para Cima"
-
-#: editor/editor_file_dialog.cpp
-msgid "Move Favorite Down"
-msgstr "Mover Favorito para Baixo"
-
-#: editor/editor_file_dialog.cpp
-msgid "Go to previous folder."
-msgstr "Ir para a pasta anterior."
-
-#: editor/editor_file_dialog.cpp
-msgid "Go to next folder."
-msgstr "Ir para a pasta seguinte."
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Go to parent folder."
-msgstr "Ir para a pasta acima."
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Refresh files."
-msgstr "Atualizar ficheiros."
-
-#: editor/editor_file_dialog.cpp
-msgid "(Un)favorite current folder."
-msgstr "(Não) tornar favorita atual pasta."
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Toggle the visibility of hidden files."
-msgstr "Alternar a visibilidade de ficheiros escondidos."
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "View items as a grid of thumbnails."
-msgstr "Visualizar itens como grelha de miniaturas."
-
-#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "View items as a list."
-msgstr "Visualizar itens como lista."
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Directories & Files:"
-msgstr "Diretorias e Ficheiros:"
-
-#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
-#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Preview:"
-msgstr "Pré-visualização:"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "File:"
-msgstr "Ficheiro:"
-
-#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Must use a valid extension."
-msgstr "Deve usar uma extensão válida."
-
-#: editor/editor_file_system.cpp
-msgid "ScanSources"
-msgstr "Analisar fontes"
-
-#: editor/editor_file_system.cpp
-msgid ""
-"There are multiple importers for different types pointing to file %s, import "
-"aborted"
-msgstr ""
-"Existem vários importadores para diferentes tipos que apontam para o "
-"ficheiro %s. Importação abortada"
-
-#: editor/editor_file_system.cpp
-msgid "(Re)Importing Assets"
-msgstr "A (Re)Importar Ativos"
-
-#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
-msgid "Top"
-msgstr "Topo"
-
-#: editor/editor_help.cpp
-msgid "Class:"
-msgstr "Classe:"
-
-#: editor/editor_help.cpp editor/scene_tree_editor.cpp
-#: editor/script_create_dialog.cpp
-msgid "Inherits:"
-msgstr "Herdar:"
-
-#: editor/editor_help.cpp
-msgid "Inherited by:"
-msgstr "Herdado por:"
-
-#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Descrição"
-
-#: editor/editor_help.cpp
-msgid "Online Tutorials"
-msgstr "Tutoriais Online"
-
-#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Propriedades"
-
-#: editor/editor_help.cpp
-msgid "override:"
-msgstr "Sobrepõe:"
-
-#: editor/editor_help.cpp
-msgid "default:"
-msgstr "Padrão:"
-
-#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Métodos"
-
-#: editor/editor_help.cpp
-msgid "Theme Properties"
-msgstr "Propriedades do Tema"
-
-#: editor/editor_help.cpp
-msgid "Enumerations"
-msgstr "Enumerações"
-
-#: editor/editor_help.cpp
-msgid "Constants"
-msgstr "Constantes"
-
-#: editor/editor_help.cpp
-msgid "Property Descriptions"
-msgstr "Descrições da Propriedade"
-
-#: editor/editor_help.cpp
-msgid "(value)"
-msgstr "(valor)"
-
-#: editor/editor_help.cpp
-msgid ""
-"There is currently no description for this property. Please help us by "
-"[color=$color][url=$url]contributing one[/url][/color]!"
-msgstr ""
-"Atualmente não existe descrição para esta Propriedade. Por favor ajude-nos "
-"[color=$color][url=$url]contribuindo com uma[/url][/color]!"
-
-#: editor/editor_help.cpp
-msgid "Method Descriptions"
-msgstr "Descrições do Método"
-
-#: editor/editor_help.cpp
-msgid ""
-"There is currently no description for this method. Please help us by [color="
-"$color][url=$url]contributing one[/url][/color]!"
-msgstr ""
-"Atualmente não existe descrição para este Método. Por favor ajude-nos [color="
-"$color][url=$url]contribuindo com uma[/url][/color]!"
-
-#: editor/editor_help_search.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Procurar em Ajuda"
-
-#: editor/editor_help_search.cpp
-msgid "Case Sensitive"
-msgstr "Sensível a maiúsculas"
-
-#: editor/editor_help_search.cpp
-msgid "Show Hierarchy"
-msgstr "Mostrar Hierarquia"
-
-#: editor/editor_help_search.cpp
-msgid "Display All"
-msgstr "Mostrar Tudo"
-
-#: editor/editor_help_search.cpp
-msgid "Classes Only"
-msgstr "Apenas Classes"
-
-#: editor/editor_help_search.cpp
-msgid "Methods Only"
-msgstr "Apenas Métodos"
-
-#: editor/editor_help_search.cpp
-msgid "Signals Only"
-msgstr "Apenas Sinais"
-
-#: editor/editor_help_search.cpp
-msgid "Constants Only"
-msgstr "Apenas Constantes"
-
-#: editor/editor_help_search.cpp
-msgid "Properties Only"
-msgstr "Apenas Propriedades"
-
-#: editor/editor_help_search.cpp
-msgid "Theme Properties Only"
-msgstr "Apenas Propriedades do Tema"
-
-#: editor/editor_help_search.cpp
-msgid "Member Type"
-msgstr "Tipo do Membro"
-
-#: editor/editor_help_search.cpp
-msgid "Class"
-msgstr "Classe"
-
-#: editor/editor_help_search.cpp
-msgid "Method"
-msgstr "Método"
-
-#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-msgid "Signal"
-msgstr "Sinal"
-
-#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
-msgid "Constant"
-msgstr "Constante"
-
-#: editor/editor_help_search.cpp
-msgid "Property"
-msgstr "Propriedade"
-
-#: editor/editor_help_search.cpp
-msgid "Theme Property"
-msgstr "Propriedade do Tema"
-
-#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
-msgid "Property:"
-msgstr "Propriedade:"
-
-#: editor/editor_inspector.cpp
-msgid "Set"
-msgstr "Definir"
-
-#: editor/editor_inspector.cpp
-msgid "Set Multiple:"
-msgstr "Definir Múltiplo:"
-
-#: editor/editor_log.cpp
-msgid "Output:"
-msgstr "Saída:"
-
-#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-msgid "Copy Selection"
-msgstr "Copiar Seleção"
-
-#: editor/editor_log.cpp editor/editor_network_profiler.cpp
-#: editor/editor_profiler.cpp editor/editor_properties.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/property_editor.cpp editor/scene_tree_dock.cpp
-#: editor/script_editor_debugger.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
-#: scene/gui/text_edit.cpp
-msgid "Clear"
-msgstr "Limpar"
-
-#: editor/editor_log.cpp
-msgid "Clear Output"
-msgstr "Limpar Saída"
-
-#: editor/editor_network_profiler.cpp editor/editor_node.cpp
-#: editor/editor_profiler.cpp
-msgid "Stop"
-msgstr "Parar"
-
-#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
-#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
-msgid "Start"
-msgstr "Início"
-
-#: editor/editor_network_profiler.cpp
-msgid "%s/s"
-msgstr "%s/s"
-
-#: editor/editor_network_profiler.cpp
-msgid "Down"
-msgstr "Para baixo"
-
-#: editor/editor_network_profiler.cpp
-msgid "Up"
-msgstr "Para cima"
-
-#: editor/editor_network_profiler.cpp editor/editor_node.cpp
-msgid "Node"
-msgstr "Nó"
-
-#: editor/editor_network_profiler.cpp
-msgid "Incoming RPC"
-msgstr "RPC recebido"
-
-#: editor/editor_network_profiler.cpp
-msgid "Incoming RSET"
-msgstr "RSET recebido"
-
-#: editor/editor_network_profiler.cpp
-msgid "Outgoing RPC"
-msgstr "RPC enviado"
-
-#: editor/editor_network_profiler.cpp
-msgid "Outgoing RSET"
-msgstr "RSET enviado"
-
-#: editor/editor_node.cpp editor/project_manager.cpp
-msgid "New Window"
-msgstr "Nova Janela"
-
-#: editor/editor_node.cpp
-msgid "Imported resources can't be saved."
-msgstr "Recursos importados não podem ser guardados."
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#: scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
-#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Error saving resource!"
-msgstr "Erro ao guardar recurso!"
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource can't be saved because it does not belong to the edited scene. "
-"Make it unique first."
-msgstr ""
-"Este recurso não pode ser guardado porque não pertence à cena editada. Faça-"
-"o único."
-
-#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Save Resource As..."
-msgstr "Guardar Recurso Como..."
-
-#: editor/editor_node.cpp
-msgid "Can't open file for writing:"
-msgstr "Impossível abrir o Ficheiro para escrita:"
-
-#: editor/editor_node.cpp
-msgid "Requested file format unknown:"
-msgstr "Formato do Ficheiro solicitado desconhecido:"
-
-#: editor/editor_node.cpp
-msgid "Error while saving."
-msgstr "Erro ao guardar."
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr "Impossível abrir '%s'. O ficheiro pode ter sido movido ou apagado."
-
-#: editor/editor_node.cpp
-msgid "Error while parsing '%s'."
-msgstr "Erro ao analisar '%s'."
-
-#: editor/editor_node.cpp
-msgid "Unexpected end of file '%s'."
-msgstr "Fim de Ficheiro '%s' inesperado."
-
-#: editor/editor_node.cpp
-msgid "Missing '%s' or its dependencies."
-msgstr "Falta '%s' ou as suas dependências."
-
-#: editor/editor_node.cpp
-msgid "Error while loading '%s'."
-msgstr "Erro ao carregar '%s'."
-
-#: editor/editor_node.cpp
-msgid "Saving Scene"
-msgstr "A guardar a Cena"
-
-#: editor/editor_node.cpp
-msgid "Analyzing"
-msgstr "Analizando"
-
-#: editor/editor_node.cpp
-msgid "Creating Thumbnail"
-msgstr "Criando Miniatura"
-
-#: editor/editor_node.cpp
-msgid "This operation can't be done without a tree root."
-msgstr "Esta operação não pode ser feita sem uma raiz da árvore."
-
-#: editor/editor_node.cpp
-msgid ""
-"This scene can't be saved because there is a cyclic instancing inclusion.\n"
-"Please resolve it and then attempt to save again."
-msgstr ""
-"Esta cena não pode ser guardada porque existe inclusão de instâncias "
-"cíclica.\n"
-"Resolva-a e tente guardá-la novamente."
-
-#: editor/editor_node.cpp
-msgid ""
-"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
-"be satisfied."
-msgstr ""
-"Impossível guardar Cena. Provavelmente, as dependências (instâncias ou "
-"heranças) não puderam ser satisfeitas."
-
-#: editor/editor_node.cpp editor/scene_tree_dock.cpp
-msgid "Can't overwrite scene that is still open!"
-msgstr "Não se consegue sobrescrever cena ainda aberta!"
-
-#: editor/editor_node.cpp
-msgid "Can't load MeshLibrary for merging!"
-msgstr "Impossível carregar MeshLibrary para fundir!"
-
-#: editor/editor_node.cpp
-msgid "Error saving MeshLibrary!"
-msgstr "Erro ao guardar MeshLibrary!"
-
-#: editor/editor_node.cpp
-msgid "Can't load TileSet for merging!"
-msgstr "Impossível carregar TileSet para fundir!"
-
-#: editor/editor_node.cpp
-msgid "Error saving TileSet!"
-msgstr "Erro ao guardar TileSet!"
-
-#: editor/editor_node.cpp
-msgid "Error trying to save layout!"
-msgstr "Erro ao tentar guardar o Modelo!"
-
-#: editor/editor_node.cpp
-msgid "Default editor layout overridden."
-msgstr "O Modelo do Editor padrão foi substituído."
-
-#: editor/editor_node.cpp
-msgid "Layout name not found!"
-msgstr "Nome do Modelo não encontrado!"
-
-#: editor/editor_node.cpp
-msgid "Restored default layout to base settings."
-msgstr "Modelo padrão restaurado para as configurações base."
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource belongs to a scene that was imported, so it's not editable.\n"
-"Please read the documentation relevant to importing scenes to better "
-"understand this workflow."
-msgstr ""
-"Este recurso pertence a uma Cena que foi importado, portanto, não é "
-"editável.\n"
-"Por favor, leia a documentação relevante sobre importação de Cenas, para um "
-"melhor entendimento deste fluxo de trabalho."
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource belongs to a scene that was instanced or inherited.\n"
-"Changes to it won't be kept when saving the current scene."
-msgstr ""
-"Este recurso pertence a uma cena que foi instanciada ou herdada.\n"
-"As alterações ao mesmo não serão mantidas ao guardar a cena atual."
-
-#: editor/editor_node.cpp
-msgid ""
-"This resource was imported, so it's not editable. Change its settings in the "
-"import panel and then re-import."
-msgstr ""
-"Este recurso foi importado, portanto, não é editável. Altere as suas "
-"configurações no painel de importação e então importe de novo."
-
-#: editor/editor_node.cpp
-msgid ""
-"This scene was imported, so changes to it won't be kept.\n"
-"Instancing it or inheriting will allow making changes to it.\n"
-"Please read the documentation relevant to importing scenes to better "
-"understand this workflow."
-msgstr ""
-"Esta cena foi importada, portanto, as alterações à mesma não serão "
-"mantidas.\n"
-"Instanciando-a ou herdando-a vai permitir efetuar alterações à mesma.\n"
-"Por favor, leia a documentação relevante sobre importação de cenas, para um "
-"melhor entendimento do fluxo de trabalho."
-
-#: editor/editor_node.cpp
-msgid ""
-"This is a remote object, so changes to it won't be kept.\n"
-"Please read the documentation relevant to debugging to better understand "
-"this workflow."
-msgstr ""
-"Este é um objeto remoto, portanto, as alterações ao mesmo não serão "
-"mantidas.\n"
-"Por favor, leia a documentação relevante sobre depuração para um melhor "
-"entendimento deste fluxo de trabalho."
-
-#: editor/editor_node.cpp
-msgid "There is no defined scene to run."
-msgstr "Não existe nenhuma Cena definida para executar."
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "A Cena atual nunca foi guardada, por favor guarde-a antes de executar."
-
-#: editor/editor_node.cpp
-msgid "Could not start subprocess!"
-msgstr "Não foi possível iniciar o subprocesso!"
-
-#: editor/editor_node.cpp editor/filesystem_dock.cpp
-msgid "Open Scene"
-msgstr "Abrir Cena"
-
-#: editor/editor_node.cpp
-msgid "Open Base Scene"
-msgstr "Abrir Cena Base"
-
-#: editor/editor_node.cpp
-msgid "Quick Open..."
-msgstr "Abertura rápida..."
-
-#: editor/editor_node.cpp
-msgid "Quick Open Scene..."
-msgstr "Abrir Cena de forma rápida..."
-
-#: editor/editor_node.cpp
-msgid "Quick Open Script..."
-msgstr "Abrir Script de forma rápida..."
-
-#: editor/editor_node.cpp
-msgid "Save & Close"
-msgstr "Guardar & Fechar"
-
-#: editor/editor_node.cpp
-msgid "Save changes to '%s' before closing?"
-msgstr "Guardar alterações a '%s' antes de fechar?"
-
-#: editor/editor_node.cpp
-msgid "Saved %s modified resource(s)."
-msgstr "Guardado(s) %s recurso(s) modificado(s)."
-
-#: editor/editor_node.cpp
-msgid "A root node is required to save the scene."
-msgstr "É necessário um Nó Raiz para guardar a cena."
-
-#: editor/editor_node.cpp
-msgid "Save Scene As..."
-msgstr "Guardar Cena como..."
-
-#: editor/editor_node.cpp
-msgid "No"
-msgstr "Não"
-
-#: editor/editor_node.cpp
-msgid "Yes"
-msgstr "Sim"
-
-#: editor/editor_node.cpp
-msgid "This scene has never been saved. Save before running?"
-msgstr "Esta Cena nunca foi guardada. Guardar antes de executar?"
-
-#: editor/editor_node.cpp editor/scene_tree_dock.cpp
-msgid "This operation can't be done without a scene."
-msgstr "Esta operação não pode ser efetuada sem uma Cena."
-
-#: editor/editor_node.cpp
-msgid "Export Mesh Library"
-msgstr "Exportar Biblioteca de Malhas"
-
-#: editor/editor_node.cpp
-msgid "This operation can't be done without a root node."
-msgstr "Esta operação não pode ser efetuada sem um Nó raiz."
-
-#: editor/editor_node.cpp
-msgid "Export Tile Set"
-msgstr "Exportar conjunto de Tiles"
-
-#: editor/editor_node.cpp
-msgid "This operation can't be done without a selected node."
-msgstr "Esta operação não pode ser efetuada sem um Nó selecionado."
-
-#: editor/editor_node.cpp
-msgid "Current scene not saved. Open anyway?"
-msgstr "A Cena atual não foi guardada. Abrir na mesma?"
-
-#: editor/editor_node.cpp
-msgid "Can't reload a scene that was never saved."
-msgstr "Impossível recarregar uma Cena que nunca foi guardada."
-
-#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Reverter"
-
-#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Esta acção não pode ser desfeita. Reverter na mesma?"
-
-#: editor/editor_node.cpp
-msgid "Quick Run Scene..."
-msgstr "Executar Cena de forma rápida..."
-
-#: editor/editor_node.cpp
-msgid "Quit"
-msgstr "Sair"
-
-#: editor/editor_node.cpp
-msgid "Exit the editor?"
-msgstr "Sair do Editor?"
-
-#: editor/editor_node.cpp
-msgid "Open Project Manager?"
-msgstr "Abrir Gestor de Projeto?"
-
-#: editor/editor_node.cpp
-msgid "Save & Quit"
-msgstr "Guardar & Sair"
-
-#: editor/editor_node.cpp
-msgid "Save changes to the following scene(s) before quitting?"
-msgstr "Guardar alterações da(s) seguinte(s) Cena(s) antes de sair?"
-
-#: editor/editor_node.cpp
-msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr ""
-"Guardar alterações da(s) seguinte(s) Cena(s) antes de abrir o Gestor de "
-"Projeto?"
-
-#: editor/editor_node.cpp
-msgid ""
-"This option is deprecated. Situations where refresh must be forced are now "
-"considered a bug. Please report."
-msgstr ""
-"Esta opção foi descontinuada. Situações onde a atualização tem que ser "
-"forçada, são agora consideras um defeito. Por favor, reporte."
-
-#: editor/editor_node.cpp
-msgid "Pick a Main Scene"
-msgstr "Escolha a Cena Principal"
-
-#: editor/editor_node.cpp
-msgid "Close Scene"
-msgstr "Fechar Cena"
-
-#: editor/editor_node.cpp
-msgid "Reopen Closed Scene"
-msgstr "Reabrir Cena Fechada"
-
-#: editor/editor_node.cpp
-msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
-msgstr "Incapaz de ativar plugin em: '%s' falha de análise ou configuração."
-
-#: editor/editor_node.cpp
-msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
-msgstr "Incapaz de localizar campo Script para plugin em: 'res://addons/%s'."
-
-#: editor/editor_node.cpp
-msgid "Unable to load addon script from path: '%s'."
-msgstr "Incapaz de carregar Script addon do Caminho: '%s'."
-
-#: editor/editor_node.cpp
-msgid ""
-"Unable to load addon script from path: '%s' There seems to be an error in "
-"the code, please check the syntax."
-msgstr ""
-"Incapaz de carregar Script addon do caminho: '%s' Parece haver um erro no "
-"código, reveja a sintaxe."
-
-#: editor/editor_node.cpp
-msgid ""
-"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
-msgstr ""
-"Incapaz de carregar Script addon do Caminho: '%s' Tipo base não é "
-"EditorPlugin."
-
-#: editor/editor_node.cpp
-msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
-msgstr ""
-"Incapaz de carregar Script addon do Caminho: '%s' Script não está no modo "
-"ferramenta."
-
-#: editor/editor_node.cpp
-msgid ""
-"Scene '%s' was automatically imported, so it can't be modified.\n"
-"To make changes to it, a new inherited scene can be created."
-msgstr ""
-"Cena '%s' foi importada automaticamente, não podendo ser alterada.\n"
-"Para fazer alterações, pode ser criada uma nova Cena herdada."
-
-#: editor/editor_node.cpp
-msgid ""
-"Error loading scene, it must be inside the project path. Use 'Import' to "
-"open the scene, then save it inside the project path."
-msgstr ""
-"Erro ao carregar a Cena, tem de estar no Caminho do Projeto. Use 'Importar' "
-"para abrir a Cena, e guarde-a dentro do Caminho do Projeto."
-
-#: editor/editor_node.cpp
-msgid "Scene '%s' has broken dependencies:"
-msgstr "A Cena '%s' tem dependências não satisfeitas:"
-
-#: editor/editor_node.cpp
-msgid "Clear Recent Scenes"
-msgstr "Limpar Cenas Recentes"
-
-#: editor/editor_node.cpp
-msgid ""
-"No main scene has ever been defined, select one?\n"
-"You can change it later in \"Project Settings\" under the 'application' "
-"category."
-msgstr ""
-"Não foi definida nenhuma Cena principal. Selecionar uma?\n"
-"Poderá alterá-la depois nas \"Definições do Projeto\", na categoria "
-"'aplicação'."
-
-#: editor/editor_node.cpp
-msgid ""
-"Selected scene '%s' does not exist, select a valid one?\n"
-"You can change it later in \"Project Settings\" under the 'application' "
-"category."
-msgstr ""
-"A Cena selecionada '%s' não existe, selecionar uma válida?\n"
-"Poderá alterá-la depois em \"Configurações de Projeto\", na categoria de "
-"'aplicação'."
-
-#: editor/editor_node.cpp
-msgid ""
-"Selected scene '%s' is not a scene file, select a valid one?\n"
-"You can change it later in \"Project Settings\" under the 'application' "
-"category."
-msgstr ""
-"A Cena selecionada '%s' não é um Ficheiro de Cena, selecione um Ficheiro "
-"válido?\n"
-"Poderá alterá-la depois em \"Configurações de Projeto\", na categoria "
-"'aplicação'."
-
-#: editor/editor_node.cpp
-msgid "Save Layout"
-msgstr "Guardar Modelo"
-
-#: editor/editor_node.cpp
-msgid "Delete Layout"
-msgstr "Apagar Modelo"
-
-#: editor/editor_node.cpp editor/import_dock.cpp
-#: editor/script_create_dialog.cpp
-msgid "Default"
-msgstr "Padrão"
-
-#: editor/editor_node.cpp editor/editor_properties.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-msgid "Show in FileSystem"
-msgstr "Mostrar no Sistema de Ficheiros"
-
-#: editor/editor_node.cpp
-msgid "Play This Scene"
-msgstr "Executar esta Cena"
-
-#: editor/editor_node.cpp
-msgid "Close Tab"
-msgstr "Fechar Separador"
-
-#: editor/editor_node.cpp
-msgid "Undo Close Tab"
-msgstr "Desfazer Fechar Separador"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Close Other Tabs"
-msgstr "Fechar outros separadores"
-
-#: editor/editor_node.cpp
-msgid "Close Tabs to the Right"
-msgstr "Fechar Separadores à Direita"
-
-#: editor/editor_node.cpp
-msgid "Close All Tabs"
-msgstr "Fechar Todos os Separadores"
-
-#: editor/editor_node.cpp
-msgid "Switch Scene Tab"
-msgstr "Trocar Tab de Cena"
-
-#: editor/editor_node.cpp
-msgid "%d more files or folders"
-msgstr "%d mais Ficheiros ou diretorias"
-
-#: editor/editor_node.cpp
-msgid "%d more folders"
-msgstr "%d mais diretorias"
-
-#: editor/editor_node.cpp
-msgid "%d more files"
-msgstr "%d mais Ficheiros"
-
-#: editor/editor_node.cpp
-msgid "Dock Position"
-msgstr "Posição do Painel"
-
-#: editor/editor_node.cpp
-msgid "Distraction Free Mode"
-msgstr "Modo livre de distrações"
-
-#: editor/editor_node.cpp
-msgid "Toggle distraction-free mode."
-msgstr "Alternar modo livre de distrações."
-
-#: editor/editor_node.cpp
-msgid "Add a new scene."
-msgstr "Adicionar nova Cena."
-
-#: editor/editor_node.cpp
-msgid "Scene"
-msgstr "Cena"
-
-#: editor/editor_node.cpp
-msgid "Go to previously opened scene."
-msgstr "Ir para Cena aberta anteriormente."
-
-#: editor/editor_node.cpp
-msgid "Copy Text"
-msgstr "Copiar Texto"
-
-#: editor/editor_node.cpp
-msgid "Next tab"
-msgstr "Próxima guia"
-
-#: editor/editor_node.cpp
-msgid "Previous tab"
-msgstr "Guia anterior"
-
-#: editor/editor_node.cpp
-msgid "Filter Files..."
-msgstr "Filtrar Ficheiro..."
-
-#: editor/editor_node.cpp
-msgid "Operations with scene files."
-msgstr "Operações com Ficheiros de Cena."
-
-#: editor/editor_node.cpp
-msgid "New Scene"
-msgstr "Nova Cena"
-
-#: editor/editor_node.cpp
-msgid "New Inherited Scene..."
-msgstr "Nova Cena Herdada..."
-
-#: editor/editor_node.cpp
-msgid "Open Scene..."
-msgstr "Abrir Cena..."
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Open Recent"
-msgstr "Abrir Recente"
-
-#: editor/editor_node.cpp
-msgid "Save Scene"
-msgstr "Guardar Cena"
-
-#: editor/editor_node.cpp
-msgid "Save All Scenes"
-msgstr "Guardar todas as Cenas"
-
-#: editor/editor_node.cpp
-msgid "Convert To..."
-msgstr "Converter Para..."
-
-#: editor/editor_node.cpp
-msgid "MeshLibrary..."
-msgstr "Bib. de Meshes..."
-
-#: editor/editor_node.cpp
-msgid "TileSet..."
-msgstr "TileSet..."
-
-#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Undo"
-msgstr "Desfazer"
-
-#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Redo"
-msgstr "Refazer"
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Reverter Cena"
-
-#: editor/editor_node.cpp
-msgid "Miscellaneous project or scene-wide tools."
-msgstr "Ferramentas diversas de Projeto ou Cena."
-
-#: editor/editor_node.cpp editor/project_manager.cpp
-#: editor/script_create_dialog.cpp
-msgid "Project"
-msgstr "Projeto"
-
-#: editor/editor_node.cpp
-msgid "Project Settings..."
-msgstr "Configurações de Projeto..."
-
-#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-msgid "Version Control"
-msgstr "Controle de Versões"
-
-#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-msgid "Set Up Version Control"
-msgstr "Organizar Controle de Versões"
-
-#: editor/editor_node.cpp
-msgid "Shut Down Version Control"
-msgstr "Desativar Controle de Versões"
-
-#: editor/editor_node.cpp
-msgid "Export..."
-msgstr "Exportar..."
-
-#: editor/editor_node.cpp
-msgid "Install Android Build Template..."
-msgstr "Instalar Modelo Android de Compilação..."
-
-#: editor/editor_node.cpp
-msgid "Open Project Data Folder"
-msgstr "Abrir Pasta de Dados do Projeto"
-
-#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tools"
-msgstr "Ferramentas"
-
-#: editor/editor_node.cpp
-msgid "Orphan Resource Explorer..."
-msgstr "Explorador de Recursos Órfãos..."
-
-#: editor/editor_node.cpp
-msgid "Quit to Project List"
-msgstr "Sair para a lista de Projetos"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/project_export.cpp
-msgid "Debug"
-msgstr "Depurar"
-
-#: editor/editor_node.cpp
-msgid "Deploy with Remote Debug"
-msgstr "Implementar com Depuração Remota"
-
-#: editor/editor_node.cpp
-msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
-msgstr ""
-"Ao exportar ou distribuir, o executável vai tentar ligar-se ao IP deste "
-"computador para depuração."
-
-#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
-msgstr "Pequena distribuição com Network FS"
-
-#: editor/editor_node.cpp
-msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
-"The filesystem will be provided from the project by the editor over the "
-"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
-msgstr ""
-"Quando esta opção é ativada, exportação ou distribuição criará um executável "
-"mínimo.\n"
-"O Sistema de Ficheiros será fornecido ao Projeto pelo Editor sobre a rede.\n"
-"Em Android, a distribuição irá usar a ligação USB para melhor performance. "
-"Esta opção acelera o teste de jogos pesados."
-
-#: editor/editor_node.cpp
-msgid "Visible Collision Shapes"
-msgstr "Formas de Colisão Visíveis"
-
-#: editor/editor_node.cpp
-msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
-msgstr ""
-"Com esta opção ativa, formas de colisão e Nós raycast (para 2D e 3D) serão "
-"visíveis no jogo em execução."
-
-#: editor/editor_node.cpp
-msgid "Visible Navigation"
-msgstr "Navegação Visível"
-
-#: editor/editor_node.cpp
-msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
-msgstr ""
-"Com esta opção ativa, Meshes e Polígonos serão visíveis no jogo em execução."
-
-#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr "Sincronizar Alterações de Cena"
-
-#: editor/editor_node.cpp
-msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
-msgstr ""
-"Com esta opção ativa, alterações da Cena no Editor serão replicadas no jogo "
-"em execução.\n"
-"Quando usada num dispositivo remoto, é mais eficiente com um Sistema de "
-"Ficheiros em rede."
-
-#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr "Sincronizar Alterações de Script"
-
-#: editor/editor_node.cpp
-msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
-msgstr ""
-"Com esta opção ativa, qualquer Script guardado será recarregado no jogo em "
-"execução.\n"
-"Quando usada num dispositivo remoto, é mais eficiente com um Sistema de "
-"Ficheiros em rede."
-
-#: editor/editor_node.cpp editor/script_create_dialog.cpp
-msgid "Editor"
-msgstr "Editor"
-
-#: editor/editor_node.cpp
-msgid "Editor Settings..."
-msgstr "Configurações do Editor..."
-
-#: editor/editor_node.cpp
-msgid "Editor Layout"
-msgstr "Apresentação do Editor"
-
-#: editor/editor_node.cpp
-msgid "Take Screenshot"
-msgstr "Captura do ecrã"
-
-#: editor/editor_node.cpp
-msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr ""
-"Capturas do ecrã são armazenadas na pasta Dados/Configurações do Editor."
-
-#: editor/editor_node.cpp
-msgid "Toggle Fullscreen"
-msgstr "Alternar Ecrã completo"
-
-#: editor/editor_node.cpp
-msgid "Toggle System Console"
-msgstr "Alternar Consola do Sistema"
-
-#: editor/editor_node.cpp
-msgid "Open Editor Data/Settings Folder"
-msgstr "Abrir Pasta do Editor de Dados/Configurações"
-
-#: editor/editor_node.cpp
-msgid "Open Editor Data Folder"
-msgstr "Abrir Pasta de Dados do Editor"
-
-#: editor/editor_node.cpp
-msgid "Open Editor Settings Folder"
-msgstr "Abrir Pasta de Configurações do Editor"
-
-#: editor/editor_node.cpp
-msgid "Manage Editor Features..."
-msgstr "Gerir Características do Editor..."
-
-#: editor/editor_node.cpp
-msgid "Manage Export Templates..."
-msgstr "Gerir Modelos de Exportação..."
-
-#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
-msgid "Help"
-msgstr "Ajuda"
-
-#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
-msgid "Search"
-msgstr "Procurar"
-
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Online Docs"
-msgstr "Documentação Online"
-
-#: editor/editor_node.cpp
-msgid "Q&A"
-msgstr "Perguntas & Respostas"
-
-#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Rastreador de Problemas"
-
-#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
-msgid "Community"
-msgstr "Comunidade"
-
-#: editor/editor_node.cpp
-msgid "About"
-msgstr "Sobre Nós"
-
-#: editor/editor_node.cpp
-msgid "Play the project."
-msgstr "Executa o projeto."
-
-#: editor/editor_node.cpp
-msgid "Play"
-msgstr "Executar"
-
-#: editor/editor_node.cpp
-msgid "Pause the scene execution for debugging."
-msgstr "Pausar a execução da cena para depuração."
-
-#: editor/editor_node.cpp
-msgid "Pause Scene"
-msgstr "Pausar a Cena"
-
-#: editor/editor_node.cpp
-msgid "Stop the scene."
-msgstr "Para a Cena."
-
-#: editor/editor_node.cpp
-msgid "Play the edited scene."
-msgstr "Executa a cena editada."
-
-#: editor/editor_node.cpp
-msgid "Play Scene"
-msgstr "Executar a Cena"
-
-#: editor/editor_node.cpp
-msgid "Play custom scene"
-msgstr "Executa a cena personalizada"
-
-#: editor/editor_node.cpp
-msgid "Play Custom Scene"
-msgstr "Executar Cena Personalizada"
-
-#: editor/editor_node.cpp
-msgid "Changing the video driver requires restarting the editor."
-msgstr "Alterar o driver de vídeo requer reiniciar o editor."
-
-#: editor/editor_node.cpp editor/project_settings_editor.cpp
-#: editor/settings_config_dialog.cpp
-msgid "Save & Restart"
-msgstr "Guardar & Reiniciar"
-
-#: editor/editor_node.cpp
-msgid "Spins when the editor window redraws."
-msgstr "Roda quando a janela do editor atualiza."
-
-#: editor/editor_node.cpp
-msgid "Update Continuously"
-msgstr "Atualização Contínua"
-
-#: editor/editor_node.cpp
-msgid "Update When Changed"
-msgstr "Atualizar quando há Alterações"
-
-#: editor/editor_node.cpp
-msgid "Hide Update Spinner"
-msgstr "Esconder Roleta de Atualização"
-
-#: editor/editor_node.cpp
-msgid "FileSystem"
-msgstr "Sistema de Ficheiros"
-
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspetor"
-
-#: editor/editor_node.cpp
-msgid "Expand Bottom Panel"
-msgstr "Expandir Painel do Fundo"
-
-#: editor/editor_node.cpp
-msgid "Output"
-msgstr "Saída"
-
-#: editor/editor_node.cpp
-msgid "Don't Save"
-msgstr "Não Guardar"
-
-#: editor/editor_node.cpp
-msgid "Android build template is missing, please install relevant templates."
-msgstr "Modelo de compilação Android em falta. Instale os modelos necessários."
-
-#: editor/editor_node.cpp
-msgid "Manage Templates"
-msgstr "Gerir Modelos"
-
-#: editor/editor_node.cpp
-msgid ""
-"This will set up your project for custom Android builds by installing the "
-"source template to \"res://android/build\".\n"
-"You can then apply modifications and build your own custom APK on export "
-"(adding modules, changing the AndroidManifest.xml, etc.).\n"
-"Note that in order to make custom builds instead of using pre-built APKs, "
-"the \"Use Custom Build\" option should be enabled in the Android export "
-"preset."
-msgstr ""
-"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, alterando AndroidManifest.xml, etc.).\n"
-"Repare que de forma a criar compilações personalizadas em vez de usar APKs "
-"pré-compilados, a opção \"Usar Compilação Personalizada\" deve ser ativada "
-"na predefinição da exportação Android."
-
-#: editor/editor_node.cpp
-msgid ""
-"The Android build template is already installed in this project and it won't "
-"be overwritten.\n"
-"Remove the \"res://android/build\" directory manually before attempting this "
-"operation again."
-msgstr ""
-"O modelo de compilação Android já está instalado neste projeto e não será "
-"substituído.\n"
-"Remova manualmente a diretoria \"res://android/build\" antes de repetir esta "
-"operação."
-
-#: editor/editor_node.cpp
-msgid "Import Templates From ZIP File"
-msgstr "Importar Modelos a partir de um Ficheiro ZIP"
-
-#: editor/editor_node.cpp
-msgid "Template Package"
-msgstr "Pacote de Modelo"
-
-#: editor/editor_node.cpp
-msgid "Export Library"
-msgstr "Exportar Biblioteca"
-
-#: editor/editor_node.cpp
-msgid "Merge With Existing"
-msgstr "Fundir com o Existente"
-
-#: editor/editor_node.cpp
-msgid "Open & Run a Script"
-msgstr "Abrir & Executar um Script"
-
-#: editor/editor_node.cpp
-msgid "New Inherited"
-msgstr "Novo Herdado"
-
-#: editor/editor_node.cpp
-msgid "Load Errors"
-msgstr "Carregar Erros"
-
-#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
-msgid "Select"
-msgstr "Selecionar"
-
-#: editor/editor_node.cpp
-msgid "Open 2D Editor"
-msgstr "Abrir Editor 2D"
-
-#: editor/editor_node.cpp
-msgid "Open 3D Editor"
-msgstr "Abrir Editor 3D"
-
-#: editor/editor_node.cpp
-msgid "Open Script Editor"
-msgstr "Abrir Editor de Scripts"
-
-#: editor/editor_node.cpp editor/project_manager.cpp
-msgid "Open Asset Library"
-msgstr "Abrir Biblioteca de Ativos"
-
-#: editor/editor_node.cpp
-msgid "Open the next Editor"
-msgstr "Abrir o Editor seguinte"
-
-#: editor/editor_node.cpp
-msgid "Open the previous Editor"
-msgstr "Abrir o Editor anterior"
-
-#: editor/editor_node.h
-msgid "Warning!"
-msgstr "Aviso!"
-
-#: editor/editor_path.cpp
-msgid "No sub-resources found."
-msgstr "Sub-recurso não encontrado."
-
-#: editor/editor_plugin.cpp
-msgid "Creating Mesh Previews"
-msgstr "A criar pré-visualizações de Malha"
-
-#: editor/editor_plugin.cpp
-msgid "Thumbnail..."
-msgstr "Miniatura..."
-
-#: editor/editor_plugin_settings.cpp
-msgid "Main Script:"
-msgstr "Script principal:"
-
-#: editor/editor_plugin_settings.cpp
-msgid "Edit Plugin"
-msgstr "Editar Plugin"
-
-#: editor/editor_plugin_settings.cpp
-msgid "Installed Plugins:"
-msgstr "Plugins Instalados:"
-
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-msgid "Update"
-msgstr "Atualizar"
-
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Version:"
-msgstr "Versão:"
-
-#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
-msgid "Author:"
-msgstr "Autor:"
-
-#: editor/editor_plugin_settings.cpp
-msgid "Status:"
-msgstr "Estado:"
-
-#: editor/editor_plugin_settings.cpp
-msgid "Edit:"
-msgstr "Editar:"
-
-#: editor/editor_profiler.cpp
-msgid "Measure:"
-msgstr "Medida:"
-
-#: editor/editor_profiler.cpp
-msgid "Frame Time (sec)"
-msgstr "Tempo do Frame (seg)"
-
-#: editor/editor_profiler.cpp
-msgid "Average Time (sec)"
-msgstr "Tempo Médio (seg)"
-
-#: editor/editor_profiler.cpp
-msgid "Frame %"
-msgstr "Frame %"
-
-#: editor/editor_profiler.cpp
-msgid "Physics Frame %"
-msgstr "Frame de Física %"
-
-#: editor/editor_profiler.cpp
-msgid "Inclusive"
-msgstr "Inclusivo"
-
-#: editor/editor_profiler.cpp
-msgid "Self"
-msgstr "Auto"
-
-#: editor/editor_profiler.cpp
-msgid "Frame #:"
-msgstr "Frame #:"
-
-#: editor/editor_profiler.cpp
-msgid "Time"
-msgstr "Tempo"
-
-#: editor/editor_profiler.cpp
-msgid "Calls"
-msgstr "Chamadas"
-
-#: editor/editor_properties.cpp
-msgid "Edit Text:"
-msgstr "Editar Texto:"
-
-#: editor/editor_properties.cpp editor/script_create_dialog.cpp
-msgid "On"
-msgstr "On"
-
-#: editor/editor_properties.cpp
-msgid "Layer"
-msgstr "Camada"
-
-#: editor/editor_properties.cpp
-msgid "Bit %d, value %d"
-msgstr "Bit %d, valor %d"
-
-#: editor/editor_properties.cpp
-msgid "[Empty]"
-msgstr "[Vazio]"
-
-#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign..."
-msgstr "Atribuir..."
-
-#: editor/editor_properties.cpp
-msgid "Invalid RID"
-msgstr "RID inválido"
-
-#: editor/editor_properties.cpp
-msgid ""
-"The selected resource (%s) does not match any type expected for this "
-"property (%s)."
-msgstr ""
-"O recurso selecionado (%s) não corresponde a qualquer tipo esperado para "
-"esta propriedade (%s)."
-
-#: editor/editor_properties.cpp
-msgid ""
-"Can't create a ViewportTexture on resources saved as a file.\n"
-"Resource needs to belong to a scene."
-msgstr ""
-"Não se consegue criar Textura Viewport em recursos guardados como ficheiro.\n"
-"O recurso tem de pertencer a uma cena."
-
-#: editor/editor_properties.cpp
-msgid ""
-"Can't create a ViewportTexture on this resource because it's not set as "
-"local to scene.\n"
-"Please switch on the 'local to scene' property on it (and all resources "
-"containing it up to a node)."
-msgstr ""
-"Não se consegue criar Textura Viewport neste recurso porque não está "
-"definido na cena como local.\n"
-"Ative a sua propriedade 'local to scene' (e em todos os recursos que o "
-"contêm até a um Nó)."
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Pick a Viewport"
-msgstr "Escolha uma Vista"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "New Script"
-msgstr "Novo Script"
-
-#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-msgid "Extend Script"
-msgstr "Estender Script"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "New %s"
-msgstr "Novo %s"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Make Unique"
-msgstr "Fazer único"
-
-#: editor/editor_properties.cpp
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
-#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
-msgid "Paste"
-msgstr "Colar"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Convert To %s"
-msgstr "Converter em %s"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Selected node is not a Viewport!"
-msgstr "Nó selecionado não é uma Vista!"
-
-#: editor/editor_properties_array_dict.cpp
-msgid "Size: "
-msgstr "Tamanho: "
-
-#: editor/editor_properties_array_dict.cpp
-msgid "Page: "
-msgstr "Página: "
-
-#: editor/editor_properties_array_dict.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Remove Item"
-msgstr "Remover item"
-
-#: editor/editor_properties_array_dict.cpp
-msgid "New Key:"
-msgstr "Nova Chave:"
-
-#: editor/editor_properties_array_dict.cpp
-msgid "New Value:"
-msgstr "Novo Valor:"
-
-#: editor/editor_properties_array_dict.cpp
-msgid "Add Key/Value Pair"
-msgstr "Adicionar Par Chave/Valor"
-
-#: editor/editor_run_native.cpp
-msgid ""
-"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
-msgstr ""
-"Não foi encontrado um executável de exportação para esta plataforma.\n"
-"Adicione um executável pré-definido no menu de exportação."
-
-#: editor/editor_run_script.cpp
-msgid "Write your logic in the _run() method."
-msgstr "Escreva a sua lógica no Método _run()."
-
-#: editor/editor_run_script.cpp
-msgid "There is an edited scene already."
-msgstr "Já existe uma Cena editada."
-
-#: editor/editor_run_script.cpp
-msgid "Couldn't instance script:"
-msgstr "Não foi possível instanciar o Script:"
-
-#: editor/editor_run_script.cpp
-msgid "Did you forget the 'tool' keyword?"
-msgstr "Esqueceu-se da palavra chave 'tool'?"
-
-#: editor/editor_run_script.cpp
-msgid "Couldn't run script:"
-msgstr "Não foi possível executar o Script:"
-
-#: editor/editor_run_script.cpp
-msgid "Did you forget the '_run' method?"
-msgstr "Esqueceu-se do médodo '_run'?"
-
-#: editor/editor_sub_scene.cpp
-msgid "Select Node(s) to Import"
-msgstr "Selecionar Nó(s) para importar"
-
-#: editor/editor_sub_scene.cpp editor/project_manager.cpp
-msgid "Browse"
-msgstr "Navegar"
-
-#: editor/editor_sub_scene.cpp
-msgid "Scene Path:"
-msgstr "Caminho da Cena:"
-
-#: editor/editor_sub_scene.cpp
-msgid "Import From Node:"
-msgstr "Importar do Nó:"
-
-#: editor/export_template_manager.cpp
-msgid "Redownload"
-msgstr "Retransferir"
-
-#: editor/export_template_manager.cpp
-msgid "Uninstall"
-msgstr "Desinstalar"
-
-#: editor/export_template_manager.cpp
-msgid "(Installed)"
-msgstr "(Instalado)"
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Download"
-msgstr "Download"
-
-#: editor/export_template_manager.cpp
-msgid "Official export templates aren't available for development builds."
-msgstr ""
-"Modelos de exportação oficiais não estão disponíveis para compilações de "
-"desenvolvimento."
-
-#: editor/export_template_manager.cpp
-msgid "(Missing)"
-msgstr "(Em Falta)"
-
-#: editor/export_template_manager.cpp
-msgid "(Current)"
-msgstr "(Atual)"
-
-#: editor/export_template_manager.cpp
-msgid "Retrieving mirrors, please wait..."
-msgstr "A readquirir servidores, espere por favor..."
-
-#: editor/export_template_manager.cpp
-msgid "Remove template version '%s'?"
-msgstr "Remover versão '%s' do Modelo?"
-
-#: editor/export_template_manager.cpp
-msgid "Can't open export templates zip."
-msgstr "Impossível abrir o zip de Modelos."
-
-#: editor/export_template_manager.cpp
-msgid "Invalid version.txt format inside templates: %s."
-msgstr "Formato de version.txt inválido dentro dos modelos: %s."
-
-#: editor/export_template_manager.cpp
-msgid "No version.txt found inside templates."
-msgstr "Não foi encontrado version.txt dentro dos Modelos."
-
-#: editor/export_template_manager.cpp
-msgid "Error creating path for templates:"
-msgstr "Erro ao criar o Caminho para os Modelos:"
-
-#: editor/export_template_manager.cpp
-msgid "Extracting Export Templates"
-msgstr "A Extrair os Modelos de Exportação"
-
-#: editor/export_template_manager.cpp
-msgid "Importing:"
-msgstr "A Importar:"
-
-#: editor/export_template_manager.cpp
-msgid "Error getting the list of mirrors."
-msgstr "Erro na receção da lista de mirrors."
-
-#: editor/export_template_manager.cpp
-msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
-"Erro ao analisar a lista de mirrors JSON. Por favor comunique o problema!"
-
-#: editor/export_template_manager.cpp
-msgid ""
-"No download links found for this version. Direct download is only available "
-"for official releases."
-msgstr ""
-"Não foram encontrados ligações para download para esta versão. Download "
-"direto está apenas disponível para os lançamentos oficiais."
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve."
-msgstr "Impossível resolver."
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't connect."
-msgstr "Impossível conectar."
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "No response."
-msgstr "Sem resposta."
-
-#: editor/export_template_manager.cpp
-msgid "Request Failed."
-msgstr "Pedido falhado."
-
-#: editor/export_template_manager.cpp
-msgid "Redirect Loop."
-msgstr "Redirecionar ciclo."
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Failed:"
-msgstr "Falhou:"
-
-#: editor/export_template_manager.cpp
-msgid "Download Complete."
-msgstr "Download Completo."
-
-#: editor/export_template_manager.cpp
-msgid "Cannot remove temporary file:"
-msgstr "Impossível remover ficheiro temporário:"
-
-#: editor/export_template_manager.cpp
-msgid ""
-"Templates installation failed.\n"
-"The problematic templates archives can be found at '%s'."
-msgstr ""
-"Falhou a instalação de Modelos.\n"
-"Os ficheiros problemáticos podem ser encontrados em '%s'."
-
-#: editor/export_template_manager.cpp
-msgid "Error requesting URL:"
-msgstr "Erro ao solicitar URL:"
-
-#: editor/export_template_manager.cpp
-msgid "Connecting to Mirror..."
-msgstr "A ligar ao servidor..."
-
-#: editor/export_template_manager.cpp
-msgid "Disconnected"
-msgstr "Desconectado"
-
-#: editor/export_template_manager.cpp
-msgid "Resolving"
-msgstr "A resolver"
-
-#: editor/export_template_manager.cpp
-msgid "Can't Resolve"
-msgstr "Impossível resolver"
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Connecting..."
-msgstr "A ligar..."
-
-#: editor/export_template_manager.cpp
-msgid "Can't Connect"
-msgstr "Impossível conetar"
-
-#: editor/export_template_manager.cpp
-msgid "Connected"
-msgstr "Ligado"
-
-#: editor/export_template_manager.cpp
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Requesting..."
-msgstr "A solicitar..."
-
-#: editor/export_template_manager.cpp
-msgid "Downloading"
-msgstr "A transferir"
-
-#: editor/export_template_manager.cpp
-msgid "Connection Error"
-msgstr "Erro de Ligação"
-
-#: editor/export_template_manager.cpp
-msgid "SSL Handshake Error"
-msgstr "Erro SSL Handshake"
-
-#: editor/export_template_manager.cpp
-msgid "Uncompressing Android Build Sources"
-msgstr "A descompactar Fontes da Compilação Android"
-
-#: editor/export_template_manager.cpp
-msgid "Current Version:"
-msgstr "Versão Atual:"
-
-#: editor/export_template_manager.cpp
-msgid "Installed Versions:"
-msgstr "Versões Instaladas:"
-
-#: editor/export_template_manager.cpp
-msgid "Install From File"
-msgstr "Instalar do Ficheiro"
-
-#: editor/export_template_manager.cpp
-msgid "Remove Template"
-msgstr "Remover Modelo"
-
-#: editor/export_template_manager.cpp
-msgid "Select Template File"
-msgstr "Selecionar Ficheiro de Modelo"
-
-#: editor/export_template_manager.cpp
-msgid "Godot Export Templates"
-msgstr "Modelos de Exportação Godot"
-
-#: editor/export_template_manager.cpp
-msgid "Export Template Manager"
-msgstr "Exportar Gestor de Modelos"
-
-#: editor/export_template_manager.cpp
-msgid "Download Templates"
-msgstr "Transferir Modelos"
-
-#: editor/export_template_manager.cpp
-msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Selecionar servidor da lista: (Shift+Click: Abrir no Navegador)"
-
-#: editor/filesystem_dock.cpp
-msgid "Favorites"
-msgstr "Favoritos"
-
-#: editor/filesystem_dock.cpp
-msgid "Status: Import of file failed. Please fix file and reimport manually."
-msgstr ""
-"Estado: A importação do Ficheiro falhou. Corrija o Ficheiro e importe "
-"manualmente."
-
-#: editor/filesystem_dock.cpp
-msgid "Cannot move/rename resources root."
-msgstr "Não foi possível mover/renomear raíz dos recursos."
-
-#: editor/filesystem_dock.cpp
-msgid "Cannot move a folder into itself."
-msgstr "Não pode mover uma pasta para si mesma."
-
-#: editor/filesystem_dock.cpp
-msgid "Error moving:"
-msgstr "Erro ao mover:"
-
-#: editor/filesystem_dock.cpp
-msgid "Error duplicating:"
-msgstr "Erro ao duplicar:"
-
-#: editor/filesystem_dock.cpp
-msgid "Unable to update dependencies:"
-msgstr "Incapaz de atualizar dependências:"
-
-#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
-msgid "No name provided."
-msgstr "Nome não fornecido."
-
-#: editor/filesystem_dock.cpp
-msgid "Provided name contains invalid characters."
-msgstr "O nome fornecido contém carateres inválidos."
-
-#: editor/filesystem_dock.cpp
-msgid "A file or folder with this name already exists."
-msgstr "Um Ficheiro ou diretoria já existe com este nome."
-
-#: editor/filesystem_dock.cpp
-msgid "Name contains invalid characters."
-msgstr "O nome contém carateres inválidos."
-
-#: editor/filesystem_dock.cpp
-msgid "Renaming file:"
-msgstr "Mudar nome do Ficheiro:"
-
-#: editor/filesystem_dock.cpp
-msgid "Renaming folder:"
-msgstr "Renomear diretoria:"
-
-#: editor/filesystem_dock.cpp
-msgid "Duplicating file:"
-msgstr "A duplicar Ficheiro:"
-
-#: editor/filesystem_dock.cpp
-msgid "Duplicating folder:"
-msgstr "A duplicar Diretoria:"
-
-#: editor/filesystem_dock.cpp
-msgid "New Inherited Scene"
-msgstr "Nova Cena Herdada"
-
-#: editor/filesystem_dock.cpp
-msgid "Set As Main Scene"
-msgstr "Definir Como Cena Principal"
-
-#: editor/filesystem_dock.cpp
-msgid "Open Scenes"
-msgstr "Abrir Cenas"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr "Instância"
-
-#: editor/filesystem_dock.cpp
-msgid "Add to Favorites"
-msgstr "Adicionar aos Favoritos"
-
-#: editor/filesystem_dock.cpp
-msgid "Remove from Favorites"
-msgstr "Remover dos Favoritos"
-
-#: editor/filesystem_dock.cpp
-msgid "Edit Dependencies..."
-msgstr "Editar Dependências..."
-
-#: editor/filesystem_dock.cpp
-msgid "View Owners..."
-msgstr "Ver proprietários..."
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Renomear..."
-
-#: editor/filesystem_dock.cpp
-msgid "Duplicate..."
-msgstr "Duplicar..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Mover para..."
-
-#: editor/filesystem_dock.cpp
-msgid "New Scene..."
-msgstr "Nova Cena..."
-
-#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-msgid "New Script..."
-msgstr "Novo Script..."
-
-#: editor/filesystem_dock.cpp
-msgid "New Resource..."
-msgstr "Novo Recurso..."
-
-#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
-#: editor/script_editor_debugger.cpp
-msgid "Expand All"
-msgstr "Expandir Tudo"
-
-#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
-#: editor/script_editor_debugger.cpp
-msgid "Collapse All"
-msgstr "Colapsar Tudo"
-
-#: editor/filesystem_dock.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/project_manager.cpp editor/rename_dialog.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Rename"
-msgstr "Renomear"
-
-#: editor/filesystem_dock.cpp
-msgid "Previous Folder/File"
-msgstr "Pasta/Ficheiro Anterior"
-
-#: editor/filesystem_dock.cpp
-msgid "Next Folder/File"
-msgstr "Próxima Pasta/Ficheiro"
-
-#: editor/filesystem_dock.cpp
-msgid "Re-Scan Filesystem"
-msgstr "Carregar novamente o Sistema de Ficheiros"
-
-#: editor/filesystem_dock.cpp
-msgid "Toggle Split Mode"
-msgstr "Alternar Modo de Divisão"
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr "Procurar ficheiros"
-
-#: editor/filesystem_dock.cpp
-msgid ""
-"Scanning Files,\n"
-"Please Wait..."
-msgstr ""
-"A analisar Ficheiros,\n"
-"Espere, por favor..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move"
-msgstr "Mover"
-
-#: editor/filesystem_dock.cpp
-msgid "There is already file or folder with the same name in this location."
-msgstr "Já existe um ficheiro ou pasta com o mesmo nome nesta localização."
-
-#: editor/filesystem_dock.cpp
-msgid "Overwrite"
-msgstr "Sobrescrever"
-
-#: editor/filesystem_dock.cpp
-msgid "Create Scene"
-msgstr "Criar Cena"
-
-#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Create Script"
-msgstr "Criar Script"
-
-#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Find in Files"
-msgstr "Localizar em Ficheiros"
-
-#: editor/find_in_files.cpp
-msgid "Find:"
-msgstr "Localizar:"
-
-#: editor/find_in_files.cpp
-msgid "Folder:"
-msgstr "Pasta:"
-
-#: editor/find_in_files.cpp
-msgid "Filters:"
-msgstr "Filtros:"
-
-#: editor/find_in_files.cpp
-msgid ""
-"Include the files with the following extensions. Add or remove them in "
-"ProjectSettings."
-msgstr ""
-"Inclui os ficheiros com as seguintes extensões. Adicione ou remova-os em "
-"ProjectSettings."
-
-#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-msgid "Find..."
-msgstr "Localizar..."
-
-#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
-msgid "Replace..."
-msgstr "Substituir..."
-
-#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr "Localizar: "
-
-#: editor/find_in_files.cpp
-msgid "Replace: "
-msgstr "Substituir: "
-
-#: editor/find_in_files.cpp
-msgid "Replace all (no undo)"
-msgstr "Substituir tudo (não há desfazer)"
-
-#: editor/find_in_files.cpp
-msgid "Searching..."
-msgstr "A procurar..."
-
-#: editor/find_in_files.cpp
-msgid "Search complete"
-msgstr "Pesquisa completa"
-
-#: editor/groups_editor.cpp
-msgid "Add to Group"
-msgstr "Adicionar ao Grupo"
-
-#: editor/groups_editor.cpp
-msgid "Remove from Group"
-msgstr "Remover do Grupo"
-
-#: editor/groups_editor.cpp
-msgid "Group name already exists."
-msgstr "Já existe o nome de grupo ."
-
-#: editor/groups_editor.cpp
-msgid "Invalid group name."
-msgstr "Nome de grupo inválido."
-
-#: editor/groups_editor.cpp
-msgid "Rename Group"
-msgstr "Renomear Grupo"
-
-#: editor/groups_editor.cpp
-msgid "Delete Group"
-msgstr "Apagar Grupo"
-
-#: editor/groups_editor.cpp editor/node_dock.cpp
-msgid "Groups"
-msgstr "Grupos"
-
-#: editor/groups_editor.cpp
-msgid "Nodes Not in Group"
-msgstr "Nós fora do Grupo"
-
-#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
-#: editor/scene_tree_editor.cpp
-msgid "Filter nodes"
-msgstr "Filtrar Nós"
-
-#: editor/groups_editor.cpp
-msgid "Nodes in Group"
-msgstr "Nós no Grupo"
-
-#: editor/groups_editor.cpp
-msgid "Empty groups will be automatically removed."
-msgstr "Grupos vazios serão removidos automaticamente."
-
-#: editor/groups_editor.cpp
-msgid "Group Editor"
-msgstr "Editor de Grupo"
-
-#: editor/groups_editor.cpp
-msgid "Manage Groups"
-msgstr "Gerir Grupos"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import as Single Scene"
-msgstr "Importar como Cena única"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Animations"
-msgstr "Importar com Animações separadas"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Materials"
-msgstr "Importar com Materiais separados"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects"
-msgstr "Importar com Objetos separados"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects+Materials"
-msgstr "Importar com Objetos e Materiais separados"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects+Animations"
-msgstr "Importar com Objetos e Animações separados"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Materials+Animations"
-msgstr "Importar com Materiais e Animações separados"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import with Separate Objects+Materials+Animations"
-msgstr "Importar com Objetos, Materiais e Animações separados"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import as Multiple Scenes"
-msgstr "Importar como Cenas Múltiplas"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Import as Multiple Scenes+Materials"
-msgstr "Importar como Cenas e Materiais Múltiplos"
-
-#: editor/import/resource_importer_scene.cpp
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Import Scene"
-msgstr "Importar Cena"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Importing Scene..."
-msgstr "A importar Cena..."
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Generating Lightmaps"
-msgstr "A gerar Lightmaps"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Generating for Mesh: "
-msgstr "A gerar para Malha: "
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Running Custom Script..."
-msgstr "A executar Script Customizado..."
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Couldn't load post-import script:"
-msgstr "Não se conseguiu carregar o Script de pós-importação:"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Invalid/broken script for post-import (check console):"
-msgstr "Script inválido/danificado para pós-importação (verificar consola):"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Error running post-import script:"
-msgstr "Erro na execução do Script de pós-importação:"
-
-#: editor/import/resource_importer_scene.cpp
-msgid "Saving..."
-msgstr "A guardar..."
-
-#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr "Definir como Padrão para '%s'"
-
-#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
-msgstr "Limpar Padrão para '%s'"
-
-#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Ficheiros"
-
-#: editor/import_dock.cpp
-msgid "Import As:"
-msgstr "Importar Como:"
-
-#: editor/import_dock.cpp
-msgid "Preset"
-msgstr "Predefinições"
-
-#: editor/import_dock.cpp
-msgid "Reimport"
-msgstr "Reimportar"
-
-#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Guardar cenas, reimportar e reiniciar"
-
-#: editor/import_dock.cpp
-msgid "Changing the type of an imported file requires editor restart."
-msgstr "Alterar o tipo de um ficheiro importado requer reiniciar o editor."
-
-#: editor/import_dock.cpp
-msgid ""
-"WARNING: Assets exist that use this resource, they may stop loading properly."
-msgstr ""
-"AVISO: Existem Ativos que usam este recurso, podendo não ser carregados "
-"corretamente."
-
-#: editor/inspector_dock.cpp
-msgid "Failed to load resource."
-msgstr "Falha ao carregar recurso."
-
-#: editor/inspector_dock.cpp
-msgid "Expand All Properties"
-msgstr "Expandir Todas as Propriedades"
-
-#: editor/inspector_dock.cpp
-msgid "Collapse All Properties"
-msgstr "Colapsar Todas as Propriedades"
-
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save As..."
-msgstr "Guardar Como..."
-
-#: editor/inspector_dock.cpp
-msgid "Copy Params"
-msgstr "Copiar Parâmetros"
-
-#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Colar Parâmetros"
-
-#: editor/inspector_dock.cpp
-msgid "Edit Resource Clipboard"
-msgstr "Editar Área de Transferência de Recursos"
-
-#: editor/inspector_dock.cpp
-msgid "Copy Resource"
-msgstr "Copiar Recurso"
-
-#: editor/inspector_dock.cpp
-msgid "Make Built-In"
-msgstr "Tornar incorporado"
-
-#: editor/inspector_dock.cpp
-msgid "Make Sub-Resources Unique"
-msgstr "Tornar sub-recursos únicos"
-
-#: editor/inspector_dock.cpp
-msgid "Open in Help"
-msgstr "Abrir em Ajuda"
-
-#: editor/inspector_dock.cpp
-msgid "Create a new resource in memory and edit it."
-msgstr "Crie um novo recurso em memória edite-o."
-
-#: editor/inspector_dock.cpp
-msgid "Load an existing resource from disk and edit it."
-msgstr "Carregue um recurso existente a partir do disco e edite-o."
-
-#: editor/inspector_dock.cpp
-msgid "Save the currently edited resource."
-msgstr "Guarde o recurso editado."
-
-#: editor/inspector_dock.cpp
-msgid "Go to the previous edited object in history."
-msgstr "Ir para o Objeto editado anteriormente no histórico."
-
-#: editor/inspector_dock.cpp
-msgid "Go to the next edited object in history."
-msgstr "Ir para o próximo Objeto editado no histórico."
-
-#: editor/inspector_dock.cpp
-msgid "History of recently edited objects."
-msgstr "Histórico de Objetos recentemente editados."
-
-#: editor/inspector_dock.cpp
-msgid "Object properties."
-msgstr "Propriedades do Objeto."
-
-#: editor/inspector_dock.cpp
-msgid "Filter properties"
-msgstr "Propriedades do Filtro"
-
-#: editor/inspector_dock.cpp
-msgid "Changes may be lost!"
-msgstr "As alterações podem ser perdidas!"
-
-#: editor/multi_node_edit.cpp
-msgid "MultiNode Set"
-msgstr "Conjunto MultiNode"
-
-#: editor/node_dock.cpp
-msgid "Select a single node to edit its signals and groups."
-msgstr "Selecione um único nó para editar sinais e grupos."
-
-#: editor/plugin_config_dialog.cpp
-msgid "Edit a Plugin"
-msgstr "Editar Plugin"
-
-#: editor/plugin_config_dialog.cpp
-msgid "Create a Plugin"
-msgstr "Criar Plugin"
-
-#: editor/plugin_config_dialog.cpp
-msgid "Plugin Name:"
-msgstr "Nome do Plugin:"
-
-#: editor/plugin_config_dialog.cpp
-msgid "Subfolder:"
-msgstr "Sub-pasta:"
-
-#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
-msgid "Language:"
-msgstr "Linguagem:"
-
-#: editor/plugin_config_dialog.cpp
-msgid "Script Name:"
-msgstr "Nome do Script:"
-
-#: editor/plugin_config_dialog.cpp
-msgid "Activate now?"
-msgstr "Ativar agora?"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon"
-msgstr "Criar Polígono"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Create points."
-msgstr "Criar pontos."
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid ""
-"Edit points.\n"
-"LMB: Move Point\n"
-"RMB: Erase Point"
-msgstr ""
-"Editar Polígono:\n"
-"LMB: Mover Ponto\n"
-"RMB: Apagar Ponto"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
-msgstr "Apagar pontos."
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Edit Polygon"
-msgstr "Editar Polígono"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Insert Point"
-msgstr "Inserir Ponto"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Edit Polygon (Remove Point)"
-msgstr "Editar Polígono (Remover Ponto)"
-
-#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Polygon And Point"
-msgstr "Remover Polígono e Ponto"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Animation"
-msgstr "Adicionar Animação"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load..."
-msgstr "Carregar..."
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Move Node Point"
-msgstr "Mover Ponto Nó"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Change BlendSpace1D Limits"
-msgstr "Mudar Limites do BlendSpace1D"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Change BlendSpace1D Labels"
-msgstr "Mudar Legendas do BlendSpace1D"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr "Este tipo de nó não pode ser usado. Apenas nós raiz são permitidos."
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Add Node Point"
-msgstr "Adicionar Ponto Nó"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Add Animation Point"
-msgstr "Adicionar Ponto Animação"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Remove BlendSpace1D Point"
-msgstr "Remover Ponto de BlendSpace1D"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Move BlendSpace1D Node Point"
-msgstr "Mover Ponto Nó em BlendSpace1D"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid ""
-"AnimationTree is inactive.\n"
-"Activate to enable playback, check node warnings if activation fails."
-msgstr ""
-"AnimationTree está inativa.\n"
-"Active-a para permitir a reprodução, verifique avisos do nó se a ativação "
-"falhar."
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Set the blending position within the space"
-msgstr "Definir a posição de mistura dentro do espaço"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Select and move points, create points with RMB."
-msgstr "Selecionar e mover pontos, criar pontos com RMB."
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
-msgid "Enable snap and show grid."
-msgstr "Ativar ajuste e mostrar a grelha."
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Point"
-msgstr "Ponto"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Open Editor"
-msgstr "Abrir Editor"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Open Animation Node"
-msgstr "Abrir Nó Animação"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Triangle already exists."
-msgstr "Já existe triângulo."
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Add Triangle"
-msgstr "Adicionar Triângulo"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Change BlendSpace2D Limits"
-msgstr "Mudar Limites do BlendSpace2D"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Change BlendSpace2D Labels"
-msgstr "Mudar Legendas do BlendSpace2D"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Remove BlendSpace2D Point"
-msgstr "Remover Ponto do BlendSpace2D"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Remove BlendSpace2D Triangle"
-msgstr "Remover Triângulo do BlendSpace2D"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr "BlendSpace2D não pertence a um nó AnimationTree."
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "No triangles exist, so no blending can take place."
-msgstr "Não existem triângulos, nenhuma mistura pode ocorrer."
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Toggle Auto Triangles"
-msgstr "Alternar Triângulos Auto"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Create triangles by connecting points."
-msgstr "Criar triângulos ligando pontos."
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Erase points and triangles."
-msgstr "Apagar pontos e triângulos."
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Generate blend triangles automatically (instead of manually)"
-msgstr "Gera triângulos automaticamente (em vez de manual)"
-
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Mistura:"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Parameter Changed"
-msgstr "Mudança de Parâmetro"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Edit Filters"
-msgstr "Editar filtros"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Output node can't be added to the blend tree."
-msgstr "Saída do nó não pode ser adicionada à árvore de mistura."
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Add Node to BlendTree"
-msgstr "Adicionar Nó a BlendTree"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Node Moved"
-msgstr "Nó Movido"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
-"Incapaz de conectar, porta pode estar em uso ou conexão pode ser inválida."
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Nodes Connected"
-msgstr "Nós Conectados"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Nodes Disconnected"
-msgstr "Nós Desconectados"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Set Animation"
-msgstr "Definir Animação"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Node"
-msgstr "Apagar Nó"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Delete Node(s)"
-msgstr "Apagar Nó(s)"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Toggle Filter On/Off"
-msgstr "Alternar Filtro On/Off"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Change Filter"
-msgstr "Alterar Filtro"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "No animation player set, so unable to retrieve track names."
-msgstr ""
-"Reprodutor de animação não definido, sendo incapaz de recolher nome das "
-"faixas."
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
-"Caminho do reprodutor é inválido, sendo incapaz de recolher nome das faixas."
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/root_motion_editor_plugin.cpp
-msgid ""
-"Animation player has no valid root node path, so unable to retrieve track "
-"names."
-msgstr ""
-"Reprodutor de animação não tem um caminha de nó raiz válido, sendo incapaz "
-"de recolher nome das faixas."
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Anim Clips"
-msgstr "Clips Anim"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Audio Clips"
-msgstr "Clips Áudio"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Functions"
-msgstr "Funções"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Node Renamed"
-msgstr "Nó Renomeado"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node..."
-msgstr "Adicionar Nó.."
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#: editor/plugins/root_motion_editor_plugin.cpp
-msgid "Edit Filtered Tracks:"
-msgstr "Editar Pistas Filtradas:"
-
-#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-msgid "Enable Filtering"
-msgstr "Ativar Filtragem"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Toggle Autoplay"
-msgstr "Alternar reprodução automática"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "New Animation Name:"
-msgstr "Novo Nome da Animação:"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "New Anim"
-msgstr "Nova Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Change Animation Name:"
-msgstr "Mudar o Nome da Animação:"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Delete Animation?"
-msgstr "Apagar Animação?"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Remove Animation"
-msgstr "Remover Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Invalid animation name!"
-msgstr "Nome de Animação inválido!"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation name already exists!"
-msgstr "Já existe o nome da Animação!"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Rename Animation"
-msgstr "Renomear Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Blend Next Changed"
-msgstr "Misturar Seguinte Alterado"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Change Blend Time"
-msgstr "Mudar tempo de Mistura"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Load Animation"
-msgstr "Carregar Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Duplicate Animation"
-msgstr "Duplicar Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "No animation to copy!"
-msgstr "Nenhuma animação para copiar!"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "No animation resource on clipboard!"
-msgstr "Nenhum recurso de animação na Área de Transferência!"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Pasted Animation"
-msgstr "Animação Colada"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Paste Animation"
-msgstr "Colar Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "No animation to edit!"
-msgstr "Nenhuma animação para editar!"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Play selected animation backwards from current pos. (A)"
-msgstr ""
-"Reproduzir a Animação selecionada para trás a partir da presente posição. (A)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "Reproduzir a Animação selecionada para trás a partir do fim. (Shift+A)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Stop animation playback. (S)"
-msgstr "Parar reprodução da Animação. (S)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Play selected animation from start. (Shift+D)"
-msgstr "Reproduzir a Animação selecionada a partir do início. (Shift+D)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Play selected animation from current pos. (D)"
-msgstr "Reproduzir a Animação selecionada a partir da presente posição. (D)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation position (in seconds)."
-msgstr "Posição da Animação (em segundos)."
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Scale animation playback globally for the node."
-msgstr "Escalar globalmente a reprodução da Animação para o Nó."
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation Tools"
-msgstr "Ferramentas de Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation"
-msgstr "Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Edit Transitions..."
-msgstr "Editar Transições..."
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Open in Inspector"
-msgstr "Abrir no Inspetor"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Display list of animations in player."
-msgstr "Mostrar lista de Animações no reprodutor."
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Autoplay on Load"
-msgstr "Reprodução automática no carregamento"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Enable Onion Skinning"
-msgstr "Ativar Onion Skinning"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Onion Skinning Options"
-msgstr "Opções de Onion Skinning"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Directions"
-msgstr "Direções"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Past"
-msgstr "Passado"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Future"
-msgstr "Futuro"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Depth"
-msgstr "Profundidade"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "1 step"
-msgstr "1 passo"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "2 steps"
-msgstr "2 passos"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "3 steps"
-msgstr "3 passos"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Differences Only"
-msgstr "Apenas diferenças"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Force White Modulate"
-msgstr "Forçar modulação branca"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Include Gizmos (3D)"
-msgstr "Incluir ferramentas (3D)"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Pin AnimationPlayer"
-msgstr "Pregar AnimationPlayer"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Create New Animation"
-msgstr "Criar Nova Animação"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Animation Name:"
-msgstr "Nome da Animação:"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
-msgid "Error!"
-msgstr "Erro!"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Blend Times:"
-msgstr "Tempos de Mistura:"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Next (Auto Queue):"
-msgstr "Próximo (Auto-Fila):"
-
-#: editor/plugins/animation_player_editor_plugin.cpp
-msgid "Cross-Animation Blend Times"
-msgstr "Tempos de Mistura de Animação cruzada"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Move Node"
-msgstr "Mover Nó"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Transition exists!"
-msgstr "Transição existe!"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Add Transition"
-msgstr "Adicionar Transição"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Node"
-msgstr "Adicionar Nó"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "End"
-msgstr "Fim"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Immediate"
-msgstr "Imediato"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Sync"
-msgstr "Sinc"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "At End"
-msgstr "No Fim"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Travel"
-msgstr "Viagem"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Start and end nodes are needed for a sub-transition."
-msgstr "Nodos de início e fim são necessários para uma sub-transição."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "No playback resource set at path: %s."
-msgstr "Nenhum recurso de playback definido no caminho: %s."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Node Removed"
-msgstr "Nó Removido"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Transition Removed"
-msgstr "Transição Removida"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Set Start Node (Autoplay)"
-msgstr "Definir Nó de Início (Reprodução Automática)"
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid ""
-"Select and move nodes.\n"
-"RMB to add new nodes.\n"
-"Shift+LMB to create connections."
-msgstr ""
-"Selecionar e mover nós.\n"
-"RMB para adicionar novos nós.\n"
-"Shift+LMB para criar conexões."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Create new nodes."
-msgstr "Criar novos nós."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Connect nodes."
-msgstr "Conectar nós."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Remove selected node or transition."
-msgstr "Remover nó ou transição selecionado."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Toggle autoplay this animation on start, restart or seek to zero."
-msgstr ""
-"Alternar autoplay deste animação em início, reinício ou procura de zero."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Set the end animation. This is useful for sub-transitions."
-msgstr "Definir a animação final. Útil para sub-transições."
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Transition: "
-msgstr "Transição: "
-
-#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Play Mode:"
-msgstr "Modo Jogo:"
-
-#: editor/plugins/animation_tree_editor_plugin.cpp
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "AnimationTree"
-msgstr "AnimationTree"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "New name:"
-msgstr "Novo nome:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Scale:"
-msgstr "Escala:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Fade In (s):"
-msgstr "Aparecer (s):"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Fade Out (s):"
-msgstr "Desvanecer (s):"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend"
-msgstr "Misturar"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Mix"
-msgstr "Combinar"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Auto Restart:"
-msgstr "Reinício automático:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Restart (s):"
-msgstr "Reinício (s):"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Random Restart (s):"
-msgstr "Reinício aleatório (s):"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Start!"
-msgstr "Partida!"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Amount:"
-msgstr "Valor:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend 0:"
-msgstr "Mistura 0:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend 1:"
-msgstr "Mistura 1:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "X-Fade Time (s):"
-msgstr "Tempo X-Fade (s):"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Current:"
-msgstr "Atual:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Input"
-msgstr "Adicionar entrada"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Clear Auto-Advance"
-msgstr "Limpar avanço automático"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Set Auto-Advance"
-msgstr "Definir avanço automático"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Delete Input"
-msgstr "Apagar entrada"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Animation tree is valid."
-msgstr "Árvore de Animação válida."
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Animation tree is invalid."
-msgstr "Árvore de Animação inválida."
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Animation Node"
-msgstr "Nó Animation"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "OneShot Node"
-msgstr "Nó OneShot"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Mix Node"
-msgstr "Nó Mix"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend2 Node"
-msgstr "Nó Blend2"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend3 Node"
-msgstr "Nó Blend3"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend4 Node"
-msgstr "Nó Blend4"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "TimeScale Node"
-msgstr "Nó TimeScale"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "TimeSeek Node"
-msgstr "Nó TimeSeek"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Transition Node"
-msgstr "Nó Transition"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Import Animations..."
-msgstr "Importar Animações..."
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Edit Node Filters"
-msgstr "Editar filtros de Nó"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Filters..."
-msgstr "Filtros..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Contents:"
-msgstr "Conteúdos:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "View Files"
-msgstr "Ver Ficheiros"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Connection error, please try again."
-msgstr "Erro de ligação, tente novamente."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't connect to host:"
-msgstr "Impossível ligar ao host:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "No response from host:"
-msgstr "Sem resposta do host:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Can't resolve hostname:"
-msgstr "Impossível resolver hostname:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed, return code:"
-msgstr "Falha na solicitação, código de retorno:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed."
-msgstr "Pedido falhado."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Cannot save response to:"
-msgstr "Impossível guardar resposta para:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Write error."
-msgstr "Erro de escrita."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed, too many redirects"
-msgstr "Falha na solicitação, demasiados redirecionamentos"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Redirect loop."
-msgstr "Redirecionar ciclo."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Request failed, timeout"
-msgstr "Falha na solicitação, tempo expirado"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Timeout."
-msgstr "Tempo expirado."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Bad download hash, assuming file has been tampered with."
-msgstr "Mau hash na transferência, assume-se que o Ficheiro foi manipulado."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Expected:"
-msgstr "Esperado:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Got:"
-msgstr "Obtido:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Failed sha256 hash check"
-msgstr "Verificação hash sha256 falhada"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Asset Download Error:"
-msgstr "Erro na transferência de Ativo:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Downloading (%s / %s)..."
-msgstr "A transferir (%s / %s)..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Downloading..."
-msgstr "A transferir..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Resolving..."
-msgstr "A resolver..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Error making request"
-msgstr "Erro na criação da solicitação"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Idle"
-msgstr "Inativo"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Install..."
-msgstr "Instalar..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Retry"
-msgstr "Repetir"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Download Error"
-msgstr "Erro na transferência"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Download for this asset is already in progress!"
-msgstr "A transferência deste Ativo já está em andamento!"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Recently Updated"
-msgstr "Atualizações Recentes"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Least Recently Updated"
-msgstr "Atualizações Menos Recentes"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Name (A-Z)"
-msgstr "Nome (A-Z)"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Name (Z-A)"
-msgstr "Nome (Z-A)"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "License (A-Z)"
-msgstr "Licença (A-Z)"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "License (Z-A)"
-msgstr "Licença (Z-A)"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "First"
-msgstr "Primeiro"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Previous"
-msgstr "Anterior"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Next"
-msgstr "Próximo"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Last"
-msgstr "Último"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "All"
-msgstr "Todos"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "No results for \"%s\"."
-msgstr "Nenhum resultado para \"%s\"."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Import..."
-msgstr "Importar..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Plugins..."
-msgstr "Plugins..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
-msgid "Sort:"
-msgstr "Ordenar:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/project_settings_editor.cpp
-msgid "Category:"
-msgstr "Categoria:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Site:"
-msgstr "Site:"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Support"
-msgstr "Suporte"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Official"
-msgstr "Oficial"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Testing"
-msgstr "Em teste"
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Loading..."
-msgstr "A Carregar..."
-
-#: editor/plugins/asset_library_editor_plugin.cpp
-msgid "Assets ZIP File"
-msgstr "Ficheiro ZIP de Ativos"
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid ""
-"Can't determine a save path for lightmap images.\n"
-"Save your scene (for images to be saved in the same dir), or pick a save "
-"path from the BakedLightmap properties."
-msgstr ""
-"Impossível determinar um caminho para guardar imagens lightmap.\n"
-"Guarde a sua Cena (para as imagens serem guardadas na mesma diretoria), ou "
-"escolha um caminho nas propriedades BakedLightmap."
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid ""
-"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
-"Light' flag is on."
-msgstr ""
-"Não há Meshes para consolidar. Assegure-se que contêm um canal UV2 e que a "
-"referência 'Bake Light' flag está on."
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid "Failed creating lightmap images, make sure path is writable."
-msgstr "Falha ao criar imagens lightmap, assegure-se que o caminho é gravável."
-
-#: editor/plugins/baked_lightmap_editor_plugin.cpp
-msgid "Bake Lightmaps"
-msgstr "Consolidar Lightmaps"
-
-#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
-msgid "Preview"
-msgstr "Pré-visualização"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Configure Snap"
-msgstr "Configurar Ajuste"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Grid Offset:"
-msgstr "Compensação da grelha:"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Grid Step:"
-msgstr "Passo da grelha:"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Primary Line Every:"
-msgstr "Linha Primária Cada:"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "steps"
-msgstr "passos"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotation Offset:"
-msgstr "Compensação da rotação:"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotation Step:"
-msgstr "Passo da rotação:"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Scale Step:"
-msgstr "Passo de Escala:"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Move Vertical Guide"
-msgstr "Mover Guia Vertical"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Create Vertical Guide"
-msgstr "Criar Guia Vertical"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Remove Vertical Guide"
-msgstr "Remover Guia Vertical"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Move Horizontal Guide"
-msgstr "Mover Guia Horizontal"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Create Horizontal Guide"
-msgstr "Criar Guia Horizontal"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Remove Horizontal Guide"
-msgstr "Remover Guia Horizontal"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Create Horizontal and Vertical Guides"
-msgstr "Criar Guias Horizontais e Verticais"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Move pivot"
-msgstr "Mover pivô"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotate CanvasItem"
-msgstr "Rodar CanvasItem"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Move anchor"
-msgstr "Mover âncora"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Resize CanvasItem"
-msgstr "Redimensionar CanvasItem"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Scale CanvasItem"
-msgstr "Escalar CanvasItem"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Move CanvasItem"
-msgstr "Mover CanvasItem"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Children of containers have their anchors and margins values overridden by "
-"their parent."
-msgstr ""
-"As âncoras e margens de filhos de um contentores são sobrescritas pelo seu "
-"pai."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Presets for the anchors and margins values of a Control node."
-msgstr "Pré-definições para âncoras e margens de um Nó Control."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"When active, moving Control nodes changes their anchors instead of their "
-"margins."
-msgstr ""
-"Quando ativo, mover nós Control altera as suas ancoras em vez das sua "
-"margens."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Top Left"
-msgstr "Topo Esquerda"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Top Right"
-msgstr "Topo Direita"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Bottom Right"
-msgstr "Fundo Direita"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Bottom Left"
-msgstr "Fundo Esquerda"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Left"
-msgstr "Centro Esquerda"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Top"
-msgstr "Centro Topo"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Right"
-msgstr "Centro Direita"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Bottom"
-msgstr "Centro Fundo"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center"
-msgstr "Centro"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Left Wide"
-msgstr "Esquerda Wide"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Top Wide"
-msgstr "Topo Wide"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Right Wide"
-msgstr "Direita Wide"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Bottom Wide"
-msgstr "Fundo Wide"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "VCenter Wide"
-msgstr "VCentro Wide"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "HCenter Wide"
-msgstr "HCentro Wide"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Full Rect"
-msgstr "Rect Completo"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Keep Ratio"
-msgstr "Manter Proporção"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Anchors only"
-msgstr "Só âncoras"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Change Anchors and Margins"
-msgstr "Mudar âncoras e margens"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Change Anchors"
-msgstr "Mudar âncoras"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Game Camera Override\n"
-"Overrides game camera with editor viewport camera."
-msgstr ""
-"Sobreposição de Câmara de Jogo\n"
-"Sobrepõe câmara de jogo com câmara do editor."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Game Camera Override\n"
-"No game instance running."
-msgstr ""
-"Sobreposição de Câmara de Jogo\n"
-"Nenhuma instância de jogo em execução."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Lock Selected"
-msgstr "Bloquear Seleção"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Unlock Selected"
-msgstr "Desbloquear Seleção"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Group Selected"
-msgstr "Agrupar Seleção"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Ungroup Selected"
-msgstr "Desagrupar Seleção"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Paste Pose"
-msgstr "Colar Pose"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Clear Guides"
-msgstr "Limpar Guias"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Create Custom Bone(s) from Node(s)"
-msgstr "Criar Osso(s) Personalizado(s) a partis de Nó(s)"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Clear Bones"
-msgstr "Apagar Ossos"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Make IK Chain"
-msgstr "Criar corrente IK"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Clear IK Chain"
-msgstr "Apagar corrente IK"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Warning: Children of a container get their position and size determined only "
-"by their parent."
-msgstr ""
-"Atenção: as crianças de um contentor obtêm a sua posição e tamanho "
-"determinados apenas pelos seus pais."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-msgid "Zoom Reset"
-msgstr "Reposição do Zoom"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Select Mode"
-msgstr "Modo seleção"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Drag: Rotate"
-msgstr "Arrastar: Rotação"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Alt+Drag: Move"
-msgstr "Alt+Arrastar: Mover"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
-msgstr ""
-"Tecla 'v' para mudar Eixo, 'Shift+v' para arrastar Eixo (durante movimento)."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+RMB: seleção da lista de profundidade"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Move Mode"
-msgstr "Modo mover"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Mode"
-msgstr "Modo rodar"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Mode"
-msgstr "Modo Escalar"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Show a list of all objects at the position clicked\n"
-"(same as Alt+RMB in select mode)."
-msgstr ""
-"Mostra lista de todos os Objetos na posição clicada\n"
-"(o mesmo que Alt+RMB no modo seleção)."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Click to change object's rotation pivot."
-msgstr "Clique para mudar o Eixo de rotação do Objeto."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Pan Mode"
-msgstr "Modo deslocamento"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Ruler Mode"
-msgstr "Modo Régua"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Toggle smart snapping."
-msgstr "Alternar ajuste inteligente."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Smart Snap"
-msgstr "Usar Ajuste Inteligente"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Toggle grid snapping."
-msgstr "Alternar ajuste de grelha."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Grid Snap"
-msgstr "Usar Ajuste de Grelha"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snapping Options"
-msgstr "Opções de Ajuste"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Rotation Snap"
-msgstr "Usar Ajuste de Rotação"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Scale Snap"
-msgstr "Usar Ajuste de Escala"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap Relative"
-msgstr "Ajuste Relativo"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Use Pixel Snap"
-msgstr "Usar Ajuste de Pixel"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Smart Snapping"
-msgstr "Ajuste Inteligente"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Configure Snap..."
-msgstr "Configurar Ajuste..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Parent"
-msgstr "Ajustar ao Parente"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Node Anchor"
-msgstr "Ajustar ao Nó Âncora"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Node Sides"
-msgstr "Ajustar aos Lados do Nó"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Node Center"
-msgstr "Ajustar ao Centro do Nó"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Other Nodes"
-msgstr "Ajustar a Outros Nós"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Snap to Guides"
-msgstr "Ajustar às Guias"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Lock the selected object in place (can't be moved)."
-msgstr "Bloquear a posição do Objeto selecionado (não pode ser movido)."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Unlock the selected object (can be moved)."
-msgstr "Desbloquear o Objeto selecionado (pode ser movido)."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Makes sure the object's children are not selectable."
-msgstr "Assegura que os Objetos-filho não são selecionáveis."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Restores the object's children's ability to be selected."
-msgstr "Restaura a capacidade de selecionar os Objetos-filho."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Skeleton Options"
-msgstr "Opções do Esqueleto"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Bones"
-msgstr "Mostrar ossos"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Make Custom Bone(s) from Node(s)"
-msgstr "Fazer Osso(s) Personalizados a partis de Nó(s)"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Clear Custom Bones"
-msgstr "Apagar Ossos Personalizados"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View"
-msgstr "Vista"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Always Show Grid"
-msgstr "Mostrar Grelha Sempre"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Helpers"
-msgstr "Mostrar ajudantes"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Rulers"
-msgstr "Mostrar réguas"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Guides"
-msgstr "Mostrar guias"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Origin"
-msgstr "Mostrar Origem"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Viewport"
-msgstr "Mostrar Vista"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Show Group And Lock Icons"
-msgstr "Mostrar Grupo e Bloquear Ícones"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Selection"
-msgstr "Centrar seleção"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Frame Selection"
-msgstr "Seleção de Frame"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Preview Canvas Scale"
-msgstr "Pré-visualizar Escala do Canvas"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Translation mask for inserting keys."
-msgstr "Máscara de translação para inserir chaves."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Rotation mask for inserting keys."
-msgstr "Máscara de rotação para inserir chaves."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Scale mask for inserting keys."
-msgstr "Máscara de escala para inserir chaves."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Insert keys (based on mask)."
-msgstr "Inserir chaves (baseado na máscara)."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Auto insert keys when objects are translated, rotated or scaled (based on "
-"mask).\n"
-"Keys are only added to existing tracks, no new tracks will be created.\n"
-"Keys must be inserted manually for the first time."
-msgstr ""
-"Insere chaves automaticamente quando objetos são movidos, rodados ou "
-"redimensionados (baseado na máscara).\n"
-"Chaves apenas são adicionadas a pistas existentes, não sendo criadas novas "
-"pistas.\n"
-"Chaves têm de ser inseridas manualmente na primeira vez."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Auto Insert Key"
-msgstr "Inserir Chave automaticamente"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Animation Key and Pose Options"
-msgstr "Chave de Animação e Opções de Pose"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Insert Key (Existing Tracks)"
-msgstr "Inserir Chave (Pistas existentes)"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Copy Pose"
-msgstr "Copiar pose"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Clear Pose"
-msgstr "Limpar pose"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Multiply grid step by 2"
-msgstr "Multiplicar passo da grelha por 2"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Divide grid step by 2"
-msgstr "Dividir passo da grelha por 2"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Pan View"
-msgstr "Vista Pan"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Add %s"
-msgstr "Adicionar %s"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Adding %s..."
-msgstr "A adicionar %s..."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Cannot instantiate multiple nodes without root."
-msgstr "Impossível instanciar nós múltiplos sem raiz."
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "Create Node"
-msgstr "Criar Nó"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "Error instancing scene from %s"
-msgstr "Erro a instanciar Cena de %s"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Change Default Type"
-msgstr "Mudar Tipo Padrão"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid ""
-"Drag & drop + Shift : Add node as sibling\n"
-"Drag & drop + Alt : Change node type"
-msgstr ""
-"Arrastar & largar + Shift : Adiciona Nó como irmão\n"
-"Arrastar & largar + Alt : Altera o tipo de Nó"
-
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Polygon3D"
-msgstr "Criar Polygon3D"
-
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr "Editar Polígono"
-
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
-msgstr "Editar Poly (Remover Ponto)"
-
-#: editor/plugins/collision_shape_2d_editor_plugin.cpp
-msgid "Set Handle"
-msgstr "Definir Manipulador"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Load Emission Mask"
-msgstr "Carregar máscara de emissão"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Restart"
-msgstr "Reiniciar"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Clear Emission Mask"
-msgstr "Limpar máscara de emissão"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Particles"
-msgstr "Partículas"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Generated Point Count:"
-msgstr "Contagem de Pontos gerados:"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Emission Mask"
-msgstr "Máscara de Emissão"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Solid Pixels"
-msgstr "Pixeis Sólidos"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Border Pixels"
-msgstr "Pixeis da Margem"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Directed Border Pixels"
-msgstr "Pixeis da Margem Dirigidos"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Capture from Pixel"
-msgstr "Capturar a partir do pixel"
-
-#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Emission Colors"
-msgstr "Cores de Emissão"
-
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-msgid "CPUParticles"
-msgstr "CPUParticles"
-
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Create Emission Points From Mesh"
-msgstr "Criar Pontos de emissão a partir da Malha"
-
-#: editor/plugins/cpu_particles_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Create Emission Points From Node"
-msgstr "Criar Pontos de emissão a partir do Nó"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Flat 0"
-msgstr "Plano 0"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Flat 1"
-msgstr "Plano 1"
-
-#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
-msgid "Ease In"
-msgstr "Ease In"
-
-#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
-msgid "Ease Out"
-msgstr "Ease Out"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Smoothstep"
-msgstr "Smoothstep"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Modify Curve Point"
-msgstr "Modificar Ponto da curva"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Modify Curve Tangent"
-msgstr "Modificar tangente da curva"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Load Curve Preset"
-msgstr "Carregar Curva Predefinida"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Add Point"
-msgstr "Adicionar Ponto"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Remove Point"
-msgstr "Remover Ponto"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Left Linear"
-msgstr "Linear Esquerda"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Right Linear"
-msgstr "Linear Direita"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Load Preset"
-msgstr "Carregar Predefinição"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Remove Curve Point"
-msgstr "Remover Ponto da curva"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Toggle Curve Linear Tangent"
-msgstr "Alternar tangente linear da curva"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Hold Shift to edit tangents individually"
-msgstr "Pressione Shift para editar tangentes individualmente"
-
-#: editor/plugins/curve_editor_plugin.cpp
-msgid "Right click to add point"
-msgstr "Clique direito para adicionar ponto"
-
-#: editor/plugins/gi_probe_editor_plugin.cpp
-msgid "Bake GI Probe"
-msgstr "Consolidar Sonda GI"
-
-#: editor/plugins/gradient_editor_plugin.cpp
-msgid "Gradient Edited"
-msgstr "Gradiente Editado"
-
-#: editor/plugins/item_list_editor_plugin.cpp
-msgid "Item %d"
-msgstr "Item %d"
-
-#: editor/plugins/item_list_editor_plugin.cpp
-msgid "Items"
-msgstr "Itens"
-
-#: editor/plugins/item_list_editor_plugin.cpp
-msgid "Item List Editor"
-msgstr "Editor da lista de itens"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Occluder Polygon"
-msgstr "Criar Polígono oclusor"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh is empty!"
-msgstr "A Malha está vazia!"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Criar corpo estático Trimesh"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Criar corpo estático convexo"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "This doesn't work on scene root!"
-msgstr "Não funciona na raiz da Cena!"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Trimesh Static Shape"
-msgstr "Criar Forma Estática Trimesh"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Falha na criação de formas!"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Criar Forma(s) Convexa(s)"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Navigation Mesh"
-msgstr "Criar Malha de Navegação"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Contained Mesh is not of type ArrayMesh."
-msgstr "Malha contida não é do tipo ArrayMesh."
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr "Falhou o desempacotamento UV, a Malha pode não ser múltipla?"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "No mesh to debug."
-msgstr "Nenhuma malha para depurar."
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Model has no UV in this layer"
-msgstr "O Modelo não tem UV nesta camada"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "MeshInstance lacks a Mesh!"
-msgstr "Falta uma Malha a MeshInstance!"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh has not surface to create outlines from!"
-msgstr "A Malha não tem superfície para criar contornos!"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr "Tipo primitivo de Malha não é PRIMITIVE_TRIANGLES!"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Could not create outline!"
-msgstr "Contorno não pode ser criado!"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Outline"
-msgstr "Criar contorno"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Mesh"
-msgstr "Malha"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Trimesh Static Body"
-msgstr "Criar corpo estático Trimesh"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Trimesh Collision Sibling"
-msgstr "Criar irmão de colisão Trimesh"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Criar Irmão(s) de Colisão Convexa"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Outline Mesh..."
-msgstr "Criar Malha de Contorno..."
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "View UV1"
-msgstr "Ver UV1"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "View UV2"
-msgstr "Ver UV2"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Unwrap UV2 for Lightmap/AO"
-msgstr "Desempacotar UV2 para Lightmap/AO"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Outline Mesh"
-msgstr "Criar Malha de Contorno"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Outline Size:"
-msgstr "Tamanho do contorno:"
-
-#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "UV Channel Debug"
-msgstr "Debug Canal UV"
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Remove item %d?"
-msgstr "Remover item %d?"
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid ""
-"Update from existing scene?:\n"
-"%s"
-msgstr ""
-"Atualizar a partir da cena existente?:\n"
-"%s"
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Mesh Library"
-msgstr "Bib. de Meshes"
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add Item"
-msgstr "Adicionar item"
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Remove Selected Item"
-msgstr "Remover item selecionado"
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Import from Scene"
-msgstr "Importar da Cena"
-
-#: editor/plugins/mesh_library_editor_plugin.cpp
-msgid "Update from Scene"
-msgstr "Atualizar da Cena"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "No mesh source specified (and no MultiMesh set in node)."
-msgstr "Fonte da Malha não especificada (nem MultiMesh no Nó)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr "Fonte da Malha não especificada (e MultiMesh não contêm Malha)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh source is invalid (invalid path)."
-msgstr "A fonte da Malha é inválida (Caminho inválido)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr "A fonte da Malha é inválida (não é MeshInstance)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr "A fonte da Malha é inválida (não contêm um recurso Mesh)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "No surface source specified."
-msgstr "Fonte de superfície não especificada."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Surface source is invalid (invalid path)."
-msgstr "A fonte de superfície é inválida (Caminho inválido)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Surface source is invalid (no geometry)."
-msgstr "A fonte de superfície é inválida (sem geometria)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Surface source is invalid (no faces)."
-msgstr "A fonte de superfície é inválida (sem faces)."
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Select a Source Mesh:"
-msgstr "Selecione uma fonte Malha:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Select a Target Surface:"
-msgstr "Selecione uma superfície alvo:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Populate Surface"
-msgstr "Povoar superfície"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Populate MultiMesh"
-msgstr "Povoar MultiMesh"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Target Surface:"
-msgstr "Superfície alvo:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Source Mesh:"
-msgstr "Fonte Malha:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "X-Axis"
-msgstr "Eixo X"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Y-Axis"
-msgstr "Eixo Y"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Z-Axis"
-msgstr "Eixo Z"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Mesh Up Axis:"
-msgstr "Malha Eixo Cima:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Random Rotation:"
-msgstr "Rotação aleatória:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Random Tilt:"
-msgstr "Inclinação aleatória:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Random Scale:"
-msgstr "Escala aleatória:"
-
-#: editor/plugins/multimesh_editor_plugin.cpp
-msgid "Populate"
-msgstr "Povoar"
-
-#: editor/plugins/navigation_polygon_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create Navigation Polygon"
-msgstr "Criar Polígono de navegação"
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
-msgstr "Converter em CPUParticles"
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Generating Visibility Rect"
-msgstr "A Gerar Visibilidade Rect"
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Generate Visibility Rect"
-msgstr "Gerar Visibilidade do Rect"
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-msgid "Can only set point into a ParticlesMaterial process material"
-msgstr "Só pode definir um Ponto num Material ParticlesMaterial"
-
-#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generation Time (sec):"
-msgstr "Tempo de geração (s):"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "The geometry's faces don't contain any area."
-msgstr "As faces da geometria não contêm qualquer área."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "The geometry doesn't contain any faces."
-msgstr "A geometria não contêm quaisquer faces."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "\"%s\" doesn't inherit from Spatial."
-msgstr "\"%s\" não descende de Spatial."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "\"%s\" doesn't contain geometry."
-msgstr "\"%s\" não contem geometria."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "\"%s\" doesn't contain face geometry."
-msgstr "\"%s\" não contem geometria de faces."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Create Emitter"
-msgstr "Criar emissor"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Emission Points:"
-msgstr "Pontos de emissão:"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Surface Points"
-msgstr "Pontos de superfície"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Surface Points+Normal (Directed)"
-msgstr "Pontos de superfície+Normal (dirigida)"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Volume"
-msgstr "Volume"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Emission Source: "
-msgstr "Fonte de emissão: "
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "A processor material of type 'ParticlesMaterial' is required."
-msgstr "É necessário um Material processador do tipo 'ParticlesMaterial'."
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "A gerar AABB"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate Visibility AABB"
-msgstr "Gerar visibilidade AABB"
-
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Gerar AABB"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Remove Point from Curve"
-msgstr "Remover Ponto da curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Remove Out-Control from Curve"
-msgstr "Remover Out-Control da curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Remove In-Control from Curve"
-msgstr "Remover In-Control da curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Add Point to Curve"
-msgstr "Adicionar Ponto à curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Split Curve"
-msgstr "Dividir Curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Move Point in Curve"
-msgstr "Mover Ponto na curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Move In-Control in Curve"
-msgstr "Mover In-Control na curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Move Out-Control in Curve"
-msgstr "Mover Out-Control na curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Select Points"
-msgstr "Selecionar Pontos"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Shift+Drag: Select Control Points"
-msgstr "Shift+Arrastar: Selecionar Pontos de controlo"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Click: Add Point"
-msgstr "Clique: Adicionar Ponto"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Left Click: Split Segment (in curve)"
-msgstr "Clique esquerdo: Dividir o Segmento (em curva)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Right Click: Delete Point"
-msgstr "Clique direito: Apagar Ponto"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-msgid "Select Control Points (Shift+Drag)"
-msgstr "Selecionar Pontos de controlo (Shift+Arrastar)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Add Point (in empty space)"
-msgstr "Adicionar Ponto (num espaço vazio)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Delete Point"
-msgstr "Apagar Ponto"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Close Curve"
-msgstr "Fechar curva"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp
-msgid "Options"
-msgstr "Opções"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Mirror Handle Angles"
-msgstr "Espelhar ângulos do manipulador"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Mirror Handle Lengths"
-msgstr "Espelhar comprimentos do manipulador"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Curve Point #"
-msgstr "Ponto da curva #"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Set Curve Point Position"
-msgstr "Definir posição do Ponto da curva"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Set Curve In Position"
-msgstr "Definir curva na posição"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Set Curve Out Position"
-msgstr "Definir posição Curve Out"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Path"
-msgstr "Separar Caminho"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Remove Path Point"
-msgstr "Remover Ponto de Caminho"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Remove Out-Control Point"
-msgstr "Remover Ponto Out-Control"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Remove In-Control Point"
-msgstr "Remover Ponto In-Control"
-
-#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Separar segmento (na curva)"
-
-#: editor/plugins/physical_bone_plugin.cpp
-msgid "Move Joint"
-msgstr "Mover Junta"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr "A propriedade esqueleto do Polygon2D não aponta para um nó Skeleton2D"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync Bones"
-msgstr "Sincronizar ossos"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"No texture in this polygon.\n"
-"Set a texture to be able to edit UV."
-msgstr ""
-"Sem textura neste polígono.\n"
-"Defina uma textura para poder editar UV."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
-msgstr "Criar mapa UV"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"Polygon 2D has internal vertices, so it can no longer be edited in the "
-"viewport."
-msgstr "Polygon 2D tem vértices internos, não podendo ser editado no viewport."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
-msgstr "Criar Polígono & UV"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Internal Vertex"
-msgstr "Criar vértice interno"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Remove Internal Vertex"
-msgstr "Remover Vértice Interno"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Polygon (need 3 different vertices)"
-msgstr "Polígono inválido (precisa de 3 vértices diferentes)"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Custom Polygon"
-msgstr "Adicionar Polígono Personalizado"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Remove Custom Polygon"
-msgstr "Remover Polígono Personalizado"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
-msgstr "Transformar mapa UV"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform Polygon"
-msgstr "Transformar Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint Bone Weights"
-msgstr "Pintar pesos dos ossos"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Open Polygon 2D UV editor."
-msgstr "Abrir editor UV de Polygon2D."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
-msgstr "Editor UV de Polígono 2D"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
-msgstr "UV"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Points"
-msgstr "Pontos"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygons"
-msgstr "Polígonos"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
-msgstr "Ossos"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Points"
-msgstr "Mover Ponto"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Ctrl: Rotate"
-msgstr "Ctrl: Rodar"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Shift: Move All"
-msgstr "Shift: Mover tudo"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Shift+Ctrl: Scale"
-msgstr "Shift+Ctrl: Escalar"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Polygon"
-msgstr "Mover Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Rotate Polygon"
-msgstr "Rodar Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Scale Polygon"
-msgstr "Escalar Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create a custom polygon. Enables custom polygon rendering."
-msgstr ""
-"Crie um polígono personalizado. Habilita a renderização de polígonos "
-"personalizados."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid ""
-"Remove a custom polygon. If none remain, custom polygon rendering is "
-"disabled."
-msgstr ""
-"Remover um polígono personalizado. Se não restar nenhum, a renderização de "
-"polígonos personalizados é desativada."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity."
-msgstr "Pintar pesos com determinada intensidade."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Unpaint weights with specified intensity."
-msgstr "Despintar pesos com intensidade específica."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Radius:"
-msgstr "Raio:"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon->UV"
-msgstr "Polígono->UV"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV->Polygon"
-msgstr "UV->Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Clear UV"
-msgstr "Limpar UV"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Settings"
-msgstr "Configurações da Grelha"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Snap"
-msgstr "Ajustar"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Enable Snap"
-msgstr "Ativar Ajuste"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid"
-msgstr "Grelha"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Show Grid"
-msgstr "Mostrar grelha"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Configure Grid:"
-msgstr "Configurar Grelha:"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Offset X:"
-msgstr "Deslocação X da grelha:"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Offset Y:"
-msgstr "Deslocação Y da grelha:"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Step X:"
-msgstr "Passo X da grelha:"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Grid Step Y:"
-msgstr "Passo Y da grelha:"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync Bones to Polygon"
-msgstr "Sincronizar Ossos com Polígono"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "ERROR: Couldn't load resource!"
-msgstr "ERRO: Não foi possível carregar recurso!"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Add Resource"
-msgstr "Adicionar recurso"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Rename Resource"
-msgstr "Renomear recurso"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Delete Resource"
-msgstr "Apagar recurso"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Resource clipboard is empty!"
-msgstr "Área de transferência de recursos vazia!"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Paste Resource"
-msgstr "Colar Recurso"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_editor.cpp
-msgid "Instance:"
-msgstr "Instância:"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Type:"
-msgstr "Tipo:"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Abrir no Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "Load Resource"
-msgstr "Carregar recurso"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-msgid "ResourcePreloader"
-msgstr "ResourcePreloader"
-
-#: editor/plugins/root_motion_editor_plugin.cpp
-msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr "AnimationTree não tem caminho definido para um AnimationPlayer"
-
-#: editor/plugins/root_motion_editor_plugin.cpp
-msgid "Path to AnimationPlayer is invalid"
-msgstr "Caminho para AnimationPlayer é inválido"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Clear Recent Files"
-msgstr "Limpar Ficheiros recentes"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Close and save changes?"
-msgstr "Fechar e guardar alterações?"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error writing TextFile:"
-msgstr "Erro ao escrever TextFile:"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Could not load file at:"
-msgstr "Impossível carregar ficheiro em:"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving file!"
-msgstr "Erro ao guardar ficheiro!"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme."
-msgstr "Erro ao gravar tema."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error Saving"
-msgstr "Erro Ao Gravar"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme."
-msgstr "Erro ao importar tema."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error Importing"
-msgstr "Erro ao importar"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "New Text File..."
-msgstr "Novo Ficheiro de Texto..."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Open File"
-msgstr "Abrir Ficheiro"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save File As..."
-msgstr "Guardar Ficheiro Como..."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Can't obtain the script for running."
-msgstr "Não é possível obter o script para executar."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Script failed reloading, check console for errors."
-msgstr "Falhou a re-leitura do script, analise os erros na consola."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Script is not in tool mode, will not be able to run."
-msgstr "Script não está no modo ferramenta, não será possível executá-lo."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"To run this script, it must inherit EditorScript and be set to tool mode."
-msgstr ""
-"Para executar este script, terá de descender de EditorScript e ser definido "
-"como modo ferramenta."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Import Theme"
-msgstr "Importar tema"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Erro ao guardar tema"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr "Erro ao guardar"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As..."
-msgstr "Guardar tema como..."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "%s Class Reference"
-msgstr "Referência de classe %s"
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-msgid "Find Next"
-msgstr "Localizar Seguinte"
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp
-msgid "Find Previous"
-msgstr "Localizar Anterior"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Filter scripts"
-msgstr "Scripts de filtro"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Toggle alphabetical sorting of the method list."
-msgstr "Alternar ordenação alfabética da lista de métodos."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Filter methods"
-msgstr "Métodos de filtro"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Sort"
-msgstr "Ordenar"
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Move Up"
-msgstr "Mover para cima"
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Move Down"
-msgstr "Mover para baixo"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Next script"
-msgstr "Próximo Script"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Previous script"
-msgstr "Script anterior"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "File"
-msgstr "Ficheiro"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Open..."
-msgstr "Abrir..."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Reopen Closed Script"
-msgstr "Reabrir Script Fechado"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save All"
-msgstr "Guardar tudo"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Soft Reload Script"
-msgstr "Script de Recarregamento"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Copy Script Path"
-msgstr "Copiar Caminho do Script"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Previous"
-msgstr "Histórico Anterior"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Next"
-msgstr "Histórico Seguinte"
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Theme"
-msgstr "Tema"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Import Theme..."
-msgstr "Importar tema..."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr "Recarregar tema"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
-msgstr "Guardar tema"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Close All"
-msgstr "Fechar tudo"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Close Docs"
-msgstr "Fechar documentos"
-
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
-msgid "Run"
-msgstr "Executar"
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Step Into"
-msgstr "Passar dentro"
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Step Over"
-msgstr "Passar sobre"
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Break"
-msgstr "Interrupção"
-
-#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
-#: editor/script_editor_debugger.cpp
-msgid "Continue"
-msgstr "Continuar"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Keep Debugger Open"
-msgstr "Manter Depurador Aberto"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with External Editor"
-msgstr "Depurar com Editor Externo"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Open Godot online documentation."
-msgstr "Abrir documentação online do Godot."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Requisitar Docs"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Dê a sua opinião para ajudar a melhorar a documentação Godot."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the reference documentation."
-msgstr "Procurar na documentação de referência."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Go to previous edited document."
-msgstr "Ir para o documento previamente editado."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Go to next edited document."
-msgstr "Ir para o próximo documento editado."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Discard"
-msgstr "Descartar"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"The following files are newer on disk.\n"
-"What action should be taken?:"
-msgstr ""
-"Os seguintes Ficheiros são mais recentes no disco.\n"
-"Que ação deve ser tomada?:"
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Reload"
-msgstr "Recarregar"
-
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Resave"
-msgstr "Reguardar"
-
-#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-msgid "Debugger"
-msgstr "Depurador"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Results"
-msgstr "Resultados da Pesquisa"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Clear Recent Scripts"
-msgstr "Limpar Scripts Recentes"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Connections to method:"
-msgstr "Conecções ao método:"
-
-#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
-msgid "Source"
-msgstr "Fonte"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Target"
-msgstr "Alvo"
-
-#: editor/plugins/script_text_editor.cpp
-msgid ""
-"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "Falta método conectado '%s' para sinal '%s' do nó '%s' para nó '%s'."
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Linha"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ignorar)"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function"
-msgstr "Ir para Função"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Only resources from filesystem can be dropped."
-msgstr "Só podem ser largados recursos do Sistema de Ficheiros ."
-
-#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't drop nodes because script '%s' is not used in this scene."
-msgstr "Impossível largar nós porque o script '%s' não é usado neste cena."
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Lookup Symbol"
-msgstr "Símbolo Consulta"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Pick Color"
-msgstr "Escolher cor"
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Convert Case"
-msgstr "Converter maiúsculas/minúsculas"
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Uppercase"
-msgstr "Maiúsculas"
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Lowercase"
-msgstr "Minúsculas"
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Capitalize"
-msgstr "Capitalizar"
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Syntax Highlighter"
-msgstr "Destaque de Sintaxe"
-
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-msgid "Go To"
-msgstr "Ir Para"
-
-#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
-msgid "Bookmarks"
-msgstr "Marcadores"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Breakpoints"
-msgstr "Pontos de paragem"
-
-#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
-#: scene/gui/text_edit.cpp
-msgid "Cut"
-msgstr "Cortar"
-
-#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
-#: scene/gui/text_edit.cpp
-msgid "Select All"
-msgstr "Selecionar tudo"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Delete Line"
-msgstr "Apagar linha"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Indent Left"
-msgstr "Indentar à esquerda"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Indent Right"
-msgstr "Indentar à direita"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Comment"
-msgstr "Alternar comentário"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Fold/Unfold Line"
-msgstr "Fechar/Abrir Linha"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Fold All Lines"
-msgstr "Esconder todas as linhas"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Unfold All Lines"
-msgstr "Mostrar todas as linhas"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Clone Down"
-msgstr "Clonar abaixo"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Complete Symbol"
-msgstr "Completar símbolo"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Evaluate Selection"
-msgstr "Avaliar Seleção"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Trim Trailing Whitespace"
-msgstr "Apagar espaços nos limites"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Spaces"
-msgstr "Converter Indentação em Espaços"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent to Tabs"
-msgstr "Converter Indentação em Tabulação"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Auto Indent"
-msgstr "Indentação automática"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Find in Files..."
-msgstr "Localizar em Ficheiros..."
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Contextual Help"
-msgstr "Ajuda contextual"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Toggle Bookmark"
-msgstr "Alternar Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Bookmark"
-msgstr "Ir para Próximo Marcador"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Bookmark"
-msgstr "Ir para Marcador Anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Bookmarks"
-msgstr "Remover todos os Marcadores"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Function..."
-msgstr "Ir para Função..."
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Line..."
-msgstr "Ir para Linha..."
-
-#: editor/plugins/script_text_editor.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Toggle Breakpoint"
-msgstr "Alternar Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Remove All Breakpoints"
-msgstr "Remover todos os Breakpoints"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Next Breakpoint"
-msgstr "Ir para Próximo Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Go to Previous Breakpoint"
-msgstr "Ir para Breakpoint Anterior"
-
-#: editor/plugins/shader_editor_plugin.cpp
-msgid ""
-"This shader has been modified on on disk.\n"
-"What action should be taken?"
-msgstr ""
-"Este Shader foi modificado no disco.\n"
-"Que ação deve ser tomada?"
-
-#: editor/plugins/shader_editor_plugin.cpp
-msgid "Shader"
-msgstr "Shader"
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr "Este esqueleto não tem ossos, crie alguns nós Bone2D filhos."
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Create Rest Pose from Bones"
-msgstr "Criar Pose de Descanso a partir de Ossos"
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Set Rest Pose to Bones"
-msgstr "Definir Pose de Descanso para Ossos"
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Skeleton2D"
-msgstr "Esqueleto2D"
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Make Rest Pose (From Bones)"
-msgstr "Criar Pose de Descanso (a partir de Ossos)"
-
-#: editor/plugins/skeleton_2d_editor_plugin.cpp
-msgid "Set Bones to Rest Pose"
-msgstr "Pôr Ossos em Pose de Descanso"
-
-#: editor/plugins/skeleton_editor_plugin.cpp
-msgid "Create physical bones"
-msgstr "Criar ossos físicos"
-
-#: editor/plugins/skeleton_editor_plugin.cpp
-msgid "Skeleton"
-msgstr "Esqueleto"
-
-#: editor/plugins/skeleton_editor_plugin.cpp
-msgid "Create physical skeleton"
-msgstr "Criar esqueleto físico"
-
-#: editor/plugins/skeleton_ik_editor_plugin.cpp
-msgid "Play IK"
-msgstr "Executar IK"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Orthogonal"
-msgstr "Ortogonal"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Perspective"
-msgstr "Perspetiva"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Aborted."
-msgstr "Transformação abortada."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "X-Axis Transform."
-msgstr "Transformação no Eixo X."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Y-Axis Transform."
-msgstr "Transformação no Eixo Y."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Z-Axis Transform."
-msgstr "Transformação no Eixo Z."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Plane Transform."
-msgstr "Ver Transformação do Plano."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scaling: "
-msgstr "A escalar: "
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Translating: "
-msgstr "A transladar: "
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotating %s degrees."
-msgstr "A rodar %s graus."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Keying is disabled (no key inserted)."
-msgstr "Edição desativada (nenhuma chave inserida)."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Animation Key Inserted."
-msgstr "Chave de Animação inserida."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Pitch"
-msgstr "Inclinação"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Yaw"
-msgstr "Direção"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Objects Drawn"
-msgstr "Objetos desenhados"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Material Changes"
-msgstr "Mudanças de Material"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Shader Changes"
-msgstr "Alterações do Shader"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Surface Changes"
-msgstr "Mudanças de superfície"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Draw Calls"
-msgstr "Chamadas de desenho"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Vertices"
-msgstr "Vértices"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Top View."
-msgstr "Vista de topo."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Bottom View."
-msgstr "Vista de fundo."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Bottom"
-msgstr "Fundo"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Left View."
-msgstr "Vista de esquerda."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Left"
-msgstr "Esquerda"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Right View."
-msgstr "Vista de direita."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Right"
-msgstr "Direita"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Front View."
-msgstr "Vista de frente."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Front"
-msgstr "Frente"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rear View."
-msgstr "Vista de trás."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rear"
-msgstr "Trás"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Align Transform with View"
-msgstr "Alinhar Transformação com Vista"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Align Rotation with View"
-msgstr "Alinhar Rotação com Vista"
-
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "No parent to instance a child at."
-msgstr "Sem parente para criar instância de filho."
-
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-msgid "This operation requires a single selected node."
-msgstr "Esta operação requer um único Nó selecionado."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Lock View Rotation"
-msgstr "Bloquear Rotação da Vista"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Normal"
-msgstr "Vista normal"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Wireframe"
-msgstr "Vista wireframe"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Overdraw"
-msgstr "Vista Overdraw"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Display Unshaded"
-msgstr "Vista sem sombras"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Environment"
-msgstr "Ver ambiente"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Gizmos"
-msgstr "Ver ferramentas"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Information"
-msgstr "Ver informação"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View FPS"
-msgstr "Ver FPS"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Half Resolution"
-msgstr "Meia resolução"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Audio Listener"
-msgstr "Audição de áudio"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Enable Doppler"
-msgstr "Ativar Doppler"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Cinematic Preview"
-msgstr "Pré-visualização Cinemática"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Not available when using the GLES2 renderer."
-msgstr "Não disponível para o renderizador GLES2."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Left"
-msgstr "Vista livre esquerda"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Right"
-msgstr "Vista livre direita"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Forward"
-msgstr "Vista livre frente"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Backwards"
-msgstr "Vista livre trás"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Up"
-msgstr "Vista livre cima"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Down"
-msgstr "Vista livre baixo"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Speed Modifier"
-msgstr "Modificador de velocidade Freelook"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Freelook Slow Modifier"
-msgstr "Modificador de Velocidade Freelook"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Note: The FPS value displayed is the editor's framerate.\n"
-"It cannot be used as a reliable indication of in-game performance."
-msgstr ""
-"Nota: O FPS mostrado é a taxa de frames do editor.\n"
-"Não é uma indicação fiável do desempenho do jogo."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Rotação da Vista Bloqueada"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
-msgstr "Diálogo XForm"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Nodes To Floor"
-msgstr "Ajustar Nós ao Fundo"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Couldn't find a solid floor to snap the selection to."
-msgstr "Não foi encontrado um chão sólido para ajustar a seleção."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid ""
-"Drag: Rotate\n"
-"Alt+Drag: Move\n"
-"Alt+RMB: Depth list selection"
-msgstr ""
-"Arrastar: Rodar\n"
-"Alt+Arrastar: Mover\n"
-"Alt+RMB: Seleção lista de profundidade"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Use Local Space"
-msgstr "Usar Espaço Local"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Use Snap"
-msgstr "Usar Ajuste"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Bottom View"
-msgstr "Vista de fundo"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Top View"
-msgstr "Vista de topo"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rear View"
-msgstr "Vista de trás"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Front View"
-msgstr "Vista de frente"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Left View"
-msgstr "Vista esquerda"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Right View"
-msgstr "Vista direita"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Switch Perspective/Orthogonal View"
-msgstr "Alternar Vista Perspetiva/Ortogonal"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Insert Animation Key"
-msgstr "Inserir Chave de Animação"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Focus Origin"
-msgstr "Focar na origem"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Focus Selection"
-msgstr "Focar na seleção"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Toggle Freelook"
-msgstr "Alternar Freelook"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Transform"
-msgstr "Transformar"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Object to Floor"
-msgstr "Ajustar Objetos ao Chão"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Dialog..."
-msgstr "Diálogo de transformação..."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "1 Viewport"
-msgstr "1 Vista"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "2 Viewports"
-msgstr "2 vistas"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "2 Viewports (Alt)"
-msgstr "2 vistas (Alt)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "3 Viewports"
-msgstr "3 vistas"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "3 Viewports (Alt)"
-msgstr "3 vistas (Alt)"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "4 Viewports"
-msgstr "4 vistas"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Gizmos"
-msgstr "Bugigangas"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Origin"
-msgstr "Ver origem"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Grid"
-msgstr "Ver grelha"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Settings..."
-msgstr "Configuração..."
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap Settings"
-msgstr "Configuração do Ajuste"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Translate Snap:"
-msgstr "Ajuste de Translação:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate Snap (deg.):"
-msgstr "Ajuste de Rotação (graus):"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale Snap (%):"
-msgstr "Ajuste de Escala (%):"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Viewport Settings"
-msgstr "Configuração de Vista"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Perspective FOV (deg.):"
-msgstr "Perspetiva FOV (graus):"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Z-Near:"
-msgstr "Ver Z-Near:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Z-Far:"
-msgstr "Ver Z-Far:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Change"
-msgstr "Mudar Transformação"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Translate:"
-msgstr "Translação:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Rotate (deg.):"
-msgstr "Rotação (graus):"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Scale (ratio):"
-msgstr "Escala (prop.):"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Transform Type"
-msgstr "Tipo de transformação"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Pre"
-msgstr "Pré"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Post"
-msgstr "Pós"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Nameless gizmo"
-msgstr "Bugiganga sem Nome"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Create Mesh2D"
-msgstr "Criar Mesh2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Mesh2D Preview"
-msgstr "Pré-visualização Mesh2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Create Polygon2D"
-msgstr "Criar Polygon2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Polygon2D Preview"
-msgstr "Pré-visualização Polygon2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Create CollisionPolygon2D"
-msgstr "Criar CollisionPolygon2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "CollisionPolygon2D Preview"
-msgstr "Pré-visualização CollisionPolygon2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Create LightOccluder2D"
-msgstr "Criar LightOccluder2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "LightOccluder2D Preview"
-msgstr "Pré-visualização LightOccluder2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Sprite is empty!"
-msgstr "Sprite está vazia!"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Can't convert a sprite using animation frames to mesh."
-msgstr "Impossível converter sprite com frames de animação para malha."
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't replace by mesh."
-msgstr "Geometria inválida, não substituível por malha."
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Convert to Mesh2D"
-msgstr "Converter para Mesh2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't create polygon."
-msgstr "Geometria inválida, impossível criar polígono."
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Convert to Polygon2D"
-msgstr "Converter para Polygon2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't create collision polygon."
-msgstr "Geometria inválida, impossível criar polígono de colisão."
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Create CollisionPolygon2D Sibling"
-msgstr "Criar irmão de CollisionPolygon2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Invalid geometry, can't create light occluder."
-msgstr "Geometria inválida, impossível criar oclusor de luz."
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Create LightOccluder2D Sibling"
-msgstr "Criar irmão de LightOccluder2D"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Sprite"
-msgstr "Sprite"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Simplification: "
-msgstr "Simplificação: "
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Shrink (Pixels): "
-msgstr "Encolher (Pixeis): "
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Grow (Pixels): "
-msgstr "Aumentar (Pixeis): "
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Update Preview"
-msgstr "Atualizar Pré-visualização"
-
-#: editor/plugins/sprite_editor_plugin.cpp
-msgid "Settings:"
-msgstr "Configuração:"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "No Frames Selected"
-msgstr "Não há Frames Selecionados"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add %d Frame(s)"
-msgstr "Adicionar %d Frame(s)"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Frame"
-msgstr "Adicionar Frame"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Unable to load images"
-msgstr "Incapaz de carregar imagens"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "ERROR: Couldn't load frame resource!"
-msgstr "ERRO: Recurso de frame não carregado!"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Resource clipboard is empty or not a texture!"
-msgstr "Recurso da Área de Transferência vazio ou não é textura!"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Paste Frame"
-msgstr "Colar Frame"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Empty"
-msgstr "Adicionar vazio"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Change Animation FPS"
-msgstr "Mudar FPS da Animação"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "(empty)"
-msgstr "(vazio)"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Move Frame"
-msgstr "Mover Frame"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Animations:"
-msgstr "Animações:"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "New Animation"
-msgstr "Nova Animação"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
-msgstr "Velocidade (FPS):"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Loop"
-msgstr "Ciclo"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Animation Frames:"
-msgstr "Frames da Animação:"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add a Texture from File"
-msgstr "Adicionar Textura do Ficheiro"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Add Frames from a Sprite Sheet"
-msgstr "Adicionar Frames de uma Folha de Sprites"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Insert Empty (Before)"
-msgstr "Inserir vazio (antes)"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Insert Empty (After)"
-msgstr "Inserir vazio (depois)"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Move (Before)"
-msgstr "Mover (antes)"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Move (After)"
-msgstr "Mover (depois)"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Select Frames"
-msgstr "Selecionar Frames"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Horizontal:"
-msgstr "Horizontal:"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Vertical:"
-msgstr "Vertical:"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Select/Clear All Frames"
-msgstr "Selecionar/Apagar Todos os Frames"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Create Frames from Sprite Sheet"
-msgstr "Criar Frames a partir de Folha de Sprites"
-
-#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "SpriteFrames"
-msgstr "SpriteFrames"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Set Region Rect"
-msgstr "Definir região Rect"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Set Margin"
-msgstr "Definir Margem"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Snap Mode:"
-msgstr "Modo Ajuste:"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr "Nenhum"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Pixel Snap"
-msgstr "Ajuste de Pixel"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Grid Snap"
-msgstr "Ajuste de Grelha"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Auto Slice"
-msgstr "Corte automático"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Offset:"
-msgstr "Compensação:"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Step:"
-msgstr "Passo:"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Sep.:"
-msgstr "Sep.:"
-
-#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "TextureRegion"
-msgstr "TextureRegion"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add All Items"
-msgstr "Adicionar todos os itens"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add All"
-msgstr "Adicionar tudo"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Remove All Items"
-msgstr "Remover todos os itens"
-
-#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
-msgid "Remove All"
-msgstr "Remover tudo"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Edit Theme"
-msgstr "Editar Tema"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Theme editing menu."
-msgstr "Menu edição de tema."
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Add Class Items"
-msgstr "Adicionar itens de classe"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Remove Class Items"
-msgstr "Remover itens de classe"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Create Empty Template"
-msgstr "Criar Modelo vazio"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Create Empty Editor Template"
-msgstr "Criar Modelo Editor vazio"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Create From Current Editor Theme"
-msgstr "Criar a partir de tema Editor atual"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Toggle Button"
-msgstr "Alternar Botão"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Disabled Button"
-msgstr "Desativar Botão"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Item"
-msgstr "Item"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Disabled Item"
-msgstr "Item Desativado"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Check Item"
-msgstr "Verificar item"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Checked Item"
-msgstr "Item Marcado"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Radio Item"
-msgstr "Item Rádio"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Checked Radio Item"
-msgstr "Item Rádio Marcado"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Named Sep."
-msgstr "Sep. Nomeado"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Submenu"
-msgstr "Sub-menu"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Subitem 1"
-msgstr "Subitem 1"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Subitem 2"
-msgstr "Subitem 2"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Has"
-msgstr "Tem"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Many"
-msgstr "Muitos"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Disabled LineEdit"
-msgstr "LineEdit Desativado"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Tab 1"
-msgstr "Aba 1"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Tab 2"
-msgstr "Aba 2"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Tab 3"
-msgstr "Aba 3"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Editable Item"
-msgstr "Item Editável"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Subtree"
-msgstr "Sub-árvore"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Has,Many,Options"
-msgstr "Tem,Muitas,Opções"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Data Type:"
-msgstr "Tipo de dados:"
-
-#: editor/plugins/theme_editor_plugin.cpp
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Icon"
-msgstr "Ícone"
-
-#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
-msgid "Style"
-msgstr "Estilo"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Font"
-msgstr "Letra"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Color"
-msgstr "Cor"
-
-#: editor/plugins/theme_editor_plugin.cpp
-msgid "Theme File"
-msgstr "Ficheiro Tema"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Erase Selection"
-msgstr "Apagar seleção"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Fix Invalid Tiles"
-msgstr "Reparar Tiles inválidos"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cut Selection"
-msgstr "Cortar Seleção"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Paint TileMap"
-msgstr "Pintar TileMap"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Line Draw"
-msgstr "Desenhar linha"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rectangle Paint"
-msgstr "Pintar retângulo"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Bucket Fill"
-msgstr "Preencher"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Erase TileMap"
-msgstr "Apagar TileMap"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Find Tile"
-msgstr "Localizar Tile"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Transpose"
-msgstr "Transpor"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Disable Autotile"
-msgstr "Desativar Autotile"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Enable Priority"
-msgstr "Ativar Prioridade"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Filter tiles"
-msgstr "Filtrar Tiles"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Give a TileSet resource to this TileMap to use its tiles."
-msgstr "Dê um recurso TileSet a este TileMap para usar os seus Tiles."
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Paint Tile"
-msgstr "Pintar Tile"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid ""
-"Shift+LMB: Line Draw\n"
-"Shift+Ctrl+LMB: Rectangle Paint"
-msgstr ""
-"Shift+LMB: Desenho de Linha\n"
-"Shift+Ctrl+LMB: Pintura de Retângulo"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Pick Tile"
-msgstr "Escolher Tile"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate Left"
-msgstr "Rodar Esquerda"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate Right"
-msgstr "Rodar Direita"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Flip Horizontally"
-msgstr "Inverter na Horizontal"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Flip Vertically"
-msgstr "Inverter na Vertical"
-
-#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Clear Transform"
-msgstr "Limpar Transformação"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet."
-msgstr "Adicionar Textura(s) ao TileSet."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove selected Texture from TileSet."
-msgstr "Remover Textura selecionado do TileSet."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from Scene"
-msgstr "Criar a partir da Cena"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Merge from Scene"
-msgstr "Fundir a partir da Cena"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "New Single Tile"
-msgstr "Novo Tile Único"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "New Autotile"
-msgstr "Novo Autotile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "New Atlas"
-msgstr "Novo Atlas"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Next Coordinate"
-msgstr "Próxima Coordenada"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Select the next shape, subtile, or Tile."
-msgstr "Selecione a próxima forma, subtile ou Tile."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Previous Coordinate"
-msgstr "Coordenada Anterior"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Select the previous shape, subtile, or Tile."
-msgstr "Selecione a forma, subtile ou Tile anterior."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Region"
-msgstr "Região"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Collision"
-msgstr "Colisão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Occlusion"
-msgstr "Oclusão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Navigation"
-msgstr "Navegação"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Bitmask"
-msgstr "Bitmask"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Priority"
-msgstr "Prioridade"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Z Index"
-msgstr "Índice Z"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Region Mode"
-msgstr "Modo Região"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Collision Mode"
-msgstr "Modo Colisão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Occlusion Mode"
-msgstr "Modo Oclusão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Navigation Mode"
-msgstr "Modo Navegação"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Bitmask Mode"
-msgstr "Modo Bitmask"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Priority Mode"
-msgstr "Modo Prioridade"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Icon Mode"
-msgstr "Modo Ícone"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Z Index Mode"
-msgstr "Modo Índice Z"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Copy bitmask."
-msgstr "Copiar bitmask."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Paste bitmask."
-msgstr "Colar bitmask."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Erase bitmask."
-msgstr "Apagar bitmask."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create a new rectangle."
-msgstr "Criar novo retângulo."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create a new polygon."
-msgstr "Criar um novo polígono."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Keep polygon inside region Rect."
-msgstr "Manter polígono dentro da região Rect."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Enable snap and show grid (configurable via the Inspector)."
-msgstr "Ativar ajuste e mostrar a grelha (configurável através do Inspetor)."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display Tile Names (Hold Alt Key)"
-msgstr "Exibir nome dos Tiles (segure tecla Alt)"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Add or select a texture on the left panel to edit the tiles bound to it."
-msgstr ""
-"Adicione ou selecione uma textura no painel esquerdo para editar os Tiles "
-"vinculados."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr ""
-"Remover textura selecionada? Todos os Tiles que a usam serão removidos."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "You haven't selected a texture to remove."
-msgstr "Não selecionou uma textura para remover."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene? This will overwrite all current tiles."
-msgstr "Criar a partir de cena? Irá substituir todos os Tiles atuais."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Merge from scene?"
-msgstr "Fundir a partir da Cena?"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Texture"
-msgstr "Remover Textura"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "%s file(s) were not added because was already on the list."
-msgstr "%s ficheiro(s) não foi/foram adicionado(s) por já estar(em) na lista."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Drag handles to edit Rect.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"Arrastar manipuladores para editar Rect.\n"
-"Clique em outro Tile para o editar."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Delete selected Rect."
-msgstr "Eliminar Rect seleccionado."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select current edited sub-tile.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"Selecionar o sub-tile editado.\n"
-"Clique em outro Tile para o editar."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Delete polygon."
-msgstr "Apagar polígono."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"LMB: Set bit on.\n"
-"RMB: Set bit off.\n"
-"Shift+LMB: Set wildcard bit.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"LMB: Ligar bit.\n"
-"RMB: Desligar bit.\n"
-"Shift+LMB: Definir bit genérico.\n"
-"Clique em outro Tile para o editar."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"Selecionar sub-tile para usar como ícone, também será usado em ligações "
-"inválidas autotile.\n"
-"Clique em outro Tile para o editar."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to change its priority.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"Selecionar sub-tile para alterar a sua prioridade.\n"
-"Clique em outro Tile para o editar."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to change its z index.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"Selecionar sub-tile para alterar o seu índice.\n"
-"Clique em outro Tile para o editar."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Set Tile Region"
-msgstr "Definir Região Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create Tile"
-msgstr "Criar Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Set Tile Icon"
-msgstr "Definir Ícone de Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Edit Tile Bitmask"
-msgstr "Editar Bitmask to Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Edit Collision Polygon"
-msgstr "Editar Polígono de Colisão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Edit Occlusion Polygon"
-msgstr "Editar Polígono de Oclusão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Edit Navigation Polygon"
-msgstr "Editar Polígono de Navegação"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Paste Tile Bitmask"
-msgstr "Colar Bitmask de Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Clear Tile Bitmask"
-msgstr "Limpar Bitmask de Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Make Polygon Concave"
-msgstr "Fazer Polígono Côncavo"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Make Polygon Convex"
-msgstr "Fazer Polígono Convexo"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Tile"
-msgstr "Remover Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Collision Polygon"
-msgstr "Remover Polígono de Colisão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Occlusion Polygon"
-msgstr "Remover Polígono de Oclusão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Navigation Polygon"
-msgstr "Remover Polígono de Navegação"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Edit Tile Priority"
-msgstr "Editar Prioridade de Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Edit Tile Z Index"
-msgstr "Editar Índice Z de Tile"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Make Convex"
-msgstr "Fazer Convexo"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Make Concave"
-msgstr "Fazer Côncavo"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create Collision Polygon"
-msgstr "Criar Polígono de Colisão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create Occlusion Polygon"
-msgstr "Criar Polígono de Oclusão"
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "This property can't be changed."
-msgstr "Esta propriedade não pode ser alterada."
-
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "TileSet"
-msgstr "TileSet"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No VCS addons are available."
-msgstr "Não existem addons VCS disponíveis."
-
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
-msgid "Error"
-msgstr "Erro"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No commit message was provided"
-msgstr "Nenhuma mensagem de gravação foi fornecida"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No files added to stage"
-msgstr "Nenhum ficheiro adicionado ao palco"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Commit"
-msgstr "Gravar"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "VCS Addon is not initialized"
-msgstr "Addon VCS não foi inicializado"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Version Control System"
-msgstr "Sistema de Controlo de Versões"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Initialize"
-msgstr "Inicializar"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Staging area"
-msgstr "Área de Palco"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Detect new changes"
-msgstr "Detetar novas alterações"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Changes"
-msgstr "Alterações"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Modified"
-msgstr "Modificado"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Renamed"
-msgstr "Renomeado"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Deleted"
-msgstr "Apagado"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Typechange"
-msgstr "Mudança de tipo"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Stage Selected"
-msgstr "Palco Selecionado"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Stage All"
-msgstr "Tudo no Palco"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Add a commit message"
-msgstr "Adicionar mensagem de gravação"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Commit Changes"
-msgstr "Gravar Alterações"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Status"
-msgstr "Status"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "View file diffs before committing them to the latest version"
-msgstr "Ver diffs dos ficheiros antes de atualizá-los para a última versão"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "No file diff is active"
-msgstr "Nenhum ficheiro diff está ativo"
-
-#: editor/plugins/version_control_editor_plugin.cpp
-msgid "Detect changes in file diff"
-msgstr "Detetar alterações em ficheiro diff"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(GLES3 only)"
-msgstr "(Apenas GLES3)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Output"
-msgstr "Adicionar Saída"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar"
-msgstr "Escalar"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector"
-msgstr "Vetor"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Boolean"
-msgstr "Lógico"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Sampler"
-msgstr "Mostrador"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add input port"
-msgstr "Adicionar porta de entrada"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add output port"
-msgstr "Adicionar porta de saída"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Change input port type"
-msgstr "Mudar tipo de porta de entrada"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Change output port type"
-msgstr "Mudar tipo de porta de saída"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Change input port name"
-msgstr "Mudar nome de porta de entrada"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Change output port name"
-msgstr "Mudar nome de porta de saída"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Remove input port"
-msgstr "Remover porta de entrada"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Remove output port"
-msgstr "Remover porta de saída"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Set expression"
-msgstr "Definir expressão"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Resize VisualShader node"
-msgstr "Redimensionar nó VisualShader"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Set Uniform Name"
-msgstr "Definir Nome do Uniform"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Set Input Default Port"
-msgstr "Definir Porta de Entrada Padrão"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node to Visual Shader"
-msgstr "Adicionar Nó ao Visual Shader"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Duplicate Nodes"
-msgstr "Duplicar Nós"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste Nodes"
-msgstr "Colar Nós"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Delete Nodes"
-msgstr "Apagar Nós"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Input Type Changed"
-msgstr "Alterado Tipo de Entrada do Visual Shader"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vertex"
-msgstr "Vértice"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Fragment"
-msgstr "Fragmento"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Light"
-msgstr "Luz"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Show resulted shader code."
-msgstr "Mostrar código-resultado do shader."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Create Shader Node"
-msgstr "Criar Nó Shader"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Color function."
-msgstr "Função Cor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Color operator."
-msgstr "Operador de Cor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Grayscale function."
-msgstr "Função Cinza."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts HSV vector to RGB equivalent."
-msgstr "Converte vetor HSV para equivalente RGB."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts RGB vector to HSV equivalent."
-msgstr "Converte vetor RGB para equivalente HSV."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Sepia function."
-msgstr "Função Sépia."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Burn operator."
-msgstr "Operador de Queima."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Darken operator."
-msgstr "Operador Escurecer."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Difference operator."
-msgstr "Operador Diferença."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Dodge operator."
-msgstr "Operador Desvio."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "HardLight operator."
-msgstr "Operador HardLight."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Lighten operator."
-msgstr "Operador Clarear."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Overlay operator."
-msgstr "Operador Sobrepor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Screen operator."
-msgstr "Operador Ecrã."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "SoftLight operator."
-msgstr "Operador SoftLight."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Color constant."
-msgstr "Constante Cor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Color uniform."
-msgstr "Uniforme Cor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr "Devolve o resultado lógico da comparação %s entre dois parâmetros."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Equal (==)"
-msgstr "Igual (==)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Greater Than (>)"
-msgstr "Maior Que (>)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Greater Than or Equal (>=)"
-msgstr "Maior ou Igual a (>=)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns an associated vector if the provided scalars are equal, greater or "
-"less."
-msgstr ""
-"Devolve um vetor associado se o escalar fornecido for igual, maior ou menor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the boolean result of the comparison between INF and a scalar "
-"parameter."
-msgstr ""
-"Devolve o resultado lógico da comparação entre INF e um parâmetro escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the boolean result of the comparison between NaN and a scalar "
-"parameter."
-msgstr ""
-"Devolve o resultado lógico da comparação entre NaN e um parâmetro escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Less Than (<)"
-msgstr "Menor Que (<)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Less Than or Equal (<=)"
-msgstr "Menor ou Igual a (<=)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Not Equal (!=)"
-msgstr "Diferente (!=)"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns an associated vector if the provided boolean value is true or false."
-msgstr ""
-"Devolve um vetor associado se o valor lógico fornecido for verdadeiro ou "
-"falso."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns an associated scalar if the provided boolean value is true or false."
-msgstr ""
-"Devolve um escalar associado se o valor lógico fornecido for verdadeiro ou "
-"falso."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the boolean result of the comparison between two parameters."
-msgstr "Devolve o resultado lógico da comparação entre dois parâmetros."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the boolean result of the comparison between INF (or NaN) and a "
-"scalar parameter."
-msgstr ""
-"Devolve o resultado lógico da comparação entre INF (ou NaN) e um parâmetro "
-"escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Boolean constant."
-msgstr "Constante Lógica."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Boolean uniform."
-msgstr "Uniforme Lógico."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for all shader modes."
-msgstr "parâmetro de entrada '%s' para todos os modos shader."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Input parameter."
-msgstr "Parâmetro de Entrada."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr "parâmetro de entrada '%s' para os modos shader vertex e fragment."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for fragment and light shader modes."
-msgstr "parâmetro de entrada '%s' para os modos shader fragment e light."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for fragment shader mode."
-msgstr "parâmetro de entrada '%s' para o modo shader fragment."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for light shader mode."
-msgstr "parâmetro de entrada '%s' para o modo shader light."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for vertex shader mode."
-msgstr "parâmetro de entrada '%s' para modo shader vertex."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr "parâmetro de entrada '%s' para os modos shader vertex e fragment."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar function."
-msgstr "Função Escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar operator."
-msgstr "Operador Escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "E constant (2.718282). Represents the base of the natural logarithm."
-msgstr "Constante E (2.718282). Base dos logaritmos naturais."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr "Constante Epsilon (0.00001). O menor número escalar possível."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Phi constant (1.618034). Golden ratio."
-msgstr "Constante Phi (1.618034). Proporção áurea."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr "Constante Pi/4 (0.785398) ou 45 graus."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr "Constante Pi/2 (1.570796) ou 90 graus."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Pi constant (3.141593) or 180 degrees."
-msgstr "Constante Pi (3.141593) ou 180 graus."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Tau constant (6.283185) or 360 degrees."
-msgstr "Constante Tau (6.283185) ou 360 graus."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr "Constante Sqrt2 (1.414214). Raiz quadrada de 2."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the absolute value of the parameter."
-msgstr "Devolve o valor absoluto do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-cosine of the parameter."
-msgstr "Devolve o arco seno do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr "Devolve o arco cosseno hiperbólico do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-sine of the parameter."
-msgstr "Devolve o arco seno do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr "Devolve o arco seno hiperbólico do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-tangent of the parameter."
-msgstr "Devolve o arco tangente do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the arc-tangent of the parameters."
-msgstr "Devolve o arco tangente do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr "Devolve o arco tangente hiperbólico do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr "Encontra o inteiro mais próximo que seja maior ou igual ao parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Constrains a value to lie between two further values."
-msgstr "Restringe um valor entre dois valores suplementares."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the cosine of the parameter."
-msgstr "Devolve o cosseno do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the hyperbolic cosine of the parameter."
-msgstr "Devolve o cosseno hiperbólico do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts a quantity in radians to degrees."
-msgstr "Converte um valor em radianos para graus."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Base-e Exponential."
-msgstr "Exponencial base e."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Base-2 Exponential."
-msgstr "Exponencial base 2."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr "Encontra o inteiro mais próximo que seja menor ou igual ao parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Computes the fractional part of the argument."
-msgstr "Calcula a parte fracionária do argumento."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the inverse of the square root of the parameter."
-msgstr "Devolve o inverso da raiz quadrada do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Natural logarithm."
-msgstr "Logaritmo natural."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Base-2 logarithm."
-msgstr "Logaritmo base 2."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the greater of two values."
-msgstr "Devolve o maior de dois valores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the lesser of two values."
-msgstr "Devolve o menor de dois valores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Linear interpolation between two scalars."
-msgstr "Interpolação linear entre dois escalares."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the opposite value of the parameter."
-msgstr "Devolve o valor oposto do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 - scalar"
-msgstr "1.0 - escalar"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the value of the first parameter raised to the power of the second."
-msgstr "Devolve o valor do primeiro parâmetro elevado à potência do segundo."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Converts a quantity in degrees to radians."
-msgstr "Converte um valor em graus para radianos."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 / scalar"
-msgstr "1.0 / escalar"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the nearest integer to the parameter."
-msgstr "Encontra o inteiro mais próximo do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the nearest even integer to the parameter."
-msgstr "Encontra o inteiro ímpar mais próximo do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Clamps the value between 0.0 and 1.0."
-msgstr "Limita o valor entre 0.0 e 1.0."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Extracts the sign of the parameter."
-msgstr "Extrai o sinal do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the sine of the parameter."
-msgstr "Devolve o seno do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the hyperbolic sine of the parameter."
-msgstr "Devolve o seno hiperbólico do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the square root of the parameter."
-msgstr "Devolve a raiz quadrada do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than "
-"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
-"using Hermite polynomials."
-msgstr ""
-"Função SmoothStep( escalar(limite0), escalar(limite1), escalar(x) ).\n"
-"\n"
-"Devolve 0.0 se 'x' for menor que 'limite0' e 1.0 se 'x' for maior que "
-"'limite1'. Caso contrário o valor devolvido é interpolado entre 0.0 and 1.0 "
-"usando polinomiais Hermite."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Step function( scalar(edge), scalar(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
-msgstr ""
-"Função Step( escalar(limite), escalar(x) ).\n"
-"\n"
-"Devolve 0.0 se 'x' for menor que 'limite' e 1.0 se não for."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the tangent of the parameter."
-msgstr "Devolve a tangente do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the hyperbolic tangent of the parameter."
-msgstr "Devolve a tangente hiperbólica do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Finds the truncated value of the parameter."
-msgstr "Encontra o valor truncado do parâmetro."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Adds scalar to scalar."
-msgstr "Adiciona escalar a escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Divides scalar by scalar."
-msgstr "Divide escalar por escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies scalar by scalar."
-msgstr "Multiplica escalar por escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the remainder of the two scalars."
-msgstr "Devolve o resto dos dois escalares."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Subtracts scalar from scalar."
-msgstr "Subtrai escalar a escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar constant."
-msgstr "Constante Escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Scalar uniform."
-msgstr "Uniforme Escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Perform the cubic texture lookup."
-msgstr "Executa cubic texture lookup."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Perform the texture lookup."
-msgstr "Executa texture lookup."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Cubic texture uniform lookup."
-msgstr "Consulta uniforme de textura cúbica."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "2D texture uniform lookup."
-msgstr "Consulta uniforme de textura 2D."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "2D texture uniform lookup with triplanar."
-msgstr "Consulta uniforme de textura 2D com triplanar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Transform function."
-msgstr "Função Transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Calculate the outer product of a pair of vectors.\n"
-"\n"
-"OuterProduct treats the first parameter 'c' as a column vector (matrix with "
-"one column) and the second parameter 'r' as a row vector (matrix with one "
-"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix "
-"whose number of rows is the number of components in 'c' and whose number of "
-"columns is the number of components in 'r'."
-msgstr ""
-"Calcula o produto tensorial de um par de vetores.\n"
-"\n"
-"OuterProduct trata o primeiro parâmetro 'c' como um vetor coluna (matriz com "
-"uma coluna) e o segundo parâmetro 'r' como um vetor linha (matriz com uma "
-"linha) e faz uma multiplicação matricial algébrica linear 'c * r', "
-"resultando uma matriz cujo número de linhas é o número de componentes em 'c' "
-"e cujo número de colunas é o número de componentes de 'r'."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Composes transform from four vectors."
-msgstr "Compõe transformação a partir de quatro vetores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Decomposes transform to four vectors."
-msgstr "Decompõe transformação em quatro vetores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the determinant of a transform."
-msgstr "Calcula o determinante de uma transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the inverse of a transform."
-msgstr "Calcula o inverso de uma transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the transpose of a transform."
-msgstr "Calcula a transposta de uma transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies transform by transform."
-msgstr "Multiplica transformação por transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies vector by transform."
-msgstr "Multiplica vetor por transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Transform constant."
-msgstr "Constante Transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Transform uniform."
-msgstr "Uniforme Transformação."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector function."
-msgstr "Função Vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector operator."
-msgstr "Operador Vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Composes vector from three scalars."
-msgstr "Compõe vetor a partir de três escalares."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Decomposes vector to three scalars."
-msgstr "Decompõe vetor em três escalares."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the cross product of two vectors."
-msgstr "Calcula o produto vetorial de dois vetores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the distance between two points."
-msgstr "Devolve a distância entre dois pontos."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the dot product of two vectors."
-msgstr "Calcula o produto escalar de dois vetores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the vector that points in the same direction as a reference vector. "
-"The function has three vector parameters : N, the vector to orient, I, the "
-"incident vector, and Nref, the reference vector. If the dot product of I and "
-"Nref is smaller than zero the return value is N. Otherwise -N is returned."
-msgstr ""
-"Devolve um vetor com a mesma direção de um vetor referência. A função tem "
-"três parâmetro: N, o vetor a orientar, I, o vetor incidente, e Nref, o vetor "
-"referência. Se o produto escalar de I e Nref for menor que zero o valor de "
-"retorno é N, Caso contrário -N será devolvido."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the length of a vector."
-msgstr "Calcula o comprimento de um vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Linear interpolation between two vectors."
-msgstr "Interpolação linear entre dois vetores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Linear interpolation between two vectors using scalar."
-msgstr "Interpolação linear entre dois vetores usando um escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Calculates the normalize product of vector."
-msgstr "Calcula o produto normalizado do vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 - vector"
-msgstr "1.0 - vetor"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "1.0 / vector"
-msgstr "1.0 / vetor"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns the vector that points in the direction of reflection ( a : incident "
-"vector, b : normal vector )."
-msgstr ""
-"Devolve um vetor que aponta na direção da reflexão ( a : vetor incidente, "
-"b : vetor normal )."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the vector that points in the direction of refraction."
-msgstr "Devolve um vetor que aponta na direção da refração."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
-"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
-"using Hermite polynomials."
-msgstr ""
-"Função SmoothStep( vetor(limite0), vetor(limite1), vetor(x) ).\n"
-"\n"
-"Devolve 0.0 se 'x' for menor que 'limite0' e 1.0 se 'x' for maior que "
-"'limite1'. Caso contrário o valor devolvido é interpolado entre 0.0 and 1.0 "
-"usando polinomiais Hermite."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than "
-"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
-"using Hermite polynomials."
-msgstr ""
-"Função SmoothStep( escalar(limite0), escalar(limite1), vetor(x) ).\n"
-"\n"
-"Devolve 0.0 se 'x' for menor que 'limite0' e 1.0 se 'x' for maior que "
-"'limite1'. Caso contrário o valor devolvido é interpolado entre 0.0 and 1.0 "
-"usando polinomiais Hermite."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Step function( vector(edge), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
-msgstr ""
-"Função Step( vetor(limite), vetor(x) ).\n"
-"\n"
-"Devolve 0.0 se 'x' for menor que 'limite', senão devolve 1.0."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Step function( scalar(edge), vector(x) ).\n"
-"\n"
-"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
-msgstr ""
-"Função Step( escalar(limite), vetor(x) ).\n"
-"\n"
-"Devolve 0.0 se 'x' for menor que 'limite', senão devolve 1.0."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Adds vector to vector."
-msgstr "Adiciona vetor a vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Divides vector by vector."
-msgstr "Divide vetor com vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Multiplies vector by vector."
-msgstr "Multiplica vetor com vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Returns the remainder of the two vectors."
-msgstr "Devolve o resto dos dois vetores."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Subtracts vector from vector."
-msgstr "Subtrai vetor a vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector constant."
-msgstr "Constante Vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Vector uniform."
-msgstr "Uniforme Vetor."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Custom Godot Shader Language expression, with custom amount of input and "
-"output ports. This is a direct injection of code into the vertex/fragment/"
-"light function, do not use it to write the function declarations inside."
-msgstr ""
-"Expressão personalizada da Linguagem Godot Shader, com quantidade variável "
-"de portas de entrada e saída. Isto é uma injeção direta de código na função "
-"vertex/fragment/light, não a use para escrever as declarações internas da "
-"função."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Returns falloff based on the dot product of surface normal and view "
-"direction of camera (pass associated inputs to it)."
-msgstr ""
-"Devolve queda baseada no produto escalar da normal à superfície e da direção "
-"da câmara (passa entradas associadas)."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"Custom Godot Shader Language expression, which is placed on top of the "
-"resulted shader. You can place various function definitions inside and call "
-"it later in the Expressions. You can also declare varyings, uniforms and "
-"constants."
-msgstr ""
-"Expressão personalizada em Linguagem Godot Shader, colocada sobre o shader "
-"resultante. Pode colocar várias definições de função e chamá-las depois nas "
-"Expressões. Também pode declarar variantes, uniformes e constantes."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr "(Apenas modo Fragment/Light) Função derivada escalar."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr "(Apenas modo Fragment/Light) Função derivada vetorial."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
-"differencing."
-msgstr "(Apenas modo Fragment/Light) Derivada em 'x' usando derivação local."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
-"differencing."
-msgstr ""
-"(Apenas modo Fragment/Light) (Escalar) Derivada em 'x' usando derivação "
-"local."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
-"differencing."
-msgstr ""
-"(Apenas modo Fragment/Light) (Vetor) Derivada em 'y' usando derivação local."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
-"differencing."
-msgstr ""
-"(Apenas modo Fragment/Light) (Escalar) Derivada em 'y' usando derivação "
-"local."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
-"'y'."
-msgstr ""
-"(Apenas modo Fragment/Light) (Vetor) Soma das derivadas absolutas em 'x' e "
-"'y'."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid ""
-"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
-"'y'."
-msgstr ""
-"(Apenas modo Fragment/Light) (Escalar) Soma das derivadas absolutas em 'x' e "
-"'y'."
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "VisualShader"
-msgstr "VIsualShader"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Edit Visual Property"
-msgstr "Editar Propriedade Visual"
-
-#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Visual Shader Mode Changed"
-msgstr "Modo do Visual Shader Alterado"
-
-#: editor/project_export.cpp
-msgid "Runnable"
-msgstr "Executável"
-
-#: editor/project_export.cpp
-msgid "Add initial export..."
-msgstr "Adicionar exportação inicial..."
-
-#: editor/project_export.cpp
-msgid "Add previous patches..."
-msgstr "Aplicar correções anteriores..."
-
-#: editor/project_export.cpp
-msgid "Delete patch '%s' from list?"
-msgstr "Apagar correção '%s' da lista?"
-
-#: editor/project_export.cpp
-msgid "Delete preset '%s'?"
-msgstr "Apagar predefinição '%s'?"
-
-#: editor/project_export.cpp
-msgid ""
-"Failed to export the project for platform '%s'.\n"
-"Export templates seem to be missing or invalid."
-msgstr ""
-"Falhou a exportação do projeto para a plataforma '%s'.\n"
-"O Modelo de exportação está ausente ou é inválido."
-
-#: editor/project_export.cpp
-msgid ""
-"Failed to export the project for platform '%s'.\n"
-"This might be due to a configuration issue in the export preset or your "
-"export settings."
-msgstr ""
-"Falhou a exportação do projeto para a plataforma '%s'.\n"
-"Pode ser provocado por um problema na predefinição ou configuração da "
-"exportação."
-
-#: editor/project_export.cpp
-msgid "Release"
-msgstr "Libertar"
-
-#: editor/project_export.cpp
-msgid "Exporting All"
-msgstr "A Exportar Tudo"
-
-#: editor/project_export.cpp
-msgid "The given export path doesn't exist:"
-msgstr "O caminho de exportação não existe:"
-
-#: editor/project_export.cpp
-msgid "Export templates for this platform are missing/corrupted:"
-msgstr ""
-"Modelos de exportação para esta plataforma estão ausentes/corrompidos :"
-
-#: editor/project_export.cpp
-msgid "Presets"
-msgstr "Predefinições"
-
-#: editor/project_export.cpp editor/project_settings_editor.cpp
-msgid "Add..."
-msgstr "Adicionar..."
-
-#: editor/project_export.cpp
-msgid ""
-"If checked, the preset will be available for use in one-click deploy.\n"
-"Only one preset per platform may be marked as runnable."
-msgstr ""
-"Se marcada, a predefinição estará disponível para uso em distribuição um-"
-"clique.\n"
-"Apenas uma predefinição por plataforma pode ser marcada como executável."
-
-#: editor/project_export.cpp
-msgid "Export Path"
-msgstr "Exportar Caminho"
-
-#: editor/project_export.cpp
-msgid "Resources"
-msgstr "Recursos"
-
-#: editor/project_export.cpp
-msgid "Export all resources in the project"
-msgstr "Exportar todos os recursos do Projeto"
-
-#: editor/project_export.cpp
-msgid "Export selected scenes (and dependencies)"
-msgstr "Exportar Cenas (e dependências) selecionadas"
-
-#: editor/project_export.cpp
-msgid "Export selected resources (and dependencies)"
-msgstr "Exportar recursos (e dependências) selecionados"
-
-#: editor/project_export.cpp
-msgid "Export Mode:"
-msgstr "Modo exportação:"
-
-#: editor/project_export.cpp
-msgid "Resources to export:"
-msgstr "Recursos a exportar:"
-
-#: editor/project_export.cpp
-msgid ""
-"Filters to export non-resource files/folders\n"
-"(comma-separated, e.g: *.json, *.txt, docs/*)"
-msgstr ""
-"Filtros para exportar ficheiros/pastas não-recursos\n"
-"(separados por vírgula, ex: *.json, *.txt, docs/*)"
-
-#: editor/project_export.cpp
-msgid ""
-"Filters to exclude files/folders from project\n"
-"(comma-separated, e.g: *.json, *.txt, docs/*)"
-msgstr ""
-"Filtros para excluir ficheiros/pastas do projeto\n"
-"(separados por vírgula, ex: *.json, *.txt, docs/*)"
-
-#: editor/project_export.cpp
-msgid "Patches"
-msgstr "Correções"
-
-#: editor/project_export.cpp
-msgid "Make Patch"
-msgstr "Fazer Correção"
-
-#: editor/project_export.cpp
-msgid "Pack File"
-msgstr "Ficheiro Pacote"
-
-#: editor/project_export.cpp
-msgid "Features"
-msgstr "Características"
-
-#: editor/project_export.cpp
-msgid "Custom (comma-separated):"
-msgstr "Personalizado (separados por vírgula):"
-
-#: editor/project_export.cpp
-msgid "Feature List:"
-msgstr "Lista de características:"
-
-#: editor/project_export.cpp
-msgid "Script"
-msgstr "Script"
-
-#: editor/project_export.cpp
-msgid "Script Export Mode:"
-msgstr "Modo Exportação de Script:"
-
-#: editor/project_export.cpp
-msgid "Text"
-msgstr "Texto"
-
-#: editor/project_export.cpp
-msgid "Compiled"
-msgstr "Compilado"
-
-#: editor/project_export.cpp
-msgid "Encrypted (Provide Key Below)"
-msgstr "Encriptado (Fornecer Chave em Baixo)"
-
-#: editor/project_export.cpp
-msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr "Chave de Encriptação Inválida (tem de ter 64 caracteres)"
-
-#: editor/project_export.cpp
-msgid "Script Encryption Key (256-bits as hex):"
-msgstr "Chave de Encriptação de Script (Hexadecimal 256-bits):"
-
-#: editor/project_export.cpp
-msgid "Export PCK/Zip"
-msgstr "Exportar PCK/Zip"
-
-#: editor/project_export.cpp
-msgid "Export Project"
-msgstr "Exportar Projeto"
-
-#: editor/project_export.cpp
-msgid "Export mode?"
-msgstr "Modo Exportação?"
-
-#: editor/project_export.cpp
-msgid "Export All"
-msgstr "Exportar Tudo"
-
-#: editor/project_export.cpp editor/project_manager.cpp
-msgid "ZIP File"
-msgstr "Ficheiro ZIP"
-
-#: editor/project_export.cpp
-msgid "Godot Game Pack"
-msgstr "Pacote de Jogo Godot"
-
-#: editor/project_export.cpp
-msgid "Export templates for this platform are missing:"
-msgstr "Não existem Modelos de exportação para esta plataforma:"
-
-#: editor/project_export.cpp
-msgid "Manage Export Templates"
-msgstr "Gerir Modelos de Exportação"
-
-#: editor/project_export.cpp
-msgid "Export With Debug"
-msgstr "Exportar com Depuração"
-
-#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "O Caminho não existe."
-
-#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr ""
-"Ficheiro de projeto '.zip' inválido, não contém um ficheiro 'project.godot'."
-
-#: editor/project_manager.cpp
-msgid "Please choose an empty folder."
-msgstr "Por favor escolha uma pasta vazia."
-
-#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Escolha um ficheiro 'project.godot' ou '.zip'."
-
-#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "A pasta já contém um projeto Godot."
-
-#: editor/project_manager.cpp
-msgid "New Game Project"
-msgstr "Novo Projeto de jogo"
-
-#: editor/project_manager.cpp
-msgid "Imported Project"
-msgstr "Projeto importado"
-
-#: editor/project_manager.cpp
-msgid "Invalid Project Name."
-msgstr "Nome do Projeto Inválido."
-
-#: editor/project_manager.cpp
-msgid "Couldn't create folder."
-msgstr "Impossível criar pasta."
-
-#: editor/project_manager.cpp
-msgid "There is already a folder in this path with the specified name."
-msgstr "Já existe uma pasta neste caminho com o nome indicado."
-
-#: editor/project_manager.cpp
-msgid "It would be a good idea to name your project."
-msgstr "Seria uma boa ideia dar um nome ao Projeto."
-
-#: editor/project_manager.cpp
-msgid "Invalid project path (changed anything?)."
-msgstr "Caminho de Projeto inválido (alguma alteração?)."
-
-#: editor/project_manager.cpp
-msgid ""
-"Couldn't load project.godot in project path (error %d). It may be missing or "
-"corrupted."
-msgstr ""
-"Não foi possível carregar o project.godot no caminho do projeto (erro %d). "
-"Poderá estar em falta ou corrompido."
-
-#: editor/project_manager.cpp
-msgid "Couldn't edit project.godot in project path."
-msgstr "Impossível editar project.godot no Caminho do Projeto."
-
-#: editor/project_manager.cpp
-msgid "Couldn't create project.godot in project path."
-msgstr "Impossível criar project.godot no Caminho do Projeto."
-
-#: editor/project_manager.cpp
-msgid "Rename Project"
-msgstr "Renomear Projeto"
-
-#: editor/project_manager.cpp
-msgid "Import Existing Project"
-msgstr "Importar Projeto existente"
-
-#: editor/project_manager.cpp
-msgid "Import & Edit"
-msgstr "Importar & Editar"
-
-#: editor/project_manager.cpp
-msgid "Create New Project"
-msgstr "Criar novo Projeto"
-
-#: editor/project_manager.cpp
-msgid "Create & Edit"
-msgstr "Criar & Editar"
-
-#: editor/project_manager.cpp
-msgid "Install Project:"
-msgstr "Instalar Projeto:"
-
-#: editor/project_manager.cpp
-msgid "Install & Edit"
-msgstr "Instalar & Editar"
-
-#: editor/project_manager.cpp
-msgid "Project Name:"
-msgstr "Nome do Projeto:"
-
-#: editor/project_manager.cpp
-msgid "Project Path:"
-msgstr "Caminho do Projeto:"
-
-#: editor/project_manager.cpp
-msgid "Project Installation Path:"
-msgstr "Caminho de Instalação do Projeto:"
-
-#: editor/project_manager.cpp
-msgid "Renderer:"
-msgstr "Renderizador:"
-
-#: editor/project_manager.cpp
-msgid "OpenGL ES 3.0"
-msgstr "OpenGL ES 3.0"
-
-#: editor/project_manager.cpp
-msgid ""
-"Higher visual quality\n"
-"All features available\n"
-"Incompatible with older hardware\n"
-"Not recommended for web games"
-msgstr ""
-"Qualidade visual superior\n"
-"Todas as características disponíveis\n"
-"Incompatível com hardware antigo\n"
-"Não recomendado para jogos Web"
-
-#: editor/project_manager.cpp
-msgid "OpenGL ES 2.0"
-msgstr "OpenGL ES 2.0"
-
-#: editor/project_manager.cpp
-msgid ""
-"Lower visual quality\n"
-"Some features not available\n"
-"Works on most hardware\n"
-"Recommended for web games"
-msgstr ""
-"Qualidade visual inferior\n"
-"Algumas características indisponíveis\n"
-"Funciona na maioria do hardware\n"
-"Recomendado para jogos Web"
-
-#: editor/project_manager.cpp
-msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
-"O Renderizador pode ser alterado mais tarde, mas as cenas poderão ter de ser "
-"ajustadas."
-
-#: editor/project_manager.cpp
-msgid "Unnamed Project"
-msgstr "Projeto sem nome"
-
-#: editor/project_manager.cpp
-msgid "Missing Project"
-msgstr "Projeto Inexistente"
-
-#: editor/project_manager.cpp
-msgid "Error: Project is missing on the filesystem."
-msgstr "Erro: Projeto inexistente no sistema de ficheiros."
-
-#: editor/project_manager.cpp
-msgid "Can't open project at '%s'."
-msgstr "Impossível abrir Projeto em '%s'."
-
-#: editor/project_manager.cpp
-msgid "Are you sure to open more than one project?"
-msgstr "Está seguro que quer abrir mais do que um Projeto?"
-
-#: editor/project_manager.cpp
-msgid ""
-"The following project settings file does not specify the version of Godot "
-"through which it was created.\n"
-"\n"
-"%s\n"
-"\n"
-"If you proceed with opening it, it will be converted to Godot's current "
-"configuration file format.\n"
-"Warning: You won't be able to open the project with previous versions of the "
-"engine anymore."
-msgstr ""
-"A seguinte configuração do projeto não especifica a versão do Godot em que "
-"foi criada.\n"
-"\n"
-"%s\n"
-"\n"
-"Se continuar com a abertura, será convertida para o formato da versão "
-"atual.\n"
-"Aviso: Não conseguirá mais abrir o projeto em versões anteriores à deste "
-"motor."
-
-#: editor/project_manager.cpp
-msgid ""
-"The following project settings file was generated by an older engine "
-"version, and needs to be converted for this version:\n"
-"\n"
-"%s\n"
-"\n"
-"Do you want to convert it?\n"
-"Warning: You won't be able to open the project with previous versions of the "
-"engine anymore."
-msgstr ""
-"A seguinte configuração do projeto foi gerada por um motor mais antigo, e "
-"precisa de ser convertida para esta versão.\n"
-"\n"
-"%s\n"
-"\n"
-"Deseja convertê-la?\n"
-"Aviso: Não conseguirá mais abrir o projeto em versões anteriores à deste "
-"motor."
-
-#: editor/project_manager.cpp
-msgid ""
-"The project settings were created by a newer engine version, whose settings "
-"are not compatible with this version."
-msgstr ""
-"A configuração do projeto foi criada por um motor de versão mais recente, "
-"cuja configuração não é compatível com esta versão."
-
-#: editor/project_manager.cpp
-msgid ""
-"Can't run project: no main scene defined.\n"
-"Please edit the project and set the main scene in the Project Settings under "
-"the \"Application\" category."
-msgstr ""
-"Impossível executar o Projeto: Cena principal não definida.\n"
-"Edite o Projeto e defina a Cena principal em Definições do Projeto dentro da "
-"categoria \"Aplicação\"."
-
-#: editor/project_manager.cpp
-msgid ""
-"Can't run project: Assets need to be imported.\n"
-"Please edit the project to trigger the initial import."
-msgstr ""
-"Impossível executar o Projeto: Ativos têm de ser importados.\n"
-"Edite o Projeto para desencadear a importação inicial."
-
-#: editor/project_manager.cpp
-msgid "Are you sure to run %d projects at once?"
-msgstr "Está seguro que quer executar %d projetos em simultâneo?"
-
-#: editor/project_manager.cpp
-msgid ""
-"Remove %d projects from the list?\n"
-"The project folders' contents won't be modified."
-msgstr ""
-"Remover %d projetos da lista?\n"
-"O conteúdo das pastas não será modificado."
-
-#: editor/project_manager.cpp
-msgid ""
-"Remove this project from the list?\n"
-"The project folder's contents won't be modified."
-msgstr ""
-"Remover este projeto da lista?\n"
-"O conteúdo da pasta não será modificado."
-
-#: editor/project_manager.cpp
-msgid ""
-"Remove all missing projects from the list?\n"
-"The project folders' contents won't be modified."
-msgstr ""
-"Remover todos os projetos inexistentes da lista?\n"
-"O conteúdo das pastas não será modificado."
-
-#: editor/project_manager.cpp
-msgid ""
-"Language changed.\n"
-"The interface will update after restarting the editor or project manager."
-msgstr ""
-"Linguagem alterada.\n"
-"A interface será atualizada após o arranque do editor ou do gestor de "
-"projetos."
-
-#: editor/project_manager.cpp
-msgid ""
-"Are you sure to scan %s folders for existing Godot projects?\n"
-"This could take a while."
-msgstr ""
-"Pretende pesquisar %s pastas por projetos Godot existentes?\n"
-"Pode demorar um pouco."
-
-#: editor/project_manager.cpp
-msgid "Project Manager"
-msgstr "Gestor de Projetos"
-
-#: editor/project_manager.cpp
-msgid "Projects"
-msgstr "Projetos"
-
-#: editor/project_manager.cpp
-msgid "Last Modified"
-msgstr "Última modificação"
-
-#: editor/project_manager.cpp
-msgid "Scan"
-msgstr "Analisar"
-
-#: editor/project_manager.cpp
-msgid "Select a Folder to Scan"
-msgstr "Selecione uma pasta para analisar"
-
-#: editor/project_manager.cpp
-msgid "New Project"
-msgstr "Novo Projeto"
-
-#: editor/project_manager.cpp
-msgid "Remove Missing"
-msgstr "Remover Ausente"
-
-#: editor/project_manager.cpp
-msgid "Templates"
-msgstr "Modelos"
-
-#: editor/project_manager.cpp
-msgid "Restart Now"
-msgstr "Reiniciar agora"
-
-#: editor/project_manager.cpp
-msgid "Can't run project"
-msgstr "Impossível executar o Projeto"
-
-#: editor/project_manager.cpp
-msgid ""
-"You currently don't have any projects.\n"
-"Would you like to explore official example projects in the Asset Library?"
-msgstr ""
-"Atualmente não tem quaisquer projetos.\n"
-"Gostaria de explorar os projetos de exemplo oficiais na Biblioteca de Ativos?"
-
-#: editor/project_settings_editor.cpp
-msgid "Key "
-msgstr "Tecla "
-
-#: editor/project_settings_editor.cpp
-msgid "Joy Button"
-msgstr "Botão do joystick"
-
-#: editor/project_settings_editor.cpp
-msgid "Joy Axis"
-msgstr "Eixo do joystick"
-
-#: editor/project_settings_editor.cpp
-msgid "Mouse Button"
-msgstr "Botão do rato"
-
-#: editor/project_settings_editor.cpp
-msgid ""
-"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
-"'\"'"
-msgstr ""
-"Nome de ação inválido. Não pode ser vazio nem conter '/', ':', '=', '\\' ou "
-"'\"'"
-
-#: editor/project_settings_editor.cpp
-msgid "An action with the name '%s' already exists."
-msgstr "Já existe uma ação com o nome '%s'."
-
-#: editor/project_settings_editor.cpp
-msgid "Rename Input Action Event"
-msgstr "Renomear evento ação de entrada"
-
-#: editor/project_settings_editor.cpp
-msgid "Change Action deadzone"
-msgstr "Mudar a zona morta da Ação"
-
-#: editor/project_settings_editor.cpp
-msgid "Add Input Action Event"
-msgstr "Adicionar evento ação de entrada"
-
-#: editor/project_settings_editor.cpp
-msgid "All Devices"
-msgstr "Todos os Dispositivos"
-
-#: editor/project_settings_editor.cpp
-msgid "Device"
-msgstr "Dispositivo"
-
-#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-msgid "Press a Key..."
-msgstr "Pressione uma tecla..."
-
-#: editor/project_settings_editor.cpp
-msgid "Mouse Button Index:"
-msgstr "Índice do botão do rato:"
-
-#: editor/project_settings_editor.cpp
-msgid "Left Button"
-msgstr "Botão esquerdo"
-
-#: editor/project_settings_editor.cpp
-msgid "Right Button"
-msgstr "Botão direito"
-
-#: editor/project_settings_editor.cpp
-msgid "Middle Button"
-msgstr "Botão do meio"
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Up Button"
-msgstr "Botão roda para cima"
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Down Button"
-msgstr "Botão roda para baixo"
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Left Button"
-msgstr "Roda Botão Esquerdo"
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Right Button"
-msgstr "Roda Botão Direito"
-
-#: editor/project_settings_editor.cpp
-msgid "X Button 1"
-msgstr "X Botão 1"
-
-#: editor/project_settings_editor.cpp
-msgid "X Button 2"
-msgstr "X Botão 2"
-
-#: editor/project_settings_editor.cpp
-msgid "Joypad Axis Index:"
-msgstr "Índice do Eixo do joystick:"
-
-#: editor/project_settings_editor.cpp
-msgid "Axis"
-msgstr "Eixo"
-
-#: editor/project_settings_editor.cpp
-msgid "Joypad Button Index:"
-msgstr "Índice do botão do joypad:"
-
-#: editor/project_settings_editor.cpp
-msgid "Erase Input Action"
-msgstr "Apagar Ação de Entrada"
-
-#: editor/project_settings_editor.cpp
-msgid "Erase Input Action Event"
-msgstr "Apagar evento ação de entrada"
-
-#: editor/project_settings_editor.cpp
-msgid "Add Event"
-msgstr "Adicionar evento"
-
-#: editor/project_settings_editor.cpp
-msgid "Button"
-msgstr "Botão"
-
-#: editor/project_settings_editor.cpp
-msgid "Left Button."
-msgstr "Botão esquerdo."
-
-#: editor/project_settings_editor.cpp
-msgid "Right Button."
-msgstr "Botão direito."
-
-#: editor/project_settings_editor.cpp
-msgid "Middle Button."
-msgstr "Botão do meio."
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Up."
-msgstr "Roda para cima."
-
-#: editor/project_settings_editor.cpp
-msgid "Wheel Down."
-msgstr "Roda para baixo."
-
-#: editor/project_settings_editor.cpp
-msgid "Add Global Property"
-msgstr "Adicionar Propriedade global"
-
-#: editor/project_settings_editor.cpp
-msgid "Select a setting item first!"
-msgstr "Selecione primeiro um item de configuração!"
-
-#: editor/project_settings_editor.cpp
-msgid "No property '%s' exists."
-msgstr "Não existe a Propriedade '%s'."
-
-#: editor/project_settings_editor.cpp
-msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr "Configuração '%s' é interna e não pode ser removida."
-
-#: editor/project_settings_editor.cpp
-msgid "Delete Item"
-msgstr "Apagar item"
-
-#: editor/project_settings_editor.cpp
-msgid ""
-"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
-"'\"'."
-msgstr ""
-"Nome de ação inválido. Não pode ser vazio nem conter '/', ':', '=', '\\' ou "
-"'\"'."
-
-#: editor/project_settings_editor.cpp
-msgid "Add Input Action"
-msgstr "Adicionar ação de entrada"
-
-#: editor/project_settings_editor.cpp
-msgid "Error saving settings."
-msgstr "Erro ao guardar configuração."
-
-#: editor/project_settings_editor.cpp
-msgid "Settings saved OK."
-msgstr "Configuração guardada."
-
-#: editor/project_settings_editor.cpp
-msgid "Moved Input Action Event"
-msgstr "Evento Ação de Entrada movido"
-
-#: editor/project_settings_editor.cpp
-msgid "Override for Feature"
-msgstr "Sobrepor por Característica"
-
-#: editor/project_settings_editor.cpp
-msgid "Add Translation"
-msgstr "Adicionar tradução"
-
-#: editor/project_settings_editor.cpp
-msgid "Remove Translation"
-msgstr "Remover tradução"
-
-#: editor/project_settings_editor.cpp
-msgid "Add Remapped Path"
-msgstr "Adicionar correção remapeada"
-
-#: editor/project_settings_editor.cpp
-msgid "Resource Remap Add Remap"
-msgstr "Recurso Remap Adicionar Remap"
-
-#: editor/project_settings_editor.cpp
-msgid "Change Resource Remap Language"
-msgstr "Mudar Recurso Linguagem Remap"
-
-#: editor/project_settings_editor.cpp
-msgid "Remove Resource Remap"
-msgstr "Remover remapeamento de recurso"
-
-#: editor/project_settings_editor.cpp
-msgid "Remove Resource Remap Option"
-msgstr "Remover Recurso Opção Remap"
-
-#: editor/project_settings_editor.cpp
-msgid "Changed Locale Filter"
-msgstr "Filtro de localização alterado"
-
-#: editor/project_settings_editor.cpp
-msgid "Changed Locale Filter Mode"
-msgstr "Modo filtro de localização alterado"
-
-#: editor/project_settings_editor.cpp
-msgid "Project Settings (project.godot)"
-msgstr "Definições do Projeto (project.godot)"
-
-#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-msgid "General"
-msgstr "Geral"
-
-#: editor/project_settings_editor.cpp
-msgid "Override For..."
-msgstr "Sobrepor Por..."
-
-#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
-msgid "The editor must be restarted for changes to take effect."
-msgstr "O editor deve ser reiniciado para que as alterações entrem em vigor."
-
-#: editor/project_settings_editor.cpp
-msgid "Input Map"
-msgstr "Mapa de entrada"
-
-#: editor/project_settings_editor.cpp
-msgid "Action:"
-msgstr "Ação:"
-
-#: editor/project_settings_editor.cpp
-msgid "Action"
-msgstr "Ação"
-
-#: editor/project_settings_editor.cpp
-msgid "Deadzone"
-msgstr "Zona morta"
-
-#: editor/project_settings_editor.cpp
-msgid "Device:"
-msgstr "Dispositivo:"
-
-#: editor/project_settings_editor.cpp
-msgid "Index:"
-msgstr "Índice:"
-
-#: editor/project_settings_editor.cpp
-msgid "Localization"
-msgstr "Localização"
-
-#: editor/project_settings_editor.cpp
-msgid "Translations"
-msgstr "Traduções"
-
-#: editor/project_settings_editor.cpp
-msgid "Translations:"
-msgstr "Traduções:"
-
-#: editor/project_settings_editor.cpp
-msgid "Remaps"
-msgstr "Remapeamentos"
-
-#: editor/project_settings_editor.cpp
-msgid "Resources:"
-msgstr "Recursos:"
-
-#: editor/project_settings_editor.cpp
-msgid "Remaps by Locale:"
-msgstr "Remapear por localização:"
-
-#: editor/project_settings_editor.cpp
-msgid "Locale"
-msgstr "Localização"
-
-#: editor/project_settings_editor.cpp
-msgid "Locales Filter"
-msgstr "Filtro de localização"
-
-#: editor/project_settings_editor.cpp
-msgid "Show All Locales"
-msgstr "Mostrar Todos os Idiomas"
-
-#: editor/project_settings_editor.cpp
-msgid "Show Selected Locales Only"
-msgstr "Mostrar Apenas Idiomas Selecionados"
-
-#: editor/project_settings_editor.cpp
-msgid "Filter mode:"
-msgstr "Modo de filtro:"
-
-#: editor/project_settings_editor.cpp
-msgid "Locales:"
-msgstr "Localizações:"
-
-#: editor/project_settings_editor.cpp
-msgid "AutoLoad"
-msgstr "Carregamento automático"
-
-#: editor/project_settings_editor.cpp
-msgid "Plugins"
-msgstr "Plugins"
-
-#: editor/property_editor.cpp
-msgid "Preset..."
-msgstr "Predefinição..."
-
-#: editor/property_editor.cpp
-msgid "Zero"
-msgstr "Zero"
-
-#: editor/property_editor.cpp
-msgid "Easing In-Out"
-msgstr "Easing In-Out"
-
-#: editor/property_editor.cpp
-msgid "Easing Out-In"
-msgstr "Easing Out-In"
-
-#: editor/property_editor.cpp
-msgid "File..."
-msgstr "Ficheiro..."
-
-#: editor/property_editor.cpp
-msgid "Dir..."
-msgstr "Diretoria..."
-
-#: editor/property_editor.cpp
-msgid "Assign"
-msgstr "Atribuir"
-
-#: editor/property_editor.cpp
-msgid "Select Node"
-msgstr "Selecionar Nó"
-
-#: editor/property_editor.cpp
-msgid "Error loading file: Not a resource!"
-msgstr "Erro ao carregar Ficheiro: Não é um recurso!"
-
-#: editor/property_editor.cpp
-msgid "Pick a Node"
-msgstr "Escolha um Nó"
-
-#: editor/property_editor.cpp
-msgid "Bit %d, val %d."
-msgstr "Bit %d, val %d."
-
-#: editor/property_selector.cpp
-msgid "Select Property"
-msgstr "Selecionar Propriedade"
-
-#: editor/property_selector.cpp
-msgid "Select Virtual Method"
-msgstr "Selecione Método virtual"
-
-#: editor/property_selector.cpp
-msgid "Select Method"
-msgstr "Selecione Método"
-
-#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-msgid "Batch Rename"
-msgstr "Renomear em massa"
-
-#: editor/rename_dialog.cpp
-msgid "Prefix"
-msgstr "Prefixo"
-
-#: editor/rename_dialog.cpp
-msgid "Suffix"
-msgstr "Sufixo"
-
-#: editor/rename_dialog.cpp
-msgid "Advanced Options"
-msgstr "Opções Avançadas"
-
-#: editor/rename_dialog.cpp
-msgid "Substitute"
-msgstr "Substituto"
-
-#: editor/rename_dialog.cpp
-msgid "Node name"
-msgstr "Nome do Nó"
-
-#: editor/rename_dialog.cpp
-msgid "Node's parent name, if available"
-msgstr "Nome do parente do Nó, se disponível"
-
-#: editor/rename_dialog.cpp
-msgid "Node type"
-msgstr "Tipo de Nó"
-
-#: editor/rename_dialog.cpp
-msgid "Current scene name"
-msgstr "Nome da cena atual"
-
-#: editor/rename_dialog.cpp
-msgid "Root node name"
-msgstr "Nome do Nó raiz"
-
-#: editor/rename_dialog.cpp
-msgid ""
-"Sequential integer counter.\n"
-"Compare counter options."
-msgstr ""
-"Contador sequencial de inteiros.\n"
-"Comparar opções do contador."
-
-#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "Contador por nível"
-
-#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr "Se definido o contador reinicia para cada grupo de nós filhos"
-
-#: editor/rename_dialog.cpp
-msgid "Initial value for the counter"
-msgstr "Valor inicial do contador"
-
-#: editor/rename_dialog.cpp
-msgid "Step"
-msgstr "Passo"
-
-#: editor/rename_dialog.cpp
-msgid "Amount by which counter is incremented for each node"
-msgstr "Valor pelo qual cada contador é incrementado para cada nó"
-
-#: editor/rename_dialog.cpp
-msgid "Padding"
-msgstr "Preenchimento"
-
-#: editor/rename_dialog.cpp
-msgid ""
-"Minimum number of digits for the counter.\n"
-"Missing digits are padded with leading zeros."
-msgstr ""
-"Número mínimo de dígitos para o contador.\n"
-"Dígitos ausentes são preenchidos com zeros."
-
-#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Expressões Regulares"
-
-#: editor/rename_dialog.cpp
-msgid "Post-Process"
-msgstr "Pós-processamento"
-
-#: editor/rename_dialog.cpp
-msgid "Keep"
-msgstr "Manter"
-
-#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase para under_scored"
-
-#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored para CamelCase"
-
-#: editor/rename_dialog.cpp
-msgid "Case"
-msgstr "Caixa"
-
-#: editor/rename_dialog.cpp
-msgid "To Lowercase"
-msgstr "Para Minúsculas"
-
-#: editor/rename_dialog.cpp
-msgid "To Uppercase"
-msgstr "Para Maiúsculas"
-
-#: editor/rename_dialog.cpp
-msgid "Reset"
-msgstr "Repor"
-
-#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
-msgid "Reparent Node"
-msgstr "Recolocar Nó"
-
-#: editor/reparent_dialog.cpp
-msgid "Reparent Location (Select new Parent):"
-msgstr "Recolocar localização (selecionar novo Parente):"
-
-#: editor/reparent_dialog.cpp
-msgid "Keep Global Transform"
-msgstr "Manter transformação global"
-
-#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
-msgid "Reparent"
-msgstr "Recolocar"
-
-#: editor/run_settings_dialog.cpp
-msgid "Run Mode:"
-msgstr "Modo Execução:"
-
-#: editor/run_settings_dialog.cpp
-msgid "Current Scene"
-msgstr "Cena atual"
-
-#: editor/run_settings_dialog.cpp
-msgid "Main Scene"
-msgstr "Cena principal"
-
-#: editor/run_settings_dialog.cpp
-msgid "Main Scene Arguments:"
-msgstr "Argumentos da Cena principal:"
-
-#: editor/run_settings_dialog.cpp
-msgid "Scene Run Settings"
-msgstr "Configurações de execução da Cena"
-
-#: editor/scene_tree_dock.cpp
-msgid "No parent to instance the scenes at."
-msgstr "Nenhum parente para instanciar a Cena."
-
-#: editor/scene_tree_dock.cpp
-msgid "Error loading scene from %s"
-msgstr "Erro ao carregar a Cena de %s"
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Cannot instance the scene '%s' because the current scene exists within one "
-"of its nodes."
-msgstr ""
-"Impossível instanciar a Cena '%s' porque a Cena atual existe dentro de um "
-"dos seus Nós."
-
-#: editor/scene_tree_dock.cpp
-msgid "Instance Scene(s)"
-msgstr "Cena(s) da Instância"
-
-#: editor/scene_tree_dock.cpp
-msgid "Replace with Branch Scene"
-msgstr "Substituir com Cena-Ramo"
-
-#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Instanciar Cena filha"
-
-#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Limpar Script"
-
-#: editor/scene_tree_dock.cpp
-msgid "This operation can't be done on the tree root."
-msgstr "Esta operação não pode ser feita na raiz da árvore."
-
-#: editor/scene_tree_dock.cpp
-msgid "Move Node In Parent"
-msgstr "Mover Nó no Parente"
-
-#: editor/scene_tree_dock.cpp
-msgid "Move Nodes In Parent"
-msgstr "Mover Nós no Parente"
-
-#: editor/scene_tree_dock.cpp
-msgid "Duplicate Node(s)"
-msgstr "Duplicar Nó(s)"
-
-#: editor/scene_tree_dock.cpp
-msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
-msgstr "Impossível mudar nó em cenas herdadas, a ordem dos nós não pode mudar."
-
-#: editor/scene_tree_dock.cpp
-msgid "Node must belong to the edited scene to become root."
-msgstr "O nó deve pertencer à cena editada para se tornar root."
-
-#: editor/scene_tree_dock.cpp
-msgid "Instantiated scenes can't become root"
-msgstr "Cenas instantâneas não se podem tornar root"
-
-#: editor/scene_tree_dock.cpp
-msgid "Make node as Root"
-msgstr "Tornar Nó Raiz"
-
-#: editor/scene_tree_dock.cpp
-msgid "Delete %d nodes?"
-msgstr "Apagar %d Nós?"
-
-#: editor/scene_tree_dock.cpp
-msgid "Delete the root node \"%s\"?"
-msgstr "Apagar Nó raiz \"%s\"?"
-
-#: editor/scene_tree_dock.cpp
-msgid "Delete node \"%s\" and its children?"
-msgstr "Apagar Nó \"%s\" e filhos?"
-
-#: editor/scene_tree_dock.cpp
-msgid "Delete node \"%s\"?"
-msgstr "Apagar Nó \"%s\"?"
-
-#: editor/scene_tree_dock.cpp
-msgid "Can not perform with the root node."
-msgstr "Impossível executar com o Nó raiz."
-
-#: editor/scene_tree_dock.cpp
-msgid "This operation can't be done on instanced scenes."
-msgstr "Esta operação não pode ser feita numa Cena instanciada."
-
-#: editor/scene_tree_dock.cpp
-msgid "Save New Scene As..."
-msgstr "Guardar nova Cena como..."
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Disabling \"editable_instance\" will cause all properties of the node to be "
-"reverted to their default."
-msgstr ""
-"Desativar \"editable_instance\" irá reverter todas as propriedades do Nó "
-"para os seus valores padrão."
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
-"cause all properties of the node to be reverted to their default."
-msgstr ""
-"Ativar \"Carregar como Espaço Reservado\" vai desativar \"Filhos Editáveis\" "
-"e fazer com que todas as propriedades do nó revertam para valores padrão."
-
-#: editor/scene_tree_dock.cpp
-msgid "Make Local"
-msgstr "Tornar Local"
-
-#: editor/scene_tree_dock.cpp
-msgid "New Scene Root"
-msgstr "Nova Raiz de Cena"
-
-#: editor/scene_tree_dock.cpp
-msgid "Create Root Node:"
-msgstr "Criar Nó Raiz:"
-
-#: editor/scene_tree_dock.cpp
-msgid "2D Scene"
-msgstr "Cena 2D"
-
-#: editor/scene_tree_dock.cpp
-msgid "3D Scene"
-msgstr "Cena 3D"
-
-#: editor/scene_tree_dock.cpp
-msgid "User Interface"
-msgstr "Interface do Utilizador"
-
-#: editor/scene_tree_dock.cpp
-msgid "Other Node"
-msgstr "Outro Nó"
-
-#: editor/scene_tree_dock.cpp
-msgid "Can't operate on nodes from a foreign scene!"
-msgstr "Impossível operar em Nós de uma Cena externa!"
-
-#: editor/scene_tree_dock.cpp
-msgid "Can't operate on nodes the current scene inherits from!"
-msgstr "Impossível operar em Nós herdados pela Cena atual!"
-
-#: editor/scene_tree_dock.cpp
-msgid "Attach Script"
-msgstr "Anexar Script"
-
-#: editor/scene_tree_dock.cpp
-msgid "Remove Node(s)"
-msgstr "Remover Nó(s)"
-
-#: editor/scene_tree_dock.cpp
-msgid "Change type of node(s)"
-msgstr "Mudar tipo de nó(s)"
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Couldn't save new scene. Likely dependencies (instances) couldn't be "
-"satisfied."
-msgstr ""
-"Impossível guardar nova Cena. Provavelmente dependências (instâncias) não "
-"foram satisfeitas."
-
-#: editor/scene_tree_dock.cpp
-msgid "Error saving scene."
-msgstr "Erro ao guardar Cena."
-
-#: editor/scene_tree_dock.cpp
-msgid "Error duplicating scene to save it."
-msgstr "Erro ao duplicar Cena para guardar."
-
-#: editor/scene_tree_dock.cpp
-msgid "Sub-Resources"
-msgstr "Sub-recursos"
-
-#: editor/scene_tree_dock.cpp
-msgid "Clear Inheritance"
-msgstr "Limpar herança"
-
-#: editor/scene_tree_dock.cpp
-msgid "Editable Children"
-msgstr "Filhos editáveis"
-
-#: editor/scene_tree_dock.cpp
-msgid "Load As Placeholder"
-msgstr "Carregar como marcador de posição"
-
-#: editor/scene_tree_dock.cpp
-msgid "Open Documentation"
-msgstr "Abrir documentação"
-
-#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
-msgstr "Adicionar Nó filho"
-
-#: editor/scene_tree_dock.cpp
-msgid "Expand/Collapse All"
-msgstr "Expandir/Colapsar Tudo"
-
-#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr "Mudar tipo"
-
-#: editor/scene_tree_dock.cpp
-msgid "Reparent to New Node"
-msgstr "Recolocar o Novo Nó"
-
-#: editor/scene_tree_dock.cpp
-msgid "Make Scene Root"
-msgstr "Tornar Nó Raiz"
-
-#: editor/scene_tree_dock.cpp
-msgid "Merge From Scene"
-msgstr "Fundir a partir da Cena"
-
-#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
-msgid "Save Branch as Scene"
-msgstr "Guardar ramo como Cena"
-
-#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
-msgid "Copy Node Path"
-msgstr "Copiar Caminho do Nó"
-
-#: editor/scene_tree_dock.cpp
-msgid "Delete (No Confirm)"
-msgstr "Apagar (sem confirmação)"
-
-#: editor/scene_tree_dock.cpp
-msgid "Add/Create a New Node."
-msgstr "Adicionar/Criar Novo Nó."
-
-#: editor/scene_tree_dock.cpp
-msgid ""
-"Instance a scene file as a Node. Creates an inherited scene if no root node "
-"exists."
-msgstr ""
-"Instanciar Ficheiro de Cena como Nó. Cria uma Cena herdada se não existir Nó "
-"raiz."
-
-#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Anexar Script novo ou existente ao Nó selecionado."
-
-#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Limpar Script do Nó selecionado."
-
-#: editor/scene_tree_dock.cpp
-msgid "Remote"
-msgstr "Remoto"
-
-#: editor/scene_tree_dock.cpp
-msgid "Local"
-msgstr "Local"
-
-#: editor/scene_tree_dock.cpp
-msgid "Clear Inheritance? (No Undo!)"
-msgstr "Limpar herança? (Sem retrocesso!)"
-
-#: editor/scene_tree_editor.cpp
-msgid "Toggle Visible"
-msgstr "Alternar Visibilidade"
-
-#: editor/scene_tree_editor.cpp
-msgid "Unlock Node"
-msgstr "Desbloquear Nó"
-
-#: editor/scene_tree_editor.cpp
-msgid "Button Group"
-msgstr "Grupo Botão"
-
-#: editor/scene_tree_editor.cpp
-msgid "(Connecting From)"
-msgstr "(A Ligar de)"
-
-#: editor/scene_tree_editor.cpp
-msgid "Node configuration warning:"
-msgstr "Aviso de configuração do Nó:"
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node has %s connection(s) and %s group(s).\n"
-"Click to show signals dock."
-msgstr ""
-"Nó tem %s conexão(ões) e %s grupo(s).\n"
-"Clique para mostrar doca de sinais."
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node has %s connection(s).\n"
-"Click to show signals dock."
-msgstr ""
-"Nó tem %s conexão(ões).\n"
-"Clique para mostrar doca de sinais."
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node is in %s group(s).\n"
-"Click to show groups dock."
-msgstr ""
-"Nó está em %s grupo(s).\n"
-"Clique para mostrar doca de grupos."
-
-#: editor/scene_tree_editor.cpp
-msgid "Open Script:"
-msgstr "Abrir Script:"
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Node is locked.\n"
-"Click to unlock it."
-msgstr ""
-"Nó está bloqueado.\n"
-"Clique para desbloquear."
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"Children are not selectable.\n"
-"Click to make selectable."
-msgstr ""
-"Filhos não são selecionáveis.\n"
-"Clique para os tornar selecionáveis."
-
-#: editor/scene_tree_editor.cpp
-msgid "Toggle Visibility"
-msgstr "Alternar visibilidade"
-
-#: editor/scene_tree_editor.cpp
-msgid ""
-"AnimationPlayer is pinned.\n"
-"Click to unpin."
-msgstr ""
-"AnimationPlayer está fixado.\n"
-"Clique para desafixar."
-
-#: editor/scene_tree_editor.cpp
-msgid "Invalid node name, the following characters are not allowed:"
-msgstr "Nome de Nó inválido, os carateres seguintes não são permitidos:"
-
-#: editor/scene_tree_editor.cpp
-msgid "Rename Node"
-msgstr "Renomear Nó"
-
-#: editor/scene_tree_editor.cpp
-msgid "Scene Tree (Nodes):"
-msgstr "Árvore de Cena (Nós):"
-
-#: editor/scene_tree_editor.cpp
-msgid "Node Configuration Warning!"
-msgstr "Aviso de configuração de Nó!"
-
-#: editor/scene_tree_editor.cpp
-msgid "Select a Node"
-msgstr "Selecione um Nó"
-
-#: editor/script_create_dialog.cpp
-msgid "Path is empty."
-msgstr "Caminho está vazio."
-
-#: editor/script_create_dialog.cpp
-msgid "Filename is empty."
-msgstr "Nome do Ficheiro vazio."
-
-#: editor/script_create_dialog.cpp
-msgid "Path is not local."
-msgstr "Caminho não é local."
-
-#: editor/script_create_dialog.cpp
-msgid "Invalid base path."
-msgstr "Caminho base inválido."
-
-#: editor/script_create_dialog.cpp
-msgid "A directory with the same name exists."
-msgstr "Já existe diretoria com o mesmo nome."
-
-#: editor/script_create_dialog.cpp
-msgid "Invalid extension."
-msgstr "Extensão inválida."
-
-#: editor/script_create_dialog.cpp
-msgid "Wrong extension chosen."
-msgstr "Escolhida extensão errada."
-
-#: editor/script_create_dialog.cpp
-msgid "Error loading template '%s'"
-msgstr "Erro ao carregar Modelo '%s'"
-
-#: editor/script_create_dialog.cpp
-msgid "Error - Could not create script in filesystem."
-msgstr "Erro - Impossível criar Script no Sistema de Ficheiros."
-
-#: editor/script_create_dialog.cpp
-msgid "Error loading script from %s"
-msgstr "Erro ao carregar Script de '%s'"
-
-#: editor/script_create_dialog.cpp
-msgid "Overrides"
-msgstr "Sobrepõe"
-
-#: editor/script_create_dialog.cpp
-msgid "N/A"
-msgstr "N/A"
-
-#: editor/script_create_dialog.cpp
-msgid "Open Script / Choose Location"
-msgstr "Abrir Script/ Escolher Localização"
-
-#: editor/script_create_dialog.cpp
-msgid "Open Script"
-msgstr "Abrir Script"
-
-#: editor/script_create_dialog.cpp
-msgid "File exists, it will be reused."
-msgstr "O Ficheiro já existe, será reutilizado."
-
-#: editor/script_create_dialog.cpp
-msgid "Invalid class name."
-msgstr "Nome de classe inválido."
-
-#: editor/script_create_dialog.cpp
-msgid "Invalid inherited parent name or path."
-msgstr "Nome ou Caminho de parente herdado inválido."
-
-#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Script é válido."
-
-#: editor/script_create_dialog.cpp
-msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "Permitido: a-z, A-Z, 0-9, _ e ."
-
-#: editor/script_create_dialog.cpp
-msgid "Built-in script (into scene file)."
-msgstr "Script incorporado (no ficheiro da cena)."
-
-#: editor/script_create_dialog.cpp
-msgid "Will create a new script file."
-msgstr "Vai criar novo ficheiro de script."
-
-#: editor/script_create_dialog.cpp
-msgid "Will load an existing script file."
-msgstr "Vai carregar ficheiro de script existente."
-
-#: editor/script_create_dialog.cpp
-msgid "Script file already exists."
-msgstr "Ficheiro Script já existe."
-
-#: editor/script_create_dialog.cpp
-msgid "Class Name:"
-msgstr "Nome de Classe:"
-
-#: editor/script_create_dialog.cpp
-msgid "Template:"
-msgstr "Modelo:"
-
-#: editor/script_create_dialog.cpp
-msgid "Built-in Script:"
-msgstr "Script Incorporado:"
-
-#: editor/script_create_dialog.cpp
-msgid "Attach Node Script"
-msgstr "Anexar Script de Nó"
-
-#: editor/script_editor_debugger.cpp
-msgid "Remote "
-msgstr "Remoto "
-
-#: editor/script_editor_debugger.cpp
-msgid "Bytes:"
-msgstr "Bytes:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Warning:"
-msgstr "Aviso:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Erro:"
-
-#: editor/script_editor_debugger.cpp
-msgid "C++ Error"
-msgstr "Erro C++"
-
-#: editor/script_editor_debugger.cpp
-msgid "C++ Error:"
-msgstr "Erro C++:"
-
-#: editor/script_editor_debugger.cpp
-msgid "C++ Source"
-msgstr "Código-fonte C++"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Código-fonte:"
-
-#: editor/script_editor_debugger.cpp
-msgid "C++ Source:"
-msgstr "Código-fonte C++:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace"
-msgstr "Rastreamento de Pilha"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors"
-msgstr "Erros"
-
-#: editor/script_editor_debugger.cpp
-msgid "Child process connected."
-msgstr "Processo filho conectado."
-
-#: editor/script_editor_debugger.cpp
-msgid "Copy Error"
-msgstr "Copiar Erro"
-
-#: editor/script_editor_debugger.cpp
-msgid "Skip Breakpoints"
-msgstr "Saltar Pontos de Paragem"
-
-#: editor/script_editor_debugger.cpp
-msgid "Inspect Previous Instance"
-msgstr "Inspecionar instância anterior"
-
-#: editor/script_editor_debugger.cpp
-msgid "Inspect Next Instance"
-msgstr "Inspecionar Próxima Instância"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Frames"
-msgstr "Empilhar Frames"
-
-#: editor/script_editor_debugger.cpp
-msgid "Profiler"
-msgstr "Profiler"
-
-#: editor/script_editor_debugger.cpp
-msgid "Network Profiler"
-msgstr "Traçador de Rede"
-
-#: editor/script_editor_debugger.cpp
-msgid "Monitor"
-msgstr "Monitor"
-
-#: editor/script_editor_debugger.cpp
-msgid "Value"
-msgstr "Valor"
-
-#: editor/script_editor_debugger.cpp
-msgid "Monitors"
-msgstr "Monitores"
-
-#: editor/script_editor_debugger.cpp
-msgid "Pick one or more items from the list to display the graph."
-msgstr "Escolha um ou mais itens da lista para exibir o gráfico."
-
-#: editor/script_editor_debugger.cpp
-msgid "List of Video Memory Usage by Resource:"
-msgstr "Lista de utilização de Memória Vídeo por recurso:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Total:"
-msgstr "Total:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Memória Vídeo"
-
-#: editor/script_editor_debugger.cpp
-msgid "Resource Path"
-msgstr "Caminho do recurso"
-
-#: editor/script_editor_debugger.cpp
-msgid "Type"
-msgstr "Tipo"
-
-#: editor/script_editor_debugger.cpp
-msgid "Format"
-msgstr "Formato"
-
-#: editor/script_editor_debugger.cpp
-msgid "Usage"
-msgstr "Uso"
-
-#: editor/script_editor_debugger.cpp
-msgid "Misc"
-msgstr "Diversos"
-
-#: editor/script_editor_debugger.cpp
-msgid "Clicked Control:"
-msgstr "Controlo clicado:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Clicked Control Type:"
-msgstr "Tipo de controlo clicado:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Live Edit Root:"
-msgstr "Raiz de edição ao vivo:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Set From Tree"
-msgstr "Definir a partir da árvore"
-
-#: editor/script_editor_debugger.cpp
-msgid "Export measures as CSV"
-msgstr "Exporta medidas como CSV"
-
-#: editor/settings_config_dialog.cpp
-msgid "Erase Shortcut"
-msgstr "Apagar Atalho"
-
-#: editor/settings_config_dialog.cpp
-msgid "Restore Shortcut"
-msgstr "Restaurar Atalho"
-
-#: editor/settings_config_dialog.cpp
-msgid "Change Shortcut"
-msgstr "Alterar Atalho"
-
-#: editor/settings_config_dialog.cpp
-msgid "Editor Settings"
-msgstr "Configurações do Editor"
-
-#: editor/settings_config_dialog.cpp
-msgid "Shortcuts"
-msgstr "Atalhos"
-
-#: editor/settings_config_dialog.cpp
-msgid "Binding"
-msgstr "Ligação"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Light Radius"
-msgstr "Mudar raio da luz"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change AudioStreamPlayer3D Emission Angle"
-msgstr "Mudar ângulo de emissão de AudioStreamPlayer3D"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Camera FOV"
-msgstr "Mudar FOV da câmara"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Camera Size"
-msgstr "Mudar tamanho da câmara"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Notifier AABB"
-msgstr "Mudar Notificador AABB"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Particles AABB"
-msgstr "Mudar partículas AABB"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Probe Extents"
-msgstr "Mudar Extensões de Sonda"
-
-#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
-msgid "Change Sphere Shape Radius"
-msgstr "Mudar raio da forma esfera"
-
-#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
-msgid "Change Box Shape Extents"
-msgstr "Mudar medidas da forma caixa"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Capsule Shape Radius"
-msgstr "Mudar raio da forma cápsula"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Capsule Shape Height"
-msgstr "Mudar altura da forma cápsula"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Cylinder Shape Radius"
-msgstr "Mudar Raio da Forma Cilindro"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Cylinder Shape Height"
-msgstr "Mudar Altura da Forma Cilindro"
-
-#: editor/spatial_editor_gizmos.cpp
-msgid "Change Ray Shape Length"
-msgstr "Mudar comprimento da forma raio"
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Cylinder Radius"
-msgstr "Mudar Raio do Cilindro"
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Cylinder Height"
-msgstr "Mudar Altura do CIlindro"
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Torus Inner Radius"
-msgstr "Mudar Raio Interno do Toro"
-
-#: modules/csg/csg_gizmos.cpp
-msgid "Change Torus Outer Radius"
-msgstr "Mudar Raio Externo do Toro"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Select the dynamic library for this entry"
-msgstr "Selecionar a biblioteca dinâmica para esta entrada"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Select dependencies of the library for this entry"
-msgstr "Selecionar dependências da biblioteca para este entrada"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Remove current entry"
-msgstr "Remover Entrada atual"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Double click to create a new entry"
-msgstr "Duplo clique para criar nova entrada"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Platform:"
-msgstr "Plataforma:"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Platform"
-msgstr "Plataforma"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Dynamic Library"
-msgstr "Biblioteca Dinâmica"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "Add an architecture entry"
-msgstr "Adicionar uma entrada arquitetura"
-
-#: modules/gdnative/gdnative_library_editor_plugin.cpp
-msgid "GDNativeLibrary"
-msgstr "GDNativeLibrary"
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Enabled GDNative Singleton"
-msgstr "Ativa Singleton GDNative"
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Disabled GDNative Singleton"
-msgstr "Instância única GDNative desativada"
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Library"
-msgstr "Biblioteca"
-
-#: modules/gdnative/gdnative_library_singleton_editor.cpp
-msgid "Libraries: "
-msgstr "Bibliotecas: "
-
-#: modules/gdnative/register_types.cpp
-msgid "GDNative"
-msgstr "GDNative"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Step argument is zero!"
-msgstr "O argumento \"step\" é zero!"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Not a script with an instance"
-msgstr "Não é um Script com uma instância"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Not based on a script"
-msgstr "Não é baseado num Script"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Not based on a resource file"
-msgstr "Não é baseado num Ficheiro de recurso"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary format (missing @path)"
-msgstr "Formato de dicionário de instância inválido (falta @path)"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary format (can't load script at @path)"
-msgstr ""
-"Formato de dicionário de instância inválido (não foi possível carregar o "
-"Script em @path)"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr "Formato de dicionário de instância inválido (Script inválido em @path)"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Invalid instance dictionary (invalid subclasses)"
-msgstr "Dicionário de instância inválido (subclasses inválidas)"
-
-#: modules/gdscript/gdscript_functions.cpp
-msgid "Object can't provide a length."
-msgstr "Objeto não fornece um comprimento."
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Next Plane"
-msgstr "Plano Seguinte"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Previous Plane"
-msgstr "Plano Anterior"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Plane:"
-msgstr "Plano:"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Next Floor"
-msgstr "Próximo Piso"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Previous Floor"
-msgstr "Piso anterior"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Floor:"
-msgstr "Piso:"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "GridMap Delete Selection"
-msgstr "Apagar seleção GridMap"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "GridMap Fill Selection"
-msgstr "Seleção de Preenchimento de GridMap"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "GridMap Paste Selection"
-msgstr "Colar Seleção GridMap"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "GridMap Paint"
-msgstr "Pintura do GridMap"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Grid Map"
-msgstr "Mapa de grelha"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Snap View"
-msgstr "Vista de Ajuste"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Clip Disabled"
-msgstr "Recorte desativado"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Clip Above"
-msgstr "Recorte ativado"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Clip Below"
-msgstr "Recorte abaixo"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Edit X Axis"
-msgstr "Editar Eixo X"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Edit Y Axis"
-msgstr "Editar Eixo Y"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Edit Z Axis"
-msgstr "Editar Eixo Z"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Rotate X"
-msgstr "Rodar Cursor X"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Rotate Y"
-msgstr "Rodar Cursor Y"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Rotate Z"
-msgstr "Rodar Cursor Z"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Back Rotate X"
-msgstr "Rodar para trás Cursor X"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Back Rotate Y"
-msgstr "Rodar para trás Cursor Y"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Back Rotate Z"
-msgstr "Rodar para trás Cursor Z"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Cursor Clear Rotation"
-msgstr "Limpar rotação do Cursor"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Paste Selects"
-msgstr "Colar Seleção"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Clear Selection"
-msgstr "Limpar Seleção"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Fill Selection"
-msgstr "Preencher Seleção"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "GridMap Settings"
-msgstr "Configurações do GridMap"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Pick Distance:"
-msgstr "Distância de escolha:"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Filter meshes"
-msgstr "Meshes de filtro"
-
-#: modules/gridmap/grid_map_editor_plugin.cpp
-msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
-msgstr "Dá um recurso MeshLibrary a este GridMap para usar os seus meshes."
-
-#: modules/mono/csharp_script.cpp
-msgid "Class name can't be a reserved keyword"
-msgstr "Nome de classe não pode ser uma palavra-chave reservada"
-
-#: modules/mono/mono_gd/gd_mono_utils.cpp
-msgid "End of inner exception stack trace"
-msgstr "Fim do stack trace de exceção interna"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake NavMesh"
-msgstr "Consolidar NavMesh"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Clear the navigation mesh."
-msgstr "Limpar a Malha de navegação."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Setting up Configuration..."
-msgstr "A ajustar configuração..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Calculating grid size..."
-msgstr "A calcular tamanho da grelha..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Creating heightfield..."
-msgstr "A criar heightfield..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Marking walkable triangles..."
-msgstr "A marcar triângulos caminháveis..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Constructing compact heightfield..."
-msgstr "A construir heightfield compacto..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Eroding walkable area..."
-msgstr "A corroer a Área caminhável..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Partitioning..."
-msgstr "A segmentar..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Creating contours..."
-msgstr "A criar contornos..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Creating polymesh..."
-msgstr "A criar polymesh..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Converting to native navigation mesh..."
-msgstr "A converter para Malha de navegação nativa..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Navigation Mesh Generator Setup:"
-msgstr "Configuração do gerador da Malha de navegação:"
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Parsing Geometry..."
-msgstr "A analisar geometria..."
-
-#: modules/recast/navigation_mesh_generator.cpp
-msgid "Done!"
-msgstr "Feito!"
-
-#: modules/visual_script/visual_script.cpp
-msgid ""
-"A node yielded without working memory, please read the docs on how to yield "
-"properly!"
-msgstr ""
-"Um Nó fez yield sem memória para usar, por favor leia os documentos para "
-"saber como fazer yield corretamente!"
-
-#: modules/visual_script/visual_script.cpp
-msgid ""
-"Node yielded, but did not return a function state in the first working "
-"memory."
-msgstr ""
-"O Nó fez yield, mas não retornou um estado de Função na primeira memória de "
-"trabalho."
-
-#: modules/visual_script/visual_script.cpp
-msgid ""
-"Return value must be assigned to first element of node working memory! Fix "
-"your node please."
-msgstr ""
-"O valor de retorno deve ser atribuído ao primeiro elemento da memória de "
-"trabalho de Nós! Corrija o seu Nó por favor."
-
-#: modules/visual_script/visual_script.cpp
-msgid "Node returned an invalid sequence output: "
-msgstr "O Nó retornou uma sequência de saída (output) incorreta: "
-
-#: modules/visual_script/visual_script.cpp
-msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr "Foi encontrada o bit da sequência mas não o Nó na pilha, relate o bug!"
-
-#: modules/visual_script/visual_script.cpp
-msgid "Stack overflow with stack depth: "
-msgstr "Pilha cheia com a profundidade da pilha: "
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Signal Arguments"
-msgstr "Mudar argumentos do sinal"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Argument Type"
-msgstr "Mudar tipo de argumento"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Argument name"
-msgstr "Mudar nome do argumento"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Set Variable Default Value"
-msgstr "Definir Valor Padrão da Variável"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Set Variable Type"
-msgstr "Definir tipo de variável"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Input Port"
-msgstr "Adicionar Porta de Entrada"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Output Port"
-msgstr "Adicionar Porta de Saída"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Override an existing built-in function."
-msgstr "Sobrepõe-se a função incorporada existente."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Create a new function."
-msgstr "Criar uma nova função."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Variables:"
-msgstr "Variáveis:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Create a new variable."
-msgstr "Criar uma nova variável."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Signals:"
-msgstr "Sinais:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Create a new signal."
-msgstr "Criar um novo sinal."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Name is not a valid identifier:"
-msgstr "O nome não é um identificador válido:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Name already in use by another func/var/signal:"
-msgstr "Este nome já está a ser usado por outro func/var/signal:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Rename Function"
-msgstr "Mudar nome da Função"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Rename Variable"
-msgstr "Mudar nome da Variável"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Rename Signal"
-msgstr "Mudar nome do Sinal"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Function"
-msgstr "Adicionar Função"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Delete input port"
-msgstr "Remover porta de entrada"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Variable"
-msgstr "Adicionar Variável"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Signal"
-msgstr "Adicionar Sinal"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove Input Port"
-msgstr "Remover Porta de Entrada"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove Output Port"
-msgstr "Remover Porta de Saída"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Expression"
-msgstr "Mudar Expressão"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove VisualScript Nodes"
-msgstr "Remover Nós VisualScript"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Duplicate VisualScript Nodes"
-msgstr "Duplicar Nós VisualScript"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
-msgstr ""
-"Pressione %s para largar um Getter. Pressione Shift para largar uma "
-"Assinatura genérica."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
-msgstr ""
-"Pressione Ctrl para largar um Getter. Pressione Shift para largar uma "
-"Assinatura genérica."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold %s to drop a simple reference to the node."
-msgstr "Pressione %s para largar uma referência simples no Nó."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr "Pressione Ctrl para largar uma referência simples no Nó."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold %s to drop a Variable Setter."
-msgstr "Pressione %s para largar um Setter variável."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Hold Ctrl to drop a Variable Setter."
-msgstr "Pressione Ctrl para largar um Setter variável."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Preload Node"
-msgstr "Adicionar Nó de Pré-carregamento"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Node(s) From Tree"
-msgstr "Adicionar Nó da Árvore"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid ""
-"Can't drop properties because script '%s' is not used in this scene.\n"
-"Drop holding 'Shift' to just copy the signature."
-msgstr ""
-"Impossível largar propriedades porque o script '%s' não é usado neste cena.\n"
-"Largue com 'Shift' para copiar apenas a assinatura."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Getter Property"
-msgstr "Adicionar Propriedade Getter"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Setter Property"
-msgstr "Adicionar Propriedade Setter"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Base Type"
-msgstr "Mudar tipo base"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Move Node(s)"
-msgstr "Mover Nó(s)"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove VisualScript Node"
-msgstr "Remover Nó VisualScript"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Connect Nodes"
-msgstr "Conectar Nós"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Disconnect Nodes"
-msgstr "Desconectar Nós"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Connect Node Data"
-msgstr "Conectar Dados de Nó"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Connect Node Sequence"
-msgstr "Conectar Sequência de Nós"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Script already has function '%s'"
-msgstr "Script já tem uma Função '%s'"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Input Value"
-msgstr "Mudar valor de entrada"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Resize Comment"
-msgstr "Redimensionar Comentário"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't copy the function node."
-msgstr "Impossível copiar o Nó Função."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Clipboard is empty!"
-msgstr "Área de Transferência está vazia!"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Paste VisualScript Nodes"
-msgstr "Colar Nós VisualScript"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't create function with a function node."
-msgstr "Impossível criar função com um nó função."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr "Impossível criar função de nós com nós de várias funções."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Select at least one node with sequence port."
-msgstr "Selecione pelo menos um nó com porta de sequência."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Try to only have one sequence input in selection."
-msgstr "Tente ter apenas uma entrada de sequência na seleção."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Create Function"
-msgstr "Criar Função"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove Function"
-msgstr "Remover Função"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove Variable"
-msgstr "Remover Variável"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Editing Variable:"
-msgstr "A editar Variável:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Remove Signal"
-msgstr "Remover Sinal"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Editing Signal:"
-msgstr "A editar Sinal:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Make Tool:"
-msgstr "Ferramenta Fazer:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Membros:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Change Base Type:"
-msgstr "Mudar Tipo Base:"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Nodes..."
-msgstr "Adicionar Nós.."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Add Function..."
-msgstr "Adicionar Função..."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "function_name"
-msgstr "function_name"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Select or create a function to edit its graph."
-msgstr "Selecionar ou criar uma função para editar o gráfico."
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Delete Selected"
-msgstr "Apagar Selecionados"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Find Node Type"
-msgstr "Localizar Tipo de Nó"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Copy Nodes"
-msgstr "Copiar Nós"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Cut Nodes"
-msgstr "Cortar Nós"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Make Function"
-msgstr "Criar Função"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Refresh Graph"
-msgstr "Atualizar Gráfico"
-
-#: modules/visual_script/visual_script_editor.cpp
-msgid "Edit Member"
-msgstr "Editar Membros"
-
-#: modules/visual_script/visual_script_flow_control.cpp
-msgid "Input type not iterable: "
-msgstr "Tipo de Input não iterável: "
-
-#: modules/visual_script/visual_script_flow_control.cpp
-msgid "Iterator became invalid"
-msgstr "O iterador tornou-se inválido"
-
-#: modules/visual_script/visual_script_flow_control.cpp
-msgid "Iterator became invalid: "
-msgstr "O iterador tornou-se inválido: "
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Invalid index property name."
-msgstr "Nome de índice Propriedade inválido."
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Base object is not a Node!"
-msgstr "Objeto de base não é um Nó!"
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Path does not lead Node!"
-msgstr "Caminho não conduz Nó!"
-
-#: modules/visual_script/visual_script_func_nodes.cpp
-msgid "Invalid index property name '%s' in node %s."
-msgstr "Nome de Propriedade índice '%s' inválido em Nó %s."
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid ": Invalid argument of type: "
-msgstr ": Argumento inválido de tipo: "
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid ": Invalid arguments: "
-msgstr ": Argumentos inválidos: "
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid "VariableGet not found in script: "
-msgstr "VariableGet não encontrado no script: "
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid "VariableSet not found in script: "
-msgstr "VariableSet não encontrado no script: "
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid "Custom node has no _step() method, can't process graph."
-msgstr "Impossível processar gráfico, Nó personalizado sem método _step()."
-
-#: modules/visual_script/visual_script_nodes.cpp
-msgid ""
-"Invalid return value from _step(), must be integer (seq out), or string "
-"(error)."
-msgstr ""
-"Valor de retorno de _step() inválido, tem de ser inteiro (seq out), ou "
-"string (error)."
-
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Search VisualScript"
-msgstr "Procurar VisualScript"
-
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get %s"
-msgstr "Obter %s"
-
-#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set %s"
-msgstr "Definir %s"
-
-#: platform/android/export/export.cpp
-msgid "Package name is missing."
-msgstr "Falta o nome do pacote."
-
-#: platform/android/export/export.cpp
-msgid "Package segments must be of non-zero length."
-msgstr "Os segmentos de pacote devem ser de comprimento diferente de zero."
-
-#: platform/android/export/export.cpp
-msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
-"O caráter '%s' não é permitido em nomes de pacotes de aplicações Android."
-
-#: platform/android/export/export.cpp
-msgid "A digit cannot be the first character in a package segment."
-msgstr "Um dígito não pode ser o primeiro caráter num segmento de pacote."
-
-#: platform/android/export/export.cpp
-msgid "The character '%s' cannot be the first character in a package segment."
-msgstr "O caráter '%s' não pode ser o primeiro caráter num segmento de pacote."
-
-#: platform/android/export/export.cpp
-msgid "The package must have at least one '.' separator."
-msgstr "O pacote deve ter pelo menos um separador '.'."
-
-#: platform/android/export/export.cpp
-msgid "Select device from the list"
-msgstr "Selecionar dispositivo da lista"
-
-#: platform/android/export/export.cpp
-msgid "ADB executable not configured in the Editor Settings."
-msgstr "O executável ADB não está configurado nas Configurações do Editor."
-
-#: platform/android/export/export.cpp
-msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr "O jarsigner do OpenJDK não está configurado nas Definições do Editor."
-
-#: platform/android/export/export.cpp
-msgid "Debug keystore not configured in the Editor Settings nor in the preset."
-msgstr ""
-"Depuração de keystore não configurado nas Configurações do Editor e nem na "
-"predefinição."
-
-#: platform/android/export/export.cpp
-msgid "Custom build requires a valid Android SDK path in Editor Settings."
-msgstr ""
-"Compilação personalizada necessita de um caminho válido para Android SDK no "
-"Editor de Configurações."
-
-#: platform/android/export/export.cpp
-msgid "Invalid Android SDK path for custom build in Editor Settings."
-msgstr ""
-"Caminho inválido de Android SDK para compilação personalizada no Editor de "
-"Configurações."
-
-#: platform/android/export/export.cpp
-msgid ""
-"Android build template not installed in the project. Install it from the "
-"Project menu."
-msgstr ""
-"Modelo de compilação Android não está instalado neste projeto. Instale-o no "
-"menu Projeto."
-
-#: platform/android/export/export.cpp
-msgid "Invalid public key for APK expansion."
-msgstr "Chave pública inválida para expansão APK."
-
-#: platform/android/export/export.cpp
-msgid "Invalid package name:"
-msgstr "Nome de pacote inválido:"
-
-#: platform/android/export/export.cpp
-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'."
-
-#: platform/android/export/export.cpp
-msgid ""
-"Android build version mismatch:\n"
-" Template installed: %s\n"
-" Godot Version: %s\n"
-"Please reinstall Android build template from 'Project' menu."
-msgstr ""
-"Incompatibilidade da versão Android:\n"
-" Modelo instalado: %s\n"
-" Versão Godot: %s\n"
-"Reinstale o modelo de compilação Android no menu 'Projeto'."
-
-#: platform/android/export/export.cpp
-msgid "Building Android Project (gradle)"
-msgstr "A compilar Projeto Android (gradle)"
-
-#: platform/android/export/export.cpp
-msgid ""
-"Building of Android project failed, check output for the error.\n"
-"Alternatively visit docs.godotengine.org for Android build documentation."
-msgstr ""
-"Falhou a compilação do projeto Android, verifique o erro na saída.\n"
-"Em alternativa visite docs.godotengine.org para a documentação sobre "
-"compilação Android."
-
-#: platform/android/export/export.cpp
-msgid "No build apk generated at: "
-msgstr "Nenhum apk gerado em: "
-
-#: platform/iphone/export/export.cpp
-msgid "Identifier is missing."
-msgstr "Falta o identificador."
-
-#: platform/iphone/export/export.cpp
-msgid "The character '%s' is not allowed in Identifier."
-msgstr "O caráter \"%s\" não é permitido no Identificador."
-
-#: platform/iphone/export/export.cpp
-msgid "App Store Team ID not specified - cannot configure the project."
-msgstr ""
-"ID da equipa da App Store não especificado - não é possível configurar o "
-"projecto."
-
-#: platform/iphone/export/export.cpp
-msgid "Invalid Identifier:"
-msgstr "Identificador Inválido:"
-
-#: platform/iphone/export/export.cpp
-msgid "Required icon is not specified in the preset."
-msgstr "O ícone obrigatório não está especificado na predefinição."
-
-#: platform/javascript/export/export.cpp
-msgid "Stop HTTP Server"
-msgstr "Parar Servidor HTTP"
-
-#: platform/javascript/export/export.cpp
-msgid "Run in Browser"
-msgstr "Executar no Navegador"
-
-#: platform/javascript/export/export.cpp
-msgid "Run exported HTML in the system's default browser."
-msgstr "Executar HTML exportado no Navegador padrão do sistema."
-
-#: platform/javascript/export/export.cpp
-msgid "Could not write file:"
-msgstr "Impossível escrever Ficheiro:"
-
-#: platform/javascript/export/export.cpp
-msgid "Could not open template for export:"
-msgstr "Impossível abrir Modelo para exportar:"
-
-#: platform/javascript/export/export.cpp
-msgid "Invalid export template:"
-msgstr "Modelo de exportação inválido:"
-
-#: platform/javascript/export/export.cpp
-msgid "Could not read custom HTML shell:"
-msgstr "Impossível ler Shell HTML personalizado:"
-
-#: platform/javascript/export/export.cpp
-msgid "Could not read boot splash image file:"
-msgstr "Impossível ler Ficheiro de imagem do ecrã de inicialização:"
-
-#: platform/javascript/export/export.cpp
-msgid "Using default boot splash image."
-msgstr "A usar imagem padrão de inicialização."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid package short name."
-msgstr "Nome curto de pacote inválido."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid package unique name."
-msgstr "Nome único de pacote inválido."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid package publisher display name."
-msgstr "Nome de autor de pacote inválido."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid product GUID."
-msgstr "GUID do produto inválido."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid publisher GUID."
-msgstr "GUID do editor inválido."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid background color."
-msgstr "Cor de fundo inválida."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr "Inválidas dimensões da imagem do logotipo do Store (deve ser 50x50)."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr ""
-"Dimensões inválidas do quadrado 44x44 da imagem do logotipo (deve ser 44x44)."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr ""
-"Quadrado inválido 71x71 das dimensões da imagem do logotipo (deve ser 71x71)."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr ""
-"Quadrado inválido 150x150 das dimensões da imagem do logotipo (deve ser "
-"150x150)."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr ""
-"Quadrado inválido 310x310 das dimensões da imagem do logotipo (deve ser "
-"310x310)."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr "Dimensão inválida da imagem do logótipo 310x150 (deve ser 310x150)."
-
-#: platform/uwp/export/export.cpp
-msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr "Dimensões inválidas da imagem do ecrã inicial (deve ser 620x300)."
-
-#: scene/2d/animated_sprite.cpp
-msgid ""
-"A SpriteFrames resource must be created or set in the \"Frames\" property in "
-"order for AnimatedSprite to display frames."
-msgstr ""
-"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames"
-"\" para que AnimatedSprite mostre frames."
-
-#: scene/2d/canvas_modulate.cpp
-msgid ""
-"Only one visible CanvasModulate is allowed per scene (or set of instanced "
-"scenes). The first created one will work, while the rest will be ignored."
-msgstr ""
-"Só é permitido um CanvasModulate visível por cena (ou grupo de cenas "
-"instanciadas). O primeiro a ser criado funcionará, enquanto o resto será "
-"ignorado."
-
-#: scene/2d/collision_object_2d.cpp
-msgid ""
-"This node has no shape, so it can't collide or interact with other objects.\n"
-"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
-"define its shape."
-msgstr ""
-"Este nó não tem forma, não conseguindo assim colidir ou interagir com outros "
-"objetos.\n"
-"Considere adicionar nós CollisionShape2D ou CollisionPolygon2D como filhos "
-"para definir a sua forma."
-
-#: scene/2d/collision_polygon_2d.cpp
-msgid ""
-"CollisionPolygon2D only serves to provide a collision shape to a "
-"CollisionObject2D derived node. Please only use it as a child of Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
-msgstr ""
-"CollisionPolygon2D serve apenas para fornecer uma forma de colisão a um Nó "
-"derivado de CollisionObject2D. Use-o apenas como um filho de Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para lhes dar uma forma."
-
-#: scene/2d/collision_polygon_2d.cpp
-msgid "An empty CollisionPolygon2D has no effect on collision."
-msgstr "Um CollisionPolygon2D vazio não tem efeito na colisão."
-
-#: scene/2d/collision_shape_2d.cpp
-msgid ""
-"CollisionShape2D only serves to provide a collision shape to a "
-"CollisionObject2D derived node. Please only use it as a child of Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
-msgstr ""
-"CollisionShape2D serve apenas para fornecer uma forma de colisão a um Nó "
-"derivado de CollisionObject2D. Use-o apenas como um filho de Area2D, "
-"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para lhes dar uma forma."
-
-#: scene/2d/collision_shape_2d.cpp
-msgid ""
-"A shape must be provided for CollisionShape2D to function. Please create a "
-"shape resource for it!"
-msgstr ""
-"Uma forma tem de ser fornecida para CollisionShape2D funcionar. Crie um "
-"recurso forma!"
-
-#: scene/2d/cpu_particles_2d.cpp
-msgid ""
-"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
-"\"Particles Animation\" enabled."
-msgstr ""
-"Animação CPUParticles2D requer o uso de um CanvasItemMaterial com "
-"\"Particles Animation\" ativada."
-
-#: scene/2d/light_2d.cpp
-msgid ""
-"A texture with the shape of the light must be supplied to the \"Texture\" "
-"property."
-msgstr ""
-"Uma textura com a forma da luz tem de ser disponibilizada na Propriedade "
-"\"Textura\"."
-
-#: scene/2d/light_occluder_2d.cpp
-msgid ""
-"An occluder polygon must be set (or drawn) for this occluder to take effect."
-msgstr ""
-"Um Polígono oclusor tem de definido (ou desenhado) para este Oclusor ter "
-"efeito."
-
-#: scene/2d/light_occluder_2d.cpp
-msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
-msgstr "O polígono oclusor deste oclusor está vazio. Desenhe um polígono."
-
-#: scene/2d/navigation_polygon.cpp
-msgid ""
-"A NavigationPolygon resource must be set or created for this node to work. "
-"Please set a property or draw a polygon."
-msgstr ""
-"Um recurso NavigationPolygon tem de ser definido ou criado para este Nó "
-"funcionar. Defina a Propriedade ou desenhe o Polígono."
-
-#: scene/2d/navigation_polygon.cpp
-msgid ""
-"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
-"node. It only provides navigation data."
-msgstr ""
-"NavigationPolygonInstance tem de ser filho ou neto de um Nó Navigation2D. "
-"Apenas fornece dados de navegação."
-
-#: scene/2d/parallax_layer.cpp
-msgid ""
-"ParallaxLayer node only works when set as child of a ParallaxBackground node."
-msgstr ""
-"O Nó ParallaxLayer só funciona quando definido como filho de um Nó "
-"ParallaxBackground."
-
-#: scene/2d/particles_2d.cpp
-msgid ""
-"GPU-based particles are not supported by the GLES2 video driver.\n"
-"Use the CPUParticles2D node instead. You can use the \"Convert to "
-"CPUParticles\" option for this purpose."
-msgstr ""
-"Partículas baseadas em GPU não são suportadas pelo driver de vídeo GLES2.\n"
-"Use o Nó CPUParticles2D. Pode usar a opção \"Converter em CPUParticles\" "
-"para este efeito."
-
-#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
-msgid ""
-"A material to process the particles is not assigned, so no behavior is "
-"imprinted."
-msgstr ""
-"Não foi atribuído um Material para processar as partículas, não possuindo um "
-"comportamento."
-
-#: scene/2d/particles_2d.cpp
-msgid ""
-"Particles2D animation requires the usage of a CanvasItemMaterial with "
-"\"Particles Animation\" enabled."
-msgstr ""
-"Animação Particles2D requer o uso de um CanvasItemMaterial com \"Particles "
-"Animation\" ativada."
-
-#: scene/2d/path_2d.cpp
-msgid "PathFollow2D only works when set as a child of a Path2D node."
-msgstr ""
-"PathFollow2D apenas funciona quando definido como filho de um Nó Path2D."
-
-#: scene/2d/physics_body_2d.cpp
-msgid ""
-"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
-"by the physics engine when running.\n"
-"Change the size in children collision shapes instead."
-msgstr ""
-"Mudanças no tamanho do RigidBody2D (em modos caráter ou rígido) serão "
-"reescritas pelo motor de física na execução.\n"
-"Mude antes o tamanho das formas de colisão filhas."
-
-#: scene/2d/remote_transform_2d.cpp
-msgid "Path property must point to a valid Node2D node to work."
-msgstr ""
-"Para funcionar, a Propriedade Caminho tem de apontar para um Nó Node2D "
-"válido."
-
-#: scene/2d/skeleton_2d.cpp
-msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr "Esta corrente de Bone2D deve terminar em um nó Skeleton2D."
-
-#: scene/2d/skeleton_2d.cpp
-msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr "Um Bone2D só funciona com um nó parente Skeleton2D ou Bone2D."
-
-#: scene/2d/skeleton_2d.cpp
-msgid ""
-"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
-msgstr "Falta uma pose DESCANSO a este osso. Vá ao nó Skeleton2D e defina uma."
-
-#: scene/2d/tile_map.cpp
-msgid ""
-"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
-"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
-"KinematicBody2D, etc. to give them a shape."
-msgstr ""
-"TileMap com Usar Parente ativo precisa de um parente CollisionObject2D para "
-"lhe dar formas. Use-o como um filho de Area2D, StaticBody2D, RigidBody2D, "
-"KinematicBody2D, etc. para lhes dar uma forma."
-
-#: scene/2d/visibility_notifier_2d.cpp
-msgid ""
-"VisibilityEnabler2D works best when used with the edited scene root directly "
-"as parent."
-msgstr ""
-"VisibilityEnabler2D funciona melhor quando usado diretamente como parente na "
-"Cena raiz editada."
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr "ARVRCamera precisa de um Nó ARVROrigin como parente."
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr "ARVRController precisa de um Nó ARVROrigin como parente."
-
-#: scene/3d/arvr_nodes.cpp
-msgid ""
-"The controller ID must not be 0 or this controller won't be bound to an "
-"actual controller."
-msgstr ""
-"O ID do controlador não pode ser 0 senão este controlador não será vinculado "
-"a um controlador real."
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ARVRAnchor precisa de um Nó ARVROrigin como parente."
-
-#: scene/3d/arvr_nodes.cpp
-msgid ""
-"The anchor ID must not be 0 or this anchor won't be bound to an actual "
-"anchor."
-msgstr ""
-"O ID da âncora não pode ser 0 senão esta âncora não será vinculada a uma "
-"âncora real."
-
-#: scene/3d/arvr_nodes.cpp
-msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROrigin exige um Nó filho ARVRCamera."
-
-#: scene/3d/baked_lightmap.cpp
-msgid "%d%%"
-msgstr "%d%%"
-
-#: scene/3d/baked_lightmap.cpp
-msgid "(Time Left: %d:%02d s)"
-msgstr "(Tempo restante: %d:%02d s)"
-
-#: scene/3d/baked_lightmap.cpp
-msgid "Plotting Meshes: "
-msgstr "A traçar Meshes: "
-
-#: scene/3d/baked_lightmap.cpp
-msgid "Plotting Lights:"
-msgstr "A traçar Luzes:"
-
-#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
-msgid "Finishing Plot"
-msgstr "A concluir desenho"
-
-#: scene/3d/baked_lightmap.cpp
-msgid "Lighting Meshes: "
-msgstr "A iluminar Meshes: "
-
-#: scene/3d/collision_object.cpp
-msgid ""
-"This node has no shape, so it can't collide or interact with other objects.\n"
-"Consider adding a CollisionShape or CollisionPolygon as a child to define "
-"its shape."
-msgstr ""
-"Este nó não tem forma, não conseguindo assim colidir ou interagir com outros "
-"objetos.\n"
-"Considere adicionar nós CollisionShape ou CollisionPolygon como filhos para "
-"definir a sua forma."
-
-#: scene/3d/collision_polygon.cpp
-msgid ""
-"CollisionPolygon only serves to provide a collision shape to a "
-"CollisionObject derived node. Please only use it as a child of Area, "
-"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
-msgstr ""
-"CollisionPolygon serve apenas para fornecer uma forma de colisão a um Nó "
-"derivado de CollisionObject. Use-o apenas como um filho de Area, StaticBody, "
-"RigidBody, KinematicBody, etc. para lhes dar uma forma."
-
-#: scene/3d/collision_polygon.cpp
-msgid "An empty CollisionPolygon has no effect on collision."
-msgstr "Um CollisionPolygon vazio não tem efeito na colisão."
-
-#: scene/3d/collision_shape.cpp
-msgid ""
-"CollisionShape only serves to provide a collision shape to a CollisionObject "
-"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
-"KinematicBody, etc. to give them a shape."
-msgstr ""
-"CollisionShape serve apenas para fornecer uma forma de colisão a um Nó "
-"derivado de CollisionObject. Use-o apenas como um filho de Area, StaticBody, "
-"RigidBody, KinematicBody, etc. para lhes dar uma forma."
-
-#: scene/3d/collision_shape.cpp
-msgid ""
-"A shape must be provided for CollisionShape to function. Please create a "
-"shape resource for it."
-msgstr ""
-"Uma forma tem de ser fornecida para CollisionShape funcionar. Crie um "
-"recurso forma."
-
-#: scene/3d/collision_shape.cpp
-msgid ""
-"Plane shapes don't work well and will be removed in future versions. Please "
-"don't use them."
-msgstr ""
-"Formas planas não funcionam bem e serão removidas em futuras versões. Não as "
-"use por favor."
-
-#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has been assigned."
-msgstr "Nada é visível porque nenhuma Malha foi atribuída."
-
-#: scene/3d/cpu_particles.cpp
-msgid ""
-"CPUParticles animation requires the usage of a SpatialMaterial whose "
-"Billboard Mode is set to \"Particle Billboard\"."
-msgstr ""
-"Animação CPUParticles requer o uso de um SpatialMaterial com Modo Billboard "
-"definido como \"Billboard Particles\"."
-
-#: scene/3d/gi_probe.cpp
-msgid "Plotting Meshes"
-msgstr "A desenhar Meshes"
-
-#: scene/3d/gi_probe.cpp
-msgid ""
-"GIProbes are not supported by the GLES2 video driver.\n"
-"Use a BakedLightmap instead."
-msgstr ""
-"Sondas GI não são suportadas pelo driver vídeo GLES2.\n"
-"Em vez disso, use um BakedLightmap."
-
-#: scene/3d/light.cpp
-msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr "Uma SpotLight com ângulo superior a 90 graus não cria sombras."
-
-#: scene/3d/navigation_mesh.cpp
-msgid "A NavigationMesh resource must be set or created for this node to work."
-msgstr ""
-"Um recurso NavigationMesh tem de ser definido ou criado para este Nó "
-"funcionar."
-
-#: scene/3d/navigation_mesh.cpp
-msgid ""
-"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
-"It only provides navigation data."
-msgstr ""
-"NavigationMeshInstance tem de ser filho ou neto de um Nó Navigation. Apenas "
-"fornece dados de navegação."
-
-#: scene/3d/particles.cpp
-msgid ""
-"GPU-based particles are not supported by the GLES2 video driver.\n"
-"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
-"\" option for this purpose."
-msgstr ""
-"Partículas baseadas em GPU não são suportadas pelo driver de vídeo GLES2.\n"
-"Use o Nó CPUParticles. Pode usar a opção \"Converter em CPUParticles\" para "
-"este efeito."
-
-#: scene/3d/particles.cpp
-msgid ""
-"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr ""
-"Nada é visível porque não foram atribuídas Meshes aos passos de desenho."
-
-#: scene/3d/particles.cpp
-msgid ""
-"Particles animation requires the usage of a SpatialMaterial whose Billboard "
-"Mode is set to \"Particle Billboard\"."
-msgstr ""
-"Animação Particles requer o uso de um SpatialMaterial com Modo Billboard "
-"definido como \"Billboard Particles\"."
-
-#: scene/3d/path.cpp
-msgid "PathFollow only works when set as a child of a Path node."
-msgstr "PathFollow apenas funciona quando definido como filho de um Nó Path."
-
-#: scene/3d/path.cpp
-msgid ""
-"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
-"parent Path's Curve resource."
-msgstr ""
-"ROTATION_ORIENTED de PathFollow requer \"Up Vector\" habilitado no recurso "
-"de Curva do Caminho do seu pai."
-
-#: scene/3d/physics_body.cpp
-msgid ""
-"Size changes to RigidBody (in character or rigid modes) will be overridden "
-"by the physics engine when running.\n"
-"Change the size in children collision shapes instead."
-msgstr ""
-"Mudanças no tamanho do RigidBody (em modos caráter ou rígido) serão "
-"reescritas pelo motor de física na execução.\n"
-"Mude antes o tamanho das formas de colisão filhas."
-
-#: scene/3d/remote_transform.cpp
-msgid ""
-"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
-"derived node to work."
-msgstr ""
-"Para funcionar, a Propriedade \"Caminho Remoto\" tem de apontar para um Nó "
-"Spatial válido ou seu derivado."
-
-#: scene/3d/soft_body.cpp
-msgid "This body will be ignored until you set a mesh."
-msgstr "Este corpo será ignorado até se definir uma malha."
-
-#: scene/3d/soft_body.cpp
-msgid ""
-"Size changes to SoftBody will be overridden by the physics engine when "
-"running.\n"
-"Change the size in children collision shapes instead."
-msgstr ""
-"Mudanças no tamanho do SoftBody serão reescritas pelo motor de física na "
-"execução.\n"
-"Em vez disso, mude o tamanho das formas de colisão filhas."
-
-#: scene/3d/sprite_3d.cpp
-msgid ""
-"A SpriteFrames resource must be created or set in the \"Frames\" property in "
-"order for AnimatedSprite3D to display frames."
-msgstr ""
-"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames"
-"\" de forma a que AnimatedSprite3D mostre frames."
-
-#: scene/3d/vehicle_body.cpp
-msgid ""
-"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
-"it as a child of a VehicleBody."
-msgstr ""
-"VehicleWheel fornece um sistema de rodas a um VehicleBody. Use-o como um "
-"filho de VehicleBody."
-
-#: scene/3d/world_environment.cpp
-msgid ""
-"WorldEnvironment requires its \"Environment\" property to contain an "
-"Environment to have a visible effect."
-msgstr ""
-"WorldEnvironment exige que a sua propriedade \"Ambiente\" contenha um "
-"Ambiente para obter efeitos visíveis."
-
-#: scene/3d/world_environment.cpp
-msgid ""
-"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
-msgstr ""
-"Apenas um WorldEnvironment é permitido por Cena (ou grupo de cenas "
-"instanciadas)."
-
-#: scene/3d/world_environment.cpp
-msgid ""
-"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
-"this environment's Background Mode to Canvas (for 2D scenes)."
-msgstr ""
-"Este WorldEnvironment ė ignorado. Pode adicionar uma Camera (para cenas 3D) "
-"ou definir o Modo Background deste ambiente como Canvas (para cenas 2D)."
-
-#: scene/animation/animation_blend_tree.cpp
-msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr "No nó BlendTree '%s', animação não encontrada: '%s'"
-
-#: scene/animation/animation_blend_tree.cpp
-msgid "Animation not found: '%s'"
-msgstr "Animação não encontrada: '%s'"
-
-#: scene/animation/animation_tree.cpp
-msgid "In node '%s', invalid animation: '%s'."
-msgstr "No nó '%s', animação inválida: '%s'."
-
-#: scene/animation/animation_tree.cpp
-msgid "Invalid animation: '%s'."
-msgstr "Animação inválida: '%s'."
-
-#: scene/animation/animation_tree.cpp
-msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Nada conectado à entrada '%s' do nó '%s'."
-
-#: scene/animation/animation_tree.cpp
-msgid "No root AnimationNode for the graph is set."
-msgstr "Não foi definida uma raíz AnimationNode para o gráfico."
-
-#: scene/animation/animation_tree.cpp
-msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr ""
-"Caminho para um nó AnimationPlayer contendo animações não está definido."
-
-#: scene/animation/animation_tree.cpp
-msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
-msgstr ""
-"O caminho definido para AnimationPlayer não conduz a um nó AnimationPlayer."
-
-#: scene/animation/animation_tree.cpp
-msgid "The AnimationPlayer root node is not a valid node."
-msgstr "O Nó raiz de AnimationPlayer não é um Nó válido."
-
-#: scene/animation/animation_tree_player.cpp
-msgid "This node has been deprecated. Use AnimationTree instead."
-msgstr "Este nó foi depreciado. Use AnimationTree em vez disso."
-
-#: scene/gui/color_picker.cpp
-msgid ""
-"Color: #%s\n"
-"LMB: Set color\n"
-"RMB: Remove preset"
-msgstr ""
-"Cor: #%s\n"
-"LMB: Definir color\n"
-"RMB: Remover predefinição"
-
-#: scene/gui/color_picker.cpp
-msgid "Pick a color from the editor window."
-msgstr "Escolha uma cor através do editor."
-
-#: scene/gui/color_picker.cpp
-msgid "HSV"
-msgstr "HSV"
-
-#: scene/gui/color_picker.cpp
-msgid "Raw"
-msgstr "Raw"
-
-#: scene/gui/color_picker.cpp
-msgid "Switch between hexadecimal and code values."
-msgstr "Alternar valores entre hexadecimal e código."
-
-#: scene/gui/color_picker.cpp
-msgid "Add current color as a preset."
-msgstr "Adicionar cor atual como predefinição."
-
-#: scene/gui/container.cpp
-msgid ""
-"Container by itself serves no purpose unless a script configures its "
-"children placement behavior.\n"
-"If you don't intend to add a script, use a plain Control node instead."
-msgstr ""
-"Por si só um Contentor não tem utilidade, a não ser que um script configure "
-"a disposição dos seu filhos.\n"
-"Se não pretende adicionar um script, use antes um simples Nó Control."
-
-#: scene/gui/control.cpp
-msgid ""
-"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
-"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
-msgstr ""
-"A Etiqueta de Sugestão não será exibida porque o Filtro de Rato do controle "
-"está definido como \"Ignorar\". Em alternativa, defina o Filtro de Rato para "
-"\"Parar\" ou \"Passar\"."
-
-#: scene/gui/dialogs.cpp
-msgid "Alert!"
-msgstr "Alerta!"
-
-#: scene/gui/dialogs.cpp
-msgid "Please Confirm..."
-msgstr "Confirme por favor..."
-
-#: scene/gui/popup.cpp
-msgid ""
-"Popups will hide by default unless you call popup() or any of the popup*() "
-"functions. Making them visible for editing is fine, but they will hide upon "
-"running."
-msgstr ""
-"Popups estão escondidas por defeito a não ser que chame popup() ou qualquer "
-"das funções popup*(). Torná-las visíveis para edição é aceitável, mas "
-"estarão escondidas na execução."
-
-#: scene/gui/range.cpp
-msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr "Se \"Exp Edit\" está ativado, \"Min Value\" tem de ser maior que 0."
-
-#: scene/gui/scroll_container.cpp
-msgid ""
-"ScrollContainer is intended to work with a single child control.\n"
-"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
-"minimum size manually."
-msgstr ""
-"ScrollContainer deve ser usado com um único controlo filho.\n"
-"Use um contentor como filho (VBox, HBox, etc.), ou um Control e defina o "
-"tamanho mínimo manualmente."
-
-#: scene/gui/tree.cpp
-msgid "(Other)"
-msgstr "(Outro)"
-
-#: scene/main/scene_tree.cpp
-msgid ""
-"Default Environment as specified in Project Settings (Rendering -> "
-"Environment -> Default Environment) could not be loaded."
-msgstr ""
-"Ambiente Padrão especificado em Configuração do Projeto (Rendering -> "
-"Environment -> Default Environment) não pode ser carregado."
-
-#: scene/main/viewport.cpp
-msgid ""
-"This viewport is not set as render target. If you intend for it to display "
-"its contents directly to the screen, make it a child of a Control so it can "
-"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
-"texture to some node for display."
-msgstr ""
-"Esta vista não está definida como alvo de Renderização. Se pretende "
-"apresentar o seu conteúdo diretamente no ecrã, torne-a um filho de um "
-"Control de modo a que obtenha um tamanho. Caso contrário, torne-a um "
-"RenderTarget e atribua a sua textura interna a outro Nó para visualizar."
-
-#: scene/resources/visual_shader_nodes.cpp
-msgid "Invalid source for preview."
-msgstr "Fonte inválida para pré-visualização."
-
-#: scene/resources/visual_shader_nodes.cpp
-msgid "Invalid source for shader."
-msgstr "Fonte inválida para Shader."
-
-#: scene/resources/visual_shader_nodes.cpp
-msgid "Invalid comparison function for that type."
-msgstr "Função de comparação inválida para este tipo."
-
-#: servers/visual/shader_language.cpp
-msgid "Assignment to function."
-msgstr "Atribuição a função."
-
-#: servers/visual/shader_language.cpp
-msgid "Assignment to uniform."
-msgstr "Atribuição a uniforme."
-
-#: servers/visual/shader_language.cpp
-msgid "Varyings can only be assigned in vertex function."
-msgstr "Variações só podem ser atribuídas na função vértice."
-
-#: servers/visual/shader_language.cpp
-msgid "Constants cannot be modified."
-msgstr "Constantes não podem ser modificadas."
-
-#~ msgid ""
-#~ "There are currently no tutorials for this class, you can [color=$color]"
-#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
-#~ "$url2]request one[/url][/color]."
-#~ msgstr ""
-#~ "Atualmente não existem tutoriais para esta classe, pode [color=$color]"
-#~ "[url=$url]contribuir com um[/url][/color] ou [color=$color][url="
-#~ "$url2]solicitar um[/url][/color]."
-
-#~ msgid "enum "
-#~ msgstr "enum "
-
-#~ msgid "Brief Description"
-#~ msgstr "Breve Descrição"
-
-#~ msgid "Class Description"
-#~ msgstr "Descrição da Classe"
-
-#~ msgid "Project export failed with error code %d."
-#~ msgstr "Exportação do projeto falhou com código de erro %d."
-
-#~ msgid "Password:"
-#~ msgstr "Senha:"
-
-#~ msgid "Identifier segments must be of non-zero length."
-#~ msgstr ""
-#~ "Identificador de segmentos devem ser de comprimento diferente de zero."
-
-#~ msgid "A digit cannot be the first character in a Identifier segment."
-#~ msgstr ""
-#~ "Um dígito não pode ser o primeiro caráter num segmento de Identificador."
-
-#~ msgid ""
-#~ "The character '%s' cannot be the first character in a Identifier segment."
-#~ msgstr ""
-#~ "O caráter \"%s\" não pode ser o primeiro caráter num segmento de "
-#~ "Identificador."
-
-#~ msgid "The Identifier must have at least one '.' separator."
-#~ msgstr "O identificador deve ter pelo menos um separador \".\"."
-
-#~ msgid "Pause the scene"
-#~ msgstr "Pausa a cena"
-
-#~ msgid "Shift+"
-#~ msgstr "Shift+"
-
-#~ msgid "Alt+"
-#~ msgstr "Alt+"
-
-#~ msgid "Control+"
-#~ msgstr "Control+"
-
-#~ msgid "Snap to Grid"
-#~ msgstr "Ajustar à Grelha"
-
-#~ msgid "Add input +"
-#~ msgstr "Adicionar entrada +"
-
-#~ msgid "Language"
-#~ msgstr "Linguagem"
-
-#~ msgid "Inherits"
-#~ msgstr "Herdar"
-
-#~ msgid "Base Type:"
-#~ msgstr "Tipo de Base:"
-
-#~ msgid "Available Nodes:"
-#~ msgstr "Nós Disponíveis:"
-
-#~ msgid "Input"
-#~ msgstr "Entrada"
-
-#~ msgid "Properties:"
-#~ msgstr "Propriedades:"
-
-#~ msgid "Methods:"
-#~ msgstr "Métodos:"
-
-#~ msgid "Theme Properties:"
-#~ msgstr "Propriedades do Tema:"
-
-#~ msgid "Enumerations:"
-#~ msgstr "Enumerações:"
-
-#~ msgid "Constants:"
-#~ msgstr "Constantes:"
-
-#~ msgid "Class Description:"
-#~ msgstr "Descrição da Classe:"
-
-#~ msgid "Property Descriptions:"
-#~ msgstr "Descrições da Propriedade:"
-
-#~ msgid "Method Descriptions:"
-#~ msgstr "Descrições do Método:"
-
-#~ msgid ""
-#~ "This will install the Android project for custom builds.\n"
-#~ "Note that, in order to use it, it needs to be enabled per export preset."
-#~ msgstr ""
-#~ "O projeto Android para compilações personalizadas será instalado.\n"
-#~ "Para o utilizar, terá de ser ativado nas predefinições de exportação."
-
-#~ msgid "Reverse sorting."
-#~ msgstr "Inverter ordenação."
-
-#~ msgid "Delete Node(s)?"
-#~ msgstr "Apagar Nó(s)?"
-
-#~ msgid "No Matches"
-#~ msgstr "Sem combinações"
-
-#~ msgid ""
-#~ "Can't open file_type_cache.cch for writing, not saving file type cache!"
-#~ msgstr ""
-#~ "file_type_cache.cch não for guardada, por não se conseguir abrir para "
-#~ "leitura!"
-
-#~ msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-#~ msgstr "'%s' não foi encontrado no Sistema de Ficheiros!"
-
-#~ msgid "Error loading image:"
-#~ msgstr "Erro ao carregar imagem:"
-
-#~ msgid "No pixels with transparency > 128 in image..."
-#~ msgstr "Sem pixeis com transparência > 128 na imagem..."
-
-#~ msgid "Parent has no solid faces to populate."
-#~ msgstr "O parente não tem faces sólidas para povoar."
-
-#~ msgid "Couldn't map area."
-#~ msgstr "Área não pode ser mapeada."
-
-#~ msgid "Faces contain no area!"
-#~ msgstr "As faces não contêm Área!"
-
-#~ msgid "No faces!"
-#~ msgstr "Sem faces!"
-
-#~ msgid "Error: could not load file."
-#~ msgstr "Erro ao carregar ficheiro."
-
-#~ msgid "Error could not load file."
-#~ msgstr "Erro ao carregar ficheiro."
-
-#~ msgid "Doppler Enable"
-#~ msgstr "Doppler Ativo"
-
-#~ msgid "Select Mode (Q)"
-#~ msgstr "Modo seleção (Q)"
-
-#~ msgid "Move Mode (W)"
-#~ msgstr "Modo mover (W)"
-
-#~ msgid "Rotate Mode (E)"
-#~ msgstr "Modo rodar (E)"
-
-#~ msgid "Scale Mode (R)"
-#~ msgstr "Modo escalar (R)"
-
-#~ msgid "Local Coords"
-#~ msgstr "Coordenadas Locais"
-
-#~ msgid "Snap Mode (%s)"
-#~ msgstr "Modo Ajuste (%s)"
-
-#~ msgid "Tool Select"
-#~ msgstr "Seleção de ferramenta"
-
-#~ msgid "Tool Move"
-#~ msgstr "Ferramenta Mover"
-
-#~ msgid "Tool Rotate"
-#~ msgstr "Ferramenta Rodar"
-
-#~ msgid "Tool Scale"
-#~ msgstr "Ferramenta escalar"
-
-#~ msgid ""
-#~ "Remove all missing projects from the list? (Folders contents will not be "
-#~ "modified)"
-#~ msgstr ""
-#~ "Remover da lista todos os projeto em falta? (O conteúdo da pasta não será "
-#~ "modificado)"
-
-#~ msgid "Project List"
-#~ msgstr "Lista de Projetos"
-
-#~ msgid "Exit"
-#~ msgstr "Sair"
-
-#~ msgid "Could not execute PVRTC tool:"
-#~ msgstr "Impossível executar ferramenta PVRTC:"
-
-#~ msgid "Can't load back converted image using PVRTC tool:"
-#~ msgstr "Impossível carregar imagem convertida com a ferramenta PVRTC:"
-
-#~ msgid "Error initializing FreeType."
-#~ msgstr "Erro ao inicializar FreeType."
-
-#~ msgid "Unknown font format."
-#~ msgstr "Formato de letra inválido."
-
-#~ msgid "Error loading font."
-#~ msgstr "Erro ao carregar letra."
-
-#~ msgid "Invalid font size."
-#~ msgstr "Tamanho de letra inválido."
-
-#~ msgid "Previous Folder"
-#~ msgstr "Pasta Anterior"
-
-#~ msgid "Next Folder"
-#~ msgstr "Próxima Pasta"
-
-#~ msgid "Automatically Open Screenshots"
-#~ msgstr "Abrir Capturas do ecrã automaticamente"
-
-#~ msgid "Open in an external image editor."
-#~ msgstr "Abrir num editor de imagem externo."
-
-#~ msgid "Reverse"
-#~ msgstr "Inverter"
-
-#~ msgid "Mirror X"
-#~ msgstr "Espelho X"
-
-#~ msgid "Mirror Y"
-#~ msgstr "Espelho Y"
-
-#~ msgid "Generating solution..."
-#~ msgstr "A gerar soluções..."
-
-#~ msgid "Generating C# project..."
-#~ msgstr "A gerar projeto C#..."
-
-#~ msgid "Failed to create solution."
-#~ msgstr "Falha ao criar solução."
-
-#~ msgid "Failed to save solution."
-#~ msgstr "Falha ao guardar solução."
-
-#~ msgid "Done"
-#~ msgstr "Feito"
-
-#~ msgid "Failed to create C# project."
-#~ msgstr "Falha ao criar projeto C#."
-
-#~ msgid "Mono"
-#~ msgstr "Mono"
-
-#~ msgid "About C# support"
-#~ msgstr "Sobre o suporte C#"
-
-#~ msgid "Create C# solution"
-#~ msgstr "Criar solução C#"
-
-#~ msgid "Builds"
-#~ msgstr "Builds"
-
-#~ msgid "Build Project"
-#~ msgstr "Construir Projeto"
-
-#~ msgid "View log"
-#~ msgstr "Ver log"
-
-#~ msgid "WorldEnvironment needs an Environment resource."
-#~ msgstr "WorldEnvironment precisa de um recurso Environment."
-
-#~ msgid "Enabled Classes"
-#~ msgstr "Ativar Classes"
-
-#~ msgid "Update Always"
-#~ msgstr "Atualizar Sempre"
-
-#~ msgid "'camera' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'camera' para todos os modos shader."
-
-#~ msgid "'inv_camera' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'inv_camera' para todos os modos shader."
-
-#~ msgid "'inv_projection' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'inv_projection' para todos os modos shader."
-
-#~ msgid "'normal' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'normal' para todos os modos shader."
-
-#~ msgid "'projection' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'projection' para todos os modos shader."
-
-#~ msgid "'time' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'time' para todos os modos shader."
-
-#~ msgid "'viewport_size' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'viewport_size' para todos os modos shader."
-
-#~ msgid "'world' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'world' para todos os modos shader."
-
-#~ msgid "'alpha' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'alpha' para todos os modos shader."
-
-#~ msgid "'color' input parameter for all shader modes."
-#~ msgstr "parâmetro de entrada 'color' para todos os modos shader."
-
-#~ msgid "'texture_pixel_size' input parameter for all shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'texture_pixel_size' para todos os modos shader."
-
-#~ msgid "'alpha' input parameter for vertex and fragment shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'alpha' para os modos shader vertex e fragment."
-
-#~ msgid "'binormal' input parameter for vertex and fragment shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'binormal' para os modos shader vertex e fragment."
-
-#~ msgid "'color' input parameter for vertex and fragment shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'color' para os modos shader vertex e fragment."
-
-#~ msgid "'fragcoord' input parameter for fragment and light shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'fragcoord' para os modos shader fragment e light."
-
-#~ msgid "'point_coord' input parameter for fragment shader mode."
-#~ msgstr "parâmetro de entrada 'point_coord' para o modo shader fragment."
-
-#~ msgid "'screen_uv' input parameter for fragment shader mode."
-#~ msgstr "parâmetro de entrada 'screen_uv' para o modo shader fragment."
-
-#~ msgid "'tangent' input parameter for vertex and fragment shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'tangent' para os modos shader vertex e fragment."
-
-#~ msgid "'uv2' input parameter for vertex and fragment shader modes."
-#~ msgstr "parâmetro de entrada 'uv2' para os modos shader vertex e fragment."
-
-#~ msgid "'vertex' input parameter for vertex and fragment shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'vertex' para os modos shader vertex e fragment."
-
-#~ msgid "'albedo' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'albedo' para o modo shader light."
-
-#~ msgid "'attenuation' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'attenuation' para o modo shader light."
-
-#~ msgid "'light' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'light' para o modo shader light."
-
-#~ msgid "'light_color' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'light_color' para o modo shader light."
-
-#~ msgid "'roughness' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'roughness' para o modo shader light."
-
-#~ msgid "'specular' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'specular' para o modo shader light."
-
-#~ msgid "'transmission' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'transmission' para o modo shader light."
-
-#~ msgid "'modelview' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'modelview' para o modo shader vertex."
-
-#~ msgid "'point_size' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'point_size' para o modo shader vertex."
-
-#~ msgid "'tangent' input parameter for vertex and fragment shader mode."
-#~ msgstr ""
-#~ "parâmetro de entrada 'tangent' para os modos shader vertex e fragment."
-
-#~ msgid "'light_pass' input parameter for vertex and fragment shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'light_pass' para os modos shader vertex e fragment."
-
-#~ msgid "'point_coord' input parameter for fragment and light shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'point_coord' para os modos shader fragment e light."
-
-#~ msgid "'screen_pixel_size' input parameter for fragment shader mode."
-#~ msgstr ""
-#~ "parâmetro de entrada 'screen_pixel_size' para o modo shader fragment."
-
-#~ msgid "'screen_uv' input parameter for fragment and light shader modes."
-#~ msgstr ""
-#~ "parâmetro de entrada 'screen_uv' para modos shader fragment e light."
-
-#~ msgid "'light_alpha' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'light_alpha' para modo shader light."
-
-#~ msgid "'light_height' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'light_height' para modo shader light."
-
-#~ msgid "'light_uv' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'light_uv' para modo shader light."
-
-#~ msgid "'light_vec' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'light_vec' para modo shader light."
-
-#~ msgid "'normal' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'normal' para modo shader light."
-
-#~ msgid "'shadow_color' input parameter for light shader mode."
-#~ msgstr "parâmetro de entrada 'shadow_color' para modo shader light."
-
-#~ msgid "'extra' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'extra' para modo shader vertex."
-
-#~ msgid "'projection' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'projection' para modo shader vertex."
-
-#~ msgid "'vertex' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'vertex' para modo shader vertex."
-
-#~ msgid "'world' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'world' para modo shader vertex."
-
-#~ msgid "'active' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'active' para modo shader vertex."
-
-#~ msgid "'alpha' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'alpha' para modo shader vertex."
-
-#~ msgid "'color' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'color' para modo shader vertex."
-
-#~ msgid "'custom_alpha' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'custom_alpha' para modo shader vertex."
-
-#~ msgid "'delta' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'delta' para modo shader vertex."
-
-#~ msgid "'emission_transform' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'emission_transform' para modo shader vertex."
-
-#~ msgid "'index' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'index' para modo shader vertex."
-
-#~ msgid "'lifetime' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'lifetime' para modo shader vertex."
-
-#~ msgid "'restart' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'restart' para modo shader vertex."
-
-#~ msgid "'time' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'time' para modo shader vertex."
-
-#~ msgid "'transform' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'transform' para modo shader vertex."
-
-#~ msgid "'velocity' input parameter for vertex shader mode."
-#~ msgstr "parâmetro de entrada 'velocity' para modo shader vertex."
-
-#~ msgid "Raw Mode"
-#~ msgstr "Modo Raw"
-
-#~ msgid "Path to Node:"
-#~ msgstr "Caminho para Nó:"
-
-#~ msgid "Delete selected files?"
-#~ msgstr "Apagar arquivos selecionados?"
-
-#~ msgid "There is no 'res://default_bus_layout.tres' file."
-#~ msgstr "O Ficheiro 'res://default_bus_layout.tres' não existe."
-
-#~ msgid "Go to parent folder"
-#~ msgstr "Ir para a pasta acima"
-
-#~ msgid "Open Scene(s)"
-#~ msgstr "Abrir Cena(s)"
-
-#~ msgid "Previous Directory"
-#~ msgstr "Diretoria anterior"
-
-#~ msgid "Next Directory"
-#~ msgstr "Diretoria seguinte"
-
-#~ msgid "Ease in"
-#~ msgstr "Ease in"
-
-#~ msgid "Ease out"
-#~ msgstr "Ease out"
-
-#~ msgid "Create Convex Static Body"
-#~ msgstr "Criar corpo estático convexo"
-
-#~ msgid "CheckBox Radio1"
-#~ msgstr "Caixa de seleção Radio1"
-
-#~ msgid "CheckBox Radio2"
-#~ msgstr "Caixa de seleção Radio2"
-
-#~ msgid "Create folder"
-#~ msgstr "Criar pasta"
-
-#~ msgid "Custom Node"
-#~ msgstr "Nó Personalizado"
-
-#~ msgid "Invalid Path"
-#~ msgstr "Caminho inválido"
-
-#~ msgid "GridMap Duplicate Selection"
-#~ msgstr "Seleção duplicada de GridMap"
-
-#~ msgid "Create Area"
-#~ msgstr "Criar Área"
-
-#~ msgid "Create Exterior Connector"
-#~ msgstr "Criar Conector exterior"
-
-#~ msgid "Edit Signal Arguments:"
-#~ msgstr "Editar Argumentos do Sinal:"
-
-#~ msgid "Edit Variable:"
-#~ msgstr "Editar Variável:"
-
-#~ msgid "Snap (s): "
-#~ msgstr "Ajuste (s): "
-
-#~ msgid "Insert keys."
-#~ msgstr "Inserir chaves."
-
-#~ msgid "Instance the selected scene(s) as child of the selected node."
-#~ msgstr ""
-#~ "Instancie a(s) Cena(s) selecionada(s) como filha(s) do Nó selecionado."
-
-#~ msgid "Font Size:"
-#~ msgstr "Tamanho do tipo de letra:"
-
-#~ msgid "Line:"
-#~ msgstr "Linha:"
-
-#~ msgid "Col:"
-#~ msgstr "Coluna:"
-
-#~ msgid "OrientedPathFollow only works when set as a child of a Path node."
-#~ msgstr ""
-#~ "OrientedPathFollow apenas funciona quando definido como filho de um Nó "
-#~ "Path."
-
-#~ msgid "Split point with itself."
-#~ msgstr "Separar ponto consigo próprio."
-
-#~ msgid "Split can't form an existing edge."
-#~ msgstr "Separação não forma uma aresta existente."
-
-#~ msgid "Add Split"
-#~ msgstr "Adicionar Separação"
-
-#~ msgid "Remove Split"
-#~ msgstr "Remover Separação"
-
-#~ msgid "Poly"
-#~ msgstr "Poli"
-
-#~ msgid "Splits"
-#~ msgstr "Separações"
-
-#~ msgid "Connect two points to make a split."
-#~ msgstr "Conectar dois pontos para fazer uma divisão."
-
-#~ msgid "Select a split to erase it."
-#~ msgstr "Selecionar uma separação para a apagar."
-
-#~ msgid "Add Node.."
-#~ msgstr "Adicionar Nó.."
-
-#~ msgid "Create from scene?"
-#~ msgstr "Criar a partir da Cena?"
-
-#~ msgid "Create Poly"
-#~ msgstr "Criar Polígono"
-
-#~ msgid "Create a new polygon from scratch"
-#~ msgstr "Criar um novo Polígono de raíz"
-
-#~ msgid "Zoom out"
-#~ msgstr "Diminuir zoom"
-
-#~ msgid "Zoom in"
-#~ msgstr "Aumentar zoom"
-
-#~ msgid "Create Poly3D"
-#~ msgstr "Criar Poly3D"
-
-#~ msgid ""
-#~ "No OccluderPolygon2D resource on this node.\n"
-#~ "Create and assign one?"
-#~ msgstr ""
-#~ "Não há recurso OccluderPolygon2D neste Nó.\n"
-#~ "Criar um e associar?"
-
-#~ msgid "LMB: Move Point."
-#~ msgstr "LMB: Mover Ponto."
-
-#~ msgid "Ctrl+LMB: Split Segment."
-#~ msgstr "Ctrl+LMB: Separar segmento."
-
-#~ msgid "RMB: Erase Point."
-#~ msgstr "RMB: Apagar Ponto."
-
-#~ msgid "New TextFile"
-#~ msgstr "Novo TextFile"
-
-#~ msgid "Save Theme As"
-#~ msgstr "Guardar tema como"
-
-#~ msgid "<None>"
-#~ msgstr "<Nenhum>"
-
-#~ msgid ""
-#~ "Select sub-tile to use as icon, this will be also used on invalid "
-#~ "autotile bindings."
-#~ msgstr ""
-#~ "Selecionar sub-tile para usar como ícone, também será usado em ligações "
-#~ "autotile inválidas."
-
-#~ msgid "Zoom:"
-#~ msgstr "Zoom:"
-
-#~ msgid "Are you sure you want to remove all connections from the \""
-#~ msgstr "Está seguro que quer remover todas as conexões de \""
-
-#~ msgid "Class List:"
-#~ msgstr "Lista de Classes:"
-
-#~ msgid "Public Methods"
-#~ msgstr "Métodos Públicos"
-
-#~ msgid "Public Methods:"
-#~ msgstr "Métodos Públicos:"
-
-#~ msgid "GUI Theme Items"
-#~ msgstr "Itens do tema GUI"
-
-#~ msgid "GUI Theme Items:"
-#~ msgstr "Itens do tema GUI:"
-
-#~ msgid "Property: "
-#~ msgstr "Propriedade: "
-
-#~ msgid "Toggle folder status as Favorite."
-#~ msgstr "Alternar a pasta de situação como Favorita."
-
-#~ msgid "Show current scene file."
-#~ msgstr "Mostrar o ficheiro da cena atual."
-
-#~ msgid "Enter tree-view."
-#~ msgstr "Ir para Vista de árvore."
-
-#~ msgid "Whole words"
-#~ msgstr "Palavras completas"
-
-#~ msgid "Match case"
-#~ msgstr "Sensível a maiúsculas/minúsculas"
-
-#~ msgid "Ok"
-#~ msgstr "Ok"
-
-#~ msgid "Show In File System"
-#~ msgstr "Mostrar no Sistema de Ficheiros"
-
-#~ msgid "Search the class hierarchy."
-#~ msgstr "Procurar na hierarquia de classe."
-
-#~ msgid "Search in files"
-#~ msgstr "Procurar em ficheiros"
-
-#~ msgid ""
-#~ "Built-in scripts can only be edited when the scene they belong to is "
-#~ "loaded"
-#~ msgstr ""
-#~ "Scripts incorporados só podem ser editados quando a Cena a que pertencem "
-#~ "é carregada"
-
-#~ msgid "Convert To Uppercase"
-#~ msgstr "Converter em maiúsculas"
-
-#~ msgid "Convert To Lowercase"
-#~ msgstr "Converter em minúsculas"
-
-#~ msgid "Rotate 0 degrees"
-#~ msgstr "Rodar 0 graus"
-
-#~ msgid "Rotate 90 degrees"
-#~ msgstr "Rodar 90 graus"
-
-#~ msgid "Rotate 180 degrees"
-#~ msgstr "Rodar 180 graus"
-
-#~ msgid "Rotate 270 degrees"
-#~ msgstr "Rodar 270 graus"
-
-#~ msgid "Variable"
-#~ msgstr "Variável"
-
-#~ msgid "Errors:"
-#~ msgstr "Erros:"
-
-#~ msgid "Stack Trace (if applicable):"
-#~ msgstr "Stack Trace (se aplicável):"
-
-#~ msgid "Bake!"
-#~ msgstr "Cozinhar!"
-
-#~ msgid "Bake the navigation mesh."
-#~ msgstr "Cozinhar a Malha de navegação."
-
-#~ msgid "Get"
-#~ msgstr "Obter"
-
-#~ msgid "Change RGB Constant"
-#~ msgstr "Mudar constante RGB"
-
-#~ msgid "Change Vec Scalar Operator"
-#~ msgstr "Mudar operador escalar/vetorial"
-
-#~ msgid "Change RGB Operator"
-#~ msgstr "Mudar operador RGB"
-
-#~ msgid "Toggle Rot Only"
-#~ msgstr "Alternar só rotação"
-
-#~ msgid "Change Vec Function"
-#~ msgstr "Mudar Função vetorial"
-
-#~ msgid "Change Vec Uniform"
-#~ msgstr "Mudar uniforme vetorial"
-
-#~ msgid "Change RGB Uniform"
-#~ msgstr "Mudar uniforme RGB"
-
-#~ msgid "Change Default Value"
-#~ msgstr "Mudar valor padrão"
-
-#~ msgid "Change XForm Uniform"
-#~ msgstr "Mudar uniforme XForm"
-
-#~ msgid "Change Cubemap Uniform"
-#~ msgstr "Mudar uniforme Cubemap"
-
-#~ msgid "Change Comment"
-#~ msgstr "Mudar comentário"
-
-#~ msgid "Add/Remove to Color Ramp"
-#~ msgstr "Adicionar/remover da rampa de cores"
-
-#~ msgid "Modify Color Ramp"
-#~ msgstr "Modificar rampa de cores"
-
-#~ msgid "Add/Remove to Curve Map"
-#~ msgstr "Adicionar/remover do mapa de curva"
-
-#~ msgid "Modify Curve Map"
-#~ msgstr "Modificar mapa de curva"
-
-#~ msgid "Connect Graph Nodes"
-#~ msgstr "Conectar Nós do gráfico"
-
-#~ msgid "Remove Shader Graph Node"
-#~ msgstr "Remover Nó Gráfico Shader"
-
-#~ msgid "Move Shader Graph Node"
-#~ msgstr "Mover Nó Gráfico Shader"
-
-#~ msgid "Duplicate Graph Node(s)"
-#~ msgstr "Duplicar Nó(s)"
-
-#~ msgid "Error: Cyclic Connection Link"
-#~ msgstr "Erro: conexão cíclica"
-
-#~ msgid "Error: Missing Input Connections"
-#~ msgstr "Erro: Faltam conexões de entrada"
-
-#~ msgid "Add Shader Graph Node"
-#~ msgstr "Adicionar Nó Gráfico Shader"
-
-#~ msgid "Move Anim Track Up"
-#~ msgstr "Subir Pista de Animação"
-
-#~ msgid "Move Anim Track Down"
-#~ msgstr "Descer Pista de Animação"
-
-#~ msgid "Set Transitions to:"
-#~ msgstr "Definir transições para:"
-
-#~ msgid "Anim Track Rename"
-#~ msgstr "Anim Renomear Pista"
-
-#~ msgid "Anim Track Change Interpolation"
-#~ msgstr "Pista Anim Mudar Interpolação"
-
-#~ msgid "Anim Track Change Value Mode"
-#~ msgstr "Pista Anim Mudar Modo do Valor"
-
-#~ msgid "Anim Track Change Wrap Mode"
-#~ msgstr "Pista Anim Mudar Modo de Embrulho"
-
-#~ msgid "Edit Node Curve"
-#~ msgstr "Editar curva do Nó"
-
-#~ msgid "Edit Selection Curve"
-#~ msgstr "Editar Curva da Seleção"
-
-#~ msgid "Anim Add Key"
-#~ msgstr "Anim Adicionar Chave"
-
-#~ msgid "In"
-#~ msgstr "Dentro"
-
-#~ msgid "Out"
-#~ msgstr "Fora"
-
-#~ msgid "In-Out"
-#~ msgstr "Dentro-Fora"
-
-#~ msgid "Out-In"
-#~ msgstr "Fora-Dentro"
-
-#~ msgid "Change Anim Len"
-#~ msgstr "Mudar Duração da Animação"
-
-#~ msgid "Change Anim Loop"
-#~ msgstr "Mudar Ciclo da Animação"
-
-#~ msgid "Anim Create Typed Value Key"
-#~ msgstr "Anim Criar Chave de Valor Digitado"
-
-#~ msgid "Anim Add Call Track"
-#~ msgstr "Anim Adicionar Pista de chamada"
-
-#~ msgid "Length (s):"
-#~ msgstr "Duração (s):"
-
-#~ msgid "Cursor step snap (in seconds)."
-#~ msgstr "Ajuste do Cursor (em segundos)."
-
-#~ msgid "Enable/Disable looping in animation."
-#~ msgstr "Ativar/Desativar repetição na Animação."
-
-#~ msgid "Add new tracks."
-#~ msgstr "Adicionar novas Pistas."
-
-#~ msgid "Move current track up."
-#~ msgstr "Mover Pista atual para cima."
-
-#~ msgid "Move current track down."
-#~ msgstr "Mover Pista atual para baixo."
-
-#~ msgid "Track tools"
-#~ msgstr "Ferramentas da Pista"
-
-#~ msgid "Enable editing of individual keys by clicking them."
-#~ msgstr "Ativar edição de Chaves individuais ao clicar nelas."
-
-#~ msgid "Key"
-#~ msgstr "Chave"
-
-#~ msgid "Call Functions in Which Node?"
-#~ msgstr "Chamar funções em que Nó?"
-
-#~ msgid "Thanks!"
-#~ msgstr "Obrigado!"
-
-#~ msgid "I see..."
-#~ msgstr "Eu vejo..."
-
-#~ msgid "Can't open '%s'."
-#~ msgstr "Impossível abrir '%s'."
-
-#~ msgid "Ugh"
-#~ msgstr "Ugh"
-
-#~ msgid "Run Script"
-#~ msgstr "Executar Script"
-
-#~ msgid "Stop Profiling"
-#~ msgstr "Parar análise"
-
-#~ msgid "Start Profiling"
-#~ msgstr "Começar análise"
-
-#~ msgid "Default (Same as Editor)"
-#~ msgstr "Padrão (mesmo que o Editor)"
-
-#~ msgid "Create new animation in player."
-#~ msgstr "Criar uma nova Animação no reprodutor."
-
-#~ msgid "Load animation from disk."
-#~ msgstr "Abrir Animação do disco."
-
-#~ msgid "Load an animation from disk."
-#~ msgstr "Carregar uma Animação do disco."
-
-#~ msgid "Save the current animation"
-#~ msgstr "Guardar a Animação atual"
-
-#~ msgid "Edit Target Blend Times"
-#~ msgstr "Editar tempos de mistura do alvo"
-
-#~ msgid "Copy Animation"
-#~ msgstr "Copiar Animação"
-
-#~ msgid "Fetching:"
-#~ msgstr "Em busca:"
-
-#~ msgid "prev"
-#~ msgstr "anterior"
-
-#~ msgid "next"
-#~ msgstr "seguinte"
-
-#~ msgid "last"
-#~ msgstr "último"
-
-#~ msgid "Edit IK Chain"
-#~ msgstr "Editar corrente IK"
-
-#~ msgid "Drag pivot from mouse position"
-#~ msgstr "Arrastar Eixo da posição do rato"
-
-#~ msgid "Set pivot at mouse position"
-#~ msgstr "Definir Eixo na posição do rato"
-
-#~ msgid "Add/Remove Color Ramp Point"
-#~ msgstr "Adicionar/remover Ponto da rampa de cores"
-
-#~ msgid "OK :("
-#~ msgstr "OK :("
-
-#~ msgid "Skeleton Gizmo visibility"
-#~ msgstr "Visibilidade do Skeleton Gizmo"
-
-#~ msgid "StyleBox Preview:"
-#~ msgstr "Pré-visualização StyleBox:"
-
-#~ msgid "StyleBox"
-#~ msgstr "StyleBox"
-
-#~ msgid "Separation:"
-#~ msgstr "Separação:"
-
-#~ msgid "Texture Region Editor"
-#~ msgstr "Editor da região de textura"
-
-#~ msgid "Erase selection"
-#~ msgstr "Apagar seleção"
-
-#~ msgid "Item name or ID:"
-#~ msgstr "Nome ou ID do item:"
-
-#~ msgid "Export templates for this platform are missing/corrupted: "
-#~ msgstr ""
-#~ "Modelos de exportação para esta plataforma estão ausentes/corrompidos: "
-
-#~ msgid "Button 8"
-#~ msgstr "Botão 8"
-
-#~ msgid "Button 9"
-#~ msgstr "Botão 9"
-
-#~ msgid "Discard Instancing"
-#~ msgstr "Descartar instância"
-
-#~ msgid "Clear!"
-#~ msgstr "Limpo!"
-
-#~ msgid "Toggle Spatial Visible"
-#~ msgstr "Alternar visibilidade espacial"
-
-#~ msgid "Condition"
-#~ msgstr "Condição"
-
-#~ msgid "Sequence"
-#~ msgstr "Sequência"
-
-#~ msgid "Iterator"
-#~ msgstr "Iterador"
-
-#~ msgid "While"
-#~ msgstr "Enquanto"
-
-#~ msgid "Return"
-#~ msgstr "Voltar"
-
-#~ msgid "Call"
-#~ msgstr "Chamar"
-
-#~ msgid "Edit Variable"
-#~ msgstr "Editar variável"
-
-#~ msgid "Edit Signal"
-#~ msgstr "Editar sinal"
-
-#~ msgid "Invalid action (anything goes but '/' or ':')."
-#~ msgstr "Ação inválida (tudo menos '/' ou ':')."
-
-#~ msgid "Can't contain '/' or ':'"
-#~ msgstr "Não pode conter '/' ou ':'"
-
-#~ msgid ""
-#~ "Invalid version.txt format inside templates. Revision is not a valid "
-#~ "identifier."
-#~ msgstr ""
-#~ "Formato de version.txt inválido, dentro dos Modelos. Revisão não é um "
-#~ "identificador válido."
-
-#~ msgid "Can't write file."
-#~ msgstr "Impossível escrever o Ficheiro."
-
-#~ msgid "Couldn't get project.godot in project path."
-#~ msgstr "Impossível encontrar project.godot no Caminho do Projeto."
-
-#~ msgid "Couldn't get project.godot in the project path."
-#~ msgstr "Impossível encontrar project.godot no Caminho do Projeto."
-
-#~ msgid "Not found!"
-#~ msgstr "Não encontrado!"
-
-#~ msgid "Replace By"
-#~ msgstr "Substituir por"
-
-#~ msgid "Backwards"
-#~ msgstr "Para trás"
-
-#~ msgid "Prompt On Replace"
-#~ msgstr "Perguntar ao substituir"
-
-#~ msgid "Skip"
-#~ msgstr "Ignorar"
-
-#~ msgid ""
-#~ "Your project will be created in a non empty folder (you might want to "
-#~ "create a new folder)."
-#~ msgstr ""
-#~ "O Projeto será criado numa pasta não vazia (poderá preferir criar uma "
-#~ "nova pasta)."
-
-#~ msgid "That's a BINGO!"
-#~ msgstr "É um BINGO!"
-
-#~ msgid "preview"
-#~ msgstr "Pré-visualização"
-
-#~ msgid "Move Add Key"
-#~ msgstr "Mover Adicionar Chave"
-
-#~ msgid "Create Subscription"
-#~ msgstr "Criar subscrição"
-
-#~ msgid "List:"
-#~ msgstr "Lista:"
-
-#~ msgid "Set Emission Mask"
-#~ msgstr "Definir máscara de emissão"
-
-#~ msgid "Clear Emitter"
-#~ msgstr "Limpar emissor"
-
-#~ msgid "Fold Line"
-#~ msgstr "Dobrar linha"
-
-#~ msgid " "
-#~ msgstr " "
-
-#~ msgid "Sections:"
-#~ msgstr "Secções:"
diff --git a/editor/translations/ro.po b/editor/translations/ro.po
index e73e0c1703..1549250858 100644
--- a/editor/translations/ro.po
+++ b/editor/translations/ro.po
@@ -3,20 +3,22 @@
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
# Calin Sopterean <csopterean@gmail.com>, 2018.
-# Filip <filipanton@tutanota.com>, 2018.
+# Filip <filipanton@tutanota.com>, 2018, 2020.
# Nitroretro <nitroretro@protonmail.com>, 2018.
# TigerxWood <TigerxWood@gmail.com>, 2018.
# Grigore Antoniuc <grisa181@gmail.com>, 2018.
# Boby Ilea <boby.ilea@gmail.com>, 2019.
-# EVOKZH <avip.ady@gmail.com>, 2019.
+# EVOKZH <avip.ady@gmail.com>, 2019, 2020.
# Marincia Catalin <catalinmarincia@gmail.com>, 2020.
# Marincia Cătălin <catalinmarincia@gmail.com>, 2020.
+# Teodor <teo.virghi@yahoo.ro>, 2020.
+# f0roots <f0rootss@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-23 15:05+0000\n"
-"Last-Translator: Marincia Cătălin <catalinmarincia@gmail.com>\n"
+"PO-Revision-Date: 2020-08-11 14:04+0000\n"
+"Last-Translator: Filip <filipanton@tutanota.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ro/>\n"
"Language: ro\n"
@@ -25,7 +27,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
-"X-Generator: Weblate 3.11-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -56,7 +58,7 @@ msgstr "Operanzi invalizi la operatorii %s, %s și %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "Indice invalid de tip %s pentru tipul de bază %s"
+msgstr "Index invalid de tip %s pentru tipul de bază %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
@@ -108,7 +110,7 @@ msgstr "Echilibrat"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr "Reflectează"
+msgstr "Oglinda"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -120,7 +122,7 @@ msgstr "Valoare:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "Inserează Cheie Aici"
+msgstr "Inserează Cheia Aici"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
@@ -140,7 +142,7 @@ msgstr "Mută Punct Bezier"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Anim Clonare Chei"
+msgstr "Anim Chei duplicate"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
@@ -160,7 +162,7 @@ msgstr "Anim Schimbare transformare"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Anim Schimbare valoare cadre cheie"
+msgstr "Anim Schimbare valoare Keyframe"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
@@ -267,6 +269,7 @@ msgstr "Mod Intercalare"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
+"Mod de înfășurare a buclei (Intercalează sfârșitul cu începutul în buclă)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
@@ -311,20 +314,20 @@ msgstr "Cubic"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Limitați intercalarea buclei"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Înfășurați intercalarea buclei"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Inserează Notă"
+msgstr "Inserare cheie"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
-msgstr "Clonare Chei(s)"
+msgstr "Clonare Chei"
#: editor/animation_track_editor.cpp
msgid "Delete Key(s)"
@@ -405,6 +408,10 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Track-urile audio pot sa fie folosite numai în noduri de tipul:\n"
+"- AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
@@ -413,6 +420,8 @@ msgstr "Pistele de animație pot direcționa numai nodurilor AnimațieJucător."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Un player de animatie nu se poate anima insusi, doar alti playeri de "
+"animatie."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
@@ -489,6 +498,15 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"Aceasta animație aparține unei scene importante, schimbările de importare "
+"ale Track-urilor nu vor fi salvate.\n"
+"\n"
+"Pentru a activa opțiunea de a adaugă Track-uri, navigați la setările de "
+"import ale scenei și setați\n"
+"\"Animație > Depozitare\" către \"Fișiere\", activați \"Animație > Păstrează "
+"Track-uri personalizate\", după re-importați.\n"
+"Alternativ, folosiți un import presetat care importa animațiile către "
+"fișiere separate."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
@@ -520,6 +538,7 @@ msgid "Seconds"
msgstr "Secunde"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS(cadre pe secundă)"
@@ -652,11 +671,11 @@ msgstr "Anim Adăugați Pistă Audio"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "Schimbați decalajul de pornire a clipului audio"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "Schimbați decalajul de oprire a clipului audio"
#: editor/array_property_edit.cpp
msgid "Resize Array"
@@ -679,8 +698,8 @@ msgid "Line Number:"
msgstr "Linia Numărul:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Înlocuit %d potriviri."
+msgid "%d replaced."
+msgstr "%d Înlocuit"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -698,7 +717,7 @@ msgstr "Potrivește Caz-ul"
msgid "Whole Words"
msgstr "Cuvinte Complete"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Înlocuiți"
@@ -717,23 +736,23 @@ msgstr "Standard"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "Porniti sau opriti panoul de scripturi"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "Zoom-ați În"
+msgstr "Apropiere"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "Zoom-ați Afară"
+msgstr "Departare"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Resetați Zoom-area"
+msgstr "Resetați zoom-ul"
#: editor/code_editor.cpp
msgid "Warnings"
@@ -748,6 +767,10 @@ msgid "Method in target node must be specified."
msgstr "Metoda din nodul țintă trebuie specificată."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Numele metodei trebuie să fie un identificator valid."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -812,6 +835,7 @@ msgstr "Amânat(ă)"
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
msgstr ""
+"Amână semnalul stocând-ul într-o coadă, dându-i drumul numai la timp inactiv."
#: editor/connections_dialog.cpp
msgid "Oneshot"
@@ -829,7 +853,6 @@ msgstr "Nu se poate conecta semnalul"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -886,6 +909,11 @@ msgid "Signals"
msgstr "Semnale"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrare Tiles"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Ești sigur că vrei să ștergi toate conexiunile de la acest semnal?"
@@ -923,7 +951,7 @@ msgid "Recent:"
msgstr "Recent:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cautați:"
@@ -1104,6 +1132,9 @@ msgstr "Fondatorii Proiectului"
msgid "Lead Developer"
msgstr "Dezvoltator Principal"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Manager de Proiect "
@@ -1125,6 +1156,16 @@ msgid "Gold Sponsors"
msgstr "Sponsori Aur"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Donatori de Argint"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Donatori de Bronz"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsori"
@@ -1284,7 +1325,7 @@ msgstr "Opțiuni Pistă Audio"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr "Duplicați"
+msgstr "Duplicat"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
@@ -1414,7 +1455,7 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "Cuvântul cheie nu poate fi utilizat ca nume de încărcare automată."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
@@ -1436,7 +1477,7 @@ msgstr "Mutați Autoload"
msgid "Remove Autoload"
msgstr "Eliminați Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Activați"
@@ -1444,17 +1485,9 @@ msgstr "Activați"
msgid "Rearrange Autoloads"
msgstr "Rearanjați Autoload-urile"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Cale nevalidă."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Fișierul nu există."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Nu în calea de resurse."
+msgid "Can't add autoload:"
+msgstr "Nu pot adaugă încărcare automata:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1481,6 +1514,10 @@ msgstr "Nume"
msgid "Singleton"
msgstr "Singleton (Unicat)"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Lipiţi Parametrii"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Scena se Actualizează"
@@ -1513,7 +1550,7 @@ msgstr "Alegeţi un Director"
#: editor/filesystem_dock.cpp editor/project_manager.cpp
#: scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr "Creați Director"
+msgstr "Creare folder"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
@@ -1537,7 +1574,7 @@ msgstr "Fişierul se Stochează:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "Nu a fost găsit niciun șablon de export pe calea așteptată:"
#: editor/editor_export.cpp
msgid "Packing"
@@ -1548,12 +1585,16 @@ msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"Platforma țintă necesită textură compresată „ETC” pentru GLES2. Activați "
+"„Import Etc” în Setările proiectului."
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"Platforma țintă necesită textură compresata „ETC2” pentru GLES3. Activați "
+"„Import Etc 2” în Setările proiectului."
#: editor/editor_export.cpp
msgid ""
@@ -1562,6 +1603,10 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"Platforma țintă necesită o textură compresată „ETC” pentru revenirea "
+"driverului la GLES2.\n"
+"Activați „Import Etc” în Setările de proiect sau dezactivați „Driver "
+"Fallback Enabled”."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1573,7 +1618,7 @@ msgstr "Fișierul șablon de depanare personalizat nu a fost găsit."
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr ""
+msgstr "Șablonul personalizat de lansare nu a fost găsit."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
@@ -1582,6 +1627,7 @@ msgstr "Fișierul șablon nu a fost găsit:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
+"La exporturile pe 32 de biți PCK-ul încorporat nu poate fi mai mare de 4 GiB."
#: editor/editor_feature_profile.cpp
msgid "3D Editor"
@@ -1589,7 +1635,7 @@ msgstr "Editor 3D"
#: editor/editor_feature_profile.cpp
msgid "Script Editor"
-msgstr "Editorul de Scripturi"
+msgstr "Editor de scripturi"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
@@ -1600,16 +1646,17 @@ msgid "Scene Tree Editing"
msgstr "Editează Arborele Scenei"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Importă Bară"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Nod Bară"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Sistemul De Fișiere și încărcare Bare"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Sistemul De Fișiere"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Importă Bară"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1618,6 +1665,7 @@ msgstr "Ștergeți profilul '%s'?(ireversibil)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
msgstr ""
+"Profilul trebuie sa fie un nume valid de fisier si nu trebuie sa contina '.'"
#: editor/editor_feature_profile.cpp
msgid "Profile with this name already exists."
@@ -1625,7 +1673,7 @@ msgstr "Un profil cu acest nume există deja."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(Editorul Dezactivat, Proprietatile Dezactivate)"
#: editor/editor_feature_profile.cpp
msgid "(Properties Disabled)"
@@ -1649,7 +1697,7 @@ msgstr "Proprietăți Activate:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
-msgstr ""
+msgstr "Caracteristici active:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Classes:"
@@ -1657,13 +1705,15 @@ msgstr "Clase Activate:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "Formatul fișierului '%s' este invalid, importarea este anulată."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
msgstr ""
+"Profilul '%s' este deja existent. Elimină-l inainte de a-l importa, "
+"importara este anulata."
#: editor/editor_feature_profile.cpp
msgid "Error saving profile to path: '%s'."
@@ -1671,7 +1721,7 @@ msgstr "Eroare la salvarea profilului la calea: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "Nesetat(ă)"
#: editor/editor_feature_profile.cpp
msgid "Current Profile:"
@@ -1685,12 +1735,12 @@ msgstr "Faceți Curent"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "New"
-msgstr ""
+msgstr "Nou"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "Importă"
+msgstr "Importare"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
@@ -1742,7 +1792,7 @@ msgstr "Selectaţi directorul curent"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr "Copiaţi Calea"
+msgstr "Copiere cale"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Open in File Manager"
@@ -1757,10 +1807,10 @@ msgstr "Arătați în Administratorul de Fișiere"
msgid "New Folder..."
msgstr "Director Nou..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
-msgstr "Reîmprospătați"
+msgstr "Reîmprospătare"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
@@ -1819,19 +1869,19 @@ msgstr "Comutați Favorite"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr "Modul de Comutare"
+msgstr "Comutare mod"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "Calea Focală"
+msgstr "Cale focalizare"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "Deplasați Favorit Sus"
+msgstr "Mutare favorită în sus"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "Deplasați Favorit Jos"
+msgstr "Mutare favorită în jos"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
@@ -1871,7 +1921,7 @@ msgstr "Directoare și Fişiere:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Previzualizați:"
@@ -1892,6 +1942,8 @@ msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
msgstr ""
+"Există importatori multiplii pentru tipuri diferite care trimit spre "
+"fișierul %s, importarea este anulată"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
@@ -1928,7 +1980,7 @@ msgstr "Proprietăți"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "extindere:"
#: editor/editor_help.cpp
msgid "default:"
@@ -1952,7 +2004,7 @@ msgstr "Constante"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr "Descriere Proprietate"
+msgstr "Descrieri Proprietate"
#: editor/editor_help.cpp
msgid "(value)"
@@ -2050,15 +2102,15 @@ msgstr "Proprietate Temă"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr ""
+msgstr "Proprietate:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "Stabilește"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Seteaza Multiple:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -2094,7 +2146,7 @@ msgstr "Start"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
msgid "Down"
@@ -2102,7 +2154,7 @@ msgstr "Descarcă"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "Sus"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
@@ -2110,32 +2162,32 @@ msgstr "Nod"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "Intrare RPC"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "Intrare RSET"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "Ieșire RPC"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "Ieșire RSET"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "Fereastră Nouă"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "Resursele importate nu pot fi salvate."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr ""
+msgstr "OK"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
@@ -2146,6 +2198,8 @@ msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"Resursa aceasta nu poate fi salvată deoarece nu aparține scenei editate. "
+"Resursa trebuie să fie unică."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
@@ -2165,7 +2219,7 @@ msgstr "Eroare la salvare."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "'%s' nu poate fi deschis. Fișierul ar putea fi modificat sau șters."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2204,6 +2258,8 @@ msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"Această scenă nu poate fi salvată, deoarece există o includere ciclică.\n"
+"Rezolvați-l și apoi încercați să salvați din nou."
#: editor/editor_node.cpp
msgid ""
@@ -2215,11 +2271,11 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Nu pot salva peste scena care este înca deschisă!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr "Imposibil de încărcat MeshLibrary pentru unire!"
+msgstr "Nu pot încarca MeshLibrary pentru combinare!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
@@ -2261,7 +2317,6 @@ msgstr ""
"înţelege mai bine cum sa lucrați cu acestea."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
@@ -2278,41 +2333,34 @@ msgstr ""
"setările din panoul de import şi apoi reimportați."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This scene was imported, so changes to it won't be kept.\n"
"Instancing it or inheriting will allow making changes to it.\n"
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"Această scenă a fost importată, astfel încât modificările la acesta nu vor "
-"fi păstrate.\n"
-"Instanțarea sau moştenirea vă permite efectuarea de modificări la acesta.\n"
-"Vă rugăm să citiţi documentaţia relevantă pentru importul scene pentru a "
-"înţelege mai bine acest mod de lucru."
+"Această scenă a fost importată, astfel încât modificările acesteia nu vor fi "
+"păstrate.\n"
+"Instanțarea sau moştenirea vă permite efectuarea de modificări pentru ea.\n"
+"Vă rugăm să citiți documentația relevantă pentru importarea scenei pentru a "
+"înțelege mai bine acest mod de lucru."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This is a remote object, so changes to it won't be kept.\n"
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"Acesta este un obiect îndepărtat, astfel încât modificările la acesta nu vor "
+"Acesta este un obiect îndepărtat, astfel încât modificările acesteia nu vor "
"fi păstrate.\n"
-"Vă rugăm să citiţi documentaţia relevantă pentru depanare pentru a înţelege "
-"mai bine acest mod de lucru."
+"Vă rugăm să citiți documentația relevantă depanării pentru a înțelege mai "
+"bine acest mod de lucru."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
msgstr "Nu există nici o scenă definită pentru a execuție."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Scena curentă nu a fost salvată niciodată, salvați-o înainte de rulare."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Nu s-a putut porni subprocesul!"
@@ -2325,9 +2373,8 @@ msgid "Open Base Scene"
msgstr "Deschide o scenă de bază"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "Deschide o scenă rapid..."
+msgstr "Deschidere rapidă..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2346,13 +2393,12 @@ msgid "Save changes to '%s' before closing?"
msgstr "Salvează schimbările la ’%s’ înainte de ieșire?"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "Încărcarea resursei a eșuat."
+msgstr "Resurse modificate %s salvate."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr ""
+msgstr "Un nod rădăcină este necesar pentru a salva scena."
#: editor/editor_node.cpp
msgid "Save Scene As..."
@@ -2380,11 +2426,11 @@ msgstr "Exportă Librăria de Mesh-uri"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr "Această operațiune nu poate fi făcută fără un nod de bază."
+msgstr "Această operațiune nu poate fi făcută fără un nod rădăcină."
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr "Exportă Setul de Plăci"
+msgstr "Exportă Tile Setul"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
@@ -2396,23 +2442,27 @@ msgstr "Scena curentă nu este salvată. Deschizi oricum?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr "Nu se poate reîncărca o scenă care nu a fost salvată niciodată."
+msgstr "Nu pot reîncărca o scenă care nu a fost salvată niciodată."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Întoarcere"
+msgid "Reload Saved Scene"
+msgstr "Reîncarcă scenă salvată"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Această acțiune nu poate fi recuperată. Te reîntorci oricum?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Scena actuală are modificări nesalvate.\n"
+"Reîncărcați scena salvată? Această acțiune nu poate fi anulată."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr "Execută Rapid Scena..."
+msgstr "Rulează Rapid Scena..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr "Închidere"
+msgstr "Închide"
#: editor/editor_node.cpp
msgid "Exit the editor?"
@@ -2420,7 +2470,7 @@ msgstr "Ieși din editor?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr "Deschizi Managerul de Proiect?"
+msgstr "Deschide Managerul de Proiect?"
#: editor/editor_node.cpp
msgid "Save & Quit"
@@ -2454,9 +2504,8 @@ msgid "Close Scene"
msgstr "Închide Scena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "Închide Scena"
+msgstr "Redeschidere scenă închisă"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2473,13 +2522,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Nu a putut fi încărcat scriptul add-on din calea: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Nu a putut fi încărcat scriptul add-on din calea: '%s' Scriptul nu este în "
-"modul unealtă."
+"Imposibil de încărcat scriptul addon din cale: '%s' Se pare că există o "
+"eroare în cod, verificați sintaxa."
#: editor/editor_node.cpp
msgid ""
@@ -2561,37 +2609,34 @@ msgstr "Implicit"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "Sistemul De Fișiere"
+msgstr "Afișare în FileSystem"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Rulează Scena"
+msgstr "Redare scenă"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Aproape"
+msgstr "Închidere filă"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "Aproape"
+msgstr "Anulare fila Închidere"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Close Other Tabs"
-msgstr ""
+msgstr "Închideți Alte File"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "Închidere file la dreapta"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "Aproape"
+msgstr "Inchide toate filele"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2634,9 +2679,8 @@ msgid "Go to previously opened scene."
msgstr "Mergi la o scenă deschisă anterior."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Copiaţi Calea"
+msgstr "Copiază textul"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2675,9 +2719,8 @@ msgid "Save Scene"
msgstr "Salvează Scena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "Salvează toate Scenele"
+msgstr "Salvați toate scenele"
#: editor/editor_node.cpp
msgid "Convert To..."
@@ -2702,10 +2745,6 @@ msgid "Redo"
msgstr "Reîntoarcere"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Restabilește Scena"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Proiect Divers sau unelte pentru scenă."
@@ -2715,45 +2754,43 @@ msgid "Project"
msgstr "Proiect"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "Setări ale Proiectului"
+msgstr "Setări proiect..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "Versiune:"
+msgstr "Control versiune"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Set Up Version Control"
-msgstr ""
+msgstr "Configurați controlul versiunii"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "Închidere control versiune"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "Exportare"
+msgstr "Export..."
#: editor/editor_node.cpp
+#, fuzzy
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "Instalare șablon compilare Android..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Deschizi Managerul de Proiect?"
+msgstr "Deschideți folderul datelor proiectului"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Unelte"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "Explorator de Resurse Orfane"
+msgstr "Explorator de resurse orfane ..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2770,24 +2807,28 @@ msgstr "Lansează cu Depanare la Distanță"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Când exporți sau lansezi, executabilul rezultat va încerca să se conecteze "
-"la IP-ul acestui computer pentru a putea fi depanat."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Mini Lansare cu Rețea FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Când această opțiune este activată, exportarea sau lansarea va produce un "
"executabil minimal.\n"
@@ -2800,9 +2841,10 @@ msgid "Visible Collision Shapes"
msgstr "Forme de Coliziune Vizibile"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Formele de coliziune si nodurile raycast (pentru 2D și 3D) vor fi vizibile "
"când jocul rulează dacă această opțiune este activată."
@@ -2812,23 +2854,26 @@ msgid "Visible Navigation"
msgstr "Navigare Vizibilă"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Structurile de navigare și poligoanele vor fi vizibile când jocul rulează "
"dacă această opțiune este activată."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sincronizează Modificările Scenei"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Când această opțiune este activată, orice modificare facută în scenă din "
"editor va fi replicată în jocul care rulează.\n"
@@ -2836,15 +2881,17 @@ msgstr ""
"mult mai eficient dacă este folosit un sistem de fișiere în rețea."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sincronizează Modificările Scriptului"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Când această opțiune este activată, orice script salvat ulterior va fi "
"reîncărcat în jocul care rulează.\n"
@@ -2856,56 +2903,48 @@ msgid "Editor"
msgstr "Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "Setări ale Editorului"
+msgstr "Setări Editor..."
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr "Schema Editorului"
+msgstr "Schema Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "Salvează Scena"
+msgstr "Captură de ecran"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "Setări ale Editorului"
+msgstr "Capturile de ecran sunt stocate în folderul Date/Setări editor."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Comută în Ecran Complet"
+msgstr "Comutare ecran complet"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "Modul de Comutare"
+msgstr "Cumutează Consola de Sistem"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Setări ale Editorului"
+msgstr "Deschide Dosarul De Date/Setări"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Deschidere dosarul de date editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Setări ale Editorului"
+msgstr "Deschide Dosarul de Setări Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "Administrează Șabloanele de Export"
+msgstr "Gestionare caracteristici editor..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "Administrează Șabloanele de Export"
+msgstr "Gestionare șabloane export..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2916,7 +2955,7 @@ msgstr "Ajutor"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Căutare"
@@ -2930,8 +2969,12 @@ msgid "Q&A"
msgstr "Întrebări și Răspunsuri"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Agent de Monitorizare al Problemelor"
+msgid "Report a Bug"
+msgstr "Raportează o Eroare"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Trimite Feedbackul Docs"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2950,12 +2993,13 @@ msgid "Play"
msgstr "Rulează"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "Întrerupeți executarea scenei pentru depanare."
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr "Întrerupere Scenă"
+msgstr "Pauză scenă"
#: editor/editor_node.cpp
msgid "Stop the scene."
@@ -2987,22 +3031,18 @@ msgid "Save & Restart"
msgstr "Salvează și Restartează"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Spins when the editor window redraws."
-msgstr "Se rotește când ferestra editorului se recolorează!"
+msgstr "Se rotește când fereastra editorului se redeschide."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "Continuu"
+msgstr "Actualizare continuă"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "Modificări ale Actualizării"
+msgstr "Actualizează Doar La Modificare"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
msgstr "Dezactivează Cercul de Actualizare"
@@ -3015,9 +3055,8 @@ msgid "Inspector"
msgstr "Inspector"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Expand Bottom Panel"
-msgstr "Extinde toate"
+msgstr "Extinde Panoul De Jos"
#: editor/editor_node.cpp
msgid "Output"
@@ -3030,11 +3069,11 @@ msgstr "Nu Salva"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
msgstr ""
+"Android construi șablon lipsește, vă rugăm să instalați șabloane relevante."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "Administrează Șabloanele de Export"
+msgstr "Gestionați șabloanele"
#: editor/editor_node.cpp
msgid ""
@@ -3060,9 +3099,8 @@ msgid "Import Templates From ZIP File"
msgstr "Importă Șabloane Dintr-o Arhivă ZIP"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Exportă Managerul de Șabloane"
+msgstr "Pachetul cu șabloane"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3117,9 +3155,8 @@ msgid "Warning!"
msgstr ""
#: editor/editor_path.cpp
-#, fuzzy
msgid "No sub-resources found."
-msgstr "Nicio sursă de suprafață specificată."
+msgstr "Nu s-a găsit nici o sub-resursă."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
@@ -3130,14 +3167,12 @@ msgid "Thumbnail..."
msgstr "Miniatură..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "Execută Scriptul"
+msgstr "Script principal:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Editează Poligon"
+msgstr "Editare Plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -3161,9 +3196,8 @@ msgid "Status:"
msgstr "Stare:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Modificare"
+msgstr "Editare:"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -3206,9 +3240,8 @@ msgid "Calls"
msgstr "Apeluri"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Membri"
+msgstr "Editare text:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3231,9 +3264,8 @@ msgid "Assign..."
msgstr ""
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "Nume nevalid."
+msgstr "RID nevalid"
#: editor/editor_properties.cpp
msgid ""
@@ -3264,9 +3296,8 @@ msgid "New Script"
msgstr ""
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Execută Scriptul"
+msgstr "Extinde Script"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
@@ -3312,23 +3343,23 @@ msgid "Remove Item"
msgstr ""
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Nume nou:"
+msgstr "Cheie Nouă:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Nume nou:"
+msgstr "Valoare Nouă:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
msgstr ""
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Nu a fost găsită nicio presetare de export care să poată rula pentru această "
"platformă.\n"
@@ -3358,6 +3389,10 @@ msgstr "Nu a putut fi executat scriptul:"
msgid "Did you forget the '_run' method?"
msgstr "Ai uitat cumva metoda '_run' ?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Selectează Nodul(rile) pentru Importare"
@@ -3375,7 +3410,6 @@ msgid "Import From Node:"
msgstr "Importă Din Nod:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Redownload"
msgstr "Descarcă din nou"
@@ -3417,9 +3451,8 @@ msgid "Can't open export templates zip."
msgstr "Nu se pot deschide șabloanele de export zip."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Format nevalid versiune.txt în șabloane."
+msgstr "Formatul versiune.txt nevalid din interiorul șabloanelor: % s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -3486,9 +3519,8 @@ msgid "Download Complete."
msgstr "Descărcare Completă."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "Nu se poate șterge:"
+msgstr "Nu pot sterge fișierul temporar:"
#: editor/export_template_manager.cpp
msgid ""
@@ -3497,9 +3529,8 @@ msgid ""
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "Eroare la solicitarea URL: "
+msgstr "Eroare la solicitarea URL:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
@@ -3548,9 +3579,8 @@ msgid "SSL Handshake Error"
msgstr "Eroare SSL Handshake"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "Decomprimare Asset-uri"
+msgstr "Decomprimare Surse de compilare Android"
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3571,12 +3601,11 @@ msgstr "Elimină Șablon"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Select Template File"
-msgstr "Selectează fișierul șablon"
+msgstr "Selectare fișier șablon"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Administrează Șabloanele de Export"
+msgstr "Șabloane de export Godot"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3587,14 +3616,12 @@ msgid "Download Templates"
msgstr "Descarcă Șabloane"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Selectează oglinda din listă: "
+msgstr "Selectează oglinda din listă: (Shift+Click: Deschide in Browser)"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Favorite:"
+msgstr "Favorite"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -3627,9 +3654,8 @@ msgid "No name provided."
msgstr "Niciun nume furnizat."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "Numele furnizat conține caractere nevalide"
+msgstr "Numele furnizat conține caractere nevalide."
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
@@ -3656,33 +3682,28 @@ msgid "Duplicating folder:"
msgstr "Duplicând directorul:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "Scenă Derivată Nouă..."
+msgstr "Nouă scenă moștenită"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Alege o Scenă Principală"
+msgstr "Setează ca scenă principală"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Deschide o scenă"
+msgstr "Deschide Scene"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr "Instanță"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "Favorite:"
+msgstr "Adauga la Favorite"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "Elimină din Grup"
+msgstr "Eliminare din Preferințe"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3705,31 +3726,26 @@ msgid "Move To..."
msgstr "Mută În..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "Scenă Nouă"
+msgstr "Scenă nouă..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "Deschide un script rapid..."
+msgstr "Script nou ..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Salvați Resursa Ca..."
+msgstr "Resursă nouă ..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
-msgstr "Extinde toate"
+msgstr "Extinde Toate"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "Restrânge toate"
+msgstr "Reduceți Toate"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3739,28 +3755,24 @@ msgid "Rename"
msgstr "Redenumește"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "Fila anterioară"
+msgstr "Folder/Fișier Anterior"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "Creați Director"
+msgstr "Folder/Fișier Următor"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
msgstr "Rescanează Sistemul de Fișiere"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle Split Mode"
-msgstr "Modul de Comutare"
+msgstr "Comută Modul Split"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "Căutare Clase"
+msgstr "Căută fișiere"
#: editor/filesystem_dock.cpp
msgid ""
@@ -3775,42 +3787,36 @@ msgid "Move"
msgstr "Mută"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Un fișier sau un director cu acest nume există deja."
+msgstr "Există deja un fișier sau un dosar cu același nume în această locație."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "Salvează Scena"
+msgstr "Crează scenă"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "%d mai multe fișiere"
+msgstr "Caută în fișiere"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Găsiți"
+msgstr "Găsiți:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Creați Director"
+msgstr "Folderul:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filtre..."
+msgstr "Filtre:"
#: editor/find_in_files.cpp
msgid ""
@@ -3832,29 +3838,24 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "Găsiți"
+msgstr "Găsiți: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "Înlocuiți"
+msgstr "Înlocuiți: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Înlocuiți Tot"
+msgstr "Înlocuiește tot (fără anulare)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Se Salvează..."
+msgstr "Caut..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Căutați Text"
+msgstr "Căutare completă"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3865,33 +3866,28 @@ msgid "Remove from Group"
msgstr "Elimină din Grup"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "EROARE: Numele animației există deja!"
+msgstr "Numele grupului există deja."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "Nume nevalid."
+msgstr "Nume de grup nevalid."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "Grupuri"
+msgstr "Renumește Grupul"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "Șterge Schema"
+msgstr "Șterge Grupul"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupuri"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes Not in Group"
-msgstr "Adaugă în Grup"
+msgstr "Nodurile Nu Sunt în Grup"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
@@ -3899,23 +3895,20 @@ msgid "Filter nodes"
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Adaugă în Grup"
+msgstr "Noduri în Grup"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
msgstr ""
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "Deschide Editorul de Scripturi"
+msgstr "Editor Grup"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Grupuri"
+msgstr "Gestionați grupuri"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3991,10 +3984,18 @@ msgid "Error running post-import script:"
msgstr "Eroare la executarea scripyului post-importare:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Se Salvează..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Fișiere"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Setează ca Implicit pentru '%s'"
@@ -4003,30 +4004,24 @@ msgid "Clear Default for '%s'"
msgstr "Curăță setarea Implicită pentru '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Fișiere"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importă Ca:"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "Presetare..."
+msgstr "Presetare"
#: editor/import_dock.cpp
msgid "Reimport"
msgstr "Reimportă"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
-#, fuzzy
msgid "Changing the type of an imported file requires editor restart."
-msgstr "Schimbarea driver-ului video necesită restartarea editorului."
+msgstr "Modificarea tipului de fișier importat necesită repornirea editorului."
#: editor/import_dock.cpp
msgid ""
@@ -4038,14 +4033,12 @@ msgid "Failed to load resource."
msgstr "Încărcarea resursei a eșuat."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
-msgstr "Extinde toate proprietăţile"
+msgstr "Extindeți toate proprietățile"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "Restrânge toate proprietăţile"
+msgstr "Reduceți toate proprietățile"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -4057,13 +4050,8 @@ msgid "Copy Params"
msgstr "Copie Parametrii"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Lipiţi Parametrii"
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Clip-board de resurse gol !"
+msgstr "Editare clipboard resursă"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4110,9 +4098,8 @@ msgid "Object properties."
msgstr "Proprietățile obiectului."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Proprietățile obiectului."
+msgstr "Proprietăți filtrare"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -4123,24 +4110,20 @@ msgid "MultiNode Set"
msgstr "Set MultiNod"
#: editor/node_dock.cpp
-#, fuzzy
msgid "Select a single node to edit its signals and groups."
-msgstr "Selectează un Nod pentru a edita Semnalele și Grupurile."
+msgstr "Selectați un singur nod pentru a-i edita semnalele și grupurile."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Editează Poligon"
+msgstr "Editează un Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Crează Poligon"
+msgstr "Crează un plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Plugin-uri"
+msgstr "Nume plugin:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
@@ -4160,37 +4143,31 @@ msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "Crează Poligon"
+msgstr "Crează poligon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "Șterge puncte"
+msgstr "Creați puncte."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid ""
"Edit points.\n"
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
-"Editează poligon existent:\n"
-"LMB: Mută Punct.\n"
-"Ctrl+LMB: Despică Segment.\n"
-"RMB: Șterge Punct."
+"Editează puncte\n"
+"LMB: Mută Punct\n"
+"RMB: Șterge Punct"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Erase points."
-msgstr "RMB: Șterge Punctul."
+msgstr "Șterge puncte."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
msgstr "Editează Poligon"
@@ -4199,14 +4176,12 @@ msgid "Insert Point"
msgstr "Inserează Punct"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon (Remove Point)"
-msgstr "Editează Poligon (Elimină Punct)"
+msgstr "Editează Poligon (Șterge puncte)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Remove Polygon And Point"
-msgstr "Elimină Poligon Și Punct"
+msgstr "Șterge Poligon Și Punct"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4220,25 +4195,21 @@ msgstr "Adaugă Animația"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load..."
-msgstr "Încărcați"
+msgstr "Încărca..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "Deplasare punct"
+msgstr "Mută punct nod"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Limits"
-msgstr "Schimbă Timpul Amestecului"
+msgstr "Modifică limitele BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Labels"
-msgstr "Schimbă Timpul Amestecului"
+msgstr "Modifică etichetele BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4313,9 +4284,8 @@ msgid "Open Animation Node"
msgstr "Nod de Animație"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "EROARE: Numele animației există deja!"
+msgstr "Triunghiul există deja."
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
@@ -4428,9 +4398,8 @@ msgid "Delete Node(s)"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "Comutează modul fără distrageri."
+msgstr "Comutare filtru activat/dezactivat"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#, fuzzy
@@ -4467,9 +4436,8 @@ msgstr "Funcții"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Renamed"
-msgstr "Nume Nod:"
+msgstr "Nod redenumit"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4478,9 +4446,8 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editează Filtrele"
+msgstr "Editare piste filtrate:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#, fuzzy
@@ -4604,9 +4571,8 @@ msgid "Animation"
msgstr "Animație"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Tranziții"
+msgstr "Editare tranziții..."
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -4708,9 +4674,8 @@ msgid "Move Node"
msgstr "Mod Mutare"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Tranziție"
+msgstr "Tranziţia există!"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -4773,14 +4738,12 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Creați %s Nou"
+msgstr "Creați noduri noi."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Conectați la Nod:"
+msgstr "Conectați nodurile."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -4796,14 +4759,12 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Tranziție"
+msgstr "Tranziție: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Mod În Jur"
+msgstr "Mod redare:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4998,14 +4959,12 @@ msgid "Redirect loop."
msgstr "Buclă de Redirecționare."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed, timeout"
-msgstr "Cerere eșuată, cod returnat:"
+msgstr "Solicitare nereușită, expirare"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Timeout."
-msgstr "Timp"
+msgstr "Pauză."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -5028,14 +4987,12 @@ msgid "Asset Download Error:"
msgstr "Eroare la Descărcarea Asset-ului:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Se Descarcă"
+msgstr "Se descarcă (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Se Descarcă"
+msgstr "Descărcare..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -5050,9 +5007,8 @@ msgid "Idle"
msgstr "Inactiv"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Instalați"
+msgstr "Instalare..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -5120,14 +5076,12 @@ msgid "No results for \"%s\"."
msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Import..."
-msgstr "Importă"
+msgstr "Import..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Plugins..."
-msgstr "Plugin-uri"
+msgstr "Plugin-uri..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
@@ -5143,9 +5097,8 @@ msgid "Site:"
msgstr "Site:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Support"
-msgstr "Suport..."
+msgstr "Suport"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -5156,9 +5109,8 @@ msgid "Testing"
msgstr "Se Testează"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Loading..."
-msgstr "Încărcați"
+msgstr "Încărcare..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
@@ -5193,7 +5145,7 @@ msgid "Bake Lightmaps"
msgstr "Procesează Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Previzualizare"
@@ -5387,9 +5339,8 @@ msgid "Full Rect"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "Proporție Scalare:"
+msgstr "Păstrare raport"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5476,14 +5427,13 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-#, fuzzy
msgid "Zoom Reset"
-msgstr "Zoom-ați Afară"
+msgstr "Resetare zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr "Mod Selectare"
+msgstr "Selectare mod"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
@@ -5537,14 +5487,12 @@ msgid "Pan Mode"
msgstr "Mod În Jur"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "Modul de Execuție:"
+msgstr "Mod riglă"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle smart snapping."
-msgstr "Comutare snapping"
+msgstr "Comutați fixarea inteligentă."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5552,9 +5500,8 @@ msgid "Use Smart Snap"
msgstr "Utilizează Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle grid snapping."
-msgstr "Comutare snapping"
+msgstr "Comutare grilă fixare."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5673,7 +5620,7 @@ msgstr "Arată Grila"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
-msgstr "Arată Asistenții"
+msgstr "Afișare ajutoare"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Rulers"
@@ -5681,7 +5628,7 @@ msgstr "Arată Riglele"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Guides"
-msgstr "Arată Ghizii"
+msgstr "Afișare ghiduri"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Origin"
@@ -5720,9 +5667,8 @@ msgid "Scale mask for inserting keys."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys (based on mask)."
-msgstr "Inserează Notă (Melodii existente)"
+msgstr "Introduce cheile (bazat pe masca)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5744,7 +5690,7 @@ msgstr "Lungime Animație (în secunde)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr "Inserează Notă (Melodii existente)"
+msgstr "Inserează Cheie (Track-uri existente)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -5828,9 +5774,8 @@ msgstr "Încărcare Mască de Emisie"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "Restartare (s):"
+msgstr "Restart"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5865,9 +5810,8 @@ msgstr ""
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "Directoare și Fişiere:"
+msgstr "Pixeli borduri direcționați"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5999,12 +5943,12 @@ msgid "Mesh is empty!"
msgstr "Mesh-ul este gol!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Creează un Corp Static Trimesh"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Nu a putut crea o formă de coliziune Trimesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Creează un Corp Static Convex"
+msgid "Create Static Trimesh Body"
+msgstr "Creează un Corp Static Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -6016,12 +5960,29 @@ msgid "Create Trimesh Static Shape"
msgstr "Creează o Formă Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "Creează o Formă Convexă"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Nu a putut crea nici o formă de coliziune."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Creează o Formă Convexă"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6073,19 +6034,57 @@ msgid "Create Trimesh Static Body"
msgstr "Creează un Corp Static Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Creează un Frate de Coliziune Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Creează un Frate de Coliziune Convex"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Creează un Frate de Coliziune Convex"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Se Creează un Mesh de Contur..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Vizionare UV1"
@@ -6114,16 +6113,16 @@ msgid "Remove item %d?"
msgstr "Elimini obiectul %d?"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Actualizează din Scenă"
+msgstr ""
+"Actualizează din Scenă existenta?:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid "Mesh Library"
-msgstr "Librărie_de_Structuri..."
+msgstr "Bibliotecă meshuri"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6531,9 +6530,8 @@ msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Open Polygon 2D UV editor."
-msgstr "Editor UV de poligoane 2D"
+msgstr "Deschideți editorul UV Poligon 2D."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -6643,9 +6641,8 @@ msgid "Show Grid"
msgstr "Arată Grila"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Configurare Snap"
+msgstr "Configurare grilă:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6727,9 +6724,8 @@ msgid "AnimationTree has no path set to an AnimationPlayer"
msgstr ""
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Arborele Animației este nevalid."
+msgstr "Calea către AnimationPlayer nu este validă"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -6740,14 +6736,12 @@ msgid "Close and save changes?"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Eroare la salvarea TileSet!"
+msgstr "Eroare la scrierea TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "Directorul nu a putut fi creat."
+msgstr "Nu s-a putut încărca fișierul la:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6760,19 +6754,16 @@ msgid "Error while saving theme."
msgstr "Eroare la salvare."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
-msgstr "Eroare mutând:"
+msgstr "Eroare La Salvarea"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "Eroare mutând:"
+msgstr "Eroare la importarea temei."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
-msgstr "Eroare mutând:"
+msgstr "Eroare la importare"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6837,18 +6828,16 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "Proprietățile obiectului."
+msgstr "Filtrare scripturi"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter methods"
-msgstr "Proprietățile obiectului."
+msgstr "Metode de filtrare"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -6879,9 +6868,8 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open..."
-msgstr "Deschide"
+msgstr "Deschide..."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6966,17 +6954,8 @@ msgid "Debug with External Editor"
msgstr "Deschide Editorul următor"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "Deschide Recente"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
+msgstr "Deschideți documentația online Godot."
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
@@ -7039,19 +7018,19 @@ msgid "Target"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "Deconectați '%s' de la '%s'"
+msgstr ""
+"Lipsește metoda conectată '%s' pentru semnalul '%s' de la nodul '%s' la "
+"nodul '%s'."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Line"
-msgstr "Linie:"
+msgid "[Ignore]"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
+msgid "Line"
+msgstr "Linie"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7207,14 +7186,12 @@ msgid "Remove All Bookmarks"
msgstr "Eliminați Autoload"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
-msgstr "Faceți Funcția"
+msgstr "Salt la funcție..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "Duceți-vă la Linie"
+msgstr "Salt la linie..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -7430,6 +7407,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Lock View Rotation"
msgstr "Curăță Rotația Cursorului"
@@ -7521,18 +7502,27 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Curăță Rotația Cursorului"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "Curăță Rotația Cursorului"
+msgid "XForm Dialog"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7655,9 +7645,8 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Settings..."
-msgstr "Setări Snap"
+msgstr "Setări ..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7776,9 +7765,8 @@ msgid "Invalid geometry, can't replace by mesh."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Mesh2D"
-msgstr "Convertește În..."
+msgstr "Conversie în Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create polygon."
@@ -7829,9 +7817,8 @@ msgid "Update Preview"
msgstr "Previzualizare"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Setări Snap"
+msgstr "Setări:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -7847,9 +7834,8 @@ msgid "Add Frame"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "Încărcarea resursei a eșuat."
+msgstr "Imposibil de încărcat imaginile"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -7881,9 +7867,8 @@ msgid "Move Frame"
msgstr "Mod Mutare"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animations:"
-msgstr "Animație"
+msgstr "Animaţii:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -7891,7 +7876,7 @@ msgid "New Animation"
msgstr "Animație"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8166,9 +8151,8 @@ msgid "Erase Selection"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Nume nevalid."
+msgstr "Remediere Tiles nevalide"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
@@ -8215,9 +8199,8 @@ msgid "Enable Priority"
msgstr "Editează Filtrele"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter tiles"
-msgstr "Filtrează fișierele..."
+msgstr "Filtrare Tiles"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
@@ -8265,9 +8248,8 @@ msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "Elimină Obiectul Selectat"
+msgstr "Eliminați textura selectată din TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -8308,9 +8290,8 @@ msgid "Select the previous shape, subtile, or Tile."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region"
-msgstr "Modul de Execuție:"
+msgstr "Regiunea"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8343,9 +8324,8 @@ msgid "Z Index"
msgstr "Mod În Jur"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region Mode"
-msgstr "Modul de Execuție:"
+msgstr "Mod regiune"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8387,9 +8367,8 @@ msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste bitmask."
-msgstr "Lipește Animație"
+msgstr "Lipiți bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8397,9 +8376,8 @@ msgid "Erase bitmask."
msgstr "RMB: Șterge Punctul."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "Creați %s Nou"
+msgstr "Creați un dreptunghi nou."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8424,9 +8402,10 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "Elimină Obiectul Selectat"
+msgstr ""
+"Eliminați textura selectată? Acest lucru va elimina toate tiles care îl "
+"utilizează."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
@@ -8456,9 +8435,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "Ştergeți fişierele selectate?"
+msgstr "Ștergeți Rectul selectat."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8467,9 +8445,8 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
-msgstr "Șterge puncte"
+msgstr "Ștergeți poligonul."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8517,9 +8494,8 @@ msgid "Edit Tile Bitmask"
msgstr "Editează Filtrele"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Collision Polygon"
-msgstr "Editează poligonul existent:"
+msgstr "Editează coliziunea poligonului"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8605,15 +8581,14 @@ msgid "This property can't be changed."
msgstr "Această operație nu se poate face fără o scenă."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "TileSet"
-msgstr "Set_de_Plăci..."
+msgstr "Set de dale"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8722,9 +8697,8 @@ msgid "Add Output"
msgstr "Adaugă Intrare(Input)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "Dimensiune:"
+msgstr "Scalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector"
@@ -8758,9 +8732,8 @@ msgid "Change output port type"
msgstr "Schimbă tipul implicit"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "Schimbă Numele Animației:"
+msgstr "Modificarea numelui portului de intrare"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Change output port name"
@@ -8777,9 +8750,8 @@ msgid "Remove output port"
msgstr "Elimină punct"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set expression"
-msgstr "Versiune Curentă:"
+msgstr "Setare expresie"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Resize VisualShader node"
@@ -8830,9 +8802,8 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Show resulted shader code."
-msgstr "Creează Nod"
+msgstr "Afișează codul shader rezultat."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8840,18 +8811,16 @@ msgid "Create Shader Node"
msgstr "Creează Nod"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "Faceți Funcția"
+msgstr "Funcția de culoare."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "Faceți Funcția"
+msgstr "Funcția tonuri de gri."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
@@ -8862,9 +8831,8 @@ msgid "Converts RGB vector to HSV equivalent."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "Faceți Funcția"
+msgstr "Funcția sepia."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
@@ -8875,18 +8843,16 @@ msgid "Darken operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Difference operator."
-msgstr "Doar Diferențe"
+msgstr "Operator de diferență."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "HardLight operator."
-msgstr "Dimensiune (raport):"
+msgstr "Operator HardLight."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
@@ -8905,14 +8871,12 @@ msgid "SoftLight operator."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "Permanent"
+msgstr "Constantă de culoare."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "Anim Schimbare transformare"
+msgstr "Culoare uniformă."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
@@ -8993,9 +8957,8 @@ msgid "'%s' input parameter for all shader modes."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "Snap către părinte"
+msgstr "Parametru de intrare."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
@@ -9022,14 +8985,12 @@ msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "Scalați Selecția"
+msgstr "Funcție scalară."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "Dimensiune (raport):"
+msgstr "Operator scalar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
@@ -9258,9 +9219,8 @@ msgid "Scalar constant."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "Anim Schimbare transformare"
+msgstr "Scalare uniformă."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
@@ -9283,9 +9243,8 @@ msgid "2D texture uniform lookup with triplanar."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "Crează Poligon"
+msgstr "Funcție de transformare."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9327,19 +9286,16 @@ msgid "Multiplies vector by transform."
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "Crează Poligon"
+msgstr "Transformare constantă."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "Crează Poligon"
+msgstr "Transformare uniformă."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "Faceți Funcția"
+msgstr "Funcție vectorială."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector operator."
@@ -9550,9 +9506,8 @@ msgid "Runnable"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Add initial export..."
-msgstr "Adaugă Intrare(Input)"
+msgstr "Adăugare export inițial..."
#: editor/project_export.cpp
msgid "Add previous patches..."
@@ -9660,9 +9615,8 @@ msgid "Make Patch"
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " Fișiere"
+msgstr "Împachetează Fișierul"
#: editor/project_export.cpp
msgid "Features"
@@ -9682,9 +9636,8 @@ msgid "Script"
msgstr "Execută Scriptul"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script Export Mode:"
-msgstr "Exportă Proiectul"
+msgstr "Mod export script:"
#: editor/project_export.cpp
msgid "Text"
@@ -9715,9 +9668,8 @@ msgid "Export Project"
msgstr "Exportă Proiectul"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Exportă Proiectul"
+msgstr "Exportă Proiectul?"
#: editor/project_export.cpp
#, fuzzy
@@ -9725,9 +9677,8 @@ msgid "Export All"
msgstr "Exportare"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " Fișiere"
+msgstr "Fișiere ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
@@ -9746,11 +9697,18 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "Fișierul nu există."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Eroare la deschiderea fişierului pachet, nu este în format ZIP."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9758,11 +9716,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9986,6 +9944,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -10038,6 +9997,13 @@ msgstr ""
"Dorești să explorezi exemplele de proiecte oficiale din Librăria de Asset-"
"uri?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10061,18 +10027,16 @@ msgid ""
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "EROARE: Numele animației există deja!"
+msgstr "Există deja o acțiune cu numele '%s'."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Schimbă Numele Animației:"
+msgstr "Modificare acțiune deadzone"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
@@ -10421,14 +10385,23 @@ msgid "Batch Rename"
msgstr "Redenumește"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Înlocuiți: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Folosiți expresii regulate"
+
+#: editor/rename_dialog.cpp
#, fuzzy
msgid "Advanced Options"
msgstr "Opțiuni Snapping"
@@ -10438,23 +10411,20 @@ msgid "Substitute"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nume Nod:"
+msgstr "Nume nod"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Nume Nod:"
+msgstr "Tip nod"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Scena curentă nu este salvată. Deschizi oricum?"
+msgstr "Numele scenei curente"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -10468,11 +10438,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10480,9 +10450,8 @@ msgid "Initial value for the counter"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Pas (s):"
+msgstr "Pas"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
@@ -10499,10 +10468,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10511,11 +10476,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10535,6 +10500,15 @@ msgstr ""
msgid "Reset"
msgstr "Resetați Zoom-area"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Folosiți expresii regulate"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "La caracterul %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10598,7 +10572,8 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+#, fuzzy
+msgid "Detach Script"
msgstr "Curăță Scriptul"
#: editor/scene_tree_dock.cpp
@@ -10636,8 +10611,12 @@ msgstr "Salvează Scena"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Ștergeți %d noduri?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Creează Nod"
+msgstr "Ștergeți %d noduri?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10648,9 +10627,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Creează Nod"
+msgstr "Ștergeți nodul \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10687,9 +10665,8 @@ msgid "New Scene Root"
msgstr "Salvează Scena"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Creează Nod"
+msgstr "Creare nod rădăcină:"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10767,6 +10744,13 @@ msgid "Open Documentation"
msgstr "Deschide Recente"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10806,9 +10790,8 @@ msgid "Delete (No Confirm)"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Creați %s Nou"
+msgstr "Adaugă/Creează un Nod nou."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10817,11 +10800,13 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
+msgstr "Curăță un script pentru nodul selectat."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+#, fuzzy
+msgid "Detach the script from the selected node."
msgstr "Curăță un script pentru nodul selectat."
#: editor/scene_tree_dock.cpp
@@ -10879,9 +10864,8 @@ msgid ""
msgstr ""
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "Execută Scriptul"
+msgstr "Deschide scriptul:"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -10926,14 +10910,12 @@ msgid "Select a Node"
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "Mesh-ul este gol!"
+msgstr "Calea este goală."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "Mesh-ul este gol!"
+msgstr "Numele fișierului este gol."
#: editor/script_create_dialog.cpp
msgid "Path is not local."
@@ -10950,6 +10932,10 @@ msgid "A directory with the same name exists."
msgstr "Un fișier sau un director cu acest nume există deja."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Fișierul nu există."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Trebuie să utilizaţi o extensie valida."
@@ -10993,6 +10979,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Cale nevalidă."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid class name."
msgstr "Nume nevalid."
@@ -11003,7 +10993,7 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr "Arborele Animației este valid."
#: editor/script_create_dialog.cpp
@@ -11016,9 +11006,8 @@ msgid "Built-in script (into scene file)."
msgstr "Operațiuni cu fișiere tip scenă."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "Creați %s Nou"
+msgstr "Va crea un nou fișier script."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11026,9 +11015,14 @@ msgid "Will load an existing script file."
msgstr "Încărcaţi o Schemă de Pistă Audio existentă."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "AutoLoad '%s' există deja!"
+msgstr "Fișierul script există deja."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11036,14 +11030,12 @@ msgid "Class Name:"
msgstr "Clasă:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "Elimină Șablon"
+msgstr "Şablon:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "Execută Scriptul"
+msgstr "Script încorporat:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -11062,19 +11054,16 @@ msgid "Warning:"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Error:"
-msgstr "Eroare!"
+msgstr "Eroare:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error"
-msgstr "Eroare!"
+msgstr "Eroare C++"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error:"
-msgstr "Eroare!"
+msgstr "Eroare C++:"
#: editor/script_editor_debugger.cpp
#, fuzzy
@@ -11082,14 +11071,12 @@ msgid "C++ Source"
msgstr "Resursă"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
-msgstr "Resursă"
+msgstr "Sursă:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "Resursă"
+msgstr "Sursă C++:"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
@@ -11100,15 +11087,18 @@ msgid "Errors"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Child process connected."
-msgstr "Deconectat"
+msgstr "Procesul copilului conectat."
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Șterge puncte"
@@ -11158,8 +11148,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Exportă Profil"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11520,9 +11511,8 @@ msgid "Pick Distance:"
msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "Proprietățile obiectului."
+msgstr "Filtru meshuri"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
@@ -11664,18 +11654,16 @@ msgstr ""
"motor tip."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "Creați %s Nou"
+msgstr "Creați o nouă funcție."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "Creați %s Nou"
+msgstr "Creați o nouă variabilă."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -11813,14 +11801,12 @@ msgid "Disconnect Nodes"
msgstr "Deconectat"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Conectați la Nod:"
+msgstr "Conectare date nod"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Conectați la Nod:"
+msgstr "Conectare secvență nod"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -11889,18 +11875,16 @@ msgid "Editing Signal:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Tool:"
-msgstr "Creează Oase"
+msgstr "Creare Unealta:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
msgstr "Membri:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "Schimbați Tipul %s"
+msgstr "Modificare tip bază:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -11908,9 +11892,8 @@ msgid "Add Nodes..."
msgstr "Se adaugă %s..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Faceți Funcția"
+msgstr "Adăugare funcție..."
#: modules/visual_script/visual_script_editor.cpp
msgid "function_name"
@@ -12059,6 +12042,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12077,9 +12064,34 @@ msgid "Invalid public key for APK expansion."
msgstr ""
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "Nume nevalid."
+msgstr "Nume pachet nevalid:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
#: platform/android/export/export.cpp
msgid ""
@@ -12122,9 +12134,8 @@ msgid "App Store Team ID not specified - cannot configure the project."
msgstr ""
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "Nume nevalid."
+msgstr "Identificator nevalid:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
@@ -12267,6 +12278,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12454,6 +12471,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12474,6 +12496,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12583,14 +12610,12 @@ msgid "In node '%s', invalid animation: '%s'."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "EROARE: Nume animație nevalid!"
+msgstr "Animație nevalidă: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Deconectați '%s' de la '%s'"
+msgstr "Nimic conectat la intrarea '%s' a nodului '%s'."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
@@ -12698,6 +12723,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
@@ -12726,6 +12755,41 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Sistemul De Fișiere și încărcare Bare"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Când exporți sau lansezi, executabilul rezultat va încerca să se "
+#~ "conecteze la IP-ul acestui computer pentru a putea fi depanat."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Scena curentă nu a fost salvată niciodată, salvați-o înainte de rulare."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Nu în calea de resurse."
+
+#~ msgid "Revert"
+#~ msgstr "Întoarcere"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Această acțiune nu poate fi recuperată. Te reîntorci oricum?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Restabilește Scena"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Agent de Monitorizare al Problemelor"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Înlocuit %d potriviri."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Creează un Corp Static Convex"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
index 9c56393ae8..2c85fe4e8c 100644
--- a/editor/translations/ru.po
+++ b/editor/translations/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.
+# ijet <my-ijet@mail.ru>, 2017-2018, 2020.
# Maxim Kim <habamax@gmail.com>, 2016.
# Maxim toby3d Lebedev <mail@toby3d.ru>, 2016.
# outbools <drag4e@yandex.ru>, 2017.
@@ -27,12 +27,12 @@
# Yan <uvokinuvokines@gmail.com>, 2018.
# V. <Unit68189@gmail.com>, 2018, 2019.
# Victor Butorin <mrwebsterchannel@gmail.com>, 2018.
-# Александр <ol-vin@mail.ru>, 2018, 2019.
+# Александр <ol-vin@mail.ru>, 2018, 2019, 2020.
# Анатолий Горбунов <afgorbunov@gmail.com>, 2018, 2019.
# Vadim Vergasov <vadim.vergasov2003@gmail.com>, 2018, 2019.
# Аслан Снупов <aslan170505@gmail.com>, 2018.
# Alexandr Eremeev <ae125529@gmail.com>, 2019.
-# Ruaguzov Michael <miha890r@gmail.com>, 2019.
+# Ruaguzov Michael <miha890r@gmail.com>, 2019, 2020.
# Alexander Danilov <modos189@protonmail.com>, 2019.
# Sergey Nakhov <true.stalin.exe@gmail.com>, 2019.
# Bumerang <it.bumerang@gmail.com>, 2019.
@@ -41,7 +41,7 @@
# Nikita <iron-nikita@yandex.ru>, 2019.
# LeLuCh B0й <alekx@alumni.nottingham.ac.uk>, 2019.
# Арсений Солодков <arsen332211@gmail.com>, 2019.
-# Nikita <yakrobat@protonmail.com>, 2019.
+# Nikita <yakrobat@protonmail.com>, 2019, 2020.
# LAT_Rio <AlSenya@yandex.ru>, 2019.
# devnp <dev.necropan@gmail.com>, 2019.
# Виктор <victor8632@bk.ru>, 2019.
@@ -53,7 +53,7 @@
# Sergey <www.window1@mail.ru>, 2019.
# Vladislav <onion.ring@mail.ru>, 2019, 2020.
# knightpp <kotteam99@gmail.com>, 2019.
-# Константин Рин <email.to.rean@gmail.com>, 2019.
+# Константин Рин <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.
@@ -62,11 +62,36 @@
# Rei <clxgamer12@gmail.com>, 2019.
# Vitaly <arkology11@gmail.com>, 2019.
# Andy <8ofproject@gmail.com>, 2020.
+# Андрей Беляков <andbelandantrus@gmail.com>, 2020.
+# Artur Tretiak <stikyt@protonmail.com>, 2020.
+# Smadjavul <o1985af@gmail.com>, 2020.
+# Vinsent Insaider_red <vinsent.in7aider@gmail.com>, 2020.
+# TMF <themysticalfox@mail.ru>, 2020.
+# Ivan Kuzmenko <kuzmenko.ivan2002@yandex.com>, 2020.
+# Super Pracion <superpracion2@gmail.com>, 2020.
+# PizzArt <7o7goo7o7@gmail.com>, 2020.
+# TheGracekale <mrsmailbot.lg@gmail.com>, 2020.
+# Климентий Титов <titoffklim@cclc.tech>, 2020.
+# Richard Urban <redasuio1@gmail.com>, 2020.
+# Nikita <Kulacnikita@ya.ru>, 2020.
+# Alexander <ramzi7208@gmail.com>, 2020.
+# Alex Tern <ternvein@gmail.com>, 2020.
+# Varion Drakon Neonovich <variondrakon@gmail.com>, 2020.
+# d2cyb <dmitrydpb@gmail.com>, 2020.
+# Алексей Смирнов <tir74@mail.ru>, 2020.
+# Calamander <Calamander@yandex.ru>, 2020.
+# Terminator <fresh-ter@yandex.com>, 2020.
+# Anatoly Kuznetsov <muffinnorth@yandex.ru>, 2020.
+# kyanukovich <ianu0001@algonquinlive.com>, 2020.
+# Ron788 <ustinov200511@gmail.com>, 2020.
+# Daniel <dan.ef1999@gmail.com>, 2020.
+# NeoLan Qu <it.bulla@mail.ru>, 2020.
+# Nikita Epifanov <nikgreens@protonmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
+"PO-Revision-Date: 2020-09-15 07:17+0000\n"
"Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ru/>\n"
@@ -76,16 +101,16 @@ 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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Неверный тип аргумента для convert(), используйте TYPE_* константы."
+msgstr "Неверный параметр типа для convert(), используйте константы TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "Ожидалась строка длиной 1 (символ)."
+msgstr "Ожидалась строка длиной 1 (т.е. символ)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -95,7 +120,7 @@ msgstr "Недостаточно байтов для декодирования
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Неправильный ввод %i (не был передан) в выражении"
+msgstr "Некорректный ввод %i (не подходит) в выражении"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -120,7 +145,7 @@ msgstr "Недопустимые аргументы для построения
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "На вызове '%s':"
+msgstr "При вызове '%s':"
#: core/ustring.cpp
msgid "B"
@@ -176,11 +201,11 @@ msgstr "Вставить ключ здесь"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "Дублировать выделенные ключ(и)"
+msgstr "Дублировать выделенные ключи"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "Удалить выделенные ключ(и)"
+msgstr "Удалить выделенные ключи"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
@@ -223,23 +248,20 @@ msgid "Anim Multi Change Keyframe Time"
msgstr "Время смены ключевых кадров анимации"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Анимация Многократное изменение Переход"
+msgstr "Многократное изменение перехода"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
msgstr "Анимационное многосменное преобразование"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Анимация многократное изменение ключевых кадров Значение"
+msgstr "Изменить значение ключевого кадра"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Call"
-msgstr "Анимационный многократный вызов изменения"
+msgstr "Изменить вызов анимации"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -284,7 +306,7 @@ msgstr "Продолжительность анимации (в секундах
#: editor/animation_track_editor.cpp
msgid "Add Track"
-msgstr "Добавить новый трек"
+msgstr "Добавить трек"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
@@ -305,28 +327,27 @@ msgstr "Дорожки анимации:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr "Изменить Путь Следования"
+msgstr "Изменить путь трека"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "Переключить этот трек вкл/выкл."
+msgstr "Включить/выключить этот трек."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr "Режим Обновления (Как это свойство устанавливается)"
+msgstr "Режим обновления (как это свойство устанавливается)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr "Режим Перехода"
+msgstr "Режим интерполяции"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
-"Режим Обработки Зацикливания (Переход заканчивается с началом нового цикла)"
+msgstr "Режим зацикливания (интерполировать начало и конец при зацикливании)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
-msgstr "Удалить этот трек."
+msgstr "Удалить эту дорожку."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
@@ -334,7 +355,7 @@ msgstr "Время (сек.): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr "Переключатель дорожки включен"
+msgstr "Включить/выключить дорожку"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -363,7 +384,7 @@ msgstr "Линейный"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr "Кубическая"
+msgstr "Кубический"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
@@ -388,11 +409,11 @@ msgstr "Удалить ключ(и)"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
-msgstr "Изменить способ обновления анимации"
+msgstr "Изменить режим обновления анимации"
#: editor/animation_track_editor.cpp
msgid "Change Animation Interpolation Mode"
-msgstr "Изменить метод интерполяции анимации"
+msgstr "Изменить способ интерполяции анимации"
#: editor/animation_track_editor.cpp
msgid "Change Animation Loop Mode"
@@ -452,7 +473,8 @@ msgstr "Переставить дорожки"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr "Трек трансформации применяется только к основанным на Spatial узлам."
+msgstr ""
+"Дорожка преобразования применяется только к основанным на Spatial узлам."
#: editor/animation_track_editor.cpp
msgid ""
@@ -461,14 +483,14 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
-"Aудио треки могут указывать только на узлы типа:\n"
+"Аудио дорожки могут указывать только на узлы типа:\n"
"-AudioStreamPlayer\n"
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr "Треки Анимации могут указывать только на узлы типа AnimationPlayer."
+msgstr "Дорожки анимации могут указывать только на узлы типа AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
@@ -476,12 +498,11 @@ msgstr "Проигрыватель анимации не может анимир
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr "Нельзя добавить новый трек без корневого узла"
+msgstr "Нельзя добавить новую дорожку без корневого узла"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr "Неверный трек для кривой Безье (нет подходящих подсвойств)"
+msgstr "Неверная дорожка для кривой Безье (нет подходящих подсвойств)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
@@ -489,11 +510,11 @@ msgstr "Добавить дорожку Безье"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr "Путь трека некорректен, потому нельзя добавить ключ."
+msgstr "Путь к дорожке некорректен, потому нельзя добавить ключ."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr "Трек не имеет тип Spatial, нельзя добавить ключ"
+msgstr "Дорожка не имеет тип Spatial, нельзя добавить ключ"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
@@ -505,11 +526,11 @@ msgstr "Добавить ключ дорожки"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr "Путь трека некорректен, потому нельзя добавить ключ метода."
+msgstr "Путь к дорожке некорректен, потому нельзя добавить ключ метода."
#: editor/animation_track_editor.cpp
msgid "Add Method Track Key"
-msgstr "Добавить ключ отслеживания метода"
+msgstr "Добавить ключ дорожки для метода"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
@@ -536,7 +557,7 @@ msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
"Эта опция не работает для редактирования кривыми Безье, так как это только "
-"один трек."
+"одна дорожка."
#: editor/animation_track_editor.cpp
msgid ""
@@ -551,14 +572,14 @@ msgid ""
"files."
msgstr ""
"Данная анимация принадлежит импортированной сцене, поэтому изменения, "
-"внесенные в импортированные треки, не будут сохранены.\n"
+"внесенные в импортированные дорожки, не будут сохранены.\n"
"\n"
-"Чтобы активировать возможность добавления пользовательских треков, перейдите "
-"к настройкам импорта сцены и установите\n"
+"Чтобы активировать возможность добавления пользовательских дорожек, "
+"перейдите к настройкам импорта сцены и установите\n"
"\"Анимация > Хранилище\" в значение \"Файлы\", а также включите пункт "
-"\"Анимация > Сохранять пользовательские треки\", и заново импортируйте "
+"\"Анимация > Сохранять пользовательские дорожки\", и заново импортируйте "
"сцену.\n"
-"В качестве альтернативы используйте пресет импорта, который импортирует "
+"В качестве альтернативы используйте шаблон импорта, который импортирует "
"анимации в отдельные файлы."
#: editor/animation_track_editor.cpp
@@ -571,11 +592,11 @@ msgstr "Выберите узел AnimationPlayer для создания и р
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr "Показывать треки только выделенных в дереве узлов."
+msgstr "Показывать дорожки только выделенных в дереве узлов."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr "Группировать треки по узлам или показывать их как простой список."
+msgstr "Группировать дорожки по узлам или показывать их как простой список."
#: editor/animation_track_editor.cpp
msgid "Snap:"
@@ -590,6 +611,7 @@ msgid "Seconds"
msgstr "Секунды"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -609,7 +631,7 @@ msgstr "Свойства анимации."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr "Копировать треки"
+msgstr "Копировать дорожки"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -625,7 +647,7 @@ msgstr "Дублировать выделенное"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "Дублировать и переместить"
+msgstr "Дублировать и транспонировать"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
@@ -749,8 +771,8 @@ msgid "Line Number:"
msgstr "Номер строки:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Заменено %d совпадений."
+msgid "%d replaced."
+msgstr "%d заменено."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -768,7 +790,7 @@ msgstr "Учитывать регистр"
msgid "Whole Words"
msgstr "Целые слова"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Заменить"
@@ -815,7 +837,11 @@ msgstr "Номера строк и столбцов."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr "Метод должен быть указан в целевом узле."
+msgstr "Метод в целевом узле должен быть указан."
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Имя не является допустимым идентификатором."
#: editor/connections_dialog.cpp
msgid ""
@@ -827,7 +853,7 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Connect to Node:"
-msgstr "Присоединить к узлу:"
+msgstr "Присоединить к Узлу:"
#: editor/connections_dialog.cpp
msgid "Connect to Script:"
@@ -839,7 +865,7 @@ msgstr "От сигнала:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr "Узел не содержит скрипт."
+msgstr "Сцена не содержит каких-либо скриптов."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -860,7 +886,7 @@ msgstr "Удалить"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "Добавить дополнительный параметр вызова:"
+msgstr "Добавить дополнительный аргумент вызова:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
@@ -901,7 +927,6 @@ msgstr "Не удается подключить сигнал"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -947,7 +972,7 @@ msgstr "Подключить сигнал к методу"
#: editor/connections_dialog.cpp
msgid "Edit Connection:"
-msgstr "Редактировать подключение:"
+msgstr "Редактировать соединение:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
@@ -958,6 +983,11 @@ msgid "Signals"
msgstr "Сигналы"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Фильтр тайлов"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Вы уверены, что хотите удалить все подключения от сигнала?"
@@ -995,7 +1025,7 @@ msgid "Recent:"
msgstr "Недавнее:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Поиск:"
@@ -1084,7 +1114,7 @@ msgstr "Владельцы:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "Удалить выбранные файлы из проекта? (Нельзя отменить!)"
+msgstr "Удалить выбранные файлы из проекта? (Нельзя восстановить)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1175,6 +1205,9 @@ msgstr "Основатели Проекта"
msgid "Lead Developer"
msgstr "Ведущий разработчик"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Менеджер проектов "
@@ -1196,6 +1229,14 @@ msgid "Gold Sponsors"
msgstr "Золотые спонсоры"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Серебряные спонсоры"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Бронзовые спонсоры"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Мини спонсоры"
@@ -1503,7 +1544,7 @@ msgstr "Переместить автозагрузку"
msgid "Remove Autoload"
msgstr "Удалить автозагрузку"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Включить"
@@ -1511,17 +1552,9 @@ msgstr "Включить"
msgid "Rearrange Autoloads"
msgstr "Перестановка автозагрузок"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Недопустимый путь."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Файл не существует."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Не в пути ресурсов."
+msgid "Can't add autoload:"
+msgstr "Не удаётся добавить автозагрузку:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1548,6 +1581,10 @@ msgstr "Название"
msgid "Singleton"
msgstr "Синглтон"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Вставить параметры"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Обновление сцены"
@@ -1675,16 +1712,17 @@ msgid "Scene Tree Editing"
msgstr "Редактирование дерева сцены"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Панель «Импорт»"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Панель «Узел»"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Панели «Файловая система» и «Импорт»"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Файловая система"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Панель «Импорт»"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1835,7 +1873,7 @@ msgstr "Просмотреть в проводнике"
msgid "New Folder..."
msgstr "Новая папка..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Обновить"
@@ -1881,35 +1919,35 @@ msgstr "Назад"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr "Вперёд"
+msgstr "Перейти вперёд"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr "Вверх"
+msgstr "Подняться"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "Скрыть файлы"
+msgstr "Переключение скрытых файлов"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "Переключить избранное"
+msgstr "Избранное"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr "Переключить режим отображения"
+msgstr "Режим отображения"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "Фокус на пути"
+msgstr "Переместить фокус на строку пути"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "Переместить избранное вверх"
+msgstr "Поднять избранное"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "Переместить избранное вниз"
+msgstr "Опустить избранное"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
@@ -1929,7 +1967,7 @@ msgstr "Обновить файлы."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr "Добавить или удалить текущую папку из избранных."
+msgstr "Добавить/убрать текущую папку в избранное."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
@@ -1949,7 +1987,7 @@ msgstr "Каталоги и файлы:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Предпросмотр:"
@@ -2007,14 +2045,12 @@ msgid "Properties"
msgstr "Свойства"
#: editor/editor_help.cpp
-#, fuzzy
msgid "override:"
-msgstr "Переопределить"
+msgstr "Переопределить:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "По умолчанию"
+msgstr "По умолчанию:"
#: editor/editor_help.cpp
msgid "Methods"
@@ -2034,12 +2070,11 @@ msgstr "Константы"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr "Описание свойств"
+msgstr "Описания свойств"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Значение"
+msgstr "(значение)"
#: editor/editor_help.cpp
msgid ""
@@ -2051,7 +2086,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Описание методов"
+msgstr "Описания методов"
#: editor/editor_help.cpp
msgid ""
@@ -2391,10 +2426,6 @@ msgid "There is no defined scene to run."
msgstr "Нет открытой сцены для запуска."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Текущая сцена никогда не была сохранена, сохраните её перед запуском."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Не удаётся запустить подпроцесс!"
@@ -2479,12 +2510,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Не возможно загрузить сцену, которая не была сохранена."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Восстановить"
+msgid "Reload Saved Scene"
+msgstr "Перезагрузить сохраненную сцену"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Это действие нельзя отменить. Восстановить в любом случае?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Текущая сцена имеет несохраненные изменения. \n"
+"Всё равно перезагрузить сцену? Это действие нельзя отменить."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2533,7 +2568,7 @@ msgstr "Закрыть сцену"
#: editor/editor_node.cpp
msgid "Reopen Closed Scene"
-msgstr "Открыть ранее закрытую сцену"
+msgstr "Открыть закрытую сцену"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2770,10 +2805,6 @@ msgid "Redo"
msgstr "Повторить"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Восстановить сцену"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Прочие инструменты."
@@ -2820,7 +2851,7 @@ msgstr "Обзор ресурсов-сирот..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "Выйти в список проектов"
+msgstr "Выйти к списку проектов"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -2833,39 +2864,44 @@ msgstr "Развернуть с удалённой отладкой"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"При экспорте или развёртывании, полученный исполняемый файл будет пытаться "
-"подключиться к IP этого компьютера с целью отладки."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Небольшое развёртывание через сеть"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Когда эта опция включена, экспорт или развёртывание будет создавать "
"минимальный исполняемый файл.\n"
"Файловая система проекта будет предоставляться редактором через сеть.\n"
-"На Android развёртывание будет быстрее при подключении через USB.\n"
-"Эта опция ускоряет тестирование больших проектов."
+"На Android развёртывание будет быстрее при подключении через USB. Эта опция "
+"ускоряет тестирование игр с большим объемом памяти."
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
msgstr "Видимые области соприкосновения"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Когда эта опция включена, области соприкосновений и узлы Raycast(в 2D и 3D) "
"будут видимыми в запущенной игре."
@@ -2875,23 +2911,26 @@ msgid "Visible Navigation"
msgstr "Видимая навигация"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Когда эта опция включена, навигационные полисетки и полигоны будут видимыми "
"в запущенной игре."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Синхронизация изменений в сцене"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Когда эта опция включена, все изменения, внесённые на сцену, в редакторе "
"будут перенесены в запущенную игру.\n"
@@ -2899,15 +2938,17 @@ msgstr ""
"сетевой файловой системой."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Синхронизация изменений в скриптах"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Когда эта опция включена, любой сохранённый скрипт будет перезагружен в "
"запущенную игру.\n"
@@ -2928,7 +2969,7 @@ msgstr "Макет редактора"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr "Сделать снимок экрана"
+msgstr "Сделать скриншот"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
@@ -2936,7 +2977,7 @@ msgstr "Снимки экрана хранятся в папке данных/н
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Переключить полноэкранный режим"
+msgstr "Включить полноэкранный режим"
#: editor/editor_node.cpp
msgid "Toggle System Console"
@@ -2971,7 +3012,7 @@ msgstr "Справка"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Поиск"
@@ -2985,8 +3026,12 @@ msgid "Q&A"
msgstr "Вопросы и ответы"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Система отслеживания ошибок"
+msgid "Report a Bug"
+msgstr "Сообщить об ошибке"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Отправить отзыв о документации"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2994,7 +3039,7 @@ msgstr "Сообщество"
#: editor/editor_node.cpp
msgid "About"
-msgstr "О движке"
+msgstr "О Godot Engine"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -3002,7 +3047,7 @@ msgstr "Запустить проект."
#: editor/editor_node.cpp
msgid "Play"
-msgstr "Воспроизвести"
+msgstr "Запустить"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
@@ -3067,7 +3112,7 @@ msgstr "Инспектор"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Развернуть нижнюю панель"
+msgstr "Расширить боковую панель"
#: editor/editor_node.cpp
msgid "Output"
@@ -3151,11 +3196,11 @@ msgstr "Выделение"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "Открыть 2D редактор"
+msgstr "Открыть 2D-редактор"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr "Открыть 3D редактор"
+msgstr "Открыть 3D-редактор"
#: editor/editor_node.cpp
msgid "Open Script Editor"
@@ -3175,7 +3220,7 @@ msgstr "Открыть предыдущий редактор"
#: editor/editor_node.h
msgid "Warning!"
-msgstr "Внимание!"
+msgstr "Предупреждение!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
@@ -3284,11 +3329,11 @@ msgstr "[Пусто]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr "Назначается..."
+msgstr "Устанавливать.."
#: editor/editor_properties.cpp
msgid "Invalid RID"
-msgstr "Неверный путь"
+msgstr "Неверный RID"
#: editor/editor_properties.cpp
msgid ""
@@ -3386,9 +3431,11 @@ msgid "Add Key/Value Pair"
msgstr "Добавить пару: Ключ/Значение"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Не найден рабочий экспортер для этой платформы.\n"
"Пожалуйста, добавьте его в меню экспорта."
@@ -3403,7 +3450,7 @@ msgstr "Уже существует отредактированная сцен
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
-msgstr "Скрипт не соответствует требованиям:"
+msgstr "Не удалось создать экземпляр скрипта:"
#: editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
@@ -3417,6 +3464,12 @@ msgstr "Невозможно запустить скрипт:"
msgid "Did you forget the '_run' method?"
msgstr "Быть может вы забыли метод _run()?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Зажмите Ctrl, чтобы округлить до целых. Зажмите Shift для более точных "
+"изменений."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Выберите узлы для импорта"
@@ -3480,7 +3533,7 @@ msgstr "Неверный формат version.txt файла внутри шаб
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr "Не найден version.txt файл в шаблонах."
+msgstr "Файл version.txt не найден в шаблонах."
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
@@ -4012,10 +4065,18 @@ msgid "Error running post-import script:"
msgstr "Ошибка запуска пост-импорт скрипта:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "Вы вернули производный от Node объект в методе `post_import ()`?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Сохранение..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d файлов"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Установить по умолчанию для '%s'"
@@ -4024,10 +4085,6 @@ msgid "Clear Default for '%s'"
msgstr "Очистить по умолчанию для '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Файлы"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Импортировать как:"
@@ -4040,8 +4097,8 @@ msgid "Reimport"
msgstr "Переимпортировать"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "Сохранить сцены, импортировать заново и перезапустить"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Сохранить сцены, переимпортировать и перезапустить"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -4076,10 +4133,6 @@ msgid "Copy Params"
msgstr "Копировать параметры"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Вставить параметры"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Редактировать ресурс в буфере обмена"
@@ -4231,7 +4284,7 @@ msgstr "Загрузка..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Move Node Point"
-msgstr "Передвинуть узел"
+msgstr "Передвинуть точку узла"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Limits"
@@ -4686,7 +4739,7 @@ msgstr "Переместить узел"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition exists!"
-msgstr "Переход уже существует!"
+msgstr "Переход существует!"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Add Transition"
@@ -5147,7 +5200,7 @@ msgid "Bake Lightmaps"
msgstr "Запекать карты освещения"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Предпросмотр"
@@ -5243,13 +5296,15 @@ msgstr "Якоря и отступы дочерних контейнеров п
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Presets for the anchors and margins values of a Control node."
-msgstr "Предустановки для якорей и значения отступов контрольного узла."
+msgstr "Пресеты значений для якорей и отступов узла Control."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
-msgstr "При активном движении узлы Control меняют свои якоря вместо полей."
+msgstr ""
+"Когда активно, у перемещаемых узлов Control будут изменяться значения якорей "
+"вместо отступов."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Left"
@@ -5438,7 +5493,7 @@ msgstr "Режим перемещения"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Режим поворота"
+msgstr "Режим вращения"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5464,7 +5519,7 @@ msgstr "Режим осмотра"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Ruler Mode"
-msgstr "Режим линейки"
+msgstr "Режим измерения"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
@@ -5578,11 +5633,11 @@ msgstr "Обзор"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
-msgstr "Всегда показывать сетку"
+msgstr "Всегда отображать сетку"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
-msgstr "Показывать помощники"
+msgstr "Показывать помощников"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Rulers"
@@ -5590,7 +5645,7 @@ msgstr "Показывать линейки"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Guides"
-msgstr "Показывать направляющие"
+msgstr "Отображение направляющих"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Origin"
@@ -5613,13 +5668,12 @@ msgid "Frame Selection"
msgstr "Кадрировать выбранное"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Preview Canvas Scale"
-msgstr "Предпросмотр масштаба холста"
+msgstr "Просмотреть Canvas Scale"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
-msgstr "Маска перемещения для добавляемых ключей."
+msgstr "Маска трансформации для вставки ключей."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
@@ -5651,13 +5705,12 @@ msgid "Auto Insert Key"
msgstr "Автовставка ключа"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Ключ анимации вставлен."
+msgstr "Опции анимационных ключей и поз"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr "Вставить ключ (существующие треки)"
+msgstr "Вставить ключ (существующие дорожки)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -5676,9 +5729,8 @@ msgid "Divide grid step by 2"
msgstr "Разделить шаг сетки на 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Pan View"
-msgstr "Вид сзади"
+msgstr "Панорамировать вид"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -5765,20 +5817,18 @@ msgstr "Маска излучения"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Solid Pixels"
-msgstr "Твёрдые пиксели"
+msgstr "Залитые пиксели"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Border Pixels"
-msgstr ""
+msgstr "Граничные пиксели"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "Направленные граничные пиксели"
+msgstr "Направленные пограничные пиксели"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5901,29 +5951,45 @@ msgid "Mesh is empty!"
msgstr "Полисетка пуста!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Создать вогнутое статичное тело"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Невозможно создать треугольную сетку для формы столкновений."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Создать выпуклое статичное тело"
+msgid "Create Static Trimesh Body"
+msgstr "Создать вогнутое статичное тело"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
msgstr "Это не работает на корне сцены!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Trimesh Static Shape"
-msgstr "Создать вогнутую форму"
+msgstr "Создать сетку статической формы"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Нельзя создать единую выпуклую форму столкновения для корня сцены."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Не удалось создать ни одной выпуклой формы столкновения."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Создать одну выпуклую форму"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+"Невозможно создать несколько выпуклых форм столкновения для корня сцены."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Не удалось создать форму!"
+msgid "Couldn't create any collision shapes."
+msgstr "Не удалось создать ни одну форму столкновения."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Создать выпуклую форму(ы)"
+msgid "Create Multiple Convex Shapes"
+msgstr "Создать нескольких выпуклых фигур"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5967,26 +6033,75 @@ msgstr "Создать контур"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
-msgstr "Массив"
+msgstr "Меш"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Body"
msgstr "Создать вогнутое статичное тело"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Создает StaticBody и автоматически присваивает ему форму столкновения на "
+"основе полигона.\n"
+"Это самый точный (но самый медленный) способ обнаружения столкновений."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Создать вогнутую область столкновения"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Создает форму столкновения на основе полигона.\n"
+"Это самый точный (но самый медленный) способ обнаружения столкновений."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Создать одну выпуклую область столкновения"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Создаёт выпуклую форму столкновения.\n"
+"Это самый быстрый (но наименее точный) способ обнаружения столкновений."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Создать выпуклую область столкновения"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Создает форму столкновения на основе полигона.\n"
+"Это средний по производительности вариант между двумя предыдущими."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Создать полисетку обводки..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Создать статичную контурную полисетку. Контурная полисетка будет иметь свои "
+"нормали, перевернутые автоматически.\n"
+"Можно использовать вместо свойства Grow в SpatialMaterial, в случае когда "
+"оно не применимо."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Просмотр UV1"
@@ -6167,7 +6282,6 @@ msgid "The geometry's faces don't contain any area."
msgstr "Грани данной геометрии не содержат никакой области."
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "The geometry doesn't contain any faces."
msgstr "Данная геометрия не содержит граней."
@@ -6609,7 +6723,7 @@ msgstr "AnimationTree - не задан путь к AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "Path to AnimationPlayer is invalid"
-msgstr "Путь к AnimationPlayer недействительный"
+msgstr "Путь к AnimationPlayer недействительный"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -6706,7 +6820,7 @@ msgstr "Найти следующее"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
-msgstr "Найти предыдущее"
+msgstr "Найти предыдущий"
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter scripts"
@@ -6728,13 +6842,13 @@ msgstr "Сортировать"
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Up"
-msgstr "Переместить вверх"
+msgstr "Двигаться вверх"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr "Переместить вниз"
+msgstr "Двигаться вниз"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
@@ -6754,7 +6868,7 @@ msgstr "Открыть..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reopen Closed Script"
-msgstr "Открыть ранее закрытый скрипт"
+msgstr "Переоткрыть закрытый скрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -6762,7 +6876,7 @@ msgstr "Сохранить всё"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "Мягко перезагрузить скрипт"
+msgstr "Мягкая перезагрузка скрипта"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
@@ -6835,14 +6949,6 @@ msgid "Open Godot online documentation."
msgstr "Открыть онлайн-документацию Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Проблема"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Помогите улучшить документацию Godot, оставьте сообщение об ошибке."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Поиск справочной документации."
@@ -6908,12 +7014,12 @@ msgstr ""
"'%s'."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Строка"
+msgid "[Ignore]"
+msgstr "(игнорировать)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(игнорировать)"
+msgid "Line"
+msgstr "Строка"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6951,7 +7057,7 @@ msgstr "нижний регистр"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "Прописные"
+msgstr "Заглавная буква"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
@@ -6979,7 +7085,7 @@ msgstr "Вырезать"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Select All"
-msgstr "Выбрать все"
+msgstr "Выделить всё"
#: editor/plugins/script_text_editor.cpp
msgid "Delete Line"
@@ -7011,11 +7117,11 @@ msgstr "Развернуть все строки"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr "Копировать вниз"
+msgstr "Продублировать вниз"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr "Список автозавершения"
+msgstr "Завершить символ"
#: editor/plugins/script_text_editor.cpp
msgid "Evaluate Selection"
@@ -7023,7 +7129,7 @@ msgstr "Вычислить выделенное"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "Удаление пробелов в конце строк"
+msgstr "Обрезать замыкающие пробелы"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
@@ -7031,11 +7137,11 @@ msgstr "Преобразовать отступ в пробелы"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Tabs"
-msgstr "Преобразовать отступ в табуляцию"
+msgstr "Преобразовать отступы в табуляторы"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "Автоотступ"
+msgstr "Авто-отступ"
#: editor/plugins/script_text_editor.cpp
msgid "Find in Files..."
@@ -7051,11 +7157,11 @@ msgstr "Переключить закладку"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Bookmark"
-msgstr "Перейти к следующей закладке"
+msgstr "Переход к следующей закладке"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Bookmark"
-msgstr "Перейти к предыдущей закладке"
+msgstr "Переход к предыдущей закладке"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Bookmarks"
@@ -7076,11 +7182,11 @@ msgstr "Точка остановки"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Удалить все точки остановок"
+msgstr "Удалить все точки останова"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Breakpoint"
-msgstr "Перейти к следующей точке остановки"
+msgstr "Переход к следующей точке останова"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Breakpoint"
@@ -7264,11 +7370,11 @@ msgstr "Зад"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "Выравнять преобразование с областью просмотра"
+msgstr "Выровнять трансформации с видом"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
-msgstr "Выравнять поворот с областью просмотра"
+msgstr "Совместить поворот с направлением взгляда"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -7279,12 +7385,16 @@ msgid "This operation requires a single selected node."
msgstr "Эта операция требует одного выбранного узла."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Ортогональный"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Блокировать вращение камеры"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
-msgstr "Режим нормалей"
+msgstr "Нормальный режим"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Wireframe"
@@ -7336,11 +7446,11 @@ msgstr "Недоступно при использовании рендерер
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr "Обзор налево"
+msgstr "Свободный вид, лево"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr "Обзор направо"
+msgstr "Свободный вид, право"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
@@ -7348,23 +7458,27 @@ msgstr "Обзор вперёд"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Обзор назад"
+msgstr "Свободный вид, назад"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "Обзор вверх"
+msgstr "Свободный вид, вверх"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "Обзор вниз"
+msgstr "Свободный вид, вниз"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
-msgstr "Обзор модификатор скорости"
+msgstr "Модификатор скорости свободного вида"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Slow Modifier"
-msgstr "Медленный модификатор свободного просмотра"
+msgstr "Модификатор замедления свободного вида"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Блокировать вращение камеры"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7376,14 +7490,25 @@ msgstr ""
"игры."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Блокировать вращение камеры"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm диалоговое окно"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Нажмите для переключения между состояниями видимости.\n"
+"\n"
+"Открытый глаз: Гизмо видно.\n"
+"Закрытый глаз: Гизмо скрыто.\n"
+"Полуоткрытый глаз: Гизмо также видно сквозь непрозрачные поверхности "
+"(«рентген»)."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Привязать узлы к полу"
@@ -7407,7 +7532,7 @@ msgstr "Использовать локальное пространство"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "Использовать привязку"
+msgstr "Использовать привязки"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7435,7 +7560,7 @@ msgstr "Вид справа"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr "Переключить перспективный/ортогональный вид"
+msgstr "Переключение перспективного/ортогонального вида"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
@@ -7443,7 +7568,7 @@ msgstr "Вставить ключ анимации"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr "Фокус на центре"
+msgstr "Сфокусироваться на начале координат"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
@@ -7451,7 +7576,7 @@ msgstr "Показать выбранное"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
-msgstr "Переключить свободный обзор"
+msgstr "Включить свободный вид"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7460,7 +7585,7 @@ msgstr "Преобразование"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
-msgstr "Привязать объект к полу"
+msgstr "Привязка объекта к полу"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -7597,7 +7722,7 @@ msgstr "Предпросмотр CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D"
-msgstr "Создан LightOccluder2D"
+msgstr "Создать LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "LightOccluder2D Preview"
@@ -7614,7 +7739,7 @@ msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr "Некорректная геометрия, не может быть заменена сеткой."
+msgstr "Недопустимая геометрия, не может быть заменена полисеткой."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Mesh2D"
@@ -7722,7 +7847,8 @@ msgid "New Animation"
msgstr "Новая анимация"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Скорость (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8014,7 +8140,7 @@ msgstr "Очистить карту тайлов"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Find Tile"
-msgstr "Найти плитку"
+msgstr "Найти тайл"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -8038,7 +8164,7 @@ msgstr "Задайте TileSet ресурс этому Tilemap чтобы исп
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Рисовать тайл"
+msgstr "Покрасить тайл"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
@@ -8062,11 +8188,11 @@ msgstr "Повернуть вправо"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
-msgstr "Отразить по горизонтали"
+msgstr "Перевернуть по горизонтали"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Vertically"
-msgstr "Отразить по вертикали"
+msgstr "Перевернуть по вертикали"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Clear Transform"
@@ -8082,11 +8208,11 @@ msgstr "Удалить выбранную текстуру из TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
-msgstr "Создать из сцены"
+msgstr "Создать из Сцены"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
-msgstr "Слияние из сцены"
+msgstr "Слияние из Сцены"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
@@ -8371,14 +8497,12 @@ msgid "Edit Tile Z Index"
msgstr "Редактирование Z индекса плитки"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Convex"
-msgstr "Сделать Convex"
+msgstr "Сделать выпуклым"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
-msgstr "Сделать Concave"
+msgstr "Сделать вогнутым"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Collision Polygon"
@@ -8400,7 +8524,7 @@ msgstr "Набор тайлов"
msgid "No VCS addons are available."
msgstr "Нет доступных VCS плагинов."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Ошибка"
@@ -8453,9 +8577,8 @@ msgid "Deleted"
msgstr "Удалён"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Typechange"
-msgstr "Изменить"
+msgstr "Изменить тип"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage Selected"
@@ -8520,7 +8643,7 @@ msgstr "Добавить входной порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr "Добавить выходной порт"
+msgstr "Добавить исходящий порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Change input port type"
@@ -8601,7 +8724,7 @@ msgstr "Показать полученный код шейдера."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
-msgstr "Создать узел шейдера"
+msgstr "Создать Шейдерный узел"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color function."
@@ -8644,7 +8767,6 @@ msgid "Dodge operator."
msgstr "Оператор выцветания."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "HardLight operator."
msgstr "Оператор жёсткого света."
@@ -8863,7 +8985,7 @@ msgstr "Возвращает обратный гиперболический т
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr "Вычисляет ближайшее целое число, большее или равное аргументу."
+msgstr "Находит ближайшее целое, которое больше или равно параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
@@ -8871,11 +8993,11 @@ msgstr "Удерживает значение в пределах двух др
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr "Возвращает косинус аргумента."
+msgstr "Возвращает косинус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr "Возвращает гиперболический косинус аргумента."
+msgstr "Возвращает гиперболический косинус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
@@ -8891,7 +9013,7 @@ msgstr "Экспонента с основанием 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr "Вычисляет ближайшее целое, меньшее или равное аргументу."
+msgstr "Находит ближайшее целое, меньшее или равное аргументу."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
@@ -8899,7 +9021,7 @@ msgstr "Вычисляет дробную часть аргумента."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr "Возвращает обратный корень из аргумента."
+msgstr "Возвращает обратный квадратный корень из аргумента."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
@@ -8944,11 +9066,11 @@ msgstr "1.0 / скаляр"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr "Вычисляет ближайшее целое число."
+msgstr "Находит ближайшее к параметру целое число."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr "Вычисляет ближайшее чётное число."
+msgstr "Находит ближайшее чётное число к параметру."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
@@ -9043,19 +9165,16 @@ msgid "Perform the texture lookup."
msgstr "Выполняет поиск текстуры."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Cubic texture uniform lookup."
-msgstr "Изменить текстурную единицу"
+msgstr "Поиск кубической текстуры."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup."
-msgstr "Изменить текстурную единицу"
+msgstr "Равномерный поиск 2D-текстур."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "2D texture uniform lookup with triplanar."
-msgstr "Изменить текстурную единицу"
+msgstr "Равномерный поиск 2d текстуры с трипланаром."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform function."
@@ -9165,9 +9284,8 @@ msgid "Linear interpolation between two vectors."
msgstr "Линейная интерполяция между двумя векторами."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Linear interpolation between two vectors using scalar."
-msgstr "Линейная интерполяция между двумя векторами."
+msgstr "Линейная интерполяция между двумя векторами используя скаляр."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
@@ -9263,7 +9381,7 @@ msgstr "Вычитает вектор из вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
-msgstr "Векторную константа."
+msgstr "Векторная константа."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector uniform."
@@ -9288,17 +9406,16 @@ msgstr ""
"направления обзора камеры (пропустите соответствующие входы к ней)."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"Custom Godot Shader Language expression, which is placed on top of the "
"resulted shader. You can place various function definitions inside and call "
"it later in the Expressions. You can also declare varyings, uniforms and "
"constants."
msgstr ""
-"Пользовательское выражение языка шейдеров Godot, которое помещается поверх "
-"шейдера. Вы можете разместить внутри различные объявления функций и вызвать "
-"их позже в Выражениях. Вы также можете объявить varyings, uniforms и "
-"константы."
+"Пользовательское выражение на языке шейдеров Godot, которое помещается "
+"поверх шейдера. Вы можете разместить внутри различные объявления функций и "
+"вызвать их позже в Выражениях. Вы также можете объявить переменные типа "
+"varying, uniform и константы."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
@@ -9497,7 +9614,7 @@ msgstr "Файл пакета"
#: editor/project_export.cpp
msgid "Features"
-msgstr "Свойства"
+msgstr "Возможности"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
@@ -9534,7 +9651,7 @@ msgstr ""
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
-msgstr "Ключ шифрования скрипта (256-бит, а в шестнадцатеричном виде):"
+msgstr "Ключ шифрования скрипта (256-бит, в шестнадцатеричном виде):"
#: editor/project_export.cpp
msgid "Export PCK/Zip"
@@ -9573,25 +9690,30 @@ msgid "Export With Debug"
msgstr "Экспорт в режиме отладки"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Путь не существует."
+msgid "The path specified doesn't exist."
+msgstr "Указанный путь не существует."
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Ошибка при открытии файла пакета (Не является ZIP форматом)."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
-"Недействительный '.zip' файл проекта, не содержит файл 'project.godot'."
+"Недействительный \".zip\" файл проекта; не содержит файл \"project.godot\"."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Пожалуйста, выберите пустую папку."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Пожалуйста, выберите файл 'project.godot' или '.zip'."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Пожалуйста, выберите файл \"project.godot\" или \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "Каталог уже содержит проект Godot."
+msgid "This directory already contains a Godot project."
+msgstr "Этот каталог уже содержит проект Godot."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9693,7 +9815,7 @@ msgid ""
"Not recommended for web games"
msgstr ""
"Более высокое качество графики\n"
-"Все функции доступны\n"
+"Доступны все функции\n"
"Несовместимо со старым оборудованием\n"
"Не рекомендуется для веб-игр"
@@ -9850,6 +9972,7 @@ msgstr ""
"Вы действительно хотите поискать существующие проекты Godot в %s папках?\n"
"Это может занять много времени."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Менеджер проектов"
@@ -9898,6 +10021,16 @@ msgstr ""
"В настоящее время у вас нет никаких проектов.\n"
"Хотите изучить официальные примеры в Библиотеке ресурсов?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Поле поиска фильтрует проекты по имени и последнему компоненту пути\n"
+"Чтобы отфильтровать проекты по имени и полному пути, запрос должен содержать "
+"хотя бы один символ `/`."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Клавиша "
@@ -10079,9 +10212,8 @@ msgid "Settings saved OK."
msgstr "Настройки сохранены нормально."
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Moved Input Action Event"
-msgstr "Добавить действие"
+msgstr "Перенесите событие ввода действия"
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
@@ -10277,17 +10409,28 @@ msgstr "Выбрать метод"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
msgid "Batch Rename"
-msgstr "Пакетное переименование"
+msgstr "Групповое переименование"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Replace:"
+msgstr "Заменить: "
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Prefix:"
msgstr "Префикс"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Суффикс"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Использовать регулярные выражения"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Дополнительные параметры"
@@ -10324,11 +10467,12 @@ msgstr ""
"Сравните параметры счетчика."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr "Счетчик уровня"
+msgid "Per-level Counter"
+msgstr "Счетчик для каждого уровня"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
"Если установить, счетчик перезапустится для каждой группы дочерних узлов"
@@ -10358,10 +10502,6 @@ msgstr ""
"Недостающие цифры заполняются нулями."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Регулярное выражение"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Пост-обработка"
@@ -10370,12 +10510,12 @@ msgid "Keep"
msgstr "Оставить оригинал"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr "CamelCase в under_scored"
+msgid "PascalCase to snake_case"
+msgstr "ВерблюжийРегистр в змеиный_регистр"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr "under_scored к CamelCase"
+msgid "snake_case to PascalCase"
+msgstr "змеиный_регистр в ВерблюжийРегистр"
#: editor/rename_dialog.cpp
msgid "Case"
@@ -10393,6 +10533,15 @@ msgstr "В верхний регистр"
msgid "Reset"
msgstr "Сбросить"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Ошибка в регулярном выражении"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "На символе %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Переподчинить узел"
@@ -10458,8 +10607,8 @@ msgid "Instance Child Scene"
msgstr "Добавить дочернюю сцену"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Убрать скрипт"
+msgid "Detach Script"
+msgstr "Открепить скрипт"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10496,6 +10645,10 @@ msgid "Make node as Root"
msgstr "Сделать узел корневым"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Удалить узел «%d» и его дочерние элементы?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Удалить %d узлов?"
@@ -10625,6 +10778,16 @@ msgid "Open Documentation"
msgstr "Открыть документацию"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Невозможно прикрепить скрипт: нет зарегистрированных языков.\n"
+"Вероятно, это связано с тем, что этот редактор был построен с отключенными "
+"всеми языковыми модулями."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Добавить дочерний узел"
@@ -10654,7 +10817,7 @@ msgstr "Сохранить ветку, как сцену"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr "Копировать путь"
+msgstr "Копировать путь ноды"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
@@ -10673,11 +10836,11 @@ msgstr ""
"не существует."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr "Прикрепить новый или существующий скрипт к выбранному узлу."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr "Убрать скрипт у выбранного узла."
#: editor/scene_tree_dock.cpp
@@ -10809,6 +10972,10 @@ msgid "A directory with the same name exists."
msgstr "Каталог с таким же именем существует."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Файл не существует."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Недопустимое расширение."
@@ -10849,6 +11016,10 @@ msgid "File exists, it will be reused."
msgstr "Файл существует, будет использован повторно."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Недопустимый путь."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Недопустимое имя класса."
@@ -10857,8 +11028,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Неверное имя или путь наследуемого предка."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Скрипт корректен."
+msgid "Script path/name is valid."
+msgstr "Путь/имя скрипта допустимы."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10881,6 +11052,14 @@ msgid "Script file already exists."
msgstr "Файл скрипта уже существует."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Примечание: встроенные скрипты имеют несколько ограничений и не могут быть "
+"редактированы через внешний редактор."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Имя класса:"
@@ -10949,6 +11128,10 @@ msgid "Copy Error"
msgstr "Копировать ошибку"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Видеопамять"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Пропустить точки останова"
@@ -10998,8 +11181,8 @@ msgid "Total:"
msgstr "Всего:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Видео память"
+msgid "Export list to a CSV file"
+msgstr "Экспортировать профиль в CSV файл"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11263,9 +11446,8 @@ msgid "GridMap Fill Selection"
msgstr "Залить выделенную GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "Вставить выделенную сетку"
+msgstr "Вставка выделенной сетки"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Paint"
@@ -11332,9 +11514,8 @@ msgid "Cursor Clear Rotation"
msgstr "Курсор очистить поворот"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "Очистить выделенное"
+msgstr "Вставить выделение"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
@@ -11668,7 +11849,7 @@ msgstr "Изменить размер комментария"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr "Не удаётся скопировать узел функцию."
+msgstr "Не удаётся копировать узел функции."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
@@ -11720,7 +11901,6 @@ msgid "Editing Signal:"
msgstr "Редактирование сигнала:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Tool:"
msgstr "Сделать инструментом:"
@@ -11754,7 +11934,7 @@ msgstr "Удалить выделенное"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
-msgstr "Найти тип узла"
+msgstr "Найти тип нода"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
@@ -11770,7 +11950,7 @@ msgstr "Сделать функцию"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "Обновить граф"
+msgstr "Обновить график"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
@@ -11884,10 +12064,15 @@ msgstr "OpenJDK jarsigner не настроен в Настройках Реда
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
-"Отладочная клавиатура не настроена ни в настройках редактора, ни в "
+"Отладочное хранилище ключей не настроено ни в настройках редактора, ни в "
"предустановках."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Хранилище ключей не настроено ни в настройках редактора, ни в предустановках."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Пользовательская сборка требует наличия правильного пути к Android SDK в "
@@ -11916,6 +12101,40 @@ msgstr "Недопустимое имя пакета:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Недопустимый модуль «GodotPaymentV3», включенный в настройку проекта "
+"«android/modules» (изменен в Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "«Use Custom Build» должен быть включен для использования плагинов."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"«Степени свободы» действительны только тогда, когда «Xr Mode» - это «Oculus "
+"Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"«Отслеживание рук» действует только тогда, когда «Xr Mode» - это «Oculus "
+"Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"«Осведомленность о фокусе» действительна только в том случае, если «Режим "
+"Xr» - это «Oculus Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11948,7 +12167,6 @@ msgstr ""
"Android."
#: platform/android/export/export.cpp
-#, fuzzy
msgid "No build apk generated at: "
msgstr "Нет сборки apk в: "
@@ -12121,6 +12339,15 @@ msgstr ""
"Shape должен быть предусмотрен для функций CollisionShape2D. Пожалуйста, "
"создайте shape-ресурс для этого!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Полигональные фигуры не предназначены для использования или редактирования "
+"непосредственно через узел \"CollisionShape2D\". Пожалуйста, используйте "
+"вместо этого узел \"CollisionPolygon2D\" ."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12144,10 +12371,9 @@ msgstr ""
"чтобы работать."
#: scene/2d/light_occluder_2d.cpp
-#, fuzzy
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
-"Заслоняющий полигон для этого окклюдера пуст. Пожалуйста, нарисуйте полигон!"
+"Заслоняющий полигон для этого окклюдера пуст. Пожалуйста, добавьте полигон."
#: scene/2d/navigation_polygon.cpp
msgid ""
@@ -12361,6 +12587,11 @@ msgstr ""
"Формы плоскостей не очень хорошо работают и будут удалены в последующих "
"версиях. Пожалуйста, не используйте их."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr "ConcavePolygonShape поддерживает RigidBody только в статичном режиме."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Ничто не видно, потому что не назначена сетка."
@@ -12385,6 +12616,11 @@ msgstr ""
"GIProbes не поддерживаются видеодрайвером GLES2.\n"
"Вместо этого используйте BakedLightmap."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr "SpotLight с углом более 90 градусов не может отбрасывать тени."
@@ -12430,7 +12666,6 @@ msgid "PathFollow only works when set as a child of a Path node."
msgstr "PathFollow работает только при если она дочь узла Path."
#: scene/3d/path.cpp
-#, fuzzy
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
@@ -12630,8 +12865,7 @@ msgid ""
msgstr ""
"ScrollContainer предназначен для работы с одним дочерним элементом "
"управления.\n"
-"Используйте дочерний контейнер (VBox, HBox и т.д.), или Control и "
-"установите\n"
+"Используйте дочерний контейнер (VBox, HBox и т.д.), или Control и установите "
"минимальный размер вручную."
#: scene/gui/tree.cpp
@@ -12659,6 +12893,10 @@ msgstr ""
"сделайте её целью рендеринга и назначьте её внутреннюю текстуру какому-либо "
"узлу для отображения."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "Размер окна просмотра должен быть больше 0 для рендеринга."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Неверный источник для предпросмотра."
@@ -12687,6 +12925,53 @@ msgstr "Изменения могут быть назначены только
msgid "Constants cannot be modified."
msgstr "Константы не могут быть изменены."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Панели «Файловая система» и «Импорт»"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "При экспорте или развёртывании, полученный исполняемый файл будет "
+#~ "пытаться подключиться к IP этого компьютера с целью отладки."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Текущая сцена никогда не была сохранена, сохраните её перед запуском."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Не в пути ресурсов."
+
+#~ msgid "Revert"
+#~ msgstr "Восстановить"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Это действие нельзя отменить. Восстановить в любом случае?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Восстановить сцену"
+
+#~ msgid "Clear Script"
+#~ msgstr "Убрать скрипт"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Система отслеживания ошибок"
+
+#~ msgid "Request Docs"
+#~ msgstr "Проблема"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Помогите улучшить документацию Godot, оставьте сообщение об ошибке."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Заменено %d совпадений."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Создать выпуклое статичное тело"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Не удалось создать форму!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/si.po b/editor/translations/si.po
index bd57c6a782..d474b218ba 100644
--- a/editor/translations/si.po
+++ b/editor/translations/si.po
@@ -527,6 +527,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -687,7 +688,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -706,7 +707,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -756,6 +757,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -836,7 +841,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -893,6 +897,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -930,7 +938,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1104,6 +1112,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1125,6 +1136,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1428,7 +1447,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1436,16 +1455,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1473,6 +1484,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1592,15 +1607,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1749,7 +1764,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1863,7 +1878,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2274,10 +2289,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2362,11 +2373,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "සාදන්න"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2632,10 +2646,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2695,22 +2705,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2719,8 +2733,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2729,32 +2743,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2814,7 +2828,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2828,7 +2842,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3211,7 +3229,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3238,6 +3257,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3824,19 +3847,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3852,7 +3879,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3886,10 +3913,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4944,7 +4967,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5689,11 +5712,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5705,11 +5728,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5761,11 +5800,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5773,6 +5841,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6609,14 +6685,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6678,11 +6746,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7047,6 +7115,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7135,17 +7207,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7487,7 +7568,7 @@ msgid "New Animation"
msgstr "සජීවීකරණ පුනරාවර්ථනය"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8152,7 +8233,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9246,11 +9327,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9258,11 +9344,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9477,6 +9563,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9523,6 +9610,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9900,11 +9994,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9942,11 +10044,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9972,10 +10074,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9984,11 +10082,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10007,6 +10105,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10070,7 +10176,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10107,6 +10213,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "යතුරු මකා දමන්න"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "යතුරු මකා දමන්න"
@@ -10231,6 +10342,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10277,11 +10395,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10401,6 +10519,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10441,6 +10563,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10449,7 +10575,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10473,6 +10599,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10542,6 +10674,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10590,7 +10726,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11468,6 +11604,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11491,6 +11631,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11668,6 +11834,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11855,6 +12027,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11875,6 +12052,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12094,6 +12276,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
index a81d842616..9ef7eb1d1a 100644
--- a/editor/translations/sk.po
+++ b/editor/translations/sk.po
@@ -5,15 +5,17 @@
# J08nY <johnenter@gmail.com>, 2016.
# MineGame 159 <minegame459@gmail.com>, 2018.
# Zuzana Palenikova <sousana.is@gmail.com>, 2019.
-# MineGame159 <petulko08@gmail.com>, 2019.
+# MineGame159 <petulko08@gmail.com>, 2019, 2020.
# Michal <alladinsiffon@gmail.com>, 2019.
# Richard <rgarlik@gmail.com>, 2019.
+# Richard Urban <redasuio1@gmail.com>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-07-02 10:51+0000\n"
-"Last-Translator: Richard <rgarlik@gmail.com>\n"
+"PO-Revision-Date: 2020-09-08 11:40+0000\n"
+"Last-Translator: Richard Urban <redasuio1@gmail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/"
"godot/sk/>\n"
"Language: sk\n"
@@ -21,7 +23,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 3.8-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -30,22 +32,21 @@ msgstr "Chybný argument convert(), použite TYPE_* konštanty."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "dĺžka očakávaného stringu 1 (písmeno)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Nedostatok bajtov na dekódovanie, možný chybný formát."
+msgstr "Nedostatok bajtov na dekódovanie, alebo chybný formát."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Nesprávny vstup(input) %i (neschválený) v požiadavke"
#: core/math/expression.cpp
-#, fuzzy
msgid "self can't be used because instance is null (not passed)"
-msgstr "self nemožno použiť lebo inštancia je rovná null (not passed)"
+msgstr "self sa nedá použiť lebo inštancia je null (neprešiel)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -69,35 +70,35 @@ msgstr "Pri volaní '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "Voľné"
+msgstr "Voľný"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -117,7 +118,7 @@ msgstr "Hodnota:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "Vložiť tu kľúč"
+msgstr "Tu vložiť kľúč"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
@@ -125,120 +126,112 @@ msgstr "Duplikovať kľúč(e)"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "Zmazať kľúč(e)"
+msgstr "Zmazať označené kľúč(e)"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr "Pridať Bezierov bod"
+msgstr "Pridať Bezier bod"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr "Presunúť Vybraté Body"
+msgstr "Presunúť Bazier Points"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Animácia Duplikovať Kľúče"
+msgstr "Anim Duplikovať Kľúče"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Animácia Vymazať Kľúče"
+msgstr "Anim Zmazať Kľúče"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "Animácia Zmeniť Keyframe Čas"
+msgstr "Anim Zmeniť Keyframe Čas"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "Animácia zmeniť prechod"
+msgstr "Anim zmeniť prechod"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr ""
+msgstr "Anim Zmeniť Veľkosť"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Animácia Zmeniť Keyframe Hodnotu"
+msgstr "Anim Zmeniť Hodnotu Keyframe"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Call"
-msgstr "Animácia Zmeniť Hovor"
+msgstr "Anim Change Call"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Animácia Zmeniť Keyframe Čas"
+msgstr "Anim Zmeniť čas Keyframe-u"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Animácia zmeniť prechod"
+msgstr "Animácia zmeniť prechod(Anim Multi Change Transition)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Animácia zmeniť prechod"
+msgstr "Anim zmeniť Transform"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Animácia Zmeniť Keyframe Hodnotu"
+msgstr "Animácia Zmeniť Keyframe Hodnotu (Anim Multi Change Keyframe Value)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "Animácia Zmeniť Hovor"
+msgstr "Animácia Zmeniť Hovor (Anim Multi Change Call)"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
-msgstr "Zmeniť Dĺžku Animácie"
+msgstr "Zmeniť Dĺžku Animácie (Change Animation Length)"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr "Zmeniť Dĺžku Animácie"
+msgstr "Zmeniť Opakovanie Animácie"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Property Track"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "3D Transform Track"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Call Method Track"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezier Curve Track"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Audio Playback Track"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
-msgstr ""
+msgstr "Animation Playback Track"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (frames)"
msgstr "Dĺžka Času Animácie (v sekundách)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
msgstr "Dĺžka Času Animácie (v sekundách)"
#: editor/animation_track_editor.cpp
msgid "Add Track"
-msgstr ""
+msgstr "Pridať Track"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr ""
+msgstr "Opakovanie Animácie"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -255,15 +248,15 @@ msgstr "Klipy Animácie:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
-msgstr ""
+msgstr "Zmeniť cestu Tracku"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "Zapnúť/Vypnúť tento track."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Update Mode (Tak ako je táto možnosť nastavená)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
@@ -271,12 +264,11 @@ msgstr "Režim Interpolácie"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Loop Wrap Mode (interpoluje koniec zo začiatkom opakovania)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Všetky vybrané"
+msgstr "Vymazať tento track."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
@@ -284,7 +276,7 @@ msgstr "Čas (s): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "Zmena Tracku Povolená"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -317,11 +309,11 @@ msgstr "Kubický"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Clamp Loop Interp"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Wrap Loop Interp"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -329,38 +321,36 @@ msgid "Insert Key"
msgstr "Vložiť Kľúč"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplikovať výber"
+msgstr "Duplikovanie Kľúčov"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Všetky vybrané"
+msgstr "Vymazanie kľúča(ov)"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
-msgstr ""
+msgstr "Zmeniť Update Mode Animácie"
#: editor/animation_track_editor.cpp
msgid "Change Animation Interpolation Mode"
-msgstr ""
+msgstr "Zmeniť Interpolacný Mód Animácie"
#: editor/animation_track_editor.cpp
msgid "Change Animation Loop Mode"
-msgstr ""
+msgstr "Zmeniť Loop Mode Animacie"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr ""
+msgstr "Vymazať Track Animácie"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr ""
+msgstr "Vytvoriť NOVÝ track za %s a vložiť kľúč?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr ""
+msgstr "Vytvoriť %d NOVÉ track-y a vložiť kľúče?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -388,25 +378,23 @@ msgstr "Animácia Vytvoriť & Vložiť"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr ""
+msgstr "Anim Vložiť Track & kľúč"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
msgstr "Animácia Vložiť Kľúč"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "Animácia zmeniť prechod"
+msgstr "Zmeniť krok Animácie"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "Vložiť"
+msgstr "Preskupiť Track-y"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Transformovať track-y a aplikovať do Spatial-based node-ov."
#: editor/animation_track_editor.cpp
msgid ""
@@ -422,73 +410,72 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Track-y Animácií môžu ukazovať iba na node-y AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "Animation player sa nemôže naanimovať sám, iba ostatné player-y."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Není možné pridať nový track bez root-u"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Neplatný track pre Bezier (niesu vhodné sub-properties)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
-msgstr ""
+msgstr "Pridať Bezier Track"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Cesta Track-u je neplatná, takže sa nedá pridať kľúč."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Track není typ Spatial, nedá sa vložiť kľúč"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
-msgstr ""
+msgstr "Pridať Transform Track Key"
#: editor/animation_track_editor.cpp
msgid "Add Track Key"
-msgstr ""
+msgstr "Pridať Track Key"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Cesta track-u je neplatná, takže sa nedá pridať do method key."
#: editor/animation_track_editor.cpp
msgid "Add Method Track Key"
-msgstr ""
+msgstr "Pridať Method Track Key"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr ""
+msgstr "Metóda nebola nájdená v objekte: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr ""
+msgstr "Pohybové kľúče Animácie"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr ""
+msgstr "Schránka je prázdna"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Vložiť"
+msgstr "Vložiť Track-y"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr ""
+msgstr "Scale keys Animácie"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "Táto možnosť nefunguje pre Bezier editovanie, lebo je to jeden track."
#: editor/animation_track_editor.cpp
msgid ""
@@ -502,38 +489,48 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"Táto Animácia patrí importovanej scéne, takže zmeny pre importované track-y "
+"nebudú uložené.\n"
+" \n"
+"Na povolenie abilite pridať vlastné track-y, prejdite na nastavenia importu "
+"scén a nastavte\n"
+"\" Animation > Storage\" na \"Files\", povolte \"Animation > Keep Custom "
+"Tracks\", a potom re-import.\n"
+"Alternatívne, použite import preset ktorý importuje animácie pre oddelenie "
+"file-ov."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "Upozornenie: Editovanie importovaných animácií"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr ""
+msgstr "Označte AnimationPlayer node aby ste vytvorili a upravili animácie."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Iba show track-y z node-ov označené v strome."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Zoskupte track-y pomocou node-u alebo ich zobrazte ako plain list."
#: editor/animation_track_editor.cpp
msgid "Snap:"
-msgstr ""
+msgstr "Prichytiť:"
#: editor/animation_track_editor.cpp
msgid "Animation step value."
-msgstr ""
+msgstr "Hodnota kroku Animácie."
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "Sekundy"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr ""
+msgstr "FPS"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -543,15 +540,15 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/property_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit"
-msgstr ""
+msgstr "Edit"
#: editor/animation_track_editor.cpp
msgid "Animation properties."
-msgstr ""
+msgstr "Vlastnosti Animácie."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr ""
+msgstr "Kopírovať track-y"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -567,87 +564,83 @@ msgstr "Duplikovať výber"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr ""
+msgstr "Duplikovanie transponovaných"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Všetky vybrané"
+msgstr "Vymazať výber"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "Prejsť na ďalší krok"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "Prejsť na predchádzajúci krok"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr ""
+msgstr "Optimalizácia Animacie"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr ""
+msgstr "Vyčistenie Animácie"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Vyberte node ktorý bude animovaný:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Použiť Bezier Curves"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr ""
+msgstr "Optimalizér Animácií"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr ""
+msgstr "Max. Linear Error:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr ""
+msgstr "Max. Angular Error:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
-msgstr ""
+msgstr "Maximálny Optimalizovatelný Uhol:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
-msgstr ""
+msgstr "Optimalizácia"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr ""
+msgstr "Vymazať neplatné kľúče"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr ""
+msgstr "Vymazať nevyriešené a prázdne track-y"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
-msgstr ""
+msgstr "Vyčistiť všetky animácie"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr ""
+msgstr "Vyčistenie Animácií (NIEJE KROK SPÄŤ!)"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
-msgstr ""
+msgstr "Vyčistenie"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr ""
+msgstr "Pomer mierky:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "Nastaviť prechody na:"
+msgstr "Vybrať Track-y na skopírovanie"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -659,136 +652,137 @@ msgid "Copy"
msgstr "Kopírovať"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "Všetky vybrané"
+msgstr "Vybrať všetko/nič"
#: editor/animation_track_editor_plugins.cpp
msgid "Add Audio Track Clip"
-msgstr ""
+msgstr "Pridať Audio Track Clip"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "Zmeniť Audio Track Clip spustiť Offset"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "Zmeniť Audio Track Clip koniec Offset-u"
#: editor/array_property_edit.cpp
msgid "Resize Array"
-msgstr ""
+msgstr "Zmeniť veľkosť Array-u"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr ""
+msgstr "Zmeniť hodnotu Array-u"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
-msgstr ""
+msgstr "Zmeniť hodnotu Array-u"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr ""
+msgstr "Choďte na Líniu"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr ""
+msgstr "Číslo línie:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+msgid "%d replaced."
+msgstr "%d náhradené."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "%d sa zhoduje."
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "Zhody:"
+msgstr "%d zhody."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
-msgstr ""
+msgstr "Match Case"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr ""
+msgstr "Celé slová"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
-msgstr ""
+msgstr "Nahradiť"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr ""
+msgstr "Nahradiť Všetko"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr ""
+msgstr "Iba Výber"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "Štandard"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "Vypnúť Panel Script-ov"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr ""
+msgstr "Priblížiť"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr ""
+msgstr "Oddialiť"
#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr ""
+msgstr "Resetovať priblíženie"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "Varovania"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "Čísla riadkov a stĺpcov."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr ""
+msgstr "Metóda v target node-e musí byť špecifikovaná."
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Meno Metódy musí byť špecifikované."
#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
+"Metóda Target sa nenašla. Špecifikujte platnú metódu alebo pripojte script k "
+"target node-u."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "Pripojiť k Node:"
+msgstr "Pripojiť k Node-u:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "Pripojiť k Node:"
+msgstr "Pripojiť k Scriptu:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "Signály:"
+msgstr "Zo Signálu:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "Scéna neobsahuje žiadny script."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -809,49 +803,45 @@ msgstr "Odstrániť"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr ""
+msgstr "Pridajte Extra Call Argument:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr ""
+msgstr "Extra Call Argumenty:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "Filter:"
+msgstr "Metóda Prijímača:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "Vyvážený"
+msgstr "Pokročilé"
#: editor/connections_dialog.cpp
msgid "Deferred"
-msgstr ""
+msgstr "Odložené"
#: editor/connections_dialog.cpp
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr ""
+msgstr "Odloží signál, uloží ho do queue a vystrelí ho iba cez idle time."
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr ""
+msgstr "Oneshot"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "Odpojí signál po jeho prvej emisii."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "Pripojiť Signál: "
+msgstr "Nedá sa pripojiť signál"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -867,9 +857,8 @@ msgid "Connect"
msgstr "Pripojiť"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "Signály:"
+msgstr "Signál:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
@@ -893,14 +882,12 @@ msgid "Disconnect"
msgstr "Odpojiť"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "Pripojiť Signál: "
+msgstr "Pripojiť Signál k Metóde"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "Upraviť Pripojenie: "
+msgstr "Upraviť Pripojenie:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
@@ -911,6 +898,11 @@ msgid "Signals"
msgstr "Signály"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filter:"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Naozaj chcete odstrániť všetky pripojenia z tohto signálu?"
@@ -948,7 +940,7 @@ msgid "Recent:"
msgstr "Nedávne:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Hľadať:"
@@ -976,22 +968,20 @@ msgid "Dependencies For:"
msgstr "Závislosti pre:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
"Scéna '%s' sa práve upravuje.\n"
-"Zmeny sa neprejavia, pokiaľ znovu načítané."
+"Zmeny sa prejavia iba keď sa znovu načítajú."
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
"Scéna '%s' sa práve upravuje.\n"
-"Zmeny sa neprejavia, pokiaľ znovu načítané."
+"Zmeny sa prejavia iba keď sa znovu načítajú."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -1038,7 +1028,6 @@ msgid "Owners Of:"
msgstr "Majitelia:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
msgstr "Odstrániť vybraté súbory z projektu? (nedá sa vrátiť späť)"
@@ -1084,13 +1073,12 @@ msgid "Permanently delete %d item(s)? (No undo!)"
msgstr "Natrvalo odstrániť %d položky? (Nedá sa vrátiť späť!)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "Závislostí"
+msgstr "Zobraziť Závislosťi"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
-msgstr ""
+msgstr "Orphan Resource Explorer"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -1132,6 +1120,9 @@ msgstr "Zakladatelia Projektu"
msgid "Lead Developer"
msgstr "Vedúci Vývojár"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Manažér Projektu "
@@ -1153,6 +1144,14 @@ msgid "Gold Sponsors"
msgstr "Zlatý Sponzori"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Strieborný Sponzori"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Bronzový Sponzori"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Malý Sponzori"
@@ -1177,7 +1176,6 @@ msgid "License"
msgstr "Licencia"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
msgstr "Thirdparty Licencie"
@@ -1188,13 +1186,16 @@ msgid ""
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
+"Godot Engine sa spolieha na množstvo bezplatných a otvorených knižníc "
+"tretích strán, ktoré sú kompatibilné s podmienkami licencie MIT. Nasleduje "
+"vyčerpávajúci zoznam všetkých takýchto komponentov tretích strán s ich "
+"príslušnými prehláseniami o autorských právach a licenčnými podmienkami."
#: editor/editor_about.cpp
msgid "All Components"
msgstr "Všetky Komponenty"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Components"
msgstr "Komponenty"
@@ -1203,26 +1204,24 @@ msgid "Licenses"
msgstr "Licencie"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Error opening package file, not in ZIP format."
msgstr "Chyba pri otváraní súboru balíka, nie je vo formáte zip."
#: editor/editor_asset_installer.cpp
msgid "%s (Already Exists)"
-msgstr ""
+msgstr "%s (Už Existuje)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr ""
+msgstr "Dekompresia Prostriedkov"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "Nasledovné súbory sa nepodarilo extrahovať z balíka:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "Vytvoriť adresár"
+msgstr "A %s viac súborov."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
@@ -1234,9 +1233,8 @@ msgid "Success!"
msgstr "Úspech!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "Konštanty:"
+msgstr "Balíček Obsahu:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1255,46 +1253,44 @@ msgid "Add Effect"
msgstr "Pridať Efekt"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Rename Audio Bus"
-msgstr "Všetky vybrané"
+msgstr "Premenovať Audio Bus"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Change Audio Bus Volume"
-msgstr "Všetky vybrané"
+msgstr "Zmeniť hlasitosť Audio Bus-u"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
-msgstr ""
+msgstr "Prepnúť Audio Bus Solo"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr ""
+msgstr "Prepnúť Audio Bus Mute"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr ""
+msgstr "Prepnúť Audio Bus Bypass Effects"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr ""
+msgstr "Vybrať Audio Bus Send"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr ""
+msgstr "Pridať Audio Bus Effect"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr ""
+msgstr "Posunúť Bus Effect"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr ""
+msgstr "Vymazať Bus Effect"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
-msgstr ""
+msgstr "Zoberte a položte(drag & drop) pre rearandžovanie."
#: editor/editor_audio_buses.cpp
msgid "Solo"
@@ -1310,7 +1306,7 @@ msgstr "Obísť"
#: editor/editor_audio_buses.cpp
msgid "Bus options"
-msgstr ""
+msgstr "Možnosti pre Bus"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -1331,64 +1327,63 @@ msgstr "Audio"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
-msgstr ""
+msgstr "Pridať Audio Bus"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr ""
+msgstr "Master bus nemôžete vymazať!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr ""
+msgstr "Vymazať Audio Bus"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
-msgstr ""
+msgstr "Duplikovať Audio Bus"
#: editor/editor_audio_buses.cpp
msgid "Reset Bus Volume"
-msgstr ""
+msgstr "Resetovať hlasitosť Bus-u"
#: editor/editor_audio_buses.cpp
msgid "Move Audio Bus"
-msgstr ""
+msgstr "Presunúť Audio Bus"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
-msgstr ""
+msgstr "Uložiť Audio Bus Layaut Ako..."
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
-msgstr ""
+msgstr "Lokácia pre Nový Layout..."
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
-msgstr ""
+msgstr "Otvoriť Audio Bus Layout"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "Není tu žiadny '%s' súbor."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
-msgstr ""
+msgstr "Layout"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr ""
+msgstr "Neplatný súbor, není audio bus layout."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Chyba pri načítaní:"
+msgstr "Chyba uloženia súbora: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr ""
+msgstr "Pridať Bus"
#: editor/editor_audio_buses.cpp
msgid "Add a new Audio Bus to this layout."
-msgstr ""
+msgstr "Pridať nový Audio Bus do tohoto layout-u."
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1397,9 +1392,8 @@ msgid "Load"
msgstr "Načítať"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Load an existing Bus Layout."
-msgstr "Popis:"
+msgstr "Načítať existujúci Bus Layout."
#: editor/editor_audio_buses.cpp
msgid "Save As"
@@ -1407,7 +1401,7 @@ msgstr "Uložiť Ako"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr ""
+msgstr "Uložiť tento Bus Layout do súboru."
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
@@ -1415,11 +1409,11 @@ msgstr "Načítať predvolené"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr ""
+msgstr "Načítať základný Bus Layout."
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr ""
+msgstr "Vytvoriť nový Bus Layout."
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
@@ -1427,68 +1421,59 @@ msgstr "Neplatný Názov."
#: editor/editor_autoload_settings.cpp
msgid "Valid characters:"
-msgstr ""
+msgstr "Platné písmená:"
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing engine class name."
-msgstr ""
+msgstr "Nesmie kolidovať(collide) s existujúcim názvom engine class-u."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing built-in type name."
-msgstr ""
+msgstr "Nesmie kolidovať(collide) s existujúcim menom pre built-in-type."
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing global constant name."
-msgstr ""
+msgstr "Nesmie kolidovať s existujúcim menom pre global constant."
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "Kľúčové slovo nemožno použiť ako AutoLoad názvu."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
-msgstr ""
+msgstr "AutoLoad '%s' už existujuje!"
#: editor/editor_autoload_settings.cpp
msgid "Rename Autoload"
-msgstr ""
+msgstr "Premenovať AutoLoad"
#: editor/editor_autoload_settings.cpp
msgid "Toggle AutoLoad Globals"
-msgstr ""
+msgstr "Prepnúť globálne AutoLoad-y"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
-msgstr ""
+msgstr "Presunúť AutoLoad-y"
#: editor/editor_autoload_settings.cpp
msgid "Remove Autoload"
-msgstr ""
+msgstr "Vymazať AutoLoad"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
-msgstr ""
+msgstr "Povoliť"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Neplatný Názov."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
+msgstr "Rearandžovať AutoLoad-y"
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr ""
+msgid "Can't add autoload:"
+msgstr "Nepodarilo sa pridať autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
-msgstr ""
+msgstr "Pridať AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp
@@ -1499,45 +1484,49 @@ msgstr "Cesta:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr ""
+msgstr "Meno Node-u:"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
#: editor/settings_config_dialog.cpp
msgid "Name"
-msgstr ""
+msgstr "Meno"
#: editor/editor_autoload_settings.cpp
msgid "Singleton"
-msgstr ""
+msgstr "Singleton"
+
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Vložiť Params"
#: editor/editor_data.cpp
msgid "Updating Scene"
-msgstr ""
+msgstr "Aktualizovať Scénu"
#: editor/editor_data.cpp
msgid "Storing local changes..."
-msgstr ""
+msgstr "Ukladanie lokálnych zmien..."
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr ""
+msgstr "Aktualizovanie scény..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr ""
+msgstr "[Prázdne]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr ""
+msgstr "[Neuložené]"
#: editor/editor_dir_dialog.cpp
msgid "Please select a base directory first."
-msgstr ""
+msgstr "Najprv vyberte základný adresár."
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
-msgstr ""
+msgstr "Vyberte adresár"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
@@ -1555,35 +1544,39 @@ msgstr "Meno:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr ""
+msgstr "Priečinok sa nepodarilo vytvoriť."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr ""
+msgstr "Vyberte"
#: editor/editor_export.cpp
msgid "Storing File:"
-msgstr ""
+msgstr "Ukladanie súboru:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "Na očakávanej ceste sa nenašla žiadna exportná cesta:"
#: editor/editor_export.cpp
msgid "Packing"
-msgstr ""
+msgstr "Zabalovanie"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"Target platforma potrebuje 'ETC' kompresor textúr pre GLES2. Povoliť 'Import "
+"Etc' v Nastaveniach Projektu."
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"Target platforma potrebuje 'ETC2' kompresor textúr pre GLES3. Povoliť'Import "
+"Etc 2' v Nastaveniach Projektu."
#: editor/editor_export.cpp
msgid ""
@@ -1592,219 +1585,212 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"Target platform potrebuje'ETC' kompresor textúr pre driver fallback do "
+"GLES2.\n"
+"Povoľte 'Import Etc' v Nastaveniach Projektu, alebo vipnite 'Driver Fallback "
+"Enabled'."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom debug template not found."
-msgstr ""
+msgstr "Vlastná debug šablóna sa nenašla."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr ""
+msgstr "Vlastná release šablóna sa nenašla."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
-msgstr ""
+msgstr "Súbor Šablóny sa nenašiel:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
+msgstr "Pri 32-bitovom exporte nemôže byť vložená PCK väčšia ako 4 GiB."
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "Otvorit priečinok"
+msgstr "3D Editor"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "Otvorit priečinok"
+msgstr "Script Editor"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr ""
+msgstr "Asset Library"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr ""
+msgstr "Editovanie Stromu Scén"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr ""
+msgid "Node Dock"
+msgstr "Node Dock"
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
-msgstr ""
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "FileSystém"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr ""
+msgid "Import Dock"
+msgstr "Importovať Dock"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr ""
+msgstr "Vymazať profil '%s'? (Nedá sa vrátiť späť)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
+msgstr "Profil musí mať platný názov súboru a musí obsahovať '.'"
#: editor/editor_feature_profile.cpp
msgid "Profile with this name already exists."
-msgstr ""
+msgstr "Profil s týmto menom už existuje."
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(Editor je vypnutý, Vlastnosti sú vypnuté)"
#: editor/editor_feature_profile.cpp
msgid "(Properties Disabled)"
-msgstr ""
+msgstr "(Vlastnosi sú vypnuté)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "Vypnuté"
+msgstr "(Editor je vypnutý)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "Popis:"
+msgstr "Možnosti pre Class:"
#: editor/editor_feature_profile.cpp
msgid "Enable Contextual Editor"
-msgstr ""
+msgstr "Povoliť Kontextuálny Editor"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "Filter:"
+msgstr "Povolené Vlastnosti:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Features:"
-msgstr ""
+msgstr "Povolené Funkcie:"
#: editor/editor_feature_profile.cpp
msgid "Enabled Classes:"
-msgstr ""
+msgstr "Povolené Class-y:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "Formát súboru '%s' je neplatny, Import bol prerušený."
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
msgstr ""
+"Profil '%s' už existuje. Najprv ho Vymažte ako začnete Importovať, import je "
+"prerušený."
#: editor/editor_feature_profile.cpp
msgid "Error saving profile to path: '%s'."
-msgstr ""
+msgstr "Error pri ukladaní profilu do cesty: '%s'."
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "Unset"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "Vytvoriť adresár"
+msgstr "Aktuálny Profil:"
#: editor/editor_feature_profile.cpp
msgid "Make Current"
-msgstr ""
+msgstr "Spraviť Aktuálny"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "New"
-msgstr ""
+msgstr "Nový"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr ""
+msgstr "Import"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
-msgstr ""
+msgstr "Export"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "Filter:"
+msgstr "Profily k dispozícii:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "Popis:"
+msgstr "Možnosti pre Class"
#: editor/editor_feature_profile.cpp
msgid "New profile name:"
-msgstr ""
+msgstr "Nové profilové meno:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "Všetky vybrané"
+msgstr "Vymazať Profil"
#: editor/editor_feature_profile.cpp
msgid "Godot Feature Profile"
-msgstr ""
+msgstr "Godot Feature Profil"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
-msgstr ""
+msgstr "Importovať Profil(y)"
#: editor/editor_feature_profile.cpp
msgid "Export Profile"
-msgstr ""
+msgstr "Exportovať Profil"
#: editor/editor_feature_profile.cpp
msgid "Manage Editor Feature Profiles"
-msgstr ""
+msgstr "Spravovať Feature Profily Editora"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select Current Folder"
-msgstr "Vytvoriť adresár"
+msgstr "Vybrať Aktuálny Priečinok"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr ""
+msgstr "Súbor Existuje, Predpísať?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Vytvoriť adresár"
+msgstr "Vybrať Tento Priečinok"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr ""
+msgstr "Skopírovať Cestu"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "Otvoriť súbor"
+msgstr "Otvoriť v File Manažérovy"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Otvoriť súbor"
+msgstr "Ukázať v File Manažérovy"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Folder..."
-msgstr "Vytvoriť adresár"
+msgstr "Nový Priečinok..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
-msgstr ""
+msgstr "Obnoviť"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
@@ -1812,7 +1798,7 @@ msgstr "Všetko rozpoznané"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr ""
+msgstr "Všetky Súbory (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
@@ -1843,74 +1829,71 @@ msgstr "Uložiť súbor"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr ""
+msgstr "Ísť Naspäť"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr ""
+msgstr "Ísť Dopredu"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "Ísť Hore"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr ""
+msgstr "Prepnúť Skryté Súbory"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr ""
+msgstr "Prepnúť Obľúbené"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr ""
+msgstr "Prepnúť Mode"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr ""
+msgstr "Zamerať Cestu"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr ""
+msgstr "Posunúť obľúbené Vyššie"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr ""
+msgstr "Posunúť Obľúbené Nižšie"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "Vytvoriť adresár"
+msgstr "Ísť do predchádzajúceho priečinka."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "Vytvoriť adresár"
+msgstr "Ísť do ďalšieho priečinka."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "Vytvoriť adresár"
+msgstr "Ísť do parent folder."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Refresh files."
-msgstr ""
+msgstr "Obnoviť súbory."
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr ""
+msgstr "(Od)obľúbiť aktuálny priečinok."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "Prepnúť viditeľnosť skrytých súborov."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
-msgstr ""
+msgstr "Zobraziť veci ako mriežku náhľadov."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr ""
+msgstr "Zobraziť veci ako list."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
@@ -1918,9 +1901,9 @@ msgstr "Priečinky a Súbory:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
-msgstr ""
+msgstr "Predzobraziť:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
@@ -1928,25 +1911,27 @@ msgstr "Súbor:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr ""
+msgstr "Musíte použiť platné rozšírenie."
#: editor/editor_file_system.cpp
msgid "ScanSources"
-msgstr ""
+msgstr "SkenZdrojov"
#: editor/editor_file_system.cpp
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
msgstr ""
+"Sú tu viacero importérov pre rozličné typy ukazujúce do súboru, import "
+"prerušený"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr ""
+msgstr "(Re)Importovanie Asset-ov"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr ""
+msgstr "Top"
#: editor/editor_help.cpp
msgid "Class:"
@@ -1955,175 +1940,164 @@ msgstr "Trieda:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Inherits:"
-msgstr ""
+msgstr "Inherit-y:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr ""
+msgstr "Zdedené používateľom:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Popis:"
+msgstr "Popisok"
#: editor/editor_help.cpp
msgid "Online Tutorials"
-msgstr ""
+msgstr "Online Tutoriáli"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "Vlastnosti"
#: editor/editor_help.cpp
msgid "override:"
-msgstr ""
+msgstr "Predpísať:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "Načítať predvolené"
+msgstr "Štandard:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr ""
+msgstr "Metódy"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Filter:"
+msgstr "Vlastnosti Témy"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Enumerations"
-msgstr "Popis:"
+msgstr "Výpočty"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Constants"
-msgstr "Konštanty:"
+msgstr "Konštanty"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Popis:"
+msgstr "Popisok Vlastnosti"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Hodnota:"
+msgstr "(hodnota)"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"Zatiaľ tu není žiadny popisok pre túto vlastnosť. Prosím pomôžte nám pomocou "
+"[color=$color][url=$url]prispetím jedného[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Popis:"
+msgstr "Popisky Metód"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
+"Zatiaľ tu není žiadny popisok pre túto metódu. Prosím pomôžte nám pomocou "
+"[color=$color][url=$url]prispetím jedného[/url][/color]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr ""
+msgstr "Vyhľadať Pomoc"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
-msgstr ""
+msgstr "Rozlišuje malé a veľké písmená"
#: editor/editor_help_search.cpp
msgid "Show Hierarchy"
-msgstr ""
+msgstr "Ukázať Hierarchiu"
#: editor/editor_help_search.cpp
msgid "Display All"
-msgstr ""
+msgstr "Zobraziť Všetko"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr ""
+msgstr "Iba Class-y"
#: editor/editor_help_search.cpp
msgid "Methods Only"
-msgstr ""
+msgstr "Iba Metódy"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Signály:"
+msgstr "Iba Signály"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Konštanty:"
+msgstr "Iba Konštanty"
#: editor/editor_help_search.cpp
msgid "Properties Only"
-msgstr ""
+msgstr "Iba Vlastnosti"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr ""
+msgstr "Iba Vlastnosti Témy"
#: editor/editor_help_search.cpp
msgid "Member Type"
-msgstr ""
+msgstr "Typ Člena"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Trieda:"
+msgstr "Class"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "Prejdite na Metódu"
+msgstr "Metóda"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "Signály"
+msgstr "Signál"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr ""
+msgstr "Konštant"
#: editor/editor_help_search.cpp
msgid "Property"
-msgstr ""
+msgstr "Vlastnosť"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "Filter:"
+msgstr "Vlastnosť Témy"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr ""
+msgstr "Vlastnosť:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "Nastaviť"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Nastaviť Viac:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr ""
+msgstr "Output:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Odstrániť výber"
+msgstr "Skopírovať Výber"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2133,177 +2107,182 @@ msgstr "Odstrániť výber"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr ""
+msgstr "Vyčistiť"
#: editor/editor_log.cpp
-#, fuzzy
msgid "Clear Output"
-msgstr "Popis:"
+msgstr "Vyčistiť Output"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
msgid "Stop"
-msgstr ""
+msgstr "Stop"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
msgid "Start"
-msgstr ""
+msgstr "Štart"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
msgid "Down"
-msgstr ""
+msgstr "Dole"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "Hore"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
-msgstr ""
+msgstr "Node"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "Prichádzajúce RPC"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "Prichádzajúci RSET"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "Vychádzajúce RPC"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "Vychádzajúci RSET"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "Nové Okno"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "Importované zdroje nemôžu byť uložené."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr ""
+msgstr "OK"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr ""
+msgstr "Error pri ukladaní prostriedku!"
#: editor/editor_node.cpp
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"Tento prostriedok nemôže byť uložený lebo nepatrí editovanej scéne. Najprv "
+"ho spravte jedinečným."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr ""
+msgstr "Uložiť Prostriedok Ako..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr ""
+msgstr "Nie je možné otvoriť súbor pre písanie:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr ""
+msgstr "Požadovaný formát súboru je neznámy:"
#: editor/editor_node.cpp
msgid "Error while saving."
-msgstr ""
+msgstr "Error pri ukladaní."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Nedá sa otvoriť '%s'. Súbor mohol byť presunutý alebo vymazaný."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
-msgstr ""
+msgstr "Error pri analýze '%s'."
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr ""
+msgstr "Neočakávaný koniec súboru '%s'."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
-msgstr ""
+msgstr "Chýba '%s' alebo jeho závislosti."
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
-msgstr ""
+msgstr "Error pri načítavaní '%s'."
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr ""
+msgstr "Ukladanie Scény"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr ""
+msgstr "Analyzovanie"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
-msgstr ""
+msgstr "Vytváranie Náhľadu"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
-msgstr ""
+msgstr "Tátu operáciu nie je možné vykonať bez tree root-u."
#: editor/editor_node.cpp
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"Táto scéna nemôže byť uložená lebo je tu cyklické instancovanie inklúzie.\n"
+"Prosím vyriešte to a skúste to znova."
#: editor/editor_node.cpp
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+"Nedá sa uložiť scéna. Pravdepodobne (inštancie alebo dedičstvo) nemôžu byť "
+"spokojné."
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Scéna sa nedá predpísať keď je stále otvorená!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr ""
+msgstr "Nedá sa načítať MeshLibrary lebo sa spája!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr ""
+msgstr "Error pri ukladaní MeshLibrary!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr ""
+msgstr "Nedá sa načítať TileSet lebo sa spája!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr ""
+msgstr "Error pri ukladaní TileSet-u!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
-msgstr ""
+msgstr "Error pri ukladaní layout-i!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
-msgstr ""
+msgstr "Predvolený editor layout je prepísaný."
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr ""
+msgstr "Meno Layout-u sa nenašlo!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
-msgstr ""
+msgstr "Obnovené predvolené rozloženie na základné nastavenia."
#: editor/editor_node.cpp
msgid ""
@@ -2311,18 +2290,26 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"Tento prostriedok patrí scéne ktorá bola importovaná, takže není "
+"editovateľný.\n"
+"Prosím prečítajte si dokumentáciu na importovanie scén aby ste tomu viac "
+"pochopili."
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
+"Tento prostriedok patrí scéne ktorá bola inštancovaná alebo zdedená.\n"
+"Zmeny sa nezanechajú po uložení aktuálnej scény."
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
+"Tento prostriedok bol importovaný, takže není editovateľný. Zmeňte jeho "
+"nastavenia v import panely a potom stlačťe re-import."
#: editor/editor_node.cpp
msgid ""
@@ -2331,6 +2318,11 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"Táto scéna bola importovaná, takže sa zmeny neuložia.\n"
+"Jej inštancovaním alebo zdedením povolíte to že môžete robiť zmeny v tejto "
+"scéne.\n"
+"Prosím prečítajte si dokumentáciu na importovanie scén aby ste tomu viac "
+"pochopili."
#: editor/editor_node.cpp
msgid ""
@@ -2338,203 +2330,215 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
+"Toto je remote objekt, takže sa zmeny neuložia.\n"
+"Prosím prečítajte si dokumentáciu o debbugging aby ste tomu viac pochopili."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
+msgstr "Nieje definovaná žiadna scéna na spustenie."
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
-msgstr ""
+msgstr "Subprocess sa nedá spustiť!"
#: editor/editor_node.cpp editor/filesystem_dock.cpp
msgid "Open Scene"
-msgstr ""
+msgstr "Otvoriť Scénu"
#: editor/editor_node.cpp
msgid "Open Base Scene"
-msgstr ""
+msgstr "Otvoriť Base Scene"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "Otvoriť"
+msgstr "Rýchle Otvorenie..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr ""
+msgstr "Rýchle Otvorenie Scény..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr ""
+msgstr "Rýchle Otvorenie Scriptu..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save & Close"
-msgstr "Uložiť súbor"
+msgstr "Uložiť & Zatvoriť"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
-msgstr ""
+msgstr "Chcete uložiť zmeny do '%s' pred zatvorením?"
#: editor/editor_node.cpp
msgid "Saved %s modified resource(s)."
-msgstr ""
+msgstr "Uložené %s upravené zdroje."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr ""
+msgstr "Na uloženie scény je potrebný root node."
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr ""
+msgstr "Uložiť Scénu Ako..."
#: editor/editor_node.cpp
msgid "No"
-msgstr ""
+msgstr "Nie"
#: editor/editor_node.cpp
msgid "Yes"
-msgstr ""
+msgstr "ÁNO"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
msgstr ""
+"Táto scéna ešte nikdy nebola uložená. Chcete ju uložiť predtým ako ju "
+"zapnete?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr ""
+msgstr "Táto operácia nemôže byť dokončená bez scény."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr ""
+msgstr "Exportovať Mesh Library"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr ""
+msgstr "Táto operácia nemôže byť dokončená bez root node-u."
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr ""
+msgstr "Exportovať Tile Set"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
-msgstr ""
+msgstr "Táto operácia nemôže byť dokončená bez vybraného node-u."
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr ""
+msgstr "Aktuálna scéna sa neuložila. Chcete ju aj tak otvoriť?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr ""
+msgstr "Nemožno načítať scénu, ktorá nikdy nebola uložená."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+msgid "Reload Saved Scene"
+msgstr "Reloadnuť Uloženú Scénu"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
+"Táto scéna má neuložené zmeny.\n"
+"Aj tak chcete scény reloadnuť? Táto akcia nomôže byť nedokončená."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr ""
+msgstr "Rýchle Spustenie Scény..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr ""
+msgstr "Odísť"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr ""
+msgstr "Odísť z editora?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr ""
+msgstr "Otvoriť Manažéra Projektov?"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save & Quit"
-msgstr "Uložiť súbor"
+msgstr "Uložiť & Ukončiť"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr ""
+msgstr "Uložiť zmeny do nasledujúcich scén pred ukončením?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr ""
+msgstr "Uložiť zmeny nasledujúcich scén pred otvorením Manažéra Projektov?"
#: editor/editor_node.cpp
msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
+"Táto možnosť je zastaraná. Situácie, v ktorých je potrebné obnovenie, sa "
+"teraz považujú za chybu. Prosím, nahláste."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
-msgstr ""
+msgstr "Vyberte hlavnú scénu"
#: editor/editor_node.cpp
msgid "Close Scene"
-msgstr ""
+msgstr "Zavrieť Scénu"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "Otvoriť súbor(y)"
+msgstr "Preotvoriť Zatvorenú Scénu"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
+"Addon plugin nie je možné povoliť pri: '% s' analýze konfigurácie zlyhalo."
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
msgstr ""
+"Nepodarilo sa nájsť script field pre addon plugin v: 'res://addons/%s'."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr ""
+msgstr "Nepodarilo sa načítať addon script z cesty: '%s'."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
+"Nepodarilo sa nájsť addon script z cesty: '%s' Vyzerá to tak že by mohol byť "
+"problém v kóde, prosím skontrolujte syntax."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
+"Nepodarilo sa načítať addon script z cesty: '%s' Base type není EditorPlugin."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
+"Nepodarilo sa načítať addon script z cesty: '%s' Script není v tool móde."
#: editor/editor_node.cpp
msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
+"Scéna '%s' bola automaticky importovaná, takže nemôže byť modifikovaná.\n"
+"Aby ste v nej mohli spraviť úpravy, môžete vytvoriť novú zdedenú scénu."
#: editor/editor_node.cpp
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
+"Error pri načítavaní, musí byť vo vnútri projektovej cesty. Použite 'Import' "
+"aby ste otvorili scénu, a potom ju uložte do projektovej cesty."
#: editor/editor_node.cpp
msgid "Scene '%s' has broken dependencies:"
-msgstr ""
+msgstr "Scéna '%s' má zničené závislosti:"
#: editor/editor_node.cpp
msgid "Clear Recent Scenes"
-msgstr ""
+msgstr "Vyčistiť Posledné Scény"
#: editor/editor_node.cpp
msgid ""
@@ -2542,6 +2546,9 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"Ešte ste nedefinovali hlavnú scénu, chcete nejakú vybrať?\n"
+"Neskôr ju môžete zmeniť v \"Nastaveniach Projektu\" pod kategóriou "
+"'application'."
#: editor/editor_node.cpp
msgid ""
@@ -2549,6 +2556,9 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"Vybraná scéna '%s' neexistuje, vybrať platnú?\n"
+"Neskôr ju môžete zmeniť v \"Nastaveniach Projekta\" pod kategóriou "
+"'application'."
#: editor/editor_node.cpp
msgid ""
@@ -2556,147 +2566,147 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"Vybraná scéna '%s' není scene file, vybrať platnú scénu?\n"
+"Neskôr ju môžete zmeniť v \"Nastaveniach Projekta\" pod kategóriou "
+"'application'."
#: editor/editor_node.cpp
msgid "Save Layout"
-msgstr ""
+msgstr "Uložiť Layout"
#: editor/editor_node.cpp
msgid "Delete Layout"
-msgstr ""
+msgstr "Odstrániť Layout"
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
msgid "Default"
-msgstr ""
+msgstr "Predvolené"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
msgid "Show in FileSystem"
-msgstr ""
+msgstr "Ukázať v FileSystéme"
#: editor/editor_node.cpp
msgid "Play This Scene"
-msgstr ""
+msgstr "Spustiť Túto Scénu"
#: editor/editor_node.cpp
msgid "Close Tab"
-msgstr ""
+msgstr "Zavrieť Kartu"
#: editor/editor_node.cpp
msgid "Undo Close Tab"
-msgstr ""
+msgstr "Naspäť Otvoriť Kartu"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
-msgstr ""
+msgstr "Zavrieť Ostatné Karty"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "Zavrieť Karty na Pravo"
#: editor/editor_node.cpp
msgid "Close All Tabs"
-msgstr ""
+msgstr "Zatvoriť všetky Karty"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
-msgstr ""
+msgstr "Prepnúť Kartu Scény"
#: editor/editor_node.cpp
msgid "%d more files or folders"
-msgstr ""
+msgstr "%d viac súborov alebo priečinkov"
#: editor/editor_node.cpp
-#, fuzzy
msgid "%d more folders"
-msgstr "Vytvoriť adresár"
+msgstr "%d viac priečinkov"
#: editor/editor_node.cpp
msgid "%d more files"
-msgstr ""
+msgstr "%d viac súborov"
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr ""
+msgstr "Pozícia Dock-u"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr ""
+msgstr "Režim bez rozptyľovania"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
-msgstr ""
+msgstr "Prepnúť režim bez rozptyľovania."
#: editor/editor_node.cpp
msgid "Add a new scene."
-msgstr ""
+msgstr "Pridať novú scénu."
#: editor/editor_node.cpp
msgid "Scene"
-msgstr ""
+msgstr "Scéna"
#: editor/editor_node.cpp
msgid "Go to previously opened scene."
-msgstr ""
+msgstr "Ísť do naposledy otvorenej scény."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "Kopírovať"
+msgstr "Kopírovať Text"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr ""
+msgstr "Ďalšia karta"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr ""
+msgstr "Minulá karta"
#: editor/editor_node.cpp
msgid "Filter Files..."
-msgstr ""
+msgstr "Filtrovať Súbory..."
#: editor/editor_node.cpp
msgid "Operations with scene files."
-msgstr ""
+msgstr "Operácie zo súbormi scén."
#: editor/editor_node.cpp
msgid "New Scene"
-msgstr ""
+msgstr "Nová Scéna"
#: editor/editor_node.cpp
msgid "New Inherited Scene..."
-msgstr ""
+msgstr "Nové Zdedené Scény..."
#: editor/editor_node.cpp
msgid "Open Scene..."
-msgstr ""
+msgstr "Otvoriť Scénu..."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Open Recent"
-msgstr ""
+msgstr "Otvoriť Posledné"
#: editor/editor_node.cpp
msgid "Save Scene"
-msgstr ""
+msgstr "Uložiť Scénu"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "Uložiť súbor"
+msgstr "Uložiť Všetky Scény"
#: editor/editor_node.cpp
msgid "Convert To..."
-msgstr ""
+msgstr "Konvertovať Do..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
-msgstr ""
+msgstr "MeshLibrary..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr ""
+msgstr "TileSet..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2706,210 +2716,236 @@ msgstr "Späť"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr ""
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
+msgstr "Prerobiť"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
-msgstr ""
+msgstr "Zmiešanosti projektových alebo scénových wide tool-ov."
#: editor/editor_node.cpp editor/project_manager.cpp
#: editor/script_create_dialog.cpp
msgid "Project"
-msgstr ""
+msgstr "Projekt"
#: editor/editor_node.cpp
msgid "Project Settings..."
-msgstr ""
+msgstr "Nastavenia Projektu..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control"
-msgstr ""
+msgstr "Kontrola Verzie"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "Nastaviť Kontrolu Verizie"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "Vypnúť Kontrolu Verzie"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "Upraviť..."
+msgstr "Export..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "Inštalovať Android Build Template..."
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
-msgstr ""
+msgstr "Otvoriť Project Data Folder"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
-msgstr ""
+msgstr "Nástroje"
#: editor/editor_node.cpp
msgid "Orphan Resource Explorer..."
-msgstr ""
+msgstr "Orphan Resource Explorer..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr ""
+msgstr "Odísť do Listu Projektov"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr ""
+msgstr "Debug"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr ""
+msgstr "Deploy-ovanie z Remote Debug-om"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
-msgstr ""
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
+msgstr "Malý Deploy z Network FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
+"Keď bude povolená táto možnosť, export alebo deploy vyprodukujú menej \n"
+"súboru executable.\n"
+"Filesystém bude z projektu poskytovaný editorom v sieti.\n"
+"Na Androide, predeploy budete potrebovať USB kábel pre rýchlejší výkon. Táto "
+"možnosť zrýchľuje proces testovania."
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr ""
+msgstr "Viditeľné Tvary Kolízie"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
+"Tvary Kolízie a raycast node-y (pre 2D a 3D) budú viditeľné po spustení hry "
+"ak budete mať zapnutú túto možnosť."
#: editor/editor_node.cpp
msgid "Visible Navigation"
-msgstr ""
+msgstr "Viditeľná Navigácia"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
+"Navigačné mesh-e a polygony budú viditeľné po spustení hry ak budete mať "
+"zapnutú túto možnosť."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Scene Changes"
+msgstr "Zmeny Synchronizácie Scény"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
+"Keď zapnete túto možnosť, akékoľvek zmeny v scéne v editore budú náhradné so "
+"spustenou hrou.\n"
+"Keď je použitá na diaľku v zariadení, je to viac efektívne z network "
+"filesystémom."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr ""
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "Zmeny Synchronizácie Scriptu"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
+"Keď je zapnutá táto Možnosť, akýkoľvek uložený script bude znovu načítaný v "
+"spustenej hre.\n"
+"Keď je použitá na diaľku zo zariadenia, toto je viac efektívnejšie z network "
+"filesystémom."
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
-msgstr ""
+msgstr "Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "Prechody"
+msgstr "Nastavenia Editora..."
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr ""
+msgstr "Layout Editora"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr ""
+msgstr "Spraviť Snímku Obrazovky"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr ""
+msgstr "Snímky obrázky sú uložené v Editor Data/Settings Folder."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr ""
+msgstr "Prepnúť na Celú Obrazovku"
#: editor/editor_node.cpp
msgid "Toggle System Console"
-msgstr ""
+msgstr "Prepnúť Systémovú Konzolu"
#: editor/editor_node.cpp
msgid "Open Editor Data/Settings Folder"
-msgstr ""
+msgstr "Otvoriť Editor Data/Settings Folder"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Otvoriť priečinok Editor Data"
#: editor/editor_node.cpp
msgid "Open Editor Settings Folder"
-msgstr ""
+msgstr "Otvoriť Priečinok Editor Settings"
#: editor/editor_node.cpp
msgid "Manage Editor Features..."
-msgstr ""
+msgstr "Spravovať Funkcie Editora..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "Všetky vybrané"
+msgstr "Spravovať Export Templates..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
-msgstr ""
+msgstr "Pomoc"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
-msgstr ""
+msgstr "Vyhľadať"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
-msgstr ""
+msgstr "Online Dokumentácie"
#: editor/editor_node.cpp
msgid "Q&A"
-msgstr ""
+msgstr "Q&A"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr ""
+msgid "Report a Bug"
+msgstr "Nahlásiť Bugy"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Poslať spätnú väzbu Dokumentácie"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2921,95 +2957,92 @@ msgstr "O nás"
#: editor/editor_node.cpp
msgid "Play the project."
-msgstr ""
+msgstr "Spustiť projekt."
#: editor/editor_node.cpp
msgid "Play"
-msgstr ""
+msgstr "Spustiť"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "Pozastavenie vykonávania scény kvôli debugg-ovaniu."
#: editor/editor_node.cpp
msgid "Pause Scene"
-msgstr ""
+msgstr "Pozastaviť Scénu"
#: editor/editor_node.cpp
msgid "Stop the scene."
-msgstr ""
+msgstr "Zastaviť scénu."
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr ""
+msgstr "Spustiť editovanú scénu."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr ""
+msgstr "Spustiť Scénu"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr ""
+msgstr "Spustiť vlastnú scénu"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr ""
+msgstr "Spustiť Vlastnú Scénu"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Zmena video driver-u vyžaduje reštart editora."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Uložiť súbor"
+msgstr "Uložiť & Reštartovať"
#: editor/editor_node.cpp
msgid "Spins when the editor window redraws."
-msgstr ""
+msgstr "Otáča sa, keď sa okno editora redistribuuje."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "Priebežný"
+msgstr "Aktualizovať priebežne"
#: editor/editor_node.cpp
msgid "Update When Changed"
-msgstr ""
+msgstr "Aktualizovať po Zmene"
#: editor/editor_node.cpp
msgid "Hide Update Spinner"
-msgstr ""
+msgstr "Skryť aktualizáciu Spinner"
#: editor/editor_node.cpp
msgid "FileSystem"
-msgstr ""
+msgstr "FileSystém"
#: editor/editor_node.cpp
msgid "Inspector"
-msgstr ""
+msgstr "Inšpektor"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr ""
+msgstr "Expandovať Spodný Panel"
#: editor/editor_node.cpp
msgid "Output"
-msgstr ""
+msgstr "Výstup"
#: editor/editor_node.cpp
msgid "Don't Save"
-msgstr ""
+msgstr "Neukladať"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
-msgstr ""
+msgstr "Android build template chýba, prosím nainštalujte príslušné šablóny."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "Všetky vybrané"
+msgstr "Spravovať Šablóny"
#: editor/editor_node.cpp
msgid ""
@@ -3021,6 +3054,13 @@ msgid ""
"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\"."
#: editor/editor_node.cpp
msgid ""
@@ -3029,199 +3069,198 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
+"V tomto projekte už je nainštalovaný Android build template a nemôže byť "
+"prepísaný.\n"
+"Manuálne odstránte \"res://android/build\" predtým ako sa znova pokúsite o "
+"túto operáciu."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
-msgstr ""
+msgstr "Importovať Šablóny Zo ZIP File-u"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Všetky vybrané"
+msgstr "Balík Šablón"
#: editor/editor_node.cpp
msgid "Export Library"
-msgstr ""
+msgstr "Exportovať Knižnicu"
#: editor/editor_node.cpp
msgid "Merge With Existing"
-msgstr ""
+msgstr "Zlúčiť s existujúcim"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
-msgstr ""
+msgstr "Otvoriť a vykonať skript"
#: editor/editor_node.cpp
-#, fuzzy
msgid "New Inherited"
-msgstr "Popis:"
+msgstr "Novo Zdedené"
#: editor/editor_node.cpp
msgid "Load Errors"
-msgstr ""
+msgstr "Načítať Chyby"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
-msgstr ""
+msgstr "Zvoliť"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open 2D Editor"
-msgstr "Otvorit priečinok"
+msgstr "Otvoriť 2D Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open 3D Editor"
-msgstr "Otvorit priečinok"
+msgstr "Otvoriť 3D Editor"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr ""
+msgstr "Otvoriť Editor Skriptov"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr ""
+msgstr "Otvoriť Knižnicu \"Assetov\""
#: editor/editor_node.cpp
msgid "Open the next Editor"
-msgstr ""
+msgstr "Otvoriť následujúci Editor"
#: editor/editor_node.cpp
msgid "Open the previous Editor"
-msgstr ""
+msgstr "Otvoriť predchádzajúci Editor"
#: editor/editor_node.h
msgid "Warning!"
-msgstr ""
+msgstr "Upozornenie!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
-msgstr ""
+msgstr "Nenašli sa žiadne \"sub-resources\"."
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr ""
+msgstr "Vytváranie Predzobrazenia Mesh-u"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
-msgstr ""
+msgstr "\"Thumbnail\"..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "Popis:"
+msgstr "Hlavný Script:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Signály:"
+msgstr "Editovať Plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
-msgstr ""
+msgstr "Nainštalované Plugins:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Update"
-msgstr ""
+msgstr "Update"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Version:"
-msgstr ""
+msgstr "Verzia:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Author:"
-msgstr ""
+msgstr "Autor:"
#: editor/editor_plugin_settings.cpp
msgid "Status:"
-msgstr ""
+msgstr "Status:"
#: editor/editor_plugin_settings.cpp
msgid "Edit:"
-msgstr ""
+msgstr "Edit:"
#: editor/editor_profiler.cpp
msgid "Measure:"
-msgstr ""
+msgstr "Opatrenia:"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
-msgstr ""
+msgstr "Čas Snímky (v sek.)"
#: editor/editor_profiler.cpp
msgid "Average Time (sec)"
-msgstr ""
+msgstr "Priemerný Čas (v sek.)"
#: editor/editor_profiler.cpp
msgid "Frame %"
-msgstr ""
+msgstr "Snímka %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr ""
+msgstr "Fyzická Snímka %"
#: editor/editor_profiler.cpp
msgid "Inclusive"
-msgstr ""
+msgstr "Inkluzívne"
#: editor/editor_profiler.cpp
msgid "Self"
-msgstr ""
+msgstr "Vlastné"
#: editor/editor_profiler.cpp
msgid "Frame #:"
-msgstr ""
+msgstr "Snímka #:"
#: editor/editor_profiler.cpp
msgid "Time"
-msgstr ""
+msgstr "Čas"
#: editor/editor_profiler.cpp
msgid "Calls"
-msgstr ""
+msgstr "Volania"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "Súbor:"
+msgstr "Editovať Text:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
-msgstr ""
+msgstr "Zapnúť"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Vrstva"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "Bit %d, hodnota %d"
#: editor/editor_properties.cpp
msgid "[Empty]"
-msgstr ""
+msgstr "[Prázdne]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr ""
+msgstr "Priradiť..."
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "Nesprávna veľkosť písma."
+msgstr "Nesprávny \"RID\""
#: editor/editor_properties.cpp
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
msgstr ""
+"Vybraný prostriedok (%s) sa nezhoduje žiadnemu typu pre túto vlastnosť (%s)."
#: editor/editor_properties.cpp
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Nepodarilo sa vytvoriť ViewportTextúru na zdroj uložený ako súbor.\n"
+"Zdroj musí patriť scéne."
#: editor/editor_properties.cpp
msgid ""
@@ -3230,28 +3269,30 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"Nepodarilo sa vytvoriť ViewportTextúru na tomto zdroji lebo není nastavený "
+"ako lokálna scéna.\n"
+"Prosím zmeňte ho vo vlastnosti 'local to scene' (a všetky zdroje ktoré ho "
+"obsahujú hore v node-e)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
-msgstr ""
+msgstr "Vybrať Viewport"
#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
msgid "New Script"
-msgstr "Popis:"
+msgstr "Nový Script"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Popis:"
+msgstr "\"Extendovaný\" Script"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
-msgstr ""
+msgstr "Nový %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Make Unique"
-msgstr ""
+msgstr "Spraviť Jedinečným"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3269,849 +3310,839 @@ msgstr "Vložiť"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Convert To %s"
-msgstr ""
+msgstr "Konvertovať Do %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
-msgstr ""
+msgstr "Vybraný node není Viewport!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "Veľkosť: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Strana: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr ""
+msgstr "Vymazať Predmet"
#: editor/editor_properties_array_dict.cpp
msgid "New Key:"
-msgstr ""
+msgstr "Nový Kľúč:"
#: editor/editor_properties_array_dict.cpp
msgid "New Value:"
-msgstr ""
+msgstr "Nová Hodnota:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Pridať Kľúč/Hodnota \"Pair\""
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
+"Pre túto platformu sa nenašiel žiadny spustiteľný \"export preset\" .\n"
+"Prosím pridajte spustiteľný \"preset\" v export menu."
#: editor/editor_run_script.cpp
msgid "Write your logic in the _run() method."
-msgstr ""
+msgstr "Napíšte svoju logiku v metóde _run()."
#: editor/editor_run_script.cpp
msgid "There is an edited scene already."
-msgstr ""
+msgstr "Už tu je editovaná scéna."
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
-msgstr ""
+msgstr "Nepodarilo sa inštancovať script:"
#: editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
-msgstr ""
+msgstr "Zabudli ste skratku pre 'tool'?"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr ""
+msgstr "Nepodarilo sa spustiť script:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
+msgstr "Nezabudli ste na metódu '_run'?"
+
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
msgstr ""
+"Podržte Ctrl na zaokrúhlenie na celé čísla. Podržte Shift pre viac precízne "
+"zmeny."
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
-msgstr ""
+msgstr "Vyberte Node(y) pre Importovanie"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
-msgstr ""
+msgstr "Vyhladať"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
-msgstr ""
+msgstr "Cesta Scény:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr ""
+msgstr "Importovať Z Node-u:"
#: editor/export_template_manager.cpp
msgid "Redownload"
-msgstr ""
+msgstr "Preinštalovať"
#: editor/export_template_manager.cpp
msgid "Uninstall"
-msgstr ""
+msgstr "Odinštalovať"
#: editor/export_template_manager.cpp
msgid "(Installed)"
-msgstr ""
+msgstr "(Nainštalované)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download"
-msgstr ""
+msgstr "Stiahnuté"
#: editor/export_template_manager.cpp
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "Oficiálne export šablóny niesu dostupné pre \"development builds\"."
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr ""
+msgstr "(Chýba)"
#: editor/export_template_manager.cpp
msgid "(Current)"
-msgstr ""
+msgstr "(Aktuálny)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
-msgstr ""
+msgstr "Načítavanie zrkadiel, prosím čakajte..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr ""
+msgstr "Vymazať verziu šablóny '%s'?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
-msgstr ""
+msgstr "Nedá sa otvoriť export templates zip."
#: editor/export_template_manager.cpp
msgid "Invalid version.txt format inside templates: %s."
-msgstr ""
+msgstr "Neplatný version.txt formát vo vnútri šablón: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr ""
+msgstr "Nenašla sa žiadny version.txt vo vnútri šablón."
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
-msgstr ""
+msgstr "Chyba pri vytváraní cesty pre šablóny:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
-msgstr ""
+msgstr "Extrahovanie exportných šablón"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr ""
+msgstr "Importovanie:"
#: editor/export_template_manager.cpp
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "Chyba pri získavaní listu zrkadiel."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
+msgstr "Chyba pri rozbore JSON listu zrkadiel. Prosím nahláste túto chybu!"
#: editor/export_template_manager.cpp
msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
msgstr ""
+"Nenašli sa žiadne download linky pre túto verziu. Priame stiahnutie je "
+"dostupný iba pre \"official releases\"."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve."
-msgstr ""
+msgstr "Nerozpoznané."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect."
-msgstr ""
+msgstr "Nedá sa pripojiť."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response."
-msgstr ""
+msgstr "Žiadna odozva."
#: editor/export_template_manager.cpp
msgid "Request Failed."
-msgstr ""
+msgstr "Žiadosť Zlihala."
#: editor/export_template_manager.cpp
msgid "Redirect Loop."
-msgstr ""
+msgstr "Presmerovanie \"Loop-u\"."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed:"
-msgstr ""
+msgstr "Zlihalo:"
#: editor/export_template_manager.cpp
msgid "Download Complete."
-msgstr ""
+msgstr "Inštalácia je Dokončená."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "Nemôžete odstrániť:"
+msgstr "Nepodarilo sa vymazať dočasné súbory:"
#: editor/export_template_manager.cpp
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"Inštalácia šablón zlihala.\n"
+"Archívy problémových šablón nájdete v '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting URL:"
-msgstr ""
+msgstr "Chyba pri zadávaní URL:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
-msgstr ""
+msgstr "Prebieha Pripájanie do Zrkadla..."
#: editor/export_template_manager.cpp
msgid "Disconnected"
-msgstr ""
+msgstr "Odpojené"
#: editor/export_template_manager.cpp
msgid "Resolving"
-msgstr ""
+msgstr "Riešenie"
#: editor/export_template_manager.cpp
msgid "Can't Resolve"
-msgstr ""
+msgstr "Nepodarilo sa Vyriešiť"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connecting..."
-msgstr ""
+msgstr "Pripájanie..."
#: editor/export_template_manager.cpp
msgid "Can't Connect"
-msgstr ""
+msgstr "Nepodarilo sa pripojiť"
#: editor/export_template_manager.cpp
msgid "Connected"
-msgstr ""
+msgstr "Pripojené"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Requesting..."
-msgstr ""
+msgstr "Requestuje sa..."
#: editor/export_template_manager.cpp
msgid "Downloading"
-msgstr ""
+msgstr "Inštalovanie"
#: editor/export_template_manager.cpp
msgid "Connection Error"
-msgstr ""
+msgstr "Chyba pri Pripájaní"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr ""
+msgstr "Chyba SSL Handshake"
#: editor/export_template_manager.cpp
msgid "Uncompressing Android Build Sources"
-msgstr ""
+msgstr "Nekompresované \"Android Build Sources\""
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr ""
+msgstr "Aktuálna Verzia:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr ""
+msgstr "Inštalované Verzie:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr ""
+msgstr "Inštalovať Zo Súboru"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Remove Template"
-msgstr "Všetky vybrané"
+msgstr "Vymazať Šablónu"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
-msgstr "Vytvoriť adresár"
+msgstr "Vybrať Súbor Šablóny"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Všetky vybrané"
+msgstr "Godot Exportovanie Šablón"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
-msgstr ""
+msgstr "Exportovať Manažera Šablón"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Download Templates"
-msgstr "Všetky vybrané"
+msgstr "Stiahnuť Šablónu"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr ""
+msgstr "Vybrať zrkadlo z listu: (Shift+Click: Open in Browser)"
#: editor/filesystem_dock.cpp
msgid "Favorites"
-msgstr ""
+msgstr "Obľúbené"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
+"Status:Import súboru zlihal. Prosím opravte súbor a manuálne reimportujte."
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr ""
+msgstr "Nedá sa presunúť/premenovať \"resources root\"."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
-msgstr ""
+msgstr "Nadá sa presunúť pričinok do toho istého priečinku."
#: editor/filesystem_dock.cpp
msgid "Error moving:"
-msgstr ""
+msgstr "Chyba pri presúvaní:"
#: editor/filesystem_dock.cpp
msgid "Error duplicating:"
-msgstr ""
+msgstr "Chyba pri duplikovaní:"
#: editor/filesystem_dock.cpp
msgid "Unable to update dependencies:"
-msgstr ""
+msgstr "Nepodarilo sa update-nuť závislosti:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
-msgstr ""
+msgstr "Nieje uvedené žiadne meno."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters."
-msgstr ""
+msgstr "Toto meno obsahuje nepodporované písmená."
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr ""
+msgstr "Súbor alebo priečinok s tímto menom už existuje."
#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
-msgstr ""
+msgstr "Meno obsahuje neplatné písmená."
#: editor/filesystem_dock.cpp
msgid "Renaming file:"
-msgstr ""
+msgstr "Zostávajúce súbory:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr ""
+msgstr "Zostávajúce priečinky:"
#: editor/filesystem_dock.cpp
msgid "Duplicating file:"
-msgstr ""
+msgstr "Duplikovanie súborov:"
#: editor/filesystem_dock.cpp
msgid "Duplicating folder:"
-msgstr ""
+msgstr "Duplikovanie priečinka:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "Popis:"
+msgstr "Nová Zdedená Scéna"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Uložiť súbor"
+msgstr "Nastaviť ako Hlavnú Scénu"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "Otvoriť súbor(y)"
+msgstr "Otvoriť Scény"
#: editor/filesystem_dock.cpp
msgid "Instance"
-msgstr ""
+msgstr "Inštancie"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "Obľúbené:"
+msgstr "Pridať do Obľúbených"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "Všetky vybrané"
+msgstr "Odstrániť z Obľúbených"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr ""
+msgstr "Editovať Závislosti..."
#: editor/filesystem_dock.cpp
msgid "View Owners..."
-msgstr ""
+msgstr "Zobraziť Majiteľov..."
#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Rename..."
-msgstr ""
+msgstr "Premenovať..."
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
-msgstr ""
+msgstr "Duplikovať..."
#: editor/filesystem_dock.cpp
msgid "Move To..."
-msgstr ""
+msgstr "Presunúť Do..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "Popis:"
+msgstr "Nová Scéna..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "Popis:"
+msgstr "Nový Script..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Vytvoriť adresár"
+msgstr "Nový Prostriedok..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Expand All"
-msgstr ""
+msgstr "Expandovať Všetky"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Collapse All"
-msgstr ""
+msgstr "Collapse All"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
#: editor/scene_tree_dock.cpp
msgid "Rename"
-msgstr ""
+msgstr "Premenovať"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "Vytvoriť adresár"
+msgstr "Minulý Priečinok/Súbor"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "Vytvoriť adresár"
+msgstr "Ďalší Priečinok/Súbor"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
-msgstr ""
+msgstr "Preskenovať Filesystem"
#: editor/filesystem_dock.cpp
msgid "Toggle Split Mode"
-msgstr ""
+msgstr "Prepnúť Split Mode"
#: editor/filesystem_dock.cpp
msgid "Search files"
-msgstr ""
+msgstr "Vyhľadať súbory"
#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
+"Skenujem Súbory,\n"
+"Počkajte Prosím..."
#: editor/filesystem_dock.cpp
msgid "Move"
-msgstr ""
+msgstr "Presunúť"
#: editor/filesystem_dock.cpp
msgid "There is already file or folder with the same name in this location."
-msgstr ""
+msgstr "Už tu je súbor alebo priečinok pomenovaný rovnako."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Prepísať"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "Vytvoriť adresár"
+msgstr "Vytvoriť Scénu"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr ""
+msgstr "Vytvoriť Script"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "Súbor:"
+msgstr "Nájsť v Súboroch"
#: editor/find_in_files.cpp
msgid "Find:"
-msgstr ""
+msgstr "Nájsť:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Vytvoriť adresár"
+msgstr "Priečinok:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filter:"
+msgstr "Filtre:"
#: editor/find_in_files.cpp
msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
msgstr ""
+"Obsahuje súbory s následujúcimi extensiami. Pridajte ich alebo Odstránte v "
+"NastaveniachProjektu."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr ""
+msgstr "Nájsť..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
-msgstr ""
+msgstr "Nahradiť..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
-msgstr ""
+msgstr "Zrušiť"
#: editor/find_in_files.cpp
msgid "Find: "
-msgstr ""
+msgstr "Nájsť: "
#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr ""
+msgstr "Nahradiť: "
#: editor/find_in_files.cpp
msgid "Replace all (no undo)"
-msgstr ""
+msgstr "Nahradiť všetky (nedá sa vrátiť späť)"
#: editor/find_in_files.cpp
msgid "Searching..."
-msgstr ""
+msgstr "Vyhľadávam..."
#: editor/find_in_files.cpp
msgid "Search complete"
-msgstr ""
+msgstr "Vyhľadávanie bolo dokončené"
#: editor/groups_editor.cpp
msgid "Add to Group"
-msgstr ""
+msgstr "Pridať do Skupiny"
#: editor/groups_editor.cpp
msgid "Remove from Group"
-msgstr ""
+msgstr "Vymazať zo Skupiny"
#: editor/groups_editor.cpp
msgid "Group name already exists."
-msgstr ""
+msgstr "Meno skupiny už existuje."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "Nesprávna veľkosť písma."
+msgstr "Neplatné meno skupiny."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "Všetky vybrané"
+msgstr "Premenovať Skupinu"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "Všetky vybrané"
+msgstr "Zmazať Skupinu"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
-msgstr ""
+msgstr "Skupiny"
#: editor/groups_editor.cpp
msgid "Nodes Not in Group"
-msgstr ""
+msgstr "Node-y Nie sú v Skupine"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Filter nodes"
-msgstr "Filter:"
+msgstr "Filter Node-y"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
-msgstr ""
+msgstr "Node-y v Skupine"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
-msgstr ""
+msgstr "Prázdne Skupiny budú automaticky zmazané."
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "Otvorit priečinok"
+msgstr "Editor Skupín"
#: editor/groups_editor.cpp
msgid "Manage Groups"
-msgstr ""
+msgstr "Spravovať Skupiny"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
-msgstr ""
+msgstr "Importovať ako Samostatnú Scénu"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Animations"
-msgstr ""
+msgstr "Importovať z Oddelenými Animáciami"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials"
-msgstr ""
+msgstr "Importovať z Oddelenými Materiálmi"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects"
-msgstr ""
+msgstr "Importovať z Oddelenými Objektami"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials"
-msgstr ""
+msgstr "Importovať z Oddelenými Objektami+Materiálmi"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Animations"
-msgstr ""
+msgstr "Importovať z Oddelenými Objektami+Animáciami"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr ""
+msgstr "Importovať z Oddelenými Materiálmi+Animáciami"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr ""
+msgstr "Importovať z Oddelenými Objektami+Materiálmi+Animáciami"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
-msgstr ""
+msgstr "Importovať ako Dvojité Scény"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes+Materials"
-msgstr ""
+msgstr "Importovať ako Dvojité Scény+Materiály"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import Scene"
-msgstr ""
+msgstr "Importovať Scénu"
#: editor/import/resource_importer_scene.cpp
msgid "Importing Scene..."
-msgstr ""
+msgstr "Importujem Scénu..."
#: editor/import/resource_importer_scene.cpp
msgid "Generating Lightmaps"
-msgstr ""
+msgstr "Generovanie Lightmaps"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr ""
+msgstr "Generovanie pre Mesh: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
-msgstr ""
+msgstr "Spustiť Vlastný Script..."
#: editor/import/resource_importer_scene.cpp
msgid "Couldn't load post-import script:"
-msgstr ""
+msgstr "Nepodarilo sa načítať post-import script:"
#: editor/import/resource_importer_scene.cpp
msgid "Invalid/broken script for post-import (check console):"
-msgstr ""
+msgstr "Neplatný/rozbitý script pre post-import (prezrite konzolu):"
#: editor/import/resource_importer_scene.cpp
msgid "Error running post-import script:"
-msgstr ""
+msgstr "Chyba pri spustení post-import scriptu:"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "Vrátili ste Node-derived objekt v `post_import()` metóde?"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
-msgstr ""
+msgstr "Ukladám..."
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+msgid "%d Files"
+msgstr "%d Súbory"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
-msgstr ""
+msgid "Set as Default for '%s'"
+msgstr "Nastaviť ako Štandardné pre '%s'"
#: editor/import_dock.cpp
-#, fuzzy
-msgid " Files"
-msgstr "Súbor:"
+msgid "Clear Default for '%s'"
+msgstr "Vyčistiť Štandardné pre '%s'"
#: editor/import_dock.cpp
msgid "Import As:"
-msgstr ""
+msgstr "Importovať Ako:"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "Načítať predvolené"
+msgstr "Preset"
#: editor/import_dock.cpp
msgid "Reimport"
-msgstr ""
+msgstr "Reimportovať"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr ""
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Uložiť Scény, Re-Importovať, a Reštartovať"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
-msgstr ""
+msgstr "Mení sa typ impotovaného súboru, treba reštartovať editor."
#: editor/import_dock.cpp
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
msgstr ""
+"VAROVANIE: Položky ktoré existujú v tomto prostriedku, Sa nemusia načitať "
+"správne."
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
-msgstr ""
+msgstr "Nepodarilo sa načítať prostriedok."
#: editor/inspector_dock.cpp
msgid "Expand All Properties"
-msgstr ""
+msgstr "Expandovať Všetky Vlastnosti"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "Filter:"
+msgstr "Collapsovať Všetky Vlastnosti"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Save As..."
-msgstr ""
+msgstr "Uložiť Ako..."
#: editor/inspector_dock.cpp
msgid "Copy Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
+msgstr "Skopírovať Parametre"
#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
-msgstr ""
+msgstr "Editovať Clipboard Prostriedku"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
-msgstr ""
+msgstr "Skopírovať Prostriedok"
#: editor/inspector_dock.cpp
msgid "Make Built-In"
-msgstr ""
+msgstr "Spraviť Built-In"
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr ""
+msgstr "Spraviť Sub-Prostriedky Unikátne"
#: editor/inspector_dock.cpp
msgid "Open in Help"
-msgstr ""
+msgstr "Otvoriť v Pomoci"
#: editor/inspector_dock.cpp
msgid "Create a new resource in memory and edit it."
-msgstr ""
+msgstr "Vytvoriť nový prostriedok v pamäti a upraviť ho."
#: editor/inspector_dock.cpp
msgid "Load an existing resource from disk and edit it."
-msgstr ""
+msgstr "Načítať existujúci prostriedok z disku a upraviť ho."
#: editor/inspector_dock.cpp
msgid "Save the currently edited resource."
-msgstr ""
+msgstr "Uložiť aktuálne upravený prostriedok."
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
-msgstr ""
+msgstr "Ísť do histórie predchádzajúceho upravovaného objekta."
#: editor/inspector_dock.cpp
msgid "Go to the next edited object in history."
-msgstr ""
+msgstr "Ísť do ďalšej histórie upraveného objekta."
#: editor/inspector_dock.cpp
msgid "History of recently edited objects."
-msgstr ""
+msgstr "História upravených objektov."
#: editor/inspector_dock.cpp
msgid "Object properties."
-msgstr ""
+msgstr "Vlastnosti Objekta."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filter:"
+msgstr "Vlastnosti Filtra"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
-msgstr ""
+msgstr "Zmeny môžu byť stratené!"
#: editor/multi_node_edit.cpp
msgid "MultiNode Set"
-msgstr ""
+msgstr "MultiNode Set"
#: editor/node_dock.cpp
msgid "Select a single node to edit its signals and groups."
-msgstr ""
+msgstr "Vyberte jeden node aby ste mohli upraviť jeho signály a skupiny."
#: editor/plugin_config_dialog.cpp
msgid "Edit a Plugin"
-msgstr ""
+msgstr "Upraviť Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Vytvoriť adresár"
+msgstr "Vytvoriť Plugin"
#: editor/plugin_config_dialog.cpp
msgid "Plugin Name:"
-msgstr ""
+msgstr "Meno Pluginu:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Subfolder:"
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
msgid "Language:"
-msgstr ""
+msgstr "Jazyk:"
#: editor/plugin_config_dialog.cpp
msgid "Script Name:"
-msgstr ""
+msgstr "Meno Skriptu:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Aktivovať teraz?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "Vytvoriť adresár"
+msgstr "Vytvoriť Polygon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "Všetky vybrané"
+msgstr "Vytvoriť body."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
@@ -4119,30 +4150,30 @@ msgid ""
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
+"Upraviť body.\n"
+"LMB: Presunúť Bod\n"
+"RMB: Zmazať Bod"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Erase points."
-msgstr "Všetky vybrané"
+msgstr "Zmazať body."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
-msgstr "Signály:"
+msgstr "Upraviť Polygon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
-msgstr ""
+msgstr "Vložiť Bod"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Edit Polygon (Remove Point)"
-msgstr ""
+msgstr "Upraviť Polygon (Zmazať Bod)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Remove Polygon And Point"
-msgstr "Všetky vybrané"
+msgstr "Zmazať Polygon A Bod"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4150,55 +4181,51 @@ msgstr "Všetky vybrané"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Animation"
-msgstr ""
+msgstr "Pridať Animáciu"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Load..."
-msgstr ""
+msgstr "Načítať..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "Všetky vybrané"
+msgstr "Presunúť Bod Node-u"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Limits"
-msgstr ""
+msgstr "Zmeniť BlendSpace1D Limity"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Labels"
-msgstr ""
+msgstr "Zmeniť BlendSpace1D Označenia"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "Tento typ node-u nemôže byť použitý. Iba ak povolíte root node-y."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "Signály:"
+msgstr "Pridať Bod Node-u"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "Popis:"
+msgstr "Pridať Bod Animácie"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace1D Point"
-msgstr "Všetky vybrané"
+msgstr "Zmazať BlendSpace1D Bod"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
-msgstr ""
+msgstr "Presunúť BlendSpace1D Node Bod"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4208,164 +4235,164 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"StromAnimácie je neaktívny.\n"
+"Aktivujte aby ste povolili playback, zaškrtnite node warnings ak aktívacia "
+"nepôjde."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Nastaviť pozíciu blending v priestore"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Vyberte a premiestnite body, vytvorte body z RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
msgid "Enable snap and show grid."
-msgstr ""
+msgstr "Povoliť prichytenie a zobraziť mriežku."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Point"
-msgstr ""
+msgstr "Bod"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Otvorit priečinok"
+msgstr "Otvorit Editor"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Open Animation Node"
-msgstr ""
+msgstr "Otvoriť Node Animácie"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Triangle already exists."
-msgstr ""
+msgstr "Trojuholník už existuje."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "Signály:"
+msgstr "Pridať Trojuholník"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Limits"
-msgstr ""
+msgstr "Zmeniť Limity BlendSpace2D"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Labels"
-msgstr ""
+msgstr "Zmeniť Label BlendSpace2D"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace2D Point"
-msgstr "Všetky vybrané"
+msgstr "Vymazať BlendSpace2D Bod"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
-msgstr ""
+msgstr "Vymazať BlendSpace2D Trojuholník"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D nepatrí ku AnimationTree node."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
msgstr ""
+"Neexistujú žiadne trojuholníky, takže si nemôže zabrať miesto žiadny "
+"blending."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Toggle Auto Triangles"
-msgstr ""
+msgstr "Prepnúť Automatické Trojuholníky"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Vytvoriť trojuholníky spájaním bodov."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Vymazať body a trojuholníky."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Vygenerovať blend trojuholníky Automaticky (nie manuálne)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend:"
-msgstr ""
+msgstr "Blend:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Parameter Changed"
-msgstr ""
+msgstr "Parameter sa Zmenil"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filters"
-msgstr "Súbor:"
+msgstr "Upraviť Filtre"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Nemôžete pridať output node do blend tree."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Add Node to BlendTree"
-msgstr ""
+msgstr "Pridať Node do BlendTree"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Node Moved"
-msgstr ""
+msgstr "Node sa pohol"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
+msgstr "Nepodarilo sa pripojiť, port sa možno používa alebo je neplatný."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Nodes Connected"
-msgstr ""
+msgstr "Node-y Spojené"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Nodes Disconnected"
-msgstr ""
+msgstr "Node-y Odpojené"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "Popis:"
+msgstr "Nastaviť Animáciu"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Node"
-msgstr "Všetky vybrané"
+msgstr "Zmazať Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
-msgstr ""
+msgstr "Zmazať Node(y)"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Toggle Filter On/Off"
-msgstr ""
+msgstr "Zapnúť/Vypnúť Filter"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Change Filter"
-msgstr ""
+msgstr "Zmeniť Filter"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Nieje nastavený Animačný Prehrávač, takže sa nepodarilo získať mená trackov."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
+msgstr "Cesta prehrávača je neplatná, takže sa nepodarilo získať mená trackov."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -4373,312 +4400,302 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Animačný Prehrávač nemá žiadny platnú root node cestu, takže sa nepodarilo "
+"zistiť mená trackov."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "Klipy Animácie:"
+msgstr "Klipy Animácie"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "Zvukové Klipy:"
+msgstr "Zvukové Klipy"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "Funkcie:"
+msgstr "Funkcie"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Node Renamed"
-msgstr ""
+msgstr "Node Premenovaný"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node..."
-msgstr ""
+msgstr "Pridať Node..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Súbor:"
+msgstr "Upraviť Filtrované Tracky:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Enable Filtering"
-msgstr ""
+msgstr "Povoliť Filtrovanie"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
-msgstr ""
+msgstr "Prepnúť Autoplay"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr ""
+msgstr "Nové Meno Animácie:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
-msgstr ""
+msgstr "Nová Animácia"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr ""
+msgstr "Zmeniť Meno Animácie:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Animation?"
-msgstr ""
+msgstr "Naozaj chcete vymazať Animáciu?"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Remove Animation"
-msgstr ""
+msgstr "Vymazať Animáciu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Invalid animation name!"
-msgstr ""
+msgstr "Meno animácie je Vadné!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation name already exists!"
-msgstr ""
+msgstr "Toto meno Animácie už existuje!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Rename Animation"
-msgstr ""
+msgstr "Premenovať Animáciu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
-msgstr ""
+msgstr "Blend sa Ďalej Zmenil"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
-msgstr ""
+msgstr "Zmeniť Blend Time"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
-msgstr ""
+msgstr "Načítať Animáciu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
-msgstr ""
+msgstr "Duplikovať Animáciu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to copy!"
-msgstr ""
+msgstr "Žiadne animácie na skopírovanie!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation resource on clipboard!"
-msgstr ""
+msgstr "Žiadny zroj animácie v clipboard!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
-msgstr ""
+msgstr "Prilepená Animácia"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Paste Animation"
-msgstr ""
+msgstr "Prilepiť Animáciu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to edit!"
-msgstr ""
+msgstr "Žiadna animácia na úpravu!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
-msgstr ""
+msgstr "Spusťiť vybranú animáciu odzadu z aktuálnej pozície. (A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr ""
+msgstr "Spustiť vybranú animáciu odzadu z konca. (Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
-msgstr ""
+msgstr "Zastaviť playback animácie. (S)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
-msgstr ""
+msgstr "Spustiť vybranú animáciu od začiatku. (Shift+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
-msgstr ""
+msgstr "Spustiť vybranú animáciu z aktuálnej pozície. (D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation position (in seconds)."
-msgstr ""
+msgstr "Pozícia Animácie (v sekundách)."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Scale animation playback globally for the node."
-msgstr ""
+msgstr "Zväčšiť playback animácie globálne pre node."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
-msgstr ""
+msgstr "Animačné Náradie"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation"
-msgstr ""
+msgstr "Animácie"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Prechody"
+msgstr "Upraviť Prechody..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Otvorit priečinok"
+msgstr "Otvorit v Inšpektor-ovi"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
-msgstr ""
+msgstr "Zobraziť list animácii v prehrávači."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Autoplay on Load"
-msgstr ""
+msgstr "Autoplay pri Načítaní"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Enable Onion Skinning"
-msgstr ""
+msgstr "Povoliť Onion Skinning"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Onion Skinning Options"
-msgstr ""
+msgstr "Onion Skinning Možnosti"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Directions"
-msgstr "Popis:"
+msgstr "Smery"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Past"
-msgstr "Vložiť"
+msgstr "Minulosť"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Future"
-msgstr ""
+msgstr "Budúcnosť"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Depth"
-msgstr ""
+msgstr "Hĺbka"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
-msgstr ""
+msgstr "1 krok"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "2 steps"
-msgstr ""
+msgstr "2 kroky"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "3 steps"
-msgstr ""
+msgstr "3 kroky"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Differences Only"
-msgstr ""
+msgstr "Iba Odlišnosti"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Force White Modulate"
-msgstr ""
+msgstr "Force White Modulate"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
-msgstr ""
+msgstr "Zahŕňa Gizmos (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pin AnimationPlayer"
-msgstr ""
+msgstr "Pripnúť Prehrávač Animácie"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
-msgstr ""
+msgstr "Vytvoriť Novú Animáciu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Name:"
-msgstr ""
+msgstr "Meno Animácie:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
msgid "Error!"
-msgstr ""
+msgstr "Chyba!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
-msgstr ""
+msgstr "Blend Times:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
-msgstr ""
+msgstr "Ďalej (Automatický Rad):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
-msgstr ""
+msgstr "Cross-Animation Blend Times"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Move Node"
-msgstr "Vložiť"
+msgstr "Premiestniť Node"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Prechody"
+msgstr "Prechod existuje!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "Prechody"
+msgstr "Pridať Prechod"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node"
-msgstr ""
+msgstr "Pridať Node"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "Koniec"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Okamžite"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Synchronizácia"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Na Konci"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Cestovať"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Pre sub-prechod je potrebné začať a skončiť node-y."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "No playback resource set at path: %s."
-msgstr ""
+msgstr "Nieje nastavený žiadny zdrojový playback ako cesta: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Node Removed"
-msgstr ""
+msgstr "Node Zmazaný"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "Prechody"
+msgstr "Prechod Vymazaný"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
-msgstr ""
+msgstr "Nastaviť Začiatočný Node (Autoplay)"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4686,363 +4703,356 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Vybrať a premiestniť node-y.\n"
+"Pravím tlačítkom myši pridáte node-y.\n"
+"Shift+Lavé tlačíko myši vytvoriť pripojenie."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Vytvoriť adresár"
+msgstr "Vytvoriť Nové Node-y."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Connect nodes."
-msgstr ""
+msgstr "Spojiť Node-y."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Remove selected node or transition."
-msgstr "Odstrániť výber"
+msgstr "Vymazať označený node alebo prechod."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Prepnúť autoplay na tejto animácii pri štarte, reštarte alebo seek to zero."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Nastaviť koniec animácie. Toto je užitočné pre sub-prechody."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Prechody"
+msgstr "Prechody: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Cesta k Node:"
+msgstr "Prehrať Mód:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr ""
+msgstr "AnimačnýStrom"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
-msgstr ""
+msgstr "Nové Meno:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Scale:"
-msgstr ""
+msgstr "Veľkosť:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade In (s):"
-msgstr ""
+msgstr "Miznutie do (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade Out (s):"
-msgstr ""
+msgstr "Miznutie Von (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend"
-msgstr ""
+msgstr "Blend"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Mix"
-msgstr ""
+msgstr "Mix"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Auto Restart:"
-msgstr ""
+msgstr "Auto Reštart:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
-msgstr ""
+msgstr "Reštart (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Random Restart (s):"
-msgstr ""
+msgstr "Náhodný Reštart (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Start!"
-msgstr ""
+msgstr "Štart!"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Amount:"
-msgstr ""
+msgstr "Množstvo:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
-msgstr ""
+msgstr "Blend 0:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 1:"
-msgstr ""
+msgstr "Blend 1:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "X-Fade Time (s):"
-msgstr ""
+msgstr "Čas X-Miznutia (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Current:"
-msgstr ""
+msgstr "Aktuálny:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Input"
-msgstr ""
+msgstr "Pridať Vstup"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
-msgstr ""
+msgstr "Čistý Auto-Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
-msgstr ""
+msgstr "Nastaviť Auto-Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Delete Input"
-msgstr ""
+msgstr "Zmazať Vstup"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is valid."
-msgstr ""
+msgstr "Animačný Strom je platný."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is invalid."
-msgstr ""
+msgstr "Animačný Strom je neplatný."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation Node"
-msgstr ""
+msgstr "Animačný Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "OneShot Node"
-msgstr ""
+msgstr "OneShot Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Mix Node"
-msgstr ""
+msgstr "Mix Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend2 Node"
-msgstr ""
+msgstr "Blend2 Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend3 Node"
-msgstr ""
+msgstr "Blend3 Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend4 Node"
-msgstr ""
+msgstr "Blend4 Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeScale Node"
-msgstr ""
+msgstr "TimeScale Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeSeek Node"
-msgstr ""
+msgstr "TimeSeek Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
-msgstr ""
+msgstr "Prechodový Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Import Animations..."
-msgstr ""
+msgstr "Importovať Animácie..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr ""
+msgstr "Nastaviť Node Filtre"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
-msgstr ""
+msgstr "Filtre..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Contents:"
-msgstr "Konštanty:"
+msgstr "Obsah:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "View Files"
-msgstr "Súbor:"
+msgstr "Zobraziť Súbory"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
-msgstr ""
+msgstr "Chyba pripojenia, prosím skúste znovu."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect to host:"
-msgstr ""
+msgstr "Nepodarilo sa pripojiť k host:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response from host:"
-msgstr ""
+msgstr "Žiadna odozva od host-a:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve hostname:"
-msgstr ""
+msgstr "Nepodarilo sa rozlúštiť hostove meno:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
-msgstr ""
+msgstr "Žiadosť zlyhala, spätný kód:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed."
-msgstr ""
+msgstr "Žiadosť zlyhala."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Cannot save response to:"
-msgstr "Nemôžete odstrániť:"
+msgstr "Nepodarilo sa uložiť odpoveď do:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Write error."
-msgstr ""
+msgstr "Chyba písania."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
-msgstr ""
+msgstr "Žiadosť zlyhala, príliš veľa presmerovaní"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect loop."
-msgstr ""
+msgstr "Presmerovací loop."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, timeout"
-msgstr ""
+msgstr "Žiadosť zlyhala, čas vypršal"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Timeout."
-msgstr "Čas:"
+msgstr "Čas vypršal."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
-msgstr ""
+msgstr "Zlý download hash, za predpokladu že bolo narábané so súborom."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
-msgstr ""
+msgstr "Očakávané:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Got:"
-msgstr ""
+msgstr "Má:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed sha256 hash check"
-msgstr ""
+msgstr "Zlyhalo sha256 hash check"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
-msgstr ""
+msgstr "Zlyhalo Sťahovanie Prostriedku:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
-msgstr ""
+msgstr "Sťahovanie (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading..."
-msgstr ""
+msgstr "Sťahovanie..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
-msgstr ""
+msgstr "Rieši sa..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Error making request"
-msgstr ""
+msgstr "Pri vytváraní žiadosťi nastala chyba"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Idle"
-msgstr ""
+msgstr "Idle"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "Inštalovať"
+msgstr "Inštalovať..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
-msgstr ""
+msgstr "Skúsiť znova"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
-msgstr ""
+msgstr "Chyba Sťahovania"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
-msgstr ""
+msgstr "Sťahovanie tohoto prostriedku už prebieha!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "Nedávno Vylepšené"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Za Poslednú Dobu Najmenej Aktualizované"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "Meno (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "Meno (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "Licencia"
+msgstr "Licencia (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "Licencia"
+msgstr "Licencia (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
-msgstr ""
+msgstr "Prvý"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Previous"
-msgstr ""
+msgstr "Minulý"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
-msgstr ""
+msgstr "Ďalší"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Posledný"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "All"
-msgstr ""
+msgstr "Všetky"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr ""
+msgstr "Žiadne výsledky pre \"%s\"."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Import..."
-msgstr ""
+msgstr "Import..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Plugins..."
-msgstr ""
+msgstr "Pluginy..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
-msgstr ""
+msgstr "Zoradiť:"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
msgid "Category:"
-msgstr ""
+msgstr "Kategória:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Site:"
@@ -5050,23 +5060,23 @@ msgstr "Stránka:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Support"
-msgstr ""
+msgstr "Podpora"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
-msgstr ""
+msgstr "Oficiálne"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Testing"
-msgstr ""
+msgstr "Testovanie"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Loading..."
-msgstr ""
+msgstr "Načitávanie..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
-msgstr ""
+msgstr "Prostriedky Súboru ZIP"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid ""
@@ -5074,216 +5084,215 @@ msgid ""
"Save your scene (for images to be saved in the same dir), or pick a save "
"path from the BakedLightmap properties."
msgstr ""
+"Nedá sa určiť cesta pre uloženie lightmap obrázkov.\n"
+"Uložte svoju scénu (Aby sa obrázky na to isté miesto), alebo vyberte cestu "
+"na uloženie so BakedLightmap vlastností."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid ""
"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
"Light' flag is on."
msgstr ""
+"Žiadne mesh-e na bake. Uistite sa že obsahujú UV2 channel a je na ňom 'Bake "
+"Light' vlajka."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
+"Nepodarilo sa vytvoriť lightmap obrázok, uistite sa že či je cesta "
+"zapisovateľná."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Bake Lightmaps"
-msgstr ""
+msgstr "Bake Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
-msgstr ""
+msgstr "Predzobraziť"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
-msgstr ""
+msgstr "Konfigurovať Prichytenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Offset:"
-msgstr ""
+msgstr "Odchýlka Mriežky:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Step:"
-msgstr ""
+msgstr "Krok Mriežky:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
-msgstr ""
+msgstr "Všetky Primary Line:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "steps"
-msgstr ""
+msgstr "kroky"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
-msgstr ""
+msgstr "Odchýlka Rotácie:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
-msgstr ""
+msgstr "Krok Rotácie:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Step:"
-msgstr "Zmeniť veľkosť výberu"
+msgstr "Krok Veľkosti:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
-msgstr "Popis:"
+msgstr "Presunúť Vertikálny Návod"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "Popis:"
+msgstr "Vytvoriť Vertikálny Návod"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "Všetky vybrané"
+msgstr "Vymazať Vertikálny Návod"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
-msgstr "Všetky vybrané"
+msgstr "Presunúť Horizontálny Návod"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Popis:"
+msgstr "Vytvoriť Horizontálny Návod"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "Všetky vybrané"
+msgstr "Vymazať Horizontálny Návod"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
-msgstr "Popis:"
+msgstr "Vytvoriť Horizontálne a Vertikálne Návody"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "Všetky vybrané"
+msgstr "Presunúť pivot"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotate CanvasItem"
-msgstr ""
+msgstr "Otočiť CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move anchor"
-msgstr ""
+msgstr "Presunúť kovadlinu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Resize CanvasItem"
-msgstr ""
+msgstr "Zmeniť Veľkosť CanvasItem-u"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale CanvasItem"
-msgstr ""
+msgstr "Veľkosť CanvasItem-u"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
-msgstr ""
+msgstr "Presunúť CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"Children of containers have their anchors and margins values overridden by "
"their parent."
msgstr ""
+"Dieťa kontajnerov majú svoje kovadliny a okraje prepísané svojimi rodičmi."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Presets for the anchors and margins values of a Control node."
-msgstr ""
+msgstr "Prenastaviť pre kovadliny a okraje hodnoty Control node-u."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
msgstr ""
+"Pri aktivovaní, pohybovanim Control node-ov zmeníte ich kovadliny namiesto "
+"ich okrajov."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Left"
-msgstr ""
+msgstr "Vľavo Hore"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Right"
-msgstr ""
+msgstr "Vpravo Hore"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Right"
-msgstr ""
+msgstr "Vpravo Dole"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Left"
-msgstr ""
+msgstr "Vľavo Dole"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Left"
-msgstr ""
+msgstr "Od Stredu Vľavo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Top"
-msgstr ""
+msgstr "Od Stredu Hore"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Right"
-msgstr ""
+msgstr "Od Stredu Vpravo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Bottom"
-msgstr ""
+msgstr "Od Stredu Dole"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "V Strede"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
-msgstr "Lineárne"
+msgstr "Ľavá Šírka"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Top Wide"
-msgstr ""
+msgstr "Horná Šírka"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
-msgstr "Lineárne"
+msgstr "Pravá Šírka"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Bottom Wide"
-msgstr ""
+msgstr "Dolná Šírka"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr ""
+msgstr "VerStredná Šírka"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr ""
+msgstr "HorStredná Šírka"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Full Rect"
-msgstr ""
+msgstr "Plný Obdĺžnik"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Keep Ratio"
-msgstr ""
+msgstr "Udržovať Pomer"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
-msgstr ""
+msgstr "Iba Kovadliny"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Change Anchors and Margins"
-msgstr ""
+msgstr "Zmeniť Kovadliny a Okraje"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Change Anchors"
-msgstr ""
+msgstr "Zmeniť Kovadliny"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5291,6 +5300,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"Prepísanie Hernej Kamery\n"
+"Prepísať hernú kameru s viewport kamerou editora."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5298,104 +5309,103 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"Prepísanie Hernej Kamery\n"
+"Nieje spustená žiadna herná inštancia."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "Všetky vybrané"
+msgstr "Zamknúť Označené"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Unlock Selected"
-msgstr "Všetky vybrané"
+msgstr "Odomknúť Označené"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Group Selected"
-msgstr "Odstrániť výber"
+msgstr "Pridať Označené do Skupiny"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Ungroup Selected"
-msgstr "Odstrániť výber"
+msgstr "Odskupiť Označené"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
-msgstr ""
+msgstr "Prilepiť Pózu"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Guides"
-msgstr "Všetky vybrané"
+msgstr "Zmazať Návody"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Vytvoriť Vlastnú Kosť(i) z Node-u(ou)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Bones"
-msgstr "Všetky vybrané"
+msgstr "Zmazať Kosti"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
-msgstr ""
+msgstr "Vytvoriť IK Reťaz"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear IK Chain"
-msgstr ""
+msgstr "Zmazať IK Reťaz"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"Warning: Children of a container get their position and size determined only "
"by their parent."
msgstr ""
+"Upozornenie: Dieťa kontajnera získa ich pozíciu a veľkosť iba podľa svojho "
+"rodiča."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr ""
+msgstr "Resetovať Priblíženie"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr ""
+msgstr "Vybrať Režim"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
-msgstr ""
+msgstr "Potiahnutím: Otáčenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
-msgstr ""
+msgstr "Alt+Potiahnutie: Pohyb"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
msgstr ""
+"Stačte 'v' pre Zmenu Pivot-a, 'Shift+v' pre hýbanie s Pivot-om (keď sa hýbe)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr ""
+msgstr "Alt+RMB: Výber hĺbkového zoznamu"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
-msgstr ""
+msgstr "Move Mode"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr ""
+msgstr "Rotačný Režim"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
-msgstr ""
+msgstr "Zmena Veľkosti"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5403,187 +5413,186 @@ msgid ""
"Show a list of all objects at the position clicked\n"
"(same as Alt+RMB in select mode)."
msgstr ""
+"Zobraziť list všetkých objektov na kliknutej pozícii\n"
+"(rovnako ako Alt+RMB v výberovom režime)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
-msgstr ""
+msgstr "Kliknite pre zmenu rotačného pivota objektu."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan Mode"
-msgstr ""
+msgstr "Pohyb Mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "Režim Interpolácie"
+msgstr "Pravítko"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
-msgstr ""
+msgstr "Prepnúť smart prichytenie."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Smart Snap"
-msgstr ""
+msgstr "Použiť Smart Prichytenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle grid snapping."
-msgstr ""
+msgstr "Prepnúť Prichytenie Mriežky."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
-msgstr ""
+msgstr "Použiť Príchyt Mriežky"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
-msgstr ""
+msgstr "Možnosti Prichytávania"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
-msgstr ""
+msgstr "Použiť Prichytávanie Rotácie"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Scale Snap"
-msgstr ""
+msgstr "Použiť Prichytávanie Veľkosti"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
-msgstr ""
+msgstr "Prichytiť Relatívne"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Pixel Snap"
-msgstr ""
+msgstr "Použiť Pixelové Prichytenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Smart Snapping"
-msgstr ""
+msgstr "Smart Prichytávanie"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Configure Snap..."
-msgstr ""
+msgstr "Konfigurovať Prichytávanie..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Parent"
-msgstr ""
+msgstr "Prichytiť na Rodiča"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Anchor"
-msgstr ""
+msgstr "Prichytiť na Kovadlinu Node-u"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Sides"
-msgstr ""
+msgstr "Prichitiť na strany Node-u"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Center"
-msgstr ""
+msgstr "Prichytiť na Stred Node-u"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Other Nodes"
-msgstr "Vložiť"
+msgstr "Prichytiť na Ostatné Node-y"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Guides"
-msgstr ""
+msgstr "Prichytiť na Návody"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr ""
+msgstr "Zamknúť označený objekt na mieste (už sa s ním nebude dať hýbať)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
-msgstr ""
+msgstr "Odomknúť označený objekt (dá sa s ním hýbať)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Makes sure the object's children are not selectable."
-msgstr ""
+msgstr "Uistite sa že sa nedá označiť dieťa objektu."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
-msgstr ""
+msgstr "Aby ste označili dieťa objektu tak mu musíte obnoviť schopnosť."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Všetky vybrané"
+msgstr "Nastavenia Kostry"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
-msgstr ""
+msgstr "Zobraziť Kosti"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Vytvoriť Vlastnú Kosť(i) z Node-u(ou)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Custom Bones"
-msgstr ""
+msgstr "Zmazať Vlastné Kosti"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View"
-msgstr ""
+msgstr "Zobrazenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
-msgstr ""
+msgstr "Vždy Zobraziť Mriežku"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
-msgstr ""
+msgstr "Zobraziť Pomocníkov"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Rulers"
-msgstr ""
+msgstr "Zobraziť Pravítka"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Guides"
-msgstr ""
+msgstr "Zobraziť Návody"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Origin"
-msgstr ""
+msgstr "Zobraziť Pôvod"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Viewport"
-msgstr ""
+msgstr "Zobraziť Výrez"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Zobraziť Skupinu a Zamknúť Ikony"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr ""
+msgstr "Výber Stredu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr ""
+msgstr "Výber Frame-u"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
-msgstr ""
+msgstr "Predzobraziť Veľkosť Plátna"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
-msgstr ""
+msgstr "Prekladová maska na vkladanie kľúčov."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
-msgstr ""
+msgstr "Rotačná maska na vkladanie kľúčov."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale mask for inserting keys."
-msgstr ""
+msgstr "Veľkostná maska na vkladanie kľúčov."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert keys (based on mask)."
-msgstr ""
+msgstr "Vkladanie kľúčov (založené na maske)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5592,67 +5601,69 @@ msgid ""
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
+"Automaticky vložiť kľúče keď sú objekty preložené, rotované alebo zväčšené "
+"(založené na maske).\n"
+"Kľúče sú pridané iba do existujúcich track-ov, nebudú vytvorené žiadne nové "
+"tracky.\n"
+"Prvý krát musia byť kľúče vložené manuálne."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Auto Insert Key"
-msgstr "Animácia Vložiť Kľúč"
+msgstr "Automaticky Vložiť Kľúč"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Dĺžka Času Animácie (v sekundách)"
+msgstr "Animačný Kľúč a Možnosti Pozície"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr ""
+msgstr "Vložte Kľúč (Existujúce Tracky)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
-msgstr ""
+msgstr "Kopírovať Pozíciu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Pose"
-msgstr ""
+msgstr "Zmazať Pozíciu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
-msgstr ""
+msgstr "Zdvojnásobiť krok mriežky dvomi"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Divide grid step by 2"
-msgstr ""
+msgstr "vydeliť krok mriežky dvomi"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan View"
-msgstr ""
+msgstr "Zobrazenie Pan"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
-msgstr ""
+msgstr "Pridať %s"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Adding %s..."
-msgstr ""
+msgstr "Pridávanie %s..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
-msgstr ""
+msgstr "Nie je možné vytvoriť inštanciu viacerých node-ov bez koreňa."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Create Node"
-msgstr ""
+msgstr "Vytvoriť Node"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Error instancing scene from %s"
-msgstr ""
+msgstr "Chyba pri inštalácovaní scény z %s"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Change Default Type"
-msgstr "Zmeniť %s Typ"
+msgstr "Zmeniť Predvolený Typ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5661,221 +5672,230 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon3D"
-msgstr "Vytvoriť adresár"
+msgstr "Vytvoriť Polygon3D"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
-msgstr ""
+msgstr "Upraviť Poly"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly (Remove Point)"
-msgstr ""
+msgstr "Upraviť Poly (Odstrániť Bod)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
-msgstr ""
+msgstr "Nastaviť Rukoväť"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
-msgstr ""
+msgstr "Načíť Emisnú Masku"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "Uložiť súbor"
+msgstr "Reštartovať"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Clear Emission Mask"
-msgstr ""
+msgstr "Zmazať Emisnú Masku"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
-msgstr ""
+msgstr "Particly"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generated Point Count:"
-msgstr ""
+msgstr "Generovaný Bodový Počet:"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Mask"
-msgstr ""
+msgstr "Emisná Maska"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Solid Pixels"
-msgstr ""
+msgstr "Pevné Pixely"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Border Pixels"
-msgstr ""
+msgstr "Ohraničené Pixely"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "Priečinky a Súbory:"
+msgstr "Pixely s Priamym Ohraničením"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Capture from Pixel"
-msgstr ""
+msgstr "Snímanie z Pixelu"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Colors"
-msgstr ""
+msgstr "Emisné Farby"
#: editor/plugins/cpu_particles_editor_plugin.cpp
msgid "CPUParticles"
-msgstr ""
+msgstr "CPUParticly"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emission Points From Mesh"
-msgstr ""
+msgstr "Vytvoriť Emisné Body z Mesh-u"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emission Points From Node"
-msgstr ""
+msgstr "Vytvoriť Emisné Body z Node-u"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Flat 0"
-msgstr ""
+msgstr "Plochý 0"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Flat 1"
-msgstr ""
+msgstr "Plochý 1"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
msgid "Ease In"
-msgstr ""
+msgstr "Zvyšovanie"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
msgid "Ease Out"
-msgstr ""
+msgstr "Znižovanie"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Smoothstep"
-msgstr ""
+msgstr "Hladkýkrok"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Point"
-msgstr ""
+msgstr "Modifikovať Bod Krivky"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Tangent"
-msgstr ""
+msgstr "Modifikovať Tangetu Krivky"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Load Curve Preset"
-msgstr ""
+msgstr "Načítať Predvoľbu Krivky"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
-msgstr "Signály:"
+msgstr "Pridať Bod"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
-msgstr "Všetky vybrané"
+msgstr "Vymazať Bod"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Left Linear"
-msgstr "Lineárne"
+msgstr "Lineárne Vľavo"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right Linear"
-msgstr "Lineárne"
+msgstr "Lineárne Vpravo"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Load Preset"
-msgstr "Načítať predvolené"
+msgstr "Načítať Predvoľbu"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Curve Point"
-msgstr "Všetky vybrané"
+msgstr "Vymazať Bod Krivky"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Toggle Curve Linear Tangent"
-msgstr ""
+msgstr "Prepnúť Lineárnu Tangetu Krivky"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Hold Shift to edit tangents individually"
-msgstr ""
+msgstr "Podržte Shift aby ste upravili tangetu individuálne"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Right click to add point"
-msgstr ""
+msgstr "Pravým kliknutím pridáťe Bod"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
-msgstr ""
+msgstr "Vypiecť GI Probe"
#: editor/plugins/gradient_editor_plugin.cpp
msgid "Gradient Edited"
-msgstr ""
+msgstr "Prechod je Upravený"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
-msgstr ""
+msgstr "Predmet %d"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Items"
-msgstr ""
+msgstr "Predmety"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item List Editor"
-msgstr ""
+msgstr "List Editor Predmetov"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
-msgstr ""
+msgstr "Vytvoriť Occluder Polygon"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
-msgstr ""
+msgstr "Mesh je prázdny!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Nepodarilo sa vytvoriť Trimesh collision shape."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr ""
+msgid "Create Static Trimesh Body"
+msgstr "Vytvoriť Static Trimesh Telo"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
-msgstr ""
+msgstr "Toto nefunguje na koreni scény!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Shape"
+msgstr "Vytvoriť Trimesh Static Shape"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Vytvoriť adresár"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5927,19 +5947,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Vytvoriť adresár"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV1"
msgstr "Súbor:"
@@ -6473,11 +6531,11 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
-msgstr ""
+msgstr "Prichytiť"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
-msgstr ""
+msgstr "Povoliť Prichytávanie"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
@@ -6801,14 +6859,6 @@ msgid "Open Godot online documentation."
msgstr "Popis:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6874,11 +6924,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7253,6 +7303,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7304,7 +7358,7 @@ msgstr "Filter:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
-msgstr ""
+msgstr "Filmové Predzobrazenie"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
@@ -7343,26 +7397,35 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr ""
+msgstr "Prichytiť Node-y Na Zem"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr ""
+msgstr "Nepodarilo sa nájsť pevnú zem na prichytenie výberu."
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7377,7 +7440,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr ""
+msgstr "Použiť Prichytávanie"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7431,7 +7494,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
-msgstr ""
+msgstr "Prichytiť Objekt na Zem"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -7480,19 +7543,19 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
-msgstr ""
+msgstr "Nastavenie Prichytenia"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate Snap:"
-msgstr ""
+msgstr "Preložiť Preloženie:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
-msgstr ""
+msgstr "Prichytenie Rotácie (v stupňoch.):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
-msgstr ""
+msgstr "Prichytenie Veľkosti (%):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
@@ -7549,7 +7612,7 @@ msgstr "Vytvoriť adresár"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Mesh2D Preview"
-msgstr ""
+msgstr "Predzobraziť Mash2D"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7558,7 +7621,7 @@ msgstr "Vytvoriť adresár"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Polygon2D Preview"
-msgstr ""
+msgstr "Predzobraziť Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7566,9 +7629,8 @@ msgid "Create CollisionPolygon2D"
msgstr "Vytvoriť adresár"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "CollisionPolygon2D Preview"
-msgstr "Vytvoriť adresár"
+msgstr "Predzobraziť CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7576,9 +7638,8 @@ msgid "Create LightOccluder2D"
msgstr "Vytvoriť adresár"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "LightOccluder2D Preview"
-msgstr "Vytvoriť adresár"
+msgstr "Predzobraziť LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
@@ -7640,7 +7701,7 @@ msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Update Preview"
-msgstr ""
+msgstr "Predzobraziť Vylepšenie"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Settings:"
@@ -7702,7 +7763,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7774,7 +7835,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
-msgstr ""
+msgstr "Režim Prichytenia:"
#: editor/plugins/texture_region_editor_plugin.cpp
#: scene/resources/visual_shader.cpp
@@ -7783,11 +7844,11 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
-msgstr ""
+msgstr "Prichytenie Pixelov"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Grid Snap"
-msgstr ""
+msgstr "Prichytenie Mriežky"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
@@ -8213,6 +8274,7 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
+"Povoliť prichytávanie a zobraziť mriežku (konfigurovatelné cez inšpektor)."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display Tile Names (Hold Alt Key)"
@@ -8261,11 +8323,12 @@ msgid "Delete selected Rect."
msgstr "Všetky vybrané"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr "Vytvoriť adresár"
+msgstr ""
+"Vybrať aktuálne upravený pod-nadpis.\n"
+"Kliknite na ďalší Nadpis aby ste ho upravili."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8273,13 +8336,16 @@ msgid "Delete polygon."
msgstr "Všetky vybrané"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"LMB: Set bit on.\n"
"RMB: Set bit off.\n"
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
-msgstr "Vytvoriť adresár"
+msgstr ""
+"LMB: Zapnúť bit.\n"
+"RMB: Vypnúť bit.\n"
+"Shift+LMB: Nastaviť wildcard bit.\n"
+"Kliknite na ďalší Nadpis pre úpravu."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8295,11 +8361,12 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
-msgstr "Vytvoriť adresár"
+msgstr ""
+"Vybrať podnadpis aby ste zmenili jeho index.\n"
+"Kliknite na ďalší Nadpis na úpravu."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Region"
@@ -8413,7 +8480,7 @@ msgstr "Súbor:"
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9530,11 +9597,17 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Chyba pri otváraní súboru balíka, nie je vo formáte zip."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9542,11 +9615,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9765,6 +9838,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9814,6 +9888,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10135,7 +10216,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Plugins"
-msgstr ""
+msgstr "Pluginy"
#: editor/property_editor.cpp
msgid "Preset..."
@@ -10199,11 +10280,20 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Nahradiť: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10241,11 +10331,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10271,10 +10361,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10283,11 +10369,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10306,6 +10392,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10370,7 +10464,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Clear Script"
+msgid "Detach Script"
msgstr "Popis:"
#: editor/scene_tree_dock.cpp
@@ -10406,9 +10500,12 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Zmazať %d node-y a nejaké deti?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Všetky vybrané"
+msgstr "Zmazať %d node-y?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
@@ -10419,9 +10516,8 @@ msgid "Delete node \"%s\" and its children?"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Všetky vybrané"
+msgstr "Zmazať node \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10534,6 +10630,13 @@ msgid "Open Documentation"
msgstr "Popis:"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10582,11 +10685,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10617,9 +10720,8 @@ msgid "Button Group"
msgstr "Tlačidlo"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "Pripojiť Signál: "
+msgstr "(Pripájanie z)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
@@ -10712,6 +10814,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Súbor neexistuje."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Nesprávna veľkosť písma."
@@ -10754,6 +10860,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Neplatná cesta."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid class name."
msgstr "Neplatný Názov."
@@ -10763,7 +10873,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10789,6 +10899,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Trieda:"
@@ -10809,9 +10925,8 @@ msgid "Attach Node Script"
msgstr "Popis:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Remote "
-msgstr "Všetky vybrané"
+msgstr "Diaľkový "
#: editor/script_editor_debugger.cpp
msgid "Bytes:"
@@ -10866,6 +10981,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Všetky vybrané"
@@ -10916,8 +11035,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Exportovať Profil"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11199,7 +11319,7 @@ msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Snap View"
-msgstr ""
+msgstr "Prichytiť Zobrazenie"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Disabled"
@@ -11816,6 +11936,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11840,6 +11964,32 @@ msgstr "Nesprávna veľkosť písma."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12029,6 +12179,12 @@ msgstr ""
"Musíte nastaviť tvar objektu CollisionShape2D aby fungoval. Prosím, vytvorte "
"preň tvarový objekt!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12212,13 +12368,12 @@ msgid ""
msgstr ""
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"Musíte nastaviť tvar objektu CollisionShape2D aby fungoval. Prosím, vytvorte "
-"preň tvarový objekt!"
+"Aby CollisionShape fungoval musíte nastaviť tvar. Prosím, vytvorte preň "
+"tvarový objekt."
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12226,6 +12381,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12246,6 +12406,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12466,10 +12631,13 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "Nesprávna veľkosť písma."
+msgstr "Neplatný zdroj pre predzobrazenie."
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
@@ -12497,6 +12665,35 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Systém súborov a Import Dock-y"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Pri exportovaní alebo deploy-ovaní, súbor resulting executable sa pokúsi "
+#~ "o pripojenie do IP vášho počítača aby mohol byť debugg-ovaný."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "Aktuálna scéna sa nikdy neuložila, prosím uložte ju pred spustením."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Nieje v resource path."
+
+#~ msgid "Revert"
+#~ msgstr "Revert"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Túto akciu nie je možné vrátiť späť. Chcete Revertovatť aj tak?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Vrátiť Scénu"
+
+#, fuzzy
+#~ msgid "Clear Script"
+#~ msgstr "Popis:"
+
#, fuzzy
#~ msgid "Brief Description"
#~ msgstr "Popis:"
diff --git a/editor/translations/sl.po b/editor/translations/sl.po
index 6f63bb7483..a97fb1ae39 100644
--- a/editor/translations/sl.po
+++ b/editor/translations/sl.po
@@ -11,12 +11,13 @@
# Andrej Poženel <andrej.pozenel@outlook.com>, 2019.
# Arnold Marko <arnold.marko@gmail.com>, 2019.
# Alex <alexrixhardson@gmail.com>, 2019.
+# Andrew Poženel <andrej.pozenel@outlook.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-10-26 03:53+0000\n"
-"Last-Translator: Alex <alexrixhardson@gmail.com>\n"
+"PO-Revision-Date: 2020-07-15 02:42+0000\n"
+"Last-Translator: Andrew Poženel <andrej.pozenel@outlook.com>\n"
"Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/"
"godot/sl/>\n"
"Language: sl\n"
@@ -25,22 +26,22 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3;\n"
-"X-Generator: Weblate 3.9.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Neveljavna vrsta argumenta za convert(), uporabite TYPE_* konstanto."
+msgstr "Neveljavna vrsta argumenta za convert(), uporabite TYPE_* konstante."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Pričakovan niz dolžine 1 (znak)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Ni dovolj bajtov za dekodiranje, ali pa format ni ustrezen."
+msgstr "Ni dovolj bajtov za dekodiranje, ali pa je neveljaven format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -48,7 +49,7 @@ msgstr "Napačen vnos %i(ni podan) v izrazu"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "self ne more biti uporabljen, ker instanca ni null (ni podano)"
+msgstr "self ne more biti uporabljen, ker je instanca null (ni podano)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -115,9 +116,8 @@ msgid "Time:"
msgstr "Čas:"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Value:"
-msgstr "Novo ime:"
+msgstr "Vrednost:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
@@ -132,14 +132,12 @@ msgid "Delete Selected Key(s)"
msgstr "Izbriši Izbran/e Ključ/e"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Add Bezier Point"
-msgstr "Dodaj točko"
+msgstr "Dodaj Bezierjevo točko"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "Odstrani točko"
+msgstr "Premakni Bezierjevo točko"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -195,35 +193,33 @@ msgid "Anim Multi Change Call"
msgstr "Animacija Spremeni klic"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "Spremeni Ime Animacije:"
+msgstr "Spremeni dolžino animacije"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "Spremeni ponavljanje animacije"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Sled atributa"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Preoblikovanje"
+msgstr "Sled 3D preoblikovanja"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Sled klica funkcije"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Sled Bezierjeve Krivulje"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Zvočna Sled"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -559,6 +555,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -726,8 +723,9 @@ msgid "Line Number:"
msgstr "Številka Vrste:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Zamenjana %d ponovitev/e."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Zamenjaj"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -746,7 +744,7 @@ msgstr "Ujemanje Velikih Črk"
msgid "Whole Words"
msgstr "Cele Besede"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Zamenjaj"
@@ -798,6 +796,11 @@ msgstr "Metoda v ciljnem gradniku mora biti navedena!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Ime ni pravilen identifikator:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -885,7 +888,6 @@ msgstr "Povezovanje Signala:"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -946,6 +948,11 @@ msgid "Signals"
msgstr "Signali"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtriraj datoteke..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -986,7 +993,7 @@ msgid "Recent:"
msgstr "Nedavni:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Iskanje:"
@@ -1171,6 +1178,9 @@ msgstr "Ustanovitelji Projekta"
msgid "Lead Developer"
msgstr "Vodilni Razvajalec"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Upravljalnik Projekta "
@@ -1192,6 +1202,16 @@ msgid "Gold Sponsors"
msgstr "Zlati Sponzorji"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Srebrni Donatorji"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronasti Donatorji"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Majhni Sponzorji"
@@ -1514,7 +1534,7 @@ msgstr "Premakni SamodejnoNalaganje"
msgid "Remove Autoload"
msgstr "Odstrani SamodejnoNalaganje"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Omogoči"
@@ -1522,18 +1542,9 @@ msgstr "Omogoči"
msgid "Rearrange Autoloads"
msgstr "Preuredi SamodejnoNalaganje"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Neveljavna Pot."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Datoteka ne obstaja."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Ni na poti virov."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1560,6 +1571,10 @@ msgstr "Ime"
msgid "Singleton"
msgstr "Posameznik"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Prilepi Parametre"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Posodabljanje Scene"
@@ -1685,21 +1700,21 @@ msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "Uvozi"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
msgstr "Način Premika"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "DatotečniSistem"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "Uvozi"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "Zamenjaj Vse"
@@ -1866,7 +1881,7 @@ msgstr "Pokaži V Upravitelju Datotek"
msgid "New Folder..."
msgstr "Nova Mapa..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Osveži"
@@ -1988,7 +2003,7 @@ msgstr "Mape & Datoteke:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Predogled:"
@@ -2443,10 +2458,6 @@ msgid "There is no defined scene to run."
msgstr "Ni določene scene za zagon."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Trenutna scena ni bila shranjena, shranite jo pred zagonom."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Nemorem začeti podprocesa!"
@@ -2533,12 +2544,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "Ni mogoče osvežiti scene, ki ni bila shranjena."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Povrni"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Shrani Prizor"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Tega dejanja ni mogoče razveljaviti. Vseeno povrni?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2835,10 +2849,6 @@ msgid "Redo"
msgstr "Ponovi"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Povrni Prizor"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Različna projektna ali prizorska orodja."
@@ -2903,24 +2913,28 @@ msgstr "Uvajanje z Oddaljenim Razhroščevanjem"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Pri izvažanju ali uvajanju se bo končna izvršljiva datoteka razhroščevala, "
-"tako da se bo skušala povezati z IP-jem tega računalnika."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Kratko Uvajanje z Omrežjem FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Ko je ta možnost omogočena, se bo pri izvozu ali uvajanju ustvarila "
"minimalna izvršljiva datoteka.\n"
@@ -2933,9 +2947,10 @@ msgid "Visible Collision Shapes"
msgstr "Vidne Oblike Trka"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Gradniki oblike trka in prikaz žarka (za 2D in 3D) bodo vidni pri poteku "
"igre, če je ta možnost vklopljena."
@@ -2945,37 +2960,42 @@ msgid "Visible Navigation"
msgstr "Vidna Navigacija"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Če je ta možnost vključena, bodo navigacijske oblike in poligoni vidni pri "
"poteku igre."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Usklajuj Spremembe Prizora"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Ko je ta možnost vključena, bodo vse spremebe v prizoru ali urejevalniku "
"ponovljene med potekom igre."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Usklajuj Spremembe Skript"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Če je ta možnost vključena, bo vsaka shranjena skripta ponovno naložena v "
"igro, ki se izvaja.\n"
@@ -3047,7 +3067,7 @@ msgstr "Pomoč"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Iskanje"
@@ -3061,8 +3081,13 @@ msgid "Q&A"
msgstr "V&O"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Sledilnik Napak"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Ponovno Uvozi"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3457,9 +3482,11 @@ msgid "Add Key/Value Pair"
msgstr ""
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Za to platformo ni mogoče najti obstoječih izvoznih nastavitev.\n"
"V izvoznem meniju dodajte svoje nastavitve."
@@ -3488,6 +3515,10 @@ msgstr "Ni mogoče zagnati skripte:"
msgid "Did you forget the '_run' method?"
msgstr "Ali si pozabil metodo '_run' ?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Izberi Gradnik(e) za Uvoz"
@@ -4120,10 +4151,19 @@ msgid "Error running post-import script:"
msgstr "Napaka pri zagonu skripte po uvozu:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Shranjevanje..."
#: editor/import_dock.cpp
+#, fuzzy
+msgid "%d Files"
+msgstr " Datoteke"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Nastavi kot Privzeto za '%s'"
@@ -4132,10 +4172,6 @@ msgid "Clear Default for '%s'"
msgstr "Počisti privzeto za '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Datoteke"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Uvozi Kot:"
@@ -4149,7 +4185,7 @@ msgid "Reimport"
msgstr "Ponovno Uvozi"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4185,10 +4221,6 @@ msgid "Copy Params"
msgstr "Kopiraj Parametre"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Prilepi Parametre"
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "NAPAKA: Ni animacije virov na odložišču!"
@@ -5324,7 +5356,7 @@ msgid "Bake Lightmaps"
msgstr "Zapeči Svetlobne karte"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Predogled"
@@ -6122,28 +6154,46 @@ msgid "Mesh is empty!"
msgstr "Model je prazen!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a Trimesh collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Static Trimesh Body"
msgstr "Ustvari Statično Telo TriModel"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "This doesn't work on scene root!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "This doesn't work on scene root!"
+msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Trimesh Static Shape"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "Ustvari Nov %s"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "Mape ni mogoče ustvariti."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Ustvari Nov %s"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6195,19 +6245,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Ustvarite Poligon"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Ustvarite Poligon"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -7082,14 +7170,6 @@ msgid "Open Godot online documentation."
msgstr "Odpri Nedavne"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -7156,15 +7236,15 @@ msgid ""
msgstr "Odklopite '%s' iz '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "Vrstica:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "Dodaj Funkcijo"
@@ -7541,6 +7621,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7631,17 +7715,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -8003,7 +8096,7 @@ msgid "New Animation"
msgstr "Animacija"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8725,7 +8818,7 @@ msgstr "Izvozi Ploščno Zbirko"
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9858,11 +9951,18 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "Datoteka ne obstaja."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Napaka pri odpiranju datoteke paketa, ker ni v formatu zip."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9871,11 +9971,11 @@ msgstr "Izberite prazno mapo."
#: editor/project_manager.cpp
#, fuzzy
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr "Izberite datoteko 'projekt.godot'."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -10097,6 +10197,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Upravljalnik Projekta"
@@ -10148,6 +10249,13 @@ msgstr ""
"Trenutno nimate projektov.\n"
"Želite raziskovati uradne primere projektov v Asset Library?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10530,15 +10638,25 @@ msgid "Batch Rename"
msgstr "Preimenuj"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Zamenjaj"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Trenutna Različica:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Advanced Options"
msgstr "Možnosti pripenjanja"
@@ -10577,11 +10695,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10608,10 +10726,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10620,11 +10734,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10644,6 +10758,16 @@ msgstr ""
msgid "Reset"
msgstr "Ponastavi Povečavo/Pomanjšavo"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Trenutna Različica:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Veljavni znaki:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10707,8 +10831,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Odstrani Gradnik VizualnaSkripta"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10745,6 +10870,11 @@ msgstr "Shrani Prizor"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Izberi Gradnik"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Izberi Gradnik"
@@ -10874,6 +11004,13 @@ msgid "Open Documentation"
msgstr "Odpri Nedavne"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10924,12 +11061,14 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+#, fuzzy
+msgid "Detach the script from the selected node."
msgstr ""
+"Naredi primer iz izbranih prizorov, ki bo naslednik izbranega gradnika."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -11058,6 +11197,10 @@ msgid "A directory with the same name exists."
msgstr "Datoteka ali mapa s tem imenom že obstaja."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Datoteka ne obstaja."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Uporabiti moraš valjavno razširitev."
@@ -11102,6 +11245,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Neveljavna Pot."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Neveljavno ime."
@@ -11112,7 +11260,7 @@ msgstr "Neveljaveno prevzeto ime ali pot nadrejenega"
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr "Drevo animacije je veljavno."
#: editor/script_create_dialog.cpp
@@ -11140,6 +11288,12 @@ msgid "Script file already exists."
msgstr "SamodejnoNalaganje '%s' že obstaja!"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Razred:"
@@ -11218,6 +11372,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Izbriši točke"
@@ -11268,8 +11426,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Izvozi Projekt"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12179,6 +12338,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12203,6 +12366,32 @@ msgstr "Neveljavno ime."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12401,6 +12590,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12593,6 +12788,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12613,6 +12813,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12846,6 +13051,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12876,6 +13085,38 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Konstante ni možno spreminjati."
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "DatotečniSistem"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Pri izvažanju ali uvajanju se bo končna izvršljiva datoteka "
+#~ "razhroščevala, tako da se bo skušala povezati z IP-jem tega računalnika."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "Trenutna scena ni bila shranjena, shranite jo pred zagonom."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Ni na poti virov."
+
+#~ msgid "Revert"
+#~ msgstr "Povrni"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Tega dejanja ni mogoče razveljaviti. Vseeno povrni?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Povrni Prizor"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Sledilnik Napak"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Zamenjana %d ponovitev/e."
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
@@ -13070,10 +13311,6 @@ msgstr "Konstante ni možno spreminjati."
#~ msgid "Edit Variable:"
#~ msgstr "Uredi Spremenljivko:"
-#~ msgid "Instance the selected scene(s) as child of the selected node."
-#~ msgstr ""
-#~ "Naredi primer iz izbranih prizorov, ki bo naslednik izbranega gradnika."
-
#~ msgid "Line:"
#~ msgstr "Vrstica:"
diff --git a/editor/translations/sq.po b/editor/translations/sq.po
index 3c55191a34..6dd423a048 100644
--- a/editor/translations/sq.po
+++ b/editor/translations/sq.po
@@ -513,6 +513,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -673,8 +674,9 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr ""
+#, fuzzy
+msgid "%d replaced."
+msgstr "Zëvendëso..."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -693,7 +695,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -743,6 +745,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -828,7 +834,6 @@ msgstr "Lidh Sinjalin: "
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -888,6 +893,11 @@ msgid "Signals"
msgstr "Sinjalet"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtro Skedarët..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "A jeni i sigurt që doni të hiqni të gjitha lidhjet nga ky sinjal?"
@@ -925,7 +935,7 @@ msgid "Recent:"
msgstr "Të fundit:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Kërko:"
@@ -1110,6 +1120,9 @@ msgstr "Themeluesit e Projektit"
msgid "Lead Developer"
msgstr "Krye Zhvilluesi"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Menaxheri Projektit "
@@ -1131,6 +1144,16 @@ msgid "Gold Sponsors"
msgstr "Sponsorat Flori"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Dhuruesit Argjend"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Dhuruesit Bronz"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsorat"
@@ -1451,7 +1474,7 @@ msgstr "Lëviz Autoload-in"
msgid "Remove Autoload"
msgstr "Hiq Autoload-in"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Lejo"
@@ -1459,18 +1482,9 @@ msgstr "Lejo"
msgid "Rearrange Autoloads"
msgstr "Riorganizo Autoload-et"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Rruga e pasaktë."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Skedari nuk egziston."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Jo në rrugën e resurseve."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1497,6 +1511,10 @@ msgstr "Emri"
msgid "Singleton"
msgstr "Vetmitar"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Ngjit Parametrat"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Duke Përditësuar Skenën"
@@ -1629,21 +1647,21 @@ msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "Importo"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
msgstr "Nyje"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "FileSystem"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "Importo"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "Zëvendëso të gjitha (pa kthim pas)"
@@ -1804,7 +1822,7 @@ msgstr "Shfaq në Menaxherin e Skedarëve"
msgid "New Folder..."
msgstr "Folder i Ri..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Rifresko"
@@ -1922,7 +1940,7 @@ msgstr "Direktorit & Skedarët:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Shikim paraprak:"
@@ -2373,11 +2391,6 @@ msgid "There is no defined scene to run."
msgstr "Nuk ka një skenë të përcaktuar për të filluar."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Skena aktuale nuk është ruajtur më parë, ju lutem ruajeni para se të filloni."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Nuk mund të fillojë subprocess-in!"
@@ -2463,12 +2476,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "Nuk mund të ringarkojë një skenë që nuk është ruajtur më parë."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Rikthe"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Ruaj Skenën"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Ky veprim nuk mund të çbëhet. Rikthe gjithsesi?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2763,10 +2779,6 @@ msgid "Redo"
msgstr "Ribëj"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Rikthe Skenën"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Vegla të ndryshme për projektin ose skenën."
@@ -2830,24 +2842,28 @@ msgstr "Dorëzo me Rregullim në Largësi"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Kur eksporton ose dorëzon, rezultati i ekzekutueshëm do të tentoj të lidhet "
-"me IP-në e këtij kompjuteri në mënyrë që të rregullohet."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Dorëzim i Vogël me Rrjet FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Kur ky opsion është i aktivizuar, eksportimi ose dorëzimi do të prodhojë një "
"të ekzekutueshëm minimal.\n"
@@ -2860,9 +2876,10 @@ msgid "Visible Collision Shapes"
msgstr "Format e Përplasjes të Dukshme"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Format e përplasjes dhe nyjet 'raycast' (për 2D dhe 3D) do të jenë të "
"dukshme gjatë ekzekutimit të lojës nëse ky opsion është i aktivizuar."
@@ -2872,38 +2889,43 @@ msgid "Visible Navigation"
msgstr "Navigim i Dukshëm"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Rrjetat e navigimit dhe poligonet do të jenë të dukshme gjatë lojës nëse ky "
"opsion është i aktivizuar."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sinkronizo Nryshimet e Skenës"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Kur ky opsion është i aktivizuar, çdo ndryshim i bërë në këtë skenë do të "
"kopjohet dhe në lojën duke u ekzekutuar.\n"
"Kur përdoret në largësi është më efikas me rrjet 'filesystem'."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Sinkronizo Ndryshimet e Shkrimit"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Kurbky opsion është aktivizuar, çdo shkrim që ruhet do të ringarkohet në "
"lojën që është duke u ekzekutuar.\n"
@@ -2972,7 +2994,7 @@ msgstr "Ndihmë"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Kërko"
@@ -2986,8 +3008,13 @@ msgid "Q&A"
msgstr "Pyetje&Përgjigje"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Gjurmuesi i Problemeve"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Ri-importo"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3383,9 +3410,11 @@ msgid "Add Key/Value Pair"
msgstr "Shto Palë Çelës/Vlerë"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Nuk u gjet eksport paraprak i saktë për këtë platformë.\n"
"Ju lutem shtoni një eksport paraprak të saktë në menu."
@@ -3414,6 +3443,10 @@ msgstr "Nuk mund të ekzekutonte shkrimin:"
msgid "Did you forget the '_run' method?"
msgstr "A mos harrove metodën '_run'?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Zgjidh Nyjet Për ti Importuar"
@@ -4031,10 +4064,19 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Duke Ruajtur..."
#: editor/import_dock.cpp
+#, fuzzy
+msgid "%d Files"
+msgstr " Skedarët"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Vendos si të Parazgjedhur për '%s'"
@@ -4043,10 +4085,6 @@ msgid "Clear Default for '%s'"
msgstr "Pastro të Parazgjedhurat për '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Skedarët"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importo Si:"
@@ -4060,7 +4098,8 @@ msgid "Reimport"
msgstr "Ri-importo"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+#, fuzzy
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Ruaj skenat, ri-importo dhe rifillo"
#: editor/import_dock.cpp
@@ -4098,10 +4137,6 @@ msgid "Copy Params"
msgstr "Kopjo Parametrat"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Ngjit Parametrat"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Modifiko Resursin 'Clipboard'"
@@ -5162,7 +5197,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5912,11 +5947,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5928,11 +5963,28 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "Nuk mund të krijoj folderin."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5984,19 +6036,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Krijo një Poligon"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Krijo një Poligon"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6840,14 +6930,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6912,11 +6994,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7286,6 +7368,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7375,17 +7461,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7734,7 +7829,7 @@ msgid "New Animation"
msgstr "Animacionin i Ri"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8402,7 +8497,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9510,11 +9605,18 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "Skedari nuk egziston."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Gabim në hapjen e skedarit paketë, nuk është në formatin zip."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9522,11 +9624,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9746,6 +9848,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9794,6 +9897,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10172,14 +10282,24 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Zëvendëso: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Versioni Aktual:"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr ""
@@ -10214,11 +10334,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10244,10 +10364,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10256,11 +10372,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10279,6 +10395,16 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Versioni Aktual:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Karakteret e lejuar:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10342,8 +10468,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Shkrim i Ri"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10379,6 +10506,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Fshi Nyjen"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Fshi Nyjen"
@@ -10504,6 +10636,13 @@ msgid "Open Documentation"
msgstr "Hap të Fundit"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10553,11 +10692,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10684,6 +10823,10 @@ msgid "A directory with the same name exists."
msgstr "Një skedar ose folder me këtë emër ekziston që më parë."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Skedari nuk egziston."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Duhet të perdorësh një shtesë të lejuar."
@@ -10727,6 +10870,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Rruga e pasaktë."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Emër i palejuar."
@@ -10735,7 +10883,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10761,6 +10909,12 @@ msgid "Script file already exists."
msgstr "Emri i grupit ekziston që më parë."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Klasa:"
@@ -10838,6 +10992,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Krijo pika."
@@ -10888,8 +11046,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Eksporto Projektin"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11774,6 +11933,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11797,6 +11960,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11976,6 +12165,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12163,6 +12358,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12183,6 +12383,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12402,6 +12607,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
@@ -12430,6 +12639,37 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "FileSystem"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Kur eksporton ose dorëzon, rezultati i ekzekutueshëm do të tentoj të "
+#~ "lidhet me IP-në e këtij kompjuteri në mënyrë që të rregullohet."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Skena aktuale nuk është ruajtur më parë, ju lutem ruajeni para se të "
+#~ "filloni."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Jo në rrugën e resurseve."
+
+#~ msgid "Revert"
+#~ msgstr "Rikthe"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Ky veprim nuk mund të çbëhet. Rikthe gjithsesi?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Rikthe Skenën"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Gjurmuesi i Problemeve"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po
index 366c12b77c..1c68f56270 100644
--- a/editor/translations/sr_Cyrl.po
+++ b/editor/translations/sr_Cyrl.po
@@ -4,12 +4,13 @@
# This file is distributed under the same license as the Godot source code.
#
# Александар Урошевић <nicecubedude@gmail.com>, 2017.
-#
+# Младен Габић <cupakabra@protonmail.com>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2017-12-14 23:08+0000\n"
-"Last-Translator: Александар Урошевић <alek.sandar0@yandex.com>\n"
+"PO-Revision-Date: 2020-05-22 21:01+0000\n"
+"Last-Translator: Младен Габић <cupakabra@protonmail.com>\n"
"Language-Team: Serbian (cyrillic) <https://hosted.weblate.org/projects/godot-"
"engine/godot/sr_Cyrl/>\n"
"Language: sr_Cyrl\n"
@@ -17,79 +18,78 @@ msgstr ""
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.18-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "Погрешан тип аргумента за функију convert(), користи TYPE_* константе."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Очекиван стринг дужине 1 (карактер)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "Недовољно бајтова за дешифровање бајтова, или неважећи формат."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Неважећи унос %i (није прошао) у изразу"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self не може бити примењен јер је инстанца нула(није прошао)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "Неважећи поступци оператора %s, %s и %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr ""
+msgstr "Неважећи индекс врсте %s за основну врсту %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Неважећи именовани индекс '%s' за основну врсту %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ""
+msgstr "Неважећи аргументи ка конструкту '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "На позиву за '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "Б"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "КиБ"
#: core/ustring.cpp
-#, fuzzy
msgid "MiB"
-msgstr "Микс"
+msgstr "МиБ"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "ГиБ"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "ТиБ"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "ПиБ"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "ЕиБ"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -97,12 +97,12 @@ msgstr "Слободно"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Балансирано"
#: editor/animation_bezier_editor.cpp
#, fuzzy
msgid "Mirror"
-msgstr "Огледало X осе"
+msgstr "Огледало"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -111,32 +111,30 @@ msgstr "Време:"
#: editor/animation_bezier_editor.cpp
#, fuzzy
msgid "Value:"
-msgstr "Ново име:"
+msgstr "Вредност:"
#: editor/animation_bezier_editor.cpp
#, fuzzy
msgid "Insert Key Here"
-msgstr "Убаци кључеве"
+msgstr "Убаци кључ"
#: editor/animation_bezier_editor.cpp
#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Дуплирај одабрано"
+msgstr "Дуплирај одабрани Кључ/еве"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Обриши одабране датотеке?"
+msgstr "Обриши одабрани Кључ/еве"
#: editor/animation_bezier_editor.cpp
#, fuzzy
msgid "Add Bezier Point"
-msgstr "Додај тачку"
+msgstr "Додај Безиер Тачку"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "Помери тачку"
+msgstr "Помери Безиер Тачку"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -149,7 +147,7 @@ msgstr "Уколни кључеве"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Anim Change Keyframe Time"
-msgstr "Промени вредност"
+msgstr "Промени време КључОквира"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
@@ -204,25 +202,29 @@ msgid "Change Animation Loop"
msgstr "Промени циклус анимације"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Property Track"
-msgstr ""
+msgstr "Особине Трака"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "3D Transform Track"
-msgstr "Тип трансформације"
+msgstr "3Д Трака Трансформа"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Call Method Track"
-msgstr ""
+msgstr "Метод Позива Трака"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Безиер Крива Трака"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Аудио Репродукција Трака"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -251,8 +253,9 @@ msgstr "Скала анимације."
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Functions:"
-msgstr ""
+msgstr "Функције:"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -261,7 +264,7 @@ msgstr "Звучни слушалац"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Аним Клипови:"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -274,8 +277,9 @@ msgid "Toggle this track on/off."
msgstr "Укљ./Искљ. режим без сметње."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Режим ажурирања (Како је постављена ова особина)"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -283,8 +287,9 @@ msgid "Interpolation Mode"
msgstr "Анимациони чвор"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Круг Увијени Режим( Интерполирај крај са почетком на кругу)"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -319,8 +324,9 @@ msgid "Capture"
msgstr "Карактеристике"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Nearest"
-msgstr ""
+msgstr "Најближи"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -328,16 +334,19 @@ msgid "Linear"
msgstr "Линеаран"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Cubic"
-msgstr ""
+msgstr "Кубни"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Притегнут Круг Интерп"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Увијен Круг Интерп"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -398,8 +407,9 @@ msgid "Anim Insert"
msgstr "Налепи"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer не може сам себе да анимира, само друге плејере."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -425,31 +435,40 @@ msgstr "Преуреди аутоматска учитавања"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Трансформа траке само важи за Просторно-базиране нодове."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid ""
"Audio tracks can only point to nodes of type:\n"
"-AudioStreamPlayer\n"
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Аудио траке могу само усмеравати ка нодовима врсте:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Анимационе траке могу само усмеравати ка AnimationPlayer нодовима"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "Анимациони плејер не може анимирати самог себе, само друге плејере."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Није могуже додати нову траку без корена"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Неважећа трака за Безиер ( нема прикладних под-особина)"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -457,12 +476,14 @@ msgid "Add Bezier Track"
msgstr "Додај нову траку"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Путања траке је неважећа, па је кључ немогуће додати."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Трака није врсте Просторна, немогуће убацити кључ."
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -475,8 +496,9 @@ msgid "Add Track Key"
msgstr "Додај нову траку"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Трака путање је неважећа, немогуће додати кључ методе."
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -484,8 +506,9 @@ msgid "Add Method Track Key"
msgstr "Уметни траку и кључ"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Method not found in object: "
-msgstr ""
+msgstr "Метода није нађена у објекту:"
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
@@ -506,11 +529,13 @@ msgid "Anim Scale Keys"
msgstr "Увећај кључеве"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "Ова операција не ради за Безиер уређивање, пошто је само једна трака."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid ""
"This animation belongs to an imported scene, so changes to imported tracks "
"will not be saved.\n"
@@ -522,10 +547,20 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
+"Ова анимација припада увезеној сцени, па промене на увезеној траци неће бити "
+"сачуване.\n"
+"\n"
+"Да омогућиш способност додавања прилагођених трака, упути се ка увозним "
+"подешавањима сцене и постави\n"
+"\"Анимација > Складиште\" у \"Фајлови\", омогући \"Анимација > Сачувај "
+"прилагођене траке\", онда поново увези.\n"
+"Алтернативно, користи увозна подешавања која увозе анимације у засебне "
+"фајлове."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "Упозорење: Уређивање увезене анимације"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -533,12 +568,14 @@ msgid "Select an AnimationPlayer node to create and edit animations."
msgstr "Одабери AnimationPlayer из дрвета сцене за уређивање анимација."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Прикажи само траке из нодова одабраних у стаблу"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Групиши траке по нодовима или их прикажи као чист текст."
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -551,10 +588,12 @@ msgid "Animation step value."
msgstr "Анимационо дрво је важеће."
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Seconds"
-msgstr ""
+msgstr "Секунди"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -618,12 +657,14 @@ msgid "Clean-Up Animation"
msgstr "Очистите анимацију"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Одабери нод који ће бити анимиран:"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Користи Безиер Криве"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -694,12 +735,14 @@ msgid "Add Audio Track Clip"
msgstr "Звучни слушалац"
#: editor/animation_track_editor_plugins.cpp
+#, fuzzy
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "Промени Размак Аудио Траке од Почетка"
#: editor/animation_track_editor_plugins.cpp
+#, fuzzy
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "Промени Размак Аудио Траке од Краја"
#: editor/array_property_edit.cpp
msgid "Resize Array"
@@ -722,17 +765,19 @@ msgid "Line Number:"
msgstr "Број линије:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Замени %d појаве/а."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Замени..."
#: editor/code_editor.cpp editor/editor_help.cpp
+#, fuzzy
msgid "%d match."
-msgstr ""
+msgstr "%d подударања."
#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
msgid "%d matches."
-msgstr "Нема подудара"
+msgstr "Нема подударања."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -742,7 +787,7 @@ msgstr "Подударање великих и малих слова"
msgid "Whole Words"
msgstr "Целе речи"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Замени"
@@ -756,8 +801,9 @@ msgstr "Само одабрано"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
+#, fuzzy
msgid "Standard"
-msgstr ""
+msgstr "Стандард"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
@@ -780,12 +826,14 @@ msgid "Reset Zoom"
msgstr "Ресетуј увеличање"
#: editor/code_editor.cpp
+#, fuzzy
msgid "Warnings"
-msgstr ""
+msgstr "Упозорење"
#: editor/code_editor.cpp
+#, fuzzy
msgid "Line and column numbers."
-msgstr ""
+msgstr "Линија и колона бројева."
#: editor/connections_dialog.cpp
#, fuzzy
@@ -794,6 +842,11 @@ msgstr "Метода у циљаном чвору мора бити наведе
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Име није важећи идентификатор:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -861,17 +914,19 @@ msgid "Deferred"
msgstr "Одложен"
#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr ""
+msgstr "Одлаже сигнал, памти га у ред и пали га само за време чекања."
#: editor/connections_dialog.cpp
msgid "Oneshot"
msgstr "Једном"
#: editor/connections_dialog.cpp
+#, fuzzy
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "Одкачиње сигнал после првог емитовања."
#: editor/connections_dialog.cpp
#, fuzzy
@@ -882,7 +937,6 @@ msgstr "Везујући сигнал:"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -936,16 +990,23 @@ msgid "Edit Connection:"
msgstr "Повезивање не успешно"
#: editor/connections_dialog.cpp
+#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr ""
+msgstr "Сигурно желиш да уклониш све везе са \"%s\" сигналом?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "Сигнали"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Филтрирај датотеке..."
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Сугурно желиш да уклониш све везе са овог сигнала?"
#: editor/connections_dialog.cpp
#, fuzzy
@@ -968,8 +1029,9 @@ msgid "Change %s Type"
msgstr "Измени уобичајен тип"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+#, fuzzy
msgid "Change"
-msgstr ""
+msgstr "Промени"
#: editor/create_dialog.cpp
#, fuzzy
@@ -986,7 +1048,7 @@ msgid "Recent:"
msgstr "Честе:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Тражи:"
@@ -1172,6 +1234,9 @@ msgstr "Оснивачи пројекта"
msgid "Lead Developer"
msgstr "Главни девелопер"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
#, fuzzy
msgid "Project Manager "
@@ -1194,6 +1259,16 @@ msgid "Gold Sponsors"
msgstr "Златни спонзори"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Сребрни донатори"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Бронзани донатори"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Мали спонзори"
@@ -1262,8 +1337,9 @@ msgid "Uncompressing Assets"
msgstr "Декомпресија средства"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+#, fuzzy
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "Неуспело извлачење следећих фалова из паковања:"
#: editor/editor_asset_installer.cpp
#, fuzzy
@@ -1373,8 +1449,9 @@ msgid "Delete Effect"
msgstr "Обриши ефекат"
#: editor/editor_audio_buses.cpp
+#, fuzzy
msgid "Audio"
-msgstr ""
+msgstr "Аудио"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
@@ -1413,8 +1490,9 @@ msgid "Open Audio Bus Layout"
msgstr "Отвори распоред звучног баса"
#: editor/editor_audio_buses.cpp
+#, fuzzy
msgid "There is no '%s' file."
-msgstr ""
+msgstr "Нема '%s' фајла."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -1492,8 +1570,9 @@ msgid "Must not collide with an existing global constant name."
msgstr "Неважеће име. Име је резервисано за постојећу глобалну константу."
#: editor/editor_autoload_settings.cpp
+#, fuzzy
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "Кључна реч не може бити употребљена као ауто-учитавајуће име"
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
@@ -1515,7 +1594,7 @@ msgstr "Помери аутоматско учитавање"
msgid "Remove Autoload"
msgstr "Обриши аутоматско учитавање"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Укључи"
@@ -1523,18 +1602,9 @@ msgstr "Укључи"
msgid "Rearrange Autoloads"
msgstr "Преуреди аутоматска учитавања"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Неважећи пут."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Датотека не постоји."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Није на пут ресурса."
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1561,6 +1631,10 @@ msgstr "Име"
msgid "Singleton"
msgstr "Синглетон"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Налепи параметре"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Ажурирање сцене"
@@ -1579,8 +1653,9 @@ msgid "[empty]"
msgstr "(празно)"
#: editor/editor_data.cpp
+#, fuzzy
msgid "[unsaved]"
-msgstr ""
+msgstr "[несачувано]"
#: editor/editor_dir_dialog.cpp
#, fuzzy
@@ -1618,32 +1693,44 @@ msgid "Storing File:"
msgstr "Складиштење датотеке:"
#: editor/editor_export.cpp
+#, fuzzy
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "Извозни образац није нађен на очекиваној путањи:"
#: editor/editor_export.cpp
msgid "Packing"
msgstr "Паковање"
#: editor/editor_export.cpp
+#, fuzzy
msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"Циљана платформа захтева 'ETC' компресију текстуре за GLES2. Омогући 'Увоз "
+"Etc' у подешавањима пројекта."
#: editor/editor_export.cpp
+#, fuzzy
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"Циљана платформа захтева 'ETC2 компресију текстуре за GLES3. Омогући 'Увоз "
+"Etc 2' у подешавањима пројекта."
#: editor/editor_export.cpp
+#, fuzzy
msgid ""
"Target platform requires 'ETC' texture compression for the driver fallback "
"to GLES2.\n"
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"Циљана платформа захтева 'ETC' компресију текстуре за повратак управљача "
+"GLES2.\n"
+"Омогући 'Увоз Etc' у подешавањима пројекта, или онемогући 'Поваратак "
+"Управљача Омогућен'."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1655,8 +1742,9 @@ msgstr "Шаблонска датотека није пронађена:\n"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
+#, fuzzy
msgid "Custom release template not found."
-msgstr ""
+msgstr "Прилагођени образци објаве нису пронађени."
#: editor/editor_export.cpp platform/javascript/export/export.cpp
#, fuzzy
@@ -1664,8 +1752,9 @@ msgid "Template file not found:"
msgstr "Шаблонска датотека није пронађена:\n"
#: editor/editor_export.cpp
+#, fuzzy
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
+msgstr "На 32-битним извозима уграђени PCK не може бити већи од 4 GiB."
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1683,13 +1772,9 @@ msgid "Asset Library"
msgstr "Отвори библиотеку средства"
#: editor/editor_feature_profile.cpp
-msgid "Scene Tree Editing"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "Увоз"
+msgid "Scene Tree Editing"
+msgstr "Едитовање Стабла Сцене"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1698,17 +1783,23 @@ msgstr "Режим померања"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "Датотечни систем"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "Увоз"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "Замени све"
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
+msgstr "Профил мора имати важеће име фајла и не сме садржати '.'"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1716,8 +1807,9 @@ msgid "Profile with this name already exists."
msgstr "Датотека или директоријум са овим именом већ постоји."
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(Уређивач Онемогућен, Својства Омогућена)"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1755,14 +1847,16 @@ msgid "Enabled Classes:"
msgstr "Потражи класе"
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "Фајл '%s' формат је неважећи, увоз отказан."
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
-msgstr ""
+msgstr "Профил '%s' већ постоји. Уклони га пре увоза, увоз отказан."
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1770,8 +1864,9 @@ msgid "Error saving profile to path: '%s'."
msgstr "Грешка при чувању TileSet!"
#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Unset"
-msgstr ""
+msgstr "Поништи"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1870,7 +1965,7 @@ msgstr "Покажи у менаџеру датотека"
msgid "New Folder..."
msgstr "Нови директоријум..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Освежи"
@@ -1992,7 +2087,7 @@ msgstr "Директоријуми и датотеке:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Преглед:"
@@ -2009,10 +2104,13 @@ msgid "ScanSources"
msgstr "Скенирање извора"
#: editor/editor_file_system.cpp
+#, fuzzy
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
msgstr ""
+"Постоји више увозника за различите врсте који показују на фајл %s, увоз "
+"отказан"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
@@ -2050,8 +2148,9 @@ msgid "Properties"
msgstr "Особине"
#: editor/editor_help.cpp
+#, fuzzy
msgid "override:"
-msgstr ""
+msgstr "препиши"
#: editor/editor_help.cpp
#, fuzzy
@@ -2190,16 +2289,19 @@ msgid "Theme Property"
msgstr "Особине"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+#, fuzzy
msgid "Property:"
-msgstr ""
+msgstr "Особина:"
#: editor/editor_inspector.cpp
+#, fuzzy
msgid "Set"
-msgstr ""
+msgstr "Постави"
#: editor/editor_inspector.cpp
+#, fuzzy
msgid "Set Multiple:"
-msgstr ""
+msgstr "Постави Више:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -2237,8 +2339,9 @@ msgid "Start"
msgstr "Започни!"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
#, fuzzy
@@ -2246,51 +2349,62 @@ msgid "Down"
msgstr "Преучми"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "Up"
-msgstr ""
+msgstr "Горе"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
msgstr "Чвор"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "Incoming RPC"
-msgstr ""
+msgstr "Долазећи RPC"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "Incoming RSET"
-msgstr ""
+msgstr "Долазећи RSET"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "Outgoing RPC"
-msgstr ""
+msgstr "Одлазећи RPC"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "Outgoing RSET"
-msgstr ""
+msgstr "Одлазећи RSET"
#: editor/editor_node.cpp editor/project_manager.cpp
+#, fuzzy
msgid "New Window"
-msgstr ""
+msgstr "Нов Прозор"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "Увезени ресурси не могу бити упамћени."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
+#, fuzzy
msgid "OK"
-msgstr ""
+msgstr "ОК"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
msgstr "Грешка при чувању ресурса!"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
msgstr ""
+"Овај ресурс не може бити упамћен пошто не припада едитованој сцени. Прво га "
+"учини јединственим."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
@@ -2309,8 +2423,9 @@ msgid "Error while saving."
msgstr "Грешка при чувању."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Неуспело отварање '%s'. Фајл је можда померен или обрисан."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2345,10 +2460,13 @@ msgid "This operation can't be done without a tree root."
msgstr "Ова операција се не може обавити без корена дрвета."
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
+"Ова сцена не може бити упамћена зато што има укључење кружног инстанцирања\n"
+"Прво га отклони и онда поново пробај да упамтиш."
#: editor/editor_node.cpp
#, fuzzy
@@ -2358,8 +2476,9 @@ msgid ""
msgstr "Не могу сачувати сцену. Вероватно зависности нису задовољене."
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Немогуће преписивање сцене која је и даље отворена!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2449,10 +2568,6 @@ msgid "There is no defined scene to run."
msgstr "Не постоји дефинисана сцена за покретање."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Тренутна сцена није сачувана, молим сачувајте је пре покретања."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Не могу покренути подпроцес!"
@@ -2491,8 +2606,9 @@ msgid "Saved %s modified resource(s)."
msgstr "Грешка при учитавању ресурса."
#: editor/editor_node.cpp
+#, fuzzy
msgid "A root node is required to save the scene."
-msgstr ""
+msgstr "За памћене сцене неопходан је корени нод."
#: editor/editor_node.cpp
msgid "Save Scene As..."
@@ -2539,12 +2655,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "Не могу поново учитати сцену која није сачувана."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Врати"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Сачувај сцену"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Ова акција се не може опозвати. Настави?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2723,8 +2842,9 @@ msgid "Close Other Tabs"
msgstr "Затвори остале зупчанике"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "Затвори Табове са Десна"
#: editor/editor_node.cpp
#, fuzzy
@@ -2840,10 +2960,6 @@ msgid "Redo"
msgstr "Поново уради"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Поврати сцену"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Разни алати за пројекат или сцену."
@@ -2863,12 +2979,14 @@ msgid "Version Control"
msgstr "Верзија:"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Set Up Version Control"
-msgstr ""
+msgstr "Постави Контролу Верзије"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "Угаси Контролу Верзије"
#: editor/editor_node.cpp
#, fuzzy
@@ -2876,8 +2994,9 @@ msgid "Export..."
msgstr "Извоз"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "Инсталирај Android образце градње"
#: editor/editor_node.cpp
#, fuzzy
@@ -2908,24 +3027,28 @@ msgstr "Извршити са удаљеним дебагом"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"При извозу или извршавању, крајља датотека ће покушати да се повеже са "
-"адресом овог рачунара како би се могла дебаговати."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Мали извоз са Network FS"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Када је ова опција укључена, извоз ће правити датотеку најмање могуће "
"величине.\n"
@@ -2938,9 +3061,10 @@ msgid "Visible Collision Shapes"
msgstr "Видљиви облици судара"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Облици судара и чворова зракова (за 2Д и 3Д) ћу бити видљиви током игре ако "
"је ова опција укључена."
@@ -2950,23 +3074,26 @@ msgid "Visible Navigation"
msgstr "Видљива навигација"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Навигационе мреже и полигони ће бити видљиви током игре ако је ова опција "
"укључена."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Синхронизуј промене сцене"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Када је ова опција укључена, све промене сцене ће бити приказане у "
"покренутој игри.\n"
@@ -2974,15 +3101,17 @@ msgstr ""
"мрежним датотечним системом."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Синхронизуј промене скриптица"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Када је ова опција укључена, све скриптице које се сачувају ће бити поново "
"учитане у покренутој игри.\n"
@@ -3027,8 +3156,9 @@ msgid "Open Editor Data/Settings Folder"
msgstr "Поставке уредника"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Отвори Фолдер Уређивача Података"
#: editor/editor_node.cpp
#, fuzzy
@@ -3054,7 +3184,7 @@ msgstr "Помоћ"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Тражи"
@@ -3068,8 +3198,14 @@ msgid "Q&A"
msgstr "Питања и одговори"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Пратилац грешака"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Поново увези"
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid "Send Docs Feedback"
+msgstr "Пошаљи Подржку о Документацији"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3077,7 +3213,7 @@ msgstr "Заједница"
#: editor/editor_node.cpp
msgid "About"
-msgstr "О програму"
+msgstr "О"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -3088,8 +3224,9 @@ msgid "Play"
msgstr "Покрени"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "Паузирај извршење сцене зарад отклањања грешки."
#: editor/editor_node.cpp
msgid "Pause Scene"
@@ -3116,8 +3253,9 @@ msgid "Play Custom Scene"
msgstr "Покрени специфичну сцену"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Промена видео управљача захтева рестартовање уређивача."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
@@ -3167,8 +3305,9 @@ msgid "Don't Save"
msgstr "Немој сачувати"
#: editor/editor_node.cpp
+#, fuzzy
msgid "Android build template is missing, please install relevant templates."
-msgstr ""
+msgstr "Недостаје Android образац за изградњу, инсталирај релевантне обрасце."
#: editor/editor_node.cpp
#, fuzzy
@@ -3176,6 +3315,7 @@ msgid "Manage Templates"
msgstr "Управљај извозним шаблонима"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
"This will set up your project for custom Android builds by installing the "
"source template to \"res://android/build\".\n"
@@ -3185,14 +3325,26 @@ msgid ""
"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 извозним "
+"подешавањима."
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
"The Android build template is already installed in this project and it won't "
"be overwritten.\n"
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
+"Android образац градње је већ инсталиран у овај пројекат и неће бити "
+"преписан.\n"
+"Уклони \"res://android/build\" директоријум ручно пре поновног покушавања "
+"ове операције."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
@@ -3252,8 +3404,9 @@ msgid "Open the previous Editor"
msgstr "Отвори претходни уредник"
#: editor/editor_node.h
+#, fuzzy
msgid "Warning!"
-msgstr ""
+msgstr "Упозорење!"
#: editor/editor_path.cpp
#, fuzzy
@@ -3356,12 +3509,14 @@ msgid "On"
msgstr ""
#: editor/editor_properties.cpp
+#, fuzzy
msgid "Layer"
-msgstr ""
+msgstr "Лајер"
#: editor/editor_properties.cpp
+#, fuzzy
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "Бит %d, вредност %d"
#: editor/editor_properties.cpp
#, fuzzy
@@ -3369,8 +3524,9 @@ msgid "[Empty]"
msgstr "Додај празан"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+#, fuzzy
msgid "Assign..."
-msgstr ""
+msgstr "Додели..."
#: editor/editor_properties.cpp
#, fuzzy
@@ -3378,45 +3534,60 @@ msgid "Invalid RID"
msgstr "Неважеће име."
#: editor/editor_properties.cpp
+#, fuzzy
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
msgstr ""
+"Одабрани ресурс (%s) не одговара ни једној очекиваној врсти за ову особину "
+"(%s)."
#: editor/editor_properties.cpp
+#, fuzzy
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Неуспело креирање ViewportTexture на ресурсима упамћеним као фајл\n"
+"Ресурси морају припадати сцени."
#: editor/editor_properties.cpp
+#, fuzzy
msgid ""
"Can't create a ViewportTexture on this resource because it's not set as "
"local to scene.\n"
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"Неуспело креирање ViewportTexture на ресурсима, није постављено као локално "
+"према сцени\n"
+"Пребаци на 'локално према сцени' особину ( и сви ресурси који их садрже "
+"све до нода)."
#: editor/editor_properties.cpp editor/property_editor.cpp
+#, fuzzy
msgid "Pick a Viewport"
-msgstr ""
+msgstr "Одабери Viewport"
#: editor/editor_properties.cpp editor/property_editor.cpp
+#, fuzzy
msgid "New Script"
-msgstr ""
+msgstr "Нова Скрипта"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Extend Script"
-msgstr "Покрени скриптицу"
+msgstr "Надовежи Скрипту"
#: editor/editor_properties.cpp editor/property_editor.cpp
+#, fuzzy
msgid "New %s"
-msgstr ""
+msgstr "Нов %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
+#, fuzzy
msgid "Make Unique"
-msgstr ""
+msgstr "Учини Јединственим"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3433,20 +3604,24 @@ msgid "Paste"
msgstr "Налепи"
#: editor/editor_properties.cpp editor/property_editor.cpp
+#, fuzzy
msgid "Convert To %s"
-msgstr ""
+msgstr "Пребаци у %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
+#, fuzzy
msgid "Selected node is not a Viewport!"
-msgstr ""
+msgstr "Одабрани нод није Viewport!"
#: editor/editor_properties_array_dict.cpp
+#, fuzzy
msgid "Size: "
-msgstr ""
+msgstr "Величина:"
#: editor/editor_properties_array_dict.cpp
+#, fuzzy
msgid "Page: "
-msgstr ""
+msgstr "Страна:"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -3456,21 +3631,24 @@ msgstr "Обриши ставку"
#: editor/editor_properties_array_dict.cpp
#, fuzzy
msgid "New Key:"
-msgstr "Ново име:"
+msgstr "Нов кључ:"
#: editor/editor_properties_array_dict.cpp
#, fuzzy
msgid "New Value:"
-msgstr "Ново име:"
+msgstr "Нова вредност:"
#: editor/editor_properties_array_dict.cpp
+#, fuzzy
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Додај Кључ/Вредност пар"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Нису пронађене поставке извоза за ову платформу.\n"
"Молим, додајте поставке у менију за извоз."
@@ -3499,13 +3677,19 @@ msgstr "Неуспех при покретању скриптице:"
msgid "Did you forget the '_run' method?"
msgstr "Да ли сте заборавили методу „_run“?"
+#: editor/editor_spin_slider.cpp
+#, fuzzy
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr "Држи Ctrl да испустиш Узимача. Држи Shift да испустиш општи потпис."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Одабери чвор/ове за увоз"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
+#, fuzzy
msgid "Browse"
-msgstr ""
+msgstr "Потражи"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
@@ -3534,8 +3718,9 @@ msgid "Download"
msgstr "Преучми"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "Званични извозни нацрти нису доступни за развојну градњу."
#: editor/export_template_manager.cpp
msgid "(Missing)"
@@ -3580,12 +3765,15 @@ msgid "Importing:"
msgstr "Увожење:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "Грешка у добијању листе огледала."
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Error parsing JSON of mirror list. Please report this issue!"
msgstr ""
+"Грешка при JSON обради са листе огледала. Молимо пријавите овај проблем!"
#: editor/export_template_manager.cpp
msgid ""
@@ -3634,10 +3822,13 @@ msgid "Cannot remove temporary file:"
msgstr "Неуспех при чувању теме:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"Инсталација нацрта неуспешна.\n"
+"Архиве проблематичних нацрта могу би нађене на '%s'."
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3933,8 +4124,9 @@ msgid "There is already file or folder with the same name in this location."
msgstr "Датотека или директоријум са овим именом већ постоји."
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Overwrite"
-msgstr ""
+msgstr "Препиши"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3966,10 +4158,13 @@ msgid "Filters:"
msgstr "Филтери..."
#: editor/find_in_files.cpp
+#, fuzzy
msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
msgstr ""
+"Урачунај фајлове са следећим екстензијама. Додај или обриши их у "
+"ПодешавањимаПројекта"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3981,8 +4176,9 @@ msgid "Replace..."
msgstr "Замени..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+#, fuzzy
msgid "Cancel"
-msgstr ""
+msgstr "Откажи"
#: editor/find_in_files.cpp
#, fuzzy
@@ -4048,8 +4244,9 @@ msgstr "Додај у групу"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Filter nodes"
-msgstr ""
+msgstr "Филтрирај чворове"
#: editor/groups_editor.cpp
#, fuzzy
@@ -4057,8 +4254,9 @@ msgid "Nodes in Group"
msgstr "Додај у групу"
#: editor/groups_editor.cpp
+#, fuzzy
msgid "Empty groups will be automatically removed."
-msgstr ""
+msgstr "Празне групе биће аутоматски уклоњене."
#: editor/groups_editor.cpp
#, fuzzy
@@ -4146,10 +4344,19 @@ msgid "Error running post-import script:"
msgstr "Грешка при обрађивању пост-увозне скриптице:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Чување..."
#: editor/import_dock.cpp
+#, fuzzy
+msgid "%d Files"
+msgstr " %d Датотеке"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Постави као уобичајено за „%s“"
@@ -4158,10 +4365,6 @@ msgid "Clear Default for '%s'"
msgstr "Обриши уобичајено за „%s“"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Датотеке"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Увези као:"
@@ -4175,17 +4378,22 @@ msgid "Reimport"
msgstr "Поново увези"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr ""
+#, fuzzy
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "Упамти Сцену, Опет Увези, и Рестартуј"
#: editor/import_dock.cpp
+#, fuzzy
msgid "Changing the type of an imported file requires editor restart."
-msgstr ""
+msgstr "Промена врсте увезених фајлова захтева рестарт уређивача."
#: editor/import_dock.cpp
+#, fuzzy
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
msgstr ""
+"УПОЗОРЕЊЕ: Постоје средства која користе овај ресурс, могу престати да се "
+"учитавају правилно."
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
@@ -4211,10 +4419,6 @@ msgid "Copy Params"
msgstr "Копирај параметре"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Налепи параметре"
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "Нема ресурса за копирање!"
@@ -4266,7 +4470,7 @@ msgstr "Поставке објекта."
#: editor/inspector_dock.cpp
#, fuzzy
msgid "Filter properties"
-msgstr "Поставке објекта."
+msgstr "Пречисти особине"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -4284,33 +4488,37 @@ msgstr "Одабери чвор за мењање сигнала и група."
#: editor/plugin_config_dialog.cpp
#, fuzzy
msgid "Edit a Plugin"
-msgstr "Измени полигон"
+msgstr "Измени Прикључак"
#: editor/plugin_config_dialog.cpp
#, fuzzy
msgid "Create a Plugin"
-msgstr "Направи ивице"
+msgstr "Направи Прикључак"
#: editor/plugin_config_dialog.cpp
#, fuzzy
msgid "Plugin Name:"
-msgstr "Прикључци"
+msgstr "Име Прикључка :"
#: editor/plugin_config_dialog.cpp
+#, fuzzy
msgid "Subfolder:"
-msgstr ""
+msgstr "ПодФолдер:"
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
+#, fuzzy
msgid "Language:"
-msgstr ""
+msgstr "Језик:"
#: editor/plugin_config_dialog.cpp
+#, fuzzy
msgid "Script Name:"
-msgstr ""
+msgstr "Име Скрипте:"
#: editor/plugin_config_dialog.cpp
+#, fuzzy
msgid "Activate now?"
-msgstr ""
+msgstr "Активирај сад?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4323,7 +4531,7 @@ msgstr "Направи полигон"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
msgid "Create points."
-msgstr "Обриши тачке"
+msgstr "Направи тачке."
#: editor/plugins/abstract_polygon_2d_editor.cpp
#, fuzzy
@@ -4397,8 +4605,10 @@ msgstr "Промени време мешања"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Ова врста чвора се не може користити. Само корени чворови су дозвољени."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4418,32 +4628,40 @@ msgid "Remove BlendSpace1D Point"
msgstr "Обриши тачку путање"
#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
msgid "Move BlendSpace1D Node Point"
-msgstr ""
+msgstr "Помери BlendSpace1D Чворну Тачку"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree је неактивно.\n"
+"Активирај да омогућиш репродукцију, провери чвор упозорења ако активација не "
+"успе."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Постави стопљиву позицију са размаком"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Одабери и помери тачке, направи тачке са RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+#, fuzzy
msgid "Enable snap and show grid."
-msgstr ""
+msgstr "Омогући лепљење и прикажи мрежу."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4469,12 +4687,12 @@ msgstr "Анимациони чвор"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
msgid "Triangle already exists."
-msgstr "Грешка: име анимације већ постоји!"
+msgstr "Троугао већ постоји."
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
msgid "Add Triangle"
-msgstr "Додај нову траку"
+msgstr "Додај Троугао"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
@@ -4492,33 +4710,39 @@ msgid "Remove BlendSpace2D Point"
msgstr "Обриши тачку путање"
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "Remove BlendSpace2D Triangle"
-msgstr ""
+msgstr "Уклони BlendSpace2D Троугао"
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D не припада AnimationTree чвору."
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Троуглови не постоје, па се утапање не може догодити."
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
msgid "Toggle Auto Triangles"
-msgstr "Укљ./Искљ. глобале аутоматског учитавања"
+msgstr "Укљ./Искљ. Троуглове"
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Направи троуглове спајајући тачке."
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Обриши тачке и троуглове."
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Произведи стопљене троуглове аутоматски (уместо ручно)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4536,34 +4760,37 @@ msgid "Edit Filters"
msgstr "Уреди филтере"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#, fuzzy
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Излазни чвор не може бити додат утапајућем стаблу."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#, fuzzy
msgid "Add Node to BlendTree"
-msgstr ""
+msgstr "Додај Чвор УтапајућемСтаблу"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Node Moved"
-msgstr "Режим померања"
+msgstr "Чвор Поморен"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#, fuzzy
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
+msgstr "Неуспела веза, порт може бити заузет или не важећи."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Nodes Connected"
-msgstr "Повезан"
+msgstr "Чворови Спојени"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Nodes Disconnected"
-msgstr "Веза прекинута"
+msgstr "Чворови Раздвојени"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#, fuzzy
@@ -4574,37 +4801,43 @@ msgstr "Анимација"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Node"
-msgstr "Направи чвор"
+msgstr "Обриши Чвор"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete Node(s)"
-msgstr ""
+msgstr "Обриши Чвор(ове)"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "Укљ./Искљ. режим без сметње."
+msgstr "Укљ./Искљ. филтере."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#, fuzzy
msgid "Change Filter"
-msgstr "Измени дужину анимације"
+msgstr "Измени Филтер"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#, fuzzy
msgid "No animation player set, so unable to retrieve track names."
-msgstr ""
+msgstr "Анимациони плејер није постављен, неуспешно повлачење имена трака."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#, fuzzy
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
+msgstr "Неважећа путања плејера, неуспешно повлачење имена трака."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
+#, fuzzy
msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Анимациони плејер нема правилну путању кореног чвора, неуспешно повлачење "
+"имена трака."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#, fuzzy
@@ -4629,8 +4862,9 @@ msgstr "Име чвора:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Add Node..."
-msgstr ""
+msgstr "Додај Чвор..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -4778,13 +5012,14 @@ msgid "Autoplay on Load"
msgstr "Аутоматско пуштање након учитавања"
#: editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
msgid "Enable Onion Skinning"
-msgstr ""
+msgstr "Омогући Слојевито Обмотавање"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
msgid "Onion Skinning Options"
-msgstr "Поставке залепљавања"
+msgstr "Опције Слојевитог Обмотавања"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Directions"
@@ -4861,105 +5096,121 @@ msgstr "Вишеанимационо време мешања"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Move Node"
-msgstr "Режим померања"
+msgstr "Помери Чвор"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Transition exists!"
-msgstr "Померај"
+msgstr "Прелаз постоји!"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Add Transition"
-msgstr "Померај"
+msgstr "Додај Прелаз"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Add Node"
-msgstr ""
+msgstr "Додај Чвор"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "End"
-msgstr ""
+msgstr "Крај"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Immediate"
-msgstr ""
+msgstr "Непосредан"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Sync"
-msgstr ""
+msgstr "Усклади"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "At End"
-msgstr ""
+msgstr "На Крај"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Travel"
-msgstr ""
+msgstr "Путуј"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Почетни и крајњи чвор су потребни за под-прелаз."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Није на пут ресурса."
+msgstr "Нема репородуктивних ресурса постављених као путања: %s."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Node Removed"
-msgstr "Обриши"
+msgstr "Чвор Уклоњен"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Transition Removed"
-msgstr "Transition чвор"
+msgstr "Прелаз Уклољен"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Set Start Node (Autoplay)"
-msgstr ""
+msgstr "Постави Почетни Чвор(ауто-покретање)"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid ""
"Select and move nodes.\n"
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Одабери и помери чворове.\n"
+"RMB да додаш нове чворове.\n"
+"Shift+LMB да креираш конекције."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Create new nodes."
-msgstr "Направи нов"
+msgstr "Направи нов."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Connect nodes."
-msgstr "Повежи са чвором:"
+msgstr "Повежи чворове."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Remove selected node or transition."
-msgstr "Обриши одабрану траку."
+msgstr "Обриши одабрани чвор или прелаз."
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Искљ/Укљ ауто-покретање ове анимације на почетак, поновни почетак или "
+"претрагу нуле."
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Постави крај анимације. Ово је корисно за под-прелазе."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Transition: "
-msgstr "Померај"
+msgstr "Прелаз:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Play Mode:"
-msgstr "Режим инспекције"
+msgstr "Режим Игре:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -5142,8 +5393,9 @@ msgid "Cannot save response to:"
msgstr "Неуспех при чувању теме:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Write error."
-msgstr ""
+msgstr "Грешка при уписивању."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
@@ -5192,7 +5444,7 @@ msgstr "Преузимање у току"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Downloading..."
-msgstr "Преузимање у току"
+msgstr "Преузимање..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -5209,7 +5461,7 @@ msgstr "Неактиван"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Install..."
-msgstr "Инсталирај"
+msgstr "Инсталирај..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -5224,35 +5476,39 @@ msgid "Download for this asset is already in progress!"
msgstr "Преузимање овог ресурса је у току!"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Recently Updated"
-msgstr ""
+msgstr "Недавно Ажурирано"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Последње Недавно Ажурирано"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Name (A-Z)"
-msgstr ""
+msgstr "Име (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Name (Z-A)"
-msgstr ""
+msgstr "Име (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "License (A-Z)"
-msgstr "Лиценса"
+msgstr "Лиценса (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "License (Z-A)"
-msgstr "Лиценса"
+msgstr "Лиценса (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "First"
-msgstr "први"
+msgstr "Први"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
@@ -5264,16 +5520,18 @@ msgid "Next"
msgstr "Следеће"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Last"
-msgstr ""
+msgstr "Последњи"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "All"
msgstr "сви"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "No results for \"%s\"."
-msgstr ""
+msgstr "Нема резултата за \"%s\"."
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
@@ -5314,35 +5572,45 @@ msgstr "Тестирање"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
msgid "Loading..."
-msgstr "Учитај"
+msgstr "Учитај..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr "Ресурси ЗИП датотека"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
+#, fuzzy
msgid ""
"Can't determine a save path for lightmap images.\n"
"Save your scene (for images to be saved in the same dir), or pick a save "
"path from the BakedLightmap properties."
msgstr ""
+"Неуспело одређивање путање памћења за слике МапеСенчења.\n"
+"Упамти сцену (за слике да буду сачуване у истом директоријуму), или одабери "
+"путању памћења из особина изпечене МапеСенчења."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
+#, fuzzy
msgid ""
"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
"Light' flag is on."
msgstr ""
+"Нема мрежа за печење. Провери да ли садрже UV2 канал и да је опција 'Изпеци "
+"Светла' укључена."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
+#, fuzzy
msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
+"Неуспешно креирање слике МапеСенчења, провери да ли могуће уписивање путање."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
+#, fuzzy
msgid "Bake Lightmaps"
-msgstr ""
+msgstr "Изпеци МапеСенчења"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Преглед"
@@ -5359,13 +5627,14 @@ msgid "Grid Step:"
msgstr "Корак мреже:"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Primary Line Every:"
-msgstr ""
+msgstr "Примарна Линија Сваки:"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "steps"
-msgstr "2 корака"
+msgstr "корака"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -5378,7 +5647,7 @@ msgstr "Ротације корака:"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Scale Step:"
-msgstr "Скала:"
+msgstr "Корак Увећања:"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5446,64 +5715,70 @@ msgid "Move CanvasItem"
msgstr "Уреди CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid ""
"Children of containers have their anchors and margins values overridden by "
"their parent."
-msgstr ""
+msgstr "Деца наслеђују сидра и граничне вредности од својих родитеља."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Presets for the anchors and margins values of a Control node."
-msgstr ""
+msgstr "Поставке сидара и граничних вредности Контролног чвора."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
msgstr ""
+"Када су активни, померање Контролних чворова мења њихова сидра уместо "
+"маргина."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Top Left"
-msgstr "Лево"
+msgstr "Горе Лево"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Top Right"
-msgstr "десно"
+msgstr "Горе Десно"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Bottom Right"
-msgstr "Ротирај полигон"
+msgstr "Доле Десно"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Bottom Left"
-msgstr "Поглед одоздо"
+msgstr "Доле Лево"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Center Left"
-msgstr "Увучи лево"
+msgstr "Средина Лево"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Center Top"
-msgstr "Центрирај одабрано"
+msgstr "Средина Горе"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Center Right"
-msgstr "Увучи десно"
+msgstr "Средина Десно"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Center Bottom"
-msgstr "Доле"
+msgstr "Средина Доле"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Center"
-msgstr ""
+msgstr "Средина"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5526,21 +5801,24 @@ msgid "Bottom Wide"
msgstr "Поглед одоздо"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "VCenter Wide"
-msgstr ""
+msgstr "Вертикална Средина Широко"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "HCenter Wide"
-msgstr ""
+msgstr "Хоризонтална Средина Широко"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Full Rect"
-msgstr ""
+msgstr "Пун Правоугаоник"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Keep Ratio"
-msgstr "Размера скале:"
+msgstr "Задржи однос"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5556,41 +5834,47 @@ msgstr "Промени сидра"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"Препиши Играчку Камеру\n"
+"Препиши играчку камеру са камером уређивача viewport-а."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"Препиши Играчку Камеру\n"
+"Инстанца игре није покренута."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Lock Selected"
-msgstr "Избор алатки"
+msgstr "Закључај одабрано"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Unlock Selected"
-msgstr "Избор алатки"
+msgstr "Откључај одабрано"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Group Selected"
-msgstr "Обриши одабрано"
+msgstr "Групиши Одабрано"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Ungroup Selected"
-msgstr "Обриши одабрано"
+msgstr "Разгрупиши Одабрано"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
@@ -5620,10 +5904,11 @@ msgid "Clear IK Chain"
msgstr "Очисти IK ланац"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid ""
"Warning: Children of a container get their position and size determined only "
"by their parent."
-msgstr ""
+msgstr "Упозорење: Деца наслеђују позицију и величину само од својих родитеља."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -5668,7 +5953,7 @@ msgstr "Режим ротације"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Scale Mode"
-msgstr "Режим скалирања (R)"
+msgstr "Режим Увећања"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5690,32 +5975,32 @@ msgstr "Режим инспекције"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Ruler Mode"
-msgstr "Режим скалирања (R)"
+msgstr "Режим Мерења"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Toggle smart snapping."
-msgstr "Укљ./Искљ. лепљења"
+msgstr "Укљ./Искљ. лепљења."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Use Smart Snap"
-msgstr "Користи лепљење"
+msgstr "Користи паметно лепљење"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Toggle grid snapping."
-msgstr "Укљ./Искљ. лепљења"
+msgstr "Укљ./Искљ. лепљење за мрежу."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Use Grid Snap"
-msgstr "Лепљење по мрежи"
+msgstr "Лепљење за мрежу"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snapping Options"
-msgstr "Поставке залепљавања"
+msgstr "Поставке Залепљавања"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
@@ -5724,7 +6009,7 @@ msgstr "Користи лепљење ротације"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Use Scale Snap"
-msgstr "Користи лепљење"
+msgstr "Користи Лествично Лепљење"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
@@ -5737,7 +6022,7 @@ msgstr "Користи лепљење за пикселе"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Smart Snapping"
-msgstr "Паметно лепљење"
+msgstr "Паметно Лепљење"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5747,22 +6032,22 @@ msgstr "Поставке лепљења..."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Parent"
-msgstr "Лепи за родитеља"
+msgstr "Лепи за Родитеља"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Node Anchor"
-msgstr "Лепи за сидро чвора"
+msgstr "Лепи за Сидро Чвора"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Node Sides"
-msgstr "Лепи за стране чвора"
+msgstr "Лепи за Стране Чвора"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Snap to Node Center"
-msgstr "Лепи за сидро чвора"
+msgstr "Лепи за Сидро Чвора"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5804,13 +6089,14 @@ msgid "Show Bones"
msgstr "Покажи кости"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Направи Произвољне Кости од Чворова"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Обриши кости"
+msgstr "Обриши Кости"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5845,8 +6131,9 @@ msgid "Show Viewport"
msgstr "1 прозор"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Прикажи Групу и Закључане Иконице"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -5857,43 +6144,52 @@ msgid "Frame Selection"
msgstr "Ибор рама"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Preview Canvas Scale"
-msgstr ""
+msgstr "Преглед Величине Платна"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Translation mask for inserting keys."
-msgstr ""
+msgstr "Преводна маска за убацивање кључева."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Rotation mask for inserting keys."
-msgstr ""
+msgstr "Ротациона маска за убацивање кључева."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Scale mask for inserting keys."
-msgstr ""
+msgstr "Лествична маска за убацивање кључева."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Insert keys (based on mask)."
-msgstr "Убаци кључ (постојеће траке)"
+msgstr "Убаци кључеве (базиране на масци)."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid ""
"Auto insert keys when objects are translated, rotated or scaled (based on "
"mask).\n"
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
+"Аутоматски убаци кључеве где су објекти преведени, ротирирани или увећани "
+"(базирано на масци).\n"
+"Кључеви су додани само постојећим тракама, нове траке неће бити креиране.\n"
+"Кључеви први пут морају бити убачени ручно."
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Auto Insert Key"
-msgstr "Уметни кључ"
+msgstr "Ауто-Уметни кључ"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Анимациони кључ убачен."
+msgstr "Опције Анимациононг кључа и Позе"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5929,8 +6225,9 @@ msgid "Adding %s..."
msgstr "Додавање %s..."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Cannot instantiate multiple nodes without root."
-msgstr ""
+msgstr "Неуспело инстанцирање више чворова без корена."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -6008,19 +6305,21 @@ msgstr "Маска емисије"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
+#, fuzzy
msgid "Solid Pixels"
-msgstr ""
+msgstr "Пиксели Тела"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
+#, fuzzy
msgid "Border Pixels"
-msgstr ""
+msgstr "Пиксели Оквира"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#, fuzzy
msgid "Directed Border Pixels"
-msgstr "Директоријуми и датотеке:"
+msgstr "Пиксели Усмерених Оквира"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -6035,7 +6334,7 @@ msgstr "Боје емисије"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#, fuzzy
msgid "CPUParticles"
-msgstr "Честице"
+msgstr "CPU Честице"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -6058,12 +6357,14 @@ msgid "Flat 1"
msgstr "Раван1"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
msgid "Ease In"
-msgstr ""
+msgstr "Благ Почетак"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
msgid "Ease Out"
-msgstr ""
+msgstr "Благ Крај"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Smoothstep"
@@ -6128,8 +6429,9 @@ msgid "Bake GI Probe"
msgstr "Испечи сонде глобалног осветљења (GI)"
#: editor/plugins/gradient_editor_plugin.cpp
+#, fuzzy
msgid "Gradient Edited"
-msgstr ""
+msgstr "Нагиб Измењен"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
@@ -6152,12 +6454,13 @@ msgid "Mesh is empty!"
msgstr "Мрежа је празна!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Направи статичо тело од троуглова"
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Неуспело креирање три-мрежног сударног облика."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Направи конвексно статичко тело"
+msgid "Create Static Trimesh Body"
+msgstr "Направи статичо тело од троуглова"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -6166,36 +6469,61 @@ msgstr "Ово не ради на корену сцене!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "Create Trimesh Static Shape"
-msgstr "Направи фигуру од троуглова"
+msgstr "Направи облик од троуглова"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr ""
+#, fuzzy
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Неуспело креирање једног конвексног судардног облика за корен сцене."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create a single convex collision shape."
+msgstr "Неуспело креирање једног конвексног сударног облика."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "Направи конвексну облик"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "Неуспело креирање више конвексних сударних облика за корен сцене."
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
-msgstr "Направи конвексну фигуру"
+msgid "Couldn't create any collision shapes."
+msgstr "Неуспело креирање сударног облика."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
+msgstr "Направи конвексни облик"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
msgstr "Направи навигациону мрежу"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr ""
+msgstr "Садржана-Мрежа није од врсте Низ-Мрежа."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr ""
+msgstr "Неуспешно UV одмотавање, можда мрежа није многострука?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "No mesh to debug."
-msgstr ""
+msgstr "Нема мреже за проверу."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "Model has no UV in this layer"
-msgstr ""
+msgstr "Модел нема UV мапу на овом слоју"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
@@ -6206,8 +6534,9 @@ msgid "Mesh has not surface to create outlines from!"
msgstr "Мрежа нема површине за прављење ивица!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr ""
+msgstr "Примитивна врста Мреже није ПРИМИТИВНИ_ТРОУГЛОВИ!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
@@ -6226,31 +6555,87 @@ msgid "Create Trimesh Static Body"
msgstr "Направи троугласто статично тело"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+" Креира НепомичноТело и додељује му сударни облик на бази многоугла "
+"аутоматски."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Направи троугластог сударног брата"
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Креира сударни облик на бази моногоугла.\n"
+"Ово је најпрецизнија(али и најспорија) опција за препознавање судара."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
msgstr "Направи конвексног сударног брата"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Креира један конвексни сударни облик.\n"
+"Ово је најбржа(али и најнепрецизнија) опција за препознавање судара."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Направи конвексног сударног брата"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Креира сударни облик на бази многоугла.\n"
+"Ова опција постиже средињи учинак између 2 горе наведене."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Направи ивичну мрежу..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Креира непомични оквир мреже. Оквир мреже ће имати обрнуте нормале "
+"аутоматски.\n"
+"Ово може бити коришћено уместо Раст особине РастућегМатеријала кад коришћење "
+"те особине није могуће."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "View UV1"
-msgstr "Поглед"
+msgstr "Види UV1"
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV2"
-msgstr "Поглед"
+msgstr "Види UV2"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "Unwrap UV2 for Lightmap/AO"
-msgstr ""
+msgstr "Одмотај UV2 за МапуСенки/Упијање Окружења"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh"
@@ -6261,8 +6646,9 @@ msgid "Outline Size:"
msgstr "Величина ивице:"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "UV Channel Debug"
-msgstr ""
+msgstr "UV Канал ПИП (Проналажење и Исправка Проблема)"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
@@ -6273,12 +6659,14 @@ msgstr "Обриши ствар %d?"
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Ажурирај из сцене"
+msgstr ""
+"Ажурирај из сцене? :\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
#, fuzzy
msgid "Mesh Library"
-msgstr "MeshLibrary..."
+msgstr "Библиотека Мрежа..."
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6398,12 +6786,12 @@ msgstr "Направи навигациони полигон"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
msgid "Convert to CPUParticles"
-msgstr "Претвори у велика слова"
+msgstr "Претвори у CPU честице"
#: editor/plugins/particles_2d_editor_plugin.cpp
#, fuzzy
msgid "Generating Visibility Rect"
-msgstr "Генериши правоугаоник видљивости"
+msgstr "Генерација Правоугаоника Видљивости"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generate Visibility Rect"
@@ -6419,17 +6807,19 @@ msgid "Generation Time (sec):"
msgstr "Време генерисања (сек.):"
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
msgid "The geometry's faces don't contain any area."
-msgstr ""
+msgstr "Лица геометрије не садржи ни једну област."
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
msgid "The geometry doesn't contain any faces."
-msgstr "Чвор не садржи геометрију (стране)."
+msgstr "Геометрија не садржи ни једно лице."
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
msgid "\"%s\" doesn't inherit from Spatial."
-msgstr ""
+msgstr "\"%s\" не наслеђује од Просторног."
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -6501,7 +6891,7 @@ msgstr "Уметни тачку у криву"
#: editor/plugins/path_2d_editor_plugin.cpp
#, fuzzy
msgid "Split Curve"
-msgstr "Затвори криву"
+msgstr "Подели Криву"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
@@ -6567,13 +6957,15 @@ msgstr "Опција"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
+#, fuzzy
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Углови Дршке Огледала"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
+#, fuzzy
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Дужине Дршке Огледала"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -6617,30 +7009,36 @@ msgid "Move Joint"
msgstr "Помери тачку"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Костур особина 2Д полигона не упире ка 2Д Костур чвору"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
msgid "Sync Bones"
-msgstr "Покажи кости"
+msgstr "Усклади Коске"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
msgstr ""
+"Нема текстуре у овом многоуглу.\n"
+"Постави текстуру да би едитовао UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Направи UV мапу"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid ""
"Polygon 2D has internal vertices, so it can no longer be edited in the "
"viewport."
msgstr ""
+"2Д многоугао има унутрашње тачке, па не може више бити едитован у viewport-у."
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6658,8 +7056,9 @@ msgid "Remove Internal Vertex"
msgstr "Обриши тачку контроле улаза"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "Invalid Polygon (need 3 different vertices)"
-msgstr ""
+msgstr "Неважећи Многоугао(потребне 3 различите тачке)"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6681,8 +7080,9 @@ msgid "Transform Polygon"
msgstr "Тип трансформације"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "Paint Bone Weights"
-msgstr ""
+msgstr "Боји Тежине Костура"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6694,8 +7094,9 @@ msgid "Polygon 2D UV Editor"
msgstr "Уредник UV 2Д полигона"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6742,26 +7143,34 @@ msgid "Scale Polygon"
msgstr "Скалирај полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
+"Креирај произвољни многоугао. Омогућује изцртавање произвољног многоугла."
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid ""
"Remove a custom polygon. If none remain, custom polygon rendering is "
"disabled."
msgstr ""
+"Уклони произвољни многоугао. Ако ни један није остао, изцртавање произв. "
+"многоугла је онемогућено."
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "Paint weights with specified intensity."
-msgstr ""
+msgstr "Боји тежине са наведеном снагом"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "Unpaint weights with specified intensity."
-msgstr ""
+msgstr "Обриши обојене тежине наведене снаге"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "Radius:"
-msgstr ""
+msgstr " Опсег:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -6853,8 +7262,9 @@ msgstr "Налепи ресурсе"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Instance:"
-msgstr ""
+msgstr "Инстанца:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
@@ -6865,8 +7275,9 @@ msgstr "Тип:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Open in Editor"
-msgstr ""
+msgstr "Отвори у Уреднику"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Load Resource"
@@ -6878,13 +7289,14 @@ msgid "ResourcePreloader"
msgstr "Ресурс"
#: editor/plugins/root_motion_editor_plugin.cpp
+#, fuzzy
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree нема путању постављену ка AnimationPlayer-у"
#: editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Анимационо дрво није важеће."
+msgstr "Путања до AnimationPlayer није важећа."
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -6948,21 +7360,27 @@ msgid "Save File As..."
msgstr "Сачувај као..."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "Неуспело добијање скрипте за покретање"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "Неуспело учитавање Скрипте, провери конзолу за могуће грешке."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "Скрипта није у Алат Режиму, неће бити покренута."
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
+"За покретање скрипте, мора наследити УредникСкрипту и бити постављена у Алат "
+"Режим."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6998,16 +7416,17 @@ msgstr "Нађи претходни"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Filter scripts"
-msgstr "Поставке објекта."
+msgstr "Филтрирај скрипте"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Укљ/Искљ алфабет сортирање списка метода."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Filter methods"
-msgstr "Поставке објекта."
+msgstr "Филтрирај методе"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -7040,12 +7459,12 @@ msgstr "Датотека"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Open..."
-msgstr "Отвори"
+msgstr "Отвори..."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Reopen Closed Script"
-msgstr "Покрени скриптицу"
+msgstr "Покрени Затворену Скрипту"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -7058,7 +7477,7 @@ msgstr "Мекано освежење скриптице"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Copy Script Path"
-msgstr "Копирај пут"
+msgstr "Копирај Путању Скрипте"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -7073,12 +7492,12 @@ msgstr "Историја следеће"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
msgid "Theme"
-msgstr "Сачувај тему"
+msgstr "Тема"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Import Theme..."
-msgstr "Увези тему"
+msgstr "Увези тему..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
@@ -7129,15 +7548,7 @@ msgstr "Дебагуј са спољашњим уредником"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Open Godot online documentation."
-msgstr "Отвори Godot онлајн документацију"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
+msgstr "Отвори Godot документацију са мреже"
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
@@ -7180,28 +7591,27 @@ msgstr "Дебагер"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Search Results"
-msgstr "Потражи помоћ"
+msgstr "Потражи Ретултате"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Clear Recent Scripts"
-msgstr "Очисти недавне сцене"
+msgstr "Очисти Недавне Скрипте"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Connections to method:"
-msgstr "Повежи са чвором:"
+msgstr "Везе са методом:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
#, fuzzy
msgid "Source"
-msgstr ""
-"\n"
-"Извор: "
+msgstr "Извор"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
msgid "Target"
-msgstr ""
+msgstr "Мета"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7211,12 +7621,13 @@ msgstr "Повежи '%s' са '%s'"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Line"
-msgstr "Линија:"
+msgid "[Ignore]"
+msgstr "(игнориши)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
+#, fuzzy
+msgid "Line"
+msgstr "Линија:"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7229,8 +7640,9 @@ msgstr "Само ресурси из датотечног система се м
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Can't drop nodes because script '%s' is not used in this scene."
-msgstr ""
+msgstr "Неуспешно испуштање чворова јер скрипта'%s' није део ове сцене."
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7258,23 +7670,26 @@ msgid "Capitalize"
msgstr "Велика слова"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+#, fuzzy
msgid "Syntax Highlighter"
-msgstr ""
+msgstr "Изтицање Синтаксе"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#, fuzzy
msgid "Go To"
-msgstr ""
+msgstr "Иди На"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#, fuzzy
msgid "Bookmarks"
-msgstr ""
+msgstr "Белешке"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Breakpoints"
-msgstr "Обриши тачке"
+msgstr "Тачке прекида"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -7305,7 +7720,7 @@ msgstr "Коментариши"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Fold/Unfold Line"
-msgstr "Откриј линију"
+msgstr "Сакриј/Отркиј Линију"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
@@ -7326,7 +7741,7 @@ msgstr "Потпун симбол"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Evaluate Selection"
-msgstr "Увећај одабрано"
+msgstr "Процени Одабрано"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
@@ -7410,7 +7825,7 @@ msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"Следеће датотеке су нове на диску.\n"
+"Овај Цртач је измењен на диску.\n"
"Која акција се треба предузети?:"
#: editor/plugins/shader_editor_plugin.cpp
@@ -7418,8 +7833,9 @@ msgid "Shader"
msgstr "Шејдер"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
+#, fuzzy
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Овај костур нема кости, креирај му децу Коска2Д чворове."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
#, fuzzy
@@ -7427,21 +7843,24 @@ msgid "Create Rest Pose from Bones"
msgstr "Направи тачке емисије од мреже"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
+#, fuzzy
msgid "Set Rest Pose to Bones"
-msgstr ""
+msgstr "Постави Одмор Позу на Коске"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
#, fuzzy
msgid "Skeleton2D"
-msgstr "Синглетон"
+msgstr "Синглетон2Д"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
+#, fuzzy
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Направи Одмор Позу(од Костију)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
+#, fuzzy
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Постави Коске у Одмор Позу"
#: editor/plugins/skeleton_editor_plugin.cpp
#, fuzzy
@@ -7512,12 +7931,14 @@ msgid "Animation Key Inserted."
msgstr "Анимациони кључ убачен."
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Pitch"
-msgstr ""
+msgstr "Лево-Десно"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Yaw"
-msgstr ""
+msgstr "Горе-Доле"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -7607,6 +8028,11 @@ msgstr "Ова операција захтева један изабран чв
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
+msgid "Auto Orthogonal Enabled"
+msgstr "Ортогонална пројекција"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Lock View Rotation"
msgstr "Прикажи информације"
@@ -7661,8 +8087,9 @@ msgid "Cinematic Preview"
msgstr "Направи приказ мрежа"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Not available when using the GLES2 renderer."
-msgstr ""
+msgstr "Недоступно кад користиш GLES2 изцртавање."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7698,28 +8125,41 @@ msgid "Freelook Slow Modifier"
msgstr "Брзина слободног погледа"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Прикажи информације"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "Прикажи информације"
+"Белешка: FPS вредност приказана је FPS вредност Уредника.\n"
+"Не може бити коришћена као поуздана оцена учинка у игри."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm дијалог"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Snap Nodes To Floor"
msgstr "Залепи за мрежу"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr ""
+msgstr "Није пронађен чврст под где ће се одабир прилепити"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7793,7 +8233,7 @@ msgstr "Трансформација"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Snap Object to Floor"
-msgstr "Залепи за мрежу"
+msgstr "Залепи Објекат за Под"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -7875,8 +8315,9 @@ msgid "View Z-Far:"
msgstr "Максимум Z за приказ:"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Transform Change"
-msgstr ""
+msgstr "Промена Трансформације"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
@@ -7903,8 +8344,9 @@ msgid "Post"
msgstr "После"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Nameless gizmo"
-msgstr ""
+msgstr "Безимена ручка"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7922,8 +8364,9 @@ msgid "Create Polygon2D"
msgstr "Направи полигон"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Polygon2D Preview"
-msgstr ""
+msgstr "Приказ Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7951,12 +8394,14 @@ msgid "Sprite is empty!"
msgstr "Мрежа је празна!"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "Неуспело претварање спрајта користећи анимационе оквире у мрежу."
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Неважећа геометрија, неуспеша замена са мрежом."
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7964,8 +8409,9 @@ msgid "Convert to Mesh2D"
msgstr "Претвори у велика слова"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Invalid geometry, can't create polygon."
-msgstr ""
+msgstr "Неважећа геометрија, неуспешно креирање многоугла."
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7973,8 +8419,9 @@ msgid "Convert to Polygon2D"
msgstr "Помери полигон"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Invalid geometry, can't create collision polygon."
-msgstr ""
+msgstr "Неважећа геометрија, неуспело креирање сударног многоугла."
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7982,8 +8429,9 @@ msgid "Create CollisionPolygon2D Sibling"
msgstr "Направи навигациони полигон"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Invalid geometry, can't create light occluder."
-msgstr ""
+msgstr "Неважећа геометрија, неуспело креирање затамљивача светла."
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7996,16 +8444,19 @@ msgid "Sprite"
msgstr "Налепи оквир"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Simplification: "
-msgstr ""
+msgstr "Поједностављено:"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Shrink (Pixels): "
-msgstr ""
+msgstr "Умањи (Пиксели):"
#: editor/plugins/sprite_editor_plugin.cpp
+#, fuzzy
msgid "Grow (Pixels): "
-msgstr ""
+msgstr "Увећај (Пиксели):"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -8076,7 +8527,8 @@ msgid "New Animation"
msgstr "Анимација"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Брзина (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8095,8 +8547,9 @@ msgid "Add a Texture from File"
msgstr "Сними од пиксела"
#: editor/plugins/sprite_frames_editor_plugin.cpp
+#, fuzzy
msgid "Add Frames from a Sprite Sheet"
-msgstr ""
+msgstr "Додај Рамове са Спрајт Листе"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
@@ -8120,13 +8573,14 @@ msgid "Select Frames"
msgstr "Одабери режим"
#: editor/plugins/sprite_frames_editor_plugin.cpp
+#, fuzzy
msgid "Horizontal:"
-msgstr ""
+msgstr "Хоризонтално:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
msgid "Vertical:"
-msgstr "Тачке"
+msgstr "Вертикално:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -8183,8 +8637,9 @@ msgid "Step:"
msgstr "Корак:"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
msgid "Sep.:"
-msgstr ""
+msgstr "Сеп.:"
#: editor/plugins/texture_region_editor_plugin.cpp
#, fuzzy
@@ -8256,12 +8711,14 @@ msgid "Disabled Item"
msgstr "Онемогућено"
#: editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
msgid "Check Item"
-msgstr ""
+msgstr "Провери Предмет"
#: editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
msgid "Checked Item"
-msgstr ""
+msgstr "Предмет проверен"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
@@ -8274,12 +8731,14 @@ msgid "Checked Radio Item"
msgstr "CheckBox Radio1"
#: editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
msgid "Named Sep."
-msgstr ""
+msgstr "Иманован Сеп."
#: editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
msgid "Submenu"
-msgstr ""
+msgstr "Под-мени"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
@@ -8324,8 +8783,9 @@ msgid "Editable Item"
msgstr "Измени тему..."
#: editor/plugins/theme_editor_plugin.cpp
+#, fuzzy
msgid "Subtree"
-msgstr ""
+msgstr "Под-стабло"
#: editor/plugins/theme_editor_plugin.cpp
#, fuzzy
@@ -8400,8 +8860,9 @@ msgid "Find Tile"
msgstr "Нађи плочицу"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid "Transpose"
-msgstr ""
+msgstr "Преокрени"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
@@ -8419,18 +8880,22 @@ msgid "Filter tiles"
msgstr "Филтрирај датотеке..."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid "Give a TileSet resource to this TileMap to use its tiles."
-msgstr ""
+msgstr "Дај КомплетПлочица ресурс овом КомплетуМапа да користе његове плочице."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
msgstr "Цртај полчице"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid ""
"Shift+LMB: Line Draw\n"
"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
+"Shift+LMB: Цртање Линије\n"
+"Shift+Ctrl+LMB: Бојење Четвороугла"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
@@ -8447,21 +8912,24 @@ msgid "Rotate Right"
msgstr "Ротирај полигон"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid "Flip Horizontally"
-msgstr ""
+msgstr "Обрни Хоризонтално"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
msgid "Flip Vertically"
-msgstr ""
+msgstr "Обрни Вертикално"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
msgid "Clear Transform"
-msgstr "Трансформација"
+msgstr "Очисти Трансформацију"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Add Texture(s) to TileSet."
-msgstr ""
+msgstr "Додај Текстуру(е) КомплетуПлочица."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8478,8 +8946,9 @@ msgid "Merge from Scene"
msgstr "Споји од сцене"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "New Single Tile"
-msgstr ""
+msgstr "Нова Једна Плочица"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8487,8 +8956,9 @@ msgid "New Autotile"
msgstr "Аутоматски рез"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "New Atlas"
-msgstr ""
+msgstr "Нов Атлас"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8496,8 +8966,9 @@ msgid "Next Coordinate"
msgstr "Следећа скриптица"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Select the next shape, subtile, or Tile."
-msgstr ""
+msgstr "Одабери следећи облик, под-плочицу, или плочицу."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8505,8 +8976,9 @@ msgid "Previous Coordinate"
msgstr "Претодни спрат"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Select the previous shape, subtile, or Tile."
-msgstr ""
+msgstr "Одабери претходни облик, под-плочицу, или плочицу."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8584,8 +9056,9 @@ msgid "Z Index Mode"
msgstr "Режим инспекције"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Copy bitmask."
-msgstr ""
+msgstr "Копирај БитМаску."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8608,21 +9081,26 @@ msgid "Create a new polygon."
msgstr "Направи нови полигон од почетка."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Keep polygon inside region Rect."
-msgstr ""
+msgstr "Задржи многоугао унутар региона Четвороугла."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Enable snap and show grid (configurable via the Inspector)."
-msgstr ""
+msgstr "Омогући лепљење и прикажи мрежу ( подесива преко инспектора)."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Display Tile Names (Hold Alt Key)"
-msgstr ""
+msgstr "Прикажи Имена Плочица (Држи Alt дугмић)"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Add or select a texture on the left panel to edit the tiles bound to it."
msgstr ""
+"Додај или одабери текстуру на левом панелу да измениш њену везану плочицу."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8630,12 +9108,14 @@ msgid "Remove selected texture? This will remove all tiles which use it."
msgstr "Обриши тачку криве"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Текстура за уклањање није одабрана."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Create from scene? This will overwrite all current tiles."
-msgstr ""
+msgstr "Креирај од сцене? Ово ће преписати све тренутне плочице."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8648,14 +9128,18 @@ msgid "Remove Texture"
msgstr "Обриши шаблон"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "%s file(s) were not added because was already on the list."
-msgstr ""
+msgstr "%s фајл(ови) нису додани јер су већ на листи."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Вуци ручице да изениш Правоугаоник.\n"
+"Кликни на другу плочицу да је измениш."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8684,17 +9168,24 @@ msgid ""
msgstr "Сачувај тренутно измењени ресурс."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
+"Одабери под-плочицу као иконицу, ово ће такође бити изкоришћено на неважећим "
+"спојевима ауто-плочицица.\n"
+"Кликни на другу плочицу да је измениш."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
+"Одабери под-плочицу да измениш њен приоритет.\n"
+"Кликни на другу плочицу да је измениш."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8714,8 +9205,9 @@ msgid "Create Tile"
msgstr "Направи директоријум"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Set Tile Icon"
-msgstr ""
+msgstr "Постави иконицу Плочице"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8743,8 +9235,9 @@ msgid "Paste Tile Bitmask"
msgstr "Налепи анимацију"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Clear Tile Bitmask"
-msgstr ""
+msgstr "Очисти БитМаске са Плочице"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8782,8 +9275,9 @@ msgid "Edit Tile Priority"
msgstr "Уреди филтере"
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "Edit Tile Z Index"
-msgstr ""
+msgstr "Измени Z индекс Плочице"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8816,10 +9310,11 @@ msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "No VCS addons are available."
-msgstr ""
+msgstr " VCS додатци нису доступни."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Грешка"
@@ -8829,8 +9324,9 @@ msgid "No commit message was provided"
msgstr "Име није дато"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "No files added to stage"
-msgstr ""
+msgstr "Ни један фајл није додат на позорницу"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8838,12 +9334,14 @@ msgid "Commit"
msgstr "Заједница"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "VCS Addon is not initialized"
-msgstr ""
+msgstr "VCS додатак није иницијализован"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Version Control System"
-msgstr ""
+msgstr "VCS(Систем Контроле Верзије)"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8851,8 +9349,9 @@ msgid "Initialize"
msgstr "Велика слова"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Staging area"
-msgstr ""
+msgstr "Сценски простор"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8865,8 +9364,9 @@ msgid "Changes"
msgstr "Промене шејдера"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Modified"
-msgstr ""
+msgstr "Измењено"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8879,8 +9379,9 @@ msgid "Deleted"
msgstr "Обриши"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Typechange"
-msgstr ""
+msgstr "Промена типа"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8893,8 +9394,9 @@ msgid "Stage All"
msgstr "Сачувај све"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Add a commit message"
-msgstr ""
+msgstr "Додај предајну поруку"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8903,24 +9405,29 @@ msgstr "Синхронизуј промене скриптица"
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
+#, fuzzy
msgid "Status"
-msgstr ""
+msgstr "Статус"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "View file diffs before committing them to the latest version"
-msgstr ""
+msgstr "Погледај фајл разлике пре него га предаш задњој верзији."
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "No file diff is active"
-msgstr ""
+msgstr "Ни једна фајл разлика није активна"
#: editor/plugins/version_control_editor_plugin.cpp
+#, fuzzy
msgid "Detect changes in file diff"
-msgstr ""
+msgstr "Пронађене промене у фајл разликама"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "(GLES3 only)"
-msgstr ""
+msgstr "(само GLES3)"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8938,12 +9445,14 @@ msgid "Vector"
msgstr "Инспектор"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Boolean"
-msgstr ""
+msgstr "Тачница"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Sampler"
-msgstr ""
+msgstr "Узрокотвор"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8951,8 +9460,9 @@ msgid "Add input port"
msgstr "Додај улаз"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Add output port"
-msgstr ""
+msgstr "Додај одлазни порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8995,8 +9505,9 @@ msgid "Resize VisualShader node"
msgstr "Шејдер"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Set Uniform Name"
-msgstr ""
+msgstr "Постави Јединствено Име"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9015,17 +9526,19 @@ msgstr "Дуплирај чвор/ове графа"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Paste Nodes"
-msgstr ""
+msgstr "Налепи Чворове"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Delete Nodes"
-msgstr "Направи чвор"
+msgstr "Обриши Чворове"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Visual Shader Input Type Changed"
-msgstr ""
+msgstr "Улазна Врста Визуелног Цртача промењена"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9033,8 +9546,9 @@ msgid "Vertex"
msgstr "Тачке"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Fragment"
-msgstr ""
+msgstr "Део"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9057,8 +9571,9 @@ msgid "Color function."
msgstr "Иди на функцију..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Color operator."
-msgstr ""
+msgstr "Операције боје."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9066,359 +9581,441 @@ msgid "Grayscale function."
msgstr "Направи функцију"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
+msgstr "Претвара HSV вектор у RGB."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
+msgstr "Претвара RGB вектор у HSV."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Sepia function."
-msgstr "Направи функцију"
+msgstr "Sepia функција."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Burn operator."
-msgstr ""
+msgstr "Нагорено оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Darken operator."
-msgstr ""
+msgstr "Затамњење оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Difference operator."
-msgstr "Само разлике"
+msgstr "Различитости оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Dodge operator."
-msgstr ""
+msgstr "Упијање оперетор."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "HardLight operator."
-msgstr "Промени скаларни оператор"
+msgstr "ЈакаСветла оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Lighten operator."
-msgstr ""
+msgstr "Посветли оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Overlay operator."
-msgstr ""
+msgstr "Прекриј оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Screen operator."
-msgstr ""
+msgstr "Заслон оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "SoftLight operator."
-msgstr ""
+msgstr "МекоСветло оператор."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Color constant."
-msgstr "Константан"
+msgstr "Боја константна."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Color uniform."
-msgstr "Трансформација"
+msgstr "Боја хомогена."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
+msgstr "Враћа Булов резултат од %s порећења између 2 параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Equal (==)"
-msgstr ""
+msgstr "Једнако (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Greater Than (>)"
-msgstr ""
+msgstr "Веће од (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "Веће или Једнако (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
msgstr ""
+"Враћа асоцијативни вектор ако су снабдевени скалари једнаки, већи или мањи."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
-msgstr ""
+msgstr "Враћа Булов резултат након поређења измђу INF и скаларног параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
-msgstr ""
+msgstr "Враћа Булов резултат након поређења NaN и скаларног параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Less Than (<)"
-msgstr ""
+msgstr "Мање од (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "Мање или Једнако (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "Неједнако (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
msgstr ""
+"Враћа асоцијативни вектор ако је снабдевена Булова вредност тачна или "
+"нетачна."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns an associated scalar if the provided boolean value is true or false."
msgstr ""
+"Враћа асоцијативни скалар ако је снабдевена Булова вредност тачна или "
+"нетачна."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
+msgstr "Враћа Булов резултат након поређења 2 параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
msgstr ""
+"Враћа Булов резултат након поређења између INF (или NaN) и скаларног "
+"параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Boolean constant."
-msgstr "Промени векторску константу"
+msgstr "Бул константан."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Boolean uniform."
-msgstr ""
+msgstr "Бул уједначен."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "'%s' улазни параметар за све Цртачке Режиме."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Input parameter."
-msgstr "Лепи за родитеља"
+msgstr "Улазни параметар"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
+msgstr "'%s' улазни параметар за тачкасте и раздељене Цртачке Режиме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "'%s' улазни параметар за раздељене и светле Цртачке Режиме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "'%s' улазни параметар за раздељене Цртачке Режиме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "'%s' улазни параметар за светле Цртачке Режиме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
+msgstr "'%s' улазни параметар за тачкасте Цртачке Режиме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
+msgstr "'%s' улазни параметар за тачкасте и раздељене Цртачке Режиме."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Scalar function."
-msgstr "Промени скаларну функцију"
+msgstr "Скаларна функција."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Scalar operator."
-msgstr "Промени скаларни оператор"
+msgstr "Скаларни опреатор."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "E constant (2.718282). Represents the base of the natural logarithm."
-msgstr ""
+msgstr "E константа (2.718282). Представља базу природног логаритма."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
+msgstr "Епсилон константа (0.00001). Најмањи могући скаларни број."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
+msgstr " Phi константа (1.618034). Златни пресек."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
+msgstr "Pi/4 константа (0.785398) или 45 степени."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
+msgstr "Pi/2 константа (1.570796) или 90 степени."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
+msgstr "Pi константа (3.141593) или 180 степени."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
+msgstr "Tau константа (6.283185) или 360 степни."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "Sqrt2 константа (1.414214). Корен од 2."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the absolute value of the parameter."
-msgstr ""
+msgstr "Враћа абсолутну вредност параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the arc-cosine of the parameter."
-msgstr ""
+msgstr "Враћа арк-косинус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "Враћа обрнут хиперболични косинус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the arc-sine of the parameter."
-msgstr ""
+msgstr "Враћа арк-синус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
+msgstr "Враћа обрнут хиперболични синус параметра"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the arc-tangent of the parameter."
-msgstr ""
+msgstr "Враћа арк-тангенту параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the arc-tangent of the parameters."
-msgstr ""
+msgstr "Враћа арк-тангенту параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "Враћа обрнуту хиперболичну тангенту параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr ""
+msgstr "Налази најближи интиџер који је већи или једнак параметру."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Constrains a value to lie between two further values."
-msgstr ""
+msgstr "Ограђује вредност између 2 наредне вредности."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "Враћа косинус параметра"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "Враћа хиперболички косинус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "Претвара количину из радијана у степене."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Base-e Exponential."
-msgstr ""
+msgstr "База-е Експоненцијал."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Base-2 Exponential."
-msgstr ""
+msgstr "База-е Експоненцијал."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
+msgstr "Налази најближи интиџер мањи или једнак параметру."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "Прорачунава фракциони део аргумента."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "Враћа обрнути квадратни корен параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Natural logarithm."
-msgstr ""
+msgstr "Природни логаритам."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "База-2 логаритам."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "Враћа већу од 2 понуђене вредности."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "Враћа мању од 2 понуђене вредности."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "Линеарно уметање између 2 скалара."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the opposite value of the parameter."
-msgstr ""
+msgstr "Враћа супротну вредност параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "1.0 - scalar"
-msgstr ""
+msgstr "1.0 - скалар"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the value of the first parameter raised to the power of the second."
-msgstr ""
+msgstr "Враћа вредност првог параметра увећану за вредност другог."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "Претвара количину из степена у радијане."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "1.0 / scalar"
-msgstr ""
+msgstr "1.0 / скалар"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "Налази најближи интиџер параметру."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "Налази најближи једнак интиџер параметру."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "Притеже вредност између 0.0 и 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Extracts the sign of the parameter."
-msgstr ""
+msgstr "Извлачи знак параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the sine of the parameter."
-msgstr ""
+msgstr "Враћа синус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
+msgstr "Враћа хиперболичи синус параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the square root of the parameter."
-msgstr ""
+msgstr "Враћа квадратни корен параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n"
"\n"
@@ -9426,45 +10023,60 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"УглађенКорак функција ( скалар(ивица0), скалар(ивица1), скалар(x) ).\n"
+"Враћа 0.0 ако је 'x' мање од 'ивице0' и 1.0 ако је x веће од 'edge1'. Иначе "
+"враћена вредност је уметнутута између 0.0 и 1.0 користећи Хермитове полиноме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), scalar(x) ).\n"
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Корак функција ( scalar(edge), scalar(x) ).\n"
+"\n"
+"Враћа 0.0 ако је 'x' мање од 'ивице' иначе враћа 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the tangent of the parameter."
-msgstr ""
+msgstr "Враћа танкгенту параметра"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "Враћа хипероболичну тангенту параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Finds the truncated value of the parameter."
-msgstr ""
+msgstr "Налази скраћену вредност параметра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Adds scalar to scalar."
-msgstr ""
+msgstr "Додаје скалар скалару."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "Дели скалар са скаларом."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "Множи скалар са скаларом."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the remainder of the two scalars."
-msgstr ""
+msgstr "Враћа остатак 2 скалара."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Subtracts scalar from scalar."
-msgstr ""
+msgstr "Одузима скалар од скалара."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9477,12 +10089,14 @@ msgid "Scalar uniform."
msgstr "Промени скаларну униформу (uniform)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Perform the cubic texture lookup."
-msgstr ""
+msgstr "Извршава претрагу кубичне текстуре."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Perform the texture lookup."
-msgstr ""
+msgstr "Извршава претрагу текстуре."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9505,6 +10119,7 @@ msgid "Transform function."
msgstr "Прозор трансформације..."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Calculate the outer product of a pair of vectors.\n"
"\n"
@@ -9514,34 +10129,47 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
+"Прорачунава спољашњи продукт векторског пара.\n"
+"СпољашњиПродукт третира први параметар 'c' као вектор колону (матрица са "
+"једном колоном) и други параметар 'r' као ред вектор (матрица са једним "
+"редом) и одрађује линеарно алгебарско множење матрица 'c * r', приносећи "
+"матрицу чији број редова је број компоненти у 'c' и број колона је број "
+"компоненти у 'r'."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Composes transform from four vectors."
-msgstr ""
+msgstr "Саставља трансформу од четири вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Decomposes transform to four vectors."
-msgstr ""
+msgstr "Раставља трансформу у четри вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Calculates the determinant of a transform."
-msgstr ""
+msgstr "Прорачунава детерминанту трансформе."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "Прорачунава инверзију трансформе."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Calculates the transpose of a transform."
-msgstr ""
+msgstr "Прорачунава пренос трансформе."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Multiplies transform by transform."
-msgstr ""
+msgstr "Множи трансформу трансформом."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Multiplies vector by transform."
-msgstr ""
+msgstr "Множи вектор са трансформом."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9564,68 +10192,89 @@ msgid "Vector operator."
msgstr "Промени векторски оператор"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "Саставља вектор од 3 скалара."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "Раставља вектор у 3 скалара."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "Прорачунава векторски производ 2 вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "Враћа растојање између 2 тачке."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "Прорачунава скаларни производ 2 вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the vector that points in the same direction as a reference vector. "
"The function has three vector parameters : N, the vector to orient, I, the "
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
+"Враћа вектор који упућује у истом правцу као и дати вектор. Функција има три "
+"вектор параметра: N, оријнтациони вектор, I, вектор инцидента, и Nref , "
+"референтни вектор. Ако је скаларни продукт од I и Nref мањи од 0 повратна "
+"вредност је N. У супротном враћа -N."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "Прорачунава дужину вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "Линерно уметање између 2 вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Linear interpolation between two vectors using scalar."
-msgstr ""
+msgstr "Линерно уметање између 2 вектора користећи скалар."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Calculates the normalize product of vector."
-msgstr ""
+msgstr "Прорачунава нормализовани векторски продукт."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "1.0 - vector"
-msgstr ""
+msgstr "1.0 - вектор"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "1.0 / vector"
-msgstr ""
+msgstr "1.0 / вектор"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
msgstr ""
+"Враћа вектор који указује у правцу одраза ( a : вектор инцидента, b : "
+"нормални вектор )."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
+msgstr "Враћа вектор који указује у правцу преламања."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n"
"\n"
@@ -9633,8 +10282,14 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"ГлаткиКорак функција ( вектор(ивица0), вектор(ивица1), вектор(x) ).\n"
+"\n"
+"Враћа 0.0 ако је 'x' мање од 'ивице0' и 1.0 ако је 'x' веће од 'ивице1'. У "
+"супротном повратна вредност уметнута између 0.0 и 1.0 користећи Хермитове "
+"полиноме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n"
"\n"
@@ -9642,40 +10297,58 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"ГлаткиКорак функција ( скалар(ивица0), скалар(ивица1), вектор(x) ).\n"
+"\n"
+"Враћа 0.0 ако је 'x' мање од 'ивице0' и 1.0 ако је 'x' веће од 'ивице1'. У "
+"супротном повратна вредност је уметнута између 0.0 и 1.0 користећи Хермитове "
+"полиноме."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( vector(edge), vector(x) ).\n"
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Корак функција ( вектор(ивица), вектор(x) ).\n"
+"\n"
+"Враћа 0.0 ако је 'x' мање од 'ивице' у супротном 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Step function( scalar(edge), vector(x) ).\n"
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Корак функција ( акалар(ивица), вектор(x) ).\n"
+"\n"
+"Враћа 0.0 ако је 'x' мање од 'ивице' у супротном 1.0."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Adds vector to vector."
-msgstr ""
+msgstr "Додаје вектор вектору."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Divides vector by vector."
-msgstr ""
+msgstr "Дели вектор са вектором."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "Множи вектор са вектором."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Returns the remainder of the two vectors."
-msgstr ""
+msgstr "Враћа остатак 2 вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "Subtracts vector from vector."
-msgstr ""
+msgstr "Одузима вектор од вектора."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9688,84 +10361,112 @@ msgid "Vector uniform."
msgstr "Промени векторску униформу (uniform)"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Custom Godot Shader Language expression, with custom amount of input and "
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
+"Произвољни израз за Годот Цртачки Језик, са произвољном количином улазних и "
+"излазних портова. Ово је директно убризгавање кода у тачка/део/светло "
+"функцију, не користи за писање декларација функција унутра."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
+"Враћа смањење базирано на скаларном продукту нормале површине и правца "
+"гледања камере (прослеђује удружене улазе)."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Custom Godot Shader Language expression, which is placed on top of the "
"resulted shader. You can place various function definitions inside and call "
"it later in the Expressions. You can also declare varyings, uniforms and "
"constants."
msgstr ""
+"Произвољни израз Годот Цртачког Језика, који је постављен на врх "
+"резултирајућег цртача. Можеш поставити разне дефиниције функција унутра и "
+"позвати их касније у Изразу. Такође можеш дакларисати варијације, униформе и "
+"константе."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr ""
+msgstr "(само Део/Светло режим) Функција скаларне деривације."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
+msgstr "(само Део/Светло режим) Вектор скаларне деривације."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(само Део/Светло режим) (Вектор) Дериват у 'x' користећи локалну "
+"диференцијацију."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(само Део/Светло режим) (Скалар) Дериват у 'x' користећи локалну "
+"диференцијацију."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(само Део/Светло режим) (Вектор) Дериват у 'y' користећи локалну "
+"диференцијацију."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(само Део/Светло режим) (Скалар) Дериват у 'y' користећи локалну "
+"диференцијацију."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
-msgstr ""
+msgstr "(само Део/Светло режим) (Вектор) Сума абсолутних деривата у 'x' и 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
-msgstr ""
+msgstr "(само Део/Светло режим) (Скалар) Сума абсолутних деривата у 'x' и 'y'."
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "VisualShader"
-msgstr "Шејдер"
+msgstr "ВизуелниЦртач"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Edit Visual Property"
-msgstr "Уреди филтере"
+msgstr "Уреди Визуелне Особине"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
msgid "Visual Shader Mode Changed"
-msgstr "Промене шејдера"
+msgstr "Визуелни Цртач Режим промењен"
#: editor/project_export.cpp
msgid "Runnable"
@@ -9774,11 +10475,12 @@ msgstr "Покретљива"
#: editor/project_export.cpp
#, fuzzy
msgid "Add initial export..."
-msgstr "Додај улаз"
+msgstr "Додај почетни извоз..."
#: editor/project_export.cpp
+#, fuzzy
msgid "Add previous patches..."
-msgstr ""
+msgstr "Додај претходне закрпе..."
#: editor/project_export.cpp
msgid "Delete patch '%s' from list?"
@@ -9790,21 +10492,29 @@ msgid "Delete preset '%s'?"
msgstr "Обриши поставку „%s“?"
#: editor/project_export.cpp
+#, fuzzy
msgid ""
"Failed to export the project for platform '%s'.\n"
"Export templates seem to be missing or invalid."
msgstr ""
+"Неуспешан извоз пројекта за плазформу '%s'.\n"
+"Изгледа да недостају извозни нацрти или нису исправни."
#: editor/project_export.cpp
+#, fuzzy
msgid ""
"Failed to export the project for platform '%s'.\n"
"This might be due to a configuration issue in the export preset or your "
"export settings."
msgstr ""
+"Неуспешан извоз пројекта за платформу '%s'.\n"
+"Ово може бити због проблема са подешавањима у извозним поставкама или твојим "
+"извозним подешавањима."
#: editor/project_export.cpp
+#, fuzzy
msgid "Release"
-msgstr ""
+msgstr "Издање"
#: editor/project_export.cpp
#, fuzzy
@@ -9830,10 +10540,12 @@ msgid "Add..."
msgstr "Додај..."
#: editor/project_export.cpp
+#, fuzzy
msgid ""
"If checked, the preset will be available for use in one-click deploy.\n"
"Only one preset per platform may be marked as runnable."
msgstr ""
+"Ако је означено, поставке ће бити омогућене за коришћење у један-клик развој."
#: editor/project_export.cpp
#, fuzzy
@@ -9900,8 +10612,9 @@ msgid "Features"
msgstr "Карактеристике"
#: editor/project_export.cpp
+#, fuzzy
msgid "Custom (comma-separated):"
-msgstr ""
+msgstr "Произвољно (одвојено зарезом):"
#: editor/project_export.cpp
msgid "Feature List:"
@@ -9918,24 +10631,29 @@ msgid "Script Export Mode:"
msgstr "Режим извоза:"
#: editor/project_export.cpp
+#, fuzzy
msgid "Text"
-msgstr ""
+msgstr "Текст"
#: editor/project_export.cpp
+#, fuzzy
msgid "Compiled"
-msgstr ""
+msgstr "Састављено"
#: editor/project_export.cpp
+#, fuzzy
msgid "Encrypted (Provide Key Below)"
-msgstr ""
+msgstr "Шифровано (Одабери Кључ Испод)"
#: editor/project_export.cpp
+#, fuzzy
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr ""
+msgstr "Неважећи Кључ за Шифровање(мора бити 64 карактера дуг)"
#: editor/project_export.cpp
+#, fuzzy
msgid "Script Encryption Key (256-bits as hex):"
-msgstr ""
+msgstr "Кључ Шифровања Скрипте (256-бајтова као хекс)"
#: editor/project_export.cpp
msgid "Export PCK/Zip"
@@ -9961,8 +10679,9 @@ msgid "ZIP File"
msgstr " Датотеке"
#: editor/project_export.cpp
+#, fuzzy
msgid "Godot Game Pack"
-msgstr ""
+msgstr "Годот Игра Паковање"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -9973,36 +10692,50 @@ msgid "Manage Export Templates"
msgstr "Управљај извозним шаблонима"
#: editor/project_export.cpp
+#, fuzzy
msgid "Export With Debug"
-msgstr ""
+msgstr "Извези са Инсектицидом"
#: editor/project_manager.cpp
-msgid "The path does not exist."
+#, fuzzy
+msgid "The path specified doesn't exist."
msgstr "Путања не постоји."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr ""
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Грешка при отварању датотеку пакета. Датотека није zip формата."
#: editor/project_manager.cpp
+#, fuzzy
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "Неважећи \".zip\" пројекат фајл; не садржи \"project.godot\" фајл."
+
+#: editor/project_manager.cpp
+#, fuzzy
msgid "Please choose an empty folder."
-msgstr ""
+msgstr "Одабери празан фолдер."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr ""
+#, fuzzy
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Одабери \"project.godot\" или \".zip\" фајл."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr ""
+#, fuzzy
+msgid "This directory already contains a Godot project."
+msgstr "Овај директоријум већ садржи Годот пројекат."
#: editor/project_manager.cpp
+#, fuzzy
msgid "New Game Project"
-msgstr ""
+msgstr "Нова Игра Пројекат"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Imported Project"
-msgstr ""
+msgstr "Увезен Пројекат"
#: editor/project_manager.cpp
#, fuzzy
@@ -10015,118 +10748,149 @@ msgid "Couldn't create folder."
msgstr "Неуспех при прављењу директоријума."
#: editor/project_manager.cpp
+#, fuzzy
msgid "There is already a folder in this path with the specified name."
-msgstr ""
+msgstr "На овој путањи већ постоји фолдер са овим именом."
#: editor/project_manager.cpp
+#, fuzzy
msgid "It would be a good idea to name your project."
-msgstr ""
+msgstr "Била би добра идеја да именујеш свој пројекат."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Invalid project path (changed anything?)."
-msgstr ""
+msgstr "Неважећа путања пројекта(нешто је измењено?)."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
+"Неуспешно учитавање project.godot-а у његовој путањи (грешка %d). Могуће да "
+"нешто недостаје или је корумпирано."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Couldn't edit project.godot in project path."
-msgstr ""
+msgstr "Неуспешна измена project.godot-а у путањи пројекта."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Couldn't create project.godot in project path."
-msgstr ""
+msgstr "Неуспешно креирање project.godot у путањи пројекта."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Rename Project"
-msgstr ""
+msgstr "Преимениуј Пројекат"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Import Existing Project"
-msgstr ""
+msgstr "Увези Постојећи Пројекат"
#: editor/project_manager.cpp
#, fuzzy
msgid "Import & Edit"
-msgstr "Увоз"
+msgstr "Увези и Измени"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Create New Project"
-msgstr ""
+msgstr "Креирај Нов Пројекат"
#: editor/project_manager.cpp
#, fuzzy
msgid "Create & Edit"
-msgstr "Направи емитер"
+msgstr "Креирај и Измени"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Install Project:"
-msgstr ""
+msgstr "Инсталирај Пројекат:"
#: editor/project_manager.cpp
#, fuzzy
msgid "Install & Edit"
-msgstr "Инсталирај"
+msgstr "Инсталирај и Измени"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Project Name:"
-msgstr ""
+msgstr "Има Пројекта:"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Project Path:"
-msgstr ""
+msgstr "Путања Пројекта:"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Project Installation Path:"
-msgstr ""
+msgstr "Инсталациона Путања Пројекта:"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Renderer:"
-msgstr ""
+msgstr "Цртач:"
#: editor/project_manager.cpp
+#, fuzzy
msgid "OpenGL ES 3.0"
-msgstr ""
+msgstr "OpenGL ES 3.0"
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Higher visual quality\n"
"All features available\n"
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"Виши визуелни квалитет\n"
+"Свe карактеристике доступне\n"
+"Некомпатибилно са старијим хардвером\n"
+"Није препоручљиво за веб игрице"
#: editor/project_manager.cpp
+#, fuzzy
msgid "OpenGL ES 2.0"
-msgstr ""
+msgstr "OpenGL ES 2.0"
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Lower visual quality\n"
"Some features not available\n"
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"Нижи визуелни квалитет\n"
+"Неке карактеристике нису доступне\n"
+"Ради на скоро сваком хардверу\n"
+"Пропоручљиво за веб игрице"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
+msgstr "Цртач може бити промењен касније, али сцене морају бити прилагођене."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Unnamed Project"
-msgstr ""
+msgstr "Неименован Пројекат"
#: editor/project_manager.cpp
#, fuzzy
msgid "Missing Project"
-msgstr "Пројекат"
+msgstr "Недостаје Пројекат"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Error: Project is missing on the filesystem."
-msgstr ""
+msgstr "Грешка: Пројекат недостаје у фајл систему."
#: editor/project_manager.cpp
#, fuzzy
@@ -10134,10 +10898,12 @@ msgid "Can't open project at '%s'."
msgstr "Не могу отворити '%s'."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Are you sure to open more than one project?"
-msgstr ""
+msgstr "Да ли сигурно желиш да отвориш више одједног пројекта?"
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"The following project settings file does not specify the version of Godot "
"through which it was created.\n"
@@ -10149,8 +10915,18 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Наредни фајл са подешавањима пројекта нема наведену верзију Годот-а са у "
+"којем је креиран.\n"
+"\n"
+"%s\n"
+"\n"
+"Ако наставиш са отварањем, биће пребачен у тренутни Годот фајл формат за "
+"подешавања.\n"
+"Упозорење: Више нећеш бити у стању да отвориш пројекат у претходним "
+"верзијама Годот-а."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"The following project settings file was generated by an older engine "
"version, and needs to be converted for this version:\n"
@@ -10161,12 +10937,23 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Наведени фајл са подешавањима пројекта је креиран од стране старије верзује "
+"Годот-а, и треба га пребацити у ову верзију:\n"
+"\n"
+"%s\n"
+"\n"
+"Желиш то да извршиш пребацивање?\n"
+"Упозорење: Више нећеш бити у стању да отвориш пројекат са преходном верзијом "
+"Годот-а."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
+"Подешавања пројекта су креирана са новијом верзијом Годот-а, која нису "
+"доступна у овој верзији."
#: editor/project_manager.cpp
#, fuzzy
@@ -10180,45 +10967,66 @@ msgstr ""
"„апликација“."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
+"Пројекат није могуће покренути: Средства морају бити увезена.\n"
+"Молимо измени пројекат да активираш иницијални увоз."
#: editor/project_manager.cpp
+#, fuzzy
msgid "Are you sure to run %d projects at once?"
-msgstr ""
+msgstr "Да ли сигурно желиш да покренеш %d пројеката одједном?"
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
+"Уклони %d пројекте са листе?\n"
+"Садржај фолдера пројекта неће бити измењен."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
msgstr ""
+"Уклони овај пројекат са листе?\n"
+"Садржај фолдера пројекта неће бити измењен."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Remove all missing projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
+"Уклони све изгубљене пројекте са листе?\n"
+"Садржај фолдера пројекта неће бити измењен."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
+"Језик промењен.\n"
+"Изглед ће бити ажуриран после рестартовања уредника или менеџера пројекта."
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
+"Да ли сигурно желиш да прегледаш %s фолдере у потрази за постојећим Годот "
+"пројектима?\n"
+"Ово може потрајати."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Менаџер пројекта"
@@ -10226,343 +11034,434 @@ msgstr "Менаџер пројекта"
#: editor/project_manager.cpp
#, fuzzy
msgid "Projects"
-msgstr "Пројекат"
+msgstr "Пројекти"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Last Modified"
-msgstr ""
+msgstr "Задњи Измењен"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Scan"
-msgstr ""
+msgstr "Претрага"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Select a Folder to Scan"
-msgstr ""
+msgstr "Одабери Фолдер за Претрагу"
#: editor/project_manager.cpp
+#, fuzzy
msgid "New Project"
-msgstr ""
+msgstr "Нов Порјекат"
#: editor/project_manager.cpp
#, fuzzy
msgid "Remove Missing"
-msgstr "Обриши тачку"
+msgstr "Обриши Изгубњено"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Templates"
-msgstr ""
+msgstr "Образси"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Restart Now"
-msgstr ""
+msgstr "Рестартуј Сада"
#: editor/project_manager.cpp
+#, fuzzy
msgid "Can't run project"
-msgstr ""
+msgstr "Пројекат није могуће покренути"
#: editor/project_manager.cpp
+#, fuzzy
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+"Тренутно немаш ни један пројекат.\n"
+"Желиш ли да изтражиш званичне примере пројеката из Библиотеке Средстава?"
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Оквир за претрагу пробира пројекте на основу имена и последњег дела путање.\n"
+"За пробирање на основу имену и целе путање, упит мора садржати бар један `/` "
+"карактер."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Key "
-msgstr ""
+msgstr "Кључ"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Joy Button"
-msgstr ""
+msgstr "Џојс дугмиж"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Joy Axis"
-msgstr ""
+msgstr "Џојс Осе"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Mouse Button"
-msgstr ""
+msgstr "Миш Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
+"Неважеће име акције. Не може бити празно или садржати '/', ':', '=', '\\' "
+"или '\"'"
#: editor/project_settings_editor.cpp
#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "Грешка: име анимације већ постоји!"
+msgstr "Радња са именом '%s' већ постоји."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Rename Input Action Event"
-msgstr ""
+msgstr "Преименуј Догађај Улазне Радње"
#: editor/project_settings_editor.cpp
#, fuzzy
msgid "Change Action deadzone"
-msgstr "Измени име анимације:"
+msgstr "Измени мртву-зону Радње"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Add Input Action Event"
-msgstr ""
+msgstr "Додај Догађај Улазне Радње"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "All Devices"
-msgstr ""
+msgstr "Сви Уређаји"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Device"
-msgstr ""
+msgstr "Уређаји"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+#, fuzzy
msgid "Press a Key..."
-msgstr ""
+msgstr "Стисни Дугме..."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Mouse Button Index:"
-msgstr ""
+msgstr "Миш Дугме Индекс"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Left Button"
-msgstr ""
+msgstr "Лево Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Right Button"
-msgstr ""
+msgstr "Десно Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Middle Button"
-msgstr ""
+msgstr "Средње Дугма"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Wheel Up Button"
-msgstr ""
+msgstr "Точкић Горе Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Wheel Down Button"
-msgstr ""
+msgstr "Точкић Доле Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Wheel Left Button"
-msgstr ""
+msgstr "Точкић Лево Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Wheel Right Button"
-msgstr ""
+msgstr "Точкић Десно Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "X Button 1"
-msgstr ""
+msgstr "X Дугме 1"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "X Button 2"
-msgstr ""
+msgstr "X Дугме 2"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Joypad Axis Index:"
-msgstr ""
+msgstr "Џојпад Оса Индекс:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Axis"
-msgstr ""
+msgstr "Осе"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Joypad Button Index:"
-msgstr ""
+msgstr "Џојпад Дугме Индекс:"
#: editor/project_settings_editor.cpp
#, fuzzy
msgid "Erase Input Action"
-msgstr "Обриши одабрано"
+msgstr "Обриши Улазну Радњу"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Erase Input Action Event"
-msgstr ""
+msgstr "Обриши Догађај Улазне Радње"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Add Event"
-msgstr ""
+msgstr "Додај Догађај"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Button"
-msgstr ""
+msgstr "Дугме"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Left Button."
-msgstr ""
+msgstr "Лево Дугме."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Right Button."
-msgstr ""
+msgstr "Десно Дугме."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Middle Button."
-msgstr ""
+msgstr "Средње Дугме."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Wheel Up."
-msgstr ""
+msgstr "Точкић Горе."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Wheel Down."
-msgstr ""
+msgstr "Точкић Доле."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Add Global Property"
-msgstr ""
+msgstr "Додај Глобалну Особину"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Select a setting item first!"
-msgstr ""
+msgstr "Прво одабери подешавање предмета!"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "No property '%s' exists."
-msgstr ""
+msgstr "Особина %s' не постоји."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr ""
+msgstr "Подешавање '%s' је унутрашње, и не може бити обрисано."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Delete Item"
-msgstr ""
+msgstr "Обриши Предмет"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
+"Неважеће име радње. Не може бити празно или садржати '/', ':', '=', '\\' или "
+"'\"'."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Add Input Action"
-msgstr ""
+msgstr "Додај Улазну Радњу"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Error saving settings."
-msgstr ""
+msgstr "Грешка при памћењу подешавања."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Settings saved OK."
-msgstr ""
+msgstr "Подешавања успешно упамћена."
#: editor/project_settings_editor.cpp
#, fuzzy
msgid "Moved Input Action Event"
-msgstr "Обриши одабрано"
+msgstr "Померен Догађај Улазне Радње"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Override for Feature"
-msgstr ""
+msgstr "Препиши за Особину"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Add Translation"
-msgstr ""
+msgstr "Додај Превод"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Remove Translation"
-msgstr ""
+msgstr "Обриши Превод"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Add Remapped Path"
-msgstr ""
+msgstr "Додај Преправљену Путању"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Resource Remap Add Remap"
-msgstr ""
+msgstr "Ресурс Преправка Додај Преправку"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Change Resource Remap Language"
-msgstr ""
+msgstr "Промени Језик Ресурс Преправке"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Remove Resource Remap"
-msgstr ""
+msgstr "Уклони Ресурс Преправку"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Remove Resource Remap Option"
-msgstr ""
+msgstr "Уклони Опцију Ресурс Преправке"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Changed Locale Filter"
-msgstr ""
+msgstr "Измењен Локални Пробирач"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Changed Locale Filter Mode"
-msgstr ""
+msgstr "Измењен Локални Режим Пробирања"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Project Settings (project.godot)"
-msgstr ""
+msgstr "Подешавања Пројекта (project.godot)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
+msgstr "Генерална"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Override For..."
-msgstr ""
+msgstr "Препиши За..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+#, fuzzy
msgid "The editor must be restarted for changes to take effect."
-msgstr ""
+msgstr "Уредник мора бити рестартован да би наступиле промене."
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Input Map"
-msgstr ""
+msgstr "Мапа Улаза"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Action:"
-msgstr ""
+msgstr "Радња:"
#: editor/project_settings_editor.cpp
#, fuzzy
msgid "Action"
-msgstr "Помери акцију"
+msgstr "Радња"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Deadzone"
-msgstr ""
+msgstr "Мртва-зона"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Device:"
-msgstr ""
+msgstr "Уређај:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Index:"
-msgstr ""
+msgstr "Индекс:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Localization"
-msgstr ""
+msgstr "Локализација"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Translations"
-msgstr ""
+msgstr "Превод"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Translations:"
-msgstr ""
+msgstr "Преводи:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Remaps"
-msgstr ""
+msgstr "Преправке"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Resources:"
-msgstr ""
+msgstr "Ресурси:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Remaps by Locale:"
-msgstr ""
+msgstr "Локалне Преправке:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Locale"
-msgstr ""
+msgstr "Локал"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Locales Filter"
-msgstr ""
+msgstr "Локални Пробирачи"
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -10575,16 +11474,19 @@ msgid "Show Selected Locales Only"
msgstr "Само одабрано"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Filter mode:"
-msgstr ""
+msgstr "Режим Пробирања:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "Locales:"
-msgstr ""
+msgstr "Локал:"
#: editor/project_settings_editor.cpp
+#, fuzzy
msgid "AutoLoad"
-msgstr ""
+msgstr "Ауто-Учитавање"
#: editor/project_settings_editor.cpp
msgid "Plugins"
@@ -10595,120 +11497,151 @@ msgid "Preset..."
msgstr "Поставке..."
#: editor/property_editor.cpp
+#, fuzzy
msgid "Zero"
-msgstr ""
+msgstr "Нула"
#: editor/property_editor.cpp
+#, fuzzy
msgid "Easing In-Out"
-msgstr ""
+msgstr "Ублажавање У-Од"
#: editor/property_editor.cpp
+#, fuzzy
msgid "Easing Out-In"
-msgstr ""
+msgstr "Ублажавање Од-У"
#: editor/property_editor.cpp
+#, fuzzy
msgid "File..."
-msgstr ""
+msgstr "Фајл..."
#: editor/property_editor.cpp
+#, fuzzy
msgid "Dir..."
-msgstr ""
+msgstr "Дир..."
#: editor/property_editor.cpp
+#, fuzzy
msgid "Assign"
-msgstr ""
+msgstr "Додели"
#: editor/property_editor.cpp
+#, fuzzy
msgid "Select Node"
-msgstr ""
+msgstr "Одабери Чвор"
#: editor/property_editor.cpp
+#, fuzzy
msgid "Error loading file: Not a resource!"
-msgstr ""
+msgstr "Гречка при учитавању фајла: Није ресурс!"
#: editor/property_editor.cpp
+#, fuzzy
msgid "Pick a Node"
-msgstr ""
+msgstr "Одабери Чвор"
#: editor/property_editor.cpp
+#, fuzzy
msgid "Bit %d, val %d."
-msgstr ""
+msgstr "Бит %d, вредност %d."
#: editor/property_selector.cpp
+#, fuzzy
msgid "Select Property"
-msgstr ""
+msgstr "Одабери Особину"
#: editor/property_selector.cpp
+#, fuzzy
msgid "Select Virtual Method"
-msgstr ""
+msgstr "Одабери Виртуелну Методу"
#: editor/property_selector.cpp
+#, fuzzy
msgid "Select Method"
-msgstr ""
+msgstr "Одабери Методу"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
#, fuzzy
msgid "Batch Rename"
-msgstr "Преименуј"
+msgstr "Преименуј Гомилу"
#: editor/rename_dialog.cpp
-msgid "Prefix"
-msgstr ""
+#, fuzzy
+msgid "Replace:"
+msgstr "Замени"
#: editor/rename_dialog.cpp
-msgid "Suffix"
-msgstr ""
+#, fuzzy
+msgid "Prefix:"
+msgstr "Предметак"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Suffix:"
+msgstr "Наставак"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Користи Регуларне Изразе"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Advanced Options"
-msgstr "Поставке залепљавања"
+msgstr "Напредне Поставке"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Substitute"
-msgstr ""
+msgstr "Замена"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Node name"
-msgstr "Име чвора:"
+msgstr "Име Чвора"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Чворово име оца, ако је доступно"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Node type"
-msgstr "Име чвора:"
+msgstr "Врста Чвора"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Current scene name"
-msgstr "Тренутна сцена није сачувана. Ипак отвори?"
+msgstr "Име тренутне сцене"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Root node name"
-msgstr "Преименуј"
+msgstr "Име кореног нода"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
-msgstr ""
+msgstr "Редни бројач интиџера"
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr ""
+#, fuzzy
+msgid "Per-level Counter"
+msgstr "Пред-Ниво Бројач"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
+msgstr "Ако је постављен, бројач се рестартује за сваку групу деце чворова"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Иницијална вредност бројача"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -10716,42 +11649,48 @@ msgid "Step"
msgstr "Корак:"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "Износ за који је бројач увећан за сваки Чвор"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Padding"
-msgstr ""
+msgstr " Пуњење"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Најмањи број цифара за сваки бројач.\n"
+"Недостатак цифара је попуњен водећим нулама."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Post-Process"
-msgstr ""
+msgstr "Након-Обраде"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Keep"
-msgstr ""
+msgstr "Задржи"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr ""
+#, fuzzy
+msgid "PascalCase to snake_case"
+msgstr "ПаскалЗапис у змија_запис"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr ""
+#, fuzzy
+msgid "snake_case to PascalCase"
+msgstr "змија_запис у ПаскалЗапис"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Case"
-msgstr ""
+msgstr "Запис"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -10768,147 +11707,199 @@ msgstr "Велика слова"
msgid "Reset"
msgstr "Ресетуј увеличање"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Регуларни Израз Грешка"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Код карактера %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Reparent Node"
-msgstr ""
+msgstr "Промени оца Чвору"
#: editor/reparent_dialog.cpp
+#, fuzzy
msgid "Reparent Location (Select new Parent):"
-msgstr ""
+msgstr "Промени оца Локацији (Одабери новог Оца):"
#: editor/reparent_dialog.cpp
+#, fuzzy
msgid "Keep Global Transform"
-msgstr ""
+msgstr "Сачувај Глобалну Трансформу"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Reparent"
-msgstr ""
+msgstr "Промени оца"
#: editor/run_settings_dialog.cpp
+#, fuzzy
msgid "Run Mode:"
-msgstr ""
+msgstr "Режим Кретања:"
#: editor/run_settings_dialog.cpp
+#, fuzzy
msgid "Current Scene"
-msgstr ""
+msgstr "Тренутна Сцена"
#: editor/run_settings_dialog.cpp
+#, fuzzy
msgid "Main Scene"
-msgstr ""
+msgstr "Главна Сцена"
#: editor/run_settings_dialog.cpp
+#, fuzzy
msgid "Main Scene Arguments:"
-msgstr ""
+msgstr "Аргументи Главне Сцене"
#: editor/run_settings_dialog.cpp
+#, fuzzy
msgid "Scene Run Settings"
-msgstr ""
+msgstr "Подешавања Сцене Кретања"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "No parent to instance the scenes at."
-msgstr ""
+msgstr "Нема оца где би сцена била инстанцирана"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Error loading scene from %s"
-msgstr ""
+msgstr "Грешка при учитавању сцене из %s"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid ""
"Cannot instance the scene '%s' because the current scene exists within one "
"of its nodes."
msgstr ""
+"Немогуће инстанцирање сцене '%s' јер трентутна сцене постоји унутар једаног "
+"од њених Чворова."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Instance Scene(s)"
-msgstr ""
+msgstr "Сцена/е Инстанца"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Replace with Branch Scene"
-msgstr ""
+msgstr "Замени са Граном Сцене"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Instance Child Scene"
-msgstr ""
+msgstr "Инстанца Сцена Дете"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Припој Скрипту"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "This operation can't be done on the tree root."
-msgstr ""
+msgstr "Операције не може бити извржена над кореном дрвета."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Move Node In Parent"
-msgstr ""
+msgstr "Пребаци Чвор код Родитеља"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Move Nodes In Parent"
-msgstr ""
+msgstr "Пребаци Чворове код Родитеља"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Duplicate Node(s)"
-msgstr ""
+msgstr "Удвостручи Чвор/ове"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
msgstr ""
+"Неуспело додељивање родитеља чвору у наслеђеним сценама, редослед чворова се "
+"не може мењати."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "Чвор мора припадати измењеној сцени да би постао корен."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "Инстанциране сцене не могу бити корен"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Make node as Root"
-msgstr "Сачувај сцену"
+msgstr "Направи Корен од чвора"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Обриши чвор \"%s\" и његову децу?"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Delete %d nodes?"
-msgstr "Направи чвор"
+msgstr "Обриши %d чворове?"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Delete the root node \"%s\"?"
-msgstr "Обриши чвор/ове графа шејдера"
+msgstr "Обриши корени чвор \"%s\"?"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "Обриши чвор \"%s\" и његову децу?"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Направи чвор"
+msgstr "Обриши чвор \"%s\"?"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Can not perform with the root node."
-msgstr ""
+msgstr "Немогуће извршити са кореним чвором."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "This operation can't be done on instanced scenes."
-msgstr ""
+msgstr "Операција не може бити извршена на инстанцираној сцени."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Save New Scene As..."
-msgstr ""
+msgstr "Упамти Нову Сцену Као..."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Онемогућивање \"измењиве_инстанце\" ће проузроковати да сва подешавања чвора "
+"буду повраћена на уобичајена."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
+"Омогућавање \"Учитај Као Месточувца\" ће онемогућити \"Измељива Деца\" и "
+"проузтоковати сва подешавања чвора да буду враћена на уобичајена."
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10918,272 +11909,333 @@ msgstr "Направи кости"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "New Scene Root"
-msgstr "Сачувај сцену"
+msgstr "Нови Корен Сцене"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Create Root Node:"
-msgstr "Направи чвор"
+msgstr "Направи корени чвор:"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "2D Scene"
-msgstr "Сцена"
+msgstr "2Д Сцена"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "3D Scene"
-msgstr "Сцена"
+msgstr "3Д Сцена"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "User Interface"
-msgstr ""
+msgstr "Кориснички Интерфејс"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Other Node"
-msgstr "Направи чвор"
+msgstr "Други Чвор"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Can't operate on nodes from a foreign scene!"
-msgstr ""
+msgstr "Немогуће оперисати на чвору из стране сцене!"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Can't operate on nodes the current scene inherits from!"
-msgstr ""
+msgstr "Немогуће оперисати на чворовима од којих тренутна сцена наслеђује!"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Attach Script"
-msgstr ""
+msgstr "Припој Скрипту"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Remove Node(s)"
-msgstr ""
+msgstr "Уклони Чвор/ове"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Change type of node(s)"
-msgstr "Промени улазно име"
+msgstr "Промени врсту чвора/ова"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
msgstr ""
+"Неуспело памћене сцене. Вероватно зависности (инстанце) нису задовољени."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Error saving scene."
-msgstr ""
+msgstr "Грешка памћена сцена."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Error duplicating scene to save it."
-msgstr ""
+msgstr "Грешка удвостручивање сцене ради памћења."
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Sub-Resources"
-msgstr "Ресурси"
+msgstr "Под-Ресурси"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Clear Inheritance"
-msgstr ""
+msgstr "Очисти Наслеђивања"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Editable Children"
-msgstr ""
+msgstr "Измењиа Деца"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Load As Placeholder"
-msgstr ""
+msgstr "Учитај као Месточувца"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Open Documentation"
-msgstr "Отвори Godot онлајн документацију"
+msgstr "Отвори Документацију"
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Add Child Node"
+msgstr "Додај Дете Члан"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Expand/Collapse All"
-msgstr "Умањи све"
+msgstr "Откриј/Сакриј Све"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Change Type"
-msgstr ""
+msgstr "Промени Тип"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Reparent to New Node"
-msgstr "Направи нов"
+msgstr "Промени Родитеља Новом Чвору"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Make Scene Root"
-msgstr "Сачувај сцену"
+msgstr "Направи Корен Сцене"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Merge From Scene"
-msgstr ""
+msgstr "Припоји из Сцене"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Save Branch as Scene"
-msgstr ""
+msgstr "Упамти Грану као Сцену"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Copy Node Path"
-msgstr ""
+msgstr "Копирај Путању Чвора"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete (No Confirm)"
-msgstr ""
+msgstr "Обриши (Без Потврде)"
#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Направи нов"
+msgstr "Додај/Направи Нов Члан."
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
+"Инстанцирај сценске фајлова као Чвор. Креирај наслеђену сцену ако корени "
+"чвор постоји."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
+msgstr "Припој нову или постојећу скрпту за одабрани чвор."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Detach the script from the selected node."
+msgstr "Очисти скрипту за одабрани чвор."
#: editor/scene_tree_dock.cpp
msgid "Remote"
msgstr "Удаљени уређај"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Local"
-msgstr ""
+msgstr "Локално"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Clear Inheritance? (No Undo!)"
-msgstr ""
+msgstr "Очисти Наследства? (Нема Назад!)"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Toggle Visible"
-msgstr "Прикажи сакривене датотеке"
+msgstr "Прикажи Сакривене"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Unlock Node"
-msgstr "OneShot чвор"
+msgstr "Откључај Чвор"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Button Group"
-msgstr "Додај у групу"
+msgstr "Група Дугмића"
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "(Connecting From)"
-msgstr "Повезивање не успешно"
+msgstr "(Повезивање од)"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Node configuration warning:"
-msgstr ""
+msgstr "Подешавања чвора упозорење:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
+"Чвор има %s конекцију/је и %s групу(е).\n"
+"Кликни да прикажеш пристаниште сигнала."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
+"Чвор има %s конекцију(е).\n"
+"Кликни да прикажеш пристаниште сигнала."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
+"Чвор је у %s групи/ама.\n"
+"Кликни да прикажеш пристаниште групе."
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Open Script:"
-msgstr "Покрени скриптицу"
+msgstr "Отвори Скрипту:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
+"Чвор је закључан.\n"
+"Кликни да га откључаш."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
+"Деца нису одабирљива.\n"
+"Кликни да их начиниш одабирљивим."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Toggle Visibility"
-msgstr ""
+msgstr "Укљ/Искљ Видљивост"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"АнимациониПлејер је закачен.\n"
+"Кликни да га откачиш."
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Invalid node name, the following characters are not allowed:"
-msgstr ""
+msgstr "Неважеће име чвора, следећи карактери нису дозвољени:"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Rename Node"
-msgstr ""
+msgstr "Преименуј Чвор"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Scene Tree (Nodes):"
-msgstr ""
+msgstr "Стабло Сцене (Чворови):"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Node Configuration Warning!"
-msgstr ""
+msgstr "Чворови Конфигурација Упозорење!"
#: editor/scene_tree_editor.cpp
+#, fuzzy
msgid "Select a Node"
-msgstr ""
+msgstr "Одабери Чвор"
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Path is empty."
-msgstr "Мрежа је празна!"
+msgstr "Путања је празна."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Filename is empty."
-msgstr "Мрежа је празна!"
+msgstr "Име фајла је празно."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Path is not local."
-msgstr "Путања не води ка чвору!"
+msgstr "Путања није локална."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid base path."
-msgstr "Неважећи пут."
+msgstr "Неважећа основна путања."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "A directory with the same name exists."
-msgstr "Датотека или директоријум са овим именом већ постоји."
+msgstr "Већ постоји директоријум са овим именом."
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Датотека не постоји."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11191,564 +12243,670 @@ msgid "Invalid extension."
msgstr "Мора се користити важећа екстензија."
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Wrong extension chosen."
-msgstr ""
+msgstr "Одабарна погрешна екстензија."
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Error loading template '%s'"
-msgstr ""
+msgstr "Грешка при учитавању нацрта '%s'"
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Error - Could not create script in filesystem."
-msgstr ""
+msgstr "Грешка - Неуспело креирање скрипте у фајл систему."
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Error loading script from %s"
-msgstr ""
+msgstr "Грешка при учитавању скрипте из %s"
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Overrides"
-msgstr ""
+msgstr "Преписке"
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "N/A"
-msgstr ""
+msgstr "Није Доступно"
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "Отвори уредник скриптица"
+msgstr "Отвори Скрипту / Одабери Локацију"
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Open Script"
-msgstr "Покрени скриптицу"
+msgstr "Отвори Скрипту"
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "File exists, it will be reused."
-msgstr ""
+msgstr "Фајл постоји, биће поново употребљен."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Invalid path."
+msgstr "Неважећи пут."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid class name."
-msgstr "Неважеће име."
+msgstr "Неважеће име класе."
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid inherited parent name or path."
-msgstr ""
+msgstr "Неважеће наслеђено име од родитеља или путање."
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
-msgstr "Анимационо дрво је важеће."
+msgid "Script path/name is valid."
+msgstr "Важеће име/путања скрипте."
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr ""
+msgstr "Дозвољено: a-z, A-Z, 0-9, _ и ."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Built-in script (into scene file)."
-msgstr "Операције са датотекама сцена."
+msgstr "Уграђена скрипта (у фајл сцене)."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Will create a new script file."
-msgstr "Направи нов"
+msgstr "Биће креиран нов фајл скирпте."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Will load an existing script file."
-msgstr "Учитај постојећи бас распоред."
+msgstr "Биће учитан постојећи фајл скрипте."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Script file already exists."
-msgstr "Аутоматско учитавање '%s' већ постоји!"
+msgstr "Фајл скрипте већ постоји."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Напомена: Уграђене скрипте имају неке границе и не могу бити измењене "
+"користећи уредник."
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
-msgstr "Класа:"
+msgstr "Име Класе:"
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Template:"
-msgstr "Обриши шаблон"
+msgstr "Нацрт:"
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Built-in Script:"
-msgstr "Покрени скриптицу"
+msgstr "Уграђена Скрипта:"
#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Attach Node Script"
-msgstr ""
+msgstr "Припој Чвор Скрипту"
#: editor/script_editor_debugger.cpp
msgid "Remote "
msgstr "Удаљени уређај "
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Bytes:"
-msgstr ""
+msgstr "Бајтови:"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Warning:"
-msgstr ""
+msgstr "Упозорење:"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Error:"
-msgstr "Грешка"
+msgstr "Грешка:"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "C++ Error"
-msgstr "Учитај грешке"
+msgstr "C++ Грешке"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "C++ Error:"
-msgstr "Учитај грешке"
+msgstr "C++ Грешке:"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "C++ Source"
-msgstr ""
-"\n"
-"Извор: "
+msgstr "C++ Извор"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Source:"
-msgstr ""
-"\n"
-"Извор: "
+msgstr "Извор:"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "C++ Source:"
-msgstr ""
-"\n"
-"Извор: "
+msgstr "C++ Извор:"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Stack Trace"
-msgstr ""
+msgstr "Потражна Наслага"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Errors"
-msgstr ""
+msgstr "Грешке"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Child process connected."
-msgstr "Веза прекинута"
+msgstr "Дете процез повезан."
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Copy Error"
-msgstr "Учитај грешке"
+msgstr "Копирај Грешку"
+
+#: editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Video RAM"
+msgstr "Видео RAM"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
-msgstr "Обриши тачке"
+msgstr "Прескочи тачке-прекида"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Inspect Previous Instance"
-msgstr ""
+msgstr "Истражи Претходну Инстанцу"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Inspect Next Instance"
-msgstr ""
+msgstr "Истражи Наредну Инстанцу"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Stack Frames"
-msgstr ""
+msgstr "Наслага Фрејмова"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Profiler"
-msgstr ""
+msgstr "Осматрач"
#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Network Profiler"
-msgstr "Извези пројекат"
+msgstr "Мрежни Осматрач"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Monitor"
-msgstr ""
+msgstr "Монитор"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Value"
-msgstr ""
+msgstr "Вредност"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Monitors"
-msgstr ""
+msgstr "Монитори"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Pick one or more items from the list to display the graph."
-msgstr ""
+msgstr "Одабери један или више предмета са листе за приказ графикона."
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "List of Video Memory Usage by Resource:"
-msgstr ""
+msgstr "Листа Видео Утрошка Меморије од стране Ресурса:"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Total:"
-msgstr ""
+msgstr "Укупно:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Извези листу у CSV фајл"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Resource Path"
-msgstr ""
+msgstr "Путања Ресурса"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Type"
-msgstr ""
+msgstr "Врста"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Format"
-msgstr ""
+msgstr "Формат"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Usage"
-msgstr ""
+msgstr "Искориштеност"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Misc"
-msgstr ""
+msgstr "Несврстано"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Clicked Control:"
-msgstr ""
+msgstr "Контрола Кликног:"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Clicked Control Type:"
-msgstr ""
+msgstr "Врста Контроле Кликнутог:"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Live Edit Root:"
-msgstr ""
+msgstr "Измена Корена Уживо:"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Set From Tree"
-msgstr ""
+msgstr "Постави са Стабла"
#: editor/script_editor_debugger.cpp
+#, fuzzy
msgid "Export measures as CSV"
-msgstr ""
+msgstr "Извези мере као CSV"
#: editor/settings_config_dialog.cpp
#, fuzzy
msgid "Erase Shortcut"
-msgstr "Излазна транзиција"
+msgstr "Обриши Пречицу"
#: editor/settings_config_dialog.cpp
+#, fuzzy
msgid "Restore Shortcut"
-msgstr ""
+msgstr "Поврати Пречицу"
#: editor/settings_config_dialog.cpp
#, fuzzy
msgid "Change Shortcut"
-msgstr "Промени сидра"
+msgstr "Измени Пречицу"
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
msgstr "Поставке уредника"
#: editor/settings_config_dialog.cpp
+#, fuzzy
msgid "Shortcuts"
-msgstr ""
+msgstr "Пречице"
#: editor/settings_config_dialog.cpp
+#, fuzzy
msgid "Binding"
-msgstr ""
+msgstr "Спојеви"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Light Radius"
-msgstr ""
+msgstr "Промени Опсег Светла"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change AudioStreamPlayer3D Emission Angle"
-msgstr ""
+msgstr "Промени AudioStreamPlayer3D Угао Емитовања"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Camera FOV"
-msgstr ""
+msgstr "Промени FOV Камере"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Camera Size"
-msgstr ""
+msgstr "Проемени Велићину Камере"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Notifier AABB"
-msgstr ""
+msgstr "Промени AABB Обавештајца"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Particles AABB"
-msgstr ""
+msgstr "Промени AABB Честица"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Probe Extents"
-msgstr ""
+msgstr "Промени Наставке Сонде"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+#, fuzzy
msgid "Change Sphere Shape Radius"
-msgstr ""
+msgstr "Промени Опсег Лоптастог Облика"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+#, fuzzy
msgid "Change Box Shape Extents"
-msgstr ""
+msgstr "Промени Наставке Кутија Облика"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Capsule Shape Radius"
-msgstr ""
+msgstr "Промени Опсег Капсула Облика"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Capsule Shape Height"
-msgstr ""
+msgstr "Промени Висину Капсула Облика"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr ""
+msgstr "Промени Опсег Цилиндар Облика"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr ""
+msgstr "Промени Висину Цилиндар Облика"
#: editor/spatial_editor_gizmos.cpp
+#, fuzzy
msgid "Change Ray Shape Length"
-msgstr ""
+msgstr "Промени Дужину Зрак Облика"
#: modules/csg/csg_gizmos.cpp
#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Промени време мешања"
+msgstr "Промени Опсег Цилиндра"
#: modules/csg/csg_gizmos.cpp
#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Промени време мешања"
+msgstr "Промени Висину Цилиндра"
#: modules/csg/csg_gizmos.cpp
#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Промени сидра и ивице"
+msgstr "Промени Унутрашњи Опсег Торуса"
#: modules/csg/csg_gizmos.cpp
+#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr ""
+msgstr "Промени Спољашњи Опсег Торуса"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "Select the dynamic library for this entry"
-msgstr ""
+msgstr "Одабери динамичку библиотеку за овај унос"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "Select dependencies of the library for this entry"
-msgstr ""
+msgstr "Одабери зависности од библиотеке за овај унос"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
#, fuzzy
msgid "Remove current entry"
-msgstr "Обриши тачку криве"
+msgstr "Обриши тренутни унос"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "Дупли клик да креираш нов унос"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "Platform:"
-msgstr ""
+msgstr "Платформа:"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "Platform"
-msgstr ""
+msgstr "Платформа"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "Dynamic Library"
-msgstr ""
+msgstr "Динамичка Библиотека"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "Add an architecture entry"
-msgstr ""
+msgstr "Додај архитектуру унос"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
+#, fuzzy
msgid "GDNativeLibrary"
-msgstr ""
+msgstr "GDNativeLibrary"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
+#, fuzzy
msgid "Enabled GDNative Singleton"
-msgstr ""
+msgstr "Омогућен GDNative Singleton"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "Искључи индикатор ажурирања"
+msgstr "Онемогућен GDNative Singleton"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
+#, fuzzy
msgid "Library"
-msgstr ""
+msgstr "Библиотека"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
+#, fuzzy
msgid "Libraries: "
-msgstr ""
+msgstr "Библиотеке:"
#: modules/gdnative/register_types.cpp
+#, fuzzy
msgid "GDNative"
-msgstr ""
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Step argument is zero!"
-msgstr ""
+msgstr "Корак аргуменат је нула!"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Not a script with an instance"
-msgstr ""
+msgstr "Није скрипта са инстанцом"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Not based on a script"
-msgstr ""
+msgstr "Није базирано на скрипти"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Not based on a resource file"
-msgstr ""
+msgstr "Није базирано на ресурс фајлу"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Invalid instance dictionary format (missing @path)"
-msgstr ""
+msgstr "Неважећа инстанца речник формата (недостаје @путања)"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Invalid instance dictionary format (can't load script at @path)"
msgstr ""
+"Неважећа инстанца речник формата (неуспешно учитавање скрипте код @путање)"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr ""
+msgstr "Неважећа инстанца речник формата (неважећа скрипта на @путања)"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Invalid instance dictionary (invalid subclasses)"
-msgstr ""
+msgstr "Неважећа инстанца речника (неважеће класе)"
#: modules/gdscript/gdscript_functions.cpp
+#, fuzzy
msgid "Object can't provide a length."
-msgstr ""
+msgstr "Објекат не може снабдети дужину."
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Next Plane"
-msgstr "Следећи таб"
+msgstr "Следећа Раван"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Previous Plane"
-msgstr "Претходни таб"
+msgstr "Претходна Раван"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Plane:"
-msgstr ""
+msgstr "Раван:"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Next Floor"
-msgstr ""
+msgstr "Следећи Спрат"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Previous Floor"
msgstr "Претодни спрат"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Floor:"
-msgstr ""
+msgstr "Спрат:"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "GridMap Delete Selection"
-msgstr ""
+msgstr "МапаМреже Обриши Одабир"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Све одабрано"
+msgstr "МапаМреже Испуни Одабрано"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "Све одабрано"
+msgstr "МапаМреже налепи Одабрано"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "GridMap Paint"
-msgstr "Мапа мреже"
+msgstr "МапаМреже Боји"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Grid Map"
msgstr "Мапа мреже"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Snap View"
-msgstr ""
+msgstr "Залепљив Поглед"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Clip Disabled"
-msgstr ""
+msgstr "Клип Онемогућен"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Clip Above"
-msgstr ""
+msgstr "Клип Изнад"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Clip Below"
-msgstr ""
+msgstr "Клип Испод"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Edit X Axis"
-msgstr ""
+msgstr "Измени X Осу"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Edit Y Axis"
-msgstr ""
+msgstr "Измени Y Осу"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Edit Z Axis"
-msgstr ""
+msgstr "Измени Z Осу"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Cursor Rotate X"
-msgstr ""
+msgstr "Курсор Ротација X"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Cursor Rotate Y"
-msgstr ""
+msgstr "Курсор Ротација Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Cursor Rotate Z"
-msgstr ""
+msgstr "Курсор Ротација Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Cursor Back Rotate X"
-msgstr ""
+msgstr "Курсор Ротација Уназад X"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Cursor Back Rotate Y"
-msgstr ""
+msgstr "Курсор Ротација Уназад Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Cursor Back Rotate Z"
-msgstr ""
+msgstr "Курсор Ротација Уназад Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Cursor Clear Rotation"
-msgstr ""
+msgstr "Курсор Обриши Ротацију"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Paste Selects"
-msgstr "Обриши одабрано"
+msgstr "Налепи Одабрано"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
@@ -11757,36 +12915,42 @@ msgstr "Обриши избор"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Fill Selection"
-msgstr "Све одабрано"
+msgstr "Испуни одабрано"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "GridMap Settings"
-msgstr ""
+msgstr "МапаМреже Подешавања"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Pick Distance:"
-msgstr ""
+msgstr "Одабери Одстојање:"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Filter meshes"
-msgstr "Поставке објекта."
+msgstr "Пробери мреже"
#: modules/gridmap/grid_map_editor_plugin.cpp
+#, fuzzy
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
-msgstr ""
+msgstr "Дај БиблиотециМрежа ресурс ове МапеМреже да користи њене мреже."
#: modules/mono/csharp_script.cpp
+#, fuzzy
msgid "Class name can't be a reserved keyword"
-msgstr ""
+msgstr "Има Класе не може бити резервисана кључна реч"
#: modules/mono/mono_gd/gd_mono_utils.cpp
+#, fuzzy
msgid "End of inner exception stack trace"
-msgstr ""
+msgstr "Крај Унутрашњег израза потражне наслаге"
#: modules/recast/navigation_mesh_editor_plugin.cpp
+#, fuzzy
msgid "Bake NavMesh"
-msgstr ""
+msgstr "Испеци НавМрежу"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -11845,83 +13009,99 @@ msgid "Done!"
msgstr "Готово!"
#: modules/visual_script/visual_script.cpp
+#, fuzzy
msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
msgstr ""
+"Чвор попустио без радне меморије, молимо прочитајте докуметацију како "
+"попустити правило!"
#: modules/visual_script/visual_script.cpp
+#, fuzzy
msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
-msgstr ""
+msgstr "Чвор попустио, али није вратио стање функције у првој радној меморији."
#: modules/visual_script/visual_script.cpp
+#, fuzzy
msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
msgstr ""
+"Враћена вредност мора бити додељена првом елементу члана радне меморије! "
+"Молимо поправи чвор."
#: modules/visual_script/visual_script.cpp
+#, fuzzy
msgid "Node returned an invalid sequence output: "
-msgstr ""
+msgstr "Члан вратио неважећи излаз секвенце:"
#: modules/visual_script/visual_script.cpp
+#, fuzzy
msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr ""
+msgstr "Пронађена секвенца битова али не члан наслаге, пријави грешку!"
#: modules/visual_script/visual_script.cpp
+#, fuzzy
msgid "Stack overflow with stack depth: "
-msgstr ""
+msgstr "Преоптерећење наслаге са дубином наслаге:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Change Signal Arguments"
-msgstr ""
+msgstr "Измени Аргументе Сигнала"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Change Argument Type"
-msgstr ""
+msgstr "Измени Врсту Аргумента"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Change Argument name"
-msgstr ""
+msgstr "Измени име Аргумента"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Set Variable Default Value"
-msgstr ""
+msgstr "Постави Уобичајену Вредност Променљиве"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Set Variable Type"
-msgstr ""
+msgstr "Постави Врсту Променљиве"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Add Input Port"
-msgstr "Додај улаз"
+msgstr "Додај улазни порт"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Add Output Port"
-msgstr "Додај улаз"
+msgstr "Додај излазни порт"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Override an existing built-in function."
-msgstr "Неважеће име. Име је резервисано за постојећи уграђени тип."
+msgstr "Препиши постојећу уграђену функцију."
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Create a new function."
-msgstr "Направи нов"
+msgstr "Направи нову функцију."
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Variables:"
-msgstr ""
+msgstr "Променљиве:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Create a new variable."
-msgstr "Направи нов"
+msgstr "Направи нову променљиву."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -11930,82 +13110,97 @@ msgstr "Сигнали:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Create a new signal."
-msgstr "Направи нови полигон од почетка."
+msgstr "Направи нови сигнал."
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Name is not a valid identifier:"
-msgstr ""
+msgstr "Име није важећи идентификатор:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Name already in use by another func/var/signal:"
-msgstr ""
+msgstr "Име је већ у употреби у функ/пром/сигналу:"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Rename Function"
-msgstr ""
+msgstr "Преименуј Функцију"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Rename Variable"
-msgstr ""
+msgstr "Преименуј Променљиву"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Rename Signal"
-msgstr ""
+msgstr "Преименуј Сигнал"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Add Function"
-msgstr ""
+msgstr "Додај Функцију"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Delete input port"
-msgstr "Обриши тачку"
+msgstr "Обриши улазни порт"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Add Variable"
-msgstr ""
+msgstr "Додај Промељиву"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Add Signal"
-msgstr ""
+msgstr "Додај Сигнал"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Remove Input Port"
-msgstr "Обриши тачку"
+msgstr "Обриши Улазни Порт"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Remove Output Port"
-msgstr "Обриши тачку"
+msgstr "Обриши Излазни Порт"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Change Expression"
-msgstr ""
+msgstr "Измени Израз"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Remove VisualScript Nodes"
-msgstr ""
+msgstr "Уклони ВизуелнаСкрипта Чланове"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Duplicate VisualScript Nodes"
-msgstr ""
+msgstr "Удвостручи ВизуелнаСкрипта Чланове"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
-msgstr ""
+msgstr "Држи %s да испустиш Узимача. Држи Shift да испустиш општи потпис."
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
-msgstr ""
+msgstr "Држи Ctrl да испустиш Узимача. Држи Shift да испустиш општи потпис."
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Hold %s to drop a simple reference to the node."
-msgstr ""
+msgstr "Држи %s да испустиш једноставну референцу ка члану."
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr ""
+msgstr "Држи Ctrl да испустиш једноставну референцу ка члану"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
@@ -12238,624 +13433,885 @@ msgid "VariableGet not found in script: "
msgstr ""
#: modules/visual_script/visual_script_nodes.cpp
+#, fuzzy
msgid "VariableSet not found in script: "
-msgstr ""
+msgstr "СкупПроменљивих није нађен у скрипти:"
#: modules/visual_script/visual_script_nodes.cpp
+#, fuzzy
msgid "Custom node has no _step() method, can't process graph."
-msgstr ""
+msgstr "Произвољни чвор нема _step() методу, граф не моће бити обрађен."
#: modules/visual_script/visual_script_nodes.cpp
+#, fuzzy
msgid ""
"Invalid return value from _step(), must be integer (seq out), or string "
"(error)."
msgstr ""
+"Неважећа повратна вредност од _step(), мора бити интиџер (seq out), или "
+"стринг (грешка)."
#: modules/visual_script/visual_script_property_selector.cpp
#, fuzzy
msgid "Search VisualScript"
-msgstr "Потражи помоћ"
+msgstr "Потражи VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
+#, fuzzy
msgid "Get %s"
-msgstr ""
+msgstr "Повуци %s"
#: modules/visual_script/visual_script_property_selector.cpp
+#, fuzzy
msgid "Set %s"
-msgstr ""
+msgstr "Постави %s"
#: platform/android/export/export.cpp
+#, fuzzy
msgid "Package name is missing."
-msgstr ""
+msgstr "Недостаје име паковања."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "Package segments must be of non-zero length."
-msgstr ""
+msgstr "Одломци паковања не могу бити нулте дужине."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
+msgstr "Карактер '%s' није дозвољен у именима паковања Android апликације."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "A digit cannot be the first character in a package segment."
-msgstr ""
+msgstr "Цифра не може бити први карактер у одломку паковања."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
+msgstr "Карактер '%s' не може бити први карактер у одломку паковања."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "The package must have at least one '.' separator."
-msgstr ""
+msgstr "Паковање мора имати бар један '.' раздвојник."
#: platform/android/export/export.cpp
msgid "Select device from the list"
msgstr "Одабери уређај са листе"
#: platform/android/export/export.cpp
+#, fuzzy
msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
+msgstr "ADB извршна датотека није подешена у Подешавањима Уредника."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr ""
+msgstr "OpenJDK jar потписник није подешен у Подешавањима Уредника."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
+"Сладиште кључева Разгрешеника није подешено у Подешавањима Уредника ни у "
+"поставкама."
#: platform/android/export/export.cpp
+#, fuzzy
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Сладиште кључева Разгрешеника није подешено у Подешавањима Уредника ни у "
+"поставкама."
+
+#: platform/android/export/export.cpp
+#, fuzzy
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
+"Произвољна изградња захтева важећу путању до Android SDK у Подешавањима "
+"Уредника."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "Invalid Android SDK path for custom build in Editor Settings."
msgstr ""
+"Неважећа Android SDK путања за произвољну изградњу у Подешавањима Уредника."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
msgstr ""
+"Android нацрт изградње није инсталиран у пројекат. Инсталирај га из Пројекат "
+"менија."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "Invalid public key for APK expansion."
-msgstr ""
+msgstr "Неважећи јавни кључ за АПК проширење."
#: platform/android/export/export.cpp
#, fuzzy
msgid "Invalid package name:"
-msgstr "Неважеће име."
+msgstr "Неважеће име паковања:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+#, fuzzy
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
+"Покушај изградње за произвољни нацрт изградње, али не постоји инфо о "
+"верзији. Молимо реинсталирај из \"Пројекат\" менија."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"Android build version mismatch:\n"
" Template installed: %s\n"
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
+"Верзија Android изградње се не подудара:\n"
+" Нацрт инсталиран: %s\n"
+" Годот Верзија: %s\n"
+"Молимо реинсталирајте Android нацрт изградње из \"Пројекат\" менија."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "Изградња Android Пројекта (gradle)"
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"Изградња Android пројекта неуспешна, провери излаз за грешке.\n"
+"Алтернативно посети docs.godotengine.org за Android документацију изградње."
#: platform/android/export/export.cpp
+#, fuzzy
msgid "No build apk generated at: "
-msgstr ""
+msgstr "Нема градње apk произведеног код:"
#: platform/iphone/export/export.cpp
+#, fuzzy
msgid "Identifier is missing."
-msgstr ""
+msgstr "Идентификатор недостаје."
#: platform/iphone/export/export.cpp
+#, fuzzy
msgid "The character '%s' is not allowed in Identifier."
-msgstr ""
+msgstr "Карактер '%s' није дозвољен као идентификатор."
#: platform/iphone/export/export.cpp
+#, fuzzy
msgid "App Store Team ID not specified - cannot configure the project."
msgstr ""
+"Тимски ИД Продавнице Апликација није наведен - неуспешно подешавање пројекта."
#: platform/iphone/export/export.cpp
#, fuzzy
msgid "Invalid Identifier:"
-msgstr "Неважећа величина фонта."
+msgstr "Неважећи идентификатор:"
#: platform/iphone/export/export.cpp
+#, fuzzy
msgid "Required icon is not specified in the preset."
-msgstr ""
+msgstr "Неопходна иконица није наведена у подешавању."
#: platform/javascript/export/export.cpp
+#, fuzzy
msgid "Stop HTTP Server"
-msgstr ""
+msgstr "Заустави HTTP Сервер"
#: platform/javascript/export/export.cpp
+#, fuzzy
msgid "Run in Browser"
-msgstr ""
+msgstr "Покрени у Претраживачу"
#: platform/javascript/export/export.cpp
+#, fuzzy
msgid "Run exported HTML in the system's default browser."
-msgstr ""
+msgstr "Покрени извезени HTML у уобичајеном претраживачу система."
#: platform/javascript/export/export.cpp
#, fuzzy
msgid "Could not write file:"
-msgstr "Неуспех при тражењу плочице:"
+msgstr "Неуспело уписивање фајла:"
#: platform/javascript/export/export.cpp
#, fuzzy
msgid "Could not open template for export:"
-msgstr "Неуспех при прављењу директоријума."
+msgstr "Неуспешно отварање нацрта за извоз:"
#: platform/javascript/export/export.cpp
#, fuzzy
msgid "Invalid export template:"
-msgstr "Неважећи извозни шаблон:\n"
+msgstr "Неважећи извозни нацрт:"
#: platform/javascript/export/export.cpp
#, fuzzy
msgid "Could not read custom HTML shell:"
-msgstr "Неуспех при учитавању датотеке са сличицом учитавања:\n"
+msgstr "Неуспешно читаље произвољне HTML шкољке:"
#: platform/javascript/export/export.cpp
#, fuzzy
msgid "Could not read boot splash image file:"
-msgstr "Неуспех при учитавању датотеке са сличицом учитавања:\n"
+msgstr "Неуспешно читаље фајла уводне слике:"
#: platform/javascript/export/export.cpp
#, fuzzy
msgid "Using default boot splash image."
-msgstr "Неуспех при учитавању датотеке са сличицом учитавања:\n"
+msgstr "Коришћење уобичајне уводне слике."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid package short name."
-msgstr "Неважеће име."
+msgstr "Неважеће кратко име паковања."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid package unique name."
-msgstr "Неважеће име."
+msgstr "Неважеће јединствено име паковања."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "Неважеће име."
+msgstr "Неважеће приказно име издавача паковања."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid product GUID."
-msgstr "Неважеће име."
+msgstr "Неважећи GUID продукт."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid publisher GUID."
-msgstr "Неважећи пут."
+msgstr "Неважећи GUID итдавача."
#: platform/uwp/export/export.cpp
#, fuzzy
msgid "Invalid background color."
-msgstr "Неважеће име."
+msgstr "Неважећа боја позадине."
#: platform/uwp/export/export.cpp
+#, fuzzy
msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr ""
+msgstr "Неважеће димензије Логотипа Продавнице (треба да буде 50*50)."
#: platform/uwp/export/export.cpp
+#, fuzzy
msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr ""
+msgstr "Неважеће димензије слике за квадрат логотип (треба да буде 44*44)."
#: platform/uwp/export/export.cpp
+#, fuzzy
msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr ""
+msgstr "Неважеће димензије слике за квадрат логотип (треба да буде 71*71)."
#: platform/uwp/export/export.cpp
+#, fuzzy
msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr ""
+msgstr "Неважеће димензије слике за квадрат логотип (треба да буде 150*150)."
#: platform/uwp/export/export.cpp
+#, fuzzy
msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr ""
+msgstr "Неважеће димензије слике за квадрат логотип (треба да буде 310*310)."
#: platform/uwp/export/export.cpp
+#, fuzzy
msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr ""
+msgstr "Неважеће димензије слике за широки логотип (треба да буде 310*150)."
#: platform/uwp/export/export.cpp
+#, fuzzy
msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr ""
+msgstr "Неважеће димензије слике за уводни екран (треба да буде 620*300)."
#: scene/2d/animated_sprite.cpp
+#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
+"СпрајтРамови ресурс мора бити креиран или поставњен у \"Рамови\" особини да "
+"би АнимациониСпрајт приказао фрејмове."
#: scene/2d/canvas_modulate.cpp
+#, fuzzy
msgid ""
"Only one visible CanvasModulate is allowed per scene (or set of instanced "
"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
+"Само један видљив CanvasModulate је дозвољен по сцени (или групи "
+"инстанцираних сцена). Први креиран ће радити, док ће остали бити занемарени."
#: scene/2d/collision_object_2d.cpp
+#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
+"Овај члан нема облик, тако да се не моће сударати са осталим објектима.\n"
+"Размотри додавање СударнихОблика2Д или СударнихМногоуглова2Д као деце да "
+"дефинишеш његов облик."
#: scene/2d/collision_polygon_2d.cpp
+#, fuzzy
msgid ""
"CollisionPolygon2D only serves to provide a collision shape to a "
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
+"СударниМногоугао2Д само служи да обезбеди сударни облик изведеном члану од "
+"СударномОбјекту2Д. Молимо користи га само као дете од Области2Д, "
+"НепомичногТела2Д, ЧврстогТела2Д, КинематичкогТела2Д итд. да им даш облик."
#: scene/2d/collision_polygon_2d.cpp
+#, fuzzy
msgid "An empty CollisionPolygon2D has no effect on collision."
-msgstr ""
+msgstr "Непријатењ СударниМногоугао2Д нема утицаја на судар."
#: scene/2d/collision_shape_2d.cpp
+#, fuzzy
msgid ""
"CollisionShape2D only serves to provide a collision shape to a "
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
+"СударниОблик2Д само служи да обезбеди сударни облик за изведени чвор од "
+"СударниОбјекат2Д. Молимо само га користи као дете Области2Д, "
+"НепомичногТела2Д, ЧврстогТела2Д, КинематичкогТела2Д, итд. да им даш облик."
#: scene/2d/collision_shape_2d.cpp
+#, fuzzy
msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
msgstr ""
+"Облик мора бити снабдевен за СударниОблик2Д да би радио. Молимо креирај "
+"облик ресурс за њега!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
#: scene/2d/cpu_particles_2d.cpp
+#, fuzzy
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"ПроцесорЧестице2Д анимација захтева коришћење ПлатноПредметМатеријала са "
+"омогућеном \"Анимациом Честица\"."
#: scene/2d/light_2d.cpp
+#, fuzzy
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
msgstr ""
+"Текстура са обликом светла мора бити снабдевена у \"Текстура\" особини."
#: scene/2d/light_occluder_2d.cpp
+#, fuzzy
msgid ""
"An occluder polygon must be set (or drawn) for this occluder to take effect."
msgstr ""
+"Многоугао Затамљивач мора бити постављен (или исцртан) да би затамљивач имао "
+"утицаја."
#: scene/2d/light_occluder_2d.cpp
+#, fuzzy
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
+"Многоугао затамљивач за овај затамљивач је празан. Молимо нацртај моногоугао."
#: scene/2d/navigation_polygon.cpp
+#, fuzzy
msgid ""
"A NavigationPolygon resource must be set or created for this node to work. "
"Please set a property or draw a polygon."
msgstr ""
+"НавигациониПолигон ресурс мора бити постављен или креиран да би овај чвор "
+"радио. Молимо постави особину или нацртај многоугао."
#: scene/2d/navigation_polygon.cpp
+#, fuzzy
msgid ""
"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
"node. It only provides navigation data."
msgstr ""
+"ИнстанцаНавигационогМногоугла мора бити дете или прадете Навигација2Д чвору. "
+"Само обезбеђује навигационе податке."
#: scene/2d/parallax_layer.cpp
+#, fuzzy
msgid ""
"ParallaxLayer node only works when set as child of a ParallaxBackground node."
-msgstr ""
+msgstr "ПаралаксСлој чвор само ради кад је дете од ПаралаксПозадина чвора."
#: scene/2d/particles_2d.cpp
+#, fuzzy
msgid ""
"GPU-based particles are not supported by the GLES2 video driver.\n"
"Use the CPUParticles2D node instead. You can use the \"Convert to "
"CPUParticles\" option for this purpose."
msgstr ""
+"Честице базиране на графичкој нису подржане од стране GLES2 видео "
+"управљача.\n"
+"Уместо тога користи ПроцесорЧестице2Д чвор."
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+#, fuzzy
msgid ""
"A material to process the particles is not assigned, so no behavior is "
"imprinted."
msgstr ""
+"Материјал за извршавање честица није додељен. па ни једно понашање није "
+"утиснуто."
#: scene/2d/particles_2d.cpp
+#, fuzzy
msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Честице2Д анимација захтева корићење ПозориштеПредметМатеријала са "
+"омогућеном \"Анимација Честица\"."
#: scene/2d/path_2d.cpp
+#, fuzzy
msgid "PathFollow2D only works when set as a child of a Path2D node."
-msgstr ""
+msgstr "ПутањаПраћења2Д само ради кад је дете Путање2Д чвора."
#: scene/2d/physics_body_2d.cpp
+#, fuzzy
msgid ""
"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"Промена величине ЧврстогТела2Д (у карактеру или чврстом режиму) биће "
+"преписана од стране физичког мотора током рада.\n"
+"Уместо тога промени величину у детету сударног облика."
#: scene/2d/remote_transform_2d.cpp
+#, fuzzy
msgid "Path property must point to a valid Node2D node to work."
-msgstr ""
+msgstr "Путања особина мора показивати ка важећем Чвор2Д чвор да би радила."
#: scene/2d/skeleton_2d.cpp
+#, fuzzy
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Овај Коска2Д ланац треба да се заврши код Костур2Д чвора."
#: scene/2d/skeleton_2d.cpp
+#, fuzzy
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Коска2Д ради само са Костуром2Д или другом Коска2Д као родитељским чвором."
#: scene/2d/skeleton_2d.cpp
+#, fuzzy
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Овај коски недостаје одговарајућа Одмор поза. Иди у Костур2Д чвор и постави "
+"је."
#: scene/2d/tile_map.cpp
+#, fuzzy
msgid ""
"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
+"МапаПлочица са Користи Родитеља укљученим треба да има као родитеља "
+"СударниОблик2Д да му да облик. Молимо користи је као дете од Област2Д, "
+"ЧврстоТело2Д, КинематикоТело2Д, итд. да им даш облик."
#: scene/2d/visibility_notifier_2d.cpp
+#, fuzzy
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
msgstr ""
+"ВидљивостОмогућивач2Д ради најбоље кад се користи са измењеним кореном сцене "
+"као родитељем."
#: scene/3d/arvr_nodes.cpp
+#, fuzzy
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRCamera мора имати ARVROrigin члан као родитеља."
#: scene/3d/arvr_nodes.cpp
+#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRController мора имати ARVROrigin члан као родитеља."
#: scene/3d/arvr_nodes.cpp
+#, fuzzy
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
msgstr ""
+"ИД Контролора не сме бити 0 или овај контролор неће бити везан за актуелнонг "
+"контролора."
#: scene/3d/arvr_nodes.cpp
+#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRAnchor мора имати ARVROrigin чвор као родитеља."
#: scene/3d/arvr_nodes.cpp
+#, fuzzy
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
msgstr ""
+"Чвор ИД не сме биди 0 или ово сидро неће бити везано за актуелно сидро."
#: scene/3d/arvr_nodes.cpp
+#, fuzzy
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr ""
+msgstr "ARVROrigin захтева ARVRCamera дете чвор."
#: scene/3d/baked_lightmap.cpp
+#, fuzzy
msgid "%d%%"
-msgstr ""
+msgstr "%d%%"
#: scene/3d/baked_lightmap.cpp
+#, fuzzy
msgid "(Time Left: %d:%02d s)"
-msgstr ""
+msgstr "(Време преостало: %d:%02d с)"
#: scene/3d/baked_lightmap.cpp
+#, fuzzy
msgid "Plotting Meshes: "
-msgstr ""
+msgstr "Сковане Мреже:"
#: scene/3d/baked_lightmap.cpp
+#, fuzzy
msgid "Plotting Lights:"
-msgstr ""
+msgstr "Скована Светла:"
#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+#, fuzzy
msgid "Finishing Plot"
-msgstr ""
+msgstr "Завршни Ков"
#: scene/3d/baked_lightmap.cpp
+#, fuzzy
msgid "Lighting Meshes: "
-msgstr ""
+msgstr "Светлосне Мреже:"
#: scene/3d/collision_object.cpp
+#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
+"Овај чвор нема облик, па се не може сударати са осталим објектима.\n"
+"Размотри додавање СударногОблика или СударногМногоугла као детета да би "
+"дефинисао облик."
#: scene/3d/collision_polygon.cpp
+#, fuzzy
msgid ""
"CollisionPolygon only serves to provide a collision shape to a "
"CollisionObject derived node. Please only use it as a child of Area, "
"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
+"СуадрниМногоугао само служи да обезбеди сударни облик чвуру изведеном од "
+"СуадрниОбјекат. Молимо кориси га само као дете Области, НепомичногТела, "
+"ЧврстогТела, итд. да им даш облик."
#: scene/3d/collision_polygon.cpp
+#, fuzzy
msgid "An empty CollisionPolygon has no effect on collision."
-msgstr ""
+msgstr "Празан СударниМногоугао нема утицаја на судар."
#: scene/3d/collision_shape.cpp
+#, fuzzy
msgid ""
"CollisionShape only serves to provide a collision shape to a CollisionObject "
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
"KinematicBody, etc. to give them a shape."
msgstr ""
+"СударниОблик само служи да обезбеди сударни облик чвору изведеном ис "
+"СударниОбјекат. Молимо само га користи као дете Области, НепомичногТела, "
+"ЧврстогТела, итд. да им даш облик."
#: scene/3d/collision_shape.cpp
+#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
+"Облик мора бити снабдевен за СударниОблик да би радио. Молимо креирајте "
+"облик ресурс за њега."
#: scene/3d/collision_shape.cpp
+#, fuzzy
msgid ""
"Plane shapes don't work well and will be removed in future versions. Please "
"don't use them."
msgstr ""
+"Облици равни не раде добро и биће уклоњени у будућим верзија. Молимо не "
+"користите их."
+
+#: scene/3d/collision_shape.cpp
+#, fuzzy
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"УдубљениМоногоугаониОблик не подржава ЧврстоТело у другом рећим осим "
+"непокретног."
#: scene/3d/cpu_particles.cpp
+#, fuzzy
msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
+msgstr "Ништа није видљиво пошто мрежа није била додељена."
#: scene/3d/cpu_particles.cpp
+#, fuzzy
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial whose "
"Billboard Mode is set to \"Particle Billboard\"."
msgstr ""
+"ПроцесорЧестице анимација захтева коришћење ПросторногМатеријала чији Режим "
+"ОгласнеТабле је постављен као \"ОгласнаТабла Честице\"."
#: scene/3d/gi_probe.cpp
+#, fuzzy
msgid "Plotting Meshes"
-msgstr ""
+msgstr "Сковане Мреже"
#: scene/3d/gi_probe.cpp
+#, fuzzy
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
+"СондеГлобалногОсветљења нису подржане од стране GLES2 видео управљача.\n"
+" \n"
+"Као замену користи ИспеченеСенкеМапу."
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
+#, fuzzy
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr ""
+msgstr "ТачкаСветло са углом ширим од 90 степени не може бацати сенке."
#: scene/3d/navigation_mesh.cpp
+#, fuzzy
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
+"НавигационаМрежа ресурс мора бити постављен или креиран да би овај чвор "
+"радио."
#: scene/3d/navigation_mesh.cpp
+#, fuzzy
msgid ""
"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
"It only provides navigation data."
msgstr ""
+"НавМрежнаИнстанца мора бити дете или прадете Навигационог чвора. Само "
+"обезбећује навигационе податке."
#: scene/3d/particles.cpp
+#, fuzzy
msgid ""
"GPU-based particles are not supported by the GLES2 video driver.\n"
"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
"\" option for this purpose."
-msgstr ""
+msgstr "GPU-базиране честице нису подржане од стране GLES2 видео управљача."
#: scene/3d/particles.cpp
+#, fuzzy
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr ""
+msgstr "Ништа није видљиво пошто мрежама није било додељено да цртају пролазе."
#: scene/3d/particles.cpp
+#, fuzzy
msgid ""
"Particles animation requires the usage of a SpatialMaterial whose Billboard "
"Mode is set to \"Particle Billboard\"."
msgstr ""
+"Честице анимација захтева коришћење ПросторногМатеријала чије је Режим "
+"ОгласнеТабле постављен као \"Честице ОгласнеТабле\"."
#: scene/3d/path.cpp
+#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr ""
+msgstr "ПутањаПраћења ради само кад је постављена као дете Путања чвора."
#: scene/3d/path.cpp
+#, fuzzy
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
+"ОРИЈЕНТИСАНА_РОТАЦИЈА ПутањеПраћења захтева \"Горе Вектор\" да би била "
+"омогућена у свом родитељ ресурсу Путања Криве."
#: scene/3d/physics_body.cpp
+#, fuzzy
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"Промена величине у ТврдомТелу (у карактеру или трвдом моду) ће бити "
+"преписана од стране физичког мотора у раду."
#: scene/3d/remote_transform.cpp
+#, fuzzy
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
+"\"Даљинска Путања\" подешавање да би радило мора упирати ка важећем "
+"Просторном или Просторно-изведеном чвору."
#: scene/3d/soft_body.cpp
+#, fuzzy
msgid "This body will be ignored until you set a mesh."
-msgstr ""
+msgstr "Ово тело ће бити занемарено док не поставиш мрежу."
#: scene/3d/soft_body.cpp
+#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"Промене величине МекогТела ће бити преписане од стране фитичког мотора током "
+"рада."
#: scene/3d/sprite_3d.cpp
+#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
msgstr ""
+"СпрајтРам ресурси морају бити креирани или подешени у \"Рамови\" особини да "
+"би АнимираниСпрајт3Д приказао рамове."
#: scene/3d/vehicle_body.cpp
+#, fuzzy
msgid ""
"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
"it as a child of a VehicleBody."
msgstr ""
+"ТочакВозила служи да снабде точак систем ТелуВозила. Молимо користите га као "
+"детете од ТелаВозила."
#: scene/3d/world_environment.cpp
+#, fuzzy
msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"СветскоОкружење изискује своју \"Окружење\" особину да садржи Окружење да би "
+"било видљиво."
#: scene/3d/world_environment.cpp
+#, fuzzy
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
msgstr ""
+"Само једно СветскоОкружење је дозвољено за сцену (или групу инстанцираних "
+"сцена)."
#: scene/3d/world_environment.cpp
+#, fuzzy
msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
-msgstr ""
+msgstr "СветскоОкружење је занемарено."
#: scene/animation/animation_blend_tree.cpp
+#, fuzzy
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "На BlendTree чвору '%s', анимација није нађена: '%s'"
#: scene/animation/animation_blend_tree.cpp
#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Анимационе алатке"
+msgstr "Анимација није нађена: '%s'"
#: scene/animation/animation_tree.cpp
+#, fuzzy
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "У чвору '%s', неважећа анимација: '%s'."
#: scene/animation/animation_tree.cpp
#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "Грешка: неважеће име анимације!"
+msgstr "Неважећа анимација: '%s'."
#: scene/animation/animation_tree.cpp
#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Повежи '%s' са '%s'"
+msgstr "Ништа није позевано са улазом '%s' од чвора '%s'."
#: scene/animation/animation_tree.cpp
+#, fuzzy
msgid "No root AnimationNode for the graph is set."
-msgstr ""
+msgstr "AnimationNode без корена за графикон је постављено."
#: scene/animation/animation_tree.cpp
#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "Одабери AnimationPlayer из дрвета сцене за уређивање анимација."
+msgstr "Путања ка AnimationPlayer чвору који садржи анимацију није постављена."
#: scene/animation/animation_tree.cpp
+#, fuzzy
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
-msgstr ""
+msgstr "Путања постављена за AnimationPlayer не води ка AnimationPlayer чвору."
#: scene/animation/animation_tree.cpp
#, fuzzy
@@ -12863,123 +14319,210 @@ msgid "The AnimationPlayer root node is not a valid node."
msgstr "Анимационо дрво није важеће."
#: scene/animation/animation_tree_player.cpp
+#, fuzzy
msgid "This node has been deprecated. Use AnimationTree instead."
-msgstr ""
+msgstr "Овај члан је застарео. Користи AnimationTree као замену."
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid ""
"Color: #%s\n"
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"Боја: #%s\n"
+"LMB: Постави боју\n"
+"RMB: Уклони поставку"
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid "Pick a color from the editor window."
-msgstr ""
+msgstr "Одабери боју из прозора уредника."
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid "HSV"
-msgstr ""
+msgstr "Нијанса Засићење Вредност"
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid "Raw"
-msgstr ""
+msgstr "Сиров"
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid "Switch between hexadecimal and code values."
-msgstr ""
+msgstr "Пребаци између хексадецималних и кодних вредности."
#: scene/gui/color_picker.cpp
+#, fuzzy
msgid "Add current color as a preset."
-msgstr ""
+msgstr "Додај тренутну боју као поставку."
#: scene/gui/container.cpp
+#, fuzzy
msgid ""
"Container by itself serves no purpose unless a script configures its "
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
+"Контејнер као такав није употревљив осим ако скрипта подеси позиционо "
+"понашање своје деце.\n"
+"Ако не намераваш да додаш скрипту, онда користи прости Контрол чвор."
#: scene/gui/control.cpp
+#, fuzzy
msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"Савет-Кутије неће бити приказане као контроле, Миш Пробирач је постављен на "
+"\"Занемари\". Да решиш ово, постави Миш Пробирач на \"Заустави\" или "
+"\"Проследи\"."
#: scene/gui/dialogs.cpp
+#, fuzzy
msgid "Alert!"
-msgstr ""
+msgstr "Узбуна!"
#: scene/gui/dialogs.cpp
+#, fuzzy
msgid "Please Confirm..."
-msgstr ""
+msgstr "Молимо Потврди..."
#: scene/gui/popup.cpp
+#, fuzzy
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
+"Скок-Прозори биће скривени осим ако позовеш popup() или било коју од "
+"popup*() функција. Чинити их видљивим за измену је добро, али ће се сакрити "
+"након покретања."
#: scene/gui/range.cpp
+#, fuzzy
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
msgstr ""
+"Ако је \"Експ Измена\" омогућена, \"Најмања Вредност\" мора бити већа од 0."
#: scene/gui/scroll_container.cpp
+#, fuzzy
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
+"ScrollContainer је намењен да ради са једном дете контролом.\n"
+"Користи контејнер као дете (ВКутија, ХКутија, итд.), или Контролу и подеси "
+"ручно произвољну најмању величину."
#: scene/gui/tree.cpp
+#, fuzzy
msgid "(Other)"
-msgstr ""
+msgstr "(Остатак)"
#: scene/main/scene_tree.cpp
+#, fuzzy
msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
+"Уобичајено Окружење наведено у Подешавањима Пројекта (Исцртавање -> Окружење "
+"-> Уобичајено Окружење) није успешно учитано."
#: scene/main/viewport.cpp
+#, fuzzy
msgid ""
"This viewport is not set as render target. If you intend for it to display "
"its contents directly to the screen, make it a child of a Control so it can "
"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
"texture to some node for display."
msgstr ""
+"Овај viewport није постављен као мета за исцртавање. Ако намераваш да "
+"прикаже садржај директно на екран, учини га дететом Контроле да може да "
+"добави величину. У супротном, учини га МетомИсцртавања и додели његову "
+"унутрашњу текстуру неком чвору за приказ."
+
+#: scene/main/viewport.cpp
+#, fuzzy
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "Величина Viewport-а мора бити већа од 0 да би се нешто исцртало."
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
-msgstr "Неважећа величина фонта."
+msgstr "Неважећи извор за преглед."
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
-msgstr "Неважећа величина фонта."
+msgstr "Неважећи извор за цртач"
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "Неважећа величина фонта."
+msgstr "Неважећа упоредна функција за зај тип"
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Assignment to function."
-msgstr ""
+msgstr "Додељивање функцији."
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Додељивање унформи."
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Варијације могу само бити одређене у функцији тачке."
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "Константе није могуће мењати."
+
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Датотечни систем"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "При извозу или извршавању, крајља датотека ће покушати да се повеже са "
+#~ "адресом овог рачунара како би се могла дебаговати."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "Тренутна сцена није сачувана, молим сачувајте је пре покретања."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Није на пут ресурса."
+
+#~ msgid "Revert"
+#~ msgstr "Врати"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Ова акција се не може опозвати. Настави?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Поврати сцену"
+
+#, fuzzy
+#~ msgid "Clear Script"
+#~ msgstr "Испразни Скрипту"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Пратилац грешака"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Замени %d појаве/а."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Направи конвексно статичко тело"
#, fuzzy
#~ msgid ""
diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po
index e55a90f6f8..ad26751fe5 100644
--- a/editor/translations/sr_Latn.po
+++ b/editor/translations/sr_Latn.po
@@ -531,6 +531,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -696,7 +697,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -715,7 +716,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -765,6 +766,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -844,7 +849,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -902,6 +906,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -939,7 +947,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1113,6 +1121,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1134,6 +1145,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1437,7 +1456,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1445,16 +1464,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1482,6 +1493,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1601,15 +1616,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1759,7 +1774,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1875,7 +1890,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2288,10 +2303,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2376,11 +2387,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Napravi"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2647,10 +2661,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2710,22 +2720,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2734,8 +2748,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2744,32 +2758,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2830,7 +2844,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2844,7 +2858,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3228,7 +3246,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3255,6 +3274,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3841,19 +3864,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3869,7 +3896,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3903,10 +3930,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4968,7 +4991,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5718,11 +5741,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5734,11 +5757,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5790,19 +5829,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Napravi"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Napravi"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6644,14 +6721,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6713,15 +6782,15 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "Linearna"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
msgstr ""
@@ -7088,6 +7157,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7176,17 +7249,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7533,7 +7615,7 @@ msgid "New Animation"
msgstr "Optimizuj Animaciju"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8219,7 +8301,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9320,11 +9402,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9332,11 +9419,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9551,6 +9638,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9598,6 +9686,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9978,11 +10073,19 @@ msgid "Batch Rename"
msgstr "Animacija Preimenuj Kanal"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10020,11 +10123,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10050,10 +10153,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10062,11 +10161,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10085,6 +10184,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10148,7 +10255,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10185,6 +10292,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Animacija Obriši Ključeve"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "Animacija Obriši Ključeve"
@@ -10309,6 +10421,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10357,11 +10476,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10481,6 +10600,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10521,6 +10644,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10529,7 +10656,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10554,6 +10681,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10623,6 +10756,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Napravi"
@@ -10672,7 +10809,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11555,6 +11692,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11578,6 +11719,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11755,6 +11922,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11942,6 +12115,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11962,6 +12140,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12181,6 +12364,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/sv.po b/editor/translations/sv.po
index 0da6531121..ff50441f17 100644
--- a/editor/translations/sv.po
+++ b/editor/translations/sv.po
@@ -5,19 +5,25 @@
# bergmarklund <davemcgroin@gmail.com>, 2017, 2018.
# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017.
# Jakob Sinclair <sinclair.jakob@mailbox.org>, 2018.
-# . <grenoscar@gmail.com>, 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.
# Toiya <elviraa98@gmail.com>, 2019.
# Fredrik Welin <figgemail@gmail.com>, 2019.
# Mattias Münster <mattiasmun@gmail.com>, 2019.
+# Anonymous <noreply@weblate.org>, 2020.
+# Joakim Lundberg <joakim@joakimlundberg.com>, 2020.
+# Kristoffer Grundström <swedishsailfishosuser@tutanota.com>, 2020.
+# Jonas Robertsson <jonas.robertsson@posteo.net>, 2020.
+# André Andersson <andre.eric.andersson@gmail.com>, 2020.
+# Andreas Westrell <andreas.westrell@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-11-25 04:05+0000\n"
-"Last-Translator: Mattias Münster <mattiasmun@gmail.com>\n"
+"PO-Revision-Date: 2020-08-18 02:54+0000\n"
+"Last-Translator: Andreas Westrell <andreas.westrell@gmail.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/"
"godot/sv/>\n"
"Language: sv\n"
@@ -25,7 +31,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 3.10-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -34,14 +40,13 @@ msgstr "Ogiltligt typargument till convert(), använd TYPE_* konstanter."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Förväntas en string av längden 1 (en karaktär)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
-"Inte tillräckligt antal bytes eller ogiltigt format för avkodning av bytes."
+msgstr "Inte tillräckligt med bytes för avkodning byte, eller ogiltigt format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -73,31 +78,31 @@ msgstr "I anrop till '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -149,7 +154,7 @@ msgstr "Anim Ta Bort Nycklar"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "Anim Ändra Tid för Nyckebild"
+msgstr "Anim Ändra Nyckelbildstid"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
@@ -161,34 +166,29 @@ msgstr "Anim Ändra Transformation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Anim Ändra Värde På Nyckelbild"
+msgstr "Anim Ändra Värdet På Tidsnyckeln"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
msgstr "Anim Ändra Anrop"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "Anim Ändra Tid för Nyckebild"
+msgstr "Anim Fler-Ändra Nyckelbildstid"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "Anim Ändra Övergång"
+msgstr "Anim Fler-Ändra Övergång"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "Anim Ändra Transformation"
+msgstr "Anim Fler-Ändra Transformation"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "Anim Ändra Värde På Nyckelbild"
+msgstr "Anim Fler-Ändra Nyckelbildsvärde"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
msgstr "Anim Ändra Anrop"
@@ -203,43 +203,39 @@ msgstr "Ändra Animationsloop"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Egenskapsspår"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Transformera"
+msgstr "3D Transformationsspår"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Anropa Metod Spår"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezier kurvspår"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Ljuduppspelningsspår"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
-msgstr ""
+msgstr "Animationsuppspelningsspår"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (frames)"
-msgstr "Animation längd (i sekunder)."
+msgstr "Animation längd (bildrutor)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
-msgstr "Animation längd (i sekunder)."
+msgstr "Animationens längd (sekunder)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Anim Lägg till spår"
+msgstr "Lägg till spår"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
@@ -259,9 +255,8 @@ msgid "Anim Clips:"
msgstr "Animklipp:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Track Path"
-msgstr "Ändra Arrays Värde"
+msgstr "Ändra spårväg"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
@@ -269,21 +264,19 @@ msgstr "Ändra spårets läge till på/av."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Uppdateringsläge (Hur denna egenskap sätts)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Animations-Node"
+msgstr "Interpolationsläge"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Återgående slingläge (Interpolerar slutet med början på slingan)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Ta bort valt spår."
+msgstr "Ta bort detta spår."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
@@ -291,7 +284,7 @@ msgstr "Tid (s): "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "Växla Spår På"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -303,7 +296,7 @@ msgstr "Diskret"
#: editor/animation_track_editor.cpp
msgid "Trigger"
-msgstr "Utlös"
+msgstr "Avtryckare"
#: editor/animation_track_editor.cpp
msgid "Capture"
@@ -324,11 +317,11 @@ msgstr "Kubik"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Begränsa Sling Interpolering"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Återgåendeslinginterpolering"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -348,14 +341,12 @@ msgid "Change Animation Update Mode"
msgstr "Ändra Animationens Uppdateringsläge"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "Animations-Node"
+msgstr "Ändra Animationsinterpoleringsläge"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "Ändra Anim Loop"
+msgstr "Ändra Animationsslingläge"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -388,6 +379,7 @@ msgstr "Anim Infoga"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"Animationsspelaren kan inte animera sig själv, utan bara andra spelare."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -402,18 +394,16 @@ msgid "Anim Insert Key"
msgstr "Anim Infoga Nyckel"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "Ändra Animationsnamn:"
+msgstr "Ändra Animationssteg"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "Ändra ordning på Autoloads"
+msgstr "Ändra ordning på spår"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Applicera Transformationsspår enbart på 3D-noder."
#: editor/animation_track_editor.cpp
msgid ""
@@ -422,22 +412,27 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Ljudspår kan bara peka på noder av typ:\n"
+"-LjudStrömsSpelare\n"
+"-LjudStrömsSpelare2D\n"
+"-LjudStrömsSpelare3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Animationsspår kan bara peka på AnimationsSpelar noder."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"En animationsspelare kan inte animera sig själv, utan bara andra spelare."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Det är inte möjligt att lägga till ett nytt spår utan en rot-nod"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Felaktigt spår för Bezier (ej lämplig delegenskap)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
@@ -456,37 +451,32 @@ msgid "Add Transform Track Key"
msgstr "Lägg till kurvförändringsnyckel"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "Anim Lägg till spår"
+msgstr "Lägg till spårnyckel"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Spårväg ogiltig, kan således inte lägga till en metod nyckel."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "Anim Infoga Spår & Nyckel"
+msgstr "Lägg till metodspårnyckel"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet hittades inte i Skript: "
+msgstr "Metoden hittades inte i objektet: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Anim Flytta Nycklar"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Sökvägen är tom"
+msgstr "Urklipp är tomt"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Klistra in Params"
+msgstr "Klistra in spår"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -496,6 +486,8 @@ msgstr "Anim Skala Nycklar"
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."
#: editor/animation_track_editor.cpp
msgid ""
@@ -509,39 +501,46 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
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 importinstä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."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "Varning: Redigerar importerad animation"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr "Välj en AnimationPlayer från Scenträdet för att redigera animationer."
+msgstr "Välj en AnimationsSpelar-nod för att skapa och redigera animationer."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Visa enbart spår från valda noder i trädet."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Gruppera spår efter noder eller visa dem som enkel lista."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "Steg (s):"
+msgstr "Fäst:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Animation"
+msgstr "Animationens stegvärde."
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "Sekunder"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -556,14 +555,12 @@ msgid "Edit"
msgstr "Redigera"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Animation"
+msgstr "Animationens egenskaper."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Kopiera Params"
+msgstr "Kopiera Spår"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -575,26 +572,23 @@ msgstr "Skala Från Muspekare"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "Duplicera urval"
+msgstr "Fördubbla val"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "Duplicera Transponerade"
+msgstr "Fördubbla Transponerade"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Duplicera urval"
+msgstr "Radera Markering"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "Gå Till Nästa Steg"
+msgstr "Gå till Nästa Steg"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "Ge Till Föregående Steg"
+msgstr "Gå till Föregående Steg"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -602,15 +596,15 @@ msgstr "Optimera Animation"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr "Städa upp Animation"
+msgstr "Rensa Animation"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Välj noden som ska animeras:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Använd Bezier-kurvor"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -657,9 +651,8 @@ msgid "Scale Ratio:"
msgstr "Skalnings förhållande:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "Ange övergångar:"
+msgstr "Välj Spår att Kopiera"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -671,22 +664,20 @@ msgid "Copy"
msgstr "Kopiera"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "Välj Node"
+msgstr "Välj Alla/Inga"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "Ljud-Lyssnare"
+msgstr "Lägg till Ljudspårsklipp"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "Byt Ljudspårsklippets Startförskjutning"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "Byt Ljudspårsklippets Slutförskjutning"
#: editor/array_property_edit.cpp
msgid "Resize Array"
@@ -709,17 +700,16 @@ msgid "Line Number:"
msgstr "Radnummer:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Ersatte %d förekomst(er)."
+msgid "%d replaced."
+msgstr "%d ersatt."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "%d matcha."
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "Inga matchningar"
+msgstr "%d matchningar."
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -729,7 +719,7 @@ msgstr "Matcha gemener/versaler"
msgid "Whole Words"
msgstr "Hela Ord"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Ersätt"
@@ -744,11 +734,11 @@ msgstr "Endast Urval"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "Standard"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "Växla Skriptpanel"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -767,46 +757,44 @@ msgid "Reset Zoom"
msgstr "Återställ Zoom"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings"
-msgstr "Varning"
+msgstr "Varningar"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "Rad- och Kolumnnummer."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "Metod i Mål-Node måste specificeras!"
+msgstr "Metod i målnod måste specificeras."
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Metodnamn måste vara en giltig identifierare."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
msgstr ""
-"Målmetod hittades inte! Specificera en giltig metod eller koppla ett skript "
-"till Mål-Node."
+"Målmetod hittades inte. Specificera en giltig metod eller koppla ett skript "
+"till målnoden."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "Anslut Till Node:"
+msgstr "Anslut till Nod:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "Anslut Till Node:"
+msgstr "Anslut till Skript:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "Signaler:"
+msgstr "Från Signal:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "Scenen innehåller inte något skript."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -834,14 +822,12 @@ msgid "Extra Call Arguments:"
msgstr "Extra Call Argument:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "Filtrera noder"
+msgstr "Mottagarmetod:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "Balanserad"
+msgstr "Avancerad"
#: editor/connections_dialog.cpp
msgid "Deferred"
@@ -851,6 +837,8 @@ msgstr "Uppskjuten"
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
msgstr ""
+"Skjuter upp signalen och sparar den i en kö och avfyrar den endast under "
+"vilotid."
#: editor/connections_dialog.cpp
msgid "Oneshot"
@@ -858,18 +846,16 @@ msgstr "Oneshot"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr ""
+msgstr "Kopplar av signalen efter sitt första utsläpp."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "Ansluter Signal:"
+msgstr "Kan ej ansluta signal"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -885,23 +871,20 @@ msgid "Connect"
msgstr "Anslut"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
-msgstr "Signaler:"
+msgstr "Signal:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
msgstr "Anslut '%s' till '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect '%s' from '%s'"
-msgstr "Anslut '%s' till '%s'"
+msgstr "Koppla av '%s' från '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Anslut '%s' till '%s'"
+msgstr "Koppla av alla från signal: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -913,55 +896,53 @@ msgid "Disconnect"
msgstr "Koppla från"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "Ansluter Signal:"
+msgstr "Anslut en Signal till en Metod"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "Anslutningsfel"
+msgstr "Redigera Koppling:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr ""
+msgstr "Är du säker att du vill ta bort alla kopplingar från \"%s\" signalen?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "Signaler"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Filtrera Filer..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Är du säker att du vill ta bort alla kopplingar från denna signal?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Koppla från"
+msgstr "Koppla av alla"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Redigera"
+msgstr "Ändra..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Metoder"
+msgstr "Gå Till Metod"
#: editor/create_dialog.cpp
-#, fuzzy
msgid "Change %s Type"
-msgstr "Ändra Typ"
+msgstr "Ändra %s Typ"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
msgid "Change"
msgstr "Ändra"
#: editor/create_dialog.cpp
-#, fuzzy
msgid "Create New %s"
-msgstr "Skapa Ny"
+msgstr "Skapa Ny %s"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
@@ -973,7 +954,7 @@ msgid "Recent:"
msgstr "Senaste:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Sök:"
@@ -1001,22 +982,20 @@ msgid "Dependencies For:"
msgstr "Beroenden För:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
"Scen '%s' håller på att redigeras.\n"
-"Ändringarna börjar inte gälla förrän omladdning."
+"Ändringar börjar inte gälla förrän omladdning."
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
"Resurs '%s' är i användning.\n"
-"Ändringarna börjar gälla när den laddas om."
+"Ändringar börjar endast gälla efter omladdning."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -1063,9 +1042,8 @@ msgid "Owners Of:"
msgstr "Ägare av:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "Ta bort valda filer från projektet? (går inte ångra)"
+msgstr "Ta bort valda filer från projektet? (Kan ej återställas)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1077,9 +1055,8 @@ msgstr ""
"Ta bort dem ändå? (går inte ångra)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Cannot remove:"
-msgstr "Kan inte ta bort:\n"
+msgstr "Kan inte ta bort:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
@@ -1159,10 +1136,12 @@ msgstr "Projektgrundare"
msgid "Lead Developer"
msgstr "Ledande utvecklare"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Manager "
-msgstr "Projektledare"
+msgstr "Projektledare "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1181,6 +1160,16 @@ msgid "Gold Sponsors"
msgstr "Guldsponsorer"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Silverdonatorer"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronsdonatorer"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Minisponsorer"
@@ -1205,12 +1194,10 @@ msgid "License"
msgstr "Licens"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
msgstr "Tredje parts Licens"
#: editor/editor_about.cpp
-#, fuzzy
msgid ""
"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
@@ -1235,14 +1222,12 @@ msgid "Licenses"
msgstr "Licenser"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Error opening package file, not in ZIP format."
-msgstr "Fel vid öppning av paketetfil, inte i zip-format."
+msgstr "Fel vid öppning av paketfil, är inte ZIP-format."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "Autoload '%s' finns redan!"
+msgstr "%s (Existerar Redan)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1250,15 +1235,13 @@ msgstr "Dekomprimerar Tillgångar"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "Följande filer gick inte att packa upp från tillägget:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "%d fler filer"
+msgstr "%d fler filer."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Package installed successfully!"
msgstr "Paketet installerades!"
@@ -1268,9 +1251,8 @@ msgid "Success!"
msgstr "Klart!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "Innehåll:"
+msgstr "Packet Innehåll:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1293,9 +1275,8 @@ msgid "Rename Audio Bus"
msgstr "Byt namn på Ljud-Buss"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Change Audio Bus Volume"
-msgstr "Växla Ljud-Buss Solo"
+msgstr "Växla Ljud-Buss Volum"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
@@ -1403,7 +1384,7 @@ msgstr "Öppna Ljud-Buss Layout"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "Det finns ingen '%s' fil."
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -1414,18 +1395,16 @@ msgid "Invalid file, not an audio bus layout."
msgstr "Ogiltig fil, inte en Ljud-Buss Layout."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Fel vid sparande av TileSet!"
+msgstr "Fel vid sparande av fil: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
msgstr "Lägg till Buss"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Add a new Audio Bus to this layout."
-msgstr "Spara Ljud-Buss Layout Som..."
+msgstr "Lägg till en ny Audio-Buss för detta layout"
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1484,7 +1463,7 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr ""
+msgstr "Nyckelord kan inte användas som ett autoladdningsnamn."
#: editor/editor_autoload_settings.cpp
msgid "Autoload '%s' already exists!"
@@ -1506,7 +1485,7 @@ msgstr "Flytta Autoload"
msgid "Remove Autoload"
msgstr "Ta bort Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Aktivera"
@@ -1514,18 +1493,9 @@ msgstr "Aktivera"
msgid "Rearrange Autoloads"
msgstr "Ändra ordning på Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Ogiltig Sökväg."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Fil existerar inte."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Inte i resursens sökväg."
+msgid "Can't add autoload:"
+msgstr "Kunde inte lägga till autoladdning:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1552,6 +1522,10 @@ msgstr "Namn"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Klistra in Params"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Uppdaterar Scen"
@@ -1572,7 +1546,7 @@ msgstr "(tom)"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr "[osparad]"
+msgstr "[inte sparad]"
#: editor/editor_dir_dialog.cpp
#, fuzzy
@@ -1611,7 +1585,7 @@ msgstr "Lagrar Fil:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr ""
+msgstr "Ingen exportmall hittades vid den förväntade sökvägen:"
#: editor/editor_export.cpp
msgid "Packing"
@@ -1622,12 +1596,16 @@ msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"Målplattformen kräver 'ETC' texturkomprimering för GLES2. Aktivera 'Import "
+"Etc' i Projektinställningarna."
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"Målplattformen kräver 'ETC2' texturkomprimering för GLES3. Aktivera 'Import "
+"Etc 2' i Projektinställningarna."
#: editor/editor_export.cpp
msgid ""
@@ -1640,9 +1618,8 @@ msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "Mallfil hittades inte:\n"
+msgstr "Mallfil hittades inte:"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1651,9 +1628,8 @@ msgid "Custom release template not found."
msgstr ""
#: editor/editor_export.cpp platform/javascript/export/export.cpp
-#, fuzzy
msgid "Template file not found:"
-msgstr "Mallfil hittades inte:\n"
+msgstr "Mallfil hittades inte:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
@@ -1680,17 +1656,18 @@ msgstr "Scenträd (Noder):"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "Importera"
+msgid "Node Dock"
+msgstr "Node Namn:"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Node Dock"
-msgstr "Node Namn:"
+msgid "FileSystem Dock"
+msgstr "FilSystem"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr ""
+#, fuzzy
+msgid "Import Dock"
+msgstr "Importera"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1858,7 +1835,7 @@ msgstr "Visa I Filhanteraren"
msgid "New Folder..."
msgstr "Ny Mapp..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Uppdatera"
@@ -1978,7 +1955,7 @@ msgstr "Kataloger & Filer:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Förhandsvisning:"
@@ -2436,10 +2413,6 @@ msgid "There is no defined scene to run."
msgstr "Det finns ingen definierad scen att köra."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Nuvarande scen har aldrig sparats, vänligen spara den innan körning."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Kunde inte starta underprocess!"
@@ -2528,12 +2501,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "Kan inte ladda om en scen som aldrig har sparats."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Återställ"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "Spara Scen"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Åtgärden kan inte ångras. Återställ ändå?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
#, fuzzy
@@ -2813,9 +2789,8 @@ msgid "Convert To..."
msgstr "Konvertera Till..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "MeshLibrary..."
-msgstr "MeshLibrary..."
+msgstr "MeshBibliotek..."
#: editor/editor_node.cpp
#, fuzzy
@@ -2833,10 +2808,6 @@ msgid "Redo"
msgstr "Ångra"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Återställ Scen"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2901,22 +2872,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2925,8 +2900,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2935,32 +2910,34 @@ msgstr "Synlig Navigation"
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Synkronisera scenändringar"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Synkronisera skriptändringar"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2977,9 +2954,8 @@ msgid "Editor Layout"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "Vettigt!"
+msgstr "Ta Skärmdump"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
@@ -3024,7 +3000,7 @@ msgstr "Hjälp"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Sök"
@@ -3038,7 +3014,12 @@ msgid "Q&A"
msgstr "Frågor och svar"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Importera om"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3220,9 +3201,8 @@ msgid "Open the previous Editor"
msgstr ""
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "Varning"
+msgstr "Varning!"
#: editor/editor_path.cpp
#, fuzzy
@@ -3439,7 +3419,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3466,6 +3447,10 @@ msgstr "Kunde inte köra Skript:"
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Välj Nod(er) att Importera"
@@ -3945,14 +3930,12 @@ msgid "Cancel"
msgstr "Avbryt"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "Hitta"
+msgstr "Hitta:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "Ersätt"
+msgstr "Ersätt:"
#: editor/find_in_files.cpp
#, fuzzy
@@ -3978,9 +3961,8 @@ msgid "Remove from Group"
msgstr "Ta bort från Grupp"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ERROR: Animationsnamn finns redan!"
+msgstr "Gruppnamn existerar redan."
#: editor/groups_editor.cpp
#, fuzzy
@@ -4105,10 +4087,18 @@ msgid "Error running post-import script:"
msgstr "Fel uppstod efter importering av skript:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Sparar..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Filer"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Ange som Standard för '%s'"
@@ -4117,10 +4107,6 @@ msgid "Clear Default for '%s'"
msgstr "Rensa Standarden för '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr ""
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Importera Som:"
@@ -4134,7 +4120,7 @@ msgid "Reimport"
msgstr "Importera om"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4170,10 +4156,6 @@ msgid "Copy Params"
msgstr "Kopiera Params"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Klistra in Params"
-
-#: editor/inspector_dock.cpp
#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "Resurs"
@@ -4420,9 +4402,8 @@ msgid "Open Animation Node"
msgstr "Animations-Node"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "ERROR: Animationsnamn finns redan!"
+msgstr "Triangel existerar redan."
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
@@ -4653,14 +4634,12 @@ msgid "Duplicate Animation"
msgstr "Duplicera Animation"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "Animation zoom."
+msgstr "Ingen animation finns att kopiera!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "Inte i resursens sökväg."
+msgstr "Ingen animationsresurs i urklipp!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -4671,9 +4650,8 @@ msgid "Paste Animation"
msgstr "Klistra in Animation"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "Animations-Node"
+msgstr "Ingen animation finns att redigera!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -4709,7 +4687,7 @@ msgstr "Animeringsverktyg"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation"
-msgstr "Animering"
+msgstr "Animation"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -4818,9 +4796,8 @@ msgid "Move Node"
msgstr "Flytta Nod(er)"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Övergång"
+msgstr "Övergång existerar!"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -4906,9 +4883,8 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Övergång"
+msgstr "Övergång:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -5292,7 +5268,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Förhandsgranska"
@@ -6069,11 +6045,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Kunde inte skapa mapp."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6085,12 +6062,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "Skapa Ny"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "Kunde inte skapa mapp."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "Skapa Ny"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6142,19 +6137,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "Skapa Prenumeration"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "Skapa Prenumeration"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV1"
msgstr "Visa"
@@ -7028,14 +7061,6 @@ msgid "Open Godot online documentation."
msgstr "Öppna Senaste"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -7102,15 +7127,15 @@ msgid ""
msgstr "Anslut '%s' till '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "Rad:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "Funktion:"
@@ -7492,6 +7517,10 @@ msgid "This operation requires a single selected node."
msgstr "Åtgärden kräver en enstaka vald Node."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Lock View Rotation"
msgstr "Visa Information"
@@ -7582,18 +7611,27 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Visa Information"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "Visa Information"
+msgid "XForm Dialog"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7822,9 +7860,8 @@ msgid "LightOccluder2D Preview"
msgstr "Skapa Mapp"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Sökvägen är tom"
+msgstr "Spriten är tom!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
@@ -7949,7 +7986,7 @@ msgid "New Animation"
msgstr "Animation"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8669,7 +8706,7 @@ msgstr "TileSet..."
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Fel"
@@ -9797,11 +9834,18 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+#, fuzzy
+msgid "The path specified doesn't exist."
msgstr "Sökvägen finns inte."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Fel vid öppning av paketetfil, inte i zip-format."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9809,11 +9853,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -10040,6 +10084,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Projektledare"
@@ -10088,6 +10133,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Nyckel "
@@ -10111,9 +10163,8 @@ msgid ""
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "ERROR: Animationsnamn finns redan!"
+msgstr "En process med namnet '%s' existerar redan."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
@@ -10473,15 +10524,25 @@ msgid "Batch Rename"
msgstr "Byt namn"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Ersätt:"
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Nuvarande Version:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Advanced Options"
msgstr "Alternativ"
@@ -10520,11 +10581,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10551,10 +10612,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10563,11 +10620,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10589,6 +10646,16 @@ msgstr "Versaler"
msgid "Reset"
msgstr "Återställ Zoom"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Nuvarande Version:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Giltiga tecken:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Byt Förälder-Node"
@@ -10652,8 +10719,9 @@ msgid "Instance Child Scene"
msgstr "Instansiera Barn-Scen"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Fäst Skript"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10684,9 +10752,13 @@ msgid "Instantiated scenes can't become root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "Vettigt!"
+msgstr "Gör nod som Rot"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Ta bort Nod(er)"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10737,9 +10809,8 @@ msgid "Make Local"
msgstr "Gör Patch"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "Vettigt!"
+msgstr "Ny Scenrot"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10823,6 +10894,13 @@ msgid "Open Documentation"
msgstr "Öppna Senaste"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Lägg till Barn-Node"
@@ -10841,9 +10919,8 @@ msgid "Reparent to New Node"
msgstr "Byt Förälder-Node"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "Vettigt!"
+msgstr "Skapa Scenrot"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10873,12 +10950,14 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
msgstr "Koppla på ett nytt eller befintligt Skript till vald Node."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Detach the script from the selected node."
+msgstr "Koppla på ett nytt eller befintligt Skript till vald Node."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -11009,6 +11088,10 @@ msgid "A directory with the same name exists."
msgstr "Katalog med samma namn finns redan"
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Fil existerar inte."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Måste använda en giltigt filändelse."
@@ -11053,6 +11136,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Ogiltig Sökväg."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Ogiltigt namn."
@@ -11062,7 +11150,7 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr "Skript giltigt"
#: editor/script_create_dialog.cpp
@@ -11086,9 +11174,14 @@ msgid "Will load an existing script file."
msgstr "Ladda in befintlig Skript-fil"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "Autoload '%s' finns redan!"
+msgstr "Skriptfil existerar redan."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11170,6 +11263,10 @@ msgid "Copy Error"
msgstr "Fel"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Radera punkter"
@@ -11219,8 +11316,9 @@ msgid "Total:"
msgstr "Totalt:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Exportera Projekt"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12122,6 +12220,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12146,6 +12248,32 @@ msgstr "Ogiltigt namn."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12206,9 +12334,8 @@ msgid "Run exported HTML in the system's default browser."
msgstr "Kör exporterad HTML i systemets standardwebbläsare."
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not write file:"
-msgstr "Kunde inte skriva till filen:\n"
+msgstr "Kunde inte skriva till filen:"
#: platform/javascript/export/export.cpp
#, fuzzy
@@ -12224,9 +12351,8 @@ msgid "Could not read custom HTML shell:"
msgstr ""
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not read boot splash image file:"
-msgstr "Kunde inte skriva till filen:\n"
+msgstr "Kunde inte skriva till filen:"
#: platform/javascript/export/export.cpp
msgid "Using default boot splash image."
@@ -12339,6 +12465,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12543,6 +12675,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12563,6 +12700,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12676,9 +12818,8 @@ msgid "In node '%s', invalid animation: '%s'."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ERROR: Ogiltigt animationsnamn!"
+msgstr "Ogiltig animation: '%s'."
#: scene/animation/animation_tree.cpp
#, fuzzy
@@ -12791,6 +12932,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12822,6 +12967,25 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr ""
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Nuvarande scen har aldrig sparats, vänligen spara den innan körning."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Inte i resursens sökväg."
+
+#~ msgid "Revert"
+#~ msgstr "Återställ"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Åtgärden kan inte ångras. Återställ ändå?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Återställ Scen"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Ersatte %d förekomst(er)."
+
#, fuzzy
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
diff --git a/editor/translations/ta.po b/editor/translations/ta.po
index 0c08e2f565..bff90ce603 100644
--- a/editor/translations/ta.po
+++ b/editor/translations/ta.po
@@ -4,13 +4,14 @@
# This file is distributed under the same license as the Godot source code.
#
# Senthil Kumar K <logickumar@gmail.com>, 2017.
-#
+# Survesh VRL <123survesh@gmail.com>, 2020.
+# Sridhar <sreeafmarketing@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-12-13 14:43+0100\n"
-"Last-Translator: Senthil Kumar K <logickumar@gmail.com>\n"
+"PO-Revision-Date: 2020-09-01 10:38+0000\n"
+"Last-Translator: Sridhar <sreeafmarketing@gmail.com>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/godot-engine/godot/"
"ta/>\n"
"Language: ta\n"
@@ -18,34 +19,37 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Poedit 2.2\n"
+"X-Generator: Weblate 4.2.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "தவறான வகை வாதம் மாற்று(), TYPE_ * மாறிலிகளைப் பயன்படுத்தவும்."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "நீளமுள்ள சொல் (ஒரு எழுத்து) எதிர்பார்க்கப்படுகிறது."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "டிகோடிங் போதுமான பைட்டுகள் இல்லை, அல்லது தவறான வடிவத்தில் உள்ளது."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "தவறான உள்ளீடு% i (அனுப்பப்படவில்லை) இல் வெளிப்பாட்டில்"
#: core/math/expression.cpp
+#, fuzzy
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"சுயத்தை பயன்படுத்த முடியாது, ஏனெனில் உதாரணம்(instance) பூஜ்யமானது "
+"(நிறைவேற்றப்படவில்லை)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "ஆபரேட்டர்% s,% s மற்றும்% s க்கு தவறான செயல்பாடுகள் உள்ளது."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
@@ -526,6 +530,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -688,7 +693,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -707,7 +712,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -757,6 +762,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -836,7 +845,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -894,6 +902,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -931,7 +943,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1105,6 +1117,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1126,6 +1141,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1429,7 +1452,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1437,16 +1460,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1474,6 +1489,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1593,15 +1612,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1751,7 +1770,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1865,7 +1884,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2276,10 +2295,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2364,11 +2379,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2635,10 +2652,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2698,22 +2711,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2722,8 +2739,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2732,32 +2749,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2818,7 +2835,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2832,7 +2849,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3215,7 +3236,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3242,6 +3264,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3828,19 +3854,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3856,7 +3886,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3890,10 +3920,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4949,7 +4975,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5688,11 +5714,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5704,11 +5730,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5760,11 +5802,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5772,6 +5843,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6610,14 +6689,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6679,11 +6750,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7048,6 +7119,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7136,17 +7211,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7486,7 +7570,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8149,7 +8233,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9241,11 +9325,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9253,11 +9342,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9472,6 +9561,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9518,6 +9608,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9897,11 +9994,19 @@ msgid "Batch Rename"
msgstr "அசைவூட்டு பாதைக்கு மறுபெயர் இடு"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9939,11 +10044,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9969,10 +10074,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9981,11 +10082,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10004,6 +10105,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10067,7 +10176,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10104,6 +10213,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "அனைத்து தேர்வுகள்"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "அனைத்து தேர்வுகள்"
@@ -10228,6 +10342,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10274,11 +10395,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10399,6 +10520,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10439,6 +10564,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10447,7 +10576,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10471,6 +10600,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10539,6 +10674,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10587,7 +10726,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11463,6 +11602,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11486,6 +11629,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11663,6 +11832,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11850,6 +12025,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11870,6 +12050,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12089,6 +12274,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/te.po b/editor/translations/te.po
index 2efe179ce6..2c6d8146e2 100644
--- a/editor/translations/te.po
+++ b/editor/translations/te.po
@@ -2,11 +2,11 @@
# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
-# suresh p <suresh9247@gmail.com>, 2019.
+# suresh p <suresh9247@gmail.com>, 2019, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-01-16 20:20+0000\n"
+"PO-Revision-Date: 2020-09-15 07:17+0000\n"
"Last-Translator: suresh p <suresh9247@gmail.com>\n"
"Language-Team: Telugu <https://hosted.weblate.org/projects/godot-engine/"
"godot/te/>\n"
@@ -14,16 +14,17 @@ 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 3.4-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
+"() కు మార్చడానికి ఈ వాదన (argument) సరికాదు, దానికి TYPE_* స్థిరాంకాలను(constants) ఉపయోగించండి."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "స్ట్రింగ్(string ) యొక్క పొడవు 1 అక్షరం మాత్రమే ఆశిస్తుంది."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -39,11 +40,11 @@ msgstr "వ్యక్తీకరణలో చెల్లని ఇన్ప
#: core/math/expression.cpp
#, fuzzy
msgid "self can't be used because instance is null (not passed)"
-msgstr "తనకు తానుగా ఉపయోగించుకోలేదు ఎందుకంటే instance ఒక శూన్యం (ఆమోదించబడలేదు )"
+msgstr "తనకు తానుగా(self) ఉపయోగించుకోలేదు ఎందుకంటే instance ఒక శూన్యం (ఆమోదించబడలేదు )"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "oparator % s,% s మరియు % s కు చెల్లని oparands."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
@@ -508,6 +509,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -667,7 +669,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -686,7 +688,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -736,6 +738,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -815,7 +821,6 @@ msgstr ""
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -872,6 +877,10 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Filter signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -909,7 +918,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1083,6 +1092,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1104,6 +1116,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1407,7 +1427,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1415,16 +1435,8 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1452,6 +1464,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1571,15 +1587,15 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
+msgid "Node Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Node Dock"
+msgid "FileSystem Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1728,7 +1744,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1842,7 +1858,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2252,10 +2268,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2340,11 +2352,13 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
+msgid "Reload Saved Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2610,10 +2624,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2673,22 +2683,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2697,8 +2711,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2707,32 +2721,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2792,7 +2806,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2806,7 +2820,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3188,7 +3206,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3215,6 +3234,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3799,19 +3822,23 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
+msgid "%d Files"
msgstr ""
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3827,7 +3854,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3861,10 +3888,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -4908,7 +4931,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5640,11 +5663,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5656,11 +5679,27 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5712,11 +5751,40 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5724,6 +5792,14 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6560,14 +6636,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6629,11 +6697,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -6997,6 +7065,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7085,17 +7157,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7432,7 +7513,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8088,7 +8169,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9173,11 +9254,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9185,11 +9271,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9404,6 +9490,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9450,6 +9537,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -9827,11 +9921,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9869,11 +9971,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -9899,10 +10001,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -9911,11 +10009,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -9934,6 +10032,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -9997,7 +10103,7 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
+msgid "Detach Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10033,6 +10139,10 @@ msgid "Make node as Root"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr ""
@@ -10155,6 +10265,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10201,11 +10318,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10325,6 +10442,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10365,6 +10486,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10373,7 +10498,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10397,6 +10522,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10465,6 +10596,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr ""
@@ -10513,7 +10648,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11379,6 +11514,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11402,6 +11541,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11579,6 +11744,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -11766,6 +11937,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -11786,6 +11962,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12005,6 +12186,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
diff --git a/editor/translations/th.po b/editor/translations/th.po
index 73a18a006d..d1afffd2cd 100644
--- a/editor/translations/th.po
+++ b/editor/translations/th.po
@@ -5,12 +5,14 @@
# Kaveeta Vivatchai <goodytong@gmail.com>, 2017.
# Poommetee Ketson (Noshyaar) <poommetee@protonmail.com>, 2017-2018.
# Thanachart Monpassorn <nunf_2539@hotmail.com>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
+# Lon3r <mptube.p@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-03 21:21+0000\n"
-"Last-Translator: Thanachart Monpassorn <nunf_2539@hotmail.com>\n"
+"PO-Revision-Date: 2020-08-28 13:09+0000\n"
+"Last-Translator: Lon3r <mptube.p@gmail.com>\n"
"Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/"
"th/>\n"
"Language: th\n"
@@ -18,7 +20,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 3.10\n"
+"X-Generator: Weblate 4.2.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -41,30 +43,27 @@ msgstr "ค่าอินพุตผิดพลาด %i (ไม่ผ่า
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "self ไม่สามารถใช้ได้เนื่องจาก instance มีค่า null (ไม่ผ่าน)"
+msgstr "self ไม่สามารถใช้ได้เนื่องจาก instance ว่าง (ไม่ผ่าน)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "ไม่พบคุณสมบัติ '%s' ในโหนด %s"
+msgstr "ดำเนินการผิดพลาดที่ตัวดำเนินการ %s, %s และ %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "ไม่พบคุณสมบัติ '%s' ในโหนด %s"
+msgstr "ดัชนีของชนิด '%s' ผิดพลาด ในชนิดฐาน %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "ชื่อดัชนีของ '%s' ผิดพลาด สำหรับฐาน %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": ประเภทตัวแปรไม่ถูกต้อง: "
+msgstr "อาร์กิวเมนต์ของคอนสตรัค '%s' ผิดพลาด"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "เรียก '%s':"
#: core/ustring.cpp
msgid "B"
@@ -100,12 +99,11 @@ msgstr "อิสระ"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr "สมดุล"
+msgstr "ความสมดุล"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "สะท้อนซ้ายขวา"
+msgstr "กระจก"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -116,29 +114,24 @@ msgid "Value:"
msgstr "ค่า:"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "เพิ่มคีย์"
+msgstr "เพิ่มปุ่มที่นี่"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "ทำซ้ำที่เลือก"
+msgstr "ทำซ้ำคีย์ที่เลือก"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "ลบสิ่งที่เลือก"
+msgstr "ลบคีย์ที่เลือก"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Add Bezier Point"
-msgstr "เพิ่มจุด"
+msgstr "เพิ่มจุดเบซิเยร์"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "ย้ายจุด"
+msgstr "ย้ายจุดเบซิเยร์"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -169,34 +162,28 @@ msgid "Anim Change Call"
msgstr "แก้ไขการเรียกฟังก์ชันแอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "แก้ไขเวลาคีย์เฟรมแอนิเมชัน"
+msgstr "แก้ไขเวลาคีย์เฟรมแอนิเมชันแบบหลายครั้ง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "แก้ไขทรานสิชันแอนิเมชัน"
+msgstr "แก้ไขทรานสิชันแอนิเมชันแบบหลายครั้ง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "เคลื่อนย้ายแอนิเมชัน"
+msgstr "แก้ไขการเปลี่ยนแปลงแอนิเมชันแบบหลายครั้ง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "แก้ไขค่าคีย์เฟรมแอนิเมชัน"
+msgstr "แก้ไขคีย์เฟรมแอนิเมชันแบบหลายครั้ง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "แก้ไขการเรียกฟังก์ชันแอนิเมชัน"
+msgstr "แก้ไขการเรียกแอนิเมชันแบบหลายครั้ง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "แก้ไขการวนซ้ำแอนิเมชัน"
+msgstr "แก้ไขความยาวแอนิเมชัน"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -204,51 +191,44 @@ msgid "Change Animation Loop"
msgstr "แก้ไขการวนซ้ำแอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "คุณสมบัติ:"
+msgstr "คุณสมบัติแทร็ก"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "ประเภทการเคลื่อนย้าย"
+msgstr "แทร็ก 3D Transform"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "เรียกแทร็กเมธอด"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "แทร็กเส้นโค้งเบซิเยร์"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "แทร็กการเล่นเสียง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "หยุดการเล่นแอนิเมชัน (S)"
+msgstr "แทร็กการเล่นแอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (frames)"
-msgstr "ความยาวแอนิเมชัน (วินาที)"
+msgstr "ความยาวแอนิเมชัน (เฟรม)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
msgstr "ความยาวแอนิเมชัน (วินาที)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "เพิ่มแทร็กแอนิเมชัน"
+msgstr "เพิ่มแทร็ก"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "ซูมแอนิเมชัน"
+msgstr "การวนซ้ำแอนิเมชัน"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -256,52 +236,44 @@ msgid "Functions:"
msgstr "ฟังก์ชัน:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "ตัวรับเสียง"
+msgstr "คลิปเสียง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "คลิป"
+msgstr "คลิปแอนิเมชั่น:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Track Path"
-msgstr "เปลี่ยนค่าในอาร์เรย์"
+msgstr "เปลี่ยนที่อยู่แทร็ก"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "โหมดไร้สิ่งรบกวน"
+msgstr "เปิด/ปิดการติดตามแทร็กนี้"
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "โหมดอัพเดท (วิธีตั้งค่าคุณสมบัตินี้)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "โหนดแอนิเมชัน"
+msgstr "โหมดการแก้ไข"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "โหมดวนรอบ (ต่อจุดสิ้นสุดด้วยจุดเริ่มต้นของลูป)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "ลบแทร็กที่เลือก"
+msgstr "ลบแทร็กนี้"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "ระยะเวลาเฟด (วิ):"
+msgstr "เวลา (วินาที): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle Track Enabled"
-msgstr "เปิดดอปเพลอร์"
+msgstr "เปิดการใช้งานการติดตามแทร็ก"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -316,13 +288,12 @@ msgid "Trigger"
msgstr "ทริกเกอร์"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "ฟีเจอร์"
+msgstr "จับ"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "ใกล้ที่สุด"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -331,15 +302,15 @@ msgstr "เส้นตรง"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "ลูกบาศก์"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "การจำกัดการวนลูป"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "ล้อมการวนซ้ำ"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -347,29 +318,24 @@ msgid "Insert Key"
msgstr "เพิ่มคีย์"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "ทำซ้ำโหนด"
+msgstr "สร้างคีย์ซ้ำอีกอัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "ลบโหนด"
+msgstr "ลบคีย์"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Update Mode"
-msgstr "เปลี่ยนชื่อแอนิเมชัน:"
+msgstr "เปลี่ยนโหมดการอัพเดทแอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "โหนดแอนิเมชัน"
+msgstr "เปลี่ยนโหมดการประมาณค่าช่วงของแอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "แก้ไขการวนซ้ำแอนิเมชัน"
+msgstr "เปลี่ยนโหมดการวนซ้ำแอนิเมชัน"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -401,7 +367,7 @@ msgstr "แทรกแอนิเมชัน"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "ตัวเล่นอนิเมชั่นไม่สามารถเล่นอนิเมชั่นด้วยตัวมันเองได้ เล่นได้เฉพาะตัวเล่นอื่นเท่านั้น"
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -416,18 +382,16 @@ msgid "Anim Insert Key"
msgstr "แทรกคีย์แอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "แก้ไขความเร็วแอนิเมชัน"
+msgstr "แก้ไขช่วงของแอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "จัดลำดับออโต้โหลด"
+msgstr "จัดเรียงแทร็ก"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "แปลงแทร็กเฉพาะที่ Spatial-based nodes"
#: editor/animation_track_editor.cpp
msgid ""
@@ -436,73 +400,70 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"แทร็กเสียงสามารถติดไว้บนโหนดชนิดเหล่านี้เท่านั้น:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "แทร็กอนิเมชั่นสามารถติดไว้บนโหนด AnimationPlayer เท่านั้น"
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "แทร็กอนิเมชั่นไม่สามารถเล่นตัวมันเองได้ แต่สามารถเล่นตัวเล่นอื่นได้"
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "ไม่สามารถที่จะเพิ่มแทร็กใหม่โดยที่ไม่มีรูท"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "แทร็กผิดพลาดสำหรับเบซิเยร์ (ไม่มีคุณสมบัติย่อยที่เข้ากันได้)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "เพิ่มแทร็กแอนิเมชัน"
+msgstr "เพิ่มแทร็กเบซิเยร์"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "ที่อยู่แทร็กผิดพลาด ไม่สามารถเพิ่มคีย์ได้"
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "แทร็กไม่ใช่ชนิด Spatial, ไม่สามารถเพิ่มคีย์ได้"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "ประเภทการเคลื่อนย้าย"
+msgstr "เพิ่มคีย์แทร็กการแปลง"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "เพิ่มแทร็กแอนิเมชัน"
+msgstr "เพิ่มแทร็กคีย์"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "ที่อยู่แทร็กผิดพลาด ไม่สามารถเพิ่มคีย์เมธอดได้"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "เพิ่มแทร็กและคีย์แอนิเมชัน"
+msgstr "เพิ่มคีย์แทร็กเมธอด"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "ไม่พบ VariableGet ในสคริปต์: "
+msgstr "ไม่พบเมธอดในออบเจกต์: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "ย้ายคีย์แอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "คลิปบอร์ดว่างเปล่า!"
+msgstr "คลิปบอร์ดว่างเปล่า"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "วางตัวแปร"
+msgstr "วางแทร็ก"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -511,7 +472,7 @@ msgstr "ปรับคีย์แอนิเมชัน"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "ตัวเลือกนี้ไม่สามารถทำงานกับแทร็กเบซิเยร์ เนื่องจากเป็นแค่แทร็กเดี่ยว"
#: editor/animation_track_editor.cpp
msgid ""
@@ -528,25 +489,23 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
-msgstr ""
+msgstr "คำเตือน: กำลังแก้ไขแอนิเมชันที่นำเข้ามา"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr "เลือก AnimationPlayer จากผังฉากเพื่อแก้ไขแอนิเมชัน"
+msgstr "เลือกโหนด AnimationPlayer เพื่อสร้างและแก้ไขแอนิเมชัน"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "โชว์แทร็กจากโหนดที่เลือกในผังเท่านั้น"
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "จำกัดการเคลื่อนย้าย"
+msgstr "สแนป:"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -555,11 +514,12 @@ msgstr "ผังแอนิเมชันถูกต้อง"
#: editor/animation_track_editor.cpp
msgid "Seconds"
-msgstr ""
+msgstr "วินาที"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr "เฟรมต่อวินาที"
+msgstr "เฟรมเรท"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -572,14 +532,12 @@ msgid "Edit"
msgstr "แก้ไข"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "ผังแอนิเมชัน"
+msgstr "คุณสมบัติแอนิเมชัน"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "คัดลอกตัวแปร"
+msgstr "คัดลอกแทร็ก"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -598,19 +556,16 @@ msgid "Duplicate Transposed"
msgstr "ทำซ้ำเปลี่ยนแทร็ก"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "ลบสิ่งที่เลือก"
+msgstr "ลบที่เลือก"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "ถัดไป"
+msgstr "ไปยังขั้นถัดไป"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "ก่อนหน้า"
+msgstr "ไปยังขั้นก่อนหน้า"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -622,11 +577,11 @@ msgstr "เก็บกวาดแอนิเมชัน"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "เลือกโหนดที่จะให้เคลื่อนไหว:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "ใช้เส้นโค้งเบซิเยร์"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -673,9 +628,8 @@ msgid "Scale Ratio:"
msgstr "อัตราส่วนเวลา:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "เลือกคุณสมบัติ"
+msgstr "เลือกแทร็กที่จะคัดลอก"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -687,22 +641,20 @@ msgid "Copy"
msgstr "คัดลอก"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "ไม่เลือก"
+msgstr "เลือกทั้งหมด/ไม่เลือก"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "ตัวรับเสียง"
+msgstr "เพิ่มคลิปแทร็กเสียง"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr ""
+msgstr "เปลี่ยนออฟเซ็ตเริ่มต้นของคลิปแทร็กเสียง"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr ""
+msgstr "เปลี่ยนออฟเซ็ตตอนจบของคลิปแทร็กเสียง"
#: editor/array_property_edit.cpp
msgid "Resize Array"
@@ -725,17 +677,16 @@ msgid "Line Number:"
msgstr "บรรทัดที่:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "แทนที่แล้ว %d ครั้ง"
+msgid "%d replaced."
+msgstr "แทนที่ %d"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "จับคู่ %d"
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "ไม่พบ"
+msgstr "%d ตรงกัน"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -745,7 +696,7 @@ msgstr "ตรงตามอักษรพิมพ์เล็ก-ใหญ
msgid "Whole Words"
msgstr "ทั้งคำ"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "แทนที่"
@@ -760,7 +711,7 @@ msgstr "เฉพาะที่กำลังเลือก"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "มาตรฐาน"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
@@ -788,39 +739,37 @@ msgstr "คำเตือน"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "เลขบรรทัดและคอลัมน์"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "ต้องระบุเมท็อดในโหนดปลายทาง!"
+msgstr "ต้องระบุเมธอดในโหนดเป้าหมาย"
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "ไม่สามารถใช้ชื่อนี้ได้."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
-msgstr "ไม่พบเมท็อดปลายทาง! ระบุเมท็อดให้ถูกต้องหรือเพิ่มสคริปต์ในโหนดปลายทาง"
+msgstr "ไม่พบโหนดเป้าหมาย ระบุเมธอดที่ถูกต้องหรือเพิ่มสคริปต์ในโหนดเป้าหมาย"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "เชื่อมไปยังโหนด:"
+msgstr "เชื่อมต่อกับโหนด:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "ไม่สามารถเชื่อมต่อกับโฮสต์:"
+msgstr "เชื่อมต่อสคริปต์:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "สัญญาณ:"
+msgstr "จากสัญญาณ:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Scene does not contain any script."
-msgstr "โหนดไม่มี geometry"
+msgstr "ไม่มีสคริปต์ในฉาก"
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -848,14 +797,12 @@ msgid "Extra Call Arguments:"
msgstr "ตัวแปรเพิ่มเติม:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "เลือกเมท็อด"
+msgstr "ตัวรับเมธอด:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "ตัวเลือกการจำกัด"
+msgstr "ขั้นสูง"
#: editor/connections_dialog.cpp
msgid "Deferred"
@@ -875,15 +822,13 @@ msgid "Disconnects the signal after its first emission."
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "เชื่อมโยงสัญญาณ:"
+msgstr "ไม่สามารถเชื่อมต่อสัญญาณ"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -899,7 +844,6 @@ msgid "Connect"
msgstr "เชื่อม"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Signal:"
msgstr "สัญญาณ:"
@@ -909,12 +853,11 @@ msgstr "เชื่อม '%s' กับ '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr "ลบการเชื่อมโยง '%s' กับ '%s'"
+msgstr "ตัดการเชื่อมต่อ '%s' กับ '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "ลบการเชื่อมโยง '%s' กับ '%s'"
+msgstr "ตัดการเชื่อมต่อทั้งหมดจากสัญญาณ: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -926,42 +869,41 @@ msgid "Disconnect"
msgstr "ลบการเชื่อมโยง"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect a Signal to a Method"
-msgstr "เชื่อมโยงสัญญาณ:"
+msgstr "เชื่อมต่อสัญญาณไปยังเมธอด"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection:"
-msgstr "แก้ไขการเชื่อมโยง"
+msgstr "แก้ไขการเชื่อมต่อ:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "ยืนยันการรันโปรเจกต์มากกว่า 1 โปรเจกต์?"
+msgstr "ยืนยันการลบการเชื่อมต่อสัญญาณจาก \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "สัญญาณ"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "ตัวกรองไทล์"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "ลบการเชื่อมโยง"
+msgstr "ตัดการเชื่อมต่อทั้งหมด"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "แก้ไข"
+msgstr "แก้ไข..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "รายชื่อเมท็อด"
+msgstr "ไปยังเมธอด"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -985,7 +927,7 @@ msgid "Recent:"
msgstr "ล่าสุด:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "ค้นหา:"
@@ -1013,7 +955,6 @@ msgid "Dependencies For:"
msgstr "การอ้างอิงของ:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
@@ -1022,12 +963,11 @@ msgstr ""
"การแก้ไขจะไม่ส่งผลจนกว่าจะโหลดใหม่"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"รีซอร์ส '%s' กำลังถูกใช้งาน\n"
+"ทรัพยากร '%s' กำลังถูกใช้งาน\n"
"การแก้ไขจะไม่ส่งผลจนกว่าจะโหลดใหม่"
#: editor/dependency_editor.cpp
@@ -1037,12 +977,12 @@ msgstr "การอ้างอิง"
#: editor/dependency_editor.cpp
msgid "Resource"
-msgstr "รีซอร์ส"
+msgstr "ทรัพยากร"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
#: editor/project_manager.cpp editor/project_settings_editor.cpp
msgid "Path"
-msgstr "ตำแหน่ง"
+msgstr "เส้นทาง"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
@@ -1058,7 +998,7 @@ msgstr "แก้ไขการอ้างอิง"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
-msgstr "ค้นหารีซอร์สมาแทนที่:"
+msgstr "ค้นหาทรัพยากรมาแทนที่:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
#: editor/editor_help_search.cpp editor/editor_node.cpp
@@ -1075,9 +1015,8 @@ msgid "Owners Of:"
msgstr "เจ้าของของ:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "ลบไฟล์ที่เลือกออกจากโปรเจกต์? (ย้อนกลับไม่ได้)"
+msgstr "ลบไฟล์ที่เลือกออกจากโปรเจกต์? (กู้คืนไม่ได้)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1085,8 +1024,8 @@ msgid ""
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
-"มีรีซอร์สอื่นต้องการไฟล์ที่กำลังลบ\n"
-"ยืนยันจะลบหรือไม่? (ย้อนกลับไม่ได้)"
+"ไฟล์ที่กำลังจะลบ จำเป็นสำหรับใช้งานโดยทรัพยากรอันอื่น\n"
+"จะทำการลบหรือไม่? (คืนกลับไม่ได้)"
#: editor/dependency_editor.cpp
msgid "Cannot remove:"
@@ -1097,9 +1036,8 @@ msgid "Error loading:"
msgstr "ผิดพลาดขณะโหลด:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "โหลดฉากไม่ได้เนื่องจากการอ้างอิงสูญหาย:"
+msgstr "โหลดผิดพลาดเนื่องจากการอ้างอิงสูญหาย:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1119,16 +1057,15 @@ msgstr "ผิดพลาดขณะโหลด!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "ลบ %d ไฟล์ถาวร? (ย้อนกลับไม่ได้!)"
+msgstr "ลบไอเทม %d ถาวรหรือไม่? (ย้อนกลับไม่ได้!)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "การอ้างอิง"
+msgstr "แสดงการอ้างอิง"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
-msgstr "ตัวจัดการรีซอร์สที่ไม่มีเจ้าของ"
+msgstr "ทรัพยากรที่ไม่ได้ใช้"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -1170,6 +1107,9 @@ msgstr "ผู้ริเริ่มโครงการ"
msgid "Lead Developer"
msgstr "ผู้พัฒนาหลัก"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "ผู้จัดการโครงการ "
@@ -1191,6 +1131,16 @@ msgid "Gold Sponsors"
msgstr "ผู้สนับสนุนระดับทอง"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "ผู้บริจาคระดับเงิน"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "ผู้บริจาคระดับทองแดง"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "ผู้สนับสนุน"
@@ -1215,12 +1165,10 @@ msgid "License"
msgstr "สัญญาอนุญาต"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
-msgstr "สัญญาอนุญาตไลบรารี"
+msgstr "สัญญาอนุญาตจากบุคคลที่สาม"
#: editor/editor_about.cpp
-#, fuzzy
msgid ""
"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
@@ -1228,8 +1176,8 @@ msgid ""
"respective copyright statements and license terms."
msgstr ""
"Godot Engine อาศัยไลบรารีต่าง ๆ ที่นำมาใช้ได้อย่างเสรีและเปิดเผยโค้ดเป็นจำนวนมาก "
-"ซึ่งเข้ากันได้กับสัญญาอนุญาต MIT ต่อไปนี้เป็นรายชื่อของไลบรารีทั้งหมด รวมถึงข้อความลิขสิทธิ์ "
-"และข้อกำหนดการใช้งานของแต่ละไลบรารี"
+"ซึ่งเข้ากันได้กับสัญญาอนุญาต MIT ต่อไปนี้เป็นรายชื่อของไลบรารีทั้งหมดของบุคคลที่สาม "
+"รวมถึงข้อความลิขสิทธิ์ และข้อกำหนดการใช้งานของแต่ละไลบรารี"
#: editor/editor_about.cpp
msgid "All Components"
@@ -1244,14 +1192,12 @@ msgid "Licenses"
msgstr "สัญญาอนุญาต"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Error opening package file, not in ZIP format."
msgstr "ผิดพลาดขณะเปิดไฟล์แพคเกจ, ไม่ใช่รูปแบบ zip"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "มีอยู่ก่อนแล้ว"
+msgstr "%s (มีอยู่ก่อนแล้ว)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1262,12 +1208,10 @@ msgid "The following files failed extraction from package:"
msgstr "ผิดพลาดขณะแยกไฟล์ต่อไปนี้จากแพคเกจ:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
msgstr "และอีก %d ไฟล์"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Package installed successfully!"
msgstr "ติดตั้งแพคเกจเสร็จสมบูรณ์!"
@@ -1277,9 +1221,8 @@ msgid "Success!"
msgstr "สำเร็จ!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "ประกอบด้วย:"
+msgstr "เนื้อหาแพคเกจ:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1295,7 +1238,7 @@ msgstr "ลำโพง"
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
-msgstr "เอฟเฟกต์"
+msgstr "เพิ่มเอฟเฟกต์"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
@@ -1323,20 +1266,19 @@ msgstr "เลือก Audio Bus ที่ส่งต่อ"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr "เพิ่มเอฟเฟกต์เสียง"
+msgstr "เพิ่มเอฟเฟกต์บัสเสียง"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr "ย้ายเอฟเฟกต์เสียง"
+msgstr "ย้ายเอฟเฟกต์บัสเสียง"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr "ลบเอฟเฟกต์เสียง"
+msgstr "ลบเอฟเฟกต์บัสเสียง"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Drag & drop to rearrange."
-msgstr "Audio Bus ลากและวางเพื่อย้ายตำแหน่ง"
+msgstr "ลากและวางเพื่อจัดเรียง"
#: editor/editor_audio_buses.cpp
msgid "Solo"
@@ -1377,15 +1319,15 @@ msgstr "เพิ่ม Audio Bus"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr "ลบ Bus หลักไม่ได้!"
+msgstr "ลบบัสหลักไม่ได้!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr "ลบ Audio Bus"
+msgstr "ลบบัสเสียง"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
-msgstr "ทำซ้ำ Audio Bus"
+msgstr "ทำซ้ำบัสเสียง"
#: editor/editor_audio_buses.cpp
msgid "Reset Bus Volume"
@@ -1393,11 +1335,11 @@ msgstr "รีเซ็ตระดับเสียงบัส"
#: editor/editor_audio_buses.cpp
msgid "Move Audio Bus"
-msgstr "ย้าย Audio Bus"
+msgstr "ย้ายบัสเสียง"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
-msgstr "บันทึกเลย์เอาต์ของ Audio Bus เป็น..."
+msgstr "บันทึกเลย์เอาต์ของบัสเสียงเป็น..."
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
@@ -1405,11 +1347,11 @@ msgstr "ตำแหน่งของเลย์เอาต์ใหม่...
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
-msgstr "เปิดเลย์เอาต์ของ Audio Bus"
+msgstr "เปิดเลย์เอาต์ของบัสเสียง"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr ""
+msgstr "ไม่มีไฟล์ '%s'"
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -1420,18 +1362,16 @@ msgid "Invalid file, not an audio bus layout."
msgstr "ไฟล์ไม่ถูกต้อง ไม่ใช่เลย์เอาต์ของ Audio Bus"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "ผิดพลาดขณะบันทึก TileSet!"
+msgstr "ผิดพลาดขณะบันทึกไฟล์: %s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr "เพิ่ม Bus"
+msgstr "เพิ่มบัส"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Add a new Audio Bus to this layout."
-msgstr "บันทึกเลย์เอาต์ของ Audio Bus เป็น..."
+msgstr "เพิ่มบัสเสียงไปยังเลย์เอาต์นี้"
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1441,7 +1381,7 @@ msgstr "โหลด"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr "โหลดเลย์เอาต์ Bus จากดิสก์"
+msgstr "โหลดเลย์เอาต์บัสจากดิสก์"
#: editor/editor_audio_buses.cpp
msgid "Save As"
@@ -1449,7 +1389,7 @@ msgstr "บันทึกเป็น"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr "บันทึกเลย์เอาต์ของ Bus นี้เป็นไฟล์"
+msgstr "บันทึกเลย์เอาต์ของบัสนี้เป็นไฟล์"
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
@@ -1457,11 +1397,11 @@ msgstr "โหลดค่าเริ่มต้น"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr "โหลดค่าเริ่มต้นเลย์เอาต์ Bus"
+msgstr "โหลดค่าเริ่มต้นเลย์เอาต์บัส"
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr "สร้างเลย์เอาต์ Bus ใหม่"
+msgstr "สร้างเลย์เอาต์บัสใหม่"
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
@@ -1472,19 +1412,16 @@ msgid "Valid characters:"
msgstr "ตัวอักษรที่ใช้ได้:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing engine class name."
-msgstr "ชื่อผิดพลาด ต้องไม่ใช้ชื่อเดียวกับคลาสของโปรแกรม"
+msgstr "ต้องไม่ใช้ชื่อเดียวกับชื่อคลาสของโปรแกรม"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
-msgstr "ชื่อผิดพลาด ต้องไม่ใช้ชื่อเดียวกับชนิดตัวแปร"
+msgstr "ต้องไม่ใช้ชื่อเดียวกับชื่อชนิดบิวท์อินที่มีอยู่แล้ว"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
-msgstr "ชื่อผิดพลาด ต้องไม่ใช้ชื่อเดียวกับค่าคงที่"
+msgstr "ต้องไม่ใช้ชื่อเดียวกับชื่อค่าคงที่โกลบอล"
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
@@ -1510,7 +1447,7 @@ msgstr "เลื่อนออโต้โหลด"
msgid "Remove Autoload"
msgstr "ลบออโต้โหลด"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "เปิด"
@@ -1518,18 +1455,9 @@ msgstr "เปิด"
msgid "Rearrange Autoloads"
msgstr "จัดลำดับออโต้โหลด"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "ตำแหน่งผิดพลาด"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "ไม่พบไฟล์"
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "ไม่อยู่ในโฟลเดอร์รีซอร์ส"
+msgid "Can't add autoload:"
+msgstr "เพิ่มออโต้โหลดไม่ได้:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1556,6 +1484,10 @@ msgstr "ชื่อ"
msgid "Singleton"
msgstr "ซิงเกิลตัน"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "วางตัวแปร"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "อัพเดทฉาก"
@@ -1577,7 +1509,6 @@ msgid "[unsaved]"
msgstr "[ไฟล์ใหม่]"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first."
msgstr "กรุณาเลือกโฟลเดอร์เริ่มต้นก่อน"
@@ -1612,11 +1543,8 @@ msgid "Storing File:"
msgstr "เก็บไฟล์:"
#: editor/editor_export.cpp
-#, fuzzy
msgid "No export template found at the expected path:"
-msgstr ""
-"ไม่มีแม่แบบสำหรับส่งออก\n"
-"ดาวน์โหลดและติดตั้งแม่แบบ"
+msgstr "ไม่พบแม่แบบส่งออกที่ที่อยู่ที่คาดไว้:"
#: editor/editor_export.cpp
msgid "Packing"
@@ -1627,12 +1555,16 @@ msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"แพลตฟอร์มเป้าหมายต้องการการบีบอัดเทกเจอร์ 'ETC' สำหรับ GLES2 เปิด 'Import Etc' "
+"ในตั้งค่าโปรเจ็ค"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"แพลตฟอร์มเป้าหมายต้องการการบีบอัดเทกเจอร์ 'ETC2' สำหรับ GLES3 เปิด 'Import Etc 2' "
+"ในตั้งค่าโปรเจ็ค"
#: editor/editor_export.cpp
msgid ""
@@ -1641,13 +1573,14 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"แพลตฟอร์มเป้าหมายต้องการการบีบอัดเทกเจอร์ 'ETC' สำหรับการกลับมาใช้ GLES2\n"
+"เปิด 'Import Etc' ในตั้งค่าโปรเจ็คหรือปิด 'Driver Fallback Enabled'"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "ไม่พบแพคเกจดีบัคที่กำหนด"
+msgstr "ไม่พบแม่แบบการดีบักแบบกำหนดเอง"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1658,36 +1591,27 @@ msgstr "ไม่พบแพคเกจจำหน่ายที่กำห
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
-msgstr "ไม่พบแม่แบบ:"
+msgstr "ไม่พบไฟล์แม่แบบ:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr ""
+msgstr "การส่งออกแบบ 32 bit PCK แบบฝังตัวไม่สามารถใหญ่ได้เกิน 4 GiB"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "โปรแกรม"
+msgstr "เอดิเตอร์ 3D"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "เปิดตัวแก้ไขสคริปต์"
+msgstr "เอดิเตอร์สคริปต์"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Asset Library"
-msgstr "เปิดแหล่งรวมทรัพยากร"
+msgstr "ไลบรารีทรัพยากร"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Scene Tree Editing"
-msgstr "ผังฉาก (โหนด):"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "นำเข้า"
+msgstr "แก้ไขผังฉาก"
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1696,96 +1620,89 @@ msgstr "โหมดเคลื่อนย้าย"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "ระบบไฟล์"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "นำเข้า"
+
+#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
-msgstr "แทนที่ทั้งหมด"
+msgstr "ลบโปรไฟล์ '%s' หรือไม่? (ทำกลับไม่ได้)"
#: editor/editor_feature_profile.cpp
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr ""
+msgstr "โปรไฟล์จะต้องมีชื่อไฟล์ที่ถูกต้อง และต้องไม่มี '.'"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Profile with this name already exists."
-msgstr "มีชื่อกลุ่มนี้อยู่แล้ว"
+msgstr "มีโปรไฟล์ที่มีชื่อนี้อยู๋แล้ว"
#: editor/editor_feature_profile.cpp
msgid "(Editor Disabled, Properties Disabled)"
-msgstr ""
+msgstr "(เอดิเตอร์ถูกปิดการใช้งาน, คุณสมบัติถูกปิดการใช้งาน)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "คุณสมบัติ"
+msgstr "(ปิดการทำงานคุณสมบัติ)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "ปิดการตัด"
+msgstr "(เอดิเตอร์ถูกปิดการใช้งาน)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "รายละเอียด:"
+msgstr "ตั้งค่าคลาส:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enable Contextual Editor"
-msgstr "เปิดตัวแก้ไขถัดไป"
+msgstr "เปิดการทำงานเอดิเตอร์ตามบริบท"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "คุณสมบัติ:"
+msgstr "เปิดการทำงานคุณสมบัติ:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Features:"
-msgstr "ฟีเจอร์"
+msgstr "เปิดการทำงานฟีเจอร์:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Classes:"
-msgstr "ค้นหาคลาส"
+msgstr "เปิดการทำงานคลาส:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr ""
+msgstr "นามสกุลของไฟล์ '%s' ผิดพลาด ยกเลิกการนำเข้า"
#: editor/editor_feature_profile.cpp
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
-msgstr ""
+msgstr "มีโปรไฟล์ '%s' อยู่แล้ว กรุณาลบก่อนที่จะนำเข้า, การนำเข้าถูกยกเลิก"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "ผิดพลาดขณะโหลดแม่แบบ '%s'"
+msgstr "ผิดพลาดขณะบันทึกโปรไฟล์ไปยังแพทช์: '%s'"
#: editor/editor_feature_profile.cpp
msgid "Unset"
-msgstr ""
+msgstr "ยกเลิกการตั้งค่า"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "รุ่นปัจจุบัน:"
+msgstr "โปรไฟล์ปัจจุบัน:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "ปัจจุบัน:"
+msgstr "ทำให้เป็นปัจจุบัน"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "New"
-msgstr "ไฟล์ใหม่"
+msgstr "ใหม่"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
@@ -1797,44 +1714,36 @@ msgid "Export"
msgstr "ส่งออก"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "โหนดที่มีให้ใช้:"
+msgstr "โปรไฟล์ที่มีให้ใช้:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "รายละเอียด"
+msgstr "ตั้งค่าคลาส"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "New profile name:"
-msgstr "ชื่อใหม่:"
+msgstr "ชื่อโปรไฟล์ใหม่:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "ลบพื้นที่"
+msgstr "ลบโปรไฟล์"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "จัดการแม่แบบส่งออก"
+msgstr "รายละเอียดคุณสมบัติ Godot"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Import Profile(s)"
-msgstr "นำเข้าโปรเจกต์แล้ว"
+msgstr "นำเข้าโปรไฟล์"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Export Profile"
-msgstr "ส่งออกโปรเจกต์"
+msgstr "ส่งออกโปรไฟล์"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Manage Editor Feature Profiles"
-msgstr "จัดการแม่แบบส่งออก"
+msgstr "จัดการรายละเอียดคุณสมบัติเอดิเตอร์"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
@@ -1845,7 +1754,6 @@ msgid "File Exists, Overwrite?"
msgstr "มีไฟล์นี้อยู่แล้ว จะเขียนทับหรือไม่?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "เลือกโฟลเดอร์นี้"
@@ -1854,13 +1762,11 @@ msgid "Copy Path"
msgstr "คัดลอกตำแหน่ง"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "แสดงในตัวจัดการไฟล์"
+msgstr "เปิดโฟลเดอร์"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
msgstr "แสดงในตัวจัดการไฟล์"
@@ -1868,7 +1774,7 @@ msgstr "แสดงในตัวจัดการไฟล์"
msgid "New Folder..."
msgstr "สร้างโฟลเดอร์..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "รีเฟรช"
@@ -1945,44 +1851,36 @@ msgid "Move Favorite Down"
msgstr "เลื่อนโฟลเดอร์ที่ชอบลง"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "ไปยังโฟลเดอร์หลัก"
+msgstr "ไปยังโฟลเดอร์ก่อนหน้า"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "ไปยังโฟลเดอร์หลัก"
+msgstr "ไปยังโฟลเดอร์ถัดไป"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
msgstr "ไปยังโฟลเดอร์หลัก"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "ค้นหาคลาส"
+msgstr "รีเฟรชไฟล์"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "ไม่สามารถสร้างโฟลเดอร์"
+msgstr "เพิ่ม/ลบโฟลเดอร์ปัจจุบันไปยังที่ชื่นชอบ"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "เปิด/ปิดไฟล์ที่ซ่อน"
+msgstr "เปิด/ปิดการแสดงไฟล์ที่ซ่อน"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "แสดงเป็นภาพตัวอย่าง"
+msgstr "แสดงไอเทมในรูปแบบตาราง"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "แสดงเป็นรายชื่อไฟล์"
+msgstr "แสดงไอเทมในรูปแบบลิสต์รายชื่อ"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
@@ -1990,7 +1888,7 @@ msgstr "ไฟล์และโฟลเดอร์:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "ตัวอย่าง:"
@@ -2010,7 +1908,7 @@ msgstr "สแกนต้นฉบับ"
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
-msgstr ""
+msgstr "มีการนำเข้าไฟล์ %s หลายอัน การนำเข้าถูกยกเลิก"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
@@ -2034,55 +1932,48 @@ msgid "Inherited by:"
msgstr "สืบทอดโดย:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "รายละเอียด:"
+msgstr "รายละเอียด"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "สอนใช้งานออนไลน์:"
+msgstr "บทสอนออนไลน์"
#: editor/editor_help.cpp
msgid "Properties"
msgstr "คุณสมบัติ"
#: editor/editor_help.cpp
-#, fuzzy
msgid "override:"
-msgstr "กำหนดเฉพาะ..."
+msgstr "แทนที่:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "ค่าเริ่มต้น"
+msgstr "ค่าเริ่มต้น:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "รายชื่อเมท็อด"
+msgstr "เมท็อด"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "คุณสมบัติ"
+msgstr "คุณสมบัติธีม"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "ค่าคงที่"
+msgstr "อีนัม"
#: editor/editor_help.cpp
msgid "Constants"
msgstr "ค่าคงที่"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "รายละเอียดตัวแปร:"
+msgstr "รายละเอียดของคุณสมบัติ"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "ค่า"
+msgstr "(ค่า)"
#: editor/editor_help.cpp
msgid ""
@@ -2091,9 +1982,8 @@ msgid ""
msgstr "คุณสมบัตินี้ยังไม่มีคำอธิบาย โปรดช่วย[color=$color][url=$url]แก้ไข[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "รายละเอียดเมท็อด:"
+msgstr "รายละเอียดเมท็อด"
#: editor/editor_help.cpp
msgid ""
@@ -2111,62 +2001,50 @@ msgid "Case Sensitive"
msgstr "ตรงตามอักษรพิมพ์เล็ก-ใหญ่"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "แสดงตัวช่วย"
+msgstr "แสดงลำดับชั้น"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "แสดงปกติ"
+msgstr "แสดงทั้งหมด"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "คลาส"
+msgstr "คลาสเท่านั้น"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "รายชื่อเมท็อด"
+msgstr "เมท็อดเท่านั้น"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "สัญญาณ"
+msgstr "สัญญาณเท่านั้น"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "ค่าคงที่"
+msgstr "ค่าคงที่เท่านั้น"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "คุณสมบัติ"
+msgstr "คุณสมบัติเท่านั้น"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "คุณสมบัติ"
+msgstr "คุณสมบัติธีมเท่านั้น"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "ตัวแปร"
+msgstr "ชนิดสมาชิก"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "คลาส:"
+msgstr "คลาส"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "รายชื่อเมท็อด"
+msgstr "เมธอด"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
msgstr "สัญญาณ"
@@ -2175,14 +2053,12 @@ msgid "Constant"
msgstr "คงที่"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "คุณสมบัติ:"
+msgstr "คุณสมบัติ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "คุณสมบัติ"
+msgstr "คุณสมบัติธีม"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2194,16 +2070,15 @@ msgstr "กำหนด"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "กำหนด หลายอย่าง:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr "ข้อความ:"
+msgstr "เอาท์พุต:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "ลบที่เลือก"
+msgstr "คัดลอกที่เลือก"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2213,7 +2088,7 @@ msgstr "ลบที่เลือก"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr "ลบ"
+msgstr "เคลียร์"
#: editor/editor_log.cpp
msgid "Clear Output"
@@ -2226,13 +2101,12 @@ msgstr "หยุด"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "เริ่ม!"
+msgstr "เริ่ม"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/s"
#: editor/editor_network_profiler.cpp
msgid "Down"
@@ -2248,28 +2122,29 @@ msgstr "โหนด"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "RPC กำลังมา"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "RSET กำลังมา"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "Outgoing RPC"
-msgstr ""
+msgstr "RPC กำลังออก"
#: editor/editor_network_profiler.cpp
+#, fuzzy
msgid "Outgoing RSET"
-msgstr ""
+msgstr "RSET กำลังออก"
#: editor/editor_node.cpp editor/project_manager.cpp
-#, fuzzy
msgid "New Window"
-msgstr "หน้าต่าง"
+msgstr "หน้าต่างใหม่"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr ""
+msgstr "ทรัพยากรที่นำเข้ามา ไม่สามารถบันทึกได้"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
@@ -2278,7 +2153,7 @@ msgstr "ตกลง"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr "บันทึกรีซอร์สผิดพลาด!"
+msgstr "บันทึกทรัพยากรผิดพลาด!"
#: editor/editor_node.cpp
msgid ""
@@ -2296,7 +2171,7 @@ msgstr "เปิดไฟล์เพื่อเขียนไม่ได้
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr "ไม่ทราบรูปแบบไฟล์ที่ร้องขอ:"
+msgstr "ไม่ทราบนามสกุลไฟล์ที่ร้องขอ:"
#: editor/editor_node.cpp
msgid "Error while saving."
@@ -2304,7 +2179,7 @@ msgstr "ผิดพลาดขณะบันทึก"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "ไม่สามารถเปิด '%s' เนื่องจากไฟล์ถูกย้ายหรือถูกลบ"
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -2352,23 +2227,23 @@ msgstr "บันทึกฉากไม่ได้ อาจจะมีก
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "ไม่สามารถเขียนทับฉากที่กำลังเปิดอยู่ได้!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr "โหลด MeshLibrary เพื่อรวมไม่ได้!"
+msgstr "ไม่สามารถโหลดไลบรารี Mesh เพื่อควบรวม!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr "ผิดพลาดขณะบันทึก MeshLibrary!"
+msgstr "ผิดพลาดขณะบันทึกไลบรารี Mesh!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr "โหลด TileSet เพื่อรวมไม่ได้!"
+msgstr "โหลดไทล์เซตเพื่อรวมไม่ได้!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr "ผิดพลาดขณะบันทึก TileSet!"
+msgstr "ผิดพลาดขณะบันทึกไทล์เซต!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
@@ -2396,13 +2271,12 @@ msgstr ""
"อ่านรายละเอียดเพิ่มเติมได้จากคู่มือในส่วนของการนำเข้าฉาก"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
-"รีซอร์สนี้เป็นของฉากที่ถูกอินสแตนซ์หรือสืบทอด\n"
-"การแก้ไขจะไม่ถูกบันทึก"
+"ทรัพยากรนี้เป็นฉากที่เป็นอินสแตนซ์หรือสืบทอด\n"
+"การเปลี่ยนแปลงจะไม่ถูกเก็บไว้ เมื่อบันทึกฉากปัจจุบัน"
#: editor/editor_node.cpp
msgid ""
@@ -2437,10 +2311,6 @@ msgid "There is no defined scene to run."
msgstr "ยังไม่ได้เลือกฉากที่จะเล่น"
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "ฉากปัจจุบันยังไม่ได้บันทึก กรุณาบันทึกก่อนเริ่มโปรแกรม"
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "ไม่สามารถเริ่มขั้นตอนย่อย!"
@@ -2453,17 +2323,16 @@ msgid "Open Base Scene"
msgstr "เปิดไฟล์ฉากที่ใช้สืบทอด"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "เปิดไฟล์ฉากด่วน..."
+msgstr "เปิดด่วน..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr "เปิดไฟล์ฉากด่วน..."
+msgstr "เปิดฉากด่วน..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr "เปิดไฟล์สคริปต์ด่วน..."
+msgstr "เปิดสคริปต์ด่วน..."
#: editor/editor_node.cpp
msgid "Save & Close"
@@ -2474,14 +2343,12 @@ msgid "Save changes to '%s' before closing?"
msgstr "บันทึก '%s' ก่อนปิดโปรแกรมหรือไม่?"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "โหลดรีซอร์สไม่ได้"
+msgstr "บันทึกทรัพยากร %s ที่ถูกแก้ไขสำเร็จ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "A root node is required to save the scene."
-msgstr "Texture ขนาดใหญ่ต้องการแค่ไฟล์เดียว"
+msgstr "โหนดแม่จำเป็นต้องทำการบันทึกฉาก"
#: editor/editor_node.cpp
msgid "Save Scene As..."
@@ -2505,11 +2372,11 @@ msgstr "ทำไม่ได้ถ้าไม่มีฉาก"
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr "ส่งออก Mesh Library"
+msgstr "ส่งออกไลบรารี Mesh"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr "ทำไม่ได้ถ้าไม่มีโหนดราก"
+msgstr "ไม่สามารถกระทำได้สำเร็จถ้าไม่มีโหนดแม่"
#: editor/editor_node.cpp
msgid "Export Tile Set"
@@ -2528,12 +2395,15 @@ msgid "Can't reload a scene that was never saved."
msgstr "ฉากยังไม่ได้บันทึก ไม่สามารถโหลดใหม่ได้"
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "คืนกลับ"
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "บันทึกฉาก"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "การคืนกลับไม่สามารถยกเลิกได้ คืนกลับ?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2579,9 +2449,8 @@ msgid "Close Scene"
msgstr "ปิดไฟล์ฉาก"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "ปิดไฟล์ฉาก"
+msgstr "เปิดไฟล์ฉากที่ปิดไปใหม่"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2596,11 +2465,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "ไม่สามารถโหลดสคริปต์จาก: '%s'"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
-msgstr "ไม่สามารถโหลดสคริปต์จาก: '%s' ไม่ใช่สคริปต์ tool"
+msgstr ""
+"ไม่สามารถโหลดสคริปต์ส่วนเสริมจาก: '%s' เหมือนว่าจะเกิดข้อผิดพลาดขึ้นในโค้ด "
+"กรุณาเช็ตรูปแบบการเขียนโค้ด"
#: editor/editor_node.cpp
msgid ""
@@ -2677,24 +2547,20 @@ msgstr "ค่าเริ่มต้น"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "เปิดในตัวจัดการไฟล์"
+msgstr "แสดงในรูปแบบไฟล์"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "เล่น"
+msgstr "เล่นฉากนี้"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "ปิดแท็บอื่น"
+msgstr "ปิดแท็บ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "ปิดแท็บอื่น"
+msgstr "เลิกทำแท็บที่ปิด"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2702,12 +2568,11 @@ msgstr "ปิดแท็บอื่น"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "ปิดแท็บทางด้านขวา"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "ปิดทั้งหมด"
+msgstr "ปิดแท็บทั้งหมด"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2750,9 +2615,8 @@ msgid "Go to previously opened scene."
msgstr "ไปยังฉากที่เพิ่งเปิด"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "คัดลอกตำแหน่ง"
+msgstr "คัดลอกข้อความ"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2791,9 +2655,8 @@ msgid "Save Scene"
msgstr "บันทึกฉาก"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "บันทึกทุกฉาก"
+msgstr "บันทึกฉากทั้งหมด"
#: editor/editor_node.cpp
msgid "Convert To..."
@@ -2801,11 +2664,11 @@ msgstr "แปลงเป็น..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
-msgstr "MeshLibrary..."
+msgstr "ไลบรารี Mesh..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr "TileSet..."
+msgstr "ไทล์เซต..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2818,10 +2681,6 @@ msgid "Redo"
msgstr "ทำซ้ำ"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "คืนกลับฉาก"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "โปรเจกต์และเครื่องมืออื่น ๆ"
@@ -2831,22 +2690,20 @@ msgid "Project"
msgstr "โปรเจกต์"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "ตัวเลือกโปรเจกต์"
+msgstr "ตั้งค่าโปรเจกต์"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "รุ่น:"
+msgstr "เวอร์ชันคอนโทรล"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "ตั้งเวอร์ชันคอนโทรน"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "ปิดเวอร์ชันคอนโทรล"
#: editor/editor_node.cpp
msgid "Export..."
@@ -2854,21 +2711,19 @@ msgstr "ส่งออก..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "ติดตั้งแม่แบบการสร้างของแอนดรอยด์"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "เปิดตัวจัดการโปรเจกต์?"
+msgstr "เปิดโฟลเดอร์ข้อมูลโปรเจกต์"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "เครื่องมือ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "ตัวจัดการรีซอร์สที่ไม่มีเจ้าของ"
+msgstr "การใช้ทรัพยากร"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2877,7 +2732,7 @@ msgstr "ปิดและกลับสู่รายชื่อโปรเ
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
msgid "Debug"
-msgstr "แก้จุดบกพร่อง"
+msgstr "ดีบัก"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
@@ -2885,22 +2740,28 @@ msgstr "ส่งออกพร้อมการแก้ไขจุดบก
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
-msgstr "เมื่อส่งออก โปรแกรมจะพยายามเชื่อมต่อมายังคอมพิวเตอร์เครื่องนี้เพื่อทำการแก้ไขจุดบกพร่อง"
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
+msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "ส่งออกโดยใช้ระบบไฟล์เครือข่าย"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"ถ้าเปิดตัวเลือกนี้ ตัวเกมที่ส่งออกจะมีขนาดแค่พอใช้งานได้\n"
"ตัวเกมจะได้รับระบบไฟล์จากโปรแกรมแก้ไขผ่านเครือข่าย\n"
@@ -2908,107 +2769,105 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr "รูปทรงกายภาพมองเห็นได้"
+msgstr "ขอบเขตการชนที่มองเห็นได้"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr "รูปทรงกายภาพและรังสี (2D และ 3D) จะมองเห็นได้ขณะเริ่มโปรแกรมถ้าเปิดตัวเลือกนี้"
#: editor/editor_node.cpp
msgid "Visible Navigation"
-msgstr "เส้นนำทางมองเห็นได้"
+msgstr "แสดงการนำทาง"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr "รูปทรงที่มีเส้นนำทางจะมองเห็นได้เมื่อเริ่มโปรแกรมถ้าเปิดตัวเลือกนี้"
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "ซิงค์การเปลี่ยนแปลงฉาก"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"ถ้าเปิดตัวเลือกนี้ โปรแกรมที่รันอยู่จะได้รับการแก้ไขทันที\n"
"เมื่อใช้กับอุปกรณ์แบบรีโมท จะดีกว่าถ้าเปิดระบบไฟล์เครือข่ายด้วย"
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr "ซิงค์การแก้ไขสคริปต์"
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "ซิงค์การเปลี่ยนแปลงสคริปต์"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"เมื่อเปิดตัวเลือกนี้ สคริปต์ที่บันทึกจะโหลดในเกมทันที\n"
"ถ้าใช้กับอุปกรณ์รีโมท จะดีกว่าถ้าเปิดระบบไฟล์เครือข่ายด้วย"
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
-msgstr "โปรแกรม"
+msgstr "เอดิเตอร์"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "ตัวเลือกโปรแกรมสร้างเกม"
+msgstr "ตั้งค่าเอดิเตอร์"
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr "เลย์เอาต์โปรแกรม"
+msgstr "เลย์เอาต์เอดิเตอร์"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "เข้าใจ!"
+msgstr "ถ่ายภาพหน้าจอ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "ตัวเลือกโปรแกรมสร้างเกม"
+msgstr "ภาพหน้าจอจะถูกเก็บไว้ในโฟลเดอร์ข้อมูล/การตั้งค่าของเอดิเตอร์"
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "สลับเต็มจอ"
+msgstr "เปิด/ปิด โหมดเต็มหน้าจอ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "ซ่อน/แสดงโหนด CanvasItem"
+msgstr "เปิด/ปิด คอนโซลระบบ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "ตัวเลือกโปรแกรมสร้างเกม"
+msgstr "เปิดโฟลเดอร์ข้อมูล/ตั้งค่าของเอดิเตอร์"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "เปิดโฟลเดอร์ของเอดิเตอร์"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "ตัวเลือกโปรแกรมสร้างเกม"
+msgstr "เปิดโฟลเดอร์การตั้งค่าของเอดิเตอร์"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "จัดการแม่แบบส่งออก"
+msgstr "จัดการฟีเจอร์ของเอดิเตอร์..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "จัดการแม่แบบส่งออก"
+msgstr "จัดการแม่แบบการส่งออก..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -3019,7 +2878,7 @@ msgstr "ช่วยเหลือ"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "ค้นหา"
@@ -3033,8 +2892,13 @@ msgid "Q&A"
msgstr "ถาม/ตอบ"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "ระบบติดตามบัค"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "นำเข้าใหม่"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3082,13 +2946,12 @@ msgstr "เลือกเล่นฉาก"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "การเปลี่ยนไดรเวอร์การ์ดจอจำเป็นต้องเริ่มเอดิเตอร์ใหม่"
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "บันทึกและนำเข้าอีกครั้ง"
+msgstr "บันทึกและเริ่มใหม่"
#: editor/editor_node.cpp
#, fuzzy
@@ -3096,19 +2959,16 @@ msgid "Spins when the editor window redraws."
msgstr "หมุนเมื่อมีการวาดหน้าต่างโปรแกรมใหม่!"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "ต่อเนื่อง"
+msgstr "อัพเดทอย่างต่อเนื่อง"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
msgstr "อัพเดทเมื่อเปลี่ยนแปลง"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "ปิดการอัพเดทตัวหมุน"
+msgstr "ซ่อนตัวหมุนการอัพเดท"
#: editor/editor_node.cpp
msgid "FileSystem"
@@ -3119,9 +2979,8 @@ msgid "Inspector"
msgstr "คุณสมบัติ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Expand Bottom Panel"
-msgstr "ขยายโฟลเดอร์"
+msgstr "ขยายแผงล่าง"
#: editor/editor_node.cpp
msgid "Output"
@@ -3136,9 +2995,8 @@ msgid "Android build template is missing, please install relevant templates."
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "จัดการแม่แบบส่งออก"
+msgstr "จัดการแม่แบบ"
#: editor/editor_node.cpp
msgid ""
@@ -3164,9 +3022,8 @@ msgid "Import Templates From ZIP File"
msgstr "นำเข้าแม่แบบจากไฟล์ ZIP"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "จัดการแม่แบบส่งออก"
+msgstr "แพคเกจแม่แบบ"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3194,15 +3051,15 @@ msgstr "เลือก"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "เปิดตัวแก้ไข 2 มิติ"
+msgstr "เปิดเอดิเตอร์ 2D"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr "เปิดตัวแก้ไข 3 มิติ"
+msgstr "เปิดเอดิเตอร์ 3D"
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr "เปิดตัวแก้ไขสคริปต์"
+msgstr "เปิดเอดิเตอร์สคริปต์"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -3210,16 +3067,15 @@ msgstr "เปิดแหล่งรวมทรัพยากร"
#: editor/editor_node.cpp
msgid "Open the next Editor"
-msgstr "เปิดตัวแก้ไขถัดไป"
+msgstr "เปิดเอดิเตอร์ถัดไป"
#: editor/editor_node.cpp
msgid "Open the previous Editor"
-msgstr "เปิดตัวแก้ไขก่อนหน้า"
+msgstr "เปิดเอดิเตอร์ก่อนหน้า"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "คำเตือน"
+msgstr "คำเตือน!"
#: editor/editor_path.cpp
#, fuzzy
@@ -3235,14 +3091,12 @@ msgid "Thumbnail..."
msgstr "รูปตัวอย่าง..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "เปิดสคริปต์"
+msgstr "สคริปต์หลัก:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "แก้ไขรูปหลายเหลี่ยม"
+msgstr "แก้ไขปลั๊กอิน"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -3259,16 +3113,15 @@ msgstr "รุ่น:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Author:"
-msgstr "โดย:"
+msgstr "ผู้สร้าง:"
#: editor/editor_plugin_settings.cpp
msgid "Status:"
msgstr "สถานะ:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "แก้ไข"
+msgstr "แก้ไข:"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -3284,7 +3137,7 @@ msgstr "เวลาเฉลี่ย (วินาที)"
#: editor/editor_profiler.cpp
msgid "Frame %"
-msgstr "% ของเฟรม"
+msgstr "เฟรม %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
@@ -3311,9 +3164,8 @@ msgid "Calls"
msgstr "จำนวนครั้ง"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "แก้ไขธีม..."
+msgstr "แก้ไขข้อความ:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
@@ -3321,10 +3173,9 @@ msgstr "เปิด"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "เลเยอร์"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
msgstr "บิต %d, ค่า %d"
@@ -3333,14 +3184,12 @@ msgid "[Empty]"
msgstr "[ว่างเปล่า]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Assign..."
-msgstr "ระบุ"
+msgstr "กำหนด..."
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "ตำแหน่งผิดพลาด"
+msgstr "RID ผิดพลาด"
#: editor/editor_properties.cpp
msgid ""
@@ -3371,9 +3220,8 @@ msgid "New Script"
msgstr "สคริปต์ใหม่"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "เปิดสคริปต์"
+msgstr "สคริปต์เสริม"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
@@ -3406,13 +3254,12 @@ msgid "Selected node is not a Viewport!"
msgstr "โหนดที่เลือกไม่ใช่ Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "ขนาดเซลล์:"
+msgstr "ขนาด: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "หน้า: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -3420,23 +3267,23 @@ msgid "Remove Item"
msgstr "ลบไอเทม"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "ชื่อใหม่:"
+msgstr "คีย์ใหม่:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "ชื่อใหม่:"
+msgstr "ค่าใหม่:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "เพิ่มคู่ของคีย์/ค่า"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"ไม่มีแม่แบบส่งออกที่สามารถรันเกมได้ของแพลตฟอร์มนี้\n"
"กรุณาเพิ่มแม่แบบส่งออกในเมนูส่งออก"
@@ -3451,7 +3298,7 @@ msgstr "มีฉากที่แก้ไขอยู่แล้ว"
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
-msgstr "สร้างอินสแตนซ์ของสคริปต์ไม่ได้:"
+msgstr "ไม่สามารถอินสแตนซ์สคริปต์ได้:"
#: editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
@@ -3465,13 +3312,18 @@ msgstr "รันสคริปต์ไม่ได้:"
msgid "Did you forget the '_run' method?"
msgstr "ลืมใส่เมท็อด '_run' หรือไม่?"
+#: editor/editor_spin_slider.cpp
+#, fuzzy
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr "กด Ctrl ค้างเพื่อวาง Getter กด Shift ค้างเพื่อวาง generic signature"
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "เลือกโหนดเพื่อนำเข้า"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
-msgstr "เลือก"
+msgstr "ค้นหา"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
@@ -3482,7 +3334,6 @@ msgid "Import From Node:"
msgstr "นำเข้าจากโหนด:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Redownload"
msgstr "ดาวน์โหลดอีกครั้ง"
@@ -3524,9 +3375,8 @@ msgid "Can't open export templates zip."
msgstr "เปิดไฟล์ zip แม่แบบส่งออกไม่ได้"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "รูปแบบของ version.txt ในแม่แบบไม่ถูกต้อง"
+msgstr "รูปแบบของ version.txt ในแม่แบบ %s ไม่ถูกต้อง"
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -3545,9 +3395,8 @@ msgid "Importing:"
msgstr "นำเข้า:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error getting the list of mirrors."
-msgstr "ผิดพลาดขณะสร้าง signature object"
+msgstr "ผิดพลาดขณะกำลังรับรายชื่อของ mirrors"
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
@@ -3592,9 +3441,8 @@ msgid "Download Complete."
msgstr "ดาวน์โหลดเสร็จสิ้น"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "บันทึกธีมไม่ได้:"
+msgstr "ไม่สามารถลบไฟล์ชั่วคราวได้:"
#: editor/export_template_manager.cpp
msgid ""
@@ -3603,17 +3451,16 @@ msgid ""
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "ผิดพลาดขณะร้องขอที่อยู่: "
+msgstr "ผิดพลาดขณะกำลังร้องขอ URL:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
-msgstr "กำลังเชื่อมต่อ..."
+msgstr "กำลังเชื่อมต่อกับ Mirror"
#: editor/export_template_manager.cpp
msgid "Disconnected"
-msgstr "การเชื่อมต่อสิ้นสุด"
+msgstr "ตัดการเชื่อมต่อแล้ว"
#: editor/export_template_manager.cpp
msgid "Resolving"
@@ -3654,9 +3501,8 @@ msgid "SSL Handshake Error"
msgstr "การรับรองความปลอดภัยผิดพลาด"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "กำลังคลายบีบอัด"
+msgstr "กำลังคลาย Android Build Sources"
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3675,14 +3521,12 @@ msgid "Remove Template"
msgstr "ลบแม่แบบ"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
msgstr "เลือกไฟล์แม่แบบ"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "กำลังโหลดแม่แบบส่งออก"
+msgstr "แม่แบบการส่งออก Godot"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3693,14 +3537,12 @@ msgid "Download Templates"
msgstr "ดาวน์โหลดแม่แบบ"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "เลือกลิงก์ดาวน์โหลด: "
+msgstr "เลือก mirror จากรายชื่อ: (Shift+คลิก: เปิดในเบราเซอร์)"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "ที่ชื่นชอบ:"
+msgstr "ที่ชื่นชอบ"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -3731,9 +3573,8 @@ msgid "No name provided."
msgstr "ไม่ได้ระบุชื่อ"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "ไม่สามารถใช้อักษรบางตัวในชื่อได้"
+msgstr "ชื่อที่ระบุประกอบไปด้วยตัวอักษรที่ไม่ถูกต้อง"
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
@@ -3760,33 +3601,28 @@ msgid "Duplicating folder:"
msgstr "ทำซ้ำโฟลเดอร์:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "สืบทอดฉากใหม่..."
+msgstr "ฉากสืบทอดใหม่"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "ฉากหลัก"
+msgstr "ตั้งเป็นฉากหลัก"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
-msgstr "เปิดไฟล์ฉาก"
+msgstr "เปิดฉาก"
#: editor/filesystem_dock.cpp
msgid "Instance"
msgstr "อินสแตนซ์"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "ที่ชื่นชอบ:"
+msgstr "เพิ่มไปยังที่ชื่นชอบ"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "ลบออกจากกลุ่ม"
+msgstr "ลบจากที่่ชื่นชอบ"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3809,9 +3645,8 @@ msgid "Move To..."
msgstr "ย้ายไป..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "ฉากใหม่"
+msgstr "ฉากใหม่..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
@@ -3856,9 +3691,8 @@ msgid "Toggle Split Mode"
msgstr "สลับโหมด"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "ค้นหาคลาส"
+msgstr "ค้นหาไฟล์"
#: editor/filesystem_dock.cpp
msgid ""
@@ -3881,9 +3715,8 @@ msgid "Overwrite"
msgstr "เขียนทับ"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "สร้างจากฉาก"
+msgstr "สร้างฉาก"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
@@ -3895,16 +3728,15 @@ msgstr "ค้นหาในไฟล์"
#: editor/find_in_files.cpp
msgid "Find:"
-msgstr "ค้นหา: "
+msgstr "ค้นหา:"
#: editor/find_in_files.cpp
msgid "Folder:"
-msgstr "โฟลเดอร์: "
+msgstr "โฟลเดอร์:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "ตัวกรอง"
+msgstr "ตัวกรอง:"
#: editor/find_in_files.cpp
msgid ""
@@ -4075,10 +3907,18 @@ msgid "Error running post-import script:"
msgstr "ผิดพลาดขณะรันสคริปต์หลังนำเข้า:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "กำลังบันทึก..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "ไฟล์ %d"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "กำหนดเป็นค่าเริ่มต้นของ '%s'"
@@ -4087,29 +3927,25 @@ msgid "Clear Default for '%s'"
msgstr "ลบค่าเริ่มต้นของ '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " ไฟล์"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "นำเข้าเป็น:"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "การส่งออก"
+msgstr "ตั้งล่วงหน้า"
#: editor/import_dock.cpp
msgid "Reimport"
msgstr "นำเข้าใหม่"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr ""
+#, fuzzy
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "บันทึกฉาก, นำเข้าและเริ่มต้นใหม่"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
-msgstr ""
+msgstr "การเปลี่ยนแปลงชนิดของไฟล์ที่นำเข้า จำเป็นต้องเริ่มเอดิเตอร์ใหม่"
#: editor/import_dock.cpp
msgid ""
@@ -4118,15 +3954,13 @@ msgstr ""
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
-msgstr "โหลดรีซอร์สไม่ได้"
+msgstr "โหลดทรัพยากรไม่ได้"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "ขยายคุณสมบัติทั้งหมด"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "ยุบคุณสมบัติทั้งหมด"
@@ -4137,16 +3971,11 @@ msgstr "บันทึกเป็น..."
#: editor/inspector_dock.cpp
msgid "Copy Params"
-msgstr "คัดลอกตัวแปร"
+msgstr "คัดลอกพารามิเตอร์"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "วางตัวแปร"
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "คลิปบอร์ดไม่มีรีซอร์ส!"
+msgstr "แก้ไขคลิปบอร์ดทรัพยากร"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4193,9 +4022,8 @@ msgid "Object properties."
msgstr "คุณสมบัติวัตถุ"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "ตัวกรอง"
+msgstr "คุญสมบัติตัวกรอง"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -4220,15 +4048,15 @@ msgstr "สร้างปลั๊กอิน"
#: editor/plugin_config_dialog.cpp
msgid "Plugin Name:"
-msgstr "ชื่อปลั๊กอิน"
+msgstr "ชื่อปลั๊กอิน:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr "โฟลเดอร์ย่อย: "
+msgstr "โฟลเดอร์ย่อย:"
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
msgid "Language:"
-msgstr "ภาษา: "
+msgstr "ภาษา:"
#: editor/plugin_config_dialog.cpp
msgid "Script Name:"
@@ -4236,7 +4064,7 @@ msgstr "ชื่อสคริปต์:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "เปิดใช้งานตอนนี้?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4250,25 +4078,21 @@ msgid "Create points."
msgstr "สร้างจุด"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid ""
"Edit points.\n"
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
-"แก้ไขรูปหลายเหลี่ยม:\n"
-"เมาส์ซ้าย: ย้ายจุด\n"
-"Ctrl+เมาส์ซ้าย: แยกส่วน\n"
-"เมาส์ขวา: ลบจุด"
+"แก้ไขจุด:\n"
+"คลิกซ้าย: ย้ายจุด\n"
+"คลิกขวา: ลบจุด"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Erase points."
-msgstr "คลิกขวา: ลบจุด"
+msgstr "ลบจุด"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
msgstr "แก้ไขรูปหลายเหลี่ยม"
@@ -4277,12 +4101,10 @@ msgid "Insert Point"
msgstr "แทรกจุด"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon (Remove Point)"
msgstr "แก้ไขรูปหลายเหลี่ยม (ลบจุด)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Remove Polygon And Point"
msgstr "ลบรูปหลายเหลี่ยมและจุด"
@@ -4298,52 +4120,45 @@ msgstr "เพิ่มแอนิเมชัน"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load..."
-msgstr "โหลด"
+msgstr "โหลด..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "ย้ายจุด"
+msgstr "สร้างจุดโหนด"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Limits"
-msgstr "แก้ไขระยะเวลาการผสาน"
+msgstr "เปลี่ยนค่าจำกัดของ BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Change BlendSpace1D Labels"
-msgstr "แก้ไขระยะเวลาการผสาน"
+msgstr "เปลี่ยนป้ายกำกับ BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "โหนดชนิดนี้ไม่สามารถใช้ได้ มีแค่โหนดแม่เท่านั้นที่สามารถใช้ได้"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "เพิ่มโหนด"
+msgstr "เพิ่มจุดโหนด"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "เพิ่มแอนิเมชัน"
+msgstr "เพิ่มจุดแอนิเมชัน"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace1D Point"
-msgstr "ลบจุด"
+msgstr "ลบจุด BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
-msgstr ""
+msgstr "ย้ายจุดโหนด BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4367,38 +4182,33 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
msgid "Enable snap and show grid."
-msgstr ""
+msgstr "เปิกการใช้งานการเข้าหาแลแสดงเส้นกริด"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "ย้ายจุด"
+msgstr "จุด"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "เปิดในโปรแกรมแก้ไข"
+msgstr "เปิดเอดิเตอร์"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "โหนดแอนิเมชัน"
+msgstr "เปิดโหนดแอนิเมชัน"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "มีการกระทำ '%s' อยู่แล้ว!"
+msgstr "มีสามเหลี่ยมอยู่แล้ว"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "เพิ่มตัวแปร"
+msgstr "เพิ่มสามเหลี่ยม"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
@@ -4438,9 +4248,8 @@ msgid "Create triangles by connecting points."
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "วิเคราะห์สามเหลี่ยม %d อัน:"
+msgstr "ลบจุดและสามเหลี่ยม"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
@@ -4489,9 +4298,8 @@ msgid "Nodes Disconnected"
msgstr "ตัดการเชื่อมต่อโหนดแล้ว"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "แอนิเมชัน"
+msgstr "ตั้งแอนิเมชัน"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4510,9 +4318,8 @@ msgid "Toggle Filter On/Off"
msgstr "โหมดไร้สิ่งรบกวน"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Change Filter"
-msgstr "แก้ไขตัวกรองภูมิภาค"
+msgstr "แก้ไขตัวกรอง"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
@@ -4530,31 +4337,26 @@ msgid ""
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "คลิป"
+msgstr "คลิปแอนิเมชัน"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "ตัวรับเสียง"
+msgstr "คลิปเสียง"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "ฟังก์ชัน:"
+msgstr "ฟังก์ชัน"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Renamed"
-msgstr "ชื่อโหนด:"
+msgstr "เปลี่ยนชื่อโหนดแล้ว"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Node..."
-msgstr "เพิ่มโหนด"
+msgstr "เพิ่มโหนด..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -4563,9 +4365,8 @@ msgid "Edit Filtered Tracks:"
msgstr "แก้ไขตัวกรอง"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable Filtering"
-msgstr "แก้ไขโหนดลูกได้"
+msgstr "เปิดการใช้งานตัวกรอง"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4594,14 +4395,12 @@ msgid "Remove Animation"
msgstr "ลบแอนิเมชัน"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ผิดพลาด: ชื่อแอนิเมชันไม่ถูกต้อง!"
+msgstr "ชื่อแอนิเมชันไม่ถูกต้อง!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ผิดพลาด: มีชื่อแอนิเมชันนี้อยู่แล้ว!"
+msgstr "ชื่อแอนิเมชันนี้ มีอยู่แล้ว!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -4625,14 +4424,12 @@ msgid "Duplicate Animation"
msgstr "ทำซ้ำแอนิเมชัน"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ผิดพลาด: ไม่มีแอนิเมชันให้คัดลอก!"
+msgstr "ไม่มีแอนิเมชันให้คัดลอก!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ผิดพลาด: ไม่มีแอนิเมชันในคลิปบอร์ด!"
+msgstr "ไม่มีแอนิเมชันในคลิปบอร์ด!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -4643,9 +4440,8 @@ msgid "Paste Animation"
msgstr "วางแอนิเมชัน"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ผิดพลาด: ไม่มีแอนิเมชันให้แก้ไข!"
+msgstr "ไม่มีแอนิเมชันให้แก้ไข!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -4751,9 +4547,8 @@ msgid "Include Gizmos (3D)"
msgstr "รวมสัญลักษณ์ (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "วางแอนิเมชัน"
+msgstr "ปักหมุด AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -4783,9 +4578,8 @@ msgid "Cross-Animation Blend Times"
msgstr "ระยะเวลาการผสาน Cross-Animation"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Move Node"
-msgstr "โหมดเคลื่อนย้าย"
+msgstr "เคลื่อนย้ายโหนด"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -4813,7 +4607,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "ซิงค์"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
@@ -4833,9 +4627,8 @@ msgid "No playback resource set at path: %s."
msgstr "ไม่อยู่ในโฟลเดอร์รีซอร์ส"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
-msgstr "ลบ:"
+msgstr "ลบโหนดแล้ว"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -4854,9 +4647,8 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "สร้าง %s ใหม่"
+msgstr "สร้างโหนดใหม่"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -4877,14 +4669,12 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "ทรานสิชัน"
+msgstr "ทรานสิชัน: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "โหมดมุมมอง"
+msgstr "โหมดการเล่น:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -5056,7 +4846,6 @@ msgid "Request failed, return code:"
msgstr "การร้องขอผิดพลาด รหัส:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed."
msgstr "ร้องขอผิดพลาด"
@@ -5067,7 +4856,7 @@ msgstr "บันทึกธีมไม่ได้:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Write error."
-msgstr ""
+msgstr "การเขียนผิดพลาด"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
@@ -5084,9 +4873,8 @@ msgid "Request failed, timeout"
msgstr "การร้องขอผิดพลาด รหัส:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Timeout."
-msgstr "เวลา"
+msgstr "หมดเวลา"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -5109,9 +4897,8 @@ msgid "Asset Download Error:"
msgstr "ดาวน์โหลดทรัพยากรผิดพลาด:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "กำลังดาวน์โหลด"
+msgstr "กำลังดาวน์โหลด (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading..."
@@ -5147,32 +4934,29 @@ msgstr "กำลังดาวน์โหลดไฟล์นี้อยู
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "อัพเดทล่าสุด"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "อัพเดทน้อยสุด"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "ชื่อ (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "ชื่อ (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "สัญญาอนุญาต"
+msgstr "สัญญาอนุญาต (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "สัญญาอนุญาต"
+msgstr "สัญญาอนุญาต (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
msgstr "แรกสุด"
@@ -5194,7 +4978,7 @@ msgstr "ทั้งหมด"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr ""
+msgstr "ไม่มีผลลัพธ์สำหรับ \"%s\""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Import..."
@@ -5235,7 +5019,7 @@ msgstr "กำลังโหลด..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
-msgstr "ไฟล์ ZIP"
+msgstr "ทรัพยากรไฟล์ ZIP"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid ""
@@ -5262,7 +5046,7 @@ msgid "Bake Lightmaps"
msgstr "สร้าง Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "ตัวอย่าง"
@@ -5276,7 +5060,7 @@ msgstr "จุดกำเนิดตาราง:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Step:"
-msgstr "ระยะห่างเส้น:"
+msgstr "ระยะห่างเส้นกริด:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
@@ -5382,63 +5166,52 @@ msgid ""
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Left"
-msgstr "ซ้าย"
+msgstr "บนซ้าย"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Right"
-msgstr "ขวา"
+msgstr "บนขวา"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Right"
-msgstr "ย้ายไปขวา"
+msgstr "ล่างขวา"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Left"
-msgstr "มุมล่าง"
+msgstr "ล่างซ้าย"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Left"
-msgstr "ย่อหน้าซ้าย"
+msgstr "กลางซ้าย"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Top"
-msgstr "ให้สิ่งที่เลือกอยู่กลางจอ"
+msgstr "กลางบน"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Right"
-msgstr "ย่อหน้าขวา"
+msgstr "กลางขวา"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Bottom"
-msgstr "ล่าง"
+msgstr "กลางล่าง"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "กลาง"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
-msgstr "มุมซ้าย"
+msgstr "ความกว้างซ้าย"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Wide"
-msgstr "มุมบน"
+msgstr "ความกว้างบน"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
-msgstr "มุมขวา"
+msgstr "ความกว้างขวา"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5447,11 +5220,11 @@ msgstr "มุมล่าง"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr ""
+msgstr "ความกว้าง VCenter"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr ""
+msgstr "ความกว้าง HCenter"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5459,9 +5232,8 @@ msgid "Full Rect"
msgstr "ชื่อเต็ม"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "อัตราส่วนเวลา:"
+msgstr "รักษาอัตราส่วน"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5481,6 +5253,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"เขียนทับกล้องของเกมส์\n"
+"เขียนทับกล้องของเกมส์ด้วยเอดิเตอร์ของวิวพอร์ตของกล้อง"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5488,18 +5262,18 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"เขียนทับกล้องของเกมส์\n"
+"ไม่มีอินสแตนซ์ของเกมส์ทำงานอยู่"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "เครื่องมือเลือก"
+msgstr "ล็อกที่เลือก"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Unlock Selected"
-msgstr "ลบสิ่งที่เลือก"
+msgstr "ปลดล็อคที่เลือก"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5528,9 +5302,8 @@ msgid "Create Custom Bone(s) from Node(s)"
msgstr "สร้างจุดปะทุจาก Mesh"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Bones"
-msgstr "ลบท่าทาง"
+msgstr "ลบโครง"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
@@ -5549,7 +5322,6 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
-#, fuzzy
msgid "Zoom Reset"
msgstr "รีเซ็ตการซูม"
@@ -5586,9 +5358,8 @@ msgstr "โหมดหมุน"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "โหมดปรับขนาด (R)"
+msgstr "โหมดปรับขนาด"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5608,9 +5379,8 @@ msgid "Pan Mode"
msgstr "โหมดมุมมอง"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "โหมดการทำงาน:"
+msgstr "โหมดไม้บรรทัด"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5628,9 +5398,8 @@ msgid "Toggle grid snapping."
msgstr "เปิด/ปิด การจำกัด"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Grid Snap"
-msgstr "จำกัดด้วยเส้นตาราง"
+msgstr "ใช้การเข้าหาเส้นกริด"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5707,12 +5476,12 @@ msgstr "ปลดล็อควัตถุที่เลือก"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Makes sure the object's children are not selectable."
-msgstr "ทำให้เลือกโหนดลูกไม่ได้"
+msgstr "เลือกโหนดลูกไม่ได้"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
-msgstr "ทำให้เลือกโหนดลูกได้เหมือนเดิม"
+msgstr "เลือกโหนดลูกได้"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5738,9 +5507,8 @@ msgid "View"
msgstr "มุมมอง"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Always Show Grid"
-msgstr "แสดงเส้นตาราง"
+msgstr "แสดงเส้นกริด"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
@@ -5766,7 +5534,7 @@ msgstr "1 มุมมอง"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "แสดงกลุ่มและล็อคไอคอน"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -5830,11 +5598,11 @@ msgstr "ลบท่าทาง"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
-msgstr "เพิ่มความถี่เส้นตารางขึ้น 2 เท่า"
+msgstr "เพิ่มความถี่เส้นกริดขึ้น 2 เท่า"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Divide grid step by 2"
-msgstr "ลดความถี่เส้นตารางลงครึ่งหนึ่ง"
+msgstr "ลดความถี่กริดลงครึ่งหนึ่ง"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5851,7 +5619,7 @@ msgstr "กำลังเพิ่ม %s..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
-msgstr "อินสแตนซ์หลาย ๆ โหนดโดยที่ไม่มีโหนดรากไม่ได้"
+msgstr "อินสแตนซ์หลาย ๆ โหนดโดยที่ไม่มีโหนดแม่ไม่ได้"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -5877,9 +5645,8 @@ msgstr ""
"ลาก & วาง + Alt: เปลี่ยนประเภทโหนด"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon3D"
-msgstr "สร้างรูปหลายเหลี่ยม"
+msgstr "สร้าง Polygon3D"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
@@ -5902,9 +5669,8 @@ msgstr "โหลด Mask การปะทุ"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "เริ่มใหม่ทันที"
+msgstr "เริ่มใหม่"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5936,7 +5702,7 @@ msgstr "Snap (พิกเซล):"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Border Pixels"
-msgstr ""
+msgstr "พิกเซลขอบ"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -6004,12 +5770,10 @@ msgid "Load Curve Preset"
msgstr "โหลดเส้นโค้งตัวอย่าง"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
msgstr "เพิ่มจุด"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
msgstr "ลบจุด"
@@ -6051,7 +5815,7 @@ msgstr "สร้าง GI Probe"
#: editor/plugins/gradient_editor_plugin.cpp
msgid "Gradient Edited"
-msgstr ""
+msgstr "แก้ไขเกรเดียนต์"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
@@ -6074,12 +5838,13 @@ msgid "Mesh is empty!"
msgstr "Mesh ว่างเปล่า!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "สร้าง Static Trimesh Body"
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "สร้างรูปทรงกายภาพเป็นโหนดญาติ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "สร้าง StaticBody ทรงตัน"
+msgid "Create Static Trimesh Body"
+msgstr "สร้าง Static Trimesh Body"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -6091,12 +5856,30 @@ msgid "Create Trimesh Static Shape"
msgstr "สร้างรูปทรง Trimesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "สร้างรูปทรงนูน"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "ไม่สามารถสร้างโฟลเดอร์"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "สร้างรูปทรงนูน"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6148,19 +5931,57 @@ msgid "Create Trimesh Static Body"
msgstr "สร้าง Trimesh Static Body"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "สร้างรูปทรงกายภาพเป็นโหนดญาติ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "สร้างรูปทรงตันกายภาพเป็นโหนดญาติ"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "สร้างรูปทรงตันกายภาพเป็นโหนดญาติ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "สร้างเส้นขอบ Mesh..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "แสดง UV1"
@@ -6189,11 +6010,12 @@ msgid "Remove item %d?"
msgstr "ลบไอเทม %d?"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "อัพเดตจากฉาก"
+msgstr ""
+"อัพเดตจากฉากที่มีอยู่หรือไม่\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
#, fuzzy
@@ -6349,7 +6171,7 @@ msgstr "โหนดไม่มี geometry (หน้า)"
#: editor/plugins/particles_editor_plugin.cpp
msgid "\"%s\" doesn't inherit from Spatial."
-msgstr ""
+msgstr "\"%s\" ไม่ได้สืบทอดมาจาก Spatial"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -6551,6 +6373,8 @@ msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
msgstr ""
+"ไม่มีเทกเจอร์ในรูปหลายเหลี่ยมนี้\n"
+"ตั้งเทกเจอร์เพื่อที่จะแก้ไข UV ได้"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
@@ -6563,9 +6387,8 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "สร้างรูปหลายเหลี่ยม"
+msgstr "สร้าง Polygon และ UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6615,7 +6438,7 @@ msgstr "แก้ไข UV รูปหลายเหลี่ยม 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6663,13 +6486,15 @@ msgstr "ปรับขนาดรูปหลายเหลี่ยม"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create a custom polygon. Enables custom polygon rendering."
-msgstr ""
+msgstr "สร้างรูปหลายเหลี่ยมแบบกำหนดเอง เปิดการเรนเดอร์รูปหลายเหลี่ยมแบบกำหนดเอง"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"Remove a custom polygon. If none remain, custom polygon rendering is "
"disabled."
msgstr ""
+"ลบรูปหลายเหลี่ยมแบบกำหนดเอง "
+"ถ้าไม่มีรูปหลายเหลี่ยมอยู่จะปิดการเรนเดอร์รูปหลายเหลี่ยมแบบกำหนดเอง"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint weights with specified intensity."
@@ -6681,7 +6506,7 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "รัศมี:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -6696,9 +6521,8 @@ msgid "Clear UV"
msgstr "ลบ UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "การตั้งค่า GridMap"
+msgstr "ตั้งค่าเส้นกริด"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
@@ -6710,36 +6534,31 @@ msgstr "จำกัดการเคลื่อนย้าย"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
-msgstr "เส้นตาราง"
+msgstr "เส้นกริด"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Show Grid"
-msgstr "แสดงเส้นตาราง"
+msgstr "แสดงเส้นกริด"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "ตั้งค่าการจำกัด"
+msgstr "ตั้งค่าเส้นกริด:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "จุดกำเนิดตาราง:"
+msgstr "จุดเริ่มเส้นกริดแกน X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "จุดกำเนิดตาราง:"
+msgstr "จุดเริ่มเส้นกริดแกน Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "ระยะห่างเส้น:"
+msgstr "ระยะห่างกริดแกน X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "ระยะห่างเส้น:"
+msgstr "ระยะห่างกริดแกน Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -6814,9 +6633,8 @@ msgid "Close and save changes?"
msgstr "ปิดและบันทึก?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "ผิดพลาดขณะย้ายไฟล์:\n"
+msgstr "ผิดพลาดขณะย้ายไฟล์:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6839,33 +6657,28 @@ msgid "Error Saving"
msgstr "ผิดพลาดขณะบันทึก"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
msgstr "ผิดพลาดขณะนำเข้าธีม"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
msgstr "ผิดพลาดขณะนำเข้า"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
-msgstr "สร้างโฟลเดอร์..."
+msgstr "สร้างไฟล์ข้อความใหม่"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "เปิดไฟล์"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "บันทึกเป็น..."
+msgstr "บันทึกไฟล์เป็น..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "ไม่สามารถเรียกใช้สคริปต์ได้"
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
@@ -6897,9 +6710,8 @@ msgid "Save Theme As..."
msgstr "บันทึกธีมเป็น"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "%s Class Reference"
-msgstr " ตำราอ้างอิงคลาส"
+msgstr "%s อ้างอิงคลาส"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -6954,9 +6766,8 @@ msgid "File"
msgstr "ไฟล์"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open..."
-msgstr "เปิด"
+msgstr "เปิด..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reopen Closed Script"
@@ -6988,9 +6799,8 @@ msgid "Theme"
msgstr "ธีม"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Import Theme..."
-msgstr "นำเข้าธีม"
+msgstr "นำเข้าธีม..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
@@ -7010,7 +6820,7 @@ msgstr "ปิดคู่มือ"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
-msgstr "รัน"
+msgstr "เริ่ม"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
@@ -7031,25 +6841,15 @@ msgstr "ทำต่อไป"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
-msgstr "เปิดตัวแก้ไขจุดบกพร่องค้างไว้"
+msgstr "เปิดตัวดีบักค้างไว้"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "แก้จุดบกพร่องด้วยโปรแกรมอื่น"
+msgstr "ดีบักด้วยเอดิเตอร์อื่น"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "เปิดคู่มือ"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
+msgstr "เปิดคู่มือออนไลน์"
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
@@ -7087,22 +6887,19 @@ msgstr "บันทึกอีกครั้ง"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
-msgstr "ตัวแก้ไขจุดบกพร่อง"
+msgstr "ตัวดีบัก"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "ค้นหาในคู่มือ"
+msgstr "ผลการค้นหา"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Clear Recent Scripts"
-msgstr "ล้างรายการฉากล่าสุด"
+msgstr "เคลียร์สคริปต์ล่าสุด"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Connections to method:"
-msgstr "เชื่อมไปยังโหนด:"
+msgstr "เชื่อมไปยังเมธอด:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
#, fuzzy
@@ -7110,9 +6907,8 @@ msgid "Source"
msgstr "ต้นฉบับ:"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Target"
-msgstr "ตำแหน่งที่อยู่:"
+msgstr "เป้าหมาย"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7122,12 +6918,13 @@ msgstr "ลบการเชื่อมโยง '%s' กับ '%s'"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Line"
-msgstr "บรรทัด:"
+msgid "[Ignore]"
+msgstr "(ละเว้น)"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
+#, fuzzy
+msgid "Line"
+msgstr "บรรทัด:"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7170,17 +6967,17 @@ msgstr "อักษรแรกพิมพ์ใหญ่"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
+msgstr "ไฮไลท์ไวยากรณ์"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
-msgstr ""
+msgstr "ไปยัง"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Bookmarks"
-msgstr ""
+msgstr "บุ๊คมาร์ค"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -7315,13 +7112,12 @@ msgid "Go to Previous Breakpoint"
msgstr "ไปจุดพักก่อนหน้า"
#: editor/plugins/shader_editor_plugin.cpp
-#, fuzzy
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
-"ไฟล์ต่อไปนี้ในดิสก์ใหม่กว่า\n"
-"จะทำอย่างไรต่อไป?:"
+"เชดเดอร์ถูกแก้ไขบนดิสก์\n"
+"จะทำอย่างไรต่อไป?"
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
@@ -7517,6 +7313,11 @@ msgstr "ต้องเลือกเพียงโหนดเดียว"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
+msgid "Auto Orthogonal Enabled"
+msgstr "ขนาน"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Lock View Rotation"
msgstr "แสดงข้อมูล"
@@ -7608,21 +7409,30 @@ msgid "Freelook Slow Modifier"
msgstr "ปรับความเร็วมุมมองอิสระ"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "แสดงข้อมูล"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "แสดงข้อมูล"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "เครื่องมือเคลื่อนย้าย"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Snap Nodes To Floor"
msgstr "จำกัดด้วยเส้นตาราง"
@@ -7748,9 +7558,8 @@ msgstr "แสดงเส้นตาราง"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Settings..."
-msgstr "ตัวเลือก"
+msgstr "ตั้งค่า..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7856,9 +7665,8 @@ msgid "LightOccluder2D Preview"
msgstr "สร้างรูปหลายเหลี่ยมกั้นแสง"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "ตำแหน่งบันทึกว่างเปล่า!"
+msgstr "สไปรต์ว่างเปล่า!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
@@ -7878,9 +7686,8 @@ msgid "Invalid geometry, can't create polygon."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Polygon2D"
-msgstr "ย้ายรูปหลายเหลี่ยม"
+msgstr "แปลงเป็น Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
@@ -7901,23 +7708,20 @@ msgid "Create LightOccluder2D Sibling"
msgstr "สร้างรูปหลายเหลี่ยมกั้นแสง"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "สไปรต์"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "ลดความซับซ้อน: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Shrink (Pixels): "
-msgstr "Snap (พิกเซล):"
+msgstr "หด (พิกเซล): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "Snap (พิกเซล):"
+msgstr "ขยาย (พิกเซล): "
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -7925,28 +7729,24 @@ msgid "Update Preview"
msgstr "ตัวอย่าง Atlas"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "ตัวเลือก"
+msgstr "ตั้งค่า:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "ให้สิ่งที่เลือกเต็มจอ"
+msgstr "ไม่มีเฟรมที่เลือก"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add %d Frame(s)"
-msgstr "เพิ่มเฟรม"
+msgstr "เพิ่ม %d เฟรม(วินาที)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
msgstr "เพิ่มเฟรม"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "โหลดรูปไม่ได้:"
+msgstr "โหลดรูปไม่ได้"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -7973,22 +7773,20 @@ msgid "(empty)"
msgstr "(ว่างเปล่า)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move Frame"
-msgstr "วางเฟรม"
+msgstr "เลื่อนเฟรม"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animations:"
-msgstr "แอนิเมชัน"
+msgstr "แอนิเมชัน:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "New Animation"
-msgstr "แอนิเมชัน"
+msgstr "แอนิเมชันใหม่"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "ความเร็ว (เฟรม/วินาที):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7996,18 +7794,16 @@ msgid "Loop"
msgstr "วน"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animation Frames:"
-msgstr "เฟรมแอนิเมชัน"
+msgstr "เฟรมแอนิเมชัน:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "เพิ่มโหนดจากผัง"
+msgstr "เพิ่มเทกเจอร์จากไฟล์"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr ""
+msgstr "เพิ่มเฟรมจากสไปรต์ชีต"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
@@ -8026,32 +7822,28 @@ msgid "Move (After)"
msgstr "ย้าย (หลัง)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "สแตค"
+msgstr "เลือกเฟรม"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Horizontal:"
-msgstr ""
+msgstr "แนวนอน:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Vertical:"
-msgstr "มุมรูปทรง"
+msgstr "แนวตั้ง:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select/Clear All Frames"
-msgstr "เลือกทั้งหมด"
+msgstr "เลือก/เคลียร์เฟรมทั้งหมด"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Create Frames from Sprite Sheet"
-msgstr "สร้างจากฉาก"
+msgstr "สร้างเฟรมจากสไปรต์ชีต"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "SpriteFrames"
-msgstr "SpriteFrames"
+msgstr "สไปรต์เฟรม"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Region Rect"
@@ -8068,9 +7860,8 @@ msgstr "โหมดการจำกัด:"
#: editor/plugins/texture_region_editor_plugin.cpp
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "None"
-msgstr "<ไม่มี>"
+msgstr "ไม่มี"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -8078,7 +7869,7 @@ msgstr "จำกัดให้ย้ายเป็นพิกเซล"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Grid Snap"
-msgstr "จำกัดด้วยเส้นตาราง"
+msgstr "เข้าหาเส้นกริด"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
@@ -8118,9 +7909,8 @@ msgid "Remove All"
msgstr "ลบทั้งหมด"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "แก้ไขธีม..."
+msgstr "แก้ไขธีม"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
@@ -8152,9 +7942,8 @@ msgid "Toggle Button"
msgstr "ปุ่มเมาส์"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Button"
-msgstr "เมาส์กลาง"
+msgstr "ปิดการทำงานปุ่ม"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Item"
@@ -8189,17 +7978,15 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
-msgstr ""
+msgstr "เมนูย่อย"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Subitem 1"
-msgstr "ไอเทม"
+msgstr "ไอเทมย่อย 1"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Subitem 2"
-msgstr "ไอเทม"
+msgstr "ไอเทมย่อย 2"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
@@ -8227,18 +8014,16 @@ msgid "Tab 3"
msgstr "แท็บ 3"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Editable Item"
-msgstr "แก้ไขโหนดลูกได้"
+msgstr "ไอเทมที่สามารถแก้ไขได้"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
-msgstr ""
+msgstr "ผังย่อย"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Has,Many,Options"
-msgstr "มี,มากมาย,หลาย,ตัวเลือก!"
+msgstr "มี,หลาย,ตัวเลือก"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
@@ -8262,28 +8047,25 @@ msgid "Color"
msgstr "สี"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme File"
-msgstr "ธีม"
+msgstr "ไฟล์ธีม"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
msgstr "ลบที่เลือก"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "ชื่อผิดพลาด"
+msgstr "แก้ไขไทล์ที่ไม่ถูกต้อง"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "ให้สิ่งที่เลือกอยู่กลางจอ"
+msgstr "ตัดที่เลือก"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
-msgstr "วาด TileMap"
+msgstr "วาดไทล์แมพ"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Line Draw"
@@ -8295,16 +8077,15 @@ msgstr "วาดสี่เหลี่ยม"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
-msgstr "ถมเต็ม"
+msgstr "เทสี"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
-msgstr "ลบ TileMap"
+msgstr "ลบไทล์แมพ"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "ค้นหา tile"
+msgstr "ค้นหาไทล์"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -8316,14 +8097,12 @@ msgid "Disable Autotile"
msgstr "Autotiles"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Enable Priority"
-msgstr "แก้ไขตัวกรอง"
+msgstr "เปิดการจัดลำดับความสำคัญ"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter tiles"
-msgstr "คัดกรองไฟล์..."
+msgstr "ตัวกรองไทล์"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
@@ -8331,35 +8110,35 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "วาด Tile"
+msgstr "วาดไทล์"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
"Shift+LMB: Line Draw\n"
"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
+"Shift+LMB: วาดเส้น\n"
+"Shift+Ctrl+LMB: วาดสี่เหลี่ยม"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "เลือก Tile"
+msgstr "เลือกไทล์"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Left"
-msgstr "โหมดหมุน"
+msgstr "หมุนซ้าย"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Right"
-msgstr "ย้ายไปขวา"
+msgstr "หมุนขวา"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
-msgstr ""
+msgstr "พลิกแนวนอน"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Vertically"
-msgstr ""
+msgstr "พลิกแนวตั้ง"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
@@ -8367,14 +8146,12 @@ msgid "Clear Transform"
msgstr "เคลื่อนย้าย"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Add Texture(s) to TileSet."
-msgstr "เพิ่มโหนดจากผัง"
+msgstr "เพิ่มเทกเจอร์ให้ไทล์เซต"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected Texture from TileSet."
-msgstr "ลบรายการ"
+msgstr "ลบเทกเจอร์ที่เลือกจากไทล์เซต"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -8386,7 +8163,7 @@ msgstr "รวมจากฉาก"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
-msgstr ""
+msgstr "ไทล์เดี่ยวใหม่"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8399,22 +8176,20 @@ msgid "New Atlas"
msgstr "%s ใหม่"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Next Coordinate"
-msgstr "ไปชั้นบน"
+msgstr "พิกัดถัดไป"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
-msgstr ""
+msgstr "เลือกรูปร่าง, ไทล์ย่อย หรือไทล์อันถัดไป"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Previous Coordinate"
-msgstr "ไปชั้นล่าง"
+msgstr "พิกัดก่อนหน้า"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
-msgstr ""
+msgstr "เลือกรูปร่าง, ไทล์ย่อยหรือไทล์ก่อนหน้า"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8422,9 +8197,8 @@ msgid "Region"
msgstr "โหมดการทำงาน:"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision"
-msgstr "โหนดแอนิเมชัน"
+msgstr "ขอบเขตการชน"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8442,9 +8216,8 @@ msgid "Bitmask"
msgstr "โหมดหมุน"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority"
-msgstr "วิธีการส่งออก:"
+msgstr "การจัดลำดับความสำคัญ"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8457,9 +8230,8 @@ msgid "Region Mode"
msgstr "โหมดการทำงาน:"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision Mode"
-msgstr "โหนดแอนิเมชัน"
+msgstr "โหมดขอบเขตการชน"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8477,14 +8249,12 @@ msgid "Bitmask Mode"
msgstr "โหมดหมุน"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "วิธีการส่งออก:"
+msgstr "โหมดการจัดลำดับความสำคัญ"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Icon Mode"
-msgstr "โหมดมุมมอง"
+msgstr "โหมดไอคอน"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8506,26 +8276,24 @@ msgid "Erase bitmask."
msgstr "คลิกขวา: ลบจุด"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "สร้าง %s ใหม่"
+msgstr "สร้างสี่เหลี่ยมใหม่"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new polygon."
-msgstr "สร้างรูปหลายเหลี่ยมจากความว่างเปล่า"
+msgstr "สร้างรูปหลายเหลี่ยมใหม่"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
-msgstr ""
+msgstr "ให้รูปหลายเหลี่ยมอยู่ในขอบเขตของสี่เหลี่ยม"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
-msgstr ""
+msgstr "โชว์เส้นกริด และ จุดตามกริด (ตั้งค่าใน Inspector)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display Tile Names (Hold Alt Key)"
-msgstr ""
+msgstr "แสดงชื่อไทล์ (กดAltค้างไว้)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8533,30 +8301,28 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "ลบรายการ"
+msgstr "ลบเทกเจอร์หรือไม่ โดยจะลบไทล์ทุกอันที่ใช้เทกเจอร์นี้"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "คุณยังไม่ได้เลือกเทกเจอร์ที่จะลบ"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene? This will overwrite all current tiles."
-msgstr ""
+msgstr "สร้างจากสกรีน นี่จะสร้างทับไทล์เดิม"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "รวมจากฉาก?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Texture"
-msgstr "ลบแม่แบบ"
+msgstr "ลบเทกเจอร์"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
-msgstr ""
+msgstr "%s ไฟล์ไม่สามารถเพิ่มเข้าได้ เนื่องจากอยู่ในลิสต์เรียบร้อยแล้ว"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8565,68 +8331,69 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete selected Rect."
-msgstr "ลบไฟล์ที่เลือก?"
+msgstr "ลบสี่เหลี่ยมที่เลือก"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr "เลือกไทล์ย่อยที่กำลังปรับแต่ง"
+msgstr ""
+"เลือกไทล์ย่อยอันปัจจุบันเพื่อปรับแต่ง\n"
+"คลิกที่ไทล์อันอื่นพื่อปรับแต่ง"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
-msgstr "ลบจุด"
+msgstr "ลบรูปหลายเหลี่ยม"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"LMB: Set bit on.\n"
"RMB: Set bit off.\n"
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
msgstr ""
-"คลิกซ้าย: กำหนดค่าบิต เปิด\n"
-"คลิกขวา: กำหนดค่าบิต ปิด"
+"คลิกซ้าย: เปิด bit.\n"
+"คลิกขวา: ปิด bit.\n"
+"Shift+คลิกซ้าย: ตั้ง wildcard bit.\n"
+"คลิกไทล์อันอื่นเพื่อปรับแต่ง"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
-msgstr "เลือกรูปภาพย่อยเพื่อทำเป็นไอคอน ภาพนี้จะใช้แสดงเมื่อการ"
+msgstr ""
+"เลือกไทล์ย่อยเพื่อใช้เป็นไอคอน สามารถใช้เมื่อ autotile bindings มีความผิดพลาด\n"
+"คลิกไทล์อันอื่นเพื่อแก้ไขไทล์นั้น"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "เลือกไทล์ย่อยเพื่อจัดลำดับความสำคัญ"
+msgstr ""
+"เลือกไทล์ย่อยเพื่อจัดลำดับความสำคัญ\n"
+"คลิกไทล์อันอื่นเพื่อแก้ไขไทล์นั้น"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
-msgstr "เลือกไทล์ย่อยเพื่อจัดลำดับความสำคัญ"
+msgstr ""
+"เลือกไทล์ย่อยเพื่อเปลี่ยน z index\n"
+"คลิกที่ไทล์อื่นเพื่อแก้ไขไทล์นั้น"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Set Tile Region"
-msgstr "กำหนดขอบเขต Texture"
+msgstr "ตั้งขอบเขตไทล์"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Tile"
-msgstr "สร้างโฟลเดอร์"
+msgstr "สร้างไทล์"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Icon"
-msgstr ""
+msgstr "ตั้งไอคอนไทล์"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8668,9 +8435,8 @@ msgid "Make Polygon Convex"
msgstr "ย้ายรูปหลายเหลี่ยม"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Tile"
-msgstr "ลบแม่แบบ"
+msgstr "ลบไทล์"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8688,13 +8454,12 @@ msgid "Remove Navigation Polygon"
msgstr "สร้างรูปทรงนำทาง"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Tile Priority"
-msgstr "แก้ไขตัวกรอง"
+msgstr "แก้ลำดับความสำคัญของไทล์"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
-msgstr ""
+msgstr "แก้ไขดัชนี Z ของไทล์"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8702,14 +8467,12 @@ msgid "Make Convex"
msgstr "ย้ายรูปหลายเหลี่ยม"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
-msgstr "ย้ายรูปหลายเหลี่ยม"
+msgstr "ทำให้เว้า"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Collision Polygon"
-msgstr "สร้างรูปทรงนำทาง"
+msgstr "สร้างรูปหลายเหลี่ยมของเขตการชน"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8717,20 +8480,18 @@ msgid "Create Occlusion Polygon"
msgstr "สร้างรูปหลายเหลี่ยมกั้นแสง"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "ทำไม่ได้ถ้าไม่มีฉาก"
+msgstr "ไม่สามารถเปลี่ยนแปลงคุณสมบัติได้"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "TileSet"
-msgstr "Tile Set"
+msgstr "ไทล์เซต"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No VCS addons are available."
-msgstr ""
+msgstr "ไม่พบส่วนเสริม VCS"
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "ผิดพลาด"
@@ -8757,9 +8518,8 @@ msgid "Version Control System"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Initialize"
-msgstr "อักษรแรกพิมพ์ใหญ่"
+msgstr "เริ่มต้น"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
@@ -8771,7 +8531,6 @@ msgid "Detect new changes"
msgstr "สร้าง %s ใหม่"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Changes"
msgstr "เปลี่ยน"
@@ -8780,14 +8539,12 @@ msgid "Modified"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Renamed"
-msgstr "เปลี่ยนชื่อ"
+msgstr "เปลี่ยนชื่อแล้ว"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Deleted"
-msgstr "ลบ"
+msgstr "ลบแล้ว"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8833,26 +8590,23 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(GLES3 only)"
-msgstr ""
+msgstr "(GLES3 เท่านั้น)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Output"
-msgstr "เพิ่มอินพุต"
+msgstr "เพิ่มเอาท์พุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "อัตราส่วน:"
+msgstr "สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector"
-msgstr "คุณสมบัติ"
+msgstr "เวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
-msgstr ""
+msgstr "บูลีน"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8860,43 +8614,36 @@ msgid "Sampler"
msgstr "ไฟล์เสียง"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "เพิ่มอินพุต"
+msgstr "เพิ่มพอร์ตอินพุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr ""
+msgstr "เพิ่มพอร์ตเอาต์พุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "เปลี่ยนประเภท"
+msgstr "เปลี่ยนชนิดพอร์ตอินพุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "เปลี่ยนประเภท"
+msgstr "เปลี่ยนชนิดพอร์ตเอาต์พุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "เปลี่ยนชื่ออินพุต"
+msgstr "เปลี่ยนชื่อพอร์ตอินพุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port name"
-msgstr "เปลี่ยนชื่ออินพุต"
+msgstr "เปลี่ยนชื่อพอร์ตเอาต์พุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "ลบจุด"
+msgstr "ลบพอร์ตอินพุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "ลบจุด"
+msgstr "ลบพอร์ตเอาต์พุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8904,26 +8651,22 @@ msgid "Set expression"
msgstr "แก้ไขสมการ"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Resize VisualShader node"
-msgstr "Shader"
+msgstr "ปรับขนาดโหนดเวอร์ชวลเชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
-msgstr ""
+msgstr "ตั้งชื่อยูนิฟอร์ม"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set Input Default Port"
-msgstr "กำหนดเป็นค่าเริ่มต้นของ '%s'"
+msgstr "กำหนดพอร์ตอินพุตเริ่มต้น"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Node to Visual Shader"
-msgstr "Shader"
+msgstr "เพิ่มโหนดไปยังเวอร์ชวลเชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Nodes"
msgstr "ทำซ้ำโหนด"
@@ -8933,13 +8676,12 @@ msgid "Paste Nodes"
msgstr "วางโหนด"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Nodes"
msgstr "ลบโหนด"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Input Type Changed"
-msgstr ""
+msgstr "เปลี่ยนชนิดของอินพุตเวอร์ชวลเชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8947,9 +8689,8 @@ msgid "Vertex"
msgstr "มุมรูปทรง"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
-msgstr "ตัวแปร:"
+msgstr "แฟรกเมนต์"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -8962,44 +8703,40 @@ msgid "Show resulted shader code."
msgstr "สร้างโหนด"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Create Shader Node"
-msgstr "สร้างโหนด"
+msgstr "สร้างโหนดเชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "ไปยังฟังก์ชัน..."
+msgstr "ฟังก์ชันสี"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
-msgstr ""
+msgstr "การดำเนินการสี"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "สร้างฟังก์ชัน"
+msgstr "ฟังก์ชันขาว-ดำ"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
+msgstr "แปลงเวกเตอร์ HSV เป็น RGB"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
+msgstr "แปลงเวกเตอร์ RGB เป็น HSV"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "เปลี่ยนชื่อฟังก์ชัน"
+msgstr "ฟังก์ชันซีเปีย"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
-msgstr ""
+msgstr "ดำเนินการ Burn"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Darken operator."
-msgstr ""
+msgstr "ดำเนินการ Darken"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9008,7 +8745,7 @@ msgstr "เฉพาะที่แตกต่าง"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr ""
+msgstr "ดำเนินการ Dodge"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9017,19 +8754,19 @@ msgstr "แก้ไขเครื่องหมายสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr ""
+msgstr "ดำเนินการ Lighten"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr ""
+msgstr "ดำเนินการ Overlay"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "ดำเนินการ Screen"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "ดำเนินการ SoftLight"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9043,165 +8780,161 @@ msgstr "เคลื่อนย้าย"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
+msgstr "คืนค่าผลบูลีนจากการเปรียบเทียบระหว่างสองตัวแปรของ %s"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "เทียบเท่า (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "มากกว่า (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "มากกว่าหรือเท่ากับ (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
-msgstr ""
+msgstr "คืนค่าเวกเตอร์ที่เกี่ยวข้องถ้าสเกลาร์ที่ให้มีค่าเท่ากับ มากกว่าหรือน้อยกว่า"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
-msgstr ""
+msgstr "คืนค่าบูลีนจากการเปรียบเทียบค่า INF กับพารามิเตอร์ชนิดสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
-msgstr ""
+msgstr "คืนค่าบูลีนซึ่งเปรียบเทียบค่าระหว่าง NaN กับพารามิเตอร์สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "น้อยกว่า(<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "น้อยกว่าหรือเท่ากับ(<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "ไม่เท่ากับ (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
-msgstr ""
+msgstr "คืนค่าเวกเตอร์ที่เกี่ยวข้องถ้าบูลีนที่ให้มีค่าเท่ากับ true หรือ false"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated scalar if the provided boolean value is true or false."
-msgstr ""
+msgstr "คืนค่าสเกลาร์ที่เกี่ยวข้องถ้าต่าบูลีนที่ให้มีค่า true หรือ false"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
+msgstr "คืนค่าบูลีนจากการเปรียบเทียบพารามิเตอร์สองตัว"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
-msgstr ""
+msgstr "คืนค่าบูลีนจากการเปรียบเทียบค่า INF (หรือ NaN) และพารามิเตอร์สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Boolean constant."
-msgstr "แก้ไขค่าคงที่เวกเตอร์"
+msgstr "ค่าคงที่บูลีน"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
-msgstr ""
+msgstr "ยูนิฟอร์มบูลีน"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "'%s' พารามิเตอร์ของอินพุตสำหรับโหมดเชดเดอร์ทั้งหมด"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "จำกัดด้วยโหนดแม่"
+msgstr "พารามิเตอร์อินพุต"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
+msgstr "'%s' พารามิเตอร์อินพุตสำหรับโหมดเวอร์เท็กซ์เชดเดอร์และแฟรกเมนต์เชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "'%s' พารามิเตอร์อินพุตสำหรับโหมดแฟรกเมนต์เชดเดอร์และโหมดไลท์เชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "'%s' พารามิเตอร์อินพุตสำหรับโหมดแฟรกเมนต์เชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "'%s' พารามิเตอร์อินพุตสำหรับโหมดไลท์เชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
+msgstr "'%s' พารามิเตอร์อินพุตสำหรับโหมดเวอร์เท็กซ์เชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
+msgstr "'%s' พารามิเตอร์อินพุตสำหรับโหมดเวอร์เท็กซ์เชดเดอร์และแฟรกเมนต์เชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "แก้ไขฟังก์ชันสเกลาร์"
+msgstr "ฟังก์ชันสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "แก้ไขเครื่องหมายสเกลาร์"
+msgstr "ตัวดำเนินการสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
-msgstr ""
+msgstr "ค่าคงที่ E (2.718282) แสดงในรูปลอกาลิทึมฐานธรรมชาติ"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
+msgstr "ค่าคงที่เอพซิลอน (0.00001) ค่าที่เล็กที่สุดของสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
+msgstr "ค่าฟาย (1.618034) สัดส่วนทองคำ"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
+msgstr "ค่าพายส่วน 4 (0.785398) หรือ 45องศา"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
+msgstr "ค่าพายส่วน2 (1.570796) หรือ 90 องศา"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
+msgstr "ค่าพาย (3.141593) หรือ 180 องศา"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
+msgstr "ค่าเทา (6.283185) หรือ 360 องศา"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "ค่ารูท2 (1.414214)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr ""
+msgstr "คืนค่าสัมบูรณ์ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr ""
+msgstr "คืนค่า arc-cosine ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "คืนค่า arc cosh ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
@@ -9217,121 +8950,121 @@ msgstr "คืนค่า arc tan ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr ""
+msgstr "คืนค่า arc tan ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "คืนค่า tanh ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr ""
+msgstr "หาจำนวนเต็มใกล้ที่สุดที่มากกว่าหรือเท่ากับค่าพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
-msgstr ""
+msgstr "จำกัดค่าไว้ระหว่างอีกสองค่า"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "คืนค่า cos ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "คืนค่า cosh ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "แปลงเรเดียนเป็นองศา"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
-msgstr ""
+msgstr "เลขยกกำลังฐาน e"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 Exponential."
-msgstr ""
+msgstr "เลขยกกำลังฐาน 2"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
+msgstr "หาค่าจำนวนเต็มที่ใกล้ที่สุดที่น้อยกว่าหรือเท่ากับพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "คำนวณสัดส่วนจากอากิวเมนต์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "คืนค่ารูทสองของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
-msgstr ""
+msgstr "ลอกาลิทึมฐานธรรมชาติ"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "ลอกาลิทึมฐาน 2"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "คืนค่ามากสุด จากสองค่า"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "คืนค่าน้อยสุด จากสองค่า"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "ค่าประมาณเชิงเส้นระหว่างสเกลาร์สองค่า"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr ""
+msgstr "คืนค่าตรงกันข้ามจากพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
-msgstr ""
+msgstr "1.0 - สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the value of the first parameter raised to the power of the second."
-msgstr ""
+msgstr "คืนค่าพารามิเตอร์ตัวแรกยกกำลังด้วยพารามิเตอร์ตัวที่สอง"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "แปลงค่าองศาเป็นเรเดียน"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
-msgstr ""
+msgstr "1.0 / สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "หาจำนวนเต็มที่ใกล้กับพารามิเตอร์มากที่สุด"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "หาเลขคู่ที่ใกล้กับพารามิเตอร์มากที่สุด"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "จำกัดค่าให้อยู๋ระหว่าง 0.0 กับ 1.0"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
-msgstr ""
+msgstr "หาเครื่องหมายของพาราพิเตอร์ (บวก/ลบ)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr ""
+msgstr "คืนค่า sine ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
+msgstr "คืนค่า sinh ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr ""
+msgstr "คืนค่ารูทสองของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9341,6 +9074,10 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( สเกลาร์(edge0), สเกลาร์(edge1), สเกลาร์(x) )\n"
+"\n"
+"คืนค่า 0.0 ถ้า x น้อยกว่า 'edge0' และ 1.0 ถ้ามากกว่า 'edge1' หรือคืนค่าระหว่าง 0.0 - "
+"1.0 โดยใช้ Hermite polynomials"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9348,56 +9085,57 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( สเกลาร์(edge), สเกลาร์(x) )\n"
+"\n"
+"คืนค่า 0.0 ถ้า x น้อยกว่า edge ถ้าไม่ใช่จะคืนค่า 1.0"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr ""
+msgstr "คืนค่า tan ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "คืนค่า tanh ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
-msgstr ""
+msgstr "หาค่าตัดหลักทศนิยม(truncated value) ของพารามิเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
-msgstr ""
+msgstr "บวกสเกลาร์ด้วยสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "หารสเกลาร์ด้วยสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "คูณสเกลาร์ด้วยสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr ""
+msgstr "คืนค่าเศษผลหารของสเกลาร์สองอัน"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
-msgstr ""
+msgstr "ลบสเกลาร์ด้วยสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar constant."
-msgstr "แก้ไขค่าคงที่สเกลาร์"
+msgstr "ค่าคงที่สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "แก้ไขสเกลาร์ Uniform"
+msgstr "ยูนิฟอร์มสเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
-msgstr ""
+msgstr "ทำการค้นหาเทกเจอร์ลูกบาศก์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr ""
+msgstr "ทำการค้นหาเทกเจอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9440,23 +9178,23 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr ""
+msgstr "คำนวณดีเทอร์มิแนนต์ของทรานฟอร์ม"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "คำนวณอินเวอร์สของทรานฟอร์ม"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr ""
+msgstr "คำนวณทรานสโพสของทรานฟอร์ม"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr ""
+msgstr "คูณทรานฟอร์มด้วยทรานฟอร์ม"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr ""
+msgstr "คูณเวกเตอร์ด้วยทรานฟอร์ม"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9469,34 +9207,32 @@ msgid "Transform uniform."
msgstr "ยกเลิกการเคลื่อนย้าย"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "ไปยังฟังก์ชัน..."
+msgstr "ฟังก์ชันเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector operator."
-msgstr "แก้ไขเครื่องหมายเวกเตอร์"
+msgstr "ตัวดำเนินการเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "สร้างเวกเตอร์จากสเกลาร์สามตัว"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "สร้างสเกลาร์สามตัวจากเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "หาผลคูณเชิงเวกเตอร์(cross product) ของเวกเตอร์สองตัว"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "คืนค่าระยะห่างระหว่างสองจุด"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "คำนวณผลคูณเชิงสเกลลาร์ (dot) ของเวกเตอร์สองตัว"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9508,27 +9244,27 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "หาขนาดเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "การประมาณค่าเชิงเส้นระหว่างสองเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors using scalar."
-msgstr ""
+msgstr "การประมาณค่าเชิงเส้นระหว่างสองเวกเตอร์โดยใช้สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
-msgstr ""
+msgstr "คำนวณหาเวกเตอร์หน่วยของเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - vector"
-msgstr ""
+msgstr "1.0 - เวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / vector"
-msgstr ""
+msgstr "1.0 / เวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9538,7 +9274,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
+msgstr "คืนค่าเวกเตอร์ที่มีทิศทางที่เกิดจากการหักเห"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9548,6 +9284,10 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( เวกเตอร์(edge0), เวกเตอร์(edge1), เวกเตอร์(x) ).\n"
+"\n"
+"คืนค่า 0.0 ถ้า 'x' น้อยกว่า 'edge0' และ 1.0 ถ้า 'x' มากกว่า 'edge1' "
+"นอกนั้นจะคืนค่าระหว่าง 0.0 กับ 1.0 โดยใช้สูตรพหุนามเฮอไมท์ (Hermite polynomials)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9557,6 +9297,10 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep function( สเกลาร์(edge0), สเกลาร์(edge1), เวกเตอร์(x) )\n"
+"\n"
+"คืนค่า 0.0 ถ้า 'x' น้อยกว่า 'edge0' และ 1.0 ถ้า 'x' มากกว่า 'edge1' "
+"นอกนั้นจะคืนค่าระหว่าง 0.0 กับ 1.0 โดยใช้สูตรพหุนามเฮอไมท์ (Hermite polynomials)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9564,6 +9308,9 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( เวกเตอร์(edge), เวกเตอร์(x) ).\n"
+"\n"
+"คืนค่า 0.0 ถ้า x น้อยกว่า edge ถ้าไม่ใช่ คืนค่า 1.0"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9571,36 +9318,37 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step function( สเกลาร์(edge), เวกเตอร์(x) ).\n"
+"\n"
+"คืนค่า 0.0 ถ้า 'x' น้อยกว่า 'edge' ถ้าไม่ใช่จะคืนค่า 1.0"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr ""
+msgstr "บวกเวกเตอร์ด้วยเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "หารเวกเตอร์ด้วยเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "คูณเวกเตอร์ด้วยเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr ""
+msgstr "คืนค่าเศษหารของเวกเตอร์สองเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
-msgstr ""
+msgstr "ลบเวกเตอร์ด้วยเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector constant."
-msgstr "แก้ไขค่าคงที่เวกเตอร์"
+msgstr "ค่าคงที่เวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector uniform."
-msgstr "แก้ไขเวกเตอร์ Uniform"
+msgstr "ยูนิฟอร์มเวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9625,11 +9373,11 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr ""
+msgstr "(โหมดแฟรกเมนต์/แสง เท่านั้น) ฟังก์ชันอนุพันธ์สเกลาร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
+msgstr "(โหมดแฟรกเมนต์/แสง เท่านั้น) ฟังก์ชันอนุพันธ์เวกเตอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9659,41 +9407,37 @@ msgstr ""
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
-msgstr ""
+msgstr "(โหมดแฟรกเมนต์/แสง เท่านั้น) (เวกเตอร์) ผลรวมของอนุพันธ์สัมบูรณ์ใน 'x' และ 'y'"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
-msgstr ""
+msgstr "(โหมดแฟรกเมนต์/แสง เท่านั้น) (สเกลาร์) ผลรวมของอนุพันธ์สัมบูรณ์ใน 'x' และ 'y'"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "เวอร์ชวลเชดเดอร์"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "แก้ไขตัวกรอง"
+msgstr "แก้ไขคุณสมบัติเวอร์ชวล"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Visual Shader Mode Changed"
-msgstr "จำนวนครั้งที่เปลี่ยน Shader"
+msgstr "เปลี่ยนโหมดเวอร์ชวลเชดเดอร์แล้ว"
#: editor/project_export.cpp
msgid "Runnable"
-msgstr "รันได้"
+msgstr "สามารถรันได้"
#: editor/project_export.cpp
-#, fuzzy
msgid "Add initial export..."
-msgstr "เพิ่มอินพุต"
+msgstr "เพิ่มการส่งออกเริ่มต้น..."
#: editor/project_export.cpp
msgid "Add previous patches..."
-msgstr ""
+msgstr "เพิ่มแพทช์ก่อนหน้า..."
#: editor/project_export.cpp
msgid "Delete patch '%s' from list?"
@@ -9717,19 +9461,16 @@ msgid ""
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Release"
-msgstr "เพิ่งปล่อย"
+msgstr "เผยแพร่"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "ส่งออกสำหรับ %s"
+msgstr "ส่งออกทั้งหมด"
#: editor/project_export.cpp
-#, fuzzy
msgid "The given export path doesn't exist:"
-msgstr "ไม่พบไฟล์"
+msgstr "ไม่พบที่อยู่ส่งออก:"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
@@ -9750,17 +9491,16 @@ msgid ""
msgstr ""
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path"
-msgstr "ส่งออกโปรเจกต์"
+msgstr "ไดเรกทอรีส่งออก"
#: editor/project_export.cpp
msgid "Resources"
-msgstr "รีซอร์ส"
+msgstr "ทรัพยากร"
#: editor/project_export.cpp
msgid "Export all resources in the project"
-msgstr "ส่งออกทุกรีซอร์สในโปรเจกต์"
+msgstr "ส่งออกทรัพยากรทั้งหมดในโปรเจกต์"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
@@ -9779,11 +9519,12 @@ msgid "Resources to export:"
msgstr "รีซอร์สที่จะส่งออก:"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
-msgstr "ตัวกรองไฟล์ที่จะส่งออกเพิ่มเติม (คั่นด้วยจุลภาค ตัวอย่างเช่น: *.json, *.txt)"
+msgstr ""
+"ตัวกรองไฟล์ที่จะส่งออกเพิ่มเติม\n"
+"(คั่นด้วยจุลภาค ตัวอย่างเช่น: *.json, *.txt, docs/)"
#: editor/project_export.cpp
#, fuzzy
@@ -9801,9 +9542,8 @@ msgid "Make Patch"
msgstr "สร้างแพตช์"
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " ไฟล์"
+msgstr "ไฟล์"
#: editor/project_export.cpp
msgid "Features"
@@ -9818,9 +9558,8 @@ msgid "Feature List:"
msgstr "รายชื่อฟีเจอร์:"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script"
-msgstr "สคริปต์ใหม่"
+msgstr "สคริปต์"
#: editor/project_export.cpp
msgid "Script Export Mode:"
@@ -9840,7 +9579,7 @@ msgstr "เข้ารหัส (ใส่คีย์ด้านล่าง)
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr ""
+msgstr "คีย์เข้ารหัสไม่ถูกต้อง (ต้องมี 64 อักษร)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
@@ -9855,23 +9594,20 @@ msgid "Export Project"
msgstr "ส่งออกโปรเจกต์"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "วิธีการส่งออก:"
+msgstr "ส่งออกโหมด?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "ส่งออก"
+msgstr "ส่งออกทั้งหมด"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " ไฟล์"
+msgstr "ไฟล์ ZIP"
#: editor/project_export.cpp
msgid "Godot Game Pack"
-msgstr ""
+msgstr "Godot เกมแพ็ค"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -9886,43 +9622,45 @@ msgid "Export With Debug"
msgstr "ส่งออกพร้อมการแก้ไขจุดบกพร่อง"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "ไม่พบไฟล์"
+msgid "The path specified doesn't exist."
+msgstr "ไม่พบที่อยู่ที่ระบุเอาไว้"
#: editor/project_manager.cpp
-#, fuzzy
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "กรุณาเลือกโฟลเดอร์ที่ไม่มีไฟล์ 'project.godot'"
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "ผิดพลาดขณะเปิดไฟล์แพคเกจ (ไม่ใช่ไฟล์นามสกุล zip)"
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "ไฟล์โปรเจกต์ \".zip\" ผิดพลาด เนื่องจากไม่มีไฟล์ \"project.godot\""
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "กรุณาเลือกโฟลเดอร์ว่างเปล่า"
#: editor/project_manager.cpp
-#, fuzzy
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "กรุณาเลือกไฟล์ 'project.godot'"
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "กรุณาเลือกไฟล์ \"project.godot\" หรือไฟล์ \".zip\""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr ""
+msgid "This directory already contains a Godot project."
+msgstr "ไดเรกทอรีนี้มีโปรเจกต์ Godot อยู่แล้ว"
#: editor/project_manager.cpp
msgid "New Game Project"
-msgstr "โปรเจกต์ใหม่"
+msgstr "โปรเจกต์เกมใหม่"
#: editor/project_manager.cpp
msgid "Imported Project"
msgstr "นำเข้าโปรเจกต์แล้ว"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "ชื่อโปรเจกต์:"
+msgstr "ชื่อโปรเจกต์ไม่ถูกต้อง"
#: editor/project_manager.cpp
msgid "Couldn't create folder."
-msgstr "ไม่สามารถสร้างโฟลเดอร์"
+msgstr "ไม่สามารถสร้างโฟลเดอร์ได้"
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
@@ -9988,17 +9726,16 @@ msgid "Project Path:"
msgstr "ที่อยู่โปรเจกต์:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "ที่อยู่โปรเจกต์:"
+msgstr "ที่อยู่ที่ใช้ติดตั้งโปรเจกต์:"
#: editor/project_manager.cpp
msgid "Renderer:"
-msgstr ""
+msgstr "ตัวเรนเดอร์:"
#: editor/project_manager.cpp
msgid "OpenGL ES 3.0"
-msgstr ""
+msgstr "OpenGL ES 3.0"
#: editor/project_manager.cpp
msgid ""
@@ -10007,10 +9744,14 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"การแสดงผลที่ดีกว่า\n"
+"คุณสมบัติที่มากกว่า\n"
+"ไม่รองรับฮาร์ดแวร์รุ่นเก่า\n"
+"ไม่เหมาะสำหรับเกมส์บนเว็บ"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
-msgstr ""
+msgstr "OpenGL ES 2.0"
#: editor/project_manager.cpp
msgid ""
@@ -10019,28 +9760,30 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"คุณภาพการแสดงผลน้อยกว่า\n"
+"ระบบที่น้อยกว่า\n"
+"ทำงานได้บนฮาร์ดแวร์ส่วนใหญ่\n"
+"เหมาะสำหรับสร้างเกมส์บนเว็บ"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
+msgstr "ตัวเรนเดอร์สามารถเปลี่ยนทีหลังได้ แต่ฉากจำเป็นต้องปรับแต่ง"
#: editor/project_manager.cpp
msgid "Unnamed Project"
msgstr "โปรเจกต์ไม่มีชื่อ"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "นำเข้าโปรเจกต์ที่มีอยู่เดิม"
+msgstr "โปรเจกต์หายไป"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr ""
+msgstr "Error:โปรเจกต์หายไปจากระบบไฟล์"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't open project at '%s'."
-msgstr "ไม่สามารถเปิดโปรเจกต์"
+msgstr "ไม่สามารถเปิดโปรเจกต์ที่ '%s'"
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -10076,6 +9819,7 @@ msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
+"การตั้งค่าโปรเจกต์ถูกสร้างโดยโดยเอนจิ้นรุ่นใหม่กว่า ซึ่งการตั้งค่านี้ไม่สามารถเข้ากันได้กับเอนจิ้นรุ่นนี้"
#: editor/project_manager.cpp
#, fuzzy
@@ -10096,9 +9840,8 @@ msgstr ""
"กรุณาเปิดแก้ไขโปรเจกต์เพื่อนำเข้าไฟล์"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Are you sure to run %d projects at once?"
-msgstr "ยืนยันการรันโปรเจกต์มากกว่า 1 โปรเจกต์?"
+msgstr "ยืนยันการรันโปรเจกต์ %d โปรเจกต์ทีเดียว?"
#: editor/project_manager.cpp
#, fuzzy
@@ -10115,40 +9858,41 @@ msgid ""
msgstr "ลบโปรเจกต์ออกจากรายชื่อ? (โฟลเดอร์จะไม่ถูกลบ)"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove all missing projects from the list?\n"
"The project folders' contents won't be modified."
-msgstr "ลบโปรเจกต์ออกจากรายชื่อ? (โฟลเดอร์จะไม่ถูกลบ)"
+msgstr ""
+"ลบโปรเจกต์ที่หายไปออกจากรายชื่อหรือไม่?\n"
+"เนื้อหาโฟลเดอร์โปรเจกต์จะไม่ถูกแก้ไข"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
"เปลี่ยนภาษาแล้ว\n"
-"การเปลี่ยนแปลงจะมีผลเมื่อเปิดโปรแกรมแก้ไขหรือตัวจัดการโปรเจกต์ใหม่"
+"การเปลี่ยนแปลงจะมีผลเมื่อเปิดเอดิเตอร์หรือตัวจัดการโปรเจกต์ใหม่"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
-msgstr "จะทำการสแกนหาโปรเจกต์ใน %s โฟลเดอร์ ยืนยัน?"
+msgstr ""
+"ทำการสแกนหาโปรเจกต์ ในโฟลเดอร์ %s หรือไม่?\n"
+"อาจจะใช้เวลาสักครู่"
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "ตัวจัดการโปรเจกต์"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
msgstr "โปรเจกต์"
#: editor/project_manager.cpp
msgid "Last Modified"
-msgstr ""
+msgstr "แก้ไขล่าสุด"
#: editor/project_manager.cpp
msgid "Scan"
@@ -10163,9 +9907,8 @@ msgid "New Project"
msgstr "โปรเจกต์ใหม่"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "ลบจุด"
+msgstr "ลบที่หายไป"
#: editor/project_manager.cpp
msgid "Templates"
@@ -10188,6 +9931,13 @@ msgstr ""
"คุณยังไม่มีโปรเจกต์ใด ๆ\n"
"ต้องการสำรวจโปรเจกต์ตัวอย่างในแหล่งรวมทรัพยากรหรือไม่?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "ปุ่ม "
@@ -10229,9 +9979,8 @@ msgid "Add Input Action Event"
msgstr "เพิ่มปุ่มกดของการกระทำ"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "อุปกรณ์"
+msgstr "อุปกรณ์ทั้งหมด"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -10276,14 +10025,12 @@ msgid "Wheel Right Button"
msgstr "เมาส์ขวา"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "ปุ่ม 6"
+msgstr "X ปุ่ม 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "ปุ่ม 6"
+msgstr "X ปุ่ม 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -10369,7 +10116,7 @@ msgstr "ผิดพลาดขณะบันทึกค่า"
#: editor/project_settings_editor.cpp
msgid "Settings saved OK."
-msgstr "บันทึกแล้ว"
+msgstr "บันทึกการตั้งค่าแล้ว"
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -10430,7 +10177,7 @@ msgstr "กำหนดเฉพาะ..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
-msgstr ""
+msgstr "ต้องเปิดเอดิเตอร์ใหม่เพื่อให้การเปลี่ยนแปลงมีผล"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -10441,9 +10188,8 @@ msgid "Action:"
msgstr "การกระทำ:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "การกระทำ:"
+msgstr "การกระทำ"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
@@ -10475,7 +10221,7 @@ msgstr "การแทนที่"
#: editor/project_settings_editor.cpp
msgid "Resources:"
-msgstr "รีซอร์ส:"
+msgstr "ทรัพยากร:"
#: editor/project_settings_editor.cpp
msgid "Remaps by Locale:"
@@ -10490,7 +10236,6 @@ msgid "Locales Filter"
msgstr "ตัวกรองภูมิภาค"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
msgstr "แสดงทุกภูมิภาค"
@@ -10537,7 +10282,7 @@ msgstr "ไฟล์..."
#: editor/property_editor.cpp
msgid "Dir..."
-msgstr "โฟลเดอร์..."
+msgstr "ไดเรกทอรี..."
#: editor/property_editor.cpp
msgid "Assign"
@@ -10577,45 +10322,52 @@ msgid "Batch Rename"
msgstr "เปลี่ยนชื่อ"
#: editor/rename_dialog.cpp
-msgid "Prefix"
-msgstr ""
+#, fuzzy
+msgid "Replace:"
+msgstr "แทนที่: "
#: editor/rename_dialog.cpp
-msgid "Suffix"
-msgstr ""
+#, fuzzy
+msgid "Prefix:"
+msgstr "คำนำหน้า"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Suffix:"
+msgstr "คำต่อท้าย"
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "แก้ไขสมการ"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
-msgstr "ตัวเลือกการจำกัด"
+msgstr "ตัวเลือกขั้นสูง"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "การแทนที่"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "ชื่อโหนด:"
+msgstr "ชื่อโหนด"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "ชื่อโหนดแม่ (ถ้ามี)"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "หาประเภทของโหนด"
+msgstr "ชนิดโหนด"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "ฉากปัจจุบัน"
+msgstr "ชื่อฉากปัจจุบัน"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "ชื่อโหนดราก:"
+msgstr "ชื่อโหนดแม่"
#: editor/rename_dialog.cpp
msgid ""
@@ -10624,21 +10376,20 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr ""
+msgid "Per-level Counter"
+msgstr "ตัวนับต่อเลเวล"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "ค่าเริ่มต้นในการนับ"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "ขนาด:"
+msgstr "ขั้น"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
@@ -10656,11 +10407,6 @@ msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
-msgid "Regular Expressions"
-msgstr "แก้ไขสมการ"
-
-#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
msgstr "สคริปต์หลังประมวลผล:"
@@ -10669,11 +10415,11 @@ msgid "Keep"
msgstr "เก็บ"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10681,20 +10427,27 @@ msgid "Case"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "ตัวพิมพ์เล็ก"
+msgstr "ไปตัวพิมพ์เล็ก"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "ตัวพิมพ์ใหญ่"
+msgstr "ไปตัวพิมพ์ใหญ่"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Reset"
msgstr "รีเซ็ตซูม"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "แก้ไขสมการ"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "ตัวอักษรที่ใช้ได้ %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "หาโหนดแม่ใหม่"
@@ -10750,17 +10503,17 @@ msgid "Instance Scene(s)"
msgstr "อินสแตนซ์ฉาก"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Replace with Branch Scene"
-msgstr "บันทึกกิ่งเป็นฉาก"
+msgstr "แทนที่ด้วยฉากย่อย"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
msgstr "อินสแตนซ์ฉากลูก"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "ลบสคริปต์"
+#, fuzzy
+msgid "Detach Script"
+msgstr "แนบสคริปต์"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10791,32 +10544,33 @@ msgid "Instantiated scenes can't become root"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "เข้าใจ!"
+msgstr "ทำโหนดให้เป็นโหนดแม่"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "ลบโหนด \"%s\" และโหนดลูก?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "ลบโหนด"
+msgstr "ลบโหนด %d ?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete the root node \"%s\"?"
-msgstr "ลบโหนด"
+msgstr "ลบโหนดแม่ \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "ลบโหนด \"%s\" และโหนดลูก?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "ลบโหนด"
+msgstr "ลบโหนด \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
-msgstr "ทำกับโหนดรากไม่ได้"
+msgstr "ไม่สามารถกระทำกับโหนดแม่ได้"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
@@ -10844,34 +10598,28 @@ msgid "Make Local"
msgstr "ระยะใกล้"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "เข้าใจ!"
+msgstr "ฉากแม่ใหม่"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "สร้างโหนด"
+msgstr "สร้างโหนดแม่:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "ฉาก"
+msgstr "ฉาก 2D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "ฉาก"
+msgstr "ฉาก 3D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "ลบการสืบทอด"
+msgstr "อินเตอร์เฟส"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "ลบโหนด"
+msgstr "โหนดอื่นๆ"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -10883,16 +10631,15 @@ msgstr "ทำกับโหนดที่ฉากปัจจุบันส
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr "เชื่อมสคริปต์"
+msgstr "แนบสคริปต์"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
msgstr "ลบโหนด"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Change type of node(s)"
-msgstr "เปลี่ยนชื่ออินพุต"
+msgstr "เปลี่ยนชนิดของโหนด"
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10925,32 +10672,35 @@ msgid "Load As Placeholder"
msgstr "โหลดเป็นตัวแทน"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
msgstr "เปิดคู่มือ"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "เพิ่มโหนดลูก"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "ยุบโฟลเดอร์"
+msgstr "ขยาย/ยุบทั้งหมด"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
-msgstr "เปลี่ยนประเภท"
+msgstr "เปลี่ยนชนิด"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
msgstr "หาโหนดแม่ใหม่"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "เข้าใจ!"
+msgstr "ตั้งเป็นฉากแม่"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10969,7 +10719,6 @@ msgid "Delete (No Confirm)"
msgstr "ลบ (ไม่ยืนยัน)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
msgstr "เพิ่ม/สร้างโหนดใหม่"
@@ -10980,11 +10729,13 @@ msgid ""
msgstr "อินสแตนซ์ฉากเป็นโหนด สร้างฉากสืบทอดถ้าไม่มีโหนดราก"
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "เชื่อมสคริปต์ใหม่หรือที่มีอยู่เดิมให้กับโหนดที่เลือก"
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
+msgstr "สร้างสคริปต์ให้โหนดที่เลือก"
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+#, fuzzy
+msgid "Detach the script from the selected node."
msgstr "ลบสคริปต์ของโหนดที่เลือก"
#: editor/scene_tree_dock.cpp
@@ -11005,9 +10756,8 @@ msgid "Toggle Visible"
msgstr "ซ่อน/แสดง"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "เลือกโหนด"
+msgstr "ปลดล็อคโหนด"
#: editor/scene_tree_editor.cpp
#, fuzzy
@@ -11015,9 +10765,8 @@ msgid "Button Group"
msgstr "ปุ่ม 7"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "เชื่อมต่อผิดพลาด"
+msgstr "(เชื่อมต่อจาก)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
@@ -11051,12 +10800,10 @@ msgstr ""
"คลิกเพื่อแสดงแผงกลุ่ม"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "เปิดสคริปต์"
+msgstr "เปิดสคริปต์:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
@@ -11082,6 +10829,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"ปักหมุด AnimationPlayer แล้ว\n"
+"คลิกเพื่อเลิกปักหมุด"
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -11104,14 +10853,12 @@ msgid "Select a Node"
msgstr "เลือกโหนด"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "ตำแหน่งที่อยู่ว่างเปล่า"
+msgstr "ที่อยู่ว่างเปล่า"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "ตำแหน่งบันทึกว่างเปล่า!"
+msgstr "ชื่อไฟล์ว่างเปล่า"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11124,9 +10871,12 @@ msgid "Invalid base path."
msgstr "ตำแหน่งเริ่มต้นไม่ถูกต้อง"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "มีโฟลเดอร์ชื่อนี้อยู่แล้ว"
+msgstr "มีไดเรกทอรีชื่อนี้อยู่แล้ว"
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "ไม่พบไฟล์"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11151,21 +10901,18 @@ msgid "Error loading script from %s"
msgstr "ผิดพลาดขณะโหลดสคริปต์จาก %s"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Overrides"
-msgstr "กำหนดเฉพาะ..."
+msgstr "แทนที่"
#: editor/script_create_dialog.cpp
msgid "N/A"
msgstr "ไม่มี"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "เปิดตัวแก้ไขสคริปต์"
+msgstr "เปิดสคริปต์ / เลือกที่อยู่"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "เปิดสคริปต์"
@@ -11175,19 +10922,20 @@ msgid "File exists, it will be reused."
msgstr "มีไฟล์นี้อยู่แล้ว จะนำมาใช้"
#: editor/script_create_dialog.cpp
-#, fuzzy
+msgid "Invalid path."
+msgstr "ตำแหน่งผิดพลาด"
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "ชื่อคลาสไม่ถูกต้อง"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid inherited parent name or path."
msgstr "ชื่อหรือตำแหน่งทีสืบทอดไม่ถูกต้อง"
#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Script is valid."
-msgstr "สคริปต์ถูกต้อง"
+msgid "Script path/name is valid."
+msgstr "ที่อยู่/ชื่อของสคริปต์ถูกต้อง"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11200,29 +10948,30 @@ msgid "Built-in script (into scene file)."
msgstr "ฝังสคริปต์ในไฟล์ฉาก"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "สร้างสคริปต์ใหม่"
+msgstr "จะทำการสร้างสคริปต์ใหม่"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "โหลดสคริปต์จากดิสก์"
+msgstr "จะทำการโหลดไฟล์สคริปต์ที่มีอยู่"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "มีการกระทำ '%s' อยู่แล้ว!"
+msgstr "ไฟล์สคริปต์มีอยู่แล้ว"
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name:"
-msgstr "ชื่อคลาส"
+msgstr "ชื่อคลาส:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "แม่แบบ"
+msgstr "แม่แบบ:"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -11242,38 +10991,32 @@ msgid "Bytes:"
msgstr "ไบต์:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Warning:"
-msgstr "คำเตือน"
+msgstr "คำเตือน:"
#: editor/script_editor_debugger.cpp
msgid "Error:"
msgstr "ผิดพลาด:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error"
-msgstr "คัดลอกผิดพลาด"
+msgstr "C++ ผิดพลาด"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error:"
-msgstr "ผิดพลาด:"
+msgstr "C++ ผิดพลาด:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source"
-msgstr "ต้นฉบับ:"
+msgstr "C++ ต้นฉบับ"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
msgstr "ต้นฉบับ:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "ต้นฉบับ:"
+msgstr "C++ ต้นฉบับ:"
#: editor/script_editor_debugger.cpp
#, fuzzy
@@ -11295,8 +11038,12 @@ msgstr "คัดลอกผิดพลาด"
#: editor/script_editor_debugger.cpp
#, fuzzy
+msgid "Video RAM"
+msgstr "หน่วยความจำวีดีโอ"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
-msgstr "ลบจุด"
+msgstr "ข้ามเบรกพอยต์"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -11312,7 +11059,7 @@ msgstr "สแตค"
#: editor/script_editor_debugger.cpp
msgid "Profiler"
-msgstr "ประสิทธิภาพ"
+msgstr "ตัวตรวจวิเคราะห์ประสิทธิภาพ (Profiler)"
#: editor/script_editor_debugger.cpp
#, fuzzy
@@ -11344,8 +11091,9 @@ msgid "Total:"
msgstr "ทั้งหมด:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "หน่วยความจำวีดีโอ"
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "ส่งออกโปรไฟล์"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11353,7 +11101,7 @@ msgstr "ตำแหน่งรีซอร์ส"
#: editor/script_editor_debugger.cpp
msgid "Type"
-msgstr "ประเภท"
+msgstr "ชนิด"
#: editor/script_editor_debugger.cpp
msgid "Format"
@@ -11361,7 +11109,7 @@ msgstr "รูปแบบ"
#: editor/script_editor_debugger.cpp
msgid "Usage"
-msgstr "ใช้"
+msgstr "การใช้"
#: editor/script_editor_debugger.cpp
msgid "Misc"
@@ -11385,26 +11133,23 @@ msgstr "กำหนดจากผัง"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "ส่งออกค่าเป็น CSV"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Erase Shortcut"
-msgstr "ออกนุ่มนวล"
+msgstr "ลบทางลัด"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Restore Shortcut"
-msgstr "ทางลัด"
+msgstr "คืนค่าทางลัด"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Change Shortcut"
-msgstr "แก้ไขการตรึง"
+msgstr "แก้ไขทางลัด"
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
-msgstr "ตัวเลือกโปรแกรมสร้างเกม"
+msgstr "ตั้งค่าเอดิเตอร์"
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
@@ -11424,11 +11169,11 @@ msgstr "แก้ไของศาการเปล่งเสียงขอ
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
-msgstr "ปรับขอบเขตการมองเห็นของกล้อง"
+msgstr "ปรับกล้อง FOV"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera Size"
-msgstr "ปรับขนาดกล้อง"
+msgstr "เปลี่ยนขนาดกล้อง"
#: editor/spatial_editor_gizmos.cpp
#, fuzzy
@@ -11460,7 +11205,6 @@ msgid "Change Capsule Shape Height"
msgstr "ปรับความสูงทรงแคปซูล"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
msgstr "ปรับรัศมีทรงแคปซูล"
@@ -11474,14 +11218,12 @@ msgid "Change Ray Shape Length"
msgstr "ปรับความยาวรังสี"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "ปรับรัศมีแสง"
+msgstr "ปรับรัศมีทรงกระบอก"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "ปรับความสูงทรงแคปซูล"
+msgstr "ปรับความสูงทรงกระบอก"
#: modules/csg/csg_gizmos.cpp
#, fuzzy
@@ -11531,12 +11273,11 @@ msgstr "GDNativeLibrary"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Enabled GDNative Singleton"
-msgstr ""
+msgstr "เปิดการทำงานซิงเกิลตัน GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "ปิดการอัพเดทตัวหมุน"
+msgstr "ปิดการทำงานซิงเกิลตัน GDNative"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
@@ -11551,9 +11292,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Step argument is zero!"
-msgstr "ตัวแปร step เป็นศูนย์!"
+msgstr "ช่วงอากิวเมนต์เป็นศูนย์!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -11581,7 +11321,7 @@ msgstr "รูปแบบดิกชันนารีที่เก็บอ
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary (invalid subclasses)"
-msgstr "ดิกชันนารีที่เก็บอินสแตนซ์ผิดพลาด (คลาสย่อยผิดพลาด)"
+msgstr "ดิกชันนารีอินสแตนซ์ผิดพลาด (คลาสย่อยผิดพลาด)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
@@ -11690,18 +11430,16 @@ msgid "Cursor Clear Rotation"
msgstr "เคอร์เซอร์ลบการหมุน"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "ลบที่เลือก"
+msgstr "วางที่เลือก"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
msgstr "ลบที่เลือก"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "เลือกทั้งหมด"
+msgstr "เติมส่วนที่เลือก"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -11742,7 +11480,7 @@ msgstr "กำลังจัดการโครงร่าง..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Calculating grid size..."
-msgstr "กำลังคำนวณขนาดตาราง..."
+msgstr "กำลังคำนวณขนาดกริด..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Creating heightfield..."
@@ -11840,42 +11578,36 @@ msgid "Set Variable Type"
msgstr "แก้ไขประเภทตัวแปร"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "เพิ่มอินพุต"
+msgstr "เพิ่มพอร์ตอินพุต"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "เพิ่มอินพุต"
+msgstr "เพิ่มพอร์ตเอาท์พุต"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Override an existing built-in function."
-msgstr "ชื่อผิดพลาด ต้องไม่ใช้ชื่อเดียวกับชนิดตัวแปร"
+msgstr "เขียนทับฟังก์ชันบิวท์อินที่มีอยู่"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "สร้าง %s ใหม่"
+msgstr "สร้างฟังก์ชันใหม่"
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "ตัวแปร:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "สร้าง %s ใหม่"
+msgstr "สร้างตัวแปรใหม่"
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr "สัญญาณ:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "สร้างรูปหลายเหลี่ยมจากความว่างเปล่า"
+msgstr "สร้างสัญญาณใหม่"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
@@ -11902,9 +11634,8 @@ msgid "Add Function"
msgstr "เพิ่มฟังก์ชัน"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
-msgstr "ลบจุด"
+msgstr "ลบพอร์ตอินพุต"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
@@ -11915,14 +11646,12 @@ msgid "Add Signal"
msgstr "เพิ่มสัญญาณ"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "ลบจุด"
+msgstr "ลบพอร์ตอินพุต"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "ลบจุด"
+msgstr "ลบพอร์ตเอาต์พุต"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
@@ -11930,11 +11659,11 @@ msgstr "แก้ไขสมการ"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr "ลบโหนด"
+msgstr "ลบโหนด VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr "ทำซ้ำโหนด"
+msgstr "ทำซ้ำโหนด VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
@@ -11992,26 +11721,23 @@ msgstr "ย้ายโหนด"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
-msgstr "ลบโหนด"
+msgstr "ลบโหนด VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Nodes"
msgstr "เชื่อมโหนด"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
msgstr "ตัดการเชื่อมต่อโหนด"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "เชื่อมโหนด"
+msgstr "เชื่อมต่อข้อมูลโหนด"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "เชื่อมโหนด"
+msgstr "เชื่อมต่อกับลำดับของโหนด"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -12022,9 +11748,8 @@ msgid "Change Input Value"
msgstr "แก้ไขค่าอินพุต"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "แก้ไข CanvasItem"
+msgstr "แก้ขนาดคอมเม้นต์"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
@@ -12036,12 +11761,11 @@ msgstr "คลิปบอร์ดว่างเปล่า!"
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste VisualScript Nodes"
-msgstr "วางโหนด"
+msgstr "วางโหนด VisualScript"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Can't create function with a function node."
-msgstr "คัดลอกโหนดฟังก์ชันไม่ได้"
+msgstr "ไม่สามารถสร้างฟังก์ชันได้จากโหนดฟังก์ชัน"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
@@ -12056,9 +11780,8 @@ msgid "Try to only have one sequence input in selection."
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "เปลี่ยนชื่อฟังก์ชัน"
+msgstr "สร้างฟังก์ชัน"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
@@ -12081,33 +11804,28 @@ msgid "Editing Signal:"
msgstr "แก้ไขสัญญาณ:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Tool:"
-msgstr "ระยะใกล้"
+msgstr "เครื่องมือสร้าง:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
-msgstr "ตัวแปร:"
+msgstr "สมาชิก:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "เปลี่ยนประเภท"
+msgstr "เปลี่ยนประเภทฐาน:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "เพิ่มโหนด"
+msgstr "เพิ่มโหนด..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "เพิ่มฟังก์ชัน"
+msgstr "เพิ่มฟังก์ชัน..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "ฟังก์ชัน:"
+msgstr "ชื่อฟังก์ชั่น"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -12131,19 +11849,16 @@ msgid "Cut Nodes"
msgstr "ตัดโหนด"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "เปลี่ยนชื่อฟังก์ชัน"
+msgstr "สร้างฟังก์ชัน"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "รีเฟรช"
+msgstr "รีเฟรชกราฟ"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "ตัวแปร"
+msgstr "แก้ไขสมาชิก"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -12200,41 +11915,40 @@ msgid ""
msgstr "ค่าคืนจาก _step() ผิดพลาด ต้องเป็นจำนวนเต็ม (ลำดับ) หรือสตริง (ข้อผิดพลาด)"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "ลบโหนด"
+msgstr "ค้นหาโหนด VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "รับ %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
-msgstr ""
+msgstr "ตั้ง %s"
#: platform/android/export/export.cpp
msgid "Package name is missing."
-msgstr ""
+msgstr "ชื่อแพ็คเกจหายไป"
#: platform/android/export/export.cpp
msgid "Package segments must be of non-zero length."
-msgstr ""
+msgstr "ส่วนของแพ็คเกจจะต้องมีความยาวไม่เป็นศูนย์"
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
+msgstr "ตัวอักษร '%s' ไม่อนุญาตให้ใช้ในชื่อของ Android application package"
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
-msgstr ""
+msgstr "ไม่สามารถใช้ตัวเลขเป็นตัวแรกในส่วนของแพ็คเกจ"
#: platform/android/export/export.cpp
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
+msgstr "ตัวอักษร '%s' ไม่สามารถเป็นตัวอักษรตัวแรกในส่วนของแพ็คเกจ"
#: platform/android/export/export.cpp
msgid "The package must have at least one '.' separator."
-msgstr ""
+msgstr "แพ็คเกจจำเป็นต้องมี '.' อย่างน้อยหนึ่งตัว"
#: platform/android/export/export.cpp
msgid "Select device from the list"
@@ -12242,17 +11956,21 @@ msgstr "เลือกอุปกรณ์จากรายชื่อ"
#: platform/android/export/export.cpp
msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
+msgstr "ADB executable ยังไม่ได้กำหนดค่าในตั้งค่าเอดิเตอร์"
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr ""
+msgstr "OpenJDK jarsigner ยังไม่ได้กำหนดค่าในตั้งค่าเอดิเตอร์"
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12271,9 +11989,34 @@ msgid "Invalid public key for APK expansion."
msgstr ""
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "ชื่อคลาสไม่ถูกต้อง"
+msgstr "ชื่อแพ็คเกจผิดพลาด:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
#: platform/android/export/export.cpp
msgid ""
@@ -12291,7 +12034,7 @@ msgstr ""
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "กำลังสร้างโปรเจคแอนดรอยด์ (gradle)"
#: platform/android/export/export.cpp
msgid ""
@@ -12314,7 +12057,7 @@ msgstr "ไม่สามารถใช้ชื่อนี้ได้:"
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
-msgstr ""
+msgstr "App Store Team ID ยังไม่ได้ระบุ - ไม่สามารถกำหนดค่าให้โปรเจกต์ได้"
#: platform/iphone/export/export.cpp
#, fuzzy
@@ -12327,7 +12070,7 @@ msgstr ""
#: platform/javascript/export/export.cpp
msgid "Stop HTTP Server"
-msgstr ""
+msgstr "หยุดเซิฟเวอร์ HTTP"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -12372,9 +12115,8 @@ msgid "Invalid package unique name."
msgstr "ชื่อเฉพาะไม่ถูกต้อง"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "ชื่อเฉพาะไม่ถูกต้อง"
+msgstr "ชื่อแสดงผู้จัดจำหน่ายแพคเกจไม่ถูกต้อง"
#: platform/uwp/export/export.cpp
msgid "Invalid product GUID."
@@ -12428,7 +12170,7 @@ msgid ""
"Only one visible CanvasModulate is allowed per scene (or set of instanced "
"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
-"จะมี CanvasModulate ที่มองเห็นได้เพียงโหนดเดียวในฉาก (หรือกลุ่มของฉากที่เป็นอินสแตนซ์) "
+"จะมี CanvasModulate ที่มองเห็นได้ เพียงโหนดเดียวในฉาก (หรือกลุ่มของฉากที่เป็นอินสแตนซ์) "
"โหนดแรกเท่านั้นที่จะทำงานได้ปกติ ที่เหลือจะไม่ทำงาน"
#: scene/2d/collision_object_2d.cpp
@@ -12471,6 +12213,12 @@ msgid ""
"shape resource for it!"
msgstr "ต้องมีรูปทรงเพื่อให้ CollisionShape2D ทำงานได้ กรุณาสร้างรูปทรง!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12507,7 +12255,7 @@ msgid ""
"node. It only provides navigation data."
msgstr ""
"NavigationPolygonInstance ต้องเป็นโหนดลูก/หลานของโหนด Navigation2D "
-"เนื่องจากโหนดนี้ใช้เก็บข้อมูลการนำทางเท่านั้น"
+"โดยจะให้ข้อมูลการนำทางเท่านั้น"
#: scene/2d/parallax_layer.cpp
msgid ""
@@ -12556,7 +12304,7 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr ""
+msgstr "Bone2D สามารถทำงานได้กับ Skeleton2D หรือ Bone2D ตัวอื่นโดยเป็นโหนดแม่"
#: scene/2d/skeleton_2d.cpp
msgid ""
@@ -12599,9 +12347,8 @@ msgid ""
msgstr "Controller id ต้องไม่เป็น 0 ไม่เช่นนั้นตัวควบคุมนี้จะไม่เชื่อมกับอุปกรณ์จริง"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ARVRAnchor ต้องมี ARVROrigin เป็นโหนดแม่"
+msgstr "ARVRAnchor ต้องมีโหนด ARVROrigin เป็นโหนดแม่"
#: scene/3d/arvr_nodes.cpp
#, fuzzy
@@ -12611,9 +12358,8 @@ msgid ""
msgstr "Anchor id ต้องไม่เป็น 0 ไม่เช่นนั้น anchor นี้จะไม่เชื่อมกับ anchor จริง"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROrigin ต้องมี ARVRCamera เป็นโหนดลูก"
+msgstr "ARVROrigin จำเป็นต้องมี ARVRCamera เป็นโหนดลูก"
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
@@ -12684,6 +12430,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
#, fuzzy
msgid "Nothing is visible because no mesh has been assigned."
@@ -12704,6 +12455,13 @@ msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
+"ไดรเวอร์วีดีโอ GLES2 ไม่สนับสนุน GIProbe\n"
+"ใช้ BakedLightmap แทน"
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
@@ -12719,7 +12477,7 @@ msgid ""
"It only provides navigation data."
msgstr ""
"NavigationMeshInstance ต้องเป็นโหนดลูก/หลานของโหนด Navigation "
-"โหนดนี้ใช้เพื่อเป็นข้อมูลในการนำทางเท่านั้น"
+"โดยจะให้ข้อมูลการนำทางเท่านั้น"
#: scene/3d/particles.cpp
msgid ""
@@ -12802,7 +12560,7 @@ msgstr ""
#: scene/3d/world_environment.cpp
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
-msgstr "จะมี WorldEnvironment ได้เพียงโหนดเดียวในฉาก (หรือกลุ่มของฉากที่เป็นอินสแตนซ์)"
+msgstr "จะมี WorldEnvironment ได้เพียงอันเดียวในฉาก (หรือกลุ่มของฉากที่เป็นอินสแตนซ์)"
#: scene/3d/world_environment.cpp
msgid ""
@@ -12815,23 +12573,20 @@ msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "เครื่องมือแอนิเมชัน"
+msgstr "ไม่พบแอนิเมชัน: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ผิดพลาด: ชื่อแอนิเมชันไม่ถูกต้อง!"
+msgstr "แอนิเมชันผิดพลาด: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "ลบการเชื่อมโยง '%s' กับ '%s'"
+msgstr "ไม่มีการเชื่อมต่อไปที่อินพุต '%s' ของโหนด '%s'."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
@@ -12861,6 +12616,9 @@ msgid ""
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"สี: #%s\n"
+"คลิกซ้าย: เลือกสี\n"
+"คลิกขวา: ลบสี"
#: scene/gui/color_picker.cpp
msgid "Pick a color from the editor window."
@@ -12868,11 +12626,11 @@ msgstr ""
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
msgid "Raw"
-msgstr ""
+msgstr "Raw"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
@@ -12952,6 +12710,10 @@ msgstr ""
"ให้แก้ไขโหนดนี้ให้เป็นโหนดลูกของ Control แต่ถ้าไม่ ให้ปรับเป็น render target และนำไปใช้เป็น "
"texture ของโหนดอื่น"
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
@@ -12981,7 +12743,50 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "ค่าคงที่ไม่สามารถแก้ไขได้"
+
+#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "ระบบไฟล์ และ นำเข้า"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "เมื่อส่งออก โปรแกรมจะพยายามเชื่อมต่อมายังคอมพิวเตอร์เครื่องนี้เพื่อทำการแก้ไขจุดบกพร่อง"
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "ฉากปัจจุบันยังไม่ได้บันทึก กรุณาบันทึกก่อนเริ่มโปรแกรม"
+
+#~ msgid "Not in resource path."
+#~ msgstr "ไม่อยู่ในโฟลเดอร์รีซอร์ส"
+
+#~ msgid "Revert"
+#~ msgstr "คืนกลับ"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "การคืนกลับไม่สามารถยกเลิกได้ คืนกลับ?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "คืนกลับฉาก"
+
+#~ msgid "Clear Script"
+#~ msgstr "ลบสคริปต์"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "ติดตามปัญหา"
+
+#~ msgid "Request Docs"
+#~ msgstr "ร้องขอคู่มือ"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "ช่วยพัฒนาคู่มือโดยการให้ข้อเสนอแนะ"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "แทนที่แล้ว %d ครั้ง"
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "สร้าง StaticBody ทรงตัน"
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
diff --git a/editor/translations/tr.po b/editor/translations/tr.po
index 192364f0c6..c443d7bb94 100644
--- a/editor/translations/tr.po
+++ b/editor/translations/tr.po
@@ -41,12 +41,24 @@
# isimsiz <isimsiz@mailinator.com>, 2019.
# Muhammet Mustafa Tozlu <m.mustafatozlu@gmail.com>, 2019.
# HALİL ATAŞ <halillatass@gmail.com>, 2019.
+# Zsosu Ktosu <zktosu@gmail.com>, 2020.
+# Mesut Aslan <kontinyu@gmail.com>, 2020.
+# Kaan Genç <kaan@kaangenc.me>, 2020.
+# Anonymous <noreply@weblate.org>, 2020.
+# Güneş Gümüş <gunes.gumus.001@gmail.com>, 2020.
+# Oğuz Ersen <oguzersen@protonmail.com>, 2020.
+# Vedat Günel <gunel15@itu.edu.tr>, 2020.
+# Ahmet Elgün <ahmetelgn@gmail.com>, 2020.
+# Efruz Yıldırır <efruzyildirir@gmail.com>, 2020.
+# Hazar <duurkak@yandex.com>, 2020.
+# Mutlu ORAN <mutlu.oran66@gmail.com>, 2020.
+# Yusuf Osman YILMAZ <wolfkan4219@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-11-20 14:07+0000\n"
-"Last-Translator: HALİL ATAŞ <halillatass@gmail.com>\n"
+"PO-Revision-Date: 2020-09-15 07:17+0000\n"
+"Last-Translator: Yusuf Osman YILMAZ <wolfkan4219@gmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/"
"godot/tr/>\n"
"Language: tr\n"
@@ -54,24 +66,22 @@ 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 3.10-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
-"\"convert ()\" için geçersiz tür bağımsız değişkeni, \"TYPE_ *\" sabitlerini "
-"kullanın."
+msgstr "convert() için geçersiz türde argüman, TYPE_* sabitlerini kullanın."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "1 uzunluğunda bir metin (bir karakter) bekleniyor."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Byte kodu çözmek için yetersiz byte, ya da geçersiz format."
+msgstr "Baytları çözümlemek için yetersiz miktarda bayt ya da geçersiz format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -131,7 +141,7 @@ msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "Ücretsiz"
+msgstr "Serbest"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -351,7 +361,7 @@ msgstr "Döngü Aradeğerlemesin Sar"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Yeni Anahtar"
+msgstr "Anahtar Ekle"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
@@ -458,7 +468,7 @@ msgstr "Bir kök olmadan yeni bir iz eklemek mümkün değildir"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Geçersiz Bezier eğrisi izi (uygun alt-nitelik yok)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
@@ -490,7 +500,7 @@ msgstr "Yöntem İz Anahtarı Ekle"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr "Yöntem, nesne içinde bulunamadı "
+msgstr "Metot, nesne içinde bulunamadı: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
@@ -529,12 +539,12 @@ msgstr ""
"Bu animasyon içe aktarılmış bir sahneye ait, bu yüzden içe aktarılan "
"parçalara yapılan değişiklikler kaydedilmeyecek.\n"
"\n"
-"Özel parça ekleme özelliğini aktif etmek için, sahnenin içe aktarma "
-"ayarlarına gidin ve \"Animasyon > Depolama\" ayarını \"Dosyalama\" olarak "
-"ayarlayın, \"Animasyon > Özel Parçaları Sakla\"ayarını aktif edin ve sonra "
-"tekrar içe aktarın.\n"
-"Alternatif olarak, animasyonları ayrı dosyalara aktaran bir içe aktarma "
-"hazır ayarı kullanabilirsiniz."
+"Özel parça ekleme özelliğini etkinleştirmek için, sahnenin içe aktarma "
+"ayarlarına gidin ve \"Animasyon > Depolama\"\n"
+"ayarını \"Dosyalama\" olarak ayarlayın, \"Animasyon > Özel Parçaları Sakla\" "
+"ayarını etkinleştirin ve sonra tekrar içe aktarın.\n"
+"Alternatif olarak, animasyonları ayrı dosyalara aktaran bir içe aktarma ön "
+"ayarı kullanabilirsiniz."
#: editor/animation_track_editor.cpp
msgid "Warning: Editing imported animation"
@@ -542,7 +552,8 @@ msgstr "Uyarı: İçe aktarılan animasyonu düzenleme"
#: editor/animation_track_editor.cpp
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr "Animasyonları düzenleyebilmek için Animasyon Oynatıcı düğümü seçin."
+msgstr ""
+"Animasyonları oluşturup düzenlemek için Animasyon Oynatıcı düğümü seçin."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -565,6 +576,7 @@ msgid "Seconds"
msgstr "Saniye"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -648,7 +660,7 @@ msgstr "Maks. Eniyileştirilebilir Açı:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
-msgstr "Eniyileştir"
+msgstr "İyileştir"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
@@ -724,8 +736,8 @@ msgid "Line Number:"
msgstr "Satır Numarası:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Değiştirildi %d oluş(sn)."
+msgid "%d replaced."
+msgstr "%d değiştirildi."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -743,7 +755,7 @@ msgstr "Büyük/Küçük Harf Eşleştir"
msgid "Whole Words"
msgstr "Tam Kelimeler"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Değiştir"
@@ -793,6 +805,10 @@ msgid "Method in target node must be specified."
msgstr "Hedef düğümdeki metod tanımlanmalı."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Metod ismi geçerli bir tanımlayıcı değil."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -842,9 +858,8 @@ msgid "Extra Call Arguments:"
msgstr "Ekstra Çağrı Argümanları:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "Metot Seç"
+msgstr "Alıcı Metodu:"
#: editor/connections_dialog.cpp
msgid "Advanced"
@@ -857,7 +872,7 @@ msgstr "Ertelenmiş"
#: editor/connections_dialog.cpp
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr "Sinyali savunur, sıraya kaydeder ve sadece rölantide iken ateşler."
+msgstr "Sinyali erteler, sıraya kaydeder ve sadece işlemci boşta iken ateşler."
#: editor/connections_dialog.cpp
msgid "Oneshot"
@@ -875,7 +890,6 @@ msgstr "Sinyale bağlanamıyor"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -896,7 +910,7 @@ msgstr "Sinyal:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr "Bunu '%s' şuna '%s' bağla"
+msgstr "'%s' sinyalini '%s' yöntemine bağla"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
@@ -933,6 +947,11 @@ msgid "Signals"
msgstr "Sinyaller"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Döşemelerde Bul"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Bu sinyalden, tüm bağlantıları kaldırmak istediğinizden emin misiniz?"
@@ -942,7 +961,7 @@ msgstr "Tüm Bağlantıları Kes"
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr "Düzenle"
+msgstr "Düzenle..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
@@ -970,7 +989,7 @@ msgid "Recent:"
msgstr "Yakın zamanda:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Ara:"
@@ -1150,6 +1169,9 @@ msgstr "Projenin Kurucuları"
msgid "Lead Developer"
msgstr "Baş Geliştirici"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Proje Yöneticisi "
@@ -1171,6 +1193,16 @@ msgid "Gold Sponsors"
msgstr "Altın Sponsorlar"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Gümüş Bağışçılar"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Bronz Bağışçılar"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Mini Sponsorlar"
@@ -1213,7 +1245,7 @@ msgstr ""
#: editor/editor_about.cpp
msgid "All Components"
-msgstr "Tüm Bileşenler"
+msgstr "Tüm Bileşenler"
#: editor/editor_about.cpp
msgid "Components"
@@ -1228,9 +1260,8 @@ msgid "Error opening package file, not in ZIP format."
msgstr "Paket dosyası açılırken hata oluştu, zip formatında değil."
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "Zaten mevcut"
+msgstr "%s (Zaten Var)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1241,9 +1272,8 @@ msgid "The following files failed extraction from package:"
msgstr "Aşağıdaki dosyaların, çıkından ayıklanma işlemi başarısız oldu:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "%d daha fazla dosyalar"
+msgstr "Ve %s kadar dosya daha."
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Package installed successfully!"
@@ -1255,9 +1285,8 @@ msgid "Success!"
msgstr "Başarılı!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "İçerikler:"
+msgstr "Paket İçerikleri:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
@@ -1397,9 +1426,8 @@ msgid "Invalid file, not an audio bus layout."
msgstr "Geçersiz dosya, bu bir audio bus yerleşim düzeni değil."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "Dosya kaydedilirken hata!"
+msgstr "%s dosyası kaydedilirken hata"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
@@ -1445,7 +1473,7 @@ msgstr "Geçersiz ad."
#: editor/editor_autoload_settings.cpp
msgid "Valid characters:"
-msgstr "Geçerli damgalar:"
+msgstr "Geçerli karakterler:"
#: editor/editor_autoload_settings.cpp
msgid "Must not collide with an existing engine class name."
@@ -1483,7 +1511,7 @@ msgstr "KendindenYüklenme'yi Taşı"
msgid "Remove Autoload"
msgstr "KendindenYüklenme'yi Kaldır"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Etkin"
@@ -1491,17 +1519,9 @@ msgstr "Etkin"
msgid "Rearrange Autoloads"
msgstr "KendindenYüklenme'leri Yeniden Sırala"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Geçersiz yol."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Dosya yok."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Kaynak yolunda değil."
+msgid "Can't add autoload:"
+msgstr "Otomatik yükleme eklenemiyor:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1528,6 +1548,10 @@ msgstr "İsim"
msgid "Singleton"
msgstr "Tekil"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Parametreleri Yapıştır"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Sahne Güncelleniyor"
@@ -1655,16 +1679,17 @@ msgid "Scene Tree Editing"
msgstr "Sahne Ağacı Düzenleme"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Dock İçe Aktar"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Dock Nod"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "DosyaSistemi ve İçe Aktarım"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "DosyaSistemi"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Dock İçe Aktar"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1723,7 +1748,7 @@ msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Error saving profile to path: '%s'."
-msgstr "Profil yolu kaydetme hatası: '%s'."
+msgstr "Profil '%s' yoluna kaydedilirken hata oluştu."
#: editor/editor_feature_profile.cpp
msgid "Unset"
@@ -1769,9 +1794,8 @@ msgid "Erase Profile"
msgstr "Profili Sil"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "Dışa Aktarım Şablonlarını Yönet"
+msgstr "Godot Özellik Profili"
#: editor/editor_feature_profile.cpp
msgid "Import Profile(s)"
@@ -1814,7 +1838,7 @@ msgstr "Dosya Yöneticisinde Göster"
msgid "New Folder..."
msgstr "Yeni Klasör..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Yenile"
@@ -1928,7 +1952,7 @@ msgstr "Dizinler & Dosyalar:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Önizleme:"
@@ -1974,9 +1998,8 @@ msgid "Inherited by:"
msgstr "Şundan miras alındı:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "Açıklama:"
+msgstr "Açıklama"
#: editor/editor_help.cpp
msgid "Online Tutorials"
@@ -1987,18 +2010,16 @@ msgid "Properties"
msgstr "Özellikler"
#: editor/editor_help.cpp
-#, fuzzy
msgid "override:"
-msgstr "Üzerine Yaz"
+msgstr "üzerine yaz:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "Varsayılan"
+msgstr "varsayılan:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "Metotlar"
+msgstr "Yöntemler"
#: editor/editor_help.cpp
msgid "Theme Properties"
@@ -2017,9 +2038,8 @@ msgid "Property Descriptions"
msgstr "Özellik Açıklamaları"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "Değer"
+msgstr "(değer)"
#: editor/editor_help.cpp
msgid ""
@@ -2030,8 +2050,9 @@ msgstr ""
"bulunarak[/url][/color] yardım edebilirsiniz!"
#: editor/editor_help.cpp
+#, fuzzy
msgid "Method Descriptions"
-msgstr "Metot Açıklamaları"
+msgstr "Yöntem Açıklamaları"
#: editor/editor_help.cpp
msgid ""
@@ -2051,9 +2072,8 @@ msgid "Case Sensitive"
msgstr "Büyük Küçük Harf Duyarlı"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "Yardımcıları Göster"
+msgstr "Hiyerarşiyi Göster"
#: editor/editor_help_search.cpp
msgid "Display All"
@@ -2092,9 +2112,8 @@ msgid "Class"
msgstr "Sınıf"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "Metotlar"
+msgstr "Metot"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
msgid "Signal"
@@ -2105,14 +2124,12 @@ msgid "Constant"
msgstr "Sabit"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "Özellik:"
+msgstr "Nitelik"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "Tema Özellikleri"
+msgstr "Tema Özelliği"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2373,10 +2390,6 @@ msgid "There is no defined scene to run."
msgstr "Çalıştırmak için herhangi bir sahne seçilmedi."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Şimdiki sahne hiç kaydedilmedi, lütfen çalıştırmadan önce kaydediniz."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Alt işlem başlatılamadı!"
@@ -2438,7 +2451,7 @@ msgstr "Bu işlem bir sahne olmadan yapılamaz."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr "Örüntü Betikevini Dışa Aktar"
+msgstr "Örüntü Kütüphanesini Dışa Aktar"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
@@ -2461,12 +2474,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Hiç kaydedilmemiş bir sahne yeniden yüklenemiyor."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Geri dön"
+msgid "Reload Saved Scene"
+msgstr "Kaydedilmiş Sahneyi Yeniden Yükle"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Bu eylem geri alınamaz. Yine de geri dönsün mü?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Mevcut sahnede kaydedilmemiş değişiklikler var.\n"
+"Sahne yine de yeniden yüklensin mi? Bu işlem geri alınamaz."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2490,7 +2507,7 @@ msgstr "Kaydet & Çık"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr "Çıkmadan önce değişiklikler aşağıdaki sahneye(lere) kaydedilsin mi?"
+msgstr "Çıkmadan önce değişiklikler aşağıdaki sahne(ler)e kaydedilsin mi?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
@@ -2503,8 +2520,8 @@ msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
-"Bu seçenek artık kullanılmıyor. Yenilemeye zorlayan durumlar bug olarak "
-"değerlendirilir. Lütfen bildirin."
+"Bu seçenek artık kullanılmıyor. Yenilemenin zorlanması gereken durumlar "
+"artık hata olarak değerlendiriliyor. Lütfen bildirin."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
@@ -2745,16 +2762,12 @@ msgstr "TileSet ..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr "Geri"
+msgstr "Geri al"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "Geri"
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Sahneyi Eski Durumuna Çevir"
+msgstr "Yeniden yap"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
@@ -2816,24 +2829,28 @@ msgstr "Uzaktan Hata Ayıklama ile Dağıt"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Verilen yürütülebilir dosya, dışa aktarılırken veya dağıtıldığında, hata "
-"ayıklanacak şekilde bu bilgisayarın IP'sine bağlanmaya çalışacaktır."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Ağ DS ile Küçük Dağıtım"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Bu seçenek etkinleştirildiğinde, dışa aktarma veya dağıtma çok küçük bir "
"çalıştırılabilir dosya üretir.\n"
@@ -2846,9 +2863,10 @@ msgid "Visible Collision Shapes"
msgstr "Görünür Çarpışma Şekilleri"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Bu seçenek açıksa, çalışan oyunda çarpışma şekilleri ve raycast düğümleri "
"(2B ve 3B için) görünür olacaktır."
@@ -2858,23 +2876,26 @@ msgid "Visible Navigation"
msgstr "Görünür Yönlendirici"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Bu seçenek açıksa, çalışan oyunda yönlendirici örüntüleri ve çokgenler "
"görünür olacaktır."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Sahne Değişikliklerini Eş Zamanla"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Bu seçenek etkinleştirildiğinde, düzenleyicide bulunan sahnedeki "
"değişiklikler çalışmakta olan oyununda çoğaltılır.\n"
@@ -2882,15 +2903,17 @@ msgstr ""
"verimli olur."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Betik Değişikliklerini Eş Zamanla"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Bu seçenek etkinleştirildiğinde, kaydedilen tüm betik çalışan oyunda yeniden "
"yüklenecektir.\n"
@@ -2919,7 +2942,7 @@ msgstr "Ekran Görüntüleri Düzenleyici Verileri/Ayarları Klasöründe saklan
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Tam Ekran Aç / Kapat"
+msgstr "Tam Ekranı Aç/Kapat"
#: editor/editor_node.cpp
msgid "Toggle System Console"
@@ -2954,7 +2977,7 @@ msgstr "Yardım"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Ara"
@@ -2968,8 +2991,12 @@ msgid "Q&A"
msgstr "S&C"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Sorun İzleyici"
+msgid "Report a Bug"
+msgstr "Hata Bildir"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Belgelendirme Hatası Bildir"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -2989,7 +3016,7 @@ msgstr "Oynat"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "Hata ayıklama için sahnenin çalıştırılmasını duraklat."
#: editor/editor_node.cpp
msgid "Pause Scene"
@@ -3079,8 +3106,14 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
-"Bu, kaynak şablonlarını \"res://android/build\" yoluna yükleyerek, projenizi "
-"isteğe dayalı Android inşasına ayarlayacaktır."
+"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."
#: editor/editor_node.cpp
msgid ""
@@ -3098,9 +3131,8 @@ msgid "Import Templates From ZIP File"
msgstr "Şablonları Zip Dosyasından İçeri Aktar"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Dışa Aktarım Şablonu Yöneticisi"
+msgstr "Şablon Paketi"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3128,11 +3160,11 @@ msgstr "Seç"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "Düzenleyicide Aç"
+msgstr "2B Düzenleyiciyi Aç"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr "3B Düzenleyicide Aç"
+msgstr "3B Düzenleyiciyi Aç"
#: editor/editor_node.cpp
msgid "Open Script Editor"
@@ -3151,9 +3183,8 @@ msgid "Open the previous Editor"
msgstr "Önceki Düzenleyiciyi Aç"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "Uyarı"
+msgstr "Uyarı!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
@@ -3254,7 +3285,7 @@ msgstr "Katman"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr "Bit %d, değer %d"
+msgstr "Bit %d, değer %d"
#: editor/editor_properties.cpp
msgid "[Empty]"
@@ -3365,9 +3396,11 @@ msgid "Add Key/Value Pair"
msgstr "Anahtar/Değer İkilisini Ekle"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Çalıştırılabilir dışa aktarma önayarı bu platform için bulunamadı.\n"
"Lütfen dışa aktar menüsünden çalıştırılabilir bir önayar ekleyin."
@@ -3396,6 +3429,12 @@ msgstr "Betik çalıştırılamadı:"
msgid "Did you forget the '_run' method?"
msgstr "'_run()' metodunu unuttunuz mu?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Tamsayılara yuvarlamak için Ctrl tuşunu basılı tutun. Hassas değişiklikler "
+"için Shift tuşunu basılı tutun."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Düğüm(leri) içe Aktarmak için Seç"
@@ -3476,13 +3515,12 @@ msgid "Importing:"
msgstr "İçe Aktarım:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error getting the list of mirrors."
-msgstr "İmza nesnesini oluşturmada sorun."
+msgstr "Kaynaklar listesini alırken hata."
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
+msgstr "JSON sunucuları listesini alırken hata. Lütfen bu hatayı bildirin!"
#: editor/export_template_manager.cpp
msgid ""
@@ -3611,9 +3649,8 @@ msgid "Select Template File"
msgstr "Şablon Dosyası Seç"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Dışa Aktarım Kalıpları Yükleniyor"
+msgstr "Godot Dışa Aktarım Şablonları"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3694,9 +3731,8 @@ msgid "New Inherited Scene"
msgstr "Yeni Miras Alınmış Sahne"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "Ana Sahne"
+msgstr "Sahneyi Ana Sahne Yap"
#: editor/filesystem_dock.cpp
msgid "Open Scenes"
@@ -3997,10 +4033,18 @@ msgid "Error running post-import script:"
msgstr "sonradan-içe aktarılmış betik çalıştırılırken hata:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "`Post_import ()` yönteminde Node türevi bir nesne döndürdünüz mü?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Kaydediliyor..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d Dosya"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "'%s' için Varsayılanı Ayarla"
@@ -4009,29 +4053,25 @@ msgid "Clear Default for '%s'"
msgstr "'%s' İçin Varsayılanı Temizle"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Dosyalar"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Şu Şekilde İçe Aktar:"
#: editor/import_dock.cpp
msgid "Preset"
-msgstr "Önayar"
+msgstr "Ön ayar"
#: editor/import_dock.cpp
msgid "Reimport"
msgstr "Yeniden İçe Aktar"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Sahneleri kaydet, tekrar içe aktar ve baştan başlat"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
msgstr ""
-"İçe aktarılmış dosyanın tipini değiştirmek editörü baştan başlatılmasını "
+"İçe aktarılmış dosyanın tipini değiştirmek editörü yeniden başlatmanı "
"gerektiriyor."
#: editor/import_dock.cpp
@@ -4063,10 +4103,6 @@ msgid "Copy Params"
msgstr "Değişkenleri Tıpkıla"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Parametreleri Yapıştır"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Kaynak Panosunu Düzenle"
@@ -4427,19 +4463,16 @@ msgstr ""
"alınamadı."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "Animasyon Klipleri:"
+msgstr "Animasyon Klipleri"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "Ses Parçası:"
+msgstr "Ses Parçaları"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "İşlevler:"
+msgstr "İşlevler"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4458,7 +4491,7 @@ msgstr "Süzgeçlenmiş Parçaları Düzenle:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Enable Filtering"
-msgstr "Süzgeçlemeyi Aç"
+msgstr "Süzgeçlemeyi Aç"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -4505,7 +4538,7 @@ msgstr "Sonraki Değişeni Karıştır"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
-msgstr "Karışım Süresini Değiştir"
+msgstr "Oluşturma Süresini Değiştir"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
@@ -4671,9 +4704,8 @@ msgid "Move Node"
msgstr "Düğümü Taşı"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "Geçiş: "
+msgstr "Geçiş zaten var!"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Add Transition"
@@ -4763,9 +4795,8 @@ msgid "Transition: "
msgstr "Geçiş: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Kaydırma Biçimi"
+msgstr "Oynatma Modu:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -5022,29 +5053,27 @@ msgstr "Bu nesne için zaten sürdürülen bir indirme var!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "Henüz Güncellenenler"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "Pek Eski Güncellenenler"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "İsim (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "Name (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "Lisans"
+msgstr "Lisans (A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "Lisans"
+msgstr "Lisans (Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
@@ -5140,7 +5169,7 @@ msgid "Bake Lightmaps"
msgstr "Işık-Haritalarını Pişir"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Önizleme"
@@ -5158,12 +5187,11 @@ msgstr "Izgara Adımı:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
-msgstr ""
+msgstr "Birincil Satır Her:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "steps"
-msgstr "2 kademe"
+msgstr "adımlar"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -5174,9 +5202,8 @@ msgid "Rotation Step:"
msgstr "Dönme Adımı:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Step:"
-msgstr "Ölçekle:"
+msgstr "Ölçek Adımı:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Vertical Guide"
@@ -5251,86 +5278,72 @@ msgstr ""
"noktasını değiştirir."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Left"
-msgstr "Sol"
+msgstr "Sol Üst"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Right"
-msgstr "Sağ"
+msgstr "Sağ Üst"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Right"
-msgstr "Sağa Döndür"
+msgstr "Alt Sağ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Left"
-msgstr "Alttan Görünüm"
+msgstr "Alt Sol"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Left"
-msgstr "Sola Girintile"
+msgstr "Sol Merkez"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Top"
-msgstr "İçre Seçimi"
+msgstr "Merkez Üst"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Right"
-msgstr "Sağa Girintile"
+msgstr "Merkez Sağ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Bottom"
-msgstr "Alt"
+msgstr "Merkez Alt"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "Merkez"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
msgstr "Soldan Görünüm"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Wide"
msgstr "Üstten Görünüm"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
msgstr "Sağdan Görünüm"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Wide"
msgstr "Alttan Görünüm"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr ""
+msgstr "DikeyMerkez Görünüm"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr ""
+msgstr "YatayMerkez Görünüm"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Full Rect"
-msgstr "Tam adı"
+msgstr "Tam Kare"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "Ölçek Oranı:"
+msgstr "Oranı Koru"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5350,6 +5363,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"Oyun Kamerası Değiştir\n"
+"Oyun kamerasını, düzenleme arayüzü kamerası ile değiştirir."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5357,6 +5372,8 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"Oyun Kamera Değiştir\n"
+"Çalışan oyun örneği yok."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5414,7 +5431,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Yakınlaşmayı Sıfırla"
+msgstr "Yakınlaştırmayı Sıfırla"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5500,9 +5517,8 @@ msgid "Use Rotation Snap"
msgstr "Döndürme Yapışması Kullan"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Scale Snap"
-msgstr "Akıllı Hizalama Kullan"
+msgstr "Esnetme Hizalaması Kullan"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
@@ -5643,15 +5659,14 @@ msgid "Insert keys (based on mask)."
msgstr "Anahtar Gir (maskeye dayalı olarak)."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid ""
"Auto insert keys when objects are translated, rotated or scaled (based on "
"mask).\n"
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
-"Anahtarları otomatik olarak yerleştir eğer nesne yer değiştirdiyse, döndüyse "
-"ya da esnetildiyse (maskeye göre).\n"
+"Eğer nesne hareket ettiyle, döndürüldüyse ya da esnetildiyse anahtarları "
+"otomatik yerleştir (maskeye göre).\n"
"Anahtarlar yalnızca mevcut izlere eklenir, yeni izler oluşturulmayacak.\n"
"İlkinde anahtarlar elle girilmeli."
@@ -5660,9 +5675,8 @@ msgid "Auto Insert Key"
msgstr "Otomatik Anahtar Gir"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "Animasyon Anahtarı Eklendi."
+msgstr "Animasyon Anahtarı ve Pozlama Seçenekleri"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5773,20 +5787,18 @@ msgstr "Emisyon Maskesi"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Solid Pixels"
-msgstr "Sıkıştır (Pikselleri): "
+msgstr "Şekil Pikselleri"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Border Pixels"
-msgstr ""
+msgstr "Kenar Pikselleri"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "Dizinler & Dosyalar:"
+msgstr "Yönelimli Kenar Pikselleri"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5874,7 +5886,7 @@ msgstr "Eğri Doğrusal Tanjantını Aç/Kapa"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Hold Shift to edit tangents individually"
-msgstr "Tanjantları tek tek düzenlemek için Shift'e basılı tut"
+msgstr "Tanjantları bireysel olarak düzenlemek için Shift tuşuna basılı tutun"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Right click to add point"
@@ -5909,12 +5921,12 @@ msgid "Mesh is empty!"
msgstr "Örüntü boş!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Durağan Üçlü Örüntü Oluştur"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Üçlü Örüntü çarpışma yüzeyi oluşturulamadı."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Durağan Dışbükey Gövde Oluştur"
+msgid "Create Static Trimesh Body"
+msgstr "Durağan Üçlü Örüntü Oluştur"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5925,12 +5937,28 @@ msgid "Create Trimesh Static Shape"
msgstr "Üçlü Örüntü Yüzeyi Oluştur"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Şekil oluşturma başarısız!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Sahne kökü için tek bir dışbükey çarpışma şekli oluşturulamaz."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Tek dışbükey çarpışma şekli oluşturulamadı."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Tekil Dışbükey Şekil Oluştur"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Dışbükey Şekil[ler] Oluştur"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "Sahne kökü için birden fazla dışbükey çarpışma şekli oluşturulamaz."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Herhangi bir çarpışma şekli oluşturulamadı."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Çoklu Dışbükey Şekiller Oluştur"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5981,18 +6009,68 @@ msgid "Create Trimesh Static Body"
msgstr "Üçlü Örüntü Durağan Gövdesi Oluştur"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Bir StaticBody oluşturur ve otomatik olarak çokgen tabanlı bir çarpışma "
+"şekli atar.\n"
+"Bu, çarpışma tespiti için en doğru (ancak en yavaş) seçenektir."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Üçlü Örüntü Çarpışma Kardeşi Oluştur"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Poligon bazlı bir çarpışma şekli oluştur.\n"
+"Bu en hassas (fakat en yavaş) çarpışma algılama seçeneğidir."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
msgstr "Dışbükey Çarpışma Komşusu Oluştur"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Tek bir dışbükey çarpışma şekli oluşturur.\n"
+"Bu, çarpışma tespiti için en hızlı (ancak en az doğru) seçenektir."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Dışbükey Çarpışma Komşuları Oluştur"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Poligon bazlı bir çarpışma şekli oluştur.\n"
+"Bu performans açısından üstteki iki seçeneğin arasındadır."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Anahat Örüntüsü Oluştur..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Durgun bir anahat kafesi oluşturur. Anahat kafesi normalleri otomatik olarak "
+"döndürülecekdir.\n"
+"Bu SpatialMaterial Grow özelliği kullanılamadığı zaman onun yerine "
+"kullanılabilir."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "UV1'i Göster"
@@ -6014,23 +6092,23 @@ msgstr "Kontur Boyutu:"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Channel Debug"
-msgstr ""
+msgstr "UV Kanal Hata Ayıkla"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
msgstr "%d öğe kaldırılsın mı?"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "Sahneden Güncelle"
+msgstr ""
+"Mevcut sahneden güncellensin mi?:\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid "Mesh Library"
-msgstr "MeshLibrary ..."
+msgstr "Model Kütüphanesi"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6665,20 +6743,22 @@ msgstr "Farklı Kaydet..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "Çalıştırmak için komut dosyası alınamıyor."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "Komut dosyası yeniden yüklenemedi, konsolda hataları denetleyin."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "Komut dosyası araç modunda değil, çalıştırılamayacak."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
+"Komut dosyasının çalışabilmesi için EditörScript'den devrolunmalı ve araç "
+"moduna ayarlandmalı."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6837,14 +6917,6 @@ msgid "Open Godot online documentation."
msgstr "Çevrimiçi Godot dökümanlarını aç."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Belgeleri İste"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Dönüt vererek Godot belgelerini iyileştirmeye yardımcı olun."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Başvuru belgelerinde arama yap."
@@ -6909,12 +6981,12 @@ msgstr ""
"'%s' düğümünden '%s' düğümüne, '%s' sinyali için '%s' bağlantı metodu eksik."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Satır"
+msgid "[Ignore]"
+msgstr "[Gözardı et]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(gözardı et)"
+msgid "Line"
+msgstr "Satır"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6928,6 +7000,7 @@ msgstr "Sadece dosya sisteminden kaynaklar bırakılabilir."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
msgstr ""
+"Bu sahnede '% s' komut dosyası kullanılmadığı için düğümler bırakılamıyor."
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
@@ -7279,6 +7352,10 @@ msgid "This operation requires a single selected node."
msgstr "Bu işlem, seçilmiş tek bir düğüm gerektirir."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Otomatik Dikey Etkinleştirildi"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Dönüşü Görüntülemeyi kilitle"
@@ -7332,7 +7409,7 @@ msgstr "Sinematik Önizleme"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
-msgstr ""
+msgstr "GLES2 işleyici kullanılırken kullanılamaz."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7367,6 +7444,10 @@ msgid "Freelook Slow Modifier"
msgstr "Serbestbakış Hız Değiştirici"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Dönme Kilitli Görünüm"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7375,14 +7456,24 @@ msgstr ""
"Oyun içi performansın gösteri olarak ele alınamaz."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Dönme Kilitli Görünüm"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm İletişim Kutusu"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Görünürlük ifadelerini değiştirmek için tıklayın.\n"
+"\n"
+"Açık göz: Gizmo görünür.\n"
+"Kapalı göz: Gizmo görünmez.\n"
+"Yarı-açık göz: Gizmo aynı zamanda saydam yüzeylerden görünür (\"x-ray\")."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Düğümleri zemine hizala"
@@ -7575,9 +7666,8 @@ msgid "Create Mesh2D"
msgstr "Örüntü2D Oluştur"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Mesh2D Preview"
-msgstr "Mesh Önizlemeleri Oluşturuluyor"
+msgstr "Mesh2B Önizleme"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create Polygon2D"
@@ -7585,25 +7675,23 @@ msgstr "Çokgen2D Oluştur"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Polygon2D Preview"
-msgstr ""
+msgstr "Çokgen2B Önizleme"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create CollisionPolygon2D"
msgstr "TemasÇokgen2D Oluştur"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "CollisionPolygon2D Preview"
-msgstr "TemasÇokgen2D Oluştur"
+msgstr "TemasÇokgen2B Önizle"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D"
msgstr "IşıkEngelleyici2D Oluştur"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "LightOccluder2D Preview"
-msgstr "IşıkEngelleyici2D Oluştur"
+msgstr "IşıkEngelleyici2D Önizle"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
@@ -7683,9 +7771,8 @@ msgid "Add Frame"
msgstr "Çerçeve Ekle"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "Bediz yüklenemedi:"
+msgstr "Resimler yüklenemiyor"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -7724,7 +7811,8 @@ msgid "New Animation"
msgstr "Yeni Animasyon"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Hız (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -7954,7 +8042,7 @@ msgstr "Altağaç"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
-msgstr "Birçok,Seçenek,Var"
+msgstr "Var,Çok,Seçenekler"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
@@ -7978,9 +8066,8 @@ msgid "Color"
msgstr "Renk"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme File"
-msgstr "Tema"
+msgstr "Tema Dosyası"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
@@ -8095,17 +8182,15 @@ msgstr "Sahneden Birleştir"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
-msgstr ""
+msgstr "Yeni Döşeme Parçacığı"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Autotile"
-msgstr "Oto-döşemeleri Pasifleştir"
+msgstr "Yeni oto-döşeme"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Atlas"
-msgstr "Atlas :"
+msgstr "Yeni Atlas"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Next Coordinate"
@@ -8124,39 +8209,32 @@ msgid "Select the previous shape, subtile, or Tile."
msgstr "Önceki şekil, altdöşeme ya da Döşemeyi Seç."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region"
-msgstr "Bölge Şekli"
+msgstr "Bölge"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision"
-msgstr "Temas Şekli"
+msgstr "Temas"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion"
-msgstr "Örtü Şekli"
+msgstr "Engel"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation"
-msgstr "Gezinim Şekli"
+msgstr "Gezinim"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask"
-msgstr "BitMaskeleme Şekli"
+msgstr "Bitmaskesi"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority"
-msgstr "Öncelik Şekli"
+msgstr "Öncelik"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index"
-msgstr "İndeks:"
+msgstr "Derinlik İndeksi"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region Mode"
@@ -8388,14 +8466,12 @@ msgid "Edit Tile Z Index"
msgstr "Döşeme Z Derinliğini Değiştir"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Convex"
-msgstr "Çokgeni Dışbükey Yap"
+msgstr "Dışbükey Yap"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
-msgstr "Çokgeni İçbükey Yap"
+msgstr "İçbükey Yap"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Collision Polygon"
@@ -8417,7 +8493,7 @@ msgstr "DöşemeTakımı"
msgid "No VCS addons are available."
msgstr "Hiçbir VCS eklentisi mevcut değil."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Hata"
@@ -8660,9 +8736,8 @@ msgid "Dodge operator."
msgstr "Dodge operatörü."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "HardLight operator."
-msgstr "HardLight opeartörü"
+msgstr "HardLight opeartörü."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
@@ -9085,7 +9160,7 @@ msgstr ""
"\n"
"OuterProduct ilk parametre 'c' 'yi kolon vektör olarak ele alır. (tek "
"sütunlu matrix) ve ikinci parametre 'r' yi ise yatay vektör (tek satırlı "
-"matrix) olarak ele alır. doğrusal cebirsel çarpım yapar: 'c * r', 'c' 'nin "
+"matrix) olarak ele alır. doğrusal cebirsel çarpım yapar: 'c * r', 'c' 'nin "
"bileşenleri miktarınca satırı olan bir matrix üretir. Bu matrix'in kolon "
"sayısı ise 'r' 'nin bileşen sayısına eşit olur."
@@ -9210,8 +9285,8 @@ msgid ""
msgstr ""
"SmoothStep işlevi( vektör(edge0), vektör(edge1), vektör(x) ).\n"
"\n"
-"0.0 döndürür eğer 'x' 'edge0''den küçükse, ve 1.0 eğer 'x' 'edge1'' den "
-"büyükse. Aksi takdirde dönen değer 0.0 ve 1.0 arasından Hermite polinom "
+"0.0 döndürür eğer 'x' 'edge0''den küçükse, ve 1.0 eğer 'x' 'edge1'' den "
+"büyükse. Aksi takdirde dönen değer 0.0 ve 1.0 arasından Hermite polinom "
"hesabıyla döndürürlür."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9224,7 +9299,7 @@ msgid ""
msgstr ""
"SmoothStep işlevi( katsayı(edge0), katsayı(edge1), katsayı(x) ).\n"
"\n"
-"0.0 döndürür eğer 'x' 'edge0''den küçükse, ve 1.0 eğer 'x' 'edge1'' den "
+"0.0 döndürür eğer 'x' 'edge0''den küçükse, ve 1.0 eğer 'x' 'edge1'' den "
"büyükse. Aksi takdirde dönen değer 0.0 ve 1.0 arasından Hermite polinom "
"hesabıyla döndürülür."
@@ -9282,12 +9357,17 @@ msgid ""
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
+"İstenilen kadar girdi ve çıktı miktarı ile Özel Godot Shader Dili girişi. Bu "
+"yöntemle doğrudan vertex/fragment/light shaderları girişi yapılıyor, "
+"içerisinde işlev tanımları yapmayın."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
+"Kamera görüş yönü ile yüzey normali arasındaki Nokta Ürüne dayalı geçiş "
+"değerleri döndürür (ilgili girdileri geçirir)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9296,78 +9376,90 @@ msgid ""
"it later in the Expressions. You can also declare varyings, uniforms and "
"constants."
msgstr ""
+"Elde edilen sonuç shader'ın üzerine yerleştirilen Özel Godot Shader dili "
+"ifadesi. İçerisinde İşlev tanımlarını yapabilir ve daha sonra İfadeler "
+"bölümünden çağırabilirsiniz. Ayrıca varaying, uniforms ve constant "
+"değişkenleri tanımlayabilirsiniz."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr ""
+msgstr "(Yalnızca Fragment/Light modu) Sayısal Türetim İşlevi SDF."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
+msgstr "(Yalnızca Fragment/Light modu) Vektörel Türetim İşlevi."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(Yalnızca Fragment/Light modu) (Vektör) Yerel farklar kullanılarak 'x' "
+"cinsinden türev."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
msgstr ""
+"(Yalnızca Fragment/Light Modu) (Sayısal) Yerel farklar kullanılarak 'x' "
+"cinsinden türev."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(Yalnızca Fragment/Light modu) (Vektör) Yerel farklar kullanılarak 'y' "
+"cinsinden türev."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
msgstr ""
+"(Yalnızca Fragment/Light modu) (Sayısal) Yerel farklar kullanılarak 'y' "
+"cinsinden türev."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(Yalnızca Fragment/Light modu) (Vektör) 'X' ve 'y' de mutlak türevlerin "
+"toplamı."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
msgstr ""
+"(Yalnızca Fragment/Light modu) (Sayısal) 'X' ve 'y' de mutlak türevlerin "
+"toplamı."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Gölgelendirici"
+msgstr "GörselShader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "Süzgeçleri Düzenle"
+msgstr "Görsel Niteliği Düzenle"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Visual Shader Mode Changed"
-msgstr "Shader Değişiklikleri"
+msgstr "Görsel Shader Modu Değişti"
#: editor/project_export.cpp
msgid "Runnable"
msgstr "Koşturulabilir"
#: editor/project_export.cpp
-#, fuzzy
msgid "Add initial export..."
-msgstr "Giriş noktası ekle"
+msgstr "İlk dışa aktarmayı ekle ..."
#: editor/project_export.cpp
msgid "Add previous patches..."
-msgstr ""
+msgstr "Önceki yamaları ekle..."
#: editor/project_export.cpp
msgid "Delete patch '%s' from list?"
@@ -9404,9 +9496,8 @@ msgid "Exporting All"
msgstr "Tümünü Dışa Aktarma"
#: editor/project_export.cpp
-#, fuzzy
msgid "The given export path doesn't exist:"
-msgstr "Yol mevcut değil."
+msgstr "Belirtilen Dışa aktarım yolu mevcut değil:"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
@@ -9425,11 +9516,13 @@ msgid ""
"If checked, the preset will be available for use in one-click deploy.\n"
"Only one preset per platform may be marked as runnable."
msgstr ""
+"Eğer bu seçenek seçilirse önayar, tek tıklamalı dağıtımda kullanılabilir.\n"
+"Her platform için sadece tek bir önayar çalıştırılabilir olarak "
+"işaretlenebilir."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path"
-msgstr "Ön Ayarları Dışa Aktar:"
+msgstr "Dışa aktarım Yolu"
#: editor/project_export.cpp
msgid "Resources"
@@ -9456,22 +9549,20 @@ msgid "Resources to export:"
msgstr "Dışa aktarılacak kaynaklar:"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Kaynak olmayan dosyaları dışa aktarmak için kullanılan süzgeçler (virgülle "
-"ayrılmış, ör. * .json, * .txt)"
+"Kaynak olmayan dosyaları / klasörleri dışa aktarmak için filtreler\n"
+"(virgülle-ayrık, e.g: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Dışa aktarma işleminden hariç tutulacak süzgeçler (virgülle ayrılmış, ör. * ."
-"json, * .txt)"
+"Dosyaları / klasörleri projeden hariç tutmak için filtreler\n"
+"(virgülle-ayrık, e.g: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
@@ -9482,9 +9573,8 @@ msgid "Make Patch"
msgstr "Yama Yap"
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " Dosyalar"
+msgstr "Paket Dosyası"
#: editor/project_export.cpp
msgid "Features"
@@ -9499,9 +9589,8 @@ msgid "Feature List:"
msgstr "Özellik Listesi:"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script"
-msgstr "Yeni Betik"
+msgstr "Betik"
#: editor/project_export.cpp
msgid "Script Export Mode:"
@@ -9521,7 +9610,7 @@ msgstr "Şifreli (Açarı Aşağıda Belirtin)"
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr ""
+msgstr "Geçersiz Şifreleme Anahtarı (64 karakter uzunluğunda olmalı)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
@@ -9536,23 +9625,20 @@ msgid "Export Project"
msgstr "Projeyi Dışa Aktar"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Dışa Aktarma Biçimi:"
+msgstr "Dışa Aktarma Modu?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Dışa Aktar"
+msgstr "Tümünü Dışa Aktar"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " Dosyalar"
+msgstr "ZIP Dosyası"
#: editor/project_export.cpp
msgid "Godot Game Pack"
-msgstr ""
+msgstr "Godot Oyun Paketi"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -9567,26 +9653,29 @@ msgid "Export With Debug"
msgstr "Hata Ayıklama İle Dışa Aktar"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Yol mevcut değil."
+msgid "The path specified doesn't exist."
+msgstr "Belirtilen yol mevcut değil."
#: editor/project_manager.cpp
-#, fuzzy
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Lütfen 'proje.godot' dosyası içermeyen bir klasör seçin."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Paket dosyası açılırken hata (ZIP formatında değil)."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "Geçersiz \".zip\" proje dosyası; \"project.godot\" dosyası içermiyor."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Lütfen boş bir klasör seçin."
#: editor/project_manager.cpp
-#, fuzzy
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Lütfen bir 'proje.godot' dosyası seçin."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Lütfen bir \"project.godot\" veya \".zip\" dosyası seçin."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr ""
+msgid "This directory already contains a Godot project."
+msgstr "Bu dizinde zaten bir Godot projesi var."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9621,7 +9710,8 @@ msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
-"Proje yolundaki proje.godot düzenlenemedi.Eksik veya bozulmuş olabilir."
+"Proje yolundaki proje.godot düzenlenemedi (error %d). Eksik veya bozulmuş "
+"olabilir."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
@@ -9668,17 +9758,16 @@ msgid "Project Path:"
msgstr "Proje Yolu:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Proje Yolu:"
+msgstr "Proje Yükleme Yolu:"
#: editor/project_manager.cpp
msgid "Renderer:"
-msgstr ""
+msgstr "Oluşturucu:"
#: editor/project_manager.cpp
msgid "OpenGL ES 3.0"
-msgstr ""
+msgstr "OpenGL ES 3"
#: editor/project_manager.cpp
msgid ""
@@ -9687,10 +9776,14 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"Daha yüksek görsel kalite\n"
+"Tüm özellikler mevcut\n"
+"Eski donanımla uyumsuz\n"
+"Web oyunları için önerilmez"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
-msgstr ""
+msgstr "OpenGL ES 2"
#: editor/project_manager.cpp
msgid ""
@@ -9699,28 +9792,32 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"Daha Düşük Görsel Kalite\n"
+"Bazı özellikler eksik\n"
+"Çoğu donanımda çalışır\n"
+"Web uygulamaları için önerilir"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
msgstr ""
+"Oluşturucu daha sonra değiştirilebilir, ancak sahnelerin ayarlanması "
+"gerekebilir."
#: editor/project_manager.cpp
msgid "Unnamed Project"
msgstr "Adsız Proje"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "Var Olan Projeyi İçe Aktar"
+msgstr "Eksik Proje"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr ""
+msgstr "Hata: Proje dosya sisteminde mevcut değil.."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't open project at '%s'."
-msgstr "Proje Açılamadı"
+msgstr "'%s' adresindeki proje açılamıyor."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -9738,6 +9835,14 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Aşağıdaki proje ayarları dosyası, içinden oluşturulduğu Godot sürümünü "
+"belirtmiyor.\n"
+"\n"
+"%s\n"
+"\n"
+"Açmaya devam ederseniz, Godot'un geçerli yapılandırma dosyası biçimine "
+"dönüştürülecektir..\n"
+"Uyarı: Projeyi artık motorun önceki sürümleriyle açamayacaksınız."
#: editor/project_manager.cpp
msgid ""
@@ -9750,15 +9855,23 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Aşağıdaki proje ayarları dosyası daha eski bir motor sürümü tarafından "
+"oluşturulmuştur ve bu sürüm için dönüştürülmesi gerekir:\n"
+"\n"
+"%s\n"
+"\n"
+"Dönüştürmek ister misiniz?\n"
+"Uyarı: Projeyi artık motorun önceki sürümleriyle açamayacaksınız."
#: editor/project_manager.cpp
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
+"Proje ayarları, ayarları bu sürümle uyumlu olmayan daha yeni bir motor "
+"sürümü tarafından oluşturuldu."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in the Project Settings under "
@@ -9777,33 +9890,34 @@ msgstr ""
"Lütfen ilk içe aktarmayı tetiklemek için projeyi düzenleyin."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Are you sure to run %d projects at once?"
-msgstr "Birden fazla projeyi çalıştırmaya kararlı mısınız?"
+msgstr "Birden fazla projeyi çalıştırmak istediğinize emin misiniz?"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
-msgstr "Proje listeden kaldırılsın mı? (Klasör içerikleri değiştirilmeyecek)"
+msgstr ""
+"%d projeleri listeden kalksın mı?\n"
+"Proje klasörü'nün içeriği değiştirilmeyecek."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
-msgstr "Proje listeden kaldırılsın mı? (Klasör içerikleri değiştirilmeyecek)"
+msgstr ""
+"Bu projeyi listeden kaldır?\n"
+"Proje klasörünün içeriği değiştirilmeyecek."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove all missing projects from the list?\n"
"The project folders' contents won't be modified."
-msgstr "Proje listeden kaldırılsın mı? (Klasör içerikleri değiştirilmeyecek)"
+msgstr ""
+"Tüm eksik projeleri listeden kaldır?\n"
+"Proje klasörlerinin içeriği değiştirilmeyecek."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
@@ -9813,27 +9927,26 @@ msgstr ""
"olacak."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
-"Var olan Godot projeleri için %s klasör taraması yapıyorsunuz. Onaylıyor "
-"musunuz?"
+"Var olan Godot projeleri için %s klasör taraması yapmak istediğinize emin "
+"misiniz?\n"
+"Bu biraz zaman alabilir."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Proje Yöneticisi"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
-msgstr "Proje"
+msgstr "Projeler"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Last Modified"
-msgstr "Değişti"
+msgstr "Son Değişiklik"
#: editor/project_manager.cpp
msgid "Scan"
@@ -9848,9 +9961,8 @@ msgid "New Project"
msgstr "Yeni Proje"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "Noktayı kaldır"
+msgstr "Eksikleri Kaldır"
#: editor/project_manager.cpp
msgid "Templates"
@@ -9865,7 +9977,6 @@ msgid "Can't run project"
msgstr "Proje çalıştırılamadı"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
@@ -9873,6 +9984,16 @@ msgstr ""
"Herhangi bir projen yok.\n"
"Varlık Kütüphanesi'ndeki resmî örnek projeleri incelemek ister misin?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Arama kutusu, projeleri adına ve son yol bileşenine göre filtreler.\n"
+"Projeleri adına ve tam yoluna göre filtrelemek için, sorgunun en az bir `/` "
+"karakteri içermesi gereklidir."
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "Anahtar "
@@ -9890,35 +10011,31 @@ msgid "Mouse Button"
msgstr "Fare Düğmesi"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"Geçersiz işlem adı. Boş olamaz ve '/', ':', '=', '\\' veya '\"' içeremez."
+"Geçersiz işlem adı. Boş olamaz ve '/', ':', '=', '\\' veya '\"' içeremez"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "İşlem '%s' zaten var!"
+msgstr "İşlem '%s' zaten var."
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
msgstr "Girdi Eylem Olayını Yeniden Adlandır"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Animasyonun Adını Değiştir:"
+msgstr "Eylem Değiştir ölübölgesi"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Giriş İşlem Olayı Ekle"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Aygıt"
+msgstr "Tüm Aygıtlar"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -9953,24 +10070,20 @@ msgid "Wheel Down Button"
msgstr "Tekerlek Aşağı Düğmesi"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Tekerlek Yukarı Düğmesi"
+msgstr "Tekerlek Sol Düğmesi"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Sağ Düğme"
+msgstr "Tekerlek Sağ Düğme"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Düğme 6"
+msgstr "X Düğmesi 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Düğme 6"
+msgstr "X Düğmesi 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -10034,7 +10147,7 @@ msgstr "'%s' özelliği mevcut değil."
#: editor/project_settings_editor.cpp
msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr "Ayar '%s' dahilidir silinemez."
+msgstr "'%s' ayarı dahilidir ve silinemez."
#: editor/project_settings_editor.cpp
msgid "Delete Item"
@@ -10060,9 +10173,8 @@ msgid "Settings saved OK."
msgstr "Ayarlar kaydedildi TAMAM."
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Moved Input Action Event"
-msgstr "Giriş İşlem Olayı Ekle"
+msgstr "Taşınan Giriş Eylemi Olayı"
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
@@ -10119,6 +10231,8 @@ msgstr "Şunun Üzerine Yaz..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
msgstr ""
+"Değişikliklerin geçerli olması için düzenleyicinin yeniden başlatılması "
+"gerekir."
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -10134,7 +10248,7 @@ msgstr "Eylem"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Ölü bölge"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -10177,14 +10291,12 @@ msgid "Locales Filter"
msgstr "Yereller Süzgeci"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
-msgstr "Tüm yerelleri göster"
+msgstr "Tüm Dilleri Göster"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
-msgstr "Sadece seçili yerelleri göster"
+msgstr "Sadece Seçili Dilleri Göster"
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
@@ -10244,7 +10356,7 @@ msgstr "Bir Düğüm Seç"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
-msgstr "Bit %d, val %d."
+msgstr "Bit %d, değer %d."
#: editor/property_selector.cpp
msgid "Select Property"
@@ -10259,128 +10371,137 @@ msgid "Select Method"
msgstr "Metot Seç"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Yeniden Adlandır"
+msgstr "Tümden Yeniden Adlandır"
#: editor/rename_dialog.cpp
-msgid "Prefix"
-msgstr ""
+#, fuzzy
+msgid "Replace:"
+msgstr "Değiştir: "
#: editor/rename_dialog.cpp
-msgid "Suffix"
-msgstr ""
+#, fuzzy
+msgid "Prefix:"
+msgstr "Ön Ek"
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Suffix:"
+msgstr "Son Ek"
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Düzenli İfadeler Kullan"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
-msgstr "Yapışma ayarları"
+msgstr "Gelişmiş Ayarlar"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Yer Tutucu"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Düğüm adı:"
+msgstr "Düğüm adı"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Düğüm'ün üst düğüm ismi, eğer varsa"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Düğüm Türü Bul"
+msgstr "Düğüm Türü"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Şu anki Sahne"
+msgstr "Mevcut sahne adı"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Kök Düğüm adı:"
+msgstr "Kök düğüm adı"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"Sıralı tamsayı sayacı.\n"
+"Sayaç seçeneklerini karşılaştırın."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr ""
+msgid "Per-level Counter"
+msgstr "Seviye Başına Sayaç"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
+msgstr "Ayarlanmışsa, sayaç her bir alt düğüm grubu için yeniden başlar"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Sayaç için başlangıç değeri"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Adım:"
+msgstr "Adım"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "Her düğüm için sayacın artırılacağı miktar"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Dolgulama"
#: editor/rename_dialog.cpp
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Sayaç için minimum basamak sayısı.\n"
+"Eksik rakamları baştaki sıfırlarla doldurulur."
#: editor/rename_dialog.cpp
-#, fuzzy
-msgid "Regular Expressions"
-msgstr "İfadeyi Değiştir"
-
-#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "İşlem Sonrası Betik Dizeci:"
+msgstr "Artçıl-İşlem"
#: editor/rename_dialog.cpp
msgid "Keep"
msgstr "Tut"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr ""
+msgid "PascalCase to snake_case"
+msgstr "DeveŞekilli'den alt_tireli'ye dönüştür"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr ""
+msgid "snake_case to PascalCase"
+msgstr "alt_tireli'den DeveŞekilli'ye dönüştür"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Büyük/Küçük"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Küçük harf"
+msgstr "Küçük Harfe Döndür"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Büyük harf"
+msgstr "Büyük Harfe Döndür"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Yaklaşmayı Sıfırla"
+msgstr "Sıfırla"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Düzenli İfade Hatası"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "%s karakterinde"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
@@ -10439,17 +10560,16 @@ msgid "Instance Scene(s)"
msgstr "Sahne(leri) Örnekle"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Replace with Branch Scene"
-msgstr "Dalı Sahne olarak Kaydet"
+msgstr "Dal Sahnesi ile Değiştir"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
msgstr "Çocuk Sahnesini Örnekle"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Betiği Temizle"
+msgid "Detach Script"
+msgstr "Betiği Ayır"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10470,38 +10590,40 @@ msgstr "Düğüm(leri) Çoğalt"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
msgstr ""
+"Devralınan sahnelerde düğümler yeniden oluşturulamaz, düğümlerin sırası "
+"değişemez."
#: editor/scene_tree_dock.cpp
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "Kök olabilmek için düğümün düzenlenen sahneye ait olması gerekir."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "Örneklenen sahneler kök olamaz"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "Anlamlı!"
+msgstr "Düğümü Kök düğüm yap"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "\"%s\" düğümü ve alt düğümleri silinsin mi?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete %d nodes?"
-msgstr "Düğümleri Sil"
+msgstr "%d düğümleri silelim mi?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete the root node \"%s\"?"
-msgstr "Gölgelendirici Çizge Düğümünü Sil"
+msgstr "\"%s\" kök düğümü silinsin mi?"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "\"%s\" düğümü ve alt düğümleri silinsin mi?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Düğümleri Sil"
+msgstr "\"%s\" düğümü silinsin mi?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -10520,46 +10642,45 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"\"düzenlenebilir_örnek\" seçeneği iptal edilince düğümün nitelikleri "
+"varsayılan değerlere döner."
#: editor/scene_tree_dock.cpp
msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
+"\"Yer Tutucu Olarak Yükle\" seçeneğinin etkinleştirilmesi \"Düzenlenebilir "
+"alt Düğüm\" seçeneğini pasifleştirir ve düğümün niteliklerini varsayılanlara "
+"döndürür."
#: editor/scene_tree_dock.cpp
msgid "Make Local"
msgstr "Yerelleştir"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "Anlamlı!"
+msgstr "Yeni Sahne Kökü"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Düğüm Oluştur"
+msgstr "Kök Düğüm Oluştur:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Sahne"
+msgstr "2B Sahne"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Sahne"
+msgstr "3B Sahne"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Kalıtı Temizle"
+msgstr "Kullanıcı Arayüzü"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Düğümleri Sil"
+msgstr "Diğer Düğüm"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -10578,9 +10699,8 @@ msgid "Remove Node(s)"
msgstr "Düğümleri Kaldır"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Change type of node(s)"
-msgstr "Giriş Adını Değiştir"
+msgstr "Düğüm(ler) türünü değiştir"
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10614,32 +10734,37 @@ msgid "Load As Placeholder"
msgstr "Yer Tutucu Olarak Yükle"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
-msgstr "Çevrimiçi Godot dökümanlarını aç"
+msgstr "Klavuzu Aç"
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Bir yazı eklenemiyor: kayıtlı dil yok.\n"
+"Bu muhtemelen editor tüm dil modülleri kapalıyken kurulduğu için oldu."
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Çocuk Düğüm Ekle"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "Hepsini Daralt"
+msgstr "Hepsini Aç/Kapa"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Türü Değiştir"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Düğümün Ebeveynliğini Değiştir"
+msgstr "Başka Düğüme Eklemle"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "Anlamlı!"
+msgstr "Sahne Kökü Yap"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -10658,9 +10783,8 @@ msgid "Delete (No Confirm)"
msgstr "Sil (Doğrulama Yok)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Yeni Bir Düğüm Ekle / Oluştur"
+msgstr "Yeni Bir Düğüm Ekle/Oluştur."
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10671,12 +10795,12 @@ msgstr ""
"alınmış bir sahne oluşturur."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr "Seçili düğüm için yeni veya mevcut bir betik iliştir."
+msgid "Attach a new or existing script to the selected node."
+msgstr "Seçili düğüme yeni veya mevcut bir betik iliştir."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Seçilen düğüm için betik temizle."
+msgid "Detach the script from the selected node."
+msgstr "Seçilen düğümden betiği ayır."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10691,78 +10815,68 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Miras Silinsin mi? (Geri Alınamaz!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "Görünebilirliği Aç/Kapa"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "Düğüm Seç"
+msgstr "Düğüm Kilidi Aç"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Button Group"
-msgstr "Düğme 7"
+msgstr "Düğme Grubu"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "Bağlantı Hatası"
+msgstr "(Gelen Bağlantı)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
msgstr "Düğüm yapılandırma uyarısı:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
-"Düğüm bağlantı(lar) ve grup(lar)a sahip\n"
-"Sinyaller dokunu göstermek için tıkla."
+"Düğüm %s bağlantı(lar) ve %s grup(lar)a sahip\n"
+"Sinyaller bölümünü göstermek için tıkla."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
-"Düğüm bağlantılara sahip.\n"
-"Sinyaller dokunu göstermek için tıkla."
+"Düğüm %s bağlantılara sahip.\n"
+"Sinyaller bölümünü göstermek için tıkla."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
-"Düğüm grup(lar)ın içinde.\n"
-"Gruplar dokunu göstermek için tıkla."
+"Düğüm %s grup(lar)ı içinde.\n"
+"Gruplar bölümünü göstermek için tıkla."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "Betik Aç"
+msgstr "Betik Aç:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Düğüm kilitli.\n"
-"Kiliti açmak için tıkla"
+"Kiliti açmak için tıkla."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
-"Çocuklar seçilebilir değil.\n"
-"Seçilebilir yapmak için tıkla"
+"Alt düğümler seçilebilir değil.\n"
+"Seçilebilir yapmak için tıkla."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -10773,6 +10887,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimasyonOynatıcı sabitlendi.\n"
+"Çözmek için tıklayın."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -10795,39 +10911,36 @@ msgid "Select a Node"
msgstr "Bir Düğüm Seç"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "Yol boş"
+msgstr "Yol boş."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "Kayıt yolu boş!"
+msgstr "Dosya ismi boş."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "Yol yerel değil"
+msgstr "Yol yerel değil."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid base path."
-msgstr "Geçersiz üst yol"
+msgstr "Geçersiz ana yol."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "Aynı isimde dizin zaten var"
+msgstr "Aynı isimde dizin zaten var."
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Dosya yok."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "Geçersiz uzantı"
+msgstr "Geçersiz uzantı."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Wrong extension chosen."
-msgstr "Yanlış uzantı seçili"
+msgstr "Yanlış uzantı seçili."
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
@@ -10842,7 +10955,6 @@ msgid "Error loading script from %s"
msgstr "Şuradan: %s betik yüklenirken hata"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Overrides"
msgstr "Üzerine Yaz"
@@ -10851,74 +10963,72 @@ msgid "N/A"
msgstr "Uygulanamaz"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script / Choose Location"
-msgstr "Betik Düzenleyiciyi Aç"
+msgstr "Betik Aç / Konum Seç"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Betik Aç"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, it will be reused."
-msgstr "Dosya mevcut, yeniden kullanılacak"
+msgstr "Dosya mevcut, yeniden kullanılacak."
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Geçersiz yol."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid class name."
-msgstr "Geçersiz sınıf ismi"
+msgstr "Geçersiz sınıf ismi."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid inherited parent name or path."
-msgstr "Geçersiz miras alınmış ebeveyn ismi veya yolu"
+msgstr "Geçersiz devralınan üst ad veya yol."
#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Script is valid."
-msgstr "Betik geçerli"
+msgid "Script path/name is valid."
+msgstr "Betik yolu/adı geçerli."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "İzin verilenler: a-z, A-Z, 0-9 ve _"
+msgstr "İzin verilenler: a-z, A-Z, 0-9, _ ve ."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in script (into scene file)."
-msgstr "Gömülü betik (sahne dosyasına)"
+msgstr "Gömülü betik (sahne dosyasına)."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "Yeni betik dosyası oluştur"
+msgstr "Yeni betik dosyası oluşturulacak."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "Mevcut betik dosyasını yükle"
+msgstr "Mevcut betik dosyasını yükle."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "İşlem '%s' zaten var!"
+msgstr "Betik dosyası zaten mevcut."
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Not: Gömülü betikler bazı sınırlandırmalara mahsustur ve dış bir düzenleyici "
+"ile düzenlenemezler."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name:"
-msgstr "Sınıf İsmi"
+msgstr "Sınıf İsmi:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "Şablon"
+msgstr "Şablon:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "Gömme Betik"
+msgstr "Gömülü Betik:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -10933,61 +11043,56 @@ msgid "Bytes:"
msgstr "Baytlar:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Warning:"
-msgstr "Uyarılar"
+msgstr "Uyarılar:"
#: editor/script_editor_debugger.cpp
msgid "Error:"
msgstr "Hata:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error"
-msgstr "Hatayı Kopyala"
+msgstr "C++ Hatası"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error:"
-msgstr "Hata:"
+msgstr "C++ Hatası:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source"
-msgstr "Kaynak:"
+msgstr "C++ Kaynağı"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
msgstr "Kaynak:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "Kaynak:"
+msgstr "C++ Kaynak:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "Çerçeveleri Yığ"
+msgstr "Bellek Dökümü"
#: editor/script_editor_debugger.cpp
msgid "Errors"
msgstr "Hatalar"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Child process connected."
-msgstr "Çocuk Süreç Bağlandı"
+msgstr "Alt süreç connected."
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
msgstr "Hatayı Kopyala"
#: editor/script_editor_debugger.cpp
-#, fuzzy
+msgid "Video RAM"
+msgstr "Görüntü Belleği"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
-msgstr "Noktalar oluştur."
+msgstr "İşaret Noktalarını Atla"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -11034,8 +11139,8 @@ msgid "Total:"
msgstr "Toplam:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Görüntü Belleği"
+msgid "Export list to a CSV file"
+msgstr "Listeyi CSV dosyasına aktar"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11075,22 +11180,19 @@ msgstr "Ağaçtan Ayarla"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "Ölçüleri CSV olarak dışa aktar"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Erase Shortcut"
-msgstr "Kararma"
+msgstr "Kısayol Sil"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Restore Shortcut"
-msgstr "Kısayollar"
+msgstr "Kısayolları Geri Yükle"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Change Shortcut"
-msgstr "Çapaları Değiştir"
+msgstr "Kısayol Değiştir"
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
@@ -11121,9 +11223,8 @@ msgid "Change Camera Size"
msgstr "Kamera Boyutunu Değiştir"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Bildirim Kapsamını Değiştir"
+msgstr "Bildirici Değiştir AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -11150,38 +11251,32 @@ msgid "Change Capsule Shape Height"
msgstr "Kapsülün Yüksekliğini Değiştir"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Kapsülün Çapını Değiştir"
+msgstr "Silindir Şekli Yarıçapını Değiştir"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Kapsülün Yüksekliğini Değiştir"
+msgstr "Silindir Şekli Yüksekliğini Değiştir"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Işın Şeklinin Uzunluğunu Değiştir"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Işın Çapını Değiştir"
+msgstr "Silindir Yarıçapını Değiştir"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Kapsülün Yüksekliğini Değiştir"
+msgstr "Silindir Yüksekliğini Değiştir"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Küresel Şeklin Çapını Değiştir"
+msgstr "Simit Şekli İç Yarıçapını Değiştir"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Işın Çapını Değiştir"
+msgstr "Simit Şekli Dış Yarıçapını Değiştir"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -11221,12 +11316,11 @@ msgstr "GDYerelKütüphanesi"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Enabled GDNative Singleton"
-msgstr ""
+msgstr "GDNative İskelet Etkinleştirildi"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "Güncelleme Topacını Devre Dışı Bırak"
+msgstr "GDNative İskeleti Pasifleştirildi"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
@@ -11241,9 +11335,8 @@ msgid "GDNative"
msgstr "GDYerel"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Step argument is zero!"
-msgstr "adım değiştirgeni sıfır!"
+msgstr "Adım argümanı sıfır!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -11306,19 +11399,16 @@ msgid "GridMap Delete Selection"
msgstr "IzgaraHaritası Seçimi Sil"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "IzgaraHaritası Seçimi Sil"
+msgstr "IzgaraHaritası Seçimi Doldur"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "IzgaraHaritası Seçimi Sil"
+msgstr "IzgaraHaritası Seçimi Yapıştır"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paint"
-msgstr "IzgaraHaritası Ayarları"
+msgstr "IzgaraHaritası Boyama"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Grid Map"
@@ -11381,18 +11471,16 @@ msgid "Cursor Clear Rotation"
msgstr "İmleç Döndürme Temizle"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "Seçimi Sil"
+msgstr "Seçimleri Yapıştır"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clear Selection"
msgstr "Seçimi Temizle"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Tüm Seçim"
+msgstr "Seçimi Doldur"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -11403,13 +11491,12 @@ msgid "Pick Distance:"
msgstr "Uzaklık Seç:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "Süzgeç kipi:"
+msgstr "Modelleri Süz"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
-msgstr ""
+msgstr "Model olarak kullanması için bu GridMap'e MeshLibrary kaynağı atayın."
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
@@ -11421,7 +11508,7 @@ msgstr "İç özel durum yığını izlemesinin sonu"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "NavMesh'i Sabitle"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -11536,42 +11623,36 @@ msgid "Set Variable Type"
msgstr "Değişken Tipini Ayarla"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "Giriş Ekle"
+msgstr "Giriş Portu Ekle"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "Giriş Ekle"
+msgstr "Çıkış Portu Ekle"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Override an existing built-in function."
-msgstr "Geçersiz ad. Var olan gömülü türdeki ad ile çakışmamalı."
+msgstr "Varolan gömülü işlevi değiştir."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "Yeni %s oluştur"
+msgstr "Yeni işlev oluştur."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr "Değişkenler:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "Yeni %s oluştur"
+msgstr "Yeni değişken oluştur."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
msgstr "Sinyaller:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "Sıfırdan yeni bir çokgen oluşturun."
+msgstr "Yeni sinyal oluştur."
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
@@ -11598,9 +11679,8 @@ msgid "Add Function"
msgstr "Fonksiyon Ekle"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
-msgstr "Noktayı kaldır"
+msgstr "Girdi portunu sil"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
@@ -11611,14 +11691,12 @@ msgid "Add Signal"
msgstr "Sinyal Ekle"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "Noktayı kaldır"
+msgstr "Girdi Portunu Kaldır"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "Noktayı kaldır"
+msgstr "Çıktı Portunu Kaldır"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
@@ -11673,6 +11751,9 @@ msgid ""
"Can't drop properties because script '%s' is not used in this scene.\n"
"Drop holding 'Shift' to just copy the signature."
msgstr ""
+"Bu sahnede '% s' komut dosyası kullanılmadığı için özellikler "
+"bırakılamıyor.\n"
+"Sadece imzayı kopyalamak için 'Shift' tuşunu basılı tutarak bırakın."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
@@ -11699,19 +11780,16 @@ msgid "Connect Nodes"
msgstr "Düğümleri Bağla"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "Çizge Düğümlerinin Bağlantılarını Kes"
+msgstr "Düğümleri Ayır"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Düğümleri Bağla"
+msgstr "Düğüm Verisi Bağla"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Düğümleri Bağla"
+msgstr "Düğüm Dizisi Bağla"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -11722,9 +11800,8 @@ msgid "Change Input Value"
msgstr "Girdi Değerini Değiştir"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Resize Comment"
-msgstr "CanvasItem Düzenle"
+msgstr "Yorumu Boyutlandır"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
@@ -11739,26 +11816,24 @@ msgid "Paste VisualScript Nodes"
msgstr "GörselBetik Düğümleri Yapıştır"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Can't create function with a function node."
-msgstr "Fonksiyon düğümü kopyalanamıyor."
+msgstr "İşlev düğümü ile işlev oluşturulamıyor."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr ""
+msgstr "Birden çok işlevin düğümlerinden düğüm işlevi oluşturulamıyor."
#: modules/visual_script/visual_script_editor.cpp
msgid "Select at least one node with sequence port."
-msgstr ""
+msgstr "Dizi portlu en az bir düğüm seçin."
#: modules/visual_script/visual_script_editor.cpp
msgid "Try to only have one sequence input in selection."
-msgstr ""
+msgstr "Seçimde yalnızca bir dizi girişi olmasını deneyin."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "İşlevi Yeniden Adlandır"
+msgstr "İşlev Oluştur"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
@@ -11781,38 +11856,32 @@ msgid "Editing Signal:"
msgstr "Sinyal Düzenleniyor:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Tool:"
-msgstr "Yerelleştir"
+msgstr "Araç Yap:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
msgstr "Üyeler:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "Temel Tipi Değiştir"
+msgstr "Temel Tipi Değiştir:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "Düğüm Ekle..."
+msgstr "Düğümler Ekle..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "Fonksiyon Ekle"
+msgstr "İşlev Ekle..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "Fonksiyon:"
+msgstr "işlev_ismi"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Select or create a function to edit its graph."
-msgstr "Çizgeyi düzenlemek için bir fonksiyon seçin ya da oluşturun"
+msgstr "Grafiği düzenlemek için işlev seçin ya da oluşturun."
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
@@ -11831,19 +11900,16 @@ msgid "Cut Nodes"
msgstr "Düğümleri Kes"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "İşlevi Yeniden Adlandır"
+msgstr "İşlev Yap"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "Yenile"
+msgstr "Grafiği Yenile"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Üyeler"
+msgstr "Üye Düzenle"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -11902,41 +11968,40 @@ msgstr ""
"(hatası) olmalı."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "GörselBetik Düğümü Kaldır"
+msgstr "Görsel Betikte Ara"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Getir %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
-msgstr ""
+msgstr "Ayarla %s"
#: platform/android/export/export.cpp
msgid "Package name is missing."
-msgstr ""
+msgstr "Paket ismi eksik."
#: platform/android/export/export.cpp
msgid "Package segments must be of non-zero length."
-msgstr ""
+msgstr "Paket segmentleri sıfır olmayan uzunlukta olmalıdır."
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
+msgstr "Android uygulama paketi adlarında '% s' karakterine izin verilmiyor."
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
-msgstr ""
+msgstr "Rakam, paket segmentindeki ilk karakter olamaz."
#: platform/android/export/export.cpp
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
+msgstr "'%s' karakteri bir paket segmentindeki ilk karakter olamaz."
#: platform/android/export/export.cpp
msgid "The package must have at least one '.' separator."
-msgstr ""
+msgstr "Paket en azından bir tane '.' ayıracına sahip olmalıdır."
#: platform/android/export/export.cpp
msgid "Select device from the list"
@@ -11944,45 +12009,83 @@ msgstr "Listeden aygıt seç"
#: platform/android/export/export.cpp
msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
+msgstr "Editör Ayarlarında ADB uygulaması tayin edilmemiş."
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr ""
+msgstr "OpenJDK jarimzalayıcı Editör Ayarlarında yapılandırılmamış."
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
+"Anahtar deposunda Hata Ayıklayıcı Ayarları'nda veya ön ayarda "
+"yapılandırılmamış."
+
+#: platform/android/export/export.cpp
+#, fuzzy
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"Anahtar deposunda Hata Ayıklayıcı Ayarları'nda veya ön ayarda "
+"yapılandırılmamış."
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
+"Özel derleme için Editör Ayarları'nda geçerli bir Android SDK yolu gerekir."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
-msgstr ""
+msgstr "Editör Ayarlarında özel derleme için geçersiz Android SDK yolu."
#: platform/android/export/export.cpp
-#, fuzzy
msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
-msgstr "Android yapı şablonu eksik, lütfen ilgili şablonları yükleyin."
+msgstr ""
+"Android derleme şablonu projede yüklü değil. Proje menüsünden yükleyin."
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr ""
+msgstr "APK genişletmesi için geçersiz ortak anahtar."
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "Geçersiz sınıf ismi"
+msgstr "Geçersiz paket ismi:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+"Eklentileri kullanabilmek için \"Özel Derleme Kullan\" seçeneği aktif olmalı."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
#: platform/android/export/export.cpp
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."
#: platform/android/export/export.cpp
msgid ""
@@ -11991,46 +12094,52 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
+"Android derlemesi sürüm uyumsuzluğu:\n"
+" Yüklü Şablon: %s\n"
+" Godot Versiyonu: %s\n"
+"Lütfen 'Derleme' menüsünden Android derleme şablonunu yeniden yükleyin."
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "Android Projesi Oluşturma (gradle)"
#: platform/android/export/export.cpp
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"Android projesinin oluşturulması başarısız oldu, hatayı çıktı için kontrol "
+"edin.\n"
+"Alternatif olarak, Android derleme dokümantasyonu için docs.godotengine.org "
+"adresini ziyaret edin.."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr ""
+msgstr "Şurada derleme apk oluşturulmadı: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
-msgstr ""
+msgstr "Tanımlayıcı eksik."
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "The character '%s' is not allowed in Identifier."
-msgstr "Ad doğru bir belirleyici değil:"
+msgstr "Tanımlayıcı'da '%s' karakterine izin verilmiyor."
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
-msgstr ""
+msgstr "App Store Ekip Kimliği belirtilmedi - proje yapılandırılamıyor."
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "Ad doğru bir belirleyici değil:"
+msgstr "Geçersiz Tanımlayıcı:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
-msgstr ""
+msgstr "Ön ayarda gerekli simge belirtilmemiş."
#: platform/javascript/export/export.cpp
msgid "Stop HTTP Server"
-msgstr ""
+msgstr "HTTP sunucuyu durdur"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -12065,19 +12174,16 @@ msgid "Using default boot splash image."
msgstr "Açılış ekranı resim dosyası okunamadı."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package short name."
-msgstr "Geçersiz sınıf ismi"
+msgstr "Geçersiz paket kısa ismi."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package unique name."
-msgstr "Benzersiz Ad Geçersiz."
+msgstr "Geçersiz benzersiz paket ismi."
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "Benzersiz Ad Geçersiz."
+msgstr "Geçersiz paket yayıncı görünen adı."
#: platform/uwp/export/export.cpp
msgid "Invalid product GUID."
@@ -12120,13 +12226,12 @@ msgid "Invalid splash screen image dimensions (should be 620x300)."
msgstr "Geçersiz açılış görüntülüğü bediz boyutları (620x300 olmalı)."
#: scene/2d/animated_sprite.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
msgstr ""
-"Bir SpriteFrames kaynağı oluşturulmalı ya da 'Kareler' özelliğine atanmalı "
-"ki AnimatedSprite düğümü kareleri gösterebilsin."
+"AnimatedSprite öğesinin çerçeveleri görüntülemesi için \"Çerçeveler\" "
+"özelliğinde bir SpriteFrames kaynağı oluşturulmalı veya ayarlanmalıdır."
#: scene/2d/canvas_modulate.cpp
msgid ""
@@ -12138,15 +12243,15 @@ msgstr ""
"edilecektir."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Bu düğüm alt şekillere sahip değil, bu yüzden uzayla etkileşime giremez.\n"
-"Şeklini belirlemek için CollisionShape2D ya da CollisionPolygon2D eklemeyi "
-"düşünebilirsiniz."
+"Bu düğümün şekli yoktur, bu nedenle diğer nesnelerle çarpışamaz veya "
+"etkileşime giremez.\n"
+"Şeklini tanımlamak için alt düğüm olarak bir TemasŞekli2B veya TemasÇokgen2B "
+"eklemeyi düşünün."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -12182,18 +12287,25 @@ msgstr ""
"CollisionShape2D'nin işlevini yerine getirmesi için ona bir şekil sağlanması "
"gerekmektedir. Lütfen onun için bir şekil kaynağı oluşturun!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"CPUParçacık2B animasyonu \"Parçacık Animasyonu\" seçimi etkin olarak "
+"CanvasÖgesiMalzemesi kullanımı gerektirir."
#: scene/2d/light_2d.cpp
-#, fuzzy
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
-msgstr "Işık yüzeyli bir doku, 'texture' özelliğine sağlanmalıdır."
+msgstr "\"Doku\" özelliğine ışık şeklinde bir doku sağlanmalıdır."
#: scene/2d/light_occluder_2d.cpp
msgid ""
@@ -12203,9 +12315,8 @@ msgstr ""
"(ya da çizilmelidir)."
#: scene/2d/light_occluder_2d.cpp
-#, fuzzy
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
-msgstr "Bu engelleyici için engelleyici çokgeni boş. Lütfen bir çokgen çizin!"
+msgstr "Bu engelleyici için engelleyici çokgeni boş. Lütfen bir çokgen çizin."
#: scene/2d/navigation_polygon.cpp
msgid ""
@@ -12237,6 +12348,9 @@ msgid ""
"Use the CPUParticles2D node instead. You can use the \"Convert to "
"CPUParticles\" option for this purpose."
msgstr ""
+"GPU tabanlı parçacıklar GLES2 video sürücüsü tarafından desteklenmez.\n"
+"Bunun yerine CPUParçacıklar2B düğümünü kullanın. Bu amaçla "
+"\"CPUParçacıklar'a Dönüştür\" seçeneğini kullanabilirsiniz."
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
@@ -12251,6 +12365,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Particles2D animasyonu, \"Parçacık Animasyonu\" etkinleştirilmiş bir "
+"CanvasÖgesiMalzemesi kullanımını gerektirir."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -12274,74 +12390,70 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Bu İskelet2B zinciri İskelet2B düğümünde sonlanmalı."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Bir Kemit2B yalnızca İskelet2B ya da başka bir Kemik2B'nin alt düğümü olarak "
+"çalışabilir."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Bu kemik uygun bir DİNLENME pozundan yoksun. İskelet2B düğümüne gidip bir "
+"tane atayın."
#: scene/2d/tile_map.cpp
-#, fuzzy
msgid ""
"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
"CollisionShape2D yalnızca CollisionObject2D'den türeyen düğümlere bir şekil "
-"elde etmeye hizmet eder. Lütfen onu yalnızca şunların çocuğu olarak kullanın "
-"ve Area2D, StaticBody2D, RigidBody2D, KinematicBody2D vs.'ye bir şekil "
-"vermek için kullanın."
+"elde etmeye hizmet eder. Lütfen onu yalnızca Area2D, StaticBody2D, "
+"RigidBody2D, KinematicBody2D vs.'nin alt şekli olarak ve onlara şekil vermek "
+"için kullanın."
#: scene/2d/visibility_notifier_2d.cpp
-#, fuzzy
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
msgstr ""
-"VisibilityEnable2D düğümü düzenlenmiş sahne kökü doğrudan ebeveyn olarak "
-"kullanıldığında çalışır."
+"VisibilityEnabler2D, düzenlenmiş sahne köküyle doğrudan üst öğe olarak "
+"kullanıldığında en iyi sonucu verir."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr "ARVRCamera ebeveyni olarak ARVROrigin düğümüne sahip olmalı"
+msgstr "ARVRCamera üst düğüm olarak ARVROrigin düğümüne sahip olmalı."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr "ARVRController ebeveyni olarak ARVROrigin düğümüne sahip olmalı"
+msgstr "ARVRController üst düğüm olarak ARVROrigin düğümüne sahip olmalı."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
msgstr ""
"Deneytleyici kimliği 0 olmamalı aksi taktirde bu denetleyici gerçek bir "
-"denetleyiciye bağlı olmayacak"
+"denetleyiciye bağlı olmayacak."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr "ARVRAnchor ebeveyni olarak ARVROrigin düğümüne sahip olmalı"
+msgstr "ARVRAnchor üst düğüm olarak ARVROrigin düğümüne sahip olmalı."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
msgstr ""
-"Çapa kimliği 0 olmamalı aksi halde bu çapa gerçek bir çapaya bağlı olmayacak"
+"Çapa kimliği 0 olmamalı aksi halde bu çapa gerçek bir çapaya bağlı olmayacak."
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr "ARVROrigin bir ARVRCamera çocuk düğümü gerektirir"
+msgstr "ARVROrigin bir ARVRCamera alt düğümü gerektirir."
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
@@ -12368,15 +12480,14 @@ msgid "Lighting Meshes: "
msgstr "Örüntüler Haritalanıyor: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Bu düğüm alt şekillere sahip değil, bu yüzden uzayla etkileşime giremez.\n"
-"Şeklini belirlemek için CollisionShape ya da CollisionPolygon eklemeyi "
-"düşünebilirsiniz."
+"Bu düğüm şekle sahip değil, bu yüzden diğer nesnelerle etkileşime giremez.\n"
+"Şeklini belirlemek için alt düğüm olarak CollisionShape ya da "
+"CollisionPolygon eklemeyi düşünebilirsiniz."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -12404,31 +12515,38 @@ msgstr ""
"RigidBody, KinematicBody, v.b. onu sadece bunların çocuğu olarak kullanın."
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
msgstr ""
-"CollisionShape'in çalışması için bir şekil verilmelidir. Lütfen bunun için "
-"bir şekil kaynağı oluşturun!"
+"CollisionShape'in çalışması için ona bir şekil verilmelidir. Lütfen bunun "
+"için bir şekil kaynağı oluşturun."
#: scene/3d/collision_shape.cpp
msgid ""
"Plane shapes don't work well and will be removed in future versions. Please "
"don't use them."
msgstr ""
+"Düzlem şekli iyi çalışmıyor ve gelecek versiyonlarda çıkarılacak. Lütfen "
+"kullanmayın."
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"ConcavePolygonShape static dışında bir modda RigidBody'i desteklemiyor."
#: scene/3d/cpu_particles.cpp
-#, fuzzy
msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
-"Hiçbirşey görünebilir değil çünkü örüntüler çizim geçişlerine atanmış değil."
+msgstr "Hiçbirşey görünebilir değil çünkü hiçbir model atanmış değil."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial whose "
"Billboard Mode is set to \"Particle Billboard\"."
msgstr ""
+"CPUParçacık animasyonu Billboard Modu \"Parçacık Billboard\" olarak "
+"belirlenmiş UzamsalMalzeme kullanımı gerektirir."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -12439,10 +12557,17 @@ msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
+"GIProbes GLES2 video sürücüsü tarafından desteklenmez.\n"
+"Bunun yerine bir BakedLightmap kullanın."
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr ""
+msgstr "90 dereceden geniş açılı SpotIşık gölge oluşturamaz."
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
@@ -12464,6 +12589,9 @@ msgid ""
"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
"\" option for this purpose."
msgstr ""
+"GPU tabanlı parçacıklar GLES2 video sürücüsü tarafından desteklenmez.\n"
+"Bunun yerine CPUParçacık düğümünü kullanın. Bu amaçla \"CPUParçacık'a "
+"Dönüştür\" seçeneğini kullanabilirsiniz."
#: scene/3d/particles.cpp
msgid ""
@@ -12476,18 +12604,21 @@ msgid ""
"Particles animation requires the usage of a SpatialMaterial whose Billboard "
"Mode is set to \"Particle Billboard\"."
msgstr ""
+"Parçacık animasyonu, Reklam Panosu Modu \"Parçacık Reklam Panosu\" olarak "
+"ayarlanmış bir SpatialMaterial'ın kullanılmasını gerektirir."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
msgstr ""
-"PathFollow2D yalnızca Path2D düğümünün çocuğu olarak ayarlanınca çalışır."
+"PathFollow yalnızca Path düğümünün alt düğümü olarak ayarlanınca çalışır."
#: scene/3d/path.cpp
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
+"YolTakibet'in DÖNME_ODAKLI öğesi, üst Yol'un Eğri kaynağında \"Yukarı Vektör"
+"\" özelliğinin etkinleştirilmesini gerektiriyor."
#: scene/3d/physics_body.cpp
msgid ""
@@ -12500,36 +12631,34 @@ msgstr ""
"Boyu değişikliğini bunun yerine çocuk çarpışma şekilleri içinden yapın."
#: scene/3d/remote_transform.cpp
-#, fuzzy
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
-"Yol özelliği, çalışmak için geçerli bir Spatial düğümüne işaret etmelidir."
+"\"Uzak Yol\" özelliği çalışması için geçerli bir Uzamsal veya Uzamsal türevi "
+"düğüme işaret etmelidir."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
-msgstr ""
+msgstr "Bir model ayarlanana kadar bu gövde yok sayılır."
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"RigidBody boyut değişikliği(karakter yada rigid kipleri) fizik motoru "
-"çalıştığında geçersiz kılınacak.\n"
-"Boyu değişikliğini bunun yerine çocuk çarpışma şekilleri içinden yapın."
+"SoftBody'deki boyut değişiklikleri çalışırken fizik motoru tarafından "
+"geçersiz kılınır.\n"
+"Bunun yerine alt düğümlerde çarpışma şekillerindeki boyutu değiştirin."
#: scene/3d/sprite_3d.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
msgstr ""
-"AnimatedSprite3D 'nin çerçeveleri görüntülemek için bir SpriteFrames kaynağı "
-"oluşturulmalı veya 'Çerçeveler' niteliğinde ayarlanmalıdır."
+"AnimatedSprite3D'nin kareleri görüntüleyebilmesi için \"Çerçeveler\" "
+"özelliğinde bir SpriteFrames kaynağı oluşturulmalı veya ayarlanmalıdır."
#: scene/3d/vehicle_body.cpp
msgid ""
@@ -12544,6 +12673,8 @@ msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"WorldEnvironment, \"Ortam\" özelliğinin görünür bir etkiye sahip olması için "
+"bir Ortam içermesi gereklidir."
#: scene/3d/world_environment.cpp
msgid ""
@@ -12562,50 +12693,45 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "'%s' BlendTree düğümünde, animasyon bulunamadı: '% s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Animasyon Araçları"
+msgstr "Animasyon bulunamadı: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "'%s' düğümünde geçersiz animasyon: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "HATA: Geçersiz animasyon adı!"
+msgstr "Geçersiz animasyon: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Şunun: '%s' şununla: '%s' bağlantısını kes"
+msgstr "'%s' düğümünün '%s' girişine hiçbir şey bağlı değil."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
-msgstr ""
+msgstr "Grafik için hiçbir kök AnimationNode ayarlanmadı."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr ""
-"Sahne Ağacı'ndan animasyonları düzenleyebilmek için bir AnimationPlayer "
-"seçin."
+msgstr "Animasyon içeren bir AnimationPlayer düğümünün yolu ayarlanmadı."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"AnimasyonOynatıcı için ayarlanan yol, bir AnimasyonOynatıcı düğümüne yol "
+"açmaz."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
-msgstr "Animasyon ağacı geçersizdir."
+msgstr "AnimationOynatıcı kök düğümü geçerli bir düğüm değil."
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
-msgstr ""
+msgstr "Bu düğüm kullanımdan kaldırıldı. Bunun yerine AnimasyonAğacı kullanın."
#: scene/gui/color_picker.cpp
msgid ""
@@ -12613,27 +12739,29 @@ msgid ""
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"Renk: #%s\n"
+"SFD: Renk ata\n"
+"RMB: Önayar kaldır"
#: scene/gui/color_picker.cpp
msgid "Pick a color from the editor window."
-msgstr ""
+msgstr "Düzenleme penceresinden renk seç."
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
msgid "Raw"
-msgstr ""
+msgstr "Ham"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
-msgstr ""
+msgstr "Hex ve kod değerleri arasında geçiş yap."
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "Şuanki rengi bir önayar olarak kaydet"
+msgstr "Şuanki rengi bir önayar olarak kaydet."
#: scene/gui/container.cpp
msgid ""
@@ -12641,12 +12769,19 @@ msgid ""
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
+"Bir komut dosyası alt öğelerin yerleştirme davranışını yapılandırmadıkça, "
+"kapsayıcı kendi başına hiçbir amaca hizmet etmez.\n"
+"Komut dosyası eklemek istemiyorsanız bunun yerine düz bir Kontrol düğümü "
+"kullanın."
#: scene/gui/control.cpp
msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"İpucu Araç İpucu, kontrolün Fare Filtresi \"Yoksay\" olarak ayarlandığı için "
+"görüntülenmez. Bu sorunu çözmek için Fare Filtresini \"Durdur\" veya "
+"\"Başarılı\" olarak ayarlayın."
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -12657,30 +12792,28 @@ msgid "Please Confirm..."
msgstr "Lütfen Doğrulayın..."
#: scene/gui/popup.cpp
-#, fuzzy
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
-"Açılır pencereler popup() veya popup*() işlevleri çağrılmadıkça varsayılan "
-"olarak gizlenecektir. Onları düzenleme için görünür kılmak da iyidir, ancak "
-"çalışırken gizlenecekler."
+"Popup() veya popup*() işlevlerinden herhangi birini çağırmazsanız pop-up'lar "
+"varsayılan olarak gizlenir. Bunları düzenleme için görünür yapmak iyidir, "
+"ancak çalıştırıldıktan sonra gizlenirler."
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr ""
+msgstr "\"Exp Edit\" etkinse, \"Min Değer\" 0'dan büyük olmalıdır."
#: scene/gui/scroll_container.cpp
-#, fuzzy
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
-"ScrollContainer tek bir çocuk denetimi ile çalışmak için tasarlanmıştır.\n"
-"Bir kapsayıcı (VBox,HBox, vb) veya bir Control'ü çocuk olarak kullanın ve "
-"özel minimum boyutu elle ayarlayın."
+"ScrollContainer tek bir alt denetimi ile çalışmak için tasarlanmıştır.\n"
+"Bir kapsayıcı (VBox,HBox, vb) ya da Control'ü alt düğüm olarak kullanın ve "
+"minimum boyutu elle ayarlayın."
#: scene/gui/tree.cpp
msgid "(Other)"
@@ -12706,14 +12839,18 @@ msgstr ""
"yapın böylece bir boyut elde edebilir. Aksi takdirde, Görüntüleme için bunu "
"bir RenderTarget yap ve dahili dokusunu herhangi bir düğüme ata."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"Herhangi bir şeyi işlemek için görüntükapısı boyutu 0'dan büyük olmalıdır."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Önizleme için geçersiz kaynak."
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Gölgelendirici için geçersiz kaynak."
+msgstr "Shader için geçersiz kaynak."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid comparison function for that type."
@@ -12724,19 +12861,64 @@ msgid "Assignment to function."
msgstr "İşleve atama."
#: servers/visual/shader_language.cpp
-#, fuzzy
msgid "Assignment to uniform."
-msgstr "Değişmeze atama."
+msgstr "uniform için atama."
#: servers/visual/shader_language.cpp
-#, fuzzy
msgid "Varyings can only be assigned in vertex function."
-msgstr "Değişkenler yalnızca tepe işlevinde atanabilir."
+msgstr "varyings yalnızca vertex işlevinde atanabilir."
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
msgstr "Sabit değerler değiştirilemez."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "DosyaSistemi ve İçe Aktarım"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Verilen yürütülebilir dosya, dışa aktarılırken veya dağıtıldığında, hata "
+#~ "ayıklanacak şekilde bu bilgisayarın IP'sine bağlanmaya çalışacaktır."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Şimdiki sahne hiç kaydedilmedi, lütfen çalıştırmadan önce kaydediniz."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Kaynak yolunda değil."
+
+#~ msgid "Revert"
+#~ msgstr "Geri dön"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Bu eylem geri alınamaz. Yine de geri dönsün mü?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Sahneyi Eski Durumuna Çevir"
+
+#~ msgid "Clear Script"
+#~ msgstr "Betiği Temizle"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Sorun İzleyici"
+
+#~ msgid "Request Docs"
+#~ msgstr "Belgeleri İste"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Dönüt vererek Godot belgelerini iyileştirmeye yardımcı olun."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "%d değişiklik gerçekleştirildi."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Durağan Dışbükey Gövde Oluştur"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Şekil oluşturma başarısız!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/uk.po b/editor/translations/uk.po
index aca5040517..417c5aeeeb 100644
--- a/editor/translations/uk.po
+++ b/editor/translations/uk.po
@@ -13,11 +13,13 @@
# Александр <ol-vin@mail.ru>, 2018.
# Богдан Матвіїв <bomtvv@gmail.com>, 2019.
# Tymofij Lytvynenko <till.svit@gmail.com>, 2020.
+# Vladislav Glinsky <cl0ne@mithril.org.ua>, 2020.
+# Микола Тимошенко <9081@ukr.net>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Ukrainian (Godot Engine)\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
+"PO-Revision-Date: 2020-09-05 09:37+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/"
"godot/uk/>\n"
@@ -27,24 +29,24 @@ 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 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
-"Некоректний тип аргументу для convert(), слід використовувати константу "
+"Некоректний тип аргументу для convert(), слід використовувати константи "
"TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "Мало бути вказано рядок довжини 1 (символ)."
+msgstr "Очікувався рядок довжиною 1 (символ)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Недостатньо байтів для декодування або вказано некоректний формат."
+msgstr "Недостатньо байтів для їх декодування або вказано некоректний формат."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -53,7 +55,8 @@ msgstr "Некоректні вхідні дані %i (не передано) у
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
-"не можна використовувати self, оскільки екземпляр є порожнім (не передано)"
+"неможливо використовувати self, оскільки екземпляр має значення null (не "
+"передано)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -65,15 +68,15 @@ msgstr "Некоректний індекс типу %s для базового
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr "Некоректний іменований індекс «%s» для базового типу %s"
+msgstr "Некоректний іменований індекс \"%s\" для базового типу %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "Некоректні аргументи для побудови «%s»"
+msgstr "Некоректні аргументи для створення \"%s\""
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "При виклику «%s»:"
+msgstr "При виклику \"%s\":"
#: core/ustring.cpp
msgid "B"
@@ -105,15 +108,15 @@ msgstr "ЕіБ"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "Вивільнити"
+msgstr "Вільні"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr "Збалансована"
+msgstr "Балансовані"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr "Віддзеркалити"
+msgstr "Віддзеркалені"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -125,7 +128,7 @@ msgstr "Значення:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "Тут слід вставити ключ"
+msgstr "Вставити ключ тут"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
@@ -543,6 +546,7 @@ msgid "Seconds"
msgstr "Секунди"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "Кадри за секунду"
@@ -574,7 +578,7 @@ msgstr "Масштаб від курсору"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "Дублювати виділене"
+msgstr "Дублювати позначене"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
@@ -702,8 +706,8 @@ msgid "Line Number:"
msgstr "Номер рядка:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Замінено %d випадок(-ів)."
+msgid "%d replaced."
+msgstr "%d замінено."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -721,7 +725,7 @@ msgstr "Враховувати регістр"
msgid "Whole Words"
msgstr "Цілі слова"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Замінити"
@@ -771,6 +775,10 @@ msgid "Method in target node must be specified."
msgstr "Має бути вказано метод у цільовому вузлі."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Назва методу має бути коректним ідентифікатором."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -854,7 +862,6 @@ msgstr "Не вдалося з'єднати сигнал"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -911,6 +918,11 @@ msgid "Signals"
msgstr "Сигнали"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Фільтрувати плитки"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Ви справді хочете вилучити усі з'єднання з цього сигналу?"
@@ -948,7 +960,7 @@ msgid "Recent:"
msgstr "Нещодавні:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Пошук:"
@@ -1130,6 +1142,9 @@ msgstr "Засновники проєкту"
msgid "Lead Developer"
msgstr "Ведучий розробник"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "Керівник проектів "
@@ -1151,6 +1166,14 @@ msgid "Gold Sponsors"
msgstr "Золоті спонсори"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "Срібні донори"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "Бронзові донори"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Міні-спонсори"
@@ -1212,7 +1235,7 @@ msgstr "%s (вже існує)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr "Розпаковування активів"
+msgstr "Розпаковування ресурсів"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
@@ -1448,7 +1471,7 @@ msgstr "Перейменувати автозавантаження"
#: editor/editor_autoload_settings.cpp
msgid "Toggle AutoLoad Globals"
-msgstr "Увімкнути автозавантаження глобальних скриптів"
+msgstr "Увімкнути автозавантаження глобальних скриптів"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
@@ -1458,25 +1481,17 @@ msgstr "Перемістити автозавантаження"
msgid "Remove Autoload"
msgstr "Видалити автозавантаження"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
-msgstr "Активувати"
+msgstr "Увімкнути"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
msgstr "Змінити порядок автозавантажень"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "Неправильний шлях."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Файл не існує."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "Не в ресурсному шляху."
+msgid "Can't add autoload:"
+msgstr "Не вдалося додати автозавантаження:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1503,6 +1518,10 @@ msgstr "Назва"
msgid "Singleton"
msgstr "Одинак (шаблон проєктування)"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Вставити параметри"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Оновлення сцени"
@@ -1624,23 +1643,24 @@ msgstr "Редактор скриптів"
#: editor/editor_feature_profile.cpp
msgid "Asset Library"
-msgstr "Бібліотека активів"
+msgstr "Бібліотека ресурсів"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
msgstr "Редагування ієрархії сцени"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Бічна панель імпортування"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Бічна панель вузлів"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "Бічна панель файлової системи та імпортування"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "Файлова система"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Бічна панель імпортування"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1790,7 +1810,7 @@ msgstr "Показати у менеджері файлів"
msgid "New Folder..."
msgstr "Створити теку..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Оновити"
@@ -1904,7 +1924,7 @@ msgstr "Каталоги та файли:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Попередній перегляд:"
@@ -1930,7 +1950,7 @@ msgstr ""
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr "Імпортування активів"
+msgstr "Імпортування ресурсів"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
@@ -1979,7 +1999,7 @@ msgstr "Властивості теми"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "Перелічуваний"
+msgstr "Переліки"
#: editor/editor_help.cpp
msgid "Constants"
@@ -2341,11 +2361,6 @@ msgid "There is no defined scene to run."
msgstr "Немає визначеної сцени для виконання."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"Поточна сцена ніколи не була збережена, будь ласка, збережіть її до запуску."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Не вдалося запустити підпроцес!"
@@ -2430,12 +2445,17 @@ msgid "Can't reload a scene that was never saved."
msgstr "Неможливо перезавантажити сцену, яку ніколи не зберігали."
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "Повернутися"
+msgid "Reload Saved Scene"
+msgstr "Перезавантаження збереженої сцени"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Цю дію не можна скасувати. Повернутися в будь-якому випадку?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"Зміни до поточної сцени не збережено.\n"
+"Перезавантажити збережену сцену попри це? Наслідки перезавантаження не можна "
+"буде скасувати."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2489,8 +2509,8 @@ msgstr "Повторно відкрити закриту сцену"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
msgstr ""
-"Не вдається ввімкнути плагін addon: '%s' не вдалося проаналізувати "
-"налаштування конфігурації."
+"Не вдалося ввімкнути додаток addon: «%s» не вдалося проаналізувати "
+"налаштування."
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
@@ -2726,10 +2746,6 @@ msgid "Redo"
msgstr "Повернути"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "Повернути сцену"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "Різні проєктні або сценографічні інструменти."
@@ -2789,24 +2805,28 @@ msgstr "Розгортання за допомогою віддаленого н
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"При експорті або розгортанні, отриманий виконуваний файл буде намагатися "
-"підключитися до IP цього комп'ютера, для налагодження."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "Маленьке розгортання з Network File System"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"Якщо цей параметр увімкнено, експорт або розгортання дають мінімальний "
"виконуваний файл.\n"
@@ -2819,9 +2839,10 @@ msgid "Visible Collision Shapes"
msgstr "Видимі контури зіткнень"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
"Контури зіткнення та вузли raycast (для 2D та 3D) буде видно в роботі гри, "
"якщо ця опція увімкнена."
@@ -2831,23 +2852,26 @@ msgid "Visible Navigation"
msgstr "Видимі навігації"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
"Навігаційні полісітки та полігони будуть видимі у запущеній грі, якщо ця "
"опція увімкнена."
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "Синхронізувати зміни сцени"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Якщо цей параметр увімкнено, будь-які зміни, внесені в сцену в редакторі, "
"будуть відтворені в роботі гри.\n"
@@ -2855,15 +2879,17 @@ msgstr ""
"файловою системою."
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "Синхронізувати зміни в скрипті"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"Якщо цей параметр увімкнено, будь-який скрипт, який буде збережений, буде "
"перезавантажений у поточній грі.\n"
@@ -2927,7 +2953,7 @@ msgstr "Довідка"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Пошук"
@@ -2941,8 +2967,12 @@ msgid "Q&A"
msgstr "Запитання та відповіді"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Відстеження помилок"
+msgid "Report a Bug"
+msgstr "Повідомити про ваду"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "Надіслати відгук щодо документації"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3118,7 +3148,7 @@ msgstr "Відкрити редактор скриптів"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr "Відкрити бібліотеку активів"
+msgstr "Відкрити бібліотеку ресурсів"
#: editor/editor_node.cpp
msgid "Open the next Editor"
@@ -3342,9 +3372,11 @@ msgid "Add Key/Value Pair"
msgstr "Додати пару ключ-значення"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"Не знайдено робочий експортер для цієї платформи.\n"
"Будь ласка, додайте його в меню експорту."
@@ -3373,6 +3405,12 @@ msgstr "Не вдалося запустити скрипт:"
msgid "Did you forget the '_run' method?"
msgstr "Ви забули метод '_run'?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+"Утримуйте натиснутою Ctrl, щоб заокруглити до цілих. Утримуйте натиснутою "
+"Shift, щоб зміни були точнішими."
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Виберіть вузол(вузли) для імпорту"
@@ -3969,10 +4007,18 @@ msgid "Error running post-import script:"
msgstr "Помилка запуску після імпорту скрипту:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "Повернули об'єкт, що походить від Node, у методі «post_import()»?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Збереження..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d файлів"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Встановити як типове для '%s'"
@@ -3981,10 +4027,6 @@ msgid "Clear Default for '%s'"
msgstr "Очистити типове для '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Файли"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Імпортувати як:"
@@ -3997,7 +4039,7 @@ msgid "Reimport"
msgstr "Переімпортувати"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Зберегти сцени, повторно імпортувати і перезапустити"
#: editor/import_dock.cpp
@@ -4008,8 +4050,8 @@ msgstr "Зміна типу імпортованого файла потребу
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
msgstr ""
-"Увага: ісують об'єкти, які використовують цей ресурс, — вони можуть "
-"припинити завантажуватися належним чином."
+"УВАГА: існують об'єкти, що використовують цей ресурс та можуть припинити "
+"завантажуватися належним чином."
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
@@ -4033,10 +4075,6 @@ msgid "Copy Params"
msgstr "Копіювати параметри"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Вставити параметри"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Редагувати буфер ресурсів"
@@ -4954,7 +4992,7 @@ msgstr "Помилка перевірки хешування sha256"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
-msgstr "Помилка завантаження активу:"
+msgstr "Помилка завантаження ресурсу:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
@@ -4990,7 +5028,7 @@ msgstr "Помилка завантаження"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
-msgstr "Завантаження цього активу вже виконується!"
+msgstr "Завантаження цього ресурсу вже виконується!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
@@ -5079,7 +5117,7 @@ msgstr "Завантаження…"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
-msgstr "ZIP файл активів"
+msgstr "ZIP файл ресурсів"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid ""
@@ -5110,7 +5148,7 @@ msgid "Bake Lightmaps"
msgstr "Запікати карти освітлення"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Попередній перегляд"
@@ -5864,12 +5902,12 @@ msgid "Mesh is empty!"
msgstr "Сітка порожня!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "Створіть увігнуте статичне тіло"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "Не вдалося створити форму зіткнення Trimesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "Створити опукле статичне тіло"
+msgid "Create Static Trimesh Body"
+msgstr "Створіть увігнуте статичне тіло"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5880,12 +5918,28 @@ msgid "Create Trimesh Static Shape"
msgstr "Створити трисіткову статичну форму"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "Не вдалося створити форми!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "Не вдалося створити єдину опуклу форму зіткнення для кореня сцени."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr "Не вдалося створити єдину опуклу форму зіткнення."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "Створити єдину опуклу форму"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "Створити вигнуті форми"
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "Не вдалося створити декілька опуклих форм зіткнення для кореня сцени."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "Не вдалося створити жодних форм зіткнення."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "Створити декілька опуклих форм"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5936,18 +5990,68 @@ msgid "Create Trimesh Static Body"
msgstr "Створити увігнуте статичне тіло"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Створює StaticBody і автоматично пов'язує з ним засновану на багатокутниках "
+"форму зіткнення.\n"
+"Це найточніший (але найповільніший) варіант для виявлення зіткнення."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "Створити увігнуту область зіткнення"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "Створити опуклу області зіткнення"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"Створює засновану на багатокутниках форму зіткнення.\n"
+"Цей найточніший (але найповільніший) варіант для виявлення зіткнень."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "Створити єдину опуклу область зіткнення"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"Створює єдину опуклу форму зіткнення.\n"
+"Цей найшвидший (але найменш точний) варіант для виявлення зіткнень."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Створити декілька опуклих областей зіткнення"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"Створює засновану на багатокутниках форму зіткнення.\n"
+"Цей проміжний за швидкістю варіант між наведеними вище двома варіантами."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "Створити контурну сітку ..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"Створює статичну контурну сітку. Нормалі контурної сітки "
+"віддзеркалюватимуться автоматично.\n"
+"Цим можна скористатися замість властивості Grow SpatialMaterial, якщо "
+"використання цієї властивості є неможливим."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "Перегляд UV1"
@@ -6798,14 +6902,6 @@ msgid "Open Godot online documentation."
msgstr "Відкрити онлайнову документацію Godot."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "Запит щодо документації"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "Допоможіть у поліпшенні документації Godot наданням відгуків."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Пошук довідкової документації."
@@ -6871,12 +6967,12 @@ msgstr ""
"«%s»."
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "Рядок"
+msgid "[Ignore]"
+msgstr "[Ігнорувати]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(ігнорувати)"
+msgid "Line"
+msgstr "Рядок"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -7243,6 +7339,10 @@ msgid "This operation requires a single selected node."
msgstr "Ця операція вимагає одного обраного вузла."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "Увімкнено автоматичну ортогоналізацію"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "Зафіксувати обертання перегляду"
@@ -7331,6 +7431,10 @@ msgid "Freelook Slow Modifier"
msgstr "Модифікатор швидкості довільного огляду"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Обертання перегляду заблоковано"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7340,14 +7444,24 @@ msgstr ""
"грі."
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "Обертання перегляду заблоковано"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Вікно XForm"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"Клацніть для перемикання між станами видимості.\n"
+"\n"
+"Відкрите око: Gizmo є видимим.\n"
+"Закрите око: Gizmo приховано.\n"
+"Напівзакрите око: Gizmo є також видимим крізь непрозорі поверхні («рентген»)."
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "Приліпити вузли до підлоги"
@@ -7686,7 +7800,8 @@ msgid "New Animation"
msgstr "Нова анімація"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "Частота (кадри за сек.):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8366,7 +8481,7 @@ msgstr "Набір плиток"
msgid "No VCS addons are available."
msgstr "Немає доступних доданків систем керування версіями."
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "Помилка"
@@ -9534,11 +9649,16 @@ msgid "Export With Debug"
msgstr "Експортувати із діагностикою"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "Шляху не існує."
+msgid "The path specified doesn't exist."
+msgstr "Вказаного шляху не існує."
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Помилка під час спроби відкрити файл пакунка (дані не у форматі ZIP)."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr "Некоректний файл проєкту «.zip»: у ньому немає файла «project.godot»."
#: editor/project_manager.cpp
@@ -9546,12 +9666,12 @@ msgid "Please choose an empty folder."
msgstr "Будь ласка, виберіть порожню теку."
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr "Будь ласка, виберіть файл «project.godot» або «.zip»."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "У каталозі вже міститься проєкт Godot."
+msgid "This directory already contains a Godot project."
+msgstr "У цьому каталозі вже міститься проєкт Godot."
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9764,8 +9884,9 @@ msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
-"Не вдалося запустити проєкт: слід імпортувати вміст.\n"
-"Будь ласка, змініть проєкт так, щоб увімкнути початкове імпортування."
+"Не вдалося запустити проєкт: слід імпортувати ресурси.\n"
+"Будь ласка, відкрийте проєкт на редагування, щоб запустити початкове "
+"імпортування."
#: editor/project_manager.cpp
msgid "Are you sure to run %d projects at once?"
@@ -9812,6 +9933,7 @@ msgstr ""
"Ви справді хочете виконати пошук у %s теках наявних проєктів Godot?\n"
"Пошук може бути доволі тривалим."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "Керівник проекту"
@@ -9857,8 +9979,18 @@ msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
-"Зараз проєктів немає.\n"
-"Хочете вивчити проєкти офіційних прикладів з бібліотеки даних?"
+"Наразі у вас немає проєктів.\n"
+"Бажаєте переглянути офіційні приклади проєктів з бібліотеки ресурсів?"
+
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Поле пошуку фільтрує проєкти за назвою і останнім компонентом шляху.\n"
+"Щоб виконати фільтрування проєктів за назвою і повним шляхом, у запиті має "
+"бути принаймні один символ `/`."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10241,14 +10373,25 @@ msgid "Batch Rename"
msgstr "Пакетне перейменування"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Замінити: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "Префікс"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "Суфікс"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "Використовувати формальні вирази"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "Додаткові параметри"
@@ -10285,11 +10428,12 @@ msgstr ""
"Порівняйте параметри лічильника."
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "Лічильник на рівень"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
"Якщо позначено, лічильник перезапускатиметься для кожної групи дочірніх "
"вузлів"
@@ -10319,10 +10463,6 @@ msgstr ""
"Якщо цифр буде менше, значення доповнюватиметься початковими нулями."
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "Формальні вирази"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "Пост-обробка"
@@ -10331,11 +10471,11 @@ msgid "Keep"
msgstr "Не змінювати"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr "ГорбатийРегістр у під_креслювання"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr "під_креслювання у ГорбатийРегістр"
#: editor/rename_dialog.cpp
@@ -10354,6 +10494,15 @@ msgstr "ВЕРХНІЙ РЕГІСТР"
msgid "Reset"
msgstr "Скинути"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Помилка у формальному виразі"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "На символі %s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "Змінити батьківський вузол"
@@ -10419,8 +10568,8 @@ msgid "Instance Child Scene"
msgstr "Створити екземпляр дочірньої сцени"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "Вилучити скрипт"
+msgid "Detach Script"
+msgstr "Від'єднати скрипт"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10457,6 +10606,10 @@ msgid "Make node as Root"
msgstr "Зробити вузол кореневим"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "Вилучити %d вузлів та усі їхні дочірні записи?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "Вилучити %d вузлів?"
@@ -10585,6 +10738,16 @@ msgid "Open Documentation"
msgstr "Відкрити документацію"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"Не вдалося долучити скрипт: не зареєстровано жодної мови.\n"
+"Ймовірно, причиною є те, що цей редактор було зібрано із вимкненими модулями "
+"усіх мов."
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "Додати дочірній вузол"
@@ -10633,12 +10796,12 @@ msgstr ""
"кореневого вузла не існує."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr "Долучити новий або наявний скрипт до позначеного вузла."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "Вилучити скрипт для позначеного вузла."
+msgid "Detach the script from the selected node."
+msgstr "Від'єднати скрипт від позначеного вузла."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10769,6 +10932,10 @@ msgid "A directory with the same name exists."
msgstr "Каталог із такою назвою вже існує."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Файл не існує."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "Некоректний суфікс."
@@ -10809,6 +10976,10 @@ msgid "File exists, it will be reused."
msgstr "Файл вже існує, його буде використано повторно."
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "Неправильний шлях."
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "Некоректна назва класу."
@@ -10817,8 +10988,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Некоректна назва або шлях до успадкованого батьківського елемента."
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "Скрипт є коректним."
+msgid "Script path/name is valid."
+msgstr "Шлях до скрипту і назва скрипту є коректними."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -10841,6 +11012,14 @@ msgid "Script file already exists."
msgstr "Файл скрипту вже існує."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+"Зауваження: для вбудованих скриптів передбачено певні обмеження — їх не "
+"можна редагувати у зовнішньому редакторі."
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "Назва класу:"
@@ -10909,6 +11088,10 @@ msgid "Copy Error"
msgstr "Помилка копіювання"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "Відеопам'ять"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "Пропустити точки зупину"
@@ -10957,8 +11140,8 @@ msgid "Total:"
msgstr "Загалом:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "Відеопам'ять"
+msgid "Export list to a CSV file"
+msgstr "Експортувати список до файла CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11847,6 +12030,11 @@ msgstr ""
"ключів."
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+"У шаблоні експортування неправильно налаштовано сховище ключів випуску."
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
"Нетипове збирання потребує коректного шляху до SDK для Android у параметрах "
@@ -11868,7 +12056,7 @@ msgstr ""
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr "Неокректний відкритий ключ для розгортання APK."
+msgstr "Некоректний відкритий ключ для розгортання APK."
#: platform/android/export/export.cpp
msgid "Invalid package name:"
@@ -11876,6 +12064,42 @@ msgstr "Некоректна назва пакунка:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"Некоректний модуль «GodotPaymentV3» включено до параметрів проєкту «android/"
+"modules» (змінено у Godot 3.2.2).\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+"Щоб можна було користуватися додатками, слід позначити пункт "
+"«Використовувати нетипову збірку»."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"«.Степені свободи» працюють, лише якщо «Режим Xr» має значення «Oculus "
+"Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"«Стеженням за руками» можна скористатися, лише якщо «Режим Xr» дорівнює "
+"«Oculus Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"«Врахуванням фокуса» можна скористатися, лише якщо «Режим Xr» дорівнює "
+"«Oculus Mobile VR»."
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12092,6 +12316,15 @@ msgstr ""
"Для забезпечення працездатності CollisionShape2D слід надати форму. Будь "
"ласка, створіть ресурс форми для цього елемента!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"Засновані на багатокутниках форми не призначено для використання або "
+"редагування з вузла CollisionShape2D. Будь ласка, скористайтеся замість "
+"нього вузлом CollisionPolygon2D."
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12331,6 +12564,13 @@ msgstr ""
"Форми площин не працюють як слід, їх буде вилучено у наступних версіях. Будь "
"ласка, не використовуйте їх."
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+"У ConcavePolygonShape не передбачено підтримки RigidBody у режимі, "
+"відмінному від статичного."
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "Нічого не видно, оскільки не призначено сітки."
@@ -12355,6 +12595,11 @@ msgstr ""
"У драйвері GLES2 не передбачено підтримки GIProbes.\n"
"Скористайтеся замість них BakedLightmap."
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr "SpotLight з кутом, який є більшим за 90 градусів, не може давати тіні."
@@ -12630,6 +12875,12 @@ msgstr ""
"Control, щоб у неї був розмір. Крім того, можна зробити її RenderTarget і "
"пов'язати її внутрішню текстуру з одним із вузлів для показу."
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+"Щоб програма могла хоч щось показати, розмір поля перегляду має бути більшим "
+"за 0."
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "Некоректне джерело для попереднього перегляду."
@@ -12658,6 +12909,54 @@ msgstr "Змінні величини можна пов'язувати лише
msgid "Constants cannot be modified."
msgstr "Сталі не можна змінювати."
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "Бічна панель файлової системи та імпортування"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "При експорті або розгортанні, отриманий виконуваний файл буде намагатися "
+#~ "підключитися до IP цього комп'ютера, для налагодження."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr ""
+#~ "Поточна сцена ніколи не була збережена, будь ласка, збережіть її до "
+#~ "запуску."
+
+#~ msgid "Not in resource path."
+#~ msgstr "Не в ресурсному шляху."
+
+#~ msgid "Revert"
+#~ msgstr "Повернутися"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Цю дію не можна скасувати. Повернутися в будь-якому випадку?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "Повернути сцену"
+
+#~ msgid "Clear Script"
+#~ msgstr "Вилучити скрипт"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Відстеження помилок"
+
+#~ msgid "Request Docs"
+#~ msgstr "Запит щодо документації"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "Допоможіть у поліпшенні документації Godot наданням відгуків."
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Замінено %d випадок(-ів)."
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "Створити опукле статичне тіло"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "Не вдалося створити форми!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po
index 5cbc202847..2859b66ac9 100644
--- a/editor/translations/ur_PK.po
+++ b/editor/translations/ur_PK.po
@@ -516,6 +516,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -677,7 +678,7 @@ msgid "Line Number:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
+msgid "%d replaced."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
@@ -696,7 +697,7 @@ msgstr ""
msgid "Whole Words"
msgstr ""
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr ""
@@ -746,6 +747,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -829,7 +834,6 @@ msgstr ".تمام کا انتخاب"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -889,6 +893,11 @@ msgid "Signals"
msgstr ""
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
@@ -927,7 +936,7 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
@@ -1101,6 +1110,9 @@ msgstr ""
msgid "Lead Developer"
msgstr ""
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr ""
@@ -1122,6 +1134,14 @@ msgid "Gold Sponsors"
msgstr ""
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr ""
@@ -1429,7 +1449,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr ""
@@ -1437,18 +1457,9 @@ msgstr ""
msgid "Rearrange Autoloads"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr ""
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr ""
-
#: editor/editor_autoload_settings.cpp
-#, fuzzy
-msgid "Not in resource path."
-msgstr ".یہ ریسورس فائل پر مبنی نہی ہے"
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1475,6 +1486,10 @@ msgstr ""
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
@@ -1596,16 +1611,16 @@ msgid "Scene Tree Editing"
msgstr ""
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr ""
-
-#: editor/editor_feature_profile.cpp
#, fuzzy
msgid "Node Dock"
msgstr "ایکشن منتقل کریں"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
+msgstr ""
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
msgstr ""
#: editor/editor_feature_profile.cpp
@@ -1761,7 +1776,7 @@ msgstr ""
msgid "New Folder..."
msgstr ""
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr ""
@@ -1880,7 +1895,7 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr ""
@@ -2298,10 +2313,6 @@ msgid "There is no defined scene to run."
msgstr ""
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2386,11 +2397,14 @@ msgid "Can't reload a scene that was never saved."
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "سب سکریپشن بنائیں"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2660,10 +2674,6 @@ msgid "Redo"
msgstr ""
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2724,22 +2734,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2748,8 +2762,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2758,32 +2772,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2844,7 +2858,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr ""
@@ -2858,7 +2872,11 @@ msgid "Q&A"
msgstr ""
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+msgid "Report a Bug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3247,7 +3265,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3274,6 +3293,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
@@ -3874,19 +3897,24 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr ""
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr ""
+#, fuzzy
+msgid "%d Files"
+msgstr "اثاثہ کی زپ فائل"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
+msgid "Set as Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
-msgid " Files"
+msgid "Clear Default for '%s'"
msgstr ""
#: editor/import_dock.cpp
@@ -3902,7 +3930,7 @@ msgid "Reimport"
msgstr ""
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -3936,10 +3964,6 @@ msgid "Copy Params"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr ""
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr ""
@@ -5008,7 +5032,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -5765,11 +5789,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5781,12 +5806,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Shape"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Couldn't create any collision shapes."
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "سب سکریپشن بنائیں"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5838,19 +5881,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "سب سکریپشن بنائیں"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -6704,14 +6785,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6775,11 +6848,11 @@ msgid ""
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "[Ignore]"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+msgid "Line"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -7151,6 +7224,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr ""
@@ -7240,17 +7317,26 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7598,7 +7684,7 @@ msgid "New Animation"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8294,7 +8380,7 @@ msgstr ""
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9399,11 +9485,16 @@ msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr ""
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9411,11 +9502,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -9634,6 +9725,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -9683,6 +9775,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10063,11 +10162,19 @@ msgid "Batch Rename"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Prefix"
+msgid "Replace:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10105,11 +10212,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10135,10 +10242,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10147,11 +10250,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10170,6 +10273,14 @@ msgstr ""
msgid "Reset"
msgstr ""
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr ""
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10234,7 +10345,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Clear Script"
+msgid "Detach Script"
msgstr "سب سکریپشن بنائیں"
#: editor/scene_tree_dock.cpp
@@ -10271,6 +10382,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr ".اینیمیشن کی کیز کو ڈیلیٹ کرو"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr ".اینیمیشن کی کیز کو ڈیلیٹ کرو"
@@ -10397,6 +10513,13 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10445,11 +10568,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -10573,6 +10696,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr ""
@@ -10614,6 +10741,10 @@ msgid "File exists, it will be reused."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr ""
@@ -10622,7 +10753,7 @@ msgid "Invalid inherited parent name or path."
msgstr ""
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr ""
#: editor/script_create_dialog.cpp
@@ -10648,6 +10779,12 @@ msgid "Script file already exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
@@ -10720,6 +10857,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr ".تمام کا انتخاب"
@@ -10770,7 +10911,7 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
+msgid "Export list to a CSV file"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -11667,6 +11808,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11690,6 +11835,32 @@ msgstr ""
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11868,6 +12039,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12055,6 +12232,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12075,6 +12257,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12294,6 +12481,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr ""
@@ -12323,6 +12514,14 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "Not in resource path."
+#~ msgstr ".یہ ریسورس فائل پر مبنی نہی ہے"
+
+#, fuzzy
+#~ msgid "Clear Script"
+#~ msgstr "سب سکریپشن بنائیں"
+
+#, fuzzy
#~ msgid "Class Description"
#~ msgstr "سب سکریپشن بنائیں"
diff --git a/editor/translations/vi.po b/editor/translations/vi.po
index d6f5114a98..2b56df15ed 100644
--- a/editor/translations/vi.po
+++ b/editor/translations/vi.po
@@ -9,15 +9,19 @@
# Tung Le <tungkradle@gmail.com>, 2017.
# 38569459 <xxx38569459@gmail.com>, 2018.
# TyTYct Hihi <tytyct@gmail.com>, 2019.
-# Steve Dang <itsnguu@outlook.com>, 2019.
+# Steve Dang <itsnguu@outlook.com>, 2019, 2020.
# Peter Anh <peteranh3105@gmail.com>, 2019.
# Dũng Đinh <dqdthanhthanh@gmail.com>, 2019.
+# Steve Dang <bynguu@outlook.com>, 2020.
+# Harry Mitchell <minhyh0987@gmail.com>, 2020.
+# HSGamer <huynhqtienvtag@gmail.com>, 2020.
+# LetterC67 <hoangdeptoong@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-10-04 03:15+0000\n"
-"Last-Translator: Dũng Đinh <dqdthanhthanh@gmail.com>\n"
+"PO-Revision-Date: 2020-08-11 14:04+0000\n"
+"Last-Translator: LetterC67 <hoangdeptoong@gmail.com>\n"
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/"
"godot/vi/>\n"
"Language: vi\n"
@@ -25,30 +29,30 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.9-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Hàm convert() có đối số không hợp lệ, sử dụng các hằng TYPE_*."
+msgstr "Hàm convert() có loại đối số không hợp lệ, sử dụng các hằng TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Mong đợi một chuỗi có độ dài 01 ký tự."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Số byte không đủ để giải mã, hoặc cấu trúc không chính xác."
+msgstr "Không đủ byte để giải mã, hoặc định dạng không hợp lệ."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Dữ liệu vào không hợp lệ %i (không được thông qua)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self không thể sử dụng vì instance là null (không thông qua)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -56,11 +60,11 @@ msgstr "Toán hạng không hợp lệ cho toán tử %s, %s và %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr ""
+msgstr "Index không hợp lệ của loại %s cho loại cơ sở %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Tên index không hợp lệ '%s' cho loại cơ sở %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
@@ -68,39 +72,39 @@ msgstr "Đối số không hợp lệ để dựng '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Khi cuộc gọi đến '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "Miễn phí"
+msgstr "Tự do"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -108,7 +112,7 @@ msgstr "Cân bằng"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "Phản chiếu"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -120,7 +124,7 @@ msgstr "Giá trị:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "Thêm Khoá Tại Đây"
+msgstr "Chèn Khóa Tại Đây"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
@@ -128,7 +132,7 @@ msgstr "Nhân đôi các khoá đã chọn"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "Xoá Key(s) được chọn"
+msgstr "Xoá các khoá được chọn"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
@@ -136,23 +140,23 @@ msgstr "Thêm điểm Bezier"
#: editor/animation_bezier_editor.cpp
msgid "Move Bezier Points"
-msgstr "Di chuyển điểm Bezier"
+msgstr "Di chuyển các điểm Bezier"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Nhân đôi Các Key của Animation"
+msgstr "Nhân đôi các Animation Key"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Xóa phím Anim"
+msgstr "Xóa các Animation Key"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "Đổi thời gian khung hình"
+msgstr "Đổi thời gian khung hình Animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "Đổi Transition Animation"
+msgstr "Đổi Animation Chuyển tiếp"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
@@ -160,7 +164,7 @@ msgstr "Đổi Transform Animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Đổi giá trị khung hình"
+msgstr "Đổi giá trị khung hình Animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
@@ -256,39 +260,36 @@ msgid "Anim Clips:"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Track Path"
-msgstr "Đổi giá trị Array"
+msgstr "Thay đổi đường dẫn Track"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr ""
+msgstr "Bật tắt track này on/off."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Cập nhật chế độ (Cách thuộc tính được thiết lập)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr ""
+msgstr "Nội suy"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Bọc vòng lặp (Nội suy kết thúc với việc bắt đầu vòng lặp)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Bỏ track đang chọn."
+msgstr "Bỏ track này."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Bước (s):"
+msgstr "Bước: "
#: editor/animation_track_editor.cpp
msgid "Toggle Track Enabled"
-msgstr ""
+msgstr "Bật tắt kích hoạt Track"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -304,7 +305,7 @@ msgstr "Kích hoạt"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "Chụp"
#: editor/animation_track_editor.cpp
msgid "Nearest"
@@ -321,11 +322,11 @@ msgstr "Khối"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Kẹp vòng nội suy"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Bọc vòng lặp nội suy"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -415,6 +416,10 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Các bản âm thanh chỉ có thể trỏ đến các nút:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
@@ -433,40 +438,36 @@ msgid "Invalid track for Bezier (no suitable sub-properties)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "Thêm Track Animation"
+msgstr "Thêm Bezier Track"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Đường dẫn không hợp lệ, không thể thêm khoá."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Track không phải loại Spatial, không thể thêm khoá"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "Chèn Track & Key Anim"
+msgstr "Thêm khoá Transform Track"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "Thêm Track Animation"
+msgstr "Thêm khoá Track"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Đường dẫn Track không hợp lệ, không thể thêm khoá phương thức."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "Chèn Track & Key Anim"
+msgstr "Thêm khoá Method Track"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr ""
+msgstr "Không tìm thấy phương thức trong đối tượng: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
@@ -514,11 +515,11 @@ msgstr "Chọn một AnimationPlayer từ Scene Tree để chỉnh sửa animati
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Chỉ hiển thị các track từ các nút đã chọn trong cây."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Nhóm các track bởi nút hoặc hiển thị chúng dạng danh sách đơn giản."
#: editor/animation_track_editor.cpp
msgid "Snap:"
@@ -533,6 +534,7 @@ msgid "Seconds"
msgstr "Giây"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -694,8 +696,9 @@ msgid "Line Number:"
msgstr "Dòng số:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "Đã thay thế %d biến cố."
+#, fuzzy
+msgid "%d replaced."
+msgstr "Thay thế ..."
#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
@@ -715,7 +718,7 @@ msgstr "Khớp Trường Hợp"
msgid "Whole Words"
msgstr "Cả từ"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "Thay thế"
@@ -765,6 +768,11 @@ msgid "Method in target node must be specified."
msgstr "Phương thức trong nút đích phải được chỉ định."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Phương thức trong nút đích phải được chỉ định."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -848,7 +856,6 @@ msgstr "Không thể kết nối tín hiệu"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -905,6 +912,11 @@ msgid "Signals"
msgstr "Tín hiệu (Signal)"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "Lọc tệp tin ..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "Bạn có chắc muốn xóa bỏ tất cả kết nối từ tín hiệu này?"
@@ -942,7 +954,7 @@ msgid "Recent:"
msgstr "Gần đây:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Tìm kiếm:"
@@ -1116,15 +1128,18 @@ msgstr "Đóng góp vào Godot Engine"
#: editor/editor_about.cpp
msgid "Project Founders"
-msgstr "Sáng lập dự án"
+msgstr "Các đồng sáng lập dự án"
#: editor/editor_about.cpp
msgid "Lead Developer"
msgstr "Phát triển chính"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr "Quản lí dự án "
+msgstr "Quản lí Dự án "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1143,6 +1158,16 @@ msgid "Gold Sponsors"
msgstr "Nhà tài trợ Vàng"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "Người ủng hộ Bạc"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "Người ủng hộ Đồng"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "Nhà tài trợ Nhỏ"
@@ -1457,7 +1482,7 @@ msgstr ""
msgid "Remove Autoload"
msgstr ""
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "Mở"
@@ -1465,17 +1490,8 @@ msgstr "Mở"
msgid "Rearrange Autoloads"
msgstr "Sắp xếp lại Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "Đường dẫn sai."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "Tệp không tồn tại."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
+msgid "Can't add autoload:"
msgstr ""
#: editor/editor_autoload_settings.cpp
@@ -1503,6 +1519,10 @@ msgstr "Tên"
msgid "Singleton"
msgstr "Singleton"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "Dán các đối số"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "Cập nhật Cảnh"
@@ -1570,12 +1590,16 @@ msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
+"Nền tảng yêu cầu dùng kiểu nén 'ETC' cho GLES2. Bật 'Nhập ETC' trong Cài đặt "
+"Dự án."
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
+"Nền tảng yêu cầu dùng kiểu nén 'ETC2' cho GLES3. Bật 'Nhập ETC2' trong Cài "
+"đặt Dự án."
#: editor/editor_export.cpp
msgid ""
@@ -1584,6 +1608,9 @@ msgid ""
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
+"Nền tảng yêu cầu kiểu nén 'ETC' cho trình điều khiển dự phòng GLES2.\n"
+"Chọn kích hoạt 'Nhập ETC' trong Cài đặt Dự án, hoặc chọn tắt 'Kích hoạt "
+"Trình điều khiển Dự phòng'."
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1622,19 +1649,19 @@ msgid "Scene Tree Editing"
msgstr "Chỉnh sửa cảnh"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "Nhập vào"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "Nút"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "Hệ thống tập tin"
#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "Nhập vào"
+
+#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
msgstr "Xoá hồ sơ '%s'? (không hoàn tác)"
@@ -1784,7 +1811,7 @@ msgstr "Xem trong trình quản lý tệp"
msgid "New Folder..."
msgstr "Thư mục mới ..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "Làm mới"
@@ -1902,7 +1929,7 @@ msgstr "Các Thư mục và Tệp tin:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "Xem thử:"
@@ -2343,10 +2370,6 @@ msgid "There is no defined scene to run."
msgstr "Không có cảnh được xác định để chạy."
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "Cảnh hiện tại chưa được lưu, hãy lưu nó trước khi chạy."
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "Không thể bắt đầu quá trình nhỏ!"
@@ -2432,12 +2455,14 @@ msgstr "Không thể nạp một cảnh mà chưa lưu bao giờ."
#: editor/editor_node.cpp
#, fuzzy
-msgid "Revert"
-msgstr "Trở lại"
+msgid "Reload Saved Scene"
+msgstr "Lưu Cảnh"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "Hành động này không thể hoàn tác. Trở lại luôn?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2453,7 +2478,7 @@ msgstr "Thoát trình biên tập?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr "Mở Quản lý dự án?"
+msgstr "Mở Quản lý Dự án?"
#: editor/editor_node.cpp
msgid "Save & Quit"
@@ -2465,7 +2490,7 @@ msgstr "Lưu thay đổi trong các scene sau trước khi thoát?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr "Lưu thay đổi trong các scene sau trước khi mở Project Manager?"
+msgstr "Lưu thay đổi trong các cảnh sau trước khi mở Quản lí Dự án?"
#: editor/editor_node.cpp
msgid ""
@@ -2528,7 +2553,7 @@ msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
-"Lỗi nạp cảnh, nó phải trong đường dẫn dự án. Sử dụng 'Nhập vào' để mở cảnh, "
+"Lỗi nạp cảnh, nó phải trong đường dẫn dự án. Sử dụng 'Nhập' để mở các cảnh, "
"sau đó lưu lại trong đường dẫn dự án."
#: editor/editor_node.cpp
@@ -2555,7 +2580,7 @@ msgid ""
"category."
msgstr ""
"Cảnh đã chọn '%s' không tồn tại, chọn một cảnh hợp lệ?\n"
-"Bạn có thể thay đổi nó sau trong \"Cài đặt dự án\", nằm trong mục 'ứng dụng'."
+"Bạn có thể thay đổi nó sau trong \"Cài đặt Dự án\", nằm trong mục 'ứng dụng'."
#: editor/editor_node.cpp
msgid ""
@@ -2563,8 +2588,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"Chọn '%s' không phải một tệp cảnh, chọn tệp cảnh hợp lệ?\n"
-"Bạn có thể thay đổi nó sau trong \"Cài đặt dự án\", nằm trong mục 'ứng dụng'."
+"'%s' không phải một tệp phân cảnh, chọn tệp phân cảnh hợp lệ?\n"
+"Bạn có thể thay đổi nó sau trong \"Cài đặt Dự án\", nằm trong mục 'ứng dụng'."
#: editor/editor_node.cpp
msgid "Save Layout"
@@ -2717,22 +2742,17 @@ msgid "Redo"
msgstr "Làm lại"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
-msgstr ""
+msgstr "Linh tinh dự án hoặc công cụ toàn phân cảnh."
#: editor/editor_node.cpp editor/project_manager.cpp
#: editor/script_create_dialog.cpp
msgid "Project"
-msgstr "Dự án"
+msgstr "Dự Án"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "List Project"
+msgstr "Cài đặt Dự Án"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -2759,7 +2779,7 @@ msgstr "Cài đặt mẫu xây dựng Android"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
-msgstr "Mở thư mục dữ liệu dự án"
+msgstr "Mở Thư mục dữ liệu của Dự Án"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
@@ -2772,7 +2792,7 @@ msgstr "Lưu tài nguyên thành ..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "Thoát danh sách dự án"
+msgstr "Thoát khỏi Danh sách Dự án"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -2785,25 +2805,33 @@ msgstr "Triển khai gỡ lỗi từ xa"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"Khi xuất ra hoặc triển khai, kết quả thực thi sẽ kết nối đến IP máy tính này "
-"để được gỡ lỗi."
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
+"Khi tuỳ chọn này được bật, lúc xuất hoặc triển khai sẽ tạo một tệp thực thi "
+"tối giản nhất.\n"
+"Hệ thống tệp tin sẽ được cung cấp từ dự án bởi trình soạn thảo qua mạng.\n"
+"Trên nền tảng Android, triển khai sẽ sử dụng cáp USB để có hiệu suất nhanh "
+"hơn. Tuỳ chọn này tăng tốc độ khi thử nghiệm cho các trò chơi nặng."
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
@@ -2811,8 +2839,8 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2821,32 +2849,32 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+msgid "Synchronize Script Changes"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -2898,9 +2926,8 @@ msgid "Manage Editor Features..."
msgstr "Quản lý tính năng Trình biên tập"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "Quản lý mẫu Xuất ra"
+msgstr "Quản lý Các Mẫu Xuất Bản ..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2911,7 +2938,7 @@ msgstr "Trợ giúp"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "Tìm kiếm"
@@ -2925,8 +2952,13 @@ msgid "Q&A"
msgstr "Hỏi và Đáp"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "Theo dõi vấn đề"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "Nhập vào lại"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3005,7 +3037,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Inspector"
-msgstr "Quản lý đối tượng"
+msgstr "Quan Sát Viên"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
@@ -3022,10 +3054,11 @@ msgstr "Không Lưu"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
msgstr ""
+"Mẫu xuất bản cho Android bị thiếu, vui lòng cài các mẫu xuất bản liên quan."
#: editor/editor_node.cpp
msgid "Manage Templates"
-msgstr "Quản lý Mẫu"
+msgstr "Quản lý Mẫu xuất bản"
#: editor/editor_node.cpp
msgid ""
@@ -3037,6 +3070,12 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
+"Điều 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 nguồn mẫu thành \"res://android/build\".\n"
+"Bạn có thể áp dụng các sửa đổi và xây dựng APK tùy chỉnh khi xuất (thêm các "
+"mô-đun, thay đổi AndroidManifest.xml, ...).\n"
+"Lưu ý rằng để tạo các bản dựng tùy chỉnh, tùy chọn \"Sử dụng Bản dựng Tùy "
+"chỉnh\" phải được BẬT trong Cài đặt xuất Android."
#: editor/editor_node.cpp
msgid ""
@@ -3045,15 +3084,17 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
+"Mẫu bản dựng cho Android đã được cài đặt trong dự án này sẽ không bị ghi "
+"đè.\n"
+"Xóa thủ công thư mục \"res://android/build\" trước khi thử lại thao tác này."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
-msgstr "Nhập mẫu vào từ tệp nén ZIP"
+msgstr "Nạp các mẫu xuất bản bằng tệp ZIP"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Khung project"
+msgstr "Gói Ví Dụ"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3315,7 +3356,8 @@ msgstr "Thêm cặp Khoá/Giá trị"
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3342,6 +3384,10 @@ msgstr ""
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "Chọn Nút để Nhập"
@@ -3378,7 +3424,7 @@ msgstr "Tải"
#: editor/export_template_manager.cpp
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "Các mẫu xuất bản chính thức không có sẵn cho các bản dựng phát triển."
#: editor/export_template_manager.cpp
msgid "(Missing)"
@@ -3398,23 +3444,23 @@ msgstr "Xóa template phiên bản '%s'?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
-msgstr ""
+msgstr "Không thể mở tệp zip các mẫu xuất bản."
#: editor/export_template_manager.cpp
msgid "Invalid version.txt format inside templates: %s."
-msgstr ""
+msgstr "Định dạng version.txt không hợp lệ bên trong các mẫu xuất bản: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr "Không thấy version.txt trong templates."
+msgstr "Không thấy version.txt trong các mẫu xuất bản."
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
-msgstr ""
+msgstr "Lỗi tạo đường dẫn đến các mẫu xuất bản:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
-msgstr ""
+msgstr "Trích xuất các Mẫu xuất bản"
#: editor/export_template_manager.cpp
msgid "Importing:"
@@ -3476,6 +3522,8 @@ msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"Cài đặt các mẫu xuất bản thất bại.\n"
+"Các lưu trữ mẫu xuất bản có vấn đề có thể được tìm thấy tại '%s'."
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3554,9 +3602,8 @@ msgid "Select Template File"
msgstr "Chọn file template"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "Quản lý mẫu Xuất ra"
+msgstr "Các mẫu xuất bản Godot"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -3564,7 +3611,7 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "Download Templates"
-msgstr "Tải các Mẫu"
+msgstr "Tải Xuống Các Mẫu Xuất Bản"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
@@ -3776,8 +3823,8 @@ msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
msgstr ""
-"Bao gồm các tệp tin với các phần mở rộng sau. Thêm hoặc loại bỏ chúng trong "
-"Cài đặt Dự án."
+"Bao gồm các tệp tin với các phần mở rộng. Thêm hoặc loại bỏ chúng trong Cài "
+"đặt Dự án."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3843,9 +3890,8 @@ msgid "Groups"
msgstr "Nhóm (Groups)"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes Not in Group"
-msgstr "Nút không trong Nhóm"
+msgstr "Các nút không trong Nhóm"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
@@ -3943,10 +3989,19 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "Đang lưu ..."
#: editor/import_dock.cpp
+#, fuzzy
+msgid "%d Files"
+msgstr " Tệp tin"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "Gán Mặc định cho '%s'"
@@ -3955,10 +4010,6 @@ msgid "Clear Default for '%s'"
msgstr "Dọn Mặc định cho '%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " Tệp tin"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "Nhập vào với:"
@@ -3972,7 +4023,8 @@ msgid "Reimport"
msgstr "Nhập vào lại"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+#, fuzzy
+msgid "Save Scenes, Re-Import, and Restart"
msgstr "Lưu các cảnh, nhập vào lại và khởi động lại"
#: editor/import_dock.cpp
@@ -4006,10 +4058,6 @@ msgid "Copy Params"
msgstr "Sao chép các đối số"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "Dán các đối số"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "Chỉnh sửa Tài nguyên trên Clipboard"
@@ -4071,7 +4119,7 @@ msgstr ""
#: editor/node_dock.cpp
msgid "Select a single node to edit its signals and groups."
-msgstr ""
+msgstr "Chọn nút duy nhất để chỉnh sửa tính hiệu và nhóm của nó."
#: editor/plugin_config_dialog.cpp
msgid "Edit a Plugin"
@@ -4178,7 +4226,7 @@ msgstr "Đổi Thời gian Chuyển Animation"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "Loại nút này không thể sử dụng. Chỉ các nút gốc được phép."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4196,7 +4244,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
-msgstr ""
+msgstr "Di chuyển điểm nút BlendSpace1D"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4269,7 +4317,7 @@ msgstr "Xoá Variable"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D không thuộc nút AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
@@ -4308,11 +4356,11 @@ msgstr "Chỉnh sửa Lọc"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Nút đầu ra không thể thêm vào cây Blend."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Add Node to BlendTree"
-msgstr ""
+msgstr "Thêm nút vào cây Blend"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -4507,7 +4555,7 @@ msgstr "Vị trí hoạt ảnh (giây)."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Scale animation playback globally for the node."
-msgstr ""
+msgstr "Quy mô trình phát hoạt ảnh toàn cầu cho các nút."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
@@ -4653,7 +4701,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Các nút bắt đầu và kết thúc là cần thiết cho một sub-transition."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "No playback resource set at path: %s."
@@ -4708,9 +4756,8 @@ msgid "Transition: "
msgstr "Chuyển tiếp: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "Nhập từ Node:"
+msgstr "Chế độ chơi:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4815,31 +4862,31 @@ msgstr "Nút Chạy một lần"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Mix Node"
-msgstr ""
+msgstr "Nút Mix"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend2 Node"
-msgstr ""
+msgstr "Nút Blend2"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend3 Node"
-msgstr ""
+msgstr "Nút Blend3"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend4 Node"
-msgstr ""
+msgstr "Nút Blend4"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeScale Node"
-msgstr ""
+msgstr "Nút TimeScale"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeSeek Node"
-msgstr ""
+msgstr "Nút TimeSeek"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
-msgstr ""
+msgstr "Nút Transition"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Import Animations..."
@@ -4847,7 +4894,7 @@ msgstr "Nhập vào các hoạt ảnh ..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr "Chỉnh sửa lọc Node"
+msgstr "Chỉnh bộ lọc Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
@@ -5088,7 +5135,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "Xem thử"
@@ -5145,9 +5192,8 @@ msgid "Move Horizontal Guide"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "Tạo Root Node:"
+msgstr "Tạo đường Guide ngang"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -5468,19 +5514,19 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Anchor"
-msgstr ""
+msgstr "Snap đến neo của Nút"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Sides"
-msgstr ""
+msgstr "Snap sang hai bên nút"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Node Center"
-msgstr ""
+msgstr "Snap đến chính giữa nút"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Other Nodes"
-msgstr ""
+msgstr "Snap đế các nút khác"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to Guides"
@@ -5516,7 +5562,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Tạo xương tuỳ chọn từ các nút"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Custom Bones"
@@ -5637,7 +5683,7 @@ msgstr "Đang thêm %s..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
-msgstr ""
+msgstr "Không thể khởi tạo nhiều nút mà không có nút gốc."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -5658,6 +5704,8 @@ msgid ""
"Drag & drop + Shift : Add node as sibling\n"
"Drag & drop + Alt : Change node type"
msgstr ""
+"Kéo & thả + Shift: Thêm nút cùng cấp\n"
+"Kéo & thả + Alt: Đổi loại nút"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Create Polygon3D"
@@ -5747,7 +5795,7 @@ msgstr ""
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emission Points From Node"
-msgstr ""
+msgstr "Tạo điểm phát xạ từ nút"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Flat 0"
@@ -5849,11 +5897,11 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
+msgid "Couldn't create a Trimesh collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5865,13 +5913,31 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
-msgstr "Tạo nodes mới."
+msgid "Create Single Convex Shape"
+msgstr "Tạo hình dạng lồi"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "Không thể tạo folder."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
+msgstr "Tạo hình dạng lồi"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5922,19 +5988,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Single Convex Collision Sibling"
msgstr "Tạo"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "Tạo"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr ""
@@ -5993,6 +6097,7 @@ msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
msgstr ""
+"Không có nguồn lưới được chỉ định (và không có MultiMesh đặt trong nút)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
@@ -6188,9 +6293,8 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Split Curve"
-msgstr "Sửa Node Curve"
+msgstr "Chia đường Curve"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
@@ -6307,7 +6411,7 @@ msgstr "Di chuyển đến..."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Thuộc tính xương của nút Polygon2D không trỏ đến nút Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Sync Bones"
@@ -6795,14 +6899,6 @@ msgid "Open Godot online documentation."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -6849,9 +6945,8 @@ msgid "Clear Recent Scripts"
msgstr "Dọn các cảnh gần đây"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Connections to method:"
-msgstr "Kết nối đến Node:"
+msgstr "Kết nối đến phương thức:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
msgid "Source"
@@ -6862,10 +6957,14 @@ msgid "Target"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "Không có kết nối đến input '%s' của node '%s'."
+msgstr ""
+"Không có phương thức kết nối '%s' của tín hiệu '%s' từ nút '%s' đến nút '%s'."
+
+#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6873,10 +6972,6 @@ msgid "Line"
msgstr "Dòng:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "Thêm Hàm"
@@ -6888,7 +6983,7 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
-msgstr ""
+msgstr "Không thể bỏ nút vì script '%s' không sử dụng trong cảnh này."
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
@@ -7069,7 +7164,7 @@ msgstr ""
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Bộ xương không có xương, tạo một số nút Bone2D."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
#, fuzzy
@@ -7247,6 +7342,10 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "This operation requires a single selected node."
+msgstr "Hoạt động yêu cầu chọn một nút duy nhất."
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -7339,22 +7438,31 @@ msgid "Freelook Slow Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
+msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr ""
+msgstr "Snap các nút đến Floor"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
@@ -7700,7 +7808,7 @@ msgid "New Animation"
msgstr "Tạo Animation mới"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8127,18 +8235,16 @@ msgid "Occlusion"
msgstr "Tạo"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation"
-msgstr "Animation Node"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Bitmask"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority"
-msgstr "Nhập từ Node:"
+msgstr "Ưu tiên"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Z Index"
@@ -8159,18 +8265,16 @@ msgid "Occlusion Mode"
msgstr "Tạo"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation Mode"
-msgstr "Animation Node"
+msgstr "Chế độ Navigation"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Bitmask Mode"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "Nhập từ Node:"
+msgstr "Chế độ Ưu tiên"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8195,9 +8299,8 @@ msgid "Erase bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "Tạo nodes mới."
+msgstr "Tạo hình chữ nhật mới."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -8406,7 +8509,7 @@ msgstr "Xuất Tile Set"
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -8440,9 +8543,8 @@ msgid "Staging area"
msgstr ""
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Detect new changes"
-msgstr "Tạo nodes mới."
+msgstr "Phát hiện thay đổi mới"
#: editor/plugins/version_control_editor_plugin.cpp
#, fuzzy
@@ -8574,7 +8676,7 @@ msgstr "Phiên bản hiện tại:"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Resize VisualShader node"
-msgstr ""
+msgstr "Thay đổi kích thước nút VisualShader"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
@@ -8586,22 +8688,20 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node to Visual Shader"
-msgstr ""
+msgstr "Thêm nút vào Visual Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Nodes"
-msgstr "Nhân đôi Node(s)"
+msgstr "Nhân bản các nút"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste Nodes"
-msgstr ""
+msgstr "Dán các nút"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Nodes"
-msgstr "Xóa Node(s)"
+msgstr "Xoá các nút"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Input Type Changed"
@@ -8620,14 +8720,12 @@ msgid "Light"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Show resulted shader code."
-msgstr "Tạo Root Node:"
+msgstr "Hiện kết quả mã shader."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Create Shader Node"
-msgstr "Tạo Root Node:"
+msgstr "Tạo nút Shader"
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
@@ -9357,6 +9455,8 @@ msgid ""
"Failed to export the project for platform '%s'.\n"
"Export templates seem to be missing or invalid."
msgstr ""
+"Không thể xuất bản dự án cho nền tảng '%s'.\n"
+"Mẫu xuất bản dường như bị thiếu hoặc không hợp lệ."
#: editor/project_export.cpp
msgid ""
@@ -9364,6 +9464,9 @@ msgid ""
"This might be due to a configuration issue in the export preset or your "
"export settings."
msgstr ""
+"Không thể xuất dự án cho nền tảng '%s'.\n"
+"Có thể là do vấn đề cấu hình trong cài đặt xuất bản hoặc cài đặt xuất bản "
+"của bạn."
#: editor/project_export.cpp
msgid "Release"
@@ -9379,7 +9482,7 @@ msgstr ""
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
-msgstr ""
+msgstr "Các mẫu xuất bản cho nền tảng này bị thiếu/hỏng:"
#: editor/project_export.cpp
msgid "Presets"
@@ -9406,7 +9509,7 @@ msgstr ""
#: editor/project_export.cpp
msgid "Export all resources in the project"
-msgstr ""
+msgstr "Xuất ra tất cả tài nguyên dùng trong dự án"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
@@ -9435,6 +9538,8 @@ msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
+"Bộ lọc loại trừ các tệp tin/thư mục khỏi từ dự án\n"
+"(phân tách bằng dấu phẩy, ví dụ: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
@@ -9467,9 +9572,8 @@ msgid "Script"
msgstr "Tạo Script"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script Export Mode:"
-msgstr "Nhập từ Node:"
+msgstr "Chế độ xuất Script:"
#: editor/project_export.cpp
msgid "Text"
@@ -9497,12 +9601,11 @@ msgstr ""
#: editor/project_export.cpp
msgid "Export Project"
-msgstr "Xuất dự án ra"
+msgstr "Xuất bản Dự án"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Nhập từ Node:"
+msgstr "Chế độ xuất?"
#: editor/project_export.cpp
#, fuzzy
@@ -9520,48 +9623,55 @@ msgstr ""
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
-msgstr ""
+msgstr "Các mẫu xuất bản cho nền tảng này bị thiếu:"
#: editor/project_export.cpp
msgid "Manage Export Templates"
-msgstr "Quản lý mẫu Xuất ra"
+msgstr "Quản Lý Các Mẫu Xuất Bản"
#: editor/project_export.cpp
msgid "Export With Debug"
msgstr ""
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr ""
+#, fuzzy
+msgid "The path specified doesn't exist."
+msgstr "Tệp không tồn tại."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+#, fuzzy
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "Lỗi không thể mở gói, không phải dạng nén."
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
+"Tệp dự án \".zip\" không hợp lệ; trong nó không chứa tệp \"project.godot\"."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr ""
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "Chọn tệp \"project.godot\" hoặc tệp \".zip\"."
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr ""
+msgid "This directory already contains a Godot project."
+msgstr "Thư mục này đã chứa một dự án Godot."
#: editor/project_manager.cpp
msgid "New Game Project"
-msgstr ""
+msgstr "Dự án Trò chơi Mới"
#: editor/project_manager.cpp
msgid "Imported Project"
-msgstr ""
+msgstr "Đã nạp Dự án"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "Kích thước font không hợp lệ."
+msgstr "Tên dự án không hợp lệ."
#: editor/project_manager.cpp
msgid "Couldn't create folder."
@@ -9573,33 +9683,35 @@ msgstr ""
#: editor/project_manager.cpp
msgid "It would be a good idea to name your project."
-msgstr ""
+msgstr "Nó là một ý tưởng tuyệt để đặt tên cho dự án của bạn."
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr ""
+msgstr "Đường dẫn dự án không hợp lệ (bạn có thay đổi điều gì?)."
#: editor/project_manager.cpp
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
+"Không thể nạp 'project.godot' trong đường dẫn dự án (lỗi %d). Nó có thể bị "
+"thiếu hoặc đã hỏng."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
-msgstr ""
+msgstr "Không thể chỉnh sửa 'project.godot' trong đường dẫn dự án."
#: editor/project_manager.cpp
msgid "Couldn't create project.godot in project path."
-msgstr ""
+msgstr "Không thể tạo 'project.godot' trong đường dẫn dự án."
#: editor/project_manager.cpp
msgid "Rename Project"
-msgstr ""
+msgstr "Đổi tên Dự án"
#: editor/project_manager.cpp
msgid "Import Existing Project"
-msgstr ""
+msgstr "Nạp Dự án có sẵn"
#: editor/project_manager.cpp
msgid "Import & Edit"
@@ -9607,7 +9719,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Create New Project"
-msgstr ""
+msgstr "Tạo mới Dự án"
#: editor/project_manager.cpp
msgid "Create & Edit"
@@ -9615,7 +9727,7 @@ msgstr "Tạo & Sửa"
#: editor/project_manager.cpp
msgid "Install Project:"
-msgstr ""
+msgstr "Cài đặt Dự án:"
#: editor/project_manager.cpp
msgid "Install & Edit"
@@ -9623,15 +9735,15 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Project Name:"
-msgstr ""
+msgstr "Tên Dự án:"
#: editor/project_manager.cpp
msgid "Project Path:"
-msgstr ""
+msgstr "Đường dẫn Dự án:"
#: editor/project_manager.cpp
msgid "Project Installation Path:"
-msgstr ""
+msgstr "Đường dẫn cài đặt Dự án:"
#: editor/project_manager.cpp
msgid "Renderer:"
@@ -9667,25 +9779,23 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Unnamed Project"
-msgstr ""
+msgstr "Dự án không tên"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "Dự án"
+msgstr "Dự án bị lỗi"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr ""
+msgstr "Lỗi: Dự án bị thiếu trên hệ thống tệp tin."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't open project at '%s'."
-msgstr "Không thể chạy project"
+msgstr "Không thể mở dự án tại '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
-msgstr ""
+msgstr "Bạn chắc chắn mở nhiều hơn một dự án?"
#: editor/project_manager.cpp
msgid ""
@@ -9699,6 +9809,13 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Tệp dự án không chỉ định phiên bản Godot mà nó được tạo.\n"
+"\n"
+"%s\n"
+"\n"
+"Nếu bạn vẫn tiến hành mở dự án, tệp dự án sẽ được chuyển đổi sang cấu hình "
+"Godot hiện tại.\n"
+"Cảnh báo: Bạn sẽ không thể mở dự án với các phiên bản cũ của Godot nữa."
#: editor/project_manager.cpp
msgid ""
@@ -9711,12 +9828,21 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
+"Tệp dự án được tạo bởi phiên bản Godot cũ và cần được chuyển đổi cho phiên "
+"bản này:\n"
+"\n"
+"%s\n"
+"\n"
+"Bạn có muốn chuyển đổi nó?\n"
+"Cảnh báo: Bạn sẽ không thể mở dự án với các phiên bản Godot cũ nữa."
#: editor/project_manager.cpp
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
msgstr ""
+"Các cài đặt dự án đã được tạo bởi phiên bản Godot mới, có các cài đặt không "
+"tương thích với phiên bản này."
#: editor/project_manager.cpp
msgid ""
@@ -9724,53 +9850,68 @@ msgid ""
"Please edit the project and set the main scene in the Project Settings under "
"the \"Application\" category."
msgstr ""
+"Không thể chạy dự án: chưa chọn phân cảnh chính.\n"
+"Để chọn phân cảnh chính, mở \"Cài đặt Dự án\" sau đó vào mục \"Ứng dụng\"."
#: editor/project_manager.cpp
msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
+"Không thể chạy dự án: Các tài sản chưa được nạp.\n"
+"Vui lòng thiết lập dự án để kích hoạt nạp tài sản ban đầu."
#: editor/project_manager.cpp
msgid "Are you sure to run %d projects at once?"
-msgstr ""
+msgstr "Bạn có chắc chắn chạy các dự án %d cùng lúc?"
#: editor/project_manager.cpp
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
+"Gỡ các dự án %d khỏi danh sách?\n"
+"Nội dung các thư mục dự án sẽ không được sửa đổi."
#: editor/project_manager.cpp
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
msgstr ""
+"Gỡ dự án này khỏi danh sách?\n"
+"Nội dung của thư mục dự án sẽ không được sửa đổi."
#: editor/project_manager.cpp
msgid ""
"Remove all missing projects from the list?\n"
"The project folders' contents won't be modified."
msgstr ""
+"Gỡ tất cả dự án bị hỏng khỏi danh sách?\n"
+"Nội dung các thư mục dự án sẽ không bị sửa đổi."
#: editor/project_manager.cpp
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
+"Đã thay đổi ngôn ngữ.\n"
+"Giao diện sẽ cập nhật sau khi khởi động lại trình biên tập hoặc trình quản "
+"lí dự án."
#: editor/project_manager.cpp
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
+"Bạn có chắc chắn quét các thư mục %s để tìm các dự án Godot có sẵn?\n"
+"Điều này sẽ mất chút thời gian."
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr ""
+msgstr "Trình quản lý Dự án"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
msgstr "Dự án"
@@ -9788,7 +9929,7 @@ msgstr "Chọn một Folder để Quét"
#: editor/project_manager.cpp
msgid "New Project"
-msgstr "Tạo Project"
+msgstr "Tạo Dự Án"
#: editor/project_manager.cpp
#, fuzzy
@@ -9797,7 +9938,7 @@ msgstr "Xóa Animation"
#: editor/project_manager.cpp
msgid "Templates"
-msgstr "Khung project"
+msgstr "Thư Viện"
#: editor/project_manager.cpp
msgid "Restart Now"
@@ -9805,16 +9946,25 @@ msgstr "Restart ngay"
#: editor/project_manager.cpp
msgid "Can't run project"
-msgstr "Không thể chạy project"
+msgstr "Không thể chạy dự án"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
-"Hiện giờ bạn không có project nào.\n"
-"Bạn có muốn xem các project official ví dụ trên Asset Library không?"
+"Hiện tại bạn không có bất kỳ dự án nào.\n"
+"Bạn có muốn xem qua các dự án ví dụ trên Thư Viện không?"
+
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"Hộp tìm kiếm lọc các dự án theo tên và phần cuối đường dẫn.\n"
+"Để lọc các dự án theo tên và đường dẫn đầy đủ, truy vấn phải chứa ít nhất "
+"một ký tự '/'."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10040,7 +10190,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Project Settings (project.godot)"
-msgstr ""
+msgstr "Cài đặt Dự án (project.godot)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
@@ -10166,7 +10316,7 @@ msgstr ""
#: editor/property_editor.cpp
msgid "Select Node"
-msgstr ""
+msgstr "Chọn nút"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
@@ -10174,7 +10324,7 @@ msgstr ""
#: editor/property_editor.cpp
msgid "Pick a Node"
-msgstr ""
+msgstr "Lấy một nút"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
@@ -10198,14 +10348,24 @@ msgid "Batch Rename"
msgstr "Đổi tên"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "Thay thế: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
msgstr ""
#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Use Regular Expressions"
+msgstr "Phiên bản hiện tại:"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr ""
@@ -10214,26 +10374,24 @@ msgid "Substitute"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Đổi tên"
+msgstr "Tên nút"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Tên cha mẹ của nút, nếu có sẵn"
#: editor/rename_dialog.cpp
msgid "Node type"
-msgstr ""
+msgstr "Loại nút"
#: editor/rename_dialog.cpp
msgid "Current scene name"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Đổi tên"
+msgstr "Tên nút gốc"
#: editor/rename_dialog.cpp
msgid ""
@@ -10242,12 +10400,13 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
+msgstr "Nếu đặt bộ đếm khởi động lại cho từng nhóm nút con"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
@@ -10260,7 +10419,7 @@ msgstr "Bước (s):"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "Giá trị mà bộ đếm tăng lên cho mỗi nút"
#: editor/rename_dialog.cpp
msgid "Padding"
@@ -10273,10 +10432,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10285,11 +10440,11 @@ msgid "Keep"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10309,9 +10464,19 @@ msgstr ""
msgid "Reset"
msgstr "Đặt lại phóng"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "Phiên bản hiện tại:"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "Ký tự hợp lệ:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
-msgstr ""
+msgstr "Đổi cha mẹ của nút"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
@@ -10358,6 +10523,8 @@ msgid ""
"Cannot instance the scene '%s' because the current scene exists within one "
"of its nodes."
msgstr ""
+"Không thể làm cảnh '%s' vì trong cảnh hiện tại tồn tại trong một các nút của "
+"nó."
#: editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
@@ -10372,8 +10539,9 @@ msgid "Instance Child Scene"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+#, fuzzy
+msgid "Detach Script"
+msgstr "Đính kèm Script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10381,23 +10549,25 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
-msgstr ""
+msgstr "Chuyển nút trong cha mẹ"
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr ""
+msgstr "Di chuyển các nút trong cha mẹ"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr "Nhân đôi Node(s)"
+msgstr "Nhân đôi các nút"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
msgstr ""
+"Không thể đổi cha mẹ các nút trong cảnh kế thừa, thứ tự các nút không thể "
+"thay đổi."
#: editor/scene_tree_dock.cpp
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "Nút phải thuộc cảnh đã chỉnh sửa để trở thành gốc."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
@@ -10405,29 +10575,32 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Make node as Root"
-msgstr ""
+msgstr "Gán nút là nút Gốc"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "Xoá nút \"%s\" và các nút con của nó?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
-msgstr "Xóa Node(s)"
+msgstr "Xoá %d nút?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
-msgstr ""
+msgstr "Xoá nút gốc \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "Xoá nút \"%s\" và các nút con của nó?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "Xóa Node(s)"
+msgstr "Xoá nút \"%s\"?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
-msgstr ""
+msgstr "Không thể thực hiện với nút gốc."
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
@@ -10442,12 +10615,15 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Vô hiệu \"editable_instance\" sẽ khiến tất cả thuộc tính nút về lại mặc định."
#: editor/scene_tree_dock.cpp
msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
+"Kích hoạt \"Load As Placeholder\" sẽ vô hiệu hoá \"Editable Children\" và "
+"khiến tất cả thuộc tính của nút về lại mặc định."
#: editor/scene_tree_dock.cpp
msgid "Make Local"
@@ -10460,7 +10636,7 @@ msgstr "Tạo Scene Mới"
#: editor/scene_tree_dock.cpp
msgid "Create Root Node:"
-msgstr "Tạo Root Node:"
+msgstr "Tạo Nút Gốc:"
#: editor/scene_tree_dock.cpp
msgid "2D Scene"
@@ -10475,17 +10651,16 @@ msgid "User Interface"
msgstr "Giao diện người dùng"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "Xóa Node(s)"
+msgstr "Nút khác"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
-msgstr ""
+msgstr "Không thể hoạt động trên các nút từ ngoại cảnh!"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
-msgstr ""
+msgstr "Không thể hoạt động các nút mà cảnh hiện tại kế thừa từ nó!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
@@ -10493,11 +10668,11 @@ msgstr "Đính kèm Script"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
-msgstr "Xóa Node(s)"
+msgstr "Xóa các nút"
#: editor/scene_tree_dock.cpp
msgid "Change type of node(s)"
-msgstr ""
+msgstr "Đổi loại của các nút"
#: editor/scene_tree_dock.cpp
msgid ""
@@ -10534,10 +10709,17 @@ msgid "Open Documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "Thêm nút con"
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Expand/Collapse All"
msgstr "Thu gọn Tất cả"
@@ -10547,9 +10729,8 @@ msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "Tạo các nút mới."
+msgstr "Reparent đến nút mới"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -10565,30 +10746,32 @@ msgstr ""
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr ""
+msgstr "Sao chép đường dẫn nút"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "Tạo các nút mới."
+msgstr "Thêm/Tạo một nút mới."
#: editor/scene_tree_dock.cpp
msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
+"Tệp tin cảnh giống như một nút. Tạo một cảnh kế thừa nếu nó không có nút gốc."
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Attach a new or existing script to the selected node."
+msgstr "Đính kèm một tệp lệnh cho nút đã chọn."
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+#, fuzzy
+msgid "Detach the script from the selected node."
+msgstr "Xoá tệp lệnh khỏi nút đã chọn."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10607,9 +10790,8 @@ msgid "Toggle Visible"
msgstr ""
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "Di chuyển Node(s)"
+msgstr "Mở khoá nút"
#: editor/scene_tree_editor.cpp
#, fuzzy
@@ -10623,25 +10805,31 @@ msgstr "Kết nối bị lỗi"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
-msgstr ""
+msgstr "Cảnh báo cấu hình nút:"
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
+"Nút có %s kết nối và %s nhóm.\n"
+"Nhấp để hiện khung tín hiệu."
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
+"Nút có %s kết nối.\n"
+"Nhấp để hiện khung tín hiệu."
#: editor/scene_tree_editor.cpp
msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
+"Nút có trong %s nhóm.\n"
+"Nhấp để hiện khung nhóm."
#: editor/scene_tree_editor.cpp
#, fuzzy
@@ -10653,6 +10841,8 @@ msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
+"Nút hiện khoá.\n"
+"Nhấp để mở khoá nó."
#: editor/scene_tree_editor.cpp
msgid ""
@@ -10672,23 +10862,23 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
-msgstr ""
+msgstr "Tên nút không hợp lệ, các ký tự sau bị cấm:"
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
-msgstr ""
+msgstr "Đổi tên nút"
#: editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
-msgstr ""
+msgstr "Cây (nút):"
#: editor/scene_tree_editor.cpp
msgid "Node Configuration Warning!"
-msgstr ""
+msgstr "Cảnh báo cấu hình nút!"
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
-msgstr ""
+msgstr "Chọn một Nút"
#: editor/script_create_dialog.cpp
msgid "Path is empty."
@@ -10699,9 +10889,8 @@ msgid "Filename is empty."
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is not local."
-msgstr "Path không chỉ đến Node!"
+msgstr "Path không là cục bộ."
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -10714,6 +10903,10 @@ msgid "A directory with the same name exists."
msgstr "Đã có một file hoặc folder trùng tên."
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "Tệp không tồn tại."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "Phải sử dụng extension có hiệu lực"
@@ -10758,6 +10951,11 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "Đường dẫn sai."
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "Kích thước font không hợp lệ."
@@ -10767,7 +10965,7 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr "Animation tree khả dụng."
#: editor/script_create_dialog.cpp
@@ -10779,9 +10977,8 @@ msgid "Built-in script (into scene file)."
msgstr ""
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "Tạo nodes mới."
+msgstr "Sẽ tạo một tệp lệnh mới."
#: editor/script_create_dialog.cpp
msgid "Will load an existing script file."
@@ -10793,14 +10990,19 @@ msgid "Script file already exists."
msgstr "Tam giác đã tồn tại."
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "Lớp:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "Khung project"
+msgstr "Bản mẫu:"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -10809,7 +11011,7 @@ msgstr "Tạo Script"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
-msgstr ""
+msgstr "Đính kèm lệnh cho nút"
#: editor/script_editor_debugger.cpp
msgid "Remote "
@@ -10871,6 +11073,10 @@ msgid "Copy Error"
msgstr ""
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "Tạo các điểm."
@@ -10921,8 +11127,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "Xuất hồ sơ"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11361,26 +11568,31 @@ msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
msgstr ""
+"Một nút yielded không có bộ nhớ làm việc, đọc lại tài liệu vể cách yield!"
#: modules/visual_script/visual_script.cpp
msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
msgstr ""
+"Nút đã yield, nhưng không trả về trạng thái chức năng trong bộ nhớ làm việc "
+"đầu tiên."
#: modules/visual_script/visual_script.cpp
msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
msgstr ""
+"Giá trị trả về phải được gán cho phần tử đầu tiên của bộ nhớ làm việc của "
+"nút! Sửa lại nút của bạn."
#: modules/visual_script/visual_script.cpp
msgid "Node returned an invalid sequence output: "
-msgstr ""
+msgstr "Nút trả về đầu ra là chuỗi không hợp lệ: "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr ""
+msgstr "Tìm ra chuỗi bit nhưng không phải nút trong ngăn xếp, báo cáo lỗi!"
#: modules/visual_script/visual_script.cpp
msgid "Stack overflow with stack depth: "
@@ -11421,18 +11633,16 @@ msgid "Override an existing built-in function."
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "Tạo nodes mới."
+msgstr "Tạo một hàm mới."
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "Tạo nodes mới."
+msgstr "Tạo một biến mới."
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -11496,11 +11706,11 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr ""
+msgstr "Gỡ bỏ các nút VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr ""
+msgstr "Nhân bản các nút VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
@@ -11512,11 +11722,11 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
-msgstr ""
+msgstr "Giữ %s và thả để tham chiếu đơn giản đế nút."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr ""
+msgstr "Giữ Ctrl và thả để tham chiếu đơn giản đến nút."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
@@ -11528,11 +11738,11 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
-msgstr ""
+msgstr "Thêm nút Preload"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node(s) From Tree"
-msgstr ""
+msgstr "Thêm các nút từ cây"
#: modules/visual_script/visual_script_editor.cpp
msgid ""
@@ -11554,30 +11764,27 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Move Node(s)"
-msgstr "Di chuyển Node(s)"
+msgstr "Di chuyển các nút"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
-msgstr ""
+msgstr "Gỡ bỏ nút VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Nodes"
-msgstr ""
+msgstr "Kết nối các nút"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "Đứt kết nối"
+msgstr "Ngắt kết nối các nút"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Kết nối đến Node:"
+msgstr "Kết nối dữ liệu nút"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Kết nối đến Node:"
+msgstr "Kết nối trình tự nút"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -11593,7 +11800,7 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr ""
+msgstr "Không thể sao chép nút chức năng."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
@@ -11601,19 +11808,19 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste VisualScript Nodes"
-msgstr ""
+msgstr "Dán các nút VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function with a function node."
-msgstr ""
+msgstr "Không thể tạo hàm với một nút chức năng."
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr ""
+msgstr "Không thể tạo hàm của các nút từ các nút của nhiều chức năng."
#: modules/visual_script/visual_script_editor.cpp
msgid "Select at least one node with sequence port."
-msgstr ""
+msgstr "Chọn ít nhất một nút cho cổng trình tự."
#: modules/visual_script/visual_script_editor.cpp
msgid "Try to only have one sequence input in selection."
@@ -11658,9 +11865,8 @@ msgid "Change Base Type:"
msgstr "Đổi %s Loại"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "Thêm Nút ..."
+msgstr "Thêm các nút..."
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -11686,11 +11892,11 @@ msgstr "Tìm loại Node"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr ""
+msgstr "Sao chép các nút"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr ""
+msgstr "Cắt các nút"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -11724,7 +11930,7 @@ msgstr ""
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
-msgstr ""
+msgstr "Đối tượng cơ sở không phải một nút!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Path does not lead Node!"
@@ -11813,6 +12019,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -11825,6 +12035,8 @@ msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
msgstr ""
+"Mẫu xuất bản cho Android chưa được cài đặt trong dự án. Cài đặt nó từ menu "
+"Dự Án."
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
@@ -11837,9 +12049,37 @@ msgstr "Kích thước font không hợp lệ."
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+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 xây dựng từ một mẫu xuất bản 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ừ menu 'Dự án'."
#: platform/android/export/export.cpp
msgid ""
@@ -11848,16 +12088,22 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
+"Phiên bản xây dựng Android không khớp:\n"
+" Mẫu xuất bản được cài đặt: %s\n"
+" Phiên bản Godot sử dụng: %s\n"
+"Vui lòng cài đặt lại mẫu xuất bản Android từ menu 'Dự Án'."
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "Đang dựng dự án Android (gradle)"
#: platform/android/export/export.cpp
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"Xây dựng dự án Android không thành công, kiểm tra lỗi đầu ra.\n"
+"Hoặc truy cập 'docs.godotengine.org' xem tài liệu xây dựng Android."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
@@ -11873,7 +12119,7 @@ msgstr ""
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
-msgstr ""
+msgstr "App Store Team ID không được chỉ định - không thể cấu hình dự án."
#: platform/iphone/export/export.cpp
#, fuzzy
@@ -12021,6 +12267,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12208,6 +12460,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12228,6 +12485,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12374,7 +12636,7 @@ msgstr ""
#: scene/gui/color_picker.cpp
msgid "Pick a color from the editor window."
-msgstr ""
+msgstr "Chọn một màu từ cửa sổ biên tập"
#: scene/gui/color_picker.cpp
msgid "HSV"
@@ -12444,6 +12706,8 @@ msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
+"Environment mặc định được chỉ định trong Cài đặt Dự án (Rendering -> "
+"Environment -> Default Environment) không thể nạp được."
#: scene/main/viewport.cpp
msgid ""
@@ -12453,6 +12717,10 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr ""
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "nguồn vô hiệu cho xem trước"
@@ -12482,6 +12750,29 @@ msgstr ""
msgid "Constants cannot be modified."
msgstr "Không thể chỉnh sửa hằng số."
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "Khi xuất ra hoặc triển khai, kết quả thực thi sẽ kết nối đến IP máy tính "
+#~ "này để được gỡ lỗi."
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "Cảnh hiện tại chưa được lưu, hãy lưu nó trước khi chạy."
+
+#, fuzzy
+#~ msgid "Revert"
+#~ msgstr "Trở lại"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "Hành động này không thể hoàn tác. Trở lại luôn?"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "Theo dõi vấn đề"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "Đã thay thế %d biến cố."
+
#, fuzzy
#~ msgid "Brief Description"
#~ msgstr "Mô tả ngắn gọn:"
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
index 67f2738f86..1fd689420b 100644
--- a/editor/translations/zh_CN.po
+++ b/editor/translations/zh_CN.po
@@ -3,7 +3,7 @@
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
# 360119124 <360119124@qq.com>, 2018.
-# 柠檬杀手 <lemonkiller@gmail.com>, 2018.
+# 柠檬杀手 <lemonkiller@gmail.com>, 2018, 2020.
# 纯洁的坏蛋 <tqj.zyy@gmail.com>, 2016.
# 孤月蓝风 <trlanfeng@foxmail.com>, 2016.
# 吴亮弟 <wu@liangdi.me>, 2017.
@@ -34,7 +34,7 @@
# 刘庆文 <liuqingwen@163.com>, 2018.
# Haowen Liu <liu.haowen.andy@gmail.com>, 2018.
# tangdou1 <1093505442@qq.com>, 2018, 2019.
-# yzt <834950797@qq.com>, 2018, 2019.
+# yzt <834950797@qq.com>, 2018, 2019, 2020.
# DKLost <514dklost@gmail.com>, 2018.
# thanksshu <hezihanshangyuan@gmail.com>, 2018.
# Jsheng <yangea@outlook.com>, 2019.
@@ -59,11 +59,23 @@
# king <wangding1992@126.com>, 2019.
# silentbird <silentbird520@outlook.com>, 2019.
# Haoyu Qiu <timothyqiu32@gmail.com>, 2019, 2020.
+# Revan Ji <jiruifancr@gmail.com>, 2020.
+# nieyuanhong <15625988003@163.com>, 2020.
+# binotaliu <binota@protonmail.ch>, 2020.
+# BinotaLIU <binota@protonmail.ch>, 2020.
+# Tim Bao <honiebao@gmail.com>, 2020.
+# UnluckyNinja <unluckyninja1994@gmail.com>, 2020.
+# 无双流 <1257678024@qq.com>, 2020.
+# ZhangXinyu <zhang2xinyu@outlook.com>, 2020.
+# Silence Tai <silence.m@hotmail.com>, 2020.
+# MintSoda <lionlxh@qq.com>, 2020.
+# Gardner Belgrade <hapenia@sina.com>, 2020.
+# godhidden <z2zz2zz@yahoo.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Chinese (Simplified) (Godot Engine)\n"
"POT-Creation-Date: 2018-01-20 12:15+0200\n"
-"PO-Revision-Date: 2020-01-27 07:10+0000\n"
+"PO-Revision-Date: 2020-09-24 12:43+0000\n"
"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hans/>\n"
@@ -72,34 +84,34 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.11-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "convert()的参数类型无效,请使用TYPE_*常量。"
+msgstr "convert() 的参数类型无效,请使用 TYPE_* 常量。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "预期为长度为1的字符串(一个字符)。"
+msgstr "仅需要长度为1的字符串(1字符)。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "解码的字节不足,或格式无效。"
+msgstr "没有足够的字节来解码,或格式无效。"
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "表达式中的输入 %i 无效(未传递)"
+msgstr "表达式中包含的%i无效(未传递)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "self 无法使用,因为实例为空(未传递)"
+msgstr "实例为null(未传递),无法传递自身self"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "操作符 %s 的操作数 %s 和 %s 无效。"
+msgstr "操作符 %s ,%s 和 %s 的操作数无效。"
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
@@ -107,15 +119,15 @@ msgstr "将 %s 类型作为 %s 基础类型的索引无效"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr "将“%s”作为 %s 基础类型的具名索引无效"
+msgstr "将 '%s' 作为 %s 基础类型的具名索引无效"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "构造“%s”的参数无效"
+msgstr "构造 '%s' 的参数无效"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "调用“%s”时:"
+msgstr "在调用'%s'时:"
#: core/ustring.cpp
msgid "B"
@@ -354,7 +366,7 @@ msgstr "线性"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr "立方体"
+msgstr "三次方"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
@@ -573,6 +585,7 @@ msgid "Seconds"
msgstr "秒"
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr "FPS"
@@ -732,8 +745,8 @@ msgid "Line Number:"
msgstr "行号:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "替换了%d项。"
+msgid "%d replaced."
+msgstr "已替换%d处。"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
@@ -751,7 +764,7 @@ msgstr "大小写匹配"
msgid "Whole Words"
msgstr "全字匹配"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "替换"
@@ -801,6 +814,10 @@ msgid "Method in target node must be specified."
msgstr "必须指定目标节点的方法。"
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "方法名称必须是一个有效的标识符。"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -880,7 +897,6 @@ msgstr "无法连接信号"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -937,6 +953,11 @@ msgid "Signals"
msgstr "信号"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "筛选图块"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "你确定要从该广播信号中移除所有连接吗?"
@@ -974,7 +995,7 @@ msgid "Recent:"
msgstr "最近使用:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "搜索:"
@@ -1154,6 +1175,9 @@ msgstr "项目创始人"
msgid "Lead Developer"
msgstr "主要开发者"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
msgstr "项目管理员 "
@@ -1175,6 +1199,14 @@ msgid "Gold Sponsors"
msgstr "黄金赞助"
#: editor/editor_about.cpp
+msgid "Silver Sponsors"
+msgstr "白银赞助"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "青铜赞助"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "迷你赞助"
@@ -1480,7 +1512,7 @@ msgstr "移动Autoload"
msgid "Remove Autoload"
msgstr "移除Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "启用"
@@ -1488,17 +1520,9 @@ msgstr "启用"
msgid "Rearrange Autoloads"
msgstr "重排序Autoload"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "Invalid path."
-msgstr "路径无效。"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "文件不存在。"
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "不在资源路径下。"
+msgid "Can't add autoload:"
+msgstr "无法加载autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1525,6 +1549,10 @@ msgstr "名称"
msgid "Singleton"
msgstr "单例"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "粘贴参数"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "更新场景"
@@ -1646,16 +1674,17 @@ msgid "Scene Tree Editing"
msgstr "场景树编辑"
#: editor/editor_feature_profile.cpp
-msgid "Import Dock"
-msgstr "导入面板"
-
-#: editor/editor_feature_profile.cpp
msgid "Node Dock"
msgstr "节点面板"
#: editor/editor_feature_profile.cpp
-msgid "FileSystem and Import Docks"
-msgstr "文件系统和导入面板"
+#, fuzzy
+msgid "FileSystem Dock"
+msgstr "文件系统"
+
+#: editor/editor_feature_profile.cpp
+msgid "Import Dock"
+msgstr "导入面板"
#: editor/editor_feature_profile.cpp
msgid "Erase profile '%s'? (no undo)"
@@ -1801,9 +1830,9 @@ msgstr "在文件管理器中显示"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
-msgstr "新建文件夹 ..."
+msgstr "新建文件夹..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "刷新"
@@ -1814,7 +1843,7 @@ msgstr "所有可用类型"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr "所有文件(*)"
+msgstr "所有文件(*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
@@ -1869,7 +1898,7 @@ msgstr "切换模式"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "设置路径焦点"
+msgstr "聚焦路径"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
@@ -1917,7 +1946,7 @@ msgstr "目录与文件:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "预览:"
@@ -2002,7 +2031,7 @@ msgstr "属性说明"
#: editor/editor_help.cpp
msgid "(value)"
-msgstr "(值)"
+msgstr "(值)"
#: editor/editor_help.cpp
msgid ""
@@ -2334,18 +2363,14 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"这是一个远程对象,因此不会保留对其的更改。 请阅读与调试相关的文档,以更好地了"
-"解此工作流程。"
+"这是远程对象,因此不会保留对其的更改。\n"
+"请阅读与调试相关的文档,以更好地了解此工作流程。"
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
msgstr "没有设置要执行的场景。"
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "当前场景尚未保存,请保存后再尝试执行。"
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr "无法启动子进程!"
@@ -2430,12 +2455,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "无法重新加载未保存的场景。"
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "恢复"
+msgid "Reload Saved Scene"
+msgstr "重载已保存场景"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "此操作无法撤销,是否继续?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"当前场景有未保存的更改。\n"
+"是否重新加载保存的场景? 此操作无法撤消。"
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2625,15 +2654,15 @@ msgstr "面板位置"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr "无干扰模式"
+msgstr "专注模式"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
-msgstr "切换无干扰模式。"
+msgstr "切换专注模式。"
#: editor/editor_node.cpp
msgid "Add a new scene."
-msgstr "添加新场景。"
+msgstr "添加场景。"
#: editor/editor_node.cpp
msgid "Scene"
@@ -2649,11 +2678,11 @@ msgstr "复制文本"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr "下一个标签页"
+msgstr "下一标签"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "上一个标签页"
+msgstr "上一标签"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -2710,10 +2739,6 @@ msgid "Redo"
msgstr "重做"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "恢复场景"
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr "其他项目或全场景工具。"
@@ -2773,23 +2798,28 @@ msgstr "使用远程调试部署"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
-"导出或发布项目时,为了能够调试项目,可执行文件将试图通过本机IP连接到调试器。"
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
msgstr "使用网络文件系统进行小型部署"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
"当启用此项后,将在导出或发布项目时生成最小化可自行文件。\n"
"文件系统将通过网络连接到编辑器来实现。\n"
@@ -2800,9 +2830,10 @@ msgid "Visible Collision Shapes"
msgstr "显示碰撞区域"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr "如果启用此项,节点的碰撞区域和raycast将在游戏运行时可见。"
#: editor/editor_node.cpp
@@ -2810,35 +2841,40 @@ msgid "Visible Navigation"
msgstr "显示导航"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr "如果启用此项,用于导航的mesh和多边形将在游戏运行时可见。"
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
+#, fuzzy
+msgid "Synchronize Scene Changes"
msgstr "同步场景修改"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"开启此项后,在编辑器中对场景的所有修改都会被应用与正在运行的游戏中。\n"
"当使用远程设备调试时,使用网络文件系统能有效提高编辑效率。"
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "同步脚本变更"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
"开启此项后,所有脚本在保存时都会被正在运行的游戏重新加载。\n"
"当使用远程设备调试时,使用网络文件系统能有效提高编辑效率。"
@@ -2857,7 +2893,7 @@ msgstr "编辑器布局"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr "截取屏幕"
+msgstr "截屏"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
@@ -2900,7 +2936,7 @@ msgstr "帮助"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "搜索"
@@ -2914,8 +2950,12 @@ msgid "Q&A"
msgstr "问答"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
-msgstr "问题跟踪器"
+msgid "Report a Bug"
+msgstr "报告问题"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "发送文档反馈"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -3106,7 +3146,7 @@ msgstr "找不到子资源。"
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr "创建网格预览"
+msgstr "正在创建网格预览"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
@@ -3131,11 +3171,11 @@ msgstr "更新"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Version:"
-msgstr "版本:"
+msgstr "版本:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Author:"
-msgstr "作者:"
+msgstr "作者:"
#: editor/editor_plugin_settings.cpp
msgid "Status:"
@@ -3147,7 +3187,7 @@ msgstr "编辑:"
#: editor/editor_profiler.cpp
msgid "Measure:"
-msgstr "测量:"
+msgstr "测量:"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
@@ -3207,7 +3247,7 @@ msgstr "[空]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr "分配..."
+msgstr "指定..."
#: editor/editor_properties.cpp
msgid "Invalid RID"
@@ -3217,7 +3257,7 @@ msgstr "无效的RID"
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
-msgstr "被选择的资源(%s)并不能匹配此属性(%s)应有的类型。"
+msgstr "所选资源(%s)与该属性(%s)所需的类型都不匹配。"
#: editor/editor_properties.cpp
msgid ""
@@ -3305,9 +3345,11 @@ msgid "Add Key/Value Pair"
msgstr "添加键/值对"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
"没有对应该平台的可执行导出预设。\n"
"请在导出菜单中添加可执行预设。"
@@ -3336,6 +3378,10 @@ msgstr "无法执行脚本:"
msgid "Did you forget the '_run' method?"
msgstr "您是否遗漏了_run()方法?"
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr "按住Ctrl键来四舍五入至整数。 按住Shift键获取更精确的变化。"
+
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr "选择要导入的节点"
@@ -3346,11 +3392,11 @@ msgstr "浏览"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
-msgstr "场景路径:"
+msgstr "场景路径:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr "从节点中导入:"
+msgstr "从节点中导入:"
#: editor/export_template_manager.cpp
msgid "Redownload"
@@ -3387,7 +3433,7 @@ msgstr "检索镜像,请等待..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr "移除版本为 '%s' 的模板?"
+msgstr "是否移除版本为“%s”的模板?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
@@ -3403,7 +3449,7 @@ msgstr "模板中没有找到version.txt文件。"
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
-msgstr "创建模板文件路径出错:"
+msgstr "创建模板文件路径出错:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
@@ -3411,7 +3457,7 @@ msgstr "正在解压导出模板"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr "导入:"
+msgstr "正在导入:"
#: editor/export_template_manager.cpp
msgid "Error getting the list of mirrors."
@@ -3430,7 +3476,7 @@ msgstr "没有找到这个版本的下载链接。直接下载只适用于正式
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve."
-msgstr "无法解析."
+msgstr "无法解析。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3453,7 +3499,7 @@ msgstr "循环重定向。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed:"
-msgstr "失败:"
+msgstr "失败:"
#: editor/export_template_manager.cpp
msgid "Download Complete."
@@ -3461,21 +3507,23 @@ msgstr "下载完成。"
#: editor/export_template_manager.cpp
msgid "Cannot remove temporary file:"
-msgstr "无法移除临时文件:"
+msgstr "无法移除临时文件:"
#: editor/export_template_manager.cpp
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
-msgstr "模板安装失败。有问题的模板文档在 '%s' 。"
+msgstr ""
+"模板安装失败。\n"
+"有问题的模板文档在“%s”。"
#: editor/export_template_manager.cpp
msgid "Error requesting URL:"
-msgstr "错误的请求链接:"
+msgstr "请求URL时出错:"
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
-msgstr "正在连接镜像网站。。"
+msgstr "正在连接镜像网站..."
#: editor/export_template_manager.cpp
msgid "Disconnected"
@@ -3525,11 +3573,11 @@ msgstr "无压缩的Android Build资源"
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr "当前版本:"
+msgstr "当前版本:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr "已安装版本:"
+msgstr "已安装版本:"
#: editor/export_template_manager.cpp
msgid "Install From File"
@@ -3565,7 +3613,7 @@ msgstr "收藏"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
-msgstr "状态: 导入文件失败。请手动修复文件后重新导入。"
+msgstr "状态:导入文件失败。请手动修复文件后重新导入。"
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
@@ -3577,15 +3625,15 @@ msgstr "无法将文件夹移动到其自身。"
#: editor/filesystem_dock.cpp
msgid "Error moving:"
-msgstr "移动出错:"
+msgstr "移动出错:"
#: editor/filesystem_dock.cpp
msgid "Error duplicating:"
-msgstr "复制出错:"
+msgstr "复制出错:"
#: editor/filesystem_dock.cpp
msgid "Unable to update dependencies:"
-msgstr "无法更新依赖:"
+msgstr "无法更新依赖:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
@@ -3605,19 +3653,19 @@ msgstr "名称包含无效字符。"
#: editor/filesystem_dock.cpp
msgid "Renaming file:"
-msgstr "重命名文件:"
+msgstr "重命名文件:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr "重命名文件夹:"
+msgstr "重命名文件夹:"
#: editor/filesystem_dock.cpp
msgid "Duplicating file:"
-msgstr "拷贝文件:"
+msgstr "拷贝文件:"
#: editor/filesystem_dock.cpp
msgid "Duplicating folder:"
-msgstr "复制文件夹:"
+msgstr "复制文件夹:"
#: editor/filesystem_dock.cpp
msgid "New Inherited Scene"
@@ -3742,7 +3790,7 @@ msgstr "创建脚本"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
msgid "Find in Files"
-msgstr "在文件中查找"
+msgstr "跨文件查找"
#: editor/find_in_files.cpp
msgid "Find:"
@@ -3922,10 +3970,18 @@ msgid "Error running post-import script:"
msgstr "后处理脚本运行发生错误:"
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "你是否在 `post_import()` 方法中返回了 Node 衍生对象?"
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "保存中..."
#: editor/import_dock.cpp
+msgid "%d Files"
+msgstr "%d个文件"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr "设置为“%s”的默认值"
@@ -3934,10 +3990,6 @@ msgid "Clear Default for '%s'"
msgstr "清除默认'%s'"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " 文件"
-
-#: editor/import_dock.cpp
msgid "Import As:"
msgstr "导入为:"
@@ -3950,8 +4002,8 @@ msgid "Reimport"
msgstr "重新导入"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "保存场景,重新导入,从头开始"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "保存场景、重新导入,然后重启"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -3984,10 +4036,6 @@ msgid "Copy Params"
msgstr "复制参数"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "粘贴参数"
-
-#: editor/inspector_dock.cpp
msgid "Edit Resource Clipboard"
msgstr "编辑资源剪贴板"
@@ -4523,7 +4571,7 @@ msgstr "未来"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Depth"
-msgstr "深度"
+msgstr "Depth(深度)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
@@ -5042,7 +5090,7 @@ msgid "Bake Lightmaps"
msgstr "烘焙光照贴图"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "预览"
@@ -5247,22 +5295,22 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock Selected"
-msgstr "锁定选定"
+msgstr "锁定所选项"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock Selected"
-msgstr "解锁所选"
+msgstr "解锁所选项"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Group Selected"
-msgstr "分组选择"
+msgstr "编组所选项"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Ungroup Selected"
-msgstr "取消选定分组"
+msgstr "解组所选项"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
@@ -5647,7 +5695,7 @@ msgstr "生成顶点计数:"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Mask"
-msgstr "发射遮罩"
+msgstr "Emission Mask(发射遮挡)"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5672,7 +5720,7 @@ msgstr "从像素捕获"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Colors"
-msgstr "发光颜色"
+msgstr "Emission Colors(自发光颜色)"
#: editor/plugins/cpu_particles_editor_plugin.cpp
msgid "CPUParticles"
@@ -5785,12 +5833,12 @@ msgid "Mesh is empty!"
msgstr "网格为空!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr "创建静态三维身体"
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "无法创建Trimesh碰撞形状。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "创建静态凸体(Convex Body)"
+msgid "Create Static Trimesh Body"
+msgstr "创建静态三维身体"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
@@ -5801,12 +5849,28 @@ msgid "Create Trimesh Static Shape"
msgstr "创建三维网格静态形状"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr "创建形状失败!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "无法为场景根节点创建单一凸碰撞形状。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Shape(s)"
-msgstr "创建凸形"
+msgid "Couldn't create a single convex collision shape."
+msgstr "无法创建单一凸碰撞形状。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "创建单一凸形状"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "无法为场景根节点创建多个凸碰撞形状。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "无法创建碰撞形状。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "创建多个凸形状"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -5857,18 +5921,65 @@ msgid "Create Trimesh Static Body"
msgstr "创建三角网格静态实体"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"创建StaticBody并自动为其分配基于多边形的碰撞形状。\n"
+"这是最准确(但是最慢)的碰撞检测手段。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr "创建三角网格碰撞同级"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Convex Collision Sibling(s)"
-msgstr "创建凸型碰撞同级"
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+"创建基于多边形的碰撞形状。\n"
+"这是最准确(但是最慢)的碰撞检测手段。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Collision Sibling"
+msgstr "创建单一凸碰撞同级"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"创建单一凸碰撞形状。\n"
+"这是最快(但是最不精确)的碰撞检测手段。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "创建多个凸碰撞同级"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"创建基于多边形的碰撞形状。\n"
+"这是性能位于上述两种之间的碰撞检测手段。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr "创建轮廓网格..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"创建一个静态轮廓网格。轮廓网格会自动翻转法线。\n"
+"可以用来在必要时代替SpatialMaterial的Grow属性。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
msgstr "查看UV1"
@@ -6249,7 +6360,9 @@ msgstr "同步骨骼"
msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
-msgstr "此多边形没有贴图,请先为它设置贴图后再尝试编辑UV。"
+msgstr ""
+"此多边形没有贴图。\n"
+"请先为它设置贴图后再尝试编辑UV。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
@@ -6578,7 +6691,7 @@ msgstr "查找下一项"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
-msgstr "查找上一项"
+msgstr "查找上一个"
#: editor/plugins/script_editor_plugin.cpp
msgid "Filter scripts"
@@ -6707,14 +6820,6 @@ msgid "Open Godot online documentation."
msgstr "打开Godot在线文档。"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "请求文档"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "通过提供反馈帮助改进godot文档。"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "搜索文档。"
@@ -6778,12 +6883,12 @@ msgid ""
msgstr "未找到方法“%s”(连接于信号“%s”、来自节点“%s”、目标节点“%s”)。"
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
-msgstr "行"
+msgid "[Ignore]"
+msgstr "[忽略]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(忽略)"
+msgid "Line"
+msgstr "行"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function"
@@ -6868,7 +6973,7 @@ msgstr "切换注释"
#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
-msgstr "折叠/展开当前行"
+msgstr "折叠/展开行"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
@@ -6880,11 +6985,11 @@ msgstr "取消折叠所有行"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr "拷贝到下一行"
+msgstr "复制到下一行"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr "代码补全"
+msgstr "符号自动补全"
#: editor/plugins/script_text_editor.cpp
msgid "Evaluate Selection"
@@ -6892,7 +6997,7 @@ msgstr "所选内容求值"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "修剪行后空白"
+msgstr "移除尾部空格"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
@@ -6941,7 +7046,7 @@ msgstr "转到行..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "设置断点"
+msgstr "切换断点"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
@@ -7148,6 +7253,10 @@ msgid "This operation requires a single selected node."
msgstr "此操作只能应用于单个选中节点。"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "启用自动正交"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
msgstr "锁定视角旋转"
@@ -7205,27 +7314,27 @@ msgstr "使用GLES2渲染器时不可用。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr "自由视图 左"
+msgstr "自由观看向左"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr "自由视图 右"
+msgstr "自由观看向右"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "自由视图 前"
+msgstr "自由观看向前"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "自由视图 后"
+msgstr "自由观看向后"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "自由视图 上"
+msgstr "自由观看向上"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "自由视图 下"
+msgstr "自由观看向下"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
@@ -7236,6 +7345,10 @@ msgid "Freelook Slow Modifier"
msgstr "缓慢自由视图速度"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "锁定视角旋转"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
@@ -7244,14 +7357,24 @@ msgstr ""
"它不能用于表现游戏中的实际性能。"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "锁定视角旋转"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm对话框"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"点击以切换可见状态。\n"
+"\n"
+"睁眼:标志可见。\n"
+"闭眼:标志隐藏。\n"
+"半睁眼:标志也可穿过不透明的表面可见(“X光”)。"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
msgstr "将节点吸附至地面"
@@ -7279,11 +7402,11 @@ msgstr "使用吸附"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr "底视图"
+msgstr "仰视图"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
-msgstr "顶视图"
+msgstr "俯视"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
@@ -7291,7 +7414,7 @@ msgstr "后视图"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr "前视图"
+msgstr "正视图"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
@@ -7303,7 +7426,7 @@ msgstr "右视图"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr "切换投影/正交视图"
+msgstr "切换透视图/正交视图"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
@@ -7311,7 +7434,7 @@ msgstr "插入动画帧"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr "显示原点"
+msgstr "聚焦原点"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
@@ -7319,7 +7442,7 @@ msgstr "聚焦选中项"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
-msgstr "切换自由观察模式"
+msgstr "切换自由观看"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7328,7 +7451,7 @@ msgstr "变换"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
-msgstr "将对象吸附到地板"
+msgstr "吸附物体到地面"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -7588,7 +7711,8 @@ msgid "New Animation"
msgstr "新建动画"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "速度(FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8108,7 +8232,7 @@ msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
-"拖拽手柄以编辑举行。\n"
+"拖拽手柄以编辑矩形。\n"
"点击另一个图块进行编辑。"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -8260,7 +8384,7 @@ msgstr "图块集"
msgid "No VCS addons are available."
msgstr "没有可用的VCS插件。"
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr "错误"
@@ -8270,7 +8394,7 @@ msgstr "没有提供提交消息"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr "没有文件添加到舞台"
+msgstr "没有文件被添加到暂存区"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit"
@@ -8318,11 +8442,11 @@ msgstr "类型更改"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage Selected"
-msgstr "舞台选定"
+msgstr "将选定放入暂存区"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage All"
-msgstr "所有舞台"
+msgstr "暂存全部"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
@@ -8566,7 +8690,7 @@ msgstr "返回NaN和标量参数之间比较的布尔结果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr "小于 (*)"
+msgstr "小于 (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
@@ -8574,7 +8698,7 @@ msgstr "小于或等于(<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr "不等于(!=)"
+msgstr "不等于(!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -8584,7 +8708,7 @@ msgstr "如果提供的布尔值是true或false,则返回关联的向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated scalar if the provided boolean value is true or false."
-msgstr "如果提供的布尔值是true或false,则返回关联的向量。"
+msgstr "如果提供的布尔值是true或false,则返回关联的标量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
@@ -8887,7 +9011,7 @@ msgstr "执行立方体纹理查找。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr "执行立方体纹理查找。"
+msgstr "执行纹理查找。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Cubic texture uniform lookup."
@@ -8915,9 +9039,11 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
-"计算一对矢量的外部乘积。 OuterProduct 将第一个参数\"c\"视为列矢量(包含一列的"
-"矩阵),将第二个参数\"r\"视为行矢量(具有一行的矩阵),并执行线性代数矩阵乘以"
-"\"c = r\",生成行数为\"c\"中的组件,其列数是\"r\"中的组件数。"
+"计算一对矢量的外积。\n"
+"\n"
+"OuterProduct 将第一个参数\"c\"视为列矢量(包含一列的矩阵),将第二个参数\"r"
+"\"视为行矢量(具有一行的矩阵),并执行线性代数矩阵乘以\"c * r\",生成行数为"
+"\"c\"中的组件,其列数是\"r\"中的组件数。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
@@ -9035,9 +9161,10 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
-"平滑步函数(矢量(边缘0)、矢量(边缘1)、矢量(x))。 如果\"x\"小于"
-"\"edge0\",则返回 0.0;如果\"x\"大于\"edge1\",则返回 0.0。否则,返回值将使用"
-"赫密特多项式在 0.0 和 1.0 之间插值。"
+"SmoothStep 函数(矢量(edge0)、矢量(edge1)、矢量(x))。 \n"
+"\n"
+"如果\"x\"小于\"edge0\",则返回 0.0;如果\"x\"大于\"edge1\",则返回 0.0。否则,"
+"返回值将使用赫密特多项式在 0.0 和 1.0 之间插值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9308,7 +9435,7 @@ msgstr "包文件"
#: editor/project_export.cpp
msgid "Features"
-msgstr "功能"
+msgstr "特性"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
@@ -9316,7 +9443,7 @@ msgstr "自定义 (以逗号分隔):"
#: editor/project_export.cpp
msgid "Feature List:"
-msgstr "功能列表:"
+msgstr "特性列表:"
#: editor/project_export.cpp
msgid "Script"
@@ -9383,24 +9510,29 @@ msgid "Export With Debug"
msgstr "使用调试导出"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "该路径不存在。"
+msgid "The path specified doesn't exist."
+msgstr "指定的路径不存在。"
+
+#: editor/project_manager.cpp
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "打开包文件时出错(非ZIP格式)。"
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "无效的“.zip”项目文件,没有包含一个“project.godot”文件。"
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "无效的“.zip”项目文件;没有包含“project.godot”文件。"
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "请选择空文件夹。"
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "请选择一个“project.godot”或者“.zip”文件。"
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "请选择“project.godot”或“.zip”文件。"
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "文件夹已经包含了一个Godot项目。"
+msgid "This directory already contains a Godot project."
+msgstr "该目录已经包含Godot项目。"
#: editor/project_manager.cpp
msgid "New Game Project"
@@ -9637,7 +9769,9 @@ msgstr ""
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
-msgstr "语言已更改。 重新启动编辑器或项目管理器后,界面将更新。"
+msgstr ""
+"语言已更改。\n"
+"界面将在重新启动编辑器或项目管理器后更新。"
#: editor/project_manager.cpp
msgid ""
@@ -9647,6 +9781,7 @@ msgstr ""
"您确定要扫描%s文件夹中的现有Godot项目吗? \n"
"这可能需要一段时间。"
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr "项目管理器"
@@ -9695,6 +9830,15 @@ msgstr ""
"你目前没有任何项目。 \n"
"是否查看素材库中的官方示例项目?"
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"搜索框根据名称和路径的末尾部分来过滤项目。\n"
+"如果要根据名称和完整路径过滤,搜索内容应至少包含一个 `/` 字符。"
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr "键 "
@@ -9836,7 +9980,7 @@ msgstr "滚轮向下滚动。"
#: editor/project_settings_editor.cpp
msgid "Add Global Property"
-msgstr "添加Getter属性"
+msgstr "添加全局属性"
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
@@ -10073,14 +10217,25 @@ msgid "Batch Rename"
msgstr "批量重命名"
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "替换: "
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Prefix:"
msgstr "前缀"
#: editor/rename_dialog.cpp
-msgid "Suffix"
+#, fuzzy
+msgid "Suffix:"
msgstr "后缀"
#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "使用正则表达式"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
msgstr "高级选项"
@@ -10117,11 +10272,12 @@ msgstr ""
"比较计数器的选项。"
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr "各级单独计数"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
msgstr "如果启用,计数器将为每组子节点重置"
#: editor/rename_dialog.cpp
@@ -10149,10 +10305,6 @@ msgstr ""
"缺失的数字将用0填充在头部。"
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr "正则表达式"
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr "后期处理"
@@ -10161,11 +10313,11 @@ msgid "Keep"
msgstr "保持"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr "驼峰式转为下划线式"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr "下划线式转为驼峰式"
#: editor/rename_dialog.cpp
@@ -10184,6 +10336,15 @@ msgstr "转为大写"
msgid "Reset"
msgstr "重置"
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "正则表达式出错"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "位于字符%s"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr "重设父节点"
@@ -10222,7 +10383,7 @@ msgstr "场景运行设置"
#: editor/scene_tree_dock.cpp
msgid "No parent to instance the scenes at."
-msgstr "没有选中节点来添加实例。"
+msgstr "没有可实例化场景的父节点。"
#: editor/scene_tree_dock.cpp
msgid "Error loading scene from %s"
@@ -10247,8 +10408,8 @@ msgid "Instance Child Scene"
msgstr "实例化子场景"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr "清除脚本"
+msgid "Detach Script"
+msgstr "分离脚本"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10283,6 +10444,10 @@ msgid "Make node as Root"
msgstr "将节点设置为根节点"
#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "是否删除节点“%s”及其子节点?"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete %d nodes?"
msgstr "是否删除%d个节点?"
@@ -10406,6 +10571,15 @@ msgid "Open Documentation"
msgstr "打开文档"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+"无法附加脚本:没有语言被注册。\n"
+"这可能是因为这个编辑器是在所有语言模块被关闭的状态下被构建的。"
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr "添加子节点"
@@ -10452,12 +10626,12 @@ msgid ""
msgstr "实例化场景文件为一个节点,如果没有根节点则创建一个继承自该文件的场景。"
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr "为选中节点创建或设置脚本。"
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr "清除选中节点的脚本。"
+msgid "Detach the script from the selected node."
+msgstr "从选中节点分离脚本。"
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10588,6 +10762,10 @@ msgid "A directory with the same name exists."
msgstr "存在同名目录。"
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "文件不存在。"
+
+#: editor/script_create_dialog.cpp
msgid "Invalid extension."
msgstr "扩展名无效。"
@@ -10628,6 +10806,10 @@ msgid "File exists, it will be reused."
msgstr "文件存在,将被重用。"
#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "路径无效。"
+
+#: editor/script_create_dialog.cpp
msgid "Invalid class name."
msgstr "无效的类别名称。"
@@ -10636,12 +10818,12 @@ msgid "Invalid inherited parent name or path."
msgstr "所继承父类的名称或路径无效。"
#: editor/script_create_dialog.cpp
-msgid "Script is valid."
-msgstr "脚本有效。"
+msgid "Script path/name is valid."
+msgstr "脚本路径/名称有效。"
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr "允许:a-z,a-z,0-9,u和。"
+msgstr "允许:a-z,a-z,0-9,_ 和 ."
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)."
@@ -10649,7 +10831,7 @@ msgstr "内置脚本(到场景文件中)。"
#: editor/script_create_dialog.cpp
msgid "Will create a new script file."
-msgstr "将创建一个新的脚本文件。"
+msgstr "将创建新脚本文件。"
#: editor/script_create_dialog.cpp
msgid "Will load an existing script file."
@@ -10660,6 +10842,12 @@ msgid "Script file already exists."
msgstr "脚本文件已存在。"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr "注意:内置脚本有其局限性,并且不能使用外部编辑器编辑。"
+
+#: editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr "类名:"
@@ -10693,7 +10881,7 @@ msgstr "错误:"
#: editor/script_editor_debugger.cpp
msgid "C++ Error"
-msgstr "C ++错误"
+msgstr "C++错误"
#: editor/script_editor_debugger.cpp
msgid "C++ Error:"
@@ -10701,7 +10889,7 @@ msgstr "C++错误:"
#: editor/script_editor_debugger.cpp
msgid "C++ Source"
-msgstr "C++源程序"
+msgstr "C++源文件"
#: editor/script_editor_debugger.cpp
msgid "Source:"
@@ -10709,7 +10897,7 @@ msgstr "源文件:"
#: editor/script_editor_debugger.cpp
msgid "C++ Source:"
-msgstr "C++源程序:"
+msgstr "C++源文件:"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
@@ -10728,16 +10916,20 @@ msgid "Copy Error"
msgstr "复制错误信息"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "显存"
+
+#: editor/script_editor_debugger.cpp
msgid "Skip Breakpoints"
msgstr "跳过断点"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
-msgstr "编辑上一个实例"
+msgstr "查看上一个实例"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
-msgstr "编辑下一个实例"
+msgstr "查看下一个实例"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
@@ -10773,11 +10965,11 @@ msgstr "占用显存的资源列表:"
#: editor/script_editor_debugger.cpp
msgid "Total:"
-msgstr "合计:"
+msgstr "合计:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "显存"
+msgid "Export list to a CSV file"
+msgstr "将列表导出为CSV文件"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -10821,15 +11013,15 @@ msgstr "导出为CSV格式"
#: editor/settings_config_dialog.cpp
msgid "Erase Shortcut"
-msgstr "清除快捷方式"
+msgstr "清除快捷键"
#: editor/settings_config_dialog.cpp
msgid "Restore Shortcut"
-msgstr "恢复快捷方式"
+msgstr "恢复快捷键"
#: editor/settings_config_dialog.cpp
msgid "Change Shortcut"
-msgstr "更改快捷方式"
+msgstr "更改快捷键"
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
@@ -10881,19 +11073,19 @@ msgstr "改变方框大小"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr "修改胶囊体半径"
+msgstr "修改椭圆形半径"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr "修改胶囊体高度"
+msgstr "修改椭圆形高度"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Radius"
-msgstr "修改胶囊体半径"
+msgstr "修改圆柱形半径"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Height"
-msgstr "修改胶囊体高度"
+msgstr "修改圆柱形高度"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
@@ -10905,7 +11097,7 @@ msgstr "改变圆柱体半径"
#: modules/csg/csg_gizmos.cpp
msgid "Change Cylinder Height"
-msgstr "修改胶囊体高度"
+msgstr "修改圆柱体高度"
#: modules/csg/csg_gizmos.cpp
msgid "Change Torus Inner Radius"
@@ -10953,7 +11145,7 @@ msgstr "动态链接库"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Enabled GDNative Singleton"
-msgstr "启用gdnative singleton"
+msgstr "启用的 GDNative 单例"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Disabled GDNative Singleton"
@@ -11061,11 +11253,11 @@ msgstr "禁用裁剪"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Above"
-msgstr "裁剪上级"
+msgstr "向上裁剪"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Below"
-msgstr "裁剪下级"
+msgstr "向下裁剪"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit X Axis"
@@ -11153,7 +11345,7 @@ msgstr "清除导航网格(mesh)。"
#: modules/recast/navigation_mesh_generator.cpp
msgid "Setting up Configuration..."
-msgstr "正在设置配置..。"
+msgstr "正在设置配置..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Calculating grid size..."
@@ -11532,7 +11724,7 @@ msgstr "生成函数"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "刷新图"
+msgstr "刷新节点"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
@@ -11598,7 +11790,7 @@ msgstr "搜索可视化脚本节点"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr "得到 %s"
+msgstr "获取 %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
@@ -11645,6 +11837,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr "未在编辑器设置或预设中配置调试密钥库。"
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "用于发布的密钥存储在导出预设中未被正确设置。"
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr "自定义构建需要在“编辑器设置”中使用有效的Android SDK路径。"
@@ -11668,6 +11864,34 @@ msgstr "无效的包名称:"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"“android/modules”项目设置(变更于Godot 3.2.2)中包含了无效模"
+"组“GodotPaymentV3”.\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "必须启用“使用自定义构建”才能使用插件。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr "“自由度”只有在当“Xr Mode”是“Oculus Mobile VR”时才有效。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr "“手部追踪”只有在当“Xr Mode”是“Oculus Mobile VR”时才有效。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr "“焦点感知”只有在当“Xr Mode”是“Oculus Mobile VR”时才有效。"
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -11863,6 +12087,14 @@ msgid ""
"shape resource for it!"
msgstr "形状资源必须是通过CollisionShape2D节点的shape属性创建的!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"基于多边形的形状不应该被 CollisionShape2D 节点直接使用或编辑。请使用 "
+"CollisionPolygon2D 节点。"
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12069,6 +12301,11 @@ msgid ""
"don't use them."
msgstr "平面形状无法正常工作,未来版本将被删除。请勿使用。"
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr "ConcavePolygonShape 只支持静态模式下的 RigidBody。"
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr "无物可见,因为没有指定网格。"
@@ -12093,6 +12330,11 @@ msgstr ""
"GLES2视频驱动程序不支持GIProbe。\n"
"请改用BakedLightmap。"
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr "角度宽于 90 度的 SpotLight 无法投射出阴影。"
@@ -12138,7 +12380,7 @@ msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
-"PathFollow的ROTATION_ORIENTED要求在其父路径的Curve资源中启用“向上矢量”。"
+"PathFollow 的 ROTATION_ORIENTED 要求在其父路径的 Curve 资源中启用“向上矢量”。"
#: scene/3d/physics_body.cpp
msgid ""
@@ -12281,15 +12523,15 @@ msgid ""
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
-"除非脚本配置其子代放置行为,否则容器本身没有任何作用。 如果您不想添加脚本,请"
-"改用普通的Control节点。"
+"除非脚本配置其子代放置行为,否则容器本身没有任何作用。\n"
+"如果您不想添加脚本,请改用普通的Control节点。"
#: scene/gui/control.cpp
msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
-"由于该控件的 Mouse Filter 设置为 \"Ignore\" 因此它的 Hint Tooltip 将不会展"
+"由于该控件的 Mouse Filter 设置为 \"Ignore\" 因此它的 Hint Tooltip 将不会展"
"示。将 Mouse Filter 设置为 \"Stop\" 或 \"Pass\" 可修正此问题。"
#: scene/gui/dialogs.cpp
@@ -12319,8 +12561,9 @@ msgid ""
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
-"ScrollContainer旨在与单个子控件一起使用。 使用容器作为子容器(VBox,HBox等)"
-"或控件,并手动设置自定义最小尺寸。"
+"ScrollContainer旨在与单个子控件一起使用。\n"
+"子节点应该是单个容器(VBox、HBox等)或者使用单个控件并手动设置其自定义最小尺"
+"寸。"
#: scene/gui/tree.cpp
msgid "(Other)"
@@ -12343,6 +12586,10 @@ msgstr ""
"幕上显示其内容,使其成为子控件的所以它可以有一个尺寸大小值。否则请将其设置为 "
"RenderTarget,并将其内部纹理分配给其它节点显示。"
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "Viewport大小大于0时才能进行渲染。"
+
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
msgstr "预览的源资源无效。"
@@ -12371,6 +12618,52 @@ msgstr "变量只能在顶点函数中指定。"
msgid "Constants cannot be modified."
msgstr "不允许修改常量。"
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "文件系统和导入面板"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "导出或发布项目时,为了能够调试项目,可执行文件将试图通过本机IP连接到调试"
+#~ "器。"
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "当前场景尚未保存,请保存后再尝试执行。"
+
+#~ msgid "Not in resource path."
+#~ msgstr "不在资源路径下。"
+
+#~ msgid "Revert"
+#~ msgstr "恢复"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "此操作无法撤销,是否继续?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "恢复场景"
+
+#~ msgid "Clear Script"
+#~ msgstr "清除脚本"
+
+#~ msgid "Issue Tracker"
+#~ msgstr "问题跟踪器"
+
+#~ msgid "Request Docs"
+#~ msgstr "请求文档"
+
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "通过提供反馈帮助改进godot文档。"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "替换了%d项。"
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "创建静态凸体(Convex Body)"
+
+#~ msgid "Failed creating shapes!"
+#~ msgstr "创建形状失败!"
+
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"
#~ "[url=$url]contribute one[/url][/color] or [color=$color][url="
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
index e57c2c0303..5ccf540635 100644
--- a/editor/translations/zh_HK.po
+++ b/editor/translations/zh_HK.po
@@ -2,27 +2,28 @@
# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
-# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017.
+# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017, 2020.
# cnieFIT <dtotncq@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-04-10 00:46+0000\n"
-"Last-Translator: cnieFIT <dtotncq@gmail.com>\n"
-"Language-Team: Chinese (Hong Kong) <https://hosted.weblate.org/projects/"
-"godot-engine/godot/zh_Hant_HK/>\n"
+"PO-Revision-Date: 2020-05-01 11:43+0000\n"
+"Last-Translator: zx-wt <ZX_WT@ymail.com>\n"
+"Language-Team: Chinese (Traditional, Hong Kong) <https://hosted.weblate.org/"
+"projects/godot-engine/godot/zh_Hant_HK/>\n"
"Language: zh_HK\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 3.6-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
+#, fuzzy
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "convert()的類型參數無效, 請使用 TYPE_* 常數。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
@@ -68,19 +69,19 @@ msgstr ""
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
@@ -88,20 +89,19 @@ msgstr ""
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "PiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr ""
+msgstr "自由"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "平均"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "錯誤!"
+msgstr "對稱"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -112,9 +112,8 @@ msgid "Value:"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "動晝插入關鍵幀?"
+msgstr "在這插入關鍵幀"
#: editor/animation_bezier_editor.cpp
#, fuzzy
@@ -127,14 +126,12 @@ msgid "Delete Selected Key(s)"
msgstr "刪除選中檔案"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Add Bezier Point"
-msgstr "新增訊號"
+msgstr "新增Bezier節點"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "下移"
+msgstr "Bezier節點下移"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -158,9 +155,8 @@ msgid "Anim Change Transform"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Value"
-msgstr "動畫變化數值"
+msgstr "動畫變化關鍵幀數值"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
@@ -199,7 +195,7 @@ msgstr "更改動畫名稱:"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "變更動畫循環"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -241,23 +237,21 @@ msgid "Add Track"
msgstr "新增動畫軌跡"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "動畫縮放。"
+msgstr "動畫循環"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Functions:"
-msgstr "行為"
+msgstr ""
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "聲音片段:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "動畫片段:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
@@ -272,9 +266,8 @@ msgid "Update Mode (How this property is set)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "無干擾模式"
+msgstr "模式"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
@@ -311,11 +304,11 @@ msgstr "發動"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "捕捉"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "最近"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -337,7 +330,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "插入動畫幀"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -447,16 +440,15 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "沒有ROOT以新增新動畫軌跡"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "新增動畫軌跡"
+msgstr "新增Bezier軌跡"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -557,6 +549,7 @@ msgid "Seconds"
msgstr ""
#: editor/animation_track_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
msgstr ""
@@ -571,14 +564,12 @@ msgid "Edit"
msgstr "編輯"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "新增動畫"
+msgstr "動畫內容。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "複製參數"
+msgstr "複製"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -701,9 +692,8 @@ msgid "Select All/None"
msgstr "不選"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "新增動畫軌跡"
+msgstr "新增聲音軌跡片段"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -734,18 +724,16 @@ msgid "Line Number:"
msgstr "行數:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Replaced %d occurrence(s)."
-msgstr "取代了 %d 個。"
+msgid "%d replaced."
+msgstr "已取代 %d。"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "沒有相同"
+msgstr "%d 相同。"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -755,7 +743,7 @@ msgstr "符合大小寫"
msgid "Whole Words"
msgstr "完整詞語"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
#, fuzzy
msgid "Replace"
msgstr "取代"
@@ -795,7 +783,7 @@ msgstr "重設縮放比例"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "警告"
#: editor/code_editor.cpp
msgid "Line and column numbers."
@@ -806,6 +794,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -817,18 +809,16 @@ msgid "Connect to Node:"
msgstr "連到:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "不能連到主機:"
+msgstr "連到腳本:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "訊號:"
+msgstr "來自訊號:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "場景沒有含有任何腳本。"
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -856,17 +846,16 @@ msgid "Extra Call Arguments:"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "選擇模式"
+msgstr "接收模式:"
#: editor/connections_dialog.cpp
msgid "Advanced"
-msgstr ""
+msgstr "進階"
#: editor/connections_dialog.cpp
msgid "Deferred"
-msgstr ""
+msgstr "延遲"
#: editor/connections_dialog.cpp
msgid ""
@@ -875,22 +864,20 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr ""
+msgstr "只限一次"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "連接訊號:"
+msgstr "無法連接訊號"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -952,13 +939,17 @@ msgid "Signals"
msgstr "訊號"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "篩選檔案..."
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "中斷"
+msgstr "中斷全部"
#: editor/connections_dialog.cpp
#, fuzzy
@@ -995,7 +986,7 @@ msgid "Recent:"
msgstr "最近:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "搜尋:"
@@ -1142,7 +1133,7 @@ msgstr "刪除"
#: editor/dependency_editor.cpp
msgid "Owns"
-msgstr ""
+msgstr "擁有"
#: editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
@@ -1166,19 +1157,19 @@ msgid "Godot Engine contributors"
msgstr "Godot Engine 貢獻者"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Founders"
-msgstr "專案設定"
+msgstr "專案開荒人"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Lead Developer"
-msgstr "開發者"
+msgstr "主要開發者"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Manager "
-msgstr "開啟 Project Manager?"
+msgstr "開啟 Project Manager "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1197,6 +1188,16 @@ msgid "Gold Sponsors"
msgstr "黃金級贊助人"
#: editor/editor_about.cpp
+#, fuzzy
+msgid "Silver Sponsors"
+msgstr "白銀級捐款人"
+
+#: editor/editor_about.cpp
+#, fuzzy
+msgid "Bronze Sponsors"
+msgstr "青銅級捐款人"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "迷你贊助人"
@@ -1210,7 +1211,7 @@ msgstr "白銀級捐款人"
#: editor/editor_about.cpp
msgid "Bronze Donors"
-msgstr "青銅捐款人"
+msgstr "青銅級捐款人"
#: editor/editor_about.cpp
msgid "Donors"
@@ -1304,14 +1305,12 @@ msgid "Add Effect"
msgstr "新增效果"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Rename Audio Bus"
-msgstr "重新命名Autoload"
+msgstr "重新命名Audio Bus"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Change Audio Bus Volume"
-msgstr "動畫變化數值"
+msgstr "變更Audio Bus聲量"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
@@ -1338,9 +1337,8 @@ msgid "Move Bus Effect"
msgstr ""
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Delete Bus Effect"
-msgstr "刪除選中檔案"
+msgstr "刪除Bus Effect"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
@@ -1348,7 +1346,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr ""
+msgstr "Solo"
#: editor/editor_audio_buses.cpp
msgid "Mute"
@@ -1367,7 +1365,7 @@ msgstr "選項"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr "複製"
+msgstr "再製"
#: editor/editor_audio_buses.cpp
#, fuzzy
@@ -1397,9 +1395,8 @@ msgid "Delete Audio Bus"
msgstr "刪除佈局"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Duplicate Audio Bus"
-msgstr "複製"
+msgstr "再製 Audio Bus"
#: editor/editor_audio_buses.cpp
#, fuzzy
@@ -1407,9 +1404,8 @@ msgid "Reset Bus Volume"
msgstr "重設縮放比例"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Move Audio Bus"
-msgstr "移動"
+msgstr "移動 Audio Bus"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
@@ -1428,9 +1424,8 @@ msgid "There is no '%s' file."
msgstr ""
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Layout"
-msgstr "儲存佈局"
+msgstr "佈局"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
@@ -1483,7 +1478,7 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
-msgstr "無效名稱"
+msgstr "無效名稱。"
#: editor/editor_autoload_settings.cpp
#, fuzzy
@@ -1491,19 +1486,16 @@ msgid "Valid characters:"
msgstr "有效字符:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing engine class name."
-msgstr "有效名稱。"
+msgstr ""
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
-msgstr "有效名稱。"
+msgstr ""
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
-msgstr "有效名稱。"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
@@ -1533,7 +1525,7 @@ msgstr "移動Autoload"
msgid "Remove Autoload"
msgstr "移除Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
#, fuzzy
msgid "Enable"
msgstr "啟用"
@@ -1543,19 +1535,9 @@ msgstr "啟用"
msgid "Rearrange Autoloads"
msgstr "重新排例Autoloads"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "有效的路徑"
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "檔案不存在."
-
#: editor/editor_autoload_settings.cpp
-#, fuzzy
-msgid "Not in resource path."
-msgstr "不在資源路徑。"
+msgid "Can't add autoload:"
+msgstr ""
#: editor/editor_autoload_settings.cpp
#, fuzzy
@@ -1571,7 +1553,7 @@ msgstr "路徑:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr ""
+msgstr "Node名稱"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
@@ -1583,6 +1565,11 @@ msgstr "名稱"
msgid "Singleton"
msgstr ""
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+#, fuzzy
+msgid "Paste Params"
+msgstr "貼上參數"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "更新場景"
@@ -1597,16 +1584,15 @@ msgstr "正在更新場景..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr ""
+msgstr "[空]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr ""
+msgstr "[未儲存]"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first."
-msgstr "請先儲存場景"
+msgstr "請先選擇主要資料夾。"
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
@@ -1669,9 +1655,8 @@ msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "未找到佈局名稱!"
+msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1680,23 +1665,20 @@ msgid "Custom release template not found."
msgstr ""
#: editor/editor_export.cpp platform/javascript/export/export.cpp
-#, fuzzy
msgid "Template file not found:"
-msgstr "未找到佈局名稱!"
+msgstr ""
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "編輯器"
+msgstr "3D編輯器"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "開啟資料夾"
+msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1710,21 +1692,21 @@ msgstr "即時編輯"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Import Dock"
-msgstr "導入"
-
-#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Node Dock"
msgstr "移動模式"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "FileSystem and Import Docks"
+msgid "FileSystem Dock"
msgstr "檔案系統"
#: editor/editor_feature_profile.cpp
#, fuzzy
+msgid "Import Dock"
+msgstr "導入"
+
+#: editor/editor_feature_profile.cpp
+#, fuzzy
msgid "Erase profile '%s'? (no undo)"
msgstr "全部取代"
@@ -1742,9 +1724,8 @@ msgid "(Editor Disabled, Properties Disabled)"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "選擇模式"
+msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1794,9 +1775,8 @@ msgid "Unset"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "新增資料夾"
+msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Make Current"
@@ -1876,29 +1856,27 @@ msgid "Copy Path"
msgstr "複製路徑"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "開啟 Project Manager?"
+msgstr "在Project Manager開啟"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "開啟 Project Manager?"
+msgstr "在Project Manager顯示"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
msgid "New Folder..."
msgstr "新增資料夾"
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "重新整理"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
-msgstr "所有類型"
+msgstr "所有已知類型"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
@@ -1910,7 +1888,7 @@ msgstr "開啟檔案"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr "開啟檔案"
+msgstr "開啟(多個)檔案"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
@@ -1932,16 +1910,18 @@ msgid "Save a File"
msgstr "儲存檔案"
#: editor/editor_file_dialog.cpp
+#, fuzzy
msgid "Go Back"
-msgstr ""
+msgstr "向後"
#: editor/editor_file_dialog.cpp
+#, fuzzy
msgid "Go Forward"
-msgstr ""
+msgstr "向前"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "向上"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
@@ -1970,14 +1950,12 @@ msgid "Move Favorite Down"
msgstr "下移最愛"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "無法新增資料夾"
+msgstr "回到上一個資料夾。"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "無法新增資料夾"
+msgstr "下一個資料夾"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
@@ -2013,7 +1991,7 @@ msgstr "資料夾和檔案:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
msgstr "預覽:"
@@ -2023,7 +2001,7 @@ msgstr "檔案:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr "請用有效的副檔名"
+msgstr "請用有效的副檔名。"
#: editor/editor_file_system.cpp
msgid "ScanSources"
@@ -2064,13 +2042,12 @@ msgid "Description"
msgstr "描述:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "關閉場景"
+msgstr "Online教學"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "內客"
#: editor/editor_help.cpp
msgid "override:"
@@ -2153,29 +2130,24 @@ msgid "Classes Only"
msgstr ""
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "選擇模式"
+msgstr ""
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "訊號"
+msgstr "只限訊號"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "常數"
+msgstr "只限常數"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "選擇模式"
+msgstr "只限內容"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "選擇模式"
+msgstr ""
#: editor/editor_help_search.cpp
msgid "Member Type"
@@ -2186,9 +2158,8 @@ msgid "Class"
msgstr ""
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "選擇模式"
+msgstr ""
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -2200,14 +2171,12 @@ msgid "Constant"
msgstr "常數"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "選擇模式"
+msgstr "內容"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "篩選:"
+msgstr ""
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2226,9 +2195,8 @@ msgid "Output:"
msgstr ""
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "移除選項"
+msgstr "複製選項"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2260,9 +2228,8 @@ msgid "%s/s"
msgstr ""
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "下載"
+msgstr ""
#: editor/editor_network_profiler.cpp
msgid "Up"
@@ -2317,14 +2284,12 @@ msgid "Save Resource As..."
msgstr "把資源另存為..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't open file for writing:"
-msgstr "不能寫入,不能開啟檔案:"
+msgstr "不能開啟檔案以供寫入:"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Requested file format unknown:"
-msgstr "要求的檔案格式未知:"
+msgstr "要求的檔案格式不明:"
#: editor/editor_node.cpp
msgid "Error while saving."
@@ -2460,10 +2425,6 @@ msgid "There is no defined scene to run."
msgstr "沒有可以已定義的場景可以運行。"
#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
@@ -2552,11 +2513,14 @@ msgid "Can't reload a scene that was never saved."
msgstr "不能重新載入從未儲存的場景。"
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr ""
+#, fuzzy
+msgid "Reload Saved Scene"
+msgstr "儲存場景"
#: editor/editor_node.cpp
-msgid "This action cannot be undone. Revert anyway?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
#: editor/editor_node.cpp
@@ -2852,10 +2816,6 @@ msgid "Redo"
msgstr "重製"
#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
@@ -2920,22 +2880,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
+msgid "Small Deploy with Network Filesystem"
msgstr ""
#: editor/editor_node.cpp
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
#: editor/editor_node.cpp
@@ -2945,8 +2909,8 @@ msgstr "可見碰撞圖形"
#: editor/editor_node.cpp
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
msgstr ""
#: editor/editor_node.cpp
@@ -2955,33 +2919,34 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
msgstr ""
#: editor/editor_node.cpp
#, fuzzy
-msgid "Sync Scene Changes"
+msgid "Synchronize Scene Changes"
msgstr "同步場景的變動"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
+#, fuzzy
+msgid "Synchronize Script Changes"
msgstr "同步更新腳本"
#: editor/editor_node.cpp
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
#: editor/editor_node.cpp editor/script_create_dialog.cpp
@@ -3049,7 +3014,7 @@ msgstr "幫助"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "搜尋"
@@ -3065,7 +3030,12 @@ msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-msgid "Issue Tracker"
+#, fuzzy
+msgid "Report a Bug"
+msgstr "導入"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
@@ -3469,7 +3439,8 @@ msgstr ""
#: editor/editor_run_native.cpp
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
#: editor/editor_run_script.cpp
@@ -3491,15 +3462,20 @@ msgstr "你是否忘了關鍵詞 'tool' ?"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr ""
+msgstr "不能執行腳本:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
msgstr ""
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr ""
+
#: editor/editor_sub_scene.cpp
+#, fuzzy
msgid "Select Node(s) to Import"
-msgstr ""
+msgstr "選擇要導入的Node(s)"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
@@ -3511,7 +3487,7 @@ msgstr "場景路徑:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr ""
+msgstr "從Node導入:"
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3532,59 +3508,66 @@ msgid "Download"
msgstr "下載"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "Development builds未能提供官方export templates。"
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr ""
+msgstr "(欠缺)"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "(Current)"
-msgstr ""
+msgstr "(Current)"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Retrieving mirrors, please wait..."
-msgstr ""
+msgstr "接收 mirrors中, 請稍侯..."
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Remove template version '%s'?"
-msgstr ""
+msgstr "移除版本 '%s' 的範本?"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Can't open export templates zip."
-msgstr ""
+msgstr "不能開啟export templates的zip壓縮檔。"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "無效的 version.txt 格式 inside templates."
+msgstr "範本文件: %s 中的 version.txt 格式無效。"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "No version.txt found inside templates."
-msgstr "找不到version.txt inside templates."
+msgstr "範本中找不到version.txt。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error creating path for templates:"
-msgstr "載入字形出現錯誤"
+msgstr "範本創造路徑時出現錯誤:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Extracting Export Templates"
-msgstr ""
+msgstr "正在解壓Export Templates"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr "導入中:"
+msgstr "導入中:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "取得mirrors列表時出錯。"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
+msgstr "parsing mirror列表的JSON出錯。 請回報此問題!"
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3595,8 +3578,9 @@ msgstr "找不到這個版本的下載連結。直接下載只適用於official
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Can't resolve."
-msgstr ""
+msgstr "無法解決。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3614,8 +3598,9 @@ msgid "Request Failed."
msgstr "請求失敗。"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Redirect Loop."
-msgstr ""
+msgstr "重新定向循環。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3623,49 +3608,49 @@ msgid "Failed:"
msgstr "失敗:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Download Complete."
-msgstr "下載出現錯誤"
+msgstr "下載完成。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "無法移除:\n"
+msgstr "無法移除暫存檔:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"Templates安裝失敗。\n"
+"出現問題的templates 存檔可以在 \"%s\" 中找到。"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Error requesting URL:"
-msgstr "請求時出現錯誤"
+msgstr "請求URL時出現錯誤:"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Connecting to Mirror..."
-msgstr "連到..."
+msgstr "正在連到Mirror..."
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Disconnected"
-msgstr "中斷"
+msgstr "斷線"
#: editor/export_template_manager.cpp
msgid "Resolving"
-msgstr ""
+msgstr "解決中"
#: editor/export_template_manager.cpp
msgid "Can't Resolve"
-msgstr ""
+msgstr "不能解決"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Connecting..."
-msgstr "連到..."
+msgstr "連接中..."
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3675,7 +3660,7 @@ msgstr "不能連接。"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Connected"
-msgstr "連到"
+msgstr "已連線"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3685,63 +3670,61 @@ msgstr "請求中..."
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Downloading"
-msgstr "下載出現錯誤"
+msgstr "下載中"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connection Error"
-msgstr "連到..."
+msgstr "連接出錯"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "SSL Handshake Error"
-msgstr ""
+msgstr "SSL Handshake出錯"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "導入中:"
+msgstr "正在解壓Android Build Sources"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Current Version:"
-msgstr ""
+msgstr "當前版本:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Installed Versions:"
-msgstr "無效副檔名"
+msgstr "已安裝的版本:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Install From File"
-msgstr "從檔案下載"
+msgstr "從檔案安裝"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Remove Template"
-msgstr "移除選項"
+msgstr "移除Template"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Select Template File"
-msgstr "要刪除選中檔案?"
+msgstr "選取Template檔案"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Godot Export Templates"
-msgstr "管理輸出範本"
+msgstr "Godot輸出範本"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Export Template Manager"
-msgstr ""
+msgstr "Export Template管理器"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Download Templates"
-msgstr "移除選項"
+msgstr "下載Templates"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr ""
+msgstr "從清單中選擇鏡像: (Shift + 單擊: 在瀏覽器中打開)"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3749,77 +3732,73 @@ msgid "Favorites"
msgstr "最愛:"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
-msgstr ""
+msgstr "狀態:導入檔案失敗。請修正檔案並再手動導入。"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Cannot move/rename resources root."
-msgstr ""
+msgstr "不能移動/重新命名 resources root."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
-msgstr ""
+msgstr "不能移動資料夾到資料夾自身。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error moving:"
-msgstr "載入錯誤:"
+msgstr "移動錯誤:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error duplicating:"
-msgstr "載入錯誤:"
+msgstr "再製時出錯:"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Unable to update dependencies:"
-msgstr ""
+msgstr "未能更新dependencies:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
-msgstr ""
+msgstr "沒有提供名字。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "有效字符:"
+msgstr "提供的名字含有無效字符。"
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr ""
+msgstr "具有此名稱的檔或資料夾已存在。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Name contains invalid characters."
-msgstr "有效字符:"
+msgstr "名字含有無效字符。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Renaming file:"
-msgstr "儲存TileSet時出現錯誤!"
+msgstr "重新命名檔案:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr ""
+msgstr "重新命名資料夾:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating file:"
-msgstr "複製"
+msgstr "再製檔案:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating folder:"
-msgstr "複製"
+msgstr "再製資料夾:"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "New Inherited Scene"
-msgstr "下一個腳本"
+msgstr "新增 Inherited Scene"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Set As Main Scene"
-msgstr "選擇主場景"
+msgstr "設家成主場景"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3827,22 +3806,22 @@ msgid "Open Scenes"
msgstr "開啓場景"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Instance"
-msgstr ""
+msgstr "Instance"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "最愛:"
+msgstr "加到最愛"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Remove from Favorites"
-msgstr "只限選中"
+msgstr "從最愛中移除"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr ""
+msgstr "編輯Dependencies..."
#: editor/filesystem_dock.cpp
msgid "View Owners..."
@@ -3854,9 +3833,8 @@ msgid "Rename..."
msgstr "重新命名..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicate..."
-msgstr "複製"
+msgstr "再製..."
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3864,37 +3842,33 @@ msgid "Move To..."
msgstr "搬到..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "新增場景"
+msgstr "新增場景..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "下一個腳本"
+msgstr "新增腳本..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "把資源另存為..."
+msgstr "新增資源..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Expand All"
-msgstr ""
+msgstr "全部展開"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "關閉"
+msgstr "全部折疊"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
#: editor/scene_tree_dock.cpp
msgid "Rename"
-msgstr "重新命名..."
+msgstr "重新命名"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3902,18 +3876,18 @@ msgid "Previous Folder/File"
msgstr "上一個tab"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "新增資料夾"
+msgstr "下一個資料夾/檔案"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Re-Scan Filesystem"
-msgstr ""
+msgstr "重新掃描檔案系統"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Toggle Split Mode"
-msgstr "(不)顯示隱藏的文件"
+msgstr "切換Split 模式"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3921,10 +3895,11 @@ msgid "Search files"
msgstr "在幫助檔搜尋"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid ""
"Scanning Files,\n"
"Please Wait..."
-msgstr ""
+msgstr "正在掃描檔案, 請稍候..."
#: editor/filesystem_dock.cpp
msgid "Move"
@@ -3932,35 +3907,35 @@ msgstr "移動"
#: editor/filesystem_dock.cpp
msgid "There is already file or folder with the same name in this location."
-msgstr ""
+msgstr "此位置已存在同名的檔案或資料夾。"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Overwrite"
-msgstr ""
+msgstr "覆蓋"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Create Scene"
-msgstr "儲存場景"
+msgstr "新增場景"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Create Script"
-msgstr ""
+msgstr "新增腳本"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Find in Files"
-msgstr "多 %d 檔案"
+msgstr "在檔案中本尋找"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "尋找"
+msgstr "尋找:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "新增資料夾"
+msgstr "資料夾:"
#: editor/find_in_files.cpp
#, fuzzy
@@ -3968,169 +3943,166 @@ msgid "Filters:"
msgstr "篩選:"
#: editor/find_in_files.cpp
+#, fuzzy
msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
-msgstr ""
+msgstr "包含下列副檔名的文件。在ProjectSettings增加或移除。"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr ""
+msgstr "尋找..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+#, fuzzy
msgid "Replace..."
-msgstr ""
+msgstr "替換…"
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
msgstr "取消"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "尋找"
+msgstr "尋找: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "取代"
+msgstr "取代: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "全部取代"
+msgstr "全部取代(不可還原)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "儲存中..."
+msgstr "搜尋中..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "在幫助檔搜尋"
+msgstr "搜尋完成"
#: editor/groups_editor.cpp
+#, fuzzy
msgid "Add to Group"
-msgstr ""
+msgstr "加到Group"
#: editor/groups_editor.cpp
msgid "Remove from Group"
-msgstr ""
+msgstr "從Group中移除"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "錯誤:動畫名稱已存在!"
+msgstr "錯誤:group名稱已存在。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "無效名稱"
+msgstr "無效group名稱。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "專案"
+msgstr "重新命名Group"
#: editor/groups_editor.cpp
#, fuzzy
msgid "Delete Group"
-msgstr "刪除佈局"
+msgstr "刪除Group"
#: editor/groups_editor.cpp editor/node_dock.cpp
+#, fuzzy
msgid "Groups"
-msgstr ""
+msgstr "Groups"
#: editor/groups_editor.cpp
msgid "Nodes Not in Group"
-msgstr ""
+msgstr "不在Group內的Nodes"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Filter nodes"
-msgstr "篩選:"
+msgstr "篩選nodes:"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
-msgstr ""
+msgstr "Group中的Nodes"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
-msgstr ""
+msgstr "空groups會被移除。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "開啟資料夾"
+msgstr "Group編輯器"
#: editor/groups_editor.cpp
msgid "Manage Groups"
-msgstr ""
+msgstr "管理groups"
#: editor/import/resource_importer_scene.cpp
#, fuzzy
msgid "Import as Single Scene"
-msgstr "更新場景"
+msgstr "導入為單一場景"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Animations"
-msgstr ""
+msgstr "以分開的動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials"
-msgstr ""
+msgstr "以分開的Materials導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects"
-msgstr ""
+msgstr "以分開的物件導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials"
-msgstr ""
+msgstr "以分開的物件+Materials導入"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Objects+Animations"
-msgstr ""
+msgstr "以分開的物件+動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr ""
+msgstr "以分開的Materials+動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr ""
+msgstr "以分開的物件+Materials+動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
-msgstr ""
+msgstr "導入為多個場景"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes+Materials"
-msgstr ""
+msgstr "導入為多個場景+Materials"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import Scene"
-msgstr ""
+msgstr "導入場景"
#: editor/import/resource_importer_scene.cpp
msgid "Importing Scene..."
-msgstr ""
+msgstr "導入場景中..."
#: editor/import/resource_importer_scene.cpp
msgid "Generating Lightmaps"
-msgstr ""
+msgstr "光照圖生成中"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr ""
+msgstr "為Mesh生成中: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
-msgstr ""
+msgstr "正在運行自定義腳本..."
#: editor/import/resource_importer_scene.cpp
msgid "Couldn't load post-import script:"
@@ -4145,10 +4117,19 @@ msgid "Error running post-import script:"
msgstr ""
#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
msgstr "儲存中..."
#: editor/import_dock.cpp
+#, fuzzy
+msgid "%d Files"
+msgstr "檔案"
+
+#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
msgstr ""
@@ -4158,11 +4139,6 @@ msgstr ""
#: editor/import_dock.cpp
#, fuzzy
-msgid " Files"
-msgstr "檔案"
-
-#: editor/import_dock.cpp
-#, fuzzy
msgid "Import As:"
msgstr "導入"
@@ -4177,7 +4153,7 @@ msgid "Reimport"
msgstr "導入"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
+msgid "Save Scenes, Re-Import, and Restart"
msgstr ""
#: editor/import_dock.cpp
@@ -4214,11 +4190,6 @@ msgstr "複製參數"
#: editor/inspector_dock.cpp
#, fuzzy
-msgid "Paste Params"
-msgstr "貼上參數"
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "錯誤:剪貼簿沒有動畫!"
@@ -5346,7 +5317,7 @@ msgid "Bake Lightmaps"
msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr ""
@@ -6121,11 +6092,12 @@ msgid "Mesh is empty!"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+#, fuzzy
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "無法新增資料夾"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
+msgid "Create Static Trimesh Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6137,12 +6109,30 @@ msgid "Create Trimesh Static Shape"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create a single convex collision shape."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Shape(s)"
+msgid "Create Single Convex Shape"
+msgstr "新增"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Couldn't create any collision shapes."
+msgstr "無法新增資料夾"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Multiple Convex Shapes"
msgstr "新增"
#: editor/plugins/mesh_instance_editor_plugin.cpp
@@ -6194,19 +6184,57 @@ msgid "Create Trimesh Static Body"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
+msgid "Create Single Convex Collision Sibling"
+msgstr "縮放selection"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
+msgid "Create Multiple Convex Collision Siblings"
msgstr "縮放selection"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "View UV1"
msgstr "檔案"
@@ -7086,14 +7114,6 @@ msgid "Open Godot online documentation."
msgstr "開啓最近的"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -7161,15 +7181,15 @@ msgid ""
msgstr "由 '%s' 連到 '%s'"
#: editor/plugins/script_text_editor.cpp
+msgid "[Ignore]"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
msgstr "行:"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Go to Function"
msgstr "行為"
@@ -7554,6 +7574,10 @@ msgid "This operation requires a single selected node."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Lock View Rotation"
msgstr "本地化"
@@ -7648,18 +7672,27 @@ msgid "Freelook Slow Modifier"
msgstr "下滾"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "本地化"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "View Rotation Locked"
-msgstr "本地化"
+msgid "XForm Dialog"
+msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
@@ -8017,7 +8050,7 @@ msgid "New Animation"
msgstr "新的動畫名稱:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+msgid "Speed:"
msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8740,7 +8773,7 @@ msgstr "TileSet..."
msgid "No VCS addons are available."
msgstr ""
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
msgstr ""
@@ -9043,15 +9076,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "等於 (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "大於(>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "大於或等於(>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9073,15 +9106,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "小於 (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "小於或等於 (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "不等於 (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9875,11 +9908,16 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
-msgid "The path does not exist."
+msgid "The path specified doesn't exist."
msgstr "檔案不存在."
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
msgstr ""
#: editor/project_manager.cpp
@@ -9887,11 +9925,11 @@ msgid "Please choose an empty folder."
msgstr ""
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
+msgid "Please choose a \"project.godot\" or \".zip\" file."
msgstr ""
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
+msgid "This directory already contains a Godot project."
msgstr ""
#: editor/project_manager.cpp
@@ -10117,6 +10155,7 @@ msgid ""
"This could take a while."
msgstr ""
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
msgstr ""
@@ -10167,6 +10206,13 @@ msgid ""
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+
#: editor/project_settings_editor.cpp
msgid "Key "
msgstr ""
@@ -10563,11 +10609,20 @@ msgid "Batch Rename"
msgstr "重新命名..."
#: editor/rename_dialog.cpp
-msgid "Prefix"
+#, fuzzy
+msgid "Replace:"
+msgstr "取代: "
+
+#: editor/rename_dialog.cpp
+msgid "Prefix:"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Suffix"
+msgid "Suffix:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10609,11 +10664,11 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
+msgid "Per-level Counter"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
+msgid "If set, the counter restarts for each group of child nodes."
msgstr ""
#: editor/rename_dialog.cpp
@@ -10639,10 +10694,6 @@ msgid ""
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
-
-#: editor/rename_dialog.cpp
msgid "Post-Process"
msgstr ""
@@ -10651,11 +10702,11 @@ msgid "Keep"
msgstr "保留"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
+msgid "PascalCase to snake_case"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
+msgid "snake_case to PascalCase"
msgstr ""
#: editor/rename_dialog.cpp
@@ -10677,6 +10728,15 @@ msgstr "轉為..."
msgid "Reset"
msgstr "重設縮放比例"
+#: editor/rename_dialog.cpp
+msgid "Regular Expression Error:"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "At character %s"
+msgstr "有效字符:"
+
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
@@ -10741,8 +10801,8 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Clear Script"
-msgstr "下一個腳本"
+msgid "Detach Script"
+msgstr "腳本"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10754,23 +10814,24 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr ""
+msgstr "在Parent內移動Nodes"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr ""
+msgstr "再製Node"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
-msgstr ""
+msgstr "不能在inherited scenes內reparent nodes,nodes順序不能改變。"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "Node必須屬於已編輯的場景以成為root."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "Instantiated scenes不能成為root"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10779,16 +10840,23 @@ msgstr "儲存場景"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Delete %d nodes and any children?"
+msgstr "删除root node \"%s\"?"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete %d nodes?"
msgstr "不選"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete the root node \"%s\"?"
-msgstr ""
+msgstr "删除root node \"%s\"?"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "删除root node \"%s\"?"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10911,6 +10979,13 @@ msgid "Open Documentation"
msgstr "開啓最近的"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
@@ -10962,11 +11037,11 @@ msgid ""
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
+msgid "Attach a new or existing script to the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
+msgid "Detach the script from the selected node."
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -11095,6 +11170,10 @@ msgid "A directory with the same name exists."
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "檔案不存在."
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Invalid extension."
msgstr "無效副檔名"
@@ -11142,6 +11221,11 @@ msgstr "檔案已存在, 要覆蓋嗎?"
#: editor/script_create_dialog.cpp
#, fuzzy
+msgid "Invalid path."
+msgstr "有效的路徑"
+
+#: editor/script_create_dialog.cpp
+#, fuzzy
msgid "Invalid class name."
msgstr "無效名稱"
@@ -11151,7 +11235,7 @@ msgstr ""
#: editor/script_create_dialog.cpp
#, fuzzy
-msgid "Script is valid."
+msgid "Script path/name is valid."
msgstr "腳本"
#: editor/script_create_dialog.cpp
@@ -11178,6 +11262,12 @@ msgid "Script file already exists."
msgstr "AutoLoad '%s'已存在!"
#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Class Name:"
msgstr "名稱:"
@@ -11258,6 +11348,10 @@ msgid "Copy Error"
msgstr "載入錯誤"
#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
#, fuzzy
msgid "Skip Breakpoints"
msgstr "刪除"
@@ -11308,8 +11402,9 @@ msgid "Total:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr ""
+#, fuzzy
+msgid "Export list to a CSV file"
+msgstr "匯出"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12225,6 +12320,10 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr ""
#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr ""
+
+#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
@@ -12249,6 +12348,32 @@ msgstr "無效名稱"
#: platform/android/export/export.cpp
msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+
+#: platform/android/export/export.cpp
+msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
@@ -12440,6 +12565,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
@@ -12627,6 +12758,11 @@ msgid ""
"don't use them."
msgstr ""
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr ""
+
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
@@ -12647,6 +12783,11 @@ msgid ""
"Use a BakedLightmap instead."
msgstr ""
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
+
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
msgstr ""
@@ -12843,7 +12984,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr ""
+msgstr "當\"Exp Edit\" 啟用時,\"Min Value\" 必須大於0。"
#: scene/gui/scroll_container.cpp
msgid ""
@@ -12854,7 +12995,7 @@ msgstr ""
#: scene/gui/tree.cpp
msgid "(Other)"
-msgstr ""
+msgstr "(其他)"
#: scene/main/scene_tree.cpp
msgid ""
@@ -12870,20 +13011,23 @@ msgid ""
"texture to some node for display."
msgstr ""
+#: scene/main/viewport.cpp
+#, fuzzy
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "viewport大小必須大於0以渲染任何東西。"
+
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
-msgstr "無效字型"
+msgstr "預覽來自無效來源。"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "無效字型"
+msgstr "無效的SHADER來源。"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "無效字型"
+msgstr "無效的函式類型對比。"
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -12902,6 +13046,22 @@ msgid "Constants cannot be modified."
msgstr ""
#, fuzzy
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "檔案系統"
+
+#, fuzzy
+#~ msgid "Not in resource path."
+#~ msgstr "不在資源路徑。"
+
+#, fuzzy
+#~ msgid "Clear Script"
+#~ msgstr "下一個腳本"
+
+#, fuzzy
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "取代了 %d 個。"
+
+#, fuzzy
#~ msgid "Brief Description"
#~ msgstr "簡述:"
diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po
index 6dfb9304f9..4c693ce275 100644
--- a/editor/translations/zh_TW.po
+++ b/editor/translations/zh_TW.po
@@ -14,17 +14,23 @@
# ken l <macauhome@gmail.com>, 2018.
# Eric K <eric900601@gmail.com>, 2019.
# cnieFIT <dtotncq@gmail.com>, 2019.
-# Bluesir Bruce <a5566740293@gmail.com>, 2019.
+# Bluesir Bruce <a5566740293@gmail.com>, 2019, 2020.
# leela <53352@protonmail.com>, 2019.
# Kenneth Lo <closer.tw@gmail.com>, 2019.
# SIYU FU <1002492607@qq.com>, 2019.
# 鄭惟中 <biglionlion06@gmail.com>, 2020.
+# Alexander Wang <zxcvb22217@gmail.com>, 2020.
+# binotaliu <binota@protonmail.ch>, 2020.
+# Allen H. <w84miracle@gmail.com>, 2020.
+# BinotaLIU <binota@protonmail.ch>, 2020.
+# BinotaLIU <me@binota.org>, 2020.
+# MintSoda <lionlxh@qq.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-01-11 03:05+0000\n"
-"Last-Translator: 鄭惟中 <biglionlion06@gmail.com>\n"
+"PO-Revision-Date: 2020-09-08 11:40+0000\n"
+"Last-Translator: BinotaLIU <me@binota.org>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hant/>\n"
"Language: zh_TW\n"
@@ -32,58 +38,58 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.10.1\n"
+"X-Generator: Weblate 4.3-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Convert()函數所收到的參數錯誤,請用 TYPE_* 常數。"
+msgstr "convert() 函式收到了無效的引數,請使用 TYPE_* 常數。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "應為一個長度是1(一個字元)的字串"
+msgstr "應為一個長度為 1(一個字元)的字串。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "輸入的解碼字節不足、或為無效格式。"
+msgstr "位元組長度不足以進行解碼或或格式無效。"
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "運算式中的輸入 %i 無效 (未傳遞)"
+msgstr "運算式中的輸入 %i 無效 (未傳遞)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "因該實例(instance)為空,self 無法被使用"
+msgstr "該實體爲 null,無法使用 self"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "此數值無法被 %s、%s 和与%s 運算。"
+msgstr "該運算元無法由運算子 %s、%s、與 %s 運算。"
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "無效的內存地址類型 %s,基礎型式 %s"
+msgstr "在型別 %s 、基礎類型 %s 上存取了無效的索引"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr "基本類型 %s 的命名索引 '%s' 無效"
+msgstr "命名索引「%s」對基礎型別 %s 無效"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "無效參數類型: '%s'"
+msgstr "用了無效的引數來建構「%s」"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "調用“%s”時:"
+msgstr "呼叫「%s」時:"
#: core/ustring.cpp
msgid "B"
-msgstr "Byte"
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr "基布"
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
@@ -91,23 +97,23 @@ msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr "釋放"
+msgstr "不受限"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -123,91 +129,84 @@ msgstr "時間:"
#: editor/animation_bezier_editor.cpp
msgid "Value:"
-msgstr "數值:"
+msgstr "數值:"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr "在此插入畫格"
+msgstr "在此插入關鍵畫格"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "複製所選畫格"
+msgstr "重複所選關鍵畫格"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "刪除所選畫格"
+msgstr "刪除所選關鍵畫格"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
-msgstr "添加貝塞爾點"
+msgstr "新增貝茲曲線控制點"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "移動貝塞爾點"
+msgstr "移動貝茲曲線控制點"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "複製關鍵畫格"
+msgstr "重複動畫關鍵畫格"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "刪除關鍵畫格"
+msgstr "刪除動畫關鍵畫格"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "變更關鍵畫格的時間"
+msgstr "更改動畫關鍵畫格時間"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "變更轉場效果"
+msgstr "更改動畫轉場效果"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "變更動畫變換"
+msgstr "更改動畫變換"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "變更關鍵畫格的數值"
+msgstr "更改動畫關鍵畫格數值"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr "更改回調"
+msgstr "更改動畫呼叫"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Time"
-msgstr "變更關鍵畫格的時間"
+msgstr "更改多個動畫的關鍵畫格時間"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transition"
-msgstr "變更轉場效果"
+msgstr "更改多個動畫的轉場效果"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Transform"
-msgstr "變更動畫變換"
+msgstr "更改多個動畫的變換"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Keyframe Value"
-msgstr "變更關鍵畫格的數值"
+msgstr "更改多個動畫的關鍵畫格數值"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Multi Change Call"
-msgstr "更改回調"
+msgstr "更改多個動畫的呼叫"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Length"
-msgstr "變更動畫長度"
+msgstr "更改動畫長度"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr "變更動畫循環"
+msgstr "更改動畫循環"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -219,11 +218,11 @@ msgstr "3D 變換軌道"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr "調用方法軌道"
+msgstr "呼叫方法軌道"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr "貝塞爾曲線軌跡"
+msgstr "貝茲曲線軌道"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
@@ -234,50 +233,45 @@ msgid "Animation Playback Track"
msgstr "動畫回放軌道"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (frames)"
-msgstr "動畫長度(秒)"
+msgstr "動畫長度(幀)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation length (seconds)"
msgstr "動畫長度(秒)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "添加動畫軌"
+msgstr "新增動畫軌"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "動畫空間。"
+msgstr "重複動畫"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr "函數:"
+msgstr "函式:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr "音訊剪輯:"
+msgstr "音訊片段:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr "動畫剪輯:"
+msgstr "動畫片段:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Track Path"
-msgstr "調整陣列資料"
+msgstr "調整軌道路徑"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "打開/關閉此軌道."
+msgstr "打開/關閉此軌道。"
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr "更新模式 (如何設置此屬性)"
+msgstr "更新模式(屬性設定方法)"
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
@@ -285,22 +279,19 @@ msgstr "插值模式"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr "循環包裹模式(從循環開始插入結束)"
+msgstr "無縫循環模式(從循環開始插入結束)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "移除選擇的動畫軌。"
+msgstr "移除該動畫軌。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "步驟 :"
+msgstr "時間(秒) : "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle Track Enabled"
-msgstr "啟用"
+msgstr "啟用/禁用軌道"
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -312,11 +303,11 @@ msgstr "不連續"
#: editor/animation_track_editor.cpp
msgid "Trigger"
-msgstr "觸發器"
+msgstr "觸發程序"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr "捕獲"
+msgstr "截圖"
#: editor/animation_track_editor.cpp
msgid "Nearest"
@@ -333,40 +324,36 @@ msgstr "立方體"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Clamp 式內插循環"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Wrap 式內插循環"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "插入畫格"
+msgstr "插入關鍵畫格"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "複製動畫關鍵畫格"
+msgstr "重複關鍵畫格"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "刪除動畫關鍵畫格"
+msgstr "刪除關鍵畫格"
#: editor/animation_track_editor.cpp
msgid "Change Animation Update Mode"
-msgstr "變更動畫更新模式"
+msgstr "更改動畫更新模式"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Interpolation Mode"
-msgstr "變更動畫內插模式"
+msgstr "更改動畫插值模式"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Loop Mode"
-msgstr "變更動畫循環模式"
+msgstr "更改動畫循環模式"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -374,11 +361,11 @@ msgstr "刪除動畫軌"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr "為 %s 新增動畫軌並插入畫格?"
+msgstr "確定要為 %s 建立動畫軌並插入關鍵畫格嗎?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "新增 %d 個動畫軌並插入畫格?"
+msgstr "確定要建立 %d 個動畫軌並插入畫格嗎?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp
@@ -390,7 +377,7 @@ msgstr "新增 %d 個動畫軌並插入畫格?"
#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Create"
-msgstr "新增"
+msgstr "建立"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
@@ -398,11 +385,11 @@ msgstr "插入動畫"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer 不能播放自己,只可播放其他 Player。"
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "新增/插入動畫"
+msgstr "新增/插入動畫"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
@@ -413,18 +400,16 @@ msgid "Anim Insert Key"
msgstr "新增關鍵畫格"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Change Animation Step"
-msgstr "變更動畫長度"
+msgstr "更改動畫步長"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Rearrange Tracks"
-msgstr "重新排列 Autoload"
+msgstr "重新排列軌道"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "變形軌僅可套用至 Spatial 節點。"
#: editor/animation_track_editor.cpp
msgid ""
@@ -433,87 +418,81 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
-"音訊軌只能指向以下類型的節點:\n"
+"音訊軌僅可指向以下類型節點:\n"
"-AudioStreamPlayer\n"
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr "動畫軌跡只能指向 AnimationPlayer 節點."
+msgstr "動畫軌僅可指向 AnimationPlayer 節點。"
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "動畫 Player 無法播放自己,僅可播放其他 Player。"
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr "無法添加沒有根目錄的新曲目"
+msgstr "沒有根節點時無法新增軌道"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "對於貝茲曲線無效的軌道(非適用之子屬性)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "添加動畫軌"
+msgstr "新增貝茲曲線軌"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr "軌道路徑無效, 因此無法添加鍵。"
+msgstr "無效的軌道路徑,無法新增關鍵畫格。"
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr "軌道不是空間類型, 不能插入鍵"
+msgstr "非 Spatial 類型之軌道,無法插入關鍵畫格"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Transform Track Key"
-msgstr "動畫新增軌跡與按鍵"
+msgstr "新增變形軌關鍵畫格"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track Key"
-msgstr "添加動畫軌"
+msgstr "添加軌道關鍵畫格"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr "跟蹤路徑無效, 因此無法添加方法鍵。"
+msgstr "無效軌道路徑,無法新增方法關鍵畫格。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Method Track Key"
-msgstr "動畫新增軌跡與按鍵"
+msgstr "新增方法軌道關鍵畫格"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr "在對象中找不到方法: "
+msgstr "在物件中找不到方法: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "移動關鍵畫格"
+msgstr "移動動畫關鍵畫格"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr "剪貼板為空"
+msgstr "空白剪貼板"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "貼上參數"
+msgstr "貼上關鍵畫格"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr "縮尺鍵"
+msgstr "動畫縮放關鍵影格"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr "這個選項不適用於貝塞爾編輯,因為它只是一個單軌。"
+msgstr "該選項不適用於編輯貝茲曲線,其僅有單一軌道。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid ""
"This animation belongs to an imported scene, so changes to imported tracks "
"will not be saved.\n"
@@ -525,22 +504,20 @@ msgid ""
"Alternatively, use an import preset that imports animations to separate "
"files."
msgstr ""
-"這個動畫存在於匯入的場景中,因此對匯入軌所做的變更不會被儲存。\n"
+"該動畫屬於外部匯入之場景,套用於匯入軌道的修改將不會被保存。\n"
"\n"
-"若是要開啟「加入客制軌」的功能,請在場景的匯入設定中將「動畫 -> 存放」設定"
-"為\n"
-"「檔案」,開啟「動畫 -> 保存客制軌」,然後重新入匯入。\n"
-"或者,你可以在匯入時,將動畫資料匯入單獨的檔案之中。"
+"若要開啟「加入客制軌」的功能,請在場景在匯入設定中將 [Animation] -> "
+"[Storage] 設定為\n"
+"[Files],並啟用 [Animation] -> [Keep Custom Tracks],然後重新匯入。\n"
+"另可使用會將動畫匯入獨立檔案的匯入預設設定。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Warning: Editing imported animation"
msgstr "警告:正在編輯匯入的動畫"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select an AnimationPlayer node to create and edit animations."
-msgstr "從場景樹中選擇一個 AnimationPlayer 來編輯動畫。"
+msgstr "選擇 AnimationPlayer 節點以建立並編輯動畫。"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
@@ -548,26 +525,24 @@ msgstr "僅顯示樹中所選節點的軌跡。"
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr "按節點對軌跡分組或將其顯示為普通清單。"
+msgstr "依節點分組軌跡或將其顯示為普通清單。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap:"
-msgstr "步驟 :"
+msgstr "吸附:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "動畫空間。"
+msgstr "動畫步進值。"
#: editor/animation_track_editor.cpp
msgid "Seconds"
msgstr "秒"
#: editor/animation_track_editor.cpp
-#, fuzzy
+#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "FPS"
-msgstr "每秒張數"
+msgstr "FPS"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -580,14 +555,12 @@ msgid "Edit"
msgstr "編輯"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "動畫空間。"
+msgstr "動畫屬性。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "複製參數"
+msgstr "複製軌道"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -595,34 +568,31 @@ msgstr "縮放所選"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
-msgstr "由游標縮放"
+msgstr "以游標縮放"
#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
-msgstr "複製所選"
+msgstr "重複所選"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "複製並轉置"
+msgstr "轉置並重複"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "複製所選"
+msgstr "刪除所選"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "往下一步"
+msgstr "跳至下一步"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "往上一步"
+msgstr "跳至上一步"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr "動畫最佳化"
+msgstr "最佳化動畫"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
@@ -630,28 +600,27 @@ msgstr "清除動畫"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr "選擇要設定動畫的節點:"
+msgstr "選擇欲設定動畫之節點:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr "使用貝塞爾曲線"
+msgstr "使用貝茲曲線"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim. Optimizer"
-msgstr "動畫. 最佳化"
+msgstr "最佳化動畫工具"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr "最大線性錯誤:"
+msgstr "最大線性錯誤:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr "最大角度錯誤:"
+msgstr "最大角度錯誤:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
-msgstr "最大可優化角度:"
+msgstr "最大可最佳化角度:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
@@ -663,7 +632,7 @@ msgstr "移除無效的關鍵畫格"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr "刪除未處理的空白軌道"
+msgstr "刪除未處理與空白的軌道"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
@@ -679,12 +648,11 @@ msgstr "清除"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr "縮放比例:"
+msgstr "縮放比例:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select Tracks to Copy"
-msgstr "選擇要複製的軌道:"
+msgstr "選擇軌道以複製"
#: editor/animation_track_editor.cpp editor/editor_log.cpp
#: editor/editor_properties.cpp
@@ -696,22 +664,20 @@ msgid "Copy"
msgstr "複製"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Select All/None"
-msgstr "選擇模式"
+msgstr "選擇全部/取消選擇"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "添加動畫軌"
+msgstr "新增音訊軌片段"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
-msgstr "更改音訊軌道剪輯起始偏移"
+msgstr "更改音訊軌片段起始偏移"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip End Offset"
-msgstr "更改音訊曲目剪輯結束偏移"
+msgstr "更改音訊軌片段結束偏移"
#: editor/array_property_edit.cpp
msgid "Resize Array"
@@ -719,43 +685,41 @@ msgstr "調整陣列大小"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr "調整陣列資料型態"
+msgstr "更改陣列資料型別"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
-msgstr "調整陣列資料"
+msgstr "更改陣列資料"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "前往第...行"
+msgstr "跳至第 ... 行"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr "行號:"
+msgstr "行號:"
#: editor/code_editor.cpp
-msgid "Replaced %d occurrence(s)."
-msgstr "取代了 %d 個。"
+msgid "%d replaced."
+msgstr "已取代 %d 件。"
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d match."
-msgstr "找到 %d 件符合結果。"
+msgstr "%d 件相符合的結果。"
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "找到 %d 件符合結果。"
+msgstr "%d 件相符合的結果。"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
-msgstr "符合大小寫"
+msgstr "區分大小寫"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr "符合完整單字"
+msgstr "搜尋完整單詞"
-#: editor/code_editor.cpp editor/rename_dialog.cpp
+#: editor/code_editor.cpp
msgid "Replace"
msgstr "取代"
@@ -765,7 +729,7 @@ msgstr "取代全部"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr "僅選擇區域"
+msgstr "僅搜尋所選區域"
#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp
#: editor/plugins/text_editor.cpp
@@ -774,7 +738,7 @@ msgstr "標準"
#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr "\"切換腳本\" 面板"
+msgstr "開啟/關閉腳本面板"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -798,38 +762,37 @@ msgstr "警告"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr "行號和列號。"
+msgstr "行號與列號。"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Method in target node must be specified."
-msgstr "必須指定對目標節點的行為!"
+msgstr "必須指定目標節點方法。"
+
+#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "方法名稱必須為有效識別符。"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
-msgstr "找不到目標方法!請指定有效方法、或將腳本附加至目標節點上。"
+msgstr "找不到目標方法!請指定一個有效的方法、或將腳本附加至目標節點上。"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Node:"
-msgstr "連接到節點:"
+msgstr "連接至節點:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "無法連接到主機:"
+msgstr "連接至腳本:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "訊號:"
+msgstr "自訊號:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr "場景中沒有任何的腳本。"
+msgstr "場景中無任何腳本。"
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -850,39 +813,36 @@ msgstr "移除"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "新增額外呼叫參數:"
+msgstr "新增額外呼叫引數:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr "額外呼叫參數:"
+msgstr "額外呼叫引數:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "過濾檔案..."
+msgstr "接收器方法:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Advanced"
-msgstr "進階設定"
+msgstr "進階"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Deferred"
msgstr "延遲"
#: editor/connections_dialog.cpp
msgid ""
"Defers the signal, storing it in a queue and only firing it at idle time."
-msgstr "延後送出訊號,將訊號暫存至佇列中,等到閒置時再送出。"
+msgstr "延後送出訊號,將其存放於佇列中並待閒置時再送出。"
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr "一次性"
+msgstr "單次"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
-msgstr "第一次送出訊號後即中斷連接。"
+msgstr "首次發送訊號後中斷連接。"
#: editor/connections_dialog.cpp
msgid "Cannot connect signal"
@@ -892,7 +852,6 @@ msgstr "無法連接訊號"
#: editor/export_template_manager.cpp editor/groups_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -913,15 +872,15 @@ msgstr "訊號:"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr "將 '%s' 連接到 '%s'"
+msgstr "將「%s」連接至「%s」"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr "將 '%s' 從 '%s' 中斷連接"
+msgstr "將「%s」自「%s」斷開"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr "中斷所有來自 '%s' 的訊號連接"
+msgstr "中斷所有來自「%s」的訊號"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -930,7 +889,7 @@ msgstr "連接..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr "斷線"
+msgstr "斷開訊號連接"
#: editor/connections_dialog.cpp
msgid "Connect a Signal to a Method"
@@ -942,19 +901,24 @@ msgstr "編輯連接內容:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "確定要删除所有來自 \"%s\" 的訊號連接嗎?"
+msgstr "確定要删除所有來自訊號「%s」的連接嗎?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
msgstr "訊號"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Filter signals"
+msgstr "篩選圖塊"
+
+#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr "確定要刪除所有來自此訊號的連接嗎?"
#: editor/connections_dialog.cpp
msgid "Disconnect All"
-msgstr "中斷所有連接"
+msgstr "中斷全部"
#: editor/connections_dialog.cpp
msgid "Edit..."
@@ -962,41 +926,40 @@ msgstr "編輯…"
#: editor/connections_dialog.cpp
msgid "Go To Method"
-msgstr "前往方法"
+msgstr "跳至方法"
#: editor/create_dialog.cpp
-#, fuzzy
msgid "Change %s Type"
-msgstr "變更 %s 尺寸"
+msgstr "更改 %s 型別"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
msgid "Change"
-msgstr "更換"
+msgstr "更改"
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr "新增 %s"
+msgstr "建立新的 %s"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
msgid "Favorites:"
-msgstr "我的最愛:"
+msgstr "我的最愛:"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
msgid "Recent:"
-msgstr "最近存取:"
+msgstr "最近存取:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
-msgstr "搜尋:"
+msgstr "搜尋:"
#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr "符合條件:"
+msgstr "符合條件:"
#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
@@ -1004,37 +967,36 @@ msgstr "符合條件:"
#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
-msgstr "描述:"
+msgstr "描述:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
-msgstr "尋找取代目標:"
+msgstr "尋找取代目標:"
#: editor/dependency_editor.cpp
msgid "Dependencies For:"
-msgstr "相依於:"
+msgstr "相依於:"
#: editor/dependency_editor.cpp
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"場景 '%s' 正在編譯中。\n"
-"需重新載入才能使變更生效。"
+"場景「%s」正在編輯中。\n"
+"變更會在重新載入時套用。"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will only take effect when reloaded."
msgstr ""
-"'%s' 資源正在使用中。\n"
+"資源「%s」正在使用中。\n"
"變更會在重新載入時套用。"
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dependencies"
-msgstr "相依"
+msgstr "相依性"
#: editor/dependency_editor.cpp
msgid "Resource"
@@ -1047,7 +1009,7 @@ msgstr "路徑"
#: editor/dependency_editor.cpp
msgid "Dependencies:"
-msgstr "相依:"
+msgstr "相依於:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
@@ -1059,7 +1021,7 @@ msgstr "相依性編輯器"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
-msgstr "搜尋替代資源:"
+msgstr "搜尋並取代資源:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
#: editor/editor_help_search.cpp editor/editor_node.cpp
@@ -1073,12 +1035,11 @@ msgstr "開啟"
#: editor/dependency_editor.cpp
msgid "Owners Of:"
-msgstr "擁有者:"
+msgstr "為下列之擁有者:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "此動作無法復原, 確定要從專案中刪除所選的檔案?"
+msgstr "確定要將所選檔案自專案中移除嗎?(無法復原)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1086,21 +1047,20 @@ msgid ""
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
-"刪除這些檔案可能造成其他資源無法正常運作\n"
-"此動作無法復原, 確定要刪除嗎?"
+"有其他資源需要正在刪除的檔案以正常運作。\n"
+"依然要移除嗎?(無法復原)"
#: editor/dependency_editor.cpp
msgid "Cannot remove:"
-msgstr "無法移除:"
+msgstr "無法移除:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
-msgstr "載入時發生錯誤:"
+msgstr "載入時發生錯誤:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "場景缺少了某些資源以至於無法載入"
+msgstr "由於缺乏下列相依性內容而無法載入:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1108,7 +1068,7 @@ msgstr "強制開啟"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
-msgstr "該執行什麼操作呢?"
+msgstr "該執行什麼操作?"
#: editor/dependency_editor.cpp
msgid "Fix Dependencies"
@@ -1116,20 +1076,19 @@ msgstr "修復相依性"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
-msgstr "載入錯誤!"
+msgstr "載入錯誤!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "確定要永久刪除 %d 個物件 ? (無法復原)"
+msgstr "是否要永久刪除「%d」個項目?(無法復原!)"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Show Dependencies"
-msgstr "相依"
+msgstr "顯示相依性"
#: editor/dependency_editor.cpp
msgid "Orphan Resource Explorer"
-msgstr "孤立資料管理器"
+msgstr "孤立資源瀏覽器"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -1145,22 +1104,19 @@ msgstr "擁有"
#: editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
-msgstr "沒有明定擁有者的資源:"
+msgstr "沒有明確從屬關係的資源:"
#: editor/dictionary_property_edit.cpp
-#, fuzzy
msgid "Change Dictionary Key"
-msgstr "改變字典 key"
+msgstr "改變字典索引鍵"
#: editor/dictionary_property_edit.cpp
-#, fuzzy
msgid "Change Dictionary Value"
-msgstr "改變字典 value"
+msgstr "改變字典值"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Thanks from the Godot community!"
-msgstr "Godot 社群感謝你!"
+msgstr "Godot 社群感謝你!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
@@ -1172,11 +1128,14 @@ msgstr "專案創始人"
#: editor/editor_about.cpp
msgid "Lead Developer"
-msgstr "主開發者"
+msgstr "主要開發者"
+#. TRANSLATORS: This refers to a job title.
+#. The trailing space is used to distinguish with the project list application,
+#. you do not have to keep it in your translation.
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr "專案管理人 "
+msgstr "專案管理員 "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1195,7 +1154,14 @@ msgid "Gold Sponsors"
msgstr "黃金贊助"
#: editor/editor_about.cpp
-#, fuzzy
+msgid "Silver Sponsors"
+msgstr "白銀贊助"
+
+#: editor/editor_about.cpp
+msgid "Bronze Sponsors"
+msgstr "青銅贊助"
+
+#: editor/editor_about.cpp
msgid "Mini Sponsors"
msgstr "迷你贊助"
@@ -1204,12 +1170,10 @@ msgid "Gold Donors"
msgstr "黃金捐贈者"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Silver Donors"
msgstr "白銀捐贈者"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Bronze Donors"
msgstr "紅銅捐贈者"
@@ -1219,23 +1183,21 @@ msgstr "捐贈者"
#: editor/editor_about.cpp
msgid "License"
-msgstr "授權"
+msgstr "授權條款"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Third-party Licenses"
msgstr "第三方授權條款"
#: editor/editor_about.cpp
-#, fuzzy
msgid ""
"Godot Engine relies on a number of third-party free and open source "
"libraries, all compatible with the terms of its MIT license. The following "
"is an exhaustive list of all such third-party components with their "
"respective copyright statements and license terms."
msgstr ""
-"Godot Engine 依賴著許多與 MIT 授權條款相容、自由開源的第三方函式庫。以下是這"
-"些第三方元件的完整列表,附有它們各自的著作權宣示與授權條款。"
+"Godot Engine 依賴數個自由且開放原始碼的第三方函式庫,所有函式庫皆相容於 MIT "
+"授權條款。以下為這些第三方元件的完整列表與其著作權宣告及授權條款。"
#: editor/editor_about.cpp
msgid "All Components"
@@ -1247,17 +1209,15 @@ msgstr "元件"
#: editor/editor_about.cpp
msgid "Licenses"
-msgstr "授權"
+msgstr "授權條款"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Error opening package file, not in ZIP format."
-msgstr "開啟套件檔案出錯,非 zip 格式。"
+msgstr "無法開啟套件檔案,非 ZIP 格式。"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "%s (Already Exists)"
-msgstr "Autoload「%s」已經存在!"
+msgstr "%s(已經存在)"
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
@@ -1265,40 +1225,36 @@ msgstr "正在解壓縮素材"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr "提取以下檔案失敗:"
+msgstr "自套件中取得下列檔案失敗:"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "And %s more files."
-msgstr "還有 %d 個檔案"
+msgstr "與其他 %d 個檔案。"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Package installed successfully!"
-msgstr "套件安裝成功!"
+msgstr "套件安裝成功!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Success!"
-msgstr "成功!"
+msgstr "成功!"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Contents:"
-msgstr "內容:"
+msgstr "套件內容:"
#: editor/editor_asset_installer.cpp editor/editor_node.cpp
msgid "Install"
msgstr "安裝"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Package Installer"
msgstr "套件安裝"
#: editor/editor_audio_buses.cpp
msgid "Speakers"
-msgstr "喇叭"
+msgstr "揚聲器"
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
@@ -1306,50 +1262,45 @@ msgstr "新增效果"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
-msgstr "重新命名 Audio Bus"
+msgstr "重新命名音訊匯流排"
#: editor/editor_audio_buses.cpp
msgid "Change Audio Bus Volume"
-msgstr "變更 Audio Bus 音量"
+msgstr "更改音訊匯流排音量"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Toggle Audio Bus Solo"
-msgstr "切換 Audio Bus 的 Solo"
+msgstr "切換音訊匯流排 Solo"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Toggle Audio Bus Mute"
-msgstr "切換 Audio Bus 的 Mute"
+msgstr "靜音/取消靜音音訊匯流排"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Toggle Audio Bus Bypass Effects"
-msgstr "切換 Audio Bus 忽略效果"
+msgstr "忽略/取消忽略音訊匯流排效果"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr "選擇 Audio Bus 輸出地點"
+msgstr "選擇音訊匯流排輸出位置"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
-msgstr "新增 Audio Bus 效果"
+msgstr "新增音效匯流排效果"
#: editor/editor_audio_buses.cpp
msgid "Move Bus Effect"
-msgstr "移動 Bus 效果"
+msgstr "移動匯流排效果"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr "刪除 Bus 效果"
+msgstr "刪除匯流排效果"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Drag & drop to rearrange."
-msgstr "Audio Bus。拖放以重新排列。"
+msgstr "拖放以重新排列。"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Solo"
msgstr "Solo"
@@ -1358,18 +1309,17 @@ msgid "Mute"
msgstr "靜音"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Bypass"
-msgstr "忽略效果 (Bypass)"
+msgstr "忽略效果"
#: editor/editor_audio_buses.cpp
msgid "Bus options"
-msgstr "Bus 選項"
+msgstr "匯流排選項"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr "製作複本"
+msgstr "重複"
#: editor/editor_audio_buses.cpp
msgid "Reset Volume"
@@ -1381,70 +1331,67 @@ msgstr "刪除效果"
#: editor/editor_audio_buses.cpp
msgid "Audio"
-msgstr "聲音"
+msgstr "音訊"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus"
-msgstr "新增 Audio Bus"
+msgstr "新增音訊匯流排"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr "Master Bus 不能被刪除!"
+msgstr "不可刪除主匯流排!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr "刪除 Audio Bus"
+msgstr "刪除音訊匯流排"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
-msgstr "製作 Audio Bus 的複本"
+msgstr "重複音訊匯流排"
#: editor/editor_audio_buses.cpp
msgid "Reset Bus Volume"
-msgstr "重設 Bus 音量"
+msgstr "重設匯流排音量"
#: editor/editor_audio_buses.cpp
msgid "Move Audio Bus"
-msgstr "移動 Audio Bus"
+msgstr "移動音訊匯流排"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
-msgstr "另存 Audio Bus 配置為..."
+msgstr "將音訊匯流排配置另存為..."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Location for New Layout..."
msgstr "新配置的位置..."
#: editor/editor_audio_buses.cpp
msgid "Open Audio Bus Layout"
-msgstr "開啟 Audio Bus 配置"
+msgstr "開啟音訊匯流排配置"
#: editor/editor_audio_buses.cpp
msgid "There is no '%s' file."
-msgstr "'%s' 這個檔案不存在。"
+msgstr "檔案「%s」不存在。"
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
-msgstr "佈局"
+msgstr "畫面配置"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr "檔案格式不正確,不是 Audio Bus 配置檔。"
+msgstr "無效檔案或該檔案並非音訊匯流排配置檔。"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Error saving file: %s"
-msgstr "儲存資源錯誤!"
+msgstr "無法保存檔案:%s"
#: editor/editor_audio_buses.cpp
msgid "Add Bus"
-msgstr "新增 Bus"
+msgstr "新增匯流排"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Add a new Audio Bus to this layout."
-msgstr "另存 Audio Bus 配置為..."
+msgstr "新增一個新的音訊匯流排至該配置。"
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
@@ -1454,7 +1401,7 @@ msgstr "載入"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr "讀取現存的 Bus 配置。"
+msgstr "讀取現有的匯流排配置。"
#: editor/editor_audio_buses.cpp
msgid "Save As"
@@ -1462,108 +1409,90 @@ msgstr "另存新檔"
#: editor/editor_audio_buses.cpp
msgid "Save this Bus Layout to a file."
-msgstr "儲存目前的 Bus 配置到檔案裡。"
+msgstr "將該匯流排配置保存至檔案。"
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
msgid "Load Default"
-msgstr "載入預設值"
+msgstr "載入預設"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr "載入預設的 Bus 配置。"
+msgstr "載入預設匯流排配置。"
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr "建立新的 Bus 配置。"
+msgstr "建立新匯流排配置。"
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
-msgstr "不能使用的名稱。"
+msgstr "無效的名稱。"
#: editor/editor_autoload_settings.cpp
msgid "Valid characters:"
-msgstr "合法字元:"
+msgstr "可使用的字元:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing engine class name."
-msgstr "不正確的名字。名字不能與現有的 engine class 名衝突。"
+msgstr "不可與現存的引擎類別名稱衝突。"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
-msgstr "無效名稱.不能與現有的內置類型名稱沖突."
+msgstr "不可與內建的類別名稱衝突。"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
-msgstr "無效名稱.不能跟已經存在的全局常量名稱重複."
+msgstr "不可與現存的全域常數名稱衝突。"
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
-msgstr "無法使用關鍵字當作自動載入的名稱。"
+msgstr "關鍵字無法作為 Autoload 名稱。"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Autoload '%s' already exists!"
-msgstr "Autoload「%s」已經存在!"
+msgstr "Autoload「%s」已經存在!"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Rename Autoload"
msgstr "重新命名 Autoload"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Toggle AutoLoad Globals"
-msgstr "切換 AutoLoad 的全域變數"
+msgstr "觸發全域 AutoLoad"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
msgstr "移動 Autoload"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Remove Autoload"
msgstr "刪除 Autoload"
-#: editor/editor_autoload_settings.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp
msgid "Enable"
msgstr "啟用"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Rearrange Autoloads"
msgstr "重新排列 Autoload"
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Invalid path."
-msgstr "無效的路徑."
-
-#: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp
-msgid "File does not exist."
-msgstr "檔案不存在."
-
#: editor/editor_autoload_settings.cpp
-msgid "Not in resource path."
-msgstr "不在資源路徑中。"
+msgid "Can't add autoload:"
+msgstr "無法新增 Autoload:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Add AutoLoad"
-msgstr "新增 AutoLoad"
+msgstr "新增 Autoload"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp
msgid "Path:"
-msgstr "路徑:"
+msgstr "路徑:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr "節點名稱:"
+msgstr "節點名稱:"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
@@ -1575,6 +1504,10 @@ msgstr "名稱"
msgid "Singleton"
msgstr "單例"
+#: editor/editor_data.cpp editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr "貼上參數"
+
#: editor/editor_data.cpp
msgid "Updating Scene"
msgstr "更新場景"
@@ -1585,21 +1518,19 @@ msgstr "正在儲存變更..."
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr "場景更新中…"
+msgstr "正在更新場景…"
#: editor/editor_data.cpp editor/editor_properties.cpp
-#, fuzzy
msgid "[empty]"
-msgstr "(空)"
+msgstr "[空]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr "(未儲存)"
+msgstr "[未保存]"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first."
-msgstr "請先選擇一個基底的資料夾"
+msgstr "請先選擇基礎資料夾。"
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
@@ -1609,19 +1540,19 @@ msgstr "選擇資料夾"
#: editor/filesystem_dock.cpp editor/project_manager.cpp
#: scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr "新增資料夾"
+msgstr "建立資料夾"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp
msgid "Name:"
-msgstr "名稱:"
+msgstr "名稱:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr "無法新增資料夾."
+msgstr "無法新增資料夾。"
#: editor/editor_dir_dialog.cpp
msgid "Choose"
@@ -1629,22 +1560,22 @@ msgstr "選擇"
#: editor/editor_export.cpp
msgid "Storing File:"
-msgstr "儲存檔案:"
+msgstr "儲存檔案:"
#: editor/editor_export.cpp
msgid "No export template found at the expected path:"
-msgstr "在預期的路徑中找不到匯入模板:"
+msgstr "在預期的路徑中找不到匯出樣板:"
#: editor/editor_export.cpp
msgid "Packing"
-msgstr "包裝中"
+msgstr "正在打包"
#: editor/editor_export.cpp
msgid ""
"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import "
"Etc' in Project Settings."
msgstr ""
-"使用 GLES2 時,目標平台要求使用 'ETC' 材質壓縮。請在「專案設定」中開啟「匯入 "
+"目標平台上的 GLES2 必須使用「ETC」紋理壓縮。請在專案設定中啟用「Import "
"Etc」。"
#: editor/editor_export.cpp
@@ -1652,158 +1583,137 @@ msgid ""
"Target platform requires 'ETC2' texture compression for GLES3. Enable "
"'Import Etc 2' in Project Settings."
msgstr ""
-"使用 GLES3 時,目標平台要求使用 'ETC2' 材質壓縮。請在「專案設定」中開啟「匯"
-"入 Etc 2」。"
+"目標平台上的 GLES3 必須使用「ETC2」紋理壓縮。請在專案設定中啟用「Import Etc "
+"2」。"
#: editor/editor_export.cpp
-#, fuzzy
msgid ""
"Target platform requires 'ETC' texture compression for the driver fallback "
"to GLES2.\n"
"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback "
"Enabled'."
msgstr ""
-"使用「回退至 GLES2」的驅動器時,目標平台要求使用 'ETC' 貼圖壓縮。\n"
-"請在「專案設定」中開啟「匯入 Etc」,或是關閉「開啟驅動器回退」選項。"
+"目標平台上的 GLES2 回退驅動器功能必須使用「ETC」紋理壓縮。\n"
+"請在專案設定中啟用「Import Etc」或是禁用「Driver Fallback Enabled」。"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom debug template not found."
-msgstr "找不到自定義調試範本。"
+msgstr "找不到自定義偵錯樣板。"
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
msgid "Custom release template not found."
-msgstr "找不到自定義發佈範本。"
+msgstr "找不到自定義發行樣板。"
#: editor/editor_export.cpp platform/javascript/export/export.cpp
msgid "Template file not found:"
-msgstr "找不到範本檔案:"
+msgstr "找不到樣板檔案:"
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
-msgstr "匯出為 32 位元執行檔時,內嵌的 PCK 大小不得超過 4 GB。"
+msgstr "匯出 32 位元檔時,內嵌 PCK 大小不得超過 4 GB。"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "編輯器"
+msgstr "3D 編輯器"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "開啟腳本編輯器"
+msgstr "腳本編輯器"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Asset Library"
-msgstr "開啟素材倉庫"
+msgstr "素材庫"
#: editor/editor_feature_profile.cpp
msgid "Scene Tree Editing"
-msgstr "正在編譯場景樹"
+msgstr "正在編輯場景樹"
#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "Import Dock"
-msgstr "導入"
+msgid "Node Dock"
+msgstr "節點 Dock"
#: editor/editor_feature_profile.cpp
#, fuzzy
-msgid "Node Dock"
-msgstr "節點名稱:"
+msgid "FileSystem Dock"
+msgstr "檔案系統"
#: editor/editor_feature_profile.cpp
-#, fuzzy
-msgid "FileSystem and Import Docks"
-msgstr "文件系統"
+msgid "Import Dock"
+msgstr "匯入 Dock"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase profile '%s'? (no undo)"
-msgstr "取代全部"
+msgstr "確定要清除設定檔「%s」嗎?(無法復原)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Profile must be a valid filename and must not contain '.'"
-msgstr "Profile 必須為有效的檔名,而且其中不得包含 '.' 字元。"
+msgstr "設定檔必須為有效檔名,且不可包含「.」"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Profile with this name already exists."
-msgstr "具有此名稱的檔或資料夾已存在。"
+msgstr "已有相同名稱的設定檔存在。"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled, Properties Disabled)"
-msgstr "(編譯已關閉,屬性已關閉)"
+msgstr "(已禁用編輯器,已禁用屬性)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "僅屬性"
+msgstr "(已禁用屬性)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Editor Disabled)"
-msgstr "已停用"
+msgstr "(已禁用編輯器)"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options:"
-msgstr "描述:"
+msgstr "類別選項:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enable Contextual Editor"
-msgstr "開啟下一個編輯器"
+msgstr "啟用上下文編輯器"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Properties:"
-msgstr "效能:"
+msgstr "啟用屬性:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Features:"
-msgstr "功能"
+msgstr "啟用功能:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Enabled Classes:"
-msgstr "搜尋 Class"
+msgstr "啟用類別:"
#: editor/editor_feature_profile.cpp
msgid "File '%s' format is invalid, import aborted."
-msgstr "檔案 '%s' 的內容格式錯誤,中止匯入。"
+msgstr "檔案「%s」的格式無效,已中止匯入。"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid ""
"Profile '%s' already exists. Remove it first before importing, import "
"aborted."
-msgstr "Profile '%s' 已經存在。在匯入的前請先移除。中止匯入。"
+msgstr "設定檔「%s」已存在。匯入前請先將其移除。已中止匯入。"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Error saving profile to path: '%s'."
-msgstr "載入場景時發生錯誤"
+msgstr "在下列路徑保存設定檔時發生錯誤:%s。"
#: editor/editor_feature_profile.cpp
msgid "Unset"
msgstr "未設定"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "當前版本:"
+msgstr "目前設定檔:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "當前:"
+msgstr "設為目前的"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1814,62 +1724,53 @@ msgstr "新增"
#: editor/editor_feature_profile.cpp editor/editor_node.cpp
#: editor/project_manager.cpp
msgid "Import"
-msgstr "導入"
+msgstr "匯入"
#: editor/editor_feature_profile.cpp editor/project_export.cpp
msgid "Export"
-msgstr "輸出"
+msgstr "匯出"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Available Profiles:"
-msgstr "效能:"
+msgstr "可用設定檔:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Class Options"
-msgstr "描述:"
+msgstr "類別選項"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "New profile name:"
-msgstr "新名稱:"
+msgstr "新增設定檔名稱:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Erase Profile"
-msgstr "擦除磚塊地圖"
+msgstr "清除設定檔"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Godot Feature Profile"
-msgstr "管理輸出模板"
+msgstr "Godot 功能設定檔"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Import Profile(s)"
-msgstr "已導入的項目"
+msgstr "匯入設定檔"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Export Profile"
-msgstr "輸出專案"
+msgstr "匯出設定檔"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Manage Editor Feature Profiles"
-msgstr "管理輸出模板"
+msgstr "管理編輯器功能設定檔"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Select Current Folder"
-msgstr "選擇目前的資料夾"
+msgstr "選擇目前資料夾"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr "檔案已經存在, 要覆寫嗎?"
+msgstr "檔案已存在,是否覆蓋?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "選擇此資料夾"
@@ -1878,32 +1779,30 @@ msgid "Copy Path"
msgstr "複製路徑"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "在檔案管理員內顯示"
+msgstr "在檔案總管中開啟"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "在檔案管理員內顯示"
+msgstr "在檔案總管中顯示"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
msgstr "新增資料夾..."
-#: editor/editor_file_dialog.cpp
+#: editor/editor_file_dialog.cpp editor/find_in_files.cpp
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Refresh"
msgstr "重新整理"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
-msgstr "可認得全部"
+msgstr "支援的類型"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr "所有類型檔案"
+msgstr "所有類型的檔案 (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
@@ -1926,32 +1825,31 @@ msgstr "開啟檔案或資料夾"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
-msgstr "儲存"
+msgstr "保存"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Save a File"
-msgstr "儲存檔案"
+msgstr "保存檔案"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr "往後"
+msgstr "上一頁"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr "往前"
+msgstr "下一頁"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr "往上"
+msgstr "上一層"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr "切換顯示隱藏檔案"
+msgstr "顯示/隱藏隱藏檔案"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Toggle Favorite"
-msgstr "切換最愛"
+msgstr "新增/取消我的最愛"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
@@ -1963,251 +1861,223 @@ msgstr "聚焦路徑"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "向上移動收藏"
+msgstr "向上移動我的最愛"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "向下移動收藏"
+msgstr "向下移動我的最愛"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "無法新增資料夾"
+msgstr "前往上一個資料夾。"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "無法新增資料夾"
+msgstr "前往下一個資料夾。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "無法新增資料夾"
+msgstr "前往上層資料夾。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "搜尋 Class"
+msgstr "重新整理檔案。"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "無法新增資料夾"
+msgstr "將目前資料夾新增或移除至我的最愛。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "切換顯示隱藏檔案"
+msgstr "顯示/取消顯示隱藏檔案。"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
-msgstr "以縮略圖網格形式查看項目。"
+msgstr "以網格縮圖方式顯示項目。"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr "以清單形式查看項目。"
+msgstr "以清單方式顯示項目。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
-msgstr "資料夾 & 檔案:"
+msgstr "資料夾與檔案:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#: editor/plugins/theme_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview:"
-msgstr "預覽:"
+msgstr "預覽:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
-msgstr "檔案:"
+msgstr "檔案:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Must use a valid extension."
msgstr "必須使用有效的副檔名。"
#: editor/editor_file_system.cpp
msgid "ScanSources"
-msgstr "掃描源"
+msgstr "掃描原始檔"
#: editor/editor_file_system.cpp
msgid ""
"There are multiple importers for different types pointing to file %s, import "
"aborted"
-msgstr ""
+msgstr "由於多個匯入器以不同的型別指向檔案 %s,已中止匯入"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr "(重新)載入素材"
+msgstr "(重新)匯入素材"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Top"
-msgstr "上面"
+msgstr "頂端"
#: editor/editor_help.cpp
msgid "Class:"
-msgstr "Class:"
+msgstr "類別:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Inherits:"
-msgstr "繼承:"
+msgstr "繼承:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr "繼承:"
+msgstr "被繼承:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Description"
-msgstr "描述:"
+msgstr "說明"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "線上教學:"
+msgstr "線上教學"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr "性質"
+msgstr "屬性"
#: editor/editor_help.cpp
-#, fuzzy
msgid "override:"
-msgstr "覆蓋"
+msgstr "複寫:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "預設"
+msgstr "預設:"
#: editor/editor_help.cpp
msgid "Methods"
msgstr "方法"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "過濾檔案..."
+msgstr "主題屬性"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "枚舉"
+msgstr "列舉類型"
#: editor/editor_help.cpp
msgid "Constants"
-msgstr "定數"
+msgstr "常數"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Property 說明:"
+msgstr "屬性說明"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "數值"
+msgstr "(數值)"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"目前沒有這個 property 的說明。請幫我們[color=$color][url=$url]貢獻[/url][/"
-"color]一個!"
+"該屬性目前無說明。請幫助我們[color=$color][url=$url]貢獻一個[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Method 說明:"
+msgstr "方法說明"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"目前沒有這個 method 的說明。請幫我們[color=$color][url=$url]貢獻[/url][/"
-"color]一個!"
+"該方法目前沒有說明。請幫我們[color=$color][url=$url]貢獻一個[/url][/color]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr "搜尋幫助"
+msgstr "搜尋說明"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
msgstr "區分大小寫"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "顯示輔助線"
+msgstr "以樹狀顯示"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "取代全部"
+msgstr "全部顯示"
#: editor/editor_help_search.cpp
msgid "Classes Only"
-msgstr "僅限類"
+msgstr "僅顯示類別"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "方法"
+msgstr "僅顯示方法"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "信號"
+msgstr "僅顯示訊號"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "定數"
+msgstr "僅顯示常數"
#: editor/editor_help_search.cpp
msgid "Properties Only"
-msgstr "僅屬性"
+msgstr "僅顯示屬性"
#: editor/editor_help_search.cpp
msgid "Theme Properties Only"
-msgstr "僅限主題屬性"
+msgstr "僅顯示主題屬性"
#: editor/editor_help_search.cpp
msgid "Member Type"
-msgstr "成員類型"
+msgstr "成員型別"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Class:"
+msgstr "類別"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
msgstr "方法"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "信號"
+msgstr "訊號"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
-msgstr "固定"
+msgstr "常數"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "屬性:"
+msgstr "屬性"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "過濾檔案..."
+msgstr "主題屬性"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2215,21 +2085,19 @@ msgstr "屬性:"
#: editor/editor_inspector.cpp
msgid "Set"
-msgstr "集合"
+msgstr "設定"
#: editor/editor_inspector.cpp
-#, fuzzy
msgid "Set Multiple:"
-msgstr "複數設定:"
+msgstr "設定多個:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr "輸出:"
+msgstr "輸出:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "複製選擇"
+msgstr "複製所選"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2242,9 +2110,8 @@ msgid "Clear"
msgstr "清除"
#: editor/editor_log.cpp
-#, fuzzy
msgid "Clear Output"
-msgstr "輸出:"
+msgstr "清除輸出"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2258,134 +2125,128 @@ msgstr "開始"
#: editor/editor_network_profiler.cpp
msgid "%s/s"
-msgstr ""
+msgstr "%s/秒"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "下載"
+msgstr "下行"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr ""
+msgstr "上行"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
-#, fuzzy
msgid "Node"
msgstr "節點"
#: editor/editor_network_profiler.cpp
msgid "Incoming RPC"
-msgstr ""
+msgstr "連入 RPC"
#: editor/editor_network_profiler.cpp
msgid "Incoming RSET"
-msgstr ""
+msgstr "連入 RSET"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RPC"
-msgstr ""
+msgstr "連出 RPC"
#: editor/editor_network_profiler.cpp
msgid "Outgoing RSET"
-msgstr ""
+msgstr "連出 RSET"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "New Window"
-msgstr ""
+msgstr "新視窗"
#: editor/editor_node.cpp
msgid "Imported resources can't be saved."
-msgstr "無法保存導入的資源。"
+msgstr "匯入的資源無法保存。"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: scene/gui/dialogs.cpp
msgid "OK"
-msgstr "確定"
+msgstr "好"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr "儲存資源錯誤!"
+msgstr "保存資源錯誤!"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource can't be saved because it does not belong to the edited scene. "
"Make it unique first."
-msgstr "無法儲存此資源,因為它不屬於已編輯的場景。請先讓它成為唯一。"
+msgstr "由於該資源不屬於已編輯的場景,無法保存該資源。請先使其獨立化。"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "另存資源為..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't open file for writing:"
-msgstr "無法以寫入模式開啟檔案:"
+msgstr "無法開啟欲寫入的檔案:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr "要求了不明的檔案格式:"
+msgstr "要求的檔案格式未知:"
#: editor/editor_node.cpp
msgid "Error while saving."
-msgstr "儲存中發生了錯誤。"
+msgstr "保存時發生錯誤。"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr "無法打開“%s”。檔案可能已被移動或删除。"
+msgstr "無法開啟「%s」。該檔案可能已被移動或刪除。"
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
-msgstr "分析 \"%s\" 時發生錯誤。"
+msgstr "無法解析「%s」。"
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr "意料外的檔案結尾 (EOF) '%s'。"
+msgstr "未預期的檔案結尾 (EOF)「%s」。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Missing '%s' or its dependencies."
-msgstr "缺失 '%s' 或它的依存。"
+msgstr "缺少「%s」或其相依性。"
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
-msgstr "載入 \"%s\" 時發生錯誤。"
+msgstr "載入「%s」時發生錯誤。"
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr "正在儲存場景"
+msgstr "正在保存場景"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr "分析中"
+msgstr "正在分析"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
msgstr "正在建立縮圖"
#: editor/editor_node.cpp
-#, fuzzy
msgid "This operation can't be done without a tree root."
-msgstr "此操作無法復原, 確定要還原嗎?"
+msgstr "無樹狀根目錄無法進行此操作。"
#: editor/editor_node.cpp
msgid ""
"This scene can't be saved because there is a cyclic instancing inclusion.\n"
"Please resolve it and then attempt to save again."
msgstr ""
-"偵測到此場景中有循環實例化引入現象,因此無法儲存。\n"
+"該場景有循環性實體化問題,無法保存。\n"
"請先解決此問題後再試一次。"
#: editor/editor_node.cpp
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
-msgstr "無法儲存此場景。可能有不完整的依存關係(實例化或是繼承上的)。"
+msgstr "無法保存場景。可能是由於相依性(實體或繼承)無法滿足。"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr "無法覆寫仍處於開啟狀態的場景!"
+msgstr "無法複寫開啟中的場景!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2393,31 +2254,31 @@ msgstr "無法加載要合併的網格庫!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr "保存MeshLibrary時出錯!"
+msgstr "保存網格庫時出錯!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr "無法加載Tileset進行合併!"
+msgstr "無法加載要合併的圖塊集!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr "保存tileset時出錯!"
+msgstr "保存保存圖塊集時發生錯誤!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
-msgstr "嘗試保存佈局時出錯!"
+msgstr "嘗試保存配置時出錯!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
-msgstr "覆蓋默認編輯器佈局。"
+msgstr "已覆蓋預設的編輯器配置。"
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr "找不到佈局名稱!"
+msgstr "找不到配置名稱!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
-msgstr "已將默認佈局還原為基本設定。"
+msgstr "已將預設配置還原至基本設定。"
#: editor/editor_node.cpp
msgid ""
@@ -2425,24 +2286,22 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"此資源屬於匯入的場景,因此不可編輯。\n"
-"請閱讀與匯入場景相關的文件,以便更加瞭解工作流程。"
+"該資源屬於已匯入的場景,因此不可編輯。 \n"
+"請閱讀有關匯入場景的說明文件以更瞭解該流程。"
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
msgstr ""
-"此資源屬於被實例化或被繼承的場景。\n"
-"儲存場景時,此資源的變更不會被保存。"
+"此資源屬於已被實例化或被繼承的場景。\n"
+"儲存目前場景時,套用的改動將不會被保存。"
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
-msgstr ""
-"這個資源是匯入進來的,因此無法編譯。請修改匯入控制面板上的設定,再重新匯入一"
-"次。"
+msgstr "該資源自外部匯入,無法編輯。請在匯入面板中修改設定並重新匯入。"
#: editor/editor_node.cpp
msgid ""
@@ -2451,31 +2310,26 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"此場景是匯入進來的,因此變更不會被保存。\n"
-"需經過實例化或是繼承,才能變更其內容。\n"
-"請閱讀與匯入場景相關的文件,以便更加瞭解工作流程。"
+"該場景自外部匯入,因此做出的改動將不會保存。\n"
+"實例化或繼承後將可對其做出修改。\n"
+"請閱讀與匯入相關的說明文件以更加瞭解該工作流程。"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This is a remote object, so changes to it won't be kept.\n"
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"此資源屬於已導入的場景, 因此不可編輯。\n"
-"請閱讀與導入場景相關的文檔, 以便更好地瞭解此工作流。"
+"該資源自外部匯入,因此做出的改動將不會保存。\n"
+"請閱讀有關偵錯的說明文件以更瞭解該流程。"
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
-msgstr "沒有已定義的場景可運行。"
-
-#: editor/editor_node.cpp
-msgid "Current scene was never saved, please save it prior to running."
-msgstr "目前的場景從未被儲存,在運行場景前請先存檔。"
+msgstr "未定義欲執行之場景。"
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
-msgstr "無法啟動子進程!"
+msgstr "無法啟動子處理程序!"
#: editor/editor_node.cpp editor/filesystem_dock.cpp
msgid "Open Scene"
@@ -2486,9 +2340,8 @@ msgid "Open Base Scene"
msgstr "開啟基本場景"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "快速開啟場景..."
+msgstr "快速開啟..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2496,24 +2349,23 @@ msgstr "快速開啟場景…"
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr "快速打開腳本…"
+msgstr "快速開啟腳本…"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save & Close"
-msgstr "另存新檔"
+msgstr "保存並關閉"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
-msgstr "關閉前是否保存對“%s”的更改?"
+msgstr "關閉前是否保存對「%s」的更改?"
#: editor/editor_node.cpp
msgid "Saved %s modified resource(s)."
-msgstr "已保存%s個已修改的資源。"
+msgstr "已保存 %s 個已修改的資源。"
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
-msgstr "儲存場景需要根節點。"
+msgstr "保存場景需要根節點。"
#: editor/editor_node.cpp
msgid "Save Scene As..."
@@ -2521,7 +2373,7 @@ msgstr "另存場景為…"
#: editor/editor_node.cpp
msgid "No"
-msgstr "不是"
+msgstr "否"
#: editor/editor_node.cpp
msgid "Yes"
@@ -2529,44 +2381,47 @@ msgstr "是"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr "此場景從未被儲存。執行前先存檔?"
+msgstr "此場景從未被保存。是否於執行前先保存?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr "這項操作必須要有場景存在。"
+msgstr "該操作必須要有場景才可完成。"
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr "導出網格庫"
+msgstr "匯出網格庫"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr "在設置根節點(root node)前,無法完成該指定操作。"
+msgstr "該操作必須要有跟節點才可完成。"
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr "導出磁貼集"
+msgstr "匯出圖塊集"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
-msgstr "在設置著節點(selected node)前,無法完成該指定操作。"
+msgstr "請先選擇節點以執行該操作。"
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr "目前的場景尚未儲存。還是要開啟嗎?"
+msgstr "尚未保存目前場景。仍然要開啟嗎?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr "無法重新載入從未存檔的場景。"
+msgstr "無法重新載入從未保存過的場景。"
#: editor/editor_node.cpp
-msgid "Revert"
-msgstr "還原"
+msgid "Reload Saved Scene"
+msgstr "重新載入已保存的場景"
#: editor/editor_node.cpp
-#, fuzzy
-msgid "This action cannot be undone. Revert anyway?"
-msgstr "此操作無法被, 確定要還原嗎?"
+msgid ""
+"The current scene has unsaved changes.\n"
+"Reload the saved scene anyway? This action cannot be undone."
+msgstr ""
+"目前場景有未保存的改動。\n"
+"仍要重新載入場景嗎?此操作將無法復原。"
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2582,25 +2437,25 @@ msgstr "要結束編輯器嗎?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr "要開啟專案管理嗎?"
+msgstr "要開啟專案管理員嗎?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr "儲存並離開"
+msgstr "保存並退出"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr "退出程式前,要儲存以下修改過的場景嗎?"
+msgstr "退出前要先保存下列場景嗎?"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr "開啟專案管理前,要儲存以下修改過的場景嗎?"
+msgstr "開啟專案管理員前要先保存以下場景嗎?"
#: editor/editor_node.cpp
msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
-msgstr "不推薦此選項。被強制重新整理的情形,可能是因程式錯誤導致。請回報。"
+msgstr "該選項已停止維護。目前已將需強制重新整理之狀況視為 Bug,請回報該問題。"
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
@@ -2611,56 +2466,55 @@ msgid "Close Scene"
msgstr "關閉場景"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "關閉場景"
+msgstr "重新開啟已關閉的場景"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
-msgstr "無法在: \"%s\" 上啟動擴充功能,設定解析失敗。"
+msgstr "無法在「%s」上啟用擴充功能,解析組態設定失敗。"
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
-msgstr "在插件目錄 'res://addons/%s' 中,找不到腳本。"
+msgstr "無法在擴充功能「res://addons/%s」中無法找到腳本欄位。"
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "無法從 '%s' 中順利讀取腳本。"
+msgstr "無法自路徑「%s」載入擴充腳本。"
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
-msgstr "無法從 '%s' 中順利讀取腳本。可能出自編碼錯誤,請檢察語法是否正確。"
+msgstr "無法自路徑「%s」載入擴充腳本。可能為程式碼中有錯誤,請檢查語法。"
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
-msgstr "無法從 '%s' 中順利讀取腳本。基本類型 的腳本並不屬於 編輯類插件。"
+msgstr "無法自路徑「%s」載入擴充腳本,基礎型別非 EditorPlugin。"
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
-msgstr "無法從 '%s' 中順利讀取腳本。此腳本並不處於工具模式下。"
+msgstr "無法自路徑載入擴充腳本「%s」,腳本不在工具模式下。"
#: editor/editor_node.cpp
msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
-"場景 '%s' 為自動匯入的,不能被修改。\n"
-"若要進行更改,請建立新的繼承的場景。"
+"「%s」為自動匯入的場景,將無法修改。\n"
+"若要對其進行改動,可建立新繼承場景。"
#: editor/editor_node.cpp
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
-"讀取場景時發生錯誤,場景必須放置於專案資料夾中。請用「導入」開啟該場景後,再"
-"儲存於專案資料夾。"
+"載入場景時發生錯誤,場景必須置於專案路徑內。請使用 [匯入] 來開啟該場景,並將"
+"其保存於專案路徑內。"
#: editor/editor_node.cpp
msgid "Scene '%s' has broken dependencies:"
-msgstr "場景 '%s' 的依存關係已被破壞:"
+msgstr "場景「%s」的相依性損壞:"
#: editor/editor_node.cpp
msgid "Clear Recent Scenes"
@@ -2673,7 +2527,7 @@ msgid ""
"category."
msgstr ""
"尚未定義主場景。要選擇一個場景嗎?\n"
-"你之後可以在「應用程式」分類中的「專案設定」變更這設定。"
+"稍後可在「專案設定」的 [Application] 分類中修改。"
#: editor/editor_node.cpp
msgid ""
@@ -2681,6 +2535,8 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"所選的場景「%s」不存在,是否要選擇一個有效的場景?\n"
+"稍後可在「專案設定」的 [Application] 分類中修改。"
#: editor/editor_node.cpp
msgid ""
@@ -2688,14 +2544,16 @@ msgid ""
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
+"所選的場景「%s」並非場景檔案,是否要選擇另一個有效的場景?\n"
+"稍後可在「專案設定」中的 [Application] 中修改。"
#: editor/editor_node.cpp
msgid "Save Layout"
-msgstr "儲存佈局"
+msgstr "儲存配置"
#: editor/editor_node.cpp
msgid "Delete Layout"
-msgstr "刪除佈局"
+msgstr "刪除配置"
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
@@ -2709,29 +2567,27 @@ msgstr "在檔案系統中顯示"
#: editor/editor_node.cpp
msgid "Play This Scene"
-msgstr "運行此場景"
+msgstr "執行此場景"
#: editor/editor_node.cpp
msgid "Close Tab"
msgstr "關閉分頁"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "關閉分頁"
+msgstr "取消關閉分頁"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
-msgstr "關閉其他選項卡"
+msgstr "關閉其他分頁"
#: editor/editor_node.cpp
msgid "Close Tabs to the Right"
-msgstr ""
+msgstr "關閉右側分頁"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "全部關閉"
+msgstr "全部所有分頁"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2739,46 +2595,43 @@ msgstr "切換場景分頁"
#: editor/editor_node.cpp
msgid "%d more files or folders"
-msgstr "還有 %d 個檔案/資料夾"
+msgstr "還有 %d 個檔案/資料夾"
#: editor/editor_node.cpp
-#, fuzzy
msgid "%d more folders"
-msgstr "還有 %d 個檔案"
+msgstr "還有 %d 個資料夾"
#: editor/editor_node.cpp
msgid "%d more files"
-msgstr "還有 %d 個檔案"
+msgstr "其他 %d 個檔案"
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr "版面位置"
+msgstr "Dock 位置"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr "無干擾模式"
+msgstr "專注模式"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
-msgstr "切換為無干擾模式。"
+msgstr "切換/取消專注模式。"
#: editor/editor_node.cpp
msgid "Add a new scene."
msgstr "新增場景。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Scene"
msgstr "場景"
#: editor/editor_node.cpp
msgid "Go to previously opened scene."
-msgstr "前往上次開啟的場景。"
+msgstr "跳至上一個開啟的場景。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "複製路徑"
+msgstr "複製文字"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2802,7 +2655,7 @@ msgstr "新場景"
#: editor/editor_node.cpp
msgid "New Inherited Scene..."
-msgstr "從現有場景中建立…"
+msgstr "新增繼承場景…"
#: editor/editor_node.cpp
msgid "Open Scene..."
@@ -2814,12 +2667,11 @@ msgstr "最近開啟的場景"
#: editor/editor_node.cpp
msgid "Save Scene"
-msgstr "儲存場景"
+msgstr "保存場景"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "儲存全部場景"
+msgstr "保存所有場景"
#: editor/editor_node.cpp
msgid "Convert To..."
@@ -2827,29 +2679,25 @@ msgstr "轉換成…"
#: editor/editor_node.cpp
msgid "MeshLibrary..."
-msgstr "網狀資料庫(MeshLibrary)…"
+msgstr "網格庫…"
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr "區塊素材…"
+msgstr "圖塊集…"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr "還原"
+msgstr "復原"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "重作"
-
-#: editor/editor_node.cpp
-msgid "Revert Scene"
-msgstr "恢復場景"
+msgstr "取消復原"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
-msgstr "其他專案或全螢幕工具。"
+msgstr "其他專案或全場景共通工具。"
#: editor/editor_node.cpp editor/project_manager.cpp
#: editor/script_create_dialog.cpp
@@ -2857,44 +2705,40 @@ msgid "Project"
msgstr "專案"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "專案設定"
+msgstr "專案設定..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "版本:"
+msgstr "版本控制"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
-msgstr ""
+msgstr "設定版本控制"
#: editor/editor_node.cpp
msgid "Shut Down Version Control"
-msgstr ""
+msgstr "終止版本控制"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "輸出"
+msgstr "匯出..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
-msgstr ""
+msgstr "安裝 Android 建構樣板..."
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
-msgstr "開啟專案資料夾"
+msgstr "開啟專案資料目錄"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "工具"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "孤立資料管理器"
+msgstr "孤立資源瀏覽器..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2907,164 +2751,173 @@ msgstr "偵錯"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr "使用遠端偵錯"
+msgstr "部署並啟用遠端偵錯"
#: editor/editor_node.cpp
msgid ""
-"When exporting or deploying, the resulting executable will attempt to "
-"connect to the IP of this computer in order to be debugged."
-msgstr "當輸出或發布專案後,可執行文件(exe)將會嘗試連結本機IP,以進行偵錯。"
+"When this option is enabled, using one-click deploy will make the executable "
+"attempt to connect to this computer's IP so the running project can be "
+"debugged.\n"
+"This option is intended to be used for remote debugging (typically with a "
+"mobile device).\n"
+"You don't need to enable it to use the GDScript debugger locally."
+msgstr ""
#: editor/editor_node.cpp
-msgid "Small Deploy with Network FS"
-msgstr "小型部屬 & 網路文件系統(NFS)"
+#, fuzzy
+msgid "Small Deploy with Network Filesystem"
+msgstr "使用網路檔案系統進行小型部署"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is enabled, export or deploy will produce a minimal "
-"executable.\n"
+"When this option is enabled, using one-click deploy for Android will only "
+"export an executable without the project data.\n"
"The filesystem will be provided from the project by the editor over the "
"network.\n"
-"On Android, deploy will use the USB cable for faster performance. This "
-"option speeds up testing for games with a large footprint."
+"On Android, deploying will use the USB cable for faster performance. This "
+"option speeds up testing for projects with large assets."
msgstr ""
-"啟用此選項後,在輸出/發布項目時,執行檔會壓縮至最小。\n"
-"至於文件系統,則以網路與編輯器的連結來供給。\n"
-"在Android平台,透過USB發布能獲得更快的效率。\n"
-"此選項用於加速遊戲(尤其是檔案繁多)的測試。"
+"啟用該選項後,匯出或部署是會產生最小可執行檔。\n"
+"專案之檔案系統將由本編輯器以網路提供。\n"
+"部署至 Android 平台需使用 USB 線以獲得更快速的效能。該選項對於大型遊戲能加速"
+"測試。"
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr "碰撞區域的顯示"
+msgstr "顯示碰撞區域"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
-"running game if this option is turned on."
-msgstr "啟用此選項後,碰撞區域/射線節點 將會於遊戲中顯示。"
+"When this option is enabled, collision shapes and raycast nodes (for 2D and "
+"3D) will be visible in the running project."
+msgstr "開啟選項後,執行遊戲時將可看見碰撞區域與(2D 或 3D 的)射線節點。"
#: editor/editor_node.cpp
msgid "Visible Navigation"
-msgstr "導航的顯示"
+msgstr "顯示導航"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"Navigation meshes and polygons will be visible on the running game if this "
-"option is turned on."
-msgstr "啟用此選項後,導航所用的網線/多邊形 將會於遊戲中顯示。"
+"When this option is enabled, navigation meshes and polygons will be visible "
+"in the running project."
+msgstr "開啟該選項後,執行遊戲時將可看見導航網格 (mesh) 與多邊形。"
#: editor/editor_node.cpp
-msgid "Sync Scene Changes"
-msgstr "同步場景的變更"
+#, fuzzy
+msgid "Synchronize Scene Changes"
+msgstr "同步場景改動"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any changes made to the scene in the editor "
-"will be replicated in the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any changes made to the scene in the editor "
+"will be replicated in the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"啟用此選項後,編輯器中的所有修改,都會立即反映於運行中的遊戲。\n"
-"在遠端裝置測試時,配合網路文件系統(NFS)使用能更提高效率。"
+"開啟該選項後,編輯器中對該場景的所有改動都將被套用至執行中的遊戲。\n"
+"若在遠端裝置上使用,可使用網路檔案系統 NFS 以獲得最佳效能。"
#: editor/editor_node.cpp
-msgid "Sync Script Changes"
-msgstr "同步腳本的變更"
+#, fuzzy
+msgid "Synchronize Script Changes"
+msgstr "同步腳本改動"
#: editor/editor_node.cpp
+#, fuzzy
msgid ""
-"When this option is turned on, any script that is saved will be reloaded on "
-"the running game.\n"
-"When used remotely on a device, this is more efficient with network "
-"filesystem."
+"When this option is enabled, any script that is saved will be reloaded in "
+"the running project.\n"
+"When used remotely on a device, this is more efficient when the network "
+"filesystem option is enabled."
msgstr ""
-"啟用此選項後,腳本的所有修改,都會立即反映於運行中的遊戲。\n"
-"在遠端裝置測試時,配合網路文件系統(NFS)使用能更提高效率。"
+"開啟該選項後,保存之腳本都將於執行中的遊戲重新載入。\n"
+"若在遠端裝置上使用,可使用網路檔案系統 NFS 以獲得最佳效能。"
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
msgstr "編輯器"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "編輯器設定"
+msgstr "編輯器設定..."
#: editor/editor_node.cpp
msgid "Editor Layout"
-msgstr "編輯器佈局"
+msgstr "編輯器配置"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "儲存場景"
+msgstr "螢幕截圖"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "開啟 編輯器數據/設定 資料夾"
+msgstr "截圖將被儲存於編輯器資料或編輯器設定資料夾內。"
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "全螢幕顯示"
+msgstr "開啟/取消全螢幕顯示"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "切換模式"
+msgstr "開啟/關閉系統主控台"
#: editor/editor_node.cpp
msgid "Open Editor Data/Settings Folder"
-msgstr "開啟 編輯器數據/設定 資料夾"
+msgstr "開啟 編輯器資料/編輯器設定 資料夾"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr "開啟 編輯器數據 資料夾"
+msgstr "開啟編輯器資料目錄"
#: editor/editor_node.cpp
msgid "Open Editor Settings Folder"
-msgstr "開啟 編輯器設定 資料夾"
+msgstr "開啟編輯器設定目錄"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "管理輸出模板"
+msgstr "管理編輯器功能..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "管理輸出模板"
+msgstr "管理匯出樣板..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
-msgstr "幫助"
+msgstr "說明"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp
-#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Search"
msgstr "搜尋"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
msgid "Online Docs"
-msgstr "線上文件"
+msgstr "線上說明文件"
#: editor/editor_node.cpp
msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-#, fuzzy
-msgid "Issue Tracker"
-msgstr "問題追蹤器"
+msgid "Report a Bug"
+msgstr "回報錯誤"
+
+#: editor/editor_node.cpp
+msgid "Send Docs Feedback"
+msgstr "傳送說明文件回饋"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr "社區"
+msgstr "社群"
#: editor/editor_node.cpp
msgid "About"
@@ -3072,15 +2925,15 @@ msgstr "關於"
#: editor/editor_node.cpp
msgid "Play the project."
-msgstr "運行此專案。"
+msgstr "執行該專案。"
#: editor/editor_node.cpp
msgid "Play"
-msgstr "運行"
+msgstr "執行"
#: editor/editor_node.cpp
msgid "Pause the scene execution for debugging."
-msgstr ""
+msgstr "暫停該場景以進行除錯。"
#: editor/editor_node.cpp
msgid "Pause Scene"
@@ -3088,56 +2941,52 @@ msgstr "暫停場景"
#: editor/editor_node.cpp
msgid "Stop the scene."
-msgstr "停止此場景."
+msgstr "停止場景。"
#: editor/editor_node.cpp
msgid "Play the edited scene."
-msgstr "運行編輯過的場景。"
+msgstr "執行已編輯的場景。"
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr "運行場景"
+msgstr "執行場景"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr "運行自定義場景"
+msgstr "執行自定義場景"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "運行自定義場景"
+msgstr "執行自定義場景"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr "在更動顯示驅動後,必須重新開啟編輯器。"
+msgstr "更改視訊驅動程式需要重新啟動編輯器。"
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
msgid "Save & Restart"
-msgstr "儲存並重啟"
+msgstr "保存並重新啟動"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Spins when the editor window redraws."
-msgstr "在重新繪製(repaint)編輯器視窗時,來個旋轉!"
+msgstr "編輯器視窗重新繪製時旋轉。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "連續"
+msgstr "持續更新"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "有更動時自動更新"
+msgstr "更改時更新"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Hide Update Spinner"
-msgstr "禁止自動更新"
+msgstr "隱藏更新旋轉圖"
#: editor/editor_node.cpp
msgid "FileSystem"
-msgstr "文件系統"
+msgstr "檔案系統"
#: editor/editor_node.cpp
msgid "Inspector"
@@ -3149,20 +2998,19 @@ msgstr "展開底部面板"
#: editor/editor_node.cpp
msgid "Output"
-msgstr "輸出(output)"
+msgstr "輸出"
#: editor/editor_node.cpp
msgid "Don't Save"
-msgstr "不要儲存"
+msgstr "不保存"
#: editor/editor_node.cpp
msgid "Android build template is missing, please install relevant templates."
-msgstr ""
+msgstr "缺少 Android 建構樣板,請先安裝對應的樣板。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "管理輸出模板"
+msgstr "管理樣板"
#: editor/editor_node.cpp
msgid ""
@@ -3174,6 +3022,12 @@ msgid ""
"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] 選項。"
#: editor/editor_node.cpp
msgid ""
@@ -3182,35 +3036,36 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
+"該專案中已安裝 Android 建構樣板,將不會覆蓋。\n"
+"若要再次執行此操作,請先手動移除「res://android/build」目錄。"
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
-msgstr "導入模板(透過ZIP檔案)"
+msgstr "自 ZIP 檔匯入樣板"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "導出範本管理器"
+msgstr "樣板包"
#: editor/editor_node.cpp
msgid "Export Library"
-msgstr "輸出函式庫"
+msgstr "匯出函式庫"
#: editor/editor_node.cpp
msgid "Merge With Existing"
-msgstr "與現有函式庫合併"
+msgstr "與現有的合併"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
-msgstr "開啟並運行腳本"
+msgstr "開啟並執行腳本"
#: editor/editor_node.cpp
msgid "New Inherited"
-msgstr "從現有場景中建立"
+msgstr "新增繼承"
#: editor/editor_node.cpp
msgid "Load Errors"
-msgstr "讀取時出現錯誤"
+msgstr "載入錯誤"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
@@ -3218,11 +3073,11 @@ msgstr "選擇"
#: editor/editor_node.cpp
msgid "Open 2D Editor"
-msgstr "開啟2D編輯器"
+msgstr "開啟 2D 編輯器"
#: editor/editor_node.cpp
msgid "Open 3D Editor"
-msgstr "開啟3D編輯器"
+msgstr "開啟 3D 編輯器"
#: editor/editor_node.cpp
msgid "Open Script Editor"
@@ -3230,7 +3085,7 @@ msgstr "開啟腳本編輯器"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr "開啟素材倉庫"
+msgstr "開啟素材庫"
#: editor/editor_node.cpp
msgid "Open the next Editor"
@@ -3241,35 +3096,32 @@ msgid "Open the previous Editor"
msgstr "開啟上一個編輯器"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "警告"
+msgstr "警告!"
#: editor/editor_path.cpp
-#, fuzzy
msgid "No sub-resources found."
-msgstr "未指定表面源。"
+msgstr "未找到子資源。"
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr "創建網格預覽"
+msgstr "建立網格預覽"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
msgstr "縮圖…"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "開啟最近存取"
+msgstr "主腳本:"
#: editor/editor_plugin_settings.cpp
msgid "Edit Plugin"
-msgstr "編輯擴充功能"
+msgstr "編輯外掛"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
-msgstr "已安裝的擴充功能:"
+msgstr "已安裝的外掛:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Update"
@@ -3294,11 +3146,11 @@ msgstr "編輯:"
#: editor/editor_profiler.cpp
msgid "Measure:"
-msgstr "措施:"
+msgstr "測量:"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
-msgstr "幀時間 (秒)"
+msgstr "影格長度 (秒)"
#: editor/editor_profiler.cpp
msgid "Average Time (sec)"
@@ -3306,15 +3158,15 @@ msgstr "平均時間 (秒)"
#: editor/editor_profiler.cpp
msgid "Frame %"
-msgstr "幀%"
+msgstr "影格 %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr "物理幀%"
+msgstr "物理影格 %"
#: editor/editor_profiler.cpp
msgid "Inclusive"
-msgstr "包容"
+msgstr "全部"
#: editor/editor_profiler.cpp
msgid "Self"
@@ -3330,24 +3182,23 @@ msgstr "時間"
#: editor/editor_profiler.cpp
msgid "Calls"
-msgstr "調用"
+msgstr "呼叫"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Edit Text:"
-msgstr "編輯主題…"
+msgstr "編輯文字:"
#: editor/editor_properties.cpp editor/script_create_dialog.cpp
msgid "On"
-msgstr "啟用"
+msgstr "開啟"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr "層"
+msgstr "圖層"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr "位 %d, 值 %d"
+msgstr "位 %d,值 %d"
#: editor/editor_properties.cpp
msgid "[Empty]"
@@ -3358,21 +3209,22 @@ msgid "Assign..."
msgstr "指派..."
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Invalid RID"
-msgstr "無效的路徑"
+msgstr "無效的 RID"
#: editor/editor_properties.cpp
msgid ""
"The selected resource (%s) does not match any type expected for this "
"property (%s)."
-msgstr "所選資源(%s)與此内容(%s)所需的任何類型都不匹配。"
+msgstr "所選的資源(%s)並不符合任該屬性(%s)的任何型別。"
#: editor/editor_properties.cpp
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"無法為欲保存為檔案之資源建立 ViewportTexture。\n"
+"資源必須屬於一個場景。"
#: editor/editor_properties.cpp
msgid ""
@@ -3381,27 +3233,28 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"無法為該資源建立檢視區紋理 (ViewportTexture),因其未設定對應的本地場景。\n"
+"請開啟其(與其至節點的所有資源)「Local to Scene」屬性。"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
-msgstr "選擇一個視口"
+msgstr "選擇 Viewport"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
-msgstr "新建腳本"
+msgstr "新增腳本"
#: editor/editor_properties.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "開啟最近存取"
+msgstr "擴充腳本"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
-msgstr "新建 %s"
+msgstr "新增 %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Make Unique"
-msgstr "轉換為獨立資源"
+msgstr "獨立化"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3415,24 +3268,23 @@ msgstr "轉換為獨立資源"
#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
-msgstr "粘貼"
+msgstr "貼上"
#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Convert To %s"
-msgstr "轉換成..."
+msgstr "轉換為 %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
-msgstr "選定的節點不是視口!"
+msgstr "所選節點並非 Viewport!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr "尺寸: "
+msgstr "大小: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr "页: "
+msgstr "頁: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -3441,50 +3293,57 @@ msgstr "移除項目"
#: editor/editor_properties_array_dict.cpp
msgid "New Key:"
-msgstr "新建帧:"
+msgstr "新增索引鍵:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "數值"
+msgstr "新增數值:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "新增索引鍵/值組"
#: editor/editor_run_native.cpp
+#, fuzzy
msgid ""
"No runnable export preset found for this platform.\n"
-"Please add a runnable preset in the export menu."
+"Please add a runnable preset in the Export menu or define an existing preset "
+"as runnable."
msgstr ""
+"該平台沒有可執行的匯出預設設定。\n"
+"請在匯出選單中新增一個可執行的預設設定。"
#: editor/editor_run_script.cpp
msgid "Write your logic in the _run() method."
-msgstr "將您的邏輯寫在_run()方法中。"
+msgstr "在 _run() 方法中填寫邏輯。"
#: editor/editor_run_script.cpp
msgid "There is an edited scene already."
-msgstr "已經有一個正在編輯的場景。"
+msgstr "已有一個已編輯的場景。"
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
-msgstr "無法實例腳本:"
+msgstr "無法實體化腳本:"
#: editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
-msgstr "您是否遺漏了 'tool' 关键字?"
+msgstr "是否未加上「tool」關鍵字?"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr "無法運行腳本:"
+msgstr "無法執行腳本:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
-msgstr "您是否遺漏了 '_run' 方法?"
+msgstr "是否未新增「_run」方法?"
+
+#: editor/editor_spin_slider.cpp
+msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
+msgstr "按住 Ctrl 以取整數。按住 Shift 以使用更精確的改動。"
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
-msgstr "選擇要導入的節點"
+msgstr "選擇要匯入的節點"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
@@ -3492,24 +3351,23 @@ msgstr "瀏覽"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
-msgstr "場景路徑:"
+msgstr "場景路徑:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr "從節點導入:"
+msgstr "自節點中匯入:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Redownload"
msgstr "重新下載"
#: editor/export_template_manager.cpp
msgid "Uninstall"
-msgstr "卸載"
+msgstr "取消安裝"
#: editor/export_template_manager.cpp
msgid "(Installed)"
-msgstr "(已安裝)"
+msgstr "(已安裝)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3518,73 +3376,71 @@ msgstr "下載"
#: editor/export_template_manager.cpp
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "開發建構 (Development Build) 下無法使用官方匯出樣板。"
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr "(缺少)"
+msgstr "(遺失)"
#: editor/export_template_manager.cpp
msgid "(Current)"
-msgstr "(當前)"
+msgstr "(目前)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
-msgstr "正在檢索鏡像,請稍候…"
+msgstr "正在取得鏡像,請稍後..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr "是否删除版本為“%s”的範本?"
+msgstr "是否刪除樣板版本「%s」?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
-msgstr "無法打開zip導出範本。"
+msgstr "無法開啟匯出樣板 ZIP 檔。"
#: editor/export_template_manager.cpp
msgid "Invalid version.txt format inside templates: %s."
-msgstr "範本文件: %s 中的 version.txt 無效."
+msgstr "樣板 %s 中的 version.txt 格式無效。"
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr "範本中沒有找到version.txt文件。"
+msgstr "樣板中未找到 version.txt。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error creating path for templates:"
-msgstr "載入場景時發生錯誤"
+msgstr "為樣板建立路徑時發生錯誤:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
-msgstr "正在解壓導出範本"
+msgstr "正在解壓縮匯出樣板"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr "導入:"
+msgstr "正在匯入:"
#: editor/export_template_manager.cpp
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "取得鏡像列表時發生錯誤。"
#: editor/export_template_manager.cpp
msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
+msgstr "解析鏡像列表的 JSON 時發生錯誤。請回報此問題!"
#: editor/export_template_manager.cpp
msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
-msgstr "沒有找到這個版本的下載鏈接. 直接下載適用于正式版本."
+msgstr "未找到該版本的下載鏈接。直接下載僅適用於正式發行版本。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve."
-msgstr "無法解析."
+msgstr "無法解析。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Can't connect."
-msgstr "連接..."
+msgstr "無法連線。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3593,11 +3449,11 @@ msgstr "沒有回應。"
#: editor/export_template_manager.cpp
msgid "Request Failed."
-msgstr "請求失敗."
+msgstr "請求失敗。"
#: editor/export_template_manager.cpp
msgid "Redirect Loop."
-msgstr "重新定向循環."
+msgstr "重新導向循環。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3609,35 +3465,32 @@ msgid "Download Complete."
msgstr "下載完成。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "無法將主題保存到檔案:"
+msgstr "無法移除臨時檔案:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
-msgstr "範本安裝失敗。有問題的範本存檔可以在 \"%s\" 中找到。"
+msgstr ""
+"樣板安裝失敗。\n"
+"發生問題之樣板檔案存放於「%s」。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting URL:"
-msgstr "載入場景時發生錯誤"
+msgstr "請求 URL 時發生錯誤:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connecting to Mirror..."
-msgstr "連接..."
+msgstr "正在連線到鏡像..."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Disconnected"
-msgstr "斷線"
+msgstr "已斷開連線"
#: editor/export_template_manager.cpp
msgid "Resolving"
-msgstr "解析中"
+msgstr "正在解析"
#: editor/export_template_manager.cpp
msgid "Can't Resolve"
@@ -3645,19 +3498,16 @@ msgstr "無法解析"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Connecting..."
-msgstr "連接..."
+msgstr "正在連線..."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Can't Connect"
-msgstr "連接..."
+msgstr "無法連線"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connected"
-msgstr "連接..."
+msgstr "已連線"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3665,242 +3515,217 @@ msgid "Requesting..."
msgstr "正在請求…"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Downloading"
-msgstr "載入時發生錯誤:"
+msgstr "正在下載"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connection Error"
-msgstr "連接..."
+msgstr "連線錯誤"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr "SSL握手錯誤"
+msgstr "SSL 交握錯誤"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "正在解壓縮素材"
+msgstr "正在解壓縮 Android 建構來源"
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr "當前版本:"
+msgstr "目前版本:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr "已安裝版本:"
+msgstr "已安裝版本:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr "從檔案中安裝"
+msgstr "自檔案安裝"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr "移除範本"
+msgstr "移除樣板"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select Template File"
-msgstr "選擇範本檔案"
+msgstr "選擇樣板檔案"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Godot Export Templates"
-msgstr "管理輸出模板"
+msgstr "Godot 匯出樣板"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
-msgstr "導出範本管理器"
+msgstr "匯出樣板管理員"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Download Templates"
-msgstr "載入場景時發生錯誤"
+msgstr "下載樣板"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "從清單中選擇鏡像: (Shift + 單擊: 在瀏覽器中打開)"
+msgstr "自列表中選擇鏡像:(Shift+點擊:在瀏覽器中開啟)"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "我的最愛:"
+msgstr "我的最愛"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
-msgstr ""
+msgstr "狀態:檔案匯入失敗。請修正檔案並手動重新匯入。"
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr "無法移動/重命名資源根目錄。"
+msgstr "無法移動/重新命名根資源。"
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
-msgstr "無法將資料夾移動到其自身。"
+msgstr "無法移動資料夾至該資料夾自己。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error moving:"
-msgstr "載入時發生錯誤:"
+msgstr "移動時發生錯誤:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error duplicating:"
-msgstr "載入時發生錯誤:"
+msgstr "複製時發生錯誤:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Unable to update dependencies:"
-msgstr "場景缺少了某些資源以至於無法載入"
+msgstr "無法更新相依性:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
msgstr "未提供名稱。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "提供的名稱包含無效字元"
+msgstr "提供的名稱包含無效字元。"
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr "具有此名稱的檔或資料夾已存在。"
+msgstr "已有相同名稱的檔案或資料夾存在。"
#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "名稱包含無效字元。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Renaming file:"
-msgstr "載入時發生錯誤:"
+msgstr "重新命名檔案:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr "重命名資料夾:"
+msgstr "重新命名資料夾:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating file:"
-msgstr "載入時發生錯誤:"
+msgstr "複製檔案:"
#: editor/filesystem_dock.cpp
msgid "Duplicating folder:"
-msgstr "複製資料夾:"
+msgstr "複製資料夾:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Inherited Scene"
-msgstr "從現有場景中建立…"
+msgstr "新增繼承場景"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Set As Main Scene"
-msgstr "選取主要場景"
+msgstr "設為主場景"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scenes"
msgstr "開啟場景"
#: editor/filesystem_dock.cpp
msgid "Instance"
-msgstr "實例"
+msgstr "實體"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to Favorites"
-msgstr "我的最愛:"
+msgstr "新增到我的最愛"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from Favorites"
-msgstr "移除"
+msgstr "自我的最愛中移除"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr "編輯依賴項…"
+msgstr "編輯相依性..."
#: editor/filesystem_dock.cpp
msgid "View Owners..."
-msgstr "查看所有者…"
+msgstr "檢視擁有者..."
#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Rename..."
-msgstr "重命名…"
+msgstr "重新命名..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicate..."
-msgstr "複製動畫關鍵畫格"
+msgstr "重複..."
#: editor/filesystem_dock.cpp
msgid "Move To..."
-msgstr "移動到..。"
+msgstr "移動至..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "新場景"
+msgstr "新增場景..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "新增資料夾..."
+msgstr "新增腳本..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "另存資源為..."
+msgstr "新增資源..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Expand All"
-msgstr "展開所有"
+msgstr "展開全部"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "取代全部"
+msgstr "收合全部"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
#: editor/scene_tree_dock.cpp
msgid "Rename"
-msgstr "重命名"
+msgstr "重新命名"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Previous Folder/File"
-msgstr "上個分頁"
+msgstr "上一個資料夾/檔案"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "新增資料夾"
+msgstr "下一個資料夾/檔案"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
msgstr "重新掃描檔案系統"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle Split Mode"
-msgstr "切換模式"
+msgstr "開啟/關閉分割模式"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Search files"
-msgstr "搜尋 Class"
+msgstr "搜尋檔案"
#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
-msgstr "正在掃描檔, 請稍候..。"
+msgstr ""
+"正在掃描檔案,\n"
+"請稍後..."
#: editor/filesystem_dock.cpp
msgid "Move"
@@ -3908,292 +3733,270 @@ msgstr "移動"
#: editor/filesystem_dock.cpp
msgid "There is already file or folder with the same name in this location."
-msgstr "此位置已存在同名的檔案或資料夾。"
+msgstr "該位置已有相同名稱的檔案或資料夾。"
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr "覆蓋"
+msgstr "複寫"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Create Scene"
-msgstr "從場景創建"
+msgstr "建立場景"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr "創建腳本"
+msgstr "建立腳本"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "還有 %d 個檔案"
+msgstr "在檔案中搜尋"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "尋找"
+msgstr "搜尋:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "新增資料夾"
+msgstr "資料夾:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "過濾器:"
+msgstr "篩選:"
#: editor/find_in_files.cpp
msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
-msgstr ""
+msgstr "包含有下列副檔名的檔案。可在專案設定中新增或移除。"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr "尋找..."
+msgstr "搜尋..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
-msgstr "替換…"
+msgstr "取代..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
msgstr "取消"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "尋找"
+msgstr "搜尋: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "取代"
+msgstr "取代: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "取代全部"
+msgstr "全部取代(無法復原)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "搜尋"
+msgstr "正在搜尋..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "搜尋詞彙"
+msgstr "搜尋完成"
#: editor/groups_editor.cpp
msgid "Add to Group"
-msgstr "添加到組"
+msgstr "新增到群組"
#: editor/groups_editor.cpp
msgid "Remove from Group"
-msgstr "從群組移除"
+msgstr "自群組中移除"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "Autoload「%s」已經存在!"
+msgstr "群組名稱已存在。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "不能使用的名稱。"
+msgstr "無效的群組名稱。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "管理組"
+msgstr "重新命名群組"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Delete Group"
-msgstr "刪除佈局"
+msgstr "刪除群組"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
-msgstr "組"
+msgstr "群組"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes Not in Group"
-msgstr "不在組中的節點"
+msgstr "節點不在群組中"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Filter nodes"
-msgstr "過濾檔案..."
+msgstr "篩選節點"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
-msgstr "組中的節點"
+msgstr "群組中的節點"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
-msgstr ""
+msgstr "空群組將被自動移除。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "開啟腳本編輯器"
+msgstr "群組編輯器"
#: editor/groups_editor.cpp
msgid "Manage Groups"
-msgstr "管理組"
+msgstr "管理群組"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import as Single Scene"
-msgstr "更新場景"
+msgstr "匯入為單一場景"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Animations"
-msgstr "使用單獨的動畫一同導入"
+msgstr "與動畫分別匯入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials"
-msgstr "使用單獨的材 一同導入"
+msgstr "與素材分別匯入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects"
-msgstr "使用單獨的物件導入"
+msgstr "與物件單獨匯入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials"
-msgstr "使用單獨的對象+材質導入"
+msgstr "與物件 + 素材分別匯入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Animations"
-msgstr "使用單獨的對象+動畫導入"
+msgstr "與物件 + 動畫分別匯入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr "使用單獨的材質+動畫導入"
+msgstr "與素材 + 動畫分別匯入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "使用單獨的對象+材質+動畫導入"
+msgstr "與物件 + 素材 + 動畫分別匯入"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
-msgstr "作為多個場景導入"
+msgstr "匯入為多個場景"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes+Materials"
-msgstr "導入為多個場景+材質"
+msgstr "匯入為多個場景 + 素材"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import Scene"
-msgstr "導入場景"
+msgstr "匯入場景"
#: editor/import/resource_importer_scene.cpp
msgid "Importing Scene..."
-msgstr "正在導入場景…"
+msgstr "正在匯入場景..."
#: editor/import/resource_importer_scene.cpp
msgid "Generating Lightmaps"
-msgstr "生成光照圖"
+msgstr "正在產生光照圖"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr "為網格生成: "
+msgstr "正在產生網格: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
-msgstr "正在運行自定義腳本…"
+msgstr "正在執行自定腳本..."
#: editor/import/resource_importer_scene.cpp
msgid "Couldn't load post-import script:"
-msgstr "無法加載導入後腳本:"
+msgstr "無法載入 Post-Import 腳本:"
#: editor/import/resource_importer_scene.cpp
msgid "Invalid/broken script for post-import (check console):"
-msgstr "導入後腳本無效/已損壞(檢查控制台):"
+msgstr "匯入後腳本無效或損毀(請檢查主控台):"
#: editor/import/resource_importer_scene.cpp
msgid "Error running post-import script:"
-msgstr "運行導入後腳本時出錯:"
+msgstr "執行匯入後腳本時發生錯誤:"
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Did you return a Node-derived object in the `post_import()` method?"
+msgstr "是否有在 `post_import()` 方法內回傳繼承 Node 之物件?"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
-msgstr "儲存中……"
+msgstr "正在保存..."
#: editor/import_dock.cpp
-msgid "Set as Default for '%s'"
-msgstr "設定為“%s”的預設值"
+msgid "%d Files"
+msgstr "%d 個檔案"
#: editor/import_dock.cpp
-msgid "Clear Default for '%s'"
-msgstr "清除“%s”的預設值"
+msgid "Set as Default for '%s'"
+msgstr "設為「%s」的預設"
#: editor/import_dock.cpp
-msgid " Files"
-msgstr " 資料夾"
+msgid "Clear Default for '%s'"
+msgstr "清除「%s」的預設"
#: editor/import_dock.cpp
msgid "Import As:"
-msgstr "導入為:"
+msgstr "匯入為:"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Preset"
-msgstr "預設"
+msgstr "預設設定"
#: editor/import_dock.cpp
msgid "Reimport"
-msgstr "重新導入"
+msgstr "重新匯入"
#: editor/import_dock.cpp
-msgid "Save scenes, re-import and restart"
-msgstr "保存場景,重新導入並重新啟動"
+msgid "Save Scenes, Re-Import, and Restart"
+msgstr "保存場景、重新匯入、並重新啟動"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
-msgstr ""
+msgstr "修改匯入檔案的型別需要重新啟動編輯器。"
#: editor/import_dock.cpp
msgid ""
"WARNING: Assets exist that use this resource, they may stop loading properly."
-msgstr ""
+msgstr "警告:有素材使用該資源,將無法正確加載。"
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
-msgstr "載入資源失敗。"
+msgstr "加載資源失敗。"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "展開所有屬性"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "展開所有屬性"
+msgstr "收合所有屬性"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Save As..."
-msgstr "另存為..。"
+msgstr "另存為..."
#: editor/inspector_dock.cpp
msgid "Copy Params"
msgstr "複製參數"
#: editor/inspector_dock.cpp
-msgid "Paste Params"
-msgstr "貼上參數"
-
-#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "資源路徑"
+msgstr "編輯資源剪貼簿"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -4201,78 +4004,75 @@ msgstr "複製資源"
#: editor/inspector_dock.cpp
msgid "Make Built-In"
-msgstr "內置"
+msgstr "轉為內建"
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr "使子資源唯一"
+msgstr "獨立化子資源"
#: editor/inspector_dock.cpp
msgid "Open in Help"
-msgstr "在幫助界面中開啟"
+msgstr "在說明中開啟"
#: editor/inspector_dock.cpp
msgid "Create a new resource in memory and edit it."
-msgstr "在記憶體中創建一個新資源並對其進行編輯。"
+msgstr "在記憶體中建立新資源並編輯。"
#: editor/inspector_dock.cpp
msgid "Load an existing resource from disk and edit it."
-msgstr "從磁片加載現有資源並對其進行編輯。"
+msgstr "從磁碟中載入現有的資源並編輯。"
#: editor/inspector_dock.cpp
msgid "Save the currently edited resource."
-msgstr "保存當前編輯的資源。"
+msgstr "保存目前編輯的資源。"
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
-msgstr "轉到歷史記錄中以前編輯的對象。"
+msgstr "跳至歷史記錄中上一個編輯的物件。"
#: editor/inspector_dock.cpp
msgid "Go to the next edited object in history."
-msgstr "轉到歷史記錄中的下一個編輯對象。"
+msgstr "跳至歷史記錄中下一個編輯的物件。"
#: editor/inspector_dock.cpp
msgid "History of recently edited objects."
-msgstr "最近編輯對象的歷史記錄。"
+msgstr "最近編輯的物件歷史記錄。"
#: editor/inspector_dock.cpp
msgid "Object properties."
-msgstr "對象内容。"
+msgstr "物件屬性。"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "過濾檔案..."
+msgstr "篩選屬性"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
-msgstr "更改可能會丟失!"
+msgstr "改動可能會遺失!"
#: editor/multi_node_edit.cpp
msgid "MultiNode Set"
-msgstr "多節點集"
+msgstr "多節點組"
#: editor/node_dock.cpp
-#, fuzzy
msgid "Select a single node to edit its signals and groups."
-msgstr "選擇要編輯訊號和組的節點。"
+msgstr "選擇單一節點以編輯其訊號與群組。"
#: editor/plugin_config_dialog.cpp
msgid "Edit a Plugin"
-msgstr "編輯挿件"
+msgstr "編輯外掛"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "新增"
+msgstr "建立外掛"
#: editor/plugin_config_dialog.cpp
msgid "Plugin Name:"
-msgstr "挿件名稱:"
+msgstr "外掛名稱:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr "子資料夾:"
+msgstr "子資料夾:"
#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp
msgid "Language:"
@@ -4288,16 +4088,14 @@ msgstr "現在啟動?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "新增資料夾"
+msgstr "新增多邊形"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "刪除"
+msgstr "建立頂點。"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
@@ -4305,30 +4103,30 @@ msgid ""
"LMB: Move Point\n"
"RMB: Erase Point"
msgstr ""
+"編輯頂點。\n"
+"左鍵點擊:移動頂點\n"
+"右鍵點擊:刪除頂點"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Erase points."
-msgstr "所有的選擇"
+msgstr "移除頂點。"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Edit Polygon"
-msgstr "新增資料夾"
+msgstr "編輯多邊形"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
-msgstr "插入點"
+msgstr "插入頂點"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Edit Polygon (Remove Point)"
-msgstr "編輯多邊形 (刪除點)"
+msgstr "編輯多邊形(移除頂點)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Remove Polygon And Point"
-msgstr "移除"
+msgstr "移除多邊形與頂點"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4336,56 +4134,51 @@ msgstr "移除"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Animation"
-msgstr "添加動畫"
+msgstr "新增動畫"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load..."
-msgstr "載入"
+msgstr "載入..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Move Node Point"
-msgstr "移除"
+msgstr "移動節點頂點"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Limits"
-msgstr "更改 BlendSpace1D 限制"
+msgstr "修改混合空間 1D 限制"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Labels"
-msgstr "更改Blendspace1d標籤"
+msgstr "修改混合空間 1D 標籤"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr "無法使用此類型的節點。只允許根節點。"
+msgstr "無法使用該類型的節點。僅允許根節點。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Node Point"
-msgstr "移除"
+msgstr "新增節點頂點"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Animation Point"
-msgstr "動畫空間。"
+msgstr "新增動畫頂點"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace1D Point"
-msgstr "移除"
+msgstr "移除混合空間 1D 頂點"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Move BlendSpace1D Node Point"
-msgstr "移動 BlendSpace1D 節點點"
+msgstr "移動混合空間 1D 節點頂點"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4395,23 +4188,23 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
-"動畫樹處於非活動狀態。\n"
-"激活以啟用播放, 如果啟動失敗, 請檢查節點警告。"
+"動畫樹未啟用。\n"
+"請先啟用以播放,若啟用失敗請檢查節點警告訊息。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr "設置空間內的混合位置"
+msgstr "在此空間中設定混合位置"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "選擇與移動頂點,使用滑鼠右鍵建立頂點。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
msgid "Enable snap and show grid."
-msgstr "啟用捕捉並顯示網格。"
+msgstr "啟用吸附並顯示網格。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -4421,69 +4214,63 @@ msgstr "點"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "相依性編輯器"
+msgstr "開啟編輯器"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "最佳化動畫"
+msgstr "開啟動畫節點"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists."
-msgstr "Autoload「%s」已經存在!"
+msgstr "已存在三角形。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Add Triangle"
-msgstr "添加動畫軌"
+msgstr "新增三角形"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Limits"
-msgstr "更改Blendspace2d限制"
+msgstr "修改 BlendSpace2D 限制"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Change BlendSpace2D Labels"
-msgstr "更改Blendspace2d標籤"
+msgstr "修改 BlendSpace2D 標籤"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Remove BlendSpace2D Point"
-msgstr "移除"
+msgstr "移除 BlendSpace2D 頂點"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Remove BlendSpace2D Triangle"
-msgstr "删除Blendspace2d三角形"
+msgstr "移除 BlendSpace2D 三角形"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr "Blendspace2d不屬於AnimationTree節點。"
+msgstr "BlendSpace2D 不屬於任何 AnimationTree 節點。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr "不存在三角形, 因此不能進行混合。"
+msgstr "無三角形,將不會進行混合。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Toggle Auto Triangles"
-msgstr "切換最愛"
+msgstr "開啟/取消自動三角形"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr "通過連接點創建三角形。"
+msgstr "通過連接頂點來建立三角形。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr "删除點和三角形。"
+msgstr "刪除頂點與三角形。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr "自動生成混合三角形 (而不是手動生成)"
+msgstr "自動產生混合三角形(而非手動)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4491,131 +4278,116 @@ msgid "Blend:"
msgstr "混合:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Parameter Changed"
-msgstr "正在儲存變更..."
+msgstr "已更改參數"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filters"
-msgstr "過濾檔案..."
+msgstr "編輯篩選條件"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr "無法將輸出節點添加到混合樹中。"
+msgstr "輸出節點無法被新增至混合樹。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Add Node to BlendTree"
-msgstr "將節點添加到BlendTree"
+msgstr "新增節點至混合樹"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Node Moved"
-msgstr "節點名稱:"
+msgstr "已移動節點"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr "無法連接,埠可能正在使用,或者連接可能無效。"
+msgstr "無法連線,該連接埠可能已被佔用或連線無效。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Connected"
-msgstr "連接..."
+msgstr "已連接節點"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Nodes Disconnected"
-msgstr "斷線"
+msgstr "已斷開節點連接"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Set Animation"
-msgstr "動畫最佳化"
+msgstr "設定動畫"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Node"
-msgstr "刪除"
+msgstr "刪除節點"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
-msgstr ""
+msgstr "刪除節點"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Filter On/Off"
-msgstr "切換最愛"
+msgstr "開啟/關閉篩選"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Change Filter"
-msgstr "變更鏡頭尺寸"
+msgstr "更改篩選條件"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
-msgstr "沒有設定動畫播放機,囙此無法檢索曲目名稱。"
+msgstr "未設定動畫播放器,無法取得軌道名稱。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
+msgstr "播放器位置無效,無法取得軌道名稱。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
-msgstr ""
+msgstr "動畫播放器的根節點位置無效,無法取得軌道名稱。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Anim Clips"
-msgstr "動畫剪輯:"
+msgstr "動畫片段"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Audio Clips"
-msgstr "音訊剪輯:"
+msgstr "音訊片段"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Functions"
-msgstr "函數:"
+msgstr "函式"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Renamed"
-msgstr "節點名稱:"
+msgstr "已重新命名節點"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node..."
-msgstr "添加節點..。"
+msgstr "新增節點..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "過濾檔案..."
+msgstr "編輯已篩選的軌道:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable Filtering"
-msgstr "啟用篩選"
+msgstr "啟用條件篩選"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
-msgstr "切換自動播放"
+msgstr "開啟/關閉自動播放"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr "新動畫名稱:"
+msgstr "新增動畫名稱:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
@@ -4623,12 +4395,12 @@ msgstr "新增動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr "更改動畫名稱:"
+msgstr "更改動畫名稱:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Animation?"
-msgstr "刪除動畫?"
+msgstr "是否刪除動畫?"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -4636,27 +4408,25 @@ msgid "Remove Animation"
msgstr "移除動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "不能使用的名稱。"
+msgstr "無效的動畫名稱!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "Autoload「%s」已經存在!"
+msgstr "動畫名稱已存在!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Rename Animation"
-msgstr "重命名動畫"
+msgstr "重新命名動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
-msgstr "混合下一個更改"
+msgstr "混合下一個改動"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
-msgstr "更改混合時間"
+msgstr "修改混合時間"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
@@ -4664,49 +4434,47 @@ msgstr "載入動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
-msgstr "複製動畫"
+msgstr "重複動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "動畫空間。"
+msgstr "無動畫可複製!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "在資源路徑中找不到"
+msgstr "剪貼簿中無動畫資源!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
-msgstr "粘貼的動畫"
+msgstr "已貼上的動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Paste Animation"
-msgstr "粘貼動畫"
+msgstr "貼上動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "No animation to edit!"
-msgstr "沒有要編輯的動畫!"
+msgstr "無動畫可編輯!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
-msgstr "從當前位置向後播放所選動畫。(A)"
+msgstr "自目前位置開始倒放所選的動畫。 (A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "從結尾向後播放選定的動畫。(Shift+a)"
+msgstr "自結尾倒放所選動畫。(Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
-msgstr "停止動畫回放。(S)"
+msgstr "停止播放動畫。(S)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
-msgstr "從頭開始播放選取中的動畫。(Shift+D)"
+msgstr "從頭播放所選動畫。(Shift+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
-msgstr "從當前位置播放選定的動畫。(D)"
+msgstr "自目前位置開始播放所選動畫。(D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation position (in seconds)."
@@ -4714,7 +4482,7 @@ msgstr "動畫位置(秒)。"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Scale animation playback globally for the node."
-msgstr "在全域範圍內縮放節點的動畫播放。"
+msgstr "為節點全域縮放動畫播放。"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
@@ -4725,40 +4493,36 @@ msgid "Animation"
msgstr "動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "轉場動畫"
+msgstr "編輯轉場..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "開啟資料夾"
+msgstr "在屬性面板中開啟"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
-msgstr "在播放機中顯示動畫清單。"
+msgstr "在播放器中顯示動畫列表。"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Autoplay on Load"
-msgstr "載入后自動播放"
+msgstr "載入後自動播放"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Enable Onion Skinning"
-msgstr "啟用洋葱皮"
+msgstr "啟用描圖紙"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Onion Skinning Options"
-msgstr "洋葱皮"
+msgstr "描圖紙選項"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Directions"
-msgstr "描述:"
+msgstr "方向"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Past"
-msgstr "跳過"
+msgstr "過去"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Future"
@@ -4770,39 +4534,39 @@ msgstr "深度"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
-msgstr "1步"
+msgstr "1 步"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "2 steps"
-msgstr "2步"
+msgstr "2 步"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "3 steps"
-msgstr "3步"
+msgstr "3 步"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Differences Only"
-msgstr "僅差異"
+msgstr "僅顯示差異"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Force White Modulate"
-msgstr "強制白色調節"
+msgstr "強制使用白色調整"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
-msgstr "包括3D控制器"
+msgstr "包含 Gizmo (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pin AnimationPlayer"
-msgstr ""
+msgstr "固定 AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
-msgstr "創建新動畫"
+msgstr "建立新動畫"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Name:"
-msgstr "動畫名稱:"
+msgstr "動畫名稱:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
@@ -4813,35 +4577,32 @@ msgstr "錯誤!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
-msgstr "混合時間:"
+msgstr "混合時間:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
-msgstr "下一個(自動隊列):"
+msgstr "下一個(自動佇列):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
msgstr "跨動畫混合時間"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Move Node"
msgstr "移動節點"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition exists!"
-msgstr "轉場: "
+msgstr "轉場已存在!"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Add Transition"
-msgstr "添加轉換"
+msgstr "新增轉場"
#: editor/plugins/animation_state_machine_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node"
-msgstr "添加節點"
+msgstr "新增節點"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
@@ -4857,7 +4618,7 @@ msgstr "同步"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr "在末尾"
+msgstr "在結尾"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
@@ -4865,26 +4626,23 @@ msgstr "行程"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "子轉場必須要有開始與結束節點。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "在資源路徑中找不到"
+msgstr "路徑 %s 中沒有可播放的資源。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Node Removed"
msgstr "已刪除節點"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition Removed"
-msgstr "已刪除轉換"
+msgstr "已刪除轉場"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set Start Node (Autoplay)"
-msgstr ""
+msgstr "設定開始節點(自動播放)"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4892,38 +4650,37 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"選擇與移動節點。\n"
+"右鍵點擊以新增節點。\n"
+"Shift+左鍵點擊以建立連接。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "新增 %s"
+msgstr "建立新節點。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "連接..."
+msgstr "連接節點。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Remove selected node or transition."
-msgstr "移除選擇的動畫軌。"
+msgstr "移除所選的節點或轉場。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
-msgstr ""
+msgstr "開啟/關閉自動播放動畫於開始、重新啟動或搜尋至 0 時。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "設定結尾動畫。對於子轉場很有用。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition: "
-msgstr "轉場: "
+msgstr "轉場: "
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Play Mode:"
-msgstr "平移模式"
+msgstr "播放模式:"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4932,16 +4689,16 @@ msgstr "動畫樹"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
-msgstr "新名稱:"
+msgstr "新名稱:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Scale:"
-msgstr "縮放:"
+msgstr "縮放:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade In (s):"
-msgstr "淡入(秒):"
+msgstr "淡入(秒):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade Out (s):"
@@ -4949,23 +4706,23 @@ msgstr "淡出(秒):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend"
-msgstr "混合"
+msgstr "混合 (Blend)"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Mix"
-msgstr "混合"
+msgstr "混合 (Mix)"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Auto Restart:"
-msgstr "自動重新開始:"
+msgstr "自動重新開始:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
-msgstr "重新開始(秒):"
+msgstr "重新開始(秒):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Random Restart (s):"
-msgstr "隨機重新開始(秒):"
+msgstr "隨機重新開始(秒):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Start!"
@@ -4978,201 +4735,193 @@ msgstr "數量:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
-msgstr "混合 0:"
+msgstr "混合 0:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 1:"
-msgstr "混合 1:"
+msgstr "混合 1:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "X-Fade Time (s):"
-msgstr ""
+msgstr "淡入與淡出時間(秒):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Current:"
-msgstr "當前:"
+msgstr "目前:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Input"
-msgstr "添加輸入"
+msgstr "新增輸入"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
-msgstr "清除Auto-Advance"
+msgstr "清除自動 Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
-msgstr "設定自動前進"
+msgstr "設定自動 Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Delete Input"
-msgstr "刪除輸入事件"
+msgstr "刪除輸入"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is valid."
-msgstr "動畫樹有效。"
+msgstr "有效動畫樹。"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is invalid."
-msgstr "動畫樹無效。"
+msgstr "無效的動畫樹。"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation Node"
-msgstr "動畫節點"
+msgstr "Animation 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "OneShot Node"
-msgstr "單項節點"
+msgstr "OneShot 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Mix Node"
-msgstr "混合節點"
+msgstr "Mix 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend2 Node"
-msgstr "混合2 節點"
+msgstr "Blend2 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend3 Node"
-msgstr "混合3 節點"
+msgstr "Blend3 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend4 Node"
-msgstr "混合4 節點"
+msgstr "Blend4 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeScale Node"
-msgstr "時間尺度節點"
+msgstr "TimeScale 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeSeek Node"
-msgstr "時間搜索節點"
+msgstr "TimeSeek 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
-msgstr "轉場節點"
+msgstr "Transition 節點"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Import Animations..."
-msgstr "導入動畫…"
+msgstr "匯入動畫…"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr "編輯節點篩選"
+msgstr "編輯節點篩選條件"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
-msgstr "篩選…"
+msgstr "篩選..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Contents:"
msgstr "內容:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "View Files"
-msgstr "查看檔案"
+msgstr "檢視檔案"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
-msgstr "連接錯誤, 請重試。"
+msgstr "連線錯誤,請重試。"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect to host:"
-msgstr "無法連接到主機:"
+msgstr "無法連線至主機:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response from host:"
-msgstr "主機沒有響應:"
+msgstr "主機沒有回應:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve hostname:"
-msgstr "無法解析主機名稱:"
+msgstr "無法解析主機名稱:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
-msgstr "請求失敗, 返回代碼:"
+msgstr "請求失敗,回傳代碼:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed."
-msgstr "請求失敗."
+msgstr "請求失敗。"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Cannot save response to:"
-msgstr "無法將主題保存到檔案:"
+msgstr "無法保存回覆至:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Write error."
-msgstr ""
+msgstr "寫入錯誤。"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
-msgstr "請求失敗, 重定向次數太多"
+msgstr "請求失敗,過多重新導向"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Redirect loop."
-msgstr "重新定向循環."
+msgstr "重新導向循環。"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed, timeout"
-msgstr "請求失敗, 返回代碼:"
+msgstr "請求失敗,逾時"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Timeout."
-msgstr "時間"
+msgstr "逾時。"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
-msgstr ""
+msgstr "下載雜湊錯誤,檔案可能被篡改。"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
-msgstr "預期:"
+msgstr "應為:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Got:"
-msgstr "獲得:"
+msgstr "獲得:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed sha256 hash check"
-msgstr "sha256哈希值檢查失敗"
+msgstr "SHA-256 雜湊檢查失敗"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
-msgstr "資源下載錯誤:"
+msgstr "素材下載錯誤:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
msgstr "正在下載 (%s / %s)…"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "正在下載……"
+msgstr "正在下載..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
-msgstr "解析中…"
+msgstr "正在解析..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Error making request"
-msgstr "請求時發生錯誤"
+msgstr "建立請求時發生錯誤"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Idle"
-msgstr "空閒"
+msgstr "待命"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install..."
-msgstr "安裝"
+msgstr "安裝..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -5184,46 +4933,43 @@ msgstr "下載錯誤"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
-msgstr "此資源文檔正在下載中!"
+msgstr "該素材已在下載中!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Recently Updated"
-msgstr ""
+msgstr "最近更新"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Least Recently Updated"
-msgstr ""
+msgstr "最近更新(倒序)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (A-Z)"
-msgstr ""
+msgstr "名稱(A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Name (Z-A)"
-msgstr ""
+msgstr "名稱(Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (A-Z)"
-msgstr "授權"
+msgstr "授權(A-Z)"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "License (Z-A)"
-msgstr "授權"
+msgstr "授權(Z-A)"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
-msgstr "第一項"
+msgstr "首頁"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "上個分頁"
+msgstr "上一頁"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
-msgstr "下一個"
+msgstr "下一頁"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
@@ -5235,35 +4981,32 @@ msgstr "全部"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No results for \"%s\"."
-msgstr ""
+msgstr "無「%s」相關的結果。"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Import..."
-msgstr "導入"
+msgstr "匯入..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Plugins..."
-msgstr "挿件"
+msgstr "外掛..."
#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
-msgstr "排序:"
+msgstr "排序:"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
msgid "Category:"
-msgstr "類別:"
+msgstr "分類:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Site:"
-msgstr "地址:"
+msgstr "網站:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Support"
-msgstr "支持…"
+msgstr "支援"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
@@ -5274,13 +5017,12 @@ msgid "Testing"
msgstr "測試"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Loading..."
-msgstr "載入"
+msgstr "正在載入..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
-msgstr "ZIP資源包"
+msgstr "素材 ZIP 檔"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid ""
@@ -5288,104 +5030,97 @@ msgid ""
"Save your scene (for images to be saved in the same dir), or pick a save "
"path from the BakedLightmap properties."
msgstr ""
+"無法判斷光照圖的保存路徑。\n"
+"請將場景保存(圖片將保存於相同資料夾),或是在 BackedLightmap 屬性內選擇一個"
+"保存路徑。"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
-#, fuzzy
msgid ""
"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
"Light' flag is on."
-msgstr "沒有可供渲染的Meshes,請確保Mesh包含UV2通道並且勾選'Bake Light'選項"
+msgstr ""
+"無可製作之網格。請確保這些網格包含 UV2 通道並已開啟「Bake Light」旗標。"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Failed creating lightmap images, make sure path is writable."
-msgstr "創建光圖圖像失敗, 請確保路徑是可寫的。"
+msgstr "建立光照圖失敗,請確保該路徑可寫入。"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Bake Lightmaps"
-msgstr "渲染光圖"
+msgstr "建立光照圖"
#: editor/plugins/camera_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Preview"
msgstr "預覽"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
-msgstr "配置吸附"
+msgstr "設定吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Offset:"
-msgstr "網格偏移量:"
+msgstr "網格偏移量:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Step:"
-msgstr "網格大小:"
+msgstr "網格大小:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Primary Line Every:"
-msgstr ""
+msgstr "主要線條間隔:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "steps"
-msgstr "2步"
+msgstr "步長"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
-msgstr "旋轉偏移量:"
+msgstr "旋轉偏移量:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
-msgstr "旋轉步驟:"
+msgstr "旋轉步長:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Step:"
-msgstr "縮放:"
+msgstr "縮放步長:"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Vertical Guide"
-msgstr "垂直移動尺標"
+msgstr "移動垂直參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Vertical Guide"
-msgstr "創建新的垂直尺標"
+msgstr "建立垂直參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Vertical Guide"
-msgstr "刪除垂直尺標"
+msgstr "移除垂直參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move Horizontal Guide"
-msgstr "移動水平尺標"
+msgstr "移動水平參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal Guide"
-msgstr "創建新的水平尺標"
+msgstr "建立水平參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Remove Horizontal Guide"
-msgstr "移除水平尺標"
+msgstr "移除水平參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Horizontal and Vertical Guides"
-msgstr "創建新的水平和垂直尺標"
+msgstr "建立水平與垂直參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "移動樞軸"
+msgstr "移動軸心"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotate CanvasItem"
-msgstr "旋轉CanvasItem"
+msgstr "旋轉 CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move anchor"
@@ -5393,112 +5128,99 @@ msgstr "移動錨點"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Resize CanvasItem"
-msgstr "調整CanvasItem的大小"
+msgstr "調整 CanvasItem 大小"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale CanvasItem"
-msgstr "縮放CanvasItem"
+msgstr "縮放 CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
-msgstr "移動CanvasItem"
+msgstr "移動 CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"Children of containers have their anchors and margins values overridden by "
"their parent."
-msgstr "容器的子級的錨定值和頁邊距值被其父級覆蓋。"
+msgstr "容器子項目的錨點與外邊距值遭其母項目複寫。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Presets for the anchors and margins values of a Control node."
-msgstr ""
+msgstr "控制節點的錨點與外邊距之預設設定。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"When active, moving Control nodes changes their anchors instead of their "
"margins."
-msgstr ""
+msgstr "啟用後,移動控制節點將修改錨點而非外邊距。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Left"
-msgstr "左"
+msgstr "左上"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Right"
-msgstr "右"
+msgstr "右上"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Right"
-msgstr "向右旋轉"
+msgstr "右下"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Left"
-msgstr "底部視圖"
+msgstr "左下"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Left"
-msgstr "向左縮進"
+msgstr "中左"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Top"
-msgstr "居中選擇"
+msgstr "中上"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Right"
-msgstr "向右縮進"
+msgstr "中右"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Center Bottom"
-msgstr "底部"
+msgstr "中下"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center"
-msgstr ""
+msgstr "中央"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Left Wide"
-msgstr "左視圖"
+msgstr "左延展"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Top Wide"
-msgstr "俯視圖"
+msgstr "上延展"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Right Wide"
-msgstr "右視圖"
+msgstr "右延展"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Bottom Wide"
-msgstr "底部視圖"
+msgstr "下延展"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "VCenter Wide"
-msgstr ""
+msgstr "垂直中央延展"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "HCenter Wide"
-msgstr ""
+msgstr "水平中央延展"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Full Rect"
-msgstr ""
+msgstr "全矩形"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Keep Ratio"
-msgstr "縮放比例:"
+msgstr "保持比例"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -5506,11 +5228,11 @@ msgstr "僅限錨點"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Change Anchors and Margins"
-msgstr "改變錨點和邊距"
+msgstr "修改錨點與外邊距"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Change Anchors"
-msgstr "改變錨點"
+msgstr "修改錨點"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5518,6 +5240,8 @@ msgid ""
"Game Camera Override\n"
"Overrides game camera with editor viewport camera."
msgstr ""
+"遊戲相機複寫\n"
+"以檢視區相機取代遊戲相機。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5525,69 +5249,64 @@ msgid ""
"Game Camera Override\n"
"No game instance running."
msgstr ""
+"遊戲相機複寫\n"
+"無正在執行的遊戲實體。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock Selected"
-msgstr "工具選擇"
+msgstr "鎖定所選"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Unlock Selected"
-msgstr "工具選擇"
+msgstr "取消鎖定所選"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Group Selected"
-msgstr "複製選擇"
+msgstr "為所選的項目建立群組"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Ungroup Selected"
-msgstr "複製選擇"
+msgstr "移除所選項目的群組"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
-msgstr "粘貼姿勢"
+msgstr "貼上姿勢"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Guides"
-msgstr "清除姿勢"
+msgstr "清除參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create Custom Bone(s) from Node(s)"
-msgstr "從節點製作自定義骨骼"
+msgstr "自節點建立自定骨骼"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Bones"
-msgstr "清除姿勢"
+msgstr "清除骨骼"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
-msgstr "製作IK鏈"
+msgstr "建立 IK 鏈"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear IK Chain"
-msgstr "清除IK鏈"
+msgstr "清除 IK 鏈"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"Warning: Children of a container get their position and size determined only "
"by their parent."
-msgstr "警告:容器的子級只能由其父級確定其位置和大小。"
+msgstr "警告:容器子項目之位置與大小由其母項目決定。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "重置縮放"
+msgstr "重設縮放"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5596,19 +5315,19 @@ msgstr "選擇模式"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
-msgstr "拖動: 旋轉"
+msgstr "拖移:旋轉"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
-msgstr "Alt+Drag:移動"
+msgstr "Alt+拖移:移動"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
-msgstr "按 \"v\" 更改樞軸, \"Shift + v\" 以拖動樞軸 (移動時)。"
+msgstr "按「v」以修改樞紐,「Shift+v」以移動樞紐(移動時)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+滑鼠右鍵:顯示鼠標點擊位置下所有的節點清單"
+msgstr "Alt+滑鼠右鍵:展開所選清單"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5622,7 +5341,6 @@ msgstr "旋轉模式"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
msgstr "縮放模式"
@@ -5631,129 +5349,112 @@ msgstr "縮放模式"
msgid ""
"Show a list of all objects at the position clicked\n"
"(same as Alt+RMB in select mode)."
-msgstr "在按一下的位置顯示所有物件的清單 (在選擇模式下與 Alt + RMB 相同)。"
+msgstr ""
+"顯示該點擊位置所有物件的列表\n"
+"(同選擇模式中的 Alt+滑鼠右鍵)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
-msgstr "點擊以更改物件的旋轉樞軸。"
+msgstr "點擊以更改物件的旋轉樞紐。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan Mode"
msgstr "平移模式"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Ruler Mode"
-msgstr "縮放模式"
+msgstr "尺規模式"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle smart snapping."
-msgstr "切換吸附。"
+msgstr "開啟/關閉智慧型吸附。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Smart Snap"
-msgstr "使用吸附"
+msgstr "使用智慧型吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle grid snapping."
-msgstr "切換吸附。"
+msgstr "開啟/關閉網格吸附。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Grid Snap"
-msgstr "網格吸附"
+msgstr "使用網格吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
msgstr "吸附選項"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Rotation Snap"
msgstr "使用旋轉吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Scale Snap"
-msgstr "使用吸附"
+msgstr "使用縮放吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap Relative"
msgstr "相對吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Pixel Snap"
msgstr "使用像素吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Smart Snapping"
-msgstr "智慧吸附"
+msgstr "智慧型吸附"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Configure Snap..."
-msgstr "配置吸附…"
+msgstr "設定吸附..."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Parent"
-msgstr "吸附到父級節點"
+msgstr "吸附至母級"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Anchor"
-msgstr "吸附到節點的錨點"
+msgstr "吸附至節點錨點"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Sides"
-msgstr "捕捉到節點邊"
+msgstr "吸附至節點側邊"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Node Center"
-msgstr "吸附到節點的中心"
+msgstr "吸附至節點中央"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Other Nodes"
-msgstr "吸附到其他的節點"
+msgstr "吸附至其他節點"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to Guides"
-msgstr "吸附到尺標"
+msgstr "吸附至參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr "將所選物件鎖定到中心 (無法移動)。"
+msgstr "在其位置上鎖定所選物件(無法移動)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Unlock the selected object (can be moved)."
-msgstr "解鎖所選物件 (可以移動)。"
+msgstr "解鎖所選物件(可移動)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Makes sure the object's children are not selectable."
-msgstr "確保對象的子級不可選。"
+msgstr "確保物件的子級項目無法被選擇。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
-msgstr "恢復對象的子級選擇能力。"
+msgstr "恢復讓物件的子級項目可選擇。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
msgstr "骨架選項"
@@ -5763,7 +5464,7 @@ msgstr "顯示骨骼"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr "從節點製作自定義骨骼"
+msgstr "自節點建立自定骨骼"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Custom Bones"
@@ -5772,16 +5473,15 @@ msgstr "清除自定義骨骼"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View"
-msgstr "視圖"
+msgstr "檢視"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Always Show Grid"
-msgstr "顯示網格"
+msgstr "永遠顯示網格"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
-msgstr "顯示輔助線"
+msgstr "顯示輔助資訊"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Rulers"
@@ -5789,7 +5489,7 @@ msgstr "顯示尺規"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Guides"
-msgstr "顯示引導"
+msgstr "顯示參考線"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Origin"
@@ -5797,40 +5497,39 @@ msgstr "顯示原點"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Viewport"
-msgstr "顯示視口"
+msgstr "顯示檢視區"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr "顯示組和鎖定圖標"
+msgstr "顯示群組與鎖定圖示"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "居中選擇"
+msgstr "置中所選"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "幀選擇"
+msgstr "完整顯示所選"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
-msgstr ""
+msgstr "預覽畫布比例"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
-msgstr ""
+msgstr "轉換遮罩以插入關鍵影格。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
-msgstr ""
+msgstr "旋轉遮罩以插入關鍵影格。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale mask for inserting keys."
-msgstr ""
+msgstr "縮放遮罩以插入關鍵影格。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys (based on mask)."
-msgstr "插入幀 (現有軌道)"
+msgstr "(基於遮罩)插入關鍵影格。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -5839,20 +5538,21 @@ msgid ""
"Keys are only added to existing tracks, no new tracks will be created.\n"
"Keys must be inserted manually for the first time."
msgstr ""
+"當物件被轉換、旋轉 或(基於遮罩)縮放時自動插入關鍵影格。\n"
+"關鍵影格只會被新增至現有軌道,不會建立新軌道。\n"
+"第一次必須先手動插入關鍵影格。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Auto Insert Key"
-msgstr "新增關鍵畫格"
+msgstr "自動插入關鍵影格"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key and Pose Options"
-msgstr "動畫長度(秒)"
+msgstr "動畫關鍵影格與姿勢選項"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr "插入幀 (現有軌道)"
+msgstr "插入關鍵影格(於現有軌道)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -5864,53 +5564,53 @@ msgstr "清除姿勢"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
-msgstr "將網格步數乘以2"
+msgstr "將網格步數乘以 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Divide grid step by 2"
-msgstr "將網格步數除以2"
+msgstr "將網格步數除以 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Pan View"
-msgstr "後視圖"
+msgstr "平移檢視"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
-msgstr "添加 %s"
+msgstr "新增 %"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Adding %s..."
-msgstr "添加 %s…"
+msgstr "正在新增 %s…"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
-msgstr "無法具現化沒有根的多個節點。"
+msgstr "沒有根節點無法實體化多個節點。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Create Node"
-msgstr "創建節點"
+msgstr "建立節點"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Error instancing scene from %s"
-msgstr "%s 中的具現化場景出錯"
+msgstr "自 %s 實體化場景時發生錯誤"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Change Default Type"
-msgstr "更改預設類型"
+msgstr "更改預設型別"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
"Drag & drop + Shift : Add node as sibling\n"
"Drag & drop + Alt : Change node type"
msgstr ""
+"拖放 + Shift:新增同級節點\n"
+"拖放 + Alt:修改節點型別"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Create Polygon3D"
-msgstr "創建3D多邊形"
+msgstr "建立 Polygon3D"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly"
@@ -5918,29 +5618,28 @@ msgstr "編輯多邊形"
#: editor/plugins/collision_polygon_editor_plugin.cpp
msgid "Edit Poly (Remove Point)"
-msgstr "編輯多邊形 (刪除頂點)"
+msgstr "編輯多邊形(移除頂點)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
-msgstr "設置控制程序"
+msgstr "設定處理程式"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
-msgstr ""
+msgstr "載入發射遮罩"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Restart"
-msgstr "重新開始(秒):"
+msgstr "重新啟動"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Clear Emission Mask"
-msgstr ""
+msgstr "清除發射遮罩"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5951,141 +5650,131 @@ msgstr "粒子"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generated Point Count:"
-msgstr ""
+msgstr "已產生的頂點數量:"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Mask"
-msgstr ""
+msgstr "發射遮罩"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Solid Pixels"
-msgstr "擴展(像素): "
+msgstr "實體像素"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Border Pixels"
-msgstr ""
+msgstr "邊界像素"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Directed Border Pixels"
-msgstr "資料夾 & 檔案:"
+msgstr "有向邊界像素"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Capture from Pixel"
-msgstr ""
+msgstr "自像素中捕捉"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Colors"
-msgstr ""
+msgstr "發射色彩"
#: editor/plugins/cpu_particles_editor_plugin.cpp
msgid "CPUParticles"
-msgstr "CPU粒子"
+msgstr "CPUParticles"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emission Points From Mesh"
-msgstr "從網格創建發射點"
+msgstr "自網格建立發射點"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emission Points From Node"
-msgstr "從節點創建發射點"
+msgstr "自節點建立發射點"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Flat 0"
-msgstr "平面0"
+msgstr "Flat 0"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Flat 1"
-msgstr "平面1"
+msgstr "Flat 1"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
msgid "Ease In"
-msgstr ""
+msgstr "緩慢移入"
#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp
msgid "Ease Out"
-msgstr ""
+msgstr "緩慢移出"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Smoothstep"
-msgstr "平滑步長"
+msgstr "平滑插值"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Point"
-msgstr "修改曲線點"
+msgstr "修改曲線控制點"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Modify Curve Tangent"
-msgstr "修改曲線切角"
+msgstr "修改曲線切線"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Load Curve Preset"
-msgstr "加載曲線預設"
+msgstr "加載曲線預設設定"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Add Point"
-msgstr "添加點"
+msgstr "新增控制點"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Point"
-msgstr "刪除點"
+msgstr "移除控制點"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Left Linear"
msgstr "左線性"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right Linear"
msgstr "右線性"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Load Preset"
-msgstr "載入預設"
+msgstr "載入預設設定"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Curve Point"
-msgstr "刪除曲線點"
+msgstr "移除曲線控制點"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Toggle Curve Linear Tangent"
-msgstr "切換曲線直線切線"
+msgstr "開啟/關閉曲線線性切線"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Hold Shift to edit tangents individually"
-msgstr "按住 Shift 鍵可單獨編輯切線"
+msgstr "按住 Shift 鍵以單獨編輯切線"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Right click to add point"
-msgstr ""
+msgstr "右鍵點擊以新增控制點"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
-msgstr "渲染 GI Probe"
+msgstr "製作 GI 探查"
#: editor/plugins/gradient_editor_plugin.cpp
msgid "Gradient Edited"
-msgstr "漸變編輯"
+msgstr "漸層編輯"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
-msgstr "項目 %d"
+msgstr "第 %d 項"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Items"
@@ -6093,81 +5782,95 @@ msgstr "項目"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item List Editor"
-msgstr "項目清單編輯器"
+msgstr "項目列表編輯器"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
-msgstr "創建遮光多邊形"
+msgstr "建立遮光多邊形"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
-msgstr "網格是空的!"
+msgstr "空網格!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Trimesh Body"
-msgstr ""
+msgid "Couldn't create a Trimesh collision shape."
+msgstr "無法建立三角網格碰撞形狀。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Create Static Convex Body"
-msgstr "創建靜態凸體"
+msgid "Create Static Trimesh Body"
+msgstr "建立靜態三角網格形體"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
-msgstr "這對場景根目錄不起作用!"
+msgstr "無法用於場景根節點!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Trimesh Static Shape"
-msgstr "創建凸形靜態體"
+msgstr "建立三角網格靜態形狀"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-msgid "Failed creating shapes!"
-msgstr ""
+msgid "Can't create a single convex collision shape for the scene root."
+msgstr "無法為該場景根節點建立單一凸碰撞形狀。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Shape(s)"
-msgstr "創建凸面形狀"
+msgid "Couldn't create a single convex collision shape."
+msgstr "無法建立單一凸碰撞形狀。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Single Convex Shape"
+msgstr "建立單一凸面形狀"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Can't create multiple convex collision shapes for the scene root."
+msgstr "無法為場景根節點建立多個凸碰撞形狀。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Couldn't create any collision shapes."
+msgstr "無法建立任何碰撞形狀。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Shapes"
+msgstr "建立多個凸面形狀"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
-msgstr "創建導航網格"
+msgstr "建立導航網格"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr "包含的網格不是ArrayMesh類型。"
+msgstr "包含之 Mesh 並非 ArrayMesh 型別。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr ""
+msgstr "UV 展開失敗,該網格可能並非流形?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
-msgstr "沒有要調試的網格。"
+msgstr "沒有可進行偵錯之網格。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Model has no UV in this layer"
-msgstr ""
+msgstr "模型在該圖層上無 UV"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
-msgstr "網格實例缺少網格!"
+msgstr "MeshInstance 未包含 Mesh!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh has not surface to create outlines from!"
-msgstr "網格沒有表面來創建輪廓!"
+msgstr "Mesh 未包含可建立輪廓的表面!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr ""
+msgstr "Mesh 的原始類型並非 PRIMITIVE_TRIANGLES!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
-msgstr ""
+msgstr "無法建立輪廓!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline"
-msgstr "創建輪廓"
+msgstr "建立輪廓"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
@@ -6175,38 +5878,82 @@ msgstr "網格"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Body"
+msgstr "建立三角網格靜態形體"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a StaticBody and assigns a polygon-based collision shape to it "
+"automatically.\n"
+"This is the most accurate (but slowest) option for collision detection."
msgstr ""
+"建立 StaticBody 並自動指派一個基於多邊形的碰撞形體。\n"
+"對於碰撞偵測,該選項為最精確(但最慢)的選項。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
+msgstr "建立三角網格碰撞同級"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is the most accurate (but slowest) option for collision detection."
msgstr ""
+"建立基於多邊形的碰撞形狀。\n"
+"對於碰撞偵測,該選項為最精確(但最慢)的選項。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
-msgid "Create Convex Collision Sibling(s)"
-msgstr "創建碰撞多邊形"
+msgid "Create Single Convex Collision Sibling"
+msgstr "建立單一凸面碰撞同級"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a single convex collision shape.\n"
+"This is the fastest (but least accurate) option for collision detection."
+msgstr ""
+"建立單一凸面碰撞形狀。\n"
+"對於碰撞偵測,該選項為最快(但最不精確)的選項。"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Multiple Convex Collision Siblings"
+msgstr "建立碰撞多邊形同級"
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a polygon-based collision shape.\n"
+"This is a performance middle-ground between the two above options."
+msgstr ""
+"建立基於多邊形的碰撞區域。\n"
+"這是效能位於上面兩個方法中間的選項。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
-msgstr "創建輪廓網格…"
+msgstr "建立輪廓網格..."
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid ""
+"Creates a static outline mesh. The outline mesh will have its normals "
+"flipped automatically.\n"
+"This can be used instead of the SpatialMaterial Grow property when using "
+"that property isn't possible."
+msgstr ""
+"建立靜態輪廓網格。輪廓網格的法線會自動翻轉。\n"
+"當無法使用 SpatialMetarial 的 Grow 屬性時可以使用這個。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "View UV1"
-msgstr "過濾檔案..."
+msgstr "檢視 UV1"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "View UV2"
-msgstr "過濾檔案..."
+msgstr "檢視 UV2"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Unwrap UV2 for Lightmap/AO"
-msgstr ""
+msgstr "為光照圖/AO 打開 UV2"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh"
-msgstr "創建輪廓網格"
+msgstr "建立輪廓網格"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Outline Size:"
@@ -6214,100 +5961,100 @@ msgstr "輪廓尺寸:"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Channel Debug"
-msgstr ""
+msgstr "UV 通道偵錯"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
-msgstr "删除項目%d?"
+msgstr "是否移除項目 %d?"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid ""
"Update from existing scene?:\n"
"%s"
-msgstr "從場景更新"
+msgstr ""
+"自現有場景中更新?\n"
+"%s"
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid "Mesh Library"
-msgstr "網狀資料庫(MeshLibrary)…"
+msgstr "網格庫"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Item"
-msgstr "添加項目"
+msgstr "新增項目"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove Selected Item"
-msgstr "删除所選項"
+msgstr "移除所選項目"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import from Scene"
-msgstr "從場景導入"
+msgstr "自場景匯入"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Update from Scene"
-msgstr "從場景更新"
+msgstr "自場景更新"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
-msgstr "未指定網格源(節點中沒有多網格集)。"
+msgstr "未指定網格來源(且節點中沒有 MultiMesh 集)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr ""
+msgstr "未指定網格來源(且 MultiMesh 未包含 Mesh)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
-msgstr "網格源無效(路徑無效)。"
+msgstr "網格來源無效(無效的路徑)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr "網格源無效 (不是網格實例)。"
+msgstr "網格來源無效(非 MeshInstance)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr "網格源無效(不包含網格資源)。"
+msgstr "網格來源無效(未包含 Mesh 資源)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No surface source specified."
-msgstr "未指定表面源。"
+msgstr "未指定表面來源。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (invalid path)."
-msgstr "表面源無效(路徑無效)。"
+msgstr "表面來源無效(無效的路徑)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no geometry)."
-msgstr "表面源無效(沒有幾何圖形)。"
+msgstr "表面來源無效(無幾何)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no faces)."
-msgstr "表面源無效(沒有面)。"
+msgstr "表面來源無效(無面)。"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
-msgstr "選擇源網格:"
+msgstr "選擇來源網格:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Target Surface:"
-msgstr "選擇目標曲面:"
+msgstr "選擇目標表面:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate Surface"
-msgstr "填充曲面"
+msgstr "填充表面"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate MultiMesh"
-msgstr "填充多網格"
+msgstr "填充 MultiMesh"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
-msgstr "目標表面:"
+msgstr "目標表面:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
-msgstr "源網格:"
+msgstr "來源網格:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
@@ -6323,7 +6070,7 @@ msgstr "Z 軸"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh Up Axis:"
-msgstr ""
+msgstr "網格上軸:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Rotation:"
@@ -6335,7 +6082,7 @@ msgstr "隨機傾斜:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Scale:"
-msgstr "隨機縮放:"
+msgstr "隨機縮放:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate"
@@ -6344,69 +6091,65 @@ msgstr "填充"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
-msgstr "創建導航多邊形"
+msgstr "建立導航多邊形"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Convert to CPUParticles"
-msgstr "轉換成..."
+msgstr "轉換為 CPUParticles"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generating Visibility Rect"
-msgstr "生成可見性矩形"
+msgstr "正在產生矩形可見性"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generate Visibility Rect"
-msgstr "生成可見性矩形"
+msgstr "產生矩形可見性"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
-msgstr ""
+msgstr "僅可將為 ParticlesMaterial 處理材料設定點"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generation Time (sec):"
-msgstr "生成時間 (秒):"
+msgstr "產生時間(秒):"
#: editor/plugins/particles_editor_plugin.cpp
msgid "The geometry's faces don't contain any area."
-msgstr ""
+msgstr "幾何體的面未包含任何區域。"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "The geometry doesn't contain any faces."
-msgstr "節點不包含幾何圖形 (面)。"
+msgstr "幾何體未包含任何面。"
#: editor/plugins/particles_editor_plugin.cpp
msgid "\"%s\" doesn't inherit from Spatial."
-msgstr ""
+msgstr "「%s」非繼承自 Spatial。"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "\"%s\" doesn't contain geometry."
-msgstr "節點不包含幾何圖形。"
+msgstr "「%s」未包含幾何體。"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "\"%s\" doesn't contain face geometry."
-msgstr "節點不包含幾何圖形。"
+msgstr "「%s」未包含面幾何體。"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
-msgstr "創建發射器"
+msgstr "建立發射器"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Emission Points:"
-msgstr "排放點:"
+msgstr "發射點:"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Surface Points"
-msgstr "表面點"
+msgstr "表面頂點"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Surface Points+Normal (Directed)"
-msgstr "表面點 + 法線 (定向)"
+msgstr "表面點 + 法線(有向)"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Volume"
@@ -6414,330 +6157,320 @@ msgstr "體積"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Emission Source: "
-msgstr "排放源: "
+msgstr "發射源: "
#: editor/plugins/particles_editor_plugin.cpp
msgid "A processor material of type 'ParticlesMaterial' is required."
-msgstr "需要“顆粒資料”類型的處理器資料。"
+msgstr "需「ParticlesMaterial」型別的處理器材料。"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generating AABB"
-msgstr "生成 AABB"
+msgstr "正在產生 AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
-msgstr "生成可見性AABB"
+msgstr "產生可見性 AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate AABB"
-msgstr "生成 AABB"
+msgstr "產生 AABB"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Point from Curve"
-msgstr "從曲線中删除點"
+msgstr "自曲線中刪除控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Out-Control from Curve"
-msgstr ""
+msgstr "自曲線移除外控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove In-Control from Curve"
-msgstr ""
+msgstr "自曲線移除內控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Add Point to Curve"
-msgstr ""
+msgstr "新增控制點至曲線"
#: editor/plugins/path_2d_editor_plugin.cpp
-#, fuzzy
msgid "Split Curve"
-msgstr "編輯節點曲線"
+msgstr "拆分控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
-msgstr ""
+msgstr "移動控制點至曲線"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move In-Control in Curve"
-msgstr ""
+msgstr "移動曲線的內控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Out-Control in Curve"
-msgstr ""
+msgstr "移動曲線的外控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Select Points"
-msgstr ""
+msgstr "選擇控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Shift+Drag: Select Control Points"
-msgstr ""
+msgstr "Shift+拖移:選擇控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Click: Add Point"
-msgstr ""
+msgstr "點擊:新增控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Left Click: Split Segment (in curve)"
-msgstr ""
+msgstr "左鍵點擊:(在曲線內)拆分線段"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr ""
+msgstr "右鍵點擊:刪除控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
-msgstr ""
+msgstr "選擇控制點(Shift+拖移)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Add Point (in empty space)"
-msgstr ""
+msgstr "新增控制點(在空白處)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
-msgstr ""
+msgstr "刪除控制點"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Close Curve"
-msgstr ""
+msgstr "關閉曲線"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp
msgid "Options"
-msgstr ""
+msgstr "選項"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "鏡像控點角度"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "鏡像控點長度"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
-msgstr ""
+msgstr "曲線控制點 #"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve Point Position"
-msgstr "移除"
+msgstr "設定曲線控制點位置"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve In Position"
-msgstr "移除"
+msgstr "設定曲線內控制點位置"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve Out Position"
-msgstr "移除"
+msgstr "設定曲線外控制點位置"
#: editor/plugins/path_editor_plugin.cpp
msgid "Split Path"
-msgstr ""
+msgstr "拆分路徑"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove Path Point"
-msgstr ""
+msgstr "移除路徑控制點"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove Out-Control Point"
-msgstr ""
+msgstr "移除外控制點"
#: editor/plugins/path_editor_plugin.cpp
msgid "Remove In-Control Point"
-msgstr ""
+msgstr "移除內控制點"
#: editor/plugins/path_editor_plugin.cpp
msgid "Split Segment (in curve)"
-msgstr ""
+msgstr "拆分線段(在曲線中)"
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move Joint"
-msgstr "移除"
+msgstr "移動關節"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Polygon2D 的骨架屬性未指向 Skeleton2D 節點"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Sync Bones"
-msgstr ""
+msgstr "同步骨骼"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
msgstr ""
+"該多邊形沒有紋理貼圖。\n"
+"請先設定紋理以編輯 UV。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
-msgstr ""
+msgstr "建立 UV Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"Polygon 2D has internal vertices, so it can no longer be edited in the "
"viewport."
-msgstr ""
+msgstr "Polygon2D 有內部頂點,將無法在檢視區編輯。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create Polygon & UV"
-msgstr ""
+msgstr "建立多邊形與 UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create Internal Vertex"
-msgstr ""
+msgstr "建立內部頂點"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Remove Internal Vertex"
-msgstr ""
+msgstr "移除內部頂點"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Invalid Polygon (need 3 different vertices)"
-msgstr ""
+msgstr "無效的多邊形(需要三個不同的頂點)"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Add Custom Polygon"
-msgstr "新增資料夾"
+msgstr "新增自定多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Custom Polygon"
-msgstr "移除"
+msgstr "移除自定多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
-msgstr ""
+msgstr "轉換 UV Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Transform Polygon"
-msgstr "新增資料夾"
+msgstr "轉換多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint Bone Weights"
-msgstr ""
+msgstr "描繪骨骼權重"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Open Polygon 2D UV editor."
-msgstr ""
+msgstr "Polygon2D UV 編輯器。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
-msgstr ""
+msgstr "Polygon2D UV 編輯器"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Points"
-msgstr "移除"
+msgstr "點"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Polygons"
-msgstr "新增資料夾"
+msgstr "多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
-msgstr ""
+msgstr "骨骼"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Points"
-msgstr "移除"
+msgstr "移動點"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
-msgstr ""
+msgstr "Ctrl:旋轉"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
-msgstr ""
+msgstr "Shift:移動全部"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
-msgstr ""
+msgstr "Shift+Ctrl:縮放"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
-msgstr ""
+msgstr "移動多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Rotate Polygon"
-msgstr ""
+msgstr "旋轉多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Scale Polygon"
-msgstr ""
+msgstr "縮放多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create a custom polygon. Enables custom polygon rendering."
-msgstr ""
+msgstr "建立自定多邊形。啟用自定多邊形算繪。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"Remove a custom polygon. If none remain, custom polygon rendering is "
"disabled."
-msgstr ""
+msgstr "移除自定多邊形。若無剩餘多邊形,將禁用自定多邊形算繪。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint weights with specified intensity."
-msgstr ""
+msgstr "以指定的強度來繪製權重。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Unpaint weights with specified intensity."
-msgstr ""
+msgstr "以指定的強度來取消繪製權重。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "半徑:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
-msgstr ""
+msgstr "多邊形 -> UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV->Polygon"
-msgstr ""
+msgstr "UV -> 多邊形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Clear UV"
-msgstr ""
+msgstr "清除 UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "專案設定"
+msgstr "網格設定"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
-msgstr ""
+msgstr "吸附"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
-msgstr ""
+msgstr "啟用吸附"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
-msgstr ""
+msgstr "網格"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Show Grid"
@@ -6745,48 +6478,48 @@ msgstr "顯示網格"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Configure Grid:"
-msgstr ""
+msgstr "設定網格:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Offset X:"
-msgstr ""
+msgstr "網格 X 偏移:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Offset Y:"
-msgstr ""
+msgstr "網格 Y 偏移:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Step X:"
-msgstr ""
+msgstr "網格 X 步進值:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid Step Y:"
-msgstr ""
+msgstr "網格 Y 步進值:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Sync Bones to Polygon"
-msgstr ""
+msgstr "同步骨骼到多邊形"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
-msgstr ""
+msgstr "錯誤:無法載入資源!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
-msgstr ""
+msgstr "新增資源"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Rename Resource"
-msgstr ""
+msgstr "重新命名資源"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Resource"
-msgstr ""
+msgstr "刪除資源"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Resource clipboard is empty!"
-msgstr ""
+msgstr "資源剪貼板為空!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Paste Resource"
@@ -6795,119 +6528,108 @@ msgstr "貼上資源"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
-msgstr ""
+msgstr "實體:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Type:"
-msgstr ""
+msgstr "型別:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
msgid "Open in Editor"
-msgstr ""
+msgstr "在編輯器中開啟"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Load Resource"
-msgstr ""
+msgstr "載入資源"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#, fuzzy
msgid "ResourcePreloader"
-msgstr "資源路徑"
+msgstr "ResourcePreloader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree 未設定至 AnimationPlayer 的路徑"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "Path to AnimationPlayer is invalid"
-msgstr ""
+msgstr "至 AnimationPlayer 的路徑無效"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
-msgstr ""
+msgstr "清除最近的檔案"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Close and save changes?"
-msgstr "沒有儲存的變更都會遺失, 確定要關閉?"
+msgstr "關閉並保存修改嗎?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "載入場景時發生錯誤"
+msgstr "寫入 TextFile 時發生錯誤:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "無法新增資料夾"
+msgstr "無法載入檔案於:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "儲存資源錯誤!"
+msgstr "保存檔案時發生錯誤!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "儲存中發生了錯誤。"
+msgstr "保存主題時發生錯誤。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error Saving"
-msgstr "保存錯誤"
+msgstr "保存時發生錯誤"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "導入主題時出錯。"
+msgstr "保存匯入的主題時發生錯誤。"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
-msgstr "載入時發生錯誤:"
+msgstr "匯入時發生錯誤"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
-msgstr "新增資料夾..."
+msgstr "新增文字檔案..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "開啟檔案"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "另存場景為..."
+msgstr "另存檔案為..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "無法取得要執行的腳本。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "腳本重新載入失敗,請檢查主控台以確認錯誤。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "腳本不在工具模式下,無法執行。"
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
-msgstr ""
+msgstr "該腳本必須繼承 EditorScript 並設為工具模式才可執行。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
-msgstr "導入主題"
+msgstr "匯入主題"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error while saving theme"
-msgstr "保存主題時出錯"
+msgstr "保存主題時發生錯誤"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving"
@@ -6915,41 +6637,37 @@ msgstr "保存錯誤"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
-msgstr "將主題另存為..。"
+msgstr "保存主題為..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "%s Class Reference"
-msgstr " 類引用"
+msgstr "%s 類別參照"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr "查找下一個"
+msgstr "尋找下一個"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
-msgstr "查找上一個"
+msgstr "尋找上一個"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "過濾檔案..."
+msgstr "篩選腳本"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "開啟/關閉按照字母順序排列方法列表。"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter methods"
-msgstr "過濾檔案..."
+msgstr "篩選方法"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Sort"
-msgstr "排序:"
+msgstr "排序"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
@@ -6976,14 +6694,12 @@ msgid "File"
msgstr "檔案"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open..."
msgstr "開啟…"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Reopen Closed Script"
-msgstr "開啟最近存取"
+msgstr "重新打開關閉的腳本"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -6991,20 +6707,19 @@ msgstr "全部保存"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "軟重新加載腳本"
+msgstr "軟重新載入腳本"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
msgstr "複製腳本路徑"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
-msgstr "上個分頁"
+msgstr "上一個歷史記錄"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
-msgstr ""
+msgstr "下一個歷史記錄"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -7012,9 +6727,8 @@ msgid "Theme"
msgstr "主題"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Import Theme..."
-msgstr "導入主題..。"
+msgstr "匯入主題..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
@@ -7030,23 +6744,23 @@ msgstr "全部關閉"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
-msgstr "關閉檔案"
+msgstr "關閉說明文件"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
-msgstr "運行"
+msgstr "執行"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
-msgstr "步入"
+msgstr "逐步執行"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
-msgstr "跨過"
+msgstr "不進入函式"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
-msgstr "跳過"
+msgstr "中斷"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
@@ -7055,48 +6769,39 @@ msgstr "繼續"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
-msgstr "保持調試器打開"
+msgstr "保持開啟除錯工具"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "使用外部編輯器進行調試"
+msgstr "使用外部編輯器進行除錯"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open Godot online documentation."
-msgstr "打開 Godot 線上文檔"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Request Docs"
-msgstr "請求檔案"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Help improve the Godot documentation by giving feedback."
-msgstr "通過提供回饋幫助改進 Godot 文檔"
+msgstr "打開 Godot 線上說明文件。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
-msgstr "搜索參考文檔。"
+msgstr "搜尋參照文件。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to previous edited document."
-msgstr "轉到上一個編輯的檔案。"
+msgstr "跳至上一個編輯的文件。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
-msgstr "轉到下一個編輯的檔案。"
+msgstr "跳至下一個編輯的文件。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Discard"
-msgstr "棄置"
+msgstr "放棄"
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?:"
msgstr ""
+"磁碟中的下列檔案已更新。\n"
+"請選擇於執行之操作:"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/shader_editor_plugin.cpp
@@ -7110,73 +6815,65 @@ msgstr "重新保存"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
-msgstr "調試器"
+msgstr "除錯工具"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
msgstr "搜尋結果"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Clear Recent Scripts"
-msgstr "清除最近開啟的場景"
+msgstr "清除最近開啟的腳本"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Connections to method:"
-msgstr "連接到節點:"
+msgstr "連接至方法:"
#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source"
-msgstr "資源"
+msgstr "來源"
#: editor/plugins/script_text_editor.cpp
msgid "Target"
-msgstr ""
+msgstr "目標"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid ""
"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'."
-msgstr "將 '%s' 從 '%s' 中斷連接"
+msgstr "找不到方法「%s」(自訊號「%s」),節點「%s」至「%s」的連接已中斷。"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Line"
-msgstr "行:"
+msgid "[Ignore]"
+msgstr "[忽略]"
#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
-msgstr "(忽略)"
+msgid "Line"
+msgstr "行"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "轉到函數"
+msgstr "跳至函式"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
-msgstr "只能拖拽檔案系統中的資源。"
+msgstr "只可拖移來自檔案系統的資源。"
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't drop nodes because script '%s' is not used in this scene."
-msgstr ""
+msgstr "無法放置節點,由於腳本「%s」並未在該場景中使用。"
#: editor/plugins/script_text_editor.cpp
msgid "Lookup Symbol"
-msgstr "查找符號"
+msgstr "搜尋符號"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
msgstr "選擇顏色"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-#, fuzzy
msgid "Convert Case"
-msgstr "轉換成..."
+msgstr "轉換大小寫"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Uppercase"
@@ -7197,53 +6894,50 @@ msgstr "高亮顯示語法"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Go To"
-msgstr ""
+msgstr "跳至"
#: editor/plugins/script_text_editor.cpp
#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
msgid "Bookmarks"
-msgstr ""
+msgstr "書籤"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Breakpoints"
-msgstr "刪除"
+msgstr "中斷點"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
-msgstr "剪切"
+msgstr "剪下"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Select All"
-msgstr "選擇全部"
+msgstr "全部選擇"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Delete Line"
msgstr "删除行"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
-msgstr "向左縮進"
+msgstr "向左縮排"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Right"
-msgstr "向右縮進"
+msgstr "向右縮排"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
-msgstr "切換注釋"
+msgstr "註解/取消註解"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
-msgstr "前往第...行"
+msgstr "展開/收起行"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
-msgstr "折疊所有行"
+msgstr "收起所有行"
#: editor/plugins/script_text_editor.cpp
msgid "Unfold All Lines"
@@ -7251,97 +6945,88 @@ msgstr "展開所有行"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr "拷貝到下一行"
+msgstr "複製到下一行"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr ""
+msgstr "補全符號"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Evaluate Selection"
-msgstr "縮放所選"
+msgstr "取值所選內容"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr ""
+msgstr "移除後方空白字元"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
-msgstr "轉換成..."
+msgstr "轉換縮排為空白"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
-msgstr "轉換成..."
+msgstr "轉換縮排為 Tab"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "自動縮進"
+msgstr "自動縮排"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
-msgstr "在檔中查找..。"
+msgstr "在檔案中搜尋..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
-msgstr ""
+msgstr "上下文說明"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Toggle Bookmark"
-msgstr "切換自由觀察模式"
+msgstr "新增/移除書籤"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Bookmark"
-msgstr "轉到下一個中斷點"
+msgstr "跳至下一個書籤"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Bookmark"
-msgstr "轉到上一個中斷點"
+msgstr "跳至上一個書籤"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Remove All Bookmarks"
-msgstr "删除所有項目"
+msgstr "刪除所有書籤"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Function..."
-msgstr "轉到函數…"
+msgstr "跳至函式..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "前往第...行"
+msgstr "跳至第...行"
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "設置中斷點"
+msgstr "設定/移除中斷點"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "刪除所有中斷點"
+msgstr "移除所有中斷點"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
-msgstr "轉到下一個中斷點"
+msgstr "跳至下一個中斷點"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
-msgstr "轉到上一個中斷點"
+msgstr "跳至上一個中斷點"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
"This shader has been modified on on disk.\n"
"What action should be taken?"
msgstr ""
+"磁碟上該著色器已被修改。\n"
+"該執行什麼?"
#: editor/plugins/shader_editor_plugin.cpp
msgid "Shader"
@@ -7349,45 +7034,43 @@ msgstr "著色器"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr "此骨架沒有骨骼綁定,請創建一些 Bone2d 骨骼子節點。"
+msgstr "此骨架未包含骨骼,請建立一些子 Bone2D 節點。"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Create Rest Pose from Bones"
-msgstr "從骨骼創建休息姿勢"
+msgstr "自骨骼建立靜止姿勢"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Rest Pose to Bones"
-msgstr "將休息姿勢設置為骨骼"
+msgstr "設定靜止姿勢至骨骼"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Skeleton2D"
-msgstr "2D骨骼節點"
+msgstr "Sekeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr "創建休息姿勢 (從骨骼)"
+msgstr "製作靜止姿勢(自骨骼)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr "將骨骼設定為靜止姿勢"
+msgstr "設定骨骼為靜止姿勢"
#: editor/plugins/skeleton_editor_plugin.cpp
msgid "Create physical bones"
-msgstr "創建物理骨骼"
+msgstr "建立物理骨骼"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
msgstr "骨架"
#: editor/plugins/skeleton_editor_plugin.cpp
msgid "Create physical skeleton"
-msgstr "創建物理骨架"
+msgstr "建立物理骨架"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "播放 IK"
+msgstr "執行 IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -7399,15 +7082,15 @@ msgstr "透視"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
-msgstr ""
+msgstr "已中止變換。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "X-Axis Transform."
-msgstr "X軸變換。"
+msgstr "X 軸變換。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Y-Axis Transform."
-msgstr "Y軸變換。"
+msgstr "Y 軸變換。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Z-Axis Transform."
@@ -7415,7 +7098,7 @@ msgstr "Z 軸變換。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr "查看平面轉換。"
+msgstr "檢視平面轉換。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scaling: "
@@ -7423,7 +7106,7 @@ msgstr "縮放: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translating: "
-msgstr "翻譯: "
+msgstr "移動: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
@@ -7431,15 +7114,15 @@ msgstr "旋轉 %s 度。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Keying is disabled (no key inserted)."
-msgstr ""
+msgstr "鍵已被禁用(未插入鍵)。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Animation Key Inserted."
-msgstr ""
+msgstr "已插入動畫鍵。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pitch"
-msgstr ""
+msgstr "仰角"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
@@ -7463,7 +7146,7 @@ msgstr "表面變更"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
-msgstr "繪製調用"
+msgstr "繪製呼叫"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Vertices"
@@ -7475,7 +7158,7 @@ msgstr "俯視圖。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View."
-msgstr "底視圖。"
+msgstr "仰視圖。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom"
@@ -7514,30 +7197,32 @@ msgid "Rear"
msgstr "後"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Transform with View"
-msgstr "與視圖對齊"
+msgstr "將變換與視圖對齊"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Align Rotation with View"
-msgstr "將所選內容與視圖對齊"
+msgstr "將旋轉與視圖對齊"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
-msgstr ""
+msgstr "無母節點可用來實體化子節點。"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "This operation requires a single selected node."
msgstr "此操作需要單個選定的節點。"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Auto Orthogonal Enabled"
+msgstr "已啟用自動正交"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
-msgstr "鎖定視圖旋轉"
+msgstr "鎖定視角旋轉"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
-msgstr ""
+msgstr "顯示法線"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Wireframe"
@@ -7553,41 +7238,39 @@ msgstr "顯示無陰影"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Environment"
-msgstr "查看環境"
+msgstr "檢視環境"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Gizmos"
-msgstr "查看 Gizmos"
+msgstr "檢視 Gizmo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
-msgstr "查看資訊"
+msgstr "檢視資訊"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View FPS"
-msgstr "查看FPS"
+msgstr "檢視 FPS"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Half Resolution"
-msgstr "半分辯率"
+msgstr "半解析度"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Audio Listener"
msgstr "音訊監聽器"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Enable Doppler"
-msgstr "啟用篩選"
+msgstr "啟用都卜勒效應"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Cinematic Preview"
-msgstr "影片預覽"
+msgstr "效果預覽"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Not available when using the GLES2 renderer."
-msgstr ""
+msgstr "使用 GLES2 轉譯器時無法使用。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -7603,7 +7286,7 @@ msgstr "自由視圖 前"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "自由視圖 后"
+msgstr "自由視圖 後"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
@@ -7615,34 +7298,49 @@ msgstr "自由視圖 下"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
-msgstr "自由視圖速度調節"
+msgstr "加速自由視圖速度"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Freelook Slow Modifier"
-msgstr "自由視圖速度調節"
+msgstr "放慢自由視圖速度"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "視圖旋轉已鎖定"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
-msgstr "注意: 顯示的FPS值是編輯器的幀率。 它不能用于表現遊戲內的實際性能"
+msgstr ""
+"注意:顯示的 FPS 值為編輯器之畫面速率。\n"
+"無法實際反映為遊戲中的效能。"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "View Rotation Locked"
-msgstr "視圖旋轉已鎖定"
+msgid "XForm Dialog"
+msgstr "XForm 對話框"
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "XForm Dialog"
-msgstr "XForm對話框"
+msgid ""
+"Click to toggle between visibility states.\n"
+"\n"
+"Open eye: Gizmo is visible.\n"
+"Closed eye: Gizmo is hidden.\n"
+"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
+msgstr ""
+"點擊以切換視覺狀態。\n"
+"\n"
+"眼鏡圖示:Gizmo 可見。\n"
+"眼鏡圖示:Gizmo 隱藏。\n"
+"半開眼鏡:Gizmo 也可以通過 Opaque Surface(「X-Ray - X光」)可見。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr "將節點捕捉到地面"
+msgstr "吸附節點至地面"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr ""
+msgstr "找不到可吸附所選項目的堅固地板 (Solid Floor)。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7650,11 +7348,13 @@ msgid ""
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
msgstr ""
+"拖移:旋轉\n"
+"Alt+拖移:移動\n"
+"Alt+右鍵點擊:展開選擇列表"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Use Local Space"
-msgstr "本地空間模式(%s)"
+msgstr "使用本機空間"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
@@ -7662,7 +7362,7 @@ msgstr "使用吸附"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr "底部視圖"
+msgstr "仰視圖"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
@@ -7685,25 +7385,24 @@ msgid "Right View"
msgstr "右視圖"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Switch Perspective/Orthogonal View"
-msgstr "切換 投影/正交 視圖"
+msgstr "切換投影或正交視圖"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
-msgstr "插入動畫幀"
+msgstr "插入動畫關鍵影格"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr ""
+msgstr "聚焦原點"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
-msgstr ""
+msgstr "聚焦所選"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
-msgstr "切換自由觀察模式"
+msgstr "開啟/關閉自由視圖"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7711,41 +7410,40 @@ msgid "Transform"
msgstr "變換"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Snap Object to Floor"
-msgstr "將對象吸附到地板"
+msgstr "吸附物件至地板"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
-msgstr "轉換對話框..。"
+msgstr "變換對話框..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
-msgstr "1個視口"
+msgstr "1 個檢視區"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports"
-msgstr "2個視口"
+msgstr "2 個檢視區"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr "2個視口 (Alt)"
+msgstr "2 個檢視區(替代)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
-msgstr "3個視口"
+msgstr "3 個檢視區"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr "3個視口 (Alt)"
+msgstr "3 個檢視區(替代)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
-msgstr "4個視口"
+msgstr "4 個檢視區"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Gizmos"
-msgstr ""
+msgstr "Gizmo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -7757,9 +7455,8 @@ msgstr "顯示網格"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Settings..."
-msgstr "設定"
+msgstr "設定..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
@@ -7767,7 +7464,7 @@ msgstr "吸附設定"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate Snap:"
-msgstr "移動吸附"
+msgstr "移動吸附:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
@@ -7775,11 +7472,11 @@ msgstr "旋轉吸附(度):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
-msgstr "縮放吸附 (%):"
+msgstr "縮放吸附(%):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
-msgstr "視區設定"
+msgstr "檢視區設定"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective FOV (deg.):"
@@ -7787,27 +7484,27 @@ msgstr "透視視角(度):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Near:"
-msgstr "查看Z-Near:"
+msgstr "檢視 Z-Near:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Far:"
-msgstr "查看 Z-Far:"
+msgstr "檢視 Z-Far:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Change"
-msgstr ""
+msgstr "修改變換"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
-msgstr ""
+msgstr "移動:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate (deg.):"
-msgstr "旋轉 (度):"
+msgstr "旋轉(度):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale (ratio):"
-msgstr "縮放(比例):"
+msgstr "縮放(比例):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Type"
@@ -7815,189 +7512,167 @@ msgstr "轉換類型"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pre"
-msgstr "前"
+msgstr "前置"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Post"
-msgstr "發佈"
+msgstr "後置"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Nameless gizmo"
-msgstr "未命名的gizmo"
+msgstr "未命名的 Gizmo"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Mesh2D"
-msgstr "創建2D網格"
+msgstr "建立 Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Mesh2D Preview"
-msgstr "創建網格預覽"
+msgstr "建立 Mesh2D 預覽"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon2D"
-msgstr "創建3D多邊形"
+msgstr "建立 Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Polygon2D Preview"
-msgstr ""
+msgstr "預覽 Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D"
-msgstr "創建碰撞多邊形"
+msgstr "建立 CollisionPolygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "CollisionPolygon2D Preview"
-msgstr "創建碰撞多邊形"
+msgstr "碰撞 CollisionPolygon2D 預覽"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D"
-msgstr "創建遮光多邊形"
+msgstr "建立 LightOccluder2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "LightOccluder2D Preview"
-msgstr "創建遮光多邊形"
+msgstr "LightOccluder2D 預覽"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
-msgstr "Sprite 是空的!"
+msgstr "Sprite 為空!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "無法使用動畫影格將 Sprite 轉換為網格。"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr "無效的幾何圖形,無法用網格替換。"
+msgstr "無效的幾何圖形,無法以網格取代。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Mesh2D"
-msgstr "轉換為2D網格"
+msgstr "轉換為 Mesh2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Invalid geometry, can't create polygon."
-msgstr "無效的幾何圖形,無法用網格替換。"
+msgstr "無效的幾何圖形,無法建立多邊形。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to Polygon2D"
-msgstr "轉換為2D網格"
+msgstr "轉換為 Polygon2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Invalid geometry, can't create collision polygon."
-msgstr "無效的幾何圖形,無法用網格替換。"
+msgstr "無效的幾何圖形,無法建立碰撞多邊形。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create CollisionPolygon2D Sibling"
-msgstr "創建碰撞多邊形"
+msgstr "建立 CollisionPolygon2D 同級"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Invalid geometry, can't create light occluder."
-msgstr "無效的幾何圖形,無法用網格替換。"
+msgstr "無效的幾何圖形,無法建立遮光。"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create LightOccluder2D Sibling"
-msgstr "創建遮光多邊形"
+msgstr "建立 LightOccluder2D 同級"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite"
-msgstr ""
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
msgstr "簡化: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Shrink (Pixels): "
-msgstr "擴展(像素): "
+msgstr "收縮(像素): "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
-msgstr "擴展(像素): "
+msgstr "擴展(像素): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
msgstr "更新預覽"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
msgstr "設定:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "No Frames Selected"
-msgstr "幀選擇"
+msgstr "未選擇影格"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add %d Frame(s)"
-msgstr "添加幀"
+msgstr "新增 %d 個影格"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
-msgstr "添加幀"
+msgstr "新增幀"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Unable to load images"
-msgstr "載入資源失敗。"
+msgstr "無法載入圖片"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
-msgstr "錯誤:無法加載幀資源!"
+msgstr "錯誤:無法載入影格資源!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Resource clipboard is empty or not a texture!"
-msgstr "資源剪貼板為空或不是紋理!"
+msgstr "資源剪貼簿為空或非紋理貼圖!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste Frame"
-msgstr "粘貼幀"
+msgstr "貼上影格"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Empty"
-msgstr "添加空白幀"
+msgstr "新增空白"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation FPS"
-msgstr "更改動畫fps"
+msgstr "更改動畫 FPS"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "(empty)"
msgstr "(空)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move Frame"
-msgstr "粘貼幀"
+msgstr "貼上影格"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animations:"
msgstr "動畫:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "New Animation"
-msgstr "新動畫"
+msgstr "新增動畫"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-msgid "Speed (FPS):"
+#, fuzzy
+msgid "Speed:"
msgstr "速度 (FPS):"
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -8005,75 +7680,68 @@ msgid "Loop"
msgstr "循環"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Animation Frames:"
msgstr "動畫幀:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add a Texture from File"
-msgstr "將紋理添加到磁貼集。"
+msgstr "自檔案新增紋理"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frames from a Sprite Sheet"
-msgstr ""
+msgstr "自 Sprite 表新增影格"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
-msgstr "插入空白幀(之前)"
+msgstr "在前面插入空白"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (After)"
-msgstr "插入空白幀(之后)"
+msgstr "在後面插入空白"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (Before)"
-msgstr "移動(以前)"
+msgstr "向前移動"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (After)"
-msgstr "移動(之後)"
+msgstr "向後移動"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select Frames"
-msgstr "選擇模式"
+msgstr "選擇影格"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Horizontal:"
-msgstr "水平翻轉"
+msgstr "水平:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Vertical:"
-msgstr "頂點"
+msgstr "垂直:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Select/Clear All Frames"
-msgstr "選擇全部"
+msgstr "選擇/清除所有影格"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Create Frames from Sprite Sheet"
-msgstr "從場景創建"
+msgstr "自 Sprite 表建立幀"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "SpriteFrames"
-msgstr ""
+msgstr "SpriteFrame"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Region Rect"
-msgstr "設置紋理區域"
+msgstr "設定區域矩形 (Region Rect)"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Margin"
-msgstr "設置邊距"
+msgstr "設定外邊距"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
-msgstr "吸附模式:"
+msgstr "吸附模式:"
#: editor/plugins/texture_region_editor_plugin.cpp
#: scene/resources/visual_shader.cpp
@@ -8090,11 +7758,11 @@ msgstr "網格吸附"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
-msgstr "自動剪切"
+msgstr "自動剪裁"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Offset:"
-msgstr ""
+msgstr "偏移:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Step:"
@@ -8102,76 +7770,71 @@ msgstr "步驟:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "分隔線:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "TextureRegion"
-msgstr ""
+msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
-msgstr "添加所有項目"
+msgstr "新增所有項目"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All"
-msgstr "全部添加"
+msgstr "新增全部"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove All Items"
-msgstr "删除所有項目"
+msgstr "移除所有項目"
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Remove All"
-msgstr "全部删除"
+msgstr "移除全部"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Edit Theme"
-msgstr "編輯主題…"
+msgstr "編輯主題"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
-msgstr "主題編輯菜單。"
+msgstr "主題編輯選單。"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
-msgstr "添加類項"
+msgstr "新增類別項目"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Class Items"
-msgstr "删除類項"
+msgstr "刪除類別項目"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Template"
-msgstr ""
+msgstr "建立空白樣板"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Editor Template"
-msgstr ""
+msgstr "建立空白編輯器樣板"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create From Current Editor Theme"
-msgstr "從當前編輯器主題模板創建"
+msgstr "自目前編輯器主題建立"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Button"
-msgstr "切換自動播放"
+msgstr "開啟/關閉按鈕"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Button"
-msgstr "已停用"
+msgstr "已停用的按鈕"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Item"
msgstr "項目"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled Item"
-msgstr "已停用"
+msgstr "已停用的項目"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Check Item"
@@ -8183,29 +7846,27 @@ msgstr "已檢查的項目"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Radio Item"
-msgstr "單選項目"
+msgstr "單選項"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Checked Radio Item"
-msgstr "選中的單選項目"
+msgstr "已選中的單選項"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Named Sep."
-msgstr ""
+msgstr "帶名稱的分隔線"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Submenu"
-msgstr ""
+msgstr "子選單"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Subitem 1"
-msgstr "項目"
+msgstr "子項目 1"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Subitem 2"
-msgstr "項目"
+msgstr "子項目 2"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
@@ -8216,9 +7877,8 @@ msgid "Many"
msgstr "許多"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Disabled LineEdit"
-msgstr "已停用"
+msgstr "已停用的 LineEdit"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -8233,13 +7893,12 @@ msgid "Tab 3"
msgstr "標籤 3"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Editable Item"
-msgstr "編輯主題…"
+msgstr "可編輯的項目"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Subtree"
-msgstr ""
+msgstr "子樹"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
@@ -8247,12 +7906,12 @@ msgstr "有, 許多, 選項"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
-msgstr "數據類型:"
+msgstr "資料類型:"
#: editor/plugins/theme_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon"
-msgstr "圖標"
+msgstr "圖示"
#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Style"
@@ -8267,27 +7926,25 @@ msgid "Color"
msgstr "顏色"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme File"
-msgstr "主題"
+msgstr "主題檔"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
-msgstr "擦除選中"
+msgstr "清除所選"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "修復無效的磁貼"
+msgstr "修正無效的圖塊"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cut Selection"
-msgstr "切割選擇"
+msgstr "剪下所選"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
-msgstr "繪製磚塊地圖"
+msgstr "繪製圖塊地圖"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Line Draw"
@@ -8295,111 +7952,103 @@ msgstr "線性繪製"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
-msgstr "繪製矩形"
+msgstr "矩形繪製"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
-msgstr "油漆桶填充"
+msgstr "油漆桶填滿"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
-msgstr "擦除磚塊地圖"
+msgstr "清除圖塊地圖"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "查找磁貼"
+msgstr "搜尋圖塊"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
-msgstr "轉置"
+msgstr "切換行列(縱橫)顯示"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Disable Autotile"
-msgstr ""
+msgstr "禁用自動圖塊"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Enable Priority"
-msgstr "編輯磁貼優先級"
+msgstr "啟用優先級"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter tiles"
-msgstr "篩選檔案..."
+msgstr "篩選圖塊"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Give a TileSet resource to this TileMap to use its tiles."
-msgstr ""
+msgstr "為圖塊地圖設定圖塊集資源以使用其圖塊。"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "繪製磁貼"
+msgstr "繪製圖塊"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
"Shift+LMB: Line Draw\n"
"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
+"Shift+左鍵:直線繪製\n"
+"Shift+Ctrl+左鍵:矩形繪圖"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "選擇磁貼"
+msgstr "選擇圖塊"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Left"
msgstr "向左旋轉"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Right"
msgstr "向右旋轉"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Flip Horizontally"
msgstr "水平翻轉"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Flip Vertically"
msgstr "垂直翻轉"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Transform"
msgstr "清除變換"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet."
-msgstr "將紋理添加到磁貼集。"
+msgstr "新增紋理至圖塊集。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected Texture from TileSet."
-msgstr "從磁貼集中刪除選定的紋理。"
+msgstr "自圖塊集移除所選的紋理。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
-msgstr "從場景創建"
+msgstr "自場景建立"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
-msgstr "從場景合併"
+msgstr "自場景合併"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "New Single Tile"
-msgstr ""
+msgstr "新增單一圖塊"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Autotile"
-msgstr "過濾檔案..."
+msgstr "新增自動圖塊"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "New Atlas"
-msgstr "新建 %s"
+msgstr "新增合集"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Next Coordinate"
@@ -8407,188 +8056,172 @@ msgstr "下一個座標"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
-msgstr "選擇下一個形狀、子磁貼或磁貼。"
+msgstr "選擇下一個形狀、子圖塊、或圖塊。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Previous Coordinate"
msgstr "上一個座標"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the previous shape, subtile, or Tile."
-msgstr "選擇上一個形狀、子磁貼或磁貼。"
+msgstr "選擇前一個形狀、子圖塊、或圖塊。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region"
-msgstr "旋轉模式"
+msgstr "區域"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision"
-msgstr "插值模式"
+msgstr "碰撞"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion"
-msgstr "編輯遮擋多邊形"
+msgstr "遮擋"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation"
-msgstr "創建導航網格"
+msgstr "導航"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask"
-msgstr "旋轉模式"
+msgstr "遮罩"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority"
-msgstr "導出模式:"
+msgstr "優先級"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index"
-msgstr "平移模式"
+msgstr "Z 索引"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Region Mode"
-msgstr "旋轉模式"
+msgstr "區域模式"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Collision Mode"
-msgstr "插值模式"
+msgstr "碰撞模式"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Occlusion Mode"
-msgstr "編輯遮擋多邊形"
+msgstr "遮擋模式"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Navigation Mode"
-msgstr "創建導航網格"
+msgstr "導航模式"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Bitmask Mode"
-msgstr "旋轉模式"
+msgstr "優先模式"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Priority Mode"
-msgstr "導出模式:"
+msgstr "優先模式"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Icon Mode"
-msgstr "平移模式"
+msgstr "圖示模式"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Z Index Mode"
-msgstr "平移模式"
+msgstr "Z 索引模式"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
-msgstr "複製位掩碼。"
+msgstr "複製位元遮罩。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Paste bitmask."
-msgstr "貼上參數"
+msgstr "貼上位元遮罩。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Erase bitmask."
-msgstr "擦除位掩碼."
+msgstr "清除位元遮罩。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new rectangle."
-msgstr "創建新矩形。"
+msgstr "建立新矩形。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create a new polygon."
-msgstr "創建新多邊形。"
+msgstr "建立新多邊形。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Keep polygon inside region Rect."
-msgstr "將多邊形保留在區域內。"
+msgstr "保持多邊形在區域矩形 (Rect) 內。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Enable snap and show grid (configurable via the Inspector)."
-msgstr "啟用吸附和顯示網格 (可通過屬性面板配置)。"
+msgstr "啟用吸附與顯示網格(可通過屬性面板設定)。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display Tile Names (Hold Alt Key)"
-msgstr "顯示磁貼名稱 (按住 ALT 鍵)"
+msgstr "顯示圖塊名稱(按住 Alt 鍵)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Add or select a texture on the left panel to edit the tiles bound to it."
-msgstr ""
+msgstr "在左側面板新增或選擇紋理以編輯與其綁定的圖塊。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture? This will remove all tiles which use it."
-msgstr "刪除選定的紋理?這將刪除使用它的所有磁貼。"
+msgstr "是否刪除所選紋理?將一併移除所有使用其之圖塊。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr "您尚未選擇要刪除的紋理。"
+msgstr "尚未選擇欲移除之紋理。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene? This will overwrite all current tiles."
-msgstr "從場景創建?這將覆蓋所有當前磁貼。"
+msgstr "要自場景建立嗎?將複寫目前的圖塊。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
-msgstr "確定合併場景?"
+msgstr "要自場景合併嗎?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Texture"
-msgstr "刪除紋理"
+msgstr "移除紋理"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
-msgstr ""
+msgstr "由於有 %s 個檔案已在列表上,未被新增。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"拖移手柄以編輯矩形 (Rect)。\n"
+"點擊其他圖塊以進行編輯。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete selected Rect."
-msgstr "删除所選的Rect。"
+msgstr "删除所選的矩形 (Rect)。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr "新增資料夾"
+msgstr ""
+"選擇目前編輯的子圖塊。\n"
+"點擊另一個圖塊以進行編輯。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Delete polygon."
msgstr "刪除多邊形。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"LMB: Set bit on.\n"
"RMB: Set bit off.\n"
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
-msgstr "新增資料夾"
+msgstr ""
+"左鍵點擊:開啟位元。\n"
+"右鍵點擊:關閉位元。\n"
+"Shift+左鍵點擊:設定通配位元。\n"
+"點擊另一個圖塊以進行編輯。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8596,59 +8229,60 @@ msgid ""
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
+"選擇欲作為圖示使用的子圖塊,亦將用於無效的自動圖塊綁定上。\n"
+"點擊另一個圖塊以進行編輯。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
+"選擇子圖塊以更改其優先級。\n"
+"點擊另一個圖塊以進行編輯。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its z index.\n"
"Click on another Tile to edit it."
-msgstr "新增資料夾"
+msgstr ""
+"選擇子圖塊以修改其 Z 索引。\n"
+"點擊另一個圖塊以進行編輯。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Region"
-msgstr "設置磁貼區域"
+msgstr "選擇圖塊區域"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Tile"
-msgstr "創建磁貼"
+msgstr "建立圖塊"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Set Tile Icon"
-msgstr "設定磁貼圖標"
+msgstr "設定圖塊圖示"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Bitmask"
-msgstr "編輯磁貼位掩碼"
+msgstr "編輯圖塊位元遮罩"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Collision Polygon"
msgstr "編輯碰撞多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Occlusion Polygon"
msgstr "編輯遮擋多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Edit Navigation Polygon"
-msgstr "新增資料夾"
+msgstr "編輯導航多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Paste Tile Bitmask"
-msgstr "粘貼磁貼位掩碼"
+msgstr "貼上圖塊位元遮罩"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Clear Tile Bitmask"
-msgstr "清除磁貼位掩碼"
+msgstr "清除圖塊位元遮罩"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Make Polygon Concave"
@@ -8660,12 +8294,11 @@ msgstr "使多邊形凸起"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Tile"
-msgstr "移除磁貼"
+msgstr "移除圖塊"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove Collision Polygon"
-msgstr "刪除碰撞多邊形"
+msgstr "移除碰撞多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Occlusion Polygon"
@@ -8677,255 +8310,227 @@ msgstr "刪除導航多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Priority"
-msgstr "編輯磁貼優先級"
+msgstr "編輯圖塊優先級"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Edit Tile Z Index"
-msgstr ""
+msgstr "編輯圖塊 Z 索引"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Convex"
-msgstr "使多邊形凸起"
+msgstr "製作凸多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Make Concave"
-msgstr "使多邊形塌陷"
+msgstr "製作凹多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Collision Polygon"
-msgstr "創建碰撞多邊形"
+msgstr "建立碰撞多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Create Occlusion Polygon"
-msgstr "創建遮擋多邊形"
+msgstr "建立遮擋多邊形"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "無法更改此屬性。"
+msgstr "該屬性無法修改。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "TileSet"
-msgstr ""
+msgstr "圖塊集"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No VCS addons are available."
-msgstr ""
+msgstr "無可用的版本控制 (VCS) 擴充功能。"
-#: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp
+#: editor/plugins/version_control_editor_plugin.cpp
msgid "Error"
-msgstr ""
+msgstr "錯誤"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No commit message was provided"
-msgstr ""
+msgstr "未提供提交訊息"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr ""
+msgstr "預存區無檔案"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Commit"
-msgstr "社區"
+msgstr "提交"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "VCS Addon is not initialized"
-msgstr ""
+msgstr "VCS 擴充功能尚未初始化"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control System"
-msgstr ""
+msgstr "版本控制系統 (VCS)"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Initialize"
-msgstr "首字母大寫"
+msgstr "初始化"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
-msgstr ""
+msgstr "預存區"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Detect new changes"
-msgstr "創建新矩形。"
+msgstr "偵測新改動"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Changes"
-msgstr "更換"
+msgstr "改動"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Modified"
-msgstr ""
+msgstr "已修改"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Renamed"
-msgstr "重命名"
+msgstr "重新命名"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Deleted"
-msgstr "刪除"
+msgstr "已刪除"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Typechange"
-msgstr "更換"
+msgstr "格式更改"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Stage Selected"
-msgstr "縮放所選"
+msgstr "預存所選"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Stage All"
-msgstr "全部保存"
+msgstr "預存全部"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
-msgstr ""
+msgstr "新增一個提交訊息"
#: editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Commit Changes"
-msgstr "同步腳本的變更"
+msgstr "提交改動"
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Status"
-msgstr ""
+msgstr "狀態"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "View file diffs before committing them to the latest version"
-msgstr ""
+msgstr "在提交至最新版本前檢視檔案的差異"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No file diff is active"
-msgstr ""
+msgstr "無有效的檔案差異"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect changes in file diff"
-msgstr ""
+msgstr "在檔案差異中偵測改動"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(GLES3 only)"
-msgstr ""
+msgstr "(僅限 GLES3)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Output"
-msgstr "添加輸入"
+msgstr "新增輸出"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar"
-msgstr "縮放:"
+msgstr "純量 Scalar"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector"
-msgstr "屬性面板"
+msgstr "向量 Vector"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean"
-msgstr ""
+msgstr "布林 Boolean"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sampler"
-msgstr ""
+msgstr "採樣 Sampler"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add input port"
-msgstr "添加輸入"
+msgstr "新增輸入埠口"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr ""
+msgstr "新增輸出埠口"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port type"
-msgstr "更改預設類型"
+msgstr "修改輸入埠口類型"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change output port type"
-msgstr "更改預設類型"
+msgstr "修改輸出埠口類型"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Change input port name"
-msgstr "更改動畫名稱:"
+msgstr "修改輸入埠口名稱"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Change output port name"
-msgstr ""
+msgstr "修改輸出埠口名稱"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove input port"
-msgstr "刪除點"
+msgstr "移除輸入埠口"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Remove output port"
-msgstr "刪除點"
+msgstr "移除輸出埠口"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Set expression"
-msgstr "設置磁貼區域"
+msgstr "設定表示式"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Resize VisualShader node"
-msgstr "視覺化著色器"
+msgstr "調整 VisualShader 節點大小"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Uniform Name"
-msgstr "設置統一名稱"
+msgstr "設定均勻名稱"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Set Input Default Port"
-msgstr "設置輸入預設端口"
+msgstr "設定輸入預設埠口"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add Node to Visual Shader"
-msgstr "將節點添加到可視化著色器"
+msgstr "將節點新增至視覺著色器"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Duplicate Nodes"
-msgstr "複製節點"
+msgstr "重複節點"
#: editor/plugins/visual_shader_editor_plugin.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste Nodes"
-msgstr ""
+msgstr "貼上節點"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Delete Nodes"
-msgstr "刪除"
+msgstr "刪除節點"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Input Type Changed"
-msgstr "視覺著色器輸入類型已更改"
+msgstr "已修改視覺著色器輸入類型"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr "頂點"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
msgstr "片段"
@@ -8934,380 +8539,368 @@ msgid "Light"
msgstr "燈光"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Show resulted shader code."
-msgstr "創建節點"
+msgstr "顯示產生的著色器程式碼。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Create Shader Node"
-msgstr "創建節點"
+msgstr "建立著色器節點"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color function."
-msgstr "轉到函數"
+msgstr "顏色函式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color operator."
-msgstr ""
+msgstr "色彩運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Grayscale function."
-msgstr "建立函式"
+msgstr "灰階函式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts HSV vector to RGB equivalent."
-msgstr ""
+msgstr "將 HSV 向量轉為同等之 RGB。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts RGB vector to HSV equivalent."
-msgstr ""
+msgstr "將 RGB 向量轉為同等之 HSV。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Sepia function."
-msgstr "建立函式"
+msgstr "深褐函式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Burn operator."
-msgstr ""
+msgstr "加深 (Burn) 運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Darken operator."
-msgstr ""
+msgstr "暗化運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Difference operator."
-msgstr "僅差異"
+msgstr "差異運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr ""
+msgstr "加亮 (Dodge) 運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "HardLight operator."
-msgstr "縮放(比例):"
+msgstr "強光 (HardLight) 運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
-msgstr ""
+msgstr "亮化運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Overlay operator."
-msgstr ""
+msgstr "疊加運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Screen operator."
-msgstr ""
+msgstr "濾色運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "SoftLight operator."
-msgstr ""
+msgstr "柔光運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color constant."
-msgstr "固定"
+msgstr "色彩常數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Color uniform."
-msgstr "清除變換"
+msgstr "色彩均勻。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
-msgstr ""
+msgstr "回傳兩個參數間 %s 比較的布林結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "等於 (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "大於 (>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "大於等於 (>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided scalars are equal, greater or "
"less."
-msgstr ""
+msgstr "若提供的純量相等、大於、或小於,則回傳相關的向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF and a scalar "
"parameter."
-msgstr ""
+msgstr "回傳在 INF 與純量參數間比較的布林結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between NaN and a scalar "
"parameter."
-msgstr ""
+msgstr "回傳在 NaN 與純量參數間比較的布林結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "小於 (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "小於等於 (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "不等於 (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated vector if the provided boolean value is true or false."
-msgstr ""
+msgstr "若提供的布林值為 true 或 false,則回傳相關的向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns an associated scalar if the provided boolean value is true or false."
-msgstr ""
+msgstr "若提供的布林值為 true 或 false,則回傳相關的純量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the comparison between two parameters."
-msgstr ""
+msgstr "回傳兩個參數間比較的布林結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the boolean result of the comparison between INF (or NaN) and a "
"scalar parameter."
-msgstr ""
+msgstr "回傳 INF (或 NaN) 與一個純量間比較的布林結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean constant."
-msgstr ""
+msgstr "布林常數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Boolean uniform."
-msgstr ""
+msgstr "布林均勻。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for all shader modes."
-msgstr ""
+msgstr "所有的著色器模式的「%s」輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Input parameter."
-msgstr "吸附到父級節點"
+msgstr "輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader modes."
-msgstr ""
+msgstr "頂點與片段模式的「%s」輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr ""
+msgstr "片段與燈光著色器模式的「%s」輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
-msgstr ""
+msgstr "片段著色器模式的「%s」輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for light shader mode."
-msgstr ""
+msgstr "燈光著色器模式的「%s」輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex shader mode."
-msgstr ""
+msgstr "頂點著色器的「%s」輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
-msgstr ""
+msgstr "頂點或片段著色器的「%s」輸入參數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar function."
-msgstr "縮放所選"
+msgstr "純量函式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar operator."
-msgstr "縮放(比例):"
+msgstr "純量運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "E constant (2.718282). Represents the base of the natural logarithm."
-msgstr ""
+msgstr "E 常數 (2.718282)。表示自然對數的底數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Epsilon constant (0.00001). Smallest possible scalar number."
-msgstr ""
+msgstr "ε (eplison) 常數 (0.00001)。最小可用的純量數字。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Phi constant (1.618034). Golden ratio."
-msgstr ""
+msgstr "Φ(Phi) 常數 (1.618034)。黃金比例。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/4 constant (0.785398) or 45 degrees."
-msgstr ""
+msgstr "π (Pi)/4 常數 (0.785398) 或 45 度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi/2 constant (1.570796) or 90 degrees."
-msgstr ""
+msgstr "π (Pi)/2 常數 (1.570796) 或 95 度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Pi constant (3.141593) or 180 degrees."
-msgstr ""
+msgstr "π (Pi) 常數 (3.141593) 或 180 度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Tau constant (6.283185) or 360 degrees."
-msgstr ""
+msgstr "τ (Tau) 常數 (6.283185) 或 360 度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Sqrt2 constant (1.414214). Square root of 2."
-msgstr ""
+msgstr "Sqrt2 常數 (1.414214)。2 的平方根。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the absolute value of the parameter."
-msgstr ""
+msgstr "回傳參數的絕對值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-cosine of the parameter."
-msgstr ""
+msgstr "回傳參數的反餘弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "回傳參數的反雙曲餘弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-sine of the parameter."
-msgstr ""
+msgstr "回傳參數的反正弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic sine of the parameter."
-msgstr ""
+msgstr "回傳參數的反雙曲正弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameter."
-msgstr ""
+msgstr "回傳參數的反正切值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the arc-tangent of the parameters."
-msgstr ""
+msgstr "回傳參數的反正切值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "回傳參數的反雙曲正切值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Finds the nearest integer that is greater than or equal to the parameter."
-msgstr ""
+msgstr "尋找大於或等於該參數最近的整數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Constrains a value to lie between two further values."
-msgstr ""
+msgstr "將值限制於兩個值之間。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the cosine of the parameter."
-msgstr ""
+msgstr "回傳參數的餘弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic cosine of the parameter."
-msgstr ""
+msgstr "回傳參數的雙曲餘弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in radians to degrees."
-msgstr ""
+msgstr "將弧度轉換為角度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-e Exponential."
-msgstr ""
+msgstr "e 為底數的指數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 Exponential."
-msgstr ""
+msgstr "2 為底數的指數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer less than or equal to the parameter."
-msgstr ""
+msgstr "尋找小於或等於參數最近的整數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Computes the fractional part of the argument."
-msgstr ""
+msgstr "計算引數的小數部分。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the inverse of the square root of the parameter."
-msgstr ""
+msgstr "回傳參數的平方根之倒數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Natural logarithm."
-msgstr ""
+msgstr "自然對數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Base-2 logarithm."
-msgstr ""
+msgstr "2 為底數的對數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the greater of two values."
-msgstr ""
+msgstr "回傳兩個值中較大的值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the lesser of two values."
-msgstr ""
+msgstr "回傳兩個值中較小的值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two scalars."
-msgstr ""
+msgstr "在兩個純量間做線性插值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the opposite value of the parameter."
-msgstr ""
+msgstr "回傳參數的相反值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - scalar"
-msgstr ""
+msgstr "1.0 - 純量"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the value of the first parameter raised to the power of the second."
-msgstr ""
+msgstr "回傳第一個參數的第二個參數冪次的值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Converts a quantity in degrees to radians."
-msgstr ""
+msgstr "將角度轉換為弧度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / scalar"
-msgstr ""
+msgstr "1.0 / 純量"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest integer to the parameter."
-msgstr ""
+msgstr "尋找參數最近的整數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the nearest even integer to the parameter."
-msgstr ""
+msgstr "尋找參數最近的偶數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Clamps the value between 0.0 and 1.0."
-msgstr ""
+msgstr "將數值限制在 0.0 與 1.0 之間。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Extracts the sign of the parameter."
-msgstr ""
+msgstr "抽取參數的號(正號/負號)。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the sine of the parameter."
-msgstr ""
+msgstr "回傳參數的正弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic sine of the parameter."
-msgstr ""
+msgstr "回傳參數的雙曲正弦值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the square root of the parameter."
-msgstr ""
+msgstr "回傳參數的平方根。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9317,6 +8910,10 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep 函式( scalar(edge0),scalar(edge1),scalar(x) )。\n"
+"\n"
+"若「x」小於「edge0」則回傳 0.0,若 x 大於「edge1」則回傳 1.0。其餘值則回傳在 "
+"0.0 與 1.0 之間使用厄米多項式進行插值的結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9324,72 +8921,73 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step 函式( scalar(edge), scalar(x) )。\n"
+"\n"
+"若「x」小於「edge」則回傳 0.0,否則回傳 1.0。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the tangent of the parameter."
-msgstr ""
+msgstr "回傳參數的正切值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the hyperbolic tangent of the parameter."
-msgstr ""
+msgstr "回傳參數的雙曲正切值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Finds the truncated value of the parameter."
-msgstr ""
+msgstr "尋找參數的截斷值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds scalar to scalar."
-msgstr ""
+msgstr "將純量新增至純量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides scalar by scalar."
-msgstr ""
+msgstr "以純量除以純量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies scalar by scalar."
-msgstr ""
+msgstr "以純量乘以純量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two scalars."
-msgstr ""
+msgstr "回傳兩個純量相除的餘數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts scalar from scalar."
-msgstr ""
+msgstr "以純量減去純量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar constant."
-msgstr ""
+msgstr "純量常數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Scalar uniform."
-msgstr "清除變換"
+msgstr "純量均勻。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the cubic texture lookup."
-msgstr ""
+msgstr "進行立方體紋理搜尋。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr ""
+msgstr "進行紋理搜尋。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Cubic texture uniform lookup."
-msgstr ""
+msgstr "立方體紋理均勻搜尋。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "2D texture uniform lookup."
-msgstr ""
+msgstr "2D 紋理均勻搜尋。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "2D texture uniform lookup with triplanar."
-msgstr ""
+msgstr "以三平面進行 2D 紋理均勻尋找。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform function."
-msgstr "轉換對話框..。"
+msgstr "轉換函式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9401,73 +8999,75 @@ msgid ""
"whose number of rows is the number of components in 'c' and whose number of "
"columns is the number of components in 'r'."
msgstr ""
+"計算一對向量的外積。\n"
+"\n"
+"OuterProduct 將第一個參數「c」視為列向量(由一個列的矩陣),第二個參數「r」視"
+"為行向量(由一個行的矩陣),並依線性代數矩陣乘以「c * r」,產生一個矩陣其行數"
+"為「c」中的組件,列數為「r」的組件。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr ""
+msgstr "由四個向量構成變換。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
-msgstr ""
+msgstr "由四個向量分解變換。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr ""
+msgstr "計算變換的行列式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr ""
+msgstr "計算變換的逆矩陣。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr ""
+msgstr "計算一個變換的轉置。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr ""
+msgstr "變換乘以變換。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
-msgstr ""
+msgstr "向量乘以變換。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform constant."
-msgstr "新增資料夾"
+msgstr "變換常數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Transform uniform."
-msgstr "轉換對話框..。"
+msgstr "變換均勻。"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vector function."
-msgstr "轉到函數…"
+msgstr "向量函式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector operator."
-msgstr ""
+msgstr "向量運算子。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes vector from three scalars."
-msgstr ""
+msgstr "由三個純量組成向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes vector to three scalars."
-msgstr ""
+msgstr "將一個向量拆解為三個純量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the cross product of two vectors."
-msgstr ""
+msgstr "計算兩個向量的外積。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the distance between two points."
-msgstr ""
+msgstr "回傳兩個點間的距離。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the dot product of two vectors."
-msgstr ""
+msgstr "計算兩個向量的內積。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9476,40 +9076,43 @@ msgid ""
"incident vector, and Nref, the reference vector. If the dot product of I and "
"Nref is smaller than zero the return value is N. Otherwise -N is returned."
msgstr ""
+"回傳一個與參照向量指向相同方向的向量。該函式由三個向量參數:N,方向向量;I,"
+"入射向量,以及 Nref,參照向量。若 I 與 Nref 的內積小於 0,則回傳值為 N。否則"
+"將回傳 -N。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the length of a vector."
-msgstr ""
+msgstr "計算向量的長度。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors."
-msgstr ""
+msgstr "在兩個向量間做線性插值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors using scalar."
-msgstr ""
+msgstr "使用純量在兩個向量間做線性插值。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
-msgstr ""
+msgstr "計算向量的正規化積。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 - vector"
-msgstr ""
+msgstr "1.0 - 向量"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "1.0 / vector"
-msgstr ""
+msgstr "1.0 / 向量"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns the vector that points in the direction of reflection ( a : incident "
"vector, b : normal vector )."
-msgstr ""
+msgstr "回傳指向反射方向的向量(a:入射向量,b:法向量)。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the vector that points in the direction of refraction."
-msgstr ""
+msgstr "回傳指向折射方向的向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9519,6 +9122,10 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep 函式( vector(edge0), vector(edge1), vector(x) ).\n"
+"\n"
+"若「x」小於「edge0」則回傳 0.0,若「x」大於「edge1」則回傳 1.0。其餘值則回傳"
+"在 0.0 與 1.0 之間使用厄米多項式進行插值的結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9528,6 +9135,10 @@ msgid ""
"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 "
"using Hermite polynomials."
msgstr ""
+"SmoothStep 函式( scalar(edge0), scalar(edge1), vector(x) ).\n"
+"\n"
+"若「x」小於「edge0」則回傳 0.0,若「x」大於「edge1」則回傳 1.0。其餘值則回傳"
+"在 0.0 與 1.0 之間使用厄米多項式進行插值的結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9535,6 +9146,9 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step 函式( vector(edge), vector(x) ).\n"
+"\n"
+"若「x」小於「edge」則回傳 0.0,否則回傳 1.0。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9542,34 +9156,37 @@ msgid ""
"\n"
"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."
msgstr ""
+"Step 函式( scalar(edge), vector(x) ).\n"
+"\n"
+"若「x」小於「edge」則回傳 1.0,否則回傳 1.0。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Adds vector to vector."
-msgstr ""
+msgstr "將向量加上向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "以向量除以向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
-msgstr ""
+msgstr "以向量乘以向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the remainder of the two vectors."
-msgstr ""
+msgstr "回傳兩個向量相除的餘數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Subtracts vector from vector."
-msgstr ""
+msgstr "將向量減去向量。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
-msgstr ""
+msgstr "向量常數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector uniform."
-msgstr ""
+msgstr "向量均勻。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9577,12 +9194,14 @@ msgid ""
"output ports. This is a direct injection of code into the vertex/fragment/"
"light function, do not use it to write the function declarations inside."
msgstr ""
+"自定 Godot 著色器語言表示式,使用自定數量的輸入與輸出埠口。這是通過直接插向頂"
+"點/片段/光照函式插入程式碼來實現的,請勿在其中聲明函式。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
-msgstr ""
+msgstr "依據表面法線與相機檢視方向的內積來回傳下降率(將其相關輸入傳入)。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9591,90 +9210,92 @@ msgid ""
"it later in the Expressions. You can also declare varyings, uniforms and "
"constants."
msgstr ""
+"自定 Godot 著色器語言表示式,將被放入最終的著色器頂部。可以放入數個函數聲明在"
+"裡面,並於稍後在表示式中呼叫。也可以聲明 Varying、Uniform 與常數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Scalar derivative function."
-msgstr ""
+msgstr "(限片段/光照模式)純量導函數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(Fragment/Light mode only) Vector derivative function."
-msgstr ""
+msgstr "(限片段/光照模式)向量導函數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
-msgstr ""
+msgstr "(限片段/光照模式)(向量)以使用局部差分的「x」進行導數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local "
"differencing."
-msgstr ""
+msgstr "(限片段/光照模式)(純量)以使用局部差分的「x」進行導數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'y' using local "
"differencing."
-msgstr ""
+msgstr "(限片段/光照模式)(向量)以使用局部差分的「y」進行導數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local "
"differencing."
-msgstr ""
+msgstr "(限片段/光照模式)(純量)以使用局部差分的「y」進行導數。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and "
"'y'."
-msgstr ""
+msgstr "(限片段/光照模式)(向量)加總「x」與「y」進行絕對導數的結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and "
"'y'."
-msgstr ""
+msgstr "(限片段/光照模式)(純量)加總「x」與「y」進行絕對導數的結果。"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "VisualShader"
-msgstr "視覺化著色器"
+msgstr "VisualShader"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Edit Visual Property"
-msgstr "編輯可視屬性"
+msgstr "編輯視覺屬性"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Visual Shader Mode Changed"
-msgstr "視覺著色器模式已更改"
+msgstr "已修改視覺著色器模式"
#: editor/project_export.cpp
msgid "Runnable"
-msgstr "可運行的"
+msgstr "可執行"
#: editor/project_export.cpp
-#, fuzzy
msgid "Add initial export..."
-msgstr "添加輸入"
+msgstr "新增初始匯出..."
#: editor/project_export.cpp
msgid "Add previous patches..."
-msgstr ""
+msgstr "新增上回修正檔..."
#: editor/project_export.cpp
msgid "Delete patch '%s' from list?"
-msgstr ""
+msgstr "是否要自列表中刪除「%s」修正檔?"
#: editor/project_export.cpp
msgid "Delete preset '%s'?"
-msgstr "是否删除預設“%s”?"
+msgstr "確定要刪除預設設定「%s」?"
#: editor/project_export.cpp
msgid ""
"Failed to export the project for platform '%s'.\n"
"Export templates seem to be missing or invalid."
msgstr ""
+"為平台「%s」匯出專案失敗。\n"
+"匯出樣板似乎已遺失或無效。"
#: editor/project_export.cpp
msgid ""
@@ -9682,40 +9303,44 @@ msgid ""
"This might be due to a configuration issue in the export preset or your "
"export settings."
msgstr ""
+"為平台「%s」匯出專案失敗。\n"
+"可能是由於匯出預設設定或匯出設定中的組態設定有問題導致。"
#: editor/project_export.cpp
msgid "Release"
-msgstr "釋放"
+msgstr "發行"
#: editor/project_export.cpp
msgid "Exporting All"
-msgstr "全部導出"
+msgstr "全部匯出"
#: editor/project_export.cpp
msgid "The given export path doesn't exist:"
-msgstr "給定的導出路徑不存在:"
+msgstr "給定的匯出路徑不存在:"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing/corrupted:"
-msgstr "無此平臺的導出範本:"
+msgstr "該平台的匯出範本遺失/損毀:"
#: editor/project_export.cpp
msgid "Presets"
-msgstr "預設"
+msgstr "預設設定"
#: editor/project_export.cpp editor/project_settings_editor.cpp
msgid "Add..."
-msgstr "添加…"
+msgstr "新增…"
#: editor/project_export.cpp
msgid ""
"If checked, the preset will be available for use in one-click deploy.\n"
"Only one preset per platform may be marked as runnable."
msgstr ""
+"若選中,則預設設定將可使用單鍵部署。\n"
+"每個平台只可將一個預設設定設為可執行。"
#: editor/project_export.cpp
msgid "Export Path"
-msgstr "導出路徑"
+msgstr "匯出路徑"
#: editor/project_export.cpp
msgid "Resources"
@@ -9723,48 +9348,51 @@ msgstr "資源"
#: editor/project_export.cpp
msgid "Export all resources in the project"
-msgstr "導出項目中的所有資源"
+msgstr "匯出專案內所有資源"
#: editor/project_export.cpp
msgid "Export selected scenes (and dependencies)"
-msgstr "導出選定的場景 (和依賴項)"
+msgstr "匯出所選場景(與其所有相依性)"
#: editor/project_export.cpp
msgid "Export selected resources (and dependencies)"
-msgstr "導出選定的資源 (和依賴項)"
+msgstr "匯出所選資源(與其所有相依性)"
#: editor/project_export.cpp
msgid "Export Mode:"
-msgstr "導出模式:"
+msgstr "匯出模式:"
#: editor/project_export.cpp
msgid "Resources to export:"
-msgstr "要輸出的資源:"
+msgstr "匯出的資源:"
#: editor/project_export.cpp
msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
+"篩選非資源的檔案/資料夾以進行匯出\n"
+"(以半形逗號區分,如: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
+"進行篩選以在專案內排除檔案/資料夾\n"
+"(以半形逗號區分,如: *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
-msgstr "補丁"
+msgstr "修正檔"
#: editor/project_export.cpp
msgid "Make Patch"
-msgstr "製作補丁"
+msgstr "製作修正檔"
#: editor/project_export.cpp
-#, fuzzy
msgid "Pack File"
-msgstr " 資料夾"
+msgstr "打包檔案"
#: editor/project_export.cpp
msgid "Features"
@@ -9772,25 +9400,23 @@ msgstr "功能"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
-msgstr "自訂 (逗號分隔):"
+msgstr "自訂(以逗號分隔):"
#: editor/project_export.cpp
-#, fuzzy
msgid "Feature List:"
-msgstr "功能清單:"
+msgstr "功能清單:"
#: editor/project_export.cpp
-#, fuzzy
msgid "Script"
msgstr "腳本"
#: editor/project_export.cpp
msgid "Script Export Mode:"
-msgstr "腳本導出模式:"
+msgstr "腳本匯出模式:"
#: editor/project_export.cpp
msgid "Text"
-msgstr "文本"
+msgstr "純文字"
#: editor/project_export.cpp
msgid "Compiled"
@@ -9798,163 +9424,162 @@ msgstr "編譯"
#: editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
-msgstr "加密 (使用以下密碼)"
+msgstr "加密(使用以下密鑰)"
#: editor/project_export.cpp
msgid "Invalid Encryption Key (must be 64 characters long)"
-msgstr "不正確加密金鑰 (長度必須為64個字元)"
+msgstr "無效的加密密鑰(長度需為 64 個字元)"
#: editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
-msgstr "腳本加密金鑰 (256位十六進位碼):"
+msgstr "腳本加密密鑰(256 位元的 16 進位):"
#: editor/project_export.cpp
msgid "Export PCK/Zip"
-msgstr "導出 PCK/ZIP"
+msgstr "匯出 PCK/ZIP"
#: editor/project_export.cpp
msgid "Export Project"
-msgstr "輸出專案"
+msgstr "匯出專案"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "導出模式:"
+msgstr "匯出模式?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "全部導出"
+msgstr "全部匯出"
#: editor/project_export.cpp editor/project_manager.cpp
-#, fuzzy
msgid "ZIP File"
-msgstr " 資料夾"
+msgstr "ZIP 檔案"
#: editor/project_export.cpp
msgid "Godot Game Pack"
-msgstr ""
+msgstr "Godot 遊戲包"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
-msgstr "缺少此平臺的導出範本:"
+msgstr "缺少匯出該平台用的樣板:"
#: editor/project_export.cpp
msgid "Manage Export Templates"
-msgstr "管理輸出模板"
+msgstr "管理匯出樣板"
#: editor/project_export.cpp
msgid "Export With Debug"
-msgstr "導出為調試"
+msgstr "以偵錯模式匯出"
#: editor/project_manager.cpp
-msgid "The path does not exist."
-msgstr "路徑不存在."
+msgid "The path specified doesn't exist."
+msgstr "指定的路徑不存在。"
#: editor/project_manager.cpp
-msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "“.zip”項目檔案無效,不包含“project.godot”檔案。"
+msgid "Error opening package file (it's not in ZIP format)."
+msgstr "開啟套件檔案時發生錯誤(非 ZIP 格式)。"
+
+#: editor/project_manager.cpp
+msgid ""
+"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file."
+msgstr "無效的「.zip」專案檔;未包含「project.godot」檔案。"
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "請選擇一個空資料夾。"
#: editor/project_manager.cpp
-msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "請選擇“project.godot”或“.zip”檔案。"
+msgid "Please choose a \"project.godot\" or \".zip\" file."
+msgstr "請選擇一個「project.godot」或「.zip」檔案。"
#: editor/project_manager.cpp
-msgid "Directory already contains a Godot project."
-msgstr "目錄已包含一個godot項目。"
+msgid "This directory already contains a Godot project."
+msgstr "該目錄已經包含了一個 Godot 專案。"
#: editor/project_manager.cpp
msgid "New Game Project"
-msgstr "新遊戲項目"
+msgstr "新遊戲專案"
#: editor/project_manager.cpp
msgid "Imported Project"
-msgstr "已導入的項目"
+msgstr "已匯入的項目"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "項目名稱無效。"
+msgstr "無效的專案名。"
#: editor/project_manager.cpp
msgid "Couldn't create folder."
-msgstr "無法新增資料夾."
+msgstr "無法建立資料夾。"
#: editor/project_manager.cpp
msgid "There is already a folder in this path with the specified name."
-msgstr "此路徑中已存在具有指定名稱的資料夾。"
+msgstr "該路徑下已有相同名稱的資料夾。"
#: editor/project_manager.cpp
msgid "It would be a good idea to name your project."
-msgstr "給你的項目命名是個好主意。"
+msgstr "最好幫你的專案起個名字。"
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr "不正確項目路徑 (更改了任何內容?)。"
+msgstr "不正確的專案路徑(有修改了什麼嗎?)。"
#: editor/project_manager.cpp
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
-msgstr "無法在項目路徑中加載project.godot(錯誤%d)。它可能遺失或損壞。"
+msgstr "無法自專案路徑內載入 project.godot(錯誤 %d)。檔案可能遺失或損毀。"
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
-msgstr "無法在項目路徑中編輯project.godot。"
+msgstr "無法在專案路徑中編輯 project.godot。"
#: editor/project_manager.cpp
msgid "Couldn't create project.godot in project path."
-msgstr "無法在項目路徑中創建project.godot。"
+msgstr "無法在項目路徑中建立 project.godot。"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Rename Project"
-msgstr "重命名項目"
+msgstr "重新命名項目"
#: editor/project_manager.cpp
msgid "Import Existing Project"
-msgstr "導入現有項目"
+msgstr "匯入現有專案"
#: editor/project_manager.cpp
msgid "Import & Edit"
-msgstr "導入與編輯"
+msgstr "匯入並編輯"
#: editor/project_manager.cpp
msgid "Create New Project"
-msgstr "創建新項目"
+msgstr "建立新專案"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Create & Edit"
-msgstr "創建和編輯"
+msgstr "建立並編輯"
#: editor/project_manager.cpp
msgid "Install Project:"
-msgstr "安裝項目:"
+msgstr "安裝專案:"
#: editor/project_manager.cpp
msgid "Install & Edit"
-msgstr "安裝和編輯"
+msgstr "安裝並編輯"
#: editor/project_manager.cpp
msgid "Project Name:"
-msgstr "項目名稱:"
+msgstr "專案名稱:"
#: editor/project_manager.cpp
msgid "Project Path:"
-msgstr "項目路徑:"
+msgstr "專案路徑:"
#: editor/project_manager.cpp
msgid "Project Installation Path:"
-msgstr "項目安裝路徑:"
+msgstr "專案安裝路徑:"
#: editor/project_manager.cpp
msgid "Renderer:"
-msgstr "渲染器:"
+msgstr "轉譯器:"
#: editor/project_manager.cpp
msgid "OpenGL ES 3.0"
@@ -9967,6 +9592,10 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
+"更好的視覺品質\n"
+"所有功能可用\n"
+"與舊硬體不相容\n"
+"不推薦用於網頁遊戲"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
@@ -9979,34 +9608,36 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
+"較低的視覺品質\n"
+"有些功能不可用\n"
+"在大多數硬體上可用\n"
+"推薦用於網頁遊戲"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr "渲染器可以然後更改, 但場景可能需要調整。"
+msgstr "稍後仍可更改轉譯器,但可能需要對場景進行調整。"
#: editor/project_manager.cpp
msgid "Unnamed Project"
-msgstr "未命名項目"
+msgstr "未命名專案"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Missing Project"
-msgstr "導入現有項目"
+msgstr "遺失專案"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr ""
+msgstr "錯誤:專案在檔案系統上遺失。"
#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
-msgstr "無法打開位於'%s'的項目。"
+msgstr "無法於「%s」打開專案。"
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
-msgstr "您確定要打開多個項目嗎?"
+msgstr "確定要打開多個專案嗎?"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"The following project settings file does not specify the version of Godot "
"through which it was created.\n"
@@ -10018,15 +9649,14 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
-"以下項目設定檔案未指定通過其創建的Godot的版本。\n"
+"下列專案設定檔未指定建立其之 Godot 版本。\n"
"\n"
"%s\n"
"\n"
-"如果繼續打開它, 它將被轉換為 Godot 的當前配置檔案格式。 \n"
-"警告: 您將無法再使用以前版本的引擎打開項目。"
+"若您繼續開啟,會將其轉換為目前 Godot 版本的組態設定檔案格式。\n"
+"警告:您將不再可使用舊版的 Godot 開啟該專案。"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"The following project settings file was generated by an older engine "
"version, and needs to be converted for this version:\n"
@@ -10037,18 +9667,19 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
-"以下項目設置檔案是由較舊的引擎版本生成的, 需要為此版本進行轉換:\n"
+"下列專案設定檔是由較舊版本的 Godot 產生,需進行轉換以適用於目前版本的 "
+"Godot:\n"
"\n"
"%s\n"
"\n"
-"是否要將其轉換?\n"
-"警告: 您將無法再使用以前版本的引擎打開專案。"
+"要進行轉換嗎?\n"
+"警告:您將不再可使用舊版的 Godot 開啟該專案。"
#: editor/project_manager.cpp
msgid ""
"The project settings were created by a newer engine version, whose settings "
"are not compatible with this version."
-msgstr "此項目設置是由較新的引擎版本創建的, 其設置與此版本不相容。"
+msgstr "該專案設定是由新版本的引擎所建立,其設定無法相容於這個版本。"
#: editor/project_manager.cpp
msgid ""
@@ -10056,330 +9687,342 @@ msgid ""
"Please edit the project and set the main scene in the Project Settings under "
"the \"Application\" category."
msgstr ""
+"無法執行專案:未定義主場景。\n"
+"請編輯專案並在「應用程式」分類中的專案設定內設定主場景。"
#: editor/project_manager.cpp
msgid ""
"Can't run project: Assets need to be imported.\n"
"Please edit the project to trigger the initial import."
msgstr ""
+"無法執行專案:需要匯入素材\n"
+"請編輯專案以觸發初始匯入。"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Are you sure to run %d projects at once?"
-msgstr "您確定要運行多個項目嗎?"
+msgstr "確定要一次執行 %d 個專案?"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove %d projects from the list?\n"
"The project folders' contents won't be modified."
-msgstr "是否從清單中删除項目?(資料夾內容將不被修改)"
+msgstr ""
+"確定要自清單中移除 %d 個專案嗎?\n"
+"專案資料夾的內容不會被修改。"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove this project from the list?\n"
"The project folder's contents won't be modified."
-msgstr "是否從清單中删除項目?(資料夾內容將不被修改)"
+msgstr ""
+"確定要自列表移除該專案嗎?\n"
+"專案資料夾的內容不會被修改。"
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Remove all missing projects from the list?\n"
"The project folders' contents won't be modified."
-msgstr "是否從清單中删除項目?(資料夾內容將不被修改)"
+msgstr ""
+"確定自清單移除所有遺失的專案嗎?\n"
+"專案資料夾的內容不會被修改。"
#: editor/project_manager.cpp
msgid ""
"Language changed.\n"
"The interface will update after restarting the editor or project manager."
msgstr ""
+"語言已更改。\n"
+"界面將會在重新啟動編輯器或專案管理員後更新。"
#: editor/project_manager.cpp
msgid ""
"Are you sure to scan %s folders for existing Godot projects?\n"
"This could take a while."
msgstr ""
+"確定要掃描 %s 中的 Godot 專案嗎?\n"
+"這可能需要一段時間。"
+#. TRANSLATORS: This refers to the application where users manage their Godot projects.
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr ""
+msgstr "專案管理員"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Projects"
msgstr "專案"
#: editor/project_manager.cpp
msgid "Last Modified"
-msgstr ""
+msgstr "最後修改時間"
#: editor/project_manager.cpp
msgid "Scan"
-msgstr ""
+msgstr "掃描"
#: editor/project_manager.cpp
msgid "Select a Folder to Scan"
-msgstr ""
+msgstr "選擇資料夾以進行掃描"
#: editor/project_manager.cpp
msgid "New Project"
-msgstr ""
+msgstr "新增專案"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Remove Missing"
-msgstr "刪除點"
+msgstr "刪除遺失"
#: editor/project_manager.cpp
msgid "Templates"
-msgstr ""
+msgstr "樣板"
#: editor/project_manager.cpp
msgid "Restart Now"
-msgstr ""
+msgstr "立即重新啟動"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't run project"
-msgstr "連接..."
+msgstr "無法執行專案"
#: editor/project_manager.cpp
msgid ""
"You currently don't have any projects.\n"
"Would you like to explore official example projects in the Asset Library?"
msgstr ""
+"目前沒有任何專案。\n"
+"要在素材庫中瀏覽官方範例專案嗎?"
+
+#: editor/project_manager.cpp
+msgid ""
+"The search box filters projects by name and last path component.\n"
+"To filter projects by name and full path, the query must contain at least "
+"one `/` character."
+msgstr ""
+"搜尋框可以用來依據名稱與路徑中的最後一部分來篩選專案。\n"
+"若要以名稱與完整路徑來過濾專案,搜尋內容應至少包含一個「/」字元。"
#: editor/project_settings_editor.cpp
msgid "Key "
-msgstr ""
+msgstr "按鍵 "
#: editor/project_settings_editor.cpp
msgid "Joy Button"
-msgstr ""
+msgstr "控制器按鈕"
#: editor/project_settings_editor.cpp
msgid "Joy Axis"
-msgstr ""
+msgstr "控制器類比軸"
#: editor/project_settings_editor.cpp
msgid "Mouse Button"
-msgstr ""
+msgstr "滑鼠按鈕"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
-msgstr ""
+msgstr "無效的操作名稱。名稱不可留空或包含 “/”, “:”, “=”, “\\” 或 “\"”"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "An action with the name '%s' already exists."
-msgstr "Autoload「%s」已經存在!"
+msgstr "已有名稱「%s」的操作。"
#: editor/project_settings_editor.cpp
msgid "Rename Input Action Event"
-msgstr ""
+msgstr "重新命名輸入操作事件"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "改變字典 value"
+msgstr "修改操作盲區"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
-msgstr ""
+msgstr "新增輸入操作事件"
#: editor/project_settings_editor.cpp
msgid "All Devices"
-msgstr ""
+msgstr "所有裝置"
#: editor/project_settings_editor.cpp
msgid "Device"
-msgstr ""
+msgstr "裝置"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Press a Key..."
-msgstr ""
+msgstr "請按下按鍵..."
#: editor/project_settings_editor.cpp
msgid "Mouse Button Index:"
-msgstr ""
+msgstr "滑鼠按鍵索引:"
#: editor/project_settings_editor.cpp
msgid "Left Button"
-msgstr ""
+msgstr "左鍵"
#: editor/project_settings_editor.cpp
msgid "Right Button"
-msgstr ""
+msgstr "右鍵"
#: editor/project_settings_editor.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "中鍵"
#: editor/project_settings_editor.cpp
msgid "Wheel Up Button"
-msgstr ""
+msgstr "滾輪向上按鍵"
#: editor/project_settings_editor.cpp
msgid "Wheel Down Button"
-msgstr ""
+msgstr "滾輪向下按鍵"
#: editor/project_settings_editor.cpp
msgid "Wheel Left Button"
-msgstr ""
+msgstr "滾輪向左按鍵"
#: editor/project_settings_editor.cpp
msgid "Wheel Right Button"
-msgstr ""
+msgstr "滾輪向右按鍵"
#: editor/project_settings_editor.cpp
msgid "X Button 1"
-msgstr ""
+msgstr "X 按鍵 1"
#: editor/project_settings_editor.cpp
msgid "X Button 2"
-msgstr ""
+msgstr "X 按鍵 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
-msgstr ""
+msgstr "控制器類比搖桿索引:"
#: editor/project_settings_editor.cpp
msgid "Axis"
-msgstr ""
+msgstr "類比軸"
#: editor/project_settings_editor.cpp
msgid "Joypad Button Index:"
-msgstr ""
+msgstr "控制器按鈕索引:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Erase Input Action"
-msgstr "所有的選擇"
+msgstr "清除輸入操作"
#: editor/project_settings_editor.cpp
msgid "Erase Input Action Event"
-msgstr ""
+msgstr "清除輸入操作事件"
#: editor/project_settings_editor.cpp
msgid "Add Event"
-msgstr ""
+msgstr "新增事件"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr ""
+msgstr "按鈕"
#: editor/project_settings_editor.cpp
msgid "Left Button."
-msgstr ""
+msgstr "左鍵。"
#: editor/project_settings_editor.cpp
msgid "Right Button."
-msgstr ""
+msgstr "右鍵。"
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr ""
+msgstr "中鍵。"
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
-msgstr ""
+msgstr "滾輪向上。"
#: editor/project_settings_editor.cpp
msgid "Wheel Down."
-msgstr ""
+msgstr "滾輪向下。"
#: editor/project_settings_editor.cpp
msgid "Add Global Property"
-msgstr ""
+msgstr "新增全域屬性"
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
-msgstr ""
+msgstr "請先選擇一個設定項目!"
#: editor/project_settings_editor.cpp
msgid "No property '%s' exists."
-msgstr ""
+msgstr "屬性「%s」不存在。"
#: editor/project_settings_editor.cpp
msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr ""
+msgstr "「%s」為內部設定,無法刪除。"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Delete Item"
-msgstr "刪除"
+msgstr "刪除項目"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
-msgstr ""
+msgstr "無效的操作名稱。名稱不可留空或包含 “/”, “:”, “=”, “\\” 或 “\"”。"
#: editor/project_settings_editor.cpp
msgid "Add Input Action"
-msgstr ""
+msgstr "新增輸入操作"
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
-msgstr ""
+msgstr "保存設定時發生錯誤。"
#: editor/project_settings_editor.cpp
msgid "Settings saved OK."
-msgstr ""
+msgstr "設定保存成功。"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Moved Input Action Event"
-msgstr "所有的選擇"
+msgstr "移動輸入操作事件"
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
-msgstr ""
+msgstr "複寫功能"
#: editor/project_settings_editor.cpp
msgid "Add Translation"
-msgstr ""
+msgstr "新增翻譯"
#: editor/project_settings_editor.cpp
msgid "Remove Translation"
-msgstr ""
+msgstr "移除翻譯"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
-msgstr ""
+msgstr "新增重映射路徑"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr ""
+msgstr "資源重映射新增重映射"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
-msgstr ""
+msgstr "更改資源重映射語言"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap"
-msgstr ""
+msgstr "移除資源重映射"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap Option"
-msgstr ""
+msgstr "移除資源重映射選項"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Changed Locale Filter"
-msgstr "變更鏡頭尺寸"
+msgstr "更改地區設定篩選條件"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter Mode"
-msgstr ""
+msgstr "更改地區設定篩選模式"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Project Settings (project.godot)"
-msgstr "專案設定"
+msgstr "專案設定 (project.godot)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
@@ -10387,907 +10030,906 @@ msgstr "一般"
#: editor/project_settings_editor.cpp
msgid "Override For..."
-msgstr ""
+msgstr "複寫..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
-msgstr ""
+msgstr "必須重新啟動編輯器才會使改動生效。"
#: editor/project_settings_editor.cpp
msgid "Input Map"
-msgstr ""
+msgstr "輸入映射"
#: editor/project_settings_editor.cpp
msgid "Action:"
-msgstr ""
+msgstr "操作:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "所有的選擇"
+msgstr "操作"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "盲區"
#: editor/project_settings_editor.cpp
msgid "Device:"
-msgstr ""
+msgstr "設備:"
#: editor/project_settings_editor.cpp
msgid "Index:"
-msgstr ""
+msgstr "索引:"
#: editor/project_settings_editor.cpp
msgid "Localization"
-msgstr ""
+msgstr "本地化"
#: editor/project_settings_editor.cpp
msgid "Translations"
-msgstr ""
+msgstr "翻譯"
#: editor/project_settings_editor.cpp
msgid "Translations:"
-msgstr ""
+msgstr "翻譯:"
#: editor/project_settings_editor.cpp
msgid "Remaps"
-msgstr ""
+msgstr "重映射"
#: editor/project_settings_editor.cpp
msgid "Resources:"
-msgstr ""
+msgstr "資源:"
#: editor/project_settings_editor.cpp
msgid "Remaps by Locale:"
-msgstr ""
+msgstr "依地區設定重映射:"
#: editor/project_settings_editor.cpp
msgid "Locale"
-msgstr ""
+msgstr "地區"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
-msgstr ""
+msgstr "地區篩選條件"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
-msgstr "顯示骨骼"
+msgstr "顯示所有地區"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
-msgstr "僅選擇區域"
+msgstr "僅顯示選定的地區"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Filter mode:"
-msgstr "過濾檔案..."
+msgstr "篩選模式:"
#: editor/project_settings_editor.cpp
msgid "Locales:"
-msgstr ""
+msgstr "地區:"
#: editor/project_settings_editor.cpp
msgid "AutoLoad"
-msgstr ""
+msgstr "Autoload"
#: editor/project_settings_editor.cpp
msgid "Plugins"
-msgstr "挿件"
+msgstr "外掛"
#: editor/property_editor.cpp
msgid "Preset..."
-msgstr "預設。。。"
+msgstr "預設設定..."
#: editor/property_editor.cpp
msgid "Zero"
-msgstr ""
+msgstr "無"
#: editor/property_editor.cpp
msgid "Easing In-Out"
-msgstr ""
+msgstr "緩入緩出"
#: editor/property_editor.cpp
msgid "Easing Out-In"
-msgstr ""
+msgstr "緩出緩入"
#: editor/property_editor.cpp
msgid "File..."
-msgstr ""
+msgstr "檔案..."
#: editor/property_editor.cpp
msgid "Dir..."
-msgstr ""
+msgstr "資料夾..."
#: editor/property_editor.cpp
msgid "Assign"
-msgstr ""
+msgstr "指派"
#: editor/property_editor.cpp
msgid "Select Node"
-msgstr ""
+msgstr "選擇節點"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
-msgstr ""
+msgstr "載入檔案時發生錯誤:非資源!"
#: editor/property_editor.cpp
msgid "Pick a Node"
-msgstr ""
+msgstr "選擇一個節點"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
-msgstr ""
+msgstr "位元 %d,值 %d。"
#: editor/property_selector.cpp
msgid "Select Property"
-msgstr ""
+msgstr "選擇屬性"
#: editor/property_selector.cpp
msgid "Select Virtual Method"
-msgstr ""
+msgstr "選擇虛擬方法"
#: editor/property_selector.cpp
msgid "Select Method"
-msgstr ""
+msgstr "選擇方法"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "符合大小寫"
+msgstr "批次重新命名"
#: editor/rename_dialog.cpp
-msgid "Prefix"
-msgstr ""
+#, fuzzy
+msgid "Replace:"
+msgstr "取代: "
#: editor/rename_dialog.cpp
-msgid "Suffix"
-msgstr ""
+#, fuzzy
+msgid "Prefix:"
+msgstr "前置"
#: editor/rename_dialog.cpp
#, fuzzy
+msgid "Suffix:"
+msgstr "後置"
+
+#: editor/rename_dialog.cpp
+msgid "Use Regular Expressions"
+msgstr "使用正規表示式"
+
+#: editor/rename_dialog.cpp
msgid "Advanced Options"
-msgstr "吸附選項"
+msgstr "進階選項"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "取代"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "節點名稱:"
+msgstr "節點名稱"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "節點的母級節點名(若有的話)"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "節點名稱:"
+msgstr "節點型別"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "目前的場景尚未存檔, 依然要開啟嗎?"
+msgstr "目前場景名稱"
#: editor/rename_dialog.cpp
msgid "Root node name"
-msgstr ""
+msgstr "根節點名稱"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"序列整數計數器。\n"
+"比較計數器選項。"
#: editor/rename_dialog.cpp
-msgid "Per Level counter"
-msgstr ""
+msgid "Per-level Counter"
+msgstr "各級別分別計數器"
#: editor/rename_dialog.cpp
-msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+#, fuzzy
+msgid "If set, the counter restarts for each group of child nodes."
+msgstr "若啟用則計數器將依據每組子節點重新啟動"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "計數器起始值"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "步驟 :"
+msgstr "步長"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "各節點的計數器的增加量"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "填充"
#: editor/rename_dialog.cpp
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
-
-#: editor/rename_dialog.cpp
-msgid "Regular Expressions"
-msgstr ""
+"計數器的最小位數。\n"
+"缺少的位數會以前置 0 填充。"
#: editor/rename_dialog.cpp
msgid "Post-Process"
-msgstr ""
+msgstr "後處理"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr ""
+msgstr "保持"
#: editor/rename_dialog.cpp
-msgid "CamelCase to under_scored"
-msgstr ""
+msgid "PascalCase to snake_case"
+msgstr "將大駝峰法 (PascalCase) 轉為底線 (snake_case)"
#: editor/rename_dialog.cpp
-msgid "under_scored to CamelCase"
-msgstr ""
+msgid "snake_case to PascalCase"
+msgstr "將底線 (snake_case) 轉為駝峰法 (PascalCase)"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "大小寫"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "轉換成..."
+msgstr "轉為小寫"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "轉換成..."
+msgstr "轉為大寫"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "重設縮放大小"
+msgstr "重設"
+
+#: editor/rename_dialog.cpp
+#, fuzzy
+msgid "Regular Expression Error:"
+msgstr "正規表示式錯誤"
+
+#: editor/rename_dialog.cpp
+msgid "At character %s"
+msgstr "位於字元 %s"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
-msgstr ""
+msgstr "重設母節點"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
-msgstr ""
+msgstr "重設母位置(選擇新的母節點):"
#: editor/reparent_dialog.cpp
msgid "Keep Global Transform"
-msgstr ""
+msgstr "保持全域變換"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent"
-msgstr ""
+msgstr "重設母節點"
#: editor/run_settings_dialog.cpp
msgid "Run Mode:"
-msgstr ""
+msgstr "執行模式:"
#: editor/run_settings_dialog.cpp
msgid "Current Scene"
-msgstr ""
+msgstr "目前場景"
#: editor/run_settings_dialog.cpp
msgid "Main Scene"
-msgstr ""
+msgstr "主場景"
#: editor/run_settings_dialog.cpp
msgid "Main Scene Arguments:"
-msgstr ""
+msgstr "主場景引數:"
#: editor/run_settings_dialog.cpp
msgid "Scene Run Settings"
-msgstr ""
+msgstr "場景執行設定"
#: editor/scene_tree_dock.cpp
msgid "No parent to instance the scenes at."
-msgstr ""
+msgstr "無可實體化場景的母節點。"
#: editor/scene_tree_dock.cpp
msgid "Error loading scene from %s"
-msgstr ""
+msgstr "自 %s 中載入場景時發生錯誤"
#: editor/scene_tree_dock.cpp
msgid ""
"Cannot instance the scene '%s' because the current scene exists within one "
"of its nodes."
-msgstr ""
+msgstr "無法實體化場景「%s」,由於其已存在於其一子節點中。"
#: editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
-msgstr ""
+msgstr "實體化場景"
#: editor/scene_tree_dock.cpp
msgid "Replace with Branch Scene"
-msgstr ""
+msgstr "取代分支場景"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
-msgstr ""
+msgstr "實體化子場景"
#: editor/scene_tree_dock.cpp
-msgid "Clear Script"
-msgstr ""
+msgid "Detach Script"
+msgstr "取消附加腳本"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
-msgstr ""
+msgstr "此操作無法在樹狀根節點執行。"
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
-msgstr ""
+msgstr "移動節點至其母節點"
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr ""
+msgstr "移動節點至母節點"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr ""
+msgstr "重複節點"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
-msgstr ""
+msgstr "無法重新設定繼承場景節點的母節點,節點的順序無法更改。"
#: editor/scene_tree_dock.cpp
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "節點必須屬於已編輯的場景才能轉為根節點。"
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "實體化的場景無法轉為根節點"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make node as Root"
-msgstr "儲存場景"
+msgstr "將節點設為根節點"
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete %d nodes and any children?"
+msgstr "確定要刪除節點「%s」與其子節點嗎?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete %d nodes?"
-msgstr "刪除"
+msgstr "刪除 %d 個節點?"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
-msgstr ""
+msgstr "確定要刪除根節點「%s」嗎?"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "確定要刪除節點「%s」與其子節點嗎?"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete node \"%s\"?"
-msgstr "刪除"
+msgstr "確定要刪除節點「%s」嗎?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
-msgstr ""
+msgstr "無法在根節點執行此操作。"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
-msgstr ""
+msgstr "該操作無法在已實體化場景中執行。"
#: editor/scene_tree_dock.cpp
msgid "Save New Scene As..."
-msgstr ""
+msgstr "另存新場景為..."
#: editor/scene_tree_dock.cpp
msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
-msgstr ""
+msgstr "禁用「editable_instance」將導致節點的所有屬性都被還原為其預設值。"
#: editor/scene_tree_dock.cpp
msgid ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
+"啟用「載入為佔位」將禁用「可編輯子節點」並導致其所有節點都被還原為其預設值。"
#: editor/scene_tree_dock.cpp
msgid "Make Local"
-msgstr ""
+msgstr "轉為本地"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "儲存場景"
+msgstr "新場景根"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "新增資料夾"
+msgstr "建立根節點:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "場景"
+msgstr "2D 場景"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "場景"
+msgstr "3D 場景"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
-msgstr ""
+msgstr "使用者界面"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Other Node"
-msgstr "刪除"
+msgstr "其他節點"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
-msgstr ""
+msgstr "無法對外部場景的節點進行操作!"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
-msgstr ""
+msgstr "無法對目前場景繼承來源的節點進行操作!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr ""
+msgstr "附加腳本"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
-msgstr ""
+msgstr "移除節點"
#: editor/scene_tree_dock.cpp
msgid "Change type of node(s)"
-msgstr ""
+msgstr "更改節點的型別"
#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
-msgstr ""
+msgstr "無法保存新場景。可能是由於無法滿足其依賴性(實體)。"
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
-msgstr ""
+msgstr "保存場景時發生錯誤。"
#: editor/scene_tree_dock.cpp
msgid "Error duplicating scene to save it."
-msgstr ""
+msgstr "複製場景以進行保存時發生錯誤。"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Sub-Resources"
-msgstr "複製資源"
+msgstr "子資源"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance"
-msgstr ""
+msgstr "清除繼承"
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
-msgstr ""
+msgstr "可編輯子節點"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
-msgstr ""
+msgstr "載入為佔位"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open Documentation"
-msgstr "開啟最近存取"
+msgstr "開啟說明文件"
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
+msgid ""
+"Cannot attach a script: there are no languages registered.\n"
+"This is probably because this editor was built with all language modules "
+"disabled."
msgstr ""
+"無法附加腳本:未註冊任何語言。\n"
+"可能是由於編輯器在建構時未啟用任何語言模組。"
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr "新增子節點"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Expand/Collapse All"
-msgstr "取代全部"
+msgstr "展開/收合全部"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
-msgstr ""
+msgstr "更改型別"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Reparent to New Node"
-msgstr "新增 %s"
+msgstr "重新設定母節點為新節點"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "儲存場景"
+msgstr "設為場景根節點"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
-msgstr ""
+msgstr "合併自場景"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Save Branch as Scene"
-msgstr ""
+msgstr "保存分支為場景"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr ""
+msgstr "複製節點路徑"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
-msgstr ""
+msgstr "刪除(無確認)"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Add/Create a New Node."
-msgstr "新增 %s"
+msgstr "新增/建立新節點。"
#: editor/scene_tree_dock.cpp
msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
-msgstr ""
+msgstr "將場景檔案實體化為節點。若無根節點則建立一個繼承場景。"
#: editor/scene_tree_dock.cpp
-msgid "Attach a new or existing script for the selected node."
-msgstr ""
+msgid "Attach a new or existing script to the selected node."
+msgstr "附加新的或已存在之腳本至所選節點。"
#: editor/scene_tree_dock.cpp
-msgid "Clear a script for the selected node."
-msgstr ""
+msgid "Detach the script from the selected node."
+msgstr "自所選節點取消附加腳本。"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Remote"
-msgstr "移除"
+msgstr "遠端"
#: editor/scene_tree_dock.cpp
msgid "Local"
-msgstr ""
+msgstr "本機"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance? (No Undo!)"
-msgstr ""
+msgstr "確定要清除繼承嗎?(無法復原!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "切換顯示隱藏檔案"
+msgstr "切換可見/隱藏"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Unlock Node"
-msgstr "單項節點"
+msgstr "解鎖節點"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Button Group"
-msgstr "添加到組"
+msgstr "按鍵分組"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "(Connecting From)"
-msgstr "連接..."
+msgstr "(連接自)"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
-msgstr ""
+msgstr "節點組態設定警告:"
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
+"節點有 %s 連接與 %s 分組。\n"
+"點擊以顯示訊號 Dock。"
#: editor/scene_tree_editor.cpp
msgid ""
"Node has %s connection(s).\n"
"Click to show signals dock."
msgstr ""
+"節點有 %s 連接。\n"
+"點擊以顯示訊號 Dock。"
#: editor/scene_tree_editor.cpp
msgid ""
"Node is in %s group(s).\n"
"Click to show groups dock."
msgstr ""
+"節點位於 %s 個群組中。\n"
+"點擊以顯示群組 Dock。"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Open Script:"
-msgstr "開啟最近存取"
+msgstr "開啟腳本:"
#: editor/scene_tree_editor.cpp
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
+"節點已鎖定。\n"
+"點擊以解鎖。"
#: editor/scene_tree_editor.cpp
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
+"子節點不可選擇。\n"
+"點擊以令其可被選擇。"
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
-msgstr ""
+msgstr "切換可見/隱藏"
#: editor/scene_tree_editor.cpp
msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"已固定 AnimationPlayer。\n"
+"點擊以取消固定。"
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
-msgstr ""
+msgstr "無效的節點名稱,名稱不可包含下列字元:"
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
-msgstr ""
+msgstr "重新命名節點"
#: editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
-msgstr "場景樹 (節點):"
+msgstr "場景樹(節點):"
#: editor/scene_tree_editor.cpp
msgid "Node Configuration Warning!"
-msgstr ""
+msgstr "節點組態設定警告!"
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
-msgstr ""
+msgstr "選擇一個節點"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Path is empty."
-msgstr "網格是空的!"
+msgstr "路徑為空。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty."
-msgstr "Sprite 是空的!"
+msgstr "檔案名稱為空。"
#: editor/script_create_dialog.cpp
msgid "Path is not local."
-msgstr ""
+msgstr "路徑不在本機。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid base path."
-msgstr "無效的路徑."
+msgstr "無效的基礎路徑。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "A directory with the same name exists."
-msgstr "具有此名稱的檔或資料夾已存在。"
+msgstr "已有資料夾具有相同名稱。"
+
+#: editor/script_create_dialog.cpp
+msgid "File does not exist."
+msgstr "檔案不存在。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid extension."
-msgstr "必須使用有效的副檔名。"
+msgstr "無效的副檔名。"
#: editor/script_create_dialog.cpp
msgid "Wrong extension chosen."
-msgstr ""
+msgstr "選擇了錯誤的副檔名。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error loading template '%s'"
-msgstr "載入場景時發生錯誤"
+msgstr "載入樣板「%s」時發生錯誤"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error - Could not create script in filesystem."
-msgstr "無法新增資料夾"
+msgstr "錯誤 - 無法在檔案系統中建立腳本。"
#: editor/script_create_dialog.cpp
msgid "Error loading script from %s"
-msgstr ""
+msgstr "自 %s 載入腳本時發生錯誤"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Overrides"
-msgstr "覆蓋"
+msgstr "複寫"
#: editor/script_create_dialog.cpp
msgid "N/A"
-msgstr ""
+msgstr "N/A"
#: editor/script_create_dialog.cpp
msgid "Open Script / Choose Location"
-msgstr ""
+msgstr "開啟腳本/選擇位置"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
-msgstr "開啟最近存取"
+msgstr "開啟腳本"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, it will be reused."
-msgstr "檔案已經存在, 要覆寫嗎?"
+msgstr "檔案已存在,將被重複使用。"
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid path."
+msgstr "無效的路徑。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid class name."
-msgstr "不能使用的名稱。"
+msgstr "無效的類型名稱。"
#: editor/script_create_dialog.cpp
msgid "Invalid inherited parent name or path."
-msgstr ""
+msgstr "繼承母的名稱或路徑無效。"
#: editor/script_create_dialog.cpp
-#, fuzzy
-msgid "Script is valid."
-msgstr "動畫樹有效。"
+msgid "Script path/name is valid."
+msgstr "可用的腳本路徑/名稱。"
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
-msgstr ""
+msgstr "可使用:a-z, A-Z, 0-9, _ 以及 ."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in script (into scene file)."
-msgstr "操作場景文件。"
+msgstr "內建腳本(到場景檔案中)。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will create a new script file."
-msgstr "創建新矩形。"
+msgstr "將建立一個新的腳本檔案。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Will load an existing script file."
-msgstr "讀取現存的 Bus 配置。"
+msgstr "將讀取一個現存的腳本檔案。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script file already exists."
-msgstr "Autoload「%s」已經存在!"
+msgstr "腳本檔案已存在。"
+
+#: editor/script_create_dialog.cpp
+msgid ""
+"Note: Built-in scripts have some limitations and can't be edited using an "
+"external editor."
+msgstr "注意:內建腳本有些限制,且無法使用外部編輯器來編輯。"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name:"
-msgstr "Class:"
+msgstr "類別名稱:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template:"
-msgstr "移除範本"
+msgstr "樣板:"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Built-in Script:"
-msgstr "開啟最近存取"
+msgstr "內建腳本:"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
-msgstr ""
+msgstr "附加節點腳本"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Remote "
-msgstr "移除"
+msgstr "遠端 "
#: editor/script_editor_debugger.cpp
msgid "Bytes:"
-msgstr ""
+msgstr "位元組:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Warning:"
-msgstr "警告"
+msgstr "警告:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Error:"
-msgstr "錯誤!"
+msgstr "錯誤:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error"
-msgstr "連接..."
+msgstr "C++ 錯誤"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Error:"
-msgstr "連接..."
+msgstr "C++ 錯誤:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source"
-msgstr "資源"
+msgstr "C++ 原始檔"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Source:"
-msgstr "資源"
+msgstr "原始檔:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "C++ Source:"
-msgstr "資源"
+msgstr "C++ 原始檔:"
#: editor/script_editor_debugger.cpp
msgid "Stack Trace"
-msgstr ""
+msgstr "堆疊回溯"
#: editor/script_editor_debugger.cpp
msgid "Errors"
-msgstr ""
+msgstr "錯誤"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Child process connected."
-msgstr "斷線"
+msgstr "已連線至子處理程序。"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Copy Error"
-msgstr "連接..."
+msgstr "複製錯誤"
+
+#: editor/script_editor_debugger.cpp
+msgid "Video RAM"
+msgstr "視訊記憶體"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Skip Breakpoints"
-msgstr "刪除"
+msgstr "跳過中斷點"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
-msgstr ""
+msgstr "偵查前一個實體"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
-msgstr ""
+msgstr "偵查下一個實體"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
-msgstr ""
+msgstr "堆疊框"
#: editor/script_editor_debugger.cpp
msgid "Profiler"
-msgstr ""
+msgstr "分析工具"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Network Profiler"
-msgstr "輸出專案"
+msgstr "網路分析工具"
#: editor/script_editor_debugger.cpp
msgid "Monitor"
-msgstr ""
+msgstr "檢視程式"
#: editor/script_editor_debugger.cpp
msgid "Value"
msgstr "數值"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Monitors"
-msgstr "監看畫面"
+msgstr "監視器"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
-msgstr ""
+msgstr "在子列表中選擇一個或多個項目以顯示圖表。"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "List of Video Memory Usage by Resource:"
-msgstr "影片記憶體使用容量列表(依資源別):"
+msgstr "依據資源列出視訊記憶體佔用:"
#: editor/script_editor_debugger.cpp
msgid "Total:"
msgstr "總計:"
#: editor/script_editor_debugger.cpp
-msgid "Video Mem"
-msgstr "影片記憶體"
+msgid "Export list to a CSV file"
+msgstr "匯出列表至 CSV 檔案"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11295,11 +10937,11 @@ msgstr "資源路徑"
#: editor/script_editor_debugger.cpp
msgid "Type"
-msgstr "類型"
+msgstr "型別"
#: editor/script_editor_debugger.cpp
msgid "Format"
-msgstr ""
+msgstr "格式"
#: editor/script_editor_debugger.cpp
msgid "Usage"
@@ -11310,41 +10952,36 @@ msgid "Misc"
msgstr "雜項"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Clicked Control:"
-msgstr "點擊控制:"
+msgstr "已點擊的 Control:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Clicked Control Type:"
-msgstr "點擊控制類型:"
+msgstr "已點擊的 Control 型別:"
#: editor/script_editor_debugger.cpp
msgid "Live Edit Root:"
-msgstr ""
+msgstr "即時編輯根節點:"
#: editor/script_editor_debugger.cpp
msgid "Set From Tree"
-msgstr ""
+msgstr "自場景樹中設定"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "匯出測量資料為 CSV"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Erase Shortcut"
-msgstr "捷徑"
+msgstr "清除快捷鍵"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Restore Shortcut"
-msgstr "捷徑"
+msgstr "重設快捷鍵"
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Change Shortcut"
-msgstr "捷徑"
+msgstr "更改快捷鍵"
#: editor/settings_config_dialog.cpp
msgid "Editor Settings"
@@ -11352,892 +10989,879 @@ msgstr "編輯器設定"
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
-msgstr "捷徑"
+msgstr "快捷鍵"
#: editor/settings_config_dialog.cpp
msgid "Binding"
-msgstr ""
+msgstr "綁定"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Light Radius"
-msgstr "變更光源半徑"
+msgstr "更改光照半徑"
#: editor/spatial_editor_gizmos.cpp
msgid "Change AudioStreamPlayer3D Emission Angle"
-msgstr ""
+msgstr "更改 AudioStreamPlayer3D 發射角"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
-msgstr "變更鏡頭視野(FOV)"
+msgstr "更改相機視角"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera Size"
-msgstr "變更鏡頭尺寸"
+msgstr "更改相機尺寸"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Notifier AABB"
-msgstr ""
+msgstr "更改通知器 AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
-msgstr ""
+msgstr "更改粒子 AABB"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Probe Extents"
-msgstr "變更框型範圍"
+msgstr "更改探查範圍"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Sphere Shape Radius"
-msgstr "變更球型半徑"
+msgstr "更改球形半徑"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
-msgstr "變更框型範圍"
+msgstr "更改框形範圍"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr "變更楕圓體半徑"
+msgstr "更改楕圓形半徑"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr "變更楕圓體高度"
+msgstr "更改楕圓形高度"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "變更楕圓體半徑"
+msgstr "更改圓柱形半徑"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "變更楕圓體高度"
+msgstr "更改圓柱形高度"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
-msgstr ""
+msgstr "更改射線形長度"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "變更光源半徑"
+msgstr "更改圓柱體半徑"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "變更楕圓體高度"
+msgstr "更改圓柱體高度"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "變更球型半徑"
+msgstr "更改環面內半徑"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "變更光源半徑"
+msgstr "更改環面外半徑"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
-msgstr ""
+msgstr "選擇該項目使用的動態函式庫"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select dependencies of the library for this entry"
-msgstr ""
+msgstr "選擇該項目的函式庫相依性"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "移除"
+msgstr "移除目前的項目"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "點兩下以建立新項目"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
-msgstr ""
+msgstr "平台:"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform"
-msgstr ""
+msgstr "平台"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dynamic Library"
-msgstr ""
+msgstr "動態函式庫"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Add an architecture entry"
-msgstr ""
+msgstr "新增一個架構項目"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "GDNativeLibrary"
-msgstr ""
+msgstr "GDNative 函式庫"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Enabled GDNative Singleton"
-msgstr ""
+msgstr "啟用 GDNative 單例"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Disabled GDNative Singleton"
-msgstr "禁止自動更新"
+msgstr "禁用 GDNative 單例"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
-msgstr ""
+msgstr "函式庫"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
-msgstr ""
+msgstr "函式庫: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr ""
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Step argument is zero!"
-msgstr "step引數為0!"
+msgstr "Step 引數為 0!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
-msgstr "非為單一事件腳本"
+msgstr "腳本沒有實體"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Not based on a script"
-msgstr "未依據腳本"
+msgstr "非基於腳本"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Not based on a resource file"
-msgstr "未依據資源檔案"
+msgstr "非基於資源檔案"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Invalid instance dictionary format (missing @path)"
-msgstr "無效的事件詞典格式(遺失 @path)"
+msgstr "無效的實體字典格式(缺少 @path)"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Invalid instance dictionary format (can't load script at @path)"
-msgstr "無效的事件詞典格式(無法載入腳本 @path)"
+msgstr "無效的實體字典格式(無法自 @path 載入腳本)"
#: modules/gdscript/gdscript_functions.cpp
-#, fuzzy
msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr "無效的事件詞典格式(無效的腳本 @path)"
+msgstr "無效的實體字典格式(位於 @path 的腳本無效)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary (invalid subclasses)"
-msgstr ""
+msgstr "無效的實體字典(無效的子類型)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
-msgstr ""
+msgstr "物件無法提供長度。"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Next Plane"
-msgstr "下個分頁"
+msgstr "下一個平面"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Previous Plane"
-msgstr "上個分頁"
+msgstr "上一個平面"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Plane:"
-msgstr ""
+msgstr "平面:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Next Floor"
-msgstr ""
+msgstr "下一個地板"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Previous Floor"
-msgstr "上個分頁"
+msgstr "上一個地板"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Floor:"
-msgstr ""
+msgstr "地板:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Delete Selection"
-msgstr "複製所選"
+msgstr "網格地圖刪除所選範圍"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "複製所選"
+msgstr "網格地圖填充所選範圍"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paste Selection"
-msgstr "複製所選"
+msgstr "網格地圖貼上所選範圍"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Paint"
-msgstr "專案設定"
+msgstr "網格地圖繪圖"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Grid Map"
-msgstr ""
+msgstr "網格地圖"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Snap View"
-msgstr ""
+msgstr "吸附檢視"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clip Disabled"
-msgstr "已停用"
+msgstr "剪裁已禁用"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Above"
-msgstr ""
+msgstr "剪裁上方"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Below"
-msgstr ""
+msgstr "剪裁下方"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit X Axis"
-msgstr ""
+msgstr "編輯 X 軸"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Y Axis"
-msgstr ""
+msgstr "編輯 Y 軸"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Z Axis"
-msgstr ""
+msgstr "編輯 Z 軸"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate X"
-msgstr ""
+msgstr "以遊標沿 X 軸旋轉"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Y"
-msgstr ""
+msgstr "以遊標沿 Y 軸旋轉"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Z"
-msgstr ""
+msgstr "以遊標沿 Z 軸旋轉"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
-msgstr ""
+msgstr "以遊標沿 X 軸反向旋轉"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Y"
-msgstr ""
+msgstr "以遊標沿 Y 軸反向旋轉"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Z"
-msgstr ""
+msgstr "以遊標沿 Z 軸反向旋轉"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Clear Rotation"
-msgstr ""
+msgstr "清除遊標旋轉"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Paste Selects"
-msgstr "擦除選中"
+msgstr "貼上所選"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Selection"
-msgstr "所有的選擇"
+msgstr "清除所選"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "所有的選擇"
+msgstr "填充所選"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Settings"
-msgstr "專案設定"
+msgstr "網格地圖設定"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Pick Distance:"
-msgstr ""
+msgstr "選擇距離:"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Filter meshes"
-msgstr "過濾檔案..."
+msgstr "篩選網格"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
-msgstr ""
+msgstr "提供 MeshLibrary 予該 GridMap 以使用其網格。"
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
-msgstr ""
+msgstr "類別名稱不能為保留關鍵字"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
-msgstr ""
+msgstr "內部異常堆疊回溯結束"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr "渲染NavMesh"
+msgstr "製作 NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
-msgstr ""
+msgstr "清除導航網格 (Navigation Mesh)。"
#: modules/recast/navigation_mesh_generator.cpp
msgid "Setting up Configuration..."
-msgstr ""
+msgstr "正在設定組態..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Calculating grid size..."
-msgstr ""
+msgstr "正在計算網格大小..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Creating heightfield..."
-msgstr ""
+msgstr "正在建立 Heightfield..."
#: modules/recast/navigation_mesh_generator.cpp
-#, fuzzy
msgid "Marking walkable triangles..."
-msgstr "正在儲存變更..."
+msgstr "正在標記可移動的三角形..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Constructing compact heightfield..."
-msgstr ""
+msgstr "正在建構緊湊 Heightfield..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Eroding walkable area..."
-msgstr ""
+msgstr "正在建立可移動區域..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Partitioning..."
-msgstr ""
+msgstr "正在分割..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Creating contours..."
-msgstr ""
+msgstr "正在建立輪廓..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Creating polymesh..."
-msgstr ""
+msgstr "正在建立多邊形網格 (Polymesh)..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Converting to native navigation mesh..."
-msgstr ""
+msgstr "正在轉換為原生導航網格 (Native Navigation Mesh)..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Navigation Mesh Generator Setup:"
-msgstr ""
+msgstr "導航網格 (Navigation Mesh) 產生器設定:"
#: modules/recast/navigation_mesh_generator.cpp
msgid "Parsing Geometry..."
-msgstr ""
+msgstr "正在解析多邊形..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Done!"
-msgstr ""
+msgstr "完成!"
#: modules/visual_script/visual_script.cpp
msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
-msgstr ""
+msgstr "節點在無工作記憶體的情況下被產生。請閱讀說明文件以瞭解如何正確產生!"
#: modules/visual_script/visual_script.cpp
msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
-msgstr ""
+msgstr "已產生節點,但未在最初的工作記憶體內回傳函式狀態。"
#: modules/visual_script/visual_script.cpp
-#, fuzzy
msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
-msgstr "回傳值需被指定為運算記憶體節點的第一要素!請修正該節點。"
+msgstr "回傳值需被指定為運算記憶體節點的第一個元素!請修正該節點。"
#: modules/visual_script/visual_script.cpp
-#, fuzzy
msgid "Node returned an invalid sequence output: "
-msgstr "節點回傳一個無效的連續輸出: "
+msgstr "節點回傳了一個無效的連續輸出: "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
-msgstr ""
+msgstr "發現了連續位元 (Sequance Bit) 但並非在堆疊中的節點,請回報該錯誤!"
#: modules/visual_script/visual_script.cpp
msgid "Stack overflow with stack depth: "
-msgstr ""
+msgstr "堆疊深度的堆疊溢出: "
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Signal Arguments"
-msgstr ""
+msgstr "更改訊號引數"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument Type"
-msgstr ""
+msgstr "更改引數型別"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument name"
-msgstr ""
+msgstr "更改引數名稱"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr ""
+msgstr "設定變數預設值"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
-msgstr ""
+msgstr "設定變數型別"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Input Port"
-msgstr "添加輸入"
+msgstr "新增輸入埠口"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Output Port"
-msgstr "添加輸入"
+msgstr "新增輸出埠口"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Override an existing built-in function."
-msgstr "無效名稱.不能與現有的內置類型名稱沖突."
+msgstr "複寫一個現有的內建函式。"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new function."
-msgstr "創建新矩形。"
+msgstr "建立新函式。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Variables:"
-msgstr ""
+msgstr "變數:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new variable."
-msgstr "創建新矩形。"
+msgstr "建立新變數。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
-msgstr "訊號:"
+msgstr "訊號:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create a new signal."
-msgstr "創建新多邊形。"
+msgstr "建立一個新訊號。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
-msgstr ""
+msgstr "名稱並非有效識別符:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name already in use by another func/var/signal:"
-msgstr ""
+msgstr "名稱已被用於另一個函式/變數/信號:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Function"
-msgstr ""
+msgstr "重新命名函式"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Variable"
-msgstr ""
+msgstr "重新命名變數"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Signal"
-msgstr ""
+msgstr "重新命名訊號"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Function"
-msgstr ""
+msgstr "新增函式"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Delete input port"
-msgstr "刪除點"
+msgstr "刪除輸入埠口"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
-msgstr ""
+msgstr "新增變數"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Signal"
-msgstr ""
+msgstr "新增訊號"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Input Port"
-msgstr "刪除點"
+msgstr "移除輸入埠口"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Output Port"
-msgstr "刪除點"
+msgstr "移除輸出埠口"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
-msgstr ""
+msgstr "更改表示式"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr ""
+msgstr "更改視覺腳本 (VisualScript) 節點"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr ""
+msgstr "重複視覺腳本 (VisualScript) 節點"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
-msgstr ""
+msgstr "按住 %s 以拖移 Getter 節點。按住 Shift 以拖移通用簽章 (Signature)。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
+"按住 Ctrl 以拖移 Getter 節點。按住 Shift 以拖移通用通用簽章 (Signature)。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
-msgstr ""
+msgstr "按住 %s 以拖移一個簡單參照 (Simple Reference) 至該節點。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr ""
+msgstr "按住 Ctrl 以拖移一個簡單參照 (Simple Reference) 至該節點。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
-msgstr ""
+msgstr "按住 %s 以拖移一個變數 Setter 節點。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr ""
+msgstr "按住 Ctrl 以拖動一個變數 Setter 節點。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
-msgstr ""
+msgstr "新增預載 (Preload) 節點"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Node(s) From Tree"
-msgstr ""
+msgstr "自樹中新增節點"
#: modules/visual_script/visual_script_editor.cpp
msgid ""
"Can't drop properties because script '%s' is not used in this scene.\n"
"Drop holding 'Shift' to just copy the signature."
msgstr ""
+"由於「%s」未在該場景內使用,無法拖移屬性。\n"
+"按住「Shift」拖移以複製簽名 (Signature)。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
-msgstr ""
+msgstr "新增 Getter 屬性"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Setter Property"
-msgstr ""
+msgstr "新增 Setter 屬性"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type"
-msgstr "變更鏡頭尺寸"
+msgstr "更改基礎型別"
#: modules/visual_script/visual_script_editor.cpp
msgid "Move Node(s)"
-msgstr ""
+msgstr "移動節點"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
-msgstr ""
+msgstr "移除視覺腳本 (VisualScript) 節點"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Nodes"
-msgstr "連接..."
+msgstr "連接節點"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Disconnect Nodes"
-msgstr "連接..."
+msgstr "斷開節點連接"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "連接..."
+msgstr "連接節點資料"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "連接..."
+msgstr "連接節點序列"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
-msgstr ""
+msgstr "腳本已有函式「%s」"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Input Value"
-msgstr ""
+msgstr "更改輸入值"
#: modules/visual_script/visual_script_editor.cpp
msgid "Resize Comment"
-msgstr ""
+msgstr "調整註解尺寸"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr ""
+msgstr "無法複製函式節點。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
-msgstr ""
+msgstr "剪貼簿為空!"
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste VisualScript Nodes"
-msgstr ""
+msgstr "貼上視覺腳本 (VisualScript) 節點"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function with a function node."
-msgstr ""
+msgstr "無法通過函式節點建立函式。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't create function of nodes from nodes of multiple functions."
-msgstr ""
+msgstr "無法自多個函式節點建立函式節點。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select at least one node with sequence port."
-msgstr ""
+msgstr "選擇至少一個有序列埠口的節點。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Try to only have one sequence input in selection."
-msgstr ""
+msgstr "請只選擇一個序列輸入。"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Create Function"
-msgstr "創建輪廓"
+msgstr "建立函式"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
-msgstr ""
+msgstr "移除函式"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Variable"
-msgstr ""
+msgstr "移除變數"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Variable:"
-msgstr ""
+msgstr "編輯變數:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
-msgstr ""
+msgstr "移除訊號"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Signal:"
-msgstr ""
+msgstr "編輯訊號:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Tool:"
-msgstr ""
+msgstr "製作工具:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Members:"
-msgstr ""
+msgstr "成員:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Base Type:"
-msgstr "變更鏡頭尺寸"
+msgstr "更改基本型別:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Nodes..."
-msgstr "添加節點..。"
+msgstr "新增節點..."
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Function..."
-msgstr "轉到函數…"
+msgstr "新增函式…"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "function_name"
-msgstr "函數:"
+msgstr "function_name"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit its graph."
-msgstr ""
+msgstr "選擇或建立一個函式以編輯其圖表。"
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr ""
+msgstr "刪除所選"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
-msgstr ""
+msgstr "尋找節點型別"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr ""
+msgstr "複製節點"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr ""
+msgstr "剪下節點"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Make Function"
-msgstr "函數:"
+msgstr "產生函式"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Refresh Graph"
-msgstr "重新整理"
+msgstr "重新整理圖表"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "過濾檔案..."
+msgstr "編輯成員"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
-msgstr ""
+msgstr "輸入型別非可迭代型別: "
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid"
-msgstr ""
+msgstr "迭代器已不可用"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Iterator became invalid: "
-msgstr ""
+msgstr "迭代器已不可用: "
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name."
-msgstr ""
+msgstr "無效的索引屬性名稱。"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
-msgstr ""
+msgstr "基礎物件並非節點!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Path does not lead Node!"
-msgstr ""
+msgstr "路徑未指向節點!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
-msgstr ""
+msgstr "無效的索引屬性名稱「%s」,於節點「%s」。"
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
-msgstr ""
+msgstr ": 無效的引數型別: "
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid arguments: "
-msgstr ""
+msgstr ": 無效的引數: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableGet not found in script: "
-msgstr ""
+msgstr "腳本中未找到 VariableGet(取得變數): "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableSet not found in script: "
-msgstr ""
+msgstr "腳本中未找到 VariableSet(設定變數): "
#: modules/visual_script/visual_script_nodes.cpp
msgid "Custom node has no _step() method, can't process graph."
-msgstr ""
+msgstr "自定節點沒有 _step() 方法,無法產生圖表。"
#: modules/visual_script/visual_script_nodes.cpp
msgid ""
"Invalid return value from _step(), must be integer (seq out), or string "
"(error)."
-msgstr ""
+msgstr "_step() 的回傳值無效,必須為整數 (Seq Out) 或字串 (Error)。"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "搜尋幫助"
+msgstr "搜尋視覺腳本 (VisualScript)"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "取得 %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
-msgstr ""
+msgstr "設定 %s"
#: platform/android/export/export.cpp
msgid "Package name is missing."
-msgstr ""
+msgstr "缺少套件名稱。"
#: platform/android/export/export.cpp
msgid "Package segments must be of non-zero length."
-msgstr ""
+msgstr "套件片段 (Segment) 的長度不可為 0。"
#: platform/android/export/export.cpp
msgid "The character '%s' is not allowed in Android application package names."
-msgstr ""
+msgstr "Android 應用程式套件名稱不可使用字元「%s」。"
#: platform/android/export/export.cpp
msgid "A digit cannot be the first character in a package segment."
-msgstr ""
+msgstr "套件片段 (Segment) 的第一個字元不可為數字。"
#: platform/android/export/export.cpp
msgid "The character '%s' cannot be the first character in a package segment."
-msgstr ""
+msgstr "套件片段 (Segment) 的第一個字元不可為「%s」。"
#: platform/android/export/export.cpp
msgid "The package must have at least one '.' separator."
-msgstr ""
+msgstr "套件必須至少有一個「.」分隔字元。"
#: platform/android/export/export.cpp
msgid "Select device from the list"
-msgstr "從清單中選擇設備"
+msgstr "自清單中選擇裝置"
#: platform/android/export/export.cpp
msgid "ADB executable not configured in the Editor Settings."
-msgstr ""
+msgstr "尚未於編輯器設定中設定 ADB 可執行檔。"
#: platform/android/export/export.cpp
msgid "OpenJDK jarsigner not configured in the Editor Settings."
-msgstr ""
+msgstr "尚未於編輯器設定中設定 OpenJDK Jarsigner。"
#: platform/android/export/export.cpp
msgid "Debug keystore not configured in the Editor Settings nor in the preset."
-msgstr ""
+msgstr "尚未於編輯器設定或預設設定中設定金鑰儲存區 (Keystore)。"
+
+#: platform/android/export/export.cpp
+msgid "Release keystore incorrectly configured in the export preset."
+msgstr "發行金鑰儲存區中不正確之組態設定至匯出預設設定。"
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
-msgstr ""
+msgstr "自定建構需要有在編輯器設定中設定一個有效的 Android SDK 位置。"
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
-msgstr ""
+msgstr "編輯器設定中用於自定義設定之 Android SDK 路徑無效。"
#: platform/android/export/export.cpp
msgid ""
"Android build template not installed in the project. Install it from the "
"Project menu."
-msgstr ""
+msgstr "尚未於專案中安裝 Android 建構樣板。請先於專案目錄中進行安裝。"
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr ""
+msgstr "無效的 APK Expansion 公鑰。"
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Invalid package name:"
-msgstr "不能使用的名稱。"
+msgstr "無效的套件名稱:"
+
+#: platform/android/export/export.cpp
+msgid ""
+"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
+"project setting (changed in Godot 3.2.2).\n"
+msgstr ""
+"「andoird/modules」專案設定中包含了無效的「GodotPaymentV3」模組(更改於 "
+"Godot 3.2.2)。\n"
+
+#: platform/android/export/export.cpp
+msgid "\"Use Custom Build\" must be enabled to use the plugins."
+msgstr "「使用自定建構」必須啟用以使用本外掛。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
+"\"."
+msgstr ""
+"「Degrees Of Freedom」(自由角度)僅可在「Xr Mode」(XR 模式)設為「Oculus "
+"Mobile VR」時可用。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"「Hand Tracking」(手部追蹤)僅可在「Xr Mode」(XR 模式)設為「Oculus Mobile "
+"VR」時可用。"
+
+#: platform/android/export/export.cpp
+msgid ""
+"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
+msgstr ""
+"「Focus Awareness」(提高關注度)僅可在「Xr Mode」(XR 模式)設為「Oculus "
+"Mobile VR」時可用。"
#: platform/android/export/export.cpp
msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
+"嘗試自自定建構樣板進行建構,但無版本資訊可用。請自「專案」選單中重新安裝。"
#: platform/android/export/export.cpp
msgid ""
@@ -12246,155 +11870,150 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
+"Android 建構版本不符合:\n"
+" 已安裝的樣板:%s\n"
+" Godot 版本:%s\n"
+"請自「專案」目錄中重新安裝 Android 建構樣板。"
#: platform/android/export/export.cpp
msgid "Building Android Project (gradle)"
-msgstr ""
+msgstr "建構 Android 專案(Gradle)"
#: platform/android/export/export.cpp
msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
+"建構 Android 專案失敗,請檢查輸出以確認錯誤。\n"
+"也可以瀏覽 docs.godotengine.org 以瀏覽 Android 建構說明文件。"
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr ""
+msgstr "無建構 APK 產生於: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
-msgstr ""
+msgstr "缺少識別符。"
#: platform/iphone/export/export.cpp
msgid "The character '%s' is not allowed in Identifier."
-msgstr ""
+msgstr "字元「%s」不可用於識別符中。"
#: platform/iphone/export/export.cpp
msgid "App Store Team ID not specified - cannot configure the project."
-msgstr ""
+msgstr "尚未設定 App Store Team ID - 無法設定專案。"
#: platform/iphone/export/export.cpp
-#, fuzzy
msgid "Invalid Identifier:"
-msgstr "無效的字體大小。"
+msgstr "無效的識別符:"
#: platform/iphone/export/export.cpp
msgid "Required icon is not specified in the preset."
-msgstr ""
+msgstr "必須在預設設定中指定必填圖示。"
#: platform/javascript/export/export.cpp
msgid "Stop HTTP Server"
-msgstr ""
+msgstr "停止 HTTP 伺服器"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
-msgstr ""
+msgstr "在瀏覽器中執行"
#: platform/javascript/export/export.cpp
msgid "Run exported HTML in the system's default browser."
-msgstr ""
+msgstr "在系統的預設瀏覽器中執行已匯出的 HTML。"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not write file:"
-msgstr "無法新增資料夾"
+msgstr "無法寫入檔案:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not open template for export:"
-msgstr "無法新增資料夾"
+msgstr "無法開啟樣板以輸出:"
#: platform/javascript/export/export.cpp
msgid "Invalid export template:"
-msgstr ""
+msgstr "無效的輸出樣板:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not read custom HTML shell:"
-msgstr "無法新增資料夾"
+msgstr "無法讀取自定 HTML Shell:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not read boot splash image file:"
-msgstr "無法新增資料夾"
+msgstr "無法讀取啟動畫面圖檔:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Using default boot splash image."
-msgstr "無法新增資料夾"
+msgstr "使用預設啟動畫面圖檔。"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package short name."
-msgstr "不能使用的名稱。"
+msgstr "無效的套件段名稱。"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package unique name."
-msgstr "不能使用的名稱。"
+msgstr "無效的套件唯一名稱。"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid package publisher display name."
-msgstr "不能使用的名稱。"
+msgstr "無效的套件發佈者顯示名稱。"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid product GUID."
-msgstr "不能使用的名稱。"
+msgstr "無效的產品 GUID。"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid publisher GUID."
-msgstr "無效的路徑"
+msgstr "無效的發佈者 GUID。"
#: platform/uwp/export/export.cpp
-#, fuzzy
msgid "Invalid background color."
-msgstr "不能使用的名稱。"
+msgstr "無效的背景顏色。"
#: platform/uwp/export/export.cpp
msgid "Invalid Store Logo image dimensions (should be 50x50)."
-msgstr ""
+msgstr "無效的商店 LOGO 圖片尺寸(需為 50x50)。"
#: platform/uwp/export/export.cpp
msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-msgstr ""
+msgstr "無效的矩形 44x44 LOGO 圖片尺寸(需為 44x44)。"
#: platform/uwp/export/export.cpp
msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-msgstr ""
+msgstr "無效的矩形 71x71 LOGO 圖片尺寸(需為 71x71)。"
#: platform/uwp/export/export.cpp
msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-msgstr ""
+msgstr "無效的矩形 150x150 LOGO 圖片尺寸(需為 150x150)。"
#: platform/uwp/export/export.cpp
msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-msgstr ""
+msgstr "無效的矩形 310x310 LOGO 圖片尺寸(需為 310x310)。"
#: platform/uwp/export/export.cpp
msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-msgstr ""
+msgstr "無效的寬 310x150 LOGO 圖片尺寸(需為 310x150)。"
#: platform/uwp/export/export.cpp
msgid "Invalid splash screen image dimensions (should be 620x300)."
-msgstr ""
+msgstr "無效的啟動畫面圖片尺寸(應為 620x300)。"
#: scene/2d/animated_sprite.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite to display frames."
-msgstr "SpriteFrames資源必須在Frames屬性中被創建或設置才能夠顯示動畫格。"
+msgstr ""
+"必須先為「Frames」屬性建立或設定 SpriteFrames 資源以令 AnimatedSprite 顯示影"
+"格。"
#: scene/2d/canvas_modulate.cpp
msgid ""
"Only one visible CanvasModulate is allowed per scene (or set of instanced "
"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
-"每個場景中僅允許一個可見的CanvasModulate,只有第一個CanvasModulate會有作用,"
-"其餘的將被忽略。"
+"每個場景(或實體化的場景集)中僅允許一個可見的 CanvasModulate。只有第一個建立"
+"的 CanvasModulate 有用,其餘的將被忽略。"
#: scene/2d/collision_object_2d.cpp
msgid ""
@@ -12402,6 +12021,8 @@ msgid ""
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
+"該節點無形狀,故無法與其他物件碰撞或互動。\n"
+"建議您新增 CollisionShape2D 或 CollisionPolygon2D 作為其子節點以定義其形狀。"
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -12409,12 +12030,13 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionPolygon2D只能為CollisionObject2D衍生的節點提供碰撞形狀資訊,請將其使"
-"用於Area2D、StaticBody2D、RigidBody2D、KinematicBody2D這類的節點下。"
+"CollisionPolygon2D 僅可為 CollisionObject2D 衍生的節點提供碰撞形狀資訊。請僅"
+"於 Area2D、StaticBody2D、RigidBody2D、KinematicBody2D…等節點下作為子節點使"
+"用。"
#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
-msgstr "空白的CollisionPolygon2D不起碰撞偵測的作用。"
+msgstr "空白的 CollisionPolygon2D 不會產生任何碰撞效果。"
#: scene/2d/collision_shape_2d.cpp
msgid ""
@@ -12422,54 +12044,67 @@ msgid ""
"CollisionObject2D derived node. Please only use it as a child of Area2D, "
"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D只能為CollisionObject2D衍生的節點提供碰撞形狀資訊,請將其使用"
-"於Area2D、StaticBody2D、RigidBody2D、KinematicBody2D這類的節點下。"
+"CollisionShape2D 僅可為 CollisionObject2D 衍生的節點提供碰撞形狀資訊。請僅於 "
+"Area2D、StaticBody2D、RigidBody2D、KinematicBody2D…等節點下作為子節點使用以提"
+"供形狀。"
#: scene/2d/collision_shape_2d.cpp
msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
-msgstr "CollisionShape2D必須被賦予形狀才能運作,請為它建立個形狀吧!"
+msgstr "CollisionShape2D 必須被賦予形狀才能運作。請先建立形狀!"
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"Polygon-based shapes are not meant be used nor edited directly through the "
+"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
+msgstr ""
+"基於多邊形的形狀不應該被 CollisionShape2D 節點直接使用或編輯。請使用 "
+"CollisionPolygon2D 節點。"
#: scene/2d/cpu_particles_2d.cpp
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"CPUParticles2D 動畫需要使用有啟用「Particles Animation(粒子動畫)」的 "
+"CanvasItemMaterial。"
#: scene/2d/light_2d.cpp
-#, fuzzy
msgid ""
"A texture with the shape of the light must be supplied to the \"Texture\" "
"property."
-msgstr "光照形狀的材質必須被賦與在材質的屬性中。"
+msgstr "有光照形狀的紋理必須提供「紋理」屬性。"
#: scene/2d/light_occluder_2d.cpp
msgid ""
"An occluder polygon must be set (or drawn) for this occluder to take effect."
-msgstr "此遮光體必須被建立或設置遮蔽形狀才能發揮遮蔽作用。"
+msgstr "該遮光體必須要有設定(或繪製)遮光體形狀才會有作用。"
#: scene/2d/light_occluder_2d.cpp
-#, fuzzy
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
-msgstr "此遮光體沒有被賦予形狀,請繪製一個吧!"
+msgstr "遮光體無遮光體多邊形。請先繪製一個多邊形。"
#: scene/2d/navigation_polygon.cpp
msgid ""
"A NavigationPolygon resource must be set or created for this node to work. "
"Please set a property or draw a polygon."
msgstr ""
+"必須先在該節點上設定或建立 NavigationPolygon 才可以使用。請設定一個屬性或繪製"
+"多邊形。"
#: scene/2d/navigation_polygon.cpp
msgid ""
"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
"node. It only provides navigation data."
msgstr ""
+"NavigationPolygonInstance 必須是 Navigation2D 節點的子級或次子級。其僅提供導"
+"航資料。"
#: scene/2d/parallax_layer.cpp
msgid ""
"ParallaxLayer node only works when set as child of a ParallaxBackground node."
-msgstr ""
+msgstr "ParallaxLayer 節點僅在當其被設為 ParallaxBackground 的子節點時有效。"
#: scene/2d/particles_2d.cpp
msgid ""
@@ -12477,22 +12112,26 @@ msgid ""
"Use the CPUParticles2D node instead. You can use the \"Convert to "
"CPUParticles\" option for this purpose."
msgstr ""
+"GLES2 視訊驅動程式目前不支援基於 GPU 的粒子。\n"
+"請改為使用 CPUParticles2D 節點。可使用「Convert to CPUParticles」選項。"
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
"A material to process the particles is not assigned, so no behavior is "
"imprinted."
-msgstr ""
+msgstr "尚未指定要處理粒子的材料,故未產生任何行為。"
#: scene/2d/particles_2d.cpp
msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Particles2D 動畫需要使用開啟了「Particles Animation(粒子動畫)」的 "
+"CanvasItemMaterial。"
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
-msgstr ""
+msgstr "PathFollow2D 僅在其為 Path2D 的子節點時有效。"
#: scene/2d/physics_body_2d.cpp
msgid ""
@@ -12500,91 +12139,94 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"(在 Character 或 Rigid Mode 下)更改 RigidBody2D 的大小將會在執行時被物理引"
+"擎複寫。\n"
+"請改為修改其子節點的碰撞形狀之大小。"
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
-msgstr ""
+msgstr "路徑屬性必須指向一個有效的 Node2D 才可用。"
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "該 Bone2D 鏈必須以 Skeleton2D 節點結尾。"
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr ""
+msgstr "Bone2D 僅在其為 Skeleton2D 或另一個 Bone2D 的子節點時有效。"
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
-msgstr ""
+msgstr "該骨骼缺少適當的「靜止姿勢」。請跳至 Skeleton2D 節點並進行設定。"
#: scene/2d/tile_map.cpp
-#, fuzzy
msgid ""
"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes "
"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, "
"KinematicBody2D, etc. to give them a shape."
msgstr ""
-"CollisionShape2D只能為CollisionObject2D衍生的節點提供碰撞形狀資訊,請將其使用"
-"於Area2D、StaticBody2D、RigidBody2D、KinematicBody2D這類的節點下。"
+"CollisionShape2D 僅可為 CollisionObject2D 衍生的節點提供碰撞形狀資訊。請將其"
+"設為 Area2D、StaticBody2D、RigidBody2D、KinematicBody2D… 的子節點以賦予其形"
+"狀。"
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
"VisibilityEnabler2D works best when used with the edited scene root directly "
"as parent."
-msgstr ""
+msgstr "VisibilityEnabler2D 在直接作為已編輯場景的根節點的母級節點時效果最佳。"
#: scene/3d/arvr_nodes.cpp
msgid "ARVRCamera must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRCamera 必須有 ARVROrigin 節點作為母節點。"
#: scene/3d/arvr_nodes.cpp
msgid "ARVRController must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRController 必須有 ARVROrigin 節點作為母節點。"
#: scene/3d/arvr_nodes.cpp
msgid ""
"The controller ID must not be 0 or this controller won't be bound to an "
"actual controller."
-msgstr ""
+msgstr "控制器 ID 不可為 0,否則該控制器將不會綁定至實際的控制器。"
#: scene/3d/arvr_nodes.cpp
msgid "ARVRAnchor must have an ARVROrigin node as its parent."
-msgstr ""
+msgstr "ARVRAnchor 必須有 ARVROrigin 節點作為母節點。"
#: scene/3d/arvr_nodes.cpp
msgid ""
"The anchor ID must not be 0 or this anchor won't be bound to an actual "
"anchor."
-msgstr ""
+msgstr "錨點 ID 不可為 0,否則該錨點將不會被綁定至實際的錨點。"
#: scene/3d/arvr_nodes.cpp
msgid "ARVROrigin requires an ARVRCamera child node."
-msgstr ""
+msgstr "ARVROrigin 必須有一個 ARVRCamera 子節點。"
#: scene/3d/baked_lightmap.cpp
msgid "%d%%"
-msgstr ""
+msgstr "%d%%"
#: scene/3d/baked_lightmap.cpp
msgid "(Time Left: %d:%02d s)"
-msgstr ""
+msgstr "(剩餘時間:%d:%02d 秒)"
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Meshes: "
-msgstr ""
+msgstr "正在繪製網格: "
#: scene/3d/baked_lightmap.cpp
msgid "Plotting Lights:"
-msgstr ""
+msgstr "正在繪製光照:"
#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
msgid "Finishing Plot"
-msgstr ""
+msgstr "繪製完成"
#: scene/3d/baked_lightmap.cpp
msgid "Lighting Meshes: "
-msgstr ""
+msgstr "正在照明網格: "
#: scene/3d/collision_object.cpp
msgid ""
@@ -12592,6 +12234,8 @@ msgid ""
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
+"該節點沒有形狀,故無法與其他物件碰撞或互動。\n"
+"建議您新增 CollisionShape 或 CollisionPolygon 作為其子節點以定義其形狀。"
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -12599,10 +12243,12 @@ msgid ""
"CollisionObject derived node. Please only use it as a child of Area, "
"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
+"CollisionPolygon 僅可為 CollisionObject 衍生的節點提供碰撞形狀資訊。請僅於 "
+"Area、StaticBody、RigidBody、KinematicBody…等節點下作為子節點使用。"
#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
-msgstr ""
+msgstr "空白的 CollisionPolygon 節點將不會產生碰撞效果。"
#: scene/3d/collision_shape.cpp
msgid ""
@@ -12610,53 +12256,70 @@ msgid ""
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
"KinematicBody, etc. to give them a shape."
msgstr ""
+"CollisionShape 僅可為 CollisionObject 衍生的節點提供碰撞形狀資訊。請僅於 "
+"Area、StaticBody、RigidBody、KinematicBody…等節點下作為子節點使用。"
#: scene/3d/collision_shape.cpp
-#, fuzzy
msgid ""
"A shape must be provided for CollisionShape to function. Please create a "
"shape resource for it."
-msgstr "CollisionShape2D必須被賦予形狀才能運作,請為它建立個形狀吧!"
+msgstr "CollisionShape 必須被賦予形狀才能運作。請先建立形狀。"
#: scene/3d/collision_shape.cpp
msgid ""
"Plane shapes don't work well and will be removed in future versions. Please "
"don't use them."
-msgstr ""
+msgstr "平面形狀時常無法正常使用,且將在未來的版本移除。請勿使用。"
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"ConcavePolygonShape doesn't support RigidBody in another mode than static."
+msgstr "ConcavePolygonShape 不支援靜態模式以外的 RigidBody。"
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
-msgstr ""
+msgstr "由於尚未指定網格,未顯示任何東西。"
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial whose "
"Billboard Mode is set to \"Particle Billboard\"."
msgstr ""
+"CPUParticles 動畫需要使用 Billboard Mode 為「Particle Billboard」的 "
+"SpatialMaterial。"
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
-msgstr ""
+msgstr "正在繪製網格"
#: scene/3d/gi_probe.cpp
msgid ""
"GIProbes are not supported by the GLES2 video driver.\n"
"Use a BakedLightmap instead."
msgstr ""
+"GLES2 視訊驅動程式不支援 GIProbs。\n"
+"請改為使用 BakedLightmap。"
+
+#: scene/3d/interpolated_camera.cpp
+msgid ""
+"InterpolatedCamera has been deprecated and will be removed in Godot 4.0."
+msgstr ""
#: scene/3d/light.cpp
msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows."
-msgstr ""
+msgstr "角度大於 90 度的 SpotLight 無法投射出陰影。"
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
-msgstr ""
+msgstr "必須先為該節點建立 NavigationMesh 資源才可運作。"
#: scene/3d/navigation_mesh.cpp
msgid ""
"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
"It only provides navigation data."
msgstr ""
+"NavigationMeshInstance 必須為 Navigation 節點的子節點或次級子節點。其僅提供導"
+"航資料。"
#: scene/3d/particles.cpp
msgid ""
@@ -12664,27 +12327,33 @@ msgid ""
"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles"
"\" option for this purpose."
msgstr ""
+"GLES2 視訊驅動程式不支援基於 GPU 的粒子。\n"
+"請改為使用 CPUParticles 節點。可使用「Convert to CPUParticles」選項。"
#: scene/3d/particles.cpp
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
-msgstr ""
+msgstr "由於網格尚未被指派至描繪路徑(Draw Pass),未顯示任何東西。"
#: scene/3d/particles.cpp
msgid ""
"Particles animation requires the usage of a SpatialMaterial whose Billboard "
"Mode is set to \"Particle Billboard\"."
msgstr ""
+"粒子動畫需要使用 Billboard Mode 設定為「Particle Billboard」的 "
+"SpatialMaterial。"
#: scene/3d/path.cpp
msgid "PathFollow only works when set as a child of a Path node."
-msgstr ""
+msgstr "PathFollow 僅在其為 Path 節點的子節點時才可運作。"
#: scene/3d/path.cpp
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
msgstr ""
+"PathFollow 的 ROTATION_ORIENTED 需要在其母節點 Path 的 Curve 資源內啟用「Up "
+"Vector」。"
#: scene/3d/physics_body.cpp
msgid ""
@@ -12692,16 +12361,20 @@ msgid ""
"by the physics engine when running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"(在 Character 或 Rigid Mode 下)更改 RigidBody 的大小將會在執行時被物理引擎"
+"複寫。\n"
+"請改為修改其子節點的碰撞形狀之大小。"
#: scene/3d/remote_transform.cpp
msgid ""
"The \"Remote Path\" property must point to a valid Spatial or Spatial-"
"derived node to work."
msgstr ""
+"「Remote Path」屬性必須指向一個有效的 Spatial 或 Spatial 衍生之節點才可運作。"
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh."
-msgstr ""
+msgstr "該形體在設定網格前都將被忽略。"
#: scene/3d/soft_body.cpp
msgid ""
@@ -12709,81 +12382,85 @@ msgid ""
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"更改 SoftBody 的大小將會在執行時被物理引擎複寫。\n"
+"請改為修改其子節點的碰撞形狀之大小。"
#: scene/3d/sprite_3d.cpp
-#, fuzzy
msgid ""
"A SpriteFrames resource must be created or set in the \"Frames\" property in "
"order for AnimatedSprite3D to display frames."
-msgstr "SpriteFrames資源必須在Frames屬性中被創建或設置才能夠顯示動畫格。"
+msgstr ""
+"必須先為「Frames」屬性建立或設定 SpriteFrames 資源以令 AnimatedSprite3D 顯示"
+"影格。"
#: scene/3d/vehicle_body.cpp
msgid ""
"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
"it as a child of a VehicleBody."
msgstr ""
+"VehicleWheel 旨在為 VehicleBody 提供 Wheel System。請將其作為 VehicleBody 的"
+"子節點。"
#: scene/3d/world_environment.cpp
msgid ""
"WorldEnvironment requires its \"Environment\" property to contain an "
"Environment to have a visible effect."
msgstr ""
+"必須先將 WorldEnvironment 之「Environment」屬性設為包含 Environment 才可產生"
+"視覺效果。"
#: scene/3d/world_environment.cpp
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
-msgstr ""
+msgstr "每個場景(或實體化場景集)僅可有一個 WorldEnvironment。"
#: scene/3d/world_environment.cpp
msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"已忽略該 WorldEnvironment。請(為 3D 場景)新增一個相機或(為 2D 場景)將 "
+"Environment 之 Background Mode 設為 Canvas。"
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "於 BlendTree 節點「%s」上未找到動畫:「%s」"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "動畫長度 (秒)。"
+msgstr "未找到動畫:「%s」"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "於節點「%s」內動畫無效:「%s」。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "無效的字體大小。"
+msgstr "無效的動畫:「%s」。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "將 '%s' 從 '%s' 中斷連接"
+msgstr "節點「%s」的輸入「%s」未有任何連接。"
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
-msgstr ""
+msgstr "尚未為圖表設定根 AnimationNode。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "從場景樹中選擇一個 AnimationPlayer 來編輯動畫。"
+msgstr "尚未設定一個連接包含動畫且連接至 AnimationPlayer 節點的路徑。"
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
-msgstr ""
+msgstr "連接至 AnimationPlayer 的路徑並未連接至 AnimationPlayer 節點。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "The AnimationPlayer root node is not a valid node."
-msgstr "動畫樹無效。"
+msgstr "AnimationPlayer 的根節點並非有效節點。"
#: scene/animation/animation_tree_player.cpp
msgid "This node has been deprecated. Use AnimationTree instead."
-msgstr ""
+msgstr "該節點已停止維護,請改為使用 AnimationTree。"
#: scene/gui/color_picker.cpp
msgid ""
@@ -12791,28 +12468,29 @@ msgid ""
"LMB: Set color\n"
"RMB: Remove preset"
msgstr ""
+"色彩: #%s\n"
+"左鍵點擊:設定色彩\n"
+"右鍵點擊:刪除預設設定"
#: scene/gui/color_picker.cpp
msgid "Pick a color from the editor window."
-msgstr ""
+msgstr "請自編輯器視窗選擇一個顏色。"
#: scene/gui/color_picker.cpp
msgid "HSV"
-msgstr ""
+msgstr "HSV"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Raw"
-msgstr "偏航"
+msgstr "原始"
#: scene/gui/color_picker.cpp
msgid "Switch between hexadecimal and code values."
-msgstr ""
+msgstr "在 16 進位與代碼值之間切換。"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset."
-msgstr "將目前顏色設為預設"
+msgstr "將目前的顏色加入預設設定。"
#: scene/gui/container.cpp
msgid ""
@@ -12820,16 +12498,21 @@ msgid ""
"children placement behavior.\n"
"If you don't intend to add a script, use a plain Control node instead."
msgstr ""
+"除非有腳本設定了 Container 子節點佔位行為 (Placement Behavior),其本身將無作"
+"用。\n"
+"若您未計劃新增腳本,請改為使用普通的 Control 節點。"
#: scene/gui/control.cpp
msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
+"由於設定的 Mouse Filter 設定為「Ignore」,將不會顯示提示工具提示 。要解決該問"
+"題,請將 Mouse Filter 設為「Stop」或「Pass」。"
#: scene/gui/dialogs.cpp
msgid "Alert!"
-msgstr "警告!"
+msgstr "警告!"
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
@@ -12841,10 +12524,12 @@ msgid ""
"functions. Making them visible for editing is fine, but they will hide upon "
"running."
msgstr ""
+"彈出視窗預設會隱藏,除非呼叫 popup() 或任何一個 popup*() 函式。可以將其設為可"
+"見來進行編輯,但在執行的時候會隱藏。"
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr ""
+msgstr "若啟用「Exp Edit」,則「Min Value」必須大於 0。"
#: scene/gui/scroll_container.cpp
msgid ""
@@ -12852,18 +12537,19 @@ msgid ""
"Use a container as child (VBox, HBox, etc.), or a Control and set the custom "
"minimum size manually."
msgstr ""
+"ScrollContainer 旨在於單一子控制配合使用。\n"
+"使用容器作為子節點(VBox、HBox…等),或是使用 Control 並手動設定其自定最小"
+"值。"
#: scene/gui/tree.cpp
msgid "(Other)"
-msgstr "(其它)"
+msgstr "(其它)"
#: scene/main/scene_tree.cpp
msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
-msgstr ""
-"在專案設定中的預設環境(Rendering -> Environment -> Default Environment)不能被"
-"載入"
+msgstr "無法載入專案設定中指定的預設環境(算繪 -> 環境 -> 預設環境)。"
#: scene/main/viewport.cpp
msgid ""
@@ -12872,37 +12558,85 @@ msgid ""
"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
"texture to some node for display."
msgstr ""
+"該 Viewport 尚未被設定為算繪目標。若你想直接將其內容顯示於畫面上,請將其設為 "
+"Control 的子節點以讓其取得大小。否則請將其設為 RenderTarget 並指派其內部紋理"
+"為其他節點以顯示。"
+
+#: scene/main/viewport.cpp
+msgid "Viewport size must be greater than 0 to render anything."
+msgstr "Viewport 大小必須大於 0 才可進行算繪。"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for preview."
-msgstr "無效的字體大小。"
+msgstr "無效的預覽來源。"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "無效的字體大小。"
+msgstr "無效的著色器來源。"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "無效的字體大小。"
+msgstr "該型別的比較函式無效。"
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "指派至函式。"
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "指派至均勻。"
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Varying 變數只可在頂點函式中指派。"
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "不可修改常數。"
+
+#~ msgid "FileSystem and Import Docks"
+#~ msgstr "檔案系統與匯入 Dock"
+
+#~ msgid ""
+#~ "When exporting or deploying, the resulting executable will attempt to "
+#~ "connect to the IP of this computer in order to be debugged."
+#~ msgstr ""
+#~ "匯出或部署時,輸出的可執行檔將會嘗試連接到這台電腦的 IP 位置以進行除錯。"
+
+#~ msgid "Current scene was never saved, please save it prior to running."
+#~ msgstr "目前的場景從未被保存,請先保存以執行。"
+
+#~ msgid "Not in resource path."
+#~ msgstr "不在資源路徑中。"
+
+#~ msgid "Revert"
+#~ msgstr "還原"
+
+#~ msgid "This action cannot be undone. Revert anyway?"
+#~ msgstr "該操作無法還原。依然要還原嗎?"
+
+#~ msgid "Revert Scene"
+#~ msgstr "恢復場景"
+
+#~ msgid "Clear Script"
+#~ msgstr "清除腳本"
+
+#, fuzzy
+#~ msgid "Issue Tracker"
+#~ msgstr "問題追蹤器"
+
+#~ msgid "Request Docs"
+#~ msgstr "請求檔案"
+
+#, fuzzy
+#~ msgid "Help improve the Godot documentation by giving feedback."
+#~ msgstr "通過提供回饋幫助改進 Godot 文檔"
+
+#~ msgid "Replaced %d occurrence(s)."
+#~ msgstr "取代了 %d 個。"
+
+#~ msgid "Create Static Convex Body"
+#~ msgstr "創建靜態凸體"
#~ msgid ""
#~ "There are currently no tutorials for this class, you can [color=$color]"